diff --git a/.gitignore b/.gitignore
index 0e57cb0..2450ee8 100644
--- a/.gitignore
+++ b/.gitignore
@@ -36,3 +36,4 @@
 /lcov/
 /src
 /mapfile
+/tools/python/__pycache__/
diff --git a/.mailmap b/.mailmap
new file mode 100644
index 0000000..50b8c04
--- /dev/null
+++ b/.mailmap
@@ -0,0 +1,21 @@
+<james.darnley@gmail.com> <jdarnley@obe.tv>
+<jeebjp@gmail.com> <jan.ekstrom@aminocom.com>
+<sw@jkqxz.net> <mrt@jkqxz.net>
+<u@pkh.me> <cboesch@gopro.com>
+<zhilizhao@tencent.com> <quinkblack@foxmail.com>
+<zhilizhao@tencent.com> <wantlamy@gmail.com>
+<modmaker@google.com> <modmaker-at-google.com@ffmpeg.org>
+<stebbins@jetheaddev.com> <jstebbins@jetheaddev.com>
+<barryjzhao@tencent.com> <mypopydev@gmail.com>
+<barryjzhao@tencent.com> <jun.zhao@intel.com>
+<josh@itanimul.li> <joshdk@obe.tv>
+<michael@niedermayer.cc> <michaelni@gmx.at>
+<linjie.fu@intel.com> <fulinjie@zju.edu.cn>
+<ceffmpeg@gmail.com> <cehoyos@ag.or.at>
+<ceffmpeg@gmail.com> <cehoyos@rainbow.studorg.tuwien.ac.at>
+<ffmpeg@gyani.pro> <gyandoshi@gmail.com>
+<atomnuker@gmail.com> <rpehlivanov@obe.tv>
+<zhong.li@intel.com> <zhongli_dev@126.com>
+<andreas.rheinhardt@gmail.com> <andreas.rheinhardt@googlemail.com>
+rcombs <rcombs@rcombs.me> <rodger.combs@gmail.com>
+<thilo.borgmann@mail.de> <thilo.borgmann@googlemail.com>
diff --git a/.travis.yml b/.travis.yml
index 63f2051..784b7bd 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -19,7 +19,7 @@
   directories:
     - ffmpeg-samples
 before_install:
-  - if [ "$TRAVIS_OS_NAME" == "osx" ]; then brew update --all; fi
+  - if [ "$TRAVIS_OS_NAME" == "osx" ]; then brew update; fi
 install:
   - if [ "$TRAVIS_OS_NAME" == "osx" ]; then brew install nasm; fi
 script:
diff --git a/CREDITS.fuchsia b/CREDITS.fuchsia
index 8e8165e..31e50f7 100644
--- a/CREDITS.fuchsia
+++ b/CREDITS.fuchsia
@@ -21,10 +21,11 @@
     - `compat/solaris/make_sunver.pl`
     - `doc/t2h.pm`
     - `doc/texi2pod.pl`
-    - `libswresample/swresample-test.c`
+    - `libswresample/tests/swresample.c`
     - `tests/checkasm/*`
     - `tests/tiny_ssim.c`
 - the following filters in libavfilter:
+    - `signature_lookup.c`
     - `vf_blackframe.c`
     - `vf_boxblur.c`
     - `vf_colormatrix.c`
@@ -34,13 +35,13 @@
     - `vf_eq.c`
     - `vf_find_rect.c`
     - `vf_fspp.c`
-    - `vf_geq.c`
     - `vf_histeq.c`
     - `vf_hqdn3d.c`
-    - `vf_interlace.c`
     - `vf_kerndeint.c`
+    - `vf_lensfun.c` (GPL version 3 or later)
     - `vf_mcdeint.c`
     - `vf_mpdecimate.c`
+    - `vf_nnedi.c`
     - `vf_owdenoise.c`
     - `vf_perspective.c`
     - `vf_phase.c`
@@ -49,12 +50,14 @@
     - `vf_pullup.c`
     - `vf_repeatfields.c`
     - `vf_sab.c`
+    - `vf_signature.c`
     - `vf_smartblur.c`
     - `vf_spp.c`
     - `vf_stereo3d.c`
     - `vf_super2xsai.c`
     - `vf_tinterlace.c`
     - `vf_uspp.c`
+    - `vf_vaguedenoiser.c`
     - `vsrc_mptestsrc.c`
 
 Should you, for whatever reason, prefer to use version 3 of the (L)GPL, then
@@ -80,45 +83,51 @@
 
 ### Compatible libraries
 
-The following libraries are under GPL:
+The following libraries are under GPL version 2:
+- avisynth
 - frei0r
 - libcdio
+- libdavs2
 - librubberband
 - libvidstab
 - libx264
 - libx265
 - libxavs
+- libxavs2
 - libxvid
 
 When combining them with FFmpeg, FFmpeg needs to be licensed as GPL as well by
 passing `--enable-gpl` to configure.
 
-The OpenCORE and VisualOn libraries are under the Apache License 2.0. That
-license is incompatible with the LGPL v2.1 and the GPL v2, but not with
+The following libraries are under LGPL version 3:
+- gmp
+- libaribb24
+- liblensfun
+
+When combining them with FFmpeg, use the configure option `--enable-version3` to
+upgrade FFmpeg to the LGPL v3.
+
+The VMAF, mbedTLS, RK MPI, OpenCORE and VisualOn libraries are under the Apache License
+2.0. That license is incompatible with the LGPL v2.1 and the GPL v2, but not with
 version 3 of those licenses. So to combine these libraries with FFmpeg, the
 license version needs to be upgraded by passing `--enable-version3` to configure.
 
+The smbclient library is under the GPL v3, to combine it with FFmpeg,
+the options `--enable-gpl` and `--enable-version3` have to be passed to
+configure to upgrade FFmpeg to the GPL v3.
+
 ### Incompatible libraries
 
 There are certain libraries you can combine with FFmpeg whose licenses are not
 compatible with the GPL and/or the LGPL. If you wish to enable these
 libraries, even in circumstances that their license may be incompatible, pass
-`--enable-nonfree` to configure. But note that if you enable any of these
-libraries the resulting binary will be under a complex license mix that is
-more restrictive than the LGPL and that may result in additional obligations.
-It is possible that these restrictions cause the resulting binary to be
+`--enable-nonfree` to configure. This will cause the resulting binary to be
 unredistributable.
 
 The Fraunhofer FDK AAC and OpenSSL libraries are under licenses which are
 incompatible with the GPLv2 and v3. To the best of our knowledge, they are
 compatible with the LGPL.
 
-The NVENC library, while its header file is licensed under the compatible MIT
-license, requires a proprietary binary blob at run time, and is deemed to be
-incompatible with the GPL. We are not certain if it is compatible with the
-LGPL, but we require `--enable-nonfree` even with LGPL configurations in case
-it is not.
-
 
 ********************************************************************************
 
@@ -148,73 +157,28 @@
 
 ********************************************************************************
 
-libavformat/oggparsetheora.c
+libavutil/avsscanf.c
 
-Copyright (C) 2005  Matthieu CASTET, Alex Beregszaszi
+Copyright (c) 2005-2014 Rich Felker, et al.
 
-Permission is hereby granted, free of charge, to any person
-obtaining a copy of this software and associated documentation
-files (the "Software"), to deal in the Software without
-restriction, including without limitation the rights to use, copy,
-modify, merge, publish, distribute, sublicense, and/or sell copies
-of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
 
 The above copyright notice and this permission notice shall be
 included in all copies or substantial portions of the Software.
 
 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-********************************************************************************
-
-libswresample/swresample.h
-
-Copyright (C) 2011-2013 Michael Niedermayer (michaelni@gmx.at)
-
-This file is part of libswresample
-
-libswresample 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.
-
-libswresample 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 libswresample; if not, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
-********************************************************************************
-
-libswresample/version.h
-
-Version macros.
-
-This file is part of libswresample
-
-libswresample 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.
-
-libswresample 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 libswresample; if not, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
 ********************************************************************************
 
@@ -288,6 +252,76 @@
 
 ********************************************************************************
 
+libswresample/version.h
+
+Version macros.
+
+This file is part of libswresample
+
+libswresample 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.
+
+libswresample 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 libswresample; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+********************************************************************************
+
+libavformat/oggparsetheora.c
+
+Copyright (C) 2005  Matthieu CASTET, Alex Beregszaszi
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use, copy,
+modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
+
+********************************************************************************
+
+libswresample/swresample.h
+
+Copyright (C) 2011-2013 Michael Niedermayer (michaelni@gmx.at)
+
+This file is part of libswresample
+
+libswresample 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.
+
+libswresample 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 libswresample; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+********************************************************************************
+
 libavcodec/jfdctfst.c
 libavcodec/jfdctint_template.c
 libavcodec/jrevdct.c
diff --git a/Changelog b/Changelog
index 4a22ab4..f3f905d 100644
--- a/Changelog
+++ b/Changelog
@@ -2,6 +2,107 @@
 releases are sorted from youngest to oldest.
 
 version <next>:
+- v360 filter
+- Intel QSV-accelerated MJPEG decoding
+- Intel QSV-accelerated VP9 decoding
+- Support for TrueHD in mp4
+- Support AMD AMF encoder on Linux (via Vulkan)
+- IMM5 video decoder
+- ZeroMQ protocol
+- support Sipro ACELP.KELVIN decoding
+- streamhash muxer
+- sierpinski video source
+- scroll video filter
+- photosensitivity filter
+- anlms filter
+- arnndn filter
+- bilateral filter
+- maskedmin and maskedmax filters
+- VDPAU VP9 hwaccel
+- median filter
+- QSV-accelerated VP9 encoding
+- AV1 encoding support via librav1e
+- AV1 frame merge bitstream filter
+- AV1 Annex B demuxer
+- axcorrelate filter
+- mvdv decoder
+- mvha decoder
+- MPEG-H 3D Audio support in mp4
+- thistogram filter
+- freezeframes filter
+- Argonaut Games ADPCM decoder
+- Argonaut Games ASF demuxer
+- xfade video filter
+- xfade_opencl filter
+- afirsrc audio filter source
+- pad_opencl filter
+- Simon & Schuster Interactive ADPCM decoder
+- Real War KVAG demuxer
+- CDToons video decoder
+- siren audio decoder
+- Rayman 2 ADPCM decoder
+- Rayman 2 APM demuxer
+- cas video filter
+- High Voltage Software ADPCM decoder
+- LEGO Racers ALP (.tun & .pcm) demuxer
+- AMQP 0-9-1 protocol (RabbitMQ)
+- Vulkan support
+- avgblur_vulkan, overlay_vulkan, scale_vulkan and chromaber_vulkan filters
+- ADPCM IMA MTF decoder
+- FWSE demuxer
+- DERF DPCM decoder
+- DERF demuxer
+- CRI HCA decoder
+- CRI HCA demuxer
+- overlay_cuda filter
+- switch from AvxSynth to AviSynth+ on Linux
+- mv30 decoder
+- Expanded styling support for 3GPP Timed Text Subtitles (movtext)
+- WebP parser
+- tmedian filter
+- maskedthreshold filter
+- Support for muxing pcm and pgs in m2ts
+
+
+version 4.2:
+- tpad filter
+- AV1 decoding support through libdav1d
+- dedot filter
+- chromashift and rgbashift filters
+- freezedetect filter
+- truehd_core bitstream filter
+- dhav demuxer
+- PCM-DVD encoder
+- GIF parser
+- vividas demuxer
+- hymt decoder
+- anlmdn filter
+- maskfun filter
+- hcom demuxer and decoder
+- ARBC decoder
+- libaribb24 based ARIB STD-B24 caption support (profiles A and C)
+- Support decoding of HEVC 4:4:4 content in nvdec and cuviddec
+- removed libndi-newtek
+- agm decoder
+- KUX demuxer
+- AV1 frame split bitstream filter
+- lscr decoder
+- lagfun filter
+- asoftclip filter
+- Support decoding of HEVC 4:4:4 content in vdpau
+- colorhold filter
+- xmedian filter
+- asr filter
+- showspatial multimedia filter
+- VP4 video decoder
+- IFV demuxer
+- derain filter
+- deesser filter
+- mov muxer writes tracks with unspecified language instead of English by default
+- add support for using clang to compile CUDA kernels
+
+
+version 4.1:
 - deblock filter
 - tmix filter
 - amplify filter
@@ -34,6 +135,15 @@
 - audio denoiser as afftdn filter
 - AV1 parser
 - SER demuxer
+- sinc audio filter source
+- chromahold filter
+- setparams filter
+- vibrance filter
+- decoding S12M timecode in h264
+- xstack filter
+- pcm vidc decoder and encoder
+- (a)graphmonitor filter
+- yadif_cuda filter
 
 
 version 4.0:
diff --git a/INSTALL.md b/INSTALL.md
index 5db9122..3b220bc 100644
--- a/INSTALL.md
+++ b/INSTALL.md
@@ -1,4 +1,4 @@
-#Installing FFmpeg:
+## Installing FFmpeg
 
 1. Type `./configure` to create the configuration. A list of configure
 options is printed by running `configure --help`.
diff --git a/LICENSE.md b/LICENSE.md
index ba65b05..613070e 100644
--- a/LICENSE.md
+++ b/LICENSE.md
@@ -21,10 +21,11 @@
     - `compat/solaris/make_sunver.pl`
     - `doc/t2h.pm`
     - `doc/texi2pod.pl`
-    - `libswresample/swresample-test.c`
+    - `libswresample/tests/swresample.c`
     - `tests/checkasm/*`
     - `tests/tiny_ssim.c`
 - the following filters in libavfilter:
+    - `signature_lookup.c`
     - `vf_blackframe.c`
     - `vf_boxblur.c`
     - `vf_colormatrix.c`
@@ -34,13 +35,13 @@
     - `vf_eq.c`
     - `vf_find_rect.c`
     - `vf_fspp.c`
-    - `vf_geq.c`
     - `vf_histeq.c`
     - `vf_hqdn3d.c`
-    - `vf_interlace.c`
     - `vf_kerndeint.c`
+    - `vf_lensfun.c` (GPL version 3 or later)
     - `vf_mcdeint.c`
     - `vf_mpdecimate.c`
+    - `vf_nnedi.c`
     - `vf_owdenoise.c`
     - `vf_perspective.c`
     - `vf_phase.c`
@@ -49,12 +50,14 @@
     - `vf_pullup.c`
     - `vf_repeatfields.c`
     - `vf_sab.c`
+    - `vf_signature.c`
     - `vf_smartblur.c`
     - `vf_spp.c`
     - `vf_stereo3d.c`
     - `vf_super2xsai.c`
     - `vf_tinterlace.c`
     - `vf_uspp.c`
+    - `vf_vaguedenoiser.c`
     - `vsrc_mptestsrc.c`
 
 Should you, for whatever reason, prefer to use version 3 of the (L)GPL, then
@@ -80,41 +83,47 @@
 
 ### Compatible libraries
 
-The following libraries are under GPL:
+The following libraries are under GPL version 2:
+- avisynth
 - frei0r
 - libcdio
+- libdavs2
 - librubberband
 - libvidstab
 - libx264
 - libx265
 - libxavs
+- libxavs2
 - libxvid
 
 When combining them with FFmpeg, FFmpeg needs to be licensed as GPL as well by
 passing `--enable-gpl` to configure.
 
-The OpenCORE and VisualOn libraries are under the Apache License 2.0. That
-license is incompatible with the LGPL v2.1 and the GPL v2, but not with
+The following libraries are under LGPL version 3:
+- gmp
+- libaribb24
+- liblensfun
+
+When combining them with FFmpeg, use the configure option `--enable-version3` to
+upgrade FFmpeg to the LGPL v3.
+
+The VMAF, mbedTLS, RK MPI, OpenCORE and VisualOn libraries are under the Apache License
+2.0. That license is incompatible with the LGPL v2.1 and the GPL v2, but not with
 version 3 of those licenses. So to combine these libraries with FFmpeg, the
 license version needs to be upgraded by passing `--enable-version3` to configure.
 
+The smbclient library is under the GPL v3, to combine it with FFmpeg,
+the options `--enable-gpl` and `--enable-version3` have to be passed to
+configure to upgrade FFmpeg to the GPL v3.
+
 ### Incompatible libraries
 
 There are certain libraries you can combine with FFmpeg whose licenses are not
 compatible with the GPL and/or the LGPL. If you wish to enable these
 libraries, even in circumstances that their license may be incompatible, pass
-`--enable-nonfree` to configure. But note that if you enable any of these
-libraries the resulting binary will be under a complex license mix that is
-more restrictive than the LGPL and that may result in additional obligations.
-It is possible that these restrictions cause the resulting binary to be
+`--enable-nonfree` to configure. This will cause the resulting binary to be
 unredistributable.
 
 The Fraunhofer FDK AAC and OpenSSL libraries are under licenses which are
 incompatible with the GPLv2 and v3. To the best of our knowledge, they are
 compatible with the LGPL.
-
-The NVENC library, while its header file is licensed under the compatible MIT
-license, requires a proprietary binary blob at run time, and is deemed to be
-incompatible with the GPL. We are not certain if it is compatible with the
-LGPL, but we require `--enable-nonfree` even with LGPL configurations in case
-it is not.
diff --git a/MAINTAINERS b/MAINTAINERS
index 3dd26e3..e19d1ee 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -39,7 +39,7 @@
 Miscellaneous Areas
 ===================
 
-documentation                           Stefano Sabatini, Mike Melanson, Timothy Gu, Lou Logan, Gyan Doshi
+documentation                           Stefano Sabatini, Mike Melanson, Timothy Gu, Gyan Doshi
 project server                          Árpád Gereöffy, Michael Niedermayer, Reimar Doeffinger, Alexander Strasser, Nikolay Aleksandrov
 presets                                 Robert Swain
 metadata subsystem                      Aurelien Jacobs
@@ -52,9 +52,9 @@
 
 website                                 Deby Barbara Lepage
 fate.ffmpeg.org                         Timothy Gu
-Trac bug tracker                        Alexander Strasser, Michael Niedermayer, Carl Eugen Hoyos, Lou Logan
-mailing lists                           Baptiste Coudurier, Lou Logan
-Google+                                 Paul B Mahol, Michael Niedermayer, Alexander Strasser
+Trac bug tracker                        Alexander Strasser, Michael Niedermayer, Carl Eugen Hoyos
+Patchwork                               Andriy Gelman
+mailing lists                           Baptiste Coudurier
 Twitter                                 Lou Logan, Reynaldo H. Verdejo Pinochet
 Launchpad                               Timothy Gu
 ffmpeg-security                         Andreas Cadhalpun, Carl Eugen Hoyos, Clément Bœsch, Michael Niedermayer, Reimar Doeffinger, Rodger Combs, wm4
@@ -78,6 +78,7 @@
   float_dsp                             Loren Merritt
   hash                                  Reimar Doeffinger
   hwcontext_cuda*                       Timo Rothenpieler
+  hwcontext_vulkan*                     Lynne
   intfloat*                             Michael Niedermayer
   integer.c, integer.h                  Michael Niedermayer
   lzo                                   Reimar Doeffinger
@@ -88,6 +89,7 @@
   rational.c, rational.h                Michael Niedermayer
   rc4                                   Reimar Doeffinger
   ripemd.c, ripemd.h                    James Almer
+  tx*                                   Lynne
 
 
 libavcodec
@@ -143,6 +145,7 @@
   asv*                                  Michael Niedermayer
   atrac3plus*                           Maxim Poliakovski
   audiotoolbox*                         Rodger Combs
+  avs2*                                 Huiwen Ren
   bgmc.c, bgmc.h                        Thilo Borgmann
   binkaudio.c                           Peter Ross
   cavs*                                 Stefan Gehrer
@@ -167,7 +170,6 @@
   eacmv*, eaidct*, eat*                 Peter Ross
   evrc*                                 Paul B Mahol
   exif.c, exif.h                        Thilo Borgmann
-  exr.c                                 Martin Vignali
   ffv1*                                 Michael Niedermayer
   ffwavesynth.c                         Nicolas George
   fifo.c                                Jan Sebechlebsky
@@ -189,6 +191,7 @@
   libcelt_dec.c                         Nicolas George
   libcodec2.c                           Tomas Härdin
   libdirac*                             David Conrad
+  libdavs2.c                            Huiwen Ren
   libgsm.c                              Michel Bardiaux
   libkvazaar.c                          Arttu Ylä-Outinen
   libopenjpeg.c                         Jaikrishnan Menon
@@ -197,6 +200,7 @@
   libvorbis.c                           David Conrad
   libvpx*                               James Zern
   libxavs.c                             Stefan Gehrer
+  libxavs2.c                            Huiwen Ren
   libzvbi-teletextdec.c                 Marton Balint
   lzo.h, lzo.c                          Reimar Doeffinger
   mdec.c                                Michael Niedermayer
@@ -212,6 +216,7 @@
   msvideo1.c                            Mike Melanson
   nuv.c                                 Reimar Doeffinger
   nvdec*, nvenc*                        Timo Rothenpieler
+  omx.c                                 Martin Storsjo, Aman Gupta
   opus*                                 Rostislav Pehlivanov
   paf.*                                 Paul B Mahol
   pcx.c                                 Ivo van Poorten
@@ -360,12 +365,15 @@
   vf_ssim.c                             Paul B Mahol
   vf_stereo3d.c                         Paul B Mahol
   vf_telecine.c                         Paul B Mahol
+  vf_tonemap_opencl.c                   Ruiling Song
   vf_yadif.c                            Michael Niedermayer
   vf_zoompan.c                          Paul B Mahol
 
 Sources:
   vsrc_mandelbrot.c                     Michael Niedermayer
 
+dnn                                     Yejun Guo
+
 libavformat
 ===========
 
@@ -413,7 +421,6 @@
   flvenc.c                              Michael Niedermayer, Steven Liu
   gxf.c                                 Reimar Doeffinger
   gxfenc.c                              Baptiste Coudurier
-  hls.c                                 Anssi Hannula
   hlsenc.c                              Christian Suloway, Steven Liu
   idcin.c                               Mike Melanson
   idroqdec.c                            Mike Melanson
@@ -428,9 +435,9 @@
   lmlm4.c                               Ivo van Poorten
   lvfdec.c                              Paul B Mahol
   lxfdec.c                              Tomas Härdin
-  matroska.c                            Aurelien Jacobs
-  matroskadec.c                         Aurelien Jacobs
-  matroskaenc.c                         David Conrad
+  matroska.c                            Aurelien Jacobs, Andreas Rheinhardt
+  matroskadec.c                         Aurelien Jacobs, Andreas Rheinhardt
+  matroskaenc.c                         David Conrad, Andreas Rheinhardt
   matroska subtitles (matroskaenc.c)    John Peebles
   metadata*                             Aurelien Jacobs
   mgsts.c                               Paul B Mahol
@@ -445,7 +452,7 @@
   mpegtsenc.c                           Baptiste Coudurier
   msnwc_tcp.c                           Ramiro Polla
   mtv.c                                 Reynaldo H. Verdejo Pinochet
-  mxf*                                  Baptiste Coudurier
+  mxf*                                  Baptiste Coudurier, Tomas Härdin
   nistspheredec.c                       Paul B Mahol
   nsvdec.c                              Francois Revol
   nut*                                  Michael Niedermayer
@@ -501,6 +508,7 @@
   ftp.c                                 Lukasz Marek
   http.c                                Ronald S. Bultje
   libssh.c                              Lukasz Marek
+  libzmq.c                              Andriy Gelman
   mms*.c                                Ronald S. Bultje
   udp.c                                 Luca Abeni
   icecast.c                             Marvin Scholz
@@ -527,6 +535,7 @@
 MIPS                                    Manojkumar Bhosale, Shiyou Yin
 Mac OS X / PowerPC                      Romain Dolbeau, Guillaume Poirier
 Amiga / PowerPC                         Colin Ward
+Linux / PowerPC                         Lauri Kasanen
 Windows MinGW                           Alex Beregszaszi, Ramiro Polla
 Windows Cygwin                          Victor Paesa
 Windows MSVC                            Matthew Oliver, Hendrik Leppkes
@@ -598,12 +607,14 @@
 Jean Delvare                  7CA6 9F44 60F1 BDC4 1FD2 C858 A552 6B9B B3CD 4E6A
 Loren Merritt                 ABD9 08F4 C920 3F65 D8BE 35D7 1540 DAA7 060F 56DE
 Lou Logan (llogan)            7D68 DC73 CBEF EABB 671A B6CF 621C 2E28 82F8 DC3A
+Lynne                         FE50 139C 6805 72CA FD52 1F8D A2FE A5F0 3F03 4464
 Michael Niedermayer           9FF2 128B 147E F673 0BAD F133 611E C787 040B 0FAB
 Nicolas George                24CE 01CE 9ACC 5CEB 74D8 8D9D B063 D997 36E5 4C93
 Nikolay Aleksandrov           8978 1D8C FB71 588E 4B27 EAA8 C4F0 B5FC E011 13B1
 Panagiotis Issaris            6571 13A3 33D9 3726 F728 AA98 F643 B12E ECF3 E029
 Peter Ross                    A907 E02F A6E5 0CD2 34CD 20D2 6760 79C5 AC40 DD6B
 Philip Langdale               5DC5 8D66 5FBA 3A43 18EC 045E F8D6 B194 6A75 682E
+Ramiro Polla                  7859 C65B 751B 1179 792E DAE8 8E95 8B2F 9B6C 5700
 Reimar Doeffinger             C61D 16E5 9E2C D10C 8958 38A4 0899 A2B9 06D4 D9C7
 Reinhard Tartler              9300 5DC2 7E87 6C37 ED7B CA9A 9808 3544 9453 48A4
 Reynaldo H. Verdejo Pinochet  6E27 CD34 170C C78E 4D4F 5F40 C18E 077F 3114 452A
@@ -612,6 +623,7 @@
 Stefano Sabatini              0D0B AD6B 5330 BBAD D3D6 6A0C 719C 2839 FC43 2D5F
 Steinar H. Gunderson          C2E9 004F F028 C18E 4EAD DB83 7F61 7561 7797 8F76
 Stephan Hilb                  4F38 0B3A 5F39 B99B F505 E562 8D5C 5554 4E17 8863
+Thilo Borgmann (thilo)        CE1D B7F4 4D20 FC3A DD9F FE5A 257C 5B8F 1D20 B92F
 Tiancheng "Timothy" Gu        9456 AFC0 814A 8139 E994 8351 7FE6 B095 B582 B0D4
 Tim Nicholson                 38CF DB09 3ED0 F607 8B67 6CED 0C0B FC44 8B0B FC83
 Tomas Härdin (thardin)        A79D 4E3D F38F 763F 91F5 8B33 A01E 8AE0 41BB 2551
diff --git a/Makefile b/Makefile
index 4bf1dfe..45a22b0 100644
--- a/Makefile
+++ b/Makefile
@@ -50,6 +50,12 @@
 target_dec_%_fuzzer$(EXESUF): target_dec_%_fuzzer.o $(FF_DEP_LIBS)
 	$(LD) $(LDFLAGS) $(LDEXEFLAGS) $(LD_O) $^ $(ELIBS) $(FF_EXTRALIBS) $(LIBFUZZER_PATH)
 
+tools/target_bsf_%_fuzzer$(EXESUF): tools/target_bsf_%_fuzzer.o $(FF_DEP_LIBS)
+	$(LD) $(LDFLAGS) $(LDEXEFLAGS) $(LD_O) $^ $(ELIBS) $(FF_EXTRALIBS) $(LIBFUZZER_PATH)
+
+tools/target_dem_fuzzer$(EXESUF): tools/target_dem_fuzzer.o $(FF_DEP_LIBS)
+	$(LD) $(LDFLAGS) $(LDEXEFLAGS) $(LD_O) $^ $(ELIBS) $(FF_EXTRALIBS) $(LIBFUZZER_PATH)
+
 tools/sofa2wavs$(EXESUF): ELIBS = $(FF_EXTRALIBS)
 tools/uncoded_frame$(EXESUF): $(FF_DEP_LIBS)
 tools/uncoded_frame$(EXESUF): ELIBS = $(FF_EXTRALIBS)
@@ -135,7 +141,7 @@
 
 clean::
 	$(RM) $(CLEANSUFFIXES)
-	$(RM) $(addprefix compat/,$(CLEANSUFFIXES)) $(addprefix compat/*/,$(CLEANSUFFIXES))
+	$(RM) $(addprefix compat/,$(CLEANSUFFIXES)) $(addprefix compat/*/,$(CLEANSUFFIXES)) $(addprefix compat/*/*/,$(CLEANSUFFIXES))
 	$(RM) -r coverage-html
 	$(RM) -rf coverage.info coverage.info.in lcov
 
@@ -145,6 +151,7 @@
 		version.h libavutil/ffversion.h libavcodec/codec_names.h \
 		libavcodec/bsf_list.c libavformat/protocol_list.c \
 		libavcodec/codec_list.c libavcodec/parser_list.c \
+		libavfilter/filter_list.c libavdevice/indev_list.c libavdevice/outdev_list.c \
 		libavformat/muxer_list.c libavformat/demuxer_list.c
 ifeq ($(SRC_LINK),src)
 	$(RM) src
@@ -159,7 +166,7 @@
 
 include $(SRC_PATH)/tests/Makefile
 
-$(sort $(OBJDIRS)):
+$(sort $(OUTDIRS)):
 	$(Q)mkdir -p $@
 
 # Dummy rule to stop make trying to rebuild removed or renamed headers
diff --git a/RELEASE b/RELEASE
index ff2c9d1..f4ec7e2 100644
--- a/RELEASE
+++ b/RELEASE
@@ -1 +1 @@
-4.0.git
+4.2.git
diff --git a/compat/avisynth/windowsPorts/basicDataTypeConversions.h b/compat/avisynth/windowsPorts/basicDataTypeConversions.h
deleted file mode 100644
index ff367d5..0000000
--- a/compat/avisynth/windowsPorts/basicDataTypeConversions.h
+++ /dev/null
@@ -1,85 +0,0 @@
-#ifndef __DATA_TYPE_CONVERSIONS_H__
-#define __DATA_TYPE_CONVERSIONS_H__
-
-#include <stdint.h>
-#include <wchar.h>
-
-#ifdef __cplusplus
-namespace avxsynth {
-#endif // __cplusplus
-
-typedef int64_t __int64;
-typedef int32_t __int32;
-#ifdef __cplusplus
-typedef bool BOOL;
-#else
-typedef uint32_t BOOL;
-#endif // __cplusplus
-typedef void* HMODULE;
-typedef void* LPVOID;
-typedef void* PVOID;
-typedef PVOID HANDLE;
-typedef HANDLE HWND;
-typedef HANDLE HINSTANCE;
-typedef void* HDC;
-typedef void* HBITMAP;
-typedef void* HICON;
-typedef void* HFONT;
-typedef void* HGDIOBJ;
-typedef void* HBRUSH;
-typedef void* HMMIO;
-typedef void* HACMSTREAM;
-typedef void* HACMDRIVER;
-typedef void* HIC;
-typedef void* HACMOBJ;
-typedef HACMSTREAM* LPHACMSTREAM;
-typedef void* HACMDRIVERID;
-typedef void* LPHACMDRIVER;
-typedef unsigned char BYTE;
-typedef BYTE* LPBYTE;
-typedef char TCHAR;
-typedef TCHAR* LPTSTR;
-typedef const TCHAR* LPCTSTR;
-typedef char* LPSTR;
-typedef LPSTR LPOLESTR;
-typedef const char* LPCSTR;
-typedef LPCSTR LPCOLESTR;
-typedef wchar_t WCHAR;
-typedef unsigned short WORD;
-typedef unsigned int UINT;
-typedef UINT MMRESULT;
-typedef uint32_t DWORD;
-typedef DWORD COLORREF;
-typedef DWORD FOURCC;
-typedef DWORD HRESULT;
-typedef DWORD* LPDWORD;
-typedef DWORD* DWORD_PTR;
-typedef int32_t LONG;
-typedef int32_t* LONG_PTR;
-typedef LONG_PTR LRESULT;
-typedef uint32_t ULONG;
-typedef uint32_t* ULONG_PTR;
-//typedef __int64_t intptr_t;
-typedef uint64_t _fsize_t;
-
-
-//
-// Structures
-//
-
-typedef struct _GUID {
-  DWORD Data1;
-  WORD  Data2;
-  WORD  Data3;
-  BYTE  Data4[8];
-} GUID;
-
-typedef GUID REFIID;
-typedef GUID CLSID;
-typedef CLSID* LPCLSID;
-typedef GUID IID;
-
-#ifdef __cplusplus
-}; // namespace avxsynth
-#endif // __cplusplus
-#endif //  __DATA_TYPE_CONVERSIONS_H__
diff --git a/compat/avisynth/windowsPorts/windows2linux.h b/compat/avisynth/windowsPorts/windows2linux.h
deleted file mode 100644
index 7cf4600..0000000
--- a/compat/avisynth/windowsPorts/windows2linux.h
+++ /dev/null
@@ -1,77 +0,0 @@
-#ifndef __WINDOWS2LINUX_H__
-#define __WINDOWS2LINUX_H__
-
-/*
- * LINUX SPECIFIC DEFINITIONS
-*/
-//
-// Data types conversions
-//
-#include <stdlib.h>
-#include <string.h>
-#include "basicDataTypeConversions.h"
-
-#ifdef __cplusplus
-namespace avxsynth {
-#endif // __cplusplus
-//
-// purposefully define the following MSFT definitions
-// to mean nothing (as they do not mean anything on Linux)
-//
-#define __stdcall
-#define __cdecl
-#define noreturn
-#define __declspec(x)
-#define STDAPI       extern "C" HRESULT
-#define STDMETHODIMP HRESULT __stdcall
-#define STDMETHODIMP_(x) x __stdcall
-
-#define STDMETHOD(x)    virtual HRESULT x
-#define STDMETHOD_(a, x) virtual a x
-
-#ifndef TRUE
-#define TRUE  true
-#endif
-
-#ifndef FALSE
-#define FALSE false
-#endif
-
-#define S_OK                (0x00000000)
-#define S_FALSE             (0x00000001)
-#define E_NOINTERFACE       (0X80004002)
-#define E_POINTER           (0x80004003)
-#define E_FAIL              (0x80004005)
-#define E_OUTOFMEMORY       (0x8007000E)
-
-#define INVALID_HANDLE_VALUE    ((HANDLE)((LONG_PTR)-1))
-#define FAILED(hr)              ((hr) & 0x80000000)
-#define SUCCEEDED(hr)           (!FAILED(hr))
-
-
-//
-// Functions
-//
-#define MAKEDWORD(a,b,c,d) (((a) << 24) | ((b) << 16) | ((c) << 8) | (d))
-#define MAKEWORD(a,b) (((a) << 8) | (b))
-
-#define lstrlen                             strlen
-#define lstrcpy                             strcpy
-#define lstrcmpi                            strcasecmp
-#define _stricmp                            strcasecmp
-#define InterlockedIncrement(x)             __sync_fetch_and_add((x), 1)
-#define InterlockedDecrement(x)             __sync_fetch_and_sub((x), 1)
-// Windows uses (new, old) ordering but GCC has (old, new)
-#define InterlockedCompareExchange(x,y,z)   __sync_val_compare_and_swap(x,z,y)
-
-#define UInt32x32To64(a, b)                 ( (uint64_t) ( ((uint64_t)((uint32_t)(a))) * ((uint32_t)(b))  ) )
-#define Int64ShrlMod32(a, b)                ( (uint64_t) ( (uint64_t)(a) >> (b) ) )
-#define Int32x32To64(a, b)                  ((__int64)(((__int64)((long)(a))) * ((long)(b))))
-
-#define MulDiv(nNumber, nNumerator, nDenominator)   (int32_t) (((int64_t) (nNumber) * (int64_t) (nNumerator) + (int64_t) ((nDenominator)/2)) / (int64_t) (nDenominator))
-
-#ifdef __cplusplus
-}; // namespace avxsynth
-#endif // __cplusplus
-
-#endif //  __WINDOWS2LINUX_H__
diff --git a/compat/cuda/cuda_runtime.h b/compat/cuda/cuda_runtime.h
new file mode 100644
index 0000000..92c55ad
--- /dev/null
+++ b/compat/cuda/cuda_runtime.h
@@ -0,0 +1,131 @@
+/*
+ * Minimum CUDA compatibility definitions header
+ *
+ * Copyright (c) 2019 Rodger Combs
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef COMPAT_CUDA_CUDA_RUNTIME_H
+#define COMPAT_CUDA_CUDA_RUNTIME_H
+
+// Common macros
+#define __global__ __attribute__((global))
+#define __device__ __attribute__((device))
+#define __device_builtin__ __attribute__((device_builtin))
+#define __align__(N) __attribute__((aligned(N)))
+#define __inline__ __inline__ __attribute__((always_inline))
+
+#define max(a, b) ((a) > (b) ? (a) : (b))
+#define min(a, b) ((a) < (b) ? (a) : (b))
+#define abs(x) ((x) < 0 ? -(x) : (x))
+
+#define atomicAdd(a, b) (__atomic_fetch_add(a, b, __ATOMIC_SEQ_CST))
+
+// Basic typedefs
+typedef __device_builtin__ unsigned long long cudaTextureObject_t;
+
+typedef struct __device_builtin__ __align__(2) uchar2
+{
+    unsigned char x, y;
+} uchar2;
+
+typedef struct __device_builtin__ __align__(4) ushort2
+{
+    unsigned short x, y;
+} ushort2;
+
+typedef struct __device_builtin__ uint3
+{
+    unsigned int x, y, z;
+} uint3;
+
+typedef struct uint3 dim3;
+
+typedef struct __device_builtin__ __align__(8) int2
+{
+    int x, y;
+} int2;
+
+typedef struct __device_builtin__ __align__(4) uchar4
+{
+    unsigned char x, y, z, w;
+} uchar4;
+
+typedef struct __device_builtin__ __align__(8) ushort4
+{
+    unsigned char x, y, z, w;
+} ushort4;
+
+typedef struct __device_builtin__ __align__(16) int4
+{
+    int x, y, z, w;
+} int4;
+
+// Accessors for special registers
+#define GETCOMP(reg, comp) \
+    asm("mov.u32 %0, %%" #reg "." #comp ";" : "=r"(tmp)); \
+    ret.comp = tmp;
+
+#define GET(name, reg) static inline __device__ uint3 name() {\
+    uint3 ret; \
+    unsigned tmp; \
+    GETCOMP(reg, x) \
+    GETCOMP(reg, y) \
+    GETCOMP(reg, z) \
+    return ret; \
+}
+
+GET(getBlockIdx, ctaid)
+GET(getBlockDim, ntid)
+GET(getThreadIdx, tid)
+
+// Instead of externs for these registers, we turn access to them into calls into trivial ASM
+#define blockIdx (getBlockIdx())
+#define blockDim (getBlockDim())
+#define threadIdx (getThreadIdx())
+
+// Basic initializers (simple macros rather than inline functions)
+#define make_uchar2(a, b) ((uchar2){.x = a, .y = b})
+#define make_ushort2(a, b) ((ushort2){.x = a, .y = b})
+#define make_uchar4(a, b, c, d) ((uchar4){.x = a, .y = b, .z = c, .w = d})
+#define make_ushort4(a, b, c, d) ((ushort4){.x = a, .y = b, .z = c, .w = d})
+
+// Conversions from the tex instruction's 4-register output to various types
+#define TEX2D(type, ret) static inline __device__ void conv(type* out, unsigned a, unsigned b, unsigned c, unsigned d) {*out = (ret);}
+
+TEX2D(unsigned char, a & 0xFF)
+TEX2D(unsigned short, a & 0xFFFF)
+TEX2D(uchar2, make_uchar2(a & 0xFF, b & 0xFF))
+TEX2D(ushort2, make_ushort2(a & 0xFFFF, b & 0xFFFF))
+TEX2D(uchar4, make_uchar4(a & 0xFF, b & 0xFF, c & 0xFF, d & 0xFF))
+TEX2D(ushort4, make_ushort4(a & 0xFFFF, b & 0xFFFF, c & 0xFFFF, d & 0xFFFF))
+
+// Template calling tex instruction and converting the output to the selected type
+template <class T>
+static inline __device__ T tex2D(cudaTextureObject_t texObject, float x, float y)
+{
+  T ret;
+  unsigned ret1, ret2, ret3, ret4;
+  asm("tex.2d.v4.u32.f32 {%0, %1, %2, %3}, [%4, {%5, %6}];" :
+      "=r"(ret1), "=r"(ret2), "=r"(ret3), "=r"(ret4) :
+      "l"(texObject), "f"(x), "f"(y));
+  conv(&ret, ret1, ret2, ret3, ret4);
+  return ret;
+}
+
+#endif /* COMPAT_CUDA_CUDA_RUNTIME_H */
diff --git a/compat/cuda/dynlink_loader.h b/compat/cuda/dynlink_loader.h
index 9f93465..ca79e60 100644
--- a/compat/cuda/dynlink_loader.h
+++ b/compat/cuda/dynlink_loader.h
@@ -16,8 +16,8 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
-#ifndef AV_COMPAT_CUDA_DYNLINK_LOADER_H
-#define AV_COMPAT_CUDA_DYNLINK_LOADER_H
+#ifndef COMPAT_CUDA_DYNLINK_LOADER_H
+#define COMPAT_CUDA_DYNLINK_LOADER_H
 
 #include "libavutil/log.h"
 #include "compat/w32dlfcn.h"
@@ -30,4 +30,4 @@
 
 #include <ffnvcodec/dynlink_loader.h>
 
-#endif
+#endif /* COMPAT_CUDA_DYNLINK_LOADER_H */
diff --git a/compat/cuda/ptx2c.sh b/compat/cuda/ptx2c.sh
index 5ccabbf..0750e7a 100755
--- a/compat/cuda/ptx2c.sh
+++ b/compat/cuda/ptx2c.sh
@@ -27,7 +27,7 @@
 NAME="$(basename "$IN" | sed 's/\..*//')"
 
 printf "const char %s_ptx[] = \\" "$NAME" > "$OUT"
-while read LINE
+while IFS= read -r LINE
 do
     printf "\n\t\"%s\\\n\"" "$(printf "%s" "$LINE" | sed -e 's/\r//g' -e 's/["\\]/\\&/g')" >> "$OUT"
 done < "$IN"
diff --git a/compat/djgpp/math.c b/compat/djgpp/math.c
new file mode 100644
index 0000000..777b879
--- /dev/null
+++ b/compat/djgpp/math.c
@@ -0,0 +1,47 @@
+/*
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include <math.h>
+
+#define FUN(name, type, op) \
+type name(type x, type y) \
+{ \
+    if (fpclassify(x) == FP_NAN) return y; \
+    if (fpclassify(y) == FP_NAN) return x; \
+    return x op y ? x : y; \
+}
+
+FUN(fmin, double, <)
+FUN(fmax, double, >)
+FUN(fminf, float, <)
+FUN(fmaxf, float, >)
+
+long double fmodl(long double x, long double y)
+{
+    return fmod(x, y);
+}
+
+long double scalbnl(long double x, int exp)
+{
+    return scalbn(x, exp);
+}
+
+long double copysignl(long double x, long double y)
+{
+    return copysign(x, y);
+}
diff --git a/libavfilter/scale.h b/compat/djgpp/math.h
similarity index 75%
copy from libavfilter/scale.h
copy to compat/djgpp/math.h
index dfe67d0..4c02ea9 100644
--- a/libavfilter/scale.h
+++ b/compat/djgpp/math.h
@@ -16,13 +16,10 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
-#ifndef AVFILTER_SCALE_H
-#define AVFILTER_SCALE_H
-
-#include "avfilter.h"
-
-int ff_scale_eval_dimensions(void *ctx,
-    const char *w_expr, const char *h_expr,
-    AVFilterLink *inlink, AVFilterLink *outlink,
-    int *ret_w, int *ret_h);
-#endif
+double fmin(double, double);
+double fmax(double, double);
+float fminf(float, float);
+float fmaxf(float, float);
+long double fmodl(long double, long double);
+long double scalbnl(long double, int);
+long double copysignl(long double, long double);
diff --git a/compat/os2threads.h b/compat/os2threads.h
index 2177a03..a061eaa 100644
--- a/compat/os2threads.h
+++ b/compat/os2threads.h
@@ -27,15 +27,19 @@
 #define COMPAT_OS2THREADS_H
 
 #define INCL_DOS
+#define INCL_DOSERRORS
 #include <os2.h>
 
 #undef __STRICT_ANSI__          /* for _beginthread() */
 #include <stdlib.h>
+#include <time.h>
 
 #include <sys/builtin.h>
 #include <sys/fmutex.h>
 
 #include "libavutil/attributes.h"
+#include "libavutil/common.h"
+#include "libavutil/time.h"
 
 typedef struct {
     TID tid;
@@ -163,6 +167,28 @@
     return 0;
 }
 
+static av_always_inline int pthread_cond_timedwait(pthread_cond_t *cond,
+                                                   pthread_mutex_t *mutex,
+                                                   const struct timespec *abstime)
+{
+    int64_t abs_milli = abstime->tv_sec * 1000LL + abstime->tv_nsec / 1000000;
+    ULONG t = av_clip64(abs_milli - av_gettime() / 1000, 0, ULONG_MAX);
+
+    __atomic_increment(&cond->wait_count);
+
+    pthread_mutex_unlock(mutex);
+
+    APIRET ret = DosWaitEventSem(cond->event_sem, t);
+
+    __atomic_decrement(&cond->wait_count);
+
+    DosPostEventSem(cond->ack_sem);
+
+    pthread_mutex_lock(mutex);
+
+    return (ret == ERROR_TIMEOUT) ? ETIMEDOUT : 0;
+}
+
 static av_always_inline int pthread_cond_wait(pthread_cond_t *cond,
                                               pthread_mutex_t *mutex)
 {
diff --git a/compat/w32pthreads.h b/compat/w32pthreads.h
index 21acfd2..6405e72 100644
--- a/compat/w32pthreads.h
+++ b/compat/w32pthreads.h
@@ -38,11 +38,13 @@
 #define WIN32_LEAN_AND_MEAN
 #include <windows.h>
 #include <process.h>
+#include <time.h>
 
 #include "libavutil/attributes.h"
 #include "libavutil/common.h"
 #include "libavutil/internal.h"
 #include "libavutil/mem.h"
+#include "libavutil/time.h"
 
 typedef struct pthread_t {
     void *handle;
@@ -61,6 +63,9 @@
 #define InitializeCriticalSection(x) InitializeCriticalSectionEx(x, 0, 0)
 #define WaitForSingleObject(a, b) WaitForSingleObjectEx(a, b, FALSE)
 
+#define PTHREAD_CANCEL_ENABLE 1
+#define PTHREAD_CANCEL_DISABLE 0
+
 static av_unused unsigned __stdcall attribute_align_arg win32thread_worker(void *arg)
 {
     pthread_t *h = (pthread_t*)arg;
@@ -156,10 +161,31 @@
     return 0;
 }
 
+static inline int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex,
+                                         const struct timespec *abstime)
+{
+    int64_t abs_milli = abstime->tv_sec * 1000LL + abstime->tv_nsec / 1000000;
+    DWORD t = av_clip64(abs_milli - av_gettime() / 1000, 0, UINT32_MAX);
+
+    if (!SleepConditionVariableSRW(cond, mutex, t, 0)) {
+        DWORD err = GetLastError();
+        if (err == ERROR_TIMEOUT)
+            return ETIMEDOUT;
+        else
+            return EINVAL;
+    }
+    return 0;
+}
+
 static inline int pthread_cond_signal(pthread_cond_t *cond)
 {
     WakeConditionVariable(cond);
     return 0;
 }
 
+static inline int pthread_setcancelstate(int state, int *oldstate)
+{
+    return 0;
+}
+
 #endif /* COMPAT_W32PTHREADS_H */
diff --git a/compat/windows/makedef b/compat/windows/makedef
index 7258b94..add8222 100755
--- a/compat/windows/makedef
+++ b/compat/windows/makedef
@@ -48,7 +48,7 @@
 if [ -n "$AR" ]; then
     $AR rcs ${libname} $@ >/dev/null
 else
-    lib -out:${libname} $@ >/dev/null
+    lib.exe -out:${libname} $@ >/dev/null
 fi
 if [ $? != 0 ]; then
     echo "Could not create temporary library." >&2
@@ -108,7 +108,7 @@
               cut -d' ' -f3 |
               sed -e "s/^${prefix}//")
 else
-    dump=$(dumpbin -linkermember:1 ${libname} |
+    dump=$(dumpbin.exe -linkermember:1 ${libname} |
               sed -e '/public symbols/,$!d' -e '/^ \{1,\}Summary/,$d' -e "s/ \{1,\}${prefix}/ /" -e 's/ \{1,\}/ /g' |
               tail -n +2 |
               cut -d' ' -f3)
diff --git a/compat/windows/mslink b/compat/windows/mslink
index 07b2b3e..6cab090 100755
--- a/compat/windows/mslink
+++ b/compat/windows/mslink
@@ -4,6 +4,6 @@
 if [ -x "$LINK_EXE_PATH" ]; then
     "$LINK_EXE_PATH" $@
 else
-    link $@
+    link.exe $@
 fi
 exit $?
diff --git a/configure b/configure
index fd8e8cb..2595ee7 100755
--- a/configure
+++ b/configure
@@ -218,6 +218,7 @@
   --enable-jni             enable JNI support [no]
   --enable-ladspa          enable LADSPA audio filtering [no]
   --enable-libaom          enable AV1 video encoding/decoding via libaom [no]
+  --enable-libaribb24      enable ARIB text and caption decoding via libaribb24 [no]
   --enable-libass          enable libass subtitles rendering,
                            needed for subtitles and ass filter [no]
   --enable-libbluray       enable BluRay reading using libbluray [no]
@@ -226,6 +227,7 @@
   --enable-libcelt         enable CELT decoding via libcelt [no]
   --enable-libcdio         enable audio CD grabbing with libcdio [no]
   --enable-libcodec2       enable codec2 en/decoding using libcodec2 [no]
+  --enable-libdav1d        enable AV1 decoding via libdav1d [no]
   --enable-libdavs2        enable AVS2 decoding via libdavs2 [no]
   --enable-libdc1394       enable IIDC-1394 grabbing using libdc1394
                            and libraw1394 [no]
@@ -234,6 +236,7 @@
   --enable-libfontconfig   enable libfontconfig, useful for drawtext filter [no]
   --enable-libfreetype     enable libfreetype, needed for drawtext filter [no]
   --enable-libfribidi      enable libfribidi, improves drawtext filter [no]
+  --enable-libglslang      enable GLSL->SPIRV compilation via libglslang [no]
   --enable-libgme          enable Game Music Emu via libgme [no]
   --enable-libgsm          enable GSM de/encoding via libgsm [no]
   --enable-libiec61883     enable iec61883 via libiec61883 [no]
@@ -252,6 +255,8 @@
   --enable-libopenmpt      enable decoding tracked files via libopenmpt [no]
   --enable-libopus         enable Opus de/encoding via libopus [no]
   --enable-libpulse        enable Pulseaudio input via libpulse [no]
+  --enable-librabbitmq     enable RabbitMQ library [no]
+  --enable-librav1e        enable AV1 encoding via rav1e [no]
   --enable-librsvg         enable SVG rasterization via librsvg [no]
   --enable-librubberband   enable rubberband needed for rubberband filter [no]
   --enable-librtmp         enable RTMP[E] support via librtmp [no]
@@ -296,7 +301,6 @@
   --enable-lv2             enable LV2 audio filtering [no]
   --disable-lzma           disable lzma [autodetect]
   --enable-decklink        enable Blackmagic DeckLink I/O support [no]
-  --enable-libndi_newtek   enable Newteck NDI I/O support [no]
   --enable-mbedtls         enable mbedTLS, needed for https support
                            if openssl, gnutls or libtls is not used [no]
   --enable-mediacodec      enable Android MediaCodec support [no]
@@ -306,6 +310,7 @@
   --enable-opengl          enable OpenGL rendering [no]
   --enable-openssl         enable openssl, needed for https support
                            if gnutls, libtls or mbedtls is not used [no]
+  --enable-pocketsphinx    enable PocketSphinx, needed for asr filter [no]
   --disable-sndio          disable sndio support [autodetect]
   --disable-schannel       disable SChannel SSP, needed for TLS support on
                            Windows if openssl and gnutls are not used [autodetect]
@@ -313,13 +318,15 @@
   --disable-securetransport disable Secure Transport, needed for TLS support
                            on OSX if openssl and gnutls are not used [autodetect]
   --enable-vapoursynth     enable VapourSynth demuxer [no]
+  --enable-vulkan          enable Vulkan code [no]
   --disable-xlib           disable xlib [autodetect]
   --disable-zlib           disable zlib [autodetect]
 
   The following libraries provide various hardware acceleration features:
   --disable-amf            disable AMF video encoding code [autodetect]
   --disable-audiotoolbox   disable Apple AudioToolbox code [autodetect]
-  --enable-cuda-sdk        enable CUDA features that require the CUDA SDK [no]
+  --enable-cuda-nvcc       enable Nvidia CUDA compiler [no]
+  --disable-cuda-llvm      disable CUDA compilation using clang [autodetect]
   --disable-cuvid          disable Nvidia CUVID support [autodetect]
   --disable-d3d11va        disable Microsoft Direct3D 11 video acceleration code [autodetect]
   --disable-dxva2          disable Microsoft DirectX 9 video acceleration code [autodetect]
@@ -368,7 +375,7 @@
   --cxx=CXX                use C compiler CXX [$cxx_default]
   --objcc=OCC              use ObjC compiler OCC [$cc_default]
   --dep-cc=DEPCC           use dependency generator DEPCC [$cc_default]
-  --nvcc=NVCC              use Nvidia CUDA compiler NVCC [$nvcc_default]
+  --nvcc=NVCC              use Nvidia CUDA compiler NVCC or clang [$nvcc_default]
   --ld=LD                  use linker LD [$ld_default]
   --pkg-config=PKGCONFIG   use pkg-config tool PKGCONFIG [$pkg_config_default]
   --pkg-config-flags=FLAGS pass additional flags to pkgconf []
@@ -379,7 +386,7 @@
   --host-cppflags=HCPPFLAGS use HCPPFLAGS when compiling for host
   --host-ld=HOSTLD         use host linker HOSTLD
   --host-ldflags=HLDFLAGS  use HLDFLAGS when linking for host
-  --host-libs=HLIBS        use libs HLIBS when linking for host
+  --host-extralibs=HLIBS   use libs HLIBS when linking for host
   --host-os=OS             compiler host OS [$target_os]
   --extra-cflags=ECFLAGS   add ECFLAGS to CFLAGS [$CFLAGS]
   --extra-cxxflags=ECFLAGS add ECFLAGS to CXXFLAGS [$CXXFLAGS]
@@ -439,6 +446,7 @@
   --disable-mipsdsp        disable MIPS DSP ASE R1 optimizations
   --disable-mipsdspr2      disable MIPS DSP ASE R2 optimizations
   --disable-msa            disable MSA optimizations
+  --disable-msa2           disable MSA2 optimizations
   --disable-mipsfpu        disable floating point MIPS optimizations
   --disable-mmi            disable Loongson SIMD optimizations
   --disable-fast-unaligned consider unaligned accesses slow
@@ -472,11 +480,12 @@
   --random-seed=VALUE      seed value for --enable/disable-random
   --disable-valgrind-backtrace do not print a backtrace under Valgrind
                            (only applies to --disable-optimizations builds)
-  --enable-osfuzz          Enable building fuzzer tool
+  --enable-ossfuzz         Enable building fuzzer tool
   --libfuzzer=PATH         path to libfuzzer
   --ignore-tests=TESTS     comma-separated list (without "fate-" prefix
                            in the name) of tests whose result is ignored
   --enable-linux-perf      enable Linux Performance Monitor API
+  --disable-large-tests    disable tests that use a large amount of memory
 
 NOTE: Object files are built at the place where configure is launched.
 EOF
@@ -501,9 +510,13 @@
 }
 
 log_file(){
-    log BEGIN $1
-    pr -n -t $1 >> $logfile
-    log END $1
+    log BEGIN "$1"
+    log_file_i=1
+    while IFS= read -r log_file_line; do
+        printf '%5d\t%s\n' "$log_file_i" "$log_file_line"
+        log_file_i=$(($log_file_i+1))
+    done < "$1" >> "$logfile"
+    log END "$1"
 }
 
 warn(){
@@ -647,6 +660,12 @@
     done
 }
 
+warn_if_gets_disabled(){
+    for var in $*; do
+        WARN_IF_GETS_DISABLED_LIST="$WARN_IF_GETS_DISABLED_LIST $var"
+    done
+}
+
 enable(){
     set_all yes $*
 }
@@ -655,6 +674,14 @@
     set_all no $*
 }
 
+disable_with_reason(){
+    disable $1
+    eval "${1}_disable_reason=\"$2\""
+    if requested $1; then
+        die "ERROR: $1 requested, but $2"
+    fi
+}
+
 enable_weak(){
     set_weak yes $*
 }
@@ -783,10 +810,10 @@
 
             [ -n "$dep_ifa" ] && { enabled_all $dep_ifa && enable_weak $cfg; }
             [ -n "$dep_ifn" ] && { enabled_any $dep_ifn && enable_weak $cfg; }
-            enabled_all  $dep_all || { disable $cfg && requested $cfg && die "ERROR: $cfg requested, but not all dependencies are satisfied: $dep_all"; }
-            enabled_any  $dep_any || { disable $cfg && requested $cfg && die "ERROR: $cfg requested, but not any dependency is satisfied: $dep_any"; }
-            disabled_all $dep_con || { disable $cfg && requested $cfg && die "ERROR: $cfg requested, but some conflicting dependencies are unsatisfied: $dep_con"; }
-            disabled_any $dep_sel && { disable $cfg && requested $cfg && die "ERROR: $cfg requested, but some selected dependency is unsatisfied: $dep_sel"; }
+            enabled_all  $dep_all || { disable_with_reason $cfg "not all dependencies are satisfied: $dep_all"; }
+            enabled_any  $dep_any || { disable_with_reason $cfg "not any dependency is satisfied: $dep_any"; }
+            disabled_all $dep_con || { disable_with_reason $cfg "some conflicting dependencies are unsatisfied: $dep_con"; }
+            disabled_any $dep_sel && { disable_with_reason $cfg "some selected dependency is unsatisfied: $dep_sel"; }
 
             enabled $cfg && enable_deep_weak $dep_sel $dep_sgs
 
@@ -985,6 +1012,10 @@
     eval printf '%s\\n' $HOSTCC_O
 }
 
+nvcc_o(){
+    eval printf '%s\\n' $NVCC_O
+}
+
 test_cc(){
     log test_cc "$@"
     cat > $TMPC
@@ -1006,6 +1037,29 @@
     test_cmd $objcc -Werror=missing-prototypes $CPPFLAGS $CFLAGS $OBJCFLAGS "$@" $OBJCC_C $(cc_o $TMPO) $TMPM
 }
 
+test_nvcc(){
+    log test_nvcc "$@"
+    cat > $TMPCU
+    log_file $TMPCU
+    tmpcu_=$TMPCU
+    tmpo_=$TMPO
+    [ -x "$(command -v cygpath)" ] && tmpcu_=$(cygpath -m $tmpcu_) && tmpo_=$(cygpath -m $tmpo_)
+    test_cmd $nvcc $nvccflags "$@" $NVCC_C $(nvcc_o $tmpo_) $tmpcu_
+}
+
+check_nvcc() {
+    log check_nvcc "$@"
+    name=$1
+    shift 1
+    disabled $name && return
+    disable $name
+    test_nvcc "$@" <<EOF && enable $name
+extern "C" {
+    __global__ void hello(unsigned char *data) {}
+}
+EOF
+}
+
 test_cpp(){
     log test_cpp "$@"
     cat > $TMPC
@@ -1498,11 +1552,11 @@
 }
 
 require_cpp(){
-    name="$1"
-    headers="$2"
-    classes="$3"
-    shift 3
-    check_lib_cpp "$headers" "$classes" "$@" || die "ERROR: $name not found"
+    log require_cpp "$@"
+    name_version="$1"
+    name="${1%% *}"
+    shift
+    check_lib_cpp "$name" "$@" || die "ERROR: $name_version not found"
 }
 
 require_headers(){
@@ -1613,7 +1667,7 @@
 "
 
 EXAMPLE_LIST="
-    avio_dir_cmd_example
+    avio_list_dir_example
     avio_reading_example
     decode_audio_example
     decode_video_example
@@ -1674,7 +1728,6 @@
 
 EXTERNAL_LIBRARY_NONFREE_LIST="
     decklink
-    libndi_newtek
     libfdk_aac
     openssl
     libtls
@@ -1682,6 +1735,7 @@
 
 EXTERNAL_LIBRARY_VERSION3_LIST="
     gmp
+    libaribb24
     liblensfun
     libopencore_amrnb
     libopencore_amrwb
@@ -1712,12 +1766,14 @@
     libcaca
     libcelt
     libcodec2
+    libdav1d
     libdc1394
     libdrm
     libflite
     libfontconfig
     libfreetype
     libfribidi
+    libglslang
     libgme
     libgsm
     libiec61883
@@ -1734,6 +1790,8 @@
     libopenmpt
     libopus
     libpulse
+    librabbitmq
+    librav1e
     librsvg
     librtmp
     libshine
@@ -1760,6 +1818,7 @@
     mediacodec
     openal
     opengl
+    pocketsphinx
     vapoursynth
 "
 
@@ -1768,6 +1827,7 @@
     audiotoolbox
     crystalhd
     cuda
+    cuda_llvm
     cuvid
     d3d11va
     dxva2
@@ -1788,6 +1848,7 @@
 "
 
 HWACCEL_LIBRARY_NONFREE_LIST="
+    cuda_nvcc
     cuda_sdk
     libnpp
 "
@@ -1798,6 +1859,7 @@
     mmal
     omx
     opencl
+    vulkan
 "
 
 DOCUMENT_LIST="
@@ -1876,6 +1938,7 @@
     $SUBSYSTEM_LIST
     autodetect
     fontconfig
+    large_tests
     linux_perf
     memory_poisoning
     neon_clobber_test
@@ -1953,6 +2016,7 @@
     mipsdsp
     mipsdspr2
     msa
+    msa2
 "
 
 ARCH_EXT_LIST_LOONGSON="
@@ -2138,10 +2202,12 @@
     getaddrinfo
     gethrtime
     getopt
+    GetModuleHandle
     GetProcessAffinityMask
     GetProcessMemoryInfo
     GetProcessTimes
     getrusage
+    GetStdHandle
     GetSystemTimeAsFileTime
     gettimeofday
     glob
@@ -2167,6 +2233,7 @@
     SecItemImport
     SetConsoleTextAttribute
     SetConsoleCtrlHandler
+    SetDllDirectory
     setmode
     setrlimit
     Sleep
@@ -2213,6 +2280,10 @@
 
 TYPES_LIST="
     kCMVideoCodecType_HEVC
+    kCVPixelFormatType_420YpCbCr10BiPlanarVideoRange
+    kCVImageBufferTransferFunction_SMPTE_ST_2084_PQ
+    kCVImageBufferTransferFunction_ITU_R_2100_HLG
+    kCVImageBufferTransferFunction_Linear
     socklen_t
     struct_addrinfo
     struct_group_source_req
@@ -2335,6 +2406,7 @@
     rtpdec
     rtpenc_chain
     rv34dsp
+    scene_sad
     sinewin
     snappy
     srtp
@@ -2433,6 +2505,7 @@
     tempprefix
     toolchain
     valgrind
+    windres
     x86asmexe
 "
 
@@ -2478,6 +2551,7 @@
 mipsdspr2_deps="mips"
 mmi_deps="mips"
 msa_deps="mipsfpu"
+msa2_deps="msa"
 
 cpunop_deps="i686"
 x86_64_select="i686"
@@ -2537,8 +2611,8 @@
 
 # subsystems
 cbs_av1_select="cbs"
-cbs_h264_select="cbs golomb"
-cbs_h265_select="cbs golomb"
+cbs_h264_select="cbs"
+cbs_h265_select="cbs"
 cbs_jpeg_select="cbs"
 cbs_mpeg2_select="cbs"
 cbs_vp9_select="cbs"
@@ -2574,6 +2648,7 @@
 ac3_fixed_decoder_select="ac3_parser ac3dsp bswapdsp mdct"
 ac3_encoder_select="ac3dsp audiodsp mdct me_cmp"
 ac3_fixed_encoder_select="ac3dsp audiodsp mdct me_cmp"
+acelp_kelvin_decoder_select="audiodsp"
 adpcm_g722_decoder_select="g722dsp"
 adpcm_g722_encoder_select="g722dsp"
 aic_decoder_select="golomb idctdsp"
@@ -2597,7 +2672,9 @@
 asv2_encoder_select="aandcttables bswapdsp fdctdsp pixblockdsp"
 atrac1_decoder_select="mdct sinewin"
 atrac3_decoder_select="mdct"
+atrac3al_decoder_select="mdct"
 atrac3p_decoder_select="mdct sinewin"
+atrac3pal_decoder_select="mdct sinewin"
 atrac9_decoder_select="mdct"
 avrn_decoder_select="exif jpegtables"
 bink_decoder_select="blockdsp hpeldsp"
@@ -2611,6 +2688,7 @@
 cscd_decoder_select="lzo"
 cscd_decoder_suggest="zlib"
 dca_decoder_select="mdct"
+dca_encoder_select="mdct"
 dds_decoder_select="texturedsp"
 dirac_decoder_select="dirac_parse dwt golomb videodsp mpegvideoenc"
 dnxhd_decoder_select="blockdsp idctdsp"
@@ -2659,8 +2737,11 @@
 hevc_decoder_select="bswapdsp cabac golomb hevcparse videodsp"
 huffyuv_decoder_select="bswapdsp huffyuvdsp llviddsp"
 huffyuv_encoder_select="bswapdsp huffman huffyuvencdsp llvidencdsp"
+hymt_decoder_select="huffyuv_decoder"
 iac_decoder_select="imc_decoder"
 imc_decoder_select="bswapdsp fft mdct sinewin"
+imm4_decoder_select="bswapdsp"
+imm5_decoder_select="h264_decoder hevc_decoder"
 indeo3_decoder_select="hpeldsp"
 indeo4_decoder_select="ividsp"
 indeo5_decoder_select="ividsp"
@@ -2669,16 +2750,17 @@
 jv_decoder_select="blockdsp"
 lagarith_decoder_select="llviddsp"
 ljpeg_encoder_select="idctdsp jpegtables mpegvideoenc"
+lscr_decoder_deps="zlib"
 magicyuv_decoder_select="llviddsp"
 magicyuv_encoder_select="llvidencdsp"
-mdec_decoder_select="blockdsp idctdsp mpegvideo"
+mdec_decoder_select="blockdsp bswapdsp idctdsp mpegvideo"
 metasound_decoder_select="lsp mdct sinewin"
 mimic_decoder_select="blockdsp bswapdsp hpeldsp idctdsp"
 mjpeg_decoder_select="blockdsp hpeldsp exif idctdsp jpegtables"
 mjpeg_encoder_select="jpegtables mpegvideoenc"
 mjpegb_decoder_select="mjpeg_decoder"
 mlp_decoder_select="mlp_parser"
-mlp_encoder_select="lpc"
+mlp_encoder_select="lpc audio_frame_queue"
 motionpixels_decoder_select="bswapdsp"
 mp1_decoder_select="mpegaudio"
 mp1float_decoder_select="mpegaudio"
@@ -2708,6 +2790,9 @@
 msmpeg4v3_encoder_select="h263_encoder"
 mss2_decoder_select="mpegvideo qpeldsp vc1_decoder"
 mts2_decoder_select="mss34dsp"
+mv30_decoder_select="aandcttables blockdsp"
+mvha_decoder_deps="zlib"
+mvha_decoder_select="llviddsp"
 mwsc_decoder_deps="zlib"
 mxpeg_decoder_select="mjpeg_decoder"
 nellymoser_decoder_select="mdct sinewin"
@@ -2757,10 +2842,11 @@
 tdsc_decoder_select="mjpeg_decoder"
 theora_decoder_select="vp3_decoder"
 thp_decoder_select="mjpeg_decoder"
+tiff_decoder_select="mjpeg_decoder"
 tiff_decoder_suggest="zlib lzma"
 tiff_encoder_suggest="zlib"
 truehd_decoder_select="mlp_parser"
-truehd_encoder_select="lpc"
+truehd_encoder_select="lpc audio_frame_queue"
 truemotion2_decoder_select="bswapdsp"
 truespeech_decoder_select="bswapdsp"
 tscc_decoder_deps="zlib"
@@ -2774,6 +2860,7 @@
 vorbis_decoder_select="mdct"
 vorbis_encoder_select="audio_frame_queue mdct"
 vp3_decoder_select="hpeldsp vp3dsp videodsp"
+vp4_decoder_select="vp3_decoder"
 vp5_decoder_select="h264chroma hpeldsp videodsp vp3dsp vp56dsp"
 vp6_decoder_select="h264chroma hpeldsp huffman videodsp vp3dsp vp56dsp"
 vp6a_decoder_select="vp6_decoder"
@@ -2798,6 +2885,7 @@
 wmv3image_decoder_select="wmv3_decoder"
 xma1_decoder_select="wmapro_decoder"
 xma2_decoder_select="wmapro_decoder"
+ylc_decoder_select="bswapdsp"
 zerocodec_decoder_deps="zlib"
 zlib_decoder_deps="zlib"
 zlib_encoder_deps="zlib"
@@ -2812,6 +2900,7 @@
 dxva2_deps="dxva2api_h DXVA2_ConfigPictureDecode ole32 user32"
 ffnvcodec_deps_any="libdl LoadLibrary"
 nvdec_deps="ffnvcodec"
+vaapi_x11_deps="xlib"
 videotoolbox_hwaccel_deps="videotoolbox pthreads"
 videotoolbox_hwaccel_extralibs="-framework QuartzCore"
 xvmc_deps="X11_extensions_XvMClib_h"
@@ -2912,6 +3001,8 @@
 vp9_nvdec_hwaccel_select="vp9_decoder"
 vp9_vaapi_hwaccel_deps="vaapi VADecPictureParameterBufferVP9_bit_depth"
 vp9_vaapi_hwaccel_select="vp9_decoder"
+vp9_vdpau_hwaccel_deps="vdpau VdpPictureInfoVP9"
+vp9_vdpau_hwaccel_select="vp9_decoder"
 wmv3_d3d11va_hwaccel_select="vc1_d3d11va_hwaccel"
 wmv3_d3d11va2_hwaccel_select="vc1_d3d11va2_hwaccel"
 wmv3_dxva2_hwaccel_select="vc1_dxva2_hwaccel"
@@ -2931,9 +3022,13 @@
 
 hwupload_cuda_filter_deps="ffnvcodec"
 scale_npp_filter_deps="ffnvcodec libnpp"
-scale_cuda_filter_deps="cuda_sdk"
-thumbnail_cuda_filter_deps="cuda_sdk"
+scale_cuda_filter_deps="ffnvcodec"
+scale_cuda_filter_deps_any="cuda_nvcc cuda_llvm"
+thumbnail_cuda_filter_deps="ffnvcodec"
+thumbnail_cuda_filter_deps_any="cuda_nvcc cuda_llvm"
 transpose_npp_filter_deps="ffnvcodec libnpp"
+overlay_cuda_filter_deps="ffnvcodec"
+overlay_cuda_filter_deps_any="cuda_nvcc cuda_llvm"
 
 amf_deps_any="libdl LoadLibrary"
 nvenc_deps="ffnvcodec"
@@ -2951,12 +3046,13 @@
 h264_mmal_decoder_deps="mmal"
 h264_nvenc_encoder_deps="nvenc"
 h264_omx_encoder_deps="omx"
-h264_qsv_decoder_select="h264_mp4toannexb_bsf h264_parser qsvdec"
+h264_qsv_decoder_select="h264_mp4toannexb_bsf qsvdec"
 h264_qsv_encoder_select="qsvenc"
 h264_rkmpp_decoder_deps="rkmpp"
 h264_rkmpp_decoder_select="h264_mp4toannexb_bsf"
 h264_vaapi_encoder_select="cbs_h264 vaapi_encode"
 h264_v4l2m2m_decoder_deps="v4l2_m2m h264_v4l2_m2m"
+h264_v4l2m2m_decoder_select="h264_mp4toannexb_bsf"
 h264_v4l2m2m_encoder_deps="v4l2_m2m h264_v4l2_m2m"
 hevc_amf_encoder_deps="amf"
 hevc_cuvid_decoder_deps="cuvid"
@@ -2964,15 +3060,17 @@
 hevc_mediacodec_decoder_deps="mediacodec"
 hevc_mediacodec_decoder_select="hevc_mp4toannexb_bsf hevc_parser"
 hevc_nvenc_encoder_deps="nvenc"
-hevc_qsv_decoder_select="hevc_mp4toannexb_bsf hevc_parser qsvdec"
+hevc_qsv_decoder_select="hevc_mp4toannexb_bsf qsvdec"
 hevc_qsv_encoder_select="hevcparse qsvenc"
 hevc_rkmpp_decoder_deps="rkmpp"
 hevc_rkmpp_decoder_select="hevc_mp4toannexb_bsf"
 hevc_vaapi_encoder_deps="VAEncPictureParameterBufferHEVC"
 hevc_vaapi_encoder_select="cbs_h265 vaapi_encode"
 hevc_v4l2m2m_decoder_deps="v4l2_m2m hevc_v4l2_m2m"
+hevc_v4l2m2m_decoder_select="hevc_mp4toannexb_bsf"
 hevc_v4l2m2m_encoder_deps="v4l2_m2m hevc_v4l2_m2m"
 mjpeg_cuvid_decoder_deps="cuvid"
+mjpeg_qsv_decoder_select="qsvdec"
 mjpeg_qsv_encoder_deps="libmfx"
 mjpeg_qsv_encoder_select="qsvenc"
 mjpeg_vaapi_encoder_deps="VAEncPictureParameterBufferJPEG"
@@ -2983,7 +3081,7 @@
 mpeg2_cuvid_decoder_deps="cuvid"
 mpeg2_mmal_decoder_deps="mmal"
 mpeg2_mediacodec_decoder_deps="mediacodec"
-mpeg2_qsv_decoder_select="qsvdec mpegvideo_parser"
+mpeg2_qsv_decoder_select="qsvdec"
 mpeg2_qsv_encoder_select="qsvenc"
 mpeg2_vaapi_encoder_select="cbs_mpeg2 vaapi_encode"
 mpeg2_v4l2m2m_decoder_deps="v4l2_m2m mpeg2_v4l2_m2m"
@@ -3000,11 +3098,11 @@
 vc1_crystalhd_decoder_select="crystalhd"
 vc1_cuvid_decoder_deps="cuvid"
 vc1_mmal_decoder_deps="mmal"
-vc1_qsv_decoder_select="qsvdec vc1_parser"
+vc1_qsv_decoder_select="qsvdec"
 vc1_v4l2m2m_decoder_deps="v4l2_m2m vc1_v4l2_m2m"
 vp8_cuvid_decoder_deps="cuvid"
 vp8_mediacodec_decoder_deps="mediacodec"
-vp8_qsv_decoder_select="qsvdec vp8_parser"
+vp8_qsv_decoder_select="qsvdec"
 vp8_rkmpp_decoder_deps="rkmpp"
 vp8_vaapi_encoder_deps="VAEncPictureParameterBufferVP8"
 vp8_vaapi_encoder_select="vaapi_encode"
@@ -3012,9 +3110,12 @@
 vp8_v4l2m2m_encoder_deps="v4l2_m2m vp8_v4l2_m2m"
 vp9_cuvid_decoder_deps="cuvid"
 vp9_mediacodec_decoder_deps="mediacodec"
+vp9_qsv_decoder_select="qsvdec"
 vp9_rkmpp_decoder_deps="rkmpp"
 vp9_vaapi_encoder_deps="VAEncPictureParameterBufferVP9"
 vp9_vaapi_encoder_select="vaapi_encode"
+vp9_qsv_encoder_deps="libmfx MFX_CODEC_VP9"
+vp9_qsv_encoder_select="qsvenc"
 vp9_v4l2m2m_decoder_deps="v4l2_m2m vp9_v4l2_m2m"
 wmv3_crystalhd_decoder_select="crystalhd"
 
@@ -3030,6 +3131,8 @@
 
 # bitstream_filters
 aac_adtstoasc_bsf_select="adts_header"
+av1_frame_merge_bsf_select="cbs_av1"
+av1_frame_split_bsf_select="cbs_av1"
 av1_metadata_bsf_select="cbs_av1"
 eac3_core_bsf_select="ac3_parser"
 filter_units_bsf_select="cbs"
@@ -3065,6 +3168,7 @@
 mp3_at_decoder_select="mpegaudioheader"
 pcm_alaw_at_decoder_deps="audiotoolbox"
 pcm_mulaw_at_decoder_deps="audiotoolbox"
+qdmc_decoder_select="fft"
 qdmc_at_decoder_deps="audiotoolbox"
 qdm2_at_decoder_deps="audiotoolbox"
 aac_at_encoder_deps="audiotoolbox"
@@ -3085,9 +3189,11 @@
 libaom_av1_decoder_deps="libaom"
 libaom_av1_encoder_deps="libaom"
 libaom_av1_encoder_select="extract_extradata_bsf"
+libaribb24_decoder_deps="libaribb24"
 libcelt_decoder_deps="libcelt"
 libcodec2_decoder_deps="libcodec2"
 libcodec2_encoder_deps="libcodec2"
+libdav1d_decoder_deps="libdav1d"
 libdavs2_decoder_deps="libdavs2"
 libfdk_aac_decoder_deps="libfdk_aac"
 libfdk_aac_encoder_deps="libfdk_aac"
@@ -3116,6 +3222,8 @@
 libopus_decoder_deps="libopus"
 libopus_encoder_deps="libopus"
 libopus_encoder_select="audio_frame_queue"
+librav1e_encoder_deps="librav1e"
+librav1e_encoder_select="extract_extradata_bsf"
 librsvg_decoder_deps="librsvg"
 libshine_encoder_deps="libshine"
 libshine_encoder_select="audio_frame_queue"
@@ -3152,11 +3260,13 @@
 
 # demuxers / muxers
 ac3_demuxer_select="ac3_parser"
+act_demuxer_select="riffdec"
 aiff_muxer_select="iso_media"
 asf_demuxer_select="riffdec"
 asf_o_demuxer_select="riffdec"
 asf_muxer_select="riffenc"
 asf_stream_muxer_select="asf_muxer"
+av1_demuxer_select="av1_frame_merge_bsf av1_parser"
 avi_demuxer_select="iso_media riffdec exif"
 avi_muxer_select="riffenc"
 caf_demuxer_select="iso_media riffdec"
@@ -3180,10 +3290,12 @@
 image2_brender_pix_demuxer_select="image2_demuxer"
 ipod_muxer_select="mov_muxer"
 ismv_muxer_select="mov_muxer"
+ivf_muxer_select="av1_metadata_bsf vp9_superframe_bsf"
 matroska_audio_muxer_select="matroska_muxer"
 matroska_demuxer_select="iso_media riffdec"
 matroska_demuxer_suggest="bzlib lzo zlib"
 matroska_muxer_select="iso_media riffenc"
+mlp_demuxer_select="mlp_parser"
 mmf_muxer_select="riffenc"
 mov_demuxer_select="iso_media riffdec"
 mov_demuxer_suggest="zlib"
@@ -3194,6 +3306,7 @@
 mpegts_demuxer_select="iso_media"
 mpegts_muxer_select="adts_muxer latm_muxer"
 mpegtsraw_demuxer_select="mpegts_demuxer"
+mxf_muxer_select="golomb"
 mxf_d10_muxer_select="mxf_muxer"
 mxf_opatom_muxer_select="mxf_muxer"
 nut_muxer_select="riffenc"
@@ -3204,7 +3317,7 @@
 opus_muxer_select="ogg_muxer"
 psp_muxer_select="mov_muxer"
 rtp_demuxer_select="sdp_demuxer"
-rtp_muxer_select="golomb"
+rtp_muxer_select="golomb jpegtables"
 rtpdec_select="asf_demuxer jpegtables mov_demuxer mpegts_demuxer rm_demuxer rtp_protocol srtp"
 rtsp_demuxer_select="http_protocol rtpdec"
 rtsp_muxer_select="rtp_muxer http_protocol rtp_protocol rtpenc_chain"
@@ -3217,6 +3330,7 @@
 spx_muxer_select="ogg_muxer"
 swf_demuxer_suggest="zlib"
 tak_demuxer_select="tak_parser"
+truehd_demuxer_select="mlp_parser"
 tg2_muxer_select="mov_muxer"
 tgp_muxer_select="mov_muxer"
 vobsub_demuxer_select="mpegps_demuxer"
@@ -3224,6 +3338,7 @@
 w64_muxer_select="wav_muxer"
 wav_demuxer_select="riffdec"
 wav_muxer_select="riffenc"
+webm_chunk_muxer_select="webm_muxer"
 webm_muxer_select="iso_media riffenc"
 webm_dash_manifest_demuxer_select="matroska_demuxer"
 wtv_demuxer_select="mpegts_demuxer riffdec"
@@ -3247,10 +3362,6 @@
 decklink_outdev_deps="decklink threads"
 decklink_outdev_suggest="libklvanc"
 decklink_outdev_extralibs="-lstdc++"
-libndi_newtek_indev_deps="libndi_newtek"
-libndi_newtek_indev_extralibs="-lndi"
-libndi_newtek_outdev_deps="libndi_newtek"
-libndi_newtek_outdev_extralibs="-lndi"
 dshow_indev_deps="IBaseFilter"
 dshow_indev_extralibs="-lpsapi -lole32 -lstrmiids -luuid -loleaut32 -lshlwapi"
 fbdev_indev_deps="linux_fb_h"
@@ -3267,6 +3378,7 @@
 libdc1394_indev_deps="libdc1394"
 openal_indev_deps="openal"
 opengl_outdev_deps="opengl"
+opengl_outdev_suggest="sdl2"
 oss_indev_deps_any="sys_soundcard_h"
 oss_outdev_deps_any="sys_soundcard_h"
 pulse_indev_deps="libpulse"
@@ -3331,6 +3443,8 @@
 unix_protocol_select="network"
 
 # external library protocols
+libamqp_protocol_deps="librabbitmq"
+libamqp_protocol_select="network"
 librtmp_protocol_deps="librtmp"
 librtmpe_protocol_deps="librtmp"
 librtmps_protocol_deps="librtmp"
@@ -3341,6 +3455,8 @@
 libsrt_protocol_select="network"
 libssh_protocol_deps="libssh"
 libtls_conflict="openssl gnutls mbedtls"
+libzmq_protocol_deps="libzmq"
+libzmq_protocol_select="network"
 
 # filters
 afftdn_filter_deps="avcodec"
@@ -3348,13 +3464,15 @@
 afftfilt_filter_deps="avcodec"
 afftfilt_filter_select="fft"
 afir_filter_deps="avcodec"
-afir_filter_select="fft"
+afir_filter_select="rdft"
 amovie_filter_deps="avcodec avformat"
 aresample_filter_deps="swresample"
+asr_filter_deps="pocketsphinx"
 ass_filter_deps="libass"
 atempo_filter_deps="avcodec"
 atempo_filter_select="rdft"
 avgblur_opencl_filter_deps="opencl"
+avgblur_vulkan_filter_deps="vulkan libglslang"
 azmq_filter_deps="libzmq"
 blackframe_filter_deps="gpl"
 bm3d_filter_deps="avcodec"
@@ -3362,6 +3480,8 @@
 boxblur_filter_deps="gpl"
 boxblur_opencl_filter_deps="opencl gpl"
 bs2b_filter_deps="libbs2b"
+chromaber_vulkan_filter_deps="vulkan libglslang"
+colorkey_opencl_filter_deps="opencl"
 colormatrix_filter_deps="gpl"
 convolution_opencl_filter_deps="opencl"
 convolve_filter_deps="avcodec"
@@ -3378,8 +3498,12 @@
 deinterlace_vaapi_filter_deps="vaapi"
 delogo_filter_deps="gpl"
 denoise_vaapi_filter_deps="vaapi"
+derain_filter_select="dnn"
 deshake_filter_select="pixelutils"
+deshake_opencl_filter_deps="opencl"
 dilation_opencl_filter_deps="opencl"
+dnn_processing_filter_deps="swscale"
+dnn_processing_filter_select="dnn"
 drawtext_filter_deps="libfreetype"
 drawtext_filter_suggest="libfontconfig libfribidi"
 elbg_filter_deps="avcodec"
@@ -3393,11 +3517,12 @@
 firequalizer_filter_deps="avcodec"
 firequalizer_filter_select="rdft"
 flite_filter_deps="libflite"
-framerate_filter_select="pixelutils"
+framerate_filter_select="scene_sad"
+freezedetect_filter_select="scene_sad"
 frei0r_filter_deps="frei0r libdl"
 frei0r_src_filter_deps="frei0r libdl"
 fspp_filter_deps="gpl"
-geq_filter_deps="gpl"
+headphone_filter_select="fft"
 histeq_filter_deps="gpl"
 hqdn3d_filter_deps="gpl"
 interlace_filter_deps="gpl"
@@ -3409,8 +3534,10 @@
 movie_filter_deps="avcodec avformat"
 mpdecimate_filter_deps="gpl"
 mpdecimate_filter_select="pixelutils"
+minterpolate_filter_select="scene_sad"
 mptestsrc_filter_deps="gpl"
 negate_filter_deps="lut_filter"
+nlmeans_opencl_filter_deps="opencl"
 nnedi_filter_deps="gpl"
 ocr_filter_deps="libtesseract"
 ocv_filter_deps="libopencv"
@@ -3418,7 +3545,9 @@
 overlay_opencl_filter_deps="opencl"
 overlay_qsv_filter_deps="libmfx"
 overlay_qsv_filter_select="qsvvpp"
+overlay_vulkan_filter_deps="vulkan libglslang"
 owdenoise_filter_deps="gpl"
+pad_opencl_filter_deps="opencl"
 pan_filter_deps="swresample"
 perspective_filter_deps="gpl"
 phase_filter_deps="gpl"
@@ -3437,18 +3566,20 @@
 scale2ref_filter_deps="swscale"
 scale_filter_deps="swscale"
 scale_qsv_filter_deps="libmfx"
-select_filter_select="pixelutils"
+select_filter_select="scene_sad"
 sharpness_vaapi_filter_deps="vaapi"
 showcqt_filter_deps="avcodec avformat swscale"
 showcqt_filter_suggest="libfontconfig libfreetype"
 showcqt_filter_select="fft"
 showfreqs_filter_deps="avcodec"
 showfreqs_filter_select="fft"
+showspatial_filter_select="fft"
 showspectrum_filter_deps="avcodec"
 showspectrum_filter_select="fft"
 showspectrumpic_filter_deps="avcodec"
 showspectrumpic_filter_select="fft"
 signature_filter_deps="gpl avcodec avformat"
+sinc_filter_select="rdft"
 smartblur_filter_deps="gpl swscale"
 sobel_opencl_filter_deps="opencl"
 sofalizer_filter_deps="libmysofa avcodec"
@@ -3463,11 +3594,16 @@
 subtitles_filter_deps="avformat avcodec libass"
 super2xsai_filter_deps="gpl"
 pixfmts_super2xsai_test_deps="super2xsai_filter"
+superequalizer_filter_select="rdft"
+surround_filter_select="rdft"
 tinterlace_filter_deps="gpl"
 tinterlace_merge_test_deps="tinterlace_filter"
 tinterlace_pad_test_deps="tinterlace_filter"
 tonemap_filter_deps="const_nan"
+tonemap_vaapi_filter_deps="vaapi VAProcFilterParameterBufferHDRToneMapping"
 tonemap_opencl_filter_deps="opencl const_nan"
+transpose_opencl_filter_deps="opencl"
+transpose_vaapi_filter_deps="vaapi VAProcPipelineCaps_rotation_flags"
 unsharp_opencl_filter_deps="opencl"
 uspp_filter_deps="gpl avcodec"
 vaguedenoiser_filter_deps="gpl"
@@ -3478,11 +3614,15 @@
 zoompan_filter_deps="swscale"
 zscale_filter_deps="libzimg const_nan"
 scale_vaapi_filter_deps="vaapi"
+scale_vulkan_filter_deps="vulkan libglslang"
 vpp_qsv_filter_deps="libmfx"
 vpp_qsv_filter_select="qsvvpp"
+xfade_opencl_filter_deps="opencl"
+yadif_cuda_filter_deps="ffnvcodec"
+yadif_cuda_filter_deps_any="cuda_nvcc cuda_llvm"
 
 # examples
-avio_dir_cmd_deps="avformat avutil"
+avio_list_dir_deps="avformat avutil"
 avio_reading_deps="avformat avcodec avutil"
 decode_audio_example_deps="avcodec avutil"
 decode_video_example_deps="avcodec avutil"
@@ -3522,7 +3662,7 @@
 avformat_suggest="libm network zlib"
 avresample_deps="avutil"
 avresample_suggest="libm"
-avutil_suggest="clock_gettime ffnvcodec libm libdrm libmfx opencl user32 vaapi videotoolbox corefoundation corevideo coremedia bcrypt"
+avutil_suggest="clock_gettime ffnvcodec libm libdrm libmfx opencl user32 vaapi vulkan videotoolbox corefoundation corevideo coremedia bcrypt"
 postproc_deps="avutil gpl"
 postproc_suggest="libm"
 swresample_deps="avutil"
@@ -3530,15 +3670,15 @@
 swscale_deps="avutil"
 swscale_suggest="libm"
 
-avcodec_extralibs="pthreads_extralibs iconv_extralibs"
+avcodec_extralibs="pthreads_extralibs iconv_extralibs dxva2_extralibs"
 avfilter_extralibs="pthreads_extralibs"
 avutil_extralibs="d3d11va_extralibs nanosleep_extralibs pthreads_extralibs vaapi_drm_extralibs vaapi_x11_extralibs vdpau_x11_extralibs"
 
 # programs
 ffmpeg_deps="avcodec avfilter avformat"
 ffmpeg_select="aformat_filter anull_filter atrim_filter format_filter
-               null_filter
-               trim_filter"
+               hflip_filter null_filter
+               transpose_filter trim_filter vflip_filter"
 ffmpeg_suggest="ole32 psapi shell32"
 ffplay_deps="avcodec avformat swscale swresample sdl2"
 ffplay_select="rdft crop_filter transpose_filter hflip_filter vflip_filter rotate_filter"
@@ -3583,8 +3723,6 @@
 objformat="elf32"
 x86asmexe_default="nasm"
 windres_default="windres"
-nvcc_default="nvcc"
-nvccflags_default="-gencode arch=compute_30,code=sm_30 -O2"
 striptype="direct"
 
 # OS
@@ -3595,6 +3733,7 @@
 if test "$target_os_default" = aix; then
     arch_default=$(uname -p)
     strip_default="strip -X32_64"
+    nm_default="nm -g -X32_64"
 else
     arch_default=$(uname -m)
 fi
@@ -3612,6 +3751,7 @@
 enable debug
 enable doc
 enable faan faandct faanidct
+enable large_tests
 enable optimizations
 enable runtime_cpudetect
 enable safe_bitstream_reader
@@ -3685,6 +3825,8 @@
 # find source path
 if test -f configure; then
     source_path=.
+elif test -f src/configure; then
+    source_path=src
 else
     source_path=$(cd $(dirname "$0"); pwd)
     case "$source_path" in
@@ -3711,8 +3853,7 @@
 
 find_filters_extern(){
     file=$source_path/$1
-    #sed -n "s/^extern AVFilter ff_\([avfsinkrc]\{2,5\}\)_\(\w\+\);/\2_filter/p" $file
-    sed -E -n "s/^extern AVFilter ff_([avfsinkrc]{2,5})_([a-zA-Z0-9_]+);/\2_filter/p" $file
+    sed -n 's/^extern AVFilter ff_[avfsinkrc]\{2,5\}_\([[:alnum:]_]\{1,\}\);/\1_filter/p' $file
 }
 
 FILTER_LIST=$(find_filters_extern libavfilter/allfilters.c)
@@ -3776,8 +3917,22 @@
 }
 
 print_in_columns() {
-    cols=$(expr $ncols / 24)
-    cat | tr ' ' '\n' | sort | pr -r "-$cols" -w $ncols -t
+    tr ' ' '\n' | sort | tr '\r\n' '  ' | awk -v col_width=24 -v width="$ncols" '
+    {
+        num_cols = width > col_width ? int(width / col_width) : 1;
+        num_rows = int((NF + num_cols-1) / num_cols);
+        y = x = 1;
+        for (y = 1; y <= num_rows; y++) {
+            i = y;
+            for (x = 1; x <= num_cols; x++) {
+                if (i <= NF) {
+                  line = sprintf("%s%-" col_width "s", line, $i);
+                }
+                i = i + num_rows;
+            }
+            print line; line = "";
+        }
+    }' | sed 's/ *$//'
 }
 
 show_list() {
@@ -3863,6 +4018,7 @@
             name=$(echo "${optval}" | sed "s/,/_${thing}|/g")_${thing}
             list=$(filter "$name" $list)
             [ "$list" = "" ] && warn "Option $opt did not match anything"
+            test $action = enable && warn_if_gets_disabled $list
             $action $list
         ;;
         --enable-yasm|--disable-yasm)
@@ -4056,22 +4212,22 @@
         # behaviour if the regexp was unable to match anything, since this
         # successfully parses the version number of existing supported
         # versions that require the converter (MSVC 2010 and 2012).
-        cl_major_ver=$(cl 2>&1 | sed -n 's/.*Version \([[:digit:]]\{1,\}\)\..*/\1/p')
+        cl_major_ver=$(cl.exe 2>&1 | sed -n 's/.*Version \([[:digit:]]\{1,\}\)\..*/\1/p')
         if [ -z "$cl_major_ver" ] || [ $cl_major_ver -ge 18 ]; then
-            cc_default="cl"
-            cxx_default="cl"
+            cc_default="cl.exe"
+            cxx_default="cl.exe"
         else
             die "Unsupported MSVC version (2013 or newer required)"
         fi
         ld_default="$source_path/compat/windows/mslink"
-        nm_default="dumpbin -symbols"
-        ar_default="lib"
+        nm_default="dumpbin.exe -symbols"
+        ar_default="lib.exe"
         case "$arch" in
         aarch64|arm64)
-            as_default="armasm64"
+            as_default="armasm64.exe"
             ;;
         arm*)
-            as_default="armasm"
+            as_default="armasm.exe"
             ;;
         esac
         target_os_default="win32"
@@ -4115,6 +4271,11 @@
     enable cross_compile
 fi
 
+set_default target_os
+if test "$target_os" = android; then
+    cc_default="clang"
+fi
+
 ar_default="${cross_prefix}${ar_default}"
 cc_default="${cross_prefix}${cc_default}"
 cxx_default="${cross_prefix}${cxx_default}"
@@ -4130,8 +4291,22 @@
 
 sysinclude_default="${sysroot}/usr/include"
 
+if enabled cuda_sdk; then
+    warn "Option --enable-cuda-sdk is deprecated. Use --enable-cuda-nvcc instead."
+    enable cuda_nvcc
+fi
+
+if enabled cuda_nvcc; then
+    nvcc_default="nvcc"
+    nvccflags_default="-gencode arch=compute_30,code=sm_30 -O2"
+else
+    nvcc_default="clang"
+    nvccflags_default="--cuda-gpu-arch=sm_30 -O2"
+    NVCC_C=""
+fi
+
 set_default arch cc cxx doxygen pkg_config ranlib strip sysinclude \
-    target_exec target_os x86asmexe nvcc
+    target_exec x86asmexe nvcc
 enabled cross_compile || host_cc_default=$cc
 set_default host_cc
 
@@ -4198,6 +4373,7 @@
 tmpfile TMPE   $EXESUF
 tmpfile TMPH   .h
 tmpfile TMPM   .m
+tmpfile TMPCU  .cu
 tmpfile TMPO   .o
 tmpfile TMPS   .S
 tmpfile TMPSH  .sh
@@ -4251,7 +4427,7 @@
             # generic catch all at the bottom will print the original flag.
             -Wall)                ;;
             -Wextra)              ;;
-            -std=c99)             ;;
+            -std=c*)              ;;
             # Common flags
             -fomit-frame-pointer) ;;
             -g)                   echo -Z7 ;;
@@ -4267,6 +4443,7 @@
             -l*)                  echo ${flag#-l}.lib ;;
             -LARGEADDRESSAWARE)   echo $flag ;;
             -L*)                  echo -libpath:${flag#-L} ;;
+            -Wl,*)                ;;
             *)                    echo $flag ;;
         esac
     done
@@ -4494,7 +4671,11 @@
         _ld_path='-libpath:'
     elif $_cc -nologo- 2>&1 | grep -q Microsoft || { $_cc -v 2>&1 | grep -q clang && $_cc -? > /dev/null 2>&1; }; then
         _type=msvc
-        _ident=$($_cc 2>&1 | head -n1 | tr -d '\r')
+        if $_cc -nologo- 2>&1 | grep -q Microsoft; then
+            _ident=$($_cc 2>&1 | head -n1 | tr -d '\r')
+        else
+            _ident=$($_cc --version 2>/dev/null | head -n1 | tr -d '\r')
+        fi
         _DEPCMD='$(DEP$(1)) $(DEP$(1)FLAGS) $($(1)DEP_FLAGS) $< 2>&1 | awk '\''/including/ { sub(/^.*file: */, ""); gsub(/\\/, "/"); if (!match($$0, / /)) print "$@:", $$0 }'\'' > $(@:.o=.d)'
         _DEPFLAGS='$(CPPFLAGS) $(CFLAGS) -showIncludes -Zs'
         _cflags_speed="-O2"
@@ -4622,7 +4803,7 @@
 
 if test "$cpu" = host; then
     enabled cross_compile &&
-        die "--cpu=host makes no sense when cross-compiling."
+        warn "--cpu=host makes no sense when cross-compiling."
 
     case "$cc_type" in
         gcc|llvm_gcc)
@@ -4835,7 +5016,6 @@
                 enable fast_cmov
                 enable fast_unaligned
                 disable aligned_stack
-                disable mipsfpu
                 disable mipsdsp
                 disable mipsdspr2
                 # When gcc version less than 5.3.0, add -fno-expensive-optimizations flag.
@@ -5130,6 +5310,7 @@
             echo "hwcap_1 = OVERRIDE;" > mapfile &&
             add_ldflags -Wl,-M,mapfile
         nm_default='nm -P -g'
+        striptype=""
         version_script='-M'
         VERSION_SCRIPT_POSTPROCESS_CMD='perl $(SRC_PATH)/compat/solaris/make_sunver.pl - $(OBJS)'
         ;;
@@ -5141,6 +5322,7 @@
         ;;
     openbsd|bitrig)
         disable symver
+        enable section_data_rel_ro
         striptype=""
         SHFLAGS='-shared'
         SLIB_INSTALL_NAME='$(SLIBNAME).$(LIBMAJOR).$(LIBMINOR)'
@@ -5179,6 +5361,11 @@
         fi
         version_script='-exported_symbols_list'
         VERSION_SCRIPT_POSTPROCESS_CMD='tr " " "\n" | sed -n /global:/,/local:/p | grep ";" | tr ";" "\n" | sed -E "s/(.+)/_\1/g" | sed -E "s/(.+[^*])$$$$/\1*/"'
+        # Workaround for Xcode 11 -fstack-check bug
+        if enabled clang; then
+            clang_version=$($cc -dumpversion)
+            test ${clang_version%%.*} -eq 11 && add_cflags -fno-stack-check
+        fi
         ;;
     msys*)
         die "Native MSYS builds are discouraged, please use the MINGW environment."
@@ -5283,7 +5470,6 @@
         network_extralibs="-lsocket"
         objformat="coff"
         enable dos_paths
-        add_cppflags -U__STRICT_ANSI__
         ;;
     linux)
         enable section_data_rel_ro
@@ -5354,7 +5540,7 @@
 mkdir "$link_dest"
 $ln_s "$link_dest" "$link_name"
 touch "$link_dest/test_file"
-if [ "$source_path" != "." ] && ([ ! -d src ] || [ -L src ]) && [ -e "$link_name/test_file" ]; then
+if [ "$source_path" != "." ] && [ "$source_path" != "src" ] && ([ ! -d src ] || [ -L src ]) && [ -e "$link_name/test_file" ]; then
     # create link to source path
     [ -e src ] && rm src
     $ln_s "$source_path" src
@@ -5396,6 +5582,7 @@
             add_${pfx}cppflags -D__printf__=__gnu_printf__
         test_${pfx}cpp_condition windows.h "!defined(_WIN32_WINNT) || _WIN32_WINNT < 0x0600" &&
             add_${pfx}cppflags -D_WIN32_WINNT=0x0600
+        add_${pfx}cppflags -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600
     elif test_${pfx}cpp_condition _mingw.h "defined __MINGW_VERSION"  ||
          test_${pfx}cpp_condition _mingw.h "defined __MINGW32_VERSION"; then
         eval ${pfx}libc_type=mingw32
@@ -5409,6 +5596,7 @@
             add_${pfx}cppflags -D_WIN32_WINNT=0x0600
         eval test \$${pfx_no_}cc_type = "gcc" &&
             add_${pfx}cppflags -D__printf__=__gnu_printf__
+        add_${pfx}cppflags -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600
     elif test_${pfx}cpp_condition crtversion.h "defined _VC_CRT_MAJOR_VERSION"; then
         eval ${pfx}libc_type=msvcrt
         if test_${pfx}cpp_condition crtversion.h "_VC_CRT_MAJOR_VERSION < 14"; then
@@ -5452,6 +5640,11 @@
     elif test_${pfx}cpp_condition sys/brand.h "defined LABELED_BRAND_NAME"; then
         eval ${pfx}libc_type=solaris
         add_${pfx}cppflags -D__EXTENSIONS__ -D_XOPEN_SOURCE=600
+    elif test_${pfx}cpp_condition sys/version.h "defined __DJGPP__"; then
+        eval ${pfx}libc_type=djgpp
+        add_cppflags -U__STRICT_ANSI__
+        add_cflags "-include $source_path/compat/djgpp/math.h"
+        add_compat djgpp/math.o
     fi
     test_${pfx}cc <<EOF
 #include <time.h>
@@ -5659,6 +5852,7 @@
     enabled mipsfpu && enabled msa && check_inline_asm_flags msa '"addvi.b $w0, $w1, 1"' '-mmsa' && check_headers msa.h || disable msa
     enabled mipsdsp && check_inline_asm_flags mipsdsp '"addu.qb $t0, $t1, $t2"' '-mdsp'
     enabled mipsdspr2 && check_inline_asm_flags mipsdspr2 '"absq_s.qb $t0, $t1"' '-mdspr2'
+    enabled msa && enabled msa2 && check_inline_asm_flags msa2 '"nxbits.any.b $w0, $w0"' '-mmsa2' && check_headers msa2.h || disable msa2
 
     if enabled bigendian && enabled msa; then
         disable msa
@@ -5764,10 +5958,10 @@
             elf*) enabled debug && append X86ASMFLAGS $x86asm_debug ;;
         esac
 
-        check_x86asm avx512_external "vmovdqa32 [eax]{k1}{z}, zmm0"
-        check_x86asm avx2_external   "vextracti128 xmm0, ymm0, 0"
-        check_x86asm xop_external    "vpmacsdd xmm0, xmm1, xmm2, xmm3"
-        check_x86asm fma4_external   "vfmaddps ymm0, ymm1, ymm2, ymm3"
+        enabled avx512 && check_x86asm avx512_external "vmovdqa32 [eax]{k1}{z}, zmm0"
+        enabled avx2   && check_x86asm avx2_external   "vextracti128 xmm0, ymm0, 0"
+        enabled xop    && check_x86asm xop_external    "vpmacsdd xmm0, xmm1, xmm2, xmm3"
+        enabled fma4   && check_x86asm fma4_external   "vfmaddps ymm0, ymm1, ymm2, ymm3"
         check_x86asm cpunop          "CPU amdnop"
     fi
 
@@ -5877,14 +6071,17 @@
 check_func_headers stdlib.h getenv
 check_func_headers sys/stat.h lstat
 
+check_func_headers windows.h GetModuleHandle
 check_func_headers windows.h GetProcessAffinityMask
 check_func_headers windows.h GetProcessTimes
+check_func_headers windows.h GetStdHandle
 check_func_headers windows.h GetSystemTimeAsFileTime
 check_func_headers windows.h LoadLibrary
 check_func_headers windows.h MapViewOfFile
 check_func_headers windows.h PeekNamedPipe
 check_func_headers windows.h SetConsoleTextAttribute
 check_func_headers windows.h SetConsoleCtrlHandler
+check_func_headers windows.h SetDllDirectory
 check_func_headers windows.h Sleep
 check_func_headers windows.h VirtualAlloc
 check_func_headers glob.h glob
@@ -5949,6 +6146,10 @@
 enabled videotoolbox && {
     check_lib coreservices CoreServices/CoreServices.h UTGetOSTypeFromString "-framework CoreServices"
     check_func_headers CoreMedia/CMFormatDescription.h kCMVideoCodecType_HEVC "-framework CoreMedia"
+    check_func_headers CoreVideo/CVPixelBuffer.h kCVPixelFormatType_420YpCbCr10BiPlanarVideoRange "-framework CoreVideo"
+    check_func_headers CoreVideo/CVImageBuffer.h kCVImageBufferTransferFunction_SMPTE_ST_2084_PQ "-framework CoreVideo"
+    check_func_headers CoreVideo/CVImageBuffer.h kCVImageBufferTransferFunction_ITU_R_2100_HLG "-framework CoreVideo"
+    check_func_headers CoreVideo/CVImageBuffer.h kCVImageBufferTransferFunction_Linear "-framework CoreVideo"
 }
 
 check_struct "sys/time.h sys/resource.h" "struct rusage" ru_maxrss
@@ -5959,20 +6160,32 @@
 check_type "windows.h d3d11.h" "ID3D11VideoContext"
 check_type "d3d9.h dxva2api.h" DXVA2_ConfigPictureDecode -D_WIN32_WINNT=0x0602
 
-check_type "va/va.h va/va_dec_hevc.h" "VAPictureParameterBufferHEVC"
-check_struct "va/va.h" "VADecPictureParameterBufferVP9" bit_depth
-check_type "va/va.h va/va_enc_hevc.h" "VAEncPictureParameterBufferHEVC"
-check_type "va/va.h va/va_enc_jpeg.h" "VAEncPictureParameterBufferJPEG"
-check_type "va/va.h va/va_enc_vp8.h"  "VAEncPictureParameterBufferVP8"
-check_type "va/va.h va/va_enc_vp9.h"  "VAEncPictureParameterBufferVP9"
-
 check_type "vdpau/vdpau.h" "VdpPictureInfoHEVC"
+check_type "vdpau/vdpau.h" "VdpPictureInfoVP9"
+
+if [ -z "$nvccflags" ]; then
+    nvccflags=$nvccflags_default
+fi
+
+if enabled x86_64 || enabled ppc64 || enabled aarch64; then
+    nvccflags="$nvccflags -m64"
+else
+    nvccflags="$nvccflags -m32"
+fi
+
+if enabled cuda_nvcc; then
+    nvccflags="$nvccflags -ptx"
+else
+    nvccflags="$nvccflags -S -nocudalib -nocudainc --cuda-device-only -include ${source_link}/compat/cuda/cuda_runtime.h"
+    check_nvcc cuda_llvm
+fi
 
 if ! disabled ffnvcodec; then
-    check_pkg_config ffnvcodec "ffnvcodec >= 8.1.24.2" \
-          "ffnvcodec/nvEncodeAPI.h ffnvcodec/dynlink_cuda.h ffnvcodec/dynlink_cuviddec.h ffnvcodec/dynlink_nvcuvid.h" "" || \
-      check_pkg_config ffnvcodec "ffnvcodec >= 8.0.14.2 ffnvcodec < 8.1" \
-          "ffnvcodec/nvEncodeAPI.h ffnvcodec/dynlink_cuda.h ffnvcodec/dynlink_cuviddec.h ffnvcodec/dynlink_nvcuvid.h" ""
+    ffnv_hdr_list="ffnvcodec/nvEncodeAPI.h ffnvcodec/dynlink_cuda.h ffnvcodec/dynlink_cuviddec.h ffnvcodec/dynlink_nvcuvid.h"
+    check_pkg_config ffnvcodec "ffnvcodec >= 9.1.23.1" "$ffnv_hdr_list" "" || \
+      check_pkg_config ffnvcodec "ffnvcodec >= 9.0.18.3 ffnvcodec < 9.1" "$ffnv_hdr_list" "" || \
+      check_pkg_config ffnvcodec "ffnvcodec >= 8.2.15.10 ffnvcodec < 8.3" "$ffnv_hdr_list" "" || \
+      check_pkg_config ffnvcodec "ffnvcodec >= 8.1.24.11 ffnvcodec < 8.2" "$ffnv_hdr_list" ""
 fi
 
 check_cpp_condition winrt windows.h "!WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)"
@@ -6042,17 +6255,20 @@
 done
 
 # these are off by default, so fail if requested and not available
-enabled cuda_sdk          && require cuda_sdk cuda.h cuCtxCreate -lcuda
+enabled avisynth          && require_headers "avisynth/avisynth_c.h"
+enabled cuda_nvcc         && { check_nvcc cuda_nvcc || die "ERROR: failed checking for nvcc."; }
 enabled chromaprint       && require chromaprint chromaprint.h chromaprint_get_version -lchromaprint
 enabled decklink          && { require_headers DeckLinkAPI.h &&
                                { test_cpp_condition DeckLinkAPIVersion.h "BLACKMAGIC_DECKLINK_API_VERSION >= 0x0a090500" || die "ERROR: Decklink API version must be >= 10.9.5."; } }
-enabled libndi_newtek     && require_headers Processing.NDI.Lib.h
-enabled frei0r            && require_headers frei0r.h
+enabled frei0r            && require_headers "frei0r.h dlfcn.h"
 enabled gmp               && require gmp gmp.h mpz_export -lgmp
 enabled gnutls            && require_pkg_config gnutls gnutls gnutls/gnutls.h gnutls_global_init
 enabled jni               && { [ $target_os = "android" ] && check_headers jni.h && enabled pthreads || die "ERROR: jni not found"; }
-enabled ladspa            && require_headers ladspa.h
+enabled ladspa            && require_headers "ladspa.h dlfcn.h"
 enabled libaom            && require_pkg_config libaom "aom >= 1.0.0" aom/aom_codec.h aom_codec_version
+enabled libaribb24        && { check_pkg_config libaribb24 "aribb24 > 1.0.3" "aribb24/aribb24.h" arib_instance_new ||
+                               { enabled gpl && require_pkg_config libaribb24 aribb24 "aribb24/aribb24.h" arib_instance_new; } ||
+                               die "ERROR: libaribb24 requires version higher than 1.0.3 or --enable-gpl."; }
 enabled lv2               && require_pkg_config lv2 lilv-0 "lilv/lilv.h" lilv_world_new
 enabled libiec61883       && require libiec61883 libiec61883/iec61883.h iec61883_cmp_connect -lraw1394 -lavc1394 -lrom1394 -liec61883
 enabled libass            && require_pkg_config libass libass ass/ass.h ass_library_init
@@ -6063,7 +6279,8 @@
                                die "ERROR: libcelt must be installed and version must be >= 0.11.0."; }
 enabled libcaca           && require_pkg_config libcaca caca caca.h caca_create_canvas
 enabled libcodec2         && require libcodec2 codec2/codec2.h codec2_create -lcodec2
-enabled libdavs2          && require_pkg_config libdavs2 "davs2 >= 1.5.115" davs2.h davs2_decoder_open
+enabled libdav1d          && require_pkg_config libdav1d "dav1d >= 0.4.0" "dav1d/dav1d.h" dav1d_version
+enabled libdavs2          && require_pkg_config libdavs2 "davs2 >= 1.6.0" davs2.h davs2_decoder_open
 enabled libdc1394         && require_pkg_config libdc1394 libdc1394-2 dc1394/dc1394.h dc1394_new
 enabled libdrm            && require_pkg_config libdrm libdrm xf86drm.h drmGetVersion
 enabled libfdk_aac        && { check_pkg_config libfdk_aac fdk-aac "fdk-aac/aacenc_lib.h" aacEncOpen ||
@@ -6075,6 +6292,7 @@
 enabled libfontconfig     && require_pkg_config libfontconfig fontconfig "fontconfig/fontconfig.h" FcInit
 enabled libfreetype       && require_pkg_config libfreetype freetype2 "ft2build.h FT_FREETYPE_H" FT_Init_FreeType
 enabled libfribidi        && require_pkg_config libfribidi fribidi fribidi.h fribidi_version_info
+enabled libglslang        && require_cpp libglslang glslang/SPIRV/GlslangToSpv.h "glslang::TIntermediate*" -lglslang -lOSDependent -lHLSL -lOGLCompiler -lSPVRemapper -lSPIRV -lSPIRV-Tools-opt -lSPIRV-Tools -lpthread -lstdc++
 enabled libgme            && { check_pkg_config libgme libgme gme/gme.h gme_new_emu ||
                                require libgme gme/gme.h gme_new_emu -lgme -lstdc++; }
 enabled libgsm            && { for gsm_hdr in "gsm.h" "gsm/gsm.h"; do
@@ -6092,10 +6310,14 @@
 # can find the libraries and headers through other means.
 enabled libmfx            && { check_pkg_config libmfx libmfx "mfx/mfxvideo.h" MFXInit ||
                                { require libmfx "mfx/mfxvideo.h" MFXInit "-llibmfx $advapi32_extralibs" && warn "using libmfx without pkg-config"; } }
+if enabled libmfx; then
+   check_cc MFX_CODEC_VP9 "mfx/mfxvp9.h mfx/mfxstructures.h" "MFX_CODEC_VP9"
+fi
+
 enabled libmodplug        && require_pkg_config libmodplug libmodplug libmodplug/modplug.h ModPlug_Load
 enabled libmp3lame        && require "libmp3lame >= 3.98.3" lame/lame.h lame_set_VBR_quality -lmp3lame $libm_extralibs
-enabled libmysofa         && { check_pkg_config libmysofa libmysofa mysofa.h mysofa_load ||
-                               require libmysofa mysofa.h mysofa_load -lmysofa $zlib_extralibs; }
+enabled libmysofa         && { check_pkg_config libmysofa libmysofa mysofa.h mysofa_neighborhood_init_withstepdefine ||
+                               require libmysofa mysofa.h mysofa_neighborhood_init_withstepdefine -lmysofa $zlib_extralibs; }
 enabled libnpp            && { check_lib libnpp npp.h nppGetLibVersion -lnppig -lnppicc -lnppc -lnppidei ||
                                check_lib libnpp npp.h nppGetLibVersion -lnppi -lnppc -lnppidei ||
                                die "ERROR: libnpp not found"; }
@@ -6119,6 +6341,8 @@
 #     }
 # }
 enabled libpulse          && require_pkg_config libpulse libpulse pulse/pulseaudio.h pa_context_new
+enabled librabbitmq       && require_pkg_config librabbitmq "librabbitmq >= 0.7.1" amqp.h amqp_new_connection
+enabled librav1e          && require_pkg_config librav1e "rav1e >= 0.1.0" rav1e.h rav1e_context_new
 enabled librsvg           && require_pkg_config librsvg librsvg-2.0 librsvg-2.0/librsvg/rsvg.h rsvg_handle_render_cairo
 enabled librtmp           && require_pkg_config librtmp librtmp librtmp/rtmp.h RTMP_Socket
 enabled librubberband     && require_pkg_config librubberband "rubberband >= 1.8.1" rubberband/rubberband-c.h rubberband_new -lstdc++ && append librubberband_extralibs "-lstdc++"
@@ -6147,21 +6371,19 @@
 enabled libvpx            && {
     enabled libvpx_vp8_decoder && {
         check_pkg_config libvpx_vp8_decoder "vpx >= 1.4.0" "vpx/vpx_decoder.h vpx/vp8dx.h" vpx_codec_vp8_dx ||
-            check_lib libvpx_vp8_decoder "vpx/vpx_decoder.h vpx/vp8dx.h" "vpx_codec_dec_init_ver VPX_IMG_FMT_HIGHBITDEPTH" -lvpx ||
-                die "ERROR: libvpx decoder version must be >=1.4.0";
+            check_lib libvpx_vp8_decoder "vpx/vpx_decoder.h vpx/vp8dx.h" "vpx_codec_vp8_dx VPX_IMG_FMT_HIGHBITDEPTH" "-lvpx $libm_extralibs $pthreads_extralibs"
     }
     enabled libvpx_vp8_encoder && {
         check_pkg_config libvpx_vp8_encoder "vpx >= 1.4.0" "vpx/vpx_encoder.h vpx/vp8cx.h" vpx_codec_vp8_cx ||
-            check_lib libvpx_vp8_encoder "vpx/vpx_encoder.h vpx/vp8cx.h" "vpx_codec_enc_init_ver VPX_IMG_FMT_HIGHBITDEPTH" -lvpx ||
-                die "ERROR: libvpx encoder version must be >=1.4.0";
+            check_lib libvpx_vp8_encoder "vpx/vpx_encoder.h vpx/vp8cx.h" "vpx_codec_vp8_cx VPX_IMG_FMT_HIGHBITDEPTH" "-lvpx $libm_extralibs $pthreads_extralibs"
     }
     enabled libvpx_vp9_decoder && {
         check_pkg_config libvpx_vp9_decoder "vpx >= 1.4.0" "vpx/vpx_decoder.h vpx/vp8dx.h" vpx_codec_vp9_dx ||
-            check_lib libvpx_vp9_decoder "vpx/vpx_decoder.h vpx/vp8dx.h" "vpx_codec_vp9_dx VPX_IMG_FMT_HIGHBITDEPTH" "-lvpx $libm_extralibs"
+            check_lib libvpx_vp9_decoder "vpx/vpx_decoder.h vpx/vp8dx.h" "vpx_codec_vp9_dx VPX_IMG_FMT_HIGHBITDEPTH" "-lvpx $libm_extralibs $pthreads_extralibs"
     }
     enabled libvpx_vp9_encoder && {
         check_pkg_config libvpx_vp9_encoder "vpx >= 1.4.0" "vpx/vpx_encoder.h vpx/vp8cx.h" vpx_codec_vp9_cx ||
-            check_lib libvpx_vp9_encoder "vpx/vpx_encoder.h vpx/vp8cx.h" "vpx_codec_vp9_cx VPX_IMG_FMT_HIGHBITDEPTH" "-lvpx $libm_extralibs"
+            check_lib libvpx_vp9_encoder "vpx/vpx_encoder.h vpx/vp8cx.h" "vpx_codec_vp9_cx VPX_IMG_FMT_HIGHBITDEPTH" "-lvpx $libm_extralibs $pthreads_extralibs"
     }
     if disabled_all libvpx_vp8_decoder libvpx_vp9_decoder libvpx_vp8_encoder libvpx_vp9_encoder; then
         die "libvpx enabled but no supported decoders found"
@@ -6178,12 +6400,12 @@
                              require_cpp_condition libx264 x264.h "X264_BUILD >= 118" &&
                              check_cpp_condition libx262 x264.h "X264_MPEG2"
 enabled libx265           && require_pkg_config libx265 x265 x265.h x265_api_get &&
-                             require_cpp_condition libx265 x265.h "X265_BUILD >= 68"
+                             require_cpp_condition libx265 x265.h "X265_BUILD >= 70"
 enabled libxavs           && require libxavs "stdint.h xavs.h" xavs_encoder_encode "-lxavs $pthreads_extralibs $libm_extralibs"
-enabled libxavs2          && require_pkg_config libxavs2 "xavs2 >= 1.2.77" "stdint.h xavs2.h" xavs2_api_get
+enabled libxavs2          && require_pkg_config libxavs2 "xavs2 >= 1.3.0" "stdint.h xavs2.h" xavs2_api_get
 enabled libxvid           && require libxvid xvid.h xvid_global -lxvidcore
 enabled libzimg           && require_pkg_config libzimg "zimg >= 2.7.0" zimg.h zimg_get_api_version
-enabled libzmq            && require_pkg_config libzmq libzmq zmq.h zmq_ctx_new
+enabled libzmq            && require_pkg_config libzmq "libzmq >= 4.2.1" zmq.h zmq_ctx_new
 enabled libzvbi           && require_pkg_config libzvbi zvbi-0.2 libzvbi.h vbi_decoder_new &&
                              { test_cpp_condition libzvbi.h "VBI_VERSION_MAJOR > 0 || VBI_VERSION_MINOR > 2 || VBI_VERSION_MINOR == 2 && VBI_VERSION_MICRO >= 28" ||
                                enabled gpl || die "ERROR: libzvbi requires version 0.2.28 or --enable-gpl."; }
@@ -6218,16 +6440,21 @@
                                check_lib opengl ES2/gl.h glGetError "-isysroot=${sysroot} -Wl,-framework,OpenGLES" ||
                                die "ERROR: opengl not found."
                              }
+enabled omx_rpi           && { test_code cc OMX_Core.h OMX_IndexConfigBrcmVideoRequestIFrame ||
+                               { ! enabled cross_compile &&
+                                 add_cflags -isystem/opt/vc/include/IL &&
+                                 test_code cc OMX_Core.h OMX_IndexConfigBrcmVideoRequestIFrame; } ||
+                               die "ERROR: OpenMAX IL headers from raspberrypi/firmware not found"; } &&
+                             enable omx
 enabled omx               && require_headers OMX_Core.h
-enabled omx_rpi           && { check_headers OMX_Core.h ||
-                               { ! enabled cross_compile && add_cflags -isystem/opt/vc/include/IL && check_headers OMX_Core.h ; } ||
-                               die "ERROR: OpenMAX IL headers not found"; } && enable omx
 enabled openssl           && { check_pkg_config openssl openssl openssl/ssl.h OPENSSL_init_ssl ||
                                check_pkg_config openssl openssl openssl/ssl.h SSL_library_init ||
+                               check_lib openssl openssl/ssl.h OPENSSL_init_ssl -lssl -lcrypto ||
                                check_lib openssl openssl/ssl.h SSL_library_init -lssl -lcrypto ||
                                check_lib openssl openssl/ssl.h SSL_library_init -lssl32 -leay32 ||
                                check_lib openssl openssl/ssl.h SSL_library_init -lssl -lcrypto -lws2_32 -lgdi32 ||
                                die "ERROR: openssl not found"; }
+enabled pocketsphinx      && require_pkg_config pocketsphinx pocketsphinx pocketsphinx/pocketsphinx.h ps_init
 enabled rkmpp             && { require_pkg_config rkmpp rockchip_mpp  rockchip/rk_mpi.h mpp_create &&
                                require_pkg_config rockchip_mpp "rockchip_mpp >= 1.3.7" rockchip/rk_mpi.h mpp_create &&
                                { enabled libdrm ||
@@ -6298,19 +6525,21 @@
 rsync --help 2> /dev/null | grep -q 'contimeout' && enable rsync_contimeout || disable rsync_contimeout
 
 # check V4L2 codecs available in the API
-check_headers linux/fb.h
-check_headers linux/videodev2.h
-test_code cc linux/videodev2.h "struct v4l2_frmsizeenum vfse; vfse.discrete.width = 0;" && enable_sanitized struct_v4l2_frmivalenum_discrete
-check_cc v4l2_m2m linux/videodev2.h "int i = V4L2_CAP_VIDEO_M2M_MPLANE | V4L2_CAP_VIDEO_M2M | V4L2_BUF_FLAG_LAST;"
-check_cc vc1_v4l2_m2m linux/videodev2.h "int i = V4L2_PIX_FMT_VC1_ANNEX_G;"
-check_cc mpeg1_v4l2_m2m linux/videodev2.h "int i = V4L2_PIX_FMT_MPEG1;"
-check_cc mpeg2_v4l2_m2m linux/videodev2.h "int i = V4L2_PIX_FMT_MPEG2;"
-check_cc mpeg4_v4l2_m2m linux/videodev2.h "int i = V4L2_PIX_FMT_MPEG4;"
-check_cc hevc_v4l2_m2m linux/videodev2.h "int i = V4L2_PIX_FMT_HEVC;"
-check_cc h263_v4l2_m2m linux/videodev2.h "int i = V4L2_PIX_FMT_H263;"
-check_cc h264_v4l2_m2m linux/videodev2.h "int i = V4L2_PIX_FMT_H264;"
-check_cc vp8_v4l2_m2m linux/videodev2.h "int i = V4L2_PIX_FMT_VP8;"
-check_cc vp9_v4l2_m2m linux/videodev2.h "int i = V4L2_PIX_FMT_VP9;"
+if enabled v4l2_m2m; then
+    check_headers linux/fb.h
+    check_headers linux/videodev2.h
+    test_code cc linux/videodev2.h "struct v4l2_frmsizeenum vfse; vfse.discrete.width = 0;" && enable_sanitized struct_v4l2_frmivalenum_discrete
+    check_cc v4l2_m2m linux/videodev2.h "int i = V4L2_CAP_VIDEO_M2M_MPLANE | V4L2_CAP_VIDEO_M2M | V4L2_BUF_FLAG_LAST;"
+    check_cc vc1_v4l2_m2m linux/videodev2.h "int i = V4L2_PIX_FMT_VC1_ANNEX_G;"
+    check_cc mpeg1_v4l2_m2m linux/videodev2.h "int i = V4L2_PIX_FMT_MPEG1;"
+    check_cc mpeg2_v4l2_m2m linux/videodev2.h "int i = V4L2_PIX_FMT_MPEG2;"
+    check_cc mpeg4_v4l2_m2m linux/videodev2.h "int i = V4L2_PIX_FMT_MPEG4;"
+    check_cc hevc_v4l2_m2m linux/videodev2.h "int i = V4L2_PIX_FMT_HEVC;"
+    check_cc h263_v4l2_m2m linux/videodev2.h "int i = V4L2_PIX_FMT_H263;"
+    check_cc h264_v4l2_m2m linux/videodev2.h "int i = V4L2_PIX_FMT_H264;"
+    check_cc vp8_v4l2_m2m linux/videodev2.h "int i = V4L2_PIX_FMT_VP8;"
+    check_cc vp9_v4l2_m2m linux/videodev2.h "int i = V4L2_PIX_FMT_VP9;"
+fi
 
 check_headers sys/videoio.h
 test_code cc sys/videoio.h "struct v4l2_frmsizeenum vfse; vfse.discrete.width = 0;" && enable_sanitized struct_v4l2_frmivalenum_discrete
@@ -6338,8 +6567,8 @@
 EOF
 fi
 
-enabled alsa && check_pkg_config alsa alsa "alsa/asoundlib.h" snd_pcm_htimestamp ||
-    check_lib alsa alsa/asoundlib.h snd_pcm_htimestamp -lasound
+enabled alsa && { check_pkg_config alsa alsa "alsa/asoundlib.h" snd_pcm_htimestamp ||
+                  check_lib alsa alsa/asoundlib.h snd_pcm_htimestamp -lasound; }
 
 enabled libjack &&
     require_pkg_config libjack jack jack/jack.h jack_port_get_latency_range
@@ -6391,6 +6620,15 @@
     fi
 
     check_cpp_condition vaapi_1 "va/va.h" "VA_CHECK_VERSION(1, 0, 0)"
+
+    check_type "va/va.h va/va_dec_hevc.h" "VAPictureParameterBufferHEVC"
+    check_struct "va/va.h" "VADecPictureParameterBufferVP9" bit_depth
+    check_type   "va/va.h va/va_vpp.h" "VAProcFilterParameterBufferHDRToneMapping"
+    check_struct "va/va.h va/va_vpp.h" "VAProcPipelineCaps" rotation_flags
+    check_type "va/va.h va/va_enc_hevc.h" "VAEncPictureParameterBufferHEVC"
+    check_type "va/va.h va/va_enc_jpeg.h" "VAEncPictureParameterBufferJPEG"
+    check_type "va/va.h va/va_enc_vp8.h"  "VAEncPictureParameterBufferVP8"
+    check_type "va/va.h va/va_enc_vp9.h"  "VAEncPictureParameterBufferVP9"
 fi
 
 if enabled_all opencl libdrm ; then
@@ -6401,9 +6639,12 @@
 fi
 
 if enabled_all opencl vaapi ; then
-    enabled opencl_drm_beignet && enable opencl_vaapi_beignet
-    check_type "CL/cl.h CL/va_ext.h" "clCreateFromVA_APIMediaSurfaceINTEL_fn" &&
-        enable opencl_vaapi_intel_media
+    if enabled opencl_drm_beignet ; then
+        enable opencl_vaapi_beignet
+    else
+        check_type "CL/cl.h CL/cl_va_api_media_sharing_intel.h" "clCreateFromVA_APIMediaSurfaceINTEL_fn" &&
+            enable opencl_vaapi_intel_media
+    fi
 fi
 
 if enabled_all opencl dxva2 ; then
@@ -6424,6 +6665,9 @@
 
 enabled crystalhd && check_lib crystalhd "stdint.h libcrystalhd/libcrystalhd_if.h" DtsCrystalHDVersion -lcrystalhd
 
+enabled vulkan &&
+    require_pkg_config vulkan "vulkan >= 1.1.97" "vulkan/vulkan.h" vkCreateInstance
+
 if enabled x86; then
     case $target_os in
         mingw32*|mingw64*|win32|win64|linux|cygwin*)
@@ -6432,6 +6676,14 @@
             disable ffnvcodec cuvid nvdec nvenc
             ;;
     esac
+elif enabled_any aarch64 ppc64 && ! enabled bigendian; then
+    case $target_os in
+        linux)
+            ;;
+        *)
+            disable ffnvcodec cuvid nvdec nvenc
+            ;;
+    esac
 else
     disable ffnvcodec cuvid nvdec nvenc
 fi
@@ -6448,7 +6700,7 @@
 
 enabled amf &&
     check_cpp_condition amf "AMF/core/Version.h" \
-        "(AMF_VERSION_MAJOR << 48 | AMF_VERSION_MINOR << 32 | AMF_VERSION_RELEASE << 16 | AMF_VERSION_BUILD_NUM) >= 0x0001000400040001"
+        "(AMF_VERSION_MAJOR << 48 | AMF_VERSION_MINOR << 32 | AMF_VERSION_RELEASE << 16 | AMF_VERSION_BUILD_NUM) >= 0x0001000400090000"
 
 # Funny iconv installations are not unusual, so check it after all flags have been set
 if enabled libc_iconv; then
@@ -6495,6 +6747,7 @@
 check_disable_warning -Wno-pointer-sign
 check_disable_warning -Wno-unused-const-variable
 check_disable_warning -Wno-bool-operation
+check_disable_warning -Wno-char-subscripts
 
 check_disable_warning_headers(){
     warning_flag=-W${1#-Wno-}
@@ -6510,7 +6763,7 @@
 
 # add some linker flags
 check_ldflags -Wl,--warn-common
-check_ldflags -Wl,-rpath-link=libpostproc:libswresample:libswscale:libavfilter:libavdevice:libavformat:libavcodec:libavutil:libavresample
+check_ldflags -Wl,-rpath-link=:libpostproc:libswresample:libswscale:libavfilter:libavdevice:libavformat:libavcodec:libavutil:libavresample
 enabled rpath && add_ldexeflags -Wl,-rpath,$libdir && add_ldsoflags -Wl,-rpath,$libdir
 test_ldflags -Wl,-Bsymbolic && append SHFLAGS -Wl,-Bsymbolic
 
@@ -6582,16 +6835,6 @@
     fi
 fi
 
-if [ -z "$nvccflags" ]; then
-    nvccflags=$nvccflags_default
-fi
-
-if enabled x86_64 || enabled ppc64 || enabled aarch64; then
-    nvccflags="$nvccflags -m64"
-else
-    nvccflags="$nvccflags -m32"
-fi
-
 check_optflags(){
     check_cflags "$@"
     enabled lto && check_ldflags "$@"
@@ -6777,10 +7020,17 @@
 enabled threads && ! enabled pthreads && ! enabled atomics_native && die "non pthread threading without atomics not supported, try adding --enable-pthreads or --cpu=i486 or higher if you are on x86"
 enabled avresample && warn "Building with deprecated library libavresample"
 
-if test $target_os = "haiku"; then
+case $target_os in
+haiku)
     disable memalign
     disable posix_memalign
-fi
+    ;;
+*-dos|freedos|opendos)
+    if test_cpp_condition sys/version.h "defined(__DJGPP__) && __DJGPP__ == 2 && __DJGPP_MINOR__ == 5"; then
+        disable memalign
+    fi
+    ;;
+esac
 
 flatten_extralibs(){
     nested_entries=
@@ -6904,7 +7154,8 @@
 enabled lavfi_indev         && prepend avdevice_deps "avfilter"
 
 #FIXME
-enabled sdl2_outdev     && add_cflags $(filter_out '-Dmain=SDL_main' $sdl2_cflags)
+enabled_any sdl2_outdev opengl_outdev && enabled sdl2 &&
+    add_cflags $(filter_out '-Dmain=SDL_main' $sdl2_cflags)
 
 enabled opus_decoder    && prepend avcodec_deps "swresample"
 
@@ -7005,6 +7256,7 @@
     echo "MIPS DSP R1 enabled       ${mipsdsp-no}"
     echo "MIPS DSP R2 enabled       ${mipsdspr2-no}"
     echo "MIPS MSA enabled          ${msa-no}"
+    echo "MIPS MSA2 enabled         ${msa2-no}"
     echo "LOONGSON MMI enabled      ${mmi-no}"
 fi
 if enabled ppc; then
@@ -7067,6 +7319,15 @@
 
 fi # test "$quiet" != "yes"
 
+if test -n "$WARN_IF_GETS_DISABLED_LIST"; then
+    for cfg in $WARN_IF_GETS_DISABLED_LIST; do
+        if disabled $cfg; then
+            varname=${cfg}_disable_reason
+            eval "warn \"Disabled $cfg because \$$varname\""
+        fi
+    done
+fi
+
 if test -n "$WARNINGS"; then
     printf "\n%s%s$WARNINGS%s" "$warn_color" "$bold_color" "$reset_color"
     enabled fatal_warnings && exit 1
@@ -7237,7 +7498,7 @@
 #define FFMPEG_CONFIG_H
 #define FFMPEG_CONFIGURATION "$(c_escape $FFMPEG_CONFIGURATION)"
 #define FFMPEG_LICENSE "$(c_escape $license)"
-#define CONFIG_THIS_YEAR 2018
+#define CONFIG_THIS_YEAR 2020
 #define FFMPEG_DATADIR "$(eval c_escape $datadir)"
 #define AVCONV_DATADIR "$(eval c_escape $datadir)"
 #define CC_IDENT "$(c_escape ${cc_ident:-Unknown compiler})"
diff --git a/doc/APIchanges b/doc/APIchanges
index 9e93555..5aa25de 100644
--- a/doc/APIchanges
+++ b/doc/APIchanges
@@ -15,31 +15,144 @@
 
 API changes, most recent first:
 
-2018-10-11 - xxxxxxxxxx - lavc 58.33.100 - mediacodec.h
+2020-04-22 - xxxxxxxxxx - lavc 58.81.100 - packet.h
+  Add AV_PKT_DATA_DOVI_CONF.
+
+2020-04-15 - xxxxxxxxxx - lavc 58.79.100 - avcodec.h
+  Add formal support for calling avcodec_flush_buffers() on encoders.
+  Encoders that set the cap AV_CODEC_CAP_ENCODER_FLUSH will be flushed.
+  For all other encoders, the call is now a no-op rather than undefined
+  behaviour.
+
+2020-xx-xx - xxxxxxxxxx - lavc 58.78.100 - avcodec.h codec_desc.h codec_id.h packet.h
+  Move AVCodecDesc-related public API to new header codec_desc.h.
+  Move AVCodecID enum to new header codec_id.h.
+  Move AVPacket-related public API to new header packet.h.
+
+2020-03-29 - xxxxxxxxxx - lavf 58.42.100 - avformat.h
+  av_read_frame() now guarantees to handle uninitialized input packets
+  and to return refcounted packets on success.
+
+2020-03-27 - xxxxxxxxxx - lavc 58.77.100 - avcodec.h
+  av_packet_ref() now guarantees to return the destination packet
+  in a blank state on error.
+
+2020-03-10 - xxxxxxxxxx - lavc 58.75.100 - avcodec.h
+  Add AV_PKT_DATA_ICC_PROFILE.
+
+2020-02-21 - xxxxxxxxxx - lavc 58.73.101 - avcodec.h
+  Add AV_CODEC_EXPORT_DATA_PRFT.
+
+2020-02-21 - xxxxxxxxxx - lavc 58.73.100 - avcodec.h
+  Add AVCodecContext.export_side_data and AV_CODEC_EXPORT_DATA_MVS.
+
+2020-02-13 - xxxxxxxxxx - lavu 56.41.100 - tx.h
+  Add AV_TX_INT32_FFT and AV_TX_INT32_MDCT
+
+2020-02-12 - xxxxxxxxxx - lavu 56.40.100 - log.h
+  Add av_log_once().
+
+2020-02-04 - xxxxxxxxxx - lavu 56.39.100 - hwcontext.h
+  Add AV_PIX_FMT_VULKAN
+  Add AV_HWDEVICE_TYPE_VULKAN and implementation.
+
+2020-01-30 - xxxxxxxxxx - lavf 58.37.100 - avio.h
+  Add avio_protocol_get_class().
+
+2020-01-15 - xxxxxxxxxx - lavc 58.66.100 - avcodec.h
+  Add AV_PKT_DATA_PRFT and AVProducerReferenceTime.
+
+2019-12-27 - xxxxxxxxxx - lavu 56.38.100 - eval.h
+  Add av_expr_count_func().
+
+2019-12-xx - xxxxxxxxxx - lavu 56.37.100 - buffer.h
+  Add av_buffer_pool_buffer_get_opaque().
+
+2019-11-17 - 1c23abc88f - lavu 56.36.100 - eval API
+  Add av_expr_count_vars().
+
+2019-10-14 - f3746d31f9 - lavu 56.35.101 - opt.h
+  Add AV_OPT_FLAG_RUNTIME_PARAM.
+
+2019-09-25 - xxxxxxxxxx - lavc 58.59.100 - avcodec.h
+  Add max_samples
+
+2019-09-04 - 2a9d461abc - lavu 56.35.100 - hwcontext_videotoolbox.h
+  Add av_map_videotoolbox_format_from_pixfmt2() for full range pixfmt
+
+2019-09-01 - xxxxxxxxxx - lavu 56.34.100 - pixfmt.h
+  Add EBU Tech. 3213-E AVColorPrimaries value
+
+2019-08-xx - xxxxxxxxxx - lavf 58.31.101 - avio.h
+  4K limit removed from avio_printf.
+
+2019-08-xx - xxxxxxxxxx - lavf 58.31.100 - avio.h
+  Add avio_print_string_array and avio_print.
+
+2019-07-27 - xxxxxxxxxx - lavu 56.33.100 - tx.h
+  Add AV_TX_DOUBLE_FFT and AV_TX_DOUBLE_MDCT
+
+-------- 8< --------- FFmpeg 4.2 was cut here -------- 8< ---------
+
+2019-06-21 - a30e44098a - lavu 56.30.100 - frame.h
+  Add FF_DECODE_ERROR_DECODE_SLICES
+
+2019-06-14 - edfced8c04 - lavu 56.29.100 - frame.h
+  Add FF_DECODE_ERROR_CONCEALMENT_ACTIVE
+
+2019-05-15 - b79b29ddb1 - lavu 56.28.100 - tx.h
+  Add av_tx_init(), av_tx_uninit() and related definitions.
+
+2019-04-20 - 3153a6502a - lavc 58.52.100 - avcodec.h
+  Add AV_CODEC_FLAG_DROPCHANGED to allow avcodec_receive_frame to drop
+  frames whose parameters differ from first decoded frame in stream.
+
+2019-04-12 - abfeba9724 - lavf 58.27.102
+  Rename hls,applehttp demuxer to hls
+
+2019-01-27 - 5bcefceec8 - lavc 58.46.100 - avcodec.h
+  Add discard_damaged_percentage
+
+2019-01-08 - 1ef4828276 - lavu 56.26.100 - frame.h
+  Add AV_FRAME_DATA_REGIONS_OF_INTEREST
+
+2018-12-21 - 2744d6b364 - lavu 56.25.100 - hdr_dynamic_metadata.h
+  Add AV_FRAME_DATA_DYNAMIC_HDR_PLUS enum value, av_dynamic_hdr_plus_alloc(),
+  av_dynamic_hdr_plus_create_side_data() functions, and related structs.
+
+-------- 8< --------- FFmpeg 4.1 was cut here -------- 8< ---------
+
+2018-10-27 - 718044dc19 - lavu 56.21.100 - pixdesc.h
+  Add av_read_image_line2(), av_write_image_line2()
+
+2018-10-24 - f9d4126f28 - lavu 56.20.100 - frame.h
+  Add AV_FRAME_DATA_S12M_TIMECODE
+
+2018-10-11 - f6d48b618a - lavc 58.33.100 - mediacodec.h
   Add av_mediacodec_render_buffer_at_time().
 
-2018-09-09 - xxxxxxxxxx - lavc 58.29.100 - avcodec.h
+2018-09-09 - 35498c124a - lavc 58.29.100 - avcodec.h
   Add AV_PKT_DATA_AFD
 
-2018-08-16 - xxxxxxxxxx - lavc 58.23.100 - avcodec.h
+2018-08-16 - b33f5299a5 - lavc 58.23.100 - avcodec.h
   Add av_bsf_flush().
 
-2018-05-xx - xxxxxxxxxx - lavf 58.15.100 - avformat.h
+2018-05-18 - 2b2f2f65f3 - lavf 58.15.100 - avformat.h
   Add pmt_version field to AVProgram
 
-2018-05-xx - xxxxxxxxxx - lavf 58.14.100 - avformat.h
+2018-05-17 - 5dfeb7f081 - lavf 58.14.100 - avformat.h
   Add AV_DISPOSITION_STILL_IMAGE
 
-2018-05-xx - xxxxxxxxxx - lavu 56.18.101 - hwcontext_cuda.h
+2018-05-10 - c855683427 - lavu 56.18.101 - hwcontext_cuda.h
   Add AVCUDADeviceContext.stream.
 
-2018-04-xx - xxxxxxxxxx - lavu 56.18.100 - pixdesc.h
+2018-04-30 - 56b081da57 - lavu 56.18.100 - pixdesc.h
   Add AV_PIX_FMT_FLAG_ALPHA to AV_PIX_FMT_PAL8.
 
-2018-04-xx - xxxxxxxxxx - lavu 56.17.100 - opt.h
+2018-04-26 - 5be0410cb3 - lavu 56.17.100 - opt.h
   Add AV_OPT_FLAG_DEPRECATED.
 
-2018-04-xx - xxxxxxxxxx - lavu 56.16.100 - threadmessage.h
+2018-04-26 - 71fa82bed6 - lavu 56.16.100 - threadmessage.h
   Add av_thread_message_queue_nb_elems().
 
 -------- 8< --------- FFmpeg 4.0 was cut here -------- 8< ---------
diff --git a/doc/bitstream_filters.texi b/doc/bitstream_filters.texi
index d948c6d..8fe5b3a 100644
--- a/doc/bitstream_filters.texi
+++ b/doc/bitstream_filters.texi
@@ -37,6 +37,61 @@
 to MOV/MP4 files and related formats such as 3GP or M4A. Please note
 that it is auto-inserted for MP4A-LATM and MOV/MP4 and related formats.
 
+@section av1_metadata
+
+Modify metadata embedded in an AV1 stream.
+
+@table @option
+@item td
+Insert or remove temporal delimiter OBUs in all temporal units of the
+stream.
+
+@table @samp
+@item insert
+Insert a TD at the beginning of every TU which does not already have one.
+@item remove
+Remove the TD from the beginning of every TU which has one.
+@end table
+
+@item color_primaries
+@item transfer_characteristics
+@item matrix_coefficients
+Set the color description fields in the stream (see AV1 section 6.4.2).
+
+@item color_range
+Set the color range in the stream (see AV1 section 6.4.2; note that
+this cannot be set for streams using BT.709 primaries, sRGB transfer
+characteristic and identity (RGB) matrix coefficients).
+@table @samp
+@item tv
+Limited range.
+@item pc
+Full range.
+@end table
+
+@item chroma_sample_position
+Set the chroma sample location in the stream (see AV1 section 6.4.2).
+This can only be set for 4:2:0 streams.
+
+@table @samp
+@item vertical
+Left position (matching the default in MPEG-2 and H.264).
+@item colocated
+Top-left position.
+@end table
+
+@item tick_rate
+Set the tick rate (@emph{num_units_in_display_tick / time_scale}) in
+the timing info in the sequence header.
+@item num_ticks_per_picture
+Set the number of ticks in each picture, to indicate that the stream
+has a fixed framerate.  Ignored if @option{tick_rate} is not also set.
+
+@item delete_padding
+Deletes Padding OBUs.
+
+@end table
+
 @section chomp
 
 Remove zero padding at the end of a packet.
@@ -48,7 +103,9 @@
 
 @section dump_extra
 
-Add extradata to the beginning of the filtered packets.
+Add extradata to the beginning of the filtered packets except when
+said packets already exactly begin with the extradata that is intended
+to be added.
 
 @table @option
 @item freq
@@ -65,7 +122,7 @@
 @end table
 @end table
 
-If not specified it is assumed @samp{e}.
+If not specified it is assumed @samp{k}.
 
 For example the following @command{ffmpeg} command forces a global
 header (thus disabling individual packet headers) in the H.264 packets
@@ -167,6 +224,10 @@
 @item sample_aspect_ratio
 Set the sample aspect ratio of the stream in the VUI parameters.
 
+@item overscan_appropriate_flag
+Set whether the stream is suitable for display using overscan
+or not (see H.264 section E.2.1).
+
 @item video_format
 @item video_full_range_flag
 Set the video format in the stream (see H.264 section E.2.1 and
@@ -306,6 +367,15 @@
 These fields are set in pixels.  Note that some sizes may not be
 representable if the chroma is subsampled (H.265 section 7.4.3.2.1).
 
+@item level
+Set the level in the VPS and SPS.  See H.265 section A.4 and tables
+A.6 and A.7.
+
+The argument must be the name of a level (for example, @samp{5.1}), a
+@emph{general_level_idc} value (for example, @samp{153} for level 5.1),
+or the special name @samp{auto} indicating that the filter should
+attempt to guess the level from the input stream properties.
+
 @end table
 
 @section hevc_mp4toannexb
@@ -478,6 +548,72 @@
 @section null
 This bitstream filter passes the packets through unchanged.
 
+@section prores_metadata
+
+Modify color property metadata embedded in prores stream.
+
+@table @option
+@item color_primaries
+Set the color primaries.
+Available values are:
+
+@table @samp
+@item auto
+Keep the same color primaries property (default).
+
+@item unknown
+@item bt709
+@item bt470bg
+BT601 625
+
+@item smpte170m
+BT601 525
+
+@item bt2020
+@item smpte431
+DCI P3
+
+@item smpte432
+P3 D65
+
+@end table
+
+@item transfer_characteristics
+Set the color transfer.
+Available values are:
+
+@table @samp
+@item auto
+Keep the same transfer characteristics property (default).
+
+@item unknown
+@item bt709
+BT 601, BT 709, BT 2020
+@end table
+
+
+@item matrix_coefficients
+Set the matrix coefficient.
+Available values are:
+
+@table @samp
+@item auto
+Keep the same colorspace property (default).
+
+@item unknown
+@item bt709
+@item smpte170m
+BT 601
+
+@item bt2020nc
+@end table
+@end table
+
+Set Rec709 colorspace for each frame of the file
+@example
+ffmpeg -i INPUT -c copy -bsf:v prores_metadata=color_primaries=bt709:color_trc=bt709:colorspace=bt709 output.mov
+@end example
+
 @section remove_extra
 
 Remove extradata from packets.
@@ -514,7 +650,12 @@
 headers (everything above the level of individual coded blocks).
 This can be useful for debugging low-level stream issues.
 
-Supports H.264, H.265, MPEG-2 and VP9.
+Supports AV1, H.264, H.265, (M)JPEG, MPEG-2 and VP9, but depending
+on the build only a subset of these may be available.
+
+@section truehd_core
+
+Extract the core from a TrueHD stream, dropping ATMOS data.
 
 @section vp9_metadata
 
@@ -522,7 +663,9 @@
 
 @table @option
 @item color_space
-Set the color space value in the frame header.
+Set the color space value in the frame header.  Note that any frame
+set to RGB will be implicitly set to PC range and that RGB is
+incompatible with profiles 0 and 2.
 @table @samp
 @item unknown
 @item bt601
@@ -534,8 +677,8 @@
 @end table
 
 @item color_range
-Set the color range value in the frame header.  Note that this cannot
-be set in RGB streams.
+Set the color range value in the frame header.  Note that any value
+imposed by the color space will take precedence over this value.
 @table @samp
 @item tv
 @item pc
diff --git a/doc/build_system.txt b/doc/build_system.txt
index 325a9e8..0b1b0c2 100644
--- a/doc/build_system.txt
+++ b/doc/build_system.txt
@@ -36,11 +36,11 @@
 examples
     Build all examples located in doc/examples.
 
-libavformat/output-example
-    Build the libavformat basic example.
+checkheaders
+    Check headers dependencies.
 
-libswscale/swscale-test
-    Build the swscale self-test (useful also as an example).
+alltools
+    Build all tools in tools directory.
 
 config
     Reconfigure the project with the current configuration.
@@ -48,6 +48,8 @@
 tools/target_dec_<decoder>_fuzzer
     Build fuzzer to fuzz the specified decoder.
 
+tools/target_bsf_<filter>_fuzzer
+    Build fuzzer to fuzz the specified bitstream filter.
 
 Useful standard make commands:
 make -t <target>
diff --git a/doc/codecs.texi b/doc/codecs.texi
index 3770f4f..2112ce5 100644
--- a/doc/codecs.texi
+++ b/doc/codecs.texi
@@ -55,6 +55,10 @@
 @item psnr
 Set error[?] variables during encoding.
 @item truncated
+Input bitstream might be randomly truncated.
+@item drop_changed
+Don't output frames whose parameters differ from first decoded frame in stream.
+Error AVERROR_INPUT_CHANGED is returned when a frame is dropped.
 
 @item ildct
 Use interlaced DCT.
@@ -76,6 +80,8 @@
 Apply interlaced motion estimation.
 @item cgop
 Use closed gop.
+@item output_corrupt
+Output even potentially corrupted frames.
 @end table
 
 @item me_method @var{integer} (@emph{encoding,video})
@@ -757,14 +763,12 @@
 Set number of bits which should be loaded into the rc buffer before
 decoding starts.
 
-@item flags2 @var{flags} (@emph{decoding/encoding,audio,video})
+@item flags2 @var{flags} (@emph{decoding/encoding,audio,video,subtitles})
 
 Possible values:
 @table @samp
 @item fast
 Allow non spec compliant speedup tricks.
-@item sgop
-Deprecated, use mpegvideo private options instead.
 @item noout
 Skip bitstream encoding.
 @item ignorecrop
@@ -775,11 +779,25 @@
 Frame data might be split into multiple chunks.
 @item showall
 Show all frames before the first keyframe.
-@item skiprd
-Deprecated, use mpegvideo private options instead.
 @item export_mvs
 Export motion vectors into frame side-data (see @code{AV_FRAME_DATA_MOTION_VECTORS})
 for codecs that support it. See also @file{doc/examples/export_mvs.c}.
+@item skip_manual
+Do not skip samples and export skip information as frame side data.
+@item ass_ro_flush_noop
+Do not reset ASS ReadOrder field on flush.
+@end table
+
+@item export_side_data @var{flags} (@emph{decoding/encoding,audio,video,subtitles})
+
+Possible values:
+@table @samp
+@item mvs
+Export motion vectors into frame side-data (see @code{AV_FRAME_DATA_MOTION_VECTORS})
+for codecs that support it. See also @file{doc/examples/export_mvs.c}.
+@item prft
+Export encoder Producer Reference Time into packet side-data (see @code{AV_PKT_DATA_PRFT})
+for codecs that support it.
 @end table
 
 @item error @var{integer} (@emph{encoding,video})
@@ -962,6 +980,9 @@
 @item nokey
 Discard all frames excepts keyframes.
 
+@item nointra
+Discard all frames except I frames.
+
 @item all
 Discard all frames.
 @end table
@@ -1232,7 +1253,7 @@
 @item dump_separator @var{string} (@emph{input})
 Separator used to separate the fields printed on the command line about the
 Stream parameters.
-For example to separate the fields with newlines and indention:
+For example, to separate the fields with newlines and indentation:
 @example
 ffprobe -dump_separator "
                           "  -i ~/videos/matrixbench_mpeg2.mpg
diff --git a/doc/decoders.texi b/doc/decoders.texi
index 25187e3..0c5a39b 100644
--- a/doc/decoders.texi
+++ b/doc/decoders.texi
@@ -47,6 +47,39 @@
 
 @end table
 
+@section libdav1d
+
+dav1d AV1 decoder.
+
+libdav1d allows libavcodec to decode the AOMedia Video 1 (AV1) codec.
+Requires the presence of the libdav1d headers and library during configuration.
+You need to explicitly configure the build with @code{--enable-libdav1d}.
+
+@subsection Options
+
+The following options are supported by the libdav1d wrapper.
+
+@table @option
+
+@item framethreads
+Set amount of frame threads to use during decoding. The default value is 0 (autodetect).
+
+@item tilethreads
+Set amount of tile threads to use during decoding. The default value is 0 (autodetect).
+
+@item filmgrain
+Apply film grain to the decoded video if present in the bitstream. Defaults to the
+internal default of the library.
+
+@item oppoint
+Select an operating point of a scalable AV1 bitstream (0 - 31). Defaults to the
+internal default of the library.
+
+@item alllayers
+Output all spatial layers of a scalable AV1 bitstream. The default value is false.
+
+@end table
+
 @section libdavs2
 
 AVS2-P2/IEEE1857.4 video decoder wrapper.
@@ -194,6 +227,31 @@
 @chapter Subtitles Decoders
 @c man begin SUBTILES DECODERS
 
+@section libaribb24
+
+ARIB STD-B24 caption decoder.
+
+Implements profiles A and C of the ARIB STD-B24 standard.
+
+@subsection libaribb24 Decoder Options
+
+@table @option
+
+@item -aribb24-base-path @var{path}
+Sets the base path for the libaribb24 library. This is utilized for reading of
+configuration files (for custom unicode conversions), and for dumping of
+non-text symbols as images under that location.
+
+Unset by default.
+
+@item -aribb24-skip-ruby-text @var{boolean}
+Tells the decoder wrapper to skip text blocks that contain half-height ruby
+text.
+
+Enabled by default.
+
+@end table
+
 @section dvbsub
 
 @subsection Options
@@ -229,7 +287,7 @@
 from dumped VOB files.
 
 The format for this option is a string containing 16 24-bits hexadecimal
-numbers (without 0x prefix) separated by comas, for example @code{0d00ee,
+numbers (without 0x prefix) separated by commas, for example @code{0d00ee,
 ee450d, 101010, eaeaea, 0ce60b, ec14ed, ebff0b, 0d617a, 7b7b7b, d1d1d1,
 7b2a0e, 0d950c, 0f007b, cf0dec, cfa80c, 7c127b}.
 
@@ -258,6 +316,11 @@
 list are dropped. You may use the special @code{*} string to match all pages,
 or @code{subtitle} to match all subtitle pages.
 Default value is *.
+@item txt_default_region
+Set default G0 character set used for decoding, a value between 0 and 80 (see
+ETS 300 706, Section 15, Table 32). Default value is -1, which does not
+override the libzvbi default. This option is needed for some legacy level 1.0
+transmissions which cannot signal the proper charset.
 @item txt_chop_top
 Discards the top teletext line. Default value is 1.
 @item txt_format
diff --git a/doc/demuxers.texi b/doc/demuxers.texi
index aad94eb..3c15ab9 100644
--- a/doc/demuxers.texi
+++ b/doc/demuxers.texi
@@ -25,17 +25,6 @@
 
 This demuxer is used to demux Audible Format 2, 3, and 4 (.aa) files.
 
-@section applehttp
-
-Apple HTTP Live Streaming demuxer.
-
-This demuxer presents all AVStreams from all variant streams.
-The id field is set to the bitrate variant index number. By setting
-the discard flags on AVStreams (by pressing 'a' or 'v' in ffplay),
-the caller can decide which variant streams to actually receive.
-The total bitrate of the variant that the stream belongs to is
-available in a metadata key named "variant_bitrate".
-
 @section apng
 
 Animated Portable Network Graphics demuxer.
@@ -320,6 +309,15 @@
 
 HLS demuxer
 
+Apple HTTP Live Streaming demuxer.
+
+This demuxer presents all AVStreams from all variant streams.
+The id field is set to the bitrate variant index number. By setting
+the discard flags on AVStreams (by pressing 'a' or 'v' in ffplay),
+the caller can decide which variant streams to actually receive.
+The total bitrate of the variant that the stream belongs to is
+available in a metadata key named "variant_bitrate".
+
 It accepts the following options:
 
 @table @option
@@ -333,6 +331,10 @@
 Maximum number of times a insufficient list is attempted to be reloaded.
 Default value is 1000.
 
+@item m3u8_hold_counters
+The maximum number of times to load m3u8 when it refreshes without new segments.
+Default value is 1000.
+
 @item http_persistent
 Use persistent HTTP connections. Applicable only for HTTP streams.
 Enabled by default.
@@ -340,6 +342,10 @@
 @item http_multiple
 Use multiple HTTP connections for downloading HTTP segments.
 Enabled by default for HTTP/1.1 servers.
+
+@item http_seekable
+Use HTTP partial requests for downloading HTTP segments.
+0 = disable, 1 = enable, -1 = auto, Default is auto.
 @end table
 
 @section image2
@@ -450,6 +456,17 @@
 @item video_size
 Set the video size of the images to read. If not specified the video
 size is guessed from the first image file in the sequence.
+@item export_path_metadata
+If set to 1, will add two extra fields to the metadata found in input, making them
+also available for other filters (see @var{drawtext} filter for examples). Default
+value is 0. The extra fields are described below:
+@table @option
+@item lavf.image2dec.source_path
+Corresponds to the full path to the input file being read.
+@item lavf.image2dec.source_basename
+Corresponds to the name of the file being read.
+@end table
+
 @end table
 
 @subsection Examples
@@ -481,14 +498,84 @@
 
 The Game Music Emu library is a collection of video game music file emulators.
 
-See @url{http://code.google.com/p/game-music-emu/} for more information.
+See @url{https://bitbucket.org/mpyne/game-music-emu/overview} for more information.
 
-Some files have multiple tracks. The demuxer will pick the first track by
-default. The @option{track_index} option can be used to select a different
-track. Track indexes start at 0. The demuxer exports the number of tracks as
-@var{tracks} meta data entry.
+It accepts the following options:
 
-For very large files, the @option{max_size} option may have to be adjusted.
+@table @option
+
+@item track_index
+Set the index of which track to demux. The demuxer can only export one track.
+Track indexes start at 0. Default is to pick the first track. Number of tracks
+is exported as @var{tracks} metadata entry.
+
+@item sample_rate
+Set the sampling rate of the exported track. Range is 1000 to 999999. Default is 44100.
+
+@item max_size @emph{(bytes)}
+The demuxer buffers the entire file into memory. Adjust this value to set the maximum buffer size,
+which in turn, acts as a ceiling for the size of files that can be read.
+Default is 50 MiB.
+
+@end table
+
+@section libmodplug
+
+ModPlug based module demuxer
+
+See @url{https://github.com/Konstanty/libmodplug}
+
+It will export one 2-channel 16-bit 44.1 kHz audio stream.
+Optionally, a @code{pal8} 16-color video stream can be exported with or without printed metadata.
+
+It accepts the following options:
+
+@table @option
+@item noise_reduction
+Apply a simple low-pass filter. Can be 1 (on) or 0 (off). Default is 0.
+
+@item reverb_depth
+Set amount of reverb. Range 0-100. Default is 0.
+
+@item reverb_delay
+Set delay in ms, clamped to 40-250 ms. Default is 0.
+
+@item bass_amount
+Apply bass expansion a.k.a. XBass or megabass. Range is 0 (quiet) to 100 (loud). Default is 0.
+
+@item bass_range
+Set cutoff i.e. upper-bound for bass frequencies. Range is 10-100 Hz. Default is 0.
+
+@item surround_depth
+Apply a Dolby Pro-Logic surround effect. Range is 0 (quiet) to 100 (heavy). Default is 0.
+
+@item surround_delay
+Set surround delay in ms, clamped to 5-40 ms. Default is 0.
+
+@item max_size
+The demuxer buffers the entire file into memory. Adjust this value to set the maximum buffer size,
+which in turn, acts as a ceiling for the size of files that can be read. Range is 0 to 100 MiB.
+0 removes buffer size limit (not recommended). Default is 5 MiB.
+
+@item video_stream_expr
+String which is evaluated using the eval API to assign colors to the generated video stream.
+Variables which can be used are @code{x}, @code{y}, @code{w}, @code{h}, @code{t}, @code{speed},
+@code{tempo}, @code{order}, @code{pattern} and @code{row}.
+
+@item video_stream
+Generate video stream. Can be 1 (on) or 0 (off). Default is 0.
+
+@item video_stream_w
+Set video frame width in 'chars' where one char indicates 8 pixels. Range is 20-512. Default is 30.
+
+@item video_stream_h
+Set video frame height in 'chars' where one char indicates 8 pixels. Range is 20-512. Default is 30.
+
+@item video_stream_ptxt
+Print metadata on video stream. Includes @code{speed}, @code{tempo}, @code{order}, @code{pattern},
+@code{row} and @code{ts} (time in ms). Can be 1 (on) or 0 (off). Default is 1.
+
+@end table
 
 @section libopenmpt
 
@@ -517,9 +604,13 @@
 Range is from 1000 to INT_MAX. The value default is 48000.
 @end table
 
-@section mov/mp4/3gp/QuickTime
+@section mov/mp4/3gp
 
-QuickTime / MP4 demuxer.
+Demuxer for Quicktime File Format & ISO/IEC Base Media File Format (ISO/IEC 14496-12 or MPEG-4 Part 12, ISO/IEC 15444-12 or JPEG 2000 Part 12).
+
+Registered extensions: mov, mp4, m4a, 3gp, 3g2, mj2, psp, m4b, ism, ismv, isma, f4v
+
+@subsection Options
 
 This demuxer accepts the following options:
 @table @option
@@ -530,10 +621,73 @@
 @item use_absolute_path
 Allows loading of external tracks via absolute paths, disabled by default.
 Enabling this poses a security risk. It should only be enabled if the source
-is known to be non malicious.
+is known to be non-malicious.
 
+@item seek_streams_individually
+When seeking, identify the closest point in each stream individually and demux packets in
+that stream from identified point. This can lead to a different sequence of packets compared
+to demuxing linearly from the beginning. Default is true.
+
+@item ignore_editlist
+Ignore any edit list atoms. The demuxer, by default, modifies the stream index to reflect the
+timeline described by the edit list. Default is false.
+
+@item advanced_editlist
+Modify the stream index to reflect the timeline described by the edit list. @code{ignore_editlist}
+must be set to false for this option to be effective.
+If both @code{ignore_editlist} and this option are set to false, then only the
+start of the stream index is modified to reflect initial dwell time or starting timestamp
+described by the edit list. Default is true.
+
+@item ignore_chapters
+Don't parse chapters. This includes GoPro 'HiLight' tags/moments. Note that chapters are
+only parsed when input is seekable. Default is false.
+
+@item use_mfra_for
+For seekable fragmented input, set fragment's starting timestamp from media fragment random access box, if present.
+
+Following options are available:
+@table @samp
+@item auto
+Auto-detect whether to set mfra timestamps as PTS or DTS @emph{(default)}
+
+@item dts
+Set mfra timestamps as DTS
+
+@item pts
+Set mfra timestamps as PTS
+
+@item 0
+Don't use mfra box to set timestamps
 @end table
 
+@item export_all
+Export unrecognized boxes within the @var{udta} box as metadata entries. The first four
+characters of the box type are set as the key. Default is false.
+
+@item export_xmp
+Export entire contents of @var{XMP_} box and @var{uuid} box as a string with key @code{xmp}. Note that
+if @code{export_all} is set and this option isn't, the contents of @var{XMP_} box are still exported
+but with key @code{XMP_}. Default is false.
+
+@item activation_bytes
+4-byte key required to decrypt Audible AAX and AAX+ files. See Audible AAX subsection below.
+
+@item audible_fixed_key
+Fixed key used for handling Audible AAX/AAX+ files. It has been pre-set so should not be necessary to
+specify.
+
+@item decryption_key
+16-byte key, in hex, to decrypt files encrypted using ISO Common Encryption (CENC/AES-128 CTR; ISO/IEC 23001-7).
+@end table
+
+@subsection Audible AAX
+
+Audible AAX files are encrypted M4B files, and they can be decrypted by specifying a 4 byte activation secret.
+@example
+ffmpeg -activation_bytes 1CEB00DA -i test.aax -vn -c:a copy output.mp4
+@end example
+
 @section mpegts
 
 MPEG-2 transport stream demuxer.
@@ -662,4 +816,20 @@
 ffmpeg -i http://www.ted.com/talks/subtitles/id/1/lang/en talk1-en.srt
 @end example
 
+@section vapoursynth
+
+Vapoursynth wrapper.
+
+Due to security concerns, Vapoursynth scripts will not
+be autodetected so the input format has to be forced. For ff* CLI tools,
+add @code{-f vapoursynth} before the input @code{-i yourscript.vpy}.
+
+This demuxer accepts the following option:
+@table @option
+@item max_script_size
+The demuxer buffers the entire script into memory. Adjust this value to set the maximum buffer size,
+which in turn, acts as a ceiling for the size of scripts that can be read.
+Default is 1 MiB.
+@end table
+
 @c man end DEMUXERS
diff --git a/doc/developer.texi b/doc/developer.texi
index 5c342c9..51e7299 100644
--- a/doc/developer.texi
+++ b/doc/developer.texi
@@ -132,6 +132,9 @@
 for loops with variable definition (@samp{for (int i = 0; i < 8; i++)});
 
 @item
+Variadic macros (@samp{#define ARRAY(nb, ...) (int[nb + 1])@{ nb, __VA_ARGS__ @}});
+
+@item
 Implementation defined behavior for signed integers is assumed to match the
 expected behavior for two's complement. Non representable values in integer
 casts are binary truncated. Shift right of signed values uses sign extension.
diff --git a/doc/encoders.texi b/doc/encoders.texi
index 8d184f7..18bfe8f 100644
--- a/doc/encoders.texi
+++ b/doc/encoders.texi
@@ -733,6 +733,14 @@
 
 Default value is 0.
 
+@item eld_v2
+Enable ELDv2 (LD-MPS extension for ELD stereo signals) for ELDv2 if set to 1,
+disabled if set to 0.
+
+Note that option is available when fdk-aac version (AACENCODER_LIB_VL0.AACENCODER_LIB_VL1.AACENCODER_LIB_VL2) > (4.0.0).
+
+Default value is 0.
+
 @item signaling
 Set SBR/PS signaling style.
 
@@ -1370,6 +1378,236 @@
 
 @end table
 
+@section librav1e
+
+rav1e AV1 encoder wrapper.
+
+Requires the presence of the rav1e headers and library during configuration.
+You need to explicitly configure the build with @code{--enable-librav1e}.
+
+@subsection Options
+
+@table @option
+@item qmax
+Sets the maximum quantizer to use when using bitrate mode.
+
+@item qmin
+Sets the minimum quantizer to use when using bitrate mode.
+
+@item qp
+Uses quantizer mode to encode at the given quantizer (0-255).
+
+@item speed
+Selects the speed preset (0-10) to encode with.
+
+@item tiles
+Selects how many tiles to encode with.
+
+@item tile-rows
+Selects how many rows of tiles to encode with.
+
+@item tile-columns
+Selects how many columns of tiles to encode with.
+
+@item rav1e-params
+Set rav1e options using a list of @var{key}=@var{value} pairs separated
+by ":". See @command{rav1e --help} for a list of options.
+
+For example to specify librav1e encoding options with @option{-rav1e-params}:
+
+@example
+ffmpeg -i input -c:v librav1e -b:v 500K -rav1e-params speed=5:low_latency=true output.mp4
+@end example
+
+@end table
+
+@section libaom-av1
+
+libaom AV1 encoder wrapper.
+
+Requires the presence of the libaom headers and library during
+configuration.  You need to explicitly configure the build with
+@code{--enable-libaom}.
+
+@subsection Options
+
+The wrapper supports the following standard libavcodec options:
+
+@table @option
+
+@item b
+Set bitrate target in bits/second.  By default this will use
+variable-bitrate mode.  If @option{maxrate} and @option{minrate} are
+also set to the same value then it will use constant-bitrate mode,
+otherwise if @option{crf} is set as well then it will use
+constrained-quality mode.
+
+@item g keyint_min
+Set key frame placement.  The GOP size sets the maximum distance between
+key frames; if zero the output stream will be intra-only.  The minimum
+distance is ignored unless it is the same as the GOP size, in which case
+key frames will always appear at a fixed interval.  Not set by default,
+so without this option the library has completely free choice about
+where to place key frames.
+
+@item qmin qmax
+Set minimum/maximum quantisation values.  Valid range is from 0 to 63
+(warning: this does not match the quantiser values actually used by AV1
+- divide by four to map real quantiser values to this range).  Defaults
+to min/max (no constraint).
+
+@item minrate maxrate bufsize rc_init_occupancy
+Set rate control buffering parameters.  Not used if not set - defaults
+to unconstrained variable bitrate.
+
+@item threads
+Set the number of threads to use while encoding.  This may require the
+@option{tiles} or @option{row-mt} options to also be set to actually
+use the specified number of threads fully. Defaults to the number of
+hardware threads supported by the host machine.
+
+@item profile
+Set the encoding profile.  Defaults to using the profile which matches
+the bit depth and chroma subsampling of the input.
+
+@end table
+
+The wrapper also has some specific options:
+
+@table @option
+
+@item cpu-used
+Set the quality/encoding speed tradeoff.  Valid range is from 0 to 8,
+higher numbers indicating greater speed and lower quality.  The default
+value is 1, which will be slow and high quality.
+
+@item auto-alt-ref
+Enable use of alternate reference frames.  Defaults to the internal
+default of the library.
+
+@item arnr-max-frames (@emph{frames})
+Set altref noise reduction max frame count. Default is -1.
+
+@item arnr-strength (@emph{strength})
+Set altref noise reduction filter strength. Range is -1 to 6. Default is -1.
+
+@item aq-mode (@emph{aq-mode})
+Set adaptive quantization mode. Possible values:
+
+@table @samp
+@item none (@emph{0})
+Disabled.
+
+@item variance (@emph{1})
+Variance-based.
+
+@item complexity (@emph{2})
+Complexity-based.
+
+@item cyclic (@emph{3})
+Cyclic refresh.
+@end table
+
+@item tune (@emph{tune})
+Set the distortion metric the encoder is tuned with. Default is @code{psnr}.
+
+@table @samp
+@item psnr (@emph{0})
+
+@item ssim (@emph{1})
+@end table
+
+@item lag-in-frames
+Set the maximum number of frames which the encoder may keep in flight
+at any one time for lookahead purposes.  Defaults to the internal
+default of the library.
+
+@item error-resilience
+Enable error resilience features:
+@table @option
+@item default
+Improve resilience against losses of whole frames.
+@end table
+Not enabled by default.
+
+@item crf
+Set the quality/size tradeoff for constant-quality (no bitrate target)
+and constrained-quality (with maximum bitrate target) modes. Valid
+range is 0 to 63, higher numbers indicating lower quality and smaller
+output size.  Only used if set; by default only the bitrate target is
+used.
+
+@item static-thresh
+Set a change threshold on blocks below which they will be skipped by
+the encoder.  Defined in arbitrary units as a nonnegative integer,
+defaulting to zero (no blocks are skipped).
+
+@item drop-threshold
+Set a threshold for dropping frames when close to rate control bounds.
+Defined as a percentage of the target buffer - when the rate control
+buffer falls below this percentage, frames will be dropped until it
+has refilled above the threshold.  Defaults to zero (no frames are
+dropped).
+
+@item denoise-noise-level (@emph{level})
+Amount of noise to be removed for grain synthesis. Grain synthesis is disabled if
+this option is not set or set to 0.
+
+@item denoise-block-size (@emph{pixels})
+Block size used for denoising for grain synthesis. If not set, AV1 codec
+uses the default value of 32.
+
+@item undershoot-pct (@emph{pct})
+Set datarate undershoot (min) percentage of the target bitrate. Range is -1 to 100.
+Default is -1.
+
+@item overshoot-pct (@emph{pct})
+Set datarate overshoot (max) percentage of the target bitrate. Range is -1 to 1000.
+Default is -1.
+
+@item minsection-pct (@emph{pct})
+Minimum percentage variation of the GOP bitrate from the target bitrate. If minsection-pct
+is not set, the libaomenc wrapper computes it as follows: @code{(minrate * 100 / bitrate)}.
+Range is -1 to 100. Default is -1 (unset).
+
+@item maxsection-pct (@emph{pct})
+Maximum percentage variation of the GOP bitrate from the target bitrate. If maxsection-pct
+is not set, the libaomenc wrapper computes it as follows: @code{(maxrate * 100 / bitrate)}.
+Range is -1 to 5000. Default is -1 (unset).
+
+@item frame-parallel (@emph{boolean})
+Enable frame parallel decodability features. Default is true.
+
+@item tiles
+Set the number of tiles to encode the input video with, as columns x
+rows.  Larger numbers allow greater parallelism in both encoding and
+decoding, but may decrease coding efficiency.  Defaults to the minimum
+number of tiles required by the size of the input video (this is 1x1
+(that is, a single tile) for sizes up to and including 4K).
+
+@item tile-columns tile-rows
+Set the number of tiles as log2 of the number of tile rows and columns.
+Provided for compatibility with libvpx/VP9.
+
+@item row-mt (Requires libaom >= 1.0.0-759-g90a15f4f2)
+Enable row based multi-threading. Disabled by default.
+
+@item enable-cdef (@emph{boolean})
+Enable Constrained Directional Enhancement Filter. The libaom-av1
+encoder enables CDEF by default.
+
+@item enable-restoration (@emph{boolean})
+Enable Loop Restoration Filter. Default is true for libaom-av1.
+
+@item enable-global-motion (@emph{boolean})
+Enable the use of global motion for block prediction. Default is true.
+
+@item enable-intrabc (@emph{boolean})
+Enable block copy mode for intra block prediction. This mode is
+useful for screen content. Default is true.
+
+@end table
+
 @section libkvazaar
 
 Kvazaar H.265/HEVC encoder.
@@ -1641,7 +1879,8 @@
 @table @option
 @item auto-alt-ref
 Enable use of alternate reference frames (2-pass only).
-@item arnr-max-frames
+Values greater than 1 enable multi-layer alternate reference frames (VP9 only).
+@item arnr-maxframes
 Set altref noise reduction max frame count.
 @item arnr-type
 Set altref noise reduction filter type: backward, forward, centered.
@@ -1654,6 +1893,61 @@
 @item error-resilient
 Enable error resiliency features.
 
+@item sharpness @var{integer}
+Increase sharpness at the expense of lower PSNR.
+The valid range is [0, 7].
+
+@item ts-parameters
+Sets the temporal scalability configuration using a :-separated list of
+key=value pairs. For example, to specify temporal scalability parameters
+with @code{ffmpeg}:
+@example
+ffmpeg -i INPUT -c:v libvpx -ts-parameters ts_number_layers=3:\
+ts_target_bitrate=250,500,1000:ts_rate_decimator=4,2,1:\
+ts_periodicity=4:ts_layer_id=0,2,1,2:ts_layering_mode=3 OUTPUT
+@end example
+Below is a brief explanation of each of the parameters, please
+refer to @code{struct vpx_codec_enc_cfg} in @code{vpx/vpx_encoder.h} for more
+details.
+@table @option
+@item ts_number_layers
+Number of temporal coding layers.
+@item ts_target_bitrate
+Target bitrate for each temporal layer (in kbps).
+(bitrate should be inclusive of the lower temporal layer).
+@item ts_rate_decimator
+Frame rate decimation factor for each temporal layer.
+@item ts_periodicity
+Length of the sequence defining frame temporal layer membership.
+@item ts_layer_id
+Template defining the membership of frames to temporal layers.
+@item ts_layering_mode
+(optional) Selecting the temporal structure from a set of pre-defined temporal layering modes.
+Currently supports the following options.
+@table @option
+@item 0
+No temporal layering flags are provided internally,
+relies on flags being passed in using @code{metadata} field in @code{AVFrame}
+with following keys.
+@table @option
+@item vp8-flags
+Sets the flags passed into the encoder to indicate the referencing scheme for
+the current frame.
+Refer to function @code{vpx_codec_encode} in @code{vpx/vpx_encoder.h} for more
+details.
+@item temporal_id
+Explicitly sets the temporal id of the current frame to encode.
+@end table
+@item 2
+Two temporal layers. 0-1...
+@item 3
+Three temporal layers. 0-2-1-2...; with single reference frame.
+@item 4
+Same as option "3", except there is a dependency between
+the two temporal layer 2 frames within the temporal period.
+@end table
+@end table
+
 @item VP9-specific options
 @table @option
 @item lossless
@@ -1692,6 +1986,8 @@
 midpoint is passed in rather than calculated for a specific clip or chunk.
 
 The valid range is [0, 10000]. 0 (default) uses standard VBR.
+@item enable-tpl @var{boolean}
+Enable temporal dependency model.
 @end table
 
 @end table
@@ -2153,6 +2449,20 @@
 @subsection Options
 
 @table @option
+@item b
+Sets target video bitrate.
+
+@item bf
+
+@item g
+Set the GOP size.
+
+@item keyint_min
+Minimum GOP size.
+
+@item refs
+Number of reference frames each P-frame can use. The range is from @var{1-16}.
+
 @item preset
 Set the x265 preset.
 
@@ -2165,6 +2475,28 @@
 @item crf
 Set the quality for constant quality mode.
 
+@item qp
+Set constant quantization rate control method parameter.
+
+@item qmin
+Minimum quantizer scale.
+
+@item qmax
+Maximum quantizer scale.
+
+@item qdiff
+Maximum difference between quantizer scales.
+
+@item qblur
+Quantizer curve blur
+
+@item qcomp
+Quantizer curve compression factor
+
+@item i_qfactor
+
+@item b_qfactor
+
 @item forced-idr
 Normally, when forcing a I-frame type, the encoder can select any type
 of I-frame. This option forces it to choose an IDR-frame.
@@ -2180,6 +2512,63 @@
 @end example
 @end table
 
+@section libxavs2
+
+xavs2 AVS2-P2/IEEE1857.4 encoder wrapper.
+
+This encoder requires the presence of the libxavs2 headers and library
+during configuration. You need to explicitly configure the build with
+@option{--enable-libxavs2}.
+
+The following standard libavcodec options are used:
+@itemize
+@item
+@option{b} / @option{bit_rate}
+@item
+@option{g} / @option{gop_size}
+@item
+@option{bf} / @option{max_b_frames}
+@end itemize
+
+The encoder also has its own specific options:
+@subsection Options
+
+@table @option
+@item lcu_row_threads
+Set the number of parallel threads for rows from 1 to 8 (default 5).
+
+@item initial_qp
+Set the xavs2 quantization parameter from 1 to 63 (default 34). This is
+used to set the initial qp for the first frame.
+
+@item qp
+Set the xavs2 quantization parameter from 1 to 63 (default 34). This is
+used to set the qp value under constant-QP mode.
+
+@item max_qp
+Set the max qp for rate control from 1 to 63 (default 55).
+
+@item min_qp
+Set the min qp for rate control from 1 to 63 (default 20).
+
+@item speed_level
+Set the Speed level from 0 to 9 (default 0). Higher is better but slower.
+
+@item log_level
+Set the log level from -1 to 3 (default 0). -1: none, 0: error,
+1: warning, 2: info, 3: debug.
+
+@item xavs2-params
+Set xavs2 options using a list of @var{key}=@var{value} couples separated
+by ":".
+
+For example to specify libxavs2 encoding options with @option{-xavs2-params}:
+
+@example
+ffmpeg -i input -c:v libxavs2 -xavs2-params RdoqLevel=0 output.avs2
+@end example
+@end table
+
 @section libxvid
 
 Xvid MPEG-4 Part 2 encoder wrapper.
@@ -2370,6 +2759,9 @@
 indicating the source of the video pictures. The default is @samp{unspecified},
 can be @samp{component}, @samp{pal}, @samp{ntsc}, @samp{secam} or @samp{mac}.
 For maximum compatibility, use @samp{component}.
+@item a53cc @var{boolean}
+Import closed captions (which must be ATSC compatible format) into output.
+Default is 1 (on).
 @end table
 
 @section png
@@ -2455,7 +2847,7 @@
 
 @section QSV encoders
 
-The family of Intel QuickSync Video encoders (MPEG-2, H.264 and HEVC)
+The family of Intel QuickSync Video encoders (MPEG-2, H.264, HEVC, JPEG/MJPEG and VP9)
 
 The ratecontrol method is selected as follows:
 
@@ -2598,18 +2990,53 @@
 @option{b_qfactor} / @option{b_quant_factor}
 @item
 @option{b_qoffset} / @option{b_quant_offset}
+@item
+@option{slices}
 @end itemize
 
 All encoders support the following options:
-@itemize
-@item
-@option{low_power}
-
+@table @option
+@item low_power
 Some drivers/platforms offer a second encoder for some codecs intended to use
 less power than the default encoder; setting this option will attempt to use
 that encoder.  Note that it may support a reduced feature set, so some other
 options may not be available in this mode.
-@end itemize
+
+@item idr_interval
+Set the number of normal intra frames between full-refresh (IDR) frames in
+open-GOP mode.  The intra frames are still IRAPs, but will not include global
+headers and may have non-decodable leading pictures.
+
+@item b_depth
+Set the B-frame reference depth.  When set to one (the default), all B-frames
+will refer only to P- or I-frames.  When set to greater values multiple layers
+of B-frames will be present, frames in each layer only referring to frames in
+higher layers.
+
+@item rc_mode
+Set the rate control mode to use.  A given driver may only support a subset of
+modes.
+
+Possible modes:
+@table @option
+@item auto
+Choose the mode automatically based on driver support and the other options.
+This is the default.
+@item CQP
+Constant-quality.
+@item CBR
+Constant-bitrate.
+@item VBR
+Variable-bitrate.
+@item ICQ
+Intelligent constant-quality.
+@item QVBR
+Quality-defined variable-bitrate.
+@item AVBR
+Average variable bitrate.
+@end table
+
+@end table
 
 Each encoder also has its own specific options:
 @table @option
@@ -2789,52 +3216,6 @@
 
 @end table
 
-@section libxavs2
-
-xavs2 AVS2-P2/IEEE1857.4 encoder wrapper.
-
-This encoder requires the presence of the libxavs2 headers and library
-during configuration. You need to explicitly configure the build with
-@option{--enable-libxavs2}.
-
-@subsection Options
-
-@table @option
-@item lcu_row_threads
-Set the number of parallel threads for rows from 1 to 8 (default 5).
-
-@item initial_qp
-Set the xavs2 quantization parameter from 1 to 63 (default 34). This is
-used to set the initial qp for the first frame.
-
-@item qp
-Set the xavs2 quantization parameter from 1 to 63 (default 34). This is
-used to set the qp value under constant-QP mode.
-
-@item max_qp
-Set the max qp for rate control from 1 to 63 (default 55).
-
-@item min_qp
-Set the min qp for rate control from 1 to 63 (default 20).
-
-@item speed_level
-Set the Speed level from 0 to 9 (default 0). Higher is better but slower.
-
-@item log_level
-Set the log level from -1 to 3 (default 0). -1: none, 0: error,
-1: warning, 2: info, 3: debug.
-
-@item xavs2-params
-Set xavs2 options using a list of @var{key}=@var{value} couples separated
-by ":".
-
-For example to specify libxavs2 encoding options with @option{-xavs2-params}:
-
-@example
-ffmpeg -i input -c:v libxavs2 -xavs2-params preset_level=5 output.avs2
-@end example
-@end table
-
 @c man end VIDEO ENCODERS
 
 @chapter Subtitles Encoders
@@ -2849,6 +3230,14 @@
 @subsection Options
 
 @table @option
+@item palette
+Specify the global palette used by the bitmaps.
+
+The format for this option is a string containing 16 24-bits hexadecimal
+numbers (without 0x prefix) separated by commas, for example @code{0d00ee,
+ee450d, 101010, eaeaea, 0ce60b, ec14ed, ebff0b, 0d617a, 7b7b7b, d1d1d1,
+7b2a0e, 0d950c, 0f007b, cf0dec, cfa80c, 7c127b}.
+
 @item even_rows_fix
 When set to 1, enable a work-around that makes the number of pixel rows
 even in all subtitles.  This fixes a problem with some players that
diff --git a/doc/examples/.gitignore b/doc/examples/.gitignore
index 75152cb..44960e1 100644
--- a/doc/examples/.gitignore
+++ b/doc/examples/.gitignore
@@ -1,4 +1,4 @@
-/avio_dir_cmd
+/avio_list_dir
 /avio_reading
 /decode_audio
 /decode_video
diff --git a/doc/examples/Makefile b/doc/examples/Makefile
index 928ff30..81bfd34 100644
--- a/doc/examples/Makefile
+++ b/doc/examples/Makefile
@@ -1,4 +1,4 @@
-EXAMPLES-$(CONFIG_AVIO_DIR_CMD_EXAMPLE)      += avio_dir_cmd
+EXAMPLES-$(CONFIG_AVIO_LIST_DIR_EXAMPLE)     += avio_list_dir
 EXAMPLES-$(CONFIG_AVIO_READING_EXAMPLE)      += avio_reading
 EXAMPLES-$(CONFIG_DECODE_AUDIO_EXAMPLE)      += decode_audio
 EXAMPLES-$(CONFIG_DECODE_VIDEO_EXAMPLE)      += decode_video
@@ -37,7 +37,7 @@
 examples: $(EXAMPLES)
 
 $(EXAMPLES:%$(PROGSSUF)$(EXESUF)=%.o): | doc/examples
-OBJDIRS += doc/examples
+OUTDIRS += doc/examples
 
 DOXY_INPUT += $(EXAMPLES:%$(PROGSSUF)$(EXESUF)=%.c)
 
diff --git a/doc/examples/Makefile.example b/doc/examples/Makefile.example
index 6428154..a232d97 100644
--- a/doc/examples/Makefile.example
+++ b/doc/examples/Makefile.example
@@ -11,7 +11,7 @@
 CFLAGS := $(shell pkg-config --cflags $(FFMPEG_LIBS)) $(CFLAGS)
 LDLIBS := $(shell pkg-config --libs $(FFMPEG_LIBS)) $(LDLIBS)
 
-EXAMPLES=       avio_dir_cmd                       \
+EXAMPLES=       avio_list_dir                      \
                 avio_reading                       \
                 decode_audio                       \
                 decode_video                       \
diff --git a/doc/examples/avio_dir_cmd.c b/doc/examples/avio_list_dir.c
similarity index 68%
rename from doc/examples/avio_dir_cmd.c
rename to doc/examples/avio_list_dir.c
index 0722bd9..3073baa 100644
--- a/doc/examples/avio_dir_cmd.c
+++ b/doc/examples/avio_list_dir.c
@@ -102,38 +102,15 @@
     return ret;
 }
 
-static int del_op(const char *url)
-{
-    int ret = avpriv_io_delete(url);
-    if (ret < 0)
-        av_log(NULL, AV_LOG_ERROR, "Cannot delete '%s': %s.\n", url, av_err2str(ret));
-    return ret;
-}
-
-static int move_op(const char *src, const char *dst)
-{
-    int ret = avpriv_io_move(src, dst);
-    if (ret < 0)
-        av_log(NULL, AV_LOG_ERROR, "Cannot move '%s' into '%s': %s.\n", src, dst, av_err2str(ret));
-    return ret;
-}
-
-
 static void usage(const char *program_name)
 {
-    fprintf(stderr, "usage: %s OPERATION entry1 [entry2]\n"
-            "API example program to show how to manipulate resources "
-            "accessed through AVIOContext.\n"
-            "OPERATIONS:\n"
-            "list      list content of the directory\n"
-            "move      rename content in directory\n"
-            "del       delete content in directory\n",
-            program_name);
+    fprintf(stderr, "usage: %s input_dir\n"
+            "API example program to show how to list files in directory "
+            "accessed through AVIOContext.\n", program_name);
 }
 
 int main(int argc, char *argv[])
 {
-    const char *op = NULL;
     int ret;
 
     av_log_set_level(AV_LOG_DEBUG);
@@ -145,32 +122,7 @@
 
     avformat_network_init();
 
-    op = argv[1];
-    if (strcmp(op, "list") == 0) {
-        if (argc < 3) {
-            av_log(NULL, AV_LOG_INFO, "Missing argument for list operation.\n");
-            ret = AVERROR(EINVAL);
-        } else {
-            ret = list_op(argv[2]);
-        }
-    } else if (strcmp(op, "del") == 0) {
-        if (argc < 3) {
-            av_log(NULL, AV_LOG_INFO, "Missing argument for del operation.\n");
-            ret = AVERROR(EINVAL);
-        } else {
-            ret = del_op(argv[2]);
-        }
-    } else if (strcmp(op, "move") == 0) {
-        if (argc < 4) {
-            av_log(NULL, AV_LOG_INFO, "Missing argument for move operation.\n");
-            ret = AVERROR(EINVAL);
-        } else {
-            ret = move_op(argv[2], argv[3]);
-        }
-    } else {
-        av_log(NULL, AV_LOG_INFO, "Invalid operation %s\n", op);
-        ret = AVERROR(EINVAL);
-    }
+    ret = list_op(argv[1]);
 
     avformat_network_deinit();
 
diff --git a/doc/examples/avio_reading.c b/doc/examples/avio_reading.c
index cbfeb17..36ee02a 100644
--- a/doc/examples/avio_reading.c
+++ b/doc/examples/avio_reading.c
@@ -117,11 +117,12 @@
 
 end:
     avformat_close_input(&fmt_ctx);
+
     /* note: the internal buffer could have changed, and be != avio_ctx_buffer */
-    if (avio_ctx) {
+    if (avio_ctx)
         av_freep(&avio_ctx->buffer);
-        av_freep(&avio_ctx);
-    }
+    avio_context_free(&avio_ctx);
+
     av_file_unmap(buffer, buffer_size);
 
     if (ret < 0) {
diff --git a/doc/examples/decode_audio.c b/doc/examples/decode_audio.c
index 19dcafd..6c2a8ed 100644
--- a/doc/examples/decode_audio.c
+++ b/doc/examples/decode_audio.c
@@ -39,6 +39,35 @@
 #define AUDIO_INBUF_SIZE 20480
 #define AUDIO_REFILL_THRESH 4096
 
+static int get_format_from_sample_fmt(const char **fmt,
+                                      enum AVSampleFormat sample_fmt)
+{
+    int i;
+    struct sample_fmt_entry {
+        enum AVSampleFormat sample_fmt; const char *fmt_be, *fmt_le;
+    } sample_fmt_entries[] = {
+        { AV_SAMPLE_FMT_U8,  "u8",    "u8"    },
+        { AV_SAMPLE_FMT_S16, "s16be", "s16le" },
+        { AV_SAMPLE_FMT_S32, "s32be", "s32le" },
+        { AV_SAMPLE_FMT_FLT, "f32be", "f32le" },
+        { AV_SAMPLE_FMT_DBL, "f64be", "f64le" },
+    };
+    *fmt = NULL;
+
+    for (i = 0; i < FF_ARRAY_ELEMS(sample_fmt_entries); i++) {
+        struct sample_fmt_entry *entry = &sample_fmt_entries[i];
+        if (sample_fmt == entry->sample_fmt) {
+            *fmt = AV_NE(entry->fmt_be, entry->fmt_le);
+            return 0;
+        }
+    }
+
+    fprintf(stderr,
+            "sample format %s is not supported as output format\n",
+            av_get_sample_fmt_name(sample_fmt));
+    return -1;
+}
+
 static void decode(AVCodecContext *dec_ctx, AVPacket *pkt, AVFrame *frame,
                    FILE *outfile)
 {
@@ -86,6 +115,9 @@
     size_t   data_size;
     AVPacket *pkt;
     AVFrame *decoded_frame = NULL;
+    enum AVSampleFormat sfmt;
+    int n_channels = 0;
+    const char *fmt;
 
     if (argc <= 2) {
         fprintf(stderr, "Usage: %s <input file> <output file>\n", argv[0]);
@@ -172,6 +204,26 @@
     pkt->size = 0;
     decode(c, pkt, decoded_frame, outfile);
 
+    /* print output pcm infomations, because there have no metadata of pcm */
+    sfmt = c->sample_fmt;
+
+    if (av_sample_fmt_is_planar(sfmt)) {
+        const char *packed = av_get_sample_fmt_name(sfmt);
+        printf("Warning: the sample format the decoder produced is planar "
+               "(%s). This example will output the first channel only.\n",
+               packed ? packed : "?");
+        sfmt = av_get_packed_sample_fmt(sfmt);
+    }
+
+    n_channels = c->channels;
+    if ((ret = get_format_from_sample_fmt(&fmt, sfmt)) < 0)
+        goto end;
+
+    printf("Play the output audio file with the command:\n"
+           "ffplay -f %s -ac %d -ar %d %s\n",
+           fmt, n_channels, c->sample_rate,
+           outfilename);
+end:
     fclose(outfile);
     fclose(f);
 
diff --git a/doc/examples/decode_video.c b/doc/examples/decode_video.c
index 5a9d43f..169188a 100644
--- a/doc/examples/decode_video.c
+++ b/doc/examples/decode_video.c
@@ -95,7 +95,8 @@
     AVPacket *pkt;
 
     if (argc <= 2) {
-        fprintf(stderr, "Usage: %s <input file> <output file>\n", argv[0]);
+        fprintf(stderr, "Usage: %s <input file> <output file>\n"
+                "And check your input file is encoded by mpeg1video please.\n", argv[0]);
         exit(0);
     }
     filename    = argv[1];
diff --git a/doc/examples/encode_video.c b/doc/examples/encode_video.c
index 6731b2a..d9ab409 100644
--- a/doc/examples/encode_video.c
+++ b/doc/examples/encode_video.c
@@ -186,7 +186,8 @@
     encode(c, NULL, pkt, f);
 
     /* add sequence end code to have a real MPEG file */
-    fwrite(endcode, 1, sizeof(endcode), f);
+    if (codec->id == AV_CODEC_ID_MPEG1VIDEO || codec->id == AV_CODEC_ID_MPEG2VIDEO)
+        fwrite(endcode, 1, sizeof(endcode), f);
     fclose(f);
 
     avcodec_free_context(&c);
diff --git a/doc/examples/metadata.c b/doc/examples/metadata.c
index e330d07..b6cfa6b 100644
--- a/doc/examples/metadata.c
+++ b/doc/examples/metadata.c
@@ -47,6 +47,11 @@
     if ((ret = avformat_open_input(&fmt_ctx, argv[1], NULL, NULL)))
         return ret;
 
+    if ((ret = avformat_find_stream_info(fmt_ctx, NULL)) < 0) {
+        av_log(NULL, AV_LOG_ERROR, "Cannot find stream information\n");
+        return ret;
+    }
+
     while ((tag = av_dict_get(fmt_ctx->metadata, "", tag, AV_DICT_IGNORE_SUFFIX)))
         printf("%s=%s\n", tag->key, tag->value);
 
diff --git a/doc/examples/muxing.c b/doc/examples/muxing.c
index 08da98e..9af9aae 100644
--- a/doc/examples/muxing.c
+++ b/doc/examples/muxing.c
@@ -285,7 +285,7 @@
 
     /* check if we want to generate more frames */
     if (av_compare_ts(ost->next_pts, ost->enc->time_base,
-                      STREAM_DURATION, (AVRational){ 1, 1 }) >= 0)
+                      STREAM_DURATION, (AVRational){ 1, 1 }) > 0)
         return NULL;
 
     for (j = 0; j <frame->nb_samples; j++) {
@@ -464,7 +464,7 @@
 
     /* check if we want to generate more frames */
     if (av_compare_ts(ost->next_pts, c->time_base,
-                      STREAM_DURATION, (AVRational){ 1, 1 }) >= 0)
+                      STREAM_DURATION, (AVRational){ 1, 1 }) > 0)
         return NULL;
 
     /* when we pass a frame to the encoder, it may keep a reference to it
diff --git a/doc/faq.texi b/doc/faq.texi
index 73624c6..8b165eb 100644
--- a/doc/faq.texi
+++ b/doc/faq.texi
@@ -76,7 +76,7 @@
 
 Also note that (some of) the gcc developers believe this is not a bug or
 not a bug they should fix:
-@url{http://gcc.gnu.org/bugzilla/show_bug.cgi?id=11203}.
+@url{https://gcc.gnu.org/bugzilla/show_bug.cgi?id=11203}.
 Then again, some of them do not know the difference between an undecidable
 problem and an NP-hard problem...
 
@@ -257,13 +257,13 @@
 @section Which are good parameters for encoding high quality MPEG-4?
 
 '-mbd rd -flags +mv4+aic -trellis 2 -cmp 2 -subcmp 2 -g 300 -pass 1/2',
-things to try: '-bf 2', '-flags qprd', '-flags mv0', '-flags skiprd'.
+things to try: '-bf 2', '-mpv_flags qp_rd', '-mpv_flags mv0', '-mpv_flags skip_rd'.
 
 @section Which are good parameters for encoding high quality MPEG-1/MPEG-2?
 
 '-mbd rd -trellis 2 -cmp 2 -subcmp 2 -g 100 -pass 1/2'
 but beware the '-g 100' might cause problems with some decoders.
-Things to try: '-bf 2', '-flags qprd', '-flags mv0', '-flags skiprd.
+Things to try: '-bf 2', '-mpv_flags qp_rd', '-mpv_flags mv0', '-mpv_flags skip_rd'.
 
 @section Interlaced video looks very bad when encoded with ffmpeg, what is wrong?
 
@@ -516,7 +516,7 @@
 or invoke ffmpeg in its own process via an operating system API.
 
 As an alternative, when you are running ffmpeg in a shell, you can redirect
-standard input to @code{/dev/null} (on Linux and Mac OS)
+standard input to @code{/dev/null} (on Linux and macOS)
 or @code{NUL} (on Windows). You can do this redirect either
 on the ffmpeg invocation, or from a shell script which calls ffmpeg.
 
@@ -526,7 +526,7 @@
 ffmpeg -nostdin -i INPUT OUTPUT
 @end example
 
-or (on Linux, Mac OS, and other UNIX-like shells):
+or (on Linux, macOS, and other UNIX-like shells):
 
 @example
 ffmpeg -i INPUT OUTPUT </dev/null
@@ -601,7 +601,7 @@
 FFmpeg is already organized in a highly modular manner and does not need to
 be rewritten in a formal object language. Further, many of the developers
 favor straight C; it works for them. For more arguments on this matter,
-read @uref{http://www.tux.org/lkml/#s15, "Programming Religion"}.
+read @uref{https://web.archive.org/web/20111004021423/http://kernel.org/pub/linux/docs/lkml/#s15, "Programming Religion"}.
 
 @section Why are the ffmpeg programs devoid of debugging symbols?
 
diff --git a/doc/fate.texi b/doc/fate.texi
index a352994..c355078 100644
--- a/doc/fate.texi
+++ b/doc/fate.texi
@@ -149,12 +149,18 @@
 
 @chapter Uploading new samples to the fate suite
 
+If you need a sample uploaded send a mail to samples-request.
+
 This is for developers who have an account on the fate suite server.
 If you upload new samples, please make sure they are as small as possible,
 space on each client, network bandwidth and so on benefit from smaller test cases.
 Also keep in mind older checkouts use existing sample files, that means in
 practice generally do not replace, remove or overwrite files as it likely would
 break older checkouts or releases.
+Also all needed samples for a commit should be uploaded, ideally 24
+hours, before the push.
+If you need an account for frequently uploading samples or you wish to help
+others by doing that send a mail to ffmpeg-devel.
 
 @example
 #First update your local samples copy:
diff --git a/doc/ffmpeg.texi b/doc/ffmpeg.texi
index 3717f22..29753f0 100644
--- a/doc/ffmpeg.texi
+++ b/doc/ffmpeg.texi
@@ -523,6 +523,9 @@
 a positive offset means that the corresponding streams are delayed by
 the time duration specified in @var{offset}.
 
+@item -itsscale @var{scale} (@emph{input,per-stream})
+Rescale input timestamps. @var{scale} should be a floating point number.
+
 @item -timestamp @var{date} (@emph{output})
 Set the recording timestamp in the container.
 
@@ -614,8 +617,13 @@
 ffmpeg -i myfile.avi -target vcd -bf 2 /tmp/vcd.mpg
 @end example
 
-@item -dn (@emph{output})
-Disable data recording. For full manual control see the @code{-map}
+@item -dn (@emph{input/output})
+As an input option, blocks all data streams of a file from being filtered or
+being automatically selected or mapped for any output. See @code{-discard}
+option to disable streams individually.
+
+As an output option, disables data recording i.e. automatic selection or
+mapping of any data stream. For full manual control see the @code{-map}
 option.
 
 @item -dframes @var{number} (@emph{output})
@@ -775,8 +783,13 @@
 stored at container level, but not the aspect ratio stored in encoded
 frames, if it exists.
 
-@item -vn (@emph{output})
-Disable video recording. For full manual control see the @code{-map}
+@item -vn (@emph{input/output})
+As an input option, blocks all video streams of a file from being filtered or
+being automatically selected or mapped for any output. See @code{-discard}
+option to disable streams individually.
+
+As an output option, disables video recording i.e. automatic selection or
+mapping of any video stream. For full manual control see the @code{-map}
 option.
 
 @item -vcodec @var{codec} (@emph{output})
@@ -866,12 +879,19 @@
 
 @item -force_key_frames[:@var{stream_specifier}] @var{time}[,@var{time}...] (@emph{output,per-stream})
 @item -force_key_frames[:@var{stream_specifier}] expr:@var{expr} (@emph{output,per-stream})
-Force key frames at the specified timestamps, more precisely at the first
-frames after each specified time.
+@item -force_key_frames[:@var{stream_specifier}] source (@emph{output,per-stream})
 
-If the argument is prefixed with @code{expr:}, the string @var{expr}
-is interpreted like an expression and is evaluated for each frame. A
-key frame is forced in case the evaluation is non-zero.
+@var{force_key_frames} can take arguments of the following form:
+
+@table @option
+
+@item @var{time}[,@var{time}...]
+If the argument consists of timestamps, ffmpeg will round the specified times to the nearest
+output timestamp as per the encoder time base and force a keyframe at the first frame having
+timestamp equal or greater than the computed timestamp. Note that if the encoder time base is too
+coarse, then the keyframes may be forced on frames with timestamps lower than the specified time.
+The default encoder time base is the inverse of the output framerate but may be set otherwise
+via @code{-enc_time_base}.
 
 If one of the times is "@code{chapters}[@var{delta}]", it is expanded into
 the time of the beginning of all chapters in the file, shifted by
@@ -885,6 +905,11 @@
 -force_key_frames 0:05:00,chapters-0.1
 @end example
 
+@item expr:@var{expr}
+If the argument is prefixed with @code{expr:}, the string @var{expr}
+is interpreted like an expression and is evaluated for each frame. A
+key frame is forced in case the evaluation is non-zero.
+
 The expression in @var{expr} can contain the following constants:
 @table @option
 @item n
@@ -912,6 +937,12 @@
 -force_key_frames expr:if(isnan(prev_forced_t),gte(t,13),gte(t,prev_forced_t+5))
 @end example
 
+@item source
+If the argument is @code{source}, ffmpeg will force a key frame if
+the current frame being encoded is marked as a key frame in its source.
+
+@end table
+
 Note that forcing too many keyframes is very harmful for the lookahead
 algorithms of certain encoders: using fixed-GOP options or similar
 would be more efficient.
@@ -998,6 +1029,20 @@
 extension.
 @end table
 
+@item vulkan
+If @var{device} is an integer, it selects the device by its index in a
+system-dependent list of devices.  If @var{device} is any other string, it
+selects the first device with a name containing that string as a substring.
+
+Examples:
+@table @emph
+@item -init_hw_device vulkan:1
+Choose the second device on the system.
+
+@item -init_hw_device vulkan:RADV
+Choose the first device with a name containing the string @emph{RADV}.
+@end table
+
 @end table
 
 @item -init_hw_device @var{type}[=@var{name}]@@@var{source}
@@ -1089,8 +1134,13 @@
 default to the number of input audio channels. For input streams
 this option only makes sense for audio grabbing devices and raw demuxers
 and is mapped to the corresponding demuxer options.
-@item -an (@emph{output})
-Disable audio recording. For full manual control see the @code{-map}
+@item -an (@emph{input/output})
+As an input option, blocks all audio streams of a file from being filtered or
+being automatically selected or mapped for any output. See @code{-discard}
+option to disable streams individually.
+
+As an output option, disables audio recording i.e. automatic selection or
+mapping of any audio stream. For full manual control see the @code{-map}
 option.
 @item -acodec @var{codec} (@emph{input/output})
 Set the audio codec. This is an alias for @code{-codec:a}.
@@ -1125,8 +1175,13 @@
 @table @option
 @item -scodec @var{codec} (@emph{input/output})
 Set the subtitle codec. This is an alias for @code{-codec:s}.
-@item -sn (@emph{output})
-Disable subtitle recording. For full manual control see the @code{-map}
+@item -sn (@emph{input/output})
+As an input option, blocks all subtitle streams of a file from being filtered or
+being automatically selected or mapped for any output. See @code{-discard}
+option to disable streams individually.
+
+As an output option, disables subtitle recording i.e. automatic selection or
+mapping of any subtitle stream. For full manual control see the @code{-map}
 option.
 @item -sbsf @var{bitstream_filter}
 Deprecated, see -bsf
@@ -1360,7 +1415,7 @@
 Show benchmarking information during the encode.
 Shows real, system and user time used in various steps (audio/video encode/decode).
 @item -timelimit @var{duration} (@emph{global})
-Exit after ffmpeg has been running for @var{duration} seconds.
+Exit after ffmpeg has been running for @var{duration} seconds in CPU user time.
 @item -dump (@emph{global})
 Dump each input packet to stderr.
 @item -hex (@emph{global})
@@ -1373,10 +1428,6 @@
 By default @command{ffmpeg} attempts to read the input(s) as fast as possible.
 This option will slow down the reading of the input(s) to the native frame rate
 of the input(s). It is useful for real-time output (e.g. live streaming).
-@item -loop_output @var{number_of_times}
-Repeatedly loop output for formats that support looping such as animated GIF
-(0 will loop the output infinitely).
-This option is deprecated, use -loop.
 @item -vsync @var{parameter}
 Video sync method.
 For compatibility reasons old values can be specified as numbers.
@@ -1496,9 +1547,13 @@
 Finish encoding when the shortest input stream ends.
 @item -dts_delta_threshold
 Timestamp discontinuity delta threshold.
-@item -muxdelay @var{seconds} (@emph{input})
+@item -dts_error_threshold @var{seconds}
+Timestamp error delta threshold. This threshold use to discard crazy/damaged
+timestamps and the default is 30 hours which is arbitrarily picked and quite
+conservative.
+@item -muxdelay @var{seconds} (@emph{output})
 Set the maximum demux-decode delay.
-@item -muxpreload @var{seconds} (@emph{input})
+@item -muxpreload @var{seconds} (@emph{output})
 Set the initial demux-decode delay.
 @item -streamid @var{output-stream-index}:@var{new-value} (@emph{output})
 Assign a new stream-id value to an output stream. This option should be
@@ -1620,8 +1675,10 @@
 rtp stream. (Requires at least one of the output formats to be rtp).
 
 @item -discard (@emph{input})
-Allows discarding specific streams or frames of streams at the demuxer.
-Not all demuxers support this.
+Allows discarding specific streams or frames from streams.
+Any input stream can be fully discarded, using value @code{all} whereas
+selective discarding of frames from a stream occurs at the demuxer
+and is not supported by all demuxers.
 
 @table @option
 @item none
diff --git a/doc/ffplay.texi b/doc/ffplay.texi
index 99e1d74..f3761bb 100644
--- a/doc/ffplay.texi
+++ b/doc/ffplay.texi
@@ -66,6 +66,8 @@
 Disable graphical display.
 @item -noborder
 Borderless window.
+@item -alwaysontop
+Window always on top. Available on: X11 with SDL >= 2.0.5, Windows SDL >= 2.0.6.
 @item -volume
 Set the startup volume. 0 means silence, 100 means no volume reduction or
 amplification. Negative values are treated as 0, values above 100 are treated
@@ -131,8 +133,9 @@
 @item -stats
 Print several playback statistics, in particular show the stream
 duration, the codec parameters, the current position in the stream and
-the audio/video synchronisation drift. It is on by default, to
-explicitly disable it you need to specify @code{-nostats}.
+the audio/video synchronisation drift. It is shown by default, unless the
+log level is lower than @code{info}. Its display can be forced by manually
+specifying this option. To disable it, you need to specify @code{-nostats}.
 
 @item -fast
 Non-spec-compliant optimizations.
@@ -195,6 +198,12 @@
 may be dropped if not read in time. Use this option to enable infinite buffers
 for all inputs, use @option{-noinfbuf} to disable it.
 
+@item -filter_threads @var{nb_threads}
+Defines how many threads are used to process a filter pipeline. Each pipeline
+will produce a thread pool with this many threads available for parallel
+processing. The default is 0 which means that the thread count will be
+determined by the number of available CPUs.
+
 @end table
 
 @section While playing
diff --git a/doc/ffprobe.texi b/doc/ffprobe.texi
index be0539f..28371ce 100644
--- a/doc/ffprobe.texi
+++ b/doc/ffprobe.texi
@@ -425,7 +425,7 @@
 different defaults.
 
 Each section is printed on a single line.
-If no option is specifid, the output has the form:
+If no option is specified, the output has the form:
 @example
 section|key1=val1| ... |keyN=valN
 @end example
@@ -591,7 +591,7 @@
 @end table
 
 For more information about the XML format, see
-@url{http://www.w3.org/XML/}.
+@url{https://www.w3.org/XML/}.
 @c man end WRITERS
 
 @chapter Timecode
diff --git a/doc/ffprobe.xsd b/doc/ffprobe.xsd
index 3e58da0..97dc67d 100644
--- a/doc/ffprobe.xsd
+++ b/doc/ffprobe.xsd
@@ -147,11 +147,25 @@
         </xsd:sequence>
     </xsd:complexType>
     <xsd:complexType name="frameSideDataType">
+        <xsd:sequence>
+            <xsd:element name="timecodes" type="ffprobe:frameSideDataTimecodeList" minOccurs="0" maxOccurs="1"/>
+        </xsd:sequence>
+
         <xsd:attribute name="side_data_type"              type="xsd:string"/>
         <xsd:attribute name="side_data_size"              type="xsd:int"   />
         <xsd:attribute name="timecode"                    type="xsd:string"/>
     </xsd:complexType>
 
+    <xsd:complexType name="frameSideDataTimecodeList">
+        <xsd:sequence>
+            <xsd:element name="timecode" type="ffprobe:frameSideDataTimecodeType" minOccurs="0" maxOccurs="unbounded"/>
+        </xsd:sequence>
+    </xsd:complexType>
+
+    <xsd:complexType name="frameSideDataTimecodeType">
+        <xsd:attribute name="value"              type="xsd:string"/>
+    </xsd:complexType>
+
     <xsd:complexType name="subtitleType">
       <xsd:attribute name="media_type"         type="xsd:string" fixed="subtitle" use="required"/>
       <xsd:attribute name="pts"                type="xsd:long" />
diff --git a/doc/fftools-common-opts.texi b/doc/fftools-common-opts.texi
index 84705c0..f339e0d 100644
--- a/doc/fftools-common-opts.texi
+++ b/doc/fftools-common-opts.texi
@@ -34,27 +34,24 @@
 @table @option
 @item @var{stream_index}
 Matches the stream with this index. E.g. @code{-threads:1 4} would set the
-thread count for the second stream to 4.
-@item @var{stream_type}[:@var{stream_index}]
+thread count for the second stream to 4. If @var{stream_index} is used as an
+additional stream specifier (see below), then it selects stream number
+@var{stream_index} from the matching streams. Stream numbering is based on the
+order of the streams as detected by libavformat except when a program ID is
+also specified. In this case it is based on the ordering of the streams in the
+program.
+@item @var{stream_type}[:@var{additional_stream_specifier}]
 @var{stream_type} is one of following: 'v' or 'V' for video, 'a' for audio, 's'
 for subtitle, 'd' for data, and 't' for attachments. 'v' matches all video
 streams, 'V' only matches video streams which are not attached pictures, video
-thumbnails or cover arts.  If @var{stream_index} is given, then it matches
-stream number @var{stream_index} of this type. Otherwise, it matches all
-streams of this type.
-@item p:@var{program_id}[:@var{stream_index}] or p:@var{program_id}[:@var{stream_type}[:@var{stream_index}]] or
-p:@var{program_id}:m:@var{key}[:@var{value}]
-In first version, if @var{stream_index} is given, then it matches the stream with number @var{stream_index}
-in the program with the id @var{program_id}. Otherwise, it matches all streams in the
-program. In the second version, @var{stream_type} is one of following: 'v' for video, 'a' for audio, 's'
-for subtitle, 'd' for data. If @var{stream_index} is also given, then it matches
-stream number @var{stream_index} of this type in the program with the id @var{program_id}.
-Otherwise, if only @var{stream_type} is given, it matches all
-streams of this type in the program with the id @var{program_id}.
-In the third version matches streams in the program with the id @var{program_id} with the metadata
-tag @var{key} having the specified value. If
-@var{value} is not given, matches streams that contain the given tag with any
-value.
+thumbnails or cover arts. If @var{additional_stream_specifier} is used, then
+it matches streams which both have this type and match the
+@var{additional_stream_specifier}. Otherwise, it matches all streams of the
+specified type.
+@item p:@var{program_id}[:@var{additional_stream_specifier}]
+Matches streams which are in the program with the id @var{program_id}. If
+@var{additional_stream_specifier} is used, then it matches streams which both
+are part of the program and match the @var{additional_stream_specifier}.
 
 @item #@var{stream_id} or i:@var{stream_id}
 Match the stream by stream id (e.g. PID in MPEG-TS container).
@@ -112,6 +109,10 @@
 @item filter=@var{filter_name}
 Print detailed information about the filter name @var{filter_name}. Use the
 @option{-filters} option to get a list of all filters.
+
+@item bsf=@var{bitstream_filter_name}
+Print detailed information about the bitstream filter name @var{bitstream_filter_name}.
+Use the @option{-bsfs} option to get a list of all bitstream filters.
 @end table
 
 @item -version
@@ -235,17 +236,15 @@
 By default the program logs to stderr. If coloring is supported by the
 terminal, colors are used to mark errors and warnings. Log coloring
 can be disabled setting the environment variable
-@env{AV_LOG_FORCE_NOCOLOR} or @env{NO_COLOR}, or can be forced setting
+@env{AV_LOG_FORCE_NOCOLOR}, or can be forced setting
 the environment variable @env{AV_LOG_FORCE_COLOR}.
-The use of the environment variable @env{NO_COLOR} is deprecated and
-will be dropped in a future FFmpeg version.
 
 @item -report
-Dump full command line and console output to a file named
+Dump full command line and log output to a file named
 @code{@var{program}-@var{YYYYMMDD}-@var{HHMMSS}.log} in the current
 directory.
 This file can be useful for bug reports.
-It also implies @code{-loglevel verbose}.
+It also implies @code{-loglevel debug}.
 
 Setting the environment variable @env{FFREPORT} to any value has the
 same effect. If the value is a ':'-separated key=value sequence, these
@@ -371,7 +370,15 @@
 @end example
 
 All codec AVOptions are per-stream, and thus a stream specifier
-should be attached to them.
+should be attached to them:
+@example
+ffmpeg -i multichannel.mxf -map 0:v:0 -map 0:a:0 -map 0:a:0 -c:a:0 ac3 -b:a:0 640k -ac:a:1 2 -c:a:1 aac -b:2 128k out.mp4
+@end example
+
+In the above example, a multichannel audio stream is mapped twice for output.
+The first instance is encoded with codec ac3 and bitrate 640k.
+The second instance is downmixed to 2 channels and encoded with codec aac. A bitrate of 128k is specified for it using
+absolute index of the output stream.
 
 Note: the @option{-nooption} syntax cannot be used for boolean
 AVOptions, use @option{-option 0}/@option{-option 1}.
diff --git a/doc/filters.texi b/doc/filters.texi
index cadf78c..80c33f5 100644
--- a/doc/filters.texi
+++ b/doc/filters.texi
@@ -312,6 +312,15 @@
 
 @c man end FILTERGRAPH DESCRIPTION
 
+@anchor{commands}
+@chapter Changing options at runtime with a command
+
+Some options can be changed during the operation of the filter using
+a command. These options are marked 'T' on the output of
+@command{ffmpeg} @option{-h filter=<name of filter>}.
+The name of the command is the name of the option and the argument is
+the new value.
+
 @anchor{framesync}
 @chapter Options for filters with several inputs (framesync)
 @c man begin OPTIONS FOR FILTERS WITH SEVERAL INPUTS
@@ -390,6 +399,10 @@
 @item level_in
 Set input gain. Default is 1. Range is between 0.015625 and 64.
 
+@item mode
+Set mode of compressor operation. Can be @code{upward} or @code{downward}.
+Default is @code{downward}.
+
 @item threshold
 If a signal of stream rises above this level it will affect the gain
 reduction.
@@ -430,8 +443,12 @@
 Range is between 0 and 1.
 @end table
 
+@subsection Commands
+
+This filter supports the all above options as @ref{commands}.
+
 @section acontrast
-Simple audio dynamic range commpression/expansion filter.
+Simple audio dynamic range compression/expansion filter.
 
 The filter accepts the following options:
 
@@ -605,8 +622,8 @@
 @item b
 Set burst fusion, in percentage of window size. Allowed range is @code{0} to
 @code{10}. Default value is @code{2}.
-If any two samples deteced as noise are spaced less than this value then any
-sample inbetween those two samples will be also detected as noise.
+If any two samples detected as noise are spaced less than this value then any
+sample between those two samples will be also detected as noise.
 
 @item m
 Set overlap method.
@@ -683,6 +700,11 @@
 Unused delays will be silently ignored. If number of given delays is
 smaller than number of channels all remaining channels will not be delayed.
 If you want to delay exact number of samples, append 'S' to number.
+If you want instead to delay in seconds, append 's' to number.
+
+@item all
+Use last set delay for all remaining channels. By default is disabled.
+This option if enabled changes how option @code{delays} is interpreted.
 @end table
 
 @subsection Examples
@@ -701,6 +723,12 @@
 @example
 adelay=0|500S|700S
 @end example
+
+@item
+Delay all channels by same number of samples:
+@example
+adelay=delays=64S:all=1
+@end example
 @end itemize
 
 @section aderivative, aintegral
@@ -751,7 +779,7 @@
 @end example
 
 @item
-If delay is very short, then it sound like a (metallic) robot playing music:
+If delay is very short, then it sounds like a (metallic) robot playing music:
 @example
 aecho=0.8:0.88:6:0.4
 @end example
@@ -957,6 +985,8 @@
 select double-exponential sigmoid
 @item losi
 select logistic sigmoid
+@item nofade
+no fade applied
 @end table
 @end table
 
@@ -1072,17 +1102,17 @@
 @table @option
 @item real
 Set frequency domain real expression for each separate channel separated
-by '|'. Default is "1".
+by '|'. Default is "re".
 If the number of input channels is greater than the number of
 expressions, the last specified expression is used for the remaining
 output channels.
 
 @item imag
 Set frequency domain imaginary expression for each separate channel
-separated by '|'. If not set, @var{real} option is used.
+separated by '|'. Default is "im".
 
 Each expression in @var{real} and @var{imag} can contain the following
-constants:
+constants and functions:
 
 @table @option
 @item sr
@@ -1102,28 +1132,23 @@
 
 @item pts
 current frame pts
+
+@item re
+current real part of frequency bin of current channel
+
+@item im
+current imaginary part of frequency bin of current channel
+
+@item real(b, ch)
+Return the value of real part of frequency bin at location (@var{bin},@var{channel})
+
+@item imag(b, ch)
+Return the value of imaginary part of frequency bin at location (@var{bin},@var{channel})
 @end table
 
 @item win_size
-Set window size.
-
-It accepts the following values:
-@table @samp
-@item w16
-@item w32
-@item w64
-@item w128
-@item w256
-@item w512
-@item w1024
-@item w2048
-@item w4096
-@item w8192
-@item w16384
-@item w32768
-@item w65536
-@end table
-Default is @code{w4096}
+Set window size. Allowed range is from 16 to 131072.
+Default is @code{4096}
 
 @item win_func
 Set window function. Default is @code{hann}.
@@ -1139,27 +1164,39 @@
 @item
 Leave almost only low frequencies in audio:
 @example
-afftfilt="1-clip((b/nb)*b,0,1)"
+afftfilt="'real=re * (1-clip((b/nb)*b,0,1))':imag='im * (1-clip((b/nb)*b,0,1))'"
+@end example
+
+@item
+Apply robotize effect:
+@example
+afftfilt="real='hypot(re,im)*sin(0)':imag='hypot(re,im)*cos(0)':win_size=512:overlap=0.75"
+@end example
+
+@item
+Apply whisper effect:
+@example
+afftfilt="real='hypot(re,im)*cos((random(0)*2-1)*2*3.14)':imag='hypot(re,im)*sin((random(1)*2-1)*2*3.14)':win_size=128:overlap=0.8"
 @end example
 @end itemize
 
 @anchor{afir}
 @section afir
 
-Apply an arbitrary Frequency Impulse Response filter.
+Apply an arbitrary Finite Impulse Response filter.
 
 This filter is designed for applying long FIR filters,
 up to 60 seconds long.
 
 It can be used as component for digital crossover filters,
 room equalization, cross talk cancellation, wavefield synthesis,
-auralization, ambiophonics and ambisonics.
+auralization, ambiophonics, ambisonics and spatialization.
 
-This filter uses second stream as FIR coefficients.
-If second stream holds single channel, it will be used
-for all input channels in first stream, otherwise
-number of channels in second stream must be same as
-number of channels in first stream.
+This filter uses the streams higher than first one as FIR coefficients.
+If the non-first stream holds a single channel, it will be used
+for all input channels in the first stream, otherwise
+the number of channels in the non-first stream must be same as
+the number of channels in the first stream.
 
 It accepts the following parameters:
 
@@ -1205,7 +1242,7 @@
 Allowed range is 0.1 to 60 seconds.
 
 @item response
-Show IR frequency reponse, magnitude and phase in additional video stream.
+Show IR frequency response, magnitude(magenta), phase(green) and group delay(yellow) in additional video stream.
 By default it is disabled.
 
 @item channel
@@ -1214,6 +1251,28 @@
 
 @item size
 Set video stream size. This option is used only when @var{response} is enabled.
+
+@item rate
+Set video stream frame rate. This option is used only when @var{response} is enabled.
+
+@item minp
+Set minimal partition size used for convolution. Default is @var{8192}.
+Allowed range is from @var{1} to @var{32768}.
+Lower values decreases latency at cost of higher CPU usage.
+
+@item maxp
+Set maximal partition size used for convolution. Default is @var{8192}.
+Allowed range is from @var{8} to @var{32768}.
+Lower values may increase CPU usage.
+
+@item nbirs
+Set number of input impulse responses streams which will be switchable at runtime.
+Allowed range is from @var{1} to @var{32}. Default is @var{1}.
+
+@item ir
+Set IR stream which will be used for convolution, starting from @var{0}, should always be
+lower than supplied value by @code{nbirs} option. Default is @var{0}.
+This option can be changed at runtime via @ref{commands}.
 @end table
 
 @subsection Examples
@@ -1235,13 +1294,13 @@
 It accepts the following parameters:
 @table @option
 
-@item sample_fmts
+@item sample_fmts, f
 A '|'-separated list of requested sample formats.
 
-@item sample_rates
+@item sample_rates, r
 A '|'-separated list of requested sample rates.
 
-@item channel_layouts
+@item channel_layouts, cl
 A '|'-separated list of requested channel layouts.
 
 See @ref{channel layout syntax,,the Channel Layout section in the ffmpeg-utils(1) manual,ffmpeg-utils}
@@ -1276,9 +1335,16 @@
 Set input level before filtering.
 Default is 1. Allowed range is from 0.015625 to 64.
 
+@item mode
+Set the mode of operation. Can be @code{upward} or @code{downward}.
+Default is @code{downward}. If set to @code{upward} mode, higher parts of signal
+will be amplified, expanding dynamic range in upward direction.
+Otherwise, in case of @code{downward} lower parts of signal will be reduced.
+
 @item range
 Set the level of gain reduction when the signal is below the threshold.
 Default is 0.06125. Allowed range is from 0 to 1.
+Setting this to 0 disables reduction and then filter behaves like expander.
 
 @item threshold
 If a signal rises above this level the gain reduction is released.
@@ -1354,7 +1420,7 @@
 
 @item r
 Set kind of processing.
-Can be @code{d} - direct or @code{s} - serial cascading. Defauls is @code{s}.
+Can be @code{d} - direct or @code{s} - serial cascading. Default is @code{s}.
 
 @item e
 Set filtering precision.
@@ -1370,8 +1436,12 @@
 16-bit integers
 @end table
 
+@item mix
+How much to use filtered signal in output. Default is 1.
+Range is between 0 and 1.
+
 @item response
-Show IR frequency reponse, magnitude and phase in additional video stream.
+Show IR frequency response, magnitude(magenta), phase(green) and group delay(yellow) in additional video stream.
 By default it is disabled.
 
 @item channel
@@ -1397,7 +1467,7 @@
 
 @itemize
 @item
-Apply 2 pole elliptic notch at arround 5000Hz for 48000 Hz sample rate:
+Apply 2 pole elliptic notch at around 5000Hz for 48000 Hz sample rate:
 @example
 aiir=k=1:z=7.957584807809675810E-1 -2.575128568908332300 3.674839853930788710 -2.57512875289799137 7.957586296317130880E-1:p=1 -2.86950072432325953 3.63022088054647218 -2.28075678147272232 6.361362326477423500E-1:f=tf:r=d
 @end example
@@ -1484,8 +1554,16 @@
 @item width, w
 Specify the band-width of a filter in width_type units.
 
+@item mix, m
+How much to use filtered signal in output. Default is 1.
+Range is between 0 and 1.
+
 @item channels, c
 Specify which channels to filter, by default all available are filtered.
+
+@item normalize, n
+Normalize biquad coefficients, by default is disabled.
+Enabling it will normalize magnitude response at DC to 0dB.
 @end table
 
 @subsection Commands
@@ -1503,6 +1581,10 @@
 @item width, w
 Change allpass width.
 Syntax for the command is : "@var{width}"
+
+@item mix, m
+Change allpass mix.
+Syntax for the command is : "@var{mix}"
 @end table
 
 @section aloop
@@ -1724,6 +1806,118 @@
 asendcmd=c='4.0 anequalizer change 0|f=200|w=50|g=1',anequalizer=...
 @end table
 
+@section anlmdn
+
+Reduce broadband noise in audio samples using Non-Local Means algorithm.
+
+Each sample is adjusted by looking for other samples with similar contexts. This
+context similarity is defined by comparing their surrounding patches of size
+@option{p}. Patches are searched in an area of @option{r} around the sample.
+
+The filter accepts the following options:
+
+@table @option
+@item s
+Set denoising strength. Allowed range is from 0.00001 to 10. Default value is 0.00001.
+
+@item p
+Set patch radius duration. Allowed range is from 1 to 100 milliseconds.
+Default value is 2 milliseconds.
+
+@item r
+Set research radius duration. Allowed range is from 2 to 300 milliseconds.
+Default value is 6 milliseconds.
+
+@item o
+Set the output mode.
+
+It accepts the following values:
+@table @option
+@item i
+Pass input unchanged.
+
+@item o
+Pass noise filtered out.
+
+@item n
+Pass only noise.
+
+Default value is @var{o}.
+@end table
+
+@item m
+Set smooth factor. Default value is @var{11}. Allowed range is from @var{1} to @var{15}.
+@end table
+
+@subsection Commands
+
+This filter supports the following commands:
+@table @option
+@item s
+Change denoise strength. Argument is single float number.
+Syntax for the command is : "@var{s}"
+
+@item o
+Change output mode.
+Syntax for the command is : "i", "o" or "n" string.
+@end table
+
+@section anlms
+Apply Normalized Least-Mean-Squares algorithm to the first audio stream using the second audio stream.
+
+This adaptive filter is used to mimic a desired filter by finding the filter coefficients that
+relate to producing the least mean square of the error signal (difference between the desired,
+2nd input audio stream and the actual signal, the 1st input audio stream).
+
+A description of the accepted options follows.
+
+@table @option
+@item order
+Set filter order.
+
+@item mu
+Set filter mu.
+
+@item eps
+Set the filter eps.
+
+@item leakage
+Set the filter leakage.
+
+@item out_mode
+It accepts the following values:
+@table @option
+@item i
+Pass the 1st input.
+
+@item d
+Pass the 2nd input.
+
+@item o
+Pass filtered samples.
+
+@item n
+Pass difference between desired and filtered samples.
+
+Default value is @var{o}.
+@end table
+@end table
+
+@subsection Examples
+
+@itemize
+@item
+One of many usages of this filter is noise reduction, input audio is filtered
+with same samples that are delayed by fixed amount, one such example for stereo audio is:
+@example
+asplit[a][b],[a]adelay=32S|32S[a],[b][a]anlms=order=128:leakage=0.0005:mu=.5:out_mode=o
+@end example
+@end itemize
+
+@subsection Commands
+
+This filter supports the same commands as options, excluding option @code{order}.
+
 @section anull
 
 Pass the audio source unchanged to the output.
@@ -1751,11 +1945,23 @@
 the value is longer than the input audio length, silence is added to
 the end, until the value is reached. This option is mutually exclusive
 with @option{pad_len}.
+
+@item pad_dur
+Specify the duration of samples of silence to add. See
+@ref{time duration syntax,,the Time duration section in the ffmpeg-utils(1) manual,ffmpeg-utils}
+for the accepted syntax. Used only if set to non-zero value.
+
+@item whole_dur
+Specify the minimum total duration in the output audio stream. See
+@ref{time duration syntax,,the Time duration section in the ffmpeg-utils(1) manual,ffmpeg-utils}
+for the accepted syntax. Used only if set to non-zero value. If the value is longer than
+the input audio length, silence is added to the end, until the value is reached.
+This option is mutually exclusive with @option{pad_dur}
 @end table
 
-If neither the @option{pad_len} nor the @option{whole_len} option is
-set, the filter will add silence to the end of the input stream
-indefinitely.
+If neither the @option{pad_len} nor the @option{whole_len} nor @option{pad_dur}
+nor @option{whole_dur} option is set, the filter will add silence to the end of
+the input stream indefinitely.
 
 @subsection Examples
 
@@ -1927,6 +2133,17 @@
 @end example
 @end itemize
 
+@section arnndn
+
+Reduce noise from speech using Recurrent Neural Networks.
+
+This filter accepts the following options:
+
+@table @option
+@item model, m
+Set train model file to load. This option is always required.
+@end table
+
 @section asetnsamples
 
 Set the number of samples per each output audio frame.
@@ -2013,6 +2230,72 @@
 A list of Adler-32 checksums for each data plane.
 @end table
 
+@section asoftclip
+Apply audio soft clipping.
+
+Soft clipping is a type of distortion effect where the amplitude of a signal is saturated
+along a smooth curve, rather than the abrupt shape of hard-clipping.
+
+This filter accepts the following options:
+
+@table @option
+@item type
+Set type of soft-clipping.
+
+It accepts the following values:
+@table @option
+@item tanh
+@item atan
+@item cubic
+@item exp
+@item alg
+@item quintic
+@item sin
+@end table
+
+@item param
+Set additional parameter which controls sigmoid function.
+@end table
+
+@subsection Commands
+
+This filter supports the all above options as @ref{commands}.
+
+@section asr
+Automatic Speech Recognition
+
+This filter uses PocketSphinx for speech recognition. To enable
+compilation of this filter, you need to configure FFmpeg with
+@code{--enable-pocketsphinx}.
+
+It accepts the following options:
+
+@table @option
+@item rate
+Set sampling rate of input audio. Defaults is @code{16000}.
+This need to match speech models, otherwise one will get poor results.
+
+@item hmm
+Set dictionary containing acoustic model files.
+
+@item dict
+Set pronunciation dictionary.
+
+@item lm
+Set language model file.
+
+@item lmctl
+Set language model set.
+
+@item lmname
+Set which language model to use.
+
+@item logfn
+Set output for log messages.
+@end table
+
+The filter exports recognized speech as the frame metadata @code{lavfi.asr.text}.
+
 @anchor{astats}
 @section astats
 
@@ -2046,10 +2329,15 @@
 Crest_factor
 Flat_factor
 Peak_count
+Noise_floor
+Noise_floor_count
 Bit_depth
 Dynamic_range
 Zero_crossings
 Zero_crossings_rate
+Number_of_NaNs
+Number_of_Infs
+Number_of_denormals
 
 and for Overall:
 DC_offset
@@ -2065,8 +2353,13 @@
 RMS_trough
 Flat_factor
 Peak_count
+Noise_floor
+Noise_floor_count
 Bit_depth
 Number_of_samples
+Number_of_NaNs
+Number_of_Infs
+Number_of_denormals
 
 For example full key look like this @code{lavfi.astats.1.DC_offset} or
 this @code{lavfi.astats.Overall.Peak_count}.
@@ -2076,6 +2369,17 @@
 @item reset
 Set number of frame after which stats are going to be recalculated.
 Default is disabled.
+
+@item measure_perchannel
+Select the entries which need to be measured per channel. The metadata keys can
+be used as flags, default is @option{all} which measures everything.
+@option{none} disables all per channel measurement.
+
+@item measure_overall
+Select the entries which need to be measured overall. The metadata keys can
+be used as flags, default is @option{all} which measures everything.
+@option{none} disables all overall measurement.
+
 @end table
 
 A description of each shown parameter follows:
@@ -2122,6 +2426,13 @@
 Number of occasions (not the number of samples) that the signal attained either
 @var{Min level} or @var{Max level}.
 
+@item Noise floor dB
+Minimum local peak measured in dBFS over a short window.
+
+@item Noise floor count
+Number of occasions (not the number of samples) that the signal attained
+@var{Noise floor}.
+
 @item Bit depth
 Overall bit depth of audio. Number of bits used for each sample.
 
@@ -2170,6 +2481,15 @@
 @end example
 @end itemize
 
+@subsection Commands
+
+This filter supports the following commands:
+@table @option
+@item tempo
+Change filter tempo scale factor.
+Syntax for the command is : "@var{tempo}"
+@end table
+
 @section atrim
 
 Trim the input so that the output contains one continuous subpart of the input.
@@ -2239,6 +2559,39 @@
 
 @end itemize
 
+@section axcorrelate
+Calculate normalized cross-correlation between two input audio streams.
+
+Resulted samples are always between -1 and 1 inclusive.
+If result is 1 it means two input samples are highly correlated in that selected segment.
+Result 0 means they are not correlated at all.
+If result is -1 it means two input samples are out of phase, which means they cancel each
+other.
+
+The filter accepts the following options:
+
+@table @option
+@item size
+Set size of segment over which cross-correlation is calculated.
+Default is 256. Allowed range is from 2 to 131072.
+
+@item algo
+Set algorithm for cross-correlation. Can be @code{slow} or @code{fast}.
+Default is @code{slow}. Fast algorithm assumes mean values over any given segment
+are always zero and thus need much less calculations to make.
+This is generally not true, but is valid for typical audio streams.
+@end table
+
+@subsection Examples
+
+@itemize
+@item
+Calculate correlation between channels in stereo audio stream:
+@example
+ffmpeg -i stereo.wav -af channelsplit,axcorrelate=size=1024:algo=fast correlation.wav
+@end example
+@end itemize
+
 @section bandpass
 
 Apply a two-pole Butterworth band-pass filter with central
@@ -2274,8 +2627,16 @@
 @item width, w
 Specify the band-width of a filter in width_type units.
 
+@item mix, m
+How much to use filtered signal in output. Default is 1.
+Range is between 0 and 1.
+
 @item channels, c
 Specify which channels to filter, by default all available are filtered.
+
+@item normalize, n
+Normalize biquad coefficients, by default is disabled.
+Enabling it will normalize magnitude response at DC to 0dB.
 @end table
 
 @subsection Commands
@@ -2293,6 +2654,10 @@
 @item width, w
 Change bandpass width.
 Syntax for the command is : "@var{width}"
+
+@item mix, m
+Change bandpass mix.
+Syntax for the command is : "@var{mix}"
 @end table
 
 @section bandreject
@@ -2325,8 +2690,16 @@
 @item width, w
 Specify the band-width of a filter in width_type units.
 
+@item mix, m
+How much to use filtered signal in output. Default is 1.
+Range is between 0 and 1.
+
 @item channels, c
 Specify which channels to filter, by default all available are filtered.
+
+@item normalize, n
+Normalize biquad coefficients, by default is disabled.
+Enabling it will normalize magnitude response at DC to 0dB.
 @end table
 
 @subsection Commands
@@ -2344,6 +2717,10 @@
 @item width, w
 Change bandreject width.
 Syntax for the command is : "@var{width}"
+
+@item mix, m
+Change bandreject mix.
+Syntax for the command is : "@var{mix}"
 @end table
 
 @section bass, lowshelf
@@ -2383,8 +2760,16 @@
 @item width, w
 Determine how steep is the filter's shelf transition.
 
+@item mix, m
+How much to use filtered signal in output. Default is 1.
+Range is between 0 and 1.
+
 @item channels, c
 Specify which channels to filter, by default all available are filtered.
+
+@item normalize, n
+Normalize biquad coefficients, by default is disabled.
+Enabling it will normalize magnitude response at DC to 0dB.
 @end table
 
 @subsection Commands
@@ -2406,6 +2791,10 @@
 @item gain, g
 Change bass gain.
 Syntax for the command is : "@var{gain}"
+
+@item mix, m
+Change bass mix.
+Syntax for the command is : "@var{mix}"
 @end table
 
 @section biquad
@@ -2428,6 +2817,17 @@
 @item b2
 Change biquad parameter.
 Syntax for the command is : "@var{value}"
+
+@item mix, m
+How much to use filtered signal in output. Default is 1.
+Range is between 0 and 1.
+
+@item channels, c
+Specify which channels to filter, by default all available are filtered.
+
+@item normalize, n
+Normalize biquad coefficients, by default is disabled.
+Enabling it will normalize magnitude response at DC to 0dB.
 @end table
 
 @section bs2b
@@ -2756,12 +3156,12 @@
 positions of microphones or speakers.
 
 For example, you have recorded guitar with two microphones placed in
-different location. Because the front of sound wave has fixed speed in
+different locations. Because the front of sound wave has fixed speed in
 normal conditions, the phasing of microphones can vary and depends on
 their location and interposition. The best sound mix can be achieved when
-these microphones are in phase (synchronized). Note that distance of
-~30 cm between microphones makes one microphone to capture signal in
-antiphase to another microphone. That makes the final mix sounding moody.
+these microphones are in phase (synchronized). Note that a distance of
+~30 cm between microphones makes one microphone capture the signal in
+antiphase to the other microphone. That makes the final mix sound moody.
 This filter helps to solve phasing problems by adding different delays
 to each microphone track and make them synchronized.
 
@@ -2770,7 +3170,7 @@
 Remember that synchronization/delay tolerance depends on sample rate, too.
 Higher sample rates will give more tolerance.
 
-It accepts the following parameters:
+The filter accepts the following parameters:
 
 @table @option
 @item mm
@@ -2794,7 +3194,7 @@
 Default is 1.
 
 @item temp
-Set temperature degree in Celsius. This is the temperature of the environment.
+Set temperature in degrees Celsius. This is the temperature of the environment.
 Default is 20.
 @end table
 
@@ -2841,6 +3241,10 @@
 Enable clipping. By default is enabled.
 @end table
 
+@subsection Commands
+
+This filter supports the all above options as @ref{commands}.
+
 @section dcshift
 Apply a DC shift to the audio.
 
@@ -2859,6 +3263,42 @@
 used to prevent clipping.
 @end table
 
+@section deesser
+
+Apply de-essing to the audio samples.
+
+@table @option
+@item i
+Set intensity for triggering de-essing. Allowed range is from 0 to 1.
+Default is 0.
+
+@item m
+Set amount of ducking on treble part of sound. Allowed range is from 0 to 1.
+Default is 0.5.
+
+@item f
+How much of original frequency content to keep when de-essing. Allowed range is from 0 to 1.
+Default is 0.5.
+
+@item s
+Set the output mode.
+
+It accepts the following values:
+@table @option
+@item i
+Pass input unchanged.
+
+@item o
+Pass ess filtered out.
+
+@item e
+Pass only ess.
+
+Default value is @var{o}.
+@end table
+
+@end table
+
 @section drmeter
 Measure audio dynamic range.
 
@@ -2890,7 +3330,7 @@
 of the dynamic range *within* each section of the audio file.
 
 @table @option
-@item f
+@item framelen, f
 Set the frame length in milliseconds. In range from 10 to 8000 milliseconds.
 Default is 500 milliseconds.
 The Dynamic Audio Normalizer processes the input audio in small chunks,
@@ -2905,7 +3345,7 @@
 Note that the exact frame length, in number of samples, will be determined
 automatically, based on the sampling rate of the individual input audio file.
 
-@item g
+@item gausssize, g
 Set the Gaussian filter window size. In range from 3 to 301, must be odd
 number. Default is 31.
 Probably the most important parameter of the Dynamic Audio Normalizer is the
@@ -2922,7 +3362,7 @@
 contrary, the more you decrease this value, the more the Dynamic Audio
 Normalizer will behave like a dynamic range compressor.
 
-@item p
+@item peak, p
 Set the target peak value. This specifies the highest permissible magnitude
 level for the normalized audio input. This filter will try to approach the
 target peak magnitude as closely as possible, but at the same time it also
@@ -2931,7 +3371,7 @@
 magnitude. The default value is 0.95 and thus leaves a headroom of 5%*.
 It is not recommended to go above this value.
 
-@item m
+@item maxgain, m
 Set the maximum gain factor. In range from 1.0 to 100.0. Default is 10.0.
 The Dynamic Audio Normalizer determines the maximum possible (local) gain
 factor for each input frame, i.e. the maximum gain factor that does not
@@ -2949,7 +3389,7 @@
 gain factors will smoothly approach the threshold value, but never exceed that
 value.
 
-@item r
+@item targetrms, r
 Set the target RMS. In range from 0.0 to 1.0. Default is 0.0 - disabled.
 By default, the Dynamic Audio Normalizer performs "peak" normalization.
 This means that the maximum local gain factor for each frame is defined
@@ -2967,7 +3407,7 @@
 Note, however, that the maximum local gain factor is still restricted by the
 frame's highest magnitude sample, in order to prevent clipping.
 
-@item n
+@item coupling, n
 Enable channels coupling. By default is enabled.
 By default, the Dynamic Audio Normalizer will amplify all channels by the same
 amount. This means the same gain factor will be applied to all channels, i.e.
@@ -2979,7 +3419,7 @@
 only on the individual channel's highest magnitude sample. This allows for
 harmonizing the volume of the different channels.
 
-@item c
+@item correctdc, c
 Enable DC bias correction. By default is disabled.
 An audio signal (in the time domain) is a sequence of sample values.
 In the Dynamic Audio Normalizer these sample values are represented in the
@@ -2998,7 +3438,7 @@
 boundaries, the DC correction offset values will be interpolated smoothly
 between neighbouring frames.
 
-@item b
+@item altboundary, b
 Enable alternative boundary mode. By default is disabled.
 The Dynamic Audio Normalizer takes into account a certain neighbourhood
 around each frame. This includes the preceding frames as well as the
@@ -3013,7 +3453,7 @@
 of exactly 1.0 for the missing frames, resulting in a smooth "fade in" and
 "fade out" at the beginning and at the end of the input, respectively.
 
-@item s
+@item compress, s
 Set the compress factor. In range from 0.0 to 30.0. Default is 0.0.
 By default, the Dynamic Audio Normalizer does not apply "traditional"
 compression. This means that signal peaks will not be pruned and thus the
@@ -3030,8 +3470,20 @@
 frame.
 In general, smaller parameters result in stronger compression, and vice versa.
 Values below 3.0 are not recommended, because audible distortion may appear.
+
+@item threshold, t
+Set the target threshold value. This specifies the lowest permissible
+magnitude level for the audio input which will be normalized.
+If input frame volume is above this value frame will be normalized.
+Otherwise frame may not be normalized at all. The default value is set
+to 0, which means all input frames will be normalized.
+This option is mostly useful if digital noise is not wanted to be amplified.
 @end table
 
+@subsection Commands
+
+This filter supports the all above options as @ref{commands}.
+
 @section earwax
 
 Make audio easier to listen to on headphones.
@@ -3081,8 +3533,16 @@
 Set the required gain or attenuation in dB.
 Beware of clipping when using a positive gain.
 
+@item mix, m
+How much to use filtered signal in output. Default is 1.
+Range is between 0 and 1.
+
 @item channels, c
 Specify which channels to filter, by default all available are filtered.
+
+@item normalize, n
+Normalize biquad coefficients, by default is disabled.
+Enabling it will normalize magnitude response at DC to 0dB.
 @end table
 
 @subsection Examples
@@ -3119,6 +3579,10 @@
 @item gain, g
 Change equalizer gain.
 Syntax for the command is : "@var{gain}"
+
+@item mix, m
+Change equalizer mix.
+Syntax for the command is : "@var{mix}"
 @end table
 
 @section extrastereo
@@ -3138,6 +3602,10 @@
 Enable clipping. By default is enabled.
 @end table
 
+@subsection Commands
+
+This filter supports the all above options as @ref{commands}.
+
 @section firequalizer
 Apply FIR Equalization using arbitrary frequency response.
 
@@ -3493,7 +3961,8 @@
 each amovie filter use stereo file with IR coefficients as input.
 The files give coefficients for each position of virtual loudspeaker:
 @example
-ffmpeg -i input.wav -lavfi-complex "amovie=azi_270_ele_0_DFC.wav[sr],amovie=azi_90_ele_0_DFC.wav[sl],amovie=azi_225_ele_0_DFC.wav[br],amovie=azi_135_ele_0_DFC.wav[bl],amovie=azi_0_ele_0_DFC.wav,asplit[fc][lfe],amovie=azi_35_ele_0_DFC.wav[fl],amovie=azi_325_ele_0_DFC.wav[fr],[a:0][fl][fr][fc][lfe][bl][br][sl][sr]headphone=FL|FR|FC|LFE|BL|BR|SL|SR"
+ffmpeg -i input.wav
+-filter_complex "amovie=azi_270_ele_0_DFC.wav[sr];amovie=azi_90_ele_0_DFC.wav[sl];amovie=azi_225_ele_0_DFC.wav[br];amovie=azi_135_ele_0_DFC.wav[bl];amovie=azi_0_ele_0_DFC.wav,asplit[fc][lfe];amovie=azi_35_ele_0_DFC.wav[fl];amovie=azi_325_ele_0_DFC.wav[fr];[0:a][fl][fr][fc][lfe][bl][br][sl][sr]headphone=FL|FR|FC|LFE|BL|BR|SL|SR"
 output.wav
 @end example
 
@@ -3501,7 +3970,7 @@
 Full example using wav files as coefficients with amovie filters for 7.1 downmix,
 but now in @var{multich} @var{hrir} format.
 @example
-ffmpeg -i input.wav -lavfi-complex "amovie=minp.wav[hrirs],[a:0][hrirs]headphone=map=FL|FR|FC|LFE|BL|BR|SL|SR:hrir=multich"
+ffmpeg -i input.wav -filter_complex "amovie=minp.wav[hrirs];[0:a][hrirs]headphone=map=FL|FR|FC|LFE|BL|BR|SL|SR:hrir=multich"
 output.wav
 @end example
 @end itemize
@@ -3541,8 +4010,16 @@
 Applies only to double-pole filter.
 The default is 0.707q and gives a Butterworth response.
 
+@item mix, m
+How much to use filtered signal in output. Default is 1.
+Range is between 0 and 1.
+
 @item channels, c
 Specify which channels to filter, by default all available are filtered.
+
+@item normalize, n
+Normalize biquad coefficients, by default is disabled.
+Enabling it will normalize magnitude response at DC to 0dB.
 @end table
 
 @subsection Commands
@@ -3560,6 +4037,10 @@
 @item width, w
 Change highpass width.
 Syntax for the command is : "@var{width}"
+
+@item mix, m
+Change highpass mix.
+Syntax for the command is : "@var{mix}"
 @end table
 
 @section join
@@ -3757,8 +4238,8 @@
 
 EBU R128 loudness normalization. Includes both dynamic and linear normalization modes.
 Support for both single pass (livestreams, files) and double pass (files) modes.
-This algorithm can target IL, LRA, and maximum true peak. To accurately detect true peaks,
-the audio stream will be upsampled to 192 kHz unless the normalization mode is linear.
+This algorithm can target IL, LRA, and maximum true peak. In dynamic mode, to accurately
+detect true peaks, the audio stream will be upsampled to 192 kHz.
 Use the @code{-ar} option or @code{aresample} filter to explicitly set an output sample rate.
 
 The filter accepts the following options:
@@ -3797,10 +4278,13 @@
 Range is  -99.0 - +99.0. Default is +0.0.
 
 @item linear
-Normalize linearly if possible.
-measured_I, measured_LRA, measured_TP, and measured_thresh must also
-to be specified in order to use this mode.
-Options are true or false. Default is true.
+Normalize by linearly scaling the source audio.
+@code{measured_I}, @code{measured_LRA}, @code{measured_TP},
+and @code{measured_thresh} must all be specified. Target LRA shouldn't
+be lower than source LRA and the change in integrated loudness shouldn't
+result in a true peak which exceeds the target TP. If any of these
+conditions aren't met, normalization mode will revert to @var{dynamic}.
+Options are @code{true} or @code{false}. Default is @code{true}.
 
 @item dual_mono
 Treat mono input files as "dual-mono". If a mono file is intended for playback
@@ -3849,8 +4333,16 @@
 Applies only to double-pole filter.
 The default is 0.707q and gives a Butterworth response.
 
+@item mix, m
+How much to use filtered signal in output. Default is 1.
+Range is between 0 and 1.
+
 @item channels, c
 Specify which channels to filter, by default all available are filtered.
+
+@item normalize, n
+Normalize biquad coefficients, by default is disabled.
+Enabling it will normalize magnitude response at DC to 0dB.
 @end table
 
 @subsection Examples
@@ -3877,6 +4369,10 @@
 @item width, w
 Change lowpass width.
 Syntax for the command is : "@var{width}"
+
+@item mix, m
+Change lowpass mix.
+Syntax for the command is : "@var{mix}"
 @end table
 
 @section lv2
@@ -4140,6 +4636,19 @@
 @end table
 @end table
 
+@subsection Commands
+
+This filter supports the following commands:
+@table @option
+@item tempo
+Change filter tempo scale factor.
+Syntax for the command is : "@var{tempo}"
+
+@item pitch
+Change filter pitch scale factor.
+Syntax for the command is : "@var{pitch}"
+@end table
+
 @section sidechaincompress
 
 This filter acts like normal compressor but has the ability to compress
@@ -4155,6 +4664,10 @@
 @item level_in
 Set input gain. Default is 1. Range is between 0.015625 and 64.
 
+@item mode
+Set mode of compressor operation. Can be @code{upward} or @code{downward}.
+Default is @code{downward}.
+
 @item threshold
 If a signal of second stream raises above this level it will affect the gain
 reduction of first stream.
@@ -4198,6 +4711,10 @@
 Range is between 0 and 1.
 @end table
 
+@subsection Commands
+
+This filter supports the all above options as @ref{commands}.
+
 @subsection Examples
 
 @itemize
@@ -4231,9 +4748,16 @@
 Set input level before filtering.
 Default is 1. Allowed range is from 0.015625 to 64.
 
+@item mode
+Set the mode of operation. Can be @code{upward} or @code{downward}.
+Default is @code{downward}. If set to @code{upward} mode, higher parts of signal
+will be amplified, expanding dynamic range in upward direction.
+Otherwise, in case of @code{downward} lower parts of signal will be reduced.
+
 @item range
 Set the level of gain reduction when the signal is below the threshold.
 Default is 0.06125. Allowed range is from 0 to 1.
+Setting this to 0 disables reduction and then filter behaves like expander.
 
 @item threshold
 If a signal rises above this level the gain reduction is released.
@@ -4282,7 +4806,16 @@
 or equal to a noise tolerance value for a duration greater or equal to the
 minimum detected noise duration.
 
-The printed times and duration are expressed in seconds.
+The printed times and duration are expressed in seconds. The
+@code{lavfi.silence_start} or @code{lavfi.silence_start.X} metadata key
+is set on the first frame whose timestamp equals or exceeds the detection
+duration and it contains the timestamp of the first frame of the silence.
+
+The @code{lavfi.silence_duration} or @code{lavfi.silence_duration.X}
+and @code{lavfi.silence_end} or @code{lavfi.silence_end.X} metadata
+keys are set on the first frame after the silence. If @option{mono} is
+enabled, and each channel is evaluated separately, the @code{.X}
+suffixed keys are used, and @code{X} corresponds to the channel number.
 
 The filter accepts the following options:
 
@@ -4292,7 +4825,9 @@
 specified value) or amplitude ratio. Default is -60dB, or 0.001.
 
 @item duration, d
-Set silence duration until notification (default is 2 seconds).
+Set silence duration until notification (default is 2 seconds). See
+@ref{time duration syntax,,the Time duration section in the ffmpeg-utils(1) manual,ffmpeg-utils}
+for the accepted syntax.
 
 @item mono, m
 Process each channel separately, instead of combined. By default is disabled.
@@ -4418,6 +4953,14 @@
 @example
 silenceremove=stop_periods=-1:stop_duration=1:stop_threshold=-90dB
 @end example
+
+@item
+Trim all digital silence samples, using peak detection, from beginning to end
+where there is more than 0 samples of digital silence in audio and digital
+silence is detected in all channels at same positions in stream:
+@example
+silenceremove=window=0:detection=peak:stop_mode=all:start_mode=all:stop_periods=-1:stop_threshold=0
+@end example
 @end itemize
 
 @section sofalizer
@@ -4469,6 +5012,28 @@
 
 @item lfegain
 Set custom gain for LFE channels. Value is in dB. Default is 0.
+
+@item framesize
+Set custom frame size in number of samples. Default is 1024.
+Allowed range is from 1024 to 96000. Only used if option @samp{type}
+is set to @var{freq}.
+
+@item normalize
+Should all IRs be normalized upon importing SOFA file.
+By default is enabled.
+
+@item interpolate
+Should nearest IRs be interpolated with neighbor IRs if exact position
+does not match. By default is disabled.
+
+@item minphase
+Minphase all IRs upon loading of SOFA file. By default is disabled.
+
+@item anglestep
+Set neighbor search angle step. Only used if option @var{interpolate} is enabled.
+
+@item radstep
+Set neighbor search radius step. Only used if option @var{interpolate} is enabled.
 @end table
 
 @subsection Examples
@@ -4657,6 +5222,10 @@
 Set level of input signal of original channel. Default is 0.8.
 @end table
 
+@subsection Commands
+
+This filter supports the all above options except @code{delay} as @ref{commands}.
+
 @section superequalizer
 Apply 18 band equalizer.
 
@@ -4735,17 +5304,116 @@
 @item lfe_high
 Set LFE high cut off frequency. By default, this is @var{256} Hz.
 
+@item lfe_mode
+Set LFE mode, can be @var{add} or @var{sub}. Default is @var{add}.
+In @var{add} mode, LFE channel is created from input audio and added to output.
+In @var{sub} mode, LFE channel is created from input audio and added to output but
+also all non-LFE output channels are subtracted with output LFE channel.
+
+@item angle
+Set angle of stereo surround transform, Allowed range is from @var{0} to @var{360}.
+Default is @var{90}.
+
 @item fc_in
 Set front center input volume. By default, this is @var{1}.
 
 @item fc_out
 Set front center output volume. By default, this is @var{1}.
 
+@item fl_in
+Set front left input volume. By default, this is @var{1}.
+
+@item fl_out
+Set front left output volume. By default, this is @var{1}.
+
+@item fr_in
+Set front right input volume. By default, this is @var{1}.
+
+@item fr_out
+Set front right output volume. By default, this is @var{1}.
+
+@item sl_in
+Set side left input volume. By default, this is @var{1}.
+
+@item sl_out
+Set side left output volume. By default, this is @var{1}.
+
+@item sr_in
+Set side right input volume. By default, this is @var{1}.
+
+@item sr_out
+Set side right output volume. By default, this is @var{1}.
+
+@item bl_in
+Set back left input volume. By default, this is @var{1}.
+
+@item bl_out
+Set back left output volume. By default, this is @var{1}.
+
+@item br_in
+Set back right input volume. By default, this is @var{1}.
+
+@item br_out
+Set back right output volume. By default, this is @var{1}.
+
+@item bc_in
+Set back center input volume. By default, this is @var{1}.
+
+@item bc_out
+Set back center output volume. By default, this is @var{1}.
+
 @item lfe_in
 Set LFE input volume. By default, this is @var{1}.
 
 @item lfe_out
 Set LFE output volume. By default, this is @var{1}.
+
+@item allx
+Set spread usage of stereo image across X axis for all channels.
+
+@item ally
+Set spread usage of stereo image across Y axis for all channels.
+
+@item fcx, flx, frx, blx, brx, slx, srx, bcx
+Set spread usage of stereo image across X axis for each channel.
+
+@item fcy, fly, fry, bly, bry, sly, sry, bcy
+Set spread usage of stereo image across Y axis for each channel.
+
+@item win_size
+Set window size. Allowed range is from @var{1024} to @var{65536}. Default size is @var{4096}.
+
+@item win_func
+Set window function.
+
+It accepts the following values:
+@table @samp
+@item rect
+@item bartlett
+@item hann, hanning
+@item hamming
+@item blackman
+@item welch
+@item flattop
+@item bharris
+@item bnuttall
+@item bhann
+@item sine
+@item nuttall
+@item lanczos
+@item gauss
+@item tukey
+@item dolph
+@item cauchy
+@item parzen
+@item poisson
+@item bohman
+@end table
+Default is @code{hann}.
+
+@item overlap
+Set window overlap. If set to 1, the recommended overlap for selected
+window function will be picked. Default is @code{0.5}.
 @end table
 
 @section treble, highshelf
@@ -4785,8 +5453,16 @@
 @item width, w
 Determine how steep is the filter's shelf transition.
 
+@item mix, m
+How much to use filtered signal in output. Default is 1.
+Range is between 0 and 1.
+
 @item channels, c
 Specify which channels to filter, by default all available are filtered.
+
+@item normalize, n
+Normalize biquad coefficients, by default is disabled.
+Enabling it will normalize magnitude response at DC to 0dB.
 @end table
 
 @subsection Commands
@@ -4808,6 +5484,10 @@
 @item gain, g
 Change treble gain.
 Syntax for the command is : "@var{gain}"
+
+@item mix, m
+Change treble mix.
+Syntax for the command is : "@var{mix}"
 @end table
 
 @section tremolo
@@ -4901,6 +5581,11 @@
 
 Default value for @var{replaygain_preamp} is 0.0.
 
+@item replaygain_noclip
+Prevent clipping by limiting the gain applied.
+
+Default value for @var{replaygain_noclip} is 1.
+
 @item eval
 Set when the volume expression is evaluated.
 
@@ -4960,11 +5645,6 @@
 
 If the specified expression is not valid, it is kept at its current
 value.
-@item replaygain_noclip
-Prevent clipping by limiting the gain applied.
-
-Default value for @var{replaygain_noclip} is 1.
-
 @end table
 
 @subsection Examples
@@ -5192,6 +5872,44 @@
 
 @end itemize
 
+@section afirsrc
+
+Generate a FIR coefficients using frequency sampling method.
+
+The resulting stream can be used with @ref{afir} filter for filtering the audio signal.
+
+The filter accepts the following options:
+
+@table @option
+@item taps, t
+Set number of filter coefficents in output audio stream.
+Default value is 1025.
+
+@item frequency, f
+Set frequency points from where magnitude and phase are set.
+This must be in non decreasing order, and first element must be 0, while last element
+must be 1. Elements are separated by white spaces.
+
+@item magnitude, m
+Set magnitude value for every frequency point set by @option{frequency}.
+Number of values must be same as number of frequency points.
+Values are separated by white spaces.
+
+@item phase, p
+Set phase value for every frequency point set by @option{frequency}.
+Number of values must be same as number of frequency points.
+Values are separated by white spaces.
+
+@item sample_rate, r
+Set sample rate, default is 44100.
+
+@item nb_samples, n
+Set number of samples per each frame. Default is 1024.
+
+@item win_func, w
+Set window function. Default is blackman.
+@end table
+
 @section anullsrc
 
 The null audio source, return unprocessed audio frames. It is mainly useful
@@ -5323,7 +6041,7 @@
 
 @item color, colour, c
 Specify the color of noise. Available noise colors are white, pink, brown,
-blue and violet. Default color is white.
+blue, violet and velvet. Default color is white.
 
 @item seed, s
 Specify a value used to seed the PRNG.
@@ -5370,6 +6088,49 @@
 Set window function to be used when generating FIR coefficients.
 @end table
 
+@section sinc
+
+Generate a sinc kaiser-windowed low-pass, high-pass, band-pass, or band-reject FIR coefficients.
+
+The resulting stream can be used with @ref{afir} filter for filtering the audio signal.
+
+The filter accepts the following options:
+
+@table @option
+@item sample_rate, r
+Set sample rate, default is 44100.
+
+@item nb_samples, n
+Set number of samples per each frame. Default is 1024.
+
+@item hp
+Set high-pass frequency. Default is 0.
+
+@item lp
+Set low-pass frequency. Default is 0.
+If high-pass frequency is lower than low-pass frequency and low-pass frequency
+is higher than 0 then filter will create band-pass filter coefficients,
+otherwise band-reject filter coefficients.
+
+@item phase
+Set filter phase response. Default is 50. Allowed range is from 0 to 100.
+
+@item beta
+Set Kaiser window beta.
+
+@item att
+Set stop-band attenuation. Default is 120dB, allowed range is from 40 to 180 dB.
+
+@item round
+Enable rounding, by default is disabled.
+
+@item hptaps
+Set number of taps for high-pass filter.
+
+@item lptaps
+Set number of taps for low-pass filter.
+@end table
+
 @section sine
 
 Generate an audio signal made of a sine wave with amplitude 1/8.
@@ -5478,6 +6239,79 @@
 
 Below is a description of the currently available video filters.
 
+@section addroi
+
+Mark a region of interest in a video frame.
+
+The frame data is passed through unchanged, but metadata is attached
+to the frame indicating regions of interest which can affect the
+behaviour of later encoding.  Multiple regions can be marked by
+applying the filter multiple times.
+
+@table @option
+@item x
+Region distance in pixels from the left edge of the frame.
+@item y
+Region distance in pixels from the top edge of the frame.
+@item w
+Region width in pixels.
+@item h
+Region height in pixels.
+
+The parameters @var{x}, @var{y}, @var{w} and @var{h} are expressions,
+and may contain the following variables:
+@table @option
+@item iw
+Width of the input frame.
+@item ih
+Height of the input frame.
+@end table
+
+@item qoffset
+Quantisation offset to apply within the region.
+
+This must be a real value in the range -1 to +1.  A value of zero
+indicates no quality change.  A negative value asks for better quality
+(less quantisation), while a positive value asks for worse quality
+(greater quantisation).
+
+The range is calibrated so that the extreme values indicate the
+largest possible offset - if the rest of the frame is encoded with the
+worst possible quality, an offset of -1 indicates that this region
+should be encoded with the best possible quality anyway.  Intermediate
+values are then interpolated in some codec-dependent way.
+
+For example, in 10-bit H.264 the quantisation parameter varies between
+-12 and 51.  A typical qoffset value of -1/10 therefore indicates that
+this region should be encoded with a QP around one-tenth of the full
+range better than the rest of the frame.  So, if most of the frame
+were to be encoded with a QP of around 30, this region would get a QP
+of around 24 (an offset of approximately -1/10 * (51 - -12) = -6.3).
+An extreme value of -1 would indicate that this region should be
+encoded with the best possible quality regardless of the treatment of
+the rest of the frame - that is, should be encoded at a QP of -12.
+@item clear
+If set to true, remove any existing regions of interest marked on the
+frame before adding the new one.
+@end table
+
+@subsection Examples
+
+@itemize
+@item
+Mark the centre quarter of the frame as interesting.
+@example
+addroi=iw/4:ih/4:iw/2:ih/2:-1/10
+@end example
+@item
+Mark the 100-pixel-wide region on the left edge of the frame as very
+uninteresting (to be encoded at much lower quality than the rest of
+the frame).
+@example
+addroi=0:0:100:ih:+1/5
+@end example
+@end itemize
+
 @section alphaextract
 
 Extract the alpha component from the input as a grayscale video. This
@@ -5519,10 +6353,15 @@
 Set factor to amplify difference. Default is 2. Allowed range is from 0 to 65535.
 
 @item threshold
-Set threshold for difference amplification. Any differrence greater or equal to
+Set threshold for difference amplification. Any difference greater or equal to
 this value will not alter source pixel. Default is 10.
 Allowed range is from 0 to 65535.
 
+@item tolerance
+Set tolerance for difference amplification. Any difference lower to
+this value will not alter source pixel. Default is 0.
+Allowed range is from 0 to 65535.
+
 @item low
 Set lower limit for changing source pixel. Default is 65535. Allowed range is from 0 to 65535.
 This option controls maximum possible value that will decrease source pixel value.
@@ -5535,6 +6374,18 @@
 Set which planes to filter. Default is all. Allowed range is from 0 to 15.
 @end table
 
+@subsection Commands
+
+This filter supports the following @ref{commands} that corresponds to option of same name:
+@table @option
+@item factor
+@item threshold
+@item tolerance
+@item low
+@item high
+@item planes
+@end table
+
 @section ass
 
 Same as the @ref{subtitles} filter, except that it doesn't require libavcodec
@@ -5600,8 +6451,20 @@
 
 @item p
 Set what planes of frame filter will use for averaging. Default is all.
+
+@item a
+Set what variant of algorithm filter will use for averaging. Default is @code{p} parallel.
+Alternatively can be set to @code{s} serial.
+
+Parallel can be faster then serial, while other way around is never true.
+Parallel will abort early on first change being greater then thresholds, while serial
+will continue processing other side of frames if they are equal or bellow thresholds.
 @end table
 
+@subsection Commands
+This filter supports same @ref{commands} as options except option @code{s}.
+The command accepts the same syntax of the corresponding option.
+
 @section avgblur
 
 Apply average blur filter.
@@ -5620,6 +6483,13 @@
 Default is @code{0}.
 @end table
 
+@subsection Commands
+This filter supports same commands as options.
+The command accepts the same syntax of the corresponding option.
+
+If the specified expression is not valid, it is kept at its current
+value.
+
 @section bbox
 
 Compute the bounding box for the non-black pixels in the input frame
@@ -5637,6 +6507,23 @@
 Set the minimal luminance value. Default is @code{16}.
 @end table
 
+@section bilateral
+Apply bilateral filter, spatial smoothing while preserving edges.
+
+The filter accepts the following options:
+@table @option
+@item sigmaS
+Set sigma of gaussian function to calculate spatial weight.
+Allowed range is 0 to 10. Default is 0.1.
+
+@item sigmaR
+Set sigma of gaussian function to calculate range weight.
+Allowed range is 0 to 1. Default is 0.1.
+
+@item planes
+Set planes to filter. Default is first only.
+@end table
+
 @section bitplanenoise
 
 Show and measure bit plane noise.
@@ -5656,11 +6543,20 @@
 
 Detect video intervals that are (almost) completely black. Can be
 useful to detect chapter transitions, commercials, or invalid
-recordings. Output lines contains the time for the start, end and
-duration of the detected black interval expressed in seconds.
+recordings.
 
-In order to display the output lines, you need to set the loglevel at
-least to the AV_LOG_INFO value.
+The filter outputs its detection analysis to both the log as well as
+frame metadata. If a black segment of at least the specified minimum
+duration is found, a line with the start and end timestamps as well
+as duration is printed to the log with level @code{info}. In addition,
+a log line with level @code{debug} is printed per frame showing the
+black amount detected for that frame.
+
+The filter also attaches metadata to the first frame of a black
+segment with key @code{lavfi.black_start} and to the first frame
+after the black segment ends with key @code{lavfi.black_end}. The
+value is the frame's timestamp. This metadata is added regardless
+of the minimum duration specified.
 
 The filter accepts the following options:
 
@@ -5732,7 +6628,8 @@
 
 @end table
 
-@section blend, tblend
+@anchor{blend}
+@section blend
 
 Blend two video frames into each other.
 
@@ -5904,7 +6801,7 @@
 @item sigma
 Set denoising strength. Default value is 1.
 Allowed range is from 0 to 999.9.
-The denoising algorith is very sensitive to sigma, so adjust it
+The denoising algorithm is very sensitive to sigma, so adjust it
 according to the source.
 
 @item block
@@ -6107,7 +7004,7 @@
 top field first will be assumed.
 
 @item deint
-Specify which frames to deinterlace. Accept one of the following
+Specify which frames to deinterlace. Accepts one of the following
 values:
 
 @table @option
@@ -6120,6 +7017,53 @@
 The default value is @code{all}.
 @end table
 
+@section cas
+
+Apply Contrast Adaptive Sharpen filter to video stream.
+
+The filter accepts the following options:
+
+@table @option
+@item strength
+Set the sharpening strength. Default value is 0.
+
+@item planes
+Set planes to filter. Default value is to filter all
+planes except alpha plane.
+@end table
+
+@section chromahold
+Remove all color information for all colors except for certain one.
+
+The filter accepts the following options:
+
+@table @option
+@item color
+The color which will not be replaced with neutral chroma.
+
+@item similarity
+Similarity percentage with the above color.
+0.01 matches only the exact key color, while 1.0 matches everything.
+
+@item blend
+Blend percentage.
+0.0 makes pixels either fully gray, or not gray at all.
+Higher values result in more preserved color.
+
+@item yuv
+Signals that the color passed is already in YUV instead of RGB.
+
+Literal colors like "green" or "red" don't make sense with this enabled anymore.
+This can be used to pass exact YUV values as hexadecimal numbers.
+@end table
+
+@subsection Commands
+This filter supports same @ref{commands} as options.
+The command accepts the same syntax of the corresponding option.
+
+If the specified expression is not valid, it is kept at its current
+value.
+
 @section chromakey
 YUV colorspace color/chroma keying.
 
@@ -6149,6 +7093,13 @@
 This can be used to pass exact YUV values as hexadecimal numbers.
 @end table
 
+@subsection Commands
+This filter supports same @ref{commands} as options.
+The command accepts the same syntax of the corresponding option.
+
+If the specified expression is not valid, it is kept at its current
+value.
+
 @subsection Examples
 
 @itemize
@@ -6165,6 +7116,27 @@
 @end example
 @end itemize
 
+@section chromashift
+Shift chroma pixels horizontally and/or vertically.
+
+The filter accepts the following options:
+@table @option
+@item cbh
+Set amount to shift chroma-blue horizontally.
+@item cbv
+Set amount to shift chroma-blue vertically.
+@item crh
+Set amount to shift chroma-red horizontally.
+@item crv
+Set amount to shift chroma-red vertically.
+@item edge
+Set edge mode, can be @var{smear}, default, or @var{warp}.
+@end table
+
+@subsection Commands
+
+This filter supports the all above options as @ref{commands}.
+
 @section ciescope
 
 Display CIE color diagram with pixels overlaid onto it.
@@ -6185,6 +7157,7 @@
 @item cie1931
 @item rec709, hdtv
 @item uhdtv, rec2020
+@item dcip3
 @end table
 
 @item cie
@@ -6319,6 +7292,9 @@
 Adjust red, green and blue highlights (brightest pixels).
 
 Allowed ranges for options are @code{[-1.0, 1.0]}. Defaults are @code{0}.
+
+@item pl
+Preserve lightness when changing color balance. Default is disabled.
 @end table
 
 @subsection Examples
@@ -6331,6 +7307,74 @@
 @end example
 @end itemize
 
+@subsection Commands
+
+This filter supports the all above options as @ref{commands}.
+
+@section colorchannelmixer
+
+Adjust video input frames by re-mixing color channels.
+
+This filter modifies a color channel by adding the values associated to
+the other channels of the same pixels. For example if the value to
+modify is red, the output value will be:
+@example
+@var{red}=@var{red}*@var{rr} + @var{blue}*@var{rb} + @var{green}*@var{rg} + @var{alpha}*@var{ra}
+@end example
+
+The filter accepts the following options:
+
+@table @option
+@item rr
+@item rg
+@item rb
+@item ra
+Adjust contribution of input red, green, blue and alpha channels for output red channel.
+Default is @code{1} for @var{rr}, and @code{0} for @var{rg}, @var{rb} and @var{ra}.
+
+@item gr
+@item gg
+@item gb
+@item ga
+Adjust contribution of input red, green, blue and alpha channels for output green channel.
+Default is @code{1} for @var{gg}, and @code{0} for @var{gr}, @var{gb} and @var{ga}.
+
+@item br
+@item bg
+@item bb
+@item ba
+Adjust contribution of input red, green, blue and alpha channels for output blue channel.
+Default is @code{1} for @var{bb}, and @code{0} for @var{br}, @var{bg} and @var{ba}.
+
+@item ar
+@item ag
+@item ab
+@item aa
+Adjust contribution of input red, green, blue and alpha channels for output alpha channel.
+Default is @code{1} for @var{aa}, and @code{0} for @var{ar}, @var{ag} and @var{ab}.
+
+Allowed ranges for options are @code{[-2.0, 2.0]}.
+@end table
+
+@subsection Examples
+
+@itemize
+@item
+Convert source to grayscale:
+@example
+colorchannelmixer=.3:.4:.3:0:.3:.4:.3:0:.3:.4:.3
+@end example
+@item
+Simulate sepia tones:
+@example
+colorchannelmixer=.393:.769:.189:0:.349:.686:.168:0:.272:.534:.131
+@end example
+@end itemize
+
+@subsection Commands
+
+This filter supports the all above options as @ref{commands}.
+
 @section colorkey
 RGB colorspace color keying.
 
@@ -6370,6 +7414,38 @@
 @end example
 @end itemize
 
+@subsection Commands
+This filter supports same @ref{commands} as options.
+The command accepts the same syntax of the corresponding option.
+
+If the specified expression is not valid, it is kept at its current
+value.
+
+@section colorhold
+Remove all color information for all RGB colors except for certain one.
+
+The filter accepts the following options:
+
+@table @option
+@item color
+The color which will not be replaced with neutral gray.
+
+@item similarity
+Similarity percentage with the above color.
+0.01 matches only the exact key color, while 1.0 matches everything.
+
+@item blend
+Blend percentage. 0.0 makes pixels fully gray.
+Higher values result in more preserved color.
+@end table
+
+@subsection Commands
+This filter supports same @ref{commands} as options.
+The command accepts the same syntax of the corresponding option.
+
+If the specified expression is not valid, it is kept at its current
+value.
+
 @section colorlevels
 
 Adjust video input frames using levels.
@@ -6439,65 +7515,9 @@
 @end example
 @end itemize
 
-@section colorchannelmixer
+@subsection Commands
 
-Adjust video input frames by re-mixing color channels.
-
-This filter modifies a color channel by adding the values associated to
-the other channels of the same pixels. For example if the value to
-modify is red, the output value will be:
-@example
-@var{red}=@var{red}*@var{rr} + @var{blue}*@var{rb} + @var{green}*@var{rg} + @var{alpha}*@var{ra}
-@end example
-
-The filter accepts the following options:
-
-@table @option
-@item rr
-@item rg
-@item rb
-@item ra
-Adjust contribution of input red, green, blue and alpha channels for output red channel.
-Default is @code{1} for @var{rr}, and @code{0} for @var{rg}, @var{rb} and @var{ra}.
-
-@item gr
-@item gg
-@item gb
-@item ga
-Adjust contribution of input red, green, blue and alpha channels for output green channel.
-Default is @code{1} for @var{gg}, and @code{0} for @var{gr}, @var{gb} and @var{ga}.
-
-@item br
-@item bg
-@item bb
-@item ba
-Adjust contribution of input red, green, blue and alpha channels for output blue channel.
-Default is @code{1} for @var{bb}, and @code{0} for @var{br}, @var{bg} and @var{ba}.
-
-@item ar
-@item ag
-@item ab
-@item aa
-Adjust contribution of input red, green, blue and alpha channels for output alpha channel.
-Default is @code{1} for @var{aa}, and @code{0} for @var{ar}, @var{ag} and @var{ab}.
-
-Allowed ranges for options are @code{[-2.0, 2.0]}.
-@end table
-
-@subsection Examples
-
-@itemize
-@item
-Convert source to grayscale:
-@example
-colorchannelmixer=.3:.4:.3:0:.3:.4:.3:0:.3:.4:.3
-@end example
-@item
-Simulate sepia tones:
-@example
-colorchannelmixer=.393:.769:.189:0:.349:.686:.168:0:.272:.534:.131
-@end example
-@end itemize
+This filter supports the all above options as @ref{commands}.
 
 @section colormatrix
 
@@ -7020,6 +8040,40 @@
 @end example
 @end itemize
 
+@section cover_rect
+
+Cover a rectangular object
+
+It accepts the following options:
+
+@table @option
+@item cover
+Filepath of the optional cover image, needs to be in yuv420.
+
+@item mode
+Set covering mode.
+
+It accepts the following values:
+@table @samp
+@item cover
+cover it by the supplied image
+@item blur
+cover it by interpolating the surrounding pixels
+@end table
+
+Default value is @var{blur}.
+@end table
+
+@subsection Examples
+
+@itemize
+@item
+Cover a rectangular object by the supplied image of a given video using @command{ffmpeg}:
+@example
+ffmpeg -i file.ts -vf find_rect=newref.pgm,cover_rect=cover.jpg:mode=cover new.mkv
+@end example
+@end itemize
+
 @section crop
 
 Crop the input video to given dimensions.
@@ -7440,6 +8494,9 @@
 
 @item opacity
 Set background opacity.
+
+@item format
+Set display number format. Can be @code{hex}, or @code{dec}. Default is @code{hex}.
 @end table
 
 @section dctdnoiz
@@ -7673,6 +8730,30 @@
 
 The @code{deconvolve} filter also supports the @ref{framesync} options.
 
+@section dedot
+
+Reduce cross-luminance (dot-crawl) and cross-color (rainbows) from video.
+
+It accepts the following options:
+
+@table @option
+@item m
+Set mode of operation. Can be combination of @var{dotcrawl} for cross-luminance reduction and/or
+@var{rainbows} for cross-color reduction.
+
+@item lt
+Set spatial luma threshold. Lower values increases reduction of cross-luminance.
+
+@item tl
+Set tolerance for temporal luma. Higher values increases reduction of cross-luminance.
+
+@item tc
+Set tolerance for chroma temporal variation. Higher values increases reduction of cross-color.
+
+@item ct
+Set temporal chroma threshold. Lower values increases reduction of cross-color.
+@end table
+
 @section deflate
 
 Apply deflate effect to the video.
@@ -7691,6 +8772,10 @@
 If 0, plane will remain unchanged.
 @end table
 
+@subsection Commands
+
+This filter supports the all above options as @ref{commands}.
+
 @section deflicker
 
 Remove temporal frame luminance variations.
@@ -7813,6 +8898,63 @@
 
 @end itemize
 
+@anchor{derain}
+@section derain
+
+Remove the rain in the input image/video by applying the derain methods based on
+convolutional neural networks. Supported models:
+
+@itemize
+@item
+Recurrent Squeeze-and-Excitation Context Aggregation Net (RESCAN).
+See @url{http://openaccess.thecvf.com/content_ECCV_2018/papers/Xia_Li_Recurrent_Squeeze-and-Excitation_Context_ECCV_2018_paper.pdf}.
+@end itemize
+
+Training as well as model generation scripts are provided in
+the repository at @url{https://github.com/XueweiMeng/derain_filter.git}.
+
+Native model files (.model) can be generated from TensorFlow model
+files (.pb) by using tools/python/convert.py
+
+The filter accepts the following options:
+
+@table @option
+@item filter_type
+Specify which filter to use. This option accepts the following values:
+
+@table @samp
+@item derain
+Derain filter. To conduct derain filter, you need to use a derain model.
+
+@item dehaze
+Dehaze filter. To conduct dehaze filter, you need to use a dehaze model.
+@end table
+Default value is @samp{derain}.
+
+@item dnn_backend
+Specify which DNN backend to use for model loading and execution. This option accepts
+the following values:
+
+@table @samp
+@item native
+Native implementation of DNN loading and execution.
+
+@item tensorflow
+TensorFlow backend. To enable this backend you
+need to install the TensorFlow for C library (see
+@url{https://www.tensorflow.org/install/install_c}) and configure FFmpeg with
+@code{--enable-libtensorflow}
+@end table
+Default value is @samp{native}.
+
+@item model
+Set path to model file specifying network architecture and its parameters.
+Note that different backends use different file formats. TensorFlow and native
+backend can load files for only its format.
+@end table
+
+It can also be finished with @ref{dnn_processing} filter.
+
 @section deshake
 
 Attempt to fix small changes in horizontal and/or vertical shift. This
@@ -7978,6 +9120,10 @@
     6 7 8
 @end table
 
+@subsection Commands
+
+This filter supports the all above options as @ref{commands}.
+
 @section displace
 
 Displace pixels as indicated by second and third input stream.
@@ -8033,6 +9179,76 @@
 @end example
 @end itemize
 
+@anchor{dnn_processing}
+@section dnn_processing
+
+Do image processing with deep neural networks. It works together with another filter
+which converts the pixel format of the Frame to what the dnn network requires.
+
+The filter accepts the following options:
+
+@table @option
+@item dnn_backend
+Specify which DNN backend to use for model loading and execution. This option accepts
+the following values:
+
+@table @samp
+@item native
+Native implementation of DNN loading and execution.
+
+@item tensorflow
+TensorFlow backend. To enable this backend you
+need to install the TensorFlow for C library (see
+@url{https://www.tensorflow.org/install/install_c}) and configure FFmpeg with
+@code{--enable-libtensorflow}
+@end table
+
+Default value is @samp{native}.
+
+@item model
+Set path to model file specifying network architecture and its parameters.
+Note that different backends use different file formats. TensorFlow and native
+backend can load files for only its format.
+
+Native model file (.model) can be generated from TensorFlow model file (.pb) by using tools/python/convert.py
+
+@item input
+Set the input name of the dnn network.
+
+@item output
+Set the output name of the dnn network.
+
+@end table
+
+@subsection Examples
+
+@itemize
+@item
+Remove rain in rgb24 frame with can.pb (see @ref{derain} filter):
+@example
+./ffmpeg -i rain.jpg -vf format=rgb24,dnn_processing=dnn_backend=tensorflow:model=can.pb:input=x:output=y derain.jpg
+@end example
+
+@item
+Halve the pixel value of the frame with format gray32f:
+@example
+ffmpeg -i input.jpg -vf format=grayf32,dnn_processing=model=halve_gray_float.model:input=dnn_in:output=dnn_out:dnn_backend=native -y out.native.png
+@end example
+
+@item
+Handle the Y channel with srcnn.pb (see @ref{sr} filter) for frame with yuv420p (planar YUV formats supported):
+@example
+./ffmpeg -i 480p.jpg -vf format=yuv420p,scale=w=iw*2:h=ih*2,dnn_processing=dnn_backend=tensorflow:model=srcnn.pb:input=x:output=y -y srcnn.jpg
+@end example
+
+@item
+Handle the Y channel with espcn.pb (see @ref{sr} filter), which changes frame size, for format yuv420p (planar YUV formats supported):
+@example
+./ffmpeg -i 480p.jpg -vf format=yuv420p,dnn_processing=dnn_backend=tensorflow:model=espcn.pb:input=x:output=y -y tmp.espcn.jpg
+@end example
+
+@end itemize
+
 @section drawbox
 
 Draw a colored box on the input image.
@@ -8135,6 +9351,121 @@
 @end example
 @end itemize
 
+@subsection Commands
+This filter supports same commands as options.
+The command accepts the same syntax of the corresponding option.
+
+If the specified expression is not valid, it is kept at its current
+value.
+
+@anchor{drawgraph}
+@section drawgraph
+Draw a graph using input video metadata.
+
+It accepts the following parameters:
+
+@table @option
+@item m1
+Set 1st frame metadata key from which metadata values will be used to draw a graph.
+
+@item fg1
+Set 1st foreground color expression.
+
+@item m2
+Set 2nd frame metadata key from which metadata values will be used to draw a graph.
+
+@item fg2
+Set 2nd foreground color expression.
+
+@item m3
+Set 3rd frame metadata key from which metadata values will be used to draw a graph.
+
+@item fg3
+Set 3rd foreground color expression.
+
+@item m4
+Set 4th frame metadata key from which metadata values will be used to draw a graph.
+
+@item fg4
+Set 4th foreground color expression.
+
+@item min
+Set minimal value of metadata value.
+
+@item max
+Set maximal value of metadata value.
+
+@item bg
+Set graph background color. Default is white.
+
+@item mode
+Set graph mode.
+
+Available values for mode is:
+@table @samp
+@item bar
+@item dot
+@item line
+@end table
+
+Default is @code{line}.
+
+@item slide
+Set slide mode.
+
+Available values for slide is:
+@table @samp
+@item frame
+Draw new frame when right border is reached.
+
+@item replace
+Replace old columns with new ones.
+
+@item scroll
+Scroll from right to left.
+
+@item rscroll
+Scroll from left to right.
+
+@item picture
+Draw single picture.
+@end table
+
+Default is @code{frame}.
+
+@item size
+Set size of graph video. For the syntax of this option, check the
+@ref{video size syntax,,"Video size" section in the ffmpeg-utils manual,ffmpeg-utils}.
+The default value is @code{900x256}.
+
+@item rate, r
+Set the output frame rate. Default value is @code{25}.
+
+The foreground color expressions can use the following variables:
+@table @option
+@item MIN
+Minimal value of metadata value.
+
+@item MAX
+Maximal value of metadata value.
+
+@item VAL
+Current metadata key value.
+@end table
+
+The color is defined as 0xAABBGGRR.
+@end table
+
+Example using metadata from @ref{signalstats} filter:
+@example
+signalstats,drawgraph=lavfi.signalstats.YAVG:min=0:max=255
+@end example
+
+Example using metadata from @ref{ebur128} filter:
+@example
+ebur128=metadata=1,adrawgraph=lavfi.r128.M:min=-120:max=5
+@end example
+
 @section drawgrid
 
 Draw a grid on the input image.
@@ -8220,6 +9551,13 @@
 @end example
 @end itemize
 
+@subsection Commands
+This filter supports same commands as options.
+The command accepts the same syntax of the corresponding option.
+
+If the specified expression is not valid, it is kept at its current
+value.
+
 @anchor{drawtext}
 @section drawtext
 
@@ -8477,7 +9815,21 @@
 the x and y offset coordinates where the text is drawn.
 
 These parameters allow the @var{x} and @var{y} expressions to refer
-each other, so you can for example specify @code{y=x/dar}.
+to each other, so you can for example specify @code{y=x/dar}.
+
+@item pict_type
+A one character description of the current frame's picture type.
+
+@item pkt_pos
+The current packet's position in the input file or stream
+(in bytes, from the start of the input). A value of -1 indicates
+this info is not available.
+
+@item pkt_duration
+The current packet's duration, in seconds.
+
+@item pkt_size
+The current packet's size (in bytes).
 @end table
 
 @anchor{drawtext_expansion}
@@ -8547,11 +9899,18 @@
 The second argument is optional and specifies a default value, used when the
 metadata key is not found or empty.
 
+Available metadata can be identified by inspecting entries
+starting with TAG included within each frame section
+printed by running @code{ffprobe -show_frames}.
+
+String metadata generated in filters leading to
+the drawtext filter are also available.
+
 @item n, frame_num
 The frame number, starting from 0.
 
 @item pict_type
-A 1 character description of the current picture type.
+A one character description of the current picture type.
 
 @item pts
 The timestamp of the current frame.
@@ -8575,6 +9934,29 @@
 By default, @var{YYYY-MM-DD HH:MM:SS} format will be used.
 @end table
 
+@subsection Commands
+
+This filter supports altering parameters via commands:
+@table @option
+@item reinit
+Alter existing filter parameters.
+
+Syntax for the argument is the same as for filter invocation, e.g.
+
+@example
+fontsize=56:fontcolor=green:text='Hello World'
+@end example
+
+Full filter invocation with sendcmd would look like this:
+
+@example
+sendcmd=c='56.0 drawtext reinit fontsize=56\:fontcolor=green\:text=Hello\\ World'
+@end example
+@end table
+
+If the entire argument can't be parsed or applied as valid values then the filter will
+continue with its existing parameters.
+
 @subsection Examples
 
 @itemize
@@ -8670,6 +10052,15 @@
 drawtext=fontfile=FreeSans.ttf:text=cow:fontsize=24:x=80:y=20+24-max_glyph_a
 @end example
 
+@item
+Plot special @var{lavf.image2dec.source_basename} metadata onto each frame if
+such metadata exists. Otherwise, plot the string "NA". Note that image2 demuxer
+must have option @option{-export_path_metadata 1} for the special metadata fields
+to be available for filters.
+@example
+drawtext="fontsize=20:fontcolor=white:fontfile=FreeSans.ttf:text='%@{metadata\:lavf.image2dec.source_basename\:NA@}':x=10:y=10"
+@end example
+
 @end itemize
 
 For more information about libfreetype, check:
@@ -8738,6 +10129,50 @@
 @end example
 @end itemize
 
+@section elbg
+
+Apply a posterize effect using the ELBG (Enhanced LBG) algorithm.
+
+For each input image, the filter will compute the optimal mapping from
+the input to the output given the codebook length, that is the number
+of distinct output colors.
+
+This filter accepts the following options.
+
+@table @option
+@item codebook_length, l
+Set codebook length. The value must be a positive integer, and
+represents the number of distinct output colors. Default value is 256.
+
+@item nb_steps, n
+Set the maximum number of iterations to apply for computing the optimal
+mapping. The higher the value the better the result and the higher the
+computation time. Default value is 1.
+
+@item seed, s
+Set a random seed, must be an integer included between 0 and
+UINT32_MAX. If not specified, or if explicitly set to -1, the filter
+will try to use a good random seed on a best effort basis.
+
+@item pal8
+Set pal8 output pixel format. This option does not work with codebook
+length greater than 256.
+@end table
+
+@section entropy
+
+Measure graylevel entropy in histogram of color channels of video frames.
+
+It accepts the following parameters:
+
+@table @option
+@item mode
+Can be either @var{normal} or @var{diff}. Default is @var{normal}.
+
+@var{diff} mode measures entropy of histogram delta values, absolute differences
+between neighbour histogram values.
+@end table
+
 @section eq
 Set brightness, contrast, saturation and approximate gamma adjustment.
 
@@ -8746,7 +10181,7 @@
 @table @option
 @item contrast
 Set the contrast expression. The value must be a float value in range
-@code{-2.0} to @code{2.0}. The default value is "1".
+@code{-1000.0} to @code{1000.0}. The default value is "1".
 
 @item brightness
 Set the brightness expression. The value must be a float value in
@@ -8875,6 +10310,10 @@
     6 7 8
 @end table
 
+@subsection Commands
+
+This filter supports the all above options as @ref{commands}.
+
 @section extractplanes
 
 Extract color channel components from input video stream into
@@ -8913,50 +10352,6 @@
 @end example
 @end itemize
 
-@section elbg
-
-Apply a posterize effect using the ELBG (Enhanced LBG) algorithm.
-
-For each input image, the filter will compute the optimal mapping from
-the input to the output given the codebook length, that is the number
-of distinct output colors.
-
-This filter accepts the following options.
-
-@table @option
-@item codebook_length, l
-Set codebook length. The value must be a positive integer, and
-represents the number of distinct output colors. Default value is 256.
-
-@item nb_steps, n
-Set the maximum number of iterations to apply for computing the optimal
-mapping. The higher the value the better the result and the higher the
-computation time. Default value is 1.
-
-@item seed, s
-Set a random seed, must be an integer included between 0 and
-UINT32_MAX. If not specified, or if explicitly set to -1, the filter
-will try to use a good random seed on a best effort basis.
-
-@item pal8
-Set pal8 output pixel format. This option does not work with codebook
-length greater than 256.
-@end table
-
-@section entropy
-
-Measure graylevel entropy in histogram of color channels of video frames.
-
-It accepts the following parameters:
-
-@table @option
-@item mode
-Can be either @var{normal} or @var{diff}. Default is @var{normal}.
-
-@var{diff} mode measures entropy of histogram delta values, absolute differences
-between neighbour histogram values.
-@end table
-
 @section fade
 
 Apply a fade-in/out effect to the input video.
@@ -9048,6 +10443,40 @@
 
 @end itemize
 
+@section fftdnoiz
+Denoise frames using 3D FFT (frequency domain filtering).
+
+The filter accepts the following options:
+
+@table @option
+@item sigma
+Set the noise sigma constant. This sets denoising strength.
+Default value is 1. Allowed range is from 0 to 30.
+Using very high sigma with low overlap may give blocking artifacts.
+
+@item amount
+Set amount of denoising. By default all detected noise is reduced.
+Default value is 1. Allowed range is from 0 to 1.
+
+@item block
+Set size of block, Default is 4, can be 3, 4, 5 or 6.
+Actual size of block in pixels is 2 to power of @var{block}, so by default
+block size in pixels is 2^4 which is 16.
+
+@item overlap
+Set block overlap. Default is 0.5. Allowed range is from 0.2 to 0.8.
+
+@item prev
+Set number of previous frames to use for denoising. By default is set to 0.
+
+@item next
+Set number of next frames to to use for denoising. By default is set to 0.
+
+@item planes
+Set planes which will be filtered, by default are all available filtered
+except alpha.
+@end table
+
 @section fftfilt
 Apply arbitrary expressions to samples in frequency domain
 
@@ -9132,40 +10561,6 @@
 
 @end itemize
 
-@section fftdnoiz
-Denoise frames using 3D FFT (frequency domain filtering).
-
-The filter accepts the following options:
-
-@table @option
-@item sigma
-Set the noise sigma constant. This sets denoising strength.
-Default value is 1. Allowed range is from 0 to 30.
-Using very high sigma with low overlap may give blocking artifacts.
-
-@item amount
-Set amount of denoising. By default all detected noise is reduced.
-Default value is 1. Allowed range is from 0 to 1.
-
-@item block
-Set size of block, Default is 4, can be 3, 4, 5 or 6.
-Actual size of block in pixels is 2 to power of @var{block}, so by default
-block size in pixels is 2^4 which is 16.
-
-@item overlap
-Set block overlap. Default is 0.5. Allowed range is from 0.2 to 0.8.
-
-@item prev
-Set number of previous frames to use for denoising. By default is set to 0.
-
-@item next
-Set number of next frames to to use for denoising. By default is set to 0.
-
-@item planes
-Set planes which will be filtered, by default are all available filtered
-except alpha.
-@end table
-
 @section field
 
 Extract a single field from an interlaced image using stride
@@ -9200,6 +10595,8 @@
 If optionally followed by @code{+} output frame will be marked as interlaced,
 else if followed by @code{-} output frame will be marked as progressive, else
 it will be marked same as input frame.
+If optionally followed by @code{t} output frame will use only top field, or in
+case of @code{b} it will use only bottom field.
 If line starts with @code{#} or @code{;} that line is skipped.
 
 @item mode
@@ -9634,6 +11031,13 @@
 Set color for pixels in fixed mode. Default is @var{black}.
 @end table
 
+@subsection Commands
+This filter supports same @ref{commands} as options.
+The command accepts the same syntax of the corresponding option.
+
+If the specified expression is not valid, it is kept at its current
+value.
+
 @section find_rect
 
 Find a rectangular object
@@ -9658,41 +11062,7 @@
 
 @itemize
 @item
-Generate a representative palette of a given video using @command{ffmpeg}:
-@example
-ffmpeg -i file.ts -vf find_rect=newref.pgm,cover_rect=cover.jpg:mode=cover new.mkv
-@end example
-@end itemize
-
-@section cover_rect
-
-Cover a rectangular object
-
-It accepts the following options:
-
-@table @option
-@item cover
-Filepath of the optional cover image, needs to be in yuv420.
-
-@item mode
-Set covering mode.
-
-It accepts the following values:
-@table @samp
-@item cover
-cover it by the supplied image
-@item blur
-cover it by interpolating the surrounding pixels
-@end table
-
-Default value is @var{blur}.
-@end table
-
-@subsection Examples
-
-@itemize
-@item
-Generate a representative palette of a given video using @command{ffmpeg}:
+Cover a rectangular object by the supplied image of a given video using @command{ffmpeg}:
 @example
 ffmpeg -i file.ts -vf find_rect=newref.pgm,cover_rect=cover.jpg:mode=cover new.mkv
 @end example
@@ -9940,6 +11310,54 @@
 Allowed values are positive integers higher than 0. Default value is @code{1}.
 @end table
 
+@section freezedetect
+
+Detect frozen video.
+
+This filter logs a message and sets frame metadata when it detects that the
+input video has no significant change in content during a specified duration.
+Video freeze detection calculates the mean average absolute difference of all
+the components of video frames and compares it to a noise floor.
+
+The printed times and duration are expressed in seconds. The
+@code{lavfi.freezedetect.freeze_start} metadata key is set on the first frame
+whose timestamp equals or exceeds the detection duration and it contains the
+timestamp of the first frame of the freeze. The
+@code{lavfi.freezedetect.freeze_duration} and
+@code{lavfi.freezedetect.freeze_end} metadata keys are set on the first frame
+after the freeze.
+
+The filter accepts the following options:
+
+@table @option
+@item noise, n
+Set noise tolerance. Can be specified in dB (in case "dB" is appended to the
+specified value) or as a difference ratio between 0 and 1. Default is -60dB, or
+0.001.
+
+@item duration, d
+Set freeze duration until notification (default is 2 seconds).
+@end table
+
+@section freezeframes
+
+Freeze video frames.
+
+This filter freezes video frames using frame from 2nd input.
+
+The filter accepts the following options:
+
+@table @option
+@item first
+Set number of first frame from which to start freeze.
+
+@item last
+Set number of last frame from which to end freeze.
+
+@item replace
+Set number of frame from 2nd input which will be used instead of replaced frames.
+@end table
+
 @anchor{frei0r}
 @section frei0r
 
@@ -10046,7 +11464,7 @@
 Set horizontal sigma, standard deviation of Gaussian blur. Default is @code{0.5}.
 
 @item steps
-Set number of steps for Gaussian approximation. Defauls is @code{1}.
+Set number of steps for Gaussian approximation. Default is @code{1}.
 
 @item planes
 Set which planes to filter. By default all planes are filtered.
@@ -10056,8 +11474,17 @@
 Default is @code{-1}.
 @end table
 
+@subsection Commands
+This filter supports same commands as options.
+The command accepts the same syntax of the corresponding option.
+
+If the specified expression is not valid, it is kept at its current
+value.
+
 @section geq
 
+Apply generic equation to each pixel.
+
 The filter accepts the following options:
 
 @table @option
@@ -10138,11 +11565,28 @@
 @item alpha(x, y)
 Return the value of the pixel at location (@var{x},@var{y}) of the alpha
 plane. Return 0 if there is no such plane.
+
+@item psum(x,y), lumsum(x, y), cbsum(x,y), crsum(x,y), rsum(x,y), gsum(x,y), bsum(x,y), alphasum(x,y)
+Sum of sample values in the rectangle from (0,0) to (x,y), this allows obtaining
+sums of samples within a rectangle. See the functions without the sum postfix.
+
+@item interpolation
+Set one of interpolation methods:
+@table @option
+@item nearest, n
+@item bilinear, b
+@end table
+Default is bilinear.
 @end table
 
 For functions, if @var{x} and @var{y} are outside the area, the value will be
 automatically clipped to the closer edge.
 
+Please note that this filter can use multiple threads in which case each slice
+will have its own expression state. If you want to use only a single expression
+state because your expressions depend on previous state then you should limit
+the number of filter threads to 1.
+
 @subsection Examples
 
 @itemize
@@ -10235,6 +11679,64 @@
 
 @end itemize
 
+@anchor{graphmonitor}
+@section graphmonitor
+Show various filtergraph stats.
+
+With this filter one can debug complete filtergraph.
+Especially issues with links filling with queued frames.
+
+The filter accepts the following options:
+
+@table @option
+@item size, s
+Set video output size. Default is @var{hd720}.
+
+@item opacity, o
+Set video opacity. Default is @var{0.9}. Allowed range is from @var{0} to @var{1}.
+
+@item mode, m
+Set output mode, can be @var{fulll} or @var{compact}.
+In @var{compact} mode only filters with some queued frames have displayed stats.
+
+@item flags, f
+Set flags which enable which stats are shown in video.
+
+Available values for flags are:
+@table @samp
+@item queue
+Display number of queued frames in each link.
+
+@item frame_count_in
+Display number of frames taken from filter.
+
+@item frame_count_out
+Display number of frames given out from filter.
+
+@item pts
+Display current filtered frame pts.
+
+@item time
+Display current filtered frame time.
+
+@item timebase
+Display time base for filter link.
+
+@item format
+Display used format for filter link.
+
+@item size
+Display video size or number of audio channels in case of audio used by filter link.
+
+@item rate
+Display video frame rate or sample rate in case of audio used by filter link.
+@end table
+
+@item rate, r
+Set upper limit for video rate of output stream, Default value is @var{25}.
+This guarantee that output video frame rate will not be higher than this value.
+@end table
+
 @section greyedge
 A color constancy variation filter which estimates scene illumination via grey edge algorithm
 and corrects the scene colors accordingly.
@@ -10256,7 +11758,7 @@
 @item sigma
 The standard deviation of Gaussian blur to be applied on the scene. Must be
 chosen in the range [0,1024.0] and default value = 1. floor( @var{sigma} * break_off_sigma(3) )
-can't be euqal to 0 if @var{difford} is greater than 0.
+can't be equal to 0 if @var{difford} is greater than 0.
 @end table
 
 @subsection Examples
@@ -10298,6 +11800,8 @@
 @code{haldclut} also has the same interpolation options as @ref{lut3d} (both
 filters share the same internals).
 
+This filter also supports the @ref{framesync} options.
+
 More information about the Hald CLUT can be found on Eskil Steenberg's website
 (Hald CLUT author) at @url{http://www.quelsolaar.com/technology/clut.html}.
 
@@ -10391,6 +11895,7 @@
 @code{strong}. It defaults to @code{none}.
 @end table
 
+@anchor{histogram}
 @section histogram
 
 Compute and draw a color distribution histogram for the input video.
@@ -10485,6 +11990,14 @@
 @var{luma_tmp}*@var{chroma_spatial}/@var{luma_spatial}.
 @end table
 
+@subsection Commands
+This filter supports same @ref{commands} as options.
+The command accepts the same syntax of the corresponding option.
+
+If the specified expression is not valid, it is kept at its current
+value.
+
+@anchor{hwdownload}
 @section hwdownload
 
 Download hardware frames to system memory.
@@ -10575,13 +12088,25 @@
 Do not use it without fully understanding the implications of its use.
 @end table
 
+@anchor{hwupload}
 @section hwupload
 
 Upload system memory frames to hardware surfaces.
 
 The device to upload to must be supplied when the filter is initialised.  If
 using ffmpeg, select the appropriate device with the @option{-filter_hw_device}
-option.
+option or with the @option{derive_device} option.  The input and output devices
+must be of different types and compatible - the exact meaning of this is
+system-dependent, but typically it means that they must refer to the same
+underlying hardware context (for example, refer to the same graphics card).
+
+The following additional parameters are accepted:
+
+@table @option
+@item derive_device @var{type}
+Rather than using the device supplied at initialisation, instead derive a new
+device of type @var{type} from the device the input frames exist on.
+@end table
 
 @anchor{hwupload_cuda}
 @section hwupload_cuda
@@ -10617,7 +12142,7 @@
 Note that this filter is faster than using @ref{overlay} and @ref{pad} filter
 to create same output.
 
-The filter accept the following option:
+The filter accepts the following option:
 
 @table @option
 @item inputs
@@ -10755,6 +12280,8 @@
 By default value is 0.
 @end table
 
+The @code{hysteresis} filter also supports the @ref{framesync} options.
+
 @section idet
 
 Detect video interlacing type.
@@ -10876,6 +12403,10 @@
 Swap luma/chroma/alpha fields. Exchange even & odd lines. Default value is @code{0}.
 @end table
 
+@subsection Commands
+
+This filter supports the all above options as @ref{commands}.
+
 @section inflate
 
 Apply inflate effect to the video.
@@ -10894,6 +12425,10 @@
 If 0, plane will remain unchanged.
 @end table
 
+@subsection Commands
+
+This filter supports the all above options as @ref{commands}.
+
 @section interlace
 
 Simple interlacing filter from progressive contents. This interleaves upper (or
@@ -10989,6 +12524,21 @@
 @end example
 @end itemize
 
+@section lagfun
+
+Slowly update darker pixels.
+
+This filter makes short flashes of light appear longer.
+This filter accepts the following options:
+
+@table @option
+@item decay
+Set factor for decaying. Default is .95. Allowed range is from 0 to 1.
+
+@item planes
+Set which planes to filter. Default is all. Allowed range is from 0 to 15.
+@end table
+
 @section lenscorrection
 
 Correct radial lens distortion
@@ -11104,6 +12654,15 @@
 vignetting correction process. If unknown, leave it at the default value (which
 is 1000).
 
+@item scale
+The scale factor which is applied after transformation. After correction the
+video is no longer necessarily rectangular. This parameter controls how much of
+the resulting image is visible. The value 0 means that a value will be chosen
+automatically such that there is little or no unmapped area in the output
+image. 1.0 means that no additional scaling is done. Lower values may result
+in more of the corrected image being visible, while higher values may avoid
+unmapped areas in the output.
+
 @item target_geometry
 The target geometry of the output image/video. The following values are valid
 options:
@@ -11171,7 +12730,7 @@
 @table @option
 @item model_path
 Set the model path which is to be used for SVM.
-Default value: @code{"vmaf_v0.6.1.pkl"}
+Default value: @code{"/usr/local/share/model/vmaf_v0.6.1.pkl"}
 
 @item log_path
 Set the file path to be used to store logs.
@@ -11180,36 +12739,49 @@
 Set the format of the log file (xml or json).
 
 @item enable_transform
-Enables transform for computing vmaf.
+This option can enable/disable the @code{score_transform} applied to the final predicted VMAF score,
+if you have specified score_transform option in the input parameter file passed to @code{run_vmaf_training.py}
+Default value: @code{false}
 
 @item phone_model
 Invokes the phone model which will generate VMAF scores higher than in the
 regular model, which is more suitable for laptop, TV, etc. viewing conditions.
+Default value: @code{false}
 
 @item psnr
 Enables computing psnr along with vmaf.
+Default value: @code{false}
 
 @item ssim
 Enables computing ssim along with vmaf.
+Default value: @code{false}
 
 @item ms_ssim
 Enables computing ms_ssim along with vmaf.
+Default value: @code{false}
 
 @item pool
-Set the pool method (mean, min or harmonic mean) to be used for computing vmaf.
+Set the pool method to be used for computing vmaf.
+Options are @code{min}, @code{harmonic_mean} or @code{mean} (default).
 
 @item n_threads
 Set number of threads to be used when computing vmaf.
+Default value: @code{0}, which makes use of all available logical processors.
 
 @item n_subsample
 Set interval for frame subsampling used when computing vmaf.
+Default value: @code{1}
 
 @item enable_conf_interval
 Enables confidence interval.
+Default value: @code{false}
 @end table
 
 This filter also supports the @ref{framesync} options.
 
+@subsection Examples
+@itemize
+@item
 On the below examples the input file @file{main.mpg} being processed is
 compared with the reference file @file{ref.mpg}.
 
@@ -11217,11 +12789,19 @@
 ffmpeg -i main.mpg -i ref.mpg -lavfi libvmaf -f null -
 @end example
 
+@item
 Example with options:
 @example
-ffmpeg -i main.mpg -i ref.mpg -lavfi libvmaf="psnr=1:enable-transform=1" -f null -
+ffmpeg -i main.mpg -i ref.mpg -lavfi libvmaf="psnr=1:log_fmt=json" -f null -
 @end example
 
+@item
+Example with options and different containers:
+@example
+ffmpeg -i main.mpg -i ref.mkv -lavfi "[0:v]settb=AVTB,setpts=PTS-STARTPTS[main];[1:v]settb=AVTB,setpts=PTS-STARTPTS[ref];[main][ref]libvmaf=psnr=1:log_fmt=json" -f null -
+@end example
+@end itemize
+
 @section limiter
 
 Limits the pixel components values to the specified range [min, max].
@@ -11257,6 +12837,28 @@
 Set first frame of loop. Default is 0.
 @end table
 
+@subsection Examples
+
+@itemize
+@item
+Loop single first frame infinitely:
+@example
+loop=loop=-1:size=1:start=0
+@end example
+
+@item
+Loop single first frame 10 times:
+@example
+loop=loop=10:size=1:start=0
+@end example
+
+@item
+Loop 10 first frames 5 times:
+@example
+loop=loop=5:size=10:start=0
+@end example
+@end itemize
+
 @section lut1d
 
 Apply a 1D LUT to an input video.
@@ -11271,6 +12873,8 @@
 @table @samp
 @item cube
 Iridas
+@item csp
+cineSpace
 @end table
 
 @item interp
@@ -11283,8 +12887,12 @@
 Use values from the nearest defined point.
 @item linear
 Interpolate values using the linear interpolation.
+@item cosine
+Interpolate values using the cosine interpolation.
 @item cubic
 Interpolate values using the cubic interpolation.
+@item spline
+Interpolate values using the spline interpolation.
 @end table
 @end table
 
@@ -11309,6 +12917,8 @@
 DaVinci
 @item m3d
 Pandora
+@item csp
+cineSpace
 @end table
 @item interp
 Select interpolation mode.
@@ -11325,8 +12935,6 @@
 @end table
 @end table
 
-This filter also supports the @ref{framesync} options.
-
 @section lumakey
 
 Turn certain luma values into transparency.
@@ -11340,13 +12948,20 @@
 
 @item tolerance
 Set the range of luma values to be keyed out.
-Default value is @code{0}.
+Default value is @code{0.01}.
 
 @item softness
 Set the range of softness. Default value is @code{0}.
 Use this to control gradual transition from zero to full transparency.
 @end table
 
+@subsection Commands
+This filter supports same @ref{commands} as options.
+The command accepts the same syntax of the corresponding option.
+
+If the specified expression is not valid, it is kept at its current
+value.
+
 @section lut, lutrgb, lutyuv
 
 Compute a look-up table for binding each pixel component input value
@@ -11513,8 +13128,14 @@
 set third pixel component expression
 @item c3
 set fourth pixel component expression, corresponds to the alpha component
+
+@item d
+set output bit depth, only available for @code{lut2} filter. By default is 0,
+which means bit depth is automatically picked from first input format.
 @end table
 
+The @code{lut2} filter also supports the @ref{framesync} options.
+
 Each of them specifies the expression to use for computing the lookup table for
 the corresponding pixel component values.
 
@@ -11586,6 +13207,22 @@
 By default value 0xf, all planes will be processed.
 @end table
 
+@section maskedmax
+
+Merge the second and third input stream into output stream using absolute differences
+between second input stream and first input stream and absolute difference between
+third input stream and first input stream. The picked value will be from second input
+stream if second absolute difference is greater than first one or from third input stream
+otherwise.
+
+This filter accepts the following options:
+@table @option
+@item planes
+Set which planes will be processed as bitmap, unprocessed planes will be
+copied from first stream.
+By default value 0xf, all planes will be processed.
+@end table
+
 @section maskedmerge
 
 Merge the first input stream with the second input stream using per pixel
@@ -11605,6 +13242,70 @@
 By default value 0xf, all planes will be processed.
 @end table
 
+@section maskedmin
+
+Merge the second and third input stream into output stream using absolute differences
+between second input stream and first input stream and absolute difference between
+third input stream and first input stream. The picked value will be from second input
+stream if second absolute difference is less than first one or from third input stream
+otherwise.
+
+This filter accepts the following options:
+@table @option
+@item planes
+Set which planes will be processed as bitmap, unprocessed planes will be
+copied from first stream.
+By default value 0xf, all planes will be processed.
+@end table
+
+@section maskedthreshold
+Pick pixels comparing absolute difference of two video streams with fixed
+threshold.
+
+If absolute difference between pixel component of first and second video
+stream is equal or lower than user supplied threshold than pixel component
+from first video stream is picked, otherwise pixel component from second
+video stream is picked.
+
+This filter accepts the following options:
+@table @option
+@item threshold
+Set threshold used when picking pixels from absolute difference from two input
+video streams.
+
+@item planes
+Set which planes will be processed as bitmap, unprocessed planes will be
+copied from second stream.
+By default value 0xf, all planes will be processed.
+@end table
+
+@section maskfun
+Create mask from input video.
+
+For example it is useful to create motion masks after @code{tblend} filter.
+
+This filter accepts the following options:
+
+@table @option
+@item low
+Set low threshold. Any pixel component lower or exact than this value will be set to 0.
+
+@item high
+Set high threshold. Any pixel component higher than this value will be set to max value
+allowed for current pixel format.
+
+@item planes
+Set planes to filter, by default all available planes are filtered.
+
+@item fill
+Fill all frame pixels with this value.
+
+@item sum
+Set max average pixel value for frame. If sum of all pixel components is higher that this
+average, output frame will be completely filled with value set by @var{fill} option.
+Typically useful for scene changes when used in combination with @code{tblend} filter.
+@end table
+
 @section mcdeint
 
 Apply motion-compensation deinterlacing.
@@ -11649,6 +13350,38 @@
 optimal individual vectors. Default value is 1.
 @end table
 
+@section median
+
+Pick median pixel from certain rectangle defined by radius.
+
+This filter accepts the following options:
+
+@table @option
+@item radius
+Set horizontal radius size. Default value is @code{1}.
+Allowed range is integer from 1 to 127.
+
+@item planes
+Set which planes to process. Default is @code{15}, which is all available planes.
+
+@item radiusV
+Set vertical radius size. Default value is @code{0}.
+Allowed range is integer from 0 to 127.
+If it is 0, value will be picked from horizontal @code{radius} option.
+
+@item percentile
+Set median percentile. Default value is @code{0.5}.
+Default value of @code{0.5} will pick always median values, while @code{0} will pick
+minimum values, and @code{1} maximum values.
+@end table
+
+@subsection Commands
+This filter supports same @ref{commands} as options.
+The command accepts the same syntax of the corresponding option.
+
+If the specified expression is not valid, it is kept at its current
+value.
+
 @section mergeplanes
 
 Merge color channel components from several video streams.
@@ -11958,10 +13691,10 @@
 
 @table @option
 @item s
-Set denoising strength.
+Set denoising strength. Default is 1.0. Must be in range [1.0, 30.0].
 
 @item p
-Set patch size.
+Set patch size. Default is 7. Must be odd number in range [0, 99].
 
 @item pc
 Same as @option{p} but for chroma planes.
@@ -11969,7 +13702,7 @@
 The default value is @var{0} and means automatic.
 
 @item r
-Set research size.
+Set research size. Default is 15. Must be odd number in range [0, 99].
 
 @item rc
 Same as @option{r} but for chroma planes.
@@ -12217,6 +13950,13 @@
 
 @end table
 
+@subsection Commands
+This filter supports same @ref{commands} as options, excluding @var{smoothing} option.
+The command accepts the same syntax of the corresponding option.
+
+If the specified expression is not valid, it is kept at its current
+value.
+
 @subsection Examples
 
 Stretch video contrast to use the full dynamic range, with no temporal
@@ -12275,6 +14015,7 @@
 @end table
 
 The filter exports recognized text as the frame metadata @code{lavfi.ocr.text}.
+The filter exports confidence of recognized words as the frame metadata @code{lavfi.ocr.confidence}.
 
 @section ocv
 
@@ -12370,7 +14111,7 @@
 or "bilateral". The default value is "gaussian".
 
 The meaning of @var{param1}, @var{param2}, @var{param3}, and @var{param4}
-depend on the smooth type. @var{param1} and
+depends on the smooth type. @var{param1} and
 @var{param2} accept integer positive values or 0. @var{param3} and
 @var{param4} accept floating point values.
 
@@ -12429,6 +14170,13 @@
 Draw scope. By default is enabled.
 @end table
 
+@subsection Commands
+This filter supports same @ref{commands} as options.
+The command accepts the same syntax of the corresponding option.
+
+If the specified expression is not valid, it is kept at its current
+value.
+
 @subsection Examples
 
 @itemize
@@ -12683,6 +14431,38 @@
 
 @end itemize
 
+@anchor{overlay_cuda}
+@section overlay_cuda
+
+Overlay one video on top of another.
+
+This is the CUDA cariant of the @ref{overlay} filter.
+It only accepts CUDA frames. The underlying input pixel formats have to match.
+
+It takes two inputs and has one output. The first input is the "main"
+video on which the second input is overlaid.
+
+It accepts the following parameters:
+
+@table @option
+@item x
+@item y
+Set the x and y coordinates of the overlaid video on the main video.
+Default value is "0" for both expressions.
+
+@item eof_action
+See @ref{framesync}.
+
+@item shortest
+See @ref{framesync}.
+
+@item repeatlast
+See @ref{framesync}.
+
+@end table
+
+This filter also supports the @ref{framesync} options.
+
 @section owdenoise
 
 Apply Overcomplete Wavelet denoiser.
@@ -13140,6 +14920,26 @@
 @end table
 @end table
 
+@section photosensitivity
+Reduce various flashes in video, so to help users with epilepsy.
+
+It accepts the following options:
+@table @option
+@item frames, f
+Set how many frames to use when filtering. Default is 30.
+
+@item threshold, t
+Set detection threshold factor. Default is 1.
+Lower is stricter.
+
+@item skip
+Set how many pixels to skip when sampling frames. Default is 1.
+Allowed range is from 1 to 1024.
+
+@item bypass
+Leave frames unchanged. Default is disabled.
+@end table
+
 @section pixdesctest
 
 Pixel format descriptor test filter, mainly useful for internal
@@ -13417,141 +15217,11 @@
 Set value which will be added to filtered result.
 @end table
 
-@anchor{program_opencl}
-@section program_opencl
-
-Filter video using an OpenCL program.
-
-@table @option
-
-@item source
-OpenCL program source file.
-
-@item kernel
-Kernel name in program.
-
-@item inputs
-Number of inputs to the filter.  Defaults to 1.
-
-@item size, s
-Size of output frames.  Defaults to the same as the first input.
-
-@end table
-
-The program source file must contain a kernel function with the given name,
-which will be run once for each plane of the output.  Each run on a plane
-gets enqueued as a separate 2D global NDRange with one work-item for each
-pixel to be generated.  The global ID offset for each work-item is therefore
-the coordinates of a pixel in the destination image.
-
-The kernel function needs to take the following arguments:
-@itemize
-@item
-Destination image, @var{__write_only image2d_t}.
-
-This image will become the output; the kernel should write all of it.
-@item
-Frame index, @var{unsigned int}.
-
-This is a counter starting from zero and increasing by one for each frame.
-@item
-Source images, @var{__read_only image2d_t}.
-
-These are the most recent images on each input.  The kernel may read from
-them to generate the output, but they can't be written to.
-@end itemize
-
-Example programs:
-
-@itemize
-@item
-Copy the input to the output (output must be the same size as the input).
-@verbatim
-__kernel void copy(__write_only image2d_t destination,
-                   unsigned int index,
-                   __read_only  image2d_t source)
-{
-    const sampler_t sampler = CLK_NORMALIZED_COORDS_FALSE;
-
-    int2 location = (int2)(get_global_id(0), get_global_id(1));
-
-    float4 value = read_imagef(source, sampler, location);
-
-    write_imagef(destination, location, value);
-}
-@end verbatim
-
-@item
-Apply a simple transformation, rotating the input by an amount increasing
-with the index counter.  Pixel values are linearly interpolated by the
-sampler, and the output need not have the same dimensions as the input.
-@verbatim
-__kernel void rotate_image(__write_only image2d_t dst,
-                           unsigned int index,
-                           __read_only  image2d_t src)
-{
-    const sampler_t sampler = (CLK_NORMALIZED_COORDS_FALSE |
-                               CLK_FILTER_LINEAR);
-
-    float angle = (float)index / 100.0f;
-
-    float2 dst_dim = convert_float2(get_image_dim(dst));
-    float2 src_dim = convert_float2(get_image_dim(src));
-
-    float2 dst_cen = dst_dim / 2.0f;
-    float2 src_cen = src_dim / 2.0f;
-
-    int2   dst_loc = (int2)(get_global_id(0), get_global_id(1));
-
-    float2 dst_pos = convert_float2(dst_loc) - dst_cen;
-    float2 src_pos = {
-        cos(angle) * dst_pos.x - sin(angle) * dst_pos.y,
-        sin(angle) * dst_pos.x + cos(angle) * dst_pos.y
-    };
-    src_pos = src_pos * src_dim / dst_dim;
-
-    float2 src_loc = src_pos + src_cen;
-
-    if (src_loc.x < 0.0f      || src_loc.y < 0.0f ||
-        src_loc.x > src_dim.x || src_loc.y > src_dim.y)
-        write_imagef(dst, dst_loc, 0.5f);
-    else
-        write_imagef(dst, dst_loc, read_imagef(src, sampler, src_loc));
-}
-@end verbatim
-
-@item
-Blend two inputs together, with the amount of each input used varying
-with the index counter.
-@verbatim
-__kernel void blend_images(__write_only image2d_t dst,
-                           unsigned int index,
-                           __read_only  image2d_t src1,
-                           __read_only  image2d_t src2)
-{
-    const sampler_t sampler = (CLK_NORMALIZED_COORDS_FALSE |
-                               CLK_FILTER_LINEAR);
-
-    float blend = (cos((float)index / 50.0f) + 1.0f) / 2.0f;
-
-    int2  dst_loc = (int2)(get_global_id(0), get_global_id(1));
-    int2 src1_loc = dst_loc * get_image_dim(src1) / get_image_dim(dst);
-    int2 src2_loc = dst_loc * get_image_dim(src2) / get_image_dim(dst);
-
-    float4 val1 = read_imagef(src1, sampler, src1_loc);
-    float4 val2 = read_imagef(src2, sampler, src2_loc);
-
-    write_imagef(dst, dst_loc, val1 * blend + val2 * (1.0f - blend));
-}
-@end verbatim
-
-@end itemize
-
 @section pseudocolor
 
 Alter frame colors in video with pseudocolors.
 
-This filter accept the following options:
+This filter accepts the following options:
 
 @table @option
 @item c0
@@ -13691,6 +15361,9 @@
 channels.
 @end table
 
+@subsection Examples
+@itemize
+@item
 For example:
 @example
 movie=ref_movie.mpg, setpts=PTS-STARTPTS [main];
@@ -13701,6 +15374,13 @@
 reference file @file{ref_movie.mpg}. The PSNR of each individual frame
 is stored in @file{stats.log}.
 
+@item
+Another example with different containers:
+@example
+ffmpeg -i main.mpg -i ref.mkv -lavfi  "[0:v]settb=AVTB,setpts=PTS-STARTPTS[main];[1:v]settb=AVTB,setpts=PTS-STARTPTS[ref];[main][ref]psnr" -f null -
+@end example
+@end itemize
+
 @anchor{pullup}
 @section pullup
 
@@ -13841,39 +15521,16 @@
 @item scan_max
 Set the line to end scanning for EIA-608 data. Default is @code{29}.
 
-@item mac
-Set minimal acceptable amplitude change for sync codes detection.
-Default is @code{0.2}. Allowed range is @code{[0.001 - 1]}.
-
 @item spw
 Set the ratio of width reserved for sync code detection.
-Default is @code{0.27}. Allowed range is @code{[0.01 - 0.7]}.
-
-@item mhd
-Set the max peaks height difference for sync code detection.
-Default is @code{0.1}. Allowed range is @code{[0.0 - 0.5]}.
-
-@item mpd
-Set max peaks period difference for sync code detection.
-Default is @code{0.1}. Allowed range is @code{[0.0 - 0.5]}.
-
-@item msd
-Set the first two max start code bits differences.
-Default is @code{0.02}. Allowed range is @code{[0.0 - 0.5]}.
-
-@item bhd
-Set the minimum ratio of bits height compared to 3rd start code bit.
-Default is @code{0.75}. Allowed range is @code{[0.01 - 1]}.
-
-@item th_w
-Set the white color threshold. Default is @code{0.35}. Allowed range is @code{[0.1 - 1]}.
-
-@item th_b
-Set the black color threshold. Default is @code{0.15}. Allowed range is @code{[0.0 - 0.5]}.
+Default is @code{0.27}. Allowed range is @code{[0.1 - 0.7]}.
 
 @item chp
 Enable checking the parity bit. In the event of a parity error, the filter will output
 @code{0x00} for that character. Default is false.
+
+@item lp
+Lowpass lines prior to further processing. Default is enabled.
 @end table
 
 @subsection Examples
@@ -13935,6 +15592,17 @@
 will have Xmap/Ymap video stream dimensions.
 Xmap and Ymap input video streams are 16bit depth, single channel.
 
+@table @option
+@item format
+Specify pixel format of output from this filter. Can be @code{color} or @code{gray}.
+Default is @code{color}.
+
+@item fill
+Specify the color of the unmapped pixels. For the syntax of this option,
+check the @ref{color syntax,,"Color" section in the ffmpeg-utils
+manual,ffmpeg-utils}. Default color is @code{black}.
+@end table
+
 @section removegrain
 
 The removegrain filter is a spatial denoiser for progressive video.
@@ -14091,6 +15759,35 @@
 @end example
 @end itemize
 
+@section rgbashift
+Shift R/G/B/A pixels horizontally and/or vertically.
+
+The filter accepts the following options:
+@table @option
+@item rh
+Set amount to shift red horizontally.
+@item rv
+Set amount to shift red vertically.
+@item gh
+Set amount to shift green horizontally.
+@item gv
+Set amount to shift green vertically.
+@item bh
+Set amount to shift blue horizontally.
+@item bv
+Set amount to shift blue vertically.
+@item ah
+Set amount to shift alpha horizontally.
+@item av
+Set amount to shift alpha vertically.
+@item edge
+Set edge mode, can be @var{smear}, default, or @var{warp}.
+@end table
+
+@subsection Commands
+
+This filter supports the all above options as @ref{commands}.
+
 @section roberts
 Apply roberts cross operator to input video stream.
 
@@ -14394,6 +16091,8 @@
 Commission (FCC) Code of Federal Regulations (CFR) Title 47 (2003) 73.682 (a).
 
 @item bt601
+@item bt470
+@item smpte170m
 Set color space conforming to:
 
 @itemize
@@ -14410,6 +16109,9 @@
 
 @item smpte240m
 Set color space conforming to SMPTE ST 240:1999.
+
+@item bt2020
+Set color space conforming to ITU-R BT.2020 non-constant luminance system.
 @end table
 
 @item in_range
@@ -14458,6 +16160,19 @@
 or @option{h}, you still need to specify the output resolution for this option
 to work.
 
+@item force_divisible_by
+Ensures that both the output dimensions, width and height, are divisible by the
+given integer when used together with @option{force_original_aspect_ratio}. This
+works similar to using @code{-n} in the @option{w} and @option{h} options.
+
+This option respects the value set for @option{force_original_aspect_ratio},
+increasing or decreasing the resolution accordingly. The video's aspect ratio
+may be slightly modified.
+
+This option can be handy if you need to have a video fit within or exceed
+a defined resolution using @option{force_original_aspect_ratio} but also have
+encoder restrictions on width or height divisibility.
+
 @end table
 
 The values of the @option{w} and @option{h} options are expressions
@@ -14498,6 +16213,19 @@
 @item ovsub
 horizontal and vertical output chroma subsample values. For example for the
 pixel format "yuv422p" @var{hsub} is 2 and @var{vsub} is 1.
+
+@item n
+The (sequential) number of the input frame, starting from 0.
+Only available with @code{eval=frame}.
+
+@item t
+The presentation timestamp of the input frame, expressed as a number of
+seconds. Only available with @code{eval=frame}.
+
+@item pos
+The position (byte offset) of the frame in the input stream, or NaN if
+this information is unavailable and/or meaningless (for example in case of synthetic video).
+Only available with @code{eval=frame}.
 @end table
 
 @subsection Examples
@@ -14650,6 +16378,46 @@
 @item lanczos
 @end table
 
+@item force_original_aspect_ratio
+Enable decreasing or increasing output video width or height if necessary to
+keep the original aspect ratio. Possible values:
+
+@table @samp
+@item disable
+Scale the video as specified and disable this feature.
+
+@item decrease
+The output video dimensions will automatically be decreased if needed.
+
+@item increase
+The output video dimensions will automatically be increased if needed.
+
+@end table
+
+One useful instance of this option is that when you know a specific device's
+maximum allowed resolution, you can use this to limit the output video to
+that, while retaining the aspect ratio. For example, device A allows
+1280x720 playback, and your video is 1920x800. Using this option (set it to
+decrease) and specifying 1280x720 to the command line makes the output
+1280x533.
+
+Please note that this is a different thing than specifying -1 for @option{w}
+or @option{h}, you still need to specify the output resolution for this option
+to work.
+
+@item force_divisible_by
+Ensures that both the output dimensions, width and height, are divisible by the
+given integer when used together with @option{force_original_aspect_ratio}. This
+works similar to using @code{-n} in the @option{w} and @option{h} options.
+
+This option respects the value set for @option{force_original_aspect_ratio},
+increasing or decreasing the resolution accordingly. The video's aspect ratio
+may be slightly modified.
+
+This option can be handy if you need to have a video fit within or exceed
+a defined resolution using @option{force_original_aspect_ratio} but also have
+encoder restrictions on width or height divisibility.
+
 @end table
 
 @section scale2ref
@@ -14681,6 +16449,19 @@
 The main input video's horizontal and vertical chroma subsample values.
 For example for the pixel format "yuv422p" @var{hsub} is 2 and @var{vsub}
 is 1.
+
+@item main_n
+The (sequential) number of the main input frame, starting from 0.
+Only available with @code{eval=frame}.
+
+@item main_t
+The presentation timestamp of the main input frame, expressed as a number of
+seconds. Only available with @code{eval=frame}.
+
+@item main_pos
+The position (byte offset) of the frame in the main input stream, or NaN if
+this information is unavailable and/or meaningless (for example in case of synthetic video).
+Only available with @code{eval=frame}.
 @end table
 
 @subsection Examples
@@ -14691,8 +16472,57 @@
 @example
 'scale2ref[b][a];[a][b]overlay'
 @end example
+
+@item
+Scale a logo to 1/10th the height of a video, while preserving its display aspect ratio.
+@example
+[logo-in][video-in]scale2ref=w=oh*mdar:h=ih/10[logo-out][video-out]
+@end example
 @end itemize
 
+@subsection Commands
+
+This filter supports the following commands:
+@table @option
+@item width, w
+@item height, h
+Set the output video dimension expression.
+The command accepts the same syntax of the corresponding option.
+
+If the specified expression is not valid, it is kept at its current
+value.
+@end table
+
+@section scroll
+Scroll input video horizontally and/or vertically by constant speed.
+
+The filter accepts the following options:
+@table @option
+@item horizontal, h
+Set the horizontal scrolling speed. Default is 0. Allowed range is from -1 to 1.
+Negative values changes scrolling direction.
+
+@item vertical, v
+Set the vertical scrolling speed. Default is 0. Allowed range is from -1 to 1.
+Negative values changes scrolling direction.
+
+@item hpos
+Set the initial horizontal scrolling position. Default is 0. Allowed range is from 0 to 1.
+
+@item vpos
+Set the initial vertical scrolling position. Default is 0. Allowed range is from 0 to 1.
+@end table
+
+@subsection Commands
+
+This filter supports the following @ref{commands}:
+@table @option
+@item horizontal, h
+Set the horizontal scrolling speed.
+@item vertical, v
+Set the vertical scrolling speed.
+@end table
+
 @anchor{selectivecolor}
 @section selectivecolor
 
@@ -14904,11 +16734,137 @@
 @end table
 @end table
 
+@anchor{setparams}
+@section setparams
+
+Force frame parameter for the output video frame.
+
+The @code{setparams} filter marks interlace and color range for the
+output frames. It does not change the input frame, but only sets the
+corresponding property, which affects how the frame is treated by
+filters/encoders.
+
+@table @option
+@item field_mode
+Available values are:
+
+@table @samp
+@item auto
+Keep the same field property (default).
+
+@item bff
+Mark the frame as bottom-field-first.
+
+@item tff
+Mark the frame as top-field-first.
+
+@item prog
+Mark the frame as progressive.
+@end table
+
+@item range
+Available values are:
+
+@table @samp
+@item auto
+Keep the same color range property (default).
+
+@item unspecified, unknown
+Mark the frame as unspecified color range.
+
+@item limited, tv, mpeg
+Mark the frame as limited range.
+
+@item full, pc, jpeg
+Mark the frame as full range.
+@end table
+
+@item color_primaries
+Set the color primaries.
+Available values are:
+
+@table @samp
+@item auto
+Keep the same color primaries property (default).
+
+@item bt709
+@item unknown
+@item bt470m
+@item bt470bg
+@item smpte170m
+@item smpte240m
+@item film
+@item bt2020
+@item smpte428
+@item smpte431
+@item smpte432
+@item jedec-p22
+@end table
+
+@item color_trc
+Set the color transfer.
+Available values are:
+
+@table @samp
+@item auto
+Keep the same color trc property (default).
+
+@item bt709
+@item unknown
+@item bt470m
+@item bt470bg
+@item smpte170m
+@item smpte240m
+@item linear
+@item log100
+@item log316
+@item iec61966-2-4
+@item bt1361e
+@item iec61966-2-1
+@item bt2020-10
+@item bt2020-12
+@item smpte2084
+@item smpte428
+@item arib-std-b67
+@end table
+
+@item colorspace
+Set the colorspace.
+Available values are:
+
+@table @samp
+@item auto
+Keep the same colorspace property (default).
+
+@item gbr
+@item bt709
+@item unknown
+@item fcc
+@item bt470bg
+@item smpte170m
+@item smpte240m
+@item ycgco
+@item bt2020nc
+@item bt2020c
+@item smpte2085
+@item chroma-derived-nc
+@item chroma-derived-c
+@item ictcp
+@end table
+@end table
+
 @section showinfo
 
 Show a line containing various information for each input video frame.
 The input video is not modified.
 
+This filter supports the following options:
+
+@table @option
+@item checksum
+Calculate checksums of each plane. By default enabled.
+@end table
+
 The shown line contains a sequence of key/value pairs of the form
 @var{key}:@var{value}.
 
@@ -14961,6 +16917,15 @@
 @item plane_checksum
 The Adler-32 checksum (printed in hexadecimal) of each plane of the input frame,
 expressed in the form "[@var{c0} @var{c1} @var{c2} @var{c3}]".
+
+@item mean
+The mean value of pixels in each plane of the input frame, expressed in the form
+"[@var{mean0} @var{mean1} @var{mean2} @var{mean3}]".
+
+@item stdev
+The standard deviation of pixel values in each plane of the input frame, expressed
+in the form "[@var{stdev0} @var{stdev1} @var{stdev2} @var{stdev3}]".
+
 @end table
 
 @section showpalette
@@ -15374,6 +17339,126 @@
 If a chroma option is not explicitly set, the corresponding luma value
 is set.
 
+@section sobel
+Apply sobel operator to input video stream.
+
+The filter accepts the following option:
+
+@table @option
+@item planes
+Set which planes will be processed, unprocessed planes will be copied.
+By default value 0xf, all planes will be processed.
+
+@item scale
+Set value which will be multiplied with filtered result.
+
+@item delta
+Set value which will be added to filtered result.
+@end table
+
+@anchor{spp}
+@section spp
+
+Apply a simple postprocessing filter that compresses and decompresses the image
+at several (or - in the case of @option{quality} level @code{6} - all) shifts
+and average the results.
+
+The filter accepts the following options:
+
+@table @option
+@item quality
+Set quality. This option defines the number of levels for averaging. It accepts
+an integer in the range 0-6. If set to @code{0}, the filter will have no
+effect. A value of @code{6} means the higher quality. For each increment of
+that value the speed drops by a factor of approximately 2.  Default value is
+@code{3}.
+
+@item qp
+Force a constant quantization parameter. If not set, the filter will use the QP
+from the video stream (if available).
+
+@item mode
+Set thresholding mode. Available modes are:
+
+@table @samp
+@item hard
+Set hard thresholding (default).
+@item soft
+Set soft thresholding (better de-ringing effect, but likely blurrier).
+@end table
+
+@item use_bframe_qp
+Enable the use of the QP from the B-Frames if set to @code{1}. Using this
+option may cause flicker since the B-Frames have often larger QP. Default is
+@code{0} (not enabled).
+@end table
+
+@subsection Commands
+
+This filter supports the following commands:
+@table @option
+@item quality, level
+Set quality level. The value @code{max} can be used to set the maximum level,
+currently @code{6}.
+@end table
+
+@anchor{sr}
+@section sr
+
+Scale the input by applying one of the super-resolution methods based on
+convolutional neural networks. Supported models:
+
+@itemize
+@item
+Super-Resolution Convolutional Neural Network model (SRCNN).
+See @url{https://arxiv.org/abs/1501.00092}.
+
+@item
+Efficient Sub-Pixel Convolutional Neural Network model (ESPCN).
+See @url{https://arxiv.org/abs/1609.05158}.
+@end itemize
+
+Training scripts as well as scripts for model file (.pb) saving can be found at
+@url{https://github.com/XueweiMeng/sr/tree/sr_dnn_native}. Original repository
+is at @url{https://github.com/HighVoltageRocknRoll/sr.git}.
+
+Native model files (.model) can be generated from TensorFlow model
+files (.pb) by using tools/python/convert.py
+
+The filter accepts the following options:
+
+@table @option
+@item dnn_backend
+Specify which DNN backend to use for model loading and execution. This option accepts
+the following values:
+
+@table @samp
+@item native
+Native implementation of DNN loading and execution.
+
+@item tensorflow
+TensorFlow backend. To enable this backend you
+need to install the TensorFlow for C library (see
+@url{https://www.tensorflow.org/install/install_c}) and configure FFmpeg with
+@code{--enable-libtensorflow}
+@end table
+
+Default value is @samp{native}.
+
+@item model
+Set path to model file specifying network architecture and its parameters.
+Note that different backends use different file formats. TensorFlow backend
+can load files for both formats, while native backend can load files for only
+its format.
+
+@item scale_factor
+Set scale factor for SRCNN model. Allowed values are @code{2}, @code{3} and @code{4}.
+Default value is @code{2}. Scale factor is necessary for SRCNN model, because it accepts
+input upscaled using bicubic upscaling with proper scale factor.
+@end table
+
+This feature can also be finished with @ref{dnn_processing} filter.
+
 @section ssim
 
 Obtain the SSIM (Structural SImilarity Metric) between two input videos.
@@ -15420,6 +17505,9 @@
 
 This filter also supports the @ref{framesync} options.
 
+@subsection Examples
+@itemize
+@item
 For example:
 @example
 movie=ref_movie.mpg, setpts=PTS-STARTPTS [main];
@@ -15430,11 +17518,19 @@
 reference file @file{ref_movie.mpg}. The SSIM of each individual frame
 is stored in @file{stats.log}.
 
+@item
 Another example with both psnr and ssim at same time:
 @example
 ffmpeg -i main.mpg -i ref.mpg -lavfi  "ssim;[0:v][1:v]psnr" -f null -
 @end example
 
+@item
+Another example with different containers:
+@example
+ffmpeg -i main.mpg -i ref.mkv -lavfi  "[0:v]settb=AVTB,setpts=PTS-STARTPTS[main];[1:v]settb=AVTB,setpts=PTS-STARTPTS[ref];[main][ref]ssim" -f null -
+@end example
+@end itemize
+
 @section stereo3d
 
 Convert between different stereoscopic image formats.
@@ -15462,16 +17558,20 @@
 (right eye left, left eye right)
 
 @item abl
+@item tbl
 above-below (left eye above, right eye below)
 
 @item abr
+@item tbr
 above-below (right eye above, left eye below)
 
 @item ab2l
+@item tb2l
 above-below with half height resolution
 (left eye above, right eye below)
 
 @item ab2r
+@item tb2r
 above-below with half height resolution
 (right eye above, left eye below)
 
@@ -15515,16 +17615,20 @@
 (right eye left, left eye right)
 
 @item abl
+@item tbl
 above-below (left eye above, right eye below)
 
 @item abr
+@item tbr
 above-below (right eye above, left eye below)
 
 @item ab2l
+@item tb2l
 above-below with half height resolution
 (left eye above, right eye below)
 
 @item ab2r
+@item tb2r
 above-below with half height resolution
 (right eye above, left eye below)
 
@@ -15676,110 +17780,6 @@
 @end example
 @end itemize
 
-@section sobel
-Apply sobel operator to input video stream.
-
-The filter accepts the following option:
-
-@table @option
-@item planes
-Set which planes will be processed, unprocessed planes will be copied.
-By default value 0xf, all planes will be processed.
-
-@item scale
-Set value which will be multiplied with filtered result.
-
-@item delta
-Set value which will be added to filtered result.
-@end table
-
-@anchor{spp}
-@section spp
-
-Apply a simple postprocessing filter that compresses and decompresses the image
-at several (or - in the case of @option{quality} level @code{6} - all) shifts
-and average the results.
-
-The filter accepts the following options:
-
-@table @option
-@item quality
-Set quality. This option defines the number of levels for averaging. It accepts
-an integer in the range 0-6. If set to @code{0}, the filter will have no
-effect. A value of @code{6} means the higher quality. For each increment of
-that value the speed drops by a factor of approximately 2.  Default value is
-@code{3}.
-
-@item qp
-Force a constant quantization parameter. If not set, the filter will use the QP
-from the video stream (if available).
-
-@item mode
-Set thresholding mode. Available modes are:
-
-@table @samp
-@item hard
-Set hard thresholding (default).
-@item soft
-Set soft thresholding (better de-ringing effect, but likely blurrier).
-@end table
-
-@item use_bframe_qp
-Enable the use of the QP from the B-Frames if set to @code{1}. Using this
-option may cause flicker since the B-Frames have often larger QP. Default is
-@code{0} (not enabled).
-@end table
-
-@section sr
-
-Scale the input by applying one of the super-resolution methods based on
-convolutional neural networks. Supported models:
-
-@itemize
-@item
-Super-Resolution Convolutional Neural Network model (SRCNN).
-See @url{https://arxiv.org/abs/1501.00092}.
-
-@item
-Efficient Sub-Pixel Convolutional Neural Network model (ESPCN).
-See @url{https://arxiv.org/abs/1609.05158}.
-@end itemize
-
-Training scripts as well as scripts for model generation are provided in
-the repository at @url{https://github.com/HighVoltageRocknRoll/sr.git}.
-
-The filter accepts the following options:
-
-@table @option
-@item dnn_backend
-Specify which DNN backend to use for model loading and execution. This option accepts
-the following values:
-
-@table @samp
-@item native
-Native implementation of DNN loading and execution.
-
-@item tensorflow
-TensorFlow backend. To enable this backend you
-need to install the TensorFlow for C library (see
-@url{https://www.tensorflow.org/install/install_c}) and configure FFmpeg with
-@code{--enable-libtensorflow}
-@end table
-
-Default value is @samp{native}.
-
-@item model
-Set path to model file specifying network architecture and its parameters.
-Note that different backends use different file formats. TensorFlow backend
-can load files for both formats, while native backend can load files for only
-its format.
-
-@item scale_factor
-Set scale factor for SRCNN model. Allowed values are @code{2}, @code{3} and @code{4}.
-Default value is @code{2}. Scale factor is necessary for SRCNN model, because it accepts
-input upscaled using bicubic upscaling with proper scale factor.
-@end table
-
 @anchor{subtitles}
 @section subtitles
 
@@ -15916,6 +17916,11 @@
 @section swapuv
 Swap U & V plane.
 
+@section tblend
+Blend successive video frames.
+
+See @ref{blend}
+
 @section telecine
 
 Apply telecine process to the video.
@@ -15955,6 +17960,61 @@
 16p: 33333334
 @end example
 
+@section thistogram
+
+Compute and draw a color distribution histogram for the input video across time.
+
+Unlike @ref{histogram} video filter which only shows histogram of single input frame
+at certain time, this filter shows also past histograms of number of frames defined
+by @code{width} option.
+
+The computed histogram is a representation of the color component
+distribution in an image.
+
+The filter accepts the following options:
+
+@table @option
+@item width, w
+Set width of single color component output. Default value is @code{0}.
+Value of @code{0} means width will be picked from input video.
+This also set number of passed histograms to keep.
+Allowed range is [0, 8192].
+
+@item display_mode, d
+Set display mode.
+It accepts the following values:
+@table @samp
+@item stack
+Per color component graphs are placed below each other.
+
+@item parade
+Per color component graphs are placed side by side.
+
+@item overlay
+Presents information identical to that in the @code{parade}, except
+that the graphs representing color components are superimposed directly
+over one another.
+@end table
+Default is @code{stack}.
+
+@item levels_mode, m
+Set mode. Can be either @code{linear}, or @code{logarithmic}.
+Default is @code{linear}.
+
+@item components, c
+Set what color components to display.
+Default is @code{7}.
+
+@item bgopacity, b
+Set background opacity. Default is @code{0.9}.
+
+@item envelope, e
+Show envelope. Default is disabled.
+
+@item ecolor, ec
+Set envelope color. Default is @code{gold}.
+@end table
+
 @section threshold
 
 Apply threshold effect to video stream.
@@ -16322,25 +18382,46 @@
 Available value for @var{flags} is:
 
 @table @option
-@item low_pass_filter, vlfp
+@item low_pass_filter, vlpf
 Enable linear vertical low-pass filtering in the filter.
 Vertical low-pass filtering is required when creating an interlaced
 destination from a progressive source which contains high-frequency
 vertical detail. Filtering will reduce interlace 'twitter' and Moire
 patterning.
 
-@item complex_filter, cvlfp
+@item complex_filter, cvlpf
 Enable complex vertical low-pass filtering.
 This will slightly less reduce interlace 'twitter' and Moire
 patterning but better retain detail and subjective sharpness impression.
 
+@item bypass_il
+Bypass already interlaced frames, only adjust the frame rate.
 @end table
 
-Vertical low-pass filtering can only be enabled for @option{mode}
-@var{interleave_top} and @var{interleave_bottom}.
+Vertical low-pass filtering and bypassing already interlaced frames can only be
+enabled for @option{mode} @var{interleave_top} and @var{interleave_bottom}.
 
 @end table
 
+@section tmedian
+Pick median pixels from several successive input video frames.
+
+The filter accepts the following options:
+
+@table @option
+@item radius
+Set radius of median filter.
+Default is 1. Allowed range is from 1 to 127.
+
+@item planes
+Set which planes to filter. Default value is @code{15}, by which all planes are processed.
+
+@item percentile
+Set median percentile. Default value is @code{0.5}.
+Default value of @code{0.5} will pick always median values, while @code{0} will pick
+minimum values, and @code{1} maximum values.
+@end table
+
 @section tmix
 
 Mix successive video frames.
@@ -16385,6 +18466,7 @@
 @end example
 @end itemize
 
+@anchor{tonemap}
 @section tonemap
 Tone map colors from different dynamic ranges.
 
@@ -16492,6 +18574,48 @@
 mapping from a lower range to a higher range.
 @end table
 
+@section tpad
+
+Temporarily pad video frames.
+
+The filter accepts the following options:
+
+@table @option
+@item start
+Specify number of delay frames before input video stream. Default is 0.
+
+@item stop
+Specify number of padding frames after input video stream.
+Set to -1 to pad indefinitely. Default is 0.
+
+@item start_mode
+Set kind of frames added to beginning of stream.
+Can be either @var{add} or @var{clone}.
+With @var{add} frames of solid-color are added.
+With @var{clone} frames are clones of first frame.
+Default is @var{add}.
+
+@item stop_mode
+Set kind of frames added to end of stream.
+Can be either @var{add} or @var{clone}.
+With @var{add} frames of solid-color are added.
+With @var{clone} frames are clones of last frame.
+Default is @var{add}.
+
+@item start_duration, stop_duration
+Specify the duration of the start/stop delay. See
+@ref{time duration syntax,,the Time duration section in the ffmpeg-utils(1) manual,ffmpeg-utils}
+for the accepted syntax.
+These options override @var{start} and @var{stop}. Default is 0.
+
+@item color
+Specify the color of the padded area. For the syntax of this option,
+check the @ref{color syntax,,"Color" section in the ffmpeg-utils
+manual,ffmpeg-utils}.
+
+The default value of @var{color} is "black".
+@end table
+
 @anchor{transpose}
 @section transpose
 
@@ -16791,6 +18915,363 @@
 from the video stream (if available).
 @end table
 
+@section v360
+
+Convert 360 videos between various formats.
+
+The filter accepts the following options:
+
+@table @option
+
+@item input
+@item output
+Set format of the input/output video.
+
+Available formats:
+
+@table @samp
+
+@item e
+@item equirect
+Equirectangular projection.
+
+@item c3x2
+@item c6x1
+@item c1x6
+Cubemap with 3x2/6x1/1x6 layout.
+
+Format specific options:
+
+@table @option
+@item in_pad
+@item out_pad
+Set padding proportion for the input/output cubemap. Values in decimals.
+
+Example values:
+@table @samp
+@item 0
+No padding.
+@item 0.01
+1% of face is padding. For example, with 1920x1280 resolution face size would be 640x640 and padding would be 3 pixels from each side. (640 * 0.01 = 6 pixels)
+@end table
+
+Default value is @b{@samp{0}}.
+
+@item fin_pad
+@item fout_pad
+Set fixed padding for the input/output cubemap. Values in pixels.
+
+Default value is @b{@samp{0}}. If greater than zero it overrides other padding options.
+
+@item in_forder
+@item out_forder
+Set order of faces for the input/output cubemap. Choose one direction for each position.
+
+Designation of directions:
+@table @samp
+@item r
+right
+@item l
+left
+@item u
+up
+@item d
+down
+@item f
+forward
+@item b
+back
+@end table
+
+Default value is @b{@samp{rludfb}}.
+
+@item in_frot
+@item out_frot
+Set rotation of faces for the input/output cubemap. Choose one angle for each position.
+
+Designation of angles:
+@table @samp
+@item 0
+0 degrees clockwise
+@item 1
+90 degrees clockwise
+@item 2
+180 degrees clockwise
+@item 3
+270 degrees clockwise
+@end table
+
+Default value is @b{@samp{000000}}.
+@end table
+
+@item eac
+Equi-Angular Cubemap.
+
+@item flat
+@item gnomonic
+@item rectilinear
+Regular video.
+
+Format specific options:
+@table @option
+@item h_fov
+@item v_fov
+@item d_fov
+Set output horizontal/vertical/diagonal field of view. Values in degrees.
+
+If diagonal field of view is set it overrides horizontal and vertical field of view.
+
+@item ih_fov
+@item iv_fov
+@item id_fov
+Set input horizontal/vertical/diagonal field of view. Values in degrees.
+
+If diagonal field of view is set it overrides horizontal and vertical field of view.
+@end table
+
+@item dfisheye
+Dual fisheye.
+
+Format specific options:
+@table @option
+@item in_pad
+@item out_pad
+Set padding proportion. Values in decimals.
+
+Example values:
+@table @samp
+@item 0
+No padding.
+@item 0.01
+1% padding.
+@end table
+
+Default value is @b{@samp{0}}.
+@end table
+
+@item barrel
+@item fb
+@item barrelsplit
+Facebook's 360 formats.
+
+@item sg
+Stereographic format.
+
+Format specific options:
+@table @option
+@item h_fov
+@item v_fov
+@item d_fov
+Set output horizontal/vertical/diagonal field of view. Values in degrees.
+
+If diagonal field of view is set it overrides horizontal and vertical field of view.
+
+@item ih_fov
+@item iv_fov
+@item id_fov
+Set input horizontal/vertical/diagonal field of view. Values in degrees.
+
+If diagonal field of view is set it overrides horizontal and vertical field of view.
+@end table
+
+@item mercator
+Mercator format.
+
+@item ball
+Ball format, gives significant distortion toward the back.
+
+@item hammer
+Hammer-Aitoff map projection format.
+
+@item sinusoidal
+Sinusoidal map projection format.
+
+@item fisheye
+Fisheye projection.
+
+Format specific options:
+@table @option
+@item h_fov
+@item v_fov
+@item d_fov
+Set output horizontal/vertical/diagonal field of view. Values in degrees.
+
+If diagonal field of view is set it overrides horizontal and vertical field of view.
+
+@item ih_fov
+@item iv_fov
+@item id_fov
+Set input horizontal/vertical/diagonal field of view. Values in degrees.
+
+If diagonal field of view is set it overrides horizontal and vertical field of view.
+@end table
+
+@item pannini
+Pannini projection.
+
+Format specific options:
+@table @option
+@item h_fov
+Set output pannini parameter.
+
+@item ih_fov
+Set input pannini parameter.
+@end table
+
+@item cylindrical
+Cylindrical projection.
+
+Format specific options:
+@table @option
+@item h_fov
+@item v_fov
+@item d_fov
+Set output horizontal/vertical/diagonal field of view. Values in degrees.
+
+If diagonal field of view is set it overrides horizontal and vertical field of view.
+
+@item ih_fov
+@item iv_fov
+@item id_fov
+Set input horizontal/vertical/diagonal field of view. Values in degrees.
+
+If diagonal field of view is set it overrides horizontal and vertical field of view.
+@end table
+
+@item perspective
+Perspective projection. @i{(output only)}
+
+Format specific options:
+@table @option
+@item v_fov
+Set perspective parameter.
+@end table
+
+@item tetrahedron
+Tetrahedron projection.
+
+@item tsp
+Truncated square pyramid projection.
+
+@item he
+@item hequirect
+Half equirectangular projection.
+@end table
+
+@item interp
+Set interpolation method.@*
+@i{Note: more complex interpolation methods require much more memory to run.}
+
+Available methods:
+
+@table @samp
+@item near
+@item nearest
+Nearest neighbour.
+@item line
+@item linear
+Bilinear interpolation.
+@item lagrange9
+Lagrange9 interpolation.
+@item cube
+@item cubic
+Bicubic interpolation.
+@item lanc
+@item lanczos
+Lanczos interpolation.
+@item sp16
+@item spline16
+Spline16 interpolation.
+@item gauss
+@item gaussian
+Gaussian interpolation.
+@end table
+
+Default value is @b{@samp{line}}.
+
+@item w
+@item h
+Set the output video resolution.
+
+Default resolution depends on formats.
+
+@item in_stereo
+@item out_stereo
+Set the input/output stereo format.
+
+@table @samp
+@item 2d
+2D mono
+@item sbs
+Side by side
+@item tb
+Top bottom
+@end table
+
+Default value is @b{@samp{2d}} for input and output format.
+
+@item yaw
+@item pitch
+@item roll
+Set rotation for the output video. Values in degrees.
+
+@item rorder
+Set rotation order for the output video. Choose one item for each position.
+
+@table @samp
+@item y, Y
+yaw
+@item p, P
+pitch
+@item r, R
+roll
+@end table
+
+Default value is @b{@samp{ypr}}.
+
+@item h_flip
+@item v_flip
+@item d_flip
+Flip the output video horizontally(swaps left-right)/vertically(swaps up-down)/in-depth(swaps back-forward). Boolean values.
+
+@item ih_flip
+@item iv_flip
+Set if input video is flipped horizontally/vertically. Boolean values.
+
+@item in_trans
+Set if input video is transposed. Boolean value, by default disabled.
+
+@item out_trans
+Set if output video needs to be transposed. Boolean value, by default disabled.
+
+@item alpha_mask
+Build mask in alpha plane for all unmapped pixels by marking them fully transparent. Boolean value, by default disabled.
+@end table
+
+@subsection Examples
+
+@itemize
+@item
+Convert equirectangular video to cubemap with 3x2 layout and 1% padding using bicubic interpolation:
+@example
+ffmpeg -i input.mkv -vf v360=e:c3x2:cubic:out_pad=0.01 output.mkv
+@end example
+@item
+Extract back view of Equi-Angular Cubemap:
+@example
+ffmpeg -i input.mkv -vf v360=eac:flat:yaw=180 output.mkv
+@end example
+@item
+Convert transposed and horizontally flipped Equi-Angular Cubemap in side-by-side stereo format to equirectangular top-bottom stereo format:
+@example
+v360=eac:equirect:in_stereo=sbs:in_trans=1:ih_flip=1:out_stereo=tb
+@end example
+@end itemize
+
+@subsection Commands
+
+This filter supports subset of above options as @ref{commands}.
+
 @section vaguedenoiser
 
 Apply a wavelet based denoiser.
@@ -16854,6 +19335,7 @@
 It accepts the following values:
 @table @samp
 @item gray
+@item tint
 Gray values are displayed on graph, higher brightness means more pixels have
 same component color value on location in graph. This is the default mode.
 
@@ -16912,6 +19394,7 @@
 @item none
 @item green
 @item color
+@item invert
 @end table
 
 @item opacity, o
@@ -16956,6 +19439,11 @@
 @item 709
 @end table
 Default is auto.
+
+@item tint0, t0
+@item tint1, t1
+Set color tint for gray/tint vectorscope mode. By default both options are zero.
+This means no tint, and output will remain gray.
 @end table
 
 @anchor{vidstabdetect}
@@ -17208,8 +19696,45 @@
 
 At end it will output number of frames detected as having variable delta pts,
 and ones with constant delta pts.
-If there was frames with variable delta, than it will also show min and max delta
-encountered.
+If there was frames with variable delta, than it will also show min, max and
+average delta encountered.
+
+@section vibrance
+
+Boost or alter saturation.
+
+The filter accepts the following options:
+@table @option
+@item intensity
+Set strength of boost if positive value or strength of alter if negative value.
+Default is 0. Allowed range is from -2 to 2.
+
+@item rbal
+Set the red balance. Default is 1. Allowed range is from -10 to 10.
+
+@item gbal
+Set the green balance. Default is 1. Allowed range is from -10 to 10.
+
+@item bbal
+Set the blue balance. Default is 1. Allowed range is from -10 to 10.
+
+@item rlum
+Set the red luma coefficient.
+
+@item glum
+Set the green luma coefficient.
+
+@item blum
+Set the blue luma coefficient.
+
+@item alternate
+If @code{intensity} is negative and this is set to 1, colors will change,
+otherwise colors will be less saturated, more towards gray.
+@end table
+
+@subsection Commands
+
+This filter supports the all above options as @ref{commands}.
 
 @anchor{vignette}
 @section vignette
@@ -17324,16 +19849,23 @@
 
 @section vmafmotion
 
-Obtain the average vmaf motion score of a video.
-It is one of the component filters of VMAF.
+Obtain the average VMAF motion score of a video.
+It is one of the component metrics of VMAF.
 
 The obtained average motion score is printed through the logging system.
 
-In the below example the input file @file{ref.mpg} is being processed and score
-is computed.
+The filter accepts the following options:
 
+@table @option
+@item stats_file
+If specified, the filter will use the named file to save the motion score of
+each frame with respect to the previous frame.
+When filename equals "-" the data is sent to standard output.
+@end table
+
+Example:
 @example
-ffmpeg -i ref.mpg -lavfi vmafmotion -f null -
+ffmpeg -i ref.mpg -vf vmafmotion -f null -
 @end example
 
 @section vstack
@@ -17344,7 +19876,7 @@
 Note that this filter is faster than using @ref{overlay} and @ref{pad} filter
 to create same output.
 
-The filter accept the following option:
+The filter accepts the following options:
 
 @table @option
 @item inputs
@@ -17365,7 +19897,11 @@
 Easterbrook for BBC R&D, the Weston 3 field deinterlacing filter
 uses filter coefficients calculated by BBC R&D.
 
-There are two sets of filter coefficients, so called "simple":
+This filter uses field-dominance information in frame to decide which
+of each pair of fields to place first in the output.
+If it gets it wrong use @ref{setfield} filter before @code{w3fdif} filter.
+
+There are two sets of filter coefficients, so called "simple"
 and "complex". Which set of filter coefficients is used can
 be set by passing an optional parameter:
 
@@ -17382,7 +19918,7 @@
 Default value is @samp{complex}.
 
 @item deint
-Specify which frames to deinterlace. Accept one of the following values:
+Specify which frames to deinterlace. Accepts one of the following values:
 
 @table @samp
 @item all
@@ -17487,6 +20023,9 @@
 @item xflat
 Similar as above, but use different colors.
 
+@item yflat
+Similar as above, but again with different colors.
+
 @item chroma
 Displays only chroma.
 
@@ -17509,6 +20048,9 @@
 
 @item orange
 Display orange graticule showing legal broadcast ranges.
+
+@item invert
+Display invert graticule showing legal broadcast ranges.
 @end table
 
 @item opacity, o
@@ -17537,6 +20079,12 @@
 
 @item bgopacity, b
 Set background opacity.
+
+@item tint0, t0
+@item tint1, t1
+Set tint for output.
+Only used with lowpass filter and when display is not overlay and input
+pixel formats are not RGB.
 @end table
 
 @section weave, doubleweave
@@ -17587,6 +20135,248 @@
 Default is @code{3}.
 @end table
 
+@section xfade
+
+Apply cross fade from one input video stream to another input video stream.
+The cross fade is applied for specified duration.
+
+The filter accepts the following options:
+
+@table @option
+@item transition
+Set one of available transition effects:
+
+@table @samp
+@item custom
+@item fade
+@item wipeleft
+@item wiperight
+@item wipeup
+@item wipedown
+@item slideleft
+@item slideright
+@item slideup
+@item slidedown
+@item circlecrop
+@item rectcrop
+@item distance
+@item fadeblack
+@item fadewhite
+@item radial
+@item smoothleft
+@item smoothright
+@item smoothup
+@item smoothdown
+@item circleopen
+@item circleclose
+@item vertopen
+@item vertclose
+@item horzopen
+@item horzclose
+@item dissolve
+@item pixelize
+@item diagtl
+@item diagtr
+@item diagbl
+@item diagbr
+@item hlslice
+@item hrslice
+@item vuslice
+@item vdslice
+@end table
+Default transition effect is fade.
+
+@item duration
+Set cross fade duration in seconds.
+Default duration is 1 second.
+
+@item offset
+Set cross fade start relative to first input stream in seconds.
+Default offset is 0.
+
+@item expr
+Set expression for custom transition effect.
+
+The expressions can use the following variables and functions:
+
+@table @option
+@item X
+@item Y
+The coordinates of the current sample.
+
+@item W
+@item H
+The width and height of the image.
+
+@item P
+Progress of transition effect.
+
+@item PLANE
+Currently processed plane.
+
+@item A
+Return value of first input at current location and plane.
+
+@item B
+Return value of second input at current location and plane.
+
+@item a0(x, y)
+@item a1(x, y)
+@item a2(x, y)
+@item a3(x, y)
+Return the value of the pixel at location (@var{x},@var{y}) of the
+first/second/third/fourth component of first input.
+
+@item b0(x, y)
+@item b1(x, y)
+@item b2(x, y)
+@item b3(x, y)
+Return the value of the pixel at location (@var{x},@var{y}) of the
+first/second/third/fourth component of second input.
+@end table
+@end table
+
+@subsection Examples
+
+@itemize
+@item
+Cross fade from one input video to another input video, with fade transition and duration of transition
+of 2 seconds starting at offset of 5 seconds:
+@example
+ffmpeg -i first.mp4 -i second.mp4 -filter_complex xfade=transition=fade:duration=2:offset=5 output.mp4
+@end example
+@end itemize
+
+@section xmedian
+Pick median pixels from several input videos.
+
+The filter accepts the following options:
+
+@table @option
+@item inputs
+Set number of inputs.
+Default is 3. Allowed range is from 3 to 255.
+If number of inputs is even number, than result will be mean value between two median values.
+
+@item planes
+Set which planes to filter. Default value is @code{15}, by which all planes are processed.
+
+@item percentile
+Set median percentile. Default value is @code{0.5}.
+Default value of @code{0.5} will pick always median values, while @code{0} will pick
+minimum values, and @code{1} maximum values.
+@end table
+
+@section xstack
+Stack video inputs into custom layout.
+
+All streams must be of same pixel format.
+
+The filter accepts the following options:
+
+@table @option
+@item inputs
+Set number of input streams. Default is 2.
+
+@item layout
+Specify layout of inputs.
+This option requires the desired layout configuration to be explicitly set by the user.
+This sets position of each video input in output. Each input
+is separated by '|'.
+The first number represents the column, and the second number represents the row.
+Numbers start at 0 and are separated by '_'. Optionally one can use wX and hX,
+where X is video input from which to take width or height.
+Multiple values can be used when separated by '+'. In such
+case values are summed together.
+
+Note that if inputs are of different sizes gaps may appear, as not all of
+the output video frame will be filled. Similarly, videos can overlap each
+other if their position doesn't leave enough space for the full frame of
+adjoining videos.
+
+For 2 inputs, a default layout of @code{0_0|w0_0} is set. In all other cases,
+a layout must be set by the user.
+
+@item shortest
+If set to 1, force the output to terminate when the shortest input
+terminates. Default value is 0.
+
+@item fill
+If set to valid color, all unused pixels will be filled with that color.
+By default fill is set to none, so it is disabled.
+@end table
+
+@subsection Examples
+
+@itemize
+@item
+Display 4 inputs into 2x2 grid.
+
+Layout:
+@example
+input1(0, 0)  | input3(w0, 0)
+input2(0, h0) | input4(w0, h0)
+@end example
+
+@example
+xstack=inputs=4:layout=0_0|0_h0|w0_0|w0_h0
+@end example
+
+Note that if inputs are of different sizes, gaps or overlaps may occur.
+
+@item
+Display 4 inputs into 1x4 grid.
+
+Layout:
+@example
+input1(0, 0)
+input2(0, h0)
+input3(0, h0+h1)
+input4(0, h0+h1+h2)
+@end example
+
+@example
+xstack=inputs=4:layout=0_0|0_h0|0_h0+h1|0_h0+h1+h2
+@end example
+
+Note that if inputs are of different widths, unused space will appear.
+
+@item
+Display 9 inputs into 3x3 grid.
+
+Layout:
+@example
+input1(0, 0)       | input4(w0, 0)      | input7(w0+w3, 0)
+input2(0, h0)      | input5(w0, h0)     | input8(w0+w3, h0)
+input3(0, h0+h1)   | input6(w0, h0+h1)  | input9(w0+w3, h0+h1)
+@end example
+
+@example
+xstack=inputs=9:layout=0_0|0_h0|0_h0+h1|w0_0|w0_h0|w0_h0+h1|w0+w3_0|w0+w3_h0|w0+w3_h0+h1
+@end example
+
+Note that if inputs are of different sizes, gaps or overlaps may occur.
+
+@item
+Display 16 inputs into 4x4 grid.
+
+Layout:
+@example
+input1(0, 0)       | input5(w0, 0)       | input9 (w0+w4, 0)       | input13(w0+w4+w8, 0)
+input2(0, h0)      | input6(w0, h0)      | input10(w0+w4, h0)      | input14(w0+w4+w8, h0)
+input3(0, h0+h1)   | input7(w0, h0+h1)   | input11(w0+w4, h0+h1)   | input15(w0+w4+w8, h0+h1)
+input4(0, h0+h1+h2)| input8(w0, h0+h1+h2)| input12(w0+w4, h0+h1+h2)| input16(w0+w4+w8, h0+h1+h2)
+@end example
+
+@example
+xstack=inputs=16:layout=0_0|0_h0|0_h0+h1|0_h0+h1+h2|w0_0|w0_h0|w0_h0+h1|w0_h0+h1+h2|w0+w4_0|
+w0+w4_h0|w0+w4_h0+h1|w0+w4_h0+h1+h2|w0+w4+w8_0|w0+w4+w8_h0|w0+w4+w8_h0+h1|w0+w4+w8_h0+h1+h2
+@end example
+
+Note that if inputs are of different sizes, gaps or overlaps may occur.
+
+@end itemize
+
 @anchor{yadif}
 @section yadif
 
@@ -17632,7 +20422,7 @@
 top field first will be assumed.
 
 @item deint
-Specify which frames to deinterlace. Accept one of the following
+Specify which frames to deinterlace. Accepts one of the following
 values:
 
 @table @option
@@ -17645,6 +20435,86 @@
 The default value is @code{all}.
 @end table
 
+@section yadif_cuda
+
+Deinterlace the input video using the @ref{yadif} algorithm, but implemented
+in CUDA so that it can work as part of a GPU accelerated pipeline with nvdec
+and/or nvenc.
+
+It accepts the following parameters:
+
+
+@table @option
+
+@item mode
+The interlacing mode to adopt. It accepts one of the following values:
+
+@table @option
+@item 0, send_frame
+Output one frame for each frame.
+@item 1, send_field
+Output one frame for each field.
+@item 2, send_frame_nospatial
+Like @code{send_frame}, but it skips the spatial interlacing check.
+@item 3, send_field_nospatial
+Like @code{send_field}, but it skips the spatial interlacing check.
+@end table
+
+The default value is @code{send_frame}.
+
+@item parity
+The picture field parity assumed for the input interlaced video. It accepts one
+of the following values:
+
+@table @option
+@item 0, tff
+Assume the top field is first.
+@item 1, bff
+Assume the bottom field is first.
+@item -1, auto
+Enable automatic detection of field parity.
+@end table
+
+The default value is @code{auto}.
+If the interlacing is unknown or the decoder does not export this information,
+top field first will be assumed.
+
+@item deint
+Specify which frames to deinterlace. Accepts one of the following
+values:
+
+@table @option
+@item 0, all
+Deinterlace all frames.
+@item 1, interlaced
+Only deinterlace frames marked as interlaced.
+@end table
+
+The default value is @code{all}.
+@end table
+
+@section yaepblur
+
+Apply blur filter while preserving edges ("yaepblur" means "yet another edge preserving blur filter").
+The algorithm is described in
+"J. S. Lee, Digital image enhancement and noise filtering by use of local statistics, IEEE Trans. Pattern Anal. Mach. Intell. PAMI-2, 1980."
+
+It accepts the following parameters:
+
+@table @option
+@item radius, r
+Set the window radius. Default value is 3.
+
+@item planes, p
+Set which planes to filter. Default is only the first plane.
+
+@item sigma, s
+Set blur strength. Default value is 128.
+@end table
+
+@subsection Commands
+This filter supports same @ref{commands} as options.
+
 @section zoompan
 
 Apply Zoom & Pan effect.
@@ -17653,7 +20523,7 @@
 
 @table @option
 @item zoom, z
-Set the zoom expression. Default is 1.
+Set the zoom expression. Range is 1-10. Default is 1.
 
 @item x
 @item y
@@ -18009,11 +20879,1071 @@
 pixel format "yuv422p" @var{hsub} is 2 and @var{vsub} is 1.
 @end table
 
+@subsection Commands
+
+This filter supports the following commands:
 @table @option
+@item width, w
+@item height, h
+Set the output video dimension expression.
+The command accepts the same syntax of the corresponding option.
+
+If the specified expression is not valid, it is kept at its current
+value.
 @end table
 
 @c man end VIDEO FILTERS
 
+@chapter OpenCL Video Filters
+@c man begin OPENCL VIDEO FILTERS
+
+Below is a description of the currently available OpenCL video filters.
+
+To enable compilation of these filters you need to configure FFmpeg with
+@code{--enable-opencl}.
+
+Running OpenCL filters requires you to initialize a hardware device and to pass that device to all filters in any filter graph.
+@table @option
+
+@item -init_hw_device opencl[=@var{name}][:@var{device}[,@var{key=value}...]]
+Initialise a new hardware device of type @var{opencl} called @var{name}, using the
+given device parameters.
+
+@item -filter_hw_device @var{name}
+Pass the hardware device called @var{name} to all filters in any filter graph.
+
+@end table
+
+For more detailed information see @url{https://www.ffmpeg.org/ffmpeg.html#Advanced-Video-options}
+
+@itemize
+@item
+Example of choosing the first device on the second platform and running avgblur_opencl filter with default parameters on it.
+@example
+-init_hw_device opencl=gpu:1.0 -filter_hw_device gpu -i INPUT -vf "hwupload, avgblur_opencl, hwdownload" OUTPUT
+@end example
+@end itemize
+
+Since OpenCL filters are not able to access frame data in normal memory, all frame data needs to be uploaded(@ref{hwupload}) to hardware surfaces connected to the appropriate device before being used and then downloaded(@ref{hwdownload}) back to normal memory. Note that @ref{hwupload} will upload to a surface with the same layout as the software frame, so it may be necessary to add a @ref{format} filter immediately before to get the input into the right format and @ref{hwdownload} does not support all formats on the output - it may be necessary to insert an additional @ref{format} filter immediately following in the graph to get the output in a supported format.
+
+@section avgblur_opencl
+
+Apply average blur filter.
+
+The filter accepts the following options:
+
+@table @option
+@item sizeX
+Set horizontal radius size.
+Range is @code{[1, 1024]} and default value is @code{1}.
+
+@item planes
+Set which planes to filter. Default value is @code{0xf}, by which all planes are processed.
+
+@item sizeY
+Set vertical radius size. Range is @code{[1, 1024]} and default value is @code{0}. If zero, @code{sizeX} value will be used.
+@end table
+
+@subsection Example
+
+@itemize
+@item
+Apply average blur filter with horizontal and vertical size of 3, setting each pixel of the output to the average value of the 7x7 region centered on it in the input. For pixels on the edges of the image, the region does not extend beyond the image boundaries, and so out-of-range coordinates are not used in the calculations.
+@example
+-i INPUT -vf "hwupload, avgblur_opencl=3, hwdownload" OUTPUT
+@end example
+@end itemize
+
+@section boxblur_opencl
+
+Apply a boxblur algorithm to the input video.
+
+It accepts the following parameters:
+
+@table @option
+
+@item luma_radius, lr
+@item luma_power, lp
+@item chroma_radius, cr
+@item chroma_power, cp
+@item alpha_radius, ar
+@item alpha_power, ap
+
+@end table
+
+A description of the accepted options follows.
+
+@table @option
+@item luma_radius, lr
+@item chroma_radius, cr
+@item alpha_radius, ar
+Set an expression for the box radius in pixels used for blurring the
+corresponding input plane.
+
+The radius value must be a non-negative number, and must not be
+greater than the value of the expression @code{min(w,h)/2} for the
+luma and alpha planes, and of @code{min(cw,ch)/2} for the chroma
+planes.
+
+Default value for @option{luma_radius} is "2". If not specified,
+@option{chroma_radius} and @option{alpha_radius} default to the
+corresponding value set for @option{luma_radius}.
+
+The expressions can contain the following constants:
+@table @option
+@item w
+@item h
+The input width and height in pixels.
+
+@item cw
+@item ch
+The input chroma image width and height in pixels.
+
+@item hsub
+@item vsub
+The horizontal and vertical chroma subsample values. For example, for the
+pixel format "yuv422p", @var{hsub} is 2 and @var{vsub} is 1.
+@end table
+
+@item luma_power, lp
+@item chroma_power, cp
+@item alpha_power, ap
+Specify how many times the boxblur filter is applied to the
+corresponding plane.
+
+Default value for @option{luma_power} is 2. If not specified,
+@option{chroma_power} and @option{alpha_power} default to the
+corresponding value set for @option{luma_power}.
+
+A value of 0 will disable the effect.
+@end table
+
+@subsection Examples
+
+Apply boxblur filter, setting each pixel of the output to the average value of box-radiuses @var{luma_radius}, @var{chroma_radius}, @var{alpha_radius} for each plane respectively. The filter will apply @var{luma_power}, @var{chroma_power}, @var{alpha_power} times onto the corresponding plane. For pixels on the edges of the image, the radius does not extend beyond the image boundaries, and so out-of-range coordinates are not used in the calculations.
+
+@itemize
+@item
+Apply a boxblur filter with the luma, chroma, and alpha radius
+set to 2 and luma, chroma, and alpha power set to 3. The filter will run 3 times with box-radius set to 2 for every plane of the image.
+@example
+-i INPUT -vf "hwupload, boxblur_opencl=luma_radius=2:luma_power=3, hwdownload" OUTPUT
+-i INPUT -vf "hwupload, boxblur_opencl=2:3, hwdownload" OUTPUT
+@end example
+
+@item
+Apply a boxblur filter with luma radius set to 2, luma_power to 1, chroma_radius to 4, chroma_power to 5, alpha_radius to 3 and alpha_power to 7.
+
+For the luma plane, a 2x2 box radius will be run once.
+
+For the chroma plane, a 4x4 box radius will be run 5 times.
+
+For the alpha plane, a 3x3 box radius will be run 7 times.
+@example
+-i INPUT -vf "hwupload, boxblur_opencl=2:1:4:5:3:7, hwdownload" OUTPUT
+@end example
+@end itemize
+
+@section colorkey_opencl
+RGB colorspace color keying.
+
+The filter accepts the following options:
+
+@table @option
+@item color
+The color which will be replaced with transparency.
+
+@item similarity
+Similarity percentage with the key color.
+
+0.01 matches only the exact key color, while 1.0 matches everything.
+
+@item blend
+Blend percentage.
+
+0.0 makes pixels either fully transparent, or not transparent at all.
+
+Higher values result in semi-transparent pixels, with a higher transparency
+the more similar the pixels color is to the key color.
+@end table
+
+@subsection Examples
+
+@itemize
+@item
+Make every semi-green pixel in the input transparent with some slight blending:
+@example
+-i INPUT -vf "hwupload, colorkey_opencl=green:0.3:0.1, hwdownload" OUTPUT
+@end example
+@end itemize
+
+@section convolution_opencl
+
+Apply convolution of 3x3, 5x5, 7x7 matrix.
+
+The filter accepts the following options:
+
+@table @option
+@item 0m
+@item 1m
+@item 2m
+@item 3m
+Set matrix for each plane.
+Matrix is sequence of 9, 25 or 49 signed numbers.
+Default value for each plane is @code{0 0 0 0 1 0 0 0 0}.
+
+@item 0rdiv
+@item 1rdiv
+@item 2rdiv
+@item 3rdiv
+Set multiplier for calculated value for each plane.
+If unset or 0, it will be sum of all matrix elements.
+The option value must be a float number greater or equal to @code{0.0}. Default value is @code{1.0}.
+
+@item 0bias
+@item 1bias
+@item 2bias
+@item 3bias
+Set bias for each plane. This value is added to the result of the multiplication.
+Useful for making the overall image brighter or darker.
+The option value must be a float number greater or equal to @code{0.0}. Default value is @code{0.0}.
+
+@end table
+
+@subsection Examples
+
+@itemize
+@item
+Apply sharpen:
+@example
+-i INPUT -vf "hwupload, convolution_opencl=0 -1 0 -1 5 -1 0 -1 0:0 -1 0 -1 5 -1 0 -1 0:0 -1 0 -1 5 -1 0 -1 0:0 -1 0 -1 5 -1 0 -1 0, hwdownload" OUTPUT
+@end example
+
+@item
+Apply blur:
+@example
+-i INPUT -vf "hwupload, convolution_opencl=1 1 1 1 1 1 1 1 1:1 1 1 1 1 1 1 1 1:1 1 1 1 1 1 1 1 1:1 1 1 1 1 1 1 1 1:1/9:1/9:1/9:1/9, hwdownload" OUTPUT
+@end example
+
+@item
+Apply edge enhance:
+@example
+-i INPUT -vf "hwupload, convolution_opencl=0 0 0 -1 1 0 0 0 0:0 0 0 -1 1 0 0 0 0:0 0 0 -1 1 0 0 0 0:0 0 0 -1 1 0 0 0 0:5:1:1:1:0:128:128:128, hwdownload" OUTPUT
+@end example
+
+@item
+Apply edge detect:
+@example
+-i INPUT -vf "hwupload, convolution_opencl=0 1 0 1 -4 1 0 1 0:0 1 0 1 -4 1 0 1 0:0 1 0 1 -4 1 0 1 0:0 1 0 1 -4 1 0 1 0:5:5:5:1:0:128:128:128, hwdownload" OUTPUT
+@end example
+
+@item
+Apply laplacian edge detector which includes diagonals:
+@example
+-i INPUT -vf "hwupload, convolution_opencl=1 1 1 1 -8 1 1 1 1:1 1 1 1 -8 1 1 1 1:1 1 1 1 -8 1 1 1 1:1 1 1 1 -8 1 1 1 1:5:5:5:1:0:128:128:0, hwdownload" OUTPUT
+@end example
+
+@item
+Apply emboss:
+@example
+-i INPUT -vf "hwupload, convolution_opencl=-2 -1 0 -1 1 1 0 1 2:-2 -1 0 -1 1 1 0 1 2:-2 -1 0 -1 1 1 0 1 2:-2 -1 0 -1 1 1 0 1 2, hwdownload" OUTPUT
+@end example
+@end itemize
+
+@section erosion_opencl
+
+Apply erosion effect to the video.
+
+This filter replaces the pixel by the local(3x3) minimum.
+
+It accepts the following options:
+
+@table @option
+@item threshold0
+@item threshold1
+@item threshold2
+@item threshold3
+Limit the maximum change for each plane. Range is @code{[0, 65535]} and default value is @code{65535}.
+If @code{0}, plane will remain unchanged.
+
+@item coordinates
+Flag which specifies the pixel to refer to.
+Range is @code{[0, 255]} and default value is @code{255}, i.e. all eight pixels are used.
+
+Flags to local 3x3 coordinates region centered on @code{x}:
+
+    1 2 3
+
+    4 x 5
+
+    6 7 8
+@end table
+
+@subsection Example
+
+@itemize
+@item
+Apply erosion filter with threshold0 set to 30, threshold1 set 40, threshold2 set to 50 and coordinates set to 231, setting each pixel of the output to the local minimum between pixels: 1, 2, 3, 6, 7, 8 of the 3x3 region centered on it in the input. If the difference between input pixel and local minimum is more then threshold of the corresponding plane, output pixel will be set to input pixel - threshold of corresponding plane.
+@example
+-i INPUT -vf "hwupload, erosion_opencl=30:40:50:coordinates=231, hwdownload" OUTPUT
+@end example
+@end itemize
+
+@section deshake_opencl
+Feature-point based video stabilization filter.
+
+The filter accepts the following options:
+
+@table @option
+@item tripod
+Simulates a tripod by preventing any camera movement whatsoever from the original frame. Defaults to @code{0}.
+
+@item debug
+Whether or not additional debug info should be displayed, both in the processed output and in the console.
+
+Note that in order to see console debug output you will also need to pass @code{-v verbose} to ffmpeg.
+
+Viewing point matches in the output video is only supported for RGB input.
+
+Defaults to @code{0}.
+
+@item adaptive_crop
+Whether or not to do a tiny bit of cropping at the borders to cut down on the amount of mirrored pixels.
+
+Defaults to @code{1}.
+
+@item refine_features
+Whether or not feature points should be refined at a sub-pixel level.
+
+This can be turned off for a slight performance gain at the cost of precision.
+
+Defaults to @code{1}.
+
+@item smooth_strength
+The strength of the smoothing applied to the camera path from @code{0.0} to @code{1.0}.
+
+@code{1.0} is the maximum smoothing strength while values less than that result in less smoothing.
+
+@code{0.0} causes the filter to adaptively choose a smoothing strength on a per-frame basis.
+
+Defaults to @code{0.0}.
+
+@item smooth_window_multiplier
+Controls the size of the smoothing window (the number of frames buffered to determine motion information from).
+
+The size of the smoothing window is determined by multiplying the framerate of the video by this number.
+
+Acceptable values range from @code{0.1} to @code{10.0}.
+
+Larger values increase the amount of motion data available for determining how to smooth the camera path,
+potentially improving smoothness, but also increase latency and memory usage.
+
+Defaults to @code{2.0}.
+
+@end table
+
+@subsection Examples
+
+@itemize
+@item
+Stabilize a video with a fixed, medium smoothing strength:
+@example
+-i INPUT -vf "hwupload, deshake_opencl=smooth_strength=0.5, hwdownload" OUTPUT
+@end example
+
+@item
+Stabilize a video with debugging (both in console and in rendered video):
+@example
+-i INPUT -filter_complex "[0:v]format=rgba, hwupload, deshake_opencl=debug=1, hwdownload, format=rgba, format=yuv420p" -v verbose OUTPUT
+@end example
+@end itemize
+
+@section dilation_opencl
+
+Apply dilation effect to the video.
+
+This filter replaces the pixel by the local(3x3) maximum.
+
+It accepts the following options:
+
+@table @option
+@item threshold0
+@item threshold1
+@item threshold2
+@item threshold3
+Limit the maximum change for each plane. Range is @code{[0, 65535]} and default value is @code{65535}.
+If @code{0}, plane will remain unchanged.
+
+@item coordinates
+Flag which specifies the pixel to refer to.
+Range is @code{[0, 255]} and default value is @code{255}, i.e. all eight pixels are used.
+
+Flags to local 3x3 coordinates region centered on @code{x}:
+
+    1 2 3
+
+    4 x 5
+
+    6 7 8
+@end table
+
+@subsection Example
+
+@itemize
+@item
+Apply dilation filter with threshold0 set to 30, threshold1 set 40, threshold2 set to 50 and coordinates set to 231, setting each pixel of the output to the local maximum between pixels: 1, 2, 3, 6, 7, 8 of the 3x3 region centered on it in the input. If the difference between input pixel and local maximum is more then threshold of the corresponding plane, output pixel will be set to input pixel + threshold of corresponding plane.
+@example
+-i INPUT -vf "hwupload, dilation_opencl=30:40:50:coordinates=231, hwdownload" OUTPUT
+@end example
+@end itemize
+
+@section nlmeans_opencl
+
+Non-local Means denoise filter through OpenCL, this filter accepts same options as @ref{nlmeans}.
+
+@section overlay_opencl
+
+Overlay one video on top of another.
+
+It takes two inputs and has one output. The first input is the "main" video on which the second input is overlaid.
+This filter requires same memory layout for all the inputs. So, format conversion may be needed.
+
+The filter accepts the following options:
+
+@table @option
+
+@item x
+Set the x coordinate of the overlaid video on the main video.
+Default value is @code{0}.
+
+@item y
+Set the y coordinate of the overlaid video on the main video.
+Default value is @code{0}.
+
+@end table
+
+@subsection Examples
+
+@itemize
+@item
+Overlay an image LOGO at the top-left corner of the INPUT video. Both inputs are yuv420p format.
+@example
+-i INPUT -i LOGO -filter_complex "[0:v]hwupload[a], [1:v]format=yuv420p, hwupload[b], [a][b]overlay_opencl, hwdownload" OUTPUT
+@end example
+@item
+The inputs have same memory layout for color channels , the overlay has additional alpha plane, like INPUT is yuv420p, and the LOGO is yuva420p.
+@example
+-i INPUT -i LOGO -filter_complex "[0:v]hwupload[a], [1:v]format=yuva420p, hwupload[b], [a][b]overlay_opencl, hwdownload" OUTPUT
+@end example
+
+@end itemize
+
+@section pad_opencl
+
+Add paddings to the input image, and place the original input at the
+provided @var{x}, @var{y} coordinates.
+
+It accepts the following options:
+
+@table @option
+@item width, w
+@item height, h
+Specify an expression for the size of the output image with the
+paddings added. If the value for @var{width} or @var{height} is 0, the
+corresponding input size is used for the output.
+
+The @var{width} expression can reference the value set by the
+@var{height} expression, and vice versa.
+
+The default value of @var{width} and @var{height} is 0.
+
+@item x
+@item y
+Specify the offsets to place the input image at within the padded area,
+with respect to the top/left border of the output image.
+
+The @var{x} expression can reference the value set by the @var{y}
+expression, and vice versa.
+
+The default value of @var{x} and @var{y} is 0.
+
+If @var{x} or @var{y} evaluate to a negative number, they'll be changed
+so the input image is centered on the padded area.
+
+@item color
+Specify the color of the padded area. For the syntax of this option,
+check the @ref{color syntax,,"Color" section in the ffmpeg-utils
+manual,ffmpeg-utils}.
+
+@item aspect
+Pad to an aspect instead to a resolution.
+@end table
+
+The value for the @var{width}, @var{height}, @var{x}, and @var{y}
+options are expressions containing the following constants:
+
+@table @option
+@item in_w
+@item in_h
+The input video width and height.
+
+@item iw
+@item ih
+These are the same as @var{in_w} and @var{in_h}.
+
+@item out_w
+@item out_h
+The output width and height (the size of the padded area), as
+specified by the @var{width} and @var{height} expressions.
+
+@item ow
+@item oh
+These are the same as @var{out_w} and @var{out_h}.
+
+@item x
+@item y
+The x and y offsets as specified by the @var{x} and @var{y}
+expressions, or NAN if not yet specified.
+
+@item a
+same as @var{iw} / @var{ih}
+
+@item sar
+input sample aspect ratio
+
+@item dar
+input display aspect ratio, it is the same as (@var{iw} / @var{ih}) * @var{sar}
+@end table
+
+@section prewitt_opencl
+
+Apply the Prewitt operator (@url{https://en.wikipedia.org/wiki/Prewitt_operator}) to input video stream.
+
+The filter accepts the following option:
+
+@table @option
+@item planes
+Set which planes to filter. Default value is @code{0xf}, by which all planes are processed.
+
+@item scale
+Set value which will be multiplied with filtered result.
+Range is @code{[0.0, 65535]} and default value is @code{1.0}.
+
+@item delta
+Set value which will be added to filtered result.
+Range is @code{[-65535, 65535]} and default value is @code{0.0}.
+@end table
+
+@subsection Example
+
+@itemize
+@item
+Apply the Prewitt operator with scale set to 2 and delta set to 10.
+@example
+-i INPUT -vf "hwupload, prewitt_opencl=scale=2:delta=10, hwdownload" OUTPUT
+@end example
+@end itemize
+
+@anchor{program_opencl}
+@section program_opencl
+
+Filter video using an OpenCL program.
+
+@table @option
+
+@item source
+OpenCL program source file.
+
+@item kernel
+Kernel name in program.
+
+@item inputs
+Number of inputs to the filter.  Defaults to 1.
+
+@item size, s
+Size of output frames.  Defaults to the same as the first input.
+
+@end table
+
+The @code{program_opencl} filter also supports the @ref{framesync} options.
+
+The program source file must contain a kernel function with the given name,
+which will be run once for each plane of the output.  Each run on a plane
+gets enqueued as a separate 2D global NDRange with one work-item for each
+pixel to be generated.  The global ID offset for each work-item is therefore
+the coordinates of a pixel in the destination image.
+
+The kernel function needs to take the following arguments:
+@itemize
+@item
+Destination image, @var{__write_only image2d_t}.
+
+This image will become the output; the kernel should write all of it.
+@item
+Frame index, @var{unsigned int}.
+
+This is a counter starting from zero and increasing by one for each frame.
+@item
+Source images, @var{__read_only image2d_t}.
+
+These are the most recent images on each input.  The kernel may read from
+them to generate the output, but they can't be written to.
+@end itemize
+
+Example programs:
+
+@itemize
+@item
+Copy the input to the output (output must be the same size as the input).
+@verbatim
+__kernel void copy(__write_only image2d_t destination,
+                   unsigned int index,
+                   __read_only  image2d_t source)
+{
+    const sampler_t sampler = CLK_NORMALIZED_COORDS_FALSE;
+
+    int2 location = (int2)(get_global_id(0), get_global_id(1));
+
+    float4 value = read_imagef(source, sampler, location);
+
+    write_imagef(destination, location, value);
+}
+@end verbatim
+
+@item
+Apply a simple transformation, rotating the input by an amount increasing
+with the index counter.  Pixel values are linearly interpolated by the
+sampler, and the output need not have the same dimensions as the input.
+@verbatim
+__kernel void rotate_image(__write_only image2d_t dst,
+                           unsigned int index,
+                           __read_only  image2d_t src)
+{
+    const sampler_t sampler = (CLK_NORMALIZED_COORDS_FALSE |
+                               CLK_FILTER_LINEAR);
+
+    float angle = (float)index / 100.0f;
+
+    float2 dst_dim = convert_float2(get_image_dim(dst));
+    float2 src_dim = convert_float2(get_image_dim(src));
+
+    float2 dst_cen = dst_dim / 2.0f;
+    float2 src_cen = src_dim / 2.0f;
+
+    int2   dst_loc = (int2)(get_global_id(0), get_global_id(1));
+
+    float2 dst_pos = convert_float2(dst_loc) - dst_cen;
+    float2 src_pos = {
+        cos(angle) * dst_pos.x - sin(angle) * dst_pos.y,
+        sin(angle) * dst_pos.x + cos(angle) * dst_pos.y
+    };
+    src_pos = src_pos * src_dim / dst_dim;
+
+    float2 src_loc = src_pos + src_cen;
+
+    if (src_loc.x < 0.0f      || src_loc.y < 0.0f ||
+        src_loc.x > src_dim.x || src_loc.y > src_dim.y)
+        write_imagef(dst, dst_loc, 0.5f);
+    else
+        write_imagef(dst, dst_loc, read_imagef(src, sampler, src_loc));
+}
+@end verbatim
+
+@item
+Blend two inputs together, with the amount of each input used varying
+with the index counter.
+@verbatim
+__kernel void blend_images(__write_only image2d_t dst,
+                           unsigned int index,
+                           __read_only  image2d_t src1,
+                           __read_only  image2d_t src2)
+{
+    const sampler_t sampler = (CLK_NORMALIZED_COORDS_FALSE |
+                               CLK_FILTER_LINEAR);
+
+    float blend = (cos((float)index / 50.0f) + 1.0f) / 2.0f;
+
+    int2  dst_loc = (int2)(get_global_id(0), get_global_id(1));
+    int2 src1_loc = dst_loc * get_image_dim(src1) / get_image_dim(dst);
+    int2 src2_loc = dst_loc * get_image_dim(src2) / get_image_dim(dst);
+
+    float4 val1 = read_imagef(src1, sampler, src1_loc);
+    float4 val2 = read_imagef(src2, sampler, src2_loc);
+
+    write_imagef(dst, dst_loc, val1 * blend + val2 * (1.0f - blend));
+}
+@end verbatim
+
+@end itemize
+
+@section roberts_opencl
+Apply the Roberts cross operator (@url{https://en.wikipedia.org/wiki/Roberts_cross}) to input video stream.
+
+The filter accepts the following option:
+
+@table @option
+@item planes
+Set which planes to filter. Default value is @code{0xf}, by which all planes are processed.
+
+@item scale
+Set value which will be multiplied with filtered result.
+Range is @code{[0.0, 65535]} and default value is @code{1.0}.
+
+@item delta
+Set value which will be added to filtered result.
+Range is @code{[-65535, 65535]} and default value is @code{0.0}.
+@end table
+
+@subsection Example
+
+@itemize
+@item
+Apply the Roberts cross operator with scale set to 2 and delta set to 10
+@example
+-i INPUT -vf "hwupload, roberts_opencl=scale=2:delta=10, hwdownload" OUTPUT
+@end example
+@end itemize
+
+@section sobel_opencl
+
+Apply the Sobel operator (@url{https://en.wikipedia.org/wiki/Sobel_operator}) to input video stream.
+
+The filter accepts the following option:
+
+@table @option
+@item planes
+Set which planes to filter. Default value is @code{0xf}, by which all planes are processed.
+
+@item scale
+Set value which will be multiplied with filtered result.
+Range is @code{[0.0, 65535]} and default value is @code{1.0}.
+
+@item delta
+Set value which will be added to filtered result.
+Range is @code{[-65535, 65535]} and default value is @code{0.0}.
+@end table
+
+@subsection Example
+
+@itemize
+@item
+Apply sobel operator with scale set to 2 and delta set to 10
+@example
+-i INPUT -vf "hwupload, sobel_opencl=scale=2:delta=10, hwdownload" OUTPUT
+@end example
+@end itemize
+
+@section tonemap_opencl
+
+Perform HDR(PQ/HLG) to SDR conversion with tone-mapping.
+
+It accepts the following parameters:
+
+@table @option
+@item tonemap
+Specify the tone-mapping operator to be used. Same as tonemap option in @ref{tonemap}.
+
+@item param
+Tune the tone mapping algorithm. same as param option in @ref{tonemap}.
+
+@item desat
+Apply desaturation for highlights that exceed this level of brightness. The
+higher the parameter, the more color information will be preserved. This
+setting helps prevent unnaturally blown-out colors for super-highlights, by
+(smoothly) turning into white instead. This makes images feel more natural,
+at the cost of reducing information about out-of-range colors.
+
+The default value is 0.5, and the algorithm here is a little different from
+the cpu version tonemap currently. A setting of 0.0 disables this option.
+
+@item threshold
+The tonemapping algorithm parameters is fine-tuned per each scene. And a threshold
+is used to detect whether the scene has changed or not. If the distance between
+the current frame average brightness and the current running average exceeds
+a threshold value, we would re-calculate scene average and peak brightness.
+The default value is 0.2.
+
+@item format
+Specify the output pixel format.
+
+Currently supported formats are:
+@table @var
+@item p010
+@item nv12
+@end table
+
+@item range, r
+Set the output color range.
+
+Possible values are:
+@table @var
+@item tv/mpeg
+@item pc/jpeg
+@end table
+
+Default is same as input.
+
+@item primaries, p
+Set the output color primaries.
+
+Possible values are:
+@table @var
+@item bt709
+@item bt2020
+@end table
+
+Default is same as input.
+
+@item transfer, t
+Set the output transfer characteristics.
+
+Possible values are:
+@table @var
+@item bt709
+@item bt2020
+@end table
+
+Default is bt709.
+
+@item matrix, m
+Set the output colorspace matrix.
+
+Possible value are:
+@table @var
+@item bt709
+@item bt2020
+@end table
+
+Default is same as input.
+
+@end table
+
+@subsection Example
+
+@itemize
+@item
+Convert HDR(PQ/HLG) video to bt2020-transfer-characteristic p010 format using linear operator.
+@example
+-i INPUT -vf "format=p010,hwupload,tonemap_opencl=t=bt2020:tonemap=linear:format=p010,hwdownload,format=p010" OUTPUT
+@end example
+@end itemize
+
+@section unsharp_opencl
+
+Sharpen or blur the input video.
+
+It accepts the following parameters:
+
+@table @option
+@item luma_msize_x, lx
+Set the luma matrix horizontal size.
+Range is @code{[1, 23]} and default value is @code{5}.
+
+@item luma_msize_y, ly
+Set the luma matrix vertical size.
+Range is @code{[1, 23]} and default value is @code{5}.
+
+@item luma_amount, la
+Set the luma effect strength.
+Range is @code{[-10, 10]} and default value is @code{1.0}.
+
+Negative values will blur the input video, while positive values will
+sharpen it, a value of zero will disable the effect.
+
+@item chroma_msize_x, cx
+Set the chroma matrix horizontal size.
+Range is @code{[1, 23]} and default value is @code{5}.
+
+@item chroma_msize_y, cy
+Set the chroma matrix vertical size.
+Range is @code{[1, 23]} and default value is @code{5}.
+
+@item chroma_amount, ca
+Set the chroma effect strength.
+Range is @code{[-10, 10]} and default value is @code{0.0}.
+
+Negative values will blur the input video, while positive values will
+sharpen it, a value of zero will disable the effect.
+
+@end table
+
+All parameters are optional and default to the equivalent of the
+string '5:5:1.0:5:5:0.0'.
+
+@subsection Examples
+
+@itemize
+@item
+Apply strong luma sharpen effect:
+@example
+-i INPUT -vf "hwupload, unsharp_opencl=luma_msize_x=7:luma_msize_y=7:luma_amount=2.5, hwdownload" OUTPUT
+@end example
+
+@item
+Apply a strong blur of both luma and chroma parameters:
+@example
+-i INPUT -vf "hwupload, unsharp_opencl=7:7:-2:7:7:-2, hwdownload" OUTPUT
+@end example
+@end itemize
+
+@section xfade_opencl
+
+Cross fade two videos with custom transition effect by using OpenCL.
+
+It accepts the following options:
+
+@table @option
+@item transition
+Set one of possible transition effects.
+
+@table @option
+@item custom
+Select custom transition effect, the actual transition description
+will be picked from source and kernel options.
+
+@item fade
+@item wipeleft
+@item wiperight
+@item wipeup
+@item wipedown
+@item slideleft
+@item slideright
+@item slideup
+@item slidedown
+
+Default transition is fade.
+@end table
+
+@item source
+OpenCL program source file for custom transition.
+
+@item kernel
+Set name of kernel to use for custom transition from program source file.
+
+@item duration
+Set duration of video transition.
+
+@item offset
+Set time of start of transition relative to first video.
+@end table
+
+The program source file must contain a kernel function with the given name,
+which will be run once for each plane of the output.  Each run on a plane
+gets enqueued as a separate 2D global NDRange with one work-item for each
+pixel to be generated.  The global ID offset for each work-item is therefore
+the coordinates of a pixel in the destination image.
+
+The kernel function needs to take the following arguments:
+@itemize
+@item
+Destination image, @var{__write_only image2d_t}.
+
+This image will become the output; the kernel should write all of it.
+
+@item
+First Source image, @var{__read_only image2d_t}.
+Second Source image, @var{__read_only image2d_t}.
+
+These are the most recent images on each input.  The kernel may read from
+them to generate the output, but they can't be written to.
+
+@item
+Transition progress, @var{float}. This value is always between 0 and 1 inclusive.
+@end itemize
+
+Example programs:
+
+@itemize
+@item
+Apply dots curtain transition effect:
+@verbatim
+__kernel void blend_images(__write_only image2d_t dst,
+                           __read_only  image2d_t src1,
+                           __read_only  image2d_t src2,
+                           float progress)
+{
+    const sampler_t sampler = (CLK_NORMALIZED_COORDS_FALSE |
+                               CLK_FILTER_LINEAR);
+    int2  p = (int2)(get_global_id(0), get_global_id(1));
+    float2 rp = (float2)(get_global_id(0), get_global_id(1));
+    float2 dim = (float2)(get_image_dim(src1).x, get_image_dim(src1).y);
+    rp = rp / dim;
+
+    float2 dots = (float2)(20.0, 20.0);
+    float2 center = (float2)(0,0);
+    float2 unused;
+
+    float4 val1 = read_imagef(src1, sampler, p);
+    float4 val2 = read_imagef(src2, sampler, p);
+    bool next = distance(fract(rp * dots, &unused), (float2)(0.5, 0.5)) < (progress / distance(rp, center));
+
+    write_imagef(dst, p, next ? val1 : val2);
+}
+@end verbatim
+
+@end itemize
+
+@c man end OPENCL VIDEO FILTERS
+
+@chapter VAAPI Video Filters
+@c man begin VAAPI VIDEO FILTERS
+
+VAAPI Video filters are usually used with VAAPI decoder and VAAPI encoder. Below is a description of VAAPI video filters.
+
+To enable compilation of these filters you need to configure FFmpeg with
+@code{--enable-vaapi}.
+
+To use vaapi filters, you need to setup the vaapi device correctly. For more information, please read @url{https://trac.ffmpeg.org/wiki/Hardware/VAAPI}
+
+@section tonemap_vaapi
+
+Perform HDR(High Dynamic Range) to SDR(Standard Dynamic Range) conversion with tone-mapping.
+It maps the dynamic range of HDR10 content to the SDR content.
+It currently only accepts HDR10 as input.
+
+It accepts the following parameters:
+
+@table @option
+@item format
+Specify the output pixel format.
+
+Currently supported formats are:
+@table @var
+@item p010
+@item nv12
+@end table
+
+Default is nv12.
+
+@item primaries, p
+Set the output color primaries.
+
+Default is same as input.
+
+@item transfer, t
+Set the output transfer characteristics.
+
+Default is bt709.
+
+@item matrix, m
+Set the output colorspace matrix.
+
+Default is same as input.
+
+@end table
+
+@subsection Example
+
+@itemize
+@item
+Convert HDR(HDR10) video to bt2020-transfer-characteristic p010 format
+@example
+tonemap_vaapi=format=p010:t=bt2020-10
+@end example
+@end itemize
+
+@c man end VAAPI VIDEO FILTERS
+
 @chapter Video Sources
 @c man begin VIDEO SOURCES
 
@@ -18056,9 +21986,9 @@
 The sample (pixel) aspect ratio of the input video.
 
 @item sws_param
-Specify the optional parameters to be used for the scale filter which
-is automatically inserted when an input change is detected in the
-input size or format.
+This option is deprecated and ignored. Prepend @code{sws_flags=@var{flags};}
+to the filtergraph description to specify swscale flags for automatically
+inserted scalers. See @ref{Filtergraph syntax}.
 
 @item hw_frames_ctx
 When using a hardware pixel format, this should be a reference to an
@@ -18083,7 +22013,7 @@
 Alternatively, the options can be specified as a flat string, but this
 syntax is deprecated:
 
-@var{width}:@var{height}:@var{pix_fmt}:@var{time_base.num}:@var{time_base.den}:@var{pixel_aspect.num}:@var{pixel_aspect.den}[:@var{sws_param}]
+@var{width}:@var{height}:@var{pix_fmt}:@var{time_base.num}:@var{time_base.den}:@var{pixel_aspect.num}:@var{pixel_aspect.den}
 
 @section cellauto
 
@@ -18306,7 +22236,7 @@
 It shall assume one of following values:
 @table @option
 @item iteration_count
-Set iteration cound mode.
+Set iteration count mode.
 @item normalized_iteration_count
 set normalized iteration count mode.
 @end table
@@ -18374,6 +22304,9 @@
 @item ring2
 @item all
 
+@item max_frames, m
+Set the maximum number of frames generated for each test, default value is 30.
+
 @end table
 
 Default value is "all", which will cycle through the list of all tests.
@@ -18769,6 +22702,31 @@
 
 @end itemize
 
+@section sierpinski
+
+Generate a Sierpinski carpet/triangle fractal, and randomly pan around.
+
+This source accepts the following options:
+
+@table @option
+@item size, s
+Set frame size. For the syntax of this option, check the @ref{video size syntax,,"Video
+size" section in the ffmpeg-utils manual,ffmpeg-utils}. Default value is "640x480".
+
+@item rate, r
+Set frame rate, expressed as number of frames per second. Default
+value is "25".
+
+@item seed
+Set seed which is used for random panning.
+
+@item jump
+Set max jump for single pan destination. Allowed range is from 1 to 10000.
+
+@item type
+Set fractal type, can be default @code{carpet} or @code{triangle}.
+@end table
+
 @c man end VIDEO SOURCES
 
 @chapter Video Sinks
@@ -18824,6 +22782,15 @@
 by white color.
 @end table
 
+@section adrawgraph
+Draw a graph using input audio metadata.
+
+See @ref{drawgraph}
+
+@section agraphmonitor
+
+See @ref{graphmonitor}.
+
 @section ahistogram
 
 Convert input audio to a video output, displaying the volume histogram.
@@ -18884,7 +22851,7 @@
 
 @item acount
 Set how much frames to accumulate in histogram.
-Defauls is 1. Setting this to -1 accumulates all frames.
+Default is 1. Setting this to -1 accumulates all frames.
 
 @item rheight
 Set histogram ratio of window height.
@@ -18944,7 +22911,7 @@
 scope.
 
 The filter is used to measure the difference between channels of stereo
-audio stream. A monoaural signal, consisting of identical left and right
+audio stream. A monaural signal, consisting of identical left and right
 signal, results in straight vertical line. Any stereo separation is visible
 as a deviation from this line, creating a Lissajous figure.
 If the straight (or deviation from it) but horizontal line appears this
@@ -19185,119 +23152,19 @@
 Close the current segment and step to the next one
 @end table
 
-@section drawgraph, adrawgraph
-
-Draw a graph using input video or audio metadata.
-
-It accepts the following parameters:
-
-@table @option
-@item m1
-Set 1st frame metadata key from which metadata values will be used to draw a graph.
-
-@item fg1
-Set 1st foreground color expression.
-
-@item m2
-Set 2nd frame metadata key from which metadata values will be used to draw a graph.
-
-@item fg2
-Set 2nd foreground color expression.
-
-@item m3
-Set 3rd frame metadata key from which metadata values will be used to draw a graph.
-
-@item fg3
-Set 3rd foreground color expression.
-
-@item m4
-Set 4th frame metadata key from which metadata values will be used to draw a graph.
-
-@item fg4
-Set 4th foreground color expression.
-
-@item min
-Set minimal value of metadata value.
-
-@item max
-Set maximal value of metadata value.
-
-@item bg
-Set graph background color. Default is white.
-
-@item mode
-Set graph mode.
-
-Available values for mode is:
-@table @samp
-@item bar
-@item dot
-@item line
-@end table
-
-Default is @code{line}.
-
-@item slide
-Set slide mode.
-
-Available values for slide is:
-@table @samp
-@item frame
-Draw new frame when right border is reached.
-
-@item replace
-Replace old columns with new ones.
-
-@item scroll
-Scroll from right to left.
-
-@item rscroll
-Scroll from left to right.
-
-@item picture
-Draw single picture.
-@end table
-
-Default is @code{frame}.
-
-@item size
-Set size of graph video. For the syntax of this option, check the
-@ref{video size syntax,,"Video size" section in the ffmpeg-utils manual,ffmpeg-utils}.
-The default value is @code{900x256}.
-
-The foreground color expressions can use the following variables:
-@table @option
-@item MIN
-Minimal value of metadata value.
-
-@item MAX
-Maximal value of metadata value.
-
-@item VAL
-Current metadata key value.
-@end table
-
-The color is defined as 0xAABBGGRR.
-@end table
-
-Example using metadata from @ref{signalstats} filter:
-@example
-signalstats,drawgraph=lavfi.signalstats.YAVG:min=0:max=255
-@end example
-
-Example using metadata from @ref{ebur128} filter:
-@example
-ebur128=metadata=1,adrawgraph=lavfi.r128.M:min=-120:max=5
-@end example
-
 @anchor{ebur128}
 @section ebur128
 
-EBU R128 scanner filter. This filter takes an audio stream as input and outputs
-it unchanged. By default, it logs a message at a frequency of 10Hz with the
+EBU R128 scanner filter. This filter takes an audio stream and analyzes its loudness
+level. By default, it logs a message at a frequency of 10Hz with the
 Momentary loudness (identified by @code{M}), Short-term loudness (@code{S}),
 Integrated loudness (@code{I}) and Loudness Range (@code{LRA}).
 
+The filter can only analyze streams which have a sampling rate of 48000 Hz and whose
+sample format is double-precision floating point. The input stream will be converted to
+this specification, if needed. Users may need to insert aformat and/or aresample filters
+after this filter to obtain the original parameters.
+
 The filter also has a video output (see the @var{video} option) with a real
 time graph to observe the loudness evolution. The graphic contains the logged
 message mentioned above, so it is not printed anymore when this option is set,
@@ -19534,6 +23401,10 @@
 @item expr
 Values are interpreted as floats, returns true if expression from option @code{expr}
 evaluates to true.
+
+@item ends_with
+Values are interpreted as strings, returns true if metadata value ends with
+the @code{value} option string.
 @end table
 
 @item expr
@@ -19555,6 +23426,9 @@
 for standard output. If @code{file} option is not set, output is written to the log
 with AV_LOG_INFO loglevel.
 
+@item direct
+Reduces buffering in print mode when output is written to a URL set using @var{file}.
+
 @end table
 
 @subsection Examples
@@ -19631,6 +23505,14 @@
 @item limit
 Time limit for the pauses. Any pause longer than that will be considered
 a timestamp discontinuity and reset the timer. Default is 2 seconds.
+@item speed
+Speed factor for processing. The value must be a float larger than zero.
+Values larger than 1.0 will result in faster than realtime processing,
+smaller will slow processing down. The @var{limit} is automatically adapted
+accordingly. Default is 1.0.
+
+A processing speed faster than what is possible without these filters cannot
+be achieved.
 @end table
 
 @anchor{select}
@@ -19914,6 +23796,38 @@
 specified interval. In other words, the command is sent when the
 previous frame timestamp was in the given interval, and the
 current is not.
+
+@item expr
+The command @var{ARG} is interpreted as expression and result of
+expression is passed as @var{ARG}.
+
+The expression is evaluated through the eval API and can contain the following
+constants:
+
+@table @option
+@item POS
+Original position in the file of the frame, or undefined if undefined
+for the current frame.
+
+@item PTS
+The presentation timestamp in input.
+
+@item N
+The count of the input frame for video or audio, starting from 0.
+
+@item T
+The time in seconds of the current frame.
+
+@item TS
+The start time in seconds of the current command interval.
+
+@item TE
+The end time in seconds of the current command interval.
+
+@item TI
+The interpolated time of the current command interval, TI = (T - TS) / (TE - TS).
+@end table
+
 @end table
 
 If @var{FLAGS} is not specified, a default value of @code{[enter]} is
@@ -20337,8 +24251,9 @@
 option instead.
 
 @item font
-Specify fontconfig pattern. This has lower priority than @var{fontfile}.
-The : in the pattern may be replaced by | to avoid unnecessary escaping.
+Specify fontconfig pattern. This has lower priority than @var{fontfile}. The
+@code{:} in the pattern may be replaced by @code{|} to avoid unnecessary
+escaping.
 
 @item fontcolor
 Specify font color expression. This is arithmetic expression that should return
@@ -20541,25 +24456,9 @@
 Default is @code{lin}.
 
 @item win_size
-Set window size.
+Set window size. Allowed range is from 16 to 65536.
 
-It accepts the following values:
-@table @samp
-@item w16
-@item w32
-@item w64
-@item w128
-@item w256
-@item w512
-@item w1024
-@item w2048
-@item w4096
-@item w8192
-@item w16384
-@item w32768
-@item w65536
-@end table
-Default is @code{w2048}
+Default is @code{2048}
 
 @item win_func
 Set windowing function.
@@ -20585,6 +24484,7 @@
 @item cauchy
 @item parzen
 @item poisson
+@item bohman
 @end table
 Default is @code{hanning}.
 
@@ -20616,6 +24516,58 @@
 
 @end table
 
+@section showspatial
+
+Convert stereo input audio to a video output, representing the spatial relationship
+between two channels.
+
+The filter accepts the following options:
+
+@table @option
+@item size, s
+Specify the video size for the output. For the syntax of this option, check the
+@ref{video size syntax,,"Video size" section in the ffmpeg-utils manual,ffmpeg-utils}.
+Default value is @code{512x512}.
+
+@item win_size
+Set window size. Allowed range is from @var{1024} to @var{65536}. Default size is @var{4096}.
+
+@item win_func
+Set window function.
+
+It accepts the following values:
+@table @samp
+@item rect
+@item bartlett
+@item hann
+@item hanning
+@item hamming
+@item blackman
+@item welch
+@item flattop
+@item bharris
+@item bnuttall
+@item bhann
+@item sine
+@item nuttall
+@item lanczos
+@item gauss
+@item tukey
+@item dolph
+@item cauchy
+@item parzen
+@item poisson
+@item bohman
+@end table
+
+Default value is @code{hann}.
+
+@item overlap
+Set ratio of overlap window. Default value is @code{0.5}.
+When value is @code{1} overlap is set to recommended size for specific
+window function currently used.
+@end table
+
 @anchor{showspectrum}
 @section showspectrum
 
@@ -20687,6 +24639,14 @@
 each channel is displayed using the magma color scheme
 @item green
 each channel is displayed using the green color scheme
+@item viridis
+each channel is displayed using the viridis color scheme
+@item plasma
+each channel is displayed using the plasma color scheme
+@item cividis
+each channel is displayed using the cividis color scheme
+@item terrain
+each channel is displayed using the terrain color scheme
 @end table
 
 Default value is @samp{channel}.
@@ -20712,6 +24672,19 @@
 
 Default value is @samp{sqrt}.
 
+@item fscale
+Specify frequency scale.
+
+It accepts the following values:
+@table @samp
+@item lin
+linear
+@item log
+logarithmic
+@end table
+
+Default value is @samp{lin}.
+
 @item saturation
 Set saturation modifier for displayed colors. Negative values provide
 alternative color scheme. @code{0} is no saturation at all.
@@ -20743,6 +24716,7 @@
 @item cauchy
 @item parzen
 @item poisson
+@item bohman
 @end table
 
 Default value is @code{hann}.
@@ -20852,6 +24826,14 @@
 each channel is displayed using the magma color scheme
 @item green
 each channel is displayed using the green color scheme
+@item viridis
+each channel is displayed using the viridis color scheme
+@item plasma
+each channel is displayed using the plasma color scheme
+@item cividis
+each channel is displayed using the cividis color scheme
+@item terrain
+each channel is displayed using the terrain color scheme
 @end table
 Default value is @samp{intensity}.
 
@@ -20875,6 +24857,19 @@
 @end table
 Default value is @samp{log}.
 
+@item fscale
+Specify frequency scale.
+
+It accepts the following values:
+@table @samp
+@item lin
+linear
+@item log
+logarithmic
+@end table
+
+Default value is @samp{lin}.
+
 @item saturation
 Set saturation modifier for displayed colors. Negative values provide
 alternative color scheme. @code{0} is no saturation at all.
@@ -20906,6 +24901,7 @@
 @item cauchy
 @item parzen
 @item poisson
+@item bohman
 @end table
 Default value is @code{hann}.
 
@@ -21154,6 +25150,20 @@
 @end table
 
 Default is linear.
+
+@item draw
+Set the draw mode.
+
+Available values are:
+@table @samp
+@item scale
+Scale pixel values for each drawn sample.
+
+@item full
+Draw every sample directly.
+@end table
+
+Default value is @code{scale}.
 @end table
 
 @subsection Examples
@@ -21199,7 +25209,7 @@
 
 @section spectrumsynth
 
-Sythesize audio from 2 input video spectrums, first input stream represents
+Synthesize audio from 2 input video spectrums, first input stream represents
 magnitude across time and second represents phase across time.
 The filter will transform from frequency domain as displayed in videos back
 to time domain as presented in audio output.
@@ -21208,7 +25218,7 @@
 filter outputs, but can synthesize sound from other spectrograms too.
 But in such case results are going to be poor if the phase data is not
 available, because in such cases phase data need to be recreated, usually
-its just recreated from random noise.
+it's just recreated from random noise.
 For best results use gray only output (@code{channel} color mode in
 @ref{showspectrum} filter) and @code{log} scale for magnitude video and
 @code{lin} scale for phase video. To produce phase, for 2nd video, use
diff --git a/doc/formats.texi b/doc/formats.texi
index 4f334e0..fc80ce1 100644
--- a/doc/formats.texi
+++ b/doc/formats.texi
@@ -27,6 +27,10 @@
 information in case it is dispersed into the stream, but will increase
 latency. Must be an integer not lesser than 32. It is 5000000 by default.
 
+@item max_probe_packets @var{integer} (@emph{input})
+Set the maximum number of buffered packets when probing a codec.
+Default is 2500 packets.
+
 @item packetsize @var{integer} (@emph{output})
 Set packet size.
 
@@ -139,7 +143,7 @@
 
 @item max_interleave_delta @var{integer} (@emph{output})
 Set maximum buffering duration for interleaving. The duration is
-expressed in microseconds, and defaults to 1000000 (1 second).
+expressed in microseconds, and defaults to 10000000 (10 seconds).
 
 To ensure all the streams are interleaved correctly, libavformat will
 wait until it has at least one packet for each stream before actually
@@ -211,7 +215,7 @@
 @item dump_separator @var{string} (@emph{input})
 Separator used to separate the fields printed on the command line about the
 Stream parameters.
-For example to separate the fields with newlines and indention:
+For example, to separate the fields with newlines and indentation:
 @example
 ffprobe -dump_separator "
                           "  -i ~/videos/matrixbench_mpeg2.mpg
@@ -224,6 +228,28 @@
 @item skip_estimate_duration_from_pts @var{bool} (@emph{input})
 Skip estimation of input duration when calculated using PTS.
 At present, applicable for MPEG-PS and MPEG-TS.
+
+@item strict, f_strict @var{integer} (@emph{input/output})
+Specify how strictly to follow the standards. @code{f_strict} is deprecated and
+should be used only via the @command{ffmpeg} tool.
+
+Possible values:
+@table @samp
+@item very
+strictly conform to an older more strict version of the spec or reference software
+@item strict
+strictly conform to all the things in the spec no matter what consequences
+@item normal
+
+@item unofficial
+allow unofficial extensions
+@item experimental
+allow non standardized experimental things, experimental
+(unfinished/work in progress/not well tested) decoders and encoders.
+Note: experimental decoders can pose a security risk, do not use this for
+decoding untrusted input.
+@end table
+
 @end table
 
 @c man end FORMAT OPTIONS
@@ -234,30 +260,10 @@
 Format stream specifiers allow selection of one or more streams that
 match specific properties.
 
-Possible forms of stream specifiers are:
-@table @option
-@item @var{stream_index}
-Matches the stream with this index.
-
-@item @var{stream_type}[:@var{stream_index}]
-@var{stream_type} is one of following: 'v' for video, 'a' for audio,
-'s' for subtitle, 'd' for data, and 't' for attachments. If
-@var{stream_index} is given, then it matches the stream number
-@var{stream_index} of this type. Otherwise, it matches all streams of
-this type.
-
-@item p:@var{program_id}[:@var{stream_index}]
-If @var{stream_index} is given, then it matches the stream with number
-@var{stream_index} in the program with the id
-@var{program_id}. Otherwise, it matches all streams in the program.
-
-@item #@var{stream_id}
-Matches the stream by a format-specific ID.
-@end table
-
 The exact semantics of stream specifiers is defined by the
 @code{avformat_match_stream_specifier()} function declared in the
-@file{libavformat/avformat.h} header.
+@file{libavformat/avformat.h} header and documented in the
+@ref{Stream specifiers,,Stream specifiers section in the ffmpeg(1) manual,ffmpeg}.
 
 @ifclear config-writeonly
 @include demuxers.texi
diff --git a/doc/general.texi b/doc/general.texi
index 4983134..4adcc9e 100644
--- a/doc/general.texi
+++ b/doc/general.texi
@@ -17,21 +17,107 @@
 explicitly requested by passing the appropriate flags to
 @command{./configure}.
 
-@section libxavs2
+@section Alliance for Open Media (AOM)
 
-FFmpeg can make use of the xavs2 library for AVS2-P2/IEEE1857.4 video encoding.
+FFmpeg can make use of the AOM library for AV1 decoding and encoding.
 
-Go to @url{https://github.com/pkuvcl/xavs2} and follow the instructions for
-installing the library. Then pass @code{--enable-libxavs2} to configure to
+Go to @url{http://aomedia.org/} and follow the instructions for
+installing the library. Then pass @code{--enable-libaom} to configure to
 enable it.
 
+@section AMD AMF/VCE
+
+FFmpeg can use the AMD Advanced Media Framework library
+for accelerated H.264 and HEVC(only windows) encoding on hardware with Video Coding Engine (VCE).
+
+To enable support you must obtain the AMF framework header files(version 1.4.9+) from
+@url{https://github.com/GPUOpen-LibrariesAndSDKs/AMF.git}.
+
+Create an @code{AMF/} directory in the system include path.
+Copy the contents of @code{AMF/amf/public/include/} into that directory.
+Then configure FFmpeg with @code{--enable-amf}.
+
+Initialization of amf encoder occurs in this order:
+1) trying to initialize through dx11(only windows)
+2) trying to initialize through dx9(only windows)
+3) trying to initialize through vulkan
+
+To use h.264(AMD VCE) encoder on linux amdgru-pro version 19.20+ and amf-amdgpu-pro
+package(amdgru-pro contains, but does not install automatically) are required.
+
+This driver can be installed using amdgpu-pro-install script in official amd driver archive.
+
+@section AviSynth
+
+FFmpeg can read AviSynth scripts as input. To enable support, pass
+@code{--enable-avisynth} to configure after installing the headers
+provided by @url{https://github.com/AviSynth/AviSynthPlus, AviSynth+}.
+AviSynth+ can be configured to install only the headers by either
+passing @code{-DHEADERS_ONLY:bool=on} to the normal CMake-based build
+system, or by using the supplied @code{GNUmakefile}.
+
+For Windows, supported AviSynth variants are
+@url{http://avisynth.nl, AviSynth 2.6 RC1 or higher} for 32-bit builds and
+@url{http://avisynth.nl/index.php/AviSynth+, AviSynth+ r1718 or higher} for 32-bit and 64-bit builds.
+
+For Linux, macOS, and BSD, the only supported AviSynth variant is
+@url{https://github.com/AviSynth/AviSynthPlus, AviSynth+}, starting with version 3.5.
+
 @float NOTE
-libxavs2 is under the GNU Public License Version 2 or later
-(see @url{http://www.gnu.org/licenses/old-licenses/gpl-2.0.html} for
-details), you must upgrade FFmpeg's license to GPL in order to use it.
+In 2016, AviSynth+ added support for building with GCC. However, due to
+the eccentricities of Windows' calling conventions, 32-bit GCC builds
+of AviSynth+ are not compatible with typical 32-bit builds of FFmpeg.
+
+By default, FFmpeg assumes compatibility with 32-bit MSVC builds of
+AviSynth+ since that is the most widely-used and entrenched build
+configuration.  Users can override this and enable support for 32-bit
+GCC builds of AviSynth+ by passing @code{-DAVSC_WIN32_GCC32} to
+@code{--extra-cflags} when configuring FFmpeg.
+
+64-bit builds of FFmpeg are not affected, and can use either MSVC or
+GCC builds of AviSynth+ without any special flags.
 @end float
 
-@section libdavs2
+@float NOTE
+AviSynth(+) is loaded dynamically.  Distributors can build FFmpeg
+with @code{--enable-avisynth}, and the binaries will work regardless
+of the end user having AviSynth installed.  If/when an end user
+would like to use AviSynth scripts, then they can install AviSynth(+)
+and FFmpeg will be able to find and use it to open scripts.
+@end float
+
+@section Chromaprint
+
+FFmpeg can make use of the Chromaprint library for generating audio fingerprints.
+Pass @code{--enable-chromaprint} to configure to
+enable it. See @url{https://acoustid.org/chromaprint}.
+
+@section codec2
+
+FFmpeg can make use of the codec2 library for codec2 decoding and encoding.
+There is currently no native decoder, so libcodec2 must be used for decoding.
+
+Go to @url{http://freedv.org/}, download "Codec 2 source archive".
+Build and install using CMake. Debian users can install the libcodec2-dev package instead.
+Once libcodec2 is installed you can pass @code{--enable-libcodec2} to configure to enable it.
+
+The easiest way to use codec2 is with .c2 files, since they contain the mode information required for decoding.
+To encode such a file, use a .c2 file extension and give the libcodec2 encoder the -mode option:
+@code{ffmpeg -i input.wav -mode 700C output.c2}.
+Playback is as simple as @code{ffplay output.c2}.
+For a list of supported modes, run @code{ffmpeg -h encoder=libcodec2}.
+Raw codec2 files are also supported.
+To make sense of them the mode in use needs to be specified as a format option:
+@code{ffmpeg -f codec2raw -mode 1300 -i input.raw output.wav}.
+
+@section dav1d
+
+FFmpeg can make use of the dav1d library for AV1 video decoding.
+
+Go to @url{https://code.videolan.org/videolan/dav1d} and follow the instructions for
+installing the library. Then pass @code{--enable-libdav1d} to configure to enable it.
+
+@section davs2
 
 FFmpeg can make use of the davs2 library for AVS2-P2/IEEE1857.4 video decoding.
 
@@ -45,21 +131,63 @@
 details), you must upgrade FFmpeg's license to GPL in order to use it.
 @end float
 
-@section Alliance for Open Media libaom
+@section Game Music Emu
 
-FFmpeg can make use of the libaom library for AV1 decoding.
+FFmpeg can make use of the Game Music Emu library to read audio from supported video game
+music file formats. Pass @code{--enable-libgme} to configure to
+enable it. See @url{https://bitbucket.org/mpyne/game-music-emu/overview}.
 
-Go to @url{http://aomedia.org/} and follow the instructions for
-installing the library. Then pass @code{--enable-libaom} to configure to
+@section Intel QuickSync Video
+
+FFmpeg can use Intel QuickSync Video (QSV) for accelerated decoding and encoding
+of multiple codecs. To use QSV, FFmpeg must be linked against the @code{libmfx}
+dispatcher, which loads the actual decoding libraries.
+
+The dispatcher is open source and can be downloaded from
+@url{https://github.com/lu-zero/mfx_dispatch.git}. FFmpeg needs to be configured
+with the @code{--enable-libmfx} option and @code{pkg-config} needs to be able to
+locate the dispatcher's @code{.pc} files.
+
+@section Kvazaar
+
+FFmpeg can make use of the Kvazaar library for HEVC encoding.
+
+Go to @url{https://github.com/ultravideo/kvazaar} and follow the
+instructions for installing the library. Then pass
+@code{--enable-libkvazaar} to configure to enable it.
+
+@section LAME
+
+FFmpeg can make use of the LAME library for MP3 encoding.
+
+Go to @url{http://lame.sourceforge.net/} and follow the
+instructions for installing the library.
+Then pass @code{--enable-libmp3lame} to configure to enable it.
+
+@section libilbc
+
+iLBC is a narrowband speech codec that has been made freely available
+by Google as part of the WebRTC project. libilbc is a packaging friendly
+copy of the iLBC codec. FFmpeg can make use of the libilbc library for
+iLBC decoding and encoding.
+
+Go to @url{https://github.com/TimothyGu/libilbc} and follow the instructions for
+installing the library. Then pass @code{--enable-libilbc} to configure to
 enable it.
 
-@section OpenJPEG
+@section libvpx
 
-FFmpeg can use the OpenJPEG libraries for encoding/decoding J2K videos.  Go to
-@url{http://www.openjpeg.org/} to get the libraries and follow the installation
-instructions.  To enable using OpenJPEG in FFmpeg, pass @code{--enable-libopenjpeg} to
-@file{./configure}.
+FFmpeg can make use of the libvpx library for VP8/VP9 decoding and encoding.
 
+Go to @url{http://www.webmproject.org/} and follow the instructions for
+installing the library. Then pass @code{--enable-libvpx} to configure to
+enable it.
+
+@section ModPlug
+
+FFmpeg can make use of this library, originating in Modplug-XMMS, to read from MOD-like music files.
+See @url{https://github.com/Konstanty/libmodplug}. Pass @code{--enable-libmodplug} to configure to
+enable it.
 
 @section OpenCORE, VisualOn, and Fraunhofer libraries
 
@@ -106,67 +234,9 @@
 instructions for installing the library.
 Then pass @code{--enable-libfdk-aac} to configure to enable it.
 
-@section LAME
-
-FFmpeg can make use of the LAME library for MP3 encoding.
-
-Go to @url{http://lame.sourceforge.net/} and follow the
-instructions for installing the library.
-Then pass @code{--enable-libmp3lame} to configure to enable it.
-
-@section TwoLAME
-
-FFmpeg can make use of the TwoLAME library for MP2 encoding.
-
-Go to @url{http://www.twolame.org/} and follow the
-instructions for installing the library.
-Then pass @code{--enable-libtwolame} to configure to enable it.
-
-@section libcodec2 / codec2 general
-
-FFmpeg can make use of libcodec2 for codec2 encoding and decoding.
-There is currently no native decoder, so libcodec2 must be used for decoding.
-
-Go to @url{http://freedv.org/}, download "Codec 2 source archive".
-Build and install using CMake. Debian users can install the libcodec2-dev package instead.
-Once libcodec2 is installed you can pass @code{--enable-libcodec2} to configure to enable it.
-
-The easiest way to use codec2 is with .c2 files, since they contain the mode information required for decoding.
-To encode such a file, use a .c2 file extension and give the libcodec2 encoder the -mode option:
-@code{ffmpeg -i input.wav -mode 700C output.c2}.
-Playback is as simple as @code{ffplay output.c2}.
-For a list of supported modes, run @code{ffmpeg -h encoder=libcodec2}.
-Raw codec2 files are also supported.
-To make sense of them the mode in use needs to be specified as a format option:
-@code{ffmpeg -f codec2raw -mode 1300 -i input.raw output.wav}.
-
-@section libvpx
-
-FFmpeg can make use of the libvpx library for VP8/VP9 encoding.
-
-Go to @url{http://www.webmproject.org/} and follow the instructions for
-installing the library. Then pass @code{--enable-libvpx} to configure to
-enable it.
-
-@section libwavpack
-
-FFmpeg 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 libxavs
-
-FFmpeg can make use of the libxavs library for Xavs encoding.
-
-Go to @url{http://xavs.sf.net/} and follow the instructions for
-installing the library. Then pass @code{--enable-libxavs} to configure to
-enable it.
-
 @section OpenH264
 
-FFmpeg can make use of the OpenH264 library for H.264 encoding and decoding.
+FFmpeg can make use of the OpenH264 library for H.264 decoding and encoding.
 
 Go to @url{http://www.openh264.org/} and follow the instructions for
 installing the library. Then pass @code{--enable-libopenh264} to configure to
@@ -179,6 +249,47 @@
 testing and for taking advantage of Cisco's patent portfolio license
 (@url{http://www.openh264.org/BINARY_LICENSE.txt}).
 
+@section OpenJPEG
+
+FFmpeg can use the OpenJPEG libraries for decoding/encoding J2K videos.  Go to
+@url{http://www.openjpeg.org/} to get the libraries and follow the installation
+instructions.  To enable using OpenJPEG in FFmpeg, pass @code{--enable-libopenjpeg} to
+@file{./configure}.
+
+@section rav1e
+
+FFmpeg can make use of rav1e (Rust AV1 Encoder) via its C bindings to encode videos.
+Go to @url{https://github.com/xiph/rav1e/} and follow the instructions to build
+the C library. To enable using rav1e in FFmpeg, pass @code{--enable-librav1e}
+to @file{./configure}.
+
+@section TwoLAME
+
+FFmpeg can make use of the TwoLAME library for MP2 encoding.
+
+Go to @url{http://www.twolame.org/} and follow the
+instructions for installing the library.
+Then pass @code{--enable-libtwolame} to configure to enable it.
+
+@section VapourSynth
+
+FFmpeg can read VapourSynth scripts as input. To enable support, pass
+@code{--enable-vapoursynth} to configure. Vapoursynth is detected via
+@code{pkg-config}. Versions 42 or greater supported.
+See @url{http://www.vapoursynth.com/}.
+
+Due to security concerns, Vapoursynth scripts will not
+be autodetected so the input format has to be forced. For ff* CLI tools,
+add @code{-f vapoursynth} before the input @code{-i yourscript.vpy}.
+
+@section WavPack
+
+FFmpeg 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
 
 FFmpeg can make use of the x264 library for H.264 encoding.
@@ -207,92 +318,37 @@
 details), you must upgrade FFmpeg's license to GPL in order to use it.
 @end float
 
-@section kvazaar
+@section xavs
 
-FFmpeg can make use of the kvazaar library for HEVC encoding.
+FFmpeg can make use of the xavs library for AVS encoding.
 
-Go to @url{https://github.com/ultravideo/kvazaar} and follow the
-instructions for installing the library. Then pass
-@code{--enable-libkvazaar} to configure to enable it.
-
-@section libilbc
-
-iLBC is a narrowband speech codec that has been made freely available
-by Google as part of the WebRTC project. libilbc is a packaging friendly
-copy of the iLBC codec. FFmpeg can make use of the libilbc library for
-iLBC encoding and decoding.
-
-Go to @url{https://github.com/TimothyGu/libilbc} and follow the instructions for
-installing the library. Then pass @code{--enable-libilbc} to configure to
+Go to @url{http://xavs.sf.net/} and follow the instructions for
+installing the library. Then pass @code{--enable-libxavs} to configure to
 enable it.
 
-@section libzvbi
+@section xavs2
 
-libzvbi is a VBI decoding library which can be used by FFmpeg to decode DVB
+FFmpeg can make use of the xavs2 library for AVS2-P2/IEEE1857.4 video encoding.
+
+Go to @url{https://github.com/pkuvcl/xavs2} and follow the instructions for
+installing the library. Then pass @code{--enable-libxavs2} to configure to
+enable it.
+
+@float NOTE
+libxavs2 is under the GNU Public License Version 2 or later
+(see @url{http://www.gnu.org/licenses/old-licenses/gpl-2.0.html} for
+details), you must upgrade FFmpeg's license to GPL in order to use it.
+@end float
+
+@section ZVBI
+
+ZVBI is a VBI decoding library which can be used by FFmpeg to decode DVB
 teletext pages and DVB teletext subtitles.
 
 Go to @url{http://sourceforge.net/projects/zapping/} and follow the instructions for
 installing the library. Then pass @code{--enable-libzvbi} to configure to
 enable it.
 
-@section AviSynth
-
-FFmpeg can read AviSynth scripts as input. To enable support, pass
-@code{--enable-avisynth} to configure.  The correct headers are
-included in compat/avisynth/, which allows the user to enable support
-without needing to search for these headers themselves.
-
-For Windows, supported AviSynth variants are
-@url{http://avisynth.nl, AviSynth 2.6 RC1 or higher} for 32-bit builds and
-@url{http://avs-plus.net, AviSynth+ r1718 or higher} for 32-bit and 64-bit builds.
-
-For Linux and OS X, the supported AviSynth variant is
-@url{https://github.com/avxsynth/avxsynth, AvxSynth}.
-
-@float NOTE
-There is currently a regression in AviSynth+'s @code{capi.h} header as of
-October 2016, which interferes with the ability for builds of FFmpeg to use
-MSVC-built binaries of AviSynth. Until this is resolved, you can make sure
-a known good version is installed by checking out a version from before
-the regression occurred:
-
-@code{git clone -b MT git://github.com/AviSynth/AviSynthPlus.git @*
-cd AviSynthPlus @*
-git checkout -b oldheader b4f292b4dbfad149697fb65c6a037bb3810813f9 @*
-make install PREFIX=/install/prefix}
-@end float
-
-@float NOTE
-AviSynth and AvxSynth are loaded dynamically.  Distributors can build FFmpeg
-with @code{--enable-avisynth}, and the binaries will work regardless of the
-end user having AviSynth or AvxSynth installed - they'll only need to be
-installed to use AviSynth scripts (obviously).
-@end float
-
-@section Intel QuickSync Video
-
-FFmpeg can use Intel QuickSync Video (QSV) for accelerated encoding and decoding
-of multiple codecs. To use QSV, FFmpeg must be linked against the @code{libmfx}
-dispatcher, which loads the actual decoding libraries.
-
-The dispatcher is open source and can be downloaded from
-@url{https://github.com/lu-zero/mfx_dispatch.git}. FFmpeg needs to be configured
-with the @code{--enable-libmfx} option and @code{pkg-config} needs to be able to
-locate the dispatcher's @code{.pc} files.
-
-@section AMD VCE
-
-FFmpeg can use the AMD Advanced Media Framework library for accelerated H.264
-and HEVC encoding on VCE enabled hardware under Windows.
-
-To enable support you must obtain the AMF framework header files from
-@url{https://github.com/GPUOpen-LibrariesAndSDKs/AMF.git}.
-
-Create an @code{AMF/} directory in the system include path.
-Copy the contents of @code{AMF/amf/public/include/} into that directory.
-Then configure FFmpeg with @code{--enable-amf}.
-
-
 @chapter Supported File Formats, Codecs or Features
 
 You can use the @code{-formats} and @code{-codecs} options to have an exhaustive list.
@@ -363,6 +419,9 @@
     @tab Contains header with version and mode info, simplifying playback.
 @item CRI ADX                   @tab X @tab X
     @tab Audio-only format used in console video games.
+@item CRI AIX                   @tab   @tab X
+@item CRI HCA                   @tab   @tab X
+    @tab Audio-only format used in console video games.
 @item Discworld II BMV          @tab   @tab X
 @item Interplay C93             @tab   @tab X
     @tab Used in the game Cyberia from Interplay.
@@ -432,6 +491,8 @@
 @item IEC61937 encapsulation @tab X @tab X
 @item IFF                       @tab   @tab X
     @tab Interchange File Format
+@item IFV                       @tab   @tab X
+    @tab A format used by some old CCTV DVRs.
 @item iLBC                      @tab X @tab X
 @item Interplay MVE             @tab   @tab X
     @tab Format used in various Interplay computer games.
@@ -516,7 +577,6 @@
 @item raw aptX                  @tab X @tab X
 @item raw aptX HD               @tab X @tab X
 @item raw Chinese AVS video     @tab X @tab X
-@item raw CRI ADX               @tab X @tab X
 @item raw Dirac                 @tab X @tab X
 @item raw DNxHD                 @tab X @tab X
 @item raw DTS                   @tab X @tab X
@@ -545,6 +605,7 @@
 @item raw VC-1                  @tab X @tab X
 @item raw PCM A-law             @tab X @tab X
 @item raw PCM mu-law            @tab X @tab X
+@item raw PCM Archimedes VIDC   @tab X @tab X
 @item raw PCM signed 8 bit      @tab X @tab X
 @item raw PCM signed 16 bit big-endian  @tab X @tab X
 @item raw PCM signed 16 bit little-endian  @tab X @tab X
@@ -649,7 +710,7 @@
 @item Psygnosis YOP             @tab   @tab X
 @end multitable
 
-@code{X} means that encoding (resp. decoding) is supported.
+@code{X} means that the feature in that column (encoding / decoding) is supported.
 
 @section Image Formats
 
@@ -719,7 +780,7 @@
     @tab X Window Dump image format
 @end multitable
 
-@code{X} means that encoding (resp. decoding) is supported.
+@code{X} means that the feature in that column (encoding / decoding) is supported.
 
 @code{E} means that support is provided through an external library.
 
@@ -757,12 +818,14 @@
 @item Autodesk Animator Flic video  @tab     @tab  X
 @item Autodesk RLE           @tab     @tab  X
     @tab fourcc: AASC
-@item AV1                    @tab     @tab  E
-    @tab Supported through external library libaom
+@item AV1                    @tab  E  @tab  E
+    @tab Supported through external libraries libaom, libdav1d and librav1e
 @item Avid 1:1 10-bit RGB Packer  @tab  X  @tab  X
     @tab fourcc: AVrp
 @item AVS (Audio Video Standard) video  @tab     @tab  X
     @tab Video encoding used by the Creature Shock game.
+@item AVS2-P2/IEEE1857.4     @tab  E  @tab  E
+    @tab Supported through external libraries libxavs2 and libdavs2
 @item AYUV                   @tab  X  @tab  X
     @tab Microsoft uncompressed packed 4:4:4:4
 @item Beam Software VB       @tab     @tab  X
@@ -788,6 +851,8 @@
     @tab Codec used in Delphine Software International games.
 @item Discworld II BMV Video @tab     @tab  X
 @item Canopus Lossless Codec @tab     @tab  X
+@item CDToons                @tab     @tab  X
+    @tab Codec used in various Broderbund games.
 @item Cinepak                @tab     @tab  X
 @item Cirrus Logic AccuPak   @tab  X  @tab  X
     @tab fourcc: CLJR
@@ -907,6 +972,8 @@
     @tab Video encoding used in NuppelVideo files.
 @item On2 VP3                @tab     @tab  X
     @tab still experimental
+@item On2 VP4                @tab     @tab  X
+    @tab fourcc: VP40
 @item On2 VP5                @tab     @tab  X
     @tab fourcc: VP50
 @item On2 VP6                @tab     @tab  X
@@ -1001,7 +1068,7 @@
     @tab Encoder works only in PAL8.
 @end multitable
 
-@code{X} means that encoding (resp. decoding) is supported.
+@code{X} means that the feature in that column (encoding / decoding) is supported.
 
 @code{E} means that support is provided through an external library.
 
@@ -1016,8 +1083,10 @@
 @item AAC+                   @tab  E  @tab  IX
     @tab encoding supported through external library libfdk-aac
 @item AC-3                   @tab IX  @tab  IX
+@item ACELP.KELVIN           @tab     @tab  X
 @item ADPCM 4X Movie         @tab     @tab  X
 @item APDCM Yamaha AICA      @tab     @tab  X
+@item ADPCM Argonaut Games   @tab     @tab  X
 @item ADPCM CDROM XA         @tab     @tab  X
 @item ADPCM Creative Technology @tab     @tab  X
     @tab 16 -> 4, 8 -> 4, 8 -> 3, 8 -> 2
@@ -1036,7 +1105,10 @@
 @item ADPCM IMA Electronic Arts EACS  @tab     @tab  X
 @item ADPCM IMA Electronic Arts SEAD  @tab     @tab  X
 @item ADPCM IMA Funcom       @tab     @tab  X
+@item ADPCM IMA High Voltage Software ALP   @tab     @tab  X
 @item ADPCM IMA QuickTime    @tab  X  @tab  X
+@item ADPCM IMA Simon & Schuster Interactive   @tab  @tab  X
+@item ADPCM IMA Ubisoft APM  @tab     @tab X
 @item ADPCM IMA Loki SDL MJPEG  @tab     @tab  X
 @item ADPCM IMA WAV          @tab  X  @tab  X
 @item ADPCM IMA Westwood     @tab     @tab  X
@@ -1066,6 +1138,7 @@
 @item ADPCM Westwood Studios IMA @tab     @tab  X
     @tab Used in Westwood Studios games like Command and Conquer.
 @item ADPCM Yamaha           @tab  X  @tab  X
+@item ADPCM Zork             @tab     @tab  X
 @item AMR-NB                 @tab  E  @tab  X
     @tab encoding supported through external library libopencore-amrnb
 @item AMR-WB                 @tab  E  @tab  X
@@ -1087,6 +1160,7 @@
     @tab decoding supported through external library libcelt
 @item codec2                 @tab  E  @tab  E
     @tab en/decoding supported through external library libcodec2
+@item CRI HCA                @tab     @tab X
 @item Delphine Software International CIN audio  @tab     @tab  X
     @tab Codec used in Delphine Software International games.
 @item Digital Speech Standard - Standard Play mode (DSS SP) @tab     @tab  X
@@ -1096,6 +1170,7 @@
 @item DCA (DTS Coherent Acoustics)  @tab  X  @tab  X
     @tab supported extensions: XCh, XXCH, X96, XBR, XLL, LBR (partially)
 @item Dolby E  @tab     @tab  X
+@item DPCM Gremlin           @tab     @tab  X
 @item DPCM id RoQ            @tab  X  @tab  X
     @tab Used in Quake III, Jedi Knight 2 and other computer games.
 @item DPCM Interplay         @tab     @tab  X
@@ -1107,10 +1182,11 @@
 @item DPCM Sol               @tab     @tab  X
 @item DPCM Xan               @tab     @tab  X
     @tab Used in Origin's Wing Commander IV AVI files.
-@item DSD (Direct Stream Digitial), least significant bit first  @tab  @tab  X
-@item DSD (Direct Stream Digitial), most significant bit first   @tab  @tab  X
-@item DSD (Direct Stream Digitial), least significant bit first, planar  @tab  @tab  X
-@item DSD (Direct Stream Digitial), most significant bit first, planar   @tab  @tab  X
+@item DPCM Xilam DERF        @tab     @tab  X
+@item DSD (Direct Stream Digital), least significant bit first  @tab  @tab  X
+@item DSD (Direct Stream Digital), most significant bit first   @tab  @tab  X
+@item DSD (Direct Stream Digital), least significant bit first, planar  @tab  @tab  X
+@item DSD (Direct Stream Digital), most significant bit first, planar   @tab  @tab  X
 @item DSP Group TrueSpeech   @tab     @tab  X
 @item DST (Direct Stream Transfer) @tab  @tab  X
 @item DV audio               @tab     @tab  X
@@ -1147,6 +1223,7 @@
     @tab encoding supported through external library libopus
 @item PCM A-law              @tab  X  @tab  X
 @item PCM mu-law             @tab  X  @tab  X
+@item PCM Archimedes VIDC    @tab  X  @tab  X
 @item PCM signed 8-bit planar  @tab  X  @tab  X
 @item PCM signed 16-bit big-endian planar  @tab  X  @tab  X
 @item PCM signed 16-bit little-endian planar  @tab  X  @tab  X
@@ -1172,7 +1249,6 @@
 @item PCM unsigned 24-bit little-endian  @tab  X  @tab  X
 @item PCM unsigned 32-bit big-endian  @tab  X  @tab  X
 @item PCM unsigned 32-bit little-endian  @tab  X  @tab  X
-@item PCM Zork               @tab     @tab  X
 @item QCELP / PureVoice      @tab     @tab  X
 @item QDesign Music Codec 1  @tab     @tab  X
 @item QDesign Music Codec 2  @tab     @tab  X
@@ -1219,7 +1295,7 @@
 @item Xbox Media Audio 2     @tab     @tab  X
 @end multitable
 
-@code{X} means that encoding (resp. decoding) is supported.
+@code{X} means that the feature in that column (encoding / decoding) is supported.
 
 @code{E} means that support is provided through an external library.
 
@@ -1263,6 +1339,7 @@
 
 @multitable @columnfractions .4 .1
 @item Name         @tab Support
+@item AMQP         @tab E
 @item file         @tab X
 @item FTP          @tab X
 @item Gopher       @tab X
@@ -1287,6 +1364,7 @@
 @item TCP          @tab X
 @item TLS          @tab X
 @item UDP          @tab X
+@item ZMQ          @tab E
 @end multitable
 
 @code{X} means that the protocol is supported.
diff --git a/doc/indevs.texi b/doc/indevs.texi
index 9a9cb69..6f5afaf 100644
--- a/doc/indevs.texi
+++ b/doc/indevs.texi
@@ -178,6 +178,9 @@
 @item -capture_mouse_clicks
 Capture the screen mouse clicks. Default is 0.
 
+@item -capture_raw_data
+Capture the raw device data. Default is 0.
+Using this option may result in receiving the underlying data delivered to the AVFoundation framework. E.g. for muxed devices that sends raw DV data to the framework (like tape-based camcorders), setting this option to false results in extracted video frames captured in the designated pixel format only. Setting this option to true results in receiving the raw DV stream untouched.
 @end table
 
 @subsection Examples
@@ -208,6 +211,13 @@
 $ ffmpeg -f avfoundation -pixel_format bgr0 -i "default:none" out.avi
 @end example
 
+@item
+Record raw DV data from a suitable input device and write the output into out.dv:
+@example
+$ ffmpeg -f avfoundation -capture_raw_data true -i "zr100:none" out.dv
+@end example
+
+
 @end itemize
 
 @section bktr
@@ -267,8 +277,8 @@
 
 @item list_devices
 If set to @option{true}, print a list of devices and exit.
-Defaults to @option{false}. Alternatively you can use the @code{-sources}
-option of ffmpeg to list the available input devices.
+Defaults to @option{false}. This option is deprecated, please use the
+@code{-sources} option of ffmpeg to list the available input devices.
 
 @item list_formats
 If set to @option{true}, print a list of supported formats and exit.
@@ -282,11 +292,6 @@
 Default behavior is autodetection of the input video format, if the hardware
 supports it.
 
-@item bm_v210
-This is a deprecated option, you can use @option{raw_format} instead.
-If set to @samp{1}, video is captured in 10 bit v210 instead
-of uyvy422. Not all Blackmagic devices support this option.
-
 @item raw_format
 Set the pixel format of the captured video.
 Available values are:
@@ -374,7 +379,7 @@
 @item timestamp_align
 Capture start time alignment in seconds. If set to nonzero, input frames are
 dropped till the system timestamp aligns with configured value.
-Alignment difference of upto one frame duration is tolerated.
+Alignment difference of up to one frame duration is tolerated.
 This is useful for maintaining input synchronization across N different
 hardware devices deployed for 'N-way' redundancy. The system time of different
 hardware devices should be synchronized with protocols such as NTP or PTP,
@@ -385,6 +390,14 @@
 @option{timestamp_align} seconds.
 Defaults to @samp{0}.
 
+@item wait_for_tc (@emph{bool})
+Drop frames till a frame with timecode is received. Sometimes serial timecode
+isn't received with the first input frame. If that happens, the stored stream
+timecode will be inaccurate. If this option is set to @option{true}, input frames
+are dropped till a frame with timecode is received.
+Option @var{timecode_format} must be specified.
+Defaults to @option{false}.
+
 @end table
 
 @subsection Examples
@@ -394,7 +407,7 @@
 @item
 List input devices:
 @example
-ffmpeg -f decklink -list_devices 1 -i dummy
+ffmpeg -sources decklink
 @end example
 
 @item
@@ -412,7 +425,7 @@
 @item
 Capture video clip at 1080i50 10 bit:
 @example
-ffmpeg -bm_v210 1 -format_code Hi50 -f decklink -i 'UltraStudio Mini Recorder' -c:a copy -c:v copy output.avi
+ffmpeg -raw_format yuv422p10 -format_code Hi50 -f decklink -i 'UltraStudio Mini Recorder' -c:a copy -c:v copy output.avi
 @end example
 
 @item
@@ -787,7 +800,7 @@
 Grab and record the input of a FireWire DV/HDV device,
 using a packet buffer of 100000 packets if the source is HDV.
 @example
-ffmpeg -f iec61883 -i auto -hdvbuffer 100000 out.mpg
+ffmpeg -f iec61883 -i auto -dvbuffer 100000 out.mpg
 @end example
 
 @end itemize
@@ -910,6 +923,14 @@
 ffmpeg -crtc_id 42 -framerate 60 -f kmsgrab -i - -vf 'hwmap=derive_device=vaapi,scale_vaapi=w=1920:h=1080:format=nv12' -c:v h264_vaapi output.mp4
 @end example
 
+@item
+To capture only part of a plane the output can be cropped - this can be used to capture
+a single window, as long as it has a known absolute position and size.  For example, to
+capture and encode the middle quarter of a 1920x1080 plane:
+@example
+ffmpeg -f kmsgrab -i - -vf 'hwmap=derive_device=vaapi,crop=960:540:480:270,scale_vaapi=960:540:nv12' -c:v h264_vaapi output.mp4
+@end example
+
 @end itemize
 
 @section lavfi
@@ -1050,54 +1071,21 @@
 
 Requires the configure option @code{--enable-libdc1394}.
 
-@section libndi_newtek
-
-The libndi_newtek input device provides capture capabilities for using NDI (Network
-Device Interface, standard created by NewTek).
-
-Input filename is a NDI source name that could be found by sending -find_sources 1
-to command line - it has no specific syntax but human-readable formatted.
-
-To enable this input device, you need the NDI SDK and you
-need to configure with the appropriate @code{--extra-cflags}
-and @code{--extra-ldflags}.
-
 @subsection Options
-
 @table @option
 
-@item find_sources
-If set to @option{true}, print a list of found/available NDI sources and exit.
-Defaults to @option{false}.
+@item framerate
+Set the frame rate. Default is @code{ntsc}, corresponding to a frame
+rate of @code{30000/1001}.
 
-@item wait_sources
-Override time to wait until the number of online sources have changed.
-Defaults to @option{0.5}.
+@item pixel_format
+Select the pixel format. Default is @code{uyvy422}.
 
-@item allow_video_fields
-When this flag is @option{false}, all video that you receive will be progressive.
-Defaults to @option{true}.
-
+@item video_size
+Set the video size given as a string such as @code{640x480} or @code{hd720}.
+Default is @code{qvga}.
 @end table
 
-@subsection Examples
-
-@itemize
-
-@item
-List input devices:
-@example
-ffmpeg -f libndi_newtek -find_sources 1 -i dummy
-@end example
-
-@item
-Restream to NDI:
-@example
-ffmpeg -f libndi_newtek -i "DEV-5.INTERNAL.M1STEREO.TV (NDI_SOURCE_NAME_1)" -f libndi_newtek -y NDI_SOURCE_NAME_2
-@end example
-
-@end itemize
-
 @section openal
 
 The OpenAL input device provides audio capture on all systems with a
@@ -1539,7 +1527,7 @@
 @end example
 
 @item video_size
-Set the video frame size. Default value is @code{vga}.
+Set the video frame size. Default is the full desktop.
 
 @item grab_x
 @item grab_y
diff --git a/doc/libav-merge.txt b/doc/libav-merge.txt
index d5e671c..bcd0aac 100644
--- a/doc/libav-merge.txt
+++ b/doc/libav-merge.txt
@@ -100,6 +100,7 @@
   - 4de220d2e frame: allow align=0 (meaning automatic) for av_frame_get_buffer()
 - Support recovery from an already present HLS playlist (see 16cb06bb30)
 - Remove all output devices (see 8e7e042d41, 8d3db95f20, 6ce13070bd, d46cd24986 and https://ffmpeg.org/pipermail/ffmpeg-devel/2017-September/216904.html)
+- avcodec/libaomenc: export the Sequence Header OBU as extradata (See a024c3ce9a)
 
 Collateral damage that needs work locally:
 ------------------------------------------
diff --git a/doc/mailing-list-faq.texi b/doc/mailing-list-faq.texi
index 3ab89d6..439d783 100644
--- a/doc/mailing-list-faq.texi
+++ b/doc/mailing-list-faq.texi
@@ -64,10 +64,6 @@
 ffmpeg-devel mailing list.
 @end itemize
 
-Note that the ffmpeg-devel mailing list does not require you to subscribe
-to send a message or patch, but ffmpeg-user and libav-user do require
-subscription.
-
 @chapter Subscribing / Unsubscribing
 
 @anchor{How do I subscribe?}
@@ -94,6 +90,9 @@
 Please avoid asking a mailing list admin to unsubscribe you unless you
 are absolutely unable to do so by yourself. See @ref{Who do I contact if I have a problem with the mailing list?}
 
+Note that it is possible to temporarily halt message delivery (vacation mode).
+See @ref{How do I disable mail delivery without unsubscribing?}
+
 @chapter Moderation Queue
 @anchor{Why is my message awaiting moderator approval?}
 @section Why is my message awaiting moderator approval?
@@ -116,7 +115,8 @@
 
 @section How long does it take for my message in the moderation queue to be approved?
 
-The queue is usually checked daily to several times a week.
+The queue is not checked on a regular basis. You can ask on the
+@t{#ffmpeg-devel} IRC channel on Freenode for someone to approve your message.
 
 @anchor{How do I delete my message in the moderation queue?}
 @section How do I delete my message in the moderation queue?
@@ -157,11 +157,12 @@
 
 You can ask for help in the official @t{#ffmpeg} IRC channel on Freenode.
 
-Some users prefer the third-party Nabble interface which presents the
-mailing lists in a typical forum layout.
+Some users prefer the third-party @url{http://www.ffmpeg-archive.org/, Nabble}
+interface which presents the mailing lists in a typical forum layout.
 
-There are also numerous third-party help sites such as Super User and
-r/ffmpeg on reddit.
+There are also numerous third-party help sites such as
+@url{https://superuser.com/tags/ffmpeg, Super User} and
+@url{https://www.reddit.com/r/ffmpeg/, r/ffmpeg on reddit}.
 
 @anchor{What is top-posting?}
 @section What is top-posting?
@@ -181,7 +182,7 @@
 Anywhere that is not too annoying for us to use.
 
 Google Drive and Dropbox are acceptable if you need a file host, and
-0x0.st is good for files under 256 MiB.
+@url{https://0x0.st/, 0x0.st} is good for files under 256 MiB.
 
 Small, short samples are preferred if possible.
 
@@ -228,6 +229,54 @@
 
 You can then filter the mailing list messages to their own folder.
 
+@anchor{How do I disable mail delivery without unsubscribing?}
+@section How do I disable mail delivery without unsubscribing?
+
+Sometimes you may want to temporarily stop receiving all mailing list
+messages. This "vacation mode" is simple to do:
+
+@enumerate
+@item
+Go to the @url{https://lists.ffmpeg.org/mailman/listinfo/ffmpeg-user/, ffmpeg-user mailing list info page}
+
+@item
+Enter your email address in the box at very bottom of the page and click the
+@emph{Unsubscribe or edit options} box.
+
+@item
+Enter your password and click the @emph{Log in} button.
+
+@item
+Look for the @emph{Mail delivery} option. Here you can disable/enable mail
+delivery. If you check @emph{Set globally} it will apply your choice to all
+other FFmpeg mailing lists you are subscribed to.
+@end enumerate
+
+Alternatively, from your subscribed address, send a message to @email{ffmpeg-user-request@@ffmpeg.org}
+with the subject @emph{set delivery off}. To re-enable mail delivery send a
+message to @email{ffmpeg-user-request@@ffmpeg.org} with the subject
+@emph{set delivery on}.
+
+@anchor{Why is the mailing list munging my address?}
+@section Why is the mailing list munging my address?
+
+This is due to subscribers that use an email service with a DMARC reject policy
+which adds difficulties to mailing list operators.
+
+The mailing list must re-write (munge) the @emph{From:} header for such users;
+otherwise their email service will reject and bounce the message resulting in
+automatic unsubscribing from the mailing list.
+
+When sending a message these users will see @emph{via <mailing list name>}
+added to their name and the @emph{From:} address munged to the address of
+the particular mailing list.
+
+If you want to avoid this then please use a different email service.
+
+Note that ffmpeg-devel does not apply any munging as it causes issues with
+patch authorship. As a result users with an email service with a DMARC reject
+policy may be automatically unsubscribed due to rejected and bounced messages.
+
 @chapter Rules and Etiquette
 
 @section What are the rules and the proper etiquette?
@@ -326,6 +375,15 @@
 Check your spam folder.
 @end itemize
 
+@anchor{Why do I keep getting unsubscribed from ffmpeg-devel?}
+@section Why do I keep getting unsubscribed from ffmpeg-devel?
+
+Users with an email service that has a DMARC reject or quarantine policy may be
+automatically unsubscribed from the ffmpeg-devel mailing list due to the mailing
+list messages being continuously rejected and bounced back.
+
+Consider using a different email service.
+
 @anchor{Who do I contact if I have a problem with the mailing list?}
 @section Who do I contact if I have a problem with the mailing list?
 
diff --git a/doc/metadata.texi b/doc/metadata.texi
index bddcc99..be91059 100644
--- a/doc/metadata.texi
+++ b/doc/metadata.texi
@@ -33,7 +33,7 @@
 used for start/end values. It must be in form
 @samp{TIMEBASE=@var{num}/@var{den}}, where @var{num} and @var{den} are
 integers. If the timebase is missing then start/end times are assumed to
-be in milliseconds.
+be in nanoseconds.
 
 Next a chapter section must contain chapter start and end times in form
 @samp{START=@var{num}}, @samp{END=@var{num}}, where @var{num} is a positive
diff --git a/doc/multithreading.txt b/doc/multithreading.txt
index 83849de..4f645dc 100644
--- a/doc/multithreading.txt
+++ b/doc/multithreading.txt
@@ -51,16 +51,14 @@
 some code can't be moved, have update_thread_context() run it in the next
 thread.
 
-If the codec allocates writable tables in its init(), add an init_thread_copy()
-which re-allocates them for other threads.
-
 Add AV_CODEC_CAP_FRAME_THREADS to the codec capabilities. There will be very little
 speed gain at this point but it should work.
 
 If there are inter-frame dependencies, so the codec calls
-ff_thread_report/await_progress(), set AVCodecInternal.allocate_progress. The
+ff_thread_report/await_progress(), set FF_CODEC_CAP_ALLOCATE_PROGRESS in
+AVCodec.caps_internal and use ff_thread_get_buffer() to allocate frames. The
 frames must then be freed with ff_thread_release_buffer().
-Otherwise leave it at zero and decode directly into the user-supplied frames.
+Otherwise decode directly into the user-supplied frames.
 
 Call ff_thread_report_progress() after some part of the current picture has decoded.
 A good place to put this is where draw_horiz_band() is called - add this if it isn't
diff --git a/doc/muxers.texi b/doc/muxers.texi
index f18543e..cb2bb42 100644
--- a/doc/muxers.texi
+++ b/doc/muxers.texi
@@ -94,21 +94,25 @@
 @anchor{chromaprint}
 @section chromaprint
 
-Chromaprint fingerprinter
+Chromaprint fingerprinter.
 
-This muxer feeds audio data to the Chromaprint library, which generates
-a fingerprint for the provided audio data. It takes a single signed
-native-endian 16-bit raw audio stream.
+This muxer feeds audio data to the Chromaprint library,
+which generates a fingerprint for the provided audio data. See @url{https://acoustid.org/chromaprint}
+
+It takes a single signed native-endian 16-bit raw audio stream of at most 2 channels.
 
 @subsection Options
 
 @table @option
 @item silence_threshold
-Threshold for detecting silence, ranges from 0 to 32767. -1 for default
-(required for use with the AcoustID service).
+Threshold for detecting silence. Range is from -1 to 32767, where -1 disables
+silence detection. Silence detection can only be used with version 3 of the
+algorithm.
+Silence detection must be disabled for use with the AcoustID service. Default is -1.
 
 @item algorithm
-Algorithm index to fingerprint with.
+Version of algorithm to fingerprint with. Range is 0 to 4.
+Version 3 enables silence detection. Default is 1.
 
 @item fp_format
 Format to output the fingerprint as. Accepts the following options:
@@ -120,7 +124,7 @@
 Binary compressed fingerprint
 
 @item base64
-Base64 compressed fingerprint
+Base64 compressed fingerprint @emph{(default)}
 
 @end table
 
@@ -214,66 +218,79 @@
 The segment filename might contain pre-defined identifiers used with SegmentTemplate
 as defined in section 5.3.9.4.4 of the standard. Available identifiers are "$RepresentationID$",
 "$Number$", "$Bandwidth$" and "$Time$".
+In addition to the standard identifiers, an ffmpeg-specific "$ext$" identifier is also supported.
+When specified ffmpeg will replace $ext$ in the file name with muxing format's extensions such as mp4, webm etc.,
 
 @example
-ffmpeg -re -i <input> -map 0 -map 0 -c:a libfdk_aac -c:v libx264
--b:v:0 800k -b:v:1 300k -s:v:1 320x170 -profile:v:1 baseline
--profile:v:0 main -bf 1 -keyint_min 120 -g 120 -sc_threshold 0
--b_strategy 0 -ar:a:1 22050 -use_timeline 1 -use_template 1
--window_size 5 -adaptation_sets "id=0,streams=v id=1,streams=a"
+ffmpeg -re -i <input> -map 0 -map 0 -c:a libfdk_aac -c:v libx264 \
+-b:v:0 800k -b:v:1 300k -s:v:1 320x170 -profile:v:1 baseline \
+-profile:v:0 main -bf 1 -keyint_min 120 -g 120 -sc_threshold 0 \
+-b_strategy 0 -ar:a:1 22050 -use_timeline 1 -use_template 1 \
+-window_size 5 -adaptation_sets "id=0,streams=v id=1,streams=a" \
 -f dash /path/to/out.mpd
 @end example
 
 @table @option
-@item -min_seg_duration @var{microseconds}
+@item min_seg_duration @var{microseconds}
 This is a deprecated option to set the segment length in microseconds, use @var{seg_duration} instead.
-@item -seg_duration @var{duration}
+@item seg_duration @var{duration}
 Set the segment length in seconds (fractional value can be set). The value is
 treated as average segment duration when @var{use_template} is enabled and
-@var{use_timeline} is disabled and as minimum segment duration for all the other
-use cases.
-@item -window_size @var{size}
+@item frag_duration @var{duration}
+Set the length in seconds of fragments within segments (fractional value can be set).
+@item frag_type @var{type}
+Set the type of interval for fragmentation.
+@item window_size @var{size}
 Set the maximum number of segments kept in the manifest.
-@item -extra_window_size @var{size}
+@item extra_window_size @var{size}
 Set the maximum number of segments kept outside of the manifest before removing from disk.
-@item -remove_at_exit @var{remove}
+@item remove_at_exit @var{remove}
 Enable (1) or disable (0) removal of all segments when finished.
-@item -use_template @var{template}
+@item use_template @var{template}
 Enable (1) or disable (0) use of SegmentTemplate instead of SegmentList.
-@item -use_timeline @var{timeline}
+@item use_timeline @var{timeline}
 Enable (1) or disable (0) use of SegmentTimeline in SegmentTemplate.
-@item -single_file @var{single_file}
+@item single_file @var{single_file}
 Enable (1) or disable (0) storing all segments in one file, accessed using byte ranges.
-@item -single_file_name @var{file_name}
-DASH-templated name to be used for baseURL. Implies @var{single_file} set to "1".
-@item -init_seg_name @var{init_name}
-DASH-templated name to used for the initialization segment. Default is "init-stream$RepresentationID$.m4s"
-@item -media_seg_name @var{segment_name}
-DASH-templated name to used for the media segments. Default is "chunk-stream$RepresentationID$-$Number%05d$.m4s"
-@item -utc_timing_url @var{utc_url}
+@item single_file_name @var{file_name}
+DASH-templated name to be used for baseURL. Implies @var{single_file} set to "1". In the template, "$ext$" is replaced with the file name extension specific for the segment format.
+@item init_seg_name @var{init_name}
+DASH-templated name to used for the initialization segment. Default is "init-stream$RepresentationID$.$ext$". "$ext$" is replaced with the file name extension specific for the segment format.
+@item media_seg_name @var{segment_name}
+DASH-templated name to used for the media segments. Default is "chunk-stream$RepresentationID$-$Number%05d$.$ext$". "$ext$" is replaced with the file name extension specific for the segment format.
+@item utc_timing_url @var{utc_url}
 URL of the page that will return the UTC timestamp in ISO format. Example: "https://time.akamai.com/?iso"
 @item method @var{method}
 Use the given HTTP method to create output files. Generally set to PUT or POST.
-@item -http_user_agent @var{user_agent}
+@item http_user_agent @var{user_agent}
 Override User-Agent field in HTTP header. Applicable only for HTTP output.
-@item -http_persistent @var{http_persistent}
+@item http_persistent @var{http_persistent}
 Use persistent HTTP connections. Applicable only for HTTP output.
-@item -hls_playlist @var{hls_playlist}
+@item hls_playlist @var{hls_playlist}
 Generate HLS playlist files as well. The master playlist is generated with the filename master.m3u8.
 One media playlist file is generated for each stream with filenames media_0.m3u8, media_1.m3u8, etc.
-@item -streaming @var{streaming}
+@item streaming @var{streaming}
 Enable (1) or disable (0) chunk streaming mode of output. In chunk streaming
 mode, each frame will be a moof fragment which forms a chunk.
-@item -adaptation_sets @var{adaptation_sets}
+@item adaptation_sets @var{adaptation_sets}
 Assign streams to AdaptationSets. Syntax is "id=x,streams=a,b,c id=y,streams=d,e" with x and y being the IDs
 of the adaptation sets and a,b,c,d and e are the indices of the mapped streams.
 
 To map all video (or audio) streams to an AdaptationSet, "v" (or "a") can be used as stream identifier instead of IDs.
 
 When no assignment is defined, this defaults to an AdaptationSet for each stream.
-@item -timeout @var{timeout}
+
+Optional syntax is "id=x,seg_duration=x,frag_duration=x,frag_type=type,descriptor=descriptor_string,streams=a,b,c id=y,seg_duration=y,frag_type=type,streams=d,e" and so on,
+descriptor is useful to the scheme defined by ISO/IEC 23009-1:2014/Amd.2:2015.
+For example, -adaptation_sets "id=0,descriptor=<SupplementalProperty schemeIdUri=\"urn:mpeg:dash:srd:2014\" value=\"0,0,0,1,1,2,2\"/>,streams=v".
+Please note that descriptor string should be a self-closing xml tag.
+seg_duration, frag_duration and frag_type override the global option values for each adaptation set.
+For example, -adaptation_sets "id=0,seg_duration=2,frag_duration=1,frag_type=duration,streams=v id=1,seg_duration=2,frag_type=none,streams=a"
+type_id marks an adaptation set as containing streams meant to be used for Trick Mode for the referenced adaptation set.
+For example, -adaptation_sets "id=0,seg_duration=2,frag_type=none,streams=0 id=1,seg_duration=10,frag_type=none,trick_id=0,streams=1"
+@item timeout @var{timeout}
 Set timeout for socket I/O operations. Applicable only for HTTP output.
-@item -index_correction @var{index_correction}
+@item index_correction @var{index_correction}
 Enable (1) or Disable (0) segment index correction logic. Applicable only when
 @var{use_template} is enabled and @var{use_timeline} is disabled.
 
@@ -284,18 +301,68 @@
 Typically this logic is needed in live streaming use cases. The network bandwidth
 fluctuations are common during long run streaming. Each fluctuation can cause
 the segment indexes fall behind the expected real time position.
-@item -format_options @var{options_list}
+@item format_options @var{options_list}
 Set container format (mp4/webm) options using a @code{:} separated list of
 key=value parameters. Values containing @code{:} special characters must be
 escaped.
 
+@item global_sidx @var{global_sidx}
+Write global SIDX atom. Applicable only for single file, mp4 output, non-streaming mode.
+
 @item dash_segment_type @var{dash_segment_type}
 Possible values:
+@table @option
+@item auto
+If this flag is set, the dash segment files format will be selected based on the stream codec. This is the default mode.
+
 @item mp4
-If this flag is set, the dash segment files will be in in ISOBMFF format. This is the default format.
+If this flag is set, the dash segment files will be in in ISOBMFF format.
 
 @item webm
 If this flag is set, the dash segment files will be in in WebM format.
+@end table
+
+@item ignore_io_errors @var{ignore_io_errors}
+Ignore IO errors during open and write. Useful for long-duration runs with network output.
+
+@item lhls @var{lhls}
+Enable Low-latency HLS(LHLS). Adds #EXT-X-PREFETCH tag with current segment's URI.
+Apple doesn't have an official spec for LHLS. Meanwhile hls.js player folks are
+trying to standardize a open LHLS spec. The draft spec is available in https://github.com/video-dev/hlsjs-rfcs/blob/lhls-spec/proposals/0001-lhls.md
+This option will also try to comply with the above open spec, till Apple's spec officially supports it.
+Applicable only when @var{streaming} and @var{hls_playlist} options are enabled.
+This is an experimental feature.
+
+@item ldash @var{ldash}
+Enable Low-latency Dash by constraining the presence and values of some elements.
+
+@item master_m3u8_publish_rate @var{master_m3u8_publish_rate}
+Publish master playlist repeatedly every after specified number of segment intervals.
+
+@item write_prft @var{write_prft}
+Write Producer Reference Time elements on supported streams. This also enables writing
+prft boxes in the underlying muxer. Applicable only when the @var{utc_url} option is enabled.
+It's set to auto by default, in which case the muxer will attempt to enable it only in modes
+that require it.
+
+@item mpd_profile @var{mpd_profile}
+Set one or more manifest profiles.
+
+@item http_opts @var{http_opts}
+A :-separated list of key=value options to pass to the underlying HTTP
+protocol. Applicable only for HTTP output.
+
+@item target_latency @var{target_latency}
+Set an intended target latency in seconds (fractional value can be set) for serving. Applicable only when @var{streaming} and @var{write_prft} options are enabled.
+This is an informative fields clients can use to measure the latency of the service.
+
+@item min_playback_rate @var{min_playback_rate}
+Set the minimum playback rate indicated as appropriate for the purposes of automatically
+adjusting playback latency and buffer occupancy during normal playback by clients.
+
+@item max_playback_rate @var{max_playback_rate}
+Set the maximum playback rate indicated as appropriate for the purposes of automatically
+adjusting playback latency and buffer occupancy during normal playback by clients.
 
 @end table
 
@@ -632,7 +699,8 @@
 @file{file_1_000.ts}, @file{file_1_001.ts}, @file{file_1_002.ts}, etc.
 
 The string "%v" may be present in the filename or in the last directory name
-containing the file. If the string is present in the directory name, then
+containing the file, but only in one of them. (Additionally, %v may appear multiple times in the last
+sub-directory or filename.) If the string %v is present in the directory name, then
 sub-directories are created after expanding the directory name pattern. This
 enables creation of segments corresponding to different variant streams in
 subdirectories.
@@ -764,17 +832,20 @@
 
 @table @samp
 @item mpegts
-If this flag is set, the hls segment files will format to mpegts.
-the mpegts files is used in all hls versions.
+Output segment files in MPEG-2 Transport Stream format. This is
+compatible with all HLS versions.
 
 @item fmp4
-If this flag is set, the hls segment files will format to fragment mp4 looks like dash.
-the fmp4 files is used in hls after version 7.
+Output segment files in fragmented MP4 format, similar to MPEG-DASH.
+fmp4 files may be used in HLS version 7 and above.
 
 @end table
 
 @item hls_fmp4_init_filename @var{filename}
-set filename to the fragment files header file, default filename is @file{init.mp4}.
+Set filename to the fragment files header file, default filename is @file{init.mp4}.
+
+@item hls_fmp4_init_resend @var{filename}
+Resend init file after m3u8 file refresh every time, default is @var{0}.
 
 When @code{var_stream_map} is set with two or more variant streams, the
 @var{filename} pattern must contain the string "%v", this string specifies
@@ -828,6 +899,10 @@
 Add the @code{#EXT-X-INDEPENDENT-SEGMENTS} to playlists that has video segments
 and when all the segments of that playlist are guaranteed to start with a Key frame.
 
+@item iframes_only
+Add the @code{#EXT-X-I-FRAMES-ONLY} to playlists that has video segments
+and can play only I-frames in the @code{#EXT-X-BYTERANGE} mode.
+
 @item split_by_time
 Allow segments to start on frames other than keyframes. This improves
 behavior on some players when the time between keyframes is inconsistent,
@@ -864,7 +939,11 @@
 @item temp_file
 Write segment data to filename.tmp and rename to filename only once the segment is complete. A webserver
 serving up segments can be configured to reject requests to *.tmp to prevent access to in-progress segments
-before they have been added to the m3u8 playlist.
+before they have been added to the m3u8 playlist. This flag also affects how m3u8 playlist files are created.
+If this flag is set, all playlist files will written into temporary file and renamed after they are complete, similarly as segments are handled.
+But playlists with @code{file} protocol and with type (@code{hls_playlist_type}) other than @code{vod}
+are always written into temporary file regardless of this flag. Master playlist files (@code{master_pl_name}), if any, with @code{file} protocol,
+are always written into temporary file regardless of this flag if @code{master_pl_publish_rate} value is other than zero.
 
 @end table
 
@@ -915,7 +994,21 @@
 contain video stream of bitrate 1000k and audio stream of bitrate 64k and the
 second variant stream will contain video stream of bitrate 256k and audio
 stream of bitrate 32k. Here, two media playlist with file names out_0.m3u8 and
-out_1.m3u8 will be created.
+out_1.m3u8 will be created. If you want something meaningful text instead of indexes
+in result names, you may specify names for each or some of the variants
+as in the following example.
+
+
+@example
+ffmpeg -re -i in.ts -b:v:0 1000k -b:v:1 256k -b:a:0 64k -b:a:1 32k \
+  -map 0:v -map 0:a -map 0:v -map 0:a -f hls -var_stream_map "v:0,a:0,name:my_hd v:1,a:1,name:my_sd" \
+  http://example.com/live/out_%v.m3u8
+@end example
+
+This example creates two hls variant streams as in the previous one.
+But here, the two media playlist with file names out_my_hd.m3u8 and
+out_my_sd.m3u8 will be created.
+
 @example
 ffmpeg -re -i in.ts -b:v:0 1000k -b:v:1 256k -b:a:0 64k \
   -map 0:v -map 0:a -map 0:v -f hls -var_stream_map "v:0 a:0 v:1" \
@@ -949,6 +1042,52 @@
 
 By default, a single hls variant containing all the encoded streams is created.
 
+@example
+ffmpeg -re -i in.ts -b:a:0 32k -b:a:1 64k -b:v:0 1000k \
+  -map 0:a -map 0:a -map 0:v -f hls \
+  -var_stream_map "a:0,agroup:aud_low,default:yes a:1,agroup:aud_low v:0,agroup:aud_low" \
+  -master_pl_name master.m3u8 \
+  http://example.com/live/out_%v.m3u8
+@end example
+This example creates two audio only and one video only variant streams. In
+addition to the #EXT-X-STREAM-INF tag for each variant stream in the master
+playlist, #EXT-X-MEDIA tag is also added for the two audio only variant streams
+and they are mapped to the one video only variant streams with audio group name
+'aud_low', and the audio group have default stat is NO or YES.
+
+By default, a single hls variant containing all the encoded streams is created.
+
+@example
+ffmpeg -re -i in.ts -b:a:0 32k -b:a:1 64k -b:v:0 1000k \
+  -map 0:a -map 0:a -map 0:v -f hls \
+  -var_stream_map "a:0,agroup:aud_low,default:yes,language:ENG a:1,agroup:aud_low,language:CHN v:0,agroup:aud_low" \
+  -master_pl_name master.m3u8 \
+  http://example.com/live/out_%v.m3u8
+@end example
+This example creates two audio only and one video only variant streams. In
+addition to the #EXT-X-STREAM-INF tag for each variant stream in the master
+playlist, #EXT-X-MEDIA tag is also added for the two audio only variant streams
+and they are mapped to the one video only variant streams with audio group name
+'aud_low', and the audio group have default stat is NO or YES, and one audio
+have and language is named ENG, the other audio language is named CHN.
+
+By default, a single hls variant containing all the encoded streams is created.
+
+@example
+ffmpeg -y -i input_with_subtitle.mkv \
+ -b:v:0 5250k -c:v h264 -pix_fmt yuv420p -profile:v main -level 4.1 \
+ -b:a:0 256k \
+ -c:s webvtt -c:a mp2 -ar 48000 -ac 2 -map 0:v -map 0:a:0 -map 0:s:0 \
+ -f hls -var_stream_map "v:0,a:0,s:0,sgroup:subtitle" \
+ -master_pl_name master.m3u8 -t 300 -hls_time 10 -hls_init_time 4 -hls_list_size \
+ 10 -master_pl_publish_rate 10  -hls_flags \
+ delete_segments+discont_start+split_by_time ./tmp/video.m3u8
+@end example
+
+This example adds @code{#EXT-X-MEDIA} tag with @code{TYPE=SUBTITLES} in
+the master playlist with webvtt subtitle group name 'subtitle'. Please make sure
+the input file has one text subtitle stream at least.
+
 @item cc_stream_map
 Map string which specifies different closed captions groups and their
 attributes. The closed captions stream groups are separated by space.
@@ -969,7 +1108,7 @@
   http://example.com/live/out.m3u8
 @end example
 This example adds @code{#EXT-X-MEDIA} tag with @code{TYPE=CLOSED-CAPTIONS} in
-the master playlist with group name 'cc', langauge 'en' (english) and
+the master playlist with group name 'cc', language 'en' (english) and
 INSTREAM-ID 'CC1'. Also, it adds @code{CLOSED-CAPTIONS} attribute with group
 name 'cc' for the output variant stream.
 @example
@@ -1012,6 +1151,12 @@
 @item timeout
 Set timeout for socket I/O operations. Applicable only for HTTP output.
 
+@item -ignore_io_errors
+Ignore IO errors during open, write and delete. Useful for long-duration runs with network output.
+
+@item headers
+Set custom HTTP headers, can override built in default headers. Applicable only for HTTP output.
+
 @end table
 
 @anchor{ico}
@@ -1077,6 +1222,37 @@
 form @file{img%-1.jpg}, @file{img%-2.jpg}, ..., @file{img%-10.jpg},
 etc.
 
+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.
+
+@subsection Options
+
+@table @option
+@item frame_pts
+If set to 1, expand the filename with pts from pkt->pts.
+Default value is 0.
+
+@item start_number
+Start the sequence from the specified number. Default value is 1.
+
+@item update
+If set to 1, the filename will always be interpreted as just a
+filename, not a pattern, and the corresponding file will be continuously
+overwritten with new images. Default value is 0.
+
+@item strftime
+If set to 1, expand the filename with date and time information from
+@code{strftime()}. Default value is 0.
+
+@item protocol_opts @var{options_list}
+Set protocol options as a :-separated list of key=value parameters. Values
+containing the @code{:} special character must be escaped.
+
+@end table
+
 @subsection Examples
 
 The following example shows how to use @command{ffmpeg} for creating a
@@ -1117,31 +1293,11 @@
 ffmpeg -f v4l2 -r 1 -i /dev/video0 -copyts -f image2 -frame_pts true %d.jpg"
 @end example
 
-@subsection Options
-
-@table @option
-@item frame_pts
-If set to 1, expand the filename with pts from pkt->pts.
-Default value is 0.
-
-@item start_number
-Start the sequence from the specified number. Default value is 1.
-
-@item update
-If set to 1, the filename will always be interpreted as just a
-filename, not a pattern, and the corresponding file will be continuously
-overwritten with new images. Default value is 0.
-
-@item strftime
-If set to 1, expand the filename with date and time information from
-@code{strftime()}. Default value is 0.
-@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.
+A more complex example is to publish contents of your desktop directly to a
+WebDAV server every second:
+@example
+ffmpeg -f x11grab -framerate 1 -i :0.0 -q:v 6 -update 1 -protocol_opts method=PUT http://example.com/desktop.jpg
+@end example
 
 @section matroska
 
@@ -1222,11 +1378,31 @@
 
 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.
+finishes. If the reserved space does not suffice, no Cues will be written, the
+file will be finalized and writing the trailer will return an error.
+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.
+@item default_mode
+This option controls how the FlagDefault of the output tracks will be set.
+It influences which tracks players should play by default. The default mode
+is @samp{infer}.
+@table @samp
+@item infer
+In this mode, for each type of track (audio, video or subtitle), if there is
+a track with disposition default of this type, then the first such track
+(i.e. the one with the lowest index) will be marked as default; if no such
+track exists, the first track of this type will be marked as default instead
+(if existing). This ensures that the default flag is set in a sensible way even
+if the input originated from containers that lack the concept of default tracks.
+@item infer_no_subs
+This mode is the same as infer except that if no subtitle track with
+disposition default exists, no subtitle track will be marked as default.
+@item passthrough
+In this mode the FlagDefault is set if and only if the AV_DISPOSITION_DEFAULT
+flag is set in the disposition of the corresponding stream.
+@end table
 @end table
 
 @anchor{md5}
@@ -1319,6 +1495,10 @@
 pair for each track, making it easier to separate tracks.
 
 This option is implicitly set when writing ismv (Smooth Streaming) files.
+@item -movflags skip_sidx
+Skip writing of sidx atom. When bitrate overhead due to sidx atom is high,
+this option could be used for cases where sidx atom is not mandatory.
+When global_sidx flag is enabled, this option will be ignored.
 @item -movflags faststart
 Run a second pass moving the index (moov atom) to the beginning of the file.
 This operation can take a while, and will not work in various situations such
@@ -1372,13 +1552,6 @@
 ffmpeg -re @var{<normal input/transcoding options>} -movflags isml+frag_keyframe -f ismv http://server/publishingpoint.isml/Streams(Encoder1)
 @end example
 
-@subsection Audible AAX
-
-Audible AAX files are encrypted M4B files, and they can be decrypted by specifying a 4 byte activation secret.
-@example
-ffmpeg -activation_bytes 1CEB00DA -i test.aax -vn -c:a copy output.mp4
-@end example
-
 @section mp3
 
 The MP3 muxer writes a raw MP3 stream with the following optional features:
@@ -1467,7 +1640,7 @@
 Accepts the following options:
 @table @samp
 @item hex_value
-Any hexdecimal value between @code{0x01} to @code{0xff} as defined in
+Any hexadecimal value between @code{0x01} and @code{0xff} as defined in
 ETSI 300 468.
 @item digital_tv
 Digital TV service.
@@ -1486,11 +1659,14 @@
 @end table
 
 @item mpegts_pmt_start_pid @var{integer}
-Set the first PID for PMT. Default is @code{0x1000}. Max is @code{0x1f00}.
+Set the first PID for PMTs. Default is @code{0x1000}, minimum is @code{0x0020},
+maximum is @code{0x1ffa}. This option has no effect in m2ts mode where the PMT
+PID is fixed @code{0x0100}.
 
 @item mpegts_start_pid @var{integer}
-Set the first PID for data packets. Default is @code{0x0100}. Max is
-@code{0x0f00}.
+Set the first PID for elementary streams. Default is @code{0x0100}, minimum is
+@code{0x0020}, maximum is @code{0x1ffa}. This option has no effect in m2ts mode
+where the elementary stream PIDs are fixed.
 
 @item mpegts_m2ts_mode @var{boolean}
 Enable m2ts mode if set to @code{1}. Default value is @code{-1} which
@@ -1517,10 +1693,6 @@
 Mark the initial packet of each stream as discontinuity.
 @end table
 
-@item resend_headers @var{integer}
-Reemit PAT/PMT before writing the next packet. This option is deprecated:
-use @option{mpegts_flags} instead.
-
 @item mpegts_copyts @var{boolean}
 Preserve original timestamps, if value is set to @code{1}. Default value
 is @code{-1}, which results in shifting timestamps so that they start from 0.
@@ -1529,14 +1701,16 @@
 Omit the PES packet length for video packets. Default is @code{1} (true).
 
 @item pcr_period @var{integer}
-Override the default PCR retransmission time in milliseconds. Ignored if
-variable muxrate is selected. Default is @code{20}.
+Override the default PCR retransmission time in milliseconds. Default is
+@code{-1} which means that the PCR interval will be determined automatically:
+20 ms is used for CBR streams, the highest multiple of the frame duration which
+is less than 100 ms is used for VBR streams.
 
-@item pat_period @var{double}
-Maximum time in seconds between PAT/PMT tables.
+@item pat_period @var{duration}
+Maximum time in seconds between PAT/PMT tables. Default is @code{0.1}.
 
-@item sdt_period @var{double}
-Maximum time in seconds between SDT tables.
+@item sdt_period @var{duration}
+Maximum time in seconds between SDT tables. Default is @code{0.5}.
 
 @item tables_version @var{integer}
 Set PAT, PMT and SDT version (default @code{0}, valid values are from 0 to 31, inclusively).
@@ -1570,7 +1744,7 @@
      out.ts
 @end example
 
-@section mxf, mxf_d10
+@section mxf, mxf_d10, mxf_opatom
 
 MXF muxer.
 
@@ -1582,7 +1756,7 @@
 @item store_user_comments @var{bool}
 Set if user comments should be stored if available or never.
 IRT D-10 does not allow user comments. The default is thus to write them for
-mxf but not for mxf_d10
+mxf and mxf_opatom but not for mxf_d10
 @end table
 
 @section null
@@ -1972,6 +2146,53 @@
 
 @end table
 
+@anchor{streamhash}
+@section streamhash
+
+Per stream hash testing format.
+
+This muxer computes and prints a cryptographic hash of all the input frames,
+on a per-stream basis. This can be used for equality checks without having
+to do a complete binary comparison.
+
+By default audio frames are converted to signed 16-bit raw audio and
+video frames to raw video before computing the hash, but the output
+of explicit conversions to other codecs can also be used. Timestamps
+are ignored. It uses the SHA-256 cryptographic hash function by default,
+but supports several other algorithms.
+
+The output of the muxer consists of one line per stream of the form:
+@var{streamindex},@var{streamtype},@var{algo}=@var{hash}, where
+@var{streamindex} is the index of the mapped stream, @var{streamtype} is a
+single character indicating the type of stream, @var{algo} is a short string
+representing the hash function used, and @var{hash} is a hexadecimal number
+representing the computed hash.
+
+@table @option
+@item hash @var{algorithm}
+Use the cryptographic hash function specified by the string @var{algorithm}.
+Supported values include @code{MD5}, @code{murmur3}, @code{RIPEMD128},
+@code{RIPEMD160}, @code{RIPEMD256}, @code{RIPEMD320}, @code{SHA160},
+@code{SHA224}, @code{SHA256} (default), @code{SHA512/224}, @code{SHA512/256},
+@code{SHA384}, @code{SHA512}, @code{CRC32} and @code{adler32}.
+
+@end table
+
+@subsection Examples
+
+To compute the SHA-256 hash of the input converted to raw audio and
+video, and store it in the file @file{out.sha256}:
+@example
+ffmpeg -i INPUT -f streamhash out.sha256
+@end example
+
+To print an MD5 hash to stdout use the command:
+@example
+ffmpeg -i INPUT -f streamhash -hash md5 -
+@end example
+
+See also the @ref{hash} and @ref{framehash} muxers.
+
 @anchor{fifo}
 @section fifo
 
diff --git a/doc/outdevs.texi b/doc/outdevs.texi
index 2518f9b..60606eb 100644
--- a/doc/outdevs.texi
+++ b/doc/outdevs.texi
@@ -140,8 +140,8 @@
 
 @item list_devices
 If set to @option{true}, print a list of devices and exit.
-Defaults to @option{false}. Alternatively you can use the @code{-sinks}
-option of ffmpeg to list the available output devices.
+Defaults to @option{false}. This option is deprecated, please use the
+@code{-sinks} option of ffmpeg to list the available output devices.
 
 @item list_formats
 If set to @option{true}, print a list of supported formats and exit.
@@ -155,6 +155,10 @@
 Sets the decklink device duplex mode. Must be @samp{unset}, @samp{half} or @samp{full}.
 Defaults to @samp{unset}.
 
+@item timing_offset
+Sets the genlock timing pixel offset on the used output.
+Defaults to @samp{unset}.
+
 @end table
 
 @subsection Examples
@@ -164,7 +168,7 @@
 @item
 List output devices:
 @example
-ffmpeg -i test.avi -f decklink -list_devices 1 dummy
+ffmpeg -sinks decklink
 @end example
 
 @item
@@ -216,51 +220,6 @@
 
 See also @url{http://linux-fbdev.sourceforge.net/}, and fbset(1).
 
-@section libndi_newtek
-
-The libndi_newtek output device provides playback capabilities for using NDI (Network
-Device Interface, standard created by NewTek).
-
-Output filename is a NDI name.
-
-To enable this output device, you need the NDI SDK and you
-need to configure with the appropriate @code{--extra-cflags}
-and @code{--extra-ldflags}.
-
-NDI uses uyvy422 pixel format natively, but also supports bgra, bgr0, rgba and
-rgb0.
-
-@subsection Options
-
-@table @option
-
-@item reference_level
-The audio reference level in dB. This specifies how many dB above the
-reference level (+4dBU) is the full range of 16 bit audio.
-Defaults to @option{0}.
-
-@item clock_video
-These specify whether video "clock" themselves.
-Defaults to @option{false}.
-
-@item clock_audio
-These specify whether audio "clock" themselves.
-Defaults to @option{false}.
-
-@end table
-
-@subsection Examples
-
-@itemize
-
-@item
-Play video clip:
-@example
-ffmpeg -i "udp://@@239.1.1.1:10480?fifo_size=1000000&overrun_nonfatal=1" -vf "scale=720:576,fps=fps=25,setdar=dar=16/9,format=pix_fmts=uyvy422" -f libndi_newtek NEW_NDI1
-@end example
-
-@end itemize
-
 @section opengl
 OpenGL output device.
 
@@ -370,6 +329,8 @@
 
 SDL (Simple DirectMedia Layer) output device.
 
+"sdl2" can be used as alias for "sdl".
+
 This output device allows one to show a video stream in an SDL
 window. Only one SDL window is allowed per application, so you can
 have only one instance of this output device in an application.
@@ -398,6 +359,10 @@
 If not specified it defaults to the size of the input video,
 downscaled according to the aspect ratio.
 
+@item window_x
+@item window_y
+Set the position of the window on the screen.
+
 @item window_fullscreen
 Set fullscreen mode when non-zero value is provided.
 Default value is zero.
diff --git a/doc/protocols.texi b/doc/protocols.texi
index b34f29e..e510019 100644
--- a/doc/protocols.texi
+++ b/doc/protocols.texi
@@ -51,6 +51,66 @@
 
 A description of the currently available protocols follows.
 
+@section amqp
+
+Advanced Message Queueing Protocol (AMQP) version 0-9-1 is a broker based
+publish-subscribe communication protocol.
+
+FFmpeg must be compiled with --enable-librabbitmq to support AMQP. A separate
+AMQP broker must also be run. An example open-source AMQP broker is RabbitMQ.
+
+After starting the broker, an FFmpeg client may stream data to the broker using
+the command:
+
+@example
+ffmpeg -re -i input -f mpegts amqp://[[user]:[password]@@]hostname[:port]
+@end example
+
+Where hostname and port (default is 5672) is the address of the broker. The
+client may also set a user/password for authentication. The default for both
+fields is "guest".
+
+Muliple subscribers may stream from the broker using the command:
+@example
+ffplay amqp://[[user]:[password]@@]hostname[:port]
+@end example
+
+In RabbitMQ all data published to the broker flows through a specific exchange,
+and each subscribing client has an assigned queue/buffer. When a packet arrives
+at an exchange, it may be copied to a client's queue depending on the exchange
+and routing_key fields.
+
+The following options are supported:
+
+@table @option
+
+@item exchange
+Sets the exchange to use on the broker. RabbitMQ has several predefined
+exchanges: "amq.direct" is the default exchange, where the publisher and
+subscriber must have a matching routing_key; "amq.fanout" is the same as a
+broadcast operation (i.e. the data is forwarded to all queues on the fanout
+exchange independent of the routing_key); and "amq.topic" is similar to
+"amq.direct", but allows for more complex pattern matching (refer to the RabbitMQ
+documentation).
+
+@item routing_key
+Sets the routing key. The default value is "amqp". The routing key is used on
+the "amq.direct" and "amq.topic" exchanges to decide whether packets are written
+to the queue of a subscriber.
+
+@item pkt_size
+Maximum size of each packet sent/received to the broker. Default is 131072.
+Minimum is 4096 and max is any large value (representable by an int). When
+receiving packets, this sets an internal buffer size in FFmpeg. It should be
+equal to or greater than the size of the published packets to the broker. Otherwise
+the received message may be truncated causing decoding errors.
+
+@item connection_timeout
+The timeout in seconds during the initial connection to the broker. The
+default value is rw_timeout, or 5 seconds if rw_timeout is not set.
+
+@end table
+
 @section async
 
 Asynchronous data filling wrapper for input stream.
@@ -193,6 +253,20 @@
 @code{INT_MAX}, which results in not limiting the requested block size.
 Setting this value reasonably low improves user termination request reaction
 time, which is valuable for files on slow medium.
+
+@item follow
+If set to 1, the protocol will retry reading at the end of the file, allowing
+reading files that still are being written. In order for this to terminate,
+you either need to use the rw_timeout option, or use the interrupt callback
+(for API users).
+
+@item seekable
+Controls if seekability is advertised on the file. 0 means non-seekable, -1
+means auto (seekable for normal files, non-seekable for named pipes).
+
+Many demuxers handle seekable and non-seekable resources differently,
+overriding this might speed up opening certain files at the cost of losing some
+features (e.g. accurate seeking).
 @end table
 
 @section ftp
@@ -214,6 +288,14 @@
 operation. By default it is set to -1, which means that the timeout is
 not specified.
 
+@item ftp-user
+Set a user to be used for authenticating to the FTP server. This is overridden by the
+user in the FTP URL.
+
+@item ftp-password
+Set a password to be used for authenticating to the FTP server. This is overridden by
+the password in the FTP URL, or by @option{ftp-anonymous-password} if no user is set.
+
 @item ftp-anonymous-password
 Password used when login as anonymous user. Typically an e-mail address
 should be used.
@@ -229,17 +311,6 @@
 etc.). Different FTP servers behave in different way during seek
 operation. ff* tools may produce incomplete content due to server limitations.
 
-This protocol accepts the following options:
-
-@table @option
-@item follow
-If set to 1, the protocol will retry reading at the end of the file, allowing
-reading files that still are being written. In order for this to terminate,
-you either need to use the rw_timeout option, or use the interrupt callback
-(for API users).
-
-@end table
-
 @section gopher
 
 Gopher protocol.
@@ -390,6 +461,11 @@
 wget --post-file=somefile.ogg http://@var{server}:@var{port}
 @end example
 
+@item send_expect_100
+Send an Expect: 100-continue header for POST. If set to 1 it will send, if set
+to 0 it won't, if set to -1 it will try to send if it is applicable. Default
+value is -1.
+
 @end table
 
 @subsection HTTP Cookies
@@ -1266,6 +1342,26 @@
 the receiver only if the received data is encrypted.
 The configured passphrase cannot be recovered (write-only).
 
+@item enforced_encryption=@var{1|0}
+If true, both connection parties must have the same password
+set (including empty, that is, with no encryption). If the
+password doesn't match or only one side is unencrypted,
+the connection is rejected. Default is true.
+
+@item kmrefreshrate=@var{packets}
+The number of packets to be transmitted after which the
+encryption key is switched to a new key. Default is -1.
+-1 means auto (0x1000000 in srt library). The range for
+this option is integers in the 0 - @code{INT_MAX}.
+
+@item kmpreannounce=@var{packets}
+The interval between when a new encryption key is sent and
+when switchover occurs. This value also applies to the
+subsequent interval between when switchover occurs and
+when the old encryption key is decommissioned. Default is -1.
+-1 means auto (0x1000 in srt library). The range for
+this option is integers in the 0 - @code{INT_MAX}.
+
 @item payload_size=@var{bytes}
 Sets the maximum declared size of a packet transferred
 during the single call to the sending function in Live
@@ -1306,17 +1402,15 @@
 is only available as @option{latency}.
 
 @item recv_buffer_size=@var{bytes}
-Set receive buffer size, expressed in bytes.
+Set UDP receive buffer size, expressed in bytes.
 
 @item send_buffer_size=@var{bytes}
-Set send buffer size, expressed in bytes.
+Set UDP send buffer size, expressed in bytes.
 
-@item rw_timeout
-Set raise error timeout for read/write optations.
-
-This option is only relevant in read mode:
-if no data arrived in more than this time
-interval, raise error.
+@item timeout
+Set raise error timeouts for read, write and connect operations. Note that the
+SRT library has internal timeouts which can be controlled separately, the
+value set here is only a cap on those.
 
 @item tlpktdrop=@var{1|0}
 Too-late Packet Drop. When enabled on receiver, it skips
@@ -1329,6 +1423,93 @@
 automatically enabled in the sender if the receiver
 supports it.
 
+@item sndbuf=@var{bytes}
+Set send buffer size, expressed in bytes.
+
+@item rcvbuf=@var{bytes}
+Set receive buffer size, expressed in bytes.
+
+Receive buffer must not be greater than @option{ffs}.
+
+@item lossmaxttl=@var{packets}
+The value up to which the Reorder Tolerance may grow. When
+Reorder Tolerance is > 0, then packet loss report is delayed
+until that number of packets come in. Reorder Tolerance
+increases every time a "belated" packet has come, but it
+wasn't due to retransmission (that is, when UDP packets tend
+to come out of order), with the difference between the latest
+sequence and this packet's sequence, and not more than the
+value of this option. By default it's 0, which means that this
+mechanism is turned off, and the loss report is always sent
+immediately upon experiencing a "gap" in sequences.
+
+@item minversion
+The minimum SRT version that is required from the peer. A connection
+to a peer that does not satisfy the minimum version requirement
+will be rejected.
+
+The version format in hex is 0xXXYYZZ for x.y.z in human readable
+form.
+
+@item streamid=@var{string}
+A string limited to 512 characters that can be set on the socket prior
+to connecting. This stream ID will be able to be retrieved by the
+listener side from the socket that is returned from srt_accept and
+was connected by a socket with that set stream ID. SRT does not enforce
+any special interpretation of the contents of this string.
+This option doesn’t make sense in Rendezvous connection; the result
+might be that simply one side will override the value from the other
+side and it’s the matter of luck which one would win
+
+@item smoother=@var{live|file}
+The type of Smoother used for the transmission for that socket, which
+is responsible for the transmission and congestion control. The Smoother
+type must be exactly the same on both connecting parties, otherwise
+the connection is rejected.
+
+@item messageapi=@var{1|0}
+When set, this socket uses the Message API, otherwise it uses Buffer
+API. Note that in live mode (see @option{transtype}) there’s only
+message API available. In File mode you can chose to use one of two modes:
+
+Stream API (default, when this option is false). In this mode you may
+send as many data as you wish with one sending instruction, or even use
+dedicated functions that read directly from a file. The internal facility
+will take care of any speed and congestion control. When receiving, you
+can also receive as many data as desired, the data not extracted will be
+waiting for the next call. There is no boundary between data portions in
+the Stream mode.
+
+Message API. In this mode your single sending instruction passes exactly
+one piece of data that has boundaries (a message). Contrary to Live mode,
+this message may span across multiple UDP packets and the only size
+limitation is that it shall fit as a whole in the sending buffer. The
+receiver shall use as large buffer as necessary to receive the message,
+otherwise the message will not be given up. When the message is not
+complete (not all packets received or there was a packet loss) it will
+not be given up.
+
+@item transtype=@var{live|file}
+Sets the transmission type for the socket, in particular, setting this
+option sets multiple other parameters to their default values as required
+for a particular transmission type.
+
+live: Set options as for live transmission. In this mode, you should
+send by one sending instruction only so many data that fit in one UDP packet,
+and limited to the value defined first in @option{payload_size} (1316 is
+default in this mode). There is no speed control in this mode, only the
+bandwidth control, if configured, in order to not exceed the bandwidth with
+the overhead transmission (retransmitted and control packets).
+
+file: Set options as for non-live transmission. See @option{messageapi}
+for further explanations
+
+@item linger=@var{seconds}
+The number of seconds that the socket waits for unsent data when closing.
+Default is -1. -1 means auto (off with 0 seconds in live mode, on with 180
+seconds in file mode). The range for this option is integers in the
+0 - @code{INT_MAX}.
+
 @end table
 
 For more information see: @url{https://github.com/Haivision/srt}.
@@ -1530,7 +1711,7 @@
 @item buffer_size=@var{size}
 Set the UDP maximum socket buffer size in bytes. This is used to set either
 the receive or send buffer size, depending on what the socket is used for.
-Default is 64KB.  See also @var{fifo_size}.
+Default is 32 KB for output, 384 KB for input.  See also @var{fifo_size}.
 
 @item bitrate=@var{bitrate}
 If set to nonzero, the output will have the specified constant bitrate if the
@@ -1639,4 +1820,51 @@
 Create the Unix socket in listening mode.
 @end table
 
+@section zmq
+
+ZeroMQ asynchronous messaging using the libzmq library.
+
+This library supports unicast streaming to multiple clients without relying on
+an external server.
+
+The required syntax for streaming or connecting to a stream is:
+@example
+zmq:tcp://ip-address:port
+@end example
+
+Example:
+Create a localhost stream on port 5555:
+@example
+ffmpeg -re -i input -f mpegts zmq:tcp://127.0.0.1:5555
+@end example
+
+Multiple clients may connect to the stream using:
+@example
+ffplay zmq:tcp://127.0.0.1:5555
+@end example
+
+Streaming to multiple clients is implemented using a ZeroMQ Pub-Sub pattern.
+The server side binds to a port and publishes data. Clients connect to the
+server (via IP address/port) and subscribe to the stream. The order in which
+the server and client start generally does not matter.
+
+ffmpeg must be compiled with the --enable-libzmq option to support
+this protocol.
+
+Options can be set on the @command{ffmpeg}/@command{ffplay} command
+line. The following options are supported:
+
+@table @option
+
+@item pkt_size
+Forces the maximum packet size for sending/receiving data. The default value is
+131,072 bytes. On the server side, this sets the maximum size of sent packets
+via ZeroMQ. On the clients, it sets an internal buffer size for receiving
+packets. Note that pkt_size on the clients should be equal to or greater than
+pkt_size on the server. Otherwise the received message may be truncated causing
+decoding errors.
+
+@end table
+
+
 @c man end PROTOCOLS
diff --git a/doc/scaler.texi b/doc/scaler.texi
index f73804a..eb045de 100644
--- a/doc/scaler.texi
+++ b/doc/scaler.texi
@@ -5,7 +5,8 @@
 The video scaler supports the following named options.
 
 Options may be set by specifying -@var{option} @var{value} in the
-FFmpeg tools. For programmatic use, they can be set explicitly in the
+FFmpeg tools, with a few API-only exceptions noted below.
+For programmatic use, they can be set explicitly in the
 @code{SwsContext} options or through the @file{libavutil/opt.h} API.
 
 @table @option
@@ -47,7 +48,8 @@
 Select sinc rescaling algorithm.
 
 @item lanczos
-Select Lanczos rescaling algorithm.
+Select Lanczos rescaling algorithm. The default width (alpha) is 3 and can be
+changed by setting @code{param0}.
 
 @item spline
 Select natural bicubic spline rescaling algorithm.
@@ -68,29 +70,31 @@
 Enable bitexact output.
 @end table
 
-@item srcw
+@item srcw @var{(API only)}
 Set source width.
 
-@item srch
+@item srch @var{(API only)}
 Set source height.
 
-@item dstw
+@item dstw @var{(API only)}
 Set destination width.
 
-@item dsth
+@item dsth @var{(API only)}
 Set destination height.
 
-@item src_format
+@item src_format @var{(API only)}
 Set source pixel format (must be expressed as an integer).
 
-@item dst_format
+@item dst_format @var{(API only)}
 Set destination pixel format (must be expressed as an integer).
 
-@item src_range
-Select source range.
+@item src_range @var{(boolean)}
+If value is set to @code{1}, indicates source is full range. Default value is
+@code{0}, which indicates source is limited range.
 
-@item dst_range
-Select destination range.
+@item dst_range @var{(boolean)}
+If value is set to @code{1}, enable full range for destination. Default value
+is @code{0}, which enables limited range.
 
 @anchor{sws_params}
 @item param0, param1
diff --git a/doc/snow.txt b/doc/snow.txt
index bbf28bc..b4098fd 100644
--- a/doc/snow.txt
+++ b/doc/snow.txt
@@ -172,7 +172,7 @@
     FIXME
 
 colorspace_type
-    0   unspecified YcbCr
+    0   unspecified YCbCr
     1   Gray
     2   Gray + Alpha
     3   GBR
@@ -235,7 +235,7 @@
     stored as delta from last, last is reset to 0 if always_reset || keyframe
 
 qlog
-    quality (logarthmic quantizer scale)
+    quality (logarithmic quantizer scale)
     stored as delta from last, last is reset to 0 if always_reset || keyframe
 
 mv_scale
@@ -251,11 +251,11 @@
     stored as delta from last, last is reset to 0 if always_reset || keyframe
 
 quant_table
-    quantiztation table
+    quantization table
 
 
 Highlevel bitstream structure:
-=============================
+==============================
  --------------------------------------------
 |                   Header                   |
  --------------------------------------------
@@ -303,7 +303,7 @@
                   |  Intra DC  |               |
                   |            |    LL0 subband prediction
                    ------------                |
-                                \        Dequantizaton
+                                \        Dequantization
  -------------------             \             |
 |  Reference frames |             \           IDWT
 | -------   ------- |    Motion    \           |
@@ -390,8 +390,8 @@
    (mvx_diff, mvy_diff)*mv_scale
 
 
-Intra DC Predicton:
-======================
+Intra DC Prediction:
+====================
 the luma and chroma values of the left block are used as predictors
 
 the used luma and chroma is the sum of the predictor and y_diff, cb_diff, cr_diff
@@ -407,7 +407,7 @@
 
 Halfpel interpolation:
 ----------------------
-halfpel interpolation is done by convolution with the halfpel filter stored
+Halfpel interpolation is done by convolution with the halfpel filter stored
 in the header:
 
 horizontal halfpel samples are found by
@@ -463,8 +463,8 @@
 Smaller pel interpolation:
 --------------------------
 if diag_mc is set then points which lie on a line between 2 vertically,
-horiziontally or diagonally adjacent halfpel points shall be interpolated
-linearls with rounding to nearest and halfway values rounded up.
+horizontally or diagonally adjacent halfpel points shall be interpolated
+linearly with rounding to nearest and halfway values rounded up.
 points which lie on 2 diagonals at the same time should only use the one
 diagonal not containing the fullpel point
 
@@ -519,8 +519,8 @@
 video
 
 
-Dequantizaton:
-==============
+Dequantization:
+===============
 FIXME
 
 Wavelet Transform:
diff --git a/doc/utils.texi b/doc/utils.texi
index d55dd31..05a2f81 100644
--- a/doc/utils.texi
+++ b/doc/utils.texi
@@ -704,6 +704,8 @@
 FL+FR+FC+LFE+FLC+FRC+SL+SR
 @item octagonal
 FL+FR+FC+BL+BR+BC+SL+SR
+@item hexadecagonal
+FL+FR+FC+BL+BR+BC+SL+SR+WL+WR+TBL+TBR+TBC+TFC+TFL+TFR
 @item downmix
 DL+DR
 @end table
@@ -920,6 +922,9 @@
 @item round(expr)
 Round the value of expression @var{expr} to the nearest integer. For example, "round(1.5)" is "2.0".
 
+@item sgn(x)
+Compute sign of @var{x}.
+
 @item sin(x)
 Compute sine of @var{x}.
 
diff --git a/doc/writing_filters.txt b/doc/writing_filters.txt
index 98b9c6f..2e25cbe 100644
--- a/doc/writing_filters.txt
+++ b/doc/writing_filters.txt
@@ -389,7 +389,7 @@
 
     td.in  = in;
     td.out = out;
-    ctx->internal->execute(ctx, filter_slice, &td, NULL, FFMIN(outlink->h, ctx->graph->nb_threads));
+    ctx->internal->execute(ctx, filter_slice, &td, NULL, FFMIN(outlink->h, ff_filter_get_nb_threads(ctx)));
 
     // ...
 
diff --git a/ffbuild/common.mak b/ffbuild/common.mak
index eb41b05..a60d27c 100644
--- a/ffbuild/common.mak
+++ b/ffbuild/common.mak
@@ -38,7 +38,6 @@
 ASFLAGS    := $(CPPFLAGS) $(ASFLAGS)
 CXXFLAGS   := $(CPPFLAGS) $(CFLAGS) $(CXXFLAGS)
 X86ASMFLAGS += $(IFLAGS:%=%/) -I$(<D)/ -Pconfig.asm
-NVCCFLAGS  += -ptx
 
 HOSTCCFLAGS = $(IFLAGS) $(HOSTCPPFLAGS) $(HOSTCFLAGS)
 LDFLAGS    := $(ALLFFLIBS:%=$(LD_PATH)lib%) $(LDFLAGS)
@@ -91,7 +90,7 @@
 %.h.c:
 	$(Q)echo '#include "$*.h"' >$@
 
-%.ptx: %.cu
+%.ptx: %.cu $(SRC_PATH)/compat/cuda/cuda_runtime.h
 	$(COMPILE_NVCC)
 
 %.ptx.c: %.ptx
@@ -161,9 +160,9 @@
 $(TESTOBJS): | $(sort $(dir $(TESTOBJS)))
 $(TOOLOBJS): | tools
 
-OBJDIRS := $(OBJDIRS) $(dir $(OBJS) $(HOBJS) $(HOSTOBJS) $(SLIBOBJS) $(TESTOBJS))
+OUTDIRS := $(OUTDIRS) $(dir $(OBJS) $(HOBJS) $(HOSTOBJS) $(SLIBOBJS) $(TESTOBJS))
 
-CLEANSUFFIXES     = *.d *.gcda *.gcno *.h.c *.ho *.map *.o *.pc *.ptx *.ptx.c *.ver *.version *$(DEFAULT_X86ASMD).asm *~
+CLEANSUFFIXES     = *.d *.gcda *.gcno *.h.c *.ho *.map *.o *.pc *.ptx *.ptx.c *.ver *.version *$(DEFAULT_X86ASMD).asm *~ *.ilk *.pdb
 LIBSUFFIXES       = *.a *.lib *.so *.so.* *.dylib *.dll *.def *.dll.a
 
 define RULES
diff --git a/ffmpeg_generated.gni b/ffmpeg_generated.gni
index b2238a0..6ba41ef 100644
--- a/ffmpeg_generated.gni
+++ b/ffmpeg_generated.gni
@@ -18,6 +18,7 @@
   "libavcodec/adts_parser.c",
   "libavcodec/allcodecs.c",
   "libavcodec/aptx.c",
+  "libavcodec/aptxdec.c",
   "libavcodec/audio_frame_queue.c",
   "libavcodec/avdct.c",
   "libavcodec/avfft.c",
@@ -150,6 +151,7 @@
   "libavformat/wavdec.c",
   "libavutil/aes.c",
   "libavutil/aes_ctr.c",
+  "libavutil/avsscanf.c",
   "libavutil/avstring.c",
   "libavutil/base64.c",
   "libavutil/bprint.c",
@@ -161,6 +163,7 @@
   "libavutil/crc.c",
   "libavutil/dict.c",
   "libavutil/display.c",
+  "libavutil/dovi_meta.c",
   "libavutil/downmix_info.c",
   "libavutil/encryption_info.c",
   "libavutil/error.c",
@@ -170,6 +173,7 @@
   "libavutil/fixed_dsp.c",
   "libavutil/float_dsp.c",
   "libavutil/frame.c",
+  "libavutil/hdr_dynamic_metadata.c",
   "libavutil/hwcontext.c",
   "libavutil/imgutils.c",
   "libavutil/integer.c",
@@ -198,6 +202,10 @@
   "libavutil/time.c",
   "libavutil/timecode.c",
   "libavutil/twofish.c",
+  "libavutil/tx.c",
+  "libavutil/tx_double.c",
+  "libavutil/tx_float.c",
+  "libavutil/tx_int32.c",
   "libavutil/utils.c",
 ]
 
@@ -209,6 +217,7 @@
     "libavcodec/aarch64/mpegaudiodsp_init.c",
     "libavcodec/aarch64/videodsp_init.c",
     "libavcodec/aarch64/vorbisdsp_init.c",
+    "libavcodec/aarch64/vp8dsp_init_aarch64.c",
     "libavutil/aarch64/cpu.c",
     "libavutil/aarch64/float_dsp_init.c",
   ]
@@ -220,6 +229,7 @@
     "libavcodec/aarch64/mpegaudiodsp_neon.S",
     "libavcodec/aarch64/videodsp.S",
     "libavcodec/aarch64/vorbisdsp_neon.S",
+    "libavcodec/aarch64/vp8dsp_neon.S",
     "libavutil/aarch64/float_dsp_neon.S",
   ]
 }
diff --git a/fftools/Makefile b/fftools/Makefile
index c3a0ff3..5affaa3 100644
--- a/fftools/Makefile
+++ b/fftools/Makefile
@@ -10,7 +10,6 @@
 ALLAVPROGS_G = $(AVBASENAMES:%=%$(PROGSSUF)_g$(EXESUF))
 
 OBJS-ffmpeg                        += fftools/ffmpeg_opt.o fftools/ffmpeg_filter.o fftools/ffmpeg_hw.o
-OBJS-ffmpeg-$(CONFIG_CUVID)        += fftools/ffmpeg_cuvid.o
 OBJS-ffmpeg-$(CONFIG_LIBMFX)       += fftools/ffmpeg_qsv.o
 ifndef CONFIG_VIDEOTOOLBOX
 OBJS-ffmpeg-$(CONFIG_VDA)          += fftools/ffmpeg_videotoolbox.o
@@ -32,7 +31,7 @@
 all: $(AVPROGS)
 
 fftools/ffprobe.o fftools/cmdutils.o: libavutil/ffversion.h | fftools
-OBJDIRS += fftools
+OUTDIRS += fftools
 
 ifdef AVPROGS
 install: install-progs install-data
diff --git a/fftools/cmdutils.h b/fftools/cmdutils.h
index 6e2e0a2..1917510 100644
--- a/fftools/cmdutils.h
+++ b/fftools/cmdutils.h
@@ -99,7 +99,7 @@
  */
 int opt_loglevel(void *optctx, const char *opt, const char *arg);
 
-int opt_report(const char *opt);
+int opt_report(void *optctx, const char *opt, const char *arg);
 
 int opt_max_alloc(void *optctx, const char *opt, const char *arg);
 
@@ -236,7 +236,7 @@
     { "colors",      OPT_EXIT,             { .func_arg = show_colors },      "show available color names" },            \
     { "loglevel",    HAS_ARG,              { .func_arg = opt_loglevel },     "set logging level", "loglevel" },         \
     { "v",           HAS_ARG,              { .func_arg = opt_loglevel },     "set logging level", "loglevel" },         \
-    { "report",      0,                    { (void*)opt_report },            "generate a report" },                     \
+    { "report",      0,                    { .func_arg = opt_report },       "generate a report" },                     \
     { "max_alloc",   HAS_ARG,              { .func_arg = opt_max_alloc },    "set maximum size of a single allocated block", "bytes" }, \
     { "cpuflags",    HAS_ARG | OPT_EXPERT, { .func_arg = opt_cpuflags },     "force specific cpu flags", "flags" },     \
     { "hide_banner", OPT_BOOL | OPT_EXPERT, {&hide_banner},     "do not show program banner", "hide_banner" },          \
diff --git a/fftools/ffmpeg.c b/fftools/ffmpeg.c
index da4259a..d896b14 100644
--- a/fftools/ffmpeg.c
+++ b/fftools/ffmpeg.c
@@ -237,7 +237,7 @@
     }
 }
 
-void sub2video_update(InputStream *ist, AVSubtitle *sub)
+void sub2video_update(InputStream *ist, int64_t heartbeat_pts, AVSubtitle *sub)
 {
     AVFrame *frame = ist->sub2video.frame;
     int8_t *dst;
@@ -254,7 +254,12 @@
                                  AV_TIME_BASE_Q, ist->st->time_base);
         num_rects = sub->num_rects;
     } else {
-        pts       = ist->sub2video.end_pts;
+        /* If we are initializing the system, utilize current heartbeat
+           PTS as the start time, and show until the following subpicture
+           is received. Otherwise, utilize the previous subpicture's end time
+           as the fall-back value. */
+        pts       = ist->sub2video.initialize ?
+                    heartbeat_pts : ist->sub2video.end_pts;
         end_pts   = INT64_MAX;
         num_rects = 0;
     }
@@ -269,6 +274,7 @@
         sub2video_copy_rect(dst, dst_linesize, frame->width, frame->height, sub->rects[i]);
     sub2video_push_ref(ist, pts);
     ist->sub2video.end_pts = end_pts;
+    ist->sub2video.initialize = 0;
 }
 
 static void sub2video_heartbeat(InputStream *ist, int64_t pts)
@@ -291,9 +297,11 @@
         /* do not send the heartbeat frame if the subtitle is already ahead */
         if (pts2 <= ist2->sub2video.last_pts)
             continue;
-        if (pts2 >= ist2->sub2video.end_pts ||
-            (!ist2->sub2video.frame->data[0] && ist2->sub2video.end_pts < INT64_MAX))
-            sub2video_update(ist2, NULL);
+        if (pts2 >= ist2->sub2video.end_pts || ist2->sub2video.initialize)
+            /* if we have hit the end of the current displayed subpicture,
+               or if we need to initialize the system, update the
+               overlayed subpicture and its start/end times */
+            sub2video_update(ist2, pts2 + 1, NULL);
         for (j = 0, nb_reqs = 0; j < ist2->nb_filters; j++)
             nb_reqs += av_buffersrc_get_nb_failed_requests(ist2->filters[j]->filter);
         if (nb_reqs)
@@ -307,7 +315,7 @@
     int ret;
 
     if (ist->sub2video.end_pts < INT64_MAX)
-        sub2video_update(ist, NULL);
+        sub2video_update(ist, INT64_MAX, NULL);
     for (i = 0; i < ist->nb_filters; i++) {
         ret = av_buffersrc_add_frame(ist->filters[i]->filter, NULL);
         if (ret != AVERROR_EOF && ret < 0)
@@ -567,6 +575,7 @@
         ost->audio_channels_mapped = 0;
 
         av_dict_free(&ost->sws_dict);
+        av_dict_free(&ost->swr_opts);
 
         avcodec_free_context(&ost->enc_ctx);
         avcodec_parameters_free(&ost->ref_par);
@@ -779,6 +788,8 @@
             int64_t max = ost->last_mux_dts + !(s->oformat->flags & AVFMT_TS_NONSTRICT);
             if (pkt->dts < max) {
                 int loglevel = max - pkt->dts > 2 || st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO ? AV_LOG_WARNING : AV_LOG_DEBUG;
+                if (exit_on_error)
+                    loglevel = AV_LOG_ERROR;
                 av_log(s, loglevel, "Non-monotonous DTS in output stream "
                        "%d:%d; previous: %"PRId64", current: %"PRId64"; ",
                        ost->file_index, ost->st->index, ost->last_mux_dts, pkt->dts);
@@ -1079,6 +1090,7 @@
 
     if (!ost->filters_script &&
         !ost->filters &&
+        (nb_filtergraphs == 0 || !filtergraphs[0]->graph_desc) &&
         next_picture &&
         ist &&
         lrintf(next_picture->pkt_duration * av_q2d(ist->st->time_base) / av_q2d(enc->time_base)) > 0) {
@@ -1135,7 +1147,7 @@
                 av_log(NULL, AV_LOG_DEBUG, "Not duplicating %d initial frames\n", (int)lrintf(delta0));
                 delta = duration;
                 delta0 = 0;
-                ost->sync_opts = lrint(sync_ipts);
+                ost->sync_opts = llrint(sync_ipts);
             }
         case VSYNC_CFR:
             // FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
@@ -1146,18 +1158,18 @@
             else if (delta > 1.1) {
                 nb_frames = lrintf(delta);
                 if (delta0 > 1.1)
-                    nb0_frames = lrintf(delta0 - 0.6);
+                    nb0_frames = llrintf(delta0 - 0.6);
             }
             break;
         case VSYNC_VFR:
             if (delta <= -0.6)
                 nb_frames = 0;
             else if (delta > 0.6)
-                ost->sync_opts = lrint(sync_ipts);
+                ost->sync_opts = llrint(sync_ipts);
             break;
         case VSYNC_DROP:
         case VSYNC_PASSTHROUGH:
-            ost->sync_opts = lrint(sync_ipts);
+            ost->sync_opts = llrint(sync_ipts);
             break;
         default:
             av_assert0(0);
@@ -1193,33 +1205,27 @@
     }
     ost->last_dropped = nb_frames == nb0_frames && next_picture;
 
-  /* duplicates frame if needed */
-  for (i = 0; i < nb_frames; i++) {
-    AVFrame *in_picture;
-    av_init_packet(&pkt);
-    pkt.data = NULL;
-    pkt.size = 0;
-
-    if (i < nb0_frames && ost->last_frame) {
-        in_picture = ost->last_frame;
-    } else
-        in_picture = next_picture;
-
-    if (!in_picture)
-        return;
-
-    in_picture->pts = ost->sync_opts;
-
-#if 1
-    if (!check_recording_time(ost))
-#else
-    if (ost->frame_number >= ost->max_frames)
-#endif
-        return;
-
-    {
+    /* duplicates frame if needed */
+    for (i = 0; i < nb_frames; i++) {
+        AVFrame *in_picture;
         int forced_keyframe = 0;
         double pts_time;
+        av_init_packet(&pkt);
+        pkt.data = NULL;
+        pkt.size = 0;
+
+        if (i < nb0_frames && ost->last_frame) {
+            in_picture = ost->last_frame;
+        } else
+            in_picture = next_picture;
+
+        if (!in_picture)
+            return;
+
+        in_picture->pts = ost->sync_opts;
+
+        if (!check_recording_time(ost))
+            return;
 
         if (enc->flags & (AV_CODEC_FLAG_INTERLACED_DCT | AV_CODEC_FLAG_INTERLACED_ME) &&
             ost->top_field_first >= 0)
@@ -1270,7 +1276,8 @@
             ost->forced_keyframes_expr_const_values[FKF_N] += 1;
         } else if (   ost->forced_keyframes
                    && !strncmp(ost->forced_keyframes, "source", 6)
-                   && in_picture->key_frame==1) {
+                   && in_picture->key_frame==1
+                   && !i) {
             forced_keyframe = 1;
         }
 
@@ -1292,6 +1299,8 @@
         ret = avcodec_send_frame(enc, in_picture);
         if (ret < 0)
             goto error;
+        // Make sure Closed Captions will not be duplicated
+        av_frame_remove_side_data(in_picture, AV_FRAME_DATA_A53_CC);
 
         while (1) {
             ret = avcodec_receive_packet(enc, &pkt);
@@ -1328,18 +1337,17 @@
                 fprintf(ost->logfile, "%s", enc->stats_out);
             }
         }
-    }
-    ost->sync_opts++;
-    /*
-     * For video, number of frames in == number of packets out.
-     * But there may be reordering, so we can't throw away frames on encoder
-     * flush, we need to limit them here, before they go into encoder.
-     */
-    ost->frame_number++;
+        ost->sync_opts++;
+        /*
+         * For video, number of frames in == number of packets out.
+         * But there may be reordering, so we can't throw away frames on encoder
+         * flush, we need to limit them here, before they go into encoder.
+         */
+        ost->frame_number++;
 
-    if (vstats_filename && frame_size)
-        do_video_stats(ost, frame_size);
-  }
+        if (vstats_filename && frame_size)
+            do_video_stats(ost, frame_size);
+    }
 
     if (!ost->last_frame)
         ost->last_frame = av_frame_alloc();
@@ -1492,8 +1500,6 @@
                     av_rescale_q(filtered_frame->pts, filter_tb, enc->time_base) -
                     av_rescale_q(start_time, AV_TIME_BASE_Q, enc->time_base);
             }
-            //if (ost->source_index >= 0)
-            //    *filtered_frame= *input_streams[ost->source_index]->decoded_frame; //for me_threshold
 
             switch (av_buffersink_get_type(filter)) {
             case AVMEDIA_TYPE_VIDEO:
@@ -1824,7 +1830,7 @@
         } else
             av_log(NULL, AV_LOG_INFO, "%s    %c", buf.str, end);
 
-    fflush(stderr);
+        fflush(stderr);
     }
     av_bprint_finalize(&buf, NULL);
 
@@ -1909,9 +1915,6 @@
             }
         }
 
-        if (enc->codec_type == AVMEDIA_TYPE_AUDIO && enc->frame_size <= 1)
-            continue;
-
         if (enc->codec_type != AVMEDIA_TYPE_VIDEO && enc->codec_type != AVMEDIA_TYPE_AUDIO)
             continue;
 
@@ -1931,46 +1934,46 @@
                 av_assert0(0);
             }
 
-                av_init_packet(&pkt);
-                pkt.data = NULL;
-                pkt.size = 0;
+            av_init_packet(&pkt);
+            pkt.data = NULL;
+            pkt.size = 0;
 
-                update_benchmark(NULL);
+            update_benchmark(NULL);
 
-                while ((ret = avcodec_receive_packet(enc, &pkt)) == AVERROR(EAGAIN)) {
-                    ret = avcodec_send_frame(enc, NULL);
-                    if (ret < 0) {
-                        av_log(NULL, AV_LOG_FATAL, "%s encoding failed: %s\n",
-                               desc,
-                               av_err2str(ret));
-                        exit_program(1);
-                    }
-                }
-
-                update_benchmark("flush_%s %d.%d", desc, ost->file_index, ost->index);
-                if (ret < 0 && ret != AVERROR_EOF) {
+            while ((ret = avcodec_receive_packet(enc, &pkt)) == AVERROR(EAGAIN)) {
+                ret = avcodec_send_frame(enc, NULL);
+                if (ret < 0) {
                     av_log(NULL, AV_LOG_FATAL, "%s encoding failed: %s\n",
                            desc,
                            av_err2str(ret));
                     exit_program(1);
                 }
-                if (ost->logfile && enc->stats_out) {
-                    fprintf(ost->logfile, "%s", enc->stats_out);
-                }
-                if (ret == AVERROR_EOF) {
-                    output_packet(of, &pkt, ost, 1);
-                    break;
-                }
-                if (ost->finished & MUXER_FINISHED) {
-                    av_packet_unref(&pkt);
-                    continue;
-                }
-                av_packet_rescale_ts(&pkt, enc->time_base, ost->mux_timebase);
-                pkt_size = pkt.size;
-                output_packet(of, &pkt, ost, 0);
-                if (ost->enc_ctx->codec_type == AVMEDIA_TYPE_VIDEO && vstats_filename) {
-                    do_video_stats(ost, pkt_size);
-                }
+            }
+
+            update_benchmark("flush_%s %d.%d", desc, ost->file_index, ost->index);
+            if (ret < 0 && ret != AVERROR_EOF) {
+                av_log(NULL, AV_LOG_FATAL, "%s encoding failed: %s\n",
+                       desc,
+                       av_err2str(ret));
+                exit_program(1);
+            }
+            if (ost->logfile && enc->stats_out) {
+                fprintf(ost->logfile, "%s", enc->stats_out);
+            }
+            if (ret == AVERROR_EOF) {
+                output_packet(of, &pkt, ost, 1);
+                break;
+            }
+            if (ost->finished & MUXER_FINISHED) {
+                av_packet_unref(&pkt);
+                continue;
+            }
+            av_packet_rescale_ts(&pkt, enc->time_base, ost->mux_timebase);
+            pkt_size = pkt.size;
+            output_packet(of, &pkt, ost, 0);
+            if (ost->enc_ctx->codec_type == AVMEDIA_TYPE_VIDEO && vstats_filename) {
+                do_video_stats(ost, pkt_size);
+            }
         }
     }
 }
@@ -2001,12 +2004,13 @@
     InputFile   *f = input_files [ist->file_index];
     int64_t start_time = (of->start_time == AV_NOPTS_VALUE) ? 0 : of->start_time;
     int64_t ost_tb_start_time = av_rescale_q(start_time, AV_TIME_BASE_Q, ost->mux_timebase);
-    AVPacket opkt = { 0 };
-
-    av_init_packet(&opkt);
+    AVPacket opkt;
 
     // EOF: flush output bitstream filters.
     if (!pkt) {
+        av_init_packet(&opkt);
+        opkt.data = NULL;
+        opkt.size = 0;
         output_packet(of, &opkt, ost, 1);
         return;
     }
@@ -2045,40 +2049,29 @@
     if (ost->enc_ctx->codec_type == AVMEDIA_TYPE_VIDEO)
         ost->sync_opts++;
 
+    if (av_packet_ref(&opkt, pkt) < 0)
+        exit_program(1);
+
     if (pkt->pts != AV_NOPTS_VALUE)
         opkt.pts = av_rescale_q(pkt->pts, ist->st->time_base, ost->mux_timebase) - ost_tb_start_time;
-    else
-        opkt.pts = AV_NOPTS_VALUE;
 
-    if (pkt->dts == AV_NOPTS_VALUE)
+    if (pkt->dts == AV_NOPTS_VALUE) {
         opkt.dts = av_rescale_q(ist->dts, AV_TIME_BASE_Q, ost->mux_timebase);
-    else
-        opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->mux_timebase);
-    opkt.dts -= ost_tb_start_time;
-
-    if (ost->st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO && pkt->dts != AV_NOPTS_VALUE) {
+    } else if (ost->st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {
         int duration = av_get_audio_frame_duration(ist->dec_ctx, pkt->size);
         if(!duration)
             duration = ist->dec_ctx->frame_size;
-        opkt.dts = opkt.pts = av_rescale_delta(ist->st->time_base, pkt->dts,
-                                               (AVRational){1, ist->dec_ctx->sample_rate}, duration, &ist->filter_in_rescale_delta_last,
-                                               ost->mux_timebase) - ost_tb_start_time;
-    }
+        opkt.dts = av_rescale_delta(ist->st->time_base, pkt->dts,
+                                    (AVRational){1, ist->dec_ctx->sample_rate}, duration,
+                                    &ist->filter_in_rescale_delta_last, ost->mux_timebase);
+        /* dts will be set immediately afterwards to what pts is now */
+        opkt.pts = opkt.dts - ost_tb_start_time;
+    } else
+        opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->mux_timebase);
+    opkt.dts -= ost_tb_start_time;
 
     opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->mux_timebase);
 
-    opkt.flags    = pkt->flags;
-
-    if (pkt->buf) {
-        opkt.buf = av_buffer_ref(pkt->buf);
-        if (!opkt.buf)
-            exit_program(1);
-    }
-    opkt.data = pkt->data;
-    opkt.size = pkt->size;
-
-    av_copy_packet_side_data(&opkt, pkt);
-
     output_packet(of, &opkt, ost, 0);
 }
 
@@ -2139,9 +2132,6 @@
 
     /* determine if the parameters for this input changed */
     need_reinit = ifilter->format != frame->format;
-    if (!!ifilter->hw_frames_ctx != !!frame->hw_frames_ctx ||
-        (ifilter->hw_frames_ctx && ifilter->hw_frames_ctx->data != frame->hw_frames_ctx->data))
-        need_reinit = 1;
 
     switch (ifilter->ist->st->codecpar->codec_type) {
     case AVMEDIA_TYPE_AUDIO:
@@ -2155,6 +2145,13 @@
         break;
     }
 
+    if (!ifilter->ist->reinit_filters && fg->graph)
+        need_reinit = 0;
+
+    if (!!ifilter->hw_frames_ctx != !!frame->hw_frames_ctx ||
+        (ifilter->hw_frames_ctx && ifilter->hw_frames_ctx->data != frame->hw_frames_ctx->data))
+        need_reinit = 1;
+
     if (need_reinit) {
         ret = ifilter_parameters_from_frame(ifilter, frame);
         if (ret < 0)
@@ -2315,14 +2312,12 @@
     ist->samples_decoded += decoded_frame->nb_samples;
     ist->frames_decoded++;
 
-#if 1
     /* increment next_dts to use for the case where the input stream does not
        have timestamps or there are multiple frames in the packet */
     ist->next_pts += ((int64_t)AV_TIME_BASE * decoded_frame->nb_samples) /
                      avctx->sample_rate;
     ist->next_dts += ((int64_t)AV_TIME_BASE * decoded_frame->nb_samples) /
                      avctx->sample_rate;
-#endif
 
     if (decoded_frame->pts != AV_NOPTS_VALUE) {
         decoded_frame_tb   = ist->st->time_base;
@@ -2519,7 +2514,7 @@
         return ret;
 
     if (ist->sub2video.frame) {
-        sub2video_update(ist, &subtitle);
+        sub2video_update(ist, INT64_MIN, &subtitle);
     } else if (ist->nb_filters) {
         if (!ist->sub2video.sub_queue)
             ist->sub2video.sub_queue = av_fifo_alloc(8 * sizeof(AVSubtitle));
@@ -2788,7 +2783,7 @@
         if (avio_open2(&sdp_pb, sdp_filename, AVIO_FLAG_WRITE, &int_cb, NULL) < 0) {
             av_log(NULL, AV_LOG_ERROR, "Failed to open sdp file '%s'\n", sdp_filename);
         } else {
-            avio_printf(sdp_pb, "SDP:\n%s", sdp);
+            avio_print(sdp_pb, sdp);
             avio_closep(&sdp_pb);
             av_freep(&sdp_filename);
         }
@@ -3345,7 +3340,7 @@
                    "if you want a different framerate.\n",
                    ost->file_index, ost->index);
         }
-//      ost->frame_rate = ist->st->avg_frame_rate.num ? ist->st->avg_frame_rate : (AVRational){25, 1};
+
         if (ost->enc->supported_framerates && !ost->force_fps) {
             int idx = av_find_nearest_q_idx(ost->frame_rate, ost->enc->supported_framerates);
             ost->frame_rate = ost->enc->supported_framerates[idx];
@@ -3380,10 +3375,6 @@
             av_log(oc, AV_LOG_WARNING, "Frame rate very high for a muxer not efficiently supporting it.\n"
                                        "Please consider specifying a lower framerate, a different muxer or -vsync 2\n");
         }
-        for (j = 0; j < ost->forced_kf_count; j++)
-            ost->forced_kf_pts[j] = av_rescale_q(ost->forced_kf_pts[j],
-                                                 AV_TIME_BASE_Q,
-                                                 enc_ctx->time_base);
 
         enc_ctx->width  = av_buffersink_get_w(ost->filter->filter);
         enc_ctx->height = av_buffersink_get_h(ost->filter->filter);
@@ -3428,8 +3419,8 @@
                 ost->forced_keyframes_expr_const_values[FKF_PREV_FORCED_N] = NAN;
                 ost->forced_keyframes_expr_const_values[FKF_PREV_FORCED_T] = NAN;
 
-            // Don't parse the 'forced_keyframes' in case of 'keep-source-keyframes',
-            // parse it only for static kf timings
+                // Don't parse the 'forced_keyframes' in case of 'keep-source-keyframes',
+                // parse it only for static kf timings
             } else if(strncmp(ost->forced_keyframes, "source", 6)) {
                 parse_forced_key_frames(ost->forced_keyframes, ost, ost->enc_ctx);
             }
@@ -3575,12 +3566,14 @@
             int i;
             for (i = 0; i < ist->st->nb_side_data; i++) {
                 AVPacketSideData *sd = &ist->st->side_data[i];
-                uint8_t *dst = av_stream_new_side_data(ost->st, sd->type, sd->size);
-                if (!dst)
-                    return AVERROR(ENOMEM);
-                memcpy(dst, sd->data, sd->size);
-                if (ist->autorotate && sd->type == AV_PKT_DATA_DISPLAYMATRIX)
-                    av_display_rotation_set((uint32_t *)dst, 0);
+                if (sd->type != AV_PKT_DATA_CPB_PROPERTIES) {
+                    uint8_t *dst = av_stream_new_side_data(ost->st, sd->type, sd->size);
+                    if (!dst)
+                        return AVERROR(ENOMEM);
+                    memcpy(dst, sd->data, sd->size);
+                    if (ist->autorotate && sd->type == AV_PKT_DATA_DISPLAYMATRIX)
+                        av_display_rotation_set((uint32_t *)dst, 0);
+                }
             }
         }
 
@@ -3879,7 +3872,9 @@
                        av_rescale_q(ost->st->cur_dts, ost->st->time_base,
                                     AV_TIME_BASE_Q);
         if (ost->st->cur_dts == AV_NOPTS_VALUE)
-            av_log(NULL, AV_LOG_DEBUG, "cur_dts is invalid (this is harmless if it occurs once at the start per stream)\n");
+            av_log(NULL, AV_LOG_DEBUG,
+                "cur_dts is invalid st:%d (%d) [init:%d i_done:%d finish:%d] (this is harmless if it occurs once at the start per stream)\n",
+                ost->st->index, ost->st->id, ost->initialized, ost->inputs_done, ost->finished);
 
         if (!ost->initialized && !ost->inputs_done)
             return ost;
@@ -4172,7 +4167,7 @@
 
 // set duration to max(tmp, duration) in a proper time base and return duration's time_base
 static AVRational duration_max(int64_t tmp, int64_t *duration, AVRational tmp_time_base,
-                                AVRational time_base)
+                               AVRational time_base)
 {
     int ret;
 
@@ -4197,7 +4192,7 @@
     int i, ret, has_audio = 0;
     int64_t duration = 0;
 
-    ret = av_seek_frame(is, -1, is->start_time, 0);
+    ret = avformat_seek_file(is, -1, INT64_MIN, is->start_time, is->start_time, 0);
     if (ret < 0)
         return ret;
 
@@ -4237,7 +4232,8 @@
             ifile->time_base = ist->st->time_base;
         /* the total duration of the stream, max_pts - min_pts is
          * the duration of the stream without the last frame */
-        duration += ist->max_pts - ist->min_pts;
+        if (ist->max_pts > ist->min_pts && ist->max_pts - (uint64_t)ist->min_pts < INT64_MAX - duration)
+            duration += ist->max_pts - ist->min_pts;
         ifile->time_base = duration_max(duration, &ifile->duration, ist->st->time_base,
                                         ifile->time_base);
     }
@@ -4264,6 +4260,7 @@
     int ret, thread_ret, i, j;
     int64_t duration;
     int64_t pkt_dts;
+    int disable_discontinuity_correction = copy_ts;
 
     is  = ifile->ctx;
     ret = get_input_packet(ifile, &pkt);
@@ -4465,10 +4462,20 @@
         pkt.dts += duration;
 
     pkt_dts = av_rescale_q_rnd(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q, AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX);
+
+    if (copy_ts && pkt_dts != AV_NOPTS_VALUE && ist->next_dts != AV_NOPTS_VALUE &&
+        (is->iformat->flags & AVFMT_TS_DISCONT) && ist->st->pts_wrap_bits < 60) {
+        int64_t wrap_dts = av_rescale_q_rnd(pkt.dts + (1LL<<ist->st->pts_wrap_bits),
+                                            ist->st->time_base, AV_TIME_BASE_Q,
+                                            AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX);
+        if (FFABS(wrap_dts - ist->next_dts) < FFABS(pkt_dts - ist->next_dts)/10)
+            disable_discontinuity_correction = 0;
+    }
+
     if ((ist->dec_ctx->codec_type == AVMEDIA_TYPE_VIDEO ||
          ist->dec_ctx->codec_type == AVMEDIA_TYPE_AUDIO) &&
          pkt_dts != AV_NOPTS_VALUE && ist->next_dts != AV_NOPTS_VALUE &&
-        !copy_ts) {
+        !disable_discontinuity_correction) {
         int64_t delta   = pkt_dts - ist->next_dts;
         if (is->iformat->flags & AVFMT_TS_DISCONT) {
             if (delta < -1LL*dts_delta_threshold*AV_TIME_BASE ||
@@ -4476,7 +4483,10 @@
                 pkt_dts + AV_TIME_BASE/10 < FFMAX(ist->pts, ist->dts)) {
                 ifile->ts_offset -= delta;
                 av_log(NULL, AV_LOG_DEBUG,
-                       "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n",
+                       "timestamp discontinuity for stream #%d:%d "
+                       "(id=%d, type=%s): %"PRId64", new offset= %"PRId64"\n",
+                       ist->file_index, ist->st->index, ist->st->id,
+                       av_get_media_type_string(ist->dec_ctx->codec_type),
                        delta, ifile->ts_offset);
                 pkt.dts -= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
                 if (pkt.pts != AV_NOPTS_VALUE)
@@ -4884,11 +4894,6 @@
         exit_program(1);
     }
 
-//     if (nb_input_files == 0) {
-//         av_log(NULL, AV_LOG_FATAL, "At least one input file must be specified\n");
-//         exit_program(1);
-//     }
-
     for (i = 0; i < nb_output_files; i++) {
         if (strcmp(output_files[i]->ctx->oformat->name, "rtp"))
             want_sdp = 0;
diff --git a/fftools/ffmpeg.h b/fftools/ffmpeg.h
index eb1eaf6..fbaae15 100644
--- a/fftools/ffmpeg.h
+++ b/fftools/ffmpeg.h
@@ -61,7 +61,6 @@
     HWACCEL_GENERIC,
     HWACCEL_VIDEOTOOLBOX,
     HWACCEL_QSV,
-    HWACCEL_CUVID,
 };
 
 typedef struct HWAccel {
@@ -72,7 +71,7 @@
 } HWAccel;
 
 typedef struct HWDevice {
-    char *name;
+    const char *name;
     enum AVHWDeviceType type;
     AVBufferRef *device_ref;
 } HWDevice;
@@ -349,6 +348,7 @@
         AVFifoBuffer *sub_queue;    ///< queue of AVSubtitle* before filter init
         AVFrame *frame;
         int w, h;
+        unsigned int initialize; ///< marks if sub2video_update should force an initialization
     } sub2video;
 
     int dr1;
@@ -646,7 +646,7 @@
 int init_simple_filtergraph(InputStream *ist, OutputStream *ost);
 int init_complex_filtergraph(FilterGraph *fg);
 
-void sub2video_update(InputStream *ist, AVSubtitle *sub);
+void sub2video_update(InputStream *ist, int64_t heartbeat_pts, AVSubtitle *sub);
 
 int ifilter_parameters_from_frame(InputFilter *ifilter, const AVFrame *frame);
 
@@ -654,7 +654,6 @@
 
 int videotoolbox_init(AVCodecContext *s);
 int qsv_init(AVCodecContext *s);
-int cuvid_init(AVCodecContext *s);
 
 HWDevice *hw_device_get_by_name(const char *name);
 int hw_device_init_from_string(const char *arg, HWDevice **dev);
diff --git a/fftools/ffmpeg_cuvid.c b/fftools/ffmpeg_cuvid.c
deleted file mode 100644
index 3ff3b40..0000000
--- a/fftools/ffmpeg_cuvid.c
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with FFmpeg; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-#include "libavutil/hwcontext.h"
-#include "libavutil/pixdesc.h"
-
-#include "ffmpeg.h"
-
-static void cuvid_uninit(AVCodecContext *avctx)
-{
-    InputStream *ist = avctx->opaque;
-    av_buffer_unref(&ist->hw_frames_ctx);
-}
-
-int cuvid_init(AVCodecContext *avctx)
-{
-    InputStream *ist = avctx->opaque;
-    AVHWFramesContext *frames_ctx;
-    int ret;
-
-    av_log(avctx, AV_LOG_VERBOSE, "Initializing cuvid hwaccel\n");
-
-    if (!hw_device_ctx) {
-        ret = av_hwdevice_ctx_create(&hw_device_ctx, AV_HWDEVICE_TYPE_CUDA,
-                                     ist->hwaccel_device, NULL, 0);
-        if (ret < 0) {
-            av_log(avctx, AV_LOG_ERROR, "Error creating a CUDA device\n");
-            return ret;
-        }
-    }
-
-    av_buffer_unref(&ist->hw_frames_ctx);
-    ist->hw_frames_ctx = av_hwframe_ctx_alloc(hw_device_ctx);
-    if (!ist->hw_frames_ctx) {
-        av_log(avctx, AV_LOG_ERROR, "Error creating a CUDA frames context\n");
-        return AVERROR(ENOMEM);
-    }
-
-    frames_ctx = (AVHWFramesContext*)ist->hw_frames_ctx->data;
-
-    frames_ctx->format = AV_PIX_FMT_CUDA;
-    frames_ctx->sw_format = avctx->sw_pix_fmt;
-    frames_ctx->width = avctx->width;
-    frames_ctx->height = avctx->height;
-
-    av_log(avctx, AV_LOG_DEBUG, "Initializing CUDA frames context: sw_format = %s, width = %d, height = %d\n",
-           av_get_pix_fmt_name(frames_ctx->sw_format), frames_ctx->width, frames_ctx->height);
-
-    ret = av_hwframe_ctx_init(ist->hw_frames_ctx);
-    if (ret < 0) {
-        av_log(avctx, AV_LOG_ERROR, "Error initializing a CUDA frame pool\n");
-        return ret;
-    }
-
-    ist->hwaccel_uninit = cuvid_uninit;
-
-    return 0;
-}
diff --git a/fftools/ffmpeg_filter.c b/fftools/ffmpeg_filter.c
index 6518d50..b66faa5 100644
--- a/fftools/ffmpeg_filter.c
+++ b/fftools/ffmpeg_filter.c
@@ -293,10 +293,17 @@
             exit_program(1);
         }
         ist = input_streams[input_files[file_idx]->ist_index + st->index];
+        if (ist->user_set_discard == AVDISCARD_ALL) {
+            av_log(NULL, AV_LOG_FATAL, "Stream specifier '%s' in filtergraph description %s "
+                   "matches a disabled input stream.\n", p, fg->graph_desc);
+            exit_program(1);
+        }
     } else {
         /* find the first unused stream of corresponding type */
         for (i = 0; i < nb_input_streams; i++) {
             ist = input_streams[i];
+            if (ist->user_set_discard == AVDISCARD_ALL)
+                continue;
             if (ist->dec_ctx->codec_type == type && ist->discard)
                 break;
         }
@@ -732,6 +739,13 @@
     if (!ist->sub2video.frame)
         return AVERROR(ENOMEM);
     ist->sub2video.last_pts = INT64_MIN;
+    ist->sub2video.end_pts  = INT64_MIN;
+
+    /* sub2video structure has been (re-)initialized.
+       Mark it as such so that the system will be
+       initialized with the first received heartbeat. */
+    ist->sub2video.initialize = 1;
+
     return 0;
 }
 
@@ -778,10 +792,9 @@
     av_bprint_init(&args, 0, AV_BPRINT_SIZE_AUTOMATIC);
     av_bprintf(&args,
              "video_size=%dx%d:pix_fmt=%d:time_base=%d/%d:"
-             "pixel_aspect=%d/%d:sws_param=flags=%d",
+             "pixel_aspect=%d/%d",
              ifilter->width, ifilter->height, ifilter->format,
-             tb.num, tb.den, sar.num, sar.den,
-             SWS_BILINEAR + ((ist->dec_ctx->flags&AV_CODEC_FLAG_BITEXACT) ? SWS_BITEXACT:0));
+             tb.num, tb.den, sar.num, sar.den);
     if (fr.num && fr.den)
         av_bprintf(&args, ":frame_rate=%d/%d", fr.num, fr.den);
     snprintf(name, sizeof(name), "graph %d input from stream %d:%d", fg->index,
@@ -1161,7 +1174,7 @@
             while (av_fifo_size(ist->sub2video.sub_queue)) {
                 AVSubtitle tmp;
                 av_fifo_generic_read(ist->sub2video.sub_queue, &tmp, sizeof(tmp), NULL);
-                sub2video_update(ist, &tmp);
+                sub2video_update(ist, INT64_MIN, &tmp);
                 avsubtitle_free(&tmp);
             }
         }
diff --git a/fftools/ffmpeg_hw.c b/fftools/ffmpeg_hw.c
index 2ec1813..962d8f7 100644
--- a/fftools/ffmpeg_hw.c
+++ b/fftools/ffmpeg_hw.c
@@ -99,7 +99,7 @@
     // -> av_hwdevice_ctx_create_derived()
 
     AVDictionary *options = NULL;
-    char *type_name = NULL, *name = NULL, *device = NULL;
+    const char *type_name = NULL, *name = NULL, *device = NULL;
     enum AVHWDeviceType type;
     HWDevice *dev, *src;
     AVBufferRef *device_ref = NULL;
@@ -155,10 +155,12 @@
         ++p;
         q = strchr(p, ',');
         if (q) {
-            device = av_strndup(p, q - p);
-            if (!device) {
-                err = AVERROR(ENOMEM);
-                goto fail;
+            if (q - p > 0) {
+                device = av_strndup(p, q - p);
+                if (!device) {
+                    err = AVERROR(ENOMEM);
+                    goto fail;
+                }
             }
             err = av_dict_parse_string(&options, q + 1, "=", ",", 0);
             if (err < 0) {
@@ -168,7 +170,8 @@
         }
 
         err = av_hwdevice_ctx_create(&device_ref, type,
-                                     device ? device : p, options, 0);
+                                     q ? device : p[0] ? p : NULL,
+                                     options, 0);
         if (err < 0)
             goto fail;
 
diff --git a/fftools/ffmpeg_opt.c b/fftools/ffmpeg_opt.c
index d4851a2..680f0f1 100644
--- a/fftools/ffmpeg_opt.c
+++ b/fftools/ffmpeg_opt.c
@@ -1,3 +1,4 @@
+
 /*
  * ffmpeg option parsing
  *
@@ -43,16 +44,80 @@
 
 #define DEFAULT_PASS_LOGFILENAME_PREFIX "ffmpeg2pass"
 
+#define SPECIFIER_OPT_FMT_str  "%s"
+#define SPECIFIER_OPT_FMT_i    "%i"
+#define SPECIFIER_OPT_FMT_i64  "%"PRId64
+#define SPECIFIER_OPT_FMT_ui64 "%"PRIu64
+#define SPECIFIER_OPT_FMT_f    "%f"
+#define SPECIFIER_OPT_FMT_dbl  "%lf"
+
+static const char *opt_name_codec_names[]               = {"c", "codec", "acodec", "vcodec", "scodec", "dcodec", NULL};
+static const char *opt_name_audio_channels[]            = {"ac", NULL};
+static const char *opt_name_audio_sample_rate[]         = {"ar", NULL};
+static const char *opt_name_frame_rates[]               = {"r", NULL};
+static const char *opt_name_frame_sizes[]               = {"s", NULL};
+static const char *opt_name_frame_pix_fmts[]            = {"pix_fmt", NULL};
+static const char *opt_name_ts_scale[]                  = {"itsscale", NULL};
+static const char *opt_name_hwaccels[]                  = {"hwaccel", NULL};
+static const char *opt_name_hwaccel_devices[]           = {"hwaccel_device", NULL};
+static const char *opt_name_hwaccel_output_formats[]    = {"hwaccel_output_format", NULL};
+static const char *opt_name_autorotate[]                = {"autorotate", NULL};
+static const char *opt_name_max_frames[]                = {"frames", "aframes", "vframes", "dframes", NULL};
+static const char *opt_name_bitstream_filters[]         = {"bsf", "absf", "vbsf", NULL};
+static const char *opt_name_codec_tags[]                = {"tag", "atag", "vtag", "stag", NULL};
+static const char *opt_name_sample_fmts[]               = {"sample_fmt", NULL};
+static const char *opt_name_qscale[]                    = {"q", "qscale", NULL};
+static const char *opt_name_forced_key_frames[]         = {"forced_key_frames", NULL};
+static const char *opt_name_force_fps[]                 = {"force_fps", NULL};
+static const char *opt_name_frame_aspect_ratios[]       = {"aspect", NULL};
+static const char *opt_name_rc_overrides[]              = {"rc_override", NULL};
+static const char *opt_name_intra_matrices[]            = {"intra_matrix", NULL};
+static const char *opt_name_inter_matrices[]            = {"inter_matrix", NULL};
+static const char *opt_name_chroma_intra_matrices[]     = {"chroma_intra_matrix", NULL};
+static const char *opt_name_top_field_first[]           = {"top", NULL};
+static const char *opt_name_presets[]                   = {"pre", "apre", "vpre", "spre", NULL};
+static const char *opt_name_copy_initial_nonkeyframes[] = {"copyinkfr", NULL};
+static const char *opt_name_copy_prior_start[]          = {"copypriorss", NULL};
+static const char *opt_name_filters[]                   = {"filter", "af", "vf", NULL};
+static const char *opt_name_filter_scripts[]            = {"filter_script", NULL};
+static const char *opt_name_reinit_filters[]            = {"reinit_filter", NULL};
+static const char *opt_name_fix_sub_duration[]          = {"fix_sub_duration", NULL};
+static const char *opt_name_canvas_sizes[]              = {"canvas_size", NULL};
+static const char *opt_name_pass[]                      = {"pass", NULL};
+static const char *opt_name_passlogfiles[]              = {"passlogfile", NULL};
+static const char *opt_name_max_muxing_queue_size[]     = {"max_muxing_queue_size", NULL};
+static const char *opt_name_guess_layout_max[]          = {"guess_layout_max", NULL};
+static const char *opt_name_apad[]                      = {"apad", NULL};
+static const char *opt_name_discard[]                   = {"discard", NULL};
+static const char *opt_name_disposition[]               = {"disposition", NULL};
+static const char *opt_name_time_bases[]                = {"time_base", NULL};
+static const char *opt_name_enc_time_bases[]            = {"enc_time_base", NULL};
+
+#define WARN_MULTIPLE_OPT_USAGE(name, type, so, st)\
+{\
+    char namestr[128] = "";\
+    const char *spec = so->specifier && so->specifier[0] ? so->specifier : "";\
+    for (i = 0; opt_name_##name[i]; i++)\
+        av_strlcatf(namestr, sizeof(namestr), "-%s%s", opt_name_##name[i], opt_name_##name[i+1] ? (opt_name_##name[i+2] ? ", " : " or ") : "");\
+    av_log(NULL, AV_LOG_WARNING, "Multiple %s options specified for stream %d, only the last option '-%s%s%s "SPECIFIER_OPT_FMT_##type"' will be used.\n",\
+           namestr, st->index, opt_name_##name[0], spec[0] ? ":" : "", spec, so->u.type);\
+}
+
 #define MATCH_PER_STREAM_OPT(name, type, outvar, fmtctx, st)\
 {\
-    int i, ret;\
+    int i, ret, matches = 0;\
+    SpecifierOpt *so;\
     for (i = 0; i < o->nb_ ## name; i++) {\
         char *spec = o->name[i].specifier;\
-        if ((ret = check_stream_specifier(fmtctx, st, spec)) > 0)\
+        if ((ret = check_stream_specifier(fmtctx, st, spec)) > 0) {\
             outvar = o->name[i].u.type;\
-        else if (ret < 0)\
+            so = &o->name[i];\
+            matches++;\
+        } else if (ret < 0)\
             exit_program(1);\
     }\
+    if (matches > 1)\
+       WARN_MULTIPLE_OPT_USAGE(name, type, so, st);\
 }
 
 #define MATCH_PER_TYPE_OPT(name, type, outvar, fmtctx, mediatype)\
@@ -72,9 +137,6 @@
 #if CONFIG_LIBMFX
     { "qsv",   qsv_init,   HWACCEL_QSV,   AV_PIX_FMT_QSV },
 #endif
-#if CONFIG_CUVID
-    { "cuvid", cuvid_init, HWACCEL_CUVID, AV_PIX_FMT_CUDA },
-#endif
     { 0 },
 };
 AVBufferRef *hw_device_ctx;
@@ -171,14 +233,11 @@
 static int show_hwaccels(void *optctx, const char *opt, const char *arg)
 {
     enum AVHWDeviceType type = AV_HWDEVICE_TYPE_NONE;
-    int i;
 
     printf("Hardware acceleration methods:\n");
     while ((type = av_hwdevice_iterate_types(type)) !=
            AV_HWDEVICE_TYPE_NONE)
         printf("%s\n", av_hwdevice_get_type_name(type));
-    for (i = 0; hwaccels[i].name; i++)
-        printf("%s\n", hwaccels[i].name);
     printf("\n");
     return 0;
 }
@@ -268,7 +327,7 @@
 {
     OptionsContext *o = optctx;
     StreamMap *m = NULL;
-    int i, negative = 0, file_idx;
+    int i, negative = 0, file_idx, disabled = 0;
     int sync_file_idx = -1, sync_stream_idx = 0;
     char *p, *sync;
     char *map;
@@ -303,6 +362,11 @@
                                        "match any streams.\n", arg);
             exit_program(1);
         }
+        if (input_streams[input_files[sync_file_idx]->ist_index + sync_stream_idx]->user_set_discard == AVDISCARD_ALL) {
+            av_log(NULL, AV_LOG_FATAL, "Sync stream specification in map %s matches a disabled input "
+                                       "stream.\n", arg);
+            exit_program(1);
+        }
     }
 
 
@@ -339,6 +403,10 @@
                 if (check_stream_specifier(input_files[file_idx]->ctx, input_files[file_idx]->ctx->streams[i],
                             *p == ':' ? p + 1 : p) <= 0)
                     continue;
+                if (input_streams[input_files[file_idx]->ist_index + i]->user_set_discard == AVDISCARD_ALL) {
+                    disabled = 1;
+                    continue;
+                }
                 GROW_ARRAY(o->stream_maps, o->nb_stream_maps);
                 m = &o->stream_maps[o->nb_stream_maps - 1];
 
@@ -358,6 +426,10 @@
     if (!m) {
         if (allow_unused) {
             av_log(NULL, AV_LOG_VERBOSE, "Stream map '%s' matches no streams; ignoring.\n", arg);
+        } else if (disabled) {
+            av_log(NULL, AV_LOG_FATAL, "Stream map '%s' matches disabled streams.\n"
+                                       "To ignore this, add a trailing '?' to the map.\n", arg);
+            exit_program(1);
         } else {
             av_log(NULL, AV_LOG_FATAL, "Stream map '%s' matches no streams.\n"
                                        "To ignore this, add a trailing '?' to the map.\n", arg);
@@ -437,7 +509,8 @@
     /* allow trailing ? to map_channel */
     if (allow_unused = strchr(mapchan, '?'))
         *allow_unused = 0;
-    if (m->channel_idx < 0 || m->channel_idx >= st->codecpar->channels) {
+    if (m->channel_idx < 0 || m->channel_idx >= st->codecpar->channels ||
+        input_streams[input_files[m->file_idx]->ist_index + m->stream_idx]->user_set_discard == AVDISCARD_ALL) {
         if (allow_unused) {
             av_log(NULL, AV_LOG_VERBOSE, "mapchan: invalid audio channel #%d.%d.%d\n",
                     m->file_idx, m->stream_idx, m->channel_idx);
@@ -746,6 +819,13 @@
 
         MATCH_PER_STREAM_OPT(discard, str, discard_str, ic, st);
         ist->user_set_discard = AVDISCARD_NONE;
+
+        if ((o->video_disable && ist->st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) ||
+            (o->audio_disable && ist->st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) ||
+            (o->subtitle_disable && ist->st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE) ||
+            (o->data_disable && ist->st->codecpar->codec_type == AVMEDIA_TYPE_DATA))
+                ist->user_set_discard = AVDISCARD_ALL;
+
         if (discard_str && av_opt_eval_int(&cc, discard_opt, discard_str, &ist->user_set_discard) < 0) {
             av_log(NULL, AV_LOG_ERROR, "Error parsing discard %s.\n",
                     discard_str);
@@ -798,9 +878,28 @@
             MATCH_PER_STREAM_OPT(top_field_first, i, ist->top_field_first, ic, st);
 
             MATCH_PER_STREAM_OPT(hwaccels, str, hwaccel, ic, st);
+            MATCH_PER_STREAM_OPT(hwaccel_output_formats, str,
+                                 hwaccel_output_format, ic, st);
+
+            if (!hwaccel_output_format && hwaccel && !strcmp(hwaccel, "cuvid")) {
+                av_log(NULL, AV_LOG_WARNING,
+                    "WARNING: defaulting hwaccel_output_format to cuda for compatibility "
+                    "with old commandlines. This behaviour is DEPRECATED and will be removed "
+                    "in the future. Please explicitly set \"-hwaccel_output_format cuda\".\n");
+                ist->hwaccel_output_format = AV_PIX_FMT_CUDA;
+            } else if (hwaccel_output_format) {
+                ist->hwaccel_output_format = av_get_pix_fmt(hwaccel_output_format);
+                if (ist->hwaccel_output_format == AV_PIX_FMT_NONE) {
+                    av_log(NULL, AV_LOG_FATAL, "Unrecognised hwaccel output "
+                           "format: %s", hwaccel_output_format);
+                }
+            } else {
+                ist->hwaccel_output_format = AV_PIX_FMT_NONE;
+            }
+
             if (hwaccel) {
                 // The NVDEC hwaccels use a CUDA device, so remap the name here.
-                if (!strcmp(hwaccel, "nvdec"))
+                if (!strcmp(hwaccel, "nvdec") || !strcmp(hwaccel, "cuvid"))
                     hwaccel = "cuda";
 
                 if (!strcmp(hwaccel, "none"))
@@ -834,8 +933,6 @@
                                AV_HWDEVICE_TYPE_NONE)
                             av_log(NULL, AV_LOG_FATAL, "%s ",
                                    av_hwdevice_get_type_name(type));
-                        for (i = 0; hwaccels[i].name; i++)
-                            av_log(NULL, AV_LOG_FATAL, "%s ", hwaccels[i].name);
                         av_log(NULL, AV_LOG_FATAL, "\n");
                         exit_program(1);
                     }
@@ -849,18 +946,6 @@
                     exit_program(1);
             }
 
-            MATCH_PER_STREAM_OPT(hwaccel_output_formats, str,
-                                 hwaccel_output_format, ic, st);
-            if (hwaccel_output_format) {
-                ist->hwaccel_output_format = av_get_pix_fmt(hwaccel_output_format);
-                if (ist->hwaccel_output_format == AV_PIX_FMT_NONE) {
-                    av_log(NULL, AV_LOG_FATAL, "Unrecognised hwaccel output "
-                           "format: %s", hwaccel_output_format);
-                }
-            } else {
-                ist->hwaccel_output_format = AV_PIX_FMT_NONE;
-            }
-
             ist->hwaccel_pix_fmt = AV_PIX_FMT_NONE;
 
             break;
@@ -910,7 +995,7 @@
     if (!file_overwrite) {
         if (proto_name && !strcmp(proto_name, "file") && avio_check(filename, 0) == 0) {
             if (stdin_interaction && !no_file_overwrite) {
-                fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
+                fprintf(stderr,"File '%s' already exists. Overwrite? [y/N] ", filename);
                 fflush(stderr);
                 term_exit();
                 signal(SIGINT, SIG_DFL);
@@ -2173,7 +2258,10 @@
             for (i = 0; i < nb_input_streams; i++) {
                 int new_area;
                 ist = input_streams[i];
-                new_area = ist->st->codecpar->width * ist->st->codecpar->height + 100000000*!!ist->st->codec_info_nb_frames;
+                new_area = ist->st->codecpar->width * ist->st->codecpar->height + 100000000*!!ist->st->codec_info_nb_frames
+                           + 5000000*!!(ist->st->disposition & AV_DISPOSITION_DEFAULT);
+                if (ist->user_set_discard == AVDISCARD_ALL)
+                    continue;
                 if((qcr!=MKTAG('A', 'P', 'I', 'C')) && (ist->st->disposition & AV_DISPOSITION_ATTACHED_PIC))
                     new_area = 1;
                 if (ist->st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO &&
@@ -2194,7 +2282,10 @@
             for (i = 0; i < nb_input_streams; i++) {
                 int score;
                 ist = input_streams[i];
-                score = ist->st->codecpar->channels + 100000000*!!ist->st->codec_info_nb_frames;
+                score = ist->st->codecpar->channels + 100000000*!!ist->st->codec_info_nb_frames
+                        + 5000000*!!(ist->st->disposition & AV_DISPOSITION_DEFAULT);
+                if (ist->user_set_discard == AVDISCARD_ALL)
+                    continue;
                 if (ist->st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO &&
                     score > best_score) {
                     best_score = score;
@@ -2216,6 +2307,8 @@
                     AVCodec const *output_codec =
                         avcodec_find_encoder(oc->oformat->subtitle_codec);
                     int input_props = 0, output_props = 0;
+                    if (input_streams[i]->user_set_discard == AVDISCARD_ALL)
+                        continue;
                     if (output_codec)
                         output_descriptor = avcodec_descriptor_get(output_codec->id);
                     if (input_descriptor)
@@ -2237,6 +2330,8 @@
         if (!o->data_disable ) {
             enum AVCodecID codec_id = av_guess_codec(oc->oformat, NULL, filename, NULL, AVMEDIA_TYPE_DATA);
             for (i = 0; codec_id != AV_CODEC_ID_NONE && i < nb_input_streams; i++) {
+                if (input_streams[i]->user_set_discard == AVDISCARD_ALL)
+                    continue;
                 if (input_streams[i]->st->codecpar->codec_type == AVMEDIA_TYPE_DATA
                     && input_streams[i]->st->codecpar->codec_id == codec_id )
                     new_data_stream(o, oc, i);
@@ -2275,6 +2370,11 @@
                 int src_idx = input_files[map->file_index]->ist_index + map->stream_index;
 
                 ist = input_streams[input_files[map->file_index]->ist_index + map->stream_index];
+                if (ist->user_set_discard == AVDISCARD_ALL) {
+                    av_log(NULL, AV_LOG_FATAL, "Stream #%d:%d is disabled and cannot be mapped.\n",
+                           map->file_index, map->stream_index);
+                    exit_program(1);
+                }
                 if(o->subtitle_disable && ist->st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE)
                     continue;
                 if(o->   audio_disable && ist->st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO)
@@ -2332,12 +2432,14 @@
                    o->attachments[i]);
             exit_program(1);
         }
-        if (!(attachment = av_malloc(len))) {
-            av_log(NULL, AV_LOG_FATAL, "Attachment %s too large to fit into memory.\n",
+        if (len > INT_MAX - AV_INPUT_BUFFER_PADDING_SIZE ||
+            !(attachment = av_malloc(len + AV_INPUT_BUFFER_PADDING_SIZE))) {
+            av_log(NULL, AV_LOG_FATAL, "Attachment %s too large.\n",
                    o->attachments[i]);
             exit_program(1);
         }
         avio_read(pb, attachment, len);
+        memset(attachment + len, 0, AV_INPUT_BUFFER_PADDING_SIZE);
 
         ost = new_attachment_stream(o, oc, -1);
         ost->stream_copy               = 0;
@@ -2729,13 +2831,14 @@
     } else {
         /* Try to determine PAL/NTSC by peeking in the input files */
         if (nb_input_files) {
-            int i, j, fr;
+            int i, j;
             for (j = 0; j < nb_input_files; j++) {
                 for (i = 0; i < input_files[j]->nb_streams; i++) {
                     AVStream *st = input_files[j]->ctx->streams[i];
+                    int64_t fr;
                     if (st->codecpar->codec_type != AVMEDIA_TYPE_VIDEO)
                         continue;
-                    fr = st->time_base.den * 1000 / st->time_base.num;
+                    fr = st->time_base.den * 1000LL / st->time_base.num;
                     if (fr == 25000) {
                         norm = PAL;
                         break;
@@ -2965,8 +3068,11 @@
 static int opt_old2new(void *optctx, const char *opt, const char *arg)
 {
     OptionsContext *o = optctx;
+    int ret;
     char *s = av_asprintf("%s:%c", opt + 1, *opt);
-    int ret = parse_option(o, s, arg, options);
+    if (!s)
+        return AVERROR(ENOMEM);
+    ret = parse_option(o, s, arg, options);
     av_free(s);
     return ret;
 }
@@ -2997,6 +3103,8 @@
         return parse_option(o, "q:v", arg, options);
     }
     s = av_asprintf("q%s", opt + 6);
+    if (!s)
+        return AVERROR(ENOMEM);
     ret = parse_option(o, s, arg, options);
     av_free(s);
     return ret;
@@ -3041,8 +3149,11 @@
 static int opt_timecode(void *optctx, const char *opt, const char *arg)
 {
     OptionsContext *o = optctx;
+    int ret;
     char *tcr = av_asprintf("timecode=%s", arg);
-    int ret = parse_option(o, "metadata:g", tcr, options);
+    if (!tcr)
+        return AVERROR(ENOMEM);
+    ret = parse_option(o, "metadata:g", tcr, options);
     if (ret >= 0)
         ret = av_dict_set(&o->g->codec_opts, "gop_timecode", arg, 0);
     av_free(tcr);
@@ -3144,7 +3255,7 @@
            "    -h      -- print basic options\n"
            "    -h long -- print more options\n"
            "    -h full -- print all options (including all format and codec specific options, very long)\n"
-           "    -h type=name -- print all options for the named decoder/encoder/demuxer/muxer/filter/bsf\n"
+           "    -h type=name -- print all options for the named decoder/encoder/demuxer/muxer/filter/bsf/protocol\n"
            "    See man %s for detailed description of the options.\n"
            "\n", program_name);
 
@@ -3152,7 +3263,7 @@
                       OPT_EXIT, 0, 0);
 
     show_help_options(options, "Global options (affect whole program "
-                      "instead of just one file:",
+                      "instead of just one file):",
                       0, per_file | OPT_EXIT | OPT_EXPERT, 0);
     if (show_advanced)
         show_help_options(options, "Advanced global options:", OPT_EXPERT,
@@ -3228,6 +3339,7 @@
         if (ret < 0) {
             av_log(NULL, AV_LOG_ERROR, "Error parsing options for %s file "
                    "%s.\n", inout, g->arg);
+            uninit_options(&o);
             return ret;
         }
 
@@ -3401,7 +3513,7 @@
     { "stdin",          OPT_BOOL | OPT_EXPERT,                       { &stdin_interaction },
       "enable or disable interaction on standard input" },
     { "timelimit",      HAS_ARG | OPT_EXPERT,                        { .func_arg = opt_timelimit },
-        "set max runtime in seconds", "limit" },
+        "set max runtime in seconds in CPU user time", "limit" },
     { "dump",           OPT_BOOL | OPT_EXPERT,                       { &do_pkt_dump },
         "dump each input packet" },
     { "hex",            OPT_BOOL | OPT_EXPERT,                       { &do_hex_dump },
diff --git a/fftools/ffmpeg_videotoolbox.c b/fftools/ffmpeg_videotoolbox.c
index b820aec..628fb5e 100644
--- a/fftools/ffmpeg_videotoolbox.c
+++ b/fftools/ffmpeg_videotoolbox.c
@@ -51,7 +51,12 @@
     case kCVPixelFormatType_422YpCbCr8:       vt->tmp_frame->format = AV_PIX_FMT_UYVY422; break;
     case kCVPixelFormatType_32BGRA:           vt->tmp_frame->format = AV_PIX_FMT_BGRA; break;
 #ifdef kCFCoreFoundationVersionNumber10_7
-    case kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange: vt->tmp_frame->format = AV_PIX_FMT_NV12; break;
+    case kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange:
+    case kCVPixelFormatType_420YpCbCr8BiPlanarFullRange: vt->tmp_frame->format = AV_PIX_FMT_NV12; break;
+#endif
+#if HAVE_KCVPIXELFORMATTYPE_420YPCBCR10BIPLANARVIDEORANGE
+    case kCVPixelFormatType_420YpCbCr10BiPlanarVideoRange:
+    case kCVPixelFormatType_420YpCbCr10BiPlanarFullRange: vt->tmp_frame->format = AV_PIX_FMT_P010; break;
 #endif
     default:
         av_log(NULL, AV_LOG_ERROR,
diff --git a/fftools/ffplay.c b/fftools/ffplay.c
index ab1f9fa..1beec54 100644
--- a/fftools/ffplay.c
+++ b/fftools/ffplay.c
@@ -40,6 +40,7 @@
 #include "libavutil/samplefmt.h"
 #include "libavutil/avassert.h"
 #include "libavutil/time.h"
+#include "libavutil/bprint.h"
 #include "libavformat/avformat.h"
 #include "libavdevice/avdevice.h"
 #include "libswscale/swscale.h"
@@ -324,8 +325,9 @@
 static float seek_interval = 10;
 static int display_disable;
 static int borderless;
+static int alwaysontop;
 static int startup_volume = 100;
-static int show_status = 1;
+static int show_status = -1;
 static int av_sync_type = AV_SYNC_AUDIO_MASTER;
 static int64_t start_time = AV_NOPTS_VALUE;
 static int64_t duration = AV_NOPTS_VALUE;
@@ -353,6 +355,7 @@
 #endif
 static int autorotate = 1;
 static int find_stream_info = 1;
+static int filter_nbthreads = 0;
 
 /* current context */
 static int is_full_screen;
@@ -642,7 +645,10 @@
                 if (packet_queue_get(d->queue, &pkt, 1, &d->pkt_serial) < 0)
                     return -1;
             }
-        } while (d->queue->serial != d->pkt_serial);
+            if (d->queue->serial == d->pkt_serial)
+                break;
+            av_packet_unref(&pkt);
+        } while (1);
 
         if (pkt.data == flush_pkt.data) {
             avcodec_flush_buffers(d->avctx);
@@ -861,31 +867,27 @@
                                    int scr_xleft, int scr_ytop, int scr_width, int scr_height,
                                    int pic_width, int pic_height, AVRational pic_sar)
 {
-    float aspect_ratio;
-    int width, height, x, y;
+    AVRational aspect_ratio = pic_sar;
+    int64_t width, height, x, y;
 
-    if (pic_sar.num == 0)
-        aspect_ratio = 0;
-    else
-        aspect_ratio = av_q2d(pic_sar);
+    if (av_cmp_q(aspect_ratio, av_make_q(0, 1)) <= 0)
+        aspect_ratio = av_make_q(1, 1);
 
-    if (aspect_ratio <= 0.0)
-        aspect_ratio = 1.0;
-    aspect_ratio *= (float)pic_width / (float)pic_height;
+    aspect_ratio = av_mul_q(aspect_ratio, av_make_q(pic_width, pic_height));
 
     /* XXX: we suppose the screen has a 1.0 pixel ratio */
     height = scr_height;
-    width = lrint(height * aspect_ratio) & ~1;
+    width = av_rescale(height, aspect_ratio.num, aspect_ratio.den) & ~1;
     if (width > scr_width) {
         width = scr_width;
-        height = lrint(width / aspect_ratio) & ~1;
+        height = av_rescale(width, aspect_ratio.den, aspect_ratio.num) & ~1;
     }
     x = (scr_width - width) / 2;
     y = (scr_height - height) / 2;
     rect->x = scr_xleft + x;
     rect->y = scr_ytop  + y;
-    rect->w = FFMAX(width,  1);
-    rect->h = FFMAX(height, 1);
+    rect->w = FFMAX((int)width,  1);
+    rect->h = FFMAX((int)height, 1);
 }
 
 static void get_sdl_pix_fmt_and_blendmode(int format, Uint32 *sdl_pix_fmt, SDL_BlendMode *sdl_blendmode)
@@ -1326,7 +1328,11 @@
 static void set_default_window_size(int width, int height, AVRational sar)
 {
     SDL_Rect rect;
-    calculate_display_rect(&rect, 0, 0, INT_MAX, height, width, height, sar);
+    int max_width  = screen_width  ? screen_width  : INT_MAX;
+    int max_height = screen_height ? screen_height : INT_MAX;
+    if (max_width == INT_MAX && max_height == INT_MAX)
+        max_height = height;
+    calculate_display_rect(&rect, 0, 0, max_width, max_height, width, height, sar);
     default_width  = rect.w;
     default_height = rect.h;
 }
@@ -1335,13 +1341,8 @@
 {
     int w,h;
 
-    if (screen_width) {
-        w = screen_width;
-        h = screen_height;
-    } else {
-        w = default_width;
-        h = default_height;
-    }
+    w = screen_width ? screen_width : default_width;
+    h = screen_height ? screen_height : default_height;
 
     if (!window_title)
         window_title = input_filename;
@@ -1692,6 +1693,7 @@
     }
     is->force_refresh = 0;
     if (show_status) {
+        AVBPrint buf;
         static int64_t last_time;
         int64_t cur_time;
         int aqsize, vqsize, sqsize;
@@ -1715,18 +1717,28 @@
                 av_diff = get_master_clock(is) - get_clock(&is->vidclk);
             else if (is->audio_st)
                 av_diff = get_master_clock(is) - get_clock(&is->audclk);
-            av_log(NULL, AV_LOG_INFO,
-                   "%7.2f %s:%7.3f fd=%4d aq=%5dKB vq=%5dKB sq=%5dB f=%"PRId64"/%"PRId64"   \r",
-                   get_master_clock(is),
-                   (is->audio_st && is->video_st) ? "A-V" : (is->video_st ? "M-V" : (is->audio_st ? "M-A" : "   ")),
-                   av_diff,
-                   is->frame_drops_early + is->frame_drops_late,
-                   aqsize / 1024,
-                   vqsize / 1024,
-                   sqsize,
-                   is->video_st ? is->viddec.avctx->pts_correction_num_faulty_dts : 0,
-                   is->video_st ? is->viddec.avctx->pts_correction_num_faulty_pts : 0);
-            fflush(stdout);
+
+            av_bprint_init(&buf, 0, AV_BPRINT_SIZE_AUTOMATIC);
+            av_bprintf(&buf,
+                      "%7.2f %s:%7.3f fd=%4d aq=%5dKB vq=%5dKB sq=%5dB f=%"PRId64"/%"PRId64"   \r",
+                      get_master_clock(is),
+                      (is->audio_st && is->video_st) ? "A-V" : (is->video_st ? "M-V" : (is->audio_st ? "M-A" : "   ")),
+                      av_diff,
+                      is->frame_drops_early + is->frame_drops_late,
+                      aqsize / 1024,
+                      vqsize / 1024,
+                      sqsize,
+                      is->video_st ? is->viddec.avctx->pts_correction_num_faulty_dts : 0,
+                      is->video_st ? is->viddec.avctx->pts_correction_num_faulty_pts : 0);
+
+            if (show_status == 1 && AV_LOG_INFO > av_log_get_level())
+                fprintf(stderr, "%s", buf.str);
+            else
+                av_log(NULL, AV_LOG_INFO, "%s", buf.str);
+
+            fflush(stderr);
+            av_bprint_finalize(&buf, NULL);
+
             last_time = cur_time;
         }
     }
@@ -1959,6 +1971,7 @@
     avfilter_graph_free(&is->agraph);
     if (!(is->agraph = avfilter_graph_alloc()))
         return AVERROR(ENOMEM);
+    is->agraph->nb_threads = filter_nbthreads;
 
     while ((e = av_dict_get(swr_opts, "", e, AV_DICT_IGNORE_SUFFIX)))
         av_strlcatf(aresample_swr_opts, sizeof(aresample_swr_opts), "%s=%s:", e->key, e->value);
@@ -2108,10 +2121,10 @@
     return ret;
 }
 
-static int decoder_start(Decoder *d, int (*fn)(void *), void *arg)
+static int decoder_start(Decoder *d, int (*fn)(void *), const char *thread_name, void* arg)
 {
     packet_queue_start(d->queue);
-    d->decoder_tid = SDL_CreateThread(fn, "decoder", arg);
+    d->decoder_tid = SDL_CreateThread(fn, thread_name, arg);
     if (!d->decoder_tid) {
         av_log(NULL, AV_LOG_ERROR, "SDL_CreateThread(): %s\n", SDL_GetError());
         return AVERROR(ENOMEM);
@@ -2130,26 +2143,17 @@
     AVRational frame_rate = av_guess_frame_rate(is->ic, is->video_st, NULL);
 
 #if CONFIG_AVFILTER
-    AVFilterGraph *graph = avfilter_graph_alloc();
+    AVFilterGraph *graph = NULL;
     AVFilterContext *filt_out = NULL, *filt_in = NULL;
     int last_w = 0;
     int last_h = 0;
     enum AVPixelFormat last_format = -2;
     int last_serial = -1;
     int last_vfilter_idx = 0;
-    if (!graph) {
-        av_frame_free(&frame);
-        return AVERROR(ENOMEM);
-    }
-
 #endif
 
-    if (!frame) {
-#if CONFIG_AVFILTER
-        avfilter_graph_free(&graph);
-#endif
+    if (!frame)
         return AVERROR(ENOMEM);
-    }
 
     for (;;) {
         ret = get_video_frame(is, frame);
@@ -2172,6 +2176,11 @@
                    (const char *)av_x_if_null(av_get_pix_fmt_name(frame->format), "none"), is->viddec.pkt_serial);
             avfilter_graph_free(&graph);
             graph = avfilter_graph_alloc();
+            if (!graph) {
+                ret = AVERROR(ENOMEM);
+                goto the_end;
+            }
+            graph->nb_threads = filter_nbthreads;
             if ((ret = configure_video_filters(graph, is, vfilters_list ? vfilters_list[is->vfilter_idx] : NULL, frame)) < 0) {
                 SDL_Event event;
                 event.type = FF_QUIT_EVENT;
@@ -2681,7 +2690,7 @@
             is->auddec.start_pts = is->audio_st->start_time;
             is->auddec.start_pts_tb = is->audio_st->time_base;
         }
-        if ((ret = decoder_start(&is->auddec, audio_thread, is)) < 0)
+        if ((ret = decoder_start(&is->auddec, audio_thread, "audio_decoder", is)) < 0)
             goto out;
         SDL_PauseAudioDevice(audio_dev, 0);
         break;
@@ -2690,7 +2699,7 @@
         is->video_st = ic->streams[stream_index];
 
         decoder_init(&is->viddec, avctx, &is->videoq, is->continue_read_thread);
-        if ((ret = decoder_start(&is->viddec, video_thread, is)) < 0)
+        if ((ret = decoder_start(&is->viddec, video_thread, "video_decoder", is)) < 0)
             goto out;
         is->queue_attachments_req = 1;
         break;
@@ -2699,7 +2708,7 @@
         is->subtitle_st = ic->streams[stream_index];
 
         decoder_init(&is->subdec, avctx, &is->subtitleq, is->continue_read_thread);
-        if ((ret = decoder_start(&is->subdec, subtitle_thread, is)) < 0)
+        if ((ret = decoder_start(&is->subdec, subtitle_thread, "subtitle_decoder", is)) < 0)
             goto out;
         break;
     default:
@@ -2980,7 +2989,7 @@
         }
         if (is->queue_attachments_req) {
             if (is->video_st && is->video_st->disposition & AV_DISPOSITION_ATTACHED_PIC) {
-                AVPacket copy = { 0 };
+                AVPacket copy;
                 if ((ret = av_packet_ref(&copy, &is->video_st->attached_pic)) < 0)
                     goto fail;
                 packet_queue_put(&is->videoq, &copy);
@@ -3442,7 +3451,7 @@
             break;
         case SDL_WINDOWEVENT:
             switch (event.window.event) {
-                case SDL_WINDOWEVENT_RESIZED:
+                case SDL_WINDOWEVENT_SIZE_CHANGED:
                     screen_width  = cur_stream->width  = event.window.data1;
                     screen_height = cur_stream->height = event.window.data2;
                     if (cur_stream->vis_texture) {
@@ -3588,6 +3597,7 @@
     { "seek_interval", OPT_FLOAT | HAS_ARG, { &seek_interval }, "set seek interval for left/right keys, in seconds", "seconds" },
     { "nodisp", OPT_BOOL, { &display_disable }, "disable graphical display" },
     { "noborder", OPT_BOOL, { &borderless }, "borderless window" },
+    { "alwaysontop", OPT_BOOL, { &alwaysontop }, "window always on top" },
     { "volume", OPT_INT | HAS_ARG, { &startup_volume}, "set startup volume 0=min 100=max", "volume" },
     { "f", HAS_ARG, { .func_arg = opt_format }, "force format", "fmt" },
     { "pix_fmt", HAS_ARG | OPT_EXPERT | OPT_VIDEO, { .func_arg = opt_frame_pix_fmt }, "set pixel format", "format" },
@@ -3621,6 +3631,7 @@
     { "autorotate", OPT_BOOL, { &autorotate }, "automatically rotate video", "" },
     { "find_stream_info", OPT_BOOL | OPT_INPUT | OPT_EXPERT, { &find_stream_info },
         "read and decode the streams to fill missing information with heuristics" },
+    { "filter_threads", HAS_ARG | OPT_INT | OPT_EXPERT, { &filter_nbthreads }, "number of filter threads per graph" },
     { NULL, },
 };
 
@@ -3728,6 +3739,12 @@
 
     if (!display_disable) {
         int flags = SDL_WINDOW_HIDDEN;
+        if (alwaysontop)
+#if SDL_VERSION_ATLEAST(2,0,5)
+            flags |= SDL_WINDOW_ALWAYS_ON_TOP;
+#else
+            av_log(NULL, AV_LOG_WARNING, "Your SDL version doesn't support SDL_WINDOW_ALWAYS_ON_TOP. Feature will be inactive.\n");
+#endif
         if (borderless)
             flags |= SDL_WINDOW_BORDERLESS;
         else
diff --git a/fftools/ffprobe.c b/fftools/ffprobe.c
index 544786e..840fcb7 100644
--- a/fftools/ffprobe.c
+++ b/fftools/ffprobe.c
@@ -36,6 +36,7 @@
 #include "libavutil/display.h"
 #include "libavutil/hash.h"
 #include "libavutil/mastering_display_metadata.h"
+#include "libavutil/dovi_meta.h"
 #include "libavutil/opt.h"
 #include "libavutil/pixdesc.h"
 #include "libavutil/spherical.h"
@@ -165,6 +166,8 @@
     SECTION_ID_FRAME_TAGS,
     SECTION_ID_FRAME_SIDE_DATA_LIST,
     SECTION_ID_FRAME_SIDE_DATA,
+    SECTION_ID_FRAME_SIDE_DATA_TIMECODE_LIST,
+    SECTION_ID_FRAME_SIDE_DATA_TIMECODE,
     SECTION_ID_FRAME_LOG,
     SECTION_ID_FRAME_LOGS,
     SECTION_ID_LIBRARY_VERSION,
@@ -209,7 +212,9 @@
     [SECTION_ID_FRAME] =              { SECTION_ID_FRAME, "frame", 0, { SECTION_ID_FRAME_TAGS, SECTION_ID_FRAME_SIDE_DATA_LIST, SECTION_ID_FRAME_LOGS, -1 } },
     [SECTION_ID_FRAME_TAGS] =         { SECTION_ID_FRAME_TAGS, "tags", SECTION_FLAG_HAS_VARIABLE_FIELDS, { -1 }, .element_name = "tag", .unique_name = "frame_tags" },
     [SECTION_ID_FRAME_SIDE_DATA_LIST] ={ SECTION_ID_FRAME_SIDE_DATA_LIST, "side_data_list", SECTION_FLAG_IS_ARRAY, { SECTION_ID_FRAME_SIDE_DATA, -1 }, .element_name = "side_data", .unique_name = "frame_side_data_list" },
-    [SECTION_ID_FRAME_SIDE_DATA] =     { SECTION_ID_FRAME_SIDE_DATA, "side_data", 0, { -1 } },
+    [SECTION_ID_FRAME_SIDE_DATA] =     { SECTION_ID_FRAME_SIDE_DATA, "side_data", 0, { SECTION_ID_FRAME_SIDE_DATA_TIMECODE_LIST, -1 } },
+    [SECTION_ID_FRAME_SIDE_DATA_TIMECODE_LIST] =     { SECTION_ID_FRAME_SIDE_DATA_TIMECODE_LIST, "timecodes", SECTION_FLAG_IS_ARRAY, { SECTION_ID_FRAME_SIDE_DATA_TIMECODE, -1 } },
+    [SECTION_ID_FRAME_SIDE_DATA_TIMECODE] =     { SECTION_ID_FRAME_SIDE_DATA_TIMECODE, "timecode", 0, { -1 } },
     [SECTION_ID_FRAME_LOGS] =         { SECTION_ID_FRAME_LOGS, "logs", SECTION_FLAG_IS_ARRAY, { SECTION_ID_FRAME_LOG, -1 } },
     [SECTION_ID_FRAME_LOG] =          { SECTION_ID_FRAME_LOG, "log", 0, { -1 },  },
     [SECTION_ID_LIBRARY_VERSIONS] =   { SECTION_ID_LIBRARY_VERSIONS, "library_versions", SECTION_FLAG_IS_ARRAY, { SECTION_ID_LIBRARY_VERSION, -1 } },
@@ -250,6 +255,7 @@
 
 /* FFprobe context */
 static const char *input_filename;
+static const char *print_input_filename;
 static AVInputFormat *iformat = NULL;
 
 static struct AVHashContext *hash;
@@ -1079,12 +1085,12 @@
 #define OFFSET(x) offsetof(CompactContext, x)
 
 static const AVOption compact_options[]= {
-    {"item_sep", "set item separator",    OFFSET(item_sep_str),    AV_OPT_TYPE_STRING, {.str="|"},  CHAR_MIN, CHAR_MAX },
-    {"s",        "set item separator",    OFFSET(item_sep_str),    AV_OPT_TYPE_STRING, {.str="|"},  CHAR_MIN, CHAR_MAX },
+    {"item_sep", "set item separator",    OFFSET(item_sep_str),    AV_OPT_TYPE_STRING, {.str="|"},  0, 0 },
+    {"s",        "set item separator",    OFFSET(item_sep_str),    AV_OPT_TYPE_STRING, {.str="|"},  0, 0 },
     {"nokey",    "force no key printing", OFFSET(nokey),           AV_OPT_TYPE_BOOL,   {.i64=0},    0,        1        },
     {"nk",       "force no key printing", OFFSET(nokey),           AV_OPT_TYPE_BOOL,   {.i64=0},    0,        1        },
-    {"escape",   "set escape mode",       OFFSET(escape_mode_str), AV_OPT_TYPE_STRING, {.str="c"},  CHAR_MIN, CHAR_MAX },
-    {"e",        "set escape mode",       OFFSET(escape_mode_str), AV_OPT_TYPE_STRING, {.str="c"},  CHAR_MIN, CHAR_MAX },
+    {"escape",   "set escape mode",       OFFSET(escape_mode_str), AV_OPT_TYPE_STRING, {.str="c"},  0, 0 },
+    {"e",        "set escape mode",       OFFSET(escape_mode_str), AV_OPT_TYPE_STRING, {.str="c"},  0, 0 },
     {"print_section", "print section name", OFFSET(print_section), AV_OPT_TYPE_BOOL,   {.i64=1},    0,        1        },
     {"p",             "print section name", OFFSET(print_section), AV_OPT_TYPE_BOOL,   {.i64=1},    0,        1        },
     {NULL},
@@ -1195,12 +1201,12 @@
 #define OFFSET(x) offsetof(CompactContext, x)
 
 static const AVOption csv_options[] = {
-    {"item_sep", "set item separator",    OFFSET(item_sep_str),    AV_OPT_TYPE_STRING, {.str=","},  CHAR_MIN, CHAR_MAX },
-    {"s",        "set item separator",    OFFSET(item_sep_str),    AV_OPT_TYPE_STRING, {.str=","},  CHAR_MIN, CHAR_MAX },
+    {"item_sep", "set item separator",    OFFSET(item_sep_str),    AV_OPT_TYPE_STRING, {.str=","},  0, 0 },
+    {"s",        "set item separator",    OFFSET(item_sep_str),    AV_OPT_TYPE_STRING, {.str=","},  0, 0 },
     {"nokey",    "force no key printing", OFFSET(nokey),           AV_OPT_TYPE_BOOL,   {.i64=1},    0,        1        },
     {"nk",       "force no key printing", OFFSET(nokey),           AV_OPT_TYPE_BOOL,   {.i64=1},    0,        1        },
-    {"escape",   "set escape mode",       OFFSET(escape_mode_str), AV_OPT_TYPE_STRING, {.str="csv"}, CHAR_MIN, CHAR_MAX },
-    {"e",        "set escape mode",       OFFSET(escape_mode_str), AV_OPT_TYPE_STRING, {.str="csv"}, CHAR_MIN, CHAR_MAX },
+    {"escape",   "set escape mode",       OFFSET(escape_mode_str), AV_OPT_TYPE_STRING, {.str="csv"}, 0, 0 },
+    {"e",        "set escape mode",       OFFSET(escape_mode_str), AV_OPT_TYPE_STRING, {.str="csv"}, 0, 0 },
     {"print_section", "print section name", OFFSET(print_section), AV_OPT_TYPE_BOOL,   {.i64=1},    0,        1        },
     {"p",             "print section name", OFFSET(print_section), AV_OPT_TYPE_BOOL,   {.i64=1},    0,        1        },
     {NULL},
@@ -1233,8 +1239,8 @@
 #define OFFSET(x) offsetof(FlatContext, x)
 
 static const AVOption flat_options[]= {
-    {"sep_char", "set separator",    OFFSET(sep_str),    AV_OPT_TYPE_STRING, {.str="."},  CHAR_MIN, CHAR_MAX },
-    {"s",        "set separator",    OFFSET(sep_str),    AV_OPT_TYPE_STRING, {.str="."},  CHAR_MIN, CHAR_MAX },
+    {"sep_char", "set separator",    OFFSET(sep_str),    AV_OPT_TYPE_STRING, {.str="."},  0, 0 },
+    {"s",        "set separator",    OFFSET(sep_str),    AV_OPT_TYPE_STRING, {.str="."},  0, 0 },
     {"hierarchical", "specify if the section specification should be hierarchical", OFFSET(hierarchical), AV_OPT_TYPE_BOOL, {.i64=1}, 0, 1 },
     {"h",            "specify if the section specification should be hierarchical", OFFSET(hierarchical), AV_OPT_TYPE_BOOL, {.i64=1}, 0, 1 },
     {NULL},
@@ -1531,7 +1537,7 @@
             if (parent_section && parent_section->id == SECTION_ID_PACKETS_AND_FRAMES) {
                 if (!json->compact)
                     JSON_INDENT();
-                printf("\"type\": \"%s\"%s", section->name, json->item_sep);
+                printf("\"type\": \"%s\"", section->name);
             }
         }
         av_bprint_finalize(&buf, NULL);
@@ -1575,8 +1581,10 @@
 static void json_print_str(WriterContext *wctx, const char *key, const char *value)
 {
     JSONContext *json = wctx->priv;
+    const struct section *parent_section = wctx->level ?
+        wctx->section[wctx->level-1] : NULL;
 
-    if (wctx->nb_item[wctx->level])
+    if (wctx->nb_item[wctx->level] || (parent_section && parent_section->id == SECTION_ID_PACKETS_AND_FRAMES))
         printf("%s", json->item_sep);
     if (!json->compact)
         JSON_INDENT();
@@ -1586,9 +1594,11 @@
 static void json_print_int(WriterContext *wctx, const char *key, long long int value)
 {
     JSONContext *json = wctx->priv;
+    const struct section *parent_section = wctx->level ?
+        wctx->section[wctx->level-1] : NULL;
     AVBPrint buf;
 
-    if (wctx->nb_item[wctx->level])
+    if (wctx->nb_item[wctx->level] || (parent_section && parent_section->id == SECTION_ID_PACKETS_AND_FRAMES))
         printf("%s", json->item_sep);
     if (!json->compact)
         JSON_INDENT();
@@ -1919,6 +1929,16 @@
             AVContentLightMetadata *metadata = (AVContentLightMetadata *)sd->data;
             print_int("max_content", metadata->MaxCLL);
             print_int("max_average", metadata->MaxFALL);
+        } else if (sd->type == AV_PKT_DATA_DOVI_CONF) {
+            AVDOVIDecoderConfigurationRecord *dovi = (AVDOVIDecoderConfigurationRecord *)sd->data;
+            print_int("dv_version_major", dovi->dv_version_major);
+            print_int("dv_version_minor", dovi->dv_version_minor);
+            print_int("dv_profile", dovi->dv_profile);
+            print_int("dv_level", dovi->dv_level);
+            print_int("rpu_present_flag", dovi->rpu_present_flag);
+            print_int("el_present_flag", dovi->el_present_flag);
+            print_int("bl_present_flag", dovi->bl_present_flag);
+            print_int("dv_bl_signal_compatibility_id", dovi->dv_bl_signal_compatibility_id);
         }
         writer_print_section_footer(w);
     }
@@ -2199,6 +2219,18 @@
                 char tcbuf[AV_TIMECODE_STR_SIZE];
                 av_timecode_make_mpeg_tc_string(tcbuf, *(int64_t *)(sd->data));
                 print_str("timecode", tcbuf);
+            } else if (sd->type == AV_FRAME_DATA_S12M_TIMECODE && sd->size == 16) {
+                uint32_t *tc = (uint32_t*)sd->data;
+                int m = FFMIN(tc[0],3);
+                writer_print_section_header(w, SECTION_ID_FRAME_SIDE_DATA_TIMECODE_LIST);
+                for (int j = 1; j <= m ; j++) {
+                    char tcbuf[AV_TIMECODE_STR_SIZE];
+                    av_timecode_make_smpte_tc_string(tcbuf, tc[j], 0);
+                    writer_print_section_header(w, SECTION_ID_FRAME_SIDE_DATA_TIMECODE);
+                    print_str("value", tcbuf);
+                    writer_print_section_footer(w);
+                }
+                writer_print_section_footer(w);
             } else if (sd->type == AV_FRAME_DATA_MASTERING_DISPLAY_METADATA) {
                 AVMasteringDisplayMetadata *metadata = (AVMasteringDisplayMetadata *)sd->data;
 
@@ -2413,9 +2445,7 @@
         }
         av_packet_unref(&pkt);
     }
-    av_init_packet(&pkt);
-    pkt.data = NULL;
-    pkt.size = 0;
+    av_packet_unref(&pkt);
     //Flush remaining frames that are cached in the decoder
     for (i = 0; i < fmt_ctx->nb_streams; i++) {
         pkt.stream_index = i;
@@ -2646,20 +2676,20 @@
     } while (0)
 
     if (do_show_stream_disposition) {
-    writer_print_section_header(w, in_program ? SECTION_ID_PROGRAM_STREAM_DISPOSITION : SECTION_ID_STREAM_DISPOSITION);
-    PRINT_DISPOSITION(DEFAULT,          "default");
-    PRINT_DISPOSITION(DUB,              "dub");
-    PRINT_DISPOSITION(ORIGINAL,         "original");
-    PRINT_DISPOSITION(COMMENT,          "comment");
-    PRINT_DISPOSITION(LYRICS,           "lyrics");
-    PRINT_DISPOSITION(KARAOKE,          "karaoke");
-    PRINT_DISPOSITION(FORCED,           "forced");
-    PRINT_DISPOSITION(HEARING_IMPAIRED, "hearing_impaired");
-    PRINT_DISPOSITION(VISUAL_IMPAIRED,  "visual_impaired");
-    PRINT_DISPOSITION(CLEAN_EFFECTS,    "clean_effects");
-    PRINT_DISPOSITION(ATTACHED_PIC,     "attached_pic");
-    PRINT_DISPOSITION(TIMED_THUMBNAILS, "timed_thumbnails");
-    writer_print_section_footer(w);
+        writer_print_section_header(w, in_program ? SECTION_ID_PROGRAM_STREAM_DISPOSITION : SECTION_ID_STREAM_DISPOSITION);
+        PRINT_DISPOSITION(DEFAULT,          "default");
+        PRINT_DISPOSITION(DUB,              "dub");
+        PRINT_DISPOSITION(ORIGINAL,         "original");
+        PRINT_DISPOSITION(COMMENT,          "comment");
+        PRINT_DISPOSITION(LYRICS,           "lyrics");
+        PRINT_DISPOSITION(KARAOKE,          "karaoke");
+        PRINT_DISPOSITION(FORCED,           "forced");
+        PRINT_DISPOSITION(HEARING_IMPAIRED, "hearing_impaired");
+        PRINT_DISPOSITION(VISUAL_IMPAIRED,  "visual_impaired");
+        PRINT_DISPOSITION(CLEAN_EFFECTS,    "clean_effects");
+        PRINT_DISPOSITION(ATTACHED_PIC,     "attached_pic");
+        PRINT_DISPOSITION(TIMED_THUMBNAILS, "timed_thumbnails");
+        writer_print_section_footer(w);
     }
 
     if (do_show_stream_tags)
@@ -2818,7 +2848,8 @@
     writer_print_section_footer(w);
 }
 
-static int open_input_file(InputFile *ifile, const char *filename)
+static int open_input_file(InputFile *ifile, const char *filename,
+                           const char *print_filename)
 {
     int err, i;
     AVFormatContext *fmt_ctx = NULL;
@@ -2840,6 +2871,10 @@
         print_error(filename, err);
         return err;
     }
+    if (print_filename) {
+        av_freep(&fmt_ctx->url);
+        fmt_ctx->url = av_strdup(print_filename);
+    }
     ifile->fmt_ctx = fmt_ctx;
     if (scan_all_pmts_set)
         av_dict_set(&format_opts, "scan_all_pmts", NULL, AV_DICT_MATCH_CASE);
@@ -2953,7 +2988,8 @@
     avformat_close_input(&ifile->fmt_ctx);
 }
 
-static int probe_file(WriterContext *wctx, const char *filename)
+static int probe_file(WriterContext *wctx, const char *filename,
+                      const char *print_filename)
 {
     InputFile ifile = { 0 };
     int ret, i;
@@ -2962,7 +2998,7 @@
     do_read_frames = do_show_frames || do_count_frames;
     do_read_packets = do_show_packets || do_count_packets;
 
-    ret = open_input_file(&ifile, filename);
+    ret = open_input_file(&ifile, filename, print_filename);
     if (ret < 0)
         goto end;
 
@@ -3268,6 +3304,12 @@
     return 0;
 }
 
+static int opt_print_filename(void *optctx, const char *opt, const char *arg)
+{
+    print_input_filename = arg;
+    return 0;
+}
+
 void show_help_default(const char *opt, const char *arg)
 {
     av_log_set_callback(log_callback_help);
@@ -3457,7 +3499,7 @@
     return 0;
 }
 
-static int opt_show_versions(const char *opt, const char *arg)
+static int opt_show_versions(void *optctx, const char *opt, const char *arg)
 {
     mark_section_show_entries(SECTION_ID_PROGRAM_VERSION, 1, NULL);
     mark_section_show_entries(SECTION_ID_LIBRARY_VERSION, 1, NULL);
@@ -3465,7 +3507,7 @@
 }
 
 #define DEFINE_OPT_SHOW_SECTION(section, target_section_id)             \
-    static int opt_show_##section(const char *opt, const char *arg)     \
+    static int opt_show_##section(void *optctx, const char *opt, const char *arg) \
     {                                                                   \
         mark_section_show_entries(SECTION_ID_##target_section_id, 1, NULL); \
         return 0;                                                       \
@@ -3493,39 +3535,40 @@
       "use sexagesimal format HOURS:MM:SS.MICROSECONDS for time units" },
     { "pretty", 0, {.func_arg = opt_pretty},
       "prettify the format of displayed values, make it more human readable" },
-    { "print_format", OPT_STRING | HAS_ARG, {(void*)&print_format},
+    { "print_format", OPT_STRING | HAS_ARG, { &print_format },
       "set the output printing format (available formats are: default, compact, csv, flat, ini, json, xml)", "format" },
-    { "of", OPT_STRING | HAS_ARG, {(void*)&print_format}, "alias for -print_format", "format" },
-    { "select_streams", OPT_STRING | HAS_ARG, {(void*)&stream_specifier}, "select the specified streams", "stream_specifier" },
+    { "of", OPT_STRING | HAS_ARG, { &print_format }, "alias for -print_format", "format" },
+    { "select_streams", OPT_STRING | HAS_ARG, { &stream_specifier }, "select the specified streams", "stream_specifier" },
     { "sections", OPT_EXIT, {.func_arg = opt_sections}, "print sections structure and section information, and exit" },
-    { "show_data",    OPT_BOOL, {(void*)&do_show_data}, "show packets data" },
-    { "show_data_hash", OPT_STRING | HAS_ARG, {(void*)&show_data_hash}, "show packets data hash" },
-    { "show_error",   0, {(void*)&opt_show_error},  "show probing error" },
-    { "show_format",  0, {(void*)&opt_show_format}, "show format/container info" },
-    { "show_frames",  0, {(void*)&opt_show_frames}, "show frames info" },
+    { "show_data",    OPT_BOOL, { &do_show_data }, "show packets data" },
+    { "show_data_hash", OPT_STRING | HAS_ARG, { &show_data_hash }, "show packets data hash" },
+    { "show_error",   0, { .func_arg = &opt_show_error },  "show probing error" },
+    { "show_format",  0, { .func_arg = &opt_show_format }, "show format/container info" },
+    { "show_frames",  0, { .func_arg = &opt_show_frames }, "show frames info" },
     { "show_format_entry", HAS_ARG, {.func_arg = opt_show_format_entry},
       "show a particular entry from the format/container info", "entry" },
     { "show_entries", HAS_ARG, {.func_arg = opt_show_entries},
       "show a set of specified entries", "entry_list" },
 #if HAVE_THREADS
-    { "show_log", OPT_INT|HAS_ARG, {(void*)&do_show_log}, "show log" },
+    { "show_log", OPT_INT|HAS_ARG, { &do_show_log }, "show log" },
 #endif
-    { "show_packets", 0, {(void*)&opt_show_packets}, "show packets info" },
-    { "show_programs", 0, {(void*)&opt_show_programs}, "show programs info" },
-    { "show_streams", 0, {(void*)&opt_show_streams}, "show streams info" },
-    { "show_chapters", 0, {(void*)&opt_show_chapters}, "show chapters info" },
-    { "count_frames", OPT_BOOL, {(void*)&do_count_frames}, "count the number of frames per stream" },
-    { "count_packets", OPT_BOOL, {(void*)&do_count_packets}, "count the number of packets per stream" },
-    { "show_program_version",  0, {(void*)&opt_show_program_version},  "show ffprobe version" },
-    { "show_library_versions", 0, {(void*)&opt_show_library_versions}, "show library versions" },
-    { "show_versions",         0, {(void*)&opt_show_versions}, "show program and library versions" },
-    { "show_pixel_formats", 0, {(void*)&opt_show_pixel_formats}, "show pixel format descriptions" },
-    { "show_private_data", OPT_BOOL, {(void*)&show_private_data}, "show private data" },
-    { "private",           OPT_BOOL, {(void*)&show_private_data}, "same as show_private_data" },
+    { "show_packets", 0, { .func_arg = &opt_show_packets }, "show packets info" },
+    { "show_programs", 0, { .func_arg = &opt_show_programs }, "show programs info" },
+    { "show_streams", 0, { .func_arg = &opt_show_streams }, "show streams info" },
+    { "show_chapters", 0, { .func_arg = &opt_show_chapters }, "show chapters info" },
+    { "count_frames", OPT_BOOL, { &do_count_frames }, "count the number of frames per stream" },
+    { "count_packets", OPT_BOOL, { &do_count_packets }, "count the number of packets per stream" },
+    { "show_program_version",  0, { .func_arg = &opt_show_program_version },  "show ffprobe version" },
+    { "show_library_versions", 0, { .func_arg = &opt_show_library_versions }, "show library versions" },
+    { "show_versions",         0, { .func_arg = &opt_show_versions }, "show program and library versions" },
+    { "show_pixel_formats", 0, { .func_arg = &opt_show_pixel_formats }, "show pixel format descriptions" },
+    { "show_private_data", OPT_BOOL, { &show_private_data }, "show private data" },
+    { "private",           OPT_BOOL, { &show_private_data }, "same as show_private_data" },
     { "bitexact", OPT_BOOL, {&do_bitexact}, "force bitexact output" },
     { "read_intervals", HAS_ARG, {.func_arg = opt_read_intervals}, "set read intervals", "read_intervals" },
     { "default", HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {.func_arg = opt_default}, "generic catch all option", "" },
     { "i", HAS_ARG, {.func_arg = opt_input_file_i}, "read specified file", "input_file"},
+    { "print_filename", HAS_ARG, {.func_arg = opt_print_filename}, "override the printed input filename", "print_file"},
     { "find_stream_info", OPT_BOOL | OPT_INPUT | OPT_EXPERT, { &find_stream_info },
         "read and decode the streams to fill missing information with heuristics" },
     { NULL, },
@@ -3674,7 +3717,7 @@
             av_log(NULL, AV_LOG_ERROR, "Use -h to get full help or, even better, run 'man %s'.\n", program_name);
             ret = AVERROR(EINVAL);
         } else if (input_filename) {
-            ret = probe_file(wctx, input_filename);
+            ret = probe_file(wctx, input_filename, print_input_filename);
             if (ret < 0 && do_show_error)
                 show_error(wctx, ret);
         }
diff --git a/fuchsia/config/default/arm64/config.h b/fuchsia/config/default/arm64/config.h
index 3c62ee6..0556857 100644
--- a/fuchsia/config/default/arm64/config.h
+++ b/fuchsia/config/default/arm64/config.h
@@ -3,10 +3,10 @@
 #define FFMPEG_CONFIG_H
 #define FFMPEG_CONFIGURATION "--disable-everything --disable-all --disable-doc --disable-htmlpages --disable-manpages --disable-podpages --disable-txtpages --disable-static --enable-avcodec --enable-avformat --enable-avutil --enable-fft --enable-rdft --enable-static --enable-libopus --disable-debug --disable-bzlib --disable-iconv --disable-lzo --disable-network --disable-schannel --disable-sdl2 --disable-symver --disable-xlib --disable-zlib --disable-securetransport --disable-faan --disable-alsa --disable-autodetect --enable-decoder='vorbis,libopus,flac' --enable-decoder='pcm_u8,pcm_s16le,pcm_s24le,pcm_s32le,pcm_f32le,mp3' --enable-decoder='pcm_s16be,pcm_s24be,pcm_mulaw,pcm_alaw' --enable-decoder='theora,vp8,sbc,aptx' --enable-demuxer='ogg,matroska,wav,flac,mp3,mov' --enable-parser='opus,vorbis,flac,mpegaudio' --extra-cflags=-I/usr/local/google/home/dalesat/fuchsia/third_party/opus/include --enable-parser='vp3,vp8' --optflags='\"-O2\"' --enable-pic --x86asmexe=yasm --enable-pic --enable-lto --cc=clang --cxx=clang++ --ld=clang --enable-cross-compile --cross-prefix=/usr/bin/x86_64-linux-gnu- --target-os=linux --arch=aarch64 --enable-armv8 --extra-cflags='-march=armv8-a' --sysroot=/usr/local/google/home/dalesat/fuchsia/third_party/ffmpeg/../../prebuilt/third_party/sysroot/linux --extra-cflags='--target=aarch64-linux-gnu' --extra-ldflags='--target=aarch64-linux-gnu' --disable-linux-perf --disable-error-resilience"
 #define FFMPEG_LICENSE "LGPL version 2.1 or later"
-#define CONFIG_THIS_YEAR 2018
+#define CONFIG_THIS_YEAR 2020
 #define FFMPEG_DATADIR "/usr/local/share/ffmpeg"
 #define AVCONV_DATADIR "/usr/local/share/ffmpeg"
-#define CC_IDENT "Fuchsia clang version 11.0.0 (https://fuchsia.googlesource.com/a/third_party/llvm-project 6e00e3fcb082c3f19309ebc6f184ab326eec3328)"
+#define CC_IDENT "Fuchsia clang version 11.0.0 (https://fuchsia.googlesource.com/a/third_party/llvm-project dd484baffdf4a92e564c38a17d35a742e633b0e0)"
 #define av_restrict restrict
 #define EXTERN_PREFIX ""
 #define EXTERN_ASM 
@@ -80,6 +80,7 @@
 #define HAVE_MIPSDSP 0
 #define HAVE_MIPSDSPR2 0
 #define HAVE_MSA 0
+#define HAVE_MSA2 0
 #define HAVE_LOONGSON2 0
 #define HAVE_LOONGSON3 0
 #define HAVE_MMI 0
@@ -125,6 +126,7 @@
 #define HAVE_MIPSDSP_EXTERNAL 0
 #define HAVE_MIPSDSPR2_EXTERNAL 0
 #define HAVE_MSA_EXTERNAL 0
+#define HAVE_MSA2_EXTERNAL 0
 #define HAVE_LOONGSON2_EXTERNAL 0
 #define HAVE_LOONGSON3_EXTERNAL 0
 #define HAVE_MMI_EXTERNAL 0
@@ -170,6 +172,7 @@
 #define HAVE_MIPSDSP_INLINE 0
 #define HAVE_MIPSDSPR2_INLINE 0
 #define HAVE_MSA_INLINE 0
+#define HAVE_MSA2_INLINE 0
 #define HAVE_LOONGSON2_INLINE 0
 #define HAVE_LOONGSON3_INLINE 0
 #define HAVE_MMI_INLINE 0
@@ -280,10 +283,12 @@
 #define HAVE_GETADDRINFO 0
 #define HAVE_GETHRTIME 0
 #define HAVE_GETOPT 1
+#define HAVE_GETMODULEHANDLE 0
 #define HAVE_GETPROCESSAFFINITYMASK 0
 #define HAVE_GETPROCESSMEMORYINFO 0
 #define HAVE_GETPROCESSTIMES 0
 #define HAVE_GETRUSAGE 1
+#define HAVE_GETSTDHANDLE 0
 #define HAVE_GETSYSTEMTIMEASFILETIME 0
 #define HAVE_GETTIMEOFDAY 1
 #define HAVE_GLOB 1
@@ -309,6 +314,7 @@
 #define HAVE_SECITEMIMPORT 0
 #define HAVE_SETCONSOLETEXTATTRIBUTE 0
 #define HAVE_SETCONSOLECTRLHANDLER 0
+#define HAVE_SETDLLDIRECTORY 0
 #define HAVE_SETMODE 0
 #define HAVE_SETRLIMIT 1
 #define HAVE_SLEEP 0
@@ -349,6 +355,10 @@
 #define HAVE_XFORM_ASM 0
 #define HAVE_XMM_CLOBBERS 0
 #define HAVE_KCMVIDEOCODECTYPE_HEVC 0
+#define HAVE_KCVPIXELFORMATTYPE_420YPCBCR10BIPLANARVIDEORANGE 0
+#define HAVE_KCVIMAGEBUFFERTRANSFERFUNCTION_SMPTE_ST_2084_PQ 0
+#define HAVE_KCVIMAGEBUFFERTRANSFERFUNCTION_ITU_R_2100_HLG 0
+#define HAVE_KCVIMAGEBUFFERTRANSFERFUNCTION_LINEAR 0
 #define HAVE_SOCKLEN_T 0
 #define HAVE_STRUCT_ADDRINFO 0
 #define HAVE_STRUCT_GROUP_SOURCE_REQ 0
@@ -362,7 +372,7 @@
 #define HAVE_STRUCT_SOCKADDR_SA_LEN 0
 #define HAVE_STRUCT_SOCKADDR_STORAGE 0
 #define HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC 1
-#define HAVE_STRUCT_V4L2_FRMIVALENUM_DISCRETE 1
+#define HAVE_STRUCT_V4L2_FRMIVALENUM_DISCRETE 0
 #define HAVE_MAKEINFO 0
 #define HAVE_MAKEINFO_HTML 0
 #define HAVE_OPENCL_D3D11 0
@@ -379,7 +389,7 @@
 #define CONFIG_MANPAGES 0
 #define CONFIG_PODPAGES 0
 #define CONFIG_TXTPAGES 0
-#define CONFIG_AVIO_DIR_CMD_EXAMPLE 1
+#define CONFIG_AVIO_LIST_DIR_EXAMPLE 1
 #define CONFIG_AVIO_READING_EXAMPLE 1
 #define CONFIG_DECODE_AUDIO_EXAMPLE 1
 #define CONFIG_DECODE_VIDEO_EXAMPLE 1
@@ -414,11 +424,11 @@
 #define CONFIG_LIBXAVS2 0
 #define CONFIG_LIBXVID 0
 #define CONFIG_DECKLINK 0
-#define CONFIG_LIBNDI_NEWTEK 0
 #define CONFIG_LIBFDK_AAC 0
 #define CONFIG_OPENSSL 0
 #define CONFIG_LIBTLS 0
 #define CONFIG_GMP 0
+#define CONFIG_LIBARIBB24 0
 #define CONFIG_LIBLENSFUN 0
 #define CONFIG_LIBOPENCORE_AMRNB 0
 #define CONFIG_LIBOPENCORE_AMRWB 0
@@ -439,12 +449,14 @@
 #define CONFIG_LIBCACA 0
 #define CONFIG_LIBCELT 0
 #define CONFIG_LIBCODEC2 0
+#define CONFIG_LIBDAV1D 0
 #define CONFIG_LIBDC1394 0
 #define CONFIG_LIBDRM 0
 #define CONFIG_LIBFLITE 0
 #define CONFIG_LIBFONTCONFIG 0
 #define CONFIG_LIBFREETYPE 0
 #define CONFIG_LIBFRIBIDI 0
+#define CONFIG_LIBGLSLANG 0
 #define CONFIG_LIBGME 0
 #define CONFIG_LIBGSM 0
 #define CONFIG_LIBIEC61883 0
@@ -461,6 +473,8 @@
 #define CONFIG_LIBOPENMPT 0
 #define CONFIG_LIBOPUS 1
 #define CONFIG_LIBPULSE 0
+#define CONFIG_LIBRABBITMQ 0
+#define CONFIG_LIBRAV1E 0
 #define CONFIG_LIBRSVG 0
 #define CONFIG_LIBRTMP 0
 #define CONFIG_LIBSHINE 0
@@ -487,6 +501,7 @@
 #define CONFIG_MEDIACODEC 0
 #define CONFIG_OPENAL 0
 #define CONFIG_OPENGL 0
+#define CONFIG_POCKETSPHINX 0
 #define CONFIG_VAPOURSYNTH 0
 #define CONFIG_ALSA 0
 #define CONFIG_APPKIT 0
@@ -505,16 +520,19 @@
 #define CONFIG_SNDIO 0
 #define CONFIG_XLIB 0
 #define CONFIG_ZLIB 0
+#define CONFIG_CUDA_NVCC 0
 #define CONFIG_CUDA_SDK 0
 #define CONFIG_LIBNPP 0
 #define CONFIG_LIBMFX 0
 #define CONFIG_MMAL 0
 #define CONFIG_OMX 0
 #define CONFIG_OPENCL 0
+#define CONFIG_VULKAN 0
 #define CONFIG_AMF 0
 #define CONFIG_AUDIOTOOLBOX 0
 #define CONFIG_CRYSTALHD 0
 #define CONFIG_CUDA 0
+#define CONFIG_CUDA_LLVM 0
 #define CONFIG_CUVID 0
 #define CONFIG_D3D11VA 0
 #define CONFIG_DXVA2 0
@@ -565,6 +583,7 @@
 #define CONFIG_RDFT 1
 #define CONFIG_AUTODETECT 0
 #define CONFIG_FONTCONFIG 0
+#define CONFIG_LARGE_TESTS 1
 #define CONFIG_LINUX_PERF 0
 #define CONFIG_MEMORY_POISONING 0
 #define CONFIG_NEON_CLOBBER_TEST 0
@@ -657,6 +676,7 @@
 #define CONFIG_RTPDEC 0
 #define CONFIG_RTPENC_CHAIN 0
 #define CONFIG_RV34DSP 0
+#define CONFIG_SCENE_SAD 0
 #define CONFIG_SINEWIN 0
 #define CONFIG_SNAPPY 0
 #define CONFIG_SRTP 0
@@ -674,6 +694,8 @@
 #define CONFIG_WMA_FREQS 0
 #define CONFIG_WMV2DSP 0
 #define CONFIG_AAC_ADTSTOASC_BSF 0
+#define CONFIG_AV1_FRAME_MERGE_BSF 0
+#define CONFIG_AV1_FRAME_SPLIT_BSF 0
 #define CONFIG_AV1_METADATA_BSF 0
 #define CONFIG_CHOMP_BSF 0
 #define CONFIG_DUMP_EXTRADATA_BSF 0
@@ -696,9 +718,11 @@
 #define CONFIG_MOV2TEXTSUB_BSF 0
 #define CONFIG_NOISE_BSF 0
 #define CONFIG_NULL_BSF 1
+#define CONFIG_PRORES_METADATA_BSF 0
 #define CONFIG_REMOVE_EXTRADATA_BSF 0
 #define CONFIG_TEXT2MOVSUB_BSF 0
 #define CONFIG_TRACE_HEADERS_BSF 0
+#define CONFIG_TRUEHD_CORE_BSF 0
 #define CONFIG_VP9_METADATA_BSF 0
 #define CONFIG_VP9_RAW_REORDER_BSF 0
 #define CONFIG_VP9_SUPERFRAME_BSF 0
@@ -706,10 +730,12 @@
 #define CONFIG_AASC_DECODER 0
 #define CONFIG_AIC_DECODER 0
 #define CONFIG_ALIAS_PIX_DECODER 0
+#define CONFIG_AGM_DECODER 0
 #define CONFIG_AMV_DECODER 0
 #define CONFIG_ANM_DECODER 0
 #define CONFIG_ANSI_DECODER 0
 #define CONFIG_APNG_DECODER 0
+#define CONFIG_ARBC_DECODER 0
 #define CONFIG_ASV1_DECODER 0
 #define CONFIG_ASV2_DECODER 0
 #define CONFIG_AURA_DECODER 0
@@ -729,6 +755,7 @@
 #define CONFIG_C93_DECODER 0
 #define CONFIG_CAVS_DECODER 0
 #define CONFIG_CDGRAPHICS_DECODER 0
+#define CONFIG_CDTOONS_DECODER 0
 #define CONFIG_CDXL_DECODER 0
 #define CONFIG_CFHD_DECODER 0
 #define CONFIG_CINEPAK_DECODER 0
@@ -797,9 +824,11 @@
 #define CONFIG_HQ_HQA_DECODER 0
 #define CONFIG_HQX_DECODER 0
 #define CONFIG_HUFFYUV_DECODER 0
+#define CONFIG_HYMT_DECODER 0
 #define CONFIG_IDCIN_DECODER 0
 #define CONFIG_IFF_ILBM_DECODER 0
 #define CONFIG_IMM4_DECODER 0
+#define CONFIG_IMM5_DECODER 0
 #define CONFIG_INDEO2_DECODER 0
 #define CONFIG_INDEO3_DECODER 0
 #define CONFIG_INDEO4_DECODER 0
@@ -812,6 +841,7 @@
 #define CONFIG_KMVC_DECODER 0
 #define CONFIG_LAGARITH_DECODER 0
 #define CONFIG_LOCO_DECODER 0
+#define CONFIG_LSCR_DECODER 0
 #define CONFIG_M101_DECODER 0
 #define CONFIG_MAGICYUV_DECODER 0
 #define CONFIG_MDEC_DECODER 0
@@ -845,8 +875,11 @@
 #define CONFIG_MSVIDEO1_DECODER 0
 #define CONFIG_MSZH_DECODER 0
 #define CONFIG_MTS2_DECODER 0
+#define CONFIG_MV30_DECODER 0
 #define CONFIG_MVC1_DECODER 0
 #define CONFIG_MVC2_DECODER 0
+#define CONFIG_MVDV_DECODER 0
+#define CONFIG_MVHA_DECODER 0
 #define CONFIG_MWSC_DECODER 0
 #define CONFIG_MXPEG_DECODER 0
 #define CONFIG_NUV_DECODER 0
@@ -883,7 +916,6 @@
 #define CONFIG_SANM_DECODER 0
 #define CONFIG_SCPR_DECODER 0
 #define CONFIG_SCREENPRESSO_DECODER 0
-#define CONFIG_SDX2_DPCM_DECODER 0
 #define CONFIG_SGI_DECODER 0
 #define CONFIG_SGIRLE_DECODER 0
 #define CONFIG_SHEERVIDEO_DECODER 0
@@ -930,6 +962,7 @@
 #define CONFIG_VMDVIDEO_DECODER 0
 #define CONFIG_VMNC_DECODER 0
 #define CONFIG_VP3_DECODER 1
+#define CONFIG_VP4_DECODER 0
 #define CONFIG_VP5_DECODER 0
 #define CONFIG_VP6_DECODER 0
 #define CONFIG_VP6A_DECODER 0
@@ -971,6 +1004,7 @@
 #define CONFIG_AAC_LATM_DECODER 0
 #define CONFIG_AC3_DECODER 0
 #define CONFIG_AC3_FIXED_DECODER 0
+#define CONFIG_ACELP_KELVIN_DECODER 0
 #define CONFIG_ALAC_DECODER 0
 #define CONFIG_ALS_DECODER 0
 #define CONFIG_AMRNB_DECODER 0
@@ -1005,6 +1039,8 @@
 #define CONFIG_G729_DECODER 0
 #define CONFIG_GSM_DECODER 0
 #define CONFIG_GSM_MS_DECODER 0
+#define CONFIG_HCA_DECODER 0
+#define CONFIG_HCOM_DECODER 0
 #define CONFIG_IAC_DECODER 0
 #define CONFIG_ILBC_DECODER 0
 #define CONFIG_IMC_DECODER 0
@@ -1038,6 +1074,7 @@
 #define CONFIG_SBC_DECODER 1
 #define CONFIG_SHORTEN_DECODER 0
 #define CONFIG_SIPR_DECODER 0
+#define CONFIG_SIREN_DECODER 0
 #define CONFIG_SMACKAUD_DECODER 0
 #define CONFIG_SONIC_DECODER 0
 #define CONFIG_TAK_DECODER 0
@@ -1089,16 +1126,20 @@
 #define CONFIG_PCM_U24LE_DECODER 0
 #define CONFIG_PCM_U32BE_DECODER 0
 #define CONFIG_PCM_U32LE_DECODER 0
-#define CONFIG_PCM_ZORK_DECODER 0
+#define CONFIG_PCM_VIDC_DECODER 0
+#define CONFIG_DERF_DPCM_DECODER 0
 #define CONFIG_GREMLIN_DPCM_DECODER 0
 #define CONFIG_INTERPLAY_DPCM_DECODER 0
 #define CONFIG_ROQ_DPCM_DECODER 0
+#define CONFIG_SDX2_DPCM_DECODER 0
 #define CONFIG_SOL_DPCM_DECODER 0
 #define CONFIG_XAN_DPCM_DECODER 0
 #define CONFIG_ADPCM_4XM_DECODER 0
 #define CONFIG_ADPCM_ADX_DECODER 0
 #define CONFIG_ADPCM_AFC_DECODER 0
+#define CONFIG_ADPCM_AGM_DECODER 0
 #define CONFIG_ADPCM_AICA_DECODER 0
+#define CONFIG_ADPCM_ARGO_DECODER 0
 #define CONFIG_ADPCM_CT_DECODER 0
 #define CONFIG_ADPCM_DTK_DECODER 0
 #define CONFIG_ADPCM_EA_DECODER 0
@@ -1111,16 +1152,20 @@
 #define CONFIG_ADPCM_G726_DECODER 0
 #define CONFIG_ADPCM_G726LE_DECODER 0
 #define CONFIG_ADPCM_IMA_AMV_DECODER 0
+#define CONFIG_ADPCM_IMA_ALP_DECODER 0
 #define CONFIG_ADPCM_IMA_APC_DECODER 0
+#define CONFIG_ADPCM_IMA_APM_DECODER 0
 #define CONFIG_ADPCM_IMA_DAT4_DECODER 0
 #define CONFIG_ADPCM_IMA_DK3_DECODER 0
 #define CONFIG_ADPCM_IMA_DK4_DECODER 0
 #define CONFIG_ADPCM_IMA_EA_EACS_DECODER 0
 #define CONFIG_ADPCM_IMA_EA_SEAD_DECODER 0
 #define CONFIG_ADPCM_IMA_ISS_DECODER 0
+#define CONFIG_ADPCM_IMA_MTF_DECODER 0
 #define CONFIG_ADPCM_IMA_OKI_DECODER 0
 #define CONFIG_ADPCM_IMA_QT_DECODER 0
 #define CONFIG_ADPCM_IMA_RAD_DECODER 0
+#define CONFIG_ADPCM_IMA_SSI_DECODER 0
 #define CONFIG_ADPCM_IMA_SMJPEG_DECODER 0
 #define CONFIG_ADPCM_IMA_WAV_DECODER 0
 #define CONFIG_ADPCM_IMA_WS_DECODER 0
@@ -1136,6 +1181,7 @@
 #define CONFIG_ADPCM_VIMA_DECODER 0
 #define CONFIG_ADPCM_XA_DECODER 0
 #define CONFIG_ADPCM_YAMAHA_DECODER 0
+#define CONFIG_ADPCM_ZORK_DECODER 0
 #define CONFIG_SSA_DECODER 0
 #define CONFIG_ASS_DECODER 0
 #define CONFIG_CCAPTION_DECODER 0
@@ -1173,9 +1219,10 @@
 #define CONFIG_PCM_MULAW_AT_DECODER 0
 #define CONFIG_QDMC_AT_DECODER 0
 #define CONFIG_QDM2_AT_DECODER 0
-#define CONFIG_LIBAOM_AV1_DECODER 0
+#define CONFIG_LIBARIBB24_DECODER 0
 #define CONFIG_LIBCELT_DECODER 0
 #define CONFIG_LIBCODEC2_DECODER 0
+#define CONFIG_LIBDAV1D_DECODER 0
 #define CONFIG_LIBDAVS2_DECODER 0
 #define CONFIG_LIBFDK_AAC_DECODER 0
 #define CONFIG_LIBGSM_DECODER 0
@@ -1194,11 +1241,13 @@
 #define CONFIG_BINTEXT_DECODER 0
 #define CONFIG_XBIN_DECODER 0
 #define CONFIG_IDF_DECODER 0
+#define CONFIG_LIBAOM_AV1_DECODER 0
 #define CONFIG_LIBOPENH264_DECODER 0
 #define CONFIG_H264_CUVID_DECODER 0
 #define CONFIG_HEVC_CUVID_DECODER 0
 #define CONFIG_HEVC_MEDIACODEC_DECODER 0
 #define CONFIG_MJPEG_CUVID_DECODER 0
+#define CONFIG_MJPEG_QSV_DECODER 0
 #define CONFIG_MPEG1_CUVID_DECODER 0
 #define CONFIG_MPEG2_CUVID_DECODER 0
 #define CONFIG_MPEG4_CUVID_DECODER 0
@@ -1209,6 +1258,7 @@
 #define CONFIG_VP8_QSV_DECODER 0
 #define CONFIG_VP9_CUVID_DECODER 0
 #define CONFIG_VP9_MEDIACODEC_DECODER 0
+#define CONFIG_VP9_QSV_DECODER 0
 #define CONFIG_A64MULTI_ENCODER 0
 #define CONFIG_A64MULTI5_ENCODER 0
 #define CONFIG_ALIAS_PIX_ENCODER 0
@@ -1315,6 +1365,7 @@
 #define CONFIG_WMAV1_ENCODER 0
 #define CONFIG_WMAV2_ENCODER 0
 #define CONFIG_PCM_ALAW_ENCODER 0
+#define CONFIG_PCM_DVD_ENCODER 0
 #define CONFIG_PCM_F32BE_ENCODER 0
 #define CONFIG_PCM_F32LE_ENCODER 0
 #define CONFIG_PCM_F64BE_ENCODER 0
@@ -1342,6 +1393,7 @@
 #define CONFIG_PCM_U24LE_ENCODER 0
 #define CONFIG_PCM_U32BE_ENCODER 0
 #define CONFIG_PCM_U32LE_ENCODER 0
+#define CONFIG_PCM_VIDC_ENCODER 0
 #define CONFIG_ROQ_DPCM_ENCODER 0
 #define CONFIG_ADPCM_ADX_ENCODER 0
 #define CONFIG_ADPCM_G722_ENCODER 0
@@ -1377,6 +1429,7 @@
 #define CONFIG_LIBOPENCORE_AMRNB_ENCODER 0
 #define CONFIG_LIBOPENJPEG_ENCODER 0
 #define CONFIG_LIBOPUS_ENCODER 0
+#define CONFIG_LIBRAV1E_ENCODER 0
 #define CONFIG_LIBSHINE_ENCODER 0
 #define CONFIG_LIBSPEEX_ENCODER 0
 #define CONFIG_LIBTHEORA_ENCODER 0
@@ -1418,10 +1471,12 @@
 #define CONFIG_MJPEG_VAAPI_ENCODER 0
 #define CONFIG_MPEG2_QSV_ENCODER 0
 #define CONFIG_MPEG2_VAAPI_ENCODER 0
+#define CONFIG_MPEG4_OMX_ENCODER 0
 #define CONFIG_MPEG4_V4L2M2M_ENCODER 0
 #define CONFIG_VP8_V4L2M2M_ENCODER 0
 #define CONFIG_VP8_VAAPI_ENCODER 0
 #define CONFIG_VP9_VAAPI_ENCODER 0
+#define CONFIG_VP9_QSV_ENCODER 0
 #define CONFIG_H263_VAAPI_HWACCEL 0
 #define CONFIG_H263_VIDEOTOOLBOX_HWACCEL 0
 #define CONFIG_H264_D3D11VA_HWACCEL 0
@@ -1469,6 +1524,7 @@
 #define CONFIG_VP9_DXVA2_HWACCEL 0
 #define CONFIG_VP9_NVDEC_HWACCEL 0
 #define CONFIG_VP9_VAAPI_HWACCEL 0
+#define CONFIG_VP9_VDPAU_HWACCEL 0
 #define CONFIG_WMV3_D3D11VA_HWACCEL 0
 #define CONFIG_WMV3_D3D11VA2_HWACCEL 0
 #define CONFIG_WMV3_DXVA2_HWACCEL 0
@@ -1493,7 +1549,9 @@
 #define CONFIG_DVDSUB_PARSER 0
 #define CONFIG_DVD_NAV_PARSER 0
 #define CONFIG_FLAC_PARSER 1
+#define CONFIG_G723_1_PARSER 0
 #define CONFIG_G729_PARSER 0
+#define CONFIG_GIF_PARSER 0
 #define CONFIG_GSM_PARSER 0
 #define CONFIG_H261_PARSER 0
 #define CONFIG_H263_PARSER 0
@@ -1517,13 +1575,13 @@
 #define CONFIG_VP3_PARSER 1
 #define CONFIG_VP8_PARSER 1
 #define CONFIG_VP9_PARSER 0
+#define CONFIG_WEBP_PARSER 0
 #define CONFIG_XMA_PARSER 0
 #define CONFIG_ALSA_INDEV 0
 #define CONFIG_ANDROID_CAMERA_INDEV 0
 #define CONFIG_AVFOUNDATION_INDEV 0
 #define CONFIG_BKTR_INDEV 0
 #define CONFIG_DECKLINK_INDEV 0
-#define CONFIG_LIBNDI_NEWTEK_INDEV 0
 #define CONFIG_DSHOW_INDEV 0
 #define CONFIG_FBDEV_INDEV 0
 #define CONFIG_GDIGRAB_INDEV 0
@@ -1543,7 +1601,6 @@
 #define CONFIG_ALSA_OUTDEV 0
 #define CONFIG_CACA_OUTDEV 0
 #define CONFIG_DECKLINK_OUTDEV 0
-#define CONFIG_LIBNDI_NEWTEK_OUTDEV 0
 #define CONFIG_FBDEV_OUTDEV 0
 #define CONFIG_OPENGL_OUTDEV 0
 #define CONFIG_OSS_OUTDEV 0
@@ -1584,6 +1641,8 @@
 #define CONFIG_AMIX_FILTER 0
 #define CONFIG_AMULTIPLY_FILTER 0
 #define CONFIG_ANEQUALIZER_FILTER 0
+#define CONFIG_ANLMDN_FILTER 0
+#define CONFIG_ANLMS_FILTER 0
 #define CONFIG_ANULL_FILTER 0
 #define CONFIG_APAD_FILTER 0
 #define CONFIG_APERMS_FILTER 0
@@ -1592,6 +1651,7 @@
 #define CONFIG_AREALTIME_FILTER 0
 #define CONFIG_ARESAMPLE_FILTER 0
 #define CONFIG_AREVERSE_FILTER 0
+#define CONFIG_ARNNDN_FILTER 0
 #define CONFIG_ASELECT_FILTER 0
 #define CONFIG_ASENDCMD_FILTER 0
 #define CONFIG_ASETNSAMPLES_FILTER 0
@@ -1600,17 +1660,21 @@
 #define CONFIG_ASETTB_FILTER 0
 #define CONFIG_ASHOWINFO_FILTER 0
 #define CONFIG_ASIDEDATA_FILTER 0
+#define CONFIG_ASOFTCLIP_FILTER 0
 #define CONFIG_ASPLIT_FILTER 0
+#define CONFIG_ASR_FILTER 0
 #define CONFIG_ASTATS_FILTER 0
 #define CONFIG_ASTREAMSELECT_FILTER 0
 #define CONFIG_ATEMPO_FILTER 0
 #define CONFIG_ATRIM_FILTER 0
+#define CONFIG_AXCORRELATE_FILTER 0
 #define CONFIG_AZMQ_FILTER 0
 #define CONFIG_BANDPASS_FILTER 0
 #define CONFIG_BANDREJECT_FILTER 0
 #define CONFIG_BASS_FILTER 0
 #define CONFIG_BIQUAD_FILTER 0
 #define CONFIG_BS2B_FILTER 0
+#define CONFIG_CHROMABER_VULKAN_FILTER 0
 #define CONFIG_CHANNELMAP_FILTER 0
 #define CONFIG_CHANNELSPLIT_FILTER 0
 #define CONFIG_CHORUS_FILTER 0
@@ -1619,6 +1683,7 @@
 #define CONFIG_CROSSFEED_FILTER 0
 #define CONFIG_CRYSTALIZER_FILTER 0
 #define CONFIG_DCSHIFT_FILTER 0
+#define CONFIG_DEESSER_FILTER 0
 #define CONFIG_DRMETER_FILTER 0
 #define CONFIG_DYNAUDNORM_FILTER 0
 #define CONFIG_EARWAX_FILTER 0
@@ -1658,12 +1723,15 @@
 #define CONFIG_VOLUME_FILTER 0
 #define CONFIG_VOLUMEDETECT_FILTER 0
 #define CONFIG_AEVALSRC_FILTER 0
+#define CONFIG_AFIRSRC_FILTER 0
 #define CONFIG_ANOISESRC_FILTER 0
 #define CONFIG_ANULLSRC_FILTER 0
 #define CONFIG_FLITE_FILTER 0
 #define CONFIG_HILBERT_FILTER 0
+#define CONFIG_SINC_FILTER 0
 #define CONFIG_SINE_FILTER 0
 #define CONFIG_ANULLSINK_FILTER 0
+#define CONFIG_ADDROI_FILTER 0
 #define CONFIG_ALPHAEXTRACT_FILTER 0
 #define CONFIG_ALPHAMERGE_FILTER 0
 #define CONFIG_AMPLIFY_FILTER 0
@@ -1671,8 +1739,10 @@
 #define CONFIG_ATADENOISE_FILTER 0
 #define CONFIG_AVGBLUR_FILTER 0
 #define CONFIG_AVGBLUR_OPENCL_FILTER 0
+#define CONFIG_AVGBLUR_VULKAN_FILTER 0
 #define CONFIG_BBOX_FILTER 0
 #define CONFIG_BENCH_FILTER 0
+#define CONFIG_BILATERAL_FILTER 0
 #define CONFIG_BITPLANENOISE_FILTER 0
 #define CONFIG_BLACKDETECT_FILTER 0
 #define CONFIG_BLACKFRAME_FILTER 0
@@ -1681,12 +1751,17 @@
 #define CONFIG_BOXBLUR_FILTER 0
 #define CONFIG_BOXBLUR_OPENCL_FILTER 0
 #define CONFIG_BWDIF_FILTER 0
+#define CONFIG_CAS_FILTER 0
+#define CONFIG_CHROMAHOLD_FILTER 0
 #define CONFIG_CHROMAKEY_FILTER 0
+#define CONFIG_CHROMASHIFT_FILTER 0
 #define CONFIG_CIESCOPE_FILTER 0
 #define CONFIG_CODECVIEW_FILTER 0
 #define CONFIG_COLORBALANCE_FILTER 0
 #define CONFIG_COLORCHANNELMIXER_FILTER 0
 #define CONFIG_COLORKEY_FILTER 0
+#define CONFIG_COLORKEY_OPENCL_FILTER 0
+#define CONFIG_COLORHOLD_FILTER 0
 #define CONFIG_COLORLEVELS_FILTER 0
 #define CONFIG_COLORMATRIX_FILTER 0
 #define CONFIG_COLORSPACE_FILTER 0
@@ -1706,6 +1781,7 @@
 #define CONFIG_DEBLOCK_FILTER 0
 #define CONFIG_DECIMATE_FILTER 0
 #define CONFIG_DECONVOLVE_FILTER 0
+#define CONFIG_DEDOT_FILTER 0
 #define CONFIG_DEFLATE_FILTER 0
 #define CONFIG_DEFLICKER_FILTER 0
 #define CONFIG_DEINTERLACE_QSV_FILTER 0
@@ -1713,12 +1789,15 @@
 #define CONFIG_DEJUDDER_FILTER 0
 #define CONFIG_DELOGO_FILTER 0
 #define CONFIG_DENOISE_VAAPI_FILTER 0
+#define CONFIG_DERAIN_FILTER 0
 #define CONFIG_DESHAKE_FILTER 0
+#define CONFIG_DESHAKE_OPENCL_FILTER 0
 #define CONFIG_DESPILL_FILTER 0
 #define CONFIG_DETELECINE_FILTER 0
 #define CONFIG_DILATION_FILTER 0
 #define CONFIG_DILATION_OPENCL_FILTER 0
 #define CONFIG_DISPLACE_FILTER 0
+#define CONFIG_DNN_PROCESSING_FILTER 0
 #define CONFIG_DOUBLEWEAVE_FILTER 0
 #define CONFIG_DRAWBOX_FILTER 0
 #define CONFIG_DRAWGRAPH_FILTER 0
@@ -1746,11 +1825,14 @@
 #define CONFIG_FRAMEPACK_FILTER 0
 #define CONFIG_FRAMERATE_FILTER 0
 #define CONFIG_FRAMESTEP_FILTER 0
+#define CONFIG_FREEZEDETECT_FILTER 0
+#define CONFIG_FREEZEFRAMES_FILTER 0
 #define CONFIG_FREI0R_FILTER 0
 #define CONFIG_FSPP_FILTER 0
 #define CONFIG_GBLUR_FILTER 0
 #define CONFIG_GEQ_FILTER 0
 #define CONFIG_GRADFUN_FILTER 0
+#define CONFIG_GRAPHMONITOR_FILTER 0
 #define CONFIG_GREYEDGE_FILTER 0
 #define CONFIG_HALDCLUT_FILTER 0
 #define CONFIG_HFLIP_FILTER 0
@@ -1771,6 +1853,7 @@
 #define CONFIG_INTERLACE_FILTER 0
 #define CONFIG_INTERLEAVE_FILTER 0
 #define CONFIG_KERNDEINT_FILTER 0
+#define CONFIG_LAGFUN_FILTER 0
 #define CONFIG_LENSCORRECTION_FILTER 0
 #define CONFIG_LENSFUN_FILTER 0
 #define CONFIG_LIBVMAF_FILTER 0
@@ -1784,8 +1867,13 @@
 #define CONFIG_LUTRGB_FILTER 0
 #define CONFIG_LUTYUV_FILTER 0
 #define CONFIG_MASKEDCLAMP_FILTER 0
+#define CONFIG_MASKEDMAX_FILTER 0
 #define CONFIG_MASKEDMERGE_FILTER 0
+#define CONFIG_MASKEDMIN_FILTER 0
+#define CONFIG_MASKEDTHRESHOLD_FILTER 0
+#define CONFIG_MASKFUN_FILTER 0
 #define CONFIG_MCDEINT_FILTER 0
+#define CONFIG_MEDIAN_FILTER 0
 #define CONFIG_MERGEPLANES_FILTER 0
 #define CONFIG_MESTIMATE_FILTER 0
 #define CONFIG_METADATA_FILTER 0
@@ -1795,6 +1883,7 @@
 #define CONFIG_MPDECIMATE_FILTER 0
 #define CONFIG_NEGATE_FILTER 0
 #define CONFIG_NLMEANS_FILTER 0
+#define CONFIG_NLMEANS_OPENCL_FILTER 0
 #define CONFIG_NNEDI_FILTER 0
 #define CONFIG_NOFORMAT_FILTER 0
 #define CONFIG_NOISE_FILTER 0
@@ -1806,13 +1895,17 @@
 #define CONFIG_OVERLAY_FILTER 0
 #define CONFIG_OVERLAY_OPENCL_FILTER 0
 #define CONFIG_OVERLAY_QSV_FILTER 0
+#define CONFIG_OVERLAY_VULKAN_FILTER 0
+#define CONFIG_OVERLAY_CUDA_FILTER 0
 #define CONFIG_OWDENOISE_FILTER 0
 #define CONFIG_PAD_FILTER 0
+#define CONFIG_PAD_OPENCL_FILTER 0
 #define CONFIG_PALETTEGEN_FILTER 0
 #define CONFIG_PALETTEUSE_FILTER 0
 #define CONFIG_PERMS_FILTER 0
 #define CONFIG_PERSPECTIVE_FILTER 0
 #define CONFIG_PHASE_FILTER 0
+#define CONFIG_PHOTOSENSITIVITY_FILTER 0
 #define CONFIG_PIXDESCTEST_FILTER 0
 #define CONFIG_PIXSCOPE_FILTER 0
 #define CONFIG_PP_FILTER 0
@@ -1835,6 +1928,7 @@
 #define CONFIG_REMOVELOGO_FILTER 0
 #define CONFIG_REPEATFIELDS_FILTER 0
 #define CONFIG_REVERSE_FILTER 0
+#define CONFIG_RGBASHIFT_FILTER 0
 #define CONFIG_ROBERTS_FILTER 0
 #define CONFIG_ROBERTS_OPENCL_FILTER 0
 #define CONFIG_ROTATE_FILTER 0
@@ -1844,13 +1938,16 @@
 #define CONFIG_SCALE_NPP_FILTER 0
 #define CONFIG_SCALE_QSV_FILTER 0
 #define CONFIG_SCALE_VAAPI_FILTER 0
+#define CONFIG_SCALE_VULKAN_FILTER 0
 #define CONFIG_SCALE2REF_FILTER 0
+#define CONFIG_SCROLL_FILTER 0
 #define CONFIG_SELECT_FILTER 0
 #define CONFIG_SELECTIVECOLOR_FILTER 0
 #define CONFIG_SENDCMD_FILTER 0
 #define CONFIG_SEPARATEFIELDS_FILTER 0
 #define CONFIG_SETDAR_FILTER 0
 #define CONFIG_SETFIELD_FILTER 0
+#define CONFIG_SETPARAMS_FILTER 0
 #define CONFIG_SETPTS_FILTER 0
 #define CONFIG_SETRANGE_FILTER 0
 #define CONFIG_SETSAR_FILTER 0
@@ -1878,26 +1975,34 @@
 #define CONFIG_SWAPUV_FILTER 0
 #define CONFIG_TBLEND_FILTER 0
 #define CONFIG_TELECINE_FILTER 0
+#define CONFIG_THISTOGRAM_FILTER 0
 #define CONFIG_THRESHOLD_FILTER 0
 #define CONFIG_THUMBNAIL_FILTER 0
 #define CONFIG_THUMBNAIL_CUDA_FILTER 0
 #define CONFIG_TILE_FILTER 0
 #define CONFIG_TINTERLACE_FILTER 0
 #define CONFIG_TLUT2_FILTER 0
+#define CONFIG_TMEDIAN_FILTER 0
 #define CONFIG_TMIX_FILTER 0
 #define CONFIG_TONEMAP_FILTER 0
 #define CONFIG_TONEMAP_OPENCL_FILTER 0
+#define CONFIG_TONEMAP_VAAPI_FILTER 0
+#define CONFIG_TPAD_FILTER 0
 #define CONFIG_TRANSPOSE_FILTER 0
 #define CONFIG_TRANSPOSE_NPP_FILTER 0
+#define CONFIG_TRANSPOSE_OPENCL_FILTER 0
+#define CONFIG_TRANSPOSE_VAAPI_FILTER 0
 #define CONFIG_TRIM_FILTER 0
 #define CONFIG_UNPREMULTIPLY_FILTER 0
 #define CONFIG_UNSHARP_FILTER 0
 #define CONFIG_UNSHARP_OPENCL_FILTER 0
 #define CONFIG_USPP_FILTER 0
+#define CONFIG_V360_FILTER 0
 #define CONFIG_VAGUEDENOISER_FILTER 0
 #define CONFIG_VECTORSCOPE_FILTER 0
 #define CONFIG_VFLIP_FILTER 0
 #define CONFIG_VFRDET_FILTER 0
+#define CONFIG_VIBRANCE_FILTER 0
 #define CONFIG_VIDSTABDETECT_FILTER 0
 #define CONFIG_VIDSTABTRANSFORM_FILTER 0
 #define CONFIG_VIGNETTE_FILTER 0
@@ -1908,7 +2013,13 @@
 #define CONFIG_WAVEFORM_FILTER 0
 #define CONFIG_WEAVE_FILTER 0
 #define CONFIG_XBR_FILTER 0
+#define CONFIG_XFADE_FILTER 0
+#define CONFIG_XFADE_OPENCL_FILTER 0
+#define CONFIG_XMEDIAN_FILTER 0
+#define CONFIG_XSTACK_FILTER 0
 #define CONFIG_YADIF_FILTER 0
+#define CONFIG_YADIF_CUDA_FILTER 0
+#define CONFIG_YAEPBLUR_FILTER 0
 #define CONFIG_ZMQ_FILTER 0
 #define CONFIG_ZOOMPAN_FILTER 0
 #define CONFIG_ZSCALE_FILTER 0
@@ -1927,6 +2038,7 @@
 #define CONFIG_PAL75BARS_FILTER 0
 #define CONFIG_PAL100BARS_FILTER 0
 #define CONFIG_RGBTESTSRC_FILTER 0
+#define CONFIG_SIERPINSKI_FILTER 0
 #define CONFIG_SMPTEBARS_FILTER 0
 #define CONFIG_SMPTEHDBARS_FILTER 0
 #define CONFIG_TESTSRC_FILTER 0
@@ -1935,12 +2047,14 @@
 #define CONFIG_NULLSINK_FILTER 0
 #define CONFIG_ABITSCOPE_FILTER 0
 #define CONFIG_ADRAWGRAPH_FILTER 0
+#define CONFIG_AGRAPHMONITOR_FILTER 0
 #define CONFIG_AHISTOGRAM_FILTER 0
 #define CONFIG_APHASEMETER_FILTER 0
 #define CONFIG_AVECTORSCOPE_FILTER 0
 #define CONFIG_CONCAT_FILTER 0
 #define CONFIG_SHOWCQT_FILTER 0
 #define CONFIG_SHOWFREQS_FILTER 0
+#define CONFIG_SHOWSPATIAL_FILTER 0
 #define CONFIG_SHOWSPECTRUM_FILTER 0
 #define CONFIG_SHOWSPECTRUMPIC_FILTER 0
 #define CONFIG_SHOWVOLUME_FILTER 0
@@ -1964,21 +2078,25 @@
 #define CONFIG_AFC_DEMUXER 0
 #define CONFIG_AIFF_DEMUXER 0
 #define CONFIG_AIX_DEMUXER 0
+#define CONFIG_ALP_DEMUXER 0
 #define CONFIG_AMR_DEMUXER 0
 #define CONFIG_AMRNB_DEMUXER 0
 #define CONFIG_AMRWB_DEMUXER 0
 #define CONFIG_ANM_DEMUXER 0
 #define CONFIG_APC_DEMUXER 0
 #define CONFIG_APE_DEMUXER 0
+#define CONFIG_APM_DEMUXER 0
 #define CONFIG_APNG_DEMUXER 0
 #define CONFIG_APTX_DEMUXER 0
 #define CONFIG_APTX_HD_DEMUXER 0
 #define CONFIG_AQTITLE_DEMUXER 0
+#define CONFIG_ARGO_ASF_DEMUXER 0
 #define CONFIG_ASF_DEMUXER 0
 #define CONFIG_ASF_O_DEMUXER 0
 #define CONFIG_ASS_DEMUXER 0
 #define CONFIG_AST_DEMUXER 0
 #define CONFIG_AU_DEMUXER 0
+#define CONFIG_AV1_DEMUXER 0
 #define CONFIG_AVI_DEMUXER 0
 #define CONFIG_AVISYNTH_DEMUXER 0
 #define CONFIG_AVR_DEMUXER 0
@@ -2006,7 +2124,9 @@
 #define CONFIG_DATA_DEMUXER 0
 #define CONFIG_DAUD_DEMUXER 0
 #define CONFIG_DCSTR_DEMUXER 0
+#define CONFIG_DERF_DEMUXER 0
 #define CONFIG_DFA_DEMUXER 0
+#define CONFIG_DHAV_DEMUXER 0
 #define CONFIG_DIRAC_DEMUXER 0
 #define CONFIG_DNXHD_DEMUXER 0
 #define CONFIG_DSF_DEMUXER 0
@@ -2032,6 +2152,7 @@
 #define CONFIG_FOURXM_DEMUXER 0
 #define CONFIG_FRM_DEMUXER 0
 #define CONFIG_FSB_DEMUXER 0
+#define CONFIG_FWSE_DEMUXER 0
 #define CONFIG_G722_DEMUXER 0
 #define CONFIG_G723_1_DEMUXER 0
 #define CONFIG_G726_DEMUXER 0
@@ -2045,6 +2166,8 @@
 #define CONFIG_H261_DEMUXER 0
 #define CONFIG_H263_DEMUXER 0
 #define CONFIG_H264_DEMUXER 0
+#define CONFIG_HCA_DEMUXER 0
+#define CONFIG_HCOM_DEMUXER 0
 #define CONFIG_HEVC_DEMUXER 0
 #define CONFIG_HLS_DEMUXER 0
 #define CONFIG_HNM_DEMUXER 0
@@ -2052,6 +2175,7 @@
 #define CONFIG_IDCIN_DEMUXER 0
 #define CONFIG_IDF_DEMUXER 0
 #define CONFIG_IFF_DEMUXER 0
+#define CONFIG_IFV_DEMUXER 0
 #define CONFIG_ILBC_DEMUXER 0
 #define CONFIG_IMAGE2_DEMUXER 0
 #define CONFIG_IMAGE2PIPE_DEMUXER 0
@@ -2066,6 +2190,8 @@
 #define CONFIG_IVR_DEMUXER 0
 #define CONFIG_JACOSUB_DEMUXER 0
 #define CONFIG_JV_DEMUXER 0
+#define CONFIG_KUX_DEMUXER 0
+#define CONFIG_KVAG_DEMUXER 0
 #define CONFIG_LMLM4_DEMUXER 0
 #define CONFIG_LOAS_DEMUXER 0
 #define CONFIG_LRC_DEMUXER 0
@@ -2112,6 +2238,7 @@
 #define CONFIG_PAF_DEMUXER 0
 #define CONFIG_PCM_ALAW_DEMUXER 0
 #define CONFIG_PCM_MULAW_DEMUXER 0
+#define CONFIG_PCM_VIDC_DEMUXER 0
 #define CONFIG_PCM_F64BE_DEMUXER 0
 #define CONFIG_PCM_F64LE_DEMUXER 0
 #define CONFIG_PCM_F32BE_DEMUXER 0
@@ -2192,6 +2319,7 @@
 #define CONFIG_VAG_DEMUXER 0
 #define CONFIG_VC1_DEMUXER 0
 #define CONFIG_VC1T_DEMUXER 0
+#define CONFIG_VIVIDAS_DEMUXER 0
 #define CONFIG_VIVO_DEMUXER 0
 #define CONFIG_VMD_DEMUXER 0
 #define CONFIG_VOBSUB_DEMUXER 0
@@ -2221,6 +2349,7 @@
 #define CONFIG_IMAGE_DDS_PIPE_DEMUXER 0
 #define CONFIG_IMAGE_DPX_PIPE_DEMUXER 0
 #define CONFIG_IMAGE_EXR_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_GIF_PIPE_DEMUXER 0
 #define CONFIG_IMAGE_J2K_PIPE_DEMUXER 0
 #define CONFIG_IMAGE_JPEG_PIPE_DEMUXER 0
 #define CONFIG_IMAGE_JPEGLS_PIPE_DEMUXER 0
@@ -2345,6 +2474,7 @@
 #define CONFIG_OPUS_MUXER 0
 #define CONFIG_PCM_ALAW_MUXER 0
 #define CONFIG_PCM_MULAW_MUXER 0
+#define CONFIG_PCM_VIDC_MUXER 0
 #define CONFIG_PCM_F64BE_MUXER 0
 #define CONFIG_PCM_F64LE_MUXER 0
 #define CONFIG_PCM_F32BE_MUXER 0
@@ -2384,6 +2514,7 @@
 #define CONFIG_SPX_MUXER 0
 #define CONFIG_SPDIF_MUXER 0
 #define CONFIG_SRT_MUXER 0
+#define CONFIG_STREAMHASH_MUXER 0
 #define CONFIG_SUP_MUXER 0
 #define CONFIG_SWF_MUXER 0
 #define CONFIG_TEE_MUXER 0
@@ -2444,6 +2575,7 @@
 #define CONFIG_UDP_PROTOCOL 0
 #define CONFIG_UDPLITE_PROTOCOL 0
 #define CONFIG_UNIX_PROTOCOL 0
+#define CONFIG_LIBAMQP_PROTOCOL 0
 #define CONFIG_LIBRTMP_PROTOCOL 0
 #define CONFIG_LIBRTMPE_PROTOCOL 0
 #define CONFIG_LIBRTMPS_PROTOCOL 0
@@ -2452,4 +2584,5 @@
 #define CONFIG_LIBSRT_PROTOCOL 0
 #define CONFIG_LIBSSH_PROTOCOL 0
 #define CONFIG_LIBSMBCLIENT_PROTOCOL 0
+#define CONFIG_LIBZMQ_PROTOCOL 0
 #endif /* FFMPEG_CONFIG_H */
diff --git a/fuchsia/config/default/arm64/libavutil/ffversion.h b/fuchsia/config/default/arm64/libavutil/ffversion.h
index 4585957..fc76199 100644
--- a/fuchsia/config/default/arm64/libavutil/ffversion.h
+++ b/fuchsia/config/default/arm64/libavutil/ffversion.h
@@ -1,5 +1,5 @@
 /* Automatically generated by version.sh, do not manually edit! */
 #ifndef AVUTIL_FFVERSION_H
 #define AVUTIL_FFVERSION_H
-#define FFMPEG_VERSION "N-92369-g2e9f4ad959"
+#define FFMPEG_VERSION "N-97662-gaaac2c26d9"
 #endif /* AVUTIL_FFVERSION_H */
diff --git a/fuchsia/config/default/x64/config.asm b/fuchsia/config/default/x64/config.asm
index af8a4be..46239d0 100644
--- a/fuchsia/config/default/x64/config.asm
+++ b/fuchsia/config/default/x64/config.asm
@@ -65,6 +65,7 @@
 %define HAVE_MIPSDSP 0
 %define HAVE_MIPSDSPR2 0
 %define HAVE_MSA 0
+%define HAVE_MSA2 0
 %define HAVE_LOONGSON2 0
 %define HAVE_LOONGSON3 0
 %define HAVE_MMI 0
@@ -110,6 +111,7 @@
 %define HAVE_MIPSDSP_EXTERNAL 0
 %define HAVE_MIPSDSPR2_EXTERNAL 0
 %define HAVE_MSA_EXTERNAL 0
+%define HAVE_MSA2_EXTERNAL 0
 %define HAVE_LOONGSON2_EXTERNAL 0
 %define HAVE_LOONGSON3_EXTERNAL 0
 %define HAVE_MMI_EXTERNAL 0
@@ -155,6 +157,7 @@
 %define HAVE_MIPSDSP_INLINE 0
 %define HAVE_MIPSDSPR2_INLINE 0
 %define HAVE_MSA_INLINE 0
+%define HAVE_MSA2_INLINE 0
 %define HAVE_LOONGSON2_INLINE 0
 %define HAVE_LOONGSON3_INLINE 0
 %define HAVE_MMI_INLINE 0
@@ -265,10 +268,12 @@
 %define HAVE_GETADDRINFO 0
 %define HAVE_GETHRTIME 0
 %define HAVE_GETOPT 1
+%define HAVE_GETMODULEHANDLE 0
 %define HAVE_GETPROCESSAFFINITYMASK 0
 %define HAVE_GETPROCESSMEMORYINFO 0
 %define HAVE_GETPROCESSTIMES 0
 %define HAVE_GETRUSAGE 1
+%define HAVE_GETSTDHANDLE 0
 %define HAVE_GETSYSTEMTIMEASFILETIME 0
 %define HAVE_GETTIMEOFDAY 1
 %define HAVE_GLOB 1
@@ -294,6 +299,7 @@
 %define HAVE_SECITEMIMPORT 0
 %define HAVE_SETCONSOLETEXTATTRIBUTE 0
 %define HAVE_SETCONSOLECTRLHANDLER 0
+%define HAVE_SETDLLDIRECTORY 0
 %define HAVE_SETMODE 0
 %define HAVE_SETRLIMIT 1
 %define HAVE_SLEEP 0
@@ -334,6 +340,10 @@
 %define HAVE_XFORM_ASM 0
 %define HAVE_XMM_CLOBBERS 1
 %define HAVE_KCMVIDEOCODECTYPE_HEVC 0
+%define HAVE_KCVPIXELFORMATTYPE_420YPCBCR10BIPLANARVIDEORANGE 0
+%define HAVE_KCVIMAGEBUFFERTRANSFERFUNCTION_SMPTE_ST_2084_PQ 0
+%define HAVE_KCVIMAGEBUFFERTRANSFERFUNCTION_ITU_R_2100_HLG 0
+%define HAVE_KCVIMAGEBUFFERTRANSFERFUNCTION_LINEAR 0
 %define HAVE_SOCKLEN_T 0
 %define HAVE_STRUCT_ADDRINFO 0
 %define HAVE_STRUCT_GROUP_SOURCE_REQ 0
@@ -347,7 +357,7 @@
 %define HAVE_STRUCT_SOCKADDR_SA_LEN 0
 %define HAVE_STRUCT_SOCKADDR_STORAGE 0
 %define HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC 1
-%define HAVE_STRUCT_V4L2_FRMIVALENUM_DISCRETE 1
+%define HAVE_STRUCT_V4L2_FRMIVALENUM_DISCRETE 0
 %define HAVE_MAKEINFO 0
 %define HAVE_MAKEINFO_HTML 0
 %define HAVE_OPENCL_D3D11 0
@@ -364,7 +374,7 @@
 %define CONFIG_MANPAGES 0
 %define CONFIG_PODPAGES 0
 %define CONFIG_TXTPAGES 0
-%define CONFIG_AVIO_DIR_CMD_EXAMPLE 1
+%define CONFIG_AVIO_LIST_DIR_EXAMPLE 1
 %define CONFIG_AVIO_READING_EXAMPLE 1
 %define CONFIG_DECODE_AUDIO_EXAMPLE 1
 %define CONFIG_DECODE_VIDEO_EXAMPLE 1
@@ -399,11 +409,11 @@
 %define CONFIG_LIBXAVS2 0
 %define CONFIG_LIBXVID 0
 %define CONFIG_DECKLINK 0
-%define CONFIG_LIBNDI_NEWTEK 0
 %define CONFIG_LIBFDK_AAC 0
 %define CONFIG_OPENSSL 0
 %define CONFIG_LIBTLS 0
 %define CONFIG_GMP 0
+%define CONFIG_LIBARIBB24 0
 %define CONFIG_LIBLENSFUN 0
 %define CONFIG_LIBOPENCORE_AMRNB 0
 %define CONFIG_LIBOPENCORE_AMRWB 0
@@ -424,12 +434,14 @@
 %define CONFIG_LIBCACA 0
 %define CONFIG_LIBCELT 0
 %define CONFIG_LIBCODEC2 0
+%define CONFIG_LIBDAV1D 0
 %define CONFIG_LIBDC1394 0
 %define CONFIG_LIBDRM 0
 %define CONFIG_LIBFLITE 0
 %define CONFIG_LIBFONTCONFIG 0
 %define CONFIG_LIBFREETYPE 0
 %define CONFIG_LIBFRIBIDI 0
+%define CONFIG_LIBGLSLANG 0
 %define CONFIG_LIBGME 0
 %define CONFIG_LIBGSM 0
 %define CONFIG_LIBIEC61883 0
@@ -446,6 +458,8 @@
 %define CONFIG_LIBOPENMPT 0
 %define CONFIG_LIBOPUS 1
 %define CONFIG_LIBPULSE 0
+%define CONFIG_LIBRABBITMQ 0
+%define CONFIG_LIBRAV1E 0
 %define CONFIG_LIBRSVG 0
 %define CONFIG_LIBRTMP 0
 %define CONFIG_LIBSHINE 0
@@ -472,6 +486,7 @@
 %define CONFIG_MEDIACODEC 0
 %define CONFIG_OPENAL 0
 %define CONFIG_OPENGL 0
+%define CONFIG_POCKETSPHINX 0
 %define CONFIG_VAPOURSYNTH 0
 %define CONFIG_ALSA 0
 %define CONFIG_APPKIT 0
@@ -490,16 +505,19 @@
 %define CONFIG_SNDIO 0
 %define CONFIG_XLIB 0
 %define CONFIG_ZLIB 0
+%define CONFIG_CUDA_NVCC 0
 %define CONFIG_CUDA_SDK 0
 %define CONFIG_LIBNPP 0
 %define CONFIG_LIBMFX 0
 %define CONFIG_MMAL 0
 %define CONFIG_OMX 0
 %define CONFIG_OPENCL 0
+%define CONFIG_VULKAN 0
 %define CONFIG_AMF 0
 %define CONFIG_AUDIOTOOLBOX 0
 %define CONFIG_CRYSTALHD 0
 %define CONFIG_CUDA 0
+%define CONFIG_CUDA_LLVM 0
 %define CONFIG_CUVID 0
 %define CONFIG_D3D11VA 0
 %define CONFIG_DXVA2 0
@@ -550,6 +568,7 @@
 %define CONFIG_RDFT 1
 %define CONFIG_AUTODETECT 0
 %define CONFIG_FONTCONFIG 0
+%define CONFIG_LARGE_TESTS 1
 %define CONFIG_LINUX_PERF 0
 %define CONFIG_MEMORY_POISONING 0
 %define CONFIG_NEON_CLOBBER_TEST 0
@@ -642,6 +661,7 @@
 %define CONFIG_RTPDEC 0
 %define CONFIG_RTPENC_CHAIN 0
 %define CONFIG_RV34DSP 0
+%define CONFIG_SCENE_SAD 0
 %define CONFIG_SINEWIN 0
 %define CONFIG_SNAPPY 0
 %define CONFIG_SRTP 0
@@ -659,6 +679,8 @@
 %define CONFIG_WMA_FREQS 0
 %define CONFIG_WMV2DSP 0
 %define CONFIG_AAC_ADTSTOASC_BSF 0
+%define CONFIG_AV1_FRAME_MERGE_BSF 0
+%define CONFIG_AV1_FRAME_SPLIT_BSF 0
 %define CONFIG_AV1_METADATA_BSF 0
 %define CONFIG_CHOMP_BSF 0
 %define CONFIG_DUMP_EXTRADATA_BSF 0
@@ -681,9 +703,11 @@
 %define CONFIG_MOV2TEXTSUB_BSF 0
 %define CONFIG_NOISE_BSF 0
 %define CONFIG_NULL_BSF 1
+%define CONFIG_PRORES_METADATA_BSF 0
 %define CONFIG_REMOVE_EXTRADATA_BSF 0
 %define CONFIG_TEXT2MOVSUB_BSF 0
 %define CONFIG_TRACE_HEADERS_BSF 0
+%define CONFIG_TRUEHD_CORE_BSF 0
 %define CONFIG_VP9_METADATA_BSF 0
 %define CONFIG_VP9_RAW_REORDER_BSF 0
 %define CONFIG_VP9_SUPERFRAME_BSF 0
@@ -691,10 +715,12 @@
 %define CONFIG_AASC_DECODER 0
 %define CONFIG_AIC_DECODER 0
 %define CONFIG_ALIAS_PIX_DECODER 0
+%define CONFIG_AGM_DECODER 0
 %define CONFIG_AMV_DECODER 0
 %define CONFIG_ANM_DECODER 0
 %define CONFIG_ANSI_DECODER 0
 %define CONFIG_APNG_DECODER 0
+%define CONFIG_ARBC_DECODER 0
 %define CONFIG_ASV1_DECODER 0
 %define CONFIG_ASV2_DECODER 0
 %define CONFIG_AURA_DECODER 0
@@ -714,6 +740,7 @@
 %define CONFIG_C93_DECODER 0
 %define CONFIG_CAVS_DECODER 0
 %define CONFIG_CDGRAPHICS_DECODER 0
+%define CONFIG_CDTOONS_DECODER 0
 %define CONFIG_CDXL_DECODER 0
 %define CONFIG_CFHD_DECODER 0
 %define CONFIG_CINEPAK_DECODER 0
@@ -782,9 +809,11 @@
 %define CONFIG_HQ_HQA_DECODER 0
 %define CONFIG_HQX_DECODER 0
 %define CONFIG_HUFFYUV_DECODER 0
+%define CONFIG_HYMT_DECODER 0
 %define CONFIG_IDCIN_DECODER 0
 %define CONFIG_IFF_ILBM_DECODER 0
 %define CONFIG_IMM4_DECODER 0
+%define CONFIG_IMM5_DECODER 0
 %define CONFIG_INDEO2_DECODER 0
 %define CONFIG_INDEO3_DECODER 0
 %define CONFIG_INDEO4_DECODER 0
@@ -797,6 +826,7 @@
 %define CONFIG_KMVC_DECODER 0
 %define CONFIG_LAGARITH_DECODER 0
 %define CONFIG_LOCO_DECODER 0
+%define CONFIG_LSCR_DECODER 0
 %define CONFIG_M101_DECODER 0
 %define CONFIG_MAGICYUV_DECODER 0
 %define CONFIG_MDEC_DECODER 0
@@ -830,8 +860,11 @@
 %define CONFIG_MSVIDEO1_DECODER 0
 %define CONFIG_MSZH_DECODER 0
 %define CONFIG_MTS2_DECODER 0
+%define CONFIG_MV30_DECODER 0
 %define CONFIG_MVC1_DECODER 0
 %define CONFIG_MVC2_DECODER 0
+%define CONFIG_MVDV_DECODER 0
+%define CONFIG_MVHA_DECODER 0
 %define CONFIG_MWSC_DECODER 0
 %define CONFIG_MXPEG_DECODER 0
 %define CONFIG_NUV_DECODER 0
@@ -868,7 +901,6 @@
 %define CONFIG_SANM_DECODER 0
 %define CONFIG_SCPR_DECODER 0
 %define CONFIG_SCREENPRESSO_DECODER 0
-%define CONFIG_SDX2_DPCM_DECODER 0
 %define CONFIG_SGI_DECODER 0
 %define CONFIG_SGIRLE_DECODER 0
 %define CONFIG_SHEERVIDEO_DECODER 0
@@ -915,6 +947,7 @@
 %define CONFIG_VMDVIDEO_DECODER 0
 %define CONFIG_VMNC_DECODER 0
 %define CONFIG_VP3_DECODER 1
+%define CONFIG_VP4_DECODER 0
 %define CONFIG_VP5_DECODER 0
 %define CONFIG_VP6_DECODER 0
 %define CONFIG_VP6A_DECODER 0
@@ -956,6 +989,7 @@
 %define CONFIG_AAC_LATM_DECODER 0
 %define CONFIG_AC3_DECODER 0
 %define CONFIG_AC3_FIXED_DECODER 0
+%define CONFIG_ACELP_KELVIN_DECODER 0
 %define CONFIG_ALAC_DECODER 0
 %define CONFIG_ALS_DECODER 0
 %define CONFIG_AMRNB_DECODER 0
@@ -990,6 +1024,8 @@
 %define CONFIG_G729_DECODER 0
 %define CONFIG_GSM_DECODER 0
 %define CONFIG_GSM_MS_DECODER 0
+%define CONFIG_HCA_DECODER 0
+%define CONFIG_HCOM_DECODER 0
 %define CONFIG_IAC_DECODER 0
 %define CONFIG_ILBC_DECODER 0
 %define CONFIG_IMC_DECODER 0
@@ -1023,6 +1059,7 @@
 %define CONFIG_SBC_DECODER 1
 %define CONFIG_SHORTEN_DECODER 0
 %define CONFIG_SIPR_DECODER 0
+%define CONFIG_SIREN_DECODER 0
 %define CONFIG_SMACKAUD_DECODER 0
 %define CONFIG_SONIC_DECODER 0
 %define CONFIG_TAK_DECODER 0
@@ -1074,16 +1111,20 @@
 %define CONFIG_PCM_U24LE_DECODER 0
 %define CONFIG_PCM_U32BE_DECODER 0
 %define CONFIG_PCM_U32LE_DECODER 0
-%define CONFIG_PCM_ZORK_DECODER 0
+%define CONFIG_PCM_VIDC_DECODER 0
+%define CONFIG_DERF_DPCM_DECODER 0
 %define CONFIG_GREMLIN_DPCM_DECODER 0
 %define CONFIG_INTERPLAY_DPCM_DECODER 0
 %define CONFIG_ROQ_DPCM_DECODER 0
+%define CONFIG_SDX2_DPCM_DECODER 0
 %define CONFIG_SOL_DPCM_DECODER 0
 %define CONFIG_XAN_DPCM_DECODER 0
 %define CONFIG_ADPCM_4XM_DECODER 0
 %define CONFIG_ADPCM_ADX_DECODER 0
 %define CONFIG_ADPCM_AFC_DECODER 0
+%define CONFIG_ADPCM_AGM_DECODER 0
 %define CONFIG_ADPCM_AICA_DECODER 0
+%define CONFIG_ADPCM_ARGO_DECODER 0
 %define CONFIG_ADPCM_CT_DECODER 0
 %define CONFIG_ADPCM_DTK_DECODER 0
 %define CONFIG_ADPCM_EA_DECODER 0
@@ -1096,16 +1137,20 @@
 %define CONFIG_ADPCM_G726_DECODER 0
 %define CONFIG_ADPCM_G726LE_DECODER 0
 %define CONFIG_ADPCM_IMA_AMV_DECODER 0
+%define CONFIG_ADPCM_IMA_ALP_DECODER 0
 %define CONFIG_ADPCM_IMA_APC_DECODER 0
+%define CONFIG_ADPCM_IMA_APM_DECODER 0
 %define CONFIG_ADPCM_IMA_DAT4_DECODER 0
 %define CONFIG_ADPCM_IMA_DK3_DECODER 0
 %define CONFIG_ADPCM_IMA_DK4_DECODER 0
 %define CONFIG_ADPCM_IMA_EA_EACS_DECODER 0
 %define CONFIG_ADPCM_IMA_EA_SEAD_DECODER 0
 %define CONFIG_ADPCM_IMA_ISS_DECODER 0
+%define CONFIG_ADPCM_IMA_MTF_DECODER 0
 %define CONFIG_ADPCM_IMA_OKI_DECODER 0
 %define CONFIG_ADPCM_IMA_QT_DECODER 0
 %define CONFIG_ADPCM_IMA_RAD_DECODER 0
+%define CONFIG_ADPCM_IMA_SSI_DECODER 0
 %define CONFIG_ADPCM_IMA_SMJPEG_DECODER 0
 %define CONFIG_ADPCM_IMA_WAV_DECODER 0
 %define CONFIG_ADPCM_IMA_WS_DECODER 0
@@ -1121,6 +1166,7 @@
 %define CONFIG_ADPCM_VIMA_DECODER 0
 %define CONFIG_ADPCM_XA_DECODER 0
 %define CONFIG_ADPCM_YAMAHA_DECODER 0
+%define CONFIG_ADPCM_ZORK_DECODER 0
 %define CONFIG_SSA_DECODER 0
 %define CONFIG_ASS_DECODER 0
 %define CONFIG_CCAPTION_DECODER 0
@@ -1158,9 +1204,10 @@
 %define CONFIG_PCM_MULAW_AT_DECODER 0
 %define CONFIG_QDMC_AT_DECODER 0
 %define CONFIG_QDM2_AT_DECODER 0
-%define CONFIG_LIBAOM_AV1_DECODER 0
+%define CONFIG_LIBARIBB24_DECODER 0
 %define CONFIG_LIBCELT_DECODER 0
 %define CONFIG_LIBCODEC2_DECODER 0
+%define CONFIG_LIBDAV1D_DECODER 0
 %define CONFIG_LIBDAVS2_DECODER 0
 %define CONFIG_LIBFDK_AAC_DECODER 0
 %define CONFIG_LIBGSM_DECODER 0
@@ -1179,11 +1226,13 @@
 %define CONFIG_BINTEXT_DECODER 0
 %define CONFIG_XBIN_DECODER 0
 %define CONFIG_IDF_DECODER 0
+%define CONFIG_LIBAOM_AV1_DECODER 0
 %define CONFIG_LIBOPENH264_DECODER 0
 %define CONFIG_H264_CUVID_DECODER 0
 %define CONFIG_HEVC_CUVID_DECODER 0
 %define CONFIG_HEVC_MEDIACODEC_DECODER 0
 %define CONFIG_MJPEG_CUVID_DECODER 0
+%define CONFIG_MJPEG_QSV_DECODER 0
 %define CONFIG_MPEG1_CUVID_DECODER 0
 %define CONFIG_MPEG2_CUVID_DECODER 0
 %define CONFIG_MPEG4_CUVID_DECODER 0
@@ -1194,6 +1243,7 @@
 %define CONFIG_VP8_QSV_DECODER 0
 %define CONFIG_VP9_CUVID_DECODER 0
 %define CONFIG_VP9_MEDIACODEC_DECODER 0
+%define CONFIG_VP9_QSV_DECODER 0
 %define CONFIG_A64MULTI_ENCODER 0
 %define CONFIG_A64MULTI5_ENCODER 0
 %define CONFIG_ALIAS_PIX_ENCODER 0
@@ -1300,6 +1350,7 @@
 %define CONFIG_WMAV1_ENCODER 0
 %define CONFIG_WMAV2_ENCODER 0
 %define CONFIG_PCM_ALAW_ENCODER 0
+%define CONFIG_PCM_DVD_ENCODER 0
 %define CONFIG_PCM_F32BE_ENCODER 0
 %define CONFIG_PCM_F32LE_ENCODER 0
 %define CONFIG_PCM_F64BE_ENCODER 0
@@ -1327,6 +1378,7 @@
 %define CONFIG_PCM_U24LE_ENCODER 0
 %define CONFIG_PCM_U32BE_ENCODER 0
 %define CONFIG_PCM_U32LE_ENCODER 0
+%define CONFIG_PCM_VIDC_ENCODER 0
 %define CONFIG_ROQ_DPCM_ENCODER 0
 %define CONFIG_ADPCM_ADX_ENCODER 0
 %define CONFIG_ADPCM_G722_ENCODER 0
@@ -1362,6 +1414,7 @@
 %define CONFIG_LIBOPENCORE_AMRNB_ENCODER 0
 %define CONFIG_LIBOPENJPEG_ENCODER 0
 %define CONFIG_LIBOPUS_ENCODER 0
+%define CONFIG_LIBRAV1E_ENCODER 0
 %define CONFIG_LIBSHINE_ENCODER 0
 %define CONFIG_LIBSPEEX_ENCODER 0
 %define CONFIG_LIBTHEORA_ENCODER 0
@@ -1403,10 +1456,12 @@
 %define CONFIG_MJPEG_VAAPI_ENCODER 0
 %define CONFIG_MPEG2_QSV_ENCODER 0
 %define CONFIG_MPEG2_VAAPI_ENCODER 0
+%define CONFIG_MPEG4_OMX_ENCODER 0
 %define CONFIG_MPEG4_V4L2M2M_ENCODER 0
 %define CONFIG_VP8_V4L2M2M_ENCODER 0
 %define CONFIG_VP8_VAAPI_ENCODER 0
 %define CONFIG_VP9_VAAPI_ENCODER 0
+%define CONFIG_VP9_QSV_ENCODER 0
 %define CONFIG_H263_VAAPI_HWACCEL 0
 %define CONFIG_H263_VIDEOTOOLBOX_HWACCEL 0
 %define CONFIG_H264_D3D11VA_HWACCEL 0
@@ -1454,6 +1509,7 @@
 %define CONFIG_VP9_DXVA2_HWACCEL 0
 %define CONFIG_VP9_NVDEC_HWACCEL 0
 %define CONFIG_VP9_VAAPI_HWACCEL 0
+%define CONFIG_VP9_VDPAU_HWACCEL 0
 %define CONFIG_WMV3_D3D11VA_HWACCEL 0
 %define CONFIG_WMV3_D3D11VA2_HWACCEL 0
 %define CONFIG_WMV3_DXVA2_HWACCEL 0
@@ -1478,7 +1534,9 @@
 %define CONFIG_DVDSUB_PARSER 0
 %define CONFIG_DVD_NAV_PARSER 0
 %define CONFIG_FLAC_PARSER 1
+%define CONFIG_G723_1_PARSER 0
 %define CONFIG_G729_PARSER 0
+%define CONFIG_GIF_PARSER 0
 %define CONFIG_GSM_PARSER 0
 %define CONFIG_H261_PARSER 0
 %define CONFIG_H263_PARSER 0
@@ -1502,13 +1560,13 @@
 %define CONFIG_VP3_PARSER 1
 %define CONFIG_VP8_PARSER 1
 %define CONFIG_VP9_PARSER 1
+%define CONFIG_WEBP_PARSER 0
 %define CONFIG_XMA_PARSER 0
 %define CONFIG_ALSA_INDEV 0
 %define CONFIG_ANDROID_CAMERA_INDEV 0
 %define CONFIG_AVFOUNDATION_INDEV 0
 %define CONFIG_BKTR_INDEV 0
 %define CONFIG_DECKLINK_INDEV 0
-%define CONFIG_LIBNDI_NEWTEK_INDEV 0
 %define CONFIG_DSHOW_INDEV 0
 %define CONFIG_FBDEV_INDEV 0
 %define CONFIG_GDIGRAB_INDEV 0
@@ -1528,7 +1586,6 @@
 %define CONFIG_ALSA_OUTDEV 0
 %define CONFIG_CACA_OUTDEV 0
 %define CONFIG_DECKLINK_OUTDEV 0
-%define CONFIG_LIBNDI_NEWTEK_OUTDEV 0
 %define CONFIG_FBDEV_OUTDEV 0
 %define CONFIG_OPENGL_OUTDEV 0
 %define CONFIG_OSS_OUTDEV 0
@@ -1569,6 +1626,8 @@
 %define CONFIG_AMIX_FILTER 0
 %define CONFIG_AMULTIPLY_FILTER 0
 %define CONFIG_ANEQUALIZER_FILTER 0
+%define CONFIG_ANLMDN_FILTER 0
+%define CONFIG_ANLMS_FILTER 0
 %define CONFIG_ANULL_FILTER 0
 %define CONFIG_APAD_FILTER 0
 %define CONFIG_APERMS_FILTER 0
@@ -1577,6 +1636,7 @@
 %define CONFIG_AREALTIME_FILTER 0
 %define CONFIG_ARESAMPLE_FILTER 0
 %define CONFIG_AREVERSE_FILTER 0
+%define CONFIG_ARNNDN_FILTER 0
 %define CONFIG_ASELECT_FILTER 0
 %define CONFIG_ASENDCMD_FILTER 0
 %define CONFIG_ASETNSAMPLES_FILTER 0
@@ -1585,17 +1645,21 @@
 %define CONFIG_ASETTB_FILTER 0
 %define CONFIG_ASHOWINFO_FILTER 0
 %define CONFIG_ASIDEDATA_FILTER 0
+%define CONFIG_ASOFTCLIP_FILTER 0
 %define CONFIG_ASPLIT_FILTER 0
+%define CONFIG_ASR_FILTER 0
 %define CONFIG_ASTATS_FILTER 0
 %define CONFIG_ASTREAMSELECT_FILTER 0
 %define CONFIG_ATEMPO_FILTER 0
 %define CONFIG_ATRIM_FILTER 0
+%define CONFIG_AXCORRELATE_FILTER 0
 %define CONFIG_AZMQ_FILTER 0
 %define CONFIG_BANDPASS_FILTER 0
 %define CONFIG_BANDREJECT_FILTER 0
 %define CONFIG_BASS_FILTER 0
 %define CONFIG_BIQUAD_FILTER 0
 %define CONFIG_BS2B_FILTER 0
+%define CONFIG_CHROMABER_VULKAN_FILTER 0
 %define CONFIG_CHANNELMAP_FILTER 0
 %define CONFIG_CHANNELSPLIT_FILTER 0
 %define CONFIG_CHORUS_FILTER 0
@@ -1604,6 +1668,7 @@
 %define CONFIG_CROSSFEED_FILTER 0
 %define CONFIG_CRYSTALIZER_FILTER 0
 %define CONFIG_DCSHIFT_FILTER 0
+%define CONFIG_DEESSER_FILTER 0
 %define CONFIG_DRMETER_FILTER 0
 %define CONFIG_DYNAUDNORM_FILTER 0
 %define CONFIG_EARWAX_FILTER 0
@@ -1643,12 +1708,15 @@
 %define CONFIG_VOLUME_FILTER 0
 %define CONFIG_VOLUMEDETECT_FILTER 0
 %define CONFIG_AEVALSRC_FILTER 0
+%define CONFIG_AFIRSRC_FILTER 0
 %define CONFIG_ANOISESRC_FILTER 0
 %define CONFIG_ANULLSRC_FILTER 0
 %define CONFIG_FLITE_FILTER 0
 %define CONFIG_HILBERT_FILTER 0
+%define CONFIG_SINC_FILTER 0
 %define CONFIG_SINE_FILTER 0
 %define CONFIG_ANULLSINK_FILTER 0
+%define CONFIG_ADDROI_FILTER 0
 %define CONFIG_ALPHAEXTRACT_FILTER 0
 %define CONFIG_ALPHAMERGE_FILTER 0
 %define CONFIG_AMPLIFY_FILTER 0
@@ -1656,8 +1724,10 @@
 %define CONFIG_ATADENOISE_FILTER 0
 %define CONFIG_AVGBLUR_FILTER 0
 %define CONFIG_AVGBLUR_OPENCL_FILTER 0
+%define CONFIG_AVGBLUR_VULKAN_FILTER 0
 %define CONFIG_BBOX_FILTER 0
 %define CONFIG_BENCH_FILTER 0
+%define CONFIG_BILATERAL_FILTER 0
 %define CONFIG_BITPLANENOISE_FILTER 0
 %define CONFIG_BLACKDETECT_FILTER 0
 %define CONFIG_BLACKFRAME_FILTER 0
@@ -1666,12 +1736,17 @@
 %define CONFIG_BOXBLUR_FILTER 0
 %define CONFIG_BOXBLUR_OPENCL_FILTER 0
 %define CONFIG_BWDIF_FILTER 0
+%define CONFIG_CAS_FILTER 0
+%define CONFIG_CHROMAHOLD_FILTER 0
 %define CONFIG_CHROMAKEY_FILTER 0
+%define CONFIG_CHROMASHIFT_FILTER 0
 %define CONFIG_CIESCOPE_FILTER 0
 %define CONFIG_CODECVIEW_FILTER 0
 %define CONFIG_COLORBALANCE_FILTER 0
 %define CONFIG_COLORCHANNELMIXER_FILTER 0
 %define CONFIG_COLORKEY_FILTER 0
+%define CONFIG_COLORKEY_OPENCL_FILTER 0
+%define CONFIG_COLORHOLD_FILTER 0
 %define CONFIG_COLORLEVELS_FILTER 0
 %define CONFIG_COLORMATRIX_FILTER 0
 %define CONFIG_COLORSPACE_FILTER 0
@@ -1691,6 +1766,7 @@
 %define CONFIG_DEBLOCK_FILTER 0
 %define CONFIG_DECIMATE_FILTER 0
 %define CONFIG_DECONVOLVE_FILTER 0
+%define CONFIG_DEDOT_FILTER 0
 %define CONFIG_DEFLATE_FILTER 0
 %define CONFIG_DEFLICKER_FILTER 0
 %define CONFIG_DEINTERLACE_QSV_FILTER 0
@@ -1698,12 +1774,15 @@
 %define CONFIG_DEJUDDER_FILTER 0
 %define CONFIG_DELOGO_FILTER 0
 %define CONFIG_DENOISE_VAAPI_FILTER 0
+%define CONFIG_DERAIN_FILTER 0
 %define CONFIG_DESHAKE_FILTER 0
+%define CONFIG_DESHAKE_OPENCL_FILTER 0
 %define CONFIG_DESPILL_FILTER 0
 %define CONFIG_DETELECINE_FILTER 0
 %define CONFIG_DILATION_FILTER 0
 %define CONFIG_DILATION_OPENCL_FILTER 0
 %define CONFIG_DISPLACE_FILTER 0
+%define CONFIG_DNN_PROCESSING_FILTER 0
 %define CONFIG_DOUBLEWEAVE_FILTER 0
 %define CONFIG_DRAWBOX_FILTER 0
 %define CONFIG_DRAWGRAPH_FILTER 0
@@ -1731,11 +1810,14 @@
 %define CONFIG_FRAMEPACK_FILTER 0
 %define CONFIG_FRAMERATE_FILTER 0
 %define CONFIG_FRAMESTEP_FILTER 0
+%define CONFIG_FREEZEDETECT_FILTER 0
+%define CONFIG_FREEZEFRAMES_FILTER 0
 %define CONFIG_FREI0R_FILTER 0
 %define CONFIG_FSPP_FILTER 0
 %define CONFIG_GBLUR_FILTER 0
 %define CONFIG_GEQ_FILTER 0
 %define CONFIG_GRADFUN_FILTER 0
+%define CONFIG_GRAPHMONITOR_FILTER 0
 %define CONFIG_GREYEDGE_FILTER 0
 %define CONFIG_HALDCLUT_FILTER 0
 %define CONFIG_HFLIP_FILTER 0
@@ -1756,6 +1838,7 @@
 %define CONFIG_INTERLACE_FILTER 0
 %define CONFIG_INTERLEAVE_FILTER 0
 %define CONFIG_KERNDEINT_FILTER 0
+%define CONFIG_LAGFUN_FILTER 0
 %define CONFIG_LENSCORRECTION_FILTER 0
 %define CONFIG_LENSFUN_FILTER 0
 %define CONFIG_LIBVMAF_FILTER 0
@@ -1769,8 +1852,13 @@
 %define CONFIG_LUTRGB_FILTER 0
 %define CONFIG_LUTYUV_FILTER 0
 %define CONFIG_MASKEDCLAMP_FILTER 0
+%define CONFIG_MASKEDMAX_FILTER 0
 %define CONFIG_MASKEDMERGE_FILTER 0
+%define CONFIG_MASKEDMIN_FILTER 0
+%define CONFIG_MASKEDTHRESHOLD_FILTER 0
+%define CONFIG_MASKFUN_FILTER 0
 %define CONFIG_MCDEINT_FILTER 0
+%define CONFIG_MEDIAN_FILTER 0
 %define CONFIG_MERGEPLANES_FILTER 0
 %define CONFIG_MESTIMATE_FILTER 0
 %define CONFIG_METADATA_FILTER 0
@@ -1780,6 +1868,7 @@
 %define CONFIG_MPDECIMATE_FILTER 0
 %define CONFIG_NEGATE_FILTER 0
 %define CONFIG_NLMEANS_FILTER 0
+%define CONFIG_NLMEANS_OPENCL_FILTER 0
 %define CONFIG_NNEDI_FILTER 0
 %define CONFIG_NOFORMAT_FILTER 0
 %define CONFIG_NOISE_FILTER 0
@@ -1791,13 +1880,17 @@
 %define CONFIG_OVERLAY_FILTER 0
 %define CONFIG_OVERLAY_OPENCL_FILTER 0
 %define CONFIG_OVERLAY_QSV_FILTER 0
+%define CONFIG_OVERLAY_VULKAN_FILTER 0
+%define CONFIG_OVERLAY_CUDA_FILTER 0
 %define CONFIG_OWDENOISE_FILTER 0
 %define CONFIG_PAD_FILTER 0
+%define CONFIG_PAD_OPENCL_FILTER 0
 %define CONFIG_PALETTEGEN_FILTER 0
 %define CONFIG_PALETTEUSE_FILTER 0
 %define CONFIG_PERMS_FILTER 0
 %define CONFIG_PERSPECTIVE_FILTER 0
 %define CONFIG_PHASE_FILTER 0
+%define CONFIG_PHOTOSENSITIVITY_FILTER 0
 %define CONFIG_PIXDESCTEST_FILTER 0
 %define CONFIG_PIXSCOPE_FILTER 0
 %define CONFIG_PP_FILTER 0
@@ -1820,6 +1913,7 @@
 %define CONFIG_REMOVELOGO_FILTER 0
 %define CONFIG_REPEATFIELDS_FILTER 0
 %define CONFIG_REVERSE_FILTER 0
+%define CONFIG_RGBASHIFT_FILTER 0
 %define CONFIG_ROBERTS_FILTER 0
 %define CONFIG_ROBERTS_OPENCL_FILTER 0
 %define CONFIG_ROTATE_FILTER 0
@@ -1829,13 +1923,16 @@
 %define CONFIG_SCALE_NPP_FILTER 0
 %define CONFIG_SCALE_QSV_FILTER 0
 %define CONFIG_SCALE_VAAPI_FILTER 0
+%define CONFIG_SCALE_VULKAN_FILTER 0
 %define CONFIG_SCALE2REF_FILTER 0
+%define CONFIG_SCROLL_FILTER 0
 %define CONFIG_SELECT_FILTER 0
 %define CONFIG_SELECTIVECOLOR_FILTER 0
 %define CONFIG_SENDCMD_FILTER 0
 %define CONFIG_SEPARATEFIELDS_FILTER 0
 %define CONFIG_SETDAR_FILTER 0
 %define CONFIG_SETFIELD_FILTER 0
+%define CONFIG_SETPARAMS_FILTER 0
 %define CONFIG_SETPTS_FILTER 0
 %define CONFIG_SETRANGE_FILTER 0
 %define CONFIG_SETSAR_FILTER 0
@@ -1863,26 +1960,34 @@
 %define CONFIG_SWAPUV_FILTER 0
 %define CONFIG_TBLEND_FILTER 0
 %define CONFIG_TELECINE_FILTER 0
+%define CONFIG_THISTOGRAM_FILTER 0
 %define CONFIG_THRESHOLD_FILTER 0
 %define CONFIG_THUMBNAIL_FILTER 0
 %define CONFIG_THUMBNAIL_CUDA_FILTER 0
 %define CONFIG_TILE_FILTER 0
 %define CONFIG_TINTERLACE_FILTER 0
 %define CONFIG_TLUT2_FILTER 0
+%define CONFIG_TMEDIAN_FILTER 0
 %define CONFIG_TMIX_FILTER 0
 %define CONFIG_TONEMAP_FILTER 0
 %define CONFIG_TONEMAP_OPENCL_FILTER 0
+%define CONFIG_TONEMAP_VAAPI_FILTER 0
+%define CONFIG_TPAD_FILTER 0
 %define CONFIG_TRANSPOSE_FILTER 0
 %define CONFIG_TRANSPOSE_NPP_FILTER 0
+%define CONFIG_TRANSPOSE_OPENCL_FILTER 0
+%define CONFIG_TRANSPOSE_VAAPI_FILTER 0
 %define CONFIG_TRIM_FILTER 0
 %define CONFIG_UNPREMULTIPLY_FILTER 0
 %define CONFIG_UNSHARP_FILTER 0
 %define CONFIG_UNSHARP_OPENCL_FILTER 0
 %define CONFIG_USPP_FILTER 0
+%define CONFIG_V360_FILTER 0
 %define CONFIG_VAGUEDENOISER_FILTER 0
 %define CONFIG_VECTORSCOPE_FILTER 0
 %define CONFIG_VFLIP_FILTER 0
 %define CONFIG_VFRDET_FILTER 0
+%define CONFIG_VIBRANCE_FILTER 0
 %define CONFIG_VIDSTABDETECT_FILTER 0
 %define CONFIG_VIDSTABTRANSFORM_FILTER 0
 %define CONFIG_VIGNETTE_FILTER 0
@@ -1893,7 +1998,13 @@
 %define CONFIG_WAVEFORM_FILTER 0
 %define CONFIG_WEAVE_FILTER 0
 %define CONFIG_XBR_FILTER 0
+%define CONFIG_XFADE_FILTER 0
+%define CONFIG_XFADE_OPENCL_FILTER 0
+%define CONFIG_XMEDIAN_FILTER 0
+%define CONFIG_XSTACK_FILTER 0
 %define CONFIG_YADIF_FILTER 0
+%define CONFIG_YADIF_CUDA_FILTER 0
+%define CONFIG_YAEPBLUR_FILTER 0
 %define CONFIG_ZMQ_FILTER 0
 %define CONFIG_ZOOMPAN_FILTER 0
 %define CONFIG_ZSCALE_FILTER 0
@@ -1912,6 +2023,7 @@
 %define CONFIG_PAL75BARS_FILTER 0
 %define CONFIG_PAL100BARS_FILTER 0
 %define CONFIG_RGBTESTSRC_FILTER 0
+%define CONFIG_SIERPINSKI_FILTER 0
 %define CONFIG_SMPTEBARS_FILTER 0
 %define CONFIG_SMPTEHDBARS_FILTER 0
 %define CONFIG_TESTSRC_FILTER 0
@@ -1920,12 +2032,14 @@
 %define CONFIG_NULLSINK_FILTER 0
 %define CONFIG_ABITSCOPE_FILTER 0
 %define CONFIG_ADRAWGRAPH_FILTER 0
+%define CONFIG_AGRAPHMONITOR_FILTER 0
 %define CONFIG_AHISTOGRAM_FILTER 0
 %define CONFIG_APHASEMETER_FILTER 0
 %define CONFIG_AVECTORSCOPE_FILTER 0
 %define CONFIG_CONCAT_FILTER 0
 %define CONFIG_SHOWCQT_FILTER 0
 %define CONFIG_SHOWFREQS_FILTER 0
+%define CONFIG_SHOWSPATIAL_FILTER 0
 %define CONFIG_SHOWSPECTRUM_FILTER 0
 %define CONFIG_SHOWSPECTRUMPIC_FILTER 0
 %define CONFIG_SHOWVOLUME_FILTER 0
@@ -1949,21 +2063,25 @@
 %define CONFIG_AFC_DEMUXER 0
 %define CONFIG_AIFF_DEMUXER 0
 %define CONFIG_AIX_DEMUXER 0
+%define CONFIG_ALP_DEMUXER 0
 %define CONFIG_AMR_DEMUXER 0
 %define CONFIG_AMRNB_DEMUXER 0
 %define CONFIG_AMRWB_DEMUXER 0
 %define CONFIG_ANM_DEMUXER 0
 %define CONFIG_APC_DEMUXER 0
 %define CONFIG_APE_DEMUXER 0
+%define CONFIG_APM_DEMUXER 0
 %define CONFIG_APNG_DEMUXER 0
 %define CONFIG_APTX_DEMUXER 0
 %define CONFIG_APTX_HD_DEMUXER 0
 %define CONFIG_AQTITLE_DEMUXER 0
+%define CONFIG_ARGO_ASF_DEMUXER 0
 %define CONFIG_ASF_DEMUXER 0
 %define CONFIG_ASF_O_DEMUXER 0
 %define CONFIG_ASS_DEMUXER 0
 %define CONFIG_AST_DEMUXER 0
 %define CONFIG_AU_DEMUXER 0
+%define CONFIG_AV1_DEMUXER 0
 %define CONFIG_AVI_DEMUXER 0
 %define CONFIG_AVISYNTH_DEMUXER 0
 %define CONFIG_AVR_DEMUXER 0
@@ -1991,7 +2109,9 @@
 %define CONFIG_DATA_DEMUXER 0
 %define CONFIG_DAUD_DEMUXER 0
 %define CONFIG_DCSTR_DEMUXER 0
+%define CONFIG_DERF_DEMUXER 0
 %define CONFIG_DFA_DEMUXER 0
+%define CONFIG_DHAV_DEMUXER 0
 %define CONFIG_DIRAC_DEMUXER 0
 %define CONFIG_DNXHD_DEMUXER 0
 %define CONFIG_DSF_DEMUXER 0
@@ -2017,6 +2137,7 @@
 %define CONFIG_FOURXM_DEMUXER 0
 %define CONFIG_FRM_DEMUXER 0
 %define CONFIG_FSB_DEMUXER 0
+%define CONFIG_FWSE_DEMUXER 0
 %define CONFIG_G722_DEMUXER 0
 %define CONFIG_G723_1_DEMUXER 0
 %define CONFIG_G726_DEMUXER 0
@@ -2030,6 +2151,8 @@
 %define CONFIG_H261_DEMUXER 0
 %define CONFIG_H263_DEMUXER 0
 %define CONFIG_H264_DEMUXER 0
+%define CONFIG_HCA_DEMUXER 0
+%define CONFIG_HCOM_DEMUXER 0
 %define CONFIG_HEVC_DEMUXER 0
 %define CONFIG_HLS_DEMUXER 0
 %define CONFIG_HNM_DEMUXER 0
@@ -2037,6 +2160,7 @@
 %define CONFIG_IDCIN_DEMUXER 0
 %define CONFIG_IDF_DEMUXER 0
 %define CONFIG_IFF_DEMUXER 0
+%define CONFIG_IFV_DEMUXER 0
 %define CONFIG_ILBC_DEMUXER 0
 %define CONFIG_IMAGE2_DEMUXER 0
 %define CONFIG_IMAGE2PIPE_DEMUXER 0
@@ -2051,6 +2175,8 @@
 %define CONFIG_IVR_DEMUXER 0
 %define CONFIG_JACOSUB_DEMUXER 0
 %define CONFIG_JV_DEMUXER 0
+%define CONFIG_KUX_DEMUXER 0
+%define CONFIG_KVAG_DEMUXER 0
 %define CONFIG_LMLM4_DEMUXER 0
 %define CONFIG_LOAS_DEMUXER 0
 %define CONFIG_LRC_DEMUXER 0
@@ -2097,6 +2223,7 @@
 %define CONFIG_PAF_DEMUXER 0
 %define CONFIG_PCM_ALAW_DEMUXER 0
 %define CONFIG_PCM_MULAW_DEMUXER 0
+%define CONFIG_PCM_VIDC_DEMUXER 0
 %define CONFIG_PCM_F64BE_DEMUXER 0
 %define CONFIG_PCM_F64LE_DEMUXER 0
 %define CONFIG_PCM_F32BE_DEMUXER 0
@@ -2177,6 +2304,7 @@
 %define CONFIG_VAG_DEMUXER 0
 %define CONFIG_VC1_DEMUXER 0
 %define CONFIG_VC1T_DEMUXER 0
+%define CONFIG_VIVIDAS_DEMUXER 0
 %define CONFIG_VIVO_DEMUXER 0
 %define CONFIG_VMD_DEMUXER 0
 %define CONFIG_VOBSUB_DEMUXER 0
@@ -2206,6 +2334,7 @@
 %define CONFIG_IMAGE_DDS_PIPE_DEMUXER 0
 %define CONFIG_IMAGE_DPX_PIPE_DEMUXER 0
 %define CONFIG_IMAGE_EXR_PIPE_DEMUXER 0
+%define CONFIG_IMAGE_GIF_PIPE_DEMUXER 0
 %define CONFIG_IMAGE_J2K_PIPE_DEMUXER 0
 %define CONFIG_IMAGE_JPEG_PIPE_DEMUXER 0
 %define CONFIG_IMAGE_JPEGLS_PIPE_DEMUXER 0
@@ -2330,6 +2459,7 @@
 %define CONFIG_OPUS_MUXER 0
 %define CONFIG_PCM_ALAW_MUXER 0
 %define CONFIG_PCM_MULAW_MUXER 0
+%define CONFIG_PCM_VIDC_MUXER 0
 %define CONFIG_PCM_F64BE_MUXER 0
 %define CONFIG_PCM_F64LE_MUXER 0
 %define CONFIG_PCM_F32BE_MUXER 0
@@ -2369,6 +2499,7 @@
 %define CONFIG_SPX_MUXER 0
 %define CONFIG_SPDIF_MUXER 0
 %define CONFIG_SRT_MUXER 0
+%define CONFIG_STREAMHASH_MUXER 0
 %define CONFIG_SUP_MUXER 0
 %define CONFIG_SWF_MUXER 0
 %define CONFIG_TEE_MUXER 0
@@ -2429,6 +2560,7 @@
 %define CONFIG_UDP_PROTOCOL 0
 %define CONFIG_UDPLITE_PROTOCOL 0
 %define CONFIG_UNIX_PROTOCOL 0
+%define CONFIG_LIBAMQP_PROTOCOL 0
 %define CONFIG_LIBRTMP_PROTOCOL 0
 %define CONFIG_LIBRTMPE_PROTOCOL 0
 %define CONFIG_LIBRTMPS_PROTOCOL 0
@@ -2437,3 +2569,4 @@
 %define CONFIG_LIBSRT_PROTOCOL 0
 %define CONFIG_LIBSSH_PROTOCOL 0
 %define CONFIG_LIBSMBCLIENT_PROTOCOL 0
+%define CONFIG_LIBZMQ_PROTOCOL 0
diff --git a/fuchsia/config/default/x64/config.h b/fuchsia/config/default/x64/config.h
index 51ed698..b9d250d 100644
--- a/fuchsia/config/default/x64/config.h
+++ b/fuchsia/config/default/x64/config.h
@@ -3,10 +3,10 @@
 #define FFMPEG_CONFIG_H
 #define FFMPEG_CONFIGURATION "--disable-everything --disable-all --disable-doc --disable-htmlpages --disable-manpages --disable-podpages --disable-txtpages --disable-static --enable-avcodec --enable-avformat --enable-avutil --enable-fft --enable-rdft --enable-static --enable-libopus --disable-debug --disable-bzlib --disable-iconv --disable-lzo --disable-network --disable-schannel --disable-sdl2 --disable-symver --disable-xlib --disable-zlib --disable-securetransport --disable-faan --disable-alsa --disable-autodetect --enable-decoder='vorbis,libopus,flac' --enable-decoder='pcm_u8,pcm_s16le,pcm_s24le,pcm_s32le,pcm_f32le,mp3' --enable-decoder='pcm_s16be,pcm_s24be,pcm_mulaw,pcm_alaw' --enable-decoder='theora,vp8,sbc,aptx' --enable-demuxer='ogg,matroska,wav,flac,mp3,mov' --enable-parser='opus,vorbis,flac,mpegaudio' --extra-cflags=-I/usr/local/google/home/dalesat/fuchsia/third_party/opus/include --enable-parser='vp3,vp8' --optflags='\"-O2\"' --enable-pic --x86asmexe=yasm --enable-pic --enable-lto --cc=clang --cxx=clang++ --ld=clang --enable-decoder=vp9 --enable-parser=vp9 --sysroot=/usr/local/google/home/dalesat/fuchsia/third_party/ffmpeg/../../prebuilt/third_party/sysroot/linux --extra-ldflags='-fuse-ld=lld' --disable-error-resilience"
 #define FFMPEG_LICENSE "LGPL version 2.1 or later"
-#define CONFIG_THIS_YEAR 2018
+#define CONFIG_THIS_YEAR 2020
 #define FFMPEG_DATADIR "/usr/local/share/ffmpeg"
 #define AVCONV_DATADIR "/usr/local/share/ffmpeg"
-#define CC_IDENT "Fuchsia clang version 11.0.0 (https://fuchsia.googlesource.com/a/third_party/llvm-project 6e00e3fcb082c3f19309ebc6f184ab326eec3328)"
+#define CC_IDENT "Fuchsia clang version 11.0.0 (https://fuchsia.googlesource.com/a/third_party/llvm-project dd484baffdf4a92e564c38a17d35a742e633b0e0)"
 #define av_restrict restrict
 #define EXTERN_PREFIX ""
 #define EXTERN_ASM 
@@ -80,6 +80,7 @@
 #define HAVE_MIPSDSP 0
 #define HAVE_MIPSDSPR2 0
 #define HAVE_MSA 0
+#define HAVE_MSA2 0
 #define HAVE_LOONGSON2 0
 #define HAVE_LOONGSON3 0
 #define HAVE_MMI 0
@@ -125,6 +126,7 @@
 #define HAVE_MIPSDSP_EXTERNAL 0
 #define HAVE_MIPSDSPR2_EXTERNAL 0
 #define HAVE_MSA_EXTERNAL 0
+#define HAVE_MSA2_EXTERNAL 0
 #define HAVE_LOONGSON2_EXTERNAL 0
 #define HAVE_LOONGSON3_EXTERNAL 0
 #define HAVE_MMI_EXTERNAL 0
@@ -170,6 +172,7 @@
 #define HAVE_MIPSDSP_INLINE 0
 #define HAVE_MIPSDSPR2_INLINE 0
 #define HAVE_MSA_INLINE 0
+#define HAVE_MSA2_INLINE 0
 #define HAVE_LOONGSON2_INLINE 0
 #define HAVE_LOONGSON3_INLINE 0
 #define HAVE_MMI_INLINE 0
@@ -280,10 +283,12 @@
 #define HAVE_GETADDRINFO 0
 #define HAVE_GETHRTIME 0
 #define HAVE_GETOPT 1
+#define HAVE_GETMODULEHANDLE 0
 #define HAVE_GETPROCESSAFFINITYMASK 0
 #define HAVE_GETPROCESSMEMORYINFO 0
 #define HAVE_GETPROCESSTIMES 0
 #define HAVE_GETRUSAGE 1
+#define HAVE_GETSTDHANDLE 0
 #define HAVE_GETSYSTEMTIMEASFILETIME 0
 #define HAVE_GETTIMEOFDAY 1
 #define HAVE_GLOB 1
@@ -309,6 +314,7 @@
 #define HAVE_SECITEMIMPORT 0
 #define HAVE_SETCONSOLETEXTATTRIBUTE 0
 #define HAVE_SETCONSOLECTRLHANDLER 0
+#define HAVE_SETDLLDIRECTORY 0
 #define HAVE_SETMODE 0
 #define HAVE_SETRLIMIT 1
 #define HAVE_SLEEP 0
@@ -349,6 +355,10 @@
 #define HAVE_XFORM_ASM 0
 #define HAVE_XMM_CLOBBERS 1
 #define HAVE_KCMVIDEOCODECTYPE_HEVC 0
+#define HAVE_KCVPIXELFORMATTYPE_420YPCBCR10BIPLANARVIDEORANGE 0
+#define HAVE_KCVIMAGEBUFFERTRANSFERFUNCTION_SMPTE_ST_2084_PQ 0
+#define HAVE_KCVIMAGEBUFFERTRANSFERFUNCTION_ITU_R_2100_HLG 0
+#define HAVE_KCVIMAGEBUFFERTRANSFERFUNCTION_LINEAR 0
 #define HAVE_SOCKLEN_T 0
 #define HAVE_STRUCT_ADDRINFO 0
 #define HAVE_STRUCT_GROUP_SOURCE_REQ 0
@@ -362,7 +372,7 @@
 #define HAVE_STRUCT_SOCKADDR_SA_LEN 0
 #define HAVE_STRUCT_SOCKADDR_STORAGE 0
 #define HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC 1
-#define HAVE_STRUCT_V4L2_FRMIVALENUM_DISCRETE 1
+#define HAVE_STRUCT_V4L2_FRMIVALENUM_DISCRETE 0
 #define HAVE_MAKEINFO 0
 #define HAVE_MAKEINFO_HTML 0
 #define HAVE_OPENCL_D3D11 0
@@ -379,7 +389,7 @@
 #define CONFIG_MANPAGES 0
 #define CONFIG_PODPAGES 0
 #define CONFIG_TXTPAGES 0
-#define CONFIG_AVIO_DIR_CMD_EXAMPLE 1
+#define CONFIG_AVIO_LIST_DIR_EXAMPLE 1
 #define CONFIG_AVIO_READING_EXAMPLE 1
 #define CONFIG_DECODE_AUDIO_EXAMPLE 1
 #define CONFIG_DECODE_VIDEO_EXAMPLE 1
@@ -414,11 +424,11 @@
 #define CONFIG_LIBXAVS2 0
 #define CONFIG_LIBXVID 0
 #define CONFIG_DECKLINK 0
-#define CONFIG_LIBNDI_NEWTEK 0
 #define CONFIG_LIBFDK_AAC 0
 #define CONFIG_OPENSSL 0
 #define CONFIG_LIBTLS 0
 #define CONFIG_GMP 0
+#define CONFIG_LIBARIBB24 0
 #define CONFIG_LIBLENSFUN 0
 #define CONFIG_LIBOPENCORE_AMRNB 0
 #define CONFIG_LIBOPENCORE_AMRWB 0
@@ -439,12 +449,14 @@
 #define CONFIG_LIBCACA 0
 #define CONFIG_LIBCELT 0
 #define CONFIG_LIBCODEC2 0
+#define CONFIG_LIBDAV1D 0
 #define CONFIG_LIBDC1394 0
 #define CONFIG_LIBDRM 0
 #define CONFIG_LIBFLITE 0
 #define CONFIG_LIBFONTCONFIG 0
 #define CONFIG_LIBFREETYPE 0
 #define CONFIG_LIBFRIBIDI 0
+#define CONFIG_LIBGLSLANG 0
 #define CONFIG_LIBGME 0
 #define CONFIG_LIBGSM 0
 #define CONFIG_LIBIEC61883 0
@@ -461,6 +473,8 @@
 #define CONFIG_LIBOPENMPT 0
 #define CONFIG_LIBOPUS 1
 #define CONFIG_LIBPULSE 0
+#define CONFIG_LIBRABBITMQ 0
+#define CONFIG_LIBRAV1E 0
 #define CONFIG_LIBRSVG 0
 #define CONFIG_LIBRTMP 0
 #define CONFIG_LIBSHINE 0
@@ -487,6 +501,7 @@
 #define CONFIG_MEDIACODEC 0
 #define CONFIG_OPENAL 0
 #define CONFIG_OPENGL 0
+#define CONFIG_POCKETSPHINX 0
 #define CONFIG_VAPOURSYNTH 0
 #define CONFIG_ALSA 0
 #define CONFIG_APPKIT 0
@@ -505,16 +520,19 @@
 #define CONFIG_SNDIO 0
 #define CONFIG_XLIB 0
 #define CONFIG_ZLIB 0
+#define CONFIG_CUDA_NVCC 0
 #define CONFIG_CUDA_SDK 0
 #define CONFIG_LIBNPP 0
 #define CONFIG_LIBMFX 0
 #define CONFIG_MMAL 0
 #define CONFIG_OMX 0
 #define CONFIG_OPENCL 0
+#define CONFIG_VULKAN 0
 #define CONFIG_AMF 0
 #define CONFIG_AUDIOTOOLBOX 0
 #define CONFIG_CRYSTALHD 0
 #define CONFIG_CUDA 0
+#define CONFIG_CUDA_LLVM 0
 #define CONFIG_CUVID 0
 #define CONFIG_D3D11VA 0
 #define CONFIG_DXVA2 0
@@ -565,6 +583,7 @@
 #define CONFIG_RDFT 1
 #define CONFIG_AUTODETECT 0
 #define CONFIG_FONTCONFIG 0
+#define CONFIG_LARGE_TESTS 1
 #define CONFIG_LINUX_PERF 0
 #define CONFIG_MEMORY_POISONING 0
 #define CONFIG_NEON_CLOBBER_TEST 0
@@ -657,6 +676,7 @@
 #define CONFIG_RTPDEC 0
 #define CONFIG_RTPENC_CHAIN 0
 #define CONFIG_RV34DSP 0
+#define CONFIG_SCENE_SAD 0
 #define CONFIG_SINEWIN 0
 #define CONFIG_SNAPPY 0
 #define CONFIG_SRTP 0
@@ -674,6 +694,8 @@
 #define CONFIG_WMA_FREQS 0
 #define CONFIG_WMV2DSP 0
 #define CONFIG_AAC_ADTSTOASC_BSF 0
+#define CONFIG_AV1_FRAME_MERGE_BSF 0
+#define CONFIG_AV1_FRAME_SPLIT_BSF 0
 #define CONFIG_AV1_METADATA_BSF 0
 #define CONFIG_CHOMP_BSF 0
 #define CONFIG_DUMP_EXTRADATA_BSF 0
@@ -696,9 +718,11 @@
 #define CONFIG_MOV2TEXTSUB_BSF 0
 #define CONFIG_NOISE_BSF 0
 #define CONFIG_NULL_BSF 1
+#define CONFIG_PRORES_METADATA_BSF 0
 #define CONFIG_REMOVE_EXTRADATA_BSF 0
 #define CONFIG_TEXT2MOVSUB_BSF 0
 #define CONFIG_TRACE_HEADERS_BSF 0
+#define CONFIG_TRUEHD_CORE_BSF 0
 #define CONFIG_VP9_METADATA_BSF 0
 #define CONFIG_VP9_RAW_REORDER_BSF 0
 #define CONFIG_VP9_SUPERFRAME_BSF 0
@@ -706,10 +730,12 @@
 #define CONFIG_AASC_DECODER 0
 #define CONFIG_AIC_DECODER 0
 #define CONFIG_ALIAS_PIX_DECODER 0
+#define CONFIG_AGM_DECODER 0
 #define CONFIG_AMV_DECODER 0
 #define CONFIG_ANM_DECODER 0
 #define CONFIG_ANSI_DECODER 0
 #define CONFIG_APNG_DECODER 0
+#define CONFIG_ARBC_DECODER 0
 #define CONFIG_ASV1_DECODER 0
 #define CONFIG_ASV2_DECODER 0
 #define CONFIG_AURA_DECODER 0
@@ -729,6 +755,7 @@
 #define CONFIG_C93_DECODER 0
 #define CONFIG_CAVS_DECODER 0
 #define CONFIG_CDGRAPHICS_DECODER 0
+#define CONFIG_CDTOONS_DECODER 0
 #define CONFIG_CDXL_DECODER 0
 #define CONFIG_CFHD_DECODER 0
 #define CONFIG_CINEPAK_DECODER 0
@@ -797,9 +824,11 @@
 #define CONFIG_HQ_HQA_DECODER 0
 #define CONFIG_HQX_DECODER 0
 #define CONFIG_HUFFYUV_DECODER 0
+#define CONFIG_HYMT_DECODER 0
 #define CONFIG_IDCIN_DECODER 0
 #define CONFIG_IFF_ILBM_DECODER 0
 #define CONFIG_IMM4_DECODER 0
+#define CONFIG_IMM5_DECODER 0
 #define CONFIG_INDEO2_DECODER 0
 #define CONFIG_INDEO3_DECODER 0
 #define CONFIG_INDEO4_DECODER 0
@@ -812,6 +841,7 @@
 #define CONFIG_KMVC_DECODER 0
 #define CONFIG_LAGARITH_DECODER 0
 #define CONFIG_LOCO_DECODER 0
+#define CONFIG_LSCR_DECODER 0
 #define CONFIG_M101_DECODER 0
 #define CONFIG_MAGICYUV_DECODER 0
 #define CONFIG_MDEC_DECODER 0
@@ -845,8 +875,11 @@
 #define CONFIG_MSVIDEO1_DECODER 0
 #define CONFIG_MSZH_DECODER 0
 #define CONFIG_MTS2_DECODER 0
+#define CONFIG_MV30_DECODER 0
 #define CONFIG_MVC1_DECODER 0
 #define CONFIG_MVC2_DECODER 0
+#define CONFIG_MVDV_DECODER 0
+#define CONFIG_MVHA_DECODER 0
 #define CONFIG_MWSC_DECODER 0
 #define CONFIG_MXPEG_DECODER 0
 #define CONFIG_NUV_DECODER 0
@@ -883,7 +916,6 @@
 #define CONFIG_SANM_DECODER 0
 #define CONFIG_SCPR_DECODER 0
 #define CONFIG_SCREENPRESSO_DECODER 0
-#define CONFIG_SDX2_DPCM_DECODER 0
 #define CONFIG_SGI_DECODER 0
 #define CONFIG_SGIRLE_DECODER 0
 #define CONFIG_SHEERVIDEO_DECODER 0
@@ -930,6 +962,7 @@
 #define CONFIG_VMDVIDEO_DECODER 0
 #define CONFIG_VMNC_DECODER 0
 #define CONFIG_VP3_DECODER 1
+#define CONFIG_VP4_DECODER 0
 #define CONFIG_VP5_DECODER 0
 #define CONFIG_VP6_DECODER 0
 #define CONFIG_VP6A_DECODER 0
@@ -971,6 +1004,7 @@
 #define CONFIG_AAC_LATM_DECODER 0
 #define CONFIG_AC3_DECODER 0
 #define CONFIG_AC3_FIXED_DECODER 0
+#define CONFIG_ACELP_KELVIN_DECODER 0
 #define CONFIG_ALAC_DECODER 0
 #define CONFIG_ALS_DECODER 0
 #define CONFIG_AMRNB_DECODER 0
@@ -1005,6 +1039,8 @@
 #define CONFIG_G729_DECODER 0
 #define CONFIG_GSM_DECODER 0
 #define CONFIG_GSM_MS_DECODER 0
+#define CONFIG_HCA_DECODER 0
+#define CONFIG_HCOM_DECODER 0
 #define CONFIG_IAC_DECODER 0
 #define CONFIG_ILBC_DECODER 0
 #define CONFIG_IMC_DECODER 0
@@ -1038,6 +1074,7 @@
 #define CONFIG_SBC_DECODER 1
 #define CONFIG_SHORTEN_DECODER 0
 #define CONFIG_SIPR_DECODER 0
+#define CONFIG_SIREN_DECODER 0
 #define CONFIG_SMACKAUD_DECODER 0
 #define CONFIG_SONIC_DECODER 0
 #define CONFIG_TAK_DECODER 0
@@ -1089,16 +1126,20 @@
 #define CONFIG_PCM_U24LE_DECODER 0
 #define CONFIG_PCM_U32BE_DECODER 0
 #define CONFIG_PCM_U32LE_DECODER 0
-#define CONFIG_PCM_ZORK_DECODER 0
+#define CONFIG_PCM_VIDC_DECODER 0
+#define CONFIG_DERF_DPCM_DECODER 0
 #define CONFIG_GREMLIN_DPCM_DECODER 0
 #define CONFIG_INTERPLAY_DPCM_DECODER 0
 #define CONFIG_ROQ_DPCM_DECODER 0
+#define CONFIG_SDX2_DPCM_DECODER 0
 #define CONFIG_SOL_DPCM_DECODER 0
 #define CONFIG_XAN_DPCM_DECODER 0
 #define CONFIG_ADPCM_4XM_DECODER 0
 #define CONFIG_ADPCM_ADX_DECODER 0
 #define CONFIG_ADPCM_AFC_DECODER 0
+#define CONFIG_ADPCM_AGM_DECODER 0
 #define CONFIG_ADPCM_AICA_DECODER 0
+#define CONFIG_ADPCM_ARGO_DECODER 0
 #define CONFIG_ADPCM_CT_DECODER 0
 #define CONFIG_ADPCM_DTK_DECODER 0
 #define CONFIG_ADPCM_EA_DECODER 0
@@ -1111,16 +1152,20 @@
 #define CONFIG_ADPCM_G726_DECODER 0
 #define CONFIG_ADPCM_G726LE_DECODER 0
 #define CONFIG_ADPCM_IMA_AMV_DECODER 0
+#define CONFIG_ADPCM_IMA_ALP_DECODER 0
 #define CONFIG_ADPCM_IMA_APC_DECODER 0
+#define CONFIG_ADPCM_IMA_APM_DECODER 0
 #define CONFIG_ADPCM_IMA_DAT4_DECODER 0
 #define CONFIG_ADPCM_IMA_DK3_DECODER 0
 #define CONFIG_ADPCM_IMA_DK4_DECODER 0
 #define CONFIG_ADPCM_IMA_EA_EACS_DECODER 0
 #define CONFIG_ADPCM_IMA_EA_SEAD_DECODER 0
 #define CONFIG_ADPCM_IMA_ISS_DECODER 0
+#define CONFIG_ADPCM_IMA_MTF_DECODER 0
 #define CONFIG_ADPCM_IMA_OKI_DECODER 0
 #define CONFIG_ADPCM_IMA_QT_DECODER 0
 #define CONFIG_ADPCM_IMA_RAD_DECODER 0
+#define CONFIG_ADPCM_IMA_SSI_DECODER 0
 #define CONFIG_ADPCM_IMA_SMJPEG_DECODER 0
 #define CONFIG_ADPCM_IMA_WAV_DECODER 0
 #define CONFIG_ADPCM_IMA_WS_DECODER 0
@@ -1136,6 +1181,7 @@
 #define CONFIG_ADPCM_VIMA_DECODER 0
 #define CONFIG_ADPCM_XA_DECODER 0
 #define CONFIG_ADPCM_YAMAHA_DECODER 0
+#define CONFIG_ADPCM_ZORK_DECODER 0
 #define CONFIG_SSA_DECODER 0
 #define CONFIG_ASS_DECODER 0
 #define CONFIG_CCAPTION_DECODER 0
@@ -1173,9 +1219,10 @@
 #define CONFIG_PCM_MULAW_AT_DECODER 0
 #define CONFIG_QDMC_AT_DECODER 0
 #define CONFIG_QDM2_AT_DECODER 0
-#define CONFIG_LIBAOM_AV1_DECODER 0
+#define CONFIG_LIBARIBB24_DECODER 0
 #define CONFIG_LIBCELT_DECODER 0
 #define CONFIG_LIBCODEC2_DECODER 0
+#define CONFIG_LIBDAV1D_DECODER 0
 #define CONFIG_LIBDAVS2_DECODER 0
 #define CONFIG_LIBFDK_AAC_DECODER 0
 #define CONFIG_LIBGSM_DECODER 0
@@ -1194,11 +1241,13 @@
 #define CONFIG_BINTEXT_DECODER 0
 #define CONFIG_XBIN_DECODER 0
 #define CONFIG_IDF_DECODER 0
+#define CONFIG_LIBAOM_AV1_DECODER 0
 #define CONFIG_LIBOPENH264_DECODER 0
 #define CONFIG_H264_CUVID_DECODER 0
 #define CONFIG_HEVC_CUVID_DECODER 0
 #define CONFIG_HEVC_MEDIACODEC_DECODER 0
 #define CONFIG_MJPEG_CUVID_DECODER 0
+#define CONFIG_MJPEG_QSV_DECODER 0
 #define CONFIG_MPEG1_CUVID_DECODER 0
 #define CONFIG_MPEG2_CUVID_DECODER 0
 #define CONFIG_MPEG4_CUVID_DECODER 0
@@ -1209,6 +1258,7 @@
 #define CONFIG_VP8_QSV_DECODER 0
 #define CONFIG_VP9_CUVID_DECODER 0
 #define CONFIG_VP9_MEDIACODEC_DECODER 0
+#define CONFIG_VP9_QSV_DECODER 0
 #define CONFIG_A64MULTI_ENCODER 0
 #define CONFIG_A64MULTI5_ENCODER 0
 #define CONFIG_ALIAS_PIX_ENCODER 0
@@ -1315,6 +1365,7 @@
 #define CONFIG_WMAV1_ENCODER 0
 #define CONFIG_WMAV2_ENCODER 0
 #define CONFIG_PCM_ALAW_ENCODER 0
+#define CONFIG_PCM_DVD_ENCODER 0
 #define CONFIG_PCM_F32BE_ENCODER 0
 #define CONFIG_PCM_F32LE_ENCODER 0
 #define CONFIG_PCM_F64BE_ENCODER 0
@@ -1342,6 +1393,7 @@
 #define CONFIG_PCM_U24LE_ENCODER 0
 #define CONFIG_PCM_U32BE_ENCODER 0
 #define CONFIG_PCM_U32LE_ENCODER 0
+#define CONFIG_PCM_VIDC_ENCODER 0
 #define CONFIG_ROQ_DPCM_ENCODER 0
 #define CONFIG_ADPCM_ADX_ENCODER 0
 #define CONFIG_ADPCM_G722_ENCODER 0
@@ -1377,6 +1429,7 @@
 #define CONFIG_LIBOPENCORE_AMRNB_ENCODER 0
 #define CONFIG_LIBOPENJPEG_ENCODER 0
 #define CONFIG_LIBOPUS_ENCODER 0
+#define CONFIG_LIBRAV1E_ENCODER 0
 #define CONFIG_LIBSHINE_ENCODER 0
 #define CONFIG_LIBSPEEX_ENCODER 0
 #define CONFIG_LIBTHEORA_ENCODER 0
@@ -1418,10 +1471,12 @@
 #define CONFIG_MJPEG_VAAPI_ENCODER 0
 #define CONFIG_MPEG2_QSV_ENCODER 0
 #define CONFIG_MPEG2_VAAPI_ENCODER 0
+#define CONFIG_MPEG4_OMX_ENCODER 0
 #define CONFIG_MPEG4_V4L2M2M_ENCODER 0
 #define CONFIG_VP8_V4L2M2M_ENCODER 0
 #define CONFIG_VP8_VAAPI_ENCODER 0
 #define CONFIG_VP9_VAAPI_ENCODER 0
+#define CONFIG_VP9_QSV_ENCODER 0
 #define CONFIG_H263_VAAPI_HWACCEL 0
 #define CONFIG_H263_VIDEOTOOLBOX_HWACCEL 0
 #define CONFIG_H264_D3D11VA_HWACCEL 0
@@ -1469,6 +1524,7 @@
 #define CONFIG_VP9_DXVA2_HWACCEL 0
 #define CONFIG_VP9_NVDEC_HWACCEL 0
 #define CONFIG_VP9_VAAPI_HWACCEL 0
+#define CONFIG_VP9_VDPAU_HWACCEL 0
 #define CONFIG_WMV3_D3D11VA_HWACCEL 0
 #define CONFIG_WMV3_D3D11VA2_HWACCEL 0
 #define CONFIG_WMV3_DXVA2_HWACCEL 0
@@ -1493,7 +1549,9 @@
 #define CONFIG_DVDSUB_PARSER 0
 #define CONFIG_DVD_NAV_PARSER 0
 #define CONFIG_FLAC_PARSER 1
+#define CONFIG_G723_1_PARSER 0
 #define CONFIG_G729_PARSER 0
+#define CONFIG_GIF_PARSER 0
 #define CONFIG_GSM_PARSER 0
 #define CONFIG_H261_PARSER 0
 #define CONFIG_H263_PARSER 0
@@ -1517,13 +1575,13 @@
 #define CONFIG_VP3_PARSER 1
 #define CONFIG_VP8_PARSER 1
 #define CONFIG_VP9_PARSER 1
+#define CONFIG_WEBP_PARSER 0
 #define CONFIG_XMA_PARSER 0
 #define CONFIG_ALSA_INDEV 0
 #define CONFIG_ANDROID_CAMERA_INDEV 0
 #define CONFIG_AVFOUNDATION_INDEV 0
 #define CONFIG_BKTR_INDEV 0
 #define CONFIG_DECKLINK_INDEV 0
-#define CONFIG_LIBNDI_NEWTEK_INDEV 0
 #define CONFIG_DSHOW_INDEV 0
 #define CONFIG_FBDEV_INDEV 0
 #define CONFIG_GDIGRAB_INDEV 0
@@ -1543,7 +1601,6 @@
 #define CONFIG_ALSA_OUTDEV 0
 #define CONFIG_CACA_OUTDEV 0
 #define CONFIG_DECKLINK_OUTDEV 0
-#define CONFIG_LIBNDI_NEWTEK_OUTDEV 0
 #define CONFIG_FBDEV_OUTDEV 0
 #define CONFIG_OPENGL_OUTDEV 0
 #define CONFIG_OSS_OUTDEV 0
@@ -1584,6 +1641,8 @@
 #define CONFIG_AMIX_FILTER 0
 #define CONFIG_AMULTIPLY_FILTER 0
 #define CONFIG_ANEQUALIZER_FILTER 0
+#define CONFIG_ANLMDN_FILTER 0
+#define CONFIG_ANLMS_FILTER 0
 #define CONFIG_ANULL_FILTER 0
 #define CONFIG_APAD_FILTER 0
 #define CONFIG_APERMS_FILTER 0
@@ -1592,6 +1651,7 @@
 #define CONFIG_AREALTIME_FILTER 0
 #define CONFIG_ARESAMPLE_FILTER 0
 #define CONFIG_AREVERSE_FILTER 0
+#define CONFIG_ARNNDN_FILTER 0
 #define CONFIG_ASELECT_FILTER 0
 #define CONFIG_ASENDCMD_FILTER 0
 #define CONFIG_ASETNSAMPLES_FILTER 0
@@ -1600,17 +1660,21 @@
 #define CONFIG_ASETTB_FILTER 0
 #define CONFIG_ASHOWINFO_FILTER 0
 #define CONFIG_ASIDEDATA_FILTER 0
+#define CONFIG_ASOFTCLIP_FILTER 0
 #define CONFIG_ASPLIT_FILTER 0
+#define CONFIG_ASR_FILTER 0
 #define CONFIG_ASTATS_FILTER 0
 #define CONFIG_ASTREAMSELECT_FILTER 0
 #define CONFIG_ATEMPO_FILTER 0
 #define CONFIG_ATRIM_FILTER 0
+#define CONFIG_AXCORRELATE_FILTER 0
 #define CONFIG_AZMQ_FILTER 0
 #define CONFIG_BANDPASS_FILTER 0
 #define CONFIG_BANDREJECT_FILTER 0
 #define CONFIG_BASS_FILTER 0
 #define CONFIG_BIQUAD_FILTER 0
 #define CONFIG_BS2B_FILTER 0
+#define CONFIG_CHROMABER_VULKAN_FILTER 0
 #define CONFIG_CHANNELMAP_FILTER 0
 #define CONFIG_CHANNELSPLIT_FILTER 0
 #define CONFIG_CHORUS_FILTER 0
@@ -1619,6 +1683,7 @@
 #define CONFIG_CROSSFEED_FILTER 0
 #define CONFIG_CRYSTALIZER_FILTER 0
 #define CONFIG_DCSHIFT_FILTER 0
+#define CONFIG_DEESSER_FILTER 0
 #define CONFIG_DRMETER_FILTER 0
 #define CONFIG_DYNAUDNORM_FILTER 0
 #define CONFIG_EARWAX_FILTER 0
@@ -1658,12 +1723,15 @@
 #define CONFIG_VOLUME_FILTER 0
 #define CONFIG_VOLUMEDETECT_FILTER 0
 #define CONFIG_AEVALSRC_FILTER 0
+#define CONFIG_AFIRSRC_FILTER 0
 #define CONFIG_ANOISESRC_FILTER 0
 #define CONFIG_ANULLSRC_FILTER 0
 #define CONFIG_FLITE_FILTER 0
 #define CONFIG_HILBERT_FILTER 0
+#define CONFIG_SINC_FILTER 0
 #define CONFIG_SINE_FILTER 0
 #define CONFIG_ANULLSINK_FILTER 0
+#define CONFIG_ADDROI_FILTER 0
 #define CONFIG_ALPHAEXTRACT_FILTER 0
 #define CONFIG_ALPHAMERGE_FILTER 0
 #define CONFIG_AMPLIFY_FILTER 0
@@ -1671,8 +1739,10 @@
 #define CONFIG_ATADENOISE_FILTER 0
 #define CONFIG_AVGBLUR_FILTER 0
 #define CONFIG_AVGBLUR_OPENCL_FILTER 0
+#define CONFIG_AVGBLUR_VULKAN_FILTER 0
 #define CONFIG_BBOX_FILTER 0
 #define CONFIG_BENCH_FILTER 0
+#define CONFIG_BILATERAL_FILTER 0
 #define CONFIG_BITPLANENOISE_FILTER 0
 #define CONFIG_BLACKDETECT_FILTER 0
 #define CONFIG_BLACKFRAME_FILTER 0
@@ -1681,12 +1751,17 @@
 #define CONFIG_BOXBLUR_FILTER 0
 #define CONFIG_BOXBLUR_OPENCL_FILTER 0
 #define CONFIG_BWDIF_FILTER 0
+#define CONFIG_CAS_FILTER 0
+#define CONFIG_CHROMAHOLD_FILTER 0
 #define CONFIG_CHROMAKEY_FILTER 0
+#define CONFIG_CHROMASHIFT_FILTER 0
 #define CONFIG_CIESCOPE_FILTER 0
 #define CONFIG_CODECVIEW_FILTER 0
 #define CONFIG_COLORBALANCE_FILTER 0
 #define CONFIG_COLORCHANNELMIXER_FILTER 0
 #define CONFIG_COLORKEY_FILTER 0
+#define CONFIG_COLORKEY_OPENCL_FILTER 0
+#define CONFIG_COLORHOLD_FILTER 0
 #define CONFIG_COLORLEVELS_FILTER 0
 #define CONFIG_COLORMATRIX_FILTER 0
 #define CONFIG_COLORSPACE_FILTER 0
@@ -1706,6 +1781,7 @@
 #define CONFIG_DEBLOCK_FILTER 0
 #define CONFIG_DECIMATE_FILTER 0
 #define CONFIG_DECONVOLVE_FILTER 0
+#define CONFIG_DEDOT_FILTER 0
 #define CONFIG_DEFLATE_FILTER 0
 #define CONFIG_DEFLICKER_FILTER 0
 #define CONFIG_DEINTERLACE_QSV_FILTER 0
@@ -1713,12 +1789,15 @@
 #define CONFIG_DEJUDDER_FILTER 0
 #define CONFIG_DELOGO_FILTER 0
 #define CONFIG_DENOISE_VAAPI_FILTER 0
+#define CONFIG_DERAIN_FILTER 0
 #define CONFIG_DESHAKE_FILTER 0
+#define CONFIG_DESHAKE_OPENCL_FILTER 0
 #define CONFIG_DESPILL_FILTER 0
 #define CONFIG_DETELECINE_FILTER 0
 #define CONFIG_DILATION_FILTER 0
 #define CONFIG_DILATION_OPENCL_FILTER 0
 #define CONFIG_DISPLACE_FILTER 0
+#define CONFIG_DNN_PROCESSING_FILTER 0
 #define CONFIG_DOUBLEWEAVE_FILTER 0
 #define CONFIG_DRAWBOX_FILTER 0
 #define CONFIG_DRAWGRAPH_FILTER 0
@@ -1746,11 +1825,14 @@
 #define CONFIG_FRAMEPACK_FILTER 0
 #define CONFIG_FRAMERATE_FILTER 0
 #define CONFIG_FRAMESTEP_FILTER 0
+#define CONFIG_FREEZEDETECT_FILTER 0
+#define CONFIG_FREEZEFRAMES_FILTER 0
 #define CONFIG_FREI0R_FILTER 0
 #define CONFIG_FSPP_FILTER 0
 #define CONFIG_GBLUR_FILTER 0
 #define CONFIG_GEQ_FILTER 0
 #define CONFIG_GRADFUN_FILTER 0
+#define CONFIG_GRAPHMONITOR_FILTER 0
 #define CONFIG_GREYEDGE_FILTER 0
 #define CONFIG_HALDCLUT_FILTER 0
 #define CONFIG_HFLIP_FILTER 0
@@ -1771,6 +1853,7 @@
 #define CONFIG_INTERLACE_FILTER 0
 #define CONFIG_INTERLEAVE_FILTER 0
 #define CONFIG_KERNDEINT_FILTER 0
+#define CONFIG_LAGFUN_FILTER 0
 #define CONFIG_LENSCORRECTION_FILTER 0
 #define CONFIG_LENSFUN_FILTER 0
 #define CONFIG_LIBVMAF_FILTER 0
@@ -1784,8 +1867,13 @@
 #define CONFIG_LUTRGB_FILTER 0
 #define CONFIG_LUTYUV_FILTER 0
 #define CONFIG_MASKEDCLAMP_FILTER 0
+#define CONFIG_MASKEDMAX_FILTER 0
 #define CONFIG_MASKEDMERGE_FILTER 0
+#define CONFIG_MASKEDMIN_FILTER 0
+#define CONFIG_MASKEDTHRESHOLD_FILTER 0
+#define CONFIG_MASKFUN_FILTER 0
 #define CONFIG_MCDEINT_FILTER 0
+#define CONFIG_MEDIAN_FILTER 0
 #define CONFIG_MERGEPLANES_FILTER 0
 #define CONFIG_MESTIMATE_FILTER 0
 #define CONFIG_METADATA_FILTER 0
@@ -1795,6 +1883,7 @@
 #define CONFIG_MPDECIMATE_FILTER 0
 #define CONFIG_NEGATE_FILTER 0
 #define CONFIG_NLMEANS_FILTER 0
+#define CONFIG_NLMEANS_OPENCL_FILTER 0
 #define CONFIG_NNEDI_FILTER 0
 #define CONFIG_NOFORMAT_FILTER 0
 #define CONFIG_NOISE_FILTER 0
@@ -1806,13 +1895,17 @@
 #define CONFIG_OVERLAY_FILTER 0
 #define CONFIG_OVERLAY_OPENCL_FILTER 0
 #define CONFIG_OVERLAY_QSV_FILTER 0
+#define CONFIG_OVERLAY_VULKAN_FILTER 0
+#define CONFIG_OVERLAY_CUDA_FILTER 0
 #define CONFIG_OWDENOISE_FILTER 0
 #define CONFIG_PAD_FILTER 0
+#define CONFIG_PAD_OPENCL_FILTER 0
 #define CONFIG_PALETTEGEN_FILTER 0
 #define CONFIG_PALETTEUSE_FILTER 0
 #define CONFIG_PERMS_FILTER 0
 #define CONFIG_PERSPECTIVE_FILTER 0
 #define CONFIG_PHASE_FILTER 0
+#define CONFIG_PHOTOSENSITIVITY_FILTER 0
 #define CONFIG_PIXDESCTEST_FILTER 0
 #define CONFIG_PIXSCOPE_FILTER 0
 #define CONFIG_PP_FILTER 0
@@ -1835,6 +1928,7 @@
 #define CONFIG_REMOVELOGO_FILTER 0
 #define CONFIG_REPEATFIELDS_FILTER 0
 #define CONFIG_REVERSE_FILTER 0
+#define CONFIG_RGBASHIFT_FILTER 0
 #define CONFIG_ROBERTS_FILTER 0
 #define CONFIG_ROBERTS_OPENCL_FILTER 0
 #define CONFIG_ROTATE_FILTER 0
@@ -1844,13 +1938,16 @@
 #define CONFIG_SCALE_NPP_FILTER 0
 #define CONFIG_SCALE_QSV_FILTER 0
 #define CONFIG_SCALE_VAAPI_FILTER 0
+#define CONFIG_SCALE_VULKAN_FILTER 0
 #define CONFIG_SCALE2REF_FILTER 0
+#define CONFIG_SCROLL_FILTER 0
 #define CONFIG_SELECT_FILTER 0
 #define CONFIG_SELECTIVECOLOR_FILTER 0
 #define CONFIG_SENDCMD_FILTER 0
 #define CONFIG_SEPARATEFIELDS_FILTER 0
 #define CONFIG_SETDAR_FILTER 0
 #define CONFIG_SETFIELD_FILTER 0
+#define CONFIG_SETPARAMS_FILTER 0
 #define CONFIG_SETPTS_FILTER 0
 #define CONFIG_SETRANGE_FILTER 0
 #define CONFIG_SETSAR_FILTER 0
@@ -1878,26 +1975,34 @@
 #define CONFIG_SWAPUV_FILTER 0
 #define CONFIG_TBLEND_FILTER 0
 #define CONFIG_TELECINE_FILTER 0
+#define CONFIG_THISTOGRAM_FILTER 0
 #define CONFIG_THRESHOLD_FILTER 0
 #define CONFIG_THUMBNAIL_FILTER 0
 #define CONFIG_THUMBNAIL_CUDA_FILTER 0
 #define CONFIG_TILE_FILTER 0
 #define CONFIG_TINTERLACE_FILTER 0
 #define CONFIG_TLUT2_FILTER 0
+#define CONFIG_TMEDIAN_FILTER 0
 #define CONFIG_TMIX_FILTER 0
 #define CONFIG_TONEMAP_FILTER 0
 #define CONFIG_TONEMAP_OPENCL_FILTER 0
+#define CONFIG_TONEMAP_VAAPI_FILTER 0
+#define CONFIG_TPAD_FILTER 0
 #define CONFIG_TRANSPOSE_FILTER 0
 #define CONFIG_TRANSPOSE_NPP_FILTER 0
+#define CONFIG_TRANSPOSE_OPENCL_FILTER 0
+#define CONFIG_TRANSPOSE_VAAPI_FILTER 0
 #define CONFIG_TRIM_FILTER 0
 #define CONFIG_UNPREMULTIPLY_FILTER 0
 #define CONFIG_UNSHARP_FILTER 0
 #define CONFIG_UNSHARP_OPENCL_FILTER 0
 #define CONFIG_USPP_FILTER 0
+#define CONFIG_V360_FILTER 0
 #define CONFIG_VAGUEDENOISER_FILTER 0
 #define CONFIG_VECTORSCOPE_FILTER 0
 #define CONFIG_VFLIP_FILTER 0
 #define CONFIG_VFRDET_FILTER 0
+#define CONFIG_VIBRANCE_FILTER 0
 #define CONFIG_VIDSTABDETECT_FILTER 0
 #define CONFIG_VIDSTABTRANSFORM_FILTER 0
 #define CONFIG_VIGNETTE_FILTER 0
@@ -1908,7 +2013,13 @@
 #define CONFIG_WAVEFORM_FILTER 0
 #define CONFIG_WEAVE_FILTER 0
 #define CONFIG_XBR_FILTER 0
+#define CONFIG_XFADE_FILTER 0
+#define CONFIG_XFADE_OPENCL_FILTER 0
+#define CONFIG_XMEDIAN_FILTER 0
+#define CONFIG_XSTACK_FILTER 0
 #define CONFIG_YADIF_FILTER 0
+#define CONFIG_YADIF_CUDA_FILTER 0
+#define CONFIG_YAEPBLUR_FILTER 0
 #define CONFIG_ZMQ_FILTER 0
 #define CONFIG_ZOOMPAN_FILTER 0
 #define CONFIG_ZSCALE_FILTER 0
@@ -1927,6 +2038,7 @@
 #define CONFIG_PAL75BARS_FILTER 0
 #define CONFIG_PAL100BARS_FILTER 0
 #define CONFIG_RGBTESTSRC_FILTER 0
+#define CONFIG_SIERPINSKI_FILTER 0
 #define CONFIG_SMPTEBARS_FILTER 0
 #define CONFIG_SMPTEHDBARS_FILTER 0
 #define CONFIG_TESTSRC_FILTER 0
@@ -1935,12 +2047,14 @@
 #define CONFIG_NULLSINK_FILTER 0
 #define CONFIG_ABITSCOPE_FILTER 0
 #define CONFIG_ADRAWGRAPH_FILTER 0
+#define CONFIG_AGRAPHMONITOR_FILTER 0
 #define CONFIG_AHISTOGRAM_FILTER 0
 #define CONFIG_APHASEMETER_FILTER 0
 #define CONFIG_AVECTORSCOPE_FILTER 0
 #define CONFIG_CONCAT_FILTER 0
 #define CONFIG_SHOWCQT_FILTER 0
 #define CONFIG_SHOWFREQS_FILTER 0
+#define CONFIG_SHOWSPATIAL_FILTER 0
 #define CONFIG_SHOWSPECTRUM_FILTER 0
 #define CONFIG_SHOWSPECTRUMPIC_FILTER 0
 #define CONFIG_SHOWVOLUME_FILTER 0
@@ -1964,21 +2078,25 @@
 #define CONFIG_AFC_DEMUXER 0
 #define CONFIG_AIFF_DEMUXER 0
 #define CONFIG_AIX_DEMUXER 0
+#define CONFIG_ALP_DEMUXER 0
 #define CONFIG_AMR_DEMUXER 0
 #define CONFIG_AMRNB_DEMUXER 0
 #define CONFIG_AMRWB_DEMUXER 0
 #define CONFIG_ANM_DEMUXER 0
 #define CONFIG_APC_DEMUXER 0
 #define CONFIG_APE_DEMUXER 0
+#define CONFIG_APM_DEMUXER 0
 #define CONFIG_APNG_DEMUXER 0
 #define CONFIG_APTX_DEMUXER 0
 #define CONFIG_APTX_HD_DEMUXER 0
 #define CONFIG_AQTITLE_DEMUXER 0
+#define CONFIG_ARGO_ASF_DEMUXER 0
 #define CONFIG_ASF_DEMUXER 0
 #define CONFIG_ASF_O_DEMUXER 0
 #define CONFIG_ASS_DEMUXER 0
 #define CONFIG_AST_DEMUXER 0
 #define CONFIG_AU_DEMUXER 0
+#define CONFIG_AV1_DEMUXER 0
 #define CONFIG_AVI_DEMUXER 0
 #define CONFIG_AVISYNTH_DEMUXER 0
 #define CONFIG_AVR_DEMUXER 0
@@ -2006,7 +2124,9 @@
 #define CONFIG_DATA_DEMUXER 0
 #define CONFIG_DAUD_DEMUXER 0
 #define CONFIG_DCSTR_DEMUXER 0
+#define CONFIG_DERF_DEMUXER 0
 #define CONFIG_DFA_DEMUXER 0
+#define CONFIG_DHAV_DEMUXER 0
 #define CONFIG_DIRAC_DEMUXER 0
 #define CONFIG_DNXHD_DEMUXER 0
 #define CONFIG_DSF_DEMUXER 0
@@ -2032,6 +2152,7 @@
 #define CONFIG_FOURXM_DEMUXER 0
 #define CONFIG_FRM_DEMUXER 0
 #define CONFIG_FSB_DEMUXER 0
+#define CONFIG_FWSE_DEMUXER 0
 #define CONFIG_G722_DEMUXER 0
 #define CONFIG_G723_1_DEMUXER 0
 #define CONFIG_G726_DEMUXER 0
@@ -2045,6 +2166,8 @@
 #define CONFIG_H261_DEMUXER 0
 #define CONFIG_H263_DEMUXER 0
 #define CONFIG_H264_DEMUXER 0
+#define CONFIG_HCA_DEMUXER 0
+#define CONFIG_HCOM_DEMUXER 0
 #define CONFIG_HEVC_DEMUXER 0
 #define CONFIG_HLS_DEMUXER 0
 #define CONFIG_HNM_DEMUXER 0
@@ -2052,6 +2175,7 @@
 #define CONFIG_IDCIN_DEMUXER 0
 #define CONFIG_IDF_DEMUXER 0
 #define CONFIG_IFF_DEMUXER 0
+#define CONFIG_IFV_DEMUXER 0
 #define CONFIG_ILBC_DEMUXER 0
 #define CONFIG_IMAGE2_DEMUXER 0
 #define CONFIG_IMAGE2PIPE_DEMUXER 0
@@ -2066,6 +2190,8 @@
 #define CONFIG_IVR_DEMUXER 0
 #define CONFIG_JACOSUB_DEMUXER 0
 #define CONFIG_JV_DEMUXER 0
+#define CONFIG_KUX_DEMUXER 0
+#define CONFIG_KVAG_DEMUXER 0
 #define CONFIG_LMLM4_DEMUXER 0
 #define CONFIG_LOAS_DEMUXER 0
 #define CONFIG_LRC_DEMUXER 0
@@ -2112,6 +2238,7 @@
 #define CONFIG_PAF_DEMUXER 0
 #define CONFIG_PCM_ALAW_DEMUXER 0
 #define CONFIG_PCM_MULAW_DEMUXER 0
+#define CONFIG_PCM_VIDC_DEMUXER 0
 #define CONFIG_PCM_F64BE_DEMUXER 0
 #define CONFIG_PCM_F64LE_DEMUXER 0
 #define CONFIG_PCM_F32BE_DEMUXER 0
@@ -2192,6 +2319,7 @@
 #define CONFIG_VAG_DEMUXER 0
 #define CONFIG_VC1_DEMUXER 0
 #define CONFIG_VC1T_DEMUXER 0
+#define CONFIG_VIVIDAS_DEMUXER 0
 #define CONFIG_VIVO_DEMUXER 0
 #define CONFIG_VMD_DEMUXER 0
 #define CONFIG_VOBSUB_DEMUXER 0
@@ -2221,6 +2349,7 @@
 #define CONFIG_IMAGE_DDS_PIPE_DEMUXER 0
 #define CONFIG_IMAGE_DPX_PIPE_DEMUXER 0
 #define CONFIG_IMAGE_EXR_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_GIF_PIPE_DEMUXER 0
 #define CONFIG_IMAGE_J2K_PIPE_DEMUXER 0
 #define CONFIG_IMAGE_JPEG_PIPE_DEMUXER 0
 #define CONFIG_IMAGE_JPEGLS_PIPE_DEMUXER 0
@@ -2345,6 +2474,7 @@
 #define CONFIG_OPUS_MUXER 0
 #define CONFIG_PCM_ALAW_MUXER 0
 #define CONFIG_PCM_MULAW_MUXER 0
+#define CONFIG_PCM_VIDC_MUXER 0
 #define CONFIG_PCM_F64BE_MUXER 0
 #define CONFIG_PCM_F64LE_MUXER 0
 #define CONFIG_PCM_F32BE_MUXER 0
@@ -2384,6 +2514,7 @@
 #define CONFIG_SPX_MUXER 0
 #define CONFIG_SPDIF_MUXER 0
 #define CONFIG_SRT_MUXER 0
+#define CONFIG_STREAMHASH_MUXER 0
 #define CONFIG_SUP_MUXER 0
 #define CONFIG_SWF_MUXER 0
 #define CONFIG_TEE_MUXER 0
@@ -2444,6 +2575,7 @@
 #define CONFIG_UDP_PROTOCOL 0
 #define CONFIG_UDPLITE_PROTOCOL 0
 #define CONFIG_UNIX_PROTOCOL 0
+#define CONFIG_LIBAMQP_PROTOCOL 0
 #define CONFIG_LIBRTMP_PROTOCOL 0
 #define CONFIG_LIBRTMPE_PROTOCOL 0
 #define CONFIG_LIBRTMPS_PROTOCOL 0
@@ -2452,4 +2584,5 @@
 #define CONFIG_LIBSRT_PROTOCOL 0
 #define CONFIG_LIBSSH_PROTOCOL 0
 #define CONFIG_LIBSMBCLIENT_PROTOCOL 0
+#define CONFIG_LIBZMQ_PROTOCOL 0
 #endif /* FFMPEG_CONFIG_H */
diff --git a/fuchsia/config/default/x64/libavutil/ffversion.h b/fuchsia/config/default/x64/libavutil/ffversion.h
index 4585957..fc76199 100644
--- a/fuchsia/config/default/x64/libavutil/ffversion.h
+++ b/fuchsia/config/default/x64/libavutil/ffversion.h
@@ -1,5 +1,5 @@
 /* Automatically generated by version.sh, do not manually edit! */
 #ifndef AVUTIL_FFVERSION_H
 #define AVUTIL_FFVERSION_H
-#define FFMPEG_VERSION "N-92369-g2e9f4ad959"
+#define FFMPEG_VERSION "N-97662-gaaac2c26d9"
 #endif /* AVUTIL_FFVERSION_H */
diff --git a/fuchsia/config/max/arm64/config.h b/fuchsia/config/max/arm64/config.h
index 5c2c827..9915440 100644
--- a/fuchsia/config/max/arm64/config.h
+++ b/fuchsia/config/max/arm64/config.h
@@ -3,10 +3,10 @@
 #define FFMPEG_CONFIG_H
 #define FFMPEG_CONFIGURATION "--disable-everything --disable-all --disable-doc --disable-htmlpages --disable-manpages --disable-podpages --disable-txtpages --disable-static --enable-avcodec --enable-avformat --enable-avutil --enable-fft --enable-rdft --enable-static --enable-libopus --disable-debug --disable-bzlib --disable-iconv --disable-lzo --disable-network --disable-schannel --disable-sdl2 --disable-symver --disable-xlib --disable-zlib --disable-securetransport --disable-faan --disable-alsa --disable-autodetect --enable-decoder='vorbis,libopus,flac' --enable-decoder='pcm_u8,pcm_s16le,pcm_s24le,pcm_s32le,pcm_f32le,mp3' --enable-decoder='pcm_s16be,pcm_s24be,pcm_mulaw,pcm_alaw' --enable-decoder='theora,vp8,sbc,aptx' --enable-demuxer='ogg,matroska,wav,flac,mp3,mov' --enable-parser='opus,vorbis,flac,mpegaudio' --extra-cflags=-I/usr/local/google/home/dalesat/fuchsia/third_party/opus/include --enable-parser='vp3,vp8' --optflags='\"-O2\"' --enable-pic --x86asmexe=yasm --enable-pic --enable-lto --cc=clang --cxx=clang++ --ld=clang --enable-cross-compile --cross-prefix=/usr/bin/x86_64-linux-gnu- --target-os=linux --arch=aarch64 --enable-armv8 --extra-cflags='-march=armv8-a' --sysroot=/usr/local/google/home/dalesat/fuchsia/third_party/ffmpeg/../../prebuilt/third_party/sysroot/linux --extra-cflags='--target=aarch64-linux-gnu' --extra-ldflags='--target=aarch64-linux-gnu' --disable-linux-perf --enable-decoder='aac,aac_latm,h264,mp3' --enable-demuxer='aac,mp3,mov' --enable-parser='aac,aac_latm,h264,mpegaudio' --enable-decoder=mpeg4 --enable-parser='h263,mpeg4video' --enable-demuxer=avi --enable-demuxer=amr --enable-decoder='amrnb,amrwb' --enable-decoder=gsm_ms --enable-demuxer=gsm --enable-parser=gsm"
 #define FFMPEG_LICENSE "LGPL version 2.1 or later"
-#define CONFIG_THIS_YEAR 2018
+#define CONFIG_THIS_YEAR 2020
 #define FFMPEG_DATADIR "/usr/local/share/ffmpeg"
 #define AVCONV_DATADIR "/usr/local/share/ffmpeg"
-#define CC_IDENT "Fuchsia clang version 11.0.0 (https://fuchsia.googlesource.com/a/third_party/llvm-project 6e00e3fcb082c3f19309ebc6f184ab326eec3328)"
+#define CC_IDENT "Fuchsia clang version 11.0.0 (https://fuchsia.googlesource.com/a/third_party/llvm-project dd484baffdf4a92e564c38a17d35a742e633b0e0)"
 #define av_restrict restrict
 #define EXTERN_PREFIX ""
 #define EXTERN_ASM 
@@ -80,6 +80,7 @@
 #define HAVE_MIPSDSP 0
 #define HAVE_MIPSDSPR2 0
 #define HAVE_MSA 0
+#define HAVE_MSA2 0
 #define HAVE_LOONGSON2 0
 #define HAVE_LOONGSON3 0
 #define HAVE_MMI 0
@@ -125,6 +126,7 @@
 #define HAVE_MIPSDSP_EXTERNAL 0
 #define HAVE_MIPSDSPR2_EXTERNAL 0
 #define HAVE_MSA_EXTERNAL 0
+#define HAVE_MSA2_EXTERNAL 0
 #define HAVE_LOONGSON2_EXTERNAL 0
 #define HAVE_LOONGSON3_EXTERNAL 0
 #define HAVE_MMI_EXTERNAL 0
@@ -170,6 +172,7 @@
 #define HAVE_MIPSDSP_INLINE 0
 #define HAVE_MIPSDSPR2_INLINE 0
 #define HAVE_MSA_INLINE 0
+#define HAVE_MSA2_INLINE 0
 #define HAVE_LOONGSON2_INLINE 0
 #define HAVE_LOONGSON3_INLINE 0
 #define HAVE_MMI_INLINE 0
@@ -280,10 +283,12 @@
 #define HAVE_GETADDRINFO 0
 #define HAVE_GETHRTIME 0
 #define HAVE_GETOPT 1
+#define HAVE_GETMODULEHANDLE 0
 #define HAVE_GETPROCESSAFFINITYMASK 0
 #define HAVE_GETPROCESSMEMORYINFO 0
 #define HAVE_GETPROCESSTIMES 0
 #define HAVE_GETRUSAGE 1
+#define HAVE_GETSTDHANDLE 0
 #define HAVE_GETSYSTEMTIMEASFILETIME 0
 #define HAVE_GETTIMEOFDAY 1
 #define HAVE_GLOB 1
@@ -309,6 +314,7 @@
 #define HAVE_SECITEMIMPORT 0
 #define HAVE_SETCONSOLETEXTATTRIBUTE 0
 #define HAVE_SETCONSOLECTRLHANDLER 0
+#define HAVE_SETDLLDIRECTORY 0
 #define HAVE_SETMODE 0
 #define HAVE_SETRLIMIT 1
 #define HAVE_SLEEP 0
@@ -349,6 +355,10 @@
 #define HAVE_XFORM_ASM 0
 #define HAVE_XMM_CLOBBERS 0
 #define HAVE_KCMVIDEOCODECTYPE_HEVC 0
+#define HAVE_KCVPIXELFORMATTYPE_420YPCBCR10BIPLANARVIDEORANGE 0
+#define HAVE_KCVIMAGEBUFFERTRANSFERFUNCTION_SMPTE_ST_2084_PQ 0
+#define HAVE_KCVIMAGEBUFFERTRANSFERFUNCTION_ITU_R_2100_HLG 0
+#define HAVE_KCVIMAGEBUFFERTRANSFERFUNCTION_LINEAR 0
 #define HAVE_SOCKLEN_T 0
 #define HAVE_STRUCT_ADDRINFO 0
 #define HAVE_STRUCT_GROUP_SOURCE_REQ 0
@@ -362,7 +372,7 @@
 #define HAVE_STRUCT_SOCKADDR_SA_LEN 0
 #define HAVE_STRUCT_SOCKADDR_STORAGE 0
 #define HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC 1
-#define HAVE_STRUCT_V4L2_FRMIVALENUM_DISCRETE 1
+#define HAVE_STRUCT_V4L2_FRMIVALENUM_DISCRETE 0
 #define HAVE_MAKEINFO 0
 #define HAVE_MAKEINFO_HTML 0
 #define HAVE_OPENCL_D3D11 0
@@ -379,7 +389,7 @@
 #define CONFIG_MANPAGES 0
 #define CONFIG_PODPAGES 0
 #define CONFIG_TXTPAGES 0
-#define CONFIG_AVIO_DIR_CMD_EXAMPLE 1
+#define CONFIG_AVIO_LIST_DIR_EXAMPLE 1
 #define CONFIG_AVIO_READING_EXAMPLE 1
 #define CONFIG_DECODE_AUDIO_EXAMPLE 1
 #define CONFIG_DECODE_VIDEO_EXAMPLE 1
@@ -414,11 +424,11 @@
 #define CONFIG_LIBXAVS2 0
 #define CONFIG_LIBXVID 0
 #define CONFIG_DECKLINK 0
-#define CONFIG_LIBNDI_NEWTEK 0
 #define CONFIG_LIBFDK_AAC 0
 #define CONFIG_OPENSSL 0
 #define CONFIG_LIBTLS 0
 #define CONFIG_GMP 0
+#define CONFIG_LIBARIBB24 0
 #define CONFIG_LIBLENSFUN 0
 #define CONFIG_LIBOPENCORE_AMRNB 0
 #define CONFIG_LIBOPENCORE_AMRWB 0
@@ -439,12 +449,14 @@
 #define CONFIG_LIBCACA 0
 #define CONFIG_LIBCELT 0
 #define CONFIG_LIBCODEC2 0
+#define CONFIG_LIBDAV1D 0
 #define CONFIG_LIBDC1394 0
 #define CONFIG_LIBDRM 0
 #define CONFIG_LIBFLITE 0
 #define CONFIG_LIBFONTCONFIG 0
 #define CONFIG_LIBFREETYPE 0
 #define CONFIG_LIBFRIBIDI 0
+#define CONFIG_LIBGLSLANG 0
 #define CONFIG_LIBGME 0
 #define CONFIG_LIBGSM 0
 #define CONFIG_LIBIEC61883 0
@@ -461,6 +473,8 @@
 #define CONFIG_LIBOPENMPT 0
 #define CONFIG_LIBOPUS 1
 #define CONFIG_LIBPULSE 0
+#define CONFIG_LIBRABBITMQ 0
+#define CONFIG_LIBRAV1E 0
 #define CONFIG_LIBRSVG 0
 #define CONFIG_LIBRTMP 0
 #define CONFIG_LIBSHINE 0
@@ -487,6 +501,7 @@
 #define CONFIG_MEDIACODEC 0
 #define CONFIG_OPENAL 0
 #define CONFIG_OPENGL 0
+#define CONFIG_POCKETSPHINX 0
 #define CONFIG_VAPOURSYNTH 0
 #define CONFIG_ALSA 0
 #define CONFIG_APPKIT 0
@@ -505,16 +520,19 @@
 #define CONFIG_SNDIO 0
 #define CONFIG_XLIB 0
 #define CONFIG_ZLIB 0
+#define CONFIG_CUDA_NVCC 0
 #define CONFIG_CUDA_SDK 0
 #define CONFIG_LIBNPP 0
 #define CONFIG_LIBMFX 0
 #define CONFIG_MMAL 0
 #define CONFIG_OMX 0
 #define CONFIG_OPENCL 0
+#define CONFIG_VULKAN 0
 #define CONFIG_AMF 0
 #define CONFIG_AUDIOTOOLBOX 0
 #define CONFIG_CRYSTALHD 0
 #define CONFIG_CUDA 0
+#define CONFIG_CUDA_LLVM 0
 #define CONFIG_CUVID 0
 #define CONFIG_D3D11VA 0
 #define CONFIG_DXVA2 0
@@ -565,6 +583,7 @@
 #define CONFIG_RDFT 1
 #define CONFIG_AUTODETECT 0
 #define CONFIG_FONTCONFIG 0
+#define CONFIG_LARGE_TESTS 1
 #define CONFIG_LINUX_PERF 0
 #define CONFIG_MEMORY_POISONING 0
 #define CONFIG_NEON_CLOBBER_TEST 0
@@ -657,6 +676,7 @@
 #define CONFIG_RTPDEC 0
 #define CONFIG_RTPENC_CHAIN 0
 #define CONFIG_RV34DSP 0
+#define CONFIG_SCENE_SAD 0
 #define CONFIG_SINEWIN 1
 #define CONFIG_SNAPPY 0
 #define CONFIG_SRTP 0
@@ -674,6 +694,8 @@
 #define CONFIG_WMA_FREQS 0
 #define CONFIG_WMV2DSP 0
 #define CONFIG_AAC_ADTSTOASC_BSF 0
+#define CONFIG_AV1_FRAME_MERGE_BSF 0
+#define CONFIG_AV1_FRAME_SPLIT_BSF 0
 #define CONFIG_AV1_METADATA_BSF 0
 #define CONFIG_CHOMP_BSF 0
 #define CONFIG_DUMP_EXTRADATA_BSF 0
@@ -696,9 +718,11 @@
 #define CONFIG_MOV2TEXTSUB_BSF 0
 #define CONFIG_NOISE_BSF 0
 #define CONFIG_NULL_BSF 1
+#define CONFIG_PRORES_METADATA_BSF 0
 #define CONFIG_REMOVE_EXTRADATA_BSF 0
 #define CONFIG_TEXT2MOVSUB_BSF 0
 #define CONFIG_TRACE_HEADERS_BSF 0
+#define CONFIG_TRUEHD_CORE_BSF 0
 #define CONFIG_VP9_METADATA_BSF 0
 #define CONFIG_VP9_RAW_REORDER_BSF 0
 #define CONFIG_VP9_SUPERFRAME_BSF 0
@@ -706,10 +730,12 @@
 #define CONFIG_AASC_DECODER 0
 #define CONFIG_AIC_DECODER 0
 #define CONFIG_ALIAS_PIX_DECODER 0
+#define CONFIG_AGM_DECODER 0
 #define CONFIG_AMV_DECODER 0
 #define CONFIG_ANM_DECODER 0
 #define CONFIG_ANSI_DECODER 0
 #define CONFIG_APNG_DECODER 0
+#define CONFIG_ARBC_DECODER 0
 #define CONFIG_ASV1_DECODER 0
 #define CONFIG_ASV2_DECODER 0
 #define CONFIG_AURA_DECODER 0
@@ -729,6 +755,7 @@
 #define CONFIG_C93_DECODER 0
 #define CONFIG_CAVS_DECODER 0
 #define CONFIG_CDGRAPHICS_DECODER 0
+#define CONFIG_CDTOONS_DECODER 0
 #define CONFIG_CDXL_DECODER 0
 #define CONFIG_CFHD_DECODER 0
 #define CONFIG_CINEPAK_DECODER 0
@@ -797,9 +824,11 @@
 #define CONFIG_HQ_HQA_DECODER 0
 #define CONFIG_HQX_DECODER 0
 #define CONFIG_HUFFYUV_DECODER 0
+#define CONFIG_HYMT_DECODER 0
 #define CONFIG_IDCIN_DECODER 0
 #define CONFIG_IFF_ILBM_DECODER 0
 #define CONFIG_IMM4_DECODER 0
+#define CONFIG_IMM5_DECODER 0
 #define CONFIG_INDEO2_DECODER 0
 #define CONFIG_INDEO3_DECODER 0
 #define CONFIG_INDEO4_DECODER 0
@@ -812,6 +841,7 @@
 #define CONFIG_KMVC_DECODER 0
 #define CONFIG_LAGARITH_DECODER 0
 #define CONFIG_LOCO_DECODER 0
+#define CONFIG_LSCR_DECODER 0
 #define CONFIG_M101_DECODER 0
 #define CONFIG_MAGICYUV_DECODER 0
 #define CONFIG_MDEC_DECODER 0
@@ -845,8 +875,11 @@
 #define CONFIG_MSVIDEO1_DECODER 0
 #define CONFIG_MSZH_DECODER 0
 #define CONFIG_MTS2_DECODER 0
+#define CONFIG_MV30_DECODER 0
 #define CONFIG_MVC1_DECODER 0
 #define CONFIG_MVC2_DECODER 0
+#define CONFIG_MVDV_DECODER 0
+#define CONFIG_MVHA_DECODER 0
 #define CONFIG_MWSC_DECODER 0
 #define CONFIG_MXPEG_DECODER 0
 #define CONFIG_NUV_DECODER 0
@@ -883,7 +916,6 @@
 #define CONFIG_SANM_DECODER 0
 #define CONFIG_SCPR_DECODER 0
 #define CONFIG_SCREENPRESSO_DECODER 0
-#define CONFIG_SDX2_DPCM_DECODER 0
 #define CONFIG_SGI_DECODER 0
 #define CONFIG_SGIRLE_DECODER 0
 #define CONFIG_SHEERVIDEO_DECODER 0
@@ -930,6 +962,7 @@
 #define CONFIG_VMDVIDEO_DECODER 0
 #define CONFIG_VMNC_DECODER 0
 #define CONFIG_VP3_DECODER 1
+#define CONFIG_VP4_DECODER 0
 #define CONFIG_VP5_DECODER 0
 #define CONFIG_VP6_DECODER 0
 #define CONFIG_VP6A_DECODER 0
@@ -971,6 +1004,7 @@
 #define CONFIG_AAC_LATM_DECODER 1
 #define CONFIG_AC3_DECODER 0
 #define CONFIG_AC3_FIXED_DECODER 0
+#define CONFIG_ACELP_KELVIN_DECODER 0
 #define CONFIG_ALAC_DECODER 0
 #define CONFIG_ALS_DECODER 0
 #define CONFIG_AMRNB_DECODER 1
@@ -1005,6 +1039,8 @@
 #define CONFIG_G729_DECODER 0
 #define CONFIG_GSM_DECODER 0
 #define CONFIG_GSM_MS_DECODER 1
+#define CONFIG_HCA_DECODER 0
+#define CONFIG_HCOM_DECODER 0
 #define CONFIG_IAC_DECODER 0
 #define CONFIG_ILBC_DECODER 0
 #define CONFIG_IMC_DECODER 0
@@ -1038,6 +1074,7 @@
 #define CONFIG_SBC_DECODER 1
 #define CONFIG_SHORTEN_DECODER 0
 #define CONFIG_SIPR_DECODER 0
+#define CONFIG_SIREN_DECODER 0
 #define CONFIG_SMACKAUD_DECODER 0
 #define CONFIG_SONIC_DECODER 0
 #define CONFIG_TAK_DECODER 0
@@ -1089,16 +1126,20 @@
 #define CONFIG_PCM_U24LE_DECODER 0
 #define CONFIG_PCM_U32BE_DECODER 0
 #define CONFIG_PCM_U32LE_DECODER 0
-#define CONFIG_PCM_ZORK_DECODER 0
+#define CONFIG_PCM_VIDC_DECODER 0
+#define CONFIG_DERF_DPCM_DECODER 0
 #define CONFIG_GREMLIN_DPCM_DECODER 0
 #define CONFIG_INTERPLAY_DPCM_DECODER 0
 #define CONFIG_ROQ_DPCM_DECODER 0
+#define CONFIG_SDX2_DPCM_DECODER 0
 #define CONFIG_SOL_DPCM_DECODER 0
 #define CONFIG_XAN_DPCM_DECODER 0
 #define CONFIG_ADPCM_4XM_DECODER 0
 #define CONFIG_ADPCM_ADX_DECODER 0
 #define CONFIG_ADPCM_AFC_DECODER 0
+#define CONFIG_ADPCM_AGM_DECODER 0
 #define CONFIG_ADPCM_AICA_DECODER 0
+#define CONFIG_ADPCM_ARGO_DECODER 0
 #define CONFIG_ADPCM_CT_DECODER 0
 #define CONFIG_ADPCM_DTK_DECODER 0
 #define CONFIG_ADPCM_EA_DECODER 0
@@ -1111,16 +1152,20 @@
 #define CONFIG_ADPCM_G726_DECODER 0
 #define CONFIG_ADPCM_G726LE_DECODER 0
 #define CONFIG_ADPCM_IMA_AMV_DECODER 0
+#define CONFIG_ADPCM_IMA_ALP_DECODER 0
 #define CONFIG_ADPCM_IMA_APC_DECODER 0
+#define CONFIG_ADPCM_IMA_APM_DECODER 0
 #define CONFIG_ADPCM_IMA_DAT4_DECODER 0
 #define CONFIG_ADPCM_IMA_DK3_DECODER 0
 #define CONFIG_ADPCM_IMA_DK4_DECODER 0
 #define CONFIG_ADPCM_IMA_EA_EACS_DECODER 0
 #define CONFIG_ADPCM_IMA_EA_SEAD_DECODER 0
 #define CONFIG_ADPCM_IMA_ISS_DECODER 0
+#define CONFIG_ADPCM_IMA_MTF_DECODER 0
 #define CONFIG_ADPCM_IMA_OKI_DECODER 0
 #define CONFIG_ADPCM_IMA_QT_DECODER 0
 #define CONFIG_ADPCM_IMA_RAD_DECODER 0
+#define CONFIG_ADPCM_IMA_SSI_DECODER 0
 #define CONFIG_ADPCM_IMA_SMJPEG_DECODER 0
 #define CONFIG_ADPCM_IMA_WAV_DECODER 0
 #define CONFIG_ADPCM_IMA_WS_DECODER 0
@@ -1136,6 +1181,7 @@
 #define CONFIG_ADPCM_VIMA_DECODER 0
 #define CONFIG_ADPCM_XA_DECODER 0
 #define CONFIG_ADPCM_YAMAHA_DECODER 0
+#define CONFIG_ADPCM_ZORK_DECODER 0
 #define CONFIG_SSA_DECODER 0
 #define CONFIG_ASS_DECODER 0
 #define CONFIG_CCAPTION_DECODER 0
@@ -1173,9 +1219,10 @@
 #define CONFIG_PCM_MULAW_AT_DECODER 0
 #define CONFIG_QDMC_AT_DECODER 0
 #define CONFIG_QDM2_AT_DECODER 0
-#define CONFIG_LIBAOM_AV1_DECODER 0
+#define CONFIG_LIBARIBB24_DECODER 0
 #define CONFIG_LIBCELT_DECODER 0
 #define CONFIG_LIBCODEC2_DECODER 0
+#define CONFIG_LIBDAV1D_DECODER 0
 #define CONFIG_LIBDAVS2_DECODER 0
 #define CONFIG_LIBFDK_AAC_DECODER 0
 #define CONFIG_LIBGSM_DECODER 0
@@ -1194,11 +1241,13 @@
 #define CONFIG_BINTEXT_DECODER 0
 #define CONFIG_XBIN_DECODER 0
 #define CONFIG_IDF_DECODER 0
+#define CONFIG_LIBAOM_AV1_DECODER 0
 #define CONFIG_LIBOPENH264_DECODER 0
 #define CONFIG_H264_CUVID_DECODER 0
 #define CONFIG_HEVC_CUVID_DECODER 0
 #define CONFIG_HEVC_MEDIACODEC_DECODER 0
 #define CONFIG_MJPEG_CUVID_DECODER 0
+#define CONFIG_MJPEG_QSV_DECODER 0
 #define CONFIG_MPEG1_CUVID_DECODER 0
 #define CONFIG_MPEG2_CUVID_DECODER 0
 #define CONFIG_MPEG4_CUVID_DECODER 0
@@ -1209,6 +1258,7 @@
 #define CONFIG_VP8_QSV_DECODER 0
 #define CONFIG_VP9_CUVID_DECODER 0
 #define CONFIG_VP9_MEDIACODEC_DECODER 0
+#define CONFIG_VP9_QSV_DECODER 0
 #define CONFIG_A64MULTI_ENCODER 0
 #define CONFIG_A64MULTI5_ENCODER 0
 #define CONFIG_ALIAS_PIX_ENCODER 0
@@ -1315,6 +1365,7 @@
 #define CONFIG_WMAV1_ENCODER 0
 #define CONFIG_WMAV2_ENCODER 0
 #define CONFIG_PCM_ALAW_ENCODER 0
+#define CONFIG_PCM_DVD_ENCODER 0
 #define CONFIG_PCM_F32BE_ENCODER 0
 #define CONFIG_PCM_F32LE_ENCODER 0
 #define CONFIG_PCM_F64BE_ENCODER 0
@@ -1342,6 +1393,7 @@
 #define CONFIG_PCM_U24LE_ENCODER 0
 #define CONFIG_PCM_U32BE_ENCODER 0
 #define CONFIG_PCM_U32LE_ENCODER 0
+#define CONFIG_PCM_VIDC_ENCODER 0
 #define CONFIG_ROQ_DPCM_ENCODER 0
 #define CONFIG_ADPCM_ADX_ENCODER 0
 #define CONFIG_ADPCM_G722_ENCODER 0
@@ -1377,6 +1429,7 @@
 #define CONFIG_LIBOPENCORE_AMRNB_ENCODER 0
 #define CONFIG_LIBOPENJPEG_ENCODER 0
 #define CONFIG_LIBOPUS_ENCODER 0
+#define CONFIG_LIBRAV1E_ENCODER 0
 #define CONFIG_LIBSHINE_ENCODER 0
 #define CONFIG_LIBSPEEX_ENCODER 0
 #define CONFIG_LIBTHEORA_ENCODER 0
@@ -1418,10 +1471,12 @@
 #define CONFIG_MJPEG_VAAPI_ENCODER 0
 #define CONFIG_MPEG2_QSV_ENCODER 0
 #define CONFIG_MPEG2_VAAPI_ENCODER 0
+#define CONFIG_MPEG4_OMX_ENCODER 0
 #define CONFIG_MPEG4_V4L2M2M_ENCODER 0
 #define CONFIG_VP8_V4L2M2M_ENCODER 0
 #define CONFIG_VP8_VAAPI_ENCODER 0
 #define CONFIG_VP9_VAAPI_ENCODER 0
+#define CONFIG_VP9_QSV_ENCODER 0
 #define CONFIG_H263_VAAPI_HWACCEL 0
 #define CONFIG_H263_VIDEOTOOLBOX_HWACCEL 0
 #define CONFIG_H264_D3D11VA_HWACCEL 0
@@ -1469,6 +1524,7 @@
 #define CONFIG_VP9_DXVA2_HWACCEL 0
 #define CONFIG_VP9_NVDEC_HWACCEL 0
 #define CONFIG_VP9_VAAPI_HWACCEL 0
+#define CONFIG_VP9_VDPAU_HWACCEL 0
 #define CONFIG_WMV3_D3D11VA_HWACCEL 0
 #define CONFIG_WMV3_D3D11VA2_HWACCEL 0
 #define CONFIG_WMV3_DXVA2_HWACCEL 0
@@ -1493,7 +1549,9 @@
 #define CONFIG_DVDSUB_PARSER 0
 #define CONFIG_DVD_NAV_PARSER 0
 #define CONFIG_FLAC_PARSER 1
+#define CONFIG_G723_1_PARSER 0
 #define CONFIG_G729_PARSER 0
+#define CONFIG_GIF_PARSER 0
 #define CONFIG_GSM_PARSER 1
 #define CONFIG_H261_PARSER 0
 #define CONFIG_H263_PARSER 1
@@ -1517,13 +1575,13 @@
 #define CONFIG_VP3_PARSER 1
 #define CONFIG_VP8_PARSER 1
 #define CONFIG_VP9_PARSER 0
+#define CONFIG_WEBP_PARSER 0
 #define CONFIG_XMA_PARSER 0
 #define CONFIG_ALSA_INDEV 0
 #define CONFIG_ANDROID_CAMERA_INDEV 0
 #define CONFIG_AVFOUNDATION_INDEV 0
 #define CONFIG_BKTR_INDEV 0
 #define CONFIG_DECKLINK_INDEV 0
-#define CONFIG_LIBNDI_NEWTEK_INDEV 0
 #define CONFIG_DSHOW_INDEV 0
 #define CONFIG_FBDEV_INDEV 0
 #define CONFIG_GDIGRAB_INDEV 0
@@ -1543,7 +1601,6 @@
 #define CONFIG_ALSA_OUTDEV 0
 #define CONFIG_CACA_OUTDEV 0
 #define CONFIG_DECKLINK_OUTDEV 0
-#define CONFIG_LIBNDI_NEWTEK_OUTDEV 0
 #define CONFIG_FBDEV_OUTDEV 0
 #define CONFIG_OPENGL_OUTDEV 0
 #define CONFIG_OSS_OUTDEV 0
@@ -1584,6 +1641,8 @@
 #define CONFIG_AMIX_FILTER 0
 #define CONFIG_AMULTIPLY_FILTER 0
 #define CONFIG_ANEQUALIZER_FILTER 0
+#define CONFIG_ANLMDN_FILTER 0
+#define CONFIG_ANLMS_FILTER 0
 #define CONFIG_ANULL_FILTER 0
 #define CONFIG_APAD_FILTER 0
 #define CONFIG_APERMS_FILTER 0
@@ -1592,6 +1651,7 @@
 #define CONFIG_AREALTIME_FILTER 0
 #define CONFIG_ARESAMPLE_FILTER 0
 #define CONFIG_AREVERSE_FILTER 0
+#define CONFIG_ARNNDN_FILTER 0
 #define CONFIG_ASELECT_FILTER 0
 #define CONFIG_ASENDCMD_FILTER 0
 #define CONFIG_ASETNSAMPLES_FILTER 0
@@ -1600,17 +1660,21 @@
 #define CONFIG_ASETTB_FILTER 0
 #define CONFIG_ASHOWINFO_FILTER 0
 #define CONFIG_ASIDEDATA_FILTER 0
+#define CONFIG_ASOFTCLIP_FILTER 0
 #define CONFIG_ASPLIT_FILTER 0
+#define CONFIG_ASR_FILTER 0
 #define CONFIG_ASTATS_FILTER 0
 #define CONFIG_ASTREAMSELECT_FILTER 0
 #define CONFIG_ATEMPO_FILTER 0
 #define CONFIG_ATRIM_FILTER 0
+#define CONFIG_AXCORRELATE_FILTER 0
 #define CONFIG_AZMQ_FILTER 0
 #define CONFIG_BANDPASS_FILTER 0
 #define CONFIG_BANDREJECT_FILTER 0
 #define CONFIG_BASS_FILTER 0
 #define CONFIG_BIQUAD_FILTER 0
 #define CONFIG_BS2B_FILTER 0
+#define CONFIG_CHROMABER_VULKAN_FILTER 0
 #define CONFIG_CHANNELMAP_FILTER 0
 #define CONFIG_CHANNELSPLIT_FILTER 0
 #define CONFIG_CHORUS_FILTER 0
@@ -1619,6 +1683,7 @@
 #define CONFIG_CROSSFEED_FILTER 0
 #define CONFIG_CRYSTALIZER_FILTER 0
 #define CONFIG_DCSHIFT_FILTER 0
+#define CONFIG_DEESSER_FILTER 0
 #define CONFIG_DRMETER_FILTER 0
 #define CONFIG_DYNAUDNORM_FILTER 0
 #define CONFIG_EARWAX_FILTER 0
@@ -1658,12 +1723,15 @@
 #define CONFIG_VOLUME_FILTER 0
 #define CONFIG_VOLUMEDETECT_FILTER 0
 #define CONFIG_AEVALSRC_FILTER 0
+#define CONFIG_AFIRSRC_FILTER 0
 #define CONFIG_ANOISESRC_FILTER 0
 #define CONFIG_ANULLSRC_FILTER 0
 #define CONFIG_FLITE_FILTER 0
 #define CONFIG_HILBERT_FILTER 0
+#define CONFIG_SINC_FILTER 0
 #define CONFIG_SINE_FILTER 0
 #define CONFIG_ANULLSINK_FILTER 0
+#define CONFIG_ADDROI_FILTER 0
 #define CONFIG_ALPHAEXTRACT_FILTER 0
 #define CONFIG_ALPHAMERGE_FILTER 0
 #define CONFIG_AMPLIFY_FILTER 0
@@ -1671,8 +1739,10 @@
 #define CONFIG_ATADENOISE_FILTER 0
 #define CONFIG_AVGBLUR_FILTER 0
 #define CONFIG_AVGBLUR_OPENCL_FILTER 0
+#define CONFIG_AVGBLUR_VULKAN_FILTER 0
 #define CONFIG_BBOX_FILTER 0
 #define CONFIG_BENCH_FILTER 0
+#define CONFIG_BILATERAL_FILTER 0
 #define CONFIG_BITPLANENOISE_FILTER 0
 #define CONFIG_BLACKDETECT_FILTER 0
 #define CONFIG_BLACKFRAME_FILTER 0
@@ -1681,12 +1751,17 @@
 #define CONFIG_BOXBLUR_FILTER 0
 #define CONFIG_BOXBLUR_OPENCL_FILTER 0
 #define CONFIG_BWDIF_FILTER 0
+#define CONFIG_CAS_FILTER 0
+#define CONFIG_CHROMAHOLD_FILTER 0
 #define CONFIG_CHROMAKEY_FILTER 0
+#define CONFIG_CHROMASHIFT_FILTER 0
 #define CONFIG_CIESCOPE_FILTER 0
 #define CONFIG_CODECVIEW_FILTER 0
 #define CONFIG_COLORBALANCE_FILTER 0
 #define CONFIG_COLORCHANNELMIXER_FILTER 0
 #define CONFIG_COLORKEY_FILTER 0
+#define CONFIG_COLORKEY_OPENCL_FILTER 0
+#define CONFIG_COLORHOLD_FILTER 0
 #define CONFIG_COLORLEVELS_FILTER 0
 #define CONFIG_COLORMATRIX_FILTER 0
 #define CONFIG_COLORSPACE_FILTER 0
@@ -1706,6 +1781,7 @@
 #define CONFIG_DEBLOCK_FILTER 0
 #define CONFIG_DECIMATE_FILTER 0
 #define CONFIG_DECONVOLVE_FILTER 0
+#define CONFIG_DEDOT_FILTER 0
 #define CONFIG_DEFLATE_FILTER 0
 #define CONFIG_DEFLICKER_FILTER 0
 #define CONFIG_DEINTERLACE_QSV_FILTER 0
@@ -1713,12 +1789,15 @@
 #define CONFIG_DEJUDDER_FILTER 0
 #define CONFIG_DELOGO_FILTER 0
 #define CONFIG_DENOISE_VAAPI_FILTER 0
+#define CONFIG_DERAIN_FILTER 0
 #define CONFIG_DESHAKE_FILTER 0
+#define CONFIG_DESHAKE_OPENCL_FILTER 0
 #define CONFIG_DESPILL_FILTER 0
 #define CONFIG_DETELECINE_FILTER 0
 #define CONFIG_DILATION_FILTER 0
 #define CONFIG_DILATION_OPENCL_FILTER 0
 #define CONFIG_DISPLACE_FILTER 0
+#define CONFIG_DNN_PROCESSING_FILTER 0
 #define CONFIG_DOUBLEWEAVE_FILTER 0
 #define CONFIG_DRAWBOX_FILTER 0
 #define CONFIG_DRAWGRAPH_FILTER 0
@@ -1746,11 +1825,14 @@
 #define CONFIG_FRAMEPACK_FILTER 0
 #define CONFIG_FRAMERATE_FILTER 0
 #define CONFIG_FRAMESTEP_FILTER 0
+#define CONFIG_FREEZEDETECT_FILTER 0
+#define CONFIG_FREEZEFRAMES_FILTER 0
 #define CONFIG_FREI0R_FILTER 0
 #define CONFIG_FSPP_FILTER 0
 #define CONFIG_GBLUR_FILTER 0
 #define CONFIG_GEQ_FILTER 0
 #define CONFIG_GRADFUN_FILTER 0
+#define CONFIG_GRAPHMONITOR_FILTER 0
 #define CONFIG_GREYEDGE_FILTER 0
 #define CONFIG_HALDCLUT_FILTER 0
 #define CONFIG_HFLIP_FILTER 0
@@ -1771,6 +1853,7 @@
 #define CONFIG_INTERLACE_FILTER 0
 #define CONFIG_INTERLEAVE_FILTER 0
 #define CONFIG_KERNDEINT_FILTER 0
+#define CONFIG_LAGFUN_FILTER 0
 #define CONFIG_LENSCORRECTION_FILTER 0
 #define CONFIG_LENSFUN_FILTER 0
 #define CONFIG_LIBVMAF_FILTER 0
@@ -1784,8 +1867,13 @@
 #define CONFIG_LUTRGB_FILTER 0
 #define CONFIG_LUTYUV_FILTER 0
 #define CONFIG_MASKEDCLAMP_FILTER 0
+#define CONFIG_MASKEDMAX_FILTER 0
 #define CONFIG_MASKEDMERGE_FILTER 0
+#define CONFIG_MASKEDMIN_FILTER 0
+#define CONFIG_MASKEDTHRESHOLD_FILTER 0
+#define CONFIG_MASKFUN_FILTER 0
 #define CONFIG_MCDEINT_FILTER 0
+#define CONFIG_MEDIAN_FILTER 0
 #define CONFIG_MERGEPLANES_FILTER 0
 #define CONFIG_MESTIMATE_FILTER 0
 #define CONFIG_METADATA_FILTER 0
@@ -1795,6 +1883,7 @@
 #define CONFIG_MPDECIMATE_FILTER 0
 #define CONFIG_NEGATE_FILTER 0
 #define CONFIG_NLMEANS_FILTER 0
+#define CONFIG_NLMEANS_OPENCL_FILTER 0
 #define CONFIG_NNEDI_FILTER 0
 #define CONFIG_NOFORMAT_FILTER 0
 #define CONFIG_NOISE_FILTER 0
@@ -1806,13 +1895,17 @@
 #define CONFIG_OVERLAY_FILTER 0
 #define CONFIG_OVERLAY_OPENCL_FILTER 0
 #define CONFIG_OVERLAY_QSV_FILTER 0
+#define CONFIG_OVERLAY_VULKAN_FILTER 0
+#define CONFIG_OVERLAY_CUDA_FILTER 0
 #define CONFIG_OWDENOISE_FILTER 0
 #define CONFIG_PAD_FILTER 0
+#define CONFIG_PAD_OPENCL_FILTER 0
 #define CONFIG_PALETTEGEN_FILTER 0
 #define CONFIG_PALETTEUSE_FILTER 0
 #define CONFIG_PERMS_FILTER 0
 #define CONFIG_PERSPECTIVE_FILTER 0
 #define CONFIG_PHASE_FILTER 0
+#define CONFIG_PHOTOSENSITIVITY_FILTER 0
 #define CONFIG_PIXDESCTEST_FILTER 0
 #define CONFIG_PIXSCOPE_FILTER 0
 #define CONFIG_PP_FILTER 0
@@ -1835,6 +1928,7 @@
 #define CONFIG_REMOVELOGO_FILTER 0
 #define CONFIG_REPEATFIELDS_FILTER 0
 #define CONFIG_REVERSE_FILTER 0
+#define CONFIG_RGBASHIFT_FILTER 0
 #define CONFIG_ROBERTS_FILTER 0
 #define CONFIG_ROBERTS_OPENCL_FILTER 0
 #define CONFIG_ROTATE_FILTER 0
@@ -1844,13 +1938,16 @@
 #define CONFIG_SCALE_NPP_FILTER 0
 #define CONFIG_SCALE_QSV_FILTER 0
 #define CONFIG_SCALE_VAAPI_FILTER 0
+#define CONFIG_SCALE_VULKAN_FILTER 0
 #define CONFIG_SCALE2REF_FILTER 0
+#define CONFIG_SCROLL_FILTER 0
 #define CONFIG_SELECT_FILTER 0
 #define CONFIG_SELECTIVECOLOR_FILTER 0
 #define CONFIG_SENDCMD_FILTER 0
 #define CONFIG_SEPARATEFIELDS_FILTER 0
 #define CONFIG_SETDAR_FILTER 0
 #define CONFIG_SETFIELD_FILTER 0
+#define CONFIG_SETPARAMS_FILTER 0
 #define CONFIG_SETPTS_FILTER 0
 #define CONFIG_SETRANGE_FILTER 0
 #define CONFIG_SETSAR_FILTER 0
@@ -1878,26 +1975,34 @@
 #define CONFIG_SWAPUV_FILTER 0
 #define CONFIG_TBLEND_FILTER 0
 #define CONFIG_TELECINE_FILTER 0
+#define CONFIG_THISTOGRAM_FILTER 0
 #define CONFIG_THRESHOLD_FILTER 0
 #define CONFIG_THUMBNAIL_FILTER 0
 #define CONFIG_THUMBNAIL_CUDA_FILTER 0
 #define CONFIG_TILE_FILTER 0
 #define CONFIG_TINTERLACE_FILTER 0
 #define CONFIG_TLUT2_FILTER 0
+#define CONFIG_TMEDIAN_FILTER 0
 #define CONFIG_TMIX_FILTER 0
 #define CONFIG_TONEMAP_FILTER 0
 #define CONFIG_TONEMAP_OPENCL_FILTER 0
+#define CONFIG_TONEMAP_VAAPI_FILTER 0
+#define CONFIG_TPAD_FILTER 0
 #define CONFIG_TRANSPOSE_FILTER 0
 #define CONFIG_TRANSPOSE_NPP_FILTER 0
+#define CONFIG_TRANSPOSE_OPENCL_FILTER 0
+#define CONFIG_TRANSPOSE_VAAPI_FILTER 0
 #define CONFIG_TRIM_FILTER 0
 #define CONFIG_UNPREMULTIPLY_FILTER 0
 #define CONFIG_UNSHARP_FILTER 0
 #define CONFIG_UNSHARP_OPENCL_FILTER 0
 #define CONFIG_USPP_FILTER 0
+#define CONFIG_V360_FILTER 0
 #define CONFIG_VAGUEDENOISER_FILTER 0
 #define CONFIG_VECTORSCOPE_FILTER 0
 #define CONFIG_VFLIP_FILTER 0
 #define CONFIG_VFRDET_FILTER 0
+#define CONFIG_VIBRANCE_FILTER 0
 #define CONFIG_VIDSTABDETECT_FILTER 0
 #define CONFIG_VIDSTABTRANSFORM_FILTER 0
 #define CONFIG_VIGNETTE_FILTER 0
@@ -1908,7 +2013,13 @@
 #define CONFIG_WAVEFORM_FILTER 0
 #define CONFIG_WEAVE_FILTER 0
 #define CONFIG_XBR_FILTER 0
+#define CONFIG_XFADE_FILTER 0
+#define CONFIG_XFADE_OPENCL_FILTER 0
+#define CONFIG_XMEDIAN_FILTER 0
+#define CONFIG_XSTACK_FILTER 0
 #define CONFIG_YADIF_FILTER 0
+#define CONFIG_YADIF_CUDA_FILTER 0
+#define CONFIG_YAEPBLUR_FILTER 0
 #define CONFIG_ZMQ_FILTER 0
 #define CONFIG_ZOOMPAN_FILTER 0
 #define CONFIG_ZSCALE_FILTER 0
@@ -1927,6 +2038,7 @@
 #define CONFIG_PAL75BARS_FILTER 0
 #define CONFIG_PAL100BARS_FILTER 0
 #define CONFIG_RGBTESTSRC_FILTER 0
+#define CONFIG_SIERPINSKI_FILTER 0
 #define CONFIG_SMPTEBARS_FILTER 0
 #define CONFIG_SMPTEHDBARS_FILTER 0
 #define CONFIG_TESTSRC_FILTER 0
@@ -1935,12 +2047,14 @@
 #define CONFIG_NULLSINK_FILTER 0
 #define CONFIG_ABITSCOPE_FILTER 0
 #define CONFIG_ADRAWGRAPH_FILTER 0
+#define CONFIG_AGRAPHMONITOR_FILTER 0
 #define CONFIG_AHISTOGRAM_FILTER 0
 #define CONFIG_APHASEMETER_FILTER 0
 #define CONFIG_AVECTORSCOPE_FILTER 0
 #define CONFIG_CONCAT_FILTER 0
 #define CONFIG_SHOWCQT_FILTER 0
 #define CONFIG_SHOWFREQS_FILTER 0
+#define CONFIG_SHOWSPATIAL_FILTER 0
 #define CONFIG_SHOWSPECTRUM_FILTER 0
 #define CONFIG_SHOWSPECTRUMPIC_FILTER 0
 #define CONFIG_SHOWVOLUME_FILTER 0
@@ -1964,21 +2078,25 @@
 #define CONFIG_AFC_DEMUXER 0
 #define CONFIG_AIFF_DEMUXER 0
 #define CONFIG_AIX_DEMUXER 0
+#define CONFIG_ALP_DEMUXER 0
 #define CONFIG_AMR_DEMUXER 1
 #define CONFIG_AMRNB_DEMUXER 0
 #define CONFIG_AMRWB_DEMUXER 0
 #define CONFIG_ANM_DEMUXER 0
 #define CONFIG_APC_DEMUXER 0
 #define CONFIG_APE_DEMUXER 0
+#define CONFIG_APM_DEMUXER 0
 #define CONFIG_APNG_DEMUXER 0
 #define CONFIG_APTX_DEMUXER 0
 #define CONFIG_APTX_HD_DEMUXER 0
 #define CONFIG_AQTITLE_DEMUXER 0
+#define CONFIG_ARGO_ASF_DEMUXER 0
 #define CONFIG_ASF_DEMUXER 0
 #define CONFIG_ASF_O_DEMUXER 0
 #define CONFIG_ASS_DEMUXER 0
 #define CONFIG_AST_DEMUXER 0
 #define CONFIG_AU_DEMUXER 0
+#define CONFIG_AV1_DEMUXER 0
 #define CONFIG_AVI_DEMUXER 1
 #define CONFIG_AVISYNTH_DEMUXER 0
 #define CONFIG_AVR_DEMUXER 0
@@ -2006,7 +2124,9 @@
 #define CONFIG_DATA_DEMUXER 0
 #define CONFIG_DAUD_DEMUXER 0
 #define CONFIG_DCSTR_DEMUXER 0
+#define CONFIG_DERF_DEMUXER 0
 #define CONFIG_DFA_DEMUXER 0
+#define CONFIG_DHAV_DEMUXER 0
 #define CONFIG_DIRAC_DEMUXER 0
 #define CONFIG_DNXHD_DEMUXER 0
 #define CONFIG_DSF_DEMUXER 0
@@ -2032,6 +2152,7 @@
 #define CONFIG_FOURXM_DEMUXER 0
 #define CONFIG_FRM_DEMUXER 0
 #define CONFIG_FSB_DEMUXER 0
+#define CONFIG_FWSE_DEMUXER 0
 #define CONFIG_G722_DEMUXER 0
 #define CONFIG_G723_1_DEMUXER 0
 #define CONFIG_G726_DEMUXER 0
@@ -2045,6 +2166,8 @@
 #define CONFIG_H261_DEMUXER 0
 #define CONFIG_H263_DEMUXER 0
 #define CONFIG_H264_DEMUXER 0
+#define CONFIG_HCA_DEMUXER 0
+#define CONFIG_HCOM_DEMUXER 0
 #define CONFIG_HEVC_DEMUXER 0
 #define CONFIG_HLS_DEMUXER 0
 #define CONFIG_HNM_DEMUXER 0
@@ -2052,6 +2175,7 @@
 #define CONFIG_IDCIN_DEMUXER 0
 #define CONFIG_IDF_DEMUXER 0
 #define CONFIG_IFF_DEMUXER 0
+#define CONFIG_IFV_DEMUXER 0
 #define CONFIG_ILBC_DEMUXER 0
 #define CONFIG_IMAGE2_DEMUXER 0
 #define CONFIG_IMAGE2PIPE_DEMUXER 0
@@ -2066,6 +2190,8 @@
 #define CONFIG_IVR_DEMUXER 0
 #define CONFIG_JACOSUB_DEMUXER 0
 #define CONFIG_JV_DEMUXER 0
+#define CONFIG_KUX_DEMUXER 0
+#define CONFIG_KVAG_DEMUXER 0
 #define CONFIG_LMLM4_DEMUXER 0
 #define CONFIG_LOAS_DEMUXER 0
 #define CONFIG_LRC_DEMUXER 0
@@ -2112,6 +2238,7 @@
 #define CONFIG_PAF_DEMUXER 0
 #define CONFIG_PCM_ALAW_DEMUXER 0
 #define CONFIG_PCM_MULAW_DEMUXER 0
+#define CONFIG_PCM_VIDC_DEMUXER 0
 #define CONFIG_PCM_F64BE_DEMUXER 0
 #define CONFIG_PCM_F64LE_DEMUXER 0
 #define CONFIG_PCM_F32BE_DEMUXER 0
@@ -2192,6 +2319,7 @@
 #define CONFIG_VAG_DEMUXER 0
 #define CONFIG_VC1_DEMUXER 0
 #define CONFIG_VC1T_DEMUXER 0
+#define CONFIG_VIVIDAS_DEMUXER 0
 #define CONFIG_VIVO_DEMUXER 0
 #define CONFIG_VMD_DEMUXER 0
 #define CONFIG_VOBSUB_DEMUXER 0
@@ -2221,6 +2349,7 @@
 #define CONFIG_IMAGE_DDS_PIPE_DEMUXER 0
 #define CONFIG_IMAGE_DPX_PIPE_DEMUXER 0
 #define CONFIG_IMAGE_EXR_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_GIF_PIPE_DEMUXER 0
 #define CONFIG_IMAGE_J2K_PIPE_DEMUXER 0
 #define CONFIG_IMAGE_JPEG_PIPE_DEMUXER 0
 #define CONFIG_IMAGE_JPEGLS_PIPE_DEMUXER 0
@@ -2345,6 +2474,7 @@
 #define CONFIG_OPUS_MUXER 0
 #define CONFIG_PCM_ALAW_MUXER 0
 #define CONFIG_PCM_MULAW_MUXER 0
+#define CONFIG_PCM_VIDC_MUXER 0
 #define CONFIG_PCM_F64BE_MUXER 0
 #define CONFIG_PCM_F64LE_MUXER 0
 #define CONFIG_PCM_F32BE_MUXER 0
@@ -2384,6 +2514,7 @@
 #define CONFIG_SPX_MUXER 0
 #define CONFIG_SPDIF_MUXER 0
 #define CONFIG_SRT_MUXER 0
+#define CONFIG_STREAMHASH_MUXER 0
 #define CONFIG_SUP_MUXER 0
 #define CONFIG_SWF_MUXER 0
 #define CONFIG_TEE_MUXER 0
@@ -2444,6 +2575,7 @@
 #define CONFIG_UDP_PROTOCOL 0
 #define CONFIG_UDPLITE_PROTOCOL 0
 #define CONFIG_UNIX_PROTOCOL 0
+#define CONFIG_LIBAMQP_PROTOCOL 0
 #define CONFIG_LIBRTMP_PROTOCOL 0
 #define CONFIG_LIBRTMPE_PROTOCOL 0
 #define CONFIG_LIBRTMPS_PROTOCOL 0
@@ -2452,4 +2584,5 @@
 #define CONFIG_LIBSRT_PROTOCOL 0
 #define CONFIG_LIBSSH_PROTOCOL 0
 #define CONFIG_LIBSMBCLIENT_PROTOCOL 0
+#define CONFIG_LIBZMQ_PROTOCOL 0
 #endif /* FFMPEG_CONFIG_H */
diff --git a/fuchsia/config/max/arm64/libavutil/ffversion.h b/fuchsia/config/max/arm64/libavutil/ffversion.h
index 4585957..fc76199 100644
--- a/fuchsia/config/max/arm64/libavutil/ffversion.h
+++ b/fuchsia/config/max/arm64/libavutil/ffversion.h
@@ -1,5 +1,5 @@
 /* Automatically generated by version.sh, do not manually edit! */
 #ifndef AVUTIL_FFVERSION_H
 #define AVUTIL_FFVERSION_H
-#define FFMPEG_VERSION "N-92369-g2e9f4ad959"
+#define FFMPEG_VERSION "N-97662-gaaac2c26d9"
 #endif /* AVUTIL_FFVERSION_H */
diff --git a/fuchsia/config/max/x64/config.asm b/fuchsia/config/max/x64/config.asm
index c675951..c7d35bd 100644
--- a/fuchsia/config/max/x64/config.asm
+++ b/fuchsia/config/max/x64/config.asm
@@ -65,6 +65,7 @@
 %define HAVE_MIPSDSP 0
 %define HAVE_MIPSDSPR2 0
 %define HAVE_MSA 0
+%define HAVE_MSA2 0
 %define HAVE_LOONGSON2 0
 %define HAVE_LOONGSON3 0
 %define HAVE_MMI 0
@@ -110,6 +111,7 @@
 %define HAVE_MIPSDSP_EXTERNAL 0
 %define HAVE_MIPSDSPR2_EXTERNAL 0
 %define HAVE_MSA_EXTERNAL 0
+%define HAVE_MSA2_EXTERNAL 0
 %define HAVE_LOONGSON2_EXTERNAL 0
 %define HAVE_LOONGSON3_EXTERNAL 0
 %define HAVE_MMI_EXTERNAL 0
@@ -155,6 +157,7 @@
 %define HAVE_MIPSDSP_INLINE 0
 %define HAVE_MIPSDSPR2_INLINE 0
 %define HAVE_MSA_INLINE 0
+%define HAVE_MSA2_INLINE 0
 %define HAVE_LOONGSON2_INLINE 0
 %define HAVE_LOONGSON3_INLINE 0
 %define HAVE_MMI_INLINE 0
@@ -265,10 +268,12 @@
 %define HAVE_GETADDRINFO 0
 %define HAVE_GETHRTIME 0
 %define HAVE_GETOPT 1
+%define HAVE_GETMODULEHANDLE 0
 %define HAVE_GETPROCESSAFFINITYMASK 0
 %define HAVE_GETPROCESSMEMORYINFO 0
 %define HAVE_GETPROCESSTIMES 0
 %define HAVE_GETRUSAGE 1
+%define HAVE_GETSTDHANDLE 0
 %define HAVE_GETSYSTEMTIMEASFILETIME 0
 %define HAVE_GETTIMEOFDAY 1
 %define HAVE_GLOB 1
@@ -294,6 +299,7 @@
 %define HAVE_SECITEMIMPORT 0
 %define HAVE_SETCONSOLETEXTATTRIBUTE 0
 %define HAVE_SETCONSOLECTRLHANDLER 0
+%define HAVE_SETDLLDIRECTORY 0
 %define HAVE_SETMODE 0
 %define HAVE_SETRLIMIT 1
 %define HAVE_SLEEP 0
@@ -334,6 +340,10 @@
 %define HAVE_XFORM_ASM 0
 %define HAVE_XMM_CLOBBERS 1
 %define HAVE_KCMVIDEOCODECTYPE_HEVC 0
+%define HAVE_KCVPIXELFORMATTYPE_420YPCBCR10BIPLANARVIDEORANGE 0
+%define HAVE_KCVIMAGEBUFFERTRANSFERFUNCTION_SMPTE_ST_2084_PQ 0
+%define HAVE_KCVIMAGEBUFFERTRANSFERFUNCTION_ITU_R_2100_HLG 0
+%define HAVE_KCVIMAGEBUFFERTRANSFERFUNCTION_LINEAR 0
 %define HAVE_SOCKLEN_T 0
 %define HAVE_STRUCT_ADDRINFO 0
 %define HAVE_STRUCT_GROUP_SOURCE_REQ 0
@@ -347,7 +357,7 @@
 %define HAVE_STRUCT_SOCKADDR_SA_LEN 0
 %define HAVE_STRUCT_SOCKADDR_STORAGE 0
 %define HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC 1
-%define HAVE_STRUCT_V4L2_FRMIVALENUM_DISCRETE 1
+%define HAVE_STRUCT_V4L2_FRMIVALENUM_DISCRETE 0
 %define HAVE_MAKEINFO 0
 %define HAVE_MAKEINFO_HTML 0
 %define HAVE_OPENCL_D3D11 0
@@ -364,7 +374,7 @@
 %define CONFIG_MANPAGES 0
 %define CONFIG_PODPAGES 0
 %define CONFIG_TXTPAGES 0
-%define CONFIG_AVIO_DIR_CMD_EXAMPLE 1
+%define CONFIG_AVIO_LIST_DIR_EXAMPLE 1
 %define CONFIG_AVIO_READING_EXAMPLE 1
 %define CONFIG_DECODE_AUDIO_EXAMPLE 1
 %define CONFIG_DECODE_VIDEO_EXAMPLE 1
@@ -399,11 +409,11 @@
 %define CONFIG_LIBXAVS2 0
 %define CONFIG_LIBXVID 0
 %define CONFIG_DECKLINK 0
-%define CONFIG_LIBNDI_NEWTEK 0
 %define CONFIG_LIBFDK_AAC 0
 %define CONFIG_OPENSSL 0
 %define CONFIG_LIBTLS 0
 %define CONFIG_GMP 0
+%define CONFIG_LIBARIBB24 0
 %define CONFIG_LIBLENSFUN 0
 %define CONFIG_LIBOPENCORE_AMRNB 0
 %define CONFIG_LIBOPENCORE_AMRWB 0
@@ -424,12 +434,14 @@
 %define CONFIG_LIBCACA 0
 %define CONFIG_LIBCELT 0
 %define CONFIG_LIBCODEC2 0
+%define CONFIG_LIBDAV1D 0
 %define CONFIG_LIBDC1394 0
 %define CONFIG_LIBDRM 0
 %define CONFIG_LIBFLITE 0
 %define CONFIG_LIBFONTCONFIG 0
 %define CONFIG_LIBFREETYPE 0
 %define CONFIG_LIBFRIBIDI 0
+%define CONFIG_LIBGLSLANG 0
 %define CONFIG_LIBGME 0
 %define CONFIG_LIBGSM 0
 %define CONFIG_LIBIEC61883 0
@@ -446,6 +458,8 @@
 %define CONFIG_LIBOPENMPT 0
 %define CONFIG_LIBOPUS 1
 %define CONFIG_LIBPULSE 0
+%define CONFIG_LIBRABBITMQ 0
+%define CONFIG_LIBRAV1E 0
 %define CONFIG_LIBRSVG 0
 %define CONFIG_LIBRTMP 0
 %define CONFIG_LIBSHINE 0
@@ -472,6 +486,7 @@
 %define CONFIG_MEDIACODEC 0
 %define CONFIG_OPENAL 0
 %define CONFIG_OPENGL 0
+%define CONFIG_POCKETSPHINX 0
 %define CONFIG_VAPOURSYNTH 0
 %define CONFIG_ALSA 0
 %define CONFIG_APPKIT 0
@@ -490,16 +505,19 @@
 %define CONFIG_SNDIO 0
 %define CONFIG_XLIB 0
 %define CONFIG_ZLIB 0
+%define CONFIG_CUDA_NVCC 0
 %define CONFIG_CUDA_SDK 0
 %define CONFIG_LIBNPP 0
 %define CONFIG_LIBMFX 0
 %define CONFIG_MMAL 0
 %define CONFIG_OMX 0
 %define CONFIG_OPENCL 0
+%define CONFIG_VULKAN 0
 %define CONFIG_AMF 0
 %define CONFIG_AUDIOTOOLBOX 0
 %define CONFIG_CRYSTALHD 0
 %define CONFIG_CUDA 0
+%define CONFIG_CUDA_LLVM 0
 %define CONFIG_CUVID 0
 %define CONFIG_D3D11VA 0
 %define CONFIG_DXVA2 0
@@ -550,6 +568,7 @@
 %define CONFIG_RDFT 1
 %define CONFIG_AUTODETECT 0
 %define CONFIG_FONTCONFIG 0
+%define CONFIG_LARGE_TESTS 1
 %define CONFIG_LINUX_PERF 0
 %define CONFIG_MEMORY_POISONING 0
 %define CONFIG_NEON_CLOBBER_TEST 0
@@ -642,6 +661,7 @@
 %define CONFIG_RTPDEC 0
 %define CONFIG_RTPENC_CHAIN 0
 %define CONFIG_RV34DSP 0
+%define CONFIG_SCENE_SAD 0
 %define CONFIG_SINEWIN 1
 %define CONFIG_SNAPPY 0
 %define CONFIG_SRTP 0
@@ -659,6 +679,8 @@
 %define CONFIG_WMA_FREQS 0
 %define CONFIG_WMV2DSP 0
 %define CONFIG_AAC_ADTSTOASC_BSF 0
+%define CONFIG_AV1_FRAME_MERGE_BSF 0
+%define CONFIG_AV1_FRAME_SPLIT_BSF 0
 %define CONFIG_AV1_METADATA_BSF 0
 %define CONFIG_CHOMP_BSF 0
 %define CONFIG_DUMP_EXTRADATA_BSF 0
@@ -681,9 +703,11 @@
 %define CONFIG_MOV2TEXTSUB_BSF 0
 %define CONFIG_NOISE_BSF 0
 %define CONFIG_NULL_BSF 1
+%define CONFIG_PRORES_METADATA_BSF 0
 %define CONFIG_REMOVE_EXTRADATA_BSF 0
 %define CONFIG_TEXT2MOVSUB_BSF 0
 %define CONFIG_TRACE_HEADERS_BSF 0
+%define CONFIG_TRUEHD_CORE_BSF 0
 %define CONFIG_VP9_METADATA_BSF 0
 %define CONFIG_VP9_RAW_REORDER_BSF 0
 %define CONFIG_VP9_SUPERFRAME_BSF 0
@@ -691,10 +715,12 @@
 %define CONFIG_AASC_DECODER 0
 %define CONFIG_AIC_DECODER 0
 %define CONFIG_ALIAS_PIX_DECODER 0
+%define CONFIG_AGM_DECODER 0
 %define CONFIG_AMV_DECODER 0
 %define CONFIG_ANM_DECODER 0
 %define CONFIG_ANSI_DECODER 0
 %define CONFIG_APNG_DECODER 0
+%define CONFIG_ARBC_DECODER 0
 %define CONFIG_ASV1_DECODER 0
 %define CONFIG_ASV2_DECODER 0
 %define CONFIG_AURA_DECODER 0
@@ -714,6 +740,7 @@
 %define CONFIG_C93_DECODER 0
 %define CONFIG_CAVS_DECODER 0
 %define CONFIG_CDGRAPHICS_DECODER 0
+%define CONFIG_CDTOONS_DECODER 0
 %define CONFIG_CDXL_DECODER 0
 %define CONFIG_CFHD_DECODER 0
 %define CONFIG_CINEPAK_DECODER 0
@@ -782,9 +809,11 @@
 %define CONFIG_HQ_HQA_DECODER 0
 %define CONFIG_HQX_DECODER 0
 %define CONFIG_HUFFYUV_DECODER 0
+%define CONFIG_HYMT_DECODER 0
 %define CONFIG_IDCIN_DECODER 0
 %define CONFIG_IFF_ILBM_DECODER 0
 %define CONFIG_IMM4_DECODER 0
+%define CONFIG_IMM5_DECODER 0
 %define CONFIG_INDEO2_DECODER 0
 %define CONFIG_INDEO3_DECODER 0
 %define CONFIG_INDEO4_DECODER 0
@@ -797,6 +826,7 @@
 %define CONFIG_KMVC_DECODER 0
 %define CONFIG_LAGARITH_DECODER 0
 %define CONFIG_LOCO_DECODER 0
+%define CONFIG_LSCR_DECODER 0
 %define CONFIG_M101_DECODER 0
 %define CONFIG_MAGICYUV_DECODER 0
 %define CONFIG_MDEC_DECODER 0
@@ -830,8 +860,11 @@
 %define CONFIG_MSVIDEO1_DECODER 0
 %define CONFIG_MSZH_DECODER 0
 %define CONFIG_MTS2_DECODER 0
+%define CONFIG_MV30_DECODER 0
 %define CONFIG_MVC1_DECODER 0
 %define CONFIG_MVC2_DECODER 0
+%define CONFIG_MVDV_DECODER 0
+%define CONFIG_MVHA_DECODER 0
 %define CONFIG_MWSC_DECODER 0
 %define CONFIG_MXPEG_DECODER 0
 %define CONFIG_NUV_DECODER 0
@@ -868,7 +901,6 @@
 %define CONFIG_SANM_DECODER 0
 %define CONFIG_SCPR_DECODER 0
 %define CONFIG_SCREENPRESSO_DECODER 0
-%define CONFIG_SDX2_DPCM_DECODER 0
 %define CONFIG_SGI_DECODER 0
 %define CONFIG_SGIRLE_DECODER 0
 %define CONFIG_SHEERVIDEO_DECODER 0
@@ -915,6 +947,7 @@
 %define CONFIG_VMDVIDEO_DECODER 0
 %define CONFIG_VMNC_DECODER 0
 %define CONFIG_VP3_DECODER 1
+%define CONFIG_VP4_DECODER 0
 %define CONFIG_VP5_DECODER 0
 %define CONFIG_VP6_DECODER 0
 %define CONFIG_VP6A_DECODER 0
@@ -956,6 +989,7 @@
 %define CONFIG_AAC_LATM_DECODER 1
 %define CONFIG_AC3_DECODER 0
 %define CONFIG_AC3_FIXED_DECODER 0
+%define CONFIG_ACELP_KELVIN_DECODER 0
 %define CONFIG_ALAC_DECODER 0
 %define CONFIG_ALS_DECODER 0
 %define CONFIG_AMRNB_DECODER 1
@@ -990,6 +1024,8 @@
 %define CONFIG_G729_DECODER 0
 %define CONFIG_GSM_DECODER 0
 %define CONFIG_GSM_MS_DECODER 1
+%define CONFIG_HCA_DECODER 0
+%define CONFIG_HCOM_DECODER 0
 %define CONFIG_IAC_DECODER 0
 %define CONFIG_ILBC_DECODER 0
 %define CONFIG_IMC_DECODER 0
@@ -1023,6 +1059,7 @@
 %define CONFIG_SBC_DECODER 1
 %define CONFIG_SHORTEN_DECODER 0
 %define CONFIG_SIPR_DECODER 0
+%define CONFIG_SIREN_DECODER 0
 %define CONFIG_SMACKAUD_DECODER 0
 %define CONFIG_SONIC_DECODER 0
 %define CONFIG_TAK_DECODER 0
@@ -1074,16 +1111,20 @@
 %define CONFIG_PCM_U24LE_DECODER 0
 %define CONFIG_PCM_U32BE_DECODER 0
 %define CONFIG_PCM_U32LE_DECODER 0
-%define CONFIG_PCM_ZORK_DECODER 0
+%define CONFIG_PCM_VIDC_DECODER 0
+%define CONFIG_DERF_DPCM_DECODER 0
 %define CONFIG_GREMLIN_DPCM_DECODER 0
 %define CONFIG_INTERPLAY_DPCM_DECODER 0
 %define CONFIG_ROQ_DPCM_DECODER 0
+%define CONFIG_SDX2_DPCM_DECODER 0
 %define CONFIG_SOL_DPCM_DECODER 0
 %define CONFIG_XAN_DPCM_DECODER 0
 %define CONFIG_ADPCM_4XM_DECODER 0
 %define CONFIG_ADPCM_ADX_DECODER 0
 %define CONFIG_ADPCM_AFC_DECODER 0
+%define CONFIG_ADPCM_AGM_DECODER 0
 %define CONFIG_ADPCM_AICA_DECODER 0
+%define CONFIG_ADPCM_ARGO_DECODER 0
 %define CONFIG_ADPCM_CT_DECODER 0
 %define CONFIG_ADPCM_DTK_DECODER 0
 %define CONFIG_ADPCM_EA_DECODER 0
@@ -1096,16 +1137,20 @@
 %define CONFIG_ADPCM_G726_DECODER 0
 %define CONFIG_ADPCM_G726LE_DECODER 0
 %define CONFIG_ADPCM_IMA_AMV_DECODER 0
+%define CONFIG_ADPCM_IMA_ALP_DECODER 0
 %define CONFIG_ADPCM_IMA_APC_DECODER 0
+%define CONFIG_ADPCM_IMA_APM_DECODER 0
 %define CONFIG_ADPCM_IMA_DAT4_DECODER 0
 %define CONFIG_ADPCM_IMA_DK3_DECODER 0
 %define CONFIG_ADPCM_IMA_DK4_DECODER 0
 %define CONFIG_ADPCM_IMA_EA_EACS_DECODER 0
 %define CONFIG_ADPCM_IMA_EA_SEAD_DECODER 0
 %define CONFIG_ADPCM_IMA_ISS_DECODER 0
+%define CONFIG_ADPCM_IMA_MTF_DECODER 0
 %define CONFIG_ADPCM_IMA_OKI_DECODER 0
 %define CONFIG_ADPCM_IMA_QT_DECODER 0
 %define CONFIG_ADPCM_IMA_RAD_DECODER 0
+%define CONFIG_ADPCM_IMA_SSI_DECODER 0
 %define CONFIG_ADPCM_IMA_SMJPEG_DECODER 0
 %define CONFIG_ADPCM_IMA_WAV_DECODER 0
 %define CONFIG_ADPCM_IMA_WS_DECODER 0
@@ -1121,6 +1166,7 @@
 %define CONFIG_ADPCM_VIMA_DECODER 0
 %define CONFIG_ADPCM_XA_DECODER 0
 %define CONFIG_ADPCM_YAMAHA_DECODER 0
+%define CONFIG_ADPCM_ZORK_DECODER 0
 %define CONFIG_SSA_DECODER 0
 %define CONFIG_ASS_DECODER 0
 %define CONFIG_CCAPTION_DECODER 0
@@ -1158,9 +1204,10 @@
 %define CONFIG_PCM_MULAW_AT_DECODER 0
 %define CONFIG_QDMC_AT_DECODER 0
 %define CONFIG_QDM2_AT_DECODER 0
-%define CONFIG_LIBAOM_AV1_DECODER 0
+%define CONFIG_LIBARIBB24_DECODER 0
 %define CONFIG_LIBCELT_DECODER 0
 %define CONFIG_LIBCODEC2_DECODER 0
+%define CONFIG_LIBDAV1D_DECODER 0
 %define CONFIG_LIBDAVS2_DECODER 0
 %define CONFIG_LIBFDK_AAC_DECODER 0
 %define CONFIG_LIBGSM_DECODER 0
@@ -1179,11 +1226,13 @@
 %define CONFIG_BINTEXT_DECODER 0
 %define CONFIG_XBIN_DECODER 0
 %define CONFIG_IDF_DECODER 0
+%define CONFIG_LIBAOM_AV1_DECODER 0
 %define CONFIG_LIBOPENH264_DECODER 0
 %define CONFIG_H264_CUVID_DECODER 0
 %define CONFIG_HEVC_CUVID_DECODER 0
 %define CONFIG_HEVC_MEDIACODEC_DECODER 0
 %define CONFIG_MJPEG_CUVID_DECODER 0
+%define CONFIG_MJPEG_QSV_DECODER 0
 %define CONFIG_MPEG1_CUVID_DECODER 0
 %define CONFIG_MPEG2_CUVID_DECODER 0
 %define CONFIG_MPEG4_CUVID_DECODER 0
@@ -1194,6 +1243,7 @@
 %define CONFIG_VP8_QSV_DECODER 0
 %define CONFIG_VP9_CUVID_DECODER 0
 %define CONFIG_VP9_MEDIACODEC_DECODER 0
+%define CONFIG_VP9_QSV_DECODER 0
 %define CONFIG_A64MULTI_ENCODER 0
 %define CONFIG_A64MULTI5_ENCODER 0
 %define CONFIG_ALIAS_PIX_ENCODER 0
@@ -1300,6 +1350,7 @@
 %define CONFIG_WMAV1_ENCODER 0
 %define CONFIG_WMAV2_ENCODER 0
 %define CONFIG_PCM_ALAW_ENCODER 0
+%define CONFIG_PCM_DVD_ENCODER 0
 %define CONFIG_PCM_F32BE_ENCODER 0
 %define CONFIG_PCM_F32LE_ENCODER 0
 %define CONFIG_PCM_F64BE_ENCODER 0
@@ -1327,6 +1378,7 @@
 %define CONFIG_PCM_U24LE_ENCODER 0
 %define CONFIG_PCM_U32BE_ENCODER 0
 %define CONFIG_PCM_U32LE_ENCODER 0
+%define CONFIG_PCM_VIDC_ENCODER 0
 %define CONFIG_ROQ_DPCM_ENCODER 0
 %define CONFIG_ADPCM_ADX_ENCODER 0
 %define CONFIG_ADPCM_G722_ENCODER 0
@@ -1362,6 +1414,7 @@
 %define CONFIG_LIBOPENCORE_AMRNB_ENCODER 0
 %define CONFIG_LIBOPENJPEG_ENCODER 0
 %define CONFIG_LIBOPUS_ENCODER 0
+%define CONFIG_LIBRAV1E_ENCODER 0
 %define CONFIG_LIBSHINE_ENCODER 0
 %define CONFIG_LIBSPEEX_ENCODER 0
 %define CONFIG_LIBTHEORA_ENCODER 0
@@ -1403,10 +1456,12 @@
 %define CONFIG_MJPEG_VAAPI_ENCODER 0
 %define CONFIG_MPEG2_QSV_ENCODER 0
 %define CONFIG_MPEG2_VAAPI_ENCODER 0
+%define CONFIG_MPEG4_OMX_ENCODER 0
 %define CONFIG_MPEG4_V4L2M2M_ENCODER 0
 %define CONFIG_VP8_V4L2M2M_ENCODER 0
 %define CONFIG_VP8_VAAPI_ENCODER 0
 %define CONFIG_VP9_VAAPI_ENCODER 0
+%define CONFIG_VP9_QSV_ENCODER 0
 %define CONFIG_H263_VAAPI_HWACCEL 0
 %define CONFIG_H263_VIDEOTOOLBOX_HWACCEL 0
 %define CONFIG_H264_D3D11VA_HWACCEL 0
@@ -1454,6 +1509,7 @@
 %define CONFIG_VP9_DXVA2_HWACCEL 0
 %define CONFIG_VP9_NVDEC_HWACCEL 0
 %define CONFIG_VP9_VAAPI_HWACCEL 0
+%define CONFIG_VP9_VDPAU_HWACCEL 0
 %define CONFIG_WMV3_D3D11VA_HWACCEL 0
 %define CONFIG_WMV3_D3D11VA2_HWACCEL 0
 %define CONFIG_WMV3_DXVA2_HWACCEL 0
@@ -1478,7 +1534,9 @@
 %define CONFIG_DVDSUB_PARSER 0
 %define CONFIG_DVD_NAV_PARSER 0
 %define CONFIG_FLAC_PARSER 1
+%define CONFIG_G723_1_PARSER 0
 %define CONFIG_G729_PARSER 0
+%define CONFIG_GIF_PARSER 0
 %define CONFIG_GSM_PARSER 1
 %define CONFIG_H261_PARSER 0
 %define CONFIG_H263_PARSER 1
@@ -1502,13 +1560,13 @@
 %define CONFIG_VP3_PARSER 1
 %define CONFIG_VP8_PARSER 1
 %define CONFIG_VP9_PARSER 1
+%define CONFIG_WEBP_PARSER 0
 %define CONFIG_XMA_PARSER 0
 %define CONFIG_ALSA_INDEV 0
 %define CONFIG_ANDROID_CAMERA_INDEV 0
 %define CONFIG_AVFOUNDATION_INDEV 0
 %define CONFIG_BKTR_INDEV 0
 %define CONFIG_DECKLINK_INDEV 0
-%define CONFIG_LIBNDI_NEWTEK_INDEV 0
 %define CONFIG_DSHOW_INDEV 0
 %define CONFIG_FBDEV_INDEV 0
 %define CONFIG_GDIGRAB_INDEV 0
@@ -1528,7 +1586,6 @@
 %define CONFIG_ALSA_OUTDEV 0
 %define CONFIG_CACA_OUTDEV 0
 %define CONFIG_DECKLINK_OUTDEV 0
-%define CONFIG_LIBNDI_NEWTEK_OUTDEV 0
 %define CONFIG_FBDEV_OUTDEV 0
 %define CONFIG_OPENGL_OUTDEV 0
 %define CONFIG_OSS_OUTDEV 0
@@ -1569,6 +1626,8 @@
 %define CONFIG_AMIX_FILTER 0
 %define CONFIG_AMULTIPLY_FILTER 0
 %define CONFIG_ANEQUALIZER_FILTER 0
+%define CONFIG_ANLMDN_FILTER 0
+%define CONFIG_ANLMS_FILTER 0
 %define CONFIG_ANULL_FILTER 0
 %define CONFIG_APAD_FILTER 0
 %define CONFIG_APERMS_FILTER 0
@@ -1577,6 +1636,7 @@
 %define CONFIG_AREALTIME_FILTER 0
 %define CONFIG_ARESAMPLE_FILTER 0
 %define CONFIG_AREVERSE_FILTER 0
+%define CONFIG_ARNNDN_FILTER 0
 %define CONFIG_ASELECT_FILTER 0
 %define CONFIG_ASENDCMD_FILTER 0
 %define CONFIG_ASETNSAMPLES_FILTER 0
@@ -1585,17 +1645,21 @@
 %define CONFIG_ASETTB_FILTER 0
 %define CONFIG_ASHOWINFO_FILTER 0
 %define CONFIG_ASIDEDATA_FILTER 0
+%define CONFIG_ASOFTCLIP_FILTER 0
 %define CONFIG_ASPLIT_FILTER 0
+%define CONFIG_ASR_FILTER 0
 %define CONFIG_ASTATS_FILTER 0
 %define CONFIG_ASTREAMSELECT_FILTER 0
 %define CONFIG_ATEMPO_FILTER 0
 %define CONFIG_ATRIM_FILTER 0
+%define CONFIG_AXCORRELATE_FILTER 0
 %define CONFIG_AZMQ_FILTER 0
 %define CONFIG_BANDPASS_FILTER 0
 %define CONFIG_BANDREJECT_FILTER 0
 %define CONFIG_BASS_FILTER 0
 %define CONFIG_BIQUAD_FILTER 0
 %define CONFIG_BS2B_FILTER 0
+%define CONFIG_CHROMABER_VULKAN_FILTER 0
 %define CONFIG_CHANNELMAP_FILTER 0
 %define CONFIG_CHANNELSPLIT_FILTER 0
 %define CONFIG_CHORUS_FILTER 0
@@ -1604,6 +1668,7 @@
 %define CONFIG_CROSSFEED_FILTER 0
 %define CONFIG_CRYSTALIZER_FILTER 0
 %define CONFIG_DCSHIFT_FILTER 0
+%define CONFIG_DEESSER_FILTER 0
 %define CONFIG_DRMETER_FILTER 0
 %define CONFIG_DYNAUDNORM_FILTER 0
 %define CONFIG_EARWAX_FILTER 0
@@ -1643,12 +1708,15 @@
 %define CONFIG_VOLUME_FILTER 0
 %define CONFIG_VOLUMEDETECT_FILTER 0
 %define CONFIG_AEVALSRC_FILTER 0
+%define CONFIG_AFIRSRC_FILTER 0
 %define CONFIG_ANOISESRC_FILTER 0
 %define CONFIG_ANULLSRC_FILTER 0
 %define CONFIG_FLITE_FILTER 0
 %define CONFIG_HILBERT_FILTER 0
+%define CONFIG_SINC_FILTER 0
 %define CONFIG_SINE_FILTER 0
 %define CONFIG_ANULLSINK_FILTER 0
+%define CONFIG_ADDROI_FILTER 0
 %define CONFIG_ALPHAEXTRACT_FILTER 0
 %define CONFIG_ALPHAMERGE_FILTER 0
 %define CONFIG_AMPLIFY_FILTER 0
@@ -1656,8 +1724,10 @@
 %define CONFIG_ATADENOISE_FILTER 0
 %define CONFIG_AVGBLUR_FILTER 0
 %define CONFIG_AVGBLUR_OPENCL_FILTER 0
+%define CONFIG_AVGBLUR_VULKAN_FILTER 0
 %define CONFIG_BBOX_FILTER 0
 %define CONFIG_BENCH_FILTER 0
+%define CONFIG_BILATERAL_FILTER 0
 %define CONFIG_BITPLANENOISE_FILTER 0
 %define CONFIG_BLACKDETECT_FILTER 0
 %define CONFIG_BLACKFRAME_FILTER 0
@@ -1666,12 +1736,17 @@
 %define CONFIG_BOXBLUR_FILTER 0
 %define CONFIG_BOXBLUR_OPENCL_FILTER 0
 %define CONFIG_BWDIF_FILTER 0
+%define CONFIG_CAS_FILTER 0
+%define CONFIG_CHROMAHOLD_FILTER 0
 %define CONFIG_CHROMAKEY_FILTER 0
+%define CONFIG_CHROMASHIFT_FILTER 0
 %define CONFIG_CIESCOPE_FILTER 0
 %define CONFIG_CODECVIEW_FILTER 0
 %define CONFIG_COLORBALANCE_FILTER 0
 %define CONFIG_COLORCHANNELMIXER_FILTER 0
 %define CONFIG_COLORKEY_FILTER 0
+%define CONFIG_COLORKEY_OPENCL_FILTER 0
+%define CONFIG_COLORHOLD_FILTER 0
 %define CONFIG_COLORLEVELS_FILTER 0
 %define CONFIG_COLORMATRIX_FILTER 0
 %define CONFIG_COLORSPACE_FILTER 0
@@ -1691,6 +1766,7 @@
 %define CONFIG_DEBLOCK_FILTER 0
 %define CONFIG_DECIMATE_FILTER 0
 %define CONFIG_DECONVOLVE_FILTER 0
+%define CONFIG_DEDOT_FILTER 0
 %define CONFIG_DEFLATE_FILTER 0
 %define CONFIG_DEFLICKER_FILTER 0
 %define CONFIG_DEINTERLACE_QSV_FILTER 0
@@ -1698,12 +1774,15 @@
 %define CONFIG_DEJUDDER_FILTER 0
 %define CONFIG_DELOGO_FILTER 0
 %define CONFIG_DENOISE_VAAPI_FILTER 0
+%define CONFIG_DERAIN_FILTER 0
 %define CONFIG_DESHAKE_FILTER 0
+%define CONFIG_DESHAKE_OPENCL_FILTER 0
 %define CONFIG_DESPILL_FILTER 0
 %define CONFIG_DETELECINE_FILTER 0
 %define CONFIG_DILATION_FILTER 0
 %define CONFIG_DILATION_OPENCL_FILTER 0
 %define CONFIG_DISPLACE_FILTER 0
+%define CONFIG_DNN_PROCESSING_FILTER 0
 %define CONFIG_DOUBLEWEAVE_FILTER 0
 %define CONFIG_DRAWBOX_FILTER 0
 %define CONFIG_DRAWGRAPH_FILTER 0
@@ -1731,11 +1810,14 @@
 %define CONFIG_FRAMEPACK_FILTER 0
 %define CONFIG_FRAMERATE_FILTER 0
 %define CONFIG_FRAMESTEP_FILTER 0
+%define CONFIG_FREEZEDETECT_FILTER 0
+%define CONFIG_FREEZEFRAMES_FILTER 0
 %define CONFIG_FREI0R_FILTER 0
 %define CONFIG_FSPP_FILTER 0
 %define CONFIG_GBLUR_FILTER 0
 %define CONFIG_GEQ_FILTER 0
 %define CONFIG_GRADFUN_FILTER 0
+%define CONFIG_GRAPHMONITOR_FILTER 0
 %define CONFIG_GREYEDGE_FILTER 0
 %define CONFIG_HALDCLUT_FILTER 0
 %define CONFIG_HFLIP_FILTER 0
@@ -1756,6 +1838,7 @@
 %define CONFIG_INTERLACE_FILTER 0
 %define CONFIG_INTERLEAVE_FILTER 0
 %define CONFIG_KERNDEINT_FILTER 0
+%define CONFIG_LAGFUN_FILTER 0
 %define CONFIG_LENSCORRECTION_FILTER 0
 %define CONFIG_LENSFUN_FILTER 0
 %define CONFIG_LIBVMAF_FILTER 0
@@ -1769,8 +1852,13 @@
 %define CONFIG_LUTRGB_FILTER 0
 %define CONFIG_LUTYUV_FILTER 0
 %define CONFIG_MASKEDCLAMP_FILTER 0
+%define CONFIG_MASKEDMAX_FILTER 0
 %define CONFIG_MASKEDMERGE_FILTER 0
+%define CONFIG_MASKEDMIN_FILTER 0
+%define CONFIG_MASKEDTHRESHOLD_FILTER 0
+%define CONFIG_MASKFUN_FILTER 0
 %define CONFIG_MCDEINT_FILTER 0
+%define CONFIG_MEDIAN_FILTER 0
 %define CONFIG_MERGEPLANES_FILTER 0
 %define CONFIG_MESTIMATE_FILTER 0
 %define CONFIG_METADATA_FILTER 0
@@ -1780,6 +1868,7 @@
 %define CONFIG_MPDECIMATE_FILTER 0
 %define CONFIG_NEGATE_FILTER 0
 %define CONFIG_NLMEANS_FILTER 0
+%define CONFIG_NLMEANS_OPENCL_FILTER 0
 %define CONFIG_NNEDI_FILTER 0
 %define CONFIG_NOFORMAT_FILTER 0
 %define CONFIG_NOISE_FILTER 0
@@ -1791,13 +1880,17 @@
 %define CONFIG_OVERLAY_FILTER 0
 %define CONFIG_OVERLAY_OPENCL_FILTER 0
 %define CONFIG_OVERLAY_QSV_FILTER 0
+%define CONFIG_OVERLAY_VULKAN_FILTER 0
+%define CONFIG_OVERLAY_CUDA_FILTER 0
 %define CONFIG_OWDENOISE_FILTER 0
 %define CONFIG_PAD_FILTER 0
+%define CONFIG_PAD_OPENCL_FILTER 0
 %define CONFIG_PALETTEGEN_FILTER 0
 %define CONFIG_PALETTEUSE_FILTER 0
 %define CONFIG_PERMS_FILTER 0
 %define CONFIG_PERSPECTIVE_FILTER 0
 %define CONFIG_PHASE_FILTER 0
+%define CONFIG_PHOTOSENSITIVITY_FILTER 0
 %define CONFIG_PIXDESCTEST_FILTER 0
 %define CONFIG_PIXSCOPE_FILTER 0
 %define CONFIG_PP_FILTER 0
@@ -1820,6 +1913,7 @@
 %define CONFIG_REMOVELOGO_FILTER 0
 %define CONFIG_REPEATFIELDS_FILTER 0
 %define CONFIG_REVERSE_FILTER 0
+%define CONFIG_RGBASHIFT_FILTER 0
 %define CONFIG_ROBERTS_FILTER 0
 %define CONFIG_ROBERTS_OPENCL_FILTER 0
 %define CONFIG_ROTATE_FILTER 0
@@ -1829,13 +1923,16 @@
 %define CONFIG_SCALE_NPP_FILTER 0
 %define CONFIG_SCALE_QSV_FILTER 0
 %define CONFIG_SCALE_VAAPI_FILTER 0
+%define CONFIG_SCALE_VULKAN_FILTER 0
 %define CONFIG_SCALE2REF_FILTER 0
+%define CONFIG_SCROLL_FILTER 0
 %define CONFIG_SELECT_FILTER 0
 %define CONFIG_SELECTIVECOLOR_FILTER 0
 %define CONFIG_SENDCMD_FILTER 0
 %define CONFIG_SEPARATEFIELDS_FILTER 0
 %define CONFIG_SETDAR_FILTER 0
 %define CONFIG_SETFIELD_FILTER 0
+%define CONFIG_SETPARAMS_FILTER 0
 %define CONFIG_SETPTS_FILTER 0
 %define CONFIG_SETRANGE_FILTER 0
 %define CONFIG_SETSAR_FILTER 0
@@ -1863,26 +1960,34 @@
 %define CONFIG_SWAPUV_FILTER 0
 %define CONFIG_TBLEND_FILTER 0
 %define CONFIG_TELECINE_FILTER 0
+%define CONFIG_THISTOGRAM_FILTER 0
 %define CONFIG_THRESHOLD_FILTER 0
 %define CONFIG_THUMBNAIL_FILTER 0
 %define CONFIG_THUMBNAIL_CUDA_FILTER 0
 %define CONFIG_TILE_FILTER 0
 %define CONFIG_TINTERLACE_FILTER 0
 %define CONFIG_TLUT2_FILTER 0
+%define CONFIG_TMEDIAN_FILTER 0
 %define CONFIG_TMIX_FILTER 0
 %define CONFIG_TONEMAP_FILTER 0
 %define CONFIG_TONEMAP_OPENCL_FILTER 0
+%define CONFIG_TONEMAP_VAAPI_FILTER 0
+%define CONFIG_TPAD_FILTER 0
 %define CONFIG_TRANSPOSE_FILTER 0
 %define CONFIG_TRANSPOSE_NPP_FILTER 0
+%define CONFIG_TRANSPOSE_OPENCL_FILTER 0
+%define CONFIG_TRANSPOSE_VAAPI_FILTER 0
 %define CONFIG_TRIM_FILTER 0
 %define CONFIG_UNPREMULTIPLY_FILTER 0
 %define CONFIG_UNSHARP_FILTER 0
 %define CONFIG_UNSHARP_OPENCL_FILTER 0
 %define CONFIG_USPP_FILTER 0
+%define CONFIG_V360_FILTER 0
 %define CONFIG_VAGUEDENOISER_FILTER 0
 %define CONFIG_VECTORSCOPE_FILTER 0
 %define CONFIG_VFLIP_FILTER 0
 %define CONFIG_VFRDET_FILTER 0
+%define CONFIG_VIBRANCE_FILTER 0
 %define CONFIG_VIDSTABDETECT_FILTER 0
 %define CONFIG_VIDSTABTRANSFORM_FILTER 0
 %define CONFIG_VIGNETTE_FILTER 0
@@ -1893,7 +1998,13 @@
 %define CONFIG_WAVEFORM_FILTER 0
 %define CONFIG_WEAVE_FILTER 0
 %define CONFIG_XBR_FILTER 0
+%define CONFIG_XFADE_FILTER 0
+%define CONFIG_XFADE_OPENCL_FILTER 0
+%define CONFIG_XMEDIAN_FILTER 0
+%define CONFIG_XSTACK_FILTER 0
 %define CONFIG_YADIF_FILTER 0
+%define CONFIG_YADIF_CUDA_FILTER 0
+%define CONFIG_YAEPBLUR_FILTER 0
 %define CONFIG_ZMQ_FILTER 0
 %define CONFIG_ZOOMPAN_FILTER 0
 %define CONFIG_ZSCALE_FILTER 0
@@ -1912,6 +2023,7 @@
 %define CONFIG_PAL75BARS_FILTER 0
 %define CONFIG_PAL100BARS_FILTER 0
 %define CONFIG_RGBTESTSRC_FILTER 0
+%define CONFIG_SIERPINSKI_FILTER 0
 %define CONFIG_SMPTEBARS_FILTER 0
 %define CONFIG_SMPTEHDBARS_FILTER 0
 %define CONFIG_TESTSRC_FILTER 0
@@ -1920,12 +2032,14 @@
 %define CONFIG_NULLSINK_FILTER 0
 %define CONFIG_ABITSCOPE_FILTER 0
 %define CONFIG_ADRAWGRAPH_FILTER 0
+%define CONFIG_AGRAPHMONITOR_FILTER 0
 %define CONFIG_AHISTOGRAM_FILTER 0
 %define CONFIG_APHASEMETER_FILTER 0
 %define CONFIG_AVECTORSCOPE_FILTER 0
 %define CONFIG_CONCAT_FILTER 0
 %define CONFIG_SHOWCQT_FILTER 0
 %define CONFIG_SHOWFREQS_FILTER 0
+%define CONFIG_SHOWSPATIAL_FILTER 0
 %define CONFIG_SHOWSPECTRUM_FILTER 0
 %define CONFIG_SHOWSPECTRUMPIC_FILTER 0
 %define CONFIG_SHOWVOLUME_FILTER 0
@@ -1949,21 +2063,25 @@
 %define CONFIG_AFC_DEMUXER 0
 %define CONFIG_AIFF_DEMUXER 0
 %define CONFIG_AIX_DEMUXER 0
+%define CONFIG_ALP_DEMUXER 0
 %define CONFIG_AMR_DEMUXER 1
 %define CONFIG_AMRNB_DEMUXER 0
 %define CONFIG_AMRWB_DEMUXER 0
 %define CONFIG_ANM_DEMUXER 0
 %define CONFIG_APC_DEMUXER 0
 %define CONFIG_APE_DEMUXER 0
+%define CONFIG_APM_DEMUXER 0
 %define CONFIG_APNG_DEMUXER 0
 %define CONFIG_APTX_DEMUXER 0
 %define CONFIG_APTX_HD_DEMUXER 0
 %define CONFIG_AQTITLE_DEMUXER 0
+%define CONFIG_ARGO_ASF_DEMUXER 0
 %define CONFIG_ASF_DEMUXER 0
 %define CONFIG_ASF_O_DEMUXER 0
 %define CONFIG_ASS_DEMUXER 0
 %define CONFIG_AST_DEMUXER 0
 %define CONFIG_AU_DEMUXER 0
+%define CONFIG_AV1_DEMUXER 0
 %define CONFIG_AVI_DEMUXER 1
 %define CONFIG_AVISYNTH_DEMUXER 0
 %define CONFIG_AVR_DEMUXER 0
@@ -1991,7 +2109,9 @@
 %define CONFIG_DATA_DEMUXER 0
 %define CONFIG_DAUD_DEMUXER 0
 %define CONFIG_DCSTR_DEMUXER 0
+%define CONFIG_DERF_DEMUXER 0
 %define CONFIG_DFA_DEMUXER 0
+%define CONFIG_DHAV_DEMUXER 0
 %define CONFIG_DIRAC_DEMUXER 0
 %define CONFIG_DNXHD_DEMUXER 0
 %define CONFIG_DSF_DEMUXER 0
@@ -2017,6 +2137,7 @@
 %define CONFIG_FOURXM_DEMUXER 0
 %define CONFIG_FRM_DEMUXER 0
 %define CONFIG_FSB_DEMUXER 0
+%define CONFIG_FWSE_DEMUXER 0
 %define CONFIG_G722_DEMUXER 0
 %define CONFIG_G723_1_DEMUXER 0
 %define CONFIG_G726_DEMUXER 0
@@ -2030,6 +2151,8 @@
 %define CONFIG_H261_DEMUXER 0
 %define CONFIG_H263_DEMUXER 0
 %define CONFIG_H264_DEMUXER 0
+%define CONFIG_HCA_DEMUXER 0
+%define CONFIG_HCOM_DEMUXER 0
 %define CONFIG_HEVC_DEMUXER 0
 %define CONFIG_HLS_DEMUXER 0
 %define CONFIG_HNM_DEMUXER 0
@@ -2037,6 +2160,7 @@
 %define CONFIG_IDCIN_DEMUXER 0
 %define CONFIG_IDF_DEMUXER 0
 %define CONFIG_IFF_DEMUXER 0
+%define CONFIG_IFV_DEMUXER 0
 %define CONFIG_ILBC_DEMUXER 0
 %define CONFIG_IMAGE2_DEMUXER 0
 %define CONFIG_IMAGE2PIPE_DEMUXER 0
@@ -2051,6 +2175,8 @@
 %define CONFIG_IVR_DEMUXER 0
 %define CONFIG_JACOSUB_DEMUXER 0
 %define CONFIG_JV_DEMUXER 0
+%define CONFIG_KUX_DEMUXER 0
+%define CONFIG_KVAG_DEMUXER 0
 %define CONFIG_LMLM4_DEMUXER 0
 %define CONFIG_LOAS_DEMUXER 0
 %define CONFIG_LRC_DEMUXER 0
@@ -2097,6 +2223,7 @@
 %define CONFIG_PAF_DEMUXER 0
 %define CONFIG_PCM_ALAW_DEMUXER 0
 %define CONFIG_PCM_MULAW_DEMUXER 0
+%define CONFIG_PCM_VIDC_DEMUXER 0
 %define CONFIG_PCM_F64BE_DEMUXER 0
 %define CONFIG_PCM_F64LE_DEMUXER 0
 %define CONFIG_PCM_F32BE_DEMUXER 0
@@ -2177,6 +2304,7 @@
 %define CONFIG_VAG_DEMUXER 0
 %define CONFIG_VC1_DEMUXER 0
 %define CONFIG_VC1T_DEMUXER 0
+%define CONFIG_VIVIDAS_DEMUXER 0
 %define CONFIG_VIVO_DEMUXER 0
 %define CONFIG_VMD_DEMUXER 0
 %define CONFIG_VOBSUB_DEMUXER 0
@@ -2206,6 +2334,7 @@
 %define CONFIG_IMAGE_DDS_PIPE_DEMUXER 0
 %define CONFIG_IMAGE_DPX_PIPE_DEMUXER 0
 %define CONFIG_IMAGE_EXR_PIPE_DEMUXER 0
+%define CONFIG_IMAGE_GIF_PIPE_DEMUXER 0
 %define CONFIG_IMAGE_J2K_PIPE_DEMUXER 0
 %define CONFIG_IMAGE_JPEG_PIPE_DEMUXER 0
 %define CONFIG_IMAGE_JPEGLS_PIPE_DEMUXER 0
@@ -2330,6 +2459,7 @@
 %define CONFIG_OPUS_MUXER 0
 %define CONFIG_PCM_ALAW_MUXER 0
 %define CONFIG_PCM_MULAW_MUXER 0
+%define CONFIG_PCM_VIDC_MUXER 0
 %define CONFIG_PCM_F64BE_MUXER 0
 %define CONFIG_PCM_F64LE_MUXER 0
 %define CONFIG_PCM_F32BE_MUXER 0
@@ -2369,6 +2499,7 @@
 %define CONFIG_SPX_MUXER 0
 %define CONFIG_SPDIF_MUXER 0
 %define CONFIG_SRT_MUXER 0
+%define CONFIG_STREAMHASH_MUXER 0
 %define CONFIG_SUP_MUXER 0
 %define CONFIG_SWF_MUXER 0
 %define CONFIG_TEE_MUXER 0
@@ -2429,6 +2560,7 @@
 %define CONFIG_UDP_PROTOCOL 0
 %define CONFIG_UDPLITE_PROTOCOL 0
 %define CONFIG_UNIX_PROTOCOL 0
+%define CONFIG_LIBAMQP_PROTOCOL 0
 %define CONFIG_LIBRTMP_PROTOCOL 0
 %define CONFIG_LIBRTMPE_PROTOCOL 0
 %define CONFIG_LIBRTMPS_PROTOCOL 0
@@ -2437,3 +2569,4 @@
 %define CONFIG_LIBSRT_PROTOCOL 0
 %define CONFIG_LIBSSH_PROTOCOL 0
 %define CONFIG_LIBSMBCLIENT_PROTOCOL 0
+%define CONFIG_LIBZMQ_PROTOCOL 0
diff --git a/fuchsia/config/max/x64/config.h b/fuchsia/config/max/x64/config.h
index a5b5c94..8bb13d1 100644
--- a/fuchsia/config/max/x64/config.h
+++ b/fuchsia/config/max/x64/config.h
@@ -3,10 +3,10 @@
 #define FFMPEG_CONFIG_H
 #define FFMPEG_CONFIGURATION "--disable-everything --disable-all --disable-doc --disable-htmlpages --disable-manpages --disable-podpages --disable-txtpages --disable-static --enable-avcodec --enable-avformat --enable-avutil --enable-fft --enable-rdft --enable-static --enable-libopus --disable-debug --disable-bzlib --disable-iconv --disable-lzo --disable-network --disable-schannel --disable-sdl2 --disable-symver --disable-xlib --disable-zlib --disable-securetransport --disable-faan --disable-alsa --disable-autodetect --enable-decoder='vorbis,libopus,flac' --enable-decoder='pcm_u8,pcm_s16le,pcm_s24le,pcm_s32le,pcm_f32le,mp3' --enable-decoder='pcm_s16be,pcm_s24be,pcm_mulaw,pcm_alaw' --enable-decoder='theora,vp8,sbc,aptx' --enable-demuxer='ogg,matroska,wav,flac,mp3,mov' --enable-parser='opus,vorbis,flac,mpegaudio' --extra-cflags=-I/usr/local/google/home/dalesat/fuchsia/third_party/opus/include --enable-parser='vp3,vp8' --optflags='\"-O2\"' --enable-pic --x86asmexe=yasm --enable-pic --enable-lto --cc=clang --cxx=clang++ --ld=clang --enable-decoder=vp9 --enable-parser=vp9 --sysroot=/usr/local/google/home/dalesat/fuchsia/third_party/ffmpeg/../../prebuilt/third_party/sysroot/linux --extra-ldflags='-fuse-ld=lld' --enable-decoder='aac,aac_latm,h264,mp3' --enable-demuxer='aac,mp3,mov' --enable-parser='aac,aac_latm,h264,mpegaudio' --enable-decoder=mpeg4 --enable-parser='h263,mpeg4video' --enable-demuxer=avi --enable-demuxer=amr --enable-decoder='amrnb,amrwb' --enable-decoder=gsm_ms --enable-demuxer=gsm --enable-parser=gsm"
 #define FFMPEG_LICENSE "LGPL version 2.1 or later"
-#define CONFIG_THIS_YEAR 2018
+#define CONFIG_THIS_YEAR 2020
 #define FFMPEG_DATADIR "/usr/local/share/ffmpeg"
 #define AVCONV_DATADIR "/usr/local/share/ffmpeg"
-#define CC_IDENT "Fuchsia clang version 11.0.0 (https://fuchsia.googlesource.com/a/third_party/llvm-project 6e00e3fcb082c3f19309ebc6f184ab326eec3328)"
+#define CC_IDENT "Fuchsia clang version 11.0.0 (https://fuchsia.googlesource.com/a/third_party/llvm-project dd484baffdf4a92e564c38a17d35a742e633b0e0)"
 #define av_restrict restrict
 #define EXTERN_PREFIX ""
 #define EXTERN_ASM 
@@ -80,6 +80,7 @@
 #define HAVE_MIPSDSP 0
 #define HAVE_MIPSDSPR2 0
 #define HAVE_MSA 0
+#define HAVE_MSA2 0
 #define HAVE_LOONGSON2 0
 #define HAVE_LOONGSON3 0
 #define HAVE_MMI 0
@@ -125,6 +126,7 @@
 #define HAVE_MIPSDSP_EXTERNAL 0
 #define HAVE_MIPSDSPR2_EXTERNAL 0
 #define HAVE_MSA_EXTERNAL 0
+#define HAVE_MSA2_EXTERNAL 0
 #define HAVE_LOONGSON2_EXTERNAL 0
 #define HAVE_LOONGSON3_EXTERNAL 0
 #define HAVE_MMI_EXTERNAL 0
@@ -170,6 +172,7 @@
 #define HAVE_MIPSDSP_INLINE 0
 #define HAVE_MIPSDSPR2_INLINE 0
 #define HAVE_MSA_INLINE 0
+#define HAVE_MSA2_INLINE 0
 #define HAVE_LOONGSON2_INLINE 0
 #define HAVE_LOONGSON3_INLINE 0
 #define HAVE_MMI_INLINE 0
@@ -280,10 +283,12 @@
 #define HAVE_GETADDRINFO 0
 #define HAVE_GETHRTIME 0
 #define HAVE_GETOPT 1
+#define HAVE_GETMODULEHANDLE 0
 #define HAVE_GETPROCESSAFFINITYMASK 0
 #define HAVE_GETPROCESSMEMORYINFO 0
 #define HAVE_GETPROCESSTIMES 0
 #define HAVE_GETRUSAGE 1
+#define HAVE_GETSTDHANDLE 0
 #define HAVE_GETSYSTEMTIMEASFILETIME 0
 #define HAVE_GETTIMEOFDAY 1
 #define HAVE_GLOB 1
@@ -309,6 +314,7 @@
 #define HAVE_SECITEMIMPORT 0
 #define HAVE_SETCONSOLETEXTATTRIBUTE 0
 #define HAVE_SETCONSOLECTRLHANDLER 0
+#define HAVE_SETDLLDIRECTORY 0
 #define HAVE_SETMODE 0
 #define HAVE_SETRLIMIT 1
 #define HAVE_SLEEP 0
@@ -349,6 +355,10 @@
 #define HAVE_XFORM_ASM 0
 #define HAVE_XMM_CLOBBERS 1
 #define HAVE_KCMVIDEOCODECTYPE_HEVC 0
+#define HAVE_KCVPIXELFORMATTYPE_420YPCBCR10BIPLANARVIDEORANGE 0
+#define HAVE_KCVIMAGEBUFFERTRANSFERFUNCTION_SMPTE_ST_2084_PQ 0
+#define HAVE_KCVIMAGEBUFFERTRANSFERFUNCTION_ITU_R_2100_HLG 0
+#define HAVE_KCVIMAGEBUFFERTRANSFERFUNCTION_LINEAR 0
 #define HAVE_SOCKLEN_T 0
 #define HAVE_STRUCT_ADDRINFO 0
 #define HAVE_STRUCT_GROUP_SOURCE_REQ 0
@@ -362,7 +372,7 @@
 #define HAVE_STRUCT_SOCKADDR_SA_LEN 0
 #define HAVE_STRUCT_SOCKADDR_STORAGE 0
 #define HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC 1
-#define HAVE_STRUCT_V4L2_FRMIVALENUM_DISCRETE 1
+#define HAVE_STRUCT_V4L2_FRMIVALENUM_DISCRETE 0
 #define HAVE_MAKEINFO 0
 #define HAVE_MAKEINFO_HTML 0
 #define HAVE_OPENCL_D3D11 0
@@ -379,7 +389,7 @@
 #define CONFIG_MANPAGES 0
 #define CONFIG_PODPAGES 0
 #define CONFIG_TXTPAGES 0
-#define CONFIG_AVIO_DIR_CMD_EXAMPLE 1
+#define CONFIG_AVIO_LIST_DIR_EXAMPLE 1
 #define CONFIG_AVIO_READING_EXAMPLE 1
 #define CONFIG_DECODE_AUDIO_EXAMPLE 1
 #define CONFIG_DECODE_VIDEO_EXAMPLE 1
@@ -414,11 +424,11 @@
 #define CONFIG_LIBXAVS2 0
 #define CONFIG_LIBXVID 0
 #define CONFIG_DECKLINK 0
-#define CONFIG_LIBNDI_NEWTEK 0
 #define CONFIG_LIBFDK_AAC 0
 #define CONFIG_OPENSSL 0
 #define CONFIG_LIBTLS 0
 #define CONFIG_GMP 0
+#define CONFIG_LIBARIBB24 0
 #define CONFIG_LIBLENSFUN 0
 #define CONFIG_LIBOPENCORE_AMRNB 0
 #define CONFIG_LIBOPENCORE_AMRWB 0
@@ -439,12 +449,14 @@
 #define CONFIG_LIBCACA 0
 #define CONFIG_LIBCELT 0
 #define CONFIG_LIBCODEC2 0
+#define CONFIG_LIBDAV1D 0
 #define CONFIG_LIBDC1394 0
 #define CONFIG_LIBDRM 0
 #define CONFIG_LIBFLITE 0
 #define CONFIG_LIBFONTCONFIG 0
 #define CONFIG_LIBFREETYPE 0
 #define CONFIG_LIBFRIBIDI 0
+#define CONFIG_LIBGLSLANG 0
 #define CONFIG_LIBGME 0
 #define CONFIG_LIBGSM 0
 #define CONFIG_LIBIEC61883 0
@@ -461,6 +473,8 @@
 #define CONFIG_LIBOPENMPT 0
 #define CONFIG_LIBOPUS 1
 #define CONFIG_LIBPULSE 0
+#define CONFIG_LIBRABBITMQ 0
+#define CONFIG_LIBRAV1E 0
 #define CONFIG_LIBRSVG 0
 #define CONFIG_LIBRTMP 0
 #define CONFIG_LIBSHINE 0
@@ -487,6 +501,7 @@
 #define CONFIG_MEDIACODEC 0
 #define CONFIG_OPENAL 0
 #define CONFIG_OPENGL 0
+#define CONFIG_POCKETSPHINX 0
 #define CONFIG_VAPOURSYNTH 0
 #define CONFIG_ALSA 0
 #define CONFIG_APPKIT 0
@@ -505,16 +520,19 @@
 #define CONFIG_SNDIO 0
 #define CONFIG_XLIB 0
 #define CONFIG_ZLIB 0
+#define CONFIG_CUDA_NVCC 0
 #define CONFIG_CUDA_SDK 0
 #define CONFIG_LIBNPP 0
 #define CONFIG_LIBMFX 0
 #define CONFIG_MMAL 0
 #define CONFIG_OMX 0
 #define CONFIG_OPENCL 0
+#define CONFIG_VULKAN 0
 #define CONFIG_AMF 0
 #define CONFIG_AUDIOTOOLBOX 0
 #define CONFIG_CRYSTALHD 0
 #define CONFIG_CUDA 0
+#define CONFIG_CUDA_LLVM 0
 #define CONFIG_CUVID 0
 #define CONFIG_D3D11VA 0
 #define CONFIG_DXVA2 0
@@ -565,6 +583,7 @@
 #define CONFIG_RDFT 1
 #define CONFIG_AUTODETECT 0
 #define CONFIG_FONTCONFIG 0
+#define CONFIG_LARGE_TESTS 1
 #define CONFIG_LINUX_PERF 0
 #define CONFIG_MEMORY_POISONING 0
 #define CONFIG_NEON_CLOBBER_TEST 0
@@ -657,6 +676,7 @@
 #define CONFIG_RTPDEC 0
 #define CONFIG_RTPENC_CHAIN 0
 #define CONFIG_RV34DSP 0
+#define CONFIG_SCENE_SAD 0
 #define CONFIG_SINEWIN 1
 #define CONFIG_SNAPPY 0
 #define CONFIG_SRTP 0
@@ -674,6 +694,8 @@
 #define CONFIG_WMA_FREQS 0
 #define CONFIG_WMV2DSP 0
 #define CONFIG_AAC_ADTSTOASC_BSF 0
+#define CONFIG_AV1_FRAME_MERGE_BSF 0
+#define CONFIG_AV1_FRAME_SPLIT_BSF 0
 #define CONFIG_AV1_METADATA_BSF 0
 #define CONFIG_CHOMP_BSF 0
 #define CONFIG_DUMP_EXTRADATA_BSF 0
@@ -696,9 +718,11 @@
 #define CONFIG_MOV2TEXTSUB_BSF 0
 #define CONFIG_NOISE_BSF 0
 #define CONFIG_NULL_BSF 1
+#define CONFIG_PRORES_METADATA_BSF 0
 #define CONFIG_REMOVE_EXTRADATA_BSF 0
 #define CONFIG_TEXT2MOVSUB_BSF 0
 #define CONFIG_TRACE_HEADERS_BSF 0
+#define CONFIG_TRUEHD_CORE_BSF 0
 #define CONFIG_VP9_METADATA_BSF 0
 #define CONFIG_VP9_RAW_REORDER_BSF 0
 #define CONFIG_VP9_SUPERFRAME_BSF 0
@@ -706,10 +730,12 @@
 #define CONFIG_AASC_DECODER 0
 #define CONFIG_AIC_DECODER 0
 #define CONFIG_ALIAS_PIX_DECODER 0
+#define CONFIG_AGM_DECODER 0
 #define CONFIG_AMV_DECODER 0
 #define CONFIG_ANM_DECODER 0
 #define CONFIG_ANSI_DECODER 0
 #define CONFIG_APNG_DECODER 0
+#define CONFIG_ARBC_DECODER 0
 #define CONFIG_ASV1_DECODER 0
 #define CONFIG_ASV2_DECODER 0
 #define CONFIG_AURA_DECODER 0
@@ -729,6 +755,7 @@
 #define CONFIG_C93_DECODER 0
 #define CONFIG_CAVS_DECODER 0
 #define CONFIG_CDGRAPHICS_DECODER 0
+#define CONFIG_CDTOONS_DECODER 0
 #define CONFIG_CDXL_DECODER 0
 #define CONFIG_CFHD_DECODER 0
 #define CONFIG_CINEPAK_DECODER 0
@@ -797,9 +824,11 @@
 #define CONFIG_HQ_HQA_DECODER 0
 #define CONFIG_HQX_DECODER 0
 #define CONFIG_HUFFYUV_DECODER 0
+#define CONFIG_HYMT_DECODER 0
 #define CONFIG_IDCIN_DECODER 0
 #define CONFIG_IFF_ILBM_DECODER 0
 #define CONFIG_IMM4_DECODER 0
+#define CONFIG_IMM5_DECODER 0
 #define CONFIG_INDEO2_DECODER 0
 #define CONFIG_INDEO3_DECODER 0
 #define CONFIG_INDEO4_DECODER 0
@@ -812,6 +841,7 @@
 #define CONFIG_KMVC_DECODER 0
 #define CONFIG_LAGARITH_DECODER 0
 #define CONFIG_LOCO_DECODER 0
+#define CONFIG_LSCR_DECODER 0
 #define CONFIG_M101_DECODER 0
 #define CONFIG_MAGICYUV_DECODER 0
 #define CONFIG_MDEC_DECODER 0
@@ -845,8 +875,11 @@
 #define CONFIG_MSVIDEO1_DECODER 0
 #define CONFIG_MSZH_DECODER 0
 #define CONFIG_MTS2_DECODER 0
+#define CONFIG_MV30_DECODER 0
 #define CONFIG_MVC1_DECODER 0
 #define CONFIG_MVC2_DECODER 0
+#define CONFIG_MVDV_DECODER 0
+#define CONFIG_MVHA_DECODER 0
 #define CONFIG_MWSC_DECODER 0
 #define CONFIG_MXPEG_DECODER 0
 #define CONFIG_NUV_DECODER 0
@@ -883,7 +916,6 @@
 #define CONFIG_SANM_DECODER 0
 #define CONFIG_SCPR_DECODER 0
 #define CONFIG_SCREENPRESSO_DECODER 0
-#define CONFIG_SDX2_DPCM_DECODER 0
 #define CONFIG_SGI_DECODER 0
 #define CONFIG_SGIRLE_DECODER 0
 #define CONFIG_SHEERVIDEO_DECODER 0
@@ -930,6 +962,7 @@
 #define CONFIG_VMDVIDEO_DECODER 0
 #define CONFIG_VMNC_DECODER 0
 #define CONFIG_VP3_DECODER 1
+#define CONFIG_VP4_DECODER 0
 #define CONFIG_VP5_DECODER 0
 #define CONFIG_VP6_DECODER 0
 #define CONFIG_VP6A_DECODER 0
@@ -971,6 +1004,7 @@
 #define CONFIG_AAC_LATM_DECODER 1
 #define CONFIG_AC3_DECODER 0
 #define CONFIG_AC3_FIXED_DECODER 0
+#define CONFIG_ACELP_KELVIN_DECODER 0
 #define CONFIG_ALAC_DECODER 0
 #define CONFIG_ALS_DECODER 0
 #define CONFIG_AMRNB_DECODER 1
@@ -1005,6 +1039,8 @@
 #define CONFIG_G729_DECODER 0
 #define CONFIG_GSM_DECODER 0
 #define CONFIG_GSM_MS_DECODER 1
+#define CONFIG_HCA_DECODER 0
+#define CONFIG_HCOM_DECODER 0
 #define CONFIG_IAC_DECODER 0
 #define CONFIG_ILBC_DECODER 0
 #define CONFIG_IMC_DECODER 0
@@ -1038,6 +1074,7 @@
 #define CONFIG_SBC_DECODER 1
 #define CONFIG_SHORTEN_DECODER 0
 #define CONFIG_SIPR_DECODER 0
+#define CONFIG_SIREN_DECODER 0
 #define CONFIG_SMACKAUD_DECODER 0
 #define CONFIG_SONIC_DECODER 0
 #define CONFIG_TAK_DECODER 0
@@ -1089,16 +1126,20 @@
 #define CONFIG_PCM_U24LE_DECODER 0
 #define CONFIG_PCM_U32BE_DECODER 0
 #define CONFIG_PCM_U32LE_DECODER 0
-#define CONFIG_PCM_ZORK_DECODER 0
+#define CONFIG_PCM_VIDC_DECODER 0
+#define CONFIG_DERF_DPCM_DECODER 0
 #define CONFIG_GREMLIN_DPCM_DECODER 0
 #define CONFIG_INTERPLAY_DPCM_DECODER 0
 #define CONFIG_ROQ_DPCM_DECODER 0
+#define CONFIG_SDX2_DPCM_DECODER 0
 #define CONFIG_SOL_DPCM_DECODER 0
 #define CONFIG_XAN_DPCM_DECODER 0
 #define CONFIG_ADPCM_4XM_DECODER 0
 #define CONFIG_ADPCM_ADX_DECODER 0
 #define CONFIG_ADPCM_AFC_DECODER 0
+#define CONFIG_ADPCM_AGM_DECODER 0
 #define CONFIG_ADPCM_AICA_DECODER 0
+#define CONFIG_ADPCM_ARGO_DECODER 0
 #define CONFIG_ADPCM_CT_DECODER 0
 #define CONFIG_ADPCM_DTK_DECODER 0
 #define CONFIG_ADPCM_EA_DECODER 0
@@ -1111,16 +1152,20 @@
 #define CONFIG_ADPCM_G726_DECODER 0
 #define CONFIG_ADPCM_G726LE_DECODER 0
 #define CONFIG_ADPCM_IMA_AMV_DECODER 0
+#define CONFIG_ADPCM_IMA_ALP_DECODER 0
 #define CONFIG_ADPCM_IMA_APC_DECODER 0
+#define CONFIG_ADPCM_IMA_APM_DECODER 0
 #define CONFIG_ADPCM_IMA_DAT4_DECODER 0
 #define CONFIG_ADPCM_IMA_DK3_DECODER 0
 #define CONFIG_ADPCM_IMA_DK4_DECODER 0
 #define CONFIG_ADPCM_IMA_EA_EACS_DECODER 0
 #define CONFIG_ADPCM_IMA_EA_SEAD_DECODER 0
 #define CONFIG_ADPCM_IMA_ISS_DECODER 0
+#define CONFIG_ADPCM_IMA_MTF_DECODER 0
 #define CONFIG_ADPCM_IMA_OKI_DECODER 0
 #define CONFIG_ADPCM_IMA_QT_DECODER 0
 #define CONFIG_ADPCM_IMA_RAD_DECODER 0
+#define CONFIG_ADPCM_IMA_SSI_DECODER 0
 #define CONFIG_ADPCM_IMA_SMJPEG_DECODER 0
 #define CONFIG_ADPCM_IMA_WAV_DECODER 0
 #define CONFIG_ADPCM_IMA_WS_DECODER 0
@@ -1136,6 +1181,7 @@
 #define CONFIG_ADPCM_VIMA_DECODER 0
 #define CONFIG_ADPCM_XA_DECODER 0
 #define CONFIG_ADPCM_YAMAHA_DECODER 0
+#define CONFIG_ADPCM_ZORK_DECODER 0
 #define CONFIG_SSA_DECODER 0
 #define CONFIG_ASS_DECODER 0
 #define CONFIG_CCAPTION_DECODER 0
@@ -1173,9 +1219,10 @@
 #define CONFIG_PCM_MULAW_AT_DECODER 0
 #define CONFIG_QDMC_AT_DECODER 0
 #define CONFIG_QDM2_AT_DECODER 0
-#define CONFIG_LIBAOM_AV1_DECODER 0
+#define CONFIG_LIBARIBB24_DECODER 0
 #define CONFIG_LIBCELT_DECODER 0
 #define CONFIG_LIBCODEC2_DECODER 0
+#define CONFIG_LIBDAV1D_DECODER 0
 #define CONFIG_LIBDAVS2_DECODER 0
 #define CONFIG_LIBFDK_AAC_DECODER 0
 #define CONFIG_LIBGSM_DECODER 0
@@ -1194,11 +1241,13 @@
 #define CONFIG_BINTEXT_DECODER 0
 #define CONFIG_XBIN_DECODER 0
 #define CONFIG_IDF_DECODER 0
+#define CONFIG_LIBAOM_AV1_DECODER 0
 #define CONFIG_LIBOPENH264_DECODER 0
 #define CONFIG_H264_CUVID_DECODER 0
 #define CONFIG_HEVC_CUVID_DECODER 0
 #define CONFIG_HEVC_MEDIACODEC_DECODER 0
 #define CONFIG_MJPEG_CUVID_DECODER 0
+#define CONFIG_MJPEG_QSV_DECODER 0
 #define CONFIG_MPEG1_CUVID_DECODER 0
 #define CONFIG_MPEG2_CUVID_DECODER 0
 #define CONFIG_MPEG4_CUVID_DECODER 0
@@ -1209,6 +1258,7 @@
 #define CONFIG_VP8_QSV_DECODER 0
 #define CONFIG_VP9_CUVID_DECODER 0
 #define CONFIG_VP9_MEDIACODEC_DECODER 0
+#define CONFIG_VP9_QSV_DECODER 0
 #define CONFIG_A64MULTI_ENCODER 0
 #define CONFIG_A64MULTI5_ENCODER 0
 #define CONFIG_ALIAS_PIX_ENCODER 0
@@ -1315,6 +1365,7 @@
 #define CONFIG_WMAV1_ENCODER 0
 #define CONFIG_WMAV2_ENCODER 0
 #define CONFIG_PCM_ALAW_ENCODER 0
+#define CONFIG_PCM_DVD_ENCODER 0
 #define CONFIG_PCM_F32BE_ENCODER 0
 #define CONFIG_PCM_F32LE_ENCODER 0
 #define CONFIG_PCM_F64BE_ENCODER 0
@@ -1342,6 +1393,7 @@
 #define CONFIG_PCM_U24LE_ENCODER 0
 #define CONFIG_PCM_U32BE_ENCODER 0
 #define CONFIG_PCM_U32LE_ENCODER 0
+#define CONFIG_PCM_VIDC_ENCODER 0
 #define CONFIG_ROQ_DPCM_ENCODER 0
 #define CONFIG_ADPCM_ADX_ENCODER 0
 #define CONFIG_ADPCM_G722_ENCODER 0
@@ -1377,6 +1429,7 @@
 #define CONFIG_LIBOPENCORE_AMRNB_ENCODER 0
 #define CONFIG_LIBOPENJPEG_ENCODER 0
 #define CONFIG_LIBOPUS_ENCODER 0
+#define CONFIG_LIBRAV1E_ENCODER 0
 #define CONFIG_LIBSHINE_ENCODER 0
 #define CONFIG_LIBSPEEX_ENCODER 0
 #define CONFIG_LIBTHEORA_ENCODER 0
@@ -1418,10 +1471,12 @@
 #define CONFIG_MJPEG_VAAPI_ENCODER 0
 #define CONFIG_MPEG2_QSV_ENCODER 0
 #define CONFIG_MPEG2_VAAPI_ENCODER 0
+#define CONFIG_MPEG4_OMX_ENCODER 0
 #define CONFIG_MPEG4_V4L2M2M_ENCODER 0
 #define CONFIG_VP8_V4L2M2M_ENCODER 0
 #define CONFIG_VP8_VAAPI_ENCODER 0
 #define CONFIG_VP9_VAAPI_ENCODER 0
+#define CONFIG_VP9_QSV_ENCODER 0
 #define CONFIG_H263_VAAPI_HWACCEL 0
 #define CONFIG_H263_VIDEOTOOLBOX_HWACCEL 0
 #define CONFIG_H264_D3D11VA_HWACCEL 0
@@ -1469,6 +1524,7 @@
 #define CONFIG_VP9_DXVA2_HWACCEL 0
 #define CONFIG_VP9_NVDEC_HWACCEL 0
 #define CONFIG_VP9_VAAPI_HWACCEL 0
+#define CONFIG_VP9_VDPAU_HWACCEL 0
 #define CONFIG_WMV3_D3D11VA_HWACCEL 0
 #define CONFIG_WMV3_D3D11VA2_HWACCEL 0
 #define CONFIG_WMV3_DXVA2_HWACCEL 0
@@ -1493,7 +1549,9 @@
 #define CONFIG_DVDSUB_PARSER 0
 #define CONFIG_DVD_NAV_PARSER 0
 #define CONFIG_FLAC_PARSER 1
+#define CONFIG_G723_1_PARSER 0
 #define CONFIG_G729_PARSER 0
+#define CONFIG_GIF_PARSER 0
 #define CONFIG_GSM_PARSER 1
 #define CONFIG_H261_PARSER 0
 #define CONFIG_H263_PARSER 1
@@ -1517,13 +1575,13 @@
 #define CONFIG_VP3_PARSER 1
 #define CONFIG_VP8_PARSER 1
 #define CONFIG_VP9_PARSER 1
+#define CONFIG_WEBP_PARSER 0
 #define CONFIG_XMA_PARSER 0
 #define CONFIG_ALSA_INDEV 0
 #define CONFIG_ANDROID_CAMERA_INDEV 0
 #define CONFIG_AVFOUNDATION_INDEV 0
 #define CONFIG_BKTR_INDEV 0
 #define CONFIG_DECKLINK_INDEV 0
-#define CONFIG_LIBNDI_NEWTEK_INDEV 0
 #define CONFIG_DSHOW_INDEV 0
 #define CONFIG_FBDEV_INDEV 0
 #define CONFIG_GDIGRAB_INDEV 0
@@ -1543,7 +1601,6 @@
 #define CONFIG_ALSA_OUTDEV 0
 #define CONFIG_CACA_OUTDEV 0
 #define CONFIG_DECKLINK_OUTDEV 0
-#define CONFIG_LIBNDI_NEWTEK_OUTDEV 0
 #define CONFIG_FBDEV_OUTDEV 0
 #define CONFIG_OPENGL_OUTDEV 0
 #define CONFIG_OSS_OUTDEV 0
@@ -1584,6 +1641,8 @@
 #define CONFIG_AMIX_FILTER 0
 #define CONFIG_AMULTIPLY_FILTER 0
 #define CONFIG_ANEQUALIZER_FILTER 0
+#define CONFIG_ANLMDN_FILTER 0
+#define CONFIG_ANLMS_FILTER 0
 #define CONFIG_ANULL_FILTER 0
 #define CONFIG_APAD_FILTER 0
 #define CONFIG_APERMS_FILTER 0
@@ -1592,6 +1651,7 @@
 #define CONFIG_AREALTIME_FILTER 0
 #define CONFIG_ARESAMPLE_FILTER 0
 #define CONFIG_AREVERSE_FILTER 0
+#define CONFIG_ARNNDN_FILTER 0
 #define CONFIG_ASELECT_FILTER 0
 #define CONFIG_ASENDCMD_FILTER 0
 #define CONFIG_ASETNSAMPLES_FILTER 0
@@ -1600,17 +1660,21 @@
 #define CONFIG_ASETTB_FILTER 0
 #define CONFIG_ASHOWINFO_FILTER 0
 #define CONFIG_ASIDEDATA_FILTER 0
+#define CONFIG_ASOFTCLIP_FILTER 0
 #define CONFIG_ASPLIT_FILTER 0
+#define CONFIG_ASR_FILTER 0
 #define CONFIG_ASTATS_FILTER 0
 #define CONFIG_ASTREAMSELECT_FILTER 0
 #define CONFIG_ATEMPO_FILTER 0
 #define CONFIG_ATRIM_FILTER 0
+#define CONFIG_AXCORRELATE_FILTER 0
 #define CONFIG_AZMQ_FILTER 0
 #define CONFIG_BANDPASS_FILTER 0
 #define CONFIG_BANDREJECT_FILTER 0
 #define CONFIG_BASS_FILTER 0
 #define CONFIG_BIQUAD_FILTER 0
 #define CONFIG_BS2B_FILTER 0
+#define CONFIG_CHROMABER_VULKAN_FILTER 0
 #define CONFIG_CHANNELMAP_FILTER 0
 #define CONFIG_CHANNELSPLIT_FILTER 0
 #define CONFIG_CHORUS_FILTER 0
@@ -1619,6 +1683,7 @@
 #define CONFIG_CROSSFEED_FILTER 0
 #define CONFIG_CRYSTALIZER_FILTER 0
 #define CONFIG_DCSHIFT_FILTER 0
+#define CONFIG_DEESSER_FILTER 0
 #define CONFIG_DRMETER_FILTER 0
 #define CONFIG_DYNAUDNORM_FILTER 0
 #define CONFIG_EARWAX_FILTER 0
@@ -1658,12 +1723,15 @@
 #define CONFIG_VOLUME_FILTER 0
 #define CONFIG_VOLUMEDETECT_FILTER 0
 #define CONFIG_AEVALSRC_FILTER 0
+#define CONFIG_AFIRSRC_FILTER 0
 #define CONFIG_ANOISESRC_FILTER 0
 #define CONFIG_ANULLSRC_FILTER 0
 #define CONFIG_FLITE_FILTER 0
 #define CONFIG_HILBERT_FILTER 0
+#define CONFIG_SINC_FILTER 0
 #define CONFIG_SINE_FILTER 0
 #define CONFIG_ANULLSINK_FILTER 0
+#define CONFIG_ADDROI_FILTER 0
 #define CONFIG_ALPHAEXTRACT_FILTER 0
 #define CONFIG_ALPHAMERGE_FILTER 0
 #define CONFIG_AMPLIFY_FILTER 0
@@ -1671,8 +1739,10 @@
 #define CONFIG_ATADENOISE_FILTER 0
 #define CONFIG_AVGBLUR_FILTER 0
 #define CONFIG_AVGBLUR_OPENCL_FILTER 0
+#define CONFIG_AVGBLUR_VULKAN_FILTER 0
 #define CONFIG_BBOX_FILTER 0
 #define CONFIG_BENCH_FILTER 0
+#define CONFIG_BILATERAL_FILTER 0
 #define CONFIG_BITPLANENOISE_FILTER 0
 #define CONFIG_BLACKDETECT_FILTER 0
 #define CONFIG_BLACKFRAME_FILTER 0
@@ -1681,12 +1751,17 @@
 #define CONFIG_BOXBLUR_FILTER 0
 #define CONFIG_BOXBLUR_OPENCL_FILTER 0
 #define CONFIG_BWDIF_FILTER 0
+#define CONFIG_CAS_FILTER 0
+#define CONFIG_CHROMAHOLD_FILTER 0
 #define CONFIG_CHROMAKEY_FILTER 0
+#define CONFIG_CHROMASHIFT_FILTER 0
 #define CONFIG_CIESCOPE_FILTER 0
 #define CONFIG_CODECVIEW_FILTER 0
 #define CONFIG_COLORBALANCE_FILTER 0
 #define CONFIG_COLORCHANNELMIXER_FILTER 0
 #define CONFIG_COLORKEY_FILTER 0
+#define CONFIG_COLORKEY_OPENCL_FILTER 0
+#define CONFIG_COLORHOLD_FILTER 0
 #define CONFIG_COLORLEVELS_FILTER 0
 #define CONFIG_COLORMATRIX_FILTER 0
 #define CONFIG_COLORSPACE_FILTER 0
@@ -1706,6 +1781,7 @@
 #define CONFIG_DEBLOCK_FILTER 0
 #define CONFIG_DECIMATE_FILTER 0
 #define CONFIG_DECONVOLVE_FILTER 0
+#define CONFIG_DEDOT_FILTER 0
 #define CONFIG_DEFLATE_FILTER 0
 #define CONFIG_DEFLICKER_FILTER 0
 #define CONFIG_DEINTERLACE_QSV_FILTER 0
@@ -1713,12 +1789,15 @@
 #define CONFIG_DEJUDDER_FILTER 0
 #define CONFIG_DELOGO_FILTER 0
 #define CONFIG_DENOISE_VAAPI_FILTER 0
+#define CONFIG_DERAIN_FILTER 0
 #define CONFIG_DESHAKE_FILTER 0
+#define CONFIG_DESHAKE_OPENCL_FILTER 0
 #define CONFIG_DESPILL_FILTER 0
 #define CONFIG_DETELECINE_FILTER 0
 #define CONFIG_DILATION_FILTER 0
 #define CONFIG_DILATION_OPENCL_FILTER 0
 #define CONFIG_DISPLACE_FILTER 0
+#define CONFIG_DNN_PROCESSING_FILTER 0
 #define CONFIG_DOUBLEWEAVE_FILTER 0
 #define CONFIG_DRAWBOX_FILTER 0
 #define CONFIG_DRAWGRAPH_FILTER 0
@@ -1746,11 +1825,14 @@
 #define CONFIG_FRAMEPACK_FILTER 0
 #define CONFIG_FRAMERATE_FILTER 0
 #define CONFIG_FRAMESTEP_FILTER 0
+#define CONFIG_FREEZEDETECT_FILTER 0
+#define CONFIG_FREEZEFRAMES_FILTER 0
 #define CONFIG_FREI0R_FILTER 0
 #define CONFIG_FSPP_FILTER 0
 #define CONFIG_GBLUR_FILTER 0
 #define CONFIG_GEQ_FILTER 0
 #define CONFIG_GRADFUN_FILTER 0
+#define CONFIG_GRAPHMONITOR_FILTER 0
 #define CONFIG_GREYEDGE_FILTER 0
 #define CONFIG_HALDCLUT_FILTER 0
 #define CONFIG_HFLIP_FILTER 0
@@ -1771,6 +1853,7 @@
 #define CONFIG_INTERLACE_FILTER 0
 #define CONFIG_INTERLEAVE_FILTER 0
 #define CONFIG_KERNDEINT_FILTER 0
+#define CONFIG_LAGFUN_FILTER 0
 #define CONFIG_LENSCORRECTION_FILTER 0
 #define CONFIG_LENSFUN_FILTER 0
 #define CONFIG_LIBVMAF_FILTER 0
@@ -1784,8 +1867,13 @@
 #define CONFIG_LUTRGB_FILTER 0
 #define CONFIG_LUTYUV_FILTER 0
 #define CONFIG_MASKEDCLAMP_FILTER 0
+#define CONFIG_MASKEDMAX_FILTER 0
 #define CONFIG_MASKEDMERGE_FILTER 0
+#define CONFIG_MASKEDMIN_FILTER 0
+#define CONFIG_MASKEDTHRESHOLD_FILTER 0
+#define CONFIG_MASKFUN_FILTER 0
 #define CONFIG_MCDEINT_FILTER 0
+#define CONFIG_MEDIAN_FILTER 0
 #define CONFIG_MERGEPLANES_FILTER 0
 #define CONFIG_MESTIMATE_FILTER 0
 #define CONFIG_METADATA_FILTER 0
@@ -1795,6 +1883,7 @@
 #define CONFIG_MPDECIMATE_FILTER 0
 #define CONFIG_NEGATE_FILTER 0
 #define CONFIG_NLMEANS_FILTER 0
+#define CONFIG_NLMEANS_OPENCL_FILTER 0
 #define CONFIG_NNEDI_FILTER 0
 #define CONFIG_NOFORMAT_FILTER 0
 #define CONFIG_NOISE_FILTER 0
@@ -1806,13 +1895,17 @@
 #define CONFIG_OVERLAY_FILTER 0
 #define CONFIG_OVERLAY_OPENCL_FILTER 0
 #define CONFIG_OVERLAY_QSV_FILTER 0
+#define CONFIG_OVERLAY_VULKAN_FILTER 0
+#define CONFIG_OVERLAY_CUDA_FILTER 0
 #define CONFIG_OWDENOISE_FILTER 0
 #define CONFIG_PAD_FILTER 0
+#define CONFIG_PAD_OPENCL_FILTER 0
 #define CONFIG_PALETTEGEN_FILTER 0
 #define CONFIG_PALETTEUSE_FILTER 0
 #define CONFIG_PERMS_FILTER 0
 #define CONFIG_PERSPECTIVE_FILTER 0
 #define CONFIG_PHASE_FILTER 0
+#define CONFIG_PHOTOSENSITIVITY_FILTER 0
 #define CONFIG_PIXDESCTEST_FILTER 0
 #define CONFIG_PIXSCOPE_FILTER 0
 #define CONFIG_PP_FILTER 0
@@ -1835,6 +1928,7 @@
 #define CONFIG_REMOVELOGO_FILTER 0
 #define CONFIG_REPEATFIELDS_FILTER 0
 #define CONFIG_REVERSE_FILTER 0
+#define CONFIG_RGBASHIFT_FILTER 0
 #define CONFIG_ROBERTS_FILTER 0
 #define CONFIG_ROBERTS_OPENCL_FILTER 0
 #define CONFIG_ROTATE_FILTER 0
@@ -1844,13 +1938,16 @@
 #define CONFIG_SCALE_NPP_FILTER 0
 #define CONFIG_SCALE_QSV_FILTER 0
 #define CONFIG_SCALE_VAAPI_FILTER 0
+#define CONFIG_SCALE_VULKAN_FILTER 0
 #define CONFIG_SCALE2REF_FILTER 0
+#define CONFIG_SCROLL_FILTER 0
 #define CONFIG_SELECT_FILTER 0
 #define CONFIG_SELECTIVECOLOR_FILTER 0
 #define CONFIG_SENDCMD_FILTER 0
 #define CONFIG_SEPARATEFIELDS_FILTER 0
 #define CONFIG_SETDAR_FILTER 0
 #define CONFIG_SETFIELD_FILTER 0
+#define CONFIG_SETPARAMS_FILTER 0
 #define CONFIG_SETPTS_FILTER 0
 #define CONFIG_SETRANGE_FILTER 0
 #define CONFIG_SETSAR_FILTER 0
@@ -1878,26 +1975,34 @@
 #define CONFIG_SWAPUV_FILTER 0
 #define CONFIG_TBLEND_FILTER 0
 #define CONFIG_TELECINE_FILTER 0
+#define CONFIG_THISTOGRAM_FILTER 0
 #define CONFIG_THRESHOLD_FILTER 0
 #define CONFIG_THUMBNAIL_FILTER 0
 #define CONFIG_THUMBNAIL_CUDA_FILTER 0
 #define CONFIG_TILE_FILTER 0
 #define CONFIG_TINTERLACE_FILTER 0
 #define CONFIG_TLUT2_FILTER 0
+#define CONFIG_TMEDIAN_FILTER 0
 #define CONFIG_TMIX_FILTER 0
 #define CONFIG_TONEMAP_FILTER 0
 #define CONFIG_TONEMAP_OPENCL_FILTER 0
+#define CONFIG_TONEMAP_VAAPI_FILTER 0
+#define CONFIG_TPAD_FILTER 0
 #define CONFIG_TRANSPOSE_FILTER 0
 #define CONFIG_TRANSPOSE_NPP_FILTER 0
+#define CONFIG_TRANSPOSE_OPENCL_FILTER 0
+#define CONFIG_TRANSPOSE_VAAPI_FILTER 0
 #define CONFIG_TRIM_FILTER 0
 #define CONFIG_UNPREMULTIPLY_FILTER 0
 #define CONFIG_UNSHARP_FILTER 0
 #define CONFIG_UNSHARP_OPENCL_FILTER 0
 #define CONFIG_USPP_FILTER 0
+#define CONFIG_V360_FILTER 0
 #define CONFIG_VAGUEDENOISER_FILTER 0
 #define CONFIG_VECTORSCOPE_FILTER 0
 #define CONFIG_VFLIP_FILTER 0
 #define CONFIG_VFRDET_FILTER 0
+#define CONFIG_VIBRANCE_FILTER 0
 #define CONFIG_VIDSTABDETECT_FILTER 0
 #define CONFIG_VIDSTABTRANSFORM_FILTER 0
 #define CONFIG_VIGNETTE_FILTER 0
@@ -1908,7 +2013,13 @@
 #define CONFIG_WAVEFORM_FILTER 0
 #define CONFIG_WEAVE_FILTER 0
 #define CONFIG_XBR_FILTER 0
+#define CONFIG_XFADE_FILTER 0
+#define CONFIG_XFADE_OPENCL_FILTER 0
+#define CONFIG_XMEDIAN_FILTER 0
+#define CONFIG_XSTACK_FILTER 0
 #define CONFIG_YADIF_FILTER 0
+#define CONFIG_YADIF_CUDA_FILTER 0
+#define CONFIG_YAEPBLUR_FILTER 0
 #define CONFIG_ZMQ_FILTER 0
 #define CONFIG_ZOOMPAN_FILTER 0
 #define CONFIG_ZSCALE_FILTER 0
@@ -1927,6 +2038,7 @@
 #define CONFIG_PAL75BARS_FILTER 0
 #define CONFIG_PAL100BARS_FILTER 0
 #define CONFIG_RGBTESTSRC_FILTER 0
+#define CONFIG_SIERPINSKI_FILTER 0
 #define CONFIG_SMPTEBARS_FILTER 0
 #define CONFIG_SMPTEHDBARS_FILTER 0
 #define CONFIG_TESTSRC_FILTER 0
@@ -1935,12 +2047,14 @@
 #define CONFIG_NULLSINK_FILTER 0
 #define CONFIG_ABITSCOPE_FILTER 0
 #define CONFIG_ADRAWGRAPH_FILTER 0
+#define CONFIG_AGRAPHMONITOR_FILTER 0
 #define CONFIG_AHISTOGRAM_FILTER 0
 #define CONFIG_APHASEMETER_FILTER 0
 #define CONFIG_AVECTORSCOPE_FILTER 0
 #define CONFIG_CONCAT_FILTER 0
 #define CONFIG_SHOWCQT_FILTER 0
 #define CONFIG_SHOWFREQS_FILTER 0
+#define CONFIG_SHOWSPATIAL_FILTER 0
 #define CONFIG_SHOWSPECTRUM_FILTER 0
 #define CONFIG_SHOWSPECTRUMPIC_FILTER 0
 #define CONFIG_SHOWVOLUME_FILTER 0
@@ -1964,21 +2078,25 @@
 #define CONFIG_AFC_DEMUXER 0
 #define CONFIG_AIFF_DEMUXER 0
 #define CONFIG_AIX_DEMUXER 0
+#define CONFIG_ALP_DEMUXER 0
 #define CONFIG_AMR_DEMUXER 1
 #define CONFIG_AMRNB_DEMUXER 0
 #define CONFIG_AMRWB_DEMUXER 0
 #define CONFIG_ANM_DEMUXER 0
 #define CONFIG_APC_DEMUXER 0
 #define CONFIG_APE_DEMUXER 0
+#define CONFIG_APM_DEMUXER 0
 #define CONFIG_APNG_DEMUXER 0
 #define CONFIG_APTX_DEMUXER 0
 #define CONFIG_APTX_HD_DEMUXER 0
 #define CONFIG_AQTITLE_DEMUXER 0
+#define CONFIG_ARGO_ASF_DEMUXER 0
 #define CONFIG_ASF_DEMUXER 0
 #define CONFIG_ASF_O_DEMUXER 0
 #define CONFIG_ASS_DEMUXER 0
 #define CONFIG_AST_DEMUXER 0
 #define CONFIG_AU_DEMUXER 0
+#define CONFIG_AV1_DEMUXER 0
 #define CONFIG_AVI_DEMUXER 1
 #define CONFIG_AVISYNTH_DEMUXER 0
 #define CONFIG_AVR_DEMUXER 0
@@ -2006,7 +2124,9 @@
 #define CONFIG_DATA_DEMUXER 0
 #define CONFIG_DAUD_DEMUXER 0
 #define CONFIG_DCSTR_DEMUXER 0
+#define CONFIG_DERF_DEMUXER 0
 #define CONFIG_DFA_DEMUXER 0
+#define CONFIG_DHAV_DEMUXER 0
 #define CONFIG_DIRAC_DEMUXER 0
 #define CONFIG_DNXHD_DEMUXER 0
 #define CONFIG_DSF_DEMUXER 0
@@ -2032,6 +2152,7 @@
 #define CONFIG_FOURXM_DEMUXER 0
 #define CONFIG_FRM_DEMUXER 0
 #define CONFIG_FSB_DEMUXER 0
+#define CONFIG_FWSE_DEMUXER 0
 #define CONFIG_G722_DEMUXER 0
 #define CONFIG_G723_1_DEMUXER 0
 #define CONFIG_G726_DEMUXER 0
@@ -2045,6 +2166,8 @@
 #define CONFIG_H261_DEMUXER 0
 #define CONFIG_H263_DEMUXER 0
 #define CONFIG_H264_DEMUXER 0
+#define CONFIG_HCA_DEMUXER 0
+#define CONFIG_HCOM_DEMUXER 0
 #define CONFIG_HEVC_DEMUXER 0
 #define CONFIG_HLS_DEMUXER 0
 #define CONFIG_HNM_DEMUXER 0
@@ -2052,6 +2175,7 @@
 #define CONFIG_IDCIN_DEMUXER 0
 #define CONFIG_IDF_DEMUXER 0
 #define CONFIG_IFF_DEMUXER 0
+#define CONFIG_IFV_DEMUXER 0
 #define CONFIG_ILBC_DEMUXER 0
 #define CONFIG_IMAGE2_DEMUXER 0
 #define CONFIG_IMAGE2PIPE_DEMUXER 0
@@ -2066,6 +2190,8 @@
 #define CONFIG_IVR_DEMUXER 0
 #define CONFIG_JACOSUB_DEMUXER 0
 #define CONFIG_JV_DEMUXER 0
+#define CONFIG_KUX_DEMUXER 0
+#define CONFIG_KVAG_DEMUXER 0
 #define CONFIG_LMLM4_DEMUXER 0
 #define CONFIG_LOAS_DEMUXER 0
 #define CONFIG_LRC_DEMUXER 0
@@ -2112,6 +2238,7 @@
 #define CONFIG_PAF_DEMUXER 0
 #define CONFIG_PCM_ALAW_DEMUXER 0
 #define CONFIG_PCM_MULAW_DEMUXER 0
+#define CONFIG_PCM_VIDC_DEMUXER 0
 #define CONFIG_PCM_F64BE_DEMUXER 0
 #define CONFIG_PCM_F64LE_DEMUXER 0
 #define CONFIG_PCM_F32BE_DEMUXER 0
@@ -2192,6 +2319,7 @@
 #define CONFIG_VAG_DEMUXER 0
 #define CONFIG_VC1_DEMUXER 0
 #define CONFIG_VC1T_DEMUXER 0
+#define CONFIG_VIVIDAS_DEMUXER 0
 #define CONFIG_VIVO_DEMUXER 0
 #define CONFIG_VMD_DEMUXER 0
 #define CONFIG_VOBSUB_DEMUXER 0
@@ -2221,6 +2349,7 @@
 #define CONFIG_IMAGE_DDS_PIPE_DEMUXER 0
 #define CONFIG_IMAGE_DPX_PIPE_DEMUXER 0
 #define CONFIG_IMAGE_EXR_PIPE_DEMUXER 0
+#define CONFIG_IMAGE_GIF_PIPE_DEMUXER 0
 #define CONFIG_IMAGE_J2K_PIPE_DEMUXER 0
 #define CONFIG_IMAGE_JPEG_PIPE_DEMUXER 0
 #define CONFIG_IMAGE_JPEGLS_PIPE_DEMUXER 0
@@ -2345,6 +2474,7 @@
 #define CONFIG_OPUS_MUXER 0
 #define CONFIG_PCM_ALAW_MUXER 0
 #define CONFIG_PCM_MULAW_MUXER 0
+#define CONFIG_PCM_VIDC_MUXER 0
 #define CONFIG_PCM_F64BE_MUXER 0
 #define CONFIG_PCM_F64LE_MUXER 0
 #define CONFIG_PCM_F32BE_MUXER 0
@@ -2384,6 +2514,7 @@
 #define CONFIG_SPX_MUXER 0
 #define CONFIG_SPDIF_MUXER 0
 #define CONFIG_SRT_MUXER 0
+#define CONFIG_STREAMHASH_MUXER 0
 #define CONFIG_SUP_MUXER 0
 #define CONFIG_SWF_MUXER 0
 #define CONFIG_TEE_MUXER 0
@@ -2444,6 +2575,7 @@
 #define CONFIG_UDP_PROTOCOL 0
 #define CONFIG_UDPLITE_PROTOCOL 0
 #define CONFIG_UNIX_PROTOCOL 0
+#define CONFIG_LIBAMQP_PROTOCOL 0
 #define CONFIG_LIBRTMP_PROTOCOL 0
 #define CONFIG_LIBRTMPE_PROTOCOL 0
 #define CONFIG_LIBRTMPS_PROTOCOL 0
@@ -2452,4 +2584,5 @@
 #define CONFIG_LIBSRT_PROTOCOL 0
 #define CONFIG_LIBSSH_PROTOCOL 0
 #define CONFIG_LIBSMBCLIENT_PROTOCOL 0
+#define CONFIG_LIBZMQ_PROTOCOL 0
 #endif /* FFMPEG_CONFIG_H */
diff --git a/fuchsia/config/max/x64/libavutil/ffversion.h b/fuchsia/config/max/x64/libavutil/ffversion.h
index 4585957..fc76199 100644
--- a/fuchsia/config/max/x64/libavutil/ffversion.h
+++ b/fuchsia/config/max/x64/libavutil/ffversion.h
@@ -1,5 +1,5 @@
 /* Automatically generated by version.sh, do not manually edit! */
 #ifndef AVUTIL_FFVERSION_H
 #define AVUTIL_FFVERSION_H
-#define FFMPEG_VERSION "N-92369-g2e9f4ad959"
+#define FFMPEG_VERSION "N-97662-gaaac2c26d9"
 #endif /* AVUTIL_FFVERSION_H */
diff --git a/fuchsia/scripts/credits_updater.pyc b/fuchsia/scripts/credits_updater.pyc
new file mode 100644
index 0000000..c0bbe80
--- /dev/null
+++ b/fuchsia/scripts/credits_updater.pyc
Binary files differ
diff --git a/fuchsia/scripts/enum.pyc b/fuchsia/scripts/enum.pyc
new file mode 100644
index 0000000..ffb1bc9
--- /dev/null
+++ b/fuchsia/scripts/enum.pyc
Binary files differ
diff --git a/libavcodec/4xm.c b/libavcodec/4xm.c
index 5547dfd..336c651 100644
--- a/libavcodec/4xm.c
+++ b/libavcodec/4xm.c
@@ -145,7 +145,7 @@
     int mv[256];
     VLC pre_vlc;
     int last_dc;
-    DECLARE_ALIGNED(16, int16_t, block)[6][64];
+    DECLARE_ALIGNED(32, int16_t, block)[6][64];
     void *bitstream_buffer;
     unsigned int bitstream_buffer_size;
     int version;
@@ -158,7 +158,7 @@
 #define FIX_1_847759065 121095
 #define FIX_2_613125930 171254
 
-#define MULTIPLY(var, const) (((var) * (const)) >> 16)
+#define MULTIPLY(var, const) ((int)((var) * (unsigned)(const)) >> 16)
 
 static void idct(int16_t block[64])
 {
@@ -351,6 +351,8 @@
     index = size2index[log2h][log2w];
     av_assert0(index >= 0);
 
+    if (get_bits_left(&f->gb) < 1)
+        return AVERROR_INVALIDDATA;
     h     = 1 << log2h;
     code  = get_vlc2(&f->gb, block_type_vlc[1 - (f->version > 1)][index].table,
                      BLOCK_TYPE_VLC_BITS, 1);
@@ -498,7 +500,7 @@
 
     if (get_bits_left(&f->gb) < 2){
         av_log(f->avctx, AV_LOG_ERROR, "%d bits left before decode_i_block()\n", get_bits_left(&f->gb));
-        return -1;
+        return AVERROR_INVALIDDATA;
     }
 
     /* DC coef */
@@ -523,6 +525,10 @@
             break;
         if (code == 0xf0) {
             i += 16;
+            if (i >= 64) {
+                av_log(f->avctx, AV_LOG_ERROR, "run %d overflow\n", i);
+                return 0;
+            }
         } else {
             if (code & 0xf) {
                 level = get_xbits(&f->gb, code & 0xf);
@@ -697,6 +703,7 @@
         len_tab[j]  = len;
     }
 
+    ff_free_vlc(&f->pre_vlc);
     if (init_vlc(&f->pre_vlc, ACDC_VLC_BITS, 257, len_tab, 1, 1,
                  bits_tab, 4, 4, 0))
         return NULL;
@@ -732,7 +739,7 @@
         for (x = 0; x < width; x += 16) {
             unsigned int color[4] = { 0 }, bits;
             if (buf_end - buf < 8)
-                return -1;
+                return AVERROR_INVALIDDATA;
             // warning following is purely guessed ...
             color[0] = bytestream2_get_le16u(&g3);
             color[1] = bytestream2_get_le16u(&g3);
diff --git a/libavcodec/8svx.c b/libavcodec/8svx.c
index edc945c..092dbaa 100644
--- a/libavcodec/8svx.c
+++ b/libavcodec/8svx.c
@@ -164,8 +164,7 @@
     case AV_CODEC_ID_8SVX_FIB: esc->table = fibonacci;    break;
     case AV_CODEC_ID_8SVX_EXP: esc->table = exponential;  break;
     default:
-        av_log(avctx, AV_LOG_ERROR, "Invalid codec id %d.\n", avctx->codec->id);
-        return AVERROR_INVALIDDATA;
+        av_assert1(0);
     }
     avctx->sample_fmt = AV_SAMPLE_FMT_U8P;
 
diff --git a/libavcodec/Makefile b/libavcodec/Makefile
index ce766aa..88944d9 100644
--- a/libavcodec/Makefile
+++ b/libavcodec/Makefile
@@ -6,12 +6,15 @@
           avcodec.h                                                     \
           avdct.h                                                       \
           avfft.h                                                       \
+          codec_desc.h                                                  \
+          codec_id.h                                                    \
           d3d11va.h                                                     \
           dirac.h                                                       \
           dv_profile.h                                                  \
           dxva2.h                                                       \
           jni.h                                                         \
           mediacodec.h                                                  \
+          packet.h                                                      \
           qsv.h                                                         \
           vaapi.h                                                       \
           vdpau.h                                                       \
@@ -173,6 +176,8 @@
 OBJS-$(CONFIG_AC3_ENCODER)             += ac3enc_float.o ac3enc.o ac3tab.o \
                                           ac3.o kbdwin.o
 OBJS-$(CONFIG_AC3_FIXED_ENCODER)       += ac3enc_fixed.o ac3enc.o ac3tab.o ac3.o
+OBJS-$(CONFIG_ACELP_KELVIN_DECODER)    += g729dec.o lsp.o celp_math.o celp_filters.o acelp_filters.o acelp_pitch_delay.o acelp_vectors.o g729postfilter.o
+OBJS-$(CONFIG_AGM_DECODER)             += agm.o
 OBJS-$(CONFIG_AIC_DECODER)             += aic.o
 OBJS-$(CONFIG_ALAC_DECODER)            += alac.o alac_data.o alacdsp.o
 OBJS-$(CONFIG_ALAC_ENCODER)            += alacenc.o alac_data.o
@@ -192,12 +197,13 @@
 OBJS-$(CONFIG_ANM_DECODER)             += anm.o
 OBJS-$(CONFIG_ANSI_DECODER)            += ansi.o cga_data.o
 OBJS-$(CONFIG_APE_DECODER)             += apedec.o
-OBJS-$(CONFIG_APTX_DECODER)            += aptx.o
-OBJS-$(CONFIG_APTX_ENCODER)            += aptx.o
-OBJS-$(CONFIG_APTX_HD_DECODER)         += aptx.o
-OBJS-$(CONFIG_APTX_HD_ENCODER)         += aptx.o
+OBJS-$(CONFIG_APTX_DECODER)            += aptxdec.o aptx.o
+OBJS-$(CONFIG_APTX_ENCODER)            += aptxenc.o aptx.o
+OBJS-$(CONFIG_APTX_HD_DECODER)         += aptxdec.o aptx.o
+OBJS-$(CONFIG_APTX_HD_ENCODER)         += aptxenc.o aptx.o
 OBJS-$(CONFIG_APNG_DECODER)            += png.o pngdec.o pngdsp.o
 OBJS-$(CONFIG_APNG_ENCODER)            += png.o pngenc.o
+OBJS-$(CONFIG_ARBC_DECODER)            += arbc.o
 OBJS-$(CONFIG_SSA_DECODER)             += assdec.o ass.o
 OBJS-$(CONFIG_SSA_ENCODER)             += assenc.o ass.o
 OBJS-$(CONFIG_ASS_DECODER)             += assdec.o ass.o
@@ -239,8 +245,9 @@
 OBJS-$(CONFIG_C93_DECODER)             += c93.o
 OBJS-$(CONFIG_CAVS_DECODER)            += cavs.o cavsdec.o cavsdsp.o \
                                           cavsdata.o
-OBJS-$(CONFIG_CCAPTION_DECODER)        += ccaption_dec.o
+OBJS-$(CONFIG_CCAPTION_DECODER)        += ccaption_dec.o ass.o
 OBJS-$(CONFIG_CDGRAPHICS_DECODER)      += cdgraphics.o
+OBJS-$(CONFIG_CDTOONS_DECODER)         += cdtoons.o
 OBJS-$(CONFIG_CDXL_DECODER)            += cdxl.o
 OBJS-$(CONFIG_CFHD_DECODER)            += cfhd.o cfhddata.o
 OBJS-$(CONFIG_CINEPAK_DECODER)         += cinepak.o
@@ -261,6 +268,7 @@
 OBJS-$(CONFIG_DCA_ENCODER)             += dcaenc.o dca.o dcadata.o dcahuff.o \
                                           dcaadpcm.o
 OBJS-$(CONFIG_DDS_DECODER)             += dds.o
+OBJS-$(CONFIG_DERF_DPCM_DECODER)       += dpcm.o
 OBJS-$(CONFIG_DIRAC_DECODER)           += diracdec.o dirac.o diracdsp.o diractab.o \
                                           dirac_arith.o dirac_dwt.o dirac_vlc.o
 OBJS-$(CONFIG_DFA_DECODER)             += dfa.o
@@ -279,8 +287,8 @@
 OBJS-$(CONFIG_DST_DECODER)             += dstdec.o dsd.o
 OBJS-$(CONFIG_DVBSUB_DECODER)          += dvbsubdec.o
 OBJS-$(CONFIG_DVBSUB_ENCODER)          += dvbsub.o
-OBJS-$(CONFIG_DVDSUB_DECODER)          += dvdsubdec.o
-OBJS-$(CONFIG_DVDSUB_ENCODER)          += dvdsubenc.o
+OBJS-$(CONFIG_DVDSUB_DECODER)          += dvdsubdec.o dvdsub.o
+OBJS-$(CONFIG_DVDSUB_ENCODER)          += dvdsubenc.o dvdsub.o
 OBJS-$(CONFIG_DVAUDIO_DECODER)         += dvaudiodec.o
 OBJS-$(CONFIG_DVVIDEO_DECODER)         += dvdec.o dv.o dvdata.o
 OBJS-$(CONFIG_DVVIDEO_ENCODER)         += dvenc.o dv.o dvdata.o
@@ -362,6 +370,8 @@
 OBJS-$(CONFIG_H264_V4L2M2M_ENCODER)    += v4l2_m2m_enc.o
 OBJS-$(CONFIG_HAP_DECODER)             += hapdec.o hap.o
 OBJS-$(CONFIG_HAP_ENCODER)             += hapenc.o hap.o
+OBJS-$(CONFIG_HCA_DECODER)             += hcadec.o
+OBJS-$(CONFIG_HCOM_DECODER)            += hcom.o
 OBJS-$(CONFIG_HEVC_DECODER)            += hevcdec.o hevc_mvs.o \
                                           hevc_cabac.o hevc_refs.o hevcpred.o    \
                                           hevcdsp.o hevc_filter.o hevc_data.o
@@ -383,12 +393,14 @@
 OBJS-$(CONFIG_HQX_DECODER)             += hqx.o hqxvlc.o hqxdsp.o canopus.o
 OBJS-$(CONFIG_HUFFYUV_DECODER)         += huffyuv.o huffyuvdec.o
 OBJS-$(CONFIG_HUFFYUV_ENCODER)         += huffyuv.o huffyuvenc.o
+OBJS-$(CONFIG_HYMT_DECODER)            += huffyuv.o huffyuvdec.o
 OBJS-$(CONFIG_IDCIN_DECODER)           += idcinvideo.o
 OBJS-$(CONFIG_IDF_DECODER)             += bintext.o cga_data.o
 OBJS-$(CONFIG_IFF_ILBM_DECODER)        += iff.o
 OBJS-$(CONFIG_ILBC_DECODER)            += ilbcdec.o
 OBJS-$(CONFIG_IMC_DECODER)             += imc.o
 OBJS-$(CONFIG_IMM4_DECODER)            += imm4.o
+OBJS-$(CONFIG_IMM5_DECODER)            += imm5.o
 OBJS-$(CONFIG_INDEO2_DECODER)          += indeo2.o
 OBJS-$(CONFIG_INDEO3_DECODER)          += indeo3.o
 OBJS-$(CONFIG_INDEO4_DECODER)          += indeo4.o ivi.o
@@ -409,6 +421,7 @@
 OBJS-$(CONFIG_LAGARITH_DECODER)        += lagarith.o lagarithrac.o
 OBJS-$(CONFIG_LJPEG_ENCODER)           += ljpegenc.o mjpegenc_common.o
 OBJS-$(CONFIG_LOCO_DECODER)            += loco.o
+OBJS-$(CONFIG_LSCR_DECODER)            += png.o pngdec.o pngdsp.o
 OBJS-$(CONFIG_M101_DECODER)            += m101.o
 OBJS-$(CONFIG_MACE3_DECODER)           += mace.o
 OBJS-$(CONFIG_MACE6_DECODER)           += mace.o
@@ -420,6 +433,7 @@
 OBJS-$(CONFIG_MICRODVD_DECODER)        += microdvddec.o ass.o
 OBJS-$(CONFIG_MIMIC_DECODER)           += mimic.o
 OBJS-$(CONFIG_MJPEG_DECODER)           += mjpegdec.o
+OBJS-$(CONFIG_MJPEG_QSV_DECODER)       += qsvdec_other.o
 OBJS-$(CONFIG_MJPEG_ENCODER)           += mjpegenc.o mjpegenc_common.o \
                                           mjpegenc_huffman.o
 OBJS-$(CONFIG_MJPEGB_DECODER)          += mjpegbdec.o
@@ -483,8 +497,11 @@
 OBJS-$(CONFIG_MSVIDEO1_ENCODER)        += msvideo1enc.o elbg.o
 OBJS-$(CONFIG_MSZH_DECODER)            += lcldec.o
 OBJS-$(CONFIG_MTS2_DECODER)            += mss4.o
+OBJS-$(CONFIG_MV30_DECODER)            += mv30.o
 OBJS-$(CONFIG_MVC1_DECODER)            += mvcdec.o
 OBJS-$(CONFIG_MVC2_DECODER)            += mvcdec.o
+OBJS-$(CONFIG_MVDV_DECODER)            += midivid.o
+OBJS-$(CONFIG_MVHA_DECODER)            += mvha.o
 OBJS-$(CONFIG_MWSC_DECODER)            += mwsc.o
 OBJS-$(CONFIG_MXPEG_DECODER)           += mxpegdec.o
 OBJS-$(CONFIG_NELLYMOSER_DECODER)      += nellymoserdec.o nellymoser.o
@@ -492,9 +509,10 @@
 OBJS-$(CONFIG_NUV_DECODER)             += nuv.o rtjpeg.o
 OBJS-$(CONFIG_ON2AVC_DECODER)          += on2avc.o on2avcdata.o
 OBJS-$(CONFIG_OPUS_DECODER)            += opusdec.o opus.o opus_celt.o opus_rc.o \
-                                          opus_pvq.o opus_silk.o opustab.o vorbis_data.o
+                                          opus_pvq.o opus_silk.o opustab.o vorbis_data.o \
+                                          opusdsp.o
 OBJS-$(CONFIG_OPUS_ENCODER)            += opusenc.o opus.o opus_rc.o opustab.o opus_pvq.o \
-                                          opusenc_psy.o
+                                          opusenc_psy.o vorbis_data.o
 OBJS-$(CONFIG_PAF_AUDIO_DECODER)       += pafaudio.o
 OBJS-$(CONFIG_PAF_VIDEO_DECODER)       += pafvideo.o
 OBJS-$(CONFIG_PAM_DECODER)             += pnmdec.o pnm.o
@@ -516,8 +534,8 @@
 OBJS-$(CONFIG_PPM_DECODER)             += pnmdec.o pnm.o
 OBJS-$(CONFIG_PPM_ENCODER)             += pnmenc.o
 OBJS-$(CONFIG_PRORES_DECODER)          += proresdec2.o proresdsp.o proresdata.o
-OBJS-$(CONFIG_PRORES_ENCODER)          += proresenc_anatoliy.o
-OBJS-$(CONFIG_PRORES_AW_ENCODER)       += proresenc_anatoliy.o
+OBJS-$(CONFIG_PRORES_ENCODER)          += proresenc_anatoliy.o proresdata.o
+OBJS-$(CONFIG_PRORES_AW_ENCODER)       += proresenc_anatoliy.o proresdata.o
 OBJS-$(CONFIG_PRORES_KS_ENCODER)       += proresenc_kostya.o proresdata.o
 OBJS-$(CONFIG_PROSUMER_DECODER)        += prosumer.o
 OBJS-$(CONFIG_PSD_DECODER)             += psd.o
@@ -572,13 +590,14 @@
                                           celp_math.o acelp_vectors.o \
                                           acelp_filters.o celp_filters.o \
                                           sipr16k.o
+OBJS-$(CONFIG_SIREN_DECODER)           += siren.o
 OBJS-$(CONFIG_SMACKAUD_DECODER)        += smacker.o
 OBJS-$(CONFIG_SMACKER_DECODER)         += smacker.o
 OBJS-$(CONFIG_SMC_DECODER)             += smc.o
 OBJS-$(CONFIG_SMVJPEG_DECODER)         += smvjpegdec.o
 OBJS-$(CONFIG_SNOW_DECODER)            += snowdec.o snow.o snow_dwt.o
 OBJS-$(CONFIG_SNOW_ENCODER)            += snowenc.o snow.o snow_dwt.o             \
-                                          h263.o ituh263enc.o
+                                          h263.o h263data.o ituh263enc.o
 OBJS-$(CONFIG_SOL_DPCM_DECODER)        += dpcm.o
 OBJS-$(CONFIG_SONIC_DECODER)           += sonic.o
 OBJS-$(CONFIG_SONIC_ENCODER)           += sonic.o
@@ -598,10 +617,10 @@
 OBJS-$(CONFIG_LIBRSVG_DECODER)         += librsvgdec.o
 OBJS-$(CONFIG_SBC_DECODER)             += sbcdec.o sbcdec_data.o sbc.o
 OBJS-$(CONFIG_SBC_ENCODER)             += sbcenc.o sbc.o sbcdsp.o sbcdsp_data.o
-OBJS-$(CONFIG_SVQ1_DECODER)            += svq1dec.o svq1.o svq13.o h263data.o
+OBJS-$(CONFIG_SVQ1_DECODER)            += svq1dec.o svq1.o h263data.o
 OBJS-$(CONFIG_SVQ1_ENCODER)            += svq1enc.o svq1.o  h263data.o  \
                                           h263.o ituh263enc.o
-OBJS-$(CONFIG_SVQ3_DECODER)            += svq3.o svq13.o mpegutils.o h264data.o
+OBJS-$(CONFIG_SVQ3_DECODER)            += svq3.o mpegutils.o h264data.o
 OBJS-$(CONFIG_TEXT_DECODER)            += textdec.o ass.o
 OBJS-$(CONFIG_TEXT_ENCODER)            += srtenc.o ass_split.o
 OBJS-$(CONFIG_TAK_DECODER)             += takdec.o tak.o takdsp.o
@@ -610,7 +629,7 @@
 OBJS-$(CONFIG_TARGA_Y216_DECODER)      += targa_y216dec.o
 OBJS-$(CONFIG_TDSC_DECODER)            += tdsc.o
 OBJS-$(CONFIG_TIERTEXSEQVIDEO_DECODER) += tiertexseqv.o
-OBJS-$(CONFIG_TIFF_DECODER)            += tiff.o lzw.o faxcompr.o tiff_data.o tiff_common.o
+OBJS-$(CONFIG_TIFF_DECODER)            += tiff.o lzw.o faxcompr.o tiff_data.o tiff_common.o mjpegdec.o
 OBJS-$(CONFIG_TIFF_ENCODER)            += tiffenc.o rle.o lzwenc.o tiff_data.o
 OBJS-$(CONFIG_TMV_DECODER)             += tmv.o cga_data.o
 OBJS-$(CONFIG_TRUEHD_DECODER)          += mlpdec.o mlpdsp.o
@@ -676,10 +695,11 @@
 OBJS-$(CONFIG_VP9_MEDIACODEC_DECODER)  += mediacodecdec.o
 OBJS-$(CONFIG_VP9_RKMPP_DECODER)       += rkmppdec.o
 OBJS-$(CONFIG_VP9_VAAPI_ENCODER)       += vaapi_encode_vp9.o
+OBJS-$(CONFIG_VP9_QSV_ENCODER)         += qsvenc_vp9.o
 OBJS-$(CONFIG_VPLAYER_DECODER)         += textdec.o ass.o
 OBJS-$(CONFIG_VP9_V4L2M2M_DECODER)     += v4l2_m2m_dec.o
 OBJS-$(CONFIG_VQA_DECODER)             += vqavideo.o
-OBJS-$(CONFIG_WAVPACK_DECODER)         += wavpack.o
+OBJS-$(CONFIG_WAVPACK_DECODER)         += wavpack.o dsd.o
 OBJS-$(CONFIG_WAVPACK_ENCODER)         += wavpackenc.o
 OBJS-$(CONFIG_WCMV_DECODER)            += wcmv.o
 OBJS-$(CONFIG_WEBP_DECODER)            += webp.o
@@ -695,7 +715,7 @@
                                           celp_filters.o \
                                           acelp_vectors.o acelp_filters.o
 OBJS-$(CONFIG_WMV1_DECODER)            += msmpeg4dec.o msmpeg4.o msmpeg4data.o
-OBJS-$(CONFIG_WMV1_ENCODER)            += msmpeg4enc.o
+OBJS-$(CONFIG_WMV1_ENCODER)            += msmpeg4enc.o msmpeg4.o msmpeg4data.o
 OBJS-$(CONFIG_WMV2_DECODER)            += wmv2dec.o wmv2.o wmv2data.o \
                                           msmpeg4dec.o msmpeg4.o msmpeg4data.o
 OBJS-$(CONFIG_WMV2_ENCODER)            += wmv2enc.o wmv2.o wmv2data.o \
@@ -737,6 +757,7 @@
 OBJS-$(CONFIG_PCM_ALAW_ENCODER)           += pcm.o
 OBJS-$(CONFIG_PCM_BLURAY_DECODER)         += pcm-bluray.o
 OBJS-$(CONFIG_PCM_DVD_DECODER)            += pcm-dvd.o
+OBJS-$(CONFIG_PCM_DVD_ENCODER)            += pcm-dvdenc.o
 OBJS-$(CONFIG_PCM_F16LE_DECODER)          += pcm.o
 OBJS-$(CONFIG_PCM_F24LE_DECODER)          += pcm.o
 OBJS-$(CONFIG_PCM_F32BE_DECODER)          += pcm.o
@@ -794,13 +815,16 @@
 OBJS-$(CONFIG_PCM_U32BE_ENCODER)          += pcm.o
 OBJS-$(CONFIG_PCM_U32LE_DECODER)          += pcm.o
 OBJS-$(CONFIG_PCM_U32LE_ENCODER)          += pcm.o
-OBJS-$(CONFIG_PCM_ZORK_DECODER)           += pcm.o
+OBJS-$(CONFIG_PCM_VIDC_DECODER)           += pcm.o
+OBJS-$(CONFIG_PCM_VIDC_ENCODER)           += pcm.o
 
 OBJS-$(CONFIG_ADPCM_4XM_DECODER)          += adpcm.o adpcm_data.o
 OBJS-$(CONFIG_ADPCM_ADX_DECODER)          += adxdec.o adx.o
 OBJS-$(CONFIG_ADPCM_ADX_ENCODER)          += adxenc.o adx.o
 OBJS-$(CONFIG_ADPCM_AFC_DECODER)          += adpcm.o adpcm_data.o
+OBJS-$(CONFIG_ADPCM_AGM_DECODER)          += adpcm.o adpcm_data.o
 OBJS-$(CONFIG_ADPCM_AICA_DECODER)         += adpcm.o adpcm_data.o
+OBJS-$(CONFIG_ADPCM_ARGO_DECODER)         += adpcm.o adpcm_data.o
 OBJS-$(CONFIG_ADPCM_CT_DECODER)           += adpcm.o adpcm_data.o
 OBJS-$(CONFIG_ADPCM_DTK_DECODER)          += adpcm.o adpcm_data.o
 OBJS-$(CONFIG_ADPCM_EA_DECODER)           += adpcm.o adpcm_data.o
@@ -816,17 +840,21 @@
 OBJS-$(CONFIG_ADPCM_G726LE_DECODER)       += g726.o
 OBJS-$(CONFIG_ADPCM_G726LE_ENCODER)       += g726.o
 OBJS-$(CONFIG_ADPCM_IMA_AMV_DECODER)      += adpcm.o adpcm_data.o
+OBJS-$(CONFIG_ADPCM_IMA_ALP_DECODER)      += adpcm.o adpcm_data.o
 OBJS-$(CONFIG_ADPCM_IMA_APC_DECODER)      += adpcm.o adpcm_data.o
+OBJS-$(CONFIG_ADPCM_IMA_APM_DECODER)      += adpcm.o adpcm_data.o
 OBJS-$(CONFIG_ADPCM_IMA_DAT4_DECODER)     += adpcm.o adpcm_data.o
 OBJS-$(CONFIG_ADPCM_IMA_DK3_DECODER)      += adpcm.o adpcm_data.o
 OBJS-$(CONFIG_ADPCM_IMA_DK4_DECODER)      += adpcm.o adpcm_data.o
 OBJS-$(CONFIG_ADPCM_IMA_EA_EACS_DECODER)  += adpcm.o adpcm_data.o
 OBJS-$(CONFIG_ADPCM_IMA_EA_SEAD_DECODER)  += adpcm.o adpcm_data.o
 OBJS-$(CONFIG_ADPCM_IMA_ISS_DECODER)      += adpcm.o adpcm_data.o
+OBJS-$(CONFIG_ADPCM_IMA_MTF_DECODER)      += adpcm.o adpcm_data.o
 OBJS-$(CONFIG_ADPCM_IMA_OKI_DECODER)      += adpcm.o adpcm_data.o
 OBJS-$(CONFIG_ADPCM_IMA_QT_DECODER)       += adpcm.o adpcm_data.o
 OBJS-$(CONFIG_ADPCM_IMA_QT_ENCODER)       += adpcmenc.o adpcm_data.o
 OBJS-$(CONFIG_ADPCM_IMA_RAD_DECODER)      += adpcm.o adpcm_data.o
+OBJS-$(CONFIG_ADPCM_IMA_SSI_DECODER)      += adpcm.o adpcm_data.o
 OBJS-$(CONFIG_ADPCM_IMA_SMJPEG_DECODER)   += adpcm.o adpcm_data.o
 OBJS-$(CONFIG_ADPCM_IMA_WAV_DECODER)      += adpcm.o adpcm_data.o
 OBJS-$(CONFIG_ADPCM_IMA_WAV_ENCODER)      += adpcmenc.o adpcm_data.o
@@ -846,6 +874,7 @@
 OBJS-$(CONFIG_ADPCM_XA_DECODER)           += adpcm.o adpcm_data.o
 OBJS-$(CONFIG_ADPCM_YAMAHA_DECODER)       += adpcm.o adpcm_data.o
 OBJS-$(CONFIG_ADPCM_YAMAHA_ENCODER)       += adpcmenc.o adpcm_data.o
+OBJS-$(CONFIG_ADPCM_ZORK_DECODER)         += adpcm.o adpcm_data.o
 
 # hardware accelerators
 OBJS-$(CONFIG_D3D11VA)                    += dxva2.o
@@ -868,7 +897,7 @@
 OBJS-$(CONFIG_HEVC_DXVA2_HWACCEL)         += dxva2_hevc.o
 OBJS-$(CONFIG_HEVC_NVDEC_HWACCEL)         += nvdec_hevc.o
 OBJS-$(CONFIG_HEVC_QSV_HWACCEL)           += qsvdec_h2645.o
-OBJS-$(CONFIG_HEVC_VAAPI_HWACCEL)         += vaapi_hevc.o
+OBJS-$(CONFIG_HEVC_VAAPI_HWACCEL)         += vaapi_hevc.o h265_profile_level.o
 OBJS-$(CONFIG_HEVC_VDPAU_HWACCEL)         += vdpau_hevc.o
 OBJS-$(CONFIG_MJPEG_NVDEC_HWACCEL)        += nvdec_mjpeg.o
 OBJS-$(CONFIG_MJPEG_VAAPI_HWACCEL)        += vaapi_mjpeg.o
@@ -900,6 +929,7 @@
 OBJS-$(CONFIG_VP9_DXVA2_HWACCEL)          += dxva2_vp9.o
 OBJS-$(CONFIG_VP9_NVDEC_HWACCEL)          += nvdec_vp9.o
 OBJS-$(CONFIG_VP9_VAAPI_HWACCEL)          += vaapi_vp9.o
+OBJS-$(CONFIG_VP9_VDPAU_HWACCEL)          += vdpau_vp9.o
 OBJS-$(CONFIG_VP8_QSV_HWACCEL)            += qsvdec_other.o
 
 # libavformat dependencies
@@ -951,9 +981,11 @@
 OBJS-$(CONFIG_PCM_MULAW_AT_ENCODER)       += audiotoolboxenc.o
 OBJS-$(CONFIG_LIBAOM_AV1_DECODER)         += libaomdec.o
 OBJS-$(CONFIG_LIBAOM_AV1_ENCODER)         += libaomenc.o
+OBJS-$(CONFIG_LIBARIBB24_DECODER)         += libaribb24.o ass.o
 OBJS-$(CONFIG_LIBCELT_DECODER)            += libcelt_dec.o
 OBJS-$(CONFIG_LIBCODEC2_DECODER)          += libcodec2.o codec2utils.o
 OBJS-$(CONFIG_LIBCODEC2_ENCODER)          += libcodec2.o codec2utils.o
+OBJS-$(CONFIG_LIBDAV1D_DECODER)           += libdav1d.o
 OBJS-$(CONFIG_LIBDAVS2_DECODER)           += libdavs2.o
 OBJS-$(CONFIG_LIBFDK_AAC_DECODER)         += libfdk-aacdec.o
 OBJS-$(CONFIG_LIBFDK_AAC_ENCODER)         += libfdk-aacenc.o
@@ -976,6 +1008,7 @@
                                              vorbis_data.o
 OBJS-$(CONFIG_LIBOPUS_ENCODER)            += libopusenc.o libopus.o     \
                                              vorbis_data.o
+OBJS-$(CONFIG_LIBRAV1E_ENCODER)           += librav1e.o
 OBJS-$(CONFIG_LIBSHINE_ENCODER)           += libshine.o
 OBJS-$(CONFIG_LIBSPEEX_DECODER)           += libspeexdec.o
 OBJS-$(CONFIG_LIBSPEEX_ENCODER)           += libspeexenc.o
@@ -1021,18 +1054,19 @@
 OBJS-$(CONFIG_DVDSUB_PARSER)           += dvdsub_parser.o
 OBJS-$(CONFIG_FLAC_PARSER)             += flac_parser.o flacdata.o flac.o \
                                           vorbis_data.o
+OBJS-$(CONFIG_G723_1_PARSER)           += g723_1_parser.o
 OBJS-$(CONFIG_G729_PARSER)             += g729_parser.o
+OBJS-$(CONFIG_GIF_PARSER)              += gif_parser.o
 OBJS-$(CONFIG_GSM_PARSER)              += gsm_parser.o
 OBJS-$(CONFIG_H261_PARSER)             += h261_parser.o
 OBJS-$(CONFIG_H263_PARSER)             += h263_parser.o
 OBJS-$(CONFIG_H264_PARSER)             += h264_parser.o h264_sei.o h264data.o
 OBJS-$(CONFIG_HEVC_PARSER)             += hevc_parser.o hevc_data.o
 OBJS-$(CONFIG_MJPEG_PARSER)            += mjpeg_parser.o
-OBJS-$(CONFIG_MLP_PARSER)              += mlp_parser.o mlp.o
+OBJS-$(CONFIG_MLP_PARSER)              += mlp_parse.o mlp_parser.o mlp.o
 OBJS-$(CONFIG_MPEG4VIDEO_PARSER)       += mpeg4video_parser.o h263.o \
                                           mpeg4videodec.o mpeg4video.o \
                                           ituh263dec.o h263dec.o h263data.o
-OBJS-$(CONFIG_PNG_PARSER)              += png_parser.o
 OBJS-$(CONFIG_MPEGAUDIO_PARSER)        += mpegaudio_parser.o
 OBJS-$(CONFIG_MPEGVIDEO_PARSER)        += mpegvideo_parser.o    \
                                           mpeg12.o mpeg12data.o
@@ -1050,11 +1084,14 @@
 OBJS-$(CONFIG_VP3_PARSER)              += vp3_parser.o
 OBJS-$(CONFIG_VP8_PARSER)              += vp8_parser.o
 OBJS-$(CONFIG_VP9_PARSER)              += vp9_parser.o
+OBJS-$(CONFIG_WEBP_PARSER)             += webp_parser.o
 OBJS-$(CONFIG_XMA_PARSER)              += xma_parser.o
 
 # bitstream filters
 OBJS-$(CONFIG_AAC_ADTSTOASC_BSF)          += aac_adtstoasc_bsf.o mpeg4audio.o
 OBJS-$(CONFIG_AV1_METADATA_BSF)           += av1_metadata_bsf.o
+OBJS-$(CONFIG_AV1_FRAME_MERGE_BSF)        += av1_frame_merge_bsf.o
+OBJS-$(CONFIG_AV1_FRAME_SPLIT_BSF)        += av1_frame_split_bsf.o
 OBJS-$(CONFIG_CHOMP_BSF)                  += chomp_bsf.o
 OBJS-$(CONFIG_DUMP_EXTRADATA_BSF)         += dump_extradata_bsf.o
 OBJS-$(CONFIG_DCA_CORE_BSF)               += dca_core_bsf.o
@@ -1066,7 +1103,7 @@
 OBJS-$(CONFIG_H264_MP4TOANNEXB_BSF)       += h264_mp4toannexb_bsf.o
 OBJS-$(CONFIG_H264_REDUNDANT_PPS_BSF)     += h264_redundant_pps_bsf.o
 OBJS-$(CONFIG_HAPQA_EXTRACT_BSF)          += hapqa_extract_bsf.o hap.o
-OBJS-$(CONFIG_HEVC_METADATA_BSF)          += h265_metadata_bsf.o
+OBJS-$(CONFIG_HEVC_METADATA_BSF)          += h265_metadata_bsf.o h265_profile_level.o
 OBJS-$(CONFIG_HEVC_MP4TOANNEXB_BSF)       += hevc_mp4toannexb_bsf.o
 OBJS-$(CONFIG_IMX_DUMP_HEADER_BSF)        += imx_dump_header_bsf.o
 OBJS-$(CONFIG_MJPEG2JPEG_BSF)             += mjpeg2jpeg_bsf.o
@@ -1078,9 +1115,11 @@
 OBJS-$(CONFIG_MPEG2_METADATA_BSF)         += mpeg2_metadata_bsf.o
 OBJS-$(CONFIG_NOISE_BSF)                  += noise_bsf.o
 OBJS-$(CONFIG_NULL_BSF)                   += null_bsf.o
+OBJS-$(CONFIG_PRORES_METADATA_BSF)        += prores_metadata_bsf.o
 OBJS-$(CONFIG_REMOVE_EXTRADATA_BSF)       += remove_extradata_bsf.o
 OBJS-$(CONFIG_TEXT2MOVSUB_BSF)            += movsub_bsf.o
 OBJS-$(CONFIG_TRACE_HEADERS_BSF)          += trace_headers_bsf.o
+OBJS-$(CONFIG_TRUEHD_CORE_BSF)            += truehd_core_bsf.o mlp_parse.o mlp.o
 OBJS-$(CONFIG_VP9_METADATA_BSF)           += vp9_metadata_bsf.o
 OBJS-$(CONFIG_VP9_RAW_REORDER_BSF)        += vp9_raw_reorder_bsf.o
 OBJS-$(CONFIG_VP9_SUPERFRAME_BSF)         += vp9_superframe_bsf.o
@@ -1144,6 +1183,7 @@
 TESTPROGS-$(HAVE_MMX)                     += motion
 TESTPROGS-$(CONFIG_MPEGVIDEO)             += mpeg12framerate
 TESTPROGS-$(CONFIG_H264_METADATA_BSF)     += h264_levels
+TESTPROGS-$(CONFIG_HEVC_METADATA_BSF)     += h265_levels
 TESTPROGS-$(CONFIG_RANGECODER)            += rangecoder
 TESTPROGS-$(CONFIG_SNOW_ENCODER)          += snowenc
 
diff --git a/libavcodec/a64multienc.c b/libavcodec/a64multienc.c
index 91aac09..38f2502 100644
--- a/libavcodec/a64multienc.c
+++ b/libavcodec/a64multienc.c
@@ -60,11 +60,11 @@
 } A64Context;
 
 /* gray gradient */
-static const int mc_colors[5]={0x0,0xb,0xc,0xf,0x1};
+static const uint8_t mc_colors[5]={0x0,0xb,0xc,0xf,0x1};
 
 /* other possible gradients - to be tested */
-//static const int mc_colors[5]={0x0,0x8,0xa,0xf,0x7};
-//static const int mc_colors[5]={0x0,0x9,0x8,0xa,0x3};
+//static const uint8_t mc_colors[5]={0x0,0x8,0xa,0xf,0x7};
+//static const uint8_t mc_colors[5]={0x0,0x9,0x8,0xa,0x3};
 
 static void to_meta_with_crop(AVCodecContext *avctx,
                               const AVFrame *p, int *dest)
diff --git a/libavcodec/aac.h b/libavcodec/aac.h
index 05bc953..d422ea5 100644
--- a/libavcodec/aac.h
+++ b/libavcodec/aac.h
@@ -356,7 +356,7 @@
     OutputConfiguration oc[2];
     int warned_num_aac_frames;
     int warned_960_sbr;
-
+    unsigned warned_71_wide;
     int warned_gain_control;
 
     /* aacdec functions pointers */
@@ -368,7 +368,7 @@
                                    INTFLOAT *in, IndividualChannelStream *ics);
     void (*update_ltp)(AACContext *ac, SingleChannelElement *sce);
     void (*vector_pow43)(int *coefs, int len);
-    void (*subband_scale)(int *dst, int *src, int scale, int offset, int len);
+    void (*subband_scale)(int *dst, int *src, int scale, int offset, int len, void *log_context);
 
 };
 
diff --git a/libavcodec/aac_adtstoasc_bsf.c b/libavcodec/aac_adtstoasc_bsf.c
index 6541b11..e378296 100644
--- a/libavcodec/aac_adtstoasc_bsf.c
+++ b/libavcodec/aac_adtstoasc_bsf.c
@@ -134,8 +134,8 @@
     /* Validate the extradata if the stream is already MPEG-4 AudioSpecificConfig */
     if (ctx->par_in->extradata) {
         MPEG4AudioConfig mp4ac;
-        int ret = avpriv_mpeg4audio_get_config(&mp4ac, ctx->par_in->extradata,
-                                               ctx->par_in->extradata_size * 8, 1);
+        int ret = avpriv_mpeg4audio_get_config2(&mp4ac, ctx->par_in->extradata,
+                                                ctx->par_in->extradata_size, 1, ctx);
         if (ret < 0) {
             av_log(ctx, AV_LOG_ERROR, "Error parsing AudioSpecificConfig extradata!\n");
             return ret;
diff --git a/libavcodec/aacdec.c b/libavcodec/aacdec.c
index d394700..d17852d 100644
--- a/libavcodec/aacdec.c
+++ b/libavcodec/aacdec.c
@@ -247,14 +247,12 @@
                                        SingleChannelElement *target,
                                        ChannelElement *cce, int index)
 {
-    int i;
     const float gain = cce->coup.gain[index][0];
     const float *src = cce->ch[0].ret;
     float *dest = target->ret;
     const int len = 1024 << (ac->oc[1].m4ac.sbr == 1);
 
-    for (i = 0; i < len; i++)
-        dest[i] += gain * src[i];
+    ac->fdsp->vector_fmac_scalar(dest, src, gain, len);
 }
 
 #include "aacdec_template.c"
@@ -411,6 +409,8 @@
             } else {
                 int esc;
                 do {
+                    if (get_bits_left(gb) < 9)
+                        return AVERROR_INVALIDDATA;
                     esc = get_bits(gb, 1);
                     skip_bits(gb, 8);
                 } while (esc);
@@ -561,7 +561,7 @@
         AV_SAMPLE_FMT_FLTP, AV_SAMPLE_FMT_NONE
     },
     .capabilities    = AV_CODEC_CAP_CHANNEL_CONF | AV_CODEC_CAP_DR1,
-    .caps_internal   = FF_CODEC_CAP_INIT_THREADSAFE,
+    .caps_internal   = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_INIT_CLEANUP,
     .channel_layouts = aac_channel_layout,
     .flush = flush,
     .priv_class      = &aac_decoder_class,
@@ -586,7 +586,7 @@
         AV_SAMPLE_FMT_FLTP, AV_SAMPLE_FMT_NONE
     },
     .capabilities    = AV_CODEC_CAP_CHANNEL_CONF | AV_CODEC_CAP_DR1,
-    .caps_internal   = FF_CODEC_CAP_INIT_THREADSAFE,
+    .caps_internal   = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_INIT_CLEANUP,
     .channel_layouts = aac_channel_layout,
     .flush = flush,
     .profiles        = NULL_IF_CONFIG_SMALL(ff_aac_profiles),
diff --git a/libavcodec/aacdec_fixed.c b/libavcodec/aacdec_fixed.c
index 1bdb93f..9b2145c 100644
--- a/libavcodec/aacdec_fixed.c
+++ b/libavcodec/aacdec_fixed.c
@@ -162,7 +162,7 @@
     }
 }
 
-static void subband_scale(int *dst, int *src, int scale, int offset, int len)
+static void subband_scale(int *dst, int *src, int scale, int offset, int len, void *log_context)
 {
     int ssign = scale < 0 ? -1 : 1;
     int s = FFABS(scale);
@@ -189,18 +189,18 @@
             dst[i] = out * (unsigned)ssign;
         }
     } else {
-        av_log(NULL, AV_LOG_ERROR, "Overflow in subband_scale()\n");
+        av_log(log_context, AV_LOG_ERROR, "Overflow in subband_scale()\n");
     }
 }
 
 static void noise_scale(int *coefs, int scale, int band_energy, int len)
 {
-    int ssign = scale < 0 ? -1 : 1;
-    int s = FFABS(scale);
+    int s = -scale;
     unsigned int round;
     int i, out, c = exp2tab[s & 3];
     int nlz = 0;
 
+    av_assert0(s >= 0);
     while (band_energy > 0x7fff) {
         band_energy >>= 1;
         nlz++;
@@ -216,15 +216,20 @@
         round = s ? 1 << (s-1) : 0;
         for (i=0; i<len; i++) {
             out = (int)(((int64_t)coefs[i] * c) >> 32);
-            coefs[i] = ((int)(out+round) >> s) * ssign;
+            coefs[i] = -((int)(out+round) >> s);
         }
     }
     else {
         s = s + 32;
-        round = 1 << (s-1);
-        for (i=0; i<len; i++) {
-            out = (int)((int64_t)((int64_t)coefs[i] * c + round) >> s);
-            coefs[i] = out * ssign;
+        if (s > 0) {
+            round = 1 << (s-1);
+            for (i=0; i<len; i++) {
+                out = (int)((int64_t)((int64_t)coefs[i] * c + round) >> s);
+                coefs[i] = -out;
+            }
+        } else {
+            for (i=0; i<len; i++)
+                coefs[i] = -(int64_t)coefs[i] * c * (1 << -s);
         }
     }
 }
@@ -456,7 +461,7 @@
         AV_SAMPLE_FMT_S32P, AV_SAMPLE_FMT_NONE
     },
     .capabilities    = AV_CODEC_CAP_CHANNEL_CONF | AV_CODEC_CAP_DR1,
-    .caps_internal   = FF_CODEC_CAP_INIT_THREADSAFE,
+    .caps_internal   = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_INIT_CLEANUP,
     .channel_layouts = aac_channel_layout,
     .profiles        = NULL_IF_CONFIG_SMALL(ff_aac_profiles),
     .flush = flush,
diff --git a/libavcodec/aacdec_template.c b/libavcodec/aacdec_template.c
index dce6035..3c78185 100644
--- a/libavcodec/aacdec_template.c
+++ b/libavcodec/aacdec_template.c
@@ -520,14 +520,14 @@
  *
  * @return  Returns error status. 0 - OK, !0 - error
  */
-static int set_default_channel_config(AVCodecContext *avctx,
+static int set_default_channel_config(AACContext *ac,
                                       uint8_t (*layout_map)[3],
                                       int *tags,
                                       int channel_config)
 {
     if (channel_config < 1 || (channel_config > 7 && channel_config < 11) ||
         channel_config > 12) {
-        av_log(avctx, AV_LOG_ERROR,
+        av_log(ac->avctx, AV_LOG_ERROR,
                "invalid default channel configuration (%d)\n",
                channel_config);
         return AVERROR_INVALIDDATA;
@@ -547,8 +547,8 @@
      * As actual intended 7.1(wide) streams are very rare, default to assuming a
      * 7.1 layout was intended.
      */
-    if (channel_config == 7 && avctx->strict_std_compliance < FF_COMPLIANCE_STRICT) {
-        av_log(avctx, AV_LOG_INFO, "Assuming an incorrectly encoded 7.1 channel layout"
+    if (channel_config == 7 && ac->avctx->strict_std_compliance < FF_COMPLIANCE_STRICT && !ac->warned_71_wide++) {
+        av_log(ac->avctx, AV_LOG_INFO, "Assuming an incorrectly encoded 7.1 channel layout"
                " instead of a spec-compliant 7.1(wide) layout, use -strict %d to decode"
                " according to the specification instead.\n", FF_COMPLIANCE_STRICT);
         layout_map[2][2] = AAC_CHANNEL_SIDE;
@@ -573,7 +573,7 @@
 
         av_log(ac->avctx, AV_LOG_DEBUG, "mono with CPE\n");
 
-        if (set_default_channel_config(ac->avctx, layout_map,
+        if (set_default_channel_config(ac, layout_map,
                                        &layout_map_tags, 2) < 0)
             return NULL;
         if (output_configure(ac, layout_map, layout_map_tags,
@@ -592,7 +592,7 @@
 
         av_log(ac->avctx, AV_LOG_DEBUG, "stereo with SCE\n");
 
-        if (set_default_channel_config(ac->avctx, layout_map,
+        if (set_default_channel_config(ac, layout_map,
                                        &layout_map_tags, 1) < 0)
             return NULL;
         if (output_configure(ac, layout_map, layout_map_tags,
@@ -841,7 +841,7 @@
         if (tags < 0)
             return tags;
     } else {
-        if ((ret = set_default_channel_config(avctx, layout_map,
+        if ((ret = set_default_channel_config(ac, layout_map,
                                               &tags, channel_config)))
             return ret;
     }
@@ -937,7 +937,7 @@
         skip_bits_long(gb, 8 * len);
     }
 
-    if ((ret = set_default_channel_config(avctx, layout_map,
+    if ((ret = set_default_channel_config(ac, layout_map,
                                           &tags, channel_config)))
         return ret;
 
@@ -975,7 +975,7 @@
     int i, ret;
     GetBitContext gbc = *gb;
 
-    if ((i = ff_mpeg4audio_get_config_gb(m4ac, &gbc, sync_extension)) < 0)
+    if ((i = ff_mpeg4audio_get_config_gb(m4ac, &gbc, sync_extension, avctx)) < 0)
         return AVERROR_INVALIDDATA;
 
     if (m4ac->sampling_index > 12) {
@@ -1157,6 +1157,9 @@
     AACContext *ac = avctx->priv_data;
     int ret;
 
+    if (avctx->sample_rate > 96000)
+        return AVERROR_INVALIDDATA;
+
     ret = ff_thread_once(&aac_table_init, &aac_static_table_init);
     if (ret != 0)
         return AVERROR_UNKNOWN;
@@ -1197,7 +1200,7 @@
         ac->oc[1].m4ac.chan_config = i;
 
         if (ac->oc[1].m4ac.chan_config) {
-            int ret = set_default_channel_config(avctx, layout_map,
+            int ret = set_default_channel_config(ac, layout_map,
                 &layout_map_tags, ac->oc[1].m4ac.chan_config);
             if (!ret)
                 output_configure(ac, layout_map, layout_map_tags,
@@ -1673,25 +1676,24 @@
                 }
             } else if (cbt_m1 == NOISE_BT - 1) {
                 for (group = 0; group < (AAC_SIGNE)g_len; group++, cfo+=128) {
-#if !USE_FIXED
-                    float scale;
-#endif /* !USE_FIXED */
                     INTFLOAT band_energy;
-
+#if USE_FIXED
                     for (k = 0; k < off_len; k++) {
                         ac->random_state  = lcg_random(ac->random_state);
-#if USE_FIXED
                         cfo[k] = ac->random_state >> 3;
-#else
-                        cfo[k] = ac->random_state;
-#endif /* USE_FIXED */
                     }
 
-#if USE_FIXED
                     band_energy = ac->fdsp->scalarproduct_fixed(cfo, cfo, off_len);
                     band_energy = fixed_sqrt(band_energy, 31);
                     noise_scale(cfo, sf[idx], band_energy, off_len);
 #else
+                    float scale;
+
+                    for (k = 0; k < off_len; k++) {
+                        ac->random_state  = lcg_random(ac->random_state);
+                        cfo[k] = ac->random_state;
+                    }
+
                     band_energy = ac->fdsp->scalarproduct_float(cfo, cfo, off_len);
                     scale = sf[idx] / sqrtf(band_energy);
                     ac->fdsp->vector_fmul_scalar(cfo, cfo, scale, off_len);
@@ -1927,7 +1929,7 @@
             if (cbt_m1 < NOISE_BT - 1) {
                 for (group = 0; group < (int)g_len; group++, cfo+=128) {
                     ac->vector_pow43(cfo, off_len);
-                    ac->subband_scale(cfo, cfo, sf[idx], 34, off_len);
+                    ac->subband_scale(cfo, cfo, sf[idx], 34, off_len, ac->avctx);
                 }
             }
         }
@@ -2158,7 +2160,7 @@
                                       coef0 + group * 128 + offsets[i],
                                       scale,
                                       23,
-                                      offsets[i + 1] - offsets[i]);
+                                      offsets[i + 1] - offsets[i] ,ac->avctx);
 #else
                         ac->fdsp->vector_fmul_scalar(coef1 + group * 128 + offsets[i],
                                                     coef0 + group * 128 + offsets[i],
@@ -2493,6 +2495,9 @@
     INTFLOAT tmp[TNS_MAX_ORDER+1];
     UINTFLOAT *coef = coef_param;
 
+    if(!mmm)
+        return;
+
     for (w = 0; w < ics->num_windows; w++) {
         bottom = ics->num_swb;
         for (filt = 0; filt < tns->n_filt[w]; filt++) {
@@ -2657,7 +2662,7 @@
         ac->mdct.imdct_half(&ac->mdct, buf, in);
 #if USE_FIXED
         for (i=0; i<1024; i++)
-          buf[i] = (buf[i] + 4) >> 3;
+          buf[i] = (buf[i] + 4LL) >> 3;
 #endif /* USE_FIXED */
     }
 
@@ -2997,7 +3002,7 @@
         push_output_configuration(ac);
         if (hdr_info.chan_config) {
             ac->oc[1].m4ac.chan_config = hdr_info.chan_config;
-            if ((ret = set_default_channel_config(ac->avctx,
+            if ((ret = set_default_channel_config(ac,
                                                   layout_map,
                                                   &layout_map_tags,
                                                   hdr_info.chan_config)) < 0)
@@ -3244,9 +3249,15 @@
                     err = AVERROR_INVALIDDATA;
                     goto fail;
             }
-            while (elem_id > 0)
-                elem_id -= decode_extension_payload(ac, gb, elem_id, che_prev, che_prev_type);
-            err = 0; /* FIXME */
+            err = 0;
+            while (elem_id > 0) {
+                int ret = decode_extension_payload(ac, gb, elem_id, che_prev, che_prev_type);
+                if (ret < 0) {
+                    err = ret;
+                    break;
+                }
+                elem_id -= ret;
+            }
             break;
 
         default:
diff --git a/libavcodec/aacenc_ltp.c b/libavcodec/aacenc_ltp.c
index 674a2a0..f77f0b6 100644
--- a/libavcodec/aacenc_ltp.c
+++ b/libavcodec/aacenc_ltp.c
@@ -144,7 +144,7 @@
         int sum = sce0->ics.ltp.used[sfb] + sce1->ics.ltp.used[sfb];
         if (sum != 2) {
             sce0->ics.ltp.used[sfb] = 0;
-        } else if (sum == 2) {
+        } else {
             count++;
         }
     }
diff --git a/libavcodec/aacps.c b/libavcodec/aacps.c
index b16c339..22df160 100644
--- a/libavcodec/aacps.c
+++ b/libavcodec/aacps.c
@@ -118,7 +118,7 @@
     return 0; \
 err: \
     av_log(avctx, AV_LOG_ERROR, "illegal "#PAR"\n"); \
-    return -1; \
+    return AVERROR_INVALIDDATA; \
 }
 
 READ_PAR_DATA(iid,    huff_offset[table_idx],    0, FFABS(ps->iid_par[e][b]) > 7 + 8 * ps->iid_quant)
@@ -414,33 +414,33 @@
             memset(out[0][n], 0, 5*sizeof(out[0][n][0]));
             memset(out[1][n], 0, 5*sizeof(out[1][n][0]));
             for (i = 0; i < 12; i++) {
-                out[0][n][0] += in[   i][n][0];
-                out[1][n][0] += in[   i][n][1];
+                out[0][n][0] += (UINTFLOAT)in[   i][n][0];
+                out[1][n][0] += (UINTFLOAT)in[   i][n][1];
             }
             for (i = 0; i < 8; i++) {
-                out[0][n][1] += in[12+i][n][0];
-                out[1][n][1] += in[12+i][n][1];
+                out[0][n][1] += (UINTFLOAT)in[12+i][n][0];
+                out[1][n][1] += (UINTFLOAT)in[12+i][n][1];
             }
             for (i = 0; i < 4; i++) {
-                out[0][n][2] += in[20+i][n][0];
-                out[1][n][2] += in[20+i][n][1];
-                out[0][n][3] += in[24+i][n][0];
-                out[1][n][3] += in[24+i][n][1];
-                out[0][n][4] += in[28+i][n][0];
-                out[1][n][4] += in[28+i][n][1];
+                out[0][n][2] += (UINTFLOAT)in[20+i][n][0];
+                out[1][n][2] += (UINTFLOAT)in[20+i][n][1];
+                out[0][n][3] += (UINTFLOAT)in[24+i][n][0];
+                out[1][n][3] += (UINTFLOAT)in[24+i][n][1];
+                out[0][n][4] += (UINTFLOAT)in[28+i][n][0];
+                out[1][n][4] += (UINTFLOAT)in[28+i][n][1];
             }
         }
         dsp->hybrid_synthesis_deint(out, in + 27, 5, len);
     } else {
         for (n = 0; n < len; n++) {
-            out[0][n][0] = in[0][n][0] + in[1][n][0] + in[2][n][0] +
-                           in[3][n][0] + in[4][n][0] + in[5][n][0];
-            out[1][n][0] = in[0][n][1] + in[1][n][1] + in[2][n][1] +
-                           in[3][n][1] + in[4][n][1] + in[5][n][1];
-            out[0][n][1] = in[6][n][0] + in[7][n][0];
-            out[1][n][1] = in[6][n][1] + in[7][n][1];
-            out[0][n][2] = in[8][n][0] + in[9][n][0];
-            out[1][n][2] = in[8][n][1] + in[9][n][1];
+            out[0][n][0] = (UINTFLOAT)in[0][n][0] + in[1][n][0] + in[2][n][0] +
+                           (UINTFLOAT)in[3][n][0] + in[4][n][0] + in[5][n][0];
+            out[1][n][0] = (UINTFLOAT)in[0][n][1] + in[1][n][1] + in[2][n][1] +
+                           (UINTFLOAT)in[3][n][1] + in[4][n][1] + in[5][n][1];
+            out[0][n][1] = (UINTFLOAT)in[6][n][0] + in[7][n][0];
+            out[1][n][1] = (UINTFLOAT)in[6][n][1] + in[7][n][1];
+            out[0][n][2] = (UINTFLOAT)in[8][n][0] + in[9][n][0];
+            out[1][n][2] = (UINTFLOAT)in[8][n][1] + in[9][n][1];
         }
         dsp->hybrid_synthesis_deint(out, in + 7, 3, len);
     }
diff --git a/libavcodec/aacpsdsp_template.c b/libavcodec/aacpsdsp_template.c
index 5f4be01..eef8adc 100644
--- a/libavcodec/aacpsdsp_template.c
+++ b/libavcodec/aacpsdsp_template.c
@@ -54,10 +54,10 @@
         INT64FLOAT sum_im = (INT64FLOAT)filter[i][6][0] * in[6][1];
 
         for (j = 0; j < 6; j++) {
-            INTFLOAT in0_re = in[j][0];
-            INTFLOAT in0_im = in[j][1];
-            INTFLOAT in1_re = in[12-j][0];
-            INTFLOAT in1_im = in[12-j][1];
+            INT64FLOAT in0_re = in[j][0];
+            INT64FLOAT in0_im = in[j][1];
+            INT64FLOAT in1_re = in[12-j][0];
+            INT64FLOAT in1_im = in[12-j][1];
             sum_re += (INT64FLOAT)filter[i][j][0] * (in0_re + in1_re) -
                       (INT64FLOAT)filter[i][j][1] * (in0_im - in1_im);
             sum_im += (INT64FLOAT)filter[i][j][0] * (in0_im + in1_im) +
diff --git a/libavcodec/aarch64/Makefile b/libavcodec/aarch64/Makefile
index 72080c2..52da703 100644
--- a/libavcodec/aarch64/Makefile
+++ b/libavcodec/aarch64/Makefile
@@ -6,19 +6,23 @@
 OBJS-$(CONFIG_H264PRED)                 += aarch64/h264pred_init.o
 OBJS-$(CONFIG_H264QPEL)                 += aarch64/h264qpel_init_aarch64.o
 OBJS-$(CONFIG_HPELDSP)                  += aarch64/hpeldsp_init_aarch64.o
+OBJS-$(CONFIG_IDCTDSP)                  += aarch64/idctdsp_init_aarch64.o
 OBJS-$(CONFIG_MPEGAUDIODSP)             += aarch64/mpegaudiodsp_init.o
 OBJS-$(CONFIG_NEON_CLOBBER_TEST)        += aarch64/neontest.o
 OBJS-$(CONFIG_VIDEODSP)                 += aarch64/videodsp_init.o
+OBJS-$(CONFIG_VP8DSP)                   += aarch64/vp8dsp_init_aarch64.o
 
 # decoders/encoders
 OBJS-$(CONFIG_AAC_DECODER)              += aarch64/aacpsdsp_init_aarch64.o \
                                            aarch64/sbrdsp_init_aarch64.o
 OBJS-$(CONFIG_DCA_DECODER)              += aarch64/synth_filter_init.o
+OBJS-$(CONFIG_OPUS_DECODER)             += aarch64/opusdsp_init.o
 OBJS-$(CONFIG_RV40_DECODER)             += aarch64/rv40dsp_init_aarch64.o
 OBJS-$(CONFIG_VC1DSP)                   += aarch64/vc1dsp_init_aarch64.o
 OBJS-$(CONFIG_VORBIS_DECODER)           += aarch64/vorbisdsp_init.o
 OBJS-$(CONFIG_VP9_DECODER)              += aarch64/vp9dsp_init_10bpp_aarch64.o \
                                            aarch64/vp9dsp_init_12bpp_aarch64.o \
+                                           aarch64/vp9mc_aarch64.o             \
                                            aarch64/vp9dsp_init_aarch64.o
 
 # ARMv8 optimizations
@@ -39,14 +43,15 @@
 NEON-OBJS-$(CONFIG_H264QPEL)            += aarch64/h264qpel_neon.o             \
                                            aarch64/hpeldsp_neon.o
 NEON-OBJS-$(CONFIG_HPELDSP)             += aarch64/hpeldsp_neon.o
-NEON-OBJS-$(CONFIG_IDCTDSP)             += aarch64/idctdsp_init_aarch64.o      \
-                                           aarch64/simple_idct_neon.o
+NEON-OBJS-$(CONFIG_IDCTDSP)             += aarch64/simple_idct_neon.o
 NEON-OBJS-$(CONFIG_MDCT)                += aarch64/mdct_neon.o
 NEON-OBJS-$(CONFIG_MPEGAUDIODSP)        += aarch64/mpegaudiodsp_neon.o
+NEON-OBJS-$(CONFIG_VP8DSP)              += aarch64/vp8dsp_neon.o
 
 # decoders/encoders
 NEON-OBJS-$(CONFIG_AAC_DECODER)         += aarch64/aacpsdsp_neon.o
 NEON-OBJS-$(CONFIG_DCA_DECODER)         += aarch64/synth_filter_neon.o
+NEON-OBJS-$(CONFIG_OPUS_DECODER)        += aarch64/opusdsp_neon.o
 NEON-OBJS-$(CONFIG_VORBIS_DECODER)      += aarch64/vorbisdsp_neon.o
 NEON-OBJS-$(CONFIG_VP9_DECODER)         += aarch64/vp9itxfm_16bpp_neon.o       \
                                            aarch64/vp9itxfm_neon.o             \
diff --git a/libavcodec/aarch64/asm-offsets.h b/libavcodec/aarch64/asm-offsets.h
index e05c5ad..fc38eed 100644
--- a/libavcodec/aarch64/asm-offsets.h
+++ b/libavcodec/aarch64/asm-offsets.h
@@ -19,14 +19,6 @@
 #ifndef AVCODEC_AARCH64_ASM_OFFSETS_H
 #define AVCODEC_AARCH64_ASM_OFFSETS_H
 
-/* CeltIMDCTContext */
-#define CELT_EXPTAB                     0x20
-#define CELT_FFT_N                      0x00
-#define CELT_LEN2                       0x04
-#define CELT_LEN4                       (CELT_LEN2 + 0x4)   // loaded as pair
-#define CELT_TMP                        0x10
-#define CELT_TWIDDLE                    (CELT_TMP + 0x8)    // loaded as pair
-
 /* FFTContext */
 #define IMDCT_HALF                      0x48
 
diff --git a/libavcodec/aarch64/h264dsp_init_aarch64.c b/libavcodec/aarch64/h264dsp_init_aarch64.c
index eb2014e..d5baccf 100644
--- a/libavcodec/aarch64/h264dsp_init_aarch64.c
+++ b/libavcodec/aarch64/h264dsp_init_aarch64.c
@@ -25,14 +25,28 @@
 #include "libavutil/aarch64/cpu.h"
 #include "libavcodec/h264dsp.h"
 
-void ff_h264_v_loop_filter_luma_neon(uint8_t *pix, int stride, int alpha,
+void ff_h264_v_loop_filter_luma_neon(uint8_t *pix, ptrdiff_t stride, int alpha,
                                      int beta, int8_t *tc0);
-void ff_h264_h_loop_filter_luma_neon(uint8_t *pix, int stride, int alpha,
+void ff_h264_h_loop_filter_luma_neon(uint8_t *pix, ptrdiff_t stride, int alpha,
                                      int beta, int8_t *tc0);
-void ff_h264_v_loop_filter_chroma_neon(uint8_t *pix, int stride, int alpha,
+void ff_h264_v_loop_filter_luma_intra_neon(uint8_t *pix, ptrdiff_t stride, int alpha,
+                                           int beta);
+void ff_h264_h_loop_filter_luma_intra_neon(uint8_t *pix, ptrdiff_t stride, int alpha,
+                                           int beta);
+void ff_h264_v_loop_filter_chroma_neon(uint8_t *pix, ptrdiff_t stride, int alpha,
                                        int beta, int8_t *tc0);
-void ff_h264_h_loop_filter_chroma_neon(uint8_t *pix, int stride, int alpha,
+void ff_h264_h_loop_filter_chroma_neon(uint8_t *pix, ptrdiff_t stride, int alpha,
                                        int beta, int8_t *tc0);
+void ff_h264_h_loop_filter_chroma422_neon(uint8_t *pix, ptrdiff_t stride, int alpha,
+                                          int beta, int8_t *tc0);
+void ff_h264_v_loop_filter_chroma_intra_neon(uint8_t *pix, ptrdiff_t stride,
+                                             int alpha, int beta);
+void ff_h264_h_loop_filter_chroma_intra_neon(uint8_t *pix, ptrdiff_t stride,
+                                             int alpha, int beta);
+void ff_h264_h_loop_filter_chroma422_intra_neon(uint8_t *pix, ptrdiff_t stride,
+                                                int alpha, int beta);
+void ff_h264_h_loop_filter_chroma_mbaff_intra_neon(uint8_t *pix, ptrdiff_t stride,
+                                                   int alpha, int beta);
 
 void ff_weight_h264_pixels_16_neon(uint8_t *dst, ptrdiff_t stride, int height,
                                    int log2_den, int weight, int offset);
@@ -77,9 +91,22 @@
     if (have_neon(cpu_flags) && bit_depth == 8) {
         c->h264_v_loop_filter_luma   = ff_h264_v_loop_filter_luma_neon;
         c->h264_h_loop_filter_luma   = ff_h264_h_loop_filter_luma_neon;
+        c->h264_v_loop_filter_luma_intra= ff_h264_v_loop_filter_luma_intra_neon;
+        c->h264_h_loop_filter_luma_intra= ff_h264_h_loop_filter_luma_intra_neon;
+
         c->h264_v_loop_filter_chroma = ff_h264_v_loop_filter_chroma_neon;
-        if (chroma_format_idc <= 1)
-        c->h264_h_loop_filter_chroma = ff_h264_h_loop_filter_chroma_neon;
+        c->h264_v_loop_filter_chroma_intra = ff_h264_v_loop_filter_chroma_intra_neon;
+
+        if (chroma_format_idc <= 1) {
+            c->h264_h_loop_filter_chroma = ff_h264_h_loop_filter_chroma_neon;
+            c->h264_h_loop_filter_chroma_intra = ff_h264_h_loop_filter_chroma_intra_neon;
+            c->h264_h_loop_filter_chroma_mbaff_intra = ff_h264_h_loop_filter_chroma_mbaff_intra_neon;
+        } else {
+            c->h264_h_loop_filter_chroma = ff_h264_h_loop_filter_chroma422_neon;
+            c->h264_h_loop_filter_chroma_mbaff = ff_h264_h_loop_filter_chroma_neon;
+            c->h264_h_loop_filter_chroma_intra = ff_h264_h_loop_filter_chroma422_intra_neon;
+            c->h264_h_loop_filter_chroma_mbaff_intra = ff_h264_h_loop_filter_chroma_intra_neon;
+        }
 
         c->weight_h264_pixels_tab[0] = ff_weight_h264_pixels_16_neon;
         c->weight_h264_pixels_tab[1] = ff_weight_h264_pixels_8_neon;
diff --git a/libavcodec/aarch64/h264dsp_neon.S b/libavcodec/aarch64/h264dsp_neon.S
index 4ec35f2..fbb8ecc 100644
--- a/libavcodec/aarch64/h264dsp_neon.S
+++ b/libavcodec/aarch64/h264dsp_neon.S
@@ -1,6 +1,7 @@
 /*
  * Copyright (c) 2008 Mans Rullgard <mans@mansr.com>
  * Copyright (c) 2013 Janne Grunau <janne-libav@jannau.net>
+ * Copyright (c) 2014 Janne Grunau <janne-libav@jannau.net>
  *
  * This file is part of FFmpeg.
  *
@@ -27,9 +28,9 @@
         ldr             w6,  [x4]
         ccmp            w3,  #0, #0, ne
         mov             v24.S[0], w6
-        and             w6,  w6,  w6,  lsl #16
+        and             w8,  w6,  w6,  lsl #16
         b.eq            1f
-        ands            w6,  w6,  w6,  lsl #8
+        ands            w8,  w8,  w8,  lsl #8
         b.ge            2f
 1:
         ret
@@ -54,9 +55,12 @@
         uabd            v17.16B, v20.16B, v16.16B       // abs(p2 - p0)
         and             v21.16B, v21.16B, v28.16B
         uabd            v19.16B,  v4.16B,  v0.16B       // abs(q2 - q0)
+        and             v21.16B, v21.16B, v30.16B      // < beta
+        shrn            v30.8b,  v21.8h,  #4
+        mov             x7, v30.d[0]
         cmhi            v17.16B, v22.16B, v17.16B       // < beta
-        and             v21.16B, v21.16B, v30.16B
         cmhi            v19.16B, v22.16B, v19.16B       // < beta
+        cbz             x7,  9f
         and             v17.16B, v17.16B, v21.16B
         and             v19.16B, v19.16B, v21.16B
         and             v24.16B, v24.16B, v21.16B
@@ -124,12 +128,13 @@
         st1             {v16.16B}, [x0], x1
         st1             {v0.16B},  [x0], x1
         st1             {v19.16B}, [x0]
-
+9:
         ret
 endfunc
 
 function ff_h264_h_loop_filter_luma_neon, export=1
         h264_loop_filter_start
+        sxtw            x1,  w1
 
         sub             x0,  x0,  #4
         ld1             {v6.8B},  [x0], x1
@@ -173,32 +178,231 @@
         st1             {v16.S}[3], [x0], x1
         st1             {v0.S}[3],  [x0], x1
         st1             {v19.S}[3], [x0], x1
-
+9:
         ret
 endfunc
 
+
+.macro h264_loop_filter_start_intra
+    orr             w4,  w2,  w3
+    cbnz            w4,  1f
+    ret
+1:
+    sxtw            x1,  w1
+    dup             v30.16b, w2                // alpha
+    dup             v31.16b, w3                // beta
+.endm
+
+.macro h264_loop_filter_luma_intra
+    uabd            v16.16b, v7.16b,  v0.16b        // abs(p0 - q0)
+    uabd            v17.16b, v6.16b,  v7.16b        // abs(p1 - p0)
+    uabd            v18.16b, v1.16b,  v0.16b        // abs(q1 - q0)
+    cmhi            v19.16b, v30.16b, v16.16b       // < alpha
+    cmhi            v17.16b, v31.16b, v17.16b       // < beta
+    cmhi            v18.16b, v31.16b, v18.16b       // < beta
+
+    movi            v29.16b, #2
+    ushr            v30.16b, v30.16b, #2            // alpha >> 2
+    add             v30.16b, v30.16b, v29.16b       // (alpha >> 2) + 2
+    cmhi            v16.16b, v30.16b, v16.16b       // < (alpha >> 2) + 2
+
+    and             v19.16b, v19.16b, v17.16b
+    and             v19.16b, v19.16b, v18.16b
+    shrn            v20.8b,  v19.8h,  #4
+    mov             x4, v20.d[0]
+    cbz             x4, 9f
+
+    ushll           v20.8h,  v6.8b,   #1
+    ushll           v22.8h,  v1.8b,   #1
+    ushll2          v21.8h,  v6.16b,  #1
+    ushll2          v23.8h,  v1.16b,  #1
+    uaddw           v20.8h,  v20.8h,  v7.8b
+    uaddw           v22.8h,  v22.8h,  v0.8b
+    uaddw2          v21.8h,  v21.8h,  v7.16b
+    uaddw2          v23.8h,  v23.8h,  v0.16b
+    uaddw           v20.8h,  v20.8h,  v1.8b
+    uaddw           v22.8h,  v22.8h,  v6.8b
+    uaddw2          v21.8h,  v21.8h,  v1.16b
+    uaddw2          v23.8h,  v23.8h,  v6.16b
+
+    rshrn           v24.8b,  v20.8h,  #2 // p0'_1
+    rshrn           v25.8b,  v22.8h,  #2 // q0'_1
+    rshrn2          v24.16b, v21.8h,  #2 // p0'_1
+    rshrn2          v25.16b, v23.8h,  #2 // q0'_1
+
+    uabd            v17.16b, v5.16b,  v7.16b        // abs(p2 - p0)
+    uabd            v18.16b, v2.16b,  v0.16b        // abs(q2 - q0)
+    cmhi            v17.16b, v31.16b, v17.16b       // < beta
+    cmhi            v18.16b, v31.16b, v18.16b       // < beta
+
+    and             v17.16b, v16.16b, v17.16b  // if_2 && if_3
+    and             v18.16b, v16.16b, v18.16b  // if_2 && if_4
+
+    not             v30.16b, v17.16b
+    not             v31.16b, v18.16b
+
+    and             v30.16b, v30.16b, v19.16b  // if_1 && !(if_2 && if_3)
+    and             v31.16b, v31.16b, v19.16b  // if_1 && !(if_2 && if_4)
+
+    and             v17.16b, v19.16b, v17.16b  // if_1 && if_2 && if_3
+    and             v18.16b, v19.16b, v18.16b  // if_1 && if_2 && if_4
+
+    //calc            p, v7, v6, v5, v4, v17, v7, v6, v5, v4
+    uaddl           v26.8h,  v5.8b,   v7.8b
+    uaddl2          v27.8h,  v5.16b,  v7.16b
+    uaddw           v26.8h,  v26.8h,  v0.8b
+    uaddw2          v27.8h,  v27.8h,  v0.16b
+    add             v20.8h,  v20.8h,  v26.8h
+    add             v21.8h,  v21.8h,  v27.8h
+    uaddw           v20.8h,  v20.8h,  v0.8b
+    uaddw2          v21.8h,  v21.8h,  v0.16b
+    rshrn           v20.8b,  v20.8h,  #3 // p0'_2
+    rshrn2          v20.16b, v21.8h,  #3 // p0'_2
+    uaddw           v26.8h,  v26.8h,  v6.8b
+    uaddw2          v27.8h,  v27.8h,  v6.16b
+    rshrn           v21.8b,  v26.8h,  #2 // p1'_2
+    rshrn2          v21.16b, v27.8h,  #2 // p1'_2
+    uaddl           v28.8h,  v4.8b,   v5.8b
+    uaddl2          v29.8h,  v4.16b,  v5.16b
+    shl             v28.8h,  v28.8h,  #1
+    shl             v29.8h,  v29.8h,  #1
+    add             v28.8h,  v28.8h,  v26.8h
+    add             v29.8h,  v29.8h,  v27.8h
+    rshrn           v19.8b,  v28.8h,  #3 // p2'_2
+    rshrn2          v19.16b, v29.8h,  #3 // p2'_2
+
+    //calc            q, v0, v1, v2, v3, v18, v0, v1, v2, v3
+    uaddl           v26.8h,  v2.8b,   v0.8b
+    uaddl2          v27.8h,  v2.16b,  v0.16b
+    uaddw           v26.8h,  v26.8h,  v7.8b
+    uaddw2          v27.8h,  v27.8h,  v7.16b
+    add             v22.8h,  v22.8h,  v26.8h
+    add             v23.8h,  v23.8h,  v27.8h
+    uaddw           v22.8h,  v22.8h,  v7.8b
+    uaddw2          v23.8h,  v23.8h,  v7.16b
+    rshrn           v22.8b,  v22.8h,  #3 // q0'_2
+    rshrn2          v22.16b, v23.8h,  #3 // q0'_2
+    uaddw           v26.8h,  v26.8h,  v1.8b
+    uaddw2          v27.8h,  v27.8h,  v1.16b
+    rshrn           v23.8b,  v26.8h,  #2 // q1'_2
+    rshrn2          v23.16b, v27.8h,  #2 // q1'_2
+    uaddl           v28.8h,  v2.8b,   v3.8b
+    uaddl2          v29.8h,  v2.16b,  v3.16b
+    shl             v28.8h,  v28.8h,  #1
+    shl             v29.8h,  v29.8h,  #1
+    add             v28.8h,  v28.8h,  v26.8h
+    add             v29.8h,  v29.8h,  v27.8h
+    rshrn           v26.8b,  v28.8h,  #3 // q2'_2
+    rshrn2          v26.16b, v29.8h,  #3 // q2'_2
+
+    bit             v7.16b,  v24.16b, v30.16b  // p0'_1
+    bit             v0.16b,  v25.16b, v31.16b  // q0'_1
+    bit             v7.16b, v20.16b,  v17.16b  // p0'_2
+    bit             v6.16b, v21.16b,  v17.16b  // p1'_2
+    bit             v5.16b, v19.16b,  v17.16b  // p2'_2
+    bit             v0.16b, v22.16b,  v18.16b  // q0'_2
+    bit             v1.16b, v23.16b,  v18.16b  // q1'_2
+    bit             v2.16b, v26.16b,  v18.16b  // q2'_2
+.endm
+
+function ff_h264_v_loop_filter_luma_intra_neon, export=1
+    h264_loop_filter_start_intra
+
+    ld1             {v0.16b},  [x0], x1 // q0
+    ld1             {v1.16b},  [x0], x1 // q1
+    ld1             {v2.16b},  [x0], x1 // q2
+    ld1             {v3.16b},  [x0], x1 // q3
+    sub             x0,  x0,  x1, lsl #3
+    ld1             {v4.16b},  [x0], x1 // p3
+    ld1             {v5.16b},  [x0], x1 // p2
+    ld1             {v6.16b},  [x0], x1 // p1
+    ld1             {v7.16b},  [x0]     // p0
+
+    h264_loop_filter_luma_intra
+
+    sub             x0,  x0,  x1, lsl #1
+    st1             {v5.16b}, [x0], x1  // p2
+    st1             {v6.16b}, [x0], x1  // p1
+    st1             {v7.16b}, [x0], x1  // p0
+    st1             {v0.16b}, [x0], x1  // q0
+    st1             {v1.16b}, [x0], x1  // q1
+    st1             {v2.16b}, [x0]      // q2
+9:
+    ret
+endfunc
+
+function ff_h264_h_loop_filter_luma_intra_neon, export=1
+    h264_loop_filter_start_intra
+
+    sub             x0,  x0,  #4
+    ld1             {v4.8b},  [x0], x1
+    ld1             {v5.8b},  [x0], x1
+    ld1             {v6.8b},  [x0], x1
+    ld1             {v7.8b},  [x0], x1
+    ld1             {v0.8b},  [x0], x1
+    ld1             {v1.8b},  [x0], x1
+    ld1             {v2.8b},  [x0], x1
+    ld1             {v3.8b},  [x0], x1
+    ld1             {v4.d}[1],  [x0], x1
+    ld1             {v5.d}[1],  [x0], x1
+    ld1             {v6.d}[1],  [x0], x1
+    ld1             {v7.d}[1],  [x0], x1
+    ld1             {v0.d}[1],  [x0], x1
+    ld1             {v1.d}[1],  [x0], x1
+    ld1             {v2.d}[1],  [x0], x1
+    ld1             {v3.d}[1],  [x0], x1
+
+    transpose_8x16B v4, v5, v6, v7, v0, v1, v2, v3, v21, v23
+
+    h264_loop_filter_luma_intra
+
+    transpose_8x16B v4, v5, v6, v7, v0, v1, v2, v3, v21, v23
+
+    sub             x0,  x0,  x1, lsl #4
+    st1             {v4.8b},  [x0], x1
+    st1             {v5.8b},  [x0], x1
+    st1             {v6.8b},  [x0], x1
+    st1             {v7.8b},  [x0], x1
+    st1             {v0.8b},  [x0], x1
+    st1             {v1.8b},  [x0], x1
+    st1             {v2.8b},  [x0], x1
+    st1             {v3.8b},  [x0], x1
+    st1             {v4.d}[1],  [x0], x1
+    st1             {v5.d}[1],  [x0], x1
+    st1             {v6.d}[1],  [x0], x1
+    st1             {v7.d}[1],  [x0], x1
+    st1             {v0.d}[1],  [x0], x1
+    st1             {v1.d}[1],  [x0], x1
+    st1             {v2.d}[1],  [x0], x1
+    st1             {v3.d}[1],  [x0], x1
+9:
+    ret
+endfunc
+
 .macro  h264_loop_filter_chroma
         dup             v22.8B, w2              // alpha
+        dup             v23.8B, w3              // beta
         uxtl            v24.8H, v24.8B
         uabd            v26.8B, v16.8B, v0.8B   // abs(p0 - q0)
-        uxtl            v4.8H,  v0.8B
         uabd            v28.8B, v18.8B, v16.8B  // abs(p1 - p0)
-        usubw           v4.8H,  v4.8H,  v16.8B
-        sli             v24.8H, v24.8H, #8
-        shl             v4.8H,  v4.8H,  #2
         uabd            v30.8B, v2.8B,  v0.8B   // abs(q1 - q0)
-        uaddw           v4.8H,  v4.8H,  v18.8B
         cmhi            v26.8B, v22.8B, v26.8B  // < alpha
+        cmhi            v28.8B, v23.8B, v28.8B  // < beta
+        cmhi            v30.8B, v23.8B, v30.8B  // < beta
+        uxtl            v4.8H,  v0.8B
+        and             v26.8B, v26.8B, v28.8B
+        usubw           v4.8H,  v4.8H,  v16.8B
+        and             v26.8B, v26.8B, v30.8B
+        shl             v4.8H,  v4.8H,  #2
+        mov             x8,  v26.d[0]
+        sli             v24.8H, v24.8H, #8
+        uaddw           v4.8H,  v4.8H,  v18.8B
+        cbz             x8,  9f
         usubw           v4.8H,  v4.8H,  v2.8B
-        dup             v22.8B, w3              // beta
         rshrn           v4.8B,  v4.8H,  #3
-        cmhi            v28.8B, v22.8B, v28.8B  // < beta
-        cmhi            v30.8B, v22.8B, v30.8B  // < beta
         smin            v4.8B,  v4.8B,  v24.8B
         neg             v25.8B, v24.8B
-        and             v26.8B, v26.8B, v28.8B
         smax            v4.8B,  v4.8B,  v25.8B
-        and             v26.8B, v26.8B, v30.8B
         uxtl            v22.8H, v0.8B
         and             v4.8B,  v4.8B,  v26.8B
         uxtl            v28.8H, v16.8B
@@ -210,6 +414,7 @@
 
 function ff_h264_v_loop_filter_chroma_neon, export=1
         h264_loop_filter_start
+        sxtw            x1,  w1
 
         sub             x0,  x0,  x1, lsl #1
         ld1             {v18.8B}, [x0], x1
@@ -222,14 +427,16 @@
         sub             x0,  x0,  x1, lsl #1
         st1             {v16.8B}, [x0], x1
         st1             {v0.8B},  [x0], x1
-
+9:
         ret
 endfunc
 
 function ff_h264_h_loop_filter_chroma_neon, export=1
         h264_loop_filter_start
+        sxtw            x1,  w1
 
         sub             x0,  x0,  #2
+h_loop_filter_chroma420:
         ld1             {v18.S}[0], [x0], x1
         ld1             {v16.S}[0], [x0], x1
         ld1             {v0.S}[0],  [x0], x1
@@ -254,10 +461,134 @@
         st1             {v16.S}[1], [x0], x1
         st1             {v0.S}[1],  [x0], x1
         st1             {v2.S}[1],  [x0], x1
-
+9:
         ret
 endfunc
 
+function ff_h264_h_loop_filter_chroma422_neon, export=1
+        sxtw            x1,  w1
+        h264_loop_filter_start
+        add             x5,  x0,  x1
+        sub             x0,  x0,  #2
+        add             x1,  x1,  x1
+        mov             x7,  x30
+        bl              h_loop_filter_chroma420
+        mov             x30, x7
+        sub             x0,  x5,  #2
+        mov             v24.s[0], w6
+        b               h_loop_filter_chroma420
+endfunc
+
+.macro h264_loop_filter_chroma_intra
+    uabd            v26.8b, v16.8b, v17.8b  // abs(p0 - q0)
+    uabd            v27.8b, v18.8b, v16.8b  // abs(p1 - p0)
+    uabd            v28.8b, v19.8b, v17.8b  // abs(q1 - q0)
+    cmhi            v26.8b, v30.8b, v26.8b  // < alpha
+    cmhi            v27.8b, v31.8b, v27.8b  // < beta
+    cmhi            v28.8b, v31.8b, v28.8b  // < beta
+    and             v26.8b, v26.8b, v27.8b
+    and             v26.8b, v26.8b, v28.8b
+    mov             x2, v26.d[0]
+
+    ushll           v4.8h,   v18.8b,  #1
+    ushll           v6.8h,   v19.8b,  #1
+    cbz             x2, 9f
+    uaddl           v20.8h,  v16.8b,  v19.8b
+    uaddl           v22.8h,  v17.8b,  v18.8b
+    add             v20.8h,  v20.8h,  v4.8h
+    add             v22.8h,  v22.8h,  v6.8h
+    uqrshrn         v24.8b,  v20.8h,  #2
+    uqrshrn         v25.8b,  v22.8h,  #2
+    bit             v16.8b, v24.8b, v26.8b
+    bit             v17.8b, v25.8b, v26.8b
+.endm
+
+function ff_h264_v_loop_filter_chroma_intra_neon, export=1
+    h264_loop_filter_start_intra
+
+    sub             x0,  x0,  x1, lsl #1
+    ld1             {v18.8b}, [x0], x1
+    ld1             {v16.8b}, [x0], x1
+    ld1             {v17.8b}, [x0], x1
+    ld1             {v19.8b}, [x0]
+
+    h264_loop_filter_chroma_intra
+
+    sub             x0,  x0,  x1, lsl #1
+    st1             {v16.8b}, [x0], x1
+    st1             {v17.8b}, [x0], x1
+
+9:
+    ret
+endfunc
+
+function ff_h264_h_loop_filter_chroma_mbaff_intra_neon, export=1
+    h264_loop_filter_start_intra
+
+    sub             x4,  x0,  #2
+    sub             x0,  x0,  #1
+    ld1             {v18.8b}, [x4], x1
+    ld1             {v16.8b}, [x4], x1
+    ld1             {v17.8b}, [x4], x1
+    ld1             {v19.8b}, [x4], x1
+
+    transpose_4x8B v18, v16, v17, v19, v26, v27, v28, v29
+
+    h264_loop_filter_chroma_intra
+
+    st2             {v16.b,v17.b}[0], [x0], x1
+    st2             {v16.b,v17.b}[1], [x0], x1
+    st2             {v16.b,v17.b}[2], [x0], x1
+    st2             {v16.b,v17.b}[3], [x0], x1
+
+9:
+    ret
+endfunc
+
+function ff_h264_h_loop_filter_chroma_intra_neon, export=1
+    h264_loop_filter_start_intra
+
+    sub             x4,  x0,  #2
+    sub             x0,  x0,  #1
+h_loop_filter_chroma420_intra:
+    ld1             {v18.8b}, [x4], x1
+    ld1             {v16.8b}, [x4], x1
+    ld1             {v17.8b}, [x4], x1
+    ld1             {v19.8b}, [x4], x1
+    ld1             {v18.s}[1], [x4], x1
+    ld1             {v16.s}[1], [x4], x1
+    ld1             {v17.s}[1], [x4], x1
+    ld1             {v19.s}[1], [x4], x1
+
+    transpose_4x8B v18, v16, v17, v19, v26, v27, v28, v29
+
+    h264_loop_filter_chroma_intra
+
+    st2             {v16.b,v17.b}[0], [x0], x1
+    st2             {v16.b,v17.b}[1], [x0], x1
+    st2             {v16.b,v17.b}[2], [x0], x1
+    st2             {v16.b,v17.b}[3], [x0], x1
+    st2             {v16.b,v17.b}[4], [x0], x1
+    st2             {v16.b,v17.b}[5], [x0], x1
+    st2             {v16.b,v17.b}[6], [x0], x1
+    st2             {v16.b,v17.b}[7], [x0], x1
+
+9:
+    ret
+endfunc
+
+function ff_h264_h_loop_filter_chroma422_intra_neon, export=1
+    h264_loop_filter_start_intra
+    sub             x4,  x0,  #2
+    add             x5,  x0,  x1, lsl #3
+    sub             x0,  x0,  #1
+    mov             x7,  x30
+    bl              h_loop_filter_chroma420_intra
+    sub             x0,  x5,  #1
+    mov             x30, x7
+    b               h_loop_filter_chroma420_intra
+endfunc
+
 .macro  biweight_16     macs, macd
         dup             v0.16B,  w5
         dup             v1.16B,  w6
diff --git a/libavcodec/aarch64/h264idct_neon.S b/libavcodec/aarch64/h264idct_neon.S
index 825ec49..7de4420 100644
--- a/libavcodec/aarch64/h264idct_neon.S
+++ b/libavcodec/aarch64/h264idct_neon.S
@@ -23,6 +23,7 @@
 #include "neon.S"
 
 function ff_h264_idct_add_neon, export=1
+.L_ff_h264_idct_add_neon:
         ld1             {v0.4H, v1.4H, v2.4H, v3.4H},  [x1]
         sxtw            x2,     w2
         movi            v30.8H, #0
@@ -77,6 +78,7 @@
 endfunc
 
 function ff_h264_idct_dc_add_neon, export=1
+.L_ff_h264_idct_dc_add_neon:
         sxtw            x2,  w2
         mov             w3,       #0
         ld1r            {v2.8H},  [x1]
@@ -106,8 +108,8 @@
         mov             w9,  w3         // stride
         movrel          x7,  scan8
         mov             x10, #16
-        movrel          x13, X(ff_h264_idct_dc_add_neon)
-        movrel          x14, X(ff_h264_idct_add_neon)
+        movrel          x13, .L_ff_h264_idct_dc_add_neon
+        movrel          x14, .L_ff_h264_idct_add_neon
 1:      mov             w2,  w9
         ldrb            w3,  [x7], #1
         ldrsw           x0,  [x5], #4
@@ -133,8 +135,8 @@
         mov             w9,  w3         // stride
         movrel          x7,  scan8
         mov             x10, #16
-        movrel          x13, X(ff_h264_idct_dc_add_neon)
-        movrel          x14, X(ff_h264_idct_add_neon)
+        movrel          x13, .L_ff_h264_idct_dc_add_neon
+        movrel          x14, .L_ff_h264_idct_add_neon
 1:      mov             w2,  w9
         ldrb            w3,  [x7], #1
         ldrsw           x0,  [x5], #4
@@ -160,8 +162,8 @@
         add             x5,  x1,  #16*4         // block_offset
         add             x9,  x2,  #16*32        // block
         mov             w19, w3                 // stride
-        movrel          x13, X(ff_h264_idct_dc_add_neon)
-        movrel          x14, X(ff_h264_idct_add_neon)
+        movrel          x13, .L_ff_h264_idct_dc_add_neon
+        movrel          x14, .L_ff_h264_idct_add_neon
         movrel          x7,  scan8, 16
         mov             x10, #0
         mov             x11, #16
@@ -263,6 +265,7 @@
 .endm
 
 function ff_h264_idct8_add_neon, export=1
+.L_ff_h264_idct8_add_neon:
         movi            v19.8H,   #0
         sxtw            x2,       w2
         ld1             {v24.8H, v25.8H}, [x1]
@@ -326,6 +329,7 @@
 endfunc
 
 function ff_h264_idct8_dc_add_neon, export=1
+.L_ff_h264_idct8_dc_add_neon:
         mov             w3,       #0
         sxtw            x2,       w2
         ld1r            {v31.8H}, [x1]
@@ -375,8 +379,8 @@
         mov             w2,  w3
         movrel          x7,  scan8
         mov             w10, #16
-        movrel          x13, X(ff_h264_idct8_dc_add_neon)
-        movrel          x14, X(ff_h264_idct8_add_neon)
+        movrel          x13, .L_ff_h264_idct8_dc_add_neon
+        movrel          x14, .L_ff_h264_idct8_add_neon
 1:      ldrb            w9,  [x7], #4
         ldrsw           x0,  [x5], #16
         ldrb            w9,  [x4, w9, UXTW]
diff --git a/libavcodec/aarch64/idctdsp_init_aarch64.c b/libavcodec/aarch64/idctdsp_init_aarch64.c
index 0406e60..742a337 100644
--- a/libavcodec/aarch64/idctdsp_init_aarch64.c
+++ b/libavcodec/aarch64/idctdsp_init_aarch64.c
@@ -21,6 +21,8 @@
  */
 
 #include "libavutil/attributes.h"
+#include "libavutil/cpu.h"
+#include "libavutil/arm/cpu.h"
 #include "libavcodec/avcodec.h"
 #include "libavcodec/idctdsp.h"
 #include "idct.h"
@@ -28,7 +30,9 @@
 av_cold void ff_idctdsp_init_aarch64(IDCTDSPContext *c, AVCodecContext *avctx,
                                      unsigned high_bit_depth)
 {
-    if (!avctx->lowres && !high_bit_depth) {
+    int cpu_flags = av_get_cpu_flags();
+
+    if (have_neon(cpu_flags) && !avctx->lowres && !high_bit_depth) {
         if (avctx->idct_algo == FF_IDCT_AUTO ||
             avctx->idct_algo == FF_IDCT_SIMPLEAUTO ||
             avctx->idct_algo == FF_IDCT_SIMPLENEON) {
diff --git a/libavdevice/libndi_newtek_common.h b/libavcodec/aarch64/opusdsp_init.c
similarity index 61%
copy from libavdevice/libndi_newtek_common.h
copy to libavcodec/aarch64/opusdsp_init.c
index 8990317..cc6a1b6 100644
--- a/libavdevice/libndi_newtek_common.h
+++ b/libavcodec/aarch64/opusdsp_init.c
@@ -1,7 +1,4 @@
 /*
- * NewTek NDI common code
- * Copyright (c) 2017 Maksym Veremeyenko
- *
  * This file is part of FFmpeg.
  *
  * FFmpeg is free software; you can redistribute it and/or
@@ -19,12 +16,20 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
-#ifndef AVDEVICE_LIBNDI_NEWTEK_COMMON_H
-#define AVDEVICE_LIBNDI_NEWTEK_COMMON_H
+#include "config.h"
 
-#include <Processing.NDI.Lib.h>
+#include "libavutil/aarch64/cpu.h"
+#include "libavcodec/opusdsp.h"
 
-#define NDI_TIME_BASE 10000000
-#define NDI_TIME_BASE_Q (AVRational){1, NDI_TIME_BASE}
+void ff_opus_postfilter_neon(float *data, int period, float *gains, int len);
+float ff_opus_deemphasis_neon(float *out, float *in, float coeff, int len);
 
-#endif
+av_cold void ff_opus_dsp_init_aarch64(OpusDSP *ctx)
+{
+    int cpu_flags = av_get_cpu_flags();
+
+    if (have_neon(cpu_flags)) {
+        ctx->postfilter = ff_opus_postfilter_neon;
+        ctx->deemphasis = ff_opus_deemphasis_neon;
+    }
+}
diff --git a/libavcodec/aarch64/opusdsp_neon.S b/libavcodec/aarch64/opusdsp_neon.S
new file mode 100644
index 0000000..46c2be0
--- /dev/null
+++ b/libavcodec/aarch64/opusdsp_neon.S
@@ -0,0 +1,113 @@
+/*
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "libavutil/aarch64/asm.S"
+
+           // 0.85..^1    0.85..^2    0.85..^3    0.85..^4
+const tab_st, align=4
+        .word 0x3f599a00, 0x3f38f671, 0x3f1d382a, 0x3f05a32f
+endconst
+const tab_x0, align=4
+        .word 0x0,        0x3f599a00, 0x3f38f671, 0x3f1d382a
+endconst
+const tab_x1, align=4
+        .word 0x0,        0x0,        0x3f599a00, 0x3f38f671
+endconst
+const tab_x2, align=4
+        .word 0x0,        0x0,        0x0,        0x3f599a00
+endconst
+
+function ff_opus_deemphasis_neon, export=1
+        movrel  x4, tab_st
+        ld1    {v4.4s}, [x4]
+        movrel  x4, tab_x0
+        ld1    {v5.4s}, [x4]
+        movrel  x4, tab_x1
+        ld1    {v6.4s}, [x4]
+        movrel  x4, tab_x2
+        ld1    {v7.4s}, [x4]
+
+        fmul v0.4s, v4.4s, v0.s[0]
+
+1:      ld1  {v1.4s, v2.4s}, [x1], #32
+
+        fmla v0.4s, v5.4s, v1.s[0]
+        fmul v3.4s, v7.4s, v2.s[2]
+
+        fmla v0.4s, v6.4s, v1.s[1]
+        fmla v3.4s, v6.4s, v2.s[1]
+
+        fmla v0.4s, v7.4s, v1.s[2]
+        fmla v3.4s, v5.4s, v2.s[0]
+
+        fadd v1.4s, v1.4s, v0.4s
+        fadd v2.4s, v2.4s, v3.4s
+
+        fmla v2.4s, v4.4s, v1.s[3]
+
+        st1  {v1.4s, v2.4s}, [x0], #32
+        fmul v0.4s, v4.4s, v2.s[3]
+
+        subs w2, w2, #8
+        b.gt 1b
+
+        mov s0, v2.s[3]
+
+        ret
+endfunc
+
+function ff_opus_postfilter_neon, export=1
+        ld1 {v0.4s}, [x2]
+        dup v1.4s, v0.s[1]
+        dup v2.4s, v0.s[2]
+        dup v0.4s, v0.s[0]
+
+        add w1, w1, #2
+        sub x1, x0, x1, lsl #2
+
+        ld1 {v3.4s}, [x1]
+        fmul v3.4s, v3.4s, v2.4s
+
+1:      add x1, x1, #4
+        ld1 {v4.4s}, [x1]
+        add x1, x1, #4
+        ld1 {v5.4s}, [x1]
+        add x1, x1, #4
+        ld1 {v6.4s}, [x1]
+        add x1, x1, #4
+        ld1 {v7.4s}, [x1]
+
+        fmla v3.4s, v7.4s, v2.4s
+        fadd v6.4s, v6.4s, v4.4s
+
+        ld1 {v4.4s}, [x0]
+        fmla v4.4s, v5.4s, v0.4s
+
+        fmul v6.4s, v6.4s, v1.4s
+        fadd v6.4s, v6.4s, v3.4s
+
+        fadd v4.4s, v4.4s, v6.4s
+        fmul v3.4s, v7.4s, v2.4s
+
+        st1  {v4.4s}, [x0], #16
+
+        subs w3, w3, #4
+        b.gt 1b
+
+        ret
+endfunc
diff --git a/libavcodec/aarch64/vp8dsp.h b/libavcodec/aarch64/vp8dsp.h
new file mode 100644
index 0000000..871fed7
--- /dev/null
+++ b/libavcodec/aarch64/vp8dsp.h
@@ -0,0 +1,75 @@
+/*
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVCODEC_AARCH64_VP8DSP_H
+#define AVCODEC_AARCH64_VP8DSP_H
+
+#include "libavcodec/vp8dsp.h"
+
+#define VP8_LF_Y(hv, inner, opt)                                             \
+    void ff_vp8_##hv##_loop_filter16##inner##_##opt(uint8_t *dst,            \
+                                                    ptrdiff_t stride,        \
+                                                    int flim_E, int flim_I,  \
+                                                    int hev_thresh)
+
+#define VP8_LF_UV(hv, inner, opt)                                            \
+    void ff_vp8_##hv##_loop_filter8uv##inner##_##opt(uint8_t *dstU,          \
+                                                     uint8_t *dstV,          \
+                                                     ptrdiff_t stride,       \
+                                                     int flim_E, int flim_I, \
+                                                     int hev_thresh)
+
+#define VP8_LF_SIMPLE(hv, opt)                                          \
+    void ff_vp8_##hv##_loop_filter16_simple_##opt(uint8_t *dst,         \
+                                                  ptrdiff_t stride,     \
+                                                  int flim)
+
+#define VP8_LF_HV(inner, opt)                   \
+    VP8_LF_Y(h,  inner, opt);                   \
+    VP8_LF_Y(v,  inner, opt);                   \
+    VP8_LF_UV(h, inner, opt);                   \
+    VP8_LF_UV(v, inner, opt)
+
+#define VP8_LF(opt)                             \
+    VP8_LF_HV(,       opt);                     \
+    VP8_LF_HV(_inner, opt);                     \
+    VP8_LF_SIMPLE(h, opt);                      \
+    VP8_LF_SIMPLE(v, opt)
+
+#define VP8_MC(n, opt)                                                  \
+    void ff_put_vp8_##n##_##opt(uint8_t *dst, ptrdiff_t dststride,      \
+                                uint8_t *src, ptrdiff_t srcstride,      \
+                                int h, int x, int y)
+
+#define VP8_EPEL(w, opt)                        \
+    VP8_MC(pixels ## w, opt);                   \
+    VP8_MC(epel ## w ## _h4, opt);              \
+    VP8_MC(epel ## w ## _h6, opt);              \
+    VP8_MC(epel ## w ## _v4, opt);              \
+    VP8_MC(epel ## w ## _h4v4, opt);            \
+    VP8_MC(epel ## w ## _h6v4, opt);            \
+    VP8_MC(epel ## w ## _v6, opt);              \
+    VP8_MC(epel ## w ## _h4v6, opt);            \
+    VP8_MC(epel ## w ## _h6v6, opt)
+
+#define VP8_BILIN(w, opt)                       \
+    VP8_MC(bilin ## w ## _h, opt);              \
+    VP8_MC(bilin ## w ## _v, opt);              \
+    VP8_MC(bilin ## w ## _hv, opt)
+
+#endif /* AVCODEC_AARCH64_VP8DSP_H */
diff --git a/libavcodec/aarch64/vp8dsp_init_aarch64.c b/libavcodec/aarch64/vp8dsp_init_aarch64.c
new file mode 100644
index 0000000..fc7e831
--- /dev/null
+++ b/libavcodec/aarch64/vp8dsp_init_aarch64.c
@@ -0,0 +1,124 @@
+/*
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include <stdint.h>
+
+#include "libavutil/attributes.h"
+#include "libavutil/aarch64/cpu.h"
+#include "libavcodec/vp8dsp.h"
+#include "vp8dsp.h"
+
+void ff_vp8_luma_dc_wht_neon(int16_t block[4][4][16], int16_t dc[16]);
+
+void ff_vp8_idct_add_neon(uint8_t *dst, int16_t block[16], ptrdiff_t stride);
+void ff_vp8_idct_dc_add_neon(uint8_t *dst, int16_t block[16], ptrdiff_t stride);
+void ff_vp8_idct_dc_add4y_neon(uint8_t *dst, int16_t block[4][16], ptrdiff_t stride);
+void ff_vp8_idct_dc_add4uv_neon(uint8_t *dst, int16_t block[4][16], ptrdiff_t stride);
+
+VP8_LF(neon);
+
+VP8_EPEL(16, neon);
+VP8_EPEL(8,  neon);
+VP8_EPEL(4,  neon);
+
+VP8_BILIN(16, neon);
+VP8_BILIN(8,  neon);
+VP8_BILIN(4,  neon);
+
+av_cold void ff_vp78dsp_init_aarch64(VP8DSPContext *dsp)
+{
+    if (!have_neon(av_get_cpu_flags()))
+        return;
+    dsp->put_vp8_epel_pixels_tab[0][0][0] = ff_put_vp8_pixels16_neon;
+    dsp->put_vp8_epel_pixels_tab[0][0][2] = ff_put_vp8_epel16_h6_neon;
+    dsp->put_vp8_epel_pixels_tab[0][2][0] = ff_put_vp8_epel16_v6_neon;
+    dsp->put_vp8_epel_pixels_tab[0][2][2] = ff_put_vp8_epel16_h6v6_neon;
+
+    dsp->put_vp8_epel_pixels_tab[1][0][0] = ff_put_vp8_pixels8_neon;
+    dsp->put_vp8_epel_pixels_tab[1][0][1] = ff_put_vp8_epel8_h4_neon;
+    dsp->put_vp8_epel_pixels_tab[1][0][2] = ff_put_vp8_epel8_h6_neon;
+    dsp->put_vp8_epel_pixels_tab[1][1][0] = ff_put_vp8_epel8_v4_neon;
+    dsp->put_vp8_epel_pixels_tab[1][1][1] = ff_put_vp8_epel8_h4v4_neon;
+    dsp->put_vp8_epel_pixels_tab[1][1][2] = ff_put_vp8_epel8_h6v4_neon;
+    dsp->put_vp8_epel_pixels_tab[1][2][0] = ff_put_vp8_epel8_v6_neon;
+    dsp->put_vp8_epel_pixels_tab[1][2][1] = ff_put_vp8_epel8_h4v6_neon;
+    dsp->put_vp8_epel_pixels_tab[1][2][2] = ff_put_vp8_epel8_h6v6_neon;
+
+    dsp->put_vp8_epel_pixels_tab[2][0][1] = ff_put_vp8_epel4_h4_neon;
+    dsp->put_vp8_epel_pixels_tab[2][0][2] = ff_put_vp8_epel4_h6_neon;
+    dsp->put_vp8_epel_pixels_tab[2][1][0] = ff_put_vp8_epel4_v4_neon;
+    dsp->put_vp8_epel_pixels_tab[2][1][1] = ff_put_vp8_epel4_h4v4_neon;
+    dsp->put_vp8_epel_pixels_tab[2][1][2] = ff_put_vp8_epel4_h6v4_neon;
+    dsp->put_vp8_epel_pixels_tab[2][2][0] = ff_put_vp8_epel4_v6_neon;
+    dsp->put_vp8_epel_pixels_tab[2][2][1] = ff_put_vp8_epel4_h4v6_neon;
+    dsp->put_vp8_epel_pixels_tab[2][2][2] = ff_put_vp8_epel4_h6v6_neon;
+
+    dsp->put_vp8_bilinear_pixels_tab[0][0][0] = ff_put_vp8_pixels16_neon;
+    dsp->put_vp8_bilinear_pixels_tab[0][0][1] = ff_put_vp8_bilin16_h_neon;
+    dsp->put_vp8_bilinear_pixels_tab[0][0][2] = ff_put_vp8_bilin16_h_neon;
+    dsp->put_vp8_bilinear_pixels_tab[0][1][0] = ff_put_vp8_bilin16_v_neon;
+    dsp->put_vp8_bilinear_pixels_tab[0][1][1] = ff_put_vp8_bilin16_hv_neon;
+    dsp->put_vp8_bilinear_pixels_tab[0][1][2] = ff_put_vp8_bilin16_hv_neon;
+    dsp->put_vp8_bilinear_pixels_tab[0][2][0] = ff_put_vp8_bilin16_v_neon;
+    dsp->put_vp8_bilinear_pixels_tab[0][2][1] = ff_put_vp8_bilin16_hv_neon;
+    dsp->put_vp8_bilinear_pixels_tab[0][2][2] = ff_put_vp8_bilin16_hv_neon;
+
+    dsp->put_vp8_bilinear_pixels_tab[1][0][0] = ff_put_vp8_pixels8_neon;
+    dsp->put_vp8_bilinear_pixels_tab[1][0][1] = ff_put_vp8_bilin8_h_neon;
+    dsp->put_vp8_bilinear_pixels_tab[1][0][2] = ff_put_vp8_bilin8_h_neon;
+    dsp->put_vp8_bilinear_pixels_tab[1][1][0] = ff_put_vp8_bilin8_v_neon;
+    dsp->put_vp8_bilinear_pixels_tab[1][1][1] = ff_put_vp8_bilin8_hv_neon;
+    dsp->put_vp8_bilinear_pixels_tab[1][1][2] = ff_put_vp8_bilin8_hv_neon;
+    dsp->put_vp8_bilinear_pixels_tab[1][2][0] = ff_put_vp8_bilin8_v_neon;
+    dsp->put_vp8_bilinear_pixels_tab[1][2][1] = ff_put_vp8_bilin8_hv_neon;
+    dsp->put_vp8_bilinear_pixels_tab[1][2][2] = ff_put_vp8_bilin8_hv_neon;
+
+    dsp->put_vp8_bilinear_pixels_tab[2][0][1] = ff_put_vp8_bilin4_h_neon;
+    dsp->put_vp8_bilinear_pixels_tab[2][0][2] = ff_put_vp8_bilin4_h_neon;
+    dsp->put_vp8_bilinear_pixels_tab[2][1][0] = ff_put_vp8_bilin4_v_neon;
+    dsp->put_vp8_bilinear_pixels_tab[2][1][1] = ff_put_vp8_bilin4_hv_neon;
+    dsp->put_vp8_bilinear_pixels_tab[2][1][2] = ff_put_vp8_bilin4_hv_neon;
+    dsp->put_vp8_bilinear_pixels_tab[2][2][0] = ff_put_vp8_bilin4_v_neon;
+    dsp->put_vp8_bilinear_pixels_tab[2][2][1] = ff_put_vp8_bilin4_hv_neon;
+    dsp->put_vp8_bilinear_pixels_tab[2][2][2] = ff_put_vp8_bilin4_hv_neon;
+}
+
+av_cold void ff_vp8dsp_init_aarch64(VP8DSPContext *dsp)
+{
+    if (!have_neon(av_get_cpu_flags()))
+        return;
+    dsp->vp8_luma_dc_wht    = ff_vp8_luma_dc_wht_neon;
+
+    dsp->vp8_idct_add       = ff_vp8_idct_add_neon;
+    dsp->vp8_idct_dc_add    = ff_vp8_idct_dc_add_neon;
+    dsp->vp8_idct_dc_add4y  = ff_vp8_idct_dc_add4y_neon;
+    dsp->vp8_idct_dc_add4uv = ff_vp8_idct_dc_add4uv_neon;
+
+    dsp->vp8_v_loop_filter16y = ff_vp8_v_loop_filter16_neon;
+    dsp->vp8_h_loop_filter16y = ff_vp8_h_loop_filter16_neon;
+    dsp->vp8_v_loop_filter8uv = ff_vp8_v_loop_filter8uv_neon;
+    dsp->vp8_h_loop_filter8uv = ff_vp8_h_loop_filter8uv_neon;
+
+    dsp->vp8_v_loop_filter16y_inner = ff_vp8_v_loop_filter16_inner_neon;
+    dsp->vp8_h_loop_filter16y_inner = ff_vp8_h_loop_filter16_inner_neon;
+    dsp->vp8_v_loop_filter8uv_inner = ff_vp8_v_loop_filter8uv_inner_neon;
+    dsp->vp8_h_loop_filter8uv_inner = ff_vp8_h_loop_filter8uv_inner_neon;
+
+    dsp->vp8_v_loop_filter_simple = ff_vp8_v_loop_filter16_simple_neon;
+    dsp->vp8_h_loop_filter_simple = ff_vp8_h_loop_filter16_simple_neon;
+}
diff --git a/libavcodec/aarch64/vp8dsp_neon.S b/libavcodec/aarch64/vp8dsp_neon.S
new file mode 100644
index 0000000..4bbf16d
--- /dev/null
+++ b/libavcodec/aarch64/vp8dsp_neon.S
@@ -0,0 +1,1790 @@
+/*
+ * VP8 NEON optimisations
+ *
+ * Copyright (c) 2010 Rob Clark <rob@ti.com>
+ * Copyright (c) 2011 Mans Rullgard <mans@mansr.com>
+ * Copyright (c) 2018 Magnus Röös <mla2.roos@gmail.com>
+ * Copyright (c) 2019 Martin Storsjo <martin@martin.st>
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "libavutil/aarch64/asm.S"
+#include "neon.S"
+
+function ff_vp8_luma_dc_wht_neon, export=1
+        ld1             {v0.4h - v3.4h}, [x1]
+        movi            v30.8h, #0
+
+        add             v4.4h,  v0.4h,  v3.4h
+        add             v6.4h,  v1.4h,  v2.4h
+        st1             {v30.8h}, [x1], #16
+        sub             v7.4h,  v1.4h,  v2.4h
+        sub             v5.4h,  v0.4h,  v3.4h
+        st1             {v30.8h}, [x1]
+        add             v0.4h,  v4.4h,  v6.4h
+        add             v1.4h,  v5.4h,  v7.4h
+        sub             v2.4h,  v4.4h,  v6.4h
+        sub             v3.4h,  v5.4h,  v7.4h
+
+        movi            v16.4h, #3
+
+        transpose_4x4H  v0, v1, v2, v3, v4, v5, v6, v7
+
+        add             v0.4h,  v0.4h,  v16.4h
+
+        add             v4.4h,  v0.4h,  v3.4h
+        add             v6.4h,  v1.4h,  v2.4h
+        sub             v7.4h,  v1.4h,  v2.4h
+        sub             v5.4h,  v0.4h,  v3.4h
+        add             v0.4h,  v4.4h,  v6.4h
+        add             v1.4h,  v5.4h,  v7.4h
+        sub             v2.4h,  v4.4h,  v6.4h
+        sub             v3.4h,  v5.4h,  v7.4h
+
+        sshr            v0.4h,  v0.4h,  #3
+        sshr            v1.4h,  v1.4h,  #3
+        sshr            v2.4h,  v2.4h,  #3
+        sshr            v3.4h,  v3.4h,  #3
+
+        mov             x3,  #32
+        st1             {v0.h}[0],  [x0], x3
+        st1             {v1.h}[0],  [x0], x3
+        st1             {v2.h}[0],  [x0], x3
+        st1             {v3.h}[0],  [x0], x3
+        st1             {v0.h}[1],  [x0], x3
+        st1             {v1.h}[1],  [x0], x3
+        st1             {v2.h}[1],  [x0], x3
+        st1             {v3.h}[1],  [x0], x3
+        st1             {v0.h}[2],  [x0], x3
+        st1             {v1.h}[2],  [x0], x3
+        st1             {v2.h}[2],  [x0], x3
+        st1             {v3.h}[2],  [x0], x3
+        st1             {v0.h}[3],  [x0], x3
+        st1             {v1.h}[3],  [x0], x3
+        st1             {v2.h}[3],  [x0], x3
+        st1             {v3.h}[3],  [x0], x3
+
+        ret
+endfunc
+
+function ff_vp8_idct_add_neon, export=1
+        ld1             {v0.8b - v3.8b},  [x1]
+        mov             w4,  #20091
+        movk            w4,  #35468/2, lsl #16
+        dup             v4.2s, w4
+
+        smull           v26.4s, v1.4h,  v4.h[0]
+        smull           v27.4s, v3.4h,  v4.h[0]
+        sqdmulh         v20.4h, v1.4h,  v4.h[1]
+        sqdmulh         v23.4h, v3.4h,  v4.h[1]
+        shrn            v21.4h, v26.4s, #16
+        shrn            v22.4h, v27.4s, #16
+        add             v21.4h, v21.4h, v1.4h
+        add             v22.4h, v22.4h, v3.4h
+
+        add             v16.4h,  v0.4h,   v2.4h
+        sub             v17.4h,  v0.4h,   v2.4h
+
+        add             v18.4h,  v21.4h,  v23.4h
+        sub             v19.4h,  v20.4h,  v22.4h
+
+        add             v0.4h,   v16.4h,  v18.4h
+        add             v1.4h,   v17.4h,  v19.4h
+        sub             v3.4h,   v16.4h,  v18.4h
+        sub             v2.4h,   v17.4h,  v19.4h
+
+        transpose_4x4H  v0, v1, v2, v3, v24, v5, v6, v7
+
+        movi            v29.8h, #0
+        smull           v26.4s,     v1.4h,  v4.h[0]
+        st1             {v29.8h},   [x1],   #16
+        smull           v27.4s,     v3.4h,  v4.h[0]
+        st1             {v29.16b},  [x1]
+        sqdmulh         v21.4h,     v1.4h,  v4.h[1]
+        sqdmulh         v23.4h,     v3.4h,  v4.h[1]
+        shrn            v20.4h,     v26.4s, #16
+        shrn            v22.4h,     v27.4s, #16
+        add             v20.4h,     v20.4h, v1.4h
+        add             v22.4h,     v22.4h, v3.4h
+        add             v16.4h,     v0.4h,  v2.4h
+        sub             v17.4h,     v0.4h,  v2.4h
+
+        add             v18.4h,     v20.4h, v23.4h
+        ld1             {v24.s}[0], [x0],   x2
+        sub             v19.4h, v21.4h, v22.4h
+        ld1             {v25.s}[0], [x0],   x2
+        add             v0.4h,      v16.4h, v18.4h
+        add             v1.4h,      v17.4h, v19.4h
+        ld1             {v26.s}[0], [x0],   x2
+        sub             v3.4h,      v16.4h, v18.4h
+        sub             v2.4h,      v17.4h, v19.4h
+        ld1             {v27.s}[0], [x0],   x2
+        srshr           v0.4h,      v0.4h,  #3
+        srshr           v1.4h,      v1.4h,  #3
+        srshr           v2.4h,      v2.4h,  #3
+        srshr           v3.4h,      v3.4h,  #3
+
+        sub             x0,  x0,  x2,  lsl #2
+
+        transpose_4x4H  v0, v1, v2, v3, v5, v6, v7, v16
+
+        uaddw           v0.8h,  v0.8h, v24.8b
+        uaddw           v1.8h,  v1.8h, v25.8b
+        uaddw           v2.8h,  v2.8h, v26.8b
+        uaddw           v3.8h,  v3.8h, v27.8b
+        sqxtun          v0.8b,  v0.8h
+        sqxtun          v1.8b,  v1.8h
+        sqxtun          v2.8b,  v2.8h
+        sqxtun          v3.8b,  v3.8h
+
+        st1             {v0.s}[0],  [x0], x2
+        st1             {v1.s}[0],  [x0], x2
+        st1             {v2.s}[0],  [x0], x2
+        st1             {v3.s}[0],  [x0], x2
+
+        ret
+endfunc
+
+function ff_vp8_idct_dc_add4uv_neon, export=1
+        movi            v0.4h,  #0
+        mov             x3,     #32
+        ld1r            {v16.4h},  [x1]
+        st1             {v0.h}[0], [x1], x3
+        ld1r            {v17.4h},  [x1]
+        st1             {v0.h}[0], [x1], x3
+        ld1r            {v18.4h},  [x1]
+        st1             {v0.h}[0], [x1], x3
+        ld1r            {v19.4h},  [x1]
+        st1             {v0.h}[0], [x1], x3
+        ins             v16.d[1],  v17.d[0]
+        ins             v18.d[1],  v19.d[0]
+        mov             x3,  x0
+        srshr           v16.8h,    v16.8h,  #3            // dc >>= 3
+        ld1             {v0.8b},   [x0], x2
+        srshr           v18.8h,    v18.8h,  #3
+        ld1             {v1.8b},   [x0], x2
+        uaddw           v20.8h,    v16.8h, v0.8b
+        ld1             {v2.8b},   [x0], x2
+        uaddw           v0.8h,     v16.8h, v1.8b
+        ld1             {v3.8b},   [x0], x2
+        uaddw           v22.8h,    v16.8h, v2.8b
+        ld1             {v4.8b},   [x0], x2
+        uaddw           v2.8h,     v16.8h, v3.8b
+        ld1             {v5.8b},   [x0], x2
+        uaddw           v24.8h,    v18.8h, v4.8b
+        ld1             {v6.8b},   [x0], x2
+        uaddw           v4.8h,     v18.8h, v5.8b
+        ld1             {v7.8b},   [x0], x2
+        uaddw           v26.8h,    v18.8h, v6.8b
+        sqxtun          v20.8b,    v20.8h
+        uaddw           v6.8h,     v18.8h, v7.8b
+        sqxtun          v21.8b,    v0.8h
+        sqxtun          v22.8b,    v22.8h
+        st1             {v20.8b},  [x3], x2
+        sqxtun          v23.8b,    v2.8h
+        st1             {v21.8b},  [x3], x2
+        sqxtun          v24.8b,    v24.8h
+        st1             {v22.8b},  [x3], x2
+        sqxtun          v25.8b,    v4.8h
+        st1             {v23.8b},  [x3], x2
+        sqxtun          v26.8b,    v26.8h
+        st1             {v24.8b},  [x3], x2
+        sqxtun          v27.8b,    v6.8h
+        st1             {v25.8b},  [x3], x2
+        st1             {v26.8b},  [x3], x2
+        st1             {v27.8b},  [x3], x2
+
+        ret
+endfunc
+
+function ff_vp8_idct_dc_add4y_neon, export=1
+        movi            v0.16b,  #0
+        mov             x3,  #32
+        ld1r            {v16.4h},    [x1]
+        st1             {v0.h}[0],   [x1], x3
+        ld1r            {v17.4h},    [x1]
+        st1             {v0.h}[0],   [x1], x3
+        zip1            v16.2d,      v16.2d, v17.2d
+        ld1r            {v18.4h},    [x1]
+        st1             {v0.h}[0],   [x1], x3
+        ld1r            {v19.4h},    [x1]
+        st1             {v0.h}[0],   [x1], x3
+        zip1            v18.2d,      v18.2d, v19.2d
+        srshr           v16.8h,      v16.8h,  #3            // dc >>= 3
+        ld1             {v0.16b},     [x0], x2
+        srshr           v18.8h,       v18.8h,  #3
+        ld1             {v1.16b},     [x0], x2
+        uaddw           v20.8h,       v16.8h,  v0.8b
+        ld1             {v2.16b},     [x0], x2
+        uaddw2          v0.8h,        v18.8h,   v0.16b
+        ld1             {v3.16b},     [x0], x2
+        uaddw           v21.8h, v16.8h,  v1.8b
+        uaddw2          v1.8h,  v18.8h,  v1.16b
+        uaddw           v22.8h, v16.8h,  v2.8b
+        uaddw2          v2.8h,  v18.8h,  v2.16b
+        uaddw           v23.8h, v16.8h,  v3.8b
+        uaddw2          v3.8h,  v18.8h,  v3.16b
+        sub             x0,  x0,  x2,  lsl #2
+        sqxtun          v20.8b,  v20.8h
+        sqxtun2         v20.16b, v0.8h
+        sqxtun          v21.8b,  v21.8h
+        sqxtun2         v21.16b, v1.8h
+        sqxtun          v22.8b,  v22.8h
+        st1             {v20.16b},    [x0], x2
+        sqxtun2         v22.16b, v2.8h
+        st1             {v21.16b},    [x0], x2
+        sqxtun          v23.8b,  v23.8h
+        st1             {v22.16b},    [x0], x2
+        sqxtun2         v23.16b, v3.8h
+        st1             {v23.16b},    [x0], x2
+
+        ret
+endfunc
+
+function ff_vp8_idct_dc_add_neon, export=1
+        mov             w3,       #0
+        ld1r            {v2.8h},  [x1]
+        strh            w3,       [x1]
+        srshr           v2.8h,  v2.8h,  #3
+        ld1             {v0.s}[0],  [x0], x2
+        ld1             {v0.s}[1],  [x0], x2
+        uaddw           v3.8h,  v2.8h,  v0.8b
+        ld1             {v1.s}[0],  [x0], x2
+        ld1             {v1.s}[1],  [x0], x2
+        uaddw           v4.8h,  v2.8h,  v1.8b
+        sqxtun          v0.8b,  v3.8h
+        sqxtun          v1.8b,  v4.8h
+        sub             x0,  x0,  x2, lsl #2
+        st1             {v0.s}[0],  [x0], x2
+        st1             {v0.s}[1],  [x0], x2
+        st1             {v1.s}[0],  [x0], x2
+        st1             {v1.s}[1],  [x0], x2
+        ret
+endfunc
+
+// Register layout:
+//   P3..Q3 -> v0..v7
+//   flim_E -> v22
+//   flim_I -> v23
+//   hev_thresh -> x5
+//
+.macro  vp8_loop_filter, inner=0, simple=0, hev_thresh
+    .if \simple
+        uabd            v17.16b, v3.16b,  v4.16b      // abs(P0-Q0)
+        uabd            v23.16b, v2.16b,  v5.16b      // abs(P1-Q1)
+        uqadd           v17.16b, v17.16b, v17.16b     // abs(P0-Q0) * 2
+        ushr            v18.16b, v23.16b, #1          // abs(P1-Q1) / 2
+        uqadd           v19.16b, v17.16b,  v18.16b    // (abs(P0-Q0)*2) + (abs(P1-Q1)/2)
+        movi            v21.16b, #0x80
+        cmhs            v16.16b, v22.16b, v19.16b    // (abs(P0-Q0)*2) + (abs(P1-Q1)/2) <= flim
+    .else
+        // calculate hev and normal_limit:
+        uabd            v20.16b, v2.16b,  v3.16b      // abs(P1-P0)
+        uabd            v21.16b, v5.16b,  v4.16b      // abs(Q1-Q0)
+        uabd            v18.16b, v0.16b,  v1.16b      // abs(P3-P2)
+        uabd            v19.16b, v1.16b,  v2.16b      // abs(P2-P1)
+        cmhs            v16.16b, v23.16b, v20.16b     // abs(P1-P0) <= flim_I
+        cmhs            v17.16b, v23.16b, v21.16b     // abs(Q1-Q0) <= flim_I
+        cmhs            v18.16b, v23.16b, v18.16b     // abs(P3-P2) <= flim_I
+        cmhs            v19.16b, v23.16b, v19.16b     // abs(P2-P1) <= flim_I
+        and             v16.16b, v17.16b, v16.16b
+        uabd            v17.16b, v7.16b,  v6.16b      // abs(Q3-Q2)
+        and             v16.16b, v16.16b, v19.16b
+        uabd            v19.16b, v6.16b,  v5.16b      // abs(Q2-Q1)
+        and             v16.16b, v16.16b, v18.16b
+        cmhs            v18.16b, v23.16b, v17.16b     // abs(Q3-Q2) <= flim_I
+        cmhs            v19.16b, v23.16b, v19.16b     // abs(Q2-Q1) <= flim_I
+        uabd            v17.16b, v3.16b,  v4.16b      // abs(P0-Q0)
+        uabd            v23.16b, v2.16b,  v5.16b      // abs(P1-Q1)
+        and             v16.16b, v16.16b, v18.16b
+        uqadd           v17.16b, v17.16b, v17.16b     // abs(P0-Q0) * 2
+        and             v16.16b, v16.16b, v19.16b
+        ushr            v18.16b, v23.16b, #1          // abs(P1-Q1) / 2
+        dup             v23.16b, \hev_thresh          // hev_thresh
+        uqadd           v19.16b, v17.16b, v18.16b     // (abs(P0-Q0)*2) + (abs(P1-Q1)/2)
+        cmhi            v20.16b, v20.16b, v23.16b     // abs(P1-P0) > hev_thresh
+        cmhs            v19.16b, v22.16b, v19.16b     // (abs(P0-Q0)*2) + (abs(P1-Q1)/2) <= flim_E
+        cmhi            v22.16b, v21.16b, v23.16b     // abs(Q1-Q0) > hev_thresh
+        and             v16.16b, v16.16b, v19.16b
+        movi            v21.16b, #0x80
+        orr             v17.16b, v20.16b, v22.16b
+    .endif
+
+        // at this point:
+        //   v16: normal_limit
+        //   v17: hev
+
+        // convert to signed value:
+        eor            v3.16b, v3.16b, v21.16b           // PS0 = P0 ^ 0x80
+        eor            v4.16b, v4.16b, v21.16b           // QS0 = Q0 ^ 0x80
+
+        movi           v20.8h, #3
+        ssubl          v18.8h, v4.8b,  v3.8b             // QS0 - PS0
+        ssubl2         v19.8h, v4.16b, v3.16b            //   (widened to 16bit)
+        eor            v2.16b, v2.16b, v21.16b           // PS1 = P1 ^ 0x80
+        eor            v5.16b, v5.16b, v21.16b           // QS1 = Q1 ^ 0x80
+        mul            v18.8h, v18.8h, v20.8h            // w = 3 * (QS0 - PS0)
+        mul            v19.8h, v19.8h, v20.8h
+
+        sqsub          v20.16b, v2.16b, v5.16b           // clamp(PS1-QS1)
+        movi           v22.16b, #4
+        movi           v23.16b, #3
+    .if \inner
+        and            v20.16b, v20.16b, v17.16b         // if(hev) w += clamp(PS1-QS1)
+    .endif
+        saddw          v18.8h,  v18.8h, v20.8b           // w += clamp(PS1-QS1)
+        saddw2         v19.8h,  v19.8h, v20.16b
+        sqxtn          v18.8b,  v18.8h                   // narrow result back into v18
+        sqxtn2         v18.16b, v19.8h
+    .if !\inner && !\simple
+        eor            v1.16b,  v1.16b,  v21.16b         // PS2 = P2 ^ 0x80
+        eor            v6.16b,  v6.16b,  v21.16b         // QS2 = Q2 ^ 0x80
+    .endif
+        and            v18.16b, v18.16b, v16.16b         // w &= normal_limit
+
+        // registers used at this point..
+        //   v0 -> P3  (don't corrupt)
+        //   v1-v6 -> PS2-QS2
+        //   v7 -> Q3  (don't corrupt)
+        //   v17 -> hev
+        //   v18 -> w
+        //   v21 -> #0x80
+        //   v22 -> #4
+        //   v23 -> #3
+        //   v16, v19, v29 -> unused
+        //
+        // filter_common:   is4tap==1
+        //   c1 = clamp(w + 4) >> 3;
+        //   c2 = clamp(w + 3) >> 3;
+        //   Q0 = s2u(QS0 - c1);
+        //   P0 = s2u(PS0 + c2);
+
+    .if \simple
+        sqadd          v19.16b, v18.16b, v22.16b           // c1 = clamp((w&hev)+4)
+        sqadd          v20.16b, v18.16b, v23.16b           // c2 = clamp((w&hev)+3)
+        sshr           v19.16b, v19.16b, #3                // c1 >>= 3
+        sshr           v20.16b, v20.16b, #3                // c2 >>= 3
+        sqsub          v4.16b,  v4.16b,  v19.16b           // QS0 = clamp(QS0-c1)
+        sqadd          v3.16b,  v3.16b,  v20.16b           // PS0 = clamp(PS0+c2)
+        eor            v4.16b,  v4.16b,  v21.16b           // Q0 = QS0 ^ 0x80
+        eor            v3.16b,  v3.16b,  v21.16b           // P0 = PS0 ^ 0x80
+        eor            v5.16b,  v5.16b,  v21.16b           // Q1 = QS1 ^ 0x80
+        eor            v2.16b,  v2.16b,  v21.16b           // P1 = PS1 ^ 0x80
+    .elseif \inner
+        // the !is4tap case of filter_common, only used for inner blocks
+        //   c3 = ((c1&~hev) + 1) >> 1;
+        //   Q1 = s2u(QS1 - c3);
+        //   P1 = s2u(PS1 + c3);
+        sqadd          v19.16b, v18.16b, v22.16b           // c1 = clamp((w&hev)+4)
+        sqadd          v20.16b, v18.16b, v23.16b           // c2 = clamp((w&hev)+3)
+        sshr           v19.16b, v19.16b, #3                // c1 >>= 3
+        sshr           v20.16b, v20.16b, #3                // c2 >>= 3
+        sqsub          v4.16b,  v4.16b,  v19.16b           // QS0 = clamp(QS0-c1)
+        sqadd          v3.16b,  v3.16b,  v20.16b           // PS0 = clamp(PS0+c2)
+        bic            v19.16b, v19.16b, v17.16b           // c1 & ~hev
+        eor            v4.16b,  v4.16b,  v21.16b           // Q0 = QS0 ^ 0x80
+        srshr          v19.16b, v19.16b, #1                // c3 >>= 1
+        eor            v3.16b,  v3.16b,  v21.16b           // P0 = PS0 ^ 0x80
+        sqsub          v5.16b,  v5.16b,  v19.16b           // QS1 = clamp(QS1-c3)
+        sqadd          v2.16b,  v2.16b,  v19.16b           // PS1 = clamp(PS1+c3)
+        eor            v5.16b,  v5.16b,  v21.16b           // Q1 = QS1 ^ 0x80
+        eor            v2.16b,  v2.16b,  v21.16b           // P1 = PS1 ^ 0x80
+    .else
+        and            v20.16b, v18.16b, v17.16b           // w & hev
+        sqadd          v19.16b, v20.16b, v22.16b           // c1 = clamp((w&hev)+4)
+        sqadd          v20.16b, v20.16b, v23.16b           // c2 = clamp((w&hev)+3)
+        sshr           v19.16b, v19.16b, #3                // c1 >>= 3
+        sshr           v20.16b, v20.16b, #3                // c2 >>= 3
+        bic            v18.16b, v18.16b, v17.16b           // w &= ~hev
+        sqsub          v4.16b,  v4.16b,  v19.16b           // QS0 = clamp(QS0-c1)
+        sqadd          v3.16b,  v3.16b,  v20.16b           // PS0 = clamp(PS0+c2)
+
+        // filter_mbedge:
+        //   a = clamp((27*w + 63) >> 7);
+        //   Q0 = s2u(QS0 - a);
+        //   P0 = s2u(PS0 + a);
+        //   a = clamp((18*w + 63) >> 7);
+        //   Q1 = s2u(QS1 - a);
+        //   P1 = s2u(PS1 + a);
+        //   a = clamp((9*w + 63) >> 7);
+        //   Q2 = s2u(QS2 - a);
+        //   P2 = s2u(PS2 + a);
+        movi           v17.8h,  #63
+        sshll          v22.8h,  v18.8b, #3
+        sshll2         v23.8h,  v18.16b, #3
+        saddw          v22.8h,  v22.8h, v18.8b
+        saddw2         v23.8h,  v23.8h, v18.16b
+        add            v16.8h,  v17.8h, v22.8h
+        add            v17.8h,  v17.8h, v23.8h           //  9*w + 63
+        add            v19.8h,  v16.8h, v22.8h
+        add            v20.8h,  v17.8h, v23.8h           // 18*w + 63
+        add            v22.8h,  v19.8h, v22.8h
+        add            v23.8h,  v20.8h, v23.8h           // 27*w + 63
+        sqshrn         v16.8b,  v16.8h,  #7
+        sqshrn2        v16.16b, v17.8h, #7              // clamp(( 9*w + 63)>>7)
+        sqshrn         v19.8b,  v19.8h, #7
+        sqshrn2        v19.16b, v20.8h, #7              // clamp((18*w + 63)>>7)
+        sqshrn         v22.8b,  v22.8h, #7
+        sqshrn2        v22.16b, v23.8h, #7              // clamp((27*w + 63)>>7)
+        sqadd          v1.16b,  v1.16b,  v16.16b        // PS2 = clamp(PS2+a)
+        sqsub          v6.16b,  v6.16b,  v16.16b        // QS2 = clamp(QS2-a)
+        sqadd          v2.16b,  v2.16b,  v19.16b        // PS1 = clamp(PS1+a)
+        sqsub          v5.16b,  v5.16b,  v19.16b        // QS1 = clamp(QS1-a)
+        sqadd          v3.16b,  v3.16b,  v22.16b        // PS0 = clamp(PS0+a)
+        sqsub          v4.16b,  v4.16b,  v22.16b        // QS0 = clamp(QS0-a)
+        eor            v3.16b,  v3.16b,  v21.16b        // P0 = PS0 ^ 0x80
+        eor            v4.16b,  v4.16b,  v21.16b        // Q0 = QS0 ^ 0x80
+        eor            v2.16b,  v2.16b,  v21.16b        // P1 = PS1 ^ 0x80
+        eor            v5.16b,  v5.16b,  v21.16b        // Q1 = QS1 ^ 0x80
+        eor            v1.16b,  v1.16b,  v21.16b        // P2 = PS2 ^ 0x80
+        eor            v6.16b,  v6.16b,  v21.16b        // Q2 = QS2 ^ 0x80
+    .endif
+.endm
+
+.macro  vp8_v_loop_filter16 name, inner=0, simple=0
+function ff_vp8_v_loop_filter16\name\()_neon, export=1
+        sub             x0,  x0,  x1,  lsl #1+!\simple
+
+        // Load pixels:
+    .if !\simple
+        ld1             {v0.16b},     [x0], x1 // P3
+        ld1             {v1.16b},     [x0], x1 // P2
+    .endif
+        ld1             {v2.16b},     [x0], x1 // P1
+        ld1             {v3.16b},     [x0], x1 // P0
+        ld1             {v4.16b},     [x0], x1 // Q0
+        ld1             {v5.16b},     [x0], x1 // Q1
+    .if !\simple
+        ld1             {v6.16b},     [x0], x1 // Q2
+        ld1             {v7.16b},     [x0]     // Q3
+        dup             v23.16b, w3                 // flim_I
+    .endif
+        dup             v22.16b, w2                 // flim_E
+
+        vp8_loop_filter inner=\inner, simple=\simple, hev_thresh=w4
+
+        // back up to P2:  dst -= stride * 6
+        sub             x0,  x0,  x1,  lsl #2
+    .if !\simple
+        sub             x0,  x0,  x1,  lsl #1
+
+        // Store pixels:
+        st1             {v1.16b},     [x0], x1 // P2
+    .endif
+        st1             {v2.16b},     [x0], x1 // P1
+        st1             {v3.16b},     [x0], x1 // P0
+        st1             {v4.16b},     [x0], x1 // Q0
+        st1             {v5.16b},     [x0], x1 // Q1
+    .if !\simple
+        st1             {v6.16b},     [x0]     // Q2
+    .endif
+
+        ret
+endfunc
+.endm
+
+vp8_v_loop_filter16
+vp8_v_loop_filter16 _inner,  inner=1
+vp8_v_loop_filter16 _simple, simple=1
+
+.macro  vp8_v_loop_filter8uv name, inner=0
+function ff_vp8_v_loop_filter8uv\name\()_neon, export=1
+        sub             x0,  x0,  x2,  lsl #2
+        sub             x1,  x1,  x2,  lsl #2
+        // Load pixels:
+        ld1          {v0.d}[0],     [x0], x2  // P3
+        ld1          {v0.d}[1],     [x1], x2  // P3
+        ld1          {v1.d}[0],     [x0], x2  // P2
+        ld1          {v1.d}[1],     [x1], x2  // P2
+        ld1          {v2.d}[0],     [x0], x2  // P1
+        ld1          {v2.d}[1],     [x1], x2  // P1
+        ld1          {v3.d}[0],     [x0], x2  // P0
+        ld1          {v3.d}[1],     [x1], x2  // P0
+        ld1          {v4.d}[0],     [x0], x2  // Q0
+        ld1          {v4.d}[1],     [x1], x2  // Q0
+        ld1          {v5.d}[0],     [x0], x2  // Q1
+        ld1          {v5.d}[1],     [x1], x2  // Q1
+        ld1          {v6.d}[0],     [x0], x2  // Q2
+        ld1          {v6.d}[1],     [x1], x2  // Q2
+        ld1          {v7.d}[0],     [x0]      // Q3
+        ld1          {v7.d}[1],     [x1]      // Q3
+
+        dup          v22.16b, w3                 // flim_E
+        dup          v23.16b, w4                 // flim_I
+
+        vp8_loop_filter inner=\inner, hev_thresh=w5
+
+        // back up to P2:  u,v -= stride * 6
+        sub          x0,  x0,  x2,  lsl #2
+        sub          x1,  x1,  x2,  lsl #2
+        sub          x0,  x0,  x2,  lsl #1
+        sub          x1,  x1,  x2,  lsl #1
+
+        // Store pixels:
+
+        st1          {v1.d}[0],     [x0], x2  // P2
+        st1          {v1.d}[1],     [x1], x2  // P2
+        st1          {v2.d}[0],     [x0], x2  // P1
+        st1          {v2.d}[1],     [x1], x2  // P1
+        st1          {v3.d}[0],     [x0], x2  // P0
+        st1          {v3.d}[1],     [x1], x2  // P0
+        st1          {v4.d}[0],     [x0], x2  // Q0
+        st1          {v4.d}[1],     [x1], x2  // Q0
+        st1          {v5.d}[0],     [x0], x2  // Q1
+        st1          {v5.d}[1],     [x1], x2  // Q1
+        st1          {v6.d}[0],     [x0]      // Q2
+        st1          {v6.d}[1],     [x1]      // Q2
+
+        ret
+endfunc
+.endm
+
+vp8_v_loop_filter8uv
+vp8_v_loop_filter8uv _inner, inner=1
+
+.macro  vp8_h_loop_filter16 name, inner=0, simple=0
+function ff_vp8_h_loop_filter16\name\()_neon, export=1
+
+        sub             x0,  x0,  #4
+        // Load pixels:
+        ld1             {v0.d}[0], [x0], x1
+        ld1             {v1.d}[0], [x0], x1
+        ld1             {v2.d}[0], [x0], x1
+        ld1             {v3.d}[0], [x0], x1
+        ld1             {v4.d}[0], [x0], x1
+        ld1             {v5.d}[0], [x0], x1
+        ld1             {v6.d}[0], [x0], x1
+        ld1             {v7.d}[0], [x0], x1
+        ld1             {v0.d}[1], [x0], x1
+        ld1             {v1.d}[1], [x0], x1
+        ld1             {v2.d}[1], [x0], x1
+        ld1             {v3.d}[1], [x0], x1
+        ld1             {v4.d}[1], [x0], x1
+        ld1             {v5.d}[1], [x0], x1
+        ld1             {v6.d}[1], [x0], x1
+        ld1             {v7.d}[1], [x0], x1
+
+        transpose_8x16B   v0,  v1,  v2,  v3,  v4,  v5,  v6,  v7, v30, v31
+
+        dup             v22.16b, w2                 // flim_E
+    .if !\simple
+        dup             v23.16b, w3                 // flim_I
+    .endif
+
+        vp8_loop_filter inner=\inner, simple=\simple, hev_thresh=w4
+
+        sub             x0,  x0,  x1, lsl #4    // backup 16 rows
+
+        transpose_8x16B   v0,  v1,  v2,  v3,  v4,  v5,  v6,  v7, v30, v31
+
+        // Store pixels:
+        st1             {v0.d}[0], [x0], x1
+        st1             {v1.d}[0], [x0], x1
+        st1             {v2.d}[0], [x0], x1
+        st1             {v3.d}[0], [x0], x1
+        st1             {v4.d}[0], [x0], x1
+        st1             {v5.d}[0], [x0], x1
+        st1             {v6.d}[0], [x0], x1
+        st1             {v7.d}[0], [x0], x1
+        st1             {v0.d}[1], [x0], x1
+        st1             {v1.d}[1], [x0], x1
+        st1             {v2.d}[1], [x0], x1
+        st1             {v3.d}[1], [x0], x1
+        st1             {v4.d}[1], [x0], x1
+        st1             {v5.d}[1], [x0], x1
+        st1             {v6.d}[1], [x0], x1
+        st1             {v7.d}[1], [x0]
+
+        ret
+endfunc
+.endm
+
+vp8_h_loop_filter16
+vp8_h_loop_filter16 _inner,  inner=1
+vp8_h_loop_filter16 _simple, simple=1
+
+.macro  vp8_h_loop_filter8uv name, inner=0
+function ff_vp8_h_loop_filter8uv\name\()_neon, export=1
+        sub             x0,  x0,  #4
+        sub             x1,  x1,  #4
+
+        // Load pixels:
+        ld1          {v0.d}[0],     [x0], x2 // load u
+        ld1          {v0.d}[1],     [x1], x2 // load v
+        ld1          {v1.d}[0],     [x0], x2
+        ld1          {v1.d}[1],     [x1], x2
+        ld1          {v2.d}[0],     [x0], x2
+        ld1          {v2.d}[1],     [x1], x2
+        ld1          {v3.d}[0],     [x0], x2
+        ld1          {v3.d}[1],     [x1], x2
+        ld1          {v4.d}[0],     [x0], x2
+        ld1          {v4.d}[1],     [x1], x2
+        ld1          {v5.d}[0],     [x0], x2
+        ld1          {v5.d}[1],     [x1], x2
+        ld1          {v6.d}[0],     [x0], x2
+        ld1          {v6.d}[1],     [x1], x2
+        ld1          {v7.d}[0],     [x0], x2
+        ld1          {v7.d}[1],     [x1], x2
+
+        transpose_8x16B   v0,  v1,  v2,  v3,  v4,  v5,  v6,  v7, v30, v31
+
+        dup             v22.16b, w3                 // flim_E
+        dup             v23.16b, w4                 // flim_I
+
+        vp8_loop_filter inner=\inner, hev_thresh=w5
+
+        sub             x0,  x0,  x2, lsl #3    // backup u 8 rows
+        sub             x1,  x1,  x2, lsl #3    // backup v 8 rows
+
+        transpose_8x16B   v0,  v1,  v2,  v3,  v4,  v5,  v6,  v7, v30, v31
+
+        // Store pixels:
+        st1          {v0.d}[0],     [x0], x2 // load u
+        st1          {v0.d}[1],     [x1], x2 // load v
+        st1          {v1.d}[0],     [x0], x2
+        st1          {v1.d}[1],     [x1], x2
+        st1          {v2.d}[0],     [x0], x2
+        st1          {v2.d}[1],     [x1], x2
+        st1          {v3.d}[0],     [x0], x2
+        st1          {v3.d}[1],     [x1], x2
+        st1          {v4.d}[0],     [x0], x2
+        st1          {v4.d}[1],     [x1], x2
+        st1          {v5.d}[0],     [x0], x2
+        st1          {v5.d}[1],     [x1], x2
+        st1          {v6.d}[0],     [x0], x2
+        st1          {v6.d}[1],     [x1], x2
+        st1          {v7.d}[0],     [x0]
+        st1          {v7.d}[1],     [x1]
+
+        ret
+
+endfunc
+.endm
+
+vp8_h_loop_filter8uv
+vp8_h_loop_filter8uv _inner, inner=1
+
+
+function ff_put_vp8_pixels16_neon, export=1
+1:
+        subs            w4, w4, #4
+        ld1             {v0.16b},     [x2], x3
+        ld1             {v1.16b},     [x2], x3
+        ld1             {v2.16b},     [x2], x3
+        ld1             {v3.16b},     [x2], x3
+        st1             {v0.16b},     [x0], x1
+        st1             {v1.16b},     [x0], x1
+        st1             {v2.16b},     [x0], x1
+        st1             {v3.16b},     [x0], x1
+        b.gt            1b
+        ret
+endfunc
+
+function ff_put_vp8_pixels8_neon, export=1
+1:
+        subs            w4, w4, #4
+        ld1             {v0.8b},   [x2], x3
+        ld1             {v0.d}[1], [x2], x3
+        ld1             {v1.8b},   [x2], x3
+        ld1             {v1.d}[1], [x2], x3
+        st1             {v0.8b},   [x0], x1
+        st1             {v0.d}[1], [x0], x1
+        st1             {v1.8b},   [x0], x1
+        st1             {v1.d}[1], [x0], x1
+        b.gt            1b
+        ret
+endfunc
+
+/* 4/6-tap 8th-pel MC */
+
+.macro  vp8_epel8_h6    d,   s0,   s1
+        ext             v22.8b, \s0\().8b,  \s1\().8b,  #1
+        uxtl            v18.8h, \s0\().8b
+        ext             v23.8b, \s0\().8b,  \s1\().8b,  #2
+        uxtl            v19.8h, v22.8b
+        ext             v24.8b, \s0\().8b,  \s1\().8b,  #3
+        uxtl            v21.8h, v23.8b
+        ext             v25.8b, \s0\().8b,  \s1\().8b,  #4
+        uxtl            v22.8h, v24.8b
+        ext             v26.8b, \s0\().8b,  \s1\().8b,  #5
+        uxtl            v25.8h, v25.8b
+        mul             v21.8h, v21.8h, v0.h[2]
+        uxtl            v26.8h, v26.8b
+        mul             v22.8h, v22.8h, v0.h[3]
+        mls             v21.8h, v19.8h, v0.h[1]
+        mls             v22.8h, v25.8h, v0.h[4]
+        mla             v21.8h, v18.8h, v0.h[0]
+        mla             v22.8h, v26.8h, v0.h[5]
+        sqadd           v22.8h, v21.8h, v22.8h
+        sqrshrun        \d\().8b, v22.8h, #7
+.endm
+
+.macro  vp8_epel16_h6   d0,  v0,  v1
+        ext             v22.16b, \v0\().16b, \v1\().16b, #3
+        ext             v23.16b, \v0\().16b, \v1\().16b, #4
+        uxtl            v19.8h,  v22.8b
+        uxtl2           v22.8h,  v22.16b
+        ext             v3.16b,  \v0\().16b, \v1\().16b, #2
+        uxtl            v20.8h,  v23.8b
+        uxtl2           v23.8h,  v23.16b
+        ext             v16.16b, \v0\().16b, \v1\().16b, #1
+        uxtl            v18.8h,  v3.8b
+        uxtl2           v3.8h,   v3.16b
+        ext             v2.16b,  \v0\().16b, \v1\().16b, #5
+        uxtl            v21.8h,  v2.8b
+        uxtl2           v2.8h,   v2.16b
+        uxtl            v17.8h,  v16.8b
+        uxtl2           v16.8h,  v16.16b
+        mul             v19.8h,  v19.8h, v0.h[3]
+        mul             v18.8h,  v18.8h, v0.h[2]
+        mul             v3.8h,   v3.8h,  v0.h[2]
+        mul             v22.8h,  v22.8h, v0.h[3]
+        mls             v19.8h,  v20.8h, v0.h[4]
+        uxtl            v20.8h,  \v0\().8b
+        uxtl2           v1.8h,   \v0\().16b
+        mls             v18.8h,  v17.8h, v0.h[1]
+        mls             v3.8h,   v16.8h, v0.h[1]
+        mls             v22.8h,  v23.8h, v0.h[4]
+        mla             v18.8h,  v20.8h, v0.h[0]
+        mla             v19.8h,  v21.8h, v0.h[5]
+        mla             v3.8h,   v1.8h,  v0.h[0]
+        mla             v22.8h,  v2.8h,  v0.h[5]
+        sqadd           v19.8h,  v18.8h, v19.8h
+        sqadd           v22.8h,  v3.8h,  v22.8h
+        sqrshrun        \d0\().8b,  v19.8h, #7
+        sqrshrun2       \d0\().16b, v22.8h, #7
+.endm
+
+.macro  vp8_epel8_v6_y2 d0, d1, s0, s1, s2, s3, s4, s5, s6
+        uxtl            \s0\().8h, \s0\().8b
+        uxtl            \s3\().8h, \s3\().8b
+        uxtl            \s6\().8h, \s6\().8b
+        uxtl            \s1\().8h, \s1\().8b
+        uxtl            \s4\().8h, \s4\().8b
+        uxtl            \s2\().8h, \s2\().8b
+        uxtl            \s5\().8h, \s5\().8b
+        mul             \s0\().8h, \s0\().8h, v0.h[0]
+        mul             v31.8h   , \s3\().8h, v0.h[3]
+        mul             \s3\().8h, \s3\().8h, v0.h[2]
+        mul             \s6\().8h, \s6\().8h, v0.h[5]
+
+        mls             \s0\().8h, \s1\().8h, v0.h[1]
+        mls             v31.8h   , \s4\().8h, v0.h[4]
+        mls             \s3\().8h, \s2\().8h, v0.h[1]
+        mls             \s6\().8h, \s5\().8h, v0.h[4]
+
+        mla             \s0\().8h, \s2\().8h, v0.h[2]
+        mla             v31.8h   , \s5\().8h, v0.h[5]
+        mla             \s3\().8h, \s1\().8h, v0.h[0]
+        mla             \s6\().8h, \s4\().8h, v0.h[3]
+        sqadd           v31.8h   , \s0\().8h, v31.8h
+        sqadd           \s6\().8h, \s3\().8h, \s6\().8h
+        sqrshrun        \d0\().8b, v31.8h,    #7
+        sqrshrun        \d1\().8b, \s6\().8h, #7
+.endm
+
+.macro  vp8_epel8_h4    d,   v0,   v1
+        ext             v22.8b, \v0\().8b,  \v1\().8b,  #1
+        uxtl            v19.8h, \v0\().8b
+        ext             v23.8b, \v0\().8b,  \v1\().8b,  #2
+        uxtl            v20.8h, v22.8b
+        ext             v25.8b, \v0\().8b,  \v1\().8b,  #3
+        uxtl            v22.8h, v23.8b
+        uxtl            v25.8h, v25.8b
+        mul             v20.8h, v20.8h, v0.h[2]
+        mul             v22.8h, v22.8h, v0.h[3]
+        mls             v20.8h, v19.8h, v0.h[1]
+        mls             v22.8h, v25.8h, v0.h[4]
+        sqadd           v22.8h, v20.8h, v22.8h
+        sqrshrun        \d\().8b, v22.8h, #7
+.endm
+
+.macro  vp8_epel8_v4_y2 d0, s0, s1, s2, s3, s4
+        uxtl            \s0\().8h,  \s0\().8b
+        uxtl            \s1\().8h,  \s1\().8b
+        uxtl            \s2\().8h,  \s2\().8b
+        uxtl            \s3\().8h,  \s3\().8b
+        uxtl            \s4\().8h,  \s4\().8b
+        mul             v21.8h,     \s1\().8h, v0.h[2]
+        mul             v23.8h,     \s2\().8h, v0.h[3]
+        mul             \s2\().8h,  \s2\().8h, v0.h[2]
+        mul             v22.8h,     \s3\().8h, v0.h[3]
+        mls             v21.8h,     \s0\().8h, v0.h[1]
+        mls             v23.8h,     \s3\().8h, v0.h[4]
+        mls             \s2\().8h,  \s1\().8h, v0.h[1]
+        mls             v22.8h,     \s4\().8h, v0.h[4]
+        sqadd           v21.8h,     v21.8h,    v23.8h
+        sqadd           \s2\().8h,  \s2\().8h, v22.8h
+        sqrshrun        \d0\().8b,  v21.8h,    #7
+        sqrshrun2       \d0\().16b, \s2\().8h, #7
+.endm
+
+
+// note: worst case sum of all 6-tap filter values * 255 is 0x7f80 so 16 bit
+// arithmetic can be used to apply filters
+const   subpel_filters, align=4
+        .short     0,   6, 123,  12,   1,   0,   0,   0
+        .short     2,  11, 108,  36,   8,   1,   0,   0
+        .short     0,   9,  93,  50,   6,   0,   0,   0
+        .short     3,  16,  77,  77,  16,   3,   0,   0
+        .short     0,   6,  50,  93,   9,   0,   0,   0
+        .short     1,   8,  36, 108,  11,   2,   0,   0
+        .short     0,   1,  12, 123,   6,   0,   0,   0
+endconst
+
+function ff_put_vp8_epel16_v6_neon, export=1
+        sub             x2,  x2,  x3,  lsl #1
+
+        sxtw            x4,  w4
+        sxtw            x6,  w6
+        movrel          x17,  subpel_filters, -16
+        add             x6,  x17,  x6, lsl #4  // y
+        ld1             {v0.8h},     [x6]
+1:
+        ld1             {v1.1d - v2.1d},    [x2], x3
+        ld1             {v3.1d - v4.1d},    [x2], x3
+        ld1             {v16.1d - v17.1d},  [x2], x3
+        ld1             {v18.1d - v19.1d},  [x2], x3
+        ld1             {v20.1d - v21.1d},  [x2], x3
+        ld1             {v22.1d - v23.1d},  [x2], x3
+        ld1             {v24.1d - v25.1d},  [x2]
+        sub             x2,  x2,  x3, lsl #2
+
+        vp8_epel8_v6_y2 v1, v3, v1, v3, v16, v18, v20, v22, v24
+        vp8_epel8_v6_y2 v2, v4, v2, v4, v17, v19, v21, v23, v25
+
+        st1             {v1.1d - v2.1d}, [x0], x1
+        st1             {v3.1d - v4.1d}, [x0], x1
+        subs            x4, x4, #2
+        b.ne            1b
+
+        ret
+endfunc
+
+function ff_put_vp8_epel16_h6_neon, export=1
+        sub             x2,  x2,  #2
+        sxtw            x5,  w5 // x
+
+        // first pass (horizontal):
+        movrel          x17,  subpel_filters, -16
+        add             x5,  x17,  x5, lsl #4 // x
+        ld1             {v0.8h},  [x5]
+1:
+        ld1             {v1.16b, v2.16b}, [x2], x3
+        vp8_epel16_h6   v1, v1, v2
+        st1             {v1.16b}, [x0], x1
+
+        subs            w4, w4, #1
+        b.ne            1b
+        ret
+endfunc
+
+
+function ff_put_vp8_epel16_h6v6_neon, export=1
+        sub             x2,  x2,  x3,  lsl #1
+        sub             x2,  x2,  #2
+
+        // first pass (horizontal):
+        movrel          x17,  subpel_filters, -16
+        sxtw            x5,  w5 // x
+        add             x16,  x17,  x5, lsl #4 // x
+        sub             sp,  sp,  #336+16
+        ld1             {v0.8h},  [x16]
+        add             x7,  sp,  #15
+        sxtw            x4,  w4
+        add             x16, x4, #5   // h
+        bic             x7,  x7,  #15
+1:
+        ld1             {v1.16b, v2.16b}, [x2], x3
+        vp8_epel16_h6   v1, v1, v2
+        st1             {v1.16b}, [x7], #16
+        subs            x16, x16, #1
+        b.ne            1b
+
+
+        // second pass (vertical):
+        sxtw            x6,  w6
+        add             x6,  x17,  x6, lsl #4  // y
+        add             x7,  sp,  #15
+        ld1             {v0.8h},     [x6]
+        bic             x7,  x7,  #15
+2:
+        ld1             {v1.8b - v4.8b},    [x7], #32
+        ld1             {v16.8b - v19.8b},  [x7], #32
+        ld1             {v20.8b - v23.8b},  [x7], #32
+        ld1             {v24.8b - v25.8b},  [x7]
+        sub             x7,  x7,  #64
+
+        vp8_epel8_v6_y2 v1, v3, v1, v3, v16, v18, v20, v22, v24
+        vp8_epel8_v6_y2 v2, v4, v2, v4, v17, v19, v21, v23, v25
+        trn1            v1.2d, v1.2d, v2.2d
+        trn1            v3.2d, v3.2d, v4.2d
+
+        st1             {v1.16b}, [x0], x1
+        st1             {v3.16b}, [x0], x1
+        subs            x4, x4, #2
+        b.ne            2b
+
+        add             sp,  sp,  #336+16
+        ret
+endfunc
+
+function ff_put_vp8_epel8_v6_neon, export=1
+        sub             x2,  x2,  x3,  lsl #1
+
+        movrel          x7,  subpel_filters, -16
+        add             x6,  x7,  w6, uxtw #4
+        ld1             {v0.8h},  [x6]
+1:
+        ld1             {v2.8b},  [x2], x3
+        ld1             {v3.8b},  [x2], x3
+        ld1             {v4.8b},  [x2], x3
+        ld1             {v5.8b},  [x2], x3
+        ld1             {v6.8b},  [x2], x3
+        ld1             {v7.8b},  [x2], x3
+        ld1             {v28.8b}, [x2]
+
+        sub             x2,  x2,  x3,  lsl #2
+
+        vp8_epel8_v6_y2 v2, v3, v2, v3, v4, v5, v6, v7, v28
+
+        st1             {v2.8b}, [x0], x1
+        st1             {v3.8b}, [x0], x1
+        subs            w4,  w4,  #2
+        b.ne            1b
+
+        ret
+endfunc
+
+function ff_put_vp8_epel8_h6_neon, export=1
+        sub             x2,  x2,  #2
+
+        movrel          x7,  subpel_filters, -16
+        add             x5,  x7,  w5, uxtw #4
+        ld1             {v0.8h},        [x5]
+1:
+        ld1             {v2.8b, v3.8b}, [x2], x3
+
+        vp8_epel8_h6    v2,  v2,  v3
+
+        st1             {v2.8b}, [x0], x1
+        subs            w4,  w4,  #1
+        b.ne            1b
+
+        ret
+endfunc
+
+function ff_put_vp8_epel8_h6v6_neon, export=1
+        sub             x2,  x2,  x3,  lsl #1
+        sub             x2,  x2,  #2
+        sxtw            x4,  w4
+
+        // first pass (horizontal):
+        movrel          x17,  subpel_filters, -16
+        sxtw            x5,  w5
+        add             x5,  x17,  x5, lsl #4 // x
+        sub             sp,  sp,  #168+16
+        ld1             {v0.8h},  [x5]
+        add             x7,  sp,  #15
+        add             x16, x4,  #5   // h
+        bic             x7,  x7,  #15
+1:
+        ld1             {v1.8b, v2.8b}, [x2], x3
+
+        vp8_epel8_h6    v1, v1, v2
+
+        st1             {v1.8b}, [x7], #8
+        subs            x16, x16, #1
+        b.ne            1b
+
+        // second pass (vertical):
+        sxtw            x6,  w6
+        add             x6,  x17,  x6, lsl #4  // y
+        add             x7,  sp,   #15
+        ld1             {v0.8h},   [x6]
+        bic             x7,  x7,   #15
+2:
+        ld1             {v1.8b - v4.8b}, [x7], #32
+        ld1             {v5.8b - v7.8b}, [x7]
+
+        sub             x7,  x7,  #16
+
+        vp8_epel8_v6_y2 v1, v2, v1, v2, v3, v4, v5, v6, v7
+
+        st1             {v1.8b}, [x0], x1
+        st1             {v2.8b}, [x0], x1
+        subs            x4, x4, #2
+        b.ne            2b
+
+        add             sp,  sp,  #168+16
+        ret
+endfunc
+
+function ff_put_vp8_epel8_v4_neon, export=1
+        sub             x2,  x2,  x3
+
+        movrel          x7,  subpel_filters, -16
+        add             x6,  x7,  w6, uxtw #4
+        ld1             {v0.8h},     [x6]
+1:
+        ld1             {v2.8b},     [x2], x3
+        ld1             {v3.8b},     [x2], x3
+        ld1             {v4.8b},     [x2], x3
+        ld1             {v5.8b},     [x2], x3
+        ld1             {v6.8b},     [x2]
+        sub             x2,  x2,  x3,  lsl #1
+
+        vp8_epel8_v4_y2 v2, v2, v3, v4, v5, v6
+
+        st1             {v2.d}[0], [x0], x1
+        st1             {v2.d}[1], [x0], x1
+        subs            w4,  w4,  #2
+        b.ne            1b
+
+        ret
+endfunc
+
+function ff_put_vp8_epel8_h4_neon, export=1
+        sub             x2,  x2,  #1
+
+        movrel          x7,  subpel_filters, -16
+        add             x5,  x7,  w5, uxtw #4
+        ld1             {v0.8h},       [x5]
+1:
+        ld1             {v2.8b,v3.8b}, [x2], x3
+
+        vp8_epel8_h4    v2,  v2,  v3
+
+        st1             {v2.8b}, [x0], x1
+        subs            w4,  w4,  #1
+        b.ne            1b
+
+        ret
+endfunc
+
+function ff_put_vp8_epel8_h4v6_neon, export=1
+        sub             x2,  x2,  x3,  lsl #1
+        sub             x2,  x2,  #1
+        sxtw            x4,  w4
+
+        // first pass (horizontal):
+        movrel          x17,  subpel_filters, -16
+        sxtw            x5,  w5
+        add             x5,  x17,  x5, lsl #4 // x
+        sub             sp,  sp,  #168+16
+        ld1             {v0.8h},  [x5]
+        add             x7,  sp,  #15
+        add             x16, x4, #5   // h
+        bic             x7,  x7,  #15
+1:
+        ld1             {v1.8b, v2.8b}, [x2], x3
+
+        vp8_epel8_h4    v1, v1, v2
+
+        st1             {v1.8b}, [x7], #8
+        subs            x16, x16, #1
+        b.ne            1b
+
+        // second pass (vertical):
+        sxtw            x6,  w6
+        add             x6,  x17,  x6, lsl #4  // y
+        add             x7,  sp,   #15
+        ld1             {v0.8h},   [x6]
+        bic             x7,  x7,   #15
+2:
+        ld1             {v1.8b - v4.8b}, [x7], #32
+        ld1             {v5.8b - v7.8b}, [x7]
+
+        sub             x7,  x7,  #16
+
+        vp8_epel8_v6_y2 v1, v2, v1, v2, v3, v4, v5, v6, v7
+
+        st1             {v1.8b}, [x0], x1
+        st1             {v2.8b}, [x0], x1
+        subs            x4, x4, #2
+        b.ne            2b
+
+        add             sp,  sp,  #168+16
+        ret
+endfunc
+
+function ff_put_vp8_epel8_h4v4_neon, export=1
+        sub             x2,  x2,  x3
+        sub             x2,  x2,  #1
+        sxtw            x4,  w4
+
+
+        // first pass (horizontal):
+        movrel          x17,  subpel_filters, -16
+        sxtw            x5,  w5
+        add             x5,  x17,  x5, lsl #4 // x
+        sub             sp,  sp,  #168+16
+        ld1             {v0.8h},  [x5]
+        add             x7,  sp,  #15
+        add             x16, x4, #3   // h
+        bic             x7,  x7,  #15
+1:
+        ld1             {v1.8b, v2.8b}, [x2], x3
+
+        vp8_epel8_h4    v1, v1, v2
+
+        st1             {v1.8b}, [x7], #8
+        subs            x16, x16, #1
+        b.ne            1b
+
+        // second pass (vertical):
+        sxtw            x6,  w6
+        add             x6,  x17,  x6, lsl #4  // y
+        add             x7,  sp,   #15
+        ld1             {v0.8h},   [x6]
+        bic             x7,  x7,   #15
+2:
+        ld1             {v1.8b - v2.8b}, [x7], #16
+        ld1             {v3.8b - v5.8b}, [x7]
+
+        vp8_epel8_v4_y2 v1, v1, v2, v3, v4, v5
+
+        st1             {v1.d}[0], [x0], x1
+        st1             {v1.d}[1], [x0], x1
+        subs            x4, x4, #2
+        b.ne            2b
+
+        add             sp,  sp,  #168+16
+        ret
+endfunc
+
+function ff_put_vp8_epel8_h6v4_neon, export=1
+        sub             x2,  x2,  x3
+        sub             x2,  x2,  #2
+        sxtw            x4,  w4
+
+
+        // first pass (horizontal):
+        movrel          x17,  subpel_filters, -16
+        sxtw            x5,  w5
+        add             x5,  x17,  x5, lsl #4 // x
+        sub             sp,  sp,  #168+16
+        ld1             {v0.8h},  [x5]
+        add             x7,  sp,  #15
+        add             x16, x4, #3   // h
+        bic             x7,  x7,  #15
+1:
+        ld1             {v1.8b, v2.8b}, [x2], x3
+
+        vp8_epel8_h6    v1, v1, v2
+
+        st1             {v1.8b}, [x7], #8
+        subs            x16, x16, #1
+        b.ne            1b
+
+        // second pass (vertical):
+        sxtw            x6,  w6
+        add             x6,  x17,  x6, lsl #4  // y
+        add             x7,  sp,   #15
+        ld1             {v0.8h},   [x6]
+        bic             x7,  x7,   #15
+2:
+        ld1             {v1.8b - v2.8b}, [x7], #16
+        ld1             {v3.8b - v5.8b}, [x7]
+
+        vp8_epel8_v4_y2 v1, v1, v2, v3, v4, v5
+
+        st1             {v1.d}[0], [x0], x1
+        st1             {v1.d}[1], [x0], x1
+        subs            x4, x4, #2
+        b.ne            2b
+
+        add             sp,  sp,  #168+16
+        ret
+endfunc
+
+function ff_put_vp8_epel4_v6_neon, export=1
+        sub             x2,  x2,  x3,  lsl #1
+
+        movrel          x7,  subpel_filters, -16
+        add             x6,  x7,  w6, uxtw #4
+        ld1             {v0.8h},    [x6]
+1:
+        ld1r            {v2.2s},    [x2], x3
+        ld1r            {v3.2s},    [x2], x3
+        ld1r            {v4.2s},    [x2], x3
+        ld1r            {v5.2s},    [x2], x3
+        ld1r            {v6.2s},    [x2], x3
+        ld1r            {v7.2s},    [x2], x3
+        ld1r            {v28.2s},   [x2]
+        sub             x2,  x2,  x3,  lsl #2
+        ld1             {v2.s}[1],  [x2], x3
+        ld1             {v3.s}[1],  [x2], x3
+        ld1             {v4.s}[1],  [x2], x3
+        ld1             {v5.s}[1],  [x2], x3
+        ld1             {v6.s}[1],  [x2], x3
+        ld1             {v7.s}[1],  [x2], x3
+        ld1             {v28.s}[1], [x2]
+        sub             x2,  x2,  x3,  lsl #2
+
+        vp8_epel8_v6_y2 v2, v3, v2, v3, v4, v5, v6, v7, v28
+
+        st1             {v2.s}[0],  [x0], x1
+        st1             {v3.s}[0],  [x0], x1
+        st1             {v2.s}[1],  [x0], x1
+        st1             {v3.s}[1],  [x0], x1
+        subs            w4,  w4,  #4
+        b.ne            1b
+
+        ret
+endfunc
+
+function ff_put_vp8_epel4_h6_neon, export=1
+        sub             x2,  x2,  #2
+
+        movrel          x7,  subpel_filters, -16
+        add             x5,  x7,  w5, uxtw #4
+        ld1             {v0.8h},       [x5]
+1:
+        ld1             {v2.8b,v3.8b}, [x2], x3
+        vp8_epel8_h6    v2,  v2,  v3
+        st1             {v2.s}[0], [x0], x1
+        subs            w4,  w4,  #1
+        b.ne            1b
+
+        ret
+endfunc
+
+function ff_put_vp8_epel4_h6v6_neon, export=1
+        sub             x2,  x2,  x3,  lsl #1
+        sub             x2,  x2,  #2
+
+        movrel          x7,  subpel_filters, -16
+        add             x5,  x7,  w5, uxtw #4
+        ld1             {v0.8h},       [x5]
+
+        sub             sp,  sp,  #52
+        add             w8,  w4,  #5
+        mov             x9,  sp
+1:
+        ld1             {v2.8b,v3.8b}, [x2], x3
+        vp8_epel8_h6    v2,  v2,  v3
+        st1             {v2.s}[0],     [x9], #4
+        subs            w8,  w8,  #1
+        b.ne            1b
+
+        add             x6,  x7,  w6, uxtw #4
+        ld1             {v0.8h},       [x6]
+        mov             x9,  sp
+2:
+        ld1             {v2.8b,v3.8b}, [x9], #16
+        ld1             {v6.8b},       [x9], #8
+        ld1r            {v28.2s},      [x9]
+        sub             x9,  x9,  #16
+        ld1             {v4.8b,v5.8b}, [x9], #16
+        ld1             {v7.8b},       [x9], #8
+        ld1             {v28.s}[1],    [x9]
+        sub             x9,  x9,  #16
+        trn1            v1.2s, v2.2s, v4.2s
+        trn2            v4.2s, v2.2s, v4.2s
+        trn1            v2.2s, v3.2s, v5.2s
+        trn2            v5.2s, v3.2s, v5.2s
+        trn1            v3.2s, v6.2s, v7.2s
+        trn2            v7.2s, v6.2s, v7.2s
+        vp8_epel8_v6_y2 v2, v3, v1, v4, v2, v5, v3, v7, v28
+        st1             {v2.s}[0],  [x0], x1
+        st1             {v3.s}[0],  [x0], x1
+        st1             {v2.s}[1],  [x0], x1
+        st1             {v3.s}[1],  [x0], x1
+        subs            w4,  w4,  #4
+        b.ne            2b
+
+        add             sp,  sp,  #52
+        ret
+endfunc
+
+function ff_put_vp8_epel4_h4v6_neon, export=1
+        sub             x2,  x2,  x3,  lsl #1
+        sub             x2,  x2,  #1
+
+        movrel          x7,  subpel_filters, -16
+        add             x5,  x7,  w5, uxtw #4
+        ld1             {v0.8h},       [x5]
+
+        sub             sp,  sp,  #52
+        add             w8,  w4,  #5
+        mov             x9,  sp
+1:
+        ld1             {v2.8b},       [x2], x3
+        vp8_epel8_h4    v2,  v2,  v2
+        st1             {v2.s}[0],     [x9], #4
+        subs            w8,  w8,  #1
+        b.ne            1b
+
+        add             x6,  x7,  w6, uxtw #4
+        ld1             {v0.8h},       [x6]
+        mov             x9,  sp
+2:
+        ld1             {v2.8b,v3.8b}, [x9], #16
+        ld1             {v6.8b},       [x9], #8
+        ld1r            {v28.2s},      [x9]
+        sub             x9,  x9,  #16
+        ld1             {v4.8b,v5.8b}, [x9], #16
+        ld1             {v7.8b},       [x9], #8
+        ld1             {v28.s}[1],    [x9]
+        sub             x9,  x9,  #16
+        trn1            v1.2s, v2.2s, v4.2s
+        trn2            v4.2s, v2.2s, v4.2s
+        trn1            v2.2s, v3.2s, v5.2s
+        trn2            v5.2s, v3.2s, v5.2s
+        trn1            v3.2s, v6.2s, v7.2s
+        trn2            v7.2s, v6.2s, v7.2s
+        vp8_epel8_v6_y2 v2, v3, v1, v4, v2, v5, v3, v7, v28
+        st1             {v2.s}[0],  [x0], x1
+        st1             {v3.s}[0],  [x0], x1
+        st1             {v2.s}[1],  [x0], x1
+        st1             {v3.s}[1],  [x0], x1
+        subs            w4,  w4,  #4
+        b.ne            2b
+
+        add             sp,  sp,  #52
+        ret
+endfunc
+
+function ff_put_vp8_epel4_h6v4_neon, export=1
+        sub             x2,  x2,  x3
+        sub             x2,  x2,  #2
+
+        movrel          x7,  subpel_filters, -16
+        add             x5,  x7,  w5, uxtw #4
+        ld1             {v0.8h},       [x5]
+
+        sub             sp,  sp,  #44
+        add             w8,  w4,  #3
+        mov             x9,  sp
+1:
+        ld1             {v2.8b,v3.8b}, [x2], x3
+        vp8_epel8_h6    v2, v2, v3
+        st1             {v2.s}[0],     [x9], #4
+        subs            w8,  w8,  #1
+        b.ne            1b
+
+        add             x6,  x7,  w6, uxtw #4
+        ld1             {v0.8h},       [x6]
+        mov             x9,  sp
+2:
+        ld1             {v2.8b,v3.8b}, [x9], #16
+        ld1r            {v6.2s},       [x9]
+        sub             x9,  x9,  #8
+        ld1             {v4.8b,v5.8b}, [x9], #16
+        ld1             {v6.s}[1],     [x9]
+        sub             x9,  x9,  #8
+        trn1            v1.2s, v2.2s, v4.2s
+        trn2            v4.2s, v2.2s, v4.2s
+        trn1            v2.2s, v3.2s, v5.2s
+        trn2            v5.2s, v3.2s, v5.2s
+        vp8_epel8_v4_y2 v1, v1, v4, v2, v5, v6
+        st1             {v1.s}[0],  [x0], x1
+        st1             {v1.s}[2],  [x0], x1
+        st1             {v1.s}[1],  [x0], x1
+        st1             {v1.s}[3],  [x0], x1
+        subs            w4,  w4,  #4
+        b.ne            2b
+
+        add             sp,  sp,  #44
+        ret
+endfunc
+
+function ff_put_vp8_epel4_h4_neon, export=1
+        sub             x2,  x2,  #1
+
+        movrel          x7,  subpel_filters, -16
+        add             x5,  x7,  w5, uxtw #4
+        ld1             {v0.8h},    [x5]
+1:
+        ld1             {v2.8b},    [x2], x3
+        vp8_epel8_h4    v2,  v2,  v2
+        st1             {v2.s}[0],  [x0], x1
+        subs            w4,  w4,  #1
+        b.ne            1b
+
+        ret
+endfunc
+
+function ff_put_vp8_epel4_v4_neon, export=1
+        sub             x2,  x2,  x3
+
+        movrel          x7,  subpel_filters, -16
+        add             x6,  x7,  w6, uxtw #4
+        ld1             {v0.8h},   [x6]
+1:
+        ld1r            {v2.2s},   [x2], x3
+        ld1r            {v3.2s},   [x2], x3
+        ld1r            {v4.2s},   [x2], x3
+        ld1r            {v5.2s},   [x2], x3
+        ld1r            {v6.2s},   [x2]
+        sub             x2,  x2,  x3,  lsl #1
+        ld1             {v2.s}[1], [x2], x3
+        ld1             {v3.s}[1], [x2], x3
+        ld1             {v4.s}[1], [x2], x3
+        ld1             {v5.s}[1], [x2], x3
+        ld1             {v6.s}[1], [x2]
+        sub             x2,  x2,  x3,  lsl #1
+
+        vp8_epel8_v4_y2 v2, v2, v3, v4, v5, v6
+
+        st1             {v2.s}[0], [x0], x1
+        st1             {v2.s}[2], [x0], x1
+        st1             {v2.s}[1], [x0], x1
+        st1             {v2.s}[3], [x0], x1
+        subs            w4,  w4,  #4
+        b.ne            1b
+
+        ret
+endfunc
+
+function ff_put_vp8_epel4_h4v4_neon, export=1
+        sub             x2,  x2,  x3
+        sub             x2,  x2,  #1
+
+        movrel          x7,  subpel_filters, -16
+        add             x5,  x7,  w5, uxtw #4
+        ld1             {v0.8h},       [x5]
+
+        sub             sp,  sp,  #44
+        add             w8,  w4,  #3
+        mov             x9,  sp
+1:
+        ld1             {v2.8b},       [x2], x3
+        vp8_epel8_h4    v2,  v2,  v3
+        st1             {v2.s}[0],     [x9], #4
+        subs            w8,  w8,  #1
+        b.ne            1b
+
+        add             x6,  x7,  w6, uxtw #4
+        ld1             {v0.8h},       [x6]
+        mov             x9,  sp
+2:
+        ld1             {v2.8b,v3.8b}, [x9], #16
+        ld1r            {v6.2s},       [x9]
+        sub             x9,  x9,  #8
+        ld1             {v4.8b,v5.8b}, [x9], #16
+        ld1             {v6.s}[1],     [x9]
+        sub             x9,  x9,  #8
+        trn1            v1.2s, v2.2s, v4.2s
+        trn2            v4.2s, v2.2s, v4.2s
+        trn1            v2.2s, v3.2s, v5.2s
+        trn2            v5.2s, v3.2s, v5.2s
+        vp8_epel8_v4_y2 v1, v1, v4, v2, v5, v6
+        st1             {v1.s}[0], [x0], x1
+        st1             {v1.s}[2], [x0], x1
+        st1             {v1.s}[1], [x0], x1
+        st1             {v1.s}[3], [x0], x1
+        subs            w4,  w4,  #4
+        b.ne            2b
+
+        add             sp,  sp,  #44
+        ret
+endfunc
+
+/* Bilinear MC */
+
+function ff_put_vp8_bilin16_h_neon, export=1
+        mov             w7,     #8
+        dup             v0.8b,  w5
+        sub             w5,     w7,     w5
+        dup             v1.8b,  w5
+1:
+        subs            w4,     w4,     #2
+        ld1             {v2.8b,v3.8b,v4.8b},    [x2], x3
+        ext             v5.8b,  v3.8b,  v4.8b,  #1
+        ext             v4.8b,  v2.8b,  v3.8b,  #1
+        umull           v16.8h, v2.8b,  v1.8b
+        umlal           v16.8h, v4.8b,  v0.8b
+        ld1             {v18.8b,v19.8b,v20.8b}, [x2], x3
+        umull           v6.8h,  v3.8b,  v1.8b
+        umlal           v6.8h,  v5.8b,  v0.8b
+        ext             v21.8b, v19.8b, v20.8b, #1
+        ext             v20.8b, v18.8b, v19.8b, #1
+        umull           v22.8h, v18.8b, v1.8b
+        umlal           v22.8h, v20.8b, v0.8b
+        umull           v24.8h, v19.8b, v1.8b
+        umlal           v24.8h, v21.8b, v0.8b
+        rshrn           v4.8b,  v16.8h, #3
+        rshrn2          v4.16b, v6.8h,  #3
+        rshrn           v6.8b,  v22.8h, #3
+        rshrn2          v6.16b, v24.8h, #3
+        st1             {v4.16b}, [x0], x1
+        st1             {v6.16b}, [x0], x1
+        b.gt            1b
+
+        ret
+endfunc
+
+function ff_put_vp8_bilin16_v_neon, export=1
+        mov             w7,     #8
+        dup             v0.16b, w6
+        sub             w6,     w7,     w6
+        dup             v1.16b, w6
+
+        ld1             {v2.16b}, [x2], x3
+1:
+        subs            w4,     w4,     #2
+        ld1             {v4.16b}, [x2], x3
+        umull           v6.8h,  v2.8b,  v1.8b
+        umlal           v6.8h,  v4.8b,  v0.8b
+        umull2          v16.8h, v2.16b, v1.16b
+        umlal2          v16.8h, v4.16b, v0.16b
+        ld1             {v2.16b}, [x2], x3
+        umull           v18.8h, v4.8b,  v1.8b
+        umlal           v18.8h, v2.8b,  v0.8b
+        umull2          v20.8h, v4.16b, v1.16b
+        umlal2          v20.8h, v2.16b, v0.16b
+        rshrn           v4.8b,  v6.8h,  #3
+        rshrn2          v4.16b, v16.8h, #3
+        rshrn           v6.8b,  v18.8h, #3
+        rshrn2          v6.16b, v20.8h, #3
+        st1             {v4.16b}, [x0], x1
+        st1             {v6.16b}, [x0], x1
+        b.gt            1b
+
+        ret
+endfunc
+
+function ff_put_vp8_bilin16_hv_neon, export=1
+        mov             w7,      #8
+        dup             v0.8b,   w5            // mx
+        sub             w5,      w7,     w5
+        dup             v1.8b,   w5
+        dup             v2.16b,  w6            // my
+        sub             w6,      w7,     w6
+        dup             v3.16b,  w6
+
+        ld1             {v4.8b,v5.8b,v6.8b},    [x2], x3
+
+        ext             v7.8b,   v5.8b,  v6.8b, #1
+        ext             v6.8b,   v4.8b,  v5.8b, #1
+        umull           v16.8h,  v4.8b,  v1.8b
+        umlal           v16.8h,  v6.8b,  v0.8b
+        umull           v18.8h,  v5.8b,  v1.8b
+        umlal           v18.8h,  v7.8b,  v0.8b
+        rshrn           v4.8b,   v16.8h, #3
+        rshrn2          v4.16b,  v18.8h, #3
+1:
+        subs            w4,  w4,  #2
+        ld1             {v18.8b,v19.8b,v20.8b},  [x2], x3
+        ext             v21.8b,  v19.8b, v20.8b, #1
+        ext             v20.8b,  v18.8b, v19.8b, #1
+        umull           v22.8h,  v18.8b, v1.8b
+        umlal           v22.8h,  v20.8b, v0.8b
+        ld1             {v26.8b,v27.8b,v28.8b},  [x2], x3
+        umull           v24.8h,  v19.8b, v1.8b
+        umlal           v24.8h,  v21.8b, v0.8b
+        ext             v29.8b,  v27.8b, v28.8b, #1
+        ext             v28.8b,  v26.8b, v27.8b, #1
+        umull           v16.8h,  v26.8b, v1.8b
+        umlal           v16.8h,  v28.8b, v0.8b
+        umull           v18.8h,  v27.8b, v1.8b
+        umlal           v18.8h,  v29.8b, v0.8b
+        rshrn           v6.8b,   v22.8h, #3
+        rshrn2          v6.16b,  v24.8h, #3
+        umull           v24.8h,  v4.8b,  v3.8b
+        umlal           v24.8h,  v6.8b,  v2.8b
+        umull2          v30.8h,  v4.16b, v3.16b
+        umlal2          v30.8h,  v6.16b, v2.16b
+        rshrn           v4.8b,   v16.8h, #3
+        rshrn2          v4.16b,  v18.8h, #3
+        umull           v20.8h,  v6.8b,  v3.8b
+        umlal           v20.8h,  v4.8b,  v2.8b
+        umull2          v22.8h,  v6.16b, v3.16b
+        umlal2          v22.8h,  v4.16b, v2.16b
+        rshrn           v24.8b,  v24.8h, #3
+        rshrn2          v24.16b, v30.8h, #3
+        st1             {v24.16b}, [x0], x1
+        rshrn           v20.8b,  v20.8h, #3
+        rshrn2          v20.16b, v22.8h, #3
+        st1             {v20.16b}, [x0], x1
+        b.gt            1b
+
+        ret
+endfunc
+
+function ff_put_vp8_bilin8_h_neon, export=1
+        mov             w7,     #8
+        dup             v0.8b,  w5
+        sub             w5,     w7,     w5
+        dup             v1.8b,  w5
+1:
+        subs            w4,     w4,     #2
+        ld1             {v2.8b,v3.8b},  [x2],  x3
+        ext             v3.8b,  v2.8b,  v3.8b, #1
+        umull           v4.8h,  v2.8b,  v1.8b
+        umlal           v4.8h,  v3.8b,  v0.8b
+        ld1             {v6.8b,v7.8b},  [x2],  x3
+        ext             v7.8b,  v6.8b,  v7.8b, #1
+        umull           v16.8h, v6.8b,  v1.8b
+        umlal           v16.8h, v7.8b,  v0.8b
+        rshrn           v4.8b,  v4.8h,  #3
+        rshrn           v16.8b, v16.8h, #3
+        st1             {v4.8b},  [x0], x1
+        st1             {v16.8b}, [x0], x1
+        b.gt            1b
+
+        ret
+endfunc
+
+function ff_put_vp8_bilin8_v_neon, export=1
+        mov             w7,      #8
+        dup             v0.8b,   w6
+        sub             w6,      w7,    w6
+        dup             v1.8b,   w6
+
+        ld1             {v2.8b}, [x2],  x3
+1:
+        subs            w4,      w4,    #2
+        ld1             {v3.8b}, [x2],  x3
+        umull           v4.8h,   v2.8b, v1.8b
+        umlal           v4.8h,   v3.8b, v0.8b
+        ld1             {v2.8b}, [x2],  x3
+        umull           v6.8h,   v3.8b, v1.8b
+        umlal           v6.8h,   v2.8b, v0.8b
+        rshrn           v4.8b,   v4.8h, #3
+        rshrn           v6.8b,   v6.8h, #3
+        st1             {v4.8b}, [x0],  x1
+        st1             {v6.8b}, [x0],  x1
+        b.gt            1b
+
+        ret
+endfunc
+
+function ff_put_vp8_bilin8_hv_neon, export=1
+        mov             w7,     #8
+        dup             v0.8b,  w5             // mx
+        sub             w5,     w7,     w5
+        dup             v1.8b,  w5
+        dup             v2.8b,  w6             // my
+        sub             w6,     w7,     w6
+        dup             v3.8b,  w6
+
+        ld1             {v4.8b,v5.8b},  [x2],  x3
+        ext             v5.8b,  v4.8b,  v5.8b, #1
+        umull           v18.8h, v4.8b,  v1.8b
+        umlal           v18.8h, v5.8b,  v0.8b
+        rshrn           v22.8b, v18.8h, #3
+1:
+        subs            w4,     w4,     #2
+        ld1             {v6.8b,v7.8b},  [x2],  x3
+        ext             v7.8b,  v6.8b,  v7.8b, #1
+        umull           v16.8h, v6.8b,  v1.8b
+        umlal           v16.8h, v7.8b,  v0.8b
+        ld1             {v4.8b,v5.8b},  [x2],  x3
+        ext             v5.8b,  v4.8b,  v5.8b, #1
+        umull           v18.8h, v4.8b,  v1.8b
+        umlal           v18.8h, v5.8b,  v0.8b
+        rshrn           v16.8b, v16.8h, #3
+        umull           v20.8h, v22.8b, v3.8b
+        umlal           v20.8h, v16.8b, v2.8b
+        rshrn           v22.8b, v18.8h, #3
+        umull           v24.8h, v16.8b, v3.8b
+        umlal           v24.8h, v22.8b, v2.8b
+        rshrn           v20.8b, v20.8h, #3
+        st1             {v20.8b}, [x0], x1
+        rshrn           v23.8b, v24.8h, #3
+        st1             {v23.8b}, [x0], x1
+        b.gt            1b
+
+        ret
+endfunc
+
+function ff_put_vp8_bilin4_h_neon, export=1
+        mov             w7,      #8
+        dup             v0.8b,   w5
+        sub             w5,      w7,     w5
+        dup             v1.8b,   w5
+1:
+        subs            w4,      w4,     #2
+        ld1             {v2.8b}, [x2],   x3
+        ext             v3.8b,   v2.8b,  v3.8b,  #1
+        ld1             {v6.8b}, [x2],   x3
+        ext             v7.8b,   v6.8b,  v7.8b,  #1
+        trn1            v2.2s,   v2.2s,  v6.2s
+        trn1            v3.2s,   v3.2s,  v7.2s
+        umull           v4.8h,   v2.8b,  v1.8b
+        umlal           v4.8h,   v3.8b,  v0.8b
+        rshrn           v4.8b,   v4.8h,  #3
+        st1             {v4.s}[0], [x0], x1
+        st1             {v4.s}[1], [x0], x1
+        b.gt            1b
+
+        ret
+endfunc
+
+function ff_put_vp8_bilin4_v_neon, export=1
+        mov             w7,     #8
+        dup             v0.8b,  w6
+        sub             w6,     w7,  w6
+        dup             v1.8b,  w6
+
+        ld1r            {v2.2s},    [x2], x3
+1:
+        ld1r            {v3.2s},   [x2]
+        ld1             {v2.s}[1], [x2], x3
+        ld1             {v3.s}[1], [x2], x3
+        umull           v4.8h,  v2.8b,  v1.8b
+        umlal           v4.8h,  v3.8b,  v0.8b
+        trn2            v2.2s,  v3.2s,  v2.2s
+        rshrn           v4.8b,  v4.8h,  #3
+        st1             {v4.s}[0], [x0], x1
+        st1             {v4.s}[1], [x0], x1
+        subs            w4,     w4,     #2
+        b.gt            1b
+
+        ret
+endfunc
+
+function ff_put_vp8_bilin4_hv_neon, export=1
+        mov             w7,      #8
+        dup             v0.8b,   w5             // mx
+        sub             w5,      w7,     w5
+        dup             v1.8b,   w5
+        dup             v2.8b,   w6             // my
+        sub             w6,      w7,     w6
+        dup             v3.8b,   w6
+
+        ld1             {v4.8b}, [x2],   x3
+        ext             v5.8b,   v4.8b,  v4.8b,  #1
+        umull           v18.8h,  v4.8b,  v1.8b
+        umlal           v18.8h,  v5.8b,  v0.8b
+        rshrn           v22.8b,  v18.8h, #3
+1:
+        subs            w4,      w4,     #2
+        ld1             {v6.8b}, [x2],   x3
+        ext             v7.8b,   v6.8b,  v6.8b,  #1
+        ld1             {v4.8b}, [x2],   x3
+        ext             v5.8b,   v4.8b,  v4.8b,  #1
+        trn1            v6.2s,   v6.2s,  v4.2s
+        trn1            v7.2s,   v7.2s,  v5.2s
+        umull           v16.8h,  v6.8b,  v1.8b
+        umlal           v16.8h,  v7.8b,  v0.8b
+        rshrn           v16.8b,  v16.8h, #3
+        umull           v20.8h,  v16.8b, v2.8b
+        trn1            v22.2s,  v22.2s, v16.2s
+        umlal           v20.8h,  v22.8b, v3.8b
+        rev64           v22.2s,  v16.2s
+        rshrn           v20.8b,  v20.8h, #3
+        st1             {v20.s}[0], [x0], x1
+        st1             {v20.s}[1], [x0], x1
+        b.gt            1b
+
+        ret
+endfunc
diff --git a/libavcodec/aarch64/vp9mc_16bpp_neon.S b/libavcodec/aarch64/vp9mc_16bpp_neon.S
index cac6428..53b372c 100644
--- a/libavcodec/aarch64/vp9mc_16bpp_neon.S
+++ b/libavcodec/aarch64/vp9mc_16bpp_neon.S
@@ -25,31 +25,6 @@
 //                            const uint8_t *ref, ptrdiff_t ref_stride,
 //                            int h, int mx, int my);
 
-function ff_vp9_copy128_aarch64, export=1
-1:
-        ldp             x5,  x6,  [x2]
-        ldp             x7,  x8,  [x2, #16]
-        stp             x5,  x6,  [x0]
-        ldp             x9,  x10, [x2, #32]
-        stp             x7,  x8,  [x0, #16]
-        subs            w4,  w4,  #1
-        ldp             x11, x12, [x2, #48]
-        stp             x9,  x10, [x0, #32]
-        stp             x11, x12, [x0, #48]
-        ldp             x5,  x6,  [x2, #64]
-        ldp             x7,  x8,  [x2, #80]
-        stp             x5,  x6,  [x0, #64]
-        ldp             x9,  x10, [x2, #96]
-        stp             x7,  x8,  [x0, #80]
-        ldp             x11, x12, [x2, #112]
-        stp             x9,  x10, [x0, #96]
-        stp             x11, x12, [x0, #112]
-        add             x2,  x2,  x3
-        add             x0,  x0,  x1
-        b.ne            1b
-        ret
-endfunc
-
 function ff_vp9_avg64_16_neon, export=1
         mov             x5,  x0
         sub             x1,  x1,  #64
diff --git a/libavcodec/aarch64/vp9mc_aarch64.S b/libavcodec/aarch64/vp9mc_aarch64.S
new file mode 100644
index 0000000..f17a8cf
--- /dev/null
+++ b/libavcodec/aarch64/vp9mc_aarch64.S
@@ -0,0 +1,81 @@
+/*
+ * Copyright (c) 2016 Google Inc.
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "libavutil/aarch64/asm.S"
+
+// All public functions in this file have the following signature:
+// typedef void (*vp9_mc_func)(uint8_t *dst, ptrdiff_t dst_stride,
+//                            const uint8_t *ref, ptrdiff_t ref_stride,
+//                            int h, int mx, int my);
+
+function ff_vp9_copy128_aarch64, export=1
+1:
+        ldp             x5,  x6,  [x2]
+        ldp             x7,  x8,  [x2, #16]
+        stp             x5,  x6,  [x0]
+        ldp             x9,  x10, [x2, #32]
+        stp             x7,  x8,  [x0, #16]
+        subs            w4,  w4,  #1
+        ldp             x11, x12, [x2, #48]
+        stp             x9,  x10, [x0, #32]
+        stp             x11, x12, [x0, #48]
+        ldp             x5,  x6,  [x2, #64]
+        ldp             x7,  x8,  [x2, #80]
+        stp             x5,  x6,  [x0, #64]
+        ldp             x9,  x10, [x2, #96]
+        stp             x7,  x8,  [x0, #80]
+        ldp             x11, x12, [x2, #112]
+        stp             x9,  x10, [x0, #96]
+        stp             x11, x12, [x0, #112]
+        add             x2,  x2,  x3
+        add             x0,  x0,  x1
+        b.ne            1b
+        ret
+endfunc
+
+function ff_vp9_copy64_aarch64, export=1
+1:
+        ldp             x5,  x6,  [x2]
+        ldp             x7,  x8,  [x2, #16]
+        stp             x5,  x6,  [x0]
+        ldp             x9,  x10, [x2, #32]
+        stp             x7,  x8,  [x0, #16]
+        subs            w4,  w4,  #1
+        ldp             x11, x12, [x2, #48]
+        stp             x9,  x10, [x0, #32]
+        stp             x11, x12, [x0, #48]
+        add             x2,  x2,  x3
+        add             x0,  x0,  x1
+        b.ne            1b
+        ret
+endfunc
+
+function ff_vp9_copy32_aarch64, export=1
+1:
+        ldp             x5,  x6,  [x2]
+        ldp             x7,  x8,  [x2, #16]
+        stp             x5,  x6,  [x0]
+        subs            w4,  w4,  #1
+        stp             x7,  x8,  [x0, #16]
+        add             x2,  x2,  x3
+        add             x0,  x0,  x1
+        b.ne            1b
+        ret
+endfunc
diff --git a/libavcodec/aarch64/vp9mc_neon.S b/libavcodec/aarch64/vp9mc_neon.S
index f67624c..abf2bae 100644
--- a/libavcodec/aarch64/vp9mc_neon.S
+++ b/libavcodec/aarch64/vp9mc_neon.S
@@ -25,23 +25,6 @@
 //                            const uint8_t *ref, ptrdiff_t ref_stride,
 //                            int h, int mx, int my);
 
-function ff_vp9_copy64_aarch64, export=1
-1:
-        ldp             x5,  x6,  [x2]
-        ldp             x7,  x8,  [x2, #16]
-        stp             x5,  x6,  [x0]
-        ldp             x9,  x10, [x2, #32]
-        stp             x7,  x8,  [x0, #16]
-        subs            w4,  w4,  #1
-        ldp             x11, x12, [x2, #48]
-        stp             x9,  x10, [x0, #32]
-        stp             x11, x12, [x0, #48]
-        add             x2,  x2,  x3
-        add             x0,  x0,  x1
-        b.ne            1b
-        ret
-endfunc
-
 function ff_vp9_avg64_neon, export=1
         mov             x5,  x0
 1:
@@ -64,19 +47,6 @@
         ret
 endfunc
 
-function ff_vp9_copy32_aarch64, export=1
-1:
-        ldp             x5,  x6,  [x2]
-        ldp             x7,  x8,  [x2, #16]
-        stp             x5,  x6,  [x0]
-        subs            w4,  w4,  #1
-        stp             x7,  x8,  [x0, #16]
-        add             x2,  x2,  x3
-        add             x0,  x0,  x1
-        b.ne            1b
-        ret
-endfunc
-
 function ff_vp9_avg32_neon, export=1
 1:
         ld1             {v2.16b, v3.16b},  [x2], x3
diff --git a/libavcodec/aasc.c b/libavcodec/aasc.c
index 58cc3c8..26570f4 100644
--- a/libavcodec/aasc.c
+++ b/libavcodec/aasc.c
@@ -91,7 +91,7 @@
         return AVERROR_INVALIDDATA;
     }
 
-    if ((ret = ff_reget_buffer(avctx, s->frame)) < 0)
+    if ((ret = ff_reget_buffer(avctx, s->frame, 0)) < 0)
         return ret;
 
     compr     = AV_RL32(buf);
diff --git a/libavcodec/ac3_parser.c b/libavcodec/ac3_parser.c
index 1e203ae..ba17165 100644
--- a/libavcodec/ac3_parser.c
+++ b/libavcodec/ac3_parser.c
@@ -201,6 +201,12 @@
     AC3HeaderInfo hdr;
     GetBitContext gbc;
 
+    if (tmp.u8[1] == 0x77 && tmp.u8[2] == 0x0b) {
+        FFSWAP(uint8_t, tmp.u8[1], tmp.u8[2]);
+        FFSWAP(uint8_t, tmp.u8[3], tmp.u8[4]);
+        FFSWAP(uint8_t, tmp.u8[5], tmp.u8[6]);
+    }
+
     init_get_bits(&gbc, tmp.u8+8-AC3_HEADER_SIZE, 54);
     err = ff_ac3_parse_header(&gbc, &hdr);
 
diff --git a/libavcodec/ac3dec.c b/libavcodec/ac3dec.c
index 43b22b7..eaa327a 100644
--- a/libavcodec/ac3dec.c
+++ b/libavcodec/ac3dec.c
@@ -452,7 +452,7 @@
         prevexp += dexp[i] - 2;
         if (prevexp > 24U) {
             av_log(s->avctx, AV_LOG_ERROR, "exponent %d is out-of-range\n", prevexp);
-            return -1;
+            return AVERROR_INVALIDDATA;
         }
         switch (group_size) {
         case 4: dexps[j++] = prevexp;
@@ -1467,7 +1467,8 @@
     int buf_size, full_buf_size = avpkt->size;
     AC3DecodeContext *s = avctx->priv_data;
     int blk, ch, err, offset, ret;
-    int got_independent_frame = 0;
+    int i;
+    int skip = 0, got_independent_frame = 0;
     const uint8_t *channel_map;
     uint8_t extended_channel_map[EAC3_MAX_CHANNELS];
     const SHORTFLOAT *output[AC3_MAX_CHANNELS];
@@ -1477,6 +1478,23 @@
     s->superframe_size = 0;
 
     buf_size = full_buf_size;
+    for (i = 1; i < buf_size; i += 2) {
+        if (buf[i] == 0x77 || buf[i] == 0x0B) {
+            if ((buf[i] ^ buf[i-1]) == (0x77 ^ 0x0B)) {
+                i--;
+                break;
+            } else if ((buf[i] ^ buf[i+1]) == (0x77 ^ 0x0B)) {
+                break;
+            }
+        }
+    }
+    if (i >= buf_size)
+        return AVERROR_INVALIDDATA;
+    if (i > 10)
+        return i;
+    buf += i;
+    buf_size -= i;
+
     /* copy input buffer to decoder context to avoid reading past the end
        of the buffer, which can be caused by a damaged input stream. */
     if (buf_size >= 2 && AV_RB16(buf) == 0x770B) {
@@ -1637,6 +1655,11 @@
         AC3HeaderInfo hdr;
         int err;
 
+        if (buf_size - s->frame_size <= 16) {
+            skip = buf_size - s->frame_size;
+            goto skip;
+        }
+
         if ((ret = init_get_bits8(&s->gbc, buf + s->frame_size, buf_size - s->frame_size)) < 0)
             return ret;
 
@@ -1657,6 +1680,7 @@
             }
         }
     }
+skip:
 
     frame->decode_error_flags = err ? FF_DECODE_ERROR_INVALID_BITSTREAM : 0;
 
@@ -1796,9 +1820,9 @@
     *got_frame_ptr = 1;
 
     if (!s->superframe_size)
-        return FFMIN(full_buf_size, s->frame_size);
+        return FFMIN(full_buf_size, s->frame_size + skip);
 
-    return FFMIN(full_buf_size, s->superframe_size);
+    return FFMIN(full_buf_size, s->superframe_size + skip);
 }
 
 /**
diff --git a/libavcodec/ac3dec_fixed.c b/libavcodec/ac3dec_fixed.c
index bd66175..1e1edc8 100644
--- a/libavcodec/ac3dec_fixed.c
+++ b/libavcodec/ac3dec_fixed.c
@@ -107,29 +107,30 @@
       }
     } else {
       shift = -shift;
+      mul <<= shift;
       for (i=0; i<len; i+=8) {
 
           temp = src[i] * mul;
           temp1 = src[i+1] * mul;
           temp2 = src[i+2] * mul;
 
-          dst[i] = temp << shift;
+          dst[i] = temp;
           temp3 = src[i+3] * mul;
 
-          dst[i+1] = temp1 << shift;
+          dst[i+1] = temp1;
           temp4 = src[i + 4] * mul;
-          dst[i+2] = temp2 << shift;
+          dst[i+2] = temp2;
 
           temp5 = src[i+5] * mul;
-          dst[i+3] = temp3 << shift;
+          dst[i+3] = temp3;
           temp6 = src[i+6] * mul;
 
-          dst[i+4] = temp4 << shift;
+          dst[i+4] = temp4;
           temp7 = src[i+7] * mul;
 
-          dst[i+5] = temp5 << shift;
-          dst[i+6] = temp6 << shift;
-          dst[i+7] = temp7 << shift;
+          dst[i+5] = temp5;
+          dst[i+6] = temp6;
+          dst[i+7] = temp7;
 
       }
     }
diff --git a/libavcodec/ac3enc.c b/libavcodec/ac3enc.c
index 636ca72..7ce17db 100644
--- a/libavcodec/ac3enc.c
+++ b/libavcodec/ac3enc.c
@@ -652,7 +652,7 @@
  */
 static void count_frame_bits_fixed(AC3EncodeContext *s)
 {
-    static const int frame_bits_inc[8] = { 0, 0, 2, 2, 2, 4, 2, 4 };
+    static const uint8_t frame_bits_inc[8] = { 0, 0, 2, 2, 2, 4, 2, 4 };
     int blk;
     int frame_bits;
 
@@ -1065,7 +1065,7 @@
 {
     int blk, ch;
 
-    snr_offset = (snr_offset - 240) << 2;
+    snr_offset = (snr_offset - 240) * 4;
 
     reset_block_bap(s);
     for (blk = 0; blk < s->num_blocks; blk++) {
@@ -1800,7 +1800,7 @@
             break;
     }
     if (i == v_list_size)
-        return -1;
+        return AVERROR(EINVAL);
 
     return i;
 }
@@ -1993,12 +1993,11 @@
     /* set bitstream id for alternate bitstream syntax */
     if (!s->eac3 && (opt->extended_bsi_1 || opt->extended_bsi_2)) {
         if (s->bitstream_id > 8 && s->bitstream_id < 11) {
-            static int warn_once = 1;
-            if (warn_once) {
+            if (!s->warned_alternate_bitstream) {
                 av_log(avctx, AV_LOG_WARNING, "alternate bitstream syntax is "
                        "not compatible with reduced samplerates. writing of "
                        "extended bitstream information will be disabled.\n");
-                warn_once = 0;
+                s->warned_alternate_bitstream = 1;
             }
         } else {
             s->bitstream_id = 6;
@@ -2051,7 +2050,8 @@
         av_freep(&block->cpl_coord_mant);
     }
 
-    s->mdct_end(s);
+    if (s->mdct_end)
+        s->mdct_end(s);
 
     return 0;
 }
@@ -2433,7 +2433,7 @@
 
     ret = validate_options(s);
     if (ret)
-        return ret;
+        goto init_fail;
 
     avctx->frame_size = AC3_BLOCK_SIZE * s->num_blocks;
     avctx->initial_padding = AC3_BLOCK_SIZE;
diff --git a/libavcodec/ac3enc.h b/libavcodec/ac3enc.h
index a2442d0..1e4a740 100644
--- a/libavcodec/ac3enc.h
+++ b/libavcodec/ac3enc.h
@@ -255,6 +255,8 @@
     uint8_t *ref_bap     [AC3_MAX_CHANNELS][AC3_MAX_BLOCKS]; ///< bit allocation pointers (bap)
     int ref_bap_set;                                         ///< indicates if ref_bap pointers have been set
 
+    int warned_alternate_bitstream;
+
     /* fixed vs. float function pointers */
     void (*mdct_end)(struct AC3EncodeContext *s);
     int  (*mdct_init)(struct AC3EncodeContext *s);
diff --git a/libavcodec/ac3enc_fixed.c b/libavcodec/ac3enc_fixed.c
index b23fc64..e57d035 100644
--- a/libavcodec/ac3enc_fixed.c
+++ b/libavcodec/ac3enc_fixed.c
@@ -155,6 +155,7 @@
     .sample_fmts     = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_S16P,
                                                       AV_SAMPLE_FMT_NONE },
     .priv_class      = &ac3enc_class,
+    .supported_samplerates = ff_ac3_sample_rate_tab,
     .channel_layouts = ff_ac3_channel_layouts,
     .defaults        = ac3_defaults,
 };
diff --git a/libavcodec/ac3enc_float.c b/libavcodec/ac3enc_float.c
index d6e658b..1f3111a 100644
--- a/libavcodec/ac3enc_float.c
+++ b/libavcodec/ac3enc_float.c
@@ -150,6 +150,7 @@
     .sample_fmts     = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_FLTP,
                                                       AV_SAMPLE_FMT_NONE },
     .priv_class      = &ac3enc_class,
+    .supported_samplerates = ff_ac3_sample_rate_tab,
     .channel_layouts = ff_ac3_channel_layouts,
     .defaults        = ac3_defaults,
 };
diff --git a/libavcodec/ac3tab.c b/libavcodec/ac3tab.c
index bd88f32..ef2a41b 100644
--- a/libavcodec/ac3tab.c
+++ b/libavcodec/ac3tab.c
@@ -126,7 +126,7 @@
 };
 
 /* possible frequencies */
-const uint16_t ff_ac3_sample_rate_tab[3] = { 48000, 44100, 32000 };
+const int ff_ac3_sample_rate_tab[] = { 48000, 44100, 32000, 0 };
 
 /* possible bitrates */
 const uint16_t ff_ac3_bitrate_tab[19] = {
diff --git a/libavcodec/ac3tab.h b/libavcodec/ac3tab.h
index aa71acb..1d1264e 100644
--- a/libavcodec/ac3tab.h
+++ b/libavcodec/ac3tab.h
@@ -33,7 +33,7 @@
 extern av_export_avcodec const uint16_t avpriv_ac3_channel_layout_tab[8];
 extern const uint8_t  ff_ac3_enc_channel_map[8][2][6];
 extern const uint8_t  ff_ac3_dec_channel_map[8][2][6];
-extern const uint16_t ff_ac3_sample_rate_tab[3];
+extern const int      ff_ac3_sample_rate_tab[];
 extern const uint16_t ff_ac3_bitrate_tab[19];
 extern const uint8_t  ff_ac3_rematrix_band_tab[5];
 extern const uint8_t  ff_eac3_default_cpl_band_struct[18];
diff --git a/libavcodec/acelp_pitch_delay.c b/libavcodec/acelp_pitch_delay.c
index c345a99..a070d1b 100644
--- a/libavcodec/acelp_pitch_delay.c
+++ b/libavcodec/acelp_pitch_delay.c
@@ -118,7 +118,7 @@
                (mr_energy >> 15) - 25
            );
 #else
-    mr_energy = gain_corr_factor * exp(M_LN10 / (20 << 23) * mr_energy) /
+    mr_energy = gain_corr_factor * ff_exp10((double)mr_energy / (20 << 23)) /
                 sqrt(adsp->scalarproduct_int16(fc_v, fc_v, subframe_size));
     return mr_energy >> 12;
 #endif
diff --git a/libavcodec/adpcm.c b/libavcodec/adpcm.c
index cd3bbd3..9ea6a26 100644
--- a/libavcodec/adpcm.c
+++ b/libavcodec/adpcm.c
@@ -12,6 +12,10 @@
  * EA ADPCM XAS decoder by Peter Ross (pross@xvid.org)
  * MAXIS EA ADPCM decoder by Robert Marston (rmarston@gmail.com)
  * THP ADPCM decoder by Marco Gerards (mgerards@xs4all.nl)
+ * Argonaut Games ADPCM decoder by Zane van Iperen (zane@zanevaniperen.com)
+ * Simon & Schuster Interactive ADPCM decoder by Zane van Iperen (zane@zanevaniperen.com)
+ * Ubisoft ADPCM decoder by Zane van Iperen (zane@zanevaniperen.com)
+ * High Voltage Software ALP decoder by Zane van Iperen (zane@zanevaniperen.com)
  *
  * This file is part of FFmpeg.
  *
@@ -57,7 +61,7 @@
  */
 
 /* These are for CD-ROM XA ADPCM */
-static const int xa_adpcm_table[5][2] = {
+static const int8_t xa_adpcm_table[5][2] = {
     {   0,   0 },
     {  60,   0 },
     { 115, -52 },
@@ -65,7 +69,7 @@
     { 122, -60 }
 };
 
-static const int ea_adpcm_table[] = {
+static const int16_t ea_adpcm_table[] = {
     0,  240,  460,  392,
     0,    0, -208, -220,
     0,    1,    3,    4,
@@ -74,13 +78,22 @@
 };
 
 // padded to zero where table size is less then 16
-static const int swf_index_tables[4][16] = {
+static const int8_t swf_index_tables[4][16] = {
     /*2*/ { -1, 2 },
     /*3*/ { -1, -1, 2, 4 },
     /*4*/ { -1, -1, -1, -1, 2, 4, 6, 8 },
     /*5*/ { -1, -1, -1, -1, -1, -1, -1, -1, 1, 2, 4, 6, 8, 10, 13, 16 }
 };
 
+static const int8_t zork_index_table[8] = {
+    -1, -1, -1, 1, 4, 7, 10, 12,
+};
+
+static const int8_t mtf_index_table[16] = {
+     8,  6,  4,  2, -1, -1, -1, -1,
+    -1, -1, -1, -1,  2,  4,  6,  8,
+};
+
 /* end of tables */
 
 typedef struct ADPCMDecodeContext {
@@ -105,11 +118,16 @@
     case AV_CODEC_ID_ADPCM_EA_R2:
     case AV_CODEC_ID_ADPCM_EA_R3:
     case AV_CODEC_ID_ADPCM_EA_XAS:
+    case AV_CODEC_ID_ADPCM_MS:
         max_channels = 6;
         break;
     case AV_CODEC_ID_ADPCM_MTAF:
         min_channels = 2;
         max_channels = 8;
+        if (avctx->channels & 1) {
+            avpriv_request_sample(avctx, "channel count %d\n", avctx->channels);
+            return AVERROR_PATCHWELCOME;
+        }
         break;
     case AV_CODEC_ID_ADPCM_PSX:
         max_channels = 8;
@@ -135,48 +153,113 @@
         break;
     case AV_CODEC_ID_ADPCM_IMA_APC:
         if (avctx->extradata && avctx->extradata_size >= 8) {
-            c->status[0].predictor = AV_RL32(avctx->extradata);
-            c->status[1].predictor = AV_RL32(avctx->extradata + 4);
+            c->status[0].predictor = av_clip_intp2(AV_RL32(avctx->extradata    ), 18);
+            c->status[1].predictor = av_clip_intp2(AV_RL32(avctx->extradata + 4), 18);
+        }
+        break;
+    case AV_CODEC_ID_ADPCM_IMA_APM:
+        if (avctx->extradata && avctx->extradata_size >= 16) {
+            c->status[0].predictor  = AV_RL32(avctx->extradata +  0);
+            c->status[0].step_index = av_clip(AV_RL32(avctx->extradata +  4), 0, 88);
+            c->status[1].predictor  = AV_RL32(avctx->extradata +  8);
+            c->status[1].step_index = av_clip(AV_RL32(avctx->extradata + 12), 0, 88);
         }
         break;
     case AV_CODEC_ID_ADPCM_IMA_WS:
         if (avctx->extradata && avctx->extradata_size >= 2)
             c->vqa_version = AV_RL16(avctx->extradata);
         break;
+    case AV_CODEC_ID_ADPCM_ARGO:
+        if (avctx->bits_per_coded_sample != 4)
+            return AVERROR_INVALIDDATA;
+        break;
+    case AV_CODEC_ID_ADPCM_ZORK:
+        if (avctx->bits_per_coded_sample != 8)
+            return AVERROR_INVALIDDATA;
+        break;
     default:
         break;
     }
 
-    switch(avctx->codec->id) {
-        case AV_CODEC_ID_ADPCM_AICA:
-        case AV_CODEC_ID_ADPCM_IMA_DAT4:
-        case AV_CODEC_ID_ADPCM_IMA_QT:
-        case AV_CODEC_ID_ADPCM_IMA_WAV:
-        case AV_CODEC_ID_ADPCM_4XM:
-        case AV_CODEC_ID_ADPCM_XA:
-        case AV_CODEC_ID_ADPCM_EA_R1:
-        case AV_CODEC_ID_ADPCM_EA_R2:
-        case AV_CODEC_ID_ADPCM_EA_R3:
-        case AV_CODEC_ID_ADPCM_EA_XAS:
-        case AV_CODEC_ID_ADPCM_THP:
-        case AV_CODEC_ID_ADPCM_THP_LE:
-        case AV_CODEC_ID_ADPCM_AFC:
-        case AV_CODEC_ID_ADPCM_DTK:
-        case AV_CODEC_ID_ADPCM_PSX:
-        case AV_CODEC_ID_ADPCM_MTAF:
-            avctx->sample_fmt = AV_SAMPLE_FMT_S16P;
-            break;
-        case AV_CODEC_ID_ADPCM_IMA_WS:
-            avctx->sample_fmt = c->vqa_version == 3 ? AV_SAMPLE_FMT_S16P :
-                                                      AV_SAMPLE_FMT_S16;
-            break;
-        default:
-            avctx->sample_fmt = AV_SAMPLE_FMT_S16;
+    switch (avctx->codec->id) {
+    case AV_CODEC_ID_ADPCM_AICA:
+    case AV_CODEC_ID_ADPCM_IMA_DAT4:
+    case AV_CODEC_ID_ADPCM_IMA_QT:
+    case AV_CODEC_ID_ADPCM_IMA_WAV:
+    case AV_CODEC_ID_ADPCM_4XM:
+    case AV_CODEC_ID_ADPCM_XA:
+    case AV_CODEC_ID_ADPCM_EA_R1:
+    case AV_CODEC_ID_ADPCM_EA_R2:
+    case AV_CODEC_ID_ADPCM_EA_R3:
+    case AV_CODEC_ID_ADPCM_EA_XAS:
+    case AV_CODEC_ID_ADPCM_THP:
+    case AV_CODEC_ID_ADPCM_THP_LE:
+    case AV_CODEC_ID_ADPCM_AFC:
+    case AV_CODEC_ID_ADPCM_DTK:
+    case AV_CODEC_ID_ADPCM_PSX:
+    case AV_CODEC_ID_ADPCM_MTAF:
+    case AV_CODEC_ID_ADPCM_ARGO:
+        avctx->sample_fmt = AV_SAMPLE_FMT_S16P;
+        break;
+    case AV_CODEC_ID_ADPCM_IMA_WS:
+        avctx->sample_fmt = c->vqa_version == 3 ? AV_SAMPLE_FMT_S16P :
+                                                  AV_SAMPLE_FMT_S16;
+        break;
+    case AV_CODEC_ID_ADPCM_MS:
+        avctx->sample_fmt = avctx->channels > 2 ? AV_SAMPLE_FMT_S16P :
+                                                  AV_SAMPLE_FMT_S16;
+        break;
+    default:
+        avctx->sample_fmt = AV_SAMPLE_FMT_S16;
     }
 
     return 0;
 }
 
+static inline int16_t adpcm_agm_expand_nibble(ADPCMChannelStatus *c, int8_t nibble)
+{
+    int delta, pred, step, add;
+
+    pred = c->predictor;
+    delta = nibble & 7;
+    step = c->step;
+    add = (delta * 2 + 1) * step;
+    if (add < 0)
+        add = add + 7;
+
+    if ((nibble & 8) == 0)
+        pred = av_clip(pred + (add >> 3), -32767, 32767);
+    else
+        pred = av_clip(pred - (add >> 3), -32767, 32767);
+
+    switch (delta) {
+    case 7:
+        step *= 0x99;
+        break;
+    case 6:
+        c->step = av_clip(c->step * 2, 127, 24576);
+        c->predictor = pred;
+        return pred;
+    case 5:
+        step *= 0x66;
+        break;
+    case 4:
+        step *= 0x4d;
+        break;
+    default:
+        step *= 0x39;
+        break;
+    }
+
+    if (step < 0)
+        step += 0x3f;
+
+    c->step = step >> 6;
+    c->step = av_clip(c->step, 127, 24576);
+    c->predictor = pred;
+    return pred;
+}
+
 static inline int16_t adpcm_ima_expand_nibble(ADPCMChannelStatus *c, int8_t nibble, int shift)
 {
     int step_index;
@@ -203,6 +286,45 @@
     return (int16_t)c->predictor;
 }
 
+static inline int16_t adpcm_ima_alp_expand_nibble(ADPCMChannelStatus *c, int8_t nibble, int shift)
+{
+    int step_index;
+    int predictor;
+    int sign, delta, diff, step;
+
+    step = ff_adpcm_step_table[c->step_index];
+    step_index = c->step_index + ff_adpcm_index_table[(unsigned)nibble];
+    step_index = av_clip(step_index, 0, 88);
+
+    sign = nibble & 8;
+    delta = nibble & 7;
+    diff = (delta * step) >> shift;
+    predictor = c->predictor;
+    if (sign) predictor -= diff;
+    else predictor += diff;
+
+    c->predictor = av_clip_int16(predictor);
+    c->step_index = step_index;
+
+    return (int16_t)c->predictor;
+}
+
+static inline int16_t adpcm_ima_mtf_expand_nibble(ADPCMChannelStatus *c, int nibble)
+{
+    int step_index, step, delta, predictor;
+
+    step = ff_adpcm_step_table[c->step_index];
+
+    delta = step * (2 * nibble - 15);
+    predictor = c->predictor + delta;
+
+    step_index = c->step_index + mtf_index_table[(unsigned)nibble];
+    c->predictor = av_clip_int16(predictor >> 4);
+    c->step_index = av_clip(step_index, 0, 88);
+
+    return (int16_t)c->predictor;
+}
+
 static inline int16_t adpcm_ima_wav_expand_nibble(ADPCMChannelStatus *c, GetBitContext *gb, int bps)
 {
     int nibble, step_index, predictor, sign, delta, diff, step, shift;
@@ -226,7 +348,7 @@
     return (int16_t)c->predictor;
 }
 
-static inline int adpcm_ima_qt_expand_nibble(ADPCMChannelStatus *c, int nibble, int shift)
+static inline int adpcm_ima_qt_expand_nibble(ADPCMChannelStatus *c, int nibble)
 {
     int step_index;
     int predictor;
@@ -289,7 +411,7 @@
     c->predictor = av_clip_intp2(predictor, 11);
     c->step_index = step_index;
 
-    return c->predictor << 4;
+    return c->predictor * 16;
 }
 
 static inline int16_t adpcm_ct_expand_nibble(ADPCMChannelStatus *c, int8_t nibble)
@@ -356,6 +478,41 @@
     return c->predictor;
 }
 
+static inline int16_t adpcm_zork_expand_nibble(ADPCMChannelStatus *c, uint8_t nibble)
+{
+    int16_t index = c->step_index;
+    uint32_t lookup_sample = ff_adpcm_step_table[index];
+    int32_t sample = 0;
+
+    if (nibble & 0x40)
+        sample += lookup_sample;
+    if (nibble & 0x20)
+        sample += lookup_sample >> 1;
+    if (nibble & 0x10)
+        sample += lookup_sample >> 2;
+    if (nibble & 0x08)
+        sample += lookup_sample >> 3;
+    if (nibble & 0x04)
+        sample += lookup_sample >> 4;
+    if (nibble & 0x02)
+        sample += lookup_sample >> 5;
+    if (nibble & 0x01)
+        sample += lookup_sample >> 6;
+    if (nibble & 0x80)
+        sample = -sample;
+
+    sample += c->predictor;
+    sample = av_clip_int16(sample);
+
+    index += zork_index_table[(nibble >> 4) & 7];
+    index = av_clip(index, 0, 88);
+
+    c->predictor = sample;
+    c->step_index = index;
+
+    return sample;
+}
+
 static int xa_decode(AVCodecContext *avctx, int16_t *out0, int16_t *out1,
                      const uint8_t *in, ADPCMChannelStatus *left,
                      ADPCMChannelStatus *right, int channels, int sample_offset)
@@ -388,7 +545,7 @@
             d = in[16+i+j*4];
 
             t = sign_extend(d, 4);
-            s = ( t<<shift ) + ((s_1*f0 + s_2*f1+32)>>6);
+            s = t*(1<<shift) + ((s_1*f0 + s_2*f1+32)>>6);
             s_2 = s_1;
             s_1 = av_clip_int16(s);
             out0[j] = s_1;
@@ -415,7 +572,7 @@
             d = in[16+i+j*4];
 
             t = sign_extend(d >> 4, 4);
-            s = ( t<<shift ) + ((s_1*f0 + s_2*f1+32)>>6);
+            s = t*(1<<shift) + ((s_1*f0 + s_2*f1+32)>>6);
             s_2 = s_1;
             s_1 = av_clip_int16(s);
             out1[j] = s_1;
@@ -440,7 +597,7 @@
 {
     ADPCMDecodeContext *c = avctx->priv_data;
     GetBitContext gb;
-    const int *table;
+    const int8_t *table;
     int k0, signmask, nb_bits, count;
     int size = buf_size*8;
     int i;
@@ -493,8 +650,25 @@
     }
 }
 
+static inline int16_t adpcm_argo_expand_nibble(ADPCMChannelStatus *cs, int nibble, int control, int shift)
+{
+    int sample = nibble * (1 << shift);
+
+    if (control & 0x04)
+        sample += (8 * cs->sample1) - (4 * cs->sample2);
+    else
+        sample += 4 * cs->sample1;
+
+    sample = av_clip_int16(sample >> 2);
+
+    cs->sample2 = cs->sample1;
+    cs->sample1 = sample;
+
+    return sample;
+}
+
 /**
- * Get the number of samples that will be decoded from the packet.
+ * Get the number of samples (per channel) that will be decoded from the packet.
  * In one case, this is actually the maximum number of samples possible to
  * decode with the given buf_size.
  *
@@ -531,6 +705,11 @@
             return 0;
         nb_samples = 64;
         break;
+    case AV_CODEC_ID_ADPCM_ARGO:
+        if (buf_size < 17 * ch)
+            return 0;
+        nb_samples = 32;
+        break;
     /* simple 4-bit adpcm */
     case AV_CODEC_ID_ADPCM_CT:
     case AV_CODEC_ID_ADPCM_IMA_APC:
@@ -539,6 +718,10 @@
     case AV_CODEC_ID_ADPCM_IMA_WS:
     case AV_CODEC_ID_ADPCM_YAMAHA:
     case AV_CODEC_ID_ADPCM_AICA:
+    case AV_CODEC_ID_ADPCM_IMA_SSI:
+    case AV_CODEC_ID_ADPCM_IMA_APM:
+    case AV_CODEC_ID_ADPCM_IMA_ALP:
+    case AV_CODEC_ID_ADPCM_IMA_MTF:
         nb_samples = buf_size * 2 / ch;
         break;
     }
@@ -549,6 +732,7 @@
     header_size = 0;
     switch (avctx->codec->id) {
         case AV_CODEC_ID_ADPCM_4XM:
+        case AV_CODEC_ID_ADPCM_AGM:
         case AV_CODEC_ID_ADPCM_IMA_DAT4:
         case AV_CODEC_ID_ADPCM_IMA_ISS:     header_size = 4 * ch;      break;
         case AV_CODEC_ID_ADPCM_IMA_AMV:     header_size = 8;           break;
@@ -696,6 +880,9 @@
     case AV_CODEC_ID_ADPCM_PSX:
         nb_samples = buf_size / (16 * ch) * 28;
         break;
+    case AV_CODEC_ID_ADPCM_ZORK:
+        nb_samples = buf_size / ch;
+        break;
     }
 
     /* validate coded sample count */
@@ -782,8 +969,8 @@
 
             for (m = 0; m < 64; m += 2) {
                 int byte = bytestream2_get_byteu(&gb);
-                samples[m    ] = adpcm_ima_qt_expand_nibble(cs, byte & 0x0F, 3);
-                samples[m + 1] = adpcm_ima_qt_expand_nibble(cs, byte >> 4  , 3);
+                samples[m    ] = adpcm_ima_qt_expand_nibble(cs, byte & 0x0F);
+                samples[m + 1] = adpcm_ima_qt_expand_nibble(cs, byte >> 4  );
             }
         }
         break;
@@ -863,46 +1050,82 @@
             }
         }
         break;
+    case AV_CODEC_ID_ADPCM_AGM:
+        for (i = 0; i < avctx->channels; i++)
+            c->status[i].predictor = sign_extend(bytestream2_get_le16u(&gb), 16);
+        for (i = 0; i < avctx->channels; i++)
+            c->status[i].step = sign_extend(bytestream2_get_le16u(&gb), 16);
+
+        for (n = 0; n < nb_samples >> (1 - st); n++) {
+            int v = bytestream2_get_byteu(&gb);
+            *samples++ = adpcm_agm_expand_nibble(&c->status[0], v & 0xF);
+            *samples++ = adpcm_agm_expand_nibble(&c->status[st], v >> 4 );
+        }
+        break;
     case AV_CODEC_ID_ADPCM_MS:
     {
         int block_predictor;
 
-        block_predictor = bytestream2_get_byteu(&gb);
-        if (block_predictor > 6) {
-            av_log(avctx, AV_LOG_ERROR, "ERROR: block_predictor[0] = %d\n",
-                   block_predictor);
-            return AVERROR_INVALIDDATA;
-        }
-        c->status[0].coeff1 = ff_adpcm_AdaptCoeff1[block_predictor];
-        c->status[0].coeff2 = ff_adpcm_AdaptCoeff2[block_predictor];
-        if (st) {
+        if (avctx->channels > 2) {
+            for (channel = 0; channel < avctx->channels; channel++) {
+                samples = samples_p[channel];
+                block_predictor = bytestream2_get_byteu(&gb);
+                if (block_predictor > 6) {
+                    av_log(avctx, AV_LOG_ERROR, "ERROR: block_predictor[%d] = %d\n",
+                           channel, block_predictor);
+                    return AVERROR_INVALIDDATA;
+                }
+                c->status[channel].coeff1 = ff_adpcm_AdaptCoeff1[block_predictor];
+                c->status[channel].coeff2 = ff_adpcm_AdaptCoeff2[block_predictor];
+                c->status[channel].idelta = sign_extend(bytestream2_get_le16u(&gb), 16);
+                c->status[channel].sample1 = sign_extend(bytestream2_get_le16u(&gb), 16);
+                c->status[channel].sample2 = sign_extend(bytestream2_get_le16u(&gb), 16);
+                *samples++ = c->status[channel].sample2;
+                *samples++ = c->status[channel].sample1;
+                for(n = (nb_samples - 2) >> 1; n > 0; n--) {
+                    int byte = bytestream2_get_byteu(&gb);
+                    *samples++ = adpcm_ms_expand_nibble(&c->status[channel], byte >> 4  );
+                    *samples++ = adpcm_ms_expand_nibble(&c->status[channel], byte & 0x0F);
+                }
+            }
+        } else {
             block_predictor = bytestream2_get_byteu(&gb);
             if (block_predictor > 6) {
-                av_log(avctx, AV_LOG_ERROR, "ERROR: block_predictor[1] = %d\n",
+                av_log(avctx, AV_LOG_ERROR, "ERROR: block_predictor[0] = %d\n",
                        block_predictor);
                 return AVERROR_INVALIDDATA;
             }
-            c->status[1].coeff1 = ff_adpcm_AdaptCoeff1[block_predictor];
-            c->status[1].coeff2 = ff_adpcm_AdaptCoeff2[block_predictor];
-        }
-        c->status[0].idelta = sign_extend(bytestream2_get_le16u(&gb), 16);
-        if (st){
-            c->status[1].idelta = sign_extend(bytestream2_get_le16u(&gb), 16);
-        }
+            c->status[0].coeff1 = ff_adpcm_AdaptCoeff1[block_predictor];
+            c->status[0].coeff2 = ff_adpcm_AdaptCoeff2[block_predictor];
+            if (st) {
+                block_predictor = bytestream2_get_byteu(&gb);
+                if (block_predictor > 6) {
+                    av_log(avctx, AV_LOG_ERROR, "ERROR: block_predictor[1] = %d\n",
+                           block_predictor);
+                    return AVERROR_INVALIDDATA;
+                }
+                c->status[1].coeff1 = ff_adpcm_AdaptCoeff1[block_predictor];
+                c->status[1].coeff2 = ff_adpcm_AdaptCoeff2[block_predictor];
+            }
+            c->status[0].idelta = sign_extend(bytestream2_get_le16u(&gb), 16);
+            if (st){
+                c->status[1].idelta = sign_extend(bytestream2_get_le16u(&gb), 16);
+            }
 
-        c->status[0].sample1 = sign_extend(bytestream2_get_le16u(&gb), 16);
-        if (st) c->status[1].sample1 = sign_extend(bytestream2_get_le16u(&gb), 16);
-        c->status[0].sample2 = sign_extend(bytestream2_get_le16u(&gb), 16);
-        if (st) c->status[1].sample2 = sign_extend(bytestream2_get_le16u(&gb), 16);
+            c->status[0].sample1 = sign_extend(bytestream2_get_le16u(&gb), 16);
+            if (st) c->status[1].sample1 = sign_extend(bytestream2_get_le16u(&gb), 16);
+            c->status[0].sample2 = sign_extend(bytestream2_get_le16u(&gb), 16);
+            if (st) c->status[1].sample2 = sign_extend(bytestream2_get_le16u(&gb), 16);
 
-        *samples++ = c->status[0].sample2;
-        if (st) *samples++ = c->status[1].sample2;
-        *samples++ = c->status[0].sample1;
-        if (st) *samples++ = c->status[1].sample1;
-        for(n = (nb_samples - 2) >> (1 - st); n > 0; n--) {
-            int byte = bytestream2_get_byteu(&gb);
-            *samples++ = adpcm_ms_expand_nibble(&c->status[0 ], byte >> 4  );
-            *samples++ = adpcm_ms_expand_nibble(&c->status[st], byte & 0x0F);
+            *samples++ = c->status[0].sample2;
+            if (st) *samples++ = c->status[1].sample2;
+            *samples++ = c->status[0].sample1;
+            if (st) *samples++ = c->status[1].sample1;
+            for(n = (nb_samples - 2) >> (1 - st); n > 0; n--) {
+                int byte = bytestream2_get_byteu(&gb);
+                *samples++ = adpcm_ms_expand_nibble(&c->status[0 ], byte >> 4  );
+                *samples++ = adpcm_ms_expand_nibble(&c->status[st], byte & 0x0F);
+            }
         }
         break;
     }
@@ -1048,14 +1271,41 @@
         }
         break;
     case AV_CODEC_ID_ADPCM_IMA_APC:
-        while (bytestream2_get_bytes_left(&gb) > 0) {
+        for (n = nb_samples >> (1 - st); n > 0; n--) {
             int v = bytestream2_get_byteu(&gb);
             *samples++ = adpcm_ima_expand_nibble(&c->status[0],  v >> 4  , 3);
             *samples++ = adpcm_ima_expand_nibble(&c->status[st], v & 0x0F, 3);
         }
         break;
+    case AV_CODEC_ID_ADPCM_IMA_SSI:
+        for (n = nb_samples >> (1 - st); n > 0; n--) {
+            int v = bytestream2_get_byteu(&gb);
+            *samples++ = adpcm_ima_qt_expand_nibble(&c->status[0],  v >> 4  );
+            *samples++ = adpcm_ima_qt_expand_nibble(&c->status[st], v & 0x0F);
+        }
+        break;
+    case AV_CODEC_ID_ADPCM_IMA_APM:
+        for (n = nb_samples / 2; n > 0; n--) {
+            for (channel = 0; channel < avctx->channels; channel++) {
+                int v = bytestream2_get_byteu(&gb);
+                *samples++  = adpcm_ima_qt_expand_nibble(&c->status[channel], v >> 4  );
+                samples[st] = adpcm_ima_qt_expand_nibble(&c->status[channel], v & 0x0F);
+            }
+            samples += avctx->channels;
+        }
+        break;
+    case AV_CODEC_ID_ADPCM_IMA_ALP:
+        for (n = nb_samples / 2; n > 0; n--) {
+            for (channel = 0; channel < avctx->channels; channel++) {
+                int v = bytestream2_get_byteu(&gb);
+                *samples++  = adpcm_ima_alp_expand_nibble(&c->status[channel], v >> 4  , 2);
+                samples[st] = adpcm_ima_alp_expand_nibble(&c->status[channel], v & 0x0F, 2);
+            }
+            samples += avctx->channels;
+        }
+        break;
     case AV_CODEC_ID_ADPCM_IMA_OKI:
-        while (bytestream2_get_bytes_left(&gb) > 0) {
+        for (n = nb_samples >> (1 - st); n > 0; n--) {
             int v = bytestream2_get_byteu(&gb);
             *samples++ = adpcm_ima_oki_expand_nibble(&c->status[0],  v >> 4  );
             *samples++ = adpcm_ima_oki_expand_nibble(&c->status[st], v & 0x0F);
@@ -1141,8 +1391,11 @@
                 return AVERROR_INVALIDDATA;
             }
         }
-        for (i=0; i<=st; i++)
+        for (i=0; i<=st; i++) {
             c->status[i].predictor  = bytestream2_get_le32u(&gb);
+            if (FFABS((int64_t)c->status[i].predictor) > (1<<16))
+                return AVERROR_INVALIDDATA;
+        }
 
         for (n = nb_samples >> (1 - st); n > 0; n--) {
             int byte   = bytestream2_get_byteu(&gb);
@@ -1189,8 +1442,8 @@
 
             for (count2 = 0; count2 < 28; count2++) {
                 byte = bytestream2_get_byteu(&gb);
-                next_left_sample  = sign_extend(byte >> 4, 4) << shift_left;
-                next_right_sample = sign_extend(byte,      4) << shift_right;
+                next_left_sample  = sign_extend(byte >> 4, 4) * (1 << shift_left);
+                next_right_sample = sign_extend(byte,      4) * (1 << shift_right);
 
                 next_left_sample = (next_left_sample +
                     (current_left_sample * coeff1l) +
@@ -1229,7 +1482,7 @@
             if (st) byte[1] = bytestream2_get_byteu(&gb);
             for(i = 4; i >= 0; i-=4) { /* Pairwise samples LL RR (st) or LL LL (mono) */
                 for(channel = 0; channel < avctx->channels; channel++) {
-                    int sample = sign_extend(byte[channel] >> i, 4) << shift[channel];
+                    int sample = sign_extend(byte[channel] >> i, 4) * (1 << shift[channel]);
                     sample = (sample +
                              c->status[channel].sample1 * coeff[channel][0] +
                              c->status[channel].sample2 * coeff[channel][1] + 0x80) >> 8;
@@ -1290,10 +1543,10 @@
 
                     for (count2=0; count2<28; count2++) {
                         if (count2 & 1)
-                            next_sample = sign_extend(byte,    4) << shift;
+                            next_sample = (unsigned)sign_extend(byte,    4) << shift;
                         else {
                             byte = bytestream2_get_byte(&gb);
-                            next_sample = sign_extend(byte >> 4, 4) << shift;
+                            next_sample = (unsigned)sign_extend(byte >> 4, 4) << shift;
                         }
 
                         next_sample += (current_sample  * coeff1) +
@@ -1344,11 +1597,11 @@
                     int level, pred;
                     int byte = bytestream2_get_byteu(&gb);
 
-                    level = sign_extend(byte >> 4, 4) << shift[n];
+                    level = sign_extend(byte >> 4, 4) * (1 << shift[n]);
                     pred  = s[-1] * coeff[0][n] + s[-2] * coeff[1][n];
                     s[0]  = av_clip_int16((level + pred + 0x80) >> 8);
 
-                    level = sign_extend(byte, 4) << shift[n];
+                    level = sign_extend(byte, 4) * (1 << shift[n]);
                     pred  = s[0] * coeff[0][n] + s[-1] * coeff[1][n];
                     s[1]  = av_clip_int16((level + pred + 0x80) >> 8);
                 }
@@ -1387,8 +1640,8 @@
         for (n = nb_samples >> (1 - st); n > 0; n--) {
             int v = bytestream2_get_byteu(&gb);
 
-            *samples++ = adpcm_ima_qt_expand_nibble(&c->status[0 ], v >> 4, 3);
-            *samples++ = adpcm_ima_qt_expand_nibble(&c->status[st], v & 0xf, 3);
+            *samples++ = adpcm_ima_qt_expand_nibble(&c->status[0 ], v >> 4 );
+            *samples++ = adpcm_ima_qt_expand_nibble(&c->status[st], v & 0xf);
         }
         break;
     case AV_CODEC_ID_ADPCM_CT:
@@ -1505,8 +1758,8 @@
                         sampledat = sign_extend(byte >> 4, 4);
                     }
 
-                    sampledat = ((prev1 * factor1 + prev2 * factor2) +
-                                 ((sampledat * scale) << 11)) >> 11;
+                    sampledat = ((prev1 * factor1 + prev2 * factor2) >> 11) +
+                                sampledat * scale;
                     *samples = av_clip_int16(sampledat);
                     prev2 = prev1;
                     prev1 = *samples++;
@@ -1583,7 +1836,7 @@
                     }
 
                     sampledat = ((c->status[ch].sample1 * factor1
-                                + c->status[ch].sample2 * factor2) >> 11) + (sampledat << exp);
+                                + c->status[ch].sample2 * factor2) >> 11) + sampledat * (1 << exp);
                     *samples = av_clip_int16(sampledat);
                     c->status[ch].sample2 = c->status[ch].sample1;
                     c->status[ch].sample1 = *samples++;
@@ -1630,7 +1883,7 @@
                     else
                         sampledat = sign_extend(byte >> 4, 4);
 
-                    sampledat = (((sampledat << 12) >> (header & 0xf)) << 6) + prev;
+                    sampledat = ((sampledat * (1 << 12)) >> (header & 0xf)) * (1 << 6) + prev;
                     *samples++ = av_clip_int16(sampledat >> 6);
                     c->status[channel].sample2 = c->status[channel].sample1;
                     c->status[channel].sample1 = sampledat;
@@ -1667,7 +1920,7 @@
                             scale = sign_extend(byte, 4);
                         }
 
-                        scale  = scale << 12;
+                        scale  = scale * (1 << 12);
                         sample = (int)((scale >> shift) + (c->status[channel].sample1 * xa_adpcm_table[filter][0] + c->status[channel].sample2 * xa_adpcm_table[filter][1]) / 64);
                     }
                     *samples++ = av_clip_int16(sample);
@@ -1677,9 +1930,66 @@
             }
         }
         break;
+    case AV_CODEC_ID_ADPCM_ARGO:
+        /*
+         * The format of each block:
+         *   uint8_t left_control;
+         *   uint4_t left_samples[nb_samples];
+         *   ---- and if stereo ----
+         *   uint8_t right_control;
+         *   uint4_t right_samples[nb_samples];
+         *
+         * Format of the control byte:
+         * MSB [SSSSDRRR] LSB
+         *   S = (Shift Amount - 2)
+         *   D = Decoder flag.
+         *   R = Reserved
+         *
+         * Each block relies on the previous two samples of each channel.
+         * They should be 0 initially.
+         */
+        for (channel = 0; channel < avctx->channels; channel++) {
+            int control, shift;
 
+            samples = samples_p[channel];
+            cs = c->status + channel;
+
+            /* Get the control byte and decode the samples, 2 at a time. */
+            control = bytestream2_get_byteu(&gb);
+            shift = (control >> 4) + 2;
+
+            for (n = 0; n < nb_samples / 2; n++) {
+                int sample = bytestream2_get_byteu(&gb);
+                *samples++ = adpcm_argo_expand_nibble(cs, sign_extend(sample >> 4, 4), control, shift);
+                *samples++ = adpcm_argo_expand_nibble(cs, sign_extend(sample >> 0, 4), control, shift);
+            }
+        }
+        break;
+    case AV_CODEC_ID_ADPCM_ZORK:
+        if (!c->has_status) {
+            for (channel = 0; channel < avctx->channels; channel++) {
+                c->status[channel].predictor  = 0;
+                c->status[channel].step_index = 0;
+            }
+            c->has_status = 1;
+        }
+        for (n = 0; n < nb_samples * avctx->channels; n++) {
+            int v = bytestream2_get_byteu(&gb);
+            *samples++ = adpcm_zork_expand_nibble(&c->status[n % avctx->channels], v);
+        }
+        break;
+    case AV_CODEC_ID_ADPCM_IMA_MTF:
+        for (n = nb_samples / 2; n > 0; n--) {
+            for (channel = 0; channel < avctx->channels; channel++) {
+                int v = bytestream2_get_byteu(&gb);
+                *samples++  = adpcm_ima_mtf_expand_nibble(&c->status[channel], v >> 4);
+                samples[st] = adpcm_ima_mtf_expand_nibble(&c->status[channel], v & 0x0F);
+            }
+            samples += avctx->channels;
+        }
+        break;
     default:
-        return -1;
+        av_assert0(0); // unsupported codec_id should not happen
     }
 
     if (avpkt->size && bytestream2_tell(&gb) == 0) {
@@ -1729,7 +2039,9 @@
 /* Note: Do not forget to add new entries to the Makefile as well. */
 ADPCM_DECODER(AV_CODEC_ID_ADPCM_4XM,         sample_fmts_s16p, adpcm_4xm,         "ADPCM 4X Movie");
 ADPCM_DECODER(AV_CODEC_ID_ADPCM_AFC,         sample_fmts_s16p, adpcm_afc,         "ADPCM Nintendo Gamecube AFC");
+ADPCM_DECODER(AV_CODEC_ID_ADPCM_AGM,         sample_fmts_s16,  adpcm_agm,         "ADPCM AmuseGraphics Movie");
 ADPCM_DECODER(AV_CODEC_ID_ADPCM_AICA,        sample_fmts_s16p, adpcm_aica,        "ADPCM Yamaha AICA");
+ADPCM_DECODER(AV_CODEC_ID_ADPCM_ARGO,        sample_fmts_s16p, adpcm_argo,        "ADPCM Argonaut Games");
 ADPCM_DECODER(AV_CODEC_ID_ADPCM_CT,          sample_fmts_s16,  adpcm_ct,          "ADPCM Creative Technology");
 ADPCM_DECODER(AV_CODEC_ID_ADPCM_DTK,         sample_fmts_s16p, adpcm_dtk,         "ADPCM Nintendo Gamecube DTK");
 ADPCM_DECODER(AV_CODEC_ID_ADPCM_EA,          sample_fmts_s16,  adpcm_ea,          "ADPCM Electronic Arts");
@@ -1740,19 +2052,23 @@
 ADPCM_DECODER(AV_CODEC_ID_ADPCM_EA_XAS,      sample_fmts_s16p, adpcm_ea_xas,      "ADPCM Electronic Arts XAS");
 ADPCM_DECODER(AV_CODEC_ID_ADPCM_IMA_AMV,     sample_fmts_s16,  adpcm_ima_amv,     "ADPCM IMA AMV");
 ADPCM_DECODER(AV_CODEC_ID_ADPCM_IMA_APC,     sample_fmts_s16,  adpcm_ima_apc,     "ADPCM IMA CRYO APC");
+ADPCM_DECODER(AV_CODEC_ID_ADPCM_IMA_APM,     sample_fmts_s16,  adpcm_ima_apm,     "ADPCM IMA Ubisoft APM");
 ADPCM_DECODER(AV_CODEC_ID_ADPCM_IMA_DAT4,    sample_fmts_s16,  adpcm_ima_dat4,    "ADPCM IMA Eurocom DAT4");
 ADPCM_DECODER(AV_CODEC_ID_ADPCM_IMA_DK3,     sample_fmts_s16,  adpcm_ima_dk3,     "ADPCM IMA Duck DK3");
 ADPCM_DECODER(AV_CODEC_ID_ADPCM_IMA_DK4,     sample_fmts_s16,  adpcm_ima_dk4,     "ADPCM IMA Duck DK4");
 ADPCM_DECODER(AV_CODEC_ID_ADPCM_IMA_EA_EACS, sample_fmts_s16,  adpcm_ima_ea_eacs, "ADPCM IMA Electronic Arts EACS");
 ADPCM_DECODER(AV_CODEC_ID_ADPCM_IMA_EA_SEAD, sample_fmts_s16,  adpcm_ima_ea_sead, "ADPCM IMA Electronic Arts SEAD");
 ADPCM_DECODER(AV_CODEC_ID_ADPCM_IMA_ISS,     sample_fmts_s16,  adpcm_ima_iss,     "ADPCM IMA Funcom ISS");
+ADPCM_DECODER(AV_CODEC_ID_ADPCM_IMA_MTF,     sample_fmts_s16,  adpcm_ima_mtf,     "ADPCM IMA Capcom's MT Framework");
 ADPCM_DECODER(AV_CODEC_ID_ADPCM_IMA_OKI,     sample_fmts_s16,  adpcm_ima_oki,     "ADPCM IMA Dialogic OKI");
 ADPCM_DECODER(AV_CODEC_ID_ADPCM_IMA_QT,      sample_fmts_s16p, adpcm_ima_qt,      "ADPCM IMA QuickTime");
 ADPCM_DECODER(AV_CODEC_ID_ADPCM_IMA_RAD,     sample_fmts_s16,  adpcm_ima_rad,     "ADPCM IMA Radical");
+ADPCM_DECODER(AV_CODEC_ID_ADPCM_IMA_SSI,     sample_fmts_s16,  adpcm_ima_ssi,     "ADPCM IMA Simon & Schuster Interactive");
 ADPCM_DECODER(AV_CODEC_ID_ADPCM_IMA_SMJPEG,  sample_fmts_s16,  adpcm_ima_smjpeg,  "ADPCM IMA Loki SDL MJPEG");
+ADPCM_DECODER(AV_CODEC_ID_ADPCM_IMA_ALP,     sample_fmts_s16,  adpcm_ima_alp,     "ADPCM IMA High Voltage Software ALP");
 ADPCM_DECODER(AV_CODEC_ID_ADPCM_IMA_WAV,     sample_fmts_s16p, adpcm_ima_wav,     "ADPCM IMA WAV");
 ADPCM_DECODER(AV_CODEC_ID_ADPCM_IMA_WS,      sample_fmts_both, adpcm_ima_ws,      "ADPCM IMA Westwood");
-ADPCM_DECODER(AV_CODEC_ID_ADPCM_MS,          sample_fmts_s16,  adpcm_ms,          "ADPCM Microsoft");
+ADPCM_DECODER(AV_CODEC_ID_ADPCM_MS,          sample_fmts_both, adpcm_ms,          "ADPCM Microsoft");
 ADPCM_DECODER(AV_CODEC_ID_ADPCM_MTAF,        sample_fmts_s16p, adpcm_mtaf,        "ADPCM MTAF");
 ADPCM_DECODER(AV_CODEC_ID_ADPCM_PSX,         sample_fmts_s16p, adpcm_psx,         "ADPCM Playstation");
 ADPCM_DECODER(AV_CODEC_ID_ADPCM_SBPRO_2,     sample_fmts_s16,  adpcm_sbpro_2,     "ADPCM Sound Blaster Pro 2-bit");
@@ -1763,3 +2079,4 @@
 ADPCM_DECODER(AV_CODEC_ID_ADPCM_THP,         sample_fmts_s16p, adpcm_thp,         "ADPCM Nintendo THP");
 ADPCM_DECODER(AV_CODEC_ID_ADPCM_XA,          sample_fmts_s16p, adpcm_xa,          "ADPCM CDROM XA");
 ADPCM_DECODER(AV_CODEC_ID_ADPCM_YAMAHA,      sample_fmts_s16,  adpcm_yamaha,      "ADPCM Yamaha");
+ADPCM_DECODER(AV_CODEC_ID_ADPCM_ZORK,        sample_fmts_s16,  adpcm_zork,        "ADPCM Zork");
diff --git a/libavcodec/adxdec.c b/libavcodec/adxdec.c
index 178ea99..40ed8e5 100644
--- a/libavcodec/adxdec.c
+++ b/libavcodec/adxdec.c
@@ -81,7 +81,7 @@
     s2 = prev->s2;
     for (i = 0; i < BLOCK_SAMPLES; i++) {
         d  = get_sbits(&gb, 4);
-        s0 = ((d * (1 << COEFF_BITS)) * scale + c->coeff[0] * s1 + c->coeff[1] * s2) >> COEFF_BITS;
+        s0 = d * scale + ((c->coeff[0] * s1 + c->coeff[1] * s2) >> COEFF_BITS);
         s2 = s1;
         s1 = av_clip_int16(s0);
         *out++ = s1;
diff --git a/libavcodec/adxenc.c b/libavcodec/adxenc.c
index f1ba591..93b902b 100644
--- a/libavcodec/adxenc.c
+++ b/libavcodec/adxenc.c
@@ -48,7 +48,7 @@
     s2 = prev->s2;
     for (i = 0, j = 0; j < 32; i += channels, j++) {
         s0 = wav[i];
-        d = ((s0 << COEFF_BITS) - c->coeff[0] * s1 - c->coeff[1] * s2) >> COEFF_BITS;
+        d = s0 + ((-c->coeff[0] * s1 - c->coeff[1] * s2) >> COEFF_BITS);
         if (max < d)
             max = d;
         if (min > d)
@@ -79,13 +79,13 @@
     s1 = prev->s1;
     s2 = prev->s2;
     for (i = 0, j = 0; j < 32; i += channels, j++) {
-        d = ((wav[i] << COEFF_BITS) - c->coeff[0] * s1 - c->coeff[1] * s2) >> COEFF_BITS;
+        d = wav[i] + ((-c->coeff[0] * s1 - c->coeff[1] * s2) >> COEFF_BITS);
 
         d = av_clip_intp2(ROUNDED_DIV(d, scale), 3);
 
         put_sbits(&pb, 4, d);
 
-        s0 = ((d << COEFF_BITS) * scale + c->coeff[0] * s1 + c->coeff[1] * s2) >> COEFF_BITS;
+        s0 = d * scale + ((c->coeff[0] * s1 + c->coeff[1] * s2) >> COEFF_BITS);
         s2 = s1;
         s1 = s0;
     }
@@ -141,10 +141,26 @@
                             const AVFrame *frame, int *got_packet_ptr)
 {
     ADXContext *c          = avctx->priv_data;
-    const int16_t *samples = (const int16_t *)frame->data[0];
+    const int16_t *samples = frame ? (const int16_t *)frame->data[0] : NULL;
     uint8_t *dst;
     int ch, out_size, ret;
 
+    if (!samples) {
+        if (c->eof)
+            return 0;
+        if ((ret = ff_alloc_packet2(avctx, avpkt, 18, 0)) < 0)
+            return ret;
+        c->eof = 1;
+        dst = avpkt->data;
+        bytestream_put_be16(&dst, 0x8001);
+        bytestream_put_be16(&dst, 0x000E);
+        bytestream_put_be64(&dst, 0x0);
+        bytestream_put_be32(&dst, 0x0);
+        bytestream_put_be16(&dst, 0x0);
+        *got_packet_ptr = 1;
+        return 0;
+    }
+
     out_size = BLOCK_SIZE * avctx->channels + !c->header_parsed * HEADER_SIZE;
     if ((ret = ff_alloc_packet2(avctx, avpkt, out_size, 0)) < 0)
         return ret;
@@ -165,6 +181,8 @@
         dst += BLOCK_SIZE;
     }
 
+    avpkt->pts = frame->pts;
+    avpkt->duration = frame->nb_samples;
     *got_packet_ptr = 1;
     return 0;
 }
@@ -177,6 +195,7 @@
     .priv_data_size = sizeof(ADXContext),
     .init           = adx_encode_init,
     .encode2        = adx_encode_frame,
+    .capabilities   = AV_CODEC_CAP_DELAY,
     .sample_fmts    = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_S16,
                                                       AV_SAMPLE_FMT_NONE },
 };
diff --git a/libavcodec/agm.c b/libavcodec/agm.c
new file mode 100644
index 0000000..bc9dfc0
--- /dev/null
+++ b/libavcodec/agm.c
@@ -0,0 +1,1300 @@
+/*
+ * Amuse Graphics Movie decoder
+ *
+ * Copyright (c) 2018 Paul B Mahol
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#define BITSTREAM_READER_LE
+
+#include "avcodec.h"
+#include "bytestream.h"
+#include "copy_block.h"
+#include "get_bits.h"
+#include "idctdsp.h"
+#include "internal.h"
+
+static const uint8_t unscaled_luma[64] = {
+    16, 11, 10, 16, 24, 40, 51, 61, 12, 12, 14, 19,
+    26, 58, 60, 55, 14, 13, 16, 24, 40, 57, 69, 56,
+    14, 17, 22, 29, 51, 87, 80, 62, 18, 22, 37, 56,
+    68,109,103, 77, 24, 35, 55, 64, 81,104,113, 92,
+    49, 64, 78, 87,103,121,120,101, 72, 92, 95, 98,
+    112,100,103,99
+};
+
+static const uint8_t unscaled_chroma[64] = {
+    17, 18, 24, 47, 99, 99, 99, 99, 18, 21, 26, 66,
+    99, 99, 99, 99, 24, 26, 56, 99, 99, 99, 99, 99,
+    47, 66, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99,
+    99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99,
+    99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99,
+    99, 99, 99, 99
+};
+
+typedef struct MotionVector {
+    int16_t x, y;
+} MotionVector;
+
+typedef struct AGMContext {
+    const AVClass  *class;
+    AVCodecContext *avctx;
+    GetBitContext   gb;
+    GetByteContext  gbyte;
+
+    int key_frame;
+    int bitstream_size;
+    int compression;
+    int blocks_w;
+    int blocks_h;
+    int size[3];
+    int plus;
+    int dct;
+    int rgb;
+    unsigned flags;
+    unsigned fflags;
+
+    uint8_t *output;
+    unsigned padded_output_size;
+    unsigned output_size;
+
+    MotionVector *mvectors;
+    unsigned      mvectors_size;
+
+    VLC vlc;
+
+    AVFrame *prev_frame;
+
+    int luma_quant_matrix[64];
+    int chroma_quant_matrix[64];
+
+    ScanTable scantable;
+    DECLARE_ALIGNED(32, int16_t, block)[64];
+
+    int16_t *wblocks;
+    unsigned wblocks_size;
+
+    int      *map;
+    unsigned  map_size;
+
+    IDCTDSPContext idsp;
+} AGMContext;
+
+static int read_code(GetBitContext *gb, int *oskip, int *level, int *map, int mode)
+{
+    int len = 0, skip = 0, max;
+
+    if (get_bits_left(gb) < 2)
+        return AVERROR_INVALIDDATA;
+
+    if (show_bits(gb, 2)) {
+        switch (show_bits(gb, 4)) {
+        case 1:
+        case 9:
+            len = 1;
+            skip = 3;
+            break;
+        case 2:
+            len = 3;
+            skip = 4;
+            break;
+        case 3:
+            len = 7;
+            skip = 4;
+            break;
+        case 5:
+        case 13:
+            len = 2;
+            skip = 3;
+            break;
+        case 6:
+            len = 4;
+            skip = 4;
+            break;
+        case 7:
+            len = 8;
+            skip = 4;
+            break;
+        case 10:
+            len = 5;
+            skip = 4;
+            break;
+        case 11:
+            len = 9;
+            skip = 4;
+            break;
+        case 14:
+            len = 6;
+            skip = 4;
+            break;
+        case 15:
+            len = ((show_bits(gb, 5) & 0x10) | 0xA0) >> 4;
+            skip = 5;
+            break;
+        default:
+            return AVERROR_INVALIDDATA;
+        }
+
+        skip_bits(gb, skip);
+        *level = get_bits(gb, len);
+        *map = 1;
+        *oskip = 0;
+        max = 1 << (len - 1);
+        if (*level < max)
+            *level = -(max + *level);
+    } else if (show_bits(gb, 3) & 4) {
+        skip_bits(gb, 3);
+        if (mode == 1) {
+            if (show_bits(gb, 4)) {
+                if (show_bits(gb, 4) == 1) {
+                    skip_bits(gb, 4);
+                    *oskip = get_bits(gb, 16);
+                } else {
+                    *oskip = get_bits(gb, 4);
+                }
+            } else {
+                skip_bits(gb, 4);
+                *oskip = get_bits(gb, 10);
+            }
+        } else if (mode == 0) {
+            *oskip = get_bits(gb, 10);
+        }
+        *level = 0;
+    } else {
+        skip_bits(gb, 3);
+        if (mode == 0)
+            *oskip = get_bits(gb, 4);
+        else if (mode == 1)
+            *oskip = 0;
+        *level = 0;
+    }
+
+    return 0;
+}
+
+static int decode_intra_blocks(AGMContext *s, GetBitContext *gb,
+                               const int *quant_matrix, int *skip, int *dc_level)
+{
+    const uint8_t *scantable = s->scantable.permutated;
+    int level, ret, map = 0;
+
+    memset(s->wblocks, 0, s->wblocks_size);
+
+    for (int i = 0; i < 64; i++) {
+        int16_t *block = s->wblocks + scantable[i];
+
+        for (int j = 0; j < s->blocks_w;) {
+            if (*skip > 0) {
+                int rskip;
+
+                rskip = FFMIN(*skip, s->blocks_w - j);
+                j += rskip;
+                if (i == 0) {
+                    for (int k = 0; k < rskip; k++)
+                        block[64 * k] = *dc_level * quant_matrix[0];
+                }
+                block += rskip * 64;
+                *skip -= rskip;
+            } else {
+                ret = read_code(gb, skip, &level, &map, s->flags & 1);
+                if (ret < 0)
+                    return ret;
+
+                if (i == 0)
+                    *dc_level += level;
+
+                block[0] = (i == 0 ? *dc_level : level) * quant_matrix[i];
+                block += 64;
+                j++;
+            }
+        }
+    }
+
+    return 0;
+}
+
+static int decode_inter_blocks(AGMContext *s, GetBitContext *gb,
+                               const int *quant_matrix, int *skip,
+                               int *map)
+{
+    const uint8_t *scantable = s->scantable.permutated;
+    int level, ret;
+
+    memset(s->wblocks, 0, s->wblocks_size);
+    memset(s->map, 0, s->map_size);
+
+    for (int i = 0; i < 64; i++) {
+        int16_t *block = s->wblocks + scantable[i];
+
+        for (int j = 0; j < s->blocks_w;) {
+            if (*skip > 0) {
+                int rskip;
+
+                rskip = FFMIN(*skip, s->blocks_w - j);
+                j += rskip;
+                block += rskip * 64;
+                *skip -= rskip;
+            } else {
+                ret = read_code(gb, skip, &level, &map[j], s->flags & 1);
+                if (ret < 0)
+                    return ret;
+
+                block[0] = level * quant_matrix[i];
+                block += 64;
+                j++;
+            }
+        }
+    }
+
+    return 0;
+}
+
+static int decode_intra_block(AGMContext *s, GetBitContext *gb,
+                              const int *quant_matrix, int *skip, int *dc_level)
+{
+    const uint8_t *scantable = s->scantable.permutated;
+    const int offset = s->plus ? 0 : 1024;
+    int16_t *block = s->block;
+    int level, ret, map = 0;
+
+    memset(block, 0, sizeof(s->block));
+
+    if (*skip > 0) {
+        (*skip)--;
+    } else {
+        ret = read_code(gb, skip, &level, &map, s->flags & 1);
+        if (ret < 0)
+            return ret;
+        *dc_level += level;
+    }
+    block[scantable[0]] = offset + *dc_level * quant_matrix[0];
+
+    for (int i = 1; i < 64;) {
+        if (*skip > 0) {
+            int rskip;
+
+            rskip = FFMIN(*skip, 64 - i);
+            i += rskip;
+            *skip -= rskip;
+        } else {
+            ret = read_code(gb, skip, &level, &map, s->flags & 1);
+            if (ret < 0)
+                return ret;
+
+            block[scantable[i]] = level * quant_matrix[i];
+            i++;
+        }
+    }
+
+    return 0;
+}
+
+static int decode_intra_plane(AGMContext *s, GetBitContext *gb, int size,
+                              const int *quant_matrix, AVFrame *frame,
+                              int plane)
+{
+    int ret, skip = 0, dc_level = 0;
+    const int offset = s->plus ? 0 : 1024;
+
+    if ((ret = init_get_bits8(gb, s->gbyte.buffer, size)) < 0)
+        return ret;
+
+    if (s->flags & 1) {
+        av_fast_padded_malloc(&s->wblocks, &s->wblocks_size,
+                              64 * s->blocks_w * sizeof(*s->wblocks));
+        if (!s->wblocks)
+            return AVERROR(ENOMEM);
+
+        for (int y = 0; y < s->blocks_h; y++) {
+            ret = decode_intra_blocks(s, gb, quant_matrix, &skip, &dc_level);
+            if (ret < 0)
+                return ret;
+
+            for (int x = 0; x < s->blocks_w; x++) {
+                s->wblocks[64 * x] += offset;
+                s->idsp.idct_put(frame->data[plane] + (s->blocks_h - 1 - y) * 8 * frame->linesize[plane] + x * 8,
+                                 frame->linesize[plane], s->wblocks + 64 * x);
+            }
+        }
+    } else {
+        for (int y = 0; y < s->blocks_h; y++) {
+            for (int x = 0; x < s->blocks_w; x++) {
+                ret = decode_intra_block(s, gb, quant_matrix, &skip, &dc_level);
+                if (ret < 0)
+                    return ret;
+
+                s->idsp.idct_put(frame->data[plane] + (s->blocks_h - 1 - y) * 8 * frame->linesize[plane] + x * 8,
+                                 frame->linesize[plane], s->block);
+            }
+        }
+    }
+
+    align_get_bits(gb);
+    if (get_bits_left(gb) < 0)
+        av_log(s->avctx, AV_LOG_WARNING, "overread\n");
+    if (get_bits_left(gb) > 0)
+        av_log(s->avctx, AV_LOG_WARNING, "underread: %d\n", get_bits_left(gb));
+
+    return 0;
+}
+
+static int decode_inter_block(AGMContext *s, GetBitContext *gb,
+                              const int *quant_matrix, int *skip,
+                              int *map)
+{
+    const uint8_t *scantable = s->scantable.permutated;
+    int16_t *block = s->block;
+    int level, ret;
+
+    memset(block, 0, sizeof(s->block));
+
+    for (int i = 0; i < 64;) {
+        if (*skip > 0) {
+            int rskip;
+
+            rskip = FFMIN(*skip, 64 - i);
+            i += rskip;
+            *skip -= rskip;
+        } else {
+            ret = read_code(gb, skip, &level, map, s->flags & 1);
+            if (ret < 0)
+                return ret;
+
+            block[scantable[i]] = level * quant_matrix[i];
+            i++;
+        }
+    }
+
+    return 0;
+}
+
+static int decode_inter_plane(AGMContext *s, GetBitContext *gb, int size,
+                              const int *quant_matrix, AVFrame *frame,
+                              AVFrame *prev, int plane)
+{
+    int ret, skip = 0;
+
+    if ((ret = init_get_bits8(gb, s->gbyte.buffer, size)) < 0)
+        return ret;
+
+    if (s->flags == 3) {
+        av_fast_padded_malloc(&s->wblocks, &s->wblocks_size,
+                              64 * s->blocks_w * sizeof(*s->wblocks));
+        if (!s->wblocks)
+            return AVERROR(ENOMEM);
+
+        av_fast_padded_malloc(&s->map, &s->map_size,
+                              s->blocks_w * sizeof(*s->map));
+        if (!s->map)
+            return AVERROR(ENOMEM);
+
+        for (int y = 0; y < s->blocks_h; y++) {
+            ret = decode_inter_blocks(s, gb, quant_matrix, &skip, s->map);
+            if (ret < 0)
+                return ret;
+
+            for (int x = 0; x < s->blocks_w; x++) {
+                int shift = plane == 0;
+                int mvpos = (y >> shift) * (s->blocks_w >> shift) + (x >> shift);
+                int orig_mv_x = s->mvectors[mvpos].x;
+                int mv_x = s->mvectors[mvpos].x / (1 + !shift);
+                int mv_y = s->mvectors[mvpos].y / (1 + !shift);
+                int h = s->avctx->coded_height >> !shift;
+                int w = s->avctx->coded_width  >> !shift;
+                int map = s->map[x];
+
+                if (orig_mv_x >= -32) {
+                    if (y * 8 + mv_y < 0 || y * 8 + mv_y + 8 >= h ||
+                        x * 8 + mv_x < 0 || x * 8 + mv_x + 8 >= w)
+                        return AVERROR_INVALIDDATA;
+
+                    copy_block8(frame->data[plane] + (s->blocks_h - 1 - y) * 8 * frame->linesize[plane] + x * 8,
+                                prev->data[plane] + ((s->blocks_h - 1 - y) * 8 - mv_y) * prev->linesize[plane] + (x * 8 + mv_x),
+                                frame->linesize[plane], prev->linesize[plane], 8);
+                    if (map) {
+                        s->idsp.idct(s->wblocks + x * 64);
+                        for (int i = 0; i < 64; i++)
+                            s->wblocks[i + x * 64] = (s->wblocks[i + x * 64] + 1) & 0xFFFC;
+                        s->idsp.add_pixels_clamped(&s->wblocks[x*64], frame->data[plane] + (s->blocks_h - 1 - y) * 8 * frame->linesize[plane] + x * 8,
+                                                   frame->linesize[plane]);
+                    }
+                } else if (map) {
+                    s->idsp.idct_put(frame->data[plane] + (s->blocks_h - 1 - y) * 8 * frame->linesize[plane] + x * 8,
+                                     frame->linesize[plane], s->wblocks + x * 64);
+                }
+            }
+        }
+    } else if (s->flags & 2) {
+        for (int y = 0; y < s->blocks_h; y++) {
+            for (int x = 0; x < s->blocks_w; x++) {
+                int shift = plane == 0;
+                int mvpos = (y >> shift) * (s->blocks_w >> shift) + (x >> shift);
+                int orig_mv_x = s->mvectors[mvpos].x;
+                int mv_x = s->mvectors[mvpos].x / (1 + !shift);
+                int mv_y = s->mvectors[mvpos].y / (1 + !shift);
+                int h = s->avctx->coded_height >> !shift;
+                int w = s->avctx->coded_width  >> !shift;
+                int map = 0;
+
+                ret = decode_inter_block(s, gb, quant_matrix, &skip, &map);
+                if (ret < 0)
+                    return ret;
+
+                if (orig_mv_x >= -32) {
+                    if (y * 8 + mv_y < 0 || y * 8 + mv_y + 8 > h ||
+                        x * 8 + mv_x < 0 || x * 8 + mv_x + 8 > w)
+                        return AVERROR_INVALIDDATA;
+
+                    copy_block8(frame->data[plane] + (s->blocks_h - 1 - y) * 8 * frame->linesize[plane] + x * 8,
+                                prev->data[plane] + ((s->blocks_h - 1 - y) * 8 - mv_y) * prev->linesize[plane] + (x * 8 + mv_x),
+                                frame->linesize[plane], prev->linesize[plane], 8);
+                    if (map) {
+                        s->idsp.idct(s->block);
+                        for (int i = 0; i < 64; i++)
+                            s->block[i] = (s->block[i] + 1) & 0xFFFC;
+                        s->idsp.add_pixels_clamped(s->block, frame->data[plane] + (s->blocks_h - 1 - y) * 8 * frame->linesize[plane] + x * 8,
+                                                   frame->linesize[plane]);
+                    }
+                } else if (map) {
+                    s->idsp.idct_put(frame->data[plane] + (s->blocks_h - 1 - y) * 8 * frame->linesize[plane] + x * 8,
+                                     frame->linesize[plane], s->block);
+                }
+            }
+        }
+    } else if (s->flags & 1) {
+        av_fast_padded_malloc(&s->wblocks, &s->wblocks_size,
+                              64 * s->blocks_w * sizeof(*s->wblocks));
+        if (!s->wblocks)
+            return AVERROR(ENOMEM);
+
+        av_fast_padded_malloc(&s->map, &s->map_size,
+                              s->blocks_w * sizeof(*s->map));
+        if (!s->map)
+            return AVERROR(ENOMEM);
+
+        for (int y = 0; y < s->blocks_h; y++) {
+            ret = decode_inter_blocks(s, gb, quant_matrix, &skip, s->map);
+            if (ret < 0)
+                return ret;
+
+            for (int x = 0; x < s->blocks_w; x++) {
+                if (!s->map[x])
+                    continue;
+                s->idsp.idct_add(frame->data[plane] + (s->blocks_h - 1 - y) * 8 * frame->linesize[plane] + x * 8,
+                                 frame->linesize[plane], s->wblocks + 64 * x);
+            }
+        }
+    } else {
+        for (int y = 0; y < s->blocks_h; y++) {
+            for (int x = 0; x < s->blocks_w; x++) {
+                int map = 0;
+
+                ret = decode_inter_block(s, gb, quant_matrix, &skip, &map);
+                if (ret < 0)
+                    return ret;
+
+                if (!map)
+                    continue;
+                s->idsp.idct_add(frame->data[plane] + (s->blocks_h - 1 - y) * 8 * frame->linesize[plane] + x * 8,
+                                 frame->linesize[plane], s->block);
+            }
+        }
+    }
+
+    align_get_bits(gb);
+    if (get_bits_left(gb) < 0)
+        av_log(s->avctx, AV_LOG_WARNING, "overread\n");
+    if (get_bits_left(gb) > 0)
+        av_log(s->avctx, AV_LOG_WARNING, "underread: %d\n", get_bits_left(gb));
+
+    return 0;
+}
+
+static void compute_quant_matrix(AGMContext *s, double qscale)
+{
+    int luma[64], chroma[64];
+    double f = 1.0 - fabs(qscale);
+
+    if (!s->key_frame && (s->flags & 2)) {
+        if (qscale >= 0.0) {
+            for (int i = 0; i < 64; i++) {
+                luma[i]   = FFMAX(1, 16 * f);
+                chroma[i] = FFMAX(1, 16 * f);
+            }
+        } else {
+            for (int i = 0; i < 64; i++) {
+                luma[i]   = FFMAX(1, 16 - qscale * 32);
+                chroma[i] = FFMAX(1, 16 - qscale * 32);
+            }
+        }
+    } else {
+        if (qscale >= 0.0) {
+            for (int i = 0; i < 64; i++) {
+                luma[i]   = FFMAX(1, unscaled_luma  [(i & 7) * 8 + (i >> 3)] * f);
+                chroma[i] = FFMAX(1, unscaled_chroma[(i & 7) * 8 + (i >> 3)] * f);
+            }
+        } else {
+            for (int i = 0; i < 64; i++) {
+                luma[i]   = FFMAX(1, 255.0 - (255 - unscaled_luma  [(i & 7) * 8 + (i >> 3)]) * f);
+                chroma[i] = FFMAX(1, 255.0 - (255 - unscaled_chroma[(i & 7) * 8 + (i >> 3)]) * f);
+            }
+        }
+    }
+
+    for (int i = 0; i < 64; i++) {
+        int pos = ff_zigzag_direct[i];
+
+        s->luma_quant_matrix[i]   = luma[pos]   * ((pos / 8) & 1 ? -1 : 1);
+        s->chroma_quant_matrix[i] = chroma[pos] * ((pos / 8) & 1 ? -1 : 1);
+    }
+}
+
+static int decode_raw_intra_rgb(AVCodecContext *avctx, GetByteContext *gbyte, AVFrame *frame)
+{
+    uint8_t *dst = frame->data[0] + (avctx->height - 1) * frame->linesize[0];
+    uint8_t r = 0, g = 0, b = 0;
+
+    if (bytestream2_get_bytes_left(gbyte) < 3 * avctx->width * avctx->height)
+        return AVERROR_INVALIDDATA;
+
+    for (int y = 0; y < avctx->height; y++) {
+        for (int x = 0; x < avctx->width; x++) {
+            dst[x*3+0] = bytestream2_get_byteu(gbyte) + r;
+            r = dst[x*3+0];
+            dst[x*3+1] = bytestream2_get_byteu(gbyte) + g;
+            g = dst[x*3+1];
+            dst[x*3+2] = bytestream2_get_byteu(gbyte) + b;
+            b = dst[x*3+2];
+        }
+        dst -= frame->linesize[0];
+    }
+
+    return 0;
+}
+
+static int fill_pixels(uint8_t **y0, uint8_t **y1,
+                       uint8_t **u, uint8_t **v,
+                       int ylinesize, int ulinesize, int vlinesize,
+                       uint8_t *fill,
+                       int *nx, int *ny, int *np, int w, int h)
+{
+    uint8_t *y0dst = *y0;
+    uint8_t *y1dst = *y1;
+    uint8_t *udst = *u;
+    uint8_t *vdst = *v;
+    int x = *nx, y = *ny, pos = *np;
+
+    if (pos == 0) {
+        y0dst[2*x+0] += fill[0];
+        y0dst[2*x+1] += fill[1];
+        y1dst[2*x+0] += fill[2];
+        y1dst[2*x+1] += fill[3];
+        pos++;
+    } else if (pos == 1) {
+        udst[x] += fill[0];
+        vdst[x] += fill[1];
+        x++;
+        if (x >= w) {
+            x = 0;
+            y++;
+            if (y >= h)
+                return 1;
+            y0dst -= 2*ylinesize;
+            y1dst -= 2*ylinesize;
+            udst  -=   ulinesize;
+            vdst  -=   vlinesize;
+        }
+        y0dst[2*x+0] += fill[2];
+        y0dst[2*x+1] += fill[3];
+        pos++;
+    } else if (pos == 2) {
+        y1dst[2*x+0] += fill[0];
+        y1dst[2*x+1] += fill[1];
+        udst[x]      += fill[2];
+        vdst[x]      += fill[3];
+        x++;
+        if (x >= w) {
+            x = 0;
+            y++;
+            if (y >= h)
+                return 1;
+            y0dst -= 2*ylinesize;
+            y1dst -= 2*ylinesize;
+            udst  -=   ulinesize;
+            vdst  -=   vlinesize;
+        }
+        pos = 0;
+    }
+
+    *y0 = y0dst;
+    *y1 = y1dst;
+    *u = udst;
+    *v = vdst;
+    *np = pos;
+    *nx = x;
+    *ny = y;
+
+    return 0;
+}
+
+static int decode_runlen_rgb(AVCodecContext *avctx, GetByteContext *gbyte, AVFrame *frame)
+{
+    uint8_t *dst = frame->data[0] + (avctx->height - 1) * frame->linesize[0];
+    int runlen, y = 0, x = 0;
+    uint8_t fill[4];
+    unsigned code;
+
+    while (bytestream2_get_bytes_left(gbyte) > 0) {
+        code = bytestream2_peek_le32(gbyte);
+        runlen = code & 0xFFFFFF;
+
+        if (code >> 24 == 0x77) {
+            bytestream2_skip(gbyte, 4);
+
+            for (int i = 0; i < 4; i++)
+                fill[i] = bytestream2_get_byte(gbyte);
+
+            while (runlen > 0) {
+                runlen--;
+
+                for (int i = 0; i < 4; i++) {
+                    dst[x] += fill[i];
+                    x++;
+                    if (x >= frame->width * 3) {
+                        x = 0;
+                        y++;
+                        dst -= frame->linesize[0];
+                        if (y >= frame->height)
+                            return 0;
+                    }
+                }
+            }
+        } else {
+            for (int i = 0; i < 4; i++)
+                fill[i] = bytestream2_get_byte(gbyte);
+
+            for (int i = 0; i < 4; i++) {
+                dst[x] += fill[i];
+                x++;
+                if (x >= frame->width * 3) {
+                    x = 0;
+                    y++;
+                    dst -= frame->linesize[0];
+                    if (y >= frame->height)
+                        return 0;
+                }
+            }
+        }
+    }
+
+    return 0;
+}
+
+static int decode_runlen(AVCodecContext *avctx, GetByteContext *gbyte, AVFrame *frame)
+{
+    uint8_t *y0dst = frame->data[0] + (avctx->height - 1) * frame->linesize[0];
+    uint8_t *y1dst = y0dst - frame->linesize[0];
+    uint8_t *udst = frame->data[1] + ((avctx->height >> 1) - 1) * frame->linesize[1];
+    uint8_t *vdst = frame->data[2] + ((avctx->height >> 1) - 1) * frame->linesize[2];
+    int runlen, y = 0, x = 0, pos = 0;
+    uint8_t fill[4];
+    unsigned code;
+
+    while (bytestream2_get_bytes_left(gbyte) > 0) {
+        code = bytestream2_peek_le32(gbyte);
+        runlen = code & 0xFFFFFF;
+
+        if (code >> 24 == 0x77) {
+            bytestream2_skip(gbyte, 4);
+
+            for (int i = 0; i < 4; i++)
+                fill[i] = bytestream2_get_byte(gbyte);
+
+            while (runlen > 0) {
+                runlen--;
+
+                if (fill_pixels(&y0dst, &y1dst, &udst, &vdst,
+                                frame->linesize[0],
+                                frame->linesize[1],
+                                frame->linesize[2],
+                                fill, &x, &y, &pos,
+                                avctx->width / 2,
+                                avctx->height / 2))
+                    return 0;
+            }
+        } else {
+            for (int i = 0; i < 4; i++)
+                fill[i] = bytestream2_get_byte(gbyte);
+
+            if (fill_pixels(&y0dst, &y1dst, &udst, &vdst,
+                            frame->linesize[0],
+                            frame->linesize[1],
+                            frame->linesize[2],
+                            fill, &x, &y, &pos,
+                            avctx->width / 2,
+                            avctx->height / 2))
+                return 0;
+        }
+    }
+
+    return 0;
+}
+
+static int decode_raw_intra(AVCodecContext *avctx, GetByteContext *gbyte, AVFrame *frame)
+{
+    uint8_t *y0dst = frame->data[0] + (avctx->height - 1) * frame->linesize[0];
+    uint8_t *y1dst = y0dst - frame->linesize[0];
+    uint8_t *udst = frame->data[1] + ((avctx->height >> 1) - 1) * frame->linesize[1];
+    uint8_t *vdst = frame->data[2] + ((avctx->height >> 1) - 1) * frame->linesize[2];
+    uint8_t ly0 = 0, ly1 = 0, ly2 = 0, ly3 = 0, lu = 0, lv = 0;
+
+    for (int y = 0; y < avctx->height / 2; y++) {
+        for (int x = 0; x < avctx->width / 2; x++) {
+            y0dst[x*2+0] = bytestream2_get_byte(gbyte) + ly0;
+            ly0 = y0dst[x*2+0];
+            y0dst[x*2+1] = bytestream2_get_byte(gbyte) + ly1;
+            ly1 = y0dst[x*2+1];
+            y1dst[x*2+0] = bytestream2_get_byte(gbyte) + ly2;
+            ly2 = y1dst[x*2+0];
+            y1dst[x*2+1] = bytestream2_get_byte(gbyte) + ly3;
+            ly3 = y1dst[x*2+1];
+            udst[x] = bytestream2_get_byte(gbyte) + lu;
+            lu = udst[x];
+            vdst[x] = bytestream2_get_byte(gbyte) + lv;
+            lv = vdst[x];
+        }
+
+        y0dst -= 2*frame->linesize[0];
+        y1dst -= 2*frame->linesize[0];
+        udst  -= frame->linesize[1];
+        vdst  -= frame->linesize[2];
+    }
+
+    return 0;
+}
+
+static int decode_intra(AVCodecContext *avctx, GetBitContext *gb, AVFrame *frame)
+{
+    AGMContext *s = avctx->priv_data;
+    int ret;
+
+    compute_quant_matrix(s, (2 * s->compression - 100) / 100.0);
+
+    s->blocks_w = avctx->coded_width  >> 3;
+    s->blocks_h = avctx->coded_height >> 3;
+
+    ret = decode_intra_plane(s, gb, s->size[0], s->luma_quant_matrix, frame, 0);
+    if (ret < 0)
+        return ret;
+
+    bytestream2_skip(&s->gbyte, s->size[0]);
+
+    s->blocks_w = avctx->coded_width  >> 4;
+    s->blocks_h = avctx->coded_height >> 4;
+
+    ret = decode_intra_plane(s, gb, s->size[1], s->chroma_quant_matrix, frame, 2);
+    if (ret < 0)
+        return ret;
+
+    bytestream2_skip(&s->gbyte, s->size[1]);
+
+    s->blocks_w = avctx->coded_width  >> 4;
+    s->blocks_h = avctx->coded_height >> 4;
+
+    ret = decode_intra_plane(s, gb, s->size[2], s->chroma_quant_matrix, frame, 1);
+    if (ret < 0)
+        return ret;
+
+    return 0;
+}
+
+static int decode_motion_vectors(AVCodecContext *avctx, GetBitContext *gb)
+{
+    AGMContext *s = avctx->priv_data;
+    int nb_mvs = ((avctx->coded_height + 15) >> 4) * ((avctx->coded_width + 15) >> 4);
+    int ret, skip = 0, value, map;
+
+    av_fast_padded_malloc(&s->mvectors, &s->mvectors_size,
+                          nb_mvs * sizeof(*s->mvectors));
+    if (!s->mvectors)
+        return AVERROR(ENOMEM);
+
+    if ((ret = init_get_bits8(gb, s->gbyte.buffer, bytestream2_get_bytes_left(&s->gbyte) -
+                                                   (s->size[0] + s->size[1] + s->size[2]))) < 0)
+        return ret;
+
+    memset(s->mvectors, 0, sizeof(*s->mvectors) * nb_mvs);
+
+    for (int i = 0; i < nb_mvs; i++) {
+        ret = read_code(gb, &skip, &value, &map, 1);
+        if (ret < 0)
+            return ret;
+        s->mvectors[i].x = value;
+        i += skip;
+    }
+
+    for (int i = 0; i < nb_mvs; i++) {
+        ret = read_code(gb, &skip, &value, &map, 1);
+        if (ret < 0)
+            return ret;
+        s->mvectors[i].y = value;
+        i += skip;
+    }
+
+    if (get_bits_left(gb) <= 0)
+        return AVERROR_INVALIDDATA;
+    skip = (get_bits_count(gb) >> 3) + 1;
+    bytestream2_skip(&s->gbyte, skip);
+
+    return 0;
+}
+
+static int decode_inter(AVCodecContext *avctx, GetBitContext *gb,
+                        AVFrame *frame, AVFrame *prev)
+{
+    AGMContext *s = avctx->priv_data;
+    int ret;
+
+    compute_quant_matrix(s, (2 * s->compression - 100) / 100.0);
+
+    if (s->flags & 2) {
+        ret = decode_motion_vectors(avctx, gb);
+        if (ret < 0)
+            return ret;
+    }
+
+    s->blocks_w = avctx->coded_width  >> 3;
+    s->blocks_h = avctx->coded_height >> 3;
+
+    ret = decode_inter_plane(s, gb, s->size[0], s->luma_quant_matrix, frame, prev, 0);
+    if (ret < 0)
+        return ret;
+
+    bytestream2_skip(&s->gbyte, s->size[0]);
+
+    s->blocks_w = avctx->coded_width  >> 4;
+    s->blocks_h = avctx->coded_height >> 4;
+
+    ret = decode_inter_plane(s, gb, s->size[1], s->chroma_quant_matrix, frame, prev, 2);
+    if (ret < 0)
+        return ret;
+
+    bytestream2_skip(&s->gbyte, s->size[1]);
+
+    s->blocks_w = avctx->coded_width  >> 4;
+    s->blocks_h = avctx->coded_height >> 4;
+
+    ret = decode_inter_plane(s, gb, s->size[2], s->chroma_quant_matrix, frame, prev, 1);
+    if (ret < 0)
+        return ret;
+
+    return 0;
+}
+
+typedef struct Node {
+    int parent;
+    int child[2];
+} Node;
+
+static void get_tree_codes(uint32_t *codes, Node *nodes, int idx, uint32_t pfx, int bitpos)
+{
+    if (idx < 256 && idx >= 0) {
+        codes[idx] = pfx;
+    } else if (idx >= 0) {
+        get_tree_codes(codes, nodes, nodes[idx].child[0], pfx + (0 << bitpos), bitpos + 1);
+        get_tree_codes(codes, nodes, nodes[idx].child[1], pfx + (1U << bitpos), bitpos + 1);
+    }
+}
+
+static int make_new_tree(const uint8_t *bitlens, uint32_t *codes)
+{
+    int zlcount = 0, curlen, idx, nindex, last, llast;
+    int blcounts[32] = { 0 };
+    int syms[8192];
+    Node nodes[512];
+    int node_idx[1024];
+    int old_idx[512];
+
+    for (int i = 0; i < 256; i++) {
+        int bitlen = bitlens[i];
+        int blcount = blcounts[bitlen];
+
+        zlcount += bitlen < 1;
+        syms[(bitlen << 8) + blcount] = i;
+        blcounts[bitlen]++;
+    }
+
+    for (int i = 0; i < 512; i++) {
+        nodes[i].child[0] = -1;
+        nodes[i].child[1] = -1;
+    }
+
+    for (int i = 0; i < 256; i++) {
+        node_idx[i] = 257 + i;
+    }
+
+    curlen = 1;
+    node_idx[512] = 256;
+    last = 255;
+    nindex = 1;
+
+    for (curlen = 1; curlen < 32; curlen++) {
+        if (blcounts[curlen] > 0) {
+            int max_zlcount = zlcount + blcounts[curlen];
+
+            for (int i = 0; zlcount < 256 && zlcount < max_zlcount; zlcount++, i++) {
+                int p = node_idx[nindex - 1 + 512];
+                int ch = syms[256 * curlen + i];
+
+                if (nindex <= 0)
+                    return AVERROR_INVALIDDATA;
+
+                if (nodes[p].child[0] == -1) {
+                    nodes[p].child[0] = ch;
+                } else {
+                    nodes[p].child[1] = ch;
+                    nindex--;
+                }
+                nodes[ch].parent = p;
+            }
+        }
+        llast = last - 1;
+        idx = 0;
+        while (nindex > 0) {
+            int p, ch;
+
+            last = llast - idx;
+            p = node_idx[nindex - 1 + 512];
+            ch = node_idx[last];
+            if (nodes[p].child[0] == -1) {
+                nodes[p].child[0] = ch;
+            } else {
+                nodes[p].child[1] = ch;
+                nindex--;
+            }
+            old_idx[idx] = ch;
+            nodes[ch].parent = p;
+            if (idx == llast)
+                goto next;
+            idx++;
+            if (nindex <= 0) {
+                for (int i = 0; i < idx; i++)
+                    node_idx[512 + i] = old_idx[i];
+            }
+        }
+        nindex = idx;
+    }
+
+next:
+
+    get_tree_codes(codes, nodes, 256, 0, 0);
+    return 0;
+}
+
+static int build_huff(const uint8_t *bitlen, VLC *vlc)
+{
+    uint32_t new_codes[256];
+    uint8_t bits[256];
+    uint8_t symbols[256];
+    uint32_t codes[256];
+    int nb_codes = 0;
+
+    int ret = make_new_tree(bitlen, new_codes);
+    if (ret < 0)
+        return ret;
+
+    for (int i = 0; i < 256; i++) {
+        if (bitlen[i]) {
+            bits[nb_codes] = bitlen[i];
+            codes[nb_codes] = new_codes[i];
+            symbols[nb_codes] = i;
+            nb_codes++;
+        }
+    }
+
+    ff_free_vlc(vlc);
+    return ff_init_vlc_sparse(vlc, 13, nb_codes,
+                              bits, 1, 1,
+                              codes, 4, 4,
+                              symbols, 1, 1,
+                              INIT_VLC_LE);
+}
+
+static int decode_huffman2(AVCodecContext *avctx, int header, int size)
+{
+    AGMContext *s = avctx->priv_data;
+    GetBitContext *gb = &s->gb;
+    uint8_t lens[256];
+    int ret, x, len;
+
+    if ((ret = init_get_bits8(gb, s->gbyte.buffer,
+                              bytestream2_get_bytes_left(&s->gbyte))) < 0)
+        return ret;
+
+    s->output_size = get_bits_long(gb, 32);
+
+    if (s->output_size > avctx->width * avctx->height * 9LL + 10000)
+        return AVERROR_INVALIDDATA;
+
+    av_fast_padded_malloc(&s->output, &s->padded_output_size, s->output_size);
+    if (!s->output)
+        return AVERROR(ENOMEM);
+
+    x = get_bits(gb, 1);
+    len = 4 + get_bits(gb, 1);
+    if (x) {
+        int cb[8] = { 0 };
+        int count = get_bits(gb, 3) + 1;
+
+        for (int i = 0; i < count; i++)
+            cb[i] = get_bits(gb, len);
+
+        for (int i = 0; i < 256; i++) {
+            int idx = get_bits(gb, 3);
+            lens[i] = cb[idx];
+        }
+    } else {
+        for (int i = 0; i < 256; i++)
+            lens[i] = get_bits(gb, len);
+    }
+
+    if ((ret = build_huff(lens, &s->vlc)) < 0)
+        return ret;
+
+    x = 0;
+    while (get_bits_left(gb) > 0 && x < s->output_size) {
+        int val = get_vlc2(gb, s->vlc.table, s->vlc.bits, 3);
+        if (val < 0)
+            return AVERROR_INVALIDDATA;
+        s->output[x++] = val;
+    }
+
+    return 0;
+}
+
+static int decode_frame(AVCodecContext *avctx, void *data,
+                        int *got_frame, AVPacket *avpkt)
+{
+    AGMContext *s = avctx->priv_data;
+    GetBitContext *gb = &s->gb;
+    GetByteContext *gbyte = &s->gbyte;
+    AVFrame *frame = data;
+    int w, h, width, height, header;
+    unsigned compressed_size;
+    long skip;
+    int ret;
+
+    if (!avpkt->size)
+        return 0;
+
+    bytestream2_init(gbyte, avpkt->data, avpkt->size);
+
+    header = bytestream2_get_le32(gbyte);
+    s->fflags = bytestream2_get_le32(gbyte);
+    s->bitstream_size = s->fflags & 0x1FFFFFFF;
+    s->fflags >>= 29;
+    av_log(avctx, AV_LOG_DEBUG, "fflags: %X\n", s->fflags);
+    if (avpkt->size < s->bitstream_size + 8)
+        return AVERROR_INVALIDDATA;
+
+    s->key_frame = (avpkt->flags & AV_PKT_FLAG_KEY);
+    frame->key_frame = s->key_frame;
+    frame->pict_type = s->key_frame ? AV_PICTURE_TYPE_I : AV_PICTURE_TYPE_P;
+
+    if (!s->key_frame) {
+        if (!s->prev_frame->data[0]) {
+            av_log(avctx, AV_LOG_ERROR, "Missing reference frame.\n");
+            return AVERROR_INVALIDDATA;
+        }
+    }
+
+    if (header) {
+        if (avctx->codec_tag == MKTAG('A', 'G', 'M', '0') ||
+            avctx->codec_tag == MKTAG('A', 'G', 'M', '1'))
+            return AVERROR_PATCHWELCOME;
+        else
+            ret = decode_huffman2(avctx, header, (avpkt->size - s->bitstream_size) - 8);
+        if (ret < 0)
+            return ret;
+        bytestream2_init(gbyte, s->output, s->output_size);
+    } else if (!s->dct) {
+        bytestream2_skip(gbyte, 4);
+    }
+
+    if (s->dct) {
+        s->flags = 0;
+        w = bytestream2_get_le32(gbyte);
+        h = bytestream2_get_le32(gbyte);
+        if (w == INT32_MIN || h == INT32_MIN)
+            return AVERROR_INVALIDDATA;
+        if (w < 0) {
+            w = -w;
+            s->flags |= 2;
+        }
+        if (h < 0) {
+            h = -h;
+            s->flags |= 1;
+        }
+
+        width  = avctx->width;
+        height = avctx->height;
+        if (w < width || h < height || w & 7 || h & 7)
+            return AVERROR_INVALIDDATA;
+
+        ret = ff_set_dimensions(avctx, w, h);
+        if (ret < 0)
+            return ret;
+        avctx->width = width;
+        avctx->height = height;
+
+        s->compression = bytestream2_get_le32(gbyte);
+        if (s->compression < 0 || s->compression > 100)
+            return AVERROR_INVALIDDATA;
+
+        for (int i = 0; i < 3; i++)
+            s->size[i] = bytestream2_get_le32(gbyte);
+        if (header) {
+            compressed_size = s->output_size;
+            skip = 8LL;
+        } else {
+            compressed_size = avpkt->size;
+            skip = 32LL;
+        }
+        if (s->size[0] < 0 || s->size[1] < 0 || s->size[2] < 0 ||
+            skip + s->size[0] + s->size[1] + s->size[2] > compressed_size) {
+            return AVERROR_INVALIDDATA;
+        }
+    }
+
+    if ((ret = ff_get_buffer(avctx, frame, AV_GET_BUFFER_FLAG_REF)) < 0)
+        return ret;
+
+    if (frame->key_frame) {
+        if (!s->dct && !s->rgb)
+            ret = decode_raw_intra(avctx, gbyte, frame);
+        else if (!s->dct && s->rgb)
+            ret = decode_raw_intra_rgb(avctx, gbyte, frame);
+        else
+            ret = decode_intra(avctx, gb, frame);
+    } else {
+        if (s->prev_frame-> width != frame->width ||
+            s->prev_frame->height != frame->height)
+            return AVERROR_INVALIDDATA;
+
+        if (!(s->flags & 2)) {
+            ret = av_frame_copy(frame, s->prev_frame);
+            if (ret < 0)
+                return ret;
+        }
+
+        if (s->dct) {
+            ret = decode_inter(avctx, gb, frame, s->prev_frame);
+        } else if (!s->dct && !s->rgb) {
+            ret = decode_runlen(avctx, gbyte, frame);
+        } else {
+            ret = decode_runlen_rgb(avctx, gbyte, frame);
+        }
+    }
+    if (ret < 0)
+        return ret;
+
+    av_frame_unref(s->prev_frame);
+    if ((ret = av_frame_ref(s->prev_frame, frame)) < 0)
+        return ret;
+
+    frame->crop_top  = avctx->coded_height - avctx->height;
+    frame->crop_left = avctx->coded_width  - avctx->width;
+
+    *got_frame = 1;
+
+    return avpkt->size;
+}
+
+static av_cold int decode_init(AVCodecContext *avctx)
+{
+    AGMContext *s = avctx->priv_data;
+
+    s->rgb = avctx->codec_tag == MKTAG('A', 'G', 'M', '4');
+    avctx->pix_fmt = s->rgb ? AV_PIX_FMT_BGR24 : AV_PIX_FMT_YUV420P;
+    s->avctx = avctx;
+    s->plus = avctx->codec_tag == MKTAG('A', 'G', 'M', '3') ||
+              avctx->codec_tag == MKTAG('A', 'G', 'M', '7');
+
+    s->dct = avctx->codec_tag != MKTAG('A', 'G', 'M', '4') &&
+             avctx->codec_tag != MKTAG('A', 'G', 'M', '5');
+
+    if (!s->rgb && !s->dct) {
+        if ((avctx->width & 1) || (avctx->height & 1))
+            return AVERROR_INVALIDDATA;
+    }
+
+    avctx->idct_algo = FF_IDCT_SIMPLE;
+    ff_idctdsp_init(&s->idsp, avctx);
+    ff_init_scantable(s->idsp.idct_permutation, &s->scantable, ff_zigzag_direct);
+
+    s->prev_frame = av_frame_alloc();
+    if (!s->prev_frame)
+        return AVERROR(ENOMEM);
+
+    return 0;
+}
+
+static void decode_flush(AVCodecContext *avctx)
+{
+    AGMContext *s = avctx->priv_data;
+
+    av_frame_unref(s->prev_frame);
+}
+
+static av_cold int decode_close(AVCodecContext *avctx)
+{
+    AGMContext *s = avctx->priv_data;
+
+    ff_free_vlc(&s->vlc);
+    av_frame_free(&s->prev_frame);
+    av_freep(&s->mvectors);
+    s->mvectors_size = 0;
+    av_freep(&s->wblocks);
+    s->wblocks_size = 0;
+    av_freep(&s->output);
+    s->padded_output_size = 0;
+    av_freep(&s->map);
+    s->map_size = 0;
+
+    return 0;
+}
+
+AVCodec ff_agm_decoder = {
+    .name             = "agm",
+    .long_name        = NULL_IF_CONFIG_SMALL("Amuse Graphics Movie"),
+    .type             = AVMEDIA_TYPE_VIDEO,
+    .id               = AV_CODEC_ID_AGM,
+    .priv_data_size   = sizeof(AGMContext),
+    .init             = decode_init,
+    .close            = decode_close,
+    .decode           = decode_frame,
+    .flush            = decode_flush,
+    .capabilities     = AV_CODEC_CAP_DR1,
+    .caps_internal    = FF_CODEC_CAP_INIT_THREADSAFE |
+                        FF_CODEC_CAP_INIT_CLEANUP |
+                        FF_CODEC_CAP_EXPORTS_CROPPING,
+};
diff --git a/libavcodec/aic.c b/libavcodec/aic.c
index 9c6f806..f027fa9 100644
--- a/libavcodec/aic.c
+++ b/libavcodec/aic.c
@@ -42,9 +42,9 @@
     NUM_BANDS
 };
 
-static const int aic_num_band_coeffs[NUM_BANDS] = { 64, 32, 192, 96 };
+static const uint8_t aic_num_band_coeffs[NUM_BANDS] = { 64, 32, 192, 96 };
 
-static const int aic_band_off[NUM_BANDS] = { 0, 64, 96, 288 };
+static const uint16_t aic_band_off[NUM_BANDS] = { 0, 64, 96, 288 };
 
 static const uint8_t aic_quant_matrix[64] = {
      8, 16, 19, 22, 22, 26, 26, 27,
@@ -208,6 +208,9 @@
     int mb, idx;
     unsigned val;
 
+    if (get_bits_left(gb) < 5)
+        return AVERROR_INVALIDDATA;
+
     has_skips  = get_bits1(gb);
     coeff_type = get_bits1(gb);
     coeff_bits = get_bits(gb, 3);
@@ -501,6 +504,5 @@
     .close          = aic_decode_close,
     .decode         = aic_decode_frame,
     .capabilities   = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_FRAME_THREADS,
-    .init_thread_copy = ONLY_IF_THREADS_ENABLED(aic_decode_init),
     .caps_internal  = FF_CODEC_CAP_INIT_THREADSAFE,
 };
diff --git a/libavcodec/alac.c b/libavcodec/alac.c
index 93cf198..c8c0422 100644
--- a/libavcodec/alac.c
+++ b/libavcodec/alac.c
@@ -121,7 +121,7 @@
         unsigned int x;
 
         if(get_bits_left(&alac->gb) <= 0)
-            return -1;
+            return AVERROR_INVALIDDATA;
 
         /* calculate rice param and decode next value */
         k = av_log2((history >> 9) + 3);
@@ -171,12 +171,12 @@
     return v ? FFSIGN(v) : 0;
 }
 
-static void lpc_prediction(int32_t *error_buffer, int32_t *buffer_out,
+static void lpc_prediction(int32_t *error_buffer, uint32_t *buffer_out,
                            int nb_samples, int bps, int16_t *lpc_coefs,
                            int lpc_order, int lpc_quant)
 {
     int i;
-    int32_t *pred = buffer_out;
+    uint32_t *pred = buffer_out;
 
     /* first sample always copies */
     *buffer_out = *error_buffer;
@@ -208,27 +208,27 @@
     for (; i < nb_samples; i++) {
         int j;
         int val = 0;
-        int error_val = error_buffer[i];
+        unsigned error_val = error_buffer[i];
         int error_sign;
         int d = *pred++;
 
         /* LPC prediction */
         for (j = 0; j < lpc_order; j++)
             val += (pred[j] - d) * lpc_coefs[j];
-        val = (val + (1 << (lpc_quant - 1))) >> lpc_quant;
+        val = (val + (1LL << (lpc_quant - 1))) >> lpc_quant;
         val += d + error_val;
         buffer_out[i] = sign_extend(val, bps);
 
         /* adapt LPC coefficients */
         error_sign = sign_only(error_val);
         if (error_sign) {
-            for (j = 0; j < lpc_order && error_val * error_sign > 0; j++) {
+            for (j = 0; j < lpc_order && (int)(error_val * error_sign) > 0; j++) {
                 int sign;
                 val  = d - pred[j];
                 sign = sign_only(val) * error_sign;
                 lpc_coefs[j] -= sign;
-                val *= sign;
-                error_val -= (val >> lpc_quant) * (j + 1);
+                val *= (unsigned)sign;
+                error_val -= (val >> lpc_quant) * (j + 1U);
             }
         }
     }
@@ -250,10 +250,12 @@
 
     alac->extra_bits = get_bits(&alac->gb, 2) << 3;
     bps = alac->sample_size - alac->extra_bits + channels - 1;
-    if (bps > 32U) {
+    if (bps > 32) {
         avpriv_report_missing_feature(avctx, "bps %d", bps);
         return AVERROR_PATCHWELCOME;
     }
+    if (bps < 1)
+        return AVERROR_INVALIDDATA;
 
     /* whether the frame is compressed */
     is_compressed = !get_bits1(&alac->gb);
@@ -306,7 +308,7 @@
             rice_history_mult[ch] = get_bits(&alac->gb, 3);
             lpc_order[ch]         = get_bits(&alac->gb, 5);
 
-            if (lpc_order[ch] >= alac->max_samples_per_frame)
+            if (lpc_order[ch] >= alac->max_samples_per_frame || !lpc_quant[ch])
                 return AVERROR_INVALIDDATA;
 
             /* read the predictor table */
@@ -317,7 +319,7 @@
         if (alac->extra_bits) {
             for (i = 0; i < alac->nb_samples; i++) {
                 if(get_bits_left(&alac->gb) <= 0)
-                    return -1;
+                    return AVERROR_INVALIDDATA;
                 for (ch = 0; ch < channels; ch++)
                     alac->extra_bits_buffer[ch][i] = get_bits(&alac->gb, alac->extra_bits);
             }
@@ -353,7 +355,7 @@
         /* not compressed, easy case */
         for (i = 0; i < alac->nb_samples; i++) {
             if(get_bits_left(&alac->gb) <= 0)
-                return -1;
+                return AVERROR_INVALIDDATA;
             for (ch = 0; ch < channels; ch++) {
                 alac->output_samples_buffer[ch][i] =
                          get_sbits_long(&alac->gb, alac->sample_size);
@@ -395,13 +397,13 @@
     case 20: {
         for (ch = 0; ch < channels; ch++) {
             for (i = 0; i < alac->nb_samples; i++)
-                alac->output_samples_buffer[ch][i] <<= 12;
+                alac->output_samples_buffer[ch][i] *= 1 << 12;
         }}
         break;
     case 24: {
         for (ch = 0; ch < channels; ch++) {
             for (i = 0; i < alac->nb_samples; i++)
-                alac->output_samples_buffer[ch][i] <<= 8;
+                alac->output_samples_buffer[ch][i] *= 1 << 8;
         }}
         break;
     }
@@ -486,7 +488,7 @@
 static int allocate_buffers(ALACContext *alac)
 {
     int ch;
-    int buf_size = alac->max_samples_per_frame * sizeof(int32_t);
+    unsigned buf_size = alac->max_samples_per_frame * sizeof(int32_t);
 
     for (ch = 0; ch < 2; ch++) {
         alac->predict_error_buffer[ch]  = NULL;
@@ -555,9 +557,9 @@
         av_log(avctx, AV_LOG_ERROR, "extradata is too small\n");
         return AVERROR_INVALIDDATA;
     }
-    if (alac_set_info(alac)) {
+    if ((ret = alac_set_info(alac)) < 0) {
         av_log(avctx, AV_LOG_ERROR, "set_info failed\n");
-        return -1;
+        return ret;
     }
 
     switch (alac->sample_size) {
@@ -599,15 +601,6 @@
     return 0;
 }
 
-#if HAVE_THREADS
-static int init_thread_copy(AVCodecContext *avctx)
-{
-    ALACContext *alac = avctx->priv_data;
-    alac->avctx = avctx;
-    return allocate_buffers(alac);
-}
-#endif
-
 static const AVOption options[] = {
     { "extra_bits_bug", "Force non-standard decoding process",
       offsetof(ALACContext, extra_bit_bug), AV_OPT_TYPE_BOOL, { .i64 = 0 },
@@ -631,7 +624,6 @@
     .init           = alac_decode_init,
     .close          = alac_decode_close,
     .decode         = alac_decode_frame,
-    .init_thread_copy = ONLY_IF_THREADS_ENABLED(init_thread_copy),
     .capabilities   = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_FRAME_THREADS,
     .priv_class     = &alac_class
 };
diff --git a/libavcodec/aliaspixdec.c b/libavcodec/aliaspixdec.c
index 087b18f..def7e17 100644
--- a/libavcodec/aliaspixdec.c
+++ b/libavcodec/aliaspixdec.c
@@ -62,6 +62,9 @@
     if (ret < 0)
         return ret;
 
+    if (bytestream2_get_bytes_left(&gb) < width*height / 255)
+        return AVERROR_INVALIDDATA;
+
     ret = ff_get_buffer(avctx, f, 0);
     if (ret < 0)
         return ret;
diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c
index c0b4d56..e7b2942 100644
--- a/libavcodec/allcodecs.c
+++ b/libavcodec/allcodecs.c
@@ -35,12 +35,14 @@
 extern AVCodec ff_aic_decoder;
 extern AVCodec ff_alias_pix_encoder;
 extern AVCodec ff_alias_pix_decoder;
+extern AVCodec ff_agm_decoder;
 extern AVCodec ff_amv_encoder;
 extern AVCodec ff_amv_decoder;
 extern AVCodec ff_anm_decoder;
 extern AVCodec ff_ansi_decoder;
 extern AVCodec ff_apng_encoder;
 extern AVCodec ff_apng_decoder;
+extern AVCodec ff_arbc_decoder;
 extern AVCodec ff_asv1_encoder;
 extern AVCodec ff_asv1_decoder;
 extern AVCodec ff_asv2_encoder;
@@ -66,6 +68,7 @@
 extern AVCodec ff_c93_decoder;
 extern AVCodec ff_cavs_decoder;
 extern AVCodec ff_cdgraphics_decoder;
+extern AVCodec ff_cdtoons_decoder;
 extern AVCodec ff_cdxl_decoder;
 extern AVCodec ff_cfhd_decoder;
 extern AVCodec ff_cinepak_encoder;
@@ -152,9 +155,11 @@
 extern AVCodec ff_hqx_decoder;
 extern AVCodec ff_huffyuv_encoder;
 extern AVCodec ff_huffyuv_decoder;
+extern AVCodec ff_hymt_decoder;
 extern AVCodec ff_idcin_decoder;
 extern AVCodec ff_iff_ilbm_decoder;
 extern AVCodec ff_imm4_decoder;
+extern AVCodec ff_imm5_decoder;
 extern AVCodec ff_indeo2_decoder;
 extern AVCodec ff_indeo3_decoder;
 extern AVCodec ff_indeo4_decoder;
@@ -170,6 +175,7 @@
 extern AVCodec ff_lagarith_decoder;
 extern AVCodec ff_ljpeg_encoder;
 extern AVCodec ff_loco_decoder;
+extern AVCodec ff_lscr_decoder;
 extern AVCodec ff_m101_decoder;
 extern AVCodec ff_magicyuv_encoder;
 extern AVCodec ff_magicyuv_decoder;
@@ -211,8 +217,11 @@
 extern AVCodec ff_msvideo1_decoder;
 extern AVCodec ff_mszh_decoder;
 extern AVCodec ff_mts2_decoder;
+extern AVCodec ff_mv30_decoder;
 extern AVCodec ff_mvc1_decoder;
 extern AVCodec ff_mvc2_decoder;
+extern AVCodec ff_mvdv_decoder;
+extern AVCodec ff_mvha_decoder;
 extern AVCodec ff_mwsc_decoder;
 extern AVCodec ff_mxpeg_decoder;
 extern AVCodec ff_nuv_decoder;
@@ -267,7 +276,6 @@
 extern AVCodec ff_sanm_decoder;
 extern AVCodec ff_scpr_decoder;
 extern AVCodec ff_screenpresso_decoder;
-extern AVCodec ff_sdx2_dpcm_decoder;
 extern AVCodec ff_sgi_encoder;
 extern AVCodec ff_sgi_decoder;
 extern AVCodec ff_sgirle_decoder;
@@ -326,6 +334,7 @@
 extern AVCodec ff_vmdvideo_decoder;
 extern AVCodec ff_vmnc_decoder;
 extern AVCodec ff_vp3_decoder;
+extern AVCodec ff_vp4_decoder;
 extern AVCodec ff_vp5_decoder;
 extern AVCodec ff_vp6_decoder;
 extern AVCodec ff_vp6a_decoder;
@@ -382,6 +391,7 @@
 extern AVCodec ff_ac3_decoder;
 extern AVCodec ff_ac3_fixed_encoder;
 extern AVCodec ff_ac3_fixed_decoder;
+extern AVCodec ff_acelp_kelvin_decoder;
 extern AVCodec ff_alac_encoder;
 extern AVCodec ff_alac_decoder;
 extern AVCodec ff_als_decoder;
@@ -423,6 +433,8 @@
 extern AVCodec ff_g729_decoder;
 extern AVCodec ff_gsm_decoder;
 extern AVCodec ff_gsm_ms_decoder;
+extern AVCodec ff_hca_decoder;
+extern AVCodec ff_hcom_decoder;
 extern AVCodec ff_iac_decoder;
 extern AVCodec ff_ilbc_decoder;
 extern AVCodec ff_imc_decoder;
@@ -463,6 +475,7 @@
 extern AVCodec ff_sbc_decoder;
 extern AVCodec ff_shorten_decoder;
 extern AVCodec ff_sipr_decoder;
+extern AVCodec ff_siren_decoder;
 extern AVCodec ff_smackaud_decoder;
 extern AVCodec ff_sonic_encoder;
 extern AVCodec ff_sonic_decoder;
@@ -494,6 +507,7 @@
 extern AVCodec ff_pcm_alaw_encoder;
 extern AVCodec ff_pcm_alaw_decoder;
 extern AVCodec ff_pcm_bluray_decoder;
+extern AVCodec ff_pcm_dvd_encoder;
 extern AVCodec ff_pcm_dvd_decoder;
 extern AVCodec ff_pcm_f16le_decoder;
 extern AVCodec ff_pcm_f24le_decoder;
@@ -552,13 +566,16 @@
 extern AVCodec ff_pcm_u32be_decoder;
 extern AVCodec ff_pcm_u32le_encoder;
 extern AVCodec ff_pcm_u32le_decoder;
-extern AVCodec ff_pcm_zork_decoder;
+extern AVCodec ff_pcm_vidc_encoder;
+extern AVCodec ff_pcm_vidc_decoder;
 
 /* DPCM codecs */
+extern AVCodec ff_derf_dpcm_decoder;
 extern AVCodec ff_gremlin_dpcm_decoder;
 extern AVCodec ff_interplay_dpcm_decoder;
 extern AVCodec ff_roq_dpcm_encoder;
 extern AVCodec ff_roq_dpcm_decoder;
+extern AVCodec ff_sdx2_dpcm_decoder;
 extern AVCodec ff_sol_dpcm_decoder;
 extern AVCodec ff_xan_dpcm_decoder;
 
@@ -567,7 +584,9 @@
 extern AVCodec ff_adpcm_adx_encoder;
 extern AVCodec ff_adpcm_adx_decoder;
 extern AVCodec ff_adpcm_afc_decoder;
+extern AVCodec ff_adpcm_agm_decoder;
 extern AVCodec ff_adpcm_aica_decoder;
+extern AVCodec ff_adpcm_argo_decoder;
 extern AVCodec ff_adpcm_ct_decoder;
 extern AVCodec ff_adpcm_dtk_decoder;
 extern AVCodec ff_adpcm_ea_decoder;
@@ -583,17 +602,21 @@
 extern AVCodec ff_adpcm_g726le_encoder;
 extern AVCodec ff_adpcm_g726le_decoder;
 extern AVCodec ff_adpcm_ima_amv_decoder;
+extern AVCodec ff_adpcm_ima_alp_decoder;
 extern AVCodec ff_adpcm_ima_apc_decoder;
+extern AVCodec ff_adpcm_ima_apm_decoder;
 extern AVCodec ff_adpcm_ima_dat4_decoder;
 extern AVCodec ff_adpcm_ima_dk3_decoder;
 extern AVCodec ff_adpcm_ima_dk4_decoder;
 extern AVCodec ff_adpcm_ima_ea_eacs_decoder;
 extern AVCodec ff_adpcm_ima_ea_sead_decoder;
 extern AVCodec ff_adpcm_ima_iss_decoder;
+extern AVCodec ff_adpcm_ima_mtf_decoder;
 extern AVCodec ff_adpcm_ima_oki_decoder;
 extern AVCodec ff_adpcm_ima_qt_encoder;
 extern AVCodec ff_adpcm_ima_qt_decoder;
 extern AVCodec ff_adpcm_ima_rad_decoder;
+extern AVCodec ff_adpcm_ima_ssi_decoder;
 extern AVCodec ff_adpcm_ima_smjpeg_decoder;
 extern AVCodec ff_adpcm_ima_wav_encoder;
 extern AVCodec ff_adpcm_ima_wav_decoder;
@@ -613,6 +636,7 @@
 extern AVCodec ff_adpcm_xa_decoder;
 extern AVCodec ff_adpcm_yamaha_encoder;
 extern AVCodec ff_adpcm_yamaha_decoder;
+extern AVCodec ff_adpcm_zork_decoder;
 
 /* subtitles */
 extern AVCodec ff_ssa_encoder;
@@ -669,11 +693,12 @@
 extern AVCodec ff_pcm_mulaw_at_decoder;
 extern AVCodec ff_qdmc_at_decoder;
 extern AVCodec ff_qdm2_at_decoder;
-extern AVCodec ff_libaom_av1_decoder;
 extern AVCodec ff_libaom_av1_encoder;
+extern AVCodec ff_libaribb24_decoder;
 extern AVCodec ff_libcelt_decoder;
 extern AVCodec ff_libcodec2_encoder;
 extern AVCodec ff_libcodec2_decoder;
+extern AVCodec ff_libdav1d_decoder;
 extern AVCodec ff_libdavs2_decoder;
 extern AVCodec ff_libfdk_aac_encoder;
 extern AVCodec ff_libfdk_aac_decoder;
@@ -691,6 +716,7 @@
 extern AVCodec ff_libopenjpeg_decoder;
 extern AVCodec ff_libopus_encoder;
 extern AVCodec ff_libopus_decoder;
+extern AVCodec ff_librav1e_encoder;
 extern AVCodec ff_librsvg_decoder;
 extern AVCodec ff_libshine_encoder;
 extern AVCodec ff_libspeex_encoder;
@@ -725,6 +751,7 @@
 /* external libraries, that shouldn't be used by default if one of the
  * above is available */
 extern AVCodec ff_h263_v4l2m2m_encoder;
+extern AVCodec ff_libaom_av1_decoder;
 extern AVCodec ff_libopenh264_encoder;
 extern AVCodec ff_libopenh264_decoder;
 extern AVCodec ff_h264_amf_encoder;
@@ -751,6 +778,7 @@
 extern AVCodec ff_libkvazaar_encoder;
 extern AVCodec ff_mjpeg_cuvid_decoder;
 extern AVCodec ff_mjpeg_qsv_encoder;
+extern AVCodec ff_mjpeg_qsv_decoder;
 extern AVCodec ff_mjpeg_vaapi_encoder;
 extern AVCodec ff_mpeg1_cuvid_decoder;
 extern AVCodec ff_mpeg2_cuvid_decoder;
@@ -758,6 +786,7 @@
 extern AVCodec ff_mpeg2_vaapi_encoder;
 extern AVCodec ff_mpeg4_cuvid_decoder;
 extern AVCodec ff_mpeg4_mediacodec_decoder;
+extern AVCodec ff_mpeg4_omx_encoder;
 extern AVCodec ff_mpeg4_v4l2m2m_encoder;
 extern AVCodec ff_vc1_cuvid_decoder;
 extern AVCodec ff_vp8_cuvid_decoder;
@@ -767,7 +796,9 @@
 extern AVCodec ff_vp8_vaapi_encoder;
 extern AVCodec ff_vp9_cuvid_decoder;
 extern AVCodec ff_vp9_mediacodec_decoder;
+extern AVCodec ff_vp9_qsv_decoder;
 extern AVCodec ff_vp9_vaapi_encoder;
+extern AVCodec ff_vp9_qsv_encoder;
 
 // The iterate API is not usable with ossfuzz due to the excessive size of binaries created
 #if CONFIG_OSSFUZZ
diff --git a/libavcodec/alsdec.c b/libavcodec/alsdec.c
index ca8701e..62c6036 100644
--- a/libavcodec/alsdec.c
+++ b/libavcodec/alsdec.c
@@ -236,6 +236,7 @@
     int **raw_mantissa;             ///< decoded mantissa bits of the difference signal
     unsigned char *larray;          ///< buffer to store the output of masked lz decompression
     int *nbits;                     ///< contains the number of bits to read for masked lz decompression for all samples
+    int highest_decoded_channel;
 } ALSDecContext;
 
 
@@ -302,8 +303,8 @@
     if ((ret = init_get_bits8(&gb, avctx->extradata, avctx->extradata_size)) < 0)
         return ret;
 
-    config_offset = avpriv_mpeg4audio_get_config(&m4ac, avctx->extradata,
-                                                 avctx->extradata_size * 8, 1);
+    config_offset = avpriv_mpeg4audio_get_config2(&m4ac, avctx->extradata,
+                                                  avctx->extradata_size, 1, avctx);
 
     if (config_offset < 0)
         return AVERROR_INVALIDDATA;
@@ -348,6 +349,11 @@
     if (als_id != MKBETAG('A','L','S','\0'))
         return AVERROR_INVALIDDATA;
 
+    if (avctx->channels > FF_SANE_NB_CHANNELS) {
+        avpriv_request_sample(avctx, "Huge number of channels\n");
+        return AVERROR_PATCHWELCOME;
+    }
+
     ctx->cur_frame_length = sconf->frame_length;
 
     // read channel config
@@ -487,7 +493,7 @@
 static int32_t decode_rice(GetBitContext *gb, unsigned int k)
 {
     int max = get_bits_left(gb) - k;
-    int q   = get_unary(gb, 0, max);
+    unsigned q = get_unary(gb, 0, max);
     int r   = k ? get_bits1(gb) : !(q & 1);
 
     if (k > 1) {
@@ -507,7 +513,7 @@
     int i, j;
 
     for (i = 0, j = k - 1; i < j; i++, j--) {
-        int tmp1 = ((MUL64(par[k], cof[j]) + (1 << 19)) >> 20);
+        unsigned tmp1 = ((MUL64(par[k], cof[j]) + (1 << 19)) >> 20);
         cof[j]  += ((MUL64(par[k], cof[i]) + (1 << 19)) >> 20);
         cof[i]  += tmp1;
     }
@@ -657,7 +663,7 @@
 
     // do not continue in case of a damaged stream since
     // block_length must be evenly divisible by sub_blocks
-    if (bd->block_length & (sub_blocks - 1)) {
+    if (bd->block_length & (sub_blocks - 1) || bd->block_length <= 0) {
         av_log(avctx, AV_LOG_WARNING,
                "Block length is not evenly divisible by the number of subblocks.\n");
         return AVERROR_INVALIDDATA;
@@ -767,8 +773,8 @@
         if (*bd->use_ltp) {
             int r, c;
 
-            bd->ltp_gain[0]   = decode_rice(gb, 1) << 3;
-            bd->ltp_gain[1]   = decode_rice(gb, 2) << 3;
+            bd->ltp_gain[0]   = decode_rice(gb, 1) * 8;
+            bd->ltp_gain[1]   = decode_rice(gb, 2) * 8;
 
             r                 = get_unary(gb, 0, 4);
             c                 = get_bits(gb, 2);
@@ -779,8 +785,8 @@
 
             bd->ltp_gain[2]   = ltp_gain_values[r][c];
 
-            bd->ltp_gain[3]   = decode_rice(gb, 2) << 3;
-            bd->ltp_gain[4]   = decode_rice(gb, 1) << 3;
+            bd->ltp_gain[3]   = decode_rice(gb, 2) * 8;
+            bd->ltp_gain[4]   = decode_rice(gb, 1) * 8;
 
             *bd->ltp_lag      = get_bits(gb, ctx->ltp_lag_length);
             *bd->ltp_lag     += FFMAX(4, opt_order + 1);
@@ -789,14 +795,20 @@
 
     // read first value and residuals in case of a random access block
     if (bd->ra_block) {
+        start = FFMIN(opt_order, 3);
+        av_assert0(sb_length <= sconf->frame_length);
+        if (sb_length <= start) {
+            // opt_order or sb_length may be corrupted, either way this is unsupported and not well defined in the specification
+            av_log(avctx, AV_LOG_ERROR, "Sub block length smaller or equal start\n");
+            return AVERROR_PATCHWELCOME;
+        }
+
         if (opt_order)
             bd->raw_samples[0] = decode_rice(gb, avctx->bits_per_raw_sample - 4);
         if (opt_order > 1)
             bd->raw_samples[1] = decode_rice(gb, FFMIN(s[0] + 3, ctx->s_max));
         if (opt_order > 2)
             bd->raw_samples[2] = decode_rice(gb, FFMIN(s[0] + 1, ctx->s_max));
-
-        start = FFMIN(opt_order, 3);
     }
 
     // read all residuals
@@ -810,7 +822,9 @@
         unsigned int low;
         unsigned int value;
 
-        ff_bgmc_decode_init(gb, &high, &low, &value);
+        int ret = ff_bgmc_decode_init(gb, &high, &low, &value);
+        if (ret < 0)
+            return ret;
 
         current_res = bd->raw_samples + start;
 
@@ -820,6 +834,9 @@
             k    [sb] = s[sb] > b ? s[sb] - b : 0;
             delta[sb] = 5 - s[sb] + k[sb];
 
+            if (k[sb] >= 32)
+                return AVERROR_INVALIDDATA;
+
             ff_bgmc_decode(gb, sb_len, current_res,
                         delta[sb], sx[sb], &high, &low, &value, ctx->bgmc_lut, ctx->bgmc_lut_status);
 
@@ -861,7 +878,7 @@
                     res >>= 1;
 
                     if (cur_k) {
-                        res  *= 1 << cur_k;
+                        res  *= 1U << cur_k;
                         res  |= get_bits_long(gb, cur_k);
                     }
                 }
@@ -912,7 +929,7 @@
             y = 1 << 6;
 
             for (base = begin; base < end; base++, tab++)
-                y += MUL64(bd->ltp_gain[tab], raw_samples[base]);
+                y += (uint64_t)MUL64(bd->ltp_gain[tab], raw_samples[base]);
 
             raw_samples[ltp_smp] += y >> 7;
         }
@@ -924,7 +941,7 @@
             y = 1 << 19;
 
             for (sb = 0; sb < smp; sb++)
-                y += MUL64(lpc_cof[sb], raw_samples[-(sb + 1)]);
+                y += (uint64_t)MUL64(lpc_cof[sb], raw_samples[-(sb + 1)]);
 
             *raw_samples++ -= y >> 20;
             parcor_to_lpc(smp, quant_cof, lpc_cof);
@@ -940,7 +957,7 @@
 
         // reconstruct difference signal for prediction (joint-stereo)
         if (bd->js_blocks && bd->raw_other) {
-            int32_t *left, *right;
+            uint32_t *left, *right;
 
             if (bd->raw_other > raw_samples) {  // D = R - L
                 left  = raw_samples;
@@ -974,7 +991,7 @@
         y = 1 << 19;
 
         for (sb = -opt_order; sb < 0; sb++)
-            y += MUL64(lpc_cof[sb], raw_samples[sb]);
+            y += (uint64_t)MUL64(lpc_cof[sb], raw_samples[sb]);
 
         *raw_samples -= y >> 20;
     }
@@ -1033,7 +1050,7 @@
 
     if (*bd->shift_lsbs)
         for (smp = 0; smp < bd->block_length; smp++)
-            bd->raw_samples[smp] <<= *bd->shift_lsbs;
+            bd->raw_samples[smp] = (unsigned)bd->raw_samples[smp] << *bd->shift_lsbs;
 
     return 0;
 }
@@ -1169,10 +1186,10 @@
                 av_log(ctx->avctx, AV_LOG_WARNING, "Invalid channel pair.\n");
 
             for (s = 0; s < div_blocks[b]; s++)
-                bd[0].raw_samples[s] = bd[1].raw_samples[s] - bd[0].raw_samples[s];
+                bd[0].raw_samples[s] = bd[1].raw_samples[s] - (unsigned)bd[0].raw_samples[s];
         } else if (bd[1].js_blocks) {
             for (s = 0; s < div_blocks[b]; s++)
-                bd[1].raw_samples[s] = bd[1].raw_samples[s] + bd[0].raw_samples[s];
+                bd[1].raw_samples[s] = bd[1].raw_samples[s] + (unsigned)bd[0].raw_samples[s];
         }
 
         offset  += div_blocks[b];
@@ -1379,6 +1396,9 @@
     mantissa_temp = (uint64_t)a.mant * (uint64_t)b.mant;
     mask_64       = (uint64_t)0x1 << 47;
 
+    if (!mantissa_temp)
+        return FLOAT_0;
+
     // Count the valid bit count
     while (!(mantissa_temp & mask_64) && mask_64) {
         bit_count--;
@@ -1395,7 +1415,11 @@
         }
     }
 
-    mantissa = (unsigned int)(mantissa_temp >> cutoff_bit_count);
+    if (cutoff_bit_count >= 0) {
+        mantissa = (unsigned int)(mantissa_temp >> cutoff_bit_count);
+    } else {
+        mantissa = (unsigned int)(mantissa_temp <<-cutoff_bit_count);
+    }
 
     // Need one more shift?
     if (mantissa & 0x01000000ul) {
@@ -1407,7 +1431,7 @@
         return_val = 0x80000000U;
     }
 
-    return_val |= (a.exp + b.exp + bit_count - 47) << 23;
+    return_val |= ((unsigned)av_clip(a.exp + b.exp + bit_count - 47, -126, 127) << 23) & 0x7F800000;
     return_val |= mantissa;
     return av_bits2sf_ieee754(return_val);
 }
@@ -1452,6 +1476,9 @@
         ff_mlz_flush_dict(ctx->mlz);
     }
 
+    if (avctx->channels * 8 > get_bits_left(gb))
+        return AVERROR_INVALIDDATA;
+
     for (c = 0; c < avctx->channels; ++c) {
         if (use_acf) {
             //acf_flag
@@ -1652,6 +1679,7 @@
             memmove(ctx->raw_samples[c] - sconf->max_order,
                     ctx->raw_samples[c] - sconf->max_order + sconf->frame_length,
                     sizeof(*ctx->raw_samples[c]) * sconf->max_order);
+            ctx->highest_decoded_channel = c;
         }
     } else { // multi-channel coding
         ALSBlockData   bd = { 0 };
@@ -1720,6 +1748,8 @@
 
                 if ((ret = decode_block(ctx, &bd)) < 0)
                     return ret;
+
+                ctx->highest_decoded_channel = FFMAX(ctx->highest_decoded_channel, c);
             }
 
             memset(reverted_channels, 0, avctx->channels * sizeof(*reverted_channels));
@@ -1776,11 +1806,15 @@
     else
         ctx->cur_frame_length = sconf->frame_length;
 
+    ctx->highest_decoded_channel = 0;
     // decode the frame data
     if ((invalid_frame = read_frame_data(ctx, ra_frame)) < 0)
         av_log(ctx->avctx, AV_LOG_WARNING,
                "Reading frame data failed. Skipping RA unit.\n");
 
+    if (ctx->highest_decoded_channel == 0)
+        return AVERROR_INVALIDDATA;
+
     ctx->frame_id++;
 
     /* get output buffer */
@@ -1792,15 +1826,18 @@
     #define INTERLEAVE_OUTPUT(bps)                                                   \
     {                                                                                \
         int##bps##_t *dest = (int##bps##_t*)frame->data[0];                          \
+        int channels = avctx->channels;                                              \
+        int32_t *raw_samples = ctx->raw_samples[0];                                  \
+        int raw_step = channels > 1 ? ctx->raw_samples[1] - raw_samples : 1;         \
         shift = bps - ctx->avctx->bits_per_raw_sample;                               \
         if (!ctx->cs_switch) {                                                       \
             for (sample = 0; sample < ctx->cur_frame_length; sample++)               \
-                for (c = 0; c < avctx->channels; c++)                                \
-                    *dest++ = ctx->raw_samples[c][sample] << shift;                  \
+                for (c = 0; c < channels; c++)                                       \
+                    *dest++ = raw_samples[c*raw_step + sample] * (1U << shift);      \
         } else {                                                                     \
             for (sample = 0; sample < ctx->cur_frame_length; sample++)               \
-                for (c = 0; c < avctx->channels; c++)                                \
-                    *dest++ = ctx->raw_samples[sconf->chan_pos[c]][sample] << shift; \
+                for (c = 0; c < channels; c++)                                       \
+                    *dest++ = raw_samples[sconf->chan_pos[c]*raw_step + sample] * (1U << shift);\
         }                                                                            \
     }
 
@@ -1984,6 +2021,8 @@
 
     // allocate quantized parcor coefficient buffer
     num_buffers = sconf->mc_coding ? avctx->channels : 1;
+    if (num_buffers * (uint64_t)num_buffers > INT_MAX) // protect chan_data_buffer allocation
+        return AVERROR_INVALIDDATA;
 
     ctx->quant_cof        = av_malloc_array(num_buffers, sizeof(*ctx->quant_cof));
     ctx->lpc_cof          = av_malloc_array(num_buffers, sizeof(*ctx->lpc_cof));
@@ -2116,7 +2155,6 @@
     return 0;
 
 fail:
-    decode_end(avctx);
     return ret;
 }
 
@@ -2142,4 +2180,5 @@
     .decode         = decode_frame,
     .flush          = flush,
     .capabilities   = AV_CODEC_CAP_SUBFRAMES | AV_CODEC_CAP_DR1,
+    .caps_internal  = FF_CODEC_CAP_INIT_CLEANUP,
 };
diff --git a/libavcodec/amfenc.c b/libavcodec/amfenc.c
index 384d8ef..876fddd 100644
--- a/libavcodec/amfenc.c
+++ b/libavcodec/amfenc.c
@@ -213,6 +213,7 @@
 static int amf_init_context(AVCodecContext *avctx)
 {
     AmfContext *ctx = avctx->priv_data;
+    AMFContext1 *context1 = NULL;
     AMF_RESULT  res;
     av_unused int ret;
 
@@ -311,8 +312,20 @@
             if (res == AMF_OK) {
                 av_log(avctx, AV_LOG_VERBOSE, "AMF initialisation succeeded via D3D9.\n");
             } else {
-                av_log(avctx, AV_LOG_ERROR, "AMF initialisation failed via D3D9: error %d.\n", res);
-                return AVERROR(ENOSYS);
+                AMFGuid guid = IID_AMFContext1();
+                res = ctx->context->pVtbl->QueryInterface(ctx->context, &guid, (void**)&context1);
+                AMF_RETURN_IF_FALSE(ctx, res == AMF_OK, AVERROR_UNKNOWN, "CreateContext1() failed with error %d\n", res);
+
+                res = context1->pVtbl->InitVulkan(context1, NULL);
+                context1->pVtbl->Release(context1);
+                if (res != AMF_OK) {
+                    if (res == AMF_NOT_SUPPORTED)
+                        av_log(avctx, AV_LOG_ERROR, "AMF via Vulkan is not supported on the given device.\n");
+                    else
+                        av_log(avctx, AV_LOG_ERROR, "AMF failed to initialise on the given Vulkan device: %d.\n", res);
+                    return AVERROR(ENOSYS);
+                }
+                av_log(avctx, AV_LOG_VERBOSE, "AMF initialisation succeeded via Vulkan.\n");
             }
         }
     }
@@ -438,7 +451,7 @@
     int64_t          timestamp = AV_NOPTS_VALUE;
     int64_t          size = buffer->pVtbl->GetSize(buffer);
 
-    if ((ret = ff_alloc_packet2(avctx, pkt, size, 0)) < 0) {
+    if ((ret = av_new_packet(pkt, size)) < 0) {
         return ret;
     }
     memcpy(pkt->data, buffer->pVtbl->GetNative(buffer), size);
diff --git a/libavcodec/amfenc_h264.c b/libavcodec/amfenc_h264.c
index 2c082e9..7f2817f 100644
--- a/libavcodec/amfenc_h264.c
+++ b/libavcodec/amfenc_h264.c
@@ -366,6 +366,7 @@
     { "b",          "2M"  },
     { "g",          "250" },
     { "slices",     "1"   },
+    { "flags",      "+loop"},
     { NULL                },
 };
 
diff --git a/libavcodec/amfenc_hevc.c b/libavcodec/amfenc_hevc.c
index 7c9a33a..77e57d2 100644
--- a/libavcodec/amfenc_hevc.c
+++ b/libavcodec/amfenc_hevc.c
@@ -136,7 +136,7 @@
     AMF_ASSIGN_PROPERTY_INT64(res, ctx->encoder, AMF_VIDEO_ENCODER_HEVC_TIER, ctx->tier);
 
     profile_level = avctx->level;
-    if (profile_level == 0) {
+    if (profile_level == FF_LEVEL_UNKNOWN) {
         profile_level = ctx->level;
     }
     if (profile_level != 0) {
@@ -144,7 +144,7 @@
     }
     AMF_ASSIGN_PROPERTY_INT64(res, ctx->encoder, AMF_VIDEO_ENCODER_HEVC_QUALITY_PRESET, ctx->quality);
     // Maximum Reference Frames
-    if (avctx->refs != 0) {
+    if (avctx->refs != -1) {
         AMF_ASSIGN_PROPERTY_INT64(res, ctx->encoder, AMF_VIDEO_ENCODER_HEVC_MAX_NUM_REFRAMES, avctx->refs);
     }
     // Aspect Ratio
@@ -254,10 +254,10 @@
     }
 
     if (ctx->qp_p != -1) {
-        AMF_ASSIGN_PROPERTY_INT64(res, ctx->encoder, AMF_VIDEO_ENCODER_HEVC_QP_I, ctx->qp_p);
+        AMF_ASSIGN_PROPERTY_INT64(res, ctx->encoder, AMF_VIDEO_ENCODER_HEVC_QP_P, ctx->qp_p);
     }
     if (ctx->qp_i != -1) {
-        AMF_ASSIGN_PROPERTY_INT64(res, ctx->encoder, AMF_VIDEO_ENCODER_HEVC_QP_P, ctx->qp_i);
+        AMF_ASSIGN_PROPERTY_INT64(res, ctx->encoder, AMF_VIDEO_ENCODER_HEVC_QP_I, ctx->qp_i);
     }
     AMF_ASSIGN_PROPERTY_BOOL(res, ctx->encoder, AMF_VIDEO_ENCODER_HEVC_RATE_CONTROL_SKIP_FRAME_ENABLE, ctx->skip_frame);
 
diff --git a/libavcodec/amrwbdata.h b/libavcodec/amrwbdata.h
index 8a8cbfd..95c0aaa 100644
--- a/libavcodec/amrwbdata.h
+++ b/libavcodec/amrwbdata.h
@@ -1884,7 +1884,7 @@
 /** Core frame sizes in each mode */
 static const uint16_t cf_sizes_wb[] = {
     132, 177, 253, 285, 317, 365, 397, 461, 477,
-    40 /// SID/comfort noise frame
+    40, 0, 0, 0, 0, 0, 0
 };
 
 #endif /* AVCODEC_AMRWBDATA_H */
diff --git a/libavcodec/amrwbdec.c b/libavcodec/amrwbdec.c
index 47fe7eb..555c4bc 100644
--- a/libavcodec/amrwbdec.c
+++ b/libavcodec/amrwbdec.c
@@ -1119,12 +1119,23 @@
     buf_out = (float *)frame->data[0];
 
     header_size      = decode_mime_header(ctx, buf);
+    expected_fr_size = ((cf_sizes_wb[ctx->fr_cur_mode] + 7) >> 3) + 1;
+
+    if (!ctx->fr_quality)
+        av_log(avctx, AV_LOG_ERROR, "Encountered a bad or corrupted frame\n");
+
+    if (ctx->fr_cur_mode == NO_DATA || !ctx->fr_quality) {
+        /* The specification suggests a "random signal" and
+           "a muting technique" to "gradually decrease the output level". */
+        av_samples_set_silence(&frame->data[0], 0, frame->nb_samples, 1, AV_SAMPLE_FMT_FLT);
+        *got_frame_ptr = 1;
+        return expected_fr_size;
+    }
     if (ctx->fr_cur_mode > MODE_SID) {
         av_log(avctx, AV_LOG_ERROR,
                "Invalid mode %d\n", ctx->fr_cur_mode);
         return AVERROR_INVALIDDATA;
     }
-    expected_fr_size = ((cf_sizes_wb[ctx->fr_cur_mode] + 7) >> 3) + 1;
 
     if (buf_size < expected_fr_size) {
         av_log(avctx, AV_LOG_ERROR,
@@ -1133,9 +1144,6 @@
         return AVERROR_INVALIDDATA;
     }
 
-    if (!ctx->fr_quality || ctx->fr_cur_mode > MODE_SID)
-        av_log(avctx, AV_LOG_ERROR, "Encountered a bad or corrupted frame\n");
-
     if (ctx->fr_cur_mode == MODE_SID) { /* Comfort noise frame */
         avpriv_request_sample(avctx, "SID mode");
         return AVERROR_PATCHWELCOME;
diff --git a/libavcodec/anm.c b/libavcodec/anm.c
index ab6a399..cd1fcc5 100644
--- a/libavcodec/anm.c
+++ b/libavcodec/anm.c
@@ -119,7 +119,10 @@
     uint8_t *dst, *dst_end;
     int count, ret;
 
-    if ((ret = ff_reget_buffer(avctx, s->frame)) < 0)
+    if (buf_size < 7)
+        return AVERROR_INVALIDDATA;
+
+    if ((ret = ff_reget_buffer(avctx, s->frame, 0)) < 0)
         return ret;
     dst     = s->frame->data[0];
     dst_end = s->frame->data[0] + s->frame->linesize[0]*avctx->height;
diff --git a/libavcodec/ansi.c b/libavcodec/ansi.c
index f1fafab..516d07d 100644
--- a/libavcodec/ansi.c
+++ b/libavcodec/ansi.c
@@ -34,6 +34,7 @@
 
 #define ATTR_BOLD         0x01  /**< Bold/Bright-foreground (mode 1) */
 #define ATTR_FAINT        0x02  /**< Faint (mode 2) */
+#define ATTR_ITALICS      0x04  /**< Italics (mode 3) */
 #define ATTR_UNDERLINE    0x08  /**< Underline (mode 4) */
 #define ATTR_BLINK        0x10  /**< Blink/Bright-background (mode 5) */
 #define ATTR_REVERSE      0x40  /**< Reverse (mode 7) */
@@ -308,7 +309,7 @@
                 s->attributes = 0;
                 s->fg = DEFAULT_FG_COLOR;
                 s->bg = DEFAULT_BG_COLOR;
-            } else if (m == 1 || m == 2 || m == 4 || m == 5 || m == 7 || m == 8) {
+            } else if (m == 1 || m == 2 || m == 3 || m == 4 || m == 5 || m == 7 || m == 8) {
                 s->attributes |= 1 << (m - 1);
             } else if (m >= 30 && m <= 37) {
                 s->fg = ansi_to_cga[m - 30];
@@ -362,7 +363,7 @@
     const uint8_t *buf_end   = buf+buf_size;
     int ret, i, count;
 
-    if ((ret = ff_reget_buffer(avctx, s->frame)) < 0)
+    if ((ret = ff_reget_buffer(avctx, s->frame, 0)) < 0)
         return ret;
     if (!avctx->frame_number) {
         for (i=0; i<avctx->height; i++)
diff --git a/libavcodec/apedec.c b/libavcodec/apedec.c
index 15eb416..2d19250 100644
--- a/libavcodec/apedec.c
+++ b/libavcodec/apedec.c
@@ -125,8 +125,8 @@
     int32_t filterA[2];
     int32_t filterB[2];
 
-    int32_t coeffsA[2][4];  ///< adaption coefficients
-    int32_t coeffsB[2][5];  ///< adaption coefficients
+    uint32_t coeffsA[2][4];  ///< adaption coefficients
+    uint32_t coeffsB[2][5];  ///< adaption coefficients
     int32_t historybuffer[HISTORY_SIZE + PREDICTOR_SIZE];
 
     unsigned int sample_pos;
@@ -460,7 +460,7 @@
 
     if (rice->ksum < lim)
         rice->k--;
-    else if (rice->ksum >= (1 << (rice->k + 5)))
+    else if (rice->ksum >= (1 << (rice->k + 5)) && rice->k < 24)
         rice->k++;
 }
 
@@ -496,6 +496,7 @@
         x = (overflow << rice->k) + get_bits(gb, rice->k);
     } else {
         av_log(ctx->avctx, AV_LOG_ERROR, "Too many bits: %"PRIu32"\n", rice->k);
+        ctx->error = 1;
         return AVERROR_INVALIDDATA;
     }
     rice->ksum += x - (rice->ksum + 8 >> 4);
@@ -554,7 +555,7 @@
     overflow = range_get_symbol(ctx, counts_3980, counts_diff_3980);
 
     if (overflow == (MODEL_ELEMENTS - 1)) {
-        overflow  = range_decode_bits(ctx, 16) << 16;
+        overflow  = (unsigned)range_decode_bits(ctx, 16) << 16;
         overflow |= range_decode_bits(ctx, 16);
     }
 
@@ -585,32 +586,50 @@
     return ((x >> 1) ^ ((x & 1) - 1)) + 1;
 }
 
+static int get_k(int ksum)
+{
+    return av_log2(ksum) + !!ksum;
+}
+
 static void decode_array_0000(APEContext *ctx, GetBitContext *gb,
                               int32_t *out, APERice *rice, int blockstodecode)
 {
     int i;
-    int ksummax, ksummin;
+    unsigned ksummax, ksummin;
 
     rice->ksum = 0;
     for (i = 0; i < FFMIN(blockstodecode, 5); i++) {
         out[i] = get_rice_ook(&ctx->gb, 10);
         rice->ksum += out[i];
     }
-    rice->k = av_log2(rice->ksum / 10) + 1;
+
+    if (blockstodecode <= 5)
+        goto end;
+
+    rice->k = get_k(rice->ksum / 10);
     if (rice->k >= 24)
         return;
     for (; i < FFMIN(blockstodecode, 64); i++) {
         out[i] = get_rice_ook(&ctx->gb, rice->k);
         rice->ksum += out[i];
-        rice->k = av_log2(rice->ksum / ((i + 1) * 2)) + 1;
+        rice->k = get_k(rice->ksum / ((i + 1) * 2));
         if (rice->k >= 24)
             return;
     }
+
+    if (blockstodecode <= 64)
+        goto end;
+
+    rice->k = get_k(rice->ksum >> 7);
     ksummax = 1 << rice->k + 7;
     ksummin = rice->k ? (1 << rice->k + 6) : 0;
     for (; i < blockstodecode; i++) {
+        if (get_bits_left(&ctx->gb) < 1) {
+            ctx->error = 1;
+            return;
+        }
         out[i] = get_rice_ook(&ctx->gb, rice->k);
-        rice->ksum += out[i] - out[i - 64];
+        rice->ksum += out[i] - (unsigned)out[i - 64];
         while (rice->ksum < ksummin) {
             rice->k--;
             ksummin = rice->k ? ksummin >> 1 : 0;
@@ -625,6 +644,7 @@
         }
     }
 
+end:
     for (i = 0; i < blockstodecode; i++)
         out[i] = ((out[i] >> 1) ^ ((out[i] & 1) - 1)) + 1;
 }
@@ -828,21 +848,21 @@
         return decoded;
     }
 
-    predictionA = p->buf[delayA] * 2 - p->buf[delayA - 1];
-    p->lastA[filter] = decoded + (predictionA  * p->coeffsA[filter][0] >> 9);
+    predictionA = p->buf[delayA] * 2U - p->buf[delayA - 1];
+    p->lastA[filter] = decoded + ((int32_t)(predictionA  * p->coeffsA[filter][0]) >> 9);
 
     if ((decoded ^ predictionA) > 0)
         p->coeffsA[filter][0]++;
     else
         p->coeffsA[filter][0]--;
 
-    p->filterA[filter] += p->lastA[filter];
+    p->filterA[filter] += (unsigned)p->lastA[filter];
 
     return p->filterA[filter];
 }
 
 static av_always_inline int filter_3800(APEPredictor *p,
-                                        const int decoded, const int filter,
+                                        const unsigned decoded, const int filter,
                                         const int delayA,  const int delayB,
                                         const int start,   const int shift)
 {
@@ -859,9 +879,9 @@
         return predictionA;
     }
     d2 =  p->buf[delayA];
-    d1 = (p->buf[delayA] - p->buf[delayA - 1]) << 1;
-    d0 =  p->buf[delayA] + ((p->buf[delayA - 2] - p->buf[delayA - 1]) << 3);
-    d3 =  p->buf[delayB] * 2 - p->buf[delayB - 1];
+    d1 = (p->buf[delayA] - p->buf[delayA - 1]) * 2U;
+    d0 =  p->buf[delayA] + ((p->buf[delayA - 2] - p->buf[delayA - 1]) * 8U);
+    d3 =  p->buf[delayB] * 2U - p->buf[delayB - 1];
     d4 =  p->buf[delayB];
 
     predictionA = d0 * p->coeffsA[filter][0] +
@@ -881,7 +901,7 @@
     p->coeffsB[filter][1] -= (((d4 >> 30) & 2) - 1) * sign;
 
     p->filterB[filter] = p->lastA[filter] + (predictionB >> shift);
-    p->filterA[filter] = p->filterB[filter] + ((p->filterA[filter] * 31) >> 5);
+    p->filterA[filter] = p->filterB[filter] + (unsigned)((int)(p->filterA[filter] * 31U) >> 5);
 
     return p->filterA[filter];
 }
@@ -902,7 +922,7 @@
         dotprod = 0;
         sign = APESIGN(buffer[i]);
         for (j = 0; j < order; j++) {
-            dotprod += delay[j] * coeffs[j];
+            dotprod += delay[j] * (unsigned)coeffs[j];
             coeffs[j] += ((delay[j] >> 31) | 1) * sign;
         }
         buffer[i] -= dotprod >> shift;
@@ -916,7 +936,8 @@
 {
     int i, j;
     int32_t dotprod, sign;
-    int32_t coeffs[8] = { 0 }, delay[8] = { 0 };
+    int32_t delay[8] = { 0 };
+    uint32_t coeffs[8] = { 0 };
 
     for (i = 0; i < length; i++) {
         dotprod = 0;
@@ -1051,7 +1072,7 @@
                   d3 * p->coeffsA[filter][3];
 
     p->lastA[filter] = decoded + (predictionA >> 9);
-    p->filterA[filter] = p->lastA[filter] + ((p->filterA[filter] * 31) >> 5);
+    p->filterA[filter] = p->lastA[filter] + ((int)(p->filterA[filter] * 31U) >> 5);
 
     sign = APESIGN(decoded);
     p->coeffsA[filter][0] += ((d0 < 0) * 2 - 1) * sign;
@@ -1121,7 +1142,7 @@
 
     p->buf[delayA]     = p->lastA[filter];
     p->buf[adaptA]     = APESIGN(p->buf[delayA]);
-    p->buf[delayA - 1] = p->buf[delayA] - p->buf[delayA - 1];
+    p->buf[delayA - 1] = p->buf[delayA] - (unsigned)p->buf[delayA - 1];
     p->buf[adaptA - 1] = APESIGN(p->buf[delayA - 1]);
 
     predictionA = p->buf[delayA    ] * p->coeffsA[filter][0] +
@@ -1130,9 +1151,9 @@
                   p->buf[delayA - 3] * p->coeffsA[filter][3];
 
     /*  Apply a scaled first-order filter compression */
-    p->buf[delayB]     = p->filterA[filter ^ 1] - ((p->filterB[filter] * 31) >> 5);
+    p->buf[delayB]     = p->filterA[filter ^ 1] - ((int)(p->filterB[filter] * 31U) >> 5);
     p->buf[adaptB]     = APESIGN(p->buf[delayB]);
-    p->buf[delayB - 1] = p->buf[delayB] - p->buf[delayB - 1];
+    p->buf[delayB - 1] = p->buf[delayB] - (unsigned)p->buf[delayB - 1];
     p->buf[adaptB - 1] = APESIGN(p->buf[delayB - 1]);
     p->filterB[filter] = p->filterA[filter ^ 1];
 
@@ -1142,8 +1163,8 @@
                   p->buf[delayB - 3] * p->coeffsB[filter][3] +
                   p->buf[delayB - 4] * p->coeffsB[filter][4];
 
-    p->lastA[filter] = decoded + ((predictionA + (predictionB >> 1)) >> 10);
-    p->filterA[filter] = p->lastA[filter] + ((p->filterA[filter] * 31) >> 5);
+    p->lastA[filter] = decoded + ((int)((unsigned)predictionA + (predictionB >> 1)) >> 10);
+    p->filterA[filter] = p->lastA[filter] + ((int)(p->filterA[filter] * 31U) >> 5);
 
     sign = APESIGN(decoded);
     p->coeffsA[filter][0] += p->buf[adaptA    ] * sign;
@@ -1202,14 +1223,14 @@
         A = *decoded0;
 
         p->buf[YDELAYA] = currentA;
-        p->buf[YDELAYA - 1] = p->buf[YDELAYA] - p->buf[YDELAYA - 1];
+        p->buf[YDELAYA - 1] = p->buf[YDELAYA] - (unsigned)p->buf[YDELAYA - 1];
 
         predictionA = p->buf[YDELAYA    ] * p->coeffsA[0][0] +
                       p->buf[YDELAYA - 1] * p->coeffsA[0][1] +
                       p->buf[YDELAYA - 2] * p->coeffsA[0][2] +
                       p->buf[YDELAYA - 3] * p->coeffsA[0][3];
 
-        currentA = A + (predictionA >> 10);
+        currentA = A + (unsigned)(predictionA >> 10);
 
         p->buf[YADAPTCOEFFSA]     = APESIGN(p->buf[YDELAYA    ]);
         p->buf[YADAPTCOEFFSA - 1] = APESIGN(p->buf[YDELAYA - 1]);
@@ -1229,7 +1250,7 @@
             p->buf = p->historybuffer;
         }
 
-        p->filterA[0] = currentA + ((p->filterA[0] * 31) >> 5);
+        p->filterA[0] = currentA + (unsigned)((int)(p->filterA[0] * 31U) >> 5);
         *(decoded0++) = p->filterA[0];
     }
 
@@ -1266,8 +1287,8 @@
                                                      f->delay - order,
                                                      f->adaptcoeffs - order,
                                                      order, APESIGN(*data));
-        res = (res + (1 << (fracbits - 1))) >> fracbits;
-        res += *data;
+        res = (int)(res + (1U << (fracbits - 1))) >> fracbits;
+        res += (unsigned)*data;
         *data++ = res;
 
         /* Update the output history */
@@ -1282,7 +1303,7 @@
             /* Version 3.98 and later files */
 
             /* Update the adaption coefficients */
-            absres = FFABS(res);
+            absres = res < 0 ? -(unsigned)res : res;
             if (absres)
                 *f->adaptcoeffs = APESIGN(res) *
                                   (8 << ((absres > f->avg * 3) + (absres > f->avg * 4 / 3)));
@@ -1297,7 +1318,7 @@
             else
                 *f->adaptcoeffs = 0;
 
-            f->avg += (absres - f->avg) / 16;
+            f->avg += (int)(absres - (unsigned)f->avg) / 16;
 
             f->adaptcoeffs[-1] >>= 1;
             f->adaptcoeffs[-2] >>= 1;
@@ -1364,6 +1385,8 @@
     }
 
     ctx->entropy_decode_mono(ctx, count);
+    if (ctx->error)
+        return;
 
     /* Now apply the predictor decoding */
     ctx->predictor_decode_mono(ctx, count);
@@ -1376,7 +1399,7 @@
 
 static void ape_unpack_stereo(APEContext *ctx, int count)
 {
-    int32_t left, right;
+    unsigned left, right;
     int32_t *decoded0 = ctx->decoded[0];
     int32_t *decoded1 = ctx->decoded[1];
 
@@ -1387,13 +1410,15 @@
     }
 
     ctx->entropy_decode_stereo(ctx, count);
+    if (ctx->error)
+        return;
 
     /* Now apply the predictor decoding */
     ctx->predictor_decode_stereo(ctx, count);
 
     /* Decorrelate and scale to output depth */
     while (count--) {
-        left = *decoded1 - (*decoded0 / 2);
+        left = *decoded1 - (unsigned)(*decoded0 / 2);
         right = left + *decoded0;
 
         *(decoded0++) = left;
@@ -1451,7 +1476,8 @@
         if (s->fileversion >= 3900) {
             if (offset > 3) {
                 av_log(avctx, AV_LOG_ERROR, "Incorrect offset passed\n");
-                s->data = NULL;
+                av_freep(&s->data);
+                s->data_size = 0;
                 return AVERROR_INVALIDDATA;
             }
             if (s->data_end - s->ptr < offset) {
@@ -1496,17 +1522,20 @@
     /* reallocate decoded sample buffer if needed */
     decoded_buffer_size = 2LL * FFALIGN(blockstodecode, 8) * sizeof(*s->decoded_buffer);
     av_assert0(decoded_buffer_size <= INT_MAX);
-    av_fast_malloc(&s->decoded_buffer, &s->decoded_size, decoded_buffer_size);
-    if (!s->decoded_buffer)
-        return AVERROR(ENOMEM);
-    memset(s->decoded_buffer, 0, s->decoded_size);
-    s->decoded[0] = s->decoded_buffer;
-    s->decoded[1] = s->decoded_buffer + FFALIGN(blockstodecode, 8);
 
     /* get output buffer */
     frame->nb_samples = blockstodecode;
-    if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
+    if ((ret = ff_get_buffer(avctx, frame, 0)) < 0) {
+        s->samples=0;
         return ret;
+    }
+
+    av_fast_malloc(&s->decoded_buffer, &s->decoded_size, decoded_buffer_size);
+    if (!s->decoded_buffer)
+        return AVERROR(ENOMEM);
+    memset(s->decoded_buffer, 0, decoded_buffer_size);
+    s->decoded[0] = s->decoded_buffer;
+    s->decoded[1] = s->decoded_buffer + FFALIGN(blockstodecode, 8);
 
     s->error=0;
 
@@ -1541,7 +1570,7 @@
         for (ch = 0; ch < s->channels; ch++) {
             sample24 = (int32_t *)frame->data[ch];
             for (i = 0; i < blockstodecode; i++)
-                *sample24++ = s->decoded[ch][i] << 8;
+                *sample24++ = s->decoded[ch][i] * 256;
         }
         break;
     }
diff --git a/libavcodec/aptx.c b/libavcodec/aptx.c
index 8750d84..3aeee19 100644
--- a/libavcodec/aptx.c
+++ b/libavcodec/aptx.c
@@ -20,81 +20,7 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
-#include "libavutil/intreadwrite.h"
-#include "avcodec.h"
-#include "internal.h"
-#include "mathops.h"
-#include "audio_frame_queue.h"
-
-
-enum channels {
-    LEFT,
-    RIGHT,
-    NB_CHANNELS
-};
-
-enum subbands {
-    LF,  // Low Frequency (0-5.5 kHz)
-    MLF, // Medium-Low Frequency (5.5-11kHz)
-    MHF, // Medium-High Frequency (11-16.5kHz)
-    HF,  // High Frequency (16.5-22kHz)
-    NB_SUBBANDS
-};
-
-#define NB_FILTERS 2
-#define FILTER_TAPS 16
-
-typedef struct {
-    int pos;
-    int32_t buffer[2*FILTER_TAPS];
-} FilterSignal;
-
-typedef struct {
-    FilterSignal outer_filter_signal[NB_FILTERS];
-    FilterSignal inner_filter_signal[NB_FILTERS][NB_FILTERS];
-} QMFAnalysis;
-
-typedef struct {
-    int32_t quantized_sample;
-    int32_t quantized_sample_parity_change;
-    int32_t error;
-} Quantize;
-
-typedef struct {
-    int32_t quantization_factor;
-    int32_t factor_select;
-    int32_t reconstructed_difference;
-} InvertQuantize;
-
-typedef struct {
-    int32_t prev_sign[2];
-    int32_t s_weight[2];
-    int32_t d_weight[24];
-    int32_t pos;
-    int32_t reconstructed_differences[48];
-    int32_t previous_reconstructed_sample;
-    int32_t predicted_difference;
-    int32_t predicted_sample;
-} Prediction;
-
-typedef struct {
-    int32_t codeword_history;
-    int32_t dither_parity;
-    int32_t dither[NB_SUBBANDS];
-
-    QMFAnalysis qmf;
-    Quantize quantize[NB_SUBBANDS];
-    InvertQuantize invert_quantize[NB_SUBBANDS];
-    Prediction prediction[NB_SUBBANDS];
-} Channel;
-
-typedef struct {
-    int hd;
-    int block_size;
-    int32_t sync_idx;
-    Channel channels[NB_CHANNELS];
-    AudioFrameQueue afq;
-} AptXContext;
+#include "aptx.h"
 
 
 static const int32_t quantize_intervals_LF[65] = {
@@ -383,17 +309,7 @@
     70,  90, 115, 147, 192, 264, 398, 521, 521,
 };
 
-typedef const struct {
-    const int32_t *quantize_intervals;
-    const int32_t *invert_quantize_dither_factors;
-    const int32_t *quantize_dither_factors;
-    const int16_t *quantize_factor_select_offset;
-    int tables_size;
-    int32_t factor_max;
-    int32_t prediction_order;
-} ConstTables;
-
-static ConstTables tables[2][NB_SUBBANDS] = {
+ConstTables ff_aptx_quant_tables[2][NB_SUBBANDS] = {
     {
         [LF]  = { quantize_intervals_LF,
                   invert_quantize_dither_factors_LF,
@@ -456,34 +372,16 @@
 };
 
 
-/* Rounded right shift with optionnal clipping */
-#define RSHIFT_SIZE(size)                                                     \
-av_always_inline                                                              \
-static int##size##_t rshift##size(int##size##_t value, int shift)             \
-{                                                                             \
-    int##size##_t rounding = (int##size##_t)1 << (shift - 1);                 \
-    int##size##_t mask = ((int##size##_t)1 << (shift + 1)) - 1;               \
-    return ((value + rounding) >> shift) - ((value & mask) == rounding);      \
-}                                                                             \
-av_always_inline                                                              \
-static int##size##_t rshift##size##_clip24(int##size##_t value, int shift)    \
-{                                                                             \
-    return av_clip_intp2(rshift##size(value, shift), 23);                     \
-}
-RSHIFT_SIZE(32)
-RSHIFT_SIZE(64)
-
-
 av_always_inline
 static void aptx_update_codeword_history(Channel *channel)
 {
     int32_t cw = ((channel->quantize[0].quantized_sample & 3) << 0) +
                  ((channel->quantize[1].quantized_sample & 2) << 1) +
                  ((channel->quantize[2].quantized_sample & 1) << 3);
-    channel->codeword_history = (cw << 8) + (channel->codeword_history << 4);
+    channel->codeword_history = (cw << 8) + ((unsigned)channel->codeword_history << 4);
 }
 
-static void aptx_generate_dither(Channel *channel)
+void ff_aptx_generate_dither(Channel *channel)
 {
     int subband;
     int64_t m;
@@ -492,262 +390,12 @@
     aptx_update_codeword_history(channel);
 
     m = (int64_t)5184443 * (channel->codeword_history >> 7);
-    d = (m << 2) + (m >> 22);
+    d = (m * 4) + (m >> 22);
     for (subband = 0; subband < NB_SUBBANDS; subband++)
-        channel->dither[subband] = d << (23 - 5*subband);
+        channel->dither[subband] = (unsigned)d << (23 - 5*subband);
     channel->dither_parity = (d >> 25) & 1;
 }
 
-/*
- * Convolution filter coefficients for the outer QMF of the QMF tree.
- * The 2 sets are a mirror of each other.
- */
-static const int32_t aptx_qmf_outer_coeffs[NB_FILTERS][FILTER_TAPS] = {
-    {
-        730, -413, -9611, 43626, -121026, 269973, -585547, 2801966,
-        697128, -160481, 27611, 8478, -10043, 3511, 688, -897,
-    },
-    {
-        -897, 688, 3511, -10043, 8478, 27611, -160481, 697128,
-        2801966, -585547, 269973, -121026, 43626, -9611, -413, 730,
-    },
-};
-
-/*
- * Convolution filter coefficients for the inner QMF of the QMF tree.
- * The 2 sets are a mirror of each other.
- */
-static const int32_t aptx_qmf_inner_coeffs[NB_FILTERS][FILTER_TAPS] = {
-    {
-       1033, -584, -13592, 61697, -171156, 381799, -828088, 3962579,
-       985888, -226954, 39048, 11990, -14203, 4966, 973, -1268,
-    },
-    {
-      -1268, 973, 4966, -14203, 11990, 39048, -226954, 985888,
-      3962579, -828088, 381799, -171156, 61697, -13592, -584, 1033,
-    },
-};
-
-/*
- * Push one sample into a circular signal buffer.
- */
-av_always_inline
-static void aptx_qmf_filter_signal_push(FilterSignal *signal, int32_t sample)
-{
-    signal->buffer[signal->pos            ] = sample;
-    signal->buffer[signal->pos+FILTER_TAPS] = sample;
-    signal->pos = (signal->pos + 1) & (FILTER_TAPS - 1);
-}
-
-/*
- * Compute the convolution of the signal with the coefficients, and reduce
- * to 24 bits by applying the specified right shifting.
- */
-av_always_inline
-static int32_t aptx_qmf_convolution(FilterSignal *signal,
-                                    const int32_t coeffs[FILTER_TAPS],
-                                    int shift)
-{
-    int32_t *sig = &signal->buffer[signal->pos];
-    int64_t e = 0;
-    int i;
-
-    for (i = 0; i < FILTER_TAPS; i++)
-        e += MUL64(sig[i], coeffs[i]);
-
-    return rshift64_clip24(e, shift);
-}
-
-/*
- * Half-band QMF analysis filter realized with a polyphase FIR filter.
- * Split into 2 subbands and downsample by 2.
- * So for each pair of samples that goes in, one sample goes out,
- * split into 2 separate subbands.
- */
-av_always_inline
-static void aptx_qmf_polyphase_analysis(FilterSignal signal[NB_FILTERS],
-                                        const int32_t coeffs[NB_FILTERS][FILTER_TAPS],
-                                        int shift,
-                                        int32_t samples[NB_FILTERS],
-                                        int32_t *low_subband_output,
-                                        int32_t *high_subband_output)
-{
-    int32_t subbands[NB_FILTERS];
-    int i;
-
-    for (i = 0; i < NB_FILTERS; i++) {
-        aptx_qmf_filter_signal_push(&signal[i], samples[NB_FILTERS-1-i]);
-        subbands[i] = aptx_qmf_convolution(&signal[i], coeffs[i], shift);
-    }
-
-    *low_subband_output  = av_clip_intp2(subbands[0] + subbands[1], 23);
-    *high_subband_output = av_clip_intp2(subbands[0] - subbands[1], 23);
-}
-
-/*
- * Two stage QMF analysis tree.
- * Split 4 input samples into 4 subbands and downsample by 4.
- * So for each group of 4 samples that goes in, one sample goes out,
- * split into 4 separate subbands.
- */
-static void aptx_qmf_tree_analysis(QMFAnalysis *qmf,
-                                   int32_t samples[4],
-                                   int32_t subband_samples[4])
-{
-    int32_t intermediate_samples[4];
-    int i;
-
-    /* Split 4 input samples into 2 intermediate subbands downsampled to 2 samples */
-    for (i = 0; i < 2; i++)
-        aptx_qmf_polyphase_analysis(qmf->outer_filter_signal,
-                                    aptx_qmf_outer_coeffs, 23,
-                                    &samples[2*i],
-                                    &intermediate_samples[0+i],
-                                    &intermediate_samples[2+i]);
-
-    /* Split 2 intermediate subband samples into 4 final subbands downsampled to 1 sample */
-    for (i = 0; i < 2; i++)
-        aptx_qmf_polyphase_analysis(qmf->inner_filter_signal[i],
-                                    aptx_qmf_inner_coeffs, 23,
-                                    &intermediate_samples[2*i],
-                                    &subband_samples[2*i+0],
-                                    &subband_samples[2*i+1]);
-}
-
-/*
- * Half-band QMF synthesis filter realized with a polyphase FIR filter.
- * Join 2 subbands and upsample by 2.
- * So for each 2 subbands sample that goes in, a pair of samples goes out.
- */
-av_always_inline
-static void aptx_qmf_polyphase_synthesis(FilterSignal signal[NB_FILTERS],
-                                         const int32_t coeffs[NB_FILTERS][FILTER_TAPS],
-                                         int shift,
-                                         int32_t low_subband_input,
-                                         int32_t high_subband_input,
-                                         int32_t samples[NB_FILTERS])
-{
-    int32_t subbands[NB_FILTERS];
-    int i;
-
-    subbands[0] = low_subband_input + high_subband_input;
-    subbands[1] = low_subband_input - high_subband_input;
-
-    for (i = 0; i < NB_FILTERS; i++) {
-        aptx_qmf_filter_signal_push(&signal[i], subbands[1-i]);
-        samples[i] = aptx_qmf_convolution(&signal[i], coeffs[i], shift);
-    }
-}
-
-/*
- * Two stage QMF synthesis tree.
- * Join 4 subbands and upsample by 4.
- * So for each 4 subbands sample that goes in, a group of 4 samples goes out.
- */
-static void aptx_qmf_tree_synthesis(QMFAnalysis *qmf,
-                                    int32_t subband_samples[4],
-                                    int32_t samples[4])
-{
-    int32_t intermediate_samples[4];
-    int i;
-
-    /* Join 4 subbands into 2 intermediate subbands upsampled to 2 samples. */
-    for (i = 0; i < 2; i++)
-        aptx_qmf_polyphase_synthesis(qmf->inner_filter_signal[i],
-                                     aptx_qmf_inner_coeffs, 22,
-                                     subband_samples[2*i+0],
-                                     subband_samples[2*i+1],
-                                     &intermediate_samples[2*i]);
-
-    /* Join 2 samples from intermediate subbands upsampled to 4 samples. */
-    for (i = 0; i < 2; i++)
-        aptx_qmf_polyphase_synthesis(qmf->outer_filter_signal,
-                                     aptx_qmf_outer_coeffs, 21,
-                                     intermediate_samples[0+i],
-                                     intermediate_samples[2+i],
-                                     &samples[2*i]);
-}
-
-
-av_always_inline
-static int32_t aptx_bin_search(int32_t value, int32_t factor,
-                               const int32_t *intervals, int32_t nb_intervals)
-{
-    int32_t idx = 0;
-    int i;
-
-    for (i = nb_intervals >> 1; i > 0; i >>= 1)
-        if (MUL64(factor, intervals[idx + i]) <= ((int64_t)value << 24))
-            idx += i;
-
-    return idx;
-}
-
-static void aptx_quantize_difference(Quantize *quantize,
-                                     int32_t sample_difference,
-                                     int32_t dither,
-                                     int32_t quantization_factor,
-                                     ConstTables *tables)
-{
-    const int32_t *intervals = tables->quantize_intervals;
-    int32_t quantized_sample, dithered_sample, parity_change;
-    int32_t d, mean, interval, inv, sample_difference_abs;
-    int64_t error;
-
-    sample_difference_abs = FFABS(sample_difference);
-    sample_difference_abs = FFMIN(sample_difference_abs, (1 << 23) - 1);
-
-    quantized_sample = aptx_bin_search(sample_difference_abs >> 4,
-                                       quantization_factor,
-                                       intervals, tables->tables_size);
-
-    d = rshift32_clip24(MULH(dither, dither), 7) - (1 << 23);
-    d = rshift64(MUL64(d, tables->quantize_dither_factors[quantized_sample]), 23);
-
-    intervals += quantized_sample;
-    mean = (intervals[1] + intervals[0]) / 2;
-    interval = (intervals[1] - intervals[0]) * (-(sample_difference < 0) | 1);
-
-    dithered_sample = rshift64_clip24(MUL64(dither, interval) + ((int64_t)av_clip_intp2(mean + d, 23) << 32), 32);
-    error = ((int64_t)sample_difference_abs << 20) - MUL64(dithered_sample, quantization_factor);
-    quantize->error = FFABS(rshift64(error, 23));
-
-    parity_change = quantized_sample;
-    if (error < 0)
-        quantized_sample--;
-    else
-        parity_change--;
-
-    inv = -(sample_difference < 0);
-    quantize->quantized_sample               = quantized_sample ^ inv;
-    quantize->quantized_sample_parity_change = parity_change    ^ inv;
-}
-
-static void aptx_encode_channel(Channel *channel, int32_t samples[4], int hd)
-{
-    int32_t subband_samples[4];
-    int subband;
-    aptx_qmf_tree_analysis(&channel->qmf, samples, subband_samples);
-    aptx_generate_dither(channel);
-    for (subband = 0; subband < NB_SUBBANDS; subband++) {
-        int32_t diff = av_clip_intp2(subband_samples[subband] - channel->prediction[subband].predicted_sample, 23);
-        aptx_quantize_difference(&channel->quantize[subband], diff,
-                                 channel->dither[subband],
-                                 channel->invert_quantize[subband].quantization_factor,
-                                 &tables[hd][subband]);
-    }
-}
-
-static void aptx_decode_channel(Channel *channel, int32_t samples[4])
-{
-    int32_t subband_samples[4];
-    int subband;
-    for (subband = 0; subband < NB_SUBBANDS; subband++)
-        subband_samples[subband] = channel->prediction[subband].previous_reconstructed_sample;
-    aptx_qmf_tree_synthesis(&channel->qmf, subband_samples, samples);
-}
-
-
 static void aptx_invert_quantization(InvertQuantize *invert_quantize,
                                      int32_t quantized_sample, int32_t dither,
                                      ConstTables *tables)
@@ -759,12 +407,12 @@
     if (quantized_sample < 0)
         qr = -qr;
 
-    qr = rshift64_clip24(((int64_t)qr<<32) + MUL64(dither, tables->invert_quantize_dither_factors[idx]), 32);
+    qr = rshift64_clip24((qr * (1LL<<32)) + MUL64(dither, tables->invert_quantize_dither_factors[idx]), 32);
     invert_quantize->reconstructed_difference = MUL64(invert_quantize->quantization_factor, qr) >> 19;
 
     /* update factor_select */
     factor_select = 32620 * invert_quantize->factor_select;
-    factor_select = rshift32(factor_select + (tables->quantize_factor_select_offset[idx] << 15), 15);
+    factor_select = rshift32(factor_select + (tables->quantize_factor_select_offset[idx] * (1 << 15)), 15);
     invert_quantize->factor_select = av_clip(factor_select, 0, tables->factor_max);
 
     /* update quantization factor */
@@ -801,7 +449,7 @@
     prediction->previous_reconstructed_sample = reconstructed_sample;
 
     reconstructed_differences = aptx_reconstructed_differences_update(prediction, reconstructed_difference, order);
-    srd0 = FFDIFFSIGN(reconstructed_difference, 0) << 23;
+    srd0 = FFDIFFSIGN(reconstructed_difference, 0) * (1 << 23);
     for (i = 0; i < order; i++) {
         int32_t srd = FF_SIGNBIT(reconstructed_differences[-i-1]) | 1;
         prediction->d_weight[i] -= rshift32(prediction->d_weight[i] - srd*srd0, 8);
@@ -830,7 +478,7 @@
 
     range = 0x100000;
     sw1 = rshift32(-same_sign[1] * prediction->s_weight[1], 1);
-    sw1 = (av_clip(sw1, -range, range) & ~0xF) << 4;
+    sw1 = (av_clip(sw1, -range, range) & ~0xF) * 16;
 
     range = 0x300000;
     weight[0] = 254 * prediction->s_weight[0] + 0x800000*same_sign[0] + sw1;
@@ -845,7 +493,7 @@
                               tables->prediction_order);
 }
 
-static void aptx_invert_quantize_and_prediction(Channel *channel, int hd)
+void ff_aptx_invert_quantize_and_prediction(Channel *channel, int hd)
 {
     int subband;
     for (subband = 0; subband < NB_SUBBANDS; subband++)
@@ -853,142 +501,17 @@
                              &channel->prediction[subband],
                              channel->quantize[subband].quantized_sample,
                              channel->dither[subband],
-                             &tables[hd][subband]);
+                             &ff_aptx_quant_tables[hd][subband]);
 }
 
-static int32_t aptx_quantized_parity(Channel *channel)
-{
-    int32_t parity = channel->dither_parity;
-    int subband;
-
-    for (subband = 0; subband < NB_SUBBANDS; subband++)
-        parity ^= channel->quantize[subband].quantized_sample;
-
-    return parity & 1;
-}
-
-/* For each sample, ensure that the parity of all subbands of all channels
- * is 0 except once every 8 samples where the parity is forced to 1. */
-static int aptx_check_parity(Channel channels[NB_CHANNELS], int32_t *idx)
-{
-    int32_t parity = aptx_quantized_parity(&channels[LEFT])
-                   ^ aptx_quantized_parity(&channels[RIGHT]);
-
-    int eighth = *idx == 7;
-    *idx = (*idx + 1) & 7;
-
-    return parity ^ eighth;
-}
-
-static void aptx_insert_sync(Channel channels[NB_CHANNELS], int32_t *idx)
-{
-    if (aptx_check_parity(channels, idx)) {
-        int i;
-        Channel *c;
-        static const int map[] = { 1, 2, 0, 3 };
-        Quantize *min = &channels[NB_CHANNELS-1].quantize[map[0]];
-        for (c = &channels[NB_CHANNELS-1]; c >= channels; c--)
-            for (i = 0; i < NB_SUBBANDS; i++)
-                if (c->quantize[map[i]].error < min->error)
-                    min = &c->quantize[map[i]];
-
-        /* Forcing the desired parity is done by offsetting by 1 the quantized
-         * sample from the subband featuring the smallest quantization error. */
-        min->quantized_sample = min->quantized_sample_parity_change;
-    }
-}
-
-static uint16_t aptx_pack_codeword(Channel *channel)
-{
-    int32_t parity = aptx_quantized_parity(channel);
-    return (((channel->quantize[3].quantized_sample & 0x06) | parity) << 13)
-         | (((channel->quantize[2].quantized_sample & 0x03)         ) << 11)
-         | (((channel->quantize[1].quantized_sample & 0x0F)         ) <<  7)
-         | (((channel->quantize[0].quantized_sample & 0x7F)         ) <<  0);
-}
-
-static uint32_t aptxhd_pack_codeword(Channel *channel)
-{
-    int32_t parity = aptx_quantized_parity(channel);
-    return (((channel->quantize[3].quantized_sample & 0x01E) | parity) << 19)
-         | (((channel->quantize[2].quantized_sample & 0x00F)         ) << 15)
-         | (((channel->quantize[1].quantized_sample & 0x03F)         ) <<  9)
-         | (((channel->quantize[0].quantized_sample & 0x1FF)         ) <<  0);
-}
-
-static void aptx_unpack_codeword(Channel *channel, uint16_t codeword)
-{
-    channel->quantize[0].quantized_sample = sign_extend(codeword >>  0, 7);
-    channel->quantize[1].quantized_sample = sign_extend(codeword >>  7, 4);
-    channel->quantize[2].quantized_sample = sign_extend(codeword >> 11, 2);
-    channel->quantize[3].quantized_sample = sign_extend(codeword >> 13, 3);
-    channel->quantize[3].quantized_sample = (channel->quantize[3].quantized_sample & ~1)
-                                          | aptx_quantized_parity(channel);
-}
-
-static void aptxhd_unpack_codeword(Channel *channel, uint32_t codeword)
-{
-    channel->quantize[0].quantized_sample = sign_extend(codeword >>  0, 9);
-    channel->quantize[1].quantized_sample = sign_extend(codeword >>  9, 6);
-    channel->quantize[2].quantized_sample = sign_extend(codeword >> 15, 4);
-    channel->quantize[3].quantized_sample = sign_extend(codeword >> 19, 5);
-    channel->quantize[3].quantized_sample = (channel->quantize[3].quantized_sample & ~1)
-                                          | aptx_quantized_parity(channel);
-}
-
-static void aptx_encode_samples(AptXContext *ctx,
-                                int32_t samples[NB_CHANNELS][4],
-                                uint8_t *output)
-{
-    int channel;
-    for (channel = 0; channel < NB_CHANNELS; channel++)
-        aptx_encode_channel(&ctx->channels[channel], samples[channel], ctx->hd);
-
-    aptx_insert_sync(ctx->channels, &ctx->sync_idx);
-
-    for (channel = 0; channel < NB_CHANNELS; channel++) {
-        aptx_invert_quantize_and_prediction(&ctx->channels[channel], ctx->hd);
-        if (ctx->hd)
-            AV_WB24(output + 3*channel,
-                    aptxhd_pack_codeword(&ctx->channels[channel]));
-        else
-            AV_WB16(output + 2*channel,
-                    aptx_pack_codeword(&ctx->channels[channel]));
-    }
-}
-
-static int aptx_decode_samples(AptXContext *ctx,
-                                const uint8_t *input,
-                                int32_t samples[NB_CHANNELS][4])
-{
-    int channel, ret;
-
-    for (channel = 0; channel < NB_CHANNELS; channel++) {
-        aptx_generate_dither(&ctx->channels[channel]);
-
-        if (ctx->hd)
-            aptxhd_unpack_codeword(&ctx->channels[channel],
-                                   AV_RB24(input + 3*channel));
-        else
-            aptx_unpack_codeword(&ctx->channels[channel],
-                                 AV_RB16(input + 2*channel));
-        aptx_invert_quantize_and_prediction(&ctx->channels[channel], ctx->hd);
-    }
-
-    ret = aptx_check_parity(ctx->channels, &ctx->sync_idx);
-
-    for (channel = 0; channel < NB_CHANNELS; channel++)
-        aptx_decode_channel(&ctx->channels[channel], samples[channel]);
-
-    return ret;
-}
-
-
-static av_cold int aptx_init(AVCodecContext *avctx)
+av_cold int ff_aptx_init(AVCodecContext *avctx)
 {
     AptXContext *s = avctx->priv_data;
     int chan, subband;
 
+    if (avctx->channels != 2)
+        return AVERROR_INVALIDDATA;
+
     s->hd = avctx->codec->id == AV_CODEC_ID_APTX_HD;
     s->block_size = s->hd ? 6 : 4;
 
@@ -1013,150 +536,3 @@
     ff_af_queue_init(avctx, &s->afq);
     return 0;
 }
-
-static int aptx_decode_frame(AVCodecContext *avctx, void *data,
-                             int *got_frame_ptr, AVPacket *avpkt)
-{
-    AptXContext *s = avctx->priv_data;
-    AVFrame *frame = data;
-    int pos, opos, channel, sample, ret;
-
-    if (avpkt->size < s->block_size) {
-        av_log(avctx, AV_LOG_ERROR, "Packet is too small\n");
-        return AVERROR_INVALIDDATA;
-    }
-
-    /* get output buffer */
-    frame->channels = NB_CHANNELS;
-    frame->format = AV_SAMPLE_FMT_S32P;
-    frame->nb_samples = 4 * avpkt->size / s->block_size;
-    if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
-        return ret;
-
-    for (pos = 0, opos = 0; opos < frame->nb_samples; pos += s->block_size, opos += 4) {
-        int32_t samples[NB_CHANNELS][4];
-
-        if (aptx_decode_samples(s, &avpkt->data[pos], samples)) {
-            av_log(avctx, AV_LOG_ERROR, "Synchronization error\n");
-            return AVERROR_INVALIDDATA;
-        }
-
-        for (channel = 0; channel < NB_CHANNELS; channel++)
-            for (sample = 0; sample < 4; sample++)
-                AV_WN32A(&frame->data[channel][4*(opos+sample)],
-                         samples[channel][sample] << 8);
-    }
-
-    *got_frame_ptr = 1;
-    return s->block_size * frame->nb_samples / 4;
-}
-
-static int aptx_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
-                             const AVFrame *frame, int *got_packet_ptr)
-{
-    AptXContext *s = avctx->priv_data;
-    int pos, ipos, channel, sample, output_size, ret;
-
-    if ((ret = ff_af_queue_add(&s->afq, frame)) < 0)
-        return ret;
-
-    output_size = s->block_size * frame->nb_samples/4;
-    if ((ret = ff_alloc_packet2(avctx, avpkt, output_size, 0)) < 0)
-        return ret;
-
-    for (pos = 0, ipos = 0; pos < output_size; pos += s->block_size, ipos += 4) {
-        int32_t samples[NB_CHANNELS][4];
-
-        for (channel = 0; channel < NB_CHANNELS; channel++)
-            for (sample = 0; sample < 4; sample++)
-                samples[channel][sample] = (int32_t)AV_RN32A(&frame->data[channel][4*(ipos+sample)]) >> 8;
-
-        aptx_encode_samples(s, samples, avpkt->data + pos);
-    }
-
-    ff_af_queue_remove(&s->afq, frame->nb_samples, &avpkt->pts, &avpkt->duration);
-    *got_packet_ptr = 1;
-    return 0;
-}
-
-static av_cold int aptx_close(AVCodecContext *avctx)
-{
-    AptXContext *s = avctx->priv_data;
-    ff_af_queue_close(&s->afq);
-    return 0;
-}
-
-
-#if CONFIG_APTX_DECODER
-AVCodec ff_aptx_decoder = {
-    .name                  = "aptx",
-    .long_name             = NULL_IF_CONFIG_SMALL("aptX (Audio Processing Technology for Bluetooth)"),
-    .type                  = AVMEDIA_TYPE_AUDIO,
-    .id                    = AV_CODEC_ID_APTX,
-    .priv_data_size        = sizeof(AptXContext),
-    .init                  = aptx_init,
-    .decode                = aptx_decode_frame,
-    .close                 = aptx_close,
-    .capabilities          = AV_CODEC_CAP_DR1,
-    .caps_internal         = FF_CODEC_CAP_INIT_THREADSAFE,
-    .channel_layouts       = (const uint64_t[]) { AV_CH_LAYOUT_STEREO, 0},
-    .sample_fmts           = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_S32P,
-                                                             AV_SAMPLE_FMT_NONE },
-};
-#endif
-
-#if CONFIG_APTX_HD_DECODER
-AVCodec ff_aptx_hd_decoder = {
-    .name                  = "aptx_hd",
-    .long_name             = NULL_IF_CONFIG_SMALL("aptX HD (Audio Processing Technology for Bluetooth)"),
-    .type                  = AVMEDIA_TYPE_AUDIO,
-    .id                    = AV_CODEC_ID_APTX_HD,
-    .priv_data_size        = sizeof(AptXContext),
-    .init                  = aptx_init,
-    .decode                = aptx_decode_frame,
-    .close                 = aptx_close,
-    .capabilities          = AV_CODEC_CAP_DR1,
-    .caps_internal         = FF_CODEC_CAP_INIT_THREADSAFE,
-    .channel_layouts       = (const uint64_t[]) { AV_CH_LAYOUT_STEREO, 0},
-    .sample_fmts           = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_S32P,
-                                                             AV_SAMPLE_FMT_NONE },
-};
-#endif
-
-#if CONFIG_APTX_ENCODER
-AVCodec ff_aptx_encoder = {
-    .name                  = "aptx",
-    .long_name             = NULL_IF_CONFIG_SMALL("aptX (Audio Processing Technology for Bluetooth)"),
-    .type                  = AVMEDIA_TYPE_AUDIO,
-    .id                    = AV_CODEC_ID_APTX,
-    .priv_data_size        = sizeof(AptXContext),
-    .init                  = aptx_init,
-    .encode2               = aptx_encode_frame,
-    .close                 = aptx_close,
-    .capabilities          = AV_CODEC_CAP_SMALL_LAST_FRAME,
-    .caps_internal         = FF_CODEC_CAP_INIT_THREADSAFE,
-    .channel_layouts       = (const uint64_t[]) { AV_CH_LAYOUT_STEREO, 0},
-    .sample_fmts           = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_S32P,
-                                                             AV_SAMPLE_FMT_NONE },
-    .supported_samplerates = (const int[]) {8000, 16000, 24000, 32000, 44100, 48000, 0},
-};
-#endif
-
-#if CONFIG_APTX_HD_ENCODER
-AVCodec ff_aptx_hd_encoder = {
-    .name                  = "aptx_hd",
-    .long_name             = NULL_IF_CONFIG_SMALL("aptX HD (Audio Processing Technology for Bluetooth)"),
-    .type                  = AVMEDIA_TYPE_AUDIO,
-    .id                    = AV_CODEC_ID_APTX_HD,
-    .priv_data_size        = sizeof(AptXContext),
-    .init                  = aptx_init,
-    .encode2               = aptx_encode_frame,
-    .close                 = aptx_close,
-    .capabilities          = AV_CODEC_CAP_SMALL_LAST_FRAME,
-    .caps_internal         = FF_CODEC_CAP_INIT_THREADSAFE,
-    .channel_layouts       = (const uint64_t[]) { AV_CH_LAYOUT_STEREO, 0},
-    .sample_fmts           = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_S32P,
-                                                             AV_SAMPLE_FMT_NONE },
-    .supported_samplerates = (const int[]) {8000, 16000, 24000, 32000, 44100, 48000, 0},
-};
-#endif
diff --git a/libavcodec/aptx.h b/libavcodec/aptx.h
new file mode 100644
index 0000000..ce3d7dc
--- /dev/null
+++ b/libavcodec/aptx.h
@@ -0,0 +1,220 @@
+/*
+ * Audio Processing Technology codec for Bluetooth (aptX)
+ *
+ * Copyright (C) 2017  Aurelien Jacobs <aurel@gnuage.org>
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVCODEC_APTX_H
+#define AVCODEC_APTX_H
+
+#include "libavutil/intreadwrite.h"
+#include "avcodec.h"
+#include "internal.h"
+#include "mathops.h"
+#include "audio_frame_queue.h"
+
+
+enum channels {
+    LEFT,
+    RIGHT,
+    NB_CHANNELS
+};
+
+enum subbands {
+    LF,  // Low Frequency (0-5.5 kHz)
+    MLF, // Medium-Low Frequency (5.5-11kHz)
+    MHF, // Medium-High Frequency (11-16.5kHz)
+    HF,  // High Frequency (16.5-22kHz)
+    NB_SUBBANDS
+};
+
+#define NB_FILTERS 2
+#define FILTER_TAPS 16
+
+typedef struct {
+    int pos;
+    int32_t buffer[2*FILTER_TAPS];
+} FilterSignal;
+
+typedef struct {
+    FilterSignal outer_filter_signal[NB_FILTERS];
+    FilterSignal inner_filter_signal[NB_FILTERS][NB_FILTERS];
+} QMFAnalysis;
+
+typedef struct {
+    int32_t quantized_sample;
+    int32_t quantized_sample_parity_change;
+    int32_t error;
+} Quantize;
+
+typedef struct {
+    int32_t quantization_factor;
+    int32_t factor_select;
+    int32_t reconstructed_difference;
+} InvertQuantize;
+
+typedef struct {
+    int32_t prev_sign[2];
+    int32_t s_weight[2];
+    int32_t d_weight[24];
+    int32_t pos;
+    int32_t reconstructed_differences[48];
+    int32_t previous_reconstructed_sample;
+    int32_t predicted_difference;
+    int32_t predicted_sample;
+} Prediction;
+
+typedef struct {
+    int32_t codeword_history;
+    int32_t dither_parity;
+    int32_t dither[NB_SUBBANDS];
+
+    QMFAnalysis qmf;
+    Quantize quantize[NB_SUBBANDS];
+    InvertQuantize invert_quantize[NB_SUBBANDS];
+    Prediction prediction[NB_SUBBANDS];
+} Channel;
+
+typedef struct {
+    int hd;
+    int block_size;
+    int32_t sync_idx;
+    Channel channels[NB_CHANNELS];
+    AudioFrameQueue afq;
+} AptXContext;
+
+typedef const struct {
+    const int32_t *quantize_intervals;
+    const int32_t *invert_quantize_dither_factors;
+    const int32_t *quantize_dither_factors;
+    const int16_t *quantize_factor_select_offset;
+    int tables_size;
+    int32_t factor_max;
+    int32_t prediction_order;
+} ConstTables;
+
+extern ConstTables ff_aptx_quant_tables[2][NB_SUBBANDS];
+
+/* Rounded right shift with optionnal clipping */
+#define RSHIFT_SIZE(size)                                                     \
+av_always_inline                                                              \
+static int##size##_t rshift##size(int##size##_t value, int shift)             \
+{                                                                             \
+    int##size##_t rounding = (int##size##_t)1 << (shift - 1);                 \
+    int##size##_t mask = ((int##size##_t)1 << (shift + 1)) - 1;               \
+    return ((value + rounding) >> shift) - ((value & mask) == rounding);      \
+}                                                                             \
+av_always_inline                                                              \
+static int##size##_t rshift##size##_clip24(int##size##_t value, int shift)    \
+{                                                                             \
+    return av_clip_intp2(rshift##size(value, shift), 23);                     \
+}
+RSHIFT_SIZE(32)
+RSHIFT_SIZE(64)
+
+/*
+ * Convolution filter coefficients for the outer QMF of the QMF tree.
+ * The 2 sets are a mirror of each other.
+ */
+static const int32_t aptx_qmf_outer_coeffs[NB_FILTERS][FILTER_TAPS] = {
+    {
+        730, -413, -9611, 43626, -121026, 269973, -585547, 2801966,
+        697128, -160481, 27611, 8478, -10043, 3511, 688, -897,
+    },
+    {
+        -897, 688, 3511, -10043, 8478, 27611, -160481, 697128,
+        2801966, -585547, 269973, -121026, 43626, -9611, -413, 730,
+    },
+};
+
+/*
+ * Convolution filter coefficients for the inner QMF of the QMF tree.
+ * The 2 sets are a mirror of each other.
+ */
+static const int32_t aptx_qmf_inner_coeffs[NB_FILTERS][FILTER_TAPS] = {
+    {
+       1033, -584, -13592, 61697, -171156, 381799, -828088, 3962579,
+       985888, -226954, 39048, 11990, -14203, 4966, 973, -1268,
+    },
+    {
+      -1268, 973, 4966, -14203, 11990, 39048, -226954, 985888,
+      3962579, -828088, 381799, -171156, 61697, -13592, -584, 1033,
+    },
+};
+
+/*
+ * Push one sample into a circular signal buffer.
+ */
+av_always_inline
+static void aptx_qmf_filter_signal_push(FilterSignal *signal, int32_t sample)
+{
+    signal->buffer[signal->pos            ] = sample;
+    signal->buffer[signal->pos+FILTER_TAPS] = sample;
+    signal->pos = (signal->pos + 1) & (FILTER_TAPS - 1);
+}
+
+/*
+ * Compute the convolution of the signal with the coefficients, and reduce
+ * to 24 bits by applying the specified right shifting.
+ */
+av_always_inline
+static int32_t aptx_qmf_convolution(FilterSignal *signal,
+                                    const int32_t coeffs[FILTER_TAPS],
+                                    int shift)
+{
+    int32_t *sig = &signal->buffer[signal->pos];
+    int64_t e = 0;
+    int i;
+
+    for (i = 0; i < FILTER_TAPS; i++)
+        e += MUL64(sig[i], coeffs[i]);
+
+    return rshift64_clip24(e, shift);
+}
+
+static inline int32_t aptx_quantized_parity(Channel *channel)
+{
+    int32_t parity = channel->dither_parity;
+    int subband;
+
+    for (subband = 0; subband < NB_SUBBANDS; subband++)
+        parity ^= channel->quantize[subband].quantized_sample;
+
+    return parity & 1;
+}
+
+/* For each sample, ensure that the parity of all subbands of all channels
+ * is 0 except once every 8 samples where the parity is forced to 1. */
+static inline int aptx_check_parity(Channel channels[NB_CHANNELS], int32_t *idx)
+{
+    int32_t parity = aptx_quantized_parity(&channels[LEFT])
+                   ^ aptx_quantized_parity(&channels[RIGHT]);
+
+    int eighth = *idx == 7;
+    *idx = (*idx + 1) & 7;
+
+    return parity ^ eighth;
+}
+
+void ff_aptx_invert_quantize_and_prediction(Channel *channel, int hd);
+void ff_aptx_generate_dither(Channel *channel);
+
+int ff_aptx_init(AVCodecContext *avctx);
+
+#endif /* AVCODEC_APTX_H */
diff --git a/libavcodec/aptxdec.c b/libavcodec/aptxdec.c
new file mode 100644
index 0000000..3bbf010
--- /dev/null
+++ b/libavcodec/aptxdec.c
@@ -0,0 +1,204 @@
+/*
+ * Audio Processing Technology codec for Bluetooth (aptX)
+ *
+ * Copyright (C) 2017  Aurelien Jacobs <aurel@gnuage.org>
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "aptx.h"
+
+/*
+ * Half-band QMF synthesis filter realized with a polyphase FIR filter.
+ * Join 2 subbands and upsample by 2.
+ * So for each 2 subbands sample that goes in, a pair of samples goes out.
+ */
+av_always_inline
+static void aptx_qmf_polyphase_synthesis(FilterSignal signal[NB_FILTERS],
+                                         const int32_t coeffs[NB_FILTERS][FILTER_TAPS],
+                                         int shift,
+                                         int32_t low_subband_input,
+                                         int32_t high_subband_input,
+                                         int32_t samples[NB_FILTERS])
+{
+    int32_t subbands[NB_FILTERS];
+    int i;
+
+    subbands[0] = low_subband_input + high_subband_input;
+    subbands[1] = low_subband_input - high_subband_input;
+
+    for (i = 0; i < NB_FILTERS; i++) {
+        aptx_qmf_filter_signal_push(&signal[i], subbands[1-i]);
+        samples[i] = aptx_qmf_convolution(&signal[i], coeffs[i], shift);
+    }
+}
+
+/*
+ * Two stage QMF synthesis tree.
+ * Join 4 subbands and upsample by 4.
+ * So for each 4 subbands sample that goes in, a group of 4 samples goes out.
+ */
+static void aptx_qmf_tree_synthesis(QMFAnalysis *qmf,
+                                    int32_t subband_samples[4],
+                                    int32_t samples[4])
+{
+    int32_t intermediate_samples[4];
+    int i;
+
+    /* Join 4 subbands into 2 intermediate subbands upsampled to 2 samples. */
+    for (i = 0; i < 2; i++)
+        aptx_qmf_polyphase_synthesis(qmf->inner_filter_signal[i],
+                                     aptx_qmf_inner_coeffs, 22,
+                                     subband_samples[2*i+0],
+                                     subband_samples[2*i+1],
+                                     &intermediate_samples[2*i]);
+
+    /* Join 2 samples from intermediate subbands upsampled to 4 samples. */
+    for (i = 0; i < 2; i++)
+        aptx_qmf_polyphase_synthesis(qmf->outer_filter_signal,
+                                     aptx_qmf_outer_coeffs, 21,
+                                     intermediate_samples[0+i],
+                                     intermediate_samples[2+i],
+                                     &samples[2*i]);
+}
+
+
+static void aptx_decode_channel(Channel *channel, int32_t samples[4])
+{
+    int32_t subband_samples[4];
+    int subband;
+    for (subband = 0; subband < NB_SUBBANDS; subband++)
+        subband_samples[subband] = channel->prediction[subband].previous_reconstructed_sample;
+    aptx_qmf_tree_synthesis(&channel->qmf, subband_samples, samples);
+}
+
+static void aptx_unpack_codeword(Channel *channel, uint16_t codeword)
+{
+    channel->quantize[0].quantized_sample = sign_extend(codeword >>  0, 7);
+    channel->quantize[1].quantized_sample = sign_extend(codeword >>  7, 4);
+    channel->quantize[2].quantized_sample = sign_extend(codeword >> 11, 2);
+    channel->quantize[3].quantized_sample = sign_extend(codeword >> 13, 3);
+    channel->quantize[3].quantized_sample = (channel->quantize[3].quantized_sample & ~1)
+                                          | aptx_quantized_parity(channel);
+}
+
+static void aptxhd_unpack_codeword(Channel *channel, uint32_t codeword)
+{
+    channel->quantize[0].quantized_sample = sign_extend(codeword >>  0, 9);
+    channel->quantize[1].quantized_sample = sign_extend(codeword >>  9, 6);
+    channel->quantize[2].quantized_sample = sign_extend(codeword >> 15, 4);
+    channel->quantize[3].quantized_sample = sign_extend(codeword >> 19, 5);
+    channel->quantize[3].quantized_sample = (channel->quantize[3].quantized_sample & ~1)
+                                          | aptx_quantized_parity(channel);
+}
+
+static int aptx_decode_samples(AptXContext *ctx,
+                                const uint8_t *input,
+                                int32_t samples[NB_CHANNELS][4])
+{
+    int channel, ret;
+
+    for (channel = 0; channel < NB_CHANNELS; channel++) {
+        ff_aptx_generate_dither(&ctx->channels[channel]);
+
+        if (ctx->hd)
+            aptxhd_unpack_codeword(&ctx->channels[channel],
+                                   AV_RB24(input + 3*channel));
+        else
+            aptx_unpack_codeword(&ctx->channels[channel],
+                                 AV_RB16(input + 2*channel));
+        ff_aptx_invert_quantize_and_prediction(&ctx->channels[channel], ctx->hd);
+    }
+
+    ret = aptx_check_parity(ctx->channels, &ctx->sync_idx);
+
+    for (channel = 0; channel < NB_CHANNELS; channel++)
+        aptx_decode_channel(&ctx->channels[channel], samples[channel]);
+
+    return ret;
+}
+
+static int aptx_decode_frame(AVCodecContext *avctx, void *data,
+                             int *got_frame_ptr, AVPacket *avpkt)
+{
+    AptXContext *s = avctx->priv_data;
+    AVFrame *frame = data;
+    int pos, opos, channel, sample, ret;
+
+    if (avpkt->size < s->block_size) {
+        av_log(avctx, AV_LOG_ERROR, "Packet is too small\n");
+        return AVERROR_INVALIDDATA;
+    }
+
+    /* get output buffer */
+    frame->channels = NB_CHANNELS;
+    frame->format = AV_SAMPLE_FMT_S32P;
+    frame->nb_samples = 4 * avpkt->size / s->block_size;
+    if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
+        return ret;
+
+    for (pos = 0, opos = 0; opos < frame->nb_samples; pos += s->block_size, opos += 4) {
+        int32_t samples[NB_CHANNELS][4];
+
+        if (aptx_decode_samples(s, &avpkt->data[pos], samples)) {
+            av_log(avctx, AV_LOG_ERROR, "Synchronization error\n");
+            return AVERROR_INVALIDDATA;
+        }
+
+        for (channel = 0; channel < NB_CHANNELS; channel++)
+            for (sample = 0; sample < 4; sample++)
+                AV_WN32A(&frame->data[channel][4*(opos+sample)],
+                         samples[channel][sample] * 256);
+    }
+
+    *got_frame_ptr = 1;
+    return s->block_size * frame->nb_samples / 4;
+}
+
+#if CONFIG_APTX_DECODER
+AVCodec ff_aptx_decoder = {
+    .name                  = "aptx",
+    .long_name             = NULL_IF_CONFIG_SMALL("aptX (Audio Processing Technology for Bluetooth)"),
+    .type                  = AVMEDIA_TYPE_AUDIO,
+    .id                    = AV_CODEC_ID_APTX,
+    .priv_data_size        = sizeof(AptXContext),
+    .init                  = ff_aptx_init,
+    .decode                = aptx_decode_frame,
+    .capabilities          = AV_CODEC_CAP_DR1,
+    .caps_internal         = FF_CODEC_CAP_INIT_THREADSAFE,
+    .channel_layouts       = (const uint64_t[]) { AV_CH_LAYOUT_STEREO, 0},
+    .sample_fmts           = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_S32P,
+                                                             AV_SAMPLE_FMT_NONE },
+};
+#endif
+
+#if CONFIG_APTX_HD_DECODER
+AVCodec ff_aptx_hd_decoder = {
+    .name                  = "aptx_hd",
+    .long_name             = NULL_IF_CONFIG_SMALL("aptX HD (Audio Processing Technology for Bluetooth)"),
+    .type                  = AVMEDIA_TYPE_AUDIO,
+    .id                    = AV_CODEC_ID_APTX_HD,
+    .priv_data_size        = sizeof(AptXContext),
+    .init                  = ff_aptx_init,
+    .decode                = aptx_decode_frame,
+    .capabilities          = AV_CODEC_CAP_DR1,
+    .caps_internal         = FF_CODEC_CAP_INIT_THREADSAFE,
+    .channel_layouts       = (const uint64_t[]) { AV_CH_LAYOUT_STEREO, 0},
+    .sample_fmts           = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_S32P,
+                                                             AV_SAMPLE_FMT_NONE },
+};
+#endif
diff --git a/libavcodec/aptxenc.c b/libavcodec/aptxenc.c
new file mode 100644
index 0000000..60de73e
--- /dev/null
+++ b/libavcodec/aptxenc.c
@@ -0,0 +1,278 @@
+/*
+ * Audio Processing Technology codec for Bluetooth (aptX)
+ *
+ * Copyright (C) 2017  Aurelien Jacobs <aurel@gnuage.org>
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "aptx.h"
+
+/*
+ * Half-band QMF analysis filter realized with a polyphase FIR filter.
+ * Split into 2 subbands and downsample by 2.
+ * So for each pair of samples that goes in, one sample goes out,
+ * split into 2 separate subbands.
+ */
+av_always_inline
+static void aptx_qmf_polyphase_analysis(FilterSignal signal[NB_FILTERS],
+                                        const int32_t coeffs[NB_FILTERS][FILTER_TAPS],
+                                        int shift,
+                                        int32_t samples[NB_FILTERS],
+                                        int32_t *low_subband_output,
+                                        int32_t *high_subband_output)
+{
+    int32_t subbands[NB_FILTERS];
+    int i;
+
+    for (i = 0; i < NB_FILTERS; i++) {
+        aptx_qmf_filter_signal_push(&signal[i], samples[NB_FILTERS-1-i]);
+        subbands[i] = aptx_qmf_convolution(&signal[i], coeffs[i], shift);
+    }
+
+    *low_subband_output  = av_clip_intp2(subbands[0] + subbands[1], 23);
+    *high_subband_output = av_clip_intp2(subbands[0] - subbands[1], 23);
+}
+
+/*
+ * Two stage QMF analysis tree.
+ * Split 4 input samples into 4 subbands and downsample by 4.
+ * So for each group of 4 samples that goes in, one sample goes out,
+ * split into 4 separate subbands.
+ */
+static void aptx_qmf_tree_analysis(QMFAnalysis *qmf,
+                                   int32_t samples[4],
+                                   int32_t subband_samples[4])
+{
+    int32_t intermediate_samples[4];
+    int i;
+
+    /* Split 4 input samples into 2 intermediate subbands downsampled to 2 samples */
+    for (i = 0; i < 2; i++)
+        aptx_qmf_polyphase_analysis(qmf->outer_filter_signal,
+                                    aptx_qmf_outer_coeffs, 23,
+                                    &samples[2*i],
+                                    &intermediate_samples[0+i],
+                                    &intermediate_samples[2+i]);
+
+    /* Split 2 intermediate subband samples into 4 final subbands downsampled to 1 sample */
+    for (i = 0; i < 2; i++)
+        aptx_qmf_polyphase_analysis(qmf->inner_filter_signal[i],
+                                    aptx_qmf_inner_coeffs, 23,
+                                    &intermediate_samples[2*i],
+                                    &subband_samples[2*i+0],
+                                    &subband_samples[2*i+1]);
+}
+
+av_always_inline
+static int32_t aptx_bin_search(int32_t value, int32_t factor,
+                               const int32_t *intervals, int32_t nb_intervals)
+{
+    int32_t idx = 0;
+    int i;
+
+    for (i = nb_intervals >> 1; i > 0; i >>= 1)
+        if (MUL64(factor, intervals[idx + i]) <= ((int64_t)value << 24))
+            idx += i;
+
+    return idx;
+}
+
+static void aptx_quantize_difference(Quantize *quantize,
+                                     int32_t sample_difference,
+                                     int32_t dither,
+                                     int32_t quantization_factor,
+                                     ConstTables *tables)
+{
+    const int32_t *intervals = tables->quantize_intervals;
+    int32_t quantized_sample, dithered_sample, parity_change;
+    int32_t d, mean, interval, inv, sample_difference_abs;
+    int64_t error;
+
+    sample_difference_abs = FFABS(sample_difference);
+    sample_difference_abs = FFMIN(sample_difference_abs, (1 << 23) - 1);
+
+    quantized_sample = aptx_bin_search(sample_difference_abs >> 4,
+                                       quantization_factor,
+                                       intervals, tables->tables_size);
+
+    d = rshift32_clip24(MULH(dither, dither), 7) - (1 << 23);
+    d = rshift64(MUL64(d, tables->quantize_dither_factors[quantized_sample]), 23);
+
+    intervals += quantized_sample;
+    mean = (intervals[1] + intervals[0]) / 2;
+    interval = (intervals[1] - intervals[0]) * (-(sample_difference < 0) | 1);
+
+    dithered_sample = rshift64_clip24(MUL64(dither, interval) + ((int64_t)av_clip_intp2(mean + d, 23) << 32), 32);
+    error = ((int64_t)sample_difference_abs << 20) - MUL64(dithered_sample, quantization_factor);
+    quantize->error = FFABS(rshift64(error, 23));
+
+    parity_change = quantized_sample;
+    if (error < 0)
+        quantized_sample--;
+    else
+        parity_change--;
+
+    inv = -(sample_difference < 0);
+    quantize->quantized_sample               = quantized_sample ^ inv;
+    quantize->quantized_sample_parity_change = parity_change    ^ inv;
+}
+
+static void aptx_encode_channel(Channel *channel, int32_t samples[4], int hd)
+{
+    int32_t subband_samples[4];
+    int subband;
+    aptx_qmf_tree_analysis(&channel->qmf, samples, subband_samples);
+    ff_aptx_generate_dither(channel);
+    for (subband = 0; subband < NB_SUBBANDS; subband++) {
+        int32_t diff = av_clip_intp2(subband_samples[subband] - channel->prediction[subband].predicted_sample, 23);
+        aptx_quantize_difference(&channel->quantize[subband], diff,
+                                 channel->dither[subband],
+                                 channel->invert_quantize[subband].quantization_factor,
+                                 &ff_aptx_quant_tables[hd][subband]);
+    }
+}
+
+static void aptx_insert_sync(Channel channels[NB_CHANNELS], int32_t *idx)
+{
+    if (aptx_check_parity(channels, idx)) {
+        int i;
+        Channel *c;
+        static const int map[] = { 1, 2, 0, 3 };
+        Quantize *min = &channels[NB_CHANNELS-1].quantize[map[0]];
+        for (c = &channels[NB_CHANNELS-1]; c >= channels; c--)
+            for (i = 0; i < NB_SUBBANDS; i++)
+                if (c->quantize[map[i]].error < min->error)
+                    min = &c->quantize[map[i]];
+
+        /* Forcing the desired parity is done by offsetting by 1 the quantized
+         * sample from the subband featuring the smallest quantization error. */
+        min->quantized_sample = min->quantized_sample_parity_change;
+    }
+}
+
+static uint16_t aptx_pack_codeword(Channel *channel)
+{
+    int32_t parity = aptx_quantized_parity(channel);
+    return (((channel->quantize[3].quantized_sample & 0x06) | parity) << 13)
+         | (((channel->quantize[2].quantized_sample & 0x03)         ) << 11)
+         | (((channel->quantize[1].quantized_sample & 0x0F)         ) <<  7)
+         | (((channel->quantize[0].quantized_sample & 0x7F)         ) <<  0);
+}
+
+static uint32_t aptxhd_pack_codeword(Channel *channel)
+{
+    int32_t parity = aptx_quantized_parity(channel);
+    return (((channel->quantize[3].quantized_sample & 0x01E) | parity) << 19)
+         | (((channel->quantize[2].quantized_sample & 0x00F)         ) << 15)
+         | (((channel->quantize[1].quantized_sample & 0x03F)         ) <<  9)
+         | (((channel->quantize[0].quantized_sample & 0x1FF)         ) <<  0);
+}
+
+static void aptx_encode_samples(AptXContext *ctx,
+                                int32_t samples[NB_CHANNELS][4],
+                                uint8_t *output)
+{
+    int channel;
+    for (channel = 0; channel < NB_CHANNELS; channel++)
+        aptx_encode_channel(&ctx->channels[channel], samples[channel], ctx->hd);
+
+    aptx_insert_sync(ctx->channels, &ctx->sync_idx);
+
+    for (channel = 0; channel < NB_CHANNELS; channel++) {
+        ff_aptx_invert_quantize_and_prediction(&ctx->channels[channel], ctx->hd);
+        if (ctx->hd)
+            AV_WB24(output + 3*channel,
+                    aptxhd_pack_codeword(&ctx->channels[channel]));
+        else
+            AV_WB16(output + 2*channel,
+                    aptx_pack_codeword(&ctx->channels[channel]));
+    }
+}
+
+static int aptx_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
+                             const AVFrame *frame, int *got_packet_ptr)
+{
+    AptXContext *s = avctx->priv_data;
+    int pos, ipos, channel, sample, output_size, ret;
+
+    if ((ret = ff_af_queue_add(&s->afq, frame)) < 0)
+        return ret;
+
+    output_size = s->block_size * frame->nb_samples/4;
+    if ((ret = ff_alloc_packet2(avctx, avpkt, output_size, 0)) < 0)
+        return ret;
+
+    for (pos = 0, ipos = 0; pos < output_size; pos += s->block_size, ipos += 4) {
+        int32_t samples[NB_CHANNELS][4];
+
+        for (channel = 0; channel < NB_CHANNELS; channel++)
+            for (sample = 0; sample < 4; sample++)
+                samples[channel][sample] = (int32_t)AV_RN32A(&frame->data[channel][4*(ipos+sample)]) >> 8;
+
+        aptx_encode_samples(s, samples, avpkt->data + pos);
+    }
+
+    ff_af_queue_remove(&s->afq, frame->nb_samples, &avpkt->pts, &avpkt->duration);
+    *got_packet_ptr = 1;
+    return 0;
+}
+
+static av_cold int aptx_close(AVCodecContext *avctx)
+{
+    AptXContext *s = avctx->priv_data;
+    ff_af_queue_close(&s->afq);
+    return 0;
+}
+
+#if CONFIG_APTX_ENCODER
+AVCodec ff_aptx_encoder = {
+    .name                  = "aptx",
+    .long_name             = NULL_IF_CONFIG_SMALL("aptX (Audio Processing Technology for Bluetooth)"),
+    .type                  = AVMEDIA_TYPE_AUDIO,
+    .id                    = AV_CODEC_ID_APTX,
+    .priv_data_size        = sizeof(AptXContext),
+    .init                  = ff_aptx_init,
+    .encode2               = aptx_encode_frame,
+    .close                 = aptx_close,
+    .capabilities          = AV_CODEC_CAP_SMALL_LAST_FRAME,
+    .caps_internal         = FF_CODEC_CAP_INIT_THREADSAFE,
+    .channel_layouts       = (const uint64_t[]) { AV_CH_LAYOUT_STEREO, 0},
+    .sample_fmts           = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_S32P,
+                                                             AV_SAMPLE_FMT_NONE },
+    .supported_samplerates = (const int[]) {8000, 16000, 24000, 32000, 44100, 48000, 0},
+};
+#endif
+
+#if CONFIG_APTX_HD_ENCODER
+AVCodec ff_aptx_hd_encoder = {
+    .name                  = "aptx_hd",
+    .long_name             = NULL_IF_CONFIG_SMALL("aptX HD (Audio Processing Technology for Bluetooth)"),
+    .type                  = AVMEDIA_TYPE_AUDIO,
+    .id                    = AV_CODEC_ID_APTX_HD,
+    .priv_data_size        = sizeof(AptXContext),
+    .init                  = ff_aptx_init,
+    .encode2               = aptx_encode_frame,
+    .close                 = aptx_close,
+    .capabilities          = AV_CODEC_CAP_SMALL_LAST_FRAME,
+    .caps_internal         = FF_CODEC_CAP_INIT_THREADSAFE,
+    .channel_layouts       = (const uint64_t[]) { AV_CH_LAYOUT_STEREO, 0},
+    .sample_fmts           = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_S32P,
+                                                             AV_SAMPLE_FMT_NONE },
+    .supported_samplerates = (const int[]) {8000, 16000, 24000, 32000, 44100, 48000, 0},
+};
+#endif
diff --git a/libavcodec/arbc.c b/libavcodec/arbc.c
new file mode 100644
index 0000000..06970f1
--- /dev/null
+++ b/libavcodec/arbc.c
@@ -0,0 +1,227 @@
+/*
+ * Gryphon's Anim Compressor decoder
+ * Copyright (c) 2019 Paul B Mahol
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "libavutil/imgutils.h"
+#include "libavutil/internal.h"
+#include "libavutil/intreadwrite.h"
+#include "libavutil/mem.h"
+
+#include "avcodec.h"
+#include "bytestream.h"
+#include "internal.h"
+
+typedef struct ARBCContext {
+    GetByteContext gb;
+
+    AVFrame *prev_frame;
+} ARBCContext;
+
+static int fill_tile4(AVCodecContext *avctx, int color, AVFrame *frame)
+{
+    ARBCContext *s = avctx->priv_data;
+    GetByteContext *gb = &s->gb;
+    int nb_tiles = bytestream2_get_le16(gb);
+    int h = avctx->height - 1;
+    int pixels_overwritten = 0;
+
+    if ((avctx->width / 4 + 1) * (avctx->height / 4 + 1) < nb_tiles)
+        return 0;
+
+    for (int i = 0; i < nb_tiles; i++) {
+        int y = bytestream2_get_byte(gb);
+        int x = bytestream2_get_byte(gb);
+        uint16_t mask = bytestream2_get_le16(gb);
+        int start_y = y * 4, start_x = x * 4;
+        int end_y = start_y + 4, end_x = start_x + 4;
+
+        for (int j = start_y; j < end_y; j++) {
+            for (int k = start_x; k < end_x; k++) {
+                if (mask & 0x8000) {
+                    if (j >= avctx->height || k >= avctx->width) {
+                        mask = mask << 1;
+                        continue;
+                    }
+                    AV_WB24(&frame->data[0][frame->linesize[0] * (h - j) + 3 * k], color);
+                    pixels_overwritten ++;
+                }
+                mask = mask << 1;
+            }
+        }
+    }
+    return pixels_overwritten;
+}
+
+static int fill_tileX(AVCodecContext *avctx, int tile_width, int tile_height,
+                       int color, AVFrame *frame)
+{
+    ARBCContext *s = avctx->priv_data;
+    GetByteContext *gb = &s->gb;
+    const int step_h = tile_height / 4;
+    const int step_w = tile_width / 4;
+    int nb_tiles = bytestream2_get_le16(gb);
+    int h = avctx->height - 1;
+    int pixels_overwritten = 0;
+
+    if ((avctx->width / tile_width + 1) * (avctx->height / tile_height + 1) < nb_tiles)
+        return 0;
+
+    for (int i = 0; i < nb_tiles; i++) {
+        int y = bytestream2_get_byte(gb);
+        int x = bytestream2_get_byte(gb);
+        uint16_t mask = bytestream2_get_le16(gb);
+        int start_y = y * tile_height, start_x = x * tile_width;
+        int end_y = start_y + tile_height, end_x = start_x + tile_width;
+
+        if (start_x >= avctx->width || start_y >= avctx->height)
+            continue;
+
+        for (int j = start_y; j < end_y; j += step_h) {
+            for (int k = start_x; k < end_x; k += step_w) {
+                if (mask & 0x8000U) {
+                    for (int m = 0; m < step_h; m++) {
+                        for (int n = 0; n < step_w; n++) {
+                            if (j + m >= avctx->height || k + n >= avctx->width)
+                                continue;
+                            AV_WB24(&frame->data[0][frame->linesize[0] * (h - (j + m)) + 3 * (k + n)], color);
+                        }
+                    }
+                    pixels_overwritten += FFMIN(step_h, avctx->height - j) * FFMIN(step_w, avctx->width - k);
+                }
+                mask = mask << 1;
+            }
+        }
+    }
+    return pixels_overwritten;
+}
+
+static int decode_frame(AVCodecContext *avctx, void *data,
+                        int *got_frame, AVPacket *avpkt)
+{
+    ARBCContext *s = avctx->priv_data;
+    AVFrame *frame = data;
+    int ret, nb_segments;
+    int prev_pixels = avctx->width * avctx->height;
+
+    if (avpkt->size < 10)
+        return AVERROR_INVALIDDATA;
+
+    bytestream2_init(&s->gb, avpkt->data, avpkt->size);
+    bytestream2_skip(&s->gb, 8);
+    nb_segments = bytestream2_get_le16(&s->gb);
+    if (nb_segments == 0)
+        return avpkt->size;
+
+    if (7 * nb_segments > bytestream2_get_bytes_left(&s->gb))
+        return AVERROR_INVALIDDATA;
+
+    if ((ret = ff_get_buffer(avctx, frame, AV_GET_BUFFER_FLAG_REF)) < 0)
+        return ret;
+
+    if (s->prev_frame->data[0]) {
+        ret = av_frame_copy(frame, s->prev_frame);
+        if (ret < 0)
+            return ret;
+    }
+
+    for (int i = 0; i < nb_segments; i++) {
+        int resolution_flag;
+        int fill;
+
+        if (bytestream2_get_bytes_left(&s->gb) <= 0)
+            return AVERROR_INVALIDDATA;
+
+        fill = bytestream2_get_byte(&s->gb) << 16;
+        bytestream2_skip(&s->gb, 1);
+        fill |= bytestream2_get_byte(&s->gb) << 8;
+        bytestream2_skip(&s->gb, 1);
+        fill |= bytestream2_get_byte(&s->gb) << 0;
+        bytestream2_skip(&s->gb, 1);
+        resolution_flag = bytestream2_get_byte(&s->gb);
+
+        if (resolution_flag & 0x10)
+            prev_pixels -= fill_tileX(avctx, 1024, 1024, fill, frame);
+        if (resolution_flag & 0x08)
+            prev_pixels -= fill_tileX(avctx, 256, 256, fill, frame);
+        if (resolution_flag & 0x04)
+            prev_pixels -= fill_tileX(avctx, 64, 64, fill, frame);
+        if (resolution_flag & 0x02)
+            prev_pixels -= fill_tileX(avctx, 16, 16, fill, frame);
+        if (resolution_flag & 0x01)
+            prev_pixels -= fill_tile4(avctx, fill, frame);
+    }
+
+    av_frame_unref(s->prev_frame);
+    if ((ret = av_frame_ref(s->prev_frame, frame)) < 0)
+        return ret;
+
+    frame->pict_type = prev_pixels <= 0 ? AV_PICTURE_TYPE_I : AV_PICTURE_TYPE_P;
+    frame->key_frame = prev_pixels <= 0;
+    *got_frame = 1;
+
+    return avpkt->size;
+}
+
+static av_cold int decode_init(AVCodecContext *avctx)
+{
+    ARBCContext *s = avctx->priv_data;
+
+    avctx->pix_fmt = AV_PIX_FMT_RGB24;
+
+    s->prev_frame = av_frame_alloc();
+    if (!s->prev_frame)
+        return AVERROR(ENOMEM);
+
+    return 0;
+}
+
+static void decode_flush(AVCodecContext *avctx)
+{
+    ARBCContext *s = avctx->priv_data;
+
+    av_frame_unref(s->prev_frame);
+}
+
+static av_cold int decode_close(AVCodecContext *avctx)
+{
+    ARBCContext *s = avctx->priv_data;
+
+    av_frame_free(&s->prev_frame);
+
+    return 0;
+}
+
+AVCodec ff_arbc_decoder = {
+    .name           = "arbc",
+    .long_name      = NULL_IF_CONFIG_SMALL("Gryphon's Anim Compressor"),
+    .type           = AVMEDIA_TYPE_VIDEO,
+    .id             = AV_CODEC_ID_ARBC,
+    .priv_data_size = sizeof(ARBCContext),
+    .init           = decode_init,
+    .decode         = decode_frame,
+    .flush          = decode_flush,
+    .close          = decode_close,
+    .capabilities   = AV_CODEC_CAP_DR1,
+    .caps_internal  = FF_CODEC_CAP_INIT_CLEANUP,
+};
diff --git a/libavcodec/arm/Makefile b/libavcodec/arm/Makefile
index e656011..c99e8e1 100644
--- a/libavcodec/arm/Makefile
+++ b/libavcodec/arm/Makefile
@@ -43,6 +43,7 @@
 OBJS-$(CONFIG_MLP_DECODER)             += arm/mlpdsp_init_arm.o
 OBJS-$(CONFIG_RV40_DECODER)            += arm/rv40dsp_init_arm.o
 OBJS-$(CONFIG_SBC_ENCODER)             += arm/sbcdsp_init_arm.o
+OBJS-$(CONFIG_TRUEHD_DECODER)          += arm/mlpdsp_init_arm.o
 OBJS-$(CONFIG_VORBIS_DECODER)          += arm/vorbisdsp_init_arm.o
 OBJS-$(CONFIG_VP6_DECODER)             += arm/vp6dsp_init_arm.o
 OBJS-$(CONFIG_VP9_DECODER)             += arm/vp9dsp_init_10bpp_arm.o   \
@@ -61,6 +62,7 @@
 
 # decoders/encoders
 ARMV5TE-OBJS-$(CONFIG_MLP_DECODER)     += arm/mlpdsp_armv5te.o
+ARMV5TE-OBJS-$(CONFIG_TRUEHD_DECODER)  += arm/mlpdsp_armv5te.o
 
 
 # ARMv6 optimizations
@@ -83,6 +85,7 @@
 # decoders/encoders
 ARMV6-OBJS-$(CONFIG_MLP_DECODER)       += arm/mlpdsp_armv6.o
 ARMV6-OBJS-$(CONFIG_SBC_ENCODER)       += arm/sbcdsp_armv6.o
+ARMV6-OBJS-$(CONFIG_TRUEHD_DECODER)    += arm/mlpdsp_armv6.o
 
 
 # VFP optimizations
diff --git a/libavcodec/arm/h264dsp_init_arm.c b/libavcodec/arm/h264dsp_init_arm.c
index 90144d0..54e1e38 100644
--- a/libavcodec/arm/h264dsp_init_arm.c
+++ b/libavcodec/arm/h264dsp_init_arm.c
@@ -25,14 +25,16 @@
 #include "libavcodec/h264dsp.h"
 #include "libavcodec/arm/startcode.h"
 
-void ff_h264_v_loop_filter_luma_neon(uint8_t *pix, int stride, int alpha,
+void ff_h264_v_loop_filter_luma_neon(uint8_t *pix, ptrdiff_t stride, int alpha,
                                      int beta, int8_t *tc0);
-void ff_h264_h_loop_filter_luma_neon(uint8_t *pix, int stride, int alpha,
+void ff_h264_h_loop_filter_luma_neon(uint8_t *pix, ptrdiff_t stride, int alpha,
                                      int beta, int8_t *tc0);
-void ff_h264_v_loop_filter_chroma_neon(uint8_t *pix, int stride, int alpha,
+void ff_h264_v_loop_filter_chroma_neon(uint8_t *pix, ptrdiff_t stride, int alpha,
                                        int beta, int8_t *tc0);
-void ff_h264_h_loop_filter_chroma_neon(uint8_t *pix, int stride, int alpha,
+void ff_h264_h_loop_filter_chroma_neon(uint8_t *pix, ptrdiff_t stride, int alpha,
                                        int beta, int8_t *tc0);
+void ff_h264_h_loop_filter_chroma422_neon(uint8_t *pix, ptrdiff_t stride, int alpha,
+                                          int beta, int8_t *tc0);
 
 void ff_weight_h264_pixels_16_neon(uint8_t *dst, int stride, int height,
                                    int log2_den, int weight, int offset);
@@ -77,9 +79,11 @@
         c->h264_v_loop_filter_luma   = ff_h264_v_loop_filter_luma_neon;
         c->h264_h_loop_filter_luma   = ff_h264_h_loop_filter_luma_neon;
         c->h264_v_loop_filter_chroma = ff_h264_v_loop_filter_chroma_neon;
-        if(chroma_format_idc == 1){
-        c->h264_h_loop_filter_chroma = ff_h264_h_loop_filter_chroma_neon;
-        }
+
+        if (chroma_format_idc <= 1)
+            c->h264_h_loop_filter_chroma = ff_h264_h_loop_filter_chroma_neon;
+        else
+            c->h264_h_loop_filter_chroma = ff_h264_h_loop_filter_chroma422_neon;
 
         c->weight_h264_pixels_tab[0] = ff_weight_h264_pixels_16_neon;
         c->weight_h264_pixels_tab[1] = ff_weight_h264_pixels_8_neon;
diff --git a/libavcodec/arm/h264dsp_neon.S b/libavcodec/arm/h264dsp_neon.S
index 274a547..5fed684 100644
--- a/libavcodec/arm/h264dsp_neon.S
+++ b/libavcodec/arm/h264dsp_neon.S
@@ -237,6 +237,7 @@
         h264_loop_filter_start
 
         sub             r0,  r0,  #2
+h_loop_filter_chroma420:
         vld1.32         {d18[0]}, [r0], r1
         vld1.32         {d16[0]}, [r0], r1
         vld1.32         {d0[0]},  [r0], r1
@@ -271,6 +272,24 @@
         bx              lr
 endfunc
 
+function ff_h264_h_loop_filter_chroma422_neon, export=1
+        h264_loop_filter_start
+        push            {r4, lr}
+        add             r4,  r0,  r1
+        add             r1,  r1,  r1
+        sub             r0,  r0,  #2
+
+        bl              h_loop_filter_chroma420
+
+        ldr             r12, [sp, #8]
+        ldr             r12, [r12]
+        vmov.32         d24[0], r12
+        sub             r0,  r4,  #2
+
+        bl              h_loop_filter_chroma420
+        pop             {r4, pc}
+endfunc
+
 @ Biweighted prediction
 
 .macro  biweight_16     macs, macd
diff --git a/libavcodec/arm/hevcdsp_sao_neon.S b/libavcodec/arm/hevcdsp_sao_neon.S
index 3471679..8fd9d1e 100644
--- a/libavcodec/arm/hevcdsp_sao_neon.S
+++ b/libavcodec/arm/hevcdsp_sao_neon.S
@@ -35,10 +35,10 @@
         vmov.u16    q15,  #1
         vmov.u8     q14,  #32
 0:      pld      [r1]
-        vld1.8   {d16},  [r1], r3
         cmp      r5,    #4
         beq      4f
 8:      subs     r4,    #1
+        vld1.8   {d16},  [r1], r3
         vshr.u8  d17,   d16,  #3   // index = [src>>3]
         vshll.u8 q9,    d17,  #1   // lowIndex = 2*index
         vadd.u16 q11,   q9,   q15  // highIndex = (2*index+1) << 8
@@ -54,7 +54,6 @@
         vaddw.u8 q13,   q12,       d16
         vqmovun.s16      d8,         q13
         vst1.8    d8,   [r0],      r2
-        vld1.8   {d16}, [r1],      r3
         bne      8b
         subs     r5,    #8
         beq      99f
@@ -65,6 +64,7 @@
         mov r1, r7
         b        0b
 4:      subs     r4,    #1
+        vld1.32   {d16[0]},  [r1],  r3
         vshr.u8  d17,   d16,  #3  // src>>3
         vshll.u8 q9,    d17,  #1   // lowIndex = 2*index
         vadd.u16 q11,   q9,   q15  // highIndex = (2*index+1) << 8
@@ -80,7 +80,6 @@
         vaddw.u8 q13,   q12,       d16
         vqmovun.s16     d14,       q13
         vst1.32   d14[0],    [r0],     r2
-        vld1.32   {d16[0]},  [r1],     r3
         bne      4b
         b        99f
 99:
@@ -110,12 +109,12 @@
         mov      r11,    r1
         add      r11,    r9           // src[x + b_stride]
         pld      [r1]
-        vld1.8   {d16},  [r1],  r3    // src[x]  8x8bit
-        vld1.8   {d17},  [r10], r3    // src[x + a_stride]
-        vld1.8   {d18},  [r11], r3    // src[x + b_stride]
         cmp      r5,     #4
         beq      4f
 8:      subs     r4,     #1
+        vld1.8   {d16},  [r1],  r3    // src[x]  8x8bit
+        vld1.8   {d17},  [r10], r3    // src[x + a_stride]
+        vld1.8   {d18},  [r11], r3    // src[x + b_stride]
         vcgt.u8  d8,     d16,   d17
         vshr.u8  d9,     d8,    #7
         vclt.u8  d8,     d16,   d17
@@ -136,9 +135,6 @@
         vaddw.u8 q12,    q11,   d16
         vqmovun.s16      d26,   q12
         vst1.8   d26,    [r0],  r2
-        vld1.8   {d16},  [r1],  r3    // src[x]  8x8bit
-        vld1.8   {d17},  [r10], r3    // src[x + a_stride]
-        vld1.8   {d18},  [r11], r3    // src[x + b_stride]
         bne      8b
         subs     r5,     #8
         beq      99f
@@ -149,6 +145,9 @@
         mov      r1,     r7
         b        0b
 4:      subs     r4,    #1
+        vld1.32   {d16[0]},  [r1],  r3
+        vld1.32   {d17[0]},  [r10], r3    // src[x + a_stride]
+        vld1.32   {d18[0]},  [r11], r3    // src[x + b_stride]
         vcgt.u8  d8,     d16,   d17
         vshr.u8  d9,     d8,    #7
         vclt.u8  d8,     d16,   d17
@@ -169,9 +168,6 @@
         vaddw.u8 q12,    q11,   d16
         vqmovun.s16      d26,   q12
         vst1.32  d26[0], [r0],  r2
-        vld1.32   {d16[0]},  [r1],  r3
-        vld1.32   {d17[0]},  [r10], r3    // src[x + a_stride]
-        vld1.32   {d18[0]},  [r11], r3    // src[x + b_stride]
         bne      4b
         b        99f
 99:
diff --git a/libavcodec/arm/vp8dsp_neon.S b/libavcodec/arm/vp8dsp_neon.S
index fcb4248..7cedfc2 100644
--- a/libavcodec/arm/vp8dsp_neon.S
+++ b/libavcodec/arm/vp8dsp_neon.S
@@ -773,23 +773,6 @@
         vqrshrun.s16    \d1, q14, #7
 .endm
 
-.macro  vp8_epel8_v6    d0,  s0,  s1,  s2,  s3,  s4,  s5
-        vmovl.u8        q10, \s2
-        vmovl.u8        q11, \s3
-        vmovl.u8        q9,  \s1
-        vmovl.u8        q12, \s4
-        vmovl.u8        q8,  \s0
-        vmovl.u8        q13, \s5
-        vmul.u16        q10, q10, d0[2]
-        vmul.u16        q11, q11, d0[3]
-        vmls.u16        q10, q9,  d0[1]
-        vmls.u16        q11, q12, d1[0]
-        vmla.u16        q10, q8,  d0[0]
-        vmla.u16        q11, q13, d1[1]
-        vqadd.s16       q11, q10, q11
-        vqrshrun.s16    \d0, q11, #7
-.endm
-
 .macro  vp8_epel8_v6_y2 d0, d1, s0, s1, s2, s3, s4, s5, s6
         vmovl.u8        q10, \s0
         vmovl.u8        q11, \s3
@@ -909,12 +892,12 @@
         sub             r2,  r2,  r3,  lsl #1
         sub             r2,  r2,  #2
         push            {r4,lr}
-        vpush           {d8-d9}
+        vpush           {d8-d15}
 
         @ first pass (horizontal):
-        ldr             r4,  [sp, #28]          @ mx
+        ldr             r4,  [sp, #64+8+4]          @ mx
         movrel          lr,  subpel_filters-16
-        ldr             r12, [sp, #24]          @ h
+        ldr             r12, [sp, #64+8+0]          @ h
         add             r4,  lr,  r4, lsl #4
         sub             sp,  sp,  #336+16
         vld1.16         {q0},     [r4,:128]
@@ -931,9 +914,9 @@
         bne             1b
 
         @ second pass (vertical):
-        ldr             r4,  [sp, #336+16+32]   @ my
+        ldr             r4,  [sp, #336+16+64+8+8]   @ my
         movrel          lr,  subpel_filters-16
-        ldr             r12, [sp, #336+16+24]   @ h
+        ldr             r12, [sp, #336+16+64+8+0]   @ h
         add             r4,  lr,  r4, lsl #4
         add             lr,  sp,  #15
         vld1.16         {q0},     [r4,:128]
@@ -941,18 +924,20 @@
 2:
         vld1.8          {d2-d5},  [lr,:128]!
         vld1.8          {d6-d9},  [lr,:128]!
-        vld1.8          {d28-d31},[lr,:128]
-        sub             lr,  lr,  #48
+        vld1.8          {d10-d13},[lr,:128]!
+        vld1.8          {d14-d15},[lr,:128]
+        sub             lr,  lr,  #64
 
-        vp8_epel8_v6    d2, d2, d4, d6, d8, d28, d30
-        vp8_epel8_v6    d3, d3, d5, d7, d9, d29, d31
+        vp8_epel8_v6_y2 d2,  d4,  d2,  d4,  d6,  d8,  d10, d12, d14
+        vp8_epel8_v6_y2 d3,  d5,  d3,  d5,  d7,  d9,  d11, d13, d15
 
         vst1.8          {d2-d3}, [r0,:128], r1
-        subs            r12, r12, #1
+        vst1.8          {d4-d5}, [r0,:128], r1
+        subs            r12, r12, #2
         bne             2b
 
         add             sp,  sp,  #336+16
-        vpop            {d8-d9}
+        vpop            {d8-d15}
         pop             {r4,pc}
 endfunc
 
diff --git a/libavcodec/ass.c b/libavcodec/ass.c
index b4f081c..7c26e3f 100644
--- a/libavcodec/ass.c
+++ b/libavcodec/ass.c
@@ -26,11 +26,13 @@
 #include "libavutil/bprint.h"
 #include "libavutil/common.h"
 
-int ff_ass_subtitle_header(AVCodecContext *avctx,
-                           const char *font, int font_size,
-                           int color, int back_color,
-                           int bold, int italic, int underline,
-                           int border_style, int alignment)
+int ff_ass_subtitle_header_full(AVCodecContext *avctx,
+                                int play_res_x, int play_res_y,
+                                const char *font, int font_size,
+                                int primary_color, int secondary_color,
+                                int outline_color, int back_color,
+                                int bold, int italic, int underline,
+                                int border_style, int alignment)
 {
     avctx->subtitle_header = av_asprintf(
              "[Script Info]\r\n"
@@ -67,8 +69,8 @@
              "[Events]\r\n"
              "Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text\r\n",
              !(avctx->flags & AV_CODEC_FLAG_BITEXACT) ? AV_STRINGIFY(LIBAVCODEC_VERSION) : "",
-             ASS_DEFAULT_PLAYRESX, ASS_DEFAULT_PLAYRESY,
-             font, font_size, color, color, back_color, back_color,
+             play_res_x, play_res_y, font, font_size,
+             primary_color, secondary_color, outline_color, back_color,
              -bold, -italic, -underline, border_style, alignment);
 
     if (!avctx->subtitle_header)
@@ -77,6 +79,20 @@
     return 0;
 }
 
+int ff_ass_subtitle_header(AVCodecContext *avctx,
+                           const char *font, int font_size,
+                           int color, int back_color,
+                           int bold, int italic, int underline,
+                           int border_style, int alignment)
+{
+    return ff_ass_subtitle_header_full(avctx,
+                               ASS_DEFAULT_PLAYRESX, ASS_DEFAULT_PLAYRESY,
+                               font, font_size, color, color,
+                               back_color, back_color,
+                               bold, italic, underline,
+                               border_style, alignment);
+}
+
 int ff_ass_subtitle_header_default(AVCodecContext *avctx)
 {
     return ff_ass_subtitle_header(avctx, ASS_DEFAULT_FONT,
@@ -105,7 +121,7 @@
     char *ass_str;
     AVSubtitleRect **rects;
 
-    rects = av_realloc_array(sub->rects, (sub->num_rects+1), sizeof(*sub->rects));
+    rects = av_realloc_array(sub->rects, sub->num_rects+1, sizeof(*sub->rects));
     if (!rects)
         return AVERROR(ENOMEM);
     sub->rects = rects;
diff --git a/libavcodec/ass.h b/libavcodec/ass.h
index 314b43b..2c260e4 100644
--- a/libavcodec/ass.h
+++ b/libavcodec/ass.h
@@ -49,6 +49,34 @@
 
 /**
  * Generate a suitable AVCodecContext.subtitle_header for SUBTITLE_ASS.
+ * Can specify all fields explicitly
+ *
+ * @param avctx pointer to the AVCodecContext
+ * @param play_res_x subtitle frame width
+ * @param play_res_y subtitle frame height
+ * @param font name of the default font face to use
+ * @param font_size default font size to use
+ * @param primary_color default text color to use (ABGR)
+ * @param secondary_color default secondary text color to use (ABGR)
+ * @param outline_color default outline color to use (ABGR)
+ * @param back_color default background color to use (ABGR)
+ * @param bold 1 for bold text, 0 for normal text
+ * @param italic 1 for italic text, 0 for normal text
+ * @param underline 1 for underline text, 0 for normal text
+ * @param border_style 1 for outline, 3 for opaque box
+ * @param alignment position of the text (left, center, top...), defined after
+ *                  the layout of the numpad (1-3 sub, 4-6 mid, 7-9 top)
+ * @return >= 0 on success otherwise an error code <0
+ */
+int ff_ass_subtitle_header_full(AVCodecContext *avctx,
+                                int play_res_x, int play_res_y,
+                                const char *font, int font_size,
+                                int primary_color, int secondary_color,
+                                int outline_color, int back_color,
+                                int bold, int italic, int underline,
+                                int border_style, int alignment);
+/**
+ * Generate a suitable AVCodecContext.subtitle_header for SUBTITLE_ASS.
  *
  * @param avctx pointer to the AVCodecContext
  * @param font name of the default font face to use
diff --git a/libavcodec/ass_split.c b/libavcodec/ass_split.c
index 872528b..c2c388d 100644
--- a/libavcodec/ass_split.c
+++ b/libavcodec/ass_split.c
@@ -249,7 +249,7 @@
     const ASSSection *section = &ass_sections[ctx->current_section];
     int *number = &ctx->field_number[ctx->current_section];
     int *order = ctx->field_order[ctx->current_section];
-    int *tmp, i, len;
+    int i, len;
 
     while (buf && *buf) {
         if (buf[0] == '[') {
@@ -280,9 +280,9 @@
                 while (!is_eol(*buf)) {
                     buf = skip_space(buf);
                     len = strcspn(buf, ", \r\n");
-                    if (!(tmp = av_realloc_array(order, (*number + 1), sizeof(*order))))
+                    if (av_reallocp_array(&order, (*number + 1), sizeof(*order)) != 0)
                         return NULL;
-                    order = tmp;
+
                     order[*number] = -1;
                     for (i=0; section->fields[i].name; i++)
                         if (!strncmp(buf, section->fields[i].name, len)) {
@@ -376,6 +376,8 @@
     ASSSplitContext *ctx = av_mallocz(sizeof(*ctx));
     if (!ctx)
         return NULL;
+    if (buf && !memcmp(buf, "\xef\xbb\xbf", 3)) // Skip UTF-8 BOM header
+        buf += 3;
     ctx->current_section = -1;
     if (ass_split(ctx, buf) < 0) {
         ff_ass_split_free(ctx);
diff --git a/libavcodec/assdec.c b/libavcodec/assdec.c
index 3178f29..f0b1069 100644
--- a/libavcodec/assdec.c
+++ b/libavcodec/assdec.c
@@ -31,7 +31,8 @@
     avctx->subtitle_header = av_malloc(avctx->extradata_size + 1);
     if (!avctx->subtitle_header)
         return AVERROR(ENOMEM);
-    memcpy(avctx->subtitle_header, avctx->extradata, avctx->extradata_size);
+    if (avctx->extradata_size)
+        memcpy(avctx->subtitle_header, avctx->extradata, avctx->extradata_size);
     avctx->subtitle_header[avctx->extradata_size] = 0;
     avctx->subtitle_header_size = avctx->extradata_size;
     return 0;
diff --git a/libavcodec/assenc.c b/libavcodec/assenc.c
index dc4f0ff..a6e1d5d 100644
--- a/libavcodec/assenc.c
+++ b/libavcodec/assenc.c
@@ -57,7 +57,7 @@
 
         if (sub->rects[i]->type != SUBTITLE_ASS) {
             av_log(avctx, AV_LOG_ERROR, "Only SUBTITLE_ASS type supported.\n");
-            return -1;
+            return AVERROR(EINVAL);
         }
 
 #if FF_API_ASS_TIMING
@@ -93,7 +93,7 @@
 
         if (len > bufsize-total_len-1) {
             av_log(avctx, AV_LOG_ERROR, "Buffer too small for ASS event.\n");
-            return -1;
+            return AVERROR_BUFFER_TOO_SMALL;
         }
 
         total_len += len;
diff --git a/libavcodec/asvenc.c b/libavcodec/asvenc.c
index c4eca2a..3cc94bf 100644
--- a/libavcodec/asvenc.c
+++ b/libavcodec/asvenc.c
@@ -173,10 +173,7 @@
 {
     int i;
 
-    if (a->pb.buf_end - a->pb.buf - (put_bits_count(&a->pb) >> 3) < MAX_MB_SIZE) {
-        av_log(a->avctx, AV_LOG_ERROR, "encoded frame too large\n");
-        return -1;
-    }
+    av_assert0(a->pb.buf_end - a->pb.buf - (put_bits_count(&a->pb) >> 3) >= MAX_MB_SIZE);
 
     if (a->avctx->codec_id == AV_CODEC_ID_ASV1) {
         for (i = 0; i < 6; i++)
diff --git a/libavcodec/atrac3.c b/libavcodec/atrac3.c
index 6cdcdf1..067aa23 100644
--- a/libavcodec/atrac3.c
+++ b/libavcodec/atrac3.c
@@ -964,7 +964,7 @@
         return AVERROR_INVALIDDATA;
     }
 
-    if (avctx->block_align >= UINT_MAX / 2)
+    if (avctx->block_align > 1024 || avctx->block_align <= 0)
         return AVERROR(EINVAL);
 
     q->decoded_bytes_buffer = av_mallocz(FFALIGN(avctx->block_align, 4) +
diff --git a/libavcodec/atrac3plus.c b/libavcodec/atrac3plus.c
index 3e3bba8..8d17889 100644
--- a/libavcodec/atrac3plus.c
+++ b/libavcodec/atrac3plus.c
@@ -81,8 +81,8 @@
 {
     int i, wl_vlc_offs, ct_vlc_offs, sf_vlc_offs, tab_offset;
 
-    static const int wl_nb_bits[4]  = { 2, 3, 5, 5 };
-    static const int wl_nb_codes[4] = { 3, 5, 8, 8 };
+    static const uint8_t wl_nb_bits[4]  = { 2, 3, 5, 5 };
+    static const uint8_t wl_nb_codes[4] = { 3, 5, 8, 8 };
     static const uint8_t * const wl_bits[4] = {
         atrac3p_wl_huff_bits1, atrac3p_wl_huff_bits2,
         atrac3p_wl_huff_bits3, atrac3p_wl_huff_bits4
@@ -95,8 +95,8 @@
         atrac3p_wl_huff_xlat1, atrac3p_wl_huff_xlat2, NULL, NULL
     };
 
-    static const int ct_nb_bits[4]  = { 3, 4, 4, 4 };
-    static const int ct_nb_codes[4] = { 4, 8, 8, 8 };
+    static const uint8_t ct_nb_bits[4]  = { 3, 4, 4, 4 };
+    static const uint8_t ct_nb_codes[4] = { 4, 8, 8, 8 };
     static const uint8_t * const ct_bits[4]  = {
         atrac3p_ct_huff_bits1, atrac3p_ct_huff_bits2,
         atrac3p_ct_huff_bits2, atrac3p_ct_huff_bits3
@@ -109,8 +109,8 @@
         NULL, NULL, atrac3p_ct_huff_xlat1, NULL
     };
 
-    static const int sf_nb_bits[8]  = {  9,  9,  9,  9,  6,  6,  7,  7 };
-    static const int sf_nb_codes[8] = { 64, 64, 64, 64, 16, 16, 16, 16 };
+    static const uint8_t sf_nb_bits[8]  = {  9,  9,  9,  9,  6,  6,  7,  7 };
+    static const uint8_t sf_nb_codes[8] = { 64, 64, 64, 64, 16, 16, 16, 16 };
     static const uint8_t  * const sf_bits[8]  = {
         atrac3p_sf_huff_bits1, atrac3p_sf_huff_bits1, atrac3p_sf_huff_bits2,
         atrac3p_sf_huff_bits3, atrac3p_sf_huff_bits4, atrac3p_sf_huff_bits4,
@@ -456,6 +456,10 @@
     } else if (chan->fill_mode == 3) {
         pos = ch_num ? chan->num_coded_vals + chan->split_point
                      : ctx->num_quant_units - chan->split_point;
+        if (pos > FF_ARRAY_ELEMS(chan->qu_wordlen)) {
+            av_log(avctx, AV_LOG_ERROR, "Split point beyond array\n");
+            pos = FF_ARRAY_ELEMS(chan->qu_wordlen);
+        }
         for (i = chan->num_coded_vals; i < pos; i++)
             chan->qu_wordlen[i] = 1;
     }
diff --git a/libavcodec/atrac3plusdec.c b/libavcodec/atrac3plusdec.c
index 666d1a5..4b008ba 100644
--- a/libavcodec/atrac3plusdec.c
+++ b/libavcodec/atrac3plusdec.c
@@ -174,7 +174,6 @@
     ctx->fdsp = avpriv_float_dsp_alloc(avctx->flags & AV_CODEC_FLAG_BITEXACT);
 
     if (!ctx->ch_units || !ctx->fdsp) {
-        atrac3p_decode_close(avctx);
         return AVERROR(ENOMEM);
     }
 
@@ -393,6 +392,7 @@
     .type           = AVMEDIA_TYPE_AUDIO,
     .id             = AV_CODEC_ID_ATRAC3P,
     .capabilities   = AV_CODEC_CAP_DR1,
+    .caps_internal  = FF_CODEC_CAP_INIT_CLEANUP,
     .priv_data_size = sizeof(ATRAC3PContext),
     .init           = atrac3p_decode_init,
     .close          = atrac3p_decode_close,
@@ -405,6 +405,7 @@
     .type           = AVMEDIA_TYPE_AUDIO,
     .id             = AV_CODEC_ID_ATRAC3PAL,
     .capabilities   = AV_CODEC_CAP_DR1,
+    .caps_internal  = FF_CODEC_CAP_INIT_CLEANUP,
     .priv_data_size = sizeof(ATRAC3PContext),
     .init           = atrac3p_decode_init,
     .close          = atrac3p_decode_close,
diff --git a/libavcodec/atrac3plusdsp.c b/libavcodec/atrac3plusdsp.c
index 96aa402..ca3154e 100644
--- a/libavcodec/atrac3plusdsp.c
+++ b/libavcodec/atrac3plusdsp.c
@@ -248,7 +248,7 @@
         out[i] += wavreg1[i] + wavreg2[i];
 }
 
-static const int subband_to_powgrp[ATRAC3P_SUBBANDS] = {
+static const uint8_t subband_to_powgrp[ATRAC3P_SUBBANDS] = {
     0, 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4
 };
 
@@ -411,7 +411,7 @@
 };
 
 /** Map subband number to quant unit number. */
-static const int subband_to_qu[17] = {
+static const uint8_t subband_to_qu[17] = {
     0, 8, 12, 16, 18, 20, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32
 };
 
diff --git a/libavcodec/atrac9dec.c b/libavcodec/atrac9dec.c
index 805d46f..075d610 100644
--- a/libavcodec/atrac9dec.c
+++ b/libavcodec/atrac9dec.c
@@ -71,6 +71,8 @@
     int cpe_base_channel;
     int is_signs[30];
 
+    int reuseable;
+
 } ATRAC9BlockData;
 
 typedef struct ATRAC9Context {
@@ -119,10 +121,7 @@
     }
     b->grad_boundary = get_bits(gb, 4);
 
-    if (grad_range[0] >= grad_range[1] || grad_range[1] > 47)
-        return AVERROR_INVALIDDATA;
-
-    if (grad_value[0] > 31 || grad_value[1] > 31)
+    if (grad_range[0] >= grad_range[1] || grad_range[1] > 31)
         return AVERROR_INVALIDDATA;
 
     if (b->grad_boundary > b->q_unit_cnt)
@@ -188,7 +187,7 @@
     for (int i = 0; i < b->q_unit_cnt; i++) {
         c->precision_fine[i] = 0;
         if (c->precision_coarse[i] > 15) {
-            c->precision_fine[i] = c->precision_coarse[i] - 15;
+            c->precision_fine[i] = FFMIN(c->precision_coarse[i], 30) - 15;
             c->precision_coarse[i] = 15;
         }
     }
@@ -200,6 +199,8 @@
     int ext_band = 0;
 
     if (b->has_band_ext) {
+        if (b->q_unit_cnt < 13 || b->q_unit_cnt > 20)
+            return AVERROR_INVALIDDATA;
         ext_band = at9_tab_band_ext_group[b->q_unit_cnt - 13][2];
         if (stereo) {
             b->channel[1].band_ext = get_bits(gb, 2);
@@ -222,8 +223,18 @@
     b->channel[0].band_ext = get_bits(gb, 2);
     b->channel[0].band_ext = ext_band > 2 ? b->channel[0].band_ext : 4;
 
-    if (!get_bits(gb, 5))
+    if (!get_bits(gb, 5)) {
+        for (int i = 0; i <= stereo; i++) {
+            ATRAC9ChannelData *c = &b->channel[i];
+            const int count = at9_tab_band_ext_cnt[c->band_ext][ext_band];
+            for (int j = 0; j < count; j++) {
+                int len = at9_tab_band_ext_lengths[c->band_ext][ext_band][j];
+                c->band_ext_data[j] = av_clip_uintp2_c(c->band_ext_data[j], len);
+            }
+        }
+
         return 0;
+    }
 
     for (int i = 0; i <= stereo; i++) {
         ATRAC9ChannelData *c = &b->channel[i];
@@ -241,7 +252,7 @@
                                     ATRAC9ChannelData *c, GetBitContext *gb,
                                     int channel_idx, int first_in_pkt)
 {
-    static const int mode_map[2][4] = { { 0, 1, 2, 3 }, { 0, 2, 3, 4 } };
+    static const uint8_t mode_map[2][4] = { { 0, 1, 2, 3 }, { 0, 2, 3, 4 } };
     const int mode = mode_map[channel_idx][get_bits(gb, 2)];
 
     memset(c->scalefactors, 0, sizeof(c->scalefactors));
@@ -535,9 +546,6 @@
         at9_q_unit_to_coeff_idx[g_units[3]],
     };
 
-    if (!b->has_band_ext || !b->has_band_ext_data)
-        return;
-
     for (int ch = 0; ch <= stereo; ch++) {
         ATRAC9ChannelData *c = &b->channel[ch];
 
@@ -668,6 +676,7 @@
     if (!reuse_params) {
         int stereo_band, ext_band;
         const int min_band_count = s->samplerate_idx > 7 ? 1 : 3;
+        b->reuseable = 0;
         b->band_count = get_bits(gb, 4) + min_band_count;
         b->q_unit_cnt = at9_tab_band_q_unit_map[b->band_count];
 
@@ -699,6 +708,11 @@
             }
             b->band_ext_q_unit = at9_tab_band_q_unit_map[ext_band];
         }
+        b->reuseable = 1;
+    }
+    if (!b->reuseable) {
+        av_log(s->avctx, AV_LOG_ERROR, "invalid block reused!\n");
+        return AVERROR_INVALIDDATA;
     }
 
     /* Calculate bit alloc gradient */
@@ -741,7 +755,9 @@
 
     apply_intensity_stereo(s, b, stereo);
     apply_scalefactors    (s, b, stereo);
-    apply_band_extension  (s, b, stereo);
+
+    if (b->has_band_ext && b->has_band_ext_data)
+        apply_band_extension  (s, b, stereo);
 
 imdct:
     for (int i = 0; i <= stereo; i++) {
@@ -833,6 +849,11 @@
 
     av_lfg_init(&s->lfg, 0xFBADF00D);
 
+    if (avctx->block_align <= 0) {
+        av_log(avctx, AV_LOG_ERROR, "Invalid block align\n");
+        return AVERROR_INVALIDDATA;
+    }
+
     if (avctx->extradata_size != 12) {
         av_log(avctx, AV_LOG_ERROR, "Invalid extradata length!\n");
         return AVERROR_INVALIDDATA;
@@ -862,6 +883,7 @@
     s->block_config = &at9_block_layout[block_config_idx];
 
     avctx->channel_layout = s->block_config->channel_layout;
+    avctx->channels       = av_get_channel_layout_nb_channels(avctx->channel_layout);
     avctx->sample_fmt     = AV_SAMPLE_FMT_FLTP;
 
     if (get_bits1(&gb)) {
diff --git a/libavcodec/atrac9tab.h b/libavcodec/atrac9tab.h
index d25c6f1..8f290f1 100644
--- a/libavcodec/atrac9tab.h
+++ b/libavcodec/atrac9tab.h
@@ -41,61 +41,48 @@
 
 static const ATRAC9BlockConfig at9_block_layout[] = {
     { /* Mono */
-        AV_CH_LAYOUT_MONO,
-        {
-            ATRAC9_BLOCK_TYPE_SCE,
-        },
-        { { 0 }, },
-        1,
+        .channel_layout  = AV_CH_LAYOUT_MONO,
+        .type            = { ATRAC9_BLOCK_TYPE_SCE, },
+        .count           = 1,
     },
     { /* Dual Mono */
-        AV_CH_LAYOUT_STEREO,
-        {
-            ATRAC9_BLOCK_TYPE_SCE,
-            ATRAC9_BLOCK_TYPE_SCE,
-        },
-        { { 0 }, { 1 }, },
-        2,
+        .channel_layout  = AV_CH_LAYOUT_STEREO,
+        .type            = { ATRAC9_BLOCK_TYPE_SCE,
+                             ATRAC9_BLOCK_TYPE_SCE, },
+        .plane_map       = { { 0 }, { 1 }, },
+        .count           = 2,
     },
     { /* Stereo */
-        AV_CH_LAYOUT_STEREO,
-        {
-            ATRAC9_BLOCK_TYPE_CPE,
-        },
-        { { 0, 1 }, },
-        1,
+        .channel_layout  = AV_CH_LAYOUT_STEREO,
+        .type            = { ATRAC9_BLOCK_TYPE_CPE, },
+        .plane_map       = { { 0, 1 }, },
+        .count           = 1,
     },
     { /* 5.1 */
-        AV_CH_LAYOUT_5POINT1,
-        {
-            ATRAC9_BLOCK_TYPE_CPE,
-            ATRAC9_BLOCK_TYPE_SCE,
-            ATRAC9_BLOCK_TYPE_LFE,
-            ATRAC9_BLOCK_TYPE_CPE,
-        },
-        { { 0, 1 }, { 2 }, { 3 }, { 4, 5 }, },
-        4,
+        .channel_layout  = AV_CH_LAYOUT_5POINT1,
+        .type            = { ATRAC9_BLOCK_TYPE_CPE,
+                             ATRAC9_BLOCK_TYPE_SCE,
+                             ATRAC9_BLOCK_TYPE_LFE,
+                             ATRAC9_BLOCK_TYPE_CPE, },
+        .plane_map       = { { 0, 1 }, { 2 }, { 3 }, { 4, 5 }, },
+        .count           = 4,
     },
-    { /* 5.1 */
-        AV_CH_LAYOUT_7POINT1,
-        {
-            ATRAC9_BLOCK_TYPE_CPE,
-            ATRAC9_BLOCK_TYPE_SCE,
-            ATRAC9_BLOCK_TYPE_LFE,
-            ATRAC9_BLOCK_TYPE_CPE,
-            ATRAC9_BLOCK_TYPE_CPE,
-        },
-        { { 0, 1 }, { 2 }, { 3 }, { 4, 5 }, { 6, 7 }, },
-        5,
+    { /* 7.1 */
+        .channel_layout  = AV_CH_LAYOUT_7POINT1,
+        .type            = { ATRAC9_BLOCK_TYPE_CPE,
+                             ATRAC9_BLOCK_TYPE_SCE,
+                             ATRAC9_BLOCK_TYPE_LFE,
+                             ATRAC9_BLOCK_TYPE_CPE,
+                             ATRAC9_BLOCK_TYPE_CPE, },
+        .plane_map       = { { 0, 1 }, { 2 }, { 3 }, { 4, 5 }, { 6, 7 }, },
+        .count           = 5,
     },
     { /* Quad */
-        AV_CH_LAYOUT_QUAD,
-        {
-            ATRAC9_BLOCK_TYPE_CPE,
-            ATRAC9_BLOCK_TYPE_CPE,
-        },
-        { { 0, 1 }, { 2, 3 }, },
-        2,
+        .channel_layout  = AV_CH_LAYOUT_QUAD,
+        .type            = { ATRAC9_BLOCK_TYPE_CPE,
+                             ATRAC9_BLOCK_TYPE_CPE, },
+        .plane_map       = { { 0, 1 }, { 2, 3 }, },
+        .count           = 2,
     },
 };
 
diff --git a/libavcodec/audiodsp.c b/libavcodec/audiodsp.c
index 3c7a3a7..efcb0a8 100644
--- a/libavcodec/audiodsp.c
+++ b/libavcodec/audiodsp.c
@@ -79,7 +79,7 @@
 static int32_t scalarproduct_int16_c(const int16_t *v1, const int16_t *v2,
                                      int order)
 {
-    int res = 0;
+    unsigned res = 0;
 
     while (order--)
         res += *v1++ **v2++;
diff --git a/libavcodec/audiotoolboxenc.c b/libavcodec/audiotoolboxenc.c
index 2c18916..27632de 100644
--- a/libavcodec/audiotoolboxenc.c
+++ b/libavcodec/audiotoolboxenc.c
@@ -627,7 +627,8 @@
         .encode2        = ffat_encode, \
         .flush          = ffat_encode_flush, \
         .priv_class     = &ffat_##NAME##_enc_class, \
-        .capabilities   = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY __VA_ARGS__, \
+        .capabilities   = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY | \
+                          AV_CODEC_CAP_ENCODER_FLUSH __VA_ARGS__, \
         .sample_fmts    = (const enum AVSampleFormat[]) { \
             AV_SAMPLE_FMT_S16, \
             AV_SAMPLE_FMT_U8,  AV_SAMPLE_FMT_NONE \
diff --git a/libavcodec/av1.h b/libavcodec/av1.h
index f2ec39c..6c0e324 100644
--- a/libavcodec/av1.h
+++ b/libavcodec/av1.h
@@ -127,4 +127,37 @@
     AV1_CSP_COLOCATED = 2, // -> AVCHROMA_LOC_TOPLEFT.
 };
 
+// Scalability modes (section 6.7.5)
+enum {
+    AV1_SCALABILITY_L1T2 = 0,
+    AV1_SCALABILITY_L1T3 = 1,
+    AV1_SCALABILITY_L2T1 = 2,
+    AV1_SCALABILITY_L2T2 = 3,
+    AV1_SCALABILITY_L2T3 = 4,
+    AV1_SCALABILITY_S2T1 = 5,
+    AV1_SCALABILITY_S2T2 = 6,
+    AV1_SCALABILITY_S2T3 = 7,
+    AV1_SCALABILITY_L2T1h = 8,
+    AV1_SCALABILITY_L2T2h = 9,
+    AV1_SCALABILITY_L2T3h = 10,
+    AV1_SCALABILITY_S2T1h = 11,
+    AV1_SCALABILITY_S2T2h = 12,
+    AV1_SCALABILITY_S2T3h = 13,
+    AV1_SCALABILITY_SS = 14,
+    AV1_SCALABILITY_L3T1 = 15,
+    AV1_SCALABILITY_L3T2 = 16,
+    AV1_SCALABILITY_L3T3 = 17,
+    AV1_SCALABILITY_S3T1 = 18,
+    AV1_SCALABILITY_S3T2 = 19,
+    AV1_SCALABILITY_S3T3 = 20,
+    AV1_SCALABILITY_L3T2_KEY = 21,
+    AV1_SCALABILITY_L3T3_KEY = 22,
+    AV1_SCALABILITY_L4T5_KEY = 23,
+    AV1_SCALABILITY_L4T7_KEY = 24,
+    AV1_SCALABILITY_L3T2_KEY_SHIFT = 25,
+    AV1_SCALABILITY_L3T3_KEY_SHIFT = 26,
+    AV1_SCALABILITY_L4T5_KEY_SHIFT = 27,
+    AV1_SCALABILITY_L4T7_KEY_SHIFT = 28,
+};
+
 #endif /* AVCODEC_AV1_H */
diff --git a/libavcodec/av1_frame_merge_bsf.c b/libavcodec/av1_frame_merge_bsf.c
new file mode 100644
index 0000000..4939711
--- /dev/null
+++ b/libavcodec/av1_frame_merge_bsf.c
@@ -0,0 +1,155 @@
+/*
+ * Copyright (c) 2019 James Almer <jamrial@gmail.com>
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "avcodec.h"
+#include "bsf.h"
+#include "cbs.h"
+#include "cbs_av1.h"
+
+typedef struct AV1FMergeContext {
+    CodedBitstreamContext *cbc;
+    CodedBitstreamFragment frag[2];
+    AVPacket *pkt, *in;
+    int idx;
+} AV1FMergeContext;
+
+static void av1_frame_merge_flush(AVBSFContext *bsf)
+{
+    AV1FMergeContext *ctx = bsf->priv_data;
+
+    ff_cbs_fragment_reset(ctx->cbc, &ctx->frag[0]);
+    ff_cbs_fragment_reset(ctx->cbc, &ctx->frag[1]);
+    av_packet_unref(ctx->in);
+    av_packet_unref(ctx->pkt);
+}
+
+static int av1_frame_merge_filter(AVBSFContext *bsf, AVPacket *out)
+{
+    AV1FMergeContext *ctx = bsf->priv_data;
+    CodedBitstreamFragment *frag = &ctx->frag[ctx->idx], *tu = &ctx->frag[!ctx->idx];
+    AVPacket *in = ctx->in, *buffer_pkt = ctx->pkt;
+    int err, i;
+
+    err = ff_bsf_get_packet_ref(bsf, in);
+    if (err < 0) {
+        if (err == AVERROR_EOF && tu->nb_units > 0)
+            goto eof;
+        return err;
+    }
+
+    err = ff_cbs_read_packet(ctx->cbc, frag, in);
+    if (err < 0) {
+        av_log(bsf, AV_LOG_ERROR, "Failed to read packet.\n");
+        goto fail;
+    }
+
+    if (frag->nb_units == 0) {
+        av_log(bsf, AV_LOG_ERROR, "No OBU in packet.\n");
+        err = AVERROR_INVALIDDATA;
+        goto fail;
+    }
+
+    if (tu->nb_units == 0 && frag->units[0].type != AV1_OBU_TEMPORAL_DELIMITER) {
+        av_log(bsf, AV_LOG_ERROR, "Missing Temporal Delimiter.\n");
+        err = AVERROR_INVALIDDATA;
+        goto fail;
+    }
+
+    for (i = 1; i < frag->nb_units; i++) {
+        if (frag->units[i].type == AV1_OBU_TEMPORAL_DELIMITER) {
+            av_log(bsf, AV_LOG_ERROR, "Temporal Delimiter in the middle of a packet.\n");
+            err = AVERROR_INVALIDDATA;
+            goto fail;
+        }
+    }
+
+    if (tu->nb_units > 0 && frag->units[0].type == AV1_OBU_TEMPORAL_DELIMITER) {
+eof:
+        err = ff_cbs_write_packet(ctx->cbc, buffer_pkt, tu);
+        if (err < 0) {
+            av_log(bsf, AV_LOG_ERROR, "Failed to write packet.\n");
+            goto fail;
+        }
+        av_packet_move_ref(out, buffer_pkt);
+
+        // Swap fragment index, to avoid copying fragment references.
+        ctx->idx = !ctx->idx;
+    } else {
+        for (i = 0; i < frag->nb_units; i++) {
+            err = ff_cbs_insert_unit_content(ctx->cbc, tu, -1, frag->units[i].type,
+                                             frag->units[i].content, frag->units[i].content_ref);
+            if (err < 0)
+                goto fail;
+        }
+
+        err = AVERROR(EAGAIN);
+    }
+
+    // Buffer packets with timestamps. There should be at most one per TU, be it split or not.
+    if (!buffer_pkt->data && in->pts != AV_NOPTS_VALUE)
+        av_packet_move_ref(buffer_pkt, in);
+    else
+        av_packet_unref(in);
+
+    ff_cbs_fragment_reset(ctx->cbc, &ctx->frag[ctx->idx]);
+
+fail:
+    if (err < 0 && err != AVERROR(EAGAIN))
+        av1_frame_merge_flush(bsf);
+
+    return err;
+}
+
+static int av1_frame_merge_init(AVBSFContext *bsf)
+{
+    AV1FMergeContext *ctx = bsf->priv_data;
+
+    ctx->in  = av_packet_alloc();
+    ctx->pkt = av_packet_alloc();
+    if (!ctx->in || !ctx->pkt)
+        return AVERROR(ENOMEM);
+
+    return ff_cbs_init(&ctx->cbc, AV_CODEC_ID_AV1, bsf);
+}
+
+static void av1_frame_merge_close(AVBSFContext *bsf)
+{
+    AV1FMergeContext *ctx = bsf->priv_data;
+
+    ff_cbs_fragment_free(ctx->cbc, &ctx->frag[0]);
+    ff_cbs_fragment_free(ctx->cbc, &ctx->frag[1]);
+    av_packet_free(&ctx->in);
+    av_packet_free(&ctx->pkt);
+    ff_cbs_close(&ctx->cbc);
+}
+
+static const enum AVCodecID av1_frame_merge_codec_ids[] = {
+    AV_CODEC_ID_AV1, AV_CODEC_ID_NONE,
+};
+
+const AVBitStreamFilter ff_av1_frame_merge_bsf = {
+    .name           = "av1_frame_merge",
+    .priv_data_size = sizeof(AV1FMergeContext),
+    .init           = av1_frame_merge_init,
+    .flush          = av1_frame_merge_flush,
+    .close          = av1_frame_merge_close,
+    .filter         = av1_frame_merge_filter,
+    .codec_ids      = av1_frame_merge_codec_ids,
+};
diff --git a/libavcodec/av1_frame_split_bsf.c b/libavcodec/av1_frame_split_bsf.c
new file mode 100644
index 0000000..a386c6e
--- /dev/null
+++ b/libavcodec/av1_frame_split_bsf.c
@@ -0,0 +1,261 @@
+/*
+ * Copyright (c) 2019 James Almer <jamrial@gmail.com>
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file
+ * This bitstream filter splits AV1 Temporal Units into packets containing
+ * just one frame, plus any leading and trailing OBUs that may be present at
+ * the beginning or end, respectively.
+ *
+ * Temporal Units already containing only one frame will be passed through
+ * unchanged. When splitting can't be performed, the Temporal Unit will be
+ * passed through containing only the remaining OBUs starting from the first
+ * one after the last successfully split frame.
+ */
+
+#include "libavutil/avassert.h"
+
+#include "avcodec.h"
+#include "bsf.h"
+#include "cbs.h"
+#include "cbs_av1.h"
+
+typedef struct AV1FSplitContext {
+    AVPacket *buffer_pkt;
+    CodedBitstreamContext *cbc;
+    CodedBitstreamFragment temporal_unit;
+
+    int nb_frames;
+    int cur_frame;
+    int cur_frame_idx;
+    int last_frame_idx;
+} AV1FSplitContext;
+
+static int av1_frame_split_filter(AVBSFContext *ctx, AVPacket *out)
+{
+    AV1FSplitContext *s = ctx->priv_data;
+    CodedBitstreamFragment *td = &s->temporal_unit;
+    int i, ret;
+    int split = !!s->buffer_pkt->data;
+
+    if (!s->buffer_pkt->data) {
+        int nb_frames = 0;
+
+        ret = ff_bsf_get_packet_ref(ctx, s->buffer_pkt);
+        if (ret < 0)
+            return ret;
+
+        ret = ff_cbs_read_packet(s->cbc, td, s->buffer_pkt);
+        if (ret < 0) {
+            av_log(ctx, AV_LOG_WARNING, "Failed to parse temporal unit.\n");
+            goto passthrough;
+        }
+
+        for (i = 0; i < td->nb_units; i++) {
+            CodedBitstreamUnit *unit = &td->units[i];
+
+            if (unit->type == AV1_OBU_FRAME ||
+                unit->type == AV1_OBU_FRAME_HEADER)
+                nb_frames++;
+            else if (unit->type == AV1_OBU_TILE_LIST) {
+                av_log(ctx, AV_LOG_VERBOSE, "Large scale tiles are unsupported.\n");
+                goto passthrough;
+            }
+        }
+        if (nb_frames > 1) {
+            s->cur_frame = 0;
+            s->cur_frame_idx = s->last_frame_idx = 0;
+            s->nb_frames = nb_frames;
+            split = 1;
+        }
+    }
+
+    if (split) {
+        AV1RawFrameHeader *frame = NULL;
+        int cur_frame_type = -1, size = 0;
+
+        for (i = s->cur_frame_idx; i < td->nb_units; i++) {
+            CodedBitstreamUnit *unit = &td->units[i];
+
+            size += unit->data_size;
+            if (unit->type == AV1_OBU_FRAME) {
+                AV1RawOBU *obu = unit->content;
+
+                if (frame) {
+                    av_log(ctx, AV_LOG_WARNING, "Frame OBU found when Tile data for a "
+                                                "previous frame was expected.\n");
+                    goto passthrough;
+                }
+
+                frame = &obu->obu.frame.header;
+                cur_frame_type = obu->header.obu_type;
+                s->last_frame_idx = s->cur_frame_idx;
+                s->cur_frame_idx  = i + 1;
+                s->cur_frame++;
+
+                // split here unless it's the last frame, in which case
+                // include every trailing OBU
+                if (s->cur_frame < s->nb_frames)
+                    break;
+            } else if (unit->type == AV1_OBU_FRAME_HEADER) {
+                AV1RawOBU *obu = unit->content;
+
+                if (frame) {
+                    av_log(ctx, AV_LOG_WARNING, "Frame Header OBU found when Tile data for a "
+                                                "previous frame was expected.\n");
+                    goto passthrough;
+                }
+
+                frame = &obu->obu.frame_header;
+                cur_frame_type = obu->header.obu_type;
+                s->last_frame_idx = s->cur_frame_idx;
+                s->cur_frame++;
+
+                // split here if show_existing_frame unless it's the last
+                // frame, in which case include every trailing OBU
+                if (frame->show_existing_frame &&
+                    s->cur_frame < s->nb_frames) {
+                    s->cur_frame_idx = i + 1;
+                    break;
+                }
+            } else if (unit->type == AV1_OBU_TILE_GROUP) {
+                AV1RawOBU *obu = unit->content;
+                AV1RawTileGroup *group = &obu->obu.tile_group;
+
+                if (!frame || cur_frame_type != AV1_OBU_FRAME_HEADER) {
+                    av_log(ctx, AV_LOG_WARNING, "Unexpected Tile Group OBU found before a "
+                                                "Frame Header.\n");
+                    goto passthrough;
+                }
+
+                if ((group->tg_end == (frame->tile_cols * frame->tile_rows) - 1) &&
+                    // include every trailing OBU with the last frame
+                    s->cur_frame < s->nb_frames) {
+                    s->cur_frame_idx = i + 1;
+                    break;
+                }
+            }
+        }
+        av_assert0(frame && s->cur_frame <= s->nb_frames);
+
+        ret = av_packet_ref(out, s->buffer_pkt);
+        if (ret < 0)
+            goto fail;
+
+        out->data = (uint8_t *)td->units[s->last_frame_idx].data;
+        out->size = size;
+
+        // skip the frame in the buffer packet if it's split successfully, so it's not present
+        // if the packet is passed through in case of failure when splitting another frame.
+        s->buffer_pkt->data += size;
+        s->buffer_pkt->size -= size;
+
+        if (!frame->show_existing_frame && !frame->show_frame)
+            out->pts = AV_NOPTS_VALUE;
+
+        if (s->cur_frame == s->nb_frames) {
+            av_packet_unref(s->buffer_pkt);
+            ff_cbs_fragment_reset(s->cbc, td);
+        }
+
+        return 0;
+    }
+
+passthrough:
+    av_packet_move_ref(out, s->buffer_pkt);
+
+    ret = 0;
+fail:
+    if (ret < 0) {
+        av_packet_unref(out);
+        av_packet_unref(s->buffer_pkt);
+    }
+    ff_cbs_fragment_reset(s->cbc, td);
+
+    return ret;
+}
+
+static const CodedBitstreamUnitType decompose_unit_types[] = {
+    AV1_OBU_TEMPORAL_DELIMITER,
+    AV1_OBU_SEQUENCE_HEADER,
+    AV1_OBU_FRAME_HEADER,
+    AV1_OBU_TILE_GROUP,
+    AV1_OBU_FRAME,
+};
+
+static int av1_frame_split_init(AVBSFContext *ctx)
+{
+    AV1FSplitContext *s = ctx->priv_data;
+    CodedBitstreamFragment *td = &s->temporal_unit;
+    int ret;
+
+    s->buffer_pkt = av_packet_alloc();
+    if (!s->buffer_pkt)
+        return AVERROR(ENOMEM);
+
+    ret = ff_cbs_init(&s->cbc, AV_CODEC_ID_AV1, ctx);
+    if (ret < 0)
+        return ret;
+
+    s->cbc->decompose_unit_types    = (CodedBitstreamUnitType*)decompose_unit_types;
+    s->cbc->nb_decompose_unit_types = FF_ARRAY_ELEMS(decompose_unit_types);
+
+    if (!ctx->par_in->extradata_size)
+        return 0;
+
+    ret = ff_cbs_read_extradata(s->cbc, td, ctx->par_in);
+    if (ret < 0)
+        av_log(ctx, AV_LOG_WARNING, "Failed to parse extradata.\n");
+
+    ff_cbs_fragment_reset(s->cbc, td);
+
+    return 0;
+}
+
+static void av1_frame_split_flush(AVBSFContext *ctx)
+{
+    AV1FSplitContext *s = ctx->priv_data;
+
+    av_packet_unref(s->buffer_pkt);
+    ff_cbs_fragment_reset(s->cbc, &s->temporal_unit);
+}
+
+static void av1_frame_split_close(AVBSFContext *ctx)
+{
+    AV1FSplitContext *s = ctx->priv_data;
+
+    av_packet_free(&s->buffer_pkt);
+    ff_cbs_fragment_free(s->cbc, &s->temporal_unit);
+    ff_cbs_close(&s->cbc);
+}
+
+static const enum AVCodecID av1_frame_split_codec_ids[] = {
+    AV_CODEC_ID_AV1, AV_CODEC_ID_NONE,
+};
+
+const AVBitStreamFilter ff_av1_frame_split_bsf = {
+    .name           = "av1_frame_split",
+    .priv_data_size = sizeof(AV1FSplitContext),
+    .init           = av1_frame_split_init,
+    .flush          = av1_frame_split_flush,
+    .close          = av1_frame_split_close,
+    .filter         = av1_frame_split_filter,
+    .codec_ids      = av1_frame_split_codec_ids,
+};
diff --git a/libavcodec/av1_metadata_bsf.c b/libavcodec/av1_metadata_bsf.c
index 52d3836..dd0c9b6 100644
--- a/libavcodec/av1_metadata_bsf.c
+++ b/libavcodec/av1_metadata_bsf.c
@@ -46,6 +46,8 @@
 
     AVRational tick_rate;
     int num_ticks_per_picture;
+
+    int delete_padding;
 } AV1MetadataContext;
 
 
@@ -59,12 +61,7 @@
     if (ctx->color_primaries >= 0          ||
         ctx->transfer_characteristics >= 0 ||
         ctx->matrix_coefficients >= 0) {
-        if (!clc->color_description_present_flag) {
-            clc->color_description_present_flag = 1;
-            clc->color_primaries          = AVCOL_PRI_UNSPECIFIED;
-            clc->transfer_characteristics = AVCOL_TRC_UNSPECIFIED;
-            clc->matrix_coefficients      = AVCOL_SPC_UNSPECIFIED;
-        }
+        clc->color_description_present_flag = 1;
 
         if (ctx->color_primaries >= 0)
             clc->color_primaries = ctx->color_primaries;
@@ -114,24 +111,29 @@
     return 0;
 }
 
-static int av1_metadata_filter(AVBSFContext *bsf, AVPacket *out)
+static int av1_metadata_filter(AVBSFContext *bsf, AVPacket *pkt)
 {
     AV1MetadataContext *ctx = bsf->priv_data;
-    AVPacket *in = NULL;
     CodedBitstreamFragment *frag = &ctx->access_unit;
     AV1RawOBU td, *obu;
     int err, i;
 
-    err = ff_bsf_get_packet(bsf, &in);
+    err = ff_bsf_get_packet_ref(bsf, pkt);
     if (err < 0)
         return err;
 
-    err = ff_cbs_read_packet(ctx->cbc, frag, in);
+    err = ff_cbs_read_packet(ctx->cbc, frag, pkt);
     if (err < 0) {
         av_log(bsf, AV_LOG_ERROR, "Failed to read packet.\n");
         goto fail;
     }
 
+    if (frag->nb_units == 0) {
+        av_log(bsf, AV_LOG_ERROR, "No OBU in packet.\n");
+        err = AVERROR_INVALIDDATA;
+        goto fail;
+    }
+
     for (i = 0; i < frag->nb_units; i++) {
         if (frag->units[i].type == AV1_OBU_SEQUENCE_HEADER) {
             obu = frag->units[i].content;
@@ -158,23 +160,25 @@
         }
     }
 
-    err = ff_cbs_write_packet(ctx->cbc, out, frag);
+    if (ctx->delete_padding) {
+        for (i = frag->nb_units - 1; i >= 0; i--) {
+            if (frag->units[i].type == AV1_OBU_PADDING)
+                ff_cbs_delete_unit(ctx->cbc, frag, i);
+        }
+    }
+
+    err = ff_cbs_write_packet(ctx->cbc, pkt, frag);
     if (err < 0) {
         av_log(bsf, AV_LOG_ERROR, "Failed to write packet.\n");
         goto fail;
     }
 
-    err = av_packet_copy_props(out, in);
-    if (err < 0)
-        goto fail;
-
     err = 0;
 fail:
-    ff_cbs_fragment_uninit(ctx->cbc, frag);
+    ff_cbs_fragment_reset(ctx->cbc, frag);
 
     if (err < 0)
-        av_packet_unref(out);
-    av_packet_free(&in);
+        av_packet_unref(pkt);
 
     return err;
 }
@@ -215,13 +219,15 @@
 
     err = 0;
 fail:
-    ff_cbs_fragment_uninit(ctx->cbc, frag);
+    ff_cbs_fragment_reset(ctx->cbc, frag);
     return err;
 }
 
 static void av1_metadata_close(AVBSFContext *bsf)
 {
     AV1MetadataContext *ctx = bsf->priv_data;
+
+    ff_cbs_fragment_free(ctx->cbc, &ctx->access_unit);
     ff_cbs_close(&ctx->cbc);
 }
 
@@ -273,6 +279,10 @@
         OFFSET(num_ticks_per_picture), AV_OPT_TYPE_INT,
         { .i64 = -1 }, -1, INT_MAX, FLAGS },
 
+    { "delete_padding", "Delete all Padding OBUs",
+        OFFSET(delete_padding), AV_OPT_TYPE_BOOL,
+        { .i64 = 0 }, 0, 1, FLAGS},
+
     { NULL }
 };
 
diff --git a/libavcodec/av1_parse.c b/libavcodec/av1_parse.c
index cdd524b..59ea0bc 100644
--- a/libavcodec/av1_parse.c
+++ b/libavcodec/av1_parse.c
@@ -66,13 +66,16 @@
 
         if (pkt->obus_allocated < pkt->nb_obus + 1) {
             int new_size = pkt->obus_allocated + 1;
-            AV1OBU *tmp = av_realloc_array(pkt->obus, new_size, sizeof(*tmp));
+            AV1OBU *tmp;
+
+            if (new_size >= INT_MAX / sizeof(*tmp))
+                return AVERROR(ENOMEM);
+            tmp = av_fast_realloc(pkt->obus, &pkt->obus_allocated_size, new_size * sizeof(*tmp));
             if (!tmp)
                 return AVERROR(ENOMEM);
 
             pkt->obus = tmp;
-            memset(pkt->obus + pkt->obus_allocated, 0,
-                   (new_size - pkt->obus_allocated) * sizeof(*tmp));
+            memset(pkt->obus + pkt->obus_allocated, 0, sizeof(*pkt->obus));
             pkt->obus_allocated = new_size;
         }
         obu = &pkt->obus[pkt->nb_obus];
@@ -103,5 +106,5 @@
 void ff_av1_packet_uninit(AV1Packet *pkt)
 {
     av_freep(&pkt->obus);
-    pkt->obus_allocated = 0;
+    pkt->obus_allocated = pkt->obus_allocated_size = 0;
 }
diff --git a/libavcodec/av1_parse.h b/libavcodec/av1_parse.h
index 864308f..01bcd64 100644
--- a/libavcodec/av1_parse.h
+++ b/libavcodec/av1_parse.h
@@ -56,6 +56,7 @@
     AV1OBU *obus;
     int nb_obus;
     int obus_allocated;
+    unsigned obus_allocated_size;
 } AV1Packet;
 
 /**
@@ -145,7 +146,9 @@
     int v;
 
     /* There are no trailing bits on these */
-    if (type == AV1_OBU_TILE_GROUP || type == AV1_OBU_FRAME) {
+    if (type == AV1_OBU_TILE_GROUP ||
+        type == AV1_OBU_TILE_LIST ||
+        type == AV1_OBU_FRAME) {
         if (size > INT_MAX / 8)
             return AVERROR(ERANGE);
         else
diff --git a/libavcodec/av1_parser.c b/libavcodec/av1_parser.c
index 8df6649..68b7a78 100644
--- a/libavcodec/av1_parser.c
+++ b/libavcodec/av1_parser.c
@@ -23,6 +23,7 @@
 #include "av1_parse.h"
 #include "cbs.h"
 #include "cbs_av1.h"
+#include "internal.h"
 #include "parser.h"
 
 typedef struct AV1ParseContext {
@@ -68,11 +69,10 @@
 
         ret = ff_cbs_read(s->cbc, td, avctx->extradata, avctx->extradata_size);
         if (ret < 0) {
-            av_log(avctx, AV_LOG_ERROR, "Failed to parse extradata.\n");
-            goto end;
+            av_log(avctx, AV_LOG_WARNING, "Failed to parse extradata.\n");
         }
 
-        ff_cbs_fragment_uninit(s->cbc, td);
+        ff_cbs_fragment_reset(s->cbc, td);
     }
 
     ret = ff_cbs_read(s->cbc, td, data, size);
@@ -101,6 +101,9 @@
         else
             continue;
 
+        if (obu->header.spatial_id > 0)
+            continue;
+
         if (frame->show_existing_frame) {
             AV1ReferenceFrameState *ref = &av1->ref[frame->frame_to_show_map_idx];
 
@@ -156,10 +159,24 @@
             break;
         }
         av_assert2(ctx->format != AV_PIX_FMT_NONE);
+
+        avctx->colorspace = (enum AVColorSpace) color->matrix_coefficients;
+        avctx->color_primaries = (enum AVColorPrimaries) color->color_primaries;
+        avctx->color_trc = (enum AVColorTransferCharacteristic) color->transfer_characteristics;
+        avctx->color_range = color->color_range ? AVCOL_RANGE_JPEG : AVCOL_RANGE_MPEG;
+
+        if (ctx->width != avctx->width || ctx->height != avctx->height) {
+            ret = ff_set_dimensions(avctx, ctx->width, ctx->height);
+            if (ret < 0)
+                goto end;
+        }
     }
 
+    if (avctx->framerate.num)
+        avctx->time_base = av_inv_q(av_mul_q(avctx->framerate, (AVRational){avctx->ticks_per_frame, 1}));
+
 end:
-    ff_cbs_fragment_uninit(s->cbc, td);
+    ff_cbs_fragment_reset(s->cbc, td);
 
     s->cbc->log_ctx = NULL;
 
@@ -193,6 +210,7 @@
 {
     AV1ParseContext *s = ctx->priv_data;
 
+    ff_cbs_fragment_free(s->cbc, &s->temporal_unit);
     ff_cbs_close(&s->cbc);
 }
 
diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
index c15b329..b79b025 100644
--- a/libavcodec/avcodec.h
+++ b/libavcodec/avcodec.h
@@ -41,11 +41,9 @@
 #include "libavutil/pixfmt.h"
 #include "libavutil/rational.h"
 
-// We have to implement deprecated functions until they are removed, this is the
-// simplest way to prevent warnings
-#undef attribute_deprecated
-#define attribute_deprecated
-
+#include "codec_desc.h"
+#include "codec_id.h"
+#include "packet.h"
 #include "version.h"
 
 /**
@@ -97,6 +95,7 @@
  *     compressed data in an AVPacket.
  *   - For encoding, call avcodec_send_frame() to give the encoder an AVFrame
  *     containing uncompressed audio or video.
+ *
  *   In both cases, it is recommended that AVPackets and AVFrames are
  *   refcounted, or libavcodec might have to copy the input data. (libavformat
  *   always returns refcounted AVPackets, and av_frame_get_buffer() allocates
@@ -107,6 +106,7 @@
  *     an AVFrame containing uncompressed audio or video data.
  *   - For encoding, call avcodec_receive_packet(). On success, it will return
  *     an AVPacket with a compressed frame.
+ *
  *   Repeat this call until it returns AVERROR(EAGAIN) or an error. The
  *   AVERROR(EAGAIN) return value means that new input data is required to
  *   return new output. In this case, continue with sending input. For each
@@ -201,580 +201,6 @@
  * @{
  */
 
-
-/**
- * Identify the syntax and semantics of the bitstream.
- * The principle is roughly:
- * Two decoders with the same ID can decode the same streams.
- * Two encoders with the same ID can encode compatible streams.
- * There may be slight deviations from the principle due to implementation
- * details.
- *
- * If you add a codec ID to this list, add it so that
- * 1. no value of an existing codec ID changes (that would break ABI),
- * 2. it is as close as possible to similar codecs
- *
- * After adding new codec IDs, do not forget to add an entry to the codec
- * descriptor list and bump libavcodec minor version.
- */
-enum AVCodecID {
-    AV_CODEC_ID_NONE,
-
-    /* video codecs */
-    AV_CODEC_ID_MPEG1VIDEO,
-    AV_CODEC_ID_MPEG2VIDEO, ///< preferred ID for MPEG-1/2 video decoding
-    AV_CODEC_ID_H261,
-    AV_CODEC_ID_H263,
-    AV_CODEC_ID_RV10,
-    AV_CODEC_ID_RV20,
-    AV_CODEC_ID_MJPEG,
-    AV_CODEC_ID_MJPEGB,
-    AV_CODEC_ID_LJPEG,
-    AV_CODEC_ID_SP5X,
-    AV_CODEC_ID_JPEGLS,
-    AV_CODEC_ID_MPEG4,
-    AV_CODEC_ID_RAWVIDEO,
-    AV_CODEC_ID_MSMPEG4V1,
-    AV_CODEC_ID_MSMPEG4V2,
-    AV_CODEC_ID_MSMPEG4V3,
-    AV_CODEC_ID_WMV1,
-    AV_CODEC_ID_WMV2,
-    AV_CODEC_ID_H263P,
-    AV_CODEC_ID_H263I,
-    AV_CODEC_ID_FLV1,
-    AV_CODEC_ID_SVQ1,
-    AV_CODEC_ID_SVQ3,
-    AV_CODEC_ID_DVVIDEO,
-    AV_CODEC_ID_HUFFYUV,
-    AV_CODEC_ID_CYUV,
-    AV_CODEC_ID_H264,
-    AV_CODEC_ID_INDEO3,
-    AV_CODEC_ID_VP3,
-    AV_CODEC_ID_THEORA,
-    AV_CODEC_ID_ASV1,
-    AV_CODEC_ID_ASV2,
-    AV_CODEC_ID_FFV1,
-    AV_CODEC_ID_4XM,
-    AV_CODEC_ID_VCR1,
-    AV_CODEC_ID_CLJR,
-    AV_CODEC_ID_MDEC,
-    AV_CODEC_ID_ROQ,
-    AV_CODEC_ID_INTERPLAY_VIDEO,
-    AV_CODEC_ID_XAN_WC3,
-    AV_CODEC_ID_XAN_WC4,
-    AV_CODEC_ID_RPZA,
-    AV_CODEC_ID_CINEPAK,
-    AV_CODEC_ID_WS_VQA,
-    AV_CODEC_ID_MSRLE,
-    AV_CODEC_ID_MSVIDEO1,
-    AV_CODEC_ID_IDCIN,
-    AV_CODEC_ID_8BPS,
-    AV_CODEC_ID_SMC,
-    AV_CODEC_ID_FLIC,
-    AV_CODEC_ID_TRUEMOTION1,
-    AV_CODEC_ID_VMDVIDEO,
-    AV_CODEC_ID_MSZH,
-    AV_CODEC_ID_ZLIB,
-    AV_CODEC_ID_QTRLE,
-    AV_CODEC_ID_TSCC,
-    AV_CODEC_ID_ULTI,
-    AV_CODEC_ID_QDRAW,
-    AV_CODEC_ID_VIXL,
-    AV_CODEC_ID_QPEG,
-    AV_CODEC_ID_PNG,
-    AV_CODEC_ID_PPM,
-    AV_CODEC_ID_PBM,
-    AV_CODEC_ID_PGM,
-    AV_CODEC_ID_PGMYUV,
-    AV_CODEC_ID_PAM,
-    AV_CODEC_ID_FFVHUFF,
-    AV_CODEC_ID_RV30,
-    AV_CODEC_ID_RV40,
-    AV_CODEC_ID_VC1,
-    AV_CODEC_ID_WMV3,
-    AV_CODEC_ID_LOCO,
-    AV_CODEC_ID_WNV1,
-    AV_CODEC_ID_AASC,
-    AV_CODEC_ID_INDEO2,
-    AV_CODEC_ID_FRAPS,
-    AV_CODEC_ID_TRUEMOTION2,
-    AV_CODEC_ID_BMP,
-    AV_CODEC_ID_CSCD,
-    AV_CODEC_ID_MMVIDEO,
-    AV_CODEC_ID_ZMBV,
-    AV_CODEC_ID_AVS,
-    AV_CODEC_ID_SMACKVIDEO,
-    AV_CODEC_ID_NUV,
-    AV_CODEC_ID_KMVC,
-    AV_CODEC_ID_FLASHSV,
-    AV_CODEC_ID_CAVS,
-    AV_CODEC_ID_JPEG2000,
-    AV_CODEC_ID_VMNC,
-    AV_CODEC_ID_VP5,
-    AV_CODEC_ID_VP6,
-    AV_CODEC_ID_VP6F,
-    AV_CODEC_ID_TARGA,
-    AV_CODEC_ID_DSICINVIDEO,
-    AV_CODEC_ID_TIERTEXSEQVIDEO,
-    AV_CODEC_ID_TIFF,
-    AV_CODEC_ID_GIF,
-    AV_CODEC_ID_DXA,
-    AV_CODEC_ID_DNXHD,
-    AV_CODEC_ID_THP,
-    AV_CODEC_ID_SGI,
-    AV_CODEC_ID_C93,
-    AV_CODEC_ID_BETHSOFTVID,
-    AV_CODEC_ID_PTX,
-    AV_CODEC_ID_TXD,
-    AV_CODEC_ID_VP6A,
-    AV_CODEC_ID_AMV,
-    AV_CODEC_ID_VB,
-    AV_CODEC_ID_PCX,
-    AV_CODEC_ID_SUNRAST,
-    AV_CODEC_ID_INDEO4,
-    AV_CODEC_ID_INDEO5,
-    AV_CODEC_ID_MIMIC,
-    AV_CODEC_ID_RL2,
-    AV_CODEC_ID_ESCAPE124,
-    AV_CODEC_ID_DIRAC,
-    AV_CODEC_ID_BFI,
-    AV_CODEC_ID_CMV,
-    AV_CODEC_ID_MOTIONPIXELS,
-    AV_CODEC_ID_TGV,
-    AV_CODEC_ID_TGQ,
-    AV_CODEC_ID_TQI,
-    AV_CODEC_ID_AURA,
-    AV_CODEC_ID_AURA2,
-    AV_CODEC_ID_V210X,
-    AV_CODEC_ID_TMV,
-    AV_CODEC_ID_V210,
-    AV_CODEC_ID_DPX,
-    AV_CODEC_ID_MAD,
-    AV_CODEC_ID_FRWU,
-    AV_CODEC_ID_FLASHSV2,
-    AV_CODEC_ID_CDGRAPHICS,
-    AV_CODEC_ID_R210,
-    AV_CODEC_ID_ANM,
-    AV_CODEC_ID_BINKVIDEO,
-    AV_CODEC_ID_IFF_ILBM,
-#define AV_CODEC_ID_IFF_BYTERUN1 AV_CODEC_ID_IFF_ILBM
-    AV_CODEC_ID_KGV1,
-    AV_CODEC_ID_YOP,
-    AV_CODEC_ID_VP8,
-    AV_CODEC_ID_PICTOR,
-    AV_CODEC_ID_ANSI,
-    AV_CODEC_ID_A64_MULTI,
-    AV_CODEC_ID_A64_MULTI5,
-    AV_CODEC_ID_R10K,
-    AV_CODEC_ID_MXPEG,
-    AV_CODEC_ID_LAGARITH,
-    AV_CODEC_ID_PRORES,
-    AV_CODEC_ID_JV,
-    AV_CODEC_ID_DFA,
-    AV_CODEC_ID_WMV3IMAGE,
-    AV_CODEC_ID_VC1IMAGE,
-    AV_CODEC_ID_UTVIDEO,
-    AV_CODEC_ID_BMV_VIDEO,
-    AV_CODEC_ID_VBLE,
-    AV_CODEC_ID_DXTORY,
-    AV_CODEC_ID_V410,
-    AV_CODEC_ID_XWD,
-    AV_CODEC_ID_CDXL,
-    AV_CODEC_ID_XBM,
-    AV_CODEC_ID_ZEROCODEC,
-    AV_CODEC_ID_MSS1,
-    AV_CODEC_ID_MSA1,
-    AV_CODEC_ID_TSCC2,
-    AV_CODEC_ID_MTS2,
-    AV_CODEC_ID_CLLC,
-    AV_CODEC_ID_MSS2,
-    AV_CODEC_ID_VP9,
-    AV_CODEC_ID_AIC,
-    AV_CODEC_ID_ESCAPE130,
-    AV_CODEC_ID_G2M,
-    AV_CODEC_ID_WEBP,
-    AV_CODEC_ID_HNM4_VIDEO,
-    AV_CODEC_ID_HEVC,
-#define AV_CODEC_ID_H265 AV_CODEC_ID_HEVC
-    AV_CODEC_ID_FIC,
-    AV_CODEC_ID_ALIAS_PIX,
-    AV_CODEC_ID_BRENDER_PIX,
-    AV_CODEC_ID_PAF_VIDEO,
-    AV_CODEC_ID_EXR,
-    AV_CODEC_ID_VP7,
-    AV_CODEC_ID_SANM,
-    AV_CODEC_ID_SGIRLE,
-    AV_CODEC_ID_MVC1,
-    AV_CODEC_ID_MVC2,
-    AV_CODEC_ID_HQX,
-    AV_CODEC_ID_TDSC,
-    AV_CODEC_ID_HQ_HQA,
-    AV_CODEC_ID_HAP,
-    AV_CODEC_ID_DDS,
-    AV_CODEC_ID_DXV,
-    AV_CODEC_ID_SCREENPRESSO,
-    AV_CODEC_ID_RSCC,
-    AV_CODEC_ID_AVS2,
-
-    AV_CODEC_ID_Y41P = 0x8000,
-    AV_CODEC_ID_AVRP,
-    AV_CODEC_ID_012V,
-    AV_CODEC_ID_AVUI,
-    AV_CODEC_ID_AYUV,
-    AV_CODEC_ID_TARGA_Y216,
-    AV_CODEC_ID_V308,
-    AV_CODEC_ID_V408,
-    AV_CODEC_ID_YUV4,
-    AV_CODEC_ID_AVRN,
-    AV_CODEC_ID_CPIA,
-    AV_CODEC_ID_XFACE,
-    AV_CODEC_ID_SNOW,
-    AV_CODEC_ID_SMVJPEG,
-    AV_CODEC_ID_APNG,
-    AV_CODEC_ID_DAALA,
-    AV_CODEC_ID_CFHD,
-    AV_CODEC_ID_TRUEMOTION2RT,
-    AV_CODEC_ID_M101,
-    AV_CODEC_ID_MAGICYUV,
-    AV_CODEC_ID_SHEERVIDEO,
-    AV_CODEC_ID_YLC,
-    AV_CODEC_ID_PSD,
-    AV_CODEC_ID_PIXLET,
-    AV_CODEC_ID_SPEEDHQ,
-    AV_CODEC_ID_FMVC,
-    AV_CODEC_ID_SCPR,
-    AV_CODEC_ID_CLEARVIDEO,
-    AV_CODEC_ID_XPM,
-    AV_CODEC_ID_AV1,
-    AV_CODEC_ID_BITPACKED,
-    AV_CODEC_ID_MSCC,
-    AV_CODEC_ID_SRGC,
-    AV_CODEC_ID_SVG,
-    AV_CODEC_ID_GDV,
-    AV_CODEC_ID_FITS,
-    AV_CODEC_ID_IMM4,
-    AV_CODEC_ID_PROSUMER,
-    AV_CODEC_ID_MWSC,
-    AV_CODEC_ID_WCMV,
-    AV_CODEC_ID_RASC,
-
-    /* various PCM "codecs" */
-    AV_CODEC_ID_FIRST_AUDIO = 0x10000,     ///< A dummy id pointing at the start of audio codecs
-    AV_CODEC_ID_PCM_S16LE = 0x10000,
-    AV_CODEC_ID_PCM_S16BE,
-    AV_CODEC_ID_PCM_U16LE,
-    AV_CODEC_ID_PCM_U16BE,
-    AV_CODEC_ID_PCM_S8,
-    AV_CODEC_ID_PCM_U8,
-    AV_CODEC_ID_PCM_MULAW,
-    AV_CODEC_ID_PCM_ALAW,
-    AV_CODEC_ID_PCM_S32LE,
-    AV_CODEC_ID_PCM_S32BE,
-    AV_CODEC_ID_PCM_U32LE,
-    AV_CODEC_ID_PCM_U32BE,
-    AV_CODEC_ID_PCM_S24LE,
-    AV_CODEC_ID_PCM_S24BE,
-    AV_CODEC_ID_PCM_U24LE,
-    AV_CODEC_ID_PCM_U24BE,
-    AV_CODEC_ID_PCM_S24DAUD,
-    AV_CODEC_ID_PCM_ZORK,
-    AV_CODEC_ID_PCM_S16LE_PLANAR,
-    AV_CODEC_ID_PCM_DVD,
-    AV_CODEC_ID_PCM_F32BE,
-    AV_CODEC_ID_PCM_F32LE,
-    AV_CODEC_ID_PCM_F64BE,
-    AV_CODEC_ID_PCM_F64LE,
-    AV_CODEC_ID_PCM_BLURAY,
-    AV_CODEC_ID_PCM_LXF,
-    AV_CODEC_ID_S302M,
-    AV_CODEC_ID_PCM_S8_PLANAR,
-    AV_CODEC_ID_PCM_S24LE_PLANAR,
-    AV_CODEC_ID_PCM_S32LE_PLANAR,
-    AV_CODEC_ID_PCM_S16BE_PLANAR,
-
-    AV_CODEC_ID_PCM_S64LE = 0x10800,
-    AV_CODEC_ID_PCM_S64BE,
-    AV_CODEC_ID_PCM_F16LE,
-    AV_CODEC_ID_PCM_F24LE,
-
-    /* various ADPCM codecs */
-    AV_CODEC_ID_ADPCM_IMA_QT = 0x11000,
-    AV_CODEC_ID_ADPCM_IMA_WAV,
-    AV_CODEC_ID_ADPCM_IMA_DK3,
-    AV_CODEC_ID_ADPCM_IMA_DK4,
-    AV_CODEC_ID_ADPCM_IMA_WS,
-    AV_CODEC_ID_ADPCM_IMA_SMJPEG,
-    AV_CODEC_ID_ADPCM_MS,
-    AV_CODEC_ID_ADPCM_4XM,
-    AV_CODEC_ID_ADPCM_XA,
-    AV_CODEC_ID_ADPCM_ADX,
-    AV_CODEC_ID_ADPCM_EA,
-    AV_CODEC_ID_ADPCM_G726,
-    AV_CODEC_ID_ADPCM_CT,
-    AV_CODEC_ID_ADPCM_SWF,
-    AV_CODEC_ID_ADPCM_YAMAHA,
-    AV_CODEC_ID_ADPCM_SBPRO_4,
-    AV_CODEC_ID_ADPCM_SBPRO_3,
-    AV_CODEC_ID_ADPCM_SBPRO_2,
-    AV_CODEC_ID_ADPCM_THP,
-    AV_CODEC_ID_ADPCM_IMA_AMV,
-    AV_CODEC_ID_ADPCM_EA_R1,
-    AV_CODEC_ID_ADPCM_EA_R3,
-    AV_CODEC_ID_ADPCM_EA_R2,
-    AV_CODEC_ID_ADPCM_IMA_EA_SEAD,
-    AV_CODEC_ID_ADPCM_IMA_EA_EACS,
-    AV_CODEC_ID_ADPCM_EA_XAS,
-    AV_CODEC_ID_ADPCM_EA_MAXIS_XA,
-    AV_CODEC_ID_ADPCM_IMA_ISS,
-    AV_CODEC_ID_ADPCM_G722,
-    AV_CODEC_ID_ADPCM_IMA_APC,
-    AV_CODEC_ID_ADPCM_VIMA,
-
-    AV_CODEC_ID_ADPCM_AFC = 0x11800,
-    AV_CODEC_ID_ADPCM_IMA_OKI,
-    AV_CODEC_ID_ADPCM_DTK,
-    AV_CODEC_ID_ADPCM_IMA_RAD,
-    AV_CODEC_ID_ADPCM_G726LE,
-    AV_CODEC_ID_ADPCM_THP_LE,
-    AV_CODEC_ID_ADPCM_PSX,
-    AV_CODEC_ID_ADPCM_AICA,
-    AV_CODEC_ID_ADPCM_IMA_DAT4,
-    AV_CODEC_ID_ADPCM_MTAF,
-
-    /* AMR */
-    AV_CODEC_ID_AMR_NB = 0x12000,
-    AV_CODEC_ID_AMR_WB,
-
-    /* RealAudio codecs*/
-    AV_CODEC_ID_RA_144 = 0x13000,
-    AV_CODEC_ID_RA_288,
-
-    /* various DPCM codecs */
-    AV_CODEC_ID_ROQ_DPCM = 0x14000,
-    AV_CODEC_ID_INTERPLAY_DPCM,
-    AV_CODEC_ID_XAN_DPCM,
-    AV_CODEC_ID_SOL_DPCM,
-
-    AV_CODEC_ID_SDX2_DPCM = 0x14800,
-    AV_CODEC_ID_GREMLIN_DPCM,
-
-    /* audio codecs */
-    AV_CODEC_ID_MP2 = 0x15000,
-    AV_CODEC_ID_MP3, ///< preferred ID for decoding MPEG audio layer 1, 2 or 3
-    AV_CODEC_ID_AAC,
-    AV_CODEC_ID_AC3,
-    AV_CODEC_ID_DTS,
-    AV_CODEC_ID_VORBIS,
-    AV_CODEC_ID_DVAUDIO,
-    AV_CODEC_ID_WMAV1,
-    AV_CODEC_ID_WMAV2,
-    AV_CODEC_ID_MACE3,
-    AV_CODEC_ID_MACE6,
-    AV_CODEC_ID_VMDAUDIO,
-    AV_CODEC_ID_FLAC,
-    AV_CODEC_ID_MP3ADU,
-    AV_CODEC_ID_MP3ON4,
-    AV_CODEC_ID_SHORTEN,
-    AV_CODEC_ID_ALAC,
-    AV_CODEC_ID_WESTWOOD_SND1,
-    AV_CODEC_ID_GSM, ///< as in Berlin toast format
-    AV_CODEC_ID_QDM2,
-    AV_CODEC_ID_COOK,
-    AV_CODEC_ID_TRUESPEECH,
-    AV_CODEC_ID_TTA,
-    AV_CODEC_ID_SMACKAUDIO,
-    AV_CODEC_ID_QCELP,
-    AV_CODEC_ID_WAVPACK,
-    AV_CODEC_ID_DSICINAUDIO,
-    AV_CODEC_ID_IMC,
-    AV_CODEC_ID_MUSEPACK7,
-    AV_CODEC_ID_MLP,
-    AV_CODEC_ID_GSM_MS, /* as found in WAV */
-    AV_CODEC_ID_ATRAC3,
-    AV_CODEC_ID_APE,
-    AV_CODEC_ID_NELLYMOSER,
-    AV_CODEC_ID_MUSEPACK8,
-    AV_CODEC_ID_SPEEX,
-    AV_CODEC_ID_WMAVOICE,
-    AV_CODEC_ID_WMAPRO,
-    AV_CODEC_ID_WMALOSSLESS,
-    AV_CODEC_ID_ATRAC3P,
-    AV_CODEC_ID_EAC3,
-    AV_CODEC_ID_SIPR,
-    AV_CODEC_ID_MP1,
-    AV_CODEC_ID_TWINVQ,
-    AV_CODEC_ID_TRUEHD,
-    AV_CODEC_ID_MP4ALS,
-    AV_CODEC_ID_ATRAC1,
-    AV_CODEC_ID_BINKAUDIO_RDFT,
-    AV_CODEC_ID_BINKAUDIO_DCT,
-    AV_CODEC_ID_AAC_LATM,
-    AV_CODEC_ID_QDMC,
-    AV_CODEC_ID_CELT,
-    AV_CODEC_ID_G723_1,
-    AV_CODEC_ID_G729,
-    AV_CODEC_ID_8SVX_EXP,
-    AV_CODEC_ID_8SVX_FIB,
-    AV_CODEC_ID_BMV_AUDIO,
-    AV_CODEC_ID_RALF,
-    AV_CODEC_ID_IAC,
-    AV_CODEC_ID_ILBC,
-    AV_CODEC_ID_OPUS,
-    AV_CODEC_ID_COMFORT_NOISE,
-    AV_CODEC_ID_TAK,
-    AV_CODEC_ID_METASOUND,
-    AV_CODEC_ID_PAF_AUDIO,
-    AV_CODEC_ID_ON2AVC,
-    AV_CODEC_ID_DSS_SP,
-    AV_CODEC_ID_CODEC2,
-
-    AV_CODEC_ID_FFWAVESYNTH = 0x15800,
-    AV_CODEC_ID_SONIC,
-    AV_CODEC_ID_SONIC_LS,
-    AV_CODEC_ID_EVRC,
-    AV_CODEC_ID_SMV,
-    AV_CODEC_ID_DSD_LSBF,
-    AV_CODEC_ID_DSD_MSBF,
-    AV_CODEC_ID_DSD_LSBF_PLANAR,
-    AV_CODEC_ID_DSD_MSBF_PLANAR,
-    AV_CODEC_ID_4GV,
-    AV_CODEC_ID_INTERPLAY_ACM,
-    AV_CODEC_ID_XMA1,
-    AV_CODEC_ID_XMA2,
-    AV_CODEC_ID_DST,
-    AV_CODEC_ID_ATRAC3AL,
-    AV_CODEC_ID_ATRAC3PAL,
-    AV_CODEC_ID_DOLBY_E,
-    AV_CODEC_ID_APTX,
-    AV_CODEC_ID_APTX_HD,
-    AV_CODEC_ID_SBC,
-    AV_CODEC_ID_ATRAC9,
-
-    /* subtitle codecs */
-    AV_CODEC_ID_FIRST_SUBTITLE = 0x17000,          ///< A dummy ID pointing at the start of subtitle codecs.
-    AV_CODEC_ID_DVD_SUBTITLE = 0x17000,
-    AV_CODEC_ID_DVB_SUBTITLE,
-    AV_CODEC_ID_TEXT,  ///< raw UTF-8 text
-    AV_CODEC_ID_XSUB,
-    AV_CODEC_ID_SSA,
-    AV_CODEC_ID_MOV_TEXT,
-    AV_CODEC_ID_HDMV_PGS_SUBTITLE,
-    AV_CODEC_ID_DVB_TELETEXT,
-    AV_CODEC_ID_SRT,
-
-    AV_CODEC_ID_MICRODVD   = 0x17800,
-    AV_CODEC_ID_EIA_608,
-    AV_CODEC_ID_JACOSUB,
-    AV_CODEC_ID_SAMI,
-    AV_CODEC_ID_REALTEXT,
-    AV_CODEC_ID_STL,
-    AV_CODEC_ID_SUBVIEWER1,
-    AV_CODEC_ID_SUBVIEWER,
-    AV_CODEC_ID_SUBRIP,
-    AV_CODEC_ID_WEBVTT,
-    AV_CODEC_ID_MPL2,
-    AV_CODEC_ID_VPLAYER,
-    AV_CODEC_ID_PJS,
-    AV_CODEC_ID_ASS,
-    AV_CODEC_ID_HDMV_TEXT_SUBTITLE,
-    AV_CODEC_ID_TTML,
-
-    /* other specific kind of codecs (generally used for attachments) */
-    AV_CODEC_ID_FIRST_UNKNOWN = 0x18000,           ///< A dummy ID pointing at the start of various fake codecs.
-    AV_CODEC_ID_TTF = 0x18000,
-
-    AV_CODEC_ID_SCTE_35, ///< Contain timestamp estimated through PCR of program stream.
-    AV_CODEC_ID_BINTEXT    = 0x18800,
-    AV_CODEC_ID_XBIN,
-    AV_CODEC_ID_IDF,
-    AV_CODEC_ID_OTF,
-    AV_CODEC_ID_SMPTE_KLV,
-    AV_CODEC_ID_DVD_NAV,
-    AV_CODEC_ID_TIMED_ID3,
-    AV_CODEC_ID_BIN_DATA,
-
-
-    AV_CODEC_ID_PROBE = 0x19000, ///< codec_id is not known (like AV_CODEC_ID_NONE) but lavf should attempt to identify it
-
-    AV_CODEC_ID_MPEG2TS = 0x20000, /**< _FAKE_ codec to indicate a raw MPEG-2 TS
-                                * stream (only used by libavformat) */
-    AV_CODEC_ID_MPEG4SYSTEMS = 0x20001, /**< _FAKE_ codec to indicate a MPEG-4 Systems
-                                * stream (only used by libavformat) */
-    AV_CODEC_ID_FFMETADATA = 0x21000,   ///< Dummy codec for streams containing only metadata information.
-    AV_CODEC_ID_WRAPPED_AVFRAME = 0x21001, ///< Passthrough codec, AVFrames wrapped in AVPacket
-};
-
-/**
- * This struct describes the properties of a single codec described by an
- * AVCodecID.
- * @see avcodec_descriptor_get()
- */
-typedef struct AVCodecDescriptor {
-    enum AVCodecID     id;
-    enum AVMediaType type;
-    /**
-     * Name of the codec described by this descriptor. It is non-empty and
-     * unique for each codec descriptor. It should contain alphanumeric
-     * characters and '_' only.
-     */
-    const char      *name;
-    /**
-     * A more descriptive name for this codec. May be NULL.
-     */
-    const char *long_name;
-    /**
-     * Codec properties, a combination of AV_CODEC_PROP_* flags.
-     */
-    int             props;
-    /**
-     * MIME type(s) associated with the codec.
-     * May be NULL; if not, a NULL-terminated array of MIME types.
-     * The first item is always non-NULL and is the preferred MIME type.
-     */
-    const char *const *mime_types;
-    /**
-     * If non-NULL, an array of profiles recognized for this codec.
-     * Terminated with FF_PROFILE_UNKNOWN.
-     */
-    const struct AVProfile *profiles;
-} AVCodecDescriptor;
-
-/**
- * Codec uses only intra compression.
- * Video and audio codecs only.
- */
-#define AV_CODEC_PROP_INTRA_ONLY    (1 << 0)
-/**
- * Codec supports lossy compression. Audio and video codecs only.
- * @note a codec may support both lossy and lossless
- * compression modes
- */
-#define AV_CODEC_PROP_LOSSY         (1 << 1)
-/**
- * Codec supports lossless compression. Audio and video codecs only.
- */
-#define AV_CODEC_PROP_LOSSLESS      (1 << 2)
-/**
- * Codec supports frame reordering. That is, the coded order (the order in which
- * the encoded packets are output by the encoders / stored / input to the
- * decoders) may be different from the presentation order of the corresponding
- * frames.
- *
- * For codecs that do not have this property set, PTS and DTS should always be
- * equal.
- */
-#define AV_CODEC_PROP_REORDER       (1 << 3)
-/**
- * Subtitle codec is bitmap based
- * Decoded AVSubtitle data can be read from the AVSubtitleRect->pict field.
- */
-#define AV_CODEC_PROP_BITMAP_SUB    (1 << 16)
-/**
- * Subtitle codec is text based.
- * Decoded AVSubtitle data can be read from the AVSubtitleRect->ass field.
- */
-#define AV_CODEC_PROP_TEXT_SUB      (1 << 17)
-
 /**
  * @ingroup lavc_decoding
  * Required number of additionally allocated bytes at the end of the input bitstream for decoding.
@@ -857,6 +283,11 @@
  */
 #define AV_CODEC_FLAG_QPEL            (1 <<  4)
 /**
+ * Don't output frames whose parameters differ from first
+ * decoded frame in stream.
+ */
+#define AV_CODEC_FLAG_DROPCHANGED     (1 <<  5)
+/**
  * Use internal 2pass ratecontrol in first pass mode.
  */
 #define AV_CODEC_FLAG_PASS1           (1 <<  9)
@@ -1076,6 +507,32 @@
 #define AV_CODEC_CAP_HYBRID              (1 << 19)
 
 /**
+ * This codec takes the reordered_opaque field from input AVFrames
+ * and returns it in the corresponding field in AVCodecContext after
+ * encoding.
+ */
+#define AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE (1 << 20)
+
+/**
+ * This encoder can be flushed using avcodec_flush_buffers(). If this flag is
+ * not set, the encoder must be closed and reopened to ensure that no frames
+ * remain pending.
+ */
+#define AV_CODEC_CAP_ENCODER_FLUSH   (1 << 21)
+
+/* Exported side data.
+   These flags can be passed in AVCodecContext.export_side_data before initialization.
+*/
+/**
+ * Export motion vectors through frame side data
+ */
+#define AV_CODEC_EXPORT_DATA_MVS         (1 << 0)
+/**
+ * Export encoder Producer Reference Time through packet side data
+ */
+#define AV_CODEC_EXPORT_DATA_PRFT        (1 << 1)
+
+/**
  * Pan Scan area.
  * This specifies the area which should be displayed.
  * Note there may be multiple such areas for one frame.
@@ -1114,17 +571,29 @@
      * Maximum bitrate of the stream, in bits per second.
      * Zero if unknown or unspecified.
      */
+#if FF_API_UNSANITIZED_BITRATES
     int max_bitrate;
+#else
+    int64_t max_bitrate;
+#endif
     /**
      * Minimum bitrate of the stream, in bits per second.
      * Zero if unknown or unspecified.
      */
+#if FF_API_UNSANITIZED_BITRATES
     int min_bitrate;
+#else
+    int64_t min_bitrate;
+#endif
     /**
      * Average bitrate of the stream, in bits per second.
      * Zero if unknown or unspecified.
      */
+#if FF_API_UNSANITIZED_BITRATES
     int avg_bitrate;
+#else
+    int64_t avg_bitrate;
+#endif
 
     /**
      * The size of the buffer to which the ratecontrol is applied, in bits.
@@ -1143,373 +612,23 @@
 } AVCPBProperties;
 
 /**
+ * This structure supplies correlation between a packet timestamp and a wall clock
+ * production time. The definition follows the Producer Reference Time ('prft')
+ * as defined in ISO/IEC 14496-12
+ */
+typedef struct AVProducerReferenceTime {
+    /**
+     * A UTC timestamp, in microseconds, since Unix epoch (e.g, av_gettime()).
+     */
+    int64_t wallclock;
+    int flags;
+} AVProducerReferenceTime;
+
+/**
  * The decoder will keep a reference to the frame and may reuse it later.
  */
 #define AV_GET_BUFFER_FLAG_REF (1 << 0)
 
-/**
- * @defgroup lavc_packet AVPacket
- *
- * Types and functions for working with AVPacket.
- * @{
- */
-enum AVPacketSideDataType {
-    /**
-     * An AV_PKT_DATA_PALETTE side data packet contains exactly AVPALETTE_SIZE
-     * bytes worth of palette. This side data signals that a new palette is
-     * present.
-     */
-    AV_PKT_DATA_PALETTE,
-
-    /**
-     * The AV_PKT_DATA_NEW_EXTRADATA is used to notify the codec or the format
-     * that the extradata buffer was changed and the receiving side should
-     * act upon it appropriately. The new extradata is embedded in the side
-     * data buffer and should be immediately used for processing the current
-     * frame or packet.
-     */
-    AV_PKT_DATA_NEW_EXTRADATA,
-
-    /**
-     * An AV_PKT_DATA_PARAM_CHANGE side data packet is laid out as follows:
-     * @code
-     * u32le param_flags
-     * if (param_flags & AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_COUNT)
-     *     s32le channel_count
-     * if (param_flags & AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_LAYOUT)
-     *     u64le channel_layout
-     * if (param_flags & AV_SIDE_DATA_PARAM_CHANGE_SAMPLE_RATE)
-     *     s32le sample_rate
-     * if (param_flags & AV_SIDE_DATA_PARAM_CHANGE_DIMENSIONS)
-     *     s32le width
-     *     s32le height
-     * @endcode
-     */
-    AV_PKT_DATA_PARAM_CHANGE,
-
-    /**
-     * An AV_PKT_DATA_H263_MB_INFO side data packet contains a number of
-     * structures with info about macroblocks relevant to splitting the
-     * packet into smaller packets on macroblock edges (e.g. as for RFC 2190).
-     * That is, it does not necessarily contain info about all macroblocks,
-     * as long as the distance between macroblocks in the info is smaller
-     * than the target payload size.
-     * Each MB info structure is 12 bytes, and is laid out as follows:
-     * @code
-     * u32le bit offset from the start of the packet
-     * u8    current quantizer at the start of the macroblock
-     * u8    GOB number
-     * u16le macroblock address within the GOB
-     * u8    horizontal MV predictor
-     * u8    vertical MV predictor
-     * u8    horizontal MV predictor for block number 3
-     * u8    vertical MV predictor for block number 3
-     * @endcode
-     */
-    AV_PKT_DATA_H263_MB_INFO,
-
-    /**
-     * This side data should be associated with an audio stream and contains
-     * ReplayGain information in form of the AVReplayGain struct.
-     */
-    AV_PKT_DATA_REPLAYGAIN,
-
-    /**
-     * This side data contains a 3x3 transformation matrix describing an affine
-     * transformation that needs to be applied to the decoded video frames for
-     * correct presentation.
-     *
-     * See libavutil/display.h for a detailed description of the data.
-     */
-    AV_PKT_DATA_DISPLAYMATRIX,
-
-    /**
-     * This side data should be associated with a video stream and contains
-     * Stereoscopic 3D information in form of the AVStereo3D struct.
-     */
-    AV_PKT_DATA_STEREO3D,
-
-    /**
-     * This side data should be associated with an audio stream and corresponds
-     * to enum AVAudioServiceType.
-     */
-    AV_PKT_DATA_AUDIO_SERVICE_TYPE,
-
-    /**
-     * This side data contains quality related information from the encoder.
-     * @code
-     * u32le quality factor of the compressed frame. Allowed range is between 1 (good) and FF_LAMBDA_MAX (bad).
-     * u8    picture type
-     * u8    error count
-     * u16   reserved
-     * u64le[error count] sum of squared differences between encoder in and output
-     * @endcode
-     */
-    AV_PKT_DATA_QUALITY_STATS,
-
-    /**
-     * This side data contains an integer value representing the stream index
-     * of a "fallback" track.  A fallback track indicates an alternate
-     * track to use when the current track can not be decoded for some reason.
-     * e.g. no decoder available for codec.
-     */
-    AV_PKT_DATA_FALLBACK_TRACK,
-
-    /**
-     * This side data corresponds to the AVCPBProperties struct.
-     */
-    AV_PKT_DATA_CPB_PROPERTIES,
-
-    /**
-     * Recommmends skipping the specified number of samples
-     * @code
-     * u32le number of samples to skip from start of this packet
-     * u32le number of samples to skip from end of this packet
-     * u8    reason for start skip
-     * u8    reason for end   skip (0=padding silence, 1=convergence)
-     * @endcode
-     */
-    AV_PKT_DATA_SKIP_SAMPLES,
-
-    /**
-     * An AV_PKT_DATA_JP_DUALMONO side data packet indicates that
-     * the packet may contain "dual mono" audio specific to Japanese DTV
-     * and if it is true, recommends only the selected channel to be used.
-     * @code
-     * u8    selected channels (0=mail/left, 1=sub/right, 2=both)
-     * @endcode
-     */
-    AV_PKT_DATA_JP_DUALMONO,
-
-    /**
-     * A list of zero terminated key/value strings. There is no end marker for
-     * the list, so it is required to rely on the side data size to stop.
-     */
-    AV_PKT_DATA_STRINGS_METADATA,
-
-    /**
-     * Subtitle event position
-     * @code
-     * u32le x1
-     * u32le y1
-     * u32le x2
-     * u32le y2
-     * @endcode
-     */
-    AV_PKT_DATA_SUBTITLE_POSITION,
-
-    /**
-     * Data found in BlockAdditional element of matroska container. There is
-     * no end marker for the data, so it is required to rely on the side data
-     * size to recognize the end. 8 byte id (as found in BlockAddId) followed
-     * by data.
-     */
-    AV_PKT_DATA_MATROSKA_BLOCKADDITIONAL,
-
-    /**
-     * The optional first identifier line of a WebVTT cue.
-     */
-    AV_PKT_DATA_WEBVTT_IDENTIFIER,
-
-    /**
-     * The optional settings (rendering instructions) that immediately
-     * follow the timestamp specifier of a WebVTT cue.
-     */
-    AV_PKT_DATA_WEBVTT_SETTINGS,
-
-    /**
-     * A list of zero terminated key/value strings. There is no end marker for
-     * the list, so it is required to rely on the side data size to stop. This
-     * side data includes updated metadata which appeared in the stream.
-     */
-    AV_PKT_DATA_METADATA_UPDATE,
-
-    /**
-     * MPEGTS stream ID, this is required to pass the stream ID
-     * information from the demuxer to the corresponding muxer.
-     */
-    AV_PKT_DATA_MPEGTS_STREAM_ID,
-
-    /**
-     * Mastering display metadata (based on SMPTE-2086:2014). This metadata
-     * should be associated with a video stream and contains data in the form
-     * of the AVMasteringDisplayMetadata struct.
-     */
-    AV_PKT_DATA_MASTERING_DISPLAY_METADATA,
-
-    /**
-     * This side data should be associated with a video stream and corresponds
-     * to the AVSphericalMapping structure.
-     */
-    AV_PKT_DATA_SPHERICAL,
-
-    /**
-     * Content light level (based on CTA-861.3). This metadata should be
-     * associated with a video stream and contains data in the form of the
-     * AVContentLightMetadata struct.
-     */
-    AV_PKT_DATA_CONTENT_LIGHT_LEVEL,
-
-    /**
-     * ATSC A53 Part 4 Closed Captions. This metadata should be associated with
-     * a video stream. A53 CC bitstream is stored as uint8_t in AVPacketSideData.data.
-     * The number of bytes of CC data is AVPacketSideData.size.
-     */
-    AV_PKT_DATA_A53_CC,
-
-    /**
-     * This side data is encryption initialization data.
-     * The format is not part of ABI, use av_encryption_init_info_* methods to
-     * access.
-     */
-    AV_PKT_DATA_ENCRYPTION_INIT_INFO,
-
-    /**
-     * This side data contains encryption info for how to decrypt the packet.
-     * The format is not part of ABI, use av_encryption_info_* methods to access.
-     */
-    AV_PKT_DATA_ENCRYPTION_INFO,
-
-    /**
-     * Active Format Description data consisting of a single byte as specified
-     * in ETSI TS 101 154 using AVActiveFormatDescription enum.
-     */
-    AV_PKT_DATA_AFD,
-
-    /**
-     * The number of side data types.
-     * This is not part of the public API/ABI in the sense that it may
-     * change when new side data types are added.
-     * This must stay the last enum value.
-     * If its value becomes huge, some code using it
-     * needs to be updated as it assumes it to be smaller than other limits.
-     */
-    AV_PKT_DATA_NB
-};
-
-#define AV_PKT_DATA_QUALITY_FACTOR AV_PKT_DATA_QUALITY_STATS //DEPRECATED
-
-typedef struct AVPacketSideData {
-    uint8_t *data;
-    int      size;
-    enum AVPacketSideDataType type;
-} AVPacketSideData;
-
-/**
- * This structure stores compressed data. It is typically exported by demuxers
- * and then passed as input to decoders, or received as output from encoders and
- * then passed to muxers.
- *
- * For video, it should typically contain one compressed frame. For audio it may
- * contain several compressed frames. Encoders are allowed to output empty
- * packets, with no compressed data, containing only side data
- * (e.g. to update some stream parameters at the end of encoding).
- *
- * AVPacket is one of the few structs in FFmpeg, whose size is a part of public
- * ABI. Thus it may be allocated on stack and no new fields can be added to it
- * without libavcodec and libavformat major bump.
- *
- * The semantics of data ownership depends on the buf field.
- * If it is set, the packet data is dynamically allocated and is
- * valid indefinitely until a call to av_packet_unref() reduces the
- * reference count to 0.
- *
- * If the buf field is not set av_packet_ref() would make a copy instead
- * of increasing the reference count.
- *
- * The side data is always allocated with av_malloc(), copied by
- * av_packet_ref() and freed by av_packet_unref().
- *
- * @see av_packet_ref
- * @see av_packet_unref
- */
-typedef struct AVPacket {
-    /**
-     * A reference to the reference-counted buffer where the packet data is
-     * stored.
-     * May be NULL, then the packet data is not reference-counted.
-     */
-    AVBufferRef *buf;
-    /**
-     * Presentation timestamp in AVStream->time_base units; the time at which
-     * the decompressed packet will be presented to the user.
-     * Can be AV_NOPTS_VALUE if it is not stored in the file.
-     * pts MUST be larger or equal to dts as presentation cannot happen before
-     * decompression, unless one wants to view hex dumps. Some formats misuse
-     * the terms dts and pts/cts to mean something different. Such timestamps
-     * must be converted to true pts/dts before they are stored in AVPacket.
-     */
-    int64_t pts;
-    /**
-     * Decompression timestamp in AVStream->time_base units; the time at which
-     * the packet is decompressed.
-     * Can be AV_NOPTS_VALUE if it is not stored in the file.
-     */
-    int64_t dts;
-    uint8_t *data;
-    int   size;
-    int   stream_index;
-    /**
-     * A combination of AV_PKT_FLAG values
-     */
-    int   flags;
-    /**
-     * Additional packet data that can be provided by the container.
-     * Packet can contain several types of side information.
-     */
-    AVPacketSideData *side_data;
-    int side_data_elems;
-
-    /**
-     * Duration of this packet in AVStream->time_base units, 0 if unknown.
-     * Equals next_pts - this_pts in presentation order.
-     */
-    int64_t duration;
-
-    int64_t pos;                            ///< byte position in stream, -1 if unknown
-
-#if FF_API_CONVERGENCE_DURATION
-    /**
-     * @deprecated Same as the duration field, but as int64_t. This was required
-     * for Matroska subtitles, whose duration values could overflow when the
-     * duration field was still an int.
-     */
-    attribute_deprecated
-    int64_t convergence_duration;
-#endif
-} AVPacket;
-#define AV_PKT_FLAG_KEY     0x0001 ///< The packet contains a keyframe
-#define AV_PKT_FLAG_CORRUPT 0x0002 ///< The packet content is corrupted
-/**
- * Flag is used to discard packets which are required to maintain valid
- * decoder state but are not required for output and should be dropped
- * after decoding.
- **/
-#define AV_PKT_FLAG_DISCARD   0x0004
-/**
- * The packet comes from a trusted source.
- *
- * Otherwise-unsafe constructs such as arbitrary pointers to data
- * outside the packet may be followed.
- */
-#define AV_PKT_FLAG_TRUSTED   0x0008
-/**
- * Flag is used to indicate packets that contain frames that can
- * be discarded by the decoder.  I.e. Non-reference frames.
- */
-#define AV_PKT_FLAG_DISPOSABLE 0x0010
-
-
-enum AVSideDataParamChangeFlags {
-    AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_COUNT  = 0x0001,
-    AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_LAYOUT = 0x0002,
-    AV_SIDE_DATA_PARAM_CHANGE_SAMPLE_RATE    = 0x0004,
-    AV_SIDE_DATA_PARAM_CHANGE_DIMENSIONS     = 0x0008,
-};
-/**
- * @}
- */
-
 struct AVCodecInternal;
 
 enum AVFieldOrder {
@@ -2029,15 +1148,19 @@
 
     /**
      * custom intra quantization matrix
-     * - encoding: Set by user, can be NULL.
-     * - decoding: Set by libavcodec.
+     * Must be allocated with the av_malloc() family of functions, and will be freed in
+     * avcodec_free_context().
+     * - encoding: Set/allocated by user, freed by libavcodec. Can be NULL.
+     * - decoding: Set/allocated/freed by libavcodec.
      */
     uint16_t *intra_matrix;
 
     /**
      * custom inter quantization matrix
-     * - encoding: Set by user, can be NULL.
-     * - decoding: Set by libavcodec.
+     * Must be allocated with the av_malloc() family of functions, and will be freed in
+     * avcodec_free_context().
+     * - encoding: Set/allocated by user, freed by libavcodec. Can be NULL.
+     * - decoding: Set/allocated/freed by libavcodec.
      */
     uint16_t *inter_matrix;
 
@@ -2681,7 +1804,10 @@
     /**
      * opaque 64-bit number (generally a PTS) that will be reordered and
      * output in AVFrame.reordered_opaque
-     * - encoding: unused
+     * - encoding: Set by libavcodec to the reordered_opaque of the input
+     *             frame corresponding to the last returned packet. Only
+     *             supported by encoders with the
+     *             AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE capability.
      * - decoding: Set by user.
      */
     int64_t reordered_opaque;
@@ -2965,6 +2091,16 @@
 
 #define FF_PROFILE_SBC_MSBC                         1
 
+#define FF_PROFILE_PRORES_PROXY     0
+#define FF_PROFILE_PRORES_LT        1
+#define FF_PROFILE_PRORES_STANDARD  2
+#define FF_PROFILE_PRORES_HQ        3
+#define FF_PROFILE_PRORES_4444      4
+#define FF_PROFILE_PRORES_XQ        5
+
+#define FF_PROFILE_ARIB_PROFILE_A 0
+#define FF_PROFILE_ARIB_PROFILE_C 1
+
     /**
      * level
      * - encoding: Set by user.
@@ -3317,6 +2453,32 @@
      * used as reference pictures).
      */
     int extra_hw_frames;
+
+    /**
+     * The percentage of damaged samples to discard a frame.
+     *
+     * - decoding: set by user
+     * - encoding: unused
+     */
+    int discard_damaged_percentage;
+
+    /**
+     * The number of samples per frame to maximally accept.
+     *
+     * - decoding: set by user
+     * - encoding: set by user
+     */
+    int64_t max_samples;
+
+    /**
+     * Bit set of AV_CODEC_EXPORT_DATA_* flags, which affects the kind of
+     * metadata exported in frame, packet, or coded stream side data by
+     * decoders and encoders.
+     *
+     * - decoding: set by user
+     * - encoding: set by user
+     */
+    int export_side_data;
 } AVCodecContext;
 
 #if FF_API_CODEC_GET_SET
@@ -3480,12 +2642,6 @@
      * @{
      */
     /**
-     * If defined, called on thread contexts when they are created.
-     * If the codec allocates writable tables in init(), re-allocate them here.
-     * priv_data will be set to a copy of the original.
-     */
-    int (*init_thread_copy)(AVCodecContext *);
-    /**
      * Copy necessary context variables from a previous thread context to the current one.
      * If not defined, the next thread will start automatically; otherwise, the codec
      * must call ff_thread_finish_setup().
@@ -3567,6 +2723,11 @@
      * The user can only access this field via avcodec_get_hw_config().
      */
     const struct AVCodecHWConfigInternal **hw_configs;
+
+    /**
+     * List of supported codec_tags, terminated by FF_CODEC_TAGS_END.
+     */
+    const uint32_t *codec_tags;
 } AVCodec;
 
 #if FF_API_CODEC_GET_SET
@@ -4291,316 +3452,6 @@
  */
 
 /**
- * @addtogroup lavc_packet
- * @{
- */
-
-/**
- * Allocate an AVPacket and set its fields to default values.  The resulting
- * struct must be freed using av_packet_free().
- *
- * @return An AVPacket filled with default values or NULL on failure.
- *
- * @note this only allocates the AVPacket itself, not the data buffers. Those
- * must be allocated through other means such as av_new_packet.
- *
- * @see av_new_packet
- */
-AVPacket *av_packet_alloc(void);
-
-/**
- * Create a new packet that references the same data as src.
- *
- * This is a shortcut for av_packet_alloc()+av_packet_ref().
- *
- * @return newly created AVPacket on success, NULL on error.
- *
- * @see av_packet_alloc
- * @see av_packet_ref
- */
-AVPacket *av_packet_clone(const AVPacket *src);
-
-/**
- * Free the packet, if the packet is reference counted, it will be
- * unreferenced first.
- *
- * @param pkt packet to be freed. The pointer will be set to NULL.
- * @note passing NULL is a no-op.
- */
-void av_packet_free(AVPacket **pkt);
-
-/**
- * Initialize optional fields of a packet with default values.
- *
- * Note, this does not touch the data and size members, which have to be
- * initialized separately.
- *
- * @param pkt packet
- */
-void av_init_packet(AVPacket *pkt);
-
-/**
- * Allocate the payload of a packet and initialize its fields with
- * default values.
- *
- * @param pkt packet
- * @param size wanted payload size
- * @return 0 if OK, AVERROR_xxx otherwise
- */
-int av_new_packet(AVPacket *pkt, int size);
-
-/**
- * Reduce packet size, correctly zeroing padding
- *
- * @param pkt packet
- * @param size new size
- */
-void av_shrink_packet(AVPacket *pkt, int size);
-
-/**
- * Increase packet size, correctly zeroing padding
- *
- * @param pkt packet
- * @param grow_by number of bytes by which to increase the size of the packet
- */
-int av_grow_packet(AVPacket *pkt, int grow_by);
-
-/**
- * Initialize a reference-counted packet from av_malloc()ed data.
- *
- * @param pkt packet to be initialized. This function will set the data, size,
- *        buf and destruct fields, all others are left untouched.
- * @param data Data allocated by av_malloc() to be used as packet data. If this
- *        function returns successfully, the data is owned by the underlying AVBuffer.
- *        The caller may not access the data through other means.
- * @param size size of data in bytes, without the padding. I.e. the full buffer
- *        size is assumed to be size + AV_INPUT_BUFFER_PADDING_SIZE.
- *
- * @return 0 on success, a negative AVERROR on error
- */
-int av_packet_from_data(AVPacket *pkt, uint8_t *data, int size);
-
-#if FF_API_AVPACKET_OLD_API
-/**
- * @warning This is a hack - the packet memory allocation stuff is broken. The
- * packet is allocated if it was not really allocated.
- *
- * @deprecated Use av_packet_ref or av_packet_make_refcounted
- */
-attribute_deprecated
-int av_dup_packet(AVPacket *pkt);
-/**
- * Copy packet, including contents
- *
- * @return 0 on success, negative AVERROR on fail
- *
- * @deprecated Use av_packet_ref
- */
-attribute_deprecated
-int av_copy_packet(AVPacket *dst, const AVPacket *src);
-
-/**
- * Copy packet side data
- *
- * @return 0 on success, negative AVERROR on fail
- *
- * @deprecated Use av_packet_copy_props
- */
-attribute_deprecated
-int av_copy_packet_side_data(AVPacket *dst, const AVPacket *src);
-
-/**
- * Free a packet.
- *
- * @deprecated Use av_packet_unref
- *
- * @param pkt packet to free
- */
-attribute_deprecated
-void av_free_packet(AVPacket *pkt);
-#endif
-/**
- * Allocate new information of a packet.
- *
- * @param pkt packet
- * @param type side information type
- * @param size side information size
- * @return pointer to fresh allocated data or NULL otherwise
- */
-uint8_t* av_packet_new_side_data(AVPacket *pkt, enum AVPacketSideDataType type,
-                                 int size);
-
-/**
- * Wrap an existing array as a packet side data.
- *
- * @param pkt packet
- * @param type side information type
- * @param data the side data array. It must be allocated with the av_malloc()
- *             family of functions. The ownership of the data is transferred to
- *             pkt.
- * @param size side information size
- * @return a non-negative number on success, a negative AVERROR code on
- *         failure. On failure, the packet is unchanged and the data remains
- *         owned by the caller.
- */
-int av_packet_add_side_data(AVPacket *pkt, enum AVPacketSideDataType type,
-                            uint8_t *data, size_t size);
-
-/**
- * Shrink the already allocated side data buffer
- *
- * @param pkt packet
- * @param type side information type
- * @param size new side information size
- * @return 0 on success, < 0 on failure
- */
-int av_packet_shrink_side_data(AVPacket *pkt, enum AVPacketSideDataType type,
-                               int size);
-
-/**
- * Get side information from packet.
- *
- * @param pkt packet
- * @param type desired side information type
- * @param size pointer for side information size to store (optional)
- * @return pointer to data if present or NULL otherwise
- */
-uint8_t* av_packet_get_side_data(const AVPacket *pkt, enum AVPacketSideDataType type,
-                                 int *size);
-
-#if FF_API_MERGE_SD_API
-attribute_deprecated
-int av_packet_merge_side_data(AVPacket *pkt);
-
-attribute_deprecated
-int av_packet_split_side_data(AVPacket *pkt);
-#endif
-
-const char *av_packet_side_data_name(enum AVPacketSideDataType type);
-
-/**
- * Pack a dictionary for use in side_data.
- *
- * @param dict The dictionary to pack.
- * @param size pointer to store the size of the returned data
- * @return pointer to data if successful, NULL otherwise
- */
-uint8_t *av_packet_pack_dictionary(AVDictionary *dict, int *size);
-/**
- * Unpack a dictionary from side_data.
- *
- * @param data data from side_data
- * @param size size of the data
- * @param dict the metadata storage dictionary
- * @return 0 on success, < 0 on failure
- */
-int av_packet_unpack_dictionary(const uint8_t *data, int size, AVDictionary **dict);
-
-
-/**
- * Convenience function to free all the side data stored.
- * All the other fields stay untouched.
- *
- * @param pkt packet
- */
-void av_packet_free_side_data(AVPacket *pkt);
-
-/**
- * Setup a new reference to the data described by a given packet
- *
- * If src is reference-counted, setup dst as a new reference to the
- * buffer in src. Otherwise allocate a new buffer in dst and copy the
- * data from src into it.
- *
- * All the other fields are copied from src.
- *
- * @see av_packet_unref
- *
- * @param dst Destination packet
- * @param src Source packet
- *
- * @return 0 on success, a negative AVERROR on error.
- */
-int av_packet_ref(AVPacket *dst, const AVPacket *src);
-
-/**
- * Wipe the packet.
- *
- * Unreference the buffer referenced by the packet and reset the
- * remaining packet fields to their default values.
- *
- * @param pkt The packet to be unreferenced.
- */
-void av_packet_unref(AVPacket *pkt);
-
-/**
- * Move every field in src to dst and reset src.
- *
- * @see av_packet_unref
- *
- * @param src Source packet, will be reset
- * @param dst Destination packet
- */
-void av_packet_move_ref(AVPacket *dst, AVPacket *src);
-
-/**
- * Copy only "properties" fields from src to dst.
- *
- * Properties for the purpose of this function are all the fields
- * beside those related to the packet data (buf, data, size)
- *
- * @param dst Destination packet
- * @param src Source packet
- *
- * @return 0 on success AVERROR on failure.
- */
-int av_packet_copy_props(AVPacket *dst, const AVPacket *src);
-
-/**
- * Ensure the data described by a given packet is reference counted.
- *
- * @note This function does not ensure that the reference will be writable.
- *       Use av_packet_make_writable instead for that purpose.
- *
- * @see av_packet_ref
- * @see av_packet_make_writable
- *
- * @param pkt packet whose data should be made reference counted.
- *
- * @return 0 on success, a negative AVERROR on error. On failure, the
- *         packet is unchanged.
- */
-int av_packet_make_refcounted(AVPacket *pkt);
-
-/**
- * Create a writable reference for the data described by a given packet,
- * avoiding data copy if possible.
- *
- * @param pkt Packet whose data should be made writable.
- *
- * @return 0 on success, a negative AVERROR on failure. On failure, the
- *         packet is unchanged.
- */
-int av_packet_make_writable(AVPacket *pkt);
-
-/**
- * Convert valid timing fields (timestamps / durations) in a packet from one
- * timebase to another. Timestamps with unknown values (AV_NOPTS_VALUE) will be
- * ignored.
- *
- * @param pkt packet on which the conversion will be performed
- * @param tb_src source timebase, in which the timing fields in pkt are
- *               expressed
- * @param tb_dst destination timebase, to which the timing fields will be
- *               converted
- */
-void av_packet_rescale_ts(AVPacket *pkt, AVRational tb_src, AVRational tb_dst);
-
-/**
- * @}
- */
-
-/**
  * @addtogroup lavc_decoding
  * @{
  */
@@ -4782,7 +3633,7 @@
  * If no subtitle could be decompressed, got_sub_ptr is zero.
  * Otherwise, the subtitle is stored in *sub.
  * Note that AV_CODEC_CAP_DR1 is not available for subtitle codecs. This is for
- * simplicity, because the performance difference is expect to be negligible
+ * simplicity, because the performance difference is expected to be negligible
  * and reusing a get_buffer written for video codecs would probably perform badly
  * due to a potentially very different allocation pattern.
  *
@@ -4798,7 +3649,7 @@
  * before packets may be fed to the decoder.
  *
  * @param avctx the codec context
- * @param[out] sub The Preallocated AVSubtitle in which the decoded subtitle will be stored,
+ * @param[out] sub The preallocated AVSubtitle in which the decoded subtitle will be stored,
  *                 must be freed with avsubtitle_free if *got_sub_ptr is set.
  * @param[in,out] got_sub_ptr Zero if no subtitle could be decompressed, otherwise, it is nonzero.
  * @param[in] avpkt The input AVPacket containing the input buffer.
@@ -4875,6 +3726,9 @@
  *      AVERROR_EOF:       the decoder has been fully flushed, and there will be
  *                         no more output frames
  *      AVERROR(EINVAL):   codec not opened, or it is an encoder
+ *      AVERROR_INPUT_CHANGED:   current decoded frame has changed parameters
+ *                               with respect to first decoded frame. Applicable
+ *                               when flag AV_CODEC_FLAG_DROPCHANGED is set.
  *      other negative values: legitimate decoding errors
  */
 int avcodec_receive_frame(AVCodecContext *avctx, AVFrame *frame);
@@ -4912,7 +3766,7 @@
  *      AVERROR(EINVAL):   codec not opened, refcounted_frames not set, it is a
  *                         decoder, or requires flush
  *      AVERROR(ENOMEM):   failed to add packet to internal queue, or similar
- *      other errors: legitimate decoding errors
+ *      other errors: legitimate encoding errors
  */
 int avcodec_send_frame(AVCodecContext *avctx, const AVFrame *frame);
 
@@ -4922,14 +3776,14 @@
  * @param avctx codec context
  * @param avpkt This will be set to a reference-counted packet allocated by the
  *              encoder. Note that the function will always call
- *              av_frame_unref(frame) before doing anything else.
+ *              av_packet_unref(avpkt) before doing anything else.
  * @return 0 on success, otherwise negative error code:
  *      AVERROR(EAGAIN):   output is not available in the current state - user
  *                         must try to send input
  *      AVERROR_EOF:       the encoder has been fully flushed, and there will be
  *                         no more output packets
- *      AVERROR(EINVAL):   codec not opened, or it is an encoder
- *      other errors: legitimate decoding errors
+ *      AVERROR(EINVAL):   codec not opened, or it is a decoder
+ *      other errors: legitimate encoding errors
  */
 int avcodec_receive_packet(AVCodecContext *avctx, AVPacket *avpkt);
 
@@ -5626,13 +4480,21 @@
                              int buf_size, int align);
 
 /**
- * Reset the internal decoder state / flush internal buffers. Should be called
+ * Reset the internal codec state / flush internal buffers. Should be called
  * e.g. when seeking or when switching to a different stream.
  *
- * @note when refcounted frames are not used (i.e. avctx->refcounted_frames is 0),
- * this invalidates the frames previously returned from the decoder. When
- * refcounted frames are used, the decoder just releases any references it might
- * keep internally, but the caller's reference remains valid.
+ * @note for decoders, when refcounted frames are not used
+ * (i.e. avctx->refcounted_frames is 0), this invalidates the frames previously
+ * returned from the decoder. When refcounted frames are used, the decoder just
+ * releases any references it might keep internally, but the caller's reference
+ * remains valid.
+ *
+ * @note for encoders, this function will only do something if the encoder
+ * declares support for AV_CODEC_CAP_ENCODER_FLUSH. When called, the encoder
+ * will drain any remaining packets, and can then be re-used for a different
+ * stream (as opposed to sending a null frame which will leave the encoder
+ * in a permanent EOF state after draining). This can be desirable if the
+ * cost of tearing down and replacing the encoder instance is high.
  */
 void avcodec_flush_buffers(AVCodecContext *avctx);
 
@@ -5879,11 +4741,13 @@
  *
  * @param pkt the packet to filter. The bitstream filter will take ownership of
  * the packet and reset the contents of pkt. pkt is not touched if an error occurs.
- * This parameter may be NULL, which signals the end of the stream (i.e. no more
- * packets will be sent). That will cause the filter to output any packets it
- * may have buffered internally.
+ * If pkt is empty (i.e. NULL, or pkt->data is NULL and pkt->side_data_elems zero),
+ * it signals the end of the stream (i.e. no more non-empty packets will be sent;
+ * sending more empty packets does nothing) and will cause the filter to output
+ * any packets it may have buffered internally.
  *
- * @return 0 on success, a negative AVERROR on error.
+ * @return 0 on success, a negative AVERROR on error. This function never fails if
+ * pkt is empty.
  */
 int av_bsf_send_packet(AVBSFContext *ctx, AVPacket *pkt);
 
@@ -6135,26 +4999,6 @@
 int av_codec_is_decoder(const AVCodec *codec);
 
 /**
- * @return descriptor for given codec ID or NULL if no descriptor exists.
- */
-const AVCodecDescriptor *avcodec_descriptor_get(enum AVCodecID id);
-
-/**
- * Iterate over all codec descriptors known to libavcodec.
- *
- * @param prev previous descriptor. NULL to get the first descriptor.
- *
- * @return next descriptor or NULL after the last descriptor
- */
-const AVCodecDescriptor *avcodec_descriptor_next(const AVCodecDescriptor *prev);
-
-/**
- * @return codec descriptor with the given name or NULL if no such descriptor
- *         exists.
- */
-const AVCodecDescriptor *avcodec_descriptor_get_by_name(const char *name);
-
-/**
  * Allocate a CPB properties structure and initialize its fields to default
  * values.
  *
diff --git a/libavcodec/avdct.c b/libavcodec/avdct.c
index 47e5f71..7c761cf 100644
--- a/libavcodec/avdct.c
+++ b/libavcodec/avdct.c
@@ -100,7 +100,7 @@
 
 #if CONFIG_IDCTDSP
     {
-        IDCTDSPContext idsp;
+        IDCTDSPContext idsp = {0};
         ff_idctdsp_init(&idsp, avctx);
         COPY(idsp, idct);
         COPY(idsp, idct_permutation);
diff --git a/libavcodec/avpacket.c b/libavcodec/avpacket.c
index e160ad3..55b5091 100644
--- a/libavcodec/avpacket.c
+++ b/libavcodec/avpacket.c
@@ -26,9 +26,10 @@
 #include "libavutil/internal.h"
 #include "libavutil/mathematics.h"
 #include "libavutil/mem.h"
-#include "avcodec.h"
+
 #include "bytestream.h"
 #include "internal.h"
+#include "packet.h"
 
 void av_init_packet(AVPacket *pkt)
 {
@@ -54,7 +55,7 @@
     if (!pkt)
         return pkt;
 
-    av_packet_unref(pkt);
+    av_init_packet(pkt);
 
     return pkt;
 }
@@ -112,7 +113,7 @@
     av_assert0((unsigned)pkt->size <= INT_MAX - AV_INPUT_BUFFER_PADDING_SIZE);
     if ((unsigned)grow_by >
         INT_MAX - (pkt->size + AV_INPUT_BUFFER_PADDING_SIZE))
-        return -1;
+        return AVERROR(ENOMEM);
 
     new_size = pkt->size + grow_by + AV_INPUT_BUFFER_PADDING_SIZE;
     if (pkt->buf) {
@@ -124,7 +125,7 @@
         } else {
             data_offset = pkt->data - pkt->buf->data;
             if (data_offset > INT_MAX - new_size)
-                return -1;
+                return AVERROR(ENOMEM);
         }
 
         if (new_size + data_offset > pkt->buf->size) {
@@ -394,6 +395,8 @@
     case AV_PKT_DATA_ENCRYPTION_INIT_INFO:       return "Encryption initialization data";
     case AV_PKT_DATA_ENCRYPTION_INFO:            return "Encryption info";
     case AV_PKT_DATA_AFD:                        return "Active Format Description data";
+    case AV_PKT_DATA_ICC_PROFILE:                return "ICC Profile";
+    case AV_PKT_DATA_DOVI_CONF:                  return "DOVI configuration record";
     }
     return NULL;
 }
@@ -522,11 +525,12 @@
 
 int av_packet_unpack_dictionary(const uint8_t *data, int size, AVDictionary **dict)
 {
-    const uint8_t *end = data + size;
-    int ret = 0;
+    const uint8_t *end;
+    int ret;
 
     if (!dict || !data || !size)
-        return ret;
+        return 0;
+    end = data + size;
     if (size && end[-1])
         return AVERROR_INVALIDDATA;
     while (data < end) {
@@ -538,11 +542,11 @@
 
         ret = av_dict_set(dict, key, val, 0);
         if (ret < 0)
-            break;
+            return ret;
         data = val + strlen(val) + 1;
     }
 
-    return ret;
+    return 0;
 }
 
 int av_packet_shrink_side_data(AVPacket *pkt, enum AVPacketSideDataType type,
@@ -608,14 +612,17 @@
 {
     int ret;
 
+    dst->buf = NULL;
+
     ret = av_packet_copy_props(dst, src);
     if (ret < 0)
-        return ret;
+        goto fail;
 
     if (!src->buf) {
         ret = packet_alloc(&dst->buf, src->size);
         if (ret < 0)
             goto fail;
+        av_assert1(!src->size || src->data);
         if (src->size)
             memcpy(dst->buf->data, src->data, src->size);
 
@@ -633,7 +640,7 @@
 
     return 0;
 fail:
-    av_packet_free_side_data(dst);
+    av_packet_unref(dst);
     return ret;
 }
 
@@ -668,6 +675,7 @@
     ret = packet_alloc(&pkt->buf, pkt->size);
     if (ret < 0)
         return ret;
+    av_assert1(!pkt->size || pkt->data);
     if (pkt->size)
         memcpy(pkt->buf->data, pkt->data, pkt->size);
 
@@ -687,6 +695,7 @@
     ret = packet_alloc(&buf, pkt->size);
     if (ret < 0)
         return ret;
+    av_assert1(!pkt->size || pkt->data);
     if (pkt->size)
         memcpy(buf->data, pkt->data, pkt->size);
 
@@ -737,3 +746,25 @@
 
     return 0;
 }
+
+int ff_side_data_set_prft(AVPacket *pkt, int64_t timestamp)
+{
+    AVProducerReferenceTime *prft;
+    uint8_t *side_data;
+    int side_data_size;
+
+    side_data = av_packet_get_side_data(pkt, AV_PKT_DATA_PRFT, &side_data_size);
+    if (!side_data) {
+        side_data_size = sizeof(AVProducerReferenceTime);
+        side_data = av_packet_new_side_data(pkt, AV_PKT_DATA_PRFT, side_data_size);
+    }
+
+    if (!side_data || side_data_size < sizeof(AVProducerReferenceTime))
+        return AVERROR(ENOMEM);
+
+    prft = (AVProducerReferenceTime *)side_data;
+    prft->wallclock = timestamp;
+    prft->flags = 0;
+
+    return 0;
+}
diff --git a/libavcodec/avs.c b/libavcodec/avs.c
index 66724d4..2f2361e 100644
--- a/libavcodec/avs.c
+++ b/libavcodec/avs.c
@@ -59,7 +59,7 @@
     AvsBlockType type;
     GetBitContext change_map = {0}; //init to silence warning
 
-    if ((ret = ff_reget_buffer(avctx, p)) < 0)
+    if ((ret = ff_reget_buffer(avctx, p, 0)) < 0)
         return ret;
     p->pict_type = AV_PICTURE_TYPE_P;
     p->key_frame = 0;
diff --git a/libavcodec/bethsoftvideo.c b/libavcodec/bethsoftvideo.c
index 274516b..a931b54 100644
--- a/libavcodec/bethsoftvideo.c
+++ b/libavcodec/bethsoftvideo.c
@@ -79,7 +79,7 @@
     int code, ret;
     int yoffset;
 
-    if ((ret = ff_reget_buffer(avctx, vid->frame)) < 0)
+    if ((ret = ff_reget_buffer(avctx, vid->frame, 0)) < 0)
         return ret;
     wrap_to_next_line = vid->frame->linesize[0] - avctx->width;
 
@@ -109,6 +109,11 @@
             if(yoffset >= avctx->height)
                 return AVERROR_INVALIDDATA;
             dst += vid->frame->linesize[0] * yoffset;
+        case VIDEO_P_FRAME:
+        case VIDEO_I_FRAME:
+            break;
+        default:
+            return AVERROR_INVALIDDATA;
     }
 
     // main code
diff --git a/libavcodec/bfi.c b/libavcodec/bfi.c
index 233a1d2..a4cb002 100644
--- a/libavcodec/bfi.c
+++ b/libavcodec/bfi.c
@@ -71,7 +71,7 @@
         frame->key_frame = 1;
         /* Setting the palette */
         if (avctx->extradata_size > 768) {
-            av_log(NULL, AV_LOG_ERROR, "Palette is too large.\n");
+            av_log(avctx, AV_LOG_ERROR, "Palette is too large.\n");
             return AVERROR_INVALIDDATA;
         }
         pal = (uint32_t *)frame->data[1];
diff --git a/libavcodec/bgmc.c b/libavcodec/bgmc.c
index 1a6817b..361f7c5 100644
--- a/libavcodec/bgmc.c
+++ b/libavcodec/bgmc.c
@@ -485,12 +485,17 @@
 
 
 /** Initialize decoding and reads the first value */
-void ff_bgmc_decode_init(GetBitContext *gb, unsigned int *h,
+int ff_bgmc_decode_init(GetBitContext *gb, unsigned int *h,
                          unsigned int *l, unsigned int *v)
 {
+    if (get_bits_left(gb) < VALUE_BITS)
+        return AVERROR_INVALIDDATA;
+
     *h = TOP_VALUE;
     *l = 0;
-    *v = get_bits_long(gb, VALUE_BITS);
+    *v = get_bits(gb, VALUE_BITS);
+
+    return 0;
 }
 
 
diff --git a/libavcodec/bgmc.h b/libavcodec/bgmc.h
index 4893736..466df31 100644
--- a/libavcodec/bgmc.h
+++ b/libavcodec/bgmc.h
@@ -40,7 +40,7 @@
 void ff_bgmc_end(uint8_t **cf_lut, int **cf_lut_status);
 
 
-void ff_bgmc_decode_init(GetBitContext *gb,
+int ff_bgmc_decode_init(GetBitContext *gb,
                       unsigned int *h, unsigned int *l, unsigned int *v);
 
 
diff --git a/libavcodec/bink.c b/libavcodec/bink.c
index 9c17ded..f251ab4 100644
--- a/libavcodec/bink.c
+++ b/libavcodec/bink.c
@@ -241,16 +241,19 @@
  * @param gb   context for reading bits
  * @param tree pointer for storing tree data
  */
-static void read_tree(GetBitContext *gb, Tree *tree)
+static int read_tree(GetBitContext *gb, Tree *tree)
 {
     uint8_t tmp1[16] = { 0 }, tmp2[16], *in = tmp1, *out = tmp2;
     int i, t, len;
 
+    if (get_bits_left(gb) < 4)
+        return AVERROR_INVALIDDATA;
+
     tree->vlc_num = get_bits(gb, 4);
     if (!tree->vlc_num) {
         for (i = 0; i < 16; i++)
             tree->syms[i] = i;
-        return;
+        return 0;
     }
     if (get_bits1(gb)) {
         len = get_bits(gb, 3);
@@ -273,6 +276,7 @@
         }
         memcpy(tree->syms, in, 16);
     }
+    return 0;
 }
 
 /**
@@ -282,19 +286,27 @@
  * @param c           decoder context
  * @param bundle_num  number of the bundle to initialize
  */
-static void read_bundle(GetBitContext *gb, BinkContext *c, int bundle_num)
+static int read_bundle(GetBitContext *gb, BinkContext *c, int bundle_num)
 {
     int i;
 
     if (bundle_num == BINK_SRC_COLORS) {
-        for (i = 0; i < 16; i++)
-            read_tree(gb, &c->col_high[i]);
+        for (i = 0; i < 16; i++) {
+            int ret = read_tree(gb, &c->col_high[i]);
+            if (ret < 0)
+                return ret;
+        }
         c->col_lastval = 0;
     }
-    if (bundle_num != BINK_SRC_INTRA_DC && bundle_num != BINK_SRC_INTER_DC)
-        read_tree(gb, &c->bundle[bundle_num].tree);
+    if (bundle_num != BINK_SRC_INTRA_DC && bundle_num != BINK_SRC_INTER_DC) {
+        int ret = read_tree(gb, &c->bundle[bundle_num].tree);
+        if (ret < 0)
+            return ret;
+    }
     c->bundle[bundle_num].cur_dec =
     c->bundle[bundle_num].cur_ptr = c->bundle[bundle_num].data;
+
+    return 0;
 }
 
 /**
@@ -324,6 +336,8 @@
         av_log(avctx, AV_LOG_ERROR, "Run value went out of bounds\n");
         return AVERROR_INVALIDDATA;
     }
+    if (get_bits_left(gb) < 1)
+        return AVERROR_INVALIDDATA;
     if (get_bits1(gb)) {
         v = get_bits(gb, 4);
         memset(b->cur_dec, v, t);
@@ -346,6 +360,8 @@
         av_log(avctx, AV_LOG_ERROR, "Too many motion values\n");
         return AVERROR_INVALIDDATA;
     }
+    if (get_bits_left(gb) < 1)
+        return AVERROR_INVALIDDATA;
     if (get_bits1(gb)) {
         v = get_bits(gb, 4);
         if (v) {
@@ -389,6 +405,8 @@
         av_log(avctx, AV_LOG_ERROR, "Too many block type values\n");
         return AVERROR_INVALIDDATA;
     }
+    if (get_bits_left(gb) < 1)
+        return AVERROR_INVALIDDATA;
     if (get_bits1(gb)) {
         v = get_bits(gb, 4);
         memset(b->cur_dec, v, t);
@@ -424,6 +442,8 @@
         return AVERROR_INVALIDDATA;
     }
     while (b->cur_dec < dec_end) {
+        if (get_bits_left(gb) < 2)
+            return AVERROR_INVALIDDATA;
         v  = GET_HUFF(gb, b->tree);
         v |= GET_HUFF(gb, b->tree) << 4;
         *b->cur_dec++ = v;
@@ -443,6 +463,8 @@
         av_log(c->avctx, AV_LOG_ERROR, "Too many color values\n");
         return AVERROR_INVALIDDATA;
     }
+    if (get_bits_left(gb) < 1)
+        return AVERROR_INVALIDDATA;
     if (get_bits1(gb)) {
         c->col_lastval = GET_HUFF(gb, c->col_high[c->col_lastval]);
         v = GET_HUFF(gb, b->tree);
@@ -456,6 +478,8 @@
         b->cur_dec += t;
     } else {
         while (b->cur_dec < dec_end) {
+            if (get_bits_left(gb) < 2)
+                return AVERROR_INVALIDDATA;
             c->col_lastval = GET_HUFF(gb, c->col_high[c->col_lastval]);
             v = GET_HUFF(gb, b->tree);
             v = (c->col_lastval << 4) | v;
@@ -481,6 +505,8 @@
     int16_t *dst_end = (int16_t*)b->data_end;
 
     CHECK_READ_VAL(gb, b, len);
+    if (get_bits_left(gb) < start_bits - has_sign)
+        return AVERROR_INVALIDDATA;
     v = get_bits(gb, start_bits - has_sign);
     if (v && has_sign) {
         sign = -get_bits1(gb);
@@ -609,7 +635,7 @@
  * @param quant_matrices quantization matrices
  * @return 0 for success, negative value in other cases
  */
-static int read_dct_coeffs(GetBitContext *gb, int32_t block[64],
+static int read_dct_coeffs(BinkContext *c, GetBitContext *gb, int32_t block[64],
                            const uint8_t *scan, int *coef_count_,
                            int coef_idx[64], int q)
 {
@@ -620,6 +646,9 @@
     int coef_count = 0;
     int quant_idx;
 
+    if (get_bits_left(gb) < 4)
+        return AVERROR_INVALIDDATA;
+
     coef_list[list_end] = 4;  mode_list[list_end++] = 0;
     coef_list[list_end] = 24; mode_list[list_end++] = 0;
     coef_list[list_end] = 44; mode_list[list_end++] = 0;
@@ -692,7 +721,7 @@
     } else {
         quant_idx = q;
         if (quant_idx > 15U) {
-            av_log(NULL, AV_LOG_ERROR, "quant_index %d out of range\n", quant_idx);
+            av_log(c->avctx, AV_LOG_ERROR, "quant_index %d out of range\n", quant_idx);
             return AVERROR_INVALIDDATA;
         }
     }
@@ -702,15 +731,15 @@
     return quant_idx;
 }
 
-static void unquantize_dct_coeffs(int32_t block[64], const int32_t quant[64],
+static void unquantize_dct_coeffs(int32_t block[64], const uint32_t quant[64],
                                   int coef_count, int coef_idx[64],
                                   const uint8_t *scan)
 {
     int i;
-    block[0] = (block[0] * quant[0]) >> 11;
+    block[0] = (int)(block[0] * quant[0]) >> 11;
     for (i = 0; i < coef_count; i++) {
         int idx = coef_idx[i];
-        block[scan[idx]] = (block[scan[idx]] * quant[idx]) >> 11;
+        block[scan[idx]] = (int)(block[scan[idx]] * quant[idx]) >> 11;
     }
 }
 
@@ -885,7 +914,7 @@
                 memset(dctblock, 0, sizeof(*dctblock) * 64);
                 dctblock[0] = binkb_get_value(c, BINKB_SRC_INTRA_DC);
                 qp = binkb_get_value(c, BINKB_SRC_INTRA_Q);
-                if ((quant_idx = read_dct_coeffs(gb, dctblock, bink_scan, &coef_count, coef_idx, qp)) < 0)
+                if ((quant_idx = read_dct_coeffs(c, gb, dctblock, bink_scan, &coef_count, coef_idx, qp)) < 0)
                     return quant_idx;
                 unquantize_dct_coeffs(dctblock, binkb_intra_quant[quant_idx], coef_count, coef_idx, bink_scan);
                 c->binkdsp.idct_put(dst, stride, dctblock);
@@ -920,7 +949,7 @@
                 memset(dctblock, 0, sizeof(*dctblock) * 64);
                 dctblock[0] = binkb_get_value(c, BINKB_SRC_INTER_DC);
                 qp = binkb_get_value(c, BINKB_SRC_INTER_Q);
-                if ((quant_idx = read_dct_coeffs(gb, dctblock, bink_scan, &coef_count, coef_idx, qp)) < 0)
+                if ((quant_idx = read_dct_coeffs(c, gb, dctblock, bink_scan, &coef_count, coef_idx, qp)) < 0)
                     return quant_idx;
                 unquantize_dct_coeffs(dctblock, binkb_inter_quant[quant_idx], coef_count, coef_idx, bink_scan);
                 c->binkdsp.idct_add(dst, stride, dctblock);
@@ -1015,8 +1044,11 @@
     }
 
     init_lengths(c, FFMAX(width, 8), bw);
-    for (i = 0; i < BINK_NB_SRC; i++)
-        read_bundle(gb, c, i);
+    for (i = 0; i < BINK_NB_SRC; i++) {
+        ret = read_bundle(gb, c, i);
+        if (ret < 0)
+            return ret;
+    }
 
     ref_start = c->last->data[plane_idx] ? c->last->data[plane_idx]
                                          : frame->data[plane_idx];
@@ -1046,8 +1078,6 @@
         if ((ret = read_runs(c->avctx, gb, &c->bundle[BINK_SRC_RUN])) < 0)
             return ret;
 
-        if (by == bh)
-            break;
         dst  = frame->data[plane_idx]  + 8*by*stride;
         prev = (c->last->data[plane_idx] ? c->last->data[plane_idx]
                                          : frame->data[plane_idx]) + 8*by*stride;
@@ -1068,6 +1098,8 @@
                 blk = get_value(c, BINK_SRC_SUB_BLOCK_TYPES);
                 switch (blk) {
                 case RUN_BLOCK:
+                    if (get_bits_left(gb) < 4)
+                        return AVERROR_INVALIDDATA;
                     scan = bink_patterns[get_bits(gb, 4)];
                     i = 0;
                     do {
@@ -1093,7 +1125,7 @@
                 case INTRA_BLOCK:
                     memset(dctblock, 0, sizeof(*dctblock) * 64);
                     dctblock[0] = get_value(c, BINK_SRC_INTRA_DC);
-                    if ((quant_idx = read_dct_coeffs(gb, dctblock, bink_scan, &coef_count, coef_idx, -1)) < 0)
+                    if ((quant_idx = read_dct_coeffs(c, gb, dctblock, bink_scan, &coef_count, coef_idx, -1)) < 0)
                         return quant_idx;
                     unquantize_dct_coeffs(dctblock, bink_intra_quant[quant_idx], coef_count, coef_idx, bink_scan);
                     c->binkdsp.idct_put(ublock, 8, dctblock);
@@ -1168,7 +1200,7 @@
             case INTRA_BLOCK:
                 memset(dctblock, 0, sizeof(*dctblock) * 64);
                 dctblock[0] = get_value(c, BINK_SRC_INTRA_DC);
-                if ((quant_idx = read_dct_coeffs(gb, dctblock, bink_scan, &coef_count, coef_idx, -1)) < 0)
+                if ((quant_idx = read_dct_coeffs(c, gb, dctblock, bink_scan, &coef_count, coef_idx, -1)) < 0)
                     return quant_idx;
                 unquantize_dct_coeffs(dctblock, bink_intra_quant[quant_idx], coef_count, coef_idx, bink_scan);
                 c->binkdsp.idct_put(dst, stride, dctblock);
@@ -1184,7 +1216,7 @@
                     return ret;
                 memset(dctblock, 0, sizeof(*dctblock) * 64);
                 dctblock[0] = get_value(c, BINK_SRC_INTER_DC);
-                if ((quant_idx = read_dct_coeffs(gb, dctblock, bink_scan, &coef_count, coef_idx, -1)) < 0)
+                if ((quant_idx = read_dct_coeffs(c, gb, dctblock, bink_scan, &coef_count, coef_idx, -1)) < 0)
                     return quant_idx;
                 unquantize_dct_coeffs(dctblock, bink_inter_quant[quant_idx], coef_count, coef_idx, bink_scan);
                 c->binkdsp.idct_add(dst, stride, dctblock);
@@ -1229,7 +1261,7 @@
         if ((ret = ff_get_buffer(avctx, frame, AV_GET_BUFFER_FLAG_REF)) < 0)
             return ret;
     } else {
-        if ((ret = ff_reget_buffer(avctx, c->last)) < 0)
+        if ((ret = ff_reget_buffer(avctx, c->last, 0)) < 0)
             return ret;
         if ((ret = av_frame_ref(frame, c->last)) < 0)
             return ret;
@@ -1335,13 +1367,13 @@
     }
     c->avctx = avctx;
 
+    if ((ret = av_image_check_size(avctx->width, avctx->height, 0, avctx)) < 0)
+        return ret;
+
     c->last = av_frame_alloc();
     if (!c->last)
         return AVERROR(ENOMEM);
 
-    if ((ret = av_image_check_size(avctx->width, avctx->height, 0, avctx)) < 0)
-        return ret;
-
     avctx->pix_fmt = c->has_alpha ? AV_PIX_FMT_YUVA420P : AV_PIX_FMT_YUV420P;
     avctx->color_range = c->version == 'k' ? AVCOL_RANGE_JPEG : AVCOL_RANGE_MPEG;
 
diff --git a/libavcodec/binkaudio.c b/libavcodec/binkaudio.c
index e0f3d14..64a08b8 100644
--- a/libavcodec/binkaudio.c
+++ b/libavcodec/binkaudio.c
@@ -95,6 +95,8 @@
     if (avctx->codec->id == AV_CODEC_ID_BINKAUDIO_RDFT) {
         // audio is already interleaved for the RDFT format variant
         avctx->sample_fmt = AV_SAMPLE_FMT_FLT;
+        if (sample_rate > INT_MAX / avctx->channels)
+            return AVERROR_INVALIDDATA;
         sample_rate  *= avctx->channels;
         s->channels = 1;
         if (!s->version_b)
@@ -139,7 +141,7 @@
     else if (CONFIG_BINKAUDIO_DCT_DECODER)
         ff_dct_init(&s->trans.dct, frame_len_bits, DCT_III);
     else
-        return -1;
+        av_assert0(0);
 
     s->pkt = av_packet_alloc();
     if (!s->pkt)
@@ -151,7 +153,7 @@
 static float get_float(GetBitContext *gb)
 {
     int power = get_bits(gb, 5);
-    float f = ldexpf(get_bits_long(gb, 23), power - 23);
+    float f = ldexpf(get_bits(gb, 23), power - 23);
     if (get_bits1(gb))
         f = -f;
     return f;
diff --git a/libavcodec/binkdsp.c b/libavcodec/binkdsp.c
index 9d70e23..a357d31 100644
--- a/libavcodec/binkdsp.c
+++ b/libavcodec/binkdsp.c
@@ -33,20 +33,22 @@
 #define A3  3784
 #define A4 -5352
 
+#define MUL(X,Y) ((int)((unsigned)(X) * (Y)) >> 11)
+
 #define IDCT_TRANSFORM(dest,s0,s1,s2,s3,s4,s5,s6,s7,d0,d1,d2,d3,d4,d5,d6,d7,munge,src) {\
     const int a0 = (src)[s0] + (src)[s4]; \
     const int a1 = (src)[s0] - (src)[s4]; \
     const int a2 = (src)[s2] + (src)[s6]; \
-    const int a3 = (A1*((src)[s2] - (src)[s6])) >> 11; \
+    const int a3 = MUL(A1, (src)[s2] - (src)[s6]); \
     const int a4 = (src)[s5] + (src)[s3]; \
     const int a5 = (src)[s5] - (src)[s3]; \
     const int a6 = (src)[s1] + (src)[s7]; \
     const int a7 = (src)[s1] - (src)[s7]; \
     const int b0 = a4 + a6; \
-    const int b1 = (A3*(a5 + a7)) >> 11; \
-    const int b2 = ((A4*a5) >> 11) - b0 + b1; \
-    const int b3 = (A1*(a6 - a4) >> 11) - b2; \
-    const int b4 = ((A2*a7) >> 11) + b3 - b1; \
+    const int b1 = MUL(A3, a5 + a7); \
+    const int b2 = MUL(A4, a5) - b0 + b1; \
+    const int b3 = MUL(A1, a6 - a4) - b2; \
+    const int b4 = MUL(A2, a7) + b3 - b1; \
     (dest)[d0] = munge(a0+a2   +b0); \
     (dest)[d1] = munge(a1+a3-a2+b2); \
     (dest)[d2] = munge(a1-a3+a2+b3); \
diff --git a/libavcodec/bintext.c b/libavcodec/bintext.c
index d85f2c2..1aeed21 100644
--- a/libavcodec/bintext.c
+++ b/libavcodec/bintext.c
@@ -63,6 +63,10 @@
             av_log(avctx, AV_LOG_ERROR, "not enough extradata\n");
             return AVERROR_INVALIDDATA;
         }
+        if (!s->font_height) {
+            av_log(avctx, AV_LOG_ERROR, "invalid font height\n");
+            return AVERROR_INVALIDDATA;
+        }
     } else {
         s->font_height = 8;
         s->flags = 0;
@@ -93,8 +97,10 @@
             break;
         }
     }
-    if (avctx->width < FONT_WIDTH || avctx->height < s->font_height)
+    if (avctx->width < FONT_WIDTH || avctx->height < s->font_height) {
+        av_log(avctx, AV_LOG_ERROR, "Resolution too small for font.\n");
         return AVERROR_INVALIDDATA;
+    }
 
     return 0;
 }
diff --git a/libavcodec/bitstream.c b/libavcodec/bitstream.c
index ed528fe..be8a0f6 100644
--- a/libavcodec/bitstream.c
+++ b/libavcodec/bitstream.c
@@ -164,7 +164,7 @@
 
     table_size = 1 << table_nb_bits;
     if (table_nb_bits > 30)
-       return -1;
+       return AVERROR(EINVAL);
     table_index = alloc_table(vlc, table_size, flags & INIT_VLC_USE_NEW_STATIC);
     ff_dlog(NULL, "new table index=%d size=%d\n", table_index, table_size);
     if (table_index < 0)
@@ -188,8 +188,9 @@
             }
             for (k = 0; k < nb; k++) {
                 int bits = table[j][1];
+                int oldsym  = table[j][0];
                 ff_dlog(NULL, "%4x: code=%d n=%d\n", j, i, n);
-                if (bits != 0 && bits != n) {
+                if ((bits || oldsym) && (bits != n || oldsym != symbol)) {
                     av_log(NULL, AV_LOG_ERROR, "incorrect codes\n");
                     return AVERROR_INVALIDDATA;
                 }
@@ -226,6 +227,10 @@
             /* note: realloc has been done, so reload tables */
             table = (volatile VLC_TYPE (*)[2])&vlc->table[table_index];
             table[j][0] = index; //code
+            if (table[j][0] != index) {
+                avpriv_request_sample(NULL, "strange codes");
+                return AVERROR_PATCHWELCOME;
+            }
             i = k-1;
         }
     }
@@ -306,7 +311,7 @@
             av_log(NULL, AV_LOG_ERROR, "Too long VLC (%d) in init_vlc\n", buf[j].bits);\
             if (!(flags & INIT_VLC_USE_NEW_STATIC))                         \
                 av_free(buf);                                               \
-            return -1;                                                      \
+            return AVERROR(EINVAL);                                         \
         }                                                                   \
         GET_DATA(buf[j].code, codes, i, codes_wrap, codes_size);            \
         if (buf[j].code >= (1LL<<buf[j].bits)) {                            \
@@ -314,7 +319,7 @@
                    "init_vlc\n", buf[j].code, i);                           \
             if (!(flags & INIT_VLC_USE_NEW_STATIC))                         \
                 av_free(buf);                                               \
-            return -1;                                                      \
+            return AVERROR(EINVAL);                                         \
         }                                                                   \
         if (flags & INIT_VLC_LE)                                            \
             buf[j].code = bitswap_32(buf[j].code);                          \
diff --git a/libavcodec/bitstream_filters.c b/libavcodec/bitstream_filters.c
index 96b1746..6b5ffe4 100644
--- a/libavcodec/bitstream_filters.c
+++ b/libavcodec/bitstream_filters.c
@@ -25,6 +25,8 @@
 #include "bsf.h"
 
 extern const AVBitStreamFilter ff_aac_adtstoasc_bsf;
+extern const AVBitStreamFilter ff_av1_frame_merge_bsf;
+extern const AVBitStreamFilter ff_av1_frame_split_bsf;
 extern const AVBitStreamFilter ff_av1_metadata_bsf;
 extern const AVBitStreamFilter ff_chomp_bsf;
 extern const AVBitStreamFilter ff_dump_extradata_bsf;
@@ -47,9 +49,11 @@
 extern const AVBitStreamFilter ff_mov2textsub_bsf;
 extern const AVBitStreamFilter ff_noise_bsf;
 extern const AVBitStreamFilter ff_null_bsf;
+extern const AVBitStreamFilter ff_prores_metadata_bsf;
 extern const AVBitStreamFilter ff_remove_extradata_bsf;
 extern const AVBitStreamFilter ff_text2movsub_bsf;
 extern const AVBitStreamFilter ff_trace_headers_bsf;
+extern const AVBitStreamFilter ff_truehd_core_bsf;
 extern const AVBitStreamFilter ff_vp9_metadata_bsf;
 extern const AVBitStreamFilter ff_vp9_raw_reorder_bsf;
 extern const AVBitStreamFilter ff_vp9_superframe_bsf;
diff --git a/libavcodec/bmp.c b/libavcodec/bmp.c
index 65d239e..40010ac 100644
--- a/libavcodec/bmp.c
+++ b/libavcodec/bmp.c
@@ -291,7 +291,7 @@
         case 1:
             for (i = 0; i < avctx->height; i++) {
                 int j;
-                for (j = 0; j < n; j++) {
+                for (j = 0; j < avctx->width >> 3; j++) {
                     ptr[j*8+0] =  buf[j] >> 7;
                     ptr[j*8+1] = (buf[j] >> 6) & 1;
                     ptr[j*8+2] = (buf[j] >> 5) & 1;
@@ -301,6 +301,9 @@
                     ptr[j*8+6] = (buf[j] >> 1) & 1;
                     ptr[j*8+7] =  buf[j]       & 1;
                 }
+                for (j = 0; j < (avctx->width & 7); j++) {
+                    ptr[avctx->width - (avctx->width & 7) + j] = buf[avctx->width >> 3] >> (7 - j) & 1;
+                }
                 buf += n;
                 ptr += linesize;
             }
diff --git a/libavcodec/brenderpix.c b/libavcodec/brenderpix.c
index 0556858..46b7a59 100644
--- a/libavcodec/brenderpix.c
+++ b/libavcodec/brenderpix.c
@@ -204,6 +204,10 @@
         avpriv_request_sample(avctx, "Format %d", hdr.format);
         return AVERROR_PATCHWELCOME;
     }
+    bytes_per_scanline = bytes_pp * hdr.width;
+
+    if (bytestream2_get_bytes_left(&gb) < hdr.height * bytes_per_scanline)
+        return AVERROR_INVALIDDATA;
 
     if ((ret = ff_set_dimensions(avctx, hdr.width, hdr.height)) < 0)
         return ret;
@@ -261,7 +265,6 @@
     bytestream2_skip(&gb, 8);
 
     // read the image data to the buffer
-    bytes_per_scanline = bytes_pp * hdr.width;
     bytes_left = bytestream2_get_bytes_left(&gb);
 
     if (chunk_type != IMAGE_DATA_CHUNK || data_len != bytes_left ||
diff --git a/libavcodec/bsf.c b/libavcodec/bsf.c
index 03841da..68fee82 100644
--- a/libavcodec/bsf.c
+++ b/libavcodec/bsf.c
@@ -18,6 +18,7 @@
 
 #include <string.h>
 
+#include "libavutil/avassert.h"
 #include "libavutil/log.h"
 #include "libavutil/mem.h"
 #include "libavutil/opt.h"
@@ -27,6 +28,8 @@
 #include "avcodec.h"
 #include "bsf.h"
 
+#define IS_EMPTY(pkt) (!(pkt)->data && !(pkt)->side_data_elems)
+
 struct AVBSFInternal {
     AVPacket *buffer_pkt;
     int eof;
@@ -45,9 +48,8 @@
     if (ctx->filter->priv_class && ctx->priv_data)
         av_opt_free(ctx->priv_data);
 
-    av_opt_free(ctx);
-
-    av_packet_free(&ctx->internal->buffer_pkt);
+    if (ctx->internal)
+        av_packet_free(&ctx->internal->buffer_pkt);
     av_freep(&ctx->internal);
     av_freep(&ctx->priv_data);
 
@@ -65,12 +67,18 @@
     return NULL;
 }
 
+static const char *bsf_to_name(void *bsf)
+{
+    return ((AVBSFContext *)bsf)->filter->name;
+}
+
 static const AVClass bsf_class = {
     .class_name       = "AVBSFContext",
-    .item_name        = av_default_item_name,
+    .item_name        = bsf_to_name,
     .version          = LIBAVUTIL_VERSION_INT,
     .child_next       = bsf_child_next,
     .child_class_next = ff_bsf_child_class_next,
+    .category         = AV_CLASS_CATEGORY_BITSTREAM_FILTER,
 };
 
 const AVClass *av_bsf_get_class(void)
@@ -81,6 +89,7 @@
 int av_bsf_alloc(const AVBitStreamFilter *filter, AVBSFContext **pctx)
 {
     AVBSFContext *ctx;
+    AVBSFInternal *bsfi;
     int ret;
 
     ctx = av_mallocz(sizeof(*ctx));
@@ -97,20 +106,19 @@
         goto fail;
     }
 
-    ctx->internal = av_mallocz(sizeof(*ctx->internal));
-    if (!ctx->internal) {
+    bsfi = av_mallocz(sizeof(*bsfi));
+    if (!bsfi) {
         ret = AVERROR(ENOMEM);
         goto fail;
     }
+    ctx->internal = bsfi;
 
-    ctx->internal->buffer_pkt = av_packet_alloc();
-    if (!ctx->internal->buffer_pkt) {
+    bsfi->buffer_pkt = av_packet_alloc();
+    if (!bsfi->buffer_pkt) {
         ret = AVERROR(ENOMEM);
         goto fail;
     }
 
-    av_opt_set_defaults(ctx);
-
     /* allocate priv data and init private options */
     if (filter->priv_data_size) {
         ctx->priv_data = av_mallocz(filter->priv_data_size);
@@ -174,9 +182,11 @@
 
 void av_bsf_flush(AVBSFContext *ctx)
 {
-    ctx->internal->eof = 0;
+    AVBSFInternal *bsfi = ctx->internal;
 
-    av_packet_unref(ctx->internal->buffer_pkt);
+    bsfi->eof = 0;
+
+    av_packet_unref(bsfi->buffer_pkt);
 
     if (ctx->filter->flush)
         ctx->filter->flush(ctx);
@@ -184,26 +194,26 @@
 
 int av_bsf_send_packet(AVBSFContext *ctx, AVPacket *pkt)
 {
+    AVBSFInternal *bsfi = ctx->internal;
     int ret;
 
-    if (!pkt || (!pkt->data && !pkt->side_data_elems)) {
-        ctx->internal->eof = 1;
+    if (!pkt || IS_EMPTY(pkt)) {
+        bsfi->eof = 1;
         return 0;
     }
 
-    if (ctx->internal->eof) {
+    if (bsfi->eof) {
         av_log(ctx, AV_LOG_ERROR, "A non-NULL packet sent after an EOF.\n");
         return AVERROR(EINVAL);
     }
 
-    if (ctx->internal->buffer_pkt->data ||
-        ctx->internal->buffer_pkt->side_data_elems)
+    if (!IS_EMPTY(bsfi->buffer_pkt))
         return AVERROR(EAGAIN);
 
     ret = av_packet_make_refcounted(pkt);
     if (ret < 0)
         return ret;
-    av_packet_move_ref(ctx->internal->buffer_pkt, pkt);
+    av_packet_move_ref(bsfi->buffer_pkt, pkt);
 
     return 0;
 }
@@ -215,38 +225,36 @@
 
 int ff_bsf_get_packet(AVBSFContext *ctx, AVPacket **pkt)
 {
-    AVBSFInternal *in = ctx->internal;
+    AVBSFInternal *bsfi = ctx->internal;
     AVPacket *tmp_pkt;
 
-    if (in->eof)
+    if (bsfi->eof)
         return AVERROR_EOF;
 
-    if (!ctx->internal->buffer_pkt->data &&
-        !ctx->internal->buffer_pkt->side_data_elems)
+    if (IS_EMPTY(bsfi->buffer_pkt))
         return AVERROR(EAGAIN);
 
     tmp_pkt = av_packet_alloc();
     if (!tmp_pkt)
         return AVERROR(ENOMEM);
 
-    *pkt = ctx->internal->buffer_pkt;
-    ctx->internal->buffer_pkt = tmp_pkt;
+    *pkt = bsfi->buffer_pkt;
+    bsfi->buffer_pkt = tmp_pkt;
 
     return 0;
 }
 
 int ff_bsf_get_packet_ref(AVBSFContext *ctx, AVPacket *pkt)
 {
-    AVBSFInternal *in = ctx->internal;
+    AVBSFInternal *bsfi = ctx->internal;
 
-    if (in->eof)
+    if (bsfi->eof)
         return AVERROR_EOF;
 
-    if (!ctx->internal->buffer_pkt->data &&
-        !ctx->internal->buffer_pkt->side_data_elems)
+    if (IS_EMPTY(bsfi->buffer_pkt))
         return AVERROR(EAGAIN);
 
-    av_packet_move_ref(pkt, ctx->internal->buffer_pkt);
+    av_packet_move_ref(pkt, bsfi->buffer_pkt);
 
     return 0;
 }
@@ -258,7 +266,6 @@
     int nb_bsfs;
 
     unsigned idx;           // index of currently processed BSF
-    unsigned flushed_idx;   // index of BSF being flushed
 
     char * item_name;
 } BSFListContext;
@@ -296,58 +303,52 @@
 static int bsf_list_filter(AVBSFContext *bsf, AVPacket *out)
 {
     BSFListContext *lst = bsf->priv_data;
-    int ret;
+    int ret, eof = 0;
 
     if (!lst->nb_bsfs)
         return ff_bsf_get_packet_ref(bsf, out);
 
     while (1) {
-        if (lst->idx > lst->flushed_idx) {
+        /* get a packet from the previous filter up the chain */
+        if (lst->idx)
             ret = av_bsf_receive_packet(lst->bsfs[lst->idx-1], out);
-            if (ret == AVERROR(EAGAIN)) {
-                /* no more packets from idx-1, try with previous */
-                ret = 0;
-                lst->idx--;
-                continue;
-            } else if (ret == AVERROR_EOF) {
-                /* filter idx-1 is done, continue with idx...nb_bsfs */
-                lst->flushed_idx = lst->idx;
-                continue;
-            }else if (ret < 0) {
-                /* filtering error */
-                break;
-            }
-        } else {
+        else
             ret = ff_bsf_get_packet_ref(bsf, out);
-            if (ret == AVERROR_EOF) {
-                lst->idx = lst->flushed_idx;
-            } else if (ret < 0)
-                break;
-        }
+        if (ret == AVERROR(EAGAIN)) {
+            if (!lst->idx)
+                return ret;
+            lst->idx--;
+            continue;
+        } else if (ret == AVERROR_EOF) {
+            eof = 1;
+        } else if (ret < 0)
+            return ret;
 
+        /* send it to the next filter down the chain */
         if (lst->idx < lst->nb_bsfs) {
-            AVPacket *pkt;
-            if (ret == AVERROR_EOF && lst->idx == lst->flushed_idx) {
-                /* ff_bsf_get_packet_ref returned EOF and idx is first
-                 * filter of yet not flushed filter chain */
-                pkt = NULL;
-            } else {
-                pkt = out;
+            ret = av_bsf_send_packet(lst->bsfs[lst->idx], eof ? NULL : out);
+            av_assert1(ret != AVERROR(EAGAIN));
+            if (ret < 0) {
+                av_packet_unref(out);
+                return ret;
             }
-            ret = av_bsf_send_packet(lst->bsfs[lst->idx], pkt);
-            if (ret < 0)
-                break;
             lst->idx++;
+            eof = 0;
+        } else if (eof) {
+            return ret;
         } else {
-            /* The end of filter chain, break to return result */
-            break;
+            return 0;
         }
     }
+}
 
-    if (ret < 0)
-        av_packet_unref(out);
+static void bsf_list_flush(AVBSFContext *bsf)
+{
+    BSFListContext *lst = bsf->priv_data;
 
-    return ret;
+    for (int i = 0; i < lst->nb_bsfs; i++)
+        av_bsf_flush(lst->bsfs[i]);
+    lst->idx = 0;
 }
 
 static void bsf_list_close(AVBSFContext *bsf)
@@ -398,6 +399,7 @@
         .priv_class     = &bsf_list_class,
         .init           = bsf_list_init,
         .filter         = bsf_list_filter,
+        .flush          = bsf_list_flush,
         .close          = bsf_list_close,
 };
 
@@ -507,8 +509,8 @@
 
     ret = av_bsf_list_append2(bsf_lst, bsf_name, &bsf_options);
 
-    av_dict_free(&bsf_options);
 end:
+    av_dict_free(&bsf_options);
     av_free(buf);
     return ret;
 }
diff --git a/libavcodec/bytestream.h b/libavcodec/bytestream.h
index 7be7fc2..0516a6e 100644
--- a/libavcodec/bytestream.h
+++ b/libavcodec/bytestream.h
@@ -151,12 +151,12 @@
     p->eof          = 0;
 }
 
-static av_always_inline unsigned int bytestream2_get_bytes_left(GetByteContext *g)
+static av_always_inline int bytestream2_get_bytes_left(GetByteContext *g)
 {
     return g->buffer_end - g->buffer;
 }
 
-static av_always_inline unsigned int bytestream2_get_bytes_left_p(PutByteContext *p)
+static av_always_inline int bytestream2_get_bytes_left_p(PutByteContext *p)
 {
     return p->buffer_end - p->buffer;
 }
diff --git a/libavcodec/c93.c b/libavcodec/c93.c
index b708659..e180815 100644
--- a/libavcodec/c93.c
+++ b/libavcodec/c93.c
@@ -138,7 +138,7 @@
 
     c93->currentpic ^= 1;
 
-    if ((ret = ff_reget_buffer(avctx, newpic)) < 0)
+    if ((ret = ff_reget_buffer(avctx, newpic, 0)) < 0)
         return ret;
 
     stride = newpic->linesize[0];
diff --git a/libavcodec/cabac.c b/libavcodec/cabac.c
index e51139d..54e9bb4 100644
--- a/libavcodec/cabac.c
+++ b/libavcodec/cabac.c
@@ -27,7 +27,6 @@
 #include <string.h>
 
 #include "libavutil/common.h"
-#include "libavutil/timer.h"
 
 #include "cabac.h"
 #include "cabac_functions.h"
diff --git a/libavcodec/cavsdec.c b/libavcodec/cavsdec.c
index c7fff67..aaed807 100644
--- a/libavcodec/cavsdec.c
+++ b/libavcodec/cavsdec.c
@@ -591,14 +591,21 @@
 }
 
 
-static inline void decode_residual_chroma(AVSContext *h)
+static inline int decode_residual_chroma(AVSContext *h)
 {
-    if (h->cbp & (1 << 4))
-        decode_residual_block(h, &h->gb, chroma_dec, 0,
+    if (h->cbp & (1 << 4)) {
+        int ret = decode_residual_block(h, &h->gb, chroma_dec, 0,
                               ff_cavs_chroma_qp[h->qp], h->cu, h->c_stride);
-    if (h->cbp & (1 << 5))
-        decode_residual_block(h, &h->gb, chroma_dec, 0,
+        if (ret < 0)
+            return ret;
+    }
+    if (h->cbp & (1 << 5)) {
+        int ret = decode_residual_block(h, &h->gb, chroma_dec, 0,
                               ff_cavs_chroma_qp[h->qp], h->cv, h->c_stride);
+        if (ret < 0)
+            return ret;
+    }
+    return 0;
 }
 
 static inline int decode_residual_inter(AVSContext *h)
@@ -649,6 +656,7 @@
     uint8_t top[18];
     uint8_t *left = NULL;
     uint8_t *d;
+    int ret;
 
     ff_cavs_init_mb(h);
 
@@ -692,8 +700,11 @@
         ff_cavs_load_intra_pred_luma(h, top, &left, block);
         h->intra_pred_l[h->pred_mode_Y[scan3x3[block]]]
             (d, top, left, h->l_stride);
-        if (h->cbp & (1<<block))
-            decode_residual_block(h, gb, intra_dec, 1, h->qp, d, h->l_stride);
+        if (h->cbp & (1<<block)) {
+            ret = decode_residual_block(h, gb, intra_dec, 1, h->qp, d, h->l_stride);
+            if (ret < 0)
+                return ret;
+        }
     }
 
     /* chroma intra prediction */
@@ -703,7 +714,9 @@
     h->intra_pred_c[pred_mode_uv](h->cv, &h->top_border_v[h->mbx * 10],
                                   h->left_border_v, h->c_stride);
 
-    decode_residual_chroma(h);
+    ret = decode_residual_chroma(h);
+    if (ret < 0)
+        return ret;
     ff_cavs_filter(h, I_8X8);
     set_mv_intra(h);
     return 0;
@@ -1088,11 +1101,20 @@
         do {
             if (check_for_slice(h))
                 skip_count = -1;
-            if (h->skip_mode_flag && (skip_count < 0))
+            if (h->skip_mode_flag && (skip_count < 0)) {
+                if (get_bits_left(&h->gb) < 1) {
+                    ret = AVERROR_INVALIDDATA;
+                    break;
+                }
                 skip_count = get_ue_golomb(&h->gb);
+            }
             if (h->skip_mode_flag && skip_count--) {
                 decode_mb_p(h, P_SKIP);
             } else {
+                if (get_bits_left(&h->gb) < 1) {
+                    ret = AVERROR_INVALIDDATA;
+                    break;
+                }
                 mb_type = get_ue_golomb(&h->gb) + P_SKIP + h->skip_mode_flag;
                 if (mb_type > P_8X8)
                     ret = decode_mb_i(h, mb_type - P_8X8 - 1);
@@ -1106,11 +1128,20 @@
         do {
             if (check_for_slice(h))
                 skip_count = -1;
-            if (h->skip_mode_flag && (skip_count < 0))
+            if (h->skip_mode_flag && (skip_count < 0)) {
+                if (get_bits_left(&h->gb) < 1) {
+                    ret = AVERROR_INVALIDDATA;
+                    break;
+                }
                 skip_count = get_ue_golomb(&h->gb);
+            }
             if (h->skip_mode_flag && skip_count--) {
                 ret = decode_mb_b(h, B_SKIP);
             } else {
+                if (get_bits_left(&h->gb) < 1) {
+                    ret = AVERROR_INVALIDDATA;
+                    break;
+                }
                 mb_type = get_ue_golomb(&h->gb) + B_SKIP + h->skip_mode_flag;
                 if (mb_type > B_8X8)
                     ret = decode_mb_i(h, mb_type - B_8X8 - 1);
@@ -1202,6 +1233,7 @@
     int input_size, ret;
     const uint8_t *buf_end;
     const uint8_t *buf_ptr;
+    int frame_start = 0;
 
     if (buf_size == 0) {
         if (!h->low_delay && h->DPB[0].f->data[0]) {
@@ -1235,6 +1267,9 @@
                 h->got_keyframe = 1;
             }
         case PIC_PB_START_CODE:
+            if (frame_start > 1)
+                return AVERROR_INVALIDDATA;
+            frame_start ++;
             if (*got_frame)
                 av_frame_unref(data);
             *got_frame = 0;
diff --git a/libavcodec/cavsdsp.c b/libavcodec/cavsdsp.c
index 90a67e9..ba92121 100644
--- a/libavcodec/cavsdsp.c
+++ b/libavcodec/cavsdsp.c
@@ -201,20 +201,20 @@
     src[0][0] += 8;
 
     for( i = 0; i < 8; i++ ) {
-        const int a0 =  3*src[i][1] - (src[i][7]<<1);
-        const int a1 =  3*src[i][3] + (src[i][5]<<1);
-        const int a2 =  (src[i][3]<<1) - 3*src[i][5];
-        const int a3 =  (src[i][1]<<1) + 3*src[i][7];
+        const int a0 = 3 * src[i][1] - 2 * src[i][7];
+        const int a1 = 3 * src[i][3] + 2 * src[i][5];
+        const int a2 = 2 * src[i][3] - 3 * src[i][5];
+        const int a3 = 2 * src[i][1] + 3 * src[i][7];
 
-        const int b4 = ((a0 + a1 + a3)<<1) + a1;
-        const int b5 = ((a0 - a1 + a2)<<1) + a0;
-        const int b6 = ((a3 - a2 - a1)<<1) + a3;
-        const int b7 = ((a0 - a2 - a3)<<1) - a2;
+        const int b4 = 2 * (a0 + a1 + a3) + a1;
+        const int b5 = 2 * (a0 - a1 + a2) + a0;
+        const int b6 = 2 * (a3 - a2 - a1) + a3;
+        const int b7 = 2 * (a0 - a2 - a3) - a2;
 
-        const int a7 = (src[i][2]<<2) - 10*src[i][6];
-        const int a6 = (src[i][6]<<2) + 10*src[i][2];
-        const int a5 = ((src[i][0] - src[i][4]) << 3) + 4;
-        const int a4 = ((src[i][0] + src[i][4]) << 3) + 4;
+        const int a7 = 4 * src[i][2] - 10 * src[i][6];
+        const int a6 = 4 * src[i][6] + 10 * src[i][2];
+        const int a5 = 8 * (src[i][0] - src[i][4]) + 4;
+        const int a4 = 8 * (src[i][0] + src[i][4]) + 4;
 
         const int b0 = a4 + a6;
         const int b1 = a5 + a7;
@@ -231,20 +231,20 @@
         src[i][7] = (b0 - b4) >> 3;
     }
     for( i = 0; i < 8; i++ ) {
-        const int a0 =  3*src[1][i] - (src[7][i]<<1);
-        const int a1 =  3*src[3][i] + (src[5][i]<<1);
-        const int a2 =  (src[3][i]<<1) - 3*src[5][i];
-        const int a3 =  (src[1][i]<<1) + 3*src[7][i];
+        const int a0 = 3 * src[1][i] - 2 * src[7][i];
+        const int a1 = 3 * src[3][i] + 2 * src[5][i];
+        const int a2 = 2 * src[3][i] - 3 * src[5][i];
+        const int a3 = 2 * src[1][i] + 3 * src[7][i];
 
-        const int b4 = ((a0 + a1 + a3)<<1) + a1;
-        const int b5 = ((a0 - a1 + a2)<<1) + a0;
-        const int b6 = ((a3 - a2 - a1)<<1) + a3;
-        const int b7 = ((a0 - a2 - a3)<<1) - a2;
+        const int b4 = 2 * (a0 + a1 + a3) + a1;
+        const int b5 = 2 * (a0 - a1 + a2) + a0;
+        const int b6 = 2 * (a3 - a2 - a1) + a3;
+        const int b7 = 2 * (a0 - a2 - a3) - a2;
 
-        const int a7 = (src[2][i]<<2) - 10*src[6][i];
-        const int a6 = (src[6][i]<<2) + 10*src[2][i];
-        const int a5 = (src[0][i] - src[4][i]) << 3;
-        const int a4 = (src[0][i] + src[4][i]) << 3;
+        const int a7 = 4 * src[2][i] - 10 * src[6][i];
+        const int a6 = 4 * src[6][i] + 10 * src[2][i];
+        const int a5 = 8 * (src[0][i] - src[4][i]);
+        const int a4 = 8 * (src[0][i] + src[4][i]);
 
         const int b0 = a4 + a6;
         const int b1 = a5 + a7;
diff --git a/libavcodec/cbs.c b/libavcodec/cbs.c
index ecbf57c..0bd5e1a 100644
--- a/libavcodec/cbs.c
+++ b/libavcodec/cbs.c
@@ -95,10 +95,12 @@
     ctx->log_ctx = log_ctx;
     ctx->codec   = type;
 
-    ctx->priv_data = av_mallocz(ctx->codec->priv_data_size);
-    if (!ctx->priv_data) {
-        av_freep(&ctx);
-        return AVERROR(ENOMEM);
+    if (type->priv_data_size) {
+        ctx->priv_data = av_mallocz(ctx->codec->priv_data_size);
+        if (!ctx->priv_data) {
+            av_freep(&ctx);
+            return AVERROR(ENOMEM);
+        }
     }
 
     ctx->decompose_unit_types = NULL;
@@ -120,6 +122,7 @@
     if (ctx->codec && ctx->codec->close)
         ctx->codec->close(ctx);
 
+    av_freep(&ctx->write_buffer);
     av_freep(&ctx->priv_data);
     av_freep(ctx_ptr);
 }
@@ -136,14 +139,13 @@
     unit->data_bit_padding = 0;
 }
 
-void ff_cbs_fragment_uninit(CodedBitstreamContext *ctx,
-                            CodedBitstreamFragment *frag)
+void ff_cbs_fragment_reset(CodedBitstreamContext *ctx,
+                           CodedBitstreamFragment *frag)
 {
     int i;
 
     for (i = 0; i < frag->nb_units; i++)
         cbs_unit_uninit(ctx, &frag->units[i]);
-    av_freep(&frag->units);
     frag->nb_units = 0;
 
     av_buffer_unref(&frag->data_ref);
@@ -152,6 +154,15 @@
     frag->data_bit_padding = 0;
 }
 
+void ff_cbs_fragment_free(CodedBitstreamContext *ctx,
+                          CodedBitstreamFragment *frag)
+{
+    ff_cbs_fragment_reset(ctx, frag);
+
+    av_freep(&frag->units);
+    frag->nb_units_allocated = 0;
+}
+
 static int cbs_read_fragment_content(CodedBitstreamContext *ctx,
                                      CodedBitstreamFragment *frag)
 {
@@ -216,8 +227,6 @@
 {
     int err;
 
-    memset(frag, 0, sizeof(*frag));
-
     err = cbs_fill_fragment_data(ctx, frag, par->extradata,
                                  par->extradata_size);
     if (err < 0)
@@ -236,8 +245,6 @@
 {
     int err;
 
-    memset(frag, 0, sizeof(*frag));
-
     if (pkt->buf) {
         frag->data_ref = av_buffer_ref(pkt->buf);
         if (!frag->data_ref)
@@ -265,8 +272,6 @@
 {
     int err;
 
-    memset(frag, 0, sizeof(*frag));
-
     err = cbs_fill_fragment_data(ctx, frag, data, size);
     if (err < 0)
         return err;
@@ -278,6 +283,59 @@
     return cbs_read_fragment_content(ctx, frag);
 }
 
+static int cbs_write_unit_data(CodedBitstreamContext *ctx,
+                               CodedBitstreamUnit *unit)
+{
+    PutBitContext pbc;
+    int ret;
+
+    if (!ctx->write_buffer) {
+        // Initial write buffer size is 1MB.
+        ctx->write_buffer_size = 1024 * 1024;
+
+    reallocate_and_try_again:
+        ret = av_reallocp(&ctx->write_buffer, ctx->write_buffer_size);
+        if (ret < 0) {
+            av_log(ctx->log_ctx, AV_LOG_ERROR, "Unable to allocate a "
+                   "sufficiently large write buffer (last attempt "
+                   "%"SIZE_SPECIFIER" bytes).\n", ctx->write_buffer_size);
+            return ret;
+        }
+    }
+
+    init_put_bits(&pbc, ctx->write_buffer, ctx->write_buffer_size);
+
+    ret = ctx->codec->write_unit(ctx, unit, &pbc);
+    if (ret < 0) {
+        if (ret == AVERROR(ENOSPC)) {
+            // Overflow.
+            if (ctx->write_buffer_size == INT_MAX / 8)
+                return AVERROR(ENOMEM);
+            ctx->write_buffer_size = FFMIN(2 * ctx->write_buffer_size, INT_MAX / 8);
+            goto reallocate_and_try_again;
+        }
+        // Write failed for some other reason.
+        return ret;
+    }
+
+    // Overflow but we didn't notice.
+    av_assert0(put_bits_count(&pbc) <= 8 * ctx->write_buffer_size);
+
+    if (put_bits_count(&pbc) % 8)
+        unit->data_bit_padding = 8 - put_bits_count(&pbc) % 8;
+    else
+        unit->data_bit_padding = 0;
+
+    flush_put_bits(&pbc);
+
+    ret = ff_cbs_alloc_unit_data(ctx, unit, put_bits_count(&pbc) / 8);
+    if (ret < 0)
+        return ret;
+
+    memcpy(unit->data, ctx->write_buffer, unit->data_size);
+
+    return 0;
+}
 
 int ff_cbs_write_fragment_data(CodedBitstreamContext *ctx,
                                CodedBitstreamFragment *frag)
@@ -293,7 +351,7 @@
         av_buffer_unref(&unit->data_ref);
         unit->data = NULL;
 
-        err = ctx->codec->write_unit(ctx, unit);
+        err = cbs_write_unit_data(ctx, unit);
         if (err < 0) {
             av_log(ctx->log_ctx, AV_LOG_ERROR, "Failed to write unit %d "
                    "(type %"PRIu32").\n", i, unit->type);
@@ -355,7 +413,8 @@
     if (!buf)
         return AVERROR(ENOMEM);
 
-    av_init_packet(pkt);
+    av_buffer_unref(&pkt->buf);
+
     pkt->buf  = buf;
     pkt->data = frag->data;
     pkt->size = frag->data_size;
@@ -502,6 +561,85 @@
     return 0;
 }
 
+int ff_cbs_read_signed(CodedBitstreamContext *ctx, GetBitContext *gbc,
+                       int width, const char *name,
+                       const int *subscripts, int32_t *write_to,
+                       int32_t range_min, int32_t range_max)
+{
+    int32_t value;
+    int position;
+
+    av_assert0(width > 0 && width <= 32);
+
+    if (get_bits_left(gbc) < width) {
+        av_log(ctx->log_ctx, AV_LOG_ERROR, "Invalid value at "
+               "%s: bitstream ended.\n", name);
+        return AVERROR_INVALIDDATA;
+    }
+
+    if (ctx->trace_enable)
+        position = get_bits_count(gbc);
+
+    value = get_sbits_long(gbc, width);
+
+    if (ctx->trace_enable) {
+        char bits[33];
+        int i;
+        for (i = 0; i < width; i++)
+            bits[i] = value & (1U << (width - i - 1)) ? '1' : '0';
+        bits[i] = 0;
+
+        ff_cbs_trace_syntax_element(ctx, position, name, subscripts,
+                                    bits, value);
+    }
+
+    if (value < range_min || value > range_max) {
+        av_log(ctx->log_ctx, AV_LOG_ERROR, "%s out of range: "
+               "%"PRId32", but must be in [%"PRId32",%"PRId32"].\n",
+               name, value, range_min, range_max);
+        return AVERROR_INVALIDDATA;
+    }
+
+    *write_to = value;
+    return 0;
+}
+
+int ff_cbs_write_signed(CodedBitstreamContext *ctx, PutBitContext *pbc,
+                        int width, const char *name,
+                        const int *subscripts, int32_t value,
+                        int32_t range_min, int32_t range_max)
+{
+    av_assert0(width > 0 && width <= 32);
+
+    if (value < range_min || value > range_max) {
+        av_log(ctx->log_ctx, AV_LOG_ERROR, "%s out of range: "
+               "%"PRId32", but must be in [%"PRId32",%"PRId32"].\n",
+               name, value, range_min, range_max);
+        return AVERROR_INVALIDDATA;
+    }
+
+    if (put_bits_left(pbc) < width)
+        return AVERROR(ENOSPC);
+
+    if (ctx->trace_enable) {
+        char bits[33];
+        int i;
+        for (i = 0; i < width; i++)
+            bits[i] = value & (1U << (width - i - 1)) ? '1' : '0';
+        bits[i] = 0;
+
+        ff_cbs_trace_syntax_element(ctx, put_bits_count(pbc),
+                                    name, subscripts, bits, value);
+    }
+
+    if (width < 32)
+        put_sbits(pbc, width, value);
+    else
+        put_bits32(pbc, value);
+
+    return 0;
+}
+
 
 int ff_cbs_alloc_unit_content(CodedBitstreamContext *ctx,
                               CodedBitstreamUnit *unit,
@@ -515,7 +653,7 @@
         return AVERROR(ENOMEM);
 
     unit->content_ref = av_buffer_create(unit->content, size,
-                                         free, ctx, 0);
+                                         free, NULL, 0);
     if (!unit->content_ref) {
         av_freep(&unit->content);
         return AVERROR(ENOMEM);
@@ -548,20 +686,34 @@
 {
     CodedBitstreamUnit *units;
 
-    units = av_malloc_array(frag->nb_units + 1, sizeof(*units));
-    if (!units)
-        return AVERROR(ENOMEM);
+    if (frag->nb_units < frag->nb_units_allocated) {
+        units = frag->units;
 
-    if (position > 0)
-        memcpy(units, frag->units, position * sizeof(*units));
-    if (position < frag->nb_units)
-        memcpy(units + position + 1, frag->units + position,
-               (frag->nb_units - position) * sizeof(*units));
+        if (position < frag->nb_units)
+            memmove(units + position + 1, units + position,
+                    (frag->nb_units - position) * sizeof(*units));
+    } else {
+        units = av_malloc_array(frag->nb_units + 1, sizeof(*units));
+        if (!units)
+            return AVERROR(ENOMEM);
+
+        ++frag->nb_units_allocated;
+
+        if (position > 0)
+            memcpy(units, frag->units, position * sizeof(*units));
+
+        if (position < frag->nb_units)
+            memcpy(units + position + 1, frag->units + position,
+                   (frag->nb_units - position) * sizeof(*units));
+    }
 
     memset(units + position, 0, sizeof(*units));
 
-    av_freep(&frag->units);
-    frag->units = units;
+    if (units != frag->units) {
+        av_free(frag->units);
+        frag->units = units;
+    }
+
     ++frag->nb_units;
 
     return 0;
@@ -623,8 +775,11 @@
         data_ref = av_buffer_ref(data_buf);
     else
         data_ref = av_buffer_create(data, data_size, NULL, NULL, 0);
-    if (!data_ref)
+    if (!data_ref) {
+        if (!data_buf)
+            av_free(data);
         return AVERROR(ENOMEM);
+    }
 
     err = cbs_insert_unit(ctx, frag, position);
     if (err < 0) {
@@ -641,27 +796,19 @@
     return 0;
 }
 
-int ff_cbs_delete_unit(CodedBitstreamContext *ctx,
-                       CodedBitstreamFragment *frag,
-                       int position)
+void ff_cbs_delete_unit(CodedBitstreamContext *ctx,
+                        CodedBitstreamFragment *frag,
+                        int position)
 {
-    if (position < 0 || position >= frag->nb_units)
-        return AVERROR(EINVAL);
+    av_assert0(0 <= position && position < frag->nb_units
+                             && "Unit to be deleted not in fragment.");
 
     cbs_unit_uninit(ctx, &frag->units[position]);
 
     --frag->nb_units;
 
-    if (frag->nb_units == 0) {
-        av_freep(&frag->units);
-
-    } else {
+    if (frag->nb_units > 0)
         memmove(frag->units + position,
                 frag->units + position + 1,
                 (frag->nb_units - position) * sizeof(*frag->units));
-
-        // Don't bother reallocating the unit array.
-    }
-
-    return 0;
 }
diff --git a/libavcodec/cbs.h b/libavcodec/cbs.h
index 53ac360..9ca1fbd 100644
--- a/libavcodec/cbs.h
+++ b/libavcodec/cbs.h
@@ -145,10 +145,19 @@
      * and has not been decomposed.
      */
     int              nb_units;
+
     /**
-     * Pointer to an array of units of length nb_units.
+     * Number of allocated units.
      *
-     * Must be NULL if nb_units is zero.
+     * Must always be >= nb_units; designed for internal use by cbs.
+     */
+     int             nb_units_allocated;
+
+    /**
+     * Pointer to an array of units of length nb_units_allocated.
+     * Only the first nb_units are valid.
+     *
+     * Must be NULL if nb_units_allocated is zero.
      */
     CodedBitstreamUnit *units;
 } CodedBitstreamFragment;
@@ -201,6 +210,13 @@
      * From AV_LOG_*; defaults to AV_LOG_TRACE.
      */
     int trace_level;
+
+    /**
+     * Write buffer. Used as intermediate buffer when writing units.
+     * For internal use of cbs only.
+     */
+    uint8_t *write_buffer;
+    size_t   write_buffer_size;
 } CodedBitstreamContext;
 
 
@@ -231,6 +247,9 @@
  * This also updates the internal state, so will need to be called for
  * codecs with extradata to read parameter sets necessary for further
  * parsing even if the fragment itself is not desired.
+ *
+ * The fragment must have been zeroed or reset via ff_cbs_fragment_reset
+ * before use.
  */
 int ff_cbs_read_extradata(CodedBitstreamContext *ctx,
                           CodedBitstreamFragment *frag,
@@ -243,6 +262,9 @@
  * This also updates the internal state of the coded bitstream context
  * with any persistent data from the fragment which may be required to
  * read following fragments (e.g. parameter sets).
+ *
+ * The fragment must have been zeroed or reset via ff_cbs_fragment_reset
+ * before use.
  */
 int ff_cbs_read_packet(CodedBitstreamContext *ctx,
                        CodedBitstreamFragment *frag,
@@ -255,6 +277,9 @@
  * This also updates the internal state of the coded bitstream context
  * with any persistent data from the fragment which may be required to
  * read following fragments (e.g. parameter sets).
+ *
+ * The fragment must have been zeroed or reset via ff_cbs_fragment_reset
+ * before use.
  */
 int ff_cbs_read(CodedBitstreamContext *ctx,
                 CodedBitstreamFragment *frag,
@@ -279,7 +304,8 @@
 /**
  * Write the bitstream of a fragment to the extradata in codec parameters.
  *
- * This replaces any existing extradata in the structure.
+ * Modifies context and fragment as ff_cbs_write_fragment_data does and
+ * replaces any existing extradata in the structure.
  */
 int ff_cbs_write_extradata(CodedBitstreamContext *ctx,
                            AVCodecParameters *par,
@@ -287,6 +313,13 @@
 
 /**
  * Write the bitstream of a fragment to a packet.
+ *
+ * Modifies context and fragment as ff_cbs_write_fragment_data does.
+ *
+ * On success, the packet's buf is unreferenced and its buf, data and
+ * size fields are set to the corresponding values from the newly updated
+ * fragment; other fields are not touched.  On failure, the packet is not
+ * touched at all.
  */
 int ff_cbs_write_packet(CodedBitstreamContext *ctx,
                         AVPacket *pkt,
@@ -294,11 +327,18 @@
 
 
 /**
- * Free all allocated memory in a fragment.
+ * Free the units contained in a fragment as well as the fragment's
+ * own data buffer, but not the units array itself.
  */
-void ff_cbs_fragment_uninit(CodedBitstreamContext *ctx,
+void ff_cbs_fragment_reset(CodedBitstreamContext *ctx,
                             CodedBitstreamFragment *frag);
 
+/**
+ * Free the units array of a fragment in addition to what
+ * ff_cbs_fragment_reset does.
+ */
+void ff_cbs_fragment_free(CodedBitstreamContext *ctx,
+                          CodedBitstreamFragment *frag);
 
 /**
  * Allocate a new internal content buffer of the given size in the unit.
@@ -308,7 +348,7 @@
 int ff_cbs_alloc_unit_content(CodedBitstreamContext *ctx,
                               CodedBitstreamUnit *unit,
                               size_t size,
-                              void (*free)(void *unit, uint8_t *content));
+                              void (*free)(void *opaque, uint8_t *content));
 
 /**
  * Allocate a new internal data buffer of the given size in the unit.
@@ -336,7 +376,8 @@
  * Insert a new unit into a fragment with the given data bitstream.
  *
  * If data_buf is not supplied then data must have been allocated with
- * av_malloc() and will become owned by the unit after this call.
+ * av_malloc() and will on success become owned by the unit after this
+ * call or freed on error.
  */
 int ff_cbs_insert_unit_data(CodedBitstreamContext *ctx,
                             CodedBitstreamFragment *frag,
@@ -347,10 +388,12 @@
 
 /**
  * Delete a unit from a fragment and free all memory it uses.
+ *
+ * Requires position to be >= 0 and < frag->nb_units.
  */
-int ff_cbs_delete_unit(CodedBitstreamContext *ctx,
-                       CodedBitstreamFragment *frag,
-                       int position);
+void ff_cbs_delete_unit(CodedBitstreamContext *ctx,
+                        CodedBitstreamFragment *frag,
+                        int position);
 
 
 #endif /* AVCODEC_CBS_H */
diff --git a/libavcodec/cbs_av1.c b/libavcodec/cbs_av1.c
index 9bac9dd..fc22808 100644
--- a/libavcodec/cbs_av1.c
+++ b/libavcodec/cbs_av1.c
@@ -29,45 +29,67 @@
                              const char *name, uint32_t *write_to,
                              uint32_t range_min, uint32_t range_max)
 {
-    uint32_t value;
-    int position, zeroes, i, j;
-    char bits[65];
+    uint32_t zeroes, bits_value, value;
+    int position;
 
     if (ctx->trace_enable)
         position = get_bits_count(gbc);
 
-    zeroes = i = 0;
+    zeroes = 0;
     while (1) {
-        if (get_bits_left(gbc) < zeroes + 1) {
+        if (get_bits_left(gbc) < 1) {
             av_log(ctx->log_ctx, AV_LOG_ERROR, "Invalid uvlc code at "
                    "%s: bitstream ended.\n", name);
             return AVERROR_INVALIDDATA;
         }
 
-        if (get_bits1(gbc)) {
-            bits[i++] = '1';
+        if (get_bits1(gbc))
             break;
-        } else {
-            bits[i++] = '0';
-            ++zeroes;
-        }
+        ++zeroes;
     }
 
     if (zeroes >= 32) {
         value = MAX_UINT_BITS(32);
     } else {
-        value = get_bits_long(gbc, zeroes);
+        if (get_bits_left(gbc) < zeroes) {
+            av_log(ctx->log_ctx, AV_LOG_ERROR, "Invalid uvlc code at "
+                   "%s: bitstream ended.\n", name);
+            return AVERROR_INVALIDDATA;
+        }
 
-        for (j = 0; j < zeroes; j++)
-            bits[i++] = (value >> (zeroes - j - 1) & 1) ? '1' : '0';
-
-        value += (1 << zeroes) - 1;
+        bits_value = get_bits_long(gbc, zeroes);
+        value = bits_value + (UINT32_C(1) << zeroes) - 1;
     }
 
     if (ctx->trace_enable) {
+        char bits[65];
+        int i, j, k;
+
+        if (zeroes >= 32) {
+            while (zeroes > 32) {
+                k = FFMIN(zeroes - 32, 32);
+                for (i = 0; i < k; i++)
+                    bits[i] = '0';
+                bits[i] = 0;
+                ff_cbs_trace_syntax_element(ctx, position, name,
+                                            NULL, bits, 0);
+                zeroes -= k;
+                position += k;
+            }
+        }
+
+        for (i = 0; i < zeroes; i++)
+            bits[i] = '0';
+        bits[i++] = '1';
+
+        if (zeroes < 32) {
+            for (j = 0; j < zeroes; j++)
+                bits[i++] = (bits_value >> (zeroes - j - 1) & 1) ? '1' : '0';
+        }
+
         bits[i] = 0;
-        ff_cbs_trace_syntax_element(ctx, position, name, NULL,
-                                    bits, value);
+        ff_cbs_trace_syntax_element(ctx, position, name,
+                                    NULL, bits, value);
     }
 
     if (value < range_min || value > range_max) {
@@ -148,6 +170,9 @@
             break;
     }
 
+    if (value > UINT32_MAX)
+        return AVERROR_INVALIDDATA;
+
     if (ctx->trace_enable)
         ff_cbs_trace_syntax_element(ctx, position, name, NULL, "", value);
 
@@ -185,80 +210,12 @@
     return 0;
 }
 
-static int cbs_av1_read_su(CodedBitstreamContext *ctx, GetBitContext *gbc,
-                           int width, const char *name,
-                           const int *subscripts, int32_t *write_to)
-{
-    uint32_t magnitude;
-    int position, sign;
-    int32_t value;
-
-    if (ctx->trace_enable)
-        position = get_bits_count(gbc);
-
-    if (get_bits_left(gbc) < width + 1) {
-        av_log(ctx->log_ctx, AV_LOG_ERROR, "Invalid signed value at "
-               "%s: bitstream ended.\n", name);
-        return AVERROR_INVALIDDATA;
-    }
-
-    magnitude = get_bits(gbc, width);
-    sign      = get_bits1(gbc);
-    value     = sign ? -(int32_t)magnitude : magnitude;
-
-    if (ctx->trace_enable) {
-        char bits[33];
-        int i;
-        for (i = 0; i < width; i++)
-            bits[i] = magnitude >> (width - i - 1) & 1 ? '1' : '0';
-        bits[i] = sign ? '1' : '0';
-        bits[i + 1] = 0;
-
-        ff_cbs_trace_syntax_element(ctx, position,
-                                    name, subscripts, bits, value);
-    }
-
-    *write_to = value;
-    return 0;
-}
-
-static int cbs_av1_write_su(CodedBitstreamContext *ctx, PutBitContext *pbc,
-                            int width, const char *name,
-                            const int *subscripts, int32_t value)
-{
-    uint32_t magnitude;
-    int sign;
-
-    if (put_bits_left(pbc) < width + 1)
-        return AVERROR(ENOSPC);
-
-    sign      = value < 0;
-    magnitude = sign ? -value : value;
-
-    if (ctx->trace_enable) {
-        char bits[33];
-        int i;
-        for (i = 0; i < width; i++)
-            bits[i] = magnitude >> (width - i - 1) & 1 ? '1' : '0';
-        bits[i] = sign ? '1' : '0';
-        bits[i + 1] = 0;
-
-        ff_cbs_trace_syntax_element(ctx, put_bits_count(pbc),
-                                    name, subscripts, bits, value);
-    }
-
-    put_bits(pbc, width, magnitude);
-    put_bits(pbc, 1, sign);
-
-    return 0;
-}
-
 static int cbs_av1_read_ns(CodedBitstreamContext *ctx, GetBitContext *gbc,
                            uint32_t n, const char *name,
                            const int *subscripts, uint32_t *write_to)
 {
-    uint32_t w, m, v, extra_bit, value;
-    int position;
+    uint32_t m, v, extra_bit, value;
+    int position, w;
 
     av_assert0(n > 0);
 
@@ -564,6 +521,17 @@
     return diff;
 }
 
+static size_t cbs_av1_get_payload_bytes_left(GetBitContext *gbc)
+{
+    GetBitContext tmp = *gbc;
+    size_t size = 0;
+    for (int i = 0; get_bits_left(&tmp) >= 8; i++) {
+        if (get_bits(&tmp, 8))
+            size = i;
+    }
+    return size;
+}
+
 
 #define HEADER(name) do { \
         ff_cbs_trace_header(ctx, name); \
@@ -582,12 +550,12 @@
 #define SUBSCRIPTS(subs, ...) (subs > 0 ? ((int[subs + 1]){ subs, __VA_ARGS__ }) : NULL)
 
 #define fb(width, name) \
-        xf(width, name, current->name, 0, MAX_UINT_BITS(width), 0)
+        xf(width, name, current->name, 0, MAX_UINT_BITS(width), 0, )
 #define fc(width, name, range_min, range_max) \
-        xf(width, name, current->name, range_min, range_max, 0)
+        xf(width, name, current->name, range_min, range_max, 0, )
 #define flag(name) fb(1, name)
 #define su(width, name) \
-        xsu(width, name, current->name, 0)
+        xsu(width, name, current->name, 0, )
 
 #define fbs(width, name, subs, ...) \
         xf(width, name, current->name, 0, MAX_UINT_BITS(width), subs, __VA_ARGS__)
@@ -600,7 +568,7 @@
 
 #define fixed(width, name, value) do { \
         av_unused uint32_t fixed_value = value; \
-        xf(width, name, fixed_value, value, value, 0); \
+        xf(width, name, fixed_value, value, value, 0, ); \
     } while (0)
 
 
@@ -609,7 +577,7 @@
 #define RWContext GetBitContext
 
 #define xf(width, name, var, range_min, range_max, subs, ...) do { \
-        uint32_t value = range_min; \
+        uint32_t value; \
         CHECK(ff_cbs_read_unsigned(ctx, rw, width, #name, \
                                    SUBSCRIPTS(subs, __VA_ARGS__), \
                                    &value, range_min, range_max)); \
@@ -617,34 +585,36 @@
     } while (0)
 
 #define xsu(width, name, var, subs, ...) do { \
-        int32_t value = 0; \
-        CHECK(cbs_av1_read_su(ctx, rw, width, #name, \
-                              SUBSCRIPTS(subs, __VA_ARGS__), &value)); \
+        int32_t value; \
+        CHECK(ff_cbs_read_signed(ctx, rw, width, #name, \
+                                 SUBSCRIPTS(subs, __VA_ARGS__), &value, \
+                                 MIN_INT_BITS(width), \
+                                 MAX_INT_BITS(width))); \
         var = value; \
     } while (0)
 
 #define uvlc(name, range_min, range_max) do { \
-        uint32_t value = range_min; \
+        uint32_t value; \
         CHECK(cbs_av1_read_uvlc(ctx, rw, #name, \
                                 &value, range_min, range_max)); \
         current->name = value; \
     } while (0)
 
 #define ns(max_value, name, subs, ...) do { \
-        uint32_t value = 0; \
+        uint32_t value; \
         CHECK(cbs_av1_read_ns(ctx, rw, max_value, #name, \
                               SUBSCRIPTS(subs, __VA_ARGS__), &value)); \
         current->name = value; \
     } while (0)
 
 #define increment(name, min, max) do { \
-        uint32_t value = 0; \
+        uint32_t value; \
         CHECK(cbs_av1_read_increment(ctx, rw, min, max, #name, &value)); \
         current->name = value; \
     } while (0)
 
 #define subexp(name, max, subs, ...) do { \
-        uint32_t value = 0; \
+        uint32_t value; \
         CHECK(cbs_av1_read_subexp(ctx, rw, max, #name, \
                                   SUBSCRIPTS(subs, __VA_ARGS__), &value)); \
         current->name = value; \
@@ -653,16 +623,16 @@
 #define delta_q(name) do { \
         uint8_t delta_coded; \
         int8_t delta_q; \
-        xf(1, name.delta_coded, delta_coded, 0, 1, 0); \
+        xf(1, name.delta_coded, delta_coded, 0, 1, 0, ); \
         if (delta_coded) \
-            xsu(1 + 6, name.delta_q, delta_q, 0); \
+            xsu(1 + 6, name.delta_q, delta_q, 0, ); \
         else \
             delta_q = 0; \
         current->name = delta_q; \
     } while (0)
 
 #define leb128(name) do { \
-        uint64_t value = 0; \
+        uint64_t value; \
         CHECK(cbs_av1_read_leb128(ctx, rw, #name, &value)); \
         current->name = value; \
     } while (0)
@@ -681,7 +651,6 @@
 #undef xf
 #undef xsu
 #undef uvlc
-#undef leb128
 #undef ns
 #undef increment
 #undef subexp
@@ -702,8 +671,10 @@
     } while (0)
 
 #define xsu(width, name, var, subs, ...) do { \
-        CHECK(cbs_av1_write_su(ctx, rw, width, #name, \
-                               SUBSCRIPTS(subs, __VA_ARGS__), var)); \
+        CHECK(ff_cbs_write_signed(ctx, rw, width, #name, \
+                                  SUBSCRIPTS(subs, __VA_ARGS__), var, \
+                                  MIN_INT_BITS(width), \
+                                  MAX_INT_BITS(width))); \
     } while (0)
 
 #define uvlc(name, range_min, range_max) do { \
@@ -729,9 +700,9 @@
     } while (0)
 
 #define delta_q(name) do { \
-        xf(1, name.delta_coded, current->name != 0, 0, 1, 0); \
+        xf(1, name.delta_coded, current->name != 0, 0, 1, 0, ); \
         if (current->name) \
-            xsu(1 + 6, name.delta_q, current->name, 0); \
+            xsu(1 + 6, name.delta_q, current->name, 0, ); \
     } while (0)
 
 #define leb128(name) do { \
@@ -751,17 +722,17 @@
 
 #include "cbs_av1_syntax_template.c"
 
-#undef READ
+#undef WRITE
 #undef READWRITE
 #undef RWContext
 #undef xf
 #undef xsu
 #undef uvlc
-#undef leb128
 #undef ns
 #undef increment
 #undef subexp
 #undef delta_q
+#undef leb128
 #undef infer
 #undef byte_alignment
 
@@ -785,7 +756,7 @@
 
     if (INT_MAX / 8 < size) {
         av_log(ctx->log_ctx, AV_LOG_ERROR, "Invalid fragment: "
-               "too large (%zu bytes).\n", size);
+               "too large (%"SIZE_SPECIFIER" bytes).\n", size);
         err = AVERROR_INVALIDDATA;
         goto fail;
     }
@@ -800,23 +771,18 @@
         if (err < 0)
             goto fail;
 
-        if (!header.obu_has_size_field) {
-            av_log(ctx->log_ctx, AV_LOG_ERROR, "Invalid OBU for raw "
-                   "stream: size field must be present.\n");
-            err = AVERROR_INVALIDDATA;
-            goto fail;
-        }
-
-        if (get_bits_left(&gbc) < 8) {
-            av_log(ctx->log_ctx, AV_LOG_ERROR, "Invalid OBU: fragment "
-                   "too short (%zu bytes).\n", size);
-            err = AVERROR_INVALIDDATA;
-            goto fail;
-        }
-
-        err = cbs_av1_read_leb128(ctx, &gbc, "obu_size", &obu_size);
-        if (err < 0)
-            goto fail;
+        if (header.obu_has_size_field) {
+            if (get_bits_left(&gbc) < 8) {
+                av_log(ctx->log_ctx, AV_LOG_ERROR, "Invalid OBU: fragment "
+                       "too short (%"SIZE_SPECIFIER" bytes).\n", size);
+                err = AVERROR_INVALIDDATA;
+                goto fail;
+            }
+            err = cbs_av1_read_leb128(ctx, &gbc, "obu_size", &obu_size);
+            if (err < 0)
+                goto fail;
+        } else
+            obu_size = size - 1 - header.obu_extension_flag;
 
         pos = get_bits_count(&gbc);
         av_assert0(pos % 8 == 0 && pos / 8 <= size);
@@ -825,7 +791,7 @@
 
         if (size < obu_length) {
             av_log(ctx->log_ctx, AV_LOG_ERROR, "Invalid OBU length: "
-                   "%"PRIu64", but only %zu bytes remaining in fragment.\n",
+                   "%"PRIu64", but only %"SIZE_SPECIFIER" bytes remaining in fragment.\n",
                    obu_length, size);
             err = AVERROR_INVALIDDATA;
             goto fail;
@@ -851,6 +817,11 @@
     av_buffer_unref(&td->data_ref);
 }
 
+static void cbs_av1_free_padding(AV1RawPadding *pd)
+{
+    av_buffer_unref(&pd->payload_ref);
+}
+
 static void cbs_av1_free_metadata(AV1RawMetadata *md)
 {
     switch (md->metadata_type) {
@@ -860,7 +831,7 @@
     }
 }
 
-static void cbs_av1_free_obu(void *unit, uint8_t *content)
+static void cbs_av1_free_obu(void *opaque, uint8_t *content)
 {
     AV1RawOBU *obu = (AV1RawOBU*)content;
 
@@ -877,6 +848,9 @@
     case AV1_OBU_METADATA:
         cbs_av1_free_metadata(&obu->obu.metadata);
         break;
+    case AV1_OBU_PADDING:
+        cbs_av1_free_padding(&obu->obu.padding);
+        break;
     }
 
     av_freep(&obu);
@@ -940,7 +914,7 @@
     } else {
         if (unit->data_size < 1 + obu->header.obu_extension_flag) {
             av_log(ctx->log_ctx, AV_LOG_ERROR, "Invalid OBU length: "
-                   "unit too short (%zu).\n", unit->data_size);
+                   "unit too short (%"SIZE_SPECIFIER").\n", unit->data_size);
             return AVERROR_INVALIDDATA;
         }
         obu->obu_size = unit->data_size - 1 - obu->header.obu_extension_flag;
@@ -950,7 +924,7 @@
 
     if (obu->header.obu_extension_flag) {
         priv->temporal_id = obu->header.temporal_id;
-        priv->spatial_id  = obu->header.temporal_id;
+        priv->spatial_id  = obu->header.spatial_id;
 
         if (obu->header.obu_type != AV1_OBU_SEQUENCE_HEADER &&
             obu->header.obu_type != AV1_OBU_TEMPORAL_DELIMITER &&
@@ -968,6 +942,8 @@
         priv->spatial_id  = 0;
     }
 
+    priv->ref = (AV1ReferenceFrameState *)&priv->read_ref;
+
     switch (obu->header.obu_type) {
     case AV1_OBU_SEQUENCE_HEADER:
         {
@@ -996,7 +972,10 @@
     case AV1_OBU_REDUNDANT_FRAME_HEADER:
         {
             err = cbs_av1_read_frame_header_obu(ctx, &gbc,
-                                                &obu->obu.frame_header);
+                                                &obu->obu.frame_header,
+                                                obu->header.obu_type ==
+                                                AV1_OBU_REDUNDANT_FRAME_HEADER,
+                                                unit->data_ref);
             if (err < 0)
                 return err;
         }
@@ -1016,7 +995,8 @@
         break;
     case AV1_OBU_FRAME:
         {
-            err = cbs_av1_read_frame_obu(ctx, &gbc, &obu->obu.frame);
+            err = cbs_av1_read_frame_obu(ctx, &gbc, &obu->obu.frame,
+                                         unit->data_ref);
             if (err < 0)
                 return err;
 
@@ -1047,6 +1027,12 @@
         }
         break;
     case AV1_OBU_PADDING:
+        {
+            err = cbs_av1_read_padding_obu(ctx, &gbc, &obu->obu.padding);
+            if (err < 0)
+                return err;
+        }
+        break;
     default:
         return AVERROR(ENOSYS);
     }
@@ -1056,9 +1042,14 @@
 
     if (obu->obu_size > 0 &&
         obu->header.obu_type != AV1_OBU_TILE_GROUP &&
+        obu->header.obu_type != AV1_OBU_TILE_LIST &&
         obu->header.obu_type != AV1_OBU_FRAME) {
-        err = cbs_av1_read_trailing_bits(ctx, &gbc,
-                                         obu->obu_size * 8 + start_pos - end_pos);
+        int nb_bits = obu->obu_size * 8 + start_pos - end_pos;
+
+        if (nb_bits <= 0)
+            return AVERROR_INVALIDDATA;
+
+        err = cbs_av1_read_trailing_bits(ctx, &gbc, nb_bits);
         if (err < 0)
             return err;
     }
@@ -1096,6 +1087,8 @@
     td = NULL;
     start_pos = put_bits_count(pbc);
 
+    priv->ref = (AV1ReferenceFrameState *)&priv->write_ref;
+
     switch (obu->header.obu_type) {
     case AV1_OBU_SEQUENCE_HEADER:
         {
@@ -1124,7 +1117,10 @@
     case AV1_OBU_REDUNDANT_FRAME_HEADER:
         {
             err = cbs_av1_write_frame_header_obu(ctx, pbc,
-                                                 &obu->obu.frame_header);
+                                                 &obu->obu.frame_header,
+                                                 obu->header.obu_type ==
+                                                 AV1_OBU_REDUNDANT_FRAME_HEADER,
+                                                 NULL);
             if (err < 0)
                 return err;
         }
@@ -1141,7 +1137,7 @@
         break;
     case AV1_OBU_FRAME:
         {
-            err = cbs_av1_write_frame_obu(ctx, pbc, &obu->obu.frame);
+            err = cbs_av1_write_frame_obu(ctx, pbc, &obu->obu.frame, NULL);
             if (err < 0)
                 return err;
 
@@ -1165,6 +1161,12 @@
         }
         break;
     case AV1_OBU_PADDING:
+        {
+            err = cbs_av1_write_padding_obu(ctx, pbc, &obu->obu.padding);
+            if (err < 0)
+                return err;
+        }
+        break;
     default:
         return AVERROR(ENOSYS);
     }
@@ -1179,7 +1181,7 @@
         if (err < 0)
             return err;
         end_pos = put_bits_count(pbc);
-        obu->obu_size = (end_pos - start_pos + 7) / 8;
+        obu->obu_size = header_size = (end_pos - start_pos + 7) / 8;
     } else {
         // Empty OBU.
         obu->obu_size = 0;
@@ -1205,66 +1207,19 @@
         return AVERROR(ENOSPC);
 
     if (obu->obu_size > 0) {
-        memmove(priv->write_buffer + data_pos,
-                priv->write_buffer + start_pos, header_size);
+        memmove(pbc->buf + data_pos,
+                pbc->buf + start_pos, header_size);
         skip_put_bytes(pbc, header_size);
 
         if (td) {
-            memcpy(priv->write_buffer + data_pos + header_size,
+            memcpy(pbc->buf + data_pos + header_size,
                    td->data, td->data_size);
             skip_put_bytes(pbc, td->data_size);
         }
     }
 
-    return 0;
-}
-
-static int cbs_av1_write_unit(CodedBitstreamContext *ctx,
-                              CodedBitstreamUnit *unit)
-{
-    CodedBitstreamAV1Context *priv = ctx->priv_data;
-    PutBitContext pbc;
-    int err;
-
-    if (!priv->write_buffer) {
-        // Initial write buffer size is 1MB.
-        priv->write_buffer_size = 1024 * 1024;
-
-    reallocate_and_try_again:
-        err = av_reallocp(&priv->write_buffer, priv->write_buffer_size);
-        if (err < 0) {
-            av_log(ctx->log_ctx, AV_LOG_ERROR, "Unable to allocate a "
-                   "sufficiently large write buffer (last attempt "
-                   "%zu bytes).\n", priv->write_buffer_size);
-            return err;
-        }
-    }
-
-    init_put_bits(&pbc, priv->write_buffer, priv->write_buffer_size);
-
-    err = cbs_av1_write_obu(ctx, unit, &pbc);
-    if (err == AVERROR(ENOSPC)) {
-        // Overflow.
-        priv->write_buffer_size *= 2;
-        goto reallocate_and_try_again;
-    }
-    if (err < 0)
-        return err;
-
-    // Overflow but we didn't notice.
-    av_assert0(put_bits_count(&pbc) <= 8 * priv->write_buffer_size);
-
     // OBU data must be byte-aligned.
-    av_assert0(put_bits_count(&pbc) % 8 == 0);
-
-    unit->data_size = put_bits_count(&pbc) / 8;
-    flush_put_bits(&pbc);
-
-    err = ff_cbs_alloc_unit_data(ctx, unit, unit->data_size);
-    if (err < 0)
-        return err;
-
-    memcpy(unit->data, priv->write_buffer, unit->data_size);
+    av_assert0(put_bits_count(pbc) % 8 == 0);
 
     return 0;
 }
@@ -1302,8 +1257,7 @@
     CodedBitstreamAV1Context *priv = ctx->priv_data;
 
     av_buffer_unref(&priv->sequence_header_ref);
-
-    av_freep(&priv->write_buffer);
+    av_buffer_unref(&priv->frame_header_ref);
 }
 
 const CodedBitstreamType ff_cbs_type_av1 = {
@@ -1313,7 +1267,7 @@
 
     .split_fragment    = &cbs_av1_split_fragment,
     .read_unit         = &cbs_av1_read_unit,
-    .write_unit        = &cbs_av1_write_unit,
+    .write_unit        = &cbs_av1_write_obu,
     .assemble_fragment = &cbs_av1_assemble_fragment,
 
     .close             = &cbs_av1_close,
diff --git a/libavcodec/cbs_av1.h b/libavcodec/cbs_av1.h
index 0d7fd76..fdc629b 100644
--- a/libavcodec/cbs_av1.h
+++ b/libavcodec/cbs_av1.h
@@ -87,8 +87,8 @@
     uint8_t  seq_level_idx[AV1_MAX_OPERATING_POINTS];
     uint8_t  seq_tier[AV1_MAX_OPERATING_POINTS];
     uint8_t  decoder_model_present_for_this_op[AV1_MAX_OPERATING_POINTS];
-    uint8_t  decoder_buffer_delay[AV1_MAX_OPERATING_POINTS];
-    uint8_t  encoder_buffer_delay[AV1_MAX_OPERATING_POINTS];
+    uint32_t decoder_buffer_delay[AV1_MAX_OPERATING_POINTS];
+    uint32_t encoder_buffer_delay[AV1_MAX_OPERATING_POINTS];
     uint8_t  low_delay_mode_flag[AV1_MAX_OPERATING_POINTS];
     uint8_t  initial_display_delay_present_for_this_op[AV1_MAX_OPERATING_POINTS];
     uint8_t  initial_display_delay_minus_1[AV1_MAX_OPERATING_POINTS];
@@ -105,7 +105,7 @@
     uint8_t use_128x128_superblock;
     uint8_t enable_filter_intra;
     uint8_t enable_intra_edge_filter;
-    uint8_t enable_intraintra_compound;
+    uint8_t enable_interintra_compound;
     uint8_t enable_masked_compound;
     uint8_t enable_warped_motion;
     uint8_t enable_dual_filter;
@@ -161,7 +161,7 @@
     uint8_t  render_width_minus_1;
     uint8_t  render_height_minus_1;
 
-    uint8_t found_ref;
+    uint8_t found_ref[AV1_REFS_PER_FRAME];
 
     uint8_t refresh_frame_flags;
     uint8_t allow_intrabc;
@@ -170,7 +170,7 @@
     uint8_t last_frame_idx;
     uint8_t golden_frame_idx;
     int8_t  ref_frame_idx[AV1_REFS_PER_FRAME];
-    uint8_t delta_frame_id_minus1;
+    uint32_t delta_frame_id_minus1[AV1_REFS_PER_FRAME];
 
     uint8_t allow_high_precision_mv;
     uint8_t is_filter_switchable;
@@ -210,7 +210,7 @@
     uint8_t segmentation_temporal_update;
     uint8_t segmentation_update_data;
     uint8_t feature_enabled[AV1_MAX_SEGMENTS][AV1_SEG_LVL_MAX];
-    uint8_t feature_value[AV1_MAX_SEGMENTS][AV1_SEG_LVL_MAX];
+    int16_t feature_value[AV1_MAX_SEGMENTS][AV1_SEG_LVL_MAX];
 
     uint8_t delta_q_present;
     uint8_t delta_q_res;
@@ -256,20 +256,20 @@
     uint8_t  update_grain;
     uint8_t  film_grain_params_ref_idx;
     uint8_t  num_y_points;
-    uint8_t  point_y_value[16];
-    uint8_t  point_y_scaling[16];
+    uint8_t  point_y_value[14];
+    uint8_t  point_y_scaling[14];
     uint8_t  chroma_scaling_from_luma;
     uint8_t  num_cb_points;
-    uint8_t  point_cb_value[16];
-    uint8_t  point_cb_scaling[16];
+    uint8_t  point_cb_value[10];
+    uint8_t  point_cb_scaling[10];
     uint8_t  num_cr_points;
-    uint8_t  point_cr_value[16];
-    uint8_t  point_cr_scaling[16];
+    uint8_t  point_cr_value[10];
+    uint8_t  point_cr_scaling[10];
     uint8_t  grain_scaling_minus_8;
     uint8_t  ar_coeff_lag;
     uint8_t  ar_coeffs_y_plus_128[24];
-    uint8_t  ar_coeffs_cb_plus_128[24];
-    uint8_t  ar_coeffs_cr_plus_128[24];
+    uint8_t  ar_coeffs_cb_plus_128[25];
+    uint8_t  ar_coeffs_cr_plus_128[25];
     uint8_t  ar_coeff_shift_minus_6;
     uint8_t  grain_scale_shift;
     uint8_t  cb_mult;
@@ -325,7 +325,20 @@
 
 typedef struct AV1RawMetadataScalability {
     uint8_t scalability_mode_idc;
-    // TODO: more stuff.
+    uint8_t spatial_layers_cnt_minus_1;
+    uint8_t spatial_layer_dimensions_present_flag;
+    uint8_t spatial_layer_description_present_flag;
+    uint8_t temporal_group_description_present_flag;
+    uint8_t scalability_structure_reserved_3bits;
+    uint16_t spatial_layer_max_width[4];
+    uint16_t spatial_layer_max_height[4];
+    uint8_t spatial_layer_ref_id[4];
+    uint8_t temporal_group_size;
+    uint8_t temporal_group_temporal_id[255];
+    uint8_t temporal_group_temporal_switching_up_point_flag[255];
+    uint8_t temporal_group_spatial_switching_up_point_flag[255];
+    uint8_t temporal_group_ref_cnt[255];
+    uint8_t temporal_group_ref_pic_diff[255][7];
 } AV1RawMetadataScalability;
 
 typedef struct AV1RawMetadataITUTT35 {
@@ -364,6 +377,12 @@
     } metadata;
 } AV1RawMetadata;
 
+typedef struct AV1RawPadding {
+    uint8_t     *payload;
+    size_t       payload_size;
+    AVBufferRef *payload_ref;
+} AV1RawPadding;
+
 
 typedef struct AV1RawOBU {
     AV1RawOBUHeader header;
@@ -377,6 +396,7 @@
         AV1RawTileGroup      tile_group;
         AV1RawTileList       tile_list;
         AV1RawMetadata       metadata;
+        AV1RawPadding        padding;
     } obu;
 } AV1RawOBU;
 
@@ -399,7 +419,10 @@
     AV1RawSequenceHeader *sequence_header;
     AVBufferRef          *sequence_header_ref;
 
-    int seen_frame_header;
+    int     seen_frame_header;
+    AVBufferRef *frame_header_ref;
+    uint8_t     *frame_header;
+    size_t       frame_header_size;
 
     int temporal_id;
     int spatial_id;
@@ -418,11 +441,9 @@
     int tile_cols;
     int tile_rows;
 
-    AV1ReferenceFrameState ref[AV1_NUM_REF_FRAMES];
-
-    // Write buffer.
-    uint8_t *write_buffer;
-    size_t   write_buffer_size;
+    AV1ReferenceFrameState *ref;
+    AV1ReferenceFrameState read_ref[AV1_NUM_REF_FRAMES];
+    AV1ReferenceFrameState write_ref[AV1_NUM_REF_FRAMES];
 } CodedBitstreamAV1Context;
 
 
diff --git a/libavcodec/cbs_av1_syntax_template.c b/libavcodec/cbs_av1_syntax_template.c
index 84ab297..a315e88 100644
--- a/libavcodec/cbs_av1_syntax_template.c
+++ b/libavcodec/cbs_av1_syntax_template.c
@@ -20,7 +20,6 @@
                             AV1RawOBUHeader *current)
 {
     int err;
-    av_unused int zero = 0;
 
     HEADER("OBU header");
 
@@ -268,7 +267,7 @@
     flag(enable_intra_edge_filter);
 
     if (current->reduced_still_picture_header) {
-        infer(enable_intraintra_compound, 0);
+        infer(enable_interintra_compound, 0);
         infer(enable_masked_compound,     0);
         infer(enable_warped_motion,       0);
         infer(enable_dual_filter,         0);
@@ -281,7 +280,7 @@
         infer(seq_force_integer_mv,
               AV1_SELECT_INTEGER_MV);
     } else {
-        flag(enable_intraintra_compound);
+        flag(enable_interintra_compound);
         flag(enable_masked_compound);
         flag(enable_warped_motion);
         flag(enable_dual_filter);
@@ -339,6 +338,117 @@
     return 0;
 }
 
+static int FUNC(set_frame_refs)(CodedBitstreamContext *ctx, RWContext *rw,
+                                AV1RawFrameHeader *current)
+{
+    CodedBitstreamAV1Context *priv = ctx->priv_data;
+    const AV1RawSequenceHeader *seq = priv->sequence_header;
+    static const uint8_t ref_frame_list[AV1_NUM_REF_FRAMES - 2] = {
+        AV1_REF_FRAME_LAST2, AV1_REF_FRAME_LAST3, AV1_REF_FRAME_BWDREF,
+        AV1_REF_FRAME_ALTREF2, AV1_REF_FRAME_ALTREF
+    };
+    int8_t ref_frame_idx[AV1_REFS_PER_FRAME], used_frame[AV1_NUM_REF_FRAMES];
+    int8_t shifted_order_hints[AV1_NUM_REF_FRAMES];
+    int cur_frame_hint, latest_order_hint, earliest_order_hint, ref;
+    int i, j;
+
+    for (i = 0; i < AV1_REFS_PER_FRAME; i++)
+        ref_frame_idx[i] = -1;
+    ref_frame_idx[AV1_REF_FRAME_LAST - AV1_REF_FRAME_LAST] = current->last_frame_idx;
+    ref_frame_idx[AV1_REF_FRAME_GOLDEN - AV1_REF_FRAME_LAST] = current->golden_frame_idx;
+
+    for (i = 0; i < AV1_NUM_REF_FRAMES; i++)
+        used_frame[i] = 0;
+    used_frame[current->last_frame_idx] = 1;
+    used_frame[current->golden_frame_idx] = 1;
+
+    cur_frame_hint = 1 << (seq->order_hint_bits_minus_1);
+    for (i = 0; i < AV1_NUM_REF_FRAMES; i++)
+        shifted_order_hints[i] = cur_frame_hint +
+                                 cbs_av1_get_relative_dist(seq, priv->ref[i].order_hint,
+                                                           current->order_hint);
+
+    latest_order_hint = shifted_order_hints[current->last_frame_idx];
+    earliest_order_hint = shifted_order_hints[current->golden_frame_idx];
+
+    ref = -1;
+    for (i = 0; i < AV1_NUM_REF_FRAMES; i++) {
+        int hint = shifted_order_hints[i];
+        if (!used_frame[i] && hint >= cur_frame_hint &&
+            (ref < 0 || hint >= latest_order_hint)) {
+            ref = i;
+            latest_order_hint = hint;
+        }
+    }
+    if (ref >= 0) {
+        ref_frame_idx[AV1_REF_FRAME_ALTREF - AV1_REF_FRAME_LAST] = ref;
+        used_frame[ref] = 1;
+    }
+
+    ref = -1;
+    for (i = 0; i < AV1_NUM_REF_FRAMES; i++) {
+        int hint = shifted_order_hints[i];
+        if (!used_frame[i] && hint >= cur_frame_hint &&
+            (ref < 0 || hint < earliest_order_hint)) {
+            ref = i;
+            earliest_order_hint = hint;
+        }
+    }
+    if (ref >= 0) {
+        ref_frame_idx[AV1_REF_FRAME_BWDREF - AV1_REF_FRAME_LAST] = ref;
+        used_frame[ref] = 1;
+    }
+
+    ref = -1;
+    for (i = 0; i < AV1_NUM_REF_FRAMES; i++) {
+        int hint = shifted_order_hints[i];
+        if (!used_frame[i] && hint >= cur_frame_hint &&
+            (ref < 0 || hint < earliest_order_hint)) {
+            ref = i;
+            earliest_order_hint = hint;
+        }
+    }
+    if (ref >= 0) {
+        ref_frame_idx[AV1_REF_FRAME_ALTREF2 - AV1_REF_FRAME_LAST] = ref;
+        used_frame[ref] = 1;
+    }
+
+    for (i = 0; i < AV1_REFS_PER_FRAME - 2; i++) {
+        int ref_frame = ref_frame_list[i];
+        if (ref_frame_idx[ref_frame - AV1_REF_FRAME_LAST] < 0 ) {
+            ref = -1;
+            for (j = 0; j < AV1_NUM_REF_FRAMES; j++) {
+                int hint = shifted_order_hints[j];
+                if (!used_frame[j] && hint < cur_frame_hint &&
+                    (ref < 0 || hint >= latest_order_hint)) {
+                    ref = j;
+                    latest_order_hint = hint;
+                }
+            }
+            if (ref >= 0) {
+                ref_frame_idx[ref_frame - AV1_REF_FRAME_LAST] = ref;
+                used_frame[ref] = 1;
+            }
+        }
+    }
+
+    ref = -1;
+    for (i = 0; i < AV1_NUM_REF_FRAMES; i++) {
+        int hint = shifted_order_hints[i];
+        if (ref < 0 || hint < earliest_order_hint) {
+            ref = i;
+            earliest_order_hint = hint;
+        }
+    }
+    for (i = 0; i < AV1_REFS_PER_FRAME; i++) {
+        if (ref_frame_idx[i] < 0)
+            ref_frame_idx[i] = ref;
+        infer(ref_frame_idx[i], ref_frame_idx[i]);
+    }
+
+    return 0;
+}
+
 static int FUNC(superres_params)(CodedBitstreamContext *ctx, RWContext *rw,
                                  AV1RawFrameHeader *current)
 {
@@ -417,8 +527,8 @@
     int i, err;
 
     for (i = 0; i < AV1_REFS_PER_FRAME; i++) {
-        flag(found_ref);
-        if (current->found_ref) {
+        flags(found_ref[i], 1, i);
+        if (current->found_ref[i]) {
             AV1ReferenceFrameState *ref =
                 &priv->ref[current->ref_frame_idx[i]];
 
@@ -439,7 +549,7 @@
         }
     }
 
-    if (current->found_ref == 0) {
+    if (i >= AV1_REFS_PER_FRAME) {
         CHECK(FUNC(frame_size)(ctx, rw, current));
         CHECK(FUNC(render_size)(ctx, rw, current));
     } else {
@@ -881,7 +991,7 @@
         forward_idx  = -1;
         backward_idx = -1;
         for (i = 0; i < AV1_REFS_PER_FRAME; i++) {
-            ref_hint = priv->ref[i].order_hint;
+            ref_hint = priv->ref[current->ref_frame_idx[i]].order_hint;
             dist = cbs_av1_get_relative_dist(seq, ref_hint,
                                              current->order_hint);
             if (dist < 0) {
@@ -912,7 +1022,7 @@
 
             second_forward_idx = -1;
             for (i = 0; i < AV1_REFS_PER_FRAME; i++) {
-                ref_hint = priv->ref[i].order_hint;
+                ref_hint = priv->ref[current->ref_frame_idx[i]].order_hint;
                 if (cbs_av1_get_relative_dist(seq, ref_hint,
                                               forward_hint) < 0) {
                     if (second_forward_idx < 0 ||
@@ -1044,9 +1154,12 @@
         return 0;
     }
 
-    fb(4, num_y_points);
+    fc(4, num_y_points, 0, 14);
     for (i = 0; i < current->num_y_points; i++) {
-        fbs(8, point_y_value[i],   1, i);
+        fcs(8, point_y_value[i],
+            i ? current->point_y_value[i - 1] + 1 : 0,
+            MAX_UINT_BITS(8) - (current->num_y_points - i - 1),
+            1, i);
         fbs(8, point_y_scaling[i], 1, i);
     }
 
@@ -1063,14 +1176,20 @@
         infer(num_cb_points, 0);
         infer(num_cr_points, 0);
     } else {
-        fb(4, num_cb_points);
+        fc(4, num_cb_points, 0, 10);
         for (i = 0; i < current->num_cb_points; i++) {
-            fbs(8, point_cb_value[i],   1, i);
+            fcs(8, point_cb_value[i],
+                i ? current->point_cb_value[i - 1] + 1 : 0,
+                MAX_UINT_BITS(8) - (current->num_cb_points - i - 1),
+                1, i);
             fbs(8, point_cb_scaling[i], 1, i);
         }
-        fb(4, num_cr_points);
+        fc(4, num_cr_points, 0, 10);
         for (i = 0; i < current->num_cr_points; i++) {
-            fbs(8, point_cr_value[i],   1, i);
+            fcs(8, point_cr_value[i],
+                i ? current->point_cr_value[i - 1] + 1 : 0,
+                MAX_UINT_BITS(8) - (current->num_cr_points - i - 1),
+                1, i);
             fbs(8, point_cr_scaling[i], 1, i);
         }
     }
@@ -1306,16 +1425,7 @@
             if (current->frame_refs_short_signaling) {
                 fb(3, last_frame_idx);
                 fb(3, golden_frame_idx);
-
-                for (i = 0; i < AV1_REFS_PER_FRAME; i++) {
-                    if (i == 0)
-                        infer(ref_frame_idx[i], current->last_frame_idx);
-                    else if (i == AV1_REF_FRAME_GOLDEN -
-                                  AV1_REF_FRAME_LAST)
-                        infer(ref_frame_idx[i], current->golden_frame_idx);
-                    else
-                        infer(ref_frame_idx[i], -1);
-                }
+                CHECK(FUNC(set_frame_refs)(ctx, rw, current));
             }
         }
 
@@ -1323,8 +1433,8 @@
             if (!current->frame_refs_short_signaling)
                 fbs(3, ref_frame_idx[i], 1, i);
             if (seq->frame_id_numbers_present_flag) {
-                fb(seq->delta_frame_id_length_minus_2 + 2,
-                   delta_frame_id_minus1);
+                fbs(seq->delta_frame_id_length_minus_2 + 2,
+                    delta_frame_id_minus1[i], 1, i);
             }
         }
 
@@ -1463,17 +1573,47 @@
 }
 
 static int FUNC(frame_header_obu)(CodedBitstreamContext *ctx, RWContext *rw,
-                                  AV1RawFrameHeader *current)
+                                  AV1RawFrameHeader *current, int redundant,
+                                  AVBufferRef *rw_buffer_ref)
 {
     CodedBitstreamAV1Context *priv = ctx->priv_data;
-    int err;
-
-    HEADER("Frame Header");
+    int start_pos, fh_bits, fh_bytes, err;
+    uint8_t *fh_start;
 
     if (priv->seen_frame_header) {
-        // Nothing to do.
+        if (!redundant) {
+            av_log(ctx->log_ctx, AV_LOG_ERROR, "Invalid repeated "
+                   "frame header OBU.\n");
+            return AVERROR_INVALIDDATA;
+        } else {
+            GetBitContext fh;
+            size_t i, b;
+            uint32_t val;
+
+            HEADER("Redundant Frame Header");
+
+            av_assert0(priv->frame_header_ref && priv->frame_header);
+
+            init_get_bits(&fh, priv->frame_header,
+                          priv->frame_header_size);
+            for (i = 0; i < priv->frame_header_size; i += 8) {
+                b = FFMIN(priv->frame_header_size - i, 8);
+                val = get_bits(&fh, b);
+                xf(b, frame_header_copy[i],
+                   val, val, val, 1, i / 8);
+            }
+        }
     } else {
-        priv->seen_frame_header = 1;
+        if (redundant)
+            HEADER("Redundant Frame Header (used as Frame Header)");
+        else
+            HEADER("Frame Header");
+
+#ifdef READ
+        start_pos = get_bits_count(rw);
+#else
+        start_pos = put_bits_count(rw);
+#endif
 
         CHECK(FUNC(uncompressed_header)(ctx, rw, current));
 
@@ -1481,6 +1621,40 @@
             priv->seen_frame_header = 0;
         } else {
             priv->seen_frame_header = 1;
+
+            av_buffer_unref(&priv->frame_header_ref);
+
+#ifdef READ
+            fh_bits  = get_bits_count(rw) - start_pos;
+            fh_start = (uint8_t*)rw->buffer + start_pos / 8;
+#else
+            // Need to flush the bitwriter so that we can copy its output,
+            // but use a copy so we don't affect the caller's structure.
+            {
+                PutBitContext tmp = *rw;
+                flush_put_bits(&tmp);
+            }
+
+            fh_bits  = put_bits_count(rw) - start_pos;
+            fh_start = rw->buf + start_pos / 8;
+#endif
+            fh_bytes = (fh_bits + 7) / 8;
+
+            priv->frame_header_size = fh_bits;
+
+            if (rw_buffer_ref) {
+                priv->frame_header_ref = av_buffer_ref(rw_buffer_ref);
+                if (!priv->frame_header_ref)
+                    return AVERROR(ENOMEM);
+                priv->frame_header = fh_start;
+            } else {
+                priv->frame_header_ref =
+                    av_buffer_alloc(fh_bytes + AV_INPUT_BUFFER_PADDING_SIZE);
+                if (!priv->frame_header_ref)
+                    return AVERROR(ENOMEM);
+                priv->frame_header = priv->frame_header_ref->data;
+                memcpy(priv->frame_header, fh_start, fh_bytes);
+            }
         }
     }
 
@@ -1524,11 +1698,13 @@
 }
 
 static int FUNC(frame_obu)(CodedBitstreamContext *ctx, RWContext *rw,
-                           AV1RawFrame *current)
+                           AV1RawFrame *current,
+                           AVBufferRef *rw_buffer_ref)
 {
     int err;
 
-    CHECK(FUNC(frame_header_obu)(ctx, rw, &current->header));
+    CHECK(FUNC(frame_header_obu)(ctx, rw, &current->header,
+                                 0, rw_buffer_ref));
 
     CHECK(FUNC(byte_alignment)(ctx, rw));
 
@@ -1569,15 +1745,65 @@
     int err, i;
 
     for (i = 0; i < 3; i++) {
-        fcs(16, primary_chromaticity_x[i], 0, 50000, 1, i);
-        fcs(16, primary_chromaticity_y[i], 0, 50000, 1, i);
+        fbs(16, primary_chromaticity_x[i], 1, i);
+        fbs(16, primary_chromaticity_y[i], 1, i);
     }
 
-    fc(16, white_point_chromaticity_x, 0, 50000);
-    fc(16, white_point_chromaticity_y, 0, 50000);
+    fb(16, white_point_chromaticity_x);
+    fb(16, white_point_chromaticity_y);
 
     fc(32, luminance_max, 1, MAX_UINT_BITS(32));
-    fc(32, luminance_min, 0, current->luminance_max >> 6);
+    // luminance_min must be lower than luminance_max. Convert luminance_max from
+    // 24.8 fixed point to 18.14 fixed point in order to compare them.
+    fc(32, luminance_min, 0, FFMIN(((uint64_t)current->luminance_max << 6) - 1,
+                                   MAX_UINT_BITS(32)));
+
+    return 0;
+}
+
+static int FUNC(scalability_structure)(CodedBitstreamContext *ctx, RWContext *rw,
+                                       AV1RawMetadataScalability *current)
+{
+    CodedBitstreamAV1Context *priv = ctx->priv_data;
+    const AV1RawSequenceHeader *seq;
+    int err, i, j;
+
+    if (!priv->sequence_header) {
+        av_log(ctx->log_ctx, AV_LOG_ERROR, "No sequence header available: "
+               "unable to parse scalability metadata.\n");
+        return AVERROR_INVALIDDATA;
+    }
+    seq = priv->sequence_header;
+
+    fb(2, spatial_layers_cnt_minus_1);
+    flag(spatial_layer_dimensions_present_flag);
+    flag(spatial_layer_description_present_flag);
+    flag(temporal_group_description_present_flag);
+    fc(3, scalability_structure_reserved_3bits, 0, 0);
+    if (current->spatial_layer_dimensions_present_flag) {
+        for (i = 0; i <= current->spatial_layers_cnt_minus_1; i++) {
+            fcs(16, spatial_layer_max_width[i],
+                0, seq->max_frame_width_minus_1 + 1, 1, i);
+            fcs(16, spatial_layer_max_height[i],
+                0, seq->max_frame_height_minus_1 + 1, 1, i);
+        }
+    }
+    if (current->spatial_layer_description_present_flag) {
+        for (i = 0; i <= current->spatial_layers_cnt_minus_1; i++)
+            fbs(8, spatial_layer_ref_id[i], 1, i);
+    }
+    if (current->temporal_group_description_present_flag) {
+        fb(8, temporal_group_size);
+        for (i = 0; i < current->temporal_group_size; i++) {
+            fbs(3, temporal_group_temporal_id[i], 1, i);
+            flags(temporal_group_temporal_switching_up_point_flag[i], 1, i);
+            flags(temporal_group_spatial_switching_up_point_flag[i], 1, i);
+            fbs(3, temporal_group_ref_cnt[i], 1, i);
+            for (j = 0; j < current->temporal_group_ref_cnt[i]; j++) {
+                fbs(8, temporal_group_ref_pic_diff[i][j], 2, i, j);
+            }
+        }
+    }
 
     return 0;
 }
@@ -1585,9 +1811,14 @@
 static int FUNC(metadata_scalability)(CodedBitstreamContext *ctx, RWContext *rw,
                                       AV1RawMetadataScalability *current)
 {
-    // TODO: scalability metadata.
+    int err;
 
-    return AVERROR_PATCHWELCOME;
+    fb(8, scalability_mode_idc);
+
+    if (current->scalability_mode_idc == AV1_SCALABILITY_SS)
+        CHECK(FUNC(scalability_structure)(ctx, rw, current));
+
+    return 0;
 }
 
 static int FUNC(metadata_itut_t35)(CodedBitstreamContext *ctx, RWContext *rw,
@@ -1603,15 +1834,7 @@
 #ifdef READ
     // The payload runs up to the start of the trailing bits, but there might
     // be arbitrarily many trailing zeroes so we need to read through twice.
-    {
-        GetBitContext tmp = *rw;
-        current->payload_size = 0;
-        for (i = 0; get_bits_left(rw) >= 8; i++) {
-            if (get_bits(rw, 8))
-                current->payload_size = i;
-        }
-        *rw = tmp;
-    }
+    current->payload_size = cbs_av1_get_payload_bytes_left(rw);
 
     current->payload_ref = av_buffer_alloc(current->payload_size);
     if (!current->payload_ref)
@@ -1638,19 +1861,19 @@
     fb(9, n_frames);
 
     if (current->full_timestamp_flag) {
-        fb(6, seconds_value);
-        fb(6, minutes_value);
-        fb(5, hours_value);
+        fc(6, seconds_value, 0, 59);
+        fc(6, minutes_value, 0, 59);
+        fc(5, hours_value,   0, 23);
     } else {
         flag(seconds_flag);
         if (current->seconds_flag) {
-            fb(6, seconds_value);
+            fc(6, seconds_value, 0, 59);
             flag(minutes_flag);
             if (current->minutes_flag) {
-                fb(6, minutes_value);
+                fc(6, minutes_value, 0, 59);
                 flag(hours_flag);
                 if (current->hours_flag)
-                    fb(5, hours_value);
+                    fc(5, hours_value, 0, 23);
             }
         }
     }
@@ -1658,6 +1881,8 @@
     fb(5, time_offset_length);
     if (current->time_offset_length > 0)
         fb(current->time_offset_length, time_offset_value);
+    else
+        infer(time_offset_length, 0);
 
     return 0;
 }
@@ -1692,3 +1917,27 @@
 
     return 0;
 }
+
+static int FUNC(padding_obu)(CodedBitstreamContext *ctx, RWContext *rw,
+                             AV1RawPadding *current)
+{
+    int i, err;
+
+    HEADER("Padding");
+
+#ifdef READ
+    // The payload runs up to the start of the trailing bits, but there might
+    // be arbitrarily many trailing zeroes so we need to read through twice.
+    current->payload_size = cbs_av1_get_payload_bytes_left(rw);
+
+    current->payload_ref = av_buffer_alloc(current->payload_size);
+    if (!current->payload_ref)
+        return AVERROR(ENOMEM);
+    current->payload = current->payload_ref->data;
+#endif
+
+    for (i = 0; i < current->payload_size; i++)
+        xf(8, obu_padding_byte[i], current->payload[i], 0x00, 0xff, 1, i);
+
+    return 0;
+}
diff --git a/libavcodec/cbs_h264.h b/libavcodec/cbs_h264.h
index 92277e4..9f7c2a0 100644
--- a/libavcodec/cbs_h264.h
+++ b/libavcodec/cbs_h264.h
@@ -38,7 +38,6 @@
 
 
 typedef struct H264RawNALUnitHeader {
-    uint8_t forbidden_zero_bit;
     uint8_t nal_ref_idc;
     uint8_t nal_unit_type;
 
@@ -253,7 +252,7 @@
     uint8_t minutes_value;
     uint8_t hours_flag;
     uint8_t hours_value;
-    uint32_t time_offset;
+    int32_t time_offset;
 } H264RawSEIPicTimestamp;
 
 typedef struct H264RawSEIPicTiming {
@@ -315,6 +314,10 @@
     uint32_t min_display_mastering_luminance;
 } H264RawSEIMasteringDisplayColourVolume;
 
+typedef struct H264RawSEIAlternativeTransferCharacteristics {
+    uint8_t preferred_transfer_characteristics;
+} H264RawSEIAlternativeTransferCharacteristics;
+
 typedef struct H264RawSEIPayload {
     uint32_t payload_type;
     uint32_t payload_size;
@@ -328,6 +331,8 @@
         H264RawSEIRecoveryPoint recovery_point;
         H264RawSEIDisplayOrientation display_orientation;
         H264RawSEIMasteringDisplayColourVolume mastering_display_colour_volume;
+        H264RawSEIAlternativeTransferCharacteristics
+            alternative_transfer_characteristics;
         struct {
             uint8_t *data;
             size_t data_length;
@@ -463,20 +468,26 @@
 
 /**
  * Add an SEI message to an access unit.
+ *
+ * On success, the payload will be owned by a unit in access_unit;
+ * on failure, the content of the payload will be freed.
  */
 int ff_cbs_h264_add_sei_message(CodedBitstreamContext *ctx,
                                 CodedBitstreamFragment *access_unit,
-                                const H264RawSEIPayload *payload);
+                                H264RawSEIPayload *payload);
 
 /**
  * Delete an SEI message from an access unit.
  *
  * Deletes from nal_unit, which must be an SEI NAL unit.  If this is the
  * last message in nal_unit, also deletes it from access_unit.
+ *
+ * Requires nal_unit to be a unit in access_unit and position to be >= 0
+ * and < the payload count of the SEI nal_unit.
  */
-int ff_cbs_h264_delete_sei_message(CodedBitstreamContext *ctx,
-                                   CodedBitstreamFragment *access_unit,
-                                   CodedBitstreamUnit *nal_unit,
-                                   int position);
+void ff_cbs_h264_delete_sei_message(CodedBitstreamContext *ctx,
+                                    CodedBitstreamFragment *access_unit,
+                                    CodedBitstreamUnit *nal_unit,
+                                    int position);
 
 #endif /* AVCODEC_CBS_H264_H */
diff --git a/libavcodec/cbs_h2645.c b/libavcodec/cbs_h2645.c
index 4b31601..d42073c 100644
--- a/libavcodec/cbs_h2645.c
+++ b/libavcodec/cbs_h2645.c
@@ -24,7 +24,6 @@
 #include "cbs_internal.h"
 #include "cbs_h264.h"
 #include "cbs_h265.h"
-#include "golomb.h"
 #include "h264.h"
 #include "h264_sei.h"
 #include "h2645_parse.h"
@@ -251,25 +250,37 @@
 #define SUBSCRIPTS(subs, ...) (subs > 0 ? ((int[subs + 1]){ subs, __VA_ARGS__ }) : NULL)
 
 #define u(width, name, range_min, range_max) \
-        xu(width, name, current->name, range_min, range_max, 0)
-#define flag(name) u(1, name, 0, 1)
+        xu(width, name, current->name, range_min, range_max, 0, )
+#define ub(width, name) \
+        xu(width, name, current->name, 0, MAX_UINT_BITS(width), 0, )
+#define flag(name) ub(1, name)
 #define ue(name, range_min, range_max) \
-        xue(name, current->name, range_min, range_max, 0)
+        xue(name, current->name, range_min, range_max, 0, )
+#define i(width, name, range_min, range_max) \
+        xi(width, name, current->name, range_min, range_max, 0, )
+#define ib(width, name) \
+        xi(width, name, current->name, MIN_INT_BITS(width), MAX_INT_BITS(width), 0, )
 #define se(name, range_min, range_max) \
-        xse(name, current->name, range_min, range_max, 0)
+        xse(name, current->name, range_min, range_max, 0, )
 
 #define us(width, name, range_min, range_max, subs, ...) \
         xu(width, name, current->name, range_min, range_max, subs, __VA_ARGS__)
+#define ubs(width, name, subs, ...) \
+        xu(width, name, current->name, 0, MAX_UINT_BITS(width), subs, __VA_ARGS__)
 #define flags(name, subs, ...) \
         xu(1, name, current->name, 0, 1, subs, __VA_ARGS__)
 #define ues(name, range_min, range_max, subs, ...) \
         xue(name, current->name, range_min, range_max, subs, __VA_ARGS__)
+#define is(width, name, range_min, range_max, subs, ...) \
+        xi(width, name, current->name, range_min, range_max, subs, __VA_ARGS__)
+#define ibs(width, name, subs, ...) \
+        xi(width, name, current->name, MIN_INT_BITS(width), MAX_INT_BITS(width), subs, __VA_ARGS__)
 #define ses(name, range_min, range_max, subs, ...) \
         xse(name, current->name, range_min, range_max, subs, __VA_ARGS__)
 
 #define fixed(width, name, value) do { \
         av_unused uint32_t fixed_value = value; \
-        xu(width, name, fixed_value, value, value, 0); \
+        xu(width, name, fixed_value, value, value, 0, ); \
     } while (0)
 
 
@@ -278,21 +289,28 @@
 #define RWContext GetBitContext
 
 #define xu(width, name, var, range_min, range_max, subs, ...) do { \
-        uint32_t value = range_min; \
+        uint32_t value; \
         CHECK(ff_cbs_read_unsigned(ctx, rw, width, #name, \
                                    SUBSCRIPTS(subs, __VA_ARGS__), \
                                    &value, range_min, range_max)); \
         var = value; \
     } while (0)
 #define xue(name, var, range_min, range_max, subs, ...) do { \
-        uint32_t value = range_min; \
+        uint32_t value; \
         CHECK(cbs_read_ue_golomb(ctx, rw, #name, \
                                  SUBSCRIPTS(subs, __VA_ARGS__), \
                                  &value, range_min, range_max)); \
         var = value; \
     } while (0)
+#define xi(width, name, var, range_min, range_max, subs, ...) do { \
+        int32_t value; \
+        CHECK(ff_cbs_read_signed(ctx, rw, width, #name, \
+                                 SUBSCRIPTS(subs, __VA_ARGS__), \
+                                 &value, range_min, range_max)); \
+        var = value; \
+    } while (0)
 #define xse(name, var, range_min, range_max, subs, ...) do { \
-        int32_t value = range_min; \
+        int32_t value; \
         CHECK(cbs_read_se_golomb(ctx, rw, #name, \
                                  SUBSCRIPTS(subs, __VA_ARGS__), \
                                  &value, range_min, range_max)); \
@@ -309,9 +327,11 @@
     int bits_left = get_bits_left(gbc);
     if (bits_left > 8)
         return 1;
-    if (show_bits(gbc, bits_left) == 1 << (bits_left - 1))
+    if (bits_left == 0)
         return 0;
-    return 1;
+    if (show_bits(gbc, bits_left) & MAX_UINT_BITS(bits_left - 1))
+        return 1;
+    return 0;
 }
 
 #define more_rbsp_data(var) ((var) = cbs_h2645_read_more_rbsp_data(rw))
@@ -319,7 +339,8 @@
 #define byte_alignment(rw) (get_bits_count(rw) % 8)
 
 #define allocate(name, size) do { \
-        name ## _ref = av_buffer_allocz(size); \
+        name ## _ref = av_buffer_allocz(size + \
+                                        AV_INPUT_BUFFER_PADDING_SIZE); \
         if (!name ## _ref) \
             return AVERROR(ENOMEM); \
         name = name ## _ref->data; \
@@ -337,6 +358,7 @@
 #undef READWRITE
 #undef RWContext
 #undef xu
+#undef xi
 #undef xue
 #undef xse
 #undef infer
@@ -361,6 +383,12 @@
                                   SUBSCRIPTS(subs, __VA_ARGS__), \
                                   value, range_min, range_max)); \
     } while (0)
+#define xi(width, name, var, range_min, range_max, subs, ...) do { \
+        int32_t value = var; \
+        CHECK(ff_cbs_write_signed(ctx, rw, width, #name, \
+                                  SUBSCRIPTS(subs, __VA_ARGS__), \
+                                  value, range_min, range_max)); \
+    } while (0)
 #define xse(name, var, range_min, range_max, subs, ...) do { \
         int32_t value = var; \
         CHECK(cbs_write_se_golomb(ctx, rw, #name, \
@@ -401,9 +429,11 @@
 #undef READWRITE
 #undef RWContext
 #undef xu
+#undef xi
 #undef xue
 #undef xse
 #undef u
+#undef i
 #undef flag
 #undef ue
 #undef se
@@ -413,7 +443,7 @@
 #undef allocate
 
 
-static void cbs_h264_free_pps(void *unit, uint8_t *content)
+static void cbs_h264_free_pps(void *opaque, uint8_t *content)
 {
     H264RawPPS *pps = (H264RawPPS*)content;
     av_buffer_unref(&pps->slice_group_id_ref);
@@ -429,6 +459,7 @@
     case H264_SEI_TYPE_RECOVERY_POINT:
     case H264_SEI_TYPE_DISPLAY_ORIENTATION:
     case H264_SEI_TYPE_MASTERING_DISPLAY_COLOUR_VOLUME:
+    case H264_SEI_TYPE_ALTERNATIVE_TRANSFER:
         break;
     case H264_SEI_TYPE_USER_DATA_REGISTERED:
         av_buffer_unref(&payload->payload.user_data_registered.data_ref);
@@ -442,7 +473,7 @@
     }
 }
 
-static void cbs_h264_free_sei(void *unit, uint8_t *content)
+static void cbs_h264_free_sei(void *opaque, uint8_t *content)
 {
     H264RawSEI *sei = (H264RawSEI*)content;
     int i;
@@ -451,35 +482,35 @@
     av_freep(&content);
 }
 
-static void cbs_h264_free_slice(void *unit, uint8_t *content)
+static void cbs_h264_free_slice(void *opaque, uint8_t *content)
 {
     H264RawSlice *slice = (H264RawSlice*)content;
     av_buffer_unref(&slice->data_ref);
     av_freep(&content);
 }
 
-static void cbs_h265_free_vps(void *unit, uint8_t *content)
+static void cbs_h265_free_vps(void *opaque, uint8_t *content)
 {
     H265RawVPS *vps = (H265RawVPS*)content;
     av_buffer_unref(&vps->extension_data.data_ref);
     av_freep(&content);
 }
 
-static void cbs_h265_free_sps(void *unit, uint8_t *content)
+static void cbs_h265_free_sps(void *opaque, uint8_t *content)
 {
     H265RawSPS *sps = (H265RawSPS*)content;
     av_buffer_unref(&sps->extension_data.data_ref);
     av_freep(&content);
 }
 
-static void cbs_h265_free_pps(void *unit, uint8_t *content)
+static void cbs_h265_free_pps(void *opaque, uint8_t *content)
 {
     H265RawPPS *pps = (H265RawPPS*)content;
     av_buffer_unref(&pps->extension_data.data_ref);
     av_freep(&content);
 }
 
-static void cbs_h265_free_slice(void *unit, uint8_t *content)
+static void cbs_h265_free_slice(void *opaque, uint8_t *content)
 {
     H265RawSlice *slice = (H265RawSlice*)content;
     av_buffer_unref(&slice->data_ref);
@@ -489,8 +520,24 @@
 static void cbs_h265_free_sei_payload(H265RawSEIPayload *payload)
 {
     switch (payload->payload_type) {
+    case HEVC_SEI_TYPE_BUFFERING_PERIOD:
+    case HEVC_SEI_TYPE_PICTURE_TIMING:
+    case HEVC_SEI_TYPE_PAN_SCAN_RECT:
+    case HEVC_SEI_TYPE_RECOVERY_POINT:
+    case HEVC_SEI_TYPE_DISPLAY_ORIENTATION:
+    case HEVC_SEI_TYPE_ACTIVE_PARAMETER_SETS:
+    case HEVC_SEI_TYPE_DECODED_PICTURE_HASH:
+    case HEVC_SEI_TYPE_TIME_CODE:
     case HEVC_SEI_TYPE_MASTERING_DISPLAY_INFO:
     case HEVC_SEI_TYPE_CONTENT_LIGHT_LEVEL_INFO:
+    case HEVC_SEI_TYPE_ALTERNATIVE_TRANSFER_CHARACTERISTICS:
+    case HEVC_SEI_TYPE_ALPHA_CHANNEL_INFO:
+        break;
+    case HEVC_SEI_TYPE_USER_DATA_REGISTERED_ITU_T_T35:
+        av_buffer_unref(&payload->payload.user_data_registered.data_ref);
+        break;
+    case HEVC_SEI_TYPE_USER_DATA_UNREGISTERED:
+        av_buffer_unref(&payload->payload.user_data_unregistered.data_ref);
         break;
     default:
         av_buffer_unref(&payload->payload.other.data_ref);
@@ -498,7 +545,7 @@
     }
 }
 
-static void cbs_h265_free_sei(void *unit, uint8_t *content)
+static void cbs_h265_free_sei(void *opaque, uint8_t *content)
 {
     H265RawSEI *sei = (H265RawSEI*)content;
     int i;
@@ -515,26 +562,27 @@
 
     for (i = 0; i < packet->nb_nals; i++) {
         const H2645NAL *nal = &packet->nals[i];
+        AVBufferRef *ref;
         size_t size = nal->size;
-        uint8_t *data;
+
+        if (nal->nuh_layer_id > 0)
+            continue;
 
         // Remove trailing zeroes.
         while (size > 0 && nal->data[size - 1] == 0)
             --size;
-        av_assert0(size > 0);
+        if (size == 0) {
+            av_log(ctx->log_ctx, AV_LOG_VERBOSE, "Discarding empty 0 NAL unit\n");
+            continue;
+        }
 
-        data = av_malloc(size + AV_INPUT_BUFFER_PADDING_SIZE);
-        if (!data)
-            return AVERROR(ENOMEM);
-        memcpy(data, nal->data, size);
-        memset(data + size, 0, AV_INPUT_BUFFER_PADDING_SIZE);
+        ref = (nal->data == nal->raw_data) ? frag->data_ref
+                                           : packet->rbsp.rbsp_buffer_ref;
 
         err = ff_cbs_insert_unit_data(ctx, frag, -1, nal->type,
-                                      data, size, NULL);
-        if (err < 0) {
-            av_freep(&data);
+                            (uint8_t*)nal->data, size, ref);
+        if (err < 0)
             return err;
-        }
     }
 
     return 0;
@@ -568,7 +616,7 @@
         version = bytestream2_get_byte(&gbc);
         if (version != 1) {
             av_log(ctx->log_ctx, AV_LOG_ERROR, "Invalid AVCC header: "
-                   "first byte %u.", version);
+                   "first byte %u.\n", version);
             return AVERROR_INVALIDDATA;
         }
 
@@ -590,7 +638,7 @@
 
         err = ff_h2645_packet_split(&priv->read_packet,
                                     frag->data + start, end - start,
-                                    ctx->log_ctx, 1, 2, AV_CODEC_ID_H264, 1);
+                                    ctx->log_ctx, 1, 2, AV_CODEC_ID_H264, 1, 1);
         if (err < 0) {
             av_log(ctx->log_ctx, AV_LOG_ERROR, "Failed to split AVCC SPS array.\n");
             return err;
@@ -614,7 +662,7 @@
 
         err = ff_h2645_packet_split(&priv->read_packet,
                                     frag->data + start, end - start,
-                                    ctx->log_ctx, 1, 2, AV_CODEC_ID_H264, 1);
+                                    ctx->log_ctx, 1, 2, AV_CODEC_ID_H264, 1, 1);
         if (err < 0) {
             av_log(ctx->log_ctx, AV_LOG_ERROR, "Failed to split AVCC PPS array.\n");
             return err;
@@ -643,7 +691,7 @@
         version = bytestream2_get_byte(&gbc);
         if (version != 1) {
             av_log(ctx->log_ctx, AV_LOG_ERROR, "Invalid HVCC header: "
-                   "first byte %u.", version);
+                   "first byte %u.\n", version);
             return AVERROR_INVALIDDATA;
         }
 
@@ -668,7 +716,7 @@
 
             err = ff_h2645_packet_split(&priv->read_packet,
                                         frag->data + start, end - start,
-                                        ctx->log_ctx, 1, 2, AV_CODEC_ID_HEVC, 1);
+                                        ctx->log_ctx, 1, 2, AV_CODEC_ID_HEVC, 1, 1);
             if (err < 0) {
                 av_log(ctx->log_ctx, AV_LOG_ERROR, "Failed to split "
                        "HVCC array %d (%d NAL units of type %d).\n",
@@ -687,7 +735,7 @@
                                     frag->data, frag->data_size,
                                     ctx->log_ctx,
                                     priv->mp4, priv->nal_length_size,
-                                    codec_id, 1);
+                                    codec_id, 1, 1);
         if (err < 0)
             return err;
 
@@ -706,7 +754,7 @@
     CodedBitstreamH26 ## h26n ## Context *priv = ctx->priv_data; \
     H26 ## h26n ## Raw ## ps_name *ps_var = unit->content; \
     unsigned int id = ps_var->id_element; \
-    if (id > FF_ARRAY_ELEMS(priv->ps_var)) { \
+    if (id >= FF_ARRAY_ELEMS(priv->ps_var)) { \
         av_log(ctx->log_ctx, AV_LOG_ERROR, "Invalid " #ps_name \
                " id : %d.\n", id); \
         return AVERROR_INVALIDDATA; \
@@ -813,15 +861,11 @@
             if (err < 0)
                 return err;
 
+            if (!cbs_h2645_read_more_rbsp_data(&gbc))
+                return AVERROR_INVALIDDATA;
+
             pos = get_bits_count(&gbc);
             len = unit->data_size;
-            if (!unit->data[len - 1]) {
-                int z;
-                for (z = 0; z < len && !unit->data[len - z - 1]; z++);
-                av_log(ctx->log_ctx, AV_LOG_DEBUG, "Deleted %d trailing zeroes "
-                       "from slice data.\n", z);
-                len -= z;
-            }
 
             slice->data_size = len - pos / 8;
             slice->data_ref  = av_buffer_ref(unit->data_ref);
@@ -872,7 +916,21 @@
         break;
 
     case H264_NAL_END_SEQUENCE:
-        return 0;
+    case H264_NAL_END_STREAM:
+        {
+            err = ff_cbs_alloc_unit_content(ctx, unit,
+                                            sizeof(H264RawNALUnitHeader),
+                                            NULL);
+            if (err < 0)
+                return err;
+
+            err = (unit->type == H264_NAL_END_SEQUENCE ?
+                   cbs_h264_read_end_of_sequence :
+                   cbs_h264_read_end_of_stream)(ctx, &gbc, unit->content);
+            if (err < 0)
+                return err;
+        }
+        break;
 
     default:
         return AVERROR(ENOSYS);
@@ -981,15 +1039,11 @@
             if (err < 0)
                 return err;
 
+            if (!cbs_h2645_read_more_rbsp_data(&gbc))
+                return AVERROR_INVALIDDATA;
+
             pos = get_bits_count(&gbc);
             len = unit->data_size;
-            if (!unit->data[len - 1]) {
-                int z;
-                for (z = 0; z < len && !unit->data[len - z - 1]; z++);
-                av_log(ctx->log_ctx, AV_LOG_DEBUG, "Deleted %d trailing zeroes "
-                       "from slice data.\n", z);
-                len -= z;
-            }
 
             slice->data_size = len - pos / 8;
             slice->data_ref  = av_buffer_ref(unit->data_ref);
@@ -1014,6 +1068,7 @@
         break;
 
     case HEVC_NAL_SEI_PREFIX:
+    case HEVC_NAL_SEI_SUFFIX:
         {
             err = ff_cbs_alloc_unit_content(ctx, unit, sizeof(H265RawSEI),
                                             &cbs_h265_free_sei);
@@ -1021,7 +1076,8 @@
             if (err < 0)
                 return err;
 
-            err = cbs_h265_read_sei(ctx, &gbc, unit->content);
+            err = cbs_h265_read_sei(ctx, &gbc, unit->content,
+                                    unit->type == HEVC_NAL_SEI_PREFIX);
 
             if (err < 0)
                 return err;
@@ -1035,6 +1091,64 @@
     return 0;
 }
 
+static int cbs_h2645_write_slice_data(CodedBitstreamContext *ctx,
+                                      PutBitContext *pbc, const uint8_t *data,
+                                      size_t data_size, int data_bit_start)
+{
+    size_t rest  = data_size - (data_bit_start + 7) / 8;
+    const uint8_t *pos = data + data_bit_start / 8;
+
+    av_assert0(data_bit_start >= 0 &&
+               data_size > data_bit_start / 8);
+
+    if (data_size * 8 + 8 > put_bits_left(pbc))
+        return AVERROR(ENOSPC);
+
+    if (!rest)
+        goto rbsp_stop_one_bit;
+
+    // First copy the remaining bits of the first byte
+    // The above check ensures that we do not accidentally
+    // copy beyond the rbsp_stop_one_bit.
+    if (data_bit_start % 8)
+        put_bits(pbc, 8 - data_bit_start % 8,
+                 *pos++ & MAX_UINT_BITS(8 - data_bit_start % 8));
+
+    if (put_bits_count(pbc) % 8 == 0) {
+        // If the writer is aligned at this point,
+        // memcpy can be used to improve performance.
+        // This happens normally for CABAC.
+        flush_put_bits(pbc);
+        memcpy(put_bits_ptr(pbc), pos, rest);
+        skip_put_bytes(pbc, rest);
+    } else {
+        // If not, we have to copy manually.
+        // rbsp_stop_one_bit forces us to special-case
+        // the last byte.
+        uint8_t temp;
+        int i;
+
+        for (; rest > 4; rest -= 4, pos += 4)
+            put_bits32(pbc, AV_RB32(pos));
+
+        for (; rest > 1; rest--, pos++)
+            put_bits(pbc, 8, *pos);
+
+    rbsp_stop_one_bit:
+        temp = rest ? *pos : *pos & MAX_UINT_BITS(8 - data_bit_start % 8);
+
+        av_assert0(temp);
+        i = ff_ctz(*pos);
+        temp = temp >> i;
+        i = rest ? (8 - i) : (8 - i - data_bit_start % 8);
+        put_bits(pbc, i, temp);
+        if (put_bits_count(pbc) % 8)
+            put_bits(pbc, 8 - put_bits_count(pbc) % 8, 0);
+    }
+
+    return 0;
+}
+
 static int cbs_h264_write_nal_unit(CodedBitstreamContext *ctx,
                                    CodedBitstreamUnit *unit,
                                    PutBitContext *pbc)
@@ -1085,37 +1199,17 @@
     case H264_NAL_AUXILIARY_SLICE:
         {
             H264RawSlice *slice = unit->content;
-            GetBitContext gbc;
-            int bits_left, end, zeroes;
 
             err = cbs_h264_write_slice_header(ctx, pbc, &slice->header);
             if (err < 0)
                 return err;
 
             if (slice->data) {
-                if (slice->data_size * 8 + 8 > put_bits_left(pbc))
-                    return AVERROR(ENOSPC);
-
-                init_get_bits(&gbc, slice->data, slice->data_size * 8);
-                skip_bits_long(&gbc, slice->data_bit_start);
-
-                // Copy in two-byte blocks, but stop before copying the
-                // rbsp_stop_one_bit in the final byte.
-                while (get_bits_left(&gbc) > 23)
-                    put_bits(pbc, 16, get_bits(&gbc, 16));
-
-                bits_left = get_bits_left(&gbc);
-                end = get_bits(&gbc, bits_left);
-
-                // rbsp_stop_one_bit must be present here.
-                av_assert0(end);
-                zeroes = ff_ctz(end);
-                if (bits_left > zeroes + 1)
-                    put_bits(pbc, bits_left - zeroes - 1,
-                             end >> (zeroes + 1));
-                put_bits(pbc, 1, 1);
-                while (put_bits_count(pbc) % 8 != 0)
-                    put_bits(pbc, 1, 0);
+                err = cbs_h2645_write_slice_data(ctx, pbc, slice->data,
+                                                 slice->data_size,
+                                                 slice->data_bit_start);
+                if (err < 0)
+                    return err;
             } else {
                 // No slice data - that was just the header.
                 // (Bitstream may be unaligned!)
@@ -1147,6 +1241,22 @@
         }
         break;
 
+    case H264_NAL_END_SEQUENCE:
+        {
+            err = cbs_h264_write_end_of_sequence(ctx, pbc, unit->content);
+            if (err < 0)
+                return err;
+        }
+        break;
+
+    case H264_NAL_END_STREAM:
+        {
+            err = cbs_h264_write_end_of_stream(ctx, pbc, unit->content);
+            if (err < 0)
+                return err;
+        }
+        break;
+
     default:
         av_log(ctx->log_ctx, AV_LOG_ERROR, "Write unimplemented for "
                "NAL unit type %"PRIu32".\n", unit->type);
@@ -1223,37 +1333,17 @@
     case HEVC_NAL_CRA_NUT:
         {
             H265RawSlice *slice = unit->content;
-            GetBitContext gbc;
-            int bits_left, end, zeroes;
 
             err = cbs_h265_write_slice_segment_header(ctx, pbc, &slice->header);
             if (err < 0)
                 return err;
 
             if (slice->data) {
-                if (slice->data_size * 8 + 8 > put_bits_left(pbc))
-                    return AVERROR(ENOSPC);
-
-                init_get_bits(&gbc, slice->data, slice->data_size * 8);
-                skip_bits_long(&gbc, slice->data_bit_start);
-
-                // Copy in two-byte blocks, but stop before copying the
-                // rbsp_stop_one_bit in the final byte.
-                while (get_bits_left(&gbc) > 23)
-                    put_bits(pbc, 16, get_bits(&gbc, 16));
-
-                bits_left = get_bits_left(&gbc);
-                end = get_bits(&gbc, bits_left);
-
-                // rbsp_stop_one_bit must be present here.
-                av_assert0(end);
-                zeroes = ff_ctz(end);
-                if (bits_left > zeroes + 1)
-                    put_bits(pbc, bits_left - zeroes - 1,
-                             end >> (zeroes + 1));
-                put_bits(pbc, 1, 1);
-                while (put_bits_count(pbc) % 8 != 0)
-                    put_bits(pbc, 1, 0);
+                err = cbs_h2645_write_slice_data(ctx, pbc, slice->data,
+                                                 slice->data_size,
+                                                 slice->data_bit_start);
+                if (err < 0)
+                    return err;
             } else {
                 // No slice data - that was just the header.
             }
@@ -1269,8 +1359,10 @@
         break;
 
     case HEVC_NAL_SEI_PREFIX:
+    case HEVC_NAL_SEI_SUFFIX:
         {
-            err = cbs_h265_write_sei(ctx, pbc, unit->content);
+            err = cbs_h265_write_sei(ctx, pbc, unit->content,
+                                     unit->type == HEVC_NAL_SEI_PREFIX);
 
             if (err < 0)
                 return err;
@@ -1286,65 +1378,6 @@
     return 0;
 }
 
-static int cbs_h2645_write_nal_unit(CodedBitstreamContext *ctx,
-                                    CodedBitstreamUnit *unit)
-{
-    CodedBitstreamH2645Context *priv = ctx->priv_data;
-    enum AVCodecID codec_id = ctx->codec->codec_id;
-    PutBitContext pbc;
-    int err;
-
-    if (!priv->write_buffer) {
-        // Initial write buffer size is 1MB.
-        priv->write_buffer_size = 1024 * 1024;
-
-    reallocate_and_try_again:
-        err = av_reallocp(&priv->write_buffer, priv->write_buffer_size);
-        if (err < 0) {
-            av_log(ctx->log_ctx, AV_LOG_ERROR, "Unable to allocate a "
-                   "sufficiently large write buffer (last attempt "
-                   "%"SIZE_SPECIFIER" bytes).\n", priv->write_buffer_size);
-            return err;
-        }
-    }
-
-    init_put_bits(&pbc, priv->write_buffer, priv->write_buffer_size);
-
-    if (codec_id == AV_CODEC_ID_H264)
-        err = cbs_h264_write_nal_unit(ctx, unit, &pbc);
-    else
-        err = cbs_h265_write_nal_unit(ctx, unit, &pbc);
-
-    if (err == AVERROR(ENOSPC)) {
-        // Overflow.
-        priv->write_buffer_size *= 2;
-        goto reallocate_and_try_again;
-    }
-    // Overflow but we didn't notice.
-    av_assert0(put_bits_count(&pbc) <= 8 * priv->write_buffer_size);
-
-    if (err < 0) {
-        // Write failed for some other reason.
-        return err;
-    }
-
-    if (put_bits_count(&pbc) % 8)
-        unit->data_bit_padding = 8 - put_bits_count(&pbc) % 8;
-    else
-        unit->data_bit_padding = 0;
-
-    unit->data_size = (put_bits_count(&pbc) + 7) / 8;
-    flush_put_bits(&pbc);
-
-    err = ff_cbs_alloc_unit_data(ctx, unit, unit->data_size);
-    if (err < 0)
-        return err;
-
-    memcpy(unit->data, priv->write_buffer, unit->data_size);
-
-    return 0;
-}
-
 static int cbs_h2645_assemble_fragment(CodedBitstreamContext *ctx,
                                        CodedBitstreamFragment *frag)
 {
@@ -1360,10 +1393,10 @@
     max_size = 0;
     for (i = 0; i < frag->nb_units; i++) {
         // Start code + content with worst-case emulation prevention.
-        max_size += 3 + frag->units[i].data_size * 3 / 2;
+        max_size += 4 + frag->units[i].data_size * 3 / 2;
     }
 
-    data = av_malloc(max_size + AV_INPUT_BUFFER_PADDING_SIZE);
+    data = av_realloc(NULL, max_size + AV_INPUT_BUFFER_PADDING_SIZE);
     if (!data)
         return AVERROR(ENOMEM);
 
@@ -1439,8 +1472,6 @@
 
     ff_h2645_packet_uninit(&h264->common.read_packet);
 
-    av_freep(&h264->common.write_buffer);
-
     for (i = 0; i < FF_ARRAY_ELEMS(h264->sps); i++)
         av_buffer_unref(&h264->sps_ref[i]);
     for (i = 0; i < FF_ARRAY_ELEMS(h264->pps); i++)
@@ -1454,8 +1485,6 @@
 
     ff_h2645_packet_uninit(&h265->common.read_packet);
 
-    av_freep(&h265->common.write_buffer);
-
     for (i = 0; i < FF_ARRAY_ELEMS(h265->vps); i++)
         av_buffer_unref(&h265->vps_ref[i]);
     for (i = 0; i < FF_ARRAY_ELEMS(h265->sps); i++)
@@ -1471,7 +1500,7 @@
 
     .split_fragment    = &cbs_h2645_split_fragment,
     .read_unit         = &cbs_h264_read_nal_unit,
-    .write_unit        = &cbs_h2645_write_nal_unit,
+    .write_unit        = &cbs_h264_write_nal_unit,
     .assemble_fragment = &cbs_h2645_assemble_fragment,
 
     .close             = &cbs_h264_close,
@@ -1484,7 +1513,7 @@
 
     .split_fragment    = &cbs_h2645_split_fragment,
     .read_unit         = &cbs_h265_read_nal_unit,
-    .write_unit        = &cbs_h2645_write_nal_unit,
+    .write_unit        = &cbs_h265_write_nal_unit,
     .assemble_fragment = &cbs_h2645_assemble_fragment,
 
     .close             = &cbs_h265_close,
@@ -1492,39 +1521,42 @@
 
 int ff_cbs_h264_add_sei_message(CodedBitstreamContext *ctx,
                                 CodedBitstreamFragment *au,
-                                const H264RawSEIPayload *payload)
+                                H264RawSEIPayload *payload)
 {
-    H264RawSEI *sei;
-    CodedBitstreamUnit *nal = NULL;
+    H264RawSEI *sei = NULL;
     int err, i;
 
     // Find an existing SEI NAL unit to add to.
     for (i = 0; i < au->nb_units; i++) {
         if (au->units[i].type == H264_NAL_SEI) {
-            nal = &au->units[i];
-            break;
+            sei = au->units[i].content;
+            if (sei->payload_count < H264_MAX_SEI_PAYLOADS)
+                break;
+
+            sei = NULL;
         }
     }
-    if (nal) {
-        sei = nal->content;
 
-    } else {
+    if (!sei) {
         // Need to make a new SEI NAL unit.  Insert it before the first
         // slice data NAL unit; if no slice data, add at the end.
         AVBufferRef *sei_ref;
 
         sei = av_mallocz(sizeof(*sei));
-        if (!sei)
-            return AVERROR(ENOMEM);
+        if (!sei) {
+            err = AVERROR(ENOMEM);
+            goto fail;
+        }
 
         sei->nal_unit_header.nal_unit_type = H264_NAL_SEI;
         sei->nal_unit_header.nal_ref_idc   = 0;
 
         sei_ref = av_buffer_create((uint8_t*)sei, sizeof(*sei),
-                                   &cbs_h264_free_sei, ctx, 0);
+                                   &cbs_h264_free_sei, NULL, 0);
         if (!sei_ref) {
             av_freep(&sei);
-            return AVERROR(ENOMEM);
+            err = AVERROR(ENOMEM);
+            goto fail;
         }
 
         for (i = 0; i < au->nb_units; i++) {
@@ -1537,25 +1569,22 @@
                                          sei, sei_ref);
         av_buffer_unref(&sei_ref);
         if (err < 0)
-            return err;
-    }
-
-    if (sei->payload_count >= H264_MAX_SEI_PAYLOADS) {
-        av_log(ctx->log_ctx, AV_LOG_ERROR, "Too many payloads in "
-               "SEI NAL unit.\n");
-        return AVERROR(EINVAL);
+            goto fail;
     }
 
     memcpy(&sei->payload[sei->payload_count], payload, sizeof(*payload));
     ++sei->payload_count;
 
     return 0;
+fail:
+    cbs_h264_free_sei_payload(payload);
+    return err;
 }
 
-int ff_cbs_h264_delete_sei_message(CodedBitstreamContext *ctx,
-                                   CodedBitstreamFragment *au,
-                                   CodedBitstreamUnit *nal,
-                                   int position)
+void ff_cbs_h264_delete_sei_message(CodedBitstreamContext *ctx,
+                                    CodedBitstreamFragment *au,
+                                    CodedBitstreamUnit *nal,
+                                    int position)
 {
     H264RawSEI *sei = nal->content;
 
@@ -1570,9 +1599,8 @@
             if (&au->units[i] == nal)
                 break;
         }
-        av_assert0(i < au->nb_units && "NAL unit not in access unit.");
 
-        return ff_cbs_delete_unit(ctx, au, i);
+        ff_cbs_delete_unit(ctx, au, i);
     } else {
         cbs_h264_free_sei_payload(&sei->payload[position]);
 
@@ -1580,7 +1608,5 @@
         memmove(sei->payload + position,
                 sei->payload + position + 1,
                 (sei->payload_count - position) * sizeof(*sei->payload));
-
-        return 0;
     }
 }
diff --git a/libavcodec/cbs_h2645.h b/libavcodec/cbs_h2645.h
index f4cf65b..f4c987a 100644
--- a/libavcodec/cbs_h2645.h
+++ b/libavcodec/cbs_h2645.h
@@ -19,9 +19,6 @@
 #ifndef AVCODEC_CBS_H2645_H
 #define AVCODEC_CBS_H2645_H
 
-#include <stddef.h>
-#include <stdint.h>
-
 #include "h2645_parse.h"
 
 
@@ -33,10 +30,6 @@
     int nal_length_size;
     // Packet reader.
     H2645Packet read_packet;
-
-    // Write buffer
-    uint8_t *write_buffer;
-    size_t write_buffer_size;
 } CodedBitstreamH2645Context;
 
 
diff --git a/libavcodec/cbs_h264_syntax_template.c b/libavcodec/cbs_h264_syntax_template.c
index 1c8d7d5..b654609 100644
--- a/libavcodec/cbs_h264_syntax_template.c
+++ b/libavcodec/cbs_h264_syntax_template.c
@@ -33,9 +33,9 @@
 {
     int err;
 
-    u(1, forbidden_zero_bit, 0, 0);
-    u(2, nal_ref_idc,        0, 3);
-    u(5, nal_unit_type,      0, 31);
+    fixed(1, forbidden_zero_bit, 0);
+    ub(2, nal_ref_idc);
+    ub(5, nal_unit_type);
 
     if (!(1 << current->nal_unit_type & valid_type_mask)) {
         av_log(ctx->log_ctx, AV_LOG_ERROR, "Invalid NAL unit type %d.\n",
@@ -91,8 +91,8 @@
     int err, i;
 
     ue(cpb_cnt_minus1, 0, 31);
-    u(4, bit_rate_scale, 0, 15);
-    u(4, cpb_size_scale, 0, 15);
+    ub(4, bit_rate_scale);
+    ub(4, cpb_size_scale);
 
     for (i = 0; i <= current->cpb_cnt_minus1; i++) {
         ues(bit_rate_value_minus1[i], 0, UINT32_MAX - 1, 1, i);
@@ -100,10 +100,10 @@
         flags(cbr_flag[i], 1, i);
     }
 
-    u(5, initial_cpb_removal_delay_length_minus1, 0, 31);
-    u(5, cpb_removal_delay_length_minus1,         0, 31);
-    u(5, dpb_output_delay_length_minus1,          0, 31);
-    u(5, time_offset_length,                      0, 31);
+    ub(5, initial_cpb_removal_delay_length_minus1);
+    ub(5, cpb_removal_delay_length_minus1);
+    ub(5, dpb_output_delay_length_minus1);
+    ub(5, time_offset_length);
 
     return 0;
 }
@@ -115,10 +115,10 @@
 
     flag(aspect_ratio_info_present_flag);
     if (current->aspect_ratio_info_present_flag) {
-        u(8, aspect_ratio_idc, 0, 255);
+        ub(8, aspect_ratio_idc);
         if (current->aspect_ratio_idc == 255) {
-            u(16, sar_width,  0, 65535);
-            u(16, sar_height, 0, 65535);
+            ub(16, sar_width);
+            ub(16, sar_height);
         }
     } else {
         infer(aspect_ratio_idc, 0);
@@ -130,13 +130,17 @@
 
     flag(video_signal_type_present_flag);
     if (current->video_signal_type_present_flag) {
-        u(3, video_format, 0, 7);
+        ub(3, video_format);
         flag(video_full_range_flag);
         flag(colour_description_present_flag);
         if (current->colour_description_present_flag) {
-            u(8, colour_primaries,         0, 255);
-            u(8, transfer_characteristics, 0, 255);
-            u(8, matrix_coefficients,      0, 255);
+            ub(8, colour_primaries);
+            ub(8, transfer_characteristics);
+            ub(8, matrix_coefficients);
+        } else {
+            infer(colour_primaries,         2);
+            infer(transfer_characteristics, 2);
+            infer(matrix_coefficients,      2);
         }
     } else {
         infer(video_format,             5);
@@ -263,7 +267,7 @@
     CHECK(FUNC(nal_unit_header)(ctx, rw, &current->nal_unit_header,
                                 1 << H264_NAL_SPS));
 
-    u(8, profile_idc, 0, 255);
+    ub(8, profile_idc);
 
     flag(constraint_set0_flag);
     flag(constraint_set1_flag);
@@ -274,7 +278,7 @@
 
     u(2, reserved_zero_2bits,  0, 0);
 
-    u(8, level_idc, 0, 255);
+    ub(8, level_idc);
 
     ue(seq_parameter_set_id, 0, 31);
 
@@ -386,8 +390,8 @@
         flag(alpha_incr_flag);
 
         bits = current->bit_depth_aux_minus8 + 9;
-        u(bits, alpha_opaque_value,      0, MAX_UINT_BITS(bits));
-        u(bits, alpha_transparent_value, 0, MAX_UINT_BITS(bits));
+        ub(bits, alpha_opaque_value);
+        ub(bits, alpha_transparent_value);
     }
 
     flag(additional_extension_flag);
@@ -513,6 +517,8 @@
     const H264RawSPS *sps;
     int err, i, length;
 
+    HEADER("Buffering Period");
+
     ue(seq_parameter_set_id, 0, 31);
 
     sps = h264->sps[current->seq_parameter_set_id];
@@ -551,10 +557,9 @@
 }
 
 static int FUNC(sei_pic_timestamp)(CodedBitstreamContext *ctx, RWContext *rw,
-                                   H264RawSEIPicTimestamp *current)
+                                   H264RawSEIPicTimestamp *current,
+                                   const H264RawSPS *sps)
 {
-    CodedBitstreamH264Context *h264 = ctx->priv_data;
-    const H264RawSPS *sps;
     uint8_t time_offset_length;
     int err;
 
@@ -564,7 +569,7 @@
     flag(full_timestamp_flag);
     flag(discontinuity_flag);
     flag(cnt_dropped_flag);
-    u(8, n_frames, 0, 255);
+    ub(8, n_frames);
     if (current->full_timestamp_flag) {
             u(6, seconds_value, 0, 59);
             u(6, minutes_value, 0, 59);
@@ -583,13 +588,6 @@
         }
     }
 
-    sps = h264->active_sps;
-    if (!sps) {
-        av_log(ctx->log_ctx, AV_LOG_ERROR,
-               "No active SPS for pic_timestamp.\n");
-        return AVERROR_INVALIDDATA;
-    }
-
     if (sps->vui.nal_hrd_parameters_present_flag)
         time_offset_length = sps->vui.nal_hrd_parameters.time_offset_length;
     else if (sps->vui.vcl_hrd_parameters_present_flag)
@@ -598,8 +596,7 @@
         time_offset_length = 24;
 
     if (time_offset_length > 0)
-        u(time_offset_length, time_offset,
-          0, MAX_UINT_BITS(time_offset_length));
+        ib(time_offset_length, time_offset);
     else
         infer(time_offset, 0);
 
@@ -613,6 +610,8 @@
     const H264RawSPS *sps;
     int err;
 
+    HEADER("Picture Timing");
+
     sps = h264->active_sps;
     if (!sps) {
         // If there is exactly one possible SPS but it is not yet active
@@ -650,14 +649,12 @@
             return AVERROR_INVALIDDATA;
         }
 
-        u(hrd->cpb_removal_delay_length_minus1 + 1, cpb_removal_delay,
-          0, MAX_UINT_BITS(hrd->cpb_removal_delay_length_minus1 + 1));
-        u(hrd->dpb_output_delay_length_minus1 + 1, dpb_output_delay,
-          0, MAX_UINT_BITS(hrd->dpb_output_delay_length_minus1 + 1));
+        ub(hrd->cpb_removal_delay_length_minus1 + 1, cpb_removal_delay);
+        ub(hrd->dpb_output_delay_length_minus1 + 1, dpb_output_delay);
     }
 
     if (sps->vui.pic_struct_present_flag) {
-        static const int num_clock_ts[9] = {
+        static const uint8_t num_clock_ts[9] = {
             1, 1, 1, 2, 2, 3, 3, 2, 3
         };
         int i;
@@ -669,7 +666,8 @@
         for (i = 0; i < num_clock_ts[current->pic_struct]; i++) {
             flags(clock_timestamp_flag[i], 1, i);
             if (current->clock_timestamp_flag[i])
-                CHECK(FUNC(sei_pic_timestamp)(ctx, rw, &current->timestamp[i]));
+                CHECK(FUNC(sei_pic_timestamp)(ctx, rw,
+                                              &current->timestamp[i], sps));
         }
     }
 
@@ -681,6 +679,8 @@
 {
     int err, i;
 
+    HEADER("Pan-Scan Rectangle");
+
     ue(pan_scan_rect_id, 0, UINT32_MAX - 1);
     flag(pan_scan_rect_cancel_flag);
 
@@ -706,6 +706,8 @@
 {
     int err, i, j;
 
+    HEADER("User Data Registered ITU-T T.35");
+
     u(8, itu_t_t35_country_code, 0x00, 0xff);
     if (current->itu_t_t35_country_code != 0xff)
         i = 1;
@@ -725,7 +727,7 @@
     *payload_size = i + current->data_length;
 #endif
 
-    allocate(current->data, current->data_length + AV_INPUT_BUFFER_PADDING_SIZE);
+    allocate(current->data, current->data_length);
     for (j = 0; j < current->data_length; j++)
         xu(8, itu_t_t35_payload_byte[i], current->data[j], 0x00, 0xff, 1, i + j);
 
@@ -738,6 +740,8 @@
 {
     int err, i;
 
+    HEADER("User Data Unregistered");
+
 #ifdef READ
     if (*payload_size < 16) {
         av_log(ctx->log_ctx, AV_LOG_ERROR,
@@ -765,6 +769,8 @@
 {
     int err;
 
+    HEADER("Recovery Point");
+
     ue(recovery_frame_cnt, 0, 65535);
     flag(exact_match_flag);
     flag(broken_link_flag);
@@ -778,11 +784,13 @@
 {
     int err;
 
+    HEADER("Display Orientation");
+
     flag(display_orientation_cancel_flag);
     if (!current->display_orientation_cancel_flag) {
         flag(hor_flip);
         flag(ver_flip);
-        u(16, anticlockwise_rotation, 0, 65535);
+        ub(16, anticlockwise_rotation);
         ue(display_orientation_repetition_period, 0, 16384);
         flag(display_orientation_extension_flag);
     }
@@ -795,6 +803,8 @@
 {
     int err, c;
 
+    HEADER("Mastering Display Colour Volume");
+
     for (c = 0; c < 3; c++) {
         us(16, display_primaries_x[c], 0, 50000, 1, c);
         us(16, display_primaries_y[c], 0, 50000, 1, c);
@@ -809,6 +819,19 @@
     return 0;
 }
 
+static int FUNC(sei_alternative_transfer_characteristics)(CodedBitstreamContext *ctx,
+                                                          RWContext *rw,
+                                                          H264RawSEIAlternativeTransferCharacteristics *current)
+{
+    int err;
+
+    HEADER("Alternative Transfer Characteristics");
+
+    ub(8, preferred_transfer_characteristics);
+
+    return 0;
+}
+
 static int FUNC(sei_payload)(CodedBitstreamContext *ctx, RWContext *rw,
                              H264RawSEIPayload *current)
 {
@@ -860,6 +883,10 @@
         CHECK(FUNC(sei_mastering_display_colour_volume)
               (ctx, rw, &current->payload.mastering_display_colour_volume));
         break;
+    case H264_SEI_TYPE_ALTERNATIVE_TRANSFER:
+        CHECK(FUNC(sei_alternative_transfer_characteristics)
+              (ctx, rw, &current->payload.alternative_transfer_characteristics));
+        break;
     default:
         {
 #ifdef READ
@@ -927,6 +954,7 @@
         current->payload[k].payload_type = payload_type;
         current->payload[k].payload_size = payload_size;
 
+        current->payload_count++;
         CHECK(FUNC(sei_payload)(ctx, rw, &current->payload[k]));
 
         if (!cbs_h2645_read_more_rbsp_data(rw))
@@ -937,7 +965,6 @@
                "SEI message: found %d.\n", k);
         return AVERROR_INVALIDDATA;
     }
-    current->payload_count = k + 1;
 #else
     for (k = 0; k < current->payload_count; k++) {
         PutBitContext start_state;
@@ -986,7 +1013,7 @@
     CHECK(FUNC(nal_unit_header)(ctx, rw, &current->nal_unit_header,
                                 1 << H264_NAL_AUD));
 
-    u(3, primary_pic_type, 0, 7);
+    ub(3, primary_pic_type);
 
     CHECK(FUNC(rbsp_trailing_bits)(ctx, rw));
 
@@ -1181,11 +1208,10 @@
                    "in the same access unit.\n");
             return AVERROR_INVALIDDATA;
         }
+        idr_pic_flag = h264->last_slice_nal_unit_type == H264_NAL_IDR_SLICE;
     } else {
-        h264->last_slice_nal_unit_type =
-            current->nal_unit_header.nal_unit_type;
+        idr_pic_flag = current->nal_unit_header.nal_unit_type == H264_NAL_IDR_SLICE;
     }
-    idr_pic_flag = h264->last_slice_nal_unit_type == H264_NAL_IDR_SLICE;
 
     ue(first_mb_in_slice, 0, H264_MAX_MB_PIC_SIZE - 1);
     ue(slice_type, 0, 9);
@@ -1223,8 +1249,7 @@
     if (sps->separate_colour_plane_flag)
         u(2, colour_plane_id, 0, 2);
 
-    u(sps->log2_max_frame_num_minus4 + 4, frame_num,
-      0, MAX_UINT_BITS(sps->log2_max_frame_num_minus4 + 4));
+    ub(sps->log2_max_frame_num_minus4 + 4, frame_num);
 
     if (!sps->frame_mbs_only_flag) {
         flag(field_pic_flag);
@@ -1241,8 +1266,7 @@
         ue(idr_pic_id, 0, 65535);
 
     if (sps->pic_order_cnt_type == 0) {
-        u(sps->log2_max_pic_order_cnt_lsb_minus4 + 4, pic_order_cnt_lsb,
-          0, MAX_UINT_BITS(sps->log2_max_pic_order_cnt_lsb_minus4 + 4));
+        ub(sps->log2_max_pic_order_cnt_lsb_minus4 + 4, pic_order_cnt_lsb);
         if (pps->bottom_field_pic_order_in_frame_present_flag &&
             !current->field_pic_flag)
             se(delta_pic_order_cnt_bottom, INT32_MIN + 1, INT32_MAX);
@@ -1263,6 +1287,13 @@
 
     if (pps->redundant_pic_cnt_present_flag)
         ue(redundant_pic_cnt, 0, 127);
+    else
+        infer(redundant_pic_cnt, 0);
+
+    if (current->nal_unit_header.nal_unit_type != H264_NAL_AUXILIARY_SLICE
+        && !current->redundant_pic_cnt)
+        h264->last_slice_nal_unit_type =
+            current->nal_unit_header.nal_unit_type;
 
     if (slice_type_b)
         flag(direct_spatial_mv_pred_flag);
@@ -1335,7 +1366,7 @@
                    (sps->pic_height_in_map_units_minus1 + 1);
         max = (pic_size + pps->slice_group_change_rate_minus1) /
               (pps->slice_group_change_rate_minus1 + 1);
-        bits = av_log2(2 * max - 1);
+        bits = av_ceil_log2(max + 1);
 
         u(bits, slice_group_change_cycle, 0, max);
     }
@@ -1375,3 +1406,21 @@
 
     return 0;
 }
+
+static int FUNC(end_of_sequence)(CodedBitstreamContext *ctx, RWContext *rw,
+                                 H264RawNALUnitHeader *current)
+{
+    HEADER("End of Sequence");
+
+    return FUNC(nal_unit_header)(ctx, rw, current,
+                                 1 << H264_NAL_END_SEQUENCE);
+}
+
+static int FUNC(end_of_stream)(CodedBitstreamContext *ctx, RWContext *rw,
+                               H264RawNALUnitHeader *current)
+{
+    HEADER("End of Stream");
+
+    return FUNC(nal_unit_header)(ctx, rw, current,
+                                 1 << H264_NAL_END_STREAM);
+}
diff --git a/libavcodec/cbs_h265.h b/libavcodec/cbs_h265.h
index cca1d75..ad746bf 100644
--- a/libavcodec/cbs_h265.h
+++ b/libavcodec/cbs_h265.h
@@ -35,7 +35,6 @@
 };
 
 typedef struct H265RawNALUnitHeader {
-    uint8_t forbidden_zero_bit;
     uint8_t nal_unit_type;
     uint8_t nuh_layer_id;
     uint8_t nuh_temporal_id_plus1;
@@ -71,7 +70,31 @@
     uint8_t sub_layer_profile_present_flag[HEVC_MAX_SUB_LAYERS];
     uint8_t sub_layer_level_present_flag[HEVC_MAX_SUB_LAYERS];
 
-    // TODO: much of that again for each sub-layer.
+    uint8_t sub_layer_profile_space[HEVC_MAX_SUB_LAYERS];
+    uint8_t sub_layer_tier_flag[HEVC_MAX_SUB_LAYERS];
+    uint8_t sub_layer_profile_idc[HEVC_MAX_SUB_LAYERS];
+
+    uint8_t sub_layer_profile_compatibility_flag[HEVC_MAX_SUB_LAYERS][32];
+
+    uint8_t sub_layer_progressive_source_flag[HEVC_MAX_SUB_LAYERS];
+    uint8_t sub_layer_interlaced_source_flag[HEVC_MAX_SUB_LAYERS];
+    uint8_t sub_layer_non_packed_constraint_flag[HEVC_MAX_SUB_LAYERS];
+    uint8_t sub_layer_frame_only_constraint_flag[HEVC_MAX_SUB_LAYERS];
+
+    uint8_t sub_layer_max_12bit_constraint_flag[HEVC_MAX_SUB_LAYERS];
+    uint8_t sub_layer_max_10bit_constraint_flag[HEVC_MAX_SUB_LAYERS];
+    uint8_t sub_layer_max_8bit_constraint_flag[HEVC_MAX_SUB_LAYERS];
+    uint8_t sub_layer_max_422chroma_constraint_flag[HEVC_MAX_SUB_LAYERS];
+    uint8_t sub_layer_max_420chroma_constraint_flag[HEVC_MAX_SUB_LAYERS];
+    uint8_t sub_layer_max_monochrome_constraint_flag[HEVC_MAX_SUB_LAYERS];
+    uint8_t sub_layer_intra_constraint_flag[HEVC_MAX_SUB_LAYERS];
+    uint8_t sub_layer_one_picture_only_constraint_flag[HEVC_MAX_SUB_LAYERS];
+    uint8_t sub_layer_lower_bit_rate_constraint_flag[HEVC_MAX_SUB_LAYERS];
+    uint8_t sub_layer_max_14bit_constraint_flag[HEVC_MAX_SUB_LAYERS];
+
+    uint8_t sub_layer_inbld_flag[HEVC_MAX_SUB_LAYERS];
+
+    uint8_t sub_layer_level_idc[HEVC_MAX_SUB_LAYERS];
 } H265RawProfileTierLevel;
 
 typedef struct H265RawSubLayerHRDParameters {
@@ -524,6 +547,120 @@
     AVBufferRef *data_ref;
 } H265RawSlice;
 
+
+typedef struct H265RawSEIBufferingPeriod {
+    uint8_t  bp_seq_parameter_set_id;
+    uint8_t  irap_cpb_params_present_flag;
+    uint32_t cpb_delay_offset;
+    uint32_t dpb_delay_offset;
+    uint8_t  concatenation_flag;
+    uint32_t au_cpb_removal_delay_delta_minus1;
+
+    uint32_t nal_initial_cpb_removal_delay[HEVC_MAX_CPB_CNT];
+    uint32_t nal_initial_cpb_removal_offset[HEVC_MAX_CPB_CNT];
+    uint32_t nal_initial_alt_cpb_removal_delay[HEVC_MAX_CPB_CNT];
+    uint32_t nal_initial_alt_cpb_removal_offset[HEVC_MAX_CPB_CNT];
+
+    uint32_t vcl_initial_cpb_removal_delay[HEVC_MAX_CPB_CNT];
+    uint32_t vcl_initial_cpb_removal_offset[HEVC_MAX_CPB_CNT];
+    uint32_t vcl_initial_alt_cpb_removal_delay[HEVC_MAX_CPB_CNT];
+    uint32_t vcl_initial_alt_cpb_removal_offset[HEVC_MAX_CPB_CNT];
+
+    uint8_t  use_alt_cpb_params_flag;
+} H265RawSEIBufferingPeriod;
+
+typedef struct H265RawSEIPicTiming {
+    uint8_t pic_struct;
+    uint8_t source_scan_type;
+    uint8_t duplicate_flag;
+
+    uint32_t au_cpb_removal_delay_minus1;
+    uint32_t pic_dpb_output_delay;
+    uint32_t pic_dpb_output_du_delay;
+
+    uint16_t num_decoding_units_minus1;
+    uint8_t  du_common_cpb_removal_delay_flag;
+    uint32_t du_common_cpb_removal_delay_increment_minus1;
+    uint16_t num_nalus_in_du_minus1[HEVC_MAX_SLICE_SEGMENTS];
+    uint32_t du_cpb_removal_delay_increment_minus1[HEVC_MAX_SLICE_SEGMENTS];
+} H265RawSEIPicTiming;
+
+typedef struct H265RawSEIPanScanRect {
+    uint32_t pan_scan_rect_id;
+    uint8_t  pan_scan_rect_cancel_flag;
+    uint8_t  pan_scan_cnt_minus1;
+    int32_t  pan_scan_rect_left_offset[3];
+    int32_t  pan_scan_rect_right_offset[3];
+    int32_t  pan_scan_rect_top_offset[3];
+    int32_t  pan_scan_rect_bottom_offset[3];
+    uint16_t pan_scan_rect_persistence_flag;
+} H265RawSEIPanScanRect;
+
+typedef struct H265RawSEIUserDataRegistered {
+    uint8_t itu_t_t35_country_code;
+    uint8_t itu_t_t35_country_code_extension_byte;
+    uint8_t     *data;
+    size_t       data_length;
+    AVBufferRef *data_ref;
+} H265RawSEIUserDataRegistered;
+
+typedef struct H265RawSEIUserDataUnregistered {
+    uint8_t uuid_iso_iec_11578[16];
+    uint8_t     *data;
+    size_t       data_length;
+    AVBufferRef *data_ref;
+} H265RawSEIUserDataUnregistered;
+
+typedef struct H265RawSEIRecoveryPoint {
+    int16_t recovery_poc_cnt;
+    uint8_t exact_match_flag;
+    uint8_t broken_link_flag;
+} H265RawSEIRecoveryPoint;
+
+typedef struct H265RawSEIDisplayOrientation {
+    uint8_t display_orientation_cancel_flag;
+    uint8_t hor_flip;
+    uint8_t ver_flip;
+    uint16_t anticlockwise_rotation;
+    uint16_t display_orientation_repetition_period;
+    uint8_t display_orientation_persistence_flag;
+} H265RawSEIDisplayOrientation;
+
+typedef struct H265RawSEIActiveParameterSets {
+    uint8_t active_video_parameter_set_id;
+    uint8_t self_contained_cvs_flag;
+    uint8_t no_parameter_set_update_flag;
+    uint8_t num_sps_ids_minus1;
+    uint8_t active_seq_parameter_set_id[HEVC_MAX_SPS_COUNT];
+    uint8_t layer_sps_idx[HEVC_MAX_LAYERS];
+} H265RawSEIActiveParameterSets;
+
+typedef struct H265RawSEIDecodedPictureHash {
+    uint8_t  hash_type;
+    uint8_t  picture_md5[3][16];
+    uint16_t picture_crc[3];
+    uint32_t picture_checksum[3];
+} H265RawSEIDecodedPictureHash;
+
+typedef struct H265RawSEITimeCode {
+    uint8_t  num_clock_ts;
+    uint8_t  clock_timestamp_flag[3];
+    uint8_t  units_field_based_flag[3];
+    uint8_t  counting_type[3];
+    uint8_t  full_timestamp_flag[3];
+    uint8_t  discontinuity_flag[3];
+    uint8_t  cnt_dropped_flag[3];
+    uint16_t n_frames[3];
+    uint8_t  seconds_value[3];
+    uint8_t  minutes_value[3];
+    uint8_t  hours_value[3];
+    uint8_t  seconds_flag[3];
+    uint8_t  minutes_flag[3];
+    uint8_t  hours_flag[3];
+    uint8_t  time_offset_length[3];
+    int32_t  time_offset_value[3];
+} H265RawSEITimeCode;
+
 typedef struct H265RawSEIMasteringDisplayColourVolume {
     uint16_t display_primaries_x[3];
     uint16_t display_primaries_y[3];
@@ -538,12 +675,40 @@
     uint16_t max_pic_average_light_level;
 } H265RawSEIContentLightLevelInfo;
 
+typedef struct H265RawSEIAlternativeTransferCharacteristics {
+    uint8_t preferred_transfer_characteristics;
+} H265RawSEIAlternativeTransferCharacteristics;
+
+typedef struct H265RawSEIAlphaChannelInfo {
+    uint8_t  alpha_channel_cancel_flag;
+    uint8_t  alpha_channel_use_idc;
+    uint8_t  alpha_channel_bit_depth_minus8;
+    uint16_t alpha_transparent_value;
+    uint16_t alpha_opaque_value;
+    uint8_t  alpha_channel_incr_flag;
+    uint8_t  alpha_channel_clip_flag;
+    uint8_t  alpha_channel_clip_type_flag;
+} H265RawSEIAlphaChannelInfo;
+
 typedef struct H265RawSEIPayload {
     uint32_t payload_type;
     uint32_t payload_size;
     union {
+        H265RawSEIBufferingPeriod buffering_period;
+        H265RawSEIPicTiming pic_timing;
+        H265RawSEIPanScanRect pan_scan_rect;
+        H265RawSEIUserDataRegistered user_data_registered;
+        H265RawSEIUserDataUnregistered user_data_unregistered;
+        H265RawSEIRecoveryPoint recovery_point;
+        H265RawSEIDisplayOrientation display_orientation;
+        H265RawSEIActiveParameterSets active_parameter_sets;
+        H265RawSEIDecodedPictureHash decoded_picture_hash;
+        H265RawSEITimeCode time_code;
         H265RawSEIMasteringDisplayColourVolume mastering_display;
         H265RawSEIContentLightLevelInfo content_light_level;
+        H265RawSEIAlternativeTransferCharacteristics
+            alternative_transfer_characteristics;
+        H265RawSEIAlphaChannelInfo alpha_channel_info;
         struct {
             uint8_t *data;
             size_t data_length;
diff --git a/libavcodec/cbs_h265_syntax_template.c b/libavcodec/cbs_h265_syntax_template.c
index d4e4f7b..180a045 100644
--- a/libavcodec/cbs_h265_syntax_template.c
+++ b/libavcodec/cbs_h265_syntax_template.c
@@ -33,13 +33,13 @@
 {
     int err;
 
-    u(1, forbidden_zero_bit, 0, 0);
+    fixed(1, forbidden_zero_bit, 0);
 
     if (expected_nal_unit_type >= 0)
         u(6, nal_unit_type, expected_nal_unit_type,
                             expected_nal_unit_type);
     else
-        u(6, nal_unit_type, 0, 63);
+        ub(6, nal_unit_type);
 
     u(6, nuh_layer_id,          0, 62);
     u(3, nuh_temporal_id_plus1, 1,  7);
@@ -95,7 +95,7 @@
     if (profile_present_flag) {
         u(2, general_profile_space, 0, 0);
         flag(general_tier_flag);
-        u(5, general_profile_idc, 0, 31);
+        ub(5, general_profile_idc);
 
         for (j = 0; j < 32; j++)
             flags(general_profile_compatibility_flag[j], 1, j);
@@ -130,6 +130,11 @@
                 fixed(24, general_reserved_zero_34bits, 0);
                 fixed(10, general_reserved_zero_34bits, 0);
             }
+        } else if (profile_compatible(2)) {
+            fixed(7, general_reserved_zero_7bits, 0);
+            flag(general_one_picture_only_constraint_flag);
+            fixed(24, general_reserved_zero_35bits, 0);
+            fixed(11, general_reserved_zero_35bits, 0);
         } else {
             fixed(24, general_reserved_zero_43bits, 0);
             fixed(19, general_reserved_zero_43bits, 0);
@@ -145,7 +150,7 @@
 #undef profile_compatible
     }
 
-    u(8, general_level_idc, 0, 255);
+    ub(8, general_level_idc);
 
     for (i = 0; i < max_num_sub_layers_minus1; i++) {
         flags(sub_layer_profile_present_flag[i], 1, i);
@@ -158,10 +163,64 @@
     }
 
     for (i = 0; i < max_num_sub_layers_minus1; i++) {
-        if (current->sub_layer_profile_present_flag[i])
-            return AVERROR_PATCHWELCOME;
+        if (current->sub_layer_profile_present_flag[i]) {
+            us(2, sub_layer_profile_space[i], 0, 0, 1, i);
+            flags(sub_layer_tier_flag[i],           1, i);
+            ubs(5, sub_layer_profile_idc[i], 1, i);
+
+            for (j = 0; j < 32; j++)
+                flags(sub_layer_profile_compatibility_flag[i][j], 2, i, j);
+
+            flags(sub_layer_progressive_source_flag[i],    1, i);
+            flags(sub_layer_interlaced_source_flag[i],     1, i);
+            flags(sub_layer_non_packed_constraint_flag[i], 1, i);
+            flags(sub_layer_frame_only_constraint_flag[i], 1, i);
+
+#define profile_compatible(x) (current->sub_layer_profile_idc[i] == (x) ||   \
+                               current->sub_layer_profile_compatibility_flag[i][x])
+            if (profile_compatible(4) || profile_compatible(5) ||
+                profile_compatible(6) || profile_compatible(7) ||
+                profile_compatible(8) || profile_compatible(9) ||
+                profile_compatible(10)) {
+                flags(sub_layer_max_12bit_constraint_flag[i],        1, i);
+                flags(sub_layer_max_10bit_constraint_flag[i],        1, i);
+                flags(sub_layer_max_8bit_constraint_flag[i],         1, i);
+                flags(sub_layer_max_422chroma_constraint_flag[i],    1, i);
+                flags(sub_layer_max_420chroma_constraint_flag[i],    1, i);
+                flags(sub_layer_max_monochrome_constraint_flag[i],   1, i);
+                flags(sub_layer_intra_constraint_flag[i],            1, i);
+                flags(sub_layer_one_picture_only_constraint_flag[i], 1, i);
+                flags(sub_layer_lower_bit_rate_constraint_flag[i],   1, i);
+
+                if (profile_compatible(5)) {
+                    flags(sub_layer_max_14bit_constraint_flag[i], 1, i);
+                    fixed(24, sub_layer_reserved_zero_33bits, 0);
+                    fixed( 9, sub_layer_reserved_zero_33bits, 0);
+                } else {
+                    fixed(24, sub_layer_reserved_zero_34bits, 0);
+                    fixed(10, sub_layer_reserved_zero_34bits, 0);
+                }
+            } else if (profile_compatible(2)) {
+                fixed(7, sub_layer_reserved_zero_7bits, 0);
+                flags(sub_layer_one_picture_only_constraint_flag[i], 1, i);
+                fixed(24, sub_layer_reserved_zero_43bits, 0);
+                fixed(11, sub_layer_reserved_zero_43bits, 0);
+            } else {
+                fixed(24, sub_layer_reserved_zero_43bits, 0);
+                fixed(19, sub_layer_reserved_zero_43bits, 0);
+            }
+
+            if (profile_compatible(1) || profile_compatible(2) ||
+                profile_compatible(3) || profile_compatible(4) ||
+                profile_compatible(5) || profile_compatible(9)) {
+                flags(sub_layer_inbld_flag[i], 1, i);
+            } else {
+                fixed(1, sub_layer_reserved_zero_bit, 0);
+            }
+#undef profile_compatible
+        }
         if (current->sub_layer_level_present_flag[i])
-            return AVERROR_PATCHWELCOME;
+            ubs(8, sub_layer_level_idc[i], 1, i);
     }
 
     return 0;
@@ -206,20 +265,20 @@
             current->vcl_hrd_parameters_present_flag) {
             flag(sub_pic_hrd_params_present_flag);
             if (current->sub_pic_hrd_params_present_flag) {
-                u(8, tick_divisor_minus2, 0, 255);
-                u(5, du_cpb_removal_delay_increment_length_minus1, 0, 31);
+                ub(8, tick_divisor_minus2);
+                ub(5, du_cpb_removal_delay_increment_length_minus1);
                 flag(sub_pic_cpb_params_in_pic_timing_sei_flag);
-                u(5, dpb_output_delay_du_length_minus1, 0, 31);
+                ub(5, dpb_output_delay_du_length_minus1);
             }
 
-            u(4, bit_rate_scale, 0, 15);
-            u(4, cpb_size_scale, 0, 15);
+            ub(4, bit_rate_scale);
+            ub(4, cpb_size_scale);
             if (current->sub_pic_hrd_params_present_flag)
-                u(4, cpb_size_du_scale, 0, 15);
+                ub(4, cpb_size_du_scale);
 
-            u(5, initial_cpb_removal_delay_length_minus1, 0, 31);
-            u(5, au_cpb_removal_delay_length_minus1,      0, 31);
-            u(5, dpb_output_delay_length_minus1,          0, 31);
+            ub(5, initial_cpb_removal_delay_length_minus1);
+            ub(5, au_cpb_removal_delay_length_minus1);
+            ub(5, dpb_output_delay_length_minus1);
         } else {
             infer(sub_pic_hrd_params_present_flag, 0);
 
@@ -264,10 +323,10 @@
 
     flag(aspect_ratio_info_present_flag);
     if (current->aspect_ratio_info_present_flag) {
-        u(8, aspect_ratio_idc, 0, 255);
+        ub(8, aspect_ratio_idc);
         if (current->aspect_ratio_idc == 255) {
-            u(16, sar_width,  0, 65535);
-            u(16, sar_height, 0, 65535);
+            ub(16, sar_width);
+            ub(16, sar_height);
         }
     } else {
         infer(aspect_ratio_idc, 0);
@@ -279,13 +338,13 @@
 
     flag(video_signal_type_present_flag);
     if (current->video_signal_type_present_flag) {
-        u(3, video_format, 0, 7);
+        ub(3, video_format);
         flag(video_full_range_flag);
         flag(colour_description_present_flag);
         if (current->colour_description_present_flag) {
-            u(8, colour_primaries,         0, 255);
-            u(8, transfer_characteristics, 0, 255);
-            u(8, matrix_coefficients,      0, 255);
+            ub(8, colour_primaries);
+            ub(8, transfer_characteristics);
+            ub(8, matrix_coefficients);
         } else {
             infer(colour_primaries,         2);
             infer(transfer_characteristics, 2);
@@ -367,7 +426,7 @@
 
     CHECK(FUNC(nal_unit_header)(ctx, rw, &current->nal_unit_header, HEVC_NAL_VPS));
 
-    u(4, vps_video_parameter_set_id, 0, 15);
+    ub(4, vps_video_parameter_set_id);
 
     flag(vps_base_layer_internal_flag);
     flag(vps_base_layer_available_flag);
@@ -664,8 +723,7 @@
                 int bit_depth = comp == 0 ? current->bit_depth_luma_minus8 + 8
                                           : current->bit_depth_chroma_minus8 + 8;
                 for (i = 0; i <= current->sps_num_palette_predictor_initializer_minus1; i++)
-                    us(bit_depth, sps_palette_predictor_initializers[comp][i],
-                       0, MAX_UINT_BITS(bit_depth), 2, comp, i);
+                    ubs(bit_depth, sps_palette_predictor_initializers[comp][i], 2, comp, i);
             }
         }
     }
@@ -689,7 +747,7 @@
 
     CHECK(FUNC(nal_unit_header)(ctx, rw, &current->nal_unit_header, HEVC_NAL_SPS));
 
-    u(4, sps_video_parameter_set_id, 0, 15);
+    ub(4, sps_video_parameter_set_id);
     h265->active_vps = vps = h265->vps[current->sps_video_parameter_set_id];
 
     u(3, sps_max_sub_layers_minus1, 0, HEVC_MAX_SUB_LAYERS - 1);
@@ -828,9 +886,8 @@
     if (current->long_term_ref_pics_present_flag) {
         ue(num_long_term_ref_pics_sps, 0, HEVC_MAX_LONG_TERM_REF_PICS);
         for (i = 0; i < current->num_long_term_ref_pics_sps; i++) {
-            us(current->log2_max_pic_order_cnt_lsb_minus4 + 4,
-               lt_ref_pic_poc_lsb_sps[i],
-               0, MAX_UINT_BITS(current->log2_max_pic_order_cnt_lsb_minus4 + 4), 1, i);
+            ubs(current->log2_max_pic_order_cnt_lsb_minus4 + 4,
+                lt_ref_pic_poc_lsb_sps[i], 1, i);
             flags(used_by_curr_pic_lt_sps_flag[i], 1, i);
         }
     }
@@ -848,7 +905,7 @@
         flag(sps_multilayer_extension_flag);
         flag(sps_3d_extension_flag);
         flag(sps_scc_extension_flag);
-        u(4, sps_extension_4bits, 0, MAX_UINT_BITS(4));
+        ub(4, sps_extension_4bits);
     }
 
     if (current->sps_range_extension_flag)
@@ -927,8 +984,7 @@
                 int bit_depth = comp == 0 ? current->luma_bit_depth_entry_minus8 + 8
                                           : current->chroma_bit_depth_entry_minus8 + 8;
                 for (i = 0; i < current->pps_num_palette_predictor_initializer; i++)
-                    us(bit_depth, pps_palette_predictor_initializers[comp][i],
-                       0, MAX_UINT_BITS(bit_depth), 2, comp, i);
+                    ubs(bit_depth, pps_palette_predictor_initializers[comp][i], 2, comp, i);
             }
         }
     }
@@ -959,7 +1015,7 @@
 
     flag(dependent_slice_segments_enabled_flag);
     flag(output_flag_present_flag);
-    u(3, num_extra_slice_header_bits, 0, 7);
+    ub(3, num_extra_slice_header_bits);
     flag(sign_data_hiding_enabled_flag);
     flag(cabac_init_present_flag);
 
@@ -1041,7 +1097,7 @@
         flag(pps_multilayer_extension_flag);
         flag(pps_3d_extension_flag);
         flag(pps_scc_extension_flag);
-        u(4, pps_extension_4bits, 0, MAX_UINT_BITS(4));
+        ub(4, pps_extension_4bits);
     }
     if (current->pps_range_extension_flag)
         CHECK(FUNC(pps_range_extension)(ctx, rw, current));
@@ -1219,7 +1275,7 @@
     flag(first_slice_segment_in_pic_flag);
 
     if (current->nal_unit_header.nal_unit_type >= HEVC_NAL_BLA_W_LP &&
-        current->nal_unit_header.nal_unit_type <= HEVC_NAL_IRAP_VCL23)
+        current->nal_unit_header.nal_unit_type <= HEVC_NAL_RSV_IRAP_VCL23)
         flag(no_output_of_prior_pics_flag);
 
     ue(slice_pic_parameter_set_id, 0, 63);
@@ -1276,8 +1332,7 @@
             current->nal_unit_header.nal_unit_type != HEVC_NAL_IDR_N_LP) {
             const H265RawSTRefPicSet *rps;
 
-            u(sps->log2_max_pic_order_cnt_lsb_minus4 + 4, slice_pic_order_cnt_lsb,
-              0, MAX_UINT_BITS(sps->log2_max_pic_order_cnt_lsb_minus4 + 4));
+            ub(sps->log2_max_pic_order_cnt_lsb_minus4 + 4, slice_pic_order_cnt_lsb);
 
             flag(short_term_ref_pic_set_sps_flag);
             if (!current->short_term_ref_pic_set_sps_flag) {
@@ -1323,8 +1378,7 @@
                         if (sps->used_by_curr_pic_lt_sps_flag[current->lt_idx_sps[i]])
                             ++num_pic_total_curr;
                     } else {
-                        us(sps->log2_max_pic_order_cnt_lsb_minus4 + 4, poc_lsb_lt[i],
-                           0, MAX_UINT_BITS(sps->log2_max_pic_order_cnt_lsb_minus4 + 4), 1, i);
+                        ubs(sps->log2_max_pic_order_cnt_lsb_minus4 + 4, poc_lsb_lt[i], 1, i);
                         flags(used_by_curr_pic_lt_flag[i], 1, i);
                         if (current->used_by_curr_pic_lt_flag[i])
                             ++num_pic_total_curr;
@@ -1489,8 +1543,7 @@
         if (current->num_entry_point_offsets > 0) {
             ue(offset_len_minus1, 0, 31);
             for (i = 0; i < current->num_entry_point_offsets; i++)
-                us(current->offset_len_minus1 + 1, entry_point_offset_minus1[i],
-                   0, MAX_UINT_BITS(current->offset_len_minus1 + 1), 1, i);
+                ubs(current->offset_len_minus1 + 1, entry_point_offset_minus1[i], 1, i);
         }
     }
 
@@ -1505,11 +1558,434 @@
     return 0;
 }
 
+static int FUNC(sei_buffering_period)(CodedBitstreamContext *ctx, RWContext *rw,
+                                      H265RawSEIBufferingPeriod *current,
+                                      uint32_t *payload_size)
+{
+    CodedBitstreamH265Context *h265 = ctx->priv_data;
+    const H265RawSPS *sps;
+    const H265RawHRDParameters *hrd;
+    int err, i, length;
+
+#ifdef READ
+    int start_pos, end_pos, bits_left;
+    start_pos = get_bits_count(rw);
+#endif
+
+    HEADER("Buffering Period");
+
+    ue(bp_seq_parameter_set_id, 0, HEVC_MAX_SPS_COUNT - 1);
+
+    sps = h265->sps[current->bp_seq_parameter_set_id];
+    if (!sps) {
+        av_log(ctx->log_ctx, AV_LOG_ERROR, "SPS id %d not available.\n",
+               current->bp_seq_parameter_set_id);
+        return AVERROR_INVALIDDATA;
+    }
+    h265->active_sps = sps;
+
+    if (!sps->vui_parameters_present_flag ||
+        !sps->vui.vui_hrd_parameters_present_flag) {
+        av_log(ctx->log_ctx, AV_LOG_ERROR, "Buffering period SEI requires "
+               "HRD parameters to be present in SPS.\n");
+        return AVERROR_INVALIDDATA;
+    }
+    hrd = &sps->vui.hrd_parameters;
+    if (!hrd->nal_hrd_parameters_present_flag &&
+        !hrd->vcl_hrd_parameters_present_flag) {
+        av_log(ctx->log_ctx, AV_LOG_ERROR, "Buffering period SEI requires "
+               "NAL or VCL HRD parameters to be present.\n");
+        return AVERROR_INVALIDDATA;
+    }
+
+    if (!hrd->sub_pic_hrd_params_present_flag)
+        flag(irap_cpb_params_present_flag);
+    else
+        infer(irap_cpb_params_present_flag, 0);
+    if (current->irap_cpb_params_present_flag) {
+        length = hrd->au_cpb_removal_delay_length_minus1 + 1;
+        ub(length, cpb_delay_offset);
+        length = hrd->dpb_output_delay_length_minus1 + 1;
+        ub(length, dpb_delay_offset);
+    } else {
+        infer(cpb_delay_offset, 0);
+        infer(dpb_delay_offset, 0);
+    }
+
+    flag(concatenation_flag);
+
+    length = hrd->au_cpb_removal_delay_length_minus1 + 1;
+    ub(length, au_cpb_removal_delay_delta_minus1);
+
+    if (hrd->nal_hrd_parameters_present_flag) {
+        for (i = 0; i <= hrd->cpb_cnt_minus1[0]; i++) {
+            length = hrd->initial_cpb_removal_delay_length_minus1 + 1;
+
+            ubs(length, nal_initial_cpb_removal_delay[i], 1, i);
+            ubs(length, nal_initial_cpb_removal_offset[i], 1, i);
+
+            if (hrd->sub_pic_hrd_params_present_flag ||
+                current->irap_cpb_params_present_flag) {
+                ubs(length, nal_initial_alt_cpb_removal_delay[i], 1, i);
+                ubs(length, nal_initial_alt_cpb_removal_offset[i], 1, i);
+            }
+        }
+    }
+    if (hrd->vcl_hrd_parameters_present_flag) {
+        for (i = 0; i <= hrd->cpb_cnt_minus1[0]; i++) {
+            length = hrd->initial_cpb_removal_delay_length_minus1 + 1;
+
+            ubs(length, vcl_initial_cpb_removal_delay[i], 1, i);
+            ubs(length, vcl_initial_cpb_removal_offset[i], 1, i);
+
+            if (hrd->sub_pic_hrd_params_present_flag ||
+                current->irap_cpb_params_present_flag) {
+                ubs(length, vcl_initial_alt_cpb_removal_delay[i], 1, i);
+                ubs(length, vcl_initial_alt_cpb_removal_offset[i], 1, i);
+            }
+        }
+    }
+
+#ifdef READ
+    // payload_extension_present() - true if we are before the last 1-bit
+    // in the payload structure, which must be in the last byte.
+    end_pos = get_bits_count(rw);
+    bits_left = *payload_size * 8 - (end_pos - start_pos);
+    if (bits_left > 0 &&
+        (bits_left > 7 || ff_ctz(show_bits(rw, bits_left)) < bits_left - 1))
+        flag(use_alt_cpb_params_flag);
+    else
+        infer(use_alt_cpb_params_flag, 0);
+#else
+    if (current->use_alt_cpb_params_flag)
+        flag(use_alt_cpb_params_flag);
+#endif
+
+    return 0;
+}
+
+static int FUNC(sei_pic_timing)(CodedBitstreamContext *ctx, RWContext *rw,
+                                H265RawSEIPicTiming *current)
+{
+    CodedBitstreamH265Context *h265 = ctx->priv_data;
+    const H265RawSPS *sps;
+    const H265RawHRDParameters *hrd;
+    int err, expected_source_scan_type, i, length;
+
+    HEADER("Picture Timing");
+
+    sps = h265->active_sps;
+    if (!sps) {
+        av_log(ctx->log_ctx, AV_LOG_ERROR,
+               "No active SPS for pic_timing.\n");
+        return AVERROR_INVALIDDATA;
+    }
+
+    expected_source_scan_type = 2 -
+        2 * sps->profile_tier_level.general_interlaced_source_flag -
+        sps->profile_tier_level.general_progressive_source_flag;
+
+    if (sps->vui.frame_field_info_present_flag) {
+        u(4, pic_struct, 0, 12);
+        u(2, source_scan_type,
+          expected_source_scan_type >= 0 ? expected_source_scan_type : 0,
+          expected_source_scan_type >= 0 ? expected_source_scan_type : 2);
+        flag(duplicate_flag);
+    } else {
+        infer(pic_struct, 0);
+        infer(source_scan_type,
+              expected_source_scan_type >= 0 ? expected_source_scan_type : 2);
+        infer(duplicate_flag, 0);
+    }
+
+    if (sps->vui_parameters_present_flag &&
+        sps->vui.vui_hrd_parameters_present_flag)
+        hrd = &sps->vui.hrd_parameters;
+    else
+        hrd = NULL;
+    if (hrd && (hrd->nal_hrd_parameters_present_flag ||
+                hrd->vcl_hrd_parameters_present_flag)) {
+        length = hrd->au_cpb_removal_delay_length_minus1 + 1;
+        ub(length, au_cpb_removal_delay_minus1);
+
+        length = hrd->dpb_output_delay_length_minus1 + 1;
+        ub(length, pic_dpb_output_delay);
+
+        if (hrd->sub_pic_hrd_params_present_flag) {
+            length = hrd->dpb_output_delay_du_length_minus1 + 1;
+            ub(length, pic_dpb_output_du_delay);
+        }
+
+        if (hrd->sub_pic_hrd_params_present_flag &&
+            hrd->sub_pic_cpb_params_in_pic_timing_sei_flag) {
+            // Each decoding unit must contain at least one slice segment.
+            ue(num_decoding_units_minus1, 0, HEVC_MAX_SLICE_SEGMENTS);
+            flag(du_common_cpb_removal_delay_flag);
+
+            length = hrd->du_cpb_removal_delay_increment_length_minus1 + 1;
+            if (current->du_common_cpb_removal_delay_flag)
+                ub(length, du_common_cpb_removal_delay_increment_minus1);
+
+            for (i = 0; i <= current->num_decoding_units_minus1; i++) {
+                ues(num_nalus_in_du_minus1[i],
+                    0, HEVC_MAX_SLICE_SEGMENTS, 1, i);
+                if (!current->du_common_cpb_removal_delay_flag &&
+                    i < current->num_decoding_units_minus1)
+                    ubs(length, du_cpb_removal_delay_increment_minus1[i], 1, i);
+            }
+        }
+    }
+
+    return 0;
+}
+
+static int FUNC(sei_pan_scan_rect)(CodedBitstreamContext *ctx, RWContext *rw,
+                                   H265RawSEIPanScanRect *current)
+{
+    int err, i;
+
+    HEADER("Pan-Scan Rectangle");
+
+    ue(pan_scan_rect_id, 0, UINT32_MAX - 1);
+    flag(pan_scan_rect_cancel_flag);
+
+    if (!current->pan_scan_rect_cancel_flag) {
+        ue(pan_scan_cnt_minus1, 0, 2);
+
+        for (i = 0; i <= current->pan_scan_cnt_minus1; i++) {
+            ses(pan_scan_rect_left_offset[i],   INT32_MIN + 1, INT32_MAX, 1, i);
+            ses(pan_scan_rect_right_offset[i],  INT32_MIN + 1, INT32_MAX, 1, i);
+            ses(pan_scan_rect_top_offset[i],    INT32_MIN + 1, INT32_MAX, 1, i);
+            ses(pan_scan_rect_bottom_offset[i], INT32_MIN + 1, INT32_MAX, 1, i);
+        }
+
+        flag(pan_scan_rect_persistence_flag);
+    }
+
+    return 0;
+}
+
+static int FUNC(sei_user_data_registered)(CodedBitstreamContext *ctx, RWContext *rw,
+                                          H265RawSEIUserDataRegistered *current,
+                                          uint32_t *payload_size)
+{
+    int err, i, j;
+
+    HEADER("User Data Registered ITU-T T.35");
+
+    u(8, itu_t_t35_country_code, 0x00, 0xff);
+    if (current->itu_t_t35_country_code != 0xff)
+        i = 1;
+    else {
+        u(8, itu_t_t35_country_code_extension_byte, 0x00, 0xff);
+        i = 2;
+    }
+
+#ifdef READ
+    if (*payload_size < i) {
+        av_log(ctx->log_ctx, AV_LOG_ERROR,
+               "Invalid SEI user data registered payload.\n");
+        return AVERROR_INVALIDDATA;
+    }
+    current->data_length = *payload_size - i;
+#else
+    *payload_size = i + current->data_length;
+#endif
+
+    allocate(current->data, current->data_length);
+    for (j = 0; j < current->data_length; j++)
+        xu(8, itu_t_t35_payload_byte[i], current->data[j], 0x00, 0xff, 1, i + j);
+
+    return 0;
+}
+
+static int FUNC(sei_user_data_unregistered)(CodedBitstreamContext *ctx, RWContext *rw,
+                                            H265RawSEIUserDataUnregistered *current,
+                                            uint32_t *payload_size)
+{
+    int err, i;
+
+    HEADER("User Data Unregistered");
+
+#ifdef READ
+    if (*payload_size < 16) {
+        av_log(ctx->log_ctx, AV_LOG_ERROR,
+               "Invalid SEI user data unregistered payload.\n");
+        return AVERROR_INVALIDDATA;
+    }
+    current->data_length = *payload_size - 16;
+#else
+    *payload_size = 16 + current->data_length;
+#endif
+
+    for (i = 0; i < 16; i++)
+        us(8, uuid_iso_iec_11578[i], 0x00, 0xff, 1, i);
+
+    allocate(current->data, current->data_length);
+
+    for (i = 0; i < current->data_length; i++)
+        xu(8, user_data_payload_byte[i], current->data[i], 0x00, 0xff, 1, i);
+
+    return 0;
+}
+
+static int FUNC(sei_recovery_point)(CodedBitstreamContext *ctx, RWContext *rw,
+                                    H265RawSEIRecoveryPoint *current)
+{
+    int err;
+
+    HEADER("Recovery Point");
+
+    se(recovery_poc_cnt, -32768, 32767);
+
+    flag(exact_match_flag);
+    flag(broken_link_flag);
+
+    return 0;
+}
+
+static int FUNC(sei_display_orientation)(CodedBitstreamContext *ctx, RWContext *rw,
+                                         H265RawSEIDisplayOrientation *current)
+{
+    int err;
+
+    HEADER("Display Orientation");
+
+    flag(display_orientation_cancel_flag);
+    if (!current->display_orientation_cancel_flag) {
+        flag(hor_flip);
+        flag(ver_flip);
+        ub(16, anticlockwise_rotation);
+        flag(display_orientation_persistence_flag);
+    }
+
+    return 0;
+}
+
+static int FUNC(sei_active_parameter_sets)(CodedBitstreamContext *ctx, RWContext *rw,
+                                           H265RawSEIActiveParameterSets *current)
+{
+    CodedBitstreamH265Context *h265 = ctx->priv_data;
+    const H265RawVPS *vps;
+    int err, i;
+
+    HEADER("Active Parameter Sets");
+
+    u(4, active_video_parameter_set_id, 0, HEVC_MAX_VPS_COUNT);
+    vps = h265->vps[current->active_video_parameter_set_id];
+    if (!vps) {
+        av_log(ctx->log_ctx, AV_LOG_ERROR, "VPS id %d not available for active "
+               "parameter sets.\n", current->active_video_parameter_set_id);
+        return AVERROR_INVALIDDATA;
+    }
+    h265->active_vps = vps;
+
+    flag(self_contained_cvs_flag);
+    flag(no_parameter_set_update_flag);
+
+    ue(num_sps_ids_minus1, 0, HEVC_MAX_SPS_COUNT - 1);
+    for (i = 0; i <= current->num_sps_ids_minus1; i++)
+        ues(active_seq_parameter_set_id[i], 0, HEVC_MAX_SPS_COUNT - 1, 1, i);
+
+    for (i = vps->vps_base_layer_internal_flag;
+         i <= FFMIN(62, vps->vps_max_layers_minus1); i++) {
+        ues(layer_sps_idx[i], 0, current->num_sps_ids_minus1, 1, i);
+
+        if (i == 0)
+            h265->active_sps = h265->sps[current->active_seq_parameter_set_id[current->layer_sps_idx[0]]];
+    }
+
+    return 0;
+}
+
+static int FUNC(sei_decoded_picture_hash)(CodedBitstreamContext *ctx, RWContext *rw,
+                                          H265RawSEIDecodedPictureHash *current)
+{
+    CodedBitstreamH265Context *h265 = ctx->priv_data;
+    const H265RawSPS *sps = h265->active_sps;
+    int err, c, i;
+
+    HEADER("Decoded Picture Hash");
+
+    if (!sps) {
+        av_log(ctx->log_ctx, AV_LOG_ERROR,
+               "No active SPS for decoded picture hash.\n");
+        return AVERROR_INVALIDDATA;
+    }
+
+    u(8, hash_type, 0, 2);
+
+    for (c = 0; c < (sps->chroma_format_idc == 0 ? 1 : 3); c++) {
+        if (current->hash_type == 0) {
+            for (i = 0; i < 16; i++)
+                us(8, picture_md5[c][i], 0x00, 0xff, 2, c, i);
+        } else if (current->hash_type == 1) {
+            us(16, picture_crc[c], 0x0000, 0xffff, 1, c);
+        } else if (current->hash_type == 2) {
+            us(32, picture_checksum[c], 0x00000000, 0xffffffff, 1, c);
+        }
+    }
+
+    return 0;
+}
+
+static int FUNC(sei_time_code)(CodedBitstreamContext *ctx, RWContext *rw,
+                               H265RawSEITimeCode *current)
+{
+    int err, i;
+
+    HEADER("Time Code");
+
+    u(2, num_clock_ts, 1, 3);
+
+    for (i = 0; i < current->num_clock_ts; i++) {
+        flags(clock_timestamp_flag[i],   1, i);
+
+        if (current->clock_timestamp_flag[i]) {
+            flags(units_field_based_flag[i], 1, i);
+            us(5, counting_type[i], 0, 6,    1, i);
+            flags(full_timestamp_flag[i],    1, i);
+            flags(discontinuity_flag[i],     1, i);
+            flags(cnt_dropped_flag[i],       1, i);
+
+            ubs(9, n_frames[i], 1, i);
+
+            if (current->full_timestamp_flag[i]) {
+                us(6, seconds_value[i], 0, 59, 1, i);
+                us(6, minutes_value[i], 0, 59, 1, i);
+                us(5, hours_value[i],   0, 23, 1, i);
+            } else {
+                flags(seconds_flag[i], 1, i);
+                if (current->seconds_flag[i]) {
+                    us(6, seconds_value[i], 0, 59, 1, i);
+                    flags(minutes_flag[i], 1, i);
+                    if (current->minutes_flag[i]) {
+                        us(6, minutes_value[i], 0, 59, 1, i);
+                        flags(hours_flag[i], 1, i);
+                        if (current->hours_flag[i])
+                            us(5, hours_value[i], 0, 23, 1, i);
+                    }
+                }
+            }
+
+            ubs(5, time_offset_length[i], 1, i);
+            if (current->time_offset_length[i] > 0)
+                ibs(current->time_offset_length[i], time_offset_value[i], 1, i);
+            else
+                infer(time_offset_value[i], 0);
+        }
+    }
+
+    return 0;
+}
+
 static int FUNC(sei_mastering_display)(CodedBitstreamContext *ctx, RWContext *rw,
                                        H265RawSEIMasteringDisplayColourVolume *current)
 {
     int err, c;
 
+    HEADER("Mastering Display Colour Volume");
+
     for (c = 0; c < 3; c++) {
         us(16, display_primaries_x[c], 0, 50000, 1, c);
         us(16, display_primaries_y[c], 0, 50000, 1, c);
@@ -1531,14 +2007,57 @@
 {
     int err;
 
-    u(16, max_content_light_level, 0, MAX_UINT_BITS(16));
-    u(16, max_pic_average_light_level, 0, MAX_UINT_BITS(16));
+    HEADER("Content Light Level");
+
+    ub(16, max_content_light_level);
+    ub(16, max_pic_average_light_level);
+
+    return 0;
+}
+
+static int FUNC(sei_alternative_transfer_characteristics)(CodedBitstreamContext *ctx,
+                                                          RWContext *rw,
+                                                          H265RawSEIAlternativeTransferCharacteristics *current)
+{
+    int err;
+
+    HEADER("Alternative Transfer Characteristics");
+
+    ub(8, preferred_transfer_characteristics);
+
+    return 0;
+}
+
+static int FUNC(sei_alpha_channel_info)(CodedBitstreamContext *ctx,
+                                        RWContext *rw,
+                                        H265RawSEIAlphaChannelInfo *current)
+{
+    int err, length;
+
+    HEADER("Alpha Channel Information");
+
+    flag(alpha_channel_cancel_flag);
+    if (!current->alpha_channel_cancel_flag) {
+        ub(3, alpha_channel_use_idc);
+        ub(3, alpha_channel_bit_depth_minus8);
+        length = current->alpha_channel_bit_depth_minus8 + 9;
+        ub(length, alpha_transparent_value);
+        ub(length, alpha_opaque_value);
+        flag(alpha_channel_incr_flag);
+        flag(alpha_channel_clip_flag);
+        if (current->alpha_channel_clip_flag)
+            flag(alpha_channel_clip_type_flag);
+    } else {
+       infer(alpha_channel_use_idc,   2);
+       infer(alpha_channel_incr_flag, 0);
+       infer(alpha_channel_clip_flag, 0);
+    }
 
     return 0;
 }
 
 static int FUNC(sei_payload)(CodedBitstreamContext *ctx, RWContext *rw,
-                             H265RawSEIPayload *current)
+                             H265RawSEIPayload *current, int prefix)
 {
     int err, i;
     int start_position, end_position;
@@ -1550,18 +2069,48 @@
 #endif
 
     switch (current->payload_type) {
-    case HEVC_SEI_TYPE_MASTERING_DISPLAY_INFO:
-        CHECK(FUNC(sei_mastering_display)
-              (ctx, rw, &current->payload.mastering_display));
+#define SEI_TYPE_CHECK_VALID(name, prefix_valid, suffix_valid) do { \
+            if (prefix && !prefix_valid) { \
+                av_log(ctx->log_ctx, AV_LOG_ERROR, "SEI type %s invalid " \
+                       "as prefix SEI!\n", #name); \
+                return AVERROR_INVALIDDATA; \
+            } \
+            if (!prefix && !suffix_valid) { \
+                av_log(ctx->log_ctx, AV_LOG_ERROR, "SEI type %s invalid " \
+                       "as suffix SEI!\n", #name); \
+                return AVERROR_INVALIDDATA; \
+            } \
+        } while (0)
+#define SEI_TYPE_N(type, prefix_valid, suffix_valid, name) \
+    case HEVC_SEI_TYPE_ ## type: \
+        SEI_TYPE_CHECK_VALID(name, prefix_valid, suffix_valid); \
+        CHECK(FUNC(sei_ ## name)(ctx, rw, &current->payload.name)); \
+        break
+#define SEI_TYPE_S(type, prefix_valid, suffix_valid, name) \
+    case HEVC_SEI_TYPE_ ## type: \
+        SEI_TYPE_CHECK_VALID(name, prefix_valid, suffix_valid); \
+        CHECK(FUNC(sei_ ## name)(ctx, rw, &current->payload.name, \
+                                 &current->payload_size)); \
+        break
 
-        break;
+        SEI_TYPE_S(BUFFERING_PERIOD,         1, 0, buffering_period);
+        SEI_TYPE_N(PICTURE_TIMING,           1, 0, pic_timing);
+        SEI_TYPE_N(PAN_SCAN_RECT,            1, 0, pan_scan_rect);
+        SEI_TYPE_S(USER_DATA_REGISTERED_ITU_T_T35,
+                                             1, 1, user_data_registered);
+        SEI_TYPE_S(USER_DATA_UNREGISTERED,   1, 1, user_data_unregistered);
+        SEI_TYPE_N(RECOVERY_POINT,           1, 0, recovery_point);
+        SEI_TYPE_N(DISPLAY_ORIENTATION,      1, 0, display_orientation);
+        SEI_TYPE_N(ACTIVE_PARAMETER_SETS,    1, 0, active_parameter_sets);
+        SEI_TYPE_N(DECODED_PICTURE_HASH,     0, 1, decoded_picture_hash);
+        SEI_TYPE_N(TIME_CODE,                1, 0, time_code);
+        SEI_TYPE_N(MASTERING_DISPLAY_INFO,   1, 0, mastering_display);
+        SEI_TYPE_N(CONTENT_LIGHT_LEVEL_INFO, 1, 0, content_light_level);
+        SEI_TYPE_N(ALTERNATIVE_TRANSFER_CHARACTERISTICS,
+                                             1, 0, alternative_transfer_characteristics);
+        SEI_TYPE_N(ALPHA_CHANNEL_INFO,       1, 0, alpha_channel_info);
 
-    case HEVC_SEI_TYPE_CONTENT_LIGHT_LEVEL_INFO:
-        CHECK(FUNC(sei_content_light_level)
-              (ctx, rw, &current->payload.content_light_level));
-
-        break;
-
+#undef SEI_TYPE
     default:
         {
 #ifdef READ
@@ -1599,14 +2148,18 @@
 }
 
 static int FUNC(sei)(CodedBitstreamContext *ctx, RWContext *rw,
-                     H265RawSEI *current)
+                     H265RawSEI *current, int prefix)
 {
     int err, k;
 
-    HEADER("Supplemental Enhancement Information");
+    if (prefix)
+        HEADER("Prefix Supplemental Enhancement Information");
+    else
+        HEADER("Suffix Supplemental Enhancement Information");
 
     CHECK(FUNC(nal_unit_header)(ctx, rw, &current->nal_unit_header,
-                                HEVC_NAL_SEI_PREFIX));
+                                prefix ? HEVC_NAL_SEI_PREFIX
+                                       : HEVC_NAL_SEI_SUFFIX));
 
 #ifdef READ
     for (k = 0; k < H265_MAX_SEI_PAYLOADS; k++) {
@@ -1631,7 +2184,8 @@
         current->payload[k].payload_type = payload_type;
         current->payload[k].payload_size = payload_size;
 
-        CHECK(FUNC(sei_payload)(ctx, rw, &current->payload[k]));
+        current->payload_count++;
+        CHECK(FUNC(sei_payload)(ctx, rw, &current->payload[k], prefix));
 
         if (!cbs_h2645_read_more_rbsp_data(rw))
             break;
@@ -1641,7 +2195,6 @@
                "SEI message: found %d.\n", k);
         return AVERROR_INVALIDDATA;
     }
-    current->payload_count = k + 1;
 #else
     for (k = 0; k < current->payload_count; k++) {
         PutBitContext start_state;
@@ -1670,7 +2223,7 @@
             }
             xu(8, last_payload_size_byte, tmp, 0, 254, 0);
 
-            CHECK(FUNC(sei_payload)(ctx, rw, &current->payload[k]));
+            CHECK(FUNC(sei_payload)(ctx, rw, &current->payload[k], prefix));
         }
     }
 #endif
diff --git a/libavcodec/cbs_internal.h b/libavcodec/cbs_internal.h
index 53f2e5d..4c5a535 100644
--- a/libavcodec/cbs_internal.h
+++ b/libavcodec/cbs_internal.h
@@ -44,9 +44,11 @@
     int (*read_unit)(CodedBitstreamContext *ctx,
                      CodedBitstreamUnit *unit);
 
-    // Write the unit->data bitstream from unit->content.
+    // Write the data bitstream from unit->content into pbc.
+    // Return value AVERROR(ENOSPC) indicates that pbc was too small.
     int (*write_unit)(CodedBitstreamContext *ctx,
-                      CodedBitstreamUnit *unit);
+                      CodedBitstreamUnit *unit,
+                      PutBitContext *pbc);
 
     // Read the data from all of frag->units and assemble it into
     // a bitstream for the whole fragment.
@@ -81,10 +83,28 @@
                           const int *subscripts, uint32_t value,
                           uint32_t range_min, uint32_t range_max);
 
-// The largest value representable in N bits, suitable for use as
+int ff_cbs_read_signed(CodedBitstreamContext *ctx, GetBitContext *gbc,
+                       int width, const char *name,
+                       const int *subscripts, int32_t *write_to,
+                       int32_t range_min, int32_t range_max);
+
+int ff_cbs_write_signed(CodedBitstreamContext *ctx, PutBitContext *pbc,
+                        int width, const char *name,
+                        const int *subscripts, int32_t value,
+                        int32_t range_min, int32_t range_max);
+
+// The largest unsigned value representable in N bits, suitable for use as
 // range_max in the above functions.
 #define MAX_UINT_BITS(length) ((UINT64_C(1) << (length)) - 1)
 
+// The largest signed value representable in N bits, suitable for use as
+// range_max in the above functions.
+#define MAX_INT_BITS(length) ((INT64_C(1) << ((length) - 1)) - 1)
+
+// The smallest signed value representable in N bits, suitable for use as
+// range_min in the above functions.
+#define MIN_INT_BITS(length) (-(INT64_C(1) << ((length) - 1)))
+
 
 extern const CodedBitstreamType ff_cbs_type_av1;
 extern const CodedBitstreamType ff_cbs_type_h264;
diff --git a/libavcodec/cbs_jpeg.c b/libavcodec/cbs_jpeg.c
index 5a72f0e..4ff04ae 100644
--- a/libavcodec/cbs_jpeg.c
+++ b/libavcodec/cbs_jpeg.c
@@ -34,7 +34,7 @@
 #define SUBSCRIPTS(subs, ...) (subs > 0 ? ((int[subs + 1]){ subs, __VA_ARGS__ }) : NULL)
 
 #define u(width, name, range_min, range_max) \
-    xu(width, name, range_min, range_max, 0)
+    xu(width, name, range_min, range_max, 0, )
 #define us(width, name, sub, range_min, range_max) \
     xu(width, name, range_min, range_max, 1, sub)
 
@@ -45,7 +45,7 @@
 #define FUNC(name) cbs_jpeg_read_ ## name
 
 #define xu(width, name, range_min, range_max, subs, ...) do { \
-        uint32_t value = range_min; \
+        uint32_t value; \
         CHECK(ff_cbs_read_unsigned(ctx, rw, width, #name, \
                                    SUBSCRIPTS(subs, __VA_ARGS__), \
                                    &value, range_min, range_max)); \
@@ -75,28 +75,28 @@
 
 #include "cbs_jpeg_syntax_template.c"
 
-#undef READ
+#undef WRITE
 #undef READWRITE
 #undef RWContext
 #undef FUNC
 #undef xu
 
 
-static void cbs_jpeg_free_application_data(void *unit, uint8_t *content)
+static void cbs_jpeg_free_application_data(void *opaque, uint8_t *content)
 {
     JPEGRawApplicationData *ad = (JPEGRawApplicationData*)content;
     av_buffer_unref(&ad->Ap_ref);
     av_freep(&content);
 }
 
-static void cbs_jpeg_free_comment(void *unit, uint8_t *content)
+static void cbs_jpeg_free_comment(void *opaque, uint8_t *content)
 {
     JPEGRawComment *comment = (JPEGRawComment*)content;
     av_buffer_unref(&comment->Cm_ref);
     av_freep(&content);
 }
 
-static void cbs_jpeg_free_scan(void *unit, uint8_t *content)
+static void cbs_jpeg_free_scan(void *opaque, uint8_t *content)
 {
     JPEGRawScan *scan = (JPEGRawScan*)content;
     av_buffer_unref(&scan->data_ref);
@@ -197,6 +197,9 @@
         if (marker == JPEG_MARKER_SOS) {
             length = AV_RB16(frag->data + start);
 
+            if (length > end - start)
+                return AVERROR_INVALIDDATA;
+
             data_ref = NULL;
             data     = av_malloc(end - start +
                                  AV_INPUT_BUFFER_PADDING_SIZE);
@@ -225,11 +228,8 @@
 
         err = ff_cbs_insert_unit_data(ctx, frag, unit, marker,
                                       data, data_size, data_ref);
-        if (err < 0) {
-            if (!data_ref)
-                av_freep(&data);
+        if (err < 0)
             return err;
-        }
 
         if (next_marker == -1)
             break;
@@ -330,7 +330,7 @@
                                PutBitContext *pbc)
 {
     JPEGRawScan *scan = unit->content;
-    int i, err;
+    int err;
 
     err = cbs_jpeg_write_scan_header(ctx, pbc, &scan->header);
     if (err < 0)
@@ -340,8 +340,12 @@
         if (scan->data_size * 8 > put_bits_left(pbc))
             return AVERROR(ENOSPC);
 
-        for (i = 0; i < scan->data_size; i++)
-            put_bits(pbc, 8, scan->data[i]);
+        av_assert0(put_bits_count(pbc) % 8 == 0);
+
+        flush_put_bits(pbc);
+
+        memcpy(put_bits_ptr(pbc), scan->data, scan->data_size);
+        skip_put_bytes(pbc, scan->data_size);
     }
 
     return 0;
@@ -377,58 +381,13 @@
 }
 
 static int cbs_jpeg_write_unit(CodedBitstreamContext *ctx,
-                                CodedBitstreamUnit *unit)
+                               CodedBitstreamUnit *unit,
+                               PutBitContext *pbc)
 {
-    CodedBitstreamJPEGContext *priv = ctx->priv_data;
-    PutBitContext pbc;
-    int err;
-
-    if (!priv->write_buffer) {
-        // Initial write buffer size is 1MB.
-        priv->write_buffer_size = 1024 * 1024;
-
-    reallocate_and_try_again:
-        err = av_reallocp(&priv->write_buffer, priv->write_buffer_size);
-        if (err < 0) {
-            av_log(ctx->log_ctx, AV_LOG_ERROR, "Unable to allocate a "
-                   "sufficiently large write buffer (last attempt "
-                   "%"SIZE_SPECIFIER" bytes).\n", priv->write_buffer_size);
-            return err;
-        }
-    }
-
-    init_put_bits(&pbc, priv->write_buffer, priv->write_buffer_size);
-
     if (unit->type == JPEG_MARKER_SOS)
-        err = cbs_jpeg_write_scan(ctx, unit, &pbc);
+        return cbs_jpeg_write_scan   (ctx, unit, pbc);
     else
-        err = cbs_jpeg_write_segment(ctx, unit, &pbc);
-
-    if (err == AVERROR(ENOSPC)) {
-        // Overflow.
-        priv->write_buffer_size *= 2;
-        goto reallocate_and_try_again;
-    }
-    if (err < 0) {
-        // Write failed for some other reason.
-        return err;
-    }
-
-    if (put_bits_count(&pbc) % 8)
-        unit->data_bit_padding = 8 - put_bits_count(&pbc) % 8;
-    else
-        unit->data_bit_padding = 0;
-
-    unit->data_size = (put_bits_count(&pbc) + 7) / 8;
-    flush_put_bits(&pbc);
-
-    err = ff_cbs_alloc_unit_data(ctx, unit, unit->data_size);
-    if (err < 0)
-        return err;
-
-    memcpy(unit->data, priv->write_buffer, unit->data_size);
-
-    return 0;
+        return cbs_jpeg_write_segment(ctx, unit, pbc);
 }
 
 static int cbs_jpeg_assemble_fragment(CodedBitstreamContext *ctx,
@@ -499,22 +458,11 @@
     return 0;
 }
 
-static void cbs_jpeg_close(CodedBitstreamContext *ctx)
-{
-    CodedBitstreamJPEGContext *priv = ctx->priv_data;
-
-    av_freep(&priv->write_buffer);
-}
-
 const CodedBitstreamType ff_cbs_type_jpeg = {
     .codec_id          = AV_CODEC_ID_MJPEG,
 
-    .priv_data_size    = sizeof(CodedBitstreamJPEGContext),
-
     .split_fragment    = &cbs_jpeg_split_fragment,
     .read_unit         = &cbs_jpeg_read_unit,
     .write_unit        = &cbs_jpeg_write_unit,
     .assemble_fragment = &cbs_jpeg_assemble_fragment,
-
-    .close             = &cbs_jpeg_close,
 };
diff --git a/libavcodec/cbs_jpeg.h b/libavcodec/cbs_jpeg.h
index 913d3f9..ff19611 100644
--- a/libavcodec/cbs_jpeg.h
+++ b/libavcodec/cbs_jpeg.h
@@ -120,11 +120,4 @@
 } JPEGRawComment;
 
 
-typedef struct CodedBitstreamJPEGContext {
-    // Write buffer.
-    uint8_t *write_buffer;
-    size_t write_buffer_size;
-} CodedBitstreamJPEGContext;
-
-
 #endif /* AVCODEC_CBS_JPEG_H */
diff --git a/libavcodec/cbs_jpeg_syntax_template.c b/libavcodec/cbs_jpeg_syntax_template.c
index d3cd9ff..6eda56d 100644
--- a/libavcodec/cbs_jpeg_syntax_template.c
+++ b/libavcodec/cbs_jpeg_syntax_template.c
@@ -89,6 +89,8 @@
     ij = 0;
     for (i = 0; i < 16; i++) {
         for (j = 0; j < current->L[i]; j++) {
+            if (ij >= 224)
+                return AVERROR_INVALIDDATA;
             us(8, V[ij], ij, 0, 255);
             ++ij;
         }
@@ -108,6 +110,9 @@
 
     n = 2;
     for (i = 0; n < current->Lh; i++) {
+        if (i >= 8)
+            return AVERROR_INVALIDDATA;
+
         CHECK(FUNC(huffman_table)(ctx, rw, &current->table[i]));
 
         ++n;
diff --git a/libavcodec/cbs_mpeg2.c b/libavcodec/cbs_mpeg2.c
index 0df4234..97f7889 100644
--- a/libavcodec/cbs_mpeg2.c
+++ b/libavcodec/cbs_mpeg2.c
@@ -41,79 +41,123 @@
 #define SUBSCRIPTS(subs, ...) (subs > 0 ? ((int[subs + 1]){ subs, __VA_ARGS__ }) : NULL)
 
 #define ui(width, name) \
-        xui(width, name, current->name, 0)
+        xui(width, name, current->name, 0, MAX_UINT_BITS(width), 0, )
+#define uir(width, name) \
+        xui(width, name, current->name, 1, MAX_UINT_BITS(width), 0, )
 #define uis(width, name, subs, ...) \
-        xui(width, name, current->name, subs, __VA_ARGS__)
+        xui(width, name, current->name, 0, MAX_UINT_BITS(width), subs, __VA_ARGS__)
+#define uirs(width, name, subs, ...) \
+        xui(width, name, current->name, 1, MAX_UINT_BITS(width), subs, __VA_ARGS__)
+#define xui(width, name, var, range_min, range_max, subs, ...) \
+        xuia(width, #name, var, range_min, range_max, subs, __VA_ARGS__)
+#define sis(width, name, subs, ...) \
+        xsi(width, name, current->name, subs, __VA_ARGS__)
+
+#define marker_bit() \
+        bit("marker_bit", 1)
+#define bit(string, value) do { \
+        av_unused uint32_t bit = value; \
+        xuia(1, string, bit, value, value, 0, ); \
+    } while (0)
 
 
 #define READ
 #define READWRITE read
 #define RWContext GetBitContext
 
-#define xui(width, name, var, subs, ...) do { \
-        uint32_t value = 0; \
-        CHECK(ff_cbs_read_unsigned(ctx, rw, width, #name, \
+#define xuia(width, string, var, range_min, range_max, subs, ...) do { \
+        uint32_t value; \
+        CHECK(ff_cbs_read_unsigned(ctx, rw, width, string, \
                                    SUBSCRIPTS(subs, __VA_ARGS__), \
-                                   &value, 0, (1 << width) - 1)); \
+                                   &value, range_min, range_max)); \
         var = value; \
     } while (0)
 
-#define marker_bit() do { \
-        av_unused uint32_t one; \
-        CHECK(ff_cbs_read_unsigned(ctx, rw, 1, "marker_bit", NULL, &one, 1, 1)); \
+#define xsi(width, name, var, subs, ...) do { \
+        int32_t value; \
+        CHECK(ff_cbs_read_signed(ctx, rw, width, #name, \
+                                 SUBSCRIPTS(subs, __VA_ARGS__), &value, \
+                                 MIN_INT_BITS(width), \
+                                 MAX_INT_BITS(width))); \
+        var = value; \
     } while (0)
 
 #define nextbits(width, compare, var) \
     (get_bits_left(rw) >= width && \
      (var = show_bits(rw, width)) == (compare))
 
+#define infer(name, value) do { \
+        current->name = value; \
+    } while (0)
+
 #include "cbs_mpeg2_syntax_template.c"
 
 #undef READ
 #undef READWRITE
 #undef RWContext
-#undef xui
-#undef marker_bit
+#undef xuia
+#undef xsi
 #undef nextbits
+#undef infer
 
 
 #define WRITE
 #define READWRITE write
 #define RWContext PutBitContext
 
-#define xui(width, name, var, subs, ...) do { \
-        CHECK(ff_cbs_write_unsigned(ctx, rw, width, #name, \
+#define xuia(width, string, var, range_min, range_max, subs, ...) do { \
+        CHECK(ff_cbs_write_unsigned(ctx, rw, width, string, \
                                     SUBSCRIPTS(subs, __VA_ARGS__), \
-                                    var, 0, (1 << width) - 1)); \
+                                    var, range_min, range_max)); \
     } while (0)
 
-#define marker_bit() do { \
-        CHECK(ff_cbs_write_unsigned(ctx, rw, 1, "marker_bit", NULL, 1, 1, 1)); \
+#define xsi(width, name, var, subs, ...) do { \
+        CHECK(ff_cbs_write_signed(ctx, rw, width, #name, \
+                                  SUBSCRIPTS(subs, __VA_ARGS__), var, \
+                                  MIN_INT_BITS(width), \
+                                  MAX_INT_BITS(width))); \
     } while (0)
 
 #define nextbits(width, compare, var) (var)
 
+#define infer(name, value) do { \
+        if (current->name != (value)) { \
+            av_log(ctx->log_ctx, AV_LOG_WARNING, "Warning: " \
+                   "%s does not match inferred value: " \
+                   "%"PRId64", but should be %"PRId64".\n", \
+                   #name, (int64_t)current->name, (int64_t)(value)); \
+        } \
+    } while (0)
+
 #include "cbs_mpeg2_syntax_template.c"
 
-#undef READ
+#undef WRITE
 #undef READWRITE
 #undef RWContext
-#undef xui
-#undef marker_bit
+#undef xuia
+#undef xsi
 #undef nextbits
+#undef infer
 
 
-static void cbs_mpeg2_free_user_data(void *unit, uint8_t *content)
+static void cbs_mpeg2_free_picture_header(void *opaque, uint8_t *content)
+{
+    MPEG2RawPictureHeader *picture = (MPEG2RawPictureHeader*)content;
+    av_buffer_unref(&picture->extra_information_picture.extra_information_ref);
+    av_freep(&content);
+}
+
+static void cbs_mpeg2_free_user_data(void *opaque, uint8_t *content)
 {
     MPEG2RawUserData *user = (MPEG2RawUserData*)content;
     av_buffer_unref(&user->user_data_ref);
     av_freep(&content);
 }
 
-static void cbs_mpeg2_free_slice(void *unit, uint8_t *content)
+static void cbs_mpeg2_free_slice(void *opaque, uint8_t *content)
 {
     MPEG2RawSlice *slice = (MPEG2RawSlice*)content;
-    av_buffer_unref(&slice->header.extra_information_ref);
+    av_buffer_unref(&slice->header.extra_information_slice.extra_information_ref);
     av_buffer_unref(&slice->data_ref);
     av_freep(&content);
 }
@@ -123,41 +167,54 @@
                                     int header)
 {
     const uint8_t *start, *end;
-    uint8_t *unit_data;
-    uint32_t start_code = -1, next_start_code = -1;
+    CodedBitstreamUnitType unit_type;
+    uint32_t start_code = -1;
     size_t unit_size;
-    int err, i, unit_type;
+    int err, i, final = 0;
 
     start = avpriv_find_start_code(frag->data, frag->data + frag->data_size,
                                    &start_code);
-    for (i = 0;; i++) {
-        end = avpriv_find_start_code(start, frag->data + frag->data_size,
-                                     &next_start_code);
+    if (start_code >> 8 != 0x000001) {
+        // No start code found.
+        return AVERROR_INVALIDDATA;
+    }
 
+    for (i = 0;; i++) {
         unit_type = start_code & 0xff;
 
-        // The start and end pointers point at to the byte following the
-        // start_code_identifier in the start code that they found.
-        if (end == frag->data + frag->data_size) {
-            // We didn't find a start code, so this is the final unit.
-            unit_size = end - (start - 1);
-        } else {
-            // Unit runs from start to the beginning of the start code
-            // pointed to by end (including any padding zeroes).
-            unit_size = (end - 4) - (start - 1);
+        if (start == frag->data + frag->data_size) {
+            // The last four bytes form a start code which constitutes
+            // a unit of its own.  In this situation avpriv_find_start_code
+            // won't modify start_code at all so modify start_code so that
+            // the next unit will be treated as the last unit.
+            start_code = 0;
         }
 
-        unit_data = (uint8_t *)start - 1;
+        end = avpriv_find_start_code(start--, frag->data + frag->data_size,
+                                     &start_code);
 
-        err = ff_cbs_insert_unit_data(ctx, frag, i, unit_type,
-                                      unit_data, unit_size, frag->data_ref);
+        // start points to the byte containing the start_code_identifier
+        // (may be the last byte of fragment->data); end points to the byte
+        // following the byte containing the start code identifier (or to
+        // the end of fragment->data).
+        if (start_code >> 8 == 0x000001) {
+            // Unit runs from start to the beginning of the start code
+            // pointed to by end (including any padding zeroes).
+            unit_size = (end - 4) - start;
+        } else {
+           // We didn't find a start code, so this is the final unit.
+           unit_size = end - start;
+           final     = 1;
+        }
+
+        err = ff_cbs_insert_unit_data(ctx, frag, i, unit_type, (uint8_t*)start,
+                                      unit_size, frag->data_ref);
         if (err < 0)
             return err;
 
-        if (end == frag->data + frag->data_size)
+        if (final)
             break;
 
-        start_code = next_start_code;
         start = end;
     }
 
@@ -188,6 +245,9 @@
         if (err < 0)
             return err;
 
+        if (!get_bits_left(&gbc))
+            return AVERROR_INVALIDDATA;
+
         pos = get_bits_count(&gbc);
         len = unit->data_size;
 
@@ -215,18 +275,21 @@
                     return err; \
             } \
             break;
-            START(0x00, MPEG2RawPictureHeader,  picture_header,  NULL);
-            START(0xb2, MPEG2RawUserData,       user_data,
-                                            &cbs_mpeg2_free_user_data);
-            START(0xb3, MPEG2RawSequenceHeader, sequence_header, NULL);
-            START(0xb5, MPEG2RawExtensionData,  extension_data,  NULL);
-            START(0xb8, MPEG2RawGroupOfPicturesHeader,
-                                       group_of_pictures_header, NULL);
+            START(MPEG2_START_PICTURE,   MPEG2RawPictureHeader,
+                  picture_header,           &cbs_mpeg2_free_picture_header);
+            START(MPEG2_START_USER_DATA, MPEG2RawUserData,
+                  user_data,                &cbs_mpeg2_free_user_data);
+            START(MPEG2_START_SEQUENCE_HEADER, MPEG2RawSequenceHeader,
+                  sequence_header,          NULL);
+            START(MPEG2_START_EXTENSION, MPEG2RawExtensionData,
+                  extension_data,           NULL);
+            START(MPEG2_START_GROUP,     MPEG2RawGroupOfPicturesHeader,
+                  group_of_pictures_header, NULL);
+            START(MPEG2_START_SEQUENCE_END, MPEG2RawSequenceEnd,
+                  sequence_end,             NULL);
 #undef START
         default:
-            av_log(ctx->log_ctx, AV_LOG_ERROR, "Unknown start code %02"PRIx32".\n",
-                   unit->type);
-            return AVERROR_INVALIDDATA;
+            return AVERROR(ENOSYS);
         }
     }
 
@@ -244,11 +307,13 @@
     case start_code: \
         err = cbs_mpeg2_write_ ## func(ctx, pbc, unit->content); \
         break;
-        START(0x00, MPEG2RawPictureHeader,  picture_header);
-        START(0xb2, MPEG2RawUserData,       user_data);
-        START(0xb3, MPEG2RawSequenceHeader, sequence_header);
-        START(0xb5, MPEG2RawExtensionData,  extension_data);
-        START(0xb8, MPEG2RawGroupOfPicturesHeader, group_of_pictures_header);
+        START(MPEG2_START_PICTURE,         MPEG2RawPictureHeader,  picture_header);
+        START(MPEG2_START_USER_DATA,       MPEG2RawUserData,       user_data);
+        START(MPEG2_START_SEQUENCE_HEADER, MPEG2RawSequenceHeader, sequence_header);
+        START(MPEG2_START_EXTENSION,       MPEG2RawExtensionData,  extension_data);
+        START(MPEG2_START_GROUP,           MPEG2RawGroupOfPicturesHeader,
+                                                         group_of_pictures_header);
+        START(MPEG2_START_SEQUENCE_END,    MPEG2RawSequenceEnd,    sequence_end);
 #undef START
     default:
         av_log(ctx->log_ctx, AV_LOG_ERROR, "Write unimplemented for start "
@@ -264,8 +329,6 @@
                                  PutBitContext *pbc)
 {
     MPEG2RawSlice *slice = unit->content;
-    GetBitContext gbc;
-    size_t bits_left;
     int err;
 
     err = cbs_mpeg2_write_slice_header(ctx, pbc, &slice->header);
@@ -273,79 +336,51 @@
         return err;
 
     if (slice->data) {
+        size_t rest = slice->data_size - (slice->data_bit_start + 7) / 8;
+        uint8_t *pos = slice->data + slice->data_bit_start / 8;
+
+        av_assert0(slice->data_bit_start >= 0 &&
+                   slice->data_size > slice->data_bit_start / 8);
+
         if (slice->data_size * 8 + 8 > put_bits_left(pbc))
             return AVERROR(ENOSPC);
 
-        init_get_bits(&gbc, slice->data, slice->data_size * 8);
-        skip_bits_long(&gbc, slice->data_bit_start);
+        // First copy the remaining bits of the first byte
+        if (slice->data_bit_start % 8)
+            put_bits(pbc, 8 - slice->data_bit_start % 8,
+                     *pos++ & MAX_UINT_BITS(8 - slice->data_bit_start % 8));
 
-        while (get_bits_left(&gbc) > 15)
-            put_bits(pbc, 16, get_bits(&gbc, 16));
+        if (put_bits_count(pbc) % 8 == 0) {
+            // If the writer is aligned at this point,
+            // memcpy can be used to improve performance.
+            // This is the normal case.
+            flush_put_bits(pbc);
+            memcpy(put_bits_ptr(pbc), pos, rest);
+            skip_put_bytes(pbc, rest);
+        } else {
+            // If not, we have to copy manually:
+            for (; rest > 3; rest -= 4, pos += 4)
+                put_bits32(pbc, AV_RB32(pos));
 
-        bits_left = get_bits_left(&gbc);
-        put_bits(pbc, bits_left, get_bits(&gbc, bits_left));
+            for (; rest; rest--, pos++)
+                put_bits(pbc, 8, *pos);
 
-        // Align with zeroes.
-        while (put_bits_count(pbc) % 8 != 0)
-            put_bits(pbc, 1, 0);
+            // Align with zeros
+            put_bits(pbc, 8 - put_bits_count(pbc) % 8, 0);
+        }
     }
 
     return 0;
 }
 
 static int cbs_mpeg2_write_unit(CodedBitstreamContext *ctx,
-                                CodedBitstreamUnit *unit)
+                                CodedBitstreamUnit *unit,
+                                PutBitContext *pbc)
 {
-    CodedBitstreamMPEG2Context *priv = ctx->priv_data;
-    PutBitContext pbc;
-    int err;
-
-    if (!priv->write_buffer) {
-        // Initial write buffer size is 1MB.
-        priv->write_buffer_size = 1024 * 1024;
-
-    reallocate_and_try_again:
-        err = av_reallocp(&priv->write_buffer, priv->write_buffer_size);
-        if (err < 0) {
-            av_log(ctx->log_ctx, AV_LOG_ERROR, "Unable to allocate a "
-                   "sufficiently large write buffer (last attempt "
-                   "%"SIZE_SPECIFIER" bytes).\n", priv->write_buffer_size);
-            return err;
-        }
-    }
-
-    init_put_bits(&pbc, priv->write_buffer, priv->write_buffer_size);
-
-    if (unit->type >= 0x01 && unit->type <= 0xaf)
-        err = cbs_mpeg2_write_slice(ctx, unit, &pbc);
+    if (MPEG2_START_IS_SLICE(unit->type))
+        return cbs_mpeg2_write_slice (ctx, unit, pbc);
     else
-        err = cbs_mpeg2_write_header(ctx, unit, &pbc);
-
-    if (err == AVERROR(ENOSPC)) {
-        // Overflow.
-        priv->write_buffer_size *= 2;
-        goto reallocate_and_try_again;
-    }
-    if (err < 0) {
-        // Write failed for some other reason.
-        return err;
-    }
-
-    if (put_bits_count(&pbc) % 8)
-        unit->data_bit_padding = 8 - put_bits_count(&pbc) % 8;
-    else
-        unit->data_bit_padding = 0;
-
-    unit->data_size = (put_bits_count(&pbc) + 7) / 8;
-    flush_put_bits(&pbc);
-
-    err = ff_cbs_alloc_unit_data(ctx, unit, unit->data_size);
-    if (err < 0)
-        return err;
-
-    memcpy(unit->data, priv->write_buffer, unit->data_size);
-
-    return 0;
+        return cbs_mpeg2_write_header(ctx, unit, pbc);
 }
 
 static int cbs_mpeg2_assemble_fragment(CodedBitstreamContext *ctx,
@@ -385,13 +420,6 @@
     return 0;
 }
 
-static void cbs_mpeg2_close(CodedBitstreamContext *ctx)
-{
-    CodedBitstreamMPEG2Context *priv = ctx->priv_data;
-
-    av_freep(&priv->write_buffer);
-}
-
 const CodedBitstreamType ff_cbs_type_mpeg2 = {
     .codec_id          = AV_CODEC_ID_MPEG2VIDEO,
 
@@ -401,6 +429,4 @@
     .read_unit         = &cbs_mpeg2_read_unit,
     .write_unit        = &cbs_mpeg2_write_unit,
     .assemble_fragment = &cbs_mpeg2_assemble_fragment,
-
-    .close             = &cbs_mpeg2_close,
 };
diff --git a/libavcodec/cbs_mpeg2.h b/libavcodec/cbs_mpeg2.h
index 92caa99..5bcafd0 100644
--- a/libavcodec/cbs_mpeg2.h
+++ b/libavcodec/cbs_mpeg2.h
@@ -51,7 +51,7 @@
     MPEG2_EXTENSION_PICTURE_CODING            = 0x8,
     MPEG2_EXTENSION_PICTURE_SPATIAL_SCALABLE  = 0x9,
     MPEG2_EXTENSION_PICTURE_TEMPORAL_SCALABLE = 0xa,
-    MPEG2_EXTENSION_CAMAERA_PARAMETERS        = 0xb,
+    MPEG2_EXTENSION_CAMERA_PARAMETERS         = 0xb,
     MPEG2_EXTENSION_ITU_T                     = 0xc,
 };
 
@@ -114,6 +114,12 @@
     uint8_t broken_link;
 } MPEG2RawGroupOfPicturesHeader;
 
+typedef struct MPEG2RawExtraInformation {
+    uint8_t     *extra_information;
+    AVBufferRef *extra_information_ref;
+    size_t       extra_information_length;
+} MPEG2RawExtraInformation;
+
 typedef struct MPEG2RawPictureHeader {
     uint8_t picture_start_code;
 
@@ -126,7 +132,7 @@
     uint8_t full_pel_backward_vector;
     uint8_t backward_f_code;
 
-    uint8_t extra_bit_picture;
+    MPEG2RawExtraInformation extra_information_picture;
 } MPEG2RawPictureHeader;
 
 typedef struct MPEG2RawPictureCodingExtension {
@@ -164,8 +170,8 @@
 } MPEG2RawQuantMatrixExtension;
 
 typedef struct MPEG2RawPictureDisplayExtension {
-    uint16_t frame_centre_horizontal_offset[3];
-    uint16_t frame_centre_vertical_offset[3];
+    int16_t frame_centre_horizontal_offset[3];
+    int16_t frame_centre_vertical_offset[3];
 } MPEG2RawPictureDisplayExtension;
 
 typedef struct MPEG2RawExtensionData {
@@ -194,11 +200,7 @@
     uint8_t slice_picture_id_enable;
     uint8_t slice_picture_id;
 
-    uint8_t extra_bit_slice;
-
-    size_t extra_information_length;
-    uint8_t *extra_information;
-    AVBufferRef *extra_information_ref;
+    MPEG2RawExtraInformation extra_information_slice;
 } MPEG2RawSliceHeader;
 
 typedef struct MPEG2RawSlice {
@@ -210,6 +212,10 @@
     AVBufferRef *data_ref;
 } MPEG2RawSlice;
 
+typedef struct MPEG2RawSequenceEnd {
+    uint8_t sequence_end_code;
+} MPEG2RawSequenceEnd;
+
 
 typedef struct CodedBitstreamMPEG2Context {
     // Elements stored in headers which are required for other decoding.
@@ -219,10 +225,6 @@
     uint8_t scalable_mode;
     uint8_t progressive_sequence;
     uint8_t number_of_frame_centre_offsets;
-
-    // Write buffer.
-    uint8_t *write_buffer;
-    size_t write_buffer_size;
 } CodedBitstreamMPEG2Context;
 
 
diff --git a/libavcodec/cbs_mpeg2_syntax_template.c b/libavcodec/cbs_mpeg2_syntax_template.c
index 88cf453..5165a14 100644
--- a/libavcodec/cbs_mpeg2_syntax_template.c
+++ b/libavcodec/cbs_mpeg2_syntax_template.c
@@ -26,14 +26,14 @@
 
     ui(8,  sequence_header_code);
 
-    ui(12, horizontal_size_value);
-    ui(12, vertical_size_value);
+    uir(12, horizontal_size_value);
+    uir(12, vertical_size_value);
 
     mpeg2->horizontal_size = current->horizontal_size_value;
     mpeg2->vertical_size   = current->vertical_size_value;
 
-    ui(4,  aspect_ratio_information);
-    ui(4,  frame_rate_code);
+    uir(4, aspect_ratio_information);
+    uir(4, frame_rate_code);
     ui(18, bit_rate_value);
 
     marker_bit();
@@ -44,13 +44,13 @@
     ui(1, load_intra_quantiser_matrix);
     if (current->load_intra_quantiser_matrix) {
         for (i = 0; i < 64; i++)
-            uis(8, intra_quantiser_matrix[i], 1, i);
+            uirs(8, intra_quantiser_matrix[i], 1, i);
     }
 
     ui(1, load_non_intra_quantiser_matrix);
     if (current->load_non_intra_quantiser_matrix) {
         for (i = 0; i < 64; i++)
-            uis(8, non_intra_quantiser_matrix[i], 1, i);
+            uirs(8, non_intra_quantiser_matrix[i], 1, i);
     }
 
     return 0;
@@ -79,7 +79,7 @@
 #endif
 
     for (k = 0; k < current->user_data_length; k++)
-        xui(8, user_data, current->user_data[k], 0);
+        uis(8, user_data[k], 1, k);
 
     return 0;
 }
@@ -125,9 +125,29 @@
 
     ui(1, colour_description);
     if (current->colour_description) {
-        ui(8, colour_primaries);
-        ui(8, transfer_characteristics);
-        ui(8, matrix_coefficients);
+#ifdef READ
+#define READ_AND_PATCH(name) do { \
+        ui(8, name); \
+        if (current->name == 0) { \
+            current->name = 2; \
+            av_log(ctx->log_ctx, AV_LOG_WARNING, "%s in a sequence display " \
+                   "extension had the invalid value 0. Setting it to 2 " \
+                   "(meaning unknown) instead.\n", #name); \
+        } \
+    } while (0)
+        READ_AND_PATCH(colour_primaries);
+        READ_AND_PATCH(transfer_characteristics);
+        READ_AND_PATCH(matrix_coefficients);
+#undef READ_AND_PATCH
+#else
+        uir(8, colour_primaries);
+        uir(8, transfer_characteristics);
+        uir(8, matrix_coefficients);
+#endif
+    } else {
+        infer(colour_primaries,         2);
+        infer(transfer_characteristics, 2);
+        infer(matrix_coefficients,      2);
     }
 
     ui(14, display_horizontal_size);
@@ -153,6 +173,40 @@
     return 0;
 }
 
+static int FUNC(extra_information)(CodedBitstreamContext *ctx, RWContext *rw,
+                                   MPEG2RawExtraInformation *current,
+                                   const char *element_name, const char *marker_name)
+{
+    int err;
+    size_t k;
+#ifdef READ
+    GetBitContext start = *rw;
+    uint8_t bit;
+
+    for (k = 0; nextbits(1, 1, bit); k++)
+        skip_bits(rw, 1 + 8);
+    current->extra_information_length = k;
+    if (k > 0) {
+        *rw = start;
+        current->extra_information_ref =
+            av_buffer_allocz(k + AV_INPUT_BUFFER_PADDING_SIZE);
+        if (!current->extra_information_ref)
+            return AVERROR(ENOMEM);
+        current->extra_information = current->extra_information_ref->data;
+    }
+#endif
+
+    for (k = 0; k < current->extra_information_length; k++) {
+        bit(marker_name, 1);
+        xuia(8, element_name,
+             current->extra_information[k], 0, 255, 1, k);
+    }
+
+    bit(marker_name, 0);
+
+    return 0;
+}
+
 static int FUNC(picture_header)(CodedBitstreamContext *ctx, RWContext *rw,
                                 MPEG2RawPictureHeader *current)
 {
@@ -163,7 +217,7 @@
     ui(8,  picture_start_code);
 
     ui(10, temporal_reference);
-    ui(3,  picture_coding_type);
+    uir(3, picture_coding_type);
     ui(16, vbv_delay);
 
     if (current->picture_coding_type == 2 ||
@@ -177,7 +231,8 @@
         ui(3, backward_f_code);
     }
 
-    ui(1, extra_bit_picture);
+    CHECK(FUNC(extra_information)(ctx, rw, &current->extra_information_picture,
+                                  "extra_information_picture[k]", "extra_bit_picture"));
 
     return 0;
 }
@@ -190,10 +245,10 @@
 
     HEADER("Picture Coding Extension");
 
-    ui(4, f_code[0][0]);
-    ui(4, f_code[0][1]);
-    ui(4, f_code[1][0]);
-    ui(4, f_code[1][1]);
+    uir(4, f_code[0][0]);
+    uir(4, f_code[0][1]);
+    uir(4, f_code[1][0]);
+    uir(4, f_code[1][1]);
 
     ui(2, intra_dc_precision);
     ui(2, picture_structure);
@@ -250,25 +305,25 @@
     ui(1, load_intra_quantiser_matrix);
     if (current->load_intra_quantiser_matrix) {
         for (i = 0; i < 64; i++)
-            uis(8, intra_quantiser_matrix[i], 1, i);
+            uirs(8, intra_quantiser_matrix[i], 1, i);
     }
 
     ui(1, load_non_intra_quantiser_matrix);
     if (current->load_non_intra_quantiser_matrix) {
         for (i = 0; i < 64; i++)
-            uis(8, non_intra_quantiser_matrix[i], 1, i);
+            uirs(8, non_intra_quantiser_matrix[i], 1, i);
     }
 
     ui(1, load_chroma_intra_quantiser_matrix);
     if (current->load_chroma_intra_quantiser_matrix) {
         for (i = 0; i < 64; i++)
-            uis(8, intra_quantiser_matrix[i], 1, i);
+            uirs(8, intra_quantiser_matrix[i], 1, i);
     }
 
     ui(1, load_chroma_non_intra_quantiser_matrix);
     if (current->load_chroma_non_intra_quantiser_matrix) {
         for (i = 0; i < 64; i++)
-            uis(8, chroma_non_intra_quantiser_matrix[i], 1, i);
+            uirs(8, chroma_non_intra_quantiser_matrix[i], 1, i);
     }
 
     return 0;
@@ -283,9 +338,9 @@
     HEADER("Picture Display Extension");
 
     for (i = 0; i < mpeg2->number_of_frame_centre_offsets; i++) {
-        ui(16, frame_centre_horizontal_offset[i]);
+        sis(16, frame_centre_horizontal_offset[i], 1, i);
         marker_bit();
-        ui(16, frame_centre_vertical_offset[i]);
+        sis(16, frame_centre_vertical_offset[i],   1, i);
         marker_bit();
     }
 
@@ -303,25 +358,25 @@
     ui(4, extension_start_code_identifier);
 
     switch (current->extension_start_code_identifier) {
-    case 1:
+    case MPEG2_EXTENSION_SEQUENCE:
         return FUNC(sequence_extension)
             (ctx, rw, &current->data.sequence);
-    case 2:
+    case MPEG2_EXTENSION_SEQUENCE_DISPLAY:
         return FUNC(sequence_display_extension)
             (ctx, rw, &current->data.sequence_display);
-    case 3:
+    case MPEG2_EXTENSION_QUANT_MATRIX:
         return FUNC(quant_matrix_extension)
             (ctx, rw, &current->data.quant_matrix);
-    case 7:
+    case MPEG2_EXTENSION_PICTURE_DISPLAY:
         return FUNC(picture_display_extension)
             (ctx, rw, &current->data.picture_display);
-    case 8:
+    case MPEG2_EXTENSION_PICTURE_CODING:
         return FUNC(picture_coding_extension)
             (ctx, rw, &current->data.picture_coding);
     default:
-        av_log(ctx->log_ctx, AV_LOG_ERROR, "Invalid extension ID %d.\n",
+        av_log(ctx->log_ctx, AV_LOG_ERROR, "Extension ID %d not supported.\n",
                current->extension_start_code_identifier);
-        return AVERROR_INVALIDDATA;
+        return AVERROR_PATCHWELCOME;
     }
 }
 
@@ -342,45 +397,29 @@
             ui(7, priority_breakpoint);
     }
 
-    ui(5, quantiser_scale_code);
+    uir(5, quantiser_scale_code);
 
     if (nextbits(1, 1, current->slice_extension_flag)) {
         ui(1, slice_extension_flag);
         ui(1, intra_slice);
         ui(1, slice_picture_id_enable);
         ui(6, slice_picture_id);
-
-        {
-            size_t k;
-#ifdef READ
-            GetBitContext start;
-            uint8_t bit;
-            start = *rw;
-            for (k = 0; nextbits(1, 1, bit); k++)
-                skip_bits(rw, 8);
-            current->extra_information_length = k;
-            if (k > 0) {
-                *rw = start;
-                current->extra_information =
-                    av_malloc(current->extra_information_length);
-                if (!current->extra_information)
-                    return AVERROR(ENOMEM);
-                for (k = 0; k < current->extra_information_length; k++) {
-                    xui(1, extra_bit_slice, bit, 0);
-                    xui(8, extra_information_slice[k],
-                        current->extra_information[k], 1, k);
-                }
-            }
-#else
-            for (k = 0; k < current->extra_information_length; k++) {
-                xui(1, extra_bit_slice, 1, 0);
-                xui(8, extra_information_slice[k],
-                    current->extra_information[k], 1, k);
-            }
-#endif
-        }
     }
-    ui(1, extra_bit_slice);
+
+    CHECK(FUNC(extra_information)(ctx, rw, &current->extra_information_slice,
+                                  "extra_information_slice[k]", "extra_bit_slice"));
+
+    return 0;
+}
+
+static int FUNC(sequence_end)(CodedBitstreamContext *ctx, RWContext *rw,
+                              MPEG2RawSequenceEnd *current)
+{
+    int err;
+
+    HEADER("Sequence End");
+
+    ui(8, sequence_end_code);
 
     return 0;
 }
diff --git a/libavcodec/cbs_vp9.c b/libavcodec/cbs_vp9.c
index 7498be4..eef603b 100644
--- a/libavcodec/cbs_vp9.c
+++ b/libavcodec/cbs_vp9.c
@@ -253,28 +253,27 @@
 #define SUBSCRIPTS(subs, ...) (subs > 0 ? ((int[subs + 1]){ subs, __VA_ARGS__ }) : NULL)
 
 #define f(width, name) \
-        xf(width, name, current->name, 0)
+        xf(width, name, current->name, 0, )
 #define s(width, name) \
-        xs(width, name, current->name, 0)
+        xs(width, name, current->name, 0, )
 #define fs(width, name, subs, ...) \
         xf(width, name, current->name, subs, __VA_ARGS__)
 #define ss(width, name, subs, ...) \
         xs(width, name, current->name, subs, __VA_ARGS__)
 
-
 #define READ
 #define READWRITE read
 #define RWContext GetBitContext
 
 #define xf(width, name, var, subs, ...) do { \
-        uint32_t value = 0; \
+        uint32_t value; \
         CHECK(ff_cbs_read_unsigned(ctx, rw, width, #name, \
                                    SUBSCRIPTS(subs, __VA_ARGS__), \
                                    &value, 0, (1 << width) - 1)); \
         var = value; \
     } while (0)
 #define xs(width, name, var, subs, ...) do { \
-        int32_t value = 0; \
+        int32_t value; \
         CHECK(cbs_vp9_read_s(ctx, rw, width, #name, \
                              SUBSCRIPTS(subs, __VA_ARGS__), &value)); \
         var = value; \
@@ -282,7 +281,7 @@
 
 
 #define increment(name, min, max) do { \
-        uint32_t value = 0; \
+        uint32_t value; \
         CHECK(cbs_vp9_read_increment(ctx, rw, min, max, #name, &value)); \
         current->name = value; \
     } while (0)
@@ -295,9 +294,9 @@
 #define delta_q(name) do { \
         uint8_t delta_coded; \
         int8_t delta_q; \
-        xf(1, name.delta_coded, delta_coded, 0); \
+        xf(1, name.delta_coded, delta_coded, 0, ); \
         if (delta_coded) \
-            xs(4, name.delta_q, delta_q, 0); \
+            xs(4, name.delta_q, delta_q, 0, ); \
         else \
             delta_q = 0; \
         current->name = delta_q; \
@@ -305,7 +304,7 @@
 
 #define prob(name, subs, ...) do { \
         uint8_t prob_coded; \
-        int8_t prob; \
+        uint8_t prob; \
         xf(1, name.prob_coded, prob_coded, subs, __VA_ARGS__); \
         if (prob_coded) \
             xf(8, name.prob, prob, subs, __VA_ARGS__); \
@@ -314,6 +313,12 @@
         current->name = prob; \
     } while (0)
 
+#define fixed(width, name, value) do { \
+        av_unused uint32_t fixed_value; \
+        CHECK(ff_cbs_read_unsigned(ctx, rw, width, #name, \
+                                   0, &fixed_value, value, value)); \
+    } while (0)
+
 #define infer(name, value) do { \
         current->name = value; \
     } while (0)
@@ -331,6 +336,7 @@
 #undef fle
 #undef delta_q
 #undef prob
+#undef fixed
 #undef infer
 #undef byte_alignment
 
@@ -359,9 +365,9 @@
     } while (0)
 
 #define delta_q(name) do { \
-        xf(1, name.delta_coded, !!current->name, 0); \
+        xf(1, name.delta_coded, !!current->name, 0, ); \
         if (current->name) \
-            xs(4, name.delta_q, current->name, 0); \
+            xs(4, name.delta_q, current->name, 0, ); \
     } while (0)
 
 #define prob(name, subs, ...) do { \
@@ -370,6 +376,11 @@
             xf(8, name.prob, current->name, subs, __VA_ARGS__); \
     } while (0)
 
+#define fixed(width, name, value) do { \
+        CHECK(ff_cbs_write_unsigned(ctx, rw, width, #name, \
+                                    0, value, value, value)); \
+    } while (0)
+
 #define infer(name, value) do { \
         if (current->name != (value)) { \
             av_log(ctx->log_ctx, AV_LOG_WARNING, "Warning: " \
@@ -383,7 +394,7 @@
 
 #include "cbs_vp9_syntax_template.c"
 
-#undef READ
+#undef WRITE
 #undef READWRITE
 #undef RWContext
 #undef xf
@@ -392,6 +403,7 @@
 #undef fle
 #undef delta_q
 #undef prob
+#undef fixed
 #undef infer
 #undef byte_alignment
 
@@ -403,6 +415,9 @@
     uint8_t superframe_header;
     int err;
 
+    if (frag->data_size == 0)
+        return AVERROR_INVALIDDATA;
+
     // Last byte in the packet.
     superframe_header = frag->data[frag->data_size - 1];
 
@@ -415,6 +430,9 @@
         index_size = 2 + (((superframe_header & 0x18) >> 3) + 1) *
                           ((superframe_header & 0x07) + 1);
 
+        if (index_size > frag->data_size)
+            return AVERROR_INVALIDDATA;
+
         err = init_get_bits(&gbc, frag->data + frag->data_size - index_size,
                             8 * index_size);
         if (err < 0)
@@ -444,7 +462,7 @@
         }
         if (pos + index_size != frag->data_size) {
             av_log(ctx->log_ctx, AV_LOG_WARNING, "Extra padding at "
-                   "end of superframe: %zu bytes.\n",
+                   "end of superframe: %"SIZE_SPECIFIER" bytes.\n",
                    frag->data_size - (pos + index_size));
         }
 
@@ -461,7 +479,7 @@
     return 0;
 }
 
-static void cbs_vp9_free_frame(void *unit, uint8_t *content)
+static void cbs_vp9_free_frame(void *opaque, uint8_t *content)
 {
     VP9RawFrame *frame = (VP9RawFrame*)content;
     av_buffer_unref(&frame->data_ref);
@@ -509,62 +527,28 @@
 }
 
 static int cbs_vp9_write_unit(CodedBitstreamContext *ctx,
-                              CodedBitstreamUnit *unit)
+                              CodedBitstreamUnit *unit,
+                              PutBitContext *pbc)
 {
-    CodedBitstreamVP9Context *priv = ctx->priv_data;
     VP9RawFrame *frame = unit->content;
-    PutBitContext pbc;
     int err;
 
-    if (!priv->write_buffer) {
-        // Initial write buffer size is 1MB.
-        priv->write_buffer_size = 1024 * 1024;
-
-    reallocate_and_try_again:
-        err = av_reallocp(&priv->write_buffer, priv->write_buffer_size);
-        if (err < 0) {
-            av_log(ctx->log_ctx, AV_LOG_ERROR, "Unable to allocate a "
-                   "sufficiently large write buffer (last attempt "
-                   "%zu bytes).\n", priv->write_buffer_size);
-            return err;
-        }
-    }
-
-    init_put_bits(&pbc, priv->write_buffer, priv->write_buffer_size);
-
-    err = cbs_vp9_write_frame(ctx, &pbc, frame);
-    if (err == AVERROR(ENOSPC)) {
-        priv->write_buffer_size *= 2;
-        goto reallocate_and_try_again;
-    }
+    err = cbs_vp9_write_frame(ctx, pbc, frame);
     if (err < 0)
         return err;
 
     // Frame must be byte-aligned.
-    av_assert0(put_bits_count(&pbc) % 8 == 0);
-
-    unit->data_size        = put_bits_count(&pbc) / 8;
-    unit->data_bit_padding = 0;
-    flush_put_bits(&pbc);
+    av_assert0(put_bits_count(pbc) % 8 == 0);
 
     if (frame->data) {
-        if (unit->data_size + frame->data_size >
-            priv->write_buffer_size) {
-            priv->write_buffer_size *= 2;
-            goto reallocate_and_try_again;
-        }
+        if (frame->data_size > put_bits_left(pbc) / 8)
+            return AVERROR(ENOSPC);
 
-        memcpy(priv->write_buffer + unit->data_size,
-               frame->data, frame->data_size);
-        unit->data_size += frame->data_size;
+        flush_put_bits(pbc);
+        memcpy(put_bits_ptr(pbc), frame->data, frame->data_size);
+        skip_put_bytes(pbc, frame->data_size);
     }
 
-    err = ff_cbs_alloc_unit_data(ctx, unit, unit->data_size);
-    if (err < 0)
-        return err;
-
-    memcpy(unit->data, priv->write_buffer, unit->data_size);
-
     return 0;
 }
 
@@ -658,13 +642,6 @@
     return 0;
 }
 
-static void cbs_vp9_close(CodedBitstreamContext *ctx)
-{
-    CodedBitstreamVP9Context *priv = ctx->priv_data;
-
-    av_freep(&priv->write_buffer);
-}
-
 const CodedBitstreamType ff_cbs_type_vp9 = {
     .codec_id          = AV_CODEC_ID_VP9,
 
@@ -674,6 +651,4 @@
     .read_unit         = &cbs_vp9_read_unit,
     .write_unit        = &cbs_vp9_write_unit,
     .assemble_fragment = &cbs_vp9_assemble_fragment,
-
-    .close             = &cbs_vp9_close,
 };
diff --git a/libavcodec/cbs_vp9.h b/libavcodec/cbs_vp9.h
index 5b99c90..40e6247 100644
--- a/libavcodec/cbs_vp9.h
+++ b/libavcodec/cbs_vp9.h
@@ -84,7 +84,6 @@
     uint8_t frame_marker;
     uint8_t profile_low_bit;
     uint8_t profile_high_bit;
-    uint8_t profile_reserved_zero;
 
     uint8_t show_existing_frame;
     uint8_t frame_to_show_map_idx;
@@ -99,7 +98,6 @@
     uint8_t color_range;
     uint8_t subsampling_x;
     uint8_t subsampling_y;
-    uint8_t color_config_reserved_zero;
 
     uint8_t refresh_frame_flags;
 
@@ -183,8 +181,17 @@
     VP9RawSuperframeIndex index;
 } VP9RawSuperframe;
 
+typedef struct VP9ReferenceFrameState {
+    int frame_width;    // RefFrameWidth
+    int frame_height;   // RefFrameHeight
+    int subsampling_x;  // RefSubsamplingX
+    int subsampling_y;  // RefSubsamplingY
+    int bit_depth;      // RefBitDepth
+} VP9ReferenceFrameState;
 
 typedef struct CodedBitstreamVP9Context {
+    int profile;
+
     // Frame dimensions in 8x8 mode info blocks.
     uint16_t mi_cols;
     uint16_t mi_rows;
@@ -192,9 +199,14 @@
     uint16_t sb64_cols;
     uint16_t sb64_rows;
 
-    // Write buffer.
-    uint8_t *write_buffer;
-    size_t write_buffer_size;
+    int frame_width;
+    int frame_height;
+
+    uint8_t subsampling_x;
+    uint8_t subsampling_y;
+    int bit_depth;
+
+    VP9ReferenceFrameState ref[VP9_NUM_REF_FRAMES];
 } CodedBitstreamVP9Context;
 
 
diff --git a/libavcodec/cbs_vp9_syntax_template.c b/libavcodec/cbs_vp9_syntax_template.c
index 0db0f52..2f08ecc 100644
--- a/libavcodec/cbs_vp9_syntax_template.c
+++ b/libavcodec/cbs_vp9_syntax_template.c
@@ -19,23 +19,11 @@
 static int FUNC(frame_sync_code)(CodedBitstreamContext *ctx, RWContext *rw,
                                  VP9RawFrameHeader *current)
 {
-    uint8_t frame_sync_byte_0 = VP9_FRAME_SYNC_0;
-    uint8_t frame_sync_byte_1 = VP9_FRAME_SYNC_1;
-    uint8_t frame_sync_byte_2 = VP9_FRAME_SYNC_2;
     int err;
 
-    xf(8, frame_sync_byte_0, frame_sync_byte_0, 0);
-    xf(8, frame_sync_byte_1, frame_sync_byte_1, 0);
-    xf(8, frame_sync_byte_2, frame_sync_byte_2, 0);
-
-    if (frame_sync_byte_0 != VP9_FRAME_SYNC_0 ||
-        frame_sync_byte_1 != VP9_FRAME_SYNC_1 ||
-        frame_sync_byte_2 != VP9_FRAME_SYNC_2) {
-        av_log(ctx->log_ctx, AV_LOG_ERROR, "Invalid frame sync code: "
-               "%02x %02x %02x.\n", frame_sync_byte_0,
-               frame_sync_byte_1, frame_sync_byte_2);
-        return AVERROR_INVALIDDATA;
-    }
+    fixed(8, frame_sync_byte_0, VP9_FRAME_SYNC_0);
+    fixed(8, frame_sync_byte_1, VP9_FRAME_SYNC_1);
+    fixed(8, frame_sync_byte_2, VP9_FRAME_SYNC_2);
 
     return 0;
 }
@@ -43,10 +31,14 @@
 static int FUNC(color_config)(CodedBitstreamContext *ctx, RWContext *rw,
                               VP9RawFrameHeader *current, int profile)
 {
+    CodedBitstreamVP9Context *vp9 = ctx->priv_data;
     int err;
 
-    if (profile >= 2)
+    if (profile >= 2) {
         f(1, ten_or_twelve_bit);
+        vp9->bit_depth = current->ten_or_twelve_bit ? 12 : 10;
+    } else
+        vp9->bit_depth = 8;
 
     f(3, color_space);
 
@@ -55,7 +47,7 @@
         if (profile == 1 || profile == 3) {
             f(1, subsampling_x);
             f(1, subsampling_y);
-            f(1, color_config_reserved_zero);
+            fixed(1, reserved_zero, 0);
         } else {
             infer(subsampling_x, 1);
             infer(subsampling_y, 1);
@@ -65,9 +57,13 @@
         if (profile == 1 || profile == 3) {
             infer(subsampling_x, 0);
             infer(subsampling_y, 0);
+            fixed(1, reserved_zero, 0);
         }
     }
 
+    vp9->subsampling_x = current->subsampling_x;
+    vp9->subsampling_y = current->subsampling_y;
+
     return 0;
 }
 
@@ -80,8 +76,11 @@
     f(16, frame_width_minus_1);
     f(16, frame_height_minus_1);
 
-    vp9->mi_cols = (current->frame_width_minus_1  + 8) >> 3;
-    vp9->mi_rows = (current->frame_height_minus_1 + 8) >> 3;
+    vp9->frame_width  = current->frame_width_minus_1  + 1;
+    vp9->frame_height = current->frame_height_minus_1 + 1;
+
+    vp9->mi_cols = (vp9->frame_width  + 7) >> 3;
+    vp9->mi_rows = (vp9->frame_height + 7) >> 3;
     vp9->sb64_cols = (vp9->mi_cols + 7) >> 3;
     vp9->sb64_rows = (vp9->mi_rows + 7) >> 3;
 
@@ -106,15 +105,33 @@
 static int FUNC(frame_size_with_refs)(CodedBitstreamContext *ctx, RWContext *rw,
                                       VP9RawFrameHeader *current)
 {
+    CodedBitstreamVP9Context *vp9 = ctx->priv_data;
     int err, i;
 
     for (i = 0; i < VP9_REFS_PER_FRAME; i++) {
         fs(1, found_ref[i], 1, i);
-        if (current->found_ref[i])
+        if (current->found_ref[i]) {
+            VP9ReferenceFrameState *ref =
+                &vp9->ref[current->ref_frame_idx[i]];
+
+            vp9->frame_width   = ref->frame_width;
+            vp9->frame_height  = ref->frame_height;
+
+            vp9->subsampling_x = ref->subsampling_x;
+            vp9->subsampling_y = ref->subsampling_y;
+            vp9->bit_depth     = ref->bit_depth;
+
             break;
+        }
     }
     if (i >= VP9_REFS_PER_FRAME)
         CHECK(FUNC(frame_size)(ctx, rw, current));
+    else {
+        vp9->mi_cols = (vp9->frame_width  + 7) >> 3;
+        vp9->mi_rows = (vp9->frame_height + 7) >> 3;
+        vp9->sb64_cols = (vp9->mi_cols + 7) >> 3;
+        vp9->sb64_rows = (vp9->mi_rows + 7) >> 3;
+    }
     CHECK(FUNC(render_size)(ctx, rw, current));
 
     return 0;
@@ -177,8 +194,8 @@
 static int FUNC(segmentation_params)(CodedBitstreamContext *ctx, RWContext *rw,
                                      VP9RawFrameHeader *current)
 {
-    static const int segmentation_feature_bits[VP9_SEG_LVL_MAX]   = { 8, 6, 2, 0 };
-    static const int segmentation_feature_signed[VP9_SEG_LVL_MAX] = { 1, 1, 0, 0 };
+    static const uint8_t segmentation_feature_bits[VP9_SEG_LVL_MAX]   = { 8, 6, 2, 0 };
+    static const uint8_t segmentation_feature_signed[VP9_SEG_LVL_MAX] = { 1, 1, 0, 0 };
 
     int err, i, j;
 
@@ -248,16 +265,16 @@
 static int FUNC(uncompressed_header)(CodedBitstreamContext *ctx, RWContext *rw,
                                      VP9RawFrameHeader *current)
 {
-    int profile, i;
-    int err;
+    CodedBitstreamVP9Context *vp9 = ctx->priv_data;
+    int err, i;
 
     f(2, frame_marker);
 
     f(1, profile_low_bit);
     f(1, profile_high_bit);
-    profile = (current->profile_high_bit << 1) + current->profile_low_bit;
-    if (profile == 3)
-        f(1, profile_reserved_zero);
+    vp9->profile = (current->profile_high_bit << 1) + current->profile_low_bit;
+    if (vp9->profile == 3)
+        fixed(1, reserved_zero, 0);
 
     f(1, show_existing_frame);
     if (current->show_existing_frame) {
@@ -274,7 +291,7 @@
 
     if (current->frame_type == VP9_KEY_FRAME) {
         CHECK(FUNC(frame_sync_code)(ctx, rw, current));
-        CHECK(FUNC(color_config)(ctx, rw, current, profile));
+        CHECK(FUNC(color_config)(ctx, rw, current, vp9->profile));
         CHECK(FUNC(frame_size)(ctx, rw, current));
         CHECK(FUNC(render_size)(ctx, rw, current));
 
@@ -294,12 +311,16 @@
          if (current->intra_only == 1) {
              CHECK(FUNC(frame_sync_code)(ctx, rw, current));
 
-             if (profile > 0) {
-                 CHECK(FUNC(color_config)(ctx, rw, current, profile));
+             if (vp9->profile > 0) {
+                 CHECK(FUNC(color_config)(ctx, rw, current, vp9->profile));
              } else {
                  infer(color_space,   1);
                  infer(subsampling_x, 1);
                  infer(subsampling_y, 1);
+                 vp9->bit_depth = 8;
+
+                 vp9->subsampling_x = current->subsampling_x;
+                 vp9->subsampling_y = current->subsampling_y;
              }
 
              f(8, refresh_frame_flags);
@@ -338,15 +359,33 @@
 
     f(16, header_size_in_bytes);
 
+    for (i = 0; i < VP9_NUM_REF_FRAMES; i++) {
+        if (current->refresh_frame_flags & (1 << i)) {
+            vp9->ref[i] = (VP9ReferenceFrameState) {
+                .frame_width    = vp9->frame_width,
+                .frame_height   = vp9->frame_height,
+                .subsampling_x  = vp9->subsampling_x,
+                .subsampling_y  = vp9->subsampling_y,
+                .bit_depth      = vp9->bit_depth,
+            };
+        }
+    }
+
+    av_log(ctx->log_ctx, AV_LOG_DEBUG, "Frame:  size %dx%d  "
+           "subsample %dx%d  bit_depth %d  tiles %dx%d.\n",
+           vp9->frame_width, vp9->frame_height,
+           vp9->subsampling_x, vp9->subsampling_y,
+           vp9->bit_depth, 1 << current->tile_cols_log2,
+           1 << current->tile_rows_log2);
+
     return 0;
 }
 
 static int FUNC(trailing_bits)(CodedBitstreamContext *ctx, RWContext *rw)
 {
     int err;
-    av_unused int zero = 0;
     while (byte_alignment(rw) != 0)
-        xf(1, zero_bit, zero, 0);
+        fixed(1, zero_bit, 0);
 
     return 0;
 }
diff --git a/libavcodec/ccaption_dec.c b/libavcodec/ccaption_dec.c
index 09ceb1b..bf3563a 100644
--- a/libavcodec/ccaption_dec.c
+++ b/libavcodec/ccaption_dec.c
@@ -212,10 +212,10 @@
 
 struct Screen {
     /* +1 is used to compensate null character of string */
-    uint8_t characters[SCREEN_ROWS][SCREEN_COLUMNS+1];
-    uint8_t charsets[SCREEN_ROWS][SCREEN_COLUMNS+1];
-    uint8_t colors[SCREEN_ROWS][SCREEN_COLUMNS+1];
-    uint8_t fonts[SCREEN_ROWS][SCREEN_COLUMNS+1];
+    uint8_t characters[SCREEN_ROWS+1][SCREEN_COLUMNS+1];
+    uint8_t charsets[SCREEN_ROWS+1][SCREEN_COLUMNS+1];
+    uint8_t colors[SCREEN_ROWS+1][SCREEN_COLUMNS+1];
+    uint8_t fonts[SCREEN_ROWS+1][SCREEN_COLUMNS+1];
     /*
      * Bitmask of used rows; if a bit is not set, the
      * corresponding row is not used.
diff --git a/libavcodec/cdgraphics.c b/libavcodec/cdgraphics.c
index be85e54..4691289 100644
--- a/libavcodec/cdgraphics.c
+++ b/libavcodec/cdgraphics.c
@@ -81,11 +81,8 @@
         return AVERROR(ENOMEM);
     cc->transparency = -1;
 
-    avctx->width   = CDG_FULL_WIDTH;
-    avctx->height  = CDG_FULL_HEIGHT;
     avctx->pix_fmt = AV_PIX_FMT_PAL8;
-
-    return 0;
+    return ff_set_dimensions(avctx, CDG_FULL_WIDTH, CDG_FULL_HEIGHT);
 }
 
 static void cdg_border_preset(CDGraphicsContext *cc, uint8_t *data)
@@ -286,7 +283,7 @@
 
     bytestream2_init(&gb, avpkt->data, avpkt->size);
 
-    if ((ret = ff_reget_buffer(avctx, cc->frame)) < 0)
+    if ((ret = ff_reget_buffer(avctx, cc->frame, 0)) < 0)
         return ret;
     if (!cc->cleared) {
         memset(cc->frame->data[0], 0, cc->frame->linesize[0] * avctx->height);
diff --git a/libavcodec/cdtoons.c b/libavcodec/cdtoons.c
new file mode 100644
index 0000000..13f9a60
--- /dev/null
+++ b/libavcodec/cdtoons.c
@@ -0,0 +1,453 @@
+/*
+ * CDToons video decoder
+ * Copyright (C) 2020 Alyssa Milburn <amilburn@zall.org>
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file
+ * CDToons video decoder
+ * @author Alyssa Milburn <amilburn@zall.org>
+ */
+
+#include <stdint.h>
+
+#include "libavutil/attributes.h"
+#include "libavutil/internal.h"
+#include "avcodec.h"
+#include "bytestream.h"
+#include "internal.h"
+
+#define CDTOONS_HEADER_SIZE   44
+#define CDTOONS_MAX_SPRITES 1200
+
+typedef struct CDToonsSprite {
+    uint16_t flags;
+    uint16_t owner_frame;
+    uint16_t start_frame;
+    uint16_t end_frame;
+    unsigned int alloc_size;
+    uint32_t size;
+    uint8_t *data;
+    int      active;
+} CDToonsSprite;
+
+typedef struct CDToonsContext {
+    AVFrame *frame;
+
+    uint16_t last_pal_id;   ///< The index of the active palette sprite.
+    uint32_t pal[256];      ///< The currently-used palette data.
+    CDToonsSprite sprites[CDTOONS_MAX_SPRITES];
+} CDToonsContext;
+
+static int cdtoons_render_sprite(AVCodecContext *avctx, const uint8_t *data,
+                                 uint32_t data_size,
+                                 int dst_x, int dst_y, int width, int height)
+{
+    CDToonsContext *c = avctx->priv_data;
+    const uint8_t *next_line = data;
+    const uint8_t *end = data + data_size;
+    uint16_t line_size;
+    uint8_t *dest;
+    int skip = 0, to_skip, x;
+
+    if (dst_x + width > avctx->width)
+        width = avctx->width - dst_x;
+    if (dst_y + height > avctx->height)
+        height = avctx->height - dst_y;
+
+    if (dst_x < 0) {
+        /* we need to skip the start of the scanlines */
+        skip = -dst_x;
+        if (width <= skip)
+            return 0;
+        dst_x = 0;
+    }
+
+    for (int y = 0; y < height; y++) {
+        /* one scanline at a time, size is provided */
+        data      = next_line;
+        if (end - data < 2)
+            return 1;
+        line_size = bytestream_get_be16(&data);
+        if (end - data < line_size)
+            return 1;
+        next_line = data + line_size;
+        if (dst_y + y < 0)
+            continue;
+
+        dest = c->frame->data[0] + (dst_y + y) * c->frame->linesize[0] + dst_x;
+
+        to_skip = skip;
+        x       = 0;
+        while (x < width - skip) {
+            int raw, size, step;
+            uint8_t val;
+
+            if (data >= end)
+                return 1;
+
+            val  = bytestream_get_byte(&data);
+            raw  = !(val & 0x80);
+            size = (int)(val & 0x7F) + 1;
+
+            /* skip the start of a scanline if it is off-screen */
+            if (to_skip >= size) {
+                to_skip -= size;
+                if (raw) {
+                    step = size;
+                } else {
+                    step = 1;
+                }
+                if (next_line - data < step)
+                    return 1;
+                data += step;
+                continue;
+            } else if (to_skip) {
+                size -= to_skip;
+                if (raw) {
+                    if (next_line - data < to_skip)
+                        return 1;
+                    data += to_skip;
+                }
+                to_skip = 0;
+            }
+
+            if (x + size >= width - skip)
+                size = width - skip - x;
+
+            /* either raw data, or a run of a single color */
+            if (raw) {
+                if (next_line - data < size)
+                    return 1;
+                memcpy(dest + x, data, size);
+                data += size;
+            } else {
+                uint8_t color = bytestream_get_byte(&data);
+                /* ignore transparent runs */
+                if (color)
+                    memset(dest + x, color, size);
+            }
+            x += size;
+        }
+    }
+
+    return 0;
+}
+
+static int cdtoons_decode_frame(AVCodecContext *avctx, void *data,
+                                int *got_frame, AVPacket *avpkt)
+{
+    CDToonsContext *c = avctx->priv_data;
+    const uint8_t *buf = avpkt->data;
+    const uint8_t *eod = avpkt->data + avpkt->size;
+    const int buf_size = avpkt->size;
+    uint16_t frame_id;
+    uint8_t background_color;
+    uint16_t sprite_count, sprite_offset;
+    uint8_t referenced_count;
+    uint16_t palette_id;
+    uint8_t palette_set;
+    int ret;
+    int saw_embedded_sprites = 0;
+
+    if (buf_size < CDTOONS_HEADER_SIZE)
+        return AVERROR_INVALIDDATA;
+
+    if ((ret = ff_reget_buffer(avctx, c->frame, 0)) < 0)
+        return ret;
+
+    /* a lot of the header is useless junk in the absence of
+     * dirty rectangling etc */
+    buf               += 2; /* version? (always 9?) */
+    frame_id           = bytestream_get_be16(&buf);
+    buf               += 2; /* blocks_valid_until */
+    buf               += 1;
+    background_color   = bytestream_get_byte(&buf);
+    buf               += 16; /* clip rect, dirty rect */
+    buf               += 4; /* flags */
+    sprite_count       = bytestream_get_be16(&buf);
+    sprite_offset      = bytestream_get_be16(&buf);
+    buf               += 2; /* max block id? */
+    referenced_count   = bytestream_get_byte(&buf);
+    buf               += 1;
+    palette_id         = bytestream_get_be16(&buf);
+    palette_set        = bytestream_get_byte(&buf);
+    buf               += 5;
+
+    /* read new sprites introduced in this frame */
+    buf = avpkt->data + sprite_offset;
+    while (sprite_count--) {
+        uint32_t size;
+        uint16_t sprite_id;
+
+        if (buf + 14 > eod)
+            return AVERROR_INVALIDDATA;
+
+        sprite_id = bytestream_get_be16(&buf);
+        if (sprite_id >= CDTOONS_MAX_SPRITES) {
+            av_log(avctx, AV_LOG_ERROR,
+                   "Sprite ID %d is too high.\n", sprite_id);
+            return AVERROR_INVALIDDATA;
+        }
+        if (c->sprites[sprite_id].active) {
+            av_log(avctx, AV_LOG_ERROR,
+                   "Sprite ID %d is a duplicate.\n", sprite_id);
+            return AVERROR_INVALIDDATA;
+        }
+
+        c->sprites[sprite_id].flags = bytestream_get_be16(&buf);
+        size                        = bytestream_get_be32(&buf);
+        if (size < 14) {
+            av_log(avctx, AV_LOG_ERROR,
+                   "Sprite only has %d bytes of data.\n", size);
+            return AVERROR_INVALIDDATA;
+        }
+        size -= 14;
+        c->sprites[sprite_id].size        = size;
+        c->sprites[sprite_id].owner_frame = frame_id;
+        c->sprites[sprite_id].start_frame = bytestream_get_be16(&buf);
+        c->sprites[sprite_id].end_frame   = bytestream_get_be16(&buf);
+        buf += 2;
+
+        if (size > buf_size || buf + size > eod)
+            return AVERROR_INVALIDDATA;
+
+        av_fast_padded_malloc(&c->sprites[sprite_id].data, &c->sprites[sprite_id].alloc_size, size);
+        if (!c->sprites[sprite_id].data)
+            return AVERROR(ENOMEM);
+
+        c->sprites[sprite_id].active = 1;
+
+        bytestream_get_buffer(&buf, c->sprites[sprite_id].data, size);
+    }
+
+    /* render any embedded sprites */
+    while (buf < eod) {
+        uint32_t tag, size;
+        if (buf + 8 > eod) {
+            av_log(avctx, AV_LOG_WARNING, "Ran (seriously) out of data for embedded sprites.\n");
+            return AVERROR_INVALIDDATA;
+        }
+        tag  = bytestream_get_be32(&buf);
+        size = bytestream_get_be32(&buf);
+        if (tag == MKBETAG('D', 'i', 'f', 'f')) {
+            uint16_t diff_count;
+            if (buf + 10 > eod) {
+                av_log(avctx, AV_LOG_WARNING, "Ran (seriously) out of data for Diff frame.\n");
+                return AVERROR_INVALIDDATA;
+            }
+            diff_count = bytestream_get_be16(&buf);
+            buf       += 8; /* clip rect? */
+            for (int i = 0; i < diff_count; i++) {
+                int16_t top, left;
+                uint16_t diff_size, width, height;
+
+                if (buf + 16 > eod) {
+                    av_log(avctx, AV_LOG_WARNING, "Ran (seriously) out of data for Diff frame header.\n");
+                    return AVERROR_INVALIDDATA;
+                }
+
+                top        = bytestream_get_be16(&buf);
+                left       = bytestream_get_be16(&buf);
+                buf       += 4; /* bottom, right */
+                diff_size  = bytestream_get_be32(&buf);
+                width      = bytestream_get_be16(&buf);
+                height     = bytestream_get_be16(&buf);
+                if (diff_size < 8 || diff_size - 4 > eod - buf) {
+                    av_log(avctx, AV_LOG_WARNING, "Ran (seriously) out of data for Diff frame data.\n");
+                    return AVERROR_INVALIDDATA;
+                }
+                if (cdtoons_render_sprite(avctx, buf + 4, diff_size - 8,
+                                      left, top, width, height)) {
+                    av_log(avctx, AV_LOG_WARNING, "Ran beyond end of sprite while rendering.\n");
+                }
+                buf += diff_size - 4;
+            }
+            saw_embedded_sprites = 1;
+        } else {
+            /* we don't care about any other entries */
+            if (size < 8 || size - 8 > eod - buf) {
+                av_log(avctx, AV_LOG_WARNING, "Ran out of data for ignored entry (size %X, %d left).\n", size, (int)(eod - buf));
+                return AVERROR_INVALIDDATA;
+            }
+            buf += (size - 8);
+        }
+    }
+
+    /* was an intra frame? */
+    if (saw_embedded_sprites)
+        goto done;
+
+    /* render any referenced sprites */
+    buf = avpkt->data + CDTOONS_HEADER_SIZE;
+    eod = avpkt->data + sprite_offset;
+    for (int i = 0; i < referenced_count; i++) {
+        const uint8_t *block_data;
+        uint16_t sprite_id, width, height;
+        int16_t top, left, right;
+
+        if (buf + 10 > eod) {
+            av_log(avctx, AV_LOG_WARNING, "Ran (seriously) out of data when rendering.\n");
+            return AVERROR_INVALIDDATA;
+        }
+
+        sprite_id = bytestream_get_be16(&buf);
+        top       = bytestream_get_be16(&buf);
+        left      = bytestream_get_be16(&buf);
+        buf      += 2; /* bottom */
+        right     = bytestream_get_be16(&buf);
+
+        if ((i == 0) && (sprite_id == 0)) {
+            /* clear background */
+            memset(c->frame->data[0], background_color,
+                   c->frame->linesize[0] * avctx->height);
+        }
+
+        if (!right)
+            continue;
+        if (sprite_id >= CDTOONS_MAX_SPRITES) {
+            av_log(avctx, AV_LOG_ERROR,
+                   "Sprite ID %d is too high.\n", sprite_id);
+            return AVERROR_INVALIDDATA;
+        }
+
+        block_data = c->sprites[sprite_id].data;
+        if (!c->sprites[sprite_id].active) {
+            /* this can happen when seeking around */
+            av_log(avctx, AV_LOG_WARNING, "Sprite %d is missing.\n", sprite_id);
+            continue;
+        }
+        if (c->sprites[sprite_id].size < 14) {
+            av_log(avctx, AV_LOG_ERROR, "Sprite %d is too small.\n", sprite_id);
+            continue;
+        }
+
+        height      = bytestream_get_be16(&block_data);
+        width       = bytestream_get_be16(&block_data);
+        block_data += 10;
+        if (cdtoons_render_sprite(avctx, block_data,
+                              c->sprites[sprite_id].size - 14,
+                              left, top, width, height)) {
+            av_log(avctx, AV_LOG_WARNING, "Ran beyond end of sprite while rendering.\n");
+        }
+    }
+
+    if (palette_id && (palette_id != c->last_pal_id)) {
+        if (palette_id >= CDTOONS_MAX_SPRITES) {
+            av_log(avctx, AV_LOG_ERROR,
+                   "Palette ID %d is too high.\n", palette_id);
+            return AVERROR_INVALIDDATA;
+        }
+        if (!c->sprites[palette_id].active) {
+            /* this can happen when seeking around */
+            av_log(avctx, AV_LOG_WARNING,
+                   "Palette ID %d is missing.\n", palette_id);
+            goto done;
+        }
+        if (c->sprites[palette_id].size != 256 * 2 * 3) {
+            av_log(avctx, AV_LOG_ERROR,
+                   "Palette ID %d is wrong size (%d).\n",
+                   palette_id, c->sprites[palette_id].size);
+            return AVERROR_INVALIDDATA;
+        }
+        c->last_pal_id = palette_id;
+        if (!palette_set) {
+            uint8_t *palette_data = c->sprites[palette_id].data;
+            for (int i = 0; i < 256; i++) {
+                /* QuickTime-ish palette: 16-bit RGB components */
+                unsigned r, g, b;
+                r             = *palette_data;
+                g             = *(palette_data + 2);
+                b             = *(palette_data + 4);
+                c->pal[i]     = (0xFFU << 24) | (r << 16) | (g << 8) | b;
+                palette_data += 6;
+            }
+            /* first palette entry indicates transparency */
+            c->pal[0]                     = 0;
+            c->frame->palette_has_changed = 1;
+        }
+    }
+
+done:
+    /* discard outdated blocks */
+    for (int i = 0; i < CDTOONS_MAX_SPRITES; i++) {
+        if (c->sprites[i].end_frame > frame_id)
+            continue;
+        c->sprites[i].active = 0;
+    }
+
+    memcpy(c->frame->data[1], c->pal, AVPALETTE_SIZE);
+
+    if ((ret = av_frame_ref(data, c->frame)) < 0)
+        return ret;
+
+    *got_frame = 1;
+
+    /* always report that the buffer was completely consumed */
+    return buf_size;
+}
+
+static av_cold int cdtoons_decode_init(AVCodecContext *avctx)
+{
+    CDToonsContext *c = avctx->priv_data;
+
+    avctx->pix_fmt = AV_PIX_FMT_PAL8;
+    c->last_pal_id = 0;
+    c->frame       = av_frame_alloc();
+    if (!c->frame)
+        return AVERROR(ENOMEM);
+
+    return 0;
+}
+
+static void cdtoons_flush(AVCodecContext *avctx)
+{
+    CDToonsContext *c = avctx->priv_data;
+
+    c->last_pal_id = 0;
+    for (int i = 0; i < CDTOONS_MAX_SPRITES; i++)
+        c->sprites[i].active = 0;
+}
+
+static av_cold int cdtoons_decode_end(AVCodecContext *avctx)
+{
+    CDToonsContext *c = avctx->priv_data;
+
+    for (int i = 0; i < CDTOONS_MAX_SPRITES; i++) {
+        av_freep(&c->sprites[i].data);
+        c->sprites[i].active = 0;
+    }
+
+    av_frame_free(&c->frame);
+
+    return 0;
+}
+
+AVCodec ff_cdtoons_decoder = {
+    .name           = "cdtoons",
+    .long_name      = NULL_IF_CONFIG_SMALL("CDToons video"),
+    .type           = AVMEDIA_TYPE_VIDEO,
+    .id             = AV_CODEC_ID_CDTOONS,
+    .priv_data_size = sizeof(CDToonsContext),
+    .init           = cdtoons_decode_init,
+    .close          = cdtoons_decode_end,
+    .decode         = cdtoons_decode_frame,
+    .capabilities   = AV_CODEC_CAP_DR1,
+    .flush          = cdtoons_flush,
+};
diff --git a/libavcodec/cfhd.c b/libavcodec/cfhd.c
index 846d334..7956367 100644
--- a/libavcodec/cfhd.c
+++ b/libavcodec/cfhd.c
@@ -150,6 +150,49 @@
     }
 }
 
+static inline void process_bayer(AVFrame *frame)
+{
+    const int linesize = frame->linesize[0];
+    uint16_t *r = (uint16_t *)frame->data[0];
+    uint16_t *g1 = (uint16_t *)(frame->data[0] + 2);
+    uint16_t *g2 = (uint16_t *)(frame->data[0] + frame->linesize[0]);
+    uint16_t *b = (uint16_t *)(frame->data[0] + frame->linesize[0] + 2);
+    const int mid = 2048;
+
+    for (int y = 0; y < frame->height >> 1; y++) {
+        for (int x = 0; x < frame->width; x += 2) {
+            int R, G1, G2, B;
+            int g, rg, bg, gd;
+
+            g  = r[x];
+            rg = g1[x];
+            bg = g2[x];
+            gd = b[x];
+            gd -= mid;
+
+            R  = (rg - mid) * 2 + g;
+            G1 = g + gd;
+            G2 = g - gd;
+            B  = (bg - mid) * 2 + g;
+
+            R  = av_clip_uintp2(R  * 16, 16);
+            G1 = av_clip_uintp2(G1 * 16, 16);
+            G2 = av_clip_uintp2(G2 * 16, 16);
+            B  = av_clip_uintp2(B  * 16, 16);
+
+            r[x]  = R;
+            g1[x] = G1;
+            g2[x] = G2;
+            b[x]  = B;
+        }
+
+        r  += linesize;
+        g1 += linesize;
+        g2 += linesize;
+        b  += linesize;
+    }
+}
+
 static inline void filter(int16_t *output, ptrdiff_t out_stride,
                           int16_t *low, ptrdiff_t low_stride,
                           int16_t *high, ptrdiff_t high_stride,
@@ -217,6 +260,12 @@
     filter(output, 1, low, 1, high, 1, width, clip);
 }
 
+static void horiz_filter_clip_bayer(int16_t *output, int16_t *low, int16_t *high,
+                                    int width, int clip)
+{
+    filter(output, 2, low, 1, high, 1, width, clip);
+}
+
 static void vert_filter(int16_t *output, ptrdiff_t out_stride,
                         int16_t *low, ptrdiff_t low_stride,
                         int16_t *high, ptrdiff_t high_stride, int len)
@@ -249,6 +298,11 @@
     int chroma_x_shift, chroma_y_shift;
     unsigned k;
 
+    if (s->coded_format == AV_PIX_FMT_BAYER_RGGB16) {
+        s->coded_width *= 2;
+        s->coded_height *= 2;
+    }
+
     if ((ret = ff_set_dimensions(avctx, s->coded_width, s->coded_height)) < 0)
         return ret;
     avctx->pix_fmt = s->coded_format;
@@ -258,6 +312,11 @@
                                                 &chroma_y_shift)) < 0)
         return ret;
     planes = av_pix_fmt_count_planes(s->coded_format);
+    if (s->coded_format == AV_PIX_FMT_BAYER_RGGB16) {
+        planes = 4;
+        chroma_x_shift = 1;
+        chroma_y_shift = 1;
+    }
 
     for (i = 0; i < planes; i++) {
         int w8, h8, w4, h4, w2, h2;
@@ -519,18 +578,20 @@
             s->bpc = data;
         } else if (tag == 84) {
             av_log(avctx, AV_LOG_DEBUG, "Sample format? %i\n", data);
-            if (data == 1)
+            if (data == 1) {
                 s->coded_format = AV_PIX_FMT_YUV422P10;
-            else if (data == 3)
+            } else if (data == 2) {
+                s->coded_format = AV_PIX_FMT_BAYER_RGGB16;
+            } else if (data == 3) {
                 s->coded_format = AV_PIX_FMT_GBRP12;
-            else if (data == 4)
+            } else if (data == 4) {
                 s->coded_format = AV_PIX_FMT_GBRAP12;
-            else {
+            } else {
                 avpriv_report_missing_feature(avctx, "Sample format of %"PRIu16, data);
                 ret = AVERROR_PATCHWELCOME;
                 break;
             }
-            planes = av_pix_fmt_count_planes(s->coded_format);
+            planes = data == 2 ? 4 : av_pix_fmt_count_planes(s->coded_format);
         } else if (tag == -85) {
             av_log(avctx, AV_LOG_DEBUG, "Cropped height %"PRIu16"\n", data);
             s->cropped_height = data;
@@ -564,8 +625,12 @@
             ret = ff_set_dimensions(avctx, s->coded_width, s->coded_height);
             if (ret < 0)
                 return ret;
-            if (s->cropped_height)
-                avctx->height = s->cropped_height;
+            if (s->cropped_height) {
+                unsigned height = s->cropped_height << (avctx->pix_fmt == AV_PIX_FMT_BAYER_RGGB16);
+                if (avctx->height < height)
+                    return AVERROR_INVALIDDATA;
+                avctx->height = height;
+            }
             frame.f->width =
             frame.f->height = 0;
 
@@ -735,14 +800,28 @@
     }
 
     planes = av_pix_fmt_count_planes(avctx->pix_fmt);
+    if (avctx->pix_fmt == AV_PIX_FMT_BAYER_RGGB16) {
+        if (!s->progressive)
+            return AVERROR_INVALIDDATA;
+        planes = 4;
+    }
+
     for (plane = 0; plane < planes && !ret; plane++) {
         /* level 1 */
         int lowpass_height  = s->plane[plane].band[0][0].height;
         int lowpass_width   = s->plane[plane].band[0][0].width;
         int highpass_stride = s->plane[plane].band[0][1].stride;
         int act_plane = plane == 1 ? 2 : plane == 2 ? 1 : plane;
+        ptrdiff_t dst_linesize;
         int16_t *low, *high, *output, *dst;
 
+        if (avctx->pix_fmt == AV_PIX_FMT_BAYER_RGGB16) {
+            act_plane = 0;
+            dst_linesize = pic->linesize[act_plane];
+        } else {
+            dst_linesize = pic->linesize[act_plane] / 2;
+        }
+
         if (lowpass_height > s->plane[plane].band[0][0].a_height || lowpass_width > s->plane[plane].band[0][0].a_width ||
             !highpass_stride || s->plane[plane].band[0][1].width > s->plane[plane].band[0][1].a_width) {
             av_log(avctx, AV_LOG_ERROR, "Invalid plane dimensions\n");
@@ -880,13 +959,33 @@
             }
 
             dst = (int16_t *)pic->data[act_plane];
+            if (avctx->pix_fmt == AV_PIX_FMT_BAYER_RGGB16) {
+                if (plane & 1)
+                    dst++;
+                if (plane > 1)
+                    dst += pic->linesize[act_plane] >> 1;
+            }
             low  = s->plane[plane].l_h[6];
             high = s->plane[plane].l_h[7];
+
+            if (avctx->pix_fmt == AV_PIX_FMT_BAYER_RGGB16 &&
+                (lowpass_height * 2 > avctx->coded_height / 2 ||
+                 lowpass_width  * 2 > avctx->coded_width  / 2    )
+                ) {
+                ret = AVERROR_INVALIDDATA;
+                goto end;
+            }
+
             for (i = 0; i < lowpass_height * 2; i++) {
-                horiz_filter_clip(dst, low, high, lowpass_width, s->bpc);
+                if (avctx->pix_fmt == AV_PIX_FMT_BAYER_RGGB16)
+                    horiz_filter_clip_bayer(dst, low, high, lowpass_width, s->bpc);
+                else
+                    horiz_filter_clip(dst, low, high, lowpass_width, s->bpc);
+                if (avctx->pix_fmt == AV_PIX_FMT_GBRAP12 && act_plane == 3)
+                    process_alpha(dst, lowpass_width * 2);
                 low  += lowpass_width;
                 high += lowpass_width;
-                dst  += pic->linesize[act_plane] / 2;
+                dst  += dst_linesize;
             }
         } else {
             av_log(avctx, AV_LOG_DEBUG, "interlaced frame ? %d", pic->interlaced_frame);
@@ -924,6 +1023,8 @@
     }
 
 
+    if (avctx->pix_fmt == AV_PIX_FMT_BAYER_RGGB16)
+        process_bayer(pic);
 end:
     if (ret < 0)
         return ret;
@@ -938,10 +1039,8 @@
 
     free_buffers(s);
 
-    if (!avctx->internal->is_copy) {
-        ff_free_vlc(&s->vlc_9);
-        ff_free_vlc(&s->vlc_18);
-    }
+    ff_free_vlc(&s->vlc_9);
+    ff_free_vlc(&s->vlc_18);
 
     return 0;
 }
diff --git a/libavcodec/chomp_bsf.c b/libavcodec/chomp_bsf.c
index 3ba45f3..9b06ace 100644
--- a/libavcodec/chomp_bsf.c
+++ b/libavcodec/chomp_bsf.c
@@ -21,7 +21,6 @@
 
 #include "avcodec.h"
 #include "bsf.h"
-#include "internal.h"
 
 static int chomp_filter(AVBSFContext *ctx, AVPacket *pkt)
 {
diff --git a/libavcodec/cinepak.c b/libavcodec/cinepak.c
index 9b00774..9c5b254 100644
--- a/libavcodec/cinepak.c
+++ b/libavcodec/cinepak.c
@@ -323,6 +323,9 @@
     num_strips  = AV_RB16 (&s->data[8]);
     encoded_buf_size = AV_RB24(&s->data[1]);
 
+    if (s->size < encoded_buf_size * (int64_t)(100 - s->avctx->discard_damaged_percentage) / 100)
+        return AVERROR_INVALIDDATA;
+
     /* if this is the first frame, check for deviant Sega FILM data */
     if (s->sega_film_skip_bytes == -1) {
         if (!encoded_buf_size) {
@@ -353,6 +356,13 @@
     if (s->size < 10 + s->sega_film_skip_bytes + num_strips * 12)
         return AVERROR_INVALIDDATA;
 
+    if (num_strips) {
+        const uint8_t *data = s->data + 10 + s->sega_film_skip_bytes;
+        int strip_size = AV_RB24 (data + 1);
+        if (strip_size < 12 || strip_size > encoded_buf_size)
+            return AVERROR_INVALIDDATA;
+    }
+
     return 0;
 }
 
@@ -463,7 +473,7 @@
         return ret;
     }
 
-    if ((ret = ff_reget_buffer(avctx, s->frame)) < 0)
+    if ((ret = ff_reget_buffer(avctx, s->frame, 0)) < 0)
         return ret;
 
     if (s->palette_video) {
diff --git a/libavcodec/cinepakenc.c b/libavcodec/cinepakenc.c
index 93917fa..6024df0 100644
--- a/libavcodec/cinepakenc.c
+++ b/libavcodec/cinepakenc.c
@@ -544,8 +544,9 @@
                        uint8_t *last_data[4], int last_linesize[4],
                        strip_info *info, unsigned char *buf)
 {
-    int x, y, z, flags, bits, temp_size, header_ofs, ret = 0, mb_count = s->w * h / MB_AREA;
+    int x, y, z, bits, temp_size, header_ofs, ret = 0, mb_count = s->w * h / MB_AREA;
     int needs_extra_bit, should_write_temp;
+    uint32_t flags;
     unsigned char temp[64]; // 32/2 = 16 V4 blocks at 4 B each -> 64 B
     mb_info *mb;
     uint8_t *sub_scratch_data[4] = { 0 }, *sub_last_data[4] = { 0 };
@@ -599,7 +600,7 @@
             flags = 0;
             for (y = x; y < FFMIN(x + 32, mb_count); y++)
                 if (s->mb[y].best_encoding == ENC_V4)
-                    flags |= 1 << (31 - y + x);
+                    flags |= 1U << (31 - y + x);
 
             AV_WB32(&buf[ret], flags);
             ret += 4;
@@ -626,13 +627,13 @@
 
         for (x = 0; x < mb_count; x++) {
             mb                = &s->mb[x];
-            flags            |= (mb->best_encoding != ENC_SKIP) << (31 - bits++);
+            flags            |= (uint32_t)(mb->best_encoding != ENC_SKIP) << (31 - bits++);
             needs_extra_bit   = 0;
             should_write_temp = 0;
 
             if (mb->best_encoding != ENC_SKIP) {
                 if (bits < 32)
-                    flags |= (mb->best_encoding == ENC_V4) << (31 - bits++);
+                    flags |= (uint32_t)(mb->best_encoding == ENC_V4) << (31 - bits++);
                 else
                     needs_extra_bit = 1;
             }
@@ -651,7 +652,7 @@
             }
 
             if (needs_extra_bit) {
-                flags = (mb->best_encoding == ENC_V4) << 31;
+                flags = (uint32_t)(mb->best_encoding == ENC_V4) << 31;
                 bits  = 1;
             }
 
diff --git a/libavcodec/clearvideo.c b/libavcodec/clearvideo.c
index 0e3c772..65bf140 100644
--- a/libavcodec/clearvideo.c
+++ b/libavcodec/clearvideo.c
@@ -524,7 +524,7 @@
             return AVERROR_INVALIDDATA;
         }
 
-        if ((ret = ff_reget_buffer(avctx, c->pic)) < 0)
+        if ((ret = ff_reget_buffer(avctx, c->pic, 0)) < 0)
             return ret;
 
         c->pic->key_frame = 1;
@@ -555,7 +555,10 @@
     } else {
         int plane;
 
-        if ((ret = ff_reget_buffer(avctx, c->pic)) < 0)
+        if (c->pmb_width * c->pmb_height > 8LL*(buf_size - bytestream2_tell(&gb)))
+            return AVERROR_INVALIDDATA;
+
+        if ((ret = ff_reget_buffer(avctx, c->pic, 0)) < 0)
             return ret;
 
         ret = av_frame_copy(c->pic, c->prev);
@@ -570,6 +573,8 @@
 
         for (j = 0; j < c->pmb_height; j++) {
             for (i = 0; i < c->pmb_width; i++) {
+                if (get_bits_left(&c->gb) <= 0)
+                    return AVERROR_INVALIDDATA;
                 if (get_bits1(&c->gb)) {
                     MV mv = mvi_predict(&c->mvi, i, j, zero_mv);
 
@@ -660,7 +665,7 @@
     }
 
     c->tile_shift = av_log2(c->tile_size);
-    if (1 << c->tile_shift != c->tile_size) {
+    if (1U << c->tile_shift != c->tile_size) {
         av_log(avctx, AV_LOG_ERROR, "Tile size: %d, is not power of 2.\n", c->tile_size);
         return AVERROR_INVALIDDATA;
     }
diff --git a/libavcodec/cllc.c b/libavcodec/cllc.c
index af0f6da..1f2c98e 100644
--- a/libavcodec/cllc.c
+++ b/libavcodec/cllc.c
@@ -483,19 +483,6 @@
     return avpkt->size;
 }
 
-#if HAVE_THREADS
-static int cllc_init_thread_copy(AVCodecContext *avctx)
-{
-    CLLCContext *ctx = avctx->priv_data;
-
-    ctx->avctx            = avctx;
-    ctx->swapped_buf      = NULL;
-    ctx->swapped_buf_size = 0;
-
-    return 0;
-}
-#endif
-
 static av_cold int cllc_decode_close(AVCodecContext *avctx)
 {
     CLLCContext *ctx = avctx->priv_data;
@@ -526,7 +513,6 @@
     .id             = AV_CODEC_ID_CLLC,
     .priv_data_size = sizeof(CLLCContext),
     .init           = cllc_decode_init,
-    .init_thread_copy = ONLY_IF_THREADS_ENABLED(cllc_init_thread_copy),
     .decode         = cllc_decode_frame,
     .close          = cllc_decode_close,
     .capabilities   = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_FRAME_THREADS,
diff --git a/libavcodec/cngdec.c b/libavcodec/cngdec.c
index 28432ac..747ab49 100644
--- a/libavcodec/cngdec.c
+++ b/libavcodec/cngdec.c
@@ -69,7 +69,6 @@
     p->excitation       = av_mallocz_array(avctx->frame_size, sizeof(*p->excitation));
     if (!p->refl_coef || !p->target_refl_coef || !p->lpc_coef ||
         !p->filter_out || !p->excitation) {
-        cng_decode_close(avctx);
         return AVERROR(ENOMEM);
     }
 
@@ -174,5 +173,7 @@
     .close          = cng_decode_close,
     .sample_fmts    = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_S16,
                                                      AV_SAMPLE_FMT_NONE },
-    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_DR1,
+    .capabilities   = AV_CODEC_CAP_DR1,
+    .caps_internal  = FF_CODEC_CAP_INIT_THREADSAFE |
+                      FF_CODEC_CAP_INIT_CLEANUP,
 };
diff --git a/libavcodec/codec_desc.c b/libavcodec/codec_desc.c
index 67a3054..a7049f9 100644
--- a/libavcodec/codec_desc.c
+++ b/libavcodec/codec_desc.c
@@ -23,7 +23,9 @@
 
 #include "libavutil/common.h"
 #include "libavutil/internal.h"
-#include "avcodec.h"
+
+#include "codec_id.h"
+#include "codec_desc.h"
 #include "profiles.h"
 #include "version.h"
 
@@ -81,6 +83,7 @@
         .long_name = NULL_IF_CONFIG_SMALL("Motion JPEG"),
         .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
         .mime_types= MT("image/jpeg"),
+        .profiles  = NULL_IF_CONFIG_SMALL(ff_mjpeg_profiles),
     },
     {
         .id        = AV_CODEC_ID_MJPEGB,
@@ -722,7 +725,7 @@
         .id        = AV_CODEC_ID_GIF,
         .type      = AVMEDIA_TYPE_VIDEO,
         .name      = "gif",
-        .long_name = NULL_IF_CONFIG_SMALL("GIF (Graphics Interchange Format)"),
+        .long_name = NULL_IF_CONFIG_SMALL("CompuServe GIF (Graphics Interchange Format)"),
         .props     = AV_CODEC_PROP_LOSSLESS,
         .mime_types= MT("image/gif"),
     },
@@ -1077,6 +1080,7 @@
         .name      = "prores",
         .long_name = NULL_IF_CONFIG_SMALL("Apple ProRes (iCodec Pro)"),
         .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
+        .profiles  = NULL_IF_CONFIG_SMALL(ff_prores_profiles),
     },
     {
         .id        = AV_CODEC_ID_JV,
@@ -1689,6 +1693,76 @@
         .long_name = NULL_IF_CONFIG_SMALL("RemotelyAnywhere Screen Capture"),
         .props     = AV_CODEC_PROP_LOSSY,
     },
+    {
+        .id        = AV_CODEC_ID_HYMT,
+        .type      = AVMEDIA_TYPE_VIDEO,
+        .name      = "hymt",
+        .long_name = NULL_IF_CONFIG_SMALL("HuffYUV MT"),
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSLESS,
+    },
+    {
+        .id        = AV_CODEC_ID_ARBC,
+        .type      = AVMEDIA_TYPE_VIDEO,
+        .name      = "arbc",
+        .long_name = NULL_IF_CONFIG_SMALL("Gryphon's Anim Compressor"),
+        .props     = AV_CODEC_PROP_LOSSY,
+    },
+    {
+        .id        = AV_CODEC_ID_AGM,
+        .type      = AVMEDIA_TYPE_VIDEO,
+        .name      = "agm",
+        .long_name = NULL_IF_CONFIG_SMALL("Amuse Graphics Movie"),
+        .props     = AV_CODEC_PROP_LOSSY,
+    },
+    {
+        .id        = AV_CODEC_ID_LSCR,
+        .type      = AVMEDIA_TYPE_VIDEO,
+        .name      = "lscr",
+        .long_name = NULL_IF_CONFIG_SMALL("LEAD Screen Capture"),
+        .props     = AV_CODEC_PROP_LOSSY,
+    },
+    {
+        .id        = AV_CODEC_ID_VP4,
+        .type      = AVMEDIA_TYPE_VIDEO,
+        .name      = "vp4",
+        .long_name = NULL_IF_CONFIG_SMALL("On2 VP4"),
+        .props     = AV_CODEC_PROP_LOSSY,
+    },
+    {
+        .id        = AV_CODEC_ID_IMM5,
+        .type      = AVMEDIA_TYPE_VIDEO,
+        .name      = "imm5",
+        .long_name = NULL_IF_CONFIG_SMALL("Infinity IMM5"),
+        .props     = AV_CODEC_PROP_LOSSY,
+    },
+    {
+        .id        = AV_CODEC_ID_MVDV,
+        .type      = AVMEDIA_TYPE_VIDEO,
+        .name      = "mvdv",
+        .long_name = NULL_IF_CONFIG_SMALL("MidiVid VQ"),
+        .props     = AV_CODEC_PROP_LOSSY,
+    },
+    {
+        .id        = AV_CODEC_ID_MVHA,
+        .type      = AVMEDIA_TYPE_VIDEO,
+        .name      = "mvha",
+        .long_name = NULL_IF_CONFIG_SMALL("MidiVid Archive Codec"),
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
+    },
+    {
+        .id        = AV_CODEC_ID_CDTOONS,
+        .type      = AVMEDIA_TYPE_VIDEO,
+        .name      = "cdtoons",
+        .long_name = NULL_IF_CONFIG_SMALL("CDToons video"),
+        .props     = AV_CODEC_PROP_LOSSLESS,
+    },
+    {
+        .id        = AV_CODEC_ID_MV30,
+        .type      = AVMEDIA_TYPE_VIDEO,
+        .name      = "mv30",
+        .long_name = NULL_IF_CONFIG_SMALL("MidiVid 3.0"),
+        .props     = AV_CODEC_PROP_LOSSY,
+    },
 
     /* various PCM "codecs" */
     {
@@ -1696,245 +1770,245 @@
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "pcm_s16le",
         .long_name = NULL_IF_CONFIG_SMALL("PCM signed 16-bit little-endian"),
-        .props     = AV_CODEC_PROP_LOSSLESS,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSLESS,
     },
     {
         .id        = AV_CODEC_ID_PCM_S16BE,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "pcm_s16be",
         .long_name = NULL_IF_CONFIG_SMALL("PCM signed 16-bit big-endian"),
-        .props     = AV_CODEC_PROP_LOSSLESS,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSLESS,
     },
     {
         .id        = AV_CODEC_ID_PCM_U16LE,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "pcm_u16le",
         .long_name = NULL_IF_CONFIG_SMALL("PCM unsigned 16-bit little-endian"),
-        .props     = AV_CODEC_PROP_LOSSLESS,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSLESS,
     },
     {
         .id        = AV_CODEC_ID_PCM_U16BE,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "pcm_u16be",
         .long_name = NULL_IF_CONFIG_SMALL("PCM unsigned 16-bit big-endian"),
-        .props     = AV_CODEC_PROP_LOSSLESS,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSLESS,
     },
     {
         .id        = AV_CODEC_ID_PCM_S8,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "pcm_s8",
         .long_name = NULL_IF_CONFIG_SMALL("PCM signed 8-bit"),
-        .props     = AV_CODEC_PROP_LOSSLESS,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSLESS,
     },
     {
         .id        = AV_CODEC_ID_PCM_U8,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "pcm_u8",
         .long_name = NULL_IF_CONFIG_SMALL("PCM unsigned 8-bit"),
-        .props     = AV_CODEC_PROP_LOSSLESS,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSLESS,
     },
     {
         .id        = AV_CODEC_ID_PCM_MULAW,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "pcm_mulaw",
         .long_name = NULL_IF_CONFIG_SMALL("PCM mu-law / G.711 mu-law"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_PCM_ALAW,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "pcm_alaw",
         .long_name = NULL_IF_CONFIG_SMALL("PCM A-law / G.711 A-law"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_PCM_S32LE,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "pcm_s32le",
         .long_name = NULL_IF_CONFIG_SMALL("PCM signed 32-bit little-endian"),
-        .props     = AV_CODEC_PROP_LOSSLESS,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSLESS,
     },
     {
         .id        = AV_CODEC_ID_PCM_S32BE,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "pcm_s32be",
         .long_name = NULL_IF_CONFIG_SMALL("PCM signed 32-bit big-endian"),
-        .props     = AV_CODEC_PROP_LOSSLESS,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSLESS,
     },
     {
         .id        = AV_CODEC_ID_PCM_U32LE,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "pcm_u32le",
         .long_name = NULL_IF_CONFIG_SMALL("PCM unsigned 32-bit little-endian"),
-        .props     = AV_CODEC_PROP_LOSSLESS,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSLESS,
     },
     {
         .id        = AV_CODEC_ID_PCM_U32BE,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "pcm_u32be",
         .long_name = NULL_IF_CONFIG_SMALL("PCM unsigned 32-bit big-endian"),
-        .props     = AV_CODEC_PROP_LOSSLESS,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSLESS,
     },
     {
         .id        = AV_CODEC_ID_PCM_S24LE,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "pcm_s24le",
         .long_name = NULL_IF_CONFIG_SMALL("PCM signed 24-bit little-endian"),
-        .props     = AV_CODEC_PROP_LOSSLESS,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSLESS,
     },
     {
         .id        = AV_CODEC_ID_PCM_S24BE,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "pcm_s24be",
         .long_name = NULL_IF_CONFIG_SMALL("PCM signed 24-bit big-endian"),
-        .props     = AV_CODEC_PROP_LOSSLESS,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSLESS,
     },
     {
         .id        = AV_CODEC_ID_PCM_U24LE,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "pcm_u24le",
         .long_name = NULL_IF_CONFIG_SMALL("PCM unsigned 24-bit little-endian"),
-        .props     = AV_CODEC_PROP_LOSSLESS,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSLESS,
     },
     {
         .id        = AV_CODEC_ID_PCM_U24BE,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "pcm_u24be",
         .long_name = NULL_IF_CONFIG_SMALL("PCM unsigned 24-bit big-endian"),
-        .props     = AV_CODEC_PROP_LOSSLESS,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSLESS,
     },
     {
         .id        = AV_CODEC_ID_PCM_S24DAUD,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "pcm_s24daud",
         .long_name = NULL_IF_CONFIG_SMALL("PCM D-Cinema audio signed 24-bit"),
-        .props     = AV_CODEC_PROP_LOSSLESS,
-    },
-    {
-        .id        = AV_CODEC_ID_PCM_ZORK,
-        .type      = AVMEDIA_TYPE_AUDIO,
-        .name      = "pcm_zork",
-        .long_name = NULL_IF_CONFIG_SMALL("PCM Zork"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSLESS,
     },
     {
         .id        = AV_CODEC_ID_PCM_S16LE_PLANAR,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "pcm_s16le_planar",
         .long_name = NULL_IF_CONFIG_SMALL("PCM signed 16-bit little-endian planar"),
-        .props     = AV_CODEC_PROP_LOSSLESS,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSLESS,
     },
     {
         .id        = AV_CODEC_ID_PCM_DVD,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "pcm_dvd",
         .long_name = NULL_IF_CONFIG_SMALL("PCM signed 20|24-bit big-endian"),
-        .props     = AV_CODEC_PROP_LOSSLESS,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSLESS,
     },
     {
         .id        = AV_CODEC_ID_PCM_F32BE,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "pcm_f32be",
         .long_name = NULL_IF_CONFIG_SMALL("PCM 32-bit floating point big-endian"),
-        .props     = AV_CODEC_PROP_LOSSLESS,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSLESS,
     },
     {
         .id        = AV_CODEC_ID_PCM_F32LE,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "pcm_f32le",
         .long_name = NULL_IF_CONFIG_SMALL("PCM 32-bit floating point little-endian"),
-        .props     = AV_CODEC_PROP_LOSSLESS,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSLESS,
     },
     {
         .id        = AV_CODEC_ID_PCM_F64BE,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "pcm_f64be",
         .long_name = NULL_IF_CONFIG_SMALL("PCM 64-bit floating point big-endian"),
-        .props     = AV_CODEC_PROP_LOSSLESS,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSLESS,
     },
     {
         .id        = AV_CODEC_ID_PCM_F64LE,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "pcm_f64le",
         .long_name = NULL_IF_CONFIG_SMALL("PCM 64-bit floating point little-endian"),
-        .props     = AV_CODEC_PROP_LOSSLESS,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSLESS,
     },
     {
         .id        = AV_CODEC_ID_PCM_BLURAY,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "pcm_bluray",
         .long_name = NULL_IF_CONFIG_SMALL("PCM signed 16|20|24-bit big-endian for Blu-ray media"),
-        .props     = AV_CODEC_PROP_LOSSLESS,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSLESS,
     },
     {
         .id        = AV_CODEC_ID_PCM_LXF,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "pcm_lxf",
         .long_name = NULL_IF_CONFIG_SMALL("PCM signed 20-bit little-endian planar"),
-        .props     = AV_CODEC_PROP_LOSSLESS,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSLESS,
     },
     {
         .id        = AV_CODEC_ID_S302M,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "s302m",
         .long_name = NULL_IF_CONFIG_SMALL("SMPTE 302M"),
-        .props     = AV_CODEC_PROP_LOSSLESS,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSLESS,
     },
     {
         .id        = AV_CODEC_ID_PCM_S8_PLANAR,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "pcm_s8_planar",
         .long_name = NULL_IF_CONFIG_SMALL("PCM signed 8-bit planar"),
-        .props     = AV_CODEC_PROP_LOSSLESS,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSLESS,
     },
     {
         .id        = AV_CODEC_ID_PCM_S24LE_PLANAR,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "pcm_s24le_planar",
         .long_name = NULL_IF_CONFIG_SMALL("PCM signed 24-bit little-endian planar"),
-        .props     = AV_CODEC_PROP_LOSSLESS,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSLESS,
     },
     {
         .id        = AV_CODEC_ID_PCM_S32LE_PLANAR,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "pcm_s32le_planar",
         .long_name = NULL_IF_CONFIG_SMALL("PCM signed 32-bit little-endian planar"),
-        .props     = AV_CODEC_PROP_LOSSLESS,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSLESS,
     },
     {
         .id        = AV_CODEC_ID_PCM_S16BE_PLANAR,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "pcm_s16be_planar",
         .long_name = NULL_IF_CONFIG_SMALL("PCM signed 16-bit big-endian planar"),
-        .props     = AV_CODEC_PROP_LOSSLESS,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSLESS,
     },
     {
         .id        = AV_CODEC_ID_PCM_S64LE,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "pcm_s64le",
         .long_name = NULL_IF_CONFIG_SMALL("PCM signed 64-bit little-endian"),
-        .props     = AV_CODEC_PROP_LOSSLESS,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSLESS,
     },
     {
         .id        = AV_CODEC_ID_PCM_S64BE,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "pcm_s64be",
         .long_name = NULL_IF_CONFIG_SMALL("PCM signed 64-bit big-endian"),
-        .props     = AV_CODEC_PROP_LOSSLESS,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSLESS,
     },
     {
         .id        = AV_CODEC_ID_PCM_F16LE,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "pcm_f16le",
         .long_name = NULL_IF_CONFIG_SMALL("PCM 16.8 floating point little-endian"),
-        .props     = AV_CODEC_PROP_LOSSLESS,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSLESS,
     },
     {
         .id        = AV_CODEC_ID_PCM_F24LE,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "pcm_f24le",
         .long_name = NULL_IF_CONFIG_SMALL("PCM 24.0 floating point little-endian"),
-        .props     = AV_CODEC_PROP_LOSSLESS,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSLESS,
+    },
+    {
+        .id        = AV_CODEC_ID_PCM_VIDC,
+        .type      = AVMEDIA_TYPE_AUDIO,
+        .name      = "pcm_vidc",
+        .long_name = NULL_IF_CONFIG_SMALL("PCM Archimedes VIDC"),
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
 
     /* various ADPCM codecs */
@@ -1943,287 +2017,336 @@
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "adpcm_ima_qt",
         .long_name = NULL_IF_CONFIG_SMALL("ADPCM IMA QuickTime"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_ADPCM_IMA_WAV,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "adpcm_ima_wav",
         .long_name = NULL_IF_CONFIG_SMALL("ADPCM IMA WAV"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_ADPCM_IMA_DK3,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "adpcm_ima_dk3",
         .long_name = NULL_IF_CONFIG_SMALL("ADPCM IMA Duck DK3"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_ADPCM_IMA_DK4,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "adpcm_ima_dk4",
         .long_name = NULL_IF_CONFIG_SMALL("ADPCM IMA Duck DK4"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_ADPCM_IMA_WS,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "adpcm_ima_ws",
         .long_name = NULL_IF_CONFIG_SMALL("ADPCM IMA Westwood"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_ADPCM_IMA_SMJPEG,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "adpcm_ima_smjpeg",
         .long_name = NULL_IF_CONFIG_SMALL("ADPCM IMA Loki SDL MJPEG"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_ADPCM_MS,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "adpcm_ms",
         .long_name = NULL_IF_CONFIG_SMALL("ADPCM Microsoft"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_ADPCM_4XM,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "adpcm_4xm",
         .long_name = NULL_IF_CONFIG_SMALL("ADPCM 4X Movie"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_ADPCM_XA,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "adpcm_xa",
         .long_name = NULL_IF_CONFIG_SMALL("ADPCM CDROM XA"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_ADPCM_ADX,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "adpcm_adx",
         .long_name = NULL_IF_CONFIG_SMALL("SEGA CRI ADX ADPCM"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_ADPCM_EA,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "adpcm_ea",
         .long_name = NULL_IF_CONFIG_SMALL("ADPCM Electronic Arts"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_ADPCM_G726,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "adpcm_g726",
         .long_name = NULL_IF_CONFIG_SMALL("G.726 ADPCM"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_ADPCM_CT,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "adpcm_ct",
         .long_name = NULL_IF_CONFIG_SMALL("ADPCM Creative Technology"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_ADPCM_SWF,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "adpcm_swf",
         .long_name = NULL_IF_CONFIG_SMALL("ADPCM Shockwave Flash"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_ADPCM_YAMAHA,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "adpcm_yamaha",
         .long_name = NULL_IF_CONFIG_SMALL("ADPCM Yamaha"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_ADPCM_SBPRO_4,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "adpcm_sbpro_4",
         .long_name = NULL_IF_CONFIG_SMALL("ADPCM Sound Blaster Pro 4-bit"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_ADPCM_SBPRO_3,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "adpcm_sbpro_3",
         .long_name = NULL_IF_CONFIG_SMALL("ADPCM Sound Blaster Pro 2.6-bit"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_ADPCM_SBPRO_2,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "adpcm_sbpro_2",
         .long_name = NULL_IF_CONFIG_SMALL("ADPCM Sound Blaster Pro 2-bit"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_ADPCM_THP,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "adpcm_thp",
         .long_name = NULL_IF_CONFIG_SMALL("ADPCM Nintendo THP"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_ADPCM_IMA_AMV,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "adpcm_ima_amv",
         .long_name = NULL_IF_CONFIG_SMALL("ADPCM IMA AMV"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_ADPCM_EA_R1,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "adpcm_ea_r1",
         .long_name = NULL_IF_CONFIG_SMALL("ADPCM Electronic Arts R1"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_ADPCM_EA_R3,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "adpcm_ea_r3",
         .long_name = NULL_IF_CONFIG_SMALL("ADPCM Electronic Arts R3"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_ADPCM_EA_R2,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "adpcm_ea_r2",
         .long_name = NULL_IF_CONFIG_SMALL("ADPCM Electronic Arts R2"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_ADPCM_IMA_EA_SEAD,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "adpcm_ima_ea_sead",
         .long_name = NULL_IF_CONFIG_SMALL("ADPCM IMA Electronic Arts SEAD"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_ADPCM_IMA_EA_EACS,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "adpcm_ima_ea_eacs",
         .long_name = NULL_IF_CONFIG_SMALL("ADPCM IMA Electronic Arts EACS"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_ADPCM_EA_XAS,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "adpcm_ea_xas",
         .long_name = NULL_IF_CONFIG_SMALL("ADPCM Electronic Arts XAS"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_ADPCM_EA_MAXIS_XA,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "adpcm_ea_maxis_xa",
         .long_name = NULL_IF_CONFIG_SMALL("ADPCM Electronic Arts Maxis CDROM XA"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_ADPCM_IMA_ISS,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "adpcm_ima_iss",
         .long_name = NULL_IF_CONFIG_SMALL("ADPCM IMA Funcom ISS"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_ADPCM_G722,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "adpcm_g722",
         .long_name = NULL_IF_CONFIG_SMALL("G.722 ADPCM"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_ADPCM_IMA_APC,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "adpcm_ima_apc",
         .long_name = NULL_IF_CONFIG_SMALL("ADPCM IMA CRYO APC"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_ADPCM_VIMA,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "adpcm_vima",
         .long_name = NULL_IF_CONFIG_SMALL("LucasArts VIMA audio"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_ADPCM_AFC,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "adpcm_afc",
         .long_name = NULL_IF_CONFIG_SMALL("ADPCM Nintendo Gamecube AFC"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_ADPCM_IMA_OKI,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "adpcm_ima_oki",
         .long_name = NULL_IF_CONFIG_SMALL("ADPCM IMA Dialogic OKI"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_ADPCM_DTK,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "adpcm_dtk",
         .long_name = NULL_IF_CONFIG_SMALL("ADPCM Nintendo Gamecube DTK"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_ADPCM_IMA_RAD,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "adpcm_ima_rad",
         .long_name = NULL_IF_CONFIG_SMALL("ADPCM IMA Radical"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_ADPCM_G726LE,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "adpcm_g726le",
         .long_name = NULL_IF_CONFIG_SMALL("G.726 ADPCM little-endian"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_ADPCM_THP_LE,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "adpcm_thp_le",
         .long_name = NULL_IF_CONFIG_SMALL("ADPCM Nintendo THP (Little-Endian)"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_ADPCM_PSX,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "adpcm_psx",
         .long_name = NULL_IF_CONFIG_SMALL("ADPCM Playstation"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_ADPCM_AICA,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "adpcm_aica",
         .long_name = NULL_IF_CONFIG_SMALL("ADPCM Yamaha AICA"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_ADPCM_IMA_DAT4,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "adpcm_ima_dat4",
         .long_name = NULL_IF_CONFIG_SMALL("ADPCM IMA Eurocom DAT4"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_ADPCM_MTAF,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "adpcm_mtaf",
         .long_name = NULL_IF_CONFIG_SMALL("ADPCM MTAF"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
+    },
+    {
+        .id        = AV_CODEC_ID_ADPCM_AGM,
+        .type      = AVMEDIA_TYPE_AUDIO,
+        .name      = "adpcm_agm",
+        .long_name = NULL_IF_CONFIG_SMALL("ADPCM AmuseGraphics Movie AGM"),
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
+    },
+    {
+        .id        = AV_CODEC_ID_ADPCM_ARGO,
+        .type      = AVMEDIA_TYPE_AUDIO,
+        .name      = "adpcm_argo",
+        .long_name = NULL_IF_CONFIG_SMALL("ADPCM Argonaut Games"),
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
+    },
+    {
+        .id        = AV_CODEC_ID_ADPCM_IMA_SSI,
+        .type      = AVMEDIA_TYPE_AUDIO,
+        .name      = "adpcm_ima_ssi",
+        .long_name = NULL_IF_CONFIG_SMALL("ADPCM IMA Simon & Schuster Interactive"),
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
+    },
+    {
+        .id        = AV_CODEC_ID_ADPCM_ZORK,
+        .type      = AVMEDIA_TYPE_AUDIO,
+        .name      = "adpcm_zork",
+        .long_name = NULL_IF_CONFIG_SMALL("ADPCM Zork"),
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
+    },
+    {
+        .id        = AV_CODEC_ID_ADPCM_IMA_APM,
+        .type      = AVMEDIA_TYPE_AUDIO,
+        .name      = "adpcm_ima_apm",
+        .long_name = NULL_IF_CONFIG_SMALL("ADPCM IMA Ubisoft APM"),
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
+    },
+    {
+        .id        = AV_CODEC_ID_ADPCM_IMA_ALP,
+        .type      = AVMEDIA_TYPE_AUDIO,
+        .name      = "adpcm_ima_alp",
+        .long_name = NULL_IF_CONFIG_SMALL("ADPCM IMA High Voltage Software ALP"),
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
+    },
+    {
+        .id        = AV_CODEC_ID_ADPCM_IMA_MTF,
+        .type      = AVMEDIA_TYPE_AUDIO,
+        .name      = "adpcm_ima_mtf",
+        .long_name = NULL_IF_CONFIG_SMALL("ADPCM IMA Capcom's MT Framework"),
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
 
     /* AMR */
@@ -2232,14 +2355,14 @@
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "amr_nb",
         .long_name = NULL_IF_CONFIG_SMALL("AMR-NB (Adaptive Multi-Rate NarrowBand)"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_AMR_WB,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "amr_wb",
         .long_name = NULL_IF_CONFIG_SMALL("AMR-WB (Adaptive Multi-Rate WideBand)"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
 
     /* RealAudio codecs*/
@@ -2248,14 +2371,14 @@
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "ra_144",
         .long_name = NULL_IF_CONFIG_SMALL("RealAudio 1.0 (14.4K)"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_RA_288,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "ra_288",
         .long_name = NULL_IF_CONFIG_SMALL("RealAudio 2.0 (28.8K)"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
 
     /* various DPCM codecs */
@@ -2264,42 +2387,49 @@
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "roq_dpcm",
         .long_name = NULL_IF_CONFIG_SMALL("DPCM id RoQ"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_INTERPLAY_DPCM,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "interplay_dpcm",
         .long_name = NULL_IF_CONFIG_SMALL("DPCM Interplay"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_XAN_DPCM,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "xan_dpcm",
         .long_name = NULL_IF_CONFIG_SMALL("DPCM Xan"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_SOL_DPCM,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "sol_dpcm",
         .long_name = NULL_IF_CONFIG_SMALL("DPCM Sol"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_SDX2_DPCM,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "sdx2_dpcm",
         .long_name = NULL_IF_CONFIG_SMALL("DPCM Squareroot-Delta-Exact"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_GREMLIN_DPCM,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "gremlin_dpcm",
         .long_name = NULL_IF_CONFIG_SMALL("DPCM Gremlin"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
+    },
+    {
+        .id        = AV_CODEC_ID_DERF_DPCM,
+        .type      = AVMEDIA_TYPE_AUDIO,
+        .name      = "derf_dpcm",
+        .long_name = NULL_IF_CONFIG_SMALL("DPCM Xilam DERF"),
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
 
     /* audio codecs */
@@ -2308,21 +2438,21 @@
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "mp2",
         .long_name = NULL_IF_CONFIG_SMALL("MP2 (MPEG audio layer 2)"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_MP3,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "mp3",
         .long_name = NULL_IF_CONFIG_SMALL("MP3 (MPEG audio layer 3)"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_AAC,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "aac",
         .long_name = NULL_IF_CONFIG_SMALL("AAC (Advanced Audio Coding)"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
         .profiles  = NULL_IF_CONFIG_SMALL(ff_aac_profiles),
     },
     {
@@ -2330,14 +2460,14 @@
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "ac3",
         .long_name = NULL_IF_CONFIG_SMALL("ATSC A/52A (AC-3)"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_DTS,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "dts",
         .long_name = NULL_IF_CONFIG_SMALL("DCA (DTS Coherent Acoustics)"),
-        .props     = AV_CODEC_PROP_LOSSY | AV_CODEC_PROP_LOSSLESS,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY | AV_CODEC_PROP_LOSSLESS,
         .profiles  = NULL_IF_CONFIG_SMALL(ff_dca_profiles),
     },
     {
@@ -2345,49 +2475,49 @@
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "vorbis",
         .long_name = NULL_IF_CONFIG_SMALL("Vorbis"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_DVAUDIO,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "dvaudio",
         .long_name = NULL_IF_CONFIG_SMALL("DV audio"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_WMAV1,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "wmav1",
         .long_name = NULL_IF_CONFIG_SMALL("Windows Media Audio 1"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_WMAV2,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "wmav2",
         .long_name = NULL_IF_CONFIG_SMALL("Windows Media Audio 2"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_MACE3,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "mace3",
         .long_name = NULL_IF_CONFIG_SMALL("MACE (Macintosh Audio Compression/Expansion) 3:1"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_MACE6,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "mace6",
         .long_name = NULL_IF_CONFIG_SMALL("MACE (Macintosh Audio Compression/Expansion) 6:1"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_VMDAUDIO,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "vmdaudio",
         .long_name = NULL_IF_CONFIG_SMALL("Sierra VMD audio"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_FLAC,
@@ -2401,21 +2531,21 @@
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "mp3adu",
         .long_name = NULL_IF_CONFIG_SMALL("ADU (Application Data Unit) MP3 (MPEG audio layer 3)"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_MP3ON4,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "mp3on4",
         .long_name = NULL_IF_CONFIG_SMALL("MP3onMP4"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_SHORTEN,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "shorten",
         .long_name = NULL_IF_CONFIG_SMALL("Shorten"),
-        .props     = AV_CODEC_PROP_LOSSLESS,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSLESS,
     },
     {
         .id        = AV_CODEC_ID_ALAC,
@@ -2429,35 +2559,35 @@
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "westwood_snd1",
         .long_name = NULL_IF_CONFIG_SMALL("Westwood Audio (SND1)"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_GSM,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "gsm",
         .long_name = NULL_IF_CONFIG_SMALL("GSM"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_QDM2,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "qdm2",
         .long_name = NULL_IF_CONFIG_SMALL("QDesign Music Codec 2"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_COOK,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "cook",
         .long_name = NULL_IF_CONFIG_SMALL("Cook / Cooker / Gecko (RealAudio G2)"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_TRUESPEECH,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "truespeech",
         .long_name = NULL_IF_CONFIG_SMALL("DSP Group TrueSpeech"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_TTA,
@@ -2471,14 +2601,14 @@
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "smackaudio",
         .long_name = NULL_IF_CONFIG_SMALL("Smacker audio"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_QCELP,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "qcelp",
         .long_name = NULL_IF_CONFIG_SMALL("QCELP / PureVoice"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_WAVPACK,
@@ -2493,126 +2623,126 @@
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "dsicinaudio",
         .long_name = NULL_IF_CONFIG_SMALL("Delphine Software International CIN audio"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_IMC,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "imc",
         .long_name = NULL_IF_CONFIG_SMALL("IMC (Intel Music Coder)"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_MUSEPACK7,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "musepack7",
         .long_name = NULL_IF_CONFIG_SMALL("Musepack SV7"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_MLP,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "mlp",
         .long_name = NULL_IF_CONFIG_SMALL("MLP (Meridian Lossless Packing)"),
-        .props     = AV_CODEC_PROP_LOSSLESS,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSLESS,
     },
     {
         .id        = AV_CODEC_ID_GSM_MS,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "gsm_ms",
         .long_name = NULL_IF_CONFIG_SMALL("GSM Microsoft variant"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_ATRAC3,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "atrac3",
         .long_name = NULL_IF_CONFIG_SMALL("ATRAC3 (Adaptive TRansform Acoustic Coding 3)"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_APE,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "ape",
         .long_name = NULL_IF_CONFIG_SMALL("Monkey's Audio"),
-        .props     = AV_CODEC_PROP_LOSSLESS,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSLESS,
     },
     {
         .id        = AV_CODEC_ID_NELLYMOSER,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "nellymoser",
         .long_name = NULL_IF_CONFIG_SMALL("Nellymoser Asao"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_MUSEPACK8,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "musepack8",
         .long_name = NULL_IF_CONFIG_SMALL("Musepack SV8"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_SPEEX,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "speex",
         .long_name = NULL_IF_CONFIG_SMALL("Speex"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_WMAVOICE,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "wmavoice",
         .long_name = NULL_IF_CONFIG_SMALL("Windows Media Audio Voice"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_WMAPRO,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "wmapro",
         .long_name = NULL_IF_CONFIG_SMALL("Windows Media Audio 9 Professional"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_WMALOSSLESS,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "wmalossless",
         .long_name = NULL_IF_CONFIG_SMALL("Windows Media Audio Lossless"),
-        .props     = AV_CODEC_PROP_LOSSLESS,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSLESS,
     },
     {
         .id        = AV_CODEC_ID_ATRAC3P,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "atrac3p",
         .long_name = NULL_IF_CONFIG_SMALL("ATRAC3+ (Adaptive TRansform Acoustic Coding 3+)"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_EAC3,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "eac3",
         .long_name = NULL_IF_CONFIG_SMALL("ATSC A/52B (AC-3, E-AC-3)"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_SIPR,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "sipr",
         .long_name = NULL_IF_CONFIG_SMALL("RealAudio SIPR / ACELP.NET"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_MP1,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "mp1",
         .long_name = NULL_IF_CONFIG_SMALL("MP1 (MPEG audio layer 1)"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_TWINVQ,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "twinvq",
         .long_name = NULL_IF_CONFIG_SMALL("VQF TwinVQ"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_TRUEHD,
@@ -2626,35 +2756,35 @@
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "mp4als",
         .long_name = NULL_IF_CONFIG_SMALL("MPEG-4 Audio Lossless Coding (ALS)"),
-        .props     = AV_CODEC_PROP_LOSSLESS,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSLESS,
     },
     {
         .id        = AV_CODEC_ID_ATRAC1,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "atrac1",
         .long_name = NULL_IF_CONFIG_SMALL("ATRAC1 (Adaptive TRansform Acoustic Coding)"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_BINKAUDIO_RDFT,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "binkaudio_rdft",
         .long_name = NULL_IF_CONFIG_SMALL("Bink Audio (RDFT)"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_BINKAUDIO_DCT,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "binkaudio_dct",
         .long_name = NULL_IF_CONFIG_SMALL("Bink Audio (DCT)"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_AAC_LATM,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "aac_latm",
         .long_name = NULL_IF_CONFIG_SMALL("AAC LATM (Advanced Audio Coding LATM syntax)"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
         .profiles  = NULL_IF_CONFIG_SMALL(ff_aac_profiles),
     },
     {
@@ -2662,84 +2792,84 @@
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "qdmc",
         .long_name = NULL_IF_CONFIG_SMALL("QDesign Music"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_CELT,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "celt",
         .long_name = NULL_IF_CONFIG_SMALL("Constrained Energy Lapped Transform (CELT)"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_G723_1,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "g723_1",
         .long_name = NULL_IF_CONFIG_SMALL("G.723.1"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_G729,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "g729",
         .long_name = NULL_IF_CONFIG_SMALL("G.729"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_8SVX_EXP,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "8svx_exp",
         .long_name = NULL_IF_CONFIG_SMALL("8SVX exponential"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_8SVX_FIB,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "8svx_fib",
         .long_name = NULL_IF_CONFIG_SMALL("8SVX fibonacci"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_BMV_AUDIO,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "bmv_audio",
         .long_name = NULL_IF_CONFIG_SMALL("Discworld II BMV audio"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_RALF,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "ralf",
         .long_name = NULL_IF_CONFIG_SMALL("RealAudio Lossless"),
-        .props     = AV_CODEC_PROP_LOSSLESS,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSLESS,
     },
     {
         .id        = AV_CODEC_ID_IAC,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "iac",
         .long_name = NULL_IF_CONFIG_SMALL("IAC (Indeo Audio Coder)"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_ILBC,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "ilbc",
         .long_name = NULL_IF_CONFIG_SMALL("iLBC (Internet Low Bitrate Codec)"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_OPUS,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "opus",
         .long_name = NULL_IF_CONFIG_SMALL("Opus (Opus Interactive Audio Codec)"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_COMFORT_NOISE,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "comfortnoise",
         .long_name = NULL_IF_CONFIG_SMALL("RFC 3389 Comfort Noise"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_TAK,
@@ -2753,180 +2883,218 @@
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "metasound",
         .long_name = NULL_IF_CONFIG_SMALL("Voxware MetaSound"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_PAF_AUDIO,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "paf_audio",
         .long_name = NULL_IF_CONFIG_SMALL("Amazing Studio Packed Animation File Audio"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_ON2AVC,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "avc",
         .long_name = NULL_IF_CONFIG_SMALL("On2 Audio for Video Codec"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_DSS_SP,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "dss_sp",
         .long_name = NULL_IF_CONFIG_SMALL("Digital Speech Standard - Standard Play mode (DSS SP)"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_CODEC2,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "codec2",
         .long_name = NULL_IF_CONFIG_SMALL("codec2 (very low bitrate speech codec)"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_FFWAVESYNTH,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "wavesynth",
         .long_name = NULL_IF_CONFIG_SMALL("Wave synthesis pseudo-codec"),
+        .props     = AV_CODEC_PROP_INTRA_ONLY,
     },
     {
         .id        = AV_CODEC_ID_SONIC,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "sonic",
         .long_name = NULL_IF_CONFIG_SMALL("Sonic"),
+        .props     = AV_CODEC_PROP_INTRA_ONLY,
     },
     {
         .id        = AV_CODEC_ID_SONIC_LS,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "sonicls",
         .long_name = NULL_IF_CONFIG_SMALL("Sonic lossless"),
+        .props     = AV_CODEC_PROP_INTRA_ONLY,
     },
     {
         .id        = AV_CODEC_ID_EVRC,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "evrc",
         .long_name = NULL_IF_CONFIG_SMALL("EVRC (Enhanced Variable Rate Codec)"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_SMV,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "smv",
         .long_name = NULL_IF_CONFIG_SMALL("SMV (Selectable Mode Vocoder)"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_DSD_LSBF,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "dsd_lsbf",
         .long_name = NULL_IF_CONFIG_SMALL("DSD (Direct Stream Digital), least significant bit first"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_DSD_MSBF,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "dsd_msbf",
         .long_name = NULL_IF_CONFIG_SMALL("DSD (Direct Stream Digital), most significant bit first"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_DSD_LSBF_PLANAR,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "dsd_lsbf_planar",
         .long_name = NULL_IF_CONFIG_SMALL("DSD (Direct Stream Digital), least significant bit first, planar"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_DSD_MSBF_PLANAR,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "dsd_msbf_planar",
         .long_name = NULL_IF_CONFIG_SMALL("DSD (Direct Stream Digital), most significant bit first, planar"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_4GV,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "4gv",
         .long_name = NULL_IF_CONFIG_SMALL("4GV (Fourth Generation Vocoder)"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_INTERPLAY_ACM,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "interplayacm",
         .long_name = NULL_IF_CONFIG_SMALL("Interplay ACM"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_XMA1,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "xma1",
         .long_name = NULL_IF_CONFIG_SMALL("Xbox Media Audio 1"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_XMA2,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "xma2",
         .long_name = NULL_IF_CONFIG_SMALL("Xbox Media Audio 2"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_DST,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "dst",
         .long_name = NULL_IF_CONFIG_SMALL("DST (Direct Stream Transfer)"),
-        .props     = AV_CODEC_PROP_LOSSLESS,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSLESS,
     },
     {
         .id        = AV_CODEC_ID_ATRAC3AL,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "atrac3al",
         .long_name = NULL_IF_CONFIG_SMALL("ATRAC3 AL (Adaptive TRansform Acoustic Coding 3 Advanced Lossless)"),
-        .props     = AV_CODEC_PROP_LOSSLESS,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSLESS,
     },
     {
         .id        = AV_CODEC_ID_ATRAC3PAL,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "atrac3pal",
         .long_name = NULL_IF_CONFIG_SMALL("ATRAC3+ AL (Adaptive TRansform Acoustic Coding 3+ Advanced Lossless)"),
-        .props     = AV_CODEC_PROP_LOSSLESS,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSLESS,
     },
     {
         .id        = AV_CODEC_ID_DOLBY_E,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "dolby_e",
         .long_name = NULL_IF_CONFIG_SMALL("Dolby E"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_APTX,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "aptx",
         .long_name = NULL_IF_CONFIG_SMALL("aptX (Audio Processing Technology for Bluetooth)"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_APTX_HD,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "aptx_hd",
         .long_name = NULL_IF_CONFIG_SMALL("aptX HD (Audio Processing Technology for Bluetooth)"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_SBC,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "sbc",
         .long_name = NULL_IF_CONFIG_SMALL("SBC (low-complexity subband codec)"),
-        .props     = AV_CODEC_PROP_LOSSY,
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
     },
     {
         .id        = AV_CODEC_ID_ATRAC9,
         .type      = AVMEDIA_TYPE_AUDIO,
         .name      = "atrac9",
         .long_name = NULL_IF_CONFIG_SMALL("ATRAC9 (Adaptive TRansform Acoustic Coding 9)"),
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
+    },
+    {
+        .id        = AV_CODEC_ID_HCOM,
+        .type      = AVMEDIA_TYPE_AUDIO,
+        .name      = "hcom",
+        .long_name = NULL_IF_CONFIG_SMALL("HCOM Audio"),
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
+    },
+    {
+        .id        = AV_CODEC_ID_ACELP_KELVIN,
+        .type      = AVMEDIA_TYPE_AUDIO,
+        .name      = "acelp.kelvin",
+        .long_name = NULL_IF_CONFIG_SMALL("Sipro ACELP.KELVIN"),
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
+    },
+    {
+        .id        = AV_CODEC_ID_MPEGH_3D_AUDIO,
+        .type      = AVMEDIA_TYPE_AUDIO,
+        .name      = "mpegh_3d_audio",
+        .long_name = NULL_IF_CONFIG_SMALL("MPEG-H 3D Audio"),
         .props     = AV_CODEC_PROP_LOSSY,
     },
+    {
+        .id        = AV_CODEC_ID_SIREN,
+        .type      = AVMEDIA_TYPE_AUDIO,
+        .name      = "siren",
+        .long_name = NULL_IF_CONFIG_SMALL("Siren"),
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
+    },
+    {
+        .id        = AV_CODEC_ID_HCA,
+        .type      = AVMEDIA_TYPE_AUDIO,
+        .name      = "hca",
+        .long_name = NULL_IF_CONFIG_SMALL("CRI HCA"),
+        .props     = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
+    },
 
     /* subtitle codecs */
     {
@@ -3103,7 +3271,14 @@
         .long_name = NULL_IF_CONFIG_SMALL("Timed Text Markup Language"),
         .props     = AV_CODEC_PROP_TEXT_SUB,
     },
-
+    {
+        .id        = AV_CODEC_ID_ARIB_CAPTION,
+        .type      = AVMEDIA_TYPE_SUBTITLE,
+        .name      = "arib_caption",
+        .long_name = NULL_IF_CONFIG_SMALL("ARIB STD-B24 caption"),
+        .props     = AV_CODEC_PROP_TEXT_SUB,
+        .profiles  = NULL_IF_CONFIG_SMALL(ff_arib_caption_profiles),
+    },
 
     /* other kind of codecs and pseudo-codecs */
     {
@@ -3120,6 +3295,12 @@
         .long_name = NULL_IF_CONFIG_SMALL("SCTE 35 Message Queue"),
     },
     {
+        .id        = AV_CODEC_ID_EPG,
+        .type      = AVMEDIA_TYPE_DATA,
+        .name      = "epg",
+        .long_name = NULL_IF_CONFIG_SMALL("Electronic Program Guide"),
+    },
+    {
         .id        = AV_CODEC_ID_BINTEXT,
         .type      = AVMEDIA_TYPE_VIDEO,
         .name      = "bintext",
diff --git a/libavcodec/codec_desc.h b/libavcodec/codec_desc.h
new file mode 100644
index 0000000..126b52d
--- /dev/null
+++ b/libavcodec/codec_desc.h
@@ -0,0 +1,128 @@
+/*
+ * Codec descriptors public API
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVCODEC_CODEC_DESC_H
+#define AVCODEC_CODEC_DESC_H
+
+#include "libavutil/avutil.h"
+
+#include "codec_id.h"
+
+/**
+ * @addtogroup lavc_core
+ * @{
+ */
+
+/**
+ * This struct describes the properties of a single codec described by an
+ * AVCodecID.
+ * @see avcodec_descriptor_get()
+ */
+typedef struct AVCodecDescriptor {
+    enum AVCodecID     id;
+    enum AVMediaType type;
+    /**
+     * Name of the codec described by this descriptor. It is non-empty and
+     * unique for each codec descriptor. It should contain alphanumeric
+     * characters and '_' only.
+     */
+    const char      *name;
+    /**
+     * A more descriptive name for this codec. May be NULL.
+     */
+    const char *long_name;
+    /**
+     * Codec properties, a combination of AV_CODEC_PROP_* flags.
+     */
+    int             props;
+    /**
+     * MIME type(s) associated with the codec.
+     * May be NULL; if not, a NULL-terminated array of MIME types.
+     * The first item is always non-NULL and is the preferred MIME type.
+     */
+    const char *const *mime_types;
+    /**
+     * If non-NULL, an array of profiles recognized for this codec.
+     * Terminated with FF_PROFILE_UNKNOWN.
+     */
+    const struct AVProfile *profiles;
+} AVCodecDescriptor;
+
+/**
+ * Codec uses only intra compression.
+ * Video and audio codecs only.
+ */
+#define AV_CODEC_PROP_INTRA_ONLY    (1 << 0)
+/**
+ * Codec supports lossy compression. Audio and video codecs only.
+ * @note a codec may support both lossy and lossless
+ * compression modes
+ */
+#define AV_CODEC_PROP_LOSSY         (1 << 1)
+/**
+ * Codec supports lossless compression. Audio and video codecs only.
+ */
+#define AV_CODEC_PROP_LOSSLESS      (1 << 2)
+/**
+ * Codec supports frame reordering. That is, the coded order (the order in which
+ * the encoded packets are output by the encoders / stored / input to the
+ * decoders) may be different from the presentation order of the corresponding
+ * frames.
+ *
+ * For codecs that do not have this property set, PTS and DTS should always be
+ * equal.
+ */
+#define AV_CODEC_PROP_REORDER       (1 << 3)
+/**
+ * Subtitle codec is bitmap based
+ * Decoded AVSubtitle data can be read from the AVSubtitleRect->pict field.
+ */
+#define AV_CODEC_PROP_BITMAP_SUB    (1 << 16)
+/**
+ * Subtitle codec is text based.
+ * Decoded AVSubtitle data can be read from the AVSubtitleRect->ass field.
+ */
+#define AV_CODEC_PROP_TEXT_SUB      (1 << 17)
+
+/**
+ * @return descriptor for given codec ID or NULL if no descriptor exists.
+ */
+const AVCodecDescriptor *avcodec_descriptor_get(enum AVCodecID id);
+
+/**
+ * Iterate over all codec descriptors known to libavcodec.
+ *
+ * @param prev previous descriptor. NULL to get the first descriptor.
+ *
+ * @return next descriptor or NULL after the last descriptor
+ */
+const AVCodecDescriptor *avcodec_descriptor_next(const AVCodecDescriptor *prev);
+
+/**
+ * @return codec descriptor with the given name or NULL if no such descriptor
+ *         exists.
+ */
+const AVCodecDescriptor *avcodec_descriptor_get_by_name(const char *name);
+
+/**
+ * @}
+ */
+
+#endif // AVCODEC_CODEC_DESC_H
diff --git a/libavcodec/codec_id.h b/libavcodec/codec_id.h
new file mode 100644
index 0000000..0244af6
--- /dev/null
+++ b/libavcodec/codec_id.h
@@ -0,0 +1,562 @@
+/*
+ * Codec IDs
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVCODEC_CODEC_ID_H
+#define AVCODEC_CODEC_ID_H
+
+/**
+ * @addtogroup lavc_core
+ * @{
+ */
+
+/**
+ * Identify the syntax and semantics of the bitstream.
+ * The principle is roughly:
+ * Two decoders with the same ID can decode the same streams.
+ * Two encoders with the same ID can encode compatible streams.
+ * There may be slight deviations from the principle due to implementation
+ * details.
+ *
+ * If you add a codec ID to this list, add it so that
+ * 1. no value of an existing codec ID changes (that would break ABI),
+ * 2. it is as close as possible to similar codecs
+ *
+ * After adding new codec IDs, do not forget to add an entry to the codec
+ * descriptor list and bump libavcodec minor version.
+ */
+enum AVCodecID {
+    AV_CODEC_ID_NONE,
+
+    /* video codecs */
+    AV_CODEC_ID_MPEG1VIDEO,
+    AV_CODEC_ID_MPEG2VIDEO, ///< preferred ID for MPEG-1/2 video decoding
+    AV_CODEC_ID_H261,
+    AV_CODEC_ID_H263,
+    AV_CODEC_ID_RV10,
+    AV_CODEC_ID_RV20,
+    AV_CODEC_ID_MJPEG,
+    AV_CODEC_ID_MJPEGB,
+    AV_CODEC_ID_LJPEG,
+    AV_CODEC_ID_SP5X,
+    AV_CODEC_ID_JPEGLS,
+    AV_CODEC_ID_MPEG4,
+    AV_CODEC_ID_RAWVIDEO,
+    AV_CODEC_ID_MSMPEG4V1,
+    AV_CODEC_ID_MSMPEG4V2,
+    AV_CODEC_ID_MSMPEG4V3,
+    AV_CODEC_ID_WMV1,
+    AV_CODEC_ID_WMV2,
+    AV_CODEC_ID_H263P,
+    AV_CODEC_ID_H263I,
+    AV_CODEC_ID_FLV1,
+    AV_CODEC_ID_SVQ1,
+    AV_CODEC_ID_SVQ3,
+    AV_CODEC_ID_DVVIDEO,
+    AV_CODEC_ID_HUFFYUV,
+    AV_CODEC_ID_CYUV,
+    AV_CODEC_ID_H264,
+    AV_CODEC_ID_INDEO3,
+    AV_CODEC_ID_VP3,
+    AV_CODEC_ID_THEORA,
+    AV_CODEC_ID_ASV1,
+    AV_CODEC_ID_ASV2,
+    AV_CODEC_ID_FFV1,
+    AV_CODEC_ID_4XM,
+    AV_CODEC_ID_VCR1,
+    AV_CODEC_ID_CLJR,
+    AV_CODEC_ID_MDEC,
+    AV_CODEC_ID_ROQ,
+    AV_CODEC_ID_INTERPLAY_VIDEO,
+    AV_CODEC_ID_XAN_WC3,
+    AV_CODEC_ID_XAN_WC4,
+    AV_CODEC_ID_RPZA,
+    AV_CODEC_ID_CINEPAK,
+    AV_CODEC_ID_WS_VQA,
+    AV_CODEC_ID_MSRLE,
+    AV_CODEC_ID_MSVIDEO1,
+    AV_CODEC_ID_IDCIN,
+    AV_CODEC_ID_8BPS,
+    AV_CODEC_ID_SMC,
+    AV_CODEC_ID_FLIC,
+    AV_CODEC_ID_TRUEMOTION1,
+    AV_CODEC_ID_VMDVIDEO,
+    AV_CODEC_ID_MSZH,
+    AV_CODEC_ID_ZLIB,
+    AV_CODEC_ID_QTRLE,
+    AV_CODEC_ID_TSCC,
+    AV_CODEC_ID_ULTI,
+    AV_CODEC_ID_QDRAW,
+    AV_CODEC_ID_VIXL,
+    AV_CODEC_ID_QPEG,
+    AV_CODEC_ID_PNG,
+    AV_CODEC_ID_PPM,
+    AV_CODEC_ID_PBM,
+    AV_CODEC_ID_PGM,
+    AV_CODEC_ID_PGMYUV,
+    AV_CODEC_ID_PAM,
+    AV_CODEC_ID_FFVHUFF,
+    AV_CODEC_ID_RV30,
+    AV_CODEC_ID_RV40,
+    AV_CODEC_ID_VC1,
+    AV_CODEC_ID_WMV3,
+    AV_CODEC_ID_LOCO,
+    AV_CODEC_ID_WNV1,
+    AV_CODEC_ID_AASC,
+    AV_CODEC_ID_INDEO2,
+    AV_CODEC_ID_FRAPS,
+    AV_CODEC_ID_TRUEMOTION2,
+    AV_CODEC_ID_BMP,
+    AV_CODEC_ID_CSCD,
+    AV_CODEC_ID_MMVIDEO,
+    AV_CODEC_ID_ZMBV,
+    AV_CODEC_ID_AVS,
+    AV_CODEC_ID_SMACKVIDEO,
+    AV_CODEC_ID_NUV,
+    AV_CODEC_ID_KMVC,
+    AV_CODEC_ID_FLASHSV,
+    AV_CODEC_ID_CAVS,
+    AV_CODEC_ID_JPEG2000,
+    AV_CODEC_ID_VMNC,
+    AV_CODEC_ID_VP5,
+    AV_CODEC_ID_VP6,
+    AV_CODEC_ID_VP6F,
+    AV_CODEC_ID_TARGA,
+    AV_CODEC_ID_DSICINVIDEO,
+    AV_CODEC_ID_TIERTEXSEQVIDEO,
+    AV_CODEC_ID_TIFF,
+    AV_CODEC_ID_GIF,
+    AV_CODEC_ID_DXA,
+    AV_CODEC_ID_DNXHD,
+    AV_CODEC_ID_THP,
+    AV_CODEC_ID_SGI,
+    AV_CODEC_ID_C93,
+    AV_CODEC_ID_BETHSOFTVID,
+    AV_CODEC_ID_PTX,
+    AV_CODEC_ID_TXD,
+    AV_CODEC_ID_VP6A,
+    AV_CODEC_ID_AMV,
+    AV_CODEC_ID_VB,
+    AV_CODEC_ID_PCX,
+    AV_CODEC_ID_SUNRAST,
+    AV_CODEC_ID_INDEO4,
+    AV_CODEC_ID_INDEO5,
+    AV_CODEC_ID_MIMIC,
+    AV_CODEC_ID_RL2,
+    AV_CODEC_ID_ESCAPE124,
+    AV_CODEC_ID_DIRAC,
+    AV_CODEC_ID_BFI,
+    AV_CODEC_ID_CMV,
+    AV_CODEC_ID_MOTIONPIXELS,
+    AV_CODEC_ID_TGV,
+    AV_CODEC_ID_TGQ,
+    AV_CODEC_ID_TQI,
+    AV_CODEC_ID_AURA,
+    AV_CODEC_ID_AURA2,
+    AV_CODEC_ID_V210X,
+    AV_CODEC_ID_TMV,
+    AV_CODEC_ID_V210,
+    AV_CODEC_ID_DPX,
+    AV_CODEC_ID_MAD,
+    AV_CODEC_ID_FRWU,
+    AV_CODEC_ID_FLASHSV2,
+    AV_CODEC_ID_CDGRAPHICS,
+    AV_CODEC_ID_R210,
+    AV_CODEC_ID_ANM,
+    AV_CODEC_ID_BINKVIDEO,
+    AV_CODEC_ID_IFF_ILBM,
+#define AV_CODEC_ID_IFF_BYTERUN1 AV_CODEC_ID_IFF_ILBM
+    AV_CODEC_ID_KGV1,
+    AV_CODEC_ID_YOP,
+    AV_CODEC_ID_VP8,
+    AV_CODEC_ID_PICTOR,
+    AV_CODEC_ID_ANSI,
+    AV_CODEC_ID_A64_MULTI,
+    AV_CODEC_ID_A64_MULTI5,
+    AV_CODEC_ID_R10K,
+    AV_CODEC_ID_MXPEG,
+    AV_CODEC_ID_LAGARITH,
+    AV_CODEC_ID_PRORES,
+    AV_CODEC_ID_JV,
+    AV_CODEC_ID_DFA,
+    AV_CODEC_ID_WMV3IMAGE,
+    AV_CODEC_ID_VC1IMAGE,
+    AV_CODEC_ID_UTVIDEO,
+    AV_CODEC_ID_BMV_VIDEO,
+    AV_CODEC_ID_VBLE,
+    AV_CODEC_ID_DXTORY,
+    AV_CODEC_ID_V410,
+    AV_CODEC_ID_XWD,
+    AV_CODEC_ID_CDXL,
+    AV_CODEC_ID_XBM,
+    AV_CODEC_ID_ZEROCODEC,
+    AV_CODEC_ID_MSS1,
+    AV_CODEC_ID_MSA1,
+    AV_CODEC_ID_TSCC2,
+    AV_CODEC_ID_MTS2,
+    AV_CODEC_ID_CLLC,
+    AV_CODEC_ID_MSS2,
+    AV_CODEC_ID_VP9,
+    AV_CODEC_ID_AIC,
+    AV_CODEC_ID_ESCAPE130,
+    AV_CODEC_ID_G2M,
+    AV_CODEC_ID_WEBP,
+    AV_CODEC_ID_HNM4_VIDEO,
+    AV_CODEC_ID_HEVC,
+#define AV_CODEC_ID_H265 AV_CODEC_ID_HEVC
+    AV_CODEC_ID_FIC,
+    AV_CODEC_ID_ALIAS_PIX,
+    AV_CODEC_ID_BRENDER_PIX,
+    AV_CODEC_ID_PAF_VIDEO,
+    AV_CODEC_ID_EXR,
+    AV_CODEC_ID_VP7,
+    AV_CODEC_ID_SANM,
+    AV_CODEC_ID_SGIRLE,
+    AV_CODEC_ID_MVC1,
+    AV_CODEC_ID_MVC2,
+    AV_CODEC_ID_HQX,
+    AV_CODEC_ID_TDSC,
+    AV_CODEC_ID_HQ_HQA,
+    AV_CODEC_ID_HAP,
+    AV_CODEC_ID_DDS,
+    AV_CODEC_ID_DXV,
+    AV_CODEC_ID_SCREENPRESSO,
+    AV_CODEC_ID_RSCC,
+    AV_CODEC_ID_AVS2,
+
+    AV_CODEC_ID_Y41P = 0x8000,
+    AV_CODEC_ID_AVRP,
+    AV_CODEC_ID_012V,
+    AV_CODEC_ID_AVUI,
+    AV_CODEC_ID_AYUV,
+    AV_CODEC_ID_TARGA_Y216,
+    AV_CODEC_ID_V308,
+    AV_CODEC_ID_V408,
+    AV_CODEC_ID_YUV4,
+    AV_CODEC_ID_AVRN,
+    AV_CODEC_ID_CPIA,
+    AV_CODEC_ID_XFACE,
+    AV_CODEC_ID_SNOW,
+    AV_CODEC_ID_SMVJPEG,
+    AV_CODEC_ID_APNG,
+    AV_CODEC_ID_DAALA,
+    AV_CODEC_ID_CFHD,
+    AV_CODEC_ID_TRUEMOTION2RT,
+    AV_CODEC_ID_M101,
+    AV_CODEC_ID_MAGICYUV,
+    AV_CODEC_ID_SHEERVIDEO,
+    AV_CODEC_ID_YLC,
+    AV_CODEC_ID_PSD,
+    AV_CODEC_ID_PIXLET,
+    AV_CODEC_ID_SPEEDHQ,
+    AV_CODEC_ID_FMVC,
+    AV_CODEC_ID_SCPR,
+    AV_CODEC_ID_CLEARVIDEO,
+    AV_CODEC_ID_XPM,
+    AV_CODEC_ID_AV1,
+    AV_CODEC_ID_BITPACKED,
+    AV_CODEC_ID_MSCC,
+    AV_CODEC_ID_SRGC,
+    AV_CODEC_ID_SVG,
+    AV_CODEC_ID_GDV,
+    AV_CODEC_ID_FITS,
+    AV_CODEC_ID_IMM4,
+    AV_CODEC_ID_PROSUMER,
+    AV_CODEC_ID_MWSC,
+    AV_CODEC_ID_WCMV,
+    AV_CODEC_ID_RASC,
+    AV_CODEC_ID_HYMT,
+    AV_CODEC_ID_ARBC,
+    AV_CODEC_ID_AGM,
+    AV_CODEC_ID_LSCR,
+    AV_CODEC_ID_VP4,
+    AV_CODEC_ID_IMM5,
+    AV_CODEC_ID_MVDV,
+    AV_CODEC_ID_MVHA,
+    AV_CODEC_ID_CDTOONS,
+    AV_CODEC_ID_MV30,
+
+    /* various PCM "codecs" */
+    AV_CODEC_ID_FIRST_AUDIO = 0x10000,     ///< A dummy id pointing at the start of audio codecs
+    AV_CODEC_ID_PCM_S16LE = 0x10000,
+    AV_CODEC_ID_PCM_S16BE,
+    AV_CODEC_ID_PCM_U16LE,
+    AV_CODEC_ID_PCM_U16BE,
+    AV_CODEC_ID_PCM_S8,
+    AV_CODEC_ID_PCM_U8,
+    AV_CODEC_ID_PCM_MULAW,
+    AV_CODEC_ID_PCM_ALAW,
+    AV_CODEC_ID_PCM_S32LE,
+    AV_CODEC_ID_PCM_S32BE,
+    AV_CODEC_ID_PCM_U32LE,
+    AV_CODEC_ID_PCM_U32BE,
+    AV_CODEC_ID_PCM_S24LE,
+    AV_CODEC_ID_PCM_S24BE,
+    AV_CODEC_ID_PCM_U24LE,
+    AV_CODEC_ID_PCM_U24BE,
+    AV_CODEC_ID_PCM_S24DAUD,
+    AV_CODEC_ID_PCM_ZORK,
+    AV_CODEC_ID_PCM_S16LE_PLANAR,
+    AV_CODEC_ID_PCM_DVD,
+    AV_CODEC_ID_PCM_F32BE,
+    AV_CODEC_ID_PCM_F32LE,
+    AV_CODEC_ID_PCM_F64BE,
+    AV_CODEC_ID_PCM_F64LE,
+    AV_CODEC_ID_PCM_BLURAY,
+    AV_CODEC_ID_PCM_LXF,
+    AV_CODEC_ID_S302M,
+    AV_CODEC_ID_PCM_S8_PLANAR,
+    AV_CODEC_ID_PCM_S24LE_PLANAR,
+    AV_CODEC_ID_PCM_S32LE_PLANAR,
+    AV_CODEC_ID_PCM_S16BE_PLANAR,
+
+    AV_CODEC_ID_PCM_S64LE = 0x10800,
+    AV_CODEC_ID_PCM_S64BE,
+    AV_CODEC_ID_PCM_F16LE,
+    AV_CODEC_ID_PCM_F24LE,
+    AV_CODEC_ID_PCM_VIDC,
+
+    /* various ADPCM codecs */
+    AV_CODEC_ID_ADPCM_IMA_QT = 0x11000,
+    AV_CODEC_ID_ADPCM_IMA_WAV,
+    AV_CODEC_ID_ADPCM_IMA_DK3,
+    AV_CODEC_ID_ADPCM_IMA_DK4,
+    AV_CODEC_ID_ADPCM_IMA_WS,
+    AV_CODEC_ID_ADPCM_IMA_SMJPEG,
+    AV_CODEC_ID_ADPCM_MS,
+    AV_CODEC_ID_ADPCM_4XM,
+    AV_CODEC_ID_ADPCM_XA,
+    AV_CODEC_ID_ADPCM_ADX,
+    AV_CODEC_ID_ADPCM_EA,
+    AV_CODEC_ID_ADPCM_G726,
+    AV_CODEC_ID_ADPCM_CT,
+    AV_CODEC_ID_ADPCM_SWF,
+    AV_CODEC_ID_ADPCM_YAMAHA,
+    AV_CODEC_ID_ADPCM_SBPRO_4,
+    AV_CODEC_ID_ADPCM_SBPRO_3,
+    AV_CODEC_ID_ADPCM_SBPRO_2,
+    AV_CODEC_ID_ADPCM_THP,
+    AV_CODEC_ID_ADPCM_IMA_AMV,
+    AV_CODEC_ID_ADPCM_EA_R1,
+    AV_CODEC_ID_ADPCM_EA_R3,
+    AV_CODEC_ID_ADPCM_EA_R2,
+    AV_CODEC_ID_ADPCM_IMA_EA_SEAD,
+    AV_CODEC_ID_ADPCM_IMA_EA_EACS,
+    AV_CODEC_ID_ADPCM_EA_XAS,
+    AV_CODEC_ID_ADPCM_EA_MAXIS_XA,
+    AV_CODEC_ID_ADPCM_IMA_ISS,
+    AV_CODEC_ID_ADPCM_G722,
+    AV_CODEC_ID_ADPCM_IMA_APC,
+    AV_CODEC_ID_ADPCM_VIMA,
+
+    AV_CODEC_ID_ADPCM_AFC = 0x11800,
+    AV_CODEC_ID_ADPCM_IMA_OKI,
+    AV_CODEC_ID_ADPCM_DTK,
+    AV_CODEC_ID_ADPCM_IMA_RAD,
+    AV_CODEC_ID_ADPCM_G726LE,
+    AV_CODEC_ID_ADPCM_THP_LE,
+    AV_CODEC_ID_ADPCM_PSX,
+    AV_CODEC_ID_ADPCM_AICA,
+    AV_CODEC_ID_ADPCM_IMA_DAT4,
+    AV_CODEC_ID_ADPCM_MTAF,
+    AV_CODEC_ID_ADPCM_AGM,
+    AV_CODEC_ID_ADPCM_ARGO,
+    AV_CODEC_ID_ADPCM_IMA_SSI,
+    AV_CODEC_ID_ADPCM_ZORK,
+    AV_CODEC_ID_ADPCM_IMA_APM,
+    AV_CODEC_ID_ADPCM_IMA_ALP,
+    AV_CODEC_ID_ADPCM_IMA_MTF,
+
+    /* AMR */
+    AV_CODEC_ID_AMR_NB = 0x12000,
+    AV_CODEC_ID_AMR_WB,
+
+    /* RealAudio codecs*/
+    AV_CODEC_ID_RA_144 = 0x13000,
+    AV_CODEC_ID_RA_288,
+
+    /* various DPCM codecs */
+    AV_CODEC_ID_ROQ_DPCM = 0x14000,
+    AV_CODEC_ID_INTERPLAY_DPCM,
+    AV_CODEC_ID_XAN_DPCM,
+    AV_CODEC_ID_SOL_DPCM,
+
+    AV_CODEC_ID_SDX2_DPCM = 0x14800,
+    AV_CODEC_ID_GREMLIN_DPCM,
+    AV_CODEC_ID_DERF_DPCM,
+
+    /* audio codecs */
+    AV_CODEC_ID_MP2 = 0x15000,
+    AV_CODEC_ID_MP3, ///< preferred ID for decoding MPEG audio layer 1, 2 or 3
+    AV_CODEC_ID_AAC,
+    AV_CODEC_ID_AC3,
+    AV_CODEC_ID_DTS,
+    AV_CODEC_ID_VORBIS,
+    AV_CODEC_ID_DVAUDIO,
+    AV_CODEC_ID_WMAV1,
+    AV_CODEC_ID_WMAV2,
+    AV_CODEC_ID_MACE3,
+    AV_CODEC_ID_MACE6,
+    AV_CODEC_ID_VMDAUDIO,
+    AV_CODEC_ID_FLAC,
+    AV_CODEC_ID_MP3ADU,
+    AV_CODEC_ID_MP3ON4,
+    AV_CODEC_ID_SHORTEN,
+    AV_CODEC_ID_ALAC,
+    AV_CODEC_ID_WESTWOOD_SND1,
+    AV_CODEC_ID_GSM, ///< as in Berlin toast format
+    AV_CODEC_ID_QDM2,
+    AV_CODEC_ID_COOK,
+    AV_CODEC_ID_TRUESPEECH,
+    AV_CODEC_ID_TTA,
+    AV_CODEC_ID_SMACKAUDIO,
+    AV_CODEC_ID_QCELP,
+    AV_CODEC_ID_WAVPACK,
+    AV_CODEC_ID_DSICINAUDIO,
+    AV_CODEC_ID_IMC,
+    AV_CODEC_ID_MUSEPACK7,
+    AV_CODEC_ID_MLP,
+    AV_CODEC_ID_GSM_MS, /* as found in WAV */
+    AV_CODEC_ID_ATRAC3,
+    AV_CODEC_ID_APE,
+    AV_CODEC_ID_NELLYMOSER,
+    AV_CODEC_ID_MUSEPACK8,
+    AV_CODEC_ID_SPEEX,
+    AV_CODEC_ID_WMAVOICE,
+    AV_CODEC_ID_WMAPRO,
+    AV_CODEC_ID_WMALOSSLESS,
+    AV_CODEC_ID_ATRAC3P,
+    AV_CODEC_ID_EAC3,
+    AV_CODEC_ID_SIPR,
+    AV_CODEC_ID_MP1,
+    AV_CODEC_ID_TWINVQ,
+    AV_CODEC_ID_TRUEHD,
+    AV_CODEC_ID_MP4ALS,
+    AV_CODEC_ID_ATRAC1,
+    AV_CODEC_ID_BINKAUDIO_RDFT,
+    AV_CODEC_ID_BINKAUDIO_DCT,
+    AV_CODEC_ID_AAC_LATM,
+    AV_CODEC_ID_QDMC,
+    AV_CODEC_ID_CELT,
+    AV_CODEC_ID_G723_1,
+    AV_CODEC_ID_G729,
+    AV_CODEC_ID_8SVX_EXP,
+    AV_CODEC_ID_8SVX_FIB,
+    AV_CODEC_ID_BMV_AUDIO,
+    AV_CODEC_ID_RALF,
+    AV_CODEC_ID_IAC,
+    AV_CODEC_ID_ILBC,
+    AV_CODEC_ID_OPUS,
+    AV_CODEC_ID_COMFORT_NOISE,
+    AV_CODEC_ID_TAK,
+    AV_CODEC_ID_METASOUND,
+    AV_CODEC_ID_PAF_AUDIO,
+    AV_CODEC_ID_ON2AVC,
+    AV_CODEC_ID_DSS_SP,
+    AV_CODEC_ID_CODEC2,
+
+    AV_CODEC_ID_FFWAVESYNTH = 0x15800,
+    AV_CODEC_ID_SONIC,
+    AV_CODEC_ID_SONIC_LS,
+    AV_CODEC_ID_EVRC,
+    AV_CODEC_ID_SMV,
+    AV_CODEC_ID_DSD_LSBF,
+    AV_CODEC_ID_DSD_MSBF,
+    AV_CODEC_ID_DSD_LSBF_PLANAR,
+    AV_CODEC_ID_DSD_MSBF_PLANAR,
+    AV_CODEC_ID_4GV,
+    AV_CODEC_ID_INTERPLAY_ACM,
+    AV_CODEC_ID_XMA1,
+    AV_CODEC_ID_XMA2,
+    AV_CODEC_ID_DST,
+    AV_CODEC_ID_ATRAC3AL,
+    AV_CODEC_ID_ATRAC3PAL,
+    AV_CODEC_ID_DOLBY_E,
+    AV_CODEC_ID_APTX,
+    AV_CODEC_ID_APTX_HD,
+    AV_CODEC_ID_SBC,
+    AV_CODEC_ID_ATRAC9,
+    AV_CODEC_ID_HCOM,
+    AV_CODEC_ID_ACELP_KELVIN,
+    AV_CODEC_ID_MPEGH_3D_AUDIO,
+    AV_CODEC_ID_SIREN,
+    AV_CODEC_ID_HCA,
+
+    /* subtitle codecs */
+    AV_CODEC_ID_FIRST_SUBTITLE = 0x17000,          ///< A dummy ID pointing at the start of subtitle codecs.
+    AV_CODEC_ID_DVD_SUBTITLE = 0x17000,
+    AV_CODEC_ID_DVB_SUBTITLE,
+    AV_CODEC_ID_TEXT,  ///< raw UTF-8 text
+    AV_CODEC_ID_XSUB,
+    AV_CODEC_ID_SSA,
+    AV_CODEC_ID_MOV_TEXT,
+    AV_CODEC_ID_HDMV_PGS_SUBTITLE,
+    AV_CODEC_ID_DVB_TELETEXT,
+    AV_CODEC_ID_SRT,
+
+    AV_CODEC_ID_MICRODVD   = 0x17800,
+    AV_CODEC_ID_EIA_608,
+    AV_CODEC_ID_JACOSUB,
+    AV_CODEC_ID_SAMI,
+    AV_CODEC_ID_REALTEXT,
+    AV_CODEC_ID_STL,
+    AV_CODEC_ID_SUBVIEWER1,
+    AV_CODEC_ID_SUBVIEWER,
+    AV_CODEC_ID_SUBRIP,
+    AV_CODEC_ID_WEBVTT,
+    AV_CODEC_ID_MPL2,
+    AV_CODEC_ID_VPLAYER,
+    AV_CODEC_ID_PJS,
+    AV_CODEC_ID_ASS,
+    AV_CODEC_ID_HDMV_TEXT_SUBTITLE,
+    AV_CODEC_ID_TTML,
+    AV_CODEC_ID_ARIB_CAPTION,
+
+    /* other specific kind of codecs (generally used for attachments) */
+    AV_CODEC_ID_FIRST_UNKNOWN = 0x18000,           ///< A dummy ID pointing at the start of various fake codecs.
+    AV_CODEC_ID_TTF = 0x18000,
+
+    AV_CODEC_ID_SCTE_35, ///< Contain timestamp estimated through PCR of program stream.
+    AV_CODEC_ID_EPG,
+    AV_CODEC_ID_BINTEXT    = 0x18800,
+    AV_CODEC_ID_XBIN,
+    AV_CODEC_ID_IDF,
+    AV_CODEC_ID_OTF,
+    AV_CODEC_ID_SMPTE_KLV,
+    AV_CODEC_ID_DVD_NAV,
+    AV_CODEC_ID_TIMED_ID3,
+    AV_CODEC_ID_BIN_DATA,
+
+
+    AV_CODEC_ID_PROBE = 0x19000, ///< codec_id is not known (like AV_CODEC_ID_NONE) but lavf should attempt to identify it
+
+    AV_CODEC_ID_MPEG2TS = 0x20000, /**< _FAKE_ codec to indicate a raw MPEG-2 TS
+                                * stream (only used by libavformat) */
+    AV_CODEC_ID_MPEG4SYSTEMS = 0x20001, /**< _FAKE_ codec to indicate a MPEG-4 Systems
+                                * stream (only used by libavformat) */
+    AV_CODEC_ID_FFMETADATA = 0x21000,   ///< Dummy codec for streams containing only metadata information.
+    AV_CODEC_ID_WRAPPED_AVFRAME = 0x21001, ///< Passthrough codec, AVFrames wrapped in AVPacket
+};
+
+
+/**
+ * @}
+ */
+
+#endif // AVCODEC_CODEC_ID_H
diff --git a/libavcodec/cook.c b/libavcodec/cook.c
index c5f68c9..d0b41a2 100644
--- a/libavcodec/cook.c
+++ b/libavcodec/cook.c
@@ -60,7 +60,7 @@
 #define MONO            0x1000001
 #define STEREO          0x1000002
 #define JOINT_STEREO    0x1000003
-#define MC_COOK         0x2000000   // multichannel Cook, not supported
+#define MC_COOK         0x2000000
 
 #define SUBBAND_SIZE    20
 #define MAX_SUBPACKETS   5
@@ -143,7 +143,7 @@
 
     /* generate tables and related variables */
     int                 gain_size_factor;
-    float               gain_table[23];
+    float               gain_table[31];
 
     /* data buffers */
 
@@ -185,8 +185,8 @@
 {
     int i;
     q->gain_size_factor = q->samples_per_channel / 8;
-    for (i = 0; i < 23; i++)
-        q->gain_table[i] = pow(pow2tab[i + 52],
+    for (i = 0; i < 31; i++)
+        q->gain_table[i] = pow(pow2tab[i + 48],
                                (1.0 / (double) q->gain_size_factor));
 }
 
@@ -670,7 +670,7 @@
         for (i = 0; i < q->gain_size_factor; i++)
             buffer[i] *= fc1;
     } else {                                        // smooth gain
-        fc2 = q->gain_table[11 + (gain_index_next - gain_index)];
+        fc2 = q->gain_table[15 + (gain_index_next - gain_index)];
         for (i = 0; i < q->gain_size_factor; i++) {
             buffer[i] *= fc1;
             fc1       *= fc2;
@@ -759,7 +759,7 @@
         for (i = 0; i < length; i++)
             decouple_tab[start + i] = get_vlc2(&q->gb,
                                                p->channel_coupling.table,
-                                               p->channel_coupling.bits, 2);
+                                               p->channel_coupling.bits, 3);
     else
         for (i = 0; i < length; i++) {
             int v = get_bits(&q->gb, p->js_vlc_bits);
@@ -1075,6 +1075,9 @@
         return AVERROR_INVALIDDATA;
     }
 
+    if (avctx->block_align >= INT_MAX / 8)
+        return AVERROR(EINVAL);
+
     /* Initialize RNG. */
     av_lfg_init(&q->random_state, 0);
 
@@ -1217,6 +1220,15 @@
             return AVERROR_PATCHWELCOME;
         }
     }
+
+    /* Try to catch some obviously faulty streams, otherwise it might be exploitable */
+    if (q->samples_per_channel != 256 && q->samples_per_channel != 512 &&
+        q->samples_per_channel != 1024) {
+        avpriv_request_sample(avctx, "samples_per_channel = %d",
+                              q->samples_per_channel);
+        return AVERROR_PATCHWELCOME;
+    }
+
     /* Generate tables */
     init_pow2table();
     init_gain_table(q);
@@ -1225,10 +1237,6 @@
     if ((ret = init_cook_vlc_tables(q)))
         return ret;
 
-
-    if (avctx->block_align >= UINT_MAX / 2)
-        return AVERROR(EINVAL);
-
     /* Pad the databuffer with:
        DECODE_BYTES_PAD1 or DECODE_BYTES_PAD2 for decode_bytes(),
        AV_INPUT_BUFFER_PADDING_SIZE, for the bitstreamreader. */
@@ -1252,14 +1260,6 @@
         q->saturate_output = saturate_output_float;
     }
 
-    /* Try to catch some obviously faulty streams, otherwise it might be exploitable */
-    if (q->samples_per_channel != 256 && q->samples_per_channel != 512 &&
-        q->samples_per_channel != 1024) {
-        avpriv_request_sample(avctx, "samples_per_channel = %d",
-                              q->samples_per_channel);
-        return AVERROR_PATCHWELCOME;
-    }
-
     avctx->sample_fmt = AV_SAMPLE_FMT_FLTP;
     if (channel_mask)
         avctx->channel_layout = channel_mask;
diff --git a/libavcodec/cookdata.h b/libavcodec/cookdata.h
index dcdb912..efb8a53 100644
--- a/libavcodec/cookdata.h
+++ b/libavcodec/cookdata.h
@@ -453,12 +453,13 @@
 };
 
 static const uint16_t ccpl_huffcodes6[63] = {
-    0x0004,0x0005,0x0005,0x0006,0x0006,0x0007,0x0007,0x0007,0x0007,0x0008,0x0008,0x0008,
-    0x0008,0x0009,0x0009,0x0009,0x0009,0x000a,0x000a,0x000a,0x000a,0x000a,0x000b,0x000b,
-    0x000b,0x000b,0x000c,0x000d,0x000e,0x000e,0x0010,0x0000,0x000a,0x0018,0x0019,0x0036,
-    0x0037,0x0074,0x0075,0x0076,0x0077,0x00f4,0x00f5,0x00f6,0x00f7,0x01f5,0x01f6,0x01f7,
-    0x01f8,0x03f6,0x03f7,0x03f8,0x03f9,0x03fa,0x07fa,0x07fb,0x07fc,0x07fd,0x0ffd,0x1ffd,
-    0x3ffd,0x3ffe,0xffff,
+    0xfffe, 0x7ffe, 0x3ffc, 0x1ffc, 0x0ffc, 0x07f6, 0x07f7, 0x07f8, 0x07f9,
+    0x03f2, 0x03f3, 0x03f4, 0x03f5, 0x01f0, 0x01f1, 0x01f2, 0x01f3, 0x01f4,
+    0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x0070, 0x0071, 0x0072, 0x0073, 0x0034,
+    0x0035, 0x0016, 0x0017, 0x0004, 0x0000, 0x000a, 0x0018, 0x0019, 0x0036,
+    0x0037, 0x0074, 0x0075, 0x0076, 0x0077, 0x00f4, 0x00f5, 0x00f6, 0x00f7,
+    0x01f5, 0x01f6, 0x01f7, 0x01f8, 0x03f6, 0x03f7, 0x03f8, 0x03f9, 0x03fa,
+    0x07fa, 0x07fb, 0x07fc, 0x07fd, 0x0ffd, 0x1ffd, 0x3ffd, 0x3ffe, 0xffff
 };
 
 static const uint8_t ccpl_huffbits2[3] = {
diff --git a/libavcodec/cpia.c b/libavcodec/cpia.c
index 58833b2..bf09e1a 100644
--- a/libavcodec/cpia.c
+++ b/libavcodec/cpia.c
@@ -63,7 +63,7 @@
     uint8_t *y, *u, *v, *y_end, *u_end, *v_end;
 
     // Check header
-    if ( avpkt->size < FRAME_HEADER_SIZE
+    if ( avpkt->size < FRAME_HEADER_SIZE + avctx->height * 3
       || header[0] != MAGIC_0 || header[1] != MAGIC_1
       || (header[17] != SUBSAMPLE_420 && header[17] != SUBSAMPLE_422)
       || (header[18] != YUVORDER_YUYV && header[18] != YUVORDER_UYVY)
@@ -100,7 +100,7 @@
     }
 
     // Get buffer filled with previous frame
-    if ((ret = ff_reget_buffer(avctx, frame)) < 0)
+    if ((ret = ff_reget_buffer(avctx, frame, 0)) < 0)
         return ret;
 
 
diff --git a/libavcodec/cscd.c b/libavcodec/cscd.c
index 8781df1..d50ddd6 100644
--- a/libavcodec/cscd.c
+++ b/libavcodec/cscd.c
@@ -77,7 +77,7 @@
         return AVERROR_INVALIDDATA;
     }
 
-    if ((ret = ff_reget_buffer(avctx, c->pic)) < 0)
+    if ((ret = ff_reget_buffer(avctx, c->pic, 0)) < 0)
         return ret;
 
     // decompress data
diff --git a/libavcodec/cuviddec.c b/libavcodec/cuviddec.c
index f21273c..50dc895 100644
--- a/libavcodec/cuviddec.c
+++ b/libavcodec/cuviddec.c
@@ -25,6 +25,7 @@
 #include "libavutil/mathematics.h"
 #include "libavutil/hwcontext.h"
 #include "libavutil/hwcontext_cuda_internal.h"
+#include "libavutil/cuda_check.h"
 #include "libavutil/fifo.h"
 #include "libavutil/log.h"
 #include "libavutil/opt.h"
@@ -33,8 +34,14 @@
 #include "avcodec.h"
 #include "decode.h"
 #include "hwaccel.h"
+#include "nvdec.h"
 #include "internal.h"
 
+#if !NVDECAPI_CHECK_VERSION(9, 0)
+#define cudaVideoSurfaceFormat_YUV444 2
+#define cudaVideoSurfaceFormat_YUV444_16Bit 3
+#endif
+
 typedef struct CuvidContext
 {
     AVClass *avclass;
@@ -63,13 +70,12 @@
     AVBufferRef *hwdevice;
     AVBufferRef *hwframe;
 
-    AVBSFContext *bsf;
-
     AVFifoBuffer *frame_queue;
 
     int deint_mode;
     int deint_mode_current;
     int64_t prev_pts;
+    int progressive_sequence;
 
     int internal_error;
     int decoder_flushing;
@@ -95,29 +101,7 @@
     int is_deinterlacing;
 } CuvidParsedFrame;
 
-static int check_cu(AVCodecContext *avctx, CUresult err, const char *func)
-{
-    CuvidContext *ctx = avctx->priv_data;
-    const char *err_name;
-    const char *err_string;
-
-    av_log(avctx, AV_LOG_TRACE, "Calling %s\n", func);
-
-    if (err == CUDA_SUCCESS)
-        return 0;
-
-    ctx->cudl->cuGetErrorName(err, &err_name);
-    ctx->cudl->cuGetErrorString(err, &err_string);
-
-    av_log(avctx, AV_LOG_ERROR, "%s failed", func);
-    if (err_name && err_string)
-        av_log(avctx, AV_LOG_ERROR, " -> %s: %s", err_name, err_string);
-    av_log(avctx, AV_LOG_ERROR, "\n");
-
-    return AVERROR_EXTERNAL;
-}
-
-#define CHECK_CU(x) check_cu(avctx, (x), #x)
+#define CHECK_CU(x) FF_CUDA_CHECK_DL(avctx, ctx->cudl, x)
 
 static int CUDAAPI cuvid_handle_video_sequence(void *opaque, CUVIDEOFORMAT* format)
 {
@@ -127,6 +111,7 @@
     CUVIDDECODECAPS *caps = NULL;
     CUVIDDECODECREATEINFO cuinfo;
     int surface_fmt;
+    int chroma_444;
 
     int old_width = avctx->width;
     int old_height = avctx->height;
@@ -169,17 +154,19 @@
     cuinfo.target_rect.right = cuinfo.ulTargetWidth;
     cuinfo.target_rect.bottom = cuinfo.ulTargetHeight;
 
+    chroma_444 = format->chroma_format == cudaVideoChromaFormat_444;
+
     switch (format->bit_depth_luma_minus8) {
     case 0: // 8-bit
-        pix_fmts[1] = AV_PIX_FMT_NV12;
+        pix_fmts[1] = chroma_444 ? AV_PIX_FMT_YUV444P : AV_PIX_FMT_NV12;
         caps = &ctx->caps8;
         break;
     case 2: // 10-bit
-        pix_fmts[1] = AV_PIX_FMT_P010;
+        pix_fmts[1] = chroma_444 ? AV_PIX_FMT_YUV444P16 : AV_PIX_FMT_P010;
         caps = &ctx->caps10;
         break;
     case 4: // 12-bit
-        pix_fmts[1] = AV_PIX_FMT_P016;
+        pix_fmts[1] = chroma_444 ? AV_PIX_FMT_YUV444P16 : AV_PIX_FMT_P016;
         caps = &ctx->caps12;
         break;
     default:
@@ -228,6 +215,8 @@
                               ? cudaVideoDeinterlaceMode_Weave
                               : ctx->deint_mode;
 
+    ctx->progressive_sequence = format->progressive_sequence;
+
     if (!format->progressive_sequence && ctx->deint_mode_current == cudaVideoDeinterlaceMode_Weave)
         avctx->flags |= AV_CODEC_FLAG_INTERLACED_DCT;
     else
@@ -282,12 +271,6 @@
         return 0;
     }
 
-    if (format->chroma_format != cudaVideoChromaFormat_420) {
-        av_log(avctx, AV_LOG_ERROR, "Chroma formats other than 420 are not supported\n");
-        ctx->internal_error = AVERROR(EINVAL);
-        return 0;
-    }
-
     ctx->chroma_format = format->chroma_format;
 
     cuinfo.CodecType = ctx->codec_type = format->codec;
@@ -301,8 +284,15 @@
     case AV_PIX_FMT_P016:
         cuinfo.OutputFormat = cudaVideoSurfaceFormat_P016;
         break;
+    case AV_PIX_FMT_YUV444P:
+        cuinfo.OutputFormat = cudaVideoSurfaceFormat_YUV444;
+        break;
+    case AV_PIX_FMT_YUV444P16:
+        cuinfo.OutputFormat = cudaVideoSurfaceFormat_YUV444_16Bit;
+        break;
     default:
-        av_log(avctx, AV_LOG_ERROR, "Output formats other than NV12, P010 or P016 are not supported\n");
+        av_log(avctx, AV_LOG_ERROR, "Unsupported output format: %s\n",
+               av_get_pix_fmt_name(avctx->sw_pix_fmt));
         ctx->internal_error = AVERROR(EINVAL);
         return 0;
     }
@@ -360,6 +350,9 @@
     parsed_frame.dispinfo = *dispinfo;
     ctx->internal_error = 0;
 
+    // For some reason, dispinfo->progressive_frame is sometimes wrong.
+    parsed_frame.dispinfo.progressive_frame = ctx->progressive_sequence;
+
     if (ctx->deint_mode_current == cudaVideoDeinterlaceMode_Weave) {
         av_fifo_generic_write(ctx->frame_queue, &parsed_frame, sizeof(CuvidParsedFrame), NULL);
     } else {
@@ -392,8 +385,6 @@
     AVCUDADeviceContext *device_hwctx = device_ctx->hwctx;
     CUcontext dummy, cuda_ctx = device_hwctx->cuda_ctx;
     CUVIDSOURCEDATAPACKET cupkt;
-    AVPacket filter_packet = { 0 };
-    AVPacket filtered_packet = { 0 };
     int ret = 0, eret = 0, is_flush = ctx->decoder_flushing;
 
     av_log(avctx, AV_LOG_TRACE, "cuvid_decode_packet\n");
@@ -404,29 +395,8 @@
     if (cuvid_is_buffer_full(avctx) && avpkt && avpkt->size)
         return AVERROR(EAGAIN);
 
-    if (ctx->bsf && avpkt && avpkt->size) {
-        if ((ret = av_packet_ref(&filter_packet, avpkt)) < 0) {
-            av_log(avctx, AV_LOG_ERROR, "av_packet_ref failed\n");
-            return ret;
-        }
-
-        if ((ret = av_bsf_send_packet(ctx->bsf, &filter_packet)) < 0) {
-            av_log(avctx, AV_LOG_ERROR, "av_bsf_send_packet failed\n");
-            av_packet_unref(&filter_packet);
-            return ret;
-        }
-
-        if ((ret = av_bsf_receive_packet(ctx->bsf, &filtered_packet)) < 0) {
-            av_log(avctx, AV_LOG_ERROR, "av_bsf_receive_packet failed\n");
-            return ret;
-        }
-
-        avpkt = &filtered_packet;
-    }
-
     ret = CHECK_CU(ctx->cudl->cuCtxPushCurrent(cuda_ctx));
     if (ret < 0) {
-        av_packet_unref(&filtered_packet);
         return ret;
     }
 
@@ -450,8 +420,6 @@
 
     ret = CHECK_CU(ctx->cvdl->cuvidParseVideoData(ctx->cuparser, &cupkt));
 
-    av_packet_unref(&filtered_packet);
-
     if (ret < 0)
         goto error;
 
@@ -511,6 +479,7 @@
         return ret;
 
     if (av_fifo_size(ctx->frame_queue)) {
+        const AVPixFmtDescriptor *pixdesc;
         CuvidParsedFrame parsed_frame;
         CUVIDPROCPARAMS params;
         unsigned int pitch = 0;
@@ -541,7 +510,10 @@
                 goto error;
             }
 
-            for (i = 0; i < 2; i++) {
+            pixdesc = av_pix_fmt_desc_get(avctx->sw_pix_fmt);
+
+            for (i = 0; i < pixdesc->nb_components; i++) {
+                int height = avctx->height >> (i ? pixdesc->log2_chroma_h : 0);
                 CUDA_MEMCPY2D cpy = {
                     .srcMemoryType = CU_MEMORYTYPE_DEVICE,
                     .dstMemoryType = CU_MEMORYTYPE_DEVICE,
@@ -551,22 +523,21 @@
                     .dstPitch      = frame->linesize[i],
                     .srcY          = offset,
                     .WidthInBytes  = FFMIN(pitch, frame->linesize[i]),
-                    .Height        = avctx->height >> (i ? 1 : 0),
+                    .Height        = height,
                 };
 
                 ret = CHECK_CU(ctx->cudl->cuMemcpy2DAsync(&cpy, device_hwctx->stream));
                 if (ret < 0)
                     goto error;
 
-                offset += avctx->height;
+                offset += height;
             }
-
-            ret = CHECK_CU(ctx->cudl->cuStreamSynchronize(device_hwctx->stream));
-            if (ret < 0)
-                goto error;
-        } else if (avctx->pix_fmt == AV_PIX_FMT_NV12 ||
-                   avctx->pix_fmt == AV_PIX_FMT_P010 ||
-                   avctx->pix_fmt == AV_PIX_FMT_P016) {
+        } else if (avctx->pix_fmt == AV_PIX_FMT_NV12      ||
+                   avctx->pix_fmt == AV_PIX_FMT_P010      ||
+                   avctx->pix_fmt == AV_PIX_FMT_P016      ||
+                   avctx->pix_fmt == AV_PIX_FMT_YUV444P   ||
+                   avctx->pix_fmt == AV_PIX_FMT_YUV444P16) {
+            unsigned int offset = 0;
             AVFrame *tmp_frame = av_frame_alloc();
             if (!tmp_frame) {
                 av_log(avctx, AV_LOG_ERROR, "av_frame_alloc failed\n");
@@ -574,15 +545,24 @@
                 goto error;
             }
 
+            pixdesc = av_pix_fmt_desc_get(avctx->sw_pix_fmt);
+
             tmp_frame->format        = AV_PIX_FMT_CUDA;
             tmp_frame->hw_frames_ctx = av_buffer_ref(ctx->hwframe);
-            tmp_frame->data[0]       = (uint8_t*)mapped_frame;
-            tmp_frame->linesize[0]   = pitch;
-            tmp_frame->data[1]       = (uint8_t*)(mapped_frame + avctx->height * pitch);
-            tmp_frame->linesize[1]   = pitch;
             tmp_frame->width         = avctx->width;
             tmp_frame->height        = avctx->height;
 
+            /*
+             * Note that the following logic would not work for three plane
+             * YUV420 because the pitch value is different for the chroma
+             * planes.
+             */
+            for (i = 0; i < pixdesc->nb_components; i++) {
+                tmp_frame->data[i]     = (uint8_t*)mapped_frame + offset;
+                tmp_frame->linesize[i] = pitch;
+                offset += pitch * (avctx->height >> (i ? pixdesc->log2_chroma_h : 0));
+            }
+
             ret = ff_get_buffer(avctx, frame, 0);
             if (ret < 0) {
                 av_log(avctx, AV_LOG_ERROR, "ff_get_buffer failed\n");
@@ -692,9 +672,6 @@
 
     av_fifo_freep(&ctx->frame_queue);
 
-    if (ctx->bsf)
-        av_bsf_free(&ctx->bsf);
-
     if (ctx->cuparser)
         ctx->cvdl->cuvidDestroyVideoParser(ctx->cuparser);
 
@@ -798,6 +775,12 @@
         return AVERROR(EINVAL);
     }
 
+    if ((probed_width * probed_height) / 256 > caps->nMaxMBCount) {
+        av_log(avctx, AV_LOG_ERROR, "Video macroblock count %d exceeds maximum of %d\n",
+               (int)(probed_width * probed_height) / 256, caps->nMaxMBCount);
+        return AVERROR(EINVAL);
+    }
+
     return 0;
 }
 
@@ -810,7 +793,6 @@
     CUVIDSOURCEDATAPACKET seq_pkt;
     CUcontext cuda_ctx = NULL;
     CUcontext dummy;
-    const AVBitStreamFilter *bsf;
     int ret = 0;
 
     enum AVPixelFormat pix_fmts[3] = { AV_PIX_FMT_CUDA,
@@ -963,28 +945,12 @@
         return AVERROR_BUG;
     }
 
-    if (avctx->codec->id == AV_CODEC_ID_H264 || avctx->codec->id == AV_CODEC_ID_HEVC) {
-        if (avctx->codec->id == AV_CODEC_ID_H264)
-            bsf = av_bsf_get_by_name("h264_mp4toannexb");
-        else
-            bsf = av_bsf_get_by_name("hevc_mp4toannexb");
-
-        if (!bsf) {
-            ret = AVERROR_BSF_NOT_FOUND;
-            goto error;
-        }
-        if (ret = av_bsf_alloc(bsf, &ctx->bsf)) {
-            goto error;
-        }
-        if (((ret = avcodec_parameters_from_context(ctx->bsf->par_in, avctx)) < 0) || ((ret = av_bsf_init(ctx->bsf)) < 0)) {
-            av_bsf_free(&ctx->bsf);
-            goto error;
-        }
-
-        ctx->cuparse_ext.format.seqhdr_data_length = ctx->bsf->par_out->extradata_size;
+    if (avctx->codec->bsfs) {
+        const AVCodecParameters *par = avctx->internal->filter.bsfs[avctx->internal->filter.nb_bsfs - 1]->par_out;
+        ctx->cuparse_ext.format.seqhdr_data_length = par->extradata_size;
         memcpy(ctx->cuparse_ext.raw_seqhdr_data,
-               ctx->bsf->par_out->extradata,
-               FFMIN(sizeof(ctx->cuparse_ext.raw_seqhdr_data), ctx->bsf->par_out->extradata_size));
+               par->extradata,
+               FFMIN(sizeof(ctx->cuparse_ext.raw_seqhdr_data), par->extradata_size));
     } else if (avctx->extradata_size > 0) {
         ctx->cuparse_ext.format.seqhdr_data_length = avctx->extradata_size;
         memcpy(ctx->cuparse_ext.raw_seqhdr_data,
@@ -1129,7 +1095,7 @@
     NULL
 };
 
-#define DEFINE_CUVID_CODEC(x, X) \
+#define DEFINE_CUVID_CODEC(x, X, bsf_name) \
     static const AVClass x##_cuvid_class = { \
         .class_name = #x "_cuvid", \
         .item_name = av_default_item_name, \
@@ -1148,6 +1114,7 @@
         .decode         = cuvid_decode_frame, \
         .receive_frame  = cuvid_output_frame, \
         .flush          = cuvid_flush, \
+        .bsfs           = bsf_name, \
         .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AVOID_PROBING | AV_CODEC_CAP_HARDWARE, \
         .pix_fmts       = (const enum AVPixelFormat[]){ AV_PIX_FMT_CUDA, \
                                                         AV_PIX_FMT_NV12, \
@@ -1159,37 +1126,37 @@
     };
 
 #if CONFIG_HEVC_CUVID_DECODER
-DEFINE_CUVID_CODEC(hevc, HEVC)
+DEFINE_CUVID_CODEC(hevc, HEVC, "hevc_mp4toannexb")
 #endif
 
 #if CONFIG_H264_CUVID_DECODER
-DEFINE_CUVID_CODEC(h264, H264)
+DEFINE_CUVID_CODEC(h264, H264, "h264_mp4toannexb")
 #endif
 
 #if CONFIG_MJPEG_CUVID_DECODER
-DEFINE_CUVID_CODEC(mjpeg, MJPEG)
+DEFINE_CUVID_CODEC(mjpeg, MJPEG, NULL)
 #endif
 
 #if CONFIG_MPEG1_CUVID_DECODER
-DEFINE_CUVID_CODEC(mpeg1, MPEG1VIDEO)
+DEFINE_CUVID_CODEC(mpeg1, MPEG1VIDEO, NULL)
 #endif
 
 #if CONFIG_MPEG2_CUVID_DECODER
-DEFINE_CUVID_CODEC(mpeg2, MPEG2VIDEO)
+DEFINE_CUVID_CODEC(mpeg2, MPEG2VIDEO, NULL)
 #endif
 
 #if CONFIG_MPEG4_CUVID_DECODER
-DEFINE_CUVID_CODEC(mpeg4, MPEG4)
+DEFINE_CUVID_CODEC(mpeg4, MPEG4, NULL)
 #endif
 
 #if CONFIG_VP8_CUVID_DECODER
-DEFINE_CUVID_CODEC(vp8, VP8)
+DEFINE_CUVID_CODEC(vp8, VP8, NULL)
 #endif
 
 #if CONFIG_VP9_CUVID_DECODER
-DEFINE_CUVID_CODEC(vp9, VP9)
+DEFINE_CUVID_CODEC(vp9, VP9, NULL)
 #endif
 
 #if CONFIG_VC1_CUVID_DECODER
-DEFINE_CUVID_CODEC(vc1, VC1)
+DEFINE_CUVID_CODEC(vc1, VC1, NULL)
 #endif
diff --git a/libavcodec/dca_core_bsf.c b/libavcodec/dca_core_bsf.c
index 8565796..f0c5039 100644
--- a/libavcodec/dca_core_bsf.c
+++ b/libavcodec/dca_core_bsf.c
@@ -22,7 +22,6 @@
 #include "bsf.h"
 #include "bytestream.h"
 #include "dca_syncwords.h"
-#include "libavutil/mem.h"
 
 static int dca_core_filter(AVBSFContext *ctx, AVPacket *pkt)
 {
diff --git a/libavcodec/dca_lbr.c b/libavcodec/dca_lbr.c
index 3b50a99..747fdaf 100644
--- a/libavcodec/dca_lbr.c
+++ b/libavcodec/dca_lbr.c
@@ -154,7 +154,7 @@
     step_i = get_bits(&s->gb, 8);
     if (step_i > step_max) {
         av_log(s->avctx, AV_LOG_ERROR, "Invalid LFE step size index\n");
-        return -1;
+        return AVERROR_INVALIDDATA;
     }
 
     step = ff_dca_lfe_step_size_24[step_i];
@@ -208,7 +208,7 @@
     step_i = get_bits(&s->gb, 8);
     if (step_i > step_max) {
         av_log(s->avctx, AV_LOG_ERROR, "Invalid LFE step size index\n");
-        return -1;
+        return AVERROR_INVALIDDATA;
     }
 
     step = ff_dca_lfe_step_size_16[step_i];
@@ -246,14 +246,17 @@
 
 static int parse_lfe_chunk(DCALbrDecoder *s, LBRChunk *chunk)
 {
+    int ret;
+
     if (!(s->flags & LBR_FLAG_LFE_PRESENT))
         return 0;
 
     if (!chunk->len)
         return 0;
 
-    if (init_get_bits8(&s->gb, chunk->data, chunk->len) < 0)
-        return -1;
+    ret = init_get_bits8(&s->gb, chunk->data, chunk->len);
+    if (ret < 0)
+        return ret;
 
     // Determine bit depth from chunk size
     if (chunk->len >= 52)
@@ -262,7 +265,7 @@
         return parse_lfe_16(s);
 
     av_log(s->avctx, AV_LOG_ERROR, "LFE chunk too short\n");
-    return -1;
+    return AVERROR_INVALIDDATA;
 }
 
 static inline int parse_vlc(GetBitContext *s, VLC *vlc, int max_depth)
@@ -291,13 +294,13 @@
         for (freq = 1;; freq++) {
             if (get_bits_left(&s->gb) < 1) {
                 av_log(s->avctx, AV_LOG_ERROR, "Tonal group chunk too short\n");
-                return -1;
+                return AVERROR_INVALIDDATA;
             }
 
             diff = parse_vlc(&s->gb, &ff_dca_vlc_tnl_grp[group], 2);
             if (diff >= FF_ARRAY_ELEMS(ff_dca_fst_amp)) {
                 av_log(s->avctx, AV_LOG_ERROR, "Invalid tonal frequency diff\n");
-                return -1;
+                return AVERROR_INVALIDDATA;
             }
 
             diff = get_bitsz(&s->gb, diff >> 2) + ff_dca_fst_amp[diff];
@@ -307,7 +310,7 @@
             freq += diff - 2;
             if (freq >> (5 - group) > s->nsubbands * 4 - 6) {
                 av_log(s->avctx, AV_LOG_ERROR, "Invalid spectral line offset\n");
-                return -1;
+                return AVERROR_INVALIDDATA;
             }
 
             // Main channel
@@ -358,19 +361,21 @@
 
 static int parse_tonal_chunk(DCALbrDecoder *s, LBRChunk *chunk)
 {
-    int sb, group;
+    int sb, group, ret;
 
     if (!chunk->len)
         return 0;
 
-    if (init_get_bits8(&s->gb, chunk->data, chunk->len) < 0)
-        return -1;
+    ret = init_get_bits8(&s->gb, chunk->data, chunk->len);
+
+    if (ret < 0)
+        return ret;
 
     // Scale factors
     if (chunk->id == LBR_CHUNK_SCF || chunk->id == LBR_CHUNK_TONAL_SCF) {
         if (get_bits_left(&s->gb) < 36) {
             av_log(s->avctx, AV_LOG_ERROR, "Tonal scale factor chunk too short\n");
-            return -1;
+            return AVERROR_INVALIDDATA;
         }
         for (sb = 0; sb < 6; sb++)
             s->tonal_scf[sb] = get_bits(&s->gb, 6);
@@ -378,20 +383,25 @@
 
     // Tonal groups
     if (chunk->id == LBR_CHUNK_TONAL || chunk->id == LBR_CHUNK_TONAL_SCF)
-        for (group = 0; group < 5; group++)
-            if (parse_tonal(s, group) < 0)
-                return -1;
+        for (group = 0; group < 5; group++) {
+            ret = parse_tonal(s, group);
+            if (ret < 0)
+                return ret;
+        }
 
     return 0;
 }
 
 static int parse_tonal_group(DCALbrDecoder *s, LBRChunk *chunk)
 {
+    int ret;
+
     if (!chunk->len)
         return 0;
 
-    if (init_get_bits8(&s->gb, chunk->data, chunk->len) < 0)
-        return -1;
+    ret = init_get_bits8(&s->gb, chunk->data, chunk->len);
+    if (ret < 0)
+        return ret;
 
     return parse_tonal(s, chunk->id);
 }
@@ -404,7 +414,7 @@
 {
     int left = get_bits_left(s);
     if (left < 0)
-        return -1;
+        return AVERROR_INVALIDDATA;
     if (left < n) {
         skip_bits_long(s, left);
         return 1;
@@ -433,7 +443,7 @@
         dist = parse_vlc(&s->gb, &ff_dca_vlc_rsd_apprx, 1) + 1;
         if (dist > 7 - sf) {
             av_log(s->avctx, AV_LOG_ERROR, "Invalid scale factor distance\n");
-            return -1;
+            return AVERROR_INVALIDDATA;
         }
 
         if (ensure_bits(&s->gb, 20))
@@ -498,22 +508,26 @@
 
 static int parse_grid_1_chunk(DCALbrDecoder *s, LBRChunk *chunk, int ch1, int ch2)
 {
-    int ch, sb, sf, nsubbands;
+    int ch, sb, sf, nsubbands, ret;
 
     if (!chunk->len)
         return 0;
 
-    if (init_get_bits8(&s->gb, chunk->data, chunk->len) < 0)
-        return -1;
+    ret = init_get_bits8(&s->gb, chunk->data, chunk->len);
+    if (ret < 0)
+        return ret;
 
     // Scale factors
     nsubbands = ff_dca_scf_to_grid_1[s->nsubbands - 1] + 1;
     for (sb = 2; sb < nsubbands; sb++) {
-        if (parse_scale_factors(s, s->grid_1_scf[ch1][sb]) < 0)
-            return -1;
-        if (ch1 != ch2 && ff_dca_grid_1_to_scf[sb] < s->min_mono_subband
-            && parse_scale_factors(s, s->grid_1_scf[ch2][sb]) < 0)
-            return -1;
+        ret = parse_scale_factors(s, s->grid_1_scf[ch1][sb]);
+        if (ret < 0)
+            return ret;
+        if (ch1 != ch2 && ff_dca_grid_1_to_scf[sb] < s->min_mono_subband) {
+            ret = parse_scale_factors(s, s->grid_1_scf[ch2][sb]);
+            if (ret < 0)
+                return ret;
+        }
     }
 
     if (get_bits_left(&s->gb) < 1)
@@ -532,7 +546,7 @@
 
     if (get_bits_left(&s->gb) < 0) {
         av_log(s->avctx, AV_LOG_ERROR, "First grid chunk too short\n");
-        return -1;
+        return AVERROR_INVALIDDATA;
     }
 
     // Stereo image for partial mono mode
@@ -562,14 +576,16 @@
 
 static int parse_grid_1_sec_ch(DCALbrDecoder *s, int ch2)
 {
-    int sb, nsubbands;
+    int sb, nsubbands, ret;
 
     // Scale factors
     nsubbands = ff_dca_scf_to_grid_1[s->nsubbands - 1] + 1;
     for (sb = 2; sb < nsubbands; sb++) {
-        if (ff_dca_grid_1_to_scf[sb] >= s->min_mono_subband
-            && parse_scale_factors(s, s->grid_1_scf[ch2][sb]) < 0)
-            return -1;
+        if (ff_dca_grid_1_to_scf[sb] >= s->min_mono_subband) {
+            ret = parse_scale_factors(s, s->grid_1_scf[ch2][sb]);
+            if (ret < 0)
+                return ret;
+        }
     }
 
     // Average values for third grid
@@ -709,7 +725,7 @@
             s->sb_indices[sb] = sb_reorder;
         }
         if (sb_reorder >= s->nsubbands)
-            return -1;
+            return AVERROR_INVALIDDATA;
 
         // Third grid scale factors
         if (sb == 12) {
@@ -731,7 +747,7 @@
 
         quant_level = s->quant_levels[ch1 / 2][sb];
         if (!quant_level)
-            return -1;
+            return AVERROR_INVALIDDATA;
 
         // Time samples for one or both channels
         if (sb < s->max_mono_subband && sb_reorder >= s->min_mono_subband) {
@@ -792,13 +808,14 @@
 static int parse_high_res_grid(DCALbrDecoder *s, LBRChunk *chunk, int ch1, int ch2)
 {
     int quant_levels[DCA_LBR_SUBBANDS];
-    int sb, ch, ol, st, max_sb, profile;
+    int sb, ch, ol, st, max_sb, profile, ret;
 
     if (!chunk->len)
         return 0;
 
-    if (init_get_bits8(&s->gb, chunk->data, chunk->len) < 0)
-        return -1;
+    ret = init_get_bits8(&s->gb, chunk->data, chunk->len);
+    if (ret < 0)
+        return ret;
 
     // Quantizer profile
     profile = get_bits(&s->gb, 8);
@@ -832,18 +849,20 @@
         s->quant_levels[ch1 / 2][sb] = quant_levels[sb];
 
     // LPC for the first two subbands
-    if (parse_lpc(s, ch1, ch2, 0, 2) < 0)
-        return -1;
+    ret = parse_lpc(s, ch1, ch2, 0, 2);
+    if (ret < 0)
+        return ret;
 
     // Time-samples for the first two subbands of main channel
-    if (parse_ts(s, ch1, ch2, 0, 2, 0) < 0)
-        return -1;
+    ret = parse_ts(s, ch1, ch2, 0, 2, 0);
+    if (ret < 0)
+        return ret;
 
     // First two bands of the first grid
     for (sb = 0; sb < 2; sb++)
         for (ch = ch1; ch <= ch2; ch++)
-            if (parse_scale_factors(s, s->grid_1_scf[ch][sb]) < 0)
-                return -1;
+            if ((ret = parse_scale_factors(s, s->grid_1_scf[ch][sb])) < 0)
+                return ret;
 
     return 0;
 }
@@ -892,39 +911,42 @@
 
 static int parse_ts1_chunk(DCALbrDecoder *s, LBRChunk *chunk, int ch1, int ch2)
 {
+    int ret;
     if (!chunk->len)
         return 0;
-    if (init_get_bits8(&s->gb, chunk->data, chunk->len) < 0)
-        return -1;
-    if (parse_lpc(s, ch1, ch2, 2, 3) < 0)
-        return -1;
-    if (parse_ts(s, ch1, ch2, 2, 4, 0) < 0)
-        return -1;
-    if (parse_grid_2(s, ch1, ch2, 0, 1, 0) < 0)
-        return -1;
-    if (parse_ts(s, ch1, ch2, 4, 6, 0) < 0)
-        return -1;
+    if ((ret = init_get_bits8(&s->gb, chunk->data, chunk->len)) < 0)
+        return ret;
+    if ((ret = parse_lpc(s, ch1, ch2, 2, 3)) < 0)
+        return ret;
+    if ((ret = parse_ts(s, ch1, ch2, 2, 4, 0)) < 0)
+        return ret;
+    if ((ret = parse_grid_2(s, ch1, ch2, 0, 1, 0)) < 0)
+        return ret;
+    if ((ret = parse_ts(s, ch1, ch2, 4, 6, 0)) < 0)
+        return ret;
     return 0;
 }
 
 static int parse_ts2_chunk(DCALbrDecoder *s, LBRChunk *chunk, int ch1, int ch2)
 {
+    int ret;
+
     if (!chunk->len)
         return 0;
-    if (init_get_bits8(&s->gb, chunk->data, chunk->len) < 0)
-        return -1;
-    if (parse_grid_2(s, ch1, ch2, 1, 3, 0) < 0)
-        return -1;
-    if (parse_ts(s, ch1, ch2, 6, s->max_mono_subband, 0) < 0)
-        return -1;
+    if ((ret = init_get_bits8(&s->gb, chunk->data, chunk->len)) < 0)
+        return ret;
+    if ((ret = parse_grid_2(s, ch1, ch2, 1, 3, 0)) < 0)
+        return ret;
+    if ((ret = parse_ts(s, ch1, ch2, 6, s->max_mono_subband, 0)) < 0)
+        return ret;
     if (ch1 != ch2) {
-        if (parse_grid_1_sec_ch(s, ch2) < 0)
-            return -1;
-        if (parse_grid_2(s, ch1, ch2, 0, 3, 1) < 0)
-            return -1;
+        if ((ret = parse_grid_1_sec_ch(s, ch2)) < 0)
+            return ret;
+        if ((ret = parse_grid_2(s, ch1, ch2, 0, 3, 1)) < 0)
+            return ret;
     }
-    if (parse_ts(s, ch1, ch2, s->min_mono_subband, s->nsubbands, 1) < 0)
-        return -1;
+    if ((ret = parse_ts(s, ch1, ch2, s->min_mono_subband, s->nsubbands, 1)) < 0)
+        return ret;
     return 0;
 }
 
@@ -932,11 +954,13 @@
 {
     double scale = (-1.0 / (1 << 17)) * sqrt(1 << (2 - s->limited_range));
     int i, br_per_ch = s->bit_rate_scaled / s->nchannels_total;
+    int ret;
 
     ff_mdct_end(&s->imdct);
 
-    if (ff_mdct_init(&s->imdct, s->freq_range + 6, 1, scale) < 0)
-        return -1;
+    ret = ff_mdct_init(&s->imdct, s->freq_range + 6, 1, scale);
+    if (ret < 0)
+        return ret;
 
     for (i = 0; i < 32 << s->freq_range; i++)
         s->window[i] = ff_dca_long_window[i << (2 - s->freq_range)];
@@ -975,7 +999,7 @@
     // Reallocate time sample buffer
     av_fast_mallocz(&s->ts_buffer, &s->ts_size, nsamples * sizeof(float));
     if (!s->ts_buffer)
-        return -1;
+        return AVERROR(ENOMEM);
 
     ptr = s->ts_buffer + DCA_LBR_TIME_HISTORY;
     for (ch = 0; ch < s->nchannels; ch++) {
@@ -1796,7 +1820,7 @@
     init_tables();
 
     if (!(s->fdsp = avpriv_float_dsp_alloc(0)))
-        return -1;
+        return AVERROR(ENOMEM);
 
     s->lbr_rand = 1;
     return 0;
diff --git a/libavcodec/dcaenc.c b/libavcodec/dcaenc.c
index 4b4ceef..34b3e94 100644
--- a/libavcodec/dcaenc.c
+++ b/libavcodec/dcaenc.c
@@ -136,7 +136,7 @@
                                (SUBBAND_SAMPLES + DCA_ADPCM_COEFFS),
                                sizeof(int32_t));
     if (!bufer)
-        return -1;
+        return AVERROR(ENOMEM);
 
     /* we need a place for DCA_ADPCM_COEFF samples from previous frame
      * to calc prediction coefficients for each subband */
@@ -166,8 +166,8 @@
     int i, j, k, min_frame_bits;
     int ret;
 
-    if (subband_bufer_alloc(c))
-        return AVERROR(ENOMEM);
+    if ((ret = subband_bufer_alloc(c)) < 0)
+        return ret;
 
     c->fullband_channels = c->channels = avctx->channels;
     c->lfe_channel = (avctx->channels == 3 || avctx->channels == 6);
diff --git a/libavcodec/dct.c b/libavcodec/dct.c
index cca51ee..52f082d 100644
--- a/libavcodec/dct.c
+++ b/libavcodec/dct.c
@@ -178,6 +178,7 @@
 {
     int n = 1 << nbits;
     int i;
+    int ret;
 
     memset(s, 0, sizeof(*s));
 
@@ -194,9 +195,9 @@
         if (!s->csc2)
             return AVERROR(ENOMEM);
 
-        if (ff_rdft_init(&s->rdft, nbits, inverse == DCT_III) < 0) {
+        if ((ret = ff_rdft_init(&s->rdft, nbits, inverse == DCT_III)) < 0) {
             av_freep(&s->csc2);
-            return -1;
+            return ret;
         }
 
         for (i = 0; i < n / 2; i++)
diff --git a/libavcodec/dds.c b/libavcodec/dds.c
index f026f9c..9154f69 100644
--- a/libavcodec/dds.c
+++ b/libavcodec/dds.c
@@ -613,6 +613,7 @@
     AVFrame *frame = data;
     int mipmap;
     int ret;
+    int width, height;
 
     ff_texturedsp_init(&ctx->texdsp);
     bytestream2_init(gbc, avpkt->data, avpkt->size);
@@ -631,9 +632,9 @@
 
     bytestream2_skip(gbc, 4); // flags
 
-    avctx->height = bytestream2_get_le32(gbc);
-    avctx->width  = bytestream2_get_le32(gbc);
-    ret = av_image_check_size(avctx->width, avctx->height, 0, avctx);
+    height = bytestream2_get_le32(gbc);
+    width  = bytestream2_get_le32(gbc);
+    ret = ff_set_dimensions(avctx, width, height);
     if (ret < 0) {
         av_log(avctx, AV_LOG_ERROR, "Invalid image size %dx%d.\n",
                avctx->width, avctx->height);
diff --git a/libavcodec/decode.c b/libavcodec/decode.c
index 4607e9f..d4bdb9b 100644
--- a/libavcodec/decode.c
+++ b/libavcodec/decode.c
@@ -45,6 +45,25 @@
 #include "internal.h"
 #include "thread.h"
 
+typedef struct FramePool {
+    /**
+     * Pools for each data plane. For audio all the planes have the same size,
+     * so only pools[0] is used.
+     */
+    AVBufferPool *pools[4];
+
+    /*
+     * Pool parameters
+     */
+    int format;
+    int width, height;
+    int stride_align[AV_NUM_DATA_POINTERS];
+    int linesize[4];
+    int planes;
+    int channels;
+    int samples;
+} FramePool;
+
 static int apply_param_change(AVCodecContext *avctx, const AVPacket *avpkt)
 {
     int size = 0, ret;
@@ -227,13 +246,13 @@
             goto fail;
         }
         s->bsfs = tmp;
-        s->nb_bsfs++;
 
-        ret = av_bsf_alloc(filter, &s->bsfs[s->nb_bsfs - 1]);
+        ret = av_bsf_alloc(filter, &s->bsfs[s->nb_bsfs]);
         if (ret < 0) {
             av_freep(&bsf);
             goto fail;
         }
+        s->nb_bsfs++;
 
         if (s->nb_bsfs == 1) {
             /* We do not currently have an API for passing the input timebase into decoders,
@@ -281,10 +300,6 @@
             bsfs_str++;
     }
 
-    ret = avcodec_parameters_to_context(avctx, s->bsfs[s->nb_bsfs - 1]->par_out);
-    if (ret < 0)
-        return ret;
-
     return 0;
 fail:
     ff_decode_bsfs_uninit(avctx);
@@ -304,7 +319,6 @@
         ret = av_bsf_receive_packet(s->bsfs[idx], pkt);
         if (ret == AVERROR(EAGAIN)) {
             /* no packets available, try the next filter up the chain */
-            ret = 0;
             idx--;
             continue;
         } else if (ret < 0 && ret != AVERROR_EOF) {
@@ -484,32 +498,32 @@
 
         side= av_packet_get_side_data(avci->last_pkt_props, AV_PKT_DATA_SKIP_SAMPLES, &side_size);
         if(side && side_size>=10) {
-            avctx->internal->skip_samples = AV_RL32(side) * avctx->internal->skip_samples_multiplier;
+            avci->skip_samples = AV_RL32(side) * avci->skip_samples_multiplier;
             discard_padding = AV_RL32(side + 4);
             av_log(avctx, AV_LOG_DEBUG, "skip %d / discard %d samples due to side data\n",
-                   avctx->internal->skip_samples, (int)discard_padding);
+                   avci->skip_samples, (int)discard_padding);
             skip_reason = AV_RL8(side + 8);
             discard_reason = AV_RL8(side + 9);
         }
 
         if ((frame->flags & AV_FRAME_FLAG_DISCARD) && got_frame &&
             !(avctx->flags2 & AV_CODEC_FLAG2_SKIP_MANUAL)) {
-            avctx->internal->skip_samples = FFMAX(0, avctx->internal->skip_samples - frame->nb_samples);
+            avci->skip_samples = FFMAX(0, avci->skip_samples - frame->nb_samples);
             got_frame = 0;
         }
 
-        if (avctx->internal->skip_samples > 0 && got_frame &&
+        if (avci->skip_samples > 0 && got_frame &&
             !(avctx->flags2 & AV_CODEC_FLAG2_SKIP_MANUAL)) {
-            if(frame->nb_samples <= avctx->internal->skip_samples){
+            if(frame->nb_samples <= avci->skip_samples){
                 got_frame = 0;
-                avctx->internal->skip_samples -= frame->nb_samples;
+                avci->skip_samples -= frame->nb_samples;
                 av_log(avctx, AV_LOG_DEBUG, "skip whole frame, skip left: %d\n",
-                       avctx->internal->skip_samples);
+                       avci->skip_samples);
             } else {
-                av_samples_copy(frame->extended_data, frame->extended_data, 0, avctx->internal->skip_samples,
-                                frame->nb_samples - avctx->internal->skip_samples, avctx->channels, frame->format);
+                av_samples_copy(frame->extended_data, frame->extended_data, 0, avci->skip_samples,
+                                frame->nb_samples - avci->skip_samples, avctx->channels, frame->format);
                 if(avctx->pkt_timebase.num && avctx->sample_rate) {
-                    int64_t diff_ts = av_rescale_q(avctx->internal->skip_samples,
+                    int64_t diff_ts = av_rescale_q(avci->skip_samples,
                                                    (AVRational){1, avctx->sample_rate},
                                                    avctx->pkt_timebase);
                     if(frame->pts!=AV_NOPTS_VALUE)
@@ -528,9 +542,9 @@
                     av_log(avctx, AV_LOG_WARNING, "Could not update timestamps for skipped samples.\n");
                 }
                 av_log(avctx, AV_LOG_DEBUG, "skip %d/%d samples\n",
-                       avctx->internal->skip_samples, frame->nb_samples);
-                frame->nb_samples -= avctx->internal->skip_samples;
-                avctx->internal->skip_samples = 0;
+                       avci->skip_samples, frame->nb_samples);
+                frame->nb_samples -= avci->skip_samples;
+                avci->skip_samples = 0;
             }
         }
 
@@ -556,11 +570,11 @@
         if ((avctx->flags2 & AV_CODEC_FLAG2_SKIP_MANUAL) && got_frame) {
             AVFrameSideData *fside = av_frame_new_side_data(frame, AV_FRAME_DATA_SKIP_SAMPLES, 10);
             if (fside) {
-                AV_WL32(fside->data, avctx->internal->skip_samples);
+                AV_WL32(fside->data, avci->skip_samples);
                 AV_WL32(fside->data + 4, discard_padding);
                 AV_WL8(fside->data + 8, skip_reason);
                 AV_WL8(fside->data + 9, discard_reason);
-                avctx->internal->skip_samples = 0;
+                avci->skip_samples = 0;
             }
         }
     }
@@ -585,7 +599,7 @@
 
     /* do not stop draining when actual_got_frame != 0 or ret < 0 */
     /* got_frame == 0 but actual_got_frame != 0 when frame is discarded */
-    if (avctx->internal->draining && !actual_got_frame) {
+    if (avci->draining && !actual_got_frame) {
         if (ret < 0) {
             /* prevent infinite loop if a decoder wrongly always return error on draining */
             /* reasonable nb_errors_max = maximum b frames + thread count */
@@ -744,7 +758,7 @@
 int attribute_align_arg avcodec_receive_frame(AVCodecContext *avctx, AVFrame *frame)
 {
     AVCodecInternal *avci = avctx->internal;
-    int ret;
+    int ret, changed;
 
     av_frame_unref(frame);
 
@@ -769,6 +783,51 @@
 
     avctx->frame_number++;
 
+    if (avctx->flags & AV_CODEC_FLAG_DROPCHANGED) {
+
+        if (avctx->frame_number == 1) {
+            avci->initial_format = frame->format;
+            switch(avctx->codec_type) {
+            case AVMEDIA_TYPE_VIDEO:
+                avci->initial_width  = frame->width;
+                avci->initial_height = frame->height;
+                break;
+            case AVMEDIA_TYPE_AUDIO:
+                avci->initial_sample_rate = frame->sample_rate ? frame->sample_rate :
+                                                                 avctx->sample_rate;
+                avci->initial_channels       = frame->channels;
+                avci->initial_channel_layout = frame->channel_layout;
+                break;
+            }
+        }
+
+        if (avctx->frame_number > 1) {
+            changed = avci->initial_format != frame->format;
+
+            switch(avctx->codec_type) {
+            case AVMEDIA_TYPE_VIDEO:
+                changed |= avci->initial_width  != frame->width ||
+                           avci->initial_height != frame->height;
+                break;
+            case AVMEDIA_TYPE_AUDIO:
+                changed |= avci->initial_sample_rate    != frame->sample_rate ||
+                           avci->initial_sample_rate    != avctx->sample_rate ||
+                           avci->initial_channels       != frame->channels ||
+                           avci->initial_channel_layout != frame->channel_layout;
+                break;
+            }
+
+            if (changed) {
+                avci->changed_frames_dropped++;
+                av_log(avctx, AV_LOG_INFO, "dropped changed frame #%d pts %"PRId64
+                                            " drop count: %d \n",
+                                            avctx->frame_number, frame->pts,
+                                            avci->changed_frames_dropped);
+                av_frame_unref(frame);
+                return AVERROR_INPUT_CHANGED;
+            }
+        }
+    }
     return 0;
 }
 
@@ -1382,6 +1441,7 @@
         if (i == n) {
             av_log(avctx, AV_LOG_ERROR, "Invalid return from get_format(): "
                    "%s not in possible list.\n", desc->name);
+            ret = AV_PIX_FMT_NONE;
             break;
         }
 
@@ -1463,10 +1523,61 @@
     return ret;
 }
 
+static void frame_pool_free(void *opaque, uint8_t *data)
+{
+    FramePool *pool = (FramePool*)data;
+    int i;
+
+    for (i = 0; i < FF_ARRAY_ELEMS(pool->pools); i++)
+        av_buffer_pool_uninit(&pool->pools[i]);
+
+    av_freep(&data);
+}
+
+static AVBufferRef *frame_pool_alloc(void)
+{
+    FramePool *pool = av_mallocz(sizeof(*pool));
+    AVBufferRef *buf;
+
+    if (!pool)
+        return NULL;
+
+    buf = av_buffer_create((uint8_t*)pool, sizeof(*pool),
+                           frame_pool_free, NULL, 0);
+    if (!buf) {
+        av_freep(&pool);
+        return NULL;
+    }
+
+    return buf;
+}
+
 static int update_frame_pool(AVCodecContext *avctx, AVFrame *frame)
 {
-    FramePool *pool = avctx->internal->pool;
-    int i, ret;
+    FramePool *pool = avctx->internal->pool ?
+                      (FramePool*)avctx->internal->pool->data : NULL;
+    AVBufferRef *pool_buf;
+    int i, ret, ch, planes;
+
+    if (avctx->codec_type == AVMEDIA_TYPE_AUDIO) {
+        int planar = av_sample_fmt_is_planar(frame->format);
+        ch     = frame->channels;
+        planes = planar ? ch : 1;
+    }
+
+    if (pool && pool->format == frame->format) {
+        if (avctx->codec_type == AVMEDIA_TYPE_VIDEO &&
+            pool->width == frame->width && pool->height == frame->height)
+            return 0;
+        if (avctx->codec_type == AVMEDIA_TYPE_AUDIO && pool->planes == planes &&
+            pool->channels == ch && frame->nb_samples == pool->samples)
+            return 0;
+    }
+
+    pool_buf = frame_pool_alloc();
+    if (!pool_buf)
+        return AVERROR(ENOMEM);
+    pool = (FramePool*)pool_buf->data;
 
     switch (avctx->codec_type) {
     case AVMEDIA_TYPE_VIDEO: {
@@ -1477,10 +1588,6 @@
         int h = frame->height;
         int tmpsize, unaligned;
 
-        if (pool->format == frame->format &&
-            pool->width == frame->width && pool->height == frame->height)
-            return 0;
-
         avcodec_align_dimensions2(avctx, &w, &h, pool->stride_align);
 
         do {
@@ -1488,7 +1595,7 @@
             // that linesize[0] == 2*linesize[1] in the MPEG-encoder for 4:2:2
             ret = av_image_fill_linesizes(linesize, avctx->pix_fmt, w);
             if (ret < 0)
-                return ret;
+                goto fail;
             // increase alignment of w for next try (rhs gives the lowest bit set in w)
             w += w & ~(w - 1);
 
@@ -1499,15 +1606,16 @@
 
         tmpsize = av_image_fill_pointers(data, avctx->pix_fmt, h,
                                          NULL, linesize);
-        if (tmpsize < 0)
-            return -1;
+        if (tmpsize < 0) {
+            ret = tmpsize;
+            goto fail;
+        }
 
         for (i = 0; i < 3 && data[i + 1]; i++)
             size[i] = data[i + 1] - data[i];
         size[i] = tmpsize - (data[i] - data[0]);
 
         for (i = 0; i < 4; i++) {
-            av_buffer_pool_uninit(&pool->pools[i]);
             pool->linesize[i] = linesize[i];
             if (size[i]) {
                 pool->pools[i] = av_buffer_pool_init(size[i] + 16 + STRIDE_ALIGN - 1,
@@ -1527,15 +1635,6 @@
         break;
         }
     case AVMEDIA_TYPE_AUDIO: {
-        int ch     = frame->channels; //av_get_channel_layout_nb_channels(frame->channel_layout);
-        int planar = av_sample_fmt_is_planar(frame->format);
-        int planes = planar ? ch : 1;
-
-        if (pool->format == frame->format && pool->planes == planes &&
-            pool->channels == ch && frame->nb_samples == pool->samples)
-            return 0;
-
-        av_buffer_pool_uninit(&pool->pools[0]);
         ret = av_samples_get_buffer_size(&pool->linesize[0], ch,
                                          frame->nb_samples, frame->format, 0);
         if (ret < 0)
@@ -1555,19 +1654,19 @@
         }
     default: av_assert0(0);
     }
+
+    av_buffer_unref(&avctx->internal->pool);
+    avctx->internal->pool = pool_buf;
+
     return 0;
 fail:
-    for (i = 0; i < 4; i++)
-        av_buffer_pool_uninit(&pool->pools[i]);
-    pool->format = -1;
-    pool->planes = pool->channels = pool->samples = 0;
-    pool->width  = pool->height = 0;
+    av_buffer_unref(&pool_buf);
     return ret;
 }
 
 static int audio_get_buffer(AVCodecContext *avctx, AVFrame *frame)
 {
-    FramePool *pool = avctx->internal->pool;
+    FramePool *pool = (FramePool*)avctx->internal->pool->data;
     int planes = pool->planes;
     int i;
 
@@ -1612,7 +1711,7 @@
 
 static int video_get_buffer(AVCodecContext *s, AVFrame *pic)
 {
-    FramePool *pool = s->internal->pool;
+    FramePool *pool = (FramePool*)s->internal->pool->data;
     const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pic->format);
     int i;
 
@@ -1709,6 +1808,7 @@
         { AV_PKT_DATA_MASTERING_DISPLAY_METADATA, AV_FRAME_DATA_MASTERING_DISPLAY_METADATA },
         { AV_PKT_DATA_CONTENT_LIGHT_LEVEL,        AV_FRAME_DATA_CONTENT_LIGHT_LEVEL },
         { AV_PKT_DATA_A53_CC,                     AV_FRAME_DATA_A53_CC },
+        { AV_PKT_DATA_ICC_PROFILE,                AV_FRAME_DATA_ICC_PROFILE },
     };
 
     if (pkt) {
@@ -1861,7 +1961,7 @@
     return 0;
 }
 
-static int get_buffer_internal(AVCodecContext *avctx, AVFrame *frame, int flags)
+int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
 {
     const AVHWAccel *hwaccel = avctx->hwaccel;
     int override_dimensions = 1;
@@ -1870,7 +1970,8 @@
     if (avctx->codec_type == AVMEDIA_TYPE_VIDEO) {
         if ((ret = av_image_check_size2(FFALIGN(avctx->width, STRIDE_ALIGN), avctx->height, avctx->max_pixels, AV_PIX_FMT_NONE, 0, avctx)) < 0 || avctx->pix_fmt<0) {
             av_log(avctx, AV_LOG_ERROR, "video_get_buffer: image parameters invalid\n");
-            return AVERROR(EINVAL);
+            ret = AVERROR(EINVAL);
+            goto fail;
         }
 
         if (frame->width <= 0 || frame->height <= 0) {
@@ -1881,55 +1982,52 @@
 
         if (frame->data[0] || frame->data[1] || frame->data[2] || frame->data[3]) {
             av_log(avctx, AV_LOG_ERROR, "pic->data[*]!=NULL in get_buffer_internal\n");
-            return AVERROR(EINVAL);
+            ret = AVERROR(EINVAL);
+            goto fail;
+        }
+    } else if (avctx->codec_type == AVMEDIA_TYPE_AUDIO) {
+        if (frame->nb_samples * (int64_t)avctx->channels > avctx->max_samples) {
+            av_log(avctx, AV_LOG_ERROR, "samples per frame %d, exceeds max_samples %"PRId64"\n", frame->nb_samples, avctx->max_samples);
+            ret = AVERROR(EINVAL);
+            goto fail;
         }
     }
     ret = ff_decode_frame_props(avctx, frame);
     if (ret < 0)
-        return ret;
+        goto fail;
 
     if (hwaccel) {
         if (hwaccel->alloc_frame) {
             ret = hwaccel->alloc_frame(avctx, frame);
-            goto end;
+            goto fail;
         }
     } else
         avctx->sw_pix_fmt = avctx->pix_fmt;
 
     ret = avctx->get_buffer2(avctx, frame, flags);
     if (ret < 0)
-        goto end;
+        goto fail;
 
     validate_avframe_allocation(avctx, frame);
 
     ret = ff_attach_decode_data(frame);
     if (ret < 0)
-        goto end;
+        goto fail;
 
-end:
     if (avctx->codec_type == AVMEDIA_TYPE_VIDEO && !override_dimensions &&
         !(avctx->codec->caps_internal & FF_CODEC_CAP_EXPORTS_CROPPING)) {
         frame->width  = avctx->width;
         frame->height = avctx->height;
     }
 
-    if (ret < 0)
-        av_frame_unref(frame);
-
+    return 0;
+fail:
+    av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
+    av_frame_unref(frame);
     return ret;
 }
 
-int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
-{
-    int ret = get_buffer_internal(avctx, frame, flags);
-    if (ret < 0) {
-        av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
-        frame->width = frame->height = 0;
-    }
-    return ret;
-}
-
-static int reget_buffer_internal(AVCodecContext *avctx, AVFrame *frame)
+static int reget_buffer_internal(AVCodecContext *avctx, AVFrame *frame, int flags)
 {
     AVFrame *tmp;
     int ret;
@@ -1945,7 +2043,7 @@
     if (!frame->data[0])
         return ff_get_buffer(avctx, frame, AV_GET_BUFFER_FLAG_REF);
 
-    if (av_frame_is_writable(frame))
+    if ((flags & FF_REGET_BUFFER_FLAG_READONLY) || av_frame_is_writable(frame))
         return ff_decode_frame_props(avctx, frame);
 
     tmp = av_frame_alloc();
@@ -1966,9 +2064,9 @@
     return 0;
 }
 
-int ff_reget_buffer(AVCodecContext *avctx, AVFrame *frame)
+int ff_reget_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
 {
-    int ret = reget_buffer_internal(avctx, frame);
+    int ret = reget_buffer_internal(avctx, frame, flags);
     if (ret < 0)
         av_log(avctx, AV_LOG_ERROR, "reget_buffer() failed\n");
     return ret;
@@ -1984,15 +2082,32 @@
 
 void avcodec_flush_buffers(AVCodecContext *avctx)
 {
-    avctx->internal->draining      = 0;
-    avctx->internal->draining_done = 0;
-    avctx->internal->nb_draining_errors = 0;
-    av_frame_unref(avctx->internal->buffer_frame);
-    av_frame_unref(avctx->internal->compat_decode_frame);
-    av_packet_unref(avctx->internal->buffer_pkt);
-    avctx->internal->buffer_pkt_valid = 0;
+    AVCodecInternal *avci = avctx->internal;
 
-    av_packet_unref(avctx->internal->ds.in_pkt);
+    if (av_codec_is_encoder(avctx->codec)) {
+        int caps = avctx->codec->capabilities;
+
+        if (!(caps & AV_CODEC_CAP_ENCODER_FLUSH)) {
+            // Only encoders that explicitly declare support for it can be
+            // flushed. Otherwise, this is a no-op.
+            av_log(avctx, AV_LOG_WARNING, "Ignoring attempt to flush encoder "
+                   "that doesn't support it\n");
+            return;
+        }
+
+        // We haven't implemented flushing for frame-threaded encoders.
+        av_assert0(!(caps & AV_CODEC_CAP_FRAME_THREADS));
+    }
+
+    avci->draining      = 0;
+    avci->draining_done = 0;
+    avci->nb_draining_errors = 0;
+    av_frame_unref(avci->buffer_frame);
+    av_frame_unref(avci->compat_decode_frame);
+    av_packet_unref(avci->buffer_pkt);
+    avci->buffer_pkt_valid = 0;
+
+    av_packet_unref(avci->ds.in_pkt);
 
     if (HAVE_THREADS && avctx->active_thread_type & FF_THREAD_FRAME)
         ff_thread_flush(avctx);
@@ -2005,7 +2120,7 @@
     bsfs_flush(avctx);
 
     if (!avctx->refcounted_frames)
-        av_frame_unref(avctx->internal->to_free);
+        av_frame_unref(avci->to_free);
 }
 
 void ff_decode_bsfs_uninit(AVCodecContext *avctx)
diff --git a/libavcodec/dfa.c b/libavcodec/dfa.c
index 970175f..31c6c39 100644
--- a/libavcodec/dfa.c
+++ b/libavcodec/dfa.c
@@ -332,7 +332,7 @@
     decode_tdlt, decode_dsw1, decode_blck, decode_dds1,
 };
 
-static const char * const chunk_name[8] = {
+static const char chunk_name[8][5] = {
     "COPY", "TSW1", "BDLT", "WDLT", "TDLT", "DSW1", "BLCK", "DDS1"
 };
 
@@ -355,6 +355,8 @@
 
     bytestream2_init(&gb, avpkt->data, avpkt->size);
     while (bytestream2_get_bytes_left(&gb) > 0) {
+        if (bytestream2_get_bytes_left(&gb) < 12)
+            return AVERROR_INVALIDDATA;
         bytestream2_skip(&gb, 4);
         chunk_size = bytestream2_get_le32(&gb);
         chunk_type = bytestream2_get_le32(&gb);
diff --git a/libavcodec/dirac_arith.c b/libavcodec/dirac_arith.c
index 7eb9bd6..36142fe 100644
--- a/libavcodec/dirac_arith.c
+++ b/libavcodec/dirac_arith.c
@@ -115,6 +115,8 @@
 
     c->counter = -16;
     c->range   = 0xffff;
+    c->error   = 0;
+    c->overread= 0;
 
     for (i = 0; i < DIRAC_CTX_COUNT; i++)
         c->contexts[i] = 0x8000;
diff --git a/libavcodec/dirac_arith.h b/libavcodec/dirac_arith.h
index 24a7ca3..79526a7 100644
--- a/libavcodec/dirac_arith.h
+++ b/libavcodec/dirac_arith.h
@@ -81,6 +81,8 @@
     const uint8_t *bytestream_end;
 
     uint16_t contexts[DIRAC_CTX_COUNT];
+    int error;
+    int overread;
 } DiracArith;
 
 extern const uint8_t ff_dirac_next_ctx[DIRAC_CTX_COUNT];
@@ -118,6 +120,9 @@
                 new |= 0xff00;
 
             c->bytestream = c->bytestream_end;
+            c->overread ++;
+            if (c->overread > 4)
+                c->error = AVERROR_INVALIDDATA;
         }
 
         c->low += new << counter;
@@ -173,6 +178,7 @@
     while (!dirac_get_arith_bit(c, follow_ctx)) {
         if (ret >= 0x40000000) {
             av_log(NULL, AV_LOG_ERROR, "dirac_get_arith_uint overflow\n");
+            c->error = AVERROR_INVALIDDATA;
             return -1;
         }
         ret <<= 1;
diff --git a/libavcodec/dirac_parser.c b/libavcodec/dirac_parser.c
index 1ade44a..fbc7414 100644
--- a/libavcodec/dirac_parser.c
+++ b/libavcodec/dirac_parser.c
@@ -212,7 +212,7 @@
         if (parse_timing_info && pu1.prev_pu_offset >= 13) {
             uint8_t *cur_pu = pc->buffer +
                               pc->index - 13 - pu1.prev_pu_offset;
-            int pts = AV_RB32(cur_pu + 13);
+            int64_t pts = AV_RB32(cur_pu + 13);
             if (s->last_pts == 0 && s->last_dts == 0)
                 s->dts = pts - 1;
             else
diff --git a/libavcodec/dirac_vlc.c b/libavcodec/dirac_vlc.c
index 496d817..fbe2801 100644
--- a/libavcodec/dirac_vlc.c
+++ b/libavcodec/dirac_vlc.c
@@ -1,7 +1,4 @@
 /*
- * Copyright (C) 2016 Open Broadcast Systems Ltd.
- * Author        2016 Rostislav Pehlivanov <rpehlivanov@obe.tv>
- *
  * This file is part of FFmpeg.
  *
  * FFmpeg is free software; you can redistribute it and/or
@@ -21,232 +18,1114 @@
 
 #include "dirac_vlc.h"
 
-#define LUT_SIZE   (1 << LUT_BITS)
-#define RSIZE_BITS (CHAR_BIT*sizeof(residual))
+enum {
+    /* Next byte contains an exactly aligned start to a new symbol (even bit) */
+    STATE_START  = 0,
+    /* Next byte should end the current value on an odd bit */
+    STATE_FOLLOW = 256,
+    /* Byte is completely data and doesn't end nor start a value */
+    STATE_DATA   = 512,
+    /* Byte has the current value's sign bit and starts a new value */
+    STATE_SIGN   = 768,
+};
 
-#define CONVERT_TO_RESIDUE(a, b)                                               \
-    (((residual)(a)) << (RSIZE_BITS - (b)))
+/* Exactly 128 bits */
+typedef struct LUTState {
+    int16_t   val0;      /* Bits to which to add after applying preshift */
+    int16_t   val1;
+    int16_t   val2;
+    int16_t   val3;
+    int16_t   val4;
+    uint8_t   val0_bits; /* The size of val0 in bits */
+    int8_t    sign;      /* Sign of the current value (0 == zero the value) */
+    int8_t    num;       /* Number of values in this byte */
+    uint8_t   val;       /* Init value in case current value was terminated */
+    uint16_t  state;     /* Expected state for the next byte */
+} LUTState;
 
-#define INIT_RESIDUE(N)                                                        \
-    residual N = 0;                                                            \
-    av_unused int32_t N ## _bits  = 0
+const DECLARE_ALIGNED(32, LUTState, ff_dirac_golomb_lut)[1024] = {
+    { +16,  0,  0,  0,  0, 5, +1, 0,  0, STATE_FOLLOW },
+    { +17,  0,  0,  0,  0, 5, +1, 0,  0, STATE_FOLLOW },
+    {  +8,  0,  0,  0,  0, 4, +1, 1,  0,  STATE_START },
+    {  +8,  0,  0,  0,  0, 4, -1, 1,  0,  STATE_START },
+    { +18,  0,  0,  0,  0, 5, +1, 0,  0, STATE_FOLLOW },
+    { +19,  0,  0,  0,  0, 5, +1, 0,  0, STATE_FOLLOW },
+    {  +9,  0,  0,  0,  0, 4, +1, 1,  0,  STATE_START },
+    {  +9,  0,  0,  0,  0, 4, -1, 1,  0,  STATE_START },
+    {  +4,  0,  0,  0,  0, 3, +1, 1,  2, STATE_FOLLOW },
+    {  +4,  0,  0,  0,  0, 3, +1, 1,  3, STATE_FOLLOW },
+    {  +4,  0,  0,  0,  0, 3, +1, 2,  1,   STATE_DATA },
+    {  +4,  0,  0,  0,  0, 3, +1, 3,  0,  STATE_START },
+    {  +4,  0,  0,  0,  0, 3, -1, 1,  2, STATE_FOLLOW },
+    {  +4,  0,  0,  0,  0, 3, -1, 1,  3, STATE_FOLLOW },
+    {  +4,  0,  0,  0,  0, 3, -1, 2,  1,   STATE_DATA },
+    {  +4,  0,  0,  0,  0, 3, -1, 3,  0,  STATE_START },
+    { +20,  0,  0,  0,  0, 5, +1, 0,  0, STATE_FOLLOW },
+    { +21,  0,  0,  0,  0, 5, +1, 0,  0, STATE_FOLLOW },
+    { +10,  0,  0,  0,  0, 4, +1, 1,  0,  STATE_START },
+    { +10,  0,  0,  0,  0, 4, -1, 1,  0,  STATE_START },
+    { +22,  0,  0,  0,  0, 5, +1, 0,  0, STATE_FOLLOW },
+    { +23,  0,  0,  0,  0, 5, +1, 0,  0, STATE_FOLLOW },
+    { +11,  0,  0,  0,  0, 4, +1, 1,  0,  STATE_START },
+    { +11,  0,  0,  0,  0, 4, -1, 1,  0,  STATE_START },
+    {  +5,  0,  0,  0,  0, 3, +1, 1,  2, STATE_FOLLOW },
+    {  +5,  0,  0,  0,  0, 3, +1, 1,  3, STATE_FOLLOW },
+    {  +5,  0,  0,  0,  0, 3, +1, 2,  1,   STATE_DATA },
+    {  +5,  0,  0,  0,  0, 3, +1, 3,  0,  STATE_START },
+    {  +5,  0,  0,  0,  0, 3, -1, 1,  2, STATE_FOLLOW },
+    {  +5,  0,  0,  0,  0, 3, -1, 1,  3, STATE_FOLLOW },
+    {  +5,  0,  0,  0,  0, 3, -1, 2,  1,   STATE_DATA },
+    {  +5,  0,  0,  0,  0, 3, -1, 3,  0,  STATE_START },
+    {  +2,  0,  0,  0,  0, 2, +1, 1,  4, STATE_FOLLOW },
+    {  +2,  0,  0,  0,  0, 2, +1, 1,  5, STATE_FOLLOW },
+    {  +2, +1,  0,  0,  0, 2, +1, 2,  0,  STATE_START },
+    {  +2, -1,  0,  0,  0, 2, +1, 2,  0,  STATE_START },
+    {  +2,  0,  0,  0,  0, 2, +1, 1,  6, STATE_FOLLOW },
+    {  +2,  0,  0,  0,  0, 2, +1, 1,  7, STATE_FOLLOW },
+    {  +2, +2,  0,  0,  0, 2, +1, 2,  0,  STATE_START },
+    {  +2, -2,  0,  0,  0, 2, +1, 2,  0,  STATE_START },
+    {  +2,  0,  0,  0,  0, 2, +1, 2,  2,   STATE_DATA },
+    {  +2,  0,  0,  0,  0, 2, +1, 2,  2,   STATE_SIGN },
+    {  +2,  0,  0,  0,  0, 2, +1, 2,  3,   STATE_DATA },
+    {  +2,  0,  0,  0,  0, 2, +1, 2,  3,   STATE_SIGN },
+    {  +2,  0,  0,  0,  0, 2, +1, 3,  2, STATE_FOLLOW },
+    {  +2,  0,  0,  0,  0, 2, +1, 3,  3, STATE_FOLLOW },
+    {  +2,  0,  0,  0,  0, 2, +1, 4,  1,   STATE_DATA },
+    {  +2,  0,  0,  0,  0, 2, +1, 5,  0,  STATE_START },
+    {  +2,  0,  0,  0,  0, 2, -1, 1,  4, STATE_FOLLOW },
+    {  +2,  0,  0,  0,  0, 2, -1, 1,  5, STATE_FOLLOW },
+    {  +2, +1,  0,  0,  0, 2, -1, 2,  0,  STATE_START },
+    {  +2, -1,  0,  0,  0, 2, -1, 2,  0,  STATE_START },
+    {  +2,  0,  0,  0,  0, 2, -1, 1,  6, STATE_FOLLOW },
+    {  +2,  0,  0,  0,  0, 2, -1, 1,  7, STATE_FOLLOW },
+    {  +2, +2,  0,  0,  0, 2, -1, 2,  0,  STATE_START },
+    {  +2, -2,  0,  0,  0, 2, -1, 2,  0,  STATE_START },
+    {  +2,  0,  0,  0,  0, 2, -1, 2,  2,   STATE_DATA },
+    {  +2,  0,  0,  0,  0, 2, -1, 2,  2,   STATE_SIGN },
+    {  +2,  0,  0,  0,  0, 2, -1, 2,  3,   STATE_DATA },
+    {  +2,  0,  0,  0,  0, 2, -1, 2,  3,   STATE_SIGN },
+    {  +2,  0,  0,  0,  0, 2, -1, 3,  2, STATE_FOLLOW },
+    {  +2,  0,  0,  0,  0, 2, -1, 3,  3, STATE_FOLLOW },
+    {  +2,  0,  0,  0,  0, 2, -1, 4,  1,   STATE_DATA },
+    {  +2,  0,  0,  0,  0, 2, -1, 5,  0,  STATE_START },
+    { +24,  0,  0,  0,  0, 5, +1, 0,  0, STATE_FOLLOW },
+    { +25,  0,  0,  0,  0, 5, +1, 0,  0, STATE_FOLLOW },
+    { +12,  0,  0,  0,  0, 4, +1, 1,  0,  STATE_START },
+    { +12,  0,  0,  0,  0, 4, -1, 1,  0,  STATE_START },
+    { +26,  0,  0,  0,  0, 5, +1, 0,  0, STATE_FOLLOW },
+    { +27,  0,  0,  0,  0, 5, +1, 0,  0, STATE_FOLLOW },
+    { +13,  0,  0,  0,  0, 4, +1, 1,  0,  STATE_START },
+    { +13,  0,  0,  0,  0, 4, -1, 1,  0,  STATE_START },
+    {  +6,  0,  0,  0,  0, 3, +1, 1,  2, STATE_FOLLOW },
+    {  +6,  0,  0,  0,  0, 3, +1, 1,  3, STATE_FOLLOW },
+    {  +6,  0,  0,  0,  0, 3, +1, 2,  1,   STATE_DATA },
+    {  +6,  0,  0,  0,  0, 3, +1, 3,  0,  STATE_START },
+    {  +6,  0,  0,  0,  0, 3, -1, 1,  2, STATE_FOLLOW },
+    {  +6,  0,  0,  0,  0, 3, -1, 1,  3, STATE_FOLLOW },
+    {  +6,  0,  0,  0,  0, 3, -1, 2,  1,   STATE_DATA },
+    {  +6,  0,  0,  0,  0, 3, -1, 3,  0,  STATE_START },
+    { +28,  0,  0,  0,  0, 5, +1, 0,  0, STATE_FOLLOW },
+    { +29,  0,  0,  0,  0, 5, +1, 0,  0, STATE_FOLLOW },
+    { +14,  0,  0,  0,  0, 4, +1, 1,  0,  STATE_START },
+    { +14,  0,  0,  0,  0, 4, -1, 1,  0,  STATE_START },
+    { +30,  0,  0,  0,  0, 5, +1, 0,  0, STATE_FOLLOW },
+    { +31,  0,  0,  0,  0, 5, +1, 0,  0, STATE_FOLLOW },
+    { +15,  0,  0,  0,  0, 4, +1, 1,  0,  STATE_START },
+    { +15,  0,  0,  0,  0, 4, -1, 1,  0,  STATE_START },
+    {  +7,  0,  0,  0,  0, 3, +1, 1,  2, STATE_FOLLOW },
+    {  +7,  0,  0,  0,  0, 3, +1, 1,  3, STATE_FOLLOW },
+    {  +7,  0,  0,  0,  0, 3, +1, 2,  1,   STATE_DATA },
+    {  +7,  0,  0,  0,  0, 3, +1, 3,  0,  STATE_START },
+    {  +7,  0,  0,  0,  0, 3, -1, 1,  2, STATE_FOLLOW },
+    {  +7,  0,  0,  0,  0, 3, -1, 1,  3, STATE_FOLLOW },
+    {  +7,  0,  0,  0,  0, 3, -1, 2,  1,   STATE_DATA },
+    {  +7,  0,  0,  0,  0, 3, -1, 3,  0,  STATE_START },
+    {  +3,  0,  0,  0,  0, 2, +1, 1,  4, STATE_FOLLOW },
+    {  +3,  0,  0,  0,  0, 2, +1, 1,  5, STATE_FOLLOW },
+    {  +3, +1,  0,  0,  0, 2, +1, 2,  0,  STATE_START },
+    {  +3, -1,  0,  0,  0, 2, +1, 2,  0,  STATE_START },
+    {  +3,  0,  0,  0,  0, 2, +1, 1,  6, STATE_FOLLOW },
+    {  +3,  0,  0,  0,  0, 2, +1, 1,  7, STATE_FOLLOW },
+    {  +3, +2,  0,  0,  0, 2, +1, 2,  0,  STATE_START },
+    {  +3, -2,  0,  0,  0, 2, +1, 2,  0,  STATE_START },
+    {  +3,  0,  0,  0,  0, 2, +1, 2,  2,   STATE_DATA },
+    {  +3,  0,  0,  0,  0, 2, +1, 2,  2,   STATE_SIGN },
+    {  +3,  0,  0,  0,  0, 2, +1, 2,  3,   STATE_DATA },
+    {  +3,  0,  0,  0,  0, 2, +1, 2,  3,   STATE_SIGN },
+    {  +3,  0,  0,  0,  0, 2, +1, 3,  2, STATE_FOLLOW },
+    {  +3,  0,  0,  0,  0, 2, +1, 3,  3, STATE_FOLLOW },
+    {  +3,  0,  0,  0,  0, 2, +1, 4,  1,   STATE_DATA },
+    {  +3,  0,  0,  0,  0, 2, +1, 5,  0,  STATE_START },
+    {  +3,  0,  0,  0,  0, 2, -1, 1,  4, STATE_FOLLOW },
+    {  +3,  0,  0,  0,  0, 2, -1, 1,  5, STATE_FOLLOW },
+    {  +3, +1,  0,  0,  0, 2, -1, 2,  0,  STATE_START },
+    {  +3, -1,  0,  0,  0, 2, -1, 2,  0,  STATE_START },
+    {  +3,  0,  0,  0,  0, 2, -1, 1,  6, STATE_FOLLOW },
+    {  +3,  0,  0,  0,  0, 2, -1, 1,  7, STATE_FOLLOW },
+    {  +3, +2,  0,  0,  0, 2, -1, 2,  0,  STATE_START },
+    {  +3, -2,  0,  0,  0, 2, -1, 2,  0,  STATE_START },
+    {  +3,  0,  0,  0,  0, 2, -1, 2,  2,   STATE_DATA },
+    {  +3,  0,  0,  0,  0, 2, -1, 2,  2,   STATE_SIGN },
+    {  +3,  0,  0,  0,  0, 2, -1, 2,  3,   STATE_DATA },
+    {  +3,  0,  0,  0,  0, 2, -1, 2,  3,   STATE_SIGN },
+    {  +3,  0,  0,  0,  0, 2, -1, 3,  2, STATE_FOLLOW },
+    {  +3,  0,  0,  0,  0, 2, -1, 3,  3, STATE_FOLLOW },
+    {  +3,  0,  0,  0,  0, 2, -1, 4,  1,   STATE_DATA },
+    {  +3,  0,  0,  0,  0, 2, -1, 5,  0,  STATE_START },
+    {   0,  0,  0,  0,  0, 0,  0, 1,  8,   STATE_DATA },
+    {   0,  0,  0,  0,  0, 0,  0, 1,  8,   STATE_SIGN },
+    {   0,  0,  0,  0,  0, 0,  0, 1,  9,   STATE_DATA },
+    {   0,  0,  0,  0,  0, 0,  0, 1,  9,   STATE_SIGN },
+    {   0, +3,  0,  0,  0, 0,  0, 2,  1,   STATE_DATA },
+    {   0, +3,  0,  0,  0, 0,  0, 3,  0,  STATE_START },
+    {   0, -3,  0,  0,  0, 0,  0, 2,  1,   STATE_DATA },
+    {   0, -3,  0,  0,  0, 0,  0, 3,  0,  STATE_START },
+    {   0,  0,  0,  0,  0, 0,  0, 1, 10,   STATE_DATA },
+    {   0,  0,  0,  0,  0, 0,  0, 1, 10,   STATE_SIGN },
+    {   0,  0,  0,  0,  0, 0,  0, 1, 11,   STATE_DATA },
+    {   0,  0,  0,  0,  0, 0,  0, 1, 11,   STATE_SIGN },
+    {   0, +4,  0,  0,  0, 0,  0, 2,  1,   STATE_DATA },
+    {   0, +4,  0,  0,  0, 0,  0, 3,  0,  STATE_START },
+    {   0, -4,  0,  0,  0, 0,  0, 2,  1,   STATE_DATA },
+    {   0, -4,  0,  0,  0, 0,  0, 3,  0,  STATE_START },
+    {   0, +1,  0,  0,  0, 0,  0, 2,  2,   STATE_DATA },
+    {   0, +1,  0,  0,  0, 0,  0, 2,  2,   STATE_SIGN },
+    {   0, +1,  0,  0,  0, 0,  0, 2,  3,   STATE_DATA },
+    {   0, +1,  0,  0,  0, 0,  0, 2,  3,   STATE_SIGN },
+    {   0, +1,  0,  0,  0, 0,  0, 3,  2, STATE_FOLLOW },
+    {   0, +1,  0,  0,  0, 0,  0, 3,  3, STATE_FOLLOW },
+    {   0, +1,  0,  0,  0, 0,  0, 4,  1,   STATE_DATA },
+    {   0, +1,  0,  0,  0, 0,  0, 5,  0,  STATE_START },
+    {   0, -1,  0,  0,  0, 0,  0, 2,  2,   STATE_DATA },
+    {   0, -1,  0,  0,  0, 0,  0, 2,  2,   STATE_SIGN },
+    {   0, -1,  0,  0,  0, 0,  0, 2,  3,   STATE_DATA },
+    {   0, -1,  0,  0,  0, 0,  0, 2,  3,   STATE_SIGN },
+    {   0, -1,  0,  0,  0, 0,  0, 3,  2, STATE_FOLLOW },
+    {   0, -1,  0,  0,  0, 0,  0, 3,  3, STATE_FOLLOW },
+    {   0, -1,  0,  0,  0, 0,  0, 4,  1,   STATE_DATA },
+    {   0, -1,  0,  0,  0, 0,  0, 5,  0,  STATE_START },
+    {   0,  0,  0,  0,  0, 0,  0, 1, 12,   STATE_DATA },
+    {   0,  0,  0,  0,  0, 0,  0, 1, 12,   STATE_SIGN },
+    {   0,  0,  0,  0,  0, 0,  0, 1, 13,   STATE_DATA },
+    {   0,  0,  0,  0,  0, 0,  0, 1, 13,   STATE_SIGN },
+    {   0, +5,  0,  0,  0, 0,  0, 2,  1,   STATE_DATA },
+    {   0, +5,  0,  0,  0, 0,  0, 3,  0,  STATE_START },
+    {   0, -5,  0,  0,  0, 0,  0, 2,  1,   STATE_DATA },
+    {   0, -5,  0,  0,  0, 0,  0, 3,  0,  STATE_START },
+    {   0,  0,  0,  0,  0, 0,  0, 1, 14,   STATE_DATA },
+    {   0,  0,  0,  0,  0, 0,  0, 1, 14,   STATE_SIGN },
+    {   0,  0,  0,  0,  0, 0,  0, 1, 15,   STATE_DATA },
+    {   0,  0,  0,  0,  0, 0,  0, 1, 15,   STATE_SIGN },
+    {   0, +6,  0,  0,  0, 0,  0, 2,  1,   STATE_DATA },
+    {   0, +6,  0,  0,  0, 0,  0, 3,  0,  STATE_START },
+    {   0, -6,  0,  0,  0, 0,  0, 2,  1,   STATE_DATA },
+    {   0, -6,  0,  0,  0, 0,  0, 3,  0,  STATE_START },
+    {   0, +2,  0,  0,  0, 0,  0, 2,  2,   STATE_DATA },
+    {   0, +2,  0,  0,  0, 0,  0, 2,  2,   STATE_SIGN },
+    {   0, +2,  0,  0,  0, 0,  0, 2,  3,   STATE_DATA },
+    {   0, +2,  0,  0,  0, 0,  0, 2,  3,   STATE_SIGN },
+    {   0, +2,  0,  0,  0, 0,  0, 3,  2, STATE_FOLLOW },
+    {   0, +2,  0,  0,  0, 0,  0, 3,  3, STATE_FOLLOW },
+    {   0, +2,  0,  0,  0, 0,  0, 4,  1,   STATE_DATA },
+    {   0, +2,  0,  0,  0, 0,  0, 5,  0,  STATE_START },
+    {   0, -2,  0,  0,  0, 0,  0, 2,  2,   STATE_DATA },
+    {   0, -2,  0,  0,  0, 0,  0, 2,  2,   STATE_SIGN },
+    {   0, -2,  0,  0,  0, 0,  0, 2,  3,   STATE_DATA },
+    {   0, -2,  0,  0,  0, 0,  0, 2,  3,   STATE_SIGN },
+    {   0, -2,  0,  0,  0, 0,  0, 3,  2, STATE_FOLLOW },
+    {   0, -2,  0,  0,  0, 0,  0, 3,  3, STATE_FOLLOW },
+    {   0, -2,  0,  0,  0, 0,  0, 4,  1,   STATE_DATA },
+    {   0, -2,  0,  0,  0, 0,  0, 5,  0,  STATE_START },
+    {   0,  0,  0,  0,  0, 0,  0, 2,  8, STATE_FOLLOW },
+    {   0,  0,  0,  0,  0, 0,  0, 2,  9, STATE_FOLLOW },
+    {   0,  0, +3,  0,  0, 0,  0, 3,  0,  STATE_START },
+    {   0,  0, -3,  0,  0, 0,  0, 3,  0,  STATE_START },
+    {   0,  0,  0,  0,  0, 0,  0, 2, 10, STATE_FOLLOW },
+    {   0,  0,  0,  0,  0, 0,  0, 2, 11, STATE_FOLLOW },
+    {   0,  0, +4,  0,  0, 0,  0, 3,  0,  STATE_START },
+    {   0,  0, -4,  0,  0, 0,  0, 3,  0,  STATE_START },
+    {   0,  0, +1,  0,  0, 0,  0, 3,  2, STATE_FOLLOW },
+    {   0,  0, +1,  0,  0, 0,  0, 3,  3, STATE_FOLLOW },
+    {   0,  0, +1,  0,  0, 0,  0, 4,  1,   STATE_DATA },
+    {   0,  0, +1,  0,  0, 0,  0, 5,  0,  STATE_START },
+    {   0,  0, -1,  0,  0, 0,  0, 3,  2, STATE_FOLLOW },
+    {   0,  0, -1,  0,  0, 0,  0, 3,  3, STATE_FOLLOW },
+    {   0,  0, -1,  0,  0, 0,  0, 4,  1,   STATE_DATA },
+    {   0,  0, -1,  0,  0, 0,  0, 5,  0,  STATE_START },
+    {   0,  0,  0,  0,  0, 0,  0, 2, 12, STATE_FOLLOW },
+    {   0,  0,  0,  0,  0, 0,  0, 2, 13, STATE_FOLLOW },
+    {   0,  0, +5,  0,  0, 0,  0, 3,  0,  STATE_START },
+    {   0,  0, -5,  0,  0, 0,  0, 3,  0,  STATE_START },
+    {   0,  0,  0,  0,  0, 0,  0, 2, 14, STATE_FOLLOW },
+    {   0,  0,  0,  0,  0, 0,  0, 2, 15, STATE_FOLLOW },
+    {   0,  0, +6,  0,  0, 0,  0, 3,  0,  STATE_START },
+    {   0,  0, -6,  0,  0, 0,  0, 3,  0,  STATE_START },
+    {   0,  0, +2,  0,  0, 0,  0, 3,  2, STATE_FOLLOW },
+    {   0,  0, +2,  0,  0, 0,  0, 3,  3, STATE_FOLLOW },
+    {   0,  0, +2,  0,  0, 0,  0, 4,  1,   STATE_DATA },
+    {   0,  0, +2,  0,  0, 0,  0, 5,  0,  STATE_START },
+    {   0,  0, -2,  0,  0, 0,  0, 3,  2, STATE_FOLLOW },
+    {   0,  0, -2,  0,  0, 0,  0, 3,  3, STATE_FOLLOW },
+    {   0,  0, -2,  0,  0, 0,  0, 4,  1,   STATE_DATA },
+    {   0,  0, -2,  0,  0, 0,  0, 5,  0,  STATE_START },
+    {   0,  0,  0,  0,  0, 0,  0, 3,  4,   STATE_DATA },
+    {   0,  0,  0,  0,  0, 0,  0, 3,  4,   STATE_SIGN },
+    {   0,  0,  0,  0,  0, 0,  0, 3,  5,   STATE_DATA },
+    {   0,  0,  0,  0,  0, 0,  0, 3,  5,   STATE_SIGN },
+    {   0,  0,  0, +1,  0, 0,  0, 4,  1,   STATE_DATA },
+    {   0,  0,  0, +1,  0, 0,  0, 5,  0,  STATE_START },
+    {   0,  0,  0, -1,  0, 0,  0, 4,  1,   STATE_DATA },
+    {   0,  0,  0, -1,  0, 0,  0, 5,  0,  STATE_START },
+    {   0,  0,  0,  0,  0, 0,  0, 3,  6,   STATE_DATA },
+    {   0,  0,  0,  0,  0, 0,  0, 3,  6,   STATE_SIGN },
+    {   0,  0,  0,  0,  0, 0,  0, 3,  7,   STATE_DATA },
+    {   0,  0,  0,  0,  0, 0,  0, 3,  7,   STATE_SIGN },
+    {   0,  0,  0, +2,  0, 0,  0, 4,  1,   STATE_DATA },
+    {   0,  0,  0, +2,  0, 0,  0, 5,  0,  STATE_START },
+    {   0,  0,  0, -2,  0, 0,  0, 4,  1,   STATE_DATA },
+    {   0,  0,  0, -2,  0, 0,  0, 5,  0,  STATE_START },
+    {   0,  0,  0,  0,  0, 0,  0, 4,  4, STATE_FOLLOW },
+    {   0,  0,  0,  0,  0, 0,  0, 4,  5, STATE_FOLLOW },
+    {   0,  0,  0,  0, +1, 0,  0, 5,  0,  STATE_START },
+    {   0,  0,  0,  0, -1, 0,  0, 5,  0,  STATE_START },
+    {   0,  0,  0,  0,  0, 0,  0, 4,  6, STATE_FOLLOW },
+    {   0,  0,  0,  0,  0, 0,  0, 4,  7, STATE_FOLLOW },
+    {   0,  0,  0,  0, +2, 0,  0, 5,  0,  STATE_START },
+    {   0,  0,  0,  0, -2, 0,  0, 5,  0,  STATE_START },
+    {   0,  0,  0,  0,  0, 0,  0, 5,  2,   STATE_DATA },
+    {   0,  0,  0,  0,  0, 0,  0, 5,  2,   STATE_SIGN },
+    {   0,  0,  0,  0,  0, 0,  0, 5,  3,   STATE_DATA },
+    {   0,  0,  0,  0,  0, 0,  0, 5,  3,   STATE_SIGN },
+    {   0,  0,  0,  0,  0, 0,  0, 6,  2, STATE_FOLLOW },
+    {   0,  0,  0,  0,  0, 0,  0, 6,  3, STATE_FOLLOW },
+    {   0,  0,  0,  0,  0, 0,  0, 7,  1,   STATE_DATA },
+    {   0,  0,  0,  0,  0, 0,  0, 8,  0,  STATE_START },
+    {   0,  0,  0,  0,  0, 4, +1, 0,  0, STATE_FOLLOW },
+    {  +1,  0,  0,  0,  0, 4, +1, 0,  0, STATE_FOLLOW },
+    {   0,  0,  0,  0,  0, 3, +1, 1,  0,  STATE_START },
+    {   0,  0,  0,  0,  0, 3, -1, 1,  0,  STATE_START },
+    {  +2,  0,  0,  0,  0, 4, +1, 0,  0, STATE_FOLLOW },
+    {  +3,  0,  0,  0,  0, 4, +1, 0,  0, STATE_FOLLOW },
+    {  +1,  0,  0,  0,  0, 3, +1, 1,  0,  STATE_START },
+    {  +1,  0,  0,  0,  0, 3, -1, 1,  0,  STATE_START },
+    {   0,  0,  0,  0,  0, 2, +1, 1,  2, STATE_FOLLOW },
+    {   0,  0,  0,  0,  0, 2, +1, 1,  3, STATE_FOLLOW },
+    {   0,  0,  0,  0,  0, 2, +1, 2,  1,   STATE_DATA },
+    {   0,  0,  0,  0,  0, 2, +1, 3,  0,  STATE_START },
+    {   0,  0,  0,  0,  0, 2, -1, 1,  2, STATE_FOLLOW },
+    {   0,  0,  0,  0,  0, 2, -1, 1,  3, STATE_FOLLOW },
+    {   0,  0,  0,  0,  0, 2, -1, 2,  1,   STATE_DATA },
+    {   0,  0,  0,  0,  0, 2, -1, 3,  0,  STATE_START },
+    {  +4,  0,  0,  0,  0, 4, +1, 0,  0, STATE_FOLLOW },
+    {  +5,  0,  0,  0,  0, 4, +1, 0,  0, STATE_FOLLOW },
+    {  +2,  0,  0,  0,  0, 3, +1, 1,  0,  STATE_START },
+    {  +2,  0,  0,  0,  0, 3, -1, 1,  0,  STATE_START },
+    {  +6,  0,  0,  0,  0, 4, +1, 0,  0, STATE_FOLLOW },
+    {  +7,  0,  0,  0,  0, 4, +1, 0,  0, STATE_FOLLOW },
+    {  +3,  0,  0,  0,  0, 3, +1, 1,  0,  STATE_START },
+    {  +3,  0,  0,  0,  0, 3, -1, 1,  0,  STATE_START },
+    {  +1,  0,  0,  0,  0, 2, +1, 1,  2, STATE_FOLLOW },
+    {  +1,  0,  0,  0,  0, 2, +1, 1,  3, STATE_FOLLOW },
+    {  +1,  0,  0,  0,  0, 2, +1, 2,  1,   STATE_DATA },
+    {  +1,  0,  0,  0,  0, 2, +1, 3,  0,  STATE_START },
+    {  +1,  0,  0,  0,  0, 2, -1, 1,  2, STATE_FOLLOW },
+    {  +1,  0,  0,  0,  0, 2, -1, 1,  3, STATE_FOLLOW },
+    {  +1,  0,  0,  0,  0, 2, -1, 2,  1,   STATE_DATA },
+    {  +1,  0,  0,  0,  0, 2, -1, 3,  0,  STATE_START },
+    {   0,  0,  0,  0,  0, 1, +1, 1,  4, STATE_FOLLOW },
+    {   0,  0,  0,  0,  0, 1, +1, 1,  5, STATE_FOLLOW },
+    {   0, +1,  0,  0,  0, 1, +1, 2,  0,  STATE_START },
+    {   0, -1,  0,  0,  0, 1, +1, 2,  0,  STATE_START },
+    {   0,  0,  0,  0,  0, 1, +1, 1,  6, STATE_FOLLOW },
+    {   0,  0,  0,  0,  0, 1, +1, 1,  7, STATE_FOLLOW },
+    {   0, +2,  0,  0,  0, 1, +1, 2,  0,  STATE_START },
+    {   0, -2,  0,  0,  0, 1, +1, 2,  0,  STATE_START },
+    {   0,  0,  0,  0,  0, 1, +1, 2,  2,   STATE_DATA },
+    {   0,  0,  0,  0,  0, 1, +1, 2,  2,   STATE_SIGN },
+    {   0,  0,  0,  0,  0, 1, +1, 2,  3,   STATE_DATA },
+    {   0,  0,  0,  0,  0, 1, +1, 2,  3,   STATE_SIGN },
+    {   0,  0,  0,  0,  0, 1, +1, 3,  2, STATE_FOLLOW },
+    {   0,  0,  0,  0,  0, 1, +1, 3,  3, STATE_FOLLOW },
+    {   0,  0,  0,  0,  0, 1, +1, 4,  1,   STATE_DATA },
+    {   0,  0,  0,  0,  0, 1, +1, 5,  0,  STATE_START },
+    {   0,  0,  0,  0,  0, 1, -1, 1,  4, STATE_FOLLOW },
+    {   0,  0,  0,  0,  0, 1, -1, 1,  5, STATE_FOLLOW },
+    {   0, +1,  0,  0,  0, 1, -1, 2,  0,  STATE_START },
+    {   0, -1,  0,  0,  0, 1, -1, 2,  0,  STATE_START },
+    {   0,  0,  0,  0,  0, 1, -1, 1,  6, STATE_FOLLOW },
+    {   0,  0,  0,  0,  0, 1, -1, 1,  7, STATE_FOLLOW },
+    {   0, +2,  0,  0,  0, 1, -1, 2,  0,  STATE_START },
+    {   0, -2,  0,  0,  0, 1, -1, 2,  0,  STATE_START },
+    {   0,  0,  0,  0,  0, 1, -1, 2,  2,   STATE_DATA },
+    {   0,  0,  0,  0,  0, 1, -1, 2,  2,   STATE_SIGN },
+    {   0,  0,  0,  0,  0, 1, -1, 2,  3,   STATE_DATA },
+    {   0,  0,  0,  0,  0, 1, -1, 2,  3,   STATE_SIGN },
+    {   0,  0,  0,  0,  0, 1, -1, 3,  2, STATE_FOLLOW },
+    {   0,  0,  0,  0,  0, 1, -1, 3,  3, STATE_FOLLOW },
+    {   0,  0,  0,  0,  0, 1, -1, 4,  1,   STATE_DATA },
+    {   0,  0,  0,  0,  0, 1, -1, 5,  0,  STATE_START },
+    {  +8,  0,  0,  0,  0, 4, +1, 0,  0, STATE_FOLLOW },
+    {  +9,  0,  0,  0,  0, 4, +1, 0,  0, STATE_FOLLOW },
+    {  +4,  0,  0,  0,  0, 3, +1, 1,  0,  STATE_START },
+    {  +4,  0,  0,  0,  0, 3, -1, 1,  0,  STATE_START },
+    { +10,  0,  0,  0,  0, 4, +1, 0,  0, STATE_FOLLOW },
+    { +11,  0,  0,  0,  0, 4, +1, 0,  0, STATE_FOLLOW },
+    {  +5,  0,  0,  0,  0, 3, +1, 1,  0,  STATE_START },
+    {  +5,  0,  0,  0,  0, 3, -1, 1,  0,  STATE_START },
+    {  +2,  0,  0,  0,  0, 2, +1, 1,  2, STATE_FOLLOW },
+    {  +2,  0,  0,  0,  0, 2, +1, 1,  3, STATE_FOLLOW },
+    {  +2,  0,  0,  0,  0, 2, +1, 2,  1,   STATE_DATA },
+    {  +2,  0,  0,  0,  0, 2, +1, 3,  0,  STATE_START },
+    {  +2,  0,  0,  0,  0, 2, -1, 1,  2, STATE_FOLLOW },
+    {  +2,  0,  0,  0,  0, 2, -1, 1,  3, STATE_FOLLOW },
+    {  +2,  0,  0,  0,  0, 2, -1, 2,  1,   STATE_DATA },
+    {  +2,  0,  0,  0,  0, 2, -1, 3,  0,  STATE_START },
+    { +12,  0,  0,  0,  0, 4, +1, 0,  0, STATE_FOLLOW },
+    { +13,  0,  0,  0,  0, 4, +1, 0,  0, STATE_FOLLOW },
+    {  +6,  0,  0,  0,  0, 3, +1, 1,  0,  STATE_START },
+    {  +6,  0,  0,  0,  0, 3, -1, 1,  0,  STATE_START },
+    { +14,  0,  0,  0,  0, 4, +1, 0,  0, STATE_FOLLOW },
+    { +15,  0,  0,  0,  0, 4, +1, 0,  0, STATE_FOLLOW },
+    {  +7,  0,  0,  0,  0, 3, +1, 1,  0,  STATE_START },
+    {  +7,  0,  0,  0,  0, 3, -1, 1,  0,  STATE_START },
+    {  +3,  0,  0,  0,  0, 2, +1, 1,  2, STATE_FOLLOW },
+    {  +3,  0,  0,  0,  0, 2, +1, 1,  3, STATE_FOLLOW },
+    {  +3,  0,  0,  0,  0, 2, +1, 2,  1,   STATE_DATA },
+    {  +3,  0,  0,  0,  0, 2, +1, 3,  0,  STATE_START },
+    {  +3,  0,  0,  0,  0, 2, -1, 1,  2, STATE_FOLLOW },
+    {  +3,  0,  0,  0,  0, 2, -1, 1,  3, STATE_FOLLOW },
+    {  +3,  0,  0,  0,  0, 2, -1, 2,  1,   STATE_DATA },
+    {  +3,  0,  0,  0,  0, 2, -1, 3,  0,  STATE_START },
+    {  +1,  0,  0,  0,  0, 1, +1, 1,  4, STATE_FOLLOW },
+    {  +1,  0,  0,  0,  0, 1, +1, 1,  5, STATE_FOLLOW },
+    {  +1, +1,  0,  0,  0, 1, +1, 2,  0,  STATE_START },
+    {  +1, -1,  0,  0,  0, 1, +1, 2,  0,  STATE_START },
+    {  +1,  0,  0,  0,  0, 1, +1, 1,  6, STATE_FOLLOW },
+    {  +1,  0,  0,  0,  0, 1, +1, 1,  7, STATE_FOLLOW },
+    {  +1, +2,  0,  0,  0, 1, +1, 2,  0,  STATE_START },
+    {  +1, -2,  0,  0,  0, 1, +1, 2,  0,  STATE_START },
+    {  +1,  0,  0,  0,  0, 1, +1, 2,  2,   STATE_DATA },
+    {  +1,  0,  0,  0,  0, 1, +1, 2,  2,   STATE_SIGN },
+    {  +1,  0,  0,  0,  0, 1, +1, 2,  3,   STATE_DATA },
+    {  +1,  0,  0,  0,  0, 1, +1, 2,  3,   STATE_SIGN },
+    {  +1,  0,  0,  0,  0, 1, +1, 3,  2, STATE_FOLLOW },
+    {  +1,  0,  0,  0,  0, 1, +1, 3,  3, STATE_FOLLOW },
+    {  +1,  0,  0,  0,  0, 1, +1, 4,  1,   STATE_DATA },
+    {  +1,  0,  0,  0,  0, 1, +1, 5,  0,  STATE_START },
+    {  +1,  0,  0,  0,  0, 1, -1, 1,  4, STATE_FOLLOW },
+    {  +1,  0,  0,  0,  0, 1, -1, 1,  5, STATE_FOLLOW },
+    {  +1, +1,  0,  0,  0, 1, -1, 2,  0,  STATE_START },
+    {  +1, -1,  0,  0,  0, 1, -1, 2,  0,  STATE_START },
+    {  +1,  0,  0,  0,  0, 1, -1, 1,  6, STATE_FOLLOW },
+    {  +1,  0,  0,  0,  0, 1, -1, 1,  7, STATE_FOLLOW },
+    {  +1, +2,  0,  0,  0, 1, -1, 2,  0,  STATE_START },
+    {  +1, -2,  0,  0,  0, 1, -1, 2,  0,  STATE_START },
+    {  +1,  0,  0,  0,  0, 1, -1, 2,  2,   STATE_DATA },
+    {  +1,  0,  0,  0,  0, 1, -1, 2,  2,   STATE_SIGN },
+    {  +1,  0,  0,  0,  0, 1, -1, 2,  3,   STATE_DATA },
+    {  +1,  0,  0,  0,  0, 1, -1, 2,  3,   STATE_SIGN },
+    {  +1,  0,  0,  0,  0, 1, -1, 3,  2, STATE_FOLLOW },
+    {  +1,  0,  0,  0,  0, 1, -1, 3,  3, STATE_FOLLOW },
+    {  +1,  0,  0,  0,  0, 1, -1, 4,  1,   STATE_DATA },
+    {  +1,  0,  0,  0,  0, 1, -1, 5,  0,  STATE_START },
+    {   0,  0,  0,  0,  0, 0, +1, 1,  8, STATE_FOLLOW },
+    {   0,  0,  0,  0,  0, 0, +1, 1,  9, STATE_FOLLOW },
+    {   0, +3,  0,  0,  0, 0, +1, 2,  0,  STATE_START },
+    {   0, -3,  0,  0,  0, 0, +1, 2,  0,  STATE_START },
+    {   0,  0,  0,  0,  0, 0, +1, 1, 10, STATE_FOLLOW },
+    {   0,  0,  0,  0,  0, 0, +1, 1, 11, STATE_FOLLOW },
+    {   0, +4,  0,  0,  0, 0, +1, 2,  0,  STATE_START },
+    {   0, -4,  0,  0,  0, 0, +1, 2,  0,  STATE_START },
+    {   0, +1,  0,  0,  0, 0, +1, 2,  2, STATE_FOLLOW },
+    {   0, +1,  0,  0,  0, 0, +1, 2,  3, STATE_FOLLOW },
+    {   0, +1,  0,  0,  0, 0, +1, 3,  1,   STATE_DATA },
+    {   0, +1,  0,  0,  0, 0, +1, 4,  0,  STATE_START },
+    {   0, -1,  0,  0,  0, 0, +1, 2,  2, STATE_FOLLOW },
+    {   0, -1,  0,  0,  0, 0, +1, 2,  3, STATE_FOLLOW },
+    {   0, -1,  0,  0,  0, 0, +1, 3,  1,   STATE_DATA },
+    {   0, -1,  0,  0,  0, 0, +1, 4,  0,  STATE_START },
+    {   0,  0,  0,  0,  0, 0, +1, 1, 12, STATE_FOLLOW },
+    {   0,  0,  0,  0,  0, 0, +1, 1, 13, STATE_FOLLOW },
+    {   0, +5,  0,  0,  0, 0, +1, 2,  0,  STATE_START },
+    {   0, -5,  0,  0,  0, 0, +1, 2,  0,  STATE_START },
+    {   0,  0,  0,  0,  0, 0, +1, 1, 14, STATE_FOLLOW },
+    {   0,  0,  0,  0,  0, 0, +1, 1, 15, STATE_FOLLOW },
+    {   0, +6,  0,  0,  0, 0, +1, 2,  0,  STATE_START },
+    {   0, -6,  0,  0,  0, 0, +1, 2,  0,  STATE_START },
+    {   0, +2,  0,  0,  0, 0, +1, 2,  2, STATE_FOLLOW },
+    {   0, +2,  0,  0,  0, 0, +1, 2,  3, STATE_FOLLOW },
+    {   0, +2,  0,  0,  0, 0, +1, 3,  1,   STATE_DATA },
+    {   0, +2,  0,  0,  0, 0, +1, 4,  0,  STATE_START },
+    {   0, -2,  0,  0,  0, 0, +1, 2,  2, STATE_FOLLOW },
+    {   0, -2,  0,  0,  0, 0, +1, 2,  3, STATE_FOLLOW },
+    {   0, -2,  0,  0,  0, 0, +1, 3,  1,   STATE_DATA },
+    {   0, -2,  0,  0,  0, 0, +1, 4,  0,  STATE_START },
+    {   0,  0,  0,  0,  0, 0, +1, 2,  4,   STATE_DATA },
+    {   0,  0,  0,  0,  0, 0, +1, 2,  4,   STATE_SIGN },
+    {   0,  0,  0,  0,  0, 0, +1, 2,  5,   STATE_DATA },
+    {   0,  0,  0,  0,  0, 0, +1, 2,  5,   STATE_SIGN },
+    {   0,  0, +1,  0,  0, 0, +1, 3,  1,   STATE_DATA },
+    {   0,  0, +1,  0,  0, 0, +1, 4,  0,  STATE_START },
+    {   0,  0, -1,  0,  0, 0, +1, 3,  1,   STATE_DATA },
+    {   0,  0, -1,  0,  0, 0, +1, 4,  0,  STATE_START },
+    {   0,  0,  0,  0,  0, 0, +1, 2,  6,   STATE_DATA },
+    {   0,  0,  0,  0,  0, 0, +1, 2,  6,   STATE_SIGN },
+    {   0,  0,  0,  0,  0, 0, +1, 2,  7,   STATE_DATA },
+    {   0,  0,  0,  0,  0, 0, +1, 2,  7,   STATE_SIGN },
+    {   0,  0, +2,  0,  0, 0, +1, 3,  1,   STATE_DATA },
+    {   0,  0, +2,  0,  0, 0, +1, 4,  0,  STATE_START },
+    {   0,  0, -2,  0,  0, 0, +1, 3,  1,   STATE_DATA },
+    {   0,  0, -2,  0,  0, 0, +1, 4,  0,  STATE_START },
+    {   0,  0,  0,  0,  0, 0, +1, 3,  4, STATE_FOLLOW },
+    {   0,  0,  0,  0,  0, 0, +1, 3,  5, STATE_FOLLOW },
+    {   0,  0,  0, +1,  0, 0, +1, 4,  0,  STATE_START },
+    {   0,  0,  0, -1,  0, 0, +1, 4,  0,  STATE_START },
+    {   0,  0,  0,  0,  0, 0, +1, 3,  6, STATE_FOLLOW },
+    {   0,  0,  0,  0,  0, 0, +1, 3,  7, STATE_FOLLOW },
+    {   0,  0,  0, +2,  0, 0, +1, 4,  0,  STATE_START },
+    {   0,  0,  0, -2,  0, 0, +1, 4,  0,  STATE_START },
+    {   0,  0,  0,  0,  0, 0, +1, 4,  2,   STATE_DATA },
+    {   0,  0,  0,  0,  0, 0, +1, 4,  2,   STATE_SIGN },
+    {   0,  0,  0,  0,  0, 0, +1, 4,  3,   STATE_DATA },
+    {   0,  0,  0,  0,  0, 0, +1, 4,  3,   STATE_SIGN },
+    {   0,  0,  0,  0,  0, 0, +1, 5,  2, STATE_FOLLOW },
+    {   0,  0,  0,  0,  0, 0, +1, 5,  3, STATE_FOLLOW },
+    {   0,  0,  0,  0,  0, 0, +1, 6,  1,   STATE_DATA },
+    {   0,  0,  0,  0,  0, 0, +1, 7,  0,  STATE_START },
+    {   0,  0,  0,  0,  0, 0, -1, 1,  8, STATE_FOLLOW },
+    {   0,  0,  0,  0,  0, 0, -1, 1,  9, STATE_FOLLOW },
+    {   0, +3,  0,  0,  0, 0, -1, 2,  0,  STATE_START },
+    {   0, -3,  0,  0,  0, 0, -1, 2,  0,  STATE_START },
+    {   0,  0,  0,  0,  0, 0, -1, 1, 10, STATE_FOLLOW },
+    {   0,  0,  0,  0,  0, 0, -1, 1, 11, STATE_FOLLOW },
+    {   0, +4,  0,  0,  0, 0, -1, 2,  0,  STATE_START },
+    {   0, -4,  0,  0,  0, 0, -1, 2,  0,  STATE_START },
+    {   0, +1,  0,  0,  0, 0, -1, 2,  2, STATE_FOLLOW },
+    {   0, +1,  0,  0,  0, 0, -1, 2,  3, STATE_FOLLOW },
+    {   0, +1,  0,  0,  0, 0, -1, 3,  1,   STATE_DATA },
+    {   0, +1,  0,  0,  0, 0, -1, 4,  0,  STATE_START },
+    {   0, -1,  0,  0,  0, 0, -1, 2,  2, STATE_FOLLOW },
+    {   0, -1,  0,  0,  0, 0, -1, 2,  3, STATE_FOLLOW },
+    {   0, -1,  0,  0,  0, 0, -1, 3,  1,   STATE_DATA },
+    {   0, -1,  0,  0,  0, 0, -1, 4,  0,  STATE_START },
+    {   0,  0,  0,  0,  0, 0, -1, 1, 12, STATE_FOLLOW },
+    {   0,  0,  0,  0,  0, 0, -1, 1, 13, STATE_FOLLOW },
+    {   0, +5,  0,  0,  0, 0, -1, 2,  0,  STATE_START },
+    {   0, -5,  0,  0,  0, 0, -1, 2,  0,  STATE_START },
+    {   0,  0,  0,  0,  0, 0, -1, 1, 14, STATE_FOLLOW },
+    {   0,  0,  0,  0,  0, 0, -1, 1, 15, STATE_FOLLOW },
+    {   0, +6,  0,  0,  0, 0, -1, 2,  0,  STATE_START },
+    {   0, -6,  0,  0,  0, 0, -1, 2,  0,  STATE_START },
+    {   0, +2,  0,  0,  0, 0, -1, 2,  2, STATE_FOLLOW },
+    {   0, +2,  0,  0,  0, 0, -1, 2,  3, STATE_FOLLOW },
+    {   0, +2,  0,  0,  0, 0, -1, 3,  1,   STATE_DATA },
+    {   0, +2,  0,  0,  0, 0, -1, 4,  0,  STATE_START },
+    {   0, -2,  0,  0,  0, 0, -1, 2,  2, STATE_FOLLOW },
+    {   0, -2,  0,  0,  0, 0, -1, 2,  3, STATE_FOLLOW },
+    {   0, -2,  0,  0,  0, 0, -1, 3,  1,   STATE_DATA },
+    {   0, -2,  0,  0,  0, 0, -1, 4,  0,  STATE_START },
+    {   0,  0,  0,  0,  0, 0, -1, 2,  4,   STATE_DATA },
+    {   0,  0,  0,  0,  0, 0, -1, 2,  4,   STATE_SIGN },
+    {   0,  0,  0,  0,  0, 0, -1, 2,  5,   STATE_DATA },
+    {   0,  0,  0,  0,  0, 0, -1, 2,  5,   STATE_SIGN },
+    {   0,  0, +1,  0,  0, 0, -1, 3,  1,   STATE_DATA },
+    {   0,  0, +1,  0,  0, 0, -1, 4,  0,  STATE_START },
+    {   0,  0, -1,  0,  0, 0, -1, 3,  1,   STATE_DATA },
+    {   0,  0, -1,  0,  0, 0, -1, 4,  0,  STATE_START },
+    {   0,  0,  0,  0,  0, 0, -1, 2,  6,   STATE_DATA },
+    {   0,  0,  0,  0,  0, 0, -1, 2,  6,   STATE_SIGN },
+    {   0,  0,  0,  0,  0, 0, -1, 2,  7,   STATE_DATA },
+    {   0,  0,  0,  0,  0, 0, -1, 2,  7,   STATE_SIGN },
+    {   0,  0, +2,  0,  0, 0, -1, 3,  1,   STATE_DATA },
+    {   0,  0, +2,  0,  0, 0, -1, 4,  0,  STATE_START },
+    {   0,  0, -2,  0,  0, 0, -1, 3,  1,   STATE_DATA },
+    {   0,  0, -2,  0,  0, 0, -1, 4,  0,  STATE_START },
+    {   0,  0,  0,  0,  0, 0, -1, 3,  4, STATE_FOLLOW },
+    {   0,  0,  0,  0,  0, 0, -1, 3,  5, STATE_FOLLOW },
+    {   0,  0,  0, +1,  0, 0, -1, 4,  0,  STATE_START },
+    {   0,  0,  0, -1,  0, 0, -1, 4,  0,  STATE_START },
+    {   0,  0,  0,  0,  0, 0, -1, 3,  6, STATE_FOLLOW },
+    {   0,  0,  0,  0,  0, 0, -1, 3,  7, STATE_FOLLOW },
+    {   0,  0,  0, +2,  0, 0, -1, 4,  0,  STATE_START },
+    {   0,  0,  0, -2,  0, 0, -1, 4,  0,  STATE_START },
+    {   0,  0,  0,  0,  0, 0, -1, 4,  2,   STATE_DATA },
+    {   0,  0,  0,  0,  0, 0, -1, 4,  2,   STATE_SIGN },
+    {   0,  0,  0,  0,  0, 0, -1, 4,  3,   STATE_DATA },
+    {   0,  0,  0,  0,  0, 0, -1, 4,  3,   STATE_SIGN },
+    {   0,  0,  0,  0,  0, 0, -1, 5,  2, STATE_FOLLOW },
+    {   0,  0,  0,  0,  0, 0, -1, 5,  3, STATE_FOLLOW },
+    {   0,  0,  0,  0,  0, 0, -1, 6,  1,   STATE_DATA },
+    {   0,  0,  0,  0,  0, 0, -1, 7,  0,  STATE_START },
+    {   0,  0,  0,  0,  0, 4, +1, 0,  0,   STATE_DATA },
+    {   0,  0,  0,  0,  0, 4, +1, 0,  0,   STATE_SIGN },
+    {  +1,  0,  0,  0,  0, 4, +1, 0,  0,   STATE_DATA },
+    {  +1,  0,  0,  0,  0, 4, +1, 0,  0,   STATE_SIGN },
+    {   0,  0,  0,  0,  0, 3, +1, 1,  1,   STATE_DATA },
+    {   0,  0,  0,  0,  0, 3, +1, 2,  0,  STATE_START },
+    {   0,  0,  0,  0,  0, 3, -1, 1,  1,   STATE_DATA },
+    {   0,  0,  0,  0,  0, 3, -1, 2,  0,  STATE_START },
+    {  +2,  0,  0,  0,  0, 4, +1, 0,  0,   STATE_DATA },
+    {  +2,  0,  0,  0,  0, 4, +1, 0,  0,   STATE_SIGN },
+    {  +3,  0,  0,  0,  0, 4, +1, 0,  0,   STATE_DATA },
+    {  +3,  0,  0,  0,  0, 4, +1, 0,  0,   STATE_SIGN },
+    {  +1,  0,  0,  0,  0, 3, +1, 1,  1,   STATE_DATA },
+    {  +1,  0,  0,  0,  0, 3, +1, 2,  0,  STATE_START },
+    {  +1,  0,  0,  0,  0, 3, -1, 1,  1,   STATE_DATA },
+    {  +1,  0,  0,  0,  0, 3, -1, 2,  0,  STATE_START },
+    {   0,  0,  0,  0,  0, 2, +1, 1,  2,   STATE_DATA },
+    {   0,  0,  0,  0,  0, 2, +1, 1,  2,   STATE_SIGN },
+    {   0,  0,  0,  0,  0, 2, +1, 1,  3,   STATE_DATA },
+    {   0,  0,  0,  0,  0, 2, +1, 1,  3,   STATE_SIGN },
+    {   0,  0,  0,  0,  0, 2, +1, 2,  2, STATE_FOLLOW },
+    {   0,  0,  0,  0,  0, 2, +1, 2,  3, STATE_FOLLOW },
+    {   0,  0,  0,  0,  0, 2, +1, 3,  1,   STATE_DATA },
+    {   0,  0,  0,  0,  0, 2, +1, 4,  0,  STATE_START },
+    {   0,  0,  0,  0,  0, 2, -1, 1,  2,   STATE_DATA },
+    {   0,  0,  0,  0,  0, 2, -1, 1,  2,   STATE_SIGN },
+    {   0,  0,  0,  0,  0, 2, -1, 1,  3,   STATE_DATA },
+    {   0,  0,  0,  0,  0, 2, -1, 1,  3,   STATE_SIGN },
+    {   0,  0,  0,  0,  0, 2, -1, 2,  2, STATE_FOLLOW },
+    {   0,  0,  0,  0,  0, 2, -1, 2,  3, STATE_FOLLOW },
+    {   0,  0,  0,  0,  0, 2, -1, 3,  1,   STATE_DATA },
+    {   0,  0,  0,  0,  0, 2, -1, 4,  0,  STATE_START },
+    {  +4,  0,  0,  0,  0, 4, +1, 0,  0,   STATE_DATA },
+    {  +4,  0,  0,  0,  0, 4, +1, 0,  0,   STATE_SIGN },
+    {  +5,  0,  0,  0,  0, 4, +1, 0,  0,   STATE_DATA },
+    {  +5,  0,  0,  0,  0, 4, +1, 0,  0,   STATE_SIGN },
+    {  +2,  0,  0,  0,  0, 3, +1, 1,  1,   STATE_DATA },
+    {  +2,  0,  0,  0,  0, 3, +1, 2,  0,  STATE_START },
+    {  +2,  0,  0,  0,  0, 3, -1, 1,  1,   STATE_DATA },
+    {  +2,  0,  0,  0,  0, 3, -1, 2,  0,  STATE_START },
+    {  +6,  0,  0,  0,  0, 4, +1, 0,  0,   STATE_DATA },
+    {  +6,  0,  0,  0,  0, 4, +1, 0,  0,   STATE_SIGN },
+    {  +7,  0,  0,  0,  0, 4, +1, 0,  0,   STATE_DATA },
+    {  +7,  0,  0,  0,  0, 4, +1, 0,  0,   STATE_SIGN },
+    {  +3,  0,  0,  0,  0, 3, +1, 1,  1,   STATE_DATA },
+    {  +3,  0,  0,  0,  0, 3, +1, 2,  0,  STATE_START },
+    {  +3,  0,  0,  0,  0, 3, -1, 1,  1,   STATE_DATA },
+    {  +3,  0,  0,  0,  0, 3, -1, 2,  0,  STATE_START },
+    {  +1,  0,  0,  0,  0, 2, +1, 1,  2,   STATE_DATA },
+    {  +1,  0,  0,  0,  0, 2, +1, 1,  2,   STATE_SIGN },
+    {  +1,  0,  0,  0,  0, 2, +1, 1,  3,   STATE_DATA },
+    {  +1,  0,  0,  0,  0, 2, +1, 1,  3,   STATE_SIGN },
+    {  +1,  0,  0,  0,  0, 2, +1, 2,  2, STATE_FOLLOW },
+    {  +1,  0,  0,  0,  0, 2, +1, 2,  3, STATE_FOLLOW },
+    {  +1,  0,  0,  0,  0, 2, +1, 3,  1,   STATE_DATA },
+    {  +1,  0,  0,  0,  0, 2, +1, 4,  0,  STATE_START },
+    {  +1,  0,  0,  0,  0, 2, -1, 1,  2,   STATE_DATA },
+    {  +1,  0,  0,  0,  0, 2, -1, 1,  2,   STATE_SIGN },
+    {  +1,  0,  0,  0,  0, 2, -1, 1,  3,   STATE_DATA },
+    {  +1,  0,  0,  0,  0, 2, -1, 1,  3,   STATE_SIGN },
+    {  +1,  0,  0,  0,  0, 2, -1, 2,  2, STATE_FOLLOW },
+    {  +1,  0,  0,  0,  0, 2, -1, 2,  3, STATE_FOLLOW },
+    {  +1,  0,  0,  0,  0, 2, -1, 3,  1,   STATE_DATA },
+    {  +1,  0,  0,  0,  0, 2, -1, 4,  0,  STATE_START },
+    {   0,  0,  0,  0,  0, 1, +1, 1,  4,   STATE_DATA },
+    {   0,  0,  0,  0,  0, 1, +1, 1,  4,   STATE_SIGN },
+    {   0,  0,  0,  0,  0, 1, +1, 1,  5,   STATE_DATA },
+    {   0,  0,  0,  0,  0, 1, +1, 1,  5,   STATE_SIGN },
+    {   0, +1,  0,  0,  0, 1, +1, 2,  1,   STATE_DATA },
+    {   0, +1,  0,  0,  0, 1, +1, 3,  0,  STATE_START },
+    {   0, -1,  0,  0,  0, 1, +1, 2,  1,   STATE_DATA },
+    {   0, -1,  0,  0,  0, 1, +1, 3,  0,  STATE_START },
+    {   0,  0,  0,  0,  0, 1, +1, 1,  6,   STATE_DATA },
+    {   0,  0,  0,  0,  0, 1, +1, 1,  6,   STATE_SIGN },
+    {   0,  0,  0,  0,  0, 1, +1, 1,  7,   STATE_DATA },
+    {   0,  0,  0,  0,  0, 1, +1, 1,  7,   STATE_SIGN },
+    {   0, +2,  0,  0,  0, 1, +1, 2,  1,   STATE_DATA },
+    {   0, +2,  0,  0,  0, 1, +1, 3,  0,  STATE_START },
+    {   0, -2,  0,  0,  0, 1, +1, 2,  1,   STATE_DATA },
+    {   0, -2,  0,  0,  0, 1, +1, 3,  0,  STATE_START },
+    {   0,  0,  0,  0,  0, 1, +1, 2,  4, STATE_FOLLOW },
+    {   0,  0,  0,  0,  0, 1, +1, 2,  5, STATE_FOLLOW },
+    {   0,  0, +1,  0,  0, 1, +1, 3,  0,  STATE_START },
+    {   0,  0, -1,  0,  0, 1, +1, 3,  0,  STATE_START },
+    {   0,  0,  0,  0,  0, 1, +1, 2,  6, STATE_FOLLOW },
+    {   0,  0,  0,  0,  0, 1, +1, 2,  7, STATE_FOLLOW },
+    {   0,  0, +2,  0,  0, 1, +1, 3,  0,  STATE_START },
+    {   0,  0, -2,  0,  0, 1, +1, 3,  0,  STATE_START },
+    {   0,  0,  0,  0,  0, 1, +1, 3,  2,   STATE_DATA },
+    {   0,  0,  0,  0,  0, 1, +1, 3,  2,   STATE_SIGN },
+    {   0,  0,  0,  0,  0, 1, +1, 3,  3,   STATE_DATA },
+    {   0,  0,  0,  0,  0, 1, +1, 3,  3,   STATE_SIGN },
+    {   0,  0,  0,  0,  0, 1, +1, 4,  2, STATE_FOLLOW },
+    {   0,  0,  0,  0,  0, 1, +1, 4,  3, STATE_FOLLOW },
+    {   0,  0,  0,  0,  0, 1, +1, 5,  1,   STATE_DATA },
+    {   0,  0,  0,  0,  0, 1, +1, 6,  0,  STATE_START },
+    {   0,  0,  0,  0,  0, 1, -1, 1,  4,   STATE_DATA },
+    {   0,  0,  0,  0,  0, 1, -1, 1,  4,   STATE_SIGN },
+    {   0,  0,  0,  0,  0, 1, -1, 1,  5,   STATE_DATA },
+    {   0,  0,  0,  0,  0, 1, -1, 1,  5,   STATE_SIGN },
+    {   0, +1,  0,  0,  0, 1, -1, 2,  1,   STATE_DATA },
+    {   0, +1,  0,  0,  0, 1, -1, 3,  0,  STATE_START },
+    {   0, -1,  0,  0,  0, 1, -1, 2,  1,   STATE_DATA },
+    {   0, -1,  0,  0,  0, 1, -1, 3,  0,  STATE_START },
+    {   0,  0,  0,  0,  0, 1, -1, 1,  6,   STATE_DATA },
+    {   0,  0,  0,  0,  0, 1, -1, 1,  6,   STATE_SIGN },
+    {   0,  0,  0,  0,  0, 1, -1, 1,  7,   STATE_DATA },
+    {   0,  0,  0,  0,  0, 1, -1, 1,  7,   STATE_SIGN },
+    {   0, +2,  0,  0,  0, 1, -1, 2,  1,   STATE_DATA },
+    {   0, +2,  0,  0,  0, 1, -1, 3,  0,  STATE_START },
+    {   0, -2,  0,  0,  0, 1, -1, 2,  1,   STATE_DATA },
+    {   0, -2,  0,  0,  0, 1, -1, 3,  0,  STATE_START },
+    {   0,  0,  0,  0,  0, 1, -1, 2,  4, STATE_FOLLOW },
+    {   0,  0,  0,  0,  0, 1, -1, 2,  5, STATE_FOLLOW },
+    {   0,  0, +1,  0,  0, 1, -1, 3,  0,  STATE_START },
+    {   0,  0, -1,  0,  0, 1, -1, 3,  0,  STATE_START },
+    {   0,  0,  0,  0,  0, 1, -1, 2,  6, STATE_FOLLOW },
+    {   0,  0,  0,  0,  0, 1, -1, 2,  7, STATE_FOLLOW },
+    {   0,  0, +2,  0,  0, 1, -1, 3,  0,  STATE_START },
+    {   0,  0, -2,  0,  0, 1, -1, 3,  0,  STATE_START },
+    {   0,  0,  0,  0,  0, 1, -1, 3,  2,   STATE_DATA },
+    {   0,  0,  0,  0,  0, 1, -1, 3,  2,   STATE_SIGN },
+    {   0,  0,  0,  0,  0, 1, -1, 3,  3,   STATE_DATA },
+    {   0,  0,  0,  0,  0, 1, -1, 3,  3,   STATE_SIGN },
+    {   0,  0,  0,  0,  0, 1, -1, 4,  2, STATE_FOLLOW },
+    {   0,  0,  0,  0,  0, 1, -1, 4,  3, STATE_FOLLOW },
+    {   0,  0,  0,  0,  0, 1, -1, 5,  1,   STATE_DATA },
+    {   0,  0,  0,  0,  0, 1, -1, 6,  0,  STATE_START },
+    {  +8,  0,  0,  0,  0, 4, +1, 0,  0,   STATE_DATA },
+    {  +8,  0,  0,  0,  0, 4, +1, 0,  0,   STATE_SIGN },
+    {  +9,  0,  0,  0,  0, 4, +1, 0,  0,   STATE_DATA },
+    {  +9,  0,  0,  0,  0, 4, +1, 0,  0,   STATE_SIGN },
+    {  +4,  0,  0,  0,  0, 3, +1, 1,  1,   STATE_DATA },
+    {  +4,  0,  0,  0,  0, 3, +1, 2,  0,  STATE_START },
+    {  +4,  0,  0,  0,  0, 3, -1, 1,  1,   STATE_DATA },
+    {  +4,  0,  0,  0,  0, 3, -1, 2,  0,  STATE_START },
+    { +10,  0,  0,  0,  0, 4, +1, 0,  0,   STATE_DATA },
+    { +10,  0,  0,  0,  0, 4, +1, 0,  0,   STATE_SIGN },
+    { +11,  0,  0,  0,  0, 4, +1, 0,  0,   STATE_DATA },
+    { +11,  0,  0,  0,  0, 4, +1, 0,  0,   STATE_SIGN },
+    {  +5,  0,  0,  0,  0, 3, +1, 1,  1,   STATE_DATA },
+    {  +5,  0,  0,  0,  0, 3, +1, 2,  0,  STATE_START },
+    {  +5,  0,  0,  0,  0, 3, -1, 1,  1,   STATE_DATA },
+    {  +5,  0,  0,  0,  0, 3, -1, 2,  0,  STATE_START },
+    {  +2,  0,  0,  0,  0, 2, +1, 1,  2,   STATE_DATA },
+    {  +2,  0,  0,  0,  0, 2, +1, 1,  2,   STATE_SIGN },
+    {  +2,  0,  0,  0,  0, 2, +1, 1,  3,   STATE_DATA },
+    {  +2,  0,  0,  0,  0, 2, +1, 1,  3,   STATE_SIGN },
+    {  +2,  0,  0,  0,  0, 2, +1, 2,  2, STATE_FOLLOW },
+    {  +2,  0,  0,  0,  0, 2, +1, 2,  3, STATE_FOLLOW },
+    {  +2,  0,  0,  0,  0, 2, +1, 3,  1,   STATE_DATA },
+    {  +2,  0,  0,  0,  0, 2, +1, 4,  0,  STATE_START },
+    {  +2,  0,  0,  0,  0, 2, -1, 1,  2,   STATE_DATA },
+    {  +2,  0,  0,  0,  0, 2, -1, 1,  2,   STATE_SIGN },
+    {  +2,  0,  0,  0,  0, 2, -1, 1,  3,   STATE_DATA },
+    {  +2,  0,  0,  0,  0, 2, -1, 1,  3,   STATE_SIGN },
+    {  +2,  0,  0,  0,  0, 2, -1, 2,  2, STATE_FOLLOW },
+    {  +2,  0,  0,  0,  0, 2, -1, 2,  3, STATE_FOLLOW },
+    {  +2,  0,  0,  0,  0, 2, -1, 3,  1,   STATE_DATA },
+    {  +2,  0,  0,  0,  0, 2, -1, 4,  0,  STATE_START },
+    { +12,  0,  0,  0,  0, 4, +1, 0,  0,   STATE_DATA },
+    { +12,  0,  0,  0,  0, 4, +1, 0,  0,   STATE_SIGN },
+    { +13,  0,  0,  0,  0, 4, +1, 0,  0,   STATE_DATA },
+    { +13,  0,  0,  0,  0, 4, +1, 0,  0,   STATE_SIGN },
+    {  +6,  0,  0,  0,  0, 3, +1, 1,  1,   STATE_DATA },
+    {  +6,  0,  0,  0,  0, 3, +1, 2,  0,  STATE_START },
+    {  +6,  0,  0,  0,  0, 3, -1, 1,  1,   STATE_DATA },
+    {  +6,  0,  0,  0,  0, 3, -1, 2,  0,  STATE_START },
+    { +14,  0,  0,  0,  0, 4, +1, 0,  0,   STATE_DATA },
+    { +14,  0,  0,  0,  0, 4, +1, 0,  0,   STATE_SIGN },
+    { +15,  0,  0,  0,  0, 4, +1, 0,  0,   STATE_DATA },
+    { +15,  0,  0,  0,  0, 4, +1, 0,  0,   STATE_SIGN },
+    {  +7,  0,  0,  0,  0, 3, +1, 1,  1,   STATE_DATA },
+    {  +7,  0,  0,  0,  0, 3, +1, 2,  0,  STATE_START },
+    {  +7,  0,  0,  0,  0, 3, -1, 1,  1,   STATE_DATA },
+    {  +7,  0,  0,  0,  0, 3, -1, 2,  0,  STATE_START },
+    {  +3,  0,  0,  0,  0, 2, +1, 1,  2,   STATE_DATA },
+    {  +3,  0,  0,  0,  0, 2, +1, 1,  2,   STATE_SIGN },
+    {  +3,  0,  0,  0,  0, 2, +1, 1,  3,   STATE_DATA },
+    {  +3,  0,  0,  0,  0, 2, +1, 1,  3,   STATE_SIGN },
+    {  +3,  0,  0,  0,  0, 2, +1, 2,  2, STATE_FOLLOW },
+    {  +3,  0,  0,  0,  0, 2, +1, 2,  3, STATE_FOLLOW },
+    {  +3,  0,  0,  0,  0, 2, +1, 3,  1,   STATE_DATA },
+    {  +3,  0,  0,  0,  0, 2, +1, 4,  0,  STATE_START },
+    {  +3,  0,  0,  0,  0, 2, -1, 1,  2,   STATE_DATA },
+    {  +3,  0,  0,  0,  0, 2, -1, 1,  2,   STATE_SIGN },
+    {  +3,  0,  0,  0,  0, 2, -1, 1,  3,   STATE_DATA },
+    {  +3,  0,  0,  0,  0, 2, -1, 1,  3,   STATE_SIGN },
+    {  +3,  0,  0,  0,  0, 2, -1, 2,  2, STATE_FOLLOW },
+    {  +3,  0,  0,  0,  0, 2, -1, 2,  3, STATE_FOLLOW },
+    {  +3,  0,  0,  0,  0, 2, -1, 3,  1,   STATE_DATA },
+    {  +3,  0,  0,  0,  0, 2, -1, 4,  0,  STATE_START },
+    {  +1,  0,  0,  0,  0, 1, +1, 1,  4,   STATE_DATA },
+    {  +1,  0,  0,  0,  0, 1, +1, 1,  4,   STATE_SIGN },
+    {  +1,  0,  0,  0,  0, 1, +1, 1,  5,   STATE_DATA },
+    {  +1,  0,  0,  0,  0, 1, +1, 1,  5,   STATE_SIGN },
+    {  +1, +1,  0,  0,  0, 1, +1, 2,  1,   STATE_DATA },
+    {  +1, +1,  0,  0,  0, 1, +1, 3,  0,  STATE_START },
+    {  +1, -1,  0,  0,  0, 1, +1, 2,  1,   STATE_DATA },
+    {  +1, -1,  0,  0,  0, 1, +1, 3,  0,  STATE_START },
+    {  +1,  0,  0,  0,  0, 1, +1, 1,  6,   STATE_DATA },
+    {  +1,  0,  0,  0,  0, 1, +1, 1,  6,   STATE_SIGN },
+    {  +1,  0,  0,  0,  0, 1, +1, 1,  7,   STATE_DATA },
+    {  +1,  0,  0,  0,  0, 1, +1, 1,  7,   STATE_SIGN },
+    {  +1, +2,  0,  0,  0, 1, +1, 2,  1,   STATE_DATA },
+    {  +1, +2,  0,  0,  0, 1, +1, 3,  0,  STATE_START },
+    {  +1, -2,  0,  0,  0, 1, +1, 2,  1,   STATE_DATA },
+    {  +1, -2,  0,  0,  0, 1, +1, 3,  0,  STATE_START },
+    {  +1,  0,  0,  0,  0, 1, +1, 2,  4, STATE_FOLLOW },
+    {  +1,  0,  0,  0,  0, 1, +1, 2,  5, STATE_FOLLOW },
+    {  +1,  0, +1,  0,  0, 1, +1, 3,  0,  STATE_START },
+    {  +1,  0, -1,  0,  0, 1, +1, 3,  0,  STATE_START },
+    {  +1,  0,  0,  0,  0, 1, +1, 2,  6, STATE_FOLLOW },
+    {  +1,  0,  0,  0,  0, 1, +1, 2,  7, STATE_FOLLOW },
+    {  +1,  0, +2,  0,  0, 1, +1, 3,  0,  STATE_START },
+    {  +1,  0, -2,  0,  0, 1, +1, 3,  0,  STATE_START },
+    {  +1,  0,  0,  0,  0, 1, +1, 3,  2,   STATE_DATA },
+    {  +1,  0,  0,  0,  0, 1, +1, 3,  2,   STATE_SIGN },
+    {  +1,  0,  0,  0,  0, 1, +1, 3,  3,   STATE_DATA },
+    {  +1,  0,  0,  0,  0, 1, +1, 3,  3,   STATE_SIGN },
+    {  +1,  0,  0,  0,  0, 1, +1, 4,  2, STATE_FOLLOW },
+    {  +1,  0,  0,  0,  0, 1, +1, 4,  3, STATE_FOLLOW },
+    {  +1,  0,  0,  0,  0, 1, +1, 5,  1,   STATE_DATA },
+    {  +1,  0,  0,  0,  0, 1, +1, 6,  0,  STATE_START },
+    {  +1,  0,  0,  0,  0, 1, -1, 1,  4,   STATE_DATA },
+    {  +1,  0,  0,  0,  0, 1, -1, 1,  4,   STATE_SIGN },
+    {  +1,  0,  0,  0,  0, 1, -1, 1,  5,   STATE_DATA },
+    {  +1,  0,  0,  0,  0, 1, -1, 1,  5,   STATE_SIGN },
+    {  +1, +1,  0,  0,  0, 1, -1, 2,  1,   STATE_DATA },
+    {  +1, +1,  0,  0,  0, 1, -1, 3,  0,  STATE_START },
+    {  +1, -1,  0,  0,  0, 1, -1, 2,  1,   STATE_DATA },
+    {  +1, -1,  0,  0,  0, 1, -1, 3,  0,  STATE_START },
+    {  +1,  0,  0,  0,  0, 1, -1, 1,  6,   STATE_DATA },
+    {  +1,  0,  0,  0,  0, 1, -1, 1,  6,   STATE_SIGN },
+    {  +1,  0,  0,  0,  0, 1, -1, 1,  7,   STATE_DATA },
+    {  +1,  0,  0,  0,  0, 1, -1, 1,  7,   STATE_SIGN },
+    {  +1, +2,  0,  0,  0, 1, -1, 2,  1,   STATE_DATA },
+    {  +1, +2,  0,  0,  0, 1, -1, 3,  0,  STATE_START },
+    {  +1, -2,  0,  0,  0, 1, -1, 2,  1,   STATE_DATA },
+    {  +1, -2,  0,  0,  0, 1, -1, 3,  0,  STATE_START },
+    {  +1,  0,  0,  0,  0, 1, -1, 2,  4, STATE_FOLLOW },
+    {  +1,  0,  0,  0,  0, 1, -1, 2,  5, STATE_FOLLOW },
+    {  +1,  0, +1,  0,  0, 1, -1, 3,  0,  STATE_START },
+    {  +1,  0, -1,  0,  0, 1, -1, 3,  0,  STATE_START },
+    {  +1,  0,  0,  0,  0, 1, -1, 2,  6, STATE_FOLLOW },
+    {  +1,  0,  0,  0,  0, 1, -1, 2,  7, STATE_FOLLOW },
+    {  +1,  0, +2,  0,  0, 1, -1, 3,  0,  STATE_START },
+    {  +1,  0, -2,  0,  0, 1, -1, 3,  0,  STATE_START },
+    {  +1,  0,  0,  0,  0, 1, -1, 3,  2,   STATE_DATA },
+    {  +1,  0,  0,  0,  0, 1, -1, 3,  2,   STATE_SIGN },
+    {  +1,  0,  0,  0,  0, 1, -1, 3,  3,   STATE_DATA },
+    {  +1,  0,  0,  0,  0, 1, -1, 3,  3,   STATE_SIGN },
+    {  +1,  0,  0,  0,  0, 1, -1, 4,  2, STATE_FOLLOW },
+    {  +1,  0,  0,  0,  0, 1, -1, 4,  3, STATE_FOLLOW },
+    {  +1,  0,  0,  0,  0, 1, -1, 5,  1,   STATE_DATA },
+    {  +1,  0,  0,  0,  0, 1, -1, 6,  0,  STATE_START },
+    {   0,  0,  0,  0,  0, 0, +1, 1,  8,   STATE_DATA },
+    {   0,  0,  0,  0,  0, 0, +1, 1,  8,   STATE_SIGN },
+    {   0,  0,  0,  0,  0, 0, +1, 1,  9,   STATE_DATA },
+    {   0,  0,  0,  0,  0, 0, +1, 1,  9,   STATE_SIGN },
+    {   0, +3,  0,  0,  0, 0, +1, 2,  1,   STATE_DATA },
+    {   0, +3,  0,  0,  0, 0, +1, 3,  0,  STATE_START },
+    {   0, -3,  0,  0,  0, 0, +1, 2,  1,   STATE_DATA },
+    {   0, -3,  0,  0,  0, 0, +1, 3,  0,  STATE_START },
+    {   0,  0,  0,  0,  0, 0, +1, 1, 10,   STATE_DATA },
+    {   0,  0,  0,  0,  0, 0, +1, 1, 10,   STATE_SIGN },
+    {   0,  0,  0,  0,  0, 0, +1, 1, 11,   STATE_DATA },
+    {   0,  0,  0,  0,  0, 0, +1, 1, 11,   STATE_SIGN },
+    {   0, +4,  0,  0,  0, 0, +1, 2,  1,   STATE_DATA },
+    {   0, +4,  0,  0,  0, 0, +1, 3,  0,  STATE_START },
+    {   0, -4,  0,  0,  0, 0, +1, 2,  1,   STATE_DATA },
+    {   0, -4,  0,  0,  0, 0, +1, 3,  0,  STATE_START },
+    {   0, +1,  0,  0,  0, 0, +1, 2,  2,   STATE_DATA },
+    {   0, +1,  0,  0,  0, 0, +1, 2,  2,   STATE_SIGN },
+    {   0, +1,  0,  0,  0, 0, +1, 2,  3,   STATE_DATA },
+    {   0, +1,  0,  0,  0, 0, +1, 2,  3,   STATE_SIGN },
+    {   0, +1,  0,  0,  0, 0, +1, 3,  2, STATE_FOLLOW },
+    {   0, +1,  0,  0,  0, 0, +1, 3,  3, STATE_FOLLOW },
+    {   0, +1,  0,  0,  0, 0, +1, 4,  1,   STATE_DATA },
+    {   0, +1,  0,  0,  0, 0, +1, 5,  0,  STATE_START },
+    {   0, -1,  0,  0,  0, 0, +1, 2,  2,   STATE_DATA },
+    {   0, -1,  0,  0,  0, 0, +1, 2,  2,   STATE_SIGN },
+    {   0, -1,  0,  0,  0, 0, +1, 2,  3,   STATE_DATA },
+    {   0, -1,  0,  0,  0, 0, +1, 2,  3,   STATE_SIGN },
+    {   0, -1,  0,  0,  0, 0, +1, 3,  2, STATE_FOLLOW },
+    {   0, -1,  0,  0,  0, 0, +1, 3,  3, STATE_FOLLOW },
+    {   0, -1,  0,  0,  0, 0, +1, 4,  1,   STATE_DATA },
+    {   0, -1,  0,  0,  0, 0, +1, 5,  0,  STATE_START },
+    {   0,  0,  0,  0,  0, 0, +1, 1, 12,   STATE_DATA },
+    {   0,  0,  0,  0,  0, 0, +1, 1, 12,   STATE_SIGN },
+    {   0,  0,  0,  0,  0, 0, +1, 1, 13,   STATE_DATA },
+    {   0,  0,  0,  0,  0, 0, +1, 1, 13,   STATE_SIGN },
+    {   0, +5,  0,  0,  0, 0, +1, 2,  1,   STATE_DATA },
+    {   0, +5,  0,  0,  0, 0, +1, 3,  0,  STATE_START },
+    {   0, -5,  0,  0,  0, 0, +1, 2,  1,   STATE_DATA },
+    {   0, -5,  0,  0,  0, 0, +1, 3,  0,  STATE_START },
+    {   0,  0,  0,  0,  0, 0, +1, 1, 14,   STATE_DATA },
+    {   0,  0,  0,  0,  0, 0, +1, 1, 14,   STATE_SIGN },
+    {   0,  0,  0,  0,  0, 0, +1, 1, 15,   STATE_DATA },
+    {   0,  0,  0,  0,  0, 0, +1, 1, 15,   STATE_SIGN },
+    {   0, +6,  0,  0,  0, 0, +1, 2,  1,   STATE_DATA },
+    {   0, +6,  0,  0,  0, 0, +1, 3,  0,  STATE_START },
+    {   0, -6,  0,  0,  0, 0, +1, 2,  1,   STATE_DATA },
+    {   0, -6,  0,  0,  0, 0, +1, 3,  0,  STATE_START },
+    {   0, +2,  0,  0,  0, 0, +1, 2,  2,   STATE_DATA },
+    {   0, +2,  0,  0,  0, 0, +1, 2,  2,   STATE_SIGN },
+    {   0, +2,  0,  0,  0, 0, +1, 2,  3,   STATE_DATA },
+    {   0, +2,  0,  0,  0, 0, +1, 2,  3,   STATE_SIGN },
+    {   0, +2,  0,  0,  0, 0, +1, 3,  2, STATE_FOLLOW },
+    {   0, +2,  0,  0,  0, 0, +1, 3,  3, STATE_FOLLOW },
+    {   0, +2,  0,  0,  0, 0, +1, 4,  1,   STATE_DATA },
+    {   0, +2,  0,  0,  0, 0, +1, 5,  0,  STATE_START },
+    {   0, -2,  0,  0,  0, 0, +1, 2,  2,   STATE_DATA },
+    {   0, -2,  0,  0,  0, 0, +1, 2,  2,   STATE_SIGN },
+    {   0, -2,  0,  0,  0, 0, +1, 2,  3,   STATE_DATA },
+    {   0, -2,  0,  0,  0, 0, +1, 2,  3,   STATE_SIGN },
+    {   0, -2,  0,  0,  0, 0, +1, 3,  2, STATE_FOLLOW },
+    {   0, -2,  0,  0,  0, 0, +1, 3,  3, STATE_FOLLOW },
+    {   0, -2,  0,  0,  0, 0, +1, 4,  1,   STATE_DATA },
+    {   0, -2,  0,  0,  0, 0, +1, 5,  0,  STATE_START },
+    {   0,  0,  0,  0,  0, 0, +1, 2,  8, STATE_FOLLOW },
+    {   0,  0,  0,  0,  0, 0, +1, 2,  9, STATE_FOLLOW },
+    {   0,  0, +3,  0,  0, 0, +1, 3,  0,  STATE_START },
+    {   0,  0, -3,  0,  0, 0, +1, 3,  0,  STATE_START },
+    {   0,  0,  0,  0,  0, 0, +1, 2, 10, STATE_FOLLOW },
+    {   0,  0,  0,  0,  0, 0, +1, 2, 11, STATE_FOLLOW },
+    {   0,  0, +4,  0,  0, 0, +1, 3,  0,  STATE_START },
+    {   0,  0, -4,  0,  0, 0, +1, 3,  0,  STATE_START },
+    {   0,  0, +1,  0,  0, 0, +1, 3,  2, STATE_FOLLOW },
+    {   0,  0, +1,  0,  0, 0, +1, 3,  3, STATE_FOLLOW },
+    {   0,  0, +1,  0,  0, 0, +1, 4,  1,   STATE_DATA },
+    {   0,  0, +1,  0,  0, 0, +1, 5,  0,  STATE_START },
+    {   0,  0, -1,  0,  0, 0, +1, 3,  2, STATE_FOLLOW },
+    {   0,  0, -1,  0,  0, 0, +1, 3,  3, STATE_FOLLOW },
+    {   0,  0, -1,  0,  0, 0, +1, 4,  1,   STATE_DATA },
+    {   0,  0, -1,  0,  0, 0, +1, 5,  0,  STATE_START },
+    {   0,  0,  0,  0,  0, 0, +1, 2, 12, STATE_FOLLOW },
+    {   0,  0,  0,  0,  0, 0, +1, 2, 13, STATE_FOLLOW },
+    {   0,  0, +5,  0,  0, 0, +1, 3,  0,  STATE_START },
+    {   0,  0, -5,  0,  0, 0, +1, 3,  0,  STATE_START },
+    {   0,  0,  0,  0,  0, 0, +1, 2, 14, STATE_FOLLOW },
+    {   0,  0,  0,  0,  0, 0, +1, 2, 15, STATE_FOLLOW },
+    {   0,  0, +6,  0,  0, 0, +1, 3,  0,  STATE_START },
+    {   0,  0, -6,  0,  0, 0, +1, 3,  0,  STATE_START },
+    {   0,  0, +2,  0,  0, 0, +1, 3,  2, STATE_FOLLOW },
+    {   0,  0, +2,  0,  0, 0, +1, 3,  3, STATE_FOLLOW },
+    {   0,  0, +2,  0,  0, 0, +1, 4,  1,   STATE_DATA },
+    {   0,  0, +2,  0,  0, 0, +1, 5,  0,  STATE_START },
+    {   0,  0, -2,  0,  0, 0, +1, 3,  2, STATE_FOLLOW },
+    {   0,  0, -2,  0,  0, 0, +1, 3,  3, STATE_FOLLOW },
+    {   0,  0, -2,  0,  0, 0, +1, 4,  1,   STATE_DATA },
+    {   0,  0, -2,  0,  0, 0, +1, 5,  0,  STATE_START },
+    {   0,  0,  0,  0,  0, 0, +1, 3,  4,   STATE_DATA },
+    {   0,  0,  0,  0,  0, 0, +1, 3,  4,   STATE_SIGN },
+    {   0,  0,  0,  0,  0, 0, +1, 3,  5,   STATE_DATA },
+    {   0,  0,  0,  0,  0, 0, +1, 3,  5,   STATE_SIGN },
+    {   0,  0,  0, +1,  0, 0, +1, 4,  1,   STATE_DATA },
+    {   0,  0,  0, +1,  0, 0, +1, 5,  0,  STATE_START },
+    {   0,  0,  0, -1,  0, 0, +1, 4,  1,   STATE_DATA },
+    {   0,  0,  0, -1,  0, 0, +1, 5,  0,  STATE_START },
+    {   0,  0,  0,  0,  0, 0, +1, 3,  6,   STATE_DATA },
+    {   0,  0,  0,  0,  0, 0, +1, 3,  6,   STATE_SIGN },
+    {   0,  0,  0,  0,  0, 0, +1, 3,  7,   STATE_DATA },
+    {   0,  0,  0,  0,  0, 0, +1, 3,  7,   STATE_SIGN },
+    {   0,  0,  0, +2,  0, 0, +1, 4,  1,   STATE_DATA },
+    {   0,  0,  0, +2,  0, 0, +1, 5,  0,  STATE_START },
+    {   0,  0,  0, -2,  0, 0, +1, 4,  1,   STATE_DATA },
+    {   0,  0,  0, -2,  0, 0, +1, 5,  0,  STATE_START },
+    {   0,  0,  0,  0,  0, 0, +1, 4,  4, STATE_FOLLOW },
+    {   0,  0,  0,  0,  0, 0, +1, 4,  5, STATE_FOLLOW },
+    {   0,  0,  0,  0, +1, 0, +1, 5,  0,  STATE_START },
+    {   0,  0,  0,  0, -1, 0, +1, 5,  0,  STATE_START },
+    {   0,  0,  0,  0,  0, 0, +1, 4,  6, STATE_FOLLOW },
+    {   0,  0,  0,  0,  0, 0, +1, 4,  7, STATE_FOLLOW },
+    {   0,  0,  0,  0, +2, 0, +1, 5,  0,  STATE_START },
+    {   0,  0,  0,  0, -2, 0, +1, 5,  0,  STATE_START },
+    {   0,  0,  0,  0,  0, 0, +1, 5,  2,   STATE_DATA },
+    {   0,  0,  0,  0,  0, 0, +1, 5,  2,   STATE_SIGN },
+    {   0,  0,  0,  0,  0, 0, +1, 5,  3,   STATE_DATA },
+    {   0,  0,  0,  0,  0, 0, +1, 5,  3,   STATE_SIGN },
+    {   0,  0,  0,  0,  0, 0, +1, 6,  2, STATE_FOLLOW },
+    {   0,  0,  0,  0,  0, 0, +1, 6,  3, STATE_FOLLOW },
+    {   0,  0,  0,  0,  0, 0, +1, 7,  1,   STATE_DATA },
+    {   0,  0,  0,  0,  0, 0, +1, 8,  0,  STATE_START },
+    {   0,  0,  0,  0,  0, 0, -1, 1,  8,   STATE_DATA },
+    {   0,  0,  0,  0,  0, 0, -1, 1,  8,   STATE_SIGN },
+    {   0,  0,  0,  0,  0, 0, -1, 1,  9,   STATE_DATA },
+    {   0,  0,  0,  0,  0, 0, -1, 1,  9,   STATE_SIGN },
+    {   0, +3,  0,  0,  0, 0, -1, 2,  1,   STATE_DATA },
+    {   0, +3,  0,  0,  0, 0, -1, 3,  0,  STATE_START },
+    {   0, -3,  0,  0,  0, 0, -1, 2,  1,   STATE_DATA },
+    {   0, -3,  0,  0,  0, 0, -1, 3,  0,  STATE_START },
+    {   0,  0,  0,  0,  0, 0, -1, 1, 10,   STATE_DATA },
+    {   0,  0,  0,  0,  0, 0, -1, 1, 10,   STATE_SIGN },
+    {   0,  0,  0,  0,  0, 0, -1, 1, 11,   STATE_DATA },
+    {   0,  0,  0,  0,  0, 0, -1, 1, 11,   STATE_SIGN },
+    {   0, +4,  0,  0,  0, 0, -1, 2,  1,   STATE_DATA },
+    {   0, +4,  0,  0,  0, 0, -1, 3,  0,  STATE_START },
+    {   0, -4,  0,  0,  0, 0, -1, 2,  1,   STATE_DATA },
+    {   0, -4,  0,  0,  0, 0, -1, 3,  0,  STATE_START },
+    {   0, +1,  0,  0,  0, 0, -1, 2,  2,   STATE_DATA },
+    {   0, +1,  0,  0,  0, 0, -1, 2,  2,   STATE_SIGN },
+    {   0, +1,  0,  0,  0, 0, -1, 2,  3,   STATE_DATA },
+    {   0, +1,  0,  0,  0, 0, -1, 2,  3,   STATE_SIGN },
+    {   0, +1,  0,  0,  0, 0, -1, 3,  2, STATE_FOLLOW },
+    {   0, +1,  0,  0,  0, 0, -1, 3,  3, STATE_FOLLOW },
+    {   0, +1,  0,  0,  0, 0, -1, 4,  1,   STATE_DATA },
+    {   0, +1,  0,  0,  0, 0, -1, 5,  0,  STATE_START },
+    {   0, -1,  0,  0,  0, 0, -1, 2,  2,   STATE_DATA },
+    {   0, -1,  0,  0,  0, 0, -1, 2,  2,   STATE_SIGN },
+    {   0, -1,  0,  0,  0, 0, -1, 2,  3,   STATE_DATA },
+    {   0, -1,  0,  0,  0, 0, -1, 2,  3,   STATE_SIGN },
+    {   0, -1,  0,  0,  0, 0, -1, 3,  2, STATE_FOLLOW },
+    {   0, -1,  0,  0,  0, 0, -1, 3,  3, STATE_FOLLOW },
+    {   0, -1,  0,  0,  0, 0, -1, 4,  1,   STATE_DATA },
+    {   0, -1,  0,  0,  0, 0, -1, 5,  0,  STATE_START },
+    {   0,  0,  0,  0,  0, 0, -1, 1, 12,   STATE_DATA },
+    {   0,  0,  0,  0,  0, 0, -1, 1, 12,   STATE_SIGN },
+    {   0,  0,  0,  0,  0, 0, -1, 1, 13,   STATE_DATA },
+    {   0,  0,  0,  0,  0, 0, -1, 1, 13,   STATE_SIGN },
+    {   0, +5,  0,  0,  0, 0, -1, 2,  1,   STATE_DATA },
+    {   0, +5,  0,  0,  0, 0, -1, 3,  0,  STATE_START },
+    {   0, -5,  0,  0,  0, 0, -1, 2,  1,   STATE_DATA },
+    {   0, -5,  0,  0,  0, 0, -1, 3,  0,  STATE_START },
+    {   0,  0,  0,  0,  0, 0, -1, 1, 14,   STATE_DATA },
+    {   0,  0,  0,  0,  0, 0, -1, 1, 14,   STATE_SIGN },
+    {   0,  0,  0,  0,  0, 0, -1, 1, 15,   STATE_DATA },
+    {   0,  0,  0,  0,  0, 0, -1, 1, 15,   STATE_SIGN },
+    {   0, +6,  0,  0,  0, 0, -1, 2,  1,   STATE_DATA },
+    {   0, +6,  0,  0,  0, 0, -1, 3,  0,  STATE_START },
+    {   0, -6,  0,  0,  0, 0, -1, 2,  1,   STATE_DATA },
+    {   0, -6,  0,  0,  0, 0, -1, 3,  0,  STATE_START },
+    {   0, +2,  0,  0,  0, 0, -1, 2,  2,   STATE_DATA },
+    {   0, +2,  0,  0,  0, 0, -1, 2,  2,   STATE_SIGN },
+    {   0, +2,  0,  0,  0, 0, -1, 2,  3,   STATE_DATA },
+    {   0, +2,  0,  0,  0, 0, -1, 2,  3,   STATE_SIGN },
+    {   0, +2,  0,  0,  0, 0, -1, 3,  2, STATE_FOLLOW },
+    {   0, +2,  0,  0,  0, 0, -1, 3,  3, STATE_FOLLOW },
+    {   0, +2,  0,  0,  0, 0, -1, 4,  1,   STATE_DATA },
+    {   0, +2,  0,  0,  0, 0, -1, 5,  0,  STATE_START },
+    {   0, -2,  0,  0,  0, 0, -1, 2,  2,   STATE_DATA },
+    {   0, -2,  0,  0,  0, 0, -1, 2,  2,   STATE_SIGN },
+    {   0, -2,  0,  0,  0, 0, -1, 2,  3,   STATE_DATA },
+    {   0, -2,  0,  0,  0, 0, -1, 2,  3,   STATE_SIGN },
+    {   0, -2,  0,  0,  0, 0, -1, 3,  2, STATE_FOLLOW },
+    {   0, -2,  0,  0,  0, 0, -1, 3,  3, STATE_FOLLOW },
+    {   0, -2,  0,  0,  0, 0, -1, 4,  1,   STATE_DATA },
+    {   0, -2,  0,  0,  0, 0, -1, 5,  0,  STATE_START },
+    {   0,  0,  0,  0,  0, 0, -1, 2,  8, STATE_FOLLOW },
+    {   0,  0,  0,  0,  0, 0, -1, 2,  9, STATE_FOLLOW },
+    {   0,  0, +3,  0,  0, 0, -1, 3,  0,  STATE_START },
+    {   0,  0, -3,  0,  0, 0, -1, 3,  0,  STATE_START },
+    {   0,  0,  0,  0,  0, 0, -1, 2, 10, STATE_FOLLOW },
+    {   0,  0,  0,  0,  0, 0, -1, 2, 11, STATE_FOLLOW },
+    {   0,  0, +4,  0,  0, 0, -1, 3,  0,  STATE_START },
+    {   0,  0, -4,  0,  0, 0, -1, 3,  0,  STATE_START },
+    {   0,  0, +1,  0,  0, 0, -1, 3,  2, STATE_FOLLOW },
+    {   0,  0, +1,  0,  0, 0, -1, 3,  3, STATE_FOLLOW },
+    {   0,  0, +1,  0,  0, 0, -1, 4,  1,   STATE_DATA },
+    {   0,  0, +1,  0,  0, 0, -1, 5,  0,  STATE_START },
+    {   0,  0, -1,  0,  0, 0, -1, 3,  2, STATE_FOLLOW },
+    {   0,  0, -1,  0,  0, 0, -1, 3,  3, STATE_FOLLOW },
+    {   0,  0, -1,  0,  0, 0, -1, 4,  1,   STATE_DATA },
+    {   0,  0, -1,  0,  0, 0, -1, 5,  0,  STATE_START },
+    {   0,  0,  0,  0,  0, 0, -1, 2, 12, STATE_FOLLOW },
+    {   0,  0,  0,  0,  0, 0, -1, 2, 13, STATE_FOLLOW },
+    {   0,  0, +5,  0,  0, 0, -1, 3,  0,  STATE_START },
+    {   0,  0, -5,  0,  0, 0, -1, 3,  0,  STATE_START },
+    {   0,  0,  0,  0,  0, 0, -1, 2, 14, STATE_FOLLOW },
+    {   0,  0,  0,  0,  0, 0, -1, 2, 15, STATE_FOLLOW },
+    {   0,  0, +6,  0,  0, 0, -1, 3,  0,  STATE_START },
+    {   0,  0, -6,  0,  0, 0, -1, 3,  0,  STATE_START },
+    {   0,  0, +2,  0,  0, 0, -1, 3,  2, STATE_FOLLOW },
+    {   0,  0, +2,  0,  0, 0, -1, 3,  3, STATE_FOLLOW },
+    {   0,  0, +2,  0,  0, 0, -1, 4,  1,   STATE_DATA },
+    {   0,  0, +2,  0,  0, 0, -1, 5,  0,  STATE_START },
+    {   0,  0, -2,  0,  0, 0, -1, 3,  2, STATE_FOLLOW },
+    {   0,  0, -2,  0,  0, 0, -1, 3,  3, STATE_FOLLOW },
+    {   0,  0, -2,  0,  0, 0, -1, 4,  1,   STATE_DATA },
+    {   0,  0, -2,  0,  0, 0, -1, 5,  0,  STATE_START },
+    {   0,  0,  0,  0,  0, 0, -1, 3,  4,   STATE_DATA },
+    {   0,  0,  0,  0,  0, 0, -1, 3,  4,   STATE_SIGN },
+    {   0,  0,  0,  0,  0, 0, -1, 3,  5,   STATE_DATA },
+    {   0,  0,  0,  0,  0, 0, -1, 3,  5,   STATE_SIGN },
+    {   0,  0,  0, +1,  0, 0, -1, 4,  1,   STATE_DATA },
+    {   0,  0,  0, +1,  0, 0, -1, 5,  0,  STATE_START },
+    {   0,  0,  0, -1,  0, 0, -1, 4,  1,   STATE_DATA },
+    {   0,  0,  0, -1,  0, 0, -1, 5,  0,  STATE_START },
+    {   0,  0,  0,  0,  0, 0, -1, 3,  6,   STATE_DATA },
+    {   0,  0,  0,  0,  0, 0, -1, 3,  6,   STATE_SIGN },
+    {   0,  0,  0,  0,  0, 0, -1, 3,  7,   STATE_DATA },
+    {   0,  0,  0,  0,  0, 0, -1, 3,  7,   STATE_SIGN },
+    {   0,  0,  0, +2,  0, 0, -1, 4,  1,   STATE_DATA },
+    {   0,  0,  0, +2,  0, 0, -1, 5,  0,  STATE_START },
+    {   0,  0,  0, -2,  0, 0, -1, 4,  1,   STATE_DATA },
+    {   0,  0,  0, -2,  0, 0, -1, 5,  0,  STATE_START },
+    {   0,  0,  0,  0,  0, 0, -1, 4,  4, STATE_FOLLOW },
+    {   0,  0,  0,  0,  0, 0, -1, 4,  5, STATE_FOLLOW },
+    {   0,  0,  0,  0, +1, 0, -1, 5,  0,  STATE_START },
+    {   0,  0,  0,  0, -1, 0, -1, 5,  0,  STATE_START },
+    {   0,  0,  0,  0,  0, 0, -1, 4,  6, STATE_FOLLOW },
+    {   0,  0,  0,  0,  0, 0, -1, 4,  7, STATE_FOLLOW },
+    {   0,  0,  0,  0, +2, 0, -1, 5,  0,  STATE_START },
+    {   0,  0,  0,  0, -2, 0, -1, 5,  0,  STATE_START },
+    {   0,  0,  0,  0,  0, 0, -1, 5,  2,   STATE_DATA },
+    {   0,  0,  0,  0,  0, 0, -1, 5,  2,   STATE_SIGN },
+    {   0,  0,  0,  0,  0, 0, -1, 5,  3,   STATE_DATA },
+    {   0,  0,  0,  0,  0, 0, -1, 5,  3,   STATE_SIGN },
+    {   0,  0,  0,  0,  0, 0, -1, 6,  2, STATE_FOLLOW },
+    {   0,  0,  0,  0,  0, 0, -1, 6,  3, STATE_FOLLOW },
+    {   0,  0,  0,  0,  0, 0, -1, 7,  1,   STATE_DATA },
+    {   0,  0,  0,  0,  0, 0, -1, 8,  0,  STATE_START },
+};
 
-#define SET_RESIDUE(N, I, B)                                                   \
-    N          = CONVERT_TO_RESIDUE(I, B);                                     \
-    N ## _bits = B
+#define PROCESS_VALS                                   \
+    do {                                               \
+        val  <<= lut.val0_bits;                        \
+        val   |= lut.val0;                             \
+        dst[0] = (val - 1) * lut.sign;                 \
+        dst[1] = lut.val1;                             \
+        dst[2] = lut.val2;                             \
+        dst[3] = lut.val3;                             \
+        dst[4] = lut.val4;                             \
+        dst[5] = 0;                                    \
+        dst[6] = 0;                                    \
+        dst[7] = 0;                                    \
+        if (lut.num)                                   \
+            val = lut.val;                             \
+        dst += lut.num;                                \
+        if (dst >= last)                               \
+            return coeffs;                             \
+        lut = ff_dirac_golomb_lut[lut.state + *buf++]; \
+    } while (0)
 
-#define APPEND_RESIDUE(N, M)                                                   \
-    N          |= M >> (N ## _bits);                                           \
-    N ## _bits  = (N ## _bits + (M ## _bits)) & 0x3F
-
-int ff_dirac_golomb_read_32bit(DiracGolombLUT *lut_ctx, const uint8_t *buf,
-                               int bytes, uint8_t *_dst, int coeffs)
+int ff_dirac_golomb_read_16bit(const uint8_t *buf, int bytes,
+                               uint8_t *_dst, int coeffs)
 {
-    int i, b, c_idx = 0;
-    int32_t *dst = (int32_t *)_dst;
-    DiracGolombLUT *future[4], *l = &lut_ctx[2*LUT_SIZE + buf[0]];
-    INIT_RESIDUE(res);
+    LUTState lut = ff_dirac_golomb_lut[*buf++];
+    int16_t *dst = (int16_t *)_dst, *last = dst + coeffs;
+    int16_t val = 0;
 
-    for (b = 1; b <= bytes; b++) {
-        future[0] = &lut_ctx[buf[b]];
-        future[1] = future[0] + 1*LUT_SIZE;
-        future[2] = future[0] + 2*LUT_SIZE;
-        future[3] = future[0] + 3*LUT_SIZE;
+    for (int i = 1; i < bytes; i++)
+        PROCESS_VALS;
 
-        if ((c_idx + 1) > coeffs)
-            return c_idx;
+    /* Reader needs to be flushed */
+    PROCESS_VALS;
 
-        /* res_bits is a hint for better branch prediction */
-        if (res_bits && l->sign) {
-            int32_t coeff = 1;
-            APPEND_RESIDUE(res, l->preamble);
-            for (i = 0; i < (res_bits >> 1) - 1; i++) {
-                coeff <<= 1;
-                coeff |= (res >> (RSIZE_BITS - 2*i - 2)) & 1;
-            }
-            dst[c_idx++] = l->sign * (coeff - 1);
-            res_bits = res = 0;
-        }
+    /* Still short of coeffs - try to guess and at least output what we have */
+    if (lut.state != STATE_START)
+        *dst++ = -((lut.state != STATE_SIGN ? (val << 1) | 1 : val) - 1);
 
-        memcpy(&dst[c_idx], l->ready, LUT_BITS*sizeof(int32_t));
-        c_idx += l->ready_num;
-
-        APPEND_RESIDUE(res, l->leftover);
-
-        l = future[l->need_s ? 3 : !res_bits ? 2 : res_bits & 1];
-    }
-
-    return c_idx;
+    return coeffs - (int)(last - dst);
 }
 
-int ff_dirac_golomb_read_16bit(DiracGolombLUT *lut_ctx, const uint8_t *buf,
-                               int bytes, uint8_t *_dst, int coeffs)
+int ff_dirac_golomb_read_32bit(const uint8_t *buf, int bytes,
+                               uint8_t *_dst, int coeffs)
 {
-    int i, b, c_idx = 0;
-    int16_t *dst = (int16_t *)_dst;
-    DiracGolombLUT *future[4], *l = &lut_ctx[2*LUT_SIZE + buf[0]];
-    INIT_RESIDUE(res);
+    LUTState lut = ff_dirac_golomb_lut[*buf++];
+    int32_t *dst = (int32_t *)_dst, *last = dst + coeffs;
+    int32_t val = 0;
 
-    for (b = 1; b <= bytes; b++) {
-        future[0] = &lut_ctx[buf[b]];
-        future[1] = future[0] + 1*LUT_SIZE;
-        future[2] = future[0] + 2*LUT_SIZE;
-        future[3] = future[0] + 3*LUT_SIZE;
+    for (int i = 1; i < bytes; i++)
+        PROCESS_VALS;
 
-        if ((c_idx + 1) > coeffs)
-            return c_idx;
+    /* Reader needs to be flushed */
+    PROCESS_VALS;
 
-        if (res_bits && l->sign) {
-            int32_t coeff = 1;
-            APPEND_RESIDUE(res, l->preamble);
-            for (i = 0; i < (res_bits >> 1) - 1; i++) {
-                coeff <<= 1;
-                coeff |= (res >> (RSIZE_BITS - 2*i - 2)) & 1;
-            }
-            dst[c_idx++] = l->sign * (coeff - 1);
-            res_bits = res = 0;
-        }
+    /* Still short of coeffs - try to guess and at least output what we have */
+    if (lut.state != STATE_START)
+        *dst++ = -((lut.state != STATE_SIGN ? (val << 1) | 1 : val) - 1);
 
-        for (i = 0; i < LUT_BITS; i++)
-            dst[c_idx + i] = l->ready[i];
-        c_idx += l->ready_num;
-
-        APPEND_RESIDUE(res, l->leftover);
-
-        l = future[l->need_s ? 3 : !res_bits ? 2 : res_bits & 1];
-    }
-
-    return c_idx;
-}
-
-/* Searches for golomb codes in a residue */
-static inline void search_for_golomb(DiracGolombLUT *l, residual r, int bits)
-{
-    int r_count = RSIZE_BITS - 1;
-    int bits_start, bits_tot = bits, need_sign = 0;
-
-#define READ_BIT(N) (((N) >> (N ## _count--)) & 1)
-
-    while (1) {
-        int32_t coef = 1;
-        bits_start = (RSIZE_BITS - 1) - r_count;
-
-        while (1) {
-            if (!bits--)
-                goto leftover;
-            if (READ_BIT(r))
-                break;
-
-            coef <<= 1;
-
-            if (!bits--)
-                goto leftover;
-            coef |= READ_BIT(r);
-        }
-
-        l->ready[l->ready_num] = coef - 1;
-        if (l->ready[l->ready_num]) {
-            if (!bits--) {
-                need_sign = 1;
-                goto leftover;
-            }
-            l->ready[l->ready_num] *= READ_BIT(r) ? -1 : +1;
-        }
-        l->ready_num++;
-
-        if (!bits)
-            return;
-    }
-
-    leftover:
-        l->leftover      = r << bits_start;
-        l->leftover_bits = bits_tot - bits_start;
-        l->need_s        = need_sign;
-}
-
-/* Parity LUTs - even and odd bit end positions */
-static void generate_parity_lut(DiracGolombLUT *lut, int even)
-{
-    int idx;
-    for (idx = 0; idx < LUT_SIZE; idx++) {
-        DiracGolombLUT *l = &lut[idx];
-        int symbol_end_loc = -1;
-        uint32_t code;
-        int i;
-
-        INIT_RESIDUE(res);
-        SET_RESIDUE(res, idx, LUT_BITS);
-
-        for (i = 0; i < LUT_BITS; i++) {
-            const int cond = even ? (i & 1) : !(i & 1);
-            if (((res >> (RSIZE_BITS - i - 1)) & 1) && cond) {
-                symbol_end_loc = i + 2;
-                break;
-            }
-        }
-
-        if (symbol_end_loc < 0 || symbol_end_loc > LUT_BITS) {
-            l->preamble      = 0;
-            l->preamble_bits = 0;
-            l->leftover_bits = LUT_BITS;
-            l->leftover      = CONVERT_TO_RESIDUE(idx, l->leftover_bits);
-            if (even)
-                l->need_s    = idx & 1;
-            continue;
-        }
-
-        /* Gets bits 0 through to (symbol_end_loc - 1) inclusive */
-        code  = idx >> ((LUT_BITS - 1) - (symbol_end_loc - 1));
-        code &= ((1 << LUT_BITS) - 1) >> (LUT_BITS - symbol_end_loc);
-        l->preamble_bits = symbol_end_loc;
-        l->preamble      = CONVERT_TO_RESIDUE(code, l->preamble_bits);
-        l->sign = ((l->preamble >> (RSIZE_BITS - l->preamble_bits)) & 1) ? -1 : +1;
-
-        search_for_golomb(l, res << symbol_end_loc, LUT_BITS - symbol_end_loc);
-    }
-}
-
-/* Reset (off == 0) and needs-one-more-bit (off == 1) LUTs */
-static void generate_offset_lut(DiracGolombLUT *lut, int off)
-{
-    int idx;
-    for (idx = 0; idx < LUT_SIZE; idx++) {
-        DiracGolombLUT *l = &lut[idx];
-
-        INIT_RESIDUE(res);
-        SET_RESIDUE(res, idx, LUT_BITS);
-
-        l->preamble_bits = off;
-        if (off) {
-            l->preamble  = CONVERT_TO_RESIDUE(res >> (RSIZE_BITS - off), off);
-            l->sign      = ((l->preamble >> (RSIZE_BITS - l->preamble_bits)) & 1) ? -1 : +1;
-        } else {
-            l->preamble  = 0;
-            l->sign = 1;
-        }
-
-        search_for_golomb(l, res << off, LUT_BITS - off);
-    }
-}
-
-av_cold int ff_dirac_golomb_reader_init(DiracGolombLUT **lut_ctx)
-{
-    DiracGolombLUT *lut;
-
-    if (!(lut = av_calloc(4*LUT_SIZE, sizeof(DiracGolombLUT))))
-        return AVERROR(ENOMEM);
-
-    generate_parity_lut(&lut[0*LUT_SIZE], 0);
-    generate_parity_lut(&lut[1*LUT_SIZE], 1);
-    generate_offset_lut(&lut[2*LUT_SIZE], 0);
-    generate_offset_lut(&lut[3*LUT_SIZE], 1);
-
-    *lut_ctx = lut;
-
-    return 0;
-}
-
-av_cold void ff_dirac_golomb_reader_end(DiracGolombLUT **lut_ctx)
-{
-    av_freep(lut_ctx);
+    return coeffs - (int)(last - dst);
 }
diff --git a/libavcodec/dirac_vlc.h b/libavcodec/dirac_vlc.h
index 42ae41b..bfcfa13 100644
--- a/libavcodec/dirac_vlc.h
+++ b/libavcodec/dirac_vlc.h
@@ -1,7 +1,4 @@
 /*
- * Copyright (C) 2016 Open Broadcast Systems Ltd.
- * Author        2016 Rostislav Pehlivanov <rpehlivanov@obe.tv>
- *
  * This file is part of FFmpeg.
  *
  * FFmpeg is free software; you can redistribute it and/or
@@ -24,28 +21,9 @@
 
 #include "libavutil/avutil.h"
 
-/* Can be 32 bits wide for some performance gain on some machines, but it will
- * incorrectly decode very long coefficients (usually only 1 or 2 per frame) */
-typedef uint64_t residual;
-
-#define LUT_BITS 8
-
-/* Exactly 64 bytes */
-typedef struct DiracGolombLUT {
-    residual preamble, leftover;
-    int32_t  ready[LUT_BITS];
-    int32_t  preamble_bits, leftover_bits, ready_num;
-    int8_t   need_s, sign;
-} DiracGolombLUT;
-
-av_cold int ff_dirac_golomb_reader_init(DiracGolombLUT **lut_ctx);
-
-int ff_dirac_golomb_read_32bit(DiracGolombLUT *lut_ctx, const uint8_t *buf,
-                               int bytes, uint8_t *dst, int coeffs);
-
-int ff_dirac_golomb_read_16bit(DiracGolombLUT *lut_ctx, const uint8_t *buf,
-                               int bytes, uint8_t *_dst, int coeffs);
-
-av_cold void ff_dirac_golomb_reader_end(DiracGolombLUT **lut_ctx);
+int ff_dirac_golomb_read_16bit(const uint8_t *buf, int bytes,
+                               uint8_t *_dst, int coeffs);
+int ff_dirac_golomb_read_32bit(const uint8_t *buf, int bytes,
+                               uint8_t *_dst, int coeffs);
 
 #endif /* AVCODEC_DIRAC_VLC_H */
diff --git a/libavcodec/diracdec.c b/libavcodec/diracdec.c
index af561d1..ed42bc3 100644
--- a/libavcodec/diracdec.c
+++ b/libavcodec/diracdec.c
@@ -136,7 +136,6 @@
     MpegvideoEncDSPContext mpvencdsp;
     VideoDSPContext vdsp;
     DiracDSPContext diracdsp;
-    DiracGolombLUT *reader_ctx;
     DiracVersionInfo version;
     GetBitContext gb;
     AVDiracSeqHeader seq;
@@ -395,7 +394,6 @@
     s->threads_num_buf = -1;
     s->thread_buf_size = -1;
 
-    ff_dirac_golomb_reader_init(&s->reader_ctx);
     ff_diracdsp_init(&s->diracdsp);
     ff_mpegvideoencdsp_init(&s->mpvencdsp, avctx);
     ff_videodsp_init(&s->vdsp, 8);
@@ -428,8 +426,6 @@
     DiracContext *s = avctx->priv_data;
     int i;
 
-    ff_dirac_golomb_reader_end(&s->reader_ctx);
-
     dirac_decode_flush(avctx);
     for (i = 0; i < MAX_FRAMES; i++)
         av_frame_free(&s->all_frames[i].avframe);
@@ -537,6 +533,8 @@
     buf = b->ibuf + top * b->stride;
     if (is_arith) {
         for (y = top; y < bottom; y++) {
+            if (c->error)
+                return c->error;
             for (x = left; x < right; x++) {
                 if (b->pshift) {
                     coeff_unpack_arith_10(c, qfactor, qoffset, b, (int32_t*)(buf)+x, x, y);
@@ -676,9 +674,17 @@
             b->length = get_interleaved_ue_golomb(&s->gb);
             if (b->length) {
                 b->quant = get_interleaved_ue_golomb(&s->gb);
+                if (b->quant > (DIRAC_MAX_QUANT_INDEX - 1)) {
+                    av_log(s->avctx, AV_LOG_ERROR, "Unsupported quant %d\n", b->quant);
+                    b->quant = 0;
+                    return AVERROR_INVALIDDATA;
+                }
                 align_get_bits(&s->gb);
                 b->coeff_data = s->gb.buffer + get_bits_count(&s->gb)/8;
-                b->length = FFMIN(b->length, FFMAX(get_bits_left(&s->gb)/8, 0));
+                if (b->length > FFMAX(get_bits_left(&s->gb)/8, 0)) {
+                    b->length = FFMAX(get_bits_left(&s->gb)/8, 0);
+                    damaged_count ++;
+                }
                 skip_bits_long(&s->gb, b->length*8);
             }
         }
@@ -871,11 +877,11 @@
         coef_num = subband_coeffs(s, slice->slice_x, slice->slice_y, i, coeffs_num);
 
         if (s->pshift)
-            coef_par = ff_dirac_golomb_read_32bit(s->reader_ctx, addr,
-                                                  length, tmp_buf, coef_num);
+            coef_par = ff_dirac_golomb_read_32bit(addr, length,
+                                                  tmp_buf, coef_num);
         else
-            coef_par = ff_dirac_golomb_read_16bit(s->reader_ctx, addr,
-                                                  length, tmp_buf, coef_num);
+            coef_par = ff_dirac_golomb_read_16bit(addr, length,
+                                                  tmp_buf, coef_num);
 
         if (coef_num > coef_par) {
             const int start_b = coef_par * (1 << (s->pshift + 1));
@@ -1266,7 +1272,9 @@
         s->num_y        = get_interleaved_ue_golomb(gb);
         if (s->num_x * s->num_y == 0 || s->num_x * (uint64_t)s->num_y > INT_MAX ||
             s->num_x * (uint64_t)s->avctx->width  > INT_MAX ||
-            s->num_y * (uint64_t)s->avctx->height > INT_MAX
+            s->num_y * (uint64_t)s->avctx->height > INT_MAX ||
+            s->num_x > s->avctx->width ||
+            s->num_y > s->avctx->height
         ) {
             av_log(s->avctx,AV_LOG_ERROR,"Invalid numx/y\n");
             s->num_x = s->num_y = 0;
@@ -1422,9 +1430,9 @@
     int *b      = s->globalmc[ref].pan_tilt;
     int *c      = s->globalmc[ref].perspective;
 
-    int m       = (1<<ep) - (c[0]*x + c[1]*y);
-    int64_t mx  = m * (int64_t)((A[0][0] * (int64_t)x + A[0][1]*(int64_t)y) + (1<<ez) * b[0]);
-    int64_t my  = m * (int64_t)((A[1][0] * (int64_t)x + A[1][1]*(int64_t)y) + (1<<ez) * b[1]);
+    int64_t m   = (1<<ep) - (c[0]*(int64_t)x + c[1]*(int64_t)y);
+    int64_t mx  = m * (int64_t)((A[0][0] * (int64_t)x + A[0][1]*(int64_t)y) + (1LL<<ez) * b[0]);
+    int64_t my  = m * (int64_t)((A[1][0] * (int64_t)x + A[1][1]*(int64_t)y) + (1LL<<ez) * b[1]);
 
     block->u.mv[ref][0] = (mx + (1<<(ez+ep))) >> (ez+ep);
     block->u.mv[ref][1] = (my + (1<<(ez+ep))) >> (ez+ep);
@@ -1541,6 +1549,11 @@
                 }
         }
 
+    for (i = 0; i < 4 + 2*s->num_refs; i++) {
+        if (arith[i].error)
+            return arith[i].error;
+    }
+
     return 0;
 }
 
@@ -2130,7 +2143,7 @@
             return ret;
         }
 
-        if (CALC_PADDING((int64_t)dsh->width, MAX_DWT_LEVELS) * CALC_PADDING((int64_t)dsh->height, MAX_DWT_LEVELS) > avctx->max_pixels)
+        if (CALC_PADDING((int64_t)dsh->width, MAX_DWT_LEVELS) * CALC_PADDING((int64_t)dsh->height, MAX_DWT_LEVELS) * 5LL > avctx->max_pixels)
             ret = AVERROR(ERANGE);
         if (ret >= 0)
             ret = ff_set_dimensions(avctx, dsh->width, dsh->height);
diff --git a/libavcodec/dnxhd_parser.c b/libavcodec/dnxhd_parser.c
index 7c16e25..63b4ff8 100644
--- a/libavcodec/dnxhd_parser.c
+++ b/libavcodec/dnxhd_parser.c
@@ -79,10 +79,9 @@
                     if (remaining <= 0)
                         continue;
                 }
+                remaining += i - 47;
                 dctx->remaining = remaining;
-                if (buf_size - i + 47 >= dctx->remaining) {
-                    int remaining = dctx->remaining;
-
+                if (buf_size >= dctx->remaining) {
                     pc->frame_start_found = 0;
                     pc->state64 = -1;
                     dctx->cur_byte = 0;
@@ -90,6 +89,10 @@
                     return remaining;
                 } else {
                     dctx->remaining -= buf_size;
+                    // Update variables for correctness, they are currently not used beyond here
+                    state = -1;
+                    dctx->cur_byte += buf_size - i;
+                    break;
                 }
             }
         }
diff --git a/libavcodec/dnxhddec.c b/libavcodec/dnxhddec.c
index ae8b0ff..e5d01e2 100644
--- a/libavcodec/dnxhddec.c
+++ b/libavcodec/dnxhddec.c
@@ -25,7 +25,6 @@
  */
 
 #include "libavutil/imgutils.h"
-#include "libavutil/timer.h"
 #include "avcodec.h"
 #include "blockdsp.h"
 #define  UNCHECKED_BITSTREAM_READER 1
@@ -37,7 +36,7 @@
 #include "thread.h"
 
 typedef struct RowContext {
-    DECLARE_ALIGNED(16, int16_t, blocks)[12][64];
+    DECLARE_ALIGNED(32, int16_t, blocks)[12][64];
     int luma_scale[64];
     int chroma_scale[64];
     GetBitContext gb;
@@ -145,21 +144,6 @@
     return 0;
 }
 
-static av_cold int dnxhd_decode_init_thread_copy(AVCodecContext *avctx)
-{
-    DNXHDContext *ctx = avctx->priv_data;
-
-    ctx->avctx = avctx;
-    // make sure VLC tables will be loaded when cid is parsed
-    ctx->cid = -1;
-
-    ctx->rows = av_mallocz_array(avctx->thread_count, sizeof(RowContext));
-    if (!ctx->rows)
-        return AVERROR(ENOMEM);
-
-    return 0;
-}
-
 static int dnxhd_get_profile(int cid)
 {
     switch(cid) {
@@ -235,7 +219,14 @@
         av_log(ctx->avctx, AV_LOG_WARNING,
                "Adaptive MB interlace flag in an unsupported profile.\n");
 
-    ctx->act = buf[0x2C] & 7;
+    switch ((buf[0x2C] >> 1) & 3) {
+    case 0: frame->colorspace = AVCOL_SPC_BT709;       break;
+    case 1: frame->colorspace = AVCOL_SPC_BT2020_NCL;  break;
+    case 2: frame->colorspace = AVCOL_SPC_BT2020_CL;   break;
+    case 3: frame->colorspace = AVCOL_SPC_UNSPECIFIED; break;
+    }
+
+    ctx->act = buf[0x2C] & 1;
     if (ctx->act && ctx->cid_table->cid != 1256 && ctx->cid_table->cid != 1270)
         av_log(ctx->avctx, AV_LOG_WARNING,
                "Adaptive color transform in an unsupported profile.\n");
@@ -589,20 +580,22 @@
     const DNXHDContext *ctx = avctx->priv_data;
     uint32_t offset = ctx->mb_scan_index[rownb];
     RowContext *row = ctx->rows + threadnb;
-    int x;
+    int x, ret;
 
     row->last_dc[0] =
     row->last_dc[1] =
     row->last_dc[2] = 1 << (ctx->bit_depth + 2); // for levels +2^(bitdepth-1)
-    init_get_bits(&row->gb, ctx->buf + offset, (ctx->buf_size - offset) << 3);
+    ret = init_get_bits8(&row->gb, ctx->buf + offset, ctx->buf_size - offset);
+    if (ret < 0) {
+        row->errors++;
+        return ret;
+    }
     for (x = 0; x < ctx->mb_width; x++) {
-        //START_TIMER;
         int ret = dnxhd_decode_macroblock(ctx, row, data, x, rownb);
         if (ret < 0) {
             row->errors++;
             return ret;
         }
-        //STOP_TIMER("decode macroblock");
     }
 
     return 0;
@@ -732,6 +725,5 @@
     .decode         = dnxhd_decode_frame,
     .capabilities   = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_FRAME_THREADS |
                       AV_CODEC_CAP_SLICE_THREADS,
-    .init_thread_copy = ONLY_IF_THREADS_ENABLED(dnxhd_decode_init_thread_copy),
     .profiles       = NULL_IF_CONFIG_SMALL(ff_dnxhd_profiles),
 };
diff --git a/libavcodec/dnxhdenc.c b/libavcodec/dnxhdenc.c
index 41b8079..32ac90f 100644
--- a/libavcodec/dnxhdenc.c
+++ b/libavcodec/dnxhdenc.c
@@ -26,7 +26,6 @@
 #include "libavutil/attributes.h"
 #include "libavutil/internal.h"
 #include "libavutil/opt.h"
-#include "libavutil/timer.h"
 
 #include "avcodec.h"
 #include "blockdsp.h"
@@ -220,7 +219,7 @@
     ctx->vlc_bits  = ctx->orig_vlc_bits + max_level * 2;
     for (level = -max_level; level < max_level; level++) {
         for (run = 0; run < 2; run++) {
-            int index = (level << 1) | run;
+            int index = level * (1 << 1) | run;
             int sign, offset = 0, alevel = level;
 
             MASK_ABS(sign, alevel);
@@ -542,6 +541,8 @@
     if (avctx->active_thread_type == FF_THREAD_SLICE) {
         for (i = 1; i < avctx->thread_count; i++) {
             ctx->thread[i] = av_malloc(sizeof(DNXHDEncContext));
+            if (!ctx->thread[i])
+                goto fail;
             memcpy(ctx->thread[i], ctx, sizeof(DNXHDEncContext));
         }
     }
@@ -616,7 +617,7 @@
         slevel = block[j];
         if (slevel) {
             int run_level = i - last_non_zero - 1;
-            int rlevel = (slevel << 1) | !!run_level;
+            int rlevel = slevel * (1 << 1) | !!run_level;
             put_bits(&ctx->m.pb, ctx->vlc_bits[rlevel], ctx->vlc_codes[rlevel]);
             if (run_level)
                 put_bits(&ctx->m.pb, ctx->run_bits[run_level],
@@ -696,7 +697,7 @@
         level = block[j];
         if (level) {
             int run_level = i - last_non_zero - 1;
-            bits += ctx->vlc_bits[(level << 1) |
+            bits += ctx->vlc_bits[level * (1 << 1) |
                     !!run_level] + ctx->run_bits[run_level];
             last_non_zero = i;
         }
@@ -931,9 +932,8 @@
             int last_index = ctx->m.dct_quantize(&ctx->m, block,
                                                  ctx->is_444 ? (((i >> 1) % 3) < 1 ? 0 : 4): 4 & (2*i),
                                                  qscale, &overflow);
-            // START_TIMER;
+
             dnxhd_encode_block(ctx, block, last_index, n);
-            // STOP_TIMER("encode_block");
         }
     }
     if (put_bits_count(&ctx->m.pb) & 31)
diff --git a/libavcodec/dpcm.c b/libavcodec/dpcm.c
index 7d3934e..7078419 100644
--- a/libavcodec/dpcm.c
+++ b/libavcodec/dpcm.c
@@ -49,6 +49,21 @@
     const int8_t *sol_table;        ///< delta table for SOL_DPCM
 } DPCMContext;
 
+static const int32_t derf_steps[96] = {
+    0, 1, 2, 3, 4, 5, 6, 7,
+    8, 9, 10, 11, 12, 13, 14, 16,
+    17, 19, 21, 23, 25, 28, 31, 34,
+    37, 41, 45, 50, 55, 60, 66, 73,
+    80, 88, 97, 107, 118, 130, 143, 157,
+    173, 190, 209, 230, 253, 279, 307, 337,
+    371, 408, 449, 494, 544, 598, 658, 724,
+    796, 876, 963, 1060, 1166, 1282, 1411, 1552,
+    1707, 1878, 2066, 2272, 2499, 2749, 3024, 3327,
+    3660, 4026, 4428, 4871, 5358, 5894, 6484, 7132,
+    7845, 8630, 9493, 10442, 11487, 12635, 13899, 15289,
+    16818, 18500, 20350, 22385, 24623, 27086, 29794, 32767,
+};
+
 static const int16_t interplay_delta_table[] = {
          0,      1,      2,      3,      4,      5,      6,      7,
          8,      9,     10,     11,     12,     13,     14,     15,
@@ -225,6 +240,7 @@
         else
             out = buf_size;
         break;
+    case AV_CODEC_ID_DERF_DPCM:
     case AV_CODEC_ID_GREMLIN_DPCM:
     case AV_CODEC_ID_SDX2_DPCM:
         out = buf_size;
@@ -305,9 +321,8 @@
                 shift[ch] -= (2 * n);
             diff = sign_extend((diff &~ 3) << 8, 16);
 
-            /* saturate the shifter to a lower limit of 0 */
-            if (shift[ch] < 0)
-                shift[ch] = 0;
+            /* saturate the shifter to 0..31 */
+            shift[ch] = av_clip_uintp2(shift[ch], 5);
 
             diff >>= shift[ch];
             predictor[ch] += diff;
@@ -367,11 +382,26 @@
         while (output_samples < samples_end) {
             uint8_t n = bytestream2_get_byteu(&gb);
 
-            *output_samples++ = s->sample[idx] += s->array[n];
+            *output_samples++ = s->sample[idx] += (unsigned)s->array[n];
             idx ^= 1;
         }
         }
         break;
+
+    case AV_CODEC_ID_DERF_DPCM: {
+        int idx = 0;
+
+        while (output_samples < samples_end) {
+            uint8_t n = bytestream2_get_byteu(&gb);
+            int index = FFMIN(n & 0x7f, 95);
+
+            s->sample[idx] += (n & 0x80 ? -1: 1) * derf_steps[index];
+            s->sample[idx]  = av_clip_int16(s->sample[idx]);
+            *output_samples++ = s->sample[idx];
+            idx ^= stereo;
+        }
+        }
+        break;
     }
 
     *got_frame_ptr = 1;
@@ -391,6 +421,7 @@
     .capabilities   = AV_CODEC_CAP_DR1,                     \
 }
 
+DPCM_DECODER(AV_CODEC_ID_DERF_DPCM,      derf_dpcm,      "DPCM Xilam DERF");
 DPCM_DECODER(AV_CODEC_ID_GREMLIN_DPCM,   gremlin_dpcm,   "DPCM Gremlin");
 DPCM_DECODER(AV_CODEC_ID_INTERPLAY_DPCM, interplay_dpcm, "DPCM Interplay");
 DPCM_DECODER(AV_CODEC_ID_ROQ_DPCM,       roq_dpcm,       "DPCM id RoQ");
diff --git a/libavcodec/dpx.c b/libavcodec/dpx.c
index cf23bb6..b1833ed 100644
--- a/libavcodec/dpx.c
+++ b/libavcodec/dpx.c
@@ -19,6 +19,7 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
+#include "libavutil/avstring.h"
 #include "libavutil/intreadwrite.h"
 #include "libavutil/intfloat.h"
 #include "libavutil/imgutils.h"
@@ -50,8 +51,26 @@
     return temp;
 }
 
-static uint16_t read10in32(const uint8_t **ptr, uint32_t * lbuf,
-                                  int * n_datum, int is_big, int shift)
+static uint16_t read10in32_gray(const uint8_t **ptr, uint32_t *lbuf,
+                                int *n_datum, int is_big, int shift)
+{
+    uint16_t temp;
+
+    if (*n_datum)
+        (*n_datum)--;
+    else {
+        *lbuf = read32(ptr, is_big);
+        *n_datum = 2;
+    }
+
+    temp = *lbuf >> shift & 0x3FF;
+    *lbuf = *lbuf >> 10;
+
+    return temp;
+}
+
+static uint16_t read10in32(const uint8_t **ptr, uint32_t *lbuf,
+                           int *n_datum, int is_big, int shift)
 {
     if (*n_datum)
         (*n_datum)--;
@@ -65,8 +84,8 @@
     return *lbuf & 0x3FF;
 }
 
-static uint16_t read12in32(const uint8_t **ptr, uint32_t * lbuf,
-                                  int * n_datum, int is_big)
+static uint16_t read12in32(const uint8_t **ptr, uint32_t *lbuf,
+                           int *n_datum, int is_big)
 {
     if (*n_datum)
         (*n_datum)--;
@@ -106,6 +125,9 @@
     int buf_size       = avpkt->size;
     AVFrame *const p = data;
     uint8_t *ptr[AV_NUM_DATA_POINTERS];
+    uint32_t header_version, version = 0;
+    char creator[101];
+    char input_device[33];
 
     unsigned int offset;
     int magic_num, endian;
@@ -141,6 +163,15 @@
         return AVERROR_INVALIDDATA;
     }
 
+    header_version = read32(&buf, 0);
+    if (header_version == MKTAG('V','1','.','0'))
+        version = 1;
+    if (header_version == MKTAG('V','2','.','0'))
+        version = 2;
+    if (!version)
+        av_log(avctx, AV_LOG_WARNING, "Unknown header format version %s.\n",
+               av_fourcc2str(header_version));
+
     // Check encryption
     buf = avpkt->data + 660;
     ret = read32(&buf, endian);
@@ -310,6 +341,10 @@
     case 51121:
         avctx->pix_fmt = AV_PIX_FMT_GBRAP12;
         break;
+    case 6100:
+    case 6101:
+        avctx->pix_fmt = AV_PIX_FMT_GRAY10;
+        break;
     case 6161:
         avctx->pix_fmt = AV_PIX_FMT_GRAY16BE;
         break;
@@ -347,6 +382,14 @@
     if ((ret = ff_get_buffer(avctx, p, 0)) < 0)
         return ret;
 
+    av_strlcpy(creator, avpkt->data + 160, 100);
+    creator[100] = '\0';
+    av_dict_set(&p->metadata, "Creator", creator, 0);
+
+    av_strlcpy(input_device, avpkt->data + 1556, 32);
+    input_device[32] = '\0';
+    av_dict_set(&p->metadata, "Input Device", input_device, 0);
+
     // Move pointer to offset from start of file
     buf =  avpkt->data + offset;
 
@@ -360,20 +403,27 @@
                                 (uint16_t*)ptr[1],
                                 (uint16_t*)ptr[2],
                                 (uint16_t*)ptr[3]};
-            int shift = packing == 1 ? 22 : 20;
+            int shift = elements > 1 ? packing == 1 ? 22 : 20 : packing == 1 ? 2 : 0;
             for (y = 0; y < avctx->width; y++) {
-                *dst[2]++ = read10in32(&buf, &rgbBuffer,
-                                       &n_datum, endian, shift);
-                *dst[0]++ = read10in32(&buf, &rgbBuffer,
-                                       &n_datum, endian, shift);
-                *dst[1]++ = read10in32(&buf, &rgbBuffer,
-                                       &n_datum, endian, shift);
+                if (elements >= 3)
+                    *dst[2]++ = read10in32(&buf, &rgbBuffer,
+                                           &n_datum, endian, shift);
+                if (elements == 1)
+                    *dst[0]++ = read10in32_gray(&buf, &rgbBuffer,
+                                                &n_datum, endian, shift);
+                else
+                    *dst[0]++ = read10in32(&buf, &rgbBuffer,
+                                           &n_datum, endian, shift);
+                if (elements >= 2)
+                    *dst[1]++ = read10in32(&buf, &rgbBuffer,
+                                           &n_datum, endian, shift);
                 if (elements == 4)
                     *dst[3]++ =
                     read10in32(&buf, &rgbBuffer,
                                &n_datum, endian, shift);
             }
-            n_datum = 0;
+            if (memcmp(input_device, "Scanity", 7))
+                n_datum = 0;
             for (i = 0; i < elements; i++)
                 ptr[i] += p->linesize[i];
         }
diff --git a/libavcodec/dsd.c b/libavcodec/dsd.c
index 9104f38..d48f87f 100644
--- a/libavcodec/dsd.c
+++ b/libavcodec/dsd.c
@@ -53,26 +53,29 @@
 }
 
 void ff_dsd2pcm_translate(DSDContext* s, size_t samples, int lsbf,
-                          const unsigned char *src, ptrdiff_t src_stride,
+                          const uint8_t *src, ptrdiff_t src_stride,
                           float *dst, ptrdiff_t dst_stride)
 {
+    uint8_t buf[FIFOSIZE];
     unsigned pos, i;
-    unsigned char* p;
+    uint8_t* p;
     double sum;
 
     pos = s->pos;
 
+    memcpy(buf, s->buf, sizeof(buf));
+
     while (samples-- > 0) {
-        s->buf[pos] = lsbf ? ff_reverse[*src] : *src;
+        buf[pos] = lsbf ? ff_reverse[*src] : *src;
         src += src_stride;
 
-        p = s->buf + ((pos - CTABLES) & FIFOMASK);
+        p = buf + ((pos - CTABLES) & FIFOMASK);
         *p = ff_reverse[*p];
 
         sum = 0.0;
         for (i = 0; i < CTABLES; i++) {
-            unsigned char a = s->buf[(pos                   - i) & FIFOMASK];
-            unsigned char b = s->buf[(pos - (CTABLES*2 - 1) + i) & FIFOMASK];
+            uint8_t a = buf[(pos                   - i) & FIFOMASK];
+            uint8_t b = buf[(pos - (CTABLES*2 - 1) + i) & FIFOMASK];
             sum += ctables[i][a] + ctables[i][b];
         }
 
@@ -83,4 +86,5 @@
     }
 
     s->pos = pos;
+    memcpy(s->buf, buf, sizeof(buf));
 }
diff --git a/libavcodec/dsd.h b/libavcodec/dsd.h
index 5ca4574..ed09cb9 100644
--- a/libavcodec/dsd.h
+++ b/libavcodec/dsd.h
@@ -40,13 +40,13 @@
  * Per-channel buffer
  */
 typedef struct DSDContext {
-    unsigned char buf[FIFOSIZE];
+    uint8_t buf[FIFOSIZE];
     unsigned pos;
 } DSDContext;
 
 void ff_init_dsd_data(void);
 
 void ff_dsd2pcm_translate(DSDContext* s, size_t samples, int lsbf,
-                          const unsigned char *src, ptrdiff_t src_stride,
+                          const uint8_t *src, ptrdiff_t src_stride,
                           float *dst, ptrdiff_t dst_stride);
 #endif /* AVCODEC_DSD_H */
diff --git a/libavcodec/dsddec.c b/libavcodec/dsddec.c
index 2c5c357..7c3ae15 100644
--- a/libavcodec/dsddec.c
+++ b/libavcodec/dsddec.c
@@ -61,17 +61,20 @@
     return 0;
 }
 
-static int decode_frame(AVCodecContext *avctx, void *data,
-                        int *got_frame_ptr, AVPacket *avpkt)
-{
-    DSDContext * s = avctx->priv_data;
-    AVFrame *frame = data;
-    int ret, i;
-    int lsbf = avctx->codec_id == AV_CODEC_ID_DSD_LSBF || avctx->codec_id == AV_CODEC_ID_DSD_LSBF_PLANAR;
-    int src_next;
-    int src_stride;
+typedef struct ThreadData {
+    AVFrame *frame;
+    AVPacket *avpkt;
+} ThreadData;
 
-    frame->nb_samples = avpkt->size / avctx->channels;
+static int dsd_channel(AVCodecContext *avctx, void *tdata, int j, int threadnr)
+{
+    int lsbf = avctx->codec_id == AV_CODEC_ID_DSD_LSBF || avctx->codec_id == AV_CODEC_ID_DSD_LSBF_PLANAR;
+    DSDContext *s = avctx->priv_data;
+    ThreadData *td = tdata;
+    AVFrame *frame = td->frame;
+    AVPacket *avpkt = td->avpkt;
+    int src_next, src_stride;
+    float *dst = ((float **)frame->extended_data)[j];
 
     if (avctx->codec_id == AV_CODEC_ID_DSD_LSBF_PLANAR || avctx->codec_id == AV_CODEC_ID_DSD_MSBF_PLANAR) {
         src_next   = frame->nb_samples;
@@ -81,15 +84,28 @@
         src_stride = avctx->channels;
     }
 
+    ff_dsd2pcm_translate(&s[j], frame->nb_samples, lsbf,
+                         avpkt->data + j * src_next, src_stride,
+                         dst, 1);
+
+    return 0;
+}
+
+static int decode_frame(AVCodecContext *avctx, void *data,
+                        int *got_frame_ptr, AVPacket *avpkt)
+{
+    ThreadData td;
+    AVFrame *frame = data;
+    int ret;
+
+    frame->nb_samples = avpkt->size / avctx->channels;
+
     if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
         return ret;
 
-    for (i = 0; i < avctx->channels; i++) {
-        float * dst = ((float **)frame->extended_data)[i];
-        ff_dsd2pcm_translate(&s[i], frame->nb_samples, lsbf,
-            avpkt->data + i * src_next, src_stride,
-            dst, 1);
-    }
+    td.frame = frame;
+    td.avpkt = avpkt;
+    avctx->execute2(avctx, dsd_channel, &td, NULL, avctx->channels);
 
     *got_frame_ptr = 1;
     return frame->nb_samples * avctx->channels;
@@ -103,6 +119,7 @@
     .id           = AV_CODEC_ID_##id_, \
     .init         = decode_init, \
     .decode       = decode_frame, \
+    .capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_SLICE_THREADS, \
     .sample_fmts  = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_FLTP, \
                                                    AV_SAMPLE_FMT_NONE }, \
 };
diff --git a/libavcodec/dsicinvideo.c b/libavcodec/dsicinvideo.c
index 37175d6..7f74808 100644
--- a/libavcodec/dsicinvideo.c
+++ b/libavcodec/dsicinvideo.c
@@ -266,8 +266,11 @@
                              cin->bitmap_table[CIN_CUR_BMP], cin->bitmap_size);
         break;
     case 37:
-        cin_decode_huffman(buf, bitmap_frame_size,
+        res = cin_decode_huffman(buf, bitmap_frame_size,
                            cin->bitmap_table[CIN_CUR_BMP], cin->bitmap_size);
+
+        if (cin->bitmap_size - avctx->discard_damaged_percentage*cin->bitmap_size/100 > res)
+            return AVERROR_INVALIDDATA;
         break;
     case 38:
         res = cin_decode_lzss(buf, bitmap_frame_size,
@@ -287,7 +290,7 @@
         break;
     }
 
-    if ((res = ff_reget_buffer(avctx, cin->frame)) < 0)
+    if ((res = ff_reget_buffer(avctx, cin->frame, 0)) < 0)
         return res;
 
     memcpy(cin->frame->data[1], cin->palette, sizeof(cin->palette));
diff --git a/libavcodec/dstdec.c b/libavcodec/dstdec.c
index 368cb64..bdabced 100644
--- a/libavcodec/dstdec.c
+++ b/libavcodec/dstdec.c
@@ -37,7 +37,7 @@
 #define DST_MAX_CHANNELS 6
 #define DST_MAX_ELEMENTS (2 * DST_MAX_CHANNELS)
 
-#define DSD_FS44(sample_rate) (sample_rate * 8 / 44100)
+#define DSD_FS44(sample_rate) (sample_rate * 8LL / 44100)
 
 #define DST_SAMPLES_PER_FRAME(sample_rate) (588 * DSD_FS44(sample_rate))
 
@@ -56,6 +56,7 @@
 typedef struct ArithCoder {
     unsigned int a;
     unsigned int c;
+    int overread;
 } ArithCoder;
 
 typedef struct Table {
@@ -70,7 +71,7 @@
     GetBitContext gb;
     ArithCoder ac;
     Table fsets, probs;
-    DECLARE_ALIGNED(64, uint8_t, status)[DST_MAX_CHANNELS][16];
+    DECLARE_ALIGNED(16, uint8_t, status)[DST_MAX_CHANNELS][16];
     DECLARE_ALIGNED(16, int16_t, filter)[DST_MAX_ELEMENTS][16][256];
     DSDContext dsdctx[DST_MAX_CHANNELS];
 } DSTContext;
@@ -120,7 +121,7 @@
 
 static av_always_inline int get_sr_golomb_dst(GetBitContext *gb, unsigned int k)
 {
-    int v = get_ur_golomb(gb, k, get_bits_left(gb), 0);
+    int v = get_ur_golomb_jpegls(gb, k, get_bits_left(gb), 0);
     if (v && get_bits1(gb))
         v = -v;
     return v;
@@ -161,6 +162,10 @@
                     c -= (x + 4) / 8;
                 else
                     c += (-x + 3) / 8;
+                if (!is_signed) {
+                    if (c < offset || c >= offset + (1<<coeff_bits))
+                        return AVERROR_INVALIDDATA;
+                }
                 t->coeff[i][j] = c;
             }
         }
@@ -172,6 +177,7 @@
 {
     ac->a = 4095;
     ac->c = get_bits(gb, 12);
+    ac->overread = 0;
 }
 
 static av_always_inline void ac_get(ArithCoder *ac, GetBitContext *gb, int p, int *e)
@@ -191,6 +197,8 @@
     if (ac->a < 2048) {
         int n = 11 - av_log2(ac->a);
         ac->a <<= n;
+        if (get_bits_left(gb) < n)
+            ac->overread ++;
         ac->c = (ac->c << n) | get_bits(gb, n);
     }
 }
@@ -254,7 +262,7 @@
         skip_bits1(gb);
         if (get_bits(gb, 6))
             return AVERROR_INVALIDDATA;
-        memcpy(frame->data[0], avpkt->data + 1, FFMIN(avpkt->size - 1, frame->nb_samples * avctx->channels));
+        memcpy(frame->data[0], avpkt->data + 1, FFMIN(avpkt->size - 1, frame->nb_samples * channels));
         goto dsd;
     }
 
@@ -279,7 +287,7 @@
 
     same_map = get_bits1(gb);
 
-    if ((ret = read_map(gb, &s->fsets, map_ch_to_felem, avctx->channels)) < 0)
+    if ((ret = read_map(gb, &s->fsets, map_ch_to_felem, channels)) < 0)
         return ret;
 
     if (same_map) {
@@ -287,22 +295,26 @@
         memcpy(map_ch_to_pelem, map_ch_to_felem, sizeof(map_ch_to_felem));
     } else {
         avpriv_request_sample(avctx, "Not Same Mapping");
-        if ((ret = read_map(gb, &s->probs, map_ch_to_pelem, avctx->channels)) < 0)
+        if ((ret = read_map(gb, &s->probs, map_ch_to_pelem, channels)) < 0)
             return ret;
     }
 
     /* Half Probability (10.10) */
 
-    for (ch = 0; ch < avctx->channels; ch++)
+    for (ch = 0; ch < channels; ch++)
         half_prob[ch] = get_bits1(gb);
 
     /* Filter Coef Sets (10.12) */
 
-    read_table(gb, &s->fsets, fsets_code_pred_coeff, 7, 9, 1, 0);
+    ret = read_table(gb, &s->fsets, fsets_code_pred_coeff, 7, 9, 1, 0);
+    if (ret < 0)
+        return ret;
 
     /* Probability Tables (10.13) */
 
-    read_table(gb, &s->probs, probs_code_pred_coeff, 6, 7, 0, 1);
+    ret = read_table(gb, &s->probs, probs_code_pred_coeff, 6, 7, 0, 1);
+    if (ret < 0)
+        return ret;
 
     /* Arithmetic Coded Data (10.11) */
 
@@ -313,7 +325,7 @@
     build_filter(s->filter, &s->fsets);
 
     memset(s->status, 0xAA, sizeof(s->status));
-    memset(dsd, 0, frame->nb_samples * 4 * avctx->channels);
+    memset(dsd, 0, frame->nb_samples * 4 * channels);
 
     ac_get(ac, gb, prob_dst_x_bit(s->fsets.coeff[0][0]), &dst_x_bit);
 
@@ -339,20 +351,23 @@
                 prob = 128;
             }
 
+            if (ac->overread > 16)
+                return AVERROR_INVALIDDATA;
+
             ac_get(ac, gb, prob, &residual);
             v = ((predict >> 15) ^ residual) & 1;
             dsd[((i >> 3) * channels + ch) << 2] |= v << (7 - (i & 0x7 ));
 
-            AV_WN64A(status + 8, (AV_RN64A(status + 8) << 1) | ((AV_RN64A(status) >> 63) & 1));
-            AV_WN64A(status, (AV_RN64A(status) << 1) | v);
+            AV_WL64A(status + 8, (AV_RL64A(status + 8) << 1) | ((AV_RL64A(status) >> 63) & 1));
+            AV_WL64A(status, (AV_RL64A(status) << 1) | v);
         }
     }
 
 dsd:
-    for (i = 0; i < avctx->channels; i++) {
+    for (i = 0; i < channels; i++) {
         ff_dsd2pcm_translate(&s->dsdctx[i], frame->nb_samples, 0,
                              frame->data[0] + i * 4,
-                             avctx->channels * 4, pcm + i, avctx->channels);
+                             channels * 4, pcm + i, channels);
     }
 
     *got_frame_ptr = 1;
diff --git a/libavcodec/dump_extradata_bsf.c b/libavcodec/dump_extradata_bsf.c
index 188a1c6..218853d 100644
--- a/libavcodec/dump_extradata_bsf.c
+++ b/libavcodec/dump_extradata_bsf.c
@@ -24,7 +24,6 @@
 #include "bsf.h"
 
 #include "libavutil/log.h"
-#include "libavutil/mem.h"
 #include "libavutil/opt.h"
 
 enum DumpFreq {
@@ -50,7 +49,9 @@
 
     if (ctx->par_in->extradata &&
         (s->freq == DUMP_FREQ_ALL ||
-         (s->freq == DUMP_FREQ_KEYFRAME && in->flags & AV_PKT_FLAG_KEY))) {
+         (s->freq == DUMP_FREQ_KEYFRAME && in->flags & AV_PKT_FLAG_KEY)) &&
+         (in->size < ctx->par_in->extradata_size ||
+          memcmp(in->data, ctx->par_in->extradata, ctx->par_in->extradata_size))) {
         if (in->size >= INT_MAX - ctx->par_in->extradata_size) {
             ret = AVERROR(ERANGE);
             goto fail;
@@ -81,7 +82,7 @@
 #define OFFSET(x) offsetof(DumpExtradataContext, x)
 #define FLAGS (AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_BSF_PARAM)
 static const AVOption options[] = {
-    { "freq", "When do dump extradata", OFFSET(freq), AV_OPT_TYPE_INT,
+    { "freq", "When to dump extradata", OFFSET(freq), AV_OPT_TYPE_INT,
         { .i64 = DUMP_FREQ_KEYFRAME }, DUMP_FREQ_KEYFRAME, DUMP_FREQ_ALL, FLAGS, "freq" },
         { "k",        NULL, 0, AV_OPT_TYPE_CONST, { .i64 = DUMP_FREQ_KEYFRAME }, .flags = FLAGS, .unit = "freq" },
         { "keyframe", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = DUMP_FREQ_KEYFRAME }, .flags = FLAGS, .unit = "freq" },
diff --git a/libavcodec/dv.h b/libavcodec/dv.h
index 0e97bb2..0205d72 100644
--- a/libavcodec/dv.h
+++ b/libavcodec/dv.h
@@ -31,6 +31,7 @@
 #include "dv_profile.h"
 #include "me_cmp.h"
 #include "vlc.h"
+#include "idctdsp.h"
 
 typedef struct DVwork_chunk {
     uint16_t buf_offset;
@@ -52,6 +53,7 @@
     me_cmp_func ildct_cmp;
     DVwork_chunk work_chunks[4 * 12 * 27];
     uint32_t idct_factor[2 * 4 * 16 * 64];
+    IDCTDSPContext idsp;
 
     int quant_deadzone;
 } DVVideoContext;
@@ -81,6 +83,7 @@
 
 #define DV_PROFILE_IS_HD(p) ((p)->video_stype & 0x10)
 #define DV_PROFILE_IS_1080i50(p) (((p)->video_stype == 0x14) && ((p)->dsf == 1))
+#define DV_PROFILE_IS_1080i60(p) (((p)->video_stype == 0x14) && ((p)->dsf == 0))
 #define DV_PROFILE_IS_720p50(p)  (((p)->video_stype == 0x18) && ((p)->dsf == 1))
 
 /**
diff --git a/libavcodec/dvbsub.c b/libavcodec/dvbsub.c
index 8cce702..5c081f2 100644
--- a/libavcodec/dvbsub.c
+++ b/libavcodec/dvbsub.c
@@ -37,11 +37,11 @@
     }\
 }
 
-static void dvb_encode_rle2(uint8_t **pq,
-                            const uint8_t *bitmap, int linesize,
-                            int w, int h)
+static int dvb_encode_rle2(uint8_t **pq, int buf_size,
+                           const uint8_t *bitmap, int linesize,
+                           int w, int h)
 {
-    uint8_t *q;
+    uint8_t *q, *line_begin;
     unsigned int bitbuf;
     int bitcnt;
     int x, y, len, x1, v, color;
@@ -49,6 +49,10 @@
     q = *pq;
 
     for(y = 0; y < h; y++) {
+        // Worst case line is 3 bits per value + 4 bytes overhead
+        if (buf_size * 8 < w * 3 + 32)
+            return AVERROR_BUFFER_TOO_SMALL;
+        line_begin = q;
         *q++ = 0x10;
         bitbuf = 0;
         bitcnt = 6;
@@ -109,8 +113,11 @@
         }
         *q++ = 0xf0;
         bitmap += linesize;
+        buf_size -= q - line_begin;
     }
+    len = q - *pq;
     *pq = q;
+    return len;
 }
 
 #define PUTBITS4(val)\
@@ -125,11 +132,11 @@
 }
 
 /* some DVB decoders only implement 4 bits/pixel */
-static void dvb_encode_rle4(uint8_t **pq,
-                            const uint8_t *bitmap, int linesize,
-                            int w, int h)
+static int dvb_encode_rle4(uint8_t **pq, int buf_size,
+                           const uint8_t *bitmap, int linesize,
+                           int w, int h)
 {
-    uint8_t *q;
+    uint8_t *q, *line_begin;
     unsigned int bitbuf;
     int bitcnt;
     int x, y, len, x1, v, color;
@@ -137,6 +144,10 @@
     q = *pq;
 
     for(y = 0; y < h; y++) {
+        // Worst case line is 6 bits per value, + 4 bytes overhead
+        if (buf_size * 8 < w * 6 + 32)
+            return AVERROR_BUFFER_TOO_SMALL;
+        line_begin = q;
         *q++ = 0x11;
         bitbuf = 0;
         bitcnt = 4;
@@ -189,20 +200,27 @@
         }
         *q++ = 0xf0;
         bitmap += linesize;
+        buf_size -= q - line_begin;
     }
+    len = q - *pq;
     *pq = q;
+    return len;
 }
 
-static void dvb_encode_rle8(uint8_t **pq,
-                            const uint8_t *bitmap, int linesize,
-                            int w, int h)
+static int dvb_encode_rle8(uint8_t **pq, int buf_size,
+                           const uint8_t *bitmap, int linesize,
+                           int w, int h)
 {
-    uint8_t *q;
+    uint8_t *q, *line_begin;
     int x, y, len, x1, color;
 
     q = *pq;
 
     for (y = 0; y < h; y++) {
+        // Worst case line is 12 bits per value, + 3 bytes overhead
+        if (buf_size * 8 < w * 12 + 24)
+            return AVERROR_BUFFER_TOO_SMALL;
+        line_begin = q;
         *q++ = 0x12;
 
         x = 0;
@@ -243,13 +261,18 @@
         *q++ = 0x00;
         *q++ = 0xf0;
         bitmap += linesize;
+        buf_size -= q - line_begin;
     }
+    len = q - *pq;
     *pq = q;
+    return len;
 }
 
-static int encode_dvb_subtitles(DVBSubtitleContext *s,
-                                uint8_t *outbuf, const AVSubtitle *h)
+static int encode_dvb_subtitles(AVCodecContext *avctx,
+                                uint8_t *outbuf, int buf_size,
+                                const AVSubtitle *h)
 {
+    DVBSubtitleContext *s = avctx->priv_data;
     uint8_t *q, *pseg_len;
     int page_id, region_id, clut_id, object_id, i, bpp_index, page_state;
 
@@ -259,10 +282,28 @@
     page_id = 1;
 
     if (h->num_rects && !h->rects)
-        return -1;
+        return AVERROR(EINVAL);
+
+    if (avctx->width > 0 && avctx->height > 0) {
+        if (buf_size < 11)
+            return AVERROR_BUFFER_TOO_SMALL;
+        /* display definition segment */
+        *q++ = 0x0f; /* sync_byte */
+        *q++ = 0x14; /* segment_type */
+        bytestream_put_be16(&q, page_id);
+        pseg_len = q;
+        q += 2; /* segment length */
+        *q++ = 0x00; /* dds version number & display window flag */
+        bytestream_put_be16(&q, avctx->width - 1); /* display width */
+        bytestream_put_be16(&q, avctx->height - 1); /* display height */
+        bytestream_put_be16(&pseg_len, q - pseg_len - 2);
+        buf_size -= 11;
+    }
 
     /* page composition segment */
 
+    if (buf_size < 8 + h->num_rects * 6)
+        return AVERROR_BUFFER_TOO_SMALL;
     *q++ = 0x0f; /* sync_byte */
     *q++ = 0x10; /* segment_type */
     bytestream_put_be16(&q, page_id);
@@ -281,9 +322,12 @@
     }
 
     bytestream_put_be16(&pseg_len, q - pseg_len - 2);
+    buf_size -= 8 + h->num_rects * 6;
 
     if (h->num_rects) {
         for (clut_id = 0; clut_id < h->num_rects; clut_id++) {
+            if (buf_size < 6 + h->rects[clut_id]->nb_colors * 6)
+                return AVERROR_BUFFER_TOO_SMALL;
 
             /* CLUT segment */
 
@@ -297,7 +341,7 @@
                 /* 8 bpp, standard encoding */
                 bpp_index = 2;
             } else {
-                return -1;
+                return AVERROR(EINVAL);
             }
 
 
@@ -329,9 +373,12 @@
             }
 
             bytestream_put_be16(&pseg_len, q - pseg_len - 2);
+            buf_size -= 6 + h->rects[clut_id]->nb_colors * 6;
         }
     }
 
+    if (buf_size < h->num_rects * 22)
+        return AVERROR_BUFFER_TOO_SMALL;
     for (region_id = 0; region_id < h->num_rects; region_id++) {
 
         /* region composition segment */
@@ -346,7 +393,7 @@
             /* 8 bpp, standard encoding */
             bpp_index = 2;
         } else {
-            return -1;
+            return AVERROR(EINVAL);
         }
 
         *q++ = 0x0f; /* sync_byte */
@@ -371,13 +418,17 @@
 
         bytestream_put_be16(&pseg_len, q - pseg_len - 2);
     }
+    buf_size -= h->num_rects * 22;
 
     if (h->num_rects) {
 
         for (object_id = 0; object_id < h->num_rects; object_id++) {
-            void (*dvb_encode_rle)(uint8_t **pq,
-                                    const uint8_t *bitmap, int linesize,
-                                    int w, int h);
+            int (*dvb_encode_rle)(uint8_t **pq, int buf_size,
+                                  const uint8_t *bitmap, int linesize,
+                                  int w, int h);
+
+            if (buf_size < 13)
+                return AVERROR_BUFFER_TOO_SMALL;
 
             /* bpp_index maths */
             if (h->rects[object_id]->nb_colors <= 4) {
@@ -390,7 +441,7 @@
                 /* 8 bpp, standard encoding */
                 dvb_encode_rle = dvb_encode_rle8;
             } else {
-                return -1;
+                return AVERROR(EINVAL);
             }
 
             /* Object Data segment */
@@ -406,19 +457,32 @@
                                                                        non_modifying_color_flag */
             {
                 uint8_t *ptop_field_len, *pbottom_field_len, *top_ptr, *bottom_ptr;
+                int ret;
 
                 ptop_field_len = q;
                 q += 2;
                 pbottom_field_len = q;
                 q += 2;
+                buf_size -= 13;
 
                 top_ptr = q;
-                dvb_encode_rle(&q, h->rects[object_id]->data[0], h->rects[object_id]->w * 2,
-                                    h->rects[object_id]->w, h->rects[object_id]->h >> 1);
+                ret = dvb_encode_rle(&q, buf_size,
+                                     h->rects[object_id]->data[0],
+                                     h->rects[object_id]->w * 2,
+                                     h->rects[object_id]->w,
+                                     h->rects[object_id]->h >> 1);
+                if (ret < 0)
+                    return ret;
+                buf_size -= ret;
                 bottom_ptr = q;
-                dvb_encode_rle(&q, h->rects[object_id]->data[0] + h->rects[object_id]->w,
-                                    h->rects[object_id]->w * 2, h->rects[object_id]->w,
-                                    h->rects[object_id]->h >> 1);
+                ret = dvb_encode_rle(&q, buf_size,
+                                     h->rects[object_id]->data[0] + h->rects[object_id]->w,
+                                     h->rects[object_id]->w * 2,
+                                     h->rects[object_id]->w,
+                                     h->rects[object_id]->h >> 1);
+                if (ret < 0)
+                    return ret;
+                buf_size -= ret;
 
                 bytestream_put_be16(&ptop_field_len, bottom_ptr - top_ptr);
                 bytestream_put_be16(&pbottom_field_len, q - bottom_ptr);
@@ -430,6 +494,8 @@
 
     /* end of display set segment */
 
+    if (buf_size < 6)
+        return AVERROR_BUFFER_TOO_SMALL;
     *q++ = 0x0f; /* sync_byte */
     *q++ = 0x80; /* segment_type */
     bytestream_put_be16(&q, page_id);
@@ -437,6 +503,7 @@
     q += 2; /* segment length */
 
     bytestream_put_be16(&pseg_len, q - pseg_len - 2);
+    buf_size -= 6;
 
     s->object_version = (s->object_version + 1) & 0xf;
     return q - outbuf;
@@ -446,10 +513,9 @@
                          unsigned char *buf, int buf_size,
                          const AVSubtitle *sub)
 {
-    DVBSubtitleContext *s = avctx->priv_data;
     int ret;
 
-    ret = encode_dvb_subtitles(s, buf, sub);
+    ret = encode_dvb_subtitles(avctx, buf, buf_size, sub);
     return ret;
 }
 
diff --git a/libavcodec/dvbsubdec.c b/libavcodec/dvbsubdec.c
index b59e836..f63a1f3 100644
--- a/libavcodec/dvbsubdec.c
+++ b/libavcodec/dvbsubdec.c
@@ -1267,6 +1267,13 @@
         display->y_pos = AV_RB16(buf) & 0xfff;
         buf += 2;
 
+        if (display->x_pos >= region->width ||
+            display->y_pos >= region->height) {
+            av_log(avctx, AV_LOG_ERROR, "Object outside region\n");
+            av_free(display);
+            return AVERROR_INVALIDDATA;
+        }
+
         if ((object->type == 1 || object->type == 2) && buf+1 < buf_end) {
             display->fgcolor = *buf++;
             display->bgcolor = *buf++;
@@ -1571,8 +1578,9 @@
     display_def->width   = bytestream_get_be16(&buf) + 1;
     display_def->height  = bytestream_get_be16(&buf) + 1;
     if (!avctx->width || !avctx->height) {
-        avctx->width  = display_def->width;
-        avctx->height = display_def->height;
+        int ret = ff_set_dimensions(avctx, display_def->width, display_def->height);
+        if (ret < 0)
+            return ret;
     }
 
     if (info_byte & 1<<3) { // display_window_flag
@@ -1602,7 +1610,7 @@
 }
 
 static int dvbsub_decode(AVCodecContext *avctx,
-                         void *data, int *data_size,
+                         void *data, int *got_sub_ptr,
                          AVPacket *avpkt)
 {
     const uint8_t *buf = avpkt->data;
@@ -1660,7 +1668,7 @@
             int ret = 0;
             switch (segment_type) {
             case DVBSUB_PAGE_SEGMENT:
-                ret = dvbsub_parse_page_segment(avctx, p, segment_length, sub, data_size);
+                ret = dvbsub_parse_page_segment(avctx, p, segment_length, sub, got_sub_ptr);
                 got_segment |= 1;
                 break;
             case DVBSUB_REGION_SEGMENT:
@@ -1682,7 +1690,7 @@
                 got_dds = 1;
                 break;
             case DVBSUB_DISPLAY_SEGMENT:
-                ret = dvbsub_display_end_segment(avctx, p, segment_length, sub, data_size);
+                ret = dvbsub_display_end_segment(avctx, p, segment_length, sub, got_sub_ptr);
                 if (got_segment == 15 && !got_dds && !avctx->width && !avctx->height) {
                     // Default from ETSI EN 300 743 V1.3.1 (7.2.1)
                     avctx->width  = 720;
@@ -1705,12 +1713,12 @@
     // segments then we need no further data.
     if (got_segment == 15) {
         av_log(avctx, AV_LOG_DEBUG, "Missing display_end_segment, emulating\n");
-        dvbsub_display_end_segment(avctx, p, 0, sub, data_size);
+        dvbsub_display_end_segment(avctx, p, 0, sub, got_sub_ptr);
     }
 
 end:
     if(ret < 0) {
-        *data_size = 0;
+        *got_sub_ptr = 0;
         avsubtitle_free(sub);
         return ret;
     } else {
diff --git a/libavcodec/dvdec.c b/libavcodec/dvdec.c
index 7b16787..c526091 100644
--- a/libavcodec/dvdec.c
+++ b/libavcodec/dvdec.c
@@ -45,10 +45,10 @@
 #include "dv_profile_internal.h"
 #include "dvdata.h"
 #include "get_bits.h"
-#include "idctdsp.h"
 #include "internal.h"
 #include "put_bits.h"
 #include "simple_idct.h"
+#include "thread.h"
 
 typedef struct BlockInfo {
     const uint32_t *factor_table;
@@ -176,24 +176,22 @@
 static av_cold int dvvideo_decode_init(AVCodecContext *avctx)
 {
     DVVideoContext *s = avctx->priv_data;
-    IDCTDSPContext idsp;
     int i;
 
-    memset(&idsp,0, sizeof(idsp));
-    ff_idctdsp_init(&idsp, avctx);
+    ff_idctdsp_init(&s->idsp, avctx);
 
     for (i = 0; i < 64; i++)
-        s->dv_zigzag[0][i] = idsp.idct_permutation[ff_zigzag_direct[i]];
+        s->dv_zigzag[0][i] = s->idsp.idct_permutation[ff_zigzag_direct[i]];
 
     if (avctx->lowres){
         for (i = 0; i < 64; i++){
             int j = ff_dv_zigzag248_direct[i];
-            s->dv_zigzag[1][i] = idsp.idct_permutation[(j & 7) + (j & 8) * 4 + (j & 48) / 2];
+            s->dv_zigzag[1][i] = s->idsp.idct_permutation[(j & 7) + (j & 8) * 4 + (j & 48) / 2];
         }
     }else
         memcpy(s->dv_zigzag[1], ff_dv_zigzag248_direct, sizeof(s->dv_zigzag[1]));
 
-    s->idct_put[0] = idsp.idct_put;
+    s->idct_put[0] = s->idsp.idct_put;
     s->idct_put[1] = ff_simple_idct248_put;
 
     return ff_dvvideo_init(avctx);
@@ -271,6 +269,48 @@
         put_bits(pb, bits_left, get_bits(gb, bits_left));
 }
 
+static av_always_inline void put_block_8x4(int16_t *block, uint8_t *av_restrict p, int stride)
+{
+    int i, j;
+
+    for (i = 0; i < 4; i++) {
+        for (j = 0; j < 8; j++)
+            p[j] = av_clip_uint8(block[j]);
+        block += 8;
+        p += stride;
+    }
+}
+
+static void dv100_idct_put_last_row_field_chroma(DVVideoContext *s, uint8_t *data,
+                                                 int stride, int16_t *blocks)
+{
+    s->idsp.idct(blocks + 0*64);
+    s->idsp.idct(blocks + 1*64);
+
+    put_block_8x4(blocks+0*64,       data,              stride<<1);
+    put_block_8x4(blocks+0*64 + 4*8, data + 8,          stride<<1);
+    put_block_8x4(blocks+1*64,       data + stride,     stride<<1);
+    put_block_8x4(blocks+1*64 + 4*8, data + 8 + stride, stride<<1);
+}
+
+static void dv100_idct_put_last_row_field_luma(DVVideoContext *s, uint8_t *data,
+                                               int stride, int16_t *blocks)
+{
+    s->idsp.idct(blocks + 0*64);
+    s->idsp.idct(blocks + 1*64);
+    s->idsp.idct(blocks + 2*64);
+    s->idsp.idct(blocks + 3*64);
+
+    put_block_8x4(blocks+0*64,       data,               stride<<1);
+    put_block_8x4(blocks+0*64 + 4*8, data + 16,          stride<<1);
+    put_block_8x4(blocks+1*64,       data + 8,           stride<<1);
+    put_block_8x4(blocks+1*64 + 4*8, data + 24,          stride<<1);
+    put_block_8x4(blocks+2*64,       data + stride,      stride<<1);
+    put_block_8x4(blocks+2*64 + 4*8, data + 16 + stride, stride<<1);
+    put_block_8x4(blocks+3*64,       data + 8  + stride, stride<<1);
+    put_block_8x4(blocks+3*64 + 4*8, data + 24 + stride, stride<<1);
+}
+
 /* mb_x and mb_y are in units of 8 pixels */
 static int dv_decode_video_segment(AVCodecContext *avctx, void *arg)
 {
@@ -442,14 +482,18 @@
         }
         y_ptr    = s->frame->data[0] +
                    ((mb_y * s->frame->linesize[0] + mb_x) << log2_blocksize);
-        linesize = s->frame->linesize[0] << is_field_mode[mb_index];
-        mb[0].idct_put(y_ptr, linesize, block + 0 * 64);
-        if (s->sys->video_stype == 4) { /* SD 422 */
-            mb[2].idct_put(y_ptr + (1 << log2_blocksize),            linesize, block + 2 * 64);
+        if (mb_y == 134 && is_field_mode[mb_index]) {
+            dv100_idct_put_last_row_field_luma(s, y_ptr, s->frame->linesize[0], block);
         } else {
-            mb[1].idct_put(y_ptr + (1 << log2_blocksize),            linesize, block + 1 * 64);
-            mb[2].idct_put(y_ptr                         + y_stride, linesize, block + 2 * 64);
-            mb[3].idct_put(y_ptr + (1 << log2_blocksize) + y_stride, linesize, block + 3 * 64);
+            linesize = s->frame->linesize[0] << is_field_mode[mb_index];
+            mb[0].idct_put(y_ptr, linesize, block + 0 * 64);
+            if (s->sys->video_stype == 4) { /* SD 422 */
+                mb[2].idct_put(y_ptr + (1 << log2_blocksize),            linesize, block + 2 * 64);
+            } else {
+                mb[1].idct_put(y_ptr + (1 << log2_blocksize),            linesize, block + 1 * 64);
+                mb[2].idct_put(y_ptr                         + y_stride, linesize, block + 2 * 64);
+                mb[3].idct_put(y_ptr + (1 << log2_blocksize) + y_stride, linesize, block + 3 * 64);
+            }
         }
         mb    += 4;
         block += 4 * 64;
@@ -477,13 +521,19 @@
                 mb++;
             } else {
                 y_stride = (mb_y == 134) ? (1 << log2_blocksize) :
-                           s->frame->linesize[j] << ((!is_field_mode[mb_index]) * log2_blocksize);
-                linesize = s->frame->linesize[j] << is_field_mode[mb_index];
-                (mb++)->idct_put(c_ptr, linesize, block);
-                block += 64;
-                if (s->sys->bpm == 8) {
-                    (mb++)->idct_put(c_ptr + y_stride, linesize, block);
+                    s->frame->linesize[j] << ((!is_field_mode[mb_index]) * log2_blocksize);
+                if (mb_y == 134 && is_field_mode[mb_index]) {
+                    dv100_idct_put_last_row_field_chroma(s, c_ptr, s->frame->linesize[j], block);
+                    mb += 2;
+                    block += 2*64;
+                } else {
+                    linesize = s->frame->linesize[j] << is_field_mode[mb_index];
+                    (mb++)->idct_put(c_ptr, linesize, block);
                     block += 64;
+                    if (s->sys->bpm == 8) {
+                        (mb++)->idct_put(c_ptr + y_stride, linesize, block);
+                        block += 64;
+                    }
                 }
             }
         }
@@ -499,7 +549,7 @@
     uint8_t *buf = avpkt->data;
     int buf_size = avpkt->size;
     DVVideoContext *s = avctx->priv_data;
-    AVFrame *frame = data;
+    ThreadFrame frame = { .f = data };
     const uint8_t *vsc_pack;
     int apt, is16_9, ret;
     const AVDVProfile *sys;
@@ -520,9 +570,9 @@
         s->sys = sys;
     }
 
-    s->frame            = frame;
-    frame->key_frame    = 1;
-    frame->pict_type    = AV_PICTURE_TYPE_I;
+    s->frame            = frame.f;
+    frame.f->key_frame  = 1;
+    frame.f->pict_type  = AV_PICTURE_TYPE_I;
     avctx->pix_fmt      = s->sys->pix_fmt;
     avctx->framerate    = av_inv_q(s->sys->time_base);
 
@@ -539,14 +589,21 @@
         ff_set_sar(avctx, s->sys->sar[is16_9]);
     }
 
-    if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
+    if ((ret = ff_thread_get_buffer(avctx, &frame, 0)) < 0)
         return ret;
-    frame->interlaced_frame = 1;
-    frame->top_field_first  = 0;
 
     /* Determine the codec's field order from the packet */
     if ( *vsc_pack == dv_video_control ) {
-        frame->top_field_first = !(vsc_pack[3] & 0x40);
+        if (avctx->height == 720) {
+            frame.f->interlaced_frame = 0;
+            frame.f->top_field_first = 0;
+        } else if (avctx->height == 1080) {
+            frame.f->interlaced_frame = 1;
+            frame.f->top_field_first = (vsc_pack[3] & 0x40) == 0x40;
+        } else {
+            frame.f->interlaced_frame = (vsc_pack[3] & 0x10) == 0x10;
+            frame.f->top_field_first = !(vsc_pack[3] & 0x40);
+        }
     }
 
     s->buf = buf;
@@ -569,6 +626,6 @@
     .priv_data_size = sizeof(DVVideoContext),
     .init           = dvvideo_decode_init,
     .decode         = dvvideo_decode_frame,
-    .capabilities   = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_SLICE_THREADS,
+    .capabilities   = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_FRAME_THREADS | AV_CODEC_CAP_SLICE_THREADS,
     .max_lowres     = 3,
 };
diff --git a/libavdevice/libndi_newtek_common.h b/libavcodec/dvdsub.c
similarity index 67%
copy from libavdevice/libndi_newtek_common.h
copy to libavcodec/dvdsub.c
index 8990317..87215d2 100644
--- a/libavdevice/libndi_newtek_common.h
+++ b/libavcodec/dvdsub.c
@@ -1,6 +1,6 @@
 /*
- * NewTek NDI common code
- * Copyright (c) 2017 Maksym Veremeyenko
+ * DVD subtitle decoding/encoding
+ * Copyright (c) 2005 Fabrice Bellard
  *
  * This file is part of FFmpeg.
  *
@@ -19,12 +19,15 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
-#ifndef AVDEVICE_LIBNDI_NEWTEK_COMMON_H
-#define AVDEVICE_LIBNDI_NEWTEK_COMMON_H
+#include "internal.h"
+#include "libavutil/avstring.h"
+#include <stdlib.h>
 
-#include <Processing.NDI.Lib.h>
-
-#define NDI_TIME_BASE 10000000
-#define NDI_TIME_BASE_Q (AVRational){1, NDI_TIME_BASE}
-
-#endif
+void ff_dvdsub_parse_palette(uint32_t *palette, const char *p)
+{
+    for (int i = 0; i < 16; i++) {
+        palette[i] = strtoul(p, (char **)&p, 16);
+        while (*p == ',' || av_isspace(*p))
+            p++;
+    }
+}
diff --git a/libavcodec/dvdsubdec.c b/libavcodec/dvdsubdec.c
index 632a53a..bf49788 100644
--- a/libavcodec/dvdsubdec.c
+++ b/libavcodec/dvdsubdec.c
@@ -27,7 +27,6 @@
 #include "libavutil/colorspace.h"
 #include "libavutil/opt.h"
 #include "libavutil/imgutils.h"
-#include "libavutil/avstring.h"
 #include "libavutil/bswap.h"
 
 typedef struct DVDSubContext
@@ -595,6 +594,7 @@
     }
 
     if (is_menu < 0) {
+        ctx->buf_size = 0;
     no_subtitle:
         reset_rects(sub);
         *data_size = 0;
@@ -625,18 +625,6 @@
     return buf_size;
 }
 
-static void parse_palette(DVDSubContext *ctx, char *p)
-{
-    int i;
-
-    ctx->has_palette = 1;
-    for(i=0;i<16;i++) {
-        ctx->palette[i] = strtoul(p, &p, 16);
-        while(*p == ',' || av_isspace(*p))
-            p++;
-    }
-}
-
 static int parse_ifo_palette(DVDSubContext *ctx, char *p)
 {
     FILE *ifo;
@@ -718,7 +706,8 @@
             break;
 
         if (strncmp("palette:", data, 8) == 0) {
-            parse_palette(ctx, data + 8);
+            ctx->has_palette = 1;
+            ff_dvdsub_parse_palette(ctx->palette, data + 8);
         } else if (strncmp("size:", data, 5) == 0) {
             int w, h;
             if (sscanf(data + 5, "%dx%d", &w, &h) == 2) {
@@ -747,8 +736,10 @@
 
     if (ctx->ifo_str)
         parse_ifo_palette(ctx, ctx->ifo_str);
-    if (ctx->palette_str)
-        parse_palette(ctx, ctx->palette_str);
+    if (ctx->palette_str) {
+        ctx->has_palette = 1;
+        ff_dvdsub_parse_palette(ctx->palette, ctx->palette_str);
+    }
     if (ctx->has_palette) {
         int i;
         av_log(avctx, AV_LOG_DEBUG, "palette:");
diff --git a/libavcodec/dvdsubenc.c b/libavcodec/dvdsubenc.c
index ff95ed2..e54b5f0 100644
--- a/libavcodec/dvdsubenc.c
+++ b/libavcodec/dvdsubenc.c
@@ -29,6 +29,7 @@
 typedef struct {
     AVClass *class;
     uint32_t global_palette[16];
+    char *palette_str;
     int even_rows_fix;
 } DVDSubtitleContext;
 
@@ -436,7 +437,11 @@
     int i, ret;
 
     av_assert0(sizeof(dvdc->global_palette) == sizeof(default_palette));
-    memcpy(dvdc->global_palette, default_palette, sizeof(dvdc->global_palette));
+    if (dvdc->palette_str) {
+        ff_dvdsub_parse_palette(dvdc->global_palette, dvdc->palette_str);
+    } else {
+        memcpy(dvdc->global_palette, default_palette, sizeof(dvdc->global_palette));
+    }
 
     av_bprint_init(&extradata, 0, AV_BPRINT_SIZE_AUTOMATIC);
     if (avctx->width && avctx->height)
@@ -467,6 +472,7 @@
 #define OFFSET(x) offsetof(DVDSubtitleContext, x)
 #define SE AV_OPT_FLAG_SUBTITLE_PARAM | AV_OPT_FLAG_ENCODING_PARAM
 static const AVOption options[] = {
+    {"palette", "set the global palette", OFFSET(palette_str), AV_OPT_TYPE_STRING, { .str = NULL }, 0, 0, SE },
     {"even_rows_fix", "Make number of rows even (workaround for some players)", OFFSET(even_rows_fix), AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, SE},
     { NULL },
 };
diff --git a/libavcodec/dvenc.c b/libavcodec/dvenc.c
index ce2fc75..dca57fe 100644
--- a/libavcodec/dvenc.c
+++ b/libavcodec/dvenc.c
@@ -60,10 +60,7 @@
         ff_dv_print_profiles(avctx, AV_LOG_ERROR);
         return AVERROR(EINVAL);
     }
-    if (avctx->height > 576) {
-        av_log(avctx, AV_LOG_ERROR, "DVCPRO HD encoding is not supported.\n");
-        return AVERROR_PATCHWELCOME;
-    }
+
     ret = ff_dv_init_dynamic_tables(s, s->sys);
     if (ret < 0) {
         av_log(avctx, AV_LOG_ERROR, "Error initializing work tables.\n");
@@ -90,6 +87,7 @@
 }
 
 /* bit budget for AC only in 5 MBs */
+static const int vs_total_ac_bits_hd = (68 * 6 + 52*2) * 5;
 static const int vs_total_ac_bits = (100 * 4 + 68 * 2) * 5;
 static const int mb_area_start[5] = { 1, 6, 21, 43, 64 };
 
@@ -158,6 +156,11 @@
     uint8_t  sign[64];
     uint8_t  partial_bit_count;
     uint32_t partial_bit_buffer; /* we can't use uint16_t here */
+    /* used by DV100 only: a copy of the weighted and classified but
+       not-yet-quantized AC coefficients. This is necessary for
+       re-quantizing at different steps. */
+    int16_t  save[64];
+    int      min_qlevel; /* DV100 only: minimum qlevel (for AC coefficients >255) */
 } EncBlockInfo;
 
 static av_always_inline PutBitContext *dv_encode_ac(EncBlockInfo *bi,
@@ -243,13 +246,123 @@
     170627, 170627, 153560, 153560, 165371, 165371, 144651, 144651,
 };
 
-static av_always_inline int dv_init_enc_block(EncBlockInfo *bi, uint8_t *data,
-                                              ptrdiff_t linesize,
-                                              DVVideoContext *s, int bias)
+/* setting this to 1 results in a faster codec but
+ * somewhat lower image quality */
+#define DV100_SACRIFICE_QUALITY_FOR_SPEED 1
+#define DV100_ENABLE_FINER 1
+
+/* pack combination of QNO and CNO into a single 8-bit value */
+#define DV100_MAKE_QLEVEL(qno,cno) ((qno<<2) | (cno))
+#define DV100_QLEVEL_QNO(qlevel) (qlevel>>2)
+#define DV100_QLEVEL_CNO(qlevel) (qlevel&0x3)
+
+#define DV100_NUM_QLEVELS 31
+
+/* The quantization step is determined by a combination of QNO and
+   CNO. We refer to these combinations as "qlevels" (this term is our
+   own, it's not mentioned in the spec). We use CNO, a multiplier on
+   the quantization step, to "fill in the gaps" between quantization
+   steps associated with successive values of QNO. e.g. there is no
+   QNO for a quantization step of 10, but we can use QNO=5 CNO=1 to
+   get the same result. The table below encodes combinations of QNO
+   and CNO in order of increasing quantization coarseness. */
+static const uint8_t dv100_qlevels[DV100_NUM_QLEVELS] = {
+    DV100_MAKE_QLEVEL( 1,0), //  1*1= 1
+    DV100_MAKE_QLEVEL( 1,0), //  1*1= 1
+    DV100_MAKE_QLEVEL( 2,0), //  2*1= 2
+    DV100_MAKE_QLEVEL( 3,0), //  3*1= 3
+    DV100_MAKE_QLEVEL( 4,0), //  4*1= 4
+    DV100_MAKE_QLEVEL( 5,0), //  5*1= 5
+    DV100_MAKE_QLEVEL( 6,0), //  6*1= 6
+    DV100_MAKE_QLEVEL( 7,0), //  7*1= 7
+    DV100_MAKE_QLEVEL( 8,0), //  8*1= 8
+    DV100_MAKE_QLEVEL( 5,1), //  5*2=10
+    DV100_MAKE_QLEVEL( 6,1), //  6*2=12
+    DV100_MAKE_QLEVEL( 7,1), //  7*2=14
+    DV100_MAKE_QLEVEL( 9,0), // 16*1=16
+    DV100_MAKE_QLEVEL(10,0), // 18*1=18
+    DV100_MAKE_QLEVEL(11,0), // 20*1=20
+    DV100_MAKE_QLEVEL(12,0), // 22*1=22
+    DV100_MAKE_QLEVEL(13,0), // 24*1=24
+    DV100_MAKE_QLEVEL(14,0), // 28*1=28
+    DV100_MAKE_QLEVEL( 9,1), // 16*2=32
+    DV100_MAKE_QLEVEL(10,1), // 18*2=36
+    DV100_MAKE_QLEVEL(11,1), // 20*2=40
+    DV100_MAKE_QLEVEL(12,1), // 22*2=44
+    DV100_MAKE_QLEVEL(13,1), // 24*2=48
+    DV100_MAKE_QLEVEL(15,0), // 52*1=52
+    DV100_MAKE_QLEVEL(14,1), // 28*2=56
+    DV100_MAKE_QLEVEL( 9,2), // 16*4=64
+    DV100_MAKE_QLEVEL(10,2), // 18*4=72
+    DV100_MAKE_QLEVEL(11,2), // 20*4=80
+    DV100_MAKE_QLEVEL(12,2), // 22*4=88
+    DV100_MAKE_QLEVEL(13,2), // 24*4=96
+    // ...
+    DV100_MAKE_QLEVEL(15,3), // 52*8=416
+};
+
+static const int dv100_min_bias = 0;
+static const int dv100_chroma_bias = 0;
+static const int dv100_starting_qno = 1;
+
+#if DV100_SACRIFICE_QUALITY_FOR_SPEED
+static const int dv100_qlevel_inc = 4;
+#else
+static const int dv100_qlevel_inc = 1;
+#endif
+
+// 1/qstep, shifted up by 16 bits
+static const int dv100_qstep_bits = 16;
+static const int dv100_qstep_inv[16] = {
+        65536,  65536,  32768,  21845,  16384,  13107,  10923,  9362,  8192,  4096,  3641,  3277,  2979,  2731,  2341,  1260,
+};
+
+/* DV100 weights are pre-zigzagged, inverted and multiplied by 2^(dv100_weight_shift)
+   (in DV100 the AC components are divided by the spec weights) */
+static const int dv100_weight_shift = 16;
+static const int dv_weight_1080[2][64] = {
+    { 8192, 65536, 65536, 61681, 61681, 61681, 58254, 58254,
+      58254, 58254, 58254, 58254, 55188, 58254, 58254, 55188,
+      55188, 55188, 55188, 55188, 55188, 24966, 27594, 26214,
+      26214, 26214, 27594, 24966, 23831, 24385, 25575, 25575,
+      25575, 25575, 24385, 23831, 23302, 23302, 24966, 24966,
+      24966, 23302, 23302, 21845, 22795, 24385, 24385, 22795,
+      21845, 21400, 21845, 23831, 21845, 21400, 10382, 10700,
+      10700, 10382, 10082, 9620, 10082, 9039, 9039, 8525, },
+    { 8192, 65536, 65536, 61681, 61681, 61681, 41943, 41943,
+      41943, 41943, 40330, 41943, 40330, 41943, 40330, 40330,
+      40330, 38836, 38836, 40330, 40330, 24966, 27594, 26214,
+      26214, 26214, 27594, 24966, 23831, 24385, 25575, 25575,
+      25575, 25575, 24385, 23831, 11523, 11523, 12483, 12483,
+      12483, 11523, 11523, 10923, 11275, 12193, 12193, 11275,
+      10923, 5323, 5490, 5924, 5490, 5323, 5165, 5323,
+      5323, 5165, 5017, 4788, 5017, 4520, 4520, 4263, }
+};
+
+static const int dv_weight_720[2][64] = {
+    { 8192, 65536, 65536, 61681, 61681, 61681, 58254, 58254,
+      58254, 58254, 58254, 58254, 55188, 58254, 58254, 55188,
+      55188, 55188, 55188, 55188, 55188, 24966, 27594, 26214,
+      26214, 26214, 27594, 24966, 23831, 24385, 25575, 25575,
+      25575, 25575, 24385, 23831, 15420, 15420, 16644, 16644,
+      16644, 15420, 15420, 10923, 11398, 12193, 12193, 11398,
+      10923, 10700, 10923, 11916, 10923, 10700, 5191, 5350,
+      5350, 5191, 5041, 4810, 5041, 4520, 4520, 4263, },
+    { 8192, 43691, 43691, 40330, 40330, 40330, 29127, 29127,
+      29127, 29127, 29127, 29127, 27594, 29127, 29127, 27594,
+      27594, 27594, 27594, 27594, 27594, 12483, 13797, 13107,
+      13107, 13107, 13797, 12483, 11916, 12193, 12788, 12788,
+      12788, 12788, 12193, 11916, 5761, 5761, 6242, 6242,
+      6242, 5761, 5761, 5461, 5638, 5461, 6096, 5638,
+      5461, 2661, 2745, 2962, 2745, 2661, 2583, 2661,
+      2661, 2583, 2509, 2394, 2509, 2260, 2260, 2131, }
+};
+
+static av_always_inline int dv_set_class_number_sd(DVVideoContext *s,
+                                                   int16_t *blk, EncBlockInfo *bi,
+                                                   const uint8_t *zigzag_scan,
+                                                   const int *weight, int bias)
 {
-    const int *weight;
-    const uint8_t *zigzag_scan;
-    LOCAL_ALIGNED_16(int16_t, blk, [64]);
     int i, area;
     /* We offer two different methods for class number assignment: the
      * method suggested in SMPTE 314M Table 22, and an improved
@@ -271,31 +384,8 @@
     const unsigned deadzone = s->quant_deadzone;
     const unsigned threshold = 2 * deadzone;
 
-    av_assert2((((int) blk) & 15) == 0);
-
-    bi->area_q[0]          =
-    bi->area_q[1]          =
-    bi->area_q[2]          =
-    bi->area_q[3]          = 0;
-    bi->partial_bit_count  = 0;
-    bi->partial_bit_buffer = 0;
-    bi->cur_ac             = 0;
-    if (data) {
-        bi->dct_mode = dv_guess_dct_mode(s, data, linesize);
-        s->get_pixels(blk, data, linesize);
-        s->fdct[bi->dct_mode](blk);
-    } else {
-        /* We rely on the fact that encoding all zeros leads to an immediate
-         * EOB, which is precisely what the spec calls for in the "dummy"
-         * blocks. */
-        memset(blk, 0, 64 * sizeof(*blk));
-        bi->dct_mode = 0;
-    }
     bi->mb[0] = blk[0];
 
-    zigzag_scan = bi->dct_mode ? ff_dv_zigzag248_direct : ff_zigzag_direct;
-    weight      = bi->dct_mode ? dv_weight_248 : dv_weight_88;
-
     for (area = 0; area < 4; area++) {
         bi->prev[area]     = prev;
         bi->bit_size[area] = 1; // 4 areas 4 bits for EOB :)
@@ -350,6 +440,309 @@
            bi->bit_size[2] + bi->bit_size[3];
 }
 
+/* this function just copies the DCT coefficients and performs
+   the initial (non-)quantization. */
+static inline void dv_set_class_number_hd(DVVideoContext *s,
+                                          int16_t *blk, EncBlockInfo *bi,
+                                          const uint8_t *zigzag_scan,
+                                          const int *weight, int bias)
+{
+    int i, max = 0;
+
+    /* the first quantization (none at all) */
+    bi->area_q[0] = 1;
+
+    /* weigh AC components and store to save[] */
+    /* (i=0 is the DC component; we only include it to make the
+       number of loop iterations even, for future possible SIMD optimization) */
+    for (i = 0; i < 64; i += 2) {
+        int level0, level1;
+
+        /* get the AC component (in zig-zag order) */
+        level0 = blk[zigzag_scan[i+0]];
+        level1 = blk[zigzag_scan[i+1]];
+
+        /* extract sign and make it the lowest bit */
+        bi->sign[i+0] = (level0>>31)&1;
+        bi->sign[i+1] = (level1>>31)&1;
+
+        /* take absolute value of the level */
+        level0 = FFABS(level0);
+        level1 = FFABS(level1);
+
+        /* weigh it */
+        level0 = (level0*weight[i+0] + 4096 + (1<<17)) >> 18;
+        level1 = (level1*weight[i+1] + 4096 + (1<<17)) >> 18;
+
+        /* save unquantized value */
+        bi->save[i+0] = level0;
+        bi->save[i+1] = level1;
+
+         /* find max component */
+        if (bi->save[i+0] > max)
+            max = bi->save[i+0];
+        if (bi->save[i+1] > max)
+            max = bi->save[i+1];
+    }
+
+    /* copy DC component */
+    bi->mb[0] = blk[0];
+
+    /* the EOB code is 4 bits */
+    bi->bit_size[0] = 4;
+    bi->bit_size[1] = bi->bit_size[2] = bi->bit_size[3] = 0;
+
+    /* ensure that no AC coefficients are cut off */
+    bi->min_qlevel = ((max+256) >> 8);
+
+    bi->area_q[0] = 25; /* set to an "impossible" value */
+    bi->cno = 0;
+}
+
+static av_always_inline int dv_init_enc_block(EncBlockInfo* bi, uint8_t *data, int linesize,
+                                              DVVideoContext *s, int chroma)
+{
+    LOCAL_ALIGNED_16(int16_t, blk, [64]);
+
+    bi->area_q[0] = bi->area_q[1] = bi->area_q[2] = bi->area_q[3] = 0;
+    bi->partial_bit_count = 0;
+    bi->partial_bit_buffer = 0;
+    bi->cur_ac = 0;
+
+    if (data) {
+        if (DV_PROFILE_IS_HD(s->sys)) {
+            s->get_pixels(blk, data, linesize << bi->dct_mode);
+            s->fdct[0](blk);
+        } else {
+            bi->dct_mode = dv_guess_dct_mode(s, data, linesize);
+            s->get_pixels(blk, data, linesize);
+            s->fdct[bi->dct_mode](blk);
+        }
+    } else {
+        /* We rely on the fact that encoding all zeros leads to an immediate EOB,
+           which is precisely what the spec calls for in the "dummy" blocks. */
+        memset(blk, 0, 64*sizeof(*blk));
+        bi->dct_mode = 0;
+    }
+
+    if (DV_PROFILE_IS_HD(s->sys)) {
+        const int *weights;
+        if (s->sys->height == 1080) {
+            weights = dv_weight_1080[chroma];
+        } else { /* 720p */
+            weights = dv_weight_720[chroma];
+        }
+        dv_set_class_number_hd(s, blk, bi,
+                               ff_zigzag_direct,
+                               weights,
+                               dv100_min_bias+chroma*dv100_chroma_bias);
+    } else {
+        dv_set_class_number_sd(s, blk, bi,
+                               bi->dct_mode ? ff_dv_zigzag248_direct : ff_zigzag_direct,
+                               bi->dct_mode ? dv_weight_248 : dv_weight_88,
+                               chroma);
+    }
+
+    return bi->bit_size[0] + bi->bit_size[1] + bi->bit_size[2] + bi->bit_size[3];
+}
+
+/* DV100 quantize
+   Perform quantization by divinding the AC component by the qstep.
+   As an optimization we use a fixed-point integer multiply instead
+   of a divide. */
+static av_always_inline int dv100_quantize(int level, int qsinv)
+{
+    /* this code is equivalent to */
+    /* return (level + qs/2) / qs; */
+
+    return (level * qsinv + 1024 + (1<<(dv100_qstep_bits-1))) >> dv100_qstep_bits;
+
+    /* the extra +1024 is needed to make the rounding come out right. */
+
+    /* I (DJM) have verified that the results are exactly the same as
+       division for level 0-2048 at all QNOs. */
+}
+
+static int dv100_actual_quantize(EncBlockInfo *b, int qlevel)
+{
+    int prev, k, qsinv;
+
+    int qno = DV100_QLEVEL_QNO(dv100_qlevels[qlevel]);
+    int cno = DV100_QLEVEL_CNO(dv100_qlevels[qlevel]);
+
+    if (b->area_q[0] == qno && b->cno == cno)
+        return b->bit_size[0];
+
+    qsinv = dv100_qstep_inv[qno];
+
+    /* record the new qstep */
+    b->area_q[0] = qno;
+    b->cno = cno;
+
+    /* reset encoded size (EOB = 4 bits) */
+    b->bit_size[0] = 4;
+
+    /* visit nonzero components and quantize */
+    prev = 0;
+    for (k = 1; k < 64; k++) {
+        /* quantize */
+        int ac = dv100_quantize(b->save[k], qsinv) >> cno;
+        if (ac) {
+            if (ac > 255)
+                ac = 255;
+            b->mb[k] = ac;
+            b->bit_size[0] += dv_rl2vlc_size(k - prev - 1, ac);
+            b->next[prev] = k;
+            prev = k;
+        }
+    }
+    b->next[prev] = k;
+
+    return b->bit_size[0];
+}
+
+static inline void dv_guess_qnos_hd(EncBlockInfo *blks, int *qnos)
+{
+    EncBlockInfo *b;
+    int min_qlevel[5];
+    int qlevels[5];
+    int size[5];
+    int i, j;
+    /* cache block sizes at hypothetical qlevels */
+    uint16_t size_cache[5*8][DV100_NUM_QLEVELS] = {{0}};
+
+    /* get minimum qlevels */
+    for (i = 0; i < 5; i++) {
+        min_qlevel[i] = 1;
+        for (j = 0; j < 8; j++) {
+            if (blks[8*i+j].min_qlevel > min_qlevel[i])
+                min_qlevel[i] = blks[8*i+j].min_qlevel;
+        }
+    }
+
+    /* initialize sizes */
+    for (i = 0; i < 5; i++) {
+        qlevels[i] = dv100_starting_qno;
+        if (qlevels[i] < min_qlevel[i])
+            qlevels[i] = min_qlevel[i];
+
+        qnos[i] = DV100_QLEVEL_QNO(dv100_qlevels[qlevels[i]]);
+        size[i] = 0;
+        for (j = 0; j < 8; j++) {
+            size_cache[8*i+j][qlevels[i]] = dv100_actual_quantize(&blks[8*i+j], qlevels[i]);
+            size[i] += size_cache[8*i+j][qlevels[i]];
+        }
+    }
+
+    /* must we go coarser? */
+    if (size[0]+size[1]+size[2]+size[3]+size[4] > vs_total_ac_bits_hd) {
+        int largest = size[0] % 5; /* 'random' number */
+        int qlevels_done = 0;
+
+        do {
+            /* find the macroblock with the lowest qlevel */
+            for (i = 0; i < 5; i++) {
+                if (qlevels[i] < qlevels[largest])
+                    largest = i;
+            }
+
+            i = largest;
+            /* ensure that we don't enter infinite loop */
+            largest = (largest+1) % 5;
+
+            /* quantize a little bit more */
+            qlevels[i] += dv100_qlevel_inc;
+            if (qlevels[i] > DV100_NUM_QLEVELS-1) {
+                qlevels[i] = DV100_NUM_QLEVELS-1;
+                qlevels_done++;
+            }
+
+            qnos[i] = DV100_QLEVEL_QNO(dv100_qlevels[qlevels[i]]);
+            size[i] = 0;
+
+            /* for each block */
+            b = &blks[8*i];
+            for (j = 0; j < 8; j++, b++) {
+                /* accumulate block size into macroblock */
+                if(size_cache[8*i+j][qlevels[i]] == 0) {
+                    /* it is safe to use actual_quantize() here because we only go from finer to coarser,
+                       and it saves the final actual_quantize() down below */
+                    size_cache[8*i+j][qlevels[i]] = dv100_actual_quantize(b, qlevels[i]);
+                }
+                size[i] += size_cache[8*i+j][qlevels[i]];
+            } /* for each block */
+
+        } while (vs_total_ac_bits_hd < size[0] + size[1] + size[2] + size[3] + size[4] && qlevels_done < 5);
+
+        // can we go finer?
+    } else if (DV100_ENABLE_FINER &&
+               size[0]+size[1]+size[2]+size[3]+size[4] < vs_total_ac_bits_hd) {
+        int save_qlevel;
+        int largest = size[0] % 5; /* 'random' number */
+
+        while (qlevels[0] > min_qlevel[0] ||
+               qlevels[1] > min_qlevel[1] ||
+               qlevels[2] > min_qlevel[2] ||
+               qlevels[3] > min_qlevel[3] ||
+               qlevels[4] > min_qlevel[4]) {
+
+            /* find the macroblock with the highest qlevel */
+            for (i = 0; i < 5; i++) {
+                if (qlevels[i] > min_qlevel[i] && qlevels[i] > qlevels[largest])
+                    largest = i;
+            }
+
+            i = largest;
+
+            /* ensure that we don't enter infinite loop */
+            largest = (largest+1) % 5;
+
+            if (qlevels[i] <= min_qlevel[i]) {
+                /* can't unquantize any more */
+                continue;
+            }
+            /* quantize a little bit less */
+            save_qlevel = qlevels[i];
+            qlevels[i] -= dv100_qlevel_inc;
+            if (qlevels[i] < min_qlevel[i])
+                qlevels[i] = min_qlevel[i];
+
+            qnos[i] = DV100_QLEVEL_QNO(dv100_qlevels[qlevels[i]]);
+
+            size[i] = 0;
+
+            /* for each block */
+            b = &blks[8*i];
+            for (j = 0; j < 8; j++, b++) {
+                /* accumulate block size into macroblock */
+                if(size_cache[8*i+j][qlevels[i]] == 0) {
+                    size_cache[8*i+j][qlevels[i]] = dv100_actual_quantize(b, qlevels[i]);
+                }
+                size[i] += size_cache[8*i+j][qlevels[i]];
+            } /* for each block */
+
+            /* did we bust the limit? */
+            if (vs_total_ac_bits_hd < size[0] + size[1] + size[2] + size[3] + size[4]) {
+                /* go back down and exit */
+                qlevels[i] = save_qlevel;
+                qnos[i] = DV100_QLEVEL_QNO(dv100_qlevels[qlevels[i]]);
+                break;
+            }
+        }
+    }
+
+    /* now do the actual quantization */
+    for (i = 0; i < 5; i++) {
+        /* for each block */
+        b = &blks[8*i];
+        size[i] = 0;
+        for (j = 0; j < 8; j++, b++) {
+            /* accumulate block size into macroblock */
+            size[i] += dv100_actual_quantize(b, qlevels[i]);
+        } /* for each block */
+    }
+}
+
 static inline void dv_guess_qnos(EncBlockInfo *blks, int *qnos)
 {
     int size[5];
@@ -422,6 +815,26 @@
     }
 }
 
+/* update all cno values into the blocks, over-writing the old values without
+   touching anything else. (only used for DV100) */
+static inline void dv_revise_cnos(uint8_t *dif, EncBlockInfo *blk, const AVDVProfile *profile)
+{
+    uint8_t *data;
+    int mb_index, i;
+
+    for (mb_index = 0; mb_index < 5; mb_index++) {
+        data = dif + mb_index*80 + 4;
+        for (i = 0; i < profile->bpm; i++) {
+            /* zero out the class number */
+            data[1] &= 0xCF;
+            /* add the new one */
+            data[1] |= blk[profile->bpm*mb_index+i].cno << 4;
+
+            data += profile->block_sizes[i] >> 3;
+        }
+    }
+}
+
 static int dv_encode_video_segment(AVCodecContext *avctx, void *arg)
 {
     DVVideoContext *s = avctx->priv_data;
@@ -430,26 +843,38 @@
     int mb_x, mb_y, c_offset;
     ptrdiff_t linesize, y_stride;
     uint8_t *y_ptr;
-    uint8_t *dif;
+    uint8_t *dif, *p;
     LOCAL_ALIGNED_8(uint8_t, scratch, [128]);
     EncBlockInfo enc_blks[5 * DV_MAX_BPM];
     PutBitContext pbs[5 * DV_MAX_BPM];
     PutBitContext *pb;
     EncBlockInfo *enc_blk;
     int vs_bit_size = 0;
-    int qnos[5] = { 15, 15, 15, 15, 15 }; /* No quantization */
+    int qnos[5];
     int *qnosp = &qnos[0];
 
-    dif     = &s->buf[work_chunk->buf_offset * 80];
+    p = dif = &s->buf[work_chunk->buf_offset * 80];
     enc_blk = &enc_blks[0];
     for (mb_index = 0; mb_index < 5; mb_index++) {
         dv_calculate_mb_xy(s, work_chunk, mb_index, &mb_x, &mb_y);
 
+        qnos[mb_index] = DV_PROFILE_IS_HD(s->sys) ? 1 : 15;
+
+        y_ptr    = s->frame->data[0] + ((mb_y * s->frame->linesize[0] + mb_x) << 3);
+        linesize = s->frame->linesize[0];
+
+        if (s->sys->height == 1080 && mb_y < 134)
+            enc_blk->dct_mode = dv_guess_dct_mode(s, y_ptr, linesize);
+        else
+            enc_blk->dct_mode = 0;
+        for (i = 1; i < 8; i++)
+            enc_blk[i].dct_mode = enc_blk->dct_mode;
+
         /* initializing luminance blocks */
         if ((s->sys->pix_fmt == AV_PIX_FMT_YUV420P)                      ||
             (s->sys->pix_fmt == AV_PIX_FMT_YUV411P && mb_x >= (704 / 8)) ||
             (s->sys->height >= 720 && mb_y != 134)) {
-            y_stride = s->frame->linesize[0] << 3;
+            y_stride = s->frame->linesize[0] << (3*!enc_blk->dct_mode);
         } else {
             y_stride = 16;
         }
@@ -478,7 +903,7 @@
         for (j = 2; j; j--) {
             uint8_t *c_ptr = s->frame->data[j] + c_offset;
             linesize = s->frame->linesize[j];
-            y_stride = (mb_y == 134) ? 8 : (s->frame->linesize[j] << 3);
+            y_stride = (mb_y == 134) ? 8 : (s->frame->linesize[j] << (3*!enc_blk->dct_mode));
             if (s->sys->pix_fmt == AV_PIX_FMT_YUV411P && mb_x >= (704 / 8)) {
                 uint8_t *d;
                 uint8_t *b = scratch;
@@ -506,27 +931,31 @@
         }
     }
 
-    if (vs_total_ac_bits < vs_bit_size)
+    if (DV_PROFILE_IS_HD(s->sys)) {
+        /* unconditional */
+        dv_guess_qnos_hd(&enc_blks[0], qnosp);
+    } else if (vs_total_ac_bits < vs_bit_size) {
         dv_guess_qnos(&enc_blks[0], qnosp);
+    }
 
     /* DIF encoding process */
     for (j = 0; j < 5 * s->sys->bpm;) {
         int start_mb = j;
 
-        dif[3] = *qnosp++;
-        dif   += 4;
+        p[3] = *qnosp++;
+        p += 4;
 
         /* First pass over individual cells only */
         for (i = 0; i < s->sys->bpm; i++, j++) {
             int sz = s->sys->block_sizes[i] >> 3;
 
-            init_put_bits(&pbs[j], dif, sz);
+            init_put_bits(&pbs[j], p, sz);
             put_sbits(&pbs[j], 9, ((enc_blks[j].mb[0] >> 3) - 1024 + 2) >> 2);
-            put_bits(&pbs[j], 1, enc_blks[j].dct_mode);
+            put_bits(&pbs[j], 1, DV_PROFILE_IS_HD(s->sys) && i ? 1 : enc_blks[j].dct_mode);
             put_bits(&pbs[j], 2, enc_blks[j].cno);
 
             dv_encode_ac(&enc_blks[j], &pbs[j], &pbs[j + 1]);
-            dif += sz;
+            p += sz;
         }
 
         /* Second pass over each MB space */
@@ -559,6 +988,9 @@
         memset(pbs[j].buf + pos, 0xff, size - pos);
     }
 
+    if (DV_PROFILE_IS_HD(s->sys))
+        dv_revise_cnos(dif, enc_blks, s->sys);
+
     return 0;
 }
 
@@ -583,12 +1015,19 @@
      *   2. It is not at all clear what STYPE is used for 4:2:0 PAL
      *      compression scheme (if any).
      */
-    int apt = (c->sys->pix_fmt == AV_PIX_FMT_YUV420P ? 0 : 1);
-    int fs  = c->frame->top_field_first ? 0x00 : 0x40;
-
     uint8_t aspect = 0;
-    if ((int) (av_q2d(c->avctx->sample_aspect_ratio) *
-               c->avctx->width / c->avctx->height * 10) >= 17) /* 16:9 */
+    int apt = (c->sys->pix_fmt == AV_PIX_FMT_YUV420P ? 0 : 1);
+    int fs;
+
+    if (c->avctx->height >= 720)
+        fs = c->avctx->height == 720 || c->frame->top_field_first ? 0x40 : 0x00;
+    else
+        fs = c->frame->top_field_first ? 0x00 : 0x40;
+
+    if (DV_PROFILE_IS_HD(c->sys) ||
+        (int)(av_q2d(c->avctx->sample_aspect_ratio) *
+              c->avctx->width / c->avctx->height * 10) >= 17)
+        /* HD formats are always 16:9 */
         aspect = 0x02;
 
     buf[0] = (uint8_t) pack_id;
@@ -643,10 +1082,14 @@
                                   uint8_t seq_num, uint8_t dif_num,
                                   uint8_t *buf)
 {
+    int fsc = chan_num & 1;
+    int fsp = 1 - (chan_num >> 1);
+
     buf[0] = (uint8_t) t;      /* Section type */
     buf[1] = (seq_num  << 4) | /* DIF seq number 0-9 for 525/60; 0-11 for 625/50 */
-             (chan_num << 3) | /* FSC: for 50Mb/s 0 - first channel; 1 - second */
-             7;                /* reserved -- always 1 */
+             (fsc << 3) |      /* FSC: for 50 and 100Mb/s 0 - first channel; 1 - second */
+             (fsp << 2) |      /* FSP: for 100Mb/s 1 - channels 0-1; 0 - channels 2-3 */
+             3;                /* reserved -- always 1 */
     buf[2] = dif_num;          /* DIF block number Video: 0-134, Audio: 0-8 */
     return 3;
 }
@@ -674,20 +1117,22 @@
 static void dv_format_frame(DVVideoContext *c, uint8_t *buf)
 {
     int chan, i, j, k;
+    /* We work with 720p frames split in half. The odd half-frame is chan 2,3 */
+    int chan_offset = 2*(c->sys->height == 720 && c->avctx->frame_number & 1);
 
     for (chan = 0; chan < c->sys->n_difchan; chan++) {
         for (i = 0; i < c->sys->difseg_size; i++) {
             memset(buf, 0xff, 80 * 6); /* first 6 DIF blocks are for control data */
 
             /* DV header: 1DIF */
-            buf += dv_write_dif_id(dv_sect_header, chan, i, 0, buf);
+            buf += dv_write_dif_id(dv_sect_header, chan+chan_offset, i, 0, buf);
             buf += dv_write_pack((c->sys->dsf ? dv_header625 : dv_header525),
                                  c, buf);
             buf += 72; /* unused bytes */
 
             /* DV subcode: 2DIFs */
             for (j = 0; j < 2; j++) {
-                buf += dv_write_dif_id(dv_sect_subcode, chan, i, j, buf);
+                buf += dv_write_dif_id(dv_sect_subcode, chan+chan_offset, i, j, buf);
                 for (k = 0; k < 6; k++)
                     buf += dv_write_ssyb_id(k, (i < c->sys->difseg_size / 2), buf) + 5;
                 buf += 29; /* unused bytes */
@@ -695,7 +1140,7 @@
 
             /* DV VAUX: 3DIFS */
             for (j = 0; j < 3; j++) {
-                buf += dv_write_dif_id(dv_sect_vaux, chan, i, j, buf);
+                buf += dv_write_dif_id(dv_sect_vaux, chan+chan_offset, i, j, buf);
                 buf += dv_write_pack(dv_video_source,  c, buf);
                 buf += dv_write_pack(dv_video_control, c, buf);
                 buf += 7 * 5;
@@ -708,10 +1153,10 @@
             for (j = 0; j < 135; j++) {
                 if (j % 15 == 0) {
                     memset(buf, 0xff, 80);
-                    buf += dv_write_dif_id(dv_sect_audio, chan, i, j / 15, buf);
+                    buf += dv_write_dif_id(dv_sect_audio, chan+chan_offset, i, j/15, buf);
                     buf += 77; /* audio control & shuffled PCM audio */
                 }
-                buf += dv_write_dif_id(dv_sect_video, chan, i, j, buf);
+                buf += dv_write_dif_id(dv_sect_video, chan+chan_offset, i, j, buf);
                 buf += 77; /* 1 video macroblock: 1 bytes control
                             * 4 * 14 bytes Y 8x8 data
                             * 10 bytes Cr 8x8 data
@@ -738,15 +1183,15 @@
     c->coded_frame->pict_type = AV_PICTURE_TYPE_I;
 FF_ENABLE_DEPRECATION_WARNINGS
 #endif
-
     s->buf = pkt->data;
+
+    dv_format_frame(s, pkt->data);
+
     c->execute(c, dv_encode_video_segment, s->work_chunks, NULL,
                dv_work_pool_size(s->sys), sizeof(DVwork_chunk));
 
     emms_c();
 
-    dv_format_frame(s, pkt->data);
-
     pkt->flags |= AV_PKT_FLAG_KEY;
     *got_packet = 1;
 
diff --git a/libavcodec/dxtory.c b/libavcodec/dxtory.c
index 285ca38..4dd6753 100644
--- a/libavcodec/dxtory.c
+++ b/libavcodec/dxtory.c
@@ -272,10 +272,11 @@
                             setup_lru_func setup_lru,
                             enum AVPixelFormat fmt)
 {
-    GetByteContext gb;
+    GetByteContext gb, gb_check;
     GetBitContext  gb2;
     int nslices, slice, line = 0;
     uint32_t off, slice_size;
+    uint64_t off_check;
     uint8_t lru[3][8];
     int ret;
 
@@ -283,6 +284,19 @@
     if (ret < 0)
         return ret;
 
+    off_check = off;
+    gb_check = gb;
+    for (slice = 0; slice < nslices; slice++) {
+        slice_size = bytestream2_get_le32(&gb_check);
+
+        if (slice_size <= 16 + (avctx->height * avctx->width / (8 * nslices)))
+            return AVERROR_INVALIDDATA;
+        off_check += slice_size;
+    }
+
+    if (off_check - avctx->discard_damaged_percentage*off_check/100 > src_size)
+        return AVERROR_INVALIDDATA;
+
     avctx->pix_fmt = fmt;
     if ((ret = ff_get_buffer(avctx, pic, 0)) < 0)
         return ret;
diff --git a/libavcodec/dxv.c b/libavcodec/dxv.c
index 08aca73..71d8520 100644
--- a/libavcodec/dxv.c
+++ b/libavcodec/dxv.c
@@ -256,6 +256,8 @@
 #define CHECKPOINT(x)                                                         \
     do {                                                                      \
         if (state == 0) {                                                     \
+            if (bytestream2_get_bytes_left(gbc) < 4)                          \
+                return AVERROR_INVALIDDATA;                                   \
             value = bytestream2_get_le32(gbc);                                \
             state = 16;                                                       \
         }                                                                     \
@@ -426,7 +428,8 @@
 static int get_opcodes(GetByteContext *gb, uint32_t *table, uint8_t *dst, int op_size, int nb_elements)
 {
     OpcodeTable optable[1024];
-    int sum, x, val, lshift, rshift, ret, size_in_bits, i, idx;
+    int sum, x, val, lshift, rshift, ret, i, idx;
+    int64_t size_in_bits;
     unsigned endoffset, newoffset, offset;
     unsigned next;
     uint8_t *src = (uint8_t *)gb->buffer;
@@ -742,6 +745,9 @@
     int skip0, skip1, oi0 = 0, oi1 = 0;
     int ret, state0 = 0, state1 = 0;
 
+    if (op_offset < 12 || op_offset - 12 > bytestream2_get_bytes_left(gb))
+        return AVERROR_INVALIDDATA;
+
     dst = tex_data;
     bytestream2_skip(gb, op_offset - 12);
     if (op_size0 > max_op_size0)
@@ -749,7 +755,6 @@
     skip0 = dxv_decompress_opcodes(gb, op_data0, op_size0);
     if (skip0 < 0)
         return skip0;
-    bytestream2_seek(gb, data_start + op_offset + skip0 - 12, SEEK_SET);
     if (op_size1 > max_op_size1)
         return AVERROR_INVALIDDATA;
     skip1 = dxv_decompress_opcodes(gb, op_data1, op_size1);
@@ -778,7 +783,7 @@
             return ret;
     }
 
-    bytestream2_seek(gb, data_start + op_offset + skip0 + skip1 - 12, SEEK_SET);
+    bytestream2_seek(gb, data_start - 12 + op_offset + skip0 + skip1, SEEK_SET);
 
     return 0;
 }
@@ -793,6 +798,9 @@
     uint8_t *dst, *table0[256] = { 0 }, *table1[256] = { 0 };
     int ret, state = 0, skip, oi = 0, v, vv;
 
+    if (op_offset < 8 || op_offset - 8 > bytestream2_get_bytes_left(gb))
+        return AVERROR_INVALIDDATA;
+
     dst = tex_data;
     bytestream2_skip(gb, op_offset - 8);
     if (op_size > max_op_size)
@@ -859,8 +867,8 @@
 {
     DXVContext *ctx = avctx->priv_data;
     GetByteContext *gbc = &ctx->gbc;
-    uint32_t value, op;
-    int idx, prev, state = 0;
+    uint32_t value, op, prev;
+    int idx, state = 0;
     int pos = 4;
     int run = 0;
     int probe, check;
@@ -1051,6 +1059,10 @@
     avctx->pix_fmt = AV_PIX_FMT_RGBA;
     avctx->colorspace = AVCOL_SPC_RGB;
 
+    ctx->tex_funct = NULL;
+    ctx->tex_funct_planar[0] = NULL;
+    ctx->tex_funct_planar[1] = NULL;
+
     tag = bytestream2_get_le32(gbc);
     switch (tag) {
     case MKBETAG('D', 'X', 'T', '1'):
@@ -1192,6 +1204,12 @@
     ret = decompress_tex(avctx);
     if (ret < 0)
         return ret;
+    {
+        int w_block = avctx->coded_width / ctx->texture_block_w;
+        int h_block = avctx->coded_height / ctx->texture_block_h;
+        if (w_block * h_block * ctx->tex_step > ctx->tex_size * 8LL)
+            return AVERROR_INVALIDDATA;
+    }
 
     tframe.f = data;
     ret = ff_thread_get_buffer(avctx, &tframe, 0);
diff --git a/libavcodec/eac3dec.c b/libavcodec/eac3dec.c
index 73067de..3a5c798 100644
--- a/libavcodec/eac3dec.c
+++ b/libavcodec/eac3dec.c
@@ -31,12 +31,6 @@
  *     No known samples exist.  The spec also does not give clear information
  *     on how this is to be implemented.
  *
- * Dependent Streams
- *     Only the independent stream is currently decoded. Any dependent
- *     streams are skipped.  We have only come across two examples of this, and
- *     they are both just test streams, one for HD-DVD and the other for
- *     Blu-ray.
- *
  * Transient Pre-noise Processing
  *     This is side information which a decoder should use to reduce artifacts
  *     caused by transients.  There are samples which are known to have this
diff --git a/libavcodec/eac3enc.c b/libavcodec/eac3enc.c
index e1d61f6..6a90571 100644
--- a/libavcodec/eac3enc.c
+++ b/libavcodec/eac3enc.c
@@ -263,6 +263,7 @@
     .sample_fmts     = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_FLTP,
                                                       AV_SAMPLE_FMT_NONE },
     .priv_class      = &eac3enc_class,
+    .supported_samplerates = ff_ac3_sample_rate_tab,
     .channel_layouts = ff_ac3_channel_layouts,
     .defaults        = ac3_defaults,
 };
diff --git a/libavcodec/eacmv.c b/libavcodec/eacmv.c
index bf4404c..6f39d72 100644
--- a/libavcodec/eacmv.c
+++ b/libavcodec/eacmv.c
@@ -191,12 +191,12 @@
         if (ret < 0)
             return ret;
         if (size > buf_end - buf - EA_PREAMBLE_SIZE)
-            return -1;
+            return AVERROR_INVALIDDATA;
         buf += size;
     }
 
-    if (av_image_check_size(s->width, s->height, 0, s->avctx))
-        return -1;
+    if ((ret = av_image_check_size(s->width, s->height, 0, s->avctx)) < 0)
+        return ret;
 
     if ((ret = ff_get_buffer(avctx, frame, AV_GET_BUFFER_FLAG_REF)) < 0)
         return ret;
diff --git a/libavcodec/eatgv.c b/libavcodec/eatgv.c
index 93e291f..f82f7b9 100644
--- a/libavcodec/eatgv.c
+++ b/libavcodec/eatgv.c
@@ -300,6 +300,9 @@
             s->palette[i] = 0xFFU << 24 | AV_RB24(buf);
             buf += 3;
         }
+        if (buf_end - buf < 5) {
+            return AVERROR_INVALIDDATA;
+        }
     }
 
     if ((ret = ff_get_buffer(avctx, frame, AV_GET_BUFFER_FLAG_REF)) < 0)
diff --git a/libavcodec/eatqi.c b/libavcodec/eatqi.c
index 1a847a3..96536b1 100644
--- a/libavcodec/eatqi.c
+++ b/libavcodec/eatqi.c
@@ -83,7 +83,7 @@
         if (ret < 0) {
             av_log(t->avctx, AV_LOG_ERROR, "ac-tex damaged at %d %d\n",
                    t->mb_x, t->mb_y);
-            return -1;
+            return ret;
         }
     }
 
@@ -131,6 +131,9 @@
     AVFrame *frame = data;
     int ret, w, h;
 
+    if (buf_size < 12)
+        return AVERROR_INVALIDDATA;
+
     t->avctx = avctx;
 
     w = AV_RL16(&buf[0]);
diff --git a/libavcodec/encode.c b/libavcodec/encode.c
index d12c425..9ed2cf0 100644
--- a/libavcodec/encode.c
+++ b/libavcodec/encode.c
@@ -174,8 +174,14 @@
                 goto end;
             }
         } else if (!(avctx->codec->capabilities & AV_CODEC_CAP_VARIABLE_FRAME_SIZE)) {
-            if (frame->nb_samples < avctx->frame_size &&
-                !avctx->internal->last_audio_frame) {
+            /* if we already got an undersized frame, that must have been the last */
+            if (avctx->internal->last_audio_frame) {
+                av_log(avctx, AV_LOG_ERROR, "frame_size (%d) was not respected for a non-last frame (avcodec_encode_audio2)\n", avctx->frame_size);
+                ret = AVERROR(EINVAL);
+                goto end;
+            }
+
+            if (frame->nb_samples < avctx->frame_size) {
                 ret = pad_last_frame(avctx, &padded_frame, frame);
                 if (ret < 0)
                     goto end;
@@ -422,9 +428,15 @@
         return AVERROR(EINVAL);
 
     if (avctx->codec->receive_packet) {
+        int ret;
         if (avctx->internal->draining && !(avctx->codec->capabilities & AV_CODEC_CAP_DELAY))
             return AVERROR_EOF;
-        return avctx->codec->receive_packet(avctx, avpkt);
+        ret = avctx->codec->receive_packet(avctx, avpkt);
+        if (!ret)
+            // Encoders must always return ref-counted buffers.
+            // Side-data only packets have no data and can be not ref-counted.
+            av_assert0(!avpkt->data || avpkt->buf);
+        return ret;
     }
 
     // Emulation via old API.
diff --git a/libavcodec/error_resilience.c b/libavcodec/error_resilience.c
index 1abae53..ca22871 100644
--- a/libavcodec/error_resilience.c
+++ b/libavcodec/error_resilience.c
@@ -437,7 +437,7 @@
     }
 
     if ((!(s->avctx->error_concealment&FF_EC_GUESS_MVS)) ||
-        num_avail <= mb_width / 2) {
+        num_avail <= FFMAX(mb_width, mb_height) / 2) {
         for (mb_y = 0; mb_y < mb_height; mb_y++) {
             for (mb_x = 0; mb_x < s->mb_width; mb_x++) {
                 const int mb_xy = mb_x + mb_y * s->mb_stride;
@@ -1121,6 +1121,8 @@
     av_log(s->avctx, AV_LOG_INFO, "concealing %d DC, %d AC, %d MV errors in %c frame\n",
            dc_error, ac_error, mv_error, av_get_picture_type_char(s->cur_pic.f->pict_type));
 
+    s->cur_pic.f->decode_error_flags |= FF_DECODE_ERROR_CONCEALMENT_ACTIVE;
+
     is_intra_likely = is_intra_more_likely(s);
 
     /* set unknown mb-type to most likely */
diff --git a/libavcodec/escape124.c b/libavcodec/escape124.c
index cffd3e1..94c2a96 100644
--- a/libavcodec/escape124.c
+++ b/libavcodec/escape124.c
@@ -252,7 +252,7 @@
             if (i == 2) {
                 // This codebook can be cut off at places other than
                 // powers of 2, leaving some of the entries undefined.
-                cb_size = get_bits_long(&gb, 20);
+                cb_size = get_bits(&gb, 20);
                 if (!cb_size) {
                     av_log(avctx, AV_LOG_ERROR, "Invalid codebook size 0.\n");
                     return AVERROR_INVALIDDATA;
diff --git a/libavcodec/exr.c b/libavcodec/exr.c
index 5253cc3..73419ea 100644
--- a/libavcodec/exr.c
+++ b/libavcodec/exr.c
@@ -41,6 +41,7 @@
 #include "libavutil/common.h"
 #include "libavutil/imgutils.h"
 #include "libavutil/intfloat.h"
+#include "libavutil/avstring.h"
 #include "libavutil/opt.h"
 #include "libavutil/color_utils.h"
 
@@ -881,7 +882,7 @@
                 in     = ptr[3] + s->xdelta;
 
                 for (j = 0; j < s->xdelta; ++j) {
-                    uint32_t diff = (*(ptr[0]++) << 24) |
+                    uint32_t diff = ((uint32_t)*(ptr[0]++) << 24) |
                     (*(ptr[1]++) << 16) |
                     (*(ptr[2]++) << 8 ) |
                     (*(ptr[3]++));
@@ -1182,7 +1183,7 @@
         const uint8_t * a;
         const uint8_t *rgb[3];
 
-        for (c = 0; c < rgb_channel_count; c++){
+        for (c = 0; c < rgb_channel_count; c++) {
             rgb[c] = channel_buffer[c];
         }
 
@@ -1307,6 +1308,7 @@
     int magic_number, version, i, flags, sar = 0;
     int layer_match = 0;
     int ret;
+    int dup_channels = 0;
 
     s->current_channel_offset = 0;
     s->xmin               = ~0;
@@ -1389,6 +1391,7 @@
                         if (*ch_gb.buffer == '.')
                             ch_gb.buffer++;         /* skip dot if not given */
                     } else {
+                        layer_match = 0;
                         av_log(s->avctx, AV_LOG_INFO,
                                "Channel doesn't match layer : %s.\n", ch_gb.buffer);
                     }
@@ -1397,24 +1400,24 @@
                 }
 
                 if (layer_match) { /* only search channel if the layer match is valid */
-                    if (!strcmp(ch_gb.buffer, "R") ||
-                        !strcmp(ch_gb.buffer, "X") ||
-                        !strcmp(ch_gb.buffer, "U")) {
+                    if (!av_strcasecmp(ch_gb.buffer, "R") ||
+                        !av_strcasecmp(ch_gb.buffer, "X") ||
+                        !av_strcasecmp(ch_gb.buffer, "U")) {
                         channel_index = 0;
                         s->is_luma = 0;
-                    } else if (!strcmp(ch_gb.buffer, "G") ||
-                               !strcmp(ch_gb.buffer, "V")) {
+                    } else if (!av_strcasecmp(ch_gb.buffer, "G") ||
+                               !av_strcasecmp(ch_gb.buffer, "V")) {
                         channel_index = 1;
                         s->is_luma = 0;
-                    } else if (!strcmp(ch_gb.buffer, "Y")) {
+                    } else if (!av_strcasecmp(ch_gb.buffer, "Y")) {
                         channel_index = 1;
                         s->is_luma = 1;
-                    } else if (!strcmp(ch_gb.buffer, "B") ||
-                               !strcmp(ch_gb.buffer, "Z") ||
-                               !strcmp(ch_gb.buffer, "W")){
-                               channel_index = 2;
+                    } else if (!av_strcasecmp(ch_gb.buffer, "B") ||
+                               !av_strcasecmp(ch_gb.buffer, "Z") ||
+                               !av_strcasecmp(ch_gb.buffer, "W")) {
+                        channel_index = 2;
                         s->is_luma = 0;
-                    } else if (!strcmp(ch_gb.buffer, "A")) {
+                    } else if (!av_strcasecmp(ch_gb.buffer, "A")) {
                         channel_index = 3;
                     } else {
                         av_log(s->avctx, AV_LOG_WARNING,
@@ -1463,6 +1466,13 @@
                     }
                     s->pixel_type                     = current_pixel_type;
                     s->channel_offsets[channel_index] = s->current_channel_offset;
+                } else if (channel_index >= 0) {
+                    av_log(s->avctx, AV_LOG_WARNING,
+                            "Multiple channels with index %d.\n", channel_index);
+                    if (++dup_channels > 10) {
+                        ret = AVERROR_INVALIDDATA;
+                        goto fail;
+                    }
                 }
 
                 s->channels = av_realloc(s->channels,
@@ -1485,7 +1495,7 @@
 
             /* Check if all channels are set with an offset or if the channels
              * are causing an overflow  */
-            if (!s->is_luma){/* if we expected to have at least 3 channels */
+            if (!s->is_luma) {/* if we expected to have at least 3 channels */
                 if (FFMIN3(s->channel_offsets[0],
                            s->channel_offsets[1],
                            s->channel_offsets[2]) < 0) {
@@ -1586,7 +1596,7 @@
             s->tile_attr.level_mode = tileLevel & 0x0f;
             s->tile_attr.level_round = (tileLevel >> 4) & 0x0f;
 
-            if (s->tile_attr.level_mode >= EXR_TILE_LEVEL_UNKNOWN){
+            if (s->tile_attr.level_mode >= EXR_TILE_LEVEL_UNKNOWN) {
                 avpriv_report_missing_feature(s->avctx, "Tile level mode %d",
                                               s->tile_attr.level_mode);
                 ret = AVERROR_PATCHWELCOME;
@@ -1853,19 +1863,6 @@
     return 0;
 }
 
-#if HAVE_THREADS
-static int decode_init_thread_copy(AVCodecContext *avctx)
-{    EXRContext *s = avctx->priv_data;
-
-    // allocate thread data, used for non EXR_RAW compression types
-    s->thread_data = av_mallocz_array(avctx->thread_count, sizeof(EXRThreadData));
-    if (!s->thread_data)
-        return AVERROR_INVALIDDATA;
-
-    return 0;
-}
-#endif
-
 static av_cold int decode_end(AVCodecContext *avctx)
 {
     EXRContext *s = avctx->priv_data;
@@ -1945,7 +1942,6 @@
     .id               = AV_CODEC_ID_EXR,
     .priv_data_size   = sizeof(EXRContext),
     .init             = decode_init,
-    .init_thread_copy = ONLY_IF_THREADS_ENABLED(decode_init_thread_copy),
     .close            = decode_end,
     .decode           = decode_frame,
     .capabilities     = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_FRAME_THREADS |
diff --git a/libavcodec/extract_extradata_bsf.c b/libavcodec/extract_extradata_bsf.c
index 9c9fb0c..9fcaf6d 100644
--- a/libavcodec/extract_extradata_bsf.c
+++ b/libavcodec/extract_extradata_bsf.c
@@ -27,6 +27,7 @@
 #include "av1.h"
 #include "av1_parse.h"
 #include "bsf.h"
+#include "bytestream.h"
 #include "h2645_parse.h"
 #include "h264.h"
 #include "hevc.h"
@@ -38,10 +39,10 @@
     int (*extract)(AVBSFContext *ctx, AVPacket *pkt,
                    uint8_t **data, int *size);
 
-    /* AV1 specifc fields */
+    /* AV1 specific fields */
     AV1Packet av1_pkt;
 
-    /* H264/HEVC specifc fields */
+    /* H264/HEVC specific fields */
     H2645Packet h2645_pkt;
 
     /* AVOptions */
@@ -85,8 +86,9 @@
     }
 
     if (extradata_size && has_seq) {
-        AVBufferRef *filtered_buf;
-        uint8_t *extradata, *filtered_data;
+        AVBufferRef *filtered_buf = NULL;
+        PutByteContext pb_filtered_data, pb_extradata;
+        uint8_t *extradata;
 
         if (s->remove) {
             filtered_buf = av_buffer_alloc(filtered_size + AV_INPUT_BUFFER_PADDING_SIZE);
@@ -94,8 +96,6 @@
                 return AVERROR(ENOMEM);
             }
             memset(filtered_buf->data + filtered_size, 0, AV_INPUT_BUFFER_PADDING_SIZE);
-
-            filtered_data = filtered_buf->data;
         }
 
         extradata = av_malloc(extradata_size + AV_INPUT_BUFFER_PADDING_SIZE);
@@ -108,15 +108,17 @@
         *data = extradata;
         *size = extradata_size;
 
+        bytestream2_init_writer(&pb_extradata, extradata, extradata_size);
+        if (s->remove)
+            bytestream2_init_writer(&pb_filtered_data, filtered_buf->data, filtered_size);
+
         for (i = 0; i < s->av1_pkt.nb_obus; i++) {
             AV1OBU *obu = &s->av1_pkt.obus[i];
             if (val_in_array(extradata_obu_types, nb_extradata_obu_types,
                              obu->type)) {
-                memcpy(extradata, obu->raw_data, obu->raw_size);
-                extradata += obu->raw_size;
+                bytestream2_put_bufferu(&pb_extradata, obu->raw_data, obu->raw_size);
             } else if (s->remove) {
-                memcpy(filtered_data, obu->raw_data, obu->raw_size);
-                filtered_data += obu->raw_size;
+                bytestream2_put_bufferu(&pb_filtered_data, obu->raw_data, obu->raw_size);
             }
         }
 
@@ -157,7 +159,7 @@
     }
 
     ret = ff_h2645_packet_split(&s->h2645_pkt, pkt->data, pkt->size,
-                                ctx, 0, 0, ctx->par_in->codec_id, 1);
+                                ctx, 0, 0, ctx->par_in->codec_id, 1, 0);
     if (ret < 0)
         goto fail;
 
@@ -179,8 +181,9 @@
     if (extradata_size &&
         ((ctx->par_in->codec_id == AV_CODEC_ID_HEVC && has_sps && has_vps) ||
          (ctx->par_in->codec_id == AV_CODEC_ID_H264 && has_sps))) {
-        AVBufferRef *filtered_buf;
-        uint8_t *extradata, *filtered_data;
+        AVBufferRef *filtered_buf = NULL;
+        PutByteContext pb_filtered_data, pb_extradata;
+        uint8_t *extradata;
 
         if (s->remove) {
             filtered_buf = av_buffer_alloc(filtered_size + AV_INPUT_BUFFER_PADDING_SIZE);
@@ -188,8 +191,6 @@
                 return AVERROR(ENOMEM);
             }
             memset(filtered_buf->data + filtered_size, 0, AV_INPUT_BUFFER_PADDING_SIZE);
-
-            filtered_data = filtered_buf->data;
         }
 
         extradata = av_malloc(extradata_size + AV_INPUT_BUFFER_PADDING_SIZE);
@@ -202,17 +203,19 @@
         *data = extradata;
         *size = extradata_size;
 
+        bytestream2_init_writer(&pb_extradata, extradata, extradata_size);
+        if (s->remove)
+            bytestream2_init_writer(&pb_filtered_data, filtered_buf->data, filtered_size);
+
         for (i = 0; i < s->h2645_pkt.nb_nals; i++) {
             H2645NAL *nal = &s->h2645_pkt.nals[i];
             if (val_in_array(extradata_nal_types, nb_extradata_nal_types,
                              nal->type)) {
-                AV_WB24(extradata, 1); // startcode
-                memcpy(extradata + 3, nal->raw_data, nal->raw_size);
-                extradata += 3 + nal->raw_size;
+                bytestream2_put_be24u(&pb_extradata, 1); //startcode
+                bytestream2_put_bufferu(&pb_extradata, nal->raw_data, nal->raw_size);
             } else if (s->remove) {
-                AV_WB24(filtered_data, 1); // startcode
-                memcpy(filtered_data + 3, nal->raw_data, nal->raw_size);
-                filtered_data += 3 + nal->raw_size;
+                bytestream2_put_be24u(&pb_filtered_data, 1); // startcode
+                bytestream2_put_bufferu(&pb_filtered_data, nal->raw_data, nal->raw_size);
             }
         }
 
diff --git a/libavcodec/fft_template.c b/libavcodec/fft_template.c
index 762c014..20a62e4 100644
--- a/libavcodec/fft_template.c
+++ b/libavcodec/fft_template.c
@@ -261,17 +261,41 @@
     if (s->fft_permutation == FF_FFT_PERM_AVX) {
         fft_perm_avx(s);
     } else {
-        for(i=0; i<n; i++) {
-            int k;
-            j = i;
-            if (s->fft_permutation == FF_FFT_PERM_SWAP_LSBS)
-                j = (j&~3) | ((j>>1)&1) | ((j<<1)&2);
-            k = -split_radix_permutation(i, n, s->inverse) & (n-1);
-            if (s->revtab)
-                s->revtab[k] = j;
-            if (s->revtab32)
-                s->revtab32[k] = j;
-        }
+#define PROCESS_FFT_PERM_SWAP_LSBS(num) do {\
+    for(i = 0; i < n; i++) {\
+        int k;\
+        j = i;\
+        j = (j & ~3) | ((j >> 1) & 1) | ((j << 1) & 2);\
+        k = -split_radix_permutation(i, n, s->inverse) & (n - 1);\
+        s->revtab##num[k] = j;\
+    } \
+} while(0);
+
+#define PROCESS_FFT_PERM_DEFAULT(num) do {\
+    for(i = 0; i < n; i++) {\
+        int k;\
+        j = i;\
+        k = -split_radix_permutation(i, n, s->inverse) & (n - 1);\
+        s->revtab##num[k] = j;\
+    } \
+} while(0);
+
+#define SPLIT_RADIX_PERMUTATION(num) do { \
+    if (s->fft_permutation == FF_FFT_PERM_SWAP_LSBS) {\
+        PROCESS_FFT_PERM_SWAP_LSBS(num) \
+    } else {\
+        PROCESS_FFT_PERM_DEFAULT(num) \
+    }\
+} while(0);
+
+    if (s->revtab)
+        SPLIT_RADIX_PERMUTATION()
+    if (s->revtab32)
+        SPLIT_RADIX_PERMUTATION(32)
+
+#undef PROCESS_FFT_PERM_DEFAULT
+#undef PROCESS_FFT_PERM_SWAP_LSBS
+#undef SPLIT_RADIX_PERMUTATION
     }
 
     return 0;
diff --git a/libavcodec/ffv1.c b/libavcodec/ffv1.c
index a14dd2a..93cec14 100644
--- a/libavcodec/ffv1.c
+++ b/libavcodec/ffv1.c
@@ -31,7 +31,6 @@
 #include "libavutil/opt.h"
 #include "libavutil/imgutils.h"
 #include "libavutil/pixdesc.h"
-#include "libavutil/timer.h"
 
 #include "avcodec.h"
 #include "internal.h"
diff --git a/libavcodec/ffv1.h b/libavcodec/ffv1.h
index 653138b..147fe7a 100644
--- a/libavcodec/ffv1.h
+++ b/libavcodec/ffv1.h
@@ -33,7 +33,6 @@
 #include "libavutil/opt.h"
 #include "libavutil/imgutils.h"
 #include "libavutil/pixdesc.h"
-#include "libavutil/timer.h"
 #include "avcodec.h"
 #include "get_bits.h"
 #include "internal.h"
@@ -153,9 +152,7 @@
     if (bits == 8)
         diff = (int8_t)diff;
     else {
-        diff +=  1 << (bits  - 1);
-        diff  = av_mod_uintp2(diff, bits);
-        diff -=  1 << (bits  - 1);
+        diff = sign_extend(diff, bits);
     }
 
     return diff;
@@ -176,19 +173,13 @@
     count++;
 
     if (drift <= -count) {
-        if (state->bias > -128)
-            state->bias--;
+        state->bias = FFMAX(state->bias - 1, -128);
 
-        drift += count;
-        if (drift <= -count)
-            drift = -count + 1;
+        drift = FFMAX(drift + count, -count + 1);
     } else if (drift > 0) {
-        if (state->bias < 127)
-            state->bias++;
+        state->bias = FFMIN(state->bias + 1, 127);
 
-        drift -= count;
-        if (drift > 0)
-            drift = 0;
+        drift = FFMIN(drift - count, 0);
     }
 
     state->drift = drift;
diff --git a/libavcodec/ffv1_template.c b/libavcodec/ffv1_template.c
index f2ab933..c5f61b0 100644
--- a/libavcodec/ffv1_template.c
+++ b/libavcodec/ffv1_template.c
@@ -37,7 +37,7 @@
     const int RT = last[1];
     const int L  = src[-1];
 
-    if (p->quant_table[3][127]) {
+    if (p->quant_table[3][127] || p->quant_table[4][127]) {
         const int TT = last2[0];
         const int LL = src[-2];
         return p->quant_table[0][(L - LT) & 0xFF] +
diff --git a/libavcodec/ffv1dec.c b/libavcodec/ffv1dec.c
index 261e0cf..c704373 100644
--- a/libavcodec/ffv1dec.c
+++ b/libavcodec/ffv1dec.c
@@ -30,7 +30,6 @@
 #include "libavutil/opt.h"
 #include "libavutil/imgutils.h"
 #include "libavutil/pixdesc.h"
-#include "libavutil/timer.h"
 #include "avcodec.h"
 #include "internal.h"
 #include "get_bits.h"
@@ -138,7 +137,6 @@
         sample[1][-1] = sample[0][0];
         sample[0][w]  = sample[0][w - 1];
 
-// { START_TIMER
         if (s->avctx->bits_per_raw_sample <= 8) {
             int ret = decode_line(s, w, sample, plane_index, 8);
             if (ret < 0)
@@ -159,7 +157,6 @@
                 }
             }
         }
-// STOP_TIMER("decode-line") }
     }
     return 0;
 }
@@ -829,8 +826,6 @@
     if ((ret = ff_ffv1_init_slice_contexts(f)) < 0)
         return ret;
 
-    avctx->internal->allocate_progress = 1;
-
     return 0;
 }
 
@@ -906,7 +901,7 @@
             unsigned crc = av_crc(av_crc_get_table(AV_CRC_32_IEEE), 0, buf_p, v);
             if (crc) {
                 int64_t ts = avpkt->pts != AV_NOPTS_VALUE ? avpkt->pts : avpkt->dts;
-                av_log(f->avctx, AV_LOG_ERROR, "CRC mismatch %X!", crc);
+                av_log(f->avctx, AV_LOG_ERROR, "slice CRC mismatch %X!", crc);
                 if (ts != AV_NOPTS_VALUE && avctx->pkt_timebase.num) {
                     av_log(f->avctx, AV_LOG_ERROR, "at %f seconds\n", ts*av_q2d(avctx->pkt_timebase));
                 } else if (ts != AV_NOPTS_VALUE) {
@@ -982,34 +977,6 @@
     return buf_size;
 }
 
-#if HAVE_THREADS
-static int init_thread_copy(AVCodecContext *avctx)
-{
-    FFV1Context *f = avctx->priv_data;
-    int i, ret;
-
-    f->picture.f      = NULL;
-    f->last_picture.f = NULL;
-    f->sample_buffer  = NULL;
-    f->max_slice_count = 0;
-    f->slice_count = 0;
-
-    for (i = 0; i < f->quant_table_count; i++) {
-        av_assert0(f->version > 1);
-        f->initial_states[i] = av_memdup(f->initial_states[i],
-                                         f->context_count[i] * sizeof(*f->initial_states[i]));
-    }
-
-    f->picture.f      = av_frame_alloc();
-    f->last_picture.f = av_frame_alloc();
-
-    if ((ret = ff_ffv1_init_slice_contexts(f)) < 0)
-        return ret;
-
-    return 0;
-}
-#endif
-
 static void copy_fields(FFV1Context *fsdst, FFV1Context *fssrc, FFV1Context *fsrc)
 {
     fsdst->version             = fsrc->version;
@@ -1093,9 +1060,8 @@
     .init           = decode_init,
     .close          = ff_ffv1_close,
     .decode         = decode_frame,
-    .init_thread_copy = ONLY_IF_THREADS_ENABLED(init_thread_copy),
     .update_thread_context = ONLY_IF_THREADS_ENABLED(update_thread_context),
     .capabilities   = AV_CODEC_CAP_DR1 /*| AV_CODEC_CAP_DRAW_HORIZ_BAND*/ |
                       AV_CODEC_CAP_FRAME_THREADS | AV_CODEC_CAP_SLICE_THREADS,
-    .caps_internal  = FF_CODEC_CAP_INIT_CLEANUP
+    .caps_internal  = FF_CODEC_CAP_INIT_CLEANUP | FF_CODEC_CAP_ALLOCATE_PROGRESS,
 };
diff --git a/libavcodec/ffv1dec_template.c b/libavcodec/ffv1dec_template.c
index 25032fe..0b1d176 100644
--- a/libavcodec/ffv1dec_template.c
+++ b/libavcodec/ffv1dec_template.c
@@ -86,6 +86,19 @@
                         run_mode = 2;
                     }
                 }
+                if (sample[1][x - 1] == sample[0][x - 1]) {
+                    while (run_count > 1 && w-x > 1) {
+                        sample[1][x] = sample[0][x];
+                        x++;
+                        run_count--;
+                    }
+                } else {
+                while (run_count > 1 && w-x > 1) {
+                    sample[1][x] = RENAME(predict)(sample[1] + x, sample[0] + x);
+                    x++;
+                    run_count--;
+                }
+                }
                 run_count--;
                 if (run_count < 0) {
                     run_mode  = 0;
diff --git a/libavcodec/ffv1enc.c b/libavcodec/ffv1enc.c
index f5eb0fe..97dc15e 100644
--- a/libavcodec/ffv1enc.c
+++ b/libavcodec/ffv1enc.c
@@ -31,7 +31,6 @@
 #include "libavutil/opt.h"
 #include "libavutil/imgutils.h"
 #include "libavutil/pixdesc.h"
-#include "libavutil/timer.h"
 
 #include "avcodec.h"
 #include "internal.h"
@@ -287,7 +286,6 @@
 
         sample[0][-1]= sample[1][0  ];
         sample[1][ w]= sample[1][w-1];
-// { START_TIMER
         if (s->bits_per_raw_sample <= 8) {
             for (x = 0; x < w; x++)
                 sample[0][x] = src[x * pixel_stride + stride * y];
@@ -306,7 +304,6 @@
             if((ret = encode_line(s, w, sample, plane_index, s->bits_per_raw_sample)) < 0)
                 return ret;
         }
-// STOP_TIMER("encode line") }
     }
     return 0;
 }
@@ -334,6 +331,18 @@
         write_quant_table(c, quant_table[i]);
 }
 
+static int contains_non_128(uint8_t (*initial_state)[CONTEXT_SIZE],
+                            int nb_contexts)
+{
+    if (!initial_state)
+        return 0;
+    for (int i = 0; i < nb_contexts; i++)
+        for (int j = 0; j < CONTEXT_SIZE; j++)
+            if (initial_state[i][j] != 128)
+                return 1;
+    return 0;
+}
+
 static void write_header(FFV1Context *f)
 {
     uint8_t state[CONTEXT_SIZE];
@@ -428,10 +437,7 @@
         write_quant_tables(c, f->quant_tables[i]);
 
     for (i = 0; i < f->quant_table_count; i++) {
-        for (j = 0; j < f->context_count[i] * CONTEXT_SIZE; j++)
-            if (f->initial_states[i] && f->initial_states[i][0][j] != 128)
-                break;
-        if (j < f->context_count[i] * CONTEXT_SIZE) {
+        if (contains_non_128(f->initial_states[i], f->context_count[i])) {
             put_rac(c, state, 1);
             for (j = 0; j < f->context_count[i]; j++)
                 for (k = 0; k < CONTEXT_SIZE; k++) {
@@ -449,7 +455,7 @@
         put_symbol(c, state, f->intra = (f->avctx->gop_size < 2), 0);
     }
 
-    f->avctx->extradata_size = ff_rac_terminate(c);
+    f->avctx->extradata_size = ff_rac_terminate(c, 0);
     v = av_crc(av_crc_get_table(AV_CRC_32_IEEE), 0, f->avctx->extradata, f->avctx->extradata_size);
     AV_WL32(f->avctx->extradata + f->avctx->extradata_size, v);
     f->avctx->extradata_size += 4;
@@ -1065,9 +1071,7 @@
         encode_slice_header(f, fs);
     }
     if (fs->ac == AC_GOLOMB_RICE) {
-        if (f->version > 2)
-            put_rac(&fs->c, (uint8_t[]) { 129 }, 0);
-        fs->ac_byte_count = f->version > 2 || (!x && !y) ? ff_rac_terminate(&fs->c) : 0;
+        fs->ac_byte_count = f->version > 2 || (!x && !y) ? ff_rac_terminate(&fs->c, f->version > 2) : 0;
         init_put_bits(&fs->pb,
                       fs->c.bytestream_start + fs->ac_byte_count,
                       fs->c.bytestream_end - fs->c.bytestream_start - fs->ac_byte_count);
@@ -1232,9 +1236,7 @@
         int bytes;
 
         if (fs->ac != AC_GOLOMB_RICE) {
-            uint8_t state = 129;
-            put_rac(&fs->c, &state, 0);
-            bytes = ff_rac_terminate(&fs->c);
+            bytes = ff_rac_terminate(&fs->c, 1);
         } else {
             flush_put_bits(&fs->pb); // FIXME: nicer padding
             bytes = fs->ac_byte_count + (put_bits_count(&fs->pb) + 7) / 8;
diff --git a/libavcodec/ffwavesynth.c b/libavcodec/ffwavesynth.c
index 9d055e4..a446aa2 100644
--- a/libavcodec/ffwavesynth.c
+++ b/libavcodec/ffwavesynth.c
@@ -113,18 +113,12 @@
     return *s;
 }
 
-static void lcg_seek(uint32_t *s, int64_t dt)
+static void lcg_seek(uint32_t *s, uint32_t dt)
 {
     uint32_t a, c, t = *s;
 
-    if (dt >= 0) {
-        a = LCG_A;
-        c = LCG_C;
-    } else { /* coefficients for a step backward */
-        a = LCG_AI;
-        c = (uint32_t)(LCG_AI * LCG_C);
-        dt = -dt;
-    }
+    a = LCG_A;
+    c = LCG_C;
     while (dt) {
         if (dt & 1)
             t = a * t + c;
@@ -221,12 +215,12 @@
     ws->next_inter = i;
     ws->next_ts = i < ws->nb_inter ? ws->inter[i].ts_start : INF_TS;
     *last = -1;
-    lcg_seek(&ws->dither_state, ts - ws->cur_ts);
+    lcg_seek(&ws->dither_state, (uint32_t)ts - (uint32_t)ws->cur_ts);
     if (ws->pink_need) {
-        int64_t pink_ts_cur  = (ws->cur_ts + PINK_UNIT - 1) & ~(PINK_UNIT - 1);
-        int64_t pink_ts_next = ts & ~(PINK_UNIT - 1);
+        uint64_t pink_ts_cur  = (ws->cur_ts + (uint64_t)PINK_UNIT - 1) & ~(PINK_UNIT - 1);
+        uint64_t pink_ts_next = ts & ~(PINK_UNIT - 1);
         int pos = ts & (PINK_UNIT - 1);
-        lcg_seek(&ws->pink_state, (pink_ts_next - pink_ts_cur) << 1);
+        lcg_seek(&ws->pink_state, (uint32_t)(pink_ts_next - pink_ts_cur) * 2);
         if (pos) {
             pink_fill(ws);
             ws->pink_pos = pos;
@@ -253,7 +247,7 @@
     edata_end = edata + avc->extradata_size;
     ws->nb_inter = AV_RL32(edata);
     edata += 4;
-    if (ws->nb_inter < 0)
+    if (ws->nb_inter < 0 || (edata_end - edata) / 24 < ws->nb_inter)
         return AVERROR(EINVAL);
     ws->inter = av_calloc(ws->nb_inter, sizeof(*ws->inter));
     if (!ws->inter)
@@ -267,13 +261,16 @@
         in->type     = AV_RL32(edata + 16);
         in->channels = AV_RL32(edata + 20);
         edata += 24;
-        if (in->ts_start < cur_ts || in->ts_end <= in->ts_start)
+        if (in->ts_start < cur_ts ||
+            in->ts_end <= in->ts_start ||
+            (uint64_t)in->ts_end - in->ts_start > INT64_MAX
+        )
             return AVERROR(EINVAL);
         cur_ts = in->ts_start;
         dt = in->ts_end - in->ts_start;
         switch (in->type) {
             case WS_SINE:
-                if (edata_end - edata < 20)
+                if (edata_end - edata < 20 || avc->sample_rate <= 0)
                     return AVERROR(EINVAL);
                 f1  = AV_RL32(edata +  0);
                 f2  = AV_RL32(edata +  4);
@@ -284,7 +281,7 @@
                 dphi1 = frac64(f1, (int64_t)avc->sample_rate << 16);
                 dphi2 = frac64(f2, (int64_t)avc->sample_rate << 16);
                 in->dphi0 = dphi1;
-                in->ddphi = (dphi2 - dphi1) / dt;
+                in->ddphi = (int64_t)(dphi2 - (uint64_t)dphi1) / dt;
                 if (phi & 0x80000000) {
                     phi &= ~0x80000000;
                     if (phi >= i)
@@ -304,8 +301,8 @@
             default:
                 return AVERROR(EINVAL);
         }
-        in->amp0 = (int64_t)a1 << 32;
-        in->damp = (((int64_t)a2 << 32) - ((int64_t)a1 << 32)) / dt;
+        in->amp0 = (uint64_t)a1 << 32;
+        in->damp = (int64_t)(((uint64_t)a2 << 32) - ((uint64_t)a1 << 32)) / dt;
     }
     if (edata != edata_end)
         return AVERROR(EINVAL);
@@ -353,7 +350,8 @@
 static void wavesynth_synth_sample(struct wavesynth_context *ws, int64_t ts,
                                    int32_t *channels)
 {
-    int32_t amp, val, *cv;
+    int32_t amp, *cv;
+    unsigned val;
     struct ws_interval *in;
     int i, *last, pink;
     uint32_t c, all_ch = 0;
@@ -380,7 +378,7 @@
                 in->dphi += in->ddphi;
                 break;
             case WS_NOISE:
-                val = amp * pink;
+                val = amp * (unsigned)pink;
                 break;
             default:
                 val = 0;
@@ -388,7 +386,7 @@
         all_ch |= in->channels;
         for (c = in->channels, cv = channels; c; c >>= 1, cv++)
             if (c & 1)
-                *cv += val;
+                *cv += (unsigned)val;
     }
     val = (int32_t)lcg_next(&ws->dither_state) >> 16;
     for (c = all_ch, cv = channels; c; c >>= 1, cv++)
diff --git a/libavcodec/fic.c b/libavcodec/fic.c
index dcf0777..95baaed 100644
--- a/libavcodec/fic.c
+++ b/libavcodec/fic.c
@@ -139,6 +139,9 @@
 {
     int i, num_coeff;
 
+    if (get_bits_left(gb) < 8)
+        return AVERROR_INVALIDDATA;
+
     /* Is it a skip block? */
     if (get_bits1(gb)) {
         *is_p = 1;
@@ -173,9 +176,11 @@
     int slice_h  = tctx->slice_h;
     int src_size = tctx->src_size;
     int y_off    = tctx->y_off;
-    int x, y, p;
+    int x, y, p, ret;
 
-    init_get_bits(&gb, src, src_size * 8);
+    ret = init_get_bits8(&gb, src, src_size);
+    if (ret < 0)
+        return ret;
 
     for (p = 0; p < 3; p++) {
         int stride   = ctx->frame->linesize[p];
@@ -273,7 +278,7 @@
     int skip_cursor = ctx->skip_cursor;
     uint8_t *sdata;
 
-    if ((ret = ff_reget_buffer(avctx, ctx->frame)) < 0)
+    if ((ret = ff_reget_buffer(avctx, ctx->frame, 0)) < 0)
         return ret;
 
     /* Header + at least one slice (4) */
@@ -351,7 +356,7 @@
     sdata = src + tsize + FIC_HEADER_SIZE + 4 * nslices;
     msize = avpkt->size - nslices * 4 - tsize - FIC_HEADER_SIZE;
 
-    if (msize <= 0) {
+    if (msize <= ctx->aligned_width/8 * (ctx->aligned_height/8) / 8) {
         av_log(avctx, AV_LOG_ERROR, "Not enough frame data to decode.\n");
         return AVERROR_INVALIDDATA;
     }
@@ -380,6 +385,8 @@
             slice_h      = FFALIGN(avctx->height - ctx->slice_h * (nslices - 1), 16);
         } else {
             slice_size = AV_RB32(src + tsize + FIC_HEADER_SIZE + slice * 4 + 4);
+            if (slice_size < slice_off)
+                return AVERROR_INVALIDDATA;
         }
 
         if (slice_size < slice_off || slice_size > msize)
@@ -414,7 +421,7 @@
     }
 
     /* Make sure we use a user-supplied buffer. */
-    if ((ret = ff_reget_buffer(avctx, ctx->final_frame)) < 0) {
+    if ((ret = ff_reget_buffer(avctx, ctx->final_frame, 0)) < 0) {
         av_log(avctx, AV_LOG_ERROR, "Could not make frame writable.\n");
         return ret;
     }
diff --git a/libavcodec/filter_units_bsf.c b/libavcodec/filter_units_bsf.c
index 1ee0afd..380f23e 100644
--- a/libavcodec/filter_units_bsf.c
+++ b/libavcodec/filter_units_bsf.c
@@ -98,63 +98,51 @@
     return AVERROR(EINVAL);
 }
 
-static int filter_units_filter(AVBSFContext *bsf, AVPacket *out)
+static int filter_units_filter(AVBSFContext *bsf, AVPacket *pkt)
 {
     FilterUnitsContext      *ctx = bsf->priv_data;
     CodedBitstreamFragment *frag = &ctx->fragment;
-    AVPacket *in = NULL;
     int err, i, j;
 
-    while (1) {
-        err = ff_bsf_get_packet(bsf, &in);
-        if (err < 0)
-            return err;
+    err = ff_bsf_get_packet_ref(bsf, pkt);
+    if (err < 0)
+        return err;
 
-        if (ctx->mode == NOOP) {
-            av_packet_move_ref(out, in);
-            av_packet_free(&in);
-            return 0;
-        }
+    if (ctx->mode == NOOP)
+        return 0;
 
-        err = ff_cbs_read_packet(ctx->cbc, frag, in);
-        if (err < 0) {
-            av_log(bsf, AV_LOG_ERROR, "Failed to read packet.\n");
-            goto fail;
-        }
-
-        for (i = 0; i < frag->nb_units; i++) {
-            for (j = 0; j < ctx->nb_types; j++) {
-                if (frag->units[i].type == ctx->type_list[j])
-                    break;
-            }
-            if (ctx->mode == REMOVE ? j <  ctx->nb_types
-                                    : j >= ctx->nb_types) {
-                ff_cbs_delete_unit(ctx->cbc, frag, i);
-                --i;
-            }
-        }
-
-        if (frag->nb_units > 0)
-            break;
-
-        // Don't return packets with nothing in them.
-        av_packet_free(&in);
-        ff_cbs_fragment_uninit(ctx->cbc, frag);
+    err = ff_cbs_read_packet(ctx->cbc, frag, pkt);
+    if (err < 0) {
+        av_log(bsf, AV_LOG_ERROR, "Failed to read packet.\n");
+        goto fail;
     }
 
-    err = ff_cbs_write_packet(ctx->cbc, out, frag);
+    for (i = frag->nb_units - 1; i >= 0; i--) {
+        for (j = 0; j < ctx->nb_types; j++) {
+            if (frag->units[i].type == ctx->type_list[j])
+                break;
+        }
+        if (ctx->mode == REMOVE ? j <  ctx->nb_types
+                                : j >= ctx->nb_types)
+            ff_cbs_delete_unit(ctx->cbc, frag, i);
+    }
+
+    if (frag->nb_units == 0) {
+        // Don't return packets with nothing in them.
+        err = AVERROR(EAGAIN);
+        goto fail;
+    }
+
+    err = ff_cbs_write_packet(ctx->cbc, pkt, frag);
     if (err < 0) {
         av_log(bsf, AV_LOG_ERROR, "Failed to write packet.\n");
         goto fail;
     }
 
-    err = av_packet_copy_props(out, in);
-    if (err < 0)
-        goto fail;
-
 fail:
-    ff_cbs_fragment_uninit(ctx->cbc, frag);
-    av_packet_free(&in);
+    if (err < 0)
+        av_packet_unref(pkt);
+    ff_cbs_fragment_reset(ctx->cbc, frag);
 
     return err;
 }
@@ -199,18 +187,18 @@
     ctx->cbc->nb_decompose_unit_types = 0;
 
     if (bsf->par_in->extradata) {
-        CodedBitstreamFragment ps;
+        CodedBitstreamFragment *frag = &ctx->fragment;
 
-        err = ff_cbs_read_extradata(ctx->cbc, &ps, bsf->par_in);
+        err = ff_cbs_read_extradata(ctx->cbc, frag, bsf->par_in);
         if (err < 0) {
             av_log(bsf, AV_LOG_ERROR, "Failed to read extradata.\n");
         } else {
-            err = ff_cbs_write_extradata(ctx->cbc, bsf->par_out, &ps);
+            err = ff_cbs_write_extradata(ctx->cbc, bsf->par_out, frag);
             if (err < 0)
                 av_log(bsf, AV_LOG_ERROR, "Failed to write extradata.\n");
         }
 
-        ff_cbs_fragment_uninit(ctx->cbc, &ps);
+        ff_cbs_fragment_reset(ctx->cbc, frag);
     }
 
     return err;
@@ -222,6 +210,7 @@
 
     av_freep(&ctx->type_list);
 
+    ff_cbs_fragment_free(ctx->cbc, &ctx->fragment);
     ff_cbs_close(&ctx->cbc);
 }
 
diff --git a/libavcodec/fits.c b/libavcodec/fits.c
index 365347f..ad73ab7 100644
--- a/libavcodec/fits.c
+++ b/libavcodec/fits.c
@@ -138,6 +138,17 @@
     case STATE_BITPIX:
         CHECK_KEYWORD("BITPIX");
         CHECK_VALUE("BITPIX", bitpix);
+
+        switch(header->bitpix) {
+        case   8:
+        case  16:
+        case  32: case -32:
+        case  64: case -64: break;
+        default:
+            av_log(avcl, AV_LOG_ERROR, "invalid value of BITPIX %d\n", header->bitpix); \
+            return AVERROR_INVALIDDATA;
+        }
+
         dict_set_if_not_null(metadata, keyword, value);
 
         header->state = STATE_NAXIS;
diff --git a/libavcodec/fitsdec.c b/libavcodec/fitsdec.c
index b075381..32a79cd 100644
--- a/libavcodec/fitsdec.c
+++ b/libavcodec/fitsdec.c
@@ -143,7 +143,7 @@
 
     size = abs(header->bitpix) >> 3;
     for (i = 0; i < header->naxis; i++) {
-        if (header->naxisn[i] > SIZE_MAX / size) {
+        if (size == 0 || header->naxisn[i] > SIZE_MAX / size) {
             av_log(avctx, AV_LOG_ERROR, "unsupported size of FITS image");
             return AVERROR_INVALIDDATA;
         }
@@ -168,6 +168,14 @@
         header->data_min = (header->data_min - header->bzero) / header->bscale;
         header->data_max = (header->data_max - header->bzero) / header->bscale;
     }
+    if (!header->rgb && header->data_min >= header->data_max) {
+        if (header->data_min > header->data_max) {
+            av_log(avctx, AV_LOG_ERROR, "data min/max (%g %g) is invalid\n", header->data_min, header->data_max);
+            return AVERROR_INVALIDDATA;
+        }
+        av_log(avctx, AV_LOG_WARNING, "data min/max indicates a blank image\n");
+        header->data_max ++;
+    }
 
     return 0;
 }
@@ -256,6 +264,13 @@
             CASE_RGB(16, dst16, uint16_t, AV_RB16);
         }
     } else {
+        double scale = header.data_max - header.data_min;
+
+        if (scale <= 0 || !isfinite(scale)) {
+            scale = 1;
+        }
+        scale = 1/scale;
+
         switch (header.bitpix) {
 #define CASE_GRAY(cas, dst, type, t, rd) \
     case cas: \
@@ -264,7 +279,7 @@
             for (j = 0; j < avctx->width; j++) { \
                 t = rd; \
                 if (!header.blank_found || t != header.blank) { \
-                    *dst++ = ((t - header.data_min) * ((1 << (sizeof(type) * 8)) - 1)) / (header.data_max - header.data_min); \
+                    *dst++ = lrint(((t - header.data_min) * ((1 << (sizeof(type) * 8)) - 1)) * scale); \
                 } else { \
                     *dst++ = fitsctx->blank_val; \
                 } \
diff --git a/libavcodec/flac.c b/libavcodec/flac.c
index 5ffbf93..7b075d4 100644
--- a/libavcodec/flac.c
+++ b/libavcodec/flac.c
@@ -217,9 +217,9 @@
     }
 
     skip_bits(&gb, 24); /* skip min frame size */
-    s->max_framesize = get_bits_long(&gb, 24);
+    s->max_framesize = get_bits(&gb, 24);
 
-    s->samplerate = get_bits_long(&gb, 20);
+    s->samplerate = get_bits(&gb, 20);
     s->channels = get_bits(&gb, 3) + 1;
     s->bps = get_bits(&gb, 5) + 1;
 
diff --git a/libavcodec/flac_parser.c b/libavcodec/flac_parser.c
index 2721286..3424583 100644
--- a/libavcodec/flac_parser.c
+++ b/libavcodec/flac_parser.c
@@ -58,8 +58,9 @@
 
 typedef struct FLACHeaderMarker {
     int offset;       /**< byte offset from start of FLACParseContext->buffer */
-    int *link_penalty;  /**< pointer to array of local scores between this header
-                           and the one at a distance equal array position     */
+    int link_penalty[FLAC_MAX_SEQUENTIAL_HEADERS]; /**< array of local scores
+                           between this header and the one at a distance equal
+                           array position                                     */
     int max_score;    /**< maximum score found after checking each child that
                            has a valid CRC                                    */
     FLACFrameInfo fi; /**< decoded frame header info                          */
@@ -112,8 +113,8 @@
  * This function is based on av_fifo_generic_read, which is why there is a comment
  * about a memory barrier for SMP.
  */
-static uint8_t* flac_fifo_read_wrap(FLACParseContext *fpc, int offset, int len,
-                               uint8_t** wrap_buf, int* allocated_size)
+static uint8_t *flac_fifo_read_wrap(FLACParseContext *fpc, int offset, int len,
+                                    uint8_t **wrap_buf, int *allocated_size)
 {
     AVFifoBuffer *f   = fpc->fifo_buf;
     uint8_t *start    = f->rptr + offset;
@@ -152,7 +153,7 @@
  * A second call to flac_fifo_read (with new offset and len) should be called
  * to get the post-wrap buf if the returned len is less than the requested.
  **/
-static uint8_t* flac_fifo_read(FLACParseContext *fpc, int offset, int *len)
+static uint8_t *flac_fifo_read(FLACParseContext *fpc, int offset, int *len)
 {
     AVFifoBuffer *f   = fpc->fifo_buf;
     uint8_t *start    = f->rptr + offset;
@@ -188,16 +189,8 @@
                    "couldn't allocate FLACHeaderMarker\n");
             return AVERROR(ENOMEM);
         }
-        (*end_handle)->fi           = fi;
-        (*end_handle)->offset       = offset;
-        (*end_handle)->link_penalty = av_malloc(sizeof(int) *
-                                            FLAC_MAX_SEQUENTIAL_HEADERS);
-        if (!(*end_handle)->link_penalty) {
-            av_freep(end_handle);
-            av_log(fpc->avctx, AV_LOG_ERROR,
-                   "couldn't allocate link_penalty\n");
-            return AVERROR(ENOMEM);
-        }
+        (*end_handle)->fi     = fi;
+        (*end_handle)->offset = offset;
 
         for (i = 0; i < FLAC_MAX_SEQUENTIAL_HEADERS; i++)
             (*end_handle)->link_penalty[i] = FLAC_HEADER_NOT_PENALIZED_YET;
@@ -208,24 +201,27 @@
     return size;
 }
 
-static int find_headers_search(FLACParseContext *fpc, uint8_t *buf, int buf_size,
-                               int search_start)
-
+static int find_headers_search(FLACParseContext *fpc, uint8_t *buf,
+                               int buf_size, int search_start)
 {
     int size = 0, mod_offset = (buf_size - 1) % 4, i, j;
     uint32_t x;
 
     for (i = 0; i < mod_offset; i++) {
-        if ((AV_RB16(buf + i) & 0xFFFE) == 0xFFF8)
-            size = find_headers_search_validate(fpc, search_start + i);
+        if ((AV_RB16(buf + i) & 0xFFFE) == 0xFFF8) {
+            int ret = find_headers_search_validate(fpc, search_start + i);
+            size = FFMAX(size, ret);
+        }
     }
 
     for (; i < buf_size - 1; i += 4) {
-        x = AV_RB32(buf + i);
+        x = AV_RN32(buf + i);
         if (((x & ~(x + 0x01010101)) & 0x80808080)) {
             for (j = 0; j < 4; j++) {
-                if ((AV_RB16(buf + i + j) & 0xFFFE) == 0xFFF8)
-                    size = find_headers_search_validate(fpc, search_start + i + j);
+                if ((AV_RB16(buf + i + j) & 0xFFFE) == 0xFFF8) {
+                    int ret = find_headers_search_validate(fpc, search_start + i + j);
+                    size = FFMAX(size, ret);
+                }
             }
         }
     }
@@ -251,9 +247,9 @@
         uint8_t wrap[2];
 
         wrap[0]  = buf[read_len - 1];
-        read_len = search_end - search_start + 1;
-
         /* search_start + 1 is the post-wrap offset in the fifo. */
+        read_len = search_end - (search_start + 1) + 1;
+
         buf      = flac_fifo_read(fpc, search_start + 1, &read_len);
         wrap[1]  = buf[0];
 
@@ -321,7 +317,7 @@
         (child_fi->frame_or_sample_num
          != header_fi->frame_or_sample_num + 1)) {
         FLACHeaderMarker *curr;
-        int expected_frame_num, expected_sample_num;
+        int64_t expected_frame_num, expected_sample_num;
         /* If there are frames in the middle we expect this deduction,
            as they are probably valid and this one follows it */
 
@@ -471,7 +467,7 @@
     }
 }
 
-static int get_best_header(FLACParseContext* fpc, const uint8_t **poutbuf,
+static int get_best_header(FLACParseContext *fpc, const uint8_t **poutbuf,
                            int *poutbuf_size)
 {
     FLACHeaderMarker *header = fpc->best_header;
@@ -497,7 +493,7 @@
                                         &fpc->wrap_buf_allocated_size);
 
 
-    if (fpc->pc->flags & PARSER_FLAG_USE_CODEC_TS){
+    if (fpc->pc->flags & PARSER_FLAG_USE_CODEC_TS) {
         if (header->fi.is_var_size)
           fpc->pc->pts = header->fi.frame_or_sample_num;
         else if (header->best_child)
@@ -531,7 +527,7 @@
             s->duration = fi.blocksize;
             if (!avctx->sample_rate)
                 avctx->sample_rate = fi.samplerate;
-            if (fpc->pc->flags & PARSER_FLAG_USE_CODEC_TS){
+            if (fpc->pc->flags & PARSER_FLAG_USE_CODEC_TS) {
                 fpc->pc->pts = fi.frame_or_sample_num;
                 if (!fi.is_var_size)
                   fpc->pc->pts *= fi.blocksize;
@@ -559,7 +555,6 @@
                        curr->max_score, curr->offset, curr->next->offset);
             }
             temp = curr->next;
-            av_freep(&curr->link_penalty);
             av_free(curr);
             fpc->nb_headers_buffered--;
         }
@@ -570,7 +565,6 @@
         for (curr = best_child->next; curr; curr = curr->next)
             curr->offset -= best_child->offset;
 
-        fpc->nb_headers_buffered--;
         best_child->offset = 0;
         fpc->headers       = best_child;
         if (fpc->nb_headers_buffered >= FLAC_MIN_HEADERS) {
@@ -584,30 +578,26 @@
 
         for (curr = fpc->headers; curr != fpc->best_header; curr = temp) {
             temp = curr->next;
-            av_freep(&curr->link_penalty);
             av_free(curr);
             fpc->nb_headers_buffered--;
         }
         fpc->headers = fpc->best_header->next;
-        av_freep(&fpc->best_header->link_penalty);
         av_freep(&fpc->best_header);
         fpc->nb_headers_buffered--;
     }
 
     /* Find and score new headers.                                     */
-    /* buf_size is to zero when padding, so check for this since we do */
+    /* buf_size is zero when flushing, so check for this since we do   */
     /* not want to try to read more input once we have found the end.  */
-    /* Note that as (non-modified) parameters, buf can be non-NULL,    */
-    /* while buf_size is 0.                                            */
-    while ((buf && buf_size && read_end < buf + buf_size &&
+    /* Also note that buf can't be NULL.                               */
+    while ((buf_size && read_end < buf + buf_size &&
             fpc->nb_headers_buffered < FLAC_MIN_HEADERS)
-           || ((!buf || !buf_size) && !fpc->end_padded)) {
+           || (!buf_size && !fpc->end_padded)) {
         int start_offset;
 
         /* Pad the end once if EOF, to check the final region for headers. */
-        if (!buf || !buf_size) {
-            fpc->end_padded      = 1;
-            buf_size = MAX_FRAME_HEADER_SIZE;
+        if (!buf_size) {
+            fpc->end_padded = 1;
             read_end = read_start + MAX_FRAME_HEADER_SIZE;
         } else {
             /* The maximum read size is the upper-bound of what the parser
@@ -635,7 +625,7 @@
             goto handle_error;
         }
 
-        if (buf && buf_size) {
+        if (buf_size) {
             av_fifo_generic_write(fpc->fifo_buf, (void*) read_start,
                                   read_end - read_start, NULL);
         } else {
@@ -658,7 +648,7 @@
         fpc->nb_headers_buffered = nb_headers;
         /* Wait till FLAC_MIN_HEADERS to output a valid frame. */
         if (!fpc->end_padded && fpc->nb_headers_buffered < FLAC_MIN_HEADERS) {
-            if (buf && read_end < buf + buf_size) {
+            if (read_end < buf + buf_size) {
                 read_start = read_end;
                 continue;
             } else {
@@ -680,7 +670,6 @@
                 fpc->fifo_buf->wptr += fpc->fifo_buf->end -
                     fpc->fifo_buf->buffer;
             }
-            buf_size = 0;
             read_start = read_end = NULL;
         }
     }
@@ -693,7 +682,7 @@
 
     if (fpc->best_header && fpc->best_header->max_score <= 0) {
         // Only accept a bad header if there is no other option to continue
-        if (!buf_size || !buf || read_end != buf || fpc->nb_headers_buffered < FLAC_MIN_HEADERS)
+        if (!buf_size || read_end != buf || fpc->nb_headers_buffered < FLAC_MIN_HEADERS)
             fpc->best_header = NULL;
     }
 
@@ -705,13 +694,13 @@
                    fpc->best_header->offset);
 
             /* Set duration to 0. It is unknown or invalid in a junk frame. */
-            s->duration = 0;
-            *poutbuf_size     = fpc->best_header->offset;
-            *poutbuf          = flac_fifo_read_wrap(fpc, 0, *poutbuf_size,
-                                                    &fpc->wrap_buf,
-                                                    &fpc->wrap_buf_allocated_size);
+            s->duration   = 0;
+            *poutbuf_size = fpc->best_header->offset;
+            *poutbuf      = flac_fifo_read_wrap(fpc, 0, *poutbuf_size,
+                                                &fpc->wrap_buf,
+                                                &fpc->wrap_buf_allocated_size);
             return buf_size ? (read_end - buf) : (fpc->best_header->offset -
-                                           av_fifo_size(fpc->fifo_buf));
+                                                  av_fifo_size(fpc->fifo_buf));
         }
         if (!buf_size)
             return get_best_header(fpc, poutbuf, poutbuf_size);
@@ -745,10 +734,10 @@
 
     while (curr) {
         temp = curr->next;
-        av_freep(&curr->link_penalty);
         av_free(curr);
         curr = temp;
     }
+    fpc->headers = NULL;
     av_fifo_freep(&fpc->fifo_buf);
     av_freep(&fpc->wrap_buf);
 }
diff --git a/libavcodec/flacdec.c b/libavcodec/flacdec.c
index c8eb456..fb27e8e 100644
--- a/libavcodec/flacdec.c
+++ b/libavcodec/flacdec.c
@@ -639,19 +639,6 @@
     return bytes_read;
 }
 
-#if HAVE_THREADS
-static int init_thread_copy(AVCodecContext *avctx)
-{
-    FLACContext *s = avctx->priv_data;
-    s->decoded_buffer = NULL;
-    s->decoded_buffer_size = 0;
-    s->avctx = avctx;
-    if (s->flac_stream_info.max_blocksize)
-        return allocate_buffers(s);
-    return 0;
-}
-#endif
-
 static av_cold int flac_decode_close(AVCodecContext *avctx)
 {
     FLACContext *s = avctx->priv_data;
@@ -682,7 +669,6 @@
     .init           = flac_decode_init,
     .close          = flac_decode_close,
     .decode         = flac_decode_frame,
-    .init_thread_copy = ONLY_IF_THREADS_ENABLED(init_thread_copy),
     .capabilities   = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_FRAME_THREADS,
     .sample_fmts    = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_S16,
                                                       AV_SAMPLE_FMT_S16P,
diff --git a/libavcodec/flacdsp_template.c b/libavcodec/flacdsp_template.c
index 776c78d..892418c 100644
--- a/libavcodec/flacdsp_template.c
+++ b/libavcodec/flacdsp_template.c
@@ -66,8 +66,8 @@
     int i;
 
     for (i = 0; i < len; i++) {
-        int a = in[0][i];
-        int b = in[1][i];
+        unsigned a = in[0][i];
+        unsigned b = in[1][i];
         S(samples, 0, i) =  a      << shift;
         S(samples, 1, i) = (a - b) << shift;
     }
@@ -80,8 +80,8 @@
     int i;
 
     for (i = 0; i < len; i++) {
-        int a = in[0][i];
-        int b = in[1][i];
+        unsigned a = in[0][i];
+        unsigned b = in[1][i];
         S(samples, 0, i) = (a + b) << shift;
         S(samples, 1, i) =  b      << shift;
     }
@@ -94,7 +94,7 @@
     int i;
 
     for (i = 0; i < len; i++) {
-        int a = in[0][i];
+        unsigned a = in[0][i];
         int b = in[1][i];
         a -= b >> 1;
         S(samples, 0, i) = (a + b) << shift;
diff --git a/libavcodec/flashsv.c b/libavcodec/flashsv.c
index 1dc3c71..f55cb0f 100644
--- a/libavcodec/flashsv.c
+++ b/libavcodec/flashsv.c
@@ -132,7 +132,6 @@
 
     s->frame = av_frame_alloc();
     if (!s->frame) {
-        flashsv_decode_end(avctx);
         return AVERROR(ENOMEM);
     }
 
@@ -369,7 +368,7 @@
             s->image_width, s->image_height, s->block_width, s->block_height,
             h_blocks, v_blocks, h_part, v_part);
 
-    if ((ret = ff_reget_buffer(avctx, s->frame)) < 0)
+    if ((ret = ff_reget_buffer(avctx, s->frame, 0)) < 0)
         return ret;
 
     /* loop over all block columns */
@@ -518,6 +517,7 @@
     .close          = flashsv_decode_end,
     .decode         = flashsv_decode_frame,
     .capabilities   = AV_CODEC_CAP_DR1,
+    .caps_internal  = FF_CODEC_CAP_INIT_CLEANUP,
     .pix_fmts       = (const enum AVPixelFormat[]) { AV_PIX_FMT_BGR24, AV_PIX_FMT_NONE },
 };
 #endif /* CONFIG_FLASHSV_DECODER */
@@ -585,6 +585,7 @@
     .close          = flashsv2_decode_end,
     .decode         = flashsv_decode_frame,
     .capabilities   = AV_CODEC_CAP_DR1,
+    .caps_internal  = FF_CODEC_CAP_INIT_CLEANUP,
     .pix_fmts       = (const enum AVPixelFormat[]) { AV_PIX_FMT_BGR24, AV_PIX_FMT_NONE },
 };
 #endif /* CONFIG_FLASHSV2_DECODER */
diff --git a/libavcodec/flicvideo.c b/libavcodec/flicvideo.c
index ba5bda4..276c2ff 100644
--- a/libavcodec/flicvideo.c
+++ b/libavcodec/flicvideo.c
@@ -175,7 +175,7 @@
     int lines;
     int compressed_lines;
     int starting_line;
-    signed short line_packets;
+    int line_packets;
     int y_ptr;
     int byte_run;
     int pixel_skip;
@@ -185,7 +185,7 @@
 
     bytestream2_init(&g2, buf, buf_size);
 
-    if ((ret = ff_reget_buffer(avctx, s->frame)) < 0)
+    if ((ret = ff_reget_buffer(avctx, s->frame, 0)) < 0)
         return ret;
 
     pixels = s->frame->data[0];
@@ -274,7 +274,7 @@
                     break;
                 if (y_ptr > pixel_limit)
                     return AVERROR_INVALIDDATA;
-                line_packets = bytestream2_get_le16(&g2);
+                line_packets = sign_extend(bytestream2_get_le16(&g2), 16);
                 if ((line_packets & 0xC000) == 0xC000) {
                     // line skip opcode
                     line_packets = -line_packets;
@@ -508,7 +508,7 @@
 
     int lines;
     int compressed_lines;
-    signed short line_packets;
+    int line_packets;
     int y_ptr;
     int byte_run;
     int pixel_skip;
@@ -519,7 +519,7 @@
 
     bytestream2_init(&g2, buf, buf_size);
 
-    if ((ret = ff_reget_buffer(avctx, s->frame)) < 0)
+    if ((ret = ff_reget_buffer(avctx, s->frame, 0)) < 0)
         return ret;
 
     pixels = s->frame->data[0];
@@ -572,7 +572,7 @@
                     break;
                 if (y_ptr > pixel_limit)
                     return AVERROR_INVALIDDATA;
-                line_packets = bytestream2_get_le16(&g2);
+                line_packets = sign_extend(bytestream2_get_le16(&g2), 16);
                 if (line_packets < 0) {
                     line_packets = -line_packets;
                     if (line_packets > s->avctx->height)
@@ -806,7 +806,7 @@
 
     int lines;
     int compressed_lines;
-    signed short line_packets;
+    int line_packets;
     int y_ptr;
     int byte_run;
     int pixel_skip;
@@ -817,7 +817,7 @@
 
     bytestream2_init(&g2, buf, buf_size);
 
-    if ((ret = ff_reget_buffer(avctx, s->frame)) < 0)
+    if ((ret = ff_reget_buffer(avctx, s->frame, 0)) < 0)
         return ret;
 
     pixels = s->frame->data[0];
@@ -870,7 +870,7 @@
                     break;
                 if (y_ptr > pixel_limit)
                     return AVERROR_INVALIDDATA;
-                line_packets = bytestream2_get_le16(&g2);
+                line_packets = sign_extend(bytestream2_get_le16(&g2), 16);
                 if (line_packets < 0) {
                     line_packets = -line_packets;
                     if (line_packets > s->avctx->height)
@@ -900,7 +900,7 @@
                         } else {
                             if (bytestream2_tell(&g2) + 2*byte_run > stream_ptr_after_chunk)
                                 break;
-                            CHECK_PIXEL_PTR(2 * byte_run);
+                            CHECK_PIXEL_PTR(3 * byte_run);
                             for (j = 0; j < byte_run; j++, pixel_countdown--) {
                                 pixel = bytestream2_get_le24(&g2);
                                 AV_WL24(&pixels[pixel_ptr], pixel);
@@ -1024,14 +1024,7 @@
                 for (y_ptr = 0; y_ptr < s->frame->linesize[0] * s->avctx->height;
                      y_ptr += s->frame->linesize[0]) {
 
-                    pixel_countdown = s->avctx->width;
-                    pixel_ptr = 0;
-                    while (pixel_countdown > 0) {
-                        pixel = bytestream2_get_le24(&g2);
-                        AV_WL24(&pixels[y_ptr + pixel_ptr], pixel);
-                        pixel_ptr += 3;
-                        pixel_countdown--;
-                    }
+                    bytestream2_get_buffer(&g2, pixels + y_ptr, 3*s->avctx->width);
                     if (s->avctx->width & 1)
                         bytestream2_skip(&g2, 3);
                 }
diff --git a/libavcodec/flvdec.c b/libavcodec/flvdec.c
index f9beb40..c19f07f 100644
--- a/libavcodec/flvdec.c
+++ b/libavcodec/flvdec.c
@@ -30,7 +30,7 @@
     int format, width, height;
 
     /* picture header */
-    if (get_bits_long(&s->gb, 17) != 1) {
+    if (get_bits(&s->gb, 17) != 1) {
         av_log(s->avctx, AV_LOG_ERROR, "Bad picture start code\n");
         return AVERROR_INVALIDDATA;
     }
diff --git a/libavcodec/fmvc.c b/libavcodec/fmvc.c
index 5778d7b..5bee96a 100644
--- a/libavcodec/fmvc.c
+++ b/libavcodec/fmvc.c
@@ -402,6 +402,9 @@
     AVFrame *frame = data;
     int ret, y, x;
 
+    if (avpkt->size < 8)
+        return AVERROR_INVALIDDATA;
+
     if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
         return ret;
 
diff --git a/libavcodec/frame_thread_encoder.c b/libavcodec/frame_thread_encoder.c
index 55756c4..949bc69 100644
--- a/libavcodec/frame_thread_encoder.c
+++ b/libavcodec/frame_thread_encoder.c
@@ -209,8 +209,9 @@
             int ret = av_opt_copy(thread_avctx->priv_data, avctx->priv_data);
             if (ret < 0)
                 goto fail;
-        } else
+        } else if (avctx->codec->priv_data_size) {
             memcpy(thread_avctx->priv_data, avctx->priv_data, avctx->codec->priv_data_size);
+        }
         thread_avctx->thread_count = 1;
         thread_avctx->active_thread_type &= ~FF_THREAD_FRAME;
 
diff --git a/libavcodec/g2meet.c b/libavcodec/g2meet.c
index a1dec8d..731d29a 100644
--- a/libavcodec/g2meet.c
+++ b/libavcodec/g2meet.c
@@ -244,6 +244,9 @@
     const int is_chroma = !!plane;
     const uint8_t *qmat = is_chroma ? chroma_quant : luma_quant;
 
+    if (get_bits_left(gb) < 1)
+        return AVERROR_INVALIDDATA;
+
     c->bdsp.clear_block(block);
     dc = get_vlc2(gb, c->dc_vlc[is_chroma].table, 9, 3);
     if (dc < 0)
@@ -854,6 +857,9 @@
                     uint32_t ref_pix = curr_row[x - 1];
                     if (!x || !epic_decode_from_cache(dc, ref_pix, &pix)) {
                         pix = epic_decode_pixel_pred(dc, x, y, curr_row, above_row);
+                        if (is_pixel_on_stack(dc, pix))
+                            return AVERROR_INVALIDDATA;
+
                         if (x) {
                             int ret = epic_add_pixel_to_cache(&dc->hash,
                                                               ref_pix,
diff --git a/libavcodec/g722dec.c b/libavcodec/g722dec.c
index 000b591..7c270bc 100644
--- a/libavcodec/g722dec.c
+++ b/libavcodec/g722dec.c
@@ -100,7 +100,9 @@
         return ret;
     out_buf = (int16_t *)frame->data[0];
 
-    init_get_bits(&gb, avpkt->data, avpkt->size * 8);
+    ret = init_get_bits8(&gb, avpkt->data, avpkt->size);
+    if (ret < 0)
+        return ret;
 
     for (j = 0; j < avpkt->size; j++) {
         int ilow, ihigh, rlow, rhigh, dhigh;
diff --git a/libavcodec/g723_1.h b/libavcodec/g723_1.h
index f833af0..d60d481 100644
--- a/libavcodec/g723_1.h
+++ b/libavcodec/g723_1.h
@@ -116,9 +116,7 @@
     int pulse_sign[PULSE_MAX];
 } FCBParam;
 
-typedef struct g723_1_context {
-    AVClass *class;
-
+typedef struct G723_1_ChannelContext {
     G723_1_Subframe subframe[4];
     enum FrameType cur_frame_type;
     enum FrameType past_frame_type;
@@ -144,8 +142,6 @@
     int reflection_coef;
     int pf_gain;                 ///< formant postfilter
                                  ///< gain scaling unit memory
-    int postfilter;
-
     int16_t audio[FRAME_LEN + LPC_ORDER + PITCH_MAX + 4];
 
     /* encoder */
@@ -158,6 +154,13 @@
     int16_t perf_iir_mem[LPC_ORDER];       ///< and iir memories
 
     int16_t harmonic_mem[PITCH_MAX];
+} G723_1_ChannelContext;
+
+typedef struct G723_1_Context {
+    AVClass *class;
+    int postfilter;
+
+    G723_1_ChannelContext ch[2];
 } G723_1_Context;
 
 
diff --git a/libavcodec/g723_1_parser.c b/libavcodec/g723_1_parser.c
new file mode 100644
index 0000000..0305ca3
--- /dev/null
+++ b/libavcodec/g723_1_parser.c
@@ -0,0 +1,60 @@
+/*
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file
+ * G723_1 audio parser
+ */
+
+#include "parser.h"
+#include "g723_1.h"
+
+typedef struct G723_1ParseContext {
+    ParseContext pc;
+} G723_1ParseContext;
+
+static int g723_1_parse(AVCodecParserContext *s1, AVCodecContext *avctx,
+                        const uint8_t **poutbuf, int *poutbuf_size,
+                        const uint8_t *buf, int buf_size)
+{
+    G723_1ParseContext *s = s1->priv_data;
+    ParseContext *pc = &s->pc;
+    int next = END_NOT_FOUND;
+
+    if (buf_size > 0)
+        next = frame_size[buf[0] & 3] * FFMAX(1, avctx->channels);
+
+    if (ff_combine_frame(pc, next, &buf, &buf_size) < 0 || !buf_size) {
+        *poutbuf      = NULL;
+        *poutbuf_size = 0;
+        return buf_size;
+    }
+
+    s1->duration = 240;
+
+    *poutbuf      = buf;
+    *poutbuf_size = buf_size;
+    return next;
+}
+
+AVCodecParser ff_g723_1_parser = {
+    .codec_ids      = { AV_CODEC_ID_G723_1 },
+    .priv_data_size = sizeof(G723_1ParseContext),
+    .parser_parse   = g723_1_parse,
+    .parser_close   = ff_parse_close,
+};
diff --git a/libavcodec/g723_1dec.c b/libavcodec/g723_1dec.c
index ab952ec..f601d31 100644
--- a/libavcodec/g723_1dec.c
+++ b/libavcodec/g723_1dec.c
@@ -42,18 +42,25 @@
 
 static av_cold int g723_1_decode_init(AVCodecContext *avctx)
 {
-    G723_1_Context *p = avctx->priv_data;
+    G723_1_Context *s = avctx->priv_data;
 
-    avctx->channel_layout = AV_CH_LAYOUT_MONO;
-    avctx->sample_fmt     = AV_SAMPLE_FMT_S16;
-    avctx->channels       = 1;
-    p->pf_gain            = 1 << 12;
+    avctx->sample_fmt     = AV_SAMPLE_FMT_S16P;
+    if (avctx->channels < 1 || avctx->channels > 2) {
+        av_log(avctx, AV_LOG_ERROR, "Only mono and stereo are supported (requested channels: %d).\n", avctx->channels);
+        return AVERROR(EINVAL);
+    }
+    avctx->channel_layout = avctx->channels == 1 ? AV_CH_LAYOUT_MONO : AV_CH_LAYOUT_STEREO;
+    for (int ch = 0; ch < avctx->channels; ch++) {
+        G723_1_ChannelContext *p = &s->ch[ch];
 
-    memcpy(p->prev_lsp, dc_lsp, LPC_ORDER * sizeof(*p->prev_lsp));
-    memcpy(p->sid_lsp,  dc_lsp, LPC_ORDER * sizeof(*p->sid_lsp));
+        p->pf_gain = 1 << 12;
 
-    p->cng_random_seed = CNG_RANDOM_SEED;
-    p->past_frame_type = SID_FRAME;
+        memcpy(p->prev_lsp, dc_lsp, LPC_ORDER * sizeof(*p->prev_lsp));
+        memcpy(p->sid_lsp,  dc_lsp, LPC_ORDER * sizeof(*p->sid_lsp));
+
+        p->cng_random_seed = CNG_RANDOM_SEED;
+        p->past_frame_type = SID_FRAME;
+    }
 
     return 0;
 }
@@ -65,14 +72,17 @@
  * @param buf         pointer to the input buffer
  * @param buf_size    size of the input buffer
  */
-static int unpack_bitstream(G723_1_Context *p, const uint8_t *buf,
+static int unpack_bitstream(G723_1_ChannelContext *p, const uint8_t *buf,
                             int buf_size)
 {
     GetBitContext gb;
     int ad_cb_len;
     int temp, info_bits, i;
+    int ret;
 
-    init_get_bits(&gb, buf, buf_size * 8);
+    ret = init_get_bits8(&gb, buf, buf_size);
+    if (ret < 0)
+        return ret;
 
     /* Extract frame type and rate info */
     info_bits = get_bits(&gb, 2);
@@ -344,7 +354,7 @@
  * @param ppf       pitch postfilter parameters
  * @param cur_rate  current bitrate
  */
-static void comp_ppf_coeff(G723_1_Context *p, int offset, int pitch_lag,
+static void comp_ppf_coeff(G723_1_ChannelContext *p, int offset, int pitch_lag,
                            PPFParam *ppf, enum Rate cur_rate)
 {
 
@@ -430,7 +440,7 @@
  *
  * @return residual interpolation index if voiced, 0 otherwise
  */
-static int comp_interp_index(G723_1_Context *p, int pitch_lag,
+static int comp_interp_index(G723_1_ChannelContext *p, int pitch_lag,
                              int *exc_eng, int *scale)
 {
     int offset = PITCH_MAX + 2 * SUBFRAME_LEN;
@@ -529,7 +539,7 @@
  * @param buf    postfiltered output vector
  * @param energy input energy coefficient
  */
-static void gain_scale(G723_1_Context *p, int16_t * buf, int energy)
+static void gain_scale(G723_1_ChannelContext *p, int16_t * buf, int energy)
 {
     int num, denom, gain, bits1, bits2;
     int i;
@@ -572,7 +582,7 @@
  * @param buf input buffer
  * @param dst output buffer
  */
-static void formant_postfilter(G723_1_Context *p, int16_t *lpc,
+static void formant_postfilter(G723_1_ChannelContext *p, int16_t *lpc,
                                int16_t *buf, int16_t *dst)
 {
     int16_t filter_coef[2][LPC_ORDER];
@@ -655,7 +665,7 @@
     return (*state & 0x7FFF) * base >> 15;
 }
 
-static int estimate_sid_gain(G723_1_Context *p)
+static int estimate_sid_gain(G723_1_ChannelContext *p)
 {
     int i, shift, seg, seg2, t, val, val_add, x, y;
 
@@ -667,7 +677,9 @@
             if (p->sid_gain < 0) t = INT32_MIN;
             else                 t = INT32_MAX;
         } else
-            t = p->sid_gain << shift;
+            t = p->sid_gain * (1 << shift);
+    } else if(shift < -31) {
+        t = (p->sid_gain < 0) ? -1 : 0;
     }else
         t = p->sid_gain >> -shift;
     x = av_clipl_int32(t * (int64_t)cng_filt[0] >> 16);
@@ -715,7 +727,7 @@
     return val;
 }
 
-static void generate_noise(G723_1_Context *p)
+static void generate_noise(G723_1_ChannelContext *p)
 {
     int i, j, idx, t;
     int off[SUBFRAMES];
@@ -843,7 +855,7 @@
 static int g723_1_decode_frame(AVCodecContext *avctx, void *data,
                                int *got_frame_ptr, AVPacket *avpkt)
 {
-    G723_1_Context *p  = avctx->priv_data;
+    G723_1_Context *s  = avctx->priv_data;
     AVFrame *frame     = data;
     const uint8_t *buf = avpkt->data;
     int buf_size       = avpkt->size;
@@ -855,9 +867,8 @@
     int16_t acb_vector[SUBFRAME_LEN];
     int16_t *out;
     int bad_frame = 0, i, j, ret;
-    int16_t *audio = p->audio;
 
-    if (buf_size < frame_size[dec_mode]) {
+    if (buf_size < frame_size[dec_mode] * avctx->channels) {
         if (buf_size)
             av_log(avctx, AV_LOG_WARNING,
                    "Expected %d bytes, got %d - skipping packet\n",
@@ -866,142 +877,148 @@
         return buf_size;
     }
 
-    if (unpack_bitstream(p, buf, buf_size) < 0) {
-        bad_frame = 1;
-        if (p->past_frame_type == ACTIVE_FRAME)
-            p->cur_frame_type = ACTIVE_FRAME;
-        else
-            p->cur_frame_type = UNTRANSMITTED_FRAME;
-    }
-
     frame->nb_samples = FRAME_LEN;
     if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
         return ret;
 
-    out = (int16_t *)frame->data[0];
+    for (int ch = 0; ch < avctx->channels; ch++) {
+        G723_1_ChannelContext *p = &s->ch[ch];
+        int16_t *audio = p->audio;
 
-    if (p->cur_frame_type == ACTIVE_FRAME) {
-        if (!bad_frame)
-            p->erased_frames = 0;
-        else if (p->erased_frames != 3)
-            p->erased_frames++;
+        if (unpack_bitstream(p, buf + ch * (buf_size / avctx->channels),
+                             buf_size / avctx->channels) < 0) {
+            bad_frame = 1;
+            if (p->past_frame_type == ACTIVE_FRAME)
+                p->cur_frame_type = ACTIVE_FRAME;
+            else
+                p->cur_frame_type = UNTRANSMITTED_FRAME;
+        }
 
-        ff_g723_1_inverse_quant(cur_lsp, p->prev_lsp, p->lsp_index, bad_frame);
-        ff_g723_1_lsp_interpolate(lpc, cur_lsp, p->prev_lsp);
+        out = (int16_t *)frame->extended_data[ch];
 
-        /* Save the lsp_vector for the next frame */
-        memcpy(p->prev_lsp, cur_lsp, LPC_ORDER * sizeof(*p->prev_lsp));
+        if (p->cur_frame_type == ACTIVE_FRAME) {
+            if (!bad_frame)
+                p->erased_frames = 0;
+            else if (p->erased_frames != 3)
+                p->erased_frames++;
 
-        /* Generate the excitation for the frame */
-        memcpy(p->excitation, p->prev_excitation,
-               PITCH_MAX * sizeof(*p->excitation));
-        if (!p->erased_frames) {
-            int16_t *vector_ptr = p->excitation + PITCH_MAX;
+            ff_g723_1_inverse_quant(cur_lsp, p->prev_lsp, p->lsp_index, bad_frame);
+            ff_g723_1_lsp_interpolate(lpc, cur_lsp, p->prev_lsp);
 
-            /* Update interpolation gain memory */
-            p->interp_gain = fixed_cb_gain[(p->subframe[2].amp_index +
-                                            p->subframe[3].amp_index) >> 1];
-            for (i = 0; i < SUBFRAMES; i++) {
-                gen_fcb_excitation(vector_ptr, &p->subframe[i], p->cur_rate,
-                                   p->pitch_lag[i >> 1], i);
-                ff_g723_1_gen_acb_excitation(acb_vector,
-                                             &p->excitation[SUBFRAME_LEN * i],
-                                             p->pitch_lag[i >> 1],
-                                             &p->subframe[i], p->cur_rate);
-                /* Get the total excitation */
-                for (j = 0; j < SUBFRAME_LEN; j++) {
-                    int v = av_clip_int16(vector_ptr[j] * 2);
-                    vector_ptr[j] = av_clip_int16(v + acb_vector[j]);
-                }
-                vector_ptr += SUBFRAME_LEN;
-            }
+            /* Save the lsp_vector for the next frame */
+            memcpy(p->prev_lsp, cur_lsp, LPC_ORDER * sizeof(*p->prev_lsp));
 
-            vector_ptr = p->excitation + PITCH_MAX;
-
-            p->interp_index = comp_interp_index(p, p->pitch_lag[1],
-                                                &p->sid_gain, &p->cur_gain);
-
-            /* Perform pitch postfiltering */
-            if (p->postfilter) {
-                i = PITCH_MAX;
-                for (j = 0; j < SUBFRAMES; i += SUBFRAME_LEN, j++)
-                    comp_ppf_coeff(p, i, p->pitch_lag[j >> 1],
-                                   ppf + j, p->cur_rate);
-
-                for (i = 0, j = 0; j < SUBFRAMES; i += SUBFRAME_LEN, j++)
-                    ff_acelp_weighted_vector_sum(p->audio + LPC_ORDER + i,
-                                                 vector_ptr + i,
-                                                 vector_ptr + i + ppf[j].index,
-                                                 ppf[j].sc_gain,
-                                                 ppf[j].opt_gain,
-                                                 1 << 14, 15, SUBFRAME_LEN);
-            } else {
-                audio = vector_ptr - LPC_ORDER;
-            }
-
-            /* Save the excitation for the next frame */
-            memcpy(p->prev_excitation, p->excitation + FRAME_LEN,
+            /* Generate the excitation for the frame */
+            memcpy(p->excitation, p->prev_excitation,
                    PITCH_MAX * sizeof(*p->excitation));
-        } else {
-            p->interp_gain = (p->interp_gain * 3 + 2) >> 2;
-            if (p->erased_frames == 3) {
-                /* Mute output */
-                memset(p->excitation, 0,
-                       (FRAME_LEN + PITCH_MAX) * sizeof(*p->excitation));
-                memset(p->prev_excitation, 0,
-                       PITCH_MAX * sizeof(*p->excitation));
-                memset(frame->data[0], 0,
-                       (FRAME_LEN + LPC_ORDER) * sizeof(int16_t));
-            } else {
-                int16_t *buf = p->audio + LPC_ORDER;
+            if (!p->erased_frames) {
+                int16_t *vector_ptr = p->excitation + PITCH_MAX;
 
-                /* Regenerate frame */
-                residual_interp(p->excitation, buf, p->interp_index,
-                                p->interp_gain, &p->random_seed);
+                /* Update interpolation gain memory */
+                p->interp_gain = fixed_cb_gain[(p->subframe[2].amp_index +
+                                                p->subframe[3].amp_index) >> 1];
+                for (i = 0; i < SUBFRAMES; i++) {
+                    gen_fcb_excitation(vector_ptr, &p->subframe[i], p->cur_rate,
+                                       p->pitch_lag[i >> 1], i);
+                    ff_g723_1_gen_acb_excitation(acb_vector,
+                                                 &p->excitation[SUBFRAME_LEN * i],
+                                                 p->pitch_lag[i >> 1],
+                                                 &p->subframe[i], p->cur_rate);
+                    /* Get the total excitation */
+                    for (j = 0; j < SUBFRAME_LEN; j++) {
+                        int v = av_clip_int16(vector_ptr[j] * 2);
+                        vector_ptr[j] = av_clip_int16(v + acb_vector[j]);
+                    }
+                    vector_ptr += SUBFRAME_LEN;
+                }
+
+                vector_ptr = p->excitation + PITCH_MAX;
+
+                p->interp_index = comp_interp_index(p, p->pitch_lag[1],
+                                                    &p->sid_gain, &p->cur_gain);
+
+                /* Perform pitch postfiltering */
+                if (s->postfilter) {
+                    i = PITCH_MAX;
+                    for (j = 0; j < SUBFRAMES; i += SUBFRAME_LEN, j++)
+                        comp_ppf_coeff(p, i, p->pitch_lag[j >> 1],
+                                       ppf + j, p->cur_rate);
+
+                    for (i = 0, j = 0; j < SUBFRAMES; i += SUBFRAME_LEN, j++)
+                        ff_acelp_weighted_vector_sum(p->audio + LPC_ORDER + i,
+                                                     vector_ptr + i,
+                                                     vector_ptr + i + ppf[j].index,
+                                                     ppf[j].sc_gain,
+                                                     ppf[j].opt_gain,
+                                                     1 << 14, 15, SUBFRAME_LEN);
+                } else {
+                    audio = vector_ptr - LPC_ORDER;
+                }
 
                 /* Save the excitation for the next frame */
-                memcpy(p->prev_excitation, buf + (FRAME_LEN - PITCH_MAX),
+                memcpy(p->prev_excitation, p->excitation + FRAME_LEN,
                        PITCH_MAX * sizeof(*p->excitation));
+            } else {
+                p->interp_gain = (p->interp_gain * 3 + 2) >> 2;
+                if (p->erased_frames == 3) {
+                    /* Mute output */
+                    memset(p->excitation, 0,
+                           (FRAME_LEN + PITCH_MAX) * sizeof(*p->excitation));
+                    memset(p->prev_excitation, 0,
+                           PITCH_MAX * sizeof(*p->excitation));
+                    memset(frame->data[0], 0,
+                           (FRAME_LEN + LPC_ORDER) * sizeof(int16_t));
+                } else {
+                    int16_t *buf = p->audio + LPC_ORDER;
+
+                    /* Regenerate frame */
+                    residual_interp(p->excitation, buf, p->interp_index,
+                                    p->interp_gain, &p->random_seed);
+
+                    /* Save the excitation for the next frame */
+                    memcpy(p->prev_excitation, buf + (FRAME_LEN - PITCH_MAX),
+                           PITCH_MAX * sizeof(*p->excitation));
+                }
             }
-        }
-        p->cng_random_seed = CNG_RANDOM_SEED;
-    } else {
-        if (p->cur_frame_type == SID_FRAME) {
-            p->sid_gain = sid_gain_to_lsp_index(p->subframe[0].amp_index);
-            ff_g723_1_inverse_quant(p->sid_lsp, p->prev_lsp, p->lsp_index, 0);
-        } else if (p->past_frame_type == ACTIVE_FRAME) {
-            p->sid_gain = estimate_sid_gain(p);
+            p->cng_random_seed = CNG_RANDOM_SEED;
+        } else {
+            if (p->cur_frame_type == SID_FRAME) {
+                p->sid_gain = sid_gain_to_lsp_index(p->subframe[0].amp_index);
+                ff_g723_1_inverse_quant(p->sid_lsp, p->prev_lsp, p->lsp_index, 0);
+            } else if (p->past_frame_type == ACTIVE_FRAME) {
+                p->sid_gain = estimate_sid_gain(p);
+            }
+
+            if (p->past_frame_type == ACTIVE_FRAME)
+                p->cur_gain = p->sid_gain;
+            else
+                p->cur_gain = (p->cur_gain * 7 + p->sid_gain) >> 3;
+            generate_noise(p);
+            ff_g723_1_lsp_interpolate(lpc, p->sid_lsp, p->prev_lsp);
+            /* Save the lsp_vector for the next frame */
+            memcpy(p->prev_lsp, p->sid_lsp, LPC_ORDER * sizeof(*p->prev_lsp));
         }
 
-        if (p->past_frame_type == ACTIVE_FRAME)
-            p->cur_gain = p->sid_gain;
-        else
-            p->cur_gain = (p->cur_gain * 7 + p->sid_gain) >> 3;
-        generate_noise(p);
-        ff_g723_1_lsp_interpolate(lpc, p->sid_lsp, p->prev_lsp);
-        /* Save the lsp_vector for the next frame */
-        memcpy(p->prev_lsp, p->sid_lsp, LPC_ORDER * sizeof(*p->prev_lsp));
-    }
+        p->past_frame_type = p->cur_frame_type;
 
-    p->past_frame_type = p->cur_frame_type;
+        memcpy(p->audio, p->synth_mem, LPC_ORDER * sizeof(*p->audio));
+        for (i = LPC_ORDER, j = 0; j < SUBFRAMES; i += SUBFRAME_LEN, j++)
+            ff_celp_lp_synthesis_filter(p->audio + i, &lpc[j * LPC_ORDER],
+                                        audio + i, SUBFRAME_LEN, LPC_ORDER,
+                                        0, 1, 1 << 12);
+        memcpy(p->synth_mem, p->audio + FRAME_LEN, LPC_ORDER * sizeof(*p->audio));
 
-    memcpy(p->audio, p->synth_mem, LPC_ORDER * sizeof(*p->audio));
-    for (i = LPC_ORDER, j = 0; j < SUBFRAMES; i += SUBFRAME_LEN, j++)
-        ff_celp_lp_synthesis_filter(p->audio + i, &lpc[j * LPC_ORDER],
-                                    audio + i, SUBFRAME_LEN, LPC_ORDER,
-                                    0, 1, 1 << 12);
-    memcpy(p->synth_mem, p->audio + FRAME_LEN, LPC_ORDER * sizeof(*p->audio));
-
-    if (p->postfilter) {
-        formant_postfilter(p, lpc, p->audio, out);
-    } else { // if output is not postfiltered it should be scaled by 2
-        for (i = 0; i < FRAME_LEN; i++)
-            out[i] = av_clip_int16(p->audio[LPC_ORDER + i] << 1);
+        if (s->postfilter) {
+            formant_postfilter(p, lpc, p->audio, out);
+        } else { // if output is not postfiltered it should be scaled by 2
+            for (i = 0; i < FRAME_LEN; i++)
+                out[i] = av_clip_int16(2 * p->audio[LPC_ORDER + i]);
+        }
     }
 
     *got_frame_ptr = 1;
 
-    return frame_size[dec_mode];
+    return frame_size[dec_mode] * avctx->channels;
 }
 
 #define OFFSET(x) offsetof(G723_1_Context, x)
diff --git a/libavcodec/g723_1enc.c b/libavcodec/g723_1enc.c
index 4a4525e..5928405 100644
--- a/libavcodec/g723_1enc.c
+++ b/libavcodec/g723_1enc.c
@@ -42,7 +42,8 @@
 
 static av_cold int g723_1_encode_init(AVCodecContext *avctx)
 {
-    G723_1_Context *p = avctx->priv_data;
+    G723_1_Context *s = avctx->priv_data;
+    G723_1_ChannelContext *p = &s->ch[0];
 
     if (avctx->sample_rate != 8000) {
         av_log(avctx, AV_LOG_ERROR, "Only 8000Hz sample rate supported\n");
@@ -386,7 +387,7 @@
  * @param flt_coef filter coefficients
  * @param unq_lpc  unquantized lpc vector
  */
-static void perceptual_filter(G723_1_Context *p, int16_t *flt_coef,
+static void perceptual_filter(G723_1_ChannelContext *p, int16_t *flt_coef,
                               int16_t *unq_lpc, int16_t *buf)
 {
     int16_t vector[FRAME_LEN + LPC_ORDER];
@@ -635,7 +636,7 @@
  * @param buf   input signal
  * @param index the current subframe index
  */
-static void acb_search(G723_1_Context *p, int16_t *residual,
+static void acb_search(G723_1_ChannelContext *p, int16_t *residual,
                        int16_t *impulse_resp, const int16_t *buf,
                        int index)
 {
@@ -963,7 +964,7 @@
  * @param buf          target vector
  * @param impulse_resp impulse response of the combined filter
  */
-static void fcb_search(G723_1_Context *p, int16_t *impulse_resp,
+static void fcb_search(G723_1_ChannelContext *p, int16_t *impulse_resp,
                        int16_t *buf, int index)
 {
     FCBParam optim;
@@ -995,7 +996,7 @@
  * @param frame output buffer
  * @param size  size of the buffer
  */
-static int pack_bitstream(G723_1_Context *p, AVPacket *avpkt)
+static int pack_bitstream(G723_1_ChannelContext *p, AVPacket *avpkt)
 {
     PutBitContext pb;
     int info_bits = 0;
@@ -1056,7 +1057,8 @@
 static int g723_1_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
                                const AVFrame *frame, int *got_packet_ptr)
 {
-    G723_1_Context *p = avctx->priv_data;
+    G723_1_Context *s = avctx->priv_data;
+    G723_1_ChannelContext *p = &s->ch[0];
     int16_t unq_lpc[LPC_ORDER * SUBFRAMES];
     int16_t qnt_lpc[LPC_ORDER * SUBFRAMES];
     int16_t cur_lsp[LPC_ORDER];
@@ -1189,6 +1191,11 @@
     return 0;
 }
 
+static const AVCodecDefault defaults[] = {
+    { "b", "6300" },
+    { NULL },
+};
+
 AVCodec ff_g723_1_encoder = {
     .name           = "g723_1",
     .long_name      = NULL_IF_CONFIG_SMALL("G.723.1"),
@@ -1197,6 +1204,7 @@
     .priv_data_size = sizeof(G723_1_Context),
     .init           = g723_1_encode_init,
     .encode2        = g723_1_encode_frame,
+    .defaults       = defaults,
     .sample_fmts    = (const enum AVSampleFormat[]) {
         AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_NONE
     },
diff --git a/libavcodec/g729_parser.c b/libavcodec/g729_parser.c
index d13c990..010f6881 100644
--- a/libavcodec/g729_parser.c
+++ b/libavcodec/g729_parser.c
@@ -45,12 +45,20 @@
     int next;
 
     if (!s->block_size) {
-        av_assert1(avctx->codec_id == AV_CODEC_ID_G729);
         /* FIXME: replace this heuristic block_size with more precise estimate */
         s->block_size = (avctx->bit_rate < 8000) ? G729D_6K4_BLOCK_SIZE : G729_8K_BLOCK_SIZE;
+        if (avctx->codec_id == AV_CODEC_ID_ACELP_KELVIN)
+            s->block_size++;
+        s->block_size *= avctx->channels;
         s->duration   = avctx->frame_size;
     }
 
+    if (!s->block_size) {
+        *poutbuf      = buf;
+        *poutbuf_size = buf_size;
+        return buf_size;
+    }
+
     if (!s->remaining)
         s->remaining = s->block_size;
     if (s->remaining <= buf_size) {
@@ -75,7 +83,7 @@
 }
 
 AVCodecParser ff_g729_parser = {
-    .codec_ids      = { AV_CODEC_ID_G729 },
+    .codec_ids      = { AV_CODEC_ID_G729, AV_CODEC_ID_ACELP_KELVIN },
     .priv_data_size = sizeof(G729ParseContext),
     .parser_parse   = g729_parse,
     .parser_close   = ff_parse_close,
diff --git a/libavcodec/g729dec.c b/libavcodec/g729dec.c
index 2e1bf18..c181f23 100644
--- a/libavcodec/g729dec.c
+++ b/libavcodec/g729dec.c
@@ -97,11 +97,10 @@
     uint8_t gc_2nd_index_bits;  ///< gain codebook (second stage) index (size in bits)
     uint8_t fc_signs_bits;      ///< number of pulses in fixed-codebook vector
     uint8_t fc_indexes_bits;    ///< size (in bits) of fixed-codebook index entry
+    uint8_t block_size;
 } G729FormatDescription;
 
 typedef struct {
-    AudioDSPContext adsp;
-
     /// past excitation signal buffer
     int16_t exc_base[2*SUBFRAME_SIZE+PITCH_DELAY_MAX+INTERPOL_LEN];
 
@@ -152,7 +151,13 @@
 
     /// high-pass filter data (past output)
     int16_t hpf_z[2];
-}  G729Context;
+}  G729ChannelContext;
+
+typedef struct {
+    AudioDSPContext adsp;
+
+    G729ChannelContext *channel_context;
+} G729Context;
 
 static const G729FormatDescription format_g729_8k = {
     .ac_index_bits     = {8,5},
@@ -161,6 +166,7 @@
     .gc_2nd_index_bits = GC_2ND_IDX_BITS_8K,
     .fc_signs_bits     = 4,
     .fc_indexes_bits   = 13,
+    .block_size        = G729_8K_BLOCK_SIZE,
 };
 
 static const G729FormatDescription format_g729d_6k4 = {
@@ -170,6 +176,7 @@
     .gc_2nd_index_bits = GC_2ND_IDX_BITS_6K4,
     .fc_signs_bits     = 2,
     .fc_indexes_bits   = 9,
+    .block_size        = G729D_6K4_BLOCK_SIZE,
 };
 
 /**
@@ -268,8 +275,7 @@
 
     ff_celp_convolve_circ(fc_new, fc_cur, phase_filter[dstate], subframe_size);
 
-    for(i=0; i<subframe_size; i++)
-    {
+    for (i = 0; i < subframe_size; i++) {
         out[i]  = in[i];
         out[i] -= (gain_code * fc_cur[i] + 0x2000) >> 14;
         out[i] += (gain_code * fc_new[i] + 0x2000) >> 14;
@@ -285,10 +291,10 @@
  */
 static int g729d_onset_decision(int past_onset, const int16_t* past_gain_code)
 {
-    if((past_gain_code[0] >> 1) > past_gain_code[1])
+    if ((past_gain_code[0] >> 1) > past_gain_code[1])
         return 2;
-    else
-        return FFMAX(past_onset-1, 0);
+
+    return FFMAX(past_onset-1, 0);
 }
 
 /**
@@ -303,24 +309,25 @@
 {
     int i, low_gain_pitch_cnt, voice_decision;
 
-    if(past_gain_pitch[0] >= 14745)      // 0.9
+    if (past_gain_pitch[0] >= 14745) {       // 0.9
         voice_decision = DECISION_VOICE;
-    else if (past_gain_pitch[0] <= 9830) // 0.6
+    } else if (past_gain_pitch[0] <= 9830) { // 0.6
         voice_decision = DECISION_NOISE;
-    else
+    } else {
         voice_decision = DECISION_INTERMEDIATE;
+    }
 
-    for(i=0, low_gain_pitch_cnt=0; i<6; i++)
-        if(past_gain_pitch[i] < 9830)
+    for (i = 0, low_gain_pitch_cnt = 0; i < 6; i++)
+        if (past_gain_pitch[i] < 9830)
             low_gain_pitch_cnt++;
 
-    if(low_gain_pitch_cnt > 2 && !onset)
+    if (low_gain_pitch_cnt > 2 && !onset)
         voice_decision = DECISION_NOISE;
 
-    if(!onset && voice_decision > prev_voice_decision + 1)
+    if (!onset && voice_decision > prev_voice_decision + 1)
         voice_decision--;
 
-    if(onset && voice_decision < DECISION_VOICE)
+    if (onset && voice_decision < DECISION_VOICE)
         voice_decision++;
 
     return voice_decision;
@@ -328,53 +335,66 @@
 
 static int32_t scalarproduct_int16_c(const int16_t * v1, const int16_t * v2, int order)
 {
-    int res = 0;
+    int64_t res = 0;
 
     while (order--)
         res += *v1++ * *v2++;
 
+    if      (res > INT32_MAX) return INT32_MAX;
+    else if (res < INT32_MIN) return INT32_MIN;
+
     return res;
 }
 
 static av_cold int decoder_init(AVCodecContext * avctx)
 {
-    G729Context* ctx = avctx->priv_data;
-    int i,k;
+    G729Context *s = avctx->priv_data;
+    G729ChannelContext *ctx;
+    int c,i,k;
 
-    if (avctx->channels != 1) {
-        av_log(avctx, AV_LOG_ERROR, "Only mono sound is supported (requested channels: %d).\n", avctx->channels);
+    if (avctx->channels < 1 || avctx->channels > 2) {
+        av_log(avctx, AV_LOG_ERROR, "Only mono and stereo are supported (requested channels: %d).\n", avctx->channels);
         return AVERROR(EINVAL);
     }
-    avctx->sample_fmt = AV_SAMPLE_FMT_S16;
+    avctx->sample_fmt = AV_SAMPLE_FMT_S16P;
 
     /* Both 8kbit/s and 6.4kbit/s modes uses two subframes per frame. */
     avctx->frame_size = SUBFRAME_SIZE << 1;
 
-    ctx->gain_coeff = 16384; // 1.0 in (1.14)
+    ctx =
+    s->channel_context = av_mallocz(sizeof(G729ChannelContext) * avctx->channels);
+    if (!ctx)
+        return AVERROR(ENOMEM);
 
-    for (k = 0; k < MA_NP + 1; k++) {
-        ctx->past_quantizer_outputs[k] = ctx->past_quantizer_output_buf[k];
-        for (i = 1; i < 11; i++)
-            ctx->past_quantizer_outputs[k][i - 1] = (18717 * i) >> 3;
+    for (c = 0; c < avctx->channels; c++) {
+        ctx->gain_coeff = 16384; // 1.0 in (1.14)
+
+        for (k = 0; k < MA_NP + 1; k++) {
+            ctx->past_quantizer_outputs[k] = ctx->past_quantizer_output_buf[k];
+            for (i = 1; i < 11; i++)
+                ctx->past_quantizer_outputs[k][i - 1] = (18717 * i) >> 3;
+        }
+
+        ctx->lsp[0] = ctx->lsp_buf[0];
+        ctx->lsp[1] = ctx->lsp_buf[1];
+        memcpy(ctx->lsp[0], lsp_init, 10 * sizeof(int16_t));
+
+        ctx->exc = &ctx->exc_base[PITCH_DELAY_MAX+INTERPOL_LEN];
+
+        ctx->pitch_delay_int_prev = PITCH_DELAY_MIN;
+
+        /* random seed initialization */
+        ctx->rand_value = 21845;
+
+        /* quantized prediction error */
+        for (i = 0; i < 4; i++)
+            ctx->quant_energy[i] = -14336; // -14 in (5.10)
+
+        ctx++;
     }
 
-    ctx->lsp[0] = ctx->lsp_buf[0];
-    ctx->lsp[1] = ctx->lsp_buf[1];
-    memcpy(ctx->lsp[0], lsp_init, 10 * sizeof(int16_t));
-
-    ctx->exc = &ctx->exc_base[PITCH_DELAY_MAX+INTERPOL_LEN];
-
-    ctx->pitch_delay_int_prev = PITCH_DELAY_MIN;
-
-    /* random seed initialization */
-    ctx->rand_value = 21845;
-
-    /* quantized prediction error */
-    for(i=0; i<4; i++)
-        ctx->quant_energy[i] = -14336; // -14 in (5.10)
-
-    ff_audiodsp_init(&ctx->adsp);
-    ctx->adsp.scalarproduct_int16 = scalarproduct_int16_c;
+    ff_audiodsp_init(&s->adsp);
+    s->adsp.scalarproduct_int16 = scalarproduct_int16_c;
 
     return 0;
 }
@@ -387,12 +407,11 @@
     int16_t *out_frame;
     GetBitContext gb;
     const G729FormatDescription *format;
-    int frame_erasure = 0;    ///< frame erasure detected during decoding
-    int bad_pitch = 0;        ///< parity check failed
-    int i;
+    int c, i;
     int16_t *tmp;
     G729Formats packet_type;
-    G729Context *ctx = avctx->priv_data;
+    G729Context *s = avctx->priv_data;
+    G729ChannelContext *ctx = s->channel_context;
     int16_t lp[2][11];           // (3.12)
     uint8_t ma_predictor;     ///< switched MA predictor of LSP quantizer
     uint8_t quantizer_1st;    ///< first stage vector of quantizer
@@ -405,22 +424,20 @@
     int16_t synth[SUBFRAME_SIZE+10]; // fixed-codebook vector
     int j, ret;
     int gain_before, gain_after;
-    int is_periodic = 0;         // whether one of the subframes is declared as periodic or not
     AVFrame *frame = data;
 
     frame->nb_samples = SUBFRAME_SIZE<<1;
     if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
         return ret;
-    out_frame = (int16_t*) frame->data[0];
 
-    if (buf_size % 10 == 0) {
+    if (buf_size && buf_size % ((G729_8K_BLOCK_SIZE + (avctx->codec_id == AV_CODEC_ID_ACELP_KELVIN)) * avctx->channels) == 0) {
         packet_type = FORMAT_G729_8K;
         format = &format_g729_8k;
         //Reset voice decision
         ctx->onset = 0;
         ctx->voice_decision = DECISION_VOICE;
         av_log(avctx, AV_LOG_DEBUG, "Packet type: %s\n", "G.729 @ 8kbit/s");
-    } else if (buf_size == 8) {
+    } else if (buf_size == G729D_6K4_BLOCK_SIZE * avctx->channels && avctx->codec_id != AV_CODEC_ID_ACELP_KELVIN) {
         packet_type = FORMAT_G729D_6K4;
         format = &format_g729d_6k4;
         av_log(avctx, AV_LOG_DEBUG, "Packet type: %s\n", "G.729D @ 6.4kbit/s");
@@ -429,281 +446,308 @@
         return AVERROR_INVALIDDATA;
     }
 
-    for (i=0; i < buf_size; i++)
-        frame_erasure |= buf[i];
-    frame_erasure = !frame_erasure;
-
-    init_get_bits(&gb, buf, 8*buf_size);
-
-    ma_predictor     = get_bits(&gb, 1);
-    quantizer_1st    = get_bits(&gb, VQ_1ST_BITS);
-    quantizer_2nd_lo = get_bits(&gb, VQ_2ND_BITS);
-    quantizer_2nd_hi = get_bits(&gb, VQ_2ND_BITS);
-
-    if(frame_erasure)
-        lsf_restore_from_previous(ctx->lsfq, ctx->past_quantizer_outputs,
-                                  ctx->ma_predictor_prev);
-    else {
-        lsf_decode(ctx->lsfq, ctx->past_quantizer_outputs,
-                   ma_predictor,
-                   quantizer_1st, quantizer_2nd_lo, quantizer_2nd_hi);
-        ctx->ma_predictor_prev = ma_predictor;
-    }
-
-    tmp = ctx->past_quantizer_outputs[MA_NP];
-    memmove(ctx->past_quantizer_outputs + 1, ctx->past_quantizer_outputs,
-            MA_NP * sizeof(int16_t*));
-    ctx->past_quantizer_outputs[0] = tmp;
-
-    ff_acelp_lsf2lsp(ctx->lsp[1], ctx->lsfq, 10);
-
-    ff_acelp_lp_decode(&lp[0][0], &lp[1][0], ctx->lsp[1], ctx->lsp[0], 10);
-
-    FFSWAP(int16_t*, ctx->lsp[1], ctx->lsp[0]);
-
-    for (i = 0; i < 2; i++) {
-        int gain_corr_factor;
-
-        uint8_t ac_index;      ///< adaptive codebook index
-        uint8_t pulses_signs;  ///< fixed-codebook vector pulse signs
-        int fc_indexes;        ///< fixed-codebook indexes
-        uint8_t gc_1st_index;  ///< gain codebook (first stage) index
-        uint8_t gc_2nd_index;  ///< gain codebook (second stage) index
-
-        ac_index      = get_bits(&gb, format->ac_index_bits[i]);
-        if(!i && format->parity_bit)
-            bad_pitch = av_parity(ac_index >> 2) == get_bits1(&gb);
-        fc_indexes    = get_bits(&gb, format->fc_indexes_bits);
-        pulses_signs  = get_bits(&gb, format->fc_signs_bits);
-        gc_1st_index  = get_bits(&gb, format->gc_1st_index_bits);
-        gc_2nd_index  = get_bits(&gb, format->gc_2nd_index_bits);
-
-        if (frame_erasure)
-            pitch_delay_3x   = 3 * ctx->pitch_delay_int_prev;
-        else if(!i) {
-            if (bad_pitch)
-                pitch_delay_3x   = 3 * ctx->pitch_delay_int_prev;
-            else
-                pitch_delay_3x = ff_acelp_decode_8bit_to_1st_delay3(ac_index);
-        } else {
-            int pitch_delay_min = av_clip(ctx->pitch_delay_int_prev - 5,
-                                          PITCH_DELAY_MIN, PITCH_DELAY_MAX - 9);
-
-            if(packet_type == FORMAT_G729D_6K4)
-                pitch_delay_3x = ff_acelp_decode_4bit_to_2nd_delay3(ac_index, pitch_delay_min);
-            else
-                pitch_delay_3x = ff_acelp_decode_5_6_bit_to_2nd_delay3(ac_index, pitch_delay_min);
+    for (c = 0; c < avctx->channels; c++) {
+        int frame_erasure = 0; ///< frame erasure detected during decoding
+        int bad_pitch = 0;     ///< parity check failed
+        int is_periodic = 0;   ///< whether one of the subframes is declared as periodic or not
+        out_frame = (int16_t*)frame->data[c];
+        if (avctx->codec_id == AV_CODEC_ID_ACELP_KELVIN) {
+            if (*buf != ((avctx->channels - 1 - c) * 0x80 | 2))
+                avpriv_request_sample(avctx, "First byte value %x for channel %d", *buf, c);
+            buf++;
         }
 
-        /* Round pitch delay to nearest (used everywhere except ff_acelp_interpolate). */
-        pitch_delay_int[i]  = (pitch_delay_3x + 1) / 3;
-        if (pitch_delay_int[i] > PITCH_DELAY_MAX) {
-            av_log(avctx, AV_LOG_WARNING, "pitch_delay_int %d is too large\n", pitch_delay_int[i]);
-            pitch_delay_int[i] = PITCH_DELAY_MAX;
-        }
+        for (i = 0; i < format->block_size; i++)
+            frame_erasure |= buf[i];
+        frame_erasure = !frame_erasure;
+
+        init_get_bits8(&gb, buf, format->block_size);
+
+        ma_predictor     = get_bits(&gb, 1);
+        quantizer_1st    = get_bits(&gb, VQ_1ST_BITS);
+        quantizer_2nd_lo = get_bits(&gb, VQ_2ND_BITS);
+        quantizer_2nd_hi = get_bits(&gb, VQ_2ND_BITS);
 
         if (frame_erasure) {
-            ctx->rand_value = g729_prng(ctx->rand_value);
-            fc_indexes   = av_mod_uintp2(ctx->rand_value, format->fc_indexes_bits);
-
-            ctx->rand_value = g729_prng(ctx->rand_value);
-            pulses_signs = ctx->rand_value;
-        }
-
-
-        memset(fc, 0, sizeof(int16_t) * SUBFRAME_SIZE);
-        switch (packet_type) {
-            case FORMAT_G729_8K:
-                ff_acelp_fc_pulse_per_track(fc, ff_fc_4pulses_8bits_tracks_13,
-                                            ff_fc_4pulses_8bits_track_4,
-                                            fc_indexes, pulses_signs, 3, 3);
-                break;
-            case FORMAT_G729D_6K4:
-                ff_acelp_fc_pulse_per_track(fc, ff_fc_2pulses_9bits_track1_gray,
-                                            ff_fc_2pulses_9bits_track2_gray,
-                                            fc_indexes, pulses_signs, 1, 4);
-                break;
-        }
-
-        /*
-          This filter enhances harmonic components of the fixed-codebook vector to
-          improve the quality of the reconstructed speech.
-
-                     / fc_v[i],                                    i < pitch_delay
-          fc_v[i] = <
-                     \ fc_v[i] + gain_pitch * fc_v[i-pitch_delay], i >= pitch_delay
-        */
-        ff_acelp_weighted_vector_sum(fc + pitch_delay_int[i],
-                                     fc + pitch_delay_int[i],
-                                     fc, 1 << 14,
-                                     av_clip(ctx->past_gain_pitch[0], SHARP_MIN, SHARP_MAX),
-                                     0, 14,
-                                     SUBFRAME_SIZE - pitch_delay_int[i]);
-
-        memmove(ctx->past_gain_pitch+1, ctx->past_gain_pitch, 5 * sizeof(int16_t));
-        ctx->past_gain_code[1] = ctx->past_gain_code[0];
-
-        if (frame_erasure) {
-            ctx->past_gain_pitch[0] = (29491 * ctx->past_gain_pitch[0]) >> 15; // 0.90 (0.15)
-            ctx->past_gain_code[0]  = ( 2007 * ctx->past_gain_code[0] ) >> 11; // 0.98 (0.11)
-
-            gain_corr_factor = 0;
+            lsf_restore_from_previous(ctx->lsfq, ctx->past_quantizer_outputs,
+                                      ctx->ma_predictor_prev);
         } else {
-            if (packet_type == FORMAT_G729D_6K4) {
-                ctx->past_gain_pitch[0]  = cb_gain_1st_6k4[gc_1st_index][0] +
-                                           cb_gain_2nd_6k4[gc_2nd_index][0];
-                gain_corr_factor = cb_gain_1st_6k4[gc_1st_index][1] +
-                                   cb_gain_2nd_6k4[gc_2nd_index][1];
+            lsf_decode(ctx->lsfq, ctx->past_quantizer_outputs,
+                       ma_predictor,
+                       quantizer_1st, quantizer_2nd_lo, quantizer_2nd_hi);
+            ctx->ma_predictor_prev = ma_predictor;
+        }
 
-                /* Without check below overflow can occur in ff_acelp_update_past_gain.
-                   It is not issue for G.729, because gain_corr_factor in it's case is always
-                   greater than 1024, while in G.729D it can be even zero. */
-                gain_corr_factor = FFMAX(gain_corr_factor, 1024);
-#ifndef G729_BITEXACT
-                gain_corr_factor >>= 1;
-#endif
+        tmp = ctx->past_quantizer_outputs[MA_NP];
+        memmove(ctx->past_quantizer_outputs + 1, ctx->past_quantizer_outputs,
+                MA_NP * sizeof(int16_t*));
+        ctx->past_quantizer_outputs[0] = tmp;
+
+        ff_acelp_lsf2lsp(ctx->lsp[1], ctx->lsfq, 10);
+
+        ff_acelp_lp_decode(&lp[0][0], &lp[1][0], ctx->lsp[1], ctx->lsp[0], 10);
+
+        FFSWAP(int16_t*, ctx->lsp[1], ctx->lsp[0]);
+
+        for (i = 0; i < 2; i++) {
+            int gain_corr_factor;
+
+            uint8_t ac_index;      ///< adaptive codebook index
+            uint8_t pulses_signs;  ///< fixed-codebook vector pulse signs
+            int fc_indexes;        ///< fixed-codebook indexes
+            uint8_t gc_1st_index;  ///< gain codebook (first stage) index
+            uint8_t gc_2nd_index;  ///< gain codebook (second stage) index
+
+            ac_index      = get_bits(&gb, format->ac_index_bits[i]);
+            if (!i && format->parity_bit)
+                bad_pitch = av_parity(ac_index >> 2) == get_bits1(&gb);
+            fc_indexes    = get_bits(&gb, format->fc_indexes_bits);
+            pulses_signs  = get_bits(&gb, format->fc_signs_bits);
+            gc_1st_index  = get_bits(&gb, format->gc_1st_index_bits);
+            gc_2nd_index  = get_bits(&gb, format->gc_2nd_index_bits);
+
+            if (frame_erasure) {
+                pitch_delay_3x = 3 * ctx->pitch_delay_int_prev;
+            } else if (!i) {
+                if (bad_pitch) {
+                    pitch_delay_3x = 3 * ctx->pitch_delay_int_prev;
+                } else {
+                    pitch_delay_3x = ff_acelp_decode_8bit_to_1st_delay3(ac_index);
+                }
             } else {
-                ctx->past_gain_pitch[0]  = cb_gain_1st_8k[gc_1st_index][0] +
-                                           cb_gain_2nd_8k[gc_2nd_index][0];
-                gain_corr_factor = cb_gain_1st_8k[gc_1st_index][1] +
-                                   cb_gain_2nd_8k[gc_2nd_index][1];
+                int pitch_delay_min = av_clip(ctx->pitch_delay_int_prev - 5,
+                                              PITCH_DELAY_MIN, PITCH_DELAY_MAX - 9);
+
+                if (packet_type == FORMAT_G729D_6K4) {
+                    pitch_delay_3x = ff_acelp_decode_4bit_to_2nd_delay3(ac_index, pitch_delay_min);
+                } else {
+                    pitch_delay_3x = ff_acelp_decode_5_6_bit_to_2nd_delay3(ac_index, pitch_delay_min);
+                }
             }
 
-            /* Decode the fixed-codebook gain. */
-            ctx->past_gain_code[0] = ff_acelp_decode_gain_code(&ctx->adsp, gain_corr_factor,
-                                                               fc, MR_ENERGY,
-                                                               ctx->quant_energy,
-                                                               ma_prediction_coeff,
-                                                               SUBFRAME_SIZE, 4);
-#ifdef G729_BITEXACT
+            /* Round pitch delay to nearest (used everywhere except ff_acelp_interpolate). */
+            pitch_delay_int[i]  = (pitch_delay_3x + 1) / 3;
+            if (pitch_delay_int[i] > PITCH_DELAY_MAX) {
+                av_log(avctx, AV_LOG_WARNING, "pitch_delay_int %d is too large\n", pitch_delay_int[i]);
+                pitch_delay_int[i] = PITCH_DELAY_MAX;
+            }
+
+            if (frame_erasure) {
+                ctx->rand_value = g729_prng(ctx->rand_value);
+                fc_indexes   = av_mod_uintp2(ctx->rand_value, format->fc_indexes_bits);
+
+                ctx->rand_value = g729_prng(ctx->rand_value);
+                pulses_signs = ctx->rand_value;
+            }
+
+
+            memset(fc, 0, sizeof(int16_t) * SUBFRAME_SIZE);
+            switch (packet_type) {
+                case FORMAT_G729_8K:
+                    ff_acelp_fc_pulse_per_track(fc, ff_fc_4pulses_8bits_tracks_13,
+                                                ff_fc_4pulses_8bits_track_4,
+                                                fc_indexes, pulses_signs, 3, 3);
+                    break;
+                case FORMAT_G729D_6K4:
+                    ff_acelp_fc_pulse_per_track(fc, ff_fc_2pulses_9bits_track1_gray,
+                                                ff_fc_2pulses_9bits_track2_gray,
+                                                fc_indexes, pulses_signs, 1, 4);
+                    break;
+            }
+
             /*
-              This correction required to get bit-exact result with
-              reference code, because gain_corr_factor in G.729D is
-              two times larger than in original G.729.
+              This filter enhances harmonic components of the fixed-codebook vector to
+              improve the quality of the reconstructed speech.
 
-              If bit-exact result is not issue then gain_corr_factor
-              can be simpler divided by 2 before call to g729_get_gain_code
-              instead of using correction below.
+                         / fc_v[i],                                    i < pitch_delay
+              fc_v[i] = <
+                         \ fc_v[i] + gain_pitch * fc_v[i-pitch_delay], i >= pitch_delay
             */
-            if (packet_type == FORMAT_G729D_6K4) {
-                gain_corr_factor >>= 1;
-                ctx->past_gain_code[0] >>= 1;
+            if (SUBFRAME_SIZE > pitch_delay_int[i])
+                ff_acelp_weighted_vector_sum(fc + pitch_delay_int[i],
+                                             fc + pitch_delay_int[i],
+                                             fc, 1 << 14,
+                                             av_clip(ctx->past_gain_pitch[0], SHARP_MIN, SHARP_MAX),
+                                             0, 14,
+                                             SUBFRAME_SIZE - pitch_delay_int[i]);
+
+            memmove(ctx->past_gain_pitch+1, ctx->past_gain_pitch, 5 * sizeof(int16_t));
+            ctx->past_gain_code[1] = ctx->past_gain_code[0];
+
+            if (frame_erasure) {
+                ctx->past_gain_pitch[0] = (29491 * ctx->past_gain_pitch[0]) >> 15; // 0.90 (0.15)
+                ctx->past_gain_code[0]  = ( 2007 * ctx->past_gain_code[0] ) >> 11; // 0.98 (0.11)
+
+                gain_corr_factor = 0;
+            } else {
+                if (packet_type == FORMAT_G729D_6K4) {
+                    ctx->past_gain_pitch[0]  = cb_gain_1st_6k4[gc_1st_index][0] +
+                                               cb_gain_2nd_6k4[gc_2nd_index][0];
+                    gain_corr_factor = cb_gain_1st_6k4[gc_1st_index][1] +
+                                       cb_gain_2nd_6k4[gc_2nd_index][1];
+
+                    /* Without check below overflow can occur in ff_acelp_update_past_gain.
+                       It is not issue for G.729, because gain_corr_factor in it's case is always
+                       greater than 1024, while in G.729D it can be even zero. */
+                    gain_corr_factor = FFMAX(gain_corr_factor, 1024);
+    #ifndef G729_BITEXACT
+                    gain_corr_factor >>= 1;
+    #endif
+                } else {
+                    ctx->past_gain_pitch[0]  = cb_gain_1st_8k[gc_1st_index][0] +
+                                               cb_gain_2nd_8k[gc_2nd_index][0];
+                    gain_corr_factor = cb_gain_1st_8k[gc_1st_index][1] +
+                                       cb_gain_2nd_8k[gc_2nd_index][1];
+                }
+
+                /* Decode the fixed-codebook gain. */
+                ctx->past_gain_code[0] = ff_acelp_decode_gain_code(&s->adsp, gain_corr_factor,
+                                                                   fc, MR_ENERGY,
+                                                                   ctx->quant_energy,
+                                                                   ma_prediction_coeff,
+                                                                   SUBFRAME_SIZE, 4);
+    #ifdef G729_BITEXACT
+                /*
+                  This correction required to get bit-exact result with
+                  reference code, because gain_corr_factor in G.729D is
+                  two times larger than in original G.729.
+
+                  If bit-exact result is not issue then gain_corr_factor
+                  can be simpler divided by 2 before call to g729_get_gain_code
+                  instead of using correction below.
+                */
+                if (packet_type == FORMAT_G729D_6K4) {
+                    gain_corr_factor >>= 1;
+                    ctx->past_gain_code[0] >>= 1;
+                }
+    #endif
             }
-#endif
-        }
-        ff_acelp_update_past_gain(ctx->quant_energy, gain_corr_factor, 2, frame_erasure);
+            ff_acelp_update_past_gain(ctx->quant_energy, gain_corr_factor, 2, frame_erasure);
 
-        /* Routine requires rounding to lowest. */
-        ff_acelp_interpolate(ctx->exc + i * SUBFRAME_SIZE,
-                             ctx->exc + i * SUBFRAME_SIZE - pitch_delay_3x / 3,
-                             ff_acelp_interp_filter, 6,
-                             (pitch_delay_3x % 3) << 1,
-                             10, SUBFRAME_SIZE);
+            /* Routine requires rounding to lowest. */
+            ff_acelp_interpolate(ctx->exc + i * SUBFRAME_SIZE,
+                                 ctx->exc + i * SUBFRAME_SIZE - pitch_delay_3x / 3,
+                                 ff_acelp_interp_filter, 6,
+                                 (pitch_delay_3x % 3) << 1,
+                                 10, SUBFRAME_SIZE);
 
-        ff_acelp_weighted_vector_sum(ctx->exc + i * SUBFRAME_SIZE,
-                                     ctx->exc + i * SUBFRAME_SIZE, fc,
-                                     (!ctx->was_periodic && frame_erasure) ? 0 : ctx->past_gain_pitch[0],
-                                     ( ctx->was_periodic && frame_erasure) ? 0 : ctx->past_gain_code[0],
-                                     1 << 13, 14, SUBFRAME_SIZE);
+            ff_acelp_weighted_vector_sum(ctx->exc + i * SUBFRAME_SIZE,
+                                         ctx->exc + i * SUBFRAME_SIZE, fc,
+                                         (!ctx->was_periodic && frame_erasure) ? 0 : ctx->past_gain_pitch[0],
+                                         ( ctx->was_periodic && frame_erasure) ? 0 : ctx->past_gain_code[0],
+                                         1 << 13, 14, SUBFRAME_SIZE);
 
-        memcpy(synth, ctx->syn_filter_data, 10 * sizeof(int16_t));
+            memcpy(synth, ctx->syn_filter_data, 10 * sizeof(int16_t));
 
-        if (ff_celp_lp_synthesis_filter(
-            synth+10,
-            &lp[i][1],
-            ctx->exc  + i * SUBFRAME_SIZE,
-            SUBFRAME_SIZE,
-            10,
-            1,
-            0,
-            0x800))
-            /* Overflow occurred, downscale excitation signal... */
-            for (j = 0; j < 2 * SUBFRAME_SIZE + PITCH_DELAY_MAX + INTERPOL_LEN; j++)
-                ctx->exc_base[j] >>= 2;
-
-        /* ... and make synthesis again. */
-        if (packet_type == FORMAT_G729D_6K4) {
-            int16_t exc_new[SUBFRAME_SIZE];
-
-            ctx->onset = g729d_onset_decision(ctx->onset, ctx->past_gain_code);
-            ctx->voice_decision = g729d_voice_decision(ctx->onset, ctx->voice_decision, ctx->past_gain_pitch);
-
-            g729d_get_new_exc(exc_new, ctx->exc  + i * SUBFRAME_SIZE, fc, ctx->voice_decision, ctx->past_gain_code[0], SUBFRAME_SIZE);
-
-            ff_celp_lp_synthesis_filter(
-                    synth+10,
-                    &lp[i][1],
-                    exc_new,
-                    SUBFRAME_SIZE,
-                    10,
-                    0,
-                    0,
-                    0x800);
-        } else {
-            ff_celp_lp_synthesis_filter(
-                    synth+10,
-                    &lp[i][1],
-                    ctx->exc  + i * SUBFRAME_SIZE,
-                    SUBFRAME_SIZE,
-                    10,
-                    0,
-                    0,
-                    0x800);
-        }
-        /* Save data (without postfilter) for use in next subframe. */
-        memcpy(ctx->syn_filter_data, synth+SUBFRAME_SIZE, 10 * sizeof(int16_t));
-
-        /* Calculate gain of unfiltered signal for use in AGC. */
-        gain_before = 0;
-        for (j = 0; j < SUBFRAME_SIZE; j++)
-            gain_before += FFABS(synth[j+10]);
-
-        /* Call postfilter and also update voicing decision for use in next frame. */
-        ff_g729_postfilter(
-                &ctx->adsp,
-                &ctx->ht_prev_data,
-                &is_periodic,
-                &lp[i][0],
-                pitch_delay_int[0],
-                ctx->residual,
-                ctx->res_filter_data,
-                ctx->pos_filter_data,
+            if (ff_celp_lp_synthesis_filter(
                 synth+10,
-                SUBFRAME_SIZE);
-
-        /* Calculate gain of filtered signal for use in AGC. */
-        gain_after = 0;
-        for(j=0; j<SUBFRAME_SIZE; j++)
-            gain_after += FFABS(synth[j+10]);
-
-        ctx->gain_coeff = ff_g729_adaptive_gain_control(
-                gain_before,
-                gain_after,
-                synth+10,
+                &lp[i][1],
+                ctx->exc  + i * SUBFRAME_SIZE,
                 SUBFRAME_SIZE,
-                ctx->gain_coeff);
+                10,
+                1,
+                0,
+                0x800))
+                /* Overflow occurred, downscale excitation signal... */
+                for (j = 0; j < 2 * SUBFRAME_SIZE + PITCH_DELAY_MAX + INTERPOL_LEN; j++)
+                    ctx->exc_base[j] >>= 2;
 
-        if (frame_erasure)
-            ctx->pitch_delay_int_prev = FFMIN(ctx->pitch_delay_int_prev + 1, PITCH_DELAY_MAX);
-        else
-            ctx->pitch_delay_int_prev = pitch_delay_int[i];
+            /* ... and make synthesis again. */
+            if (packet_type == FORMAT_G729D_6K4) {
+                int16_t exc_new[SUBFRAME_SIZE];
 
-        memcpy(synth+8, ctx->hpf_z, 2*sizeof(int16_t));
-        ff_acelp_high_pass_filter(
-                out_frame + i*SUBFRAME_SIZE,
-                ctx->hpf_f,
-                synth+10,
-                SUBFRAME_SIZE);
-        memcpy(ctx->hpf_z, synth+8+SUBFRAME_SIZE, 2*sizeof(int16_t));
+                ctx->onset = g729d_onset_decision(ctx->onset, ctx->past_gain_code);
+                ctx->voice_decision = g729d_voice_decision(ctx->onset, ctx->voice_decision, ctx->past_gain_pitch);
+
+                g729d_get_new_exc(exc_new, ctx->exc  + i * SUBFRAME_SIZE, fc, ctx->voice_decision, ctx->past_gain_code[0], SUBFRAME_SIZE);
+
+                ff_celp_lp_synthesis_filter(
+                        synth+10,
+                        &lp[i][1],
+                        exc_new,
+                        SUBFRAME_SIZE,
+                        10,
+                        0,
+                        0,
+                        0x800);
+            } else {
+                ff_celp_lp_synthesis_filter(
+                        synth+10,
+                        &lp[i][1],
+                        ctx->exc  + i * SUBFRAME_SIZE,
+                        SUBFRAME_SIZE,
+                        10,
+                        0,
+                        0,
+                        0x800);
+            }
+            /* Save data (without postfilter) for use in next subframe. */
+            memcpy(ctx->syn_filter_data, synth+SUBFRAME_SIZE, 10 * sizeof(int16_t));
+
+            /* Calculate gain of unfiltered signal for use in AGC. */
+            gain_before = 0;
+            for (j = 0; j < SUBFRAME_SIZE; j++)
+                gain_before += FFABS(synth[j+10]);
+
+            /* Call postfilter and also update voicing decision for use in next frame. */
+            ff_g729_postfilter(
+                    &s->adsp,
+                    &ctx->ht_prev_data,
+                    &is_periodic,
+                    &lp[i][0],
+                    pitch_delay_int[0],
+                    ctx->residual,
+                    ctx->res_filter_data,
+                    ctx->pos_filter_data,
+                    synth+10,
+                    SUBFRAME_SIZE);
+
+            /* Calculate gain of filtered signal for use in AGC. */
+            gain_after = 0;
+            for (j = 0; j < SUBFRAME_SIZE; j++)
+                gain_after += FFABS(synth[j+10]);
+
+            ctx->gain_coeff = ff_g729_adaptive_gain_control(
+                    gain_before,
+                    gain_after,
+                    synth+10,
+                    SUBFRAME_SIZE,
+                    ctx->gain_coeff);
+
+            if (frame_erasure) {
+                ctx->pitch_delay_int_prev = FFMIN(ctx->pitch_delay_int_prev + 1, PITCH_DELAY_MAX);
+            } else {
+                ctx->pitch_delay_int_prev = pitch_delay_int[i];
+            }
+
+            memcpy(synth+8, ctx->hpf_z, 2*sizeof(int16_t));
+            ff_acelp_high_pass_filter(
+                    out_frame + i*SUBFRAME_SIZE,
+                    ctx->hpf_f,
+                    synth+10,
+                    SUBFRAME_SIZE);
+            memcpy(ctx->hpf_z, synth+8+SUBFRAME_SIZE, 2*sizeof(int16_t));
+        }
+
+        ctx->was_periodic = is_periodic;
+
+        /* Save signal for use in next frame. */
+        memmove(ctx->exc_base, ctx->exc_base + 2 * SUBFRAME_SIZE, (PITCH_DELAY_MAX+INTERPOL_LEN)*sizeof(int16_t));
+
+        buf += format->block_size;
+        ctx++;
     }
 
-    ctx->was_periodic = is_periodic;
-
-    /* Save signal for use in next frame. */
-    memmove(ctx->exc_base, ctx->exc_base + 2 * SUBFRAME_SIZE, (PITCH_DELAY_MAX+INTERPOL_LEN)*sizeof(int16_t));
-
     *got_frame_ptr = 1;
-    return packet_type == FORMAT_G729_8K ? 10 : 8;
+    return (format->block_size + (avctx->codec_id == AV_CODEC_ID_ACELP_KELVIN)) * avctx->channels;
+}
+
+static av_cold int decode_close(AVCodecContext *avctx)
+{
+    G729Context *s = avctx->priv_data;
+    av_freep(&s->channel_context);
+
+    return 0;
 }
 
 AVCodec ff_g729_decoder = {
@@ -714,5 +758,18 @@
     .priv_data_size = sizeof(G729Context),
     .init           = decoder_init,
     .decode         = decode_frame,
+    .close          = decode_close,
+    .capabilities   = AV_CODEC_CAP_SUBFRAMES | AV_CODEC_CAP_DR1,
+};
+
+AVCodec ff_acelp_kelvin_decoder = {
+    .name           = "acelp.kelvin",
+    .long_name      = NULL_IF_CONFIG_SMALL("Sipro ACELP.KELVIN"),
+    .type           = AVMEDIA_TYPE_AUDIO,
+    .id             = AV_CODEC_ID_ACELP_KELVIN,
+    .priv_data_size = sizeof(G729Context),
+    .init           = decoder_init,
+    .decode         = decode_frame,
+    .close          = decode_close,
     .capabilities   = AV_CODEC_CAP_SUBFRAMES | AV_CODEC_CAP_DR1,
 };
diff --git a/libavcodec/g729postfilter.c b/libavcodec/g729postfilter.c
index d9076ec..ab66859 100644
--- a/libavcodec/g729postfilter.c
+++ b/libavcodec/g729postfilter.c
@@ -156,7 +156,7 @@
             sig_scaled[i] = residual[i] >> shift;
     else
         for (i = 0; i < subframe_size + RES_PREV_DATA_SIZE; i++)
-            sig_scaled[i] = residual[i] << -shift;
+            sig_scaled[i] = (unsigned)residual[i] << -shift;
 
     /* Start of best delay searching code */
     gain_num = 0;
@@ -201,8 +201,8 @@
         }
         if (corr_int_num) {
             /* Compute denominator of pseudo-normalized correlation R'(0). */
-            corr_int_den = adsp->scalarproduct_int16(sig_scaled - best_delay_int + RES_PREV_DATA_SIZE,
-                                                    sig_scaled - best_delay_int + RES_PREV_DATA_SIZE,
+            corr_int_den = adsp->scalarproduct_int16(sig_scaled + RES_PREV_DATA_SIZE - best_delay_int,
+                                                     sig_scaled + RES_PREV_DATA_SIZE - best_delay_int,
                                                     subframe_size);
 
             /* Compute signals with non-integer delay k (with 1/8 precision),
@@ -346,7 +346,7 @@
         L_temp1 = gain_long_num * gain_long_num;
         L_temp1 = MULL(L_temp1, gain_den, FRAC_BITS);
 
-        tmp = ((sh_gain_long_num - sh_gain_num) << 1) - (sh_gain_long_den - sh_gain_den);
+        tmp = ((sh_gain_long_num - sh_gain_num) * 2) - (sh_gain_long_den - sh_gain_den);
         if (tmp > 0)
             L_temp0 >>= tmp;
         else
@@ -367,7 +367,7 @@
         /* Rescale selected signal to original value. */
         if (shift > 0)
             for (i = 0; i < subframe_size; i++)
-                selected_signal[i] <<= shift;
+                selected_signal[i] *= 1 << shift;
         else
             for (i = 0; i < subframe_size; i++)
                 selected_signal[i] >>= -shift;
@@ -464,7 +464,7 @@
             speech[i] = (speech[i] * temp + 0x4000) >> 15;
     }
 
-    return -(rh1 << 15) / rh0;
+    return -(rh1 * (1 << 15)) / rh0;
 }
 
 /**
@@ -486,29 +486,29 @@
 
     if (refl_coeff > 0) {
         gt = (refl_coeff * G729_TILT_FACTOR_PLUS + 0x4000) >> 15;
-        fact = 0x4000; // 0.5 in (0.15)
-        sh_fact = 15;
+        fact = 0x2000; // 0.5 in (0.15)
+        sh_fact = 14;
     } else {
         gt = (refl_coeff * G729_TILT_FACTOR_MINUS + 0x4000) >> 15;
-        fact = 0x800; // 0.5 in (3.12)
-        sh_fact = 12;
+        fact = 0x400; // 0.5 in (3.12)
+        sh_fact = 11;
     }
-    ga = (fact << 15) / av_clip_int16(32768 - FFABS(gt));
+    ga = (fact << 16) / av_clip_int16(32768 - FFABS(gt));
     gt >>= 1;
 
     /* Apply tilt compensation filter to signal. */
     tmp = res_pst[subframe_size - 1];
 
     for (i = subframe_size - 1; i >= 1; i--) {
-        tmp2 = (res_pst[i] << 15) + ((gt * res_pst[i-1]) << 1);
-        tmp2 = (tmp2 + 0x4000) >> 15;
+        tmp2 = (gt * res_pst[i-1]) * 2 + 0x4000;
+        tmp2 = res_pst[i] + (tmp2 >> 15);
 
-        tmp2 = (tmp2 * ga * 2 + fact) >> sh_fact;
+        tmp2 = (tmp2 * ga + fact) >> sh_fact;
         out[i] = tmp2;
     }
-    tmp2 = (res_pst[0] << 15) + ((gt * ht_prev_data) << 1);
-    tmp2 = (tmp2 + 0x4000) >> 15;
-    tmp2 = (tmp2 * ga * 2 + fact) >> sh_fact;
+    tmp2 = (gt * ht_prev_data) * 2 + 0x4000;
+    tmp2 = res_pst[0] + (tmp2 >> 15);
+    tmp2 = (tmp2 * ga + fact) >> sh_fact;
     out[0] = tmp2;
 
     return tmp;
diff --git a/libavcodec/gdv.c b/libavcodec/gdv.c
index 538bc38..f00f3ac 100644
--- a/libavcodec/gdv.c
+++ b/libavcodec/gdv.c
@@ -72,9 +72,64 @@
     return 0;
 }
 
+static void scaleup(uint8_t *dst, const uint8_t *src, int w)
+{
+    int x;
+    for (x = 0; x < w - 7; x+=8) {
+        dst[x + 0] =
+        dst[x + 1] = src[(x>>1) + 0];
+        dst[x + 2] =
+        dst[x + 3] = src[(x>>1) + 1];
+        dst[x + 4] =
+        dst[x + 5] = src[(x>>1) + 2];
+        dst[x + 6] =
+        dst[x + 7] = src[(x>>1) + 3];
+    }
+    for (; x < w; x++) {
+        dst[x] = src[(x>>1)];
+    }
+}
+
+static void scaleup_rev(uint8_t *dst, const uint8_t *src, int w)
+{
+    int x;
+
+    for (x = w - 1; (x+1) & 7; x--) {
+        dst[x] = src[(x>>1)];
+    }
+    for (x -= 7; x >= 0; x -= 8) {
+        dst[x + 6] =
+        dst[x + 7] = src[(x>>1) + 3];
+        dst[x + 4] =
+        dst[x + 5] = src[(x>>1) + 2];
+        dst[x + 2] =
+        dst[x + 3] = src[(x>>1) + 1];
+        dst[x + 0] =
+        dst[x + 1] = src[(x>>1) + 0];
+    }
+}
+
+static void scaledown(uint8_t *dst, const uint8_t *src, int w)
+{
+    int x;
+    for (x = 0; x < w - 7; x+=8) {
+        dst[x + 0] = src[2*x + 0];
+        dst[x + 1] = src[2*x + 2];
+        dst[x + 2] = src[2*x + 4];
+        dst[x + 3] = src[2*x + 6];
+        dst[x + 4] = src[2*x + 8];
+        dst[x + 5] = src[2*x +10];
+        dst[x + 6] = src[2*x +12];
+        dst[x + 7] = src[2*x +14];
+    }
+    for (; x < w; x++) {
+        dst[x] = src[2*x];
+    }
+}
+
 static void rescale(GDVContext *gdv, uint8_t *dst, int w, int h, int scale_v, int scale_h)
 {
-    int j, y, x;
+    int j, y;
 
     if ((gdv->scale_v == scale_v) && (gdv->scale_h == scale_h)) {
         return;
@@ -86,14 +141,7 @@
             uint8_t *dst1 = dst + PREAMBLE_SIZE + y * w;
             uint8_t *src1 = dst + PREAMBLE_SIZE + (y>>!!gdv->scale_h) * (w>>1);
 
-            for (x = w - 1; x >= 0 && !(x&1); x--) {
-                dst1[x] = src1[(x>>1)];
-            }
-
-            for (x--; x >= 0; x-=2) {
-                dst1[x  ] =
-                dst1[x+1] = src1[(x>>1)];
-            }
+            scaleup_rev(dst1, src1, w);
         }
     } else if (gdv->scale_h) {
         for (j = 0; j < h; j++) {
@@ -108,9 +156,7 @@
         for (y = 0; y < (h>>1); y++) {
             uint8_t *dst1 = dst + PREAMBLE_SIZE + y * (w>>1);
             uint8_t *src1 = dst + PREAMBLE_SIZE + y*2 * w;
-            for (x = 0; x < (w>>1); x++) {
-                dst1[x] = src1[x*2];
-            }
+            scaledown(dst1, src1, w>>1);
         }
     } else if (scale_h) {
         for (y = 0; y < (h>>1); y++) {
@@ -121,9 +167,7 @@
     } else if (scale_v) {
         for (y = 0; y < h; y++) {
             uint8_t *dst1 = dst + PREAMBLE_SIZE + y * w;
-            for (x = 0; x < (w>>1); x++) {
-                dst1[x] = dst1[x*2];
-            }
+            scaledown(dst1, dst1, w>>1);
         }
     }
 
@@ -250,6 +294,8 @@
 
     while (bytestream2_get_bytes_left_p(pb) > 0 && bytestream2_get_bytes_left(gb) > 0) {
         int tag = read_bits2(&bits, gb);
+        if (bytestream2_get_bytes_left(gb) < 1)
+            return AVERROR_INVALIDDATA;
         if (tag == 0) {
             bytestream2_put_byte(pb, bytestream2_get_byte(gb));
         } else if (tag == 1) {
@@ -262,7 +308,7 @@
             int len;
             int b = bytestream2_get_byte(gb);
             if (b == 0) {
-                break;
+                return 0;
             }
             if (b != 0xFF) {
                 len = b;
@@ -277,6 +323,8 @@
             lz_copy(pb, g2, off, len);
         }
     }
+    if (bytestream2_get_bytes_left_p(pb) > 0)
+        return AVERROR_INVALIDDATA;
     return 0;
 }
 
@@ -310,7 +358,8 @@
                     if (val != ((1 << lbits) - 1)) {
                         break;
                     }
-                    assert(lbits < 16);
+                    if (lbits >= 16)
+                        return AVERROR_INVALIDDATA;
                 }
                 for (i = 0; i < len; i++) {
                     bytestream2_put_byte(pb, bytestream2_get_byte(gb));
@@ -399,6 +448,9 @@
         }
     }
 
+    if (bytestream2_get_bytes_left_p(pb) > 0)
+        return AVERROR_INVALIDDATA;
+
     return 0;
 }
 
@@ -429,6 +481,8 @@
     if (pal && pal_size == AVPALETTE_SIZE)
         memcpy(gdv->pal, pal, AVPALETTE_SIZE);
 
+    if (compression < 2 && bytestream2_get_bytes_left(gb) < 256*3)
+        return AVERROR_INVALIDDATA;
     rescale(gdv, gdv->frame, avctx->width, avctx->height,
             !!(flags & 0x10), !!(flags & 0x20));
 
@@ -436,8 +490,6 @@
     case 1:
         memset(gdv->frame + PREAMBLE_SIZE, 0, gdv->frame_size - PREAMBLE_SIZE);
     case 0:
-        if (bytestream2_get_bytes_left(gb) < 256*3)
-            return AVERROR_INVALIDDATA;
         for (i = 0; i < 256; i++) {
             unsigned r = bytestream2_get_byte(gb);
             unsigned g = bytestream2_get_byte(gb);
@@ -470,30 +522,25 @@
 
     if (!gdv->scale_v && !gdv->scale_h) {
         int sidx = PREAMBLE_SIZE, didx = 0;
-        int y, x;
+        int y;
 
         for (y = 0; y < avctx->height; y++) {
-            for (x = 0; x < avctx->width; x++) {
-                dst[x+didx] = gdv->frame[x+sidx];
-            }
+            memcpy(dst + didx, gdv->frame + sidx, avctx->width);
             sidx += avctx->width;
             didx += frame->linesize[0];
         }
     } else {
         int sidx = PREAMBLE_SIZE, didx = 0;
-        int y, x;
+        int y;
 
         for (y = 0; y < avctx->height; y++) {
             if (!gdv->scale_v) {
                 memcpy(dst + didx, gdv->frame + sidx, avctx->width);
             } else {
-                for (x = 0; x < avctx->width - 1; x+=2) {
-                    dst[didx + x    ] =
-                    dst[didx + x + 1] = gdv->frame[sidx + (x>>1)];
-                }
-                for (; x < avctx->width; x++) {
-                    dst[didx + x] = gdv->frame[sidx + (x>>1)];
-                }
+                uint8_t *dst2 = dst + didx;
+                uint8_t *src2 = gdv->frame + sidx;
+
+                scaleup(dst2, src2, avctx->width);
             }
             if (!gdv->scale_h || ((y & 1) == 1)) {
                 sidx += !gdv->scale_v ? avctx->width : avctx->width/2;
diff --git a/libavcodec/get_bits.h b/libavcodec/get_bits.h
index 26a5b3e..66fb877 100644
--- a/libavcodec/get_bits.h
+++ b/libavcodec/get_bits.h
@@ -226,34 +226,32 @@
 }
 
 #if CACHED_BITSTREAM_READER
-static inline void refill_32(GetBitContext *s)
+static inline void refill_32(GetBitContext *s, int is_le)
 {
 #if !UNCHECKED_BITSTREAM_READER
     if (s->index >> 3 >= s->buffer_end - s->buffer)
         return;
 #endif
 
-#ifdef BITSTREAM_READER_LE
-    s->cache       = (uint64_t)AV_RL32(s->buffer + (s->index >> 3)) << s->bits_left | s->cache;
-#else
-    s->cache       = s->cache | (uint64_t)AV_RB32(s->buffer + (s->index >> 3)) << (32 - s->bits_left);
-#endif
+    if (is_le)
+        s->cache = (uint64_t)AV_RL32(s->buffer + (s->index >> 3)) << s->bits_left | s->cache;
+    else
+        s->cache = s->cache | (uint64_t)AV_RB32(s->buffer + (s->index >> 3)) << (32 - s->bits_left);
     s->index     += 32;
     s->bits_left += 32;
 }
 
-static inline void refill_64(GetBitContext *s)
+static inline void refill_64(GetBitContext *s, int is_le)
 {
 #if !UNCHECKED_BITSTREAM_READER
     if (s->index >> 3 >= s->buffer_end - s->buffer)
         return;
 #endif
 
-#ifdef BITSTREAM_READER_LE
-    s->cache = AV_RL64(s->buffer + (s->index >> 3));
-#else
-    s->cache = AV_RB64(s->buffer + (s->index >> 3));
-#endif
+    if (is_le)
+        s->cache = AV_RL64(s->buffer + (s->index >> 3));
+    else
+        s->cache = AV_RB64(s->buffer + (s->index >> 3));
     s->index += 64;
     s->bits_left = 64;
 }
@@ -380,12 +378,16 @@
  */
 static inline unsigned int get_bits(GetBitContext *s, int n)
 {
-    register int tmp;
+    register unsigned int tmp;
 #if CACHED_BITSTREAM_READER
 
     av_assert2(n>0 && n<=32);
     if (n > s->bits_left) {
-        refill_32(s);
+#ifdef BITSTREAM_READER_LE
+        refill_32(s, 1);
+#else
+        refill_32(s, 0);
+#endif
         if (s->bits_left < 32)
             s->bits_left = n;
     }
@@ -403,6 +405,7 @@
     LAST_SKIP_BITS(re, s, n);
     CLOSE_READER(re, s);
 #endif
+    av_assert2(tmp < UINT64_C(1) << n);
     return tmp;
 }
 
@@ -419,7 +422,7 @@
 #if CACHED_BITSTREAM_READER
     av_assert2(n>0 && n<=32);
     if (n > s->bits_left) {
-        refill_32(s);
+        refill_32(s, 1);
         if (s->bits_left < 32)
             s->bits_left = n;
     }
@@ -442,10 +445,14 @@
  */
 static inline unsigned int show_bits(GetBitContext *s, int n)
 {
-    register int tmp;
+    register unsigned int tmp;
 #if CACHED_BITSTREAM_READER
     if (n > s->bits_left)
-        refill_32(s);
+#ifdef BITSTREAM_READER_LE
+        refill_32(s, 1);
+#else
+        refill_32(s, 0);
+#endif
 
     tmp = show_val(s, n);
 #else
@@ -473,7 +480,11 @@
             n -= skip;
             s->index += skip;
         }
-        refill_64(s);
+#ifdef BITSTREAM_READER_LE
+        refill_64(s, 1);
+#else
+        refill_64(s, 0);
+#endif
         if (n)
             skip_remaining(s, n);
     }
@@ -488,7 +499,11 @@
 {
 #if CACHED_BITSTREAM_READER
     if (!s->bits_left)
-        refill_64(s);
+#ifdef BITSTREAM_READER_LE
+        refill_64(s, 1);
+#else
+        refill_64(s, 0);
+#endif
 
 #ifdef BITSTREAM_READER_LE
     return get_val(s, 1, 1);
@@ -604,16 +619,8 @@
     return bit;
 }
 
-/**
- * Initialize GetBitContext.
- * @param buffer bitstream buffer, must be AV_INPUT_BUFFER_PADDING_SIZE bytes
- *        larger than the actual read bits because some optimized bitstream
- *        readers read 32 or 64 bit at once and could read over the end
- * @param bit_size the size of the buffer in bits
- * @return 0 on success, AVERROR_INVALIDDATA if the buffer_size would overflow.
- */
-static inline int init_get_bits(GetBitContext *s, const uint8_t *buffer,
-                                int bit_size)
+static inline int init_get_bits_xe(GetBitContext *s, const uint8_t *buffer,
+                                   int bit_size, int is_le)
 {
     int buffer_size;
     int ret = 0;
@@ -633,7 +640,9 @@
     s->index              = 0;
 
 #if CACHED_BITSTREAM_READER
-    refill_64(s);
+    s->cache              = 0;
+    s->bits_left          = 0;
+    refill_64(s, is_le);
 #endif
 
     return ret;
@@ -644,6 +653,24 @@
  * @param buffer bitstream buffer, must be AV_INPUT_BUFFER_PADDING_SIZE bytes
  *        larger than the actual read bits because some optimized bitstream
  *        readers read 32 or 64 bit at once and could read over the end
+ * @param bit_size the size of the buffer in bits
+ * @return 0 on success, AVERROR_INVALIDDATA if the buffer_size would overflow.
+ */
+static inline int init_get_bits(GetBitContext *s, const uint8_t *buffer,
+                                int bit_size)
+{
+#ifdef BITSTREAM_READER_LE
+    return init_get_bits_xe(s, buffer, bit_size, 1);
+#else
+    return init_get_bits_xe(s, buffer, bit_size, 0);
+#endif
+}
+
+/**
+ * Initialize GetBitContext.
+ * @param buffer bitstream buffer, must be AV_INPUT_BUFFER_PADDING_SIZE bytes
+ *        larger than the actual read bits because some optimized bitstream
+ *        readers read 32 or 64 bit at once and could read over the end
  * @param byte_size the size of the buffer in bytes
  * @return 0 on success, AVERROR_INVALIDDATA if the buffer_size would overflow.
  */
@@ -655,6 +682,14 @@
     return init_get_bits(s, buffer, byte_size * 8);
 }
 
+static inline int init_get_bits8_le(GetBitContext *s, const uint8_t *buffer,
+                                    int byte_size)
+{
+    if (byte_size > INT_MAX / 8 || byte_size < 0)
+        byte_size = -1;
+    return init_get_bits_xe(s, buffer, byte_size * 8, 1);
+}
+
 static inline const uint8_t *align_get_bits(GetBitContext *s)
 {
     int n = -get_bits_count(s) & 7;
diff --git a/libavcodec/gif.c b/libavcodec/gif.c
index d9c99d5..e2242d0 100644
--- a/libavcodec/gif.c
+++ b/libavcodec/gif.c
@@ -2,6 +2,8 @@
  * Copyright (c) 2000 Fabrice Bellard
  * Copyright (c) 2002 Francois Revol
  * Copyright (c) 2006 Baptiste Coudurier
+ * Copyright (c) 2018 Bjorn Roche
+ * Copyright (c) 2018 Paul B Mahol
  *
  * first version by Francois Revol <revol@free.fr>
  *
@@ -39,6 +41,8 @@
 
 #include "put_bits.h"
 
+#define DEFAULT_TRANSPARENCY_INDEX 0x1f
+
 typedef struct GIFContext {
     const AVClass *class;
     LZWState *lzw;
@@ -46,10 +50,10 @@
     int buf_size;
     AVFrame *last_frame;
     int flags;
+    int image;
     uint32_t palette[AVPALETTE_COUNT];  ///< local reference palette for !pal8
     int palette_loaded;
     int transparent_index;
-    uint8_t *pal_exdata;
     uint8_t *tmpl;                      ///< temporary line buffer
 } GIFContext;
 
@@ -58,6 +62,45 @@
     GF_TRANSDIFF  = 1<<1,
 };
 
+static int is_image_translucent(AVCodecContext *avctx,
+                                const uint8_t *buf, const int linesize)
+{
+    GIFContext *s = avctx->priv_data;
+    int trans = s->transparent_index;
+
+    if (trans < 0)
+        return 0;
+
+    for (int y = 0; y < avctx->height; y++) {
+        for (int x = 0; x < avctx->width; x++) {
+            if (buf[x] == trans) {
+                return 1;
+            }
+        }
+        buf += linesize;
+    }
+
+    return 0;
+}
+
+static int get_palette_transparency_index(const uint32_t *palette)
+{
+    int transparent_color_index = -1;
+    unsigned i, smallest_alpha = 0xff;
+
+    if (!palette)
+        return -1;
+
+    for (i = 0; i < AVPALETTE_COUNT; i++) {
+        const uint32_t v = palette[i];
+        if (v >> 24 < smallest_alpha) {
+            smallest_alpha = v >> 24;
+            transparent_color_index = i;
+        }
+    }
+    return smallest_alpha < 128 ? transparent_color_index : -1;
+}
+
 static int pick_palette_entry(const uint8_t *buf, int linesize, int w, int h)
 {
     int histogram[AVPALETTE_COUNT] = {0};
@@ -74,17 +117,91 @@
     return -1;
 }
 
-static int gif_image_write_image(AVCodecContext *avctx,
-                                 uint8_t **bytestream, uint8_t *end,
-                                 const uint32_t *palette,
+static void gif_crop_translucent(AVCodecContext *avctx,
                                  const uint8_t *buf, const int linesize,
-                                 AVPacket *pkt)
+                                 int *width, int *height,
+                                 int *x_start, int *y_start)
 {
     GIFContext *s = avctx->priv_data;
-    int len = 0, height = avctx->height, width = avctx->width, x, y;
-    int x_start = 0, y_start = 0, trans = s->transparent_index;
-    int honor_transparency = (s->flags & GF_TRANSDIFF) && s->last_frame && !palette;
-    const uint8_t *ptr;
+    int trans = s->transparent_index;
+
+    /* Crop image */
+    if ((s->flags & GF_OFFSETTING) && trans >= 0) {
+        const int w = avctx->width;
+        const int h = avctx->height;
+        int x_end = w - 1,
+            y_end = h - 1;
+
+        // crop top
+        while (*y_start < y_end) {
+            int is_trans = 1;
+            for (int i = 0; i < w; i++) {
+                if (buf[linesize * *y_start + i] != trans) {
+                    is_trans = 0;
+                    break;
+                }
+            }
+
+            if (!is_trans)
+                break;
+            (*y_start)++;
+        }
+
+        // crop bottom
+        while (y_end > *y_start) {
+            int is_trans = 1;
+            for (int i = 0; i < w; i++) {
+                if (buf[linesize * y_end + i] != trans) {
+                    is_trans = 0;
+                    break;
+                }
+            }
+            if (!is_trans)
+                break;
+            y_end--;
+        }
+
+        // crop left
+        while (*x_start < x_end) {
+            int is_trans = 1;
+            for (int i = *y_start; i < y_end; i++) {
+                if (buf[linesize * i + *x_start] != trans) {
+                    is_trans = 0;
+                    break;
+                }
+            }
+            if (!is_trans)
+                break;
+            (*x_start)++;
+        }
+
+        // crop right
+        while (x_end > *x_start) {
+            int is_trans = 1;
+            for (int i = *y_start; i < y_end; i++) {
+                if (buf[linesize * i + x_end] != trans) {
+                    is_trans = 0;
+                    break;
+                }
+            }
+            if (!is_trans)
+                break;
+            x_end--;
+        }
+
+        *height = y_end + 1 - *y_start;
+        *width  = x_end + 1 - *x_start;
+        av_log(avctx, AV_LOG_DEBUG,"%dx%d image at pos (%d;%d) [area:%dx%d]\n",
+               *width, *height, *x_start, *y_start, avctx->width, avctx->height);
+    }
+}
+
+static void gif_crop_opaque(AVCodecContext *avctx,
+                            const uint32_t *palette,
+                            const uint8_t *buf, const int linesize,
+                            int *width, int *height, int *x_start, int *y_start)
+{
+    GIFContext *s = avctx->priv_data;
 
     /* Crop image */
     if ((s->flags & GF_OFFSETTING) && s->last_frame && !palette) {
@@ -94,34 +211,34 @@
             y_end = avctx->height - 1;
 
         /* skip common lines */
-        while (y_start < y_end) {
-            if (memcmp(ref + y_start*ref_linesize, buf + y_start*linesize, width))
+        while (*y_start < y_end) {
+            if (memcmp(ref + *y_start*ref_linesize, buf + *y_start*linesize, *width))
                 break;
-            y_start++;
+            (*y_start)++;
         }
-        while (y_end > y_start) {
-            if (memcmp(ref + y_end*ref_linesize, buf + y_end*linesize, width))
+        while (y_end > *y_start) {
+            if (memcmp(ref + y_end*ref_linesize, buf + y_end*linesize, *width))
                 break;
             y_end--;
         }
-        height = y_end + 1 - y_start;
+        *height = y_end + 1 - *y_start;
 
         /* skip common columns */
-        while (x_start < x_end) {
+        while (*x_start < x_end) {
             int same_column = 1;
-            for (y = y_start; y <= y_end; y++) {
-                if (ref[y*ref_linesize + x_start] != buf[y*linesize + x_start]) {
+            for (int y = *y_start; y <= y_end; y++) {
+                if (ref[y*ref_linesize + *x_start] != buf[y*linesize + *x_start]) {
                     same_column = 0;
                     break;
                 }
             }
             if (!same_column)
                 break;
-            x_start++;
+            (*x_start)++;
         }
-        while (x_end > x_start) {
+        while (x_end > *x_start) {
             int same_column = 1;
-            for (y = y_start; y <= y_end; y++) {
+            for (int y = *y_start; y <= y_end; y++) {
                 if (ref[y*ref_linesize + x_end] != buf[y*linesize + x_end]) {
                     same_column = 0;
                     break;
@@ -131,11 +248,80 @@
                 break;
             x_end--;
         }
-        width = x_end + 1 - x_start;
+        *width = x_end + 1 - *x_start;
 
         av_log(avctx, AV_LOG_DEBUG,"%dx%d image at pos (%d;%d) [area:%dx%d]\n",
-               width, height, x_start, y_start, avctx->width, avctx->height);
+               *width, *height, *x_start, *y_start, avctx->width, avctx->height);
     }
+}
+
+static int gif_image_write_image(AVCodecContext *avctx,
+                                 uint8_t **bytestream, uint8_t *end,
+                                 const uint32_t *palette,
+                                 const uint8_t *buf, const int linesize,
+                                 AVPacket *pkt)
+{
+    GIFContext *s = avctx->priv_data;
+    int disposal, len = 0, height = avctx->height, width = avctx->width, x, y;
+    int x_start = 0, y_start = 0, trans = s->transparent_index;
+    int bcid = -1, honor_transparency = (s->flags & GF_TRANSDIFF) && s->last_frame && !palette;
+    const uint8_t *ptr;
+
+    if (!s->image && avctx->frame_number && is_image_translucent(avctx, buf, linesize)) {
+        gif_crop_translucent(avctx, buf, linesize, &width, &height, &x_start, &y_start);
+        honor_transparency = 0;
+        disposal = GCE_DISPOSAL_BACKGROUND;
+    } else {
+        gif_crop_opaque(avctx, palette, buf, linesize, &width, &height, &x_start, &y_start);
+        disposal = GCE_DISPOSAL_INPLACE;
+    }
+
+    if (s->image || !avctx->frame_number) { /* GIF header */
+        const uint32_t *global_palette = palette ? palette : s->palette;
+        const AVRational sar = avctx->sample_aspect_ratio;
+        int64_t aspect = 0;
+
+        if (sar.num > 0 && sar.den > 0) {
+            aspect = sar.num * 64LL / sar.den - 15;
+            if (aspect < 0 || aspect > 255)
+                aspect = 0;
+        }
+
+        bytestream_put_buffer(bytestream, gif89a_sig, sizeof(gif89a_sig));
+        bytestream_put_le16(bytestream, avctx->width);
+        bytestream_put_le16(bytestream, avctx->height);
+
+        bcid = get_palette_transparency_index(global_palette);
+
+        bytestream_put_byte(bytestream, 0xf7); /* flags: global clut, 256 entries */
+        bytestream_put_byte(bytestream, bcid < 0 ? DEFAULT_TRANSPARENCY_INDEX : bcid); /* background color index */
+        bytestream_put_byte(bytestream, aspect);
+        for (int i = 0; i < 256; i++) {
+            const uint32_t v = global_palette[i] & 0xffffff;
+            bytestream_put_be24(bytestream, v);
+        }
+    }
+
+    if (honor_transparency && trans < 0) {
+        trans = pick_palette_entry(buf + y_start*linesize + x_start,
+                                   linesize, width, height);
+        if (trans < 0) // TODO, patch welcome
+            av_log(avctx, AV_LOG_DEBUG, "No available color, can not use transparency\n");
+    }
+
+    if (trans < 0)
+        honor_transparency = 0;
+
+    bcid = honor_transparency || disposal == GCE_DISPOSAL_BACKGROUND ? trans : get_palette_transparency_index(palette);
+
+    /* graphic control extension */
+    bytestream_put_byte(bytestream, GIF_EXTENSION_INTRODUCER);
+    bytestream_put_byte(bytestream, GIF_GCE_EXT_LABEL);
+    bytestream_put_byte(bytestream, 0x04); /* block size */
+    bytestream_put_byte(bytestream, disposal<<2 | (bcid >= 0));
+    bytestream_put_le16(bytestream, 5); // default delay
+    bytestream_put_byte(bytestream, bcid < 0 ? DEFAULT_TRANSPARENCY_INDEX : bcid);
+    bytestream_put_byte(bytestream, 0x00);
 
     /* image block */
     bytestream_put_byte(bytestream, GIF_IMAGE_SEPARATOR);
@@ -155,24 +341,6 @@
         }
     }
 
-    if (honor_transparency && trans < 0) {
-        trans = pick_palette_entry(buf + y_start*linesize + x_start,
-                                   linesize, width, height);
-        if (trans < 0) { // TODO, patch welcome
-            av_log(avctx, AV_LOG_DEBUG, "No available color, can not use transparency\n");
-        } else {
-            uint8_t *pal_exdata = s->pal_exdata;
-            if (!pal_exdata)
-                pal_exdata = av_packet_new_side_data(pkt, AV_PKT_DATA_PALETTE, AVPALETTE_SIZE);
-            if (!pal_exdata)
-                return AVERROR(ENOMEM);
-            memcpy(pal_exdata, s->palette, AVPALETTE_SIZE);
-            pal_exdata[trans*4 + 3*!HAVE_BIGENDIAN] = 0x00;
-        }
-    }
-    if (trans < 0)
-        honor_transparency = 0;
-
     bytestream_put_byte(bytestream, 0x08);
 
     ff_lzw_encode_init(s->lzw, s->buf, s->buf_size,
@@ -222,12 +390,6 @@
         av_log(avctx, AV_LOG_ERROR, "GIF does not support resolutions above 65535x65535\n");
         return AVERROR(EINVAL);
     }
-#if FF_API_CODED_FRAME
-FF_DISABLE_DEPRECATION_WARNINGS
-    avctx->coded_frame->pict_type = AV_PICTURE_TYPE_I;
-    avctx->coded_frame->key_frame = 1;
-FF_ENABLE_DEPRECATION_WARNINGS
-#endif
 
     s->transparent_index = -1;
 
@@ -244,25 +406,6 @@
     return 0;
 }
 
-/* FIXME: duplicated with lavc */
-static int get_palette_transparency_index(const uint32_t *palette)
-{
-    int transparent_color_index = -1;
-    unsigned i, smallest_alpha = 0xff;
-
-    if (!palette)
-        return -1;
-
-    for (i = 0; i < AVPALETTE_COUNT; i++) {
-        const uint32_t v = palette[i];
-        if (v >> 24 < smallest_alpha) {
-            smallest_alpha = v >> 24;
-            transparent_color_index = i;
-        }
-    }
-    return smallest_alpha < 128 ? transparent_color_index : -1;
-}
-
 static int gif_encode_frame(AVCodecContext *avctx, AVPacket *pkt,
                             const AVFrame *pict, int *got_packet)
 {
@@ -277,22 +420,12 @@
     end        = pkt->data + pkt->size;
 
     if (avctx->pix_fmt == AV_PIX_FMT_PAL8) {
-        uint8_t *pal_exdata = av_packet_new_side_data(pkt, AV_PKT_DATA_PALETTE, AVPALETTE_SIZE);
-        if (!pal_exdata)
-            return AVERROR(ENOMEM);
-        memcpy(pal_exdata, pict->data[1], AVPALETTE_SIZE);
         palette = (uint32_t*)pict->data[1];
 
-        s->pal_exdata = pal_exdata;
-
-        /* The first palette with PAL8 will be used as generic palette by the
-         * muxer so we don't need to write it locally in the packet. We store
-         * it as a reference here in case it changes later. */
         if (!s->palette_loaded) {
             memcpy(s->palette, palette, AVPALETTE_SIZE);
             s->transparent_index = get_palette_transparency_index(palette);
             s->palette_loaded = 1;
-            palette = NULL;
         } else if (!memcmp(s->palette, palette, AVPALETTE_SIZE)) {
             palette = NULL;
         }
@@ -300,18 +433,22 @@
 
     gif_image_write_image(avctx, &outbuf_ptr, end, palette,
                           pict->data[0], pict->linesize[0], pkt);
-    if (!s->last_frame) {
+    if (!s->last_frame && !s->image) {
         s->last_frame = av_frame_alloc();
         if (!s->last_frame)
             return AVERROR(ENOMEM);
     }
-    av_frame_unref(s->last_frame);
-    ret = av_frame_ref(s->last_frame, (AVFrame*)pict);
-    if (ret < 0)
-        return ret;
+
+    if (!s->image) {
+        av_frame_unref(s->last_frame);
+        ret = av_frame_ref(s->last_frame, (AVFrame*)pict);
+        if (ret < 0)
+            return ret;
+    }
 
     pkt->size   = outbuf_ptr - pkt->data;
-    pkt->flags |= AV_PKT_FLAG_KEY;
+    if (s->image || !avctx->frame_number)
+        pkt->flags |= AV_PKT_FLAG_KEY;
     *got_packet = 1;
 
     return 0;
@@ -335,6 +472,7 @@
     { "gifflags", "set GIF flags", OFFSET(flags), AV_OPT_TYPE_FLAGS, {.i64 = GF_OFFSETTING|GF_TRANSDIFF}, 0, INT_MAX, FLAGS, "flags" },
         { "offsetting", "enable picture offsetting", 0, AV_OPT_TYPE_CONST, {.i64=GF_OFFSETTING}, INT_MIN, INT_MAX, FLAGS, "flags" },
         { "transdiff", "enable transparency detection between frames", 0, AV_OPT_TYPE_CONST, {.i64=GF_TRANSDIFF}, INT_MIN, INT_MAX, FLAGS, "flags" },
+    { "gifimage", "enable encoding only images per frame", OFFSET(image), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS },
     { NULL }
 };
 
diff --git a/libavcodec/gif.h b/libavcodec/gif.h
index 9f35778..7fb6149 100644
--- a/libavcodec/gif.h
+++ b/libavcodec/gif.h
@@ -43,6 +43,7 @@
 #define GIF_EXTENSION_INTRODUCER    0x21
 #define GIF_IMAGE_SEPARATOR         0x2c
 #define GIF_GCE_EXT_LABEL           0xf9
+#define GIF_COM_EXT_LABEL           0xfe
 #define GIF_APP_EXT_LABEL           0xff
 #define NETSCAPE_EXT_STR            "NETSCAPE2.0"
 
diff --git a/libavcodec/gif_parser.c b/libavcodec/gif_parser.c
new file mode 100644
index 0000000..e88338f
--- /dev/null
+++ b/libavcodec/gif_parser.c
@@ -0,0 +1,188 @@
+/*
+ * GIF parser
+ * Copyright (c) 2018 Paul B Mahol
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file
+ * GIF parser
+ */
+
+#include "libavutil/avassert.h"
+#include "libavutil/bswap.h"
+#include "libavutil/common.h"
+
+#include "gif.h"
+#include "parser.h"
+
+typedef enum GIFParseStates {
+    GIF_HEADER = 1,
+    GIF_EXTENSION,
+    GIF_EXTENSION_BLOCK,
+    GIF_IMAGE,
+    GIF_IMAGE_BLOCK,
+} gif_states;
+
+typedef struct GIFParseContext {
+    ParseContext pc;
+    unsigned found_sig;
+    int found_start;
+    int found_end;
+    int index;
+    int state;
+    int gct_flag;
+    int gct_size;
+    int block_size;
+    int etype;
+    int delay;
+} GIFParseContext;
+
+static int gif_find_frame_end(GIFParseContext *g, const uint8_t *buf,
+                              int buf_size, void *logctx)
+{
+    int index, next = END_NOT_FOUND;
+
+    for (index = 0; index < buf_size; index++) {
+        if (!g->state) {
+            if (!memcmp(buf + index, gif87a_sig, 6) ||
+                !memcmp(buf + index, gif89a_sig, 6)) {
+                g->state = GIF_HEADER;
+                g->found_sig++;
+            } else if (buf[index] == GIF_EXTENSION_INTRODUCER) {
+                g->state = GIF_EXTENSION;
+                g->found_start = 1;
+            } else if (buf[index] == GIF_IMAGE_SEPARATOR) {
+                g->state = GIF_IMAGE;
+            } else if (buf[index] == GIF_TRAILER) {
+                g->state = 0;
+                g->found_end = 1;
+                g->found_sig = 0;
+            } else {
+                g->found_sig = 0;
+            }
+        }
+
+        if (g->state == GIF_HEADER) {
+            if (g->index == 10) {
+                g->gct_flag = !!(buf[index] & 0x80);
+                g->gct_size = 3 * (1 << ((buf[index] & 0x07) + 1));
+            }
+            if (g->index >= 12 + g->gct_flag * g->gct_size) {
+                g->state = 0;
+                g->index = 0;
+                g->gct_flag = 0;
+                g->gct_size = 0;
+                continue;
+            }
+            g->index++;
+        } else if (g->state == GIF_EXTENSION) {
+            if (g->found_start && g->found_end && g->found_sig) {
+                next = index;
+                g->found_start = 0;
+                g->found_end = 0;
+                g->index = 0;
+                g->gct_flag = 0;
+                g->gct_size = 0;
+                g->state = 0;
+                break;
+            }
+            if (g->index == 1) {
+                g->etype = buf[index];
+            }
+            if (g->index >= 2) {
+                g->block_size = buf[index];
+                g->index = 0;
+                g->state = GIF_EXTENSION_BLOCK;
+                continue;
+            }
+            g->index++;
+        } else if (g->state == GIF_IMAGE_BLOCK) {
+            if (!g->index)
+                g->block_size = buf[index];
+            if (g->index >= g->block_size) {
+                g->index = 0;
+                if (!g->block_size) {
+                    g->state = 0;
+                    g->found_end = 1;
+                }
+                continue;
+            }
+            g->index++;
+        } else if (g->state == GIF_EXTENSION_BLOCK) {
+            if (g->etype == GIF_GCE_EXT_LABEL) {
+                if (g->index == 0)
+                    g->delay = 0;
+                if (g->index >= 1 && g->index <= 2) {
+                    g->delay |= buf[index] << (8 * (g->index - 1));
+                }
+            }
+            if (g->index >= g->block_size) {
+                g->block_size = buf[index];
+                g->index = 0;
+                if (!g->block_size)
+                    g->state = 0;
+                continue;
+            }
+            g->index++;
+        } else if (g->state == GIF_IMAGE) {
+            if (g->index == 8) {
+                g->gct_flag = !!(buf[index] & 0x80);
+                g->gct_size = 3 * (1 << ((buf[index] & 0x07) + 1));
+            }
+            if (g->index >= 10 + g->gct_flag * g->gct_size) {
+                g->state = GIF_IMAGE_BLOCK;
+                g->index = 0;
+                g->gct_flag = 0;
+                g->gct_size = 0;
+                continue;
+            }
+            g->index++;
+        }
+    }
+
+    return next;
+}
+
+static int gif_parse(AVCodecParserContext *s, AVCodecContext *avctx,
+                     const uint8_t **poutbuf, int *poutbuf_size,
+                     const uint8_t *buf, int buf_size)
+{
+    GIFParseContext *g = s->priv_data;
+    int next;
+
+    next = gif_find_frame_end(g, buf, buf_size, avctx);
+    if (ff_combine_frame(&g->pc, next, &buf, &buf_size) < 0) {
+        *poutbuf      = NULL;
+        *poutbuf_size = 0;
+        return buf_size;
+    }
+
+    s->duration   = g->delay;
+
+    *poutbuf      = buf;
+    *poutbuf_size = buf_size;
+    return next;
+}
+
+AVCodecParser ff_gif_parser = {
+    .codec_ids      = { AV_CODEC_ID_GIF },
+    .priv_data_size = sizeof(GIFParseContext),
+    .parser_parse   = gif_parse,
+    .parser_close   = ff_parse_close,
+};
diff --git a/libavcodec/gifdec.c b/libavcodec/gifdec.c
index 54f1d4c..1906a4c 100644
--- a/libavcodec/gifdec.c
+++ b/libavcodec/gifdec.c
@@ -179,12 +179,20 @@
     }
 
     /* verify that all the image is inside the screen dimensions */
-    if (!width || width > s->screen_width || left >= s->screen_width) {
-        av_log(s->avctx, AV_LOG_ERROR, "Invalid image width.\n");
+    if (!width || width > s->screen_width) {
+        av_log(s->avctx, AV_LOG_WARNING, "Invalid image width: %d, truncating.\n", width);
+        width = s->screen_width;
+    }
+    if (left >= s->screen_width) {
+        av_log(s->avctx, AV_LOG_ERROR, "Invalid left position: %d.\n", left);
         return AVERROR_INVALIDDATA;
     }
-    if (!height || height > s->screen_height || top >= s->screen_height) {
-        av_log(s->avctx, AV_LOG_ERROR, "Invalid image height.\n");
+    if (!height || height > s->screen_height) {
+        av_log(s->avctx, AV_LOG_WARNING, "Invalid image height: %d, truncating.\n", height);
+        height = s->screen_height;
+    }
+    if (top >= s->screen_height) {
+        av_log(s->avctx, AV_LOG_ERROR, "Invalid top position: %d.\n", top);
         return AVERROR_INVALIDDATA;
     }
     if (left + width > s->screen_width) {
@@ -505,7 +513,7 @@
             return AVERROR_INVALIDDATA;
         }
 
-        if ((ret = ff_reget_buffer(avctx, s->frame)) < 0)
+        if ((ret = ff_reget_buffer(avctx, s->frame, 0)) < 0)
             return ret;
 
         s->frame->pict_type = AV_PICTURE_TYPE_P;
diff --git a/libavcodec/golomb.h b/libavcodec/golomb.h
index 5c25883..7fd46a9 100644
--- a/libavcodec/golomb.h
+++ b/libavcodec/golomb.h
@@ -49,6 +49,8 @@
 
 /**
  * Read an unsigned Exp-Golomb code in the range 0 to 8190.
+ *
+ * @returns the read value or a negative error code.
  */
 static inline int get_ue_golomb(GetBitContext *gb)
 {
@@ -311,7 +313,7 @@
     } else {
         int log;
         skip_bits(gb, 8);
-        buf |= 1 | show_bits_long(gb, 24);
+        buf |= 1 | show_bits(gb, 24);
 
         if ((buf & 0xAAAAAAAA) == 0)
             return INVALID_VLC;
@@ -476,15 +478,19 @@
         return buf;
     } else {
         int i;
-        for (i = 0; i < limit && SHOW_UBITS(re, gb, 1) == 0; i++) {
+        for (i = 0; i + MIN_CACHE_BITS <= limit && SHOW_UBITS(re, gb, MIN_CACHE_BITS) == 0; i += MIN_CACHE_BITS) {
             if (gb->size_in_bits <= re_index) {
                 CLOSE_READER(re, gb);
                 return -1;
             }
-            LAST_SKIP_BITS(re, gb, 1);
+            LAST_SKIP_BITS(re, gb, MIN_CACHE_BITS);
             UPDATE_CACHE(re, gb);
         }
-        SKIP_BITS(re, gb, 1);
+        for (; i < limit && SHOW_UBITS(re, gb, 1) == 0; i++) {
+            SKIP_BITS(re, gb, 1);
+        }
+        LAST_SKIP_BITS(re, gb, 1);
+        UPDATE_CACHE(re, gb);
 
         if (i < limit - 1) {
             if (k) {
diff --git a/libavcodec/h263dec.c b/libavcodec/h263dec.c
index 2cf01e3..8ee844e 100644
--- a/libavcodec/h263dec.c
+++ b/libavcodec/h263dec.c
@@ -500,9 +500,9 @@
             GetBitContext gb;
 
             if (init_get_bits8(&gb, s->avctx->extradata, s->avctx->extradata_size) >= 0 )
-                ff_mpeg4_decode_picture_header(avctx->priv_data, &gb);
+                ff_mpeg4_decode_picture_header(avctx->priv_data, &gb, 1);
         }
-        ret = ff_mpeg4_decode_picture_header(avctx->priv_data, &s->gb);
+        ret = ff_mpeg4_decode_picture_header(avctx->priv_data, &s->gb, 0);
     } else if (CONFIG_H263I_DECODER && s->codec_id == AV_CODEC_ID_H263I) {
         ret = ff_intel_h263_decode_picture_header(s);
     } else if (CONFIG_FLV_DECODER && s->h263_flv) {
@@ -614,7 +614,7 @@
     if ((ret = ff_mpv_frame_start(s, avctx)) < 0)
         return ret;
 
-    if (!s->divx_packed)
+    if (!s->divx_packed && !avctx->hwaccel)
         ff_thread_finish_setup(avctx);
 
     if (avctx->hwaccel) {
@@ -743,6 +743,22 @@
     AV_PIX_FMT_NONE
 };
 
+const AVCodecHWConfigInternal *ff_h263_hw_config_list[] = {
+#if CONFIG_H263_VAAPI_HWACCEL
+    HWACCEL_VAAPI(h263),
+#endif
+#if CONFIG_MPEG4_NVDEC_HWACCEL
+    HWACCEL_NVDEC(mpeg4),
+#endif
+#if CONFIG_MPEG4_VDPAU_HWACCEL
+    HWACCEL_VDPAU(mpeg4),
+#endif
+#if CONFIG_H263_VIDEOTOOLBOX_HWACCEL
+    HWACCEL_VIDEOTOOLBOX(h263),
+#endif
+    NULL
+};
+
 AVCodec ff_h263_decoder = {
     .name           = "h263",
     .long_name      = NULL_IF_CONFIG_SMALL("H.263 / H.263-1996, H.263+ / H.263-1998 / H.263 version 2"),
@@ -758,6 +774,7 @@
     .flush          = ff_mpeg_flush,
     .max_lowres     = 3,
     .pix_fmts       = ff_h263_hwaccel_pixfmt_list_420,
+    .hw_configs     = ff_h263_hw_config_list,
 };
 
 AVCodec ff_h263p_decoder = {
@@ -775,16 +792,5 @@
     .flush          = ff_mpeg_flush,
     .max_lowres     = 3,
     .pix_fmts       = ff_h263_hwaccel_pixfmt_list_420,
-    .hw_configs     = (const AVCodecHWConfigInternal*[]) {
-#if CONFIG_H263_VAAPI_HWACCEL
-                        HWACCEL_VAAPI(h263),
-#endif
-#if CONFIG_MPEG4_VDPAU_HWACCEL
-                        HWACCEL_VDPAU(mpeg4),
-#endif
-#if CONFIG_H263_VIDEOTOOLBOX_HWACCEL
-                        HWACCEL_VIDEOTOOLBOX(h263),
-#endif
-                        NULL
-                    },
+    .hw_configs     = ff_h263_hw_config_list,
 };
diff --git a/libavcodec/h2645_parse.c b/libavcodec/h2645_parse.c
index aaa4b8f..2e03871 100644
--- a/libavcodec/h2645_parse.c
+++ b/libavcodec/h2645_parse.c
@@ -169,8 +169,8 @@
     "IDR_W_RADL", // HEVC_NAL_IDR_W_RADL
     "IDR_N_LP", // HEVC_NAL_IDR_N_LP
     "CRA_NUT", // HEVC_NAL_CRA_NUT
-    "IRAP_IRAP_VCL22", // HEVC_NAL_IRAP_VCL22
-    "IRAP_IRAP_VCL23", // HEVC_NAL_IRAP_VCL23
+    "RSV_IRAP_VCL22", // HEVC_NAL_RSV_IRAP_VCL22
+    "RSV_IRAP_VCL23", // HEVC_NAL_RSV_IRAP_VCL23
     "RSV_VCL24", // HEVC_NAL_RSV_VCL24
     "RSV_VCL25", // HEVC_NAL_RSV_VCL25
     "RSV_VCL26", // HEVC_NAL_RSV_VCL26
@@ -292,23 +292,22 @@
 static int hevc_parse_nal_header(H2645NAL *nal, void *logctx)
 {
     GetBitContext *gb = &nal->gb;
-    int nuh_layer_id;
 
     if (get_bits1(gb) != 0)
         return AVERROR_INVALIDDATA;
 
     nal->type = get_bits(gb, 6);
 
-    nuh_layer_id   = get_bits(gb, 6);
+    nal->nuh_layer_id = get_bits(gb, 6);
     nal->temporal_id = get_bits(gb, 3) - 1;
     if (nal->temporal_id < 0)
         return AVERROR_INVALIDDATA;
 
     av_log(logctx, AV_LOG_DEBUG,
            "nal_unit_type: %d(%s), nuh_layer_id: %d, temporal_id: %d\n",
-           nal->type, hevc_nal_unit_name(nal->type), nuh_layer_id, nal->temporal_id);
+           nal->type, hevc_nal_unit_name(nal->type), nal->nuh_layer_id, nal->temporal_id);
 
-    return nuh_layer_id == 0;
+    return 1;
 }
 
 static int h264_parse_nal_header(H2645NAL *nal, void *logctx)
@@ -343,9 +342,56 @@
     return i + 3;
 }
 
+static void alloc_rbsp_buffer(H2645RBSP *rbsp, unsigned int size, int use_ref)
+{
+    int min_size = size;
+
+    if (size > INT_MAX - AV_INPUT_BUFFER_PADDING_SIZE)
+        goto fail;
+    size += AV_INPUT_BUFFER_PADDING_SIZE;
+
+    if (rbsp->rbsp_buffer_alloc_size >= size &&
+        (!rbsp->rbsp_buffer_ref || av_buffer_is_writable(rbsp->rbsp_buffer_ref))) {
+        av_assert0(rbsp->rbsp_buffer);
+        memset(rbsp->rbsp_buffer + min_size, 0, AV_INPUT_BUFFER_PADDING_SIZE);
+        return;
+    }
+
+    size = FFMIN(size + size / 16 + 32, INT_MAX);
+
+    if (rbsp->rbsp_buffer_ref)
+        av_buffer_unref(&rbsp->rbsp_buffer_ref);
+    else
+        av_free(rbsp->rbsp_buffer);
+
+    rbsp->rbsp_buffer = av_mallocz(size);
+    if (!rbsp->rbsp_buffer)
+        goto fail;
+    rbsp->rbsp_buffer_alloc_size = size;
+
+    if (use_ref) {
+        rbsp->rbsp_buffer_ref = av_buffer_create(rbsp->rbsp_buffer, size,
+                                                 NULL, NULL, 0);
+        if (!rbsp->rbsp_buffer_ref)
+            goto fail;
+    }
+
+    return;
+
+fail:
+    rbsp->rbsp_buffer_alloc_size = 0;
+    if (rbsp->rbsp_buffer_ref) {
+        av_buffer_unref(&rbsp->rbsp_buffer_ref);
+        rbsp->rbsp_buffer = NULL;
+    } else
+        av_freep(&rbsp->rbsp_buffer);
+
+    return;
+}
+
 int ff_h2645_packet_split(H2645Packet *pkt, const uint8_t *buf, int length,
                           void *logctx, int is_nalff, int nal_length_size,
-                          enum AVCodecID codec_id, int small_padding)
+                          enum AVCodecID codec_id, int small_padding, int use_ref)
 {
     GetByteContext bc;
     int consumed, ret = 0;
@@ -353,7 +399,8 @@
     int64_t padding = small_padding ? 0 : MAX_MBPAIR_SIZE;
 
     bytestream2_init(&bc, buf, length);
-    av_fast_padded_malloc(&pkt->rbsp.rbsp_buffer, &pkt->rbsp.rbsp_buffer_alloc_size, length + padding);
+    alloc_rbsp_buffer(&pkt->rbsp, length + padding, use_ref);
+
     if (!pkt->rbsp.rbsp_buffer)
         return AVERROR(ENOMEM);
 
@@ -407,14 +454,17 @@
 
         if (pkt->nals_allocated < pkt->nb_nals + 1) {
             int new_size = pkt->nals_allocated + 1;
-            void *tmp = av_realloc_array(pkt->nals, new_size, sizeof(*pkt->nals));
+            void *tmp;
 
+            if (new_size >= INT_MAX / sizeof(*pkt->nals))
+                return AVERROR(ENOMEM);
+
+            tmp = av_fast_realloc(pkt->nals, &pkt->nal_buffer_size, new_size * sizeof(*pkt->nals));
             if (!tmp)
                 return AVERROR(ENOMEM);
 
             pkt->nals = tmp;
-            memset(pkt->nals + pkt->nals_allocated, 0,
-                   (new_size - pkt->nals_allocated) * sizeof(*pkt->nals));
+            memset(pkt->nals + pkt->nals_allocated, 0, sizeof(*pkt->nals));
 
             nal = &pkt->nals[pkt->nb_nals];
             nal->skipped_bytes_pos_size = 1024; // initial buffer size
@@ -456,7 +506,7 @@
             ret = h264_parse_nal_header(nal, logctx);
         if (ret <= 0 || nal->size <= 0 || nal->size_bits <= 0) {
             if (ret < 0) {
-                av_log(logctx, AV_LOG_ERROR, "Invalid NAL unit %d, skipping.\n",
+                av_log(logctx, AV_LOG_WARNING, "Invalid NAL unit %d, skipping.\n",
                        nal->type);
             }
             pkt->nb_nals--;
@@ -473,7 +523,11 @@
         av_freep(&pkt->nals[i].skipped_bytes_pos);
     }
     av_freep(&pkt->nals);
-    pkt->nals_allocated = 0;
-    av_freep(&pkt->rbsp.rbsp_buffer);
+    pkt->nals_allocated = pkt->nal_buffer_size = 0;
+    if (pkt->rbsp.rbsp_buffer_ref) {
+        av_buffer_unref(&pkt->rbsp.rbsp_buffer_ref);
+        pkt->rbsp.rbsp_buffer = NULL;
+    } else
+        av_freep(&pkt->rbsp.rbsp_buffer);
     pkt->rbsp.rbsp_buffer_alloc_size = pkt->rbsp.rbsp_buffer_size = 0;
 }
diff --git a/libavcodec/h2645_parse.h b/libavcodec/h2645_parse.h
index 2e29ad2..3e47f86 100644
--- a/libavcodec/h2645_parse.h
+++ b/libavcodec/h2645_parse.h
@@ -23,6 +23,7 @@
 
 #include <stdint.h>
 
+#include "libavutil/buffer.h"
 #include "avcodec.h"
 #include "get_bits.h"
 
@@ -55,6 +56,11 @@
      */
     int temporal_id;
 
+    /*
+     * HEVC only, identifier of layer to which nal unit belongs
+     */
+    int nuh_layer_id;
+
     int skipped_bytes;
     int skipped_bytes_pos_size;
     int *skipped_bytes_pos;
@@ -66,6 +72,7 @@
 
 typedef struct H2645RBSP {
     uint8_t *rbsp_buffer;
+    AVBufferRef *rbsp_buffer_ref;
     int rbsp_buffer_alloc_size;
     int rbsp_buffer_size;
 } H2645RBSP;
@@ -76,6 +83,7 @@
     H2645RBSP rbsp;
     int nb_nals;
     int nals_allocated;
+    unsigned nal_buffer_size;
 } H2645Packet;
 
 /**
@@ -86,10 +94,21 @@
 
 /**
  * Split an input packet into NAL units.
+ *
+ * If data == raw_data holds true for a NAL unit of the returned pkt, then
+ * said NAL unit does not contain any emulation_prevention_three_byte and
+ * the data is contained in the input buffer pointed to by buf.
+ * Otherwise, the unescaped data is part of the rbsp_buffer described by the
+ * packet's H2645RBSP.
+ *
+ * If the packet's rbsp_buffer_ref is not NULL, the underlying AVBuffer must
+ * own rbsp_buffer. If not and rbsp_buffer is not NULL, use_ref must be 0.
+ * If use_ref is set, rbsp_buffer will be reference-counted and owned by
+ * the underlying AVBuffer of rbsp_buffer_ref.
  */
 int ff_h2645_packet_split(H2645Packet *pkt, const uint8_t *buf, int length,
                           void *logctx, int is_nalff, int nal_length_size,
-                          enum AVCodecID codec_id, int small_padding);
+                          enum AVCodecID codec_id, int small_padding, int use_ref);
 
 /**
  * Free all the allocated memory in the packet.
diff --git a/libavcodec/h264_cabac.c b/libavcodec/h264_cabac.c
index 815149a..86f0a41 100644
--- a/libavcodec/h264_cabac.c
+++ b/libavcodec/h264_cabac.c
@@ -31,7 +31,6 @@
 
 #include "libavutil/attributes.h"
 #include "libavutil/avassert.h"
-#include "libavutil/timer.h"
 #include "config.h"
 #include "cabac.h"
 #include "cabac_functions.h"
@@ -1895,9 +1894,7 @@
                     qmul = h->ps.pps->dequant4_coeff[cqm][qscale];
                     for( i4x4 = 0; i4x4 < 4; i4x4++ ) {
                         const int index = 16*p + 4*i8x8 + i4x4;
-//START_TIMER
                         decode_cabac_residual_nondc(h, sl, sl->mb + (16*index << pixel_shift), ctx_cat[2][p], index, scan, qmul, 16);
-//STOP_TIMER("decode_residual")
                     }
                 }
             } else {
diff --git a/libavcodec/h264_cavlc.c b/libavcodec/h264_cavlc.c
index 5e6a203..6481992 100644
--- a/libavcodec/h264_cavlc.c
+++ b/libavcodec/h264_cavlc.c
@@ -714,8 +714,14 @@
     cbp = 0; /* avoid warning. FIXME: find a solution without slowing
                 down the code */
     if (sl->slice_type_nos != AV_PICTURE_TYPE_I) {
-        if (sl->mb_skip_run == -1)
-            sl->mb_skip_run = get_ue_golomb_long(&sl->gb);
+        if (sl->mb_skip_run == -1) {
+            unsigned mb_skip_run = get_ue_golomb_long(&sl->gb);
+            if (mb_skip_run > h->mb_num) {
+                av_log(h->avctx, AV_LOG_ERROR, "mb_skip_run %d is invalid\n", mb_skip_run);
+                return AVERROR_INVALIDDATA;
+            }
+            sl->mb_skip_run = mb_skip_run;
+        }
 
         if (sl->mb_skip_run--) {
             if (FRAME_MBAFF(h) && (sl->mb_y & 1) == 0) {
@@ -917,8 +923,8 @@
                         const int index= 4*i + block_width*j;
                         int16_t (* mv_cache)[2]= &sl->mv_cache[list][ scan8[index] ];
                         pred_motion(h, sl, index, block_width, list, sl->ref_cache[list][ scan8[index] ], &mx, &my);
-                        mx += get_se_golomb(&sl->gb);
-                        my += get_se_golomb(&sl->gb);
+                        mx += (unsigned)get_se_golomb(&sl->gb);
+                        my += (unsigned)get_se_golomb(&sl->gb);
                         ff_tlog(h->avctx, "final mv:%d %d\n", mx, my);
 
                         if(IS_SUB_8X8(sub_mb_type)){
@@ -971,8 +977,8 @@
             for (list = 0; list < sl->list_count; list++) {
                 if(IS_DIR(mb_type, 0, list)){
                     pred_motion(h, sl, 0, 4, list, sl->ref_cache[list][ scan8[0] ], &mx, &my);
-                    mx += get_se_golomb(&sl->gb);
-                    my += get_se_golomb(&sl->gb);
+                    mx += (unsigned)get_se_golomb(&sl->gb);
+                    my += (unsigned)get_se_golomb(&sl->gb);
                     ff_tlog(h->avctx, "final mv:%d %d\n", mx, my);
 
                     fill_rectangle(sl->mv_cache[list][ scan8[0] ], 4, 4, 8, pack16to32(mx,my), 4);
@@ -1006,8 +1012,8 @@
                     unsigned int val;
                     if(IS_DIR(mb_type, i, list)){
                         pred_16x8_motion(h, sl, 8*i, list, sl->ref_cache[list][scan8[0] + 16*i], &mx, &my);
-                        mx += get_se_golomb(&sl->gb);
-                        my += get_se_golomb(&sl->gb);
+                        mx += (unsigned)get_se_golomb(&sl->gb);
+                        my += (unsigned)get_se_golomb(&sl->gb);
                         ff_tlog(h->avctx, "final mv:%d %d\n", mx, my);
 
                         val= pack16to32(mx,my);
@@ -1044,8 +1050,8 @@
                     unsigned int val;
                     if(IS_DIR(mb_type, i, list)){
                         pred_8x16_motion(h, sl, i*4, list, sl->ref_cache[list][ scan8[0] + 2*i ], &mx, &my);
-                        mx += get_se_golomb(&sl->gb);
-                        my += get_se_golomb(&sl->gb);
+                        mx += (unsigned)get_se_golomb(&sl->gb);
+                        my += (unsigned)get_se_golomb(&sl->gb);
                         ff_tlog(h->avctx, "final mv:%d %d\n", mx, my);
 
                         val= pack16to32(mx,my);
diff --git a/libavcodec/h264_direct.c b/libavcodec/h264_direct.c
index ec9fca0..a01d823 100644
--- a/libavcodec/h264_direct.c
+++ b/libavcodec/h264_direct.c
@@ -156,8 +156,8 @@
             av_log(h->avctx, AV_LOG_ERROR, "co located POCs unavailable\n");
             sl->col_parity = 1;
         } else
-        sl->col_parity = (FFABS(col_poc[0] - cur_poc) >=
-                          FFABS(col_poc[1] - cur_poc));
+            sl->col_parity = (FFABS(col_poc[0] - (int64_t)cur_poc) >=
+                              FFABS(col_poc[1] - (int64_t)cur_poc));
         ref1sidx =
         sidx     = sl->col_parity;
     // FL -> FL & differ parity
diff --git a/libavcodec/h264_levels.c b/libavcodec/h264_levels.c
index 737b7dc..dd517f1 100644
--- a/libavcodec/h264_levels.c
+++ b/libavcodec/h264_levels.c
@@ -25,7 +25,7 @@
     //  | level_idc     |       MaxFS            |    MaxCPB        | MaxMvsPer2Mb
     //  |     | cs3f    |         |  MaxDpbMbs   |       |  MaxVmvR |   |
     { "1",   10, 0,     1485,     99,    396,     64,    175,   64, 2,  0 },
-    { "1b",  10, 1,     1485,     99,    396,    128,    350,   64, 2,  0 },
+    { "1b",  11, 1,     1485,     99,    396,    128,    350,   64, 2,  0 },
     { "1b",   9, 0,     1485,     99,    396,    128,    350,   64, 2,  0 },
     { "1.1", 11, 0,     3000,    396,    900,    192,    500,  128, 2,  0 },
     { "1.2", 12, 0,     6000,    396,   2376,    384,   1000,  128, 2,  0 },
@@ -89,6 +89,7 @@
 
 const H264LevelDescriptor *ff_h264_guess_level(int profile_idc,
                                                int64_t bitrate,
+                                               int framerate,
                                                int width, int height,
                                                int max_dec_frame_buffering)
 {
@@ -120,6 +121,9 @@
                 FFMIN(level->max_dpb_mbs / (width_mbs * height_mbs), 16);
             if (max_dec_frame_buffering > max_dpb_frames)
                 continue;
+
+            if (framerate > (level->max_mbps / (width_mbs * height_mbs)))
+                continue;
         }
 
         return level;
diff --git a/libavcodec/h264_levels.h b/libavcodec/h264_levels.h
index 4189fc6..0a0f410 100644
--- a/libavcodec/h264_levels.h
+++ b/libavcodec/h264_levels.h
@@ -46,6 +46,7 @@
  */
 const H264LevelDescriptor *ff_h264_guess_level(int profile_idc,
                                                int64_t bitrate,
+                                               int framerate,
                                                int width, int height,
                                                int max_dec_frame_buffering);
 
diff --git a/libavcodec/h264_metadata_bsf.c b/libavcodec/h264_metadata_bsf.c
index bf37528..d96a50d 100644
--- a/libavcodec/h264_metadata_bsf.c
+++ b/libavcodec/h264_metadata_bsf.c
@@ -57,6 +57,8 @@
 
     AVRational sample_aspect_ratio;
 
+    int overscan_appropriate_flag;
+
     int video_format;
     int video_full_range_flag;
     int colour_primaries;
@@ -122,47 +124,39 @@
         need_vui = 1;
     }
 
-#define SET_OR_INFER(field, value, present_flag, infer) do { \
-        if (value >= 0) { \
-            field = value; \
+#define SET_VUI_FIELD(field) do { \
+        if (ctx->field >= 0) { \
+            sps->vui.field = ctx->field; \
             need_vui = 1; \
-        } else if (!present_flag) \
-            field = infer; \
+        } \
     } while (0)
 
+    if (ctx->overscan_appropriate_flag >= 0) {
+        SET_VUI_FIELD(overscan_appropriate_flag);
+        sps->vui.overscan_info_present_flag = 1;
+    }
+
     if (ctx->video_format             >= 0 ||
         ctx->video_full_range_flag    >= 0 ||
         ctx->colour_primaries         >= 0 ||
         ctx->transfer_characteristics >= 0 ||
         ctx->matrix_coefficients      >= 0) {
 
-        SET_OR_INFER(sps->vui.video_format, ctx->video_format,
-                     sps->vui.video_signal_type_present_flag, 5);
+        SET_VUI_FIELD(video_format);
 
-        SET_OR_INFER(sps->vui.video_full_range_flag,
-                     ctx->video_full_range_flag,
-                     sps->vui.video_signal_type_present_flag, 0);
+        SET_VUI_FIELD(video_full_range_flag);
 
         if (ctx->colour_primaries         >= 0 ||
             ctx->transfer_characteristics >= 0 ||
             ctx->matrix_coefficients      >= 0) {
 
-            SET_OR_INFER(sps->vui.colour_primaries,
-                         ctx->colour_primaries,
-                         sps->vui.colour_description_present_flag, 2);
-
-            SET_OR_INFER(sps->vui.transfer_characteristics,
-                         ctx->transfer_characteristics,
-                         sps->vui.colour_description_present_flag, 2);
-
-            SET_OR_INFER(sps->vui.matrix_coefficients,
-                         ctx->matrix_coefficients,
-                         sps->vui.colour_description_present_flag, 2);
+            SET_VUI_FIELD(colour_primaries);
+            SET_VUI_FIELD(transfer_characteristics);
+            SET_VUI_FIELD(matrix_coefficients);
 
             sps->vui.colour_description_present_flag = 1;
         }
         sps->vui.video_signal_type_present_flag = 1;
-        need_vui = 1;
     }
 
     if (ctx->chroma_sample_loc_type >= 0) {
@@ -186,9 +180,7 @@
         sps->vui.timing_info_present_flag = 1;
         need_vui = 1;
     }
-    SET_OR_INFER(sps->vui.fixed_frame_rate_flag,
-                 ctx->fixed_frame_rate_flag,
-                 sps->vui.timing_info_present_flag, 0);
+    SET_VUI_FIELD(fixed_frame_rate_flag);
 
     if (sps->separate_colour_plane_flag || sps->chroma_format_idc == 0) {
         crop_unit_x = 1;
@@ -222,7 +214,8 @@
         if (ctx->level == LEVEL_AUTO) {
             const H264LevelDescriptor *desc;
             int64_t bit_rate;
-            int width, height;
+            int width, height, dpb_frames;
+            int framerate;
 
             if (sps->vui.nal_hrd_parameters_present_flag) {
                 bit_rate = (sps->vui.nal_hrd_parameters.bit_rate_value_minus1[0] + 1) *
@@ -236,13 +229,21 @@
                 bit_rate = 0;
             }
 
+            // Don't use max_dec_frame_buffering if it is only inferred.
+            dpb_frames = sps->vui.bitstream_restriction_flag ?
+                sps->vui.max_dec_frame_buffering : H264_MAX_DPB_FRAMES;
+
             width  = 16 * (sps->pic_width_in_mbs_minus1 + 1);
             height = 16 * (sps->pic_height_in_map_units_minus1 + 1) *
                 (2 - sps->frame_mbs_only_flag);
 
-            desc = ff_h264_guess_level(sps->profile_idc, bit_rate,
-                                       width, height,
-                                       sps->vui.max_dec_frame_buffering);
+            if (sps->vui.timing_info_present_flag)
+                framerate = sps->vui.time_scale / sps->vui.num_units_in_tick / 2;
+            else
+                framerate = 0;
+
+            desc = ff_h264_guess_level(sps->profile_idc, bit_rate, framerate,
+                                       width, height, dpb_frames);
             if (desc) {
                 level_idc = desc->level_idc;
             } else {
@@ -258,7 +259,7 @@
             if (sps->profile_idc == 66 ||
                 sps->profile_idc == 77 ||
                 sps->profile_idc == 88) {
-                sps->level_idc = 10;
+                sps->level_idc = 11;
                 sps->constraint_set3_flag = 1;
             } else {
                 sps->level_idc = 9;
@@ -274,21 +275,18 @@
     return 0;
 }
 
-static int h264_metadata_filter(AVBSFContext *bsf, AVPacket *out)
+static int h264_metadata_filter(AVBSFContext *bsf, AVPacket *pkt)
 {
     H264MetadataContext *ctx = bsf->priv_data;
-    AVPacket *in = NULL;
     CodedBitstreamFragment *au = &ctx->access_unit;
     int err, i, j, has_sps;
     H264RawAUD aud;
-    uint8_t *displaymatrix_side_data = NULL;
-    size_t displaymatrix_side_data_size = 0;
 
-    err = ff_bsf_get_packet(bsf, &in);
+    err = ff_bsf_get_packet_ref(bsf, pkt);
     if (err < 0)
         return err;
 
-    err = ff_cbs_read_packet(ctx->cbc, au, in);
+    err = ff_cbs_read_packet(ctx->cbc, au, pkt);
     if (err < 0) {
         av_log(bsf, AV_LOG_ERROR, "Failed to read packet.\n");
         goto fail;
@@ -383,7 +381,7 @@
             } else {
                 goto invalid_user_data;
             }
-            if (i & 1)
+            if (j & 1)
                 udu->uuid_iso_iec_11578[j / 2] |= v;
             else
                 udu->uuid_iso_iec_11578[j / 2] = v << 4;
@@ -419,16 +417,9 @@
     }
 
     if (ctx->delete_filler) {
-        for (i = 0; i < au->nb_units; i++) {
+        for (i = au->nb_units - 1; i >= 0; i--) {
             if (au->units[i].type == H264_NAL_FILLER_DATA) {
-                // Filler NAL units.
-                err = ff_cbs_delete_unit(ctx->cbc, au, i);
-                if (err < 0) {
-                    av_log(bsf, AV_LOG_ERROR, "Failed to delete "
-                           "filler NAL.\n");
-                    goto fail;
-                }
-                --i;
+                ff_cbs_delete_unit(ctx->cbc, au, i);
                 continue;
             }
 
@@ -436,34 +427,24 @@
                 // Filler SEI messages.
                 H264RawSEI *sei = au->units[i].content;
 
-                for (j = 0; j < sei->payload_count; j++) {
+                for (j = sei->payload_count - 1; j >= 0; j--) {
                     if (sei->payload[j].payload_type ==
-                        H264_SEI_TYPE_FILLER_PAYLOAD) {
-                        err = ff_cbs_h264_delete_sei_message(ctx->cbc, au,
-                                                             &au->units[i], j);
-                        if (err < 0) {
-                            av_log(bsf, AV_LOG_ERROR, "Failed to delete "
-                                   "filler SEI message.\n");
-                            goto fail;
-                        }
-                        // Renumbering might have happened, start again at
-                        // the same NAL unit position.
-                        --i;
-                        break;
-                    }
+                        H264_SEI_TYPE_FILLER_PAYLOAD)
+                        ff_cbs_h264_delete_sei_message(ctx->cbc, au,
+                                                       &au->units[i], j);
                 }
             }
         }
     }
 
     if (ctx->display_orientation != PASS) {
-        for (i = 0; i < au->nb_units; i++) {
+        for (i = au->nb_units - 1; i >= 0; i--) {
             H264RawSEI *sei;
             if (au->units[i].type != H264_NAL_SEI)
                 continue;
             sei = au->units[i].content;
 
-            for (j = 0; j < sei->payload_count; j++) {
+            for (j = sei->payload_count - 1; j >= 0; j--) {
                 H264RawSEIDisplayOrientation *disp;
                 int32_t *matrix;
 
@@ -474,18 +455,12 @@
 
                 if (ctx->display_orientation == REMOVE ||
                     ctx->display_orientation == INSERT) {
-                    err = ff_cbs_h264_delete_sei_message(ctx->cbc, au,
-                                                         &au->units[i], j);
-                    if (err < 0) {
-                        av_log(bsf, AV_LOG_ERROR, "Failed to delete "
-                               "display orientation SEI message.\n");
-                        goto fail;
-                    }
-                    --i;
-                    break;
+                    ff_cbs_h264_delete_sei_message(ctx->cbc, au,
+                                                   &au->units[i], j);
+                    continue;
                 }
 
-                matrix = av_mallocz(9 * sizeof(int32_t));
+                matrix = av_malloc(9 * sizeof(int32_t));
                 if (!matrix) {
                     err = AVERROR(ENOMEM);
                     goto fail;
@@ -497,11 +472,17 @@
                 av_display_matrix_flip(matrix, disp->hor_flip, disp->ver_flip);
 
                 // If there are multiple display orientation messages in an
-                // access unit then ignore all but the last one.
-                av_freep(&displaymatrix_side_data);
-
-                displaymatrix_side_data      = (uint8_t*)matrix;
-                displaymatrix_side_data_size = 9 * sizeof(int32_t);
+                // access unit, then the last one added to the packet (i.e.
+                // the first one in the access unit) will prevail.
+                err = av_packet_add_side_data(pkt, AV_PKT_DATA_DISPLAYMATRIX,
+                                              (uint8_t*)matrix,
+                                              9 * sizeof(int32_t));
+                if (err < 0) {
+                    av_log(bsf, AV_LOG_ERROR, "Failed to attach extracted "
+                           "displaymatrix side data to packet.\n");
+                    av_freep(matrix);
+                    goto fail;
+                }
             }
         }
     }
@@ -515,7 +496,7 @@
         int size;
         int write = 0;
 
-        data = av_packet_get_side_data(in, AV_PKT_DATA_DISPLAYMATRIX, &size);
+        data = av_packet_get_side_data(pkt, AV_PKT_DATA_DISPLAYMATRIX, &size);
         if (data && size >= 9 * sizeof(int32_t)) {
             int32_t matrix[9];
             int hflip, vflip;
@@ -575,38 +556,20 @@
         }
     }
 
-    err = ff_cbs_write_packet(ctx->cbc, out, au);
+    err = ff_cbs_write_packet(ctx->cbc, pkt, au);
     if (err < 0) {
         av_log(bsf, AV_LOG_ERROR, "Failed to write packet.\n");
         goto fail;
     }
 
-    err = av_packet_copy_props(out, in);
-    if (err < 0)
-        goto fail;
-
-    if (displaymatrix_side_data) {
-        err = av_packet_add_side_data(out, AV_PKT_DATA_DISPLAYMATRIX,
-                                      displaymatrix_side_data,
-                                      displaymatrix_side_data_size);
-        if (err) {
-            av_log(bsf, AV_LOG_ERROR, "Failed to attach extracted "
-                   "displaymatrix side data to packet.\n");
-            goto fail;
-        }
-        displaymatrix_side_data = NULL;
-    }
-
     ctx->done_first_au = 1;
 
     err = 0;
 fail:
-    ff_cbs_fragment_uninit(ctx->cbc, au);
-    av_freep(&displaymatrix_side_data);
+    ff_cbs_fragment_reset(ctx->cbc, au);
 
     if (err < 0)
-        av_packet_unref(out);
-    av_packet_free(&in);
+        av_packet_unref(pkt);
 
     return err;
 }
@@ -645,13 +608,15 @@
 
     err = 0;
 fail:
-    ff_cbs_fragment_uninit(ctx->cbc, au);
+    ff_cbs_fragment_reset(ctx->cbc, au);
     return err;
 }
 
 static void h264_metadata_close(AVBSFContext *bsf)
 {
     H264MetadataContext *ctx = bsf->priv_data;
+
+    ff_cbs_fragment_free(ctx->cbc, &ctx->access_unit);
     ff_cbs_close(&ctx->cbc);
 }
 
@@ -672,6 +637,10 @@
         OFFSET(sample_aspect_ratio), AV_OPT_TYPE_RATIONAL,
         { .dbl = 0.0 }, 0, 65535, FLAGS },
 
+    { "overscan_appropriate_flag", "Set VUI overscan appropriate flag",
+        OFFSET(overscan_appropriate_flag), AV_OPT_TYPE_INT,
+        { .i64 = -1 }, -1, 1, FLAGS },
+
     { "video_format", "Set video format (table E-2)",
         OFFSET(video_format), AV_OPT_TYPE_INT,
         { .i64 = -1 }, -1, 7, FLAGS},
diff --git a/libavcodec/h264_mp4toannexb_bsf.c b/libavcodec/h264_mp4toannexb_bsf.c
index fb3f24e..0150f97 100644
--- a/libavcodec/h264_mp4toannexb_bsf.c
+++ b/libavcodec/h264_mp4toannexb_bsf.c
@@ -21,16 +21,20 @@
 
 #include <string.h>
 
+#include "libavutil/avassert.h"
 #include "libavutil/intreadwrite.h"
 #include "libavutil/mem.h"
 
 #include "avcodec.h"
 #include "bsf.h"
+#include "bytestream.h"
 #include "h264.h"
 
 typedef struct H264BSFContext {
-    int32_t  sps_offset;
-    int32_t  pps_offset;
+    uint8_t *sps;
+    uint8_t *pps;
+    int      sps_size;
+    int      pps_size;
     uint8_t  length_size;
     uint8_t  new_idr;
     uint8_t  idr_sps_seen;
@@ -38,98 +42,91 @@
     int      extradata_parsed;
 } H264BSFContext;
 
-static int alloc_and_copy(AVPacket *out,
-                          const uint8_t *sps_pps, uint32_t sps_pps_size,
-                          const uint8_t *in, uint32_t in_size, int ps)
+static void count_or_copy(uint8_t **out, uint64_t *out_size,
+                          const uint8_t *in, int in_size, int ps, int copy)
 {
-    uint32_t offset         = out->size;
-    uint8_t start_code_size = offset == 0 || ps ? 4 : 3;
-    int err;
+    uint8_t start_code_size = ps < 0 ? 0 : *out_size == 0 || ps ? 4 : 3;
 
-    err = av_grow_packet(out, sps_pps_size + in_size + start_code_size);
-    if (err < 0)
-        return err;
-
-    if (sps_pps)
-        memcpy(out->data + offset, sps_pps, sps_pps_size);
-    memcpy(out->data + sps_pps_size + start_code_size + offset, in, in_size);
-    if (start_code_size == 4) {
-        AV_WB32(out->data + offset + sps_pps_size, 1);
-    } else {
-        (out->data + offset + sps_pps_size)[0] =
-        (out->data + offset + sps_pps_size)[1] = 0;
-        (out->data + offset + sps_pps_size)[2] = 1;
+    if (copy) {
+        memcpy(*out + start_code_size, in, in_size);
+        if (start_code_size == 4) {
+            AV_WB32(*out, 1);
+        } else if (start_code_size) {
+            (*out)[0] =
+            (*out)[1] = 0;
+            (*out)[2] = 1;
+        }
+        *out  += start_code_size + in_size;
     }
-
-    return 0;
+    *out_size += start_code_size + in_size;
 }
 
 static int h264_extradata_to_annexb(AVBSFContext *ctx, const int padding)
 {
     H264BSFContext *s = ctx->priv_data;
+    GetByteContext ogb, *gb = &ogb;
     uint16_t unit_size;
-    uint64_t total_size                 = 0;
-    uint8_t *out                        = NULL, unit_nb, sps_done = 0,
-             sps_seen                   = 0, pps_seen = 0;
-    const uint8_t *extradata            = ctx->par_in->extradata + 4;
+    uint32_t total_size                 = 0;
+    uint8_t *out                        = NULL, unit_nb, sps_done = 0;
     static const uint8_t nalu_header[4] = { 0, 0, 0, 1 };
-    int length_size = (*extradata++ & 0x3) + 1; // retrieve length coded size
+    int length_size, pps_offset = 0;
 
-    s->sps_offset = s->pps_offset = -1;
+    bytestream2_init(gb, ctx->par_in->extradata, ctx->par_in->extradata_size);
+
+    bytestream2_skipu(gb, 4);
+
+    /* retrieve length coded size */
+    length_size = (bytestream2_get_byteu(gb) & 0x3) + 1;
 
     /* retrieve sps and pps unit(s) */
-    unit_nb = *extradata++ & 0x1f; /* number of sps unit(s) */
+    unit_nb = bytestream2_get_byteu(gb) & 0x1f; /* number of sps unit(s) */
     if (!unit_nb) {
         goto pps;
-    } else {
-        s->sps_offset = 0;
-        sps_seen = 1;
     }
 
     while (unit_nb--) {
         int err;
 
-        unit_size   = AV_RB16(extradata);
+        /* possible overread ok due to padding */
+        unit_size   = bytestream2_get_be16u(gb);
         total_size += unit_size + 4;
-        if (total_size > INT_MAX - padding) {
-            av_log(ctx, AV_LOG_ERROR,
-                   "Too big extradata size, corrupted stream or invalid MP4/AVCC bitstream\n");
-            av_free(out);
-            return AVERROR(EINVAL);
-        }
-        if (extradata + 2 + unit_size > ctx->par_in->extradata + ctx->par_in->extradata_size) {
-            av_log(ctx, AV_LOG_ERROR, "Packet header is not contained in global extradata, "
+        av_assert1(total_size <= INT_MAX - padding);
+        if (bytestream2_get_bytes_left(gb) < unit_size + !sps_done) {
+            av_log(ctx, AV_LOG_ERROR, "Global extradata truncated, "
                    "corrupted stream or invalid MP4/AVCC bitstream\n");
             av_free(out);
-            return AVERROR(EINVAL);
+            return AVERROR_INVALIDDATA;
         }
         if ((err = av_reallocp(&out, total_size + padding)) < 0)
             return err;
         memcpy(out + total_size - unit_size - 4, nalu_header, 4);
-        memcpy(out + total_size - unit_size, extradata + 2, unit_size);
-        extradata += 2 + unit_size;
+        bytestream2_get_bufferu(gb, out + total_size - unit_size, unit_size);
 pps:
         if (!unit_nb && !sps_done++) {
-            unit_nb = *extradata++; /* number of pps unit(s) */
-            if (unit_nb) {
-                s->pps_offset = total_size;
-                pps_seen = 1;
-            }
+            unit_nb = bytestream2_get_byteu(gb); /* number of pps unit(s) */
+            pps_offset = total_size;
         }
     }
 
     if (out)
         memset(out + total_size, 0, padding);
 
-    if (!sps_seen)
+    if (pps_offset) {
+        s->sps      = out;
+        s->sps_size = pps_offset;
+    } else {
         av_log(ctx, AV_LOG_WARNING,
                "Warning: SPS NALU missing or invalid. "
                "The resulting stream may not play.\n");
-
-    if (!pps_seen)
+    }
+    if (pps_offset < total_size) {
+        s->pps      = out + pps_offset;
+        s->pps_size = total_size - pps_offset;
+    } else {
         av_log(ctx, AV_LOG_WARNING,
                "Warning: PPS NALU missing or invalid. "
                "The resulting stream may not play.\n");
+    }
 
     av_freep(&ctx->par_out->extradata);
     ctx->par_out->extradata      = out;
@@ -150,7 +147,7 @@
         (extra_size >= 4 && AV_RB32(ctx->par_in->extradata) == 1)) {
         av_log(ctx, AV_LOG_VERBOSE,
                "The input looks like it is Annex B already\n");
-    } else if (extra_size >= 6) {
+    } else if (extra_size >= 7) {
         ret = h264_extradata_to_annexb(ctx, AV_INPUT_BUFFER_PADDING_SIZE);
         if (ret < 0)
             return ret;
@@ -168,18 +165,16 @@
     return 0;
 }
 
-static int h264_mp4toannexb_filter(AVBSFContext *ctx, AVPacket *out)
+static int h264_mp4toannexb_filter(AVBSFContext *ctx, AVPacket *opkt)
 {
     H264BSFContext *s = ctx->priv_data;
-
     AVPacket *in;
-    uint8_t unit_type;
-    int32_t nal_size;
-    uint32_t cumul_size    = 0;
+    uint8_t unit_type, new_idr, sps_seen, pps_seen;
     const uint8_t *buf;
     const uint8_t *buf_end;
-    int            buf_size;
-    int ret = 0, i;
+    uint8_t *out;
+    uint64_t out_size;
+    int ret;
 
     ret = ff_bsf_get_packet(ctx, &in);
     if (ret < 0)
@@ -187,94 +182,117 @@
 
     /* nothing to filter */
     if (!s->extradata_parsed) {
-        av_packet_move_ref(out, in);
+        av_packet_move_ref(opkt, in);
         av_packet_free(&in);
         return 0;
     }
 
-    buf      = in->data;
-    buf_size = in->size;
     buf_end  = in->data + in->size;
 
-    do {
-        ret= AVERROR(EINVAL);
-        if (buf + s->length_size > buf_end)
-            goto fail;
+#define LOG_ONCE(...) \
+    if (j) \
+        av_log(__VA_ARGS__)
+    for (int j = 0; j < 2; j++) {
+        buf      = in->data;
+        new_idr  = s->new_idr;
+        sps_seen = s->idr_sps_seen;
+        pps_seen = s->idr_pps_seen;
+        out_size = 0;
 
-        for (nal_size = 0, i = 0; i<s->length_size; i++)
-            nal_size = (nal_size << 8) | buf[i];
+        do {
+            uint32_t nal_size = 0;
 
-        buf += s->length_size;
-        unit_type = *buf & 0x1f;
+            /* possible overread ok due to padding */
+            for (int i = 0; i < s->length_size; i++)
+                nal_size = (nal_size << 8) | buf[i];
 
-        if (nal_size > buf_end - buf || nal_size < 0)
-            goto fail;
+            buf += s->length_size;
 
-        if (unit_type == H264_NAL_SPS)
-            s->idr_sps_seen = s->new_idr = 1;
-        else if (unit_type == H264_NAL_PPS) {
-            s->idr_pps_seen = s->new_idr = 1;
-            /* if SPS has not been seen yet, prepend the AVCC one to PPS */
-            if (!s->idr_sps_seen) {
-                if (s->sps_offset == -1)
-                    av_log(ctx, AV_LOG_WARNING, "SPS not present in the stream, nor in AVCC, stream may be unreadable\n");
-                else {
-                    if ((ret = alloc_and_copy(out,
-                                         ctx->par_out->extradata + s->sps_offset,
-                                         s->pps_offset != -1 ? s->pps_offset : ctx->par_out->extradata_size - s->sps_offset,
-                                         buf, nal_size, 1)) < 0)
-                        goto fail;
-                    s->idr_sps_seen = 1;
-                    goto next_nal;
+            /* This check requires the cast as the right side might
+             * otherwise be promoted to an unsigned value. */
+            if ((int64_t)nal_size > buf_end - buf) {
+                ret = AVERROR_INVALIDDATA;
+                goto fail;
+            }
+
+            if (!nal_size)
+                continue;
+
+            unit_type = *buf & 0x1f;
+
+            if (unit_type == H264_NAL_SPS) {
+                sps_seen = new_idr = 1;
+            } else if (unit_type == H264_NAL_PPS) {
+                pps_seen = new_idr = 1;
+                /* if SPS has not been seen yet, prepend the AVCC one to PPS */
+                if (!sps_seen) {
+                    if (!s->sps_size) {
+                        LOG_ONCE(ctx, AV_LOG_WARNING, "SPS not present in the stream, nor in AVCC, stream may be unreadable\n");
+                    } else {
+                        count_or_copy(&out, &out_size, s->sps, s->sps_size, -1, j);
+                        sps_seen = 1;
+                    }
                 }
             }
-        }
 
-        /* if this is a new IDR picture following an IDR picture, reset the idr flag.
-         * Just check first_mb_in_slice to be 0 as this is the simplest solution.
-         * This could be checking idr_pic_id instead, but would complexify the parsing. */
-        if (!s->new_idr && unit_type == H264_NAL_IDR_SLICE && (buf[1] & 0x80))
-            s->new_idr = 1;
+            /* If this is a new IDR picture following an IDR picture, reset the idr flag.
+             * Just check first_mb_in_slice to be 0 as this is the simplest solution.
+             * This could be checking idr_pic_id instead, but would complexify the parsing. */
+            if (!new_idr && unit_type == H264_NAL_IDR_SLICE && (buf[1] & 0x80))
+                new_idr = 1;
 
-        /* prepend only to the first type 5 NAL unit of an IDR picture, if no sps/pps are already present */
-        if (s->new_idr && unit_type == H264_NAL_IDR_SLICE && !s->idr_sps_seen && !s->idr_pps_seen) {
-            if ((ret=alloc_and_copy(out,
-                               ctx->par_out->extradata, ctx->par_out->extradata_size,
-                               buf, nal_size, 1)) < 0)
-                goto fail;
-            s->new_idr = 0;
-        /* if only SPS has been seen, also insert PPS */
-        } else if (s->new_idr && unit_type == H264_NAL_IDR_SLICE && s->idr_sps_seen && !s->idr_pps_seen) {
-            if (s->pps_offset == -1) {
-                av_log(ctx, AV_LOG_WARNING, "PPS not present in the stream, nor in AVCC, stream may be unreadable\n");
-                if ((ret = alloc_and_copy(out, NULL, 0, buf, nal_size, 0)) < 0)
-                    goto fail;
-            } else if ((ret = alloc_and_copy(out,
-                                        ctx->par_out->extradata + s->pps_offset, ctx->par_out->extradata_size - s->pps_offset,
-                                        buf, nal_size, 1)) < 0)
-                goto fail;
-        } else {
-            if ((ret=alloc_and_copy(out, NULL, 0, buf, nal_size, unit_type == H264_NAL_SPS || unit_type == H264_NAL_PPS)) < 0)
-                goto fail;
-            if (!s->new_idr && unit_type == H264_NAL_SLICE) {
-                s->new_idr = 1;
-                s->idr_sps_seen = 0;
-                s->idr_pps_seen = 0;
+            /* prepend only to the first type 5 NAL unit of an IDR picture, if no sps/pps are already present */
+            if (new_idr && unit_type == H264_NAL_IDR_SLICE && !sps_seen && !pps_seen) {
+                if (ctx->par_out->extradata)
+                    count_or_copy(&out, &out_size, ctx->par_out->extradata,
+                                  ctx->par_out->extradata_size, -1, j);
+                new_idr = 0;
+            /* if only SPS has been seen, also insert PPS */
+            } else if (new_idr && unit_type == H264_NAL_IDR_SLICE && sps_seen && !pps_seen) {
+                if (!s->pps_size) {
+                    LOG_ONCE(ctx, AV_LOG_WARNING, "PPS not present in the stream, nor in AVCC, stream may be unreadable\n");
+                } else {
+                    count_or_copy(&out, &out_size, s->pps, s->pps_size, -1, j);
+                }
             }
+
+            count_or_copy(&out, &out_size, buf, nal_size,
+                          unit_type == H264_NAL_SPS || unit_type == H264_NAL_PPS, j);
+            if (!new_idr && unit_type == H264_NAL_SLICE) {
+                new_idr  = 1;
+                sps_seen = 0;
+                pps_seen = 0;
+            }
+
+            buf += nal_size;
+        } while (buf < buf_end);
+
+        if (!j) {
+            if (out_size > INT_MAX - AV_INPUT_BUFFER_PADDING_SIZE) {
+                ret = AVERROR_INVALIDDATA;
+                goto fail;
+            }
+            ret = av_new_packet(opkt, out_size);
+            if (ret < 0)
+                goto fail;
+            out = opkt->data;
         }
+    }
+#undef LOG_ONCE
 
-next_nal:
-        buf        += nal_size;
-        cumul_size += nal_size + s->length_size;
-    } while (cumul_size < buf_size);
+    av_assert1(out_size == opkt->size);
 
-    ret = av_packet_copy_props(out, in);
+    s->new_idr      = new_idr;
+    s->idr_sps_seen = sps_seen;
+    s->idr_pps_seen = pps_seen;
+
+    ret = av_packet_copy_props(opkt, in);
     if (ret < 0)
         goto fail;
 
 fail:
     if (ret < 0)
-        av_packet_unref(out);
+        av_packet_unref(opkt);
     av_packet_free(&in);
 
     return ret;
diff --git a/libavcodec/h264_parse.c b/libavcodec/h264_parse.c
index 34ffe3b..352ffea 100644
--- a/libavcodec/h264_parse.c
+++ b/libavcodec/h264_parse.c
@@ -242,18 +242,23 @@
                 ref_count[1] = 1;
         }
 
-        if (ref_count[0] - 1 > max[0] || ref_count[1] - 1 > max[1]) {
+        if (slice_type_nos == AV_PICTURE_TYPE_B)
+            list_count = 2;
+        else
+            list_count = 1;
+
+        if (ref_count[0] - 1 > max[0] || (list_count == 2 && (ref_count[1] - 1 > max[1]))) {
             av_log(logctx, AV_LOG_ERROR, "reference overflow %u > %u or %u > %u\n",
                    ref_count[0] - 1, max[0], ref_count[1] - 1, max[1]);
             ref_count[0] = ref_count[1] = 0;
             *plist_count = 0;
             goto fail;
+        } else if (ref_count[1] - 1 > max[1]) {
+            av_log(logctx, AV_LOG_DEBUG, "reference overflow %u > %u \n",
+                   ref_count[1] - 1, max[1]);
+            ref_count[1] = 0;
         }
 
-        if (slice_type_nos == AV_PICTURE_TYPE_B)
-            list_count = 2;
-        else
-            list_count = 1;
     } else {
         list_count   = 0;
         ref_count[0] = ref_count[1] = 0;
@@ -282,6 +287,8 @@
 
     if (sps->poc_type == 0) {
         const int max_poc_lsb = 1 << sps->log2_max_poc_lsb;
+        if (pc->prev_poc_lsb < 0)
+            pc->prev_poc_lsb =  pc->poc_lsb;
 
         if (pc->poc_lsb < pc->prev_poc_lsb &&
             pc->prev_poc_lsb - pc->poc_lsb >= max_poc_lsb / 2)
@@ -296,7 +303,8 @@
         if (picture_structure == PICT_FRAME)
             field_poc[1] += pc->delta_poc_bottom;
     } else if (sps->poc_type == 1) {
-        int abs_frame_num, expected_delta_per_poc_cycle, expectedpoc;
+        int abs_frame_num;
+        int64_t expected_delta_per_poc_cycle, expectedpoc;
         int i;
 
         if (sps->poc_cycle_length != 0)
@@ -359,7 +367,7 @@
     H2645Packet pkt = { 0 };
     int i, ret = 0;
 
-    ret = ff_h2645_packet_split(&pkt, data, size, logctx, is_avc, 2, AV_CODEC_ID_H264, 1);
+    ret = ff_h2645_packet_split(&pkt, data, size, logctx, is_avc, 2, AV_CODEC_ID_H264, 1, 0);
     if (ret < 0) {
         ret = 0;
         goto fail;
@@ -368,11 +376,22 @@
     for (i = 0; i < pkt.nb_nals; i++) {
         H2645NAL *nal = &pkt.nals[i];
         switch (nal->type) {
-        case H264_NAL_SPS:
-            ret = ff_h264_decode_seq_parameter_set(&nal->gb, logctx, ps, 0);
+        case H264_NAL_SPS: {
+            GetBitContext tmp_gb = nal->gb;
+            ret = ff_h264_decode_seq_parameter_set(&tmp_gb, logctx, ps, 0);
+            if (ret >= 0)
+                break;
+            av_log(logctx, AV_LOG_DEBUG,
+                   "SPS decoding failure, trying again with the complete NAL\n");
+            init_get_bits8(&tmp_gb, nal->raw_data + 1, nal->raw_size - 1);
+            ret = ff_h264_decode_seq_parameter_set(&tmp_gb, logctx, ps, 0);
+            if (ret >= 0)
+                break;
+            ret = ff_h264_decode_seq_parameter_set(&nal->gb, logctx, ps, 1);
             if (ret < 0)
                 goto fail;
             break;
+        }
         case H264_NAL_PPS:
             ret = ff_h264_decode_picture_parameter_set(&nal->gb, logctx, ps,
                                                        nal->size_bits);
diff --git a/libavcodec/h264_parser.c b/libavcodec/h264_parser.c
index 5f9a9c4..aacd44c 100644
--- a/libavcodec/h264_parser.c
+++ b/libavcodec/h264_parser.c
@@ -361,26 +361,14 @@
             }
 
             av_buffer_unref(&p->ps.pps_ref);
-            av_buffer_unref(&p->ps.sps_ref);
             p->ps.pps = NULL;
             p->ps.sps = NULL;
             p->ps.pps_ref = av_buffer_ref(p->ps.pps_list[pps_id]);
             if (!p->ps.pps_ref)
                 goto fail;
             p->ps.pps = (const PPS*)p->ps.pps_ref->data;
-
-            if (!p->ps.sps_list[p->ps.pps->sps_id]) {
-                av_log(avctx, AV_LOG_ERROR,
-                       "non-existing SPS %u referenced\n", p->ps.pps->sps_id);
-                goto fail;
-            }
-
-            p->ps.sps_ref = av_buffer_ref(p->ps.sps_list[p->ps.pps->sps_id]);
-            if (!p->ps.sps_ref)
-                goto fail;
-            p->ps.sps = (const SPS*)p->ps.sps_ref->data;
-
-            sps = p->ps.sps;
+            p->ps.sps = p->ps.pps->sps;
+            sps       = p->ps.sps;
 
             // heuristic to detect non marked keyframes
             if (p->ps.sps->ref_frame_count <= 1 && p->ps.pps->ref_count[0] <= 1 && s->pict_type == AV_PICTURE_TYPE_I)
@@ -481,6 +469,15 @@
                 }
             }
 
+            if (p->sei.picture_timing.present) {
+                ret = ff_h264_sei_process_picture_timing(&p->sei.picture_timing,
+                                                         sps, avctx);
+                if (ret < 0) {
+                    av_log(avctx, AV_LOG_ERROR, "Error processing the picture timing SEI\n");
+                    p->sei.picture_timing.present = 0;
+                }
+            }
+
             if (sps->pic_struct_present_flag && p->sei.picture_timing.present) {
                 switch (p->sei.picture_timing.pic_struct) {
                 case H264_SEI_PIC_STRUCT_TOP_FIELD:
diff --git a/libavcodec/h264_picture.c b/libavcodec/h264_picture.c
index e833835..2113947 100644
--- a/libavcodec/h264_picture.c
+++ b/libavcodec/h264_picture.c
@@ -27,7 +27,6 @@
 
 #include "libavutil/avassert.h"
 #include "libavutil/imgutils.h"
-#include "libavutil/timer.h"
 #include "internal.h"
 #include "cabac.h"
 #include "cabac_functions.h"
diff --git a/libavcodec/h264_ps.c b/libavcodec/h264_ps.c
index 17bfa78..e774929 100644
--- a/libavcodec/h264_ps.c
+++ b/libavcodec/h264_ps.c
@@ -104,14 +104,14 @@
     av_buffer_unref(&s->sps_list[id]);
 }
 
-static inline int decode_hrd_parameters(GetBitContext *gb, AVCodecContext *avctx,
+static inline int decode_hrd_parameters(GetBitContext *gb, void *logctx,
                                         SPS *sps)
 {
     int cpb_count, i;
     cpb_count = get_ue_golomb_31(gb) + 1;
 
     if (cpb_count > 32U) {
-        av_log(avctx, AV_LOG_ERROR, "cpb_count %d invalid\n", cpb_count);
+        av_log(logctx, AV_LOG_ERROR, "cpb_count %d invalid\n", cpb_count);
         return AVERROR_INVALIDDATA;
     }
 
@@ -130,7 +130,7 @@
     return 0;
 }
 
-static inline int decode_vui_parameters(GetBitContext *gb, AVCodecContext *avctx,
+static inline int decode_vui_parameters(GetBitContext *gb, void *logctx,
                                         SPS *sps)
 {
     int aspect_ratio_info_present_flag;
@@ -146,7 +146,7 @@
         } else if (aspect_ratio_idc < FF_ARRAY_ELEMS(ff_h264_pixel_aspect)) {
             sps->sar = ff_h264_pixel_aspect[aspect_ratio_idc];
         } else {
-            av_log(avctx, AV_LOG_ERROR, "illegal aspect ratio\n");
+            av_log(logctx, AV_LOG_ERROR, "illegal aspect ratio\n");
             return AVERROR_INVALIDDATA;
         }
     } else {
@@ -181,12 +181,13 @@
     /* chroma_location_info_present_flag */
     if (get_bits1(gb)) {
         /* chroma_sample_location_type_top_field */
-        avctx->chroma_sample_location = get_ue_golomb(gb) + 1;
+        sps->chroma_location = get_ue_golomb(gb) + 1;
         get_ue_golomb(gb);  /* chroma_sample_location_type_bottom_field */
-    }
+    } else
+        sps->chroma_location = AVCHROMA_LOC_LEFT;
 
     if (show_bits1(gb) && get_bits_left(gb) < 10) {
-        av_log(avctx, AV_LOG_WARNING, "Truncated VUI\n");
+        av_log(logctx, AV_LOG_WARNING, "Truncated VUI (%d)\n", get_bits_left(gb));
         return 0;
     }
 
@@ -195,7 +196,7 @@
         unsigned num_units_in_tick = get_bits_long(gb, 32);
         unsigned time_scale        = get_bits_long(gb, 32);
         if (!num_units_in_tick || !time_scale) {
-            av_log(avctx, AV_LOG_ERROR,
+            av_log(logctx, AV_LOG_ERROR,
                    "time_scale/num_units_in_tick invalid or unsupported (%u/%u)\n",
                    time_scale, num_units_in_tick);
             sps->timing_info_present_flag = 0;
@@ -208,11 +209,11 @@
 
     sps->nal_hrd_parameters_present_flag = get_bits1(gb);
     if (sps->nal_hrd_parameters_present_flag)
-        if (decode_hrd_parameters(gb, avctx, sps) < 0)
+        if (decode_hrd_parameters(gb, logctx, sps) < 0)
             return AVERROR_INVALIDDATA;
     sps->vcl_hrd_parameters_present_flag = get_bits1(gb);
     if (sps->vcl_hrd_parameters_present_flag)
-        if (decode_hrd_parameters(gb, avctx, sps) < 0)
+        if (decode_hrd_parameters(gb, logctx, sps) < 0)
             return AVERROR_INVALIDDATA;
     if (sps->nal_hrd_parameters_present_flag ||
         sps->vcl_hrd_parameters_present_flag)
@@ -237,7 +238,7 @@
 
         if (sps->num_reorder_frames > 16U
             /* max_dec_frame_buffering || max_dec_frame_buffering > 16 */) {
-            av_log(avctx, AV_LOG_ERROR,
+            av_log(logctx, AV_LOG_ERROR,
                    "Clipping illegal num_reorder_frames %d\n",
                    sps->num_reorder_frames);
             sps->num_reorder_frames = 16;
@@ -323,7 +324,6 @@
     for (i = 0; i < MAX_PPS_COUNT; i++)
         av_buffer_unref(&ps->pps_list[i]);
 
-    av_buffer_unref(&ps->sps_ref);
     av_buffer_unref(&ps->pps_ref);
 
     ps->pps = NULL;
@@ -449,8 +449,17 @@
         sps->log2_max_poc_lsb = t + 4;
     } else if (sps->poc_type == 1) { // FIXME #define
         sps->delta_pic_order_always_zero_flag = get_bits1(gb);
-        sps->offset_for_non_ref_pic           = get_se_golomb(gb);
-        sps->offset_for_top_to_bottom_field   = get_se_golomb(gb);
+        sps->offset_for_non_ref_pic           = get_se_golomb_long(gb);
+        sps->offset_for_top_to_bottom_field   = get_se_golomb_long(gb);
+
+        if (   sps->offset_for_non_ref_pic         == INT32_MIN
+            || sps->offset_for_top_to_bottom_field == INT32_MIN
+        ) {
+            av_log(avctx, AV_LOG_ERROR,
+                   "offset_for_non_ref_pic or offset_for_top_to_bottom_field is out of range\n");
+            goto fail;
+        }
+
         sps->poc_cycle_length                 = get_ue_golomb(gb);
 
         if ((unsigned)sps->poc_cycle_length >=
@@ -460,8 +469,14 @@
             goto fail;
         }
 
-        for (i = 0; i < sps->poc_cycle_length; i++)
-            sps->offset_for_ref_frame[i] = get_se_golomb(gb);
+        for (i = 0; i < sps->poc_cycle_length; i++) {
+            sps->offset_for_ref_frame[i] = get_se_golomb_long(gb);
+            if (sps->offset_for_ref_frame[i] == INT32_MIN) {
+                av_log(avctx, AV_LOG_ERROR,
+                       "offset_for_ref_frame is out of range\n");
+                goto fail;
+            }
+        }
     } else if (sps->poc_type != 2) {
         av_log(avctx, AV_LOG_ERROR, "illegal POC type %d\n", sps->poc_type);
         goto fail;
@@ -564,7 +579,8 @@
     }
 
     if (get_bits_left(gb) < 0) {
-        av_log(avctx, ignore_truncation ? AV_LOG_WARNING : AV_LOG_ERROR,
+        av_log_once(avctx, ignore_truncation ? AV_LOG_WARNING : AV_LOG_ERROR, AV_LOG_DEBUG,
+                    &ps->overread_warning_printed[sps->vui_parameters_present_flag],
                "Overread %s by %d bits\n", sps->vui_parameters_present_flag ? "VUI" : "SPS", -get_bits_left(gb));
         if (!ignore_truncation)
             goto fail;
@@ -721,6 +737,15 @@
     return 1;
 }
 
+static void pps_free(void *opaque, uint8_t *data)
+{
+    PPS *pps = (PPS*)data;
+
+    av_buffer_unref(&pps->sps_ref);
+
+    av_freep(&data);
+}
+
 int ff_h264_decode_picture_parameter_set(GetBitContext *gb, AVCodecContext *avctx,
                                          H264ParamSets *ps, int bit_length)
 {
@@ -737,10 +762,15 @@
         return AVERROR_INVALIDDATA;
     }
 
-    pps_buf = av_buffer_allocz(sizeof(*pps));
-    if (!pps_buf)
+    pps = av_mallocz(sizeof(*pps));
+    if (!pps)
         return AVERROR(ENOMEM);
-    pps = (PPS*)pps_buf->data;
+    pps_buf = av_buffer_create((uint8_t*)pps, sizeof(*pps),
+                               pps_free, NULL, 0);
+    if (!pps_buf) {
+        av_freep(&pps);
+        return AVERROR(ENOMEM);
+    }
 
     pps->data_size = gb->buffer_end - gb->buffer;
     if (pps->data_size > sizeof(pps->data)) {
@@ -758,7 +788,14 @@
         ret = AVERROR_INVALIDDATA;
         goto fail;
     }
-    sps = (const SPS*)ps->sps_list[pps->sps_id]->data;
+    pps->sps_ref = av_buffer_ref(ps->sps_list[pps->sps_id]);
+    if (!pps->sps_ref) {
+        ret = AVERROR(ENOMEM);
+        goto fail;
+    }
+    pps->sps = (const SPS*)pps->sps_ref->data;
+    sps      = pps->sps;
+
     if (sps->bit_depth_luma > 14) {
         av_log(avctx, AV_LOG_ERROR,
                "Invalid luma bit depth=%d\n",
@@ -778,7 +815,9 @@
     pps->slice_group_count = get_ue_golomb(gb) + 1;
     if (pps->slice_group_count > 1) {
         pps->mb_slice_group_map_type = get_ue_golomb(gb);
-        av_log(avctx, AV_LOG_ERROR, "FMO not supported\n");
+        avpriv_report_missing_feature(avctx, "FMO");
+        ret = AVERROR_PATCHWELCOME;
+        goto fail;
     }
     pps->ref_count[0] = get_ue_golomb(gb) + 1;
     pps->ref_count[1] = get_ue_golomb(gb) + 1;
diff --git a/libavcodec/h264_ps.h b/libavcodec/h264_ps.h
index e967b9c..3f1ab72 100644
--- a/libavcodec/h264_ps.h
+++ b/libavcodec/h264_ps.h
@@ -77,11 +77,13 @@
     enum AVColorPrimaries color_primaries;
     enum AVColorTransferCharacteristic color_trc;
     enum AVColorSpace colorspace;
+    enum AVChromaLocation chroma_location;
+
     int timing_info_present_flag;
     uint32_t num_units_in_tick;
     uint32_t time_scale;
     int fixed_frame_rate_flag;
-    short offset_for_ref_frame[256]; // FIXME dyn aloc?
+    int32_t offset_for_ref_frame[256];
     int bitstream_restriction_flag;
     int num_reorder_frames;
     int scaling_matrix_present;
@@ -133,6 +135,9 @@
     uint32_t dequant8_buffer[6][QP_MAX_NUM + 1][64];
     uint32_t(*dequant4_coeff[6])[16];
     uint32_t(*dequant8_coeff[6])[64];
+
+    AVBufferRef *sps_ref;
+    const SPS   *sps;
 } PPS;
 
 typedef struct H264ParamSets {
@@ -140,10 +145,11 @@
     AVBufferRef *pps_list[MAX_PPS_COUNT];
 
     AVBufferRef *pps_ref;
-    AVBufferRef *sps_ref;
     /* currently active parameters sets */
     const PPS *pps;
     const SPS *sps;
+
+    int overread_warning_printed[2];
 } H264ParamSets;
 
 /**
diff --git a/libavcodec/h264_redundant_pps_bsf.c b/libavcodec/h264_redundant_pps_bsf.c
index cc5a306..8405738 100644
--- a/libavcodec/h264_redundant_pps_bsf.c
+++ b/libavcodec/h264_redundant_pps_bsf.c
@@ -66,21 +66,20 @@
     return 0;
 }
 
-static int h264_redundant_pps_filter(AVBSFContext *bsf, AVPacket *out)
+static int h264_redundant_pps_filter(AVBSFContext *bsf, AVPacket *pkt)
 {
     H264RedundantPPSContext *ctx = bsf->priv_data;
-    AVPacket *in;
     CodedBitstreamFragment *au = &ctx->access_unit;
     int au_has_sps;
     int err, i;
 
-    err = ff_bsf_get_packet(bsf, &in);
+    err = ff_bsf_get_packet_ref(bsf, pkt);
     if (err < 0)
         return err;
 
-    err = ff_cbs_read_packet(ctx->input, au, in);
+    err = ff_cbs_read_packet(ctx->input, au, pkt);
     if (err < 0)
-        return err;
+        goto fail;
 
     au_has_sps = 0;
     for (i = 0; i < au->nb_units; i++) {
@@ -89,11 +88,15 @@
         if (nal->type == H264_NAL_SPS)
             au_has_sps = 1;
         if (nal->type == H264_NAL_PPS) {
-            h264_redundant_pps_fixup_pps(ctx, nal->content);
+            err = h264_redundant_pps_fixup_pps(ctx, nal->content);
+            if (err < 0)
+                goto fail;
             if (!au_has_sps) {
-                av_log(ctx, AV_LOG_VERBOSE, "Deleting redundant PPS "
-                       "at %"PRId64".\n", in->pts);
+                av_log(bsf, AV_LOG_VERBOSE, "Deleting redundant PPS "
+                       "at %"PRId64".\n", pkt->pts);
                 ff_cbs_delete_unit(ctx->input, au, i);
+                i--;
+                continue;
             }
         }
         if (nal->type == H264_NAL_SLICE ||
@@ -103,19 +106,17 @@
         }
     }
 
-    err = ff_cbs_write_packet(ctx->output, out, au);
+    err = ff_cbs_write_packet(ctx->output, pkt, au);
     if (err < 0)
-        return err;
+        goto fail;
 
-    ff_cbs_fragment_uninit(ctx->output, au);
-
-    err = av_packet_copy_props(out, in);
+    err = 0;
+fail:
+    ff_cbs_fragment_reset(ctx->output, au);
     if (err < 0)
-        return err;
+        av_packet_unref(pkt);
 
-    av_packet_free(&in);
-
-    return 0;
+    return err;
 }
 
 static int h264_redundant_pps_init(AVBSFContext *bsf)
@@ -138,25 +139,29 @@
         err = ff_cbs_read_extradata(ctx->input, au, bsf->par_in);
         if (err < 0) {
             av_log(bsf, AV_LOG_ERROR, "Failed to read extradata.\n");
-            return err;
+            goto fail;
         }
 
         for (i = 0; i < au->nb_units; i++) {
-            if (au->units[i].type == H264_NAL_PPS)
-                h264_redundant_pps_fixup_pps(ctx, au->units[i].content);
+            if (au->units[i].type == H264_NAL_PPS) {
+                err = h264_redundant_pps_fixup_pps(ctx, au->units[i].content);
+                if (err < 0)
+                    goto fail;
+            }
         }
 
         ctx->extradata_pic_init_qp = ctx->current_pic_init_qp;
         err = ff_cbs_write_extradata(ctx->output, bsf->par_out, au);
         if (err < 0) {
             av_log(bsf, AV_LOG_ERROR, "Failed to write extradata.\n");
-            return err;
+            goto fail;
         }
-
-        ff_cbs_fragment_uninit(ctx->output, au);
     }
 
-    return 0;
+    err = 0;
+fail:
+    ff_cbs_fragment_reset(ctx->output, au);
+    return err;
 }
 
 static void h264_redundant_pps_flush(AVBSFContext *bsf)
@@ -168,6 +173,8 @@
 static void h264_redundant_pps_close(AVBSFContext *bsf)
 {
     H264RedundantPPSContext *ctx = bsf->priv_data;
+
+    ff_cbs_fragment_free(ctx->input, &ctx->access_unit);
     ff_cbs_close(&ctx->input);
     ff_cbs_close(&ctx->output);
 }
diff --git a/libavcodec/h264_refs.c b/libavcodec/h264_refs.c
index eaf965e..dae8bd2 100644
--- a/libavcodec/h264_refs.c
+++ b/libavcodec/h264_refs.c
@@ -373,9 +373,11 @@
                 av_assert0(0);
             }
 
-            if (i < 0) {
+            if (i < 0 || mismatches_ref(h, ref)) {
                 av_log(h->avctx, AV_LOG_ERROR,
-                       "reference picture missing during reorder\n");
+                       i < 0 ? "reference picture missing during reorder\n" :
+                               "mismatching reference\n"
+                      );
                 memset(&sl->ref_list[list][index], 0, sizeof(sl->ref_list[0][0])); // FIXME
             } else {
                 for (i = index; i + 1 < sl->ref_count[list]; i++) {
@@ -730,7 +732,7 @@
             for (j = 0; j < MAX_DELAYED_PIC_COUNT; j++)
                 h->last_pocs[j] = INT_MIN;
             break;
-        default: assert(0);
+        default: av_assert0(0);
         }
     }
 
@@ -866,6 +868,7 @@
                         av_log(logctx, AV_LOG_ERROR,
                                "illegal long ref in memory management control "
                                "operation %d\n", opcode);
+                        sl->nb_mmco = i;
                         return -1;
                     }
                     mmco[i].long_arg = long_arg;
@@ -875,6 +878,7 @@
                     av_log(logctx, AV_LOG_ERROR,
                            "illegal memory management control operation %d\n",
                            opcode);
+                    sl->nb_mmco = i;
                     return -1;
                 }
                 if (opcode == MMCO_END)
diff --git a/libavcodec/h264_sei.c b/libavcodec/h264_sei.c
index 43593d3..870dd90 100644
--- a/libavcodec/h264_sei.c
+++ b/libavcodec/h264_sei.c
@@ -54,64 +54,62 @@
     av_buffer_unref(&h->a53_caption.buf_ref);
 }
 
-static int decode_picture_timing(H264SEIPictureTiming *h, GetBitContext *gb,
-                                 const H264ParamSets *ps, void *logctx)
+int ff_h264_sei_process_picture_timing(H264SEIPictureTiming *h, const SPS *sps,
+                                       void *logctx)
 {
-    int i;
-    const SPS *sps = ps->sps;
+    GetBitContext gb;
 
-    for (i = 0; i<MAX_SPS_COUNT; i++)
-        if ((!sps || !sps->log2_max_frame_num) && ps->sps_list[i])
-            sps = (const SPS *)ps->sps_list[i]->data;
-
-    if (!sps) {
-        av_log(logctx, AV_LOG_ERROR, "SPS unavailable in decode_picture_timing\n");
-        return AVERROR_PS_NOT_FOUND;
-    }
+    init_get_bits(&gb, h->payload, h->payload_size_bits);
 
     if (sps->nal_hrd_parameters_present_flag ||
         sps->vcl_hrd_parameters_present_flag) {
-        h->cpb_removal_delay = get_bits_long(gb, sps->cpb_removal_delay_length);
-        h->dpb_output_delay  = get_bits_long(gb, sps->dpb_output_delay_length);
+        h->cpb_removal_delay = get_bits_long(&gb, sps->cpb_removal_delay_length);
+        h->dpb_output_delay  = get_bits_long(&gb, sps->dpb_output_delay_length);
     }
     if (sps->pic_struct_present_flag) {
         unsigned int i, num_clock_ts;
 
-        h->pic_struct = get_bits(gb, 4);
+        h->pic_struct = get_bits(&gb, 4);
         h->ct_type    = 0;
 
         if (h->pic_struct > H264_SEI_PIC_STRUCT_FRAME_TRIPLING)
             return AVERROR_INVALIDDATA;
 
         num_clock_ts = sei_num_clock_ts_table[h->pic_struct];
-
+        h->timecode_cnt = 0;
         for (i = 0; i < num_clock_ts; i++) {
-            if (get_bits(gb, 1)) {                /* clock_timestamp_flag */
+            if (get_bits(&gb, 1)) {                      /* clock_timestamp_flag */
+                H264SEITimeCode *tc = &h->timecode[h->timecode_cnt++];
                 unsigned int full_timestamp_flag;
-
-                h->ct_type |= 1 << get_bits(gb, 2);
-                skip_bits(gb, 1);                 /* nuit_field_based_flag */
-                skip_bits(gb, 5);                 /* counting_type */
-                full_timestamp_flag = get_bits(gb, 1);
-                skip_bits(gb, 1);                 /* discontinuity_flag */
-                skip_bits(gb, 1);                 /* cnt_dropped_flag */
-                skip_bits(gb, 8);                 /* n_frames */
+                unsigned int counting_type, cnt_dropped_flag;
+                h->ct_type |= 1 << get_bits(&gb, 2);
+                skip_bits(&gb, 1);                       /* nuit_field_based_flag */
+                counting_type = get_bits(&gb, 5);        /* counting_type */
+                full_timestamp_flag = get_bits(&gb, 1);
+                skip_bits(&gb, 1);                       /* discontinuity_flag */
+                cnt_dropped_flag = get_bits(&gb, 1);      /* cnt_dropped_flag */
+                if (cnt_dropped_flag && counting_type > 1 && counting_type < 7)
+                    tc->dropframe = 1;
+                tc->frame = get_bits(&gb, 8);         /* n_frames */
                 if (full_timestamp_flag) {
-                    skip_bits(gb, 6);             /* seconds_value 0..59 */
-                    skip_bits(gb, 6);             /* minutes_value 0..59 */
-                    skip_bits(gb, 5);             /* hours_value 0..23 */
+                    tc->full = 1;
+                    tc->seconds = get_bits(&gb, 6); /* seconds_value 0..59 */
+                    tc->minutes = get_bits(&gb, 6); /* minutes_value 0..59 */
+                    tc->hours = get_bits(&gb, 5);   /* hours_value 0..23 */
                 } else {
-                    if (get_bits(gb, 1)) {        /* seconds_flag */
-                        skip_bits(gb, 6);         /* seconds_value range 0..59 */
-                        if (get_bits(gb, 1)) {    /* minutes_flag */
-                            skip_bits(gb, 6);     /* minutes_value 0..59 */
-                            if (get_bits(gb, 1))  /* hours_flag */
-                                skip_bits(gb, 5); /* hours_value 0..23 */
+                    tc->seconds = tc->minutes = tc->hours = tc->full = 0;
+                    if (get_bits(&gb, 1)) {             /* seconds_flag */
+                        tc->seconds = get_bits(&gb, 6);
+                        if (get_bits(&gb, 1)) {         /* minutes_flag */
+                            tc->minutes = get_bits(&gb, 6);
+                            if (get_bits(&gb, 1))       /* hours_flag */
+                                tc->hours = get_bits(&gb, 5);
                         }
                     }
                 }
+
                 if (sps->time_offset_length > 0)
-                    skip_bits(gb,
+                    skip_bits(&gb,
                               sps->time_offset_length); /* time_offset */
             }
         }
@@ -120,6 +118,28 @@
                h->ct_type, h->pic_struct);
     }
 
+    return 0;
+}
+
+static int decode_picture_timing(H264SEIPictureTiming *h, GetBitContext *gb,
+                                 void *logctx)
+{
+    int index     = get_bits_count(gb);
+    int size_bits = get_bits_left(gb);
+    int size      = (size_bits + 7) / 8;
+
+    if (index & 7) {
+        av_log(logctx, AV_LOG_ERROR, "Unaligned SEI payload\n");
+        return AVERROR_INVALIDDATA;
+    }
+    if (size > sizeof(h->payload)) {
+        av_log(logctx, AV_LOG_ERROR, "Picture timing SEI payload too large\n");
+        return AVERROR_INVALIDDATA;
+    }
+    memcpy(h->payload, gb->buffer + index / 8, size);
+
+    h->payload_size_bits = size_bits;
+
     h->present = 1;
     return 0;
 }
@@ -241,14 +261,14 @@
     uint8_t *user_data;
     int e, build, i;
 
-    if (size < 16 || size >= INT_MAX - 16)
+    if (size < 16 || size >= INT_MAX - 1)
         return AVERROR_INVALIDDATA;
 
-    user_data = av_malloc(16 + size + 1);
+    user_data = av_malloc(size + 1);
     if (!user_data)
         return AVERROR(ENOMEM);
 
-    for (i = 0; i < size + 16; i++)
+    for (i = 0; i < size; i++)
         user_data[i] = get_bits(gb, 8);
 
     user_data[i] = 0;
@@ -401,9 +421,9 @@
     int master_ret = 0;
 
     while (get_bits_left(gb) > 16 && show_bits(gb, 16)) {
+        GetBitContext gb_payload;
         int type = 0;
         unsigned size = 0;
-        unsigned next;
         int ret  = 0;
 
         do {
@@ -423,35 +443,38 @@
                    type, 8*size, get_bits_left(gb));
             return AVERROR_INVALIDDATA;
         }
-        next = get_bits_count(gb) + 8 * size;
+
+        ret = init_get_bits8(&gb_payload, gb->buffer + get_bits_count(gb) / 8, size);
+        if (ret < 0)
+            return ret;
 
         switch (type) {
         case H264_SEI_TYPE_PIC_TIMING: // Picture timing SEI
-            ret = decode_picture_timing(&h->picture_timing, gb, ps, logctx);
+            ret = decode_picture_timing(&h->picture_timing, &gb_payload, logctx);
             break;
         case H264_SEI_TYPE_USER_DATA_REGISTERED:
-            ret = decode_registered_user_data(h, gb, logctx, size);
+            ret = decode_registered_user_data(h, &gb_payload, logctx, size);
             break;
         case H264_SEI_TYPE_USER_DATA_UNREGISTERED:
-            ret = decode_unregistered_user_data(&h->unregistered, gb, logctx, size);
+            ret = decode_unregistered_user_data(&h->unregistered, &gb_payload, logctx, size);
             break;
         case H264_SEI_TYPE_RECOVERY_POINT:
-            ret = decode_recovery_point(&h->recovery_point, gb, logctx);
+            ret = decode_recovery_point(&h->recovery_point, &gb_payload, logctx);
             break;
         case H264_SEI_TYPE_BUFFERING_PERIOD:
-            ret = decode_buffering_period(&h->buffering_period, gb, ps, logctx);
+            ret = decode_buffering_period(&h->buffering_period, &gb_payload, ps, logctx);
             break;
         case H264_SEI_TYPE_FRAME_PACKING:
-            ret = decode_frame_packing_arrangement(&h->frame_packing, gb);
+            ret = decode_frame_packing_arrangement(&h->frame_packing, &gb_payload);
             break;
         case H264_SEI_TYPE_DISPLAY_ORIENTATION:
-            ret = decode_display_orientation(&h->display_orientation, gb);
+            ret = decode_display_orientation(&h->display_orientation, &gb_payload);
             break;
         case H264_SEI_TYPE_GREEN_METADATA:
-            ret = decode_green_metadata(&h->green_metadata, gb);
+            ret = decode_green_metadata(&h->green_metadata, &gb_payload);
             break;
         case H264_SEI_TYPE_ALTERNATIVE_TRANSFER:
-            ret = decode_alternative_transfer(&h->alternative_transfer, gb);
+            ret = decode_alternative_transfer(&h->alternative_transfer, &gb_payload);
             break;
         default:
             av_log(logctx, AV_LOG_DEBUG, "unknown SEI type %d\n", type);
@@ -461,10 +484,12 @@
         if (ret < 0)
             master_ret = ret;
 
-        skip_bits_long(gb, next - get_bits_count(gb));
+        if (get_bits_left(&gb_payload) < 0) {
+            av_log(logctx, AV_LOG_WARNING, "SEI type %d overread by %d bits\n",
+                   type, -get_bits_left(&gb_payload));
+        }
 
-        // FIXME check bits here
-        align_get_bits(gb);
+        skip_bits_long(gb, 8 * size);
     }
 
     return master_ret;
diff --git a/libavcodec/h264_sei.h b/libavcodec/h264_sei.h
index 5b7c8ef..f07a505 100644
--- a/libavcodec/h264_sei.h
+++ b/libavcodec/h264_sei.h
@@ -20,6 +20,7 @@
 #define AVCODEC_H264_SEI_H
 
 #include "get_bits.h"
+#include "h264_ps.h"
 
 /**
  * SEI message types
@@ -67,7 +68,22 @@
     H264_SEI_FPA_TYPE_2D                  = 6,
 } H264_SEI_FpaType;
 
+typedef struct H264SEITimeCode {
+    /* When not continuously receiving full timecodes, we have to reference
+       the previous timecode received */
+    int full;
+    int frame;
+    int seconds;
+    int minutes;
+    int hours;
+    int dropframe;
+} H264SEITimeCode;
+
 typedef struct H264SEIPictureTiming {
+    // maximum size of pic_timing according to the spec should be 274 bits
+    uint8_t payload[40];
+    int     payload_size_bits;
+
     int present;
     H264_SEI_PicStructType pic_struct;
 
@@ -87,6 +103,16 @@
      * cpb_removal_delay in picture timing SEI message, see H.264 C.1.2
      */
     int cpb_removal_delay;
+
+    /**
+     * Maximum three timecodes in a pic_timing SEI.
+     */
+    H264SEITimeCode timecode[3];
+
+    /**
+     * Number of timecode in use
+     */
+    int timecode_cnt;
 } H264SEIPictureTiming;
 
 typedef struct H264SEIAFD {
@@ -181,4 +207,10 @@
  */
 const char *ff_h264_sei_stereo_mode(const H264SEIFramePacking *h);
 
+/**
+ * Parse the contents of a picture timing message given an active SPS.
+ */
+int ff_h264_sei_process_picture_timing(H264SEIPictureTiming *h, const SPS *sps,
+                                       void *logctx);
+
 #endif /* AVCODEC_H264_SEI_H */
diff --git a/libavcodec/h264_slice.c b/libavcodec/h264_slice.c
index d09cee4..5a8a4a7 100644
--- a/libavcodec/h264_slice.c
+++ b/libavcodec/h264_slice.c
@@ -29,7 +29,6 @@
 #include "libavutil/display.h"
 #include "libavutil/imgutils.h"
 #include "libavutil/stereo3d.h"
-#include "libavutil/timer.h"
 #include "internal.h"
 #include "cabac.h"
 #include "cabac_functions.h"
@@ -334,7 +333,6 @@
     }
 
     av_buffer_unref(&h->ps.pps_ref);
-    av_buffer_unref(&h->ps.sps_ref);
     h->ps.pps = NULL;
     h->ps.sps = NULL;
     if (h1->ps.pps_ref) {
@@ -342,12 +340,7 @@
         if (!h->ps.pps_ref)
             return AVERROR(ENOMEM);
         h->ps.pps = (const PPS*)h->ps.pps_ref->data;
-    }
-    if (h1->ps.sps_ref) {
-        h->ps.sps_ref = av_buffer_ref(h1->ps.sps_ref);
-        if (!h->ps.sps_ref)
-            return AVERROR(ENOMEM);
-        h->ps.sps = (const SPS*)h->ps.sps_ref->data;
+        h->ps.sps = h->ps.pps->sps;
     }
 
     if (need_reinit || !inited) {
@@ -458,12 +451,6 @@
     H264Picture *pic;
     int i, ret;
     const int pixel_shift = h->pixel_shift;
-    int c[4] = {
-        1<<(h->ps.sps->bit_depth_luma-1),
-        1<<(h->ps.sps->bit_depth_chroma-1),
-        1<<(h->ps.sps->bit_depth_chroma-1),
-        -1
-    };
 
     if (!ff_thread_can_start_frame(h->avctx)) {
         av_log(h->avctx, AV_LOG_ERROR, "Attempt to start a frame outside SETUP state\n");
@@ -504,8 +491,6 @@
 
     if ((ret = alloc_picture(h, pic)) < 0)
         return ret;
-    if(!h->frame_recovered && !h->avctx->hwaccel)
-        ff_color_frame(pic->f, c);
 
     h->cur_pic_ptr = pic;
     ff_h264_unref_picture(h, &h->cur_pic);
@@ -678,7 +663,7 @@
             cur_poc = h->cur_pic_ptr->field_poc[h->picture_structure - 1];
         }
         if (sl->ref_count[0] == 1 && sl->ref_count[1] == 1 && !FRAME_MBAFF(h) &&
-            sl->ref_list[0][0].poc + (int64_t)sl->ref_list[1][0].poc == 2 * cur_poc) {
+            sl->ref_list[0][0].poc + (int64_t)sl->ref_list[1][0].poc == 2LL * cur_poc) {
             sl->pwt.use_weight        = 0;
             sl->pwt.use_weight_chroma = 0;
             return;
@@ -873,7 +858,7 @@
 }
 
 /* export coded and cropped frame dimensions to AVCodecContext */
-static int init_dimensions(H264Context *h)
+static void init_dimensions(H264Context *h)
 {
     const SPS *sps = (const SPS*)h->ps.sps;
     int cr = sps->crop_right;
@@ -911,8 +896,6 @@
     h->crop_left           = cl;
     h->crop_top            = ct;
     h->crop_bottom         = cb;
-
-    return 0;
 }
 
 static int h264_slice_header_init(H264Context *h)
@@ -1024,13 +1007,8 @@
         h->ps.pps = (const PPS*)h->ps.pps_ref->data;
     }
 
-    if (h->ps.sps != (const SPS*)h->ps.sps_list[h->ps.pps->sps_id]->data) {
-        av_buffer_unref(&h->ps.sps_ref);
-        h->ps.sps = NULL;
-        h->ps.sps_ref = av_buffer_ref(h->ps.sps_list[h->ps.pps->sps_id]);
-        if (!h->ps.sps_ref)
-            return AVERROR(ENOMEM);
-        h->ps.sps = (const SPS*)h->ps.sps_ref->data;
+    if (h->ps.sps != h->ps.pps->sps) {
+        h->ps.sps = (const SPS*)h->ps.pps->sps;
 
         if (h->mb_width  != h->ps.sps->mb_width ||
             h->mb_height != h->ps.sps->mb_height ||
@@ -1077,9 +1055,7 @@
         h->width  = 16 * h->mb_width;
         h->height = 16 * h->mb_height;
 
-        ret = init_dimensions(h);
-        if (ret < 0)
-            return ret;
+        init_dimensions(h);
 
         if (sps->video_signal_type_present_flag) {
             h->avctx->color_range = sps->full_range > 0 ? AVCOL_RANGE_JPEG
@@ -1092,7 +1068,14 @@
                 h->avctx->colorspace      = sps->colorspace;
             }
         }
+
+        if (h->sei.alternative_transfer.present &&
+            av_color_transfer_name(h->sei.alternative_transfer.preferred_transfer_characteristics) &&
+            h->sei.alternative_transfer.preferred_transfer_characteristics != AVCOL_TRC_UNSPECIFIED) {
+            h->avctx->color_trc = h->sei.alternative_transfer.preferred_transfer_characteristics;
+        }
     }
+    h->avctx->chroma_sample_location = sps->chroma_location;
 
     if (!h->context_initialized || must_reinit || needs_reinit) {
         int flush_changes = h->context_initialized;
@@ -1140,6 +1123,16 @@
     /* Signal interlacing information externally. */
     /* Prioritize picture timing SEI information over used
      * decoding process if it exists. */
+    if (h->sei.picture_timing.present) {
+        int ret = ff_h264_sei_process_picture_timing(&h->sei.picture_timing, sps,
+                                                     h->avctx);
+        if (ret < 0) {
+            av_log(h->avctx, AV_LOG_ERROR, "Error processing a picture timing SEI\n");
+            if (h->avctx->err_recognition & AV_EF_EXPLODE)
+                return ret;
+            h->sei.picture_timing.present = 0;
+        }
+    }
 
     if (sps->pic_struct_present_flag && h->sei.picture_timing.present) {
         H264SEIPictureTiming *pt = &h->sei.picture_timing;
@@ -1287,10 +1280,49 @@
         h->avctx->properties |= FF_CODEC_PROPERTY_CLOSED_CAPTIONS;
     }
 
-    if (h->sei.alternative_transfer.present &&
-        av_color_transfer_name(h->sei.alternative_transfer.preferred_transfer_characteristics) &&
-        h->sei.alternative_transfer.preferred_transfer_characteristics != AVCOL_TRC_UNSPECIFIED) {
-        h->avctx->color_trc = cur->f->color_trc = h->sei.alternative_transfer.preferred_transfer_characteristics;
+    if (h->sei.picture_timing.timecode_cnt > 0) {
+        uint32_t tc = 0;
+        uint32_t *tc_sd;
+
+        AVFrameSideData *tcside = av_frame_new_side_data(cur->f,
+                                                         AV_FRAME_DATA_S12M_TIMECODE,
+                                                         sizeof(uint32_t)*4);
+        if (!tcside)
+            return AVERROR(ENOMEM);
+
+        tc_sd = (uint32_t*)tcside->data;
+        tc_sd[0] = h->sei.picture_timing.timecode_cnt;
+
+        for (int i = 0; i < tc_sd[0]; i++) {
+            uint32_t frames;
+
+            /* For SMPTE 12-M timecodes, frame count is a special case if > 30 FPS.
+               See SMPTE ST 12-1:2014 Sec 12.1 for more info. */
+            if (av_cmp_q(h->avctx->framerate, (AVRational) {30, 1}) == 1) {
+                frames = h->sei.picture_timing.timecode[i].frame / 2;
+                if (h->sei.picture_timing.timecode[i].frame % 2 == 1) {
+                    if (av_cmp_q(h->avctx->framerate, (AVRational) {50, 1}) == 0)
+                        tc |= (1 << 7);
+                    else
+                        tc |= (1 << 23);
+                }
+            } else {
+                frames = h->sei.picture_timing.timecode[i].frame;
+            }
+
+            tc |= h->sei.picture_timing.timecode[i].dropframe << 30;
+            tc |= (frames / 10) << 28;
+            tc |= (frames % 10) << 24;
+            tc |= (h->sei.picture_timing.timecode[i].seconds / 10) << 20;
+            tc |= (h->sei.picture_timing.timecode[i].seconds % 10) << 16;
+            tc |= (h->sei.picture_timing.timecode[i].minutes / 10) << 12;
+            tc |= (h->sei.picture_timing.timecode[i].minutes % 10) << 8;
+            tc |= (h->sei.picture_timing.timecode[i].hours / 10) << 4;
+            tc |= (h->sei.picture_timing.timecode[i].hours % 10);
+
+            tc_sd[i + 1] = tc;
+        }
+        h->sei.picture_timing.timecode_cnt = 0;
     }
 
     return 0;
@@ -1537,6 +1569,13 @@
          * vectors.  Given we are concealing a lost frame, this probably
          * is not noticeable by comparison, but it should be fixed. */
         if (h->short_ref_count) {
+            int c[4] = {
+                1<<(h->ps.sps->bit_depth_luma-1),
+                1<<(h->ps.sps->bit_depth_chroma-1),
+                1<<(h->ps.sps->bit_depth_chroma-1),
+                -1
+            };
+
             if (prev &&
                 h->short_ref[0]->f->width == prev->f->width &&
                 h->short_ref[0]->f->height == prev->f->height &&
@@ -1552,7 +1591,8 @@
                               prev->f->width,
                               prev->f->height);
                 h->short_ref[0]->poc = prev->poc + 2;
-            }
+            } else if (!h->frame_recovered && !h->avctx->hwaccel)
+                ff_color_frame(h->short_ref[0]->f, c);
             h->short_ref[0]->frame_num = h->poc.prev_frame_num;
         }
     }
@@ -1728,13 +1768,7 @@
         return AVERROR_INVALIDDATA;
     }
     pps = (const PPS*)h->ps.pps_list[sl->pps_id]->data;
-
-    if (!h->ps.sps_list[pps->sps_id]) {
-        av_log(h->avctx, AV_LOG_ERROR,
-               "non-existing SPS %u referenced\n", pps->sps_id);
-        return AVERROR_INVALIDDATA;
-    }
-    sps = (const SPS*)h->ps.sps_list[pps->sps_id]->data;
+    sps = pps->sps;
 
     sl->frame_num = get_bits(&sl->gb, sps->log2_max_frame_num);
     if (!first_slice) {
@@ -2120,7 +2154,7 @@
             av_log(h->avctx, AV_LOG_ERROR, "PPS changed between slices\n");
             return AVERROR_INVALIDDATA;
         }
-        if (h->ps.sps != (const SPS*)h->ps.sps_list[h->ps.pps->sps_id]->data) {
+        if (h->ps.sps != pps->sps) {
             av_log(h->avctx, AV_LOG_ERROR,
                "SPS changed in the middle of the frame\n");
             return AVERROR_INVALIDDATA;
@@ -2576,7 +2610,6 @@
         ff_h264_init_cabac_states(h, sl);
 
         for (;;) {
-            // START_TIMER
             int ret, eos;
             if (sl->mb_x + sl->mb_y * h->mb_width >= sl->next_slice_idx) {
                 av_log(h->avctx, AV_LOG_ERROR, "Slice overlaps with next at %d\n",
@@ -2587,7 +2620,6 @@
             }
 
             ret = ff_h264_decode_mb_cabac(h, sl);
-            // STOP_TIMER("decode_mb_cabac")
 
             if (ret >= 0)
                 ff_h264_hl_decode_mb(h, sl);
diff --git a/libavcodec/h264dec.c b/libavcodec/h264dec.c
index 7b4c5c7..e374f32 100644
--- a/libavcodec/h264dec.c
+++ b/libavcodec/h264dec.c
@@ -32,7 +32,6 @@
 #include "libavutil/imgutils.h"
 #include "libavutil/opt.h"
 #include "libavutil/stereo3d.h"
-#include "libavutil/timer.h"
 #include "internal.h"
 #include "bytestream.h"
 #include "cabac.h"
@@ -310,7 +309,6 @@
     h->width_from_caller     = avctx->width;
     h->height_from_caller    = avctx->height;
 
-    h->picture_structure     = PICT_FRAME;
     h->workaround_bugs       = avctx->workaround_bugs;
     h->flags                 = avctx->flags;
     h->poc.prev_poc_msb      = 1 << 16;
@@ -326,8 +324,6 @@
 
     ff_h264_sei_uninit(&h->sei);
 
-    avctx->chroma_sample_location = AVCHROMA_LOC_LEFT;
-
     h->nb_slice_ctx = (avctx->active_thread_type & FF_THREAD_SLICE) ? avctx->thread_count : 1;
     h->slice_ctx = av_mallocz_array(h->nb_slice_ctx, sizeof(*h->slice_ctx));
     if (!h->slice_ctx) {
@@ -412,13 +408,21 @@
     }
     avctx->ticks_per_frame = 2;
 
-    if (avctx->extradata_size > 0 && avctx->extradata) {
-        ret = ff_h264_decode_extradata(avctx->extradata, avctx->extradata_size,
-                                       &h->ps, &h->is_avc, &h->nal_length_size,
-                                       avctx->err_recognition, avctx);
-        if (ret < 0) {
-            h264_decode_end(avctx);
-            return ret;
+    if (!avctx->internal->is_copy) {
+        if (avctx->extradata_size > 0 && avctx->extradata) {
+            ret = ff_h264_decode_extradata(avctx->extradata, avctx->extradata_size,
+                                           &h->ps, &h->is_avc, &h->nal_length_size,
+                                           avctx->err_recognition, avctx);
+           if (ret < 0) {
+               int explode = avctx->err_recognition & AV_EF_EXPLODE;
+               av_log(avctx, explode ? AV_LOG_ERROR: AV_LOG_WARNING,
+                      "Error decoding the extradata\n");
+               if (explode) {
+                   h264_decode_end(avctx);
+                   return ret;
+               }
+               ret = 0;
+           }
         }
     }
 
@@ -427,8 +431,6 @@
         h->avctx->has_b_frames = h->ps.sps->num_reorder_frames;
     }
 
-    avctx->internal->allocate_progress = 1;
-
     ff_h264_flush_change(h);
 
     if (h->enable_er < 0 && (avctx->active_thread_type & FF_THREAD_SLICE))
@@ -443,27 +445,6 @@
     return 0;
 }
 
-#if HAVE_THREADS
-static int decode_init_thread_copy(AVCodecContext *avctx)
-{
-    H264Context *h = avctx->priv_data;
-    int ret;
-
-    if (!avctx->internal->is_copy)
-        return 0;
-
-    memset(h, 0, sizeof(*h));
-
-    ret = h264_init_context(avctx, h);
-    if (ret < 0)
-        return ret;
-
-    h->context_initialized = 0;
-
-    return 0;
-}
-#endif
-
 /**
  * instantaneous decoder refresh.
  */
@@ -474,7 +455,7 @@
     h->poc.prev_frame_num        =
     h->poc.prev_frame_num_offset = 0;
     h->poc.prev_poc_msb          = 1<<16;
-    h->poc.prev_poc_lsb          = 0;
+    h->poc.prev_poc_lsb          = -1;
     for (i = 0; i < MAX_DELAYED_PIC_COUNT; i++)
         h->last_pocs[i] = INT_MIN;
 }
@@ -505,8 +486,7 @@
     h->mmco_reset = 1;
 }
 
-/* forget old pics after a seek */
-static void flush_dpb(AVCodecContext *avctx)
+static void h264_decode_flush(AVCodecContext *avctx)
 {
     H264Context *h = avctx->priv_data;
     int i;
@@ -622,8 +602,8 @@
             h->is_avc = 1;
     }
 
-    ret = ff_h2645_packet_split(&h->pkt, buf, buf_size, avctx, h->is_avc,
-                                h->nal_length_size, avctx->codec_id, avctx->flags2 & AV_CODEC_FLAG2_FAST);
+    ret = ff_h2645_packet_split(&h->pkt, buf, buf_size, avctx, h->is_avc, h->nal_length_size,
+                                avctx->codec_id, avctx->flags2 & AV_CODEC_FLAG2_FAST, 0);
     if (ret < 0) {
         av_log(avctx, AV_LOG_ERROR,
                "Error splitting the input into NAL units.\n");
@@ -657,11 +637,6 @@
                 goto end;
             }
             if(!idr_cleared) {
-                if (h->current_slice && (avctx->active_thread_type & FF_THREAD_SLICE)) {
-                    av_log(h, AV_LOG_ERROR, "invalid mixed IDR / non IDR frames cannot be decoded in slice multithreading mode\n");
-                    ret = AVERROR_INVALIDDATA;
-                    goto end;
-                }
                 idr(h); // FIXME ensure we don't lose some frames if there is reordering
             }
             idr_cleared = 1;
@@ -766,6 +741,11 @@
     if (ret < 0 && (h->avctx->err_recognition & AV_EF_EXPLODE))
         goto end;
 
+    // set decode_error_flags to allow users to detect concealed decoding errors
+    if ((ret < 0 || h->slice_ctx->er.error_occurred) && h->cur_pic_ptr) {
+        h->cur_pic_ptr->f->decode_error_flags |= FF_DECODE_ERROR_DECODE_SLICES;
+    }
+
     ret = 0;
 end:
 
@@ -782,9 +762,7 @@
      * past end by one (callers fault) and resync_mb_y != 0
      * causes problems for the first MB line, too.
      */
-    if (!FIELD_PICTURE(h) && h->current_slice &&
-        h->ps.sps == (const SPS*)h->ps.sps_list[h->ps.pps->sps_id]->data &&
-        h->enable_er) {
+    if (!FIELD_PICTURE(h) && h->current_slice && h->enable_er) {
 
         H264SliceContext *sl = h->slice_ctx;
         int use_last_pic = h->last_pic_for_ec.f->buf[0] && !sl->ref_count[0];
@@ -1083,9 +1061,9 @@
 #endif
                                NULL
                            },
-    .caps_internal         = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_EXPORTS_CROPPING,
-    .flush                 = flush_dpb,
-    .init_thread_copy      = ONLY_IF_THREADS_ENABLED(decode_init_thread_copy),
+    .caps_internal         = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_EXPORTS_CROPPING |
+                             FF_CODEC_CAP_ALLOCATE_PROGRESS,
+    .flush                 = h264_decode_flush,
     .update_thread_context = ONLY_IF_THREADS_ENABLED(ff_h264_update_thread_context),
     .profiles              = NULL_IF_CONFIG_SMALL(ff_h264_profiles),
     .priv_class            = &h264_class,
diff --git a/libavcodec/h264dec.h b/libavcodec/h264dec.h
index 1d97232..530e2d4 100644
--- a/libavcodec/h264dec.h
+++ b/libavcodec/h264dec.h
@@ -832,8 +832,6 @@
 
 void ff_h264_draw_horiz_band(const H264Context *h, H264SliceContext *sl, int y, int height);
 
-int ff_h264_decode_slice_header(H264Context *h, H264SliceContext *sl,
-                                const H2645NAL *nal);
 /**
  * Submit a slice for decoding.
  *
diff --git a/libavcodec/h264dsp.h b/libavcodec/h264dsp.h
index bcd76ab..cbea317 100644
--- a/libavcodec/h264dsp.h
+++ b/libavcodec/h264dsp.h
@@ -45,32 +45,32 @@
     h264_biweight_func biweight_h264_pixels_tab[4];
 
     /* loop filter */
-    void (*h264_v_loop_filter_luma)(uint8_t *pix /*align 16*/, int stride,
+    void (*h264_v_loop_filter_luma)(uint8_t *pix /*align 16*/, ptrdiff_t stride,
                                     int alpha, int beta, int8_t *tc0);
-    void (*h264_h_loop_filter_luma)(uint8_t *pix /*align 4 */, int stride,
+    void (*h264_h_loop_filter_luma)(uint8_t *pix /*align 4 */, ptrdiff_t stride,
                                     int alpha, int beta, int8_t *tc0);
-    void (*h264_h_loop_filter_luma_mbaff)(uint8_t *pix /*align 16*/, int stride,
+    void (*h264_h_loop_filter_luma_mbaff)(uint8_t *pix /*align 16*/, ptrdiff_t stride,
                                           int alpha, int beta, int8_t *tc0);
     /* v/h_loop_filter_luma_intra: align 16 */
-    void (*h264_v_loop_filter_luma_intra)(uint8_t *pix, int stride,
+    void (*h264_v_loop_filter_luma_intra)(uint8_t *pix, ptrdiff_t stride,
                                           int alpha, int beta);
-    void (*h264_h_loop_filter_luma_intra)(uint8_t *pix, int stride,
+    void (*h264_h_loop_filter_luma_intra)(uint8_t *pix, ptrdiff_t stride,
                                           int alpha, int beta);
     void (*h264_h_loop_filter_luma_mbaff_intra)(uint8_t *pix /*align 16*/,
-                                                int stride, int alpha, int beta);
-    void (*h264_v_loop_filter_chroma)(uint8_t *pix /*align 8*/, int stride,
+                                                ptrdiff_t stride, int alpha, int beta);
+    void (*h264_v_loop_filter_chroma)(uint8_t *pix /*align 8*/, ptrdiff_t stride,
                                       int alpha, int beta, int8_t *tc0);
-    void (*h264_h_loop_filter_chroma)(uint8_t *pix /*align 4*/, int stride,
+    void (*h264_h_loop_filter_chroma)(uint8_t *pix /*align 4*/, ptrdiff_t stride,
                                       int alpha, int beta, int8_t *tc0);
     void (*h264_h_loop_filter_chroma_mbaff)(uint8_t *pix /*align 8*/,
-                                            int stride, int alpha, int beta,
+                                            ptrdiff_t stride, int alpha, int beta,
                                             int8_t *tc0);
     void (*h264_v_loop_filter_chroma_intra)(uint8_t *pix /*align 8*/,
-                                            int stride, int alpha, int beta);
+                                            ptrdiff_t stride, int alpha, int beta);
     void (*h264_h_loop_filter_chroma_intra)(uint8_t *pix /*align 8*/,
-                                            int stride, int alpha, int beta);
+                                            ptrdiff_t stride, int alpha, int beta);
     void (*h264_h_loop_filter_chroma_mbaff_intra)(uint8_t *pix /*align 8*/,
-                                                  int stride, int alpha, int beta);
+                                                  ptrdiff_t stride, int alpha, int beta);
     // h264_loop_filter_strength: simd only. the C version is inlined in h264_loopfilter.c
     void (*h264_loop_filter_strength)(int16_t bS[2][4][4], uint8_t nnz[40],
                                       int8_t ref[2][40], int16_t mv[2][40][2],
diff --git a/libavcodec/h264dsp_template.c b/libavcodec/h264dsp_template.c
index 0288cc7..fe23a2c 100644
--- a/libavcodec/h264dsp_template.c
+++ b/libavcodec/h264dsp_template.c
@@ -101,7 +101,7 @@
 #undef op_scale2
 #undef H264_WEIGHT
 
-static av_always_inline av_flatten void FUNCC(h264_loop_filter_luma)(uint8_t *p_pix, int xstride, int ystride, int inner_iters, int alpha, int beta, int8_t *tc0)
+static av_always_inline av_flatten void FUNCC(h264_loop_filter_luma)(uint8_t *p_pix, ptrdiff_t xstride, ptrdiff_t ystride, int inner_iters, int alpha, int beta, int8_t *tc0)
 {
     pixel *pix = (pixel*)p_pix;
     int i, d;
@@ -149,20 +149,20 @@
         }
     }
 }
-static void FUNCC(h264_v_loop_filter_luma)(uint8_t *pix, int stride, int alpha, int beta, int8_t *tc0)
+static void FUNCC(h264_v_loop_filter_luma)(uint8_t *pix, ptrdiff_t stride, int alpha, int beta, int8_t *tc0)
 {
     FUNCC(h264_loop_filter_luma)(pix, stride, sizeof(pixel), 4, alpha, beta, tc0);
 }
-static void FUNCC(h264_h_loop_filter_luma)(uint8_t *pix, int stride, int alpha, int beta, int8_t *tc0)
+static void FUNCC(h264_h_loop_filter_luma)(uint8_t *pix, ptrdiff_t stride, int alpha, int beta, int8_t *tc0)
 {
     FUNCC(h264_loop_filter_luma)(pix, sizeof(pixel), stride, 4, alpha, beta, tc0);
 }
-static void FUNCC(h264_h_loop_filter_luma_mbaff)(uint8_t *pix, int stride, int alpha, int beta, int8_t *tc0)
+static void FUNCC(h264_h_loop_filter_luma_mbaff)(uint8_t *pix, ptrdiff_t stride, int alpha, int beta, int8_t *tc0)
 {
     FUNCC(h264_loop_filter_luma)(pix, sizeof(pixel), stride, 2, alpha, beta, tc0);
 }
 
-static av_always_inline av_flatten void FUNCC(h264_loop_filter_luma_intra)(uint8_t *p_pix, int xstride, int ystride, int inner_iters, int alpha, int beta)
+static av_always_inline av_flatten void FUNCC(h264_loop_filter_luma_intra)(uint8_t *p_pix, ptrdiff_t xstride, ptrdiff_t ystride, int inner_iters, int alpha, int beta)
 {
     pixel *pix = (pixel*)p_pix;
     int d;
@@ -215,20 +215,20 @@
         pix += ystride;
     }
 }
-static void FUNCC(h264_v_loop_filter_luma_intra)(uint8_t *pix, int stride, int alpha, int beta)
+static void FUNCC(h264_v_loop_filter_luma_intra)(uint8_t *pix, ptrdiff_t stride, int alpha, int beta)
 {
     FUNCC(h264_loop_filter_luma_intra)(pix, stride, sizeof(pixel), 4, alpha, beta);
 }
-static void FUNCC(h264_h_loop_filter_luma_intra)(uint8_t *pix, int stride, int alpha, int beta)
+static void FUNCC(h264_h_loop_filter_luma_intra)(uint8_t *pix, ptrdiff_t stride, int alpha, int beta)
 {
     FUNCC(h264_loop_filter_luma_intra)(pix, sizeof(pixel), stride, 4, alpha, beta);
 }
-static void FUNCC(h264_h_loop_filter_luma_mbaff_intra)(uint8_t *pix, int stride, int alpha, int beta)
+static void FUNCC(h264_h_loop_filter_luma_mbaff_intra)(uint8_t *pix, ptrdiff_t stride, int alpha, int beta)
 {
     FUNCC(h264_loop_filter_luma_intra)(pix, sizeof(pixel), stride, 2, alpha, beta);
 }
 
-static av_always_inline av_flatten void FUNCC(h264_loop_filter_chroma)(uint8_t *p_pix, int xstride, int ystride, int inner_iters, int alpha, int beta, int8_t *tc0)
+static av_always_inline av_flatten void FUNCC(h264_loop_filter_chroma)(uint8_t *p_pix, ptrdiff_t xstride, ptrdiff_t ystride, int inner_iters, int alpha, int beta, int8_t *tc0)
 {
     pixel *pix = (pixel*)p_pix;
     int i, d;
@@ -261,28 +261,28 @@
         }
     }
 }
-static void FUNCC(h264_v_loop_filter_chroma)(uint8_t *pix, int stride, int alpha, int beta, int8_t *tc0)
+static void FUNCC(h264_v_loop_filter_chroma)(uint8_t *pix, ptrdiff_t stride, int alpha, int beta, int8_t *tc0)
 {
     FUNCC(h264_loop_filter_chroma)(pix, stride, sizeof(pixel), 2, alpha, beta, tc0);
 }
-static void FUNCC(h264_h_loop_filter_chroma)(uint8_t *pix, int stride, int alpha, int beta, int8_t *tc0)
+static void FUNCC(h264_h_loop_filter_chroma)(uint8_t *pix, ptrdiff_t stride, int alpha, int beta, int8_t *tc0)
 {
     FUNCC(h264_loop_filter_chroma)(pix, sizeof(pixel), stride, 2, alpha, beta, tc0);
 }
-static void FUNCC(h264_h_loop_filter_chroma_mbaff)(uint8_t *pix, int stride, int alpha, int beta, int8_t *tc0)
+static void FUNCC(h264_h_loop_filter_chroma_mbaff)(uint8_t *pix, ptrdiff_t stride, int alpha, int beta, int8_t *tc0)
 {
     FUNCC(h264_loop_filter_chroma)(pix, sizeof(pixel), stride, 1, alpha, beta, tc0);
 }
-static void FUNCC(h264_h_loop_filter_chroma422)(uint8_t *pix, int stride, int alpha, int beta, int8_t *tc0)
+static void FUNCC(h264_h_loop_filter_chroma422)(uint8_t *pix, ptrdiff_t stride, int alpha, int beta, int8_t *tc0)
 {
     FUNCC(h264_loop_filter_chroma)(pix, sizeof(pixel), stride, 4, alpha, beta, tc0);
 }
-static void FUNCC(h264_h_loop_filter_chroma422_mbaff)(uint8_t *pix, int stride, int alpha, int beta, int8_t *tc0)
+static void FUNCC(h264_h_loop_filter_chroma422_mbaff)(uint8_t *pix, ptrdiff_t stride, int alpha, int beta, int8_t *tc0)
 {
     FUNCC(h264_loop_filter_chroma)(pix, sizeof(pixel), stride, 2, alpha, beta, tc0);
 }
 
-static av_always_inline av_flatten void FUNCC(h264_loop_filter_chroma_intra)(uint8_t *p_pix, int xstride, int ystride, int inner_iters, int alpha, int beta)
+static av_always_inline av_flatten void FUNCC(h264_loop_filter_chroma_intra)(uint8_t *p_pix, ptrdiff_t xstride, ptrdiff_t ystride, int inner_iters, int alpha, int beta)
 {
     pixel *pix = (pixel*)p_pix;
     int d;
@@ -306,23 +306,23 @@
         pix += ystride;
     }
 }
-static void FUNCC(h264_v_loop_filter_chroma_intra)(uint8_t *pix, int stride, int alpha, int beta)
+static void FUNCC(h264_v_loop_filter_chroma_intra)(uint8_t *pix, ptrdiff_t stride, int alpha, int beta)
 {
     FUNCC(h264_loop_filter_chroma_intra)(pix, stride, sizeof(pixel), 2, alpha, beta);
 }
-static void FUNCC(h264_h_loop_filter_chroma_intra)(uint8_t *pix, int stride, int alpha, int beta)
+static void FUNCC(h264_h_loop_filter_chroma_intra)(uint8_t *pix, ptrdiff_t stride, int alpha, int beta)
 {
     FUNCC(h264_loop_filter_chroma_intra)(pix, sizeof(pixel), stride, 2, alpha, beta);
 }
-static void FUNCC(h264_h_loop_filter_chroma_mbaff_intra)(uint8_t *pix, int stride, int alpha, int beta)
+static void FUNCC(h264_h_loop_filter_chroma_mbaff_intra)(uint8_t *pix, ptrdiff_t stride, int alpha, int beta)
 {
     FUNCC(h264_loop_filter_chroma_intra)(pix, sizeof(pixel), stride, 1, alpha, beta);
 }
-static void FUNCC(h264_h_loop_filter_chroma422_intra)(uint8_t *pix, int stride, int alpha, int beta)
+static void FUNCC(h264_h_loop_filter_chroma422_intra)(uint8_t *pix, ptrdiff_t stride, int alpha, int beta)
 {
     FUNCC(h264_loop_filter_chroma_intra)(pix, sizeof(pixel), stride, 4, alpha, beta);
 }
-static void FUNCC(h264_h_loop_filter_chroma422_mbaff_intra)(uint8_t *pix, int stride, int alpha, int beta)
+static void FUNCC(h264_h_loop_filter_chroma422_mbaff_intra)(uint8_t *pix, ptrdiff_t stride, int alpha, int beta)
 {
     FUNCC(h264_loop_filter_chroma_intra)(pix, sizeof(pixel), stride, 2, alpha, beta);
 }
diff --git a/libavcodec/h265_metadata_bsf.c b/libavcodec/h265_metadata_bsf.c
index 26eb2d0..730f7ac 100644
--- a/libavcodec/h265_metadata_bsf.c
+++ b/libavcodec/h265_metadata_bsf.c
@@ -23,6 +23,7 @@
 #include "cbs.h"
 #include "cbs_h265.h"
 #include "hevc.h"
+#include "h265_profile_level.h"
 
 enum {
     PASS,
@@ -30,6 +31,11 @@
     REMOVE,
 };
 
+enum {
+    LEVEL_UNSET = -2,
+    LEVEL_AUTO  = -1,
+};
+
 typedef struct H265MetadataContext {
     const AVClass *class;
 
@@ -58,9 +64,105 @@
     int crop_right;
     int crop_top;
     int crop_bottom;
+
+    int level;
+    int level_guess;
+    int level_warned;
 } H265MetadataContext;
 
 
+static void h265_metadata_guess_level(AVBSFContext *bsf,
+                                      const CodedBitstreamFragment *au)
+{
+    H265MetadataContext *ctx = bsf->priv_data;
+    const H265LevelDescriptor *desc;
+    const H265RawProfileTierLevel *ptl = NULL;
+    const H265RawHRDParameters    *hrd = NULL;
+    int64_t bit_rate = 0;
+    int width = 0, height = 0;
+    int tile_cols = 0, tile_rows = 0;
+    int max_dec_pic_buffering = 0;
+    int i;
+
+    for (i = 0; i < au->nb_units; i++) {
+        const CodedBitstreamUnit *unit = &au->units[i];
+
+        if (unit->type == HEVC_NAL_VPS) {
+            const H265RawVPS *vps = unit->content;
+
+            ptl = &vps->profile_tier_level;
+            max_dec_pic_buffering = vps->vps_max_dec_pic_buffering_minus1[0] + 1;
+
+            if (vps->vps_num_hrd_parameters > 0)
+                hrd = &vps->hrd_parameters[0];
+
+        } else if (unit->type == HEVC_NAL_SPS) {
+            const H265RawSPS *sps = unit->content;
+
+            ptl = &sps->profile_tier_level;
+            max_dec_pic_buffering = sps->sps_max_dec_pic_buffering_minus1[0] + 1;
+
+            width  = sps->pic_width_in_luma_samples;
+            height = sps->pic_height_in_luma_samples;
+
+            if (sps->vui.vui_hrd_parameters_present_flag)
+                hrd = &sps->vui.hrd_parameters;
+
+        } else if (unit->type == HEVC_NAL_PPS) {
+            const H265RawPPS *pps = unit->content;
+
+            if (pps->tiles_enabled_flag) {
+                tile_cols = pps->num_tile_columns_minus1 + 1;
+                tile_rows = pps->num_tile_rows_minus1 + 1;
+            }
+        }
+    }
+
+    if (hrd) {
+        if (hrd->nal_hrd_parameters_present_flag) {
+            bit_rate = (hrd->nal_sub_layer_hrd_parameters[0].bit_rate_value_minus1[0] + 1) *
+                       (INT64_C(1) << hrd->bit_rate_scale + 6);
+        } else if (hrd->vcl_hrd_parameters_present_flag) {
+            bit_rate = (hrd->vcl_sub_layer_hrd_parameters[0].bit_rate_value_minus1[0] + 1) *
+                       (INT64_C(1) << hrd->bit_rate_scale + 6);
+            // Adjust for VCL vs. NAL limits.
+            bit_rate = bit_rate * 11 / 10;
+        }
+    }
+
+    desc = ff_h265_guess_level(ptl, bit_rate, width, height,
+                               0, tile_rows, tile_cols,
+                               max_dec_pic_buffering);
+    if (desc) {
+        av_log(bsf, AV_LOG_DEBUG, "Stream appears to conform to "
+               "level %s.\n", desc->name);
+        ctx->level_guess = desc->level_idc;
+    }
+}
+
+static void h265_metadata_update_level(AVBSFContext *bsf,
+                                       uint8_t *level_idc)
+{
+    H265MetadataContext *ctx = bsf->priv_data;
+
+    if (ctx->level != LEVEL_UNSET) {
+        if (ctx->level == LEVEL_AUTO) {
+            if (ctx->level_guess) {
+                *level_idc = ctx->level_guess;
+            } else {
+                if (!ctx->level_warned) {
+                    av_log(bsf, AV_LOG_WARNING, "Unable to determine level "
+                           "of stream: using level 8.5.\n");
+                    ctx->level_warned = 1;
+                }
+                *level_idc = 255;
+            }
+        } else {
+            *level_idc = ctx->level;
+        }
+    }
+}
+
 static int h265_metadata_update_vps(AVBSFContext *bsf,
                                     H265RawVPS *vps)
 {
@@ -86,6 +188,8 @@
         }
     }
 
+    h265_metadata_update_level(bsf, &vps->profile_tier_level.general_level_idc);
+
     return 0;
 }
 
@@ -227,21 +331,22 @@
     if (need_vui)
         sps->vui_parameters_present_flag = 1;
 
+    h265_metadata_update_level(bsf, &sps->profile_tier_level.general_level_idc);
+
     return 0;
 }
 
-static int h265_metadata_filter(AVBSFContext *bsf, AVPacket *out)
+static int h265_metadata_filter(AVBSFContext *bsf, AVPacket *pkt)
 {
     H265MetadataContext *ctx = bsf->priv_data;
-    AVPacket *in = NULL;
     CodedBitstreamFragment *au = &ctx->access_unit;
     int err, i;
 
-    err = ff_bsf_get_packet(bsf, &in);
+    err = ff_bsf_get_packet_ref(bsf, pkt);
     if (err < 0)
         return err;
 
-    err = ff_cbs_read_packet(ctx->cbc, au, in);
+    err = ff_cbs_read_packet(ctx->cbc, au, pkt);
     if (err < 0) {
         av_log(bsf, AV_LOG_ERROR, "Failed to read packet.\n");
         goto fail;
@@ -290,13 +395,16 @@
 
             err = ff_cbs_insert_unit_content(ctx->cbc, au,
                                              0, HEVC_NAL_AUD, aud, NULL);
-            if (err) {
+            if (err < 0) {
                 av_log(bsf, AV_LOG_ERROR, "Failed to insert AUD.\n");
                 goto fail;
             }
         }
     }
 
+    if (ctx->level == LEVEL_AUTO && !ctx->level_guess)
+        h265_metadata_guess_level(bsf, au);
+
     for (i = 0; i < au->nb_units; i++) {
         if (au->units[i].type == HEVC_NAL_VPS) {
             err = h265_metadata_update_vps(bsf, au->units[i].content);
@@ -310,23 +418,18 @@
         }
     }
 
-    err = ff_cbs_write_packet(ctx->cbc, out, au);
+    err = ff_cbs_write_packet(ctx->cbc, pkt, au);
     if (err < 0) {
         av_log(bsf, AV_LOG_ERROR, "Failed to write packet.\n");
         goto fail;
     }
 
-    err = av_packet_copy_props(out, in);
-    if (err < 0)
-        goto fail;
-
     err = 0;
 fail:
-    ff_cbs_fragment_uninit(ctx->cbc, au);
+    ff_cbs_fragment_reset(ctx->cbc, au);
 
     if (err < 0)
-        av_packet_unref(out);
-    av_packet_free(&in);
+        av_packet_unref(pkt);
 
     return err;
 }
@@ -348,6 +451,9 @@
             goto fail;
         }
 
+        if (ctx->level == LEVEL_AUTO)
+            h265_metadata_guess_level(bsf, au);
+
         for (i = 0; i < au->nb_units; i++) {
             if (au->units[i].type == HEVC_NAL_VPS) {
                 err = h265_metadata_update_vps(bsf, au->units[i].content);
@@ -370,13 +476,15 @@
 
     err = 0;
 fail:
-    ff_cbs_fragment_uninit(ctx->cbc, au);
+    ff_cbs_fragment_reset(ctx->cbc, au);
     return err;
 }
 
 static void h265_metadata_close(AVBSFContext *bsf)
 {
     H265MetadataContext *ctx = bsf->priv_data;
+
+    ff_cbs_fragment_free(ctx->cbc, &ctx->access_unit);
     ff_cbs_close(&ctx->cbc);
 }
 
@@ -439,6 +547,30 @@
         OFFSET(crop_bottom), AV_OPT_TYPE_INT,
         { .i64 = -1 }, -1, HEVC_MAX_HEIGHT, FLAGS },
 
+    { "level", "Set level (tables A.6 and A.7)",
+        OFFSET(level), AV_OPT_TYPE_INT,
+        { .i64 = LEVEL_UNSET }, LEVEL_UNSET, 0xff, FLAGS, "level" },
+    { "auto", "Attempt to guess level from stream properties",
+        0, AV_OPT_TYPE_CONST,
+        { .i64 = LEVEL_AUTO }, .flags = FLAGS, .unit = "level" },
+#define LEVEL(name, value) name, NULL, 0, AV_OPT_TYPE_CONST, \
+        { .i64 = value },      .flags = FLAGS, .unit = "level"
+    { LEVEL("1",    30) },
+    { LEVEL("2",    60) },
+    { LEVEL("2.1",  63) },
+    { LEVEL("3",    90) },
+    { LEVEL("3.1",  93) },
+    { LEVEL("4",   120) },
+    { LEVEL("4.1", 123) },
+    { LEVEL("5",   150) },
+    { LEVEL("5.1", 153) },
+    { LEVEL("5.2", 156) },
+    { LEVEL("6",   180) },
+    { LEVEL("6.1", 183) },
+    { LEVEL("6.2", 186) },
+    { LEVEL("8.5", 255) },
+#undef LEVEL
+
     { NULL }
 };
 
diff --git a/libavcodec/h265_profile_level.c b/libavcodec/h265_profile_level.c
index 6604ca2..d79c1ab 100644
--- a/libavcodec/h265_profile_level.c
+++ b/libavcodec/h265_profile_level.c
@@ -43,76 +43,80 @@
     // profile_idc   8bit       one-picture
     //   HT-profile  | 422chroma    | lower-bit-rate
     //   |  14bit    |  | 420chroma |  | CpbVclFactor     MinCrScaleFactor
-    //   |  |  12bit |  |  | monochrome|    | CpbNalFactor    |
+    //   |  |  12bit |  |  | monochrome|    | CpbNalFactor    | maxDpbPicBuf
     //   |  |  |  10bit |  |  | intra  |    |     | FormatCapabilityFactor
-    { "Monochrome", //  |  |  |  |  |  |    |     |     |     |
-      4, 0, 2, 1, 1, 1, 1, 1, 1, 0, 0, 1,  667,  733, 1.000, 1.0 },
+    { "Monochrome", //  |  |  |  |  |  |    |     |     |     |   |
+      4, 0, 2, 1, 1, 1, 1, 1, 1, 0, 0, 1,  667,  733, 1.000, 1.0, 6 },
+    { "Monochrome 10",
+      4, 0, 2, 1, 1, 0, 1, 1, 1, 0, 0, 1,  833,  917, 1.250, 1.0, 6 },
     { "Monochrome 12",
-      4, 0, 2, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1000, 1100, 1.500, 1.0 },
+      4, 0, 2, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1000, 1100, 1.500, 1.0, 6 },
     { "Monochrome 16",
-      4, 0, 2, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1333, 1467, 2.000, 1.0 },
+      4, 0, 2, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1333, 1467, 2.000, 1.0, 6 },
     { "Main",
-      1, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1000, 1100, 1.500, 1.0 },
+      1, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1000, 1100, 1.500, 1.0, 6 },
     { "Screen-Extended Main",
-      9, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1000, 1100, 1.500, 1.0 },
+      9, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1000, 1100, 1.500, 1.0, 7 },
     { "Main 10",
-      2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1000, 1100, 1.875, 1.0 },
+      2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 1000, 1100, 1.875, 1.0, 6 },
     { "Screen-Extended Main 10",
-      9, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1000, 1100, 1.875, 1.0 },
+      9, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1000, 1100, 1.875, 1.0, 7 },
     { "Main 12",
-      4, 0, 2, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1500, 1650, 2.250, 1.0 },
+      4, 0, 2, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1500, 1650, 2.250, 1.0, 6 },
     { "Main Still Picture",
-      3, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1000, 1100, 1.500, 1.0 },
+      3, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1000, 1100, 1.500, 1.0, 6 },
+    { "Main 10 Still Picture",
+      2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 1000, 1100, 1.875, 1.0, 6 },
     { "Main 4:2:2 10",
-      4, 0, 2, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1667, 1833, 2.500, 0.5 },
+      4, 0, 2, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1667, 1833, 2.500, 0.5, 6 },
     { "Main 4:2:2 12",
-      4, 0, 2, 1, 0, 0, 1, 0, 0, 0, 0, 1, 2000, 2200, 3.000, 0.5 },
+      4, 0, 2, 1, 0, 0, 1, 0, 0, 0, 0, 1, 2000, 2200, 3.000, 0.5, 6 },
     { "Main 4:4:4",
-      4, 0, 2, 1, 1, 1, 0, 0, 0, 0, 0, 1, 2000, 2200, 3.000, 0.5 },
+      4, 0, 2, 1, 1, 1, 0, 0, 0, 0, 0, 1, 2000, 2200, 3.000, 0.5, 6 },
     { "High Throughput 4:4:4",
-      5, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 2000, 2200, 3.000, 0.5 },
+      5, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 2000, 2200, 3.000, 0.5, 6 },
     { "Screen-Extended Main 4:4:4",
-      9, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 2000, 2200, 3.000, 0.5 },
+      9, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 2000, 2200, 3.000, 0.5, 7 },
     { "Screen-Extended High Throughput 4:4:4",
-      9, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 2000, 2200, 3.000, 0.5 },
+      9, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 2000, 2200, 3.000, 0.5, 7 },
     { "Main 4:4:4 10",
-      4, 0, 2, 1, 1, 0, 0, 0, 0, 0, 0, 1, 2500, 2750, 3.750, 0.5 },
+      4, 0, 2, 1, 1, 0, 0, 0, 0, 0, 0, 1, 2500, 2750, 3.750, 0.5, 6 },
     { "High Throughput 4:4:4 10",
-      5, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 2500, 2750, 3.750, 0.5 },
+      5, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 2500, 2750, 3.750, 0.5, 6 },
     { "Screen-Extended Main 4:4:4 10",
-      9, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 2500, 2750, 3.750, 0.5 },
+      9, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 2500, 2750, 3.750, 0.5, 7 },
     { "Screen-Extended High Throughput 4:4:4 10",
-      9, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 2500, 2750, 3.750, 0.5 },
+      9, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 2500, 2750, 3.750, 0.5, 7 },
     { "Main 4:4:4 12",
-      4, 0, 2, 1, 0, 0, 0, 0, 0, 0, 0, 1, 3000, 3300, 4.500, 0.5 },
+      4, 0, 2, 1, 0, 0, 0, 0, 0, 0, 0, 1, 3000, 3300, 4.500, 0.5, 6 },
     { "High Throughput 4:4:4 14",
-      5, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3500, 3850, 5.250, 0.5 },
+      5, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3500, 3850, 5.250, 0.5, 6 },
     { "Screen-Extended High Throughput 4:4:4 14",
-      9, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3500, 3850, 5.250, 0.5 },
+      9, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3500, 3850, 5.250, 0.5, 7 },
     { "Main Intra",
-      4, 0, 2, 1, 1, 1, 1, 1, 0, 1, 0, 2, 1000, 1100, 1.500, 1.0 },
+      4, 0, 2, 1, 1, 1, 1, 1, 0, 1, 0, 2, 1000, 1100, 1.500, 1.0, 6 },
     { "Main 10 Intra",
-      4, 0, 2, 1, 1, 0, 1, 1, 0, 1, 0, 2, 1000, 1100, 1.875, 1.0 },
+      4, 0, 2, 1, 1, 0, 1, 1, 0, 1, 0, 2, 1000, 1100, 1.875, 1.0, 6 },
     { "Main 12 Intra",
-      4, 0, 2, 1, 0, 0, 1, 1, 0, 1, 0, 2, 1500, 1650, 2.250, 1.0 },
+      4, 0, 2, 1, 0, 0, 1, 1, 0, 1, 0, 2, 1500, 1650, 2.250, 1.0, 6 },
     { "Main 4:2:2 10 Intra",
-      4, 0, 2, 1, 1, 0, 1, 0, 0, 1, 0, 2, 1667, 1833, 2.500, 0.5 },
+      4, 0, 2, 1, 1, 0, 1, 0, 0, 1, 0, 2, 1667, 1833, 2.500, 0.5, 6 },
     { "Main 4:2:2 12 Intra",
-      4, 0, 2, 1, 0, 0, 1, 0, 0, 1, 0, 2, 2000, 2200, 3.000, 0.5 },
+      4, 0, 2, 1, 0, 0, 1, 0, 0, 1, 0, 2, 2000, 2200, 3.000, 0.5, 6 },
     { "Main 4:4:4 Intra",
-      4, 0, 2, 1, 1, 1, 0, 0, 0, 1, 0, 2, 2000, 2200, 3.000, 0.5 },
+      4, 0, 2, 1, 1, 1, 0, 0, 0, 1, 0, 2, 2000, 2200, 3.000, 0.5, 6 },
     { "Main 4:4:4 10 Intra",
-      4, 0, 2, 1, 1, 0, 0, 0, 0, 1, 0, 2, 2500, 2750, 3.750, 0.5 },
+      4, 0, 2, 1, 1, 0, 0, 0, 0, 1, 0, 2, 2500, 2750, 3.750, 0.5, 6 },
     { "Main 4:4:4 12 Intra",
-      4, 0, 2, 1, 0, 0, 0, 0, 0, 1, 0, 2, 3000, 3300, 4.500, 0.5 },
+      4, 0, 2, 1, 0, 0, 0, 0, 0, 1, 0, 2, 3000, 3300, 4.500, 0.5, 6 },
     { "Main 4:4:4 16 Intra",
-      4, 0, 2, 0, 0, 0, 0, 0, 0, 1, 0, 2, 4000, 4400, 6.000, 0.5 },
+      4, 0, 2, 0, 0, 0, 0, 0, 0, 1, 0, 2, 4000, 4400, 6.000, 0.5, 6 },
     { "Main 4:4:4 Still Picture",
-      4, 0, 2, 1, 1, 1, 0, 0, 0, 1, 1, 2, 2000, 2200, 3.000, 0.5 },
+      4, 0, 2, 1, 1, 1, 0, 0, 0, 1, 1, 2, 2000, 2200, 3.000, 0.5, 6 },
     { "Main 4:4:4 16 Still Picture",
-      4, 0, 2, 0, 0, 0, 0, 0, 0, 1, 1, 2, 4000, 4400, 6.000, 0.5 },
+      4, 0, 2, 0, 0, 0, 0, 0, 0, 1, 1, 2, 4000, 4400, 6.000, 0.5, 6 },
     { "High Throughput 4:4:4 16 Intra",
-      5, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 4000, 4400, 6.000, 0.5 },
+      5, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 4000, 4400, 6.000, 0.5, 6 },
 };
 
 
@@ -175,7 +179,7 @@
                                                int max_dec_pic_buffering)
 {
     const H265ProfileDescriptor *profile;
-    int pic_size, lbr_flag, hbr_factor;
+    int pic_size, tier_flag, lbr_flag, hbr_factor;
     int i;
 
     if (ptl)
@@ -184,15 +188,18 @@
         profile = NULL;
     if (!profile) {
         // Default to using multiplication factors for Main profile.
-        profile = &h265_profiles[3];
+        profile = &h265_profiles[4];
     }
 
     pic_size = width * height;
 
-    if (ptl)
-        lbr_flag = ptl->general_lower_bit_rate_constraint_flag;
-    else
-        lbr_flag = profile->lower_bit_rate > 0;
+    if (ptl) {
+        tier_flag = ptl->general_tier_flag;
+        lbr_flag  = ptl->general_lower_bit_rate_constraint_flag;
+    } else {
+        tier_flag = 0;
+        lbr_flag  = profile->lower_bit_rate > 0;
+    }
     if (profile->profile_idc == 1 || profile->profile_idc == 2) {
         hbr_factor = 1;
     } else if (profile->high_throughput) {
@@ -208,6 +215,9 @@
         const H265LevelDescriptor *level = &h265_levels[i];
         int max_br, max_dpb_size;
 
+        if (tier_flag && !level->max_br_high)
+            continue;
+
         if (pic_size > level->max_luma_ps)
             continue;
         if (width  * width  > 8 * level->max_luma_ps)
@@ -222,7 +232,7 @@
         if (tile_cols > level->max_tile_cols)
             continue;
 
-        if (ptl && ptl->general_tier_flag)
+        if (tier_flag)
             max_br = level->max_br_high;
         else
             max_br = level->max_br_main;
@@ -231,14 +241,14 @@
         if (bitrate > (int64_t)profile->cpb_nal_factor * hbr_factor * max_br)
             continue;
 
-        if (pic_size < (level->max_luma_ps >> 2))
-            max_dpb_size = 16;
-        else if (pic_size < (level->max_luma_ps >> 1))
-            max_dpb_size = 14;
-        else if (pic_size < (3 * level->max_luma_ps >> 2))
-            max_dpb_size = 9;
+        if (pic_size <= (level->max_luma_ps >> 2))
+            max_dpb_size = FFMIN(4 * profile->max_dpb_pic_buf, 16);
+        else if (pic_size <= (level->max_luma_ps >> 1))
+            max_dpb_size = FFMIN(2 * profile->max_dpb_pic_buf, 16);
+        else if (pic_size <= (3 * level->max_luma_ps >> 2))
+            max_dpb_size = FFMIN(4 * profile->max_dpb_pic_buf / 3, 16);
         else
-            max_dpb_size = 7;
+            max_dpb_size = profile->max_dpb_pic_buf;
         if (max_dec_pic_buffering > max_dpb_size)
             continue;
 
diff --git a/libavcodec/h265_profile_level.h b/libavcodec/h265_profile_level.h
index 12c00f0..2d5beba 100644
--- a/libavcodec/h265_profile_level.h
+++ b/libavcodec/h265_profile_level.h
@@ -66,6 +66,7 @@
     uint16_t cpb_nal_factor;
     float format_capability_factor;
     float min_cr_scale_factor;
+    uint8_t max_dpb_pic_buf;
 } H265ProfileDescriptor;
 
 
diff --git a/libavcodec/hapdec.c b/libavcodec/hapdec.c
index 8c84577..d23ceb5 100644
--- a/libavcodec/hapdec.c
+++ b/libavcodec/hapdec.c
@@ -484,4 +484,12 @@
                       AV_CODEC_CAP_DR1,
     .caps_internal  = FF_CODEC_CAP_INIT_THREADSAFE |
                       FF_CODEC_CAP_INIT_CLEANUP,
+    .codec_tags     = (const uint32_t []){
+        MKTAG('H','a','p','1'),
+        MKTAG('H','a','p','5'),
+        MKTAG('H','a','p','Y'),
+        MKTAG('H','a','p','A'),
+        MKTAG('H','a','p','M'),
+        FF_CODEC_TAGS_END,
+    },
 };
diff --git a/libavcodec/hca_data.h b/libavcodec/hca_data.h
new file mode 100644
index 0000000..80b4a79
--- /dev/null
+++ b/libavcodec/hca_data.h
@@ -0,0 +1,174 @@
+/*
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+
+#ifndef AVCODEC_HCA_DATA_H
+#define AVCODEC_HCA_DATA_H
+
+#include <stdint.h>
+
+static const uint8_t max_bits_table[] = {
+    0, 2, 3, 3, 4, 4, 4, 4, 5, 6, 7, 8, 9, 10, 11, 12,
+};
+
+static const uint8_t quant_spectrum_bits[] =
+{
+    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+    1,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,
+    2,2,2,2,2,2,3,3,0,0,0,0,0,0,0,0,
+    2,2,3,3,3,3,3,3,0,0,0,0,0,0,0,0,
+    3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,
+    3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,
+    3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,
+    3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
+};
+
+static const int8_t quant_spectrum_value[] =
+{
+    +0,+0,+0,+0,+0,+0,+0,+0,+0,+0,+0,+0,+0,+0,+0,+0,
+    +0,+0,+1,-1,+0,+0,+0,+0,+0,+0,+0,+0,+0,+0,+0,+0,
+    +0,+0,+1,+1,-1,-1,+2,-2,+0,+0,+0,+0,+0,+0,+0,+0,
+    +0,+0,+1,-1,+2,-2,+3,-3,+0,+0,+0,+0,+0,+0,+0,+0,
+    +0,+0,+1,+1,-1,-1,+2,+2,-2,-2,+3,+3,-3,-3,+4,-4,
+    +0,+0,+1,+1,-1,-1,+2,+2,-2,-2,+3,-3,+4,-4,+5,-5,
+    +0,+0,+1,+1,-1,-1,+2,-2,+3,-3,+4,-4,+5,-5,+6,-6,
+    +0,+0,+1,-1,+2,-2,+3,-3,+4,-4,+5,-5,+6,-6,+7,-7,
+};
+
+static const uint8_t scale_table[] =
+{
+    15, 14, 14, 14, 14, 14, 14, 13, 13,
+    13, 13, 13, 13, 12, 12, 12, 12,
+    12, 12, 11, 11, 11, 11, 11, 11,
+    10, 10, 10, 10, 10, 10, 10,  9,
+    9,  9,  9,  9,  9,  8,  8,  8,
+    8,  8,  8,  7,  6,  6,  5,  4,
+    4,  4,  3,  3,  3,  2,  2,  2,
+    2,  1,
+};
+
+static const float window[128] =
+{
+    0.000690534, 0.00197623, 0.00367386, 0.00572424, 0.0080967, 0.0107732, 0.0137425, 0.0169979,
+    0.0205353, 0.0243529, 0.0284505, 0.0328291, 0.0374906, 0.0424379, 0.0476744, 0.0532043,
+    0.0590321, 0.0651629, 0.071602, 0.0783552, 0.0854285, 0.092828, 0.10056, 0.108631,
+    0.117048, 0.125817, 0.134944, 0.144437, 0.1543, 0.164539, 0.175161, 0.186169,
+    0.197569, 0.209363, 0.221555, 0.234145, 0.247136, 0.260526, 0.274313, 0.288493,
+    0.303062, 0.318012, 0.333333, 0.349015, 0.365044, 0.381403, 0.398073, 0.415034,
+    0.43226, 0.449725, 0.4674, 0.485251, 0.503245, 0.521344, 0.539509, 0.557698,
+    0.575869, 0.593978, 0.611981, 0.629831, 0.647486, 0.6649, 0.682031, 0.698838,
+    0.71528, 0.731323, 0.746932, 0.762077, 0.776732, 0.790873, 0.804481, 0.817542,
+    0.830044, 0.84198, 0.853347, 0.864144, 0.874375, 0.884046, 0.893167, 0.901749,
+    0.909806, 0.917354, 0.924409, 0.93099, 0.937117, 0.942809, 0.948087, 0.952971,
+    0.957482, 0.961641, 0.965467, 0.968981, 0.972202, 0.975148, 0.977838, 0.980289,
+    0.982518, 0.98454, 0.986371, 0.988024, 0.989514, 0.990853, 0.992053, 0.993126,
+    0.994082, 0.994931, 0.995682, 0.996344, 0.996926, 0.997433, 0.997875, 0.998256,
+    0.998584, 0.998863, 0.999099, 0.999297, 0.999461, 0.999595, 0.999703, 0.999789,
+    0.999856, 0.999906, 0.999942, 0.999967, 0.999984, 0.999993, 0.999998, 1.0,
+};
+
+static const float intensity_ratio_table[] =
+{
+    2.0, 1.85714, 1.71429, 1.57143, 1.42857, 1.28571, 1.14286, 1.0,
+    0.857143, 0.714286, 0.571429, 0.428571, 0.285714, 0.142857, 0.0, 0.0,
+    0, 1.87066e-08, 2.49253e-08, 3.32113e-08, 4.42518e-08, 5.89626e-08, 7.85637e-08, 1.04681e-07,
+    1.3948e-07, 1.85848e-07, 2.4763e-07, 3.2995e-07, 4.39636e-07, 5.85785e-07, 7.80519e-07, 1.03999e-06,
+    1.38572e-06, 1.84637e-06, 2.46017e-06, 3.27801e-06, 4.36772e-06, 5.8197e-06, 7.75435e-06, 1.03321e-05,
+    1.37669e-05, 1.83435e-05, 2.44414e-05, 3.25665e-05, 4.33927e-05, 5.78179e-05, 7.70384e-05, 0.000102648,
+    0.000136772, 0.00018224, 0.000242822, 0.000323544, 0.000431101, 0.000574413, 0.000765366, 0.0010198,
+    0.00135881, 0.00181053, 0.0024124, 0.00321437, 0.00428293, 0.00570671, 0.00760381, 0.0101316,
+    0.0134996, 0.0179873, 0.0239669, 0.0319343, 0.0425503, 0.0566954, 0.0755428, 0.100656,
+    0.134117, 0.178702, 0.238108, 0.317263, 0.422731, 0.563261, 0.750507, 0.0,
+};
+
+static const float scale_conversion_table[] =
+{
+    1.0, 1.33243, 1.77538, 2.36557, 3.15196, 4.19978, 5.59592, 7.45618,
+    9.93486, 13.2375, 17.6381, 23.5016, 31.3143, 41.7242, 55.5947, 74.0762,
+    98.7015, 131.513, 175.232, 233.485, 311.103, 414.524, 552.326, 735.937,
+    980.586, 1306.56, 1740.91, 2319.64, 3090.77, 4118.24, 5487.28, 7311.43,
+    9741.98, 12980.5, 17295.7, 23045.3, 30706.4, 40914.2, 54515.4, 72638,
+    96785.3, 128960, 171830, 228952, 305064, 406477, 541603, 721649,
+    961548, 1.2812e+06, 1.70711e+06, 2.27461e+06, 3.03076e+06, 4.03829e+06, 5.38075e+06, 7.16948e+06,
+    9.55285e+06, 1.27285e+07, 1.69599e+07, 2.25979e+07, 3.01102e+07, 4.01198e+07, 5.3457e+07, 0,
+};
+
+static const float dequantizer_scaling_table[] =
+{
+    1.58838e-07, 2.11641e-07, 2.81998e-07, 3.75743e-07, 5.00652e-07, 6.67085e-07, 8.88846e-07, 1.18433e-06,
+    1.57804e-06, 2.10263e-06, 2.80161e-06, 3.73296e-06, 4.97391e-06, 6.6274e-06, 8.83057e-06, 1.17661e-05,
+    1.56776e-05, 2.08893e-05, 2.78336e-05, 3.70864e-05, 4.94151e-05, 6.58423e-05, 8.77305e-05, 0.000116895,
+    0.000155755, 0.000207533, 0.000276523, 0.000368448, 0.000490933, 0.000654135, 0.00087159, 0.00116134,
+    0.0015474, 0.00206181, 0.00274722, 0.00366048, 0.00487735, 0.00649874, 0.00865913, 0.0115377,
+    0.0153732, 0.0204838, 0.0272932, 0.0363664, 0.0484558, 0.0645641, 0.0860272, 0.114626,
+    0.152731, 0.203503, 0.271155, 0.361295, 0.481401, 0.641435, 0.854669, 1.13879,
+    1.51736, 2.02178, 2.69388, 3.58942, 4.78266, 6.37257, 8.49102, 11.3137,
+};
+
+static const float quant_step_size[] =
+{
+    0.0, 0.666667, 0.4, 0.285714, 0.222222, 0.181818, 0.153846, 0.133333, 0.0645161,
+    0.031746, 0.015748, 0.00784314, 0.00391389, 0.00195503, 0.00097704, 0.000488401,
+};
+
+static const uint8_t ath_base_curve[656] =
+{
+    0x78,0x5F,0x56,0x51,0x4E,0x4C,0x4B,0x49,0x48,0x48,0x47,0x46,0x46,0x45,0x45,0x45,
+    0x44,0x44,0x44,0x44,0x43,0x43,0x43,0x43,0x43,0x43,0x42,0x42,0x42,0x42,0x42,0x42,
+    0x42,0x42,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x40,0x40,0x40,0x40,
+    0x40,0x40,0x40,0x40,0x40,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,
+    0x3F,0x3F,0x3F,0x3E,0x3E,0x3E,0x3E,0x3E,0x3E,0x3D,0x3D,0x3D,0x3D,0x3D,0x3D,0x3D,
+    0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,
+    0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,
+    0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,
+    0x3D,0x3D,0x3D,0x3D,0x3D,0x3D,0x3D,0x3D,0x3E,0x3E,0x3E,0x3E,0x3E,0x3E,0x3E,0x3F,
+    0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,
+    0x3F,0x3F,0x3F,0x3F,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,
+    0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x41,0x41,0x41,0x41,0x41,0x41,0x41,
+    0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,
+    0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,
+    0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x43,0x43,0x43,
+    0x43,0x43,0x43,0x43,0x43,0x43,0x43,0x43,0x43,0x43,0x43,0x43,0x43,0x43,0x44,0x44,
+    0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x45,0x45,0x45,0x45,
+    0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,
+    0x46,0x46,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x48,0x48,0x48,0x48,
+    0x48,0x48,0x48,0x48,0x49,0x49,0x49,0x49,0x49,0x49,0x49,0x49,0x4A,0x4A,0x4A,0x4A,
+    0x4A,0x4A,0x4A,0x4A,0x4B,0x4B,0x4B,0x4B,0x4B,0x4B,0x4B,0x4C,0x4C,0x4C,0x4C,0x4C,
+    0x4C,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4E,0x4E,0x4E,0x4E,0x4E,0x4E,0x4F,0x4F,0x4F,
+    0x4F,0x4F,0x4F,0x50,0x50,0x50,0x50,0x50,0x51,0x51,0x51,0x51,0x51,0x52,0x52,0x52,
+    0x52,0x52,0x53,0x53,0x53,0x53,0x54,0x54,0x54,0x54,0x54,0x55,0x55,0x55,0x55,0x56,
+    0x56,0x56,0x56,0x57,0x57,0x57,0x57,0x57,0x58,0x58,0x58,0x59,0x59,0x59,0x59,0x5A,
+    0x5A,0x5A,0x5A,0x5B,0x5B,0x5B,0x5B,0x5C,0x5C,0x5C,0x5D,0x5D,0x5D,0x5D,0x5E,0x5E,
+    0x5E,0x5F,0x5F,0x5F,0x60,0x60,0x60,0x61,0x61,0x61,0x61,0x62,0x62,0x62,0x63,0x63,
+    0x63,0x64,0x64,0x64,0x65,0x65,0x66,0x66,0x66,0x67,0x67,0x67,0x68,0x68,0x68,0x69,
+    0x69,0x6A,0x6A,0x6A,0x6B,0x6B,0x6B,0x6C,0x6C,0x6D,0x6D,0x6D,0x6E,0x6E,0x6F,0x6F,
+    0x70,0x70,0x70,0x71,0x71,0x72,0x72,0x73,0x73,0x73,0x74,0x74,0x75,0x75,0x76,0x76,
+    0x77,0x77,0x78,0x78,0x78,0x79,0x79,0x7A,0x7A,0x7B,0x7B,0x7C,0x7C,0x7D,0x7D,0x7E,
+    0x7E,0x7F,0x7F,0x80,0x80,0x81,0x81,0x82,0x83,0x83,0x84,0x84,0x85,0x85,0x86,0x86,
+    0x87,0x88,0x88,0x89,0x89,0x8A,0x8A,0x8B,0x8C,0x8C,0x8D,0x8D,0x8E,0x8F,0x8F,0x90,
+    0x90,0x91,0x92,0x92,0x93,0x94,0x94,0x95,0x95,0x96,0x97,0x97,0x98,0x99,0x99,0x9A,
+    0x9B,0x9B,0x9C,0x9D,0x9D,0x9E,0x9F,0xA0,0xA0,0xA1,0xA2,0xA2,0xA3,0xA4,0xA5,0xA5,
+    0xA6,0xA7,0xA7,0xA8,0xA9,0xAA,0xAA,0xAB,0xAC,0xAD,0xAE,0xAE,0xAF,0xB0,0xB1,0xB1,
+    0xB2,0xB3,0xB4,0xB5,0xB6,0xB6,0xB7,0xB8,0xB9,0xBA,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF,
+    0xC0,0xC1,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xC9,0xCA,0xCB,0xCC,0xCD,
+    0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,
+    0xDE,0xDF,0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xED,0xEE,
+    0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFF,0xFF,
+};
+
+#endif /* AVCODEC_HCA_DATA_H */
diff --git a/libavcodec/hcadec.c b/libavcodec/hcadec.c
new file mode 100644
index 0000000..f25d6c3
--- /dev/null
+++ b/libavcodec/hcadec.c
@@ -0,0 +1,454 @@
+/*
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "libavutil/crc.h"
+#include "libavutil/float_dsp.h"
+#include "libavutil/intreadwrite.h"
+#include "libavutil/tx.h"
+
+#include "avcodec.h"
+#include "get_bits.h"
+#include "internal.h"
+#include "hca_data.h"
+
+typedef struct ChannelContext {
+    float    base[128];
+    DECLARE_ALIGNED(32, float, imdct_in)[128];
+    DECLARE_ALIGNED(32, float, imdct_out)[128];
+    DECLARE_ALIGNED(32, float, imdct_prev)[128];
+    int8_t   scale_factors[128];
+    uint8_t  scale[128];
+    int8_t   intensity[8];
+    int8_t  *hfr_scale;
+    unsigned count;
+    int      chan_type;
+} ChannelContext;
+
+typedef struct HCAContext {
+    GetBitContext gb;
+
+    const AVCRC *crc_table;
+
+    ChannelContext ch[16];
+
+    uint8_t ath[128];
+
+    int     ath_type;
+    unsigned hfr_group_count;
+    uint8_t track_count;
+    uint8_t channel_config;
+    uint8_t total_band_count;
+    uint8_t base_band_count;
+    uint8_t stereo_band_count;
+    uint8_t bands_per_hfr_group;
+
+    av_tx_fn           tx_fn;
+    AVTXContext       *tx_ctx;
+    AVFloatDSPContext *fdsp;
+} HCAContext;
+
+static void ath_init1(uint8_t *ath, int sample_rate)
+{
+    unsigned int index;
+    unsigned int acc = 0;
+
+    for (int i = 0; i < 128; i++) {
+        acc += sample_rate;
+        index = acc >> 13;
+
+        if (index >= 654) {
+            memset(ath+i, 0xFF, (128 - i));
+            break;
+        }
+
+        ath[i] = ath_base_curve[index];
+    }
+}
+
+static int ath_init(uint8_t *ath, int type, int sample_rate)
+{
+    switch (type) {
+    case 0:
+        /* nothing to do */
+        break;
+    case 1:
+        ath_init1(ath, sample_rate);
+        break;
+    default:
+        return AVERROR_INVALIDDATA;
+    }
+
+    return 0;
+}
+
+static inline unsigned ceil2(unsigned a, unsigned b)
+{
+    return (b > 0) ? (a / b + ((a % b) ? 1 : 0)) : 0;
+}
+
+static av_cold int decode_init(AVCodecContext *avctx)
+{
+    HCAContext *c = avctx->priv_data;
+    GetBitContext *gb = &c->gb;
+    int8_t r[16] = { 0 };
+    float scale = 1.f / 8.f;
+    unsigned b, chunk;
+    int version, ret;
+
+    avctx->sample_fmt = AV_SAMPLE_FMT_FLTP;
+    c->crc_table = av_crc_get_table(AV_CRC_16_ANSI);
+
+    if (avctx->channels <= 0 || avctx->channels > 16)
+        return AVERROR(EINVAL);
+
+    ret = init_get_bits8(gb, avctx->extradata, avctx->extradata_size);
+    if (ret < 0)
+        return ret;
+    skip_bits_long(gb, 32);
+    version = get_bits(gb, 16);
+    skip_bits_long(gb, 16);
+
+    c->ath_type = version >= 0x200 ? 0 : 1;
+
+    if (get_bits_long(gb, 32) != MKBETAG('f', 'm', 't', 0))
+        return AVERROR_INVALIDDATA;
+    skip_bits_long(gb, 32);
+    skip_bits_long(gb, 32);
+    skip_bits_long(gb, 32);
+
+    chunk = get_bits_long(gb, 32);
+    if (chunk == MKBETAG('c', 'o', 'm', 'p')) {
+        skip_bits_long(gb, 16);
+        skip_bits_long(gb, 8);
+        skip_bits_long(gb, 8);
+        c->track_count = get_bits(gb, 8);
+        c->channel_config = get_bits(gb, 8);
+        c->total_band_count = get_bits(gb, 8);
+        c->base_band_count = get_bits(gb, 8);
+        c->stereo_band_count = get_bits(gb, 8);
+        c->bands_per_hfr_group = get_bits(gb, 8);
+    } else if (chunk == MKBETAG('d', 'e', 'c', 0)) {
+        skip_bits_long(gb, 16);
+        skip_bits_long(gb, 8);
+        skip_bits_long(gb, 8);
+        c->total_band_count = get_bits(gb, 8) + 1;
+        c->base_band_count = get_bits(gb, 8) + 1;
+        c->track_count = get_bits(gb, 4);
+        c->channel_config = get_bits(gb, 4);
+        if (!get_bits(gb, 8))
+            c->base_band_count = c->total_band_count;
+        c->stereo_band_count = c->total_band_count - c->base_band_count;
+        c->bands_per_hfr_group = 0;
+    } else
+        return AVERROR_INVALIDDATA;
+
+    while (get_bits_left(gb) >= 32) {
+        chunk = get_bits_long(gb, 32);
+        if (chunk == MKBETAG('v', 'b', 'r', 0)) {
+            skip_bits_long(gb, 16);
+            skip_bits_long(gb, 16);
+        } else if (chunk == MKBETAG('a', 't', 'h', 0)) {
+            c->ath_type = get_bits(gb, 16);
+        } else if (chunk == MKBETAG('r', 'v', 'a', 0)) {
+            skip_bits_long(gb, 32);
+        } else if (chunk == MKBETAG('c', 'o', 'm', 'm')) {
+            skip_bits_long(gb, get_bits(gb, 8) * 8);
+        } else if (chunk == MKBETAG('c', 'i', 'p', 'h')) {
+            skip_bits_long(gb, 16);
+        } else if (chunk == MKBETAG('l', 'o', 'o', 'p')) {
+            skip_bits_long(gb, 32);
+            skip_bits_long(gb, 32);
+            skip_bits_long(gb, 16);
+            skip_bits_long(gb, 16);
+        } else if (chunk == MKBETAG('p', 'a', 'd', 0)) {
+            break;
+        } else {
+            break;
+        }
+    }
+
+    ret = ath_init(c->ath, c->ath_type, avctx->sample_rate);
+    if (ret < 0)
+        return ret;
+
+    if (!c->track_count)
+        c->track_count = 1;
+
+    b = avctx->channels / c->track_count;
+    if (c->stereo_band_count && b > 1) {
+        int8_t *x = r;
+
+        for (int i = 0; i < c->track_count; i++, x+=b) {
+            switch (b) {
+            case 2:
+            case 3:
+                x[0] = 1;
+                x[1] = 2;
+                break;
+            case 4:
+                x[0]=1; x[1] = 2;
+                if (c->channel_config == 0) {
+                    x[2]=1;
+                    x[3]=2;
+                }
+                break;
+            case 5:
+                x[0]=1; x[1] = 2;
+                if (c->channel_config <= 2) {
+                    x[3]=1;
+                    x[4]=2;
+                }
+                break;
+            case 6:
+            case 7:
+                x[0] = 1; x[1] = 2; x[4] = 1; x[5] = 2;
+                break;
+            case 8:
+                x[0] = 1; x[1] = 2; x[4] = 1; x[5] = 2; x[6] = 1; x[7] = 2;
+                break;
+            }
+        }
+    }
+
+    if (c->total_band_count < c->base_band_count)
+        return AVERROR_INVALIDDATA;
+
+    c->hfr_group_count = ceil2(c->total_band_count - (c->base_band_count + c->stereo_band_count),
+                               c->bands_per_hfr_group);
+
+    if (c->base_band_count + c->stereo_band_count + (unsigned long)c->hfr_group_count > 128ULL)
+        return AVERROR_INVALIDDATA;
+
+    for (int i = 0; i < avctx->channels; i++) {
+        c->ch[i].chan_type = r[i];
+        c->ch[i].count     = c->base_band_count + ((r[i] != 2) ? c->stereo_band_count : 0);
+        c->ch[i].hfr_scale = &c->ch[i].scale_factors[c->base_band_count + c->stereo_band_count];
+        if (c->ch[i].count > 128)
+            return AVERROR_INVALIDDATA;
+    }
+
+    c->fdsp = avpriv_float_dsp_alloc(avctx->flags & AV_CODEC_FLAG_BITEXACT);
+    if (!c->fdsp)
+        return AVERROR(ENOMEM);
+
+    return av_tx_init(&c->tx_ctx, &c->tx_fn, AV_TX_FLOAT_MDCT, 1, 128, &scale, 0);
+}
+
+static void run_imdct(HCAContext *c, ChannelContext *ch, int index, float *out)
+{
+    c->tx_fn(c->tx_ctx, ch->imdct_out, ch->imdct_in, sizeof(float));
+
+    c->fdsp->vector_fmul_window(out, ch->imdct_prev + (128 >> 1),
+                                ch->imdct_out, window, 128 >> 1);
+
+    memcpy(ch->imdct_prev, ch->imdct_out, 128 * sizeof(float));
+}
+
+static void apply_intensity_stereo(HCAContext *s, ChannelContext *ch1, ChannelContext *ch2,
+                                   int index, unsigned band_count, unsigned base_band_count,
+                                   unsigned stereo_band_count)
+{
+    float ratio_l = intensity_ratio_table[ch1->intensity[index]];
+    float ratio_r = ratio_l - 2.0f;
+    float *c1 = &ch1->imdct_in[base_band_count];
+    float *c2 = &ch2->imdct_in[base_band_count];
+
+    if (ch1->chan_type != 1 || !stereo_band_count)
+        return;
+
+    for (int i = 0; i < band_count; i++) {
+        *(c2++)  = *c1 * ratio_r;
+        *(c1++) *= ratio_l;
+    }
+}
+
+static void reconstruct_hfr(HCAContext *s, ChannelContext *ch,
+                            unsigned hfr_group_count,
+                            unsigned bands_per_hfr_group,
+                            unsigned start_band, unsigned total_band_count)
+{
+    if (ch->chan_type == 2 || !bands_per_hfr_group)
+        return;
+
+    for (int i = 0, k = start_band, l = start_band - 1; i < hfr_group_count; i++){
+        for (int j = 0; j < bands_per_hfr_group && k < total_band_count; j++, k++, l--){
+            ch->imdct_in[k] = scale_conversion_table[ch->hfr_scale[i] - ch->scale_factors[l]] * ch->imdct_in[l];
+        }
+    }
+
+    ch->imdct_in[127] = 0;
+}
+
+static void dequantize_coefficients(HCAContext *c, ChannelContext *ch)
+{
+    GetBitContext *gb = &c->gb;
+
+    for (int i = 0; i < ch->count; i++) {
+        unsigned scale = ch->scale[i];
+        int nb_bits = max_bits_table[scale];
+        int value = get_bitsz(gb, nb_bits);
+        float factor;
+
+        if (scale > 7) {
+            value = (1 - ((value & 1) << 1)) * (value >> 1);
+            if (!value)
+                skip_bits_long(gb, -1);
+            factor = value;
+        } else {
+            value += scale << 4;
+            skip_bits_long(gb, quant_spectrum_bits[value] - nb_bits);
+            factor = quant_spectrum_value[value];
+        }
+        ch->imdct_in[i] = factor * ch->base[i];
+    }
+
+    memset(ch->imdct_in + ch->count, 0,  sizeof(ch->imdct_in) - ch->count * sizeof(ch->imdct_in[0]));
+}
+
+static void unpack(HCAContext *c, ChannelContext *ch,
+                   unsigned hfr_group_count,
+                   int packed_noise_level,
+                   const uint8_t *ath)
+{
+    GetBitContext *gb = &c->gb;
+    int delta_bits = get_bits(gb, 3);
+
+    if (delta_bits > 5) {
+        for (int i = 0; i < ch->count; i++)
+            ch->scale_factors[i] = get_bits(gb, 6);
+    } else if (delta_bits) {
+        int factor = get_bits(gb, 6);
+        int max_value = (1 << delta_bits) - 1;
+        int half_max = max_value >> 1;
+
+        ch->scale_factors[0] = factor;
+        for (int i = 1; i < ch->count; i++){
+            int delta = get_bits(gb, delta_bits);
+
+            if (delta == max_value) {
+                factor = get_bits(gb, 6);
+            } else {
+                factor += delta - half_max;
+            }
+            factor = av_clip_uintp2(factor, 6);
+
+            ch->scale_factors[i] = factor;
+        }
+    } else {
+        memset(ch->scale_factors, 0, 128);
+    }
+
+    if (ch->chan_type == 2){
+        ch->intensity[0] = get_bits(gb, 4);
+        if (ch->intensity[0] < 15) {
+            for (int i = 1; i < 8; i++)
+                ch->intensity[i] = get_bits(gb, 4);
+        }
+    } else {
+        for (int i = 0; i < hfr_group_count; i++)
+            ch->hfr_scale[i] = get_bits(gb, 6);
+    }
+
+    for (int i = 0; i < ch->count; i++) {
+        int scale = ch->scale_factors[i];
+
+        if (scale) {
+            scale = c->ath[i] + ((packed_noise_level + i) >> 8) - ((scale * 5) >> 1) + 2;
+            scale = scale_table[av_clip(scale, 0, 58)];
+        }
+        ch->scale[i] = scale;
+    }
+
+    memset(ch->scale + ch->count, 0, sizeof(ch->scale) - ch->count);
+
+    for (int i = 0; i < ch->count; i++)
+        ch->base[i] = dequantizer_scaling_table[ch->scale_factors[i]] * quant_step_size[ch->scale[i]];
+}
+
+static int decode_frame(AVCodecContext *avctx, void *data,
+                        int *got_frame_ptr, AVPacket *avpkt)
+{
+    AVFrame *frame = data;
+    HCAContext *c = avctx->priv_data;
+    int ch, ret, packed_noise_level;
+    GetBitContext *gb = &c->gb;
+    float **samples;
+
+    if (avctx->err_recognition & AV_EF_CRCCHECK) {
+        if (av_crc(c->crc_table, 0, avpkt->data, avpkt->size))
+            return AVERROR_INVALIDDATA;
+    }
+
+    if ((ret = init_get_bits8(gb, avpkt->data, avpkt->size)) < 0)
+        return ret;
+
+    if (get_bits(gb, 16) != 0xFFFF)
+        return AVERROR_INVALIDDATA;
+
+    frame->nb_samples = 1024;
+    if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
+        return ret;
+    samples = (float **)frame->extended_data;
+
+    packed_noise_level = (get_bits(gb, 9) << 8) - get_bits(gb, 7);
+
+    for (ch = 0; ch < avctx->channels; ch++)
+        unpack(c, &c->ch[ch], c->hfr_group_count, packed_noise_level, c->ath);
+
+    for (int i = 0; i < 8; i++) {
+        for (ch = 0; ch < avctx->channels; ch++)
+            dequantize_coefficients(c, &c->ch[ch]);
+        for (ch = 0; ch < avctx->channels; ch++)
+            reconstruct_hfr(c, &c->ch[ch], c->hfr_group_count, c->bands_per_hfr_group,
+                            c->stereo_band_count + c->base_band_count, c->total_band_count);
+        for (ch = 0; ch < avctx->channels - 1; ch++)
+            apply_intensity_stereo(c, &c->ch[ch], &c->ch[ch+1], i,
+                                   c->total_band_count - c->base_band_count,
+                                   c->base_band_count, c->stereo_band_count);
+        for (ch = 0; ch < avctx->channels; ch++)
+            run_imdct(c, &c->ch[ch], i, samples[ch] + i * 128);
+    }
+
+    *got_frame_ptr = 1;
+
+    return avpkt->size;
+}
+
+static av_cold int decode_close(AVCodecContext *avctx)
+{
+    HCAContext *c = avctx->priv_data;
+
+    av_freep(&c->fdsp);
+    av_tx_uninit(&c->tx_ctx);
+
+    return 0;
+}
+
+AVCodec ff_hca_decoder = {
+    .name           = "hca",
+    .long_name      = NULL_IF_CONFIG_SMALL("CRI HCA"),
+    .type           = AVMEDIA_TYPE_AUDIO,
+    .id             = AV_CODEC_ID_HCA,
+    .priv_data_size = sizeof(HCAContext),
+    .init           = decode_init,
+    .decode         = decode_frame,
+    .close          = decode_close,
+    .capabilities   = AV_CODEC_CAP_DR1,
+    .sample_fmts    = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_FLTP,
+                                                      AV_SAMPLE_FMT_NONE },
+};
diff --git a/libavcodec/hcom.c b/libavcodec/hcom.c
new file mode 100644
index 0000000..8300676
--- /dev/null
+++ b/libavcodec/hcom.c
@@ -0,0 +1,151 @@
+/*
+ * HCOM audio decoder
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "libavutil/intreadwrite.h"
+
+#include "avcodec.h"
+#include "get_bits.h"
+#include "internal.h"
+
+typedef struct HEntry {
+    int16_t l, r;
+} HEntry;
+
+typedef struct HCOMContext {
+    AVCodecContext *avctx;
+
+    uint8_t first_sample;
+    uint8_t sample;
+    int dict_entries;
+    int dict_entry;
+    int delta_compression;
+
+    HEntry *dict;
+} HCOMContext;
+
+static av_cold int hcom_init(AVCodecContext *avctx)
+{
+    HCOMContext *s = avctx->priv_data;
+
+    if (avctx->channels != 1) {
+        av_log(avctx, AV_LOG_ERROR, "invalid number of channels\n");
+        return AVERROR_INVALIDDATA;
+    }
+
+    if (avctx->extradata_size <= 7)
+        return AVERROR_INVALIDDATA;
+    s->dict_entries = AV_RB16(avctx->extradata);
+    if (avctx->extradata_size < s->dict_entries * 4 + 7 ||
+        s->dict_entries == 0)
+        return AVERROR_INVALIDDATA;
+    s->delta_compression = AV_RB32(avctx->extradata + 2);
+    s->sample = s->first_sample = avctx->extradata[avctx->extradata_size - 1];
+
+    s->dict = av_calloc(s->dict_entries, sizeof(*s->dict));
+    if (!s->dict)
+        return AVERROR(ENOMEM);
+    for (int i = 0; i < s->dict_entries; i++) {
+        s->dict[i].l = AV_RB16(avctx->extradata + 6 + 4 * i);
+        s->dict[i].r = AV_RB16(avctx->extradata + 6 + 4 * i + 2);
+        if (s->dict[i].l >= 0 &&
+            (s->dict[i].l >= s->dict_entries ||
+             s->dict[i].r >= s->dict_entries ||
+             s->dict[i].r < 0 )) {
+            av_freep(&s->dict);
+            return AVERROR_INVALIDDATA;
+        }
+    }
+    if (s->dict[0].l < 0) {
+        av_freep(&s->dict);
+        return AVERROR_INVALIDDATA;
+    }
+
+    avctx->sample_fmt = AV_SAMPLE_FMT_U8;
+    s->dict_entry = 0;
+
+    return 0;
+}
+
+static int hcom_decode(AVCodecContext *avctx, void *data,
+                       int *got_frame, AVPacket *pkt)
+{
+    HCOMContext *s = avctx->priv_data;
+    AVFrame *frame = data;
+    GetBitContext gb;
+    int ret, n = 0;
+
+    if (pkt->size > INT16_MAX)
+        return AVERROR_INVALIDDATA;
+
+    frame->nb_samples = pkt->size * 8;
+    if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
+        return ret;
+
+    if ((ret = init_get_bits8(&gb, pkt->data, pkt->size)) < 0)
+        return ret;
+
+    while (get_bits_left(&gb) > 0) {
+        if (get_bits1(&gb))
+            s->dict_entry = s->dict[s->dict_entry].r;
+        else
+            s->dict_entry = s->dict[s->dict_entry].l;
+
+        if (s->dict[s->dict_entry].l < 0) {
+            int16_t datum;
+
+            datum = s->dict[s->dict_entry].r;
+
+            if (!s->delta_compression)
+                s->sample = 0;
+            s->sample = (s->sample + datum) & 0xFF;
+
+            frame->data[0][n++] = s->sample;
+
+            s->dict_entry = 0;
+        }
+    }
+
+    frame->nb_samples = n;
+
+    *got_frame = 1;
+
+    return pkt->size;
+}
+
+static av_cold int hcom_close(AVCodecContext *avctx)
+{
+    HCOMContext *s = avctx->priv_data;
+
+    av_freep(&s->dict);
+
+    return 0;
+}
+
+AVCodec ff_hcom_decoder = {
+    .name           = "hcom",
+    .long_name      = NULL_IF_CONFIG_SMALL("HCOM Audio"),
+    .type           = AVMEDIA_TYPE_AUDIO,
+    .id             = AV_CODEC_ID_HCOM,
+    .priv_data_size = sizeof(HCOMContext),
+    .init           = hcom_init,
+    .close          = hcom_close,
+    .decode         = hcom_decode,
+    .capabilities   = AV_CODEC_CAP_DR1,
+};
diff --git a/libavcodec/hevc.h b/libavcodec/hevc.h
index 670168e..1804755 100644
--- a/libavcodec/hevc.h
+++ b/libavcodec/hevc.h
@@ -26,70 +26,70 @@
  * T-REC-H.265-201802
  */
 enum HEVCNALUnitType {
-    HEVC_NAL_TRAIL_N    = 0,
-    HEVC_NAL_TRAIL_R    = 1,
-    HEVC_NAL_TSA_N      = 2,
-    HEVC_NAL_TSA_R      = 3,
-    HEVC_NAL_STSA_N     = 4,
-    HEVC_NAL_STSA_R     = 5,
-    HEVC_NAL_RADL_N     = 6,
-    HEVC_NAL_RADL_R     = 7,
-    HEVC_NAL_RASL_N     = 8,
-    HEVC_NAL_RASL_R     = 9,
-    HEVC_NAL_VCL_N10    = 10,
-    HEVC_NAL_VCL_R11    = 11,
-    HEVC_NAL_VCL_N12    = 12,
-    HEVC_NAL_VCL_R13    = 13,
-    HEVC_NAL_VCL_N14    = 14,
-    HEVC_NAL_VCL_R15    = 15,
-    HEVC_NAL_BLA_W_LP   = 16,
-    HEVC_NAL_BLA_W_RADL = 17,
-    HEVC_NAL_BLA_N_LP   = 18,
-    HEVC_NAL_IDR_W_RADL = 19,
-    HEVC_NAL_IDR_N_LP   = 20,
-    HEVC_NAL_CRA_NUT    = 21,
-    HEVC_NAL_IRAP_VCL22 = 22,
-    HEVC_NAL_IRAP_VCL23 = 23,
-    HEVC_NAL_RSV_VCL24  = 24,
-    HEVC_NAL_RSV_VCL25  = 25,
-    HEVC_NAL_RSV_VCL26  = 26,
-    HEVC_NAL_RSV_VCL27  = 27,
-    HEVC_NAL_RSV_VCL28  = 28,
-    HEVC_NAL_RSV_VCL29  = 29,
-    HEVC_NAL_RSV_VCL30  = 30,
-    HEVC_NAL_RSV_VCL31  = 31,
-    HEVC_NAL_VPS        = 32,
-    HEVC_NAL_SPS        = 33,
-    HEVC_NAL_PPS        = 34,
-    HEVC_NAL_AUD        = 35,
-    HEVC_NAL_EOS_NUT    = 36,
-    HEVC_NAL_EOB_NUT    = 37,
-    HEVC_NAL_FD_NUT     = 38,
-    HEVC_NAL_SEI_PREFIX = 39,
-    HEVC_NAL_SEI_SUFFIX = 40,
-    HEVC_NAL_RSV_NVCL41 = 41,
-    HEVC_NAL_RSV_NVCL42 = 42,
-    HEVC_NAL_RSV_NVCL43 = 43,
-    HEVC_NAL_RSV_NVCL44 = 44,
-    HEVC_NAL_RSV_NVCL45 = 45,
-    HEVC_NAL_RSV_NVCL46 = 46,
-    HEVC_NAL_RSV_NVCL47 = 47,
-    HEVC_NAL_UNSPEC48   = 48,
-    HEVC_NAL_UNSPEC49   = 49,
-    HEVC_NAL_UNSPEC50   = 50,
-    HEVC_NAL_UNSPEC51   = 51,
-    HEVC_NAL_UNSPEC52   = 52,
-    HEVC_NAL_UNSPEC53   = 53,
-    HEVC_NAL_UNSPEC54   = 54,
-    HEVC_NAL_UNSPEC55   = 55,
-    HEVC_NAL_UNSPEC56   = 56,
-    HEVC_NAL_UNSPEC57   = 57,
-    HEVC_NAL_UNSPEC58   = 58,
-    HEVC_NAL_UNSPEC59   = 59,
-    HEVC_NAL_UNSPEC60   = 60,
-    HEVC_NAL_UNSPEC61   = 61,
-    HEVC_NAL_UNSPEC62   = 62,
-    HEVC_NAL_UNSPEC63   = 63,
+    HEVC_NAL_TRAIL_N        = 0,
+    HEVC_NAL_TRAIL_R        = 1,
+    HEVC_NAL_TSA_N          = 2,
+    HEVC_NAL_TSA_R          = 3,
+    HEVC_NAL_STSA_N         = 4,
+    HEVC_NAL_STSA_R         = 5,
+    HEVC_NAL_RADL_N         = 6,
+    HEVC_NAL_RADL_R         = 7,
+    HEVC_NAL_RASL_N         = 8,
+    HEVC_NAL_RASL_R         = 9,
+    HEVC_NAL_VCL_N10        = 10,
+    HEVC_NAL_VCL_R11        = 11,
+    HEVC_NAL_VCL_N12        = 12,
+    HEVC_NAL_VCL_R13        = 13,
+    HEVC_NAL_VCL_N14        = 14,
+    HEVC_NAL_VCL_R15        = 15,
+    HEVC_NAL_BLA_W_LP       = 16,
+    HEVC_NAL_BLA_W_RADL     = 17,
+    HEVC_NAL_BLA_N_LP       = 18,
+    HEVC_NAL_IDR_W_RADL     = 19,
+    HEVC_NAL_IDR_N_LP       = 20,
+    HEVC_NAL_CRA_NUT        = 21,
+    HEVC_NAL_RSV_IRAP_VCL22 = 22,
+    HEVC_NAL_RSV_IRAP_VCL23 = 23,
+    HEVC_NAL_RSV_VCL24      = 24,
+    HEVC_NAL_RSV_VCL25      = 25,
+    HEVC_NAL_RSV_VCL26      = 26,
+    HEVC_NAL_RSV_VCL27      = 27,
+    HEVC_NAL_RSV_VCL28      = 28,
+    HEVC_NAL_RSV_VCL29      = 29,
+    HEVC_NAL_RSV_VCL30      = 30,
+    HEVC_NAL_RSV_VCL31      = 31,
+    HEVC_NAL_VPS            = 32,
+    HEVC_NAL_SPS            = 33,
+    HEVC_NAL_PPS            = 34,
+    HEVC_NAL_AUD            = 35,
+    HEVC_NAL_EOS_NUT        = 36,
+    HEVC_NAL_EOB_NUT        = 37,
+    HEVC_NAL_FD_NUT         = 38,
+    HEVC_NAL_SEI_PREFIX     = 39,
+    HEVC_NAL_SEI_SUFFIX     = 40,
+    HEVC_NAL_RSV_NVCL41     = 41,
+    HEVC_NAL_RSV_NVCL42     = 42,
+    HEVC_NAL_RSV_NVCL43     = 43,
+    HEVC_NAL_RSV_NVCL44     = 44,
+    HEVC_NAL_RSV_NVCL45     = 45,
+    HEVC_NAL_RSV_NVCL46     = 46,
+    HEVC_NAL_RSV_NVCL47     = 47,
+    HEVC_NAL_UNSPEC48       = 48,
+    HEVC_NAL_UNSPEC49       = 49,
+    HEVC_NAL_UNSPEC50       = 50,
+    HEVC_NAL_UNSPEC51       = 51,
+    HEVC_NAL_UNSPEC52       = 52,
+    HEVC_NAL_UNSPEC53       = 53,
+    HEVC_NAL_UNSPEC54       = 54,
+    HEVC_NAL_UNSPEC55       = 55,
+    HEVC_NAL_UNSPEC56       = 56,
+    HEVC_NAL_UNSPEC57       = 57,
+    HEVC_NAL_UNSPEC58       = 58,
+    HEVC_NAL_UNSPEC59       = 59,
+    HEVC_NAL_UNSPEC60       = 60,
+    HEVC_NAL_UNSPEC61       = 61,
+    HEVC_NAL_UNSPEC62       = 62,
+    HEVC_NAL_UNSPEC63       = 63,
 };
 
 enum HEVCSliceType {
@@ -143,6 +143,9 @@
     // A.4.1: table A.6 allows at most 20 tile columns for any level.
     HEVC_MAX_TILE_COLUMNS = 20,
 
+    // A.4.2: table A.6 allows at most 600 slice segments for any level.
+    HEVC_MAX_SLICE_SEGMENTS = 600,
+
     // 7.4.7.1: in the worst case (tiles_enabled_flag and
     // entropy_coding_sync_enabled_flag are both set), entry points can be
     // placed at the beginning of every Ctb row in every tile, giving an
diff --git a/libavcodec/hevc_cabac.c b/libavcodec/hevc_cabac.c
index faa36d5..3dc0987 100644
--- a/libavcodec/hevc_cabac.c
+++ b/libavcodec/hevc_cabac.c
@@ -66,7 +66,7 @@
      1, // no_residual_data_flag
      3, // split_transform_flag
      2, // cbf_luma
-     4, // cbf_cb, cbf_cr
+     5, // cbf_cb, cbf_cr
      2, // transform_skip_flag[][]
      2, // explicit_rdpcm_flag[][]
      2, // explicit_rdpcm_dir_flag[][]
@@ -122,23 +122,23 @@
     37, // split_transform_flag
     40, // cbf_luma
     42, // cbf_cb, cbf_cr
-    46, // transform_skip_flag[][]
-    48, // explicit_rdpcm_flag[][]
-    50, // explicit_rdpcm_dir_flag[][]
-    52, // last_significant_coeff_x_prefix
-    70, // last_significant_coeff_y_prefix
-    88, // last_significant_coeff_x_suffix
-    88, // last_significant_coeff_y_suffix
-    88, // significant_coeff_group_flag
-    92, // significant_coeff_flag
-    136, // coeff_abs_level_greater1_flag
-    160, // coeff_abs_level_greater2_flag
-    166, // coeff_abs_level_remaining
-    166, // coeff_sign_flag
-    166, // log2_res_scale_abs
-    174, // res_scale_sign_flag
-    176, // cu_chroma_qp_offset_flag
-    177, // cu_chroma_qp_offset_idx
+    47, // transform_skip_flag[][]
+    49, // explicit_rdpcm_flag[][]
+    51, // explicit_rdpcm_dir_flag[][]
+    53, // last_significant_coeff_x_prefix
+    71, // last_significant_coeff_y_prefix
+    89, // last_significant_coeff_x_suffix
+    89, // last_significant_coeff_y_suffix
+    89, // significant_coeff_group_flag
+    93, // significant_coeff_flag
+    137, // coeff_abs_level_greater1_flag
+    161, // coeff_abs_level_greater2_flag
+    167, // coeff_abs_level_remaining
+    167, // coeff_sign_flag
+    167, // log2_res_scale_abs
+    175, // res_scale_sign_flag
+    177, // cu_chroma_qp_offset_flag
+    178, // cu_chroma_qp_offset_idx
 };
 
 #define CNU 154
@@ -189,7 +189,7 @@
       // cbf_luma
       111, 141,
       // cbf_cb, cbf_cr
-      94, 138, 182, 154,
+      94, 138, 182, 154, 154,
       // transform_skip_flag
       139, 139,
       // explicit_rdpcm_flag
@@ -266,7 +266,7 @@
       // cbf_luma
       153, 111,
       // cbf_cb, cbf_cr
-      149, 107, 167, 154,
+      149, 107, 167, 154, 154,
       // transform_skip_flag
       139, 139,
       // explicit_rdpcm_flag
@@ -343,7 +343,7 @@
       // cbf_luma
       153, 111,
       // cbf_cb, cbf_cr
-      149, 92, 167, 154,
+      149, 92, 167, 154, 154,
       // transform_skip_flag
       139, 139,
       // explicit_rdpcm_flag
@@ -642,11 +642,11 @@
     }
     if (prefix_val >= 5) {
         int k = 0;
-        while (k < CABAC_MAX_BIN && get_cabac_bypass(&s->HEVClc->cc)) {
+        while (k < 7 && get_cabac_bypass(&s->HEVClc->cc)) {
             suffix_val += 1 << k;
             k++;
         }
-        if (k == CABAC_MAX_BIN) {
+        if (k == 7) {
             av_log(s->avctx, AV_LOG_ERROR, "CABAC_MAX_BIN : %d\n", k);
             return AVERROR_INVALIDDATA;
         }
diff --git a/libavcodec/hevc_mp4toannexb_bsf.c b/libavcodec/hevc_mp4toannexb_bsf.c
index 09bce5b..30f733d 100644
--- a/libavcodec/hevc_mp4toannexb_bsf.c
+++ b/libavcodec/hevc_mp4toannexb_bsf.c
@@ -144,6 +144,11 @@
         for (i = 0; i < s->length_size; i++)
             nalu_size = (nalu_size << 8) | bytestream2_get_byte(&gb);
 
+        if (nalu_size < 2) {
+            ret = AVERROR_INVALIDDATA;
+            goto fail;
+        }
+
         nalu_type = (bytestream2_peek_byte(&gb) >> 1) & 0x3f;
 
         /* prepend extradata to IRAP frames */
@@ -152,8 +157,7 @@
         extra_size    = add_extradata * ctx->par_out->extradata_size;
         got_irap     |= is_irap;
 
-        if (SIZE_MAX - nalu_size < 4 ||
-            SIZE_MAX - 4 - nalu_size < extra_size) {
+        if (FFMIN(INT_MAX, SIZE_MAX) < 4ULL + nalu_size + extra_size) {
             ret = AVERROR_INVALIDDATA;
             goto fail;
         }
@@ -164,7 +168,7 @@
         if (ret < 0)
             goto fail;
 
-        if (add_extradata)
+        if (extra_size)
             memcpy(out->data + prev_size, ctx->par_out->extradata, extra_size);
         AV_WB32(out->data + prev_size + extra_size, 1);
         bytestream2_get_buffer(&gb, out->data + prev_size + 4 + extra_size, nalu_size);
diff --git a/libavcodec/hevc_parse.c b/libavcodec/hevc_parse.c
index b1b27ee..29dfd47 100644
--- a/libavcodec/hevc_parse.c
+++ b/libavcodec/hevc_parse.c
@@ -29,13 +29,16 @@
     int ret = 0;
     H2645Packet pkt = { 0 };
 
-    ret = ff_h2645_packet_split(&pkt, buf, buf_size, logctx, is_nalff, nal_length_size, AV_CODEC_ID_HEVC, 1);
+    ret = ff_h2645_packet_split(&pkt, buf, buf_size, logctx, is_nalff,
+                                nal_length_size, AV_CODEC_ID_HEVC, 1, 0);
     if (ret < 0) {
         goto done;
     }
 
     for (i = 0; i < pkt.nb_nals; i++) {
         H2645NAL *nal = &pkt.nals[i];
+        if (nal->nuh_layer_id > 0)
+            continue;
 
         /* ignore everything except parameter sets and VCL NALUs */
         switch (nal->type) {
diff --git a/libavcodec/hevc_parser.c b/libavcodec/hevc_parser.c
index 369d133..84f19b4 100644
--- a/libavcodec/hevc_parser.c
+++ b/libavcodec/hevc_parser.c
@@ -194,7 +194,7 @@
     ff_hevc_reset_sei(sei);
 
     ret = ff_h2645_packet_split(&ctx->pkt, buf, buf_size, avctx, ctx->is_avc,
-                                ctx->nal_length_size, AV_CODEC_ID_HEVC, 1);
+                                ctx->nal_length_size, AV_CODEC_ID_HEVC, 1, 0);
     if (ret < 0)
         return ret;
 
@@ -202,6 +202,9 @@
         H2645NAL *nal = &ctx->pkt.nals[i];
         GetBitContext *gb = &nal->gb;
 
+        if (nal->nuh_layer_id > 0)
+            continue;
+
         switch (nal->type) {
         case HEVC_NAL_VPS:
             ff_hevc_decode_nal_vps(gb, avctx, ps);
@@ -232,6 +235,11 @@
         case HEVC_NAL_RADL_R:
         case HEVC_NAL_RASL_N:
         case HEVC_NAL_RASL_R:
+            if (ctx->sei.picture_timing.picture_struct == HEVC_SEI_PIC_STRUCT_FRAME_DOUBLING) {
+                s->repeat_pict = 1;
+            } else if (ctx->sei.picture_timing.picture_struct == HEVC_SEI_PIC_STRUCT_FRAME_TRIPLING) {
+                s->repeat_pict = 2;
+            }
             ret = hevc_parse_slice_header(s, nal, avctx);
             if (ret)
                 return ret;
@@ -239,7 +247,7 @@
         }
     }
     /* didn't find a picture! */
-    av_log(avctx, AV_LOG_ERROR, "missing picture in access unit\n");
+    av_log(avctx, AV_LOG_ERROR, "missing picture in access unit with size %d\n", buf_size);
     return -1;
 }
 
diff --git a/libavcodec/hevc_ps.c b/libavcodec/hevc_ps.c
index ea984af..ea6fd53 100644
--- a/libavcodec/hevc_ps.c
+++ b/libavcodec/hevc_ps.c
@@ -267,7 +267,7 @@
 {
     int i;
 
-    if (get_bits_left(gb) < 2+1+5 + 32 + 4 + 16 + 16 + 12)
+    if (get_bits_left(gb) < 2+1+5 + 32 + 4 + 43 + 1)
         return -1;
 
     ptl->profile_space = get_bits(gb, 2);
@@ -295,9 +295,43 @@
     ptl->non_packed_constraint_flag = get_bits1(gb);
     ptl->frame_only_constraint_flag = get_bits1(gb);
 
-    skip_bits(gb, 16); // XXX_reserved_zero_44bits[0..15]
-    skip_bits(gb, 16); // XXX_reserved_zero_44bits[16..31]
-    skip_bits(gb, 12); // XXX_reserved_zero_44bits[32..43]
+#define check_profile_idc(idc) \
+        ptl->profile_idc == idc || ptl->profile_compatibility_flag[idc]
+
+    if (check_profile_idc(4) || check_profile_idc(5) || check_profile_idc(6) ||
+        check_profile_idc(7) || check_profile_idc(8) || check_profile_idc(9) ||
+        check_profile_idc(10)) {
+
+        ptl->max_12bit_constraint_flag        = get_bits1(gb);
+        ptl->max_10bit_constraint_flag        = get_bits1(gb);
+        ptl->max_8bit_constraint_flag         = get_bits1(gb);
+        ptl->max_422chroma_constraint_flag    = get_bits1(gb);
+        ptl->max_420chroma_constraint_flag    = get_bits1(gb);
+        ptl->max_monochrome_constraint_flag   = get_bits1(gb);
+        ptl->intra_constraint_flag            = get_bits1(gb);
+        ptl->one_picture_only_constraint_flag = get_bits1(gb);
+        ptl->lower_bit_rate_constraint_flag   = get_bits1(gb);
+
+        if (check_profile_idc(5) || check_profile_idc(9) || check_profile_idc(10)) {
+            ptl->max_14bit_constraint_flag    = get_bits1(gb);
+            skip_bits_long(gb, 33); // XXX_reserved_zero_33bits[0..32]
+        } else {
+            skip_bits_long(gb, 34); // XXX_reserved_zero_34bits[0..33]
+        }
+    } else if (check_profile_idc(2)) {
+        skip_bits(gb, 7);
+        ptl->one_picture_only_constraint_flag = get_bits1(gb);
+        skip_bits_long(gb, 35); // XXX_reserved_zero_35bits[0..34]
+    } else {
+        skip_bits_long(gb, 43); // XXX_reserved_zero_43bits[0..42]
+    }
+
+    if (check_profile_idc(1) || check_profile_idc(2) || check_profile_idc(3) ||
+        check_profile_idc(4) || check_profile_idc(5) || check_profile_idc(9))
+        ptl->inbld_flag = get_bits1(gb);
+    else
+        skip_bits1(gb);
+#undef check_profile_idc
 
     return 0;
 }
@@ -448,10 +482,6 @@
     memcpy(vps->data, gb->buffer, vps->data_size);
 
     vps_id = get_bits(gb, 4);
-    if (vps_id >= HEVC_MAX_VPS_COUNT) {
-        av_log(avctx, AV_LOG_ERROR, "VPS id out of range: %d\n", vps_id);
-        goto err;
-    }
 
     if (get_bits(gb, 2) != 3) { // vps_reserved_three_2bits
         av_log(avctx, AV_LOG_ERROR, "vps_reserved_three_2bits is not three\n");
@@ -883,10 +913,6 @@
     // Coded parameters
 
     sps->vps_id = get_bits(gb, 4);
-    if (sps->vps_id >= HEVC_MAX_VPS_COUNT) {
-        av_log(avctx, AV_LOG_ERROR, "VPS id out of range: %d\n", sps->vps_id);
-        return AVERROR_INVALIDDATA;
-    }
 
     if (vps_list && !vps_list[sps->vps_id]) {
         av_log(avctx, AV_LOG_ERROR, "VPS %d does not exist\n",
@@ -1102,20 +1128,17 @@
         decode_vui(gb, avctx, apply_defdispwin, sps);
 
     if (get_bits1(gb)) { // sps_extension_flag
-        int sps_range_extension_flag = get_bits1(gb);
+        sps->sps_range_extension_flag = get_bits1(gb);
         skip_bits(gb, 7); //sps_extension_7bits = get_bits(gb, 7);
-        if (sps_range_extension_flag) {
-            int extended_precision_processing_flag;
-            int cabac_bypass_alignment_enabled_flag;
-
+        if (sps->sps_range_extension_flag) {
             sps->transform_skip_rotation_enabled_flag = get_bits1(gb);
             sps->transform_skip_context_enabled_flag  = get_bits1(gb);
             sps->implicit_rdpcm_enabled_flag = get_bits1(gb);
 
             sps->explicit_rdpcm_enabled_flag = get_bits1(gb);
 
-            extended_precision_processing_flag = get_bits1(gb);
-            if (extended_precision_processing_flag)
+            sps->extended_precision_processing_flag = get_bits1(gb);
+            if (sps->extended_precision_processing_flag)
                 av_log(avctx, AV_LOG_WARNING,
                    "extended_precision_processing_flag not yet implemented\n");
 
@@ -1127,8 +1150,8 @@
 
             sps->persistent_rice_adaptation_enabled_flag = get_bits1(gb);
 
-            cabac_bypass_alignment_enabled_flag  = get_bits1(gb);
-            if (cabac_bypass_alignment_enabled_flag)
+            sps->cabac_bypass_alignment_enabled_flag  = get_bits1(gb);
+            if (sps->cabac_bypass_alignment_enabled_flag)
                 av_log(avctx, AV_LOG_WARNING,
                    "cabac_bypass_alignment_enabled_flag not yet implemented\n");
         }
@@ -1587,22 +1610,25 @@
     pps->entropy_coding_sync_enabled_flag = get_bits1(gb);
 
     if (pps->tiles_enabled_flag) {
-        pps->num_tile_columns = get_ue_golomb_long(gb) + 1;
-        pps->num_tile_rows    = get_ue_golomb_long(gb) + 1;
-        if (pps->num_tile_columns <= 0 ||
-            pps->num_tile_columns >= sps->width) {
+        int num_tile_columns_minus1 = get_ue_golomb(gb);
+        int num_tile_rows_minus1    = get_ue_golomb(gb);
+
+        if (num_tile_columns_minus1 < 0 ||
+            num_tile_columns_minus1 >= sps->ctb_width) {
             av_log(avctx, AV_LOG_ERROR, "num_tile_columns_minus1 out of range: %d\n",
-                   pps->num_tile_columns - 1);
-            ret = AVERROR_INVALIDDATA;
+                   num_tile_columns_minus1);
+            ret = num_tile_columns_minus1 < 0 ? num_tile_columns_minus1 : AVERROR_INVALIDDATA;
             goto err;
         }
-        if (pps->num_tile_rows <= 0 ||
-            pps->num_tile_rows >= sps->height) {
+        if (num_tile_rows_minus1 < 0 ||
+            num_tile_rows_minus1 >= sps->ctb_height) {
             av_log(avctx, AV_LOG_ERROR, "num_tile_rows_minus1 out of range: %d\n",
-                   pps->num_tile_rows - 1);
-            ret = AVERROR_INVALIDDATA;
+                   num_tile_rows_minus1);
+            ret = num_tile_rows_minus1 < 0 ? num_tile_rows_minus1 : AVERROR_INVALIDDATA;
             goto err;
         }
+        pps->num_tile_columns = num_tile_columns_minus1 + 1;
+        pps->num_tile_rows    = num_tile_rows_minus1    + 1;
 
         pps->column_width = av_malloc_array(pps->num_tile_columns, sizeof(*pps->column_width));
         pps->row_height   = av_malloc_array(pps->num_tile_rows,    sizeof(*pps->row_height));
@@ -1686,9 +1712,9 @@
     pps->slice_header_extension_present_flag = get_bits1(gb);
 
     if (get_bits1(gb)) { // pps_extension_present_flag
-        int pps_range_extensions_flag = get_bits1(gb);
+        pps->pps_range_extensions_flag = get_bits1(gb);
         skip_bits(gb, 7); // pps_extension_7bits
-        if (sps->ptl.general_ptl.profile_idc == FF_PROFILE_HEVC_REXT && pps_range_extensions_flag) {
+        if (sps->ptl.general_ptl.profile_idc == FF_PROFILE_HEVC_REXT && pps->pps_range_extensions_flag) {
             if ((ret = pps_range_extensions(gb, avctx, pps, sps)) < 0)
                 goto err;
         }
diff --git a/libavcodec/hevc_ps.h b/libavcodec/hevc_ps.h
index 1fbda19..8e1bccd 100644
--- a/libavcodec/hevc_ps.h
+++ b/libavcodec/hevc_ps.h
@@ -177,11 +177,22 @@
     uint8_t tier_flag;
     uint8_t profile_idc;
     uint8_t profile_compatibility_flag[32];
-    uint8_t level_idc;
     uint8_t progressive_source_flag;
     uint8_t interlaced_source_flag;
     uint8_t non_packed_constraint_flag;
     uint8_t frame_only_constraint_flag;
+    uint8_t max_12bit_constraint_flag;
+    uint8_t max_10bit_constraint_flag;
+    uint8_t max_8bit_constraint_flag;
+    uint8_t max_422chroma_constraint_flag;
+    uint8_t max_420chroma_constraint_flag;
+    uint8_t max_monochrome_constraint_flag;
+    uint8_t intra_constraint_flag;
+    uint8_t one_picture_only_constraint_flag;
+    uint8_t lower_bit_rate_constraint_flag;
+    uint8_t max_14bit_constraint_flag;
+    uint8_t inbld_flag;
+    uint8_t level_idc;
 } PTLCommon;
 
 typedef struct PTL {
@@ -284,13 +295,16 @@
     int max_transform_hierarchy_depth_inter;
     int max_transform_hierarchy_depth_intra;
 
+    int sps_range_extension_flag;
     int transform_skip_rotation_enabled_flag;
     int transform_skip_context_enabled_flag;
     int implicit_rdpcm_enabled_flag;
     int explicit_rdpcm_enabled_flag;
+    int extended_precision_processing_flag;
     int intra_smoothing_disabled_flag;
     int high_precision_offsets_enabled_flag;
     int persistent_rice_adaptation_enabled_flag;
+    int cabac_bypass_alignment_enabled_flag;
 
     ///< coded frame dimension in various units
     int width;
@@ -344,8 +358,8 @@
     uint8_t tiles_enabled_flag;
     uint8_t entropy_coding_sync_enabled_flag;
 
-    int num_tile_columns;   ///< num_tile_columns_minus1 + 1
-    int num_tile_rows;      ///< num_tile_rows_minus1 + 1
+    uint16_t num_tile_columns;   ///< num_tile_columns_minus1 + 1
+    uint16_t num_tile_rows;      ///< num_tile_rows_minus1 + 1
     uint8_t uniform_spacing_flag;
     uint8_t loop_filter_across_tiles_enabled_flag;
 
@@ -365,6 +379,7 @@
     int num_extra_slice_header_bits;
     uint8_t slice_header_extension_present_flag;
     uint8_t log2_max_transform_skip_block_size;
+    uint8_t pps_range_extensions_flag;
     uint8_t cross_component_prediction_enabled_flag;
     uint8_t chroma_qp_offset_list_enabled_flag;
     uint8_t diff_cu_chroma_qp_offset_depth;
diff --git a/libavcodec/hevc_ps_enc.c b/libavcodec/hevc_ps_enc.c
index 4c71cf4..78a73a5 100644
--- a/libavcodec/hevc_ps_enc.c
+++ b/libavcodec/hevc_ps_enc.c
@@ -67,7 +67,7 @@
                            uint8_t *buf, int buf_size)
 {
     PutBitContext pb;
-    int i;
+    int i, data_size;
 
     init_put_bits(&pb, buf, buf_size);
     put_bits(&pb,  4, id);
@@ -103,6 +103,7 @@
         if (vps->vps_poc_proportional_to_timing_flag)
             set_ue_golomb(&pb, vps->vps_num_ticks_poc_diff_one - 1);
 
+        set_ue_golomb(&pb, vps->vps_num_hrd_parameters);
         if (vps->vps_num_hrd_parameters) {
             avpriv_report_missing_feature(NULL, "Writing HRD parameters");
             return AVERROR_PATCHWELCOME;
@@ -114,5 +115,8 @@
     put_bits(&pb, 1, 1);    // stop bit
     avpriv_align_put_bits(&pb);
 
-    return put_bits_count(&pb) / 8;
+    data_size = put_bits_count(&pb) / 8;
+    flush_put_bits(&pb);
+
+    return data_size;
 }
diff --git a/libavcodec/hevc_refs.c b/libavcodec/hevc_refs.c
index 7cf3a55..7870a72 100644
--- a/libavcodec/hevc_refs.c
+++ b/libavcodec/hevc_refs.c
@@ -394,7 +394,7 @@
 static HEVCFrame *generate_missing_ref(HEVCContext *s, int poc)
 {
     HEVCFrame *frame;
-    int i, x, y;
+    int i, y;
 
     frame = alloc_frame(s);
     if (!frame)
@@ -407,11 +407,11 @@
                        frame->frame->buf[i]->size);
         } else {
             for (i = 0; frame->frame->data[i]; i++)
-                for (y = 0; y < (s->ps.sps->height >> s->ps.sps->vshift[i]); y++)
-                    for (x = 0; x < (s->ps.sps->width >> s->ps.sps->hshift[i]); x++) {
-                        AV_WN16(frame->frame->data[i] + y * frame->frame->linesize[i] + 2 * x,
-                                1 << (s->ps.sps->bit_depth - 1));
-                    }
+                for (y = 0; y < (s->ps.sps->height >> s->ps.sps->vshift[i]); y++) {
+                    uint8_t *dst = frame->frame->data[i] + y * frame->frame->linesize[i];
+                    AV_WN16(dst, 1 << (s->ps.sps->bit_depth - 1));
+                    av_memcpy_backptr(dst + 2, 2, 2*(s->ps.sps->width >> s->ps.sps->hshift[i]) - 2);
+                }
         }
     }
 
diff --git a/libavcodec/hevc_sei.c b/libavcodec/hevc_sei.c
index c59bd43..6057069 100644
--- a/libavcodec/hevc_sei.c
+++ b/libavcodec/hevc_sei.c
@@ -76,8 +76,8 @@
 static int decode_nal_sei_content_light_info(HEVCSEIContentLight *s, GetBitContext *gb)
 {
     // Max and average light levels
-    s->max_content_light_level     = get_bits_long(gb, 16);
-    s->max_pic_average_light_level = get_bits_long(gb, 16);
+    s->max_content_light_level     = get_bits(gb, 16);
+    s->max_pic_average_light_level = get_bits(gb, 16);
     // As this SEI message comes before the first frame that references it,
     // initialize the flag to 2 and decrement on IRAP access unit so it
     // persists for the coded video sequence (e.g., between two IRAPs)
@@ -144,6 +144,12 @@
         } else if (pic_struct == 1 || pic_struct == 9 || pic_struct == 11) {
             av_log(logctx, AV_LOG_DEBUG, "TOP Field\n");
             h->picture_struct = AV_PICTURE_STRUCTURE_TOP_FIELD;
+        } else if (pic_struct == 7) {
+            av_log(logctx, AV_LOG_DEBUG, "Frame/Field Doubling\n");
+            h->picture_struct = HEVC_SEI_PIC_STRUCT_FRAME_DOUBLING;
+        } else if (pic_struct == 8) {
+            av_log(logctx, AV_LOG_DEBUG, "Frame/Field Tripling\n");
+            h->picture_struct = HEVC_SEI_PIC_STRUCT_FRAME_TRIPLING;
         }
         get_bits(gb, 2);                   // source_scan_type
         get_bits(gb, 1);                   // duplicate_flag
@@ -177,7 +183,8 @@
             size -= 2;
 
             if (cc_count && size >= cc_count * 3) {
-                const uint64_t new_size = (s->a53_caption_size + cc_count
+                int old_size = s->buf_ref ? s->buf_ref->size : 0;
+                const uint64_t new_size = (old_size + cc_count
                                            * UINT64_C(3));
                 int i, ret;
 
@@ -185,14 +192,14 @@
                     return AVERROR(EINVAL);
 
                 /* Allow merging of the cc data from two fields. */
-                ret = av_reallocp(&s->a53_caption, new_size);
+                ret = av_buffer_realloc(&s->buf_ref, new_size);
                 if (ret < 0)
                     return ret;
 
                 for (i = 0; i < cc_count; i++) {
-                    s->a53_caption[s->a53_caption_size++] = get_bits(gb, 8);
-                    s->a53_caption[s->a53_caption_size++] = get_bits(gb, 8);
-                    s->a53_caption[s->a53_caption_size++] = get_bits(gb, 8);
+                    s->buf_ref->data[old_size++] = get_bits(gb, 8);
+                    s->buf_ref->data[old_size++] = get_bits(gb, 8);
+                    s->buf_ref->data[old_size++] = get_bits(gb, 8);
                 }
                 skip_bits(gb, 8); // marker_bits
             }
@@ -363,6 +370,5 @@
 
 void ff_hevc_reset_sei(HEVCSEI *s)
 {
-    s->a53_caption.a53_caption_size = 0;
-    av_freep(&s->a53_caption.a53_caption);
+    av_buffer_unref(&s->a53_caption.buf_ref);
 }
diff --git a/libavcodec/hevc_sei.h b/libavcodec/hevc_sei.h
index e92da25..a44ccca 100644
--- a/libavcodec/hevc_sei.h
+++ b/libavcodec/hevc_sei.h
@@ -52,11 +52,18 @@
     HEVC_SEI_TYPE_DECODED_PICTURE_HASH                 = 132,
     HEVC_SEI_TYPE_SCALABLE_NESTING                     = 133,
     HEVC_SEI_TYPE_REGION_REFRESH_INFO                  = 134,
+    HEVC_SEI_TYPE_TIME_CODE                            = 136,
     HEVC_SEI_TYPE_MASTERING_DISPLAY_INFO               = 137,
     HEVC_SEI_TYPE_CONTENT_LIGHT_LEVEL_INFO             = 144,
     HEVC_SEI_TYPE_ALTERNATIVE_TRANSFER_CHARACTERISTICS = 147,
+    HEVC_SEI_TYPE_ALPHA_CHANNEL_INFO                   = 165,
 } HEVC_SEI_Type;
 
+typedef enum {
+        HEVC_SEI_PIC_STRUCT_FRAME_DOUBLING = 7,
+        HEVC_SEI_PIC_STRUCT_FRAME_TRIPLING = 8
+} HEVC_SEI_PicStructType;
+
 typedef struct HEVCSEIPictureHash {
     uint8_t       md5[3][16];
     uint8_t is_md5;
@@ -81,8 +88,7 @@
 } HEVCSEIPictureTiming;
 
 typedef struct HEVCSEIA53Caption {
-    int a53_caption_size;
-    uint8_t *a53_caption;
+    AVBufferRef *buf_ref;
 } HEVCSEIA53Caption;
 
 typedef struct HEVCSEIMasteringDisplay {
diff --git a/libavcodec/hevcdec.c b/libavcodec/hevcdec.c
index a3b5c8c..36be839 100644
--- a/libavcodec/hevcdec.c
+++ b/libavcodec/hevcdec.c
@@ -182,6 +182,8 @@
     for (i = 0; i < s->sh.nb_refs[L0]; i++) {
         if (luma_weight_l0_flag[i]) {
             int delta_luma_weight_l0 = get_se_golomb(gb);
+            if ((int8_t)delta_luma_weight_l0 != delta_luma_weight_l0)
+                return AVERROR_INVALIDDATA;
             s->sh.luma_weight_l0[i] = (1 << s->sh.luma_log2_weight_denom) + delta_luma_weight_l0;
             s->sh.luma_offset_l0[i] = get_se_golomb(gb);
         }
@@ -224,6 +226,8 @@
         for (i = 0; i < s->sh.nb_refs[L1]; i++) {
             if (luma_weight_l1_flag[i]) {
                 int delta_luma_weight_l1 = get_se_golomb(gb);
+                if ((int8_t)delta_luma_weight_l1 != delta_luma_weight_l1)
+                    return AVERROR_INVALIDDATA;
                 s->sh.luma_weight_l1[i] = (1 << s->sh.luma_log2_weight_denom) + delta_luma_weight_l1;
                 s->sh.luma_offset_l1[i] = get_se_golomb(gb);
             }
@@ -310,9 +314,10 @@
     return 0;
 }
 
-static void export_stream_params(AVCodecContext *avctx, const HEVCParamSets *ps,
-                                 const HEVCSPS *sps)
+static void export_stream_params(HEVCContext *s, const HEVCSPS *sps)
 {
+    AVCodecContext *avctx = s->avctx;
+    const HEVCParamSets *ps = &s->ps;
     const HEVCVPS *vps = (const HEVCVPS*)ps->vps_list[sps->vps_id]->data;
     const HEVCWindow *ow = &sps->output_window;
     unsigned int num = 0, den = 0;
@@ -355,6 +360,12 @@
     if (num != 0 && den != 0)
         av_reduce(&avctx->framerate.den, &avctx->framerate.num,
                   num, den, 1 << 30);
+
+    if (s->sei.alternative_transfer.present &&
+        av_color_transfer_name(s->sei.alternative_transfer.preferred_transfer_characteristics) &&
+        s->sei.alternative_transfer.preferred_transfer_characteristics != AVCOL_TRC_UNSPECIFIED) {
+        avctx->color_trc = s->sei.alternative_transfer.preferred_transfer_characteristics;
+    }
 }
 
 static enum AVPixelFormat get_format(HEVCContext *s, const HEVCSPS *sps)
@@ -408,7 +419,23 @@
         *fmt++ = AV_PIX_FMT_CUDA;
 #endif
         break;
+    case AV_PIX_FMT_YUV444P:
+#if CONFIG_HEVC_VDPAU_HWACCEL
+        *fmt++ = AV_PIX_FMT_VDPAU;
+#endif
+#if CONFIG_HEVC_NVDEC_HWACCEL
+        *fmt++ = AV_PIX_FMT_CUDA;
+#endif
+        break;
+    case AV_PIX_FMT_YUV422P:
+    case AV_PIX_FMT_YUV422P10LE:
+#if CONFIG_HEVC_VAAPI_HWACCEL
+       *fmt++ = AV_PIX_FMT_VAAPI;
+#endif
+        break;
     case AV_PIX_FMT_YUV420P12:
+    case AV_PIX_FMT_YUV444P10:
+    case AV_PIX_FMT_YUV444P12:
 #if CONFIG_HEVC_NVDEC_HWACCEL
         *fmt++ = AV_PIX_FMT_CUDA;
 #endif
@@ -437,7 +464,7 @@
     if (ret < 0)
         goto fail;
 
-    export_stream_params(s->avctx, &s->ps, sps);
+    export_stream_params(s, sps);
 
     s->avctx->pix_fmt = pix_fmt;
 
@@ -485,6 +512,11 @@
 
     // Coded parameters
     sh->first_slice_in_pic_flag = get_bits1(gb);
+    if (s->ref && sh->first_slice_in_pic_flag) {
+        av_log(s->avctx, AV_LOG_ERROR, "Two slices reporting being the first in the same frame.\n");
+        return 1; // This slice will be skipped later, do not corrupt state
+    }
+
     if ((IS_IDR(s) || IS_BLA(s)) && sh->first_slice_in_pic_flag) {
         s->seq_decode = (s->seq_decode + 1) & 0xff;
         s->max_ra     = INT_MAX;
@@ -2752,21 +2784,15 @@
                metadata->MaxCLL, metadata->MaxFALL);
     }
 
-    if (s->sei.a53_caption.a53_caption) {
-        AVFrameSideData* sd = av_frame_new_side_data(out,
-                                                     AV_FRAME_DATA_A53_CC,
-                                                     s->sei.a53_caption.a53_caption_size);
-        if (sd)
-            memcpy(sd->data, s->sei.a53_caption.a53_caption, s->sei.a53_caption.a53_caption_size);
-        av_freep(&s->sei.a53_caption.a53_caption);
-        s->sei.a53_caption.a53_caption_size = 0;
-        s->avctx->properties |= FF_CODEC_PROPERTY_CLOSED_CAPTIONS;
-    }
+    if (s->sei.a53_caption.buf_ref) {
+        HEVCSEIA53Caption *a53 = &s->sei.a53_caption;
 
-    if (s->sei.alternative_transfer.present &&
-        av_color_transfer_name(s->sei.alternative_transfer.preferred_transfer_characteristics) &&
-        s->sei.alternative_transfer.preferred_transfer_characteristics != AVCOL_TRC_UNSPECIFIED) {
-        s->avctx->color_trc = out->color_trc = s->sei.alternative_transfer.preferred_transfer_characteristics;
+        AVFrameSideData *sd = av_frame_new_side_data_from_buf(out, AV_FRAME_DATA_A53_CC, a53->buf_ref);
+        if (!sd)
+            av_buffer_unref(&a53->buf_ref);
+        a53->buf_ref = NULL;
+
+        s->avctx->properties |= FF_CODEC_PROPERTY_CLOSED_CAPTIONS;
     }
 
     return 0;
@@ -2915,6 +2941,11 @@
         ret = hls_slice_header(s);
         if (ret < 0)
             return ret;
+        if (ret == 1) {
+            ret = AVERROR_INVALIDDATA;
+            goto fail;
+        }
+
 
         if (
             (s->avctx->skip_frame >= AVDISCARD_BIDIR && s->sh.slice_type == HEVC_SLICE_B) ||
@@ -2942,6 +2973,7 @@
                     s->max_ra = INT_MIN;
             }
 
+            s->overlap ++;
             ret = hevc_frame_start(s);
             if (ret < 0)
                 return ret;
@@ -3020,11 +3052,12 @@
     s->ref = NULL;
     s->last_eos = s->eos;
     s->eos = 0;
+    s->overlap = 0;
 
     /* split the input packet into NAL units, so we know the upper bound on the
      * number of slices in the frame */
     ret = ff_h2645_packet_split(&s->pkt, buf, length, s->avctx, s->is_nalff,
-                                s->nal_length_size, s->avctx->codec_id, 1);
+                                s->nal_length_size, s->avctx->codec_id, 1, 0);
     if (ret < 0) {
         av_log(s->avctx, AV_LOG_ERROR,
                "Error splitting the input into NAL units.\n");
@@ -3050,10 +3083,12 @@
 
         if (s->avctx->skip_frame >= AVDISCARD_ALL ||
             (s->avctx->skip_frame >= AVDISCARD_NONREF
-            && ff_hevc_nal_is_nonref(nal->type)))
+            && ff_hevc_nal_is_nonref(nal->type)) || nal->nuh_layer_id > 0)
             continue;
 
         ret = decode_nal_unit(s, nal);
+        if (ret >= 0 && s->overlap > 2)
+            ret = AVERROR_INVALIDDATA;
         if (ret < 0) {
             av_log(s->avctx, AV_LOG_WARNING,
                    "Error parsing NAL unit #%d.\n", i);
@@ -3155,7 +3190,7 @@
     for (i = 0; i < FF_ARRAY_ELEMS(s->ps.sps_list); i++) {
         if (first && s->ps.sps_list[i]) {
             const HEVCSPS *sps = (const HEVCSPS*)s->ps.sps_list[i]->data;
-            export_stream_params(s->avctx, &s->ps, sps);
+            export_stream_params(s, sps);
             break;
         }
     }
@@ -3307,6 +3342,8 @@
 
     ff_h2645_packet_uninit(&s->pkt);
 
+    ff_hevc_reset_sei(&s->sei);
+
     return 0;
 }
 
@@ -3432,6 +3469,13 @@
         s->max_ra = INT_MAX;
     }
 
+    av_buffer_unref(&s->sei.a53_caption.buf_ref);
+    if (s0->sei.a53_caption.buf_ref) {
+        s->sei.a53_caption.buf_ref = av_buffer_ref(s0->sei.a53_caption.buf_ref);
+        if (!s->sei.a53_caption.buf_ref)
+            return AVERROR(ENOMEM);
+    }
+
     s->sei.frame_packing        = s0->sei.frame_packing;
     s->sei.display_orientation  = s0->sei.display_orientation;
     s->sei.mastering_display    = s0->sei.mastering_display;
@@ -3447,8 +3491,6 @@
     HEVCContext *s = avctx->priv_data;
     int ret;
 
-    avctx->internal->allocate_progress = 1;
-
     ret = hevc_init_context(avctx);
     if (ret < 0)
         return ret;
@@ -3464,11 +3506,13 @@
     else
         s->threads_number = 1;
 
-    if (avctx->extradata_size > 0 && avctx->extradata) {
-        ret = hevc_decode_extradata(s, avctx->extradata, avctx->extradata_size, 1);
-        if (ret < 0) {
-            hevc_decode_free(avctx);
-            return ret;
+    if (!avctx->internal->is_copy) {
+        if (avctx->extradata_size > 0 && avctx->extradata) {
+            ret = hevc_decode_extradata(s, avctx->extradata, avctx->extradata_size, 1);
+            if (ret < 0) {
+                hevc_decode_free(avctx);
+                return ret;
+            }
         }
     }
 
@@ -3480,26 +3524,11 @@
     return 0;
 }
 
-#if HAVE_THREADS
-static av_cold int hevc_init_thread_copy(AVCodecContext *avctx)
-{
-    HEVCContext *s = avctx->priv_data;
-    int ret;
-
-    memset(s, 0, sizeof(*s));
-
-    ret = hevc_init_context(avctx);
-    if (ret < 0)
-        return ret;
-
-    return 0;
-}
-#endif
-
 static void hevc_decode_flush(AVCodecContext *avctx)
 {
     HEVCContext *s = avctx->priv_data;
     ff_hevc_flush_dpb(s);
+    ff_hevc_reset_sei(&s->sei);
     s->max_ra = INT_MAX;
     s->eos = 1;
 }
@@ -3534,10 +3563,10 @@
     .decode                = hevc_decode_frame,
     .flush                 = hevc_decode_flush,
     .update_thread_context = ONLY_IF_THREADS_ENABLED(hevc_update_thread_context),
-    .init_thread_copy      = ONLY_IF_THREADS_ENABLED(hevc_init_thread_copy),
     .capabilities          = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY |
                              AV_CODEC_CAP_SLICE_THREADS | AV_CODEC_CAP_FRAME_THREADS,
-    .caps_internal         = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_EXPORTS_CROPPING,
+    .caps_internal         = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_EXPORTS_CROPPING |
+                             FF_CODEC_CAP_ALLOCATE_PROGRESS,
     .profiles              = NULL_IF_CONFIG_SMALL(ff_hevc_profiles),
     .hw_configs            = (const AVCodecHWConfigInternal*[]) {
 #if CONFIG_HEVC_DXVA2_HWACCEL
diff --git a/libavcodec/hevcdec.h b/libavcodec/hevcdec.h
index f0f588f..89e0809 100644
--- a/libavcodec/hevcdec.h
+++ b/libavcodec/hevcdec.h
@@ -430,6 +430,7 @@
     int max_ra;
     int bs_width;
     int bs_height;
+    int overlap;
 
     int is_decoded;
     int no_rasl_output_flag;
@@ -559,10 +560,7 @@
     case HEVC_NAL_VCL_N10:
     case HEVC_NAL_VCL_N12:
     case HEVC_NAL_VCL_N14:
-    case HEVC_NAL_BLA_N_LP:
-    case HEVC_NAL_IDR_N_LP:
         return 1;
-        break;
     default: break;
     }
     return 0;
diff --git a/libavcodec/hnm4video.c b/libavcodec/hnm4video.c
index 9e1ac49..177ce1d 100644
--- a/libavcodec/hnm4video.c
+++ b/libavcodec/hnm4video.c
@@ -117,14 +117,17 @@
 static void postprocess_current_frame(AVCodecContext *avctx)
 {
     Hnm4VideoContext *hnm = avctx->priv_data;
-    uint32_t x, y, src_x, src_y;
+    uint32_t x, y, src_y;
+    int width = hnm->width;
 
     for (y = 0; y < hnm->height; y++) {
+        uint8_t *dst = hnm->processed + y * width;
+        const uint8_t *src = hnm->current;
         src_y = y - (y % 2);
-        src_x = src_y * hnm->width + (y % 2);
-        for (x = 0; x < hnm->width; x++) {
-            hnm->processed[(y * hnm->width) + x] = hnm->current[src_x];
-            src_x += 2;
+        src += src_y * width + (y % 2);
+        for (x = 0; x < width; x++) {
+            dst[x] = *src;
+            src += 2;
         }
     }
 }
@@ -143,7 +146,7 @@
     }
 }
 
-static void decode_interframe_v4(AVCodecContext *avctx, uint8_t *src, uint32_t size)
+static int decode_interframe_v4(AVCodecContext *avctx, uint8_t *src, uint32_t size)
 {
     Hnm4VideoContext *hnm = avctx->priv_data;
     GetByteContext gb;
@@ -162,7 +165,7 @@
             if (tag == 0) {
                 if (writeoffset + 2 > hnm->width * hnm->height) {
                     av_log(avctx, AV_LOG_ERROR, "writeoffset out of bounds\n");
-                    break;
+                    return AVERROR_INVALIDDATA;
                 }
                 hnm->current[writeoffset++] = bytestream2_get_byte(&gb);
                 hnm->current[writeoffset++] = bytestream2_get_byte(&gb);
@@ -176,7 +179,7 @@
                 count = bytestream2_get_byte(&gb) * 2;
                 if (writeoffset + count > hnm->width * hnm->height) {
                     av_log(avctx, AV_LOG_ERROR, "writeoffset out of bounds\n");
-                    break;
+                    return AVERROR_INVALIDDATA;
                 }
                 while (count > 0) {
                     hnm->current[writeoffset++] = bytestream2_peek_byte(&gb);
@@ -188,7 +191,7 @@
             }
             if (writeoffset > hnm->width * hnm->height) {
                 av_log(avctx, AV_LOG_ERROR, "writeoffset out of bounds\n");
-                break;
+                return AVERROR_INVALIDDATA;
             }
         } else {
             previous = bytestream2_peek_byte(&gb) & 0x20;
@@ -204,24 +207,25 @@
 
             if (!backward && offset + 2*count > hnm->width * hnm->height) {
                 av_log(avctx, AV_LOG_ERROR, "Attempting to read out of bounds\n");
-                break;
+                return AVERROR_INVALIDDATA;
             } else if (backward && offset + 1 >= hnm->width * hnm->height) {
                 av_log(avctx, AV_LOG_ERROR, "Attempting to read out of bounds\n");
-                break;
+                return AVERROR_INVALIDDATA;
             } else if (writeoffset + 2*count > hnm->width * hnm->height) {
                 av_log(avctx, AV_LOG_ERROR,
                        "Attempting to write out of bounds\n");
-                break;
+                return AVERROR_INVALIDDATA;
+
             }
             if(backward) {
                 if (offset < (!!backline)*(2 * hnm->width - 1) + 2*(left-1)) {
                     av_log(avctx, AV_LOG_ERROR, "Attempting to read out of bounds\n");
-                    break;
+                    return AVERROR_INVALIDDATA;
                 }
             } else {
                 if (offset < (!!backline)*(2 * hnm->width - 1)) {
                     av_log(avctx, AV_LOG_ERROR, "Attempting to read out of bounds\n");
-                    break;
+                    return AVERROR_INVALIDDATA;
                 }
             }
 
@@ -268,6 +272,7 @@
             }
         }
     }
+    return 0;
 }
 
 static void decode_interframe_v4a(AVCodecContext *avctx, uint8_t *src,
@@ -435,7 +440,9 @@
             decode_interframe_v4a(avctx, avpkt->data + 8, avpkt->size - 8);
             memcpy(hnm->processed, hnm->current, hnm->width * hnm->height);
         } else {
-            decode_interframe_v4(avctx, avpkt->data + 8, avpkt->size - 8);
+            int ret = decode_interframe_v4(avctx, avpkt->data + 8, avpkt->size - 8);
+            if (ret < 0)
+                return ret;
             postprocess_current_frame(avctx);
         }
         copy_processed_frame(avctx, frame);
diff --git a/libavcodec/hq_hqa.c b/libavcodec/hq_hqa.c
index ec9da3e0..eec2e98 100644
--- a/libavcodec/hq_hqa.c
+++ b/libavcodec/hq_hqa.c
@@ -248,13 +248,18 @@
     int width, height, quant;
     const uint8_t *src = ctx->gbc.buffer;
 
+    if (bytestream2_get_bytes_left(&ctx->gbc) < 8 + 4*(num_slices + 1))
+        return AVERROR_INVALIDDATA;
+
     width  = bytestream2_get_be16(&ctx->gbc);
     height = bytestream2_get_be16(&ctx->gbc);
 
+    ret = ff_set_dimensions(ctx->avctx, width, height);
+    if (ret < 0)
+        return ret;
+
     ctx->avctx->coded_width         = FFALIGN(width,  16);
     ctx->avctx->coded_height        = FFALIGN(height, 16);
-    ctx->avctx->width               = width;
-    ctx->avctx->height              = height;
     ctx->avctx->bits_per_raw_sample = 8;
     ctx->avctx->pix_fmt             = AV_PIX_FMT_YUVA422P;
 
diff --git a/libavcodec/hqx.c b/libavcodec/hqx.c
index bc24ba9..e2b895a 100644
--- a/libavcodec/hqx.c
+++ b/libavcodec/hqx.c
@@ -471,6 +471,14 @@
     avctx->height              = ctx->height;
     avctx->bits_per_raw_sample = 10;
 
+    //The minimum size is 2bit per macroblock
+    // hqx_decode_422 & hqx_decode_444 have a unconditionally stored 4bits hqx_quants index
+    // hqx_decode_422a & hqx_decode_444a use cbp_vlc which has a minimum length of 2 bits for its VLCs
+    // The code rejects slices overlapping in their input data
+    if (avctx->coded_width / 16 * (avctx->coded_height / 16) *
+        (100 - avctx->discard_damaged_percentage) / 100 > 4LL * avpkt->size)
+        return AVERROR_INVALIDDATA;
+
     switch (ctx->format) {
     case HQX_422:
         avctx->pix_fmt = AV_PIX_FMT_YUV422P16;
@@ -512,9 +520,6 @@
     int i;
     HQXContext *ctx = avctx->priv_data;
 
-    if (avctx->internal->is_copy)
-        return 0;
-
     ff_free_vlc(&ctx->cbp_vlc);
     for (i = 0; i < 3; i++) {
         ff_free_vlc(&ctx->dc_vlc[i]);
diff --git a/libavcodec/htmlsubtitles.c b/libavcodec/htmlsubtitles.c
index fb9f900..8ce66e0 100644
--- a/libavcodec/htmlsubtitles.c
+++ b/libavcodec/htmlsubtitles.c
@@ -24,6 +24,7 @@
 #include "libavutil/common.h"
 #include "libavutil/parseutils.h"
 #include "htmlsubtitles.h"
+#include <ctype.h>
 
 static int html_color_parse(void *log_ctx, const char *str)
 {
@@ -44,14 +45,32 @@
             buf->str[--buf->len] = 0;
 }
 
+/*
+ * Fast code for scanning text enclosed in braces. Functionally
+ * equivalent to this sscanf call:
+ *
+ * sscanf(in, "{\\an%*1u}%n", &len) >= 0 && len > 0
+ */
+static int scanbraces(const char* in) {
+    if (strncmp(in, "{\\an", 4) != 0) {
+        return 0;
+    }
+    if (!av_isdigit(in[4])) {
+        return 0;
+    }
+    if (in[5] != '}') {
+        return 0;
+    }
+    return 1;
+}
+
 /* skip all {\xxx} substrings except for {\an%d}
    and all microdvd like styles such as {Y:xxx} */
 static void handle_open_brace(AVBPrint *dst, const char **inp, int *an, int *closing_brace_missing)
 {
-    int len = 0;
     const char *in = *inp;
 
-    *an += sscanf(in, "{\\an%*1u}%n", &len) >= 0 && len > 0;
+    *an += scanbraces(in);
 
     if (!*closing_brace_missing) {
         if (   (*an != 1 && in[1] == '\\')
@@ -75,6 +94,34 @@
 };
 
 /*
+ * Fast code for scanning the rest of a tag. Functionally equivalent to
+ * this sscanf call:
+ *
+ * sscanf(in, "%127[^<>]>%n", buffer, lenp) == 2
+ */
+static int scantag(const char* in, char* buffer, int* lenp) {
+    int len;
+
+    for (len = 0; len < 128; len++) {
+        const char c = *in++;
+        switch (c) {
+        case '\0':
+            return 0;
+        case '<':
+            return 0;
+        case '>':
+            buffer[len] = '\0';
+            *lenp = len+1;
+            return 1;
+        default:
+            break;
+        }
+        buffer[len] = c;
+    }
+    return 0;
+}
+
+/*
  * The general politic of the convert is to mask unsupported tags or formatting
  * errors (but still alert the user/subtitles writer with an error/warning)
  * without dropping any actual text content for the final user.
@@ -155,7 +202,7 @@
 
             len = 0;
 
-            if (sscanf(in+tag_close+1, "%127[^<>]>%n", buffer, &len) >= 1 && len > 0) {
+            if (scantag(in+tag_close+1, buffer, &len) && len > 0) {
                 const int skip = len + tag_close;
                 const char *tagname = buffer;
                 while (*tagname == ' ') {
diff --git a/libavcodec/huffyuvdec.c b/libavcodec/huffyuvdec.c
index 66357bf..0ee7ec3 100644
--- a/libavcodec/huffyuvdec.c
+++ b/libavcodec/huffyuvdec.c
@@ -418,9 +418,6 @@
         case 0x0F0:
             avctx->pix_fmt = AV_PIX_FMT_GRAY16;
             break;
-        case 0x170:
-            avctx->pix_fmt = AV_PIX_FMT_GRAY8A;
-            break;
         case 0x470:
             avctx->pix_fmt = AV_PIX_FMT_GBRP;
             break;
@@ -573,35 +570,6 @@
     return ret;
 }
 
-#if HAVE_THREADS
-static av_cold int decode_init_thread_copy(AVCodecContext *avctx)
-{
-    HYuvContext *s = avctx->priv_data;
-    int i, ret;
-
-    s->avctx = avctx;
-
-    if ((ret = ff_huffyuv_alloc_temp(s)) < 0) {
-        ff_huffyuv_common_end(s);
-        return ret;
-    }
-
-    for (i = 0; i < 8; i++)
-        s->vlc[i].table = NULL;
-
-    if (s->version >= 2) {
-        if ((ret = read_huffman_tables(s, avctx->extradata + 4,
-                                       avctx->extradata_size)) < 0)
-            return ret;
-    } else {
-        if ((ret = read_old_huffman_tables(s)) < 0)
-            return ret;
-    }
-
-    return 0;
-}
-#endif
-
 /** Subset of GET_VLC for use in hand-roller VLC code */
 #define VLC_INTERN(dst, table, gb, name, bits, max_depth)   \
     code = table[index][0];                                 \
@@ -905,54 +873,23 @@
         s->hdsp.add_hfyu_median_pred_int16((uint16_t *)dst, (const uint16_t *)src, (const uint16_t *)diff, s->n-1, w, left, left_top);
     }
 }
-static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
-                        AVPacket *avpkt)
+
+static int decode_slice(AVCodecContext *avctx, AVFrame *p, int height,
+                        int buf_size, int y_offset, int table_size)
 {
-    const uint8_t *buf = avpkt->data;
-    int buf_size       = avpkt->size;
     HYuvContext *s = avctx->priv_data;
+    int fake_ystride, fake_ustride, fake_vstride;
     const int width  = s->width;
     const int width2 = s->width >> 1;
-    const int height = s->height;
-    int fake_ystride, fake_ustride, fake_vstride;
-    ThreadFrame frame = { .f = data };
-    AVFrame *const p = data;
-    int table_size = 0, ret;
+    int ret;
 
-    if (buf_size < (width * height + 7)/8)
-        return AVERROR_INVALIDDATA;
-
-    av_fast_padded_malloc(&s->bitstream_buffer,
-                   &s->bitstream_buffer_size,
-                   buf_size);
-    if (!s->bitstream_buffer)
-        return AVERROR(ENOMEM);
-
-    s->bdsp.bswap_buf((uint32_t *) s->bitstream_buffer,
-                      (const uint32_t *) buf, buf_size / 4);
-
-    if ((ret = ff_thread_get_buffer(avctx, &frame, 0)) < 0)
-        return ret;
-
-    if (s->context) {
-        table_size = read_huffman_tables(s, s->bitstream_buffer, buf_size);
-        if (table_size < 0)
-            return table_size;
-    }
-
-    if ((unsigned) (buf_size - table_size) >= INT_MAX / 8)
-        return AVERROR_INVALIDDATA;
-
-    if ((ret = init_get_bits(&s->gb, s->bitstream_buffer + table_size,
-                             (buf_size - table_size) * 8)) < 0)
+    if ((ret = init_get_bits8(&s->gb, s->bitstream_buffer + table_size, buf_size - table_size)) < 0)
         return ret;
 
     fake_ystride = s->interlaced ? p->linesize[0] * 2 : p->linesize[0];
     fake_ustride = s->interlaced ? p->linesize[1] * 2 : p->linesize[1];
     fake_vstride = s->interlaced ? p->linesize[2] * 2 : p->linesize[2];
 
-    s->last_slice_end = 0;
-
     if (s->version > 2) {
         int plane;
         for(plane = 0; plane < 1 + 2*s->chroma + s->alpha; plane++) {
@@ -1034,31 +971,31 @@
             return AVERROR_PATCHWELCOME;
         } else {
             leftv         =
-            p->data[2][0] = get_bits(&s->gb, 8);
+            p->data[2][0 + y_offset * p->linesize[2]] = get_bits(&s->gb, 8);
             lefty         =
-            p->data[0][1] = get_bits(&s->gb, 8);
+            p->data[0][1 + y_offset * p->linesize[0]] = get_bits(&s->gb, 8);
             leftu         =
-            p->data[1][0] = get_bits(&s->gb, 8);
-            p->data[0][0] = get_bits(&s->gb, 8);
+            p->data[1][0 + y_offset * p->linesize[1]] = get_bits(&s->gb, 8);
+            p->data[0][0 + y_offset * p->linesize[0]] = get_bits(&s->gb, 8);
 
             switch (s->predictor) {
             case LEFT:
             case PLANE:
                 decode_422_bitstream(s, width - 2);
-                lefty = s->llviddsp.add_left_pred(p->data[0] + 2, s->temp[0],
+                lefty = s->llviddsp.add_left_pred(p->data[0] + p->linesize[0] * y_offset + 2, s->temp[0],
                                                    width - 2, lefty);
                 if (!(s->flags & AV_CODEC_FLAG_GRAY)) {
-                    leftu = s->llviddsp.add_left_pred(p->data[1] + 1, s->temp[1], width2 - 1, leftu);
-                    leftv = s->llviddsp.add_left_pred(p->data[2] + 1, s->temp[2], width2 - 1, leftv);
+                    leftu = s->llviddsp.add_left_pred(p->data[1] + p->linesize[1] * y_offset + 1, s->temp[1], width2 - 1, leftu);
+                    leftv = s->llviddsp.add_left_pred(p->data[2] + p->linesize[2] * y_offset + 1, s->temp[2], width2 - 1, leftv);
                 }
 
-                for (cy = y = 1; y < s->height; y++, cy++) {
+                for (cy = y = 1; y < height; y++, cy++) {
                     uint8_t *ydst, *udst, *vdst;
 
                     if (s->bitstream_bpp == 12) {
                         decode_gray_bitstream(s, width);
 
-                        ydst = p->data[0] + p->linesize[0] * y;
+                        ydst = p->data[0] + p->linesize[0] * (y + y_offset);
 
                         lefty = s->llviddsp.add_left_pred(ydst, s->temp[0],
                                                            width, lefty);
@@ -1067,15 +1004,15 @@
                                 s->llviddsp.add_bytes(ydst, ydst - fake_ystride, width);
                         }
                         y++;
-                        if (y >= s->height)
+                        if (y >= height)
                             break;
                     }
 
                     draw_slice(s, p, y);
 
-                    ydst = p->data[0] + p->linesize[0] * y;
-                    udst = p->data[1] + p->linesize[1] * cy;
-                    vdst = p->data[2] + p->linesize[2] * cy;
+                    ydst = p->data[0] + p->linesize[0] * (y  + y_offset);
+                    udst = p->data[1] + p->linesize[1] * (cy + y_offset);
+                    vdst = p->data[2] + p->linesize[2] * (cy + y_offset);
 
                     decode_422_bitstream(s, width);
                     lefty = s->llviddsp.add_left_pred(ydst, s->temp[0],
@@ -1185,7 +1122,7 @@
     } else {
         int y;
         uint8_t left[4];
-        const int last_line = (height - 1) * p->linesize[0];
+        const int last_line = (y_offset + height - 1) * p->linesize[0];
 
         if (s->bitstream_bpp == 32) {
             left[A] = p->data[0][last_line + A] = get_bits(&s->gb, 8);
@@ -1208,17 +1145,17 @@
                 s->hdsp.add_hfyu_left_pred_bgr32(p->data[0] + last_line + 4,
                                                  s->temp[0], width - 1, left);
 
-                for (y = s->height - 2; y >= 0; y--) { // Yes it is stored upside down.
+                for (y = height - 2; y >= 0; y--) { // Yes it is stored upside down.
                     decode_bgr_bitstream(s, width);
 
-                    s->hdsp.add_hfyu_left_pred_bgr32(p->data[0] + p->linesize[0] * y,
+                    s->hdsp.add_hfyu_left_pred_bgr32(p->data[0] + p->linesize[0] * (y + y_offset),
                                                      s->temp[0], width, left);
                     if (s->predictor == PLANE) {
                         if (s->bitstream_bpp != 32)
                             left[A] = 0;
-                        if (y < s->height - 1 - s->interlaced) {
-                            s->llviddsp.add_bytes(p->data[0] + p->linesize[0] * y,
-                                              p->data[0] + p->linesize[0] * y +
+                        if (y < height - 1 - s->interlaced) {
+                            s->llviddsp.add_bytes(p->data[0] + p->linesize[0] * (y + y_offset),
+                                              p->data[0] + p->linesize[0] * (y + y_offset) +
                                               fake_ystride, 4 * width);
                         }
                     }
@@ -1236,7 +1173,89 @@
             return AVERROR_PATCHWELCOME;
         }
     }
-    emms_c();
+
+    return 0;
+}
+
+static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
+                        AVPacket *avpkt)
+{
+    const uint8_t *buf = avpkt->data;
+    int buf_size       = avpkt->size;
+    HYuvContext *s = avctx->priv_data;
+    const int width  = s->width;
+    const int height = s->height;
+    ThreadFrame frame = { .f = data };
+    AVFrame *const p = data;
+    int slice, table_size = 0, ret, nb_slices;
+    unsigned slices_info_offset;
+    int slice_height;
+
+    if (buf_size < (width * height + 7)/8)
+        return AVERROR_INVALIDDATA;
+
+    av_fast_padded_malloc(&s->bitstream_buffer,
+                   &s->bitstream_buffer_size,
+                   buf_size);
+    if (!s->bitstream_buffer)
+        return AVERROR(ENOMEM);
+
+    s->bdsp.bswap_buf((uint32_t *) s->bitstream_buffer,
+                      (const uint32_t *) buf, buf_size / 4);
+
+    if ((ret = ff_thread_get_buffer(avctx, &frame, 0)) < 0)
+        return ret;
+
+    if (s->context) {
+        table_size = read_huffman_tables(s, s->bitstream_buffer, buf_size);
+        if (table_size < 0)
+            return table_size;
+    }
+
+    if ((unsigned) (buf_size - table_size) >= INT_MAX / 8)
+        return AVERROR_INVALIDDATA;
+
+    s->last_slice_end = 0;
+
+    if (avctx->codec_id == AV_CODEC_ID_HYMT &&
+        (buf_size > 32 && AV_RL32(avpkt->data + buf_size - 16) == 0)) {
+        slices_info_offset = AV_RL32(avpkt->data + buf_size - 4);
+        slice_height = AV_RL32(avpkt->data + buf_size - 8);
+        nb_slices = AV_RL32(avpkt->data + buf_size - 12);
+        if (nb_slices * 8LL + slices_info_offset > buf_size - 16 ||
+            s->chroma_v_shift ||
+            slice_height <= 0 || nb_slices * (uint64_t)slice_height > height)
+            return AVERROR_INVALIDDATA;
+    } else {
+        slice_height = height;
+        nb_slices = 1;
+    }
+
+    for (slice = 0; slice < nb_slices; slice++) {
+        int y_offset, slice_offset, slice_size;
+
+        if (nb_slices > 1) {
+            slice_offset = AV_RL32(avpkt->data + slices_info_offset + slice * 8);
+            slice_size = AV_RL32(avpkt->data + slices_info_offset + slice * 8 + 4);
+
+            if (slice_offset < 0 || slice_size <= 0 || (slice_offset&3) ||
+                slice_offset + (int64_t)slice_size > buf_size)
+                return AVERROR_INVALIDDATA;
+
+            y_offset = height - (slice + 1) * slice_height;
+            s->bdsp.bswap_buf((uint32_t *)s->bitstream_buffer,
+                              (const uint32_t *)(buf + slice_offset), slice_size / 4);
+        } else {
+            y_offset = 0;
+            slice_offset = 0;
+            slice_size = buf_size;
+        }
+
+        ret = decode_slice(avctx, p, slice_height, slice_size, y_offset, table_size);
+        emms_c();
+        if (ret < 0)
+            return ret;
+    }
 
     *got_frame = 1;
 
@@ -1254,7 +1273,6 @@
     .decode           = decode_frame,
     .capabilities     = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DRAW_HORIZ_BAND |
                         AV_CODEC_CAP_FRAME_THREADS,
-    .init_thread_copy = ONLY_IF_THREADS_ENABLED(decode_init_thread_copy),
 };
 
 #if CONFIG_FFVHUFF_DECODER
@@ -1269,6 +1287,20 @@
     .decode           = decode_frame,
     .capabilities     = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DRAW_HORIZ_BAND |
                         AV_CODEC_CAP_FRAME_THREADS,
-    .init_thread_copy = ONLY_IF_THREADS_ENABLED(decode_init_thread_copy),
 };
 #endif /* CONFIG_FFVHUFF_DECODER */
+
+#if CONFIG_HYMT_DECODER
+AVCodec ff_hymt_decoder = {
+    .name             = "hymt",
+    .long_name        = NULL_IF_CONFIG_SMALL("HuffYUV MT"),
+    .type             = AVMEDIA_TYPE_VIDEO,
+    .id               = AV_CODEC_ID_HYMT,
+    .priv_data_size   = sizeof(HYuvContext),
+    .init             = decode_init,
+    .close            = decode_end,
+    .decode           = decode_frame,
+    .capabilities     = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DRAW_HORIZ_BAND |
+                        AV_CODEC_CAP_FRAME_THREADS,
+};
+#endif /* CONFIG_HYMT_DECODER */
diff --git a/libavcodec/huffyuvenc.c b/libavcodec/huffyuvenc.c
index 8be7528..a6f0d06 100644
--- a/libavcodec/huffyuvenc.c
+++ b/libavcodec/huffyuvenc.c
@@ -268,7 +268,6 @@
     case AV_PIX_FMT_YUVA420P:
     case AV_PIX_FMT_YUVA422P:
     case AV_PIX_FMT_GBRAP:
-    case AV_PIX_FMT_GRAY8A:
     case AV_PIX_FMT_YUV420P9:
     case AV_PIX_FMT_YUV420P10:
     case AV_PIX_FMT_YUV420P12:
@@ -1118,11 +1117,10 @@
         AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUV422P, AV_PIX_FMT_YUV444P, AV_PIX_FMT_YUV411P,
         AV_PIX_FMT_YUV410P, AV_PIX_FMT_YUV440P,
         AV_PIX_FMT_GBRP,
-        AV_PIX_FMT_GBRP9, AV_PIX_FMT_GBRP10, AV_PIX_FMT_GBRP12, AV_PIX_FMT_GBRP14,
+        AV_PIX_FMT_GBRP9, AV_PIX_FMT_GBRP10, AV_PIX_FMT_GBRP12, AV_PIX_FMT_GBRP14, AV_PIX_FMT_GBRP16,
         AV_PIX_FMT_GRAY8, AV_PIX_FMT_GRAY16,
         AV_PIX_FMT_YUVA420P, AV_PIX_FMT_YUVA422P, AV_PIX_FMT_YUVA444P,
         AV_PIX_FMT_GBRAP,
-        AV_PIX_FMT_GRAY8A,
         AV_PIX_FMT_YUV420P9, AV_PIX_FMT_YUV420P10, AV_PIX_FMT_YUV420P12, AV_PIX_FMT_YUV420P14, AV_PIX_FMT_YUV420P16,
         AV_PIX_FMT_YUV422P9, AV_PIX_FMT_YUV422P10, AV_PIX_FMT_YUV422P12, AV_PIX_FMT_YUV422P14, AV_PIX_FMT_YUV422P16,
         AV_PIX_FMT_YUV444P9, AV_PIX_FMT_YUV444P10, AV_PIX_FMT_YUV444P12, AV_PIX_FMT_YUV444P14, AV_PIX_FMT_YUV444P16,
diff --git a/libavcodec/hwaccels.h b/libavcodec/hwaccels.h
index 7d73da8..6109c89 100644
--- a/libavcodec/hwaccels.h
+++ b/libavcodec/hwaccels.h
@@ -68,6 +68,7 @@
 extern const AVHWAccel ff_vp9_dxva2_hwaccel;
 extern const AVHWAccel ff_vp9_nvdec_hwaccel;
 extern const AVHWAccel ff_vp9_vaapi_hwaccel;
+extern const AVHWAccel ff_vp9_vdpau_hwaccel;
 extern const AVHWAccel ff_wmv3_d3d11va_hwaccel;
 extern const AVHWAccel ff_wmv3_d3d11va2_hwaccel;
 extern const AVHWAccel ff_wmv3_dxva2_hwaccel;
diff --git a/libavcodec/idcinvideo.c b/libavcodec/idcinvideo.c
index cff9ad3..6b2d808 100644
--- a/libavcodec/idcinvideo.c
+++ b/libavcodec/idcinvideo.c
@@ -243,6 +243,11 @@
     return buf_size;
 }
 
+static const AVCodecDefault idcin_defaults[] = {
+    { "max_pixels", "320*240" },
+    { NULL },
+};
+
 AVCodec ff_idcin_decoder = {
     .name           = "idcinvideo",
     .long_name      = NULL_IF_CONFIG_SMALL("id Quake II CIN video"),
@@ -252,4 +257,5 @@
     .init           = idcin_decode_init,
     .decode         = idcin_decode_frame,
     .capabilities   = AV_CODEC_CAP_DR1,
+    .defaults       = idcin_defaults,
 };
diff --git a/libavcodec/iff.c b/libavcodec/iff.c
index 33cf2e3..75be844 100644
--- a/libavcodec/iff.c
+++ b/libavcodec/iff.c
@@ -111,23 +111,23 @@
     LUT8(4), LUT8(5), LUT8(6), LUT8(7),
 };
 
-#define LUT32(plane) {                                \
-             0,          0,          0,          0,   \
-             0,          0,          0, 1 << plane,   \
-             0,          0, 1 << plane,          0,   \
-             0,          0, 1 << plane, 1 << plane,   \
-             0, 1 << plane,          0,          0,   \
-             0, 1 << plane,          0, 1 << plane,   \
-             0, 1 << plane, 1 << plane,          0,   \
-             0, 1 << plane, 1 << plane, 1 << plane,   \
-    1 << plane,          0,          0,          0,   \
-    1 << plane,          0,          0, 1 << plane,   \
-    1 << plane,          0, 1 << plane,          0,   \
-    1 << plane,          0, 1 << plane, 1 << plane,   \
-    1 << plane, 1 << plane,          0,          0,   \
-    1 << plane, 1 << plane,          0, 1 << plane,   \
-    1 << plane, 1 << plane, 1 << plane,          0,   \
-    1 << plane, 1 << plane, 1 << plane, 1 << plane,   \
+#define LUT32(plane) {                                    \
+              0,           0,           0,           0,   \
+              0,           0,           0, 1U << plane,   \
+              0,           0, 1U << plane,           0,   \
+              0,           0, 1U << plane, 1U << plane,   \
+              0, 1U << plane,           0,           0,   \
+              0, 1U << plane,           0, 1U << plane,   \
+              0, 1U << plane, 1U << plane,           0,   \
+              0, 1U << plane, 1U << plane, 1U << plane,   \
+    1U << plane,           0,           0,           0,   \
+    1U << plane,           0,           0, 1U << plane,   \
+    1U << plane,           0, 1U << plane,           0,   \
+    1U << plane,           0, 1U << plane, 1U << plane,   \
+    1U << plane, 1U << plane,           0,           0,   \
+    1U << plane, 1U << plane,           0, 1U << plane,   \
+    1U << plane, 1U << plane, 1U << plane,           0,   \
+    1U << plane, 1U << plane, 1U << plane, 1U << plane,   \
 }
 
 // 32 planes * 4-bit mask * 4 lookup tables each
@@ -180,6 +180,10 @@
             pal[i] = 0xFF000000 | gray2rgb((i * 255) >> avctx->bits_per_coded_sample);
     }
     if (s->masking == MASK_HAS_MASK) {
+        if ((1 << avctx->bits_per_coded_sample) < count) {
+            avpriv_request_sample(avctx, "overlapping mask");
+            return AVERROR_PATCHWELCOME;
+        }
         memcpy(pal + (1 << avctx->bits_per_coded_sample), pal, count * 4);
         for (i = 0; i < count; i++)
             pal[i] &= 0xFFFFFF;
@@ -280,6 +284,16 @@
         for (i = 0; i < 16; i++)
             s->tvdc[i] = bytestream_get_be16(&buf);
 
+        if (s->ham) {
+            if (s->bpp > 8) {
+                av_log(avctx, AV_LOG_ERROR, "Invalid number of hold bits for HAM: %u\n", s->ham);
+                return AVERROR_INVALIDDATA;
+            } else if (s->ham != (s->bpp > 6 ? 6 : 4)) {
+                av_log(avctx, AV_LOG_ERROR, "Invalid number of hold bits for HAM: %u, BPP: %u\n", s->ham, s->bpp);
+                return AVERROR_INVALIDDATA;
+            }
+        }
+
         if (s->masking == MASK_HAS_MASK) {
             if (s->bpp >= 8 && !s->ham) {
                 avctx->pix_fmt = AV_PIX_FMT_RGB32;
@@ -307,10 +321,9 @@
         if (!s->bpp || s->bpp > 32) {
             av_log(avctx, AV_LOG_ERROR, "Invalid number of bitplanes: %u\n", s->bpp);
             return AVERROR_INVALIDDATA;
-        } else if (s->ham >= 8) {
-            av_log(avctx, AV_LOG_ERROR, "Invalid number of hold bits for HAM: %u\n", s->ham);
-            return AVERROR_INVALIDDATA;
         }
+        if (s->video_size && s->planesize * s->bpp * avctx->height > s->video_size)
+            return AVERROR_INVALIDDATA;
 
         av_freep(&s->ham_buf);
         av_freep(&s->ham_palbuf);
@@ -319,13 +332,17 @@
             int i, count = FFMIN(palette_size / 3, 1 << s->ham);
             int ham_count;
             const uint8_t *const palette = avctx->extradata + AV_RB16(avctx->extradata);
+            int extra_space = 1;
+
+            if (avctx->codec_tag == MKTAG('P', 'B', 'M', ' ') && s->ham == 4)
+                extra_space = 4;
 
             s->ham_buf = av_malloc((s->planesize * 8) + AV_INPUT_BUFFER_PADDING_SIZE);
             if (!s->ham_buf)
                 return AVERROR(ENOMEM);
 
             ham_count = 8 * (1 << s->ham);
-            s->ham_palbuf = av_malloc((ham_count << !!(s->masking == MASK_HAS_MASK)) * sizeof (uint32_t) + AV_INPUT_BUFFER_PADDING_SIZE);
+            s->ham_palbuf = av_malloc(extra_space * (ham_count << !!(s->masking == MASK_HAS_MASK)) * sizeof (uint32_t) + AV_INPUT_BUFFER_PADDING_SIZE);
             if (!s->ham_palbuf) {
                 av_freep(&s->ham_buf);
                 return AVERROR(ENOMEM);
@@ -371,6 +388,8 @@
     av_freep(&s->planebuf);
     av_freep(&s->ham_buf);
     av_freep(&s->ham_palbuf);
+    av_freep(&s->mask_buf);
+    av_freep(&s->mask_palbuf);
     av_freep(&s->video[0]);
     av_freep(&s->video[1]);
     av_freep(&s->pal);
@@ -443,11 +462,12 @@
  */
 static void decodeplane8(uint8_t *dst, const uint8_t *buf, int buf_size, int plane)
 {
-    const uint64_t *lut = plane8_lut[plane];
+    const uint64_t *lut;
     if (plane >= 8) {
         av_log(NULL, AV_LOG_WARNING, "Ignoring extra planes beyond 8\n");
         return;
     }
+    lut = plane8_lut[plane];
     do {
         uint64_t v = AV_RN64A(dst) | lut[*buf++];
         AV_WN64A(dst, v);
@@ -695,13 +715,15 @@
 {
     const uint8_t *src_end = src + src_size;
     int x = 0, y = 0, i;
-    while (src + 5 <= src_end) {
+    while (src_end - src >= 5) {
         int opcode;
         opcode = *(int8_t *)src++;
         if (opcode >= 0) {
             int size = opcode + 1;
             for (i = 0; i < size; i++) {
                 int length = FFMIN(size - i, width);
+                if (src_end - src < length * 4)
+                    return;
                 memcpy(dst + y*linesize + x * 4, src, length * 4);
                 src += length * 4;
                 x += length;
@@ -1130,6 +1152,9 @@
                         x = bytestream2_get_be32(&dgb);
                     }
 
+                    if (ofsdst + (opcode - 1LL) * dstpitch > bytestream2_size_p(&pb))
+                        return;
+
                     while (opcode) {
                         bytestream2_seek_p(&pb, ofsdst, SEEK_SET);
                         if (h && (j == (ncolumns - 1))) {
@@ -1270,6 +1295,9 @@
                         x = bytestream2_get_be32(&gb);
                     }
 
+                    if (ofsdst + (opcode - 1LL) * dstpitch > bytestream2_size_p(&pb))
+                        return;
+
                     while (opcode && bytestream2_get_bytes_left_p(&pb) > 1) {
                         bytestream2_seek_p(&pb, ofsdst, SEEK_SET);
                         if (h && (j == ncolumns - 1))
@@ -1332,6 +1360,9 @@
         bytestream2_init(&gb, buf + ofssrc, buf_end - (buf + ofssrc));
 
         entries = bytestream2_get_be32(&gb);
+        if (entries * 8LL > bytestream2_get_bytes_left(&gb))
+            return;
+
         while (entries && bytestream2_get_bytes_left(&gb) >= 8) {
             int32_t opcode  = bytestream2_get_be32(&gb);
             unsigned offset = bytestream2_get_be32(&gb);
@@ -1339,6 +1370,8 @@
             bytestream2_seek_p(&pb, (offset / planepitch_byte) * pitch + (offset % planepitch_byte) + k * planepitch, SEEK_SET);
             if (opcode >= 0) {
                 uint32_t x = bytestream2_get_be32(&gb);
+                if (opcode && 4 + (opcode - 1LL) * pitch > bytestream2_get_bytes_left_p(&pb))
+                    continue;
                 while (opcode && bytestream2_get_bytes_left_p(&pb) > 0) {
                     bytestream2_put_be32(&pb, x);
                     bytestream2_skip_p(&pb, pitch - 4);
@@ -1512,7 +1545,7 @@
     buf_size -= bytestream2_tell(gb);
     desc = av_pix_fmt_desc_get(avctx->pix_fmt);
 
-    if (!s->init && avctx->bits_per_coded_sample <= 8 &&
+    if (!s->init && avctx->bits_per_coded_sample <= 8 - (s->masking == MASK_HAS_MASK) &&
         avctx->pix_fmt == AV_PIX_FMT_PAL8) {
         if ((res = cmap_read_palette(avctx, (uint32_t *)frame->data[1])) < 0)
             return res;
diff --git a/libavcodec/ilbcdec.c b/libavcodec/ilbcdec.c
index dc8f961..a82a275 100644
--- a/libavcodec/ilbcdec.c
+++ b/libavcodec/ilbcdec.c
@@ -376,15 +376,15 @@
 
         for (j = i; j > 1; j--, l--) {
             high = f[l - 1] >> 16;
-            low = (f[l - 1] - (high << 16)) >> 1;
+            low = (f[l - 1] - (high * (1 << 16))) >> 1;
 
-            tmp = ((high * lsp[k]) << 2) + (((low * lsp[k]) >> 15) << 2);
+            tmp = ((high * lsp[k]) * 4) + (((low * lsp[k]) >> 15) * 4);
 
             f[l] += f[l - 2];
-            f[l] -= tmp;
+            f[l] -= (unsigned)tmp;
         }
 
-        f[l] -= lsp[k] << 10;
+        f[l] -= lsp[k] * (1 << 10);
         l += i;
     }
 }
@@ -402,17 +402,17 @@
     get_lsp_poly(&lsp[1], f[1]);
 
     for (i = 5; i > 0; i--) {
-        f[0][i] += f[0][i - 1];
-        f[1][i] -= f[1][i - 1];
+        f[0][i] += (unsigned)f[0][i - 1];
+        f[1][i] -= (unsigned)f[1][i - 1];
     }
 
     a[0] = 4096;
     for (i = 5; i > 0; i--) {
-        tmp = f[0][6 - i] + f[1][6 - i];
-        a[6 - i] = (tmp + 4096) >> 13;
+        tmp = f[0][6 - i] + (unsigned)f[1][6 - i] + 4096;
+        a[6 - i] = tmp >> 13;
 
-        tmp = f[0][6 - i] - f[1][6 - i];
-        a[5 + i] = (tmp + 4096) >> 13;
+        tmp = f[0][6 - i] - (unsigned)f[1][6 - i] + 4096;
+        a[5 + i] = tmp >> 13;
     }
 }
 
@@ -508,10 +508,10 @@
         int output = 0, sum = 0;
 
         for (j = coefficients_length - 1; j > 0; j--) {
-            sum += coefficients[j] * data_out[i - j];
+            sum += (unsigned)(coefficients[j] * data_out[i - j]);
         }
 
-        output = coefficients[0] * data_in[i] - sum;
+        output = coefficients[0] * data_in[i] - (unsigned)sum;
         output = av_clip(output, -134217728, 134215679);
 
         data_out[i] = (output + 2048) >> 12;
@@ -631,15 +631,16 @@
 static void create_augmented_vector(int index, int16_t *buffer, int16_t *cbVec)
 {
     int16_t cbVecTmp[4];
-    int16_t ilow = index - 4;
+    int interpolation_length = FFMIN(4, index);
+    int16_t ilow = index - interpolation_length;
 
     memcpy(cbVec, buffer - index, index * 2);
 
-    vector_multiplication(&cbVec[ilow], buffer - index - 4, alpha, 4, 15);
-    vector_rmultiplication(cbVecTmp, buffer - 4, &alpha[3], 4, 15);
-    add_vector_and_shift(&cbVec[ilow], &cbVec[ilow], cbVecTmp, 4, 0);
+    vector_multiplication(&cbVec[ilow], buffer - index - interpolation_length, alpha, interpolation_length, 15);
+    vector_rmultiplication(cbVecTmp, buffer - interpolation_length, &alpha[interpolation_length - 1], interpolation_length, 15);
+    add_vector_and_shift(&cbVec[ilow], &cbVec[ilow], cbVecTmp, interpolation_length, 0);
 
-    memcpy(cbVec + index, buffer - index, (SUBL - index) * sizeof(*cbVec));
+    memcpy(cbVec + index, buffer - index, FFMIN(SUBL - index, index) * sizeof(*cbVec));
 }
 
 static void get_codebook(int16_t * cbvec,   /* (o) Constructed codebook vector */
@@ -723,7 +724,7 @@
     int16_t cbvec0[SUBL];
     int16_t cbvec1[SUBL];
     int16_t cbvec2[SUBL];
-    int32_t a32;
+    unsigned a32;
     int16_t *gainPtr;
     int j;
 
@@ -746,7 +747,7 @@
         a32 += SPL_MUL_16_16(*gainPtr++, cbvec1[j]);
         a32 += SPL_MUL_16_16(*gainPtr, cbvec2[j]);
         gainPtr -= 2;
-        decvector[j] = (a32 + 8192) >> 14;
+        decvector[j] = (int)(a32 + 8192) >> 14;
     }
 }
 
@@ -900,12 +901,12 @@
 
 static int32_t scale_dot_product(const int16_t *v1, const int16_t *v2, int length, int scaling)
 {
-    int32_t sum = 0;
+    int64_t sum = 0;
 
     for (int i = 0; i < length; i++)
         sum += (v1[i] * v2[i]) >> scaling;
 
-    return sum;
+    return av_clipl_int32(sum);
 }
 
 static void correlation(int32_t *corr, int32_t *ener, int16_t *buffer,
@@ -1268,7 +1269,7 @@
             /* Calculate the total number of (dynamic) right shifts that have
                been performed on (cross_corr*cross_corr)/energy
              */
-            totscale = energy_scale - (cross_corr_scale << 1);
+            totscale = energy_scale - (cross_corr_scale * 2);
 
             /* Calculate the shift difference in order to be able to compare the two
                (cross_corr*cross_corr)/energy in the same domain
@@ -1302,7 +1303,8 @@
         pos += step;
 
         /* Do a +/- to get the next energy */
-        energy += step * ((*rp_end * *rp_end - *rp_beg * *rp_beg) >> shifts);
+        energy += (unsigned)step * ((*rp_end * *rp_end - *rp_beg * *rp_beg) >> shifts);
+
         rp_beg += step;
         rp_end += step;
     }
@@ -1321,7 +1323,7 @@
         tmp = (tmp >> 15);
         tmp += SPL_MUL_16_16(y[0], ba[3]);    /* (-a[1])*y[i-1] (high part) */
         tmp += SPL_MUL_16_16(y[2], ba[4]);    /* (-a[2])*y[i-2] (high part) */
-        tmp = (tmp << 1);
+        tmp = (tmp * 2);
 
         tmp += SPL_MUL_16_16(signal[i], ba[0]);       /* b[0]*x[0] */
         tmp += SPL_MUL_16_16(x[0], ba[1]);    /* b[1]*x[i-1] */
@@ -1344,11 +1346,11 @@
         } else if (tmp < -268435456) {
             tmp = INT32_MIN;
         } else {
-            tmp = tmp << 3;
+            tmp = tmp * 8;
         }
 
         y[0] = tmp >> 16;
-        y[1] = (tmp - (y[0] << 16)) >> 1;
+        y[1] = (tmp - (y[0] * (1 << 16))) >> 1;
     }
 }
 
@@ -1371,7 +1373,7 @@
 
     if (unpack_frame(s))
         mode = 0;
-    if (s->frame.start < 1)
+    if (s->frame.start < 1 || s->frame.start > 5)
         mode = 0;
 
     if (mode) {
diff --git a/libavcodec/imc.c b/libavcodec/imc.c
index 7cd6db9..82a9081 100644
--- a/libavcodec/imc.c
+++ b/libavcodec/imc.c
@@ -104,6 +104,8 @@
 
     int8_t cyclTab[32], cyclTab2[32];
     float  weights1[31], weights2[31];
+
+    AVCodecContext *avctx;
 } IMCContext;
 
 static VLC huffman_vlc[4][4];
@@ -466,7 +468,7 @@
 
     for (i = 0; i < BANDS - 1; i++) {
         if (chctx->flcoeffs5[i] <= 0) {
-            av_log(NULL, AV_LOG_ERROR, "flcoeffs5 %f invalid\n", chctx->flcoeffs5[i]);
+            av_log(q->avctx, AV_LOG_ERROR, "flcoeffs5 %f invalid\n", chctx->flcoeffs5[i]);
             return AVERROR_INVALIDDATA;
         }
         chctx->flcoeffs4[i] = chctx->flcoeffs3[i] - log2f(chctx->flcoeffs5[i]);
@@ -1022,6 +1024,8 @@
 
     LOCAL_ALIGNED_16(uint16_t, buf16, [(IMC_BLOCK_SIZE + AV_INPUT_BUFFER_PADDING_SIZE) / 2]);
 
+    q->avctx = avctx;
+
     if (buf_size < IMC_BLOCK_SIZE * avctx->channels) {
         av_log(avctx, AV_LOG_ERROR, "frame too small!\n");
         return AVERROR_INVALIDDATA;
diff --git a/libavcodec/imm4.c b/libavcodec/imm4.c
index a4e9b5d..d92bc30 100644
--- a/libavcodec/imm4.c
+++ b/libavcodec/imm4.c
@@ -41,7 +41,6 @@
     uint8_t *bitstream;
     int bitstream_size;
 
-    int changed_size;
     int factor;
     unsigned lo;
     unsigned hi;
@@ -139,7 +138,7 @@
 }
 
 static int decode_block(AVCodecContext *avctx, GetBitContext *gb,
-                        int block, int factor, int flag, int offset)
+                        int block, int factor, int flag, int offset, int flag2)
 {
     IMM4Context *s = avctx->priv_data;
     const uint8_t *scantable = s->intra_scantable.permutated;
@@ -170,11 +169,19 @@
             break;
     }
 
+    if (s->hi == 2 && flag2 && block < 4) {
+        if (flag)
+            s->block[block][scantable[0]]  *= 2;
+        s->block[block][scantable[1]]  *= 2;
+        s->block[block][scantable[8]]  *= 2;
+        s->block[block][scantable[16]] *= 2;
+    }
+
     return 0;
 }
 
 static int decode_blocks(AVCodecContext *avctx, GetBitContext *gb,
-                         unsigned cbp, int flag, int offset)
+                         unsigned cbp, int flag, int offset, unsigned flag2)
 {
     IMM4Context *s = avctx->priv_data;
     const uint8_t *scantable = s->intra_scantable.permutated;
@@ -194,7 +201,7 @@
         }
 
         if (cbp & (1 << (5 - i))) {
-            ret = decode_block(avctx, gb, i, s->factor, flag, offset);
+            ret = decode_block(avctx, gb, i, s->factor, flag, offset, flag2);
             if (ret < 0)
                 return ret;
         }
@@ -213,11 +220,7 @@
             return AVERROR_INVALIDDATA;
         s->factor = intra_cb[s->lo];
     } else {
-        if (s->hi == 1) {
-            s->factor = s->lo * 2;
-        } else {
-            s->factor = s->lo * 2;
-        }
+        s->factor = s->lo * 2;
     }
 
     if (s->hi) {
@@ -229,14 +232,14 @@
 
     for (y = 0; y < avctx->height; y += 16) {
         for (x = 0; x < avctx->width; x += 16) {
-            unsigned cbphi, cbplo;
+            unsigned flag, cbphi, cbplo;
 
             cbplo = get_vlc2(gb, cbplo_tab.table, cbplo_tab.bits, 1) >> 4;
-            skip_bits1(gb);
+            flag = get_bits1(gb);
 
             cbphi = get_cbphi(gb, 1);
 
-            ret = decode_blocks(avctx, gb, cbplo | (cbphi << 2), 0, offset);
+            ret = decode_blocks(avctx, gb, cbplo | (cbphi << 2), 0, offset, flag);
             if (ret < 0)
                 return ret;
 
@@ -269,11 +272,7 @@
             return AVERROR_INVALIDDATA;
         s->factor = inter_cb[s->lo];
     } else {
-        if (s->hi == 1) {
-            s->factor = s->lo * 2;
-        } else {
-            s->factor = s->lo * 2;
-        }
+        s->factor = s->lo * 2;
     }
 
     if (s->hi) {
@@ -286,7 +285,7 @@
     for (y = 0; y < avctx->height; y += 16) {
         for (x = 0; x < avctx->width; x += 16) {
             int reverse, intra_block, value;
-            unsigned cbphi, cbplo;
+            unsigned cbphi, cbplo, flag2 = 0;
 
             if (get_bits1(gb)) {
                 copy_block16(frame->data[0] + y * frame->linesize[0] + x,
@@ -308,12 +307,12 @@
             intra_block = value & 0x07;
             reverse = intra_block == 3;
             if (reverse)
-                skip_bits1(gb);
+                flag2 = get_bits1(gb);
 
             cbplo = value >> 4;
             cbphi = get_cbphi(gb, reverse);
             if (intra_block) {
-                ret = decode_blocks(avctx, gb, cbplo | (cbphi << 2), 0, offset);
+                ret = decode_blocks(avctx, gb, cbplo | (cbphi << 2), 0, offset, flag2);
                 if (ret < 0)
                     return ret;
 
@@ -330,8 +329,9 @@
                 s->idsp.idct_put(frame->data[2] + (y >> 1) * frame->linesize[2] + (x >> 1),
                                  frame->linesize[2], s->block[5]);
             } else {
-                skip_bits(gb, 2);
-                ret = decode_blocks(avctx, gb, cbplo | (cbphi << 2), 1, offset);
+                flag2 = get_bits1(gb);
+                skip_bits1(gb);
+                ret = decode_blocks(avctx, gb, cbplo | (cbphi << 2), 1, offset, flag2);
                 if (ret < 0)
                     return ret;
 
@@ -370,6 +370,7 @@
     IMM4Context *s = avctx->priv_data;
     GetBitContext *gb = &s->gb;
     AVFrame *frame = data;
+    int width, height;
     unsigned type;
     int ret, scaled;
 
@@ -391,9 +392,11 @@
     avctx->pix_fmt = AV_PIX_FMT_YUV420P;
     avctx->color_range = AVCOL_RANGE_JPEG;
 
+    width = avctx->width;
+    height = avctx->height;
+
     scaled = avpkt->data[8];
     if (scaled < 2) {
-        int width, height;
         int mode = avpkt->data[10];
 
         switch (mode) {
@@ -422,17 +425,8 @@
             height = 576;
             break;
         }
-
-        if (s->changed_size == 1 &&
-            (avctx->width != width || avctx->height != height)) {
-            av_log(avctx, AV_LOG_ERROR, "Frame size change is unsupported.\n");
-            return AVERROR_INVALIDDATA;
-        }
-        avctx->width = width;
-        avctx->height = height;
     }
 
-    s->changed_size = 1;
     skip_bits_long(gb, 24 * 8);
     type = get_bits_long(gb, 32);
     s->hi = get_bits(gb, 16);
@@ -452,6 +446,19 @@
         return AVERROR_PATCHWELCOME;
     }
 
+    if (avctx->width  != width ||
+        avctx->height != height) {
+        if (!frame->key_frame) {
+            av_log(avctx, AV_LOG_ERROR, "Frame size change is unsupported.\n");
+            return AVERROR_INVALIDDATA;
+        }
+        av_frame_unref(s->prev_frame);
+    }
+
+    ret = ff_set_dimensions(avctx, width, height);
+    if (ret < 0)
+        return ret;
+
     if ((ret = ff_get_buffer(avctx, frame, frame->key_frame ? AV_GET_BUFFER_FLAG_REF : 0)) < 0)
         return ret;
 
@@ -516,6 +523,13 @@
     return 0;
 }
 
+static void decode_flush(AVCodecContext *avctx)
+{
+    IMM4Context *s = avctx->priv_data;
+
+    av_frame_unref(s->prev_frame);
+}
+
 static av_cold int decode_close(AVCodecContext *avctx)
 {
     IMM4Context *s = avctx->priv_data;
@@ -536,6 +550,7 @@
     .init             = decode_init,
     .close            = decode_close,
     .decode           = decode_frame,
+    .flush            = decode_flush,
     .capabilities     = AV_CODEC_CAP_DR1,
     .caps_internal    = FF_CODEC_CAP_INIT_THREADSAFE |
                         FF_CODEC_CAP_INIT_CLEANUP,
diff --git a/libavcodec/imm5.c b/libavcodec/imm5.c
new file mode 100644
index 0000000..917b414
--- /dev/null
+++ b/libavcodec/imm5.c
@@ -0,0 +1,193 @@
+/*
+ * Copyright (c) 2019 Paul B Mahol
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "libavutil/intreadwrite.h"
+
+#include "avcodec.h"
+#include "internal.h"
+
+typedef struct IMM5Context {
+    AVCodecContext *h264_avctx;   // wrapper context for H264
+    AVCodecContext *hevc_avctx;   // wrapper context for HEVC
+} IMM5Context;
+
+static const struct IMM5_unit {
+    uint8_t bits[14];
+    uint8_t len;
+} IMM5_units[14] = {
+    { { 0x00, 0x00, 0x00, 0x01, 0x67, 0x42, 0x80, 0x1E, 0xF4, 0x0B, 0x0F, 0x88 }, 12 },
+    { { 0x00, 0x00, 0x00, 0x01, 0x67, 0x42, 0x80, 0x1E, 0xF4, 0x05, 0x83, 0xE2 }, 12 },
+    { { 0x00, 0x00, 0x00, 0x01, 0x67, 0x42, 0x80, 0x1E, 0xF4, 0x05, 0x81, 0xE8, 0x80 }, 13 },
+    { { 0x00, 0x00, 0x00, 0x01, 0x67, 0x42, 0x80, 0x1E, 0xF4, 0x0B, 0x04, 0xA2 }, 12 },
+    { { 0x00, 0x00, 0x00, 0x01, 0x67, 0x42, 0x80, 0x1E, 0xF4, 0x05, 0x81, 0x28, 0x80 }, 13 },
+    { { 0x00, 0x00, 0x00, 0x01, 0x67, 0x42, 0x80, 0x1E, 0xF4, 0x05, 0x80, 0x92, 0x20 }, 13 },
+    { { 0x00, 0x00, 0x00, 0x01, 0x67, 0x42, 0x00, 0x1E, 0x9A, 0x74, 0x0B, 0x0F, 0xC8 }, 13 },
+    { { 0x00, 0x00, 0x00, 0x01, 0x67, 0x42, 0x00, 0x1E, 0x9A, 0x74, 0x05, 0x83, 0xF2 }, 13 },
+    { { 0x00, 0x00, 0x00, 0x01, 0x67, 0x42, 0x00, 0x1E, 0x9A, 0x74, 0x05, 0x81, 0xEC, 0x80 }, 14 },
+    { { 0x00, 0x00, 0x00, 0x01, 0x67, 0x42, 0x00, 0x1E, 0x9A, 0x74, 0x0B, 0x04, 0xB2 }, 13 },
+    { { 0x00, 0x00, 0x00, 0x01, 0x67, 0x42, 0x00, 0x1E, 0x9A, 0x74, 0x05, 0x81, 0x2C, 0x80 }, 14 },
+    { { 0x00, 0x00, 0x00, 0x01, 0x67, 0x42, 0x00, 0x1E, 0x9A, 0x74, 0x05, 0x80, 0x93, 0x20 }, 14 },
+    { { 0x00, 0x00, 0x00, 0x01, 0x68, 0xDE, 0x3C, 0x80 }, 8 },
+    { { 0x00, 0x00, 0x00, 0x01, 0x68, 0xCE, 0x32, 0x28 }, 8 },
+};
+
+static av_cold int imm5_init(AVCodecContext *avctx)
+{
+    IMM5Context *ctx = avctx->priv_data;
+    const AVCodec *codec;
+    int ret;
+
+    codec = avcodec_find_decoder(AV_CODEC_ID_H264);
+    if (!codec)
+        return AVERROR_BUG;
+    ctx->h264_avctx = avcodec_alloc_context3(codec);
+    if (!ctx->h264_avctx)
+        return AVERROR(ENOMEM);
+    ctx->h264_avctx->thread_count = 1;
+    ctx->h264_avctx->flags        = avctx->flags;
+    ctx->h264_avctx->flags2       = avctx->flags2;
+    ret = ff_codec_open2_recursive(ctx->h264_avctx, codec, NULL);
+    if (ret < 0)
+        return ret;
+
+    codec = avcodec_find_decoder(AV_CODEC_ID_HEVC);
+    if (!codec)
+        return AVERROR_BUG;
+    ctx->hevc_avctx = avcodec_alloc_context3(codec);
+    if (!ctx->hevc_avctx)
+        return AVERROR(ENOMEM);
+    ctx->hevc_avctx->thread_count = 1;
+    ctx->hevc_avctx->flags        = avctx->flags;
+    ctx->hevc_avctx->flags2       = avctx->flags2;
+    ret = ff_codec_open2_recursive(ctx->hevc_avctx, codec, NULL);
+    if (ret < 0)
+        return ret;
+
+    return 0;
+}
+
+static int imm5_decode_frame(AVCodecContext *avctx, void *data,
+                             int *got_frame, AVPacket *avpkt)
+{
+    IMM5Context *ctx = avctx->priv_data;
+    AVFrame *frame = data;
+    AVCodecContext *codec_avctx = ctx->h264_avctx;
+    int ret;
+
+    if (avpkt->size > 24 && avpkt->data[8] <= 1 && AV_RL32(avpkt->data + 4) + 24ULL <= avpkt->size) {
+        int codec_type = avpkt->data[1];
+        int index = avpkt->data[10];
+        int new_size = AV_RL32(avpkt->data + 4);
+        int offset, off;
+
+        if (codec_type == 0xA) {
+            codec_avctx = ctx->hevc_avctx;
+        } else if (index == 17) {
+            index = 4;
+        } else if (index == 18) {
+            index = 5;
+        }
+
+        if (index >= 1 && index <= 12) {
+            ret = av_packet_make_writable(avpkt);
+            if (ret < 0)
+                return ret;
+
+            index -= 1;
+            off = offset = IMM5_units[index].len;
+            if (codec_type == 2) {
+                offset += IMM5_units[12].len;
+            } else {
+                offset += IMM5_units[13].len;
+            }
+
+            avpkt->data += 24 - offset;
+            avpkt->size = new_size + offset;
+
+            memcpy(avpkt->data, IMM5_units[index].bits, IMM5_units[index].len);
+            if (codec_type == 2) {
+                memcpy(avpkt->data + off, IMM5_units[12].bits, IMM5_units[12].len);
+            } else {
+                memcpy(avpkt->data + off, IMM5_units[13].bits, IMM5_units[13].len);
+            }
+        } else {
+            avpkt->data += 24;
+            avpkt->size -= 24;
+        }
+    }
+
+    ret = avcodec_send_packet(codec_avctx, avpkt);
+    if (ret < 0) {
+        av_log(avctx, AV_LOG_ERROR, "Error submitting a packet for decoding\n");
+        return ret;
+    }
+
+    ret = avcodec_receive_frame(codec_avctx, frame);
+    if (ret < 0)
+        return ret;
+
+    avctx->pix_fmt      = codec_avctx->pix_fmt;
+    avctx->coded_width  = codec_avctx->coded_width;
+    avctx->coded_height = codec_avctx->coded_height;
+    avctx->width        = codec_avctx->width;
+    avctx->height       = codec_avctx->height;
+    avctx->bit_rate     = codec_avctx->bit_rate;
+    avctx->colorspace   = codec_avctx->colorspace;
+    avctx->color_range  = codec_avctx->color_range;
+    avctx->color_trc    = codec_avctx->color_trc;
+    avctx->color_primaries = codec_avctx->color_primaries;
+    avctx->chroma_sample_location = codec_avctx->chroma_sample_location;
+
+    *got_frame = 1;
+
+    return avpkt->size;
+}
+
+static void imm5_flush(AVCodecContext *avctx)
+{
+    IMM5Context *ctx = avctx->priv_data;
+
+    avcodec_flush_buffers(ctx->h264_avctx);
+    avcodec_flush_buffers(ctx->hevc_avctx);
+}
+
+static av_cold int imm5_close(AVCodecContext *avctx)
+{
+    IMM5Context *ctx = avctx->priv_data;
+
+    avcodec_free_context(&ctx->h264_avctx);
+    avcodec_free_context(&ctx->hevc_avctx);
+
+    return 0;
+}
+
+AVCodec ff_imm5_decoder = {
+    .name           = "imm5",
+    .long_name      = NULL_IF_CONFIG_SMALL("Infinity IMM5"),
+    .type           = AVMEDIA_TYPE_VIDEO,
+    .id             = AV_CODEC_ID_IMM5,
+    .init           = imm5_init,
+    .decode         = imm5_decode_frame,
+    .close          = imm5_close,
+    .flush          = imm5_flush,
+    .priv_data_size = sizeof(IMM5Context),
+    .caps_internal  = FF_CODEC_CAP_INIT_THREADSAFE |
+                      FF_CODEC_CAP_INIT_CLEANUP,
+};
diff --git a/libavcodec/indeo2.c b/libavcodec/indeo2.c
index 4971b84..ccf6cd8 100644
--- a/libavcodec/indeo2.c
+++ b/libavcodec/indeo2.c
@@ -56,7 +56,7 @@
     int j;
     int out = 0;
 
-    if (width & 1)
+    if ((width & 1) || width * height / (2*(IR2_CODES - 0x7F)) > get_bits_left(&ctx->gb))
         return AVERROR_INVALIDDATA;
 
     /* first line contain absolute values, other lines contain deltas */
@@ -79,10 +79,11 @@
 
     for (j = 1; j < height; j++) {
         out = 0;
-        if (get_bits_left(&ctx->gb) <= 0)
-            return AVERROR_INVALIDDATA;
         while (out < width) {
-            int c = ir2_get_code(&ctx->gb);
+            int c;
+            if (get_bits_left(&ctx->gb) <= 0)
+                return AVERROR_INVALIDDATA;
+            c = ir2_get_code(&ctx->gb);
             if (c >= 0x80) { /* we have a skip */
                 c -= 0x7F;
                 if (out + c*2 > width)
@@ -123,9 +124,9 @@
 
     for (j = 0; j < height; j++) {
         out = 0;
-        if (get_bits_left(&ctx->gb) <= 0)
-            return AVERROR_INVALIDDATA;
         while (out < width) {
+            if (get_bits_left(&ctx->gb) <= 0)
+                return AVERROR_INVALIDDATA;
             c = ir2_get_code(&ctx->gb);
             if (c >= 0x80) { /* we have a skip */
                 c   -= 0x7F;
@@ -160,7 +161,7 @@
     int start, ret;
     int ltab, ctab;
 
-    if ((ret = ff_reget_buffer(avctx, p)) < 0)
+    if ((ret = ff_reget_buffer(avctx, p, 0)) < 0)
         return ret;
 
     start = 48; /* hardcoded for now */
diff --git a/libavcodec/indeo5.c b/libavcodec/indeo5.c
index 7b9da53..4ccdbca 100644
--- a/libavcodec/indeo5.c
+++ b/libavcodec/indeo5.c
@@ -264,7 +264,7 @@
         }
 
         if (get_bits1(&ctx->gb))
-            skip_bits_long(&ctx->gb, 24); /* skip transparency fill color */
+            skip_bits(&ctx->gb, 24); /* skip transparency fill color */
     }
 
     align_get_bits(&ctx->gb);
@@ -348,7 +348,7 @@
     if (ctx->frame_type != FRAMETYPE_NULL) {
         ctx->frame_flags = get_bits(&ctx->gb, 8);
 
-        ctx->pic_hdr_size = (ctx->frame_flags & 1) ? get_bits_long(&ctx->gb, 24) : 0;
+        ctx->pic_hdr_size = (ctx->frame_flags & 1) ? get_bits(&ctx->gb, 24) : 0;
 
         ctx->checksum = (ctx->frame_flags & 0x10) ? get_bits(&ctx->gb, 16) : 0;
 
@@ -392,7 +392,7 @@
         return 0;
     }
 
-    band->data_size = (ctx->frame_flags & 0x80) ? get_bits_long(&ctx->gb, 24) : 0;
+    band->data_size = (ctx->frame_flags & 0x80) ? get_bits(&ctx->gb, 24) : 0;
 
     band->inherit_mv     = band_flags & 2;
     band->inherit_qdelta = band_flags & 8;
diff --git a/libavcodec/intelh263dec.c b/libavcodec/intelh263dec.c
index d321dd4..283fb1c 100644
--- a/libavcodec/intelh263dec.c
+++ b/libavcodec/intelh263dec.c
@@ -33,7 +33,7 @@
     }
 
     /* picture header */
-    if (get_bits_long(&s->gb, 22) != 0x20) {
+    if (get_bits(&s->gb, 22) != 0x20) {
         av_log(s->avctx, AV_LOG_ERROR, "Bad picture start code\n");
         return -1;
     }
diff --git a/libavcodec/internal.h b/libavcodec/internal.h
index 0c2133f..721fd01 100644
--- a/libavcodec/internal.h
+++ b/libavcodec/internal.h
@@ -68,6 +68,17 @@
  * Codec initializes slice-based threading with a main function
  */
 #define FF_CODEC_CAP_SLICE_THREAD_HAS_MF    (1 << 5)
+/*
+ * The codec supports frame threading and has inter-frame dependencies, so it
+ * uses ff_thread_report/await_progress().
+ */
+#define FF_CODEC_CAP_ALLOCATE_PROGRESS      (1 << 6)
+
+/**
+ * AVCodec.codec_tags termination value
+ */
+#define FF_CODEC_TAGS_END -1
+
 
 #ifdef TRACE
 #   define ff_tlog(ctx, ...) av_log(ctx, AV_LOG_TRACE, __VA_ARGS__)
@@ -83,7 +94,7 @@
 #define FF_QSCALE_TYPE_H264  2
 #define FF_QSCALE_TYPE_VP56  3
 
-#define FF_SANE_NB_CHANNELS 256U
+#define FF_SANE_NB_CHANNELS 512U
 
 #define FF_SIGNBIT(x) ((x) >> CHAR_BIT * sizeof(x) - 1)
 
@@ -97,25 +108,6 @@
 #   define STRIDE_ALIGN 8
 #endif
 
-typedef struct FramePool {
-    /**
-     * Pools for each data plane. For audio all the planes have the same size,
-     * so only pools[0] is used.
-     */
-    AVBufferPool *pools[4];
-
-    /*
-     * Pool parameters
-     */
-    int format;
-    int width, height;
-    int stride_align[AV_NUM_DATA_POINTERS];
-    int linesize[4];
-    int planes;
-    int channels;
-    int samples;
-} FramePool;
-
 typedef struct DecodeSimpleContext {
     AVPacket *in_pkt;
     AVFrame  *out_frame;
@@ -136,21 +128,6 @@
     int is_copy;
 
     /**
-     * Whether to allocate progress for frame threading.
-     *
-     * The codec must set it to 1 if it uses ff_thread_await/report_progress(),
-     * then progress will be allocated in ff_thread_get_buffer(). The frames
-     * then MUST be freed with ff_thread_release_buffer().
-     *
-     * If the codec does not need to call the progress functions (there are no
-     * dependencies between the frames), it should leave this at 0. Then it can
-     * decode straight to the user-provided frames (which the user will then
-     * free with av_frame_unref()), there is no need to call
-     * ff_thread_release_buffer().
-     */
-    int allocate_progress;
-
-    /**
      * An audio frame with less than required samples has been submitted and
      * padded with silence. Reject all subsequent frames.
      */
@@ -158,7 +135,7 @@
 
     AVFrame *to_free;
 
-    FramePool *pool;
+    AVBufferRef *pool;
 
     void *thread_ctx;
 
@@ -218,6 +195,14 @@
 
     /* to prevent infinite loop on errors when draining */
     int nb_draining_errors;
+
+    /* used when avctx flag AV_CODEC_FLAG_DROPCHANGED is set */
+    int changed_frames_dropped;
+    int initial_format;
+    int initial_width, initial_height;
+    int initial_sample_rate;
+    int initial_channels;
+    uint64_t initial_channel_layout;
 } AVCodecInternal;
 
 struct AVCodecDefault {
@@ -312,11 +297,12 @@
  */
 int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags);
 
+#define FF_REGET_BUFFER_FLAG_READONLY 1 ///< the returned buffer does not need to be writable
 /**
- * Identical in function to av_frame_make_writable(), except it uses
- * ff_get_buffer() to allocate the buffer when needed.
+ * Identical in function to ff_get_buffer(), except it reuses the existing buffer
+ * if available.
  */
-int ff_reget_buffer(AVCodecContext *avctx, AVFrame *frame);
+int ff_reget_buffer(AVCodecContext *avctx, AVFrame *frame, int flags);
 
 int ff_thread_can_start_frame(AVCodecContext *avctx);
 
@@ -383,6 +369,8 @@
 
 int ff_side_data_set_encoder_stats(AVPacket *pkt, int quality, int64_t *error, int error_count, int pict_type);
 
+int ff_side_data_set_prft(AVPacket *pkt, int64_t timestamp);
+
 /**
  * Check AVFrame for A53 side data and allocate and fill SEI message with A53 info
  *
@@ -404,6 +392,20 @@
  */
 int64_t ff_guess_coded_bitrate(AVCodecContext *avctx);
 
+/**
+ * Check if a value is in the list. If not, return the default value
+ *
+ * @param ctx                Context for the log msg
+ * @param val_name           Name of the checked value, for log msg
+ * @param array_valid_values Array of valid int, ended with INT_MAX
+ * @param default_value      Value return if checked value is not in the array
+ * @return                   Value or default_value.
+ */
+int ff_int_from_list_or_default(void *ctx, const char * val_name, int val,
+                                const int * array_valid_values, int default_value);
+
+void ff_dvdsub_parse_palette(uint32_t *palette, const char *p);
+
 #if defined(_WIN32) && CONFIG_SHARED && !defined(BUILDING_avcodec)
 #    define av_export_avcodec __declspec(dllimport)
 #else
diff --git a/libavcodec/interplayacm.c b/libavcodec/interplayacm.c
index 5639d8d..3704d1a 100644
--- a/libavcodec/interplayacm.c
+++ b/libavcodec/interplayacm.c
@@ -435,7 +435,8 @@
 static void juggle(int *wrap_p, int *block_p, unsigned sub_len, unsigned sub_count)
 {
     unsigned i, j;
-    int *p, r0, r1, r2, r3;
+    int *p;
+    unsigned int r0, r1, r2, r3;
 
     for (i = 0; i < sub_len; i++) {
         p = block_p;
@@ -528,7 +529,7 @@
 
     for (i = 1, x = -val; i <= count; i++) {
         s->midbuf[-i] = x;
-        x -= val;
+        x -= (unsigned)val;
     }
 
     ret = fill_block(s);
diff --git a/libavcodec/interplayvideo.c b/libavcodec/interplayvideo.c
index deaa09c..274641c 100644
--- a/libavcodec/interplayvideo.c
+++ b/libavcodec/interplayvideo.c
@@ -77,9 +77,14 @@
 
 static int copy_from(IpvideoContext *s, AVFrame *src, AVFrame *dst, int delta_x, int delta_y)
 {
+    int width = dst->width;
     int current_offset = s->pixel_ptr - dst->data[0];
-    int motion_offset = current_offset + delta_y * dst->linesize[0]
-                       + delta_x * (1 + s->is_16bpp);
+    int x = (current_offset % dst->linesize[0]) / (1 + s->is_16bpp);
+    int y = current_offset / dst->linesize[0];
+    int dx = delta_x + x - ((delta_x + x >= width) - (delta_x + x < 0)) * width;
+    int dy = delta_y + y + (delta_x + x >= width) - (delta_x + x < 0);
+    int motion_offset = dy * src->linesize[0] + dx * (1 + s->is_16bpp);
+
     if (motion_offset < 0) {
         av_log(s->avctx, AV_LOG_ERROR, "motion offset < 0 (%d)\n", motion_offset);
         return AVERROR_INVALIDDATA;
@@ -931,12 +936,12 @@
     int off_x, off_y;
 
     if (opcode < 0) {
-        off_x = ((uint16_t)opcode - 0xC000) % frame->linesize[0];
-        off_y = ((uint16_t)opcode - 0xC000) / frame->linesize[0];
+        off_x = ((uint16_t)opcode - 0xC000) % frame->width;
+        off_y = ((uint16_t)opcode - 0xC000) / frame->width;
         copy_from(s, s->last_frame, frame, off_x, off_y);
     } else if (opcode > 0) {
-        off_x = ((uint16_t)opcode - 0x4000) % frame->linesize[0];
-        off_y = ((uint16_t)opcode - 0x4000) / frame->linesize[0];
+        off_x = ((uint16_t)opcode - 0x4000) % frame->width;
+        off_y = ((uint16_t)opcode - 0x4000) / frame->width;
         copy_from(s, frame, frame, off_x, off_y);
     }
 }
@@ -1001,12 +1006,12 @@
     int off_x, off_y;
 
     if (opcode < 0) {
-        off_x = ((uint16_t)opcode - 0xC000) % s->cur_decode_frame->linesize[0];
-        off_y = ((uint16_t)opcode - 0xC000) / s->cur_decode_frame->linesize[0];
+        off_x = ((uint16_t)opcode - 0xC000) % s->cur_decode_frame->width;
+        off_y = ((uint16_t)opcode - 0xC000) / s->cur_decode_frame->width;
         copy_from(s, s->prev_decode_frame, s->cur_decode_frame, off_x, off_y);
     } else if (opcode > 0) {
-        off_x = ((uint16_t)opcode - 0x4000) % s->cur_decode_frame->linesize[0];
-        off_y = ((uint16_t)opcode - 0x4000) / s->cur_decode_frame->linesize[0];
+        off_x = ((uint16_t)opcode - 0x4000) % s->cur_decode_frame->width;
+        off_y = ((uint16_t)opcode - 0x4000) / s->cur_decode_frame->width;
         copy_from(s, s->cur_decode_frame, s->cur_decode_frame, off_x, off_y);
     }
 }
@@ -1181,14 +1186,6 @@
     s->cur_decode_frame->format  = avctx->pix_fmt;
     s->prev_decode_frame->format = avctx->pix_fmt;
 
-    ret = ff_get_buffer(avctx, s->cur_decode_frame, 0);
-    if (ret < 0)
-        goto error;
-
-    ret = ff_get_buffer(avctx, s->prev_decode_frame, 0);
-    if (ret < 0)
-        goto error;
-
     return 0;
 error:
     av_frame_free(&s->last_frame);
@@ -1239,83 +1236,83 @@
     s->decoding_map_size = AV_RL16(buf + 4);
     s->skip_map_size     = AV_RL16(buf + 6);
 
-    switch(frame_format) {
-        case 0x06:
-            if (s->decoding_map_size) {
-                av_log(avctx, AV_LOG_ERROR, "Decoding map for format 0x06\n");
-                return AVERROR_INVALIDDATA;
-            }
+    switch (frame_format) {
+    case 0x06:
+        if (s->decoding_map_size) {
+            av_log(avctx, AV_LOG_ERROR, "Decoding map for format 0x06\n");
+            return AVERROR_INVALIDDATA;
+        }
 
-            if (s->skip_map_size) {
-                av_log(avctx, AV_LOG_ERROR, "Skip map for format 0x06\n");
-                return AVERROR_INVALIDDATA;
-            }
+        if (s->skip_map_size) {
+            av_log(avctx, AV_LOG_ERROR, "Skip map for format 0x06\n");
+            return AVERROR_INVALIDDATA;
+        }
 
-            if (s->is_16bpp) {
-                av_log(avctx, AV_LOG_ERROR, "Video format 0x06 does not support 16bpp movies\n");
-                return AVERROR_INVALIDDATA;
-            }
+        if (s->is_16bpp) {
+            av_log(avctx, AV_LOG_ERROR, "Video format 0x06 does not support 16bpp movies\n");
+            return AVERROR_INVALIDDATA;
+        }
 
-            /* Decoding map for 0x06 frame format is at the top of pixeldata */
-            s->decoding_map_size = ((s->avctx->width / 8) * (s->avctx->height / 8)) * 2;
-            s->decoding_map = buf + 8 + 14; /* 14 bits of op data */
-            video_data_size -= s->decoding_map_size + 14;
-            if (video_data_size <= 0)
-                return AVERROR_INVALIDDATA;
+        /* Decoding map for 0x06 frame format is at the top of pixeldata */
+        s->decoding_map_size = ((s->avctx->width / 8) * (s->avctx->height / 8)) * 2;
+        s->decoding_map = buf + 8 + 14; /* 14 bits of op data */
+        video_data_size -= s->decoding_map_size + 14;
+        if (video_data_size <= 0 || s->decoding_map_size == 0)
+            return AVERROR_INVALIDDATA;
 
-            if (buf_size < 8 + s->decoding_map_size + 14 + video_data_size)
-                return AVERROR_INVALIDDATA;
+        if (buf_size < 8 + s->decoding_map_size + 14 + video_data_size)
+            return AVERROR_INVALIDDATA;
 
-            bytestream2_init(&s->stream_ptr, buf + 8 + s->decoding_map_size + 14, video_data_size);
+        bytestream2_init(&s->stream_ptr, buf + 8 + s->decoding_map_size + 14, video_data_size);
 
-            break;
+        break;
 
-        case 0x10:
-            if (! s->decoding_map_size) {
-                av_log(avctx, AV_LOG_ERROR, "Empty decoding map for format 0x10\n");
-                return AVERROR_INVALIDDATA;
-            }
+    case 0x10:
+        if (! s->decoding_map_size) {
+            av_log(avctx, AV_LOG_ERROR, "Empty decoding map for format 0x10\n");
+            return AVERROR_INVALIDDATA;
+        }
 
-            if (! s->skip_map_size) {
-                av_log(avctx, AV_LOG_ERROR, "Empty skip map for format 0x10\n");
-                return AVERROR_INVALIDDATA;
-            }
+        if (! s->skip_map_size) {
+            av_log(avctx, AV_LOG_ERROR, "Empty skip map for format 0x10\n");
+            return AVERROR_INVALIDDATA;
+        }
 
-            if (s->is_16bpp) {
-                av_log(avctx, AV_LOG_ERROR, "Video format 0x10 does not support 16bpp movies\n");
-                return AVERROR_INVALIDDATA;
-            }
+        if (s->is_16bpp) {
+            av_log(avctx, AV_LOG_ERROR, "Video format 0x10 does not support 16bpp movies\n");
+            return AVERROR_INVALIDDATA;
+        }
 
-            if (buf_size < 8 + video_data_size + s->decoding_map_size + s->skip_map_size)
-                return AVERROR_INVALIDDATA;
+        if (buf_size < 8 + video_data_size + s->decoding_map_size + s->skip_map_size)
+            return AVERROR_INVALIDDATA;
 
-            bytestream2_init(&s->stream_ptr, buf + 8, video_data_size);
-            s->decoding_map = buf + 8 + video_data_size;
-            s->skip_map = buf + 8 + video_data_size + s->decoding_map_size;
+        bytestream2_init(&s->stream_ptr, buf + 8, video_data_size);
+        s->decoding_map = buf + 8 + video_data_size;
+        s->skip_map = buf + 8 + video_data_size + s->decoding_map_size;
 
-            break;
+        break;
 
-        case 0x11:
-            if (! s->decoding_map_size) {
-                av_log(avctx, AV_LOG_ERROR, "Empty decoding map for format 0x11\n");
-                return AVERROR_INVALIDDATA;
-            }
+    case 0x11:
+        if (! s->decoding_map_size) {
+            av_log(avctx, AV_LOG_ERROR, "Empty decoding map for format 0x11\n");
+            return AVERROR_INVALIDDATA;
+        }
 
-            if (s->skip_map_size) {
-                av_log(avctx, AV_LOG_ERROR, "Skip map for format 0x11\n");
-                return AVERROR_INVALIDDATA;
-            }
+        if (s->skip_map_size) {
+            av_log(avctx, AV_LOG_ERROR, "Skip map for format 0x11\n");
+            return AVERROR_INVALIDDATA;
+        }
 
-            if (buf_size < 8 + video_data_size + s->decoding_map_size)
-                return AVERROR_INVALIDDATA;
+        if (buf_size < 8 + video_data_size + s->decoding_map_size)
+            return AVERROR_INVALIDDATA;
 
-            bytestream2_init(&s->stream_ptr, buf + 8, video_data_size);
-            s->decoding_map = buf + 8 + video_data_size;
+        bytestream2_init(&s->stream_ptr, buf + 8, video_data_size);
+        s->decoding_map = buf + 8 + video_data_size;
 
-            break;
+        break;
 
-        default:
-            av_log(avctx, AV_LOG_ERROR, "Frame type 0x%02X unsupported\n", frame_format);
+    default:
+        av_log(avctx, AV_LOG_ERROR, "Frame type 0x%02X unsupported\n", frame_format);
     }
 
     /* ensure we can't overread the packet */
@@ -1338,16 +1335,16 @@
         }
     }
 
-    switch(frame_format) {
-        case 0x06:
-            ipvideo_decode_format_06_opcodes(s, frame);
-            break;
-        case 0x10:
-            ipvideo_decode_format_10_opcodes(s, frame);
-            break;
-        case 0x11:
-            ipvideo_decode_format_11_opcodes(s, frame);
-            break;
+    switch (frame_format) {
+    case 0x06:
+        ipvideo_decode_format_06_opcodes(s, frame);
+        break;
+    case 0x10:
+        ipvideo_decode_format_10_opcodes(s, frame);
+        break;
+    case 0x11:
+        ipvideo_decode_format_11_opcodes(s, frame);
+        break;
     }
 
     *got_frame = send_buffer;
diff --git a/libavcodec/ituh263dec.c b/libavcodec/ituh263dec.c
index 1b57e53..c1005b0 100644
--- a/libavcodec/ituh263dec.c
+++ b/libavcodec/ituh263dec.c
@@ -222,7 +222,7 @@
             get_bits(&s->gb, 8);
         }
 
-        if (show_bits_long(&s->gb, 32) == SLICE_START_CODE)
+        if (get_bits_left(&s->gb) >= 32 && show_bits_long(&s->gb, 32) == SLICE_START_CODE)
             return get_bits_count(&s->gb);
         else
             return -1;
@@ -1218,6 +1218,11 @@
     if ((ret = av_image_check_size(s->width, s->height, 0, s)) < 0)
         return ret;
 
+    if (!(s->avctx->flags2 & AV_CODEC_FLAG2_CHUNKS)) {
+        if ((s->width * s->height / 256 / 8) > get_bits_left(&s->gb))
+            return AVERROR_INVALIDDATA;
+    }
+
     s->mb_width = (s->width  + 15) / 16;
     s->mb_height = (s->height  + 15) / 16;
     s->mb_num = s->mb_width * s->mb_height;
@@ -1281,7 +1286,7 @@
         for(i=0; i<13; i++){
             for(j=0; j<3; j++){
                 int v= get_bits(&s->gb, 8);
-                v |= get_sbits(&s->gb, 8)<<8;
+                v |= get_sbits(&s->gb, 8) * (1 << 8);
                 av_log(s->avctx, AV_LOG_DEBUG, " %5d", v);
             }
             av_log(s->avctx, AV_LOG_DEBUG, "\n");
diff --git a/libavcodec/ivi.c b/libavcodec/ivi.c
index b23d4af..7d3749b 100644
--- a/libavcodec/ivi.c
+++ b/libavcodec/ivi.c
@@ -30,7 +30,6 @@
 
 #include "libavutil/attributes.h"
 #include "libavutil/imgutils.h"
-#include "libavutil/timer.h"
 
 #define BITSTREAM_READER_LE
 #include "avcodec.h"
@@ -79,7 +78,7 @@
                                  const int16_t *ref_buf2,
                                  ptrdiff_t pitch, int mc_type, int mc_type2);
 
-static int ivi_mc(IVIBandDesc *band, ivi_mc_func mc, ivi_mc_avg_func mc_avg,
+static int ivi_mc(const IVIBandDesc *band, ivi_mc_func mc, ivi_mc_avg_func mc_avg,
                   int offs, int mv_x, int mv_y, int mv_x2, int mv_y2,
                   int mc_type, int mc_type2)
 {
@@ -354,23 +353,11 @@
             band->height   = b_height;
             band->pitch    = width_aligned;
             band->aheight  = height_aligned;
-            band->bufs[0]  = av_mallocz(buf_size);
-            band->bufs[1]  = av_mallocz(buf_size);
+            av_assert0(!band->bufs[0] && !band->bufs[1] &&
+                       !band->bufs[2] && !band->bufs[3]);
             band->bufsize  = buf_size/2;
-            if (!band->bufs[0] || !band->bufs[1])
-                return AVERROR(ENOMEM);
+            av_assert0(buf_size % 2 == 0);
 
-            /* allocate the 3rd band buffer for scalability mode */
-            if (cfg->luma_bands > 1) {
-                band->bufs[2] = av_mallocz(buf_size);
-                if (!band->bufs[2])
-                    return AVERROR(ENOMEM);
-            }
-            if (is_indeo4) {
-                band->bufs[3]  = av_mallocz(buf_size);
-                if (!band->bufs[3])
-                    return AVERROR(ENOMEM);
-            }
             /* reset custom vlc */
             planes[p].bands[0].blk_vlc.cust_desc.num_rows = 0;
         }
@@ -379,7 +366,7 @@
     return 0;
 }
 
-static int ivi_init_tiles(IVIBandDesc *band, IVITile *ref_tile,
+static int ivi_init_tiles(const IVIBandDesc *band, IVITile *ref_tile,
                           int p, int b, int t_height, int t_width)
 {
     int x, y;
@@ -429,6 +416,10 @@
         t_height = !p ? tile_height : (tile_height + 3) >> 2;
 
         if (!p && planes[0].num_bands == 4) {
+            if (t_width % 2 || t_height % 2) {
+                avpriv_request_sample(NULL, "Odd tiles");
+                return AVERROR_PATCHWELCOME;
+            }
             t_width  >>= 1;
             t_height >>= 1;
         }
@@ -437,6 +428,14 @@
 
         for (b = 0; b < planes[p].num_bands; b++) {
             band = &planes[p].bands[b];
+
+            if (band->tiles) {
+                int t;
+                for (t = 0; t < band->num_tiles; t++) {
+                    av_freep(&band->tiles[t].mbs);
+                }
+            }
+
             x_tiles = IVI_NUM_TILES(band->width, t_width);
             y_tiles = IVI_NUM_TILES(band->height, t_height);
             band->num_tiles = x_tiles * y_tiles;
@@ -476,7 +475,7 @@
     if (get_bits1(gb)) {
         len = get_bits(gb, 8);
         if (len == 255)
-            len = get_bits_long(gb, 24);
+            len = get_bits(gb, 24);
     }
 
     /* align the bitstream reader on the byte boundary */
@@ -485,22 +484,16 @@
     return len;
 }
 
-static int ivi_dc_transform(IVIBandDesc *band, int *prev_dc, int buf_offs,
+static int ivi_dc_transform(const IVIBandDesc *band, int *prev_dc, int buf_offs,
                             int blk_size)
 {
-    int buf_size = band->pitch * band->aheight - buf_offs;
-    int min_size = (blk_size - 1) * band->pitch + blk_size;
-
-    if (min_size > buf_size)
-        return AVERROR_INVALIDDATA;
-
     band->dc_transform(prev_dc, band->buf + buf_offs,
                        band->pitch, blk_size);
 
     return 0;
 }
 
-static int ivi_decode_coded_blocks(GetBitContext *gb, IVIBandDesc *band,
+static int ivi_decode_coded_blocks(GetBitContext *gb, const IVIBandDesc *band,
                                    ivi_mc_func mc, ivi_mc_avg_func mc_avg,
                                    int mv_x, int mv_y,
                                    int mv_x2, int mv_y2,
@@ -611,7 +604,7 @@
  *  @param[in]      tile  pointer to the tile descriptor
  *  @return     result code: 0 - OK, -1 = error (corrupted blocks data)
  */
-static int ivi_decode_blocks(GetBitContext *gb, IVIBandDesc *band,
+static int ivi_decode_blocks(GetBitContext *gb, const IVIBandDesc *band,
                              IVITile *tile, AVCodecContext *avctx)
 {
     int mbn, blk, num_blocks, blk_size, ret, is_intra;
@@ -724,6 +717,11 @@
                 if (ret < 0)
                     return ret;
             } else {
+                int buf_size = band->pitch * band->aheight - buf_offs;
+                int min_size = (blk_size - 1) * band->pitch + blk_size;
+
+                if (min_size > buf_size)
+                    return AVERROR_INVALIDDATA;
                 /* block not coded */
                 /* for intra blocks apply the dc slant transform */
                 /* for inter - perform the motion compensation without delta */
@@ -758,7 +756,7 @@
  *  @param[in]  tile      pointer to the tile descriptor
  *  @param[in]  mv_scale  scaling factor for motion vectors
  */
-static int ivi_process_empty_tile(AVCodecContext *avctx, IVIBandDesc *band,
+static int ivi_process_empty_tile(AVCodecContext *avctx, const IVIBandDesc *band,
                                   IVITile *tile, int32_t mv_scale)
 {
     int             x, y, need_mc, mbn, blk, num_blocks, mv_x, mv_y, mc_type;
@@ -767,24 +765,29 @@
     const int16_t   *src;
     int16_t         *dst;
     ivi_mc_func     mc_no_delta_func;
+    int             clear_first = !band->qdelta_present && !band->plane && !band->band_num;
+    int             mb_size     = band->mb_size;
+    int             xend        = tile->xpos + tile->width;
+    int             is_halfpel  = band->is_halfpel;
+    int             pitch       = band->pitch;
 
-    if (tile->num_MBs != IVI_MBs_PER_TILE(tile->width, tile->height, band->mb_size)) {
+    if (tile->num_MBs != IVI_MBs_PER_TILE(tile->width, tile->height, mb_size)) {
         av_log(avctx, AV_LOG_ERROR, "Allocated tile size %d mismatches "
                "parameters %d in ivi_process_empty_tile()\n",
-               tile->num_MBs, IVI_MBs_PER_TILE(tile->width, tile->height, band->mb_size));
+               tile->num_MBs, IVI_MBs_PER_TILE(tile->width, tile->height, mb_size));
         return AVERROR_INVALIDDATA;
     }
 
-    offs       = tile->ypos * band->pitch + tile->xpos;
+    offs       = tile->ypos * pitch + tile->xpos;
     mb         = tile->mbs;
     ref_mb     = tile->ref_mbs;
-    row_offset = band->mb_size * band->pitch;
+    row_offset = mb_size * pitch;
     need_mc    = 0; /* reset the mc tracking flag */
 
-    for (y = tile->ypos; y < (tile->ypos + tile->height); y += band->mb_size) {
+    for (y = tile->ypos; y < (tile->ypos + tile->height); y += mb_size) {
         mb_offset = offs;
 
-        for (x = tile->xpos; x < (tile->xpos + tile->width); x += band->mb_size) {
+        for (x = tile->xpos; x < xend; x += mb_size) {
             mb->xpos     = x;
             mb->ypos     = y;
             mb->buf_offs = mb_offset;
@@ -792,53 +795,54 @@
             mb->type = 1; /* set the macroblocks type = INTER */
             mb->cbp  = 0; /* all blocks are empty */
 
-            if (!band->qdelta_present && !band->plane && !band->band_num) {
+            if (clear_first) {
                 mb->q_delta = band->glob_quant;
                 mb->mv_x    = 0;
                 mb->mv_y    = 0;
             }
 
-            if (band->inherit_qdelta && ref_mb)
-                mb->q_delta = ref_mb->q_delta;
+            if (ref_mb) {
+                if (band->inherit_qdelta)
+                    mb->q_delta = ref_mb->q_delta;
 
-            if (band->inherit_mv && ref_mb) {
-                /* motion vector inheritance */
-                if (mv_scale) {
-                    mb->mv_x = ivi_scale_mv(ref_mb->mv_x, mv_scale);
-                    mb->mv_y = ivi_scale_mv(ref_mb->mv_y, mv_scale);
-                } else {
-                    mb->mv_x = ref_mb->mv_x;
-                    mb->mv_y = ref_mb->mv_y;
-                }
-                need_mc |= mb->mv_x || mb->mv_y; /* tracking non-zero motion vectors */
-                {
-                    int dmv_x, dmv_y, cx, cy;
+                if (band->inherit_mv) {
+                    /* motion vector inheritance */
+                    if (mv_scale) {
+                        mb->mv_x = ivi_scale_mv(ref_mb->mv_x, mv_scale);
+                        mb->mv_y = ivi_scale_mv(ref_mb->mv_y, mv_scale);
+                    } else {
+                        mb->mv_x = ref_mb->mv_x;
+                        mb->mv_y = ref_mb->mv_y;
+                    }
+                    need_mc |= mb->mv_x || mb->mv_y; /* tracking non-zero motion vectors */
+                    {
+                        int dmv_x, dmv_y, cx, cy;
 
-                    dmv_x = mb->mv_x >> band->is_halfpel;
-                    dmv_y = mb->mv_y >> band->is_halfpel;
-                    cx    = mb->mv_x &  band->is_halfpel;
-                    cy    = mb->mv_y &  band->is_halfpel;
+                        dmv_x = mb->mv_x >> is_halfpel;
+                        dmv_y = mb->mv_y >> is_halfpel;
+                        cx    = mb->mv_x &  is_halfpel;
+                        cy    = mb->mv_y &  is_halfpel;
 
-                    if (   mb->xpos + dmv_x < 0
-                        || mb->xpos + dmv_x + band->mb_size + cx > band->pitch
-                        || mb->ypos + dmv_y < 0
-                        || mb->ypos + dmv_y + band->mb_size + cy > band->aheight) {
-                        av_log(avctx, AV_LOG_ERROR, "MV out of bounds\n");
-                        return AVERROR_INVALIDDATA;
+                        if (   mb->xpos + dmv_x < 0
+                            || mb->xpos + dmv_x + mb_size + cx > pitch
+                            || mb->ypos + dmv_y < 0
+                            || mb->ypos + dmv_y + mb_size + cy > band->aheight) {
+                            av_log(avctx, AV_LOG_ERROR, "MV out of bounds\n");
+                            return AVERROR_INVALIDDATA;
+                        }
                     }
                 }
+                ref_mb++;
             }
 
             mb++;
-            if (ref_mb)
-                ref_mb++;
-            mb_offset += band->mb_size;
+            mb_offset += mb_size;
         } // for x
         offs += row_offset;
     } // for y
 
     if (band->inherit_mv && need_mc) { /* apply motion compensation if there is at least one non-zero motion vector */
-        num_blocks = (band->mb_size != band->blk_size) ? 4 : 1; /* number of blocks per mb */
+        num_blocks = (mb_size != band->blk_size) ? 4 : 1; /* number of blocks per mb */
         mc_no_delta_func = (band->blk_size == 8) ? ff_ivi_mc_8x8_no_delta
                                                  : ff_ivi_mc_4x4_no_delta;
 
@@ -855,7 +859,7 @@
 
             for (blk = 0; blk < num_blocks; blk++) {
                 /* adjust block position in the buffer according with its number */
-                offs = mb->buf_offs + band->blk_size * ((blk & 1) + !!(blk & 2) * band->pitch);
+                offs = mb->buf_offs + band->blk_size * ((blk & 1) + !!(blk & 2) * pitch);
                 ret = ivi_mc(band, mc_no_delta_func, 0, offs,
                              mv_x, mv_y, 0, 0, mc_type, -1);
                 if (ret < 0)
@@ -864,12 +868,12 @@
         }
     } else {
         /* copy data from the reference tile into the current one */
-        src = band->ref_buf + tile->ypos * band->pitch + tile->xpos;
-        dst = band->buf     + tile->ypos * band->pitch + tile->xpos;
+        src = band->ref_buf + tile->ypos * pitch + tile->xpos;
+        dst = band->buf     + tile->ypos * pitch + tile->xpos;
         for (y = 0; y < tile->height; y++) {
             memcpy(dst, src, tile->width*sizeof(band->buf[0]));
-            src += band->pitch;
-            dst += band->pitch;
+            src += pitch;
+            dst += pitch;
         }
     }
 
@@ -878,7 +882,7 @@
 
 
 #ifdef DEBUG
-static uint16_t ivi_calc_band_checksum(IVIBandDesc *band)
+static uint16_t ivi_calc_band_checksum(const IVIBandDesc *band)
 {
     int         x, y;
     int16_t     *src, checksum;
@@ -928,6 +932,15 @@
     }
 }
 
+static void *prepare_buf(IVI45DecContext *ctx, IVIBandDesc *band, int i)
+{
+    if (ctx->pic_conf.luma_bands <= 1 && i == 2)
+        return NULL;
+    if (!band->bufs[i])
+        band->bufs[i] = av_mallocz(2 * band->bufsize);
+    return band->bufs[i];
+}
+
 /**
  *  Decode an Indeo 4 or 5 band.
  *
@@ -942,18 +955,22 @@
     int         result, i, t, idx1, idx2, pos;
     IVITile     *tile;
 
-    band->buf     = band->bufs[ctx->dst_buf];
+    band->buf     = prepare_buf(ctx, band, ctx->dst_buf);
     if (!band->buf) {
         av_log(avctx, AV_LOG_ERROR, "Band buffer points to no data!\n");
         return AVERROR_INVALIDDATA;
     }
     if (ctx->is_indeo4 && ctx->frame_type == IVI4_FRAMETYPE_BIDIR) {
-        band->ref_buf   = band->bufs[ctx->b_ref_buf];
-        band->b_ref_buf = band->bufs[ctx->ref_buf];
+        band->ref_buf   = prepare_buf(ctx, band, ctx->b_ref_buf);
+        band->b_ref_buf = prepare_buf(ctx, band, ctx->ref_buf);
+        if (!band->b_ref_buf)
+            return AVERROR(ENOMEM);
     } else {
-        band->ref_buf   = band->bufs[ctx->ref_buf];
+        band->ref_buf   = prepare_buf(ctx, band, ctx->ref_buf);
         band->b_ref_buf = 0;
     }
+    if (!band->ref_buf)
+        return AVERROR(ENOMEM);
     band->data_ptr  = ctx->frame_data + (get_bits_count(&ctx->gb) >> 3);
 
     result = ctx->decode_band_hdr(ctx, band, avctx);
@@ -1106,8 +1123,6 @@
 
     ctx->switch_buffers(ctx);
 
-    //{ START_TIMER;
-
     if (ctx->is_nonnull_frame(ctx)) {
         ctx->buf_invalid[ctx->dst_buf] = 1;
         for (p = 0; p < 3; p++) {
@@ -1133,8 +1148,6 @@
     if (ctx->buf_invalid[ctx->dst_buf])
         return -1;
 
-    //STOP_TIMER("decode_planes"); }
-
     if (!ctx->is_nonnull_frame(ctx))
         return buf_size;
 
@@ -1175,7 +1188,7 @@
         left = get_bits_count(&ctx->gb) & 0x18;
         skip_bits_long(&ctx->gb, 64 - left);
         if (get_bits_left(&ctx->gb) > 18 &&
-            show_bits_long(&ctx->gb, 21) == 0xBFFF8) { // syncheader + inter type
+            show_bits(&ctx->gb, 21) == 0xBFFF8) { // syncheader + inter type
             AVPacket pkt;
             pkt.data = avpkt->data + (get_bits_count(&ctx->gb) >> 3);
             pkt.size = get_bits_left(&ctx->gb) >> 3;
diff --git a/libavcodec/j2kenc.c b/libavcodec/j2kenc.c
index e91d932..38643c9 100644
--- a/libavcodec/j2kenc.c
+++ b/libavcodec/j2kenc.c
@@ -521,13 +521,13 @@
         mask = ~((1<<NMSEDEC_FRACBITS)-1);
 
     for (i = 0; i < (1 << NMSEDEC_BITS); i++){
-        lut_nmsedec_sig[i]  = FFMAX(6*i - (9<<NMSEDEC_FRACBITS-1) << 12-NMSEDEC_FRACBITS, 0);
+        lut_nmsedec_sig[i]  = FFMAX((3 * i << (13 - NMSEDEC_FRACBITS)) - (9 << 11), 0);
         lut_nmsedec_sig0[i] = FFMAX((i*i + (1<<NMSEDEC_FRACBITS-1) & mask) << 1, 0);
 
         a = (i >> (NMSEDEC_BITS-2)&2) + 1;
-        lut_nmsedec_ref[i]  = FFMAX((-2*i + (1<<NMSEDEC_FRACBITS) + a*i - (a*a<<NMSEDEC_FRACBITS-2))
-                                    << 13-NMSEDEC_FRACBITS, 0);
-        lut_nmsedec_ref0[i] = FFMAX(((i*i + (1-4*i << NMSEDEC_FRACBITS-1) + (1<<2*NMSEDEC_FRACBITS)) & mask)
+        lut_nmsedec_ref[i]  = FFMAX((a - 2) * (i << (13 - NMSEDEC_FRACBITS)) +
+                                    (1 << 13) - (a * a << 11), 0);
+        lut_nmsedec_ref0[i] = FFMAX(((i * i - (i << NMSEDEC_BITS) + (1 << 2 * NMSEDEC_FRACBITS) + (1 << (NMSEDEC_FRACBITS - 1))) & mask)
                                     << 1, 0);
     }
 }
@@ -927,7 +927,7 @@
                             for (y = yy0; y < yy1; y++){
                                 int *ptr = t1.data + (y-yy0)*t1.stride;
                                 for (x = xx0; x < xx1; x++){
-                                    *ptr++ = comp->i_data[(comp->coord[0][1] - comp->coord[0][0]) * y + x] << NMSEDEC_FRACBITS;
+                                    *ptr++ = comp->i_data[(comp->coord[0][1] - comp->coord[0][0]) * y + x] * (1 << NMSEDEC_FRACBITS);
                                 }
                             }
                         } else{
diff --git a/libavcodec/jpeg2000.c b/libavcodec/jpeg2000.c
index 8e90980..73206d1 100644
--- a/libavcodec/jpeg2000.c
+++ b/libavcodec/jpeg2000.c
@@ -247,6 +247,11 @@
         }
     }
 
+    if (band->f_stepsize > (INT_MAX >> 15)) {
+        band->f_stepsize = 0;
+        av_log(avctx, AV_LOG_ERROR, "stepsize out of range\n");
+    }
+
     band->i_stepsize = band->f_stepsize * (1 << 15);
 
     /* FIXME: In OpenJPEG code stepsize = stepsize * 0.5. Why?
@@ -271,11 +276,11 @@
     /* TODO: Verify with previous count of codeblocks per band */
 
     /* Compute P_x0 */
-    prec->coord[0][0] = ((band->coord[0][0] >> log2_band_prec_width) + precno % reslevel->num_precincts_x) *
+    prec->coord[0][0] = ((reslevel->coord[0][0] >> reslevel->log2_prec_width) + precno % reslevel->num_precincts_x) *
                         (1 << log2_band_prec_width);
 
     /* Compute P_y0 */
-    prec->coord[1][0] = ((band->coord[1][0] >> log2_band_prec_height) + precno / reslevel->num_precincts_x) *
+    prec->coord[1][0] = ((reslevel->coord[1][0] >> reslevel->log2_prec_height) + precno / reslevel->num_precincts_x) *
                         (1 << log2_band_prec_height);
 
     /* Compute P_x1 */
diff --git a/libavcodec/jpeg2000.h b/libavcodec/jpeg2000.h
index c429ca5..0f82716 100644
--- a/libavcodec/jpeg2000.h
+++ b/libavcodec/jpeg2000.h
@@ -40,15 +40,15 @@
     JPEG2000_SIZ = 0xff51, // image and tile size
     JPEG2000_COD,          // coding style default
     JPEG2000_COC,          // coding style component
-    JPEG2000_TLM = 0xff55, // packed packet headers, tile-part header
-    JPEG2000_PLM = 0xff57, // tile-part lengths
-    JPEG2000_PLT,          // packet length, main header
+    JPEG2000_TLM = 0xff55, // tile-part length, main header
+    JPEG2000_PLM = 0xff57, // packet length, main header
+    JPEG2000_PLT,          // packet length, tile-part header
     JPEG2000_QCD = 0xff5c, // quantization default
     JPEG2000_QCC,          // quantization component
     JPEG2000_RGN,          // region of interest
     JPEG2000_POC,          // progression order change
-    JPEG2000_PPM,          // packet length, tile-part header
-    JPEG2000_PPT,          // packed packet headers, main header
+    JPEG2000_PPM,          // packed packet headers, main header
+    JPEG2000_PPT,          // packed packet headers, tile-part header
     JPEG2000_CRG = 0xff63, // component registration
     JPEG2000_COM,          // comment
     JPEG2000_SOT = 0xff90, // start of tile-part
@@ -210,6 +210,7 @@
     int *i_data;
     int coord[2][2];   // border coordinates {{x0, x1}, {y0, y1}} -- can be reduced with lowres option
     int coord_o[2][2]; // border coordinates {{x0, x1}, {y0, y1}} -- original values from jpeg2000 headers
+    uint8_t roi_shift; // ROI scaling value for the component
 } Jpeg2000Component;
 
 /* misc tools */
diff --git a/libavcodec/jpeg2000dec.c b/libavcodec/jpeg2000dec.c
index 96dab8e..460a4ad 100644
--- a/libavcodec/jpeg2000dec.c
+++ b/libavcodec/jpeg2000dec.c
@@ -83,6 +83,10 @@
     Jpeg2000QuantStyle  qntsty[4];
     Jpeg2000POC         poc;
     Jpeg2000TilePart    tile_part[32];
+    uint8_t             has_ppt;                // whether this tile has a ppt marker
+    uint8_t             *packed_headers;        // contains packed headers. Used only along with PPT marker
+    int                 packed_headers_size;    // size in bytes of the packed headers
+    GetByteContext      packed_headers_stream;  // byte context corresponding to packed headers
     uint16_t tp_idx;                    // Tile-part index
     int coord[2][2];                    // border coordinates {{x0, x1}, {y0, y1}}
 } Jpeg2000Tile;
@@ -113,6 +117,7 @@
     Jpeg2000CodingStyle codsty[4];
     Jpeg2000QuantStyle  qntsty[4];
     Jpeg2000POC         poc;
+    uint8_t             roi_shift[4];
 
     int             bit_index;
 
@@ -398,12 +403,16 @@
             break;
         }
     }
-    for (i = 0; i < possible_fmts_nb; ++i) {
-        if (pix_fmt_match(possible_fmts[i], ncomponents, s->precision, log2_chroma_wh, s->pal8)) {
-            s->avctx->pix_fmt = possible_fmts[i];
-            break;
+    if (   s->avctx->pix_fmt != AV_PIX_FMT_NONE
+        && !pix_fmt_match(s->avctx->pix_fmt, ncomponents, s->precision, log2_chroma_wh, s->pal8))
+            s->avctx->pix_fmt = AV_PIX_FMT_NONE;
+    if (s->avctx->pix_fmt == AV_PIX_FMT_NONE)
+        for (i = 0; i < possible_fmts_nb; ++i) {
+            if (pix_fmt_match(possible_fmts[i], ncomponents, s->precision, log2_chroma_wh, s->pal8)) {
+                s->avctx->pix_fmt = possible_fmts[i];
+                break;
+            }
         }
-    }
 
     if (i == possible_fmts_nb) {
         if (ncomponents == 4 &&
@@ -562,6 +571,7 @@
                    uint8_t *properties)
 {
     int compno, ret;
+    uint8_t has_eph;
 
     if (bytestream2_get_bytes_left(&s->g) < 2) {
         av_log(s->avctx, AV_LOG_ERROR, "Insufficient space for COC\n");
@@ -578,7 +588,9 @@
     }
 
     c      += compno;
+    has_eph = c->csty & JPEG2000_CSTY_EPH;
     c->csty = bytestream2_get_byteu(&s->g);
+    c->csty |= has_eph; //do not override eph present bits from COD
 
     if ((ret = get_cox(s, c)) < 0)
         return ret;
@@ -587,6 +599,31 @@
     return 0;
 }
 
+static int get_rgn(Jpeg2000DecoderContext *s, int n)
+{
+    uint16_t compno;
+    compno = (s->ncomponents < 257)? bytestream2_get_byte(&s->g):
+                                     bytestream2_get_be16u(&s->g);
+    if (bytestream2_get_byte(&s->g)) {
+        av_log(s->avctx, AV_LOG_ERROR, "Invalid RGN header.\n");
+        return AVERROR_INVALIDDATA; // SRgn field value is 0
+    }
+    // SPrgn field
+    // Currently compno cannot be greater than 4.
+    // However, future implementation should support compno up to 65536
+    if (compno < s->ncomponents) {
+        if (s->curtileno == -1)
+            s->roi_shift[compno] = bytestream2_get_byte(&s->g);
+        else {
+            if (s->tile[s->curtileno].tp_idx != 0)
+                return AVERROR_INVALIDDATA; // marker occurs only in first tile part of tile
+            s->tile[s->curtileno].comp[compno].roi_shift = bytestream2_get_byte(&s->g);
+        }
+        return 0;
+    }
+    return AVERROR_INVALIDDATA;
+}
+
 /* Get common part for QCD and QCC segments. */
 static int get_qcx(Jpeg2000DecoderContext *s, int n, Jpeg2000QuantStyle *q)
 {
@@ -787,6 +824,15 @@
     return 0;
 }
 
+static int read_crg(Jpeg2000DecoderContext *s, int n)
+{
+    if (s->ncomponents*4 != n - 2) {
+        av_log(s->avctx, AV_LOG_ERROR, "Invalid CRG marker.\n");
+        return AVERROR_INVALIDDATA;
+    }
+    bytestream2_skip(&s->g, n - 2);
+    return 0;
+}
 /* Tile-part lengths: see ISO 15444-1:2002, section A.7.1
  * Used to know the number of tile parts and lengths.
  * There may be multiple TLMs in the header.
@@ -795,7 +841,7 @@
  * markers. Parsing the TLM header is needed to increment the input header
  * buffer.
  * This marker is mandatory for DCI. */
-static uint8_t get_tlm(Jpeg2000DecoderContext *s, int n)
+static int get_tlm(Jpeg2000DecoderContext *s, int n)
 {
     uint8_t Stlm, ST, SP, tile_tlm, i;
     bytestream2_get_byte(&s->g);               /* Ztlm: skipped */
@@ -803,7 +849,11 @@
 
     // too complex ? ST = ((Stlm >> 4) & 0x01) + ((Stlm >> 4) & 0x02);
     ST = (Stlm >> 4) & 0x03;
-    // TODO: Manage case of ST = 0b11 --> raise error
+    if (ST == 0x03) {
+        av_log(s->avctx, AV_LOG_ERROR, "TLM marker contains invalid ST value.\n");
+        return AVERROR_INVALIDDATA;
+    }
+
     SP       = (Stlm >> 6) & 0x01;
     tile_tlm = (n - 4) / ((SP + 1) * 2 + ST);
     for (i = 0; i < tile_tlm; i++) {
@@ -829,18 +879,59 @@
     return 0;
 }
 
-static uint8_t get_plt(Jpeg2000DecoderContext *s, int n)
+static int get_plt(Jpeg2000DecoderContext *s, int n)
 {
     int i;
+    int v;
 
     av_log(s->avctx, AV_LOG_DEBUG,
             "PLT marker at pos 0x%X\n", bytestream2_tell(&s->g) - 4);
 
+    if (n < 4)
+        return AVERROR_INVALIDDATA;
+
     /*Zplt =*/ bytestream2_get_byte(&s->g);
 
     for (i = 0; i < n - 3; i++) {
-        bytestream2_get_byte(&s->g);
+        v = bytestream2_get_byte(&s->g);
     }
+    if (v & 0x80)
+        return AVERROR_INVALIDDATA;
+
+    return 0;
+}
+
+static int get_ppt(Jpeg2000DecoderContext *s, int n)
+{
+    Jpeg2000Tile *tile;
+    void *new;
+
+    if (n < 3) {
+        av_log(s->avctx, AV_LOG_ERROR, "Invalid length for PPT data.\n");
+        return AVERROR_INVALIDDATA;
+    }
+    if (s->curtileno < 0)
+        return AVERROR_INVALIDDATA;
+
+    tile = &s->tile[s->curtileno];
+    if (tile->tp_idx != 0) {
+        av_log(s->avctx, AV_LOG_ERROR,
+               "PPT marker can occur only on first tile part of a tile.\n");
+        return AVERROR_INVALIDDATA;
+    }
+
+    tile->has_ppt = 1;  // this tile has a ppt marker
+    bytestream2_get_byte(&s->g); // Zppt is skipped and not used
+    new = av_realloc(tile->packed_headers,
+                     tile->packed_headers_size + n - 3);
+    if (new) {
+        tile->packed_headers = new;
+    } else
+        return AVERROR(ENOMEM);
+    memcpy(tile->packed_headers + tile->packed_headers_size,
+           s->g.buffer, n - 3);
+    tile->packed_headers_size += n - 3;
+    bytestream2_skip(&s->g, n - 3);
 
     return 0;
 }
@@ -882,6 +973,9 @@
         comp->coord[1][0] = ff_jpeg2000_ceildivpow2(comp->coord_o[1][0], s->reduction_factor);
         comp->coord[1][1] = ff_jpeg2000_ceildivpow2(comp->coord_o[1][1], s->reduction_factor);
 
+        if (!comp->roi_shift)
+            comp->roi_shift = s->roi_shift[compno];
+
         if (ret = ff_jpeg2000_init_component(comp, codsty, qntsty,
                                              s->cbps[compno], s->cdx[compno],
                                              s->cdy[compno], s->avctx))
@@ -917,6 +1011,19 @@
     return res;
 }
 
+static inline void select_stream(Jpeg2000DecoderContext *s, Jpeg2000Tile *tile,
+                                 int *tp_index)
+{
+    s->g = tile->tile_part[*tp_index].tpg;
+    if (bytestream2_get_bytes_left(&s->g) == 0 && s->bit_index == 8) {
+        if (*tp_index < FF_ARRAY_ELEMS(tile->tile_part) - 1) {
+            s->g = tile->tile_part[++(*tp_index)].tpg;
+        }
+    }
+    if (bytestream2_peek_be32(&s->g) == JPEG2000_SOP_FIXED_BYTES)
+        bytestream2_skip(&s->g, JPEG2000_SOP_BYTE_LENGTH);
+}
+
 static int jpeg2000_decode_packet(Jpeg2000DecoderContext *s, Jpeg2000Tile *tile, int *tp_index,
                                   Jpeg2000CodingStyle *codsty,
                                   Jpeg2000ResLevel *rlevel, int precno,
@@ -928,19 +1035,15 @@
     if (layno < rlevel->band[0].prec[precno].decoded_layers)
         return 0;
     rlevel->band[0].prec[precno].decoded_layers = layno + 1;
-
-    if (bytestream2_get_bytes_left(&s->g) == 0 && s->bit_index == 8) {
-        if (*tp_index < FF_ARRAY_ELEMS(tile->tile_part) - 1) {
-            s->g = tile->tile_part[++(*tp_index)].tpg;
-        }
-    }
-
-    if (bytestream2_peek_be32(&s->g) == JPEG2000_SOP_FIXED_BYTES)
-        bytestream2_skip(&s->g, JPEG2000_SOP_BYTE_LENGTH);
+    // Select stream to read from
+    if (tile->has_ppt)
+        s->g = tile->packed_headers_stream;
+    else
+        select_stream(s, tile, tp_index);
 
     if (!(ret = get_bits(s, 1))) {
         jpeg2000_flush(s);
-        return 0;
+        goto skip_data;
     } else if (ret < 0)
         return ret;
 
@@ -1046,6 +1149,11 @@
             av_log(s->avctx, AV_LOG_ERROR, "EPH marker not found. instead %X\n", bytestream2_peek_be32(&s->g));
     }
 
+    // Save state of stream
+    if (tile->has_ppt) {
+        tile->packed_headers_stream = s->g;
+        select_stream(s, tile, tp_index);
+    }
     for (bandno = 0; bandno < rlevel->nbands; bandno++) {
         Jpeg2000Band *band = rlevel->band + bandno;
         Jpeg2000Prec *prec = band->prec + precno;
@@ -1087,6 +1195,15 @@
             av_freep(&cblk->lengthinc);
         }
     }
+    // Save state of stream
+    tile->tile_part[*tp_index].tpg = s->g;
+    return 0;
+
+skip_data:
+    if (tile->has_ppt)
+        tile->packed_headers_stream = s->g;
+    else
+        tile->tile_part[*tp_index].tpg = s->g;
     return 0;
 }
 
@@ -1162,7 +1279,7 @@
             step_x = 32;
             step_y = 32;
 
-            if (RSpoc > FFMIN(codsty->nreslevels, REpoc))
+            if (RSpoc >= FFMIN(codsty->nreslevels, REpoc))
                 continue;
 
             for (reslevelno = RSpoc; reslevelno < FFMIN(codsty->nreslevels, REpoc); reslevelno++) {
@@ -1171,7 +1288,10 @@
                 step_x = FFMIN(step_x, rlevel->log2_prec_width  + reducedresno);
                 step_y = FFMIN(step_y, rlevel->log2_prec_height + reducedresno);
             }
-            av_assert0(step_x < 32 && step_y < 32);
+            if (step_x >= 31 || step_y >= 31){
+                avpriv_request_sample(s->avctx, "CPRL with large step");
+                return AVERROR_PATCHWELCOME;
+            }
             step_x = 1<<step_x;
             step_y = 1<<step_y;
 
@@ -1275,14 +1395,14 @@
                             continue;
                         }
 
-                            for (layno = 0; layno < LYEpoc; layno++) {
-                                if ((ret = jpeg2000_decode_packet(s, tile, tp_index,
-                                                                codsty, rlevel,
-                                                                precno, layno,
-                                                                qntsty->expn + (reslevelno ? 3 * (reslevelno - 1) + 1 : 0),
-                                                                qntsty->nguardbits)) < 0)
-                                    return ret;
-                            }
+                        for (layno = 0; layno < LYEpoc; layno++) {
+                            if ((ret = jpeg2000_decode_packet(s, tile, tp_index,
+                                                              codsty, rlevel,
+                                                              precno, layno,
+                                                              qntsty->expn + (reslevelno ? 3 * (reslevelno - 1) + 1 : 0),
+                                                              qntsty->nguardbits)) < 0)
+                                return ret;
+                        }
                     }
                 }
             }
@@ -1524,9 +1644,9 @@
 
 static int decode_cblk(Jpeg2000DecoderContext *s, Jpeg2000CodingStyle *codsty,
                        Jpeg2000T1Context *t1, Jpeg2000Cblk *cblk,
-                       int width, int height, int bandpos)
+                       int width, int height, int bandpos, uint8_t roi_shift)
 {
-    int passno = cblk->npasses, pass_t = 2, bpno = cblk->nonzerobits - 1;
+    int passno = cblk->npasses, pass_t = 2, bpno = cblk->nonzerobits - 1 + roi_shift;
     int pass_cnt = 0;
     int vert_causal_ctx_csty_symbol = codsty->cblk_style & JPEG2000_CBLK_VSC;
     int term_cnt = 0;
@@ -1597,7 +1717,20 @@
                cblk->data + cblk->length - 2*(term_cnt < cblk->nb_terminations) - t1->mqc.bp);
     }
 
-    return 0;
+    return 1;
+}
+
+static inline int roi_shift_param(Jpeg2000Component *comp,
+                                   int quan_parameter)
+{
+    uint8_t roi_shift;
+    int val;
+    roi_shift = comp->roi_shift;
+    val = (quan_parameter < 0)?-quan_parameter:quan_parameter;
+
+    if (val > (1 << roi_shift))
+        return (quan_parameter < 0)?-(val >> roi_shift):(val >> roi_shift);
+    return quan_parameter;
 }
 
 /* TODO: Verify dequantization for lossless case
@@ -1684,6 +1817,19 @@
     s->dsp.mct_decode[tile->codsty[0].transform](src[0], src[1], src[2], csize);
 }
 
+static inline void roi_scale_cblk(Jpeg2000Cblk *cblk,
+                                  Jpeg2000Component *comp,
+                                  Jpeg2000T1Context *t1)
+{
+    int i, j;
+    int w = cblk->coord[0][1] - cblk->coord[0][0];
+    for (j = 0; j < (cblk->coord[1][1] - cblk->coord[1][0]); ++j) {
+        int *src = t1->data + j*t1->stride;
+        for (i = 0; i < w; ++i)
+            src[i] = roi_shift_param(comp, src[i]);
+    }
+}
+
 static inline void tile_codeblocks(Jpeg2000DecoderContext *s, Jpeg2000Tile *tile)
 {
     Jpeg2000T1Context t1;
@@ -1694,6 +1840,7 @@
     for (compno = 0; compno < s->ncomponents; compno++) {
         Jpeg2000Component *comp     = tile->comp + compno;
         Jpeg2000CodingStyle *codsty = tile->codsty + compno;
+        int coded = 0;
 
         t1.stride = (1<<codsty->log2_cblk_width) + 2;
 
@@ -1723,14 +1870,19 @@
                          cblkno++) {
                         int x, y;
                         Jpeg2000Cblk *cblk = prec->cblk + cblkno;
-                        decode_cblk(s, codsty, &t1, cblk,
+                        int ret = decode_cblk(s, codsty, &t1, cblk,
                                     cblk->coord[0][1] - cblk->coord[0][0],
                                     cblk->coord[1][1] - cblk->coord[1][0],
-                                    bandpos);
-
+                                    bandpos, comp->roi_shift);
+                        if (ret)
+                            coded = 1;
+                        else
+                            continue;
                         x = cblk->coord[0][0] - band->coord[0][0];
                         y = cblk->coord[1][0] - band->coord[1][0];
 
+                        if (comp->roi_shift)
+                            roi_scale_cblk(cblk, comp, &t1);
                         if (codsty->transform == FF_DWT97)
                             dequantization_float(x, y, cblk, comp, &t1, band);
                         else if (codsty->transform == FF_DWT97_INT)
@@ -1743,7 +1895,9 @@
         } /* end reslevel */
 
         /* inverse DWT */
-        ff_dwt_decode(&comp->dwt, codsty->transform == FF_DWT97 ? (void*)comp->f_data : (void*)comp->i_data);
+        if (coded)
+            ff_dwt_decode(&comp->dwt, codsty->transform == FF_DWT97 ? (void*)comp->f_data : (void*)comp->i_data);
+
     } /*end comp */
 }
 
@@ -1910,6 +2064,11 @@
                 av_log(s->avctx, AV_LOG_ERROR, "Invalid tpend\n");
                 return AVERROR_INVALIDDATA;
             }
+
+            if (tile->has_ppt && tile->tp_idx == 0) {
+                bytestream2_init(&tile->packed_headers_stream, tile->packed_headers, tile->packed_headers_size);
+            }
+
             bytestream2_init(&tp->tpg, s->g.buffer, tp->tp_end - s->g.buffer);
             bytestream2_skip(&s->g, tp->tp_end - s->g.buffer);
 
@@ -1920,8 +2079,12 @@
 
         len = bytestream2_get_be16(&s->g);
         if (len < 2 || bytestream2_get_bytes_left(&s->g) < len - 2) {
-            av_log(s->avctx, AV_LOG_ERROR, "Invalid len %d left=%d\n", len, bytestream2_get_bytes_left(&s->g));
-            return AVERROR_INVALIDDATA;
+            if (s->avctx->strict_std_compliance >= FF_COMPLIANCE_STRICT) {
+                av_log(s->avctx, AV_LOG_ERROR, "Invalid len %d left=%d\n", len, bytestream2_get_bytes_left(&s->g));
+                return AVERROR_INVALIDDATA;
+            }
+            av_log(s->avctx, AV_LOG_WARNING, "Missing EOC Marker.\n");
+            break;
         }
 
         switch (marker) {
@@ -1940,6 +2103,9 @@
         case JPEG2000_COD:
             ret = get_cod(s, codsty, properties);
             break;
+        case JPEG2000_RGN:
+            ret = get_rgn(s, len);
+            break;
         case JPEG2000_QCC:
             ret = get_qcc(s, len, qntsty, properties);
             break;
@@ -1964,6 +2130,9 @@
             // the comment is ignored
             bytestream2_skip(&s->g, len - 2);
             break;
+        case JPEG2000_CRG:
+            ret = read_crg(s, len);
+            break;
         case JPEG2000_TLM:
             // Tile-part lengths
             ret = get_tlm(s, len);
@@ -1972,6 +2141,10 @@
             // Packet length, tile-part header
             ret = get_plt(s, len);
             break;
+        case JPEG2000_PPT:
+            // Packed headers, tile-part header
+            ret = get_ppt(s, len);
+            break;
         default:
             av_log(s->avctx, AV_LOG_ERROR,
                    "unsupported marker 0x%.4"PRIX16" at pos 0x%X\n",
@@ -2001,7 +2174,6 @@
         if ((ret = init_tile(s, tileno)) < 0)
             return ret;
 
-        s->g = tile->tile_part[0].tpg;
         if ((ret = jpeg2000_decode_packets(s, tile)) < 0)
             return ret;
     }
diff --git a/libavcodec/jpeg2000dwt.c b/libavcodec/jpeg2000dwt.c
index ce1678a..f418454 100644
--- a/libavcodec/jpeg2000dwt.c
+++ b/libavcodec/jpeg2000dwt.c
@@ -255,7 +255,7 @@
     line += 5;
 
     for (i = 0; i < w * h; i++)
-        t[i] <<= I_PRESHIFT;
+        t[i] *= 1 << I_PRESHIFT;
 
     for (lev = s->ndeclevels-1; lev >= 0; lev--){
         int lh = s->linelen[lev][0],
@@ -531,7 +531,7 @@
     }
 
     for (i = 0; i < w * h; i++)
-        data[i] = (data[i] + ((1<<I_PRESHIFT)>>1)) >> I_PRESHIFT;
+        data[i] = (data[i] + ((1LL<<I_PRESHIFT)>>1)) >> I_PRESHIFT;
 }
 
 int ff_jpeg2000_dwt_init(DWTContext *s, int border[2][2],
diff --git a/libavcodec/jpeglsdec.c b/libavcodec/jpeglsdec.c
index 5308b74..0b1e139 100644
--- a/libavcodec/jpeglsdec.c
+++ b/libavcodec/jpeglsdec.c
@@ -222,7 +222,7 @@
 /**
  * Decode one line of image
  */
-static inline void ls_decode_line(JLSState *state, MJpegDecodeContext *s,
+static inline int ls_decode_line(JLSState *state, MJpegDecodeContext *s,
                                   void *last, void *dst, int last2, int w,
                                   int stride, int comp, int bits)
 {
@@ -234,7 +234,7 @@
         int err, pred;
 
         if (get_bits_left(&s->gb) <= 0)
-            return;
+            return AVERROR_INVALIDDATA;
 
         /* compute gradients */
         Ra = x ? R(dst, x - stride) : R(last, x);
@@ -263,11 +263,11 @@
                 }
                 /* if EOL reached, we stop decoding */
                 if (r != 1 << ff_log2_run[state->run_index[comp]])
-                    return;
+                    return 0;
                 if (state->run_index[comp] < 31)
                     state->run_index[comp]++;
                 if (x + stride > w)
-                    return;
+                    return 0;
             }
             /* decode aborted run */
             r = ff_log2_run[state->run_index[comp]];
@@ -284,7 +284,7 @@
             if (x >= w) {
                 av_log(NULL, AV_LOG_ERROR, "run overflow\n");
                 av_assert0(x <= w);
-                return;
+                return AVERROR_INVALIDDATA;
             }
 
             /* decode run termination value */
@@ -341,6 +341,8 @@
         W(dst, x, pred);
         x += stride;
     }
+
+    return 0;
 }
 
 int ff_jpegls_decode_picture(MJpegDecodeContext *s, int near,
@@ -350,6 +352,7 @@
     uint8_t *zero, *last, *cur;
     JLSState *state;
     int off = 0, stride = 1, width, shift, ret = 0;
+    int decoded_height = 0;
 
     zero = av_mallocz(s->picture_ptr->linesize[0]);
     if (!zero)
@@ -407,13 +410,16 @@
         width  = s->width * stride;
         cur   += off;
         for (i = 0; i < s->height; i++) {
+            int ret;
             if (s->bits <= 8) {
-                ls_decode_line(state, s, last, cur, t, width, stride, off, 8);
+                ret = ls_decode_line(state, s, last, cur, t, width, stride, off, 8);
                 t = last[0];
             } else {
-                ls_decode_line(state, s, last, cur, t, width, stride, off, 16);
+                ret = ls_decode_line(state, s, last, cur, t, width, stride, off, 16);
                 t = *((uint16_t *)last);
             }
+            if (ret < 0)
+                break;
             last = cur;
             cur += s->picture_ptr->linesize[0];
 
@@ -422,6 +428,7 @@
                 skip_bits(&s->gb, 16); /* skip RSTn */
             }
         }
+        decoded_height = i;
     } else if (ilv == 1) { /* line interleaving */
         int j;
         int Rc[3] = { 0, 0, 0 };
@@ -429,9 +436,12 @@
         memset(cur, 0, s->picture_ptr->linesize[0]);
         width = s->width * stride;
         for (i = 0; i < s->height; i++) {
+            int ret;
             for (j = 0; j < stride; j++) {
-                ls_decode_line(state, s, last + j, cur + j,
+                ret = ls_decode_line(state, s, last + j, cur + j,
                                Rc[j], width, stride, j, 8);
+                if (ret < 0)
+                    break;
                 Rc[j] = last[j];
 
                 if (s->restart_interval && !--s->restart_count) {
@@ -439,9 +449,12 @@
                     skip_bits(&s->gb, 16); /* skip RSTn */
                 }
             }
+            if (ret < 0)
+                break;
             last = cur;
             cur += s->picture_ptr->linesize[0];
         }
+        decoded_height = i;
     } else if (ilv == 2) { /* sample interleaving */
         avpriv_report_missing_feature(s->avctx, "Sample interleaved images");
         ret = AVERROR_PATCHWELCOME;
@@ -507,7 +520,7 @@
         if (s->bits <= 8) {
             uint8_t *src = s->picture_ptr->data[0];
 
-            for (i = 0; i < s->height; i++) {
+            for (i = 0; i < decoded_height; i++) {
                 for (x = off; x < w; x += stride)
                     src[x] <<= shift;
                 src += s->picture_ptr->linesize[0];
@@ -515,7 +528,7 @@
         } else {
             uint16_t *src = (uint16_t *)s->picture_ptr->data[0];
 
-            for (i = 0; i < s->height; i++) {
+            for (i = 0; i < decoded_height; i++) {
                 for (x = 0; x < w; x++)
                     src[x] <<= shift;
                 src += s->picture_ptr->linesize[0] / 2;
diff --git a/libavcodec/jpegtables.c b/libavcodec/jpegtables.c
index cbe5523..fa5c6f9 100644
--- a/libavcodec/jpegtables.c
+++ b/libavcodec/jpegtables.c
@@ -130,14 +130,25 @@
 {
     int i, j, k,nb, code, sym;
 
-    code = 0;
+    /* Some badly encoded files [1] map 2 different codes to symbol 0.
+       Only the first one is valid, so we zero-initialize this here and
+       make sure we only set it once (the first time) in the loop below.
+
+       [1]: Embedded JPEGs in "X7 RAW" and "X7 CinemaDNG" samples here:
+            https://www.dji.com/gr/zenmuse-x7/info#downloads
+     */
+    huff_size[0] = 0;
+
     k = 0;
+    code = 0;
     for(i=1;i<=16;i++) {
         nb = bits_table[i];
         for(j=0;j<nb;j++) {
             sym = val_table[k++];
-            huff_size[sym] = i;
-            huff_code[sym] = code;
+            if (sym != 0 || huff_size[sym] == 0) { /* see comment above */
+                huff_size[sym] = i;
+                huff_code[sym] = code;
+            }
             code++;
         }
         code <<= 1;
diff --git a/libavcodec/jrevdct.c b/libavcodec/jrevdct.c
index 3b15a52..a1a0f57 100644
--- a/libavcodec/jrevdct.c
+++ b/libavcodec/jrevdct.c
@@ -63,6 +63,7 @@
  */
 
 #include "libavutil/common.h"
+#include "libavutil/intreadwrite.h"
 
 #include "dct.h"
 #include "idctdsp.h"
@@ -234,7 +235,7 @@
      * row DCT calculations can be simplified this way.
      */
 
-    register int *idataptr = (int*)dataptr;
+    register uint8_t *idataptr = (uint8_t*)dataptr;
 
     /* WARNING: we do the same permutation as MMX idct to simplify the
        video core */
@@ -254,10 +255,10 @@
           int16_t dcval = (int16_t) (d0 * (1 << PASS1_BITS));
           register int v = (dcval & 0xffff) | ((dcval * (1 << 16)) & 0xffff0000);
 
-          idataptr[0] = v;
-          idataptr[1] = v;
-          idataptr[2] = v;
-          idataptr[3] = v;
+          AV_WN32A(&idataptr[ 0], v);
+          AV_WN32A(&idataptr[ 4], v);
+          AV_WN32A(&idataptr[ 8], v);
+          AV_WN32A(&idataptr[12], v);
       }
 
       dataptr += DCTSIZE;       /* advance pointer to next row */
@@ -974,7 +975,7 @@
      * row DCT calculations can be simplified this way.
      */
 
-    register int *idataptr = (int*)dataptr;
+    register uint8_t *idataptr = (uint8_t*)dataptr;
 
     d0 = dataptr[0];
     d2 = dataptr[1];
@@ -988,8 +989,8 @@
           int16_t dcval = (int16_t) (d0 << PASS1_BITS);
           register int v = (dcval & 0xffff) | ((dcval << 16) & 0xffff0000);
 
-          idataptr[0] = v;
-          idataptr[1] = v;
+          AV_WN32A(&idataptr[0], v);
+          AV_WN32A(&idataptr[4], v);
       }
 
       dataptr += DCTSTRIDE;     /* advance pointer to next row */
diff --git a/libavcodec/jvdec.c b/libavcodec/jvdec.c
index cbe83d3..6f10157 100644
--- a/libavcodec/jvdec.c
+++ b/libavcodec/jvdec.c
@@ -163,13 +163,19 @@
             av_log(avctx, AV_LOG_ERROR, "video size %d invalid\n", video_size);
             return AVERROR_INVALIDDATA;
         }
-        if ((ret = ff_reget_buffer(avctx, s->frame)) < 0)
-            return ret;
 
         if (video_type == 0 || video_type == 1) {
             GetBitContext gb;
             init_get_bits(&gb, buf, 8 * video_size);
 
+            if ((ret = ff_reget_buffer(avctx, s->frame, 0)) < 0)
+                return ret;
+
+            if (avctx->height/8 * (avctx->width/8) > 4 * video_size) {
+                av_log(avctx, AV_LOG_ERROR, "Insufficient input data for dimensions\n");
+                return AVERROR_INVALIDDATA;
+            }
+
             for (j = 0; j < avctx->height; j += 8)
                 for (i = 0; i < avctx->width; i += 8)
                     decode8x8(&gb,
@@ -179,6 +185,11 @@
             buf += video_size;
         } else if (video_type == 2) {
             int v = *buf++;
+
+            av_frame_unref(s->frame);
+            if ((ret = ff_get_buffer(avctx, s->frame, AV_GET_BUFFER_FLAG_REF)) < 0)
+                return ret;
+
             for (j = 0; j < avctx->height; j++)
                 memset(s->frame->data[0] + j * s->frame->linesize[0],
                        v, avctx->width);
diff --git a/libavcodec/lagarith.c b/libavcodec/lagarith.c
index 5763504..d81e55c 100644
--- a/libavcodec/lagarith.c
+++ b/libavcodec/lagarith.c
@@ -226,6 +226,9 @@
         }
     }
 
+    if (scale_factor > 23)
+        return AVERROR_INVALIDDATA;
+
     rac->scale = scale_factor;
 
     /* Fill probability array with cumulative probability for each symbol. */
@@ -669,9 +672,6 @@
 
         if ((ret = ff_thread_get_buffer(avctx, &frame, 0)) < 0)
             return ret;
-        if (buf_size <= offset_ry || buf_size <= offset_gu || buf_size <= offset_bv) {
-            return AVERROR_INVALIDDATA;
-        }
 
         if (offset_ry >= buf_size ||
             offset_gu >= buf_size ||
@@ -712,16 +712,6 @@
     return 0;
 }
 
-#if HAVE_THREADS
-static av_cold int lag_decode_init_thread_copy(AVCodecContext *avctx)
-{
-    LagarithContext *l = avctx->priv_data;
-    l->avctx = avctx;
-
-    return 0;
-}
-#endif
-
 AVCodec ff_lagarith_decoder = {
     .name           = "lagarith",
     .long_name      = NULL_IF_CONFIG_SMALL("Lagarith lossless"),
@@ -729,7 +719,6 @@
     .id             = AV_CODEC_ID_LAGARITH,
     .priv_data_size = sizeof(LagarithContext),
     .init           = lag_decode_init,
-    .init_thread_copy = ONLY_IF_THREADS_ENABLED(lag_decode_init_thread_copy),
     .decode         = lag_decode_frame,
     .capabilities   = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_FRAME_THREADS,
 };
diff --git a/libavcodec/lcldec.c b/libavcodec/lcldec.c
index 104defa..c51083b 100644
--- a/libavcodec/lcldec.c
+++ b/libavcodec/lcldec.c
@@ -190,11 +190,10 @@
                 ;
             } else if (c->flags & FLAG_MULTITHREAD) {
                 mthread_inlen = AV_RL32(buf);
-                if (len < 8) {
+                if (len < 8 || len - 8 < mthread_inlen) {
                     av_log(avctx, AV_LOG_ERROR, "len %d is too small\n", len);
                     return AVERROR_INVALIDDATA;
                 }
-                mthread_inlen = FFMIN(mthread_inlen, len - 8);
                 mthread_outlen = AV_RL32(buf + 4);
                 mthread_outlen = FFMIN(mthread_outlen, c->decomp_size);
                 mszh_dlen = mszh_decomp(buf + 8, mthread_inlen, c->decomp_buf, c->decomp_size);
@@ -623,13 +622,6 @@
     return 0;
 }
 
-#if HAVE_THREADS
-static int init_thread_copy(AVCodecContext *avctx)
-{
-    return decode_init(avctx);
-}
-#endif
-
 static av_cold int decode_end(AVCodecContext *avctx)
 {
     LclDecContext * const c = avctx->priv_data;
@@ -651,7 +643,6 @@
     .id             = AV_CODEC_ID_MSZH,
     .priv_data_size = sizeof(LclDecContext),
     .init           = decode_init,
-    .init_thread_copy = ONLY_IF_THREADS_ENABLED(init_thread_copy),
     .close          = decode_end,
     .decode         = decode_frame,
     .capabilities   = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_FRAME_THREADS,
@@ -667,7 +658,6 @@
     .id             = AV_CODEC_ID_ZLIB,
     .priv_data_size = sizeof(LclDecContext),
     .init           = decode_init,
-    .init_thread_copy = ONLY_IF_THREADS_ENABLED(init_thread_copy),
     .close          = decode_end,
     .decode         = decode_frame,
     .capabilities   = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_FRAME_THREADS,
diff --git a/libavcodec/libaomenc.c b/libavcodec/libaomenc.c
index 045c519..fc1ea96 100644
--- a/libavcodec/libaomenc.c
+++ b/libavcodec/libaomenc.c
@@ -34,6 +34,7 @@
 #include "libavutil/opt.h"
 #include "libavutil/pixdesc.h"
 
+#include "av1.h"
 #include "avcodec.h"
 #include "internal.h"
 #include "profiles.h"
@@ -65,26 +66,74 @@
     struct FrameListData *coded_frame_list;
     int cpu_used;
     int auto_alt_ref;
+    int arnr_max_frames;
+    int arnr_strength;
+    int aq_mode;
     int lag_in_frames;
     int error_resilient;
     int crf;
     int static_thresh;
     int drop_threshold;
-    int noise_sensitivity;
+    int denoise_noise_level;
+    int denoise_block_size;
     uint64_t sse[4];
     int have_sse; /**< true if we have pending sse[] */
     uint64_t frame_number;
+    int rc_undershoot_pct;
+    int rc_overshoot_pct;
+    int minsection_pct;
+    int maxsection_pct;
+    int frame_parallel;
+    int tile_cols, tile_rows;
+    int tile_cols_log2, tile_rows_log2;
+    aom_superblock_size_t superblock_size;
+    int uniform_tiles;
+    int row_mt;
+    int enable_cdef;
+    int enable_global_motion;
+    int enable_intrabc;
+    int enable_restoration;
+    int usage;
+    int tune;
 } AOMContext;
 
 static const char *const ctlidstr[] = {
     [AOME_SET_CPUUSED]          = "AOME_SET_CPUUSED",
     [AOME_SET_CQ_LEVEL]         = "AOME_SET_CQ_LEVEL",
     [AOME_SET_ENABLEAUTOALTREF] = "AOME_SET_ENABLEAUTOALTREF",
+    [AOME_SET_ARNR_MAXFRAMES]   = "AOME_SET_ARNR_MAXFRAMES",
+    [AOME_SET_ARNR_STRENGTH]    = "AOME_SET_ARNR_STRENGTH",
     [AOME_SET_STATIC_THRESHOLD] = "AOME_SET_STATIC_THRESHOLD",
     [AV1E_SET_COLOR_RANGE]      = "AV1E_SET_COLOR_RANGE",
     [AV1E_SET_COLOR_PRIMARIES]  = "AV1E_SET_COLOR_PRIMARIES",
     [AV1E_SET_MATRIX_COEFFICIENTS] = "AV1E_SET_MATRIX_COEFFICIENTS",
     [AV1E_SET_TRANSFER_CHARACTERISTICS] = "AV1E_SET_TRANSFER_CHARACTERISTICS",
+    [AV1E_SET_AQ_MODE]          = "AV1E_SET_AQ_MODE",
+    [AV1E_SET_FRAME_PARALLEL_DECODING] = "AV1E_SET_FRAME_PARALLEL_DECODING",
+    [AV1E_SET_SUPERBLOCK_SIZE]  = "AV1E_SET_SUPERBLOCK_SIZE",
+    [AV1E_SET_TILE_COLUMNS]     = "AV1E_SET_TILE_COLUMNS",
+    [AV1E_SET_TILE_ROWS]        = "AV1E_SET_TILE_ROWS",
+    [AV1E_SET_ENABLE_RESTORATION] = "AV1E_SET_ENABLE_RESTORATION",
+#ifdef AOM_CTRL_AV1E_SET_ROW_MT
+    [AV1E_SET_ROW_MT]           = "AV1E_SET_ROW_MT",
+#endif
+#ifdef AOM_CTRL_AV1E_SET_DENOISE_NOISE_LEVEL
+    [AV1E_SET_DENOISE_NOISE_LEVEL] =  "AV1E_SET_DENOISE_NOISE_LEVEL",
+#endif
+#ifdef AOM_CTRL_AV1E_SET_DENOISE_BLOCK_SIZE
+    [AV1E_SET_DENOISE_BLOCK_SIZE] =   "AV1E_SET_DENOISE_BLOCK_SIZE",
+#endif
+#ifdef AOM_CTRL_AV1E_SET_MAX_REFERENCE_FRAMES
+    [AV1E_SET_MAX_REFERENCE_FRAMES] = "AV1E_SET_MAX_REFERENCE_FRAMES",
+#endif
+#ifdef AOM_CTRL_AV1E_SET_ENABLE_GLOBAL_MOTION
+    [AV1E_SET_ENABLE_GLOBAL_MOTION] = "AV1E_SET_ENABLE_GLOBAL_MOTION",
+#endif
+#ifdef AOM_CTRL_AV1E_SET_ENABLE_INTRABC
+    [AV1E_SET_ENABLE_INTRABC]   = "AV1E_SET_ENABLE_INTRABC",
+#endif
+    [AV1E_SET_ENABLE_CDEF]      = "AV1E_SET_ENABLE_CDEF",
+    [AOME_SET_TUNING]           = "AOME_SET_TUNING",
 };
 
 static av_cold void log_encoder_error(AVCodecContext *avctx, const char *desc)
@@ -149,6 +198,10 @@
            width, "kf_mode:",     cfg->kf_mode,
            width, "kf_min_dist:", cfg->kf_min_dist,
            width, "kf_max_dist:", cfg->kf_max_dist);
+    av_log(avctx, level, "tile settings\n"
+                         "  %*s%d\n  %*s%d\n",
+           width, "tile_width_count:",  cfg->tile_width_count,
+           width, "tile_height_count:", cfg->tile_height_count);
     av_log(avctx, level, "\n");
 }
 
@@ -180,7 +233,12 @@
 }
 
 static av_cold int codecctl_int(AVCodecContext *avctx,
-                                enum aome_enc_control_id id, int val)
+#ifdef UENUM1BYTE
+                                aome_enc_control_id id,
+#else
+                                enum aome_enc_control_id id,
+#endif
+                                int val)
 {
     AOMContext *ctx = avctx->priv_data;
     char buf[80];
@@ -276,7 +334,7 @@
 
 static void set_color_range(AVCodecContext *avctx)
 {
-    enum aom_color_range aom_cr;
+    aom_color_range_t aom_cr;
     switch (avctx->color_range) {
     case AVCOL_RANGE_UNSPECIFIED:
     case AVCOL_RANGE_MPEG:       aom_cr = AOM_CR_STUDIO_RANGE; break;
@@ -290,6 +348,169 @@
     codecctl_int(avctx, AV1E_SET_COLOR_RANGE, aom_cr);
 }
 
+static int count_uniform_tiling(int dim, int sb_size, int tiles_log2)
+{
+    int sb_dim   = (dim + sb_size - 1) / sb_size;
+    int tile_dim = (sb_dim + (1 << tiles_log2) - 1) >> tiles_log2;
+    av_assert0(tile_dim > 0);
+    return (sb_dim + tile_dim - 1) / tile_dim;
+}
+
+static int choose_tiling(AVCodecContext *avctx,
+                         struct aom_codec_enc_cfg *enccfg)
+{
+    AOMContext *ctx = avctx->priv_data;
+    int sb_128x128_possible, sb_size, sb_width, sb_height;
+    int uniform_rows, uniform_cols;
+    int uniform_64x64_possible, uniform_128x128_possible;
+    int tile_size, rounding, i;
+
+    if (ctx->tile_cols_log2 >= 0)
+        ctx->tile_cols = 1 << ctx->tile_cols_log2;
+    if (ctx->tile_rows_log2 >= 0)
+        ctx->tile_rows = 1 << ctx->tile_rows_log2;
+
+    if (ctx->tile_cols == 0) {
+        ctx->tile_cols = (avctx->width + AV1_MAX_TILE_WIDTH - 1) /
+            AV1_MAX_TILE_WIDTH;
+        if (ctx->tile_cols > 1) {
+            av_log(avctx, AV_LOG_DEBUG, "Automatically using %d tile "
+                   "columns to fill width.\n", ctx->tile_cols);
+        }
+    }
+    av_assert0(ctx->tile_cols > 0);
+    if (ctx->tile_rows == 0) {
+        int max_tile_width =
+            FFALIGN((FFALIGN(avctx->width, 128) +
+                     ctx->tile_cols - 1) / ctx->tile_cols, 128);
+        ctx->tile_rows =
+            (max_tile_width * FFALIGN(avctx->height, 128) +
+             AV1_MAX_TILE_AREA - 1) / AV1_MAX_TILE_AREA;
+        if (ctx->tile_rows > 1) {
+            av_log(avctx, AV_LOG_DEBUG, "Automatically using %d tile "
+                   "rows to fill area.\n", ctx->tile_rows);
+        }
+    }
+    av_assert0(ctx->tile_rows > 0);
+
+    if ((avctx->width  + 63) / 64 < ctx->tile_cols ||
+        (avctx->height + 63) / 64 < ctx->tile_rows) {
+        av_log(avctx, AV_LOG_ERROR, "Invalid tile sizing: frame not "
+               "large enough to fit specified tile arrangement.\n");
+        return AVERROR(EINVAL);
+    }
+    if (ctx->tile_cols > AV1_MAX_TILE_COLS ||
+        ctx->tile_rows > AV1_MAX_TILE_ROWS) {
+        av_log(avctx, AV_LOG_ERROR, "Invalid tile sizing: AV1 does "
+               "not allow more than %dx%d tiles.\n",
+               AV1_MAX_TILE_COLS, AV1_MAX_TILE_ROWS);
+        return AVERROR(EINVAL);
+    }
+    if (avctx->width / ctx->tile_cols > AV1_MAX_TILE_WIDTH) {
+        av_log(avctx, AV_LOG_ERROR, "Invalid tile sizing: AV1 does "
+               "not allow tiles of width greater than %d.\n",
+               AV1_MAX_TILE_WIDTH);
+        return AVERROR(EINVAL);
+    }
+
+    ctx->superblock_size = AOM_SUPERBLOCK_SIZE_DYNAMIC;
+
+    if (ctx->tile_cols == 1 && ctx->tile_rows == 1) {
+        av_log(avctx, AV_LOG_DEBUG, "Using a single tile.\n");
+        return 0;
+    }
+
+    sb_128x128_possible =
+        (avctx->width  + 127) / 128 >= ctx->tile_cols &&
+        (avctx->height + 127) / 128 >= ctx->tile_rows;
+
+    ctx->tile_cols_log2 = ctx->tile_cols == 1 ? 0 :
+        av_log2(ctx->tile_cols - 1) + 1;
+    ctx->tile_rows_log2 = ctx->tile_rows == 1 ? 0 :
+        av_log2(ctx->tile_rows - 1) + 1;
+
+    uniform_cols = count_uniform_tiling(avctx->width,
+                                        64, ctx->tile_cols_log2);
+    uniform_rows = count_uniform_tiling(avctx->height,
+                                        64, ctx->tile_rows_log2);
+    av_log(avctx, AV_LOG_DEBUG, "Uniform with 64x64 superblocks "
+           "-> %dx%d tiles.\n", uniform_cols, uniform_rows);
+    uniform_64x64_possible = uniform_cols == ctx->tile_cols &&
+                             uniform_rows == ctx->tile_rows;
+
+    if (sb_128x128_possible) {
+        uniform_cols = count_uniform_tiling(avctx->width,
+                                            128, ctx->tile_cols_log2);
+        uniform_rows = count_uniform_tiling(avctx->height,
+                                            128, ctx->tile_rows_log2);
+        av_log(avctx, AV_LOG_DEBUG, "Uniform with 128x128 superblocks "
+               "-> %dx%d tiles.\n", uniform_cols, uniform_rows);
+        uniform_128x128_possible = uniform_cols == ctx->tile_cols &&
+                                   uniform_rows == ctx->tile_rows;
+    } else {
+        av_log(avctx, AV_LOG_DEBUG, "128x128 superblocks not possible.\n");
+        uniform_128x128_possible = 0;
+    }
+
+    ctx->uniform_tiles = 1;
+    if (uniform_64x64_possible && uniform_128x128_possible) {
+        av_log(avctx, AV_LOG_DEBUG, "Using uniform tiling with dynamic "
+               "superblocks (tile_cols_log2 = %d, tile_rows_log2 = %d).\n",
+               ctx->tile_cols_log2, ctx->tile_rows_log2);
+        return 0;
+    }
+    if (uniform_64x64_possible && !sb_128x128_possible) {
+        av_log(avctx, AV_LOG_DEBUG, "Using uniform tiling with 64x64 "
+               "superblocks (tile_cols_log2 = %d, tile_rows_log2 = %d).\n",
+               ctx->tile_cols_log2, ctx->tile_rows_log2);
+        ctx->superblock_size = AOM_SUPERBLOCK_SIZE_64X64;
+        return 0;
+    }
+    if (uniform_128x128_possible) {
+        av_log(avctx, AV_LOG_DEBUG, "Using uniform tiling with 128x128 "
+               "superblocks (tile_cols_log2 = %d, tile_rows_log2 = %d).\n",
+               ctx->tile_cols_log2, ctx->tile_rows_log2);
+        ctx->superblock_size = AOM_SUPERBLOCK_SIZE_128X128;
+        return 0;
+    }
+    ctx->uniform_tiles = 0;
+
+    if (sb_128x128_possible) {
+        sb_size = 128;
+        ctx->superblock_size = AOM_SUPERBLOCK_SIZE_128X128;
+    } else {
+        sb_size = 64;
+        ctx->superblock_size = AOM_SUPERBLOCK_SIZE_64X64;
+    }
+    av_log(avctx, AV_LOG_DEBUG, "Using fixed tiling with %dx%d "
+           "superblocks (tile_cols = %d, tile_rows = %d).\n",
+           sb_size, sb_size, ctx->tile_cols, ctx->tile_rows);
+
+    enccfg->tile_width_count  = ctx->tile_cols;
+    enccfg->tile_height_count = ctx->tile_rows;
+
+    sb_width  = (avctx->width  + sb_size - 1) / sb_size;
+    sb_height = (avctx->height + sb_size - 1) / sb_size;
+
+    tile_size = sb_width / ctx->tile_cols;
+    rounding  = sb_width % ctx->tile_cols;
+    for (i = 0; i < ctx->tile_cols; i++) {
+        enccfg->tile_widths[i] = tile_size +
+            (i < rounding / 2 ||
+             i > ctx->tile_cols - 1 - (rounding + 1) / 2);
+    }
+
+    tile_size = sb_height / ctx->tile_rows;
+    rounding  = sb_height % ctx->tile_rows;
+    for (i = 0; i < ctx->tile_rows; i++) {
+        enccfg->tile_heights[i] = tile_size +
+            (i < rounding / 2 ||
+             i > ctx->tile_rows - 1 - (rounding + 1) / 2);
+    }
+
+    return 0;
+}
+
 static av_cold int aom_init(AVCodecContext *avctx,
                             const struct aom_codec_iface *iface)
 {
@@ -330,7 +551,10 @@
     enccfg.g_h            = avctx->height;
     enccfg.g_timebase.num = avctx->time_base.num;
     enccfg.g_timebase.den = avctx->time_base.den;
-    enccfg.g_threads      = avctx->thread_count ? avctx->thread_count : av_cpu_count();
+    enccfg.g_threads      =
+        FFMIN(avctx->thread_count ? avctx->thread_count : av_cpu_count(), 64);
+
+    enccfg.g_usage        = ctx->usage;
 
     if (ctx->lag_in_frames >= 0)
         enccfg.g_lag_in_frames = ctx->lag_in_frames;
@@ -355,14 +579,11 @@
         enccfg.rc_target_bitrate = av_rescale_rnd(avctx->bit_rate, 1, 1000,
                                                   AV_ROUND_NEAR_INF);
     } else if (enccfg.rc_end_usage != AOM_Q) {
-        if (enccfg.rc_end_usage == AOM_CQ) {
-            enccfg.rc_target_bitrate = 1000000;
-        } else {
-            avctx->bit_rate = enccfg.rc_target_bitrate * 1000;
-            av_log(avctx, AV_LOG_WARNING,
-                   "Neither bitrate nor constrained quality specified, using default bitrate of %dkbit/sec\n",
-                   enccfg.rc_target_bitrate);
-        }
+        enccfg.rc_end_usage = AOM_Q;
+        ctx->crf = 32;
+        av_log(avctx, AV_LOG_WARNING,
+               "Neither bitrate nor constrained quality specified, using default CRF of %d\n",
+               ctx->crf);
     }
 
     if (avctx->qmin >= 0)
@@ -383,10 +604,14 @@
 
     // 0-100 (0 => CBR, 100 => VBR)
     enccfg.rc_2pass_vbr_bias_pct       = round(avctx->qcompress * 100);
-    if (avctx->bit_rate)
+    if (ctx->minsection_pct >= 0)
+        enccfg.rc_2pass_vbr_minsection_pct = ctx->minsection_pct;
+    else if (avctx->bit_rate)
         enccfg.rc_2pass_vbr_minsection_pct =
             avctx->rc_min_rate * 100LL / avctx->bit_rate;
-    if (avctx->rc_max_rate)
+    if (ctx->maxsection_pct >= 0)
+        enccfg.rc_2pass_vbr_maxsection_pct = ctx->maxsection_pct;
+    else if (avctx->rc_max_rate)
         enccfg.rc_2pass_vbr_maxsection_pct =
             avctx->rc_max_rate * 100LL / avctx->bit_rate;
 
@@ -398,6 +623,11 @@
             avctx->rc_initial_buffer_occupancy * 1000LL / avctx->bit_rate;
     enccfg.rc_buf_optimal_sz = enccfg.rc_buf_sz * 5 / 6;
 
+    if (ctx->rc_undershoot_pct >= 0)
+        enccfg.rc_undershoot_pct = ctx->rc_undershoot_pct;
+    if (ctx->rc_overshoot_pct >= 0)
+        enccfg.rc_overshoot_pct = ctx->rc_overshoot_pct;
+
     // _enc_init() will balk if kf_min_dist differs from max w/AOM_KF_AUTO
     if (avctx->keyint_min >= 0 && avctx->keyint_min == avctx->gop_size)
         enccfg.kf_min_dist = avctx->keyint_min;
@@ -442,6 +672,10 @@
 
     enccfg.g_error_resilient = ctx->error_resilient;
 
+    res = choose_tiling(avctx, &enccfg);
+    if (res < 0)
+        return res;
+
     dump_enc_cfg(avctx, &enccfg);
     /* Construct Encoder Context */
     res = aom_codec_enc_init(&ctx->encoder, iface, &enccfg, flags);
@@ -455,16 +689,62 @@
     codecctl_int(avctx, AOME_SET_CPUUSED, ctx->cpu_used);
     if (ctx->auto_alt_ref >= 0)
         codecctl_int(avctx, AOME_SET_ENABLEAUTOALTREF, ctx->auto_alt_ref);
+    if (ctx->arnr_max_frames >= 0)
+        codecctl_int(avctx, AOME_SET_ARNR_MAXFRAMES,   ctx->arnr_max_frames);
+    if (ctx->arnr_strength >= 0)
+        codecctl_int(avctx, AOME_SET_ARNR_STRENGTH,    ctx->arnr_strength);
+    if (ctx->enable_cdef >= 0)
+        codecctl_int(avctx, AV1E_SET_ENABLE_CDEF, ctx->enable_cdef);
+    if (ctx->enable_restoration >= 0)
+        codecctl_int(avctx, AV1E_SET_ENABLE_RESTORATION, ctx->enable_restoration);
 
     codecctl_int(avctx, AOME_SET_STATIC_THRESHOLD, ctx->static_thresh);
     if (ctx->crf >= 0)
         codecctl_int(avctx, AOME_SET_CQ_LEVEL,          ctx->crf);
+    if (ctx->tune >= 0)
+        codecctl_int(avctx, AOME_SET_TUNING, ctx->tune);
 
     codecctl_int(avctx, AV1E_SET_COLOR_PRIMARIES, avctx->color_primaries);
     codecctl_int(avctx, AV1E_SET_MATRIX_COEFFICIENTS, avctx->colorspace);
     codecctl_int(avctx, AV1E_SET_TRANSFER_CHARACTERISTICS, avctx->color_trc);
+    if (ctx->aq_mode >= 0)
+        codecctl_int(avctx, AV1E_SET_AQ_MODE, ctx->aq_mode);
+    if (ctx->frame_parallel >= 0)
+        codecctl_int(avctx, AV1E_SET_FRAME_PARALLEL_DECODING, ctx->frame_parallel);
     set_color_range(avctx);
 
+    codecctl_int(avctx, AV1E_SET_SUPERBLOCK_SIZE, ctx->superblock_size);
+    if (ctx->uniform_tiles) {
+        codecctl_int(avctx, AV1E_SET_TILE_COLUMNS, ctx->tile_cols_log2);
+        codecctl_int(avctx, AV1E_SET_TILE_ROWS,    ctx->tile_rows_log2);
+    }
+
+#ifdef AOM_CTRL_AV1E_SET_DENOISE_NOISE_LEVEL
+    if (ctx->denoise_noise_level >= 0)
+        codecctl_int(avctx, AV1E_SET_DENOISE_NOISE_LEVEL, ctx->denoise_noise_level);
+#endif
+#ifdef AOM_CTRL_AV1E_SET_DENOISE_BLOCK_SIZE
+    if (ctx->denoise_block_size >= 0)
+        codecctl_int(avctx, AV1E_SET_DENOISE_BLOCK_SIZE, ctx->denoise_block_size);
+#endif
+#ifdef AOM_CTRL_AV1E_SET_ENABLE_GLOBAL_MOTION
+    if (ctx->enable_global_motion >= 0)
+        codecctl_int(avctx, AV1E_SET_ENABLE_GLOBAL_MOTION, ctx->enable_global_motion);
+#endif
+#ifdef AOM_CTRL_AV1E_SET_MAX_REFERENCE_FRAMES
+    if (avctx->refs >= 3) {
+        codecctl_int(avctx, AV1E_SET_MAX_REFERENCE_FRAMES, avctx->refs);
+    }
+#endif
+#ifdef AOM_CTRL_AV1E_SET_ROW_MT
+    if (ctx->row_mt >= 0)
+        codecctl_int(avctx, AV1E_SET_ROW_MT, ctx->row_mt);
+#endif
+#ifdef AOM_CTRL_AV1E_SET_ENABLE_INTRABC
+    if (ctx->enable_intrabc >= 0)
+        codecctl_int(avctx, AV1E_SET_ENABLE_INTRABC, ctx->enable_intrabc);
+#endif
+
     // provide dummy value to initialize wrapper, values will be updated each _encode()
     aom_img_wrap(&ctx->rawimg, img_fmt, avctx->width, avctx->height, 1,
                  (unsigned char*)1);
@@ -542,7 +822,7 @@
                       AVPacket *pkt)
 {
     AOMContext *ctx = avctx->priv_data;
-    int pict_type;
+    int av_unused pict_type;
     int ret = ff_alloc_packet2(avctx, pkt, cx_frame->sz, 0);
     if (ret < 0) {
         av_log(avctx, AV_LOG_ERROR,
@@ -790,16 +1070,44 @@
                          "frames (2-pass only)",                   OFFSET(auto_alt_ref),    AV_OPT_TYPE_INT, {.i64 = -1},      -1,      2,       VE},
     { "lag-in-frames",   "Number of frames to look ahead at for "
                          "alternate reference frame selection",    OFFSET(lag_in_frames),   AV_OPT_TYPE_INT, {.i64 = -1},      -1,      INT_MAX, VE},
+    { "arnr-max-frames", "altref noise reduction max frame count", OFFSET(arnr_max_frames), AV_OPT_TYPE_INT, {.i64 = -1},      -1,      INT_MAX, VE},
+    { "arnr-strength",   "altref noise reduction filter strength", OFFSET(arnr_strength),   AV_OPT_TYPE_INT, {.i64 = -1},      -1,      6,       VE},
+    { "aq-mode",         "adaptive quantization mode",             OFFSET(aq_mode),         AV_OPT_TYPE_INT, {.i64 = -1},      -1,      4, VE, "aq_mode"},
+    { "none",            "Aq not used",         0, AV_OPT_TYPE_CONST, {.i64 = 0}, 0, 0, VE, "aq_mode"},
+    { "variance",        "Variance based Aq",   0, AV_OPT_TYPE_CONST, {.i64 = 1}, 0, 0, VE, "aq_mode"},
+    { "complexity",      "Complexity based Aq", 0, AV_OPT_TYPE_CONST, {.i64 = 2}, 0, 0, VE, "aq_mode"},
+    { "cyclic",          "Cyclic Refresh Aq",   0, AV_OPT_TYPE_CONST, {.i64 = 3}, 0, 0, VE, "aq_mode"},
     { "error-resilience", "Error resilience configuration", OFFSET(error_resilient), AV_OPT_TYPE_FLAGS, {.i64 = 0}, INT_MIN, INT_MAX, VE, "er"},
     { "default",         "Improve resiliency against losses of whole frames", 0, AV_OPT_TYPE_CONST, {.i64 = AOM_ERROR_RESILIENT_DEFAULT}, 0, 0, VE, "er"},
     { "crf",              "Select the quality for constant quality mode", offsetof(AOMContext, crf), AV_OPT_TYPE_INT, {.i64 = -1}, -1, 63, VE },
     { "static-thresh",    "A change threshold on blocks below which they will be skipped by the encoder", OFFSET(static_thresh), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, VE },
     { "drop-threshold",   "Frame drop threshold", offsetof(AOMContext, drop_threshold), AV_OPT_TYPE_INT, {.i64 = 0 }, INT_MIN, INT_MAX, VE },
-    { "noise-sensitivity", "Noise sensitivity", OFFSET(noise_sensitivity), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, 4, VE},
-    { NULL }
+    { "denoise-noise-level", "Amount of noise to be removed", OFFSET(denoise_noise_level), AV_OPT_TYPE_INT, {.i64 = -1}, -1, INT_MAX, VE},
+    { "denoise-block-size", "Denoise block size ", OFFSET(denoise_block_size), AV_OPT_TYPE_INT, {.i64 = -1}, -1, INT_MAX, VE},
+    { "undershoot-pct",   "Datarate undershoot (min) target (%)", OFFSET(rc_undershoot_pct), AV_OPT_TYPE_INT, {.i64 = -1}, -1, 100, VE},
+    { "overshoot-pct",    "Datarate overshoot (max) target (%)", OFFSET(rc_overshoot_pct), AV_OPT_TYPE_INT, {.i64 = -1}, -1, 1000, VE},
+    { "minsection-pct",   "GOP min bitrate (% of target)", OFFSET(minsection_pct), AV_OPT_TYPE_INT, {.i64 = -1}, -1, 100, VE},
+    { "maxsection-pct",   "GOP max bitrate (% of target)", OFFSET(maxsection_pct), AV_OPT_TYPE_INT, {.i64 = -1}, -1, 5000, VE},
+    { "frame-parallel",   "Enable frame parallel decodability features", OFFSET(frame_parallel),  AV_OPT_TYPE_BOOL, {.i64 = -1}, -1, 1, VE},
+    { "tiles",            "Tile columns x rows", OFFSET(tile_cols), AV_OPT_TYPE_IMAGE_SIZE, { .str = NULL }, 0, 0, VE },
+    { "tile-columns",     "Log2 of number of tile columns to use", OFFSET(tile_cols_log2), AV_OPT_TYPE_INT, {.i64 = -1}, -1, 6, VE},
+    { "tile-rows",        "Log2 of number of tile rows to use",    OFFSET(tile_rows_log2), AV_OPT_TYPE_INT, {.i64 = -1}, -1, 6, VE},
+    { "row-mt",           "Enable row based multi-threading",      OFFSET(row_mt),         AV_OPT_TYPE_BOOL, {.i64 = -1}, -1, 1, VE},
+    { "enable-cdef",      "Enable CDEF filtering",                 OFFSET(enable_cdef),    AV_OPT_TYPE_BOOL, {.i64 = -1}, -1, 1, VE},
+    { "enable-global-motion",  "Enable global motion",             OFFSET(enable_global_motion), AV_OPT_TYPE_BOOL, {.i64 = -1}, -1, 1, VE},
+    { "enable-intrabc",  "Enable intra block copy prediction mode", OFFSET(enable_intrabc), AV_OPT_TYPE_BOOL, {.i64 = -1}, -1, 1, VE},
+    { "enable-restoration", "Enable Loop Restoration filtering", OFFSET(enable_restoration), AV_OPT_TYPE_BOOL, {.i64 = -1}, -1, 1, VE},
+    { "usage",           "Quality and compression efficiency vs speed trade-off", OFFSET(usage), AV_OPT_TYPE_INT, {.i64 = 0}, 0, INT_MAX, VE, "usage"},
+    { "good",            "Good quality",      0, AV_OPT_TYPE_CONST, {.i64 = 0 /* AOM_USAGE_GOOD_QUALITY */}, 0, 0, VE, "usage"},
+    { "realtime",        "Realtime encoding", 0, AV_OPT_TYPE_CONST, {.i64 = 1 /* AOM_USAGE_REALTIME */},     0, 0, VE, "usage"},
+    { "tune",            "The metric that the encoder tunes for. Automatically chosen by the encoder by default", OFFSET(tune), AV_OPT_TYPE_INT, {.i64 = -1}, -1, AOM_TUNE_SSIM, VE, "tune"},
+    { "psnr",            NULL,         0, AV_OPT_TYPE_CONST, {.i64 = AOM_TUNE_PSNR}, 0, 0, VE, "tune"},
+    { "ssim",            NULL,         0, AV_OPT_TYPE_CONST, {.i64 = AOM_TUNE_SSIM}, 0, 0, VE, "tune"},
+    { NULL },
 };
 
 static const AVCodecDefault defaults[] = {
+    { "b",                 "0" },
     { "qmin",             "-1" },
     { "qmax",             "-1" },
     { "g",                "-1" },
diff --git a/libavcodec/libaribb24.c b/libavcodec/libaribb24.c
new file mode 100644
index 0000000..3a59938
--- /dev/null
+++ b/libavcodec/libaribb24.c
@@ -0,0 +1,395 @@
+/*
+ * ARIB STD-B24 caption decoder using the libaribb24 library
+ * Copyright (c) 2019 Jan Ekström
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "avcodec.h"
+#include "libavcodec/ass.h"
+#include "libavutil/log.h"
+#include "libavutil/opt.h"
+
+#include <aribb24/aribb24.h>
+#include <aribb24/parser.h>
+#include <aribb24/decoder.h>
+
+typedef struct Libaribb24Context {
+    AVClass *class;
+
+    arib_instance_t *lib_instance;
+    arib_parser_t *parser;
+    arib_decoder_t *decoder;
+
+    int read_order;
+
+    char        *aribb24_base_path;
+    unsigned int aribb24_skip_ruby;
+} Libaribb24Context;
+
+static unsigned int get_profile_font_size(int profile)
+{
+    switch (profile) {
+    case FF_PROFILE_ARIB_PROFILE_A:
+        return 36;
+    case FF_PROFILE_ARIB_PROFILE_C:
+        return 18;
+    default:
+        return 0;
+    }
+}
+
+static void libaribb24_log(void *p, const char *msg)
+{
+    av_log((AVCodecContext *)p, AV_LOG_INFO, "%s\n", msg);
+}
+
+static int libaribb24_generate_ass_header(AVCodecContext *avctx)
+{
+    unsigned int plane_width = 0;
+    unsigned int plane_height = 0;
+    unsigned int font_size = 0;
+
+    switch (avctx->profile) {
+    case FF_PROFILE_ARIB_PROFILE_A:
+        plane_width = 960;
+        plane_height = 540;
+        font_size = get_profile_font_size(avctx->profile);
+        break;
+    case FF_PROFILE_ARIB_PROFILE_C:
+        plane_width = 320;
+        plane_height = 180;
+        font_size = get_profile_font_size(avctx->profile);
+        break;
+    default:
+        av_log(avctx, AV_LOG_ERROR, "Unknown or unsupported profile set!\n");
+        return AVERROR(EINVAL);
+    }
+
+    avctx->subtitle_header = av_asprintf(
+             "[Script Info]\r\n"
+             "; Script generated by FFmpeg/Lavc%s\r\n"
+             "ScriptType: v4.00+\r\n"
+             "PlayResX: %d\r\n"
+             "PlayResY: %d\r\n"
+             "\r\n"
+             "[V4+ Styles]\r\n"
+
+             /* ASSv4 header */
+             "Format: Name, "
+             "Fontname, Fontsize, "
+             "PrimaryColour, SecondaryColour, OutlineColour, BackColour, "
+             "Bold, Italic, Underline, StrikeOut, "
+             "ScaleX, ScaleY, "
+             "Spacing, Angle, "
+             "BorderStyle, Outline, Shadow, "
+             "Alignment, MarginL, MarginR, MarginV, "
+             "Encoding\r\n"
+
+             "Style: "
+             "Default,"             /* Name */
+             "%s,%d,"               /* Font{name,size} */
+             "&H%x,&H%x,&H%x,&H%x," /* {Primary,Secondary,Outline,Back}Colour */
+             "%d,%d,%d,0,"          /* Bold, Italic, Underline, StrikeOut */
+             "100,100,"             /* Scale{X,Y} */
+             "0,0,"                 /* Spacing, Angle */
+             "%d,1,0,"              /* BorderStyle, Outline, Shadow */
+             "%d,10,10,10,"         /* Alignment, Margin[LRV] */
+             "0\r\n"                /* Encoding */
+
+             "\r\n"
+             "[Events]\r\n"
+             "Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text\r\n",
+             !(avctx->flags & AV_CODEC_FLAG_BITEXACT) ? AV_STRINGIFY(LIBAVCODEC_VERSION) : "",
+             plane_width, plane_height,
+             ASS_DEFAULT_FONT, font_size, ASS_DEFAULT_COLOR,
+             ASS_DEFAULT_COLOR, ASS_DEFAULT_BACK_COLOR, ASS_DEFAULT_BACK_COLOR,
+             -ASS_DEFAULT_BOLD, -ASS_DEFAULT_ITALIC, -ASS_DEFAULT_UNDERLINE,
+             ASS_DEFAULT_BORDERSTYLE, ASS_DEFAULT_ALIGNMENT);
+
+    if (!avctx->subtitle_header)
+        return AVERROR(ENOMEM);
+
+    avctx->subtitle_header_size = strlen(avctx->subtitle_header);
+
+    return 0;
+}
+
+static int libaribb24_init(AVCodecContext *avctx)
+{
+    Libaribb24Context *b24 = avctx->priv_data;
+    void(* arib_dec_init)(arib_decoder_t* decoder) = NULL;
+    int ret_code = AVERROR_EXTERNAL;
+
+    if (!(b24->lib_instance = arib_instance_new(avctx))) {
+        av_log(avctx, AV_LOG_ERROR, "Failed to initialize libaribb24!\n");
+        goto init_fail;
+    }
+
+    if (b24->aribb24_base_path) {
+        av_log(avctx, AV_LOG_INFO, "Setting the libaribb24 base path to '%s'\n",
+               b24->aribb24_base_path);
+        arib_set_base_path(b24->lib_instance, b24->aribb24_base_path);
+    }
+
+    arib_register_messages_callback(b24->lib_instance, libaribb24_log);
+
+    if (!(b24->parser = arib_get_parser(b24->lib_instance))) {
+        av_log(avctx, AV_LOG_ERROR, "Failed to initialize libaribb24 PES parser!\n");
+        goto init_fail;
+    }
+    if (!(b24->decoder = arib_get_decoder(b24->lib_instance))) {
+        av_log(avctx, AV_LOG_ERROR, "Failed to initialize libaribb24 decoder!\n");
+        goto init_fail;
+    }
+
+    switch (avctx->profile) {
+    case FF_PROFILE_ARIB_PROFILE_A:
+        arib_dec_init = arib_initialize_decoder_a_profile;
+        break;
+    case FF_PROFILE_ARIB_PROFILE_C:
+        arib_dec_init = arib_initialize_decoder_c_profile;
+        break;
+    default:
+        av_log(avctx, AV_LOG_ERROR, "Unknown or unsupported profile set!\n");
+        ret_code = AVERROR(EINVAL);
+        goto init_fail;
+    }
+
+    arib_dec_init(b24->decoder);
+
+    if (libaribb24_generate_ass_header(avctx) < 0) {
+        ret_code = AVERROR(ENOMEM);
+        goto init_fail;
+    }
+
+    return 0;
+
+init_fail:
+    if (b24->decoder)
+        arib_finalize_decoder(b24->decoder);
+
+    if (b24->lib_instance)
+        arib_instance_destroy(b24->lib_instance);
+
+    return ret_code;
+}
+
+static int libaribb24_close(AVCodecContext *avctx)
+{
+    Libaribb24Context *b24 = avctx->priv_data;
+
+    if (b24->decoder)
+        arib_finalize_decoder(b24->decoder);
+
+    if (b24->lib_instance)
+        arib_instance_destroy(b24->lib_instance);
+
+    return 0;
+}
+
+#define RGB_TO_BGR(c) (((c) & 0xff) << 16 | ((c) & 0xff00) | (((c) >> 16) & 0xff))
+
+static int libaribb24_handle_regions(AVCodecContext *avctx, AVSubtitle *sub)
+{
+    Libaribb24Context *b24 = avctx->priv_data;
+    const arib_buf_region_t *region = arib_decoder_get_regions(b24->decoder);
+    unsigned int profile_font_size = get_profile_font_size(avctx->profile);
+    AVBPrint buf = { 0 };
+    int ret = 0;
+
+    av_bprint_init(&buf, 0, AV_BPRINT_SIZE_UNLIMITED);
+
+    while (region) {
+        ptrdiff_t region_length = region->p_end - region->p_start;
+        unsigned int ruby_region =
+            region->i_fontheight == (profile_font_size / 2);
+
+        // ASS requires us to make the colors BGR, so we convert here
+        int foreground_bgr_color = RGB_TO_BGR(region->i_foreground_color);
+        int background_bgr_color = RGB_TO_BGR(region->i_background_color);
+
+        if (region_length < 0) {
+            av_log(avctx, AV_LOG_ERROR, "Invalid negative region length!\n");
+            ret = AVERROR_INVALIDDATA;
+            break;
+        }
+
+        if (region_length == 0 || (ruby_region && b24->aribb24_skip_ruby)) {
+            goto next_region;
+        }
+
+        // color and alpha
+        if (foreground_bgr_color != ASS_DEFAULT_COLOR)
+            av_bprintf(&buf, "{\\1c&H%06x&}", foreground_bgr_color);
+
+        if (region->i_foreground_alpha != 0)
+            av_bprintf(&buf, "{\\1a&H%02x&}", region->i_foreground_alpha);
+
+        if (background_bgr_color != ASS_DEFAULT_BACK_COLOR)
+            av_bprintf(&buf, "{\\3c&H%06x&}", background_bgr_color);
+
+        if (region->i_background_alpha != 0)
+            av_bprintf(&buf, "{\\3a&H%02x&}", region->i_background_alpha);
+
+        // font size
+        if (region->i_fontwidth  != profile_font_size ||
+            region->i_fontheight != profile_font_size) {
+            av_bprintf(&buf, "{\\fscx%"PRId64"\\fscy%"PRId64"}",
+                       av_rescale(region->i_fontwidth, 100,
+                                  profile_font_size),
+                       av_rescale(region->i_fontheight, 100,
+                                  profile_font_size));
+        }
+
+        // TODO: positioning
+
+        av_bprint_append_data(&buf, region->p_start, region_length);
+
+        av_bprintf(&buf, "{\\r}");
+
+next_region:
+        region = region->p_next;
+    }
+
+    if (!av_bprint_is_complete(&buf))
+        ret = AVERROR(ENOMEM);
+
+    if (ret == 0) {
+        av_log(avctx, AV_LOG_DEBUG, "Styled ASS line: %s\n",
+               buf.str);
+
+        ret = ff_ass_add_rect(sub, buf.str, b24->read_order++,
+                              0, NULL, NULL);
+    }
+
+    av_bprint_finalize(&buf, NULL);
+
+    return ret;
+}
+
+static int libaribb24_decode(AVCodecContext *avctx, void *data, int *got_sub_ptr, AVPacket *pkt)
+{
+    Libaribb24Context *b24 = avctx->priv_data;
+    AVSubtitle *sub = data;
+    size_t parsed_data_size = 0;
+    size_t decoded_subtitle_size = 0;
+    const unsigned char *parsed_data = NULL;
+    char *decoded_subtitle = NULL;
+    time_t subtitle_duration = 0;
+    int ret = 0;
+
+    if (pkt->size <= 0)
+        return pkt->size;
+
+    arib_parse_pes(b24->parser, pkt->data, pkt->size);
+
+    parsed_data = arib_parser_get_data(b24->parser,
+                                       &parsed_data_size);
+    if (!parsed_data || !parsed_data_size) {
+        av_log(avctx, AV_LOG_DEBUG, "No decode'able data was received from "
+                                    "packet (dts: %"PRId64", pts: %"PRId64").\n",
+               pkt->dts, pkt->pts);
+        return pkt->size;
+    }
+
+    decoded_subtitle_size = parsed_data_size * 4;
+    if (!(decoded_subtitle = av_mallocz(decoded_subtitle_size + 1))) {
+        av_log(avctx, AV_LOG_ERROR,
+               "Failed to allocate buffer for decoded subtitle!\n");
+        return AVERROR(ENOMEM);
+    }
+
+    decoded_subtitle_size = arib_decode_buffer(b24->decoder,
+                                               parsed_data,
+                                               parsed_data_size,
+                                               decoded_subtitle,
+                                               decoded_subtitle_size);
+
+    subtitle_duration = arib_decoder_get_time(b24->decoder);
+
+    if (avctx->pkt_timebase.num && pkt->pts != AV_NOPTS_VALUE)
+        sub->pts = av_rescale_q(pkt->pts,
+                                avctx->pkt_timebase, AV_TIME_BASE_Q);
+
+    sub->end_display_time = subtitle_duration ?
+                            av_rescale_q(subtitle_duration,
+                                         AV_TIME_BASE_Q,
+                                         (AVRational){1, 1000}) :
+                            UINT32_MAX;
+
+    av_log(avctx, AV_LOG_DEBUG,
+           "Result: '%s' (size: %zu, pkt_pts: %"PRId64", sub_pts: %"PRId64" "
+           "duration: %"PRIu32", pkt_timebase: %d/%d, time_base: %d/%d')\n",
+           decoded_subtitle ? decoded_subtitle : "<no subtitle>",
+           decoded_subtitle_size,
+           pkt->pts, sub->pts,
+           sub->end_display_time,
+           avctx->pkt_timebase.num, avctx->pkt_timebase.den,
+           avctx->time_base.num, avctx->time_base.den);
+
+    if (decoded_subtitle)
+        ret = libaribb24_handle_regions(avctx, sub);
+
+    *got_sub_ptr = sub->num_rects > 0;
+
+    av_free(decoded_subtitle);
+
+    // flush the region buffers, otherwise the linked list keeps getting
+    // longer and longer...
+    arib_finalize_decoder(b24->decoder);
+
+    return ret < 0 ? ret : pkt->size;
+}
+
+static void libaribb24_flush(AVCodecContext *avctx)
+{
+    Libaribb24Context *b24 = avctx->priv_data;
+    if (!(avctx->flags2 & AV_CODEC_FLAG2_RO_FLUSH_NOOP))
+        b24->read_order = 0;
+}
+
+#define OFFSET(x) offsetof(Libaribb24Context, x)
+#define SD AV_OPT_FLAG_SUBTITLE_PARAM | AV_OPT_FLAG_DECODING_PARAM
+static const AVOption options[] = {
+    { "aribb24-base-path", "set the base path for the libaribb24 library",
+      OFFSET(aribb24_base_path), AV_OPT_TYPE_STRING, { .str = NULL }, 0, 0, SD },
+    { "aribb24-skip-ruby-text", "skip ruby text blocks during decoding",
+      OFFSET(aribb24_skip_ruby), AV_OPT_TYPE_BOOL, { .i64 = 1 }, 0, 1, SD },
+    { NULL }
+};
+
+static const AVClass aribb24_class = {
+    .class_name = "libaribb24 decoder",
+    .item_name  = av_default_item_name,
+    .option     = options,
+    .version    = LIBAVUTIL_VERSION_INT,
+};
+
+AVCodec ff_libaribb24_decoder = {
+    .name      = "libaribb24",
+    .long_name = NULL_IF_CONFIG_SMALL("libaribb24 ARIB STD-B24 caption decoder"),
+    .type      = AVMEDIA_TYPE_SUBTITLE,
+    .id        = AV_CODEC_ID_ARIB_CAPTION,
+    .priv_data_size = sizeof(Libaribb24Context),
+    .init      = libaribb24_init,
+    .close     = libaribb24_close,
+    .decode    = libaribb24_decode,
+    .flush     = libaribb24_flush,
+    .priv_class= &aribb24_class,
+    .wrapper_name = "libaribb24",
+};
diff --git a/libavcodec/libdav1d.c b/libavcodec/libdav1d.c
new file mode 100644
index 0000000..5248e3f
--- /dev/null
+++ b/libavcodec/libdav1d.c
@@ -0,0 +1,413 @@
+/*
+ * Copyright (c) 2018 Ronald S. Bultje <rsbultje gmail com>
+ * Copyright (c) 2018 James Almer <jamrial gmail com>
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include <dav1d/dav1d.h>
+
+#include "libavutil/avassert.h"
+#include "libavutil/mastering_display_metadata.h"
+#include "libavutil/imgutils.h"
+#include "libavutil/opt.h"
+
+#include "avcodec.h"
+#include "decode.h"
+#include "internal.h"
+
+typedef struct Libdav1dContext {
+    AVClass *class;
+    Dav1dContext *c;
+    AVBufferPool *pool;
+    int pool_size;
+
+    Dav1dData data;
+    int tile_threads;
+    int frame_threads;
+    int apply_grain;
+    int operating_point;
+    int all_layers;
+} Libdav1dContext;
+
+static const enum AVPixelFormat pix_fmt[][3] = {
+    [DAV1D_PIXEL_LAYOUT_I400] = { AV_PIX_FMT_GRAY8,   AV_PIX_FMT_GRAY10,    AV_PIX_FMT_GRAY12 },
+    [DAV1D_PIXEL_LAYOUT_I420] = { AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUV420P10, AV_PIX_FMT_YUV420P12 },
+    [DAV1D_PIXEL_LAYOUT_I422] = { AV_PIX_FMT_YUV422P, AV_PIX_FMT_YUV422P10, AV_PIX_FMT_YUV422P12 },
+    [DAV1D_PIXEL_LAYOUT_I444] = { AV_PIX_FMT_YUV444P, AV_PIX_FMT_YUV444P10, AV_PIX_FMT_YUV444P12 },
+};
+
+static const enum AVPixelFormat pix_fmt_rgb[3] = {
+    AV_PIX_FMT_GBRP, AV_PIX_FMT_GBRP10, AV_PIX_FMT_GBRP12,
+};
+
+static void libdav1d_log_callback(void *opaque, const char *fmt, va_list vl)
+{
+    AVCodecContext *c = opaque;
+
+    av_vlog(c, AV_LOG_ERROR, fmt, vl);
+}
+
+static int libdav1d_picture_allocator(Dav1dPicture *p, void *cookie)
+{
+    Libdav1dContext *dav1d = cookie;
+    enum AVPixelFormat format = pix_fmt[p->p.layout][p->seq_hdr->hbd];
+    int ret, linesize[4], h = FFALIGN(p->p.h, 128);
+    uint8_t *aligned_ptr, *data[4];
+    AVBufferRef *buf;
+
+    ret = av_image_fill_arrays(data, linesize, NULL, format, FFALIGN(p->p.w, 128),
+                               h, DAV1D_PICTURE_ALIGNMENT);
+    if (ret < 0)
+        return ret;
+
+    if (ret != dav1d->pool_size) {
+        av_buffer_pool_uninit(&dav1d->pool);
+        // Use twice the amount of required padding bytes for aligned_ptr below.
+        dav1d->pool = av_buffer_pool_init(ret + DAV1D_PICTURE_ALIGNMENT * 2, NULL);
+        if (!dav1d->pool) {
+            dav1d->pool_size = 0;
+            return AVERROR(ENOMEM);
+        }
+        dav1d->pool_size = ret;
+    }
+    buf = av_buffer_pool_get(dav1d->pool);
+    if (!buf)
+        return AVERROR(ENOMEM);
+
+    // libdav1d requires DAV1D_PICTURE_ALIGNMENT aligned buffers, which av_malloc()
+    // doesn't guarantee for example when AVX is disabled at configure time.
+    // Use the extra DAV1D_PICTURE_ALIGNMENT padding bytes in the buffer to align it
+    // if required.
+    aligned_ptr = (uint8_t *)FFALIGN((uintptr_t)buf->data, DAV1D_PICTURE_ALIGNMENT);
+    ret = av_image_fill_pointers(data, format, h, aligned_ptr, linesize);
+    if (ret < 0) {
+        av_buffer_unref(&buf);
+        return ret;
+    }
+
+    p->data[0] = data[0];
+    p->data[1] = data[1];
+    p->data[2] = data[2];
+    p->stride[0] = linesize[0];
+    p->stride[1] = linesize[1];
+    p->allocator_data = buf;
+
+    return 0;
+}
+
+static void libdav1d_picture_release(Dav1dPicture *p, void *cookie)
+{
+    AVBufferRef *buf = p->allocator_data;
+
+    av_buffer_unref(&buf);
+}
+
+static av_cold int libdav1d_init(AVCodecContext *c)
+{
+    Libdav1dContext *dav1d = c->priv_data;
+    Dav1dSettings s;
+    int threads = (c->thread_count ? c->thread_count : av_cpu_count()) * 3 / 2;
+    int res;
+
+    av_log(c, AV_LOG_INFO, "libdav1d %s\n", dav1d_version());
+
+    dav1d_default_settings(&s);
+    s.logger.cookie = c;
+    s.logger.callback = libdav1d_log_callback;
+    s.allocator.cookie = dav1d;
+    s.allocator.alloc_picture_callback = libdav1d_picture_allocator;
+    s.allocator.release_picture_callback = libdav1d_picture_release;
+    s.frame_size_limit = c->max_pixels;
+    if (dav1d->apply_grain >= 0)
+        s.apply_grain = dav1d->apply_grain;
+
+    s.all_layers = dav1d->all_layers;
+    if (dav1d->operating_point >= 0)
+        s.operating_point = dav1d->operating_point;
+
+    s.n_tile_threads = dav1d->tile_threads
+                     ? dav1d->tile_threads
+                     : FFMIN(floor(sqrt(threads)), DAV1D_MAX_TILE_THREADS);
+    s.n_frame_threads = dav1d->frame_threads
+                      ? dav1d->frame_threads
+                      : FFMIN(ceil(threads / s.n_tile_threads), DAV1D_MAX_FRAME_THREADS);
+    av_log(c, AV_LOG_DEBUG, "Using %d frame threads, %d tile threads\n",
+           s.n_frame_threads, s.n_tile_threads);
+
+    res = dav1d_open(&dav1d->c, &s);
+    if (res < 0)
+        return AVERROR(ENOMEM);
+
+    return 0;
+}
+
+static void libdav1d_flush(AVCodecContext *c)
+{
+    Libdav1dContext *dav1d = c->priv_data;
+
+    dav1d_data_unref(&dav1d->data);
+    dav1d_flush(dav1d->c);
+}
+
+static void libdav1d_data_free(const uint8_t *data, void *opaque) {
+    AVBufferRef *buf = opaque;
+
+    av_buffer_unref(&buf);
+}
+
+static void libdav1d_user_data_free(const uint8_t *data, void *opaque) {
+    av_assert0(data == opaque);
+    av_free(opaque);
+}
+
+static int libdav1d_receive_frame(AVCodecContext *c, AVFrame *frame)
+{
+    Libdav1dContext *dav1d = c->priv_data;
+    Dav1dData *data = &dav1d->data;
+    Dav1dPicture pic = { 0 }, *p = &pic;
+    int res;
+
+    if (!data->sz) {
+        AVPacket pkt = { 0 };
+
+        res = ff_decode_get_packet(c, &pkt);
+        if (res < 0 && res != AVERROR_EOF)
+            return res;
+
+        if (pkt.size) {
+            res = dav1d_data_wrap(data, pkt.data, pkt.size, libdav1d_data_free, pkt.buf);
+            if (res < 0) {
+                av_packet_unref(&pkt);
+                return res;
+            }
+
+            data->m.timestamp = pkt.pts;
+            data->m.offset = pkt.pos;
+            data->m.duration = pkt.duration;
+
+            pkt.buf = NULL;
+            av_packet_unref(&pkt);
+
+            if (c->reordered_opaque != AV_NOPTS_VALUE) {
+                uint8_t *reordered_opaque = av_malloc(sizeof(c->reordered_opaque));
+                if (!reordered_opaque) {
+                    dav1d_data_unref(data);
+                    return AVERROR(ENOMEM);
+                }
+
+                memcpy(reordered_opaque, &c->reordered_opaque, sizeof(c->reordered_opaque));
+                res = dav1d_data_wrap_user_data(data, reordered_opaque,
+                                                libdav1d_user_data_free, reordered_opaque);
+                if (res < 0) {
+                    av_free(reordered_opaque);
+                    dav1d_data_unref(data);
+                    return res;
+                }
+            }
+        }
+    }
+
+    res = dav1d_send_data(dav1d->c, data);
+    if (res < 0) {
+        if (res == AVERROR(EINVAL))
+            res = AVERROR_INVALIDDATA;
+        if (res != AVERROR(EAGAIN))
+            return res;
+    }
+
+    res = dav1d_get_picture(dav1d->c, p);
+    if (res < 0) {
+        if (res == AVERROR(EINVAL))
+            res = AVERROR_INVALIDDATA;
+        else if (res == AVERROR(EAGAIN) && c->internal->draining)
+            res = AVERROR_EOF;
+
+        return res;
+    }
+
+    av_assert0(p->data[0] && p->allocator_data);
+
+    // This requires the custom allocator above
+    frame->buf[0] = av_buffer_ref(p->allocator_data);
+    if (!frame->buf[0]) {
+        dav1d_picture_unref(p);
+        return AVERROR(ENOMEM);
+    }
+
+    frame->data[0] = p->data[0];
+    frame->data[1] = p->data[1];
+    frame->data[2] = p->data[2];
+    frame->linesize[0] = p->stride[0];
+    frame->linesize[1] = p->stride[1];
+    frame->linesize[2] = p->stride[1];
+
+    c->profile = p->seq_hdr->profile;
+    c->level = ((p->seq_hdr->operating_points[0].major_level - 2) << 2)
+               | p->seq_hdr->operating_points[0].minor_level;
+    frame->width = p->p.w;
+    frame->height = p->p.h;
+    if (c->width != p->p.w || c->height != p->p.h) {
+        res = ff_set_dimensions(c, p->p.w, p->p.h);
+        if (res < 0)
+            goto fail;
+    }
+
+    switch (p->seq_hdr->chr) {
+    case DAV1D_CHR_VERTICAL:
+        frame->chroma_location = c->chroma_sample_location = AVCHROMA_LOC_LEFT;
+        break;
+    case DAV1D_CHR_COLOCATED:
+        frame->chroma_location = c->chroma_sample_location = AVCHROMA_LOC_TOPLEFT;
+        break;
+    }
+    frame->colorspace = c->colorspace = (enum AVColorSpace) p->seq_hdr->mtrx;
+    frame->color_primaries = c->color_primaries = (enum AVColorPrimaries) p->seq_hdr->pri;
+    frame->color_trc = c->color_trc = (enum AVColorTransferCharacteristic) p->seq_hdr->trc;
+    frame->color_range = c->color_range = p->seq_hdr->color_range ? AVCOL_RANGE_JPEG : AVCOL_RANGE_MPEG;
+
+    if (p->p.layout == DAV1D_PIXEL_LAYOUT_I444 &&
+        p->seq_hdr->mtrx == DAV1D_MC_IDENTITY &&
+        p->seq_hdr->pri  == DAV1D_COLOR_PRI_BT709 &&
+        p->seq_hdr->trc  == DAV1D_TRC_SRGB)
+        frame->format = c->pix_fmt = pix_fmt_rgb[p->seq_hdr->hbd];
+    else
+        frame->format = c->pix_fmt = pix_fmt[p->p.layout][p->seq_hdr->hbd];
+
+    if (p->m.user_data.data)
+        memcpy(&frame->reordered_opaque, p->m.user_data.data, sizeof(frame->reordered_opaque));
+    else
+        frame->reordered_opaque = AV_NOPTS_VALUE;
+
+    if (p->seq_hdr->num_units_in_tick && p->seq_hdr->time_scale) {
+        av_reduce(&c->framerate.den, &c->framerate.num,
+                  p->seq_hdr->num_units_in_tick, p->seq_hdr->time_scale, INT_MAX);
+        if (p->seq_hdr->equal_picture_interval)
+            c->ticks_per_frame = p->seq_hdr->num_ticks_per_picture;
+    }
+
+    // match timestamps and packet size
+    frame->pts = frame->best_effort_timestamp = p->m.timestamp;
+#if FF_API_PKT_PTS
+FF_DISABLE_DEPRECATION_WARNINGS
+    frame->pkt_pts = p->m.timestamp;
+FF_ENABLE_DEPRECATION_WARNINGS
+#endif
+    frame->pkt_dts = p->m.timestamp;
+    frame->pkt_pos = p->m.offset;
+    frame->pkt_size = p->m.size;
+    frame->pkt_duration = p->m.duration;
+    frame->key_frame = p->frame_hdr->frame_type == DAV1D_FRAME_TYPE_KEY;
+
+    switch (p->frame_hdr->frame_type) {
+    case DAV1D_FRAME_TYPE_KEY:
+    case DAV1D_FRAME_TYPE_INTRA:
+        frame->pict_type = AV_PICTURE_TYPE_I;
+        break;
+    case DAV1D_FRAME_TYPE_INTER:
+        frame->pict_type = AV_PICTURE_TYPE_P;
+        break;
+    case DAV1D_FRAME_TYPE_SWITCH:
+        frame->pict_type = AV_PICTURE_TYPE_SP;
+        break;
+    default:
+        res = AVERROR_INVALIDDATA;
+        goto fail;
+    }
+
+    if (p->mastering_display) {
+        AVMasteringDisplayMetadata *mastering = av_mastering_display_metadata_create_side_data(frame);
+        if (!mastering) {
+            res = AVERROR(ENOMEM);
+            goto fail;
+        }
+
+        for (int i = 0; i < 3; i++) {
+            mastering->display_primaries[i][0] = av_make_q(p->mastering_display->primaries[i][0], 1 << 16);
+            mastering->display_primaries[i][1] = av_make_q(p->mastering_display->primaries[i][1], 1 << 16);
+        }
+        mastering->white_point[0] = av_make_q(p->mastering_display->white_point[0], 1 << 16);
+        mastering->white_point[1] = av_make_q(p->mastering_display->white_point[1], 1 << 16);
+
+        mastering->max_luminance = av_make_q(p->mastering_display->max_luminance, 1 << 8);
+        mastering->min_luminance = av_make_q(p->mastering_display->min_luminance, 1 << 14);
+
+        mastering->has_primaries = 1;
+        mastering->has_luminance = 1;
+    }
+    if (p->content_light) {
+        AVContentLightMetadata *light = av_content_light_metadata_create_side_data(frame);
+        if (!light) {
+            res = AVERROR(ENOMEM);
+            goto fail;
+        }
+        light->MaxCLL = p->content_light->max_content_light_level;
+        light->MaxFALL = p->content_light->max_frame_average_light_level;
+    }
+
+    res = 0;
+fail:
+    dav1d_picture_unref(p);
+    if (res < 0)
+        av_frame_unref(frame);
+    return res;
+}
+
+static av_cold int libdav1d_close(AVCodecContext *c)
+{
+    Libdav1dContext *dav1d = c->priv_data;
+
+    av_buffer_pool_uninit(&dav1d->pool);
+    dav1d_data_unref(&dav1d->data);
+    dav1d_close(&dav1d->c);
+
+    return 0;
+}
+
+#define OFFSET(x) offsetof(Libdav1dContext, x)
+#define VD AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM
+static const AVOption libdav1d_options[] = {
+    { "tilethreads", "Tile threads", OFFSET(tile_threads), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, DAV1D_MAX_TILE_THREADS, VD },
+    { "framethreads", "Frame threads", OFFSET(frame_threads), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, DAV1D_MAX_FRAME_THREADS, VD },
+    { "filmgrain", "Apply Film Grain", OFFSET(apply_grain), AV_OPT_TYPE_BOOL, { .i64 = -1 }, -1, 1, VD },
+    { "oppoint",  "Select an operating point of the scalable bitstream", OFFSET(operating_point), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 31, VD },
+    { "alllayers", "Output all spatial layers", OFFSET(all_layers), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VD },
+    { NULL }
+};
+
+static const AVClass libdav1d_class = {
+    .class_name = "libdav1d decoder",
+    .item_name  = av_default_item_name,
+    .option     = libdav1d_options,
+    .version    = LIBAVUTIL_VERSION_INT,
+};
+
+AVCodec ff_libdav1d_decoder = {
+    .name           = "libdav1d",
+    .long_name      = NULL_IF_CONFIG_SMALL("dav1d AV1 decoder by VideoLAN"),
+    .type           = AVMEDIA_TYPE_VIDEO,
+    .id             = AV_CODEC_ID_AV1,
+    .priv_data_size = sizeof(Libdav1dContext),
+    .init           = libdav1d_init,
+    .close          = libdav1d_close,
+    .flush          = libdav1d_flush,
+    .receive_frame  = libdav1d_receive_frame,
+    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AUTO_THREADS,
+    .caps_internal  = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_SETS_PKT_DTS,
+    .priv_class     = &libdav1d_class,
+    .wrapper_name   = "libdav1d",
+};
diff --git a/libavcodec/libdavs2.c b/libavcodec/libdavs2.c
index aa14782..218f3ec 100644
--- a/libavcodec/libdavs2.c
+++ b/libavcodec/libdavs2.c
@@ -32,8 +32,6 @@
     davs2_param_t    param;      // decoding parameters
     davs2_packet_t   packet;     // input bitstream
 
-    int decoded_frames;
-
     davs2_picture_t  out_frame;  // output data, frame data
     davs2_seq_info_t headerset;  // output data, sequence header
 
@@ -42,10 +40,13 @@
 static av_cold int davs2_init(AVCodecContext *avctx)
 {
     DAVS2Context *cad = avctx->priv_data;
+    int cpu_flags = av_get_cpu_flags();
 
     /* init the decoder */
     cad->param.threads      = avctx->thread_count;
     cad->param.info_level   = 0;
+    cad->param.disable_avx  = !(cpu_flags & AV_CPU_FLAG_AVX &&
+                                cpu_flags & AV_CPU_FLAG_AVX2);
     cad->decoder            = davs2_decoder_open(&cad->param);
 
     if (!cad->decoder) {
@@ -57,7 +58,7 @@
     return 0;
 }
 
-static int davs2_dump_frames(AVCodecContext *avctx, davs2_picture_t *pic,
+static int davs2_dump_frames(AVCodecContext *avctx, davs2_picture_t *pic, int *got_frame,
                              davs2_seq_info_t *headerset, int ret_type, AVFrame *frame)
 {
     DAVS2Context *cad    = avctx->priv_data;
@@ -65,8 +66,10 @@
     int plane = 0;
     int line  = 0;
 
-    if (!headerset)
+    if (!headerset) {
+        *got_frame = 0;
         return 0;
+    }
 
     if (!pic || ret_type == DAVS2_GOT_HEADER) {
         avctx->width     = headerset->width;
@@ -75,20 +78,41 @@
                            AV_PIX_FMT_YUV420P10 : AV_PIX_FMT_YUV420P;
 
         avctx->framerate = av_d2q(headerset->frame_rate,4096);
+        *got_frame = 0;
         return 0;
     }
 
+    switch (pic->type) {
+    case DAVS2_PIC_I:
+    case DAVS2_PIC_G:
+        frame->pict_type = AV_PICTURE_TYPE_I;
+        break;
+    case DAVS2_PIC_P:
+    case DAVS2_PIC_S:
+        frame->pict_type = AV_PICTURE_TYPE_P;
+        break;
+    case DAVS2_PIC_B:
+        frame->pict_type = AV_PICTURE_TYPE_B;
+        break;
+    case DAVS2_PIC_F:
+        frame->pict_type = AV_PICTURE_TYPE_S;
+        break;
+    default:
+        av_log(avctx, AV_LOG_ERROR, "Decoder error: unknown frame type\n");
+        return AVERROR_EXTERNAL;
+    }
+
     for (plane = 0; plane < 3; ++plane) {
         int size_line = pic->widths[plane] * bytes_per_sample;
         frame->buf[plane]  = av_buffer_alloc(size_line * pic->lines[plane]);
 
         if (!frame->buf[plane]){
-            av_log(avctx, AV_LOG_ERROR, "dump error: alloc failed.\n");
+            av_log(avctx, AV_LOG_ERROR, "Decoder error: allocation failure, can't dump frames.\n");
             return AVERROR(ENOMEM);
         }
 
         frame->data[plane]     = frame->buf[plane]->data;
-        frame->linesize[plane] = pic->widths[plane];
+        frame->linesize[plane] = size_line;
 
         for (line = 0; line < pic->lines[plane]; ++line)
             memcpy(frame->data[plane] + line * size_line,
@@ -99,11 +123,42 @@
     frame->width     = cad->headerset.width;
     frame->height    = cad->headerset.height;
     frame->pts       = cad->out_frame.pts;
-    frame->pict_type = pic->type;
     frame->format    = avctx->pix_fmt;
 
-    cad->decoded_frames++;
-    return 1;
+    *got_frame = 1;
+    return 0;
+}
+
+static void davs2_flush(AVCodecContext *avctx)
+{
+    DAVS2Context *cad      = avctx->priv_data;
+    int           ret      = DAVS2_GOT_FRAME;
+
+    while (ret == DAVS2_GOT_FRAME) {
+        ret = davs2_decoder_flush(cad->decoder, &cad->headerset, &cad->out_frame);
+        davs2_decoder_frame_unref(cad->decoder, &cad->out_frame);
+    }
+
+    if (ret == DAVS2_ERROR) {
+        av_log(avctx, AV_LOG_WARNING, "Decoder flushing failed.\n");
+    }
+}
+
+static int send_delayed_frame(AVCodecContext *avctx, AVFrame *frame, int *got_frame)
+{
+    DAVS2Context *cad      = avctx->priv_data;
+    int           ret      = DAVS2_DEFAULT;
+
+    ret = davs2_decoder_flush(cad->decoder, &cad->headerset, &cad->out_frame);
+    if (ret == DAVS2_ERROR) {
+        av_log(avctx, AV_LOG_ERROR, "Decoder error: can't flush delayed frame\n");
+        return AVERROR_EXTERNAL;
+    }
+    if (ret == DAVS2_GOT_FRAME) {
+        ret = davs2_dump_frames(avctx, &cad->out_frame, got_frame, &cad->headerset, ret, frame);
+        davs2_decoder_frame_unref(cad->decoder, &cad->out_frame);
+    }
+    return ret;
 }
 
 static av_cold int davs2_end(AVCodecContext *avctx)
@@ -128,8 +183,9 @@
     AVFrame      *frame    = data;
     int           ret      = DAVS2_DEFAULT;
 
+    /* end of stream, output what is still in the buffers */
     if (!buf_size) {
-        return 0;
+        return send_delayed_frame(avctx, frame, got_frame);
     }
 
     cad->packet.data = buf_ptr;
@@ -148,11 +204,11 @@
     ret = davs2_decoder_recv_frame(cad->decoder, &cad->headerset, &cad->out_frame);
 
     if (ret != DAVS2_DEFAULT) {
-        *got_frame = davs2_dump_frames(avctx, &cad->out_frame, &cad->headerset, ret, frame);
+        ret = davs2_dump_frames(avctx, &cad->out_frame, got_frame, &cad->headerset, ret, frame);
         davs2_decoder_frame_unref(cad->decoder, &cad->out_frame);
     }
 
-    return buf_size;
+    return ret == 0 ? buf_size : ret;
 }
 
 AVCodec ff_libdavs2_decoder = {
@@ -164,8 +220,9 @@
     .init           = davs2_init,
     .close          = davs2_end,
     .decode         = davs2_decode_frame,
-    .capabilities   =  AV_CODEC_CAP_DELAY,//AV_CODEC_CAP_DR1 |
-    .pix_fmts       = (const enum AVPixelFormat[]) { AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUV420P10,
+    .flush          = davs2_flush,
+    .capabilities   =  AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AUTO_THREADS,
+    .pix_fmts       = (const enum AVPixelFormat[]) { AV_PIX_FMT_YUV420P,
                                                      AV_PIX_FMT_NONE },
     .wrapper_name   = "libdavs2",
 };
diff --git a/libavcodec/libfdk-aacdec.c b/libavcodec/libfdk-aacdec.c
index 1abe1d8..1a86dff 100644
--- a/libavcodec/libfdk-aacdec.c
+++ b/libavcodec/libfdk-aacdec.c
@@ -57,6 +57,7 @@
     int drc_effect;
     int drc_cut;
     int level_limit;
+    int output_delay;
 } FDKAACDecContext;
 
 
@@ -75,12 +76,13 @@
                      OFFSET(drc_boost),      AV_OPT_TYPE_INT,   { .i64 = -1 }, -1, 127, AD, NULL    },
     { "drc_cut",   "Dynamic Range Control: attenuation factor, where [0] is none and [127] is max compression",
                      OFFSET(drc_cut),        AV_OPT_TYPE_INT,   { .i64 = -1 }, -1, 127, AD, NULL    },
-    { "drc_level", "Dynamic Range Control: reference level, quantized to 0.25dB steps where [0] is 0dB and [127] is -31.75dB",
-                     OFFSET(drc_level),      AV_OPT_TYPE_INT,   { .i64 = -1},  -1, 127, AD, NULL    },
+    { "drc_level", "Dynamic Range Control: reference level, quantized to 0.25dB steps where [0] is 0dB and [127] is -31.75dB, -1 for auto, and -2 for disabled",
+                     OFFSET(drc_level),      AV_OPT_TYPE_INT,   { .i64 = -1},  -2, 127, AD, NULL    },
     { "drc_heavy", "Dynamic Range Control: heavy compression, where [1] is on (RF mode) and [0] is off",
                      OFFSET(drc_heavy),      AV_OPT_TYPE_INT,   { .i64 = -1},  -1, 1,   AD, NULL    },
 #if FDKDEC_VER_AT_LEAST(2, 5) // 2.5.10
-    { "level_limit", "Signal level limiting", OFFSET(level_limit), AV_OPT_TYPE_INT, { .i64 = 0 }, -1, 1, AD },
+    { "level_limit", "Signal level limiting",
+                     OFFSET(level_limit),    AV_OPT_TYPE_BOOL,  { .i64 = -1 }, -1, 1, AD },
 #endif
 #if FDKDEC_VER_AT_LEAST(3, 0) // 3.0.0
     { "drc_effect","Dynamic Range Control: effect type, where e.g. [0] is none and [6] is general",
@@ -115,6 +117,9 @@
     }
     avctx->sample_rate = info->sampleRate;
     avctx->frame_size  = info->frameSize;
+#if FDKDEC_VER_AT_LEAST(2, 5) // 2.5.10
+    s->output_delay    = info->outputDelay;
+#endif
 
     for (i = 0; i < info->numChannels; i++) {
         AUDIO_CHANNEL_TYPE ctype = info->pChannelType[i];
@@ -294,6 +299,12 @@
     }
 
     if (s->drc_level != -1) {
+        // This option defaults to -1, i.e. not calling
+        // aacDecoder_SetParam(AAC_DRC_REFERENCE_LEVEL) at all, which defaults
+        // to the level from DRC metadata, if available. The user can set
+        // -drc_level -2, which calls aacDecoder_SetParam(
+        // AAC_DRC_REFERENCE_LEVEL) with a negative value, which then
+        // explicitly disables the feature.
         if (aacDecoder_SetParam(s->handle, AAC_DRC_REFERENCE_LEVEL, s->drc_level) != AAC_DEC_OK) {
             av_log(avctx, AV_LOG_ERROR, "Unable to set DRC reference level in the decoder\n");
             return AVERROR_UNKNOWN;
@@ -308,6 +319,7 @@
     }
 
 #if FDKDEC_VER_AT_LEAST(2, 5) // 2.5.10
+    // Setting this parameter to -1 enables the auto behaviour in the library.
     if (aacDecoder_SetParam(s->handle, AAC_PCM_LIMITER_ENABLE, s->level_limit) != AAC_DEC_OK) {
         av_log(avctx, AV_LOG_ERROR, "Unable to set in signal level limiting in the decoder\n");
         return AVERROR_UNKNOWN;
@@ -367,6 +379,11 @@
     if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
         goto end;
 
+    if (frame->pts != AV_NOPTS_VALUE)
+        frame->pts -= av_rescale_q(s->output_delay,
+                                   (AVRational){1, avctx->sample_rate},
+                                   avctx->time_base);
+
     memcpy(frame->extended_data[0], s->decoder_buffer,
            avctx->channels * avctx->frame_size *
            av_get_bytes_per_sample(avctx->sample_fmt));
diff --git a/libavcodec/libgsmenc.c b/libavcodec/libgsmenc.c
index c9e7ba0..fdb11c7 100644
--- a/libavcodec/libgsmenc.c
+++ b/libavcodec/libgsmenc.c
@@ -114,6 +114,10 @@
     return 0;
 }
 
+static const AVCodecDefault libgsm_defaults[] = {
+    { "b",                "13000" },
+    { NULL },
+};
 
 #if CONFIG_LIBGSM_ENCODER
 AVCodec ff_libgsm_encoder = {
@@ -124,6 +128,8 @@
     .init           = libgsm_encode_init,
     .encode2        = libgsm_encode_frame,
     .close          = libgsm_encode_close,
+    .defaults       = libgsm_defaults,
+    .channel_layouts= (const uint64_t[]) { AV_CH_LAYOUT_MONO, 0 },
     .sample_fmts    = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_S16,
                                                      AV_SAMPLE_FMT_NONE },
     .wrapper_name   = "libgsm",
@@ -138,6 +144,8 @@
     .init           = libgsm_encode_init,
     .encode2        = libgsm_encode_frame,
     .close          = libgsm_encode_close,
+    .defaults       = libgsm_defaults,
+    .channel_layouts= (const uint64_t[]) { AV_CH_LAYOUT_MONO, 0 },
     .sample_fmts    = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_S16,
                                                      AV_SAMPLE_FMT_NONE },
     .wrapper_name   = "libgsm",
diff --git a/libavcodec/libkvazaar.c b/libavcodec/libkvazaar.c
index 5bc5b4e..02bcae3 100644
--- a/libavcodec/libkvazaar.c
+++ b/libavcodec/libkvazaar.c
@@ -79,13 +79,23 @@
     cfg->width  = avctx->width;
     cfg->height = avctx->height;
 
-    if (avctx->ticks_per_frame > INT_MAX / avctx->time_base.num) {
-        av_log(avctx, AV_LOG_ERROR,
-               "Could not set framerate for kvazaar: integer overflow\n");
-        return AVERROR(EINVAL);
+    if (avctx->framerate.num > 0 && avctx->framerate.den > 0) {
+        if (avctx->ticks_per_frame > INT_MAX / avctx->framerate.den) {
+            av_log(avctx, AV_LOG_ERROR,
+                   "Could not set framerate for kvazaar: integer overflow\n");
+            return AVERROR(EINVAL);
+        }
+        cfg->framerate_num   = avctx->framerate.num;
+        cfg->framerate_denom = avctx->time_base.den * avctx->ticks_per_frame;
+    } else {
+        if (avctx->ticks_per_frame > INT_MAX / avctx->time_base.num) {
+            av_log(avctx, AV_LOG_ERROR,
+                   "Could not set framerate for kvazaar: integer overflow\n");
+            return AVERROR(EINVAL);
+        }
+        cfg->framerate_num   = avctx->time_base.den;
+        cfg->framerate_denom = avctx->time_base.num * avctx->ticks_per_frame;
     }
-    cfg->framerate_num   = avctx->time_base.den;
-    cfg->framerate_denom = avctx->time_base.num * avctx->ticks_per_frame;
     cfg->target_bitrate = avctx->bit_rate;
     cfg->vui.sar_width  = avctx->sample_aspect_ratio.num;
     cfg->vui.sar_height = avctx->sample_aspect_ratio.den;
@@ -100,8 +110,8 @@
                            entry->key, entry->value);
                 }
             }
-            av_dict_free(&dict);
         }
+        av_dict_free(&dict);
     }
 
     ctx->encoder = enc = api->encoder_open(cfg);
@@ -143,8 +153,8 @@
     LibkvazaarContext *ctx = avctx->priv_data;
 
     if (ctx->api) {
-      ctx->api->encoder_close(ctx->encoder);
-      ctx->api->config_destroy(ctx->config);
+        ctx->api->encoder_close(ctx->encoder);
+        ctx->api->config_destroy(ctx->config);
     }
 
     if (avctx->extradata)
@@ -170,7 +180,7 @@
 
     if (frame) {
         if (frame->width != ctx->config->width ||
-                frame->height != ctx->config->height) {
+            frame->height != ctx->config->height) {
             av_log(avctx, AV_LOG_ERROR,
                    "Changing video dimensions during encoding is not supported. "
                    "(changed from %dx%d to %dx%d)\n",
@@ -223,8 +233,7 @@
         av_log(avctx, AV_LOG_ERROR, "Failed to encode frame.\n");
         retval = AVERROR_INVALIDDATA;
         goto done;
-    }
-    else
+    } else
         retval = 0; /* kvazaar returns 1 on success */
 
     if (data_out) {
@@ -249,7 +258,7 @@
         // IRAP VCL NAL unit types span the range
         // [BLA_W_LP (16), RSV_IRAP_VCL23 (23)].
         if (frame_info.nal_unit_type >= KVZ_NAL_BLA_W_LP &&
-                frame_info.nal_unit_type <= KVZ_NAL_RSV_IRAP_VCL23) {
+            frame_info.nal_unit_type <= KVZ_NAL_RSV_IRAP_VCL23) {
             avpkt->flags |= AV_PKT_FLAG_KEY;
         }
 
@@ -293,7 +302,7 @@
     .long_name        = NULL_IF_CONFIG_SMALL("libkvazaar H.265 / HEVC"),
     .type             = AVMEDIA_TYPE_VIDEO,
     .id               = AV_CODEC_ID_HEVC,
-    .capabilities     = AV_CODEC_CAP_DELAY,
+    .capabilities     = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AUTO_THREADS,
     .pix_fmts         = pix_fmts,
 
     .priv_class       = &class,
diff --git a/libavcodec/libopencore-amr.c b/libavcodec/libopencore-amr.c
index 516f625..614b3a2 100644
--- a/libavcodec/libopencore-amr.c
+++ b/libavcodec/libopencore-amr.c
@@ -29,6 +29,7 @@
 #include "audio_frame_queue.h"
 #include "internal.h"
 
+#if CONFIG_LIBOPENCORE_AMRNB_DECODER || CONFIG_LIBOPENCORE_AMRWB_DECODER
 static int amr_decode_fix_avctx(AVCodecContext *avctx)
 {
     const int is_amr_wb = 1 + (avctx->codec_id == AV_CODEC_ID_AMR_WB);
@@ -46,6 +47,7 @@
     avctx->sample_fmt     = AV_SAMPLE_FMT_S16;
     return 0;
 }
+#endif
 
 #if CONFIG_LIBOPENCORE_AMRNB
 
diff --git a/libavcodec/libopenh264dec.c b/libavcodec/libopenh264dec.c
index f9b91ce..c7aa7fa 100644
--- a/libavcodec/libopenh264dec.c
+++ b/libavcodec/libopenh264dec.c
@@ -109,10 +109,18 @@
 #endif
     } else {
         info.uiInBsTimeStamp = avpkt->pts;
+#if OPENH264_VER_AT_LEAST(1, 4)
+        // Contrary to the name, DecodeFrameNoDelay actually does buffering
+        // and reordering of frames, and is the recommended decoding entry
+        // point since 1.4. This is essential for successfully decoding
+        // B-frames.
+        state = (*s->decoder)->DecodeFrameNoDelay(s->decoder, avpkt->data, avpkt->size, ptrs, &info);
+#else
         state = (*s->decoder)->DecodeFrame2(s->decoder, avpkt->data, avpkt->size, ptrs, &info);
+#endif
     }
     if (state != dsErrorFree) {
-        av_log(avctx, AV_LOG_ERROR, "DecodeFrame2 failed\n");
+        av_log(avctx, AV_LOG_ERROR, "DecodeFrame failed\n");
         return AVERROR_UNKNOWN;
     }
     if (info.iBufferStatus != 1) {
diff --git a/libavcodec/libopenh264enc.c b/libavcodec/libopenh264enc.c
index 83c3f0c..dd5d4ee 100644
--- a/libavcodec/libopenh264enc.c
+++ b/libavcodec/libopenh264enc.c
@@ -75,7 +75,7 @@
 };
 
 static const AVClass class = {
-    .class_name = "libvo_amrwbenc",
+    .class_name = "libopenh264enc",
     .item_name  = av_default_item_name,
     .option     = options,
     .version    = LIBAVUTIL_VERSION_INT,
@@ -164,6 +164,46 @@
     param.sSpatialLayers[0].iSpatialBitrate     = param.iTargetBitrate;
     param.sSpatialLayers[0].iMaxSpatialBitrate  = param.iMaxBitrate;
 
+#if OPENH264_VER_AT_LEAST(1, 7)
+    if (avctx->sample_aspect_ratio.num && avctx->sample_aspect_ratio.den) {
+        // Table E-1.
+        static const AVRational sar_idc[] = {
+            {   0,  0 }, // Unspecified (never written here).
+            {   1,  1 }, {  12, 11 }, {  10, 11 }, {  16, 11 },
+            {  40, 33 }, {  24, 11 }, {  20, 11 }, {  32, 11 },
+            {  80, 33 }, {  18, 11 }, {  15, 11 }, {  64, 33 },
+            { 160, 99 }, // Last 3 are unknown to openh264: {   4,  3 }, {   3,  2 }, {   2,  1 },
+        };
+        static const ESampleAspectRatio asp_idc[] = {
+            ASP_UNSPECIFIED,
+            ASP_1x1,      ASP_12x11,   ASP_10x11,   ASP_16x11,
+            ASP_40x33,    ASP_24x11,   ASP_20x11,   ASP_32x11,
+            ASP_80x33,    ASP_18x11,   ASP_15x11,   ASP_64x33,
+            ASP_160x99,
+        };
+        int num, den, i;
+
+        av_reduce(&num, &den, avctx->sample_aspect_ratio.num,
+                  avctx->sample_aspect_ratio.den, 65535);
+
+        for (i = 1; i < FF_ARRAY_ELEMS(sar_idc); i++) {
+            if (num == sar_idc[i].num &&
+                den == sar_idc[i].den)
+                break;
+        }
+        if (i == FF_ARRAY_ELEMS(sar_idc)) {
+            param.sSpatialLayers[0].eAspectRatio = ASP_EXT_SAR;
+            param.sSpatialLayers[0].sAspectRatioExtWidth = num;
+            param.sSpatialLayers[0].sAspectRatioExtHeight = den;
+        } else {
+            param.sSpatialLayers[0].eAspectRatio = asp_idc[i];
+        }
+        param.sSpatialLayers[0].bAspectRatioPresent = true;
+    } else {
+        param.sSpatialLayers[0].bAspectRatioPresent = false;
+    }
+#endif
+
     if ((avctx->slices > 1) && (s->max_nal_size)) {
         av_log(avctx, AV_LOG_ERROR,
                "Invalid combination -slices %d and -max_nal_size %d.\n",
@@ -186,7 +226,7 @@
 #endif
 
     if (s->slice_mode == SM_SIZELIMITED_SLICE) {
-        if (s->max_nal_size){
+        if (s->max_nal_size) {
             param.uiMaxNalSize = s->max_nal_size;
 #if OPENH264_VER_AT_LEAST(1, 6)
             param.sSpatialLayers[0].sSliceArgument.uiSliceSizeConstraint = s->max_nal_size;
diff --git a/libavcodec/libopusdec.c b/libavcodec/libopusdec.c
index 2a97811..1724a49 100644
--- a/libavcodec/libopusdec.c
+++ b/libavcodec/libopusdec.c
@@ -63,6 +63,8 @@
     avc->sample_rate    = 48000;
     avc->sample_fmt     = avc->request_sample_fmt == AV_SAMPLE_FMT_FLT ?
                           AV_SAMPLE_FMT_FLT : AV_SAMPLE_FMT_S16;
+    avc->channel_layout = avc->channels > 8 ? 0 :
+                          ff_vorbis_channel_layouts[avc->channels - 1];
 
     if (avc->extradata_size >= OPUS_HEAD_SIZE) {
         opus->pre_skip = AV_RL16(avc->extradata + 10);
@@ -86,35 +88,14 @@
         mapping    = mapping_arr;
     }
 
-    if (channel_map == 1) {
-        avc->channel_layout = avc->channels > 8 ? 0 :
-                              ff_vorbis_channel_layouts[avc->channels - 1];
-        if (avc->channels > 2 && avc->channels <= 8) {
-            const uint8_t *vorbis_offset = ff_vorbis_channel_layout_offsets[avc->channels - 1];
-            int ch;
+    if (avc->channels > 2 && avc->channels <= 8) {
+        const uint8_t *vorbis_offset = ff_vorbis_channel_layout_offsets[avc->channels - 1];
+        int ch;
 
-            /* Remap channels from Vorbis order to ffmpeg order */
-            for (ch = 0; ch < avc->channels; ch++)
-                mapping_arr[ch] = mapping[vorbis_offset[ch]];
-            mapping = mapping_arr;
-        }
-    } else if (channel_map == 2) {
-        int ambisonic_order = ff_sqrt(avc->channels) - 1;
-        if (avc->channels != (ambisonic_order + 1) * (ambisonic_order + 1) &&
-            avc->channels != (ambisonic_order + 1) * (ambisonic_order + 1) + 2) {
-            av_log(avc, AV_LOG_ERROR,
-                   "Channel mapping 2 is only specified for channel counts"
-                   " which can be written as (n + 1)^2 or (n + 2)^2 + 2"
-                   " for nonnegative integer n\n");
-            return AVERROR_INVALIDDATA;
-        }
-        if (avc->channels > 227) {
-            av_log(avc, AV_LOG_ERROR, "Too many channels\n");
-            return AVERROR_INVALIDDATA;
-        }
-        avc->channel_layout = 0;
-    } else {
-        avc->channel_layout = 0;
+        /* Remap channels from Vorbis order to ffmpeg order */
+        for (ch = 0; ch < avc->channels; ch++)
+            mapping_arr[ch] = mapping[vorbis_offset[ch]];
+        mapping = mapping_arr;
     }
 
     opus->dec = opus_multistream_decoder_create(avc->sample_rate, avc->channels,
diff --git a/libavcodec/librav1e.c b/libavcodec/librav1e.c
new file mode 100644
index 0000000..b8b1b4f
--- /dev/null
+++ b/libavcodec/librav1e.c
@@ -0,0 +1,588 @@
+/*
+ * librav1e encoder
+ *
+ * Copyright (c) 2019 Derek Buitenhuis
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include <rav1e.h>
+
+#include "libavutil/internal.h"
+#include "libavutil/avassert.h"
+#include "libavutil/base64.h"
+#include "libavutil/common.h"
+#include "libavutil/mathematics.h"
+#include "libavutil/opt.h"
+#include "libavutil/pixdesc.h"
+#include "avcodec.h"
+#include "internal.h"
+
+typedef struct librav1eContext {
+    const AVClass *class;
+
+    RaContext *ctx;
+    AVBSFContext *bsf;
+
+    uint8_t *pass_data;
+    size_t pass_pos;
+    int pass_size;
+
+    AVDictionary *rav1e_opts;
+    int quantizer;
+    int speed;
+    int tiles;
+    int tile_rows;
+    int tile_cols;
+} librav1eContext;
+
+static inline RaPixelRange range_map(enum AVPixelFormat pix_fmt, enum AVColorRange range)
+{
+    switch (pix_fmt) {
+    case AV_PIX_FMT_YUVJ420P:
+    case AV_PIX_FMT_YUVJ422P:
+    case AV_PIX_FMT_YUVJ444P:
+        return RA_PIXEL_RANGE_FULL;
+    }
+
+    switch (range) {
+    case AVCOL_RANGE_JPEG:
+        return RA_PIXEL_RANGE_FULL;
+    case AVCOL_RANGE_MPEG:
+    default:
+        return RA_PIXEL_RANGE_LIMITED;
+    }
+}
+
+static inline RaChromaSampling pix_fmt_map(enum AVPixelFormat pix_fmt)
+{
+    switch (pix_fmt) {
+    case AV_PIX_FMT_YUV420P:
+    case AV_PIX_FMT_YUVJ420P:
+    case AV_PIX_FMT_YUV420P10:
+    case AV_PIX_FMT_YUV420P12:
+        return RA_CHROMA_SAMPLING_CS420;
+    case AV_PIX_FMT_YUV422P:
+    case AV_PIX_FMT_YUVJ422P:
+    case AV_PIX_FMT_YUV422P10:
+    case AV_PIX_FMT_YUV422P12:
+        return RA_CHROMA_SAMPLING_CS422;
+    case AV_PIX_FMT_YUV444P:
+    case AV_PIX_FMT_YUVJ444P:
+    case AV_PIX_FMT_YUV444P10:
+    case AV_PIX_FMT_YUV444P12:
+        return RA_CHROMA_SAMPLING_CS444;
+    default:
+        av_assert0(0);
+    }
+}
+
+static inline RaChromaSamplePosition chroma_loc_map(enum AVChromaLocation chroma_loc)
+{
+    switch (chroma_loc) {
+    case AVCHROMA_LOC_LEFT:
+        return RA_CHROMA_SAMPLE_POSITION_VERTICAL;
+    case AVCHROMA_LOC_TOPLEFT:
+        return RA_CHROMA_SAMPLE_POSITION_COLOCATED;
+    default:
+        return RA_CHROMA_SAMPLE_POSITION_UNKNOWN;
+    }
+}
+
+static int get_stats(AVCodecContext *avctx, int eos)
+{
+    librav1eContext *ctx = avctx->priv_data;
+    RaData* buf = rav1e_twopass_out(ctx->ctx);
+    if (!buf)
+        return 0;
+
+    if (!eos) {
+        uint8_t *tmp = av_fast_realloc(ctx->pass_data, &ctx->pass_size,
+                                      ctx->pass_pos + buf->len);
+        if (!tmp) {
+            rav1e_data_unref(buf);
+            return AVERROR(ENOMEM);
+        }
+
+        ctx->pass_data = tmp;
+        memcpy(ctx->pass_data + ctx->pass_pos, buf->data, buf->len);
+        ctx->pass_pos += buf->len;
+    } else {
+        size_t b64_size = AV_BASE64_SIZE(ctx->pass_pos);
+
+        memcpy(ctx->pass_data, buf->data, buf->len);
+
+        avctx->stats_out = av_malloc(b64_size);
+        if (!avctx->stats_out) {
+            rav1e_data_unref(buf);
+            return AVERROR(ENOMEM);
+        }
+
+        av_base64_encode(avctx->stats_out, b64_size, ctx->pass_data, ctx->pass_pos);
+
+        av_freep(&ctx->pass_data);
+    }
+
+    rav1e_data_unref(buf);
+
+    return 0;
+}
+
+static int set_stats(AVCodecContext *avctx)
+{
+    librav1eContext *ctx = avctx->priv_data;
+    int ret = 1;
+
+    while (ret > 0 && ctx->pass_size - ctx->pass_pos > 0) {
+        ret = rav1e_twopass_in(ctx->ctx, ctx->pass_data + ctx->pass_pos, ctx->pass_size);
+        if (ret < 0)
+            return AVERROR_EXTERNAL;
+        ctx->pass_pos += ret;
+    }
+
+    return 0;
+}
+
+static av_cold int librav1e_encode_close(AVCodecContext *avctx)
+{
+    librav1eContext *ctx = avctx->priv_data;
+
+    if (ctx->ctx) {
+        rav1e_context_unref(ctx->ctx);
+        ctx->ctx = NULL;
+    }
+
+    av_bsf_free(&ctx->bsf);
+    av_freep(&ctx->pass_data);
+
+    return 0;
+}
+
+static av_cold int librav1e_encode_init(AVCodecContext *avctx)
+{
+    librav1eContext *ctx = avctx->priv_data;
+    const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(avctx->pix_fmt);
+    RaConfig *cfg = NULL;
+    int rret;
+    int ret = 0;
+
+    cfg = rav1e_config_default();
+    if (!cfg) {
+        av_log(avctx, AV_LOG_ERROR, "Could not allocate rav1e config.\n");
+        return AVERROR_EXTERNAL;
+    }
+
+    rav1e_config_set_time_base(cfg, (RaRational) {
+                               avctx->time_base.num * avctx->ticks_per_frame,
+                               avctx->time_base.den
+                               });
+
+    if (avctx->flags & AV_CODEC_FLAG_PASS2) {
+        if (!avctx->stats_in) {
+            av_log(avctx, AV_LOG_ERROR, "No stats file provided for second pass.\n");
+            ret = AVERROR(EINVAL);
+            goto end;
+        }
+
+        ctx->pass_size = (strlen(avctx->stats_in) * 3) / 4;
+        ctx->pass_data = av_malloc(ctx->pass_size);
+        if (!ctx->pass_data) {
+            av_log(avctx, AV_LOG_ERROR, "Could not allocate stats buffer.\n");
+            ret = AVERROR(ENOMEM);
+            goto end;
+        }
+
+        ctx->pass_size = av_base64_decode(ctx->pass_data, avctx->stats_in, ctx->pass_size);
+        if (ctx->pass_size < 0) {
+            av_log(avctx, AV_LOG_ERROR, "Invalid pass file.\n");
+            ret = AVERROR(EINVAL);
+            goto end;
+        }
+    }
+
+    if (avctx->flags & AV_CODEC_FLAG_GLOBAL_HEADER) {
+         const AVBitStreamFilter *filter = av_bsf_get_by_name("extract_extradata");
+         int bret;
+
+         if (!filter) {
+            av_log(avctx, AV_LOG_ERROR, "extract_extradata bitstream filter "
+                   "not found. This is a bug, please report it.\n");
+            ret = AVERROR_BUG;
+            goto end;
+         }
+
+         bret = av_bsf_alloc(filter, &ctx->bsf);
+         if (bret < 0) {
+             ret = bret;
+             goto end;
+         }
+
+         bret = avcodec_parameters_from_context(ctx->bsf->par_in, avctx);
+         if (bret < 0) {
+             ret = bret;
+             goto end;
+         }
+
+         bret = av_bsf_init(ctx->bsf);
+         if (bret < 0) {
+             ret = bret;
+             goto end;
+         }
+    }
+
+    {
+        AVDictionaryEntry *en = NULL;
+        while ((en = av_dict_get(ctx->rav1e_opts, "", en, AV_DICT_IGNORE_SUFFIX))) {
+            int parse_ret = rav1e_config_parse(cfg, en->key, en->value);
+            if (parse_ret < 0)
+                av_log(avctx, AV_LOG_WARNING, "Invalid value for %s: %s.\n", en->key, en->value);
+        }
+    }
+
+    rret = rav1e_config_parse_int(cfg, "width", avctx->width);
+    if (rret < 0) {
+        av_log(avctx, AV_LOG_ERROR, "Invalid width passed to rav1e.\n");
+        ret = AVERROR_INVALIDDATA;
+        goto end;
+    }
+
+    rret = rav1e_config_parse_int(cfg, "height", avctx->height);
+    if (rret < 0) {
+        av_log(avctx, AV_LOG_ERROR, "Invalid height passed to rav1e.\n");
+        ret = AVERROR_INVALIDDATA;
+        goto end;
+    }
+
+    rret = rav1e_config_parse_int(cfg, "threads", avctx->thread_count);
+    if (rret < 0)
+        av_log(avctx, AV_LOG_WARNING, "Invalid number of threads, defaulting to auto.\n");
+
+    if (ctx->speed >= 0) {
+        rret = rav1e_config_parse_int(cfg, "speed", ctx->speed);
+        if (rret < 0) {
+            av_log(avctx, AV_LOG_ERROR, "Could not set speed preset.\n");
+            ret = AVERROR_EXTERNAL;
+            goto end;
+        }
+    }
+
+    /* rav1e handles precedence between 'tiles' and cols/rows for us. */
+    if (ctx->tiles > 0) {
+        rret = rav1e_config_parse_int(cfg, "tiles", ctx->tiles);
+        if (rret < 0) {
+            av_log(avctx, AV_LOG_ERROR, "Could not set number of tiles to encode with.\n");
+            ret = AVERROR_EXTERNAL;
+            goto end;
+        }
+    }
+    if (ctx->tile_rows > 0) {
+        rret = rav1e_config_parse_int(cfg, "tile_rows", ctx->tile_rows);
+        if (rret < 0) {
+            av_log(avctx, AV_LOG_ERROR, "Could not set number of tile rows to encode with.\n");
+            ret = AVERROR_EXTERNAL;
+            goto end;
+        }
+    }
+    if (ctx->tile_cols > 0) {
+        rret = rav1e_config_parse_int(cfg, "tile_cols", ctx->tile_cols);
+        if (rret < 0) {
+            av_log(avctx, AV_LOG_ERROR, "Could not set number of tile cols to encode with.\n");
+            ret = AVERROR_EXTERNAL;
+            goto end;
+        }
+    }
+
+    if (avctx->gop_size > 0) {
+        rret = rav1e_config_parse_int(cfg, "key_frame_interval", avctx->gop_size);
+        if (rret < 0) {
+            av_log(avctx, AV_LOG_ERROR, "Could not set max keyint.\n");
+            ret = AVERROR_EXTERNAL;
+            goto end;
+        }
+    }
+
+    if (avctx->keyint_min > 0) {
+        rret = rav1e_config_parse_int(cfg, "min_key_frame_interval", avctx->keyint_min);
+        if (rret < 0) {
+            av_log(avctx, AV_LOG_ERROR, "Could not set min keyint.\n");
+            ret = AVERROR_EXTERNAL;
+            goto end;
+        }
+    }
+
+    if (avctx->bit_rate && ctx->quantizer < 0) {
+        int max_quantizer = avctx->qmax >= 0 ? avctx->qmax : 255;
+
+        rret = rav1e_config_parse_int(cfg, "quantizer", max_quantizer);
+        if (rret < 0) {
+            av_log(avctx, AV_LOG_ERROR, "Could not set max quantizer.\n");
+            ret = AVERROR_EXTERNAL;
+            goto end;
+        }
+
+        if (avctx->qmin >= 0) {
+            rret = rav1e_config_parse_int(cfg, "min_quantizer", avctx->qmin);
+            if (rret < 0) {
+                av_log(avctx, AV_LOG_ERROR, "Could not set min quantizer.\n");
+                ret = AVERROR_EXTERNAL;
+                goto end;
+            }
+        }
+
+        rret = rav1e_config_parse_int(cfg, "bitrate", avctx->bit_rate);
+        if (rret < 0) {
+            av_log(avctx, AV_LOG_ERROR, "Could not set bitrate.\n");
+            ret = AVERROR_INVALIDDATA;
+            goto end;
+        }
+    } else if (ctx->quantizer >= 0) {
+        if (avctx->bit_rate)
+            av_log(avctx, AV_LOG_WARNING, "Both bitrate and quantizer specified. Using quantizer mode.");
+
+        rret = rav1e_config_parse_int(cfg, "quantizer", ctx->quantizer);
+        if (rret < 0) {
+            av_log(avctx, AV_LOG_ERROR, "Could not set quantizer.\n");
+            ret = AVERROR_EXTERNAL;
+            goto end;
+        }
+    }
+
+    rret = rav1e_config_set_pixel_format(cfg, desc->comp[0].depth,
+                                         pix_fmt_map(avctx->pix_fmt),
+                                         chroma_loc_map(avctx->chroma_sample_location),
+                                         range_map(avctx->pix_fmt, avctx->color_range));
+    if (rret < 0) {
+        av_log(avctx, AV_LOG_ERROR, "Failed to set pixel format properties.\n");
+        ret = AVERROR_INVALIDDATA;
+        goto end;
+    }
+
+    /* rav1e's colorspace enums match standard values. */
+    rret = rav1e_config_set_color_description(cfg, (RaMatrixCoefficients) avctx->colorspace,
+                                              (RaColorPrimaries) avctx->color_primaries,
+                                              (RaTransferCharacteristics) avctx->color_trc);
+    if (rret < 0) {
+        av_log(avctx, AV_LOG_WARNING, "Failed to set color properties.\n");
+        if (avctx->err_recognition & AV_EF_EXPLODE) {
+            ret = AVERROR_INVALIDDATA;
+            goto end;
+        }
+    }
+
+    ctx->ctx = rav1e_context_new(cfg);
+    if (!ctx->ctx) {
+        av_log(avctx, AV_LOG_ERROR, "Failed to create rav1e encode context.\n");
+        ret = AVERROR_EXTERNAL;
+        goto end;
+    }
+
+    ret = 0;
+
+end:
+
+    rav1e_config_unref(cfg);
+
+    return ret;
+}
+
+static int librav1e_send_frame(AVCodecContext *avctx, const AVFrame *frame)
+{
+    librav1eContext *ctx = avctx->priv_data;
+    RaFrame *rframe = NULL;
+    int ret;
+
+    if (frame) {
+        const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(frame->format);
+
+        rframe = rav1e_frame_new(ctx->ctx);
+        if (!rframe) {
+            av_log(avctx, AV_LOG_ERROR, "Could not allocate new rav1e frame.\n");
+            return AVERROR(ENOMEM);
+        }
+
+        for (int i = 0; i < desc->nb_components; i++) {
+            int shift = i ? desc->log2_chroma_h : 0;
+            int bytes = desc->comp[0].depth == 8 ? 1 : 2;
+            rav1e_frame_fill_plane(rframe, i, frame->data[i],
+                                   (frame->height >> shift) * frame->linesize[i],
+                                   frame->linesize[i], bytes);
+        }
+    }
+
+    ret = rav1e_send_frame(ctx->ctx, rframe);
+    if (rframe)
+         rav1e_frame_unref(rframe); /* No need to unref if flushing. */
+
+    switch (ret) {
+    case RA_ENCODER_STATUS_SUCCESS:
+        break;
+    case RA_ENCODER_STATUS_ENOUGH_DATA:
+        return AVERROR(EAGAIN);
+    case RA_ENCODER_STATUS_FAILURE:
+        av_log(avctx, AV_LOG_ERROR, "Could not send frame: %s\n", rav1e_status_to_str(ret));
+        return AVERROR_EXTERNAL;
+    default:
+        av_log(avctx, AV_LOG_ERROR, "Unknown return code %d from rav1e_send_frame: %s\n", ret, rav1e_status_to_str(ret));
+        return AVERROR_UNKNOWN;
+    }
+
+    return 0;
+}
+
+static int librav1e_receive_packet(AVCodecContext *avctx, AVPacket *pkt)
+{
+    librav1eContext *ctx = avctx->priv_data;
+    RaPacket *rpkt = NULL;
+    int ret;
+
+retry:
+
+    if (avctx->flags & AV_CODEC_FLAG_PASS1) {
+        int sret = get_stats(avctx, 0);
+        if (sret < 0)
+            return sret;
+    } else if (avctx->flags & AV_CODEC_FLAG_PASS2) {
+        int sret = set_stats(avctx);
+        if (sret < 0)
+            return sret;
+    }
+
+    ret = rav1e_receive_packet(ctx->ctx, &rpkt);
+    switch (ret) {
+    case RA_ENCODER_STATUS_SUCCESS:
+        break;
+    case RA_ENCODER_STATUS_LIMIT_REACHED:
+        if (avctx->flags & AV_CODEC_FLAG_PASS1) {
+            int sret = get_stats(avctx, 1);
+            if (sret < 0)
+                return sret;
+        }
+        return AVERROR_EOF;
+    case RA_ENCODER_STATUS_ENCODED:
+        if (avctx->internal->draining)
+            goto retry;
+        return AVERROR(EAGAIN);
+    case RA_ENCODER_STATUS_NEED_MORE_DATA:
+        if (avctx->internal->draining) {
+            av_log(avctx, AV_LOG_ERROR, "Unexpected error when receiving packet after EOF.\n");
+            return AVERROR_EXTERNAL;
+        }
+        return AVERROR(EAGAIN);
+    case RA_ENCODER_STATUS_FAILURE:
+        av_log(avctx, AV_LOG_ERROR, "Could not encode frame: %s\n", rav1e_status_to_str(ret));
+        return AVERROR_EXTERNAL;
+    default:
+        av_log(avctx, AV_LOG_ERROR, "Unknown return code %d from rav1e_receive_packet: %s\n", ret, rav1e_status_to_str(ret));
+        return AVERROR_UNKNOWN;
+    }
+
+    ret = av_new_packet(pkt, rpkt->len);
+    if (ret < 0) {
+        av_log(avctx, AV_LOG_ERROR, "Could not allocate packet.\n");
+        rav1e_packet_unref(rpkt);
+        return ret;
+    }
+
+    memcpy(pkt->data, rpkt->data, rpkt->len);
+
+    if (rpkt->frame_type == RA_FRAME_TYPE_KEY)
+        pkt->flags |= AV_PKT_FLAG_KEY;
+
+    pkt->pts = pkt->dts = rpkt->input_frameno * avctx->ticks_per_frame;
+    rav1e_packet_unref(rpkt);
+
+    if (avctx->flags & AV_CODEC_FLAG_GLOBAL_HEADER) {
+        int ret = av_bsf_send_packet(ctx->bsf, pkt);
+        if (ret < 0) {
+            av_log(avctx, AV_LOG_ERROR, "extradata extraction send failed.\n");
+            av_packet_unref(pkt);
+            return ret;
+        }
+
+        ret = av_bsf_receive_packet(ctx->bsf, pkt);
+        if (ret < 0) {
+            av_log(avctx, AV_LOG_ERROR, "extradata extraction receive failed.\n");
+            av_packet_unref(pkt);
+            return ret;
+        }
+    }
+
+    return 0;
+}
+
+#define OFFSET(x) offsetof(librav1eContext, x)
+#define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
+
+static const AVOption options[] = {
+    { "qp", "use constant quantizer mode", OFFSET(quantizer), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 255, VE },
+    { "speed", "what speed preset to use", OFFSET(speed), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 10, VE },
+    { "tiles", "number of tiles encode with", OFFSET(tiles), AV_OPT_TYPE_INT, { .i64 = 0 }, -1, INT64_MAX, VE },
+    { "tile-rows", "number of tiles rows to encode with", OFFSET(tile_rows), AV_OPT_TYPE_INT, { .i64 = 0 }, -1, INT64_MAX, VE },
+    { "tile-columns", "number of tiles columns to encode with", OFFSET(tile_cols), AV_OPT_TYPE_INT, { .i64 = 0 }, -1, INT64_MAX, VE },
+    { "rav1e-params", "set the rav1e configuration using a :-separated list of key=value parameters", OFFSET(rav1e_opts), AV_OPT_TYPE_DICT, { 0 }, 0, 0, VE },
+    { NULL }
+};
+
+static const AVCodecDefault librav1e_defaults[] = {
+    { "b",           "0" },
+    { "g",           "0" },
+    { "keyint_min",  "0" },
+    { "qmax",       "-1" },
+    { "qmin",       "-1" },
+    { NULL }
+};
+
+const enum AVPixelFormat librav1e_pix_fmts[] = {
+    AV_PIX_FMT_YUV420P,
+    AV_PIX_FMT_YUVJ420P,
+    AV_PIX_FMT_YUV420P10,
+    AV_PIX_FMT_YUV420P12,
+    AV_PIX_FMT_YUV422P,
+    AV_PIX_FMT_YUVJ422P,
+    AV_PIX_FMT_YUV422P10,
+    AV_PIX_FMT_YUV422P12,
+    AV_PIX_FMT_YUV444P,
+    AV_PIX_FMT_YUVJ444P,
+    AV_PIX_FMT_YUV444P10,
+    AV_PIX_FMT_YUV444P12,
+    AV_PIX_FMT_NONE
+};
+
+static const AVClass class = {
+    .class_name = "librav1e",
+    .item_name  = av_default_item_name,
+    .option     = options,
+    .version    = LIBAVUTIL_VERSION_INT,
+};
+
+AVCodec ff_librav1e_encoder = {
+    .name           = "librav1e",
+    .long_name      = NULL_IF_CONFIG_SMALL("librav1e AV1"),
+    .type           = AVMEDIA_TYPE_VIDEO,
+    .id             = AV_CODEC_ID_AV1,
+    .init           = librav1e_encode_init,
+    .send_frame     = librav1e_send_frame,
+    .receive_packet = librav1e_receive_packet,
+    .close          = librav1e_encode_close,
+    .priv_data_size = sizeof(librav1eContext),
+    .priv_class     = &class,
+    .defaults       = librav1e_defaults,
+    .pix_fmts       = librav1e_pix_fmts,
+    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AUTO_THREADS,
+    .caps_internal  = FF_CODEC_CAP_INIT_CLEANUP,
+    .wrapper_name   = "librav1e",
+};
diff --git a/libavcodec/libtwolame.c b/libavcodec/libtwolame.c
index 030f888..5ceb3d9 100644
--- a/libavcodec/libtwolame.c
+++ b/libavcodec/libtwolame.c
@@ -78,8 +78,12 @@
     twolame_set_in_samplerate(s->glopts, avctx->sample_rate);
     twolame_set_out_samplerate(s->glopts, avctx->sample_rate);
 
-    if (!avctx->bit_rate)
-        avctx->bit_rate = avctx->sample_rate < 28000 ? 160000 : 384000;
+    if (!avctx->bit_rate) {
+        if ((s->mode == TWOLAME_AUTO_MODE && avctx->channels == 1) || s->mode == TWOLAME_MONO)
+            avctx->bit_rate = avctx->sample_rate < 28000 ? 80000 : 192000;
+        else
+            avctx->bit_rate = avctx->sample_rate < 28000 ? 160000 : 384000;
+    }
 
     if (avctx->flags & AV_CODEC_FLAG_QSCALE || !avctx->bit_rate) {
         twolame_set_VBR(s->glopts, TRUE);
diff --git a/libavcodec/libvorbisdec.c b/libavcodec/libvorbisdec.c
index ecf690a..3c53b8f 100644
--- a/libavcodec/libvorbisdec.c
+++ b/libavcodec/libvorbisdec.c
@@ -49,29 +49,40 @@
     vorbis_comment_init(&context->vc) ;
 
     if(p[0] == 0 && p[1] == 30) {
+        int sizesum = 0;
         for(i = 0; i < 3; i++){
             hsizes[i] = bytestream_get_be16((const uint8_t **)&p);
+            sizesum += 2 + hsizes[i];
+            if (sizesum > avccontext->extradata_size) {
+                av_log(avccontext, AV_LOG_ERROR, "vorbis extradata too small\n");
+                ret = AVERROR_INVALIDDATA;
+                goto error;
+            }
+
             headers[i] = p;
             p += hsizes[i];
         }
     } else if(*p == 2) {
         unsigned int offset = 1;
+        unsigned int sizesum = 1;
         p++;
         for(i=0; i<2; i++) {
             hsizes[i] = 0;
-            while((*p == 0xFF) && (offset < avccontext->extradata_size)) {
+            while((*p == 0xFF) && (sizesum < avccontext->extradata_size)) {
                 hsizes[i] += 0xFF;
                 offset++;
+                sizesum += 1 + 0xFF;
                 p++;
             }
-            if(offset >= avccontext->extradata_size - 1) {
+            hsizes[i] += *p;
+            offset++;
+            sizesum += 1 + *p;
+            if(sizesum > avccontext->extradata_size) {
                 av_log(avccontext, AV_LOG_ERROR,
                        "vorbis header sizes damaged\n");
                 ret = AVERROR_INVALIDDATA;
                 goto error;
             }
-            hsizes[i] += *p;
-            offset++;
             p++;
         }
         hsizes[2] = avccontext->extradata_size - hsizes[0]-hsizes[1]-offset;
diff --git a/libavcodec/libvpxdec.c b/libavcodec/libvpxdec.c
index 04f27d3..1063c54 100644
--- a/libavcodec/libvpxdec.c
+++ b/libavcodec/libvpxdec.c
@@ -25,6 +25,7 @@
 
 #define VPX_CODEC_DISABLE_COMPAT 1
 #include <vpx/vpx_decoder.h>
+#include <vpx/vpx_frame_buffer.h>
 #include <vpx/vp8dx.h>
 
 #include "libavutil/common.h"
@@ -38,31 +39,67 @@
 typedef struct VPxDecoderContext {
     struct vpx_codec_ctx decoder;
     struct vpx_codec_ctx decoder_alpha;
+    AVBufferPool *pool;
+    size_t pool_size;
     int has_alpha_channel;
 } VPxContext;
 
-static av_cold int vpx_init(AVCodecContext *avctx,
-                            const struct vpx_codec_iface *iface,
-                            int is_alpha_decoder)
+
+static int get_frame_buffer(void *priv, size_t min_size, vpx_codec_frame_buffer_t *fb)
 {
-    VPxContext *ctx = avctx->priv_data;
+    VPxContext *ctx = priv;
+    AVBufferRef *buf;
+
+    if (min_size > ctx->pool_size) {
+        av_buffer_pool_uninit(&ctx->pool);
+        /* According to the libvpx docs the buffer must be zeroed out. */
+        ctx->pool = av_buffer_pool_init(min_size, av_buffer_allocz);
+        if (!ctx->pool) {
+            ctx->pool_size = 0;
+            return AVERROR(ENOMEM);
+        }
+        ctx->pool_size = min_size;
+    }
+
+    buf = av_buffer_pool_get(ctx->pool);
+    if (!buf)
+        return AVERROR(ENOMEM);
+
+    fb->priv = buf;
+    fb->size = ctx->pool_size;
+    fb->data = buf->data;
+
+    return 0;
+}
+
+static int release_frame_buffer(void *priv, vpx_codec_frame_buffer_t *fb)
+{
+    AVBufferRef *buf = fb->priv;
+    av_buffer_unref(&buf);
+    return 0;
+}
+
+static av_cold int vpx_init(AVCodecContext *avctx,
+                            struct vpx_codec_ctx* decoder,
+                            const struct vpx_codec_iface *iface)
+{
     struct vpx_codec_dec_cfg deccfg = {
-        /* token partitions+1 would be a decent choice */
-        .threads = FFMIN(avctx->thread_count, 16)
+        .threads = FFMIN(avctx->thread_count ? avctx->thread_count : av_cpu_count(), 16)
     };
 
     av_log(avctx, AV_LOG_INFO, "%s\n", vpx_codec_version_str());
     av_log(avctx, AV_LOG_VERBOSE, "%s\n", vpx_codec_build_config());
 
-    if (vpx_codec_dec_init(
-            is_alpha_decoder ? &ctx->decoder_alpha : &ctx->decoder,
-            iface, &deccfg, 0) != VPX_CODEC_OK) {
-        const char *error = vpx_codec_error(&ctx->decoder);
+    if (vpx_codec_dec_init(decoder, iface, &deccfg, 0) != VPX_CODEC_OK) {
+        const char *error = vpx_codec_error(decoder);
         av_log(avctx, AV_LOG_ERROR, "Failed to initialize decoder: %s\n",
                error);
         return AVERROR(EINVAL);
     }
 
+    if (avctx->codec_id == AV_CODEC_ID_VP9)
+        vpx_codec_set_frame_buffer_functions(decoder, get_frame_buffer, release_frame_buffer, avctx->priv_data);
+
     return 0;
 }
 
@@ -192,7 +229,7 @@
     side_data = av_packet_get_side_data(avpkt,
                                         AV_PKT_DATA_MATROSKA_BLOCKADDITIONAL,
                                         &side_data_size);
-    if (side_data_size > 1) {
+    if (side_data_size >= 8) {
         const uint64_t additional_id = AV_RB64(side_data);
         side_data += 8;
         side_data_size -= 8;
@@ -200,15 +237,16 @@
             if (!ctx->has_alpha_channel) {
                 ctx->has_alpha_channel = 1;
                 ret = vpx_init(avctx,
+                               &ctx->decoder_alpha,
 #if CONFIG_LIBVPX_VP8_DECODER && CONFIG_LIBVPX_VP9_DECODER
                                (avctx->codec_id == AV_CODEC_ID_VP8) ?
-                               &vpx_codec_vp8_dx_algo : &vpx_codec_vp9_dx_algo,
+                               &vpx_codec_vp8_dx_algo : &vpx_codec_vp9_dx_algo
 #elif CONFIG_LIBVPX_VP8_DECODER
-                               &vpx_codec_vp8_dx_algo,
+                               &vpx_codec_vp8_dx_algo
 #else
-                               &vpx_codec_vp9_dx_algo,
+                               &vpx_codec_vp9_dx_algo
 #endif
-                               1);
+                               );
                 if (ret)
                     return ret;
             }
@@ -244,8 +282,17 @@
             if (ret < 0)
                 return ret;
         }
-        if ((ret = ff_get_buffer(avctx, picture, 0)) < 0)
-            return ret;
+
+        if (ctx->has_alpha_channel &&
+            (img->d_w != img_alpha->d_w ||
+             img->d_h != img_alpha->d_h ||
+             img->bit_depth != img_alpha->bit_depth)) {
+            av_log(avctx, AV_LOG_ERROR,
+                   "Video dimensions %dx%d@%dbpc differ from alpha dimensions %dx%d@%dbpc\n",
+                   img->d_w, img->d_h, img->bit_depth,
+                   img_alpha->d_w, img_alpha->d_h, img_alpha->bit_depth);
+            return AVERROR_INVALIDDATA;
+        }
 
         planes[0] = img->planes[VPX_PLANE_Y];
         planes[1] = img->planes[VPX_PLANE_U];
@@ -257,8 +304,31 @@
         linesizes[2] = img->stride[VPX_PLANE_V];
         linesizes[3] =
             ctx->has_alpha_channel ? img_alpha->stride[VPX_PLANE_Y] : 0;
-        av_image_copy(picture->data, picture->linesize, (const uint8_t**)planes,
-                      linesizes, avctx->pix_fmt, img->d_w, img->d_h);
+
+        if (img->fb_priv && (!ctx->has_alpha_channel || img_alpha->fb_priv)) {
+            ret = ff_decode_frame_props(avctx, picture);
+            if (ret < 0)
+                return ret;
+            picture->buf[0] = av_buffer_ref(img->fb_priv);
+            if (!picture->buf[0])
+                return AVERROR(ENOMEM);
+            if (ctx->has_alpha_channel) {
+                picture->buf[1] = av_buffer_ref(img_alpha->fb_priv);
+                if (!picture->buf[1]) {
+                    av_frame_unref(picture);
+                    return AVERROR(ENOMEM);
+                }
+            }
+            for (int i = 0; i < 4; i++) {
+                picture->data[i] = planes[i];
+                picture->linesize[i] = linesizes[i];
+            }
+        } else {
+            if ((ret = ff_get_buffer(avctx, picture, 0)) < 0)
+                return ret;
+            av_image_copy(picture->data, picture->linesize, (const uint8_t**)planes,
+                          linesizes, avctx->pix_fmt, img->d_w, img->d_h);
+        }
         *got_frame           = 1;
     }
     return avpkt->size;
@@ -270,13 +340,15 @@
     vpx_codec_destroy(&ctx->decoder);
     if (ctx->has_alpha_channel)
         vpx_codec_destroy(&ctx->decoder_alpha);
+    av_buffer_pool_uninit(&ctx->pool);
     return 0;
 }
 
 #if CONFIG_LIBVPX_VP8_DECODER
 static av_cold int vp8_init(AVCodecContext *avctx)
 {
-    return vpx_init(avctx, &vpx_codec_vp8_dx_algo, 0);
+    VPxContext *ctx = avctx->priv_data;
+    return vpx_init(avctx, &ctx->decoder, &vpx_codec_vp8_dx_algo);
 }
 
 AVCodec ff_libvpx_vp8_decoder = {
@@ -296,7 +368,8 @@
 #if CONFIG_LIBVPX_VP9_DECODER
 static av_cold int vp9_init(AVCodecContext *avctx)
 {
-    return vpx_init(avctx, &vpx_codec_vp9_dx_algo, 0);
+    VPxContext *ctx = avctx->priv_data;
+    return vpx_init(avctx, &ctx->decoder, &vpx_codec_vp9_dx_algo);
 }
 
 AVCodec ff_libvpx_vp9_decoder = {
@@ -308,7 +381,7 @@
     .init           = vp9_init,
     .close          = vpx_free,
     .decode         = vpx_decode,
-    .capabilities   = AV_CODEC_CAP_AUTO_THREADS | AV_CODEC_CAP_DR1,
+    .capabilities   = AV_CODEC_CAP_AUTO_THREADS,
     .init_static_data = ff_vp9_init_static,
     .profiles       = NULL_IF_CONFIG_SMALL(ff_vp9_profiles),
     .wrapper_name   = "libvpx",
diff --git a/libavcodec/libvpxenc.c b/libavcodec/libvpxenc.c
index 09f7a88..60a8588 100644
--- a/libavcodec/libvpxenc.c
+++ b/libavcodec/libvpxenc.c
@@ -33,6 +33,7 @@
 #include "libavutil/avassert.h"
 #include "libvpx.h"
 #include "profiles.h"
+#include "libavutil/avstring.h"
 #include "libavutil/base64.h"
 #include "libavutil/common.h"
 #include "libavutil/internal.h"
@@ -75,6 +76,7 @@
     struct FrameListData *coded_frame_list;
 
     int cpu_used;
+    int sharpness;
     /**
      * VP8 specific flags, see VP8F_* below.
      */
@@ -98,6 +100,10 @@
     int rc_undershoot_pct;
     int rc_overshoot_pct;
 
+    AVDictionary *vpx_ts_parameters;
+    int *ts_layer_flags;
+    int current_temporal_idx;
+
     // VP9-only
     int lossless;
     int tile_columns;
@@ -111,6 +117,12 @@
     int row_mt;
     int tune_content;
     int corpus_complexity;
+    int tpl_model;
+    /**
+     * If the driver does not support ROI then warn the first time we
+     * encounter a frame with ROI side data.
+     */
+    int roi_warned;
 } VPxContext;
 
 /** String mappings for enum vp8e_enc_control_id */
@@ -126,6 +138,8 @@
     [VP8E_SET_TUNING]            = "VP8E_SET_TUNING",
     [VP8E_SET_CQ_LEVEL]          = "VP8E_SET_CQ_LEVEL",
     [VP8E_SET_MAX_INTRA_BITRATE_PCT] = "VP8E_SET_MAX_INTRA_BITRATE_PCT",
+    [VP8E_SET_SHARPNESS]               = "VP8E_SET_SHARPNESS",
+    [VP8E_SET_TEMPORAL_LAYER_ID]       = "VP8E_SET_TEMPORAL_LAYER_ID",
 #if CONFIG_LIBVPX_VP9_ENCODER
     [VP9E_SET_LOSSLESS]                = "VP9E_SET_LOSSLESS",
     [VP9E_SET_TILE_COLUMNS]            = "VP9E_SET_TILE_COLUMNS",
@@ -133,6 +147,11 @@
     [VP9E_SET_FRAME_PARALLEL_DECODING] = "VP9E_SET_FRAME_PARALLEL_DECODING",
     [VP9E_SET_AQ_MODE]                 = "VP9E_SET_AQ_MODE",
     [VP9E_SET_COLOR_SPACE]             = "VP9E_SET_COLOR_SPACE",
+    [VP9E_SET_SVC_LAYER_ID]            = "VP9E_SET_SVC_LAYER_ID",
+#if VPX_ENCODER_ABI_VERSION >= 12
+    [VP9E_SET_SVC_PARAMETERS]          = "VP9E_SET_SVC_PARAMETERS",
+#endif
+    [VP9E_SET_SVC]                     = "VP9E_SET_SVC",
 #if VPX_ENCODER_ABI_VERSION >= 11
     [VP9E_SET_COLOR_RANGE]             = "VP9E_SET_COLOR_RANGE",
 #endif
@@ -146,6 +165,9 @@
 #ifdef VPX_CTRL_VP9E_SET_TUNE_CONTENT
     [VP9E_SET_TUNE_CONTENT]            = "VP9E_SET_TUNE_CONTENT",
 #endif
+#ifdef VPX_CTRL_VP9E_SET_TPL
+    [VP9E_SET_TPL]                     = "VP9E_SET_TPL",
+#endif
 #endif
 };
 
@@ -165,6 +187,7 @@
 {
     int width = -30;
     int level = AV_LOG_DEBUG;
+    int i;
 
     av_log(avctx, level, "vpx_codec_enc_cfg\n");
     av_log(avctx, level, "generic settings\n"
@@ -204,6 +227,37 @@
            "  %*s%u\n  %*s%u\n",
            width, "rc_undershoot_pct:", cfg->rc_undershoot_pct,
            width, "rc_overshoot_pct:",  cfg->rc_overshoot_pct);
+    av_log(avctx, level, "temporal layering settings\n"
+           "  %*s%u\n", width, "ts_number_layers:", cfg->ts_number_layers);
+    if (avctx->codec_id == AV_CODEC_ID_VP8) {
+        av_log(avctx, level,
+               "\n  %*s", width, "ts_target_bitrate:");
+        for (i = 0; i < VPX_TS_MAX_LAYERS; i++)
+            av_log(avctx, level,
+                   "%u ", cfg->ts_target_bitrate[i]);
+    }
+#if (VPX_ENCODER_ABI_VERSION >= 12) && CONFIG_LIBVPX_VP9_ENCODER
+    if (avctx->codec_id == AV_CODEC_ID_VP9) {
+        av_log(avctx, level,
+               "\n  %*s", width, "layer_target_bitrate:");
+        for (i = 0; i < VPX_TS_MAX_LAYERS; i++)
+            av_log(avctx, level,
+                   "%u ", cfg->layer_target_bitrate[i]);
+    }
+#endif
+    av_log(avctx, level, "\n");
+    av_log(avctx, level,
+           "\n  %*s", width, "ts_rate_decimator:");
+    for (i = 0; i < VPX_TS_MAX_LAYERS; i++)
+        av_log(avctx, level, "%u ", cfg->ts_rate_decimator[i]);
+    av_log(avctx, level, "\n");
+    av_log(avctx, level,
+           "\n  %*s%u\n", width, "ts_periodicity:", cfg->ts_periodicity);
+    av_log(avctx, level,
+           "\n  %*s", width, "ts_layer_id:");
+    for (i = 0; i < VPX_TS_MAX_PERIODICITY; i++)
+        av_log(avctx, level, "%u ", cfg->ts_layer_id[i]);
+    av_log(avctx, level, "\n");
     av_log(avctx, level, "decoder buffer model\n"
             "  %*s%u\n  %*s%u\n  %*s%u\n",
             width, "rc_buf_sz:",         cfg->rc_buf_sz,
@@ -312,15 +366,179 @@
     }
 #endif
 
+    av_freep(&ctx->ts_layer_flags);
+
     vpx_codec_destroy(&ctx->encoder);
-    if (ctx->is_alpha)
+    if (ctx->is_alpha) {
         vpx_codec_destroy(&ctx->encoder_alpha);
+        av_freep(&ctx->rawimg_alpha.planes[VPX_PLANE_U]);
+        av_freep(&ctx->rawimg_alpha.planes[VPX_PLANE_V]);
+    }
     av_freep(&ctx->twopass_stats.buf);
     av_freep(&avctx->stats_out);
     free_frame_list(ctx->coded_frame_list);
     return 0;
 }
 
+static void vp8_ts_parse_int_array(int *dest, char *value, size_t value_len, int max_entries)
+{
+    int dest_idx = 0;
+    char *saveptr = NULL;
+    char *token = av_strtok(value, ",", &saveptr);
+
+    while (token && dest_idx < max_entries) {
+        dest[dest_idx++] = strtoul(token, NULL, 10);
+        token = av_strtok(NULL, ",", &saveptr);
+    }
+}
+
+static void set_temporal_layer_pattern(int layering_mode, vpx_codec_enc_cfg_t *cfg,
+                                       int *layer_flags, int *flag_periodicity)
+{
+    switch (layering_mode) {
+    case 2: {
+        /**
+         * 2-layers, 2-frame period.
+         */
+        static const int ids[2] = { 0, 1 };
+        cfg->ts_periodicity = 2;
+        *flag_periodicity = 2;
+        cfg->ts_number_layers = 2;
+        cfg->ts_rate_decimator[0] = 2;
+        cfg->ts_rate_decimator[1] = 1;
+        memcpy(cfg->ts_layer_id, ids, sizeof(ids));
+
+        layer_flags[0] =
+             VP8_EFLAG_NO_REF_GF | VP8_EFLAG_NO_REF_ARF |
+             VP8_EFLAG_NO_UPD_GF | VP8_EFLAG_NO_UPD_ARF;
+        layer_flags[1] =
+            VP8_EFLAG_NO_UPD_ARF | VP8_EFLAG_NO_UPD_GF |
+            VP8_EFLAG_NO_UPD_LAST |
+            VP8_EFLAG_NO_REF_ARF | VP8_EFLAG_NO_REF_GF;
+        break;
+    }
+    case 3: {
+        /**
+         * 3-layers structure with one reference frame.
+         *  This works same as temporal_layering_mode 3.
+         *
+         * 3-layers, 4-frame period.
+         */
+        static const int ids[4] = { 0, 2, 1, 2 };
+        cfg->ts_periodicity = 4;
+        *flag_periodicity = 4;
+        cfg->ts_number_layers = 3;
+        cfg->ts_rate_decimator[0] = 4;
+        cfg->ts_rate_decimator[1] = 2;
+        cfg->ts_rate_decimator[2] = 1;
+        memcpy(cfg->ts_layer_id, ids, sizeof(ids));
+
+        /**
+         * 0=L, 1=GF, 2=ARF,
+         * Intra-layer prediction disabled.
+         */
+        layer_flags[0] =
+            VP8_EFLAG_NO_REF_GF | VP8_EFLAG_NO_REF_ARF |
+            VP8_EFLAG_NO_UPD_GF | VP8_EFLAG_NO_UPD_ARF;
+        layer_flags[1] =
+            VP8_EFLAG_NO_REF_GF | VP8_EFLAG_NO_REF_ARF |
+            VP8_EFLAG_NO_UPD_LAST | VP8_EFLAG_NO_UPD_GF |
+            VP8_EFLAG_NO_UPD_ARF;
+        layer_flags[2] =
+            VP8_EFLAG_NO_REF_GF | VP8_EFLAG_NO_REF_ARF |
+            VP8_EFLAG_NO_UPD_ARF | VP8_EFLAG_NO_UPD_LAST;
+        layer_flags[3] =
+            VP8_EFLAG_NO_REF_LAST | VP8_EFLAG_NO_REF_ARF |
+            VP8_EFLAG_NO_UPD_LAST | VP8_EFLAG_NO_UPD_GF |
+            VP8_EFLAG_NO_UPD_ARF;
+        break;
+    }
+    case 4: {
+        /**
+         * 3-layers structure.
+         * added dependency between the two TL2 frames (on top of case 3).
+         * 3-layers, 4-frame period.
+         */
+        static const int ids[4] = { 0, 2, 1, 2 };
+        cfg->ts_periodicity = 4;
+        *flag_periodicity = 4;
+        cfg->ts_number_layers = 3;
+        cfg->ts_rate_decimator[0] = 4;
+        cfg->ts_rate_decimator[1] = 2;
+        cfg->ts_rate_decimator[2] = 1;
+        memcpy(cfg->ts_layer_id, ids, sizeof(ids));
+
+        /**
+         * 0=L, 1=GF, 2=ARF, Intra-layer prediction disabled.
+         */
+        layer_flags[0] =
+            VP8_EFLAG_NO_REF_GF | VP8_EFLAG_NO_REF_ARF |
+            VP8_EFLAG_NO_UPD_GF | VP8_EFLAG_NO_UPD_ARF;
+        layer_flags[1] =
+            VP8_EFLAG_NO_REF_GF | VP8_EFLAG_NO_REF_ARF |
+            VP8_EFLAG_NO_UPD_LAST | VP8_EFLAG_NO_UPD_GF;
+        layer_flags[2] =
+            VP8_EFLAG_NO_REF_GF | VP8_EFLAG_NO_REF_ARF |
+            VP8_EFLAG_NO_UPD_ARF | VP8_EFLAG_NO_UPD_LAST;
+        layer_flags[3] =
+            VP8_EFLAG_NO_REF_LAST |
+            VP8_EFLAG_NO_UPD_LAST | VP8_EFLAG_NO_UPD_GF |
+            VP8_EFLAG_NO_UPD_ARF;
+        break;
+    }
+    default:
+        /**
+         * do not change the layer_flags or the flag_periodicity in this case;
+         * it might be that the code is using external flags to be used.
+         */
+        break;
+
+    }
+}
+
+static int vpx_ts_param_parse(VPxContext *ctx, struct vpx_codec_enc_cfg *enccfg,
+                              char *key, char *value, enum AVCodecID codec_id)
+{
+    size_t value_len = strlen(value);
+    int ts_layering_mode = 0;
+
+    if (!value_len)
+        return -1;
+
+    if (!strcmp(key, "ts_number_layers"))
+        enccfg->ts_number_layers = strtoul(value, &value, 10);
+    else if (!strcmp(key, "ts_target_bitrate")) {
+        if (codec_id == AV_CODEC_ID_VP8)
+            vp8_ts_parse_int_array(enccfg->ts_target_bitrate, value, value_len, VPX_TS_MAX_LAYERS);
+#if (VPX_ENCODER_ABI_VERSION >= 12) && CONFIG_LIBVPX_VP9_ENCODER
+        if (codec_id == AV_CODEC_ID_VP9)
+            vp8_ts_parse_int_array(enccfg->layer_target_bitrate, value, value_len, VPX_TS_MAX_LAYERS);
+#endif
+    } else if (!strcmp(key, "ts_rate_decimator")) {
+        vp8_ts_parse_int_array(enccfg->ts_rate_decimator, value, value_len, VPX_TS_MAX_LAYERS);
+    } else if (!strcmp(key, "ts_periodicity")) {
+        enccfg->ts_periodicity = strtoul(value, &value, 10);
+    } else if (!strcmp(key, "ts_layer_id")) {
+        vp8_ts_parse_int_array(enccfg->ts_layer_id, value, value_len, VPX_TS_MAX_PERIODICITY);
+    } else if (!strcmp(key, "ts_layering_mode")) {
+        /* option for pre-defined temporal structures in function set_temporal_layer_pattern. */
+        ts_layering_mode = strtoul(value, &value, 4);
+    }
+
+#if (VPX_ENCODER_ABI_VERSION >= 12) && CONFIG_LIBVPX_VP9_ENCODER
+    enccfg->temporal_layering_mode = VP9E_TEMPORAL_LAYERING_MODE_BYPASS; // only bypass mode is supported for now.
+    enccfg->ss_number_layers = 1; // TODO: add spatial scalability support.
+#endif
+    if (ts_layering_mode) {
+        // make sure the ts_layering_mode comes at the end of the ts_parameter string to ensure that
+        // correct configuration is done.
+        ctx->ts_layer_flags = av_malloc_array(VPX_TS_MAX_PERIODICITY, sizeof(*ctx->ts_layer_flags));
+        set_temporal_layer_pattern(ts_layering_mode, enccfg, ctx->ts_layer_flags, &enccfg->ts_periodicity);
+    }
+
+    return 0;
+}
+
 #if CONFIG_LIBVPX_VP9_ENCODER
 static int set_pix_fmt(AVCodecContext *avctx, vpx_codec_caps_t codec_caps,
                        struct vpx_codec_enc_cfg *enccfg, vpx_codec_flags_t *flags,
@@ -448,6 +666,66 @@
 #endif
 #endif
 
+/**
+ * Set the target bitrate to VPX library default. Also set CRF to 32 if needed.
+ */
+static void set_vp8_defaults(AVCodecContext *avctx,
+                             struct vpx_codec_enc_cfg *enccfg)
+{
+    VPxContext *ctx = avctx->priv_data;
+    av_assert0(!avctx->bit_rate);
+    avctx->bit_rate = enccfg->rc_target_bitrate * 1000;
+    if (enccfg->rc_end_usage == VPX_CQ) {
+        av_log(avctx, AV_LOG_WARNING,
+               "Bitrate not specified for constrained quality mode, using default of %dkbit/sec\n",
+               enccfg->rc_target_bitrate);
+    } else {
+        enccfg->rc_end_usage = VPX_CQ;
+        ctx->crf = 32;
+        av_log(avctx, AV_LOG_WARNING,
+               "Neither bitrate nor constrained quality specified, using default CRF of %d and bitrate of %dkbit/sec\n",
+               ctx->crf, enccfg->rc_target_bitrate);
+    }
+}
+
+
+#if CONFIG_LIBVPX_VP9_ENCODER
+/**
+ * Keep the target bitrate at 0 to engage constant quality mode. If CRF is not
+ * set, use 32.
+ */
+static void set_vp9_defaults(AVCodecContext *avctx,
+                             struct vpx_codec_enc_cfg *enccfg)
+{
+    VPxContext *ctx = avctx->priv_data;
+    av_assert0(!avctx->bit_rate);
+    if (enccfg->rc_end_usage != VPX_Q && ctx->lossless < 0) {
+        enccfg->rc_end_usage = VPX_Q;
+        ctx->crf = 32;
+        av_log(avctx, AV_LOG_WARNING,
+               "Neither bitrate nor constrained quality specified, using default CRF of %d\n",
+               ctx->crf);
+    }
+}
+#endif
+
+/**
+ * Called when the bitrate is not set. It sets appropriate default values for
+ * bitrate and CRF.
+ */
+static void set_vpx_defaults(AVCodecContext *avctx,
+                             struct vpx_codec_enc_cfg *enccfg)
+{
+    av_assert0(!avctx->bit_rate);
+#if CONFIG_LIBVPX_VP9_ENCODER
+    if (avctx->codec_id == AV_CODEC_ID_VP9) {
+        set_vp9_defaults(avctx, enccfg);
+        return;
+    }
+#endif
+    set_vp8_defaults(avctx, enccfg);
+}
+
 static av_cold int vpx_init(AVCodecContext *avctx,
                             const struct vpx_codec_iface *iface)
 {
@@ -460,7 +738,9 @@
     vpx_img_fmt_t img_fmt = VPX_IMG_FMT_I420;
 #if CONFIG_LIBVPX_VP9_ENCODER
     vpx_codec_caps_t codec_caps = vpx_codec_get_caps(iface);
+    vpx_svc_extra_cfg_t svc_params;
 #endif
+    AVDictionaryEntry* en = NULL;
 
     av_log(avctx, AV_LOG_INFO, "%s\n", vpx_codec_version_str());
     av_log(avctx, AV_LOG_VERBOSE, "%s\n", vpx_codec_build_config());
@@ -493,7 +773,8 @@
     enccfg.g_h            = avctx->height;
     enccfg.g_timebase.num = avctx->time_base.num;
     enccfg.g_timebase.den = avctx->time_base.den;
-    enccfg.g_threads      = avctx->thread_count ? avctx->thread_count : av_cpu_count();
+    enccfg.g_threads      =
+        FFMIN(avctx->thread_count ? avctx->thread_count : av_cpu_count(), 16);
     enccfg.g_lag_in_frames= ctx->lag_in_frames;
 
     if (avctx->flags & AV_CODEC_FLAG_PASS1)
@@ -518,17 +799,11 @@
         enccfg.rc_target_bitrate = av_rescale_rnd(avctx->bit_rate, 1, 1000,
                                                   AV_ROUND_NEAR_INF);
 #if CONFIG_LIBVPX_VP9_ENCODER
-    } else if (enccfg.rc_end_usage == VPX_Q) {
+        enccfg.ss_target_bitrate[0] = enccfg.rc_target_bitrate;
 #endif
     } else {
-        if (enccfg.rc_end_usage == VPX_CQ) {
-            enccfg.rc_target_bitrate = 1000000;
-        } else {
-            avctx->bit_rate = enccfg.rc_target_bitrate * 1000;
-            av_log(avctx, AV_LOG_WARNING,
-                   "Neither bitrate nor constrained quality specified, using default bitrate of %dkbit/sec\n",
-                   enccfg.rc_target_bitrate);
-        }
+        // Set bitrate to default value. Also sets CRF to default if needed.
+        set_vpx_defaults(avctx, &enccfg);
     }
 
     if (avctx->codec_id == AV_CODEC_ID_VP9 && ctx->lossless == 1) {
@@ -635,6 +910,13 @@
 
     enccfg.g_error_resilient = ctx->error_resilient || ctx->flags & VP8F_ERROR_RESILIENT;
 
+    while ((en = av_dict_get(ctx->vpx_ts_parameters, "", en, AV_DICT_IGNORE_SUFFIX))) {
+        if (vpx_ts_param_parse(ctx, &enccfg, en->key, en->value, avctx->codec_id) < 0)
+            av_log(avctx, AV_LOG_WARNING,
+                   "Error parsing option '%s = %s'.\n",
+                   en->key, en->value);
+    }
+
     dump_enc_cfg(avctx, &enccfg);
     /* Construct Encoder Context */
     res = vpx_codec_enc_init(&ctx->encoder, iface, &enccfg, flags);
@@ -642,7 +924,21 @@
         log_encoder_error(avctx, "Failed to initialize encoder");
         return AVERROR(EINVAL);
     }
-
+#if CONFIG_LIBVPX_VP9_ENCODER
+    if (avctx->codec_id == AV_CODEC_ID_VP9 && enccfg.ts_number_layers > 1) {
+        memset(&svc_params, 0, sizeof(svc_params));
+        for (int i = 0; i < enccfg.ts_number_layers; ++i) {
+            svc_params.max_quantizers[i] = enccfg.rc_max_quantizer;
+            svc_params.min_quantizers[i] = enccfg.rc_min_quantizer;
+        }
+        svc_params.scaling_factor_num[0] = enccfg.g_h;
+        svc_params.scaling_factor_den[0] = enccfg.g_h;
+#if VPX_ENCODER_ABI_VERSION >= 12
+        codecctl_int(avctx, VP9E_SET_SVC, 1);
+        codecctl_intp(avctx, VP9E_SET_SVC_PARAMETERS, (int *)&svc_params);
+#endif
+    }
+#endif
     if (ctx->is_alpha) {
         enccfg_alpha = enccfg;
         res = vpx_codec_enc_init(&ctx->encoder_alpha, iface, &enccfg_alpha, flags);
@@ -674,6 +970,9 @@
         return AVERROR(EINVAL);
     }
 
+    if (ctx->sharpness >= 0)
+        codecctl_int(avctx, VP8E_SET_SHARPNESS, ctx->sharpness);
+
     if (CONFIG_LIBVPX_VP8_ENCODER && avctx->codec_id == AV_CODEC_ID_VP8) {
 #if FF_API_PRIVATE_OPT
 FF_DISABLE_DEPRECATION_WARNINGS
@@ -717,6 +1016,10 @@
         if (ctx->tune_content >= 0)
             codecctl_int(avctx, VP9E_SET_TUNE_CONTENT, ctx->tune_content);
 #endif
+#ifdef VPX_CTRL_VP9E_SET_TPL
+        if (ctx->tpl_model >= 0)
+            codecctl_int(avctx, VP9E_SET_TPL, ctx->tpl_model);
+#endif
     }
 #endif
 
@@ -730,10 +1033,6 @@
         ctx->rawimg.bit_depth = enccfg.g_bit_depth;
 #endif
 
-    if (ctx->is_alpha)
-        vpx_img_wrap(&ctx->rawimg_alpha, VPX_IMG_FMT_I420, avctx->width, avctx->height, 1,
-                     (unsigned char*)1);
-
     cpb_props = ff_add_cpb_side_data(avctx);
     if (!cpb_props)
         return AVERROR(ENOMEM);
@@ -892,7 +1191,7 @@
        are only good through the next vpx_codec call */
     while ((pkt = vpx_codec_get_cx_data(&ctx->encoder, &iter)) &&
            (!ctx->is_alpha ||
-            (ctx->is_alpha && (pkt_alpha = vpx_codec_get_cx_data(&ctx->encoder_alpha, &iter_alpha))))) {
+            (pkt_alpha = vpx_codec_get_cx_data(&ctx->encoder_alpha, &iter_alpha)))) {
         switch (pkt->kind) {
         case VPX_CODEC_CX_FRAME_PKT:
             if (!size) {
@@ -906,8 +1205,7 @@
                 if (size < 0)
                     return size;
             } else {
-                struct FrameListData *cx_frame =
-                    av_malloc(sizeof(struct FrameListData));
+                struct FrameListData *cx_frame = av_malloc(sizeof(*cx_frame));
 
                 if (!cx_frame) {
                     av_log(avctx, AV_LOG_ERROR,
@@ -971,6 +1269,213 @@
     return size;
 }
 
+static int set_roi_map(AVCodecContext *avctx, const AVFrameSideData *sd, int frame_width, int frame_height,
+                       vpx_roi_map_t *roi_map, int block_size, int segment_cnt)
+{
+    /**
+     * range of vpx_roi_map_t.delta_q[i] is [-63, 63]
+     */
+#define MAX_DELTA_Q 63
+
+    const AVRegionOfInterest *roi = NULL;
+    int nb_rois;
+    uint32_t self_size;
+    int segment_id;
+
+    /* record the mapping from delta_q to "segment id + 1" in segment_mapping[].
+     * the range of delta_q is [-MAX_DELTA_Q, MAX_DELTA_Q],
+     * and its corresponding array index is [0, 2 * MAX_DELTA_Q],
+     * and so the length of the mapping array is 2 * MAX_DELTA_Q + 1.
+     * "segment id + 1", so we can say there's no mapping if the value of array element is zero.
+     */
+    int segment_mapping[2 * MAX_DELTA_Q + 1] = { 0 };
+
+    memset(roi_map, 0, sizeof(*roi_map));
+
+    /* segment id 0 in roi_map is reserved for the areas not covered by AVRegionOfInterest.
+     * segment id 0 in roi_map is also for the areas with AVRegionOfInterest.qoffset near 0.
+     * (delta_q of segment id 0 is 0).
+     */
+    segment_mapping[MAX_DELTA_Q] = 1;
+    segment_id = 1;
+
+    roi = (const AVRegionOfInterest*)sd->data;
+    self_size = roi->self_size;
+    if (!self_size || sd->size % self_size) {
+        av_log(avctx, AV_LOG_ERROR, "Invalid AVRegionOfInterest.self_size.\n");
+        return AVERROR(EINVAL);
+    }
+    nb_rois = sd->size / self_size;
+
+    /* This list must be iterated from zero because regions are
+     * defined in order of decreasing importance. So discard less
+     * important areas if they exceed the segment count.
+     */
+    for (int i = 0; i < nb_rois; i++) {
+        int delta_q;
+        int mapping_index;
+
+        roi = (const AVRegionOfInterest*)(sd->data + self_size * i);
+        if (!roi->qoffset.den) {
+            av_log(avctx, AV_LOG_ERROR, "AVRegionOfInterest.qoffset.den must not be zero.\n");
+            return AVERROR(EINVAL);
+        }
+
+        delta_q = (int)(roi->qoffset.num * 1.0f / roi->qoffset.den * MAX_DELTA_Q);
+        delta_q = av_clip(delta_q, -MAX_DELTA_Q, MAX_DELTA_Q);
+
+        mapping_index = delta_q + MAX_DELTA_Q;
+        if (!segment_mapping[mapping_index]) {
+            if (segment_id == segment_cnt) {
+                av_log(avctx, AV_LOG_WARNING,
+                       "ROI only supports %d segments (and segment 0 is reserved for non-ROIs), skipping the left ones.\n",
+                       segment_cnt);
+                break;
+            }
+
+            segment_mapping[mapping_index] = segment_id + 1;
+            roi_map->delta_q[segment_id] = delta_q;
+            segment_id++;
+        }
+    }
+
+    roi_map->rows = (frame_height + block_size - 1) / block_size;
+    roi_map->cols = (frame_width  + block_size - 1) / block_size;
+    roi_map->roi_map = av_mallocz_array(roi_map->rows * roi_map->cols, sizeof(*roi_map->roi_map));
+    if (!roi_map->roi_map) {
+        av_log(avctx, AV_LOG_ERROR, "roi_map alloc failed.\n");
+        return AVERROR(ENOMEM);
+    }
+
+    /* This list must be iterated in reverse, so for the case that
+     * two regions are overlapping, the more important area takes effect.
+     */
+    for (int i = nb_rois - 1; i >= 0; i--) {
+        int delta_q;
+        int mapping_value;
+        int starty, endy, startx, endx;
+
+        roi = (const AVRegionOfInterest*)(sd->data + self_size * i);
+
+        starty = av_clip(roi->top / block_size, 0, roi_map->rows);
+        endy   = av_clip((roi->bottom + block_size - 1) / block_size, 0, roi_map->rows);
+        startx = av_clip(roi->left / block_size, 0, roi_map->cols);
+        endx   = av_clip((roi->right + block_size - 1) / block_size, 0, roi_map->cols);
+
+        delta_q = (int)(roi->qoffset.num * 1.0f / roi->qoffset.den * MAX_DELTA_Q);
+        delta_q = av_clip(delta_q, -MAX_DELTA_Q, MAX_DELTA_Q);
+
+        mapping_value = segment_mapping[delta_q + MAX_DELTA_Q];
+        if (mapping_value) {
+            for (int y = starty; y < endy; y++)
+                for (int x = startx; x < endx; x++)
+                    roi_map->roi_map[x + y * roi_map->cols] = mapping_value - 1;
+        }
+    }
+
+    return 0;
+}
+
+static int vp9_encode_set_roi(AVCodecContext *avctx, int frame_width, int frame_height, const AVFrameSideData *sd)
+{
+    VPxContext *ctx = avctx->priv_data;
+
+#ifdef VPX_CTRL_VP9E_SET_ROI_MAP
+    int version = vpx_codec_version();
+    int major = VPX_VERSION_MAJOR(version);
+    int minor = VPX_VERSION_MINOR(version);
+    int patch = VPX_VERSION_PATCH(version);
+
+    if (major > 1 || (major == 1 && minor > 8) || (major == 1 && minor == 8 && patch >= 1)) {
+        vpx_roi_map_t roi_map;
+        const int segment_cnt = 8;
+        const int block_size = 8;
+        int ret;
+
+        if (ctx->aq_mode > 0 || ctx->cpu_used < 5 || ctx->deadline != VPX_DL_REALTIME) {
+            if (!ctx->roi_warned) {
+                ctx->roi_warned = 1;
+                av_log(avctx, AV_LOG_WARNING, "ROI is only enabled when aq_mode is 0, cpu_used >= 5 "
+                                              "and deadline is REALTIME, so skipping ROI.\n");
+                return AVERROR(EINVAL);
+            }
+        }
+
+        ret = set_roi_map(avctx, sd, frame_width, frame_height, &roi_map, block_size, segment_cnt);
+        if (ret) {
+            log_encoder_error(avctx, "Failed to set_roi_map.\n");
+            return ret;
+        }
+
+        memset(roi_map.ref_frame, -1, sizeof(roi_map.ref_frame));
+
+        if (vpx_codec_control(&ctx->encoder, VP9E_SET_ROI_MAP, &roi_map)) {
+            log_encoder_error(avctx, "Failed to set VP9E_SET_ROI_MAP codec control.\n");
+            ret = AVERROR_INVALIDDATA;
+        }
+        av_freep(&roi_map.roi_map);
+        return ret;
+    }
+#endif
+
+    if (!ctx->roi_warned) {
+        ctx->roi_warned = 1;
+        av_log(avctx, AV_LOG_WARNING, "ROI is not supported, please upgrade libvpx to version >= 1.8.1. "
+                                      "You may need to rebuild ffmpeg.\n");
+    }
+    return 0;
+}
+
+static int vp8_encode_set_roi(AVCodecContext *avctx, int frame_width, int frame_height, const AVFrameSideData *sd)
+{
+    vpx_roi_map_t roi_map;
+    const int segment_cnt = 4;
+    const int block_size = 16;
+    VPxContext *ctx = avctx->priv_data;
+
+    int ret = set_roi_map(avctx, sd, frame_width, frame_height, &roi_map, block_size, segment_cnt);
+    if (ret) {
+        log_encoder_error(avctx, "Failed to set_roi_map.\n");
+        return ret;
+    }
+
+    if (vpx_codec_control(&ctx->encoder, VP8E_SET_ROI_MAP, &roi_map)) {
+        log_encoder_error(avctx, "Failed to set VP8E_SET_ROI_MAP codec control.\n");
+        ret = AVERROR_INVALIDDATA;
+    }
+
+    av_freep(&roi_map.roi_map);
+    return ret;
+}
+
+static int realloc_alpha_uv(AVCodecContext *avctx, int width, int height)
+{
+    VPxContext *ctx = avctx->priv_data;
+    struct vpx_image *rawimg_alpha = &ctx->rawimg_alpha;
+    unsigned char **planes = rawimg_alpha->planes;
+    int *stride = rawimg_alpha->stride;
+
+    if (!planes[VPX_PLANE_U] ||
+        !planes[VPX_PLANE_V] ||
+        width  != (int)rawimg_alpha->d_w ||
+        height != (int)rawimg_alpha->d_h) {
+        av_freep(&planes[VPX_PLANE_U]);
+        av_freep(&planes[VPX_PLANE_V]);
+
+        vpx_img_wrap(rawimg_alpha, VPX_IMG_FMT_I420, width, height, 1,
+                     (unsigned char*)1);
+        planes[VPX_PLANE_U] = av_malloc_array(stride[VPX_PLANE_U], height);
+        planes[VPX_PLANE_V] = av_malloc_array(stride[VPX_PLANE_V], height);
+        if (!planes[VPX_PLANE_U] || !planes[VPX_PLANE_V])
+            return AVERROR(ENOMEM);
+
+        memset(planes[VPX_PLANE_U], 0x80, stride[VPX_PLANE_U] * height);
+        memset(planes[VPX_PLANE_V], 0x80, stride[VPX_PLANE_V] * height);
+    }
+
+    return 0;
+}
+
 static int vpx_encode(AVCodecContext *avctx, AVPacket *pkt,
                       const AVFrame *frame, int *got_packet)
 {
@@ -980,8 +1485,12 @@
     int64_t timestamp = 0;
     int res, coded_size;
     vpx_enc_frame_flags_t flags = 0;
+    const struct vpx_codec_enc_cfg *enccfg = ctx->encoder.config.enc;
+    vpx_svc_layer_id_t layer_id;
+    int layer_id_valid = 0;
 
     if (frame) {
+        const AVFrameSideData *sd = av_frame_get_side_data(frame, AV_FRAME_DATA_REGIONS_OF_INTEREST);
         rawimg                      = &ctx->rawimg;
         rawimg->planes[VPX_PLANE_Y] = frame->data[0];
         rawimg->planes[VPX_PLANE_U] = frame->data[1];
@@ -990,23 +1499,12 @@
         rawimg->stride[VPX_PLANE_U] = frame->linesize[1];
         rawimg->stride[VPX_PLANE_V] = frame->linesize[2];
         if (ctx->is_alpha) {
-            uint8_t *u_plane, *v_plane;
             rawimg_alpha = &ctx->rawimg_alpha;
+            res = realloc_alpha_uv(avctx, frame->width, frame->height);
+            if (res < 0)
+                return res;
             rawimg_alpha->planes[VPX_PLANE_Y] = frame->data[3];
-            u_plane = av_malloc(frame->linesize[1] * frame->height);
-            v_plane = av_malloc(frame->linesize[2] * frame->height);
-            if (!u_plane || !v_plane) {
-                av_free(u_plane);
-                av_free(v_plane);
-                return AVERROR(ENOMEM);
-            }
-            memset(u_plane, 0x80, frame->linesize[1] * frame->height);
-            rawimg_alpha->planes[VPX_PLANE_U] = u_plane;
-            memset(v_plane, 0x80, frame->linesize[2] * frame->height);
-            rawimg_alpha->planes[VPX_PLANE_V] = v_plane;
-            rawimg_alpha->stride[VPX_PLANE_Y] = frame->linesize[0];
-            rawimg_alpha->stride[VPX_PLANE_U] = frame->linesize[1];
-            rawimg_alpha->stride[VPX_PLANE_V] = frame->linesize[2];
+            rawimg_alpha->stride[VPX_PLANE_Y] = frame->linesize[3];
         }
         timestamp                   = frame->pts;
 #if VPX_IMAGE_ABI_VERSION >= 4
@@ -1021,6 +1519,67 @@
 #endif
         if (frame->pict_type == AV_PICTURE_TYPE_I)
             flags |= VPX_EFLAG_FORCE_KF;
+        if (frame->metadata) {
+            AVDictionaryEntry* en = av_dict_get(frame->metadata, "vp8-flags", NULL, 0);
+            if (en) {
+                flags |= strtoul(en->value, NULL, 10);
+            }
+
+            memset(&layer_id, 0, sizeof(layer_id));
+
+            en = av_dict_get(frame->metadata, "temporal_id", NULL, 0);
+            if (en) {
+                layer_id.temporal_layer_id = strtoul(en->value, NULL, 10);
+#ifdef VPX_CTRL_VP9E_SET_MAX_INTER_BITRATE_PCT
+                layer_id.temporal_layer_id_per_spatial[0] = layer_id.temporal_layer_id;
+#endif
+                layer_id_valid = 1;
+            }
+        }
+
+        if (sd) {
+            if (avctx->codec_id == AV_CODEC_ID_VP8) {
+                vp8_encode_set_roi(avctx, frame->width, frame->height, sd);
+            } else {
+                vp9_encode_set_roi(avctx, frame->width, frame->height, sd);
+            }
+        }
+    }
+
+    // this is for encoding with preset temporal layering patterns defined in
+    // set_temporal_layer_pattern function.
+    if (enccfg->ts_number_layers > 1 && ctx->ts_layer_flags) {
+        if (flags & VPX_EFLAG_FORCE_KF) {
+            // keyframe, reset temporal layering.
+            ctx->current_temporal_idx = 0;
+            flags = VPX_EFLAG_FORCE_KF;
+        } else {
+            flags = 0;
+        }
+
+        /* get the flags from the temporal layer configuration. */
+        flags |= ctx->ts_layer_flags[ctx->current_temporal_idx];
+
+        memset(&layer_id, 0, sizeof(layer_id));
+#if VPX_ENCODER_ABI_VERSION >= 12
+        layer_id.spatial_layer_id = 0;
+#endif
+        layer_id.temporal_layer_id = enccfg->ts_layer_id[ctx->current_temporal_idx];
+#ifdef VPX_CTRL_VP9E_SET_MAX_INTER_BITRATE_PCT
+        layer_id.temporal_layer_id_per_spatial[0] = layer_id.temporal_layer_id;
+#endif
+        layer_id_valid = 1;
+    }
+
+    if (layer_id_valid) {
+        if (avctx->codec_id == AV_CODEC_ID_VP8) {
+            codecctl_int(avctx, VP8E_SET_TEMPORAL_LAYER_ID, layer_id.temporal_layer_id);
+        }
+#if CONFIG_LIBVPX_VP9_ENCODER && VPX_ENCODER_ABI_VERSION >= 12
+        else if (avctx->codec_id == AV_CODEC_ID_VP9) {
+            codecctl_intp(avctx, VP9E_SET_SVC_LAYER_ID, (int *)&layer_id);
+        }
+#endif
     }
 
     res = vpx_codec_encode(&ctx->encoder, rawimg, timestamp,
@@ -1052,11 +1611,8 @@
         }
         av_base64_encode(avctx->stats_out, b64_size, ctx->twopass_stats.buf,
                          ctx->twopass_stats.sz);
-    }
-
-    if (rawimg_alpha) {
-        av_freep(&rawimg_alpha->planes[VPX_PLANE_U]);
-        av_freep(&rawimg_alpha->planes[VPX_PLANE_V]);
+    } else if (enccfg->ts_number_layers > 1 && ctx->ts_layer_flags) {
+        ctx->current_temporal_idx = (ctx->current_temporal_idx + 1) % enccfg->ts_periodicity;
     }
 
     *got_packet = !!coded_size;
@@ -1067,8 +1623,6 @@
 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
 
 #define COMMON_OPTIONS \
-    { "auto-alt-ref",    "Enable use of alternate reference " \
-                         "frames (2-pass only)",                   OFFSET(auto_alt_ref),    AV_OPT_TYPE_INT, {.i64 = -1},      -1,      2,       VE}, \
     { "lag-in-frames",   "Number of frames to look ahead for " \
                          "alternate reference frame selection",    OFFSET(lag_in_frames),   AV_OPT_TYPE_INT, {.i64 = -1},      -1,      INT_MAX, VE}, \
     { "arnr-maxframes",  "altref noise reduction max frame count", OFFSET(arnr_max_frames), AV_OPT_TYPE_INT, {.i64 = -1},      -1,      INT_MAX, VE}, \
@@ -1089,7 +1643,7 @@
     { "default",         "Improve resiliency against losses of whole frames", 0, AV_OPT_TYPE_CONST, {.i64 = VPX_ERROR_RESILIENT_DEFAULT}, 0, 0, VE, "er"}, \
     { "partitions",      "The frame partitions are independently decodable " \
                          "by the bool decoder, meaning that partitions can be decoded even " \
-                         "though earlier partitions have been lost. Note that intra predicition" \
+                         "though earlier partitions have been lost. Note that intra prediction" \
                          " is still done over the partition boundary.",       0, AV_OPT_TYPE_CONST, {.i64 = VPX_ERROR_RESILIENT_PARTITIONS}, 0, 0, VE, "er"}, \
     { "crf",              "Select the quality for constant quality mode", offsetof(VPxContext, crf), AV_OPT_TYPE_INT, {.i64 = -1}, -1, 63, VE }, \
     { "static-thresh",    "A change threshold on blocks below which they will be skipped by the encoder", OFFSET(static_thresh), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, VE }, \
@@ -1097,6 +1651,7 @@
     { "noise-sensitivity", "Noise sensitivity", OFFSET(noise_sensitivity), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, 4, VE}, \
     { "undershoot-pct",  "Datarate undershoot (min) target (%)", OFFSET(rc_undershoot_pct), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 100, VE }, \
     { "overshoot-pct",   "Datarate overshoot (max) target (%)", OFFSET(rc_overshoot_pct), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 1000, VE }, \
+    { "ts-parameters",   "Temporal scaling configuration using a :-separated list of key=value parameters", OFFSET(vpx_ts_parameters), AV_OPT_TYPE_DICT, {.str=NULL},  0,  0, VE}, \
 
 #define LEGACY_OPTIONS \
     {"speed", "", offsetof(VPxContext, cpu_used), AV_OPT_TYPE_INT, {.i64 = 1}, -16, 16, VE}, \
@@ -1108,10 +1663,13 @@
     {"arnr_strength", "altref noise reduction filter strength", offsetof(VPxContext, arnr_strength), AV_OPT_TYPE_INT, {.i64 = 3}, 0, 6, VE}, \
     {"arnr_type", "altref noise reduction filter type", offsetof(VPxContext, arnr_type), AV_OPT_TYPE_INT, {.i64 = 3}, 1, 3, VE}, \
     {"rc_lookahead", "Number of frames to look ahead for alternate reference frame selection", offsetof(VPxContext, lag_in_frames), AV_OPT_TYPE_INT, {.i64 = 25}, 0, 25, VE}, \
+    {"sharpness", "Increase sharpness at the expense of lower PSNR", offsetof(VPxContext, sharpness), AV_OPT_TYPE_INT, {.i64 = -1}, -1, 7, VE},
 
 #if CONFIG_LIBVPX_VP8_ENCODER
 static const AVOption vp8_options[] = {
     COMMON_OPTIONS
+    { "auto-alt-ref",    "Enable use of alternate reference "
+                         "frames (2-pass only)",                        OFFSET(auto_alt_ref),    AV_OPT_TYPE_INT, {.i64 = -1}, -1,  2, VE},
     { "cpu-used",        "Quality/Speed ratio modifier",                OFFSET(cpu_used),        AV_OPT_TYPE_INT, {.i64 = 1}, -16, 16, VE},
     LEGACY_OPTIONS
     { NULL }
@@ -1121,6 +1679,8 @@
 #if CONFIG_LIBVPX_VP9_ENCODER
 static const AVOption vp9_options[] = {
     COMMON_OPTIONS
+    { "auto-alt-ref",    "Enable use of alternate reference "
+                         "frames (2-pass only)",                        OFFSET(auto_alt_ref),    AV_OPT_TYPE_INT, {.i64 = -1}, -1, 6, VE},
     { "cpu-used",        "Quality/Speed ratio modifier",                OFFSET(cpu_used),        AV_OPT_TYPE_INT, {.i64 = 1},  -8, 8, VE},
     { "lossless",        "Lossless mode",                               OFFSET(lossless),        AV_OPT_TYPE_INT, {.i64 = -1}, -1, 1, VE},
     { "tile-columns",    "Number of tile columns to use, log2",         OFFSET(tile_columns),    AV_OPT_TYPE_INT, {.i64 = -1}, -1, 6, VE},
@@ -1157,6 +1717,9 @@
 #if VPX_ENCODER_ABI_VERSION >= 14
     { "corpus-complexity", "corpus vbr complexity midpoint", OFFSET(corpus_complexity), AV_OPT_TYPE_INT, {.i64 = -1}, -1, 10000, VE },
 #endif
+#ifdef VPX_CTRL_VP9E_SET_TPL
+    { "enable-tpl",      "Enable temporal dependency model", OFFSET(tpl_model), AV_OPT_TYPE_BOOL, {.i64 = -1}, -1, 1, VE },
+#endif
     LEGACY_OPTIONS
     { NULL }
 };
@@ -1166,6 +1729,7 @@
 #undef LEGACY_OPTIONS
 
 static const AVCodecDefault defaults[] = {
+    { "b",                 "0" },
     { "qmin",             "-1" },
     { "qmax",             "-1" },
     { "g",                "-1" },
diff --git a/libavcodec/libx264.c b/libavcodec/libx264.c
index 7ab7453..c3ae07b 100644
--- a/libavcodec/libx264.c
+++ b/libavcodec/libx264.c
@@ -25,6 +25,7 @@
 #include "libavutil/mem.h"
 #include "libavutil/pixdesc.h"
 #include "libavutil/stereo3d.h"
+#include "libavutil/time.h"
 #include "libavutil/intreadwrite.h"
 #include "avcodec.h"
 #include "internal.h"
@@ -40,6 +41,15 @@
 #include <stdlib.h>
 #include <string.h>
 
+// from x264.h, for quant_offsets, Macroblocks are 16x16
+// blocks of pixels (with respect to the luma plane)
+#define MB_SIZE 16
+
+typedef struct X264Opaque {
+    int64_t reordered_opaque;
+    int64_t wallclock;
+} X264Opaque;
+
 typedef struct X264Context {
     AVClass        *class;
     x264_param_t    params;
@@ -91,7 +101,16 @@
     int scenechange_threshold;
     int noise_reduction;
 
-    char *x264_params;
+    AVDictionary *x264_params;
+
+    int nb_reordered_opaque, next_reordered_opaque;
+    X264Opaque *reordered_opaque;
+
+    /**
+     * If the encoder does not support ROI then warn the first time we
+     * encounter a frame with ROI side data.
+     */
+    int roi_warned;
 } X264Context;
 
 static void X264_log(void *p, int level, const char *fmt, va_list args)
@@ -279,14 +298,19 @@
     int nnal, i, ret;
     x264_picture_t pic_out = {0};
     int pict_type;
+    int bit_depth;
+    int64_t wallclock = 0;
+    X264Opaque *out_opaque;
+    AVFrameSideData *sd;
 
     x264_picture_init( &x4->pic );
     x4->pic.img.i_csp   = x4->params.i_csp;
 #if X264_BUILD >= 153
-    if (x4->params.i_bitdepth > 8)
+    bit_depth = x4->params.i_bitdepth;
 #else
-    if (x264_bit_depth > 8)
+    bit_depth = x264_bit_depth;
 #endif
+    if (bit_depth > 8)
         x4->pic.img.i_csp |= X264_CSP_HIGH_DEPTH;
     x4->pic.img.i_plane = avfmt2_num_planes(ctx->pix_fmt);
 
@@ -298,6 +322,14 @@
 
         x4->pic.i_pts  = frame->pts;
 
+        x4->reordered_opaque[x4->next_reordered_opaque].reordered_opaque = frame->reordered_opaque;
+        x4->reordered_opaque[x4->next_reordered_opaque].wallclock = wallclock;
+        if (ctx->export_side_data & AV_CODEC_EXPORT_DATA_PRFT)
+            x4->reordered_opaque[x4->next_reordered_opaque].wallclock = av_gettime();
+        x4->pic.opaque = &x4->reordered_opaque[x4->next_reordered_opaque];
+        x4->next_reordered_opaque++;
+        x4->next_reordered_opaque %= x4->nb_reordered_opaque;
+
         switch (frame->pict_type) {
         case AV_PICTURE_TYPE_I:
             x4->pic.i_type = x4->forced_idr > 0 ? X264_TYPE_IDR
@@ -337,6 +369,74 @@
                 }
             }
         }
+
+        sd = av_frame_get_side_data(frame, AV_FRAME_DATA_REGIONS_OF_INTEREST);
+        if (sd) {
+            if (x4->params.rc.i_aq_mode == X264_AQ_NONE) {
+                if (!x4->roi_warned) {
+                    x4->roi_warned = 1;
+                    av_log(ctx, AV_LOG_WARNING, "Adaptive quantization must be enabled to use ROI encoding, skipping ROI.\n");
+                }
+            } else {
+                if (frame->interlaced_frame == 0) {
+                    int mbx = (frame->width + MB_SIZE - 1) / MB_SIZE;
+                    int mby = (frame->height + MB_SIZE - 1) / MB_SIZE;
+                    int qp_range = 51 + 6 * (bit_depth - 8);
+                    int nb_rois;
+                    const AVRegionOfInterest *roi;
+                    uint32_t roi_size;
+                    float *qoffsets;
+
+                    roi = (const AVRegionOfInterest*)sd->data;
+                    roi_size = roi->self_size;
+                    if (!roi_size || sd->size % roi_size != 0) {
+                        av_log(ctx, AV_LOG_ERROR, "Invalid AVRegionOfInterest.self_size.\n");
+                        return AVERROR(EINVAL);
+                    }
+                    nb_rois = sd->size / roi_size;
+
+                    qoffsets = av_mallocz_array(mbx * mby, sizeof(*qoffsets));
+                    if (!qoffsets)
+                        return AVERROR(ENOMEM);
+
+                    // This list must be iterated in reverse because the first
+                    // region in the list applies when regions overlap.
+                    for (int i = nb_rois - 1; i >= 0; i--) {
+                        int startx, endx, starty, endy;
+                        float qoffset;
+
+                        roi = (const AVRegionOfInterest*)(sd->data + roi_size * i);
+
+                        starty = FFMIN(mby, roi->top / MB_SIZE);
+                        endy   = FFMIN(mby, (roi->bottom + MB_SIZE - 1)/ MB_SIZE);
+                        startx = FFMIN(mbx, roi->left / MB_SIZE);
+                        endx   = FFMIN(mbx, (roi->right + MB_SIZE - 1)/ MB_SIZE);
+
+                        if (roi->qoffset.den == 0) {
+                            av_free(qoffsets);
+                            av_log(ctx, AV_LOG_ERROR, "AVRegionOfInterest.qoffset.den must not be zero.\n");
+                            return AVERROR(EINVAL);
+                        }
+                        qoffset = roi->qoffset.num * 1.0f / roi->qoffset.den;
+                        qoffset = av_clipf(qoffset * qp_range, -qp_range, +qp_range);
+
+                        for (int y = starty; y < endy; y++) {
+                            for (int x = startx; x < endx; x++) {
+                                qoffsets[x + y*mbx] = qoffset;
+                            }
+                        }
+                    }
+
+                    x4->pic.prop.quant_offsets = qoffsets;
+                    x4->pic.prop.quant_offsets_free = av_free;
+                } else {
+                    if (!x4->roi_warned) {
+                        x4->roi_warned = 1;
+                        av_log(ctx, AV_LOG_WARNING, "interlaced_frame not supported for ROI encoding yet, skipping ROI.\n");
+                    }
+                }
+            }
+        }
     }
 
     do {
@@ -351,6 +451,15 @@
     pkt->pts = pic_out.i_pts;
     pkt->dts = pic_out.i_dts;
 
+    out_opaque = pic_out.opaque;
+    if (out_opaque >= x4->reordered_opaque &&
+        out_opaque < &x4->reordered_opaque[x4->nb_reordered_opaque]) {
+        ctx->reordered_opaque = out_opaque->reordered_opaque;
+        wallclock = out_opaque->wallclock;
+    } else {
+        // Unexpected opaque pointer on picture output
+        ctx->reordered_opaque = 0;
+    }
 
     switch (pic_out.i_type) {
     case X264_TYPE_IDR:
@@ -376,6 +485,8 @@
     pkt->flags |= AV_PKT_FLAG_KEY*pic_out.b_keyframe;
     if (ret) {
         ff_side_data_set_encoder_stats(pkt, (pic_out.i_qpplus1 - 1) * FF_QP2LAMBDA, NULL, 0, pict_type);
+        if (wallclock)
+            ff_side_data_set_prft(pkt, wallclock);
 
 #if FF_API_CODED_FRAME
 FF_DISABLE_DEPRECATION_WARNINGS
@@ -394,6 +505,7 @@
 
     av_freep(&avctx->extradata);
     av_freep(&x4->sei);
+    av_freep(&x4->reordered_opaque);
 
     if (x4->enc) {
         x264_encoder_close(x4->enc);
@@ -508,6 +620,10 @@
     PARSE_X264_OPT("weightp", wpredp);
 
     if (avctx->bit_rate) {
+        if (avctx->bit_rate / 1000 > INT_MAX || avctx->rc_max_rate / 1000 > INT_MAX) {
+            av_log(avctx, AV_LOG_ERROR, "bit_rate and rc_max_rate > %d000 not supported by libx264\n", INT_MAX);
+            return AVERROR(EINVAL);
+        }
         x4->params.rc.i_bitrate   = avctx->bit_rate / 1000;
         x4->params.rc.i_rc_method = X264_RC_ABR;
     }
@@ -745,8 +861,13 @@
     x4->params.vui.i_sar_height = sh;
     x4->params.i_timebase_den = avctx->time_base.den;
     x4->params.i_timebase_num = avctx->time_base.num;
-    x4->params.i_fps_num = avctx->time_base.den;
-    x4->params.i_fps_den = avctx->time_base.num * avctx->ticks_per_frame;
+    if (avctx->framerate.num > 0 && avctx->framerate.den > 0) {
+        x4->params.i_fps_num = avctx->framerate.num;
+        x4->params.i_fps_den = avctx->framerate.den;
+    } else {
+        x4->params.i_fps_num = avctx->time_base.den;
+        x4->params.i_fps_den = avctx->time_base.num * avctx->ticks_per_frame;
+    }
 
     x4->params.analyse.b_psnr = avctx->flags & AV_CODEC_FLAG_PSNR;
 
@@ -788,19 +909,14 @@
         }
     }
 
-    if (x4->x264_params) {
-        AVDictionary *dict    = NULL;
+
+    {
         AVDictionaryEntry *en = NULL;
-
-        if (!av_dict_parse_string(&dict, x4->x264_params, "=", ":", 0)) {
-            while ((en = av_dict_get(dict, "", en, AV_DICT_IGNORE_SUFFIX))) {
-                if (x264_param_parse(&x4->params, en->key, en->value) < 0)
-                    av_log(avctx, AV_LOG_WARNING,
-                           "Error parsing option '%s = %s'.\n",
-                            en->key, en->value);
-            }
-
-            av_dict_free(&dict);
+        while (en = av_dict_get(x4->x264_params, "", en, AV_DICT_IGNORE_SUFFIX)) {
+           if (x264_param_parse(&x4->params, en->key, en->value) < 0)
+               av_log(avctx, AV_LOG_WARNING,
+                      "Error parsing option '%s = %s'.\n",
+                       en->key, en->value);
         }
     }
 
@@ -810,7 +926,7 @@
     if (avctx->max_b_frames < 0)
         avctx->max_b_frames = 0;
 
-    avctx->bit_rate = x4->params.rc.i_bitrate*1000;
+    avctx->bit_rate = x4->params.rc.i_bitrate*1000LL;
 
     x4->enc = x264_encoder_open(&x4->params);
     if (!x4->enc)
@@ -847,8 +963,16 @@
     if (!cpb_props)
         return AVERROR(ENOMEM);
     cpb_props->buffer_size = x4->params.rc.i_vbv_buffer_size * 1000;
-    cpb_props->max_bitrate = x4->params.rc.i_vbv_max_bitrate * 1000;
-    cpb_props->avg_bitrate = x4->params.rc.i_bitrate         * 1000;
+    cpb_props->max_bitrate = x4->params.rc.i_vbv_max_bitrate * 1000LL;
+    cpb_props->avg_bitrate = x4->params.rc.i_bitrate         * 1000LL;
+
+    // Overestimate the reordered opaque buffer size, in case a runtime
+    // reconfigure would increase the delay (which it shouldn't).
+    x4->nb_reordered_opaque = x264_encoder_maximum_delayed_frames(x4->enc) + 17;
+    x4->reordered_opaque    = av_malloc_array(x4->nb_reordered_opaque,
+                                              sizeof(*x4->reordered_opaque));
+    if (!x4->reordered_opaque)
+        return AVERROR(ENOMEM);
 
     return 0;
 }
@@ -1022,7 +1146,7 @@
     { "sc_threshold", "Scene change threshold",                           OFFSET(scenechange_threshold), AV_OPT_TYPE_INT, { .i64 = -1 }, INT_MIN, INT_MAX, VE },
     { "noise_reduction", "Noise reduction",                               OFFSET(noise_reduction), AV_OPT_TYPE_INT, { .i64 = -1 }, INT_MIN, INT_MAX, VE },
 
-    { "x264-params",  "Override the x264 configuration using a :-separated list of key=value parameters", OFFSET(x264_params), AV_OPT_TYPE_STRING, { 0 }, 0, 0, VE },
+    { "x264-params",  "Override the x264 configuration using a :-separated list of key=value parameters", OFFSET(x264_params), AV_OPT_TYPE_DICT, { 0 }, 0, 0, VE },
     { NULL },
 };
 
@@ -1081,12 +1205,16 @@
     .init             = X264_init,
     .encode2          = X264_frame,
     .close            = X264_close,
-    .capabilities     = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AUTO_THREADS,
+    .capabilities     = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AUTO_THREADS |
+                        AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE,
     .priv_class       = &x264_class,
     .defaults         = x264_defaults,
     .init_static_data = X264_init_static,
-    .caps_internal    = FF_CODEC_CAP_INIT_THREADSAFE |
-                        FF_CODEC_CAP_INIT_CLEANUP,
+#if X264_BUILD >= 158
+    .caps_internal    = FF_CODEC_CAP_INIT_CLEANUP | FF_CODEC_CAP_INIT_THREADSAFE,
+#else
+    .caps_internal    = FF_CODEC_CAP_INIT_CLEANUP,
+#endif
     .wrapper_name     = "libx264",
 };
 #endif
@@ -1108,10 +1236,16 @@
     .init           = X264_init,
     .encode2        = X264_frame,
     .close          = X264_close,
-    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AUTO_THREADS,
+    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AUTO_THREADS |
+                      AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE,
     .priv_class     = &rgbclass,
     .defaults       = x264_defaults,
     .pix_fmts       = pix_fmts_8bit_rgb,
+#if X264_BUILD >= 158
+    .caps_internal  = FF_CODEC_CAP_INIT_CLEANUP | FF_CODEC_CAP_INIT_THREADSAFE,
+#else
+    .caps_internal  = FF_CODEC_CAP_INIT_CLEANUP,
+#endif
     .wrapper_name   = "libx264",
 };
 #endif
@@ -1133,12 +1267,12 @@
     .init             = X264_init,
     .encode2          = X264_frame,
     .close            = X264_close,
-    .capabilities     = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AUTO_THREADS,
+    .capabilities     = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AUTO_THREADS |
+                        AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE,
     .priv_class       = &X262_class,
     .defaults         = x264_defaults,
     .pix_fmts         = pix_fmts_8bit,
-    .caps_internal    = FF_CODEC_CAP_INIT_THREADSAFE |
-                        FF_CODEC_CAP_INIT_CLEANUP,
+    .caps_internal    = FF_CODEC_CAP_INIT_CLEANUP,
     .wrapper_name     = "libx264",
 };
 #endif
diff --git a/libavcodec/libx265.c b/libavcodec/libx265.c
index 27c90b3..e42c7b4 100644
--- a/libavcodec/libx265.c
+++ b/libavcodec/libx265.c
@@ -42,11 +42,18 @@
     const x265_api *api;
 
     float crf;
+    int   cqp;
     int   forced_idr;
     char *preset;
     char *tune;
     char *profile;
-    char *x265_opts;
+    AVDictionary *x265_opts;
+
+    /**
+     * If the encoder does not support ROI then warn the first time we
+     * encounter a frame with ROI side data.
+     */
+    int roi_warned;
 } libx265Context;
 
 static int is_keyframe(NalUnitType naltype)
@@ -76,9 +83,41 @@
     return 0;
 }
 
+static av_cold int libx265_param_parse_float(AVCodecContext *avctx,
+                                           const char *key, float value)
+{
+    libx265Context *ctx = avctx->priv_data;
+    char buf[256];
+
+    snprintf(buf, sizeof(buf), "%2.2f", value);
+    if (ctx->api->param_parse(ctx->params, key, buf) == X265_PARAM_BAD_VALUE) {
+        av_log(avctx, AV_LOG_ERROR, "Invalid value %2.2f for param \"%s\".\n", value, key);
+        return AVERROR(EINVAL);
+    }
+
+    return 0;
+}
+
+static av_cold int libx265_param_parse_int(AVCodecContext *avctx,
+                                           const char *key, int value)
+{
+    libx265Context *ctx = avctx->priv_data;
+    char buf[256];
+
+    snprintf(buf, sizeof(buf), "%d", value);
+    if (ctx->api->param_parse(ctx->params, key, buf) == X265_PARAM_BAD_VALUE) {
+        av_log(avctx, AV_LOG_ERROR, "Invalid value %d for param \"%s\".\n", value, key);
+        return AVERROR(EINVAL);
+    }
+
+    return 0;
+}
+
 static av_cold int libx265_encode_init(AVCodecContext *avctx)
 {
     libx265Context *ctx = avctx->priv_data;
+    AVCPBProperties *cpb_props = NULL;
+    int ret;
 
     ctx->api = x265_api_get(av_pix_fmt_desc_get(avctx->pix_fmt)->comp[0].depth);
     if (!ctx->api)
@@ -109,8 +148,13 @@
     }
 
     ctx->params->frameNumThreads = avctx->thread_count;
-    ctx->params->fpsNum          = avctx->time_base.den;
-    ctx->params->fpsDenom        = avctx->time_base.num * avctx->ticks_per_frame;
+    if (avctx->framerate.num > 0 && avctx->framerate.den > 0) {
+        ctx->params->fpsNum      = avctx->framerate.num;
+        ctx->params->fpsDenom    = avctx->framerate.den;
+    } else {
+        ctx->params->fpsNum      = avctx->time_base.den;
+        ctx->params->fpsDenom    = avctx->time_base.num * avctx->ticks_per_frame;
+    }
     ctx->params->sourceWidth     = avctx->width;
     ctx->params->sourceHeight    = avctx->height;
     ctx->params->bEnablePsnr     = !!(avctx->flags & AV_CODEC_FLAG_PSNR);
@@ -127,6 +171,14 @@
         return AVERROR(EINVAL);
     }
 
+
+    ctx->params->vui.bEnableVideoSignalTypePresentFlag = 1;
+
+    ctx->params->vui.bEnableVideoFullRangeFlag = avctx->pix_fmt == AV_PIX_FMT_YUVJ420P ||
+                                                 avctx->pix_fmt == AV_PIX_FMT_YUVJ422P ||
+                                                 avctx->pix_fmt == AV_PIX_FMT_YUVJ444P ||
+                                                 avctx->color_range == AVCOL_RANGE_JPEG;
+
     if ((avctx->color_primaries <= AVCOL_PRI_SMPTE432 &&
          avctx->color_primaries != AVCOL_PRI_UNSPECIFIED) ||
         (avctx->color_trc <= AVCOL_TRC_ARIB_STD_B67 &&
@@ -134,12 +186,15 @@
         (avctx->colorspace <= AVCOL_SPC_ICTCP &&
          avctx->colorspace != AVCOL_SPC_UNSPECIFIED)) {
 
-        ctx->params->vui.bEnableVideoSignalTypePresentFlag  = 1;
         ctx->params->vui.bEnableColorDescriptionPresentFlag = 1;
 
         // x265 validates the parameters internally
         ctx->params->vui.colorPrimaries          = avctx->color_primaries;
         ctx->params->vui.transferCharacteristics = avctx->color_trc;
+#if X265_BUILD >= 159
+        if (avctx->color_trc == AVCOL_TRC_ARIB_STD_B67)
+            ctx->params->preferredTransferCharacteristics = ctx->params->vui.transferCharacteristics;
+#endif
         ctx->params->vui.matrixCoeffs            = avctx->colorspace;
     }
 
@@ -203,36 +258,101 @@
     } else if (avctx->bit_rate > 0) {
         ctx->params->rc.bitrate         = avctx->bit_rate / 1000;
         ctx->params->rc.rateControlMode = X265_RC_ABR;
+    } else if (ctx->cqp >= 0) {
+        ret = libx265_param_parse_int(avctx, "qp", ctx->cqp);
+        if (ret < 0)
+            return ret;
+    }
+
+#if X265_BUILD >= 89
+    if (avctx->qmin >= 0) {
+        ret = libx265_param_parse_int(avctx, "qpmin", avctx->qmin);
+        if (ret < 0)
+            return ret;
+    }
+    if (avctx->qmax >= 0) {
+        ret = libx265_param_parse_int(avctx, "qpmax", avctx->qmax);
+        if (ret < 0)
+            return ret;
+    }
+#endif
+    if (avctx->max_qdiff >= 0) {
+        ret = libx265_param_parse_int(avctx, "qpstep", avctx->max_qdiff);
+        if (ret < 0)
+            return ret;
+    }
+    if (avctx->qblur >= 0) {
+        ret = libx265_param_parse_float(avctx, "qblur", avctx->qblur);
+        if (ret < 0)
+            return ret;
+    }
+    if (avctx->qcompress >= 0) {
+        ret = libx265_param_parse_float(avctx, "qcomp", avctx->qcompress);
+        if (ret < 0)
+            return ret;
+    }
+    if (avctx->i_quant_factor >= 0) {
+        ret = libx265_param_parse_float(avctx, "ipratio", avctx->i_quant_factor);
+        if (ret < 0)
+            return ret;
+    }
+    if (avctx->b_quant_factor >= 0) {
+        ret = libx265_param_parse_float(avctx, "pbratio", avctx->b_quant_factor);
+        if (ret < 0)
+            return ret;
     }
 
     ctx->params->rc.vbvBufferSize = avctx->rc_buffer_size / 1000;
     ctx->params->rc.vbvMaxBitrate = avctx->rc_max_rate    / 1000;
 
+    cpb_props = ff_add_cpb_side_data(avctx);
+    if (!cpb_props)
+        return AVERROR(ENOMEM);
+    cpb_props->buffer_size = ctx->params->rc.vbvBufferSize * 1000;
+    cpb_props->max_bitrate = ctx->params->rc.vbvMaxBitrate * 1000;
+    cpb_props->avg_bitrate = ctx->params->rc.bitrate       * 1000;
+
     if (!(avctx->flags & AV_CODEC_FLAG_GLOBAL_HEADER))
         ctx->params->bRepeatHeaders = 1;
 
-    if (ctx->x265_opts) {
-        AVDictionary *dict    = NULL;
+    if (avctx->gop_size >= 0) {
+        ret = libx265_param_parse_int(avctx, "keyint", avctx->gop_size);
+        if (ret < 0)
+            return ret;
+    }
+    if (avctx->keyint_min > 0) {
+        ret = libx265_param_parse_int(avctx, "min-keyint", avctx->keyint_min);
+        if (ret < 0)
+            return ret;
+    }
+    if (avctx->max_b_frames >= 0) {
+        ret = libx265_param_parse_int(avctx, "bframes", avctx->max_b_frames);
+        if (ret < 0)
+            return ret;
+    }
+    if (avctx->refs >= 0) {
+        ret = libx265_param_parse_int(avctx, "ref", avctx->refs);
+        if (ret < 0)
+            return ret;
+    }
+
+    {
         AVDictionaryEntry *en = NULL;
+        while ((en = av_dict_get(ctx->x265_opts, "", en, AV_DICT_IGNORE_SUFFIX))) {
+            int parse_ret = ctx->api->param_parse(ctx->params, en->key, en->value);
 
-        if (!av_dict_parse_string(&dict, ctx->x265_opts, "=", ":", 0)) {
-            while ((en = av_dict_get(dict, "", en, AV_DICT_IGNORE_SUFFIX))) {
-                int parse_ret = ctx->api->param_parse(ctx->params, en->key, en->value);
-
-                switch (parse_ret) {
-                case X265_PARAM_BAD_NAME:
-                    av_log(avctx, AV_LOG_WARNING,
-                          "Unknown option: %s.\n", en->key);
-                    break;
-                case X265_PARAM_BAD_VALUE:
-                    av_log(avctx, AV_LOG_WARNING,
-                          "Invalid value for %s: %s.\n", en->key, en->value);
-                    break;
-                default:
-                    break;
-                }
+            switch (parse_ret) {
+            case X265_PARAM_BAD_NAME:
+                av_log(avctx, AV_LOG_WARNING,
+                      "Unknown option: %s.\n", en->key);
+                break;
+            case X265_PARAM_BAD_VALUE:
+                av_log(avctx, AV_LOG_WARNING,
+                      "Invalid value for %s: %s.\n", en->key, en->value);
+                break;
+            default:
+                break;
             }
-            av_dict_free(&dict);
         }
     }
 
@@ -280,11 +400,76 @@
         }
 
         memcpy(avctx->extradata, nal[0].payload, avctx->extradata_size);
+        memset(avctx->extradata + avctx->extradata_size, 0, AV_INPUT_BUFFER_PADDING_SIZE);
     }
 
     return 0;
 }
 
+static av_cold int libx265_encode_set_roi(libx265Context *ctx, const AVFrame *frame, x265_picture* pic)
+{
+    AVFrameSideData *sd = av_frame_get_side_data(frame, AV_FRAME_DATA_REGIONS_OF_INTEREST);
+    if (sd) {
+        if (ctx->params->rc.aqMode == X265_AQ_NONE) {
+            if (!ctx->roi_warned) {
+                ctx->roi_warned = 1;
+                av_log(ctx, AV_LOG_WARNING, "Adaptive quantization must be enabled to use ROI encoding, skipping ROI.\n");
+            }
+        } else {
+            /* 8x8 block when qg-size is 8, 16*16 block otherwise. */
+            int mb_size = (ctx->params->rc.qgSize == 8) ? 8 : 16;
+            int mbx = (frame->width + mb_size - 1) / mb_size;
+            int mby = (frame->height + mb_size - 1) / mb_size;
+            int qp_range = 51 + 6 * (pic->bitDepth - 8);
+            int nb_rois;
+            const AVRegionOfInterest *roi;
+            uint32_t roi_size;
+            float *qoffsets;         /* will be freed after encode is called. */
+
+            roi = (const AVRegionOfInterest*)sd->data;
+            roi_size = roi->self_size;
+            if (!roi_size || sd->size % roi_size != 0) {
+                av_log(ctx, AV_LOG_ERROR, "Invalid AVRegionOfInterest.self_size.\n");
+                return AVERROR(EINVAL);
+            }
+            nb_rois = sd->size / roi_size;
+
+            qoffsets = av_mallocz_array(mbx * mby, sizeof(*qoffsets));
+            if (!qoffsets)
+                return AVERROR(ENOMEM);
+
+            // This list must be iterated in reverse because the first
+            // region in the list applies when regions overlap.
+            for (int i = nb_rois - 1; i >= 0; i--) {
+                int startx, endx, starty, endy;
+                float qoffset;
+
+                roi = (const AVRegionOfInterest*)(sd->data + roi_size * i);
+
+                starty = FFMIN(mby, roi->top / mb_size);
+                endy   = FFMIN(mby, (roi->bottom + mb_size - 1)/ mb_size);
+                startx = FFMIN(mbx, roi->left / mb_size);
+                endx   = FFMIN(mbx, (roi->right + mb_size - 1)/ mb_size);
+
+                if (roi->qoffset.den == 0) {
+                    av_free(qoffsets);
+                    av_log(ctx, AV_LOG_ERROR, "AVRegionOfInterest.qoffset.den must not be zero.\n");
+                    return AVERROR(EINVAL);
+                }
+                qoffset = roi->qoffset.num * 1.0f / roi->qoffset.den;
+                qoffset = av_clipf(qoffset * qp_range, -qp_range, +qp_range);
+
+                for (int y = starty; y < endy; y++)
+                    for (int x = startx; x < endx; x++)
+                        qoffsets[x + y*mbx] = qoffset;
+            }
+
+            pic->quantOffsets = qoffsets;
+        }
+    }
+    return 0;
+}
+
 static int libx265_encode_frame(AVCodecContext *avctx, AVPacket *pkt,
                                 const AVFrame *pic, int *got_packet)
 {
@@ -293,6 +478,7 @@
     x265_picture x265pic_out = { 0 };
     x265_nal *nal;
     uint8_t *dst;
+    int pict_type;
     int payload = 0;
     int nnal;
     int ret;
@@ -314,10 +500,17 @@
                             pic->pict_type == AV_PICTURE_TYPE_P ? X265_TYPE_P :
                             pic->pict_type == AV_PICTURE_TYPE_B ? X265_TYPE_B :
                             X265_TYPE_AUTO;
+
+        ret = libx265_encode_set_roi(ctx, pic, &x265pic);
+        if (ret < 0)
+            return ret;
     }
 
     ret = ctx->api->encoder_encode(ctx->encoder, &nal, &nnal,
                                    pic ? &x265pic : NULL, &x265pic_out);
+
+    av_freep(&x265pic.quantOffsets);
+
     if (ret < 0)
         return AVERROR_EXTERNAL;
 
@@ -345,20 +538,23 @@
     pkt->pts = x265pic_out.pts;
     pkt->dts = x265pic_out.dts;
 
-#if FF_API_CODED_FRAME
-FF_DISABLE_DEPRECATION_WARNINGS
     switch (x265pic_out.sliceType) {
     case X265_TYPE_IDR:
     case X265_TYPE_I:
-        avctx->coded_frame->pict_type = AV_PICTURE_TYPE_I;
+        pict_type = AV_PICTURE_TYPE_I;
         break;
     case X265_TYPE_P:
-        avctx->coded_frame->pict_type = AV_PICTURE_TYPE_P;
+        pict_type = AV_PICTURE_TYPE_P;
         break;
     case X265_TYPE_B:
-        avctx->coded_frame->pict_type = AV_PICTURE_TYPE_B;
+    case X265_TYPE_BREF:
+        pict_type = AV_PICTURE_TYPE_B;
         break;
     }
+
+#if FF_API_CODED_FRAME
+FF_DISABLE_DEPRECATION_WARNINGS
+    avctx->coded_frame->pict_type = pict_type;
 FF_ENABLE_DEPRECATION_WARNINGS
 #endif
 
@@ -369,14 +565,19 @@
 #endif
         pkt->flags |= AV_PKT_FLAG_DISPOSABLE;
 
+    ff_side_data_set_encoder_stats(pkt, x265pic_out.frameData.qp * FF_QP2LAMBDA, NULL, 0, pict_type);
+
     *got_packet = 1;
     return 0;
 }
 
 static const enum AVPixelFormat x265_csp_eight[] = {
     AV_PIX_FMT_YUV420P,
+    AV_PIX_FMT_YUVJ420P,
     AV_PIX_FMT_YUV422P,
+    AV_PIX_FMT_YUVJ422P,
     AV_PIX_FMT_YUV444P,
+    AV_PIX_FMT_YUVJ444P,
     AV_PIX_FMT_GBRP,
     AV_PIX_FMT_GRAY8,
     AV_PIX_FMT_NONE
@@ -384,8 +585,11 @@
 
 static const enum AVPixelFormat x265_csp_ten[] = {
     AV_PIX_FMT_YUV420P,
+    AV_PIX_FMT_YUVJ420P,
     AV_PIX_FMT_YUV422P,
+    AV_PIX_FMT_YUVJ422P,
     AV_PIX_FMT_YUV444P,
+    AV_PIX_FMT_YUVJ444P,
     AV_PIX_FMT_GBRP,
     AV_PIX_FMT_YUV420P10,
     AV_PIX_FMT_YUV422P10,
@@ -398,8 +602,11 @@
 
 static const enum AVPixelFormat x265_csp_twelve[] = {
     AV_PIX_FMT_YUV420P,
+    AV_PIX_FMT_YUVJ420P,
     AV_PIX_FMT_YUV422P,
+    AV_PIX_FMT_YUVJ422P,
     AV_PIX_FMT_YUV444P,
+    AV_PIX_FMT_YUVJ444P,
     AV_PIX_FMT_GBRP,
     AV_PIX_FMT_YUV420P10,
     AV_PIX_FMT_YUV422P10,
@@ -429,11 +636,12 @@
 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
 static const AVOption options[] = {
     { "crf",         "set the x265 crf",                                                            OFFSET(crf),       AV_OPT_TYPE_FLOAT,  { .dbl = -1 }, -1, FLT_MAX, VE },
+    { "qp",          "set the x265 qp",                                                             OFFSET(cqp),       AV_OPT_TYPE_INT,    { .i64 = -1 }, -1, INT_MAX, VE },
     { "forced-idr",  "if forcing keyframes, force them as IDR frames",                              OFFSET(forced_idr),AV_OPT_TYPE_BOOL,   { .i64 =  0 },  0,       1, VE },
     { "preset",      "set the x265 preset",                                                         OFFSET(preset),    AV_OPT_TYPE_STRING, { 0 }, 0, 0, VE },
     { "tune",        "set the x265 tune parameter",                                                 OFFSET(tune),      AV_OPT_TYPE_STRING, { 0 }, 0, 0, VE },
     { "profile",     "set the x265 profile",                                                        OFFSET(profile),   AV_OPT_TYPE_STRING, { 0 }, 0, 0, VE },
-    { "x265-params", "set the x265 configuration using a :-separated list of key=value parameters", OFFSET(x265_opts), AV_OPT_TYPE_STRING, { 0 }, 0, 0, VE },
+    { "x265-params", "set the x265 configuration using a :-separated list of key=value parameters", OFFSET(x265_opts), AV_OPT_TYPE_DICT,   { 0 }, 0, 0, VE },
     { NULL }
 };
 
@@ -446,6 +654,17 @@
 
 static const AVCodecDefault x265_defaults[] = {
     { "b", "0" },
+    { "bf", "-1" },
+    { "g", "-1" },
+    { "keyint_min", "-1" },
+    { "refs", "-1" },
+    { "qmin", "-1" },
+    { "qmax", "-1" },
+    { "qdiff", "-1" },
+    { "qblur", "-1" },
+    { "qcomp", "-1" },
+    { "i_qfactor", "-1" },
+    { "b_qfactor", "-1" },
     { NULL },
 };
 
diff --git a/libavcodec/libxavs2.c b/libavcodec/libxavs2.c
index 2b47d0c..76b57e7 100644
--- a/libavcodec/libxavs2.c
+++ b/libavcodec/libxavs2.c
@@ -31,7 +31,7 @@
     int err; \
     av_strlcatf(opt_str, sizeof(opt_str), format, __VA_ARGS__); \
     err = cae->api->opt_set2(cae->param, name, opt_str); \
-    if (err) {\
+    if (err < 0) {\
         av_log(avctx, AV_LOG_WARNING, "Invalid value for %s: %s\n", name, opt_str);\
     }\
 } while(0);
@@ -46,10 +46,9 @@
     int min_qp;
     int preset_level;
     int log_level;
-    int hierarchical_reference;
 
     void *encoder;
-    char *xavs2_opts;
+    AVDictionary *xavs2_opts;
 
     xavs2_outpacket_t packet;
     xavs2_param_t *param;
@@ -60,7 +59,7 @@
 
 static av_cold int xavs2_init(AVCodecContext *avctx)
 {
-    XAVS2EContext *cae= avctx->priv_data;
+    XAVS2EContext *cae = avctx->priv_data;
     int bit_depth, code;
 
     bit_depth = avctx->pix_fmt == AV_PIX_FMT_YUV420P ? 8 : 10;
@@ -68,63 +67,55 @@
     /* get API handler */
     cae->api = xavs2_api_get(bit_depth);
     if (!cae->api) {
-        av_log(avctx, AV_LOG_ERROR, "api get failed\n");
+        av_log(avctx, AV_LOG_ERROR, "Failed to get xavs2 api context\n");
         return AVERROR_EXTERNAL;
     }
 
     cae->param = cae->api->opt_alloc();
     if (!cae->param) {
-        av_log(avctx, AV_LOG_ERROR, "param alloc failed\n");
+        av_log(avctx, AV_LOG_ERROR, "Failed to alloc xavs2 parameters\n");
         return AVERROR(ENOMEM);
     }
 
-    xavs2_opt_set2("width",     "%d", avctx->width);
-    xavs2_opt_set2("height",    "%d", avctx->height);
-    xavs2_opt_set2("bframes",   "%d", avctx->max_b_frames);
-    xavs2_opt_set2("bitdepth",  "%d", bit_depth);
-    xavs2_opt_set2("log",       "%d", cae->log_level);
-    xavs2_opt_set2("preset",    "%d", cae->preset_level);
+    xavs2_opt_set2("Width",     "%d", avctx->width);
+    xavs2_opt_set2("Height",    "%d", avctx->height);
+    xavs2_opt_set2("BFrames",   "%d", avctx->max_b_frames);
+    xavs2_opt_set2("BitDepth",  "%d", bit_depth);
+    xavs2_opt_set2("Log",       "%d", cae->log_level);
+    xavs2_opt_set2("Preset",    "%d", cae->preset_level);
 
-    /* not the same parameter as the IntraPeriod in xavs2 log */
-    xavs2_opt_set2("intraperiod",       "%d", avctx->gop_size);
+    xavs2_opt_set2("IntraPeriodMax",    "%d", avctx->gop_size);
+    xavs2_opt_set2("IntraPeriodMin",    "%d", avctx->gop_size);
 
-    xavs2_opt_set2("thread_frames",     "%d", avctx->thread_count);
-    xavs2_opt_set2("thread_rows",       "%d", cae->lcu_row_threads);
+    xavs2_opt_set2("ThreadFrames",      "%d", avctx->thread_count);
+    xavs2_opt_set2("ThreadRows",        "%d", cae->lcu_row_threads);
 
-    xavs2_opt_set2("OpenGOP",  "%d", 1);
+    xavs2_opt_set2("OpenGOP",  "%d", !(avctx->flags & AV_CODEC_FLAG_CLOSED_GOP));
 
-    if (cae->xavs2_opts) {
-        AVDictionary *dict    = NULL;
+    {
         AVDictionaryEntry *en = NULL;
-
-        if (!av_dict_parse_string(&dict, cae->xavs2_opts, "=", ":", 0)) {
-            while ((en = av_dict_get(dict, "", en, AV_DICT_IGNORE_SUFFIX))) {
-                xavs2_opt_set2(en->key, "%s", en->value);
-            }
-            av_dict_free(&dict);
-        }
+        while ((en = av_dict_get(cae->xavs2_opts, "", en, AV_DICT_IGNORE_SUFFIX)))
+            xavs2_opt_set2(en->key, "%s", en->value);
     }
 
     /* Rate control */
     if (avctx->bit_rate > 0) {
         xavs2_opt_set2("RateControl",   "%d", 1);
         xavs2_opt_set2("TargetBitRate", "%"PRId64"", avctx->bit_rate);
-        xavs2_opt_set2("initial_qp",    "%d", cae->initial_qp);
-        xavs2_opt_set2("max_qp",        "%d", cae->max_qp);
-        xavs2_opt_set2("min_qp",        "%d", cae->min_qp);
+        xavs2_opt_set2("InitialQP",     "%d", cae->initial_qp);
+        xavs2_opt_set2("MaxQP",         "%d", avctx->qmax >= 0 ? avctx->qmax : cae->max_qp);
+        xavs2_opt_set2("MinQP",         "%d", avctx->qmin >= 0 ? avctx->qmin : cae->min_qp);
     } else {
-        xavs2_opt_set2("initial_qp",    "%d", cae->qp);
+        xavs2_opt_set2("InitialQP",     "%d", cae->qp);
     }
 
-
     ff_mpeg12_find_best_frame_rate(avctx->framerate, &code, NULL, NULL, 0);
-
     xavs2_opt_set2("FrameRate",   "%d", code);
 
     cae->encoder = cae->api->encoder_create(cae->param);
 
     if (!cae->encoder) {
-        av_log(avctx,AV_LOG_ERROR, "Can not create encoder. Null pointer returned\n");
+        av_log(avctx, AV_LOG_ERROR, "Failed to create xavs2 encoder instance.\n");
         return AVERROR(EINVAL);
     }
 
@@ -133,35 +124,48 @@
 
 static void xavs2_copy_frame_with_shift(xavs2_picture_t *pic, const AVFrame *frame, const int shift_in)
 {
-    int j, k;
-    for (k = 0; k < 3; k++) {
-        int i_stride = pic->img.i_stride[k];
-        for (j = 0; j < pic->img.i_lines[k]; j++) {
-            uint16_t *p_plane = (uint16_t *)&pic->img.img_planes[k][j * i_stride];
-            int i;
-            uint8_t *p_buffer = frame->data[k] + frame->linesize[k] * j;
-            memset(p_plane, 0, i_stride);
-            for (i = 0; i < pic->img.i_width[k]; i++) {
-                p_plane[i] = p_buffer[i] << shift_in;
+    uint16_t *p_plane;
+    uint8_t *p_buffer;
+    int plane;
+    int hIdx;
+    int wIdx;
+
+    for (plane = 0; plane < 3; plane++) {
+        p_plane = (uint16_t *)pic->img.img_planes[plane];
+        p_buffer = frame->data[plane];
+        for (hIdx = 0; hIdx < pic->img.i_lines[plane]; hIdx++) {
+            memset(p_plane, 0, pic->img.i_stride[plane]);
+            for (wIdx = 0; wIdx < pic->img.i_width[plane]; wIdx++) {
+                p_plane[wIdx] = p_buffer[wIdx] << shift_in;
             }
+            p_plane += pic->img.i_stride[plane];
+            p_buffer += frame->linesize[plane];
         }
     }
 }
 
 static void xavs2_copy_frame(xavs2_picture_t *pic, const AVFrame *frame)
 {
-    int j, k;
-    for (k = 0; k < 3; k++) {
-        for (j = 0; j < pic->img.i_lines[k]; j++) {
-            memcpy( pic->img.img_planes[k] + pic->img.i_stride[k] * j,
-                    frame->data[k]+frame->linesize[k] * j,
-                    pic->img.i_width[k] * pic->img.in_sample_size);
+    uint8_t *p_plane;
+    uint8_t *p_buffer;
+    int plane;
+    int hIdx;
+    int stride;
+
+    for (plane = 0; plane < 3; plane++) {
+        p_plane = pic->img.img_planes[plane];
+        p_buffer = frame->data[plane];
+        stride = pic->img.i_width[plane] * pic->img.in_sample_size;
+        for (hIdx = 0; hIdx < pic->img.i_lines[plane]; hIdx++) {
+            memcpy(p_plane, p_buffer, stride);
+            p_plane += pic->img.i_stride[plane];
+            p_buffer += frame->linesize[plane];
         }
     }
 }
 
 static int xavs2_encode_frame(AVCodecContext *avctx, AVPacket *pkt,
-                      const AVFrame *frame, int *got_packet)
+                              const AVFrame *frame, int *got_packet)
 {
     XAVS2EContext *cae = avctx->priv_data;
     xavs2_picture_t pic;
@@ -170,27 +174,27 @@
     /* create the XAVS2 video encoder */
     /* read frame data and send to the XAVS2 video encoder */
     if (cae->api->encoder_get_buffer(cae->encoder, &pic) < 0) {
-        av_log(avctx,AV_LOG_ERROR, "failed to get frame buffer\n");
+        av_log(avctx, AV_LOG_ERROR, "Failed to get xavs2 frame buffer\n");
         return AVERROR_EXTERNAL;
     }
     if (frame) {
         switch (frame->format) {
-            case AV_PIX_FMT_YUV420P:
-                if (pic.img.in_sample_size == pic.img.enc_sample_size) {
-                    xavs2_copy_frame(&pic, frame);
-                } else {
-                    const int shift_in = atoi(cae->api->opt_get(cae->param, "SampleShift"));
-                    xavs2_copy_frame_with_shift(&pic, frame, shift_in);
-                }
+        case AV_PIX_FMT_YUV420P:
+            if (pic.img.in_sample_size == pic.img.enc_sample_size) {
+                xavs2_copy_frame(&pic, frame);
+            } else {
+                const int shift_in = atoi(cae->api->opt_get(cae->param, "SampleShift"));
+                xavs2_copy_frame_with_shift(&pic, frame, shift_in);
+            }
             break;
-            case AV_PIX_FMT_YUV420P10:
-                if (pic.img.in_sample_size == pic.img.enc_sample_size) {
-                    xavs2_copy_frame(&pic, frame);
-                    break;
-                }
-            default:
-                av_log(avctx, AV_LOG_ERROR, "Unsupported pixel format\n");
-                return AVERROR(EINVAL);
+        case AV_PIX_FMT_YUV420P10:
+            if (pic.img.in_sample_size == pic.img.enc_sample_size) {
+                xavs2_copy_frame(&pic, frame);
+                break;
+            }
+        default:
+            av_log(avctx, AV_LOG_ERROR, "Unsupported pixel format\n");
+            return AVERROR(EINVAL);
             break;
         }
 
@@ -201,7 +205,7 @@
         ret = cae->api->encoder_encode(cae->encoder, &pic, &cae->packet);
 
         if (ret) {
-            av_log(avctx, AV_LOG_ERROR, "encode failed\n");
+            av_log(avctx, AV_LOG_ERROR, "Encoding error occured.\n");
             return AVERROR_EXTERNAL;
         }
 
@@ -209,10 +213,9 @@
         cae->api->encoder_encode(cae->encoder, NULL, &cae->packet);
     }
 
-    if ((cae->packet.len) && (cae->packet.state != XAVS2_STATE_FLUSH_END)){
-
-        if (av_new_packet(pkt, cae->packet.len) < 0){
-            av_log(avctx, AV_LOG_ERROR, "packet alloc failed\n");
+    if ((cae->packet.len) && (cae->packet.state != XAVS2_STATE_FLUSH_END)) {
+        if (av_new_packet(pkt, cae->packet.len) < 0) {
+            av_log(avctx, AV_LOG_ERROR, "Failed to alloc xavs2 packet.\n");
             cae->api->encoder_packet_unref(cae->encoder, &cae->packet);
             return AVERROR(ENOMEM);
         }
@@ -258,7 +261,7 @@
     { "min_qp"          ,   "min qp for rate control" ,                 OFFSET(min_qp)          , AV_OPT_TYPE_INT, {.i64 = 20 },  0,      63,  VE },
     { "speed_level"     ,   "Speed level, higher is better but slower", OFFSET(preset_level)    , AV_OPT_TYPE_INT, {.i64 =  0 },  0,       9,  VE },
     { "log_level"       ,   "log level: -1: none, 0: error, 1: warning, 2: info, 3: debug", OFFSET(log_level)    , AV_OPT_TYPE_INT, {.i64 =  0 },  -1,       3,  VE },
-    { "xavs2-params"    ,   "set the xavs2 configuration using a :-separated list of key=value parameters", OFFSET(xavs2_opts), AV_OPT_TYPE_STRING, { 0 }, 0, 0, VE },
+    { "xavs2-params"    ,   "set the xavs2 configuration using a :-separated list of key=value parameters", OFFSET(xavs2_opts), AV_OPT_TYPE_DICT, { 0 }, 0, 0, VE },
     { NULL },
 };
 
@@ -271,7 +274,7 @@
 
 static const AVCodecDefault xavs2_defaults[] = {
     { "b",                "0" },
-    { "g",                "48" },
+    { "g",                "48"},
     { "bf",               "7" },
     { NULL },
 };
@@ -286,7 +289,8 @@
     .encode2        = xavs2_encode_frame,
     .close          = xavs2_close,
     .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AUTO_THREADS,
-    .pix_fmts       = (const enum AVPixelFormat[]) { AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUV420P10, AV_PIX_FMT_NONE },
+    .pix_fmts       = (const enum AVPixelFormat[]) { AV_PIX_FMT_YUV420P,
+                                                     AV_PIX_FMT_NONE },
     .priv_class     = &libxavs2,
     .defaults       = xavs2_defaults,
     .wrapper_name   = "libxavs2",
diff --git a/libavcodec/libzvbi-teletextdec.c b/libavcodec/libzvbi-teletextdec.c
index 3515f33..8031b02 100644
--- a/libavcodec/libzvbi-teletextdec.c
+++ b/libavcodec/libzvbi-teletextdec.c
@@ -55,6 +55,7 @@
 {
     AVClass        *class;
     char           *pgno;
+    int             default_region;
     int             x_offset;
     int             y_offset;
     int             format_id; /* 0 = bitmap, 1 = text/ass, 2 = ass */
@@ -635,7 +636,7 @@
     return lines;
 }
 
-static int teletext_decode_frame(AVCodecContext *avctx, void *data, int *data_size, AVPacket *pkt)
+static int teletext_decode_frame(AVCodecContext *avctx, void *data, int *got_sub_ptr, AVPacket *pkt)
 {
     TeletextContext *ctx = avctx->priv_data;
     AVSubtitle      *sub = data;
@@ -645,6 +646,10 @@
     if (!ctx->vbi) {
         if (!(ctx->vbi = vbi_decoder_new()))
             return AVERROR(ENOMEM);
+        if (ctx->default_region != -1) {
+            av_log(avctx, AV_LOG_INFO, "Setting default zvbi region to %i\n", ctx->default_region);
+            vbi_teletext_set_default_region(ctx->vbi, ctx->default_region);
+        }
         if (!vbi_event_handler_register(ctx->vbi, VBI_EVENT_TTX_PAGE, handler, ctx)) {
             vbi_decoder_delete(ctx->vbi);
             ctx->vbi = NULL;
@@ -719,9 +724,9 @@
         ctx->nb_pages--;
 
         if (ret >= 0)
-            *data_size = 1;
+            *got_sub_ptr = 1;
     } else
-        *data_size = 0;
+        *got_sub_ptr = 0;
 
     return ret;
 }
@@ -792,6 +797,7 @@
 #define SD AV_OPT_FLAG_SUBTITLE_PARAM | AV_OPT_FLAG_DECODING_PARAM
 static const AVOption options[] = {
     {"txt_page",        "page numbers to decode, subtitle for subtitles, * for all", OFFSET(pgno),   AV_OPT_TYPE_STRING, {.str = "*"},      0, 0,        SD},
+    {"txt_default_region", "default G0 character set used for decoding",     OFFSET(default_region), AV_OPT_TYPE_INT,    {.i64 = -1},      -1, 80,       SD},
     {"txt_chop_top",    "discards the top teletext line",                    OFFSET(chop_top),       AV_OPT_TYPE_INT,    {.i64 = 1},        0, 1,        SD},
     {"txt_format",      "format of the subtitles (bitmap or text or ass)",   OFFSET(format_id),      AV_OPT_TYPE_INT,    {.i64 = 0},        0, 2,        SD,  "txt_format"},
     {"bitmap",          NULL,                                                0,                      AV_OPT_TYPE_CONST,  {.i64 = 0},        0, 0,        SD,  "txt_format"},
diff --git a/libavcodec/loco.c b/libavcodec/loco.c
index 741db3b..e891d83 100644
--- a/libavcodec/loco.c
+++ b/libavcodec/loco.c
@@ -88,6 +88,8 @@
         loco_update_rice_param(r, 0);
         return 0;
     }
+    if (get_bits_left(&r->gb) < 1)
+        return INT_MIN;
     v = get_ur_golomb_jpegls(&r->gb, loco_get_rice_param(r), INT_MAX, 0);
     loco_update_rice_param(r, (v + 1) >> 1);
     if (!v) {
@@ -153,16 +155,22 @@
     /* restore top line */
     for (i = 1; i < width; i++) {
         val = loco_get_rice(&rc);
+        if (val == INT_MIN)
+           return AVERROR_INVALIDDATA;
         data[i] = data[i - 1] + val;
     }
     data += stride;
     for (j = 1; j < height; j++) {
         /* restore left column */
         val = loco_get_rice(&rc);
+        if (val == INT_MIN)
+           return AVERROR_INVALIDDATA;
         data[0] = data[-stride] + val;
         /* restore all other pixels */
         for (i = 1; i < width; i++) {
             val = loco_get_rice(&rc);
+            if (val == INT_MIN)
+                return -1;
             data[i] = loco_predict(&data[i], stride) + val;
         }
         data += stride;
@@ -295,6 +303,11 @@
         avpriv_request_sample(avctx, "LOCO codec version %i", version);
     }
 
+    if (l->lossy > 65536U) {
+        av_log(avctx, AV_LOG_ERROR, "lossy %i is too large\n", l->lossy);
+        return AVERROR_INVALIDDATA;
+    }
+
     l->mode = AV_RL32(avctx->extradata + 4);
     switch (l->mode) {
     case LOCO_CYUY2:
diff --git a/libavcodec/lsp.c b/libavcodec/lsp.c
index 9aba020..fb4da47 100644
--- a/libavcodec/lsp.c
+++ b/libavcodec/lsp.c
@@ -108,7 +108,7 @@
     int i, j;
 
     f[0] = 0x400000;          // 1.0 in (3.22)
-    f[1] = -lsp[0] << 8;      // *2 and (0.15) -> (3.22)
+    f[1] = -lsp[0] * 256;     // *2 and (0.15) -> (3.22)
 
     for(i=2; i<=lp_half_order; i++)
     {
@@ -116,7 +116,7 @@
         for(j=i; j>1; j--)
             f[j] -= MULL(f[j-1], lsp[2*i-2], FRAC_BITS) - f[j-2];
 
-        f[1] -= lsp[2*i-2] << 8;
+        f[1] -= lsp[2*i-2] * 256;
     }
 }
 
diff --git a/libavcodec/lzw.c b/libavcodec/lzw.c
index b0b9a34..e26e482 100644
--- a/libavcodec/lzw.c
+++ b/libavcodec/lzw.c
@@ -71,6 +71,9 @@
 {
     int c;
 
+    if (s->bbits < s->cursize && bytestream2_get_bytes_left(&s->gb) <= 0)
+        return s->end_code;
+
     if(s->mode == FF_LZW_GIF) {
         while (s->bbits < s->cursize) {
             if (!s->bs) {
diff --git a/libavcodec/m101.c b/libavcodec/m101.c
index d254966..70f1da4 100644
--- a/libavcodec/m101.c
+++ b/libavcodec/m101.c
@@ -61,7 +61,7 @@
     stride = AV_RL32(avctx->extradata + 5*4);
 
     if (avctx->pix_fmt == AV_PIX_FMT_YUV422P10)
-        min_stride = (avctx->width + 15) / 16 * 20;
+        min_stride = (avctx->width + 15) / 16 * 40;
 
     if (stride < min_stride || avpkt->size < stride * (uint64_t)avctx->height) {
         av_log(avctx, AV_LOG_ERROR, "stride (%d) is invalid for packet sized %d\n",
diff --git a/libavcodec/magicyuv.c b/libavcodec/magicyuv.c
index 1a129c2..5d76274 100644
--- a/libavcodec/magicyuv.c
+++ b/libavcodec/magicyuv.c
@@ -547,10 +547,7 @@
     s->hshift[2] =
     s->vshift[2] = 0;
     s->decorrelate = 0;
-    s->max = 256;
     s->bps = 8;
-    s->huff_build = huff_build;
-    s->magy_decode_slice = magy_decode_slice;
 
     format = bytestream2_get_byte(&gbyte);
     switch (format) {
@@ -587,54 +584,46 @@
         avctx->pix_fmt = AV_PIX_FMT_YUV422P10;
         s->hshift[1] =
         s->hshift[2] = 1;
-        s->max = 1024;
-        s->huff_build = huff_build10;
-        s->magy_decode_slice = magy_decode_slice10;
+        s->bps = 10;
+        break;
+    case 0x76:
+        avctx->pix_fmt = AV_PIX_FMT_YUV444P10;
         s->bps = 10;
         break;
     case 0x6d:
         avctx->pix_fmt = AV_PIX_FMT_GBRP10;
         s->decorrelate = 1;
-        s->max = 1024;
-        s->huff_build = huff_build10;
-        s->magy_decode_slice = magy_decode_slice10;
         s->bps = 10;
         break;
     case 0x6e:
         avctx->pix_fmt = AV_PIX_FMT_GBRAP10;
         s->decorrelate = 1;
-        s->max = 1024;
-        s->huff_build = huff_build10;
-        s->magy_decode_slice = magy_decode_slice10;
         s->bps = 10;
         break;
     case 0x6f:
         avctx->pix_fmt = AV_PIX_FMT_GBRP12;
         s->decorrelate = 1;
-        s->max = 4096;
-        s->huff_build = huff_build12;
-        s->magy_decode_slice = magy_decode_slice10;
         s->bps = 12;
         break;
     case 0x70:
         avctx->pix_fmt = AV_PIX_FMT_GBRAP12;
         s->decorrelate = 1;
-        s->max = 4096;
-        s->huff_build = huff_build12;
-        s->magy_decode_slice = magy_decode_slice10;
         s->bps = 12;
         break;
     case 0x73:
         avctx->pix_fmt = AV_PIX_FMT_GRAY10;
-        s->max = 1024;
-        s->huff_build = huff_build10;
-        s->magy_decode_slice = magy_decode_slice10;
         s->bps = 10;
         break;
     default:
         avpriv_request_sample(avctx, "Format 0x%X", format);
         return AVERROR_PATCHWELCOME;
     }
+    s->max = 1 << s->bps;
+    s->magy_decode_slice = s->bps == 8 ? magy_decode_slice : magy_decode_slice10;
+    if ( s->bps == 8)
+        s->huff_build = huff_build;
+    else
+        s->huff_build = s->bps == 10 ? huff_build10 : huff_build12;
     s->planes = av_pix_fmt_count_planes(avctx->pix_fmt);
 
     bytestream2_skip(&gbyte, 1);
@@ -670,6 +659,17 @@
         return AVERROR_INVALIDDATA;
     }
 
+    if (s->interlaced) {
+        if ((s->slice_height >> s->vshift[1]) < 2) {
+            av_log(avctx, AV_LOG_ERROR, "impossible slice height\n");
+            return AVERROR_INVALIDDATA;
+        }
+        if ((avctx->coded_height % s->slice_height) && ((avctx->coded_height % s->slice_height) >> s->vshift[1]) < 2) {
+            av_log(avctx, AV_LOG_ERROR, "impossible height\n");
+            return AVERROR_INVALIDDATA;
+        }
+    }
+
     for (i = 0; i < s->planes; i++) {
         av_fast_malloc(&s->slices[i], &s->slices_size[i], s->nb_slices * sizeof(Slice));
         if (!s->slices[i])
@@ -749,21 +749,6 @@
     return avpkt->size;
 }
 
-#if HAVE_THREADS
-static int magy_init_thread_copy(AVCodecContext *avctx)
-{
-    MagicYUVContext *s = avctx->priv_data;
-    int i;
-
-    for (i = 0; i < FF_ARRAY_ELEMS(s->slices); i++) {
-        s->slices[i] = NULL;
-        s->slices_size[i] = 0;
-    }
-
-    return 0;
-}
-#endif
-
 static av_cold int magy_decode_init(AVCodecContext *avctx)
 {
     MagicYUVContext *s = avctx->priv_data;
@@ -792,7 +777,6 @@
     .id               = AV_CODEC_ID_MAGICYUV,
     .priv_data_size   = sizeof(MagicYUVContext),
     .init             = magy_decode_init,
-    .init_thread_copy = ONLY_IF_THREADS_ENABLED(magy_init_thread_copy),
     .close            = magy_decode_end,
     .decode           = magy_decode_frame,
     .capabilities     = AV_CODEC_CAP_DR1 |
diff --git a/libavcodec/mdec.c b/libavcodec/mdec.c
index 330b761..7e34ec5 100644
--- a/libavcodec/mdec.c
+++ b/libavcodec/mdec.c
@@ -240,17 +240,6 @@
     return 0;
 }
 
-#if HAVE_THREADS
-static av_cold int decode_init_thread_copy(AVCodecContext *avctx)
-{
-    MDECContext * const a = avctx->priv_data;
-
-    a->avctx           = avctx;
-
-    return 0;
-}
-#endif
-
 static av_cold int decode_end(AVCodecContext *avctx)
 {
     MDECContext * const a = avctx->priv_data;
@@ -271,5 +260,4 @@
     .close            = decode_end,
     .decode           = decode_frame,
     .capabilities     = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_FRAME_THREADS,
-    .init_thread_copy = ONLY_IF_THREADS_ENABLED(decode_init_thread_copy)
 };
diff --git a/libavcodec/mediacodec_surface.c b/libavcodec/mediacodec_surface.c
index aada1ec..09a4229 100644
--- a/libavcodec/mediacodec_surface.c
+++ b/libavcodec/mediacodec_surface.c
@@ -25,23 +25,19 @@
 #include "ffjni.h"
 #include "mediacodec_surface.h"
 
-void *ff_mediacodec_surface_ref(void *surface, void *log_ctx)
+FFANativeWindow *ff_mediacodec_surface_ref(void *surface, void *log_ctx)
 {
     JNIEnv *env = NULL;
 
-    void *reference = NULL;
-
     env = ff_jni_get_env(log_ctx);
     if (!env) {
         return NULL;
     }
 
-    reference = (*env)->NewGlobalRef(env, surface);
-
-    return reference;
+    return (*env)->NewGlobalRef(env, surface);
 }
 
-int ff_mediacodec_surface_unref(void *surface, void *log_ctx)
+int ff_mediacodec_surface_unref(FFANativeWindow *window, void *log_ctx)
 {
     JNIEnv *env = NULL;
 
@@ -50,7 +46,7 @@
         return AVERROR_EXTERNAL;
     }
 
-    (*env)->DeleteGlobalRef(env, surface);
+    (*env)->DeleteGlobalRef(env, window);
 
     return 0;
 }
diff --git a/libavcodec/mediacodec_surface.h b/libavcodec/mediacodec_surface.h
index 0178b8a..933dc2b 100644
--- a/libavcodec/mediacodec_surface.h
+++ b/libavcodec/mediacodec_surface.h
@@ -25,7 +25,10 @@
 
 #include "libavcodec/avcodec.h"
 
-void *ff_mediacodec_surface_ref(void *surface, void *log_ctx);
-int ff_mediacodec_surface_unref(void *surface, void *log_ctx);
+struct FFANativeWindow;
+typedef struct FFANativeWindow FFANativeWindow;
+
+FFANativeWindow *ff_mediacodec_surface_ref(void *surface, void *log_ctx);
+int ff_mediacodec_surface_unref(FFANativeWindow *window, void *log_ctx);
 
 #endif /* AVCODEC_MEDIACODEC_SURFACE_H */
diff --git a/libavcodec/mediacodec_wrapper.c b/libavcodec/mediacodec_wrapper.c
index a024e3b..79abc8b 100644
--- a/libavcodec/mediacodec_wrapper.c
+++ b/libavcodec/mediacodec_wrapper.c
@@ -392,8 +392,6 @@
     struct JNIAMediaCodecListFields jfields = { 0 };
     struct JNIAMediaFormatFields mediaformat_jfields = { 0 };
 
-    jobject format = NULL;
-    jobject codec = NULL;
     jobject codec_name = NULL;
 
     jobject info = NULL;
@@ -469,6 +467,11 @@
                     goto done;
                 }
 
+                if (codec_name) {
+                    (*env)->DeleteLocalRef(env, codec_name);
+                    codec_name = NULL;
+                }
+
                 /* Skip software decoders */
                 if (
                     strstr(name, "OMX.google") ||
@@ -566,14 +569,6 @@
     }
 
 done:
-    if (format) {
-        (*env)->DeleteLocalRef(env, format);
-    }
-
-    if (codec) {
-        (*env)->DeleteLocalRef(env, codec);
-    }
-
     if (codec_name) {
         (*env)->DeleteLocalRef(env, codec_name);
     }
@@ -1308,6 +1303,12 @@
         ret = AVERROR_EXTERNAL;
     }
 
+    (*env)->DeleteGlobalRef(env, codec->input_buffers);
+    codec->input_buffers = NULL;
+
+    (*env)->DeleteGlobalRef(env, codec->output_buffers);
+    codec->output_buffers = NULL;
+
     (*env)->DeleteGlobalRef(env, codec->object);
     codec->object = NULL;
 
@@ -1337,6 +1338,10 @@
     ret = ff_jni_jstring_to_utf_chars(env, name, codec);
 
 fail:
+    if (name) {
+        (*env)->DeleteLocalRef(env, name);
+    }
+
     return ret;
 }
 
diff --git a/libavcodec/mediacodec_wrapper.h b/libavcodec/mediacodec_wrapper.h
index f0de16d..b106ff3 100644
--- a/libavcodec/mediacodec_wrapper.h
+++ b/libavcodec/mediacodec_wrapper.h
@@ -26,6 +26,8 @@
 #include <stdint.h>
 #include <sys/types.h>
 
+#include "avcodec.h"
+
 /**
  * The following API around MediaCodec and MediaFormat is based on the
  * NDK one provided by Google since Android 5.0.
diff --git a/libavcodec/mediacodecdec.c b/libavcodec/mediacodecdec.c
index 3a4240a..f5771bf 100644
--- a/libavcodec/mediacodecdec.c
+++ b/libavcodec/mediacodecdec.c
@@ -440,8 +440,13 @@
             if (ret >= 0) {
                 s->buffered_pkt.size -= ret;
                 s->buffered_pkt.data += ret;
-                if (s->buffered_pkt.size <= 0)
+                if (s->buffered_pkt.size <= 0) {
                     av_packet_unref(&s->buffered_pkt);
+                } else {
+                    av_log(avctx, AV_LOG_WARNING,
+                           "could not send entire packet in single input buffer (%d < %d)\n",
+                           ret, s->buffered_pkt.size+ret);
+                }
             } else if (ret < 0 && ret != AVERROR(EAGAIN)) {
                 return ret;
             }
@@ -461,6 +466,7 @@
             ret = ff_mediacodec_dec_send(avctx, s->ctx, &null_pkt, true);
             if (ret < 0)
                 return ret;
+            return ff_mediacodec_dec_receive(avctx, s->ctx, frame, true);
         } else if (ret == AVERROR(EAGAIN) && s->ctx->current_input_buffer < 0) {
             return ff_mediacodec_dec_receive(avctx, s->ctx, frame, true);
         } else if (ret < 0) {
diff --git a/libavcodec/mediacodecdec_common.c b/libavcodec/mediacodecdec_common.c
index 7c2661f..f0752fa 100644
--- a/libavcodec/mediacodecdec_common.c
+++ b/libavcodec/mediacodecdec_common.c
@@ -525,8 +525,8 @@
     if (status < 0) {
         char *desc = ff_AMediaFormat_toString(format);
         av_log(avctx, AV_LOG_ERROR,
-            "Failed to configure codec (status = %d) with format %s\n",
-            status, desc);
+            "Failed to configure codec %s (status = %d) with format %s\n",
+            s->codec_name, status, desc);
         av_freep(&desc);
 
         ret = AVERROR_EXTERNAL;
@@ -537,8 +537,8 @@
     if (status < 0) {
         char *desc = ff_AMediaFormat_toString(format);
         av_log(avctx, AV_LOG_ERROR,
-            "Failed to start codec (status = %d) with format %s\n",
-            status, desc);
+            "Failed to start codec %s (status = %d) with format %s\n",
+            s->codec_name, status, desc);
         av_freep(&desc);
         ret = AVERROR_EXTERNAL;
         goto fail;
@@ -569,7 +569,6 @@
     int offset = 0;
     int need_draining = 0;
     uint8_t *data;
-    ssize_t index = s->current_input_buffer;
     size_t size;
     FFAMediaCodec *codec = s->codec;
     int status;
@@ -591,6 +590,7 @@
     }
 
     while (offset < pkt->size || (need_draining && !s->draining)) {
+        ssize_t index = s->current_input_buffer;
         if (index < 0) {
             index = ff_AMediaCodec_dequeueInputBuffer(codec, input_dequeue_timeout_us);
             if (ff_AMediaCodec_infoTryAgainLater(codec, index)) {
@@ -612,7 +612,11 @@
         }
 
         pts = pkt->pts;
-        if (pts != AV_NOPTS_VALUE && avctx->pkt_timebase.num && avctx->pkt_timebase.den) {
+        if (pts == AV_NOPTS_VALUE) {
+            av_log(avctx, AV_LOG_WARNING, "Input packet is missing PTS\n");
+            pts = 0;
+        }
+        if (pts && avctx->pkt_timebase.num && avctx->pkt_timebase.den) {
             pts = av_rescale_q(pts, avctx->pkt_timebase, AV_TIME_BASE_Q);
         }
 
@@ -628,24 +632,24 @@
             }
 
             av_log(avctx, AV_LOG_TRACE,
-                   "Queued input buffer %zd size=%zd ts=%"PRIi64"\n", index, size, pts);
+                   "Queued empty EOS input buffer %zd with flags=%d\n", index, flags);
 
             s->draining = 1;
-            break;
-        } else {
-            size = FFMIN(pkt->size - offset, size);
-            memcpy(data, pkt->data + offset, size);
-            offset += size;
-
-            status = ff_AMediaCodec_queueInputBuffer(codec, index, 0, size, pts, 0);
-            if (status < 0) {
-                av_log(avctx, AV_LOG_ERROR, "Failed to queue input buffer (status = %d)\n", status);
-                return AVERROR_EXTERNAL;
-            }
-
-            av_log(avctx, AV_LOG_TRACE,
-                   "Queued input buffer %zd size=%zd ts=%"PRIi64"\n", index, size, pts);
+            return 0;
         }
+
+        size = FFMIN(pkt->size - offset, size);
+        memcpy(data, pkt->data + offset, size);
+        offset += size;
+
+        status = ff_AMediaCodec_queueInputBuffer(codec, index, 0, size, pts, 0);
+        if (status < 0) {
+            av_log(avctx, AV_LOG_ERROR, "Failed to queue input buffer (status = %d)\n", status);
+            return AVERROR_EXTERNAL;
+        }
+
+        av_log(avctx, AV_LOG_TRACE,
+               "Queued input buffer %zd size=%zd ts=%"PRIi64"\n", index, size, pts);
     }
 
     if (offset == 0)
diff --git a/libavcodec/midivid.c b/libavcodec/midivid.c
new file mode 100644
index 0000000..2200440
--- /dev/null
+++ b/libavcodec/midivid.c
@@ -0,0 +1,292 @@
+/*
+ * MidiVid decoder
+ * Copyright (c) 2019 Paul B Mahol
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "libavutil/imgutils.h"
+#include "libavutil/internal.h"
+#include "libavutil/intreadwrite.h"
+#include "libavutil/mem.h"
+
+#define BITSTREAM_READER_LE
+#include "avcodec.h"
+#include "get_bits.h"
+#include "bytestream.h"
+#include "internal.h"
+
+typedef struct MidiVidContext {
+    GetByteContext gb;
+
+    uint8_t *uncompressed;
+    unsigned int uncompressed_size;
+    uint8_t *skip;
+
+    AVFrame *frame;
+} MidiVidContext;
+
+static int decode_mvdv(MidiVidContext *s, AVCodecContext *avctx, AVFrame *frame)
+{
+    GetByteContext *gb = &s->gb;
+    GetBitContext mask;
+    GetByteContext idx9;
+    uint16_t nb_vectors, intra_flag;
+    const uint8_t *vec;
+    const uint8_t *mask_start;
+    uint8_t *skip;
+    uint32_t mask_size;
+    int idx9bits = 0;
+    int idx9val = 0;
+    uint32_t nb_blocks;
+
+    nb_vectors = bytestream2_get_le16(gb);
+    intra_flag = !!bytestream2_get_le16(gb);
+    if (intra_flag) {
+        nb_blocks = (avctx->width / 2) * (avctx->height / 2);
+    } else {
+        int ret, skip_linesize, padding;
+
+        nb_blocks = bytestream2_get_le32(gb);
+        skip_linesize = avctx->width >> 1;
+        mask_start = gb->buffer_start + bytestream2_tell(gb);
+        mask_size = (FFALIGN(avctx->width, 32) >> 2) * (avctx->height >> 2) >> 3;
+        padding = (FFALIGN(avctx->width, 32) - avctx->width) >> 2;
+
+        if (bytestream2_get_bytes_left(gb) < mask_size)
+            return AVERROR_INVALIDDATA;
+
+        ret = init_get_bits8(&mask, mask_start, mask_size);
+        if (ret < 0)
+            return ret;
+        bytestream2_skip(gb, mask_size);
+        skip = s->skip;
+
+        for (int y = 0; y < avctx->height >> 2; y++) {
+            for (int x = 0; x < avctx->width >> 2; x++) {
+                int flag = !get_bits1(&mask);
+
+                skip[(y*2)  *skip_linesize + x*2  ] = flag;
+                skip[(y*2)  *skip_linesize + x*2+1] = flag;
+                skip[(y*2+1)*skip_linesize + x*2  ] = flag;
+                skip[(y*2+1)*skip_linesize + x*2+1] = flag;
+            }
+            skip_bits_long(&mask, padding);
+        }
+    }
+
+    vec = gb->buffer_start + bytestream2_tell(gb);
+    if (bytestream2_get_bytes_left(gb) < nb_vectors * 12)
+        return AVERROR_INVALIDDATA;
+    bytestream2_skip(gb, nb_vectors * 12);
+    if (nb_vectors > 256) {
+        if (bytestream2_get_bytes_left(gb) < (nb_blocks + 7 * !intra_flag) / 8)
+            return AVERROR_INVALIDDATA;
+        bytestream2_init(&idx9, gb->buffer_start + bytestream2_tell(gb), (nb_blocks + 7 * !intra_flag) / 8);
+        bytestream2_skip(gb, (nb_blocks + 7 * !intra_flag) / 8);
+    }
+
+    skip = s->skip;
+
+    for (int y = avctx->height - 2; y >= 0; y -= 2) {
+        uint8_t *dsty = frame->data[0] + y * frame->linesize[0];
+        uint8_t *dstu = frame->data[1] + y * frame->linesize[1];
+        uint8_t *dstv = frame->data[2] + y * frame->linesize[2];
+
+        for (int x = 0; x < avctx->width; x += 2) {
+            int idx;
+
+            if (!intra_flag && *skip++)
+                continue;
+            if (bytestream2_get_bytes_left(gb) <= 0)
+                return AVERROR_INVALIDDATA;
+            if (nb_vectors <= 256) {
+                idx = bytestream2_get_byte(gb);
+            } else {
+                if (idx9bits == 0) {
+                    idx9val = bytestream2_get_byte(&idx9);
+                    idx9bits = 8;
+                }
+                idx9bits--;
+                idx = bytestream2_get_byte(gb) | (((idx9val >> (7 - idx9bits)) & 1) << 8);
+            }
+            if (idx >= nb_vectors)
+                return AVERROR_INVALIDDATA;
+
+            dsty[x  +frame->linesize[0]] = vec[idx * 12 + 0];
+            dsty[x+1+frame->linesize[0]] = vec[idx * 12 + 3];
+            dsty[x]                      = vec[idx * 12 + 6];
+            dsty[x+1]                    = vec[idx * 12 + 9];
+
+            dstu[x  +frame->linesize[1]] = vec[idx * 12 + 1];
+            dstu[x+1+frame->linesize[1]] = vec[idx * 12 + 4];
+            dstu[x]                      = vec[idx * 12 + 7];
+            dstu[x+1]                    = vec[idx * 12 +10];
+
+            dstv[x  +frame->linesize[2]] = vec[idx * 12 + 2];
+            dstv[x+1+frame->linesize[2]] = vec[idx * 12 + 5];
+            dstv[x]                      = vec[idx * 12 + 8];
+            dstv[x+1]                    = vec[idx * 12 +11];
+        }
+    }
+
+    return intra_flag;
+}
+
+static ptrdiff_t lzss_uncompress(MidiVidContext *s, GetByteContext *gb, uint8_t *dst, unsigned int size)
+{
+    uint8_t *dst_start = dst;
+    uint8_t *dst_end = dst + size;
+
+    for (;bytestream2_get_bytes_left(gb) >= 3;) {
+        int op = bytestream2_get_le16(gb);
+
+        for (int i = 0; i < 16; i++) {
+            if (op & 1) {
+                int s0 = bytestream2_get_byte(gb);
+                int s1 = bytestream2_get_byte(gb);
+                int offset = ((s0 & 0xF0) << 4) | s1;
+                int length = (s0 & 0xF) + 3;
+
+                if (dst + length > dst_end ||
+                    dst - offset < dst_start)
+                    return AVERROR_INVALIDDATA;
+                if (offset > 0) {
+                    for (int j = 0; j < length; j++) {
+                        dst[j] = dst[j - offset];
+                    }
+                }
+                dst += length;
+            } else {
+                if (dst >= dst_end)
+                    return AVERROR_INVALIDDATA;
+                *dst++ = bytestream2_get_byte(gb);
+            }
+            op >>= 1;
+        }
+    }
+
+    return dst - dst_start;
+}
+
+static int decode_frame(AVCodecContext *avctx, void *data,
+                        int *got_frame, AVPacket *avpkt)
+{
+    MidiVidContext *s = avctx->priv_data;
+    GetByteContext *gb = &s->gb;
+    AVFrame *frame = s->frame;
+    int ret, key, uncompressed;
+
+    if (avpkt->size <= 13)
+        return AVERROR_INVALIDDATA;
+
+    bytestream2_init(gb, avpkt->data, avpkt->size);
+    bytestream2_skip(gb, 8);
+    uncompressed = bytestream2_get_le32(gb);
+
+    if ((ret = ff_reget_buffer(avctx, s->frame, 0)) < 0)
+        return ret;
+
+    if (uncompressed) {
+        ret = decode_mvdv(s, avctx, frame);
+    } else {
+        av_fast_padded_malloc(&s->uncompressed, &s->uncompressed_size, 16LL * (avpkt->size - 12));
+        if (!s->uncompressed)
+            return AVERROR(ENOMEM);
+
+        ret = lzss_uncompress(s, gb, s->uncompressed, s->uncompressed_size);
+        if (ret < 0)
+            return ret;
+        bytestream2_init(gb, s->uncompressed, ret);
+        ret = decode_mvdv(s, avctx, frame);
+    }
+
+    if (ret < 0)
+        return ret;
+    key = ret;
+
+    if ((ret = av_frame_ref(data, s->frame)) < 0)
+        return ret;
+
+    frame->pict_type = key ? AV_PICTURE_TYPE_I : AV_PICTURE_TYPE_P;
+    frame->key_frame = key;
+    *got_frame = 1;
+
+    return avpkt->size;
+}
+
+static av_cold int decode_init(AVCodecContext *avctx)
+{
+    MidiVidContext *s = avctx->priv_data;
+    int ret = av_image_check_size(avctx->width, avctx->height, 0, avctx);
+
+    if (avctx->width & 3 || avctx->height & 3)
+        ret = AVERROR_INVALIDDATA;
+
+    if (ret < 0) {
+        av_log(avctx, AV_LOG_ERROR, "Invalid image size %dx%d.\n",
+               avctx->width, avctx->height);
+        return ret;
+    }
+
+    avctx->pix_fmt = AV_PIX_FMT_YUV444P;
+
+    s->frame = av_frame_alloc();
+    if (!s->frame)
+        return AVERROR(ENOMEM);
+    s->skip = av_calloc(avctx->width >> 1, avctx->height >> 1);
+    if (!s->skip)
+        return AVERROR(ENOMEM);
+
+    return 0;
+}
+
+static void decode_flush(AVCodecContext *avctx)
+{
+    MidiVidContext *s = avctx->priv_data;
+
+    av_frame_unref(s->frame);
+}
+
+static av_cold int decode_close(AVCodecContext *avctx)
+{
+    MidiVidContext *s = avctx->priv_data;
+
+    av_frame_free(&s->frame);
+    av_freep(&s->uncompressed);
+    av_freep(&s->skip);
+
+    return 0;
+}
+
+AVCodec ff_mvdv_decoder = {
+    .name           = "mvdv",
+    .long_name      = NULL_IF_CONFIG_SMALL("MidiVid VQ"),
+    .type           = AVMEDIA_TYPE_VIDEO,
+    .id             = AV_CODEC_ID_MVDV,
+    .priv_data_size = sizeof(MidiVidContext),
+    .init           = decode_init,
+    .decode         = decode_frame,
+    .flush          = decode_flush,
+    .close          = decode_close,
+    .capabilities   = AV_CODEC_CAP_DR1,
+    .caps_internal  = FF_CODEC_CAP_INIT_CLEANUP,
+};
diff --git a/libavcodec/mimic.c b/libavcodec/mimic.c
index 1d463e9..2563a49 100644
--- a/libavcodec/mimic.c
+++ b/libavcodec/mimic.c
@@ -128,8 +128,7 @@
         av_frame_free(&ctx->frames[i].f);
     }
 
-    if (!avctx->internal->is_copy)
-        ff_free_vlc(&ctx->vlc);
+    ff_free_vlc(&ctx->vlc);
 
     return 0;
 }
@@ -139,8 +138,6 @@
     MimicContext *ctx = avctx->priv_data;
     int ret, i;
 
-    avctx->internal->allocate_progress = 1;
-
     ctx->prev_index = 0;
     ctx->cur_index  = 15;
 
@@ -451,24 +448,6 @@
     return buf_size;
 }
 
-#if HAVE_THREADS
-static av_cold int mimic_init_thread_copy(AVCodecContext *avctx)
-{
-    MimicContext *ctx = avctx->priv_data;
-    int i;
-
-    for (i = 0; i < FF_ARRAY_ELEMS(ctx->frames); i++) {
-        ctx->frames[i].f = av_frame_alloc();
-        if (!ctx->frames[i].f) {
-            mimic_decode_end(avctx);
-            return AVERROR(ENOMEM);
-        }
-    }
-
-    return 0;
-}
-#endif
-
 AVCodec ff_mimic_decoder = {
     .name                  = "mimic",
     .long_name             = NULL_IF_CONFIG_SMALL("Mimic"),
@@ -480,5 +459,5 @@
     .decode                = mimic_decode_frame,
     .capabilities          = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_FRAME_THREADS,
     .update_thread_context = ONLY_IF_THREADS_ENABLED(mimic_decode_update_thread_context),
-    .init_thread_copy      = ONLY_IF_THREADS_ENABLED(mimic_init_thread_copy),
+    .caps_internal         = FF_CODEC_CAP_ALLOCATE_PROGRESS,
 };
diff --git a/libavcodec/mips/Makefile b/libavcodec/mips/Makefile
index 1f659a0..b4993f6 100644
--- a/libavcodec/mips/Makefile
+++ b/libavcodec/mips/Makefile
@@ -22,6 +22,7 @@
                                              mips/hevcpred_init_mips.o
 OBJS-$(CONFIG_VP9_DECODER)                += mips/vp9dsp_init_mips.o
 OBJS-$(CONFIG_VP8_DECODER)                += mips/vp8dsp_init_mips.o
+OBJS-$(CONFIG_VP3DSP)                     += mips/vp3dsp_init_mips.o
 OBJS-$(CONFIG_H264DSP)                    += mips/h264dsp_init_mips.o
 OBJS-$(CONFIG_H264QPEL)                   += mips/h264qpel_init_mips.o
 OBJS-$(CONFIG_H264CHROMA)                 += mips/h264chroma_init_mips.o
@@ -54,6 +55,7 @@
 MSA-OBJS-$(CONFIG_VP8_DECODER)            += mips/vp8_mc_msa.o             \
                                              mips/vp8_idct_msa.o           \
                                              mips/vp8_lpf_msa.o
+MSA-OBJS-$(CONFIG_VP3DSP)                 += mips/vp3dsp_idct_msa.o
 MSA-OBJS-$(CONFIG_H264DSP)                += mips/h264dsp_msa.o            \
                                              mips/h264idct_msa.o
 MSA-OBJS-$(CONFIG_H264QPEL)               += mips/h264qpel_msa.o
@@ -84,3 +86,7 @@
 MMI-OBJS-$(CONFIG_HPELDSP)                += mips/hpeldsp_mmi.o
 MMI-OBJS-$(CONFIG_VC1_DECODER)            += mips/vc1dsp_mmi.o
 MMI-OBJS-$(CONFIG_WMV2DSP)                += mips/wmv2dsp_mmi.o
+MMI-OBJS-$(CONFIG_HEVC_DECODER)           += mips/hevcdsp_mmi.o
+MMI-OBJS-$(CONFIG_VP3DSP)                 += mips/vp3dsp_idct_mmi.o
+MMI-OBJS-$(CONFIG_VP9_DECODER)            += mips/vp9_mc_mmi.o
+MSA-OBJS-$(CONFIG_VC1_DECODER)            += mips/vc1dsp_msa.o
diff --git a/libavcodec/mips/aacdec_mips.c b/libavcodec/mips/aacdec_mips.c
index 253cdeb..8e30652 100644
--- a/libavcodec/mips/aacdec_mips.c
+++ b/libavcodec/mips/aacdec_mips.c
@@ -59,6 +59,7 @@
 #include "libavutil/mips/asmdefs.h"
 
 #if HAVE_INLINE_ASM
+#if HAVE_MIPSFPU
 static av_always_inline void float_copy(float *dst, const float *src, int count)
 {
     // Copy 'count' floats from src to dst
@@ -237,9 +238,9 @@
 
         if (ltp->lag < 1024)
             num_samples = ltp->lag + 1024;
-            j = (2048 - num_samples) >> 2;
-            k = (2048 - num_samples) & 3;
-            p_predTime = &predTime[num_samples];
+        j = (2048 - num_samples) >> 2;
+        k = (2048 - num_samples) & 3;
+        p_predTime = &predTime[num_samples];
 
         for (i = 0; i < num_samples; i++)
             predTime[i] = sce->ltp_state[i + 2048 - ltp->lag] * ltp->coef;
@@ -282,7 +283,6 @@
     }
 }
 
-#if HAVE_MIPSFPU
 static av_always_inline void fmul_and_reverse(float *dst, const float *src0, const float *src1, int count)
 {
     /* Multiply 'count' floats in src0 by src1 and store the results in dst in reverse */
@@ -433,9 +433,9 @@
 void ff_aacdec_init_mips(AACContext *c)
 {
 #if HAVE_INLINE_ASM
+#if HAVE_MIPSFPU
     c->imdct_and_windowing         = imdct_and_windowing_mips;
     c->apply_ltp                   = apply_ltp_mips;
-#if HAVE_MIPSFPU
     c->update_ltp                  = update_ltp_mips;
 #endif /* HAVE_MIPSFPU */
 #endif /* HAVE_INLINE_ASM */
diff --git a/libavcodec/mips/aacpsdsp_mips.c b/libavcodec/mips/aacpsdsp_mips.c
index 83fdc2f..ef47e31 100644
--- a/libavcodec/mips/aacpsdsp_mips.c
+++ b/libavcodec/mips/aacpsdsp_mips.c
@@ -57,6 +57,7 @@
 #include "libavutil/mips/asmdefs.h"
 
 #if HAVE_INLINE_ASM
+#if HAVE_MIPSFPU
 static void ps_hybrid_analysis_ileave_mips(float (*out)[32][2], float L[2][38][64],
                                         int i, int len)
 {
@@ -187,7 +188,6 @@
     }
 }
 
-#if HAVE_MIPSFPU
 #if !HAVE_MIPS32R6 && !HAVE_MIPS64R6
 static void ps_add_squares_mips(float *dst, const float (*src)[2], int n)
 {
@@ -450,9 +450,9 @@
 void ff_psdsp_init_mips(PSDSPContext *s)
 {
 #if HAVE_INLINE_ASM
+#if HAVE_MIPSFPU
     s->hybrid_analysis_ileave = ps_hybrid_analysis_ileave_mips;
     s->hybrid_synthesis_deint = ps_hybrid_synthesis_deint_mips;
-#if HAVE_MIPSFPU
 #if !HAVE_MIPS32R6 && !HAVE_MIPS64R6
     s->add_squares            = ps_add_squares_mips;
     s->mul_pair_single        = ps_mul_pair_single_mips;
diff --git a/libavcodec/mips/aacsbr_mips.c b/libavcodec/mips/aacsbr_mips.c
index 56aa4e8..2e0cd72 100644
--- a/libavcodec/mips/aacsbr_mips.c
+++ b/libavcodec/mips/aacsbr_mips.c
@@ -58,6 +58,7 @@
 #define ENVELOPE_ADJUSTMENT_OFFSET 2
 
 #if HAVE_INLINE_ASM
+#if HAVE_MIPSFPU
 static int sbr_lf_gen_mips(AACContext *ac, SpectralBandReplication *sbr,
                       float X_low[32][40][2], const float W[2][32][32][2],
                       int buf_idx)
@@ -310,7 +311,6 @@
       return 0;
 }
 
-#if HAVE_MIPSFPU
 #if !HAVE_MIPS32R6 && !HAVE_MIPS64R6
 static void sbr_hf_assemble_mips(float Y1[38][64][2],
                             const float X_high[64][40][2],
@@ -611,9 +611,9 @@
 void ff_aacsbr_func_ptr_init_mips(AACSBRContext *c)
 {
 #if HAVE_INLINE_ASM
+#if HAVE_MIPSFPU
     c->sbr_lf_gen            = sbr_lf_gen_mips;
     c->sbr_x_gen             = sbr_x_gen_mips;
-#if HAVE_MIPSFPU
 #if !HAVE_MIPS32R6 && !HAVE_MIPS64R6
     c->sbr_hf_inverse_filter = sbr_hf_inverse_filter_mips;
     c->sbr_hf_assemble       = sbr_hf_assemble_mips;
diff --git a/libavcodec/mips/blockdsp_init_mips.c b/libavcodec/mips/blockdsp_init_mips.c
index 30ae95f..55ac1c3 100644
--- a/libavcodec/mips/blockdsp_init_mips.c
+++ b/libavcodec/mips/blockdsp_init_mips.c
@@ -45,10 +45,10 @@
 
 void ff_blockdsp_init_mips(BlockDSPContext *c)
 {
-#if HAVE_MSA
-    blockdsp_init_msa(c);
-#endif  // #if HAVE_MSA
 #if HAVE_MMI
     blockdsp_init_mmi(c);
 #endif /* HAVE_MMI */
+#if HAVE_MSA
+    blockdsp_init_msa(c);
+#endif  // #if HAVE_MSA
 }
diff --git a/libavcodec/mips/cabac.h b/libavcodec/mips/cabac.h
index 82cee29..03b5010 100644
--- a/libavcodec/mips/cabac.h
+++ b/libavcodec/mips/cabac.h
@@ -29,7 +29,7 @@
 #include "config.h"
 
 #define get_cabac_inline get_cabac_inline_mips
-static av_always_inline int get_cabac_inline(CABACContext *c,
+static av_always_inline int get_cabac_inline_mips(CABACContext *c,
                                              uint8_t * const state){
     mips_reg tmp0, tmp1, tmp2, bit;
 
@@ -72,7 +72,7 @@
 
         "and          %[tmp0],       %[c_low],       %[cabac_mask] \n\t"
         "bnez         %[tmp0],       1f                            \n\t"
-        PTR_ADDI     "%[tmp0],       %[c_low],       -0X01         \n\t"
+        PTR_ADDIU    "%[tmp0],       %[c_low],       -0x01         \n\t"
         "xor          %[tmp0],       %[c_low],       %[tmp0]       \n\t"
         PTR_SRA      "%[tmp0],       %[tmp0],        0x0f          \n\t"
         PTR_ADDU     "%[tmp0],       %[tmp0],        %[tables]     \n\t"
diff --git a/libavcodec/mips/h263dsp_msa.c b/libavcodec/mips/h263dsp_msa.c
index 472bcbd..2e1ca01 100644
--- a/libavcodec/mips/h263dsp_msa.c
+++ b/libavcodec/mips/h263dsp_msa.c
@@ -86,10 +86,7 @@
     ILVR_B2_SH(in3, in0, in1, in2, temp0, temp1);
     in0 = (v16u8) __msa_ilvr_h(temp1, temp0);
     in3 = (v16u8) __msa_ilvl_h(temp1, temp0);
-    ST4x4_UB(in0, in0, 0, 1, 2, 3, src, stride);
-    src += 4 * stride;
-    ST4x4_UB(in3, in3, 0, 1, 2, 3, src, stride);
-    src += 4 * stride;
+    ST_W8(in0, in3, 0, 1, 2, 3, 0, 1, 2, 3, src, stride);
 }
 
 static void h263_v_loop_filter_msa(uint8_t *src, int32_t stride, int32_t qscale)
diff --git a/libavcodec/mips/h264chroma_init_mips.c b/libavcodec/mips/h264chroma_init_mips.c
index 122148d..ae817e4 100644
--- a/libavcodec/mips/h264chroma_init_mips.c
+++ b/libavcodec/mips/h264chroma_init_mips.c
@@ -54,10 +54,10 @@
 
 av_cold void ff_h264chroma_init_mips(H264ChromaContext *c, int bit_depth)
 {
-#if HAVE_MSA
-    h264chroma_init_msa(c, bit_depth);
-#endif  // #if HAVE_MSA
 #if HAVE_MMI
     h264chroma_init_mmi(c, bit_depth);
 #endif /* HAVE_MMI */
+#if HAVE_MSA
+    h264chroma_init_msa(c, bit_depth);
+#endif  // #if HAVE_MSA
 }
diff --git a/libavcodec/mips/h264chroma_mmi.c b/libavcodec/mips/h264chroma_mmi.c
index 91b2cc4..739dd7d 100644
--- a/libavcodec/mips/h264chroma_mmi.c
+++ b/libavcodec/mips/h264chroma_mmi.c
@@ -30,74 +30,177 @@
         int h, int x, int y)
 {
     int A = 64, B, C, D, E;
-    double ftmp[10];
+    double ftmp[12];
     uint64_t tmp[1];
 
     if (!(x || y)) {
         /* x=0, y=0, A=64 */
         __asm__ volatile (
+            "1:                                                        \n\t"
+            MMI_ULDC1(%[ftmp0], %[src], 0x00)
+            PTR_ADDU   "%[src],     %[src],         %[stride]          \n\t"
+            MMI_ULDC1(%[ftmp1], %[src], 0x00)
+            PTR_ADDU   "%[src],     %[src],         %[stride]          \n\t"
+            MMI_ULDC1(%[ftmp2], %[src], 0x00)
+            PTR_ADDU   "%[src],     %[src],         %[stride]          \n\t"
+            MMI_ULDC1(%[ftmp3], %[src], 0x00)
+            PTR_ADDU   "%[src],     %[src],         %[stride]          \n\t"
+
+            "addi       %[h],       %[h],           -0x04              \n\t"
+
+            MMI_SDC1(%[ftmp0], %[dst], 0x00)
+            PTR_ADDU   "%[dst],     %[dst],         %[stride]          \n\t"
+            MMI_SDC1(%[ftmp1], %[dst], 0x00)
+            PTR_ADDU   "%[dst],     %[dst],         %[stride]          \n\t"
+            MMI_SDC1(%[ftmp2], %[dst], 0x00)
+            PTR_ADDU   "%[dst],     %[dst],         %[stride]          \n\t"
+            MMI_SDC1(%[ftmp3], %[dst], 0x00)
+            PTR_ADDU   "%[dst],     %[dst],         %[stride]          \n\t"
+            "bnez       %[h],       1b                                 \n\t"
+            : [ftmp0]"=&f"(ftmp[0]),        [ftmp1]"=&f"(ftmp[1]),
+              [ftmp2]"=&f"(ftmp[2]),        [ftmp3]"=&f"(ftmp[3]),
+              [dst]"+&r"(dst),              [src]"+&r"(src),
+              [h]"+&r"(h)
+            : [stride]"r"((mips_reg)stride)
+            : "memory"
+        );
+    } else if (x && y) {
+        /* x!=0, y!=0 */
+        D = x * y;
+        B = (x << 3) - D;
+        C = (y << 3) - D;
+        A = 64 - D - B - C;
+
+        __asm__ volatile (
             "xor        %[ftmp0],   %[ftmp0],       %[ftmp0]           \n\t"
             "dli        %[tmp0],    0x06                               \n\t"
-            "mtc1       %[tmp0],    %[ftmp4]                           \n\t"
+            "pshufh     %[A],       %[A],           %[ftmp0]           \n\t"
+            "pshufh     %[B],       %[B],           %[ftmp0]           \n\t"
+            "mtc1       %[tmp0],    %[ftmp9]                           \n\t"
+            "pshufh     %[C],       %[C],           %[ftmp0]           \n\t"
+            "pshufh     %[D],       %[D],           %[ftmp0]           \n\t"
 
             "1:                                                        \n\t"
             MMI_ULDC1(%[ftmp1], %[src], 0x00)
-            "addi       %[h],       %[h],           -0x04              \n\t"
+            MMI_ULDC1(%[ftmp2], %[src], 0x01)
             PTR_ADDU   "%[src],     %[src],         %[stride]          \n\t"
-            MMI_ULDC1(%[ftmp5], %[src], 0x00)
+            MMI_ULDC1(%[ftmp3], %[src], 0x00)
+            MMI_ULDC1(%[ftmp4], %[src], 0x01)
             PTR_ADDU   "%[src],     %[src],         %[stride]          \n\t"
-            MMI_ULDC1(%[ftmp6], %[src], 0x00)
-            PTR_ADDU   "%[src],     %[src],         %[stride]          \n\t"
-            MMI_ULDC1(%[ftmp7], %[src], 0x00)
+            MMI_ULDC1(%[ftmp10], %[src], 0x00)
+            MMI_ULDC1(%[ftmp11], %[src], 0x01)
+            "addi       %[h],       %[h],           -0x02              \n\t"
 
-            "punpcklbh  %[ftmp2],   %[ftmp1],       %[ftmp0]           \n\t"
-            "punpckhbh  %[ftmp3],   %[ftmp1],       %[ftmp0]           \n\t"
-            "psllh      %[ftmp1],   %[ftmp2],       %[ftmp4]           \n\t"
-            "psllh      %[ftmp2],   %[ftmp3],       %[ftmp4]           \n\t"
+            "punpcklbh  %[ftmp5],   %[ftmp1],       %[ftmp0]           \n\t"
+            "punpckhbh  %[ftmp6],   %[ftmp1],       %[ftmp0]           \n\t"
+            "punpcklbh  %[ftmp7],   %[ftmp2],       %[ftmp0]           \n\t"
+            "punpckhbh  %[ftmp8],   %[ftmp2],       %[ftmp0]           \n\t"
+            "pmullh     %[ftmp5],   %[ftmp5],       %[A]               \n\t"
+            "pmullh     %[ftmp7],   %[ftmp7],       %[B]               \n\t"
+            "paddh      %[ftmp1],   %[ftmp5],       %[ftmp7]           \n\t"
+            "pmullh     %[ftmp6],   %[ftmp6],       %[A]               \n\t"
+            "pmullh     %[ftmp8],   %[ftmp8],       %[B]               \n\t"
+            "paddh      %[ftmp2],   %[ftmp6],       %[ftmp8]           \n\t"
+            "punpcklbh  %[ftmp5],   %[ftmp3],       %[ftmp0]           \n\t"
+            "punpckhbh  %[ftmp6],   %[ftmp3],       %[ftmp0]           \n\t"
+            "punpcklbh  %[ftmp7],   %[ftmp4],       %[ftmp0]           \n\t"
+            "punpckhbh  %[ftmp8],   %[ftmp4],       %[ftmp0]           \n\t"
+            "pmullh     %[ftmp5],   %[ftmp5],       %[C]               \n\t"
+            "pmullh     %[ftmp7],   %[ftmp7],       %[D]               \n\t"
+            "paddh      %[ftmp5],   %[ftmp5],       %[ftmp7]           \n\t"
+            "pmullh     %[ftmp6],   %[ftmp6],       %[C]               \n\t"
+            "pmullh     %[ftmp8],   %[ftmp8],       %[D]               \n\t"
+            "paddh      %[ftmp6],   %[ftmp6],       %[ftmp8]           \n\t"
+            "paddh      %[ftmp1],   %[ftmp1],       %[ftmp5]           \n\t"
+            "paddh      %[ftmp2],   %[ftmp2],       %[ftmp6]           \n\t"
             "paddh      %[ftmp1],   %[ftmp1],       %[ff_pw_32]        \n\t"
             "paddh      %[ftmp2],   %[ftmp2],       %[ff_pw_32]        \n\t"
-            "psrlh      %[ftmp1],   %[ftmp1],       %[ftmp4]           \n\t"
-            "psrlh      %[ftmp2],   %[ftmp2],       %[ftmp4]           \n\t"
+            "psrlh      %[ftmp1],   %[ftmp1],       %[ftmp9]           \n\t"
+            "psrlh      %[ftmp2],   %[ftmp2],       %[ftmp9]           \n\t"
             "packushb   %[ftmp1],   %[ftmp1],       %[ftmp2]           \n\t"
+
+            "punpcklbh  %[ftmp5],   %[ftmp3],       %[ftmp0]           \n\t"
+            "punpckhbh  %[ftmp6],   %[ftmp3],       %[ftmp0]           \n\t"
+            "punpcklbh  %[ftmp7],   %[ftmp4],       %[ftmp0]           \n\t"
+            "punpckhbh  %[ftmp8],   %[ftmp4],       %[ftmp0]           \n\t"
+            "pmullh     %[ftmp5],   %[ftmp5],       %[A]               \n\t"
+            "pmullh     %[ftmp7],   %[ftmp7],       %[B]               \n\t"
+            "paddh      %[ftmp3],   %[ftmp5],       %[ftmp7]           \n\t"
+            "pmullh     %[ftmp6],   %[ftmp6],       %[A]               \n\t"
+            "pmullh     %[ftmp8],   %[ftmp8],       %[B]               \n\t"
+            "paddh      %[ftmp4],   %[ftmp6],       %[ftmp8]           \n\t"
+            "punpcklbh  %[ftmp5],   %[ftmp10],      %[ftmp0]           \n\t"
+            "punpckhbh  %[ftmp6],   %[ftmp10],      %[ftmp0]           \n\t"
+            "punpcklbh  %[ftmp7],   %[ftmp11],      %[ftmp0]           \n\t"
+            "punpckhbh  %[ftmp8],   %[ftmp11],      %[ftmp0]           \n\t"
+            "pmullh     %[ftmp5],   %[ftmp5],       %[C]               \n\t"
+            "pmullh     %[ftmp7],   %[ftmp7],       %[D]               \n\t"
+            "paddh      %[ftmp5],   %[ftmp5],       %[ftmp7]           \n\t"
+            "pmullh     %[ftmp6],   %[ftmp6],       %[C]               \n\t"
+            "pmullh     %[ftmp8],   %[ftmp8],       %[D]               \n\t"
+            "paddh      %[ftmp6],   %[ftmp6],       %[ftmp8]           \n\t"
+            "paddh      %[ftmp3],   %[ftmp3],       %[ftmp5]           \n\t"
+            "paddh      %[ftmp4],   %[ftmp4],       %[ftmp6]           \n\t"
+            "paddh      %[ftmp3],   %[ftmp3],       %[ff_pw_32]        \n\t"
+            "paddh      %[ftmp4],   %[ftmp4],       %[ff_pw_32]        \n\t"
+            "psrlh      %[ftmp3],   %[ftmp3],       %[ftmp9]           \n\t"
+            "psrlh      %[ftmp4],   %[ftmp4],       %[ftmp9]           \n\t"
+            "packushb   %[ftmp3],   %[ftmp3],       %[ftmp4]           \n\t"
+
             MMI_SDC1(%[ftmp1], %[dst], 0x00)
-
-            "punpcklbh  %[ftmp2],   %[ftmp5],       %[ftmp0]           \n\t"
-            "punpckhbh  %[ftmp3],   %[ftmp5],       %[ftmp0]           \n\t"
-            "psllh      %[ftmp1],   %[ftmp2],       %[ftmp4]           \n\t"
-            "psllh      %[ftmp2],   %[ftmp3],       %[ftmp4]           \n\t"
-            "paddh      %[ftmp1],   %[ftmp1],       %[ff_pw_32]        \n\t"
-            "paddh      %[ftmp2],   %[ftmp2],       %[ff_pw_32]        \n\t"
-            "psrlh      %[ftmp1],   %[ftmp1],       %[ftmp4]           \n\t"
-            "psrlh      %[ftmp2],   %[ftmp2],       %[ftmp4]           \n\t"
-            "packushb   %[ftmp1],   %[ftmp1],       %[ftmp2]           \n\t"
             PTR_ADDU   "%[dst],     %[dst],         %[stride]          \n\t"
-            MMI_SDC1(%[ftmp1], %[dst], 0x00)
-
-            "punpcklbh  %[ftmp2],   %[ftmp6],       %[ftmp0]           \n\t"
-            "punpckhbh  %[ftmp3],   %[ftmp6],       %[ftmp0]           \n\t"
-            "psllh      %[ftmp1],   %[ftmp2],       %[ftmp4]           \n\t"
-            "psllh      %[ftmp2],   %[ftmp3],       %[ftmp4]           \n\t"
-            "paddh      %[ftmp1],   %[ftmp1],       %[ff_pw_32]        \n\t"
-            "paddh      %[ftmp2],   %[ftmp2],       %[ff_pw_32]        \n\t"
-            "psrlh      %[ftmp1],   %[ftmp1],       %[ftmp4]           \n\t"
-            "psrlh      %[ftmp2],   %[ftmp2],       %[ftmp4]           \n\t"
-            "packushb   %[ftmp1],   %[ftmp1],       %[ftmp2]           \n\t"
+            MMI_SDC1(%[ftmp3], %[dst], 0x00)
             PTR_ADDU   "%[dst],     %[dst],         %[stride]          \n\t"
-            MMI_SDC1(%[ftmp1], %[dst], 0x00)
+            "bnez       %[h],       1b                                 \n\t"
+            : [ftmp0]"=&f"(ftmp[0]),        [ftmp1]"=&f"(ftmp[1]),
+              [ftmp2]"=&f"(ftmp[2]),        [ftmp3]"=&f"(ftmp[3]),
+              [ftmp4]"=&f"(ftmp[4]),        [ftmp5]"=&f"(ftmp[5]),
+              [ftmp6]"=&f"(ftmp[6]),        [ftmp7]"=&f"(ftmp[7]),
+              [ftmp8]"=&f"(ftmp[8]),        [ftmp9]"=&f"(ftmp[9]),
+              [ftmp10]"=&f"(ftmp[10]),      [ftmp11]"=&f"(ftmp[11]),
+              [tmp0]"=&r"(tmp[0]),
+              [dst]"+&r"(dst),              [src]"+&r"(src),
+              [h]"+&r"(h)
+            : [stride]"r"((mips_reg)stride),[ff_pw_32]"f"(ff_pw_32),
+              [A]"f"(A),                    [B]"f"(B),
+              [C]"f"(C),                    [D]"f"(D)
+            : "memory"
+        );
+    } else if (x) {
+        /* x!=0, y==0 */
+        E = x << 3;
+        A = 64 - E;
 
-            "punpcklbh  %[ftmp2],   %[ftmp7],       %[ftmp0]           \n\t"
-            "punpckhbh  %[ftmp3],   %[ftmp7],       %[ftmp0]           \n\t"
-            "psllh      %[ftmp1],   %[ftmp2],       %[ftmp4]           \n\t"
-            "psllh      %[ftmp2],   %[ftmp3],       %[ftmp4]           \n\t"
-            "paddh      %[ftmp1],   %[ftmp1],       %[ff_pw_32]        \n\t"
-            "paddh      %[ftmp2],   %[ftmp2],       %[ff_pw_32]        \n\t"
-            "psrlh      %[ftmp1],   %[ftmp1],       %[ftmp4]           \n\t"
-            "psrlh      %[ftmp2],   %[ftmp2],       %[ftmp4]           \n\t"
-            "packushb   %[ftmp1],   %[ftmp1],       %[ftmp2]           \n\t"
-            PTR_ADDU   "%[dst],     %[dst],         %[stride]          \n\t"
-            MMI_SDC1(%[ftmp1], %[dst], 0x00)
+        __asm__ volatile (
+            "xor        %[ftmp0],   %[ftmp0],       %[ftmp0]           \n\t"
+            "dli        %[tmp0],    0x06                               \n\t"
+            "pshufh     %[A],       %[A],           %[ftmp0]           \n\t"
+            "pshufh     %[E],       %[E],           %[ftmp0]           \n\t"
+            "mtc1       %[tmp0],    %[ftmp7]                           \n\t"
 
+            "1:                                                        \n\t"
+            MMI_ULDC1(%[ftmp1], %[src], 0x00)
+            MMI_ULDC1(%[ftmp2], %[src], 0x01)
+            "addi       %[h],       %[h],           -0x01              \n\t"
             PTR_ADDU   "%[src],     %[src],         %[stride]          \n\t"
+
+            "punpcklbh  %[ftmp3],   %[ftmp1],       %[ftmp0]           \n\t"
+            "punpckhbh  %[ftmp4],   %[ftmp1],       %[ftmp0]           \n\t"
+            "punpcklbh  %[ftmp5],   %[ftmp2],       %[ftmp0]           \n\t"
+            "punpckhbh  %[ftmp6],   %[ftmp2],       %[ftmp0]           \n\t"
+            "pmullh     %[ftmp3],   %[ftmp3],       %[A]               \n\t"
+            "pmullh     %[ftmp5],   %[ftmp5],       %[E]               \n\t"
+            "paddh      %[ftmp1],   %[ftmp3],       %[ftmp5]           \n\t"
+            "pmullh     %[ftmp4],   %[ftmp4],       %[A]               \n\t"
+            "pmullh     %[ftmp6],   %[ftmp6],       %[E]               \n\t"
+            "paddh      %[ftmp2],   %[ftmp4],       %[ftmp6]           \n\t"
+
+            "paddh      %[ftmp1],   %[ftmp1],       %[ff_pw_32]        \n\t"
+            "paddh      %[ftmp2],   %[ftmp2],       %[ff_pw_32]        \n\t"
+            "psrlh      %[ftmp1],   %[ftmp1],       %[ftmp7]           \n\t"
+            "psrlh      %[ftmp2],   %[ftmp2],       %[ftmp7]           \n\t"
+            "packushb   %[ftmp1],   %[ftmp1],       %[ftmp2]           \n\t"
+            MMI_SDC1(%[ftmp1], %[dst], 0x00)
             PTR_ADDU   "%[dst],     %[dst],         %[stride]          \n\t"
             "bnez       %[h],       1b                                 \n\t"
             : [ftmp0]"=&f"(ftmp[0]),        [ftmp1]"=&f"(ftmp[1]),
@@ -107,220 +210,80 @@
               [tmp0]"=&r"(tmp[0]),
               [dst]"+&r"(dst),              [src]"+&r"(src),
               [h]"+&r"(h)
-            : [stride]"r"((mips_reg)stride),[ff_pw_32]"f"(ff_pw_32)
+            : [stride]"r"((mips_reg)stride),
+              [ff_pw_32]"f"(ff_pw_32),
+              [A]"f"(A),                    [E]"f"(E)
             : "memory"
         );
     } else {
-        if (x && y) {
-            /* x!=0, y!=0 */
-            D = x * y;
-            B = (x << 3) - D;
-            C = (y << 3) - D;
-            A = 64 - D - B - C;
+        /* x==0, y!=0 */
+        E = y << 3;
+        A = 64 - E;
 
-            __asm__ volatile (
-                "xor        %[ftmp0],   %[ftmp0],       %[ftmp0]           \n\t"
-                "dli        %[tmp0],    0x06                               \n\t"
-                "pshufh     %[A],       %[A],           %[ftmp0]           \n\t"
-                "pshufh     %[B],       %[B],           %[ftmp0]           \n\t"
-                "mtc1       %[tmp0],    %[ftmp9]                           \n\t"
-                "pshufh     %[C],       %[C],           %[ftmp0]           \n\t"
-                "pshufh     %[D],       %[D],           %[ftmp0]           \n\t"
+        __asm__ volatile (
+            "xor        %[ftmp0],   %[ftmp0],       %[ftmp0]           \n\t"
+            "dli        %[tmp0],    0x06                               \n\t"
+            "pshufh     %[A],       %[A],           %[ftmp0]           \n\t"
+            "pshufh     %[E],       %[E],           %[ftmp0]           \n\t"
+            "mtc1       %[tmp0],    %[ftmp7]                           \n\t"
 
-                "1:                                                        \n\t"
-                MMI_ULDC1(%[ftmp1], %[src], 0x00)
-                MMI_ULDC1(%[ftmp2], %[src], 0x01)
-                PTR_ADDU   "%[src],     %[src],         %[stride]          \n\t"
-                MMI_ULDC1(%[ftmp3], %[src], 0x00)
-                MMI_ULDC1(%[ftmp4], %[src], 0x01)
-                "addi       %[h],       %[h],           -0x02              \n\t"
+            "1:                                                        \n\t"
+            MMI_ULDC1(%[ftmp1], %[src], 0x00)
+            PTR_ADDU   "%[src],     %[src],         %[stride]          \n\t"
+            MMI_ULDC1(%[ftmp2], %[src], 0x00)
+            PTR_ADDU   "%[src],     %[src],         %[stride]          \n\t"
+            MMI_ULDC1(%[ftmp8], %[src], 0x00)
+            "addi       %[h],       %[h],           -0x02              \n\t"
 
-                "punpcklbh  %[ftmp5],   %[ftmp1],       %[ftmp0]           \n\t"
-                "punpckhbh  %[ftmp6],   %[ftmp1],       %[ftmp0]           \n\t"
-                "punpcklbh  %[ftmp7],   %[ftmp2],       %[ftmp0]           \n\t"
-                "punpckhbh  %[ftmp8],   %[ftmp2],       %[ftmp0]           \n\t"
-                "pmullh     %[ftmp5],   %[ftmp5],       %[A]               \n\t"
-                "pmullh     %[ftmp7],   %[ftmp7],       %[B]               \n\t"
-                "paddh      %[ftmp1],   %[ftmp5],       %[ftmp7]           \n\t"
-                "pmullh     %[ftmp6],   %[ftmp6],       %[A]               \n\t"
-                "pmullh     %[ftmp8],   %[ftmp8],       %[B]               \n\t"
-                "paddh      %[ftmp2],   %[ftmp6],       %[ftmp8]           \n\t"
+            "punpcklbh  %[ftmp3],   %[ftmp1],       %[ftmp0]           \n\t"
+            "punpckhbh  %[ftmp4],   %[ftmp1],       %[ftmp0]           \n\t"
+            "punpcklbh  %[ftmp5],   %[ftmp2],       %[ftmp0]           \n\t"
+            "punpckhbh  %[ftmp6],   %[ftmp2],       %[ftmp0]           \n\t"
+            "pmullh     %[ftmp3],   %[ftmp3],       %[A]               \n\t"
+            "pmullh     %[ftmp5],   %[ftmp5],       %[E]               \n\t"
+            "paddh      %[ftmp3],   %[ftmp3],       %[ftmp5]           \n\t"
+            "pmullh     %[ftmp4],   %[ftmp4],       %[A]               \n\t"
+            "pmullh     %[ftmp6],   %[ftmp6],       %[E]               \n\t"
+            "paddh      %[ftmp4],   %[ftmp4],       %[ftmp6]           \n\t"
+            "paddh      %[ftmp3],   %[ftmp3],       %[ff_pw_32]        \n\t"
+            "paddh      %[ftmp4],   %[ftmp4],       %[ff_pw_32]        \n\t"
+            "psrlh      %[ftmp3],   %[ftmp3],       %[ftmp7]           \n\t"
+            "psrlh      %[ftmp4],   %[ftmp4],       %[ftmp7]           \n\t"
+            "packushb   %[ftmp1],   %[ftmp3],       %[ftmp4]           \n\t"
 
-                "punpcklbh  %[ftmp5],   %[ftmp3],       %[ftmp0]           \n\t"
-                "punpckhbh  %[ftmp6],   %[ftmp3],       %[ftmp0]           \n\t"
-                "punpcklbh  %[ftmp7],   %[ftmp4],       %[ftmp0]           \n\t"
-                "punpckhbh  %[ftmp8],   %[ftmp4],       %[ftmp0]           \n\t"
-                "pmullh     %[ftmp5],   %[ftmp5],       %[C]               \n\t"
-                "pmullh     %[ftmp7],   %[ftmp7],       %[D]               \n\t"
-                "paddh      %[ftmp3],   %[ftmp5],       %[ftmp7]           \n\t"
-                "pmullh     %[ftmp6],   %[ftmp6],       %[C]               \n\t"
-                "pmullh     %[ftmp8],   %[ftmp8],       %[D]               \n\t"
-                "paddh      %[ftmp4],   %[ftmp6],       %[ftmp8]           \n\t"
+            "punpcklbh  %[ftmp3],   %[ftmp2],       %[ftmp0]           \n\t"
+            "punpckhbh  %[ftmp4],   %[ftmp2],       %[ftmp0]           \n\t"
+            "punpcklbh  %[ftmp5],   %[ftmp8],       %[ftmp0]           \n\t"
+            "punpckhbh  %[ftmp6],   %[ftmp8],       %[ftmp0]           \n\t"
+            "pmullh     %[ftmp3],   %[ftmp3],       %[A]               \n\t"
+            "pmullh     %[ftmp5],   %[ftmp5],       %[E]               \n\t"
+            "paddh      %[ftmp3],   %[ftmp3],       %[ftmp5]           \n\t"
+            "pmullh     %[ftmp4],   %[ftmp4],       %[A]               \n\t"
+            "pmullh     %[ftmp6],   %[ftmp6],       %[E]               \n\t"
+            "paddh      %[ftmp4],   %[ftmp4],       %[ftmp6]           \n\t"
+            "paddh      %[ftmp3],   %[ftmp3],       %[ff_pw_32]        \n\t"
+            "paddh      %[ftmp4],   %[ftmp4],       %[ff_pw_32]        \n\t"
+            "psrlh      %[ftmp3],   %[ftmp3],       %[ftmp7]           \n\t"
+            "psrlh      %[ftmp4],   %[ftmp4],       %[ftmp7]           \n\t"
+            "packushb   %[ftmp2],   %[ftmp3],       %[ftmp4]           \n\t"
 
-                "paddh      %[ftmp1],   %[ftmp1],       %[ftmp3]           \n\t"
-                "paddh      %[ftmp2],   %[ftmp2],       %[ftmp4]           \n\t"
-                "paddh      %[ftmp1],   %[ftmp1],       %[ff_pw_32]        \n\t"
-                "paddh      %[ftmp2],   %[ftmp2],       %[ff_pw_32]        \n\t"
-                "psrlh      %[ftmp1],   %[ftmp1],       %[ftmp9]           \n\t"
-                "psrlh      %[ftmp2],   %[ftmp2],       %[ftmp9]           \n\t"
-                "packushb   %[ftmp1],   %[ftmp1],       %[ftmp2]           \n\t"
-                MMI_SDC1(%[ftmp1], %[dst], 0x00)
-                PTR_ADDU   "%[dst],     %[dst],         %[stride]          \n\t"
-
-                MMI_ULDC1(%[ftmp1], %[src], 0x00)
-                MMI_ULDC1(%[ftmp2], %[src], 0x01)
-                PTR_ADDU   "%[src],     %[src],         %[stride]          \n\t"
-                MMI_ULDC1(%[ftmp3], %[src], 0x00)
-                MMI_ULDC1(%[ftmp4], %[src], 0x01)
-
-                "punpcklbh  %[ftmp5],   %[ftmp1],       %[ftmp0]           \n\t"
-                "punpckhbh  %[ftmp6],   %[ftmp1],       %[ftmp0]           \n\t"
-                "punpcklbh  %[ftmp7],   %[ftmp2],       %[ftmp0]           \n\t"
-                "punpckhbh  %[ftmp8],   %[ftmp2],       %[ftmp0]           \n\t"
-                "pmullh     %[ftmp5],   %[ftmp5],       %[A]               \n\t"
-                "pmullh     %[ftmp7],   %[ftmp7],       %[B]               \n\t"
-                "paddh      %[ftmp1],   %[ftmp5],       %[ftmp7]           \n\t"
-                "pmullh     %[ftmp6],   %[ftmp6],       %[A]               \n\t"
-                "pmullh     %[ftmp8],   %[ftmp8],       %[B]               \n\t"
-                "paddh      %[ftmp2],   %[ftmp6],       %[ftmp8]           \n\t"
-
-                "punpcklbh  %[ftmp5],   %[ftmp3],       %[ftmp0]           \n\t"
-                "punpckhbh  %[ftmp6],   %[ftmp3],       %[ftmp0]           \n\t"
-                "punpcklbh  %[ftmp7],   %[ftmp4],       %[ftmp0]           \n\t"
-                "punpckhbh  %[ftmp8],   %[ftmp4],       %[ftmp0]           \n\t"
-                "pmullh     %[ftmp5],   %[ftmp5],       %[C]               \n\t"
-                "pmullh     %[ftmp7],   %[ftmp7],       %[D]               \n\t"
-                "paddh      %[ftmp3],   %[ftmp5],       %[ftmp7]           \n\t"
-                "pmullh     %[ftmp6],   %[ftmp6],       %[C]               \n\t"
-                "pmullh     %[ftmp8],   %[ftmp8],       %[D]               \n\t"
-                "paddh      %[ftmp4],   %[ftmp6],       %[ftmp8]           \n\t"
-
-                "paddh      %[ftmp1],   %[ftmp1],       %[ftmp3]           \n\t"
-                "paddh      %[ftmp2],   %[ftmp2],       %[ftmp4]           \n\t"
-                "paddh      %[ftmp1],   %[ftmp1],       %[ff_pw_32]        \n\t"
-                "paddh      %[ftmp2],   %[ftmp2],       %[ff_pw_32]        \n\t"
-                "psrlh      %[ftmp1],   %[ftmp1],       %[ftmp9]           \n\t"
-                "psrlh      %[ftmp2],   %[ftmp2],       %[ftmp9]           \n\t"
-                "packushb   %[ftmp1],   %[ftmp1],       %[ftmp2]           \n\t"
-                MMI_SDC1(%[ftmp1], %[dst], 0x00)
-                PTR_ADDU   "%[dst],     %[dst],         %[stride]          \n\t"
-
-                "bnez       %[h],       1b                                 \n\t"
-                : [ftmp0]"=&f"(ftmp[0]),        [ftmp1]"=&f"(ftmp[1]),
-                  [ftmp2]"=&f"(ftmp[2]),        [ftmp3]"=&f"(ftmp[3]),
-                  [ftmp4]"=&f"(ftmp[4]),        [ftmp5]"=&f"(ftmp[5]),
-                  [ftmp6]"=&f"(ftmp[6]),        [ftmp7]"=&f"(ftmp[7]),
-                  [ftmp8]"=&f"(ftmp[8]),        [ftmp9]"=&f"(ftmp[9]),
-                  [tmp0]"=&r"(tmp[0]),
-                  [dst]"+&r"(dst),              [src]"+&r"(src),
-                  [h]"+&r"(h)
-                : [stride]"r"((mips_reg)stride),[ff_pw_32]"f"(ff_pw_32),
-                  [A]"f"(A),                    [B]"f"(B),
-                  [C]"f"(C),                    [D]"f"(D)
-                : "memory"
-            );
-        } else {
-            if (x) {
-                /* x!=0, y==0 */
-                E = x << 3;
-                A = 64 - E;
-
-                __asm__ volatile (
-                    "xor        %[ftmp0],   %[ftmp0],       %[ftmp0]           \n\t"
-                    "dli        %[tmp0],    0x06                               \n\t"
-                    "pshufh     %[A],       %[A],           %[ftmp0]           \n\t"
-                    "pshufh     %[E],       %[E],           %[ftmp0]           \n\t"
-                    "mtc1       %[tmp0],    %[ftmp7]                           \n\t"
-
-                    "1:                                                        \n\t"
-                    MMI_ULDC1(%[ftmp1], %[src], 0x00)
-                    MMI_ULDC1(%[ftmp2], %[src], 0x01)
-                    "addi       %[h],       %[h],           -0x01              \n\t"
-                    PTR_ADDU   "%[src],     %[src],         %[stride]          \n\t"
-
-                    "punpcklbh  %[ftmp3],   %[ftmp1],       %[ftmp0]           \n\t"
-                    "punpckhbh  %[ftmp4],   %[ftmp1],       %[ftmp0]           \n\t"
-                    "punpcklbh  %[ftmp5],   %[ftmp2],       %[ftmp0]           \n\t"
-                    "punpckhbh  %[ftmp6],   %[ftmp2],       %[ftmp0]           \n\t"
-                    "pmullh     %[ftmp3],   %[ftmp3],       %[A]               \n\t"
-                    "pmullh     %[ftmp5],   %[ftmp5],       %[E]               \n\t"
-                    "paddh      %[ftmp1],   %[ftmp3],       %[ftmp5]           \n\t"
-                    "pmullh     %[ftmp4],   %[ftmp4],       %[A]               \n\t"
-                    "pmullh     %[ftmp6],   %[ftmp6],       %[E]               \n\t"
-                    "paddh      %[ftmp2],   %[ftmp4],       %[ftmp6]           \n\t"
-
-                    "paddh      %[ftmp1],   %[ftmp1],       %[ff_pw_32]        \n\t"
-                    "paddh      %[ftmp2],   %[ftmp2],       %[ff_pw_32]        \n\t"
-                    "psrlh      %[ftmp1],   %[ftmp1],       %[ftmp7]           \n\t"
-                    "psrlh      %[ftmp2],   %[ftmp2],       %[ftmp7]           \n\t"
-                    "packushb   %[ftmp1],   %[ftmp1],       %[ftmp2]           \n\t"
-                    MMI_SDC1(%[ftmp1], %[dst], 0x00)
-                    PTR_ADDU   "%[dst],     %[dst],         %[stride]          \n\t"
-                    "bnez       %[h],       1b                                 \n\t"
-                    : [ftmp0]"=&f"(ftmp[0]),        [ftmp1]"=&f"(ftmp[1]),
-                      [ftmp2]"=&f"(ftmp[2]),        [ftmp3]"=&f"(ftmp[3]),
-                      [ftmp4]"=&f"(ftmp[4]),        [ftmp5]"=&f"(ftmp[5]),
-                      [ftmp6]"=&f"(ftmp[6]),        [ftmp7]"=&f"(ftmp[7]),
-                      [tmp0]"=&r"(tmp[0]),
-                      [dst]"+&r"(dst),              [src]"+&r"(src),
-                      [h]"+&r"(h)
-                    : [stride]"r"((mips_reg)stride),
-                      [ff_pw_32]"f"(ff_pw_32),
-                      [A]"f"(A),                    [E]"f"(E)
-                    : "memory"
-                );
-            } else {
-                /* x==0, y!=0 */
-                E = y << 3;
-                A = 64 - E;
-
-                __asm__ volatile (
-                    "xor        %[ftmp0],   %[ftmp0],       %[ftmp0]           \n\t"
-                    "dli        %[tmp0],    0x06                               \n\t"
-                    "pshufh     %[A],       %[A],           %[ftmp0]           \n\t"
-                    "pshufh     %[E],       %[E],           %[ftmp0]           \n\t"
-                    "mtc1       %[tmp0],    %[ftmp7]                           \n\t"
-
-                    "1:                                                        \n\t"
-                    MMI_ULDC1(%[ftmp1], %[src], 0x00)
-                    PTR_ADDU   "%[src],     %[src],         %[stride]          \n\t"
-                    MMI_ULDC1(%[ftmp2], %[src], 0x00)
-                    "addi       %[h],       %[h],           -0x01              \n\t"
-
-                    "punpcklbh  %[ftmp3],   %[ftmp1],       %[ftmp0]           \n\t"
-                    "punpckhbh  %[ftmp4],   %[ftmp1],       %[ftmp0]           \n\t"
-                    "punpcklbh  %[ftmp5],   %[ftmp2],       %[ftmp0]           \n\t"
-                    "punpckhbh  %[ftmp6],   %[ftmp2],       %[ftmp0]           \n\t"
-                    "pmullh     %[ftmp3],   %[ftmp3],       %[A]               \n\t"
-                    "pmullh     %[ftmp5],   %[ftmp5],       %[E]               \n\t"
-                    "paddh      %[ftmp1],   %[ftmp3],       %[ftmp5]           \n\t"
-                    "pmullh     %[ftmp4],   %[ftmp4],       %[A]               \n\t"
-                    "pmullh     %[ftmp6],   %[ftmp6],       %[E]               \n\t"
-                    "paddh      %[ftmp2],   %[ftmp4],       %[ftmp6]           \n\t"
-
-                    "paddh      %[ftmp1],   %[ftmp1],       %[ff_pw_32]        \n\t"
-                    "paddh      %[ftmp2],   %[ftmp2],       %[ff_pw_32]        \n\t"
-                    "psrlh      %[ftmp1],   %[ftmp1],       %[ftmp7]           \n\t"
-                    "psrlh      %[ftmp2],   %[ftmp2],       %[ftmp7]           \n\t"
-                    "packushb   %[ftmp1],   %[ftmp1],       %[ftmp2]           \n\t"
-                    MMI_SDC1(%[ftmp1], %[dst], 0x00)
-
-                    PTR_ADDU   "%[dst],     %[dst],         %[stride]          \n\t"
-                    "bnez       %[h],       1b                                 \n\t"
-                    : [ftmp0]"=&f"(ftmp[0]),        [ftmp1]"=&f"(ftmp[1]),
-                      [ftmp2]"=&f"(ftmp[2]),        [ftmp3]"=&f"(ftmp[3]),
-                      [ftmp4]"=&f"(ftmp[4]),        [ftmp5]"=&f"(ftmp[5]),
-                      [ftmp6]"=&f"(ftmp[6]),        [ftmp7]"=&f"(ftmp[7]),
-                      [tmp0]"=&r"(tmp[0]),
-                      [dst]"+&r"(dst),              [src]"+&r"(src),
-                      [h]"+&r"(h)
-                    : [stride]"r"((mips_reg)stride),
-                      [ff_pw_32]"f"(ff_pw_32),
-                      [A]"f"(A),                    [E]"f"(E)
-                    : "memory"
-                );
-            }
-        }
+            MMI_SDC1(%[ftmp1], %[dst], 0x00)
+            PTR_ADDU   "%[dst],     %[dst],         %[stride]          \n\t"
+            MMI_SDC1(%[ftmp2], %[dst], 0x00)
+            PTR_ADDU   "%[dst],     %[dst],         %[stride]          \n\t"
+            "bnez       %[h],       1b                                 \n\t"
+            : [ftmp0]"=&f"(ftmp[0]),        [ftmp1]"=&f"(ftmp[1]),
+              [ftmp2]"=&f"(ftmp[2]),        [ftmp3]"=&f"(ftmp[3]),
+              [ftmp4]"=&f"(ftmp[4]),        [ftmp5]"=&f"(ftmp[5]),
+              [ftmp6]"=&f"(ftmp[6]),        [ftmp7]"=&f"(ftmp[7]),
+              [ftmp8]"=&f"(ftmp[8]),        [tmp0]"=&r"(tmp[0]),
+              [dst]"+&r"(dst),              [src]"+&r"(src),
+              [h]"+&r"(h)
+            : [stride]"r"((mips_reg)stride),
+              [ff_pw_32]"f"(ff_pw_32),
+              [A]"f"(A),                    [E]"f"(E)
+            : "memory"
+        );
     }
 }
 
@@ -334,231 +297,200 @@
     if(!(x || y)){
         /* x=0, y=0, A=64 */
         __asm__ volatile (
-            "xor        %[ftmp0],   %[ftmp0],       %[ftmp0]            \n\t"
-            "dli        %[tmp0],    0x06                                \n\t"
-            "pshufh     %[A],       %[A],           %[ftmp0]            \n\t"
-            "mtc1       %[tmp0],    %[ftmp4]                            \n\t"
-
             "1:                                                         \n\t"
+            MMI_ULDC1(%[ftmp0], %[src], 0x00)
+            PTR_ADDU   "%[src],     %[src],         %[stride]           \n\t"
             MMI_ULDC1(%[ftmp1], %[src], 0x00)
             PTR_ADDU   "%[src],     %[src],         %[stride]           \n\t"
-            MMI_ULDC1(%[ftmp5], %[src], 0x00)
-            PTR_ADDU   "%[src],     %[src],         %[stride]           \n\t"
-
-            "punpcklbh  %[ftmp2],   %[ftmp1],       %[ftmp0]            \n\t"
-            "punpckhbh  %[ftmp3],   %[ftmp1],       %[ftmp0]            \n\t"
-            "pmullh     %[ftmp1],   %[ftmp2],       %[A]                \n\t"
-            "pmullh     %[ftmp2],   %[ftmp3],       %[A]                \n\t"
-            "paddh      %[ftmp1],   %[ftmp1],       %[ff_pw_32]         \n\t"
-            "paddh      %[ftmp2],   %[ftmp2],       %[ff_pw_32]         \n\t"
-            "psrlh      %[ftmp1],   %[ftmp1],       %[ftmp4]            \n\t"
-            "psrlh      %[ftmp2],   %[ftmp2],       %[ftmp4]            \n\t"
-            "packushb   %[ftmp1],   %[ftmp1],       %[ftmp2]            \n\t"
             MMI_LDC1(%[ftmp2], %[dst], 0x00)
-            "pavgb      %[ftmp1],   %[ftmp1],       %[ftmp2]            \n\t"
+            PTR_ADDU   "%[dst],     %[dst],         %[stride]           \n\t"
+            MMI_LDC1(%[ftmp3], %[dst], 0x00)
+            PTR_SUBU   "%[dst],     %[dst],         %[stride]           \n\t"
+            "pavgb      %[ftmp0],   %[ftmp0],       %[ftmp2]            \n\t"
+            "pavgb      %[ftmp1],   %[ftmp1],       %[ftmp3]            \n\t"
+            MMI_SDC1(%[ftmp0], %[dst], 0x00)
+            PTR_ADDU   "%[dst],     %[dst],         %[stride]           \n\t"
             MMI_SDC1(%[ftmp1], %[dst], 0x00)
             PTR_ADDU   "%[dst],     %[dst],         %[stride]           \n\t"
-
-            "punpcklbh  %[ftmp2],   %[ftmp5],       %[ftmp0]            \n\t"
-            "punpckhbh  %[ftmp3],   %[ftmp5],       %[ftmp0]            \n\t"
-            "pmullh     %[ftmp1],   %[ftmp2],       %[A]                \n\t"
-            "pmullh     %[ftmp2],   %[ftmp3],       %[A]                \n\t"
-            "paddh      %[ftmp1],   %[ftmp1],       %[ff_pw_32]         \n\t"
-            "paddh      %[ftmp2],   %[ftmp2],       %[ff_pw_32]         \n\t"
-            "psrlh      %[ftmp1],   %[ftmp1],       %[ftmp4]            \n\t"
-            "psrlh      %[ftmp2],   %[ftmp2],       %[ftmp4]            \n\t"
-            "packushb   %[ftmp1],   %[ftmp1],       %[ftmp2]            \n\t"
-            MMI_LDC1(%[ftmp2], %[dst], 0x00)
-            "pavgb      %[ftmp1],   %[ftmp1],       %[ftmp2]            \n\t"
-            MMI_SDC1(%[ftmp1], %[dst], 0x00)
-            PTR_ADDU   "%[dst],     %[dst],         %[stride]           \n\t"
-
             "addi       %[h],       %[h],           -0x02               \n\t"
             "bnez       %[h],       1b                                  \n\t"
             : [ftmp0]"=&f"(ftmp[0]),        [ftmp1]"=&f"(ftmp[1]),
               [ftmp2]"=&f"(ftmp[2]),        [ftmp3]"=&f"(ftmp[3]),
+              [dst]"+&r"(dst),              [src]"+&r"(src),
+              [h]"+&r"(h)
+            : [stride]"r"((mips_reg)stride)
+            : "memory"
+        );
+    } else if (x && y) {
+        /* x!=0, y!=0 */
+        D = x * y;
+        B = (x << 3) - D;
+        C = (y << 3) - D;
+        A = 64 - D - B - C;
+        __asm__ volatile (
+            "xor        %[ftmp0],   %[ftmp0],       %[ftmp0]       \n\t"
+            "dli        %[tmp0],    0x06                           \n\t"
+            "pshufh     %[A],       %[A],           %[ftmp0]       \n\t"
+            "pshufh     %[B],       %[B],           %[ftmp0]       \n\t"
+            "mtc1       %[tmp0],    %[ftmp9]                       \n\t"
+            "pshufh     %[C],       %[C],           %[ftmp0]       \n\t"
+            "pshufh     %[D],       %[D],           %[ftmp0]       \n\t"
+
+            "1:                                                    \n\t"
+            MMI_ULDC1(%[ftmp1], %[src], 0x00)
+            MMI_ULDC1(%[ftmp2], %[src], 0x01)
+            PTR_ADDU   "%[src],     %[src],         %[stride]      \n\t"
+            MMI_ULDC1(%[ftmp3], %[src], 0x00)
+            MMI_ULDC1(%[ftmp4], %[src], 0x01)
+            "addi       %[h],       %[h],           -0x01          \n\t"
+
+            "punpcklbh  %[ftmp5],   %[ftmp1],       %[ftmp0]       \n\t"
+            "punpckhbh  %[ftmp6],   %[ftmp1],       %[ftmp0]       \n\t"
+            "punpcklbh  %[ftmp7],   %[ftmp2],       %[ftmp0]       \n\t"
+            "punpckhbh  %[ftmp8],   %[ftmp2],       %[ftmp0]       \n\t"
+            "pmullh     %[ftmp5],   %[ftmp5],       %[A]           \n\t"
+            "pmullh     %[ftmp7],   %[ftmp7],       %[B]           \n\t"
+            "paddh      %[ftmp1],   %[ftmp5],       %[ftmp7]       \n\t"
+            "pmullh     %[ftmp6],   %[ftmp6],       %[A]           \n\t"
+            "pmullh     %[ftmp8],   %[ftmp8],       %[B]           \n\t"
+            "paddh      %[ftmp2],   %[ftmp6],       %[ftmp8]       \n\t"
+
+            "punpcklbh  %[ftmp5],   %[ftmp3],       %[ftmp0]       \n\t"
+            "punpckhbh  %[ftmp6],   %[ftmp3],       %[ftmp0]       \n\t"
+            "punpcklbh  %[ftmp7],   %[ftmp4],       %[ftmp0]       \n\t"
+            "punpckhbh  %[ftmp8],   %[ftmp4],       %[ftmp0]       \n\t"
+            "pmullh     %[ftmp5],   %[ftmp5],       %[C]           \n\t"
+            "pmullh     %[ftmp7],   %[ftmp7],       %[D]           \n\t"
+            "paddh      %[ftmp3],   %[ftmp5],       %[ftmp7]       \n\t"
+            "pmullh     %[ftmp6],   %[ftmp6],       %[C]           \n\t"
+            "pmullh     %[ftmp8],   %[ftmp8],       %[D]           \n\t"
+            "paddh      %[ftmp4],   %[ftmp6],       %[ftmp8]       \n\t"
+
+            "paddh      %[ftmp1],   %[ftmp1],       %[ftmp3]       \n\t"
+            "paddh      %[ftmp2],   %[ftmp2],       %[ftmp4]       \n\t"
+            "paddh      %[ftmp1],   %[ftmp1],       %[ff_pw_32]    \n\t"
+            "paddh      %[ftmp2],   %[ftmp2],       %[ff_pw_32]    \n\t"
+            "psrlh      %[ftmp1],   %[ftmp1],       %[ftmp9]       \n\t"
+            "psrlh      %[ftmp2],   %[ftmp2],       %[ftmp9]       \n\t"
+            "packushb   %[ftmp1],   %[ftmp1],       %[ftmp2]       \n\t"
+            MMI_LDC1(%[ftmp2], %[dst], 0x00)
+            "pavgb      %[ftmp1],   %[ftmp1],       %[ftmp2]       \n\t"
+            MMI_SDC1(%[ftmp1], %[dst], 0x00)
+            PTR_ADDU   "%[dst],     %[dst],         %[stride]      \n\t"
+            "bnez       %[h],       1b                             \n\t"
+            : [ftmp0]"=&f"(ftmp[0]),        [ftmp1]"=&f"(ftmp[1]),
+              [ftmp2]"=&f"(ftmp[2]),        [ftmp3]"=&f"(ftmp[3]),
               [ftmp4]"=&f"(ftmp[4]),        [ftmp5]"=&f"(ftmp[5]),
+              [ftmp6]"=&f"(ftmp[6]),        [ftmp7]"=&f"(ftmp[7]),
+              [ftmp8]"=&f"(ftmp[8]),        [ftmp9]"=&f"(ftmp[9]),
               [tmp0]"=&r"(tmp[0]),
               [dst]"+&r"(dst),              [src]"+&r"(src),
               [h]"+&r"(h)
             : [stride]"r"((mips_reg)stride),[ff_pw_32]"f"(ff_pw_32),
-              [A]"f"(A)
+              [A]"f"(A),                    [B]"f"(B),
+              [C]"f"(C),                    [D]"f"(D)
+            : "memory"
+        );
+    } else if (x) {
+        /* x!=0, y==0 */
+        E = x << 3;
+        A = 64 - E;
+        __asm__ volatile (
+            "xor        %[ftmp0],   %[ftmp0],       %[ftmp0]       \n\t"
+            "dli        %[tmp0],    0x06                           \n\t"
+            "pshufh     %[A],       %[A],           %[ftmp0]       \n\t"
+            "pshufh     %[E],       %[E],           %[ftmp0]       \n\t"
+            "mtc1       %[tmp0],    %[ftmp7]                       \n\t"
+
+            "1:                                                    \n\t"
+            MMI_ULDC1(%[ftmp1], %[src], 0x00)
+            MMI_ULDC1(%[ftmp2], %[src], 0x01)
+            PTR_ADDU   "%[src],     %[src],         %[stride]      \n\t"
+            "addi       %[h],       %[h],           -0x01          \n\t"
+
+            "punpcklbh  %[ftmp3],   %[ftmp1],       %[ftmp0]       \n\t"
+            "punpckhbh  %[ftmp4],   %[ftmp1],       %[ftmp0]       \n\t"
+            "punpcklbh  %[ftmp5],   %[ftmp2],       %[ftmp0]       \n\t"
+            "punpckhbh  %[ftmp6],   %[ftmp2],       %[ftmp0]       \n\t"
+            "pmullh     %[ftmp3],   %[ftmp3],       %[A]           \n\t"
+            "pmullh     %[ftmp5],   %[ftmp5],       %[E]           \n\t"
+            "paddh      %[ftmp1],   %[ftmp3],       %[ftmp5]       \n\t"
+            "pmullh     %[ftmp4],   %[ftmp4],       %[A]           \n\t"
+            "pmullh     %[ftmp6],   %[ftmp6],       %[E]           \n\t"
+            "paddh      %[ftmp2],   %[ftmp4],       %[ftmp6]       \n\t"
+
+            "paddh      %[ftmp1],   %[ftmp1],       %[ff_pw_32]    \n\t"
+            "paddh      %[ftmp2],   %[ftmp2],       %[ff_pw_32]    \n\t"
+            "psrlh      %[ftmp1],   %[ftmp1],       %[ftmp7]       \n\t"
+            "psrlh      %[ftmp2],   %[ftmp2],       %[ftmp7]       \n\t"
+            "packushb   %[ftmp1],   %[ftmp1],       %[ftmp2]       \n\t"
+            MMI_LDC1(%[ftmp2], %[dst], 0x00)
+            "pavgb      %[ftmp1],   %[ftmp1],       %[ftmp2]       \n\t"
+            MMI_SDC1(%[ftmp1], %[dst], 0x00)
+            PTR_ADDU   "%[dst],     %[dst],         %[stride]      \n\t"
+            "bnez       %[h],       1b                             \n\t"
+            : [ftmp0]"=&f"(ftmp[0]),        [ftmp1]"=&f"(ftmp[1]),
+              [ftmp2]"=&f"(ftmp[2]),        [ftmp3]"=&f"(ftmp[3]),
+              [ftmp4]"=&f"(ftmp[4]),        [ftmp5]"=&f"(ftmp[5]),
+              [ftmp6]"=&f"(ftmp[6]),        [ftmp7]"=&f"(ftmp[7]),
+              [tmp0]"=&r"(tmp[0]),
+              [dst]"+&r"(dst),              [src]"+&r"(src),
+              [h]"+&r"(h)
+            : [stride]"r"((mips_reg)stride),
+              [ff_pw_32]"f"(ff_pw_32),
+              [A]"f"(A),                    [E]"f"(E)
             : "memory"
         );
     } else {
-        if(x && y) {
-            /* x!=0, y!=0 */
-            D = x * y;
-            B = (x << 3) - D;
-            C = (y << 3) - D;
-            A = 64 - D - B - C;
-            __asm__ volatile (
-                "xor        %[ftmp0],   %[ftmp0],       %[ftmp0]       \n\t"
-                "dli        %[tmp0],    0x06                           \n\t"
-                "pshufh     %[A],       %[A],           %[ftmp0]       \n\t"
-                "pshufh     %[B],       %[B],           %[ftmp0]       \n\t"
-                "mtc1       %[tmp0],    %[ftmp9]                       \n\t"
-                "pshufh     %[C],       %[C],           %[ftmp0]       \n\t"
-                "pshufh     %[D],       %[D],           %[ftmp0]       \n\t"
+        /* x==0, y!=0 */
+        E = y << 3;
+        A = 64 - E;
+        __asm__ volatile (
+            "xor        %[ftmp0],   %[ftmp0],       %[ftmp0]       \n\t"
+            "dli        %[tmp0],    0x06                           \n\t"
+            "pshufh     %[A],       %[A],           %[ftmp0]       \n\t"
+            "pshufh     %[E],       %[E],           %[ftmp0]       \n\t"
+            "mtc1       %[tmp0],    %[ftmp7]                       \n\t"
 
-                "1:                                                    \n\t"
-                MMI_ULDC1(%[ftmp1], %[src], 0x00)
-                MMI_ULDC1(%[ftmp2], %[src], 0x01)
-                PTR_ADDU   "%[src],     %[src],         %[stride]      \n\t"
-                MMI_ULDC1(%[ftmp3], %[src], 0x00)
-                MMI_ULDC1(%[ftmp4], %[src], 0x01)
-                "addi       %[h],       %[h],           -0x01          \n\t"
+            "1:                                                    \n\t"
+            MMI_ULDC1(%[ftmp1], %[src], 0x00)
+            PTR_ADDU   "%[src],     %[src],         %[stride]      \n\t"
+            MMI_ULDC1(%[ftmp2], %[src], 0x00)
+            "addi       %[h],       %[h],           -0x01          \n\t"
 
-                "punpcklbh  %[ftmp5],   %[ftmp1],       %[ftmp0]       \n\t"
-                "punpckhbh  %[ftmp6],   %[ftmp1],       %[ftmp0]       \n\t"
-                "punpcklbh  %[ftmp7],   %[ftmp2],       %[ftmp0]       \n\t"
-                "punpckhbh  %[ftmp8],   %[ftmp2],       %[ftmp0]       \n\t"
-                "pmullh     %[ftmp5],   %[ftmp5],       %[A]           \n\t"
-                "pmullh     %[ftmp7],   %[ftmp7],       %[B]           \n\t"
-                "paddh      %[ftmp1],   %[ftmp5],       %[ftmp7]       \n\t"
-                "pmullh     %[ftmp6],   %[ftmp6],       %[A]           \n\t"
-                "pmullh     %[ftmp8],   %[ftmp8],       %[B]           \n\t"
-                "paddh      %[ftmp2],   %[ftmp6],       %[ftmp8]       \n\t"
+            "punpcklbh  %[ftmp3],   %[ftmp1],       %[ftmp0]       \n\t"
+            "punpckhbh  %[ftmp4],   %[ftmp1],       %[ftmp0]       \n\t"
+            "punpcklbh  %[ftmp5],   %[ftmp2],       %[ftmp0]       \n\t"
+            "punpckhbh  %[ftmp6],   %[ftmp2],       %[ftmp0]       \n\t"
+            "pmullh     %[ftmp3],   %[ftmp3],       %[A]           \n\t"
+            "pmullh     %[ftmp5],   %[ftmp5],       %[E]           \n\t"
+            "paddh      %[ftmp1],   %[ftmp3],       %[ftmp5]       \n\t"
+            "pmullh     %[ftmp4],   %[ftmp4],       %[A]           \n\t"
+            "pmullh     %[ftmp6],   %[ftmp6],       %[E]           \n\t"
+            "paddh      %[ftmp2],   %[ftmp4],       %[ftmp6]       \n\t"
 
-                "punpcklbh  %[ftmp5],   %[ftmp3],       %[ftmp0]       \n\t"
-                "punpckhbh  %[ftmp6],   %[ftmp3],       %[ftmp0]       \n\t"
-                "punpcklbh  %[ftmp7],   %[ftmp4],       %[ftmp0]       \n\t"
-                "punpckhbh  %[ftmp8],   %[ftmp4],       %[ftmp0]       \n\t"
-                "pmullh     %[ftmp5],   %[ftmp5],       %[C]           \n\t"
-                "pmullh     %[ftmp7],   %[ftmp7],       %[D]           \n\t"
-                "paddh      %[ftmp3],   %[ftmp5],       %[ftmp7]       \n\t"
-                "pmullh     %[ftmp6],   %[ftmp6],       %[C]           \n\t"
-                "pmullh     %[ftmp8],   %[ftmp8],       %[D]           \n\t"
-                "paddh      %[ftmp4],   %[ftmp6],       %[ftmp8]       \n\t"
-
-                "paddh      %[ftmp1],   %[ftmp1],       %[ftmp3]       \n\t"
-                "paddh      %[ftmp2],   %[ftmp2],       %[ftmp4]       \n\t"
-                "paddh      %[ftmp1],   %[ftmp1],       %[ff_pw_32]    \n\t"
-                "paddh      %[ftmp2],   %[ftmp2],       %[ff_pw_32]    \n\t"
-                "psrlh      %[ftmp1],   %[ftmp1],       %[ftmp9]       \n\t"
-                "psrlh      %[ftmp2],   %[ftmp2],       %[ftmp9]       \n\t"
-                "packushb   %[ftmp1],   %[ftmp1],       %[ftmp2]       \n\t"
-                MMI_LDC1(%[ftmp2], %[dst], 0x00)
-                "pavgb      %[ftmp1],   %[ftmp1],       %[ftmp2]       \n\t"
-                MMI_SDC1(%[ftmp1], %[dst], 0x00)
-                PTR_ADDU   "%[dst],     %[dst],         %[stride]      \n\t"
-                "bnez       %[h],       1b                             \n\t"
-                : [ftmp0]"=&f"(ftmp[0]),        [ftmp1]"=&f"(ftmp[1]),
-                  [ftmp2]"=&f"(ftmp[2]),        [ftmp3]"=&f"(ftmp[3]),
-                  [ftmp4]"=&f"(ftmp[4]),        [ftmp5]"=&f"(ftmp[5]),
-                  [ftmp6]"=&f"(ftmp[6]),        [ftmp7]"=&f"(ftmp[7]),
-                  [ftmp8]"=&f"(ftmp[8]),        [ftmp9]"=&f"(ftmp[9]),
-                  [tmp0]"=&r"(tmp[0]),
-                  [dst]"+&r"(dst),              [src]"+&r"(src),
-                  [h]"+&r"(h)
-                : [stride]"r"((mips_reg)stride),[ff_pw_32]"f"(ff_pw_32),
-                  [A]"f"(A),                    [B]"f"(B),
-                  [C]"f"(C),                    [D]"f"(D)
-                : "memory"
-            );
-        } else {
-            if(x) {
-                /* x!=0, y==0 */
-                E = x << 3;
-                A = 64 - E;
-                __asm__ volatile (
-                    "xor        %[ftmp0],   %[ftmp0],       %[ftmp0]       \n\t"
-                    "dli        %[tmp0],    0x06                           \n\t"
-                    "pshufh     %[A],       %[A],           %[ftmp0]       \n\t"
-                    "pshufh     %[E],       %[E],           %[ftmp0]       \n\t"
-                    "mtc1       %[tmp0],    %[ftmp7]                       \n\t"
-
-                    "1:                                                    \n\t"
-                    MMI_ULDC1(%[ftmp1], %[src], 0x00)
-                    MMI_ULDC1(%[ftmp2], %[src], 0x01)
-                    PTR_ADDU   "%[src],     %[src],         %[stride]      \n\t"
-                    "addi       %[h],       %[h],           -0x01          \n\t"
-
-                    "punpcklbh  %[ftmp3],   %[ftmp1],       %[ftmp0]       \n\t"
-                    "punpckhbh  %[ftmp4],   %[ftmp1],       %[ftmp0]       \n\t"
-                    "punpcklbh  %[ftmp5],   %[ftmp2],       %[ftmp0]       \n\t"
-                    "punpckhbh  %[ftmp6],   %[ftmp2],       %[ftmp0]       \n\t"
-                    "pmullh     %[ftmp3],   %[ftmp3],       %[A]           \n\t"
-                    "pmullh     %[ftmp5],   %[ftmp5],       %[E]           \n\t"
-                    "paddh      %[ftmp1],   %[ftmp3],       %[ftmp5]       \n\t"
-                    "pmullh     %[ftmp4],   %[ftmp4],       %[A]           \n\t"
-                    "pmullh     %[ftmp6],   %[ftmp6],       %[E]           \n\t"
-                    "paddh      %[ftmp2],   %[ftmp4],       %[ftmp6]       \n\t"
-
-                    "paddh      %[ftmp1],   %[ftmp1],       %[ff_pw_32]    \n\t"
-                    "paddh      %[ftmp2],   %[ftmp2],       %[ff_pw_32]    \n\t"
-                    "psrlh      %[ftmp1],   %[ftmp1],       %[ftmp7]       \n\t"
-                    "psrlh      %[ftmp2],   %[ftmp2],       %[ftmp7]       \n\t"
-                    "packushb   %[ftmp1],   %[ftmp1],       %[ftmp2]       \n\t"
-                    MMI_LDC1(%[ftmp2], %[dst], 0x00)
-                    "pavgb      %[ftmp1],   %[ftmp1],       %[ftmp2]       \n\t"
-                    MMI_SDC1(%[ftmp1], %[dst], 0x00)
-                    PTR_ADDU   "%[dst],     %[dst],         %[stride]      \n\t"
-                    "bnez       %[h],       1b                             \n\t"
-                    : [ftmp0]"=&f"(ftmp[0]),        [ftmp1]"=&f"(ftmp[1]),
-                      [ftmp2]"=&f"(ftmp[2]),        [ftmp3]"=&f"(ftmp[3]),
-                      [ftmp4]"=&f"(ftmp[4]),        [ftmp5]"=&f"(ftmp[5]),
-                      [ftmp6]"=&f"(ftmp[6]),        [ftmp7]"=&f"(ftmp[7]),
-                      [tmp0]"=&r"(tmp[0]),
-                      [dst]"+&r"(dst),              [src]"+&r"(src),
-                      [h]"+&r"(h)
-                    : [stride]"r"((mips_reg)stride),
-                      [ff_pw_32]"f"(ff_pw_32),
-                      [A]"f"(A),                    [E]"f"(E)
-                    : "memory"
-                );
-            } else {
-                /* x==0, y!=0 */
-                E = y << 3;
-                A = 64 - E;
-                __asm__ volatile (
-                    "xor        %[ftmp0],   %[ftmp0],       %[ftmp0]       \n\t"
-                    "dli        %[tmp0],    0x06                           \n\t"
-                    "pshufh     %[A],       %[A],           %[ftmp0]       \n\t"
-                    "pshufh     %[E],       %[E],           %[ftmp0]       \n\t"
-                    "mtc1       %[tmp0],    %[ftmp7]                       \n\t"
-
-                    "1:                                                    \n\t"
-                    MMI_ULDC1(%[ftmp1], %[src], 0x00)
-                    PTR_ADDU   "%[src],     %[src],         %[stride]      \n\t"
-                    MMI_ULDC1(%[ftmp2], %[src], 0x00)
-                    "addi       %[h],       %[h],           -0x01          \n\t"
-
-                    "punpcklbh  %[ftmp3],   %[ftmp1],       %[ftmp0]       \n\t"
-                    "punpckhbh  %[ftmp4],   %[ftmp1],       %[ftmp0]       \n\t"
-                    "punpcklbh  %[ftmp5],   %[ftmp2],       %[ftmp0]       \n\t"
-                    "punpckhbh  %[ftmp6],   %[ftmp2],       %[ftmp0]       \n\t"
-                    "pmullh     %[ftmp3],   %[ftmp3],       %[A]           \n\t"
-                    "pmullh     %[ftmp5],   %[ftmp5],       %[E]           \n\t"
-                    "paddh      %[ftmp1],   %[ftmp3],       %[ftmp5]       \n\t"
-                    "pmullh     %[ftmp4],   %[ftmp4],       %[A]           \n\t"
-                    "pmullh     %[ftmp6],   %[ftmp6],       %[E]           \n\t"
-                    "paddh      %[ftmp2],   %[ftmp4],       %[ftmp6]       \n\t"
-
-                    "paddh      %[ftmp1],   %[ftmp1],       %[ff_pw_32]    \n\t"
-                    "paddh      %[ftmp2],   %[ftmp2],       %[ff_pw_32]    \n\t"
-                    "psrlh      %[ftmp1],   %[ftmp1],       %[ftmp7]       \n\t"
-                    "psrlh      %[ftmp2],   %[ftmp2],       %[ftmp7]       \n\t"
-                    "packushb   %[ftmp1],   %[ftmp1],       %[ftmp2]       \n\t"
-                    MMI_LDC1(%[ftmp2], %[dst], 0x00)
-                    "pavgb      %[ftmp1],   %[ftmp1],       %[ftmp2]       \n\t"
-                    MMI_SDC1(%[ftmp1], %[dst], 0x00)
-                    PTR_ADDU   "%[dst],     %[dst],         %[stride]      \n\t"
-                    "bnez       %[h],       1b                             \n\t"
-                    : [ftmp0]"=&f"(ftmp[0]),        [ftmp1]"=&f"(ftmp[1]),
-                      [ftmp2]"=&f"(ftmp[2]),        [ftmp3]"=&f"(ftmp[3]),
-                      [ftmp4]"=&f"(ftmp[4]),        [ftmp5]"=&f"(ftmp[5]),
-                      [ftmp6]"=&f"(ftmp[6]),        [ftmp7]"=&f"(ftmp[7]),
-                      [tmp0]"=&r"(tmp[0]),
-                      [dst]"+&r"(dst),              [src]"+&r"(src),
-                      [h]"+&r"(h)
-                    : [stride]"r"((mips_reg)stride),
-                      [ff_pw_32]"f"(ff_pw_32),
-                      [A]"f"(A),                    [E]"f"(E)
-                    : "memory"
-                );
-            }
-        }
+            "paddh      %[ftmp1],   %[ftmp1],       %[ff_pw_32]    \n\t"
+            "paddh      %[ftmp2],   %[ftmp2],       %[ff_pw_32]    \n\t"
+            "psrlh      %[ftmp1],   %[ftmp1],       %[ftmp7]       \n\t"
+            "psrlh      %[ftmp2],   %[ftmp2],       %[ftmp7]       \n\t"
+            "packushb   %[ftmp1],   %[ftmp1],       %[ftmp2]       \n\t"
+            MMI_LDC1(%[ftmp2], %[dst], 0x00)
+            "pavgb      %[ftmp1],   %[ftmp1],       %[ftmp2]       \n\t"
+            MMI_SDC1(%[ftmp1], %[dst], 0x00)
+            PTR_ADDU   "%[dst],     %[dst],         %[stride]      \n\t"
+            "bnez       %[h],       1b                             \n\t"
+            : [ftmp0]"=&f"(ftmp[0]),        [ftmp1]"=&f"(ftmp[1]),
+              [ftmp2]"=&f"(ftmp[2]),        [ftmp3]"=&f"(ftmp[3]),
+              [ftmp4]"=&f"(ftmp[4]),        [ftmp5]"=&f"(ftmp[5]),
+              [ftmp6]"=&f"(ftmp[6]),        [ftmp7]"=&f"(ftmp[7]),
+              [tmp0]"=&r"(tmp[0]),
+              [dst]"+&r"(dst),              [src]"+&r"(src),
+              [h]"+&r"(h)
+            : [stride]"r"((mips_reg)stride),
+              [ff_pw_32]"f"(ff_pw_32),
+              [A]"f"(A),                    [E]"f"(E)
+            : "memory"
+        );
     }
 }
 
@@ -567,8 +499,8 @@
 {
     const int A = (8 - x) * (8 - y);
     const int B = x * (8 - y);
-    const int C = (8 - x) *  y;
-    const int D = x *  y;
+    const int C = (8 - x) * y;
+    const int D = x * y;
     const int E = B + C;
     double ftmp[8];
     uint64_t tmp[1];
@@ -586,31 +518,29 @@
             "pshufh     %[D],       %[D],           %[ftmp0]            \n\t"
 
             "1:                                                         \n\t"
-            PTR_ADDU   "%[addr0],   %[src],         %[stride]           \n\t"
             MMI_ULWC1(%[ftmp1], %[src], 0x00)
             MMI_ULWC1(%[ftmp2], %[src], 0x01)
-            MMI_ULWC1(%[ftmp3], %[addr0], 0x00)
-            MMI_ULWC1(%[ftmp4], %[addr0], 0x01)
+            PTR_ADDU   "%[src],     %[src],         %[stride]           \n\t"
+            MMI_ULWC1(%[ftmp3], %[src], 0x00)
+            MMI_ULWC1(%[ftmp4], %[src], 0x01)
 
             "punpcklbh  %[ftmp5],   %[ftmp1],       %[ftmp0]            \n\t"
             "punpcklbh  %[ftmp6],   %[ftmp2],       %[ftmp0]            \n\t"
             "pmullh     %[ftmp5],   %[ftmp5],       %[A]                \n\t"
             "pmullh     %[ftmp6],   %[ftmp6],       %[B]                \n\t"
             "paddh      %[ftmp1],   %[ftmp5],       %[ftmp6]            \n\t"
-
             "punpcklbh  %[ftmp5],   %[ftmp3],       %[ftmp0]            \n\t"
             "punpcklbh  %[ftmp6],   %[ftmp4],       %[ftmp0]            \n\t"
             "pmullh     %[ftmp5],   %[ftmp5],       %[C]                \n\t"
             "pmullh     %[ftmp6],   %[ftmp6],       %[D]                \n\t"
             "paddh      %[ftmp2],   %[ftmp5],       %[ftmp6]            \n\t"
-
             "paddh      %[ftmp1],   %[ftmp1],       %[ftmp2]            \n\t"
             "paddh      %[ftmp1],   %[ftmp1],       %[ff_pw_32]         \n\t"
             "psrlh      %[ftmp1],   %[ftmp1],       %[ftmp7]            \n\t"
             "packushb   %[ftmp1],   %[ftmp1],       %[ftmp0]            \n\t"
+
             "addi       %[h],       %[h],           -0x01               \n\t"
             MMI_SWC1(%[ftmp1], %[dst], 0x00)
-            PTR_ADDU   "%[src],     %[src],         %[stride]           \n\t"
             PTR_ADDU   "%[dst],     %[dst],         %[stride]           \n\t"
             "bnez       %[h],       1b                                  \n\t"
             : [ftmp0]"=&f"(ftmp[0]),        [ftmp1]"=&f"(ftmp[1]),
@@ -619,7 +549,6 @@
               [ftmp6]"=&f"(ftmp[6]),        [ftmp7]"=&f"(ftmp[7]),
               [tmp0]"=&r"(tmp[0]),
               RESTRICT_ASM_LOW32
-              [addr0]"=&r"(addr[0]),
               [dst]"+&r"(dst),              [src]"+&r"(src),
               [h]"+&r"(h)
             : [stride]"r"((mips_reg)stride),[ff_pw_32]"f"(ff_pw_32),
@@ -629,7 +558,6 @@
         );
     } else if (E) {
         const int step = C ? stride : 1;
-
         __asm__ volatile (
             "xor        %[ftmp0],   %[ftmp0],       %[ftmp0]            \n\t"
             "dli        %[tmp0],    0x06                                \n\t"
@@ -638,22 +566,20 @@
             "mtc1       %[tmp0],    %[ftmp5]                            \n\t"
 
             "1:                                                         \n\t"
-            PTR_ADDU   "%[addr0],   %[src],         %[step]             \n\t"
             MMI_ULWC1(%[ftmp1], %[src], 0x00)
+            PTR_ADDU   "%[addr0],   %[src],         %[step]             \n\t"
             MMI_ULWC1(%[ftmp2], %[addr0], 0x00)
-
+            PTR_ADDU   "%[src],     %[src],         %[stride]           \n\t"
+            "addi       %[h],       %[h],           -0x01               \n\t"
             "punpcklbh  %[ftmp3],   %[ftmp1],       %[ftmp0]            \n\t"
             "punpcklbh  %[ftmp4],   %[ftmp2],       %[ftmp0]            \n\t"
             "pmullh     %[ftmp3],   %[ftmp3],       %[A]                \n\t"
             "pmullh     %[ftmp4],   %[ftmp4],       %[E]                \n\t"
             "paddh      %[ftmp1],   %[ftmp3],       %[ftmp4]            \n\t"
-
             "paddh      %[ftmp1],   %[ftmp1],       %[ff_pw_32]         \n\t"
             "psrlh      %[ftmp1],   %[ftmp1],       %[ftmp5]            \n\t"
             "packushb   %[ftmp1],   %[ftmp1],       %[ftmp0]            \n\t"
-            "addi       %[h],       %[h],           -0x01               \n\t"
             MMI_SWC1(%[ftmp1], %[dst], 0x00)
-            PTR_ADDU   "%[src],     %[src],         %[stride]           \n\t"
             PTR_ADDU   "%[dst],     %[dst],         %[stride]           \n\t"
             "bnez       %[h],       1b                                  \n\t"
             : [ftmp0]"=&f"(ftmp[0]),        [ftmp1]"=&f"(ftmp[1]),
@@ -671,42 +597,22 @@
         );
     } else {
         __asm__ volatile (
-            "xor        %[ftmp0],   %[ftmp0],       %[ftmp0]            \n\t"
-            "dli        %[tmp0],    0x06                                \n\t"
-            "pshufh     %[A],       %[A],           %[ftmp0]            \n\t"
-            "mtc1       %[tmp0],    %[ftmp3]                            \n\t"
-
             "1:                                                         \n\t"
-            MMI_ULWC1(%[ftmp1], %[src], 0x00)
-            "punpcklbh  %[ftmp2],   %[ftmp1],       %[ftmp0]            \n\t"
-            "pmullh     %[ftmp1],   %[ftmp2],       %[A]                \n\t"
-            "paddh      %[ftmp1],   %[ftmp1],       %[ff_pw_32]         \n\t"
-            "psrlh      %[ftmp1],   %[ftmp1],       %[ftmp3]            \n\t"
-            "packushb   %[ftmp1],   %[ftmp1],       %[ftmp0]            \n\t"
+            MMI_ULWC1(%[ftmp0], %[src], 0x00)
             PTR_ADDU   "%[src],     %[src],         %[stride]           \n\t"
-            MMI_SWC1(%[ftmp1], %[dst], 0x00)
-            PTR_ADDU   "%[dst],     %[dst],         %[stride]           \n\t"
-
             MMI_ULWC1(%[ftmp1], %[src], 0x00)
-            "punpcklbh  %[ftmp2],   %[ftmp1],       %[ftmp0]            \n\t"
-            "pmullh     %[ftmp1],   %[ftmp2],       %[A]                \n\t"
-            "paddh      %[ftmp1],   %[ftmp1],       %[ff_pw_32]         \n\t"
-            "psrlh      %[ftmp1],   %[ftmp1],       %[ftmp3]            \n\t"
-            "packushb   %[ftmp1],   %[ftmp1],       %[ftmp0]            \n\t"
+            PTR_ADDU   "%[src],     %[src],         %[stride]           \n\t"
             "addi       %[h],       %[h],           -0x02               \n\t"
+            MMI_SWC1(%[ftmp0], %[dst], 0x00)
+            PTR_ADDU   "%[dst],     %[dst],         %[stride]           \n\t"
             MMI_SWC1(%[ftmp1], %[dst], 0x00)
-
-            PTR_ADDU   "%[src],     %[src],         %[stride]           \n\t"
             PTR_ADDU   "%[dst],     %[dst],         %[stride]           \n\t"
             "bnez       %[h],       1b                                  \n\t"
             : [ftmp0]"=&f"(ftmp[0]),        [ftmp1]"=&f"(ftmp[1]),
-              [ftmp2]"=&f"(ftmp[2]),        [ftmp3]"=&f"(ftmp[3]),
-              [tmp0]"=&r"(tmp[0]),
-              RESTRICT_ASM_LOW32
               [dst]"+&r"(dst),              [src]"+&r"(src),
+              RESTRICT_ASM_LOW32
               [h]"+&r"(h)
-            : [stride]"r"((mips_reg)stride),[ff_pw_32]"f"(ff_pw_32),
-              [A]"f"(A)
+            : [stride]"r"((mips_reg)stride)
             : "memory"
         );
     }
@@ -736,33 +642,31 @@
             "pshufh     %[D],       %[D],           %[ftmp0]            \n\t"
 
             "1:                                                         \n\t"
-            PTR_ADDU   "%[addr0],   %[src],         %[stride]           \n\t"
             MMI_ULWC1(%[ftmp1], %[src], 0x00)
             MMI_ULWC1(%[ftmp2], %[src], 0x01)
-            MMI_ULWC1(%[ftmp3], %[addr0], 0x00)
-            MMI_ULWC1(%[ftmp4], %[addr0], 0x01)
+            PTR_ADDU   "%[src],     %[src],         %[stride]           \n\t"
+            MMI_ULWC1(%[ftmp3], %[src], 0x00)
+            MMI_ULWC1(%[ftmp4], %[src], 0x01)
 
             "punpcklbh  %[ftmp5],   %[ftmp1],       %[ftmp0]            \n\t"
             "punpcklbh  %[ftmp6],   %[ftmp2],       %[ftmp0]            \n\t"
             "pmullh     %[ftmp5],   %[ftmp5],       %[A]                \n\t"
             "pmullh     %[ftmp6],   %[ftmp6],       %[B]                \n\t"
             "paddh      %[ftmp1],   %[ftmp5],       %[ftmp6]            \n\t"
-
             "punpcklbh  %[ftmp5],   %[ftmp3],       %[ftmp0]            \n\t"
             "punpcklbh  %[ftmp6],   %[ftmp4],       %[ftmp0]            \n\t"
             "pmullh     %[ftmp5],   %[ftmp5],       %[C]                \n\t"
             "pmullh     %[ftmp6],   %[ftmp6],       %[D]                \n\t"
             "paddh      %[ftmp2],   %[ftmp5],       %[ftmp6]            \n\t"
-
             "paddh      %[ftmp1],   %[ftmp1],       %[ftmp2]            \n\t"
             "paddh      %[ftmp1],   %[ftmp1],       %[ff_pw_32]         \n\t"
             "psrlh      %[ftmp1],   %[ftmp1],       %[ftmp7]            \n\t"
             "packushb   %[ftmp1],   %[ftmp1],       %[ftmp0]            \n\t"
             MMI_LWC1(%[ftmp2], %[dst], 0x00)
             "pavgb      %[ftmp1],   %[ftmp1],       %[ftmp2]            \n\t"
+
             "addi       %[h],       %[h],           -0x01               \n\t"
             MMI_SWC1(%[ftmp1], %[dst], 0x00)
-            PTR_ADDU   "%[src],     %[src],         %[stride]           \n\t"
             PTR_ADDU   "%[dst],     %[dst],         %[stride]           \n\t"
             "bnez       %[h],       1b                                  \n\t"
             : [ftmp0]"=&f"(ftmp[0]),        [ftmp1]"=&f"(ftmp[1]),
@@ -771,7 +675,6 @@
               [ftmp6]"=&f"(ftmp[6]),        [ftmp7]"=&f"(ftmp[7]),
               [tmp0]"=&r"(tmp[0]),
               RESTRICT_ASM_LOW32
-              [addr0]"=&r"(addr[0]),
               [dst]"+&r"(dst),              [src]"+&r"(src),
               [h]"+&r"(h)
             : [stride]"r"((mips_reg)stride),[ff_pw_32]"f"(ff_pw_32),
@@ -781,32 +684,30 @@
         );
     } else if (E) {
         const int step = C ? stride : 1;
-
         __asm__ volatile (
             "xor        %[ftmp0],   %[ftmp0],       %[ftmp0]            \n\t"
             "dli        %[tmp0],    0x06                                \n\t"
             "pshufh     %[A],       %[A],           %[ftmp0]            \n\t"
             "pshufh     %[E],       %[E],           %[ftmp0]            \n\t"
             "mtc1       %[tmp0],    %[ftmp5]                            \n\t"
-            "1:                                                         \n\t"
-            PTR_ADDU   "%[addr0],   %[src],         %[step]             \n\t"
-            MMI_ULWC1(%[ftmp1], %[src], 0x00)
-            MMI_ULWC1(%[ftmp2], %[addr0], 0x00)
 
+            "1:                                                         \n\t"
+            MMI_ULWC1(%[ftmp1], %[src], 0x00)
+            PTR_ADDU   "%[addr0],   %[src],         %[step]             \n\t"
+            MMI_ULWC1(%[ftmp2], %[addr0], 0x00)
+            PTR_ADDU   "%[src],     %[src],         %[stride]           \n\t"
+            "addi       %[h],       %[h],           -0x01               \n\t"
             "punpcklbh  %[ftmp3],   %[ftmp1],       %[ftmp0]            \n\t"
             "punpcklbh  %[ftmp4],   %[ftmp2],       %[ftmp0]            \n\t"
             "pmullh     %[ftmp3],   %[ftmp3],       %[A]                \n\t"
             "pmullh     %[ftmp4],   %[ftmp4],       %[E]                \n\t"
             "paddh      %[ftmp1],   %[ftmp3],       %[ftmp4]            \n\t"
-
             "paddh      %[ftmp1],   %[ftmp1],       %[ff_pw_32]         \n\t"
             "psrlh      %[ftmp1],   %[ftmp1],       %[ftmp5]            \n\t"
             "packushb   %[ftmp1],   %[ftmp1],       %[ftmp0]            \n\t"
             MMI_LWC1(%[ftmp2], %[dst], 0x00)
             "pavgb      %[ftmp1],   %[ftmp1],       %[ftmp2]            \n\t"
-            "addi       %[h],       %[h],           -0x01               \n\t"
             MMI_SWC1(%[ftmp1], %[dst], 0x00)
-            PTR_ADDU   "%[src],     %[src],         %[stride]           \n\t"
             PTR_ADDU   "%[dst],     %[dst],         %[stride]           \n\t"
             "bnez       %[h],       1b                                  \n\t"
             : [ftmp0]"=&f"(ftmp[0]),        [ftmp1]"=&f"(ftmp[1]),
@@ -824,46 +725,27 @@
         );
     } else {
         __asm__ volatile (
-            "xor        %[ftmp0],   %[ftmp0],       %[ftmp0]            \n\t"
-            "dli        %[tmp0],    0x06                                \n\t"
-            "pshufh     %[A],       %[A],           %[ftmp0]            \n\t"
-            "mtc1       %[tmp0],    %[ftmp3]                            \n\t"
-
             "1:                                                         \n\t"
-            MMI_ULWC1(%[ftmp1], %[src], 0x00)
-            "punpcklbh  %[ftmp2],   %[ftmp1],       %[ftmp0]            \n\t"
-            "pmullh     %[ftmp1],   %[ftmp2],       %[A]                \n\t"
-            "paddh      %[ftmp1],   %[ftmp1],       %[ff_pw_32]         \n\t"
-            "psrlh      %[ftmp1],   %[ftmp1],       %[ftmp3]            \n\t"
-            "packushb   %[ftmp1],   %[ftmp1],       %[ftmp0]            \n\t"
-            MMI_LWC1(%[ftmp2], %[dst], 0x00)
-            "pavgb      %[ftmp1],   %[ftmp1],       %[ftmp2]            \n\t"
+            MMI_ULWC1(%[ftmp0], %[src], 0x00)
             PTR_ADDU   "%[src],     %[src],         %[stride]           \n\t"
-            MMI_SWC1(%[ftmp1], %[dst], 0x00)
-            PTR_ADDU   "%[dst],     %[dst],         %[stride]           \n\t"
-
             MMI_ULWC1(%[ftmp1], %[src], 0x00)
-            "punpcklbh  %[ftmp2],   %[ftmp1],       %[ftmp0]            \n\t"
-            "pmullh     %[ftmp1],   %[ftmp2],       %[A]                \n\t"
-            "paddh      %[ftmp1],   %[ftmp1],       %[ff_pw_32]         \n\t"
-            "psrlh      %[ftmp1],   %[ftmp1],       %[ftmp3]            \n\t"
-            "packushb   %[ftmp1],   %[ftmp1],       %[ftmp0]            \n\t"
-            MMI_LWC1(%[ftmp2], %[dst], 0x00)
-            "pavgb      %[ftmp1],   %[ftmp1],       %[ftmp2]            \n\t"
+            PTR_ADDU   "%[src],     %[src],         %[stride]           \n\t"
             "addi       %[h],       %[h],           -0x02               \n\t"
+            MMI_LWC1(%[ftmp2], %[dst], 0x00)
+            "pavgb      %[ftmp0],   %[ftmp0],       %[ftmp2]            \n\t"
+            MMI_SWC1(%[ftmp0], %[dst], 0x00)
+            PTR_ADDU   "%[dst],     %[dst],         %[stride]           \n\t"
+            MMI_LWC1(%[ftmp3], %[dst], 0x00)
+            "pavgb      %[ftmp1],   %[ftmp1],       %[ftmp3]            \n\t"
             MMI_SWC1(%[ftmp1], %[dst], 0x00)
-
-            PTR_ADDU   "%[src],     %[src],         %[stride]           \n\t"
             PTR_ADDU   "%[dst],     %[dst],         %[stride]           \n\t"
             "bnez       %[h],       1b                                  \n\t"
             : [ftmp0]"=&f"(ftmp[0]),        [ftmp1]"=&f"(ftmp[1]),
               [ftmp2]"=&f"(ftmp[2]),        [ftmp3]"=&f"(ftmp[3]),
-              [tmp0]"=&r"(tmp[0]),
-              RESTRICT_ASM_LOW32
               [dst]"+&r"(dst),              [src]"+&r"(src),
+              RESTRICT_ASM_LOW32
               [h]"+&r"(h)
-            : [stride]"r"((mips_reg)stride),[ff_pw_32]"f"(ff_pw_32),
-              [A]"f"(A)
+            : [stride]"r"((mips_reg)stride)
             : "memory"
         );
     }
diff --git a/libavcodec/mips/h264chroma_msa.c b/libavcodec/mips/h264chroma_msa.c
index 4c25761..4a68d9e 100644
--- a/libavcodec/mips/h264chroma_msa.c
+++ b/libavcodec/mips/h264chroma_msa.c
@@ -85,7 +85,7 @@
     res_r = __msa_sat_u_h(res_r, 7);
     res = (v8i16) __msa_pckev_b((v16i8) res_r, (v16i8) res_r);
 
-    ST2x4_UB(res, 0, dst, stride);
+    ST_H4(res, 0, 1, 2, 3, dst, stride);
 }
 
 static void avc_chroma_hz_2w_msa(uint8_t *src, uint8_t *dst, int32_t stride,
@@ -121,7 +121,7 @@
     res_r = __msa_sat_u_h(res_r, 7);
     res = (v4i32) __msa_pckev_b((v16i8) res_r, (v16i8) res_r);
 
-    ST4x2_UB(res, dst, stride);
+    ST_W2(res, 0, 1, dst, stride);
 }
 
 static void avc_chroma_hz_4x4_msa(uint8_t *src, uint8_t *dst, int32_t stride,
@@ -144,7 +144,7 @@
     SRARI_H2_UH(res0_r, res1_r, 6);
     SAT_UH2_UH(res0_r, res1_r, 7);
     out = (v16u8) __msa_pckev_b((v16i8) res1_r, (v16i8) res0_r);
-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, stride);
+    ST_W4(out, 0, 1, 2, 3, dst, stride);
 }
 
 static void avc_chroma_hz_4x8_msa(uint8_t *src, uint8_t *dst, int32_t stride,
@@ -168,7 +168,7 @@
     SRARI_H4_UH(res0, res1, res2, res3, 6);
     SAT_UH4_UH(res0, res1, res2, res3, 7);
     PCKEV_B2_UB(res1, res0, res3, res2, out0, out1);
-    ST4x8_UB(out0, out1, dst, stride);
+    ST_W8(out0, out1, 0, 1, 2, 3, 0, 1, 2, 3, dst, stride);
 }
 
 static void avc_chroma_hz_4w_msa(uint8_t *src, uint8_t *dst, int32_t stride,
@@ -204,7 +204,7 @@
     SRARI_H4_UH(res0, res1, res2, res3, 6);
     SAT_UH4_UH(res0, res1, res2, res3, 7);
     PCKEV_B2_UB(res1, res0, res3, res2, out0, out1);
-    ST8x4_UB(out0, out1, dst, stride);
+    ST_D4(out0, out1, 0, 1, 0, 1, dst, stride);
 }
 
 static void avc_chroma_hz_8x8_msa(uint8_t *src, uint8_t *dst, int32_t stride,
@@ -237,7 +237,7 @@
     SAT_UH4_UH(res4, res5, res6, res7, 7);
     PCKEV_B2_UB(res1, res0, res3, res2, out0, out1);
     PCKEV_B2_UB(res5, res4, res7, res6, out2, out3);
-    ST8x8_UB(out0, out1, out2, out3, dst, stride);
+    ST_D8(out0, out1, out2, out3, 0, 1, 0, 1, 0, 1, 0, 1, dst, stride);
 }
 
 static void avc_chroma_hz_nonmult_msa(uint8_t *src, uint8_t *dst,
@@ -266,7 +266,7 @@
         SRARI_H4_UH(res0, res1, res2, res3, 6);
         SAT_UH4_UH(res0, res1, res2, res3, 7);
         PCKEV_B2_UB(res1, res0, res3, res2, out0, out1);
-        ST8x4_UB(out0, out1, dst, stride);
+        ST_D4(out0, out1, 0, 1, 0, 1, dst, stride);
         dst += (4 * stride);
     }
 
@@ -283,7 +283,7 @@
             res0 = __msa_sat_u_h(res0, 7);
             res0 = (v8u16) __msa_pckev_b((v16i8) res0, (v16i8) res0);
 
-            ST8x1_UB(res0, dst);
+            ST_D1(res0, 0, dst);
             dst += stride;
         }
     }
@@ -359,7 +359,7 @@
 
     res = (v8i16) __msa_pckev_b((v16i8) res_r, (v16i8) res_r);
 
-    ST2x4_UB(res, 0, dst, stride);
+    ST_H4(res, 0, 1, 2, 3, dst, stride);
 }
 
 static void avc_chroma_vt_2w_msa(uint8_t *src, uint8_t *dst, int32_t stride,
@@ -394,7 +394,7 @@
     res_r = __msa_sat_u_h(res_r, 7);
     res = (v4i32) __msa_pckev_b((v16i8) res_r, (v16i8) res_r);
 
-    ST4x2_UB(res, dst, stride);
+    ST_W2(res, 0, 1, dst, stride);
 }
 
 static void avc_chroma_vt_4x4_msa(uint8_t *src, uint8_t *dst, int32_t stride,
@@ -418,7 +418,7 @@
     SRARI_H2_UH(res0_r, res1_r, 6);
     SAT_UH2_UH(res0_r, res1_r, 7);
     out = (v16u8) __msa_pckev_b((v16i8) res1_r, (v16i8) res0_r);
-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, stride);
+    ST_W4(out, 0, 1, 2, 3, dst, stride);
 }
 
 static void avc_chroma_vt_4x8_msa(uint8_t *src, uint8_t *dst, int32_t stride,
@@ -446,7 +446,7 @@
     SRARI_H4_UH(res0, res1, res2, res3, 6);
     SAT_UH4_UH(res0, res1, res2, res3, 7);
     PCKEV_B2_UB(res1, res0, res3, res2, out0, out1);
-    ST4x8_UB(out0, out1, dst, stride);
+    ST_W8(out0, out1, 0, 1, 2, 3, 0, 1, 2, 3, dst, stride);
 }
 
 static void avc_chroma_vt_4w_msa(uint8_t *src, uint8_t *dst, int32_t stride,
@@ -480,7 +480,7 @@
     SRARI_H4_UH(res0, res1, res2, res3, 6);
     SAT_UH4_UH(res0, res1, res2, res3, 7);
     PCKEV_B2_UB(res1, res0, res3, res2, out0, out1);
-    ST8x4_UB(out0, out1, dst, stride);
+    ST_D4(out0, out1, 0, 1, 0, 1, dst, stride);
 }
 
 static void avc_chroma_vt_8x8_msa(uint8_t *src, uint8_t *dst, int32_t stride,
@@ -512,7 +512,7 @@
     SAT_UH4_UH(res0, res1, res2, res3, 7);
     PCKEV_B2_UB(res1, res0, res3, res2, out0, out1);
     PCKEV_B2_UB(res5, res4, res7, res6, out2, out3);
-    ST8x8_UB(out0, out1, out2, out3, dst, stride);
+    ST_D8(out0, out1, out2, out3, 0, 1, 0, 1, 0, 1, 0, 1, dst, stride);
 }
 
 static void avc_chroma_vt_8w_msa(uint8_t *src, uint8_t *dst, int32_t stride,
@@ -592,7 +592,7 @@
 
     res = (v8i16) __msa_pckev_b((v16i8) res_vt0, (v16i8) res_vt0);
 
-    ST2x4_UB(res, 0, dst, stride);
+    ST_H4(res, 0, 1, 2, 3, dst, stride);
 }
 
 static void avc_chroma_hv_2w_msa(uint8_t *src, uint8_t *dst, int32_t stride,
@@ -634,7 +634,7 @@
     res_vt0 = __msa_sat_u_h(res_vt0, 7);
     res = (v4i32) __msa_pckev_b((v16i8) res_vt0, (v16i8) res_vt0);
 
-    ST4x2_UB(res, dst, stride);
+    ST_W2(res, 0, 1, dst, stride);
 }
 
 static void avc_chroma_hv_4x4_msa(uint8_t *src, uint8_t *dst, int32_t stride,
@@ -666,7 +666,8 @@
     SRARI_H2_UH(res_vt0, res_vt1, 6);
     SAT_UH2_UH(res_vt0, res_vt1, 7);
     PCKEV_B2_SW(res_vt0, res_vt0, res_vt1, res_vt1, res0, res1);
-    ST4x4_UB(res0, res1, 0, 1, 0, 1, dst, stride);
+    ST_W2(res0, 0, 1, dst, stride);
+    ST_W2(res1, 0, 1, dst + 2 * stride, stride);
 }
 
 static void avc_chroma_hv_4x8_msa(uint8_t *src, uint8_t *dst, int32_t stride,
@@ -706,7 +707,7 @@
     SRARI_H4_UH(res_vt0, res_vt1, res_vt2, res_vt3, 6);
     SAT_UH4_UH(res_vt0, res_vt1, res_vt2, res_vt3, 7);
     PCKEV_B2_UB(res_vt1, res_vt0, res_vt3, res_vt2, res0, res1);
-    ST4x8_UB(res0, res1, dst, stride);
+    ST_W8(res0, res1, 0, 1, 2, 3, 0, 1, 2, 3, dst, stride);
 }
 
 static void avc_chroma_hv_4w_msa(uint8_t *src, uint8_t *dst, int32_t stride,
@@ -766,7 +767,7 @@
     SRARI_H4_UH(res_vt0, res_vt1, res_vt2, res_vt3, 6);
     SAT_UH4_UH(res_vt0, res_vt1, res_vt2, res_vt3, 7);
     PCKEV_B2_UB(res_vt1, res_vt0, res_vt3, res_vt2, out0, out1);
-    ST8x4_UB(out0, out1, dst, stride);
+    ST_D4(out0, out1, 0, 1, 0, 1, dst, stride);
 }
 
 static void avc_chroma_hv_8x8_msa(uint8_t *src, uint8_t *dst, int32_t stride,
@@ -822,7 +823,7 @@
     SAT_UH4_UH(res_vt4, res_vt5, res_vt6, res_vt7, 7);
     PCKEV_B2_UB(res_vt1, res_vt0, res_vt3, res_vt2, out0, out1);
     PCKEV_B2_UB(res_vt5, res_vt4, res_vt7, res_vt6, out2, out3);
-    ST8x8_UB(out0, out1, out2, out3, dst, stride);
+    ST_D8(out0, out1, out2, out3, 0, 1, 0, 1, 0, 1, 0, 1, dst, stride);
 }
 
 static void avc_chroma_hv_8w_msa(uint8_t *src, uint8_t *dst, int32_t stride,
@@ -918,7 +919,7 @@
     dst0 = (v16u8) __msa_pckev_b((v16i8) res_r, (v16i8) res_r);
     dst0 = __msa_aver_u_b(dst0, dst_data);
 
-    ST2x4_UB(dst0, 0, dst, stride);
+    ST_H4(dst0, 0, 1, 2, 3, dst, stride);
 }
 
 static void avc_chroma_hz_and_aver_dst_2w_msa(uint8_t *src, uint8_t *dst,
@@ -962,7 +963,7 @@
     res = __msa_pckev_b((v16i8) res_r, (v16i8) res_r);
     dst_data = __msa_aver_u_b((v16u8) res, dst_data);
 
-    ST4x2_UB(dst_data, dst, stride);
+    ST_W2(dst_data, 0, 1, dst, stride);
 }
 
 static void avc_chroma_hz_and_aver_dst_4x4_msa(uint8_t *src, uint8_t *dst,
@@ -991,7 +992,7 @@
     SAT_UH2_UH(res0_r, res1_r, 7);
     out = (v16u8) __msa_pckev_b((v16i8) res1_r, (v16i8) res0_r);
     out = __msa_aver_u_b(out, dst_data);
-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, stride);
+    ST_W4(out, 0, 1, 2, 3, dst, stride);
 }
 
 static void avc_chroma_hz_and_aver_dst_4x8_msa(uint8_t *src, uint8_t *dst,
@@ -1023,7 +1024,7 @@
     SAT_UH4_UH(res0, res1, res2, res3, 7);
     PCKEV_B2_UB(res1, res0, res3, res2, out0, out1);
     AVER_UB2_UB(out0, dst0, out1, dst1, out0, out1);
-    ST4x8_UB(out0, out1, dst, stride);
+    ST_W8(out0, out1, 0, 1, 2, 3, 0, 1, 2, 3, dst, stride);
 }
 
 static void avc_chroma_hz_and_aver_dst_4w_msa(uint8_t *src, uint8_t *dst,
@@ -1066,7 +1067,7 @@
     SAT_UH4_UH(res0, res1, res2, res3, 7);
     PCKEV_B2_UB(res1, res0, res3, res2, out0, out1);
     AVER_UB2_UB(out0, dst0, out1, dst1, dst0, dst1);
-    ST8x4_UB(dst0, dst1, dst, stride);
+    ST_D4(dst0, dst1, 0, 1, 0, 1, dst, stride);
 }
 
 static void avc_chroma_hz_and_aver_dst_8x8_msa(uint8_t *src, uint8_t *dst,
@@ -1110,7 +1111,7 @@
     PCKEV_B2_UB(res5, res4, res7, res6, out2, out3);
     AVER_UB2_UB(out0, dst0, out1, dst1, out0, out1);
     AVER_UB2_UB(out2, dst2, out3, dst3, out2, out3);
-    ST8x8_UB(out0, out1, out2, out3, dst, stride);
+    ST_D8(out0, out1, out2, out3, 0, 1, 0, 1, 0, 1, 0, 1, dst, stride);
 }
 
 static void avc_chroma_hz_and_aver_dst_8w_msa(uint8_t *src, uint8_t *dst,
@@ -1200,7 +1201,7 @@
     res = (v8i16) __msa_pckev_b((v16i8) res_r, (v16i8) res_r);
     res = (v8i16) __msa_aver_u_b((v16u8) res, dst_data);
 
-    ST2x4_UB(res, 0, dst, stride);
+    ST_H4(res, 0, 1, 2, 3, dst, stride);
 }
 
 static void avc_chroma_vt_and_aver_dst_2w_msa(uint8_t *src, uint8_t *dst,
@@ -1243,7 +1244,7 @@
     res = (v16u8) __msa_pckev_b((v16i8) res_r, (v16i8) res_r);
     res = __msa_aver_u_b(res, dst_data);
 
-    ST4x2_UB(res, dst, stride);
+    ST_W2(res, 0, 1, dst, stride);
 }
 
 static void avc_chroma_vt_and_aver_dst_4x4_msa(uint8_t *src, uint8_t *dst,
@@ -1273,7 +1274,7 @@
     SAT_UH2_UH(res0_r, res1_r, 7);
     out = (v16u8) __msa_pckev_b((v16i8) res1_r, (v16i8) res0_r);
     out = __msa_aver_u_b(out, dst0);
-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, stride);
+    ST_W4(out, 0, 1, 2, 3, dst, stride);
 }
 
 static void avc_chroma_vt_and_aver_dst_4x8_msa(uint8_t *src, uint8_t *dst,
@@ -1309,7 +1310,7 @@
     SAT_UH4_UH(res0, res1, res2, res3, 7);
     PCKEV_B2_UB(res1, res0, res3, res2, out0, out1);
     AVER_UB2_UB(out0, dst0, out1, dst1, out0, out1);
-    ST4x8_UB(out0, out1, dst, stride);
+    ST_W8(out0, out1, 0, 1, 2, 3, 0, 1, 2, 3, dst, stride);
 }
 
 static void avc_chroma_vt_and_aver_dst_4w_msa(uint8_t *src, uint8_t *dst,
@@ -1351,7 +1352,7 @@
     SAT_UH4_UH(res0, res1, res2, res3, 7);
     PCKEV_B2_UB(res1, res0, res3, res2, out0, out1);
     AVER_UB2_UB(out0, dst0, out1, dst1, out0, out1);
-    ST8x4_UB(out0, out1, dst, stride);
+    ST_D4(out0, out1, 0, 1, 0, 1, dst, stride);
 }
 
 static void avc_chroma_vt_and_aver_dst_8x8_msa(uint8_t *src, uint8_t *dst,
@@ -1394,7 +1395,7 @@
     PCKEV_B2_UB(res5, res4, res7, res6, out2, out3);
     AVER_UB2_UB(out0, dst0, out1, dst1, out0, out1);
     AVER_UB2_UB(out2, dst2, out3, dst3, out2, out3);
-    ST8x8_UB(out0, out1, out2, out3, dst, stride);
+    ST_D8(out0, out1, out2, out3, 0, 1, 0, 1, 0, 1, 0, 1, dst, stride);
 }
 
 static void avc_chroma_vt_and_aver_dst_8w_msa(uint8_t *src, uint8_t *dst,
@@ -1492,7 +1493,7 @@
     res = __msa_pckev_b((v16i8) res_vt0, (v16i8) res_vt0);
     dst0 = __msa_aver_u_b((v16u8) res, dst0);
 
-    ST2x4_UB(dst0, 0, dst, stride);
+    ST_H4(dst0, 0, 1, 2, 3, dst, stride);
 }
 
 static void avc_chroma_hv_and_aver_dst_2w_msa(uint8_t *src, uint8_t *dst,
@@ -1545,7 +1546,7 @@
     dst0 = (v16u8) __msa_pckev_b((v16i8) res_vt0, (v16i8) res_vt0);
     dst0 = __msa_aver_u_b(dst0, dst_data);
 
-    ST4x2_UB(dst0, dst, stride);
+    ST_W2(dst0, 0, 1, dst, stride);
 }
 
 static void avc_chroma_hv_and_aver_dst_4x4_msa(uint8_t *src, uint8_t *dst,
@@ -1584,7 +1585,7 @@
     SAT_UH2_UH(res_vt0, res_vt1, 7);
     out = (v16u8) __msa_pckev_b((v16i8) res_vt1, (v16i8) res_vt0);
     out = __msa_aver_u_b(out, dst_data);
-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, stride);
+    ST_W4(out, 0, 1, 2, 3, dst, stride);
 }
 
 static void avc_chroma_hv_and_aver_dst_4x8_msa(uint8_t *src, uint8_t *dst,
@@ -1633,7 +1634,7 @@
     SAT_UH4_UH(res_vt0, res_vt1, res_vt2, res_vt3, 7);
     PCKEV_B2_UB(res_vt1, res_vt0, res_vt3, res_vt2, res0, res1);
     AVER_UB2_UB(res0, dst0, res1, dst1, res0, res1);
-    ST4x8_UB(res0, res1, dst, stride);
+    ST_W8(res0, res1, 0, 1, 2, 3, 0, 1, 2, 3, dst, stride);
 }
 
 static void avc_chroma_hv_and_aver_dst_4w_msa(uint8_t *src, uint8_t *dst,
@@ -1701,7 +1702,7 @@
     SAT_UH4_UH(res_vt0, res_vt1, res_vt2, res_vt3, 7);
     PCKEV_B2_UB(res_vt1, res_vt0, res_vt3, res_vt2, out0, out1);
     AVER_UB2_UB(out0, dst0, out1, dst1, out0, out1);
-    ST8x4_UB(out0, out1, dst, stride);
+    ST_D4(out0, out1, 0, 1, 0, 1, dst, stride);
 }
 
 static void avc_chroma_hv_and_aver_dst_8x8_msa(uint8_t *src, uint8_t *dst,
@@ -1770,7 +1771,7 @@
     PCKEV_B2_UB(res_vt5, res_vt4, res_vt7, res_vt6, out2, out3);
     AVER_UB2_UB(out0, dst0, out1, dst1, out0, out1);
     AVER_UB2_UB(out2, dst2, out3, dst3, out2, out3);
-    ST8x8_UB(out0, out1, out2, out3, dst, stride);
+    ST_D8(out0, out1, out2, out3, 0, 1, 0, 1, 0, 1, 0, 1, dst, stride);
 }
 
 static void avc_chroma_hv_and_aver_dst_8w_msa(uint8_t *src, uint8_t *dst,
@@ -1848,21 +1849,21 @@
         LW4(dst + 4 * stride, stride, tp0, tp1, tp2, tp3);
         INSERT_W4_UB(tp0, tp1, tp2, tp3, dst1);
         AVER_UB2_UB(src0, dst0, src1, dst1, dst0, dst1);
-        ST4x8_UB(dst0, dst1, dst, stride);
+        ST_W8(dst0, dst1, 0, 1, 2, 3, 0, 1, 2, 3, dst, stride);
     } else if (4 == height) {
         LW4(src, stride, tp0, tp1, tp2, tp3);
         INSERT_W4_UB(tp0, tp1, tp2, tp3, src0);
         LW4(dst, stride, tp0, tp1, tp2, tp3);
         INSERT_W4_UB(tp0, tp1, tp2, tp3, dst0);
         dst0 = __msa_aver_u_b(src0, dst0);
-        ST4x4_UB(dst0, dst0, 0, 1, 2, 3, dst, stride);
+        ST_W4(dst0, 0, 1, 2, 3, dst, stride);
     } else if (2 == height) {
         LW2(src, stride, tp0, tp1);
         INSERT_W2_UB(tp0, tp1, src0);
         LW2(dst, stride, tp0, tp1);
         INSERT_W2_UB(tp0, tp1, dst0);
         dst0 = __msa_aver_u_b(src0, dst0);
-        ST4x2_UB(dst0, dst, stride);
+        ST_W2(dst0, 0, 1, dst, stride);
     }
 }
 
@@ -1889,7 +1890,7 @@
         INSERT_D2_UB(tp6, tp7, dst3);
         AVER_UB4_UB(src0, dst0, src1, dst1, src2, dst2, src3, dst3, dst0, dst1,
                     dst2, dst3);
-        ST8x8_UB(dst0, dst1, dst2, dst3, dst, stride);
+        ST_D8(dst0, dst1, dst2, dst3, 0, 1, 0, 1, 0, 1, 0, 1, dst, stride);
     } else if (4 == height) {
         LD4(src, stride, tp0, tp1, tp2, tp3);
         INSERT_D2_UB(tp0, tp1, src0);
@@ -1898,7 +1899,7 @@
         INSERT_D2_UB(tp0, tp1, dst0);
         INSERT_D2_UB(tp2, tp3, dst1);
         AVER_UB2_UB(src0, dst0, src1, dst1, dst0, dst1);
-        ST8x4_UB(dst0, dst1, dst, stride);
+        ST_D4(dst0, dst1, 0, 1, 0, 1, dst, stride);
     }
 }
 
diff --git a/libavcodec/mips/h264dsp_init_mips.c b/libavcodec/mips/h264dsp_init_mips.c
index 1fe7f84..dc08a25 100644
--- a/libavcodec/mips/h264dsp_init_mips.c
+++ b/libavcodec/mips/h264dsp_init_mips.c
@@ -138,10 +138,10 @@
 av_cold void ff_h264dsp_init_mips(H264DSPContext *c, const int bit_depth,
                                   const int chroma_format_idc)
 {
-#if HAVE_MSA
-    h264dsp_init_msa(c, bit_depth, chroma_format_idc);
-#endif  // #if HAVE_MSA
 #if HAVE_MMI
     h264dsp_init_mmi(c, bit_depth, chroma_format_idc);
 #endif /* HAVE_MMI */
+#if HAVE_MSA
+    h264dsp_init_msa(c, bit_depth, chroma_format_idc);
+#endif  // #if HAVE_MSA
 }
diff --git a/libavcodec/mips/h264dsp_mmi.c b/libavcodec/mips/h264dsp_mmi.c
index ac65a20..0459711 100644
--- a/libavcodec/mips/h264dsp_mmi.c
+++ b/libavcodec/mips/h264dsp_mmi.c
@@ -38,6 +38,9 @@
         MMI_LDC1(%[ftmp2], %[src], 0x08)
         MMI_LDC1(%[ftmp3], %[src], 0x10)
         MMI_LDC1(%[ftmp4], %[src], 0x18)
+        /* memset(src, 0, 32); */
+        "gssqc1     %[ftmp0],   %[ftmp0],       0x00(%[src])            \n\t"
+        "gssqc1     %[ftmp0],   %[ftmp0],       0x10(%[src])            \n\t"
         MMI_ULWC1(%[ftmp5], %[dst0], 0x00)
         MMI_ULWC1(%[ftmp6], %[dst1], 0x00)
         MMI_ULWC1(%[ftmp7], %[dst2], 0x00)
@@ -58,11 +61,6 @@
         MMI_SWC1(%[ftmp2], %[dst1], 0x00)
         MMI_SWC1(%[ftmp3], %[dst2], 0x00)
         MMI_SWC1(%[ftmp4], %[dst3], 0x00)
-
-        /* memset(src, 0, 32); */
-        "xor        %[ftmp0],   %[ftmp0],       %[ftmp0]                \n\t"
-        "gssqc1     %[ftmp0],   %[ftmp0],       0x00(%[src])            \n\t"
-        "gssqc1     %[ftmp0],   %[ftmp0],       0x10(%[src])            \n\t"
         : [ftmp0]"=&f"(ftmp[0]),            [ftmp1]"=&f"(ftmp[1]),
           [ftmp2]"=&f"(ftmp[2]),            [ftmp3]"=&f"(ftmp[3]),
           [ftmp4]"=&f"(ftmp[4]),            [ftmp5]"=&f"(ftmp[5]),
@@ -85,15 +83,19 @@
     DECLARE_VAR_ADDRT;
 
     __asm__ volatile (
-        "dli        %[tmp0],    0x01                                    \n\t"
         MMI_LDC1(%[ftmp0], %[block], 0x00)
-        "mtc1       %[tmp0],    %[ftmp8]                                \n\t"
         MMI_LDC1(%[ftmp1], %[block], 0x08)
-        "dli        %[tmp0],    0x06                                    \n\t"
         MMI_LDC1(%[ftmp2], %[block], 0x10)
+        MMI_LDC1(%[ftmp3], %[block], 0x18)
+        /* memset(block, 0, 32) */
+        "xor        %[ftmp4],   %[ftmp4],       %[ftmp4]                \n\t"
+        "gssqc1     %[ftmp4],   %[ftmp4],       0x00(%[block])          \n\t"
+        "gssqc1     %[ftmp4],   %[ftmp4],       0x10(%[block])          \n\t"
+        "dli        %[tmp0],    0x01                                    \n\t"
+        "mtc1       %[tmp0],    %[ftmp8]                                \n\t"
+        "dli        %[tmp0],    0x06                                    \n\t"
         "mtc1       %[tmp0],    %[ftmp9]                                \n\t"
         "psrah      %[ftmp4],   %[ftmp1],       %[ftmp8]                \n\t"
-        MMI_LDC1(%[ftmp3], %[block], 0x18)
         "psrah      %[ftmp5],   %[ftmp3],       %[ftmp8]                \n\t"
         "psubh      %[ftmp4],   %[ftmp4],       %[ftmp3]                \n\t"
         "paddh      %[ftmp5],   %[ftmp5],       %[ftmp1]                \n\t"
@@ -121,15 +123,11 @@
         "paddh      %[ftmp10],  %[ftmp3],       %[ftmp1]                \n\t"
         "psubh      %[ftmp1],   %[ftmp1],       %[ftmp3]                \n\t"
         "paddh      %[ftmp11],  %[ftmp4],       %[ftmp5]                \n\t"
-        "xor        %[ftmp7],   %[ftmp7],       %[ftmp7]                \n\t"
         "psubh      %[ftmp5],   %[ftmp5],       %[ftmp4]                \n\t"
-        MMI_SDC1(%[ftmp7], %[block], 0x00)
-        MMI_SDC1(%[ftmp7], %[block], 0x08)
-        MMI_SDC1(%[ftmp7], %[block], 0x10)
-        MMI_SDC1(%[ftmp7], %[block], 0x18)
         MMI_ULWC1(%[ftmp2], %[dst], 0x00)
-        "psrah      %[ftmp3],   %[ftmp10],      %[ftmp9]                \n\t"
         MMI_LWXC1(%[ftmp0], %[dst], %[stride], 0x00)
+        "xor        %[ftmp7],   %[ftmp7],       %[ftmp7]                \n\t"
+        "psrah      %[ftmp3],   %[ftmp10],      %[ftmp9]                \n\t"
         "psrah      %[ftmp4],   %[ftmp11],      %[ftmp9]                \n\t"
         "punpcklbh  %[ftmp2],   %[ftmp2],       %[ftmp7]                \n\t"
         "punpcklbh  %[ftmp0],   %[ftmp0],       %[ftmp7]                \n\t"
@@ -153,11 +151,6 @@
         MMI_SWC1(%[ftmp2], %[dst], 0x00)
         "packushb   %[ftmp0],   %[ftmp0],       %[ftmp7]                \n\t"
         MMI_SWXC1(%[ftmp0], %[dst], %[stride], 0x00)
-
-        /* memset(block, 0, 32) */
-        "xor        %[ftmp0],   %[ftmp0],       %[ftmp0]                \n\t"
-        "gssqc1     %[ftmp0],   %[ftmp0],       0x00(%[block])          \n\t"
-        "gssqc1     %[ftmp0],   %[ftmp0],       0x10(%[block])          \n\t"
         : [ftmp0]"=&f"(ftmp[0]),            [ftmp1]"=&f"(ftmp[1]),
           [ftmp2]"=&f"(ftmp[2]),            [ftmp3]"=&f"(ftmp[3]),
           [ftmp4]"=&f"(ftmp[4]),            [ftmp5]"=&f"(ftmp[5]),
@@ -620,17 +613,6 @@
         MMI_SWC1(%[ftmp6], %[addr0], 0x00)
         MMI_SWXC1(%[ftmp7], %[addr0], %[stride], 0x00)
         PTR_ADDIU  "$29,        $29,            0x20                    \n\t"
-
-        /* memset(block, 0, 128) */
-        "xor        %[ftmp0],   %[ftmp0],       %[ftmp0]                \n\t"
-        "gssqc1     %[ftmp0],   %[ftmp0],       0x00(%[block])          \n\t"
-        "gssqc1     %[ftmp0],   %[ftmp0],       0x10(%[block])          \n\t"
-        "gssqc1     %[ftmp0],   %[ftmp0],       0x20(%[block])          \n\t"
-        "gssqc1     %[ftmp0],   %[ftmp0],       0x30(%[block])          \n\t"
-        "gssqc1     %[ftmp0],   %[ftmp0],       0x40(%[block])          \n\t"
-        "gssqc1     %[ftmp0],   %[ftmp0],       0x50(%[block])          \n\t"
-        "gssqc1     %[ftmp0],   %[ftmp0],       0x60(%[block])          \n\t"
-        "gssqc1     %[ftmp0],   %[ftmp0],       0x70(%[block])          \n\t"
         : [ftmp0]"=&f"(ftmp[0]),            [ftmp1]"=&f"(ftmp[1]),
           [ftmp2]"=&f"(ftmp[2]),            [ftmp3]"=&f"(ftmp[3]),
           [ftmp4]"=&f"(ftmp[4]),            [ftmp5]"=&f"(ftmp[5]),
diff --git a/libavcodec/mips/h264dsp_msa.c b/libavcodec/mips/h264dsp_msa.c
index e50f5ca..dd05982 100644
--- a/libavcodec/mips/h264dsp_msa.c
+++ b/libavcodec/mips/h264dsp_msa.c
@@ -45,7 +45,7 @@
     tmp0 = __msa_srlr_h(tmp0, denom);
     tmp0 = (v8i16) __msa_sat_u_h((v8u16) tmp0, 7);
     src0 = (v16u8) __msa_pckev_b((v16i8) tmp0, (v16i8) tmp0);
-    ST4x2_UB(src0, data, stride);
+    ST_W2(src0, 0, 1, data, stride);
 }
 
 static void avc_wgt_4x4_msa(uint8_t *data, int32_t stride, int32_t log2_denom,
@@ -71,7 +71,7 @@
     tmp1 = __msa_srlr_h(tmp1, denom);
     SAT_UH2_SH(tmp0, tmp1, 7);
     src0 = (v16u8) __msa_pckev_b((v16i8) tmp1, (v16i8) tmp0);
-    ST4x4_UB(src0, src0, 0, 1, 2, 3, data, stride);
+    ST_W4(src0, 0, 1, 2, 3, data, stride);
 }
 
 static void avc_wgt_4x8_msa(uint8_t *data, int32_t stride, int32_t log2_denom,
@@ -102,7 +102,7 @@
     SRLR_H4_SH(tmp0, tmp1, tmp2, tmp3, denom);
     SAT_UH4_SH(tmp0, tmp1, tmp2, tmp3, 7);
     PCKEV_B2_UB(tmp1, tmp0, tmp3, tmp2, src0, src1);
-    ST4x8_UB(src0, src1, data, stride);
+    ST_W8(src0, src1, 0, 1, 2, 3, 0, 1, 2, 3, data, stride);
 }
 
 static void avc_wgt_8x4_msa(uint8_t *data, int32_t stride, int32_t log2_denom,
@@ -133,7 +133,7 @@
     SRLR_H4_SH(tmp0, tmp1, tmp2, tmp3, denom);
     SAT_UH4_SH(tmp0, tmp1, tmp2, tmp3, 7);
     PCKEV_B2_UB(tmp1, tmp0, tmp3, tmp2, src0, src1);
-    ST8x4_UB(src0, src1, data, stride);
+    ST_D4(src0, src1, 0, 1, 0, 1, data, stride);
 }
 
 static void avc_wgt_8x8_msa(uint8_t *data, int32_t stride, int32_t log2_denom,
@@ -175,7 +175,7 @@
     SAT_UH8_SH(tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, 7);
     PCKEV_B4_UB(tmp1, tmp0, tmp3, tmp2, tmp5, tmp4, tmp7, tmp6, src0, src1,
                 src2, src3);
-    ST8x8_UB(src0, src1, src2, src3, data, stride);
+    ST_D8(src0, src1, src2, src3, 0, 1, 0, 1, 0, 1, 0, 1, data, stride);
 }
 
 static void avc_wgt_8x16_msa(uint8_t *data, int32_t stride, int32_t log2_denom,
@@ -218,7 +218,7 @@
         SAT_UH8_SH(tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, 7);
         PCKEV_B4_UB(tmp1, tmp0, tmp3, tmp2, tmp5, tmp4, tmp7, tmp6, src0, src1,
                     src2, src3);
-        ST8x8_UB(src0, src1, src2, src3, data, stride);
+        ST_D8(src0, src1, src2, src3, 0, 1, 0, 1, 0, 1, 0, 1, data, stride);
         data += 8 * stride;
     }
 }
@@ -253,7 +253,7 @@
     tmp0 = __msa_maxi_s_h(tmp0, 0);
     tmp0 = __msa_min_s_h(max255, tmp0);
     dst0 = (v16u8) __msa_pckev_b((v16i8) tmp0, (v16i8) tmp0);
-    ST4x2_UB(dst0, dst, stride);
+    ST_W2(dst0, 0, 1, dst, stride);
 }
 
 static void avc_biwgt_4x4_msa(uint8_t *src, uint8_t *dst, int32_t stride,
@@ -287,7 +287,7 @@
     tmp1 >>= denom;
     CLIP_SH2_0_255(tmp0, tmp1);
     dst0 = (v16u8) __msa_pckev_b((v16i8) tmp1, (v16i8) tmp0);
-    ST4x4_UB(dst0, dst0, 0, 1, 2, 3, dst, stride);
+    ST_W4(dst0, 0, 1, 2, 3, dst, stride);
 }
 
 static void avc_biwgt_4x8_msa(uint8_t *src, uint8_t *dst, int32_t stride,
@@ -327,7 +327,7 @@
     SRA_4V(tmp0, tmp1, tmp2, tmp3, denom);
     CLIP_SH4_0_255(tmp0, tmp1, tmp2, tmp3);
     PCKEV_B2_UB(tmp1, tmp0, tmp3, tmp2, dst0, dst1);
-    ST4x8_UB(dst0, dst1, dst, stride);
+    ST_W8(dst0, dst1, 0, 1, 2, 3, 0, 1, 2, 3, dst, stride);
 }
 
 static void avc_biwgt_8x4_msa(uint8_t *src, uint8_t *dst, int32_t stride,
@@ -365,7 +365,7 @@
     SRA_4V(tmp0, tmp1, tmp2, tmp3, denom);
     CLIP_SH4_0_255(tmp0, tmp1, tmp2, tmp3);
     PCKEV_B2_UB(tmp1, tmp0, tmp3, tmp2, dst0, dst1);
-    ST8x4_UB(dst0, dst1, dst, stride);
+    ST_D4(dst0, dst1, 0, 1, 0, 1, dst, stride);
 }
 
 static void avc_biwgt_8x8_msa(uint8_t *src, uint8_t *dst, int32_t stride,
@@ -413,11 +413,10 @@
     tmp7 = __msa_dpadd_s_h(offset, wgt, vec7);
     SRA_4V(tmp0, tmp1, tmp2, tmp3, denom);
     SRA_4V(tmp4, tmp5, tmp6, tmp7, denom);
-    CLIP_SH4_0_255(tmp0, tmp1, tmp2, tmp3);
-    CLIP_SH4_0_255(tmp4, tmp5, tmp6, tmp7);
+    CLIP_SH8_0_255(tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7);
     PCKEV_B2_UB(tmp1, tmp0, tmp3, tmp2, dst0, dst1);
     PCKEV_B2_UB(tmp5, tmp4, tmp7, tmp6, dst2, dst3);
-    ST8x8_UB(dst0, dst1, dst2, dst3, dst, stride);
+    ST_D8(dst0, dst1, dst2, dst3, 0, 1, 0, 1, 0, 1, 0, 1, dst, stride);
 }
 
 static void avc_biwgt_8x16_msa(uint8_t *src, uint8_t *dst, int32_t stride,
@@ -475,11 +474,10 @@
 
         SRA_4V(temp0, temp1, temp2, temp3, denom);
         SRA_4V(temp4, temp5, temp6, temp7, denom);
-        CLIP_SH4_0_255(temp0, temp1, temp2, temp3);
-        CLIP_SH4_0_255(temp4, temp5, temp6, temp7);
+        CLIP_SH8_0_255(temp0, temp1, temp2, temp3, temp4, temp5, temp6, temp7);
         PCKEV_B4_UB(temp1, temp0, temp3, temp2, temp5, temp4, temp7, temp6,
                     dst0, dst1, dst2, dst3);
-        ST8x8_UB(dst0, dst1, dst2, dst3, dst, stride);
+        ST_D8(dst0, dst1, dst2, dst3, 0, 1, 0, 1, 0, 1, 0, 1, dst, stride);
         dst += 8 * stride;
     }
 }
@@ -531,7 +529,7 @@
     temp = p1_or_q1_org_in << 1;                              \
     clip3 = clip3 - temp;                                     \
     clip3 = __msa_ave_s_h(p2_or_q2_org_in, clip3);            \
-    clip3 = CLIP_SH(clip3, negate_tc_in, tc_in);              \
+    CLIP_SH(clip3, negate_tc_in, tc_in);                      \
     p1_or_q1_out = p1_or_q1_org_in + clip3;                   \
 }
 
@@ -549,7 +547,7 @@
     delta = q0_sub_p0 + p1_sub_q1;                              \
     delta >>= 3;                                                \
                                                                 \
-    delta = CLIP_SH(delta, negate_threshold_in, threshold_in);  \
+    CLIP_SH(delta, negate_threshold_in, threshold_in);          \
                                                                 \
     p0_or_q0_out = p0_or_q0_org_in + delta;                     \
     q0_or_p0_out = q0_or_p0_org_in - delta;                     \
@@ -598,7 +596,7 @@
     delta = q0_sub_p0 + p1_sub_q1;                                       \
     delta = __msa_srari_h(delta, 3);                                     \
                                                                          \
-    delta = CLIP_SH(delta, -tc, tc);                                     \
+    CLIP_SH(delta, -tc, tc);                                             \
                                                                          \
     ILVR_B2_SH(zeros, src1, zeros, src2, res0_r, res1_r);                \
                                                                          \
@@ -620,7 +618,7 @@
                                                              \
     out0 = (v16u8) __msa_ilvr_b((v16i8) in1, (v16i8) in0);   \
     out1 = (v16u8) __msa_sldi_b(zero_m, (v16i8) out0, 2);    \
-    SLDI_B2_0_UB(out1, out2, out2, out3, 2);                 \
+    SLDI_B2_UB(zero_m, out1, zero_m, out2, 2, out2, out3);   \
 }
 
 #define AVC_LPF_H_2BYTE_CHROMA_422(src, stride, tc_val, alpha, beta, res)  \
@@ -662,7 +660,7 @@
     q0_sub_p0 <<= 2;                                                       \
     delta = q0_sub_p0 + p1_sub_q1;                                         \
     delta = __msa_srari_h(delta, 3);                                       \
-    delta = CLIP_SH(delta, -tc, tc);                                       \
+    CLIP_SH(delta, -tc, tc);                                               \
                                                                            \
     ILVR_B2_SH(zeros, src1, zeros, src2, res0_r, res1_r);                  \
                                                                            \
@@ -955,18 +953,18 @@
         ILVRL_H2_SH(tp3, tp2, tmp6, tmp7);
 
         src = data - 3;
-        ST4x4_UB(tmp3, tmp3, 0, 1, 2, 3, src, img_width);
-        ST2x4_UB(tmp2, 0, src + 4, img_width);
+        ST_W4(tmp3, 0, 1, 2, 3, src, img_width);
+        ST_H4(tmp2, 0, 1, 2, 3, src + 4, img_width);
         src += 4 * img_width;
-        ST4x4_UB(tmp4, tmp4, 0, 1, 2, 3, src, img_width);
-        ST2x4_UB(tmp2, 4, src + 4, img_width);
+        ST_W4(tmp4, 0, 1, 2, 3, src, img_width);
+        ST_H4(tmp2, 4, 5, 6, 7, src + 4, img_width);
         src += 4 * img_width;
 
-        ST4x4_UB(tmp6, tmp6, 0, 1, 2, 3, src, img_width);
-        ST2x4_UB(tmp5, 0, src + 4, img_width);
+        ST_W4(tmp6, 0, 1, 2, 3, src, img_width);
+        ST_H4(tmp5, 0, 1, 2, 3, src + 4, img_width);
         src += 4 * img_width;
-        ST4x4_UB(tmp7, tmp7, 0, 1, 2, 3, src, img_width);
-        ST2x4_UB(tmp5, 4, src + 4, img_width);
+        ST_W4(tmp7, 0, 1, 2, 3, src, img_width);
+        ST_H4(tmp5, 4, 5, 6, 7, src + 4, img_width);
     }
     }
 }
@@ -1025,7 +1023,8 @@
 
     ILVR_W2_SB(tmp2, tmp0, tmp3, tmp1, src6, src3);
     ILVL_W2_SB(tmp2, tmp0, tmp3, tmp1, src1, src5);
-    SLDI_B4_0_SB(src6, src1, src3, src5, src0, src2, src4, src7, 8);
+    SLDI_B4_SB(zeros, src6, zeros, src1, zeros, src3, zeros, src5,
+               8, src0, src2, src4, src7);
 
     p0_asub_q0 = __msa_asub_u_b((v16u8) src2, (v16u8) src3);
     p1_asub_p0 = __msa_asub_u_b((v16u8) src1, (v16u8) src2);
@@ -1116,10 +1115,10 @@
     ILVRL_H2_SH(zeros, dst2_x, tmp2, tmp3);
 
     ILVR_W2_UB(tmp2, tmp0, tmp3, tmp1, dst0, dst4);
-    SLDI_B2_0_UB(dst0, dst4, dst1, dst5, 8);
+    SLDI_B2_UB(zeros, dst0, zeros, dst4, 8, dst1, dst5);
     dst2_x = (v16u8) __msa_ilvl_w((v4i32) tmp2, (v4i32) tmp0);
     dst2_y = (v16u8) __msa_ilvl_w((v4i32) tmp3, (v4i32) tmp1);
-    SLDI_B2_0_UB(dst2_x, dst2_y, dst3_x, dst3_y, 8);
+    SLDI_B2_UB(zeros, dst2_x, zeros, dst2_y, 8, dst3_x, dst3_y);
 
     out0 = __msa_copy_u_w((v4i32) dst0, 0);
     out1 = __msa_copy_u_h((v8i16) dst0, 2);
@@ -1274,9 +1273,9 @@
         tmp1 = (v8i16) __msa_ilvr_b((v16i8) q0_or_p0_org, (v16i8) p0_or_q0_org);
 
         data_cb_or_cr -= 1;
-        ST2x4_UB(tmp1, 0, data_cb_or_cr, img_width);
+        ST_H4(tmp1, 0, 1, 2, 3, data_cb_or_cr, img_width);
         data_cb_or_cr += 4 * img_width;
-        ST2x4_UB(tmp1, 4, data_cb_or_cr, img_width);
+        ST_H4(tmp1, 4, 5, 6, 7, data_cb_or_cr, img_width);
     }
 }
 
@@ -1741,7 +1740,7 @@
     v8i16 tc, tc_orig_r, tc_plus1;
     v16u8 is_tc_orig1, is_tc_orig2, tc_orig = { 0 };
     v8i16 p0_ilvr_q0, p0_add_q0, q0_sub_p0, p1_sub_q1;
-    v8u16 src2_r, src3_r;
+    v8i16 src2_r, src3_r;
     v8i16 p2_r, p1_r, q2_r, q1_r;
     v16u8 p2, q2, p0, q0;
     v4i32 dst0, dst1;
@@ -1839,8 +1838,8 @@
     tc_orig_r = (v8i16) __msa_ilvr_b(zeros, (v16i8) tc_orig);
     tc = tc_orig_r;
 
-    p2_r = CLIP_SH(p2_r, -tc_orig_r, tc_orig_r);
-    q2_r = CLIP_SH(q2_r, -tc_orig_r, tc_orig_r);
+    CLIP_SH(p2_r, -tc_orig_r, tc_orig_r);
+    CLIP_SH(q2_r, -tc_orig_r, tc_orig_r);
 
     p2_r += p1_r;
     q2_r += q1_r;
@@ -1872,14 +1871,13 @@
                                               (v16i8) is_less_than_beta2);
     tc = (v8i16) __msa_bmnz_v((v16u8) tc, (v16u8) tc_plus1, is_less_than_beta2);
 
-    q0_sub_p0 = CLIP_SH(q0_sub_p0, -tc, tc);
+    CLIP_SH(q0_sub_p0, -tc, tc);
 
-    ILVR_B2_UH(zeros, src2, zeros, src3, src2_r, src3_r);
+    ILVR_B2_SH(zeros, src2, zeros, src3, src2_r, src3_r);
     src2_r += q0_sub_p0;
     src3_r -= q0_sub_p0;
 
-    src2_r = (v8u16) CLIP_SH_0_255(src2_r);
-    src3_r = (v8u16) CLIP_SH_0_255(src3_r);
+    CLIP_SH2_0_255(src2_r, src3_r);
 
     PCKEV_B2_UB(src2_r, src2_r, src3_r, src3_r, p0, q0);
 
@@ -2110,9 +2108,9 @@
             q0_org = __msa_bmnz_v(q0_org, q0, is_less_than);
             tmp1 = (v8i16) __msa_ilvr_b((v16i8) q0_org, (v16i8) p0_org);
             src = data - 1;
-            ST2x4_UB(tmp1, 0, src, img_width);
+            ST_H4(tmp1, 0, 1, 2, 3, src, img_width);
             src += 4 * img_width;
-            ST2x4_UB(tmp1, 4, src, img_width);
+            ST_H4(tmp1, 4, 5, 6, 7, src, img_width);
         }
     }
 }
@@ -2136,7 +2134,7 @@
         }
 
         AVC_LPF_H_CHROMA_422(src, stride, tc_val, alpha, beta, res);
-        ST2x4_UB(res, 0, (src - 1), stride);
+        ST_H4(res, 0, 1, 2, 3, (src - 1), stride);
         src += (4 * stride);
     }
 }
@@ -2509,10 +2507,8 @@
     SRA_4V(tmp4, tmp5, tmp6, tmp7, denom);
     SRA_4V(tmp8, tmp9, tmp10, tmp11, denom);
     SRA_4V(tmp12, tmp13, tmp14, tmp15, denom);
-    CLIP_SH4_0_255(tmp0, tmp1, tmp2, tmp3);
-    CLIP_SH4_0_255(tmp4, tmp5, tmp6, tmp7);
-    CLIP_SH4_0_255(tmp8, tmp9, tmp10, tmp11);
-    CLIP_SH4_0_255(tmp12, tmp13, tmp14, tmp15);
+    CLIP_SH8_0_255(tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7);
+    CLIP_SH8_0_255(tmp8, tmp9, tmp10, tmp11, tmp12, tmp13, tmp14, tmp15);
     PCKEV_B4_UB(tmp1, tmp0, tmp3, tmp2, tmp5, tmp4, tmp7, tmp6, dst0, dst1,
                 dst2, dst3);
     PCKEV_B4_UB(tmp9, tmp8, tmp11, tmp10, tmp13, tmp12, tmp15, tmp14, dst4,
@@ -2553,10 +2549,8 @@
         SRA_4V(tmp4, tmp5, tmp6, tmp7, denom);
         SRA_4V(tmp8, tmp9, tmp10, tmp11, denom);
         SRA_4V(tmp12, tmp13, tmp14, tmp15, denom);
-        CLIP_SH4_0_255(tmp0, tmp1, tmp2, tmp3);
-        CLIP_SH4_0_255(tmp4, tmp5, tmp6, tmp7);
-        CLIP_SH4_0_255(tmp8, tmp9, tmp10, tmp11);
-        CLIP_SH4_0_255(tmp12, tmp13, tmp14, tmp15);
+        CLIP_SH8_0_255(tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7);
+        CLIP_SH8_0_255(tmp8, tmp9, tmp10, tmp11, tmp12, tmp13, tmp14, tmp15);
         PCKEV_B4_UB(tmp1, tmp0, tmp3, tmp2, tmp5, tmp4, tmp7, tmp6, dst0, dst1,
                     dst2, dst3);
         PCKEV_B4_UB(tmp9, tmp8, tmp11, tmp10, tmp13, tmp12, tmp15, tmp14, dst4,
diff --git a/libavcodec/mips/h264idct_msa.c b/libavcodec/mips/h264idct_msa.c
index 1e1a5c8..fbf7795 100644
--- a/libavcodec/mips/h264idct_msa.c
+++ b/libavcodec/mips/h264idct_msa.c
@@ -233,13 +233,10 @@
          res0, res1, res2, res3);
     ADD4(res4, tmp4, res5, tmp5, res6, tmp6, res7, tmp7,
          res4, res5, res6, res7);
-    CLIP_SH4_0_255(res0, res1, res2, res3);
-    CLIP_SH4_0_255(res4, res5, res6, res7);
+    CLIP_SH8_0_255(res0, res1, res2, res3, res4, res5, res6, res7);
     PCKEV_B4_SB(res1, res0, res3, res2, res5, res4, res7, res6,
                 dst0, dst1, dst2, dst3);
-    ST8x4_UB(dst0, dst1, dst, dst_stride);
-    dst += (4 * dst_stride);
-    ST8x4_UB(dst2, dst3, dst, dst_stride);
+    ST_D8(dst0, dst1, dst2, dst3, 0, 1, 0, 1, 0, 1, 0, 1, dst, dst_stride)
 }
 
 static void avc_idct8_dc_addblk_msa(uint8_t *dst, int16_t *src,
@@ -265,13 +262,11 @@
          dst0_r, dst1_r, dst2_r, dst3_r);
     ADD4(dst4_r, dc, dst5_r, dc, dst6_r, dc, dst7_r, dc,
          dst4_r, dst5_r, dst6_r, dst7_r);
-    CLIP_SH4_0_255(dst0_r, dst1_r, dst2_r, dst3_r);
-    CLIP_SH4_0_255(dst4_r, dst5_r, dst6_r, dst7_r);
+    CLIP_SH8_0_255(dst0_r, dst1_r, dst2_r, dst3_r,
+                   dst4_r, dst5_r, dst6_r, dst7_r);
     PCKEV_B4_SB(dst1_r, dst0_r, dst3_r, dst2_r, dst5_r, dst4_r, dst7_r, dst6_r,
                 dst0, dst1, dst2, dst3);
-    ST8x4_UB(dst0, dst1, dst, dst_stride);
-    dst += (4 * dst_stride);
-    ST8x4_UB(dst2, dst3, dst, dst_stride);
+    ST_D8(dst0, dst1, dst2, dst3, 0, 1, 0, 1, 0, 1, 0, 1, dst, dst_stride)
 }
 
 void ff_h264_idct_add_msa(uint8_t *dst, int16_t *src, int32_t dst_stride)
@@ -340,7 +335,7 @@
     ADD2(pred_r, input_dc, pred_l, input_dc, pred_r, pred_l);
     CLIP_SH2_0_255(pred_r, pred_l);
     out = __msa_pckev_b((v16i8) pred_l, (v16i8) pred_r);
-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
+    ST_W4(out, 0, 1, 2, 3, dst, dst_stride);
 }
 
 void ff_h264_idct8_dc_addblk_msa(uint8_t *dst, int16_t *src,
diff --git a/libavcodec/mips/h264pred_init_mips.c b/libavcodec/mips/h264pred_init_mips.c
index c33d8f7..e537ad8 100644
--- a/libavcodec/mips/h264pred_init_mips.c
+++ b/libavcodec/mips/h264pred_init_mips.c
@@ -73,10 +73,7 @@
 
         switch (codec_id) {
         case AV_CODEC_ID_SVQ3:
-            ;
-            break;
         case AV_CODEC_ID_RV40:
-            ;
             break;
         case AV_CODEC_ID_VP7:
         case AV_CODEC_ID_VP8:
@@ -146,10 +143,10 @@
                                     int bit_depth,
                                     const int chroma_format_idc)
 {
-#if HAVE_MSA
-    h264_pred_init_msa(h, codec_id, bit_depth, chroma_format_idc);
-#endif  // #if HAVE_MSA
 #if HAVE_MMI
     h264_pred_init_mmi(h, codec_id, bit_depth, chroma_format_idc);
 #endif /* HAVE_MMI */
+#if HAVE_MSA
+    h264_pred_init_msa(h, codec_id, bit_depth, chroma_format_idc);
+#endif  // #if HAVE_MSA
 }
diff --git a/libavcodec/mips/h264qpel_init_mips.c b/libavcodec/mips/h264qpel_init_mips.c
index 92219f8..33bae30 100644
--- a/libavcodec/mips/h264qpel_init_mips.c
+++ b/libavcodec/mips/h264qpel_init_mips.c
@@ -240,10 +240,10 @@
 
 av_cold void ff_h264qpel_init_mips(H264QpelContext *c, int bit_depth)
 {
-#if HAVE_MSA
-    h264qpel_init_msa(c, bit_depth);
-#endif  // #if HAVE_MSA
 #if HAVE_MMI
     h264qpel_init_mmi(c, bit_depth);
 #endif /* HAVE_MMI */
+#if HAVE_MSA
+    h264qpel_init_msa(c, bit_depth);
+#endif  // #if HAVE_MSA
 }
diff --git a/libavcodec/mips/h264qpel_msa.c b/libavcodec/mips/h264qpel_msa.c
index 9c779bd..e435c18 100644
--- a/libavcodec/mips/h264qpel_msa.c
+++ b/libavcodec/mips/h264qpel_msa.c
@@ -149,7 +149,7 @@
 
     SAT_SH2_SH(out0, out1, 7);
     out = PCKEV_XORI128_UB(out0, out1);
-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, stride);
+    ST_W4(out, 0, 1, 2, 3, dst, stride);
 }
 
 static void avc_luma_hv_qrt_8x8_msa(const uint8_t *src_x, const uint8_t *src_y,
@@ -220,7 +220,7 @@
     SAT_SH4_SH(tmp0, tmp1, tmp2, tmp3, 7);
     out0 = PCKEV_XORI128_UB(tmp0, tmp1);
     out1 = PCKEV_XORI128_UB(tmp2, tmp3);
-    ST8x4_UB(out0, out1, dst, stride);
+    ST_D4(out0, out1, 0, 1, 0, 1, dst, stride);
     dst += (4 * stride);
 
     LD_SB4(src_y, stride, src_vt9, src_vt10, src_vt11, src_vt12);
@@ -256,8 +256,7 @@
     SAT_SH4_SH(tmp0, tmp1, tmp2, tmp3, 7);
     out0 = PCKEV_XORI128_UB(tmp0, tmp1);
     out1 = PCKEV_XORI128_UB(tmp2, tmp3);
-    ST8x4_UB(out0, out1, dst, stride);
-    dst += (4 * stride);
+    ST_D4(out0, out1, 0, 1, 0, 1, dst, stride);
 }
 
 static void avc_luma_hv_qrt_16x16_msa(const uint8_t *src_x,
@@ -337,7 +336,7 @@
             SAT_SH4_SH(out0, out1, out2, out3, 7);
             tmp0 = PCKEV_XORI128_UB(out0, out1);
             tmp1 = PCKEV_XORI128_UB(out2, out3);
-            ST8x4_UB(tmp0, tmp1, dst, stride);
+            ST_D4(tmp0, tmp1, 0, 1, 0, 1, dst, stride);
             dst += (4 * stride);
 
             src_vt0 = src_vt4;
@@ -419,7 +418,7 @@
     res = PCKEV_XORI128_UB(res0, res1);
     dst0 = __msa_aver_u_b(res, dst0);
 
-    ST4x4_UB(dst0, dst0, 0, 1, 2, 3, dst, stride);
+    ST_W4(dst0, 0, 1, 2, 3, dst, stride);
 }
 
 static void avc_luma_hv_qrt_and_aver_dst_8x8_msa(const uint8_t *src_x,
@@ -498,7 +497,7 @@
     out0 = PCKEV_XORI128_UB(tmp0, tmp1);
     out1 = PCKEV_XORI128_UB(tmp2, tmp3);
     AVER_UB2_UB(out0, dst0, out1, dst1, dst0, dst1);
-    ST8x4_UB(dst0, dst1, dst, stride);
+    ST_D4(dst0, dst1, 0, 1, 0, 1, dst, stride);
     dst += (4 * stride);
 
     LD_SB4(src_y, stride, src_vt9, src_vt10, src_vt11, src_vt12);
@@ -539,8 +538,7 @@
     out0 = PCKEV_XORI128_UB(tmp0, tmp1);
     out1 = PCKEV_XORI128_UB(tmp2, tmp3);
     AVER_UB2_UB(out0, dst0, out1, dst1, dst0, dst1);
-    ST8x4_UB(dst0, dst1, dst, stride);
-    dst += (4 * stride);
+    ST_D4(dst0, dst1, 0, 1, 0, 1, dst, stride);
 }
 
 static void avc_luma_hv_qrt_and_aver_dst_16x16_msa(const uint8_t *src_x,
@@ -627,7 +625,7 @@
             tmp0 = PCKEV_XORI128_UB(out0, out1);
             tmp1 = PCKEV_XORI128_UB(out2, out3);
             AVER_UB2_UB(tmp0, dst0, tmp1, dst1, dst0, dst1);
-            ST8x4_UB(dst0, dst1, dst, stride);
+            ST_D4(dst0, dst1, 0, 1, 0, 1, dst, stride);
             dst += (4 * stride);
 
             src_vt0 = src_vt4;
@@ -723,7 +721,7 @@
     AVER_UB4_UB(src0, dst0, src1, dst1, src2, dst2, src3, dst3, dst0, dst1,
                 dst2, dst3);
 
-    ST8x8_UB(dst0, dst1, dst2, dst3, dst, stride);
+    ST_D8(dst0, dst1, dst2, dst3, 0, 1, 0, 1, 0, 1, 0, 1, dst, stride);
 }
 
 void ff_avg_h264_qpel4_mc00_msa(uint8_t *dst, const uint8_t *src,
@@ -739,7 +737,7 @@
 
     dst0 = __msa_aver_u_b(src0, dst0);
 
-    ST4x4_UB(dst0, dst0, 0, 1, 2, 3, dst, stride);
+    ST_W4(dst0, 0, 1, 2, 3, dst, stride);
 }
 
 void ff_put_h264_qpel16_mc10_msa(uint8_t *dst, const uint8_t *src,
@@ -792,8 +790,8 @@
                      minus5b, res4, res5, res6, res7);
         DPADD_SB4_SH(vec2, vec5, vec8, vec11, plus20b, plus20b, plus20b,
                      plus20b, res4, res5, res6, res7);
-        SLDI_B2_SB(src1, src3, src0, src2, src0, src2, 2);
-        SLDI_B2_SB(src5, src7, src4, src6, src4, src6, 2);
+        SLDI_B4_SB(src1, src0, src3, src2, src5, src4, src7, src6, 2,
+                   src0, src2, src4, src6);
         SRARI_H4_SH(res0, res1, res2, res3, 5);
         SRARI_H4_SH(res4, res5, res6, res7, 5);
         SAT_SH4_SH(res0, res1, res2, res3, 7);
@@ -860,8 +858,8 @@
                      minus5b, res4, res5, res6, res7);
         DPADD_SB4_SH(vec2, vec5, vec8, vec11, plus20b, plus20b, plus20b,
                      plus20b, res4, res5, res6, res7);
-        SLDI_B2_SB(src1, src3, src0, src2, src0, src2, 3);
-        SLDI_B2_SB(src5, src7, src4, src6, src4, src6, 3);
+        SLDI_B4_SB(src1, src0, src3, src2, src5, src4, src7, src6, 3,
+                   src0, src2, src4, src6);
         SRARI_H4_SH(res0, res1, res2, res3, 5);
         SRARI_H4_SH(res4, res5, res6, res7, 5);
         SAT_SH4_SH(res0, res1, res2, res3, 7);
@@ -913,10 +911,10 @@
     VSHF_B2_SB(src6, src6, src7, src7, mask2, mask2, vec10, vec11);
     DPADD_SB4_SH(vec8, vec9, vec10, vec11, plus20b, plus20b, plus20b, plus20b,
                  res4, res5, res6, res7);
-    SLDI_B2_SB(src0, src1, src0, src1, src0, src1, 2);
-    SLDI_B2_SB(src2, src3, src2, src3, src2, src3, 2);
-    SLDI_B2_SB(src4, src5, src4, src5, src4, src5, 2);
-    SLDI_B2_SB(src6, src7, src6, src7, src6, src7, 2);
+    SLDI_B4_SB(src0, src0, src1, src1, src2, src2, src3, src3, 2,
+               src0, src1, src2, src3);
+    SLDI_B4_SB(src4, src4, src5, src5, src6, src6, src7, src7, 2,
+               src4, src5, src6, src7);
     PCKEV_D2_SB(src1, src0, src3, src2, src0, src1);
     PCKEV_D2_SB(src5, src4, src7, src6, src4, src5);
     SRARI_H4_SH(res0, res1, res2, res3, 5);
@@ -930,7 +928,7 @@
     tmp2 = __msa_aver_s_b(tmp2, src4);
     tmp3 = __msa_aver_s_b(tmp3, src5);
     XORI_B4_128_SB(tmp0, tmp1, tmp2, tmp3);
-    ST8x8_UB(tmp0, tmp1, tmp2, tmp3, dst, stride);
+    ST_D8(tmp0, tmp1, tmp2, tmp3, 0, 1, 0, 1, 0, 1, 0, 1, dst, stride);
 }
 
 void ff_put_h264_qpel8_mc30_msa(uint8_t *dst, const uint8_t *src,
@@ -968,10 +966,10 @@
     VSHF_B2_SB(src6, src6, src7, src7, mask2, mask2, vec10, vec11);
     DPADD_SB4_SH(vec8, vec9, vec10, vec11, plus20b, plus20b, plus20b, plus20b,
                  res4, res5, res6, res7);
-    SLDI_B2_SB(src0, src1, src0, src1, src0, src1, 3);
-    SLDI_B2_SB(src2, src3, src2, src3, src2, src3, 3);
-    SLDI_B2_SB(src4, src5, src4, src5, src4, src5, 3);
-    SLDI_B2_SB(src6, src7, src6, src7, src6, src7, 3);
+    SLDI_B4_SB(src0, src0, src1, src1, src2, src2, src3, src3, 3,
+               src0, src1, src2, src3);
+    SLDI_B4_SB(src4, src4, src5, src5, src6, src6, src7, src7, 3,
+               src4, src5, src6, src7);
     PCKEV_D2_SB(src1, src0, src3, src2, src0, src1);
     PCKEV_D2_SB(src5, src4, src7, src6, src4, src5);
     SRARI_H4_SH(res0, res1, res2, res3, 5);
@@ -985,7 +983,7 @@
     tmp2 = __msa_aver_s_b(tmp2, src4);
     tmp3 = __msa_aver_s_b(tmp3, src5);
     XORI_B4_128_SB(tmp0, tmp1, tmp2, tmp3);
-    ST8x8_UB(tmp0, tmp1, tmp2, tmp3, dst, stride);
+    ST_D8(tmp0, tmp1, tmp2, tmp3, 0, 1, 0, 1, 0, 1, 0, 1, dst, stride);
 }
 
 void ff_put_h264_qpel4_mc10_msa(uint8_t *dst, const uint8_t *src,
@@ -1009,14 +1007,14 @@
     SRARI_H2_SH(res0, res1, 5);
     SAT_SH2_SH(res0, res1, 7);
     res = __msa_pckev_b((v16i8) res1, (v16i8) res0);
-    SLDI_B2_SB(src0, src1, src0, src1, src0, src1, 2);
-    SLDI_B2_SB(src2, src3, src2, src3, src2, src3, 2);
+    SLDI_B4_SB(src0, src0, src1, src1, src2, src2, src3, src3, 2,
+               src0, src1, src2, src3);
     src0 = (v16i8) __msa_insve_w((v4i32) src0, 1, (v4i32) src1);
     src1 = (v16i8) __msa_insve_w((v4i32) src2, 1, (v4i32) src3);
     src0 = (v16i8) __msa_insve_d((v2i64) src0, 1, (v2i64) src1);
     res = __msa_aver_s_b(res, src0);
     res = (v16i8) __msa_xori_b((v16u8) res, 128);
-    ST4x4_UB(res, res, 0, 1, 2, 3, dst, stride);
+    ST_W4(res, 0, 1, 2, 3, dst, stride);
 }
 
 void ff_put_h264_qpel4_mc30_msa(uint8_t *dst, const uint8_t *src,
@@ -1040,14 +1038,14 @@
     SRARI_H2_SH(res0, res1, 5);
     SAT_SH2_SH(res0, res1, 7);
     res = __msa_pckev_b((v16i8) res1, (v16i8) res0);
-    SLDI_B2_SB(src0, src1, src0, src1, src0, src1, 3);
-    SLDI_B2_SB(src2, src3, src2, src3, src2, src3, 3);
+    SLDI_B4_SB(src0, src0, src1, src1, src2, src2, src3, src3, 3,
+               src0, src1, src2, src3);
     src0 = (v16i8) __msa_insve_w((v4i32) src0, 1, (v4i32) src1);
     src1 = (v16i8) __msa_insve_w((v4i32) src2, 1, (v4i32) src3);
     src0 = (v16i8) __msa_insve_d((v2i64) src0, 1, (v2i64) src1);
     res = __msa_aver_s_b(res, src0);
     res = (v16i8) __msa_xori_b((v16u8) res, 128);
-    ST4x4_UB(res, res, 0, 1, 2, 3, dst, stride);
+    ST_W4(res, 0, 1, 2, 3, dst, stride);
 }
 
 void ff_put_h264_qpel16_mc20_msa(uint8_t *dst, const uint8_t *src,
@@ -1153,7 +1151,7 @@
     out1 = PCKEV_XORI128_UB(res2, res3);
     out2 = PCKEV_XORI128_UB(res4, res5);
     out3 = PCKEV_XORI128_UB(res6, res7);
-    ST8x8_UB(out0, out1, out2, out3, dst, stride);
+    ST_D8(out0, out1, out2, out3, 0, 1, 0, 1, 0, 1, 0, 1, dst, stride);
 }
 
 void ff_put_h264_qpel4_mc20_msa(uint8_t *dst, const uint8_t *src,
@@ -1178,7 +1176,7 @@
     SRARI_H2_SH(res0, res1, 5);
     SAT_SH2_SH(res0, res1, 7);
     out = PCKEV_XORI128_UB(res0, res1);
-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, stride);
+    ST_W4(out, 0, 1, 2, 3, dst, stride);
 }
 
 void ff_put_h264_qpel16_mc01_msa(uint8_t *dst, const uint8_t *src,
@@ -1378,7 +1376,7 @@
     out2 = __msa_aver_s_b(out2, tmp2);
     out3 = __msa_aver_s_b(out3, tmp3);
     XORI_B4_128_SB(out0, out1, out2, out3);
-    ST8x8_UB(out0, out1, out2, out3, dst, stride);
+    ST_D8(out0, out1, out2, out3, 0, 1, 0, 1, 0, 1, 0, 1, dst, stride);
 }
 
 void ff_put_h264_qpel8_mc03_msa(uint8_t *dst, const uint8_t *src,
@@ -1431,7 +1429,7 @@
     out2 = __msa_aver_s_b(out2, tmp2);
     out3 = __msa_aver_s_b(out3, tmp3);
     XORI_B4_128_SB(out0, out1, out2, out3);
-    ST8x8_UB(out0, out1, out2, out3, dst, stride);
+    ST_D8(out0, out1, out2, out3, 0, 1, 0, 1, 0, 1, 0, 1, dst, stride);
 }
 
 void ff_put_h264_qpel4_mc01_msa(uint8_t *dst, const uint8_t *src,
@@ -1472,7 +1470,7 @@
     src54_r = (v16i8) __msa_insve_w((v4i32) src4, 1, (v4i32) src5);
     src32_r = (v16i8) __msa_insve_d((v2i64) src32_r, 1, (v2i64) src54_r);
     out = __msa_aver_u_b(out, (v16u8) src32_r);
-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, stride);
+    ST_W4(out, 0, 1, 2, 3, dst, stride);
 }
 
 void ff_put_h264_qpel4_mc03_msa(uint8_t *dst, const uint8_t *src,
@@ -1513,7 +1511,7 @@
     src54_r = (v16i8) __msa_insve_w((v4i32) src5, 1, (v4i32) src6);
     src32_r = (v16i8) __msa_insve_d((v2i64) src32_r, 1, (v2i64) src54_r);
     out = __msa_aver_u_b(out, (v16u8) src32_r);
-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, stride);
+    ST_W4(out, 0, 1, 2, 3, dst, stride);
 }
 
 void ff_put_h264_qpel16_mc11_msa(uint8_t *dst, const uint8_t *src,
@@ -1691,7 +1689,7 @@
 
             out0 = PCKEV_XORI128_UB(dst0, dst1);
             out1 = PCKEV_XORI128_UB(dst2, dst3);
-            ST8x4_UB(out0, out1, dst, stride);
+            ST_D4(out0, out1, 0, 1, 0, 1, dst, stride);
             dst += (4 * stride);
 
             hz_out0 = hz_out4;
@@ -1804,7 +1802,7 @@
 
             out0 = PCKEV_XORI128_UB(dst0, dst1);
             out1 = PCKEV_XORI128_UB(dst2, dst3);
-            ST8x4_UB(out0, out1, dst, stride);
+            ST_D4(out0, out1, 0, 1, 0, 1, dst, stride);
             dst += (4 * stride);
 
             hz_out0 = hz_out4;
@@ -1905,7 +1903,7 @@
 
     out0 = PCKEV_XORI128_UB(dst0, dst1);
     out1 = PCKEV_XORI128_UB(dst2, dst3);
-    ST8x4_UB(out0, out1, dst, stride);
+    ST_D4(out0, out1, 0, 1, 0, 1, dst, stride);
     dst += (4 * stride);
 
     LD_SB4(src, stride, src9, src10, src11, src12);
@@ -1951,7 +1949,7 @@
 
     out0 = PCKEV_XORI128_UB(dst0, dst1);
     out1 = PCKEV_XORI128_UB(dst2, dst3);
-    ST8x4_UB(out0, out1, dst, stride);
+    ST_D4(out0, out1, 0, 1, 0, 1, dst, stride);
 }
 
 void ff_put_h264_qpel8_mc23_msa(uint8_t *dst, const uint8_t *src,
@@ -2040,7 +2038,7 @@
 
     out0 = PCKEV_XORI128_UB(dst0, dst1);
     out1 = PCKEV_XORI128_UB(dst2, dst3);
-    ST8x4_UB(out0, out1, dst, stride);
+    ST_D4(out0, out1, 0, 1, 0, 1, dst, stride);
     dst += (4 * stride);
 
     LD_SB4(src, stride, src9, src10, src11, src12);
@@ -2086,7 +2084,7 @@
 
     out0 = PCKEV_XORI128_UB(dst0, dst1);
     out1 = PCKEV_XORI128_UB(dst2, dst3);
-    ST8x4_UB(out0, out1, dst, stride);
+    ST_D4(out0, out1, 0, 1, 0, 1, dst, stride);
 }
 
 void ff_put_h264_qpel4_mc21_msa(uint8_t *dst, const uint8_t *src,
@@ -2150,7 +2148,7 @@
     dst1 = __msa_aver_s_h(dst1, hz_out4);
 
     res = PCKEV_XORI128_UB(dst0, dst1);
-    ST4x4_UB(res, res, 0, 1, 2, 3, dst, stride);
+    ST_W4(res, 0, 1, 2, 3, dst, stride);
 }
 
 void ff_put_h264_qpel4_mc23_msa(uint8_t *dst, const uint8_t *src,
@@ -2215,7 +2213,7 @@
     dst1 = __msa_aver_s_h(dst1, hz_out1);
 
     res = PCKEV_XORI128_UB(dst0, dst1);
-    ST4x4_UB(res, res, 0, 1, 2, 3, dst, stride);
+    ST_W4(res, 0, 1, 2, 3, dst, stride);
 }
 
 void ff_put_h264_qpel16_mc02_msa(uint8_t *dst, const uint8_t *src,
@@ -2332,7 +2330,7 @@
     out1 = PCKEV_XORI128_UB(out2_r, out3_r);
     out2 = PCKEV_XORI128_UB(out4_r, out5_r);
     out3 = PCKEV_XORI128_UB(out6_r, out7_r);
-    ST8x8_UB(out0, out1, out2, out3, dst, stride);
+    ST_D8(out0, out1, out2, out3, 0, 1, 0, 1, 0, 1, 0, 1, dst, stride);
 }
 
 void ff_put_h264_qpel4_mc02_msa(uint8_t *dst, const uint8_t *src,
@@ -2369,7 +2367,7 @@
     SRARI_H2_SH(out10, out32, 5);
     SAT_SH2_SH(out10, out32, 7);
     out = PCKEV_XORI128_UB(out10, out32);
-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, stride);
+    ST_W4(out, 0, 1, 2, 3, dst, stride);
 }
 
 void ff_put_h264_qpel16_mc12_msa(uint8_t *dst, const uint8_t *src,
@@ -2601,7 +2599,7 @@
         dst0 = __msa_aver_s_h(dst2, dst0);
         dst1 = __msa_aver_s_h(dst3, dst1);
         out = PCKEV_XORI128_UB(dst0, dst1);
-        ST8x2_UB(out, dst, stride);
+        ST_D2(out, 0, 1, dst, stride);
         dst += (2 * stride);
 
         src0 = src2;
@@ -2677,7 +2675,7 @@
         dst0 = __msa_aver_s_h(dst2, dst0);
         dst1 = __msa_aver_s_h(dst3, dst1);
         out = PCKEV_XORI128_UB(dst0, dst1);
-        ST8x2_UB(out, dst, stride);
+        ST_D2(out, 0, 1, dst, stride);
         dst += (2 * stride);
 
         src0 = src2;
@@ -2777,7 +2775,7 @@
 
     PCKEV_H2_SH(hz_res1, hz_res0, hz_res3, hz_res2, dst0, dst2);
     out = PCKEV_XORI128_UB(dst0, dst2);
-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, stride);
+    ST_W4(out, 0, 1, 2, 3, dst, stride);
 }
 
 void ff_put_h264_qpel4_mc32_msa(uint8_t *dst, const uint8_t *src,
@@ -2873,7 +2871,7 @@
 
     PCKEV_H2_SH(hz_res1, hz_res0, hz_res3, hz_res2, dst0, dst2);
     out = PCKEV_XORI128_UB(dst0, dst2);
-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, stride);
+    ST_W4(out, 0, 1, 2, 3, dst, stride);
 }
 
 void ff_put_h264_qpel16_mc22_msa(uint8_t *dst, const uint8_t *src,
@@ -2961,7 +2959,7 @@
 
             out0 = PCKEV_XORI128_UB(dst0, dst1);
             out1 = PCKEV_XORI128_UB(dst2, dst3);
-            ST8x4_UB(out0, out1, dst, stride);
+            ST_D4(out0, out1, 0, 1, 0, 1, dst, stride);
             dst += (4 * stride);
 
             hz_out0 = hz_out4;
@@ -3049,7 +3047,7 @@
     dst3 = __msa_pckev_h((v8i16) tmp1, (v8i16) tmp0);
     out0 = PCKEV_XORI128_UB(dst0, dst1);
     out1 = PCKEV_XORI128_UB(dst2, dst3);
-    ST8x4_UB(out0, out1, dst, stride);
+    ST_D4(out0, out1, 0, 1, 0, 1, dst, stride);
     dst += (4 * stride);
 
     LD_SB4(src, stride, src0, src1, src2, src3);
@@ -3086,7 +3084,7 @@
     dst3 = __msa_pckev_h((v8i16) tmp1, (v8i16) tmp0);
     out0 = PCKEV_XORI128_UB(dst0, dst1);
     out1 = PCKEV_XORI128_UB(dst2, dst3);
-    ST8x4_UB(out0, out1, dst, stride);
+    ST_D4(out0, out1, 0, 1, 0, 1, dst, stride);
 }
 
 void ff_put_h264_qpel4_mc22_msa(uint8_t *dst, const uint8_t *src,
@@ -3141,7 +3139,7 @@
                           filt2);
     dst1 = __msa_pckev_h((v8i16) tmp1, (v8i16) tmp0);
     res = PCKEV_XORI128_UB(dst0, dst1);
-    ST4x4_UB(res, res, 0, 1, 2, 3, dst, stride);
+    ST_W4(res, 0, 1, 2, 3, dst, stride);
 }
 
 void ff_avg_h264_qpel16_mc10_msa(uint8_t *dst, const uint8_t *src,
@@ -3196,8 +3194,8 @@
                      minus5b, res4, res5, res6, res7);
         DPADD_SB4_SH(vec2, vec5, vec8, vec11, plus20b, plus20b, plus20b,
                      plus20b, res4, res5, res6, res7);
-        SLDI_B2_SB(src1, src3, src0, src2, src0, src2, 2);
-        SLDI_B2_SB(src5, src7, src4, src6, src4, src6, 2);
+        SLDI_B4_SB(src1, src0, src3, src2, src5, src4, src7, src6, 2,
+                   src0, src2, src4, src6);
         SRARI_H4_SH(res0, res1, res2, res3, 5);
         SRARI_H4_SH(res4, res5, res6, res7, 5);
         SAT_SH4_SH(res0, res1, res2, res3, 7);
@@ -3268,8 +3266,8 @@
                      minus5b, res4, res5, res6, res7);
         DPADD_SB4_SH(vec2, vec5, vec8, vec11, plus20b, plus20b, plus20b,
                      plus20b, res4, res5, res6, res7);
-        SLDI_B2_SB(src1, src3, src0, src2, src0, src2, 3);
-        SLDI_B2_SB(src5, src7, src4, src6, src4, src6, 3);
+        SLDI_B4_SB(src1, src0, src3, src2, src5, src4, src7, src6, 3,
+                   src0, src2, src4, src6);
         SRARI_H4_SH(res0, res1, res2, res3, 5);
         SRARI_H4_SH(res4, res5, res6, res7, 5);
         SAT_SH4_SH(res0, res1, res2, res3, 7);
@@ -3325,10 +3323,10 @@
     VSHF_B2_SB(src6, src6, src7, src7, mask2, mask2, vec10, vec11);
     DPADD_SB4_SH(vec8, vec9, vec10, vec11, plus20b, plus20b, plus20b, plus20b,
                  res4, res5, res6, res7);
-    SLDI_B2_SB(src0, src1, src0, src1, src0, src1, 2);
-    SLDI_B2_SB(src2, src3, src2, src3, src2, src3, 2);
-    SLDI_B2_SB(src4, src5, src4, src5, src4, src5, 2);
-    SLDI_B2_SB(src6, src7, src6, src7, src6, src7, 2);
+    SLDI_B4_SB(src0, src0, src1, src1, src2, src2, src3, src3, 2,
+               src0, src1, src2, src3);
+    SLDI_B4_SB(src4, src4, src5, src5, src6, src6, src7, src7, 2,
+               src4, src5, src6, src7);
     PCKEV_D2_SB(src1, src0, src3, src2, src0, src1);
     PCKEV_D2_SB(src5, src4, src7, src6, src4, src5);
     SRARI_H4_SH(res0, res1, res2, res3, 5);
@@ -3350,7 +3348,7 @@
     INSERT_D2_UB(tp2, tp3, dst3);
     AVER_UB2_UB(tmp0, dst0, tmp1, dst1, dst0, dst1);
     AVER_UB2_UB(tmp2, dst2, tmp3, dst3, dst2, dst3);
-    ST8x8_UB(dst0, dst1, dst2, dst3, dst, stride);
+    ST_D8(dst0, dst1, dst2, dst3, 0, 1, 0, 1, 0, 1, 0, 1, dst, stride);
 }
 
 void ff_avg_h264_qpel8_mc30_msa(uint8_t *dst, const uint8_t *src,
@@ -3390,10 +3388,10 @@
     VSHF_B2_SB(src6, src6, src7, src7, mask2, mask2, vec10, vec11);
     DPADD_SB4_SH(vec8, vec9, vec10, vec11, plus20b, plus20b, plus20b, plus20b,
                  res4, res5, res6, res7);
-    SLDI_B2_SB(src0, src1, src0, src1, src0, src1, 3);
-    SLDI_B2_SB(src2, src3, src2, src3, src2, src3, 3);
-    SLDI_B2_SB(src4, src5, src4, src5, src4, src5, 3);
-    SLDI_B2_SB(src6, src7, src6, src7, src6, src7, 3);
+    SLDI_B4_SB(src0, src0, src1, src1, src2, src2, src3, src3, 3,
+               src0, src1, src2, src3);
+    SLDI_B4_SB(src4, src4, src5, src5, src6, src6, src7, src7, 3,
+               src4, src5, src6, src7);
     PCKEV_D2_SB(src1, src0, src3, src2, src0, src1);
     PCKEV_D2_SB(src5, src4, src7, src6, src4, src5);
     SRARI_H4_SH(res0, res1, res2, res3, 5);
@@ -3415,7 +3413,7 @@
     INSERT_D2_UB(tp2, tp3, dst3);
     AVER_UB2_UB(tmp0, dst0, tmp1, dst1, dst0, dst1);
     AVER_UB2_UB(tmp2, dst2, tmp3, dst3, dst2, dst3);
-    ST8x8_UB(dst0, dst1, dst2, dst3, dst, stride);
+    ST_D8(dst0, dst1, dst2, dst3, 0, 1, 0, 1, 0, 1, 0, 1, dst, stride);
 }
 
 void ff_avg_h264_qpel4_mc10_msa(uint8_t *dst, const uint8_t *src,
@@ -3441,8 +3439,8 @@
     SRARI_H2_SH(out0, out1, 5);
     SAT_SH2_SH(out0, out1, 7);
     res = __msa_pckev_b((v16i8) out1, (v16i8) out0);
-    SLDI_B2_SB(src0, src1, src0, src1, src0, src1, 2);
-    SLDI_B2_SB(src2, src3, src2, src3, src2, src3, 2);
+    SLDI_B4_SB(src0, src0, src1, src1, src2, src2, src3, src3, 2,
+               src0, src1, src2, src3);
     src0 = (v16i8) __msa_insve_w((v4i32) src0, 1, (v4i32) src1);
     src1 = (v16i8) __msa_insve_w((v4i32) src2, 1, (v4i32) src3);
     src0 = (v16i8) __msa_insve_d((v2i64) src0, 1, (v2i64) src1);
@@ -3451,7 +3449,7 @@
     LW4(dst, stride, tp0, tp1, tp2, tp3);
     INSERT_W4_UB(tp0, tp1, tp2, tp3, dst0);
     dst0 = __msa_aver_u_b((v16u8) res, dst0);
-    ST4x4_UB(dst0, dst0, 0, 1, 2, 3, dst, stride);
+    ST_W4(dst0, 0, 1, 2, 3, dst, stride);
 }
 
 void ff_avg_h264_qpel4_mc30_msa(uint8_t *dst, const uint8_t *src,
@@ -3477,8 +3475,8 @@
     SRARI_H2_SH(out0, out1, 5);
     SAT_SH2_SH(out0, out1, 7);
     res = __msa_pckev_b((v16i8) out1, (v16i8) out0);
-    SLDI_B2_SB(src0, src1, src0, src1, src0, src1, 3);
-    SLDI_B2_SB(src2, src3, src2, src3, src2, src3, 3);
+    SLDI_B4_SB(src0, src0, src1, src1, src2, src2, src3, src3, 3,
+               src0, src1, src2, src3);
     src0 = (v16i8) __msa_insve_w((v4i32) src0, 1, (v4i32) src1);
     src1 = (v16i8) __msa_insve_w((v4i32) src2, 1, (v4i32) src3);
     src0 = (v16i8) __msa_insve_d((v2i64) src0, 1, (v2i64) src1);
@@ -3487,7 +3485,7 @@
     LW4(dst, stride, tp0, tp1, tp2, tp3);
     INSERT_W4_UB(tp0, tp1, tp2, tp3, dst0);
     dst0 = __msa_aver_u_b((v16u8) res, dst0);
-    ST4x4_UB(dst0, dst0, 0, 1, 2, 3, dst, stride);
+    ST_W4(dst0, 0, 1, 2, 3, dst, stride);
 }
 
 void ff_avg_h264_qpel16_mc20_msa(uint8_t *dst, const uint8_t *src,
@@ -3608,7 +3606,7 @@
     INSERT_D2_UB(tp2, tp3, out7);
     AVER_UB2_UB(out0, out2, out1, out3, out0, out1);
     AVER_UB2_UB(out4, out6, out5, out7, out4, out5);
-    ST8x8_UB(out0, out1, out4, out5, dst, stride);
+    ST_D8(out0, out1, out4, out5, 0, 1, 0, 1, 0, 1, 0, 1, dst, stride);
 }
 
 void ff_avg_h264_qpel4_mc20_msa(uint8_t *dst, const uint8_t *src,
@@ -3637,7 +3635,7 @@
     LW4(dst, stride, tp0, tp1, tp2, tp3);
     INSERT_W4_UB(tp0, tp1, tp2, tp3, dst0);
     res = __msa_aver_u_b(res, dst0);
-    ST4x4_UB(res, res, 0, 1, 2, 3, dst, stride);
+    ST_W4(res, 0, 1, 2, 3, dst, stride);
 }
 
 void ff_avg_h264_qpel16_mc01_msa(uint8_t *dst, const uint8_t *src,
@@ -3856,7 +3854,7 @@
     XORI_B4_128_SB(out0, out1, out2, out3);
     AVER_UB4_UB(out0, dst0, out1, dst1, out2, dst2, out3, dst3, dst0, dst1,
                 dst2, dst3);
-    ST8x8_UB(dst0, dst1, dst2, dst3, dst, stride);
+    ST_D8(dst0, dst1, dst2, dst3, 0, 1, 0, 1, 0, 1, 0, 1, dst, stride);
 }
 
 void ff_avg_h264_qpel8_mc03_msa(uint8_t *dst, const uint8_t *src,
@@ -3922,7 +3920,7 @@
     XORI_B4_128_SB(out0, out1, out2, out3);
     AVER_UB4_UB(out0, dst0, out1, dst1, out2, dst2, out3, dst3, dst0, dst1,
                 dst2, dst3);
-    ST8x8_UB(dst0, dst1, dst2, dst3, dst, stride);
+    ST_D8(dst0, dst1, dst2, dst3, 0, 1, 0, 1, 0, 1, 0, 1, dst, stride);
 }
 
 void ff_avg_h264_qpel4_mc01_msa(uint8_t *dst, const uint8_t *src,
@@ -3967,7 +3965,7 @@
     res = PCKEV_XORI128_UB(out10, out32);
     res = __msa_aver_u_b(res, (v16u8) src32_r);
     dst0 = __msa_aver_u_b(res, dst0);
-    ST4x4_UB(dst0, dst0, 0, 1, 2, 3, dst, stride);
+    ST_W4(dst0, 0, 1, 2, 3, dst, stride);
 }
 
 void ff_avg_h264_qpel4_mc03_msa(uint8_t *dst, const uint8_t *src,
@@ -4013,7 +4011,7 @@
     src32_r = (v16i8) __msa_insve_d((v2i64) src32_r, 1, (v2i64) src54_r);
     res = __msa_aver_u_b(res, (v16u8) src32_r);
     dst0 = __msa_aver_u_b(res, dst0);
-    ST4x4_UB(dst0, dst0, 0, 1, 2, 3, dst, stride);
+    ST_W4(dst0, 0, 1, 2, 3, dst, stride);
 }
 
 void ff_avg_h264_qpel16_mc11_msa(uint8_t *dst, const uint8_t *src,
@@ -4196,7 +4194,7 @@
 
             out0 = PCKEV_XORI128_UB(tmp0, tmp1);
             dst0 = __msa_aver_u_b(out0, dst0);
-            ST8x2_UB(dst0, dst, stride);
+            ST_D2(dst0, 0, 1, dst, stride);
             dst += (2 * stride);
 
             LD_SB2(src, stride, src7, src8);
@@ -4232,7 +4230,7 @@
 
             out1 = PCKEV_XORI128_UB(tmp2, tmp3);
             dst1 = __msa_aver_u_b(out1, dst1);
-            ST8x2_UB(dst1, dst, stride);
+            ST_D2(dst1, 0, 1, dst, stride);
             dst += (2 * stride);
 
             hz_out0 = hz_out4;
@@ -4326,7 +4324,7 @@
             INSERT_D2_UB(tp0, tp1, dst0);
             out0 = PCKEV_XORI128_UB(tmp0, tmp1);
             dst0 = __msa_aver_u_b(out0, dst0);
-            ST8x2_UB(dst0, dst, stride);
+            ST_D2(dst0, 0, 1, dst, stride);
             dst += (2 * stride);
 
             LD_SB2(src, stride, src7, src8);
@@ -4361,7 +4359,7 @@
             INSERT_D2_UB(tp2, tp3, dst1);
             out1 = PCKEV_XORI128_UB(tmp2, tmp3);
             dst1 = __msa_aver_u_b(out1, dst1);
-            ST8x2_UB(dst1, dst, stride);
+            ST_D2(dst1, 0, 1, dst, stride);
             dst += (2 * stride);
 
             hz_out0 = hz_out4;
@@ -4468,7 +4466,7 @@
     out0 = PCKEV_XORI128_UB(tmp0, tmp1);
     out1 = PCKEV_XORI128_UB(tmp2, tmp3);
     AVER_UB2_UB(out0, dst0, out1, dst1, dst0, dst1);
-    ST8x4_UB(dst0, dst1, dst, stride);
+    ST_D4(dst0, dst1, 0, 1, 0, 1, dst, stride);
     dst += (4 * stride);
 
     LD_SB4(src, stride, src9, src10, src11, src12);
@@ -4519,7 +4517,7 @@
     out0 = PCKEV_XORI128_UB(tmp0, tmp1);
     out1 = PCKEV_XORI128_UB(tmp2, tmp3);
     AVER_UB2_UB(out0, dst0, out1, dst1, dst0, dst1);
-    ST8x4_UB(dst0, dst1, dst, stride);
+    ST_D4(dst0, dst1, 0, 1, 0, 1, dst, stride);
 }
 
 void ff_avg_h264_qpel8_mc23_msa(uint8_t *dst, const uint8_t *src,
@@ -4614,7 +4612,7 @@
     out0 = PCKEV_XORI128_UB(tmp0, tmp1);
     out1 = PCKEV_XORI128_UB(tmp2, tmp3);
     AVER_UB2_UB(out0, dst0, out1, dst1, dst0, dst1);
-    ST8x4_UB(dst0, dst1, dst, stride);
+    ST_D4(dst0, dst1, 0, 1, 0, 1, dst, stride);
     dst += (4 * stride);
 
     LD_SB4(src, stride, src9, src10, src11, src12);
@@ -4665,7 +4663,7 @@
     out0 = PCKEV_XORI128_UB(tmp0, tmp1);
     out1 = PCKEV_XORI128_UB(tmp2, tmp3);
     AVER_UB2_UB(out0, dst0, out1, dst1, dst0, dst1);
-    ST8x4_UB(dst0, dst1, dst, stride);
+    ST_D4(dst0, dst1, 0, 1, 0, 1, dst, stride);
 }
 
 void ff_avg_h264_qpel4_mc21_msa(uint8_t *dst, const uint8_t *src,
@@ -4732,7 +4730,7 @@
     INSERT_W4_UB(tp0, tp1, tp2, tp3, out);
     res = PCKEV_XORI128_UB(dst0, dst1);
     res = __msa_aver_u_b(res, out);
-    ST4x4_UB(res, res, 0, 1, 2, 3, dst, stride);
+    ST_W4(res, 0, 1, 2, 3, dst, stride);
 }
 
 void ff_avg_h264_qpel4_mc23_msa(uint8_t *dst, const uint8_t *src,
@@ -4800,7 +4798,7 @@
     INSERT_W4_UB(tp0, tp1, tp2, tp3, out);
     res = PCKEV_XORI128_UB(dst0, dst1);
     res = __msa_aver_u_b(res, out);
-    ST4x4_UB(res, res, 0, 1, 2, 3, dst, stride);
+    ST_W4(res, 0, 1, 2, 3, dst, stride);
 }
 
 void ff_avg_h264_qpel16_mc02_msa(uint8_t *dst, const uint8_t *src,
@@ -4936,7 +4934,7 @@
     out3 = PCKEV_XORI128_UB(out6_r, out7_r);
     AVER_UB4_UB(out0, dst0, out1, dst1, out2, dst2, out3, dst3, dst0, dst1,
                 dst2, dst3);
-    ST8x8_UB(dst0, dst1, dst2, dst3, dst, stride);
+    ST_D8(dst0, dst1, dst2, dst3, 0, 1, 0, 1, 0, 1, 0, 1, dst, stride);
 }
 
 void ff_avg_h264_qpel4_mc02_msa(uint8_t *dst, const uint8_t *src,
@@ -4977,7 +4975,7 @@
     INSERT_W4_UB(tp0, tp1, tp2, tp3, dst0);
     res = PCKEV_XORI128_UB(out10, out32);
     dst0 = __msa_aver_u_b(res, dst0);
-    ST4x4_UB(dst0, dst0, 0, 1, 2, 3, dst, stride);
+    ST_W4(dst0, 0, 1, 2, 3, dst, stride);
 }
 
 void ff_avg_h264_qpel16_mc12_msa(uint8_t *dst, const uint8_t *src,
@@ -5217,7 +5215,7 @@
         tmp1 = __msa_aver_s_h(tmp3, tmp1);
         out = PCKEV_XORI128_UB(tmp0, tmp1);
         out = __msa_aver_u_b(out, dst0);
-        ST8x2_UB(out, dst, stride);
+        ST_D2(out, 0, 1, dst, stride);
         dst += (2 * stride);
 
         src0 = src2;
@@ -5297,7 +5295,7 @@
         tmp1 = __msa_aver_s_h(tmp3, tmp1);
         out = PCKEV_XORI128_UB(tmp0, tmp1);
         out = __msa_aver_u_b(out, dst0);
-        ST8x2_UB(out, dst, stride);
+        ST_D2(out, 0, 1, dst, stride);
         dst += (2 * stride);
 
         src0 = src2;
@@ -5401,7 +5399,7 @@
     PCKEV_H2_SH(hz_res1, hz_res0, hz_res3, hz_res2, dst0, dst2);
     out = PCKEV_XORI128_UB(dst0, dst2);
     out = __msa_aver_u_b(out, dstv);
-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, stride);
+    ST_W4(out, 0, 1, 2, 3, dst, stride);
 }
 
 void ff_avg_h264_qpel4_mc32_msa(uint8_t *dst, const uint8_t *src,
@@ -5500,7 +5498,7 @@
     PCKEV_H2_SH(hz_res1, hz_res0, hz_res3, hz_res2, dst0, dst2);
     out = PCKEV_XORI128_UB(dst0, dst2);
     out = __msa_aver_u_b(out, dstv);
-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, stride);
+    ST_W4(out, 0, 1, 2, 3, dst, stride);
 }
 
 void ff_avg_h264_qpel16_mc22_msa(uint8_t *dst, const uint8_t *src,
@@ -5592,7 +5590,7 @@
             out0 = PCKEV_XORI128_UB(res0, res1);
             out1 = PCKEV_XORI128_UB(res2, res3);
             AVER_UB2_UB(out0, dst0, out1, dst1, out0, out1);
-            ST8x4_UB(out0, out1, dst, stride);
+            ST_D4(out0, out1, 0, 1, 0, 1, dst, stride);
             dst += (4 * stride);
 
             hz_out0 = hz_out4;
@@ -5685,7 +5683,7 @@
     out0 = PCKEV_XORI128_UB(res0, res1);
     out1 = PCKEV_XORI128_UB(res2, res3);
     AVER_UB2_UB(out0, dst0, out1, dst1, dst0, dst1);
-    ST8x4_UB(dst0, dst1, dst, stride);
+    ST_D4(dst0, dst1, 0, 1, 0, 1, dst, stride);
     dst += (4 * stride);
 
     LD_SB4(src, stride, src0, src1, src2, src3);
@@ -5726,7 +5724,7 @@
     out0 = PCKEV_XORI128_UB(res0, res1);
     out1 = PCKEV_XORI128_UB(res2, res3);
     AVER_UB2_UB(out0, dst0, out1, dst1, dst0, dst1);
-    ST8x4_UB(dst0, dst1, dst, stride);
+    ST_D4(dst0, dst1, 0, 1, 0, 1, dst, stride);
 }
 
 void ff_avg_h264_qpel4_mc22_msa(uint8_t *dst, const uint8_t *src,
@@ -5785,5 +5783,5 @@
     INSERT_W4_UB(tp0, tp1, tp2, tp3, dst0);
     res = PCKEV_XORI128_UB(res0, res1);
     res = __msa_aver_u_b(res, dst0);
-    ST4x4_UB(res, res, 0, 1, 2, 3, dst, stride);
+    ST_W4(res, 0, 1, 2, 3, dst, stride);
 }
diff --git a/libavcodec/mips/hevc_idct_msa.c b/libavcodec/mips/hevc_idct_msa.c
index 0943119..5ab6acd 100644
--- a/libavcodec/mips/hevc_idct_msa.c
+++ b/libavcodec/mips/hevc_idct_msa.c
@@ -727,7 +727,7 @@
     ADD2(dst_r0, in0, dst_l0, in1, dst_r0, dst_l0);
     CLIP_SH2_0_255(dst_r0, dst_l0);
     dst_vec = (v4i32) __msa_pckev_b((v16i8) dst_l0, (v16i8) dst_r0);
-    ST4x4_UB(dst_vec, dst_vec, 0, 1, 2, 3, dst, stride);
+    ST_W4(dst_vec, 0, 1, 2, 3, dst, stride);
 }
 
 static void hevc_addblk_8x8_msa(int16_t *coeffs, uint8_t *dst, int32_t stride)
@@ -752,8 +752,7 @@
          dst_r0, dst_l0, dst_r1, dst_l1);
     CLIP_SH4_0_255(dst_r0, dst_l0, dst_r1, dst_l1);
     PCKEV_B2_SH(dst_l0, dst_r0, dst_l1, dst_r1, dst_r0, dst_r1);
-    ST8x4_UB(dst_r0, dst_r1, dst, stride);
-    dst += (4 * stride);
+    ST_D4(dst_r0, dst_r1, 0, 1, 0, 1, dst, stride);
 
     LD4(temp_dst, stride, dst0, dst1, dst2, dst3);
     INSERT_D2_SD(dst0, dst1, dst_vec0);
@@ -764,7 +763,7 @@
          dst_r0, dst_l0, dst_r1, dst_l1);
     CLIP_SH4_0_255(dst_r0, dst_l0, dst_r1, dst_l1);
     PCKEV_B2_SH(dst_l0, dst_r0, dst_l1, dst_r1, dst_r0, dst_r1);
-    ST8x4_UB(dst_r0, dst_r1, dst, stride);
+    ST_D4(dst_r0, dst_r1, 0, 1, 0, 1, dst + 4 * stride, stride);
 }
 
 static void hevc_addblk_16x16_msa(int16_t *coeffs, uint8_t *dst, int32_t stride)
@@ -804,8 +803,9 @@
         LD_SH4((coeffs + 8), 16, in1, in3, in5, in7);
         coeffs += 64;
 
-        CLIP_SH4_0_255(dst_r0, dst_l0, dst_r1, dst_l1);
-        CLIP_SH4_0_255(dst_r2, dst_l2, dst_r3, dst_l3);
+        CLIP_SH8_0_255(dst_r0, dst_l0, dst_r1, dst_l1,
+                       dst_r2, dst_l2, dst_r3, dst_l3);
+
         PCKEV_B4_UB(dst_l0, dst_r0, dst_l1, dst_r1, dst_l2, dst_r2, dst_l3,
                     dst_r3, dst0, dst1, dst2, dst3);
         ST_UB4(dst0, dst1, dst2, dst3, dst, stride);
@@ -826,8 +826,8 @@
     dst_r3 += in6;
     dst_l3 += in7;
 
-    CLIP_SH4_0_255(dst_r0, dst_l0, dst_r1, dst_l1);
-    CLIP_SH4_0_255(dst_r2, dst_l2, dst_r3, dst_l3);
+    CLIP_SH8_0_255(dst_r0, dst_l0, dst_r1, dst_l1,
+                   dst_r2, dst_l2, dst_r3, dst_l3);
     PCKEV_B4_UB(dst_l0, dst_r0, dst_l1, dst_r1, dst_l2, dst_r2, dst_l3,
                 dst_r3, dst0, dst1, dst2, dst3);
     ST_UB4(dst0, dst1, dst2, dst3, dst, stride);
@@ -874,8 +874,8 @@
         LD_SH4((coeffs + 8), 16, in1, in3, in5, in7);
         coeffs += 64;
 
-        CLIP_SH4_0_255(dst_r0, dst_l0, dst_r1, dst_l1);
-        CLIP_SH4_0_255(dst_r2, dst_l2, dst_r3, dst_l3);
+        CLIP_SH8_0_255(dst_r0, dst_l0, dst_r1, dst_l1,
+                       dst_r2, dst_l2, dst_r3, dst_l3);
         PCKEV_B4_UB(dst_l0, dst_r0, dst_l1, dst_r1, dst_l2, dst_r2, dst_l3,
                     dst_r3, dst0, dst1, dst2, dst3);
         ST_UB2(dst0, dst1, dst, 16);
@@ -906,8 +906,8 @@
     LD_SH4(coeffs, 16, in0, in2, in4, in6);
     LD_SH4((coeffs + 8), 16, in1, in3, in5, in7);
 
-    CLIP_SH4_0_255(dst_r0, dst_l0, dst_r1, dst_l1);
-    CLIP_SH4_0_255(dst_r2, dst_l2, dst_r3, dst_l3);
+    CLIP_SH8_0_255(dst_r0, dst_l0, dst_r1, dst_l1,
+                   dst_r2, dst_l2, dst_r3, dst_l3);
     PCKEV_B4_UB(dst_l0, dst_r0, dst_l1, dst_r1, dst_l2, dst_r2, dst_l3,
                 dst_r3, dst0, dst1, dst2, dst3);
     ST_UB2(dst0, dst1, dst, 16);
@@ -929,8 +929,8 @@
     dst_r3 += in6;
     dst_l3 += in7;
 
-    CLIP_SH4_0_255(dst_r0, dst_l0, dst_r1, dst_l1);
-    CLIP_SH4_0_255(dst_r2, dst_l2, dst_r3, dst_l3);
+    CLIP_SH8_0_255(dst_r0, dst_l0, dst_r1, dst_l1,
+                   dst_r2, dst_l2, dst_r3, dst_l3);
     PCKEV_B4_UB(dst_l0, dst_r0, dst_l1, dst_r1, dst_l2, dst_r2, dst_l3,
                 dst_r3, dst0, dst1, dst2, dst3);
     ST_UB2(dst0, dst1, dst, 16);
diff --git a/libavcodec/mips/hevc_lpf_sao_msa.c b/libavcodec/mips/hevc_lpf_sao_msa.c
index 5b5537a..26663dd 100644
--- a/libavcodec/mips/hevc_lpf_sao_msa.c
+++ b/libavcodec/mips/hevc_lpf_sao_msa.c
@@ -140,19 +140,19 @@
             temp1 = ((p3_src + p2_src) << 1) + p2_src + temp0;
             temp1 = (v8u16) __msa_srari_h((v8i16) temp1, 3);
             temp2 = (v8i16) (temp1 - p2_src);
-            temp2 = CLIP_SH(temp2, tc_neg, tc_pos);
+            CLIP_SH(temp2, tc_neg, tc_pos);
             dst0 = (v16u8) (temp2 + (v8i16) p2_src);
 
             temp1 = temp0 + p2_src;
             temp1 = (v8u16) __msa_srari_h((v8i16) temp1, 2);
             temp2 = (v8i16) (temp1 - p1_src);
-            temp2 = CLIP_SH(temp2, tc_neg, tc_pos);
+            CLIP_SH(temp2, tc_neg, tc_pos);
             dst1 = (v16u8) (temp2 + (v8i16) p1_src);
 
             temp1 = (temp0 << 1) + p2_src + q1_src;
             temp1 = (v8u16) __msa_srari_h((v8i16) temp1, 3);
             temp2 = (v8i16) (temp1 - p0_src);
-            temp2 = CLIP_SH(temp2, tc_neg, tc_pos);
+            CLIP_SH(temp2, tc_neg, tc_pos);
             dst2 = (v16u8) (temp2 + (v8i16) p0_src);
 
             dst0 = __msa_bmz_v(dst0, (v16u8) p2_src, (v16u8) p_is_pcm_vec);
@@ -165,19 +165,19 @@
             temp1 = ((q3_src + q2_src) << 1) + q2_src + temp0;
             temp1 = (v8u16) __msa_srari_h((v8i16) temp1, 3);
             temp2 = (v8i16) (temp1 - q2_src);
-            temp2 = CLIP_SH(temp2, tc_neg, tc_pos);
+            CLIP_SH(temp2, tc_neg, tc_pos);
             dst5 = (v16u8) (temp2 + (v8i16) q2_src);
 
             temp1 = temp0 + q2_src;
             temp1 = (v8u16) __msa_srari_h((v8i16) temp1, 2);
             temp2 = (v8i16) (temp1 - q1_src);
-            temp2 = CLIP_SH(temp2, tc_neg, tc_pos);
+            CLIP_SH(temp2, tc_neg, tc_pos);
             dst4 = (v16u8) (temp2 + (v8i16) q1_src);
 
             temp1 = (temp0 << 1) + p1_src + q2_src;
             temp1 = (v8u16) __msa_srari_h((v8i16) temp1, 3);
             temp2 = (v8i16) (temp1 - q0_src);
-            temp2 = CLIP_SH(temp2, tc_neg, tc_pos);
+            CLIP_SH(temp2, tc_neg, tc_pos);
             dst3 = (v16u8) (temp2 + (v8i16) q0_src);
 
             dst3 = __msa_bmz_v(dst3, (v16u8) q0_src, (v16u8) q_is_pcm_vec);
@@ -199,11 +199,9 @@
             dst_val0 = __msa_copy_u_d((v2i64) dst2, 0);
             dst_val1 = __msa_copy_u_d((v2i64) dst2, 1);
 
-            ST8x4_UB(dst0, dst1, p2, stride);
-            p2 += (4 * stride);
-            SD(dst_val0, p2);
-            p2 += stride;
-            SD(dst_val1, p2);
+            ST_D4(dst0, dst1, 0, 1, 0, 1, p2, stride);
+            SD(dst_val0, p2 + 4 * stride);
+            SD(dst_val1, p2 + 5 * stride);
             /* strong filter ends */
         } else if (flag0 == flag1) { /* weak only */
             /* weak filter */
@@ -220,15 +218,15 @@
             abs_delta0 = __msa_add_a_h(delta0, (v8i16) zero);
             abs_delta0 = (v8u16) abs_delta0 < temp1;
 
-            delta0 = CLIP_SH(delta0, tc_neg, tc_pos);
+            CLIP_SH(delta0, tc_neg, tc_pos);
 
-            temp0 = (v8u16) (delta0 + p0_src);
-            temp0 = (v8u16) CLIP_SH_0_255(temp0);
-            temp0 = (v8u16) __msa_bmz_v((v16u8) temp0, (v16u8) p0_src,
+            temp2 = (v8i16) (delta0 + p0_src);
+            CLIP_SH_0_255(temp2);
+            temp0 = (v8u16) __msa_bmz_v((v16u8) temp2, (v16u8) p0_src,
                                         (v16u8) p_is_pcm_vec);
 
             temp2 = (v8i16) (q0_src - delta0);
-            temp2 = CLIP_SH_0_255(temp2);
+            CLIP_SH_0_255(temp2);
             temp2 = (v8i16) __msa_bmz_v((v16u8) temp2, (v16u8) q0_src,
                                         (v16u8) q_is_pcm_vec);
 
@@ -254,9 +252,9 @@
             delta1 -= (v8i16) p1_src;
             delta1 += delta0;
             delta1 >>= 1;
-            delta1 = CLIP_SH(delta1, tc_neg, tc_pos);
+            CLIP_SH(delta1, tc_neg, tc_pos);
             delta1 = (v8i16) p1_src + (v8i16) delta1;
-            delta1 = CLIP_SH_0_255(delta1);
+            CLIP_SH_0_255(delta1);
             delta1 = (v8i16) __msa_bmnz_v((v16u8) delta1, (v16u8) p1_src,
                                           (v16u8) p_is_pcm_vec);
 
@@ -264,9 +262,9 @@
             delta2 = delta2 - (v8i16) q1_src;
             delta2 = delta2 - delta0;
             delta2 = delta2 >> 1;
-            delta2 = CLIP_SH(delta2, tc_neg, tc_pos);
+            CLIP_SH(delta2, tc_neg, tc_pos);
             delta2 = (v8i16) q1_src + (v8i16) delta2;
-            delta2 = CLIP_SH_0_255(delta2);
+            CLIP_SH_0_255(delta2);
             delta2 = (v8i16) __msa_bmnz_v((v16u8) delta2, (v16u8) q1_src,
                                           (v16u8) q_is_pcm_vec);
 
@@ -288,7 +286,7 @@
             dst1 = __msa_bmz_v(dst1, dst3, (v16u8) cmp3);
 
             p2 += stride;
-            ST8x4_UB(dst0, dst1, p2, stride);
+            ST_D4(dst0, dst1, 0, 1, 0, 1, p2, stride);
             /* weak filter ends */
         } else { /* strong + weak */
             /* strong filter */
@@ -300,19 +298,19 @@
             temp1 = ((p3_src + p2_src) << 1) + p2_src + temp0;
             temp1 = (v8u16) __msa_srari_h((v8i16) temp1, 3);
             temp2 = (v8i16) (temp1 - p2_src);
-            temp2 = CLIP_SH(temp2, tc_neg, tc_pos);
+            CLIP_SH(temp2, tc_neg, tc_pos);
             dst0 = (v16u8) (temp2 + (v8i16) p2_src);
 
             temp1 = temp0 + p2_src;
             temp1 = (v8u16) __msa_srari_h((v8i16) temp1, 2);
             temp2 = (v8i16) (temp1 - p1_src);
-            temp2 = CLIP_SH(temp2, tc_neg, tc_pos);
+            CLIP_SH(temp2, tc_neg, tc_pos);
             dst1 = (v16u8) (temp2 + (v8i16) p1_src);
 
             temp1 = (temp0 << 1) + p2_src + q1_src;
             temp1 = (v8u16) __msa_srari_h((v8i16) temp1, 3);
             temp2 = (v8i16) (temp1 - p0_src);
-            temp2 = CLIP_SH(temp2, tc_neg, tc_pos);
+            CLIP_SH(temp2, tc_neg, tc_pos);
             dst2 = (v16u8) (temp2 + (v8i16) p0_src);
 
             dst0 = __msa_bmz_v(dst0, (v16u8) p2_src, (v16u8) p_is_pcm_vec);
@@ -325,19 +323,19 @@
             temp1 = ((q3_src + q2_src) << 1) + q2_src + temp0;
             temp1 = (v8u16) __msa_srari_h((v8i16) temp1, 3);
             temp2 = (v8i16) (temp1 - q2_src);
-            temp2 = CLIP_SH(temp2, tc_neg, tc_pos);
+            CLIP_SH(temp2, tc_neg, tc_pos);
             dst5 = (v16u8) (temp2 + (v8i16) q2_src);
 
             temp1 = temp0 + q2_src;
             temp1 = (v8u16) __msa_srari_h((v8i16) temp1, 2);
             temp2 = (v8i16) (temp1 - q1_src);
-            temp2 = CLIP_SH(temp2, tc_neg, tc_pos);
+            CLIP_SH(temp2, tc_neg, tc_pos);
             dst4 = (v16u8) (temp2 + (v8i16) q1_src);
 
             temp1 = (temp0 << 1) + p1_src + q2_src;
             temp1 = (v8u16) __msa_srari_h((v8i16) temp1, 3);
             temp2 = (v8i16) (temp1 - q0_src);
-            temp2 = CLIP_SH(temp2, tc_neg, tc_pos);
+            CLIP_SH(temp2, tc_neg, tc_pos);
             dst3 = (v16u8) (temp2 + (v8i16) q0_src);
 
             dst3 = __msa_bmz_v(dst3, (v16u8) q0_src, (v16u8) q_is_pcm_vec);
@@ -364,15 +362,15 @@
             abs_delta0 = __msa_add_a_h(delta0, (v8i16) zero);
             abs_delta0 = (v8u16) abs_delta0 < temp1;
 
-            delta0 = CLIP_SH(delta0, tc_neg, tc_pos);
+            CLIP_SH(delta0, tc_neg, tc_pos);
 
-            temp0 = (v8u16) (delta0 + p0_src);
-            temp0 = (v8u16) CLIP_SH_0_255(temp0);
-            temp0 = (v8u16) __msa_bmz_v((v16u8) temp0, (v16u8) p0_src,
+            temp2 = (v8i16) (delta0 + p0_src);
+            CLIP_SH_0_255(temp2);
+            temp0 = (v8u16) __msa_bmz_v((v16u8) temp2, (v16u8) p0_src,
                                         (v16u8) p_is_pcm_vec);
 
             temp2 = (v8i16) (q0_src - delta0);
-            temp2 = CLIP_SH_0_255(temp2);
+            CLIP_SH_0_255(temp2);
             temp2 = (v8i16) __msa_bmz_v((v16u8) temp2, (v16u8) q0_src,
                                         (v16u8) q_is_pcm_vec);
 
@@ -396,9 +394,9 @@
             delta1 -= (v8i16) p1_src;
             delta1 += delta0;
             delta1 >>= 1;
-            delta1 = CLIP_SH(delta1, tc_neg, tc_pos);
+            CLIP_SH(delta1, tc_neg, tc_pos);
             delta1 = (v8i16) p1_src + (v8i16) delta1;
-            delta1 = CLIP_SH_0_255(delta1);
+            CLIP_SH_0_255(delta1);
             delta1 = (v8i16) __msa_bmnz_v((v16u8) delta1, (v16u8) p1_src,
                                           (v16u8) p_is_pcm_vec);
 
@@ -406,9 +404,9 @@
             delta2 = delta2 - (v8i16) q1_src;
             delta2 = delta2 - delta0;
             delta2 = delta2 >> 1;
-            delta2 = CLIP_SH(delta2, tc_neg, tc_pos);
+            CLIP_SH(delta2, tc_neg, tc_pos);
             delta2 = (v8i16) q1_src + (v8i16) delta2;
-            delta2 = CLIP_SH_0_255(delta2);
+            CLIP_SH_0_255(delta2);
             delta2 = (v8i16) __msa_bmnz_v((v16u8) delta2, (v16u8) q1_src,
                                           (v16u8) q_is_pcm_vec);
 
@@ -442,11 +440,9 @@
             dst_val0 = __msa_copy_u_d((v2i64) dst2, 0);
             dst_val1 = __msa_copy_u_d((v2i64) dst2, 1);
 
-            ST8x4_UB(dst0, dst1, p2, stride);
-            p2 += (4 * stride);
-            SD(dst_val0, p2);
-            p2 += stride;
-            SD(dst_val1, p2);
+            ST_D4(dst0, dst1, 0, 1, 0, 1, p2, stride);
+            SD(dst_val0, p2 + 4 * stride);
+            SD(dst_val1, p2 + 5 * stride);
         }
     }
 }
@@ -565,19 +561,19 @@
             temp1 = ((p3_src + p2_src) << 1) + p2_src + temp0;
             temp1 = (v8u16) __msa_srari_h((v8i16) temp1, 3);
             temp2 = (v8i16) (temp1 - p2_src);
-            temp2 = CLIP_SH(temp2, tc_neg, tc_pos);
+            CLIP_SH(temp2, tc_neg, tc_pos);
             dst0 = (v16u8) (temp2 + (v8i16) p2_src);
 
             temp1 = temp0 + p2_src;
             temp1 = (v8u16) __msa_srari_h((v8i16) temp1, 2);
             temp2 = (v8i16) (temp1 - p1_src);
-            temp2 = CLIP_SH(temp2, tc_neg, tc_pos);
+            CLIP_SH(temp2, tc_neg, tc_pos);
             dst1 = (v16u8) (temp2 + (v8i16) p1_src);
 
             temp1 = (temp0 << 1) + p2_src + q1_src;
             temp1 = (v8u16) __msa_srari_h((v8i16) temp1, 3);
             temp2 = (v8i16) (temp1 - p0_src);
-            temp2 = CLIP_SH(temp2, tc_neg, tc_pos);
+            CLIP_SH(temp2, tc_neg, tc_pos);
             dst2 = (v16u8) (temp2 + (v8i16) p0_src);
 
             dst0 = __msa_bmz_v(dst0, (v16u8) p2_src, (v16u8) p_is_pcm_vec);
@@ -589,19 +585,19 @@
             temp1 = ((q3_src + q2_src) << 1) + q2_src + temp0;
             temp1 = (v8u16) __msa_srari_h((v8i16) temp1, 3);
             temp2 = (v8i16) (temp1 - q2_src);
-            temp2 = CLIP_SH(temp2, tc_neg, tc_pos);
+            CLIP_SH(temp2, tc_neg, tc_pos);
             dst5 = (v16u8) (temp2 + (v8i16) q2_src);
 
             temp1 = temp0 + q2_src;
             temp1 = (v8u16) __msa_srari_h((v8i16) temp1, 2);
             temp2 = (v8i16) (temp1 - q1_src);
-            temp2 = CLIP_SH(temp2, tc_neg, tc_pos);
+            CLIP_SH(temp2, tc_neg, tc_pos);
             dst4 = (v16u8) (temp2 + (v8i16) q1_src);
 
             temp1 = (temp0 << 1) + p1_src + q2_src;
             temp1 = (v8u16) __msa_srari_h((v8i16) temp1, 3);
             temp2 = (v8i16) (temp1 - q0_src);
-            temp2 = CLIP_SH(temp2, tc_neg, tc_pos);
+            CLIP_SH(temp2, tc_neg, tc_pos);
             dst3 = (v16u8) (temp2 + (v8i16) q0_src);
 
             dst3 = __msa_bmz_v(dst3, (v16u8) q0_src, (v16u8) q_is_pcm_vec);
@@ -624,14 +620,14 @@
             abs_delta0 = __msa_add_a_h(delta0, (v8i16) zero);
             abs_delta0 = (v8u16) abs_delta0 < temp1;
 
-            delta0 = CLIP_SH(delta0, tc_neg, tc_pos);
-            temp0 = (v8u16) (delta0 + p0_src);
-            temp0 = (v8u16) CLIP_SH_0_255(temp0);
-            temp0 = (v8u16) __msa_bmz_v((v16u8) temp0, (v16u8) p0_src,
+            CLIP_SH(delta0, tc_neg, tc_pos);
+            temp2 = (v8i16) (delta0 + p0_src);
+            CLIP_SH_0_255(temp2);
+            temp0 = (v8u16) __msa_bmz_v((v16u8) temp2, (v16u8) p0_src,
                                         (v16u8) p_is_pcm_vec);
 
             temp2 = (v8i16) (q0_src - delta0);
-            temp2 = CLIP_SH_0_255(temp2);
+            CLIP_SH_0_255(temp2);
             temp2 = (v8i16) __msa_bmz_v((v16u8) temp2, (v16u8) q0_src,
                                         (v16u8) q_is_pcm_vec);
 
@@ -653,9 +649,9 @@
             delta1 -= (v8i16) p1_src;
             delta1 += delta0;
             delta1 >>= 1;
-            delta1 = CLIP_SH(delta1, tc_neg, tc_pos);
+            CLIP_SH(delta1, tc_neg, tc_pos);
             delta1 = (v8i16) p1_src + (v8i16) delta1;
-            delta1 = CLIP_SH_0_255(delta1);
+            CLIP_SH_0_255(delta1);
             delta1 = (v8i16) __msa_bmnz_v((v16u8) delta1, (v16u8) p1_src,
                                           (v16u8) p_is_pcm_vec);
 
@@ -663,9 +659,9 @@
             delta2 = delta2 - (v8i16) q1_src;
             delta2 = delta2 - delta0;
             delta2 = delta2 >> 1;
-            delta2 = CLIP_SH(delta2, tc_neg, tc_pos);
+            CLIP_SH(delta2, tc_neg, tc_pos);
             delta2 = (v8i16) q1_src + (v8i16) delta2;
-            delta2 = CLIP_SH_0_255(delta2);
+            CLIP_SH_0_255(delta2);
             delta2 = (v8i16) __msa_bmnz_v((v16u8) delta2, (v16u8) q1_src,
                                           (v16u8) q_is_pcm_vec);
 
@@ -730,19 +726,19 @@
             temp1 = ((p3_src + p2_src) << 1) + p2_src + temp0;
             temp1 = (v8u16) __msa_srari_h((v8i16) temp1, 3);
             temp2 = (v8i16) (temp1 - p2_src);
-            temp2 = CLIP_SH(temp2, tc_neg, tc_pos);
+            CLIP_SH(temp2, tc_neg, tc_pos);
             dst0 = (v16u8) (temp2 + (v8i16) p2_src);
 
             temp1 = temp0 + p2_src;
             temp1 = (v8u16) __msa_srari_h((v8i16) temp1, 2);
             temp2 = (v8i16) (temp1 - p1_src);
-            temp2 = CLIP_SH(temp2, tc_neg, tc_pos);
+            CLIP_SH(temp2, tc_neg, tc_pos);
             dst1 = (v16u8) (temp2 + (v8i16) p1_src);
 
             temp1 = (temp0 << 1) + p2_src + q1_src;
             temp1 = (v8u16) __msa_srari_h((v8i16) temp1, 3);
             temp2 = (v8i16) (temp1 - p0_src);
-            temp2 = CLIP_SH(temp2, tc_neg, tc_pos);
+            CLIP_SH(temp2, tc_neg, tc_pos);
             dst2 = (v16u8) (temp2 + (v8i16) p0_src);
 
             dst0 = __msa_bmz_v(dst0, (v16u8) p2_src, (v16u8) p_is_pcm_vec);
@@ -754,19 +750,19 @@
             temp1 = ((q3_src + q2_src) << 1) + q2_src + temp0;
             temp1 = (v8u16) __msa_srari_h((v8i16) temp1, 3);
             temp2 = (v8i16) (temp1 - q2_src);
-            temp2 = CLIP_SH(temp2, tc_neg, tc_pos);
+            CLIP_SH(temp2, tc_neg, tc_pos);
             dst5 = (v16u8) (temp2 + (v8i16) q2_src);
 
             temp1 = temp0 + q2_src;
             temp1 = (v8u16) __msa_srari_h((v8i16) temp1, 2);
             temp2 = (v8i16) (temp1 - q1_src);
-            temp2 = CLIP_SH(temp2, tc_neg, tc_pos);
+            CLIP_SH(temp2, tc_neg, tc_pos);
             dst4 = (v16u8) (temp2 + (v8i16) q1_src);
 
             temp1 = (temp0 << 1) + p1_src + q2_src;
             temp1 = (v8u16) __msa_srari_h((v8i16) temp1, 3);
             temp2 = (v8i16) (temp1 - q0_src);
-            temp2 = CLIP_SH(temp2, tc_neg, tc_pos);
+            CLIP_SH(temp2, tc_neg, tc_pos);
             dst3 = (v16u8) (temp2 + (v8i16) q0_src);
 
             dst3 = __msa_bmz_v(dst3, (v16u8) q0_src, (v16u8) q_is_pcm_vec);
@@ -789,15 +785,15 @@
             abs_delta0 = __msa_add_a_h(delta0, (v8i16) zero);
             abs_delta0 = (v8u16) abs_delta0 < temp1;
 
-            delta0 = CLIP_SH(delta0, tc_neg, tc_pos);
+            CLIP_SH(delta0, tc_neg, tc_pos);
 
-            temp0 = (v8u16) (delta0 + p0_src);
-            temp0 = (v8u16) CLIP_SH_0_255(temp0);
-            temp0 = (v8u16) __msa_bmz_v((v16u8) temp0, (v16u8) p0_src,
+            temp2 = (v8i16) (delta0 + p0_src);
+            CLIP_SH_0_255(temp2);
+            temp0 = (v8u16) __msa_bmz_v((v16u8) temp2, (v16u8) p0_src,
                                         (v16u8) p_is_pcm_vec);
 
             temp2 = (v8i16) (q0_src - delta0);
-            temp2 = CLIP_SH_0_255(temp2);
+            CLIP_SH_0_255(temp2);
             temp2 = (v8i16) __msa_bmz_v((v16u8) temp2, (v16u8) q0_src,
                                         (v16u8) q_is_pcm_vec);
 
@@ -819,9 +815,9 @@
             delta1 -= (v8i16) p1_src;
             delta1 += delta0;
             delta1 >>= 1;
-            delta1 = CLIP_SH(delta1, tc_neg, tc_pos);
+            CLIP_SH(delta1, tc_neg, tc_pos);
             delta1 = (v8i16) p1_src + (v8i16) delta1;
-            delta1 = CLIP_SH_0_255(delta1);
+            CLIP_SH_0_255(delta1);
             delta1 = (v8i16) __msa_bmnz_v((v16u8) delta1, (v16u8) p1_src,
                                           (v16u8) p_is_pcm_vec);
 
@@ -829,9 +825,9 @@
             delta2 = delta2 - (v8i16) q1_src;
             delta2 = delta2 - delta0;
             delta2 = delta2 >> 1;
-            delta2 = CLIP_SH(delta2, tc_neg, tc_pos);
+            CLIP_SH(delta2, tc_neg, tc_pos);
             delta2 = (v8i16) q1_src + (v8i16) delta2;
-            delta2 = CLIP_SH_0_255(delta2);
+            CLIP_SH_0_255(delta2);
             delta2 = (v8i16) __msa_bmnz_v((v16u8) delta2, (v16u8) q1_src,
                                           (v16u8) q_is_pcm_vec);
             delta1 = (v8i16) __msa_bmz_v((v16u8) delta1, (v16u8) p1_src,
@@ -959,15 +955,15 @@
         temp0 <<= 2;
         temp0 += temp1;
         delta = __msa_srari_h((v8i16) temp0, 3);
-        delta = CLIP_SH(delta, tc_neg, tc_pos);
+        CLIP_SH(delta, tc_neg, tc_pos);
 
         temp0 = (v8i16) ((v8i16) p0 + delta);
-        temp0 = CLIP_SH_0_255(temp0);
+        CLIP_SH_0_255(temp0);
         temp0 = (v8i16) __msa_bmz_v((v16u8) temp0, (v16u8) p0,
                                     (v16u8) p_is_pcm_vec);
 
         temp1 = (v8i16) ((v8i16) q0 - delta);
-        temp1 = CLIP_SH_0_255(temp1);
+        CLIP_SH_0_255(temp1);
         temp1 = (v8i16) __msa_bmz_v((v16u8) temp1, (v16u8) q0,
                                     (v16u8) q_is_pcm_vec);
 
@@ -976,7 +972,7 @@
         temp1 = (v8i16) __msa_bmnz_v((v16u8) temp1, (v16u8) q0, (v16u8) tc_pos);
 
         temp0 = (v8i16) __msa_pckev_b((v16i8) temp1, (v16i8) temp0);
-        ST8x2_UB(temp0, p0_ptr, stride);
+        ST_D2(temp0, 0, 1, p0_ptr, stride);
     }
 }
 
@@ -1018,15 +1014,15 @@
         temp0 <<= 2;
         temp0 += temp1;
         delta = __msa_srari_h((v8i16) temp0, 3);
-        delta = CLIP_SH(delta, tc_neg, tc_pos);
+        CLIP_SH(delta, tc_neg, tc_pos);
 
         temp0 = (v8i16) ((v8i16) p0 + delta);
-        temp0 = CLIP_SH_0_255(temp0);
+        CLIP_SH_0_255(temp0);
         temp0 = (v8i16) __msa_bmz_v((v16u8) temp0, (v16u8) p0,
                                     (v16u8) p_is_pcm_vec);
 
         temp1 = (v8i16) ((v8i16) q0 - delta);
-        temp1 = CLIP_SH_0_255(temp1);
+        CLIP_SH_0_255(temp1);
         temp1 = (v8i16) __msa_bmz_v((v16u8) temp1, (v16u8) q0,
                                     (v16u8) q_is_pcm_vec);
 
@@ -1037,9 +1033,7 @@
         temp0 = (v8i16) __msa_ilvev_b((v16i8) temp1, (v16i8) temp0);
 
         src += 1;
-        ST2x4_UB(temp0, 0, src, stride);
-        src += (4 * stride);
-        ST2x4_UB(temp0, 4, src, stride);
+        ST_H8(temp0, 0, 1, 2, 3, 4, 5, 6, 7, src, stride);
     }
 }
 
@@ -1087,7 +1081,7 @@
         LD_UB4(src, src_stride, src0, src1, src2, src3);
 
         /* store results */
-        ST4x4_UB(dst0, dst0, 0, 1, 2, 3, dst, dst_stride);
+        ST_W4(dst0, 0, 1, 2, 3, dst, dst_stride);
         dst += (4 * dst_stride);
     }
 
@@ -1102,7 +1096,7 @@
     dst0 = (v16i8) __msa_xori_b((v16u8) dst0, 128);
 
     /* store results */
-    ST4x4_UB(dst0, dst0, 0, 1, 2, 3, dst, dst_stride);
+    ST_W4(dst0, 0, 1, 2, 3, dst, dst_stride);
 }
 
 static void hevc_sao_band_filter_8width_msa(uint8_t *dst, int32_t dst_stride,
@@ -1153,7 +1147,7 @@
         XORI_B2_128_SB(dst0, dst1);
 
         /* store results */
-        ST8x4_UB(dst0, dst1, dst, dst_stride);
+        ST_D4(dst0, dst1, 0, 1, 0, 1, dst, dst_stride);
         dst += dst_stride << 2;
     }
 
@@ -1173,7 +1167,7 @@
     XORI_B2_128_SB(dst0, dst1);
 
     /* store results */
-    ST8x4_UB(dst0, dst1, dst, dst_stride);
+    ST_D4(dst0, dst1, 0, 1, 0, 1, dst, dst_stride);
 }
 
 static void hevc_sao_band_filter_16multiple_msa(uint8_t *dst,
@@ -1363,6 +1357,7 @@
     v16u8 cmp_minus10, diff_minus10, diff_minus11;
     v16u8 src0, src1, dst0, src_minus10, src_minus11, src_plus10, src_plus11;
     v16i8 offset, sao_offset = LD_SB(sao_offset_val);
+    v16i8 zeros = { 0 };
 
     sao_offset = __msa_pckev_b(sao_offset, sao_offset);
     src -= 1;
@@ -1373,8 +1368,8 @@
     for (height -= 2; height; height -= 2) {
         src += (src_stride << 1);
 
-        SLDI_B2_0_UB(src_minus10, src_minus11, src0, src1, 1);
-        SLDI_B2_0_UB(src_minus10, src_minus11, src_plus10, src_plus11, 2);
+        SLDI_B2_UB(zeros, src_minus10, zeros, src_minus11, 1, src0, src1);
+        SLDI_B2_UB(zeros, src_minus10, zeros, src_minus11, 2, src_plus10, src_plus11);
 
         PCKEV_D2_UB(src_minus11, src_minus10, src_plus11, src_plus10,
                     src_minus10, src_plus10);
@@ -1410,8 +1405,8 @@
         dst += dst_stride;
     }
 
-    SLDI_B2_0_UB(src_minus10, src_minus11, src0, src1, 1);
-    SLDI_B2_0_UB(src_minus10, src_minus11, src_plus10, src_plus11, 2);
+    SLDI_B2_UB(zeros, src_minus10, zeros, src_minus11, 1, src0, src1);
+    SLDI_B2_UB(zeros, src_minus10, zeros, src_minus11, 2, src_plus10, src_plus11);
 
     PCKEV_D2_UB(src_minus11, src_minus10, src_plus11, src_plus10, src_minus10,
                 src_plus10);
@@ -1479,14 +1474,12 @@
             dst_ptr = dst + v_cnt;
             LD_UB4(src_minus1, src_stride, src10, src11, src12, src13);
 
-            SLDI_B2_SB(src10, src11, src_minus10, src_minus11, src_zero0,
-                       src_zero1, 1);
-            SLDI_B2_SB(src12, src13, src_minus12, src_minus13, src_zero2,
-                       src_zero3, 1);
-            SLDI_B2_SB(src10, src11, src_minus10, src_minus11, src_plus10,
-                       src_plus11, 2);
-            SLDI_B2_SB(src12, src13, src_minus12, src_minus13, src_plus12,
-                       src_plus13, 2);
+            SLDI_B4_SB(src10, src_minus10, src11, src_minus11,
+                       src12, src_minus12, src13, src_minus13, 1,
+                       src_zero0, src_zero1, src_zero2, src_zero3);
+            SLDI_B4_SB(src10, src_minus10, src11, src_minus11,
+                       src12, src_minus12, src13, src_minus13, 2,
+                       src_plus10, src_plus11, src_plus12, src_plus13);
 
             cmp_minus10 = ((v16u8) src_zero0 == src_minus10);
             cmp_plus10 = ((v16u8) src_zero0 == (v16u8) src_plus10);
@@ -1886,6 +1879,7 @@
     v16u8 src_minus11, src10, src11;
     v16i8 src_plus0, src_zero0, src_plus1, src_zero1, dst0;
     v8i16 offset_mask0, offset_mask1;
+    v16i8 zeros = { 0 };
 
     sao_offset = __msa_pckev_b(sao_offset, sao_offset);
 
@@ -1898,8 +1892,8 @@
     for (height -= 2; height; height -= 2) {
         src_orig += (src_stride << 1);
 
-        SLDI_B2_0_SB(src_minus11, src10, src_zero0, src_zero1, 1);
-        SLDI_B2_0_SB(src10, src11, src_plus0, src_plus1, 2);
+        SLDI_B2_SB(zeros, src_minus11, zeros, src10, 1, src_zero0, src_zero1);
+        SLDI_B2_SB(zeros, src10, zeros, src11, 2, src_plus0, src_plus1);
 
         ILVR_B2_UB(src_plus0, src_minus10, src_plus1, src_minus11, src_minus10,
                    src_minus11);
@@ -1944,8 +1938,8 @@
         dst += dst_stride;
     }
 
-    SLDI_B2_0_SB(src_minus11, src10, src_zero0, src_zero1, 1);
-    SLDI_B2_0_SB(src10, src11, src_plus0, src_plus1, 2);
+    SLDI_B2_SB(zeros, src_minus11, zeros, src10, 1, src_zero0, src_zero1);
+    SLDI_B2_SB(zeros, src10, zeros, src11, 2, src_plus0, src_plus1);
 
     ILVR_B2_UB(src_plus0, src_minus10, src_plus1, src_minus11, src_minus10,
                src_minus11);
@@ -1998,6 +1992,7 @@
     v16u8 src_minus10, src10, src_minus11, src11;
     v16i8 src_zero0, src_plus10, src_zero1, src_plus11, dst0;
     v8i16 offset_mask0, offset_mask1;
+    v16i8 zeros = { 0 };
 
     sao_offset = __msa_pckev_b(sao_offset, sao_offset);
     src_orig = src - 1;
@@ -2009,8 +2004,8 @@
     for (height -= 2; height; height -= 2) {
         src_orig += (src_stride << 1);
 
-        SLDI_B2_0_SB(src_minus11, src10, src_zero0, src_zero1, 1);
-        SLDI_B2_0_SB(src10, src11, src_plus10, src_plus11, 2);
+        SLDI_B2_SB(zeros, src_minus11, zeros, src10, 1, src_zero0, src_zero1);
+        SLDI_B2_SB(zeros, src10, zeros, src11, 2, src_plus10, src_plus11);
 
         ILVR_B2_UB(src_plus10, src_minus10, src_plus11, src_minus11,
                    src_minus10, src_minus11);
@@ -2054,8 +2049,8 @@
         dst += dst_stride;
     }
 
-    SLDI_B2_0_SB(src_minus11, src10, src_zero0, src_zero1, 1);
-    SLDI_B2_0_SB(src10, src11, src_plus10, src_plus11, 2);
+    SLDI_B2_SB(zeros, src_minus11, zeros, src10, 1, src_zero0, src_zero1);
+    SLDI_B2_SB(zeros, src10, zeros, src11, 2, src_plus10, src_plus11);
     ILVR_B2_UB(src_plus10, src_minus10, src_plus11, src_minus11, src_minus10,
                src_minus11);
     ILVR_B2_SB(src_zero0, src_zero0, src_zero1, src_zero1, src_zero0,
@@ -2136,12 +2131,11 @@
             src_plus13 = LD_UB(src + 1 + v_cnt + (src_stride << 2));
             src_orig += 16;
 
-            SLDI_B2_SB(src10, src11, src_minus11, src_minus12, src_zero0,
-                       src_zero1, 1);
-            SLDI_B2_SB(src12, src13, src_minus13, src_minus14, src_zero2,
-                       src_zero3, 1);
-            SLDI_B2_SB(src11, src12, src_minus12, src_minus13, src_plus10,
-                       src_plus11, 2);
+            SLDI_B4_SB(src10, src_minus11, src11, src_minus12,
+                       src12, src_minus13, src13, src_minus14, 1,
+                       src_zero0, src_zero1, src_zero2, src_zero3);
+            SLDI_B2_SB(src11, src_minus12, src12, src_minus13, 2, src_plus10,
+                       src_plus11);
 
             src_plus12 = __msa_sldi_b((v16i8) src13, (v16i8) src_minus14, 2);
 
@@ -2234,6 +2228,7 @@
     v16u8 cmp_minus10, diff_minus10, cmp_minus11, diff_minus11;
     v16u8 src_minus10, src10, src_minus11, src11;
     v8i16 offset_mask0, offset_mask1;
+    v16i8 zeros = { 0 };
 
     sao_offset = __msa_pckev_b(sao_offset, sao_offset);
     src_orig = src - 1;
@@ -2245,8 +2240,8 @@
     for (height -= 2; height; height -= 2) {
         src_orig += (src_stride << 1);
 
-        SLDI_B2_0_SB(src_minus11, src10, src_zero0, src_zero1, 1);
-        SLDI_B2_0_UB(src_minus10, src_minus11, src_minus10, src_minus11, 2);
+        SLDI_B2_SB(zeros, src_minus11, zeros, src10, 1, src_zero0, src_zero1);
+        SLDI_B2_UB(zeros, src_minus10, zeros, src_minus11, 2, src_minus10, src_minus11);
 
         ILVR_B2_UB(src10, src_minus10, src11, src_minus11, src_minus10,
                    src_minus11);
@@ -2292,8 +2287,8 @@
         dst += dst_stride;
     }
 
-    SLDI_B2_0_SB(src_minus11, src10, src_zero0, src_zero1, 1);
-    SLDI_B2_0_UB(src_minus10, src_minus11, src_minus10, src_minus11, 2);
+    SLDI_B2_SB(zeros, src_minus11, zeros, src10, 1, src_zero0, src_zero1);
+    SLDI_B2_UB(zeros, src_minus10, zeros, src_minus11, 2, src_minus10, src_minus11);
 
     ILVR_B2_UB(src10, src_minus10, src11, src_minus11, src_minus10,
                src_minus11);
@@ -2348,6 +2343,7 @@
     v16u8 src_minus10, src10, src_minus11, src11;
     v16i8 src_zero0, src_zero1, dst0;
     v8i16 offset_mask0, offset_mask1;
+    v16i8 zeros = { 0 };
 
     sao_offset = __msa_pckev_b(sao_offset, sao_offset);
     src_orig = src - 1;
@@ -2359,8 +2355,8 @@
     for (height -= 2; height; height -= 2) {
         src_orig += (src_stride << 1);
 
-        SLDI_B2_0_SB(src_minus11, src10, src_zero0, src_zero1, 1);
-        SLDI_B2_0_UB(src_minus10, src_minus11, src_minus10, src_minus11, 2);
+        SLDI_B2_SB(zeros, src_minus11, zeros, src10, 1, src_zero0, src_zero1);
+        SLDI_B2_UB(zeros, src_minus10, zeros, src_minus11, 2, src_minus10, src_minus11);
         ILVR_B2_UB(src10, src_minus10, src11, src_minus11, src_minus10,
                    src_minus11);
         ILVR_B2_SB(src_zero0, src_zero0, src_zero1, src_zero1, src_zero0,
@@ -2404,8 +2400,8 @@
         dst += dst_stride;
     }
 
-    SLDI_B2_0_SB(src_minus11, src10, src_zero0, src_zero1, 1);
-    SLDI_B2_0_UB(src_minus10, src_minus11, src_minus10, src_minus11, 2);
+    SLDI_B2_SB(zeros, src_minus11, zeros, src10, 1, src_zero0, src_zero1);
+    SLDI_B2_UB(zeros, src_minus10, zeros, src_minus11, 2, src_minus10, src_minus11);
     ILVR_B2_UB(src10, src_minus10, src11, src_minus11, src_minus10,
                src_minus11);
     ILVR_B2_SB(src_zero0, src_zero0, src_zero1, src_zero1, src_zero0,
@@ -2630,7 +2626,7 @@
                                    int16_t *sao_offset_val,
                                    int eo, int width, int height)
 {
-    ptrdiff_t stride_src = (2 * 64 + 32) / sizeof(uint8_t);
+    ptrdiff_t stride_src = (2 * MAX_PB_SIZE + AV_INPUT_BUFFER_PADDING_SIZE) / sizeof(uint8_t);
 
     switch (eo) {
     case 0:
diff --git a/libavcodec/mips/hevc_mc_bi_msa.c b/libavcodec/mips/hevc_mc_bi_msa.c
index b555517..c6c8d27 100644
--- a/libavcodec/mips/hevc_mc_bi_msa.c
+++ b/libavcodec/mips/hevc_mc_bi_msa.c
@@ -48,7 +48,7 @@
 {                                                                  \
     ADDS_SH2_SH(vec0, in0, vec1, in1, out0, out1);                 \
     SRARI_H2_SH(out0, out1, rnd_val);                              \
-    CLIP_SH2_0_255_MAX_SATU(out0, out1);                           \
+    CLIP_SH2_0_255(out0, out1);                                    \
 }
 
 #define HEVC_BI_RND_CLIP4_MAX_SATU(in0, in1, in2, in3, vec0, vec1, vec2,    \
@@ -83,10 +83,10 @@
         dst0 <<= 6;
         dst0 += in0;
         dst0 = __msa_srari_h(dst0, 7);
-        dst0 = CLIP_SH_0_255_MAX_SATU(dst0);
+        CLIP_SH_0_255(dst0);
 
         dst0 = (v8i16) __msa_pckev_b((v16i8) dst0, (v16i8) dst0);
-        ST4x2_UB(dst0, dst, dst_stride);
+        ST_W2(dst0, 0, 1, dst, dst_stride);
     } else if (4 == height) {
         LW4(src0_ptr, src_stride, tp0, tp1, tp2, tp3);
         INSERT_W4_SB(tp0, tp1, tp2, tp3, src0);
@@ -97,7 +97,7 @@
         SLLI_2V(dst0, dst1, 6);
         HEVC_BI_RND_CLIP2_MAX_SATU(in0, in1, dst0, dst1, 7, dst0, dst1);
         dst0 = (v8i16) __msa_pckev_b((v16i8) dst1, (v16i8) dst0);
-        ST4x4_UB(dst0, dst0, 0, 1, 2, 3, dst, dst_stride);
+        ST_W4(dst0, 0, 1, 2, 3, dst, dst_stride);
     } else if (0 == height % 8) {
         for (loop_cnt = (height >> 3); loop_cnt--;) {
             LW4(src0_ptr, src_stride, tp0, tp1, tp2, tp3);
@@ -120,7 +120,7 @@
             HEVC_BI_RND_CLIP4_MAX_SATU(in0, in1, in2, in3, dst0, dst1, dst2,
                                        dst3, 7, dst0, dst1, dst2, dst3);
             PCKEV_B2_SH(dst1, dst0, dst3, dst2, dst0, dst1);
-            ST4x8_UB(dst0, dst1, dst, dst_stride);
+            ST_W8(dst0, dst1, 0, 1, 2, 3, 0, 1, 2, 3, dst, dst_stride);
             dst += (8 * dst_stride);
         }
     }
@@ -165,9 +165,15 @@
                                    7, dst4, dst5, dst6, dst7);
         PCKEV_B2_UB(dst1, dst0, dst3, dst2, out0, out1);
         PCKEV_B2_UB(dst5, dst4, dst7, dst6, out2, out3);
-        ST6x4_UB(out0, out1, dst, dst_stride);
+        ST_W2(out0, 0, 2, dst, dst_stride);
+        ST_H2(out0, 2, 6, dst + 4, dst_stride);
+        ST_W2(out1, 0, 2, dst + 2 * dst_stride, dst_stride);
+        ST_H2(out1, 2, 6, dst + 2 * dst_stride + 4, dst_stride);
         dst += (4 * dst_stride);
-        ST6x4_UB(out2, out3, dst, dst_stride);
+        ST_W2(out2, 0, 2, dst, dst_stride);
+        ST_H2(out2, 2, 6, dst + 4, dst_stride);
+        ST_W2(out3, 0, 2, dst + 2 * dst_stride, dst_stride);
+        ST_H2(out3, 2, 6, dst + 2 * dst_stride + 4, dst_stride);
         dst += (4 * dst_stride);
     }
 }
@@ -195,7 +201,7 @@
         SLLI_2V(dst0, dst1, 6);
         HEVC_BI_RND_CLIP2_MAX_SATU(in0, in1, dst0, dst1, 7, dst0, dst1);
         out0 = (v16u8) __msa_pckev_b((v16i8) dst1, (v16i8) dst0);
-        ST8x2_UB(out0, dst, dst_stride);
+        ST_D2(out0, 0, 1, dst, dst_stride);
     } else if (4 == height) {
         LD4(src0_ptr, src_stride, tp0, tp1, tp2, tp3);
         INSERT_D2_SB(tp0, tp1, src0);
@@ -207,7 +213,7 @@
         HEVC_BI_RND_CLIP4_MAX_SATU(in0, in1, in2, in3, dst0, dst1, dst2, dst3,
                                    7, dst0, dst1, dst2, dst3);
         PCKEV_B2_UB(dst1, dst0, dst3, dst2, out0, out1);
-        ST8x4_UB(out0, out1, dst, dst_stride);
+        ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
     } else if (6 == height) {
         LD4(src0_ptr, src_stride, tp0, tp1, tp2, tp3);
         src0_ptr += 4 * src_stride;
@@ -225,9 +231,8 @@
                                    7, dst0, dst1, dst2, dst3);
         HEVC_BI_RND_CLIP2_MAX_SATU(in4, in5, dst4, dst5, 7, dst4, dst5);
         PCKEV_B3_UB(dst1, dst0, dst3, dst2, dst5, dst4, out0, out1, out2);
-        ST8x4_UB(out0, out1, dst, dst_stride);
-        dst += (4 * dst_stride);
-        ST8x2_UB(out2, dst, dst_stride);
+        ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
+        ST_D2(out2, 0, 1, dst + 4 * dst_stride, dst_stride);
     } else if (0 == height % 8) {
         uint32_t loop_cnt;
 
@@ -255,7 +260,7 @@
                                        dst7, 7, dst4, dst5, dst6, dst7);
             PCKEV_B2_UB(dst1, dst0, dst3, dst2, out0, out1);
             PCKEV_B2_UB(dst5, dst4, dst7, dst6, out2, out3);
-            ST8x8_UB(out0, out1, out2, out3, dst, dst_stride);
+            ST_D8(out0, out1, out2, out3, 0, 1, 0, 1, 0, 1, 0, 1, dst, dst_stride);
             dst += (8 * dst_stride);
         }
     }
@@ -294,7 +299,8 @@
                                    7, dst0, dst1, dst2, dst3);
         HEVC_BI_RND_CLIP2_MAX_SATU(in4, in5, dst4, dst5, 7, dst4, dst5);
         PCKEV_B3_UB(dst1, dst0, dst3, dst2, dst5, dst4, out0, out1, out2);
-        ST12x4_UB(out0, out1, out2, dst, dst_stride);
+        ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
+        ST_W4(out2, 0, 1, 2, 3, dst + 8, dst_stride);
         dst += (4 * dst_stride);
     }
 }
@@ -378,7 +384,7 @@
         PCKEV_B3_UB(dst1, dst0, dst3, dst2, dst5, dst4, out0, out1, out2);
         PCKEV_B3_UB(dst7, dst6, dst9, dst8, dst11, dst10, out3, out4, out5);
         ST_UB4(out0, out1, out3, out4, dst, dst_stride);
-        ST8x4_UB(out2, out5, dst + 16, dst_stride);
+        ST_D4(out2, out5, 0, 1, 0, 1, dst + 16, dst_stride);
         dst += (4 * dst_stride);
     }
 }
@@ -588,7 +594,7 @@
                           dst0, dst1, dst2, dst3, 7, dst0, dst1, dst2, dst3);
 
         PCKEV_B2_SH(dst1, dst0, dst3, dst2, dst0, dst1);
-        ST4x8_UB(dst0, dst1, dst, dst_stride);
+        ST_W8(dst0, dst1, 0, 1, 2, 3, 0, 1, 2, 3, dst, dst_stride);
         dst += (8 * dst_stride);
     }
 }
@@ -656,7 +662,7 @@
                           dst0, dst1, dst2, dst3, 7, dst0, dst1, dst2, dst3);
 
         PCKEV_B2_SH(dst1, dst0, dst3, dst2, dst0, dst1);
-        ST8x4_UB(dst0, dst1, dst, dst_stride);
+        ST_D4(dst0, dst1, 0, 1, 0, 1, dst, dst_stride);
         dst += (4 * dst_stride);
     }
 }
@@ -733,7 +739,7 @@
         HEVC_BI_RND_CLIP2(in0, in1, dst0, dst1, 7, dst0, dst1);
         dst2 = __msa_adds_s_h(in2, dst2);
         dst2 = __msa_srari_h(dst2, 7);
-        dst2 = CLIP_SH_0_255(dst2);
+        CLIP_SH_0_255(dst2);
         PCKEV_B2_SH(dst1, dst0, dst2, dst2, dst0, dst1);
 
         tmp2 = __msa_copy_s_d((v2i64) dst0, 0);
@@ -882,7 +888,7 @@
         HEVC_BI_RND_CLIP2(in0, in1, dst0, dst1, 7, dst0, dst1);
         dst2 = __msa_adds_s_h(dst2, in2);
         dst2 = __msa_srari_h(dst2, 7);
-        dst2 = CLIP_SH_0_255(dst2);
+        CLIP_SH_0_255(dst2);
 
         PCKEV_B2_SB(dst1, dst0, dst2, dst2, tmp0, tmp1);
         dst_val0 = __msa_copy_u_d((v2i64) tmp1, 0);
@@ -1242,7 +1248,7 @@
                           dst10, dst32, dst54, dst76);
 
         PCKEV_B2_SH(dst32, dst10, dst76, dst54, dst10, dst54);
-        ST4x8_UB(dst10, dst54, dst, dst_stride);
+        ST_W8(dst10, dst54, 0, 1, 2, 3, 0, 1, 2, 3, dst, dst_stride);
         dst += (8 * dst_stride);
 
         src2110 = src10998;
@@ -1316,7 +1322,7 @@
                           dst0_r, dst1_r, dst2_r, dst3_r);
 
         PCKEV_B2_SH(dst1_r, dst0_r, dst3_r, dst2_r, dst0_r, dst1_r);
-        ST8x4_UB(dst0_r, dst1_r, dst, dst_stride);
+        ST_D4(dst0_r, dst1_r, 0, 1, 0, 1, dst, dst_stride);
         dst += (4 * dst_stride);
 
         src10_r = src54_r;
@@ -1420,7 +1426,8 @@
 
         PCKEV_B2_SH(dst1_r, dst0_r, dst3_r, dst2_r, dst0_r, dst1_r);
         dst0_l = (v8i16) __msa_pckev_b((v16i8) dst1_l, (v16i8) dst0_l);
-        ST12x4_UB(dst0_r, dst1_r, dst0_l, dst, dst_stride);
+        ST_D4(dst0_r, dst1_r, 0, 1, 0, 1, dst, dst_stride);
+        ST_W4(dst0_l, 0, 1, 2, 3, dst + 8, dst_stride);
         dst += (4 * dst_stride);
 
         src10_r = src54_r;
@@ -1719,9 +1726,9 @@
         ADDS_SH2_SH(out0, in0, out1, in1, out0, out1);
         ADDS_SH2_SH(out0, const_vec, out1, const_vec, out0, out1);
         SRARI_H2_SH(out0, out1, 7);
-        CLIP_SH2_0_255_MAX_SATU(out0, out1);
+        CLIP_SH2_0_255(out0, out1);
         out = (v16u8) __msa_pckev_b((v16i8) out1, (v16i8) out0);
-        ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
+        ST_W4(out, 0, 1, 2, 3, dst, dst_stride);
         dst += (4 * dst_stride);
 
         dst10 = dst54;
@@ -1847,9 +1854,9 @@
             tmp = __msa_pckev_h((v8i16) dst0_l, (v8i16) dst0_r);
             ADDS_SH2_SH(tmp, in0, tmp, const_vec, tmp, tmp);
             tmp = __msa_srari_h(tmp, 7);
-            tmp = CLIP_SH_0_255_MAX_SATU(tmp);
+            CLIP_SH_0_255(tmp);
             out = (v16u8) __msa_pckev_b((v16i8) tmp, (v16i8) tmp);
-            ST8x1_UB(out, dst_tmp);
+            ST_D1(out, 0, dst_tmp);
             dst_tmp += dst_stride;
 
             dst0 = dst1;
@@ -1993,9 +2000,9 @@
         tmp = __msa_pckev_h((v8i16) dst0_l, (v8i16) dst0_r);
         ADDS_SH2_SH(tmp, in0, tmp, const_vec, tmp, tmp);
         tmp = __msa_srari_h(tmp, 7);
-        tmp = CLIP_SH_0_255_MAX_SATU(tmp);
+        CLIP_SH_0_255(tmp);
         out = (v16u8) __msa_pckev_b((v16i8) tmp, (v16i8) tmp);
-        ST8x1_UB(out, dst_tmp);
+        ST_D1(out, 0, dst_tmp);
         dst_tmp += dst_stride;
 
         dst0 = dst1;
@@ -2081,9 +2088,9 @@
         ADDS_SH2_SH(out0, in0, out1, in1, out0, out1);
         ADDS_SH2_SH(out0, const_vec, out1, const_vec, out0, out1);
         SRARI_H2_SH(out0, out1, 7);
-        CLIP_SH2_0_255_MAX_SATU(out0, out1);
+        CLIP_SH2_0_255(out0, out1);
         out = (v16u8) __msa_pckev_b((v16i8) out1, (v16i8) out0);
-        ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
+        ST_W4(out, 0, 1, 2, 3, dst, dst_stride);
         dst += (4 * dst_stride);
 
         dst10 = dst54;
@@ -2208,10 +2215,10 @@
 
     tmp0 = __msa_adds_s_h(tmp0, in0);
     tmp0 = __msa_srari_h(tmp0, 7);
-    tmp0 = CLIP_SH_0_255(tmp0);
+    CLIP_SH_0_255(tmp0);
     dst0 = __msa_pckev_b((v16i8) tmp0, (v16i8) tmp0);
 
-    ST4x2_UB(dst0, dst, dst_stride);
+    ST_W2(dst0, 0, 1, dst, dst_stride);
 }
 
 static void hevc_hz_bi_4t_4x4_msa(uint8_t *src0_ptr,
@@ -2257,7 +2264,7 @@
     HEVC_BI_RND_CLIP2(in0, in1, tmp0, tmp1, 7, tmp0, tmp1);
     dst0 = __msa_pckev_b((v16i8) tmp1, (v16i8) tmp0);
 
-    ST4x4_UB(dst0, dst0, 0, 1, 2, 3, dst, dst_stride);
+    ST_W4(dst0, 0, 1, 2, 3, dst, dst_stride);
 }
 
 static void hevc_hz_bi_4t_4x8multiple_msa(uint8_t *src0_ptr,
@@ -2318,7 +2325,7 @@
                           tmp0, tmp1, tmp2, tmp3, 7, tmp0, tmp1, tmp2, tmp3);
 
         PCKEV_B2_SB(tmp1, tmp0, tmp3, tmp2, dst0, dst1);
-        ST4x8_UB(dst0, dst1, dst, dst_stride);
+        ST_W8(dst0, dst1, 0, 1, 2, 3, 0, 1, 2, 3, dst, dst_stride);
         dst += (8 * dst_stride);
     }
 }
@@ -2398,7 +2405,10 @@
                           dst0, dst1, dst2, dst3, 7, dst0, dst1, dst2, dst3);
 
         PCKEV_B2_SH(dst1, dst0, dst3, dst2, dst0, dst1);
-        ST6x4_UB(dst0, dst1, dst, dst_stride);
+        ST_W2(dst0, 0, 2, dst, dst_stride);
+        ST_H2(dst0, 2, 6, dst + 4, dst_stride);
+        ST_W2(dst1, 0, 2, dst + 2 * dst_stride, dst_stride);
+        ST_H2(dst1, 2, 6, dst + 2 * dst_stride + 4, dst_stride);
         dst += (4 * dst_stride);
     }
 }
@@ -2443,7 +2453,7 @@
     HEVC_BI_RND_CLIP2(in0, in1, dst0, dst1, 7, dst0, dst1);
 
     dst0 = (v8i16) __msa_pckev_b((v16i8) dst1, (v16i8) dst0);
-    ST8x2_UB(dst0, dst, dst_stride);
+    ST_D2(dst0, 0, 1, dst, dst_stride);
 }
 
 static void hevc_hz_bi_4t_8x6_msa(uint8_t *src0_ptr,
@@ -2506,9 +2516,8 @@
 
     PCKEV_B2_SH(dst1, dst0, dst3, dst2, dst0, dst1);
     dst2 = (v8i16) __msa_pckev_b((v16i8) dst5, (v16i8) dst4);
-    ST8x4_UB(dst0, dst1, dst, dst_stride);
-    dst += (4 * dst_stride);
-    ST8x2_UB(dst2, dst, dst_stride);
+    ST_D4(dst0, dst1, 0, 1, 0, 1, dst, dst_stride);
+    ST_D2(dst2, 0, 1, dst + 4 * dst_stride, dst_stride);
 }
 
 static void hevc_hz_bi_4t_8x4multiple_msa(uint8_t *src0_ptr,
@@ -2564,7 +2573,7 @@
                           dst0, dst1, dst2, dst3, 7, dst0, dst1, dst2, dst3);
 
         PCKEV_B2_SH(dst1, dst0, dst3, dst2, dst0, dst1);
-        ST8x4_UB(dst0, dst1, dst, dst_stride);
+        ST_D4(dst0, dst1, 0, 1, 0, 1, dst, dst_stride);
         dst += (4 * dst_stride);
     }
 }
@@ -2659,7 +2668,8 @@
 
         PCKEV_B2_SH(dst1, dst0, dst3, dst2, dst0, dst1);
         dst2 = (v8i16) __msa_pckev_b((v16i8) dst5, (v16i8) dst4);
-        ST12x4_UB(dst0, dst1, dst2, dst, dst_stride);
+        ST_D4(dst0, dst1, 0, 1, 0, 1, dst, dst_stride);
+        ST_W4(dst2, 0, 1, 2, 3, dst + 8, dst_stride);
         dst += (4 * dst_stride);
     }
 }
@@ -2825,7 +2835,7 @@
                           dst0, dst1, dst2, dst3, 7, dst0, dst1, dst2, dst3);
 
         PCKEV_B2_SH(dst1, dst0, dst3, dst2, dst0, dst1);
-        ST8x4_UB(dst0, dst1, dst_tmp, dst_stride);
+        ST_D4(dst0, dst1, 0, 1, 0, 1, dst_tmp, dst_stride);
         dst_tmp += (4 * dst_stride);
     }
 }
@@ -2933,10 +2943,10 @@
     DPADD_SB2_SH(src2110, src4332, filt0, filt1, dst10, dst10);
     dst10 = __msa_adds_s_h(dst10, in0);
     dst10 = __msa_srari_h(dst10, 7);
-    dst10 = CLIP_SH_0_255(dst10);
+    CLIP_SH_0_255(dst10);
 
     dst10 = (v8i16) __msa_pckev_b((v16i8) dst10, (v16i8) dst10);
-    ST4x2_UB(dst10, dst, dst_stride);
+    ST_W2(dst10, 0, 1, dst, dst_stride);
 }
 
 static void hevc_vt_bi_4t_4x4_msa(uint8_t *src0_ptr,
@@ -2985,7 +2995,7 @@
     HEVC_BI_RND_CLIP2(in0, in1, dst10, dst32, 7, dst10, dst32);
 
     dst10 = (v8i16) __msa_pckev_b((v16i8) dst32, (v16i8) dst10);
-    ST4x4_UB(dst10, dst10, 0, 1, 2, 3, dst, dst_stride);
+    ST_W4(dst10, 0, 1, 2, 3, dst, dst_stride);
 }
 
 static void hevc_vt_bi_4t_4x8multiple_msa(uint8_t *src0_ptr,
@@ -3056,7 +3066,7 @@
                           dst10, dst32, dst54, dst76);
 
         PCKEV_B2_SH(dst32, dst10, dst76, dst54, dst10, dst54);
-        ST4x8_UB(dst10, dst54, dst, dst_stride);
+        ST_W8(dst10, dst54, 0, 1, 2, 3, 0, 1, 2, 3, dst, dst_stride);
         dst += (8 * dst_stride);
     }
 }
@@ -3147,7 +3157,10 @@
                       dst0_r, dst1_r, dst2_r, dst3_r);
 
     PCKEV_B2_SH(dst1_r, dst0_r, dst3_r, dst2_r, dst0_r, dst1_r);
-    ST6x4_UB(dst0_r, dst1_r, dst, dst_stride);
+    ST_W2(dst0_r, 0, 2, dst, dst_stride);
+    ST_H2(dst0_r, 2, 6, dst + 4, dst_stride);
+    ST_W2(dst1_r, 0, 2, dst + 2 * dst_stride, dst_stride);
+    ST_H2(dst1_r, 2, 6, dst + 2 * dst_stride + 4, dst_stride);
     dst += (4 * dst_stride);
 
     LD_SH4(src1_ptr, src2_stride, in0, in1, in2, in3);
@@ -3171,7 +3184,10 @@
                       dst0_r, dst1_r, dst2_r, dst3_r);
 
     PCKEV_B2_SH(dst1_r, dst0_r, dst3_r, dst2_r, dst0_r, dst1_r);
-    ST6x4_UB(dst0_r, dst1_r, dst, dst_stride);
+    ST_W2(dst0_r, 0, 2, dst, dst_stride);
+    ST_H2(dst0_r, 2, 6, dst + 4, dst_stride);
+    ST_W2(dst1_r, 0, 2, dst + 2 * dst_stride, dst_stride);
+    ST_H2(dst1_r, 2, 6, dst + 2 * dst_stride + 4, dst_stride);
     dst += (4 * dst_stride);
 }
 
@@ -3216,7 +3232,7 @@
     HEVC_BI_RND_CLIP2(in0, in1, dst0_r, dst1_r, 7, dst0_r, dst1_r);
     dst0_r = (v8i16) __msa_pckev_b((v16i8) dst1_r, (v16i8) dst0_r);
 
-    ST8x2_UB(dst0_r, dst, dst_stride);
+    ST_D2(dst0_r, 0, 1, dst, dst_stride);
 }
 
 static void hevc_vt_bi_4t_8x6_msa(uint8_t *src0_ptr,
@@ -3275,9 +3291,8 @@
 
     PCKEV_B2_SH(dst1_r, dst0_r, dst3_r, dst2_r, dst0_r, dst1_r);
     dst2_r = (v8i16) __msa_pckev_b((v16i8) dst5_r, (v16i8) dst4_r);
-    ST8x4_UB(dst0_r, dst1_r, dst, dst_stride);
-    dst += (4 * dst_stride);
-    ST8x2_UB(dst2_r, dst, dst_stride);
+    ST_D4(dst0_r, dst1_r, 0, 1, 0, 1, dst, dst_stride);
+    ST_D2(dst2_r, 0, 1, dst + 4 * dst_stride, dst_stride);
 }
 
 static void hevc_vt_bi_4t_8x4multiple_msa(uint8_t *src0_ptr,
@@ -3337,7 +3352,7 @@
                           dst0_r, dst1_r, dst2_r, dst3_r);
 
         PCKEV_B2_SH(dst1_r, dst0_r, dst3_r, dst2_r, dst0_r, dst1_r);
-        ST8x4_UB(dst0_r, dst1_r, dst, dst_stride);
+        ST_D4(dst0_r, dst1_r, 0, 1, 0, 1, dst, dst_stride);
         dst += (4 * dst_stride);
     }
 }
@@ -3436,7 +3451,8 @@
 
         PCKEV_B2_SH(dst1_r, dst0_r, dst3_r, dst2_r, dst0_r, dst1_r);
         dst0_l = (v8i16) __msa_pckev_b((v16i8) dst1_l, (v16i8) dst0_l);
-        ST12x4_UB(dst0_r, dst1_r, dst0_l, dst, dst_stride);
+        ST_D4(dst0_r, dst1_r, 0, 1, 0, 1, dst, dst_stride);
+        ST_W4(dst0_l, 0, 1, 2, 3, dst + 8, dst_stride);
         dst += (4 * dst_stride);
 
         src2 = src6;
@@ -3610,7 +3626,7 @@
         PCKEV_B2_SH(dst0_l, dst0_r, dst1_l, dst1_r, dst0_r, dst1_r);
         dst2_r = (v8i16) __msa_pckev_b((v16i8) dst3_r, (v16i8) dst2_r);
         ST_SH2(dst0_r, dst1_r, dst, dst_stride);
-        ST8x2_UB(dst2_r, dst + 16, dst_stride);
+        ST_D2(dst2_r, 0, 1, dst + 16, dst_stride);
         dst += (2 * dst_stride);
 
         /* 16width */
@@ -3650,7 +3666,7 @@
         PCKEV_B2_SH(dst0_l, dst0_r, dst1_l, dst1_r, dst0_r, dst1_r);
         dst2_r = (v8i16) __msa_pckev_b((v16i8) dst3_r, (v16i8) dst2_r);
         ST_SH2(dst0_r, dst1_r, dst, dst_stride);
-        ST8x2_UB(dst2_r, dst + 16, dst_stride);
+        ST_D2(dst2_r, 0, 1, dst + 16, dst_stride);
         dst += (2 * dst_stride);
     }
 }
@@ -3827,9 +3843,9 @@
     tmp = __msa_pckev_h((v8i16) dst1, (v8i16) dst0);
     tmp = __msa_adds_s_h(tmp, in0);
     tmp = __msa_srari_h(tmp, 7);
-    tmp = CLIP_SH_0_255_MAX_SATU(tmp);
+    CLIP_SH_0_255(tmp);
     out = (v16u8) __msa_pckev_b((v16i8) tmp, (v16i8) tmp);
-    ST4x2_UB(out, dst, dst_stride);
+    ST_W2(out, 0, 1, dst, dst_stride);
 }
 
 static void hevc_hv_bi_4t_4x4_msa(uint8_t *src0_ptr,
@@ -3903,9 +3919,9 @@
     PCKEV_H2_SH(dst1, dst0, dst3, dst2, tmp0, tmp1);
     ADDS_SH2_SH(tmp0, in0, tmp1, in1, tmp0, tmp1);
     SRARI_H2_SH(tmp0, tmp1, 7);
-    CLIP_SH2_0_255_MAX_SATU(tmp0, tmp1);
+    CLIP_SH2_0_255(tmp0, tmp1);
     out = (v16u8) __msa_pckev_b((v16i8) tmp1, (v16i8) tmp0);
-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
+    ST_W4(out, 0, 1, 2, 3, dst, dst_stride);
 }
 
 static void hevc_hv_bi_4t_4multx8mult_msa(uint8_t *src0_ptr,
@@ -4016,9 +4032,9 @@
         ADDS_SH4_SH(in0, tmp0, in1, tmp1, in2, tmp2, in3, tmp3, tmp0, tmp1,
                     tmp2, tmp3);
         SRARI_H4_SH(tmp0, tmp1, tmp2, tmp3, 7);
-        CLIP_SH4_0_255_MAX_SATU(tmp0, tmp1, tmp2, tmp3);
+        CLIP_SH4_0_255(tmp0, tmp1, tmp2, tmp3);
         PCKEV_B2_UB(tmp1, tmp0, tmp3, tmp2, out0, out1);
-        ST4x8_UB(out0, out1, dst, dst_stride);
+        ST_W8(out0, out1, 0, 1, 2, 3, 0, 1, 2, 3, dst, dst_stride);
         dst += (8 * dst_stride);
 
         dst10_r = dst98_r;
@@ -4184,9 +4200,9 @@
     ADDS_SH4_SH(in0, tmp0, in1, tmp1, in2, tmp2, in3, tmp3, tmp0, tmp1, tmp2,
                 tmp3);
     SRARI_H4_SH(tmp0, tmp1, tmp2, tmp3, 7);
-    CLIP_SH4_0_255_MAX_SATU(tmp0, tmp1, tmp2, tmp3);
+    CLIP_SH4_0_255(tmp0, tmp1, tmp2, tmp3);
     PCKEV_B2_UB(tmp1, tmp0, tmp3, tmp2, out0, out1);
-    ST4x8_UB(out0, out1, dst, dst_stride);
+    ST_W8(out0, out1, 0, 1, 2, 3, 0, 1, 2, 3, dst, dst_stride);
 
     LW4(src1_ptr + 4, src2_stride, tpw0, tpw1, tpw2, tpw3);
     src1_ptr += (4 * src2_stride);
@@ -4196,11 +4212,9 @@
     ADDS_SH2_SH(in4, const_vec, in5, const_vec, in4, in5);
     ADDS_SH2_SH(in4, tmp4, in5, tmp5, tmp4, tmp5);
     SRARI_H2_SH(tmp4, tmp5, 7);
-    CLIP_SH2_0_255_MAX_SATU(tmp4, tmp5);
+    CLIP_SH2_0_255(tmp4, tmp5);
     out2 = (v16u8) __msa_pckev_b((v16i8) tmp5, (v16i8) tmp4);
-    ST2x4_UB(out2, 0, dst + 4, dst_stride);
-    dst += 4 * dst_stride;
-    ST2x4_UB(out2, 4, dst + 4, dst_stride);
+    ST_H8(out2, 0, 1, 2, 3, 4, 5, 6, 7, dst + 4, dst_stride);
 }
 
 static void hevc_hv_bi_4t_8x2_msa(uint8_t *src0_ptr,
@@ -4272,9 +4286,9 @@
     PCKEV_H2_SH(dst0_l, dst0_r, dst1_l, dst1_r, tmp0, tmp1);
     ADDS_SH2_SH(in0, tmp0, in1, tmp1, tmp0, tmp1);
     SRARI_H2_SH(tmp0, tmp1, 7);
-    CLIP_SH2_0_255_MAX_SATU(tmp0, tmp1);
+    CLIP_SH2_0_255(tmp0, tmp1);
     out = (v16u8) __msa_pckev_b((v16i8) tmp1, (v16i8) tmp0);
-    ST8x2_UB(out, dst, dst_stride);
+    ST_D2(out, 0, 1, dst, dst_stride);
 }
 
 static void hevc_hv_bi_4t_8multx4_msa(uint8_t *src0_ptr,
@@ -4366,9 +4380,9 @@
         ADDS_SH4_SH(in0, tmp0, in1, tmp1, in2, tmp2, in3, tmp3,
                     tmp0, tmp1, tmp2, tmp3);
         SRARI_H4_SH(tmp0, tmp1, tmp2, tmp3, 7);
-        CLIP_SH4_0_255_MAX_SATU(tmp0, tmp1, tmp2, tmp3);
+        CLIP_SH4_0_255(tmp0, tmp1, tmp2, tmp3);
         PCKEV_B2_UB(tmp1, tmp0, tmp3, tmp2, out0, out1);
-        ST8x4_UB(out0, out1, dst, dst_stride);
+        ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
         dst += 8;
     }
 }
@@ -4481,13 +4495,12 @@
     ADDS_SH2_SH(in4, tmp4, in5, tmp5, tmp4, tmp5);
     SRARI_H4_SH(tmp0, tmp1, tmp2, tmp3, 7);
     SRARI_H2_SH(tmp4, tmp5, 7);
-    CLIP_SH4_0_255_MAX_SATU(tmp0, tmp1, tmp2, tmp3);
-    CLIP_SH2_0_255_MAX_SATU(tmp4, tmp5);
+    CLIP_SH4_0_255(tmp0, tmp1, tmp2, tmp3);
+    CLIP_SH2_0_255(tmp4, tmp5);
     PCKEV_B2_UB(tmp1, tmp0, tmp3, tmp2, out0, out1);
     out2 = (v16u8) __msa_pckev_b((v16i8) tmp5, (v16i8) tmp4);
-    ST8x4_UB(out0, out1, dst, dst_stride);
-    dst += (4 * dst_stride);
-    ST8x2_UB(out2, dst, dst_stride);
+    ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
+    ST_D2(out2, 0, 1, dst + 4 * dst_stride, dst_stride);
 }
 
 static void hevc_hv_bi_4t_8multx4mult_msa(uint8_t *src0_ptr,
@@ -4597,9 +4610,9 @@
             ADDS_SH4_SH(in0, tmp0, in1, tmp1, in2, tmp2, in3, tmp3,
                         tmp0, tmp1, tmp2, tmp3);
             SRARI_H4_SH(tmp0, tmp1, tmp2, tmp3, 7);
-            CLIP_SH4_0_255_MAX_SATU(tmp0, tmp1, tmp2, tmp3);
+            CLIP_SH4_0_255(tmp0, tmp1, tmp2, tmp3);
             PCKEV_B2_UB(tmp1, tmp0, tmp3, tmp2, out0, out1);
-            ST8x4_UB(out0, out1, dst_tmp, dst_stride);
+            ST_D4(out0, out1, 0, 1, 0, 1, dst_tmp, dst_stride);
             dst_tmp += (4 * dst_stride);
 
             dst10_r = dst54_r;
@@ -4747,9 +4760,9 @@
         ADDS_SH4_SH(in0, tmp0, in1, tmp1, in2, tmp2, in3, tmp3,
                     tmp0, tmp1, tmp2, tmp3);
         SRARI_H4_SH(tmp0, tmp1, tmp2, tmp3, 7);
-        CLIP_SH4_0_255_MAX_SATU(tmp0, tmp1, tmp2, tmp3);
+        CLIP_SH4_0_255(tmp0, tmp1, tmp2, tmp3);
         PCKEV_B2_UB(tmp1, tmp0, tmp3, tmp2, out0, out1);
-        ST8x4_UB(out0, out1, dst_tmp, dst_stride);
+        ST_D4(out0, out1, 0, 1, 0, 1, dst_tmp, dst_stride);
         dst_tmp += (4 * dst_stride);
 
         dst10_r = dst54_r;
@@ -4833,9 +4846,9 @@
         ADDS_SH4_SH(in0, tmp0, in1, tmp1, in2, tmp2, in3, tmp3,
                     tmp0, tmp1, tmp2, tmp3);
         SRARI_H4_SH(tmp0, tmp1, tmp2, tmp3, 7);
-        CLIP_SH4_0_255_MAX_SATU(tmp0, tmp1, tmp2, tmp3);
+        CLIP_SH4_0_255(tmp0, tmp1, tmp2, tmp3);
         PCKEV_B2_UB(tmp1, tmp0, tmp3, tmp2, out0, out1);
-        ST4x8_UB(out0, out1, dst, dst_stride);
+        ST_W8(out0, out1, 0, 1, 2, 3, 0, 1, 2, 3, dst, dst_stride);
         dst += (8 * dst_stride);
 
         dst10_r = dst98_r;
diff --git a/libavcodec/mips/hevc_mc_biw_msa.c b/libavcodec/mips/hevc_mc_biw_msa.c
index ea65f00..f775ea8 100644
--- a/libavcodec/mips/hevc_mc_biw_msa.c
+++ b/libavcodec/mips/hevc_mc_biw_msa.c
@@ -66,7 +66,7 @@
     out1_l = __msa_dpadd_s_w(offset, (v8i16) out1_l, (v8i16) wgt);   \
     SRAR_W4_SW(out0_r, out1_r, out0_l, out1_l, rnd);                 \
     PCKEV_H2_SH(out0_l, out0_r, out1_l, out1_r, out0, out1);         \
-    CLIP_SH2_0_255_MAX_SATU(out0, out1);                             \
+    CLIP_SH2_0_255(out0, out1);                                      \
 }
 
 #define HEVC_BIW_RND_CLIP4_MAX_SATU(in0, in1, in2, in3, vec0, vec1, vec2,  \
@@ -124,9 +124,9 @@
         dst0_l = __msa_dpadd_s_w(offset_vec, (v8i16) dst0_l, weight_vec);
         SRAR_W2_SW(dst0_r, dst0_l, rnd_vec);
         dst0 = (v8i16) __msa_pckev_h((v8i16) dst0_l, (v8i16) dst0_r);
-        dst0 = CLIP_SH_0_255_MAX_SATU(dst0);
+        CLIP_SH_0_255(dst0);
         out0 = (v16u8) __msa_pckev_b((v16i8) dst0, (v16i8) dst0);
-        ST4x2_UB(out0, dst, dst_stride);
+        ST_W2(out0, 0, 1, dst, dst_stride);
     } else if (4 == height) {
         LW4(src0_ptr, src_stride, tp0, tp1, tp2, tp3);
         INSERT_W4_SB(tp0, tp1, tp2, tp3, src0);
@@ -138,7 +138,7 @@
         HEVC_BIW_RND_CLIP2_MAX_SATU(dst0, dst1, in0, in1, weight_vec, rnd_vec,
                                     offset_vec, dst0, dst1);
         out0 = (v16u8) __msa_pckev_b((v16i8) dst1, (v16i8) dst0);
-        ST4x4_UB(out0, out0, 0, 1, 2, 3, dst, dst_stride);
+        ST_W4(out0, 0, 1, 2, 3, dst, dst_stride);
     } else if (0 == height % 8) {
         for (loop_cnt = (height >> 3); loop_cnt--;) {
             LW4(src0_ptr, src_stride, tp0, tp1, tp2, tp3);
@@ -162,7 +162,7 @@
                                         in3, weight_vec, rnd_vec, offset_vec,
                                         dst0, dst1, dst2, dst3);
             PCKEV_B2_UB(dst1, dst0, dst3, dst2, out0, out1);
-            ST4x8_UB(out0, out1, dst, dst_stride);
+            ST_W8(out0, out1, 0, 1, 2, 3, 0, 1, 2, 3, dst, dst_stride);
             dst += (8 * dst_stride);
         }
     }
@@ -214,7 +214,10 @@
                                     weight_vec, rnd_vec, offset_vec,
                                     dst0, dst1, dst2, dst3);
         PCKEV_B2_UB(dst1, dst0, dst3, dst2, out0, out1);
-        ST6x4_UB(out0, out1, dst, dst_stride);
+        ST_W2(out0, 0, 2, dst, dst_stride);
+        ST_H2(out0, 2, 6, dst + 4, dst_stride);
+        ST_W2(out1, 0, 2, dst + 2 * dst_stride, dst_stride);
+        ST_H2(out1, 2, 6, dst + 2 * dst_stride + 4, dst_stride);
         dst += (4 * dst_stride);
     }
 }
@@ -261,7 +264,7 @@
                            dst0, dst1);
 
         out0 = (v16u8) __msa_pckev_b((v16i8) dst1, (v16i8) dst0);
-        ST8x2_UB(out0, dst, dst_stride);
+        ST_D2(out0, 0, 1, dst, dst_stride);
     } else if (6 == height) {
         LD4(src0_ptr, src_stride, tp0, tp1, tp2, tp3);
         src0_ptr += 4 * src_stride;
@@ -281,9 +284,8 @@
         HEVC_BIW_RND_CLIP2_MAX_SATU(dst4, dst5, in4, in5, weight_vec, rnd_vec,
                                     offset_vec, dst4, dst5);
         PCKEV_B3_UB(dst1, dst0, dst3, dst2, dst5, dst4, out0, out1, out2);
-        ST8x4_UB(out0, out1, dst, dst_stride);
-        dst += (4 * dst_stride);
-        ST8x2_UB(out2, dst, dst_stride);
+        ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
+        ST_D2(out2, 0, 1, dst + 4 * dst_stride, dst_stride);
     } else if (0 == height % 4) {
         uint32_t loop_cnt;
 
@@ -302,7 +304,7 @@
                                         in3, weight_vec, rnd_vec, offset_vec,
                                         dst0, dst1, dst2, dst3);
             PCKEV_B2_UB(dst1, dst0, dst3, dst2, out0, out1);
-            ST8x4_UB(out0, out1, dst, dst_stride);
+            ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
             dst += (4 * dst_stride);
         }
     }
@@ -361,7 +363,8 @@
         HEVC_BIW_RND_CLIP2_MAX_SATU(dst4, dst5, in4, in5, weight_vec, rnd_vec,
                                     offset_vec, dst4, dst5);
         PCKEV_B3_UB(dst1, dst0, dst3, dst2, dst5, dst4, out0, out1, out2);
-        ST12x4_UB(out0, out1, out2, dst, dst_stride);
+        ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
+        ST_W4(out2, 0, 1, 2, 3, dst + 8, dst_stride);
         dst += (4 * dst_stride);
     }
 }
@@ -480,7 +483,7 @@
         PCKEV_B3_UB(dst1, dst0, dst3, dst2, dst5, dst4, out0, out1, out2);
         PCKEV_B3_UB(dst7, dst6, dst9, dst8, dst11, dst10, out3, out4, out5);
         ST_UB4(out0, out1, out3, out4, dst, dst_stride);
-        ST8x4_UB(out2, out5, dst + 16, dst_stride);
+        ST_D4(out2, out5, 0, 1, 0, 1, dst + 16, dst_stride);
         dst += (4 * dst_stride);
     }
 }
@@ -720,7 +723,7 @@
                            out0, out1);
 
         out0 = (v8i16) __msa_pckev_b((v16i8) out1, (v16i8) out0);
-        ST4x4_UB(out0, out0, 0, 1, 2, 3, dst, dst_stride);
+        ST_W4(out0, 0, 1, 2, 3, dst, dst_stride);
         dst += (4 * dst_stride);
     }
 }
@@ -800,7 +803,7 @@
                            out0, out1, out2, out3);
 
         PCKEV_B2_SH(out1, out0, out3, out2, out0, out1);
-        ST8x4_UB(out0, out1, dst, dst_stride);
+        ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
         dst += (4 * dst_stride);
     }
 }
@@ -876,7 +879,7 @@
                            weight_vec, rnd_vec, offset_vec, out0, out1, out2,
                            out3);
         PCKEV_B2_SH(out1, out0, out3, out2, out0, out1);
-        ST8x4_UB(out0, out1, dst, dst_stride);
+        ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
 
         LD_SB4(src0_ptr + 8, src_stride, src0, src1, src2, src3);
         src0_ptr += (4 * src_stride);
@@ -895,7 +898,7 @@
         HEVC_BIW_RND_CLIP2(dst0, dst1, in0, in1, weight_vec, rnd_vec,
                            offset_vec, out0, out1);
         out0 = (v8i16) __msa_pckev_b((v16i8) out1, (v16i8) out0);
-        ST4x4_UB(out0, out0, 0, 1, 2, 3, dst + 8, dst_stride);
+        ST_W4(out0, 0, 1, 2, 3, dst + 8, dst_stride);
         dst += (4 * dst_stride);
     }
 }
@@ -1066,8 +1069,8 @@
         dst2_l = __msa_dpadd_s_w(offset_vec, (v8i16) dst2_l,
                                  (v8i16) weight_vec);
         SRAR_W2_SW(dst2_r, dst2_l, rnd_vec);
-        dst2_r = (v4i32) __msa_pckev_h((v8i16) dst2_l, (v8i16) dst2_r);
-        out2 = CLIP_SH_0_255(dst2_r);
+        out2 = __msa_pckev_h((v8i16) dst2_l, (v8i16) dst2_r);
+        CLIP_SH_0_255(out2);
 
         LD_SB2(src0_ptr, 16, src0, src1);
         src0_ptr += src_stride;
@@ -1097,8 +1100,8 @@
     dst2_r = __msa_dpadd_s_w(offset_vec, (v8i16) dst2_r, (v8i16) weight_vec);
     dst2_l = __msa_dpadd_s_w(offset_vec, (v8i16) dst2_l, (v8i16) weight_vec);
     SRAR_W2_SW(dst2_r, dst2_l, rnd_vec);
-    dst2_r = (v4i32) __msa_pckev_h((v8i16) dst2_l, (v8i16) dst2_r);
-    out2 = CLIP_SH_0_255(dst2_r);
+    out2 = __msa_pckev_h((v8i16) dst2_l, (v8i16) dst2_r);
+    CLIP_SH_0_255(out2);
     PCKEV_B2_SH(out1, out0, out2, out2, out0, out2);
     dst_val0 = __msa_copy_u_d((v2i64) out2, 0);
     ST_SH(out0, dst);
@@ -1483,7 +1486,7 @@
                            out0, out1, out2, out3);
 
         PCKEV_B2_SH(out1, out0, out3, out2, out0, out1);
-        ST4x8_UB(out0, out1, dst, dst_stride);
+        ST_W8(out0, out1, 0, 1, 2, 3, 0, 1, 2, 3, dst, dst_stride);
         dst += (8 * dst_stride);
 
         src2110 = src10998;
@@ -1568,7 +1571,7 @@
                            out0, out1, out2, out3);
 
         PCKEV_B2_SH(out1, out0, out3, out2, out0, out1);
-        ST8x4_UB(out0, out1, dst, dst_stride);
+        ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
         dst += (4 * dst_stride);
 
         src10_r = src54_r;
@@ -1671,11 +1674,11 @@
         dst2_l = __msa_dpadd_s_w(offset_vec, (v8i16) dst2_l,
                                  (v8i16) weight_vec);
         SRAR_W2_SW(dst2_r, dst2_l, rnd_vec);
-        dst2_r = (v4i32) __msa_pckev_h((v8i16) dst2_l, (v8i16) dst2_r);
-        out2 = CLIP_SH_0_255(dst2_r);
+        out2 = __msa_pckev_h((v8i16) dst2_l, (v8i16) dst2_r);
+        CLIP_SH_0_255(out2);
         PCKEV_B2_SH(out1, out0, out2, out2, out0, out2);
-        ST8x2_UB(out0, dst, dst_stride);
-        ST4x2_UB(out2, dst + 8, dst_stride);
+        ST_D2(out0, 0, 1, dst, dst_stride);
+        ST_W2(out2, 0, 1, dst + 8, dst_stride);
         dst += (2 * dst_stride);
 
         src10_r = src32_r;
@@ -2045,10 +2048,10 @@
         dst2 = __msa_dpadd_s_w(offset_vec, tmp2, weight_vec);
         dst3 = __msa_dpadd_s_w(offset_vec, tmp3, weight_vec);
         SRAR_W4_SW(dst0, dst1, dst2, dst3, rnd_vec);
-        CLIP_SW4_0_255_MAX_SATU(dst0, dst1, dst2, dst3);
+        CLIP_SW4_0_255(dst0, dst1, dst2, dst3);
         PCKEV_H2_SH(dst1, dst0, dst3, dst2, tmp0, tmp1);
         out = (v16u8) __msa_pckev_b((v16i8) tmp1, (v16i8) tmp0);
-        ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
+        ST_W4(out, 0, 1, 2, 3, dst, dst_stride);
         dst += (4 * dst_stride);
 
         dst10 = dst54;
@@ -2223,10 +2226,10 @@
             dst1_r = __msa_dpadd_s_w(offset_vec, tmp2, weight_vec);
             dst1_l = __msa_dpadd_s_w(offset_vec, tmp3, weight_vec);
             SRAR_W4_SW(dst0_l, dst0_r, dst1_l, dst1_r, rnd_vec);
-            CLIP_SW4_0_255_MAX_SATU(dst0_l, dst0_r, dst1_l, dst1_r);
+            CLIP_SW4_0_255(dst0_l, dst0_r, dst1_l, dst1_r);
             PCKEV_H2_SH(dst0_l, dst0_r, dst1_l, dst1_r, tmp0, tmp1);
             out = (v16u8) __msa_pckev_b((v16i8) tmp1, (v16i8) tmp0);
-            ST8x2_UB(out, dst_tmp, dst_stride);
+            ST_D2(out, 0, 1, dst_tmp, dst_stride);
             dst_tmp += (2 * dst_stride);
 
             dst0 = dst2;
@@ -2409,10 +2412,10 @@
         dst2 = __msa_dpadd_s_w(offset_vec, tmp2, weight_vec);
         dst3 = __msa_dpadd_s_w(offset_vec, tmp3, weight_vec);
         SRAR_W4_SW(dst1, dst0, dst3, dst2, rnd_vec);
-        CLIP_SW4_0_255_MAX_SATU(dst1, dst0, dst3, dst2);
+        CLIP_SW4_0_255(dst1, dst0, dst3, dst2);
         PCKEV_H2_SH(dst1, dst0, dst3, dst2, tmp0, tmp1);
         out = (v16u8) __msa_pckev_b((v16i8) tmp1, (v16i8) tmp0);
-        ST8x2_UB(out, dst_tmp, dst_stride);
+        ST_D2(out, 0, 1, dst_tmp, dst_stride);
         dst_tmp += (2 * dst_stride);
 
         dsth0 = dsth2;
@@ -2500,10 +2503,10 @@
         dst2 = __msa_dpadd_s_w(offset_vec, tmp2, weight_vec);
         dst3 = __msa_dpadd_s_w(offset_vec, tmp3, weight_vec);
         SRAR_W4_SW(dst0, dst1, dst2, dst3, rnd_vec);
-        CLIP_SW4_0_255_MAX_SATU(dst0, dst1, dst2, dst3);
+        CLIP_SW4_0_255(dst0, dst1, dst2, dst3);
         PCKEV_H2_SH(dst1, dst0, dst3, dst2, tmp0, tmp1);
         out = (v16u8) __msa_pckev_b((v16i8) tmp1, (v16i8) tmp0);
-        ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
+        ST_W4(out, 0, 1, 2, 3, dst, dst_stride);
         dst += (4 * dst_stride);
 
         dst10 = dst54;
@@ -2680,10 +2683,10 @@
     dst0_r = __msa_dpadd_s_w(offset_vec, (v8i16) dst0_r, (v8i16) weight_vec);
     dst0_l = __msa_dpadd_s_w(offset_vec, (v8i16) dst0_l, (v8i16) weight_vec);
     SRAR_W2_SW(dst0_r, dst0_l, rnd_vec);
-    dst0_r = (v4i32) __msa_pckev_h((v8i16) dst0_l, (v8i16) dst0_r);
-    out0 = CLIP_SH_0_255(dst0_r);
+    out0 = __msa_pckev_h((v8i16) dst0_l, (v8i16) dst0_r);
+    CLIP_SH_0_255(out0);
     out0 = (v8i16) __msa_pckev_b((v16i8) out0, (v16i8) out0);
-    ST4x2_UB(out0, dst, dst_stride);
+    ST_W2(out0, 0, 1, dst, dst_stride);
 }
 
 static void hevc_hz_biwgt_4t_4x4_msa(uint8_t *src0_ptr,
@@ -2743,7 +2746,7 @@
                        dst0, dst1);
 
     dst0 = (v8i16) __msa_pckev_b((v16i8) dst1, (v16i8) dst0);
-    ST4x4_UB(dst0, dst0, 0, 1, 2, 3, dst, dst_stride);
+    ST_W4(dst0, 0, 1, 2, 3, dst, dst_stride);
 }
 
 static void hevc_hz_biwgt_4t_4x8multiple_msa(uint8_t *src0_ptr,
@@ -2816,7 +2819,7 @@
                            dst0, dst1, dst2, dst3);
 
         PCKEV_B2_SH(dst1, dst0, dst3, dst2, dst0, dst1);
-        ST4x8_UB(dst0, dst1, dst, dst_stride);
+        ST_W8(dst0, dst1, 0, 1, 2, 3, 0, 1, 2, 3, dst, dst_stride);
         dst += (8 * dst_stride);
     }
 }
@@ -2918,7 +2921,10 @@
                            dst0, dst1, dst2, dst3);
 
         PCKEV_B2_SH(dst1, dst0, dst3, dst2, dst0, dst1);
-        ST6x4_UB(dst0, dst1, dst, dst_stride);
+        ST_W2(dst0, 0, 2, dst, dst_stride);
+        ST_H2(dst0, 2, 6, dst + 4, dst_stride);
+        ST_W2(dst1, 0, 2, dst + 2 * dst_stride, dst_stride);
+        ST_H2(dst1, 2, 6, dst + 2 * dst_stride + 4, dst_stride);
         dst += (4 * dst_stride);
     }
 }
@@ -2976,7 +2982,7 @@
                        dst0, dst1);
 
     dst0 = (v8i16) __msa_pckev_b((v16i8) dst1, (v16i8) dst0);
-    ST8x2_UB(dst0, dst, dst_stride);
+    ST_D2(dst0, 0, 1, dst, dst_stride);
 }
 
 static void hevc_hz_biwgt_4t_8x6_msa(uint8_t *src0_ptr,
@@ -3049,9 +3055,8 @@
 
     PCKEV_B2_SH(dst1, dst0, dst3, dst2, dst0, dst1);
     dst3 = (v8i16) __msa_pckev_b((v16i8) dst5, (v16i8) dst4);
-    ST8x4_UB(dst0, dst1, dst, dst_stride);
-    dst += (4 * dst_stride);
-    ST8x2_UB(dst3, dst, dst_stride);
+    ST_D4(dst0, dst1, 0, 1, 0, 1, dst, dst_stride);
+    ST_D2(dst3, 0, 1, dst + 4 * dst_stride, dst_stride);
 }
 
 static void hevc_hz_biwgt_4t_8x4multiple_msa(uint8_t *src0_ptr,
@@ -3119,7 +3124,7 @@
                            dst0, dst1, dst2, dst3);
 
         PCKEV_B2_SH(dst1, dst0, dst3, dst2, dst0, dst1);
-        ST8x4_UB(dst0, dst1, dst, dst_stride);
+        ST_D4(dst0, dst1, 0, 1, 0, 1, dst, dst_stride);
         dst += (4 * dst_stride);
     }
 }
@@ -3235,7 +3240,8 @@
 
         PCKEV_B2_SH(dst1, dst0, dst3, dst2, dst0, dst1);
         dst3 = (v8i16) __msa_pckev_b((v16i8) dst5, (v16i8) dst4);
-        ST12x4_UB(dst0, dst1, dst3, dst, dst_stride);
+        ST_D4(dst0, dst1, 0, 1, 0, 1, dst, dst_stride);
+        ST_W4(dst3, 0, 1, 2, 3, dst + 8, dst_stride);
         dst += (4 * dst_stride);
     }
 }
@@ -3411,7 +3417,7 @@
                            dst0, dst1);
 
         dst0 = (v8i16) __msa_pckev_b((v16i8) dst1, (v16i8) dst0);
-        ST8x2_UB(dst0, (dst + 16), dst_stride);
+        ST_D2(dst0, 0, 1, (dst + 16), dst_stride);
         dst += (2 * dst_stride);
     }
 }
@@ -3548,10 +3554,10 @@
     dst10_r = __msa_dpadd_s_w(offset_vec, (v8i16) dst10_r, (v8i16) weight_vec);
     dst10_l = __msa_dpadd_s_w(offset_vec, (v8i16) dst10_l, (v8i16) weight_vec);
     SRAR_W2_SW(dst10_r, dst10_l, rnd_vec);
-    dst10_r = (v4i32) __msa_pckev_h((v8i16) dst10_l, (v8i16) dst10_r);
-    out = CLIP_SH_0_255(dst10_r);
+    out = __msa_pckev_h((v8i16) dst10_l, (v8i16) dst10_r);
+    CLIP_SH_0_255(out);
     out = (v8i16) __msa_pckev_b((v16i8) out, (v16i8) out);
-    ST4x2_UB(out, dst, dst_stride);
+    ST_W2(out, 0, 1, dst, dst_stride);
 }
 
 static void hevc_vt_biwgt_4t_4x4_msa(uint8_t *src0_ptr,
@@ -3617,7 +3623,7 @@
                        dst10, dst32);
 
     dst10 = (v8i16) __msa_pckev_b((v16i8) dst32, (v16i8) dst10);
-    ST4x4_UB(dst10, dst10, 0, 1, 2, 3, dst, dst_stride);
+    ST_W4(dst10, 0, 1, 2, 3, dst, dst_stride);
     dst += (4 * dst_stride);
 }
 
@@ -3702,7 +3708,7 @@
                            dst10, dst32, dst54, dst76);
 
         PCKEV_B2_SH(dst32, dst10, dst76, dst54, dst10, dst32);
-        ST4x8_UB(dst10, dst32, dst, dst_stride);
+        ST_W8(dst10, dst32, 0, 1, 2, 3, 0, 1, 2, 3, dst, dst_stride);
         dst += (8 * dst_stride);
     }
 }
@@ -3807,7 +3813,10 @@
                            tmp0, tmp1, tmp2, tmp3);
 
         PCKEV_B2_SH(tmp1, tmp0, tmp3, tmp2, tmp0, tmp1);
-        ST6x4_UB(tmp0, tmp1, dst, dst_stride);
+        ST_W2(tmp0, 0, 2, dst, dst_stride);
+        ST_H2(tmp0, 2, 6, dst + 4, dst_stride);
+        ST_W2(tmp1, 0, 2, dst + 2 * dst_stride, dst_stride);
+        ST_H2(tmp1, 2, 6, dst + 2 * dst_stride + 4, dst_stride);
         dst += (4 * dst_stride);
     }
 }
@@ -3866,7 +3875,7 @@
                        tmp0, tmp1);
 
     tmp0 = (v8i16) __msa_pckev_b((v16i8) tmp1, (v16i8) tmp0);
-    ST8x2_UB(tmp0, dst, dst_stride);
+    ST_D2(tmp0, 0, 1, dst, dst_stride);
 }
 
 static void hevc_vt_biwgt_4t_8x6_msa(uint8_t *src0_ptr,
@@ -3936,9 +3945,8 @@
 
     PCKEV_B2_SH(tmp1, tmp0, tmp3, tmp2, tmp0, tmp1);
     tmp3 = (v8i16) __msa_pckev_b((v16i8) tmp5, (v16i8) tmp4);
-    ST8x4_UB(tmp0, tmp1, dst, dst_stride);
-    dst += (4 * dst_stride);
-    ST8x2_UB(tmp3, dst, dst_stride);
+    ST_D4(tmp0, tmp1, 0, 1, 0, 1, dst, dst_stride);
+    ST_D2(tmp3, 0, 1, dst + 4 * dst_stride, dst_stride);
 }
 
 static void hevc_vt_biwgt_4t_8x4multiple_msa(uint8_t *src0_ptr,
@@ -4010,7 +4018,7 @@
                            tmp0, tmp1, tmp2, tmp3);
 
         PCKEV_B2_SH(tmp1, tmp0, tmp3, tmp2, tmp0, tmp1);
-        ST8x4_UB(tmp0, tmp1, dst, dst_stride);
+        ST_D4(tmp0, tmp1, 0, 1, 0, 1, dst, dst_stride);
         dst += (4 * dst_stride);
     }
 }
@@ -4132,7 +4140,8 @@
 
         PCKEV_B2_SH(tmp1, tmp0, tmp3, tmp2, tmp0, tmp1);
         tmp2 = (v8i16) __msa_pckev_b((v16i8) tmp5, (v16i8) tmp4);
-        ST12x4_UB(tmp0, tmp1, tmp2, dst, dst_stride);
+        ST_D4(tmp0, tmp1, 0, 1, 0, 1, dst, dst_stride);
+        ST_W4(tmp2, 0, 1, 2, 3, dst + 8, dst_stride);
         dst += (4 * dst_stride);
     }
 }
@@ -4323,7 +4332,7 @@
         /* 8width */
         tmp2 = (v8i16) __msa_pckev_b((v16i8) tmp3, (v16i8) tmp2);
         ST_SH2(tmp0, tmp1, dst, dst_stride);
-        ST8x2_UB(tmp2, dst + 16, dst_stride);
+        ST_D2(tmp2, 0, 1, dst + 16, dst_stride);
         dst += (2 * dst_stride);
 
         /* 16width */
@@ -4363,7 +4372,7 @@
         /* 8width */
         tmp2 = (v8i16) __msa_pckev_b((v16i8) tmp3, (v16i8) tmp2);
         ST_SH2(tmp0, tmp1, dst, dst_stride);
-        ST8x2_UB(tmp2, dst + 16, dst_stride);
+        ST_D2(tmp2, 0, 1, dst + 16, dst_stride);
         dst += (2 * dst_stride);
     }
 }
@@ -4566,9 +4575,9 @@
     dst1 = __msa_dpadd_s_w(offset_vec, tmp1, weight_vec);
     SRAR_W2_SW(dst0, dst1, rnd_vec);
     tmp = __msa_pckev_h((v8i16) dst1, (v8i16) dst0);
-    tmp = CLIP_SH_0_255_MAX_SATU(tmp);
+    CLIP_SH_0_255(tmp);
     out = (v16u8) __msa_pckev_b((v16i8) tmp, (v16i8) tmp);
-    ST4x2_UB(out, dst, dst_stride);
+    ST_W2(out, 0, 1, dst, dst_stride);
 }
 
 static void hevc_hv_biwgt_4t_4x4_msa(uint8_t *src0_ptr,
@@ -4663,9 +4672,9 @@
     dst3 = __msa_dpadd_s_w(offset_vec, tmp3, weight_vec);
     SRAR_W4_SW(dst0, dst1, dst2, dst3, rnd_vec);
     PCKEV_H2_SH(dst1, dst0, dst3, dst2, tmp0, tmp1);
-    CLIP_SH2_0_255_MAX_SATU(tmp0, tmp1);
+    CLIP_SH2_0_255(tmp0, tmp1);
     out = (v16u8) __msa_pckev_b((v16i8) tmp1, (v16i8) tmp0);
-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
+    ST_W4(out, 0, 1, 2, 3, dst, dst_stride);
 }
 
 static void hevc_hv_biwgt_4t_4multx8mult_msa(uint8_t *src0_ptr,
@@ -4801,9 +4810,9 @@
         SRAR_W4_SW(dst4, dst5, dst6, dst7, rnd_vec);
         PCKEV_H4_SH(dst1, dst0, dst3, dst2, dst5, dst4, dst7, dst6, tmp0, tmp1,
                     tmp2, tmp3);
-        CLIP_SH4_0_255_MAX_SATU(tmp0, tmp1, tmp2, tmp3);
+        CLIP_SH4_0_255(tmp0, tmp1, tmp2, tmp3);
         PCKEV_B2_UB(tmp1, tmp0, tmp3, tmp2, out0, out1);
-        ST4x8_UB(out0, out1, dst, dst_stride);
+        ST_W8(out0, out1, 0, 1, 2, 3, 0, 1, 2, 3, dst, dst_stride);
         dst += (8 * dst_stride);
 
         dst10_r = dst98_r;
@@ -4999,9 +5008,9 @@
     SRAR_W4_SW(dst4, dst5, dst6, dst7, rnd_vec);
     PCKEV_H4_SH(dst1, dst0, dst3, dst2, dst5, dst4, dst7, dst6, tmp0, tmp1,
                 tmp2, tmp3);
-    CLIP_SH4_0_255_MAX_SATU(tmp0, tmp1, tmp2, tmp3);
+    CLIP_SH4_0_255(tmp0, tmp1, tmp2, tmp3);
     PCKEV_B2_UB(tmp1, tmp0, tmp3, tmp2, out0, out1);
-    ST4x8_UB(out0, out1, dst, dst_stride);
+    ST_W8(out0, out1, 0, 1, 2, 3, 0, 1, 2, 3, dst, dst_stride);
 
     PCKEV_H2_SW(dst1_l, dst0_l, dst3_l, dst2_l, dst4, dst5);
 
@@ -5021,11 +5030,9 @@
     SRAR_W4_SW(dst0, dst1, dst2, dst3, rnd_vec);
     PCKEV_H2_SH(dst1, dst0, dst3, dst2, tmp4, tmp5);
 
-    CLIP_SH2_0_255_MAX_SATU(tmp4, tmp5);
+    CLIP_SH2_0_255(tmp4, tmp5);
     out2 = (v16u8) __msa_pckev_b((v16i8) tmp5, (v16i8) tmp4);
-    ST2x4_UB(out2, 0, dst + 4, dst_stride);
-    dst += 4 * dst_stride;
-    ST2x4_UB(out2, 4, dst + 4, dst_stride);
+    ST_H8(out2, 0, 1, 2, 3, 4, 5, 6, 7, dst + 4, dst_stride);
 }
 
 static void hevc_hv_biwgt_4t_8x2_msa(uint8_t *src0_ptr,
@@ -5119,9 +5126,9 @@
     dst1_l = __msa_dpadd_s_w(offset_vec, tmp3, weight_vec);
     SRAR_W4_SW(dst0_r, dst0_l, dst1_r, dst1_l, rnd_vec);
     PCKEV_H2_SH(dst0_l, dst0_r, dst1_l, dst1_r, tmp0, tmp1);
-    CLIP_SH2_0_255_MAX_SATU(tmp0, tmp1);
+    CLIP_SH2_0_255(tmp0, tmp1);
     out = (v16u8) __msa_pckev_b((v16i8) tmp1, (v16i8) tmp0);
-    ST8x2_UB(out, dst, dst_stride);
+    ST_D2(out, 0, 1, dst, dst_stride);
 }
 
 static void hevc_hv_biwgt_4t_8multx4_msa(uint8_t *src0_ptr,
@@ -5241,9 +5248,9 @@
         SRAR_W4_SW(dst4, dst5, dst6, dst7, rnd_vec);
         PCKEV_H4_SH(dst1, dst0, dst3, dst2, dst5, dst4, dst7, dst6,
                     tmp0, tmp1, tmp2, tmp3);
-        CLIP_SH4_0_255_MAX_SATU(tmp0, tmp1, tmp2, tmp3);
+        CLIP_SH4_0_255(tmp0, tmp1, tmp2, tmp3);
         PCKEV_B2_UB(tmp1, tmp0, tmp3, tmp2, out0, out1);
-        ST8x4_UB(out0, out1, dst, dst_stride);
+        ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
         dst += 8;
     }
 }
@@ -5380,7 +5387,7 @@
     SRAR_W4_SW(dst4, dst5, dst6, dst7, rnd_vec);
     PCKEV_H4_SH(dst1, dst0, dst3, dst2, dst5, dst4, dst7, dst6,
                 tmp0, tmp1, tmp2, tmp3);
-    CLIP_SH4_0_255_MAX_SATU(tmp0, tmp1, tmp2, tmp3);
+    CLIP_SH4_0_255(tmp0, tmp1, tmp2, tmp3);
     PCKEV_B2_UB(tmp1, tmp0, tmp3, tmp2, out0, out1);
 
     PCKEV_H2_SW(dst4_l, dst4_r, dst5_l, dst5_r, dst0, dst1);
@@ -5392,11 +5399,10 @@
     dst3 = __msa_dpadd_s_w(offset_vec, tmp3, weight_vec);
     SRAR_W4_SW(dst0, dst1, dst2, dst3, rnd_vec);
     PCKEV_H2_SH(dst1, dst0, dst3, dst2, tmp4, tmp5);
-    CLIP_SH2_0_255_MAX_SATU(tmp4, tmp5);
+    CLIP_SH2_0_255(tmp4, tmp5);
     out2 = (v16u8) __msa_pckev_b((v16i8) tmp5, (v16i8) tmp4);
-    ST8x4_UB(out0, out1, dst, dst_stride);
-    dst += (4 * dst_stride);
-    ST8x2_UB(out2, dst, dst_stride);
+    ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
+    ST_D2(out2, 0, 1, dst + 4 * dst_stride, dst_stride);
 }
 
 static void hevc_hv_biwgt_4t_8multx4mult_msa(uint8_t *src0_ptr,
@@ -5531,9 +5537,9 @@
             SRAR_W4_SW(dst4, dst5, dst6, dst7, rnd_vec);
             PCKEV_H4_SH(dst1, dst0, dst3, dst2, dst5, dst4, dst7, dst6,
                         tmp0, tmp1, tmp2, tmp3);
-            CLIP_SH4_0_255_MAX_SATU(tmp0, tmp1, tmp2, tmp3);
+            CLIP_SH4_0_255(tmp0, tmp1, tmp2, tmp3);
             PCKEV_B2_UB(tmp1, tmp0, tmp3, tmp2, out0, out1);
-            ST8x4_UB(out0, out1, dst_tmp, dst_stride);
+            ST_D4(out0, out1, 0, 1, 0, 1, dst_tmp, dst_stride);
             dst_tmp += (4 * dst_stride);
 
             dst10_r = dst54_r;
@@ -5718,9 +5724,9 @@
         SRAR_W4_SW(dst4, dst5, dst6, dst7, rnd_vec);
         PCKEV_H4_SH(dst1, dst0, dst3, dst2, dst5, dst4, dst7, dst6,
                     tmp0, tmp1, tmp2, tmp3);
-        CLIP_SH4_0_255_MAX_SATU(tmp0, tmp1, tmp2, tmp3);
+        CLIP_SH4_0_255(tmp0, tmp1, tmp2, tmp3);
         PCKEV_B2_UB(tmp1, tmp0, tmp3, tmp2, out0, out1);
-        ST8x4_UB(out0, out1, dst_tmp, dst_stride);
+        ST_D4(out0, out1, 0, 1, 0, 1, dst_tmp, dst_stride);
         dst_tmp += (4 * dst_stride);
 
         dst10_r = dst54_r;
@@ -5814,9 +5820,9 @@
         SRAR_W4_SW(dst4, dst5, dst6, dst7, rnd_vec);
         PCKEV_H4_SH(dst1, dst0, dst3, dst2, dst5, dst4, dst7, dst6,
                     tmp0, tmp1, tmp2, tmp3);
-        CLIP_SH4_0_255_MAX_SATU(tmp0, tmp1, tmp2, tmp3);
+        CLIP_SH4_0_255(tmp0, tmp1, tmp2, tmp3);
         PCKEV_B2_UB(tmp1, tmp0, tmp3, tmp2, out0, out1);
-        ST4x8_UB(out0, out1, dst, dst_stride);
+        ST_W8(out0, out1, 0, 1, 2, 3, 0, 1, 2, 3, dst, dst_stride);
         dst += (8 * dst_stride);
 
         dst10_r = dst98_r;
diff --git a/libavcodec/mips/hevc_mc_uni_msa.c b/libavcodec/mips/hevc_mc_uni_msa.c
index 740c970..36e6552 100644
--- a/libavcodec/mips/hevc_mc_uni_msa.c
+++ b/libavcodec/mips/hevc_mc_uni_msa.c
@@ -309,7 +309,7 @@
     SRARI_H2_SH(out0, out1, 6);
     SAT_SH2_SH(out0, out1, 7);
     out = PCKEV_XORI128_UB(out0, out1);
-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
+    ST_W4(out, 0, 1, 2, 3, dst, dst_stride);
 }
 
 static void common_hz_8t_4x8_msa(uint8_t *src, int32_t src_stride,
@@ -344,10 +344,9 @@
     SRARI_H4_SH(out0, out1, out2, out3, 6);
     SAT_SH4_SH(out0, out1, out2, out3, 7);
     out = PCKEV_XORI128_UB(out0, out1);
-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
-    dst += (4 * dst_stride);
+    ST_W4(out, 0, 1, 2, 3, dst, dst_stride);
     out = PCKEV_XORI128_UB(out2, out3);
-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
+    ST_W4(out, 0, 1, 2, 3, dst + 4 * dst_stride, dst_stride);
 }
 
 static void common_hz_8t_4x16_msa(uint8_t *src, int32_t src_stride,
@@ -382,11 +381,10 @@
     SRARI_H4_SH(out0, out1, out2, out3, 6);
     SAT_SH4_SH(out0, out1, out2, out3, 7);
     out = PCKEV_XORI128_UB(out0, out1);
-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
-    dst += (4 * dst_stride);
+    ST_W4(out, 0, 1, 2, 3, dst, dst_stride);
     out = PCKEV_XORI128_UB(out2, out3);
-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
-    dst += (4 * dst_stride);
+    ST_W4(out, 0, 1, 2, 3, dst + 4 * dst_stride, dst_stride);
+    dst += (8 * dst_stride);
 
     LD_SB4(src, src_stride, src0, src1, src2, src3);
     XORI_B4_128_SB(src0, src1, src2, src3);
@@ -402,10 +400,9 @@
     SRARI_H4_SH(out0, out1, out2, out3, 6);
     SAT_SH4_SH(out0, out1, out2, out3, 7);
     out = PCKEV_XORI128_UB(out0, out1);
-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
-    dst += (4 * dst_stride);
+    ST_W4(out, 0, 1, 2, 3, dst, dst_stride);
     out = PCKEV_XORI128_UB(out2, out3);
-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
+    ST_W4(out, 0, 1, 2, 3, dst + 4 * dst_stride, dst_stride);
 }
 
 static void common_hz_8t_4w_msa(uint8_t *src, int32_t src_stride,
@@ -468,7 +465,7 @@
         SAT_SH4_SH(out0, out1, out2, out3, 7);
         tmp0 = PCKEV_XORI128_UB(out0, out1);
         tmp1 = PCKEV_XORI128_UB(out2, out3);
-        ST8x4_UB(tmp0, tmp1, dst, dst_stride);
+        ST_D4(tmp0, tmp1, 0, 1, 0, 1, dst, dst_stride);
         dst += (4 * dst_stride);
     }
 }
@@ -546,8 +543,8 @@
         tmp1 = PCKEV_XORI128_UB(out2, out3);
         tmp2 = PCKEV_XORI128_UB(out4, out5);
 
-        ST8x4_UB(tmp0, tmp1, dst, dst_stride);
-        ST4x4_UB(tmp2, tmp2, 0, 1, 2, 3, dst + 8, dst_stride);
+        ST_D4(tmp0, tmp1, 0, 1, 0, 1, dst, dst_stride);
+        ST_W4(tmp2, 0, 1, 2, 3, dst + 8, dst_stride);
         dst += (4 * dst_stride);
     }
 }
@@ -670,7 +667,7 @@
         SAT_SH4_SH(out0, out8, out2, out9, 7);
         SAT_SH2_SH(out1, out3, 7);
         out = PCKEV_XORI128_UB(out8, out9);
-        ST8x2_UB(out, dst + 16, dst_stride);
+        ST_D2(out, 0, 1, dst + 16, dst_stride);
         out = PCKEV_XORI128_UB(out0, out1);
         ST_UB(out, dst);
         dst += dst_stride;
@@ -965,10 +962,8 @@
         SAT_SH2_SH(out54, out76, 7);
         out0 = PCKEV_XORI128_UB(out10, out32);
         out1 = PCKEV_XORI128_UB(out54, out76);
-        ST4x4_UB(out0, out0, 0, 1, 2, 3, dst, dst_stride);
-        dst += (4 * dst_stride);
-        ST4x4_UB(out1, out1, 0, 1, 2, 3, dst, dst_stride);
-        dst += (4 * dst_stride);
+        ST_W8(out0, out1, 0, 1, 2, 3, 0, 1, 2, 3, dst, dst_stride);
+        dst += (8 * dst_stride);
 
         src2110 = src10998;
         src4332 = src12111110;
@@ -1019,7 +1014,7 @@
         SAT_SH4_SH(out0_r, out1_r, out2_r, out3_r, 7);
         tmp0 = PCKEV_XORI128_UB(out0_r, out1_r);
         tmp1 = PCKEV_XORI128_UB(out2_r, out3_r);
-        ST8x4_UB(tmp0, tmp1, dst, dst_stride);
+        ST_D4(tmp0, tmp1, 0, 1, 0, 1, dst, dst_stride);
         dst += (4 * dst_stride);
 
         src10_r = src54_r;
@@ -1458,10 +1453,8 @@
         PCKEV_H2_SW(dst5_r, dst4_r, dst7_r, dst6_r, dst4_r, dst5_r);
         out0 = PCKEV_XORI128_UB(dst0_r, dst1_r);
         out1 = PCKEV_XORI128_UB(dst4_r, dst5_r);
-        ST4x4_UB(out0, out0, 0, 1, 2, 3, dst, dst_stride);
-        dst += (4 * dst_stride);
-        ST4x4_UB(out1, out1, 0, 1, 2, 3, dst, dst_stride);
-        dst += (4 * dst_stride);
+        ST_W8(out0, out1, 0, 1, 2, 3, 0, 1, 2, 3, dst, dst_stride);
+        dst += (8 * dst_stride);
 
         dst10_r = dst98_r;
         dst32_r = dst1110_r;
@@ -1595,7 +1588,7 @@
 
             PCKEV_H2_SH(dst0_l, dst0_r, dst1_l, dst1_r, dst0, dst1);
             out = PCKEV_XORI128_UB(dst0, dst1);
-            ST8x2_UB(out, dst_tmp, dst_stride);
+            ST_D2(out, 0, 1, dst_tmp, dst_stride);
             dst_tmp += (2 * dst_stride);
 
             dst0 = dst2;
@@ -1741,7 +1734,7 @@
 
         PCKEV_H2_SH(dst0_l, dst0_r, dst1_l, dst1_r, dst0, dst1);
         out0 = PCKEV_XORI128_UB(dst0, dst1);
-        ST8x2_UB(out0, dst_tmp, dst_stride);
+        ST_D2(out0, 0, 1, dst_tmp, dst_stride);
         dst_tmp += (2 * dst_stride);
 
         dst0 = dst2;
@@ -1845,10 +1838,8 @@
         PCKEV_H2_SW(dst5_r, dst4_r, dst7_r, dst6_r, dst4_r, dst5_r);
         out0 = PCKEV_XORI128_UB(dst0_r, dst1_r);
         out1 = PCKEV_XORI128_UB(dst4_r, dst5_r);
-        ST4x4_UB(out0, out0, 0, 1, 2, 3, dst, dst_stride);
-        dst += (4 * dst_stride);
-        ST4x4_UB(out1, out1, 0, 1, 2, 3, dst, dst_stride);
-        dst += (4 * dst_stride);
+        ST_W8(out0, out1, 0, 1, 2, 3, 0, 1, 2, 3, dst, dst_stride);
+        dst += (8 * dst_stride);
 
         dst10_r = dst98_r;
         dst32_r = dst1110_r;
@@ -1944,7 +1935,7 @@
     res0 = __msa_srari_h(res0, 6);
     res0 = __msa_sat_s_h(res0, 7);
     out = PCKEV_XORI128_UB(res0, res0);
-    ST4x2_UB(out, dst, dst_stride);
+    ST_W2(out, 0, 1, dst, dst_stride);
 }
 
 static void common_hz_4t_4x4_msa(uint8_t *src, int32_t src_stride,
@@ -1971,7 +1962,7 @@
     SRARI_H2_SH(out0, out1, 6);
     SAT_SH2_SH(out0, out1, 7);
     out = PCKEV_XORI128_UB(out0, out1);
-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
+    ST_W4(out, 0, 1, 2, 3, dst, dst_stride);
 }
 
 static void common_hz_4t_4x8_msa(uint8_t *src, int32_t src_stride,
@@ -2004,10 +1995,9 @@
     SRARI_H4_SH(out0, out1, out2, out3, 6);
     SAT_SH4_SH(out0, out1, out2, out3, 7);
     out = PCKEV_XORI128_UB(out0, out1);
-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
-    dst += (4 * dst_stride);
+    ST_W4(out, 0, 1, 2, 3, dst, dst_stride);
     out = PCKEV_XORI128_UB(out2, out3);
-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
+    ST_W4(out, 0, 1, 2, 3, dst + 4 * dst_stride, dst_stride);
 }
 
 static void common_hz_4t_4x16_msa(uint8_t *src, int32_t src_stride,
@@ -2038,11 +2028,10 @@
     SRARI_H4_SH(out0, out1, out2, out3, 6);
     SAT_SH4_SH(out0, out1, out2, out3, 7);
     out = PCKEV_XORI128_UB(out0, out1);
-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
-    dst += (4 * dst_stride);
+    ST_W4(out, 0, 1, 2, 3, dst, dst_stride);
     out = PCKEV_XORI128_UB(out2, out3);
-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
-    dst += (4 * dst_stride);
+    ST_W4(out, 0, 1, 2, 3, dst + 4 * dst_stride, dst_stride);
+    dst += (8 * dst_stride);
 
     LD_SB8(src, src_stride, src0, src1, src2, src3, src4, src5, src6, src7);
     src += (8 * src_stride);
@@ -2054,10 +2043,9 @@
     SRARI_H4_SH(out0, out1, out2, out3, 6);
     SAT_SH4_SH(out0, out1, out2, out3, 7);
     out = PCKEV_XORI128_UB(out0, out1);
-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
-    dst += (4 * dst_stride);
+    ST_W4(out, 0, 1, 2, 3, dst, dst_stride);
     out = PCKEV_XORI128_UB(out2, out3);
-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
+    ST_W4(out, 0, 1, 2, 3, dst + 4 * dst_stride, dst_stride);
 }
 
 static void common_hz_4t_4w_msa(uint8_t *src, int32_t src_stride,
@@ -2102,7 +2090,10 @@
     SAT_SH4_SH(out0, out1, out2, out3, 7);
     out4 = PCKEV_XORI128_UB(out0, out1);
     out5 = PCKEV_XORI128_UB(out2, out3);
-    ST6x4_UB(out4, out5, dst, dst_stride);
+    ST_W2(out4, 0, 2, dst, dst_stride);
+    ST_H2(out4, 2, 6, dst + 4, dst_stride);
+    ST_W2(out5, 0, 2, dst + 2 * dst_stride, dst_stride);
+    ST_H2(out5, 2, 6, dst + 2 * dst_stride + 4, dst_stride);
     dst += (4 * dst_stride);
 
     LD_SB4(src, src_stride, src0, src1, src2, src3);
@@ -2115,8 +2106,10 @@
     SAT_SH4_SH(out0, out1, out2, out3, 7);
     out4 = PCKEV_XORI128_UB(out0, out1);
     out5 = PCKEV_XORI128_UB(out2, out3);
-    ST6x4_UB(out4, out5, dst, dst_stride);
-    dst += (4 * dst_stride);
+    ST_W2(out4, 0, 2, dst, dst_stride);
+    ST_H2(out4, 2, 6, dst + 4, dst_stride);
+    ST_W2(out5, 0, 2, dst + 2 * dst_stride, dst_stride);
+    ST_H2(out5, 2, 6, dst + 2 * dst_stride + 4, dst_stride);
 }
 
 static void common_hz_4t_8x2mult_msa(uint8_t *src, int32_t src_stride,
@@ -2148,7 +2141,7 @@
         SRARI_H2_SH(vec0, vec1, 6);
         SAT_SH2_SH(vec0, vec1, 7);
         out = PCKEV_XORI128_UB(vec0, vec1);
-        ST8x2_UB(out, dst, dst_stride);
+        ST_D2(out, 0, 1, dst, dst_stride);
         dst += (2 * dst_stride);
     }
 }
@@ -2182,7 +2175,7 @@
         SAT_SH4_SH(out0, out1, out2, out3, 7);
         tmp0 = PCKEV_XORI128_UB(out0, out1);
         tmp1 = PCKEV_XORI128_UB(out2, out3);
-        ST8x4_UB(tmp0, tmp1, dst, dst_stride);
+        ST_D4(tmp0, tmp1, 0, 1, 0, 1, dst, dst_stride);
         dst += (4 * dst_stride);
     }
 }
@@ -2235,7 +2228,7 @@
         SRARI_H2_SH(out0, out1, 6);
         SAT_SH2_SH(out0, out1, 7);
         tmp0 = PCKEV_XORI128_UB(out0, out1);
-        ST4x4_UB(tmp0, tmp0, 0, 1, 2, 3, dst + 8, dst_stride);
+        ST_W4(tmp0, 0, 1, 2, 3, dst + 8, dst_stride);
 
         VSHF_B2_SB(src0, src0, src1, src1, mask0, mask0, vec4, vec5);
         VSHF_B2_SB(src2, src2, src3, src3, mask0, mask0, vec6, vec7);
@@ -2249,7 +2242,7 @@
         SAT_SH4_SH(out2, out3, out4, out5, 7);
         tmp0 = PCKEV_XORI128_UB(out2, out3);
         tmp1 = PCKEV_XORI128_UB(out4, out5);
-        ST8x4_UB(tmp0, tmp1, dst, dst_stride);
+        ST_D4(tmp0, tmp1, 0, 1, 0, 1, dst, dst_stride);
         dst += (4 * dst_stride);
     }
 }
@@ -2395,7 +2388,7 @@
         SAT_SH4_SH(out0, out1, out2, out3, 7);
         tmp0 = PCKEV_XORI128_UB(out0, out1);
         tmp1 = PCKEV_XORI128_UB(out2, out3);
-        ST8x4_UB(tmp0, tmp1, dst1, dst_stride);
+        ST_D4(tmp0, tmp1, 0, 1, 0, 1, dst1, dst_stride);
         dst1 += (4 * dst_stride);
     }
 }
@@ -2496,7 +2489,7 @@
     out10 = __msa_srari_h(out10, 6);
     out10 = __msa_sat_s_h(out10, 7);
     out = PCKEV_XORI128_UB(out10, out10);
-    ST4x2_UB(out, dst, dst_stride);
+    ST_W2(out, 0, 1, dst, dst_stride);
 }
 
 static void common_vt_4t_4x4multiple_msa(uint8_t *src, int32_t src_stride,
@@ -2540,7 +2533,7 @@
         SRARI_H2_SH(out10, out32, 6);
         SAT_SH2_SH(out10, out32, 7);
         out = PCKEV_XORI128_UB(out10, out32);
-        ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
+        ST_W4(out, 0, 1, 2, 3, dst, dst_stride);
         dst += (4 * dst_stride);
     }
 }
@@ -2596,7 +2589,10 @@
     SAT_SH4_SH(dst0_r, dst1_r, dst2_r, dst3_r, 7);
     out0 = PCKEV_XORI128_UB(dst0_r, dst1_r);
     out1 = PCKEV_XORI128_UB(dst2_r, dst3_r);
-    ST6x4_UB(out0, out1, dst, dst_stride);
+    ST_W2(out0, 0, 2, dst, dst_stride);
+    ST_H2(out0, 2, 6, dst + 4, dst_stride);
+    ST_W2(out1, 0, 2, dst + 2 * dst_stride, dst_stride);
+    ST_H2(out1, 2, 6, dst + 2 * dst_stride + 4, dst_stride);
     dst += (4 * dst_stride);
 
     LD_SB2(src, src_stride, src3, src4);
@@ -2619,7 +2615,10 @@
     SAT_SH4_SH(dst0_r, dst1_r, dst2_r, dst3_r, 7);
     out0 = PCKEV_XORI128_UB(dst0_r, dst1_r);
     out1 = PCKEV_XORI128_UB(dst2_r, dst3_r);
-    ST6x4_UB(out0, out1, dst, dst_stride);
+    ST_W2(out0, 0, 2, dst, dst_stride);
+    ST_H2(out0, 2, 6, dst + 4, dst_stride);
+    ST_W2(out1, 0, 2, dst + 2 * dst_stride, dst_stride);
+    ST_H2(out1, 2, 6, dst + 2 * dst_stride + 4, dst_stride);
 }
 
 static void common_vt_4t_8x2_msa(uint8_t *src, int32_t src_stride,
@@ -2645,7 +2644,7 @@
     SRARI_H2_SH(tmp0, tmp1, 6);
     SAT_SH2_SH(tmp0, tmp1, 7);
     out = PCKEV_XORI128_UB(tmp0, tmp1);
-    ST8x2_UB(out, dst, dst_stride);
+    ST_D2(out, 0, 1, dst, dst_stride);
 }
 
 static void common_vt_4t_8x6_msa(uint8_t *src, int32_t src_stride,
@@ -2737,7 +2736,7 @@
         SAT_SH4_SH(out0_r, out1_r, out2_r, out3_r, 7);
         tmp0 = PCKEV_XORI128_UB(out0_r, out1_r);
         tmp1 = PCKEV_XORI128_UB(out2_r, out3_r);
-        ST8x4_UB(tmp0, tmp1, dst, dst_stride);
+        ST_D4(tmp0, tmp1, 0, 1, 0, 1, dst, dst_stride);
         dst += (4 * dst_stride);
 
         src10_r = src98_r;
@@ -2811,9 +2810,9 @@
         SAT_SH2_SH(dst0_l, dst1_l, 7);
         out0 = PCKEV_XORI128_UB(dst0_r, dst1_r);
         out1 = PCKEV_XORI128_UB(dst2_r, dst3_r);
-        ST8x4_UB(out0, out1, dst, dst_stride);
+        ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
         out0 = PCKEV_XORI128_UB(dst0_l, dst1_l);
-        ST4x4_UB(out0, out0, 0, 1, 2, 3, dst + 8, dst_stride);
+        ST_W4(out0, 0, 1, 2, 3, dst + 8, dst_stride);
         dst += (4 * dst_stride);
 
         src2 = src6;
@@ -2982,12 +2981,12 @@
         out = PCKEV_XORI128_UB(out0_r, out0_l);
         ST_UB(out, dst);
         out = PCKEV_XORI128_UB(out2_r, out2_r);
-        ST8x1_UB(out, dst + 16);
+        ST_D1(out, 0, dst + 16);
         dst += dst_stride;
         out = PCKEV_XORI128_UB(out1_r, out1_l);
         ST_UB(out, dst);
         out = PCKEV_XORI128_UB(out3_r, out3_r);
-        ST8x1_UB(out, dst + 16);
+        ST_D1(out, 0, dst + 16);
         dst += dst_stride;
     }
 }
@@ -3137,7 +3136,7 @@
     tmp = __msa_srari_h(tmp, 6);
     tmp = __msa_sat_s_h(tmp, 7);
     out = PCKEV_XORI128_UB(tmp, tmp);
-    ST4x2_UB(out, dst, dst_stride);
+    ST_W2(out, 0, 1, dst, dst_stride);
 }
 
 static void hevc_hv_uni_4t_4x4_msa(uint8_t *src,
@@ -3196,7 +3195,7 @@
     SRARI_H2_SH(tmp0, tmp1, 6);
     SAT_SH2_SH(tmp0, tmp1, 7);
     out = PCKEV_XORI128_UB(tmp0, tmp1);
-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
+    ST_W4(out, 0, 1, 2, 3, dst, dst_stride);
 }
 
 static void hevc_hv_uni_4t_4multx8mult_msa(uint8_t *src,
@@ -3288,7 +3287,7 @@
         SAT_SH4_SH(tmp0, tmp1, tmp2, tmp3, 7);
         out0 = PCKEV_XORI128_UB(tmp0, tmp1);
         out1 = PCKEV_XORI128_UB(tmp2, tmp3);
-        ST4x8_UB(out0, out1, dst, dst_stride);
+        ST_W8(out0, out1, 0, 1, 2, 3, 0, 1, 2, 3, dst, dst_stride);
         dst += (8 * dst_stride);
 
         dst10_r = dst98_r;
@@ -3432,10 +3431,8 @@
     out0 = PCKEV_XORI128_UB(tmp0, tmp1);
     out1 = PCKEV_XORI128_UB(tmp2, tmp3);
     out2 = PCKEV_XORI128_UB(tmp4, tmp5);
-    ST4x8_UB(out0, out1, dst, dst_stride);
-    ST2x4_UB(out2, 0, dst + 4, dst_stride);
-    dst += 4 * dst_stride;
-    ST2x4_UB(out2, 4, dst + 4, dst_stride);
+    ST_W8(out0, out1, 0, 1, 2, 3, 0, 1, 2, 3, dst, dst_stride);
+    ST_H8(out2, 0, 1, 2, 3, 4, 5, 6, 7, dst + 4, dst_stride);
 }
 
 static void hevc_hv_uni_4t_8x2_msa(uint8_t *src,
@@ -3497,7 +3494,7 @@
     SRARI_H2_SH(out0_r, out1_r, 6);
     SAT_SH2_SH(out0_r, out1_r, 7);
     out = PCKEV_XORI128_UB(out0_r, out1_r);
-    ST8x2_UB(out, dst, dst_stride);
+    ST_D2(out, 0, 1, dst, dst_stride);
 }
 
 static void hevc_hv_uni_4t_8multx4_msa(uint8_t *src,
@@ -3580,7 +3577,7 @@
         SAT_SH4_SH(tmp0, tmp1, tmp2, tmp3, 7);
         out0 = PCKEV_XORI128_UB(tmp0, tmp1);
         out1 = PCKEV_XORI128_UB(tmp2, tmp3);
-        ST8x4_UB(out0, out1, dst, dst_stride);
+        ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
         dst += 8;
     }
 }
@@ -3684,9 +3681,8 @@
     out1 = PCKEV_XORI128_UB(out2_r, out3_r);
     out2 = PCKEV_XORI128_UB(out4_r, out5_r);
 
-    ST8x4_UB(out0, out1, dst, dst_stride);
-    dst += (4 * dst_stride);
-    ST8x2_UB(out2, dst, dst_stride);
+    ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
+    ST_D2(out2, 0, 1, dst + 4 * dst_stride, dst_stride);
 }
 
 static void hevc_hv_uni_4t_8multx4mult_msa(uint8_t *src,
@@ -3788,7 +3784,7 @@
             SAT_SH4_SH(out0_r, out1_r, out2_r, out3_r, 7);
             out0 = PCKEV_XORI128_UB(out0_r, out1_r);
             out1 = PCKEV_XORI128_UB(out2_r, out3_r);
-            ST8x4_UB(out0, out1, dst_tmp, dst_stride);
+            ST_D4(out0, out1, 0, 1, 0, 1, dst_tmp, dst_stride);
             dst_tmp += (4 * dst_stride);
 
             dst10_r = dst54_r;
@@ -3919,7 +3915,7 @@
         SAT_SH4_SH(tmp0, tmp1, tmp2, tmp3, 7);
         out0 = PCKEV_XORI128_UB(tmp0, tmp1);
         out1 = PCKEV_XORI128_UB(tmp2, tmp3);
-        ST8x4_UB(out0, out1, dst_tmp, dst_stride);
+        ST_D4(out0, out1, 0, 1, 0, 1, dst_tmp, dst_stride);
         dst_tmp += (4 * dst_stride);
 
         dst10_r = dst54_r;
@@ -3985,7 +3981,7 @@
         SAT_SH4_SH(tmp0, tmp1, tmp2, tmp3, 7);
         out0 = PCKEV_XORI128_UB(tmp0, tmp1);
         out1 = PCKEV_XORI128_UB(tmp2, tmp3);
-        ST4x8_UB(out0, out1, dst, dst_stride);
+        ST_W8(out0, out1, 0, 1, 2, 3, 0, 1, 2, 3, dst, dst_stride);
         dst += (8 * dst_stride);
 
         dst10_r = dst98_r;
diff --git a/libavcodec/mips/hevc_mc_uniw_msa.c b/libavcodec/mips/hevc_mc_uniw_msa.c
index f9ecb41..1a8c251 100644
--- a/libavcodec/mips/hevc_mc_uniw_msa.c
+++ b/libavcodec/mips/hevc_mc_uniw_msa.c
@@ -41,7 +41,7 @@
     SRAR_W4_SW(in0_r_m, in1_r_m, in0_l_m, in1_l_m, rnd_w);                    \
     PCKEV_H2_SH(in0_l_m, in0_r_m, in1_l_m, in1_r_m, out0_h, out1_h);          \
     ADDS_SH2_SH(out0_h, offset_h, out1_h, offset_h, out0_h, out1_h);          \
-    CLIP_SH2_0_255_MAX_SATU(out0_h, out1_h);                                  \
+    CLIP_SH2_0_255(out0_h, out1_h);                                           \
 }
 
 #define HEVC_UNIW_RND_CLIP4_MAX_SATU_H(in0_h, in1_h, in2_h, in3_h, wgt_w,  \
@@ -88,9 +88,9 @@
         SRAR_W2_SW(dst0_r, dst0_l, rnd_vec);
         dst0 = __msa_pckev_h((v8i16) dst0_l, (v8i16) dst0_r);
         dst0 += offset_vec;
-        dst0 = CLIP_SH_0_255_MAX_SATU(dst0);
+        CLIP_SH_0_255(dst0);
         out0 = (v16u8) __msa_pckev_b((v16i8) dst0, (v16i8) dst0);
-        ST4x2_UB(out0, dst, dst_stride);
+        ST_W2(out0, 0, 1, dst, dst_stride);
     } else if (4 == height) {
         LW4(src, src_stride, tp0, tp1, tp2, tp3);
         INSERT_W4_SB(tp0, tp1, tp2, tp3, src0);
@@ -99,7 +99,7 @@
         HEVC_UNIW_RND_CLIP2_MAX_SATU_H(dst0, dst1, weight_vec, offset_vec,
                                        rnd_vec, dst0, dst1);
         out0 = (v16u8) __msa_pckev_b((v16i8) dst1, (v16i8) dst0);
-        ST4x4_UB(out0, out0, 0, 1, 2, 3, dst, dst_stride);
+        ST_W4(out0, 0, 1, 2, 3, dst, dst_stride);
     } else if (0 == (height % 8)) {
         for (loop_cnt = (height >> 3); loop_cnt--;) {
             LW4(src, src_stride, tp0, tp1, tp2, tp3);
@@ -115,7 +115,7 @@
                                            offset_vec, rnd_vec, dst0, dst1,
                                            dst2, dst3);
             PCKEV_B2_UB(dst1, dst0, dst3, dst2, out0, out1);
-            ST4x8_UB(out0, out1, dst, dst_stride);
+            ST_W8(out0, out1, 0, 1, 2, 3, 0, 1, 2, 3, dst, dst_stride);
             dst += 8 * dst_stride;
         }
     }
@@ -170,9 +170,15 @@
         PCKEV_B2_UB(dst1, dst0, dst3, dst2, out0, out1);
         PCKEV_B2_UB(dst5, dst4, dst7, dst6, out2, out3);
 
-        ST6x4_UB(out0, out1, dst, dst_stride);
+        ST_W2(out0, 0, 2, dst, dst_stride);
+        ST_H2(out0, 2, 6, dst + 4, dst_stride);
+        ST_W2(out1, 0, 2, dst + 2 * dst_stride, dst_stride);
+        ST_H2(out1, 2, 6, dst + 2 * dst_stride + 4, dst_stride);
         dst += (4 * dst_stride);
-        ST6x4_UB(out2, out3, dst, dst_stride);
+        ST_W2(out2, 0, 2, dst, dst_stride);
+        ST_H2(out2, 2, 6, dst + 4, dst_stride);
+        ST_W2(out3, 0, 2, dst + 2 * dst_stride, dst_stride);
+        ST_H2(out3, 2, 6, dst + 2 * dst_stride + 4, dst_stride);
         dst += (4 * dst_stride);
     }
 }
@@ -207,7 +213,7 @@
         HEVC_UNIW_RND_CLIP2_MAX_SATU_H(dst0, dst1, weight_vec, offset_vec,
                                        rnd_vec, dst0, dst1);
         out0 = (v16u8) __msa_pckev_b((v16i8) dst1, (v16i8) dst0);
-        ST8x2_UB(out0, dst, dst_stride);
+        ST_D2(out0, 0, 1, dst, dst_stride);
     } else if (4 == height) {
         LD4(src, src_stride, tp0, tp1, tp2, tp3);
         INSERT_D2_SB(tp0, tp1, src0);
@@ -219,7 +225,7 @@
                                        offset_vec, rnd_vec, dst0, dst1, dst2,
                                        dst3);
         PCKEV_B2_UB(dst1, dst0, dst3, dst2, out0, out1);
-        ST8x4_UB(out0, out1, dst, dst_stride);
+        ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
     } else if (6 == height) {
         LD4(src, src_stride, tp0, tp1, tp2, tp3);
         src += 4 * src_stride;
@@ -238,9 +244,8 @@
         HEVC_UNIW_RND_CLIP2_MAX_SATU_H(dst4, dst5, weight_vec, offset_vec,
                                        rnd_vec, dst4, dst5);
         PCKEV_B3_UB(dst1, dst0, dst3, dst2, dst5, dst4, out0, out1, out2);
-        ST8x4_UB(out0, out1, dst, dst_stride);
-        dst += (4 * dst_stride);
-        ST8x2_UB(out2, dst, dst_stride);
+        ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
+        ST_D2(out2, 0, 1, dst + 4 * dst_stride, dst_stride);
     } else if (0 == height % 8) {
         for (loop_cnt = (height >> 3); loop_cnt--;) {
             LD4(src, src_stride, tp0, tp1, tp2, tp3);
@@ -266,10 +271,9 @@
                                            dst6, dst7);
             PCKEV_B2_UB(dst1, dst0, dst3, dst2, out0, out1);
             PCKEV_B2_UB(dst5, dst4, dst7, dst6, out2, out3);
-            ST8x4_UB(out0, out1, dst, dst_stride);
-            dst += (4 * dst_stride);
-            ST8x4_UB(out2, out3, dst, dst_stride);
-            dst += (4 * dst_stride);
+            ST_D8(out0, out1, out2, out3, 0, 1, 0, 1, 0, 1, 0, 1,
+                  dst, dst_stride);
+            dst += (8 * dst_stride);
         }
     }
 }
@@ -313,7 +317,8 @@
                                        rnd_vec, dst4, dst5);
 
         PCKEV_B3_UB(dst1, dst0, dst3, dst2, dst5, dst4, out0, out1, out2);
-        ST12x4_UB(out0, out1, out2, dst, dst_stride);
+        ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
+        ST_W4(out2, 0, 1, 2, 3, dst + 8, dst_stride);
         dst += (4 * dst_stride);
     }
 }
@@ -409,7 +414,7 @@
         PCKEV_B3_UB(dst1, dst0, dst3, dst2, dst5, dst4, out0, out1, out2);
         PCKEV_B3_UB(dst7, dst6, dst9, dst8, dst11, dst10, out3, out4, out5);
         ST_UB4(out0, out1, out3, out4, dst, dst_stride);
-        ST8x4_UB(out2, out5, dst + 16, dst_stride);
+        ST_D4(out2, out5, 0, 1, 0, 1, dst + 16, dst_stride);
         dst += (4 * dst_stride);
     }
 }
@@ -651,7 +656,7 @@
                                        dst3);
 
         PCKEV_B2_UB(dst1, dst0, dst3, dst2, out0, out1);
-        ST4x8_UB(out0, out1, dst, dst_stride);
+        ST_W8(out0, out1, 0, 1, 2, 3, 0, 1, 2, 3, dst, dst_stride);
         dst += (8 * dst_stride);
     }
 }
@@ -729,7 +734,7 @@
                                        dst3);
 
         PCKEV_B2_UB(dst1, dst0, dst3, dst2, out0, out1);
-        ST8x4_UB(out0, out1, dst, dst_stride);
+        ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
         dst += (4 * dst_stride);
     }
 }
@@ -822,8 +827,8 @@
                                        rnd_vec, dst4, dst5);
 
         PCKEV_B3_UB(dst1, dst0, dst3, dst2, dst5, dst4, out0, out1, out2);
-        ST8x4_UB(out0, out1, dst, dst_stride);
-        ST4x4_UB(out2, out2, 0, 1, 2, 3, dst + 8, dst_stride);
+        ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
+        ST_W4(out2, 0, 1, 2, 3, dst + 8, dst_stride);
         dst += (4 * dst_stride);
     }
 }
@@ -994,7 +999,7 @@
 
         PCKEV_B3_UB(dst1, dst0, dst4, dst3, dst5, dst2, out0, out1, out2);
         ST_UB2(out0, out1, dst, dst_stride);
-        ST8x2_UB(out2, dst + 16, dst_stride);
+        ST_D2(out2, 0, 1, dst + 16, dst_stride);
         dst += (2 * dst_stride);
     }
 }
@@ -1368,7 +1373,7 @@
                                        dst3);
 
         PCKEV_B2_UB(dst1, dst0, dst3, dst2, out0, out1);
-        ST4x8_UB(out0, out1, dst, dst_stride);
+        ST_W8(out0, out1, 0, 1, 2, 3, 0, 1, 2, 3, dst, dst_stride);
         dst += (8 * dst_stride);
 
         src2110 = src10998;
@@ -1444,7 +1449,7 @@
                                        dst3);
 
         PCKEV_B2_UB(dst1, dst0, dst3, dst2, out0, out1);
-        ST8x4_UB(out0, out1, dst, dst_stride);
+        ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
         dst += (4 * dst_stride);
 
         src10_r = src54_r;
@@ -1543,8 +1548,8 @@
                                        rnd_vec, dst4, dst5);
 
         PCKEV_B3_UB(dst1, dst0, dst3, dst2, dst5, dst4, out0, out1, out2);
-        ST8x4_UB(out0, out1, dst, dst_stride);
-        ST4x4_UB(out2, out2, 0, 1, 2, 3, dst + 8, dst_stride);
+        ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
+        ST_W4(out2, 0, 1, 2, 3, dst + 8, dst_stride);
         dst += (4 * dst_stride);
 
         src10_r = src54_r;
@@ -1858,10 +1863,10 @@
         SRAR_W4_SW(dst0_r, dst1_r, dst2_r, dst3_r, rnd_vec);
         ADD2(dst0_r, offset_vec, dst1_r, offset_vec, dst0_r, dst1_r);
         ADD2(dst2_r, offset_vec, dst3_r, offset_vec, dst2_r, dst3_r);
-        CLIP_SW4_0_255_MAX_SATU(dst0_r, dst1_r, dst2_r, dst3_r);
+        CLIP_SW4_0_255(dst0_r, dst1_r, dst2_r, dst3_r);
         PCKEV_H2_SW(dst1_r, dst0_r, dst3_r, dst2_r, dst0_r, dst1_r);
         out = (v16u8) __msa_pckev_b((v16i8) dst1_r, (v16i8) dst0_r);
-        ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
+        ST_W4(out, 0, 1, 2, 3, dst, dst_stride);
         dst += (4 * dst_stride);
 
         dst10_r = dst54_r;
@@ -2009,11 +2014,11 @@
             SRAR_W4_SW(dst0_r, dst1_r, dst0_l, dst1_l, rnd_vec);
             ADD2(dst0_r, offset_vec, dst0_l, offset_vec, dst0_r, dst0_l);
             ADD2(dst1_r, offset_vec, dst1_l, offset_vec, dst1_r, dst1_l);
-            CLIP_SW4_0_255_MAX_SATU(dst0_r, dst1_r, dst0_l, dst1_l);
+            CLIP_SW4_0_255(dst0_r, dst1_r, dst0_l, dst1_l);
 
             PCKEV_H2_SW(dst0_l, dst0_r, dst1_l, dst1_r, dst0_r, dst1_r);
             dst0_r = (v4i32) __msa_pckev_b((v16i8) dst1_r, (v16i8) dst0_r);
-            ST8x2_UB(dst0_r, dst_tmp, dst_stride);
+            ST_D2(dst0_r, 0, 1, dst_tmp, dst_stride);
             dst_tmp += (2 * dst_stride);
 
             dst10_r = dst32_r;
@@ -2160,10 +2165,10 @@
         MUL2(dst0_r, weight_vec, dst0_l, weight_vec, dst0_r, dst0_l);
         SRAR_W2_SW(dst0_r, dst0_l, rnd_vec);
         ADD2(dst0_r, offset_vec, dst0_l, offset_vec, dst0_r, dst0_l);
-        CLIP_SW2_0_255_MAX_SATU(dst0_r, dst0_l);
+        CLIP_SW2_0_255(dst0_r, dst0_l);
         dst0_r = (v4i32) __msa_pckev_h((v8i16) dst0_l, (v8i16) dst0_r);
         out = (v16u8) __msa_pckev_b((v16i8) dst0_r, (v16i8) dst0_r);
-        ST8x1_UB(out, dst_tmp);
+        ST_D1(out, 0, dst_tmp);
         dst_tmp += dst_stride;
 
         dst0 = dst1;
@@ -2241,10 +2246,10 @@
         SRAR_W4_SW(dst0_r, dst1_r, dst2_r, dst3_r, rnd_vec);
         ADD2(dst0_r, offset_vec, dst1_r, offset_vec, dst0_r, dst1_r);
         ADD2(dst2_r, offset_vec, dst3_r, offset_vec, dst2_r, dst3_r);
-        CLIP_SW4_0_255_MAX_SATU(dst0_r, dst1_r, dst2_r, dst3_r);
+        CLIP_SW4_0_255(dst0_r, dst1_r, dst2_r, dst3_r);
         PCKEV_H2_SW(dst1_r, dst0_r, dst3_r, dst2_r, dst0_r, dst1_r);
         out = (v16u8) __msa_pckev_b((v16i8) dst1_r, (v16i8) dst0_r);
-        ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
+        ST_W4(out, 0, 1, 2, 3, dst, dst_stride);
         dst += (4 * dst_stride);
 
         dst10_r = dst54_r;
@@ -2389,9 +2394,9 @@
     SRAR_W2_SW(dst0_r, dst0_l, rnd_vec);
     dst0 = __msa_pckev_h((v8i16) dst0_l, (v8i16) dst0_r);
     dst0 = __msa_adds_s_h(dst0, offset_vec);
-    dst0 = CLIP_SH_0_255_MAX_SATU(dst0);
+    CLIP_SH_0_255(dst0);
     out = (v16u8) __msa_pckev_b((v16i8) dst0, (v16i8) dst0);
-    ST4x2_UB(out, dst, dst_stride);
+    ST_W2(out, 0, 1, dst, dst_stride);
     dst += (4 * dst_stride);
 }
 
@@ -2448,7 +2453,7 @@
                                    dst0, dst1);
 
     out = (v16u8) __msa_pckev_b((v16i8) dst1, (v16i8) dst0);
-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
+    ST_W4(out, 0, 1, 2, 3, dst, dst_stride);
     dst += (4 * dst_stride);
 }
 
@@ -2515,7 +2520,7 @@
                                        dst0, dst1, dst2, dst3);
 
         PCKEV_B2_UB(dst1, dst0, dst3, dst2, out0, out1);
-        ST4x8_UB(out0, out1, dst, dst_stride);
+        ST_W8(out0, out1, 0, 1, 2, 3, 0, 1, 2, 3, dst, dst_stride);
         dst += (8 * dst_stride);
     }
 }
@@ -2613,9 +2618,15 @@
 
     PCKEV_B2_UB(dst1, dst0, dst3, dst2, out0, out1);
     PCKEV_B2_UB(dst5, dst4, dst7, dst6, out2, out3);
-    ST6x4_UB(out0, out1, dst, dst_stride);
+    ST_W2(out0, 0, 2, dst, dst_stride);
+    ST_H2(out0, 2, 6, dst + 4, dst_stride);
+    ST_W2(out1, 0, 2, dst + 2 * dst_stride, dst_stride);
+    ST_H2(out1, 2, 6, dst + 2 * dst_stride + 4, dst_stride);
     dst += (4 * dst_stride);
-    ST6x4_UB(out2, out3, dst, dst_stride);
+    ST_W2(out2, 0, 2, dst, dst_stride);
+    ST_H2(out2, 2, 6, dst + 4, dst_stride);
+    ST_W2(out3, 0, 2, dst + 2 * dst_stride, dst_stride);
+    ST_H2(out3, 2, 6, dst + 2 * dst_stride + 4, dst_stride);
 }
 
 static void hevc_hz_uniwgt_4t_8x2_msa(uint8_t *src,
@@ -2670,7 +2681,7 @@
                                    dst0, dst1);
 
     out = (v16u8) __msa_pckev_b((v16i8) dst1, (v16i8) dst0);
-    ST8x2_UB(out, dst, dst_stride);
+    ST_D2(out, 0, 1, dst, dst_stride);
 }
 
 static void hevc_hz_uniwgt_4t_8x4_msa(uint8_t *src,
@@ -2727,7 +2738,7 @@
                                    dst0, dst1, dst2, dst3);
 
     PCKEV_B2_UB(dst1, dst0, dst3, dst2, out0, out1);
-    ST8x4_UB(out0, out1, dst, dst_stride);
+    ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
 }
 
 static void hevc_hz_uniwgt_4t_8x6_msa(uint8_t *src,
@@ -2796,9 +2807,8 @@
                                    dst4, dst5);
 
     PCKEV_B3_UB(dst1, dst0, dst3, dst2, dst5, dst4, out0, out1, out2);
-    ST8x4_UB(out0, out1, dst, dst_stride);
-    dst += (4 * dst_stride);
-    ST8x2_UB(out2, dst, dst_stride);
+    ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
+    ST_D2(out2, 0, 1, dst + 4 * dst_stride, dst_stride);
 }
 
 static void hevc_hz_uniwgt_4t_8x8multiple_msa(uint8_t *src,
@@ -2876,7 +2886,7 @@
 
         PCKEV_B2_UB(dst1, dst0, dst3, dst2, out0, out1);
         PCKEV_B2_UB(dst5, dst4, dst7, dst6, out2, out3);
-        ST8x8_UB(out0, out1, out2, out3, dst, dst_stride);
+        ST_D8(out0, out1, out2, out3, 0, 1, 0, 1, 0, 1, 0, 1, dst, dst_stride);
         dst += (8 * dst_stride);
     }
 }
@@ -2981,7 +2991,8 @@
                                        rnd_vec, dst4, dst5);
 
         PCKEV_B3_UB(dst1, dst0, dst3, dst2, dst5, dst4, out0, out1, out2);
-        ST12x4_UB(out0, out1, out2, dst, dst_stride);
+        ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
+        ST_W4(out2, 0, 1, 2, 3, dst + 8, dst_stride);
         dst += (4 * dst_stride);
     }
 }
@@ -3142,7 +3153,7 @@
 
         PCKEV_B3_UB(dst1, dst0, dst3, dst2, dst5, dst4, out0, out1, out2);
         ST_UB2(out0, out1, dst, dst_stride);
-        ST8x2_UB(out2, dst + 16, dst_stride);
+        ST_D2(out2, 0, 1, dst + 16, dst_stride);
         dst += (2 * dst_stride);
     }
 }
@@ -3284,9 +3295,9 @@
     SRAR_W2_SW(dst0_r, dst0_l, rnd_vec);
     dst0 = __msa_pckev_h((v8i16) dst0_l, (v8i16) dst0_r);
     dst0 = __msa_adds_s_h(dst0, offset_vec);
-    dst0 = CLIP_SH_0_255_MAX_SATU(dst0);
+    CLIP_SH_0_255(dst0);
     out = (v16u8) __msa_pckev_b((v16i8) dst0, (v16i8) dst0);
-    ST4x2_UB(out, dst, dst_stride);
+    ST_W2(out, 0, 1, dst, dst_stride);
 }
 
 static void hevc_vt_uniwgt_4t_4x4_msa(uint8_t *src,
@@ -3340,7 +3351,7 @@
                                    dst0, dst1);
 
     out = (v16u8) __msa_pckev_b((v16i8) dst1, (v16i8) dst0);
-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
+    ST_W4(out, 0, 1, 2, 3, dst, dst_stride);
 }
 
 static void hevc_vt_uniwgt_4t_4x8multiple_msa(uint8_t *src,
@@ -3411,7 +3422,7 @@
                                        dst0, dst1, dst2, dst3);
 
         PCKEV_B2_UB(dst1, dst0, dst3, dst2, out0, out1);
-        ST4x8_UB(out0, out1, dst, dst_stride);
+        ST_W8(out0, out1, 0, 1, 2, 3, 0, 1, 2, 3, dst, dst_stride);
         dst += (8 * dst_stride);
 
         src2 = src10;
@@ -3509,9 +3520,15 @@
 
     PCKEV_B2_UB(dst1, dst0, dst3, dst2, out0, out1);
     PCKEV_B2_UB(dst5, dst4, dst7, dst6, out2, out3);
-    ST6x4_UB(out0, out1, dst, dst_stride);
+    ST_W2(out0, 0, 2, dst, dst_stride);
+    ST_H2(out0, 2, 6, dst + 4, dst_stride);
+    ST_W2(out1, 0, 2, dst + 2 * dst_stride, dst_stride);
+    ST_H2(out1, 2, 6, dst + 2 * dst_stride + 4, dst_stride);
     dst += (4 * dst_stride);
-    ST6x4_UB(out2, out3, dst, dst_stride);
+    ST_W2(out2, 0, 2, dst, dst_stride);
+    ST_H2(out2, 2, 6, dst + 4, dst_stride);
+    ST_W2(out3, 0, 2, dst + 2 * dst_stride, dst_stride);
+    ST_H2(out3, 2, 6, dst + 2 * dst_stride + 4, dst_stride);
 }
 
 static void hevc_vt_uniwgt_4t_8x2_msa(uint8_t *src,
@@ -3562,7 +3579,7 @@
                                    dst0, dst1);
 
     out = (v16u8) __msa_pckev_b((v16i8) dst1, (v16i8) dst0);
-    ST8x2_UB(out, dst, dst_stride);
+    ST_D2(out, 0, 1, dst, dst_stride);
 }
 
 static void hevc_vt_uniwgt_4t_8x4_msa(uint8_t *src,
@@ -3617,7 +3634,7 @@
                                    offset_vec, rnd_vec, dst0, dst1, dst2,
                                    dst3);
     PCKEV_B2_UB(dst1, dst0, dst3, dst2, out0, out1);
-    ST8x4_UB(out0, out1, dst, dst_stride);
+    ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
 }
 
 static void hevc_vt_uniwgt_4t_8x6_msa(uint8_t *src,
@@ -3679,9 +3696,8 @@
     HEVC_UNIW_RND_CLIP2_MAX_SATU_H(dst4, dst5, weight_vec, offset_vec, rnd_vec,
                                    dst4, dst5);
     PCKEV_B3_UB(dst1, dst0, dst3, dst2, dst5, dst4, out0, out1, out2);
-    ST8x4_UB(out0, out1, dst, dst_stride);
-    dst += (4 * dst_stride);
-    ST8x2_UB(out2, dst, dst_stride);
+    ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
+    ST_D2(out2, 0, 1, dst + 4 * dst_stride, dst_stride);
 }
 
 static void hevc_vt_uniwgt_4t_8x8mult_msa(uint8_t *src,
@@ -3754,7 +3770,7 @@
                                        dst7);
         PCKEV_B2_UB(dst1, dst0, dst3, dst2, out0, out1);
         PCKEV_B2_UB(dst5, dst4, dst7, dst6, out2, out3);
-        ST8x8_UB(out0, out1, out2, out3, dst, dst_stride);
+        ST_D8(out0, out1, out2, out3, 0, 1, 0, 1, 0, 1, 0, 1, dst, dst_stride);
         dst += (8 * dst_stride);
 
         src2 = src10;
@@ -3861,7 +3877,8 @@
         HEVC_UNIW_RND_CLIP2_MAX_SATU_H(dst4, dst5, weight_vec, offset_vec,
                                        rnd_vec, dst4, dst5);
         PCKEV_B3_UB(dst1, dst0, dst3, dst2, dst5, dst4, out0, out1, out2);
-        ST12x4_UB(out0, out1, out2, dst, dst_stride);
+        ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
+        ST_W4(out2, 0, 1, 2, 3, dst + 8, dst_stride);
         dst += (4 * dst_stride);
 
         ILVRL_B2_SB(src7, src6, src76_r, src76_l);
@@ -3882,7 +3899,8 @@
         HEVC_UNIW_RND_CLIP2_MAX_SATU_H(dst10, dst11, weight_vec, offset_vec,
                                        rnd_vec, dst10, dst11);
         PCKEV_B3_UB(dst7, dst6, dst9, dst8, dst11, dst10, out3, out4, out5);
-        ST12x4_UB(out3, out4, out5, dst, dst_stride);
+        ST_D4(out3, out4, 0, 1, 0, 1, dst, dst_stride);
+        ST_W4(out5, 0, 1, 2, 3, dst + 8, dst_stride);
         dst += (4 * dst_stride);
 
         src2 = src10;
@@ -4062,7 +4080,7 @@
                     out2, out3);
         PCKEV_B2_UB(dst9, dst8, dst11, dst10, out4, out5);
         ST_UB4(out0, out1, out2, out3, dst, dst_stride);
-        ST8x4_UB(out4, out5, dst + 16, dst_stride);
+        ST_D4(out4, out5, 0, 1, 0, 1, dst + 16, dst_stride);
         dst += (4 * dst_stride);
 
         src2 = src6;
@@ -4229,9 +4247,9 @@
     SRAR_W2_SW(dst0, dst1, rnd_vec);
     tmp = __msa_pckev_h((v8i16) dst1, (v8i16) dst0);
     tmp += offset_vec;
-    tmp = CLIP_SH_0_255_MAX_SATU(tmp);
+    CLIP_SH_0_255(tmp);
     out = (v16u8) __msa_pckev_b((v16i8) tmp, (v16i8) tmp);
-    ST4x2_UB(out, dst, dst_stride);
+    ST_W2(out, 0, 1, dst, dst_stride);
 }
 
 static void hevc_hv_uniwgt_4t_4x4_msa(uint8_t *src,
@@ -4298,9 +4316,9 @@
     SRAR_W4_SW(dst0, dst1, dst2, dst3, rnd_vec);
     PCKEV_H2_SH(dst1, dst0, dst3, dst2, tmp0, tmp1);
     ADD2(tmp0, offset_vec, tmp1, offset_vec, tmp0, tmp1);
-    CLIP_SH2_0_255_MAX_SATU(tmp0, tmp1);
+    CLIP_SH2_0_255(tmp0, tmp1);
     out = (v16u8) __msa_pckev_b((v16i8) tmp1, (v16i8) tmp0);
-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
+    ST_W4(out, 0, 1, 2, 3, dst, dst_stride);
 }
 
 static void hevc_hv_uniwgt_4t_4multx8mult_msa(uint8_t *src,
@@ -4399,9 +4417,9 @@
                     tmp2, tmp3);
         ADD2(tmp0, offset_vec, tmp1, offset_vec, tmp0, tmp1);
         ADD2(tmp2, offset_vec, tmp3, offset_vec, tmp2, tmp3);
-        CLIP_SH4_0_255_MAX_SATU(tmp0, tmp1, tmp2, tmp3);
+        CLIP_SH4_0_255(tmp0, tmp1, tmp2, tmp3);
         PCKEV_B2_UB(tmp1, tmp0, tmp3, tmp2, out0, out1);
-        ST4x8_UB(out0, out1, dst, dst_stride);
+        ST_W8(out0, out1, 0, 1, 2, 3, 0, 1, 2, 3, dst, dst_stride);
         dst += (8 * dst_stride);
 
         dst10_r = dst98_r;
@@ -4556,13 +4574,11 @@
     ADD2(tmp0, offset_vec, tmp1, offset_vec, tmp0, tmp1);
     ADD2(tmp2, offset_vec, tmp3, offset_vec, tmp2, tmp3);
     ADD2(tmp4, offset_vec, tmp5, offset_vec, tmp4, tmp5);
-    CLIP_SH4_0_255_MAX_SATU(tmp0, tmp1, tmp2, tmp3);
-    CLIP_SH2_0_255_MAX_SATU(tmp4, tmp5);
+    CLIP_SH4_0_255(tmp0, tmp1, tmp2, tmp3);
+    CLIP_SH2_0_255(tmp4, tmp5);
     PCKEV_B3_UB(tmp1, tmp0, tmp3, tmp2, tmp5, tmp4, out0, out1, out2);
-    ST4x8_UB(out0, out1, dst, dst_stride);
-    ST2x4_UB(out2, 0, dst + 4, dst_stride);
-    dst += 4 * dst_stride;
-    ST2x4_UB(out2, 4, dst + 4, dst_stride);
+    ST_W8(out0, out1, 0, 1, 2, 3, 0, 1, 2, 3, dst, dst_stride);
+    ST_H8(out2, 0, 1, 2, 3, 4, 5, 6, 7, dst + 4, dst_stride);
 }
 
 static void hevc_hv_uniwgt_4t_8x2_msa(uint8_t *src,
@@ -4636,9 +4652,9 @@
     SRAR_W4_SW(dst0_r, dst0_l, dst1_r, dst1_l, rnd_vec);
     PCKEV_H2_SH(dst0_l, dst0_r, dst1_l, dst1_r, tmp0, tmp1);
     ADD2(tmp0, offset_vec, tmp1, offset_vec, tmp0, tmp1);
-    CLIP_SH2_0_255_MAX_SATU(tmp0, tmp1);
+    CLIP_SH2_0_255(tmp0, tmp1);
     out = (v16u8) __msa_pckev_b((v16i8) tmp1, (v16i8) tmp0);
-    ST8x2_UB(out, dst, dst_stride);
+    ST_D2(out, 0, 1, dst, dst_stride);
 }
 
 static void hevc_hv_uniwgt_4t_8multx4_msa(uint8_t *src,
@@ -4729,9 +4745,9 @@
                     dst3_r, tmp0, tmp1, tmp2, tmp3);
         ADD2(tmp0, offset_vec, tmp1, offset_vec, tmp0, tmp1);
         ADD2(tmp2, offset_vec, tmp3, offset_vec, tmp2, tmp3);
-        CLIP_SH4_0_255_MAX_SATU(tmp0, tmp1, tmp2, tmp3);
+        CLIP_SH4_0_255(tmp0, tmp1, tmp2, tmp3);
         PCKEV_B2_UB(tmp1, tmp0, tmp3, tmp2, out0, out1);
-        ST8x4_UB(out0, out1, dst, dst_stride);
+        ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
         dst += 8;
     }
 }
@@ -4845,12 +4861,11 @@
     ADD2(tmp0, offset_vec, tmp1, offset_vec, tmp0, tmp1);
     ADD2(tmp2, offset_vec, tmp3, offset_vec, tmp2, tmp3);
     ADD2(tmp4, offset_vec, tmp5, offset_vec, tmp4, tmp5);
-    CLIP_SH4_0_255_MAX_SATU(tmp0, tmp1, tmp2, tmp3);
-    CLIP_SH2_0_255_MAX_SATU(tmp4, tmp5);
+    CLIP_SH4_0_255(tmp0, tmp1, tmp2, tmp3);
+    CLIP_SH2_0_255(tmp4, tmp5);
     PCKEV_B3_UB(tmp1, tmp0, tmp3, tmp2, tmp5, tmp4, out0, out1, out2);
-    ST8x4_UB(out0, out1, dst, dst_stride);
-    dst += (4 * dst_stride);
-    ST8x2_UB(out2, dst, dst_stride);
+    ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
+    ST_D2(out2, 0, 1, dst + 4 * dst_stride, dst_stride);
 }
 
 static void hevc_hv_uniwgt_4t_8multx4mult_msa(uint8_t *src,
@@ -4958,9 +4973,9 @@
                         dst3_r, tmp0, tmp1, tmp2, tmp3);
             ADD2(tmp0, offset_vec, tmp1, offset_vec, tmp0, tmp1);
             ADD2(tmp2, offset_vec, tmp3, offset_vec, tmp2, tmp3);
-            CLIP_SH4_0_255_MAX_SATU(tmp0, tmp1, tmp2, tmp3);
+            CLIP_SH4_0_255(tmp0, tmp1, tmp2, tmp3);
             PCKEV_B2_UB(tmp1, tmp0, tmp3, tmp2, out0, out1);
-            ST8x4_UB(out0, out1, dst_tmp, dst_stride);
+            ST_D4(out0, out1, 0, 1, 0, 1, dst_tmp, dst_stride);
             dst_tmp += (4 * dst_stride);
 
             dst10_r = dst54_r;
@@ -5105,9 +5120,9 @@
                     dst3_r, tmp0, tmp1, tmp2, tmp3);
         ADD2(tmp0, offset_vec, tmp1, offset_vec, tmp0, tmp1);
         ADD2(tmp2, offset_vec, tmp3, offset_vec, tmp2, tmp3);
-        CLIP_SH4_0_255_MAX_SATU(tmp0, tmp1, tmp2, tmp3);
+        CLIP_SH4_0_255(tmp0, tmp1, tmp2, tmp3);
         PCKEV_B2_UB(tmp1, tmp0, tmp3, tmp2, out0, out1);
-        ST8x4_UB(out0, out1, dst_tmp, dst_stride);
+        ST_D4(out0, out1, 0, 1, 0, 1, dst_tmp, dst_stride);
         dst_tmp += (4 * dst_stride);
 
         dst10_r = dst54_r;
@@ -5172,9 +5187,9 @@
                     tmp2, tmp3);
         ADD2(tmp0, offset_vec, tmp1, offset_vec, tmp0, tmp1);
         ADD2(tmp2, offset_vec, tmp3, offset_vec, tmp2, tmp3);
-        CLIP_SH4_0_255_MAX_SATU(tmp0, tmp1, tmp2, tmp3);
+        CLIP_SH4_0_255(tmp0, tmp1, tmp2, tmp3);
         PCKEV_B2_UB(tmp1, tmp0, tmp3, tmp2, out0, out1);
-        ST4x8_UB(out0, out1, dst, dst_stride);
+        ST_W8(out0, out1, 0, 1, 2, 3, 0, 1, 2, 3, dst, dst_stride);
         dst += (8 * dst_stride);
 
         dst10_r = dst98_r;
diff --git a/libavcodec/mips/hevcdsp_init_mips.c b/libavcodec/mips/hevcdsp_init_mips.c
index 776d13e..88337f4 100644
--- a/libavcodec/mips/hevcdsp_init_mips.c
+++ b/libavcodec/mips/hevcdsp_init_mips.c
@@ -20,6 +20,78 @@
 
 #include "libavcodec/mips/hevcdsp_mips.h"
 
+#if HAVE_MMI
+static av_cold void hevc_dsp_init_mmi(HEVCDSPContext *c,
+                                      const int bit_depth)
+{
+    if (8 == bit_depth) {
+        c->put_hevc_qpel[1][0][1] = ff_hevc_put_hevc_qpel_h4_8_mmi;
+        c->put_hevc_qpel[3][0][1] = ff_hevc_put_hevc_qpel_h8_8_mmi;
+        c->put_hevc_qpel[4][0][1] = ff_hevc_put_hevc_qpel_h12_8_mmi;
+        c->put_hevc_qpel[5][0][1] = ff_hevc_put_hevc_qpel_h16_8_mmi;
+        c->put_hevc_qpel[6][0][1] = ff_hevc_put_hevc_qpel_h24_8_mmi;
+        c->put_hevc_qpel[7][0][1] = ff_hevc_put_hevc_qpel_h32_8_mmi;
+        c->put_hevc_qpel[8][0][1] = ff_hevc_put_hevc_qpel_h48_8_mmi;
+        c->put_hevc_qpel[9][0][1] = ff_hevc_put_hevc_qpel_h64_8_mmi;
+
+        c->put_hevc_qpel[1][1][1] = ff_hevc_put_hevc_qpel_hv4_8_mmi;
+        c->put_hevc_qpel[3][1][1] = ff_hevc_put_hevc_qpel_hv8_8_mmi;
+        c->put_hevc_qpel[4][1][1] = ff_hevc_put_hevc_qpel_hv12_8_mmi;
+        c->put_hevc_qpel[5][1][1] = ff_hevc_put_hevc_qpel_hv16_8_mmi;
+        c->put_hevc_qpel[6][1][1] = ff_hevc_put_hevc_qpel_hv24_8_mmi;
+        c->put_hevc_qpel[7][1][1] = ff_hevc_put_hevc_qpel_hv32_8_mmi;
+        c->put_hevc_qpel[8][1][1] = ff_hevc_put_hevc_qpel_hv48_8_mmi;
+        c->put_hevc_qpel[9][1][1] = ff_hevc_put_hevc_qpel_hv64_8_mmi;
+
+        c->put_hevc_qpel_bi[1][0][1] = ff_hevc_put_hevc_qpel_bi_h4_8_mmi;
+        c->put_hevc_qpel_bi[3][0][1] = ff_hevc_put_hevc_qpel_bi_h8_8_mmi;
+        c->put_hevc_qpel_bi[4][0][1] = ff_hevc_put_hevc_qpel_bi_h12_8_mmi;
+        c->put_hevc_qpel_bi[5][0][1] = ff_hevc_put_hevc_qpel_bi_h16_8_mmi;
+        c->put_hevc_qpel_bi[6][0][1] = ff_hevc_put_hevc_qpel_bi_h24_8_mmi;
+        c->put_hevc_qpel_bi[7][0][1] = ff_hevc_put_hevc_qpel_bi_h32_8_mmi;
+        c->put_hevc_qpel_bi[8][0][1] = ff_hevc_put_hevc_qpel_bi_h48_8_mmi;
+        c->put_hevc_qpel_bi[9][0][1] = ff_hevc_put_hevc_qpel_bi_h64_8_mmi;
+
+        c->put_hevc_qpel_bi[1][1][1] = ff_hevc_put_hevc_qpel_bi_hv4_8_mmi;
+        c->put_hevc_qpel_bi[3][1][1] = ff_hevc_put_hevc_qpel_bi_hv8_8_mmi;
+        c->put_hevc_qpel_bi[4][1][1] = ff_hevc_put_hevc_qpel_bi_hv12_8_mmi;
+        c->put_hevc_qpel_bi[5][1][1] = ff_hevc_put_hevc_qpel_bi_hv16_8_mmi;
+        c->put_hevc_qpel_bi[6][1][1] = ff_hevc_put_hevc_qpel_bi_hv24_8_mmi;
+        c->put_hevc_qpel_bi[7][1][1] = ff_hevc_put_hevc_qpel_bi_hv32_8_mmi;
+        c->put_hevc_qpel_bi[8][1][1] = ff_hevc_put_hevc_qpel_bi_hv48_8_mmi;
+        c->put_hevc_qpel_bi[9][1][1] = ff_hevc_put_hevc_qpel_bi_hv64_8_mmi;
+
+        c->put_hevc_qpel_bi[3][0][0] = ff_hevc_put_hevc_pel_bi_pixels8_8_mmi;
+        c->put_hevc_qpel_bi[5][0][0] = ff_hevc_put_hevc_pel_bi_pixels16_8_mmi;
+        c->put_hevc_qpel_bi[6][0][0] = ff_hevc_put_hevc_pel_bi_pixels24_8_mmi;
+        c->put_hevc_qpel_bi[7][0][0] = ff_hevc_put_hevc_pel_bi_pixels32_8_mmi;
+        c->put_hevc_qpel_bi[8][0][0] = ff_hevc_put_hevc_pel_bi_pixels48_8_mmi;
+        c->put_hevc_qpel_bi[9][0][0] = ff_hevc_put_hevc_pel_bi_pixels64_8_mmi;
+
+        c->put_hevc_epel_bi[3][0][0] = ff_hevc_put_hevc_pel_bi_pixels8_8_mmi;
+        c->put_hevc_epel_bi[5][0][0] = ff_hevc_put_hevc_pel_bi_pixels16_8_mmi;
+        c->put_hevc_epel_bi[6][0][0] = ff_hevc_put_hevc_pel_bi_pixels24_8_mmi;
+        c->put_hevc_epel_bi[7][0][0] = ff_hevc_put_hevc_pel_bi_pixels32_8_mmi;
+
+        c->put_hevc_epel_bi[1][1][1] = ff_hevc_put_hevc_epel_bi_hv4_8_mmi;
+        c->put_hevc_epel_bi[3][1][1] = ff_hevc_put_hevc_epel_bi_hv8_8_mmi;
+        c->put_hevc_epel_bi[4][1][1] = ff_hevc_put_hevc_epel_bi_hv12_8_mmi;
+        c->put_hevc_epel_bi[5][1][1] = ff_hevc_put_hevc_epel_bi_hv16_8_mmi;
+        c->put_hevc_epel_bi[6][1][1] = ff_hevc_put_hevc_epel_bi_hv24_8_mmi;
+        c->put_hevc_epel_bi[7][1][1] = ff_hevc_put_hevc_epel_bi_hv32_8_mmi;
+
+        c->put_hevc_qpel_uni[1][1][1] = ff_hevc_put_hevc_qpel_uni_hv4_8_mmi;
+        c->put_hevc_qpel_uni[3][1][1] = ff_hevc_put_hevc_qpel_uni_hv8_8_mmi;
+        c->put_hevc_qpel_uni[4][1][1] = ff_hevc_put_hevc_qpel_uni_hv12_8_mmi;
+        c->put_hevc_qpel_uni[5][1][1] = ff_hevc_put_hevc_qpel_uni_hv16_8_mmi;
+        c->put_hevc_qpel_uni[6][1][1] = ff_hevc_put_hevc_qpel_uni_hv24_8_mmi;
+        c->put_hevc_qpel_uni[7][1][1] = ff_hevc_put_hevc_qpel_uni_hv32_8_mmi;
+        c->put_hevc_qpel_uni[8][1][1] = ff_hevc_put_hevc_qpel_uni_hv48_8_mmi;
+        c->put_hevc_qpel_uni[9][1][1] = ff_hevc_put_hevc_qpel_uni_hv64_8_mmi;
+    }
+}
+#endif // #if HAVE_MMI
+
 #if HAVE_MSA
 static av_cold void hevc_dsp_init_msa(HEVCDSPContext *c,
                                       const int bit_depth)
@@ -448,6 +520,9 @@
 
 void ff_hevc_dsp_init_mips(HEVCDSPContext *c, const int bit_depth)
 {
+#if HAVE_MMI
+    hevc_dsp_init_mmi(c, bit_depth);
+#endif  // #if HAVE_MMI
 #if HAVE_MSA
     hevc_dsp_init_msa(c, bit_depth);
 #endif  // #if HAVE_MSA
diff --git a/libavcodec/mips/hevcdsp_mips.h b/libavcodec/mips/hevcdsp_mips.h
index 1573d1c..c84e08d 100644
--- a/libavcodec/mips/hevcdsp_mips.h
+++ b/libavcodec/mips/hevcdsp_mips.h
@@ -479,4 +479,95 @@
                               ptrdiff_t stride);
 void ff_hevc_idct_luma_4x4_msa(int16_t *pi16Coeffs);
 
+/* Loongson optimization */
+#define L_MC(PEL, DIR, WIDTH, TYPE)                                          \
+void ff_hevc_put_hevc_##PEL##_##DIR##WIDTH##_8_##TYPE(int16_t *dst,          \
+                                                      uint8_t *src,          \
+                                                      ptrdiff_t src_stride,  \
+                                                      int height,            \
+                                                      intptr_t mx,           \
+                                                      intptr_t my,           \
+                                                      int width)
+L_MC(qpel, h, 4, mmi);
+L_MC(qpel, h, 8, mmi);
+L_MC(qpel, h, 12, mmi);
+L_MC(qpel, h, 16, mmi);
+L_MC(qpel, h, 24, mmi);
+L_MC(qpel, h, 32, mmi);
+L_MC(qpel, h, 48, mmi);
+L_MC(qpel, h, 64, mmi);
+
+L_MC(qpel, hv, 4, mmi);
+L_MC(qpel, hv, 8, mmi);
+L_MC(qpel, hv, 12, mmi);
+L_MC(qpel, hv, 16, mmi);
+L_MC(qpel, hv, 24, mmi);
+L_MC(qpel, hv, 32, mmi);
+L_MC(qpel, hv, 48, mmi);
+L_MC(qpel, hv, 64, mmi);
+
+#define L_BI_MC(PEL, DIR, WIDTH, TYPE)                                          \
+void ff_hevc_put_hevc_##PEL##_bi_##DIR##WIDTH##_8_##TYPE(uint8_t *dst,          \
+                                                         ptrdiff_t dst_stride,  \
+                                                         uint8_t *src,          \
+                                                         ptrdiff_t src_stride,  \
+                                                         int16_t *src2,         \
+                                                         int height,            \
+                                                         intptr_t mx,           \
+                                                         intptr_t my,           \
+                                                         int width)
+
+L_BI_MC(pel, pixels, 8, mmi);
+L_BI_MC(pel, pixels, 16, mmi);
+L_BI_MC(pel, pixels, 24, mmi);
+L_BI_MC(pel, pixels, 32, mmi);
+L_BI_MC(pel, pixels, 48, mmi);
+L_BI_MC(pel, pixels, 64, mmi);
+
+L_BI_MC(qpel, hv, 4, mmi);
+L_BI_MC(qpel, hv, 8, mmi);
+L_BI_MC(qpel, hv, 12, mmi);
+L_BI_MC(qpel, hv, 16, mmi);
+L_BI_MC(qpel, hv, 24, mmi);
+L_BI_MC(qpel, hv, 32, mmi);
+L_BI_MC(qpel, hv, 48, mmi);
+L_BI_MC(qpel, hv, 64, mmi);
+
+L_BI_MC(qpel, h, 4, mmi);
+L_BI_MC(qpel, h, 8, mmi);
+L_BI_MC(qpel, h, 12, mmi);
+L_BI_MC(qpel, h, 16, mmi);
+L_BI_MC(qpel, h, 24, mmi);
+L_BI_MC(qpel, h, 32, mmi);
+L_BI_MC(qpel, h, 48, mmi);
+L_BI_MC(qpel, h, 64, mmi);
+
+L_BI_MC(epel, hv, 4, mmi);
+L_BI_MC(epel, hv, 8, mmi);
+L_BI_MC(epel, hv, 12, mmi);
+L_BI_MC(epel, hv, 16, mmi);
+L_BI_MC(epel, hv, 24, mmi);
+L_BI_MC(epel, hv, 32, mmi);
+#undef L_BI_MC
+
+#define L_UNI_MC(PEL, DIR, WIDTH, TYPE)                                         \
+void ff_hevc_put_hevc_##PEL##_uni_##DIR##WIDTH##_8_##TYPE(uint8_t *dst,         \
+                                                          ptrdiff_t dst_stride, \
+                                                          uint8_t *src,         \
+                                                          ptrdiff_t src_stride, \
+                                                          int height,           \
+                                                          intptr_t mx,          \
+                                                          intptr_t my,          \
+                                                          int width)
+
+L_UNI_MC(qpel, hv, 4, mmi);
+L_UNI_MC(qpel, hv, 8, mmi);
+L_UNI_MC(qpel, hv, 12, mmi);
+L_UNI_MC(qpel, hv, 16, mmi);
+L_UNI_MC(qpel, hv, 24, mmi);
+L_UNI_MC(qpel, hv, 32, mmi);
+L_UNI_MC(qpel, hv, 48, mmi);
+L_UNI_MC(qpel, hv, 64, mmi);
+#undef L_UNI_MC
+
 #endif  // #ifndef AVCODEC_MIPS_HEVCDSP_MIPS_H
diff --git a/libavcodec/mips/hevcdsp_mmi.c b/libavcodec/mips/hevcdsp_mmi.c
new file mode 100644
index 0000000..aa83e1f
--- /dev/null
+++ b/libavcodec/mips/hevcdsp_mmi.c
@@ -0,0 +1,1183 @@
+/*
+ * Copyright (c) 2019 Shiyou Yin (yinshiyou-hf@loongson.cn)
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "libavcodec/hevcdec.h"
+#include "libavcodec/bit_depth_template.c"
+#include "libavcodec/mips/hevcdsp_mips.h"
+#include "libavutil/mips/mmiutils.h"
+
+#define PUT_HEVC_QPEL_H(w, x_step, src_step, dst_step)                   \
+void ff_hevc_put_hevc_qpel_h##w##_8_mmi(int16_t *dst, uint8_t *_src,     \
+                                        ptrdiff_t _srcstride,            \
+                                        int height, intptr_t mx,         \
+                                        intptr_t my, int width)          \
+{                                                                        \
+    int x, y;                                                            \
+    pixel *src = (pixel*)_src - 3;                                       \
+    ptrdiff_t srcstride = _srcstride / sizeof(pixel);                    \
+    uint64_t ftmp[15];                                                   \
+    uint64_t rtmp[1];                                                    \
+    const int8_t *filter = ff_hevc_qpel_filters[mx - 1];                 \
+                                                                         \
+    x = x_step;                                                          \
+    y = height;                                                          \
+    __asm__ volatile(                                                    \
+        MMI_LDC1(%[ftmp1], %[filter], 0x00)                              \
+        "li           %[rtmp0],      0x08                       \n\t"    \
+        "dmtc1        %[rtmp0],      %[ftmp0]                   \n\t"    \
+        "punpckhbh    %[ftmp2],      %[ftmp0],      %[ftmp1]    \n\t"    \
+        "punpcklbh    %[ftmp1],      %[ftmp0],      %[ftmp1]    \n\t"    \
+        "psrah        %[ftmp1],      %[ftmp1],      %[ftmp0]    \n\t"    \
+        "psrah        %[ftmp2],      %[ftmp2],      %[ftmp0]    \n\t"    \
+        "xor          %[ftmp0],      %[ftmp0],      %[ftmp0]    \n\t"    \
+                                                                         \
+        "1:                                                     \n\t"    \
+        "2:                                                     \n\t"    \
+        "gsldlc1      %[ftmp3],      0x07(%[src])               \n\t"    \
+        "gsldrc1      %[ftmp3],      0x00(%[src])               \n\t"    \
+        "gsldlc1      %[ftmp4],      0x08(%[src])               \n\t"    \
+        "gsldrc1      %[ftmp4],      0x01(%[src])               \n\t"    \
+        "gsldlc1      %[ftmp5],      0x09(%[src])               \n\t"    \
+        "gsldrc1      %[ftmp5],      0x02(%[src])               \n\t"    \
+        "gsldlc1      %[ftmp6],      0x0a(%[src])               \n\t"    \
+        "gsldrc1      %[ftmp6],      0x03(%[src])               \n\t"    \
+        "punpcklbh    %[ftmp7],      %[ftmp3],      %[ftmp0]    \n\t"    \
+        "punpckhbh    %[ftmp8],      %[ftmp3],      %[ftmp0]    \n\t"    \
+        "pmullh       %[ftmp7],      %[ftmp7],      %[ftmp1]    \n\t"    \
+        "pmullh       %[ftmp8],      %[ftmp8],      %[ftmp2]    \n\t"    \
+        "paddh        %[ftmp3],      %[ftmp7],      %[ftmp8]    \n\t"    \
+        "punpcklbh    %[ftmp7],      %[ftmp4],      %[ftmp0]    \n\t"    \
+        "punpckhbh    %[ftmp8],      %[ftmp4],      %[ftmp0]    \n\t"    \
+        "pmullh       %[ftmp7],      %[ftmp7],      %[ftmp1]    \n\t"    \
+        "pmullh       %[ftmp8],      %[ftmp8],      %[ftmp2]    \n\t"    \
+        "paddh        %[ftmp4],      %[ftmp7],      %[ftmp8]    \n\t"    \
+        "punpcklbh    %[ftmp7],      %[ftmp5],      %[ftmp0]    \n\t"    \
+        "punpckhbh    %[ftmp8],      %[ftmp5],      %[ftmp0]    \n\t"    \
+        "pmullh       %[ftmp7],      %[ftmp7],      %[ftmp1]    \n\t"    \
+        "pmullh       %[ftmp8],      %[ftmp8],      %[ftmp2]    \n\t"    \
+        "paddh        %[ftmp5],      %[ftmp7],      %[ftmp8]    \n\t"    \
+        "punpcklbh    %[ftmp7],      %[ftmp6],      %[ftmp0]    \n\t"    \
+        "punpckhbh    %[ftmp8],      %[ftmp6],      %[ftmp0]    \n\t"    \
+        "pmullh       %[ftmp7],      %[ftmp7],      %[ftmp1]    \n\t"    \
+        "pmullh       %[ftmp8],      %[ftmp8],      %[ftmp2]    \n\t"    \
+        "paddh        %[ftmp6],      %[ftmp7],      %[ftmp8]    \n\t"    \
+        TRANSPOSE_4H(%[ftmp3], %[ftmp4], %[ftmp5], %[ftmp6],             \
+                     %[ftmp7], %[ftmp8], %[ftmp9], %[ftmp10])            \
+        "paddh        %[ftmp3],      %[ftmp3],      %[ftmp4]    \n\t"    \
+        "paddh        %[ftmp5],      %[ftmp5],      %[ftmp6]    \n\t"    \
+        "paddh        %[ftmp3],      %[ftmp3],      %[ftmp5]    \n\t"    \
+        "gssdlc1      %[ftmp3],      0x07(%[dst])               \n\t"    \
+        "gssdrc1      %[ftmp3],      0x00(%[dst])               \n\t"    \
+                                                                         \
+        "daddi        %[x],          %[x],         -0x01        \n\t"    \
+        PTR_ADDIU    "%[src],        %[src],        0x04        \n\t"    \
+        PTR_ADDIU    "%[dst],        %[dst],        0x08        \n\t"    \
+        "bnez         %[x],          2b                         \n\t"    \
+                                                                         \
+        "daddi        %[y],          %[y],         -0x01        \n\t"    \
+        "li           %[x],        " #x_step "                  \n\t"    \
+        PTR_ADDIU    "%[src],        %[src],     " #src_step "  \n\t"    \
+        PTR_ADDIU    "%[dst],        %[dst],     " #dst_step "  \n\t"    \
+        PTR_ADDU     "%[src],        %[src],        %[stride]   \n\t"    \
+        PTR_ADDIU    "%[dst],        %[dst],        0x80        \n\t"    \
+        "bnez         %[y],          1b                         \n\t"    \
+        : [ftmp0]"=&f"(ftmp[0]), [ftmp1]"=&f"(ftmp[1]),                  \
+          [ftmp2]"=&f"(ftmp[2]), [ftmp3]"=&f"(ftmp[3]),                  \
+          [ftmp4]"=&f"(ftmp[4]), [ftmp5]"=&f"(ftmp[5]),                  \
+          [ftmp6]"=&f"(ftmp[6]), [ftmp7]"=&f"(ftmp[7]),                  \
+          [ftmp8]"=&f"(ftmp[8]), [ftmp9]"=&f"(ftmp[9]),                  \
+          [ftmp10]"=&f"(ftmp[10]), [rtmp0]"=&r"(rtmp[0]),                \
+          [src]"+&r"(src), [dst]"+&r"(dst), [y]"+&r"(y),                 \
+          [x]"+&r"(x)                                                    \
+        : [filter]"r"(filter), [stride]"r"(srcstride)                    \
+        : "memory"                                                       \
+    );                                                                   \
+}
+
+PUT_HEVC_QPEL_H(4, 1, -4, -8);
+PUT_HEVC_QPEL_H(8, 2, -8, -16);
+PUT_HEVC_QPEL_H(12, 3, -12, -24);
+PUT_HEVC_QPEL_H(16, 4, -16, -32);
+PUT_HEVC_QPEL_H(24, 6, -24, -48);
+PUT_HEVC_QPEL_H(32, 8, -32, -64);
+PUT_HEVC_QPEL_H(48, 12, -48, -96);
+PUT_HEVC_QPEL_H(64, 16, -64, -128);
+
+#define PUT_HEVC_QPEL_HV(w, x_step, src_step, dst_step)                  \
+void ff_hevc_put_hevc_qpel_hv##w##_8_mmi(int16_t *dst, uint8_t *_src,    \
+                                     ptrdiff_t _srcstride,               \
+                                     int height, intptr_t mx,            \
+                                     intptr_t my, int width)             \
+{                                                                        \
+    int x, y;                                                            \
+    const int8_t *filter;                                                \
+    pixel *src = (pixel*)_src;                                           \
+    ptrdiff_t srcstride = _srcstride / sizeof(pixel);                    \
+    int16_t tmp_array[(MAX_PB_SIZE + QPEL_EXTRA) * MAX_PB_SIZE];         \
+    int16_t *tmp = tmp_array;                                            \
+    uint64_t ftmp[15];                                                   \
+    uint64_t rtmp[1];                                                    \
+                                                                         \
+    src   -= (QPEL_EXTRA_BEFORE * srcstride + 3);                        \
+    filter = ff_hevc_qpel_filters[mx - 1];                               \
+    x = x_step;                                                          \
+    y = height + QPEL_EXTRA;                                             \
+    __asm__ volatile(                                                    \
+        MMI_LDC1(%[ftmp1], %[filter], 0x00)                              \
+        "li           %[rtmp0],      0x08                       \n\t"    \
+        "dmtc1        %[rtmp0],      %[ftmp0]                   \n\t"    \
+        "punpckhbh    %[ftmp2],      %[ftmp0],      %[ftmp1]    \n\t"    \
+        "punpcklbh    %[ftmp1],      %[ftmp0],      %[ftmp1]    \n\t"    \
+        "psrah        %[ftmp1],      %[ftmp1],      %[ftmp0]    \n\t"    \
+        "psrah        %[ftmp2],      %[ftmp2],      %[ftmp0]    \n\t"    \
+        "xor          %[ftmp0],      %[ftmp0],      %[ftmp0]    \n\t"    \
+                                                                         \
+        "1:                                                     \n\t"    \
+        "2:                                                     \n\t"    \
+        "gsldlc1      %[ftmp3],      0x07(%[src])               \n\t"    \
+        "gsldrc1      %[ftmp3],      0x00(%[src])               \n\t"    \
+        "gsldlc1      %[ftmp4],      0x08(%[src])               \n\t"    \
+        "gsldrc1      %[ftmp4],      0x01(%[src])               \n\t"    \
+        "gsldlc1      %[ftmp5],      0x09(%[src])               \n\t"    \
+        "gsldrc1      %[ftmp5],      0x02(%[src])               \n\t"    \
+        "gsldlc1      %[ftmp6],      0x0a(%[src])               \n\t"    \
+        "gsldrc1      %[ftmp6],      0x03(%[src])               \n\t"    \
+        "punpcklbh    %[ftmp7],      %[ftmp3],      %[ftmp0]    \n\t"    \
+        "punpckhbh    %[ftmp8],      %[ftmp3],      %[ftmp0]    \n\t"    \
+        "pmullh       %[ftmp7],      %[ftmp7],      %[ftmp1]    \n\t"    \
+        "pmullh       %[ftmp8],      %[ftmp8],      %[ftmp2]    \n\t"    \
+        "paddh        %[ftmp3],      %[ftmp7],      %[ftmp8]    \n\t"    \
+        "punpcklbh    %[ftmp7],      %[ftmp4],      %[ftmp0]    \n\t"    \
+        "punpckhbh    %[ftmp8],      %[ftmp4],      %[ftmp0]    \n\t"    \
+        "pmullh       %[ftmp7],      %[ftmp7],      %[ftmp1]    \n\t"    \
+        "pmullh       %[ftmp8],      %[ftmp8],      %[ftmp2]    \n\t"    \
+        "paddh        %[ftmp4],      %[ftmp7],      %[ftmp8]    \n\t"    \
+        "punpcklbh    %[ftmp7],      %[ftmp5],      %[ftmp0]    \n\t"    \
+        "punpckhbh    %[ftmp8],      %[ftmp5],      %[ftmp0]    \n\t"    \
+        "pmullh       %[ftmp7],      %[ftmp7],      %[ftmp1]    \n\t"    \
+        "pmullh       %[ftmp8],      %[ftmp8],      %[ftmp2]    \n\t"    \
+        "paddh        %[ftmp5],      %[ftmp7],      %[ftmp8]    \n\t"    \
+        "punpcklbh    %[ftmp7],      %[ftmp6],      %[ftmp0]    \n\t"    \
+        "punpckhbh    %[ftmp8],      %[ftmp6],      %[ftmp0]    \n\t"    \
+        "pmullh       %[ftmp7],      %[ftmp7],      %[ftmp1]    \n\t"    \
+        "pmullh       %[ftmp8],      %[ftmp8],      %[ftmp2]    \n\t"    \
+        "paddh        %[ftmp6],      %[ftmp7],      %[ftmp8]    \n\t"    \
+        TRANSPOSE_4H(%[ftmp3], %[ftmp4], %[ftmp5], %[ftmp6],             \
+                     %[ftmp7], %[ftmp8], %[ftmp9], %[ftmp10])            \
+        "paddh        %[ftmp3],      %[ftmp3],      %[ftmp4]    \n\t"    \
+        "paddh        %[ftmp5],      %[ftmp5],      %[ftmp6]    \n\t"    \
+        "paddh        %[ftmp3],      %[ftmp3],      %[ftmp5]    \n\t"    \
+        "gssdlc1      %[ftmp3],      0x07(%[tmp])               \n\t"    \
+        "gssdrc1      %[ftmp3],      0x00(%[tmp])               \n\t"    \
+                                                                         \
+        "daddi        %[x],          %[x],         -0x01        \n\t"    \
+        PTR_ADDIU    "%[src],        %[src],        0x04        \n\t"    \
+        PTR_ADDIU    "%[tmp],        %[tmp],        0x08        \n\t"    \
+        "bnez         %[x],          2b                         \n\t"    \
+                                                                         \
+        "daddi        %[y],          %[y],         -0x01        \n\t"    \
+        "li           %[x],        " #x_step "                  \n\t"    \
+        PTR_ADDIU    "%[src],        %[src],     " #src_step "  \n\t"    \
+        PTR_ADDIU    "%[tmp],        %[tmp],     " #dst_step "  \n\t"    \
+        PTR_ADDU     "%[src],        %[src],        %[stride]   \n\t"    \
+        PTR_ADDIU    "%[tmp],        %[tmp],        0x80        \n\t"    \
+        "bnez         %[y],          1b                         \n\t"    \
+        : [ftmp0]"=&f"(ftmp[0]), [ftmp1]"=&f"(ftmp[1]),                  \
+          [ftmp2]"=&f"(ftmp[2]), [ftmp3]"=&f"(ftmp[3]),                  \
+          [ftmp4]"=&f"(ftmp[4]), [ftmp5]"=&f"(ftmp[5]),                  \
+          [ftmp6]"=&f"(ftmp[6]), [ftmp7]"=&f"(ftmp[7]),                  \
+          [ftmp8]"=&f"(ftmp[8]), [ftmp9]"=&f"(ftmp[9]),                  \
+          [ftmp10]"=&f"(ftmp[10]), [rtmp0]"=&r"(rtmp[0]),                \
+          [src]"+&r"(src), [tmp]"+&r"(tmp), [y]"+&r"(y),                 \
+          [x]"+&r"(x)                                                    \
+        : [filter]"r"(filter), [stride]"r"(srcstride)                    \
+        : "memory"                                                       \
+    );                                                                   \
+                                                                         \
+    tmp    = tmp_array + QPEL_EXTRA_BEFORE * 4 -12;                      \
+    filter = ff_hevc_qpel_filters[my - 1];                               \
+    x = x_step;                                                          \
+    y = height;                                                          \
+    __asm__ volatile(                                                    \
+        MMI_LDC1(%[ftmp1], %[filter], 0x00)                              \
+        "li           %[rtmp0],      0x08                       \n\t"    \
+        "dmtc1        %[rtmp0],      %[ftmp0]                   \n\t"    \
+        "punpckhbh    %[ftmp2],      %[ftmp0],      %[ftmp1]    \n\t"    \
+        "punpcklbh    %[ftmp1],      %[ftmp0],      %[ftmp1]    \n\t"    \
+        "psrah        %[ftmp1],      %[ftmp1],      %[ftmp0]    \n\t"    \
+        "psrah        %[ftmp2],      %[ftmp2],      %[ftmp0]    \n\t"    \
+        "li           %[rtmp0],      0x06                       \n\t"    \
+        "dmtc1        %[rtmp0],      %[ftmp0]                   \n\t"    \
+                                                                         \
+        "1:                                                     \n\t"    \
+        "2:                                                     \n\t"    \
+        "gsldlc1      %[ftmp3],      0x07(%[tmp])               \n\t"    \
+        "gsldrc1      %[ftmp3],      0x00(%[tmp])               \n\t"    \
+        PTR_ADDIU    "%[tmp],        %[tmp],        0x80        \n\t"    \
+        "gsldlc1      %[ftmp4],      0x07(%[tmp])               \n\t"    \
+        "gsldrc1      %[ftmp4],      0x00(%[tmp])               \n\t"    \
+        PTR_ADDIU    "%[tmp],        %[tmp],        0x80        \n\t"    \
+        "gsldlc1      %[ftmp5],      0x07(%[tmp])               \n\t"    \
+        "gsldrc1      %[ftmp5],      0x00(%[tmp])               \n\t"    \
+        PTR_ADDIU    "%[tmp],        %[tmp],        0x80        \n\t"    \
+        "gsldlc1      %[ftmp6],      0x07(%[tmp])               \n\t"    \
+        "gsldrc1      %[ftmp6],      0x00(%[tmp])               \n\t"    \
+        PTR_ADDIU    "%[tmp],        %[tmp],        0x80        \n\t"    \
+        "gsldlc1      %[ftmp7],      0x07(%[tmp])               \n\t"    \
+        "gsldrc1      %[ftmp7],      0x00(%[tmp])               \n\t"    \
+        PTR_ADDIU    "%[tmp],        %[tmp],        0x80        \n\t"    \
+        "gsldlc1      %[ftmp8],      0x07(%[tmp])               \n\t"    \
+        "gsldrc1      %[ftmp8],      0x00(%[tmp])               \n\t"    \
+        PTR_ADDIU    "%[tmp],        %[tmp],        0x80        \n\t"    \
+        "gsldlc1      %[ftmp9],      0x07(%[tmp])               \n\t"    \
+        "gsldrc1      %[ftmp9],      0x00(%[tmp])               \n\t"    \
+        PTR_ADDIU    "%[tmp],        %[tmp],        0x80        \n\t"    \
+        "gsldlc1      %[ftmp10],     0x07(%[tmp])               \n\t"    \
+        "gsldrc1      %[ftmp10],     0x00(%[tmp])               \n\t"    \
+        PTR_ADDIU    "%[tmp],        %[tmp],        -0x380      \n\t"    \
+        TRANSPOSE_4H(%[ftmp3], %[ftmp4], %[ftmp5], %[ftmp6],             \
+                     %[ftmp11], %[ftmp12], %[ftmp13], %[ftmp14])         \
+        TRANSPOSE_4H(%[ftmp7], %[ftmp8], %[ftmp9], %[ftmp10],            \
+                     %[ftmp11], %[ftmp12], %[ftmp13], %[ftmp14])         \
+        "pmaddhw      %[ftmp11],     %[ftmp3],      %[ftmp1]    \n\t"    \
+        "pmaddhw      %[ftmp12],     %[ftmp7],      %[ftmp2]    \n\t"    \
+        "pmaddhw      %[ftmp13],     %[ftmp4],      %[ftmp1]    \n\t"    \
+        "pmaddhw      %[ftmp14],     %[ftmp8],      %[ftmp2]    \n\t"    \
+        "paddw        %[ftmp11],     %[ftmp11],     %[ftmp12]   \n\t"    \
+        "paddw        %[ftmp13],     %[ftmp13],     %[ftmp14]   \n\t"    \
+        TRANSPOSE_2W(%[ftmp11], %[ftmp13], %[ftmp3], %[ftmp4])           \
+        "paddw        %[ftmp3],      %[ftmp3],      %[ftmp4]    \n\t"    \
+        "psraw        %[ftmp3],      %[ftmp3],      %[ftmp0]    \n\t"    \
+        "pmaddhw      %[ftmp11],     %[ftmp5],      %[ftmp1]    \n\t"    \
+        "pmaddhw      %[ftmp12],     %[ftmp9],      %[ftmp2]    \n\t"    \
+        "pmaddhw      %[ftmp13],     %[ftmp6],      %[ftmp1]    \n\t"    \
+        "pmaddhw      %[ftmp14],     %[ftmp10],     %[ftmp2]    \n\t"    \
+        "paddw        %[ftmp11],     %[ftmp11],     %[ftmp12]   \n\t"    \
+        "paddw        %[ftmp13],     %[ftmp13],     %[ftmp14]   \n\t"    \
+        TRANSPOSE_2W(%[ftmp11], %[ftmp13], %[ftmp5], %[ftmp6])           \
+        "paddw        %[ftmp5],      %[ftmp5],      %[ftmp6]    \n\t"    \
+        "psraw        %[ftmp5],      %[ftmp5],      %[ftmp0]    \n\t"    \
+        "packsswh     %[ftmp3],      %[ftmp3],      %[ftmp5]    \n\t"    \
+        "gssdlc1      %[ftmp3],      0x07(%[dst])               \n\t"    \
+        "gssdrc1      %[ftmp3],      0x00(%[dst])               \n\t"    \
+                                                                         \
+        "daddi        %[x],          %[x],         -0x01        \n\t"    \
+        PTR_ADDIU    "%[dst],        %[dst],        0x08        \n\t"    \
+        PTR_ADDIU    "%[tmp],        %[tmp],        0x08        \n\t"    \
+        "bnez         %[x],          2b                         \n\t"    \
+                                                                         \
+        "daddi        %[y],          %[y],         -0x01        \n\t"    \
+        "li           %[x],        " #x_step "                  \n\t"    \
+        PTR_ADDIU    "%[dst],        %[dst],     " #dst_step "  \n\t"    \
+        PTR_ADDIU    "%[tmp],        %[tmp],     " #dst_step "  \n\t"    \
+        PTR_ADDIU    "%[dst],        %[dst],        0x80        \n\t"    \
+        PTR_ADDIU    "%[tmp],        %[tmp],        0x80        \n\t"    \
+        "bnez         %[y],          1b                         \n\t"    \
+        : [ftmp0]"=&f"(ftmp[0]), [ftmp1]"=&f"(ftmp[1]),                  \
+          [ftmp2]"=&f"(ftmp[2]), [ftmp3]"=&f"(ftmp[3]),                  \
+          [ftmp4]"=&f"(ftmp[4]), [ftmp5]"=&f"(ftmp[5]),                  \
+          [ftmp6]"=&f"(ftmp[6]), [ftmp7]"=&f"(ftmp[7]),                  \
+          [ftmp8]"=&f"(ftmp[8]), [ftmp9]"=&f"(ftmp[9]),                  \
+          [ftmp10]"=&f"(ftmp[10]), [ftmp11]"=&f"(ftmp[11]),              \
+          [ftmp12]"=&f"(ftmp[12]), [ftmp13]"=&f"(ftmp[13]),              \
+          [ftmp14]"=&f"(ftmp[14]), [rtmp0]"=&r"(rtmp[0]),                \
+          [dst]"+&r"(dst), [tmp]"+&r"(tmp), [y]"+&r"(y),                 \
+          [x]"+&r"(x)                                                    \
+        : [filter]"r"(filter), [stride]"r"(srcstride)                    \
+        : "memory"                                                       \
+    );                                                                   \
+}
+
+PUT_HEVC_QPEL_HV(4, 1, -4, -8);
+PUT_HEVC_QPEL_HV(8, 2, -8, -16);
+PUT_HEVC_QPEL_HV(12, 3, -12, -24);
+PUT_HEVC_QPEL_HV(16, 4, -16, -32);
+PUT_HEVC_QPEL_HV(24, 6, -24, -48);
+PUT_HEVC_QPEL_HV(32, 8, -32, -64);
+PUT_HEVC_QPEL_HV(48, 12, -48, -96);
+PUT_HEVC_QPEL_HV(64, 16, -64, -128);
+
+#define PUT_HEVC_QPEL_BI_H(w, x_step, src_step, src2_step, dst_step)    \
+void ff_hevc_put_hevc_qpel_bi_h##w##_8_mmi(uint8_t *_dst,               \
+                                           ptrdiff_t _dststride,        \
+                                           uint8_t *_src,               \
+                                           ptrdiff_t _srcstride,        \
+                                           int16_t *src2, int height,   \
+                                           intptr_t mx, intptr_t my,    \
+                                           int width)                   \
+{                                                                       \
+    int x, y;                                                           \
+    pixel        *src       = (pixel*)_src - 3;                         \
+    ptrdiff_t     srcstride = _srcstride / sizeof(pixel);               \
+    pixel *dst          = (pixel *)_dst;                                \
+    ptrdiff_t dststride = _dststride / sizeof(pixel);                   \
+    const int8_t *filter    = ff_hevc_qpel_filters[mx - 1];             \
+    uint64_t ftmp[20];                                                  \
+    uint64_t rtmp[1];                                                   \
+    int shift = 7;                                                      \
+    int offset = 64;                                                    \
+                                                                        \
+    x = width >> 2;                                                     \
+    y = height;                                                         \
+    __asm__ volatile(                                                   \
+        MMI_LDC1(%[ftmp1], %[filter], 0x00)                             \
+        "li           %[rtmp0],      0x08                       \n\t"   \
+        "dmtc1        %[rtmp0],      %[ftmp0]                   \n\t"   \
+        "punpckhbh    %[ftmp2],      %[ftmp0],      %[ftmp1]    \n\t"   \
+        "punpcklbh    %[ftmp1],      %[ftmp0],      %[ftmp1]    \n\t"   \
+        "psrah        %[ftmp1],      %[ftmp1],      %[ftmp0]    \n\t"   \
+        "psrah        %[ftmp2],      %[ftmp2],      %[ftmp0]    \n\t"   \
+        "xor          %[ftmp0],      %[ftmp0],      %[ftmp0]    \n\t"   \
+        "punpcklhw    %[offset],     %[offset],     %[offset]   \n\t"   \
+        "punpcklwd    %[offset],     %[offset],     %[offset]   \n\t"   \
+                                                                        \
+        "1:                                                     \n\t"   \
+        "li           %[x],        " #x_step "                  \n\t"   \
+        "2:                                                     \n\t"   \
+        "gsldlc1      %[ftmp3],      0x07(%[src])               \n\t"   \
+        "gsldrc1      %[ftmp3],      0x00(%[src])               \n\t"   \
+        "gsldlc1      %[ftmp4],      0x08(%[src])               \n\t"   \
+        "gsldrc1      %[ftmp4],      0x01(%[src])               \n\t"   \
+        "gsldlc1      %[ftmp5],      0x09(%[src])               \n\t"   \
+        "gsldrc1      %[ftmp5],      0x02(%[src])               \n\t"   \
+        "gsldlc1      %[ftmp6],      0x0a(%[src])               \n\t"   \
+        "gsldrc1      %[ftmp6],      0x03(%[src])               \n\t"   \
+        "punpcklbh    %[ftmp7],      %[ftmp3],      %[ftmp0]    \n\t"   \
+        "punpckhbh    %[ftmp8],      %[ftmp3],      %[ftmp0]    \n\t"   \
+        "pmullh       %[ftmp7],      %[ftmp7],      %[ftmp1]    \n\t"   \
+        "pmullh       %[ftmp8],      %[ftmp8],      %[ftmp2]    \n\t"   \
+        "paddh        %[ftmp3],      %[ftmp7],      %[ftmp8]    \n\t"   \
+        "punpcklbh    %[ftmp7],      %[ftmp4],      %[ftmp0]    \n\t"   \
+        "punpckhbh    %[ftmp8],      %[ftmp4],      %[ftmp0]    \n\t"   \
+        "pmullh       %[ftmp7],      %[ftmp7],      %[ftmp1]    \n\t"   \
+        "pmullh       %[ftmp8],      %[ftmp8],      %[ftmp2]    \n\t"   \
+        "paddh        %[ftmp4],      %[ftmp7],      %[ftmp8]    \n\t"   \
+        "punpcklbh    %[ftmp7],      %[ftmp5],      %[ftmp0]    \n\t"   \
+        "punpckhbh    %[ftmp8],      %[ftmp5],      %[ftmp0]    \n\t"   \
+        "pmullh       %[ftmp7],      %[ftmp7],      %[ftmp1]    \n\t"   \
+        "pmullh       %[ftmp8],      %[ftmp8],      %[ftmp2]    \n\t"   \
+        "paddh        %[ftmp5],      %[ftmp7],      %[ftmp8]    \n\t"   \
+        "punpcklbh    %[ftmp7],      %[ftmp6],      %[ftmp0]    \n\t"   \
+        "punpckhbh    %[ftmp8],      %[ftmp6],      %[ftmp0]    \n\t"   \
+        "pmullh       %[ftmp7],      %[ftmp7],      %[ftmp1]    \n\t"   \
+        "pmullh       %[ftmp8],      %[ftmp8],      %[ftmp2]    \n\t"   \
+        "paddh        %[ftmp6],      %[ftmp7],      %[ftmp8]    \n\t"   \
+        TRANSPOSE_4H(%[ftmp3], %[ftmp4], %[ftmp5], %[ftmp6],            \
+                     %[ftmp7], %[ftmp8], %[ftmp9], %[ftmp10])           \
+        "paddh        %[ftmp3],      %[ftmp3],      %[ftmp4]    \n\t"   \
+        "paddh        %[ftmp5],      %[ftmp5],      %[ftmp6]    \n\t"   \
+        "paddh        %[ftmp3],      %[ftmp3],      %[ftmp5]    \n\t"   \
+        "paddh        %[ftmp3],      %[ftmp3],      %[offset]   \n\t"   \
+        "gsldlc1      %[ftmp4],      0x07(%[src2])              \n\t"   \
+        "gsldrc1      %[ftmp4],      0x00(%[src2])              \n\t"   \
+        "li           %[rtmp0],      0x10                       \n\t"   \
+        "dmtc1        %[rtmp0],      %[ftmp8]                   \n\t"   \
+        "punpcklhw    %[ftmp5],      %[ftmp0],      %[ftmp3]    \n\t"   \
+        "punpckhhw    %[ftmp6],      %[ftmp0],      %[ftmp3]    \n\t"   \
+        "punpckhhw    %[ftmp3],      %[ftmp0],      %[ftmp4]    \n\t"   \
+        "punpcklhw    %[ftmp4],      %[ftmp0],      %[ftmp4]    \n\t"   \
+        "psraw        %[ftmp5],      %[ftmp5],      %[ftmp8]    \n\t"   \
+        "psraw        %[ftmp6],      %[ftmp6],      %[ftmp8]    \n\t"   \
+        "psraw        %[ftmp3],      %[ftmp3],      %[ftmp8]    \n\t"   \
+        "psraw        %[ftmp4],      %[ftmp4],      %[ftmp8]    \n\t"   \
+        "paddw        %[ftmp5],      %[ftmp5],      %[ftmp4]    \n\t"   \
+        "paddw        %[ftmp6],      %[ftmp6],      %[ftmp3]    \n\t"   \
+        "psraw        %[ftmp5],      %[ftmp5],      %[shift]    \n\t"   \
+        "psraw        %[ftmp6],      %[ftmp6],      %[shift]    \n\t"   \
+        "packsswh     %[ftmp5],      %[ftmp5],      %[ftmp6]    \n\t"   \
+        "pcmpgth      %[ftmp7],      %[ftmp5],      %[ftmp0]    \n\t"   \
+        "and          %[ftmp3],      %[ftmp5],      %[ftmp7]    \n\t"   \
+        "packushb     %[ftmp3],      %[ftmp3],      %[ftmp3]    \n\t"   \
+        "gsswlc1      %[ftmp3],      0x03(%[dst])               \n\t"   \
+        "gsswrc1      %[ftmp3],      0x00(%[dst])               \n\t"   \
+                                                                        \
+        "daddi        %[x],          %[x],         -0x01        \n\t"   \
+        PTR_ADDIU    "%[src],        %[src],        0x04        \n\t"   \
+        PTR_ADDIU    "%[dst],        %[dst],        0x04        \n\t"   \
+        PTR_ADDIU    "%[src2],       %[src2],       0x08        \n\t"   \
+        "bnez         %[x],          2b                         \n\t"   \
+                                                                        \
+        "daddi        %[y],          %[y],         -0x01        \n\t"   \
+        PTR_ADDIU    "%[src],        %[src],     " #src_step "  \n\t"   \
+        PTR_ADDIU    "%[dst],        %[dst],     " #dst_step "  \n\t"   \
+        PTR_ADDIU    "%[src2],       %[src2],    " #src2_step " \n\t"   \
+        PTR_ADDU     "%[src],        %[src],    %[src_stride]   \n\t"   \
+        PTR_ADDU     "%[dst],        %[dst],    %[dst_stride]   \n\t"   \
+        PTR_ADDIU    "%[src2],       %[src2],       0x80        \n\t"   \
+        "bnez         %[y],          1b                         \n\t"   \
+        : [ftmp0]"=&f"(ftmp[0]), [ftmp1]"=&f"(ftmp[1]),                 \
+          [ftmp2]"=&f"(ftmp[2]), [ftmp3]"=&f"(ftmp[3]),                 \
+          [ftmp4]"=&f"(ftmp[4]), [ftmp5]"=&f"(ftmp[5]),                 \
+          [ftmp6]"=&f"(ftmp[6]), [ftmp7]"=&f"(ftmp[7]),                 \
+          [ftmp8]"=&f"(ftmp[8]), [ftmp9]"=&f"(ftmp[9]),                 \
+          [ftmp10]"=&f"(ftmp[10]), [ftmp11]"=&f"(ftmp[11]),             \
+          [ftmp12]"=&f"(ftmp[12]), [src2]"+&r"(src2),                   \
+          [dst]"+&r"(dst), [src]"+&r"(src), [y]"+&r"(y), [x]"=&r"(x),   \
+          [offset]"+&f"(offset), [rtmp0]"=&r"(rtmp[0])                  \
+        : [src_stride]"r"(srcstride), [dst_stride]"r"(dststride),       \
+          [filter]"r"(filter), [shift]"f"(shift)                        \
+        : "memory"                                                      \
+    );                                                                  \
+}
+
+PUT_HEVC_QPEL_BI_H(4, 1, -4, -8, -4);
+PUT_HEVC_QPEL_BI_H(8, 2, -8, -16, -8);
+PUT_HEVC_QPEL_BI_H(12, 3, -12, -24, -12);
+PUT_HEVC_QPEL_BI_H(16, 4, -16, -32, -16);
+PUT_HEVC_QPEL_BI_H(24, 6, -24, -48, -24);
+PUT_HEVC_QPEL_BI_H(32, 8, -32, -64, -32);
+PUT_HEVC_QPEL_BI_H(48, 12, -48, -96, -48);
+PUT_HEVC_QPEL_BI_H(64, 16, -64, -128, -64);
+
+#define PUT_HEVC_QPEL_BI_HV(w, x_step, src_step, src2_step, dst_step)   \
+void ff_hevc_put_hevc_qpel_bi_hv##w##_8_mmi(uint8_t *_dst,              \
+                                            ptrdiff_t _dststride,       \
+                                            uint8_t *_src,              \
+                                            ptrdiff_t _srcstride,       \
+                                            int16_t *src2, int height,  \
+                                            intptr_t mx, intptr_t my,   \
+                                            int width)                  \
+{                                                                       \
+    int x, y;                                                           \
+    const int8_t *filter;                                               \
+    pixel *src = (pixel*)_src;                                          \
+    ptrdiff_t srcstride = _srcstride / sizeof(pixel);                   \
+    pixel *dst          = (pixel *)_dst;                                \
+    ptrdiff_t dststride = _dststride / sizeof(pixel);                   \
+    int16_t tmp_array[(MAX_PB_SIZE + QPEL_EXTRA) * MAX_PB_SIZE];        \
+    int16_t *tmp = tmp_array;                                           \
+    uint64_t ftmp[20];                                                  \
+    uint64_t rtmp[1];                                                   \
+    int shift = 7;                                                      \
+    int offset = 64;                                                    \
+                                                                        \
+    src   -= (QPEL_EXTRA_BEFORE * srcstride + 3);                       \
+    filter = ff_hevc_qpel_filters[mx - 1];                              \
+    x = width >> 2;                                                     \
+    y = height + QPEL_EXTRA;                                            \
+    __asm__ volatile(                                                   \
+        MMI_LDC1(%[ftmp1], %[filter], 0x00)                             \
+        "li           %[rtmp0],      0x08                       \n\t"   \
+        "dmtc1        %[rtmp0],      %[ftmp0]                   \n\t"   \
+        "punpckhbh    %[ftmp2],      %[ftmp0],      %[ftmp1]    \n\t"   \
+        "punpcklbh    %[ftmp1],      %[ftmp0],      %[ftmp1]    \n\t"   \
+        "psrah        %[ftmp1],      %[ftmp1],      %[ftmp0]    \n\t"   \
+        "psrah        %[ftmp2],      %[ftmp2],      %[ftmp0]    \n\t"   \
+        "xor          %[ftmp0],      %[ftmp0],      %[ftmp0]    \n\t"   \
+                                                                        \
+        "1:                                                     \n\t"   \
+        "2:                                                     \n\t"   \
+        "gsldlc1      %[ftmp3],      0x07(%[src])               \n\t"   \
+        "gsldrc1      %[ftmp3],      0x00(%[src])               \n\t"   \
+        "gsldlc1      %[ftmp4],      0x08(%[src])               \n\t"   \
+        "gsldrc1      %[ftmp4],      0x01(%[src])               \n\t"   \
+        "gsldlc1      %[ftmp5],      0x09(%[src])               \n\t"   \
+        "gsldrc1      %[ftmp5],      0x02(%[src])               \n\t"   \
+        "gsldlc1      %[ftmp6],      0x0a(%[src])               \n\t"   \
+        "gsldrc1      %[ftmp6],      0x03(%[src])               \n\t"   \
+        "punpcklbh    %[ftmp7],      %[ftmp3],      %[ftmp0]    \n\t"   \
+        "punpckhbh    %[ftmp8],      %[ftmp3],      %[ftmp0]    \n\t"   \
+        "pmullh       %[ftmp7],      %[ftmp7],      %[ftmp1]    \n\t"   \
+        "pmullh       %[ftmp8],      %[ftmp8],      %[ftmp2]    \n\t"   \
+        "paddh        %[ftmp3],      %[ftmp7],      %[ftmp8]    \n\t"   \
+        "punpcklbh    %[ftmp7],      %[ftmp4],      %[ftmp0]    \n\t"   \
+        "punpckhbh    %[ftmp8],      %[ftmp4],      %[ftmp0]    \n\t"   \
+        "pmullh       %[ftmp7],      %[ftmp7],      %[ftmp1]    \n\t"   \
+        "pmullh       %[ftmp8],      %[ftmp8],      %[ftmp2]    \n\t"   \
+        "paddh        %[ftmp4],      %[ftmp7],      %[ftmp8]    \n\t"   \
+        "punpcklbh    %[ftmp7],      %[ftmp5],      %[ftmp0]    \n\t"   \
+        "punpckhbh    %[ftmp8],      %[ftmp5],      %[ftmp0]    \n\t"   \
+        "pmullh       %[ftmp7],      %[ftmp7],      %[ftmp1]    \n\t"   \
+        "pmullh       %[ftmp8],      %[ftmp8],      %[ftmp2]    \n\t"   \
+        "paddh        %[ftmp5],      %[ftmp7],      %[ftmp8]    \n\t"   \
+        "punpcklbh    %[ftmp7],      %[ftmp6],      %[ftmp0]    \n\t"   \
+        "punpckhbh    %[ftmp8],      %[ftmp6],      %[ftmp0]    \n\t"   \
+        "pmullh       %[ftmp7],      %[ftmp7],      %[ftmp1]    \n\t"   \
+        "pmullh       %[ftmp8],      %[ftmp8],      %[ftmp2]    \n\t"   \
+        "paddh        %[ftmp6],      %[ftmp7],      %[ftmp8]    \n\t"   \
+        TRANSPOSE_4H(%[ftmp3], %[ftmp4], %[ftmp5], %[ftmp6],            \
+                     %[ftmp7], %[ftmp8], %[ftmp9], %[ftmp10])           \
+        "paddh        %[ftmp3],      %[ftmp3],      %[ftmp4]    \n\t"   \
+        "paddh        %[ftmp5],      %[ftmp5],      %[ftmp6]    \n\t"   \
+        "paddh        %[ftmp3],      %[ftmp3],      %[ftmp5]    \n\t"   \
+        "gssdlc1      %[ftmp3],      0x07(%[tmp])               \n\t"   \
+        "gssdrc1      %[ftmp3],      0x00(%[tmp])               \n\t"   \
+                                                                        \
+        "daddi        %[x],          %[x],         -0x01        \n\t"   \
+        PTR_ADDIU    "%[src],        %[src],        0x04        \n\t"   \
+        PTR_ADDIU    "%[tmp],        %[tmp],        0x08        \n\t"   \
+        "bnez         %[x],          2b                         \n\t"   \
+                                                                        \
+        "daddi        %[y],          %[y],         -0x01        \n\t"   \
+        "li           %[x],        " #x_step "                  \n\t"   \
+        PTR_ADDIU    "%[src],        %[src],      " #src_step " \n\t"   \
+        PTR_ADDIU    "%[tmp],        %[tmp],     " #src2_step " \n\t"   \
+        PTR_ADDU     "%[src],        %[src],        %[stride]   \n\t"   \
+        PTR_ADDIU    "%[tmp],        %[tmp],        0x80        \n\t"   \
+        "bnez         %[y],          1b                         \n\t"   \
+        : [ftmp0]"=&f"(ftmp[0]), [ftmp1]"=&f"(ftmp[1]),                 \
+          [ftmp2]"=&f"(ftmp[2]), [ftmp3]"=&f"(ftmp[3]),                 \
+          [ftmp4]"=&f"(ftmp[4]), [ftmp5]"=&f"(ftmp[5]),                 \
+          [ftmp6]"=&f"(ftmp[6]), [ftmp7]"=&f"(ftmp[7]),                 \
+          [ftmp8]"=&f"(ftmp[8]), [ftmp9]"=&f"(ftmp[9]),                 \
+          [ftmp10]"=&f"(ftmp[10]), [rtmp0]"=&r"(rtmp[0]),               \
+          [src]"+&r"(src), [tmp]"+&r"(tmp), [y]"+&r"(y),                \
+          [x]"+&r"(x)                                                   \
+        : [filter]"r"(filter), [stride]"r"(srcstride)                   \
+        : "memory"                                                      \
+    );                                                                  \
+                                                                        \
+    tmp    = tmp_array;                                                 \
+    filter = ff_hevc_qpel_filters[my - 1];                              \
+    x = width >> 2;                                                     \
+    y = height;                                                         \
+    __asm__ volatile(                                                   \
+        MMI_LDC1(%[ftmp1], %[filter], 0x00)                             \
+        "li           %[rtmp0],      0x08                       \n\t"   \
+        "dmtc1        %[rtmp0],      %[ftmp0]                   \n\t"   \
+        "punpckhbh    %[ftmp2],      %[ftmp0],      %[ftmp1]    \n\t"   \
+        "punpcklbh    %[ftmp1],      %[ftmp0],      %[ftmp1]    \n\t"   \
+        "psrah        %[ftmp1],      %[ftmp1],      %[ftmp0]    \n\t"   \
+        "psrah        %[ftmp2],      %[ftmp2],      %[ftmp0]    \n\t"   \
+        "li           %[rtmp0],      0x06                       \n\t"   \
+        "dmtc1        %[rtmp0],      %[ftmp0]                   \n\t"   \
+        "punpcklwd    %[offset],     %[offset],     %[offset]   \n\t"   \
+                                                                        \
+        "1:                                                     \n\t"   \
+        "li           %[x],        " #x_step "                  \n\t"   \
+        "2:                                                     \n\t"   \
+        "gsldlc1      %[ftmp3],      0x07(%[tmp])               \n\t"   \
+        "gsldrc1      %[ftmp3],      0x00(%[tmp])               \n\t"   \
+        PTR_ADDIU    "%[tmp],        %[tmp],        0x80        \n\t"   \
+        "gsldlc1      %[ftmp4],      0x07(%[tmp])               \n\t"   \
+        "gsldrc1      %[ftmp4],      0x00(%[tmp])               \n\t"   \
+        PTR_ADDIU    "%[tmp],        %[tmp],        0x80        \n\t"   \
+        "gsldlc1      %[ftmp5],      0x07(%[tmp])               \n\t"   \
+        "gsldrc1      %[ftmp5],      0x00(%[tmp])               \n\t"   \
+        PTR_ADDIU    "%[tmp],        %[tmp],        0x80        \n\t"   \
+        "gsldlc1      %[ftmp6],      0x07(%[tmp])               \n\t"   \
+        "gsldrc1      %[ftmp6],      0x00(%[tmp])               \n\t"   \
+        PTR_ADDIU    "%[tmp],        %[tmp],        0x80        \n\t"   \
+        "gsldlc1      %[ftmp7],      0x07(%[tmp])               \n\t"   \
+        "gsldrc1      %[ftmp7],      0x00(%[tmp])               \n\t"   \
+        PTR_ADDIU    "%[tmp],        %[tmp],        0x80        \n\t"   \
+        "gsldlc1      %[ftmp8],      0x07(%[tmp])               \n\t"   \
+        "gsldrc1      %[ftmp8],      0x00(%[tmp])               \n\t"   \
+        PTR_ADDIU    "%[tmp],        %[tmp],        0x80        \n\t"   \
+        "gsldlc1      %[ftmp9],      0x07(%[tmp])               \n\t"   \
+        "gsldrc1      %[ftmp9],      0x00(%[tmp])               \n\t"   \
+        PTR_ADDIU    "%[tmp],        %[tmp],        0x80        \n\t"   \
+        "gsldlc1      %[ftmp10],     0x07(%[tmp])               \n\t"   \
+        "gsldrc1      %[ftmp10],     0x00(%[tmp])               \n\t"   \
+        PTR_ADDIU    "%[tmp],        %[tmp],        -0x380      \n\t"   \
+        TRANSPOSE_4H(%[ftmp3], %[ftmp4], %[ftmp5], %[ftmp6],            \
+                     %[ftmp11], %[ftmp12], %[ftmp13], %[ftmp14])        \
+        TRANSPOSE_4H(%[ftmp7], %[ftmp8], %[ftmp9], %[ftmp10],           \
+                     %[ftmp11], %[ftmp12], %[ftmp13], %[ftmp14])        \
+        "pmaddhw      %[ftmp11],     %[ftmp3],      %[ftmp1]    \n\t"   \
+        "pmaddhw      %[ftmp12],     %[ftmp7],      %[ftmp2]    \n\t"   \
+        "pmaddhw      %[ftmp13],     %[ftmp4],      %[ftmp1]    \n\t"   \
+        "pmaddhw      %[ftmp14],     %[ftmp8],      %[ftmp2]    \n\t"   \
+        "paddw        %[ftmp11],     %[ftmp11],     %[ftmp12]   \n\t"   \
+        "paddw        %[ftmp13],     %[ftmp13],     %[ftmp14]   \n\t"   \
+        TRANSPOSE_2W(%[ftmp11], %[ftmp13], %[ftmp3], %[ftmp4])          \
+        "paddw        %[ftmp3],      %[ftmp3],      %[ftmp4]    \n\t"   \
+        "psraw        %[ftmp3],      %[ftmp3],      %[ftmp0]    \n\t"   \
+        "pmaddhw      %[ftmp11],     %[ftmp5],      %[ftmp1]    \n\t"   \
+        "pmaddhw      %[ftmp12],     %[ftmp9],      %[ftmp2]    \n\t"   \
+        "pmaddhw      %[ftmp13],     %[ftmp6],      %[ftmp1]    \n\t"   \
+        "pmaddhw      %[ftmp14],     %[ftmp10],     %[ftmp2]    \n\t"   \
+        "paddw        %[ftmp11],     %[ftmp11],     %[ftmp12]   \n\t"   \
+        "paddw        %[ftmp13],     %[ftmp13],     %[ftmp14]   \n\t"   \
+        TRANSPOSE_2W(%[ftmp11], %[ftmp13], %[ftmp5], %[ftmp6])          \
+        "paddw        %[ftmp5],      %[ftmp5],      %[ftmp6]    \n\t"   \
+        "psraw        %[ftmp5],      %[ftmp5],      %[ftmp0]    \n\t"   \
+        "packsswh     %[ftmp3],      %[ftmp3],      %[ftmp5]    \n\t"   \
+        "gsldlc1      %[ftmp4],      0x07(%[src2])              \n\t"   \
+        "gsldrc1      %[ftmp4],      0x00(%[src2])              \n\t"   \
+        "xor          %[ftmp7],      %[ftmp7],      %[ftmp7]    \n\t"   \
+        "li           %[rtmp0],      0x10                       \n\t"   \
+        "dmtc1        %[rtmp0],      %[ftmp8]                   \n\t"   \
+        "punpcklhw    %[ftmp5],      %[ftmp7],      %[ftmp3]    \n\t"   \
+        "punpckhhw    %[ftmp6],      %[ftmp7],      %[ftmp3]    \n\t"   \
+        "punpckhhw    %[ftmp3],      %[ftmp7],      %[ftmp4]    \n\t"   \
+        "punpcklhw    %[ftmp4],      %[ftmp7],      %[ftmp4]    \n\t"   \
+        "psraw        %[ftmp5],      %[ftmp5],      %[ftmp8]    \n\t"   \
+        "psraw        %[ftmp6],      %[ftmp6],      %[ftmp8]    \n\t"   \
+        "psraw        %[ftmp3],      %[ftmp3],      %[ftmp8]    \n\t"   \
+        "psraw        %[ftmp4],      %[ftmp4],      %[ftmp8]    \n\t"   \
+        "paddw        %[ftmp5],      %[ftmp5],      %[ftmp4]    \n\t"   \
+        "paddw        %[ftmp6],      %[ftmp6],      %[ftmp3]    \n\t"   \
+        "paddw        %[ftmp5],      %[ftmp5],      %[offset]   \n\t"   \
+        "paddw        %[ftmp6],      %[ftmp6],      %[offset]   \n\t"   \
+        "psraw        %[ftmp5],      %[ftmp5],      %[shift]    \n\t"   \
+        "psraw        %[ftmp6],      %[ftmp6],      %[shift]    \n\t"   \
+        "packsswh     %[ftmp5],      %[ftmp5],      %[ftmp6]    \n\t"   \
+        "pcmpgth      %[ftmp7],      %[ftmp5],      %[ftmp7]    \n\t"   \
+        "and          %[ftmp3],      %[ftmp5],      %[ftmp7]    \n\t"   \
+        "packushb     %[ftmp3],      %[ftmp3],      %[ftmp3]    \n\t"   \
+        "gsswlc1      %[ftmp3],      0x03(%[dst])               \n\t"   \
+        "gsswrc1      %[ftmp3],      0x00(%[dst])               \n\t"   \
+                                                                        \
+        "daddi        %[x],          %[x],         -0x01        \n\t"   \
+        PTR_ADDIU    "%[src2],       %[src2],       0x08        \n\t"   \
+        PTR_ADDIU    "%[tmp],        %[tmp],        0x08        \n\t"   \
+        PTR_ADDIU    "%[dst],        %[dst],        0x04        \n\t"   \
+        "bnez         %[x],          2b                         \n\t"   \
+                                                                        \
+        "daddi        %[y],          %[y],         -0x01        \n\t"   \
+        PTR_ADDIU    "%[src2],       %[src2],    " #src2_step " \n\t"   \
+        PTR_ADDIU    "%[tmp],        %[tmp],     " #src2_step " \n\t"   \
+        PTR_ADDIU    "%[dst],        %[dst],     " #dst_step "  \n\t"   \
+        PTR_ADDIU    "%[src2],       %[src2],       0x80        \n\t"   \
+        PTR_ADDU     "%[dst],        %[dst],        %[stride]   \n\t"   \
+        PTR_ADDIU    "%[tmp],        %[tmp],        0x80        \n\t"   \
+        "bnez         %[y],          1b                         \n\t"   \
+        : [ftmp0]"=&f"(ftmp[0]), [ftmp1]"=&f"(ftmp[1]),                 \
+          [ftmp2]"=&f"(ftmp[2]), [ftmp3]"=&f"(ftmp[3]),                 \
+          [ftmp4]"=&f"(ftmp[4]), [ftmp5]"=&f"(ftmp[5]),                 \
+          [ftmp6]"=&f"(ftmp[6]), [ftmp7]"=&f"(ftmp[7]),                 \
+          [ftmp8]"=&f"(ftmp[8]), [ftmp9]"=&f"(ftmp[9]),                 \
+          [ftmp10]"=&f"(ftmp[10]), [ftmp11]"=&f"(ftmp[11]),             \
+          [ftmp12]"=&f"(ftmp[12]), [ftmp13]"=&f"(ftmp[13]),             \
+          [ftmp14]"=&f"(ftmp[14]), [src2]"+&r"(src2),                   \
+          [dst]"+&r"(dst), [tmp]"+&r"(tmp), [y]"+&r"(y), [x]"=&r"(x),   \
+          [offset]"+&f"(offset), [rtmp0]"=&r"(rtmp[0])                  \
+        : [filter]"r"(filter), [stride]"r"(dststride),                  \
+          [shift]"f"(shift)                                             \
+        : "memory"                                                      \
+    );                                                                  \
+}
+
+PUT_HEVC_QPEL_BI_HV(4, 1, -4, -8, -4);
+PUT_HEVC_QPEL_BI_HV(8, 2, -8, -16, -8);
+PUT_HEVC_QPEL_BI_HV(12, 3, -12, -24, -12);
+PUT_HEVC_QPEL_BI_HV(16, 4, -16, -32, -16);
+PUT_HEVC_QPEL_BI_HV(24, 6, -24, -48, -24);
+PUT_HEVC_QPEL_BI_HV(32, 8, -32, -64, -32);
+PUT_HEVC_QPEL_BI_HV(48, 12, -48, -96, -48);
+PUT_HEVC_QPEL_BI_HV(64, 16, -64, -128, -64);
+
+#define PUT_HEVC_EPEL_BI_HV(w, x_step, src_step, src2_step, dst_step)   \
+void ff_hevc_put_hevc_epel_bi_hv##w##_8_mmi(uint8_t *_dst,              \
+                                            ptrdiff_t _dststride,       \
+                                            uint8_t *_src,              \
+                                            ptrdiff_t _srcstride,       \
+                                            int16_t *src2, int height,  \
+                                            intptr_t mx, intptr_t my,   \
+                                            int width)                  \
+{                                                                       \
+    int x, y;                                                           \
+    pixel *src = (pixel *)_src;                                         \
+    ptrdiff_t srcstride = _srcstride / sizeof(pixel);                   \
+    pixel *dst          = (pixel *)_dst;                                \
+    ptrdiff_t dststride = _dststride / sizeof(pixel);                   \
+    const int8_t *filter = ff_hevc_epel_filters[mx - 1];                \
+    int16_t tmp_array[(MAX_PB_SIZE + EPEL_EXTRA) * MAX_PB_SIZE];        \
+    int16_t *tmp = tmp_array;                                           \
+    uint64_t ftmp[12];                                                  \
+    uint64_t rtmp[1];                                                   \
+    int shift = 7;                                                      \
+    int offset = 64;                                                    \
+                                                                        \
+    src -= (EPEL_EXTRA_BEFORE * srcstride + 1);                         \
+    x = width >> 2;                                                     \
+    y = height + EPEL_EXTRA;                                            \
+    __asm__ volatile(                                                   \
+        MMI_LWC1(%[ftmp1], %[filter], 0x00)                             \
+        "li           %[rtmp0],      0x08                       \n\t"   \
+        "dmtc1        %[rtmp0],      %[ftmp0]                   \n\t"   \
+        "punpcklbh    %[ftmp1],      %[ftmp0],      %[ftmp1]    \n\t"   \
+        "psrah        %[ftmp1],      %[ftmp1],      %[ftmp0]    \n\t"   \
+        "xor          %[ftmp0],      %[ftmp0],      %[ftmp0]    \n\t"   \
+                                                                        \
+        "1:                                                     \n\t"   \
+        "2:                                                     \n\t"   \
+        "gslwlc1      %[ftmp2],      0x03(%[src])               \n\t"   \
+        "gslwrc1      %[ftmp2],      0x00(%[src])               \n\t"   \
+        "gslwlc1      %[ftmp3],      0x04(%[src])               \n\t"   \
+        "gslwrc1      %[ftmp3],      0x01(%[src])               \n\t"   \
+        "gslwlc1      %[ftmp4],      0x05(%[src])               \n\t"   \
+        "gslwrc1      %[ftmp4],      0x02(%[src])               \n\t"   \
+        "gslwlc1      %[ftmp5],      0x06(%[src])               \n\t"   \
+        "gslwrc1      %[ftmp5],      0x03(%[src])               \n\t"   \
+        "punpcklbh    %[ftmp2],      %[ftmp2],      %[ftmp0]    \n\t"   \
+        "pmullh       %[ftmp2],      %[ftmp2],      %[ftmp1]    \n\t"   \
+        "punpcklbh    %[ftmp3],      %[ftmp3],      %[ftmp0]    \n\t"   \
+        "pmullh       %[ftmp3],      %[ftmp3],      %[ftmp1]    \n\t"   \
+        "punpcklbh    %[ftmp4],      %[ftmp4],      %[ftmp0]    \n\t"   \
+        "pmullh       %[ftmp4],      %[ftmp4],      %[ftmp1]    \n\t"   \
+        "punpcklbh    %[ftmp5],      %[ftmp5],      %[ftmp0]    \n\t"   \
+        "pmullh       %[ftmp5],      %[ftmp5],      %[ftmp1]    \n\t"   \
+        TRANSPOSE_4H(%[ftmp2], %[ftmp3], %[ftmp4], %[ftmp5],            \
+                     %[ftmp6], %[ftmp7], %[ftmp8], %[ftmp9])            \
+        "paddh        %[ftmp2],      %[ftmp2],      %[ftmp3]    \n\t"   \
+        "paddh        %[ftmp4],      %[ftmp4],      %[ftmp5]    \n\t"   \
+        "paddh        %[ftmp2],      %[ftmp2],      %[ftmp4]    \n\t"   \
+        "gssdlc1      %[ftmp2],      0x07(%[tmp])               \n\t"   \
+        "gssdrc1      %[ftmp2],      0x00(%[tmp])               \n\t"   \
+                                                                        \
+        "daddi        %[x],          %[x],         -0x01        \n\t"   \
+        PTR_ADDIU    "%[src],        %[src],        0x04        \n\t"   \
+        PTR_ADDIU    "%[tmp],        %[tmp],        0x08        \n\t"   \
+        "bnez         %[x],          2b                         \n\t"   \
+                                                                        \
+        "daddi        %[y],          %[y],         -0x01        \n\t"   \
+        "li           %[x],        " #x_step "                  \n\t"   \
+        PTR_ADDIU    "%[src],        %[src],      " #src_step " \n\t"   \
+        PTR_ADDIU    "%[tmp],        %[tmp],     " #src2_step " \n\t"   \
+        PTR_ADDU     "%[src],        %[src],        %[stride]   \n\t"   \
+        PTR_ADDIU    "%[tmp],        %[tmp],        0x80        \n\t"   \
+        "bnez         %[y],          1b                         \n\t"   \
+        : [ftmp0]"=&f"(ftmp[0]), [ftmp1]"=&f"(ftmp[1]),                 \
+          [ftmp2]"=&f"(ftmp[2]), [ftmp3]"=&f"(ftmp[3]),                 \
+          [ftmp4]"=&f"(ftmp[4]), [ftmp5]"=&f"(ftmp[5]),                 \
+          [ftmp6]"=&f"(ftmp[6]), [ftmp7]"=&f"(ftmp[7]),                 \
+          [ftmp8]"=&f"(ftmp[8]), [ftmp9]"=&f"(ftmp[9]),                 \
+          [rtmp0]"=&r"(rtmp[0]),                                        \
+          [src]"+&r"(src), [tmp]"+&r"(tmp), [y]"+&r"(y),                \
+          [x]"+&r"(x)                                                   \
+        : [filter]"r"(filter), [stride]"r"(srcstride)                   \
+        : "memory"                                                      \
+    );                                                                  \
+                                                                        \
+    tmp      = tmp_array;                                               \
+    filter = ff_hevc_epel_filters[my - 1];                              \
+    x = width >> 2;                                                     \
+    y = height;                                                         \
+    __asm__ volatile(                                                   \
+        MMI_LWC1(%[ftmp1], %[filter], 0x00)                             \
+        "li           %[rtmp0],      0x08                       \n\t"   \
+        "dmtc1        %[rtmp0],      %[ftmp0]                   \n\t"   \
+        "punpcklbh    %[ftmp1],      %[ftmp0],      %[ftmp1]    \n\t"   \
+        "psrah        %[ftmp1],      %[ftmp1],      %[ftmp0]    \n\t"   \
+        "li           %[rtmp0],      0x06                       \n\t"   \
+        "dmtc1        %[rtmp0],      %[ftmp0]                   \n\t"   \
+        "punpcklwd    %[offset],     %[offset],     %[offset]   \n\t"   \
+        "xor          %[ftmp2],      %[ftmp2],      %[ftmp2]    \n\t"   \
+                                                                        \
+        "1:                                                     \n\t"   \
+        "li           %[x],        " #x_step "                  \n\t"   \
+        "2:                                                     \n\t"   \
+        "gsldlc1      %[ftmp3],      0x07(%[tmp])               \n\t"   \
+        "gsldrc1      %[ftmp3],      0x00(%[tmp])               \n\t"   \
+        PTR_ADDIU    "%[tmp],        %[tmp],        0x80        \n\t"   \
+        "gsldlc1      %[ftmp4],      0x07(%[tmp])               \n\t"   \
+        "gsldrc1      %[ftmp4],      0x00(%[tmp])               \n\t"   \
+        PTR_ADDIU    "%[tmp],        %[tmp],        0x80        \n\t"   \
+        "gsldlc1      %[ftmp5],      0x07(%[tmp])               \n\t"   \
+        "gsldrc1      %[ftmp5],      0x00(%[tmp])               \n\t"   \
+        PTR_ADDIU    "%[tmp],        %[tmp],        0x80        \n\t"   \
+        "gsldlc1      %[ftmp6],      0x07(%[tmp])               \n\t"   \
+        "gsldrc1      %[ftmp6],      0x00(%[tmp])               \n\t"   \
+        PTR_ADDIU    "%[tmp],        %[tmp],       -0x180       \n\t"   \
+        TRANSPOSE_4H(%[ftmp3], %[ftmp4], %[ftmp5], %[ftmp6],            \
+                     %[ftmp7], %[ftmp8], %[ftmp9], %[ftmp10])           \
+        "pmaddhw      %[ftmp7],      %[ftmp3],      %[ftmp1]    \n\t"   \
+        "pmaddhw      %[ftmp8],      %[ftmp4],      %[ftmp1]    \n\t"   \
+        TRANSPOSE_2W(%[ftmp7], %[ftmp8], %[ftmp3], %[ftmp4])            \
+        "paddw        %[ftmp3],      %[ftmp3],      %[ftmp4]    \n\t"   \
+        "psraw        %[ftmp3],      %[ftmp3],      %[ftmp0]    \n\t"   \
+        "pmaddhw      %[ftmp7],      %[ftmp5],      %[ftmp1]    \n\t"   \
+        "pmaddhw      %[ftmp8],      %[ftmp6],      %[ftmp1]    \n\t"   \
+        TRANSPOSE_2W(%[ftmp7], %[ftmp8], %[ftmp5], %[ftmp6])            \
+        "paddw        %[ftmp5],      %[ftmp5],      %[ftmp6]    \n\t"   \
+        "psraw        %[ftmp5],      %[ftmp5],      %[ftmp0]    \n\t"   \
+        "packsswh     %[ftmp3],      %[ftmp3],      %[ftmp5]    \n\t"   \
+        "gsldlc1      %[ftmp4],      0x07(%[src2])              \n\t"   \
+        "gsldrc1      %[ftmp4],      0x00(%[src2])              \n\t"   \
+        "li           %[rtmp0],      0x10                       \n\t"   \
+        "dmtc1        %[rtmp0],      %[ftmp8]                   \n\t"   \
+        "punpcklhw    %[ftmp5],      %[ftmp2],      %[ftmp3]    \n\t"   \
+        "punpckhhw    %[ftmp6],      %[ftmp2],      %[ftmp3]    \n\t"   \
+        "punpckhhw    %[ftmp3],      %[ftmp2],      %[ftmp4]    \n\t"   \
+        "punpcklhw    %[ftmp4],      %[ftmp2],      %[ftmp4]    \n\t"   \
+        "psraw        %[ftmp5],      %[ftmp5],      %[ftmp8]    \n\t"   \
+        "psraw        %[ftmp6],      %[ftmp6],      %[ftmp8]    \n\t"   \
+        "psraw        %[ftmp3],      %[ftmp3],      %[ftmp8]    \n\t"   \
+        "psraw        %[ftmp4],      %[ftmp4],      %[ftmp8]    \n\t"   \
+        "paddw        %[ftmp5],      %[ftmp5],      %[ftmp4]    \n\t"   \
+        "paddw        %[ftmp6],      %[ftmp6],      %[ftmp3]    \n\t"   \
+        "paddw        %[ftmp5],      %[ftmp5],      %[offset]   \n\t"   \
+        "paddw        %[ftmp6],      %[ftmp6],      %[offset]   \n\t"   \
+        "psraw        %[ftmp5],      %[ftmp5],      %[shift]    \n\t"   \
+        "psraw        %[ftmp6],      %[ftmp6],      %[shift]    \n\t"   \
+        "packsswh     %[ftmp5],      %[ftmp5],      %[ftmp6]    \n\t"   \
+        "pcmpgth      %[ftmp7],      %[ftmp5],      %[ftmp2]    \n\t"   \
+        "and          %[ftmp3],      %[ftmp5],      %[ftmp7]    \n\t"   \
+        "packushb     %[ftmp3],      %[ftmp3],      %[ftmp3]    \n\t"   \
+        "gsswlc1      %[ftmp3],      0x03(%[dst])               \n\t"   \
+        "gsswrc1      %[ftmp3],      0x00(%[dst])               \n\t"   \
+                                                                        \
+        "daddi        %[x],          %[x],         -0x01        \n\t"   \
+        PTR_ADDIU    "%[src2],       %[src2],       0x08        \n\t"   \
+        PTR_ADDIU    "%[tmp],        %[tmp],        0x08        \n\t"   \
+        PTR_ADDIU    "%[dst],        %[dst],        0x04        \n\t"   \
+        "bnez         %[x],          2b                         \n\t"   \
+                                                                        \
+        "daddi        %[y],          %[y],         -0x01        \n\t"   \
+        PTR_ADDIU    "%[src2],       %[src2],    " #src2_step " \n\t"   \
+        PTR_ADDIU    "%[tmp],        %[tmp],     " #src2_step " \n\t"   \
+        PTR_ADDIU    "%[dst],        %[dst],     " #dst_step "  \n\t"   \
+        PTR_ADDIU    "%[src2],       %[src2],       0x80        \n\t"   \
+        PTR_ADDU     "%[dst],        %[dst],        %[stride]   \n\t"   \
+        PTR_ADDIU    "%[tmp],        %[tmp],        0x80        \n\t"   \
+        "bnez         %[y],          1b                         \n\t"   \
+        : [ftmp0]"=&f"(ftmp[0]), [ftmp1]"=&f"(ftmp[1]),                 \
+          [ftmp2]"=&f"(ftmp[2]), [ftmp3]"=&f"(ftmp[3]),                 \
+          [ftmp4]"=&f"(ftmp[4]), [ftmp5]"=&f"(ftmp[5]),                 \
+          [ftmp6]"=&f"(ftmp[6]), [ftmp7]"=&f"(ftmp[7]),                 \
+          [ftmp8]"=&f"(ftmp[8]), [ftmp9]"=&f"(ftmp[9]),                 \
+          [ftmp10]"=&f"(ftmp[10]), [src2]"+&r"(src2),                   \
+          [dst]"+&r"(dst), [tmp]"+&r"(tmp), [y]"+&r"(y), [x]"=&r"(x),   \
+          [offset]"+&f"(offset), [rtmp0]"=&r"(rtmp[0])                  \
+        : [filter]"r"(filter), [stride]"r"(dststride),                  \
+          [shift]"f"(shift)                                             \
+        : "memory"                                                      \
+    );                                                                  \
+}
+
+PUT_HEVC_EPEL_BI_HV(4, 1, -4, -8, -4);
+PUT_HEVC_EPEL_BI_HV(8, 2, -8, -16, -8);
+PUT_HEVC_EPEL_BI_HV(12, 3, -12, -24, -12);
+PUT_HEVC_EPEL_BI_HV(16, 4, -16, -32, -16);
+PUT_HEVC_EPEL_BI_HV(24, 6, -24, -48, -24);
+PUT_HEVC_EPEL_BI_HV(32, 8, -32, -64, -32);
+
+#define PUT_HEVC_PEL_BI_PIXELS(w, x_step, src_step, dst_step, src2_step)  \
+void ff_hevc_put_hevc_pel_bi_pixels##w##_8_mmi(uint8_t *_dst,             \
+                                               ptrdiff_t _dststride,      \
+                                               uint8_t *_src,             \
+                                               ptrdiff_t _srcstride,      \
+                                               int16_t *src2, int height, \
+                                               intptr_t mx, intptr_t my,  \
+                                               int width)                 \
+{                                                                         \
+    int x, y;                                                             \
+    pixel *src          = (pixel *)_src;                                  \
+    ptrdiff_t srcstride = _srcstride / sizeof(pixel);                     \
+    pixel *dst          = (pixel *)_dst;                                  \
+    ptrdiff_t dststride = _dststride / sizeof(pixel);                     \
+    uint64_t ftmp[12];                                                    \
+    uint64_t rtmp[1];                                                     \
+    int shift = 7;                                                        \
+                                                                          \
+    y = height;                                                           \
+    x = width >> 3;                                                       \
+    __asm__ volatile(                                                     \
+        "xor          %[ftmp0],      %[ftmp0],      %[ftmp0]    \n\t"     \
+        "li           %[rtmp0],      0x06                       \n\t"     \
+        "dmtc1        %[rtmp0],      %[ftmp1]                   \n\t"     \
+        "li           %[rtmp0],      0x10                       \n\t"     \
+        "dmtc1        %[rtmp0],      %[ftmp10]                  \n\t"     \
+        "li           %[rtmp0],      0x40                       \n\t"     \
+        "dmtc1        %[rtmp0],      %[offset]                  \n\t"     \
+        "punpcklhw    %[offset],     %[offset],     %[offset]   \n\t"     \
+        "punpcklwd    %[offset],     %[offset],     %[offset]   \n\t"     \
+                                                                          \
+        "1:                                                     \n\t"     \
+        "2:                                                     \n\t"     \
+        "gsldlc1      %[ftmp5],      0x07(%[src])               \n\t"     \
+        "gsldrc1      %[ftmp5],      0x00(%[src])               \n\t"     \
+        "gsldlc1      %[ftmp2],      0x07(%[src2])              \n\t"     \
+        "gsldrc1      %[ftmp2],      0x00(%[src2])              \n\t"     \
+        "gsldlc1      %[ftmp3],      0x0f(%[src2])              \n\t"     \
+        "gsldrc1      %[ftmp3],      0x08(%[src2])              \n\t"     \
+        "punpcklbh    %[ftmp4],      %[ftmp5],      %[ftmp0]    \n\t"     \
+        "punpckhbh    %[ftmp5],      %[ftmp5],      %[ftmp0]    \n\t"     \
+        "psllh        %[ftmp4],      %[ftmp4],      %[ftmp1]    \n\t"     \
+        "psllh        %[ftmp5],      %[ftmp5],      %[ftmp1]    \n\t"     \
+        "paddh        %[ftmp4],      %[ftmp4],      %[offset]   \n\t"     \
+        "paddh        %[ftmp5],      %[ftmp5],      %[offset]   \n\t"     \
+        "punpcklhw    %[ftmp6],      %[ftmp4],      %[ftmp0]    \n\t"     \
+        "punpckhhw    %[ftmp7],      %[ftmp4],      %[ftmp0]    \n\t"     \
+        "punpcklhw    %[ftmp8],      %[ftmp5],      %[ftmp0]    \n\t"     \
+        "punpckhhw    %[ftmp9],      %[ftmp5],      %[ftmp0]    \n\t"     \
+        "punpcklhw    %[ftmp4],      %[ftmp0],      %[ftmp3]    \n\t"     \
+        "punpckhhw    %[ftmp5],      %[ftmp0],      %[ftmp3]    \n\t"     \
+        "punpckhhw    %[ftmp3],      %[ftmp0],      %[ftmp2]    \n\t"     \
+        "punpcklhw    %[ftmp2],      %[ftmp0],      %[ftmp2]    \n\t"     \
+        "psraw        %[ftmp2],      %[ftmp2],      %[ftmp10]   \n\t"     \
+        "psraw        %[ftmp3],      %[ftmp3],      %[ftmp10]   \n\t"     \
+        "psraw        %[ftmp4],      %[ftmp4],      %[ftmp10]   \n\t"     \
+        "psraw        %[ftmp5],      %[ftmp5],      %[ftmp10]   \n\t"     \
+        "paddw        %[ftmp2],      %[ftmp2],      %[ftmp6]    \n\t"     \
+        "paddw        %[ftmp3],      %[ftmp3],      %[ftmp7]    \n\t"     \
+        "paddw        %[ftmp4],      %[ftmp4],      %[ftmp8]    \n\t"     \
+        "paddw        %[ftmp5],      %[ftmp5],      %[ftmp9]    \n\t"     \
+        "psraw        %[ftmp2],      %[ftmp2],      %[shift]    \n\t"     \
+        "psraw        %[ftmp3],      %[ftmp3],      %[shift]    \n\t"     \
+        "psraw        %[ftmp4],      %[ftmp4],      %[shift]    \n\t"     \
+        "psraw        %[ftmp5],      %[ftmp5],      %[shift]    \n\t"     \
+        "packsswh     %[ftmp2],      %[ftmp2],      %[ftmp3]    \n\t"     \
+        "packsswh     %[ftmp4],      %[ftmp4],      %[ftmp5]    \n\t"     \
+        "pcmpgth      %[ftmp3],      %[ftmp2],      %[ftmp0]    \n\t"     \
+        "pcmpgth      %[ftmp5],      %[ftmp4],      %[ftmp0]    \n\t"     \
+        "and          %[ftmp2],      %[ftmp2],      %[ftmp3]    \n\t"     \
+        "and          %[ftmp4],      %[ftmp4],      %[ftmp5]    \n\t"     \
+        "packushb     %[ftmp2],      %[ftmp2],      %[ftmp4]    \n\t"     \
+        "gssdlc1      %[ftmp2],      0x07(%[dst])               \n\t"     \
+        "gssdrc1      %[ftmp2],      0x00(%[dst])               \n\t"     \
+                                                                          \
+        "daddi        %[x],          %[x],         -0x01        \n\t"     \
+        PTR_ADDIU    "%[src],        %[src],        0x08        \n\t"     \
+        PTR_ADDIU    "%[dst],        %[dst],        0x08        \n\t"     \
+        PTR_ADDIU    "%[src2],       %[src2],       0x10        \n\t"     \
+        "bnez         %[x],          2b                         \n\t"     \
+                                                                          \
+        PTR_ADDIU    "%[src],        %[src],     " #src_step "  \n\t"     \
+        PTR_ADDIU    "%[dst],        %[dst],     " #dst_step "  \n\t"     \
+        PTR_ADDIU    "%[src2],       %[src2],    " #src2_step " \n\t"     \
+        "li           %[x],        " #x_step "                  \n\t"     \
+        "daddi        %[y],          %[y],         -0x01        \n\t"     \
+        PTR_ADDU     "%[src],        %[src],       %[srcstride] \n\t"     \
+        PTR_ADDU     "%[dst],        %[dst],       %[dststride] \n\t"     \
+        PTR_ADDIU    "%[src2],       %[src2],       0x80        \n\t"     \
+        "bnez         %[y],          1b                         \n\t"     \
+        : [ftmp0]"=&f"(ftmp[0]), [ftmp1]"=&f"(ftmp[1]),                   \
+          [ftmp2]"=&f"(ftmp[2]), [ftmp3]"=&f"(ftmp[3]),                   \
+          [ftmp4]"=&f"(ftmp[4]), [ftmp5]"=&f"(ftmp[5]),                   \
+          [ftmp6]"=&f"(ftmp[6]), [ftmp7]"=&f"(ftmp[7]),                   \
+          [ftmp8]"=&f"(ftmp[8]), [ftmp9]"=&f"(ftmp[9]),                   \
+          [ftmp10]"=&f"(ftmp[10]), [offset]"=&f"(ftmp[11]),               \
+          [src2]"+&r"(src2), [dst]"+&r"(dst), [src]"+&r"(src),            \
+          [x]"+&r"(x), [y]"+&r"(y), [rtmp0]"=&r"(rtmp[0])                 \
+        : [dststride]"r"(dststride), [shift]"f"(shift),                   \
+          [srcstride]"r"(srcstride)                                       \
+        : "memory"                                                        \
+    );                                                                    \
+}                                                                         \
+
+PUT_HEVC_PEL_BI_PIXELS(8, 1, -8, -8, -16);
+PUT_HEVC_PEL_BI_PIXELS(16, 2, -16, -16, -32);
+PUT_HEVC_PEL_BI_PIXELS(24, 3, -24, -24, -48);
+PUT_HEVC_PEL_BI_PIXELS(32, 4, -32, -32, -64);
+PUT_HEVC_PEL_BI_PIXELS(48, 6, -48, -48, -96);
+PUT_HEVC_PEL_BI_PIXELS(64, 8, -64, -64, -128);
+
+#define PUT_HEVC_QPEL_UNI_HV(w, x_step, src_step, dst_step, tmp_step)   \
+void ff_hevc_put_hevc_qpel_uni_hv##w##_8_mmi(uint8_t *_dst,             \
+                                             ptrdiff_t _dststride,      \
+                                             uint8_t *_src,             \
+                                             ptrdiff_t _srcstride,      \
+                                             int height,                \
+                                             intptr_t mx, intptr_t my,  \
+                                             int width)                 \
+{                                                                       \
+    int x, y;                                                           \
+    const int8_t *filter;                                               \
+    pixel *src = (pixel*)_src;                                          \
+    ptrdiff_t srcstride = _srcstride / sizeof(pixel);                   \
+    pixel *dst          = (pixel *)_dst;                                \
+    ptrdiff_t dststride = _dststride / sizeof(pixel);                   \
+    int16_t tmp_array[(MAX_PB_SIZE + QPEL_EXTRA) * MAX_PB_SIZE];        \
+    int16_t *tmp = tmp_array;                                           \
+    uint64_t ftmp[20];                                                  \
+    uint64_t rtmp[1];                                                   \
+    int shift = 6;                                                      \
+    int offset = 32;                                                    \
+                                                                        \
+    src   -= (QPEL_EXTRA_BEFORE * srcstride + 3);                       \
+    filter = ff_hevc_qpel_filters[mx - 1];                              \
+    x = width >> 2;                                                     \
+    y = height + QPEL_EXTRA;                                            \
+    __asm__ volatile(                                                   \
+        MMI_LDC1(%[ftmp1], %[filter], 0x00)                             \
+        "li           %[rtmp0],      0x08                       \n\t"   \
+        "dmtc1        %[rtmp0],      %[ftmp0]                   \n\t"   \
+        "punpckhbh    %[ftmp2],      %[ftmp0],      %[ftmp1]    \n\t"   \
+        "punpcklbh    %[ftmp1],      %[ftmp0],      %[ftmp1]    \n\t"   \
+        "psrah        %[ftmp1],      %[ftmp1],      %[ftmp0]    \n\t"   \
+        "psrah        %[ftmp2],      %[ftmp2],      %[ftmp0]    \n\t"   \
+        "xor          %[ftmp0],      %[ftmp0],      %[ftmp0]    \n\t"   \
+                                                                        \
+        "1:                                                     \n\t"   \
+        "2:                                                     \n\t"   \
+        "gsldlc1      %[ftmp3],      0x07(%[src])               \n\t"   \
+        "gsldrc1      %[ftmp3],      0x00(%[src])               \n\t"   \
+        "gsldlc1      %[ftmp4],      0x08(%[src])               \n\t"   \
+        "gsldrc1      %[ftmp4],      0x01(%[src])               \n\t"   \
+        "gsldlc1      %[ftmp5],      0x09(%[src])               \n\t"   \
+        "gsldrc1      %[ftmp5],      0x02(%[src])               \n\t"   \
+        "gsldlc1      %[ftmp6],      0x0a(%[src])               \n\t"   \
+        "gsldrc1      %[ftmp6],      0x03(%[src])               \n\t"   \
+        "punpcklbh    %[ftmp7],      %[ftmp3],      %[ftmp0]    \n\t"   \
+        "punpckhbh    %[ftmp8],      %[ftmp3],      %[ftmp0]    \n\t"   \
+        "pmullh       %[ftmp7],      %[ftmp7],      %[ftmp1]    \n\t"   \
+        "pmullh       %[ftmp8],      %[ftmp8],      %[ftmp2]    \n\t"   \
+        "paddh        %[ftmp3],      %[ftmp7],      %[ftmp8]    \n\t"   \
+        "punpcklbh    %[ftmp7],      %[ftmp4],      %[ftmp0]    \n\t"   \
+        "punpckhbh    %[ftmp8],      %[ftmp4],      %[ftmp0]    \n\t"   \
+        "pmullh       %[ftmp7],      %[ftmp7],      %[ftmp1]    \n\t"   \
+        "pmullh       %[ftmp8],      %[ftmp8],      %[ftmp2]    \n\t"   \
+        "paddh        %[ftmp4],      %[ftmp7],      %[ftmp8]    \n\t"   \
+        "punpcklbh    %[ftmp7],      %[ftmp5],      %[ftmp0]    \n\t"   \
+        "punpckhbh    %[ftmp8],      %[ftmp5],      %[ftmp0]    \n\t"   \
+        "pmullh       %[ftmp7],      %[ftmp7],      %[ftmp1]    \n\t"   \
+        "pmullh       %[ftmp8],      %[ftmp8],      %[ftmp2]    \n\t"   \
+        "paddh        %[ftmp5],      %[ftmp7],      %[ftmp8]    \n\t"   \
+        "punpcklbh    %[ftmp7],      %[ftmp6],      %[ftmp0]    \n\t"   \
+        "punpckhbh    %[ftmp8],      %[ftmp6],      %[ftmp0]    \n\t"   \
+        "pmullh       %[ftmp7],      %[ftmp7],      %[ftmp1]    \n\t"   \
+        "pmullh       %[ftmp8],      %[ftmp8],      %[ftmp2]    \n\t"   \
+        "paddh        %[ftmp6],      %[ftmp7],      %[ftmp8]    \n\t"   \
+        TRANSPOSE_4H(%[ftmp3], %[ftmp4], %[ftmp5], %[ftmp6],            \
+                     %[ftmp7], %[ftmp8], %[ftmp9], %[ftmp10])           \
+        "paddh        %[ftmp3],      %[ftmp3],      %[ftmp4]    \n\t"   \
+        "paddh        %[ftmp5],      %[ftmp5],      %[ftmp6]    \n\t"   \
+        "paddh        %[ftmp3],      %[ftmp3],      %[ftmp5]    \n\t"   \
+        "gssdlc1      %[ftmp3],      0x07(%[tmp])               \n\t"   \
+        "gssdrc1      %[ftmp3],      0x00(%[tmp])               \n\t"   \
+                                                                        \
+        "daddi        %[x],          %[x],         -0x01        \n\t"   \
+        PTR_ADDIU    "%[src],        %[src],        0x04        \n\t"   \
+        PTR_ADDIU    "%[tmp],        %[tmp],        0x08        \n\t"   \
+        "bnez         %[x],          2b                         \n\t"   \
+                                                                        \
+        "daddi        %[y],          %[y],         -0x01        \n\t"   \
+        "li           %[x],        " #x_step "                  \n\t"   \
+        PTR_ADDIU    "%[src],        %[src],      " #src_step " \n\t"   \
+        PTR_ADDIU    "%[tmp],        %[tmp],      " #tmp_step " \n\t"   \
+        PTR_ADDU     "%[src],        %[src],        %[stride]   \n\t"   \
+        PTR_ADDIU    "%[tmp],        %[tmp],        0x80        \n\t"   \
+        "bnez         %[y],          1b                         \n\t"   \
+        : [ftmp0]"=&f"(ftmp[0]), [ftmp1]"=&f"(ftmp[1]),                 \
+          [ftmp2]"=&f"(ftmp[2]), [ftmp3]"=&f"(ftmp[3]),                 \
+          [ftmp4]"=&f"(ftmp[4]), [ftmp5]"=&f"(ftmp[5]),                 \
+          [ftmp6]"=&f"(ftmp[6]), [ftmp7]"=&f"(ftmp[7]),                 \
+          [ftmp8]"=&f"(ftmp[8]), [ftmp9]"=&f"(ftmp[9]),                 \
+          [ftmp10]"=&f"(ftmp[10]), [rtmp0]"=&r"(rtmp[0]),               \
+          [src]"+&r"(src), [tmp]"+&r"(tmp), [y]"+&r"(y),                \
+          [x]"+&r"(x)                                                   \
+        : [filter]"r"(filter), [stride]"r"(srcstride)                   \
+        : "memory"                                                      \
+    );                                                                  \
+                                                                        \
+    tmp    = tmp_array;                                                 \
+    filter = ff_hevc_qpel_filters[my - 1];                              \
+    x = width >> 2;                                                     \
+    y = height;                                                         \
+    __asm__ volatile(                                                   \
+        MMI_LDC1(%[ftmp1], %[filter], 0x00)                             \
+        "li           %[rtmp0],      0x08                       \n\t"   \
+        "dmtc1        %[rtmp0],      %[ftmp0]                   \n\t"   \
+        "punpckhbh    %[ftmp2],      %[ftmp0],      %[ftmp1]    \n\t"   \
+        "punpcklbh    %[ftmp1],      %[ftmp0],      %[ftmp1]    \n\t"   \
+        "psrah        %[ftmp1],      %[ftmp1],      %[ftmp0]    \n\t"   \
+        "psrah        %[ftmp2],      %[ftmp2],      %[ftmp0]    \n\t"   \
+        "li           %[rtmp0],      0x06                       \n\t"   \
+        "dmtc1        %[rtmp0],      %[ftmp0]                   \n\t"   \
+        "punpcklhw    %[offset],     %[offset],     %[offset]   \n\t"   \
+        "punpcklwd    %[offset],     %[offset],     %[offset]   \n\t"   \
+                                                                        \
+        "1:                                                     \n\t"   \
+        "li           %[x],        " #x_step "                  \n\t"   \
+        "2:                                                     \n\t"   \
+        "gsldlc1      %[ftmp3],      0x07(%[tmp])               \n\t"   \
+        "gsldrc1      %[ftmp3],      0x00(%[tmp])               \n\t"   \
+        PTR_ADDIU    "%[tmp],        %[tmp],        0x80        \n\t"   \
+        "gsldlc1      %[ftmp4],      0x07(%[tmp])               \n\t"   \
+        "gsldrc1      %[ftmp4],      0x00(%[tmp])               \n\t"   \
+        PTR_ADDIU    "%[tmp],        %[tmp],        0x80        \n\t"   \
+        "gsldlc1      %[ftmp5],      0x07(%[tmp])               \n\t"   \
+        "gsldrc1      %[ftmp5],      0x00(%[tmp])               \n\t"   \
+        PTR_ADDIU    "%[tmp],        %[tmp],        0x80        \n\t"   \
+        "gsldlc1      %[ftmp6],      0x07(%[tmp])               \n\t"   \
+        "gsldrc1      %[ftmp6],      0x00(%[tmp])               \n\t"   \
+        PTR_ADDIU    "%[tmp],        %[tmp],        0x80        \n\t"   \
+        "gsldlc1      %[ftmp7],      0x07(%[tmp])               \n\t"   \
+        "gsldrc1      %[ftmp7],      0x00(%[tmp])               \n\t"   \
+        PTR_ADDIU    "%[tmp],        %[tmp],        0x80        \n\t"   \
+        "gsldlc1      %[ftmp8],      0x07(%[tmp])               \n\t"   \
+        "gsldrc1      %[ftmp8],      0x00(%[tmp])               \n\t"   \
+        PTR_ADDIU    "%[tmp],        %[tmp],        0x80        \n\t"   \
+        "gsldlc1      %[ftmp9],      0x07(%[tmp])               \n\t"   \
+        "gsldrc1      %[ftmp9],      0x00(%[tmp])               \n\t"   \
+        PTR_ADDIU    "%[tmp],        %[tmp],        0x80        \n\t"   \
+        "gsldlc1      %[ftmp10],     0x07(%[tmp])               \n\t"   \
+        "gsldrc1      %[ftmp10],     0x00(%[tmp])               \n\t"   \
+        PTR_ADDIU    "%[tmp],        %[tmp],        -0x380      \n\t"   \
+        TRANSPOSE_4H(%[ftmp3], %[ftmp4], %[ftmp5], %[ftmp6],            \
+                     %[ftmp11], %[ftmp12], %[ftmp13], %[ftmp14])        \
+        TRANSPOSE_4H(%[ftmp7], %[ftmp8], %[ftmp9], %[ftmp10],           \
+                     %[ftmp11], %[ftmp12], %[ftmp13], %[ftmp14])        \
+        "pmaddhw      %[ftmp11],     %[ftmp3],      %[ftmp1]    \n\t"   \
+        "pmaddhw      %[ftmp12],     %[ftmp7],      %[ftmp2]    \n\t"   \
+        "pmaddhw      %[ftmp13],     %[ftmp4],      %[ftmp1]    \n\t"   \
+        "pmaddhw      %[ftmp14],     %[ftmp8],      %[ftmp2]    \n\t"   \
+        "paddw        %[ftmp11],     %[ftmp11],     %[ftmp12]   \n\t"   \
+        "paddw        %[ftmp13],     %[ftmp13],     %[ftmp14]   \n\t"   \
+        TRANSPOSE_2W(%[ftmp11], %[ftmp13], %[ftmp3], %[ftmp4])          \
+        "paddw        %[ftmp3],      %[ftmp3],      %[ftmp4]    \n\t"   \
+        "psraw        %[ftmp3],      %[ftmp3],      %[ftmp0]    \n\t"   \
+        "pmaddhw      %[ftmp11],     %[ftmp5],      %[ftmp1]    \n\t"   \
+        "pmaddhw      %[ftmp12],     %[ftmp9],      %[ftmp2]    \n\t"   \
+        "pmaddhw      %[ftmp13],     %[ftmp6],      %[ftmp1]    \n\t"   \
+        "pmaddhw      %[ftmp14],     %[ftmp10],     %[ftmp2]    \n\t"   \
+        "paddw        %[ftmp11],     %[ftmp11],     %[ftmp12]   \n\t"   \
+        "paddw        %[ftmp13],     %[ftmp13],     %[ftmp14]   \n\t"   \
+        TRANSPOSE_2W(%[ftmp11], %[ftmp13], %[ftmp5], %[ftmp6])          \
+        "paddw        %[ftmp5],      %[ftmp5],      %[ftmp6]    \n\t"   \
+        "psraw        %[ftmp5],      %[ftmp5],      %[ftmp0]    \n\t"   \
+        "packsswh     %[ftmp3],      %[ftmp3],      %[ftmp5]    \n\t"   \
+        "paddh        %[ftmp3],      %[ftmp3],      %[offset]   \n\t"   \
+        "psrah        %[ftmp3],      %[ftmp3],      %[shift]    \n\t"   \
+        "xor          %[ftmp7],      %[ftmp7],      %[ftmp7]    \n\t"   \
+        "pcmpgth      %[ftmp7],      %[ftmp3],      %[ftmp7]    \n\t"   \
+        "and          %[ftmp3],      %[ftmp3],      %[ftmp7]    \n\t"   \
+        "packushb     %[ftmp3],      %[ftmp3],      %[ftmp3]    \n\t"   \
+        "gsswlc1      %[ftmp3],      0x03(%[dst])               \n\t"   \
+        "gsswrc1      %[ftmp3],      0x00(%[dst])               \n\t"   \
+                                                                        \
+        "daddi        %[x],          %[x],         -0x01        \n\t"   \
+        PTR_ADDIU    "%[tmp],        %[tmp],        0x08        \n\t"   \
+        PTR_ADDIU    "%[dst],        %[dst],        0x04        \n\t"   \
+        "bnez         %[x],          2b                         \n\t"   \
+                                                                        \
+        "daddi        %[y],          %[y],         -0x01        \n\t"   \
+        PTR_ADDIU    "%[tmp],        %[tmp],     " #tmp_step "  \n\t"   \
+        PTR_ADDIU    "%[dst],        %[dst],     " #dst_step "  \n\t"   \
+        PTR_ADDU     "%[dst],        %[dst],        %[stride]   \n\t"   \
+        PTR_ADDIU    "%[tmp],        %[tmp],        0x80        \n\t"   \
+        "bnez         %[y],          1b                         \n\t"   \
+        : [ftmp0]"=&f"(ftmp[0]), [ftmp1]"=&f"(ftmp[1]),                 \
+          [ftmp2]"=&f"(ftmp[2]), [ftmp3]"=&f"(ftmp[3]),                 \
+          [ftmp4]"=&f"(ftmp[4]), [ftmp5]"=&f"(ftmp[5]),                 \
+          [ftmp6]"=&f"(ftmp[6]), [ftmp7]"=&f"(ftmp[7]),                 \
+          [ftmp8]"=&f"(ftmp[8]), [ftmp9]"=&f"(ftmp[9]),                 \
+          [ftmp10]"=&f"(ftmp[10]), [ftmp11]"=&f"(ftmp[11]),             \
+          [ftmp12]"=&f"(ftmp[12]), [ftmp13]"=&f"(ftmp[13]),             \
+          [ftmp14]"=&f"(ftmp[14]),                                      \
+          [dst]"+&r"(dst), [tmp]"+&r"(tmp), [y]"+&r"(y), [x]"=&r"(x),   \
+          [offset]"+&f"(offset), [rtmp0]"=&r"(rtmp[0])                  \
+        : [filter]"r"(filter), [stride]"r"(dststride),                  \
+          [shift]"f"(shift)                                             \
+        : "memory"                                                      \
+    );                                                                  \
+}
+
+PUT_HEVC_QPEL_UNI_HV(4, 1, -4, -4, -8);
+PUT_HEVC_QPEL_UNI_HV(8, 2, -8, -8, -16);
+PUT_HEVC_QPEL_UNI_HV(12, 3, -12, -12, -24);
+PUT_HEVC_QPEL_UNI_HV(16, 4, -16, -16, -32);
+PUT_HEVC_QPEL_UNI_HV(24, 6, -24, -24, -48);
+PUT_HEVC_QPEL_UNI_HV(32, 8, -32, -32, -64);
+PUT_HEVC_QPEL_UNI_HV(48, 12, -48, -48, -96);
+PUT_HEVC_QPEL_UNI_HV(64, 16, -64, -64, -128);
diff --git a/libavcodec/mips/hevcdsp_msa.c b/libavcodec/mips/hevcdsp_msa.c
index 81db62b..2c57ec8 100644
--- a/libavcodec/mips/hevcdsp_msa.c
+++ b/libavcodec/mips/hevcdsp_msa.c
@@ -44,7 +44,7 @@
         src0 = (v16i8) __msa_ilvr_w((v4i32) src1, (v4i32) src0);
         in0 = (v8i16) __msa_ilvr_b(zero, src0);
         in0 <<= 6;
-        ST8x2_UB(in0, dst, 2 * dst_stride);
+        ST_D2(in0, 0, 1, dst, dst_stride);
     } else if (4 == height) {
         v16i8 src0, src1, src2, src3;
         v8i16 in0, in1;
@@ -55,7 +55,7 @@
         ILVR_B2_SH(zero, src0, zero, src1, in0, in1);
         in0 <<= 6;
         in1 <<= 6;
-        ST8x4_UB(in0, in1, dst, 2 * dst_stride);
+        ST_D4(in0, in1, 0, 1, 0, 1, dst, dst_stride);
     } else if (0 == height % 8) {
         v16i8 src0, src1, src2, src3, src4, src5, src6, src7;
         v8i16 in0, in1, in2, in3;
@@ -71,7 +71,7 @@
             ILVR_B4_SH(zero, src0, zero, src1, zero, src2, zero, src3,
                        in0, in1, in2, in3);
             SLLI_4V(in0, in1, in2, in3, 6);
-            ST8x8_UB(in0, in1, in2, in3, dst, 2 * dst_stride);
+            ST_D8(in0, in1, in2, in3, 0, 1, 0, 1, 0, 1, 0, 1, dst, dst_stride);
             dst += (8 * dst_stride);
         }
     }
@@ -183,7 +183,7 @@
         in0 <<= 6;
         in1 <<= 6;
         ST_SH4(in0_r, in1_r, in2_r, in3_r, dst, dst_stride);
-        ST8x4_UB(in0, in1, dst + 8, 2 * dst_stride);
+        ST_D4(in0, in1, 0, 1, 0, 1, dst + 8, dst_stride);
         dst += (4 * dst_stride);
 
         ILVR_B4_SH(zero, src4, zero, src5, zero, src6, zero, src7,
@@ -194,7 +194,7 @@
         in0 <<= 6;
         in1 <<= 6;
         ST_SH4(in0_r, in1_r, in2_r, in3_r, dst, dst_stride);
-        ST8x4_UB(in0, in1, dst + 8, 2 * dst_stride);
+        ST_D4(in0, in1, 0, 1, 0, 1, dst + 8, dst_stride);
         dst += (4 * dst_stride);
     }
 }
@@ -495,7 +495,7 @@
         DPADD_SB4_SH(vec0, vec1, vec2, vec3, filt0, filt1, filt2, filt3,
                      dst3, dst3, dst3, dst3);
 
-        ST8x8_UB(dst0, dst1, dst2, dst3, dst, 2 * dst_stride);
+        ST_D8(dst0, dst1, dst2, dst3, 0, 1, 0, 1, 0, 1, 0, 1, dst, dst_stride);
         dst += (8 * dst_stride);
     }
 }
@@ -1047,7 +1047,7 @@
         DPADD_SB4_SH(src8776, src10998, src12111110, src14131312,
                      filt0, filt1, filt2, filt3, dst76, dst76, dst76, dst76);
 
-        ST8x8_UB(dst10, dst32, dst54, dst76, dst, 2 * dst_stride);
+        ST_D8(dst10, dst32, dst54, dst76, 0, 1, 0, 1, 0, 1, 0, 1, dst, dst_stride);
         dst += (8 * dst_stride);
 
         src2110 = src10998;
@@ -1191,7 +1191,7 @@
                      dst1_l, dst1_l, dst1_l, dst1_l);
 
         ST_SH4(dst0_r, dst1_r, dst2_r, dst3_r, dst, dst_stride);
-        ST8x4_UB(dst0_l, dst1_l, dst + 8, 2 * dst_stride);
+        ST_D4(dst0_l, dst1_l, 0, 1, 0, 1, dst + 8, dst_stride);
         dst += (4 * dst_stride);
 
         src10_r = src54_r;
@@ -1363,7 +1363,6 @@
                               int32_t height)
 {
     uint32_t loop_cnt;
-    int32_t dst_stride_in_bytes = 2 * dst_stride;
     v16i8 src0, src1, src2, src3, src4, src5, src6, src7, src8, src9, src10;
     v8i16 filt0, filt1, filt2, filt3;
     v8i16 filt_h0, filt_h1, filt_h2, filt_h3;
@@ -1452,7 +1451,7 @@
                                 filt_h0, filt_h1, filt_h2, filt_h3);
         SRA_4V(dst0_r, dst1_r, dst2_r, dst3_r, 6);
         PCKEV_H2_SW(dst1_r, dst0_r, dst3_r, dst2_r, dst0_r, dst2_r);
-        ST8x4_UB(dst0_r, dst2_r, dst, dst_stride_in_bytes);
+        ST_D4(dst0_r, dst2_r, 0, 1, 0, 1, dst, dst_stride);
         dst += (4 * dst_stride);
 
         dst10_r = dst54_r;
@@ -1607,7 +1606,6 @@
                                int32_t height)
 {
     uint32_t loop_cnt;
-    int32_t dst_stride_in_bytes = 2 * dst_stride;
     uint8_t *src_tmp;
     int16_t *dst_tmp;
     v16i8 src0, src1, src2, src3, src4, src5, src6, src7, src8, src9, src10;
@@ -1784,7 +1782,7 @@
                                 filt_h1, filt_h2, filt_h3);
         SRA_4V(dst0_r, dst1_r, dst2_r, dst3_r, 6);
         PCKEV_H2_SW(dst1_r, dst0_r, dst3_r, dst2_r, dst0_r, dst2_r);
-        ST8x4_UB(dst0_r, dst2_r, dst, dst_stride_in_bytes);
+        ST_D4(dst0_r, dst2_r, 0, 1, 0, 1, dst, dst_stride);
         dst += (4 * dst_stride);
 
         dst10_r = dst54_r;
@@ -1872,7 +1870,7 @@
     dst0 = const_vec;
     DPADD_SB2_SH(vec0, vec1, filt0, filt1, dst0, dst0);
 
-    ST8x2_UB(dst0, dst, 2 * dst_stride);
+    ST_D2(dst0, 0, 1, dst, dst_stride);
 }
 
 static void hevc_hz_4t_4x4_msa(uint8_t *src,
@@ -1909,7 +1907,7 @@
     dst1 = const_vec;
     DPADD_SB2_SH(vec0, vec1, filt0, filt1, dst1, dst1);
 
-    ST8x4_UB(dst0, dst1, dst, 2 * dst_stride);
+    ST_D4(dst0, dst1, 0, 1, 0, 1, dst, dst_stride);
 }
 
 static void hevc_hz_4t_4x8multiple_msa(uint8_t *src,
@@ -1956,7 +1954,7 @@
         dst3 = const_vec;
         DPADD_SB2_SH(vec0, vec1, filt0, filt1, dst3, dst3);
 
-        ST8x8_UB(dst0, dst1, dst2, dst3, dst, 2 * dst_stride);
+        ST_D8(dst0, dst1, dst2, dst3, 0, 1, 0, 1, 0, 1, 0, 1, dst, dst_stride);
         dst += (8 * dst_stride);
     }
 }
@@ -2218,7 +2216,7 @@
         DPADD_SB2_SH(vec0, vec1, filt0, filt1, dst5, dst5);
 
         ST_SH4(dst0, dst1, dst2, dst3, dst, dst_stride);
-        ST8x4_UB(dst4, dst5, dst + 8, 2 * dst_stride);
+        ST_D4(dst4, dst5, 0, 1, 0, 1, dst + 8, dst_stride);
         dst += (4 * dst_stride);
     }
 }
@@ -2478,7 +2476,7 @@
     dst10 = const_vec;
     DPADD_SB2_SH(src2110, src4332, filt0, filt1, dst10, dst10);
 
-    ST8x2_UB(dst10, dst, 2 * dst_stride);
+    ST_D2(dst10, 0, 1, dst, dst_stride);
 }
 
 static void hevc_vt_4t_4x4_msa(uint8_t *src,
@@ -2515,7 +2513,7 @@
     dst32 = const_vec;
     DPADD_SB2_SH(src4332, src6554, filt0, filt1, dst32, dst32);
 
-    ST8x4_UB(dst10, dst32, dst, 2 * dst_stride);
+    ST_D4(dst10, dst32, 0, 1, 0, 1, dst, dst_stride);
 }
 
 static void hevc_vt_4t_4x8_msa(uint8_t *src,
@@ -2564,8 +2562,7 @@
     DPADD_SB2_SH(src4332, src6554, filt0, filt1, dst32, dst32);
     DPADD_SB2_SH(src6554, src8776, filt0, filt1, dst54, dst54);
     DPADD_SB2_SH(src8776, src10998, filt0, filt1, dst76, dst76);
-    ST8x8_UB(dst10, dst32, dst54, dst76, dst, 2 * dst_stride);
-    dst += (8 * dst_stride);
+    ST_D8(dst10, dst32, dst54, dst76, 0, 1, 0, 1, 0, 1, 0, 1, dst, dst_stride);
 }
 
 static void hevc_vt_4t_4x16_msa(uint8_t *src, int32_t src_stride,
@@ -2610,7 +2607,7 @@
     DPADD_SB2_SH(src4332, src6554, filt0, filt1, dst32, dst32);
     DPADD_SB2_SH(src6554, src8776, filt0, filt1, dst54, dst54);
     DPADD_SB2_SH(src8776, src10998, filt0, filt1, dst76, dst76);
-    ST8x8_UB(dst10, dst32, dst54, dst76, dst, 2 * dst_stride);
+    ST_D8(dst10, dst32, dst54, dst76, 0, 1, 0, 1, 0, 1, 0, 1, dst, dst_stride);
     dst += (8 * dst_stride);
 
     src2 = src10;
@@ -2635,8 +2632,7 @@
     DPADD_SB2_SH(src4332, src6554, filt0, filt1, dst32, dst32);
     DPADD_SB2_SH(src6554, src8776, filt0, filt1, dst54, dst54);
     DPADD_SB2_SH(src8776, src10998, filt0, filt1, dst76, dst76);
-    ST8x8_UB(dst10, dst32, dst54, dst76, dst, 2 * dst_stride);
-    dst += (8 * dst_stride);
+    ST_D8(dst10, dst32, dst54, dst76, 0, 1, 0, 1, 0, 1, 0, 1, dst, dst_stride);
 }
 
 static void hevc_vt_4t_4w_msa(uint8_t *src,
@@ -2955,7 +2951,7 @@
         DPADD_SB2_SH(src4332, src6554, filt0, filt1, dst1_l, dst1_l);
 
         ST_SH4(dst0_r, dst1_r, dst2_r, dst3_r, dst, dst_stride);
-        ST8x4_UB(dst0_l, dst1_l, dst + 8, (2 * dst_stride));
+        ST_D4(dst0_l, dst1_l, 0, 1, 0, 1, dst + 8, dst_stride);
         dst += (4 * dst_stride);
 
         src2 = src6;
@@ -3243,7 +3239,6 @@
                                const int8_t *filter_x,
                                const int8_t *filter_y)
 {
-    int32_t dst_stride_in_bytes = 2 * dst_stride;
     v16i8 src0, src1, src2, src3, src4;
     v8i16 filt0, filt1;
     v8i16 filt_h0, filt_h1;
@@ -3288,7 +3283,7 @@
     dst0 >>= 6;
     dst1 >>= 6;
     dst0 = (v4i32) __msa_pckev_h((v8i16) dst1, (v8i16) dst0);
-    ST8x2_UB(dst0, dst, dst_stride_in_bytes);
+    ST_D2(dst0, 0, 1, dst, dst_stride);
 }
 
 static void hevc_hv_4t_4x4_msa(uint8_t *src,
@@ -3298,7 +3293,6 @@
                                const int8_t *filter_x,
                                const int8_t *filter_y)
 {
-    int32_t dst_stride_in_bytes = 2 * dst_stride;
     v16i8 src0, src1, src2, src3, src4, src5, src6;
     v8i16 filt0, filt1;
     v8i16 filt_h0, filt_h1;
@@ -3351,7 +3345,7 @@
     dst3 = HEVC_FILT_4TAP(dst43, dst65, filt_h0, filt_h1);
     SRA_4V(dst0, dst1, dst2, dst3, 6);
     PCKEV_H2_SW(dst1, dst0, dst3, dst2, dst0, dst2);
-    ST8x4_UB(dst0, dst2, dst, dst_stride_in_bytes);
+    ST_D4(dst0, dst2, 0, 1, 0, 1, dst, dst_stride);
 }
 
 
@@ -3442,7 +3436,7 @@
         SRA_4V(dst4, dst5, dst6, dst7, 6);
         PCKEV_H4_SW(dst1, dst0, dst3, dst2, dst5, dst4, dst7, dst6,
                     dst0, dst1, dst2, dst3);
-        ST8x8_UB(dst0, dst1, dst2, dst3, dst, 2 * dst_stride);
+        ST_D8(dst0, dst1, dst2, dst3, 0, 1, 0, 1, 0, 1, 0, 1, dst, dst_stride);
         dst += (8 * dst_stride);
 
         dst10_r = dst98_r;
@@ -3479,7 +3473,6 @@
                               const int8_t *filter_y,
                               int32_t height)
 {
-    int32_t dst_stride_in_bytes = 2 * dst_stride;
     v16i8 src0, src1, src2, src3, src4, src5, src6, src7, src8, src9, src10;
     v8i16 filt0, filt1;
     v8i16 filt_h0, filt_h1;
@@ -3590,11 +3583,11 @@
     PCKEV_H2_SH(dst1_r, dst0_r, dst3_r, dst2_r, tmp0, tmp1);
     PCKEV_H2_SH(dst5_r, dst4_r, dst7_r, dst6_r, tmp2, tmp3);
     PCKEV_H2_SH(dst1_l, dst0_l, dst3_l, dst2_l, tmp4, tmp5);
-    ST8x4_UB(tmp0, tmp1, dst, dst_stride_in_bytes);
-    ST4x4_UB(tmp4, tmp4, 0, 1, 2, 3, dst + 4, dst_stride_in_bytes);
+    ST_D4(tmp0, tmp1, 0, 1, 0, 1, dst, dst_stride);
+    ST_W4(tmp4, 0, 1, 2, 3, dst + 4, dst_stride);
     dst += 4 * dst_stride;
-    ST8x4_UB(tmp2, tmp3, dst, dst_stride_in_bytes);
-    ST4x4_UB(tmp5, tmp5, 0, 1, 2, 3, dst + 4, dst_stride_in_bytes);
+    ST_D4(tmp2, tmp3, 0, 1, 0, 1, dst, dst_stride);
+    ST_W4(tmp5, 0, 1, 2, 3, dst + 4, dst_stride);
 }
 
 static void hevc_hv_4t_8x2_msa(uint8_t *src,
@@ -4164,7 +4157,7 @@
         SRA_4V(tmp4, tmp5, tmp6, tmp7, 6);
         PCKEV_H4_SW(tmp1, tmp0, tmp3, tmp2, tmp5, tmp4, tmp7, tmp6, tmp0, tmp1,
                     tmp2, tmp3);
-        ST8x8_UB(tmp0, tmp1, tmp2, tmp3, dst, 2 * dst_stride);
+        ST_D8(tmp0, tmp1, tmp2, tmp3, 0, 1, 0, 1, 0, 1, 0, 1, dst, dst_stride);
         dst += (8 * dst_stride);
 
         dst10_r = dst98_r;
diff --git a/libavcodec/mips/hevcpred_msa.c b/libavcodec/mips/hevcpred_msa.c
index 963c64c..f53276d 100644
--- a/libavcodec/mips/hevcpred_msa.c
+++ b/libavcodec/mips/hevcpred_msa.c
@@ -83,7 +83,7 @@
         vec2 -= vec0;
         vec2 >>= 1;
         vec2 += vec1;
-        vec2 = CLIP_SH_0_255(vec2);
+        CLIP_SH_0_255(vec2);
 
         for (col = 0; col < 4; col++) {
             dst[stride * col] = (uint8_t) vec2[col];
@@ -122,7 +122,7 @@
         vec2 -= vec0;
         vec2 >>= 1;
         vec2 += vec1;
-        vec2 = CLIP_SH_0_255(vec2);
+        CLIP_SH_0_255(vec2);
 
         val0 = vec2[0];
         val1 = vec2[1];
@@ -214,7 +214,7 @@
         src0_r -= src_top_val;
         src0_r >>= 1;
         src0_r += src_left_val;
-        src0_r = CLIP_SH_0_255(src0_r);
+        CLIP_SH_0_255(src0_r);
         src0 = __msa_pckev_b((v16i8) src0_r, (v16i8) src0_r);
         val0 = __msa_copy_s_w((v4i32) src0, 0);
         SW(val0, dst);
@@ -254,7 +254,7 @@
         src0_r -= src_top_val;
         src0_r >>= 1;
         src0_r += src_left_val;
-        src0_r = CLIP_SH_0_255(src0_r);
+        CLIP_SH_0_255(src0_r);
         src0 = __msa_pckev_b((v16i8) src0_r, (v16i8) src0_r);
         val0 = __msa_copy_s_d((v2i64) src0, 0);
         SD(val0, dst);
@@ -589,7 +589,7 @@
     PCKEV_D2_SH(res1, res0, res3, res2, res0, res1);
     SRARI_H2_SH(res0, res1, 3);
     src_vec0 = __msa_pckev_b((v16i8) res1, (v16i8) res0);
-    ST4x4_UB(src_vec0, src_vec0, 0, 1, 2, 3, dst, stride);
+    ST_W4(src_vec0, 0, 1, 2, 3, dst, stride);
 }
 
 static void hevc_intra_pred_plane_8x8_msa(const uint8_t *src_top,
@@ -656,7 +656,8 @@
     PCKEV_B4_SB(res1, res0, res3, res2, res5, res4, res7, res6,
                 src_vec0, src_vec1, src_vec2, src_vec3);
 
-    ST8x8_UB(src_vec0, src_vec1, src_vec2, src_vec3, dst, stride);
+    ST_D8(src_vec0, src_vec1, src_vec2, src_vec3, 0, 1, 0, 1,
+          0, 1, 0, 1, dst, stride);
 }
 
 static void hevc_intra_pred_plane_16x16_msa(const uint8_t *src_top,
@@ -997,7 +998,8 @@
     ILVR_D2_SH(fact3, fact1, fact7, fact5, fact1, fact3);
     ILVR_B4_SH(zero, top0, zero, top1, zero, top2, zero, top3,
                diff0, diff2, diff4, diff6);
-    SLDI_B4_0_SH(diff0, diff2, diff4, diff6, diff1, diff3, diff5, diff7, 2);
+    SLDI_B4_SH(zero, diff0, zero, diff2, zero, diff4, zero, diff6, 2,
+               diff1, diff3, diff5, diff7);
     ILVR_D2_SH(diff2, diff0, diff6, diff4, diff0, diff2);
     ILVR_D2_SH(diff3, diff1, diff7, diff5, diff1, diff3);
     MUL2(diff1, fact0, diff3, fact2, diff1, diff3);
@@ -1007,7 +1009,7 @@
 
     SRARI_H2_SH(diff1, diff3, 5);
     dst_val0 = __msa_pckev_b((v16i8) diff3, (v16i8) diff1);
-    ST4x4_UB(dst_val0, dst_val0, 0, 1, 2, 3, dst, stride);
+    ST_W4(dst_val0, 0, 1, 2, 3, dst, stride);
 }
 
 static void hevc_intra_pred_angular_upper_8width_msa(const uint8_t *src_top,
@@ -1092,8 +1094,8 @@
         UNPCK_UB_SH(top2, diff4, diff5);
         UNPCK_UB_SH(top3, diff6, diff7);
 
-        SLDI_B2_SH(diff1, diff3, diff0, diff2, diff1, diff3, 2);
-        SLDI_B2_SH(diff5, diff7, diff4, diff6, diff5, diff7, 2);
+        SLDI_B4_SH(diff1, diff0, diff3, diff2, diff5, diff4, diff7, diff6, 2,
+                   diff1, diff3, diff5, diff7);
         MUL4(diff1, fact0, diff3, fact2, diff5, fact4, diff7, fact6,
              diff1, diff3, diff5, diff7);
 
@@ -1104,7 +1106,7 @@
 
         SRARI_H4_SH(diff1, diff3, diff5, diff7, 5);
         PCKEV_B2_UB(diff3, diff1, diff7, diff5, dst_val0, dst_val1);
-        ST8x4_UB(dst_val0, dst_val1, dst, stride);
+        ST_D4(dst_val0, dst_val1, 0, 1, 0, 1, dst, stride);
         dst += (4 * stride);
     }
 }
@@ -1185,8 +1187,8 @@
         fact6 = __msa_fill_h(fact_val3);
         fact7 = __msa_fill_h(32 - fact_val3);
 
-        SLDI_B2_UB(top1, top3, top0, top2, top1, top3, 1);
-        SLDI_B2_UB(top5, top7, top4, top6, top5, top7, 1);
+        SLDI_B4_UB(top1, top0, top3, top2, top5, top4, top7, top6, 1,
+                   top1, top3, top5, top7);
         UNPCK_UB_SH(top0, diff0, diff1);
         UNPCK_UB_SH(top1, diff2, diff3);
         UNPCK_UB_SH(top2, diff4, diff5);
@@ -1296,8 +1298,8 @@
         top2 = top1;
         top6 = top5;
 
-        SLDI_B2_UB(top1, top3, top0, top2, top1, top3, 1);
-        SLDI_B2_UB(top5, top7, top4, top6, top5, top7, 1);
+        SLDI_B4_UB(top1, top0, top3, top2, top5, top4, top7, top6, 1,
+                   top1, top3, top5, top7);
         UNPCK_UB_SH(top0, diff0, diff1);
         UNPCK_UB_SH(top1, diff2, diff3);
         UNPCK_UB_SH(top2, diff4, diff5);
@@ -1406,7 +1408,8 @@
     ILVR_D2_SH(fact3, fact1, fact7, fact5, fact1, fact3);
     ILVR_B4_SH(zero, top0, zero, top1, zero, top2, zero, top3,
                diff0, diff2, diff4, diff6);
-    SLDI_B4_0_SH(diff0, diff2, diff4, diff6, diff1, diff3, diff5, diff7, 2);
+    SLDI_B4_SH(zero, diff0, zero, diff2, zero, diff4, zero, diff6, 2,
+               diff1, diff3, diff5, diff7);
     ILVR_D2_SH(diff2, diff0, diff6, diff4, diff0, diff2);
     ILVR_D2_SH(diff3, diff1, diff7, diff5, diff1, diff3);
     MUL2(diff1, fact0, diff3, fact2, diff1, diff3);
@@ -1425,9 +1428,8 @@
     dst_val0 = __msa_pckev_b((v16i8) diff2, (v16i8) diff2);
     dst_val1 = __msa_pckod_b((v16i8) diff2, (v16i8) diff2);
 
-    ST4x2_UB(dst_val0, dst, stride);
-    dst += (2 * stride);
-    ST4x2_UB(dst_val1, dst, stride);
+    ST_W2(dst_val0, 0, 1, dst, stride);
+    ST_W2(dst_val1, 0, 1, dst + 2 * stride, stride);
 }
 
 static void hevc_intra_pred_angular_lower_8width_msa(const uint8_t *src_top,
@@ -1511,8 +1513,8 @@
         UNPCK_UB_SH(top1, diff2, diff3);
         UNPCK_UB_SH(top2, diff4, diff5);
         UNPCK_UB_SH(top3, diff6, diff7);
-        SLDI_B2_SH(diff1, diff3, diff0, diff2, diff1, diff3, 2);
-        SLDI_B2_SH(diff5, diff7, diff4, diff6, diff5, diff7, 2);
+        SLDI_B4_SH(diff1, diff0, diff3, diff2, diff5, diff4, diff7, diff6, 2,
+                   diff1, diff3, diff5, diff7);
         MUL4(diff1, fact0, diff3, fact2, diff5, fact4, diff7, fact6,
              diff1, diff3, diff5, diff7);
 
@@ -1526,7 +1528,7 @@
                     dst_val0, dst_val1, dst_val2, dst_val3);
         ILVR_B2_SH(dst_val1, dst_val0, dst_val3, dst_val2, diff0, diff1);
         ILVRL_H2_SH(diff1, diff0, diff3, diff4);
-        ST4x8_UB(diff3, diff4, dst_org, stride);
+        ST_W8(diff3, diff4, 0, 1, 2, 3, 0, 1, 2, 3, dst_org, stride);
         dst += 4;
     }
 }
@@ -1606,8 +1608,8 @@
         fact6 = __msa_fill_h(fact_val3);
         fact7 = __msa_fill_h(32 - fact_val3);
 
-        SLDI_B2_SB(top1, top3, top0, top2, top1, top3, 1);
-        SLDI_B2_SB(top5, top7, top4, top6, top5, top7, 1);
+        SLDI_B4_SB(top1, top0, top3, top2, top5, top4, top7, top6, 1,
+                   top1, top3, top5, top7);
 
         UNPCK_UB_SH(top0, diff0, diff1);
         UNPCK_UB_SH(top1, diff2, diff3);
@@ -1640,9 +1642,9 @@
         ILVL_B2_SH(dst_val1, dst_val0, dst_val3, dst_val2, diff2, diff3);
         ILVRL_H2_SH(diff1, diff0, diff4, diff5);
         ILVRL_H2_SH(diff3, diff2, diff6, diff7);
-        ST4x8_UB(diff4, diff5, dst_org, stride);
+        ST_W8(diff4, diff5, 0, 1, 2, 3, 0, 1, 2, 3, dst_org, stride);
         dst_org += (8 * stride);
-        ST4x8_UB(diff6, diff7, dst_org, stride);
+        ST_W8(diff6, diff7, 0, 1, 2, 3, 0, 1, 2, 3, dst_org, stride);
         dst += 4;
     }
 }
@@ -1713,8 +1715,8 @@
         top2 = top1;
         top6 = top5;
 
-        SLDI_B2_SB(top1, top3, top0, top2, top1, top3, 1);
-        SLDI_B2_SB(top5, top7, top4, top6, top5, top7, 1);
+        SLDI_B4_SB(top1, top0, top3, top2, top5, top4, top7, top6, 1,
+                   top1, top3, top5, top7);
 
         UNPCK_UB_SH(top0, diff0, diff1);
         UNPCK_UB_SH(top1, diff2, diff3);
@@ -1746,23 +1748,14 @@
         ILVRL_B2_SH(dst_val2, dst_val0, diff0, diff1);
         ILVRL_B2_SH(dst_val3, dst_val1, diff2, diff3);
 
-        ST2x4_UB(diff0, 0, dst_org, stride);
-        dst_org += (4 * stride);
-        ST2x4_UB(diff0, 4, dst_org, stride);
-        dst_org += (4 * stride);
-        ST2x4_UB(diff1, 0, dst_org, stride);
-        dst_org += (4 * stride);
-        ST2x4_UB(diff1, 4, dst_org, stride);
-        dst_org += (4 * stride);
-
-        ST2x4_UB(diff2, 0, dst_org, stride);
-        dst_org += (4 * stride);
-        ST2x4_UB(diff2, 4, dst_org, stride);
-        dst_org += (4 * stride);
-        ST2x4_UB(diff3, 0, dst_org, stride);
-        dst_org += (4 * stride);
-        ST2x4_UB(diff3, 4, dst_org, stride);
-        dst_org += (4 * stride);
+        ST_H8(diff0, 0, 1, 2, 3, 4, 5, 6, 7, dst_org, stride)
+        dst_org += (8 * stride);
+        ST_H8(diff1, 0, 1, 2, 3, 4, 5, 6, 7, dst_org, stride)
+        dst_org += (8 * stride);
+        ST_H8(diff2, 0, 1, 2, 3, 4, 5, 6, 7, dst_org, stride)
+        dst_org += (8 * stride);
+        ST_H8(diff3, 0, 1, 2, 3, 4, 5, 6, 7, dst_org, stride)
+        dst_org += (8 * stride);
 
         dst += 2;
     }
diff --git a/libavcodec/mips/hpeldsp_init_mips.c b/libavcodec/mips/hpeldsp_init_mips.c
index 363a045..d6f7a97 100644
--- a/libavcodec/mips/hpeldsp_init_mips.c
+++ b/libavcodec/mips/hpeldsp_init_mips.c
@@ -113,10 +113,10 @@
 
 void ff_hpeldsp_init_mips(HpelDSPContext *c, int flags)
 {
-#if HAVE_MSA
-    ff_hpeldsp_init_msa(c, flags);
-#endif  // #if HAVE_MSA
 #if HAVE_MMI
     ff_hpeldsp_init_mmi(c, flags);
 #endif  // #if HAVE_MMI
+#if HAVE_MSA
+    ff_hpeldsp_init_msa(c, flags);
+#endif  // #if HAVE_MSA
 }
diff --git a/libavcodec/mips/hpeldsp_msa.c b/libavcodec/mips/hpeldsp_msa.c
index 40a0dca..2bbe477 100644
--- a/libavcodec/mips/hpeldsp_msa.c
+++ b/libavcodec/mips/hpeldsp_msa.c
@@ -49,7 +49,7 @@
     PCKEV_B2_UB(in2, in1, in4, in3, tmp0_m, tmp1_m);                    \
     PCKEV_D2_UB(dst1, dst0, dst3, dst2, tmp2_m, tmp3_m);                \
     AVER_UB2_UB(tmp0_m, tmp2_m, tmp1_m, tmp3_m, tmp0_m, tmp1_m);        \
-    ST8x4_UB(tmp0_m, tmp1_m, pdst_m, stride);                           \
+    ST_D4(tmp0_m, tmp1_m, 0, 1, 0, 1, pdst_m, stride);                  \
 }
 
 static void common_hz_bil_4w_msa(const uint8_t *src, int32_t src_stride,
@@ -59,12 +59,13 @@
     uint8_t loop_cnt;
     uint32_t out0, out1;
     v16u8 src0, src1, src0_sld1, src1_sld1, res0, res1;
+    v16i8 zeros = { 0 };
 
     for (loop_cnt = (height >> 1); loop_cnt--;) {
         LD_UB2(src, src_stride, src0, src1);
         src += (2 * src_stride);
 
-        SLDI_B2_0_UB(src0, src1, src0_sld1, src1_sld1, 1);
+        SLDI_B2_UB(zeros, src0, zeros, src1, 1, src0_sld1, src1_sld1);
         AVER_UB2_UB(src0_sld1, src0, src1_sld1, src1, res0, res1);
 
         out0 = __msa_copy_u_w((v4i32) res0, 0);
@@ -82,13 +83,14 @@
 {
     uint8_t loop_cnt;
     v16i8 src0, src1, src2, src3, src0_sld1, src1_sld1, src2_sld1, src3_sld1;
+    v16i8 zeros = { 0 };
 
     for (loop_cnt = (height >> 2); loop_cnt--;) {
         LD_SB4(src, src_stride, src0, src1, src2, src3);
         src += (4 * src_stride);
 
-        SLDI_B4_0_SB(src0, src1, src2, src3,
-                     src0_sld1, src1_sld1, src2_sld1, src3_sld1, 1);
+        SLDI_B4_SB(zeros, src0, zeros, src1, zeros, src2, zeros, src3, 1,
+                   src0_sld1, src1_sld1, src2_sld1, src3_sld1);
         AVER_ST8x4_UB(src0, src0_sld1, src1, src1_sld1,
                       src2, src2_sld1, src3, src3_sld1, dst, dst_stride);
         dst += (4 * dst_stride);
@@ -125,14 +127,15 @@
     v16i8 src0, src1, src2, src3, src4, src5, src6, src7;
     v16i8 src0_sld1, src1_sld1, src2_sld1, src3_sld1;
     v16i8 src4_sld1, src5_sld1, src6_sld1, src7_sld1;
+    v16i8 zeros = { 0 };
 
     LD_SB8(src, src_stride, src0, src1, src2, src3, src4, src5, src6, src7);
     src += (8 * src_stride);
 
-    SLDI_B4_0_SB(src0, src1, src2, src3,
-                 src0_sld1, src1_sld1, src2_sld1, src3_sld1, 1);
-    SLDI_B4_0_SB(src4, src5, src6, src7,
-                 src4_sld1, src5_sld1, src6_sld1, src7_sld1, 1);
+    SLDI_B4_SB(zeros, src0, zeros, src1, zeros, src2, zeros, src3, 1,
+               src0_sld1, src1_sld1, src2_sld1, src3_sld1);
+    SLDI_B4_SB(zeros, src4, zeros, src5, zeros, src6, zeros, src7, 1,
+               src4_sld1, src5_sld1, src6_sld1, src7_sld1);
 
     AVE_ST8x4_UB(src0, src0_sld1, src1, src1_sld1,
                  src2, src2_sld1, src3, src3_sld1, dst, dst_stride);
@@ -145,10 +148,11 @@
                                          uint8_t *dst, int32_t dst_stride)
 {
     v16i8 src0, src1, src2, src3, src0_sld1, src1_sld1, src2_sld1, src3_sld1;
+    v16i8 zeros = { 0 };
 
     LD_SB4(src, src_stride, src0, src1, src2, src3);
-    SLDI_B4_0_SB(src0, src1, src2, src3,
-                 src0_sld1, src1_sld1, src2_sld1, src3_sld1, 1);
+    SLDI_B4_SB(zeros, src0, zeros, src1, zeros, src2, zeros, src3, 1,
+               src0_sld1, src1_sld1, src2_sld1, src3_sld1);
     AVE_ST8x4_UB(src0, src0_sld1, src1, src1_sld1,
                  src2, src2_sld1, src3, src3_sld1, dst, dst_stride);
 }
@@ -216,12 +220,13 @@
     v16u8 src0, src1, src0_sld1, src1_sld1, res0, res1;
     v16u8 tmp0 = { 0 };
     v16u8 tmp1 = { 0 };
+    v16i8 zeros = { 0 };
 
     for (loop_cnt = (height >> 1); loop_cnt--;) {
         LD_UB2(src, src_stride, src0, src1);
         src += (2 * src_stride);
 
-        SLDI_B2_0_UB(src0, src1, src0_sld1, src1_sld1, 1);
+        SLDI_B2_UB(zeros, src0, zeros, src1, 1, src0_sld1, src1_sld1);
 
         dst0 = LW(dst);
         dst1 = LW(dst + dst_stride);
@@ -247,13 +252,14 @@
 {
     uint8_t loop_cnt;
     v16i8 src0, src1, src2, src3, src0_sld1, src1_sld1, src2_sld1, src3_sld1;
+    v16i8 zeros = { 0 };
 
     for (loop_cnt = (height >> 2); loop_cnt--;) {
         LD_SB4(src, src_stride, src0, src1, src2, src3);
         src += (4 * src_stride);
 
-        SLDI_B4_0_SB(src0, src1, src2, src3,
-                     src0_sld1, src1_sld1, src2_sld1, src3_sld1, 1);
+        SLDI_B4_SB(zeros, src0, zeros, src1, zeros, src2, zeros, src3, 1,
+                   src0_sld1, src1_sld1, src2_sld1, src3_sld1);
 
         AVER_DST_ST8x4_UB(src0, src0_sld1, src1, src1_sld1, src2, src2_sld1,
                           src3, src3_sld1, dst, dst_stride);
@@ -529,6 +535,7 @@
     v16i8 src0, src1, src2, src0_sld1, src1_sld1, src2_sld1;
     v16u8 src0_r, src1_r, src2_r, res;
     v8u16 add0, add1, add2, sum0, sum1;
+    v16i8 zeros = { 0 };
 
     src0 = LD_SB(src);
     src += src_stride;
@@ -537,7 +544,8 @@
         LD_SB2(src, src_stride, src1, src2);
         src += (2 * src_stride);
 
-        SLDI_B3_0_SB(src0, src1, src2, src0_sld1, src1_sld1, src2_sld1, 1);
+        SLDI_B3_SB(zeros, src0, zeros, src1, zeros, src2, 1, src0_sld1,
+                   src1_sld1, src2_sld1);
         ILVR_B3_UB(src0_sld1, src0, src1_sld1, src1, src2_sld1, src2,
                    src0_r, src1_r, src2_r);
         HADD_UB3_UH(src0_r, src1_r, src2_r, add0, add1, add2);
@@ -565,6 +573,7 @@
     v16u8 src0_r, src1_r, src2_r, src3_r, src4_r;
     v8u16 add0, add1, add2, add3, add4;
     v8u16 sum0, sum1, sum2, sum3;
+    v16i8 zeros = { 0 };
 
     src0 = LD_SB(src);
     src += src_stride;
@@ -573,8 +582,9 @@
         LD_SB4(src, src_stride, src1, src2, src3, src4);
         src += (4 * src_stride);
 
-        SLDI_B3_0_SB(src0, src1, src2, src0_sld1, src1_sld1, src2_sld1, 1);
-        SLDI_B2_0_SB(src3, src4, src3_sld1, src4_sld1, 1);
+        SLDI_B3_SB(zeros, src0, zeros, src1, zeros, src2, 1, src0_sld1,
+                   src1_sld1, src2_sld1);
+        SLDI_B2_SB(zeros, src3, zeros, src4, 1, src3_sld1, src4_sld1);
         ILVR_B3_UB(src0_sld1, src0, src1_sld1, src1, src2_sld1, src2, src0_r,
                    src1_r, src2_r);
         ILVR_B2_UB(src3_sld1, src3, src4_sld1, src4, src3_r, src4_r);
@@ -584,7 +594,7 @@
              sum0, sum1, sum2, sum3);
         SRARI_H4_UH(sum0, sum1, sum2, sum3, 2);
         PCKEV_B2_SB(sum1, sum0, sum3, sum2, src0, src1);
-        ST8x4_UB(src0, src1, dst, dst_stride);
+        ST_D4(src0, src1, 0, 1, 0, 1, dst, dst_stride);
         dst += (4 * dst_stride);
         src0 = src4;
     }
@@ -659,15 +669,17 @@
     v8u16 add0, add1, add2, add3, add4, add5, add6, add7, add8;
     v8u16 sum0, sum1, sum2, sum3, sum4, sum5, sum6, sum7;
     v16i8 out0, out1;
+    v16i8 zeros = { 0 };
 
     LD_UB8(src, src_stride, src0, src1, src2, src3, src4, src5, src6, src7);
     src += (8 * src_stride);
     src8 = LD_UB(src);
 
-    SLDI_B4_0_UB(src0, src1, src2, src3, src0_sld1, src1_sld1, src2_sld1,
-                 src3_sld1, 1);
-    SLDI_B3_0_UB(src4, src5, src6, src4_sld1, src5_sld1, src6_sld1, 1);
-    SLDI_B2_0_UB(src7, src8, src7_sld1, src8_sld1, 1);
+    SLDI_B4_UB(zeros, src0, zeros, src1, zeros, src2, zeros, src3, 1,
+               src0_sld1, src1_sld1, src2_sld1, src3_sld1);
+    SLDI_B3_UB(zeros, src4, zeros, src5, zeros, src6, 1, src4_sld1,
+               src5_sld1, src6_sld1);
+    SLDI_B2_UB(zeros, src7, zeros, src8, 1, src7_sld1, src8_sld1);
     ILVR_B4_UH(src0_sld1, src0, src1_sld1, src1, src2_sld1, src2, src3_sld1,
                src3, src0_r, src1_r, src2_r, src3_r);
     ILVR_B3_UH(src4_sld1, src4, src5_sld1, src5, src6_sld1, src6, src4_r,
@@ -689,9 +701,9 @@
     SRA_4V(sum0, sum1, sum2, sum3, 2);
     SRA_4V(sum4, sum5, sum6, sum7, 2);
     PCKEV_B2_SB(sum1, sum0, sum3, sum2, out0, out1);
-    ST8x4_UB(out0, out1, dst, dst_stride);
+    ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
     PCKEV_B2_SB(sum5, sum4, sum7, sum6, out0, out1);
-    ST8x4_UB(out0, out1, dst + 4 * dst_stride, dst_stride);
+    ST_D4(out0, out1, 0, 1, 0, 1, dst + 4 * dst_stride, dst_stride);
 }
 
 static void common_hv_bil_no_rnd_4x8_msa(const uint8_t *src, int32_t src_stride,
@@ -703,13 +715,15 @@
     v8u16 add0, add1, add2, add3, add4;
     v8u16 sum0, sum1, sum2, sum3;
     v16i8 out0, out1;
+    v16i8 zeros = { 0 };
 
     LD_SB4(src, src_stride, src0, src1, src2, src3);
     src += (4 * src_stride);
     src4 = LD_SB(src);
 
-    SLDI_B3_0_SB(src0, src1, src2, src0_sld1, src1_sld1, src2_sld1, 1);
-    SLDI_B2_0_SB(src3, src4, src3_sld1, src4_sld1, 1);
+    SLDI_B3_SB(zeros, src0, zeros, src1, zeros, src2, 1, src0_sld1,
+               src1_sld1, src2_sld1);
+    SLDI_B2_SB(zeros, src3, zeros, src4, 1, src3_sld1, src4_sld1);
     ILVR_B3_UH(src0_sld1, src0, src1_sld1, src1, src2_sld1, src2, src0_r,
                src1_r, src2_r);
     ILVR_B2_UH(src3_sld1, src3, src4_sld1, src4, src3_r, src4_r);
@@ -723,7 +737,7 @@
 
     SRA_4V(sum0, sum1, sum2, sum3, 2);
     PCKEV_B2_SB(sum1, sum0, sum3, sum2, out0, out1);
-    ST8x4_UB(out0, out1, dst, dst_stride);
+    ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
 }
 
 static void common_hv_bil_no_rnd_16x16_msa(const uint8_t *src,
@@ -918,6 +932,7 @@
     v16u8 src0_r, src1_r, src2_r;
     v8u16 add0, add1, add2, sum0, sum1;
     v16u8 dst0, dst1, res0, res1;
+    v16i8 zeros = { 0 };
 
     src0 = LD_SB(src);
     src += src_stride;
@@ -927,7 +942,8 @@
         src += (2 * src_stride);
 
         LD_UB2(dst, dst_stride, dst0, dst1);
-        SLDI_B3_0_SB(src0, src1, src2, src0_sld1, src1_sld1, src2_sld1, 1);
+        SLDI_B3_SB(zeros, src0, zeros, src1, zeros, src2, 1, src0_sld1,
+                   src1_sld1, src2_sld1);
         ILVR_B3_UB(src0_sld1, src0, src1_sld1, src1, src2_sld1, src2, src0_r,
                    src1_r, src2_r);
         HADD_UB3_UH(src0_r, src1_r, src2_r, add0, add1, add2);
@@ -959,6 +975,7 @@
     v16u8 src0_r, src1_r, src2_r, src3_r, src4_r;
     v8u16 add0, add1, add2, add3, add4;
     v8u16 sum0, sum1, sum2, sum3;
+    v16i8 zeros = { 0 };
 
     src0 = LD_SB(src);
     src += src_stride;
@@ -968,8 +985,9 @@
         src += (4 * src_stride);
 
         LD_UB4(dst, dst_stride, dst0, dst1, dst2, dst3);
-        SLDI_B3_0_SB(src0, src1, src2, src0_sld1, src1_sld1, src2_sld1, 1);
-        SLDI_B2_0_SB(src3, src4, src3_sld1, src4_sld1, 1);
+        SLDI_B3_SB(zeros, src0, zeros, src1, zeros, src2, 1, src0_sld1,
+                   src1_sld1, src2_sld1);
+        SLDI_B2_SB(zeros, src3, zeros, src4, 1, src3_sld1, src4_sld1);
         ILVR_B3_UB(src0_sld1, src0, src1_sld1, src1, src2_sld1, src2, src0_r,
                    src1_r, src2_r);
         ILVR_B2_UB(src3_sld1, src3, src4_sld1, src4, src3_r, src4_r);
diff --git a/libavcodec/mips/idctdsp_init_mips.c b/libavcodec/mips/idctdsp_init_mips.c
index bb33b55..85b76ca 100644
--- a/libavcodec/mips/idctdsp_init_mips.c
+++ b/libavcodec/mips/idctdsp_init_mips.c
@@ -65,10 +65,10 @@
 av_cold void ff_idctdsp_init_mips(IDCTDSPContext *c, AVCodecContext *avctx,
                           unsigned high_bit_depth)
 {
-#if HAVE_MSA
-    idctdsp_init_msa(c, avctx, high_bit_depth);
-#endif  // #if HAVE_MSA
 #if HAVE_MMI
     idctdsp_init_mmi(c, avctx, high_bit_depth);
 #endif /* HAVE_MMI */
+#if HAVE_MSA
+    idctdsp_init_msa(c, avctx, high_bit_depth);
+#endif  // #if HAVE_MSA
 }
diff --git a/libavcodec/mips/idctdsp_msa.c b/libavcodec/mips/idctdsp_msa.c
index b29e420..b6b98dc 100644
--- a/libavcodec/mips/idctdsp_msa.c
+++ b/libavcodec/mips/idctdsp_msa.c
@@ -28,8 +28,7 @@
     v8i16 in0, in1, in2, in3, in4, in5, in6, in7;
 
     LD_SH8(block, 8, in0, in1, in2, in3, in4, in5, in6, in7);
-    CLIP_SH4_0_255(in0, in1, in2, in3);
-    CLIP_SH4_0_255(in4, in5, in6, in7);
+    CLIP_SH8_0_255(in0, in1, in2, in3, in4, in5, in6, in7);
     PCKEV_B4_SH(in0, in0, in1, in1, in2, in2, in3, in3, in0, in1, in2, in3);
     PCKEV_B4_SH(in4, in4, in5, in5, in6, in6, in7, in7, in4, in5, in6, in7);
 
@@ -63,8 +62,7 @@
     in6 += 128;
     in7 += 128;
 
-    CLIP_SH4_0_255(in0, in1, in2, in3);
-    CLIP_SH4_0_255(in4, in5, in6, in7);
+    CLIP_SH8_0_255(in0, in1, in2, in3, in4, in5, in6, in7);
     PCKEV_B4_SH(in0, in0, in1, in1, in2, in2, in3, in3, in0, in1, in2, in3);
     PCKEV_B4_SH(in4, in4, in5, in5, in6, in6, in7, in7, in4, in5, in6, in7);
 
@@ -109,8 +107,7 @@
     in6 += (v8i16) pix6;
     in7 += (v8i16) pix7;
 
-    CLIP_SH4_0_255(in0, in1, in2, in3);
-    CLIP_SH4_0_255(in4, in5, in6, in7);
+    CLIP_SH8_0_255(in0, in1, in2, in3, in4, in5, in6, in7);
     PCKEV_B4_SH(in0, in0, in1, in1, in2, in2, in3, in3, in0, in1, in2, in3);
     PCKEV_B4_SH(in4, in4, in5, in5, in6, in6, in7, in7, in4, in5, in6, in7);
 
diff --git a/libavcodec/mips/me_cmp_msa.c b/libavcodec/mips/me_cmp_msa.c
index 0e3165c..7cb7af0 100644
--- a/libavcodec/mips/me_cmp_msa.c
+++ b/libavcodec/mips/me_cmp_msa.c
@@ -87,8 +87,8 @@
 
         PCKEV_D2_UB(src1, src0, src3, src2, src0, src1);
         PCKEV_D2_UB(ref1, ref0, ref3, ref2, ref4, ref5);
-        SLDI_B2_UB(ref0, ref1, ref0, ref1, ref0, ref1, 1);
-        SLDI_B2_UB(ref2, ref3, ref2, ref3, ref2, ref3, 1);
+        SLDI_B4_UB(ref0, ref0, ref1, ref1, ref2, ref2, ref3, ref3, 1,
+                   ref0, ref1, ref2, ref3);
         PCKEV_D2_UB(ref1, ref0, ref3, ref2, ref0, ref1);
         AVER_UB2_UB(ref4, ref0, ref5, ref1, comp0, comp1);
         sad += SAD_UB2_UH(src0, src1, comp0, comp1);
@@ -100,8 +100,8 @@
 
         PCKEV_D2_UB(src1, src0, src3, src2, src0, src1);
         PCKEV_D2_UB(ref1, ref0, ref3, ref2, ref4, ref5);
-        SLDI_B2_UB(ref0, ref1, ref0, ref1, ref0, ref1, 1);
-        SLDI_B2_UB(ref2, ref3, ref2, ref3, ref2, ref3, 1);
+        SLDI_B4_UB(ref0, ref0, ref1, ref1, ref2, ref2, ref3, ref3, 1,
+                   ref0, ref1, ref2, ref3);
         PCKEV_D2_UB(ref1, ref0, ref3, ref2, ref0, ref1);
         AVER_UB2_UB(ref4, ref0, ref5, ref1, comp0, comp1);
         sad += SAD_UB2_UH(src0, src1, comp0, comp1);
diff --git a/libavcodec/mips/mpegvideo_init_mips.c b/libavcodec/mips/mpegvideo_init_mips.c
index 1918da5..be77308 100644
--- a/libavcodec/mips/mpegvideo_init_mips.c
+++ b/libavcodec/mips/mpegvideo_init_mips.c
@@ -49,10 +49,10 @@
 
 av_cold void ff_mpv_common_init_mips(MpegEncContext *s)
 {
-#if HAVE_MSA
-    dct_unquantize_init_msa(s);
-#endif  // #if HAVE_MSA
 #if HAVE_MMI
     dct_unquantize_init_mmi(s);
 #endif /* HAVE_MMI */
+#if HAVE_MSA
+    dct_unquantize_init_msa(s);
+#endif  // #if HAVE_MSA
 }
diff --git a/libavcodec/mips/mpegvideo_mmi.c b/libavcodec/mips/mpegvideo_mmi.c
index 18058e4..e4aba08 100644
--- a/libavcodec/mips/mpegvideo_mmi.c
+++ b/libavcodec/mips/mpegvideo_mmi.c
@@ -410,9 +410,9 @@
         "psubh      %[ftmp2],   %[ftmp2],       %[ftmp8]                \n\t"
         "pandn      %[ftmp5],   %[ftmp5],       %[ftmp1]                \n\t"
         "pandn      %[ftmp6],   %[ftmp6],       %[ftmp2]                \n\t"
-        PTR_ADDIU  "%[addr0],   %[addr0],       0x10                    \n\t"
         MMI_SDXC1(%[ftmp5], %[addr0], %[block], 0x00)
         MMI_SDXC1(%[ftmp6], %[addr0], %[block], 0x08)
+        PTR_ADDIU  "%[addr0],   %[addr0],       0x10                    \n\t"
         "blez       %[addr0],   1b                                      \n\t"
         : [ftmp0]"=&f"(ftmp[0]),            [ftmp1]"=&f"(ftmp[1]),
           [ftmp2]"=&f"(ftmp[2]),            [ftmp3]"=&f"(ftmp[3]),
diff --git a/libavcodec/mips/pixblockdsp_init_mips.c b/libavcodec/mips/pixblockdsp_init_mips.c
index 1b3741e..fd0238d 100644
--- a/libavcodec/mips/pixblockdsp_init_mips.c
+++ b/libavcodec/mips/pixblockdsp_init_mips.c
@@ -60,10 +60,10 @@
 void ff_pixblockdsp_init_mips(PixblockDSPContext *c, AVCodecContext *avctx,
                               unsigned high_bit_depth)
 {
-#if HAVE_MSA
-    pixblockdsp_init_msa(c, avctx, high_bit_depth);
-#endif  // #if HAVE_MSA
 #if HAVE_MMI
     pixblockdsp_init_mmi(c, avctx, high_bit_depth);
 #endif /* HAVE_MMI */
+#if HAVE_MSA
+    pixblockdsp_init_msa(c, avctx, high_bit_depth);
+#endif  // #if HAVE_MSA
 }
diff --git a/libavcodec/mips/qpeldsp_msa.c b/libavcodec/mips/qpeldsp_msa.c
index 4710b3f..c7675f1 100644
--- a/libavcodec/mips/qpeldsp_msa.c
+++ b/libavcodec/mips/qpeldsp_msa.c
@@ -96,7 +96,7 @@
     DPADD_UB2_UH(sum2_r, sum1_r, coef2, coef1, sum0_r, sum3_r);         \
     res0_r = (v8i16) (sum0_r - sum3_r);                                 \
     res0_r = __msa_srari_h(res0_r, 5);                                  \
-    res0_r = CLIP_SH_0_255(res0_r);                                     \
+    CLIP_SH_0_255(res0_r);                                              \
     out = (v16u8) __msa_pckev_b((v16i8) res0_r, (v16i8) res0_r);        \
                                                                         \
     out;                                                                \
@@ -118,7 +118,7 @@
     res0_r = (v8i16) (sum0_r - sum3_r);                                   \
     res0_r += 15;                                                         \
     res0_r >>= 5;                                                         \
-    res0_r = CLIP_SH_0_255(res0_r);                                       \
+    CLIP_SH_0_255(res0_r);                                                \
     out = (v16u8) __msa_pckev_b((v16i8) res0_r, (v16i8) res0_r);          \
                                                                           \
     out;                                                                  \
@@ -334,7 +334,7 @@
         inp0 = (v16u8) __msa_insve_d((v2i64) inp0, 1, (v2i64) inp1);
         inp2 = (v16u8) __msa_insve_d((v2i64) inp2, 1, (v2i64) inp3);
         AVER_UB2_UB(inp0, res0, inp2, res1, res0, res1);
-        ST8x4_UB(res0, res1, dst, dst_stride);
+        ST_D4(res0, res1, 0, 1, 0, 1, dst, dst_stride);
         dst += (4 * dst_stride);
     }
 }
@@ -409,7 +409,7 @@
         res1 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp2, inp3,
                                              mask0, mask1, mask2, mask3,
                                              const20, const6, const3);
-        ST8x4_UB(res0, res1, dst, dst_stride);
+        ST_D4(res0, res1, 0, 1, 0, 1, dst, dst_stride);
         dst += (4 * dst_stride);
     }
 }
@@ -480,12 +480,12 @@
         res1 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp2, inp3,
                                              mask0, mask1, mask2, mask3,
                                              const20, const6, const3);
-        SLDI_B2_UB(inp0, inp1, inp0, inp1, inp0, inp1, 1);
-        SLDI_B2_UB(inp2, inp3, inp2, inp3, inp2, inp3, 1);
+        SLDI_B4_UB(inp0, inp0, inp1, inp1, inp2, inp2, inp3, inp3, 1,
+                   inp0, inp1, inp2, inp3);
         inp0 = (v16u8) __msa_insve_d((v2i64) inp0, 1, (v2i64) inp1);
         inp2 = (v16u8) __msa_insve_d((v2i64) inp2, 1, (v2i64) inp3);
         AVER_UB2_UB(inp0, res0, inp2, res1, res0, res1);
-        ST8x4_UB(res0, res1, dst, dst_stride);
+        ST_D4(res0, res1, 0, 1, 0, 1, dst, dst_stride);
         dst += (4 * dst_stride);
     }
 }
@@ -564,7 +564,7 @@
         inp2 = (v16u8) __msa_insve_d((v2i64) inp2, 1, (v2i64) inp3);
         res0 = __msa_ave_u_b(inp0, res0);
         res1 = __msa_ave_u_b(inp2, res1);
-        ST8x4_UB(res0, res1, dst, dst_stride);
+        ST_D4(res0, res1, 0, 1, 0, 1, dst, dst_stride);
         dst += (4 * dst_stride);
     }
 }
@@ -639,7 +639,7 @@
         res1 = APPLY_HORIZ_QPEL_NO_ROUND_FILTER_8BYTE(inp2, inp3, mask0, mask1,
                                                       mask2, mask3, const20,
                                                       const6, const3);
-        ST8x4_UB(res0, res1, dst, dst_stride);
+        ST_D4(res0, res1, 0, 1, 0, 1, dst, dst_stride);
         dst += (4 * dst_stride);
     }
 }
@@ -710,13 +710,13 @@
         res1 = APPLY_HORIZ_QPEL_NO_ROUND_FILTER_8BYTE(inp2, inp3, mask0, mask1,
                                                       mask2, mask3, const20,
                                                       const6, const3);
-        SLDI_B2_UB(inp0, inp1, inp0, inp1, inp0, inp1, 1);
-        SLDI_B2_UB(inp2, inp3, inp2, inp3, inp2, inp3, 1);
+        SLDI_B4_UB(inp0, inp0, inp1, inp1, inp2, inp2, inp3, inp3, 1,
+                   inp0, inp1, inp2, inp3);
         inp0 = (v16u8) __msa_insve_d((v2i64) inp0, 1, (v2i64) inp1);
         inp2 = (v16u8) __msa_insve_d((v2i64) inp2, 1, (v2i64) inp3);
         res0 = __msa_ave_u_b(inp0, res0);
         res1 = __msa_ave_u_b(inp2, res1);
-        ST8x4_UB(res0, res1, dst, dst_stride);
+        ST_D4(res0, res1, 0, 1, 0, 1, dst, dst_stride);
         dst += (4 * dst_stride);
     }
 }
@@ -799,7 +799,7 @@
         dst2 = (v16u8) __msa_insve_d((v2i64) dst2, 1, (v2i64) dst3);
         AVER_UB2_UB(inp0, res0, inp2, res1, res0, res1);
         AVER_UB2_UB(dst0, res0, dst2, res1, res0, res1);
-        ST8x4_UB(res0, res1, dst, dst_stride);
+        ST_D4(res0, res1, 0, 1, 0, 1, dst, dst_stride);
         dst += (4 * dst_stride);
     }
 }
@@ -876,7 +876,7 @@
         dst0 = (v16u8) __msa_insve_d((v2i64) dst0, 1, (v2i64) dst1);
         dst2 = (v16u8) __msa_insve_d((v2i64) dst2, 1, (v2i64) dst3);
         AVER_UB2_UB(dst0, res0, dst2, res1, res0, res1);
-        ST8x4_UB(res0, res1, dst, dst_stride);
+        ST_D4(res0, res1, 0, 1, 0, 1, dst, dst_stride);
         dst += (4 * dst_stride);
     }
 }
@@ -948,15 +948,15 @@
                                              mask0, mask1, mask2, mask3,
                                              const20, const6, const3);
         LD_UB4(dst, dst_stride, dst0, dst1, dst2, dst3);
-        SLDI_B2_UB(inp0, inp1, inp0, inp1, inp0, inp1, 1);
-        SLDI_B2_UB(inp2, inp3, inp2, inp3, inp2, inp3, 1);
+        SLDI_B4_UB(inp0, inp0, inp1, inp1, inp2, inp2, inp3, inp3, 1,
+                   inp0, inp1, inp2, inp3);
         inp0 = (v16u8) __msa_insve_d((v2i64) inp0, 1, (v2i64) inp1);
         inp2 = (v16u8) __msa_insve_d((v2i64) inp2, 1, (v2i64) inp3);
         dst0 = (v16u8) __msa_insve_d((v2i64) dst0, 1, (v2i64) dst1);
         dst2 = (v16u8) __msa_insve_d((v2i64) dst2, 1, (v2i64) dst3);
         AVER_UB2_UB(inp0, res0, inp2, res1, res0, res1);
         AVER_UB2_UB(dst0, res0, dst2, res1, res0, res1);
-        ST8x4_UB(res0, res1, dst, dst_stride);
+        ST_D4(res0, res1, 0, 1, 0, 1, dst, dst_stride);
         dst += (4 * dst_stride);
     }
 }
@@ -1031,8 +1031,7 @@
     tmp0 = (v16u8) __msa_insve_d((v2i64) inp0, 1, (v2i64) inp1);
     tmp1 = (v16u8) __msa_insve_d((v2i64) inp2, 1, (v2i64) inp3);
     AVER_UB2_UB(res0, tmp0, res1, tmp1, res0, res1);
-    ST8x4_UB(res0, res1, dst, dst_stride);
-    dst += (4 * dst_stride);
+    ST_D4(res0, res1, 0, 1, 0, 1, dst, dst_stride);
 
     inp8 = LD_UB(src);
     res0 = APPLY_VERT_QPEL_FILTER_8BYTE(inp4, inp3, inp2, inp1,
@@ -1048,8 +1047,7 @@
     tmp0 = (v16u8) __msa_insve_d((v2i64) inp4, 1, (v2i64) inp5);
     tmp1 = (v16u8) __msa_insve_d((v2i64) inp6, 1, (v2i64) inp7);
     AVER_UB2_UB(res0, tmp0, res1, tmp1, res0, res1);
-    ST8x4_UB(res0, res1, dst, dst_stride);
-    dst += (4 * dst_stride);
+    ST_D4(res0, res1, 0, 1, 0, 1, dst + 4 * dst_stride, dst_stride);
 }
 
 static void vert_mc_qpel_aver_src0_16x16_msa(const uint8_t *src,
@@ -1220,8 +1218,7 @@
                                         inp3, inp2, inp1, inp0,
                                         inp4, inp5, inp6, inp7,
                                         const20, const6, const3);
-    ST8x4_UB(res0, res1, dst, dst_stride);
-    dst += (4 * dst_stride);
+    ST_D4(res0, res1, 0, 1, 0, 1, dst, dst_stride);
 
     inp8 = LD_UB(src);
     res0 = APPLY_VERT_QPEL_FILTER_8BYTE(inp4, inp3, inp2, inp1,
@@ -1234,8 +1231,7 @@
                                         inp7, inp6, inp5, inp4,
                                         inp8, inp8, inp7, inp6,
                                         const20, const6, const3);
-    ST8x4_UB(res0, res1, dst, dst_stride);
-    dst += (4 * dst_stride);
+    ST_D4(res0, res1, 0, 1, 0, 1, dst + 4 * dst_stride, dst_stride);
 }
 
 static void vert_mc_qpel_16x16_msa(const uint8_t *src,
@@ -1405,8 +1401,7 @@
     tmp0 = (v16u8) __msa_insve_d((v2i64) inp1, 1, (v2i64) inp2);
     tmp1 = (v16u8) __msa_insve_d((v2i64) inp3, 1, (v2i64) inp4);
     AVER_UB2_UB(res0, tmp0, res1, tmp1, res0, res1);
-    ST8x4_UB(res0, res1, dst, dst_stride);
-    dst += (4 * dst_stride);
+    ST_D4(res0, res1, 0, 1, 0, 1, dst, dst_stride);
 
     inp8 = LD_UB(src);
     res0 = APPLY_VERT_QPEL_FILTER_8BYTE(inp4, inp3, inp2, inp1,
@@ -1422,7 +1417,7 @@
     tmp0 = (v16u8) __msa_insve_d((v2i64) inp5, 1, (v2i64) inp6);
     tmp1 = (v16u8) __msa_insve_d((v2i64) inp7, 1, (v2i64) inp8);
     AVER_UB2_UB(res0, tmp0, res1, tmp1, res0, res1);
-    ST8x4_UB(res0, res1, dst, dst_stride);
+    ST_D4(res0, res1, 0, 1, 0, 1, dst + 4 * dst_stride, dst_stride);
 }
 
 static void vert_mc_qpel_aver_src1_16x16_msa(const uint8_t *src,
@@ -1607,8 +1602,7 @@
     tmp1 = (v16u8) __msa_insve_d((v2i64) inp2, 1, (v2i64) inp3);
     res0 = __msa_ave_u_b(res0, tmp0);
     res1 = __msa_ave_u_b(res1, tmp1);
-    ST8x4_UB(res0, res1, dst, dst_stride);
-    dst += (4 * dst_stride);
+    ST_D4(res0, res1, 0, 1, 0, 1, dst, dst_stride);
 
     inp8 = LD_UB(src);
     res0 = APPLY_VERT_QPEL_NO_ROUND_FILTER_8BYTE(inp4, inp3, inp2, inp1,
@@ -1625,8 +1619,7 @@
     tmp1 = (v16u8) __msa_insve_d((v2i64) inp6, 1, (v2i64) inp7);
     res0 = __msa_ave_u_b(res0, tmp0);
     res1 = __msa_ave_u_b(res1, tmp1);
-    ST8x4_UB(res0, res1, dst, dst_stride);
-    dst += (4 * dst_stride);
+    ST_D4(res0, res1, 0, 1, 0, 1, dst + 4 * dst_stride, dst_stride);
 }
 
 static void vert_mc_qpel_no_rnd_aver_src0_16x16_msa(const uint8_t *src,
@@ -1806,8 +1799,7 @@
                                                  inp3, inp2, inp1, inp0,
                                                  inp4, inp5, inp6, inp7,
                                                  const20, const6, const3);
-    ST8x4_UB(res0, res1, dst, dst_stride);
-    dst += (4 * dst_stride);
+    ST_D4(res0, res1, 0, 1, 0, 1, dst, dst_stride);
 
     inp8 = LD_UB(src);
     res0 = APPLY_VERT_QPEL_NO_ROUND_FILTER_8BYTE(inp4, inp3, inp2, inp1,
@@ -1820,8 +1812,7 @@
                                                  inp7, inp6, inp5, inp4,
                                                  inp8, inp8, inp7, inp6,
                                                  const20, const6, const3);
-    ST8x4_UB(res0, res1, dst, dst_stride);
-    dst += (4 * dst_stride);
+    ST_D4(res0, res1, 0, 1, 0, 1, dst + 4 * dst_stride, dst_stride);
 }
 
 static void vert_mc_qpel_no_rnd_16x16_msa(const uint8_t *src,
@@ -1988,8 +1979,7 @@
     tmp1 = (v16u8) __msa_insve_d((v2i64) inp3, 1, (v2i64) inp4);
     res0 = __msa_ave_u_b(res0, tmp0);
     res1 = __msa_ave_u_b(res1, tmp1);
-    ST8x4_UB(res0, res1, dst, dst_stride);
-    dst += (4 * dst_stride);
+    ST_D4(res0, res1, 0, 1, 0, 1, dst, dst_stride);
 
     inp8 = LD_UB(src);
     res0 = APPLY_VERT_QPEL_NO_ROUND_FILTER_8BYTE(inp4, inp3, inp2, inp1,
@@ -2006,7 +1996,7 @@
     tmp1 = (v16u8) __msa_insve_d((v2i64) inp7, 1, (v2i64) inp8);
     res0 = __msa_ave_u_b(res0, tmp0);
     res1 = __msa_ave_u_b(res1, tmp1);
-    ST8x4_UB(res0, res1, dst, dst_stride);
+    ST_D4(res0, res1, 0, 1, 0, 1, dst + 4 * dst_stride, dst_stride);
 }
 
 static void vert_mc_qpel_no_rnd_aver_src1_16x16_msa(const uint8_t *src,
@@ -2195,7 +2185,7 @@
     dst2 = (v16u8) __msa_insve_d((v2i64) dst2, 1, (v2i64) dst3);
     AVER_UB2_UB(res0, tmp0, res1, tmp1, res0, res1);
     AVER_UB2_UB(dst0, res0, dst2, res1, res0, res1);
-    ST8x4_UB(res0, res1, dst, dst_stride);
+    ST_D4(res0, res1, 0, 1, 0, 1, dst, dst_stride);
     dst += (4 * dst_stride);
 
     inp8 = LD_UB(src);
@@ -2217,7 +2207,7 @@
     dst2 = (v16u8) __msa_insve_d((v2i64) dst2, 1, (v2i64) dst3);
     AVER_UB2_UB(res0, tmp0, res1, tmp1, res0, res1);
     AVER_UB2_UB(dst0, res0, dst2, res1, res0, res1);
-    ST8x4_UB(res0, res1, dst, dst_stride);
+    ST_D4(res0, res1, 0, 1, 0, 1, dst, dst_stride);
 }
 
 static void vert_mc_qpel_avg_dst_aver_src0_16x16_msa(const uint8_t *src,
@@ -2384,7 +2374,7 @@
     dst0 = (v16u8) __msa_insve_d((v2i64) dst0, 1, (v2i64) dst1);
     dst2 = (v16u8) __msa_insve_d((v2i64) dst2, 1, (v2i64) dst3);
     AVER_UB2_UB(dst0, res0, dst2, res1, res0, res1);
-    ST8x4_UB(res0, res1, dst, dst_stride);
+    ST_D4(res0, res1, 0, 1, 0, 1, dst, dst_stride);
     dst += (4 * dst_stride);
 
     inp8 = LD_UB(src);
@@ -2402,8 +2392,7 @@
     dst0 = (v16u8) __msa_insve_d((v2i64) dst0, 1, (v2i64) dst1);
     dst2 = (v16u8) __msa_insve_d((v2i64) dst2, 1, (v2i64) dst3);
     AVER_UB2_UB(dst0, res0, dst2, res1, res0, res1);
-    ST8x4_UB(res0, res1, dst, dst_stride);
-    dst += (4 * dst_stride);
+    ST_D4(res0, res1, 0, 1, 0, 1, dst, dst_stride);
 }
 
 static void vert_mc_qpel_avg_dst_16x16_msa(const uint8_t *src,
@@ -2566,7 +2555,7 @@
     dst2 = (v16u8) __msa_insve_d((v2i64) dst2, 1, (v2i64) dst3);
     AVER_UB2_UB(res0, tmp0, res1, tmp1, res0, res1);
     AVER_UB2_UB(dst0, res0, dst2, res1, res0, res1);
-    ST8x4_UB(res0, res1, dst, dst_stride);
+    ST_D4(res0, res1, 0, 1, 0, 1, dst, dst_stride);
     dst += (4 * dst_stride);
 
     inp8 = LD_UB(src);
@@ -2587,7 +2576,7 @@
     dst2 = (v16u8) __msa_insve_d((v2i64) dst2, 1, (v2i64) dst3);
     AVER_UB2_UB(res0, tmp0, res1, tmp1, res0, res1);
     AVER_UB2_UB(dst0, res0, dst2, res1, res0, res1);
-    ST8x4_UB(res0, res1, dst, dst_stride);
+    ST_D4(res0, res1, 0, 1, 0, 1, dst, dst_stride);
 }
 
 static void vert_mc_qpel_avg_dst_aver_src1_16x16_msa(const uint8_t *src,
@@ -2832,7 +2821,7 @@
                                                  const20, const6, const3);
     avg0 = (v16u8) __msa_ilvr_d((v2i64) horiz1, (v2i64) horiz0);
     res0 = __msa_ave_u_b(avg0, res0);
-    ST8x2_UB(res0, dst, dst_stride);
+    ST_D2(res0, 0, 1, dst, dst_stride);
     dst += (2 * dst_stride);
 
     LD_UB2(src, src_stride, inp2, inp3);
@@ -2860,7 +2849,7 @@
                                                  horiz5, horiz4, horiz3, horiz2,
                                                  horiz6, horiz7, horiz8, horiz8,
                                                  const20, const6, const3);
-    ST8x2_UB(res1, dst, dst_stride);
+    ST_D2(res1, 0, 1, dst, dst_stride);
     dst += 2 * dst_stride;
 
     avg0 = (v16u8) __msa_ilvr_d((v2i64) horiz5, (v2i64) horiz4);
@@ -2870,12 +2859,12 @@
                                                  horiz7, horiz6, horiz5, horiz4,
                                                  horiz8, horiz8, horiz7, horiz6,
                                                  const20, const6, const3);
-    ST8x2_UB(res0, dst, dst_stride);
+    ST_D2(res0, 0, 1, dst, dst_stride);
     dst += 2 * dst_stride;
 
     avg1 = (v16u8) __msa_ilvr_d((v2i64) horiz7, (v2i64) horiz6);
     res1 = __msa_ave_u_b(avg1, res1);
-    ST8x2_UB(res1, dst, dst_stride);
+    ST_D2(res1, 0, 1, dst, dst_stride);
 }
 
 static void hv_mc_qpel_no_rnd_horiz_16x16_msa(const uint8_t *src,
@@ -2977,7 +2966,7 @@
                                                  const20, const6, const3);
     avg0 = (v16u8) __msa_ilvr_d((v2i64) horiz1, (v2i64) horiz0);
     res0 = __msa_ave_u_b(avg0, res0);
-    ST8x2_UB(res0, dst, dst_stride);
+    ST_D2(res0, 0, 1, dst, dst_stride);
     dst += (2 * dst_stride);
 
     LD_UB2(src, src_stride, inp2, inp3);
@@ -2999,7 +2988,7 @@
     res1 = __msa_ave_u_b(avg1, res1);
     avg0 = (v16u8) __msa_ilvr_d((v2i64) horiz1, (v2i64) horiz0);
     res0 = __msa_ave_u_b(avg0, res0);
-    ST8x2_UB(res1, dst, dst_stride);
+    ST_D2(res1, 0, 1, dst, dst_stride);
     dst += (2 * dst_stride);
 
     res0 = APPLY_VERT_QPEL_NO_ROUND_FILTER_8BYTE(horiz4, horiz3, horiz2, horiz1,
@@ -3009,7 +2998,7 @@
                                                  const20, const6, const3);
     avg0 = (v16u8) __msa_ilvr_d((v2i64) horiz5, (v2i64) horiz4);
     res0 = __msa_ave_u_b(avg0, res0);
-    ST8x2_UB(res0, dst, dst_stride);
+    ST_D2(res0, 0, 1, dst, dst_stride);
     dst += (2 * dst_stride);
 
     res1 = APPLY_VERT_QPEL_NO_ROUND_FILTER_8BYTE(horiz6, horiz5, horiz4, horiz3,
@@ -3019,7 +3008,7 @@
                                                  const20, const6, const3);
     avg1 = (v16u8) __msa_ilvr_d((v2i64) horiz7, (v2i64) horiz6);
     res1 = __msa_ave_u_b(avg1, res1);
-    ST8x2_UB(res1, dst, dst_stride);
+    ST_D2(res1, 0, 1, dst, dst_stride);
 }
 
 static void hv_mc_qpel_no_rnd_horiz_src1_16x16_msa(const uint8_t *src,
@@ -3105,7 +3094,7 @@
     res0 = APPLY_HORIZ_QPEL_NO_ROUND_FILTER_8BYTE(inp0, inp1, mask0, mask1,
                                                   mask2, mask3, const20,
                                                   const6, const3);
-    SLDI_B2_UB(inp0, inp1, inp0, inp1, inp0, inp1, 1);
+    SLDI_B2_UB(inp0, inp0, inp1, inp1, 1, inp0, inp1);
 
     inp0 = (v16u8) __msa_insve_d((v2i64) inp0, 1, (v2i64) inp1);
     horiz0 = __msa_ave_u_b(inp0, res0);
@@ -3115,7 +3104,7 @@
     res1 = APPLY_HORIZ_QPEL_NO_ROUND_FILTER_8BYTE(inp2, inp3, mask0, mask1,
                                                   mask2, mask3, const20,
                                                   const6, const3);
-    SLDI_B2_UB(inp2, inp3, inp2, inp3, inp2, inp3, 1);
+    SLDI_B2_UB(inp2, inp2, inp3, inp3, 1, inp2, inp3);
 
     inp2 = (v16u8) __msa_insve_d((v2i64) inp2, 1, (v2i64) inp3);
     horiz2 = __msa_ave_u_b(inp2, res1);
@@ -3125,7 +3114,7 @@
     res0 = APPLY_HORIZ_QPEL_NO_ROUND_FILTER_8BYTE(inp0, inp1, mask0, mask1,
                                                   mask2, mask3, const20,
                                                   const6, const3);
-    SLDI_B2_UB(inp0, inp1, inp0, inp1, inp0, inp1, 1);
+    SLDI_B2_UB(inp0, inp0, inp1, inp1, 1, inp0, inp1);
 
     inp0 = (v16u8) __msa_insve_d((v2i64) inp0, 1, (v2i64) inp1);
     horiz4 = __msa_ave_u_b(inp0, res0);
@@ -3137,7 +3126,7 @@
                                                  const20, const6, const3);
     avg0 = (v16u8) __msa_ilvr_d((v2i64) horiz1, (v2i64) horiz0);
     res0 = __msa_ave_u_b(avg0, res0);
-    ST8x2_UB(res0, dst, dst_stride);
+    ST_D2(res0, 0, 1, dst, dst_stride);
     dst += (2 * dst_stride);
 
     LD_UB2(src, src_stride, inp2, inp3);
@@ -3145,7 +3134,7 @@
     res1 = APPLY_HORIZ_QPEL_NO_ROUND_FILTER_8BYTE(inp2, inp3, mask0, mask1,
                                                   mask2, mask3, const20,
                                                   const6, const3);
-    SLDI_B2_UB(inp2, inp3, inp2, inp3, inp2, inp3, 1);
+    SLDI_B2_UB(inp2, inp2, inp3, inp3, 1, inp2, inp3);
 
     inp2 = (v16u8) __msa_insve_d((v2i64) inp2, 1, (v2i64) inp3);
     horiz6 = __msa_ave_u_b(inp2, res1);
@@ -3163,7 +3152,7 @@
                                                  const20, const6, const3);
     avg1 = (v16u8) __msa_ilvr_d((v2i64) horiz3, (v2i64) horiz2);
     res1 = __msa_ave_u_b(avg1, res1);
-    ST8x2_UB(res1, dst, dst_stride);
+    ST_D2(res1, 0, 1, dst, dst_stride);
     dst += (2 * dst_stride);
 
     res0 = APPLY_VERT_QPEL_NO_ROUND_FILTER_8BYTE(horiz4, horiz3, horiz2, horiz1,
@@ -3173,7 +3162,7 @@
                                                  const20, const6, const3);
     avg0 = (v16u8) __msa_ilvr_d((v2i64) horiz5, (v2i64) horiz4);
     res0 = __msa_ave_u_b(avg0, res0);
-    ST8x2_UB(res0, dst, dst_stride);
+    ST_D2(res0, 0, 1, dst, dst_stride);
     dst += (2 * dst_stride);
 
     res1 = APPLY_VERT_QPEL_NO_ROUND_FILTER_8BYTE(horiz6, horiz5, horiz4, horiz3,
@@ -3183,7 +3172,7 @@
                                                  const20, const6, const3);
     avg1 = (v16u8) __msa_ilvr_d((v2i64) horiz7, (v2i64) horiz6);
     res1 = __msa_ave_u_b(avg1, res1);
-    ST8x2_UB(res1, dst, dst_stride);
+    ST_D2(res1, 0, 1, dst, dst_stride);
 }
 
 static void hv_mc_qpel_no_rnd_aver_h_src0_16x16_msa(const uint8_t *src,
@@ -3246,7 +3235,7 @@
 
     LD_UB2(src, src_stride, inp2, inp3);
     src += (2 * src_stride);
-    ST8x2_UB(res0, dst, dst_stride);
+    ST_D2(res0, 0, 1, dst, dst_stride);
     dst += 2 * dst_stride;
 
     res1 = APPLY_HORIZ_QPEL_NO_ROUND_FILTER_8BYTE(inp2, inp3, mask0, mask1,
@@ -3270,18 +3259,15 @@
                                                  horiz5, horiz4, horiz3, horiz2,
                                                  horiz6, horiz7, horiz8, horiz8,
                                                  const20, const6, const3);
-    ST8x2_UB(res1, dst, dst_stride);
-    dst += 2 * dst_stride;
-
-    ST8x2_UB(res0, dst, dst_stride);
-    dst += (2 * dst_stride);
+    ST_D4(res1, res0, 0, 1, 0, 1, dst, dst_stride);
+    dst += (4 * dst_stride);
 
     res1 = APPLY_VERT_QPEL_NO_ROUND_FILTER_8BYTE(horiz6, horiz5, horiz4, horiz3,
                                                  horiz7, horiz8, horiz8, horiz7,
                                                  horiz7, horiz6, horiz5, horiz4,
                                                  horiz8, horiz8, horiz7, horiz6,
                                                  const20, const6, const3);
-    ST8x2_UB(res1, dst, dst_stride);
+    ST_D2(res1, 0, 1, dst, dst_stride);
 }
 
 static void hv_mc_qpel_no_rnd_16x16_msa(const uint8_t *src,
@@ -3337,7 +3323,7 @@
                                                  const20, const6, const3);
     LD_UB2(src, src_stride, inp2, inp3);
     src += (2 * src_stride);
-    ST8x2_UB(res0, dst, dst_stride);
+    ST_D2(res0, 0, 1, dst, dst_stride);
     dst += 2 * dst_stride;
 
     horiz6 = APPLY_HORIZ_QPEL_NO_ROUND_FILTER_8BYTE(inp2, inp3, mask0, mask1,
@@ -3358,7 +3344,7 @@
                                                  horiz5, horiz4, horiz3, horiz2,
                                                  horiz6, horiz7, horiz8, horiz8,
                                                  const20, const6, const3);
-    ST8x2_UB(res1, dst, dst_stride);
+    ST_D2(res1, 0, 1, dst, dst_stride);
     dst += 2 * dst_stride;
 
 
@@ -3367,9 +3353,7 @@
                                                  horiz7, horiz6, horiz5, horiz4,
                                                  horiz8, horiz8, horiz7, horiz6,
                                                  const20, const6, const3);
-    ST8x2_UB(res0, dst, dst_stride);
-    dst += 2 * dst_stride;
-    ST8x2_UB(res1, dst, dst_stride);
+    ST_D4(res0, res1, 0, 1, 0, 1, dst, dst_stride);
 }
 
 static void hv_mc_qpel_no_rnd_aver_h_src1_16x16_msa(const uint8_t *src,
@@ -3405,7 +3389,7 @@
     res0 = APPLY_HORIZ_QPEL_NO_ROUND_FILTER_8BYTE(inp0, inp1, mask0, mask1,
                                                   mask2, mask3, const20,
                                                   const6, const3);
-    SLDI_B2_UB(inp0, inp1, inp0, inp1, inp0, inp1, 1);
+    SLDI_B2_UB(inp0, inp0, inp1, inp1, 1, inp0, inp1);
 
     inp0 = (v16u8) __msa_insve_d((v2i64) inp0, 1, (v2i64) inp1);
     horiz0 = __msa_ave_u_b(inp0, res0);
@@ -3415,7 +3399,7 @@
     res1 = APPLY_HORIZ_QPEL_NO_ROUND_FILTER_8BYTE(inp2, inp3, mask0, mask1,
                                                   mask2, mask3, const20,
                                                   const6, const3);
-    SLDI_B2_UB(inp2, inp3, inp2, inp3, inp2, inp3, 1);
+    SLDI_B2_UB(inp2, inp2, inp3, inp3, 1, inp2, inp3);
 
     inp2 = (v16u8) __msa_insve_d((v2i64) inp2, 1, (v2i64) inp3);
     horiz2 = __msa_ave_u_b(inp2, res1);
@@ -3425,7 +3409,7 @@
     res0 = APPLY_HORIZ_QPEL_NO_ROUND_FILTER_8BYTE(inp0, inp1, mask0, mask1,
                                                   mask2, mask3, const20,
                                                   const6, const3);
-    SLDI_B2_UB(inp0, inp1, inp0, inp1, inp0, inp1, 1);
+    SLDI_B2_UB(inp0, inp0, inp1, inp1, 1, inp0, inp1);
 
     inp0 = (v16u8) __msa_insve_d((v2i64) inp0, 1, (v2i64) inp1);
     horiz4 = __msa_ave_u_b(inp0, res0);
@@ -3437,13 +3421,13 @@
                                                  const20, const6, const3);
     LD_UB2(src, src_stride, inp2, inp3);
     src += (2 * src_stride);
-    ST8x2_UB(res0, dst, dst_stride);
+    ST_D2(res0, 0, 1, dst, dst_stride);
     dst += 2 * dst_stride;
 
     res1 = APPLY_HORIZ_QPEL_NO_ROUND_FILTER_8BYTE(inp2, inp3, mask0, mask1,
                                                   mask2, mask3, const20,
                                                   const6, const3);
-    SLDI_B2_UB(inp2, inp3, inp2, inp3, inp2, inp3, 1);
+    SLDI_B2_UB(inp2, inp2, inp3, inp3, 1, inp2, inp3);
 
     inp2 = (v16u8) __msa_insve_d((v2i64) inp2, 1, (v2i64) inp3);
     horiz6 = __msa_ave_u_b(inp2, res1);
@@ -3464,7 +3448,7 @@
                                                  horiz5, horiz4, horiz3, horiz2,
                                                  horiz6, horiz7, horiz8, horiz8,
                                                  const20, const6, const3);
-    ST8x2_UB(res1, dst, dst_stride);
+    ST_D2(res1, 0, 1, dst, dst_stride);
     dst += 2 * dst_stride;
 
     res1 = APPLY_VERT_QPEL_NO_ROUND_FILTER_8BYTE(horiz6, horiz5, horiz4, horiz3,
@@ -3472,9 +3456,7 @@
                                                  horiz7, horiz6, horiz5, horiz4,
                                                  horiz8, horiz8, horiz7, horiz6,
                                                  const20, const6, const3);
-    ST8x2_UB(res0, dst, dst_stride);
-    dst += 2 * dst_stride;
-    ST8x2_UB(res1, dst, dst_stride);
+    ST_D4(res0, res1, 0, 1, 0, 1, dst, dst_stride);
 }
 
 static void hv_mc_qpel_no_rnd_aver_hv_src01_16x16_msa(const uint8_t *src,
@@ -3536,7 +3518,7 @@
                                                  const20, const6, const3);
     avg0 = (v16u8) __msa_ilvr_d((v2i64) horiz2, (v2i64) horiz1);
     res0 = __msa_ave_u_b(avg0, res0);
-    ST8x2_UB(res0, dst, dst_stride);
+    ST_D2(res0, 0, 1, dst, dst_stride);
     dst += (2 * dst_stride);
 
     LD_UB2(src, src_stride, inp2, inp3);
@@ -3564,7 +3546,7 @@
                                                  horiz5, horiz4, horiz3, horiz2,
                                                  horiz6, horiz7, horiz8, horiz8,
                                                  const20, const6, const3);
-    ST8x2_UB(res1, dst, dst_stride);
+    ST_D2(res1, 0, 1, dst, dst_stride);
     dst += 2 * dst_stride;
 
     avg0 = (v16u8) __msa_ilvr_d((v2i64) horiz6, (v2i64) horiz5);
@@ -3575,12 +3557,12 @@
                                                  horiz7, horiz6, horiz5, horiz4,
                                                  horiz8, horiz8, horiz7, horiz6,
                                                  const20, const6, const3);
-    ST8x2_UB(res0, dst, dst_stride);
+    ST_D2(res0, 0, 1, dst, dst_stride);
     dst += 2 * dst_stride;
 
     avg1 = (v16u8) __msa_ilvr_d((v2i64) horiz8, (v2i64) horiz7);
     res1 = __msa_ave_u_b(avg1, res1);
-    ST8x2_UB(res1, dst, dst_stride);
+    ST_D2(res1, 0, 1, dst, dst_stride);
 }
 
 static void hv_mc_qpel_no_rnd_aver_v_src1_16x16_msa(const uint8_t *src,
@@ -3638,7 +3620,7 @@
     res0 = __msa_ave_u_b(avg0, res0);
     LD_UB2(src, src_stride, inp2, inp3);
     src += (2 * src_stride);
-    ST8x2_UB(res0, dst, dst_stride);
+    ST_D2(res0, 0, 1, dst, dst_stride);
     dst += 2 * dst_stride;
 
     horiz6 = APPLY_HORIZ_QPEL_NO_ROUND_FILTER_8BYTE(inp2, inp3, mask0, mask1,
@@ -3656,7 +3638,7 @@
     horiz8 = APPLY_HORIZ_QPEL_NO_ROUND_FILTER_8BYTE_1ROW(inp0, mask0, mask1,
                                                          mask2, mask3, const20,
                                                          const6, const3);
-    ST8x2_UB(res1, dst, dst_stride);
+    ST_D2(res1, 0, 1, dst, dst_stride);
     dst += 2 * dst_stride;
 
     res0 = APPLY_VERT_QPEL_NO_ROUND_FILTER_8BYTE(horiz4, horiz3, horiz2, horiz1,
@@ -3671,12 +3653,9 @@
                                                  horiz7, horiz6, horiz5, horiz4,
                                                  horiz8, horiz8, horiz7, horiz6,
                                                  const20, const6, const3);
-    ST8x2_UB(res0, dst, dst_stride);
-    dst += 2 * dst_stride;
-
     avg1 = (v16u8) __msa_ilvr_d((v2i64) horiz8, (v2i64) horiz7);
     res1 = __msa_ave_u_b(avg1, res1);
-    ST8x2_UB(res1, dst, dst_stride);
+    ST_D4(res0, res1, 0, 1, 0, 1, dst, dst_stride);
 }
 
 static void hv_mc_qpel_no_rnd_aver_hv_src11_16x16_msa(const uint8_t *src,
@@ -3712,7 +3691,7 @@
     res0 = APPLY_HORIZ_QPEL_NO_ROUND_FILTER_8BYTE(inp0, inp1, mask0, mask1,
                                                   mask2, mask3, const20,
                                                   const6, const3);
-    SLDI_B2_UB(inp0, inp1, inp0, inp1, inp0, inp1, 1);
+    SLDI_B2_UB(inp0, inp0, inp1, inp1, 1, inp0, inp1);
 
     inp0 = (v16u8) __msa_insve_d((v2i64) inp0, 1, (v2i64) inp1);
     horiz0 = __msa_ave_u_b(inp0, res0);
@@ -3722,7 +3701,7 @@
     res1 = APPLY_HORIZ_QPEL_NO_ROUND_FILTER_8BYTE(inp2, inp3, mask0, mask1,
                                                   mask2, mask3, const20,
                                                   const6, const3);
-    SLDI_B2_UB(inp2, inp3, inp2, inp3, inp2, inp3, 1);
+    SLDI_B2_UB(inp2, inp2, inp3, inp3, 1, inp2, inp3);
 
     inp2 = (v16u8) __msa_insve_d((v2i64) inp2, 1, (v2i64) inp3);
     horiz2 = __msa_ave_u_b(inp2, res1);
@@ -3733,7 +3712,7 @@
                                                   mask2, mask3, const20,
                                                   const6, const3);
 
-    SLDI_B2_UB(inp0, inp1, inp0, inp1, inp0, inp1, 1);
+    SLDI_B2_UB(inp0, inp0, inp1, inp1, 1, inp0, inp1);
     inp0 = (v16u8) __msa_insve_d((v2i64) inp0, 1, (v2i64) inp1);
     horiz4 = __msa_ave_u_b(inp0, res0);
     horiz5 = (v16u8) __msa_splati_d((v2i64) horiz4, 1);
@@ -3744,7 +3723,7 @@
                                                  const20, const6, const3);
     avg0 = (v16u8) __msa_ilvr_d((v2i64) horiz2, (v2i64) horiz1);
     res0 = __msa_ave_u_b(avg0, res0);
-    ST8x2_UB(res0, dst, dst_stride);
+    ST_D2(res0, 0, 1, dst, dst_stride);
     dst += (2 * dst_stride);
 
     LD_UB2(src, src_stride, inp2, inp3);
@@ -3752,7 +3731,7 @@
     res1 = APPLY_HORIZ_QPEL_NO_ROUND_FILTER_8BYTE(inp2, inp3, mask0, mask1,
                                                   mask2, mask3, const20,
                                                   const6, const3);
-    SLDI_B2_UB(inp2, inp3, inp2, inp3, inp2, inp3, 1);
+    SLDI_B2_UB(inp2, inp2, inp3, inp3, 1, inp2, inp3);
 
     inp2 = (v16u8) __msa_insve_d((v2i64) inp2, 1, (v2i64) inp3);
     horiz6 = __msa_ave_u_b(inp2, res1);
@@ -3764,7 +3743,7 @@
                                                  const20, const6, const3);
     avg1 = (v16u8) __msa_ilvr_d((v2i64) horiz4, (v2i64) horiz3);
     res1 = __msa_ave_u_b(avg1, res1);
-    ST8x2_UB(res1, dst, dst_stride);
+    ST_D2(res1, 0, 1, dst, dst_stride);
     dst += (2 * dst_stride);
 
     inp0 = LD_UB(src);
@@ -3787,7 +3766,7 @@
     res0 = __msa_ave_u_b(avg0, res0);
     avg1 = (v16u8) __msa_ilvr_d((v2i64) horiz8, (v2i64) horiz7);
     res1 = __msa_ave_u_b(avg1, res1);
-    ST8x4_UB(res0, res1, dst, dst_stride);
+    ST_D4(res0, res1, 0, 1, 0, 1, dst, dst_stride);
 }
 
 static void hv_mc_qpel_aver_horiz_src0_16x16_msa(const uint8_t *src,
@@ -3893,7 +3872,7 @@
                                         const20, const6, const3);
     avg0 = (v16u8) __msa_ilvr_d((v2i64) horiz1, (v2i64) horiz0);
     res0 = __msa_aver_u_b(avg0, res0);
-    ST8x2_UB(res0, dst, dst_stride);
+    ST_D2(res0, 0, 1, dst, dst_stride);
     dst += (2 * dst_stride);
 
     LD_UB2(src, src_stride, inp2, inp3);
@@ -3915,7 +3894,7 @@
     res0 = APPLY_HORIZ_QPEL_FILTER_8BYTE_1ROW(inp0, mask0, mask1, mask2, mask3,
                                               const20, const6, const3);
     horiz8 = __msa_aver_u_b(inp0, res0);
-    ST8x2_UB(res1, dst, dst_stride);
+    ST_D2(res1, 0, 1, dst, dst_stride);
     dst += 2 * dst_stride;
 
     res0 = APPLY_VERT_QPEL_FILTER_8BYTE(horiz4, horiz3, horiz2, horiz1,
@@ -3930,11 +3909,9 @@
                                         horiz7, horiz6, horiz5, horiz4,
                                         horiz8, horiz8, horiz7, horiz6,
                                         const20, const6, const3);
-    ST8x2_UB(res0, dst, dst_stride);
-    dst += 2 * dst_stride;
     avg1 = (v16u8) __msa_ilvr_d((v2i64) horiz7, (v2i64) horiz6);
     res1 = __msa_aver_u_b(avg1, res1);
-    ST8x2_UB(res1, dst, dst_stride);
+    ST_D4(res0, res1, 0, 1, 0, 1, dst, dst_stride);
 }
 
 static void hv_mc_qpel_aver_horiz_16x16_msa(const uint8_t *src,
@@ -4034,7 +4011,7 @@
                                         const20, const6, const3);
     avg0 = (v16u8) __msa_ilvr_d((v2i64) horiz1, (v2i64) horiz0);
     res0 = __msa_aver_u_b(avg0, res0);
-    ST8x2_UB(res0, dst, dst_stride);
+    ST_D2(res0, 0, 1, dst, dst_stride);
     dst += (2 * dst_stride);
 
     LD_UB2(src, src_stride, inp2, inp3);
@@ -4059,7 +4036,7 @@
                                         horiz5, horiz4, horiz3, horiz2,
                                         horiz6, horiz7, horiz8, horiz8,
                                         const20, const6, const3);
-    ST8x2_UB(res1, dst, dst_stride);
+    ST_D2(res1, 0, 1, dst, dst_stride);
     dst += 2 * dst_stride;
 
     avg0 = (v16u8) __msa_ilvr_d((v2i64) horiz5, (v2i64) horiz4);
@@ -4069,11 +4046,9 @@
                                         horiz7, horiz6, horiz5, horiz4,
                                         horiz8, horiz8, horiz7, horiz6,
                                         const20, const6, const3);
-    ST8x2_UB(res0, dst, dst_stride);
-    dst += 2 * dst_stride;
     avg1 = (v16u8) __msa_ilvr_d((v2i64) horiz7, (v2i64) horiz6);
     res1 = __msa_aver_u_b(avg1, res1);
-    ST8x2_UB(res1, dst, dst_stride);
+    ST_D4(res0, res1, 0, 1, 0, 1, dst, dst_stride);
 }
 
 static void hv_mc_qpel_aver_horiz_src1_16x16_msa(const uint8_t *src,
@@ -4159,12 +4134,12 @@
                                          const20, const6, const3);
     res1 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp2, inp3, mask0, mask1, mask2, mask3,
                                          const20, const6, const3);
-    SLDI_B2_UB(inp0, inp1, inp0, inp1, inp0, inp1, 1);
+    SLDI_B2_UB(inp0, inp0, inp1, inp1, 1, inp0, inp1);
 
     inp0 = (v16u8) __msa_insve_d((v2i64) inp0, 1, (v2i64) inp1);
     horiz0 = __msa_aver_u_b(inp0, res0);
     horiz1 = (v16u8) __msa_splati_d((v2i64) horiz0, 1);
-    SLDI_B2_UB(inp2, inp3, inp2, inp3, inp2, inp3, 1);
+    SLDI_B2_UB(inp2, inp2, inp3, inp3, 1, inp2, inp3);
 
     inp2 = (v16u8) __msa_insve_d((v2i64) inp2, 1, (v2i64) inp3);
     horiz2 = __msa_aver_u_b(inp2, res1);
@@ -4175,12 +4150,12 @@
                                          const20, const6, const3);
     res1 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp2, inp3, mask0, mask1, mask2, mask3,
                                          const20, const6, const3);
-    SLDI_B2_UB(inp0, inp1, inp0, inp1, inp0, inp1, 1);
+    SLDI_B2_UB(inp0, inp0, inp1, inp1, 1, inp0, inp1);
 
     inp0 = (v16u8) __msa_insve_d((v2i64) inp0, 1, (v2i64) inp1);
     horiz4 = __msa_aver_u_b(inp0, res0);
     horiz5 = (v16u8) __msa_splati_d((v2i64) horiz4, 1);
-    SLDI_B2_UB(inp2, inp3, inp2, inp3, inp2, inp3, 1);
+    SLDI_B2_UB(inp2, inp2, inp3, inp3, 1, inp2, inp3);
 
     inp2 = (v16u8) __msa_insve_d((v2i64) inp2, 1, (v2i64) inp3);
     horiz6 = __msa_aver_u_b(inp2, res1);
@@ -4197,7 +4172,7 @@
                                         horiz3, horiz2, horiz1, horiz0,
                                         horiz4, horiz5, horiz6, horiz7,
                                         const20, const6, const3);
-    ST8x2_UB(res0, dst, dst_stride);
+    ST_D2(res0, 0, 1, dst, dst_stride);
     dst += 2 * dst_stride;
 
     inp0 = LD_UB(src);
@@ -4212,7 +4187,7 @@
                                         horiz5, horiz4, horiz3, horiz2,
                                         horiz6, horiz7, horiz8, horiz8,
                                         const20, const6, const3);
-    ST8x2_UB(res1, dst, dst_stride);
+    ST_D2(res1, 0, 1, dst, dst_stride);
     dst += 2 * dst_stride;
 
     avg0 = (v16u8) __msa_ilvr_d((v2i64) horiz5, (v2i64) horiz4);
@@ -4222,12 +4197,9 @@
                                         horiz7, horiz6, horiz5, horiz4,
                                         horiz8, horiz8, horiz7, horiz6,
                                         const20, const6, const3);
-    ST8x2_UB(res0, dst, dst_stride);
-    dst += 2 * dst_stride;
-
     avg1 = (v16u8) __msa_ilvr_d((v2i64) horiz7, (v2i64) horiz6);
     res1 = __msa_aver_u_b(avg1, res1);
-    ST8x2_UB(res1, dst, dst_stride);
+    ST_D4(res0, res1, 0, 1, 0, 1, dst, dst_stride);
 }
 
 static void hv_mc_qpel_aver_h_src0_16x16_msa(const uint8_t *src,
@@ -4285,7 +4257,7 @@
                                         horiz1, horiz0, horiz0, horiz1,
                                         horiz2, horiz3, horiz4, horiz5,
                                         const20, const6, const3);
-    ST8x2_UB(res0, dst, dst_stride);
+    ST_D2(res0, 0, 1, dst, dst_stride);
     dst += (2 * dst_stride);
 
     LD_UB2(src, src_stride, inp2, inp3);
@@ -4309,7 +4281,7 @@
                                         horiz5, horiz4, horiz3, horiz2,
                                         horiz6, horiz7, horiz8, horiz8,
                                         const20, const6, const3);
-    ST8x2_UB(res1, dst, dst_stride);
+    ST_D2(res1, 0, 1, dst, dst_stride);
     dst += 2 * dst_stride;
 
     res1 = APPLY_VERT_QPEL_FILTER_8BYTE(horiz6, horiz5, horiz4, horiz3,
@@ -4317,9 +4289,7 @@
                                         horiz7, horiz6, horiz5, horiz4,
                                         horiz8, horiz8, horiz7, horiz6,
                                         const20, const6, const3);
-    ST8x2_UB(res0, dst, dst_stride);
-    dst += 2 * dst_stride;
-    ST8x2_UB(res1, dst, dst_stride);
+    ST_D4(res0, res1, 0, 1, 0, 1, dst, dst_stride);
 }
 
 static void hv_mc_qpel_16x16_msa(const uint8_t *src,
@@ -4371,7 +4341,7 @@
                                         horiz1, horiz0, horiz0, horiz1,
                                         horiz2, horiz3, horiz4, horiz5,
                                         const20, const6, const3);
-    ST8x2_UB(res0, dst, dst_stride);
+    ST_D2(res0, 0, 1, dst, dst_stride);
     dst += (2 * dst_stride);
 
     LD_UB2(src, src_stride, inp2, inp3);
@@ -4389,7 +4359,7 @@
     horiz8 = APPLY_HORIZ_QPEL_FILTER_8BYTE_1ROW(inp0,
                                                 mask0, mask1, mask2, mask3,
                                                 const20, const6, const3);
-    ST8x2_UB(res1, dst, dst_stride);
+    ST_D2(res1, 0, 1, dst, dst_stride);
     dst += 2 * dst_stride;
 
     res0 = APPLY_VERT_QPEL_FILTER_8BYTE(horiz4, horiz3, horiz2, horiz1,
@@ -4402,9 +4372,7 @@
                                         horiz7, horiz6, horiz5, horiz4,
                                         horiz8, horiz8, horiz7, horiz6,
                                         const20, const6, const3);
-    ST8x2_UB(res0, dst, dst_stride);
-    dst += 2 * dst_stride;
-    ST8x2_UB(res1, dst, dst_stride);
+    ST_D4(res0, res1, 0, 1, 0, 1, dst, dst_stride);
 }
 
 static void hv_mc_qpel_aver_h_src1_16x16_msa(const uint8_t *src,
@@ -4442,12 +4410,12 @@
                                          const20, const6, const3);
     res1 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp2, inp3, mask0, mask1, mask2, mask3,
                                          const20, const6, const3);
-    SLDI_B2_UB(inp0, inp1, inp0, inp1, inp0, inp1, 1);
+    SLDI_B2_UB(inp0, inp0, inp1, inp1, 1, inp0, inp1);
 
     inp0 = (v16u8) __msa_insve_d((v2i64) inp0, 1, (v2i64) inp1);
     horiz0 = __msa_aver_u_b(inp0, res0);
     horiz1 = (v16u8) __msa_splati_d((v2i64) horiz0, 1);
-    SLDI_B2_UB(inp2, inp3, inp2, inp3, inp2, inp3, 1);
+    SLDI_B2_UB(inp2, inp2, inp3, inp3, 1, inp2, inp3);
 
     inp2 = (v16u8) __msa_insve_d((v2i64) inp2, 1, (v2i64) inp3);
     horiz2 = __msa_aver_u_b(inp2, res1);
@@ -4458,12 +4426,12 @@
                                          const20, const6, const3);
     res1 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp2, inp3, mask0, mask1, mask2, mask3,
                                          const20, const6, const3);
-    SLDI_B2_UB(inp0, inp1, inp0, inp1, inp0, inp1, 1);
+    SLDI_B2_UB(inp0, inp0, inp1, inp1, 1, inp0, inp1);
 
     inp0 = (v16u8) __msa_insve_d((v2i64) inp0, 1, (v2i64) inp1);
     horiz4 = __msa_aver_u_b(inp0, res0);
     horiz5 = (v16u8) __msa_splati_d((v2i64) horiz4, 1);
-    SLDI_B2_UB(inp2, inp3, inp2, inp3, inp2, inp3, 1);
+    SLDI_B2_UB(inp2, inp2, inp3, inp3, 1, inp2, inp3);
 
     inp2 = (v16u8) __msa_insve_d((v2i64) inp2, 1, (v2i64) inp3);
     horiz6 = __msa_aver_u_b(inp2, res1);
@@ -4478,31 +4446,25 @@
                                         horiz1, horiz0, horiz0, horiz1,
                                         horiz2, horiz3, horiz4, horiz5,
                                         const20, const6, const3);
-    ST8x2_UB(res0, dst, dst_stride);
-    dst += (2 * dst_stride);
-
     res1 = APPLY_VERT_QPEL_FILTER_8BYTE(horiz2, horiz1, horiz0, horiz0,
                                         horiz3, horiz4, horiz5, horiz6,
                                         horiz3, horiz2, horiz1, horiz0,
                                         horiz4, horiz5, horiz6, horiz7,
                                         const20, const6, const3);
-    ST8x2_UB(res1, dst, dst_stride);
-    dst += (2 * dst_stride);
+    ST_D4(res0, res1, 0, 1, 0, 1, dst, dst_stride);
+    dst += (4 * dst_stride);
 
     res0 = APPLY_VERT_QPEL_FILTER_8BYTE(horiz4, horiz3, horiz2, horiz1,
                                         horiz5, horiz6, horiz7, horiz8,
                                         horiz5, horiz4, horiz3, horiz2,
                                         horiz6, horiz7, horiz8, horiz8,
                                         const20, const6, const3);
-    ST8x2_UB(res0, dst, dst_stride);
-    dst += (2 * dst_stride);
-
     res1 = APPLY_VERT_QPEL_FILTER_8BYTE(horiz6, horiz5, horiz4, horiz3,
                                         horiz7, horiz8, horiz8, horiz7,
                                         horiz7, horiz6, horiz5, horiz4,
                                         horiz8, horiz8, horiz7, horiz6,
                                         const20, const6, const3);
-    ST8x2_UB(res1, dst, dst_stride);
+    ST_D4(res0, res1, 0, 1, 0, 1, dst, dst_stride);
 }
 
 static void hv_mc_qpel_aver_hv_src01_16x16_msa(const uint8_t *src,
@@ -4561,7 +4523,7 @@
                                         const20, const6, const3);
     avg0 = (v16u8) __msa_insve_d((v2i64) horiz1, 1, (v2i64) horiz2);
     res0 = __msa_aver_u_b(avg0, res0);
-    ST8x2_UB(res0, dst, dst_stride);
+    ST_D2(res0, 0, 1, dst, dst_stride);
     dst += (2 * dst_stride);
 
     LD_UB2(src, src_stride, inp2, inp3);
@@ -4587,7 +4549,7 @@
                                         horiz5, horiz4, horiz3, horiz2,
                                         horiz6, horiz7, horiz8, horiz8,
                                         const20, const6, const3);
-    ST8x2_UB(res1, dst, dst_stride);
+    ST_D2(res1, 0, 1, dst, dst_stride);
     dst += 2 * dst_stride;
 
     avg0 = (v16u8) __msa_insve_d((v2i64) horiz5, 1, (v2i64) horiz6);
@@ -4597,13 +4559,9 @@
                                         horiz7, horiz6, horiz5, horiz4,
                                         horiz8, horiz8, horiz7, horiz6,
                                         const20, const6, const3);
-    ST8x2_UB(res0, dst, dst_stride);
-    dst += 2 * dst_stride;
-
     avg1 = (v16u8) __msa_insve_d((v2i64) horiz7, 1, (v2i64) horiz8);
     res1 = __msa_aver_u_b(avg1, res1);
-    ST8x2_UB(res1, dst, dst_stride);
-    dst += (2 * dst_stride);
+    ST_D4(res0, res1, 0, 1, 0, 1, dst, dst_stride);
 }
 
 static void hv_mc_qpel_aver_v_src1_16x16_msa(const uint8_t *src,
@@ -4660,7 +4618,7 @@
                                         const20, const6, const3);
     avg0 = (v16u8) __msa_insve_d((v2i64) horiz1, 1, (v2i64) horiz2);
     res0 = __msa_aver_u_b(avg0, res0);
-    ST8x2_UB(res0, dst, dst_stride);
+    ST_D2(res0, 0, 1, dst, dst_stride);
     dst += (2 * dst_stride);
 
     LD_UB2(src, src_stride, inp2, inp3);
@@ -4685,7 +4643,7 @@
                                         horiz5, horiz4, horiz3, horiz2,
                                         horiz6, horiz7, horiz8, horiz8,
                                         const20, const6, const3);
-    ST8x2_UB(res1, dst, dst_stride);
+    ST_D2(res1, 0, 1, dst, dst_stride);
     dst += 2 * dst_stride;
     avg0 = (v16u8) __msa_insve_d((v2i64) horiz5, 1, (v2i64) horiz6);
     res0 = __msa_aver_u_b(avg0, res0);
@@ -4695,11 +4653,9 @@
                                         horiz7, horiz6, horiz5, horiz4,
                                         horiz8, horiz8, horiz7, horiz6,
                                         const20, const6, const3);
-    ST8x2_UB(res0, dst, dst_stride);
-    dst += 2 * dst_stride;
     avg1 = (v16u8) __msa_insve_d((v2i64) horiz7, 1, (v2i64) horiz8);
     res1 = __msa_aver_u_b(avg1, res1);
-    ST8x2_UB(res1, dst, dst_stride);
+    ST_D4(res0, res1, 0, 1, 0, 1, dst, dst_stride);
 }
 
 static void hv_mc_qpel_aver_hv_src11_16x16_msa(const uint8_t *src,
@@ -4734,14 +4690,14 @@
     res0 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp0, inp1,
                                          mask0, mask1, mask2, mask3,
                                          const20, const6, const3);
-    SLDI_B2_UB(inp0, inp1, inp0, inp1, inp0, inp1, 1);
+    SLDI_B2_UB(inp0, inp0, inp1, inp1, 1, inp0, inp1);
 
     inp0 = (v16u8) __msa_insve_d((v2i64) inp0, 1, (v2i64) inp1);
     horiz0 = __msa_aver_u_b(inp0, res0);
     horiz1 = (v16u8) __msa_splati_d((v2i64) horiz0, 1);
     res1 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp2, inp3, mask0, mask1, mask2, mask3,
                                          const20, const6, const3);
-    SLDI_B2_UB(inp2, inp3, inp2, inp3, inp2, inp3, 1);
+    SLDI_B2_UB(inp2, inp2, inp3, inp3, 1, inp2, inp3);
 
     inp2 = (v16u8) __msa_insve_d((v2i64) inp2, 1, (v2i64) inp3);
     horiz2 = __msa_aver_u_b(inp2, res1);
@@ -4750,7 +4706,7 @@
     src += (2 * src_stride);
     res0 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp0, inp1, mask0, mask1, mask2, mask3,
                                          const20, const6, const3);
-    SLDI_B2_UB(inp0, inp1, inp0, inp1, inp0, inp1, 1);
+    SLDI_B2_UB(inp0, inp0, inp1, inp1, 1, inp0, inp1);
 
     inp0 = (v16u8) __msa_insve_d((v2i64) inp0, 1, (v2i64) inp1);
     horiz4 = __msa_aver_u_b(inp0, res0);
@@ -4764,12 +4720,12 @@
     res0 = __msa_aver_u_b(avg0, res0);
     LD_UB2(src, src_stride, inp2, inp3);
     src += (2 * src_stride);
-    ST8x2_UB(res0, dst, dst_stride);
+    ST_D2(res0, 0, 1, dst, dst_stride);
     dst += 2 * dst_stride;
 
     res1 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp2, inp3, mask0, mask1, mask2, mask3,
                                          const20, const6, const3);
-    SLDI_B2_UB(inp2, inp3, inp2, inp3, inp2, inp3, 1);
+    SLDI_B2_UB(inp2, inp2, inp3, inp3, 1, inp2, inp3);
 
     inp2 = (v16u8) __msa_insve_d((v2i64) inp2, 1, (v2i64) inp3);
     horiz6 = __msa_aver_u_b(inp2, res1);
@@ -4791,7 +4747,7 @@
                                         horiz5, horiz4, horiz3, horiz2,
                                         horiz6, horiz7, horiz8, horiz8,
                                         const20, const6, const3);
-    ST8x2_UB(res1, dst, dst_stride);
+    ST_D2(res1, 0, 1, dst, dst_stride);
     dst += 2 * dst_stride;
 
     avg0 = (v16u8) __msa_ilvr_d((v2i64) horiz6, (v2i64) horiz5);
@@ -4801,12 +4757,9 @@
                                         horiz7, horiz6, horiz5, horiz4,
                                         horiz8, horiz8, horiz7, horiz6,
                                         const20, const6, const3);
-    ST8x2_UB(res0, dst, dst_stride);
-    dst += 2 * dst_stride;
-
     avg1 = (v16u8) __msa_ilvr_d((v2i64) horiz8, (v2i64) horiz7);
     res1 = __msa_aver_u_b(avg1, res1);
-    ST8x2_UB(res1, dst, dst_stride);
+    ST_D4(res0, res1, 0, 1, 0, 1, dst, dst_stride);
 }
 
 static void hv_mc_qpel_avg_dst_aver_hv_src00_16x16_msa(const uint8_t *src,
@@ -4869,7 +4822,7 @@
     res0 = __msa_aver_u_b(avg0, res0);
     avg0 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
     res0 = __msa_aver_u_b(avg0, res0);
-    ST8x2_UB(res0, dst, dst_stride);
+    ST_D2(res0, 0, 1, dst, dst_stride);
     dst += (2 * dst_stride);
 
     LD_UB2(src, src_stride, inp2, inp3);
@@ -4889,7 +4842,7 @@
     res1 = __msa_aver_u_b(avg1, res1);
     avg1 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
     res1 = __msa_aver_u_b(avg1, res1);
-    ST8x2_UB(res1, dst, dst_stride);
+    ST_D2(res1, 0, 1, dst, dst_stride);
     dst += (2 * dst_stride);
 
     inp0 = LD_UB(src);
@@ -4906,7 +4859,7 @@
     res0 = __msa_aver_u_b(avg0, res0);
     avg0 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
     res0 = __msa_aver_u_b(avg0, res0);
-    ST8x2_UB(res0, dst, dst_stride);
+    ST_D2(res0, 0, 1, dst, dst_stride);
     dst += (2 * dst_stride);
 
     LD_UB2(dst, dst_stride, dst0, dst1);
@@ -4919,7 +4872,7 @@
     res1 = __msa_aver_u_b(avg1, res1);
     avg1 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
     res1 = __msa_aver_u_b(avg1, res1);
-    ST8x2_UB(res1, dst, dst_stride);
+    ST_D2(res1, 0, 1, dst, dst_stride);
 }
 
 static void hv_mc_qpel_avg_dst_aver_v_src0_16x16_msa(const uint8_t *src,
@@ -4979,7 +4932,7 @@
     res0 = __msa_aver_u_b(avg0, res0);
     avg0 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
     res0 = __msa_aver_u_b(avg0, res0);
-    ST8x2_UB(res0, dst, dst_stride);
+    ST_D2(res0, 0, 1, dst, dst_stride);
     dst += (2 * dst_stride);
 
     LD_UB2(src, src_stride, inp2, inp3);
@@ -4998,7 +4951,7 @@
     res1 = __msa_aver_u_b(avg1, res1);
     avg1 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
     res1 = __msa_aver_u_b(avg1, res1);
-    ST8x2_UB(res1, dst, dst_stride);
+    ST_D2(res1, 0, 1, dst, dst_stride);
     dst += (2 * dst_stride);
 
     inp0 = LD_UB(src);
@@ -5015,7 +4968,7 @@
     res0 = __msa_aver_u_b(avg0, res0);
     avg0 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
     res0 = __msa_aver_u_b(avg0, res0);
-    ST8x2_UB(res0, dst, dst_stride);
+    ST_D2(res0, 0, 1, dst, dst_stride);
     dst += (2 * dst_stride);
 
     LD_UB2(dst, dst_stride, dst0, dst1);
@@ -5028,7 +4981,7 @@
     res1 = __msa_aver_u_b(avg1, res1);
     avg1 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
     res1 = __msa_aver_u_b(avg1, res1);
-    ST8x2_UB(res1, dst, dst_stride);
+    ST_D2(res1, 0, 1, dst, dst_stride);
 }
 
 static void hv_mc_qpel_avg_dst_aver_hv_src10_16x16_msa(const uint8_t *src,
@@ -5067,7 +5020,7 @@
 
     LD_UB2(src, src_stride, inp2, inp3);
     src += (2 * src_stride);
-    SLDI_B2_UB(inp0, inp1, inp0, inp1, inp0, inp1, 1);
+    SLDI_B2_UB(inp0, inp0, inp1, inp1, 1, inp0, inp1);
 
     inp0 = (v16u8) __msa_ilvr_d((v2i64) inp1, (v2i64) inp0);
     horiz0 = __msa_aver_u_b(inp0, res0);
@@ -5076,7 +5029,7 @@
                                          const20, const6, const3);
     LD_UB2(src, src_stride, inp0, inp1);
     src += (2 * src_stride);
-    SLDI_B2_UB(inp2, inp3, inp2, inp3, inp2, inp3, 1);
+    SLDI_B2_UB(inp2, inp2, inp3, inp3, 1, inp2, inp3);
 
     inp2 = (v16u8) __msa_ilvr_d((v2i64) inp3, (v2i64) inp2);
     horiz2 = __msa_aver_u_b(inp2, res1);
@@ -5084,7 +5037,7 @@
     res0 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp0, inp1, mask0, mask1, mask2, mask3,
                                          const20, const6, const3);
 
-    SLDI_B2_UB(inp0, inp1, inp0, inp1, inp0, inp1, 1);
+    SLDI_B2_UB(inp0, inp0, inp1, inp1, 1, inp0, inp1);
 
     inp0 = (v16u8) __msa_ilvr_d((v2i64) inp1, (v2i64) inp0);
     horiz4 = __msa_aver_u_b(inp0, res0);
@@ -5099,7 +5052,7 @@
     res0 = __msa_aver_u_b(avg0, res0);
     avg0 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
     res0 = __msa_aver_u_b(avg0, res0);
-    ST8x2_UB(res0, dst, dst_stride);
+    ST_D2(res0, 0, 1, dst, dst_stride);
     dst += (2 * dst_stride);
 
     LD_UB2(src, src_stride, inp2, inp3);
@@ -5107,7 +5060,7 @@
     res1 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp2, inp3, mask0, mask1, mask2, mask3,
                                          const20, const6, const3);
 
-    SLDI_B2_UB(inp2, inp3, inp2, inp3, inp2, inp3, 1);
+    SLDI_B2_UB(inp2, inp2, inp3, inp3, 1, inp2, inp3);
 
     inp2 = (v16u8) __msa_ilvr_d((v2i64) inp3, (v2i64) inp2);
     horiz6 = __msa_aver_u_b(inp2, res1);
@@ -5122,7 +5075,7 @@
     res1 = __msa_aver_u_b(avg1, res1);
     avg1 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
     res1 = __msa_aver_u_b(avg1, res1);
-    ST8x2_UB(res1, dst, dst_stride);
+    ST_D2(res1, 0, 1, dst, dst_stride);
     dst += (2 * dst_stride);
 
     inp0 = LD_UB(src);
@@ -5140,7 +5093,7 @@
     res0 = __msa_aver_u_b(avg0, res0);
     avg0 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
     res0 = __msa_aver_u_b(avg0, res0);
-    ST8x2_UB(res0, dst, dst_stride);
+    ST_D2(res0, 0, 1, dst, dst_stride);
     dst += (2 * dst_stride);
 
     LD_UB2(dst, dst_stride, dst0, dst1);
@@ -5153,7 +5106,7 @@
     res1 = __msa_aver_u_b(avg1, res1);
     avg1 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
     res1 = __msa_aver_u_b(avg1, res1);
-    ST8x2_UB(res1, dst, dst_stride);
+    ST_D2(res1, 0, 1, dst, dst_stride);
 }
 
 static void hv_mc_qpel_avg_dst_aver_h_src0_16x16_msa(const uint8_t *src,
@@ -5214,7 +5167,7 @@
                                         const20, const6, const3);
     avg0 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
     res0 = __msa_aver_u_b(avg0, res0);
-    ST8x2_UB(res0, dst, dst_stride);
+    ST_D2(res0, 0, 1, dst, dst_stride);
     dst += (2 * dst_stride);
 
     LD_UB2(src, src_stride, inp2, inp3);
@@ -5232,7 +5185,7 @@
                                         const20, const6, const3);
     avg1 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
     res1 = __msa_aver_u_b(avg1, res1);
-    ST8x2_UB(res1, dst, dst_stride);
+    ST_D2(res1, 0, 1, dst, dst_stride);
     dst += (2 * dst_stride);
 
     inp0 = LD_UB(src);
@@ -5247,7 +5200,7 @@
                                         const20, const6, const3);
     avg0 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
     res0 = __msa_aver_u_b(avg0, res0);
-    ST8x2_UB(res0, dst, dst_stride);
+    ST_D2(res0, 0, 1, dst, dst_stride);
     dst += (2 * dst_stride);
 
     LD_UB2(dst, dst_stride, dst0, dst1);
@@ -5258,8 +5211,7 @@
                                         const20, const6, const3);
     avg1 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
     res1 = __msa_aver_u_b(avg1, res1);
-    ST8x2_UB(res1, dst, dst_stride);
-    dst += (2 * dst_stride);
+    ST_D2(res1, 0, 1, dst, dst_stride);
 }
 
 static void hv_mc_qpel_avg_dst_16x16_msa(const uint8_t *src, int32_t src_stride,
@@ -5324,7 +5276,7 @@
                                         const20, const6, const3);
     avg0 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
     res0 = __msa_aver_u_b(avg0, res0);
-    ST8x2_UB(res0, dst, dst_stride);
+    ST_D2(res0, 0, 1, dst, dst_stride);
     dst += (2 * dst_stride);
 
     LD_UB2(dst, dst_stride, dst0, dst1);
@@ -5335,7 +5287,7 @@
                                         const20, const6, const3);
     avg1 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
     res1 = __msa_aver_u_b(avg1, res1);
-    ST8x2_UB(res1, dst, dst_stride);
+    ST_D2(res1, 0, 1, dst, dst_stride);
     dst += (2 * dst_stride);
 
     LD_UB2(dst, dst_stride, dst0, dst1);
@@ -5346,7 +5298,7 @@
                                         const20, const6, const3);
     avg0 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
     res0 = __msa_aver_u_b(avg0, res0);
-    ST8x2_UB(res0, dst, dst_stride);
+    ST_D2(res0, 0, 1, dst, dst_stride);
     dst += (2 * dst_stride);
 
     LD_UB2(dst, dst_stride, dst0, dst1);
@@ -5357,7 +5309,7 @@
                                         const20, const6, const3);
     avg1 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
     res1 = __msa_aver_u_b(avg1, res1);
-    ST8x2_UB(res1, dst, dst_stride);
+    ST_D2(res1, 0, 1, dst, dst_stride);
 }
 
 static void hv_mc_qpel_avg_dst_aver_h_src1_16x16_msa(const uint8_t *src,
@@ -5395,7 +5347,7 @@
                                          const20, const6, const3);
     LD_UB2(src, src_stride, inp2, inp3);
     src += (2 * src_stride);
-    SLDI_B2_UB(inp0, inp1, inp0, inp1, inp0, inp1, 1);
+    SLDI_B2_UB(inp0, inp0, inp1, inp1, 1, inp0, inp1);
 
     inp0 = (v16u8) __msa_ilvr_d((v2i64) inp1, (v2i64) inp0);
     horiz0 = __msa_aver_u_b(inp0, res0);
@@ -5404,7 +5356,7 @@
                                          const20, const6, const3);
     LD_UB2(src, src_stride, inp0, inp1);
     src += (2 * src_stride);
-    SLDI_B2_UB(inp2, inp3, inp2, inp3, inp2, inp3, 1);
+    SLDI_B2_UB(inp2, inp2, inp3, inp3, 1, inp2, inp3);
 
     inp2 = (v16u8) __msa_ilvr_d((v2i64) inp3, (v2i64) inp2);
     horiz2 = __msa_aver_u_b(inp2, res1);
@@ -5412,7 +5364,7 @@
     res0 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp0, inp1, mask0, mask1, mask2, mask3,
                                          const20, const6, const3);
 
-    SLDI_B2_UB(inp0, inp1, inp0, inp1, inp0, inp1, 1);
+    SLDI_B2_UB(inp0, inp0, inp1, inp1, 1, inp0, inp1);
 
     inp0 = (v16u8) __msa_ilvr_d((v2i64) inp1, (v2i64) inp0);
     horiz4 = __msa_aver_u_b(inp0, res0);
@@ -5425,7 +5377,7 @@
                                         const20, const6, const3);
     avg0 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
     res0 = __msa_aver_u_b(avg0, res0);
-    ST8x2_UB(res0, dst, dst_stride);
+    ST_D2(res0, 0, 1, dst, dst_stride);
     dst += (2 * dst_stride);
 
     LD_UB2(src, src_stride, inp2, inp3);
@@ -5433,7 +5385,7 @@
     res1 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp2, inp3, mask0, mask1, mask2, mask3,
                                          const20, const6, const3);
 
-    SLDI_B2_UB(inp2, inp3, inp2, inp3, inp2, inp3, 1);
+    SLDI_B2_UB(inp2, inp2, inp3, inp3, 1, inp2, inp3);
 
     inp2 = (v16u8) __msa_ilvr_d((v2i64) inp3, (v2i64) inp2);
     horiz6 = __msa_aver_u_b(inp2, res1);
@@ -5446,7 +5398,7 @@
                                         const20, const6, const3);
     avg1 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
     res1 = __msa_aver_u_b(avg1, res1);
-    ST8x2_UB(res1, dst, dst_stride);
+    ST_D2(res1, 0, 1, dst, dst_stride);
     dst += (2 * dst_stride);
 
     inp0 = LD_UB(src);
@@ -5462,7 +5414,7 @@
                                         const20, const6, const3);
     avg0 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
     res0 = __msa_aver_u_b(avg0, res0);
-    ST8x2_UB(res0, dst, dst_stride);
+    ST_D2(res0, 0, 1, dst, dst_stride);
     dst += (2 * dst_stride);
 
     LD_UB2(dst, dst_stride, dst0, dst1);
@@ -5473,7 +5425,7 @@
                                         const20, const6, const3);
     avg1 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
     res1 = __msa_aver_u_b(avg1, res1);
-    ST8x2_UB(res1, dst, dst_stride);
+    ST_D2(res1, 0, 1, dst, dst_stride);
 }
 
 static void hv_mc_qpel_avg_dst_aver_hv_src01_16x16_msa(const uint8_t *src,
@@ -5537,7 +5489,7 @@
     res0 = __msa_aver_u_b(avg0, res0);
     avg0 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
     res0 = __msa_aver_u_b(avg0, res0);
-    ST8x2_UB(res0, dst, dst_stride);
+    ST_D2(res0, 0, 1, dst, dst_stride);
     dst += (2 * dst_stride);
 
     LD_UB2(dst, dst_stride, dst0, dst1);
@@ -5557,7 +5509,7 @@
     res1 = __msa_aver_u_b(avg1, res1);
     avg1 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
     res1 = __msa_aver_u_b(avg1, res1);
-    ST8x2_UB(res1, dst, dst_stride);
+    ST_D2(res1, 0, 1, dst, dst_stride);
     dst += (2 * dst_stride);
 
     inp0 = LD_UB(src);
@@ -5579,7 +5531,7 @@
     LD_UB2(dst, dst_stride, dst0, dst1);
     avg0 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
     res0 = __msa_aver_u_b(avg0, res0);
-    ST8x2_UB(res0, dst, dst_stride);
+    ST_D2(res0, 0, 1, dst, dst_stride);
     dst += (2 * dst_stride);
 
     avg1 = (v16u8) __msa_ilvr_d((v2i64) horiz8, (v2i64) horiz7);
@@ -5587,7 +5539,7 @@
     LD_UB2(dst, dst_stride, dst0, dst1);
     avg1 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
     res1 = __msa_aver_u_b(avg1, res1);
-    ST8x2_UB(res1, dst, dst_stride);
+    ST_D2(res1, 0, 1, dst, dst_stride);
 }
 
 static void hv_mc_qpel_avg_dst_aver_v_src1_16x16_msa(const uint8_t *src,
@@ -5647,7 +5599,7 @@
     res0 = __msa_aver_u_b(avg0, res0);
     avg0 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
     res0 = __msa_aver_u_b(avg0, res0);
-    ST8x2_UB(res0, dst, dst_stride);
+    ST_D2(res0, 0, 1, dst, dst_stride);
     dst += (2 * dst_stride);
 
     LD_UB2(dst, dst_stride, dst0, dst1);
@@ -5666,7 +5618,7 @@
     res1 = __msa_aver_u_b(avg1, res1);
     avg1 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
     res1 = __msa_aver_u_b(avg1, res1);
-    ST8x2_UB(res1, dst, dst_stride);
+    ST_D2(res1, 0, 1, dst, dst_stride);
     dst += (2 * dst_stride);
 
     inp0 = LD_UB(src);
@@ -5686,7 +5638,7 @@
     LD_UB2(dst, dst_stride, dst0, dst1);
     avg0 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
     res0 = __msa_aver_u_b(avg0, res0);
-    ST8x2_UB(res0, dst, dst_stride);
+    ST_D2(res0, 0, 1, dst, dst_stride);
     dst += (2 * dst_stride);
 
     avg1 = (v16u8) __msa_ilvr_d((v2i64) horiz8, (v2i64) horiz7);
@@ -5694,7 +5646,7 @@
     LD_UB2(dst, dst_stride, dst0, dst1);
     avg1 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
     res1 = __msa_aver_u_b(avg1, res1);
-    ST8x2_UB(res1, dst, dst_stride);
+    ST_D2(res1, 0, 1, dst, dst_stride);
 }
 
 static void hv_mc_qpel_avg_dst_aver_hv_src11_16x16_msa(const uint8_t *src,
@@ -5732,7 +5684,7 @@
                                          const20, const6, const3);
     LD_UB2(src, src_stride, inp2, inp3);
     src += (2 * src_stride);
-    SLDI_B2_UB(inp0, inp1, inp0, inp1, inp0, inp1, 1);
+    SLDI_B2_UB(inp0, inp0, inp1, inp1, 1, inp0, inp1);
 
     inp0 = (v16u8) __msa_ilvr_d((v2i64) inp1, (v2i64) inp0);
     horiz0 = __msa_aver_u_b(inp0, res0);
@@ -5741,14 +5693,14 @@
                                          const20, const6, const3);
     LD_UB2(src, src_stride, inp0, inp1);
     src += (2 * src_stride);
-    SLDI_B2_UB(inp2, inp3, inp2, inp3, inp2, inp3, 1);
+    SLDI_B2_UB(inp2, inp2, inp3, inp3, 1, inp2, inp3);
 
     inp2 = (v16u8) __msa_ilvr_d((v2i64) inp3, (v2i64) inp2);
     horiz2 = __msa_aver_u_b(inp2, res1);
     horiz3 = (v16u8) __msa_splati_d((v2i64) horiz2, 1);
     res0 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp0, inp1, mask0, mask1, mask2, mask3,
                                          const20, const6, const3);
-    SLDI_B2_UB(inp0, inp1, inp0, inp1, inp0, inp1, 1);
+    SLDI_B2_UB(inp0, inp0, inp1, inp1, 1, inp0, inp1);
 
     inp0 = (v16u8) __msa_ilvr_d((v2i64) inp1, (v2i64) inp0);
     horiz4 = __msa_aver_u_b(inp0, res0);
@@ -5762,14 +5714,14 @@
     res0 = __msa_aver_u_b(avg0, res0);
     avg0 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
     res0 = __msa_aver_u_b(avg0, res0);
-    ST8x2_UB(res0, dst, dst_stride);
+    ST_D2(res0, 0, 1, dst, dst_stride);
     dst += (2 * dst_stride);
 
     LD_UB2(src, src_stride, inp2, inp3);
     src += (2 * src_stride);
     res1 = APPLY_HORIZ_QPEL_FILTER_8BYTE(inp2, inp3, mask0, mask1, mask2, mask3,
                                          const20, const6, const3);
-    SLDI_B2_UB(inp2, inp3, inp2, inp3, inp2, inp3, 1);
+    SLDI_B2_UB(inp2, inp2, inp3, inp3, 1, inp2, inp3);
 
     inp2 = (v16u8) __msa_ilvr_d((v2i64) inp3, (v2i64) inp2);
     horiz6 = __msa_aver_u_b(inp2, res1);
@@ -5783,7 +5735,7 @@
     res1 = __msa_aver_u_b(avg1, res1);
     avg1 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
     res1 = __msa_aver_u_b(avg1, res1);
-    ST8x2_UB(res1, dst, dst_stride);
+    ST_D2(res1, 0, 1, dst, dst_stride);
     dst += (2 * dst_stride);
 
     inp0 = LD_UB(src);
@@ -5800,7 +5752,7 @@
     res0 = __msa_aver_u_b(avg0, res0);
     avg0 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
     res0 = __msa_aver_u_b(avg0, res0);
-    ST8x2_UB(res0, dst, dst_stride);
+    ST_D2(res0, 0, 1, dst, dst_stride);
     dst += (2 * dst_stride);
 
     LD_UB2(dst, dst_stride, dst0, dst1);
@@ -5812,7 +5764,7 @@
     res1 = __msa_aver_u_b(avg1, res1);
     avg1 = (v16u8) __msa_ilvr_d((v2i64) dst1, (v2i64) dst0);
     res1 = __msa_aver_u_b(avg1, res1);
-    ST8x2_UB(res1, dst, dst_stride);
+    ST_D2(res1, 0, 1, dst, dst_stride);
 }
 
 static void copy_8x8_msa(const uint8_t *src, int32_t src_stride,
diff --git a/libavcodec/mips/sbrdsp_mips.c b/libavcodec/mips/sbrdsp_mips.c
index 1b0a106..83039fd 100644
--- a/libavcodec/mips/sbrdsp_mips.c
+++ b/libavcodec/mips/sbrdsp_mips.c
@@ -59,6 +59,7 @@
 #include "libavutil/mips/asmdefs.h"
 
 #if HAVE_INLINE_ASM
+#if HAVE_MIPSFPU
 static void sbr_qmf_pre_shuffle_mips(float *z)
 {
     int Temp1, Temp2, Temp3, Temp4, Temp5, Temp6;
@@ -165,7 +166,6 @@
     );
 }
 
-#if HAVE_MIPSFPU
 #if !HAVE_MIPS32R6 && !HAVE_MIPS64R6
 static void sbr_sum64x5_mips(float *z)
 {
@@ -890,9 +890,9 @@
 void ff_sbrdsp_init_mips(SBRDSPContext *s)
 {
 #if HAVE_INLINE_ASM
+#if HAVE_MIPSFPU
     s->qmf_pre_shuffle = sbr_qmf_pre_shuffle_mips;
     s->qmf_post_shuffle = sbr_qmf_post_shuffle_mips;
-#if HAVE_MIPSFPU
 #if !HAVE_MIPS32R6 && !HAVE_MIPS64R6
     s->sum64x5 = sbr_sum64x5_mips;
     s->sum_square = sbr_sum_square_mips;
diff --git a/libavcodec/mips/simple_idct_mmi.c b/libavcodec/mips/simple_idct_mmi.c
index 7f4bb74..73d797f 100644
--- a/libavcodec/mips/simple_idct_mmi.c
+++ b/libavcodec/mips/simple_idct_mmi.c
@@ -39,7 +39,7 @@
 #define COL_SHIFT 20
 #define DC_SHIFT 3
 
-DECLARE_ALIGNED(8, const int16_t, W_arr)[46] = {
+DECLARE_ALIGNED(16, const int16_t, W_arr)[46] = {
     W4,  W2,  W4,  W6,
     W1,  W3,  W5,  W7,
     W4,  W6, -W4, -W2,
diff --git a/libavcodec/mips/simple_idct_msa.c b/libavcodec/mips/simple_idct_msa.c
index 8a72359..4bd3dd8 100644
--- a/libavcodec/mips/simple_idct_msa.c
+++ b/libavcodec/mips/simple_idct_msa.c
@@ -336,35 +336,26 @@
     SRA_4V(temp2_r, temp2_l, temp3_r, temp3_l, 20);
     SRA_4V(a3_r, a3_l, a2_r, a2_l, 20);
     SRA_4V(a1_r, a1_l, a0_r, a0_l, 20);
-    PCKEV_H4_SW(temp0_l, temp0_r, temp1_l, temp1_r, temp2_l, temp2_r,
-                temp3_l, temp3_r, temp0_r, temp1_r, temp2_r, temp3_r);
-    PCKEV_H4_SW(a0_l, a0_r, a1_l, a1_r, a2_l, a2_r, a3_l, a3_r,
-                a0_r, a1_r, a2_r, a3_r);
-    temp0_r = (v4i32) CLIP_SH_0_255(temp0_r);
-    temp1_r = (v4i32) CLIP_SH_0_255(temp1_r);
-    temp2_r = (v4i32) CLIP_SH_0_255(temp2_r);
-    temp3_r = (v4i32) CLIP_SH_0_255(temp3_r);
-    PCKEV_B4_SW(temp0_r, temp0_r, temp1_r, temp1_r,
-                temp2_r, temp2_r, temp3_r, temp3_r,
-                temp0_r, temp1_r, temp2_r, temp3_r);
-    tmp0 = __msa_copy_u_d((v2i64) temp0_r, 1);
-    tmp1 = __msa_copy_u_d((v2i64) temp1_r, 1);
-    tmp2 = __msa_copy_u_d((v2i64) temp2_r, 1);
-    tmp3 = __msa_copy_u_d((v2i64) temp3_r, 1);
+    PCKEV_H4_SH(temp0_l, temp0_r, temp1_l, temp1_r, temp2_l, temp2_r,
+                temp3_l, temp3_r, in0, in1, in2, in3);
+    PCKEV_H4_SH(a0_l, a0_r, a1_l, a1_r, a2_l, a2_r, a3_l, a3_r,
+                in4, in5, in6, in7);
+    CLIP_SH4_0_255(in0, in1, in2, in3);
+    PCKEV_B4_SH(in0, in0, in1, in1, in2, in2, in3, in3,
+                in0, in1, in2, in3);
+    tmp0 = __msa_copy_u_d((v2i64) in0, 1);
+    tmp1 = __msa_copy_u_d((v2i64) in1, 1);
+    tmp2 = __msa_copy_u_d((v2i64) in2, 1);
+    tmp3 = __msa_copy_u_d((v2i64) in3, 1);
     SD4(tmp0, tmp1, tmp2, tmp3, dst, dst_stride);
-    dst += 4 * dst_stride;
-    a0_r = (v4i32) CLIP_SH_0_255(a0_r);
-    a1_r = (v4i32) CLIP_SH_0_255(a1_r);
-    a2_r = (v4i32) CLIP_SH_0_255(a2_r);
-    a3_r = (v4i32) CLIP_SH_0_255(a3_r);
-    PCKEV_B4_SW(a0_r, a0_r, a1_r, a1_r,
-                a2_r, a2_r, a3_r, a3_r, a0_r, a1_r, a2_r, a3_r);
-    tmp3 = __msa_copy_u_d((v2i64) a0_r, 1);
-    tmp2 = __msa_copy_u_d((v2i64) a1_r, 1);
-    tmp1 = __msa_copy_u_d((v2i64) a2_r, 1);
-    tmp0 = __msa_copy_u_d((v2i64) a3_r, 1);
-    SD4(tmp0, tmp1, tmp2, tmp3, dst, dst_stride);
-    dst += 4 * dst_stride;
+    CLIP_SH4_0_255(in4, in5, in6, in7);
+    PCKEV_B4_SH(in4, in4, in5, in5, in6, in6, in7, in7,
+                in4, in5, in6, in7);
+    tmp3 = __msa_copy_u_d((v2i64) in4, 1);
+    tmp2 = __msa_copy_u_d((v2i64) in5, 1);
+    tmp1 = __msa_copy_u_d((v2i64) in6, 1);
+    tmp0 = __msa_copy_u_d((v2i64) in7, 1);
+    SD4(tmp0, tmp1, tmp2, tmp3, dst + 4 * dst_stride, dst_stride);
 }
 
 static void simple_idct_add_msa(uint8_t *dst, int32_t dst_stride,
@@ -516,21 +507,17 @@
                 temp3_l, temp3_r, temp0_r, temp1_r, temp2_r, temp3_r);
     ILVR_B4_SW(zero, in0, zero, in1, zero, in2, zero, in3,
                temp0_l, temp1_l, temp2_l, temp3_l);
-    temp0_r = (v4i32) ((v8i16) (temp0_r) + (v8i16) (temp0_l));
-    temp1_r = (v4i32) ((v8i16) (temp1_r) + (v8i16) (temp1_l));
-    temp2_r = (v4i32) ((v8i16) (temp2_r) + (v8i16) (temp2_l));
-    temp3_r = (v4i32) ((v8i16) (temp3_r) + (v8i16) (temp3_l));
-    temp0_r = (v4i32) CLIP_SH_0_255(temp0_r);
-    temp1_r = (v4i32) CLIP_SH_0_255(temp1_r);
-    temp2_r = (v4i32) CLIP_SH_0_255(temp2_r);
-    temp3_r = (v4i32) CLIP_SH_0_255(temp3_r);
-    PCKEV_B4_SW(temp0_r, temp0_r, temp1_r, temp1_r,
-                temp2_r, temp2_r, temp3_r, temp3_r,
-                temp0_r, temp1_r, temp2_r, temp3_r);
-    tmp0 = __msa_copy_u_d((v2i64) temp0_r, 1);
-    tmp1 = __msa_copy_u_d((v2i64) temp1_r, 1);
-    tmp2 = __msa_copy_u_d((v2i64) temp2_r, 1);
-    tmp3 = __msa_copy_u_d((v2i64) temp3_r, 1);
+    in0 = (v8i16) (temp0_r) + (v8i16) (temp0_l);
+    in1 = (v8i16) (temp1_r) + (v8i16) (temp1_l);
+    in2 = (v8i16) (temp2_r) + (v8i16) (temp2_l);
+    in3 = (v8i16) (temp3_r) + (v8i16) (temp3_l);
+    CLIP_SH4_0_255(in0, in1, in2, in3);
+    PCKEV_B4_SH(in0, in0, in1, in1, in2, in2, in3, in3,
+                in0, in1, in2, in3);
+    tmp0 = __msa_copy_u_d((v2i64) in0, 1);
+    tmp1 = __msa_copy_u_d((v2i64) in1, 1);
+    tmp2 = __msa_copy_u_d((v2i64) in2, 1);
+    tmp3 = __msa_copy_u_d((v2i64) in3, 1);
     SD4(tmp0, tmp1, tmp2, tmp3, dst, dst_stride);
 
     SRA_4V(a3_r, a3_l, a2_r, a2_l, 20);
@@ -540,20 +527,17 @@
                 a0_r, a1_r, a2_r, a3_r);
     ILVR_B4_SW(zero, in4, zero, in5, zero, in6, zero, in7,
                a3_l, a2_l, a1_l, a0_l);
-    a3_r = (v4i32) ((v8i16) (a3_r) + (v8i16) (a3_l));
-    a2_r = (v4i32) ((v8i16) (a2_r) + (v8i16) (a2_l));
-    a1_r = (v4i32) ((v8i16) (a1_r) + (v8i16) (a1_l));
-    a0_r = (v4i32) ((v8i16) (a0_r) + (v8i16) (a0_l));
-    a3_r = (v4i32) CLIP_SH_0_255(a3_r);
-    a2_r = (v4i32) CLIP_SH_0_255(a2_r);
-    a1_r = (v4i32) CLIP_SH_0_255(a1_r);
-    a0_r = (v4i32) CLIP_SH_0_255(a0_r);
-    PCKEV_B4_SW(a0_r, a0_r, a1_r, a1_r,
-                a2_r, a2_r, a3_r, a3_r, a0_r, a1_r, a2_r, a3_r);
-    tmp0 = __msa_copy_u_d((v2i64) a3_r, 1);
-    tmp1 = __msa_copy_u_d((v2i64) a2_r, 1);
-    tmp2 = __msa_copy_u_d((v2i64) a1_r, 1);
-    tmp3 = __msa_copy_u_d((v2i64) a0_r, 1);
+    in4 = (v8i16) (a3_r) + (v8i16) (a3_l);
+    in5 = (v8i16) (a2_r) + (v8i16) (a2_l);
+    in6 = (v8i16) (a1_r) + (v8i16) (a1_l);
+    in7 = (v8i16) (a0_r) + (v8i16) (a0_l);
+    CLIP_SH4_0_255(in4, in5, in6, in7);
+    PCKEV_B4_SH(in4, in4, in5, in5, in6, in6, in7, in7,
+                in4, in5, in6, in7);
+    tmp0 = __msa_copy_u_d((v2i64) in4, 1);
+    tmp1 = __msa_copy_u_d((v2i64) in5, 1);
+    tmp2 = __msa_copy_u_d((v2i64) in6, 1);
+    tmp3 = __msa_copy_u_d((v2i64) in7, 1);
     SD4(tmp0, tmp1, tmp2, tmp3, dst + 4 * dst_stride, dst_stride);
 }
 
diff --git a/libavcodec/mips/vc1dsp_init_mips.c b/libavcodec/mips/vc1dsp_init_mips.c
index 4adc9e1..c0007ff 100644
--- a/libavcodec/mips/vc1dsp_init_mips.c
+++ b/libavcodec/mips/vc1dsp_init_mips.c
@@ -23,6 +23,10 @@
 #include "vc1dsp_mips.h"
 #include "config.h"
 
+#define FN_ASSIGN(OP, X, Y, INSN) \
+    dsp->OP##vc1_mspel_pixels_tab[1][X+4*Y] = ff_##OP##vc1_mspel_mc##X##Y##INSN; \
+    dsp->OP##vc1_mspel_pixels_tab[0][X+4*Y] = ff_##OP##vc1_mspel_mc##X##Y##_16##INSN
+
 #if HAVE_MMI
 static av_cold void vc1dsp_init_mmi(VC1DSPContext *dsp)
 {
@@ -49,10 +53,6 @@
     dsp->vc1_v_loop_filter16 = ff_vc1_v_loop_filter16_mmi;
     dsp->vc1_h_loop_filter16 = ff_vc1_h_loop_filter16_mmi;
 
-#define FN_ASSIGN(OP, X, Y, INSN) \
-    dsp->OP##vc1_mspel_pixels_tab[1][X+4*Y] = ff_##OP##vc1_mspel_mc##X##Y##INSN; \
-    dsp->OP##vc1_mspel_pixels_tab[0][X+4*Y] = ff_##OP##vc1_mspel_mc##X##Y##_16##INSN
-
     FN_ASSIGN(put_, 0, 0, _mmi);
     FN_ASSIGN(put_, 0, 1, _mmi);
     FN_ASSIGN(put_, 0, 2, _mmi);
@@ -100,9 +100,31 @@
 }
 #endif /* HAVE_MMI */
 
+#if HAVE_MSA
+static av_cold void vc1dsp_init_msa(VC1DSPContext *dsp)
+{
+    dsp->vc1_inv_trans_8x8 = ff_vc1_inv_trans_8x8_msa;
+    dsp->vc1_inv_trans_4x8 = ff_vc1_inv_trans_4x8_msa;
+    dsp->vc1_inv_trans_8x4 = ff_vc1_inv_trans_8x4_msa;
+
+    FN_ASSIGN(put_, 1, 1, _msa);
+    FN_ASSIGN(put_, 1, 2, _msa);
+    FN_ASSIGN(put_, 1, 3, _msa);
+    FN_ASSIGN(put_, 2, 1, _msa);
+    FN_ASSIGN(put_, 2, 2, _msa);
+    FN_ASSIGN(put_, 2, 3, _msa);
+    FN_ASSIGN(put_, 3, 1, _msa);
+    FN_ASSIGN(put_, 3, 2, _msa);
+    FN_ASSIGN(put_, 3, 3, _msa);
+}
+#endif /* HAVE_MSA */
+
 av_cold void ff_vc1dsp_init_mips(VC1DSPContext *dsp)
 {
 #if HAVE_MMI
     vc1dsp_init_mmi(dsp);
 #endif /* HAVE_MMI */
+#if HAVE_MSA
+    vc1dsp_init_msa(dsp);
+#endif /* HAVE_MSA */
 }
diff --git a/libavcodec/mips/vc1dsp_mips.h b/libavcodec/mips/vc1dsp_mips.h
index 0db85fa..5897dae 100644
--- a/libavcodec/mips/vc1dsp_mips.h
+++ b/libavcodec/mips/vc1dsp_mips.h
@@ -180,15 +180,38 @@
 
 void ff_put_no_rnd_vc1_chroma_mc8_mmi(uint8_t *dst /* align 8 */,
                                       uint8_t *src /* align 1 */,
-                                      int stride, int h, int x, int y);
+                                      ptrdiff_t stride, int h, int x, int y);
 void ff_put_no_rnd_vc1_chroma_mc4_mmi(uint8_t *dst /* align 8 */,
                                       uint8_t *src /* align 1 */,
-                                      int stride, int h, int x, int y);
+                                      ptrdiff_t stride, int h, int x, int y);
 void ff_avg_no_rnd_vc1_chroma_mc8_mmi(uint8_t *dst /* align 8 */,
                                       uint8_t *src /* align 1 */,
-                                      int stride, int h, int x, int y);
+                                      ptrdiff_t stride, int h, int x, int y);
 void ff_avg_no_rnd_vc1_chroma_mc4_mmi(uint8_t *dst /* align 8 */,
                                       uint8_t *src /* align 1 */,
-                                      int stride, int h, int x, int y);
+                                      ptrdiff_t stride, int h, int x, int y);
 
+void ff_vc1_inv_trans_8x8_msa(int16_t block[64]);
+void ff_vc1_inv_trans_8x4_msa(uint8_t *dest, ptrdiff_t linesize, int16_t *block);
+void ff_vc1_inv_trans_4x8_msa(uint8_t *dest, ptrdiff_t linesize, int16_t *block);
+
+#define FF_PUT_VC1_MSPEL_MC_MSA(hmode, vmode)                                 \
+void ff_put_vc1_mspel_mc ## hmode ## vmode ## _msa(uint8_t *dst,              \
+                                                  const uint8_t *src,         \
+                                                  ptrdiff_t stride, int rnd); \
+void ff_put_vc1_mspel_mc ## hmode ## vmode ## _16_msa(uint8_t *dst,           \
+                                                  const uint8_t *src,         \
+                                                  ptrdiff_t stride, int rnd);
+
+FF_PUT_VC1_MSPEL_MC_MSA(1, 1);
+FF_PUT_VC1_MSPEL_MC_MSA(1, 2);
+FF_PUT_VC1_MSPEL_MC_MSA(1, 3);
+
+FF_PUT_VC1_MSPEL_MC_MSA(2, 1);
+FF_PUT_VC1_MSPEL_MC_MSA(2, 2);
+FF_PUT_VC1_MSPEL_MC_MSA(2, 3);
+
+FF_PUT_VC1_MSPEL_MC_MSA(3, 1);
+FF_PUT_VC1_MSPEL_MC_MSA(3, 2);
+FF_PUT_VC1_MSPEL_MC_MSA(3, 3);
 #endif /* AVCODEC_MIPS_VC1DSP_MIPS_H */
diff --git a/libavcodec/mips/vc1dsp_mmi.c b/libavcodec/mips/vc1dsp_mmi.c
index db314de..9837868 100644
--- a/libavcodec/mips/vc1dsp_mmi.c
+++ b/libavcodec/mips/vc1dsp_mmi.c
@@ -2241,7 +2241,7 @@
 
 void ff_put_no_rnd_vc1_chroma_mc8_mmi(uint8_t *dst /* align 8 */,
                                       uint8_t *src /* align 1 */,
-                                      int stride, int h, int x, int y)
+                                      ptrdiff_t stride, int h, int x, int y)
 {
     const int A = (8 - x) * (8 - y);
     const int B =     (x) * (8 - y);
@@ -2296,7 +2296,7 @@
 
 void ff_put_no_rnd_vc1_chroma_mc4_mmi(uint8_t *dst /* align 8 */,
                                       uint8_t *src /* align 1 */,
-                                      int stride, int h, int x, int y)
+                                      ptrdiff_t stride, int h, int x, int y)
 {
     const int A = (8 - x) * (8 - y);
     const int B =     (x) * (8 - y);
@@ -2349,7 +2349,7 @@
 
 void ff_avg_no_rnd_vc1_chroma_mc8_mmi(uint8_t *dst /* align 8 */,
                                       uint8_t *src /* align 1 */,
-                                      int stride, int h, int x, int y)
+                                      ptrdiff_t stride, int h, int x, int y)
 {
     const int A = (8 - x) * (8 - y);
     const int B =     (x) * (8 - y);
@@ -2407,7 +2407,7 @@
 
 void ff_avg_no_rnd_vc1_chroma_mc4_mmi(uint8_t *dst /* align 8 */,
                                       uint8_t *src /* align 1 */,
-                                      int stride, int h, int x, int y)
+                                      ptrdiff_t stride, int h, int x, int y)
 {
     const int A = (8 - x) * (8 - y);
     const int B = (    x) * (8 - y);
diff --git a/libavcodec/mips/vc1dsp_msa.c b/libavcodec/mips/vc1dsp_msa.c
new file mode 100644
index 0000000..6e588e8
--- /dev/null
+++ b/libavcodec/mips/vc1dsp_msa.c
@@ -0,0 +1,461 @@
+/*
+ * Loongson SIMD optimized vc1dsp
+ *
+ * Copyright (c) 2019 Loongson Technology Corporation Limited
+ *                    gxw <guxiwei-hf@loongson.cn>
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "vc1dsp_mips.h"
+#include "constants.h"
+#include "libavutil/mips/generic_macros_msa.h"
+
+void ff_vc1_inv_trans_8x8_msa(int16_t block[64])
+{
+    v8i16 in0, in1, in2, in3, in4, in5, in6, in7;
+    v4i32 in_r0, in_r1, in_r2, in_r3, in_r4, in_r5, in_r6, in_r7;
+    v4i32 in_l0, in_l1, in_l2, in_l3, in_l4, in_l5, in_l6, in_l7;
+    v4i32 t_r1, t_r2, t_r3, t_r4, t_r5, t_r6, t_r7, t_r8;
+    v4i32 t_l1, t_l2, t_l3, t_l4, t_l5, t_l6, t_l7, t_l8;
+    v4i32 cnst_12 = {12, 12, 12, 12};
+    v4i32 cnst_4 = {4, 4, 4, 4};
+    v4i32 cnst_16 = {16, 16, 16, 16};
+    v4i32 cnst_6 = {6, 6, 6, 6};
+    v4i32 cnst_15 = {15, 15, 15, 15};
+    v4i32 cnst_9 = {9, 9, 9, 9};
+    v4i32 cnst_1 = {1, 1, 1, 1};
+    v4i32 cnst_64 = {64, 64, 64, 64};
+
+    LD_SH8(block, 8, in0, in1, in2, in3, in4, in5, in6, in7);
+    UNPCK_SH_SW(in0, in_r0, in_l0);
+    UNPCK_SH_SW(in1, in_r1, in_l1);
+    UNPCK_SH_SW(in2, in_r2, in_l2);
+    UNPCK_SH_SW(in3, in_r3, in_l3);
+    UNPCK_SH_SW(in4, in_r4, in_l4);
+    UNPCK_SH_SW(in5, in_r5, in_l5);
+    UNPCK_SH_SW(in6, in_r6, in_l6);
+    UNPCK_SH_SW(in7, in_r7, in_l7);
+    // First loop
+    t_r1 = cnst_12 * (in_r0 + in_r4) + cnst_4;
+    t_l1 = cnst_12 * (in_l0 + in_l4) + cnst_4;
+    t_r2 = cnst_12 * (in_r0 - in_r4) + cnst_4;
+    t_l2 = cnst_12 * (in_l0 - in_l4) + cnst_4;
+    t_r3 = cnst_16 * in_r2 + cnst_6 * in_r6;
+    t_l3 = cnst_16 * in_l2 + cnst_6 * in_l6;
+    t_r4 = cnst_6 * in_r2 - cnst_16 * in_r6;
+    t_l4 = cnst_6 * in_l2 - cnst_16 * in_l6;
+
+    ADD4(t_r1, t_r3, t_l1, t_l3, t_r2, t_r4, t_l2, t_l4, t_r5, t_l5, t_r6, t_l6);
+    SUB4(t_r2, t_r4, t_l2, t_l4, t_r1, t_r3, t_l1, t_l3, t_r7, t_l7, t_r8, t_l8);
+    t_r1 = cnst_16 * in_r1 + cnst_15 * in_r3 + cnst_9 * in_r5 + cnst_4 * in_r7;
+    t_l1 = cnst_16 * in_l1 + cnst_15 * in_l3 + cnst_9 * in_l5 + cnst_4 * in_l7;
+    t_r2 = cnst_15 * in_r1 - cnst_4 * in_r3 - cnst_16 * in_r5 - cnst_9 * in_r7;
+    t_l2 = cnst_15 * in_l1 - cnst_4 * in_l3 - cnst_16 * in_l5 - cnst_9 * in_l7;
+    t_r3 = cnst_9 * in_r1 - cnst_16 * in_r3 + cnst_4 * in_r5 + cnst_15 * in_r7;
+    t_l3 = cnst_9 * in_l1 - cnst_16 * in_l3 + cnst_4 * in_l5 + cnst_15 * in_l7;
+    t_r4 = cnst_4 * in_r1 - cnst_9 * in_r3 + cnst_15 * in_r5 - cnst_16 * in_r7;
+    t_l4 = cnst_4 * in_l1 - cnst_9 * in_l3 + cnst_15 * in_l5 - cnst_16 * in_l7;
+
+    in_r0 = (t_r5 + t_r1) >> 3;
+    in_l0 = (t_l5 + t_l1) >> 3;
+    in_r1 = (t_r6 + t_r2) >> 3;
+    in_l1 = (t_l6 + t_l2) >> 3;
+    in_r2 = (t_r7 + t_r3) >> 3;
+    in_l2 = (t_l7 + t_l3) >> 3;
+    in_r3 = (t_r8 + t_r4) >> 3;
+    in_l3 = (t_l8 + t_l4) >> 3;
+
+    in_r4 = (t_r8 - t_r4) >> 3;
+    in_l4 = (t_l8 - t_l4) >> 3;
+    in_r5 = (t_r7 - t_r3) >> 3;
+    in_l5 = (t_l7 - t_l3) >> 3;
+    in_r6 = (t_r6 - t_r2) >> 3;
+    in_l6 = (t_l6 - t_l2) >> 3;
+    in_r7 = (t_r5 - t_r1) >> 3;
+    in_l7 = (t_l5 - t_l1) >> 3;
+    TRANSPOSE4x4_SW_SW(in_r0, in_r1, in_r2, in_r3, in_r0, in_r1, in_r2, in_r3);
+    TRANSPOSE4x4_SW_SW(in_l0, in_l1, in_l2, in_l3, in_l0, in_l1, in_l2, in_l3);
+    TRANSPOSE4x4_SW_SW(in_r4, in_r5, in_r6, in_r7, in_r4, in_r5, in_r6, in_r7);
+    TRANSPOSE4x4_SW_SW(in_l4, in_l5, in_l6, in_l7, in_l4, in_l5, in_l6, in_l7);
+    // Second loop
+    t_r1 = cnst_12 * (in_r0 + in_l0) + cnst_64;
+    t_l1 = cnst_12 * (in_r4 + in_l4) + cnst_64;
+    t_r2 = cnst_12 * (in_r0 - in_l0) + cnst_64;
+    t_l2 = cnst_12 * (in_r4 - in_l4) + cnst_64;
+    t_r3 = cnst_16 * in_r2 + cnst_6 * in_l2;
+    t_l3 = cnst_16 * in_r6 + cnst_6 * in_l6;
+    t_r4 = cnst_6 * in_r2 - cnst_16 * in_l2;
+    t_l4 = cnst_6 * in_r6 - cnst_16 * in_l6;
+
+    ADD4(t_r1, t_r3, t_l1, t_l3, t_r2, t_r4, t_l2, t_l4, t_r5, t_l5, t_r6, t_l6);
+    SUB4(t_r2, t_r4, t_l2, t_l4, t_r1, t_r3, t_l1, t_l3, t_r7, t_l7, t_r8, t_l8);
+    t_r1 = cnst_16 * in_r1 + cnst_15 * in_r3 + cnst_9 * in_l1 + cnst_4 * in_l3;
+    t_l1 = cnst_16 * in_r5 + cnst_15 * in_r7 + cnst_9 * in_l5 + cnst_4 * in_l7;
+    t_r2 = cnst_15 * in_r1 - cnst_4 * in_r3 - cnst_16 * in_l1 - cnst_9 * in_l3;
+    t_l2 = cnst_15 * in_r5 - cnst_4 * in_r7 - cnst_16 * in_l5 - cnst_9 * in_l7;
+    t_r3 = cnst_9 * in_r1 - cnst_16 * in_r3 + cnst_4 * in_l1 + cnst_15 * in_l3;
+    t_l3 = cnst_9 * in_r5 - cnst_16 * in_r7 + cnst_4 * in_l5 + cnst_15 * in_l7;
+    t_r4 = cnst_4 * in_r1 - cnst_9 * in_r3 + cnst_15 * in_l1 - cnst_16 * in_l3;
+    t_l4 = cnst_4 * in_r5 - cnst_9 * in_r7 + cnst_15 * in_l5 - cnst_16 * in_l7;
+
+    in_r0 = (t_r5 + t_r1) >> 7;
+    in_l0 = (t_l5 + t_l1) >> 7;
+    in_r1 = (t_r6 + t_r2) >> 7;
+    in_l1 = (t_l6 + t_l2) >> 7;
+    in_r2 = (t_r7 + t_r3) >> 7;
+    in_l2 = (t_l7 + t_l3) >> 7;
+    in_r3 = (t_r8 + t_r4) >> 7;
+    in_l3 = (t_l8 + t_l4) >> 7;
+
+    in_r4 = (t_r8 - t_r4 + cnst_1) >> 7;
+    in_l4 = (t_l8 - t_l4 + cnst_1) >> 7;
+    in_r5 = (t_r7 - t_r3 + cnst_1) >> 7;
+    in_l5 = (t_l7 - t_l3 + cnst_1) >> 7;
+    in_r6 = (t_r6 - t_r2 + cnst_1) >> 7;
+    in_l6 = (t_l6 - t_l2 + cnst_1) >> 7;
+    in_r7 = (t_r5 - t_r1 + cnst_1) >> 7;
+    in_l7 = (t_l5 - t_l1 + cnst_1) >> 7;
+    PCKEV_H4_SH(in_l0, in_r0, in_l1, in_r1, in_l2, in_r2, in_l3, in_r3,
+                in0, in1, in2, in3);
+    PCKEV_H4_SH(in_l4, in_r4, in_l5, in_r5, in_l6, in_r6, in_l7, in_r7,
+                in4, in5, in6, in7);
+    ST_SH8(in0, in1, in2, in3, in4, in5, in6, in7, block, 8);
+}
+
+void ff_vc1_inv_trans_4x8_msa(uint8_t *dest, ptrdiff_t linesize, int16_t *block)
+{
+    v8i16 in0, in1, in2, in3, in4, in5, in6, in7;
+    v4i32 in_r0, in_r1, in_r2, in_r3, in_r4, in_r5, in_r6, in_r7;
+    v4i32 t1, t2, t3, t4, t5, t6, t7, t8;
+    v4i32 dst0, dst1, dst2, dst3, dst4, dst5, dst6, dst7;
+    v16i8 zero_m = { 0 };
+    v4i32 cnst_17 = {17, 17, 17, 17};
+    v4i32 cnst_22 = {22, 22, 22, 22};
+    v4i32 cnst_10 = {10, 10, 10, 10};
+    v4i32 cnst_12 = {12, 12, 12, 12};
+    v4i32 cnst_64 = {64, 64, 64, 64};
+    v4i32 cnst_16 = {16, 16, 16, 16};
+    v4i32 cnst_15 = {15, 15, 15, 15};
+    v4i32 cnst_4 = {4, 4, 4, 4};
+    v4i32 cnst_6 = {6, 6, 6, 6};
+    v4i32 cnst_9 = {9, 9, 9, 9};
+    v4i32 cnst_1 = {1, 1, 1, 1};
+
+    LD_SH8(block, 8, in0, in1, in2, in3, in4, in5, in6, in7);
+    UNPCK_R_SH_SW(in0, in_r0);
+    UNPCK_R_SH_SW(in1, in_r1);
+    UNPCK_R_SH_SW(in2, in_r2);
+    UNPCK_R_SH_SW(in3, in_r3);
+    UNPCK_R_SH_SW(in4, in_r4);
+    UNPCK_R_SH_SW(in5, in_r5);
+    UNPCK_R_SH_SW(in6, in_r6);
+    UNPCK_R_SH_SW(in7, in_r7);
+    // First loop
+    TRANSPOSE4x4_SW_SW(in_r0, in_r1, in_r2, in_r3, in_r0, in_r1, in_r2, in_r3);
+    TRANSPOSE4x4_SW_SW(in_r4, in_r5, in_r6, in_r7, in_r4, in_r5, in_r6, in_r7);
+    t1 = cnst_17 * (in_r0 + in_r2) + cnst_4;
+    t5 = cnst_17 * (in_r4 + in_r6) + cnst_4;
+    t2 = cnst_17 * (in_r0 - in_r2) + cnst_4;
+    t6 = cnst_17 * (in_r4 - in_r6) + cnst_4;
+    t3 = cnst_22 * in_r1 + cnst_10 * in_r3;
+    t7 = cnst_22 * in_r5 + cnst_10 * in_r7;
+    t4 = cnst_22 * in_r3 - cnst_10 * in_r1;
+    t8 = cnst_22 * in_r7 - cnst_10 * in_r5;
+
+    in_r0 = (t1 + t3) >> 3;
+    in_r4 = (t5 + t7) >> 3;
+    in_r1 = (t2 - t4) >> 3;
+    in_r5 = (t6 - t8) >> 3;
+    in_r2 = (t2 + t4) >> 3;
+    in_r6 = (t6 + t8) >> 3;
+    in_r3 = (t1 - t3) >> 3;
+    in_r7 = (t5 - t7) >> 3;
+    TRANSPOSE4x4_SW_SW(in_r0, in_r1, in_r2, in_r3, in_r0, in_r1, in_r2, in_r3);
+    TRANSPOSE4x4_SW_SW(in_r4, in_r5, in_r6, in_r7, in_r4, in_r5, in_r6, in_r7);
+    PCKEV_H4_SH(in_r1, in_r0, in_r3, in_r2, in_r5, in_r4, in_r7, in_r6,
+                in0, in1, in2, in3);
+    ST_D8(in0, in1, in2, in3, 0, 1, 0, 1, 0, 1, 0, 1, block, 8);
+    // Second loop
+    t1 = cnst_12 * (in_r0 + in_r4) + cnst_64;
+    t2 = cnst_12 * (in_r0 - in_r4) + cnst_64;
+    t3 = cnst_16 * in_r2 + cnst_6 * in_r6;
+    t4 = cnst_6 * in_r2 - cnst_16 * in_r6;
+    t5 = t1 + t3, t6 = t2 + t4;
+    t7 = t2 - t4, t8 = t1 - t3;
+    t1 = cnst_16 * in_r1 + cnst_15 * in_r3 + cnst_9 * in_r5 + cnst_4 * in_r7;
+    t2 = cnst_15 * in_r1 - cnst_4 * in_r3 - cnst_16 * in_r5 - cnst_9 * in_r7;
+    t3 = cnst_9 * in_r1 - cnst_16 * in_r3 + cnst_4 * in_r5 + cnst_15 * in_r7;
+    t4 = cnst_4 * in_r1 - cnst_9 * in_r3 + cnst_15 * in_r5 - cnst_16 * in_r7;
+    LD_SW8(dest, linesize, dst0, dst1, dst2, dst3, dst4, dst5, dst6, dst7);
+    ILVR_B8_SW(zero_m, dst0, zero_m, dst1, zero_m, dst2, zero_m, dst3,
+               zero_m, dst4, zero_m, dst5, zero_m, dst6, zero_m, dst7,
+               dst0, dst1, dst2, dst3, dst4, dst5, dst6, dst7);
+    ILVR_H4_SW(zero_m, dst0, zero_m, dst1, zero_m, dst2, zero_m, dst3,
+               dst0, dst1, dst2, dst3);
+    ILVR_H4_SW(zero_m, dst4, zero_m, dst5, zero_m, dst6, zero_m, dst7,
+               dst4, dst5, dst6, dst7);
+    in_r0 = (t5 + t1) >> 7;
+    in_r1 = (t6 + t2) >> 7;
+    in_r2 = (t7 + t3) >> 7;
+    in_r3 = (t8 + t4) >> 7;
+    in_r4 = (t8 - t4 + cnst_1) >> 7;
+    in_r5 = (t7 - t3 + cnst_1) >> 7;
+    in_r6 = (t6 - t2 + cnst_1) >> 7;
+    in_r7 = (t5 - t1 + cnst_1) >> 7;
+    ADD4(in_r0, dst0, in_r1, dst1, in_r2, dst2, in_r3, dst3,
+         in_r0, in_r1, in_r2, in_r3);
+    ADD4(in_r4, dst4, in_r5, dst5, in_r6, dst6, in_r7, dst7,
+         in_r4, in_r5, in_r6, in_r7);
+    CLIP_SW8_0_255(in_r0, in_r1, in_r2, in_r3, in_r4, in_r5, in_r6, in_r7);
+    PCKEV_H4_SH(in_r1, in_r0, in_r3, in_r2, in_r5, in_r4, in_r7, in_r6,
+                in0, in1, in2, in3);
+    PCKEV_B2_SH(in1, in0, in3, in2, in0, in1);
+    ST_W8(in0, in1, 0, 1, 2, 3, 0, 1, 2, 3, dest, linesize);
+}
+
+void ff_vc1_inv_trans_8x4_msa(uint8_t *dest, ptrdiff_t linesize, int16_t *block)
+{
+    v4i32 in0, in1, in2, in3, in4, in5, in6, in7;
+    v4i32 t1, t2, t3, t4, t5, t6, t7, t8;
+    v4i32 dst0, dst1, dst2, dst3, dst4, dst5, dst6, dst7;
+    v16i8 zero_m = { 0 };
+    v4i32 cnst_17 = {17, 17, 17, 17};
+    v4i32 cnst_22 = {22, 22, 22, 22};
+    v4i32 cnst_10 = {10, 10, 10, 10};
+    v4i32 cnst_12 = {12, 12, 12, 12};
+    v4i32 cnst_64 = {64, 64, 64, 64};
+    v4i32 cnst_16 = {16, 16, 16, 16};
+    v4i32 cnst_15 = {15, 15, 15, 15};
+    v4i32 cnst_4 = {4, 4, 4, 4};
+    v4i32 cnst_6 = {6, 6, 6, 6};
+    v4i32 cnst_9 = {9, 9, 9, 9};
+
+    LD_SW4(block, 8, t1, t2, t3, t4);
+    UNPCK_SH_SW(t1, in0, in4);
+    UNPCK_SH_SW(t2, in1, in5);
+    UNPCK_SH_SW(t3, in2, in6);
+    UNPCK_SH_SW(t4, in3, in7);
+    TRANSPOSE4x4_SW_SW(in0, in1, in2, in3, in0, in1, in2, in3);
+    TRANSPOSE4x4_SW_SW(in4, in5, in6, in7, in4, in5, in6, in7);
+    // First loop
+    t1 = cnst_12 * (in0 + in4) + cnst_4;
+    t2 = cnst_12 * (in0 - in4) + cnst_4;
+    t3 = cnst_16 * in2 + cnst_6 * in6;
+    t4 = cnst_6 * in2 - cnst_16 * in6;
+    t5 = t1 + t3, t6 = t2 + t4;
+    t7 = t2 - t4, t8 = t1 - t3;
+    t1 = cnst_16 * in1 + cnst_15 * in3 + cnst_9 * in5 + cnst_4 * in7;
+    t2 = cnst_15 * in1 - cnst_4 * in3 - cnst_16 * in5 - cnst_9 * in7;
+    t3 = cnst_9 * in1 - cnst_16 * in3 + cnst_4 * in5 + cnst_15 * in7;
+    t4 = cnst_4 * in1 - cnst_9 * in3 + cnst_15 * in5 - cnst_16 * in7;
+    in0 = (t5 + t1) >> 3;
+    in1 = (t6 + t2) >> 3;
+    in2 = (t7 + t3) >> 3;
+    in3 = (t8 + t4) >> 3;
+    in4 = (t8 - t4) >> 3;
+    in5 = (t7 - t3) >> 3;
+    in6 = (t6 - t2) >> 3;
+    in7 = (t5 - t1) >> 3;
+    TRANSPOSE4x4_SW_SW(in0, in1, in2, in3, in0, in1, in2, in3);
+    TRANSPOSE4x4_SW_SW(in4, in5, in6, in7, in4, in5, in6, in7);
+    PCKEV_H4_SW(in4, in0, in5, in1, in6, in2, in7, in3, t1, t2, t3, t4);
+    ST_SW4(t1, t2, t3, t4, block, 8);
+    // Second loop
+    LD_SW4(dest, linesize, dst0, dst1, dst2, dst3);
+    ILVR_B4_SW(zero_m, dst0, zero_m, dst1, zero_m, dst2, zero_m, dst3,
+               dst0, dst1, dst2, dst3);
+    ILVL_H4_SW(zero_m, dst0, zero_m, dst1, zero_m, dst2, zero_m, dst3,
+               dst4, dst5, dst6, dst7);
+    ILVR_H4_SW(zero_m, dst0, zero_m, dst1, zero_m, dst2, zero_m, dst3,
+               dst0, dst1, dst2, dst3);
+    // Right part
+    t1 = cnst_17 * (in0 + in2) + cnst_64;
+    t2 = cnst_17 * (in0 - in2) + cnst_64;
+    t3 = cnst_22 * in1 + cnst_10 * in3;
+    t4 = cnst_22 * in3 - cnst_10 * in1;
+    in0 = (t1 + t3) >> 7;
+    in1 = (t2 - t4) >> 7;
+    in2 = (t2 + t4) >> 7;
+    in3 = (t1 - t3) >> 7;
+    ADD4(in0, dst0, in1, dst1, in2, dst2, in3, dst3, in0, in1, in2, in3);
+    CLIP_SW4_0_255(in0, in1, in2, in3);
+    // Left part
+    t5 = cnst_17 * (in4 + in6) + cnst_64;
+    t6 = cnst_17 * (in4 - in6) + cnst_64;
+    t7 = cnst_22 * in5 + cnst_10 * in7;
+    t8 = cnst_22 * in7 - cnst_10 * in5;
+    in4 = (t5 + t7) >> 7;
+    in5 = (t6 - t8) >> 7;
+    in6 = (t6 + t8) >> 7;
+    in7 = (t5 - t7) >> 7;
+    ADD4(in4, dst4, in5, dst5, in6, dst6, in7, dst7, in4, in5, in6, in7);
+    CLIP_SW4_0_255(in4, in5, in6, in7);
+    PCKEV_H4_SW(in4, in0, in5, in1, in6, in2, in7, in3, in0, in1, in2, in3);
+    PCKEV_B2_SW(in1, in0, in3, in2, in0, in1);
+    ST_D4(in0, in1, 0, 1, 0, 1, dest, linesize);
+}
+
+static void put_vc1_mspel_mc_h_v_msa(uint8_t *dst, const uint8_t *src,
+                                     ptrdiff_t stride, int hmode, int vmode,
+                                     int rnd)
+{
+    v8i16 in_r0, in_r1, in_r2, in_r3, in_l0, in_l1, in_l2, in_l3;
+    v8i16 t0, t1, t2, t3, t4, t5, t6, t7;
+    v8i16 t8, t9, t10, t11, t12, t13, t14, t15;
+    v8i16 cnst_para0, cnst_para1, cnst_para2, cnst_para3, cnst_r;
+    static const int para_value[][4] = {{4, 53, 18, 3},
+                                        {1, 9, 9, 1},
+                                        {3, 18, 53, 4}};
+    static const int shift_value[] = {0, 5, 1, 5};
+    int shift = (shift_value[hmode] + shift_value[vmode]) >> 1;
+    int r = (1 << (shift - 1)) + rnd - 1;
+    cnst_r = __msa_fill_h(r);
+    src -= 1, src -= stride;
+    cnst_para0 = __msa_fill_h(para_value[vmode - 1][0]);
+    cnst_para1 = __msa_fill_h(para_value[vmode - 1][1]);
+    cnst_para2 = __msa_fill_h(para_value[vmode - 1][2]);
+    cnst_para3 = __msa_fill_h(para_value[vmode - 1][3]);
+    LD_SH4(src, stride, in_l0, in_l1, in_l2, in_l3);
+    UNPCK_UB_SH(in_l0, in_r0, in_l0);
+    UNPCK_UB_SH(in_l1, in_r1, in_l1);
+    UNPCK_UB_SH(in_l2, in_r2, in_l2);
+    UNPCK_UB_SH(in_l3, in_r3, in_l3);
+    // row 0
+    t0 = cnst_para1 * in_r1 + cnst_para2 * in_r2
+         - cnst_para0 * in_r0 - cnst_para3 * in_r3;
+    t8 = cnst_para1 * in_l1 + cnst_para2 * in_l2
+         - cnst_para0 * in_l0 - cnst_para3 * in_l3;
+    in_l0 = LD_SH(src + 4 * stride);
+    UNPCK_UB_SH(in_l0, in_r0, in_l0);
+    // row 1
+    t1 = cnst_para1 * in_r2 + cnst_para2 * in_r3
+         - cnst_para0 * in_r1 - cnst_para3 * in_r0;
+    t9 = cnst_para1 * in_l2 + cnst_para2 * in_l3
+         - cnst_para0 * in_l1 - cnst_para3 * in_l0;
+    in_l1 = LD_SH(src + 5 * stride);
+    UNPCK_UB_SH(in_l1, in_r1, in_l1);
+    // row 2
+    t2 = cnst_para1 * in_r3 + cnst_para2 * in_r0
+         - cnst_para0 * in_r2 - cnst_para3 * in_r1;
+    t10 = cnst_para1 * in_l3 + cnst_para2 * in_l0
+          - cnst_para0 * in_l2 - cnst_para3 * in_l1;
+    in_l2 = LD_SH(src + 6 * stride);
+    UNPCK_UB_SH(in_l2, in_r2, in_l2);
+    // row 3
+    t3 = cnst_para1 * in_r0 + cnst_para2 * in_r1
+         - cnst_para0 * in_r3 - cnst_para3 * in_r2;
+    t11 = cnst_para1 * in_l0 + cnst_para2 * in_l1
+          - cnst_para0 * in_l3 - cnst_para3 * in_l2;
+    in_l3 = LD_SH(src + 7 * stride);
+    UNPCK_UB_SH(in_l3, in_r3, in_l3);
+    // row 4
+    t4 = cnst_para1 * in_r1 + cnst_para2 * in_r2
+         - cnst_para0 * in_r0 - cnst_para3 * in_r3;
+    t12 = cnst_para1 * in_l1 + cnst_para2 * in_l2
+          - cnst_para0 * in_l0 - cnst_para3 * in_l3;
+    in_l0 = LD_SH(src + 8 * stride);
+    UNPCK_UB_SH(in_l0, in_r0, in_l0);
+    // row 5
+    t5 = cnst_para1 * in_r2 + cnst_para2 * in_r3
+         - cnst_para0 * in_r1 - cnst_para3 * in_r0;
+    t13 = cnst_para1 * in_l2 + cnst_para2 * in_l3
+          - cnst_para0 * in_l1 - cnst_para3 * in_l0;
+    in_l1 = LD_SH(src + 9 * stride);
+    UNPCK_UB_SH(in_l1, in_r1, in_l1);
+    // row 6
+    t6 = cnst_para1 * in_r3 + cnst_para2 * in_r0
+         - cnst_para0 * in_r2 - cnst_para3 * in_r1;
+    t14 = cnst_para1 * in_l3 + cnst_para2 * in_l0
+          - cnst_para0 * in_l2 - cnst_para3 * in_l1;
+    in_l2 = LD_SH(src + 10 * stride);
+    UNPCK_UB_SH(in_l2, in_r2, in_l2);
+    // row 7
+    t7 = cnst_para1 * in_r0 + cnst_para2 * in_r1
+         - cnst_para0 * in_r3 - cnst_para3 * in_r2;
+    t15 = cnst_para1 * in_l0 + cnst_para2 * in_l1
+          - cnst_para0 * in_l3 - cnst_para3 * in_l2;
+
+    ADD4(t0, cnst_r, t1, cnst_r, t2, cnst_r, t3, cnst_r, t0, t1, t2, t3);
+    ADD4(t4, cnst_r, t5, cnst_r, t6, cnst_r, t7, cnst_r, t4, t5, t6, t7);
+    ADD4(t8, cnst_r, t9, cnst_r, t10, cnst_r, t11, cnst_r,
+         t8, t9, t10, t11);
+    ADD4(t12, cnst_r, t13, cnst_r, t14, cnst_r, t15, cnst_r,
+         t12, t13, t14, t15);
+    t0 >>= shift, t1 >>= shift, t2 >>= shift, t3 >>= shift;
+    t4 >>= shift, t5 >>= shift, t6 >>= shift, t7 >>= shift;
+    t8 >>= shift, t9 >>= shift, t10 >>= shift, t11 >>= shift;
+    t12 >>= shift, t13 >>= shift, t14 >>= shift, t15 >>= shift;
+    TRANSPOSE8x8_SH_SH(t0, t1, t2, t3, t4, t5, t6, t7,
+                       t0, t1, t2, t3, t4, t5, t6, t7);
+    TRANSPOSE8x8_SH_SH(t8, t9, t10, t11, t12, t13, t14, t15,
+                       t8, t9, t10, t11, t12, t13, t14, t15);
+    cnst_para0 = __msa_fill_h(para_value[hmode - 1][0]);
+    cnst_para1 = __msa_fill_h(para_value[hmode - 1][1]);
+    cnst_para2 = __msa_fill_h(para_value[hmode - 1][2]);
+    cnst_para3 = __msa_fill_h(para_value[hmode - 1][3]);
+    r = 64 - rnd;
+    cnst_r = __msa_fill_h(r);
+    // col 0 ~ 7
+    t0 = cnst_para1 * t1 + cnst_para2 * t2 - cnst_para0 * t0 - cnst_para3 * t3;
+    t1 = cnst_para1 * t2 + cnst_para2 * t3 - cnst_para0 * t1 - cnst_para3 * t4;
+    t2 = cnst_para1 * t3 + cnst_para2 * t4 - cnst_para0 * t2 - cnst_para3 * t5;
+    t3 = cnst_para1 * t4 + cnst_para2 * t5 - cnst_para0 * t3 - cnst_para3 * t6;
+    t4 = cnst_para1 * t5 + cnst_para2 * t6 - cnst_para0 * t4 - cnst_para3 * t7;
+    t5 = cnst_para1 * t6 + cnst_para2 * t7 - cnst_para0 * t5 - cnst_para3 * t8;
+    t6 = cnst_para1 * t7 + cnst_para2 * t8 - cnst_para0 * t6 - cnst_para3 * t9;
+    t7 = cnst_para1 * t8 + cnst_para2 * t9 - cnst_para0 * t7 - cnst_para3 * t10;
+    ADD4(t0, cnst_r, t1, cnst_r, t2, cnst_r, t3, cnst_r, t0, t1, t2, t3);
+    ADD4(t4, cnst_r, t5, cnst_r, t6, cnst_r, t7, cnst_r, t4, t5, t6, t7);
+    t0 >>= 7, t1 >>= 7, t2 >>= 7, t3 >>= 7;
+    t4 >>= 7, t5 >>= 7, t6 >>= 7, t7 >>= 7;
+    TRANSPOSE8x8_SH_SH(t0, t1, t2, t3, t4, t5, t6, t7,
+                       t0, t1, t2, t3, t4, t5, t6, t7);
+    CLIP_SH8_0_255(t0, t1, t2, t3, t4, t5, t6, t7);
+    PCKEV_B4_SH(t1, t0, t3, t2, t5, t4, t7, t6, t0, t1, t2, t3);
+    ST_D8(t0, t1, t2, t3, 0, 1, 0, 1, 0, 1, 0, 1, dst, stride);
+}
+
+#define PUT_VC1_MSPEL_MC_MSA(hmode, vmode)                                    \
+void ff_put_vc1_mspel_mc ## hmode ## vmode ## _msa(uint8_t *dst,              \
+                                                const uint8_t *src,           \
+                                                ptrdiff_t stride, int rnd)    \
+{                                                                             \
+    put_vc1_mspel_mc_h_v_msa(dst, src, stride, hmode, vmode, rnd);            \
+}                                                                             \
+void ff_put_vc1_mspel_mc ## hmode ## vmode ## _16_msa(uint8_t *dst,           \
+                                                   const uint8_t *src,        \
+                                                   ptrdiff_t stride, int rnd) \
+{                                                                             \
+    put_vc1_mspel_mc_h_v_msa(dst, src, stride, hmode, vmode, rnd);            \
+    put_vc1_mspel_mc_h_v_msa(dst + 8, src + 8, stride, hmode, vmode, rnd);    \
+    dst += 8 * stride, src += 8 * stride;                                     \
+    put_vc1_mspel_mc_h_v_msa(dst, src, stride, hmode, vmode, rnd);            \
+    put_vc1_mspel_mc_h_v_msa(dst + 8, src + 8, stride, hmode, vmode, rnd);    \
+}
+
+PUT_VC1_MSPEL_MC_MSA(1, 1);
+PUT_VC1_MSPEL_MC_MSA(1, 2);
+PUT_VC1_MSPEL_MC_MSA(1, 3);
+
+PUT_VC1_MSPEL_MC_MSA(2, 1);
+PUT_VC1_MSPEL_MC_MSA(2, 2);
+PUT_VC1_MSPEL_MC_MSA(2, 3);
+
+PUT_VC1_MSPEL_MC_MSA(3, 1);
+PUT_VC1_MSPEL_MC_MSA(3, 2);
+PUT_VC1_MSPEL_MC_MSA(3, 3);
diff --git a/libavcodec/mips/vp3dsp_idct_mmi.c b/libavcodec/mips/vp3dsp_idct_mmi.c
new file mode 100644
index 0000000..c5c4cf3
--- /dev/null
+++ b/libavcodec/mips/vp3dsp_idct_mmi.c
@@ -0,0 +1,769 @@
+/*
+ * Copyright (c) 2018 gxw <guxiwei-hf@loongson.cn>
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "vp3dsp_mips.h"
+#include "libavutil/intreadwrite.h"
+#include "libavutil/mips/mmiutils.h"
+#include "libavutil/common.h"
+#include "libavcodec/rnd_avg.h"
+
+#define LOAD_CONST(dst, value)                        \
+    "li     %[tmp1],      "#value"              \n\t" \
+    "dmtc1  %[tmp1],      "#dst"                \n\t" \
+    "pshufh "#dst",       "#dst",     %[ftmp10] \n\t"
+
+static void idct_row_mmi(int16_t *input)
+{
+    double ftmp[23];
+    uint64_t tmp[2];
+    __asm__ volatile (
+        "xor        %[ftmp10],      %[ftmp10],        %[ftmp10] \n\t"
+        LOAD_CONST(%[csth_1], 1)
+        "li         %[tmp0],        0x02                        \n\t"
+        "1:                                                     \n\t"
+        /* Load input */
+        "ldc1       %[ftmp0],       0x00(%[input])              \n\t"
+        "ldc1       %[ftmp1],       0x10(%[input])              \n\t"
+        "ldc1       %[ftmp2],       0x20(%[input])              \n\t"
+        "ldc1       %[ftmp3],       0x30(%[input])              \n\t"
+        "ldc1       %[ftmp4],       0x40(%[input])              \n\t"
+        "ldc1       %[ftmp5],       0x50(%[input])              \n\t"
+        "ldc1       %[ftmp6],       0x60(%[input])              \n\t"
+        "ldc1       %[ftmp7],       0x70(%[input])              \n\t"
+        LOAD_CONST(%[ftmp8], 64277)
+        LOAD_CONST(%[ftmp9], 12785)
+        "pmulhh     %[A],           %[ftmp9],         %[ftmp7]  \n\t"
+        "pcmpgth    %[C],           %[ftmp10],        %[ftmp1]  \n\t"
+        "or         %[mask],        %[C],             %[csth_1] \n\t"
+        "pmullh     %[B],           %[ftmp1],         %[mask]   \n\t"
+        "pmulhuh    %[B],           %[ftmp8],         %[B]      \n\t"
+        "pmullh     %[B],           %[B],             %[mask]   \n\t"
+        "paddh      %[A],           %[A],             %[B]      \n\t"
+        "paddh      %[A],           %[A],             %[C]      \n\t"
+        "pcmpgth    %[D],           %[ftmp10],        %[ftmp7]  \n\t"
+        "or         %[mask],        %[D],             %[csth_1] \n\t"
+        "pmullh     %[ftmp7],       %[ftmp7],         %[mask]   \n\t"
+        "pmulhuh    %[B],           %[ftmp8],         %[ftmp7]  \n\t"
+        "pmullh     %[B],           %[B],             %[mask]   \n\t"
+        "pmulhh     %[C],           %[ftmp9],         %[ftmp1]  \n\t"
+        "psubh      %[B],           %[C],             %[B]      \n\t"
+        "psubh      %[B],           %[B],             %[D]      \n\t"
+
+        LOAD_CONST(%[ftmp8], 54491)
+        LOAD_CONST(%[ftmp9], 36410)
+        "pcmpgth    %[Ad],          %[ftmp10],        %[ftmp5]  \n\t"
+        "or         %[mask],        %[Ad],            %[csth_1] \n\t"
+        "pmullh     %[ftmp1],       %[ftmp5],         %[mask]   \n\t"
+        "pmulhuh    %[C],           %[ftmp9],         %[ftmp1]  \n\t"
+        "pmullh     %[C],           %[C],             %[mask]   \n\t"
+        "pcmpgth    %[Bd],          %[ftmp10],        %[ftmp3]  \n\t"
+        "or         %[mask],        %[Bd],            %[csth_1] \n\t"
+        "pmullh     %[D],           %[ftmp3],         %[mask]   \n\t"
+        "pmulhuh    %[D],           %[ftmp8],         %[D]      \n\t"
+        "pmullh     %[D],           %[D],             %[mask]   \n\t"
+        "paddh      %[C],           %[C],             %[D]      \n\t"
+        "paddh      %[C],           %[C],             %[Ad]     \n\t"
+        "paddh      %[C],           %[C],             %[Bd]     \n\t"
+        "pcmpgth    %[Bd],          %[ftmp10],        %[ftmp3]  \n\t"
+        "or         %[mask],        %[Bd],            %[csth_1] \n\t"
+        "pmullh     %[ftmp1],       %[ftmp3],         %[mask]   \n\t"
+        "pmulhuh    %[D],           %[ftmp9],         %[ftmp1]  \n\t"
+        "pmullh     %[D],           %[D],             %[mask]   \n\t"
+        "pcmpgth    %[Ed],          %[ftmp10],        %[ftmp5]  \n\t"
+        "or         %[mask],        %[Ed],            %[csth_1] \n\t"
+        "pmullh     %[Ad],          %[ftmp5],         %[mask]   \n\t"
+        "pmulhuh    %[Ad],          %[ftmp8],         %[Ad]     \n\t"
+        "pmullh     %[Ad],          %[Ad],            %[mask]   \n\t"
+        "psubh      %[D],           %[Ad],            %[D]      \n\t"
+        "paddh      %[D],           %[D],             %[Ed]     \n\t"
+        "psubh      %[D],           %[D],             %[Bd]     \n\t"
+
+        LOAD_CONST(%[ftmp8], 46341)
+        "psubh      %[Ad],          %[A],             %[C]      \n\t"
+        "pcmpgth    %[Bd],          %[ftmp10],        %[Ad]     \n\t"
+        "or         %[mask],        %[Bd],            %[csth_1] \n\t"
+        "pmullh     %[Ad],          %[Ad],            %[mask]   \n\t"
+        "pmulhuh    %[Ad],          %[ftmp8],         %[Ad]     \n\t"
+        "pmullh     %[Ad],          %[Ad],            %[mask]   \n\t"
+        "paddh      %[Ad],          %[Ad],            %[Bd]     \n\t"
+        "psubh      %[Bd],          %[B],             %[D]      \n\t"
+        "pcmpgth    %[Cd],          %[ftmp10],        %[Bd]     \n\t"
+        "or         %[mask],        %[Cd],            %[csth_1] \n\t"
+        "pmullh     %[Bd],          %[Bd],            %[mask]   \n\t"
+        "pmulhuh    %[Bd],          %[ftmp8],         %[Bd]     \n\t"
+        "pmullh     %[Bd],          %[Bd],            %[mask]   \n\t"
+        "paddh      %[Bd],          %[Bd],            %[Cd]     \n\t"
+        "paddh      %[Cd],          %[A],             %[C]      \n\t"
+        "paddh      %[Dd],          %[B],             %[D]      \n\t"
+        "paddh      %[A],           %[ftmp0],         %[ftmp4]  \n\t"
+        "pcmpgth    %[B],           %[ftmp10],        %[A]      \n\t"
+        "or         %[mask],        %[B],             %[csth_1] \n\t"
+        "pmullh     %[A],           %[A],             %[mask]   \n\t"
+        "pmulhuh    %[A],           %[ftmp8],         %[A]      \n\t"
+        "pmullh     %[A],           %[A],             %[mask]   \n\t"
+        "paddh      %[A],           %[A],             %[B]      \n\t"
+        "psubh      %[B],           %[ftmp0],         %[ftmp4]  \n\t"
+        "pcmpgth    %[C],           %[ftmp10],        %[B]      \n\t"
+        "or         %[mask],        %[C],             %[csth_1] \n\t"
+        "pmullh     %[B],           %[B],             %[mask]   \n\t"
+        "pmulhuh    %[B],           %[ftmp8],         %[B]      \n\t"
+        "pmullh     %[B],           %[B],             %[mask]   \n\t"
+        "paddh      %[B],           %[B],             %[C]      \n\t"
+
+        LOAD_CONST(%[ftmp8], 60547)
+        LOAD_CONST(%[ftmp9], 25080)
+        "pmulhh     %[C],           %[ftmp9],         %[ftmp6]  \n\t"
+        "pcmpgth    %[D],           %[ftmp10],        %[ftmp2]  \n\t"
+        "or         %[mask],        %[D],             %[csth_1] \n\t"
+        "pmullh     %[Ed],          %[ftmp2],         %[mask]   \n\t"
+        "pmulhuh    %[Ed],          %[ftmp8],         %[Ed]     \n\t"
+        "pmullh     %[Ed],          %[Ed],            %[mask]   \n\t"
+        "paddh      %[C],           %[C],             %[Ed]     \n\t"
+        "paddh      %[C],           %[C],             %[D]      \n\t"
+        "pcmpgth    %[Ed],          %[ftmp10],        %[ftmp6]  \n\t"
+        "or         %[mask],        %[Ed],            %[csth_1] \n\t"
+        "pmullh     %[ftmp6],       %[ftmp6],         %[mask]   \n\t"
+        "pmulhuh    %[D],           %[ftmp8],         %[ftmp6]  \n\t"
+        "pmullh     %[D],           %[D],             %[mask]   \n\t"
+        "pmulhh     %[Gd],          %[ftmp9],         %[ftmp2]  \n\t"
+        "psubh      %[D],           %[Gd],            %[D]      \n\t"
+        "psubh      %[D],           %[D],             %[Ed]     \n\t"
+        "psubh      %[Ed],          %[A],             %[C]      \n\t"
+        "paddh      %[Gd],          %[A],             %[C]      \n\t"
+        "paddh      %[A],           %[B],             %[Ad]     \n\t"
+        "psubh      %[C],           %[B],             %[Ad]     \n\t"
+        "psubh      %[B],           %[Bd],            %[D]      \n\t"
+        "paddh      %[D],           %[Bd],            %[D]      \n\t"
+        /* Final sequence of operations over-write original inputs */
+        "paddh      %[ftmp0],       %[Gd],            %[Cd]     \n\t"
+        "paddh      %[ftmp1],       %[A],             %[D]      \n\t"
+        "psubh      %[ftmp2],       %[A],             %[D]      \n\t"
+        "paddh      %[ftmp3],       %[Ed],            %[Dd]     \n\t"
+        "psubh      %[ftmp4],       %[Ed],            %[Dd]     \n\t"
+        "paddh      %[ftmp5],       %[C],             %[B]      \n\t"
+        "psubh      %[ftmp6],       %[C],             %[B]      \n\t"
+        "psubh      %[ftmp7],       %[Gd],            %[Cd]     \n\t"
+        "sdc1       %[ftmp0],       0x00(%[input])              \n\t"
+        "sdc1       %[ftmp1],       0x10(%[input])              \n\t"
+        "sdc1       %[ftmp2],       0x20(%[input])              \n\t"
+        "sdc1       %[ftmp3],       0x30(%[input])              \n\t"
+        "sdc1       %[ftmp4],       0x40(%[input])              \n\t"
+        "sdc1       %[ftmp5],       0x50(%[input])              \n\t"
+        "sdc1       %[ftmp6],       0x60(%[input])              \n\t"
+        "sdc1       %[ftmp7],       0x70(%[input])              \n\t"
+        PTR_ADDU   "%[tmp0],        %[tmp0],          -0x01     \n\t"
+        PTR_ADDIU  "%[input],       %[input],         0x08      \n\t"
+        "bnez       %[tmp0],        1b                          \n\t"
+        : [input]"+&r"(input), [tmp0]"=&r"(tmp[0]), [tmp1]"=&r"(tmp[1]),
+          [ftmp0]"=&f"(ftmp[0]), [ftmp1]"=&f"(ftmp[1]), [ftmp2]"=&f"(ftmp[2]),
+          [ftmp3]"=&f"(ftmp[3]), [ftmp4]"=&f"(ftmp[4]), [ftmp5]"=&f"(ftmp[5]),
+          [ftmp6]"=&f"(ftmp[6]), [ftmp7]"=&f"(ftmp[7]), [ftmp8]"=&f"(ftmp[8]),
+          [ftmp9]"=&f"(ftmp[9]), [ftmp10]"=&f"(ftmp[10]), [mask]"=&f"(ftmp[11]),
+          [A]"=&f"(ftmp[12]), [B]"=&f"(ftmp[13]), [C]"=&f"(ftmp[14]),
+          [D]"=&f"(ftmp[15]), [Ad]"=&f"(ftmp[16]), [Bd]"=&f"(ftmp[17]),
+          [Cd]"=&f"(ftmp[18]), [Dd]"=&f"(ftmp[19]), [Ed]"=&f"(ftmp[20]),
+          [Gd]"=&f"(ftmp[21]), [csth_1]"=&f"(ftmp[22])
+        :
+        : "memory"
+    );
+}
+
+static void idct_column_true_mmi(uint8_t *dst, int stride, int16_t *input)
+{
+    uint8_t temp_value[8];
+    double ftmp[23];
+    uint64_t tmp[2];
+    for (int i = 0; i < 8; ++i)
+        temp_value[i] = av_clip_uint8(128 + ((46341 * input[i << 3] + (8 << 16)) >> 20));
+    __asm__ volatile (
+        "xor        %[ftmp10],      %[ftmp10],          %[ftmp10] \n\t"
+        "li         %[tmp0],        0x02                          \n\t"
+        "1:                                                       \n\t"
+        "ldc1       %[ftmp0],       0x00(%[input])                \n\t"
+        "ldc1       %[ftmp4],       0x08(%[input])                \n\t"
+        "ldc1       %[ftmp1],       0x10(%[input])                \n\t"
+        "ldc1       %[ftmp5],       0x18(%[input])                \n\t"
+        "ldc1       %[ftmp2],       0x20(%[input])                \n\t"
+        "ldc1       %[ftmp6],       0x28(%[input])                \n\t"
+        "ldc1       %[ftmp3],       0x30(%[input])                \n\t"
+        "ldc1       %[ftmp7],       0x38(%[input])                \n\t"
+        TRANSPOSE_4H(%[ftmp0], %[ftmp1], %[ftmp2], %[ftmp3],
+                     %[A], %[B], %[C], %[D])
+        TRANSPOSE_4H(%[ftmp4], %[ftmp5], %[ftmp6], %[ftmp7],
+                     %[A], %[B], %[C], %[D])
+        LOAD_CONST(%[ftmp8], 64277)
+        LOAD_CONST(%[ftmp9], 12785)
+        LOAD_CONST(%[Gd], 1)
+        "pmulhh     %[A],           %[ftmp9],           %[ftmp7]  \n\t"
+        "pcmpgth    %[C],           %[ftmp10],          %[ftmp1]  \n\t"
+        "or         %[mask],        %[C],               %[Gd]     \n\t"
+        "pmullh     %[B],           %[ftmp1],           %[mask]   \n\t"
+        "pmulhuh    %[B],           %[ftmp8],           %[B]      \n\t"
+        "pmullh     %[B],           %[B],               %[mask]   \n\t"
+        "paddh      %[A],           %[A],               %[B]      \n\t"
+        "paddh      %[A],           %[A],               %[C]      \n\t"
+        "pcmpgth    %[D],           %[ftmp10],          %[ftmp7]  \n\t"
+        "or         %[mask],        %[D],               %[Gd]     \n\t"
+        "pmullh     %[Ad],          %[ftmp7],           %[mask]   \n\t"
+        "pmulhuh    %[B],           %[ftmp8],           %[Ad]     \n\t"
+        "pmullh     %[B],           %[B],               %[mask]   \n\t"
+        "pmulhh     %[C],           %[ftmp9],           %[ftmp1]  \n\t"
+        "psubh      %[B],           %[C],               %[B]      \n\t"
+        "psubh      %[B],           %[B],               %[D]      \n\t"
+
+        LOAD_CONST(%[ftmp8], 54491)
+        LOAD_CONST(%[ftmp9], 36410)
+        "pcmpgth    %[Ad],          %[ftmp10],          %[ftmp5]  \n\t"
+        "or         %[mask],        %[Ad],              %[Gd]     \n\t"
+        "pmullh     %[Cd],          %[ftmp5],           %[mask]   \n\t"
+        "pmulhuh    %[C],           %[ftmp9],           %[Cd]     \n\t"
+        "pmullh     %[C],           %[C],               %[mask]   \n\t"
+        "pcmpgth    %[Bd],          %[ftmp10],          %[ftmp3]  \n\t"
+        "or         %[mask],        %[Bd],              %[Gd]     \n\t"
+        "pmullh     %[D],           %[ftmp3],           %[mask]   \n\t"
+        "pmulhuh    %[D],           %[ftmp8],           %[D]      \n\t"
+        "pmullh     %[D],           %[D],               %[mask]   \n\t"
+        "paddh      %[C],           %[C],               %[D]      \n\t"
+        "paddh      %[C],           %[C],               %[Ad]     \n\t"
+        "paddh      %[C],           %[C],               %[Bd]     \n\t"
+        "pcmpgth    %[Bd],          %[ftmp10],          %[ftmp3]  \n\t"
+        "or         %[mask],        %[Bd],              %[Gd]     \n\t"
+        "pmullh     %[Cd],          %[ftmp3],           %[mask]   \n\t"
+        "pmulhuh    %[D],           %[ftmp9],           %[Cd]     \n\t"
+        "pmullh     %[D],           %[D],               %[mask]   \n\t"
+        "pcmpgth    %[Ed],          %[ftmp10],          %[ftmp5]  \n\t"
+        "or         %[mask],        %[Ed],              %[Gd]     \n\t"
+        "pmullh     %[Ad],          %[ftmp5],           %[mask]   \n\t"
+        "pmulhuh    %[Ad],          %[ftmp8],           %[Ad]     \n\t"
+        "pmullh     %[Ad],          %[Ad],              %[mask]   \n\t"
+        "psubh      %[D],           %[Ad],              %[D]      \n\t"
+        "paddh      %[D],           %[D],               %[Ed]     \n\t"
+        "psubh      %[D],           %[D],               %[Bd]     \n\t"
+
+        LOAD_CONST(%[ftmp8], 46341)
+        "psubh      %[Ad],          %[A],             %[C]        \n\t"
+        "pcmpgth    %[Bd],          %[ftmp10],        %[Ad]       \n\t"
+        "or         %[mask],        %[Bd],            %[Gd]       \n\t"
+        "pmullh     %[Ad],          %[Ad],            %[mask]     \n\t"
+        "pmulhuh    %[Ad],          %[ftmp8],         %[Ad]       \n\t"
+        "pmullh     %[Ad],          %[Ad],            %[mask]     \n\t"
+        "paddh      %[Ad],          %[Ad],            %[Bd]       \n\t"
+        "psubh      %[Bd],          %[B],             %[D]        \n\t"
+        "pcmpgth    %[Cd],          %[ftmp10],        %[Bd]       \n\t"
+        "or         %[mask],        %[Cd],            %[Gd]       \n\t"
+        "pmullh     %[Bd],          %[Bd],            %[mask]     \n\t"
+        "pmulhuh    %[Bd],          %[ftmp8],         %[Bd]       \n\t"
+        "pmullh     %[Bd],          %[Bd],            %[mask]     \n\t"
+        "paddh      %[Bd],          %[Bd],            %[Cd]       \n\t"
+        "paddh      %[Cd],          %[A],             %[C]        \n\t"
+        "paddh      %[Dd],          %[B],             %[D]        \n\t"
+
+        LOAD_CONST(%[Ed], 2056)
+        "paddh      %[A],           %[ftmp0],         %[ftmp4]    \n\t"
+        "pcmpgth    %[B],           %[ftmp10],        %[A]        \n\t"
+        "or         %[mask],        %[B],             %[Gd]       \n\t"
+        "pmullh     %[A],           %[A],             %[mask]     \n\t"
+        "pmulhuh    %[A],           %[ftmp8],         %[A]        \n\t"
+        "pmullh     %[A],           %[A],             %[mask]     \n\t"
+        "paddh      %[A],           %[A],             %[B]        \n\t"
+        "paddh      %[A],           %[A],             %[Ed]       \n\t"
+        "psubh      %[B],           %[ftmp0],         %[ftmp4]    \n\t"
+        "pcmpgth    %[C],           %[ftmp10],        %[B]        \n\t"
+        "or         %[mask],        %[C],             %[Gd]       \n\t"
+        "pmullh     %[B],           %[B],             %[mask]     \n\t"
+        "pmulhuh    %[B],           %[ftmp8],         %[B]        \n\t"
+        "pmullh     %[B],           %[B],             %[mask]     \n\t"
+        "paddh      %[B],           %[B],             %[C]        \n\t"
+        "paddh      %[B],           %[B],             %[Ed]       \n\t"
+
+        LOAD_CONST(%[ftmp8], 60547)
+        LOAD_CONST(%[ftmp9], 25080)
+        "pmulhh     %[C],           %[ftmp9],         %[ftmp6]    \n\t"
+        "pcmpgth    %[D],           %[ftmp10],        %[ftmp2]    \n\t"
+        "or         %[mask],        %[D],             %[Gd]       \n\t"
+        "pmullh     %[Ed],          %[ftmp2],         %[mask]     \n\t"
+        "pmulhuh    %[Ed],          %[ftmp8],         %[Ed]       \n\t"
+        "pmullh     %[Ed],          %[Ed],            %[mask]     \n\t"
+        "paddh      %[C],           %[C],             %[Ed]       \n\t"
+        "paddh      %[C],           %[C],             %[D]        \n\t"
+        "pcmpgth    %[Ed],          %[ftmp10],        %[ftmp6]    \n\t"
+        "or         %[mask],        %[Ed],            %[Gd]       \n\t"
+        "pmullh     %[D],           %[ftmp6],         %[mask]     \n\t"
+        "pmulhuh    %[D],           %[ftmp8],         %[D]        \n\t"
+        "pmullh     %[D],           %[D],             %[mask]     \n\t"
+        "pmulhh     %[Gd],          %[ftmp9],         %[ftmp2]    \n\t"
+        "psubh      %[D],           %[Gd],            %[D]        \n\t"
+        "psubh      %[D],           %[D],             %[Ed]       \n\t"
+        "psubh      %[Ed],          %[A],             %[C]        \n\t"
+        "paddh      %[Gd],          %[A],             %[C]        \n\t"
+        "paddh      %[A],           %[B],             %[Ad]       \n\t"
+        "psubh      %[C],           %[B],             %[Ad]       \n\t"
+        "psubh      %[B],           %[Bd],            %[D]        \n\t"
+        "paddh      %[D],           %[Bd],            %[D]        \n\t"
+        "or         %[mask],        %[ftmp1],         %[ftmp2]    \n\t"
+        "or         %[mask],        %[mask],          %[ftmp3]    \n\t"
+        "or         %[mask],        %[mask],          %[ftmp4]    \n\t"
+        "or         %[mask],        %[mask],          %[ftmp5]    \n\t"
+        "or         %[mask],        %[mask],          %[ftmp6]    \n\t"
+        "or         %[mask],        %[mask],          %[ftmp7]    \n\t"
+        "pcmpeqh    %[mask],        %[mask],          %[ftmp10]   \n\t"
+        "packushb   %[mask],        %[mask],          %[ftmp10]   \n\t"
+        "li         %[tmp1],        0x04                          \n\t"
+        "dmtc1      %[tmp1],        %[ftmp8]                      \n\t"
+        "paddh      %[ftmp0],       %[Gd],            %[Cd]       \n\t"
+        "psrah      %[ftmp0],       %[ftmp0],         %[ftmp8]    \n\t"
+        "paddh      %[ftmp1],       %[A],             %[D]        \n\t"
+        "psrah      %[ftmp1],       %[ftmp1],         %[ftmp8]    \n\t"
+        "psubh      %[ftmp2],       %[A],             %[D]        \n\t"
+        "psrah      %[ftmp2],       %[ftmp2],         %[ftmp8]    \n\t"
+        "paddh      %[ftmp3],       %[Ed],            %[Dd]       \n\t"
+        "psrah      %[ftmp3],       %[ftmp3],         %[ftmp8]    \n\t"
+        "psubh      %[ftmp4],       %[Ed],            %[Dd]       \n\t"
+        "psrah      %[ftmp4],       %[ftmp4],         %[ftmp8]    \n\t"
+        "paddh      %[ftmp5],       %[C],             %[B]        \n\t"
+        "psrah      %[ftmp5],       %[ftmp5],         %[ftmp8]    \n\t"
+        "psubh      %[ftmp6],       %[C],             %[B]        \n\t"
+        "psrah      %[ftmp6],       %[ftmp6],         %[ftmp8]    \n\t"
+        "psubh      %[ftmp7],       %[Gd],            %[Cd]       \n\t"
+        "psrah      %[ftmp7],       %[ftmp7],         %[ftmp8]    \n\t"
+        "pmaxsh     %[ftmp0],       %[ftmp0],         %[ftmp10]   \n\t"
+        "packushb   %[ftmp0],       %[ftmp0],         %[ftmp10]   \n\t"
+        "pmaxsh     %[ftmp1],       %[ftmp1],         %[ftmp10]   \n\t"
+        "packushb   %[ftmp1],       %[ftmp1],         %[ftmp10]   \n\t"
+        "pmaxsh     %[ftmp2],       %[ftmp2],         %[ftmp10]   \n\t"
+        "packushb   %[ftmp2],       %[ftmp2],         %[ftmp10]   \n\t"
+        "pmaxsh     %[ftmp3],       %[ftmp3],         %[ftmp10]   \n\t"
+        "packushb   %[ftmp3],       %[ftmp3],         %[ftmp10]   \n\t"
+        "pmaxsh     %[ftmp4],       %[ftmp4],         %[ftmp10]   \n\t"
+        "packushb   %[ftmp4],       %[ftmp4],         %[ftmp10]   \n\t"
+        "pmaxsh     %[ftmp5],       %[ftmp5],         %[ftmp10]   \n\t"
+        "packushb   %[ftmp5],       %[ftmp5],         %[ftmp10]   \n\t"
+        "pmaxsh     %[ftmp6],       %[ftmp6],         %[ftmp10]   \n\t"
+        "packushb   %[ftmp6],       %[ftmp6],         %[ftmp10]   \n\t"
+        "pmaxsh     %[ftmp7],       %[ftmp7],         %[ftmp10]   \n\t"
+        "packushb   %[ftmp7],       %[ftmp7],         %[ftmp10]   \n\t"
+
+        "lwc1       %[Ed],          0x00(%[temp_value])           \n\t"
+        "and        %[Ed],          %[Ed],            %[mask]     \n\t"
+        "paddb      %[ftmp0],       %[ftmp0],         %[Ed]       \n\t"
+        "paddb      %[ftmp1],       %[ftmp1],         %[Ed]       \n\t"
+        "paddb      %[ftmp2],       %[ftmp2],         %[Ed]       \n\t"
+        "paddb      %[ftmp3],       %[ftmp3],         %[Ed]       \n\t"
+        "paddb      %[ftmp4],       %[ftmp4],         %[Ed]       \n\t"
+        "paddb      %[ftmp5],       %[ftmp5],         %[Ed]       \n\t"
+        "paddb      %[ftmp6],       %[ftmp6],         %[Ed]       \n\t"
+        "paddb      %[ftmp7],       %[ftmp7],         %[Ed]       \n\t"
+        "swc1       %[ftmp0],       0x00(%[dst])                  \n\t"
+        PTR_ADDU   "%[tmp1],        %[dst],           %[stride]   \n\t"
+        "swc1       %[ftmp1],       0x00(%[tmp1])                 \n\t"
+        PTR_ADDU   "%[tmp1],        %[tmp1],          %[stride]   \n\t"
+        "swc1       %[ftmp2],       0x00(%[tmp1])                 \n\t"
+        PTR_ADDU   "%[tmp1],        %[tmp1],          %[stride]   \n\t"
+        "swc1       %[ftmp3],       0x00(%[tmp1])                 \n\t"
+        PTR_ADDU   "%[tmp1],        %[tmp1],          %[stride]   \n\t"
+        "swc1       %[ftmp4],       0x00(%[tmp1])                 \n\t"
+        PTR_ADDU   "%[tmp1],        %[tmp1],          %[stride]   \n\t"
+        "swc1       %[ftmp5],       0x00(%[tmp1])                 \n\t"
+        PTR_ADDU   "%[tmp1],        %[tmp1],          %[stride]   \n\t"
+        "swc1       %[ftmp6],       0x00(%[tmp1])                 \n\t"
+        PTR_ADDU   "%[tmp1],        %[tmp1],          %[stride]   \n\t"
+        "swc1       %[ftmp7],       0x00(%[tmp1])                 \n\t"
+        PTR_ADDIU  "%[dst],         %[dst],           0x04        \n\t"
+        PTR_ADDIU  "%[input],       %[input],         0x40        \n\t"
+        PTR_ADDIU  "%[temp_value],  %[temp_value],    0x04        \n\t"
+        PTR_ADDIU  "%[tmp0],        %[tmp0],          -0x01       \n\t"
+        "bnez       %[tmp0],        1b                            \n\t"
+        : [dst]"+&r"(dst), [tmp0]"=&r"(tmp[0]), [tmp1]"=&r"(tmp[1]),
+          [ftmp0]"=&f"(ftmp[0]), [ftmp1]"=&f"(ftmp[1]), [ftmp2]"=&f"(ftmp[2]),
+          [ftmp3]"=&f"(ftmp[3]), [ftmp4]"=&f"(ftmp[4]), [ftmp5]"=&f"(ftmp[5]),
+          [ftmp6]"=&f"(ftmp[6]), [ftmp7]"=&f"(ftmp[7]), [ftmp8]"=&f"(ftmp[8]),
+          [ftmp9]"=&f"(ftmp[9]), [ftmp10]"=&f"(ftmp[10]), [mask]"=&f"(ftmp[11]),
+          [A]"=&f"(ftmp[12]), [B]"=&f"(ftmp[13]), [C]"=&f"(ftmp[14]),
+          [D]"=&f"(ftmp[15]), [Ad]"=&f"(ftmp[16]), [Bd]"=&f"(ftmp[17]),
+          [Cd]"=&f"(ftmp[18]), [Dd]"=&f"(ftmp[19]), [Ed]"=&f"(ftmp[20]),
+          [Gd]"=&f"(ftmp[21]), [input]"+&r"(input)
+        : [stride]"r"(stride), [temp_value]"r"(temp_value)
+        : "memory"
+    );
+}
+
+static void idct_column_false_mmi(uint8_t *dst, int stride, int16_t *input)
+{
+    int16_t temp_value[8];
+    double ftmp[23];
+    uint64_t tmp[2];
+    for (int i = 0; i < 8; ++i)
+        temp_value[i] = (46341 * input[i << 3] + (8 << 16)) >> 20;
+    __asm__ volatile (
+        "xor        %[ftmp10],      %[ftmp10],          %[ftmp10] \n\t"
+        "li         %[tmp0],        0x02                          \n\t"
+        "1:                                                       \n\t"
+        "ldc1       %[ftmp0],       0x00(%[input])                \n\t"
+        "ldc1       %[ftmp4],       0x08(%[input])                \n\t"
+        "ldc1       %[ftmp1],       0x10(%[input])                \n\t"
+        "ldc1       %[ftmp5],       0x18(%[input])                \n\t"
+        "ldc1       %[ftmp2],       0x20(%[input])                \n\t"
+        "ldc1       %[ftmp6],       0x28(%[input])                \n\t"
+        "ldc1       %[ftmp3],       0x30(%[input])                \n\t"
+        "ldc1       %[ftmp7],       0x38(%[input])                \n\t"
+        TRANSPOSE_4H(%[ftmp0], %[ftmp1], %[ftmp2], %[ftmp3],
+                     %[A], %[B], %[C], %[D])
+        TRANSPOSE_4H(%[ftmp4], %[ftmp5], %[ftmp6], %[ftmp7],
+                     %[A], %[B], %[C], %[D])
+        LOAD_CONST(%[ftmp8], 64277)
+        LOAD_CONST(%[ftmp9], 12785)
+        LOAD_CONST(%[Gd], 1)
+        "pmulhh     %[A],           %[ftmp9],           %[ftmp7]  \n\t"
+        "pcmpgth    %[C],           %[ftmp10],          %[ftmp1]  \n\t"
+        "or         %[mask],        %[C],               %[Gd]     \n\t"
+        "pmullh     %[B],           %[ftmp1],           %[mask]   \n\t"
+        "pmulhuh    %[B],           %[ftmp8],           %[B]      \n\t"
+        "pmullh     %[B],           %[B],               %[mask]   \n\t"
+        "paddh      %[A],           %[A],               %[B]      \n\t"
+        "paddh      %[A],           %[A],               %[C]      \n\t"
+        "pcmpgth    %[D],           %[ftmp10],          %[ftmp7]  \n\t"
+        "or         %[mask],        %[D],               %[Gd]     \n\t"
+        "pmullh     %[Ad],          %[ftmp7],           %[mask]   \n\t"
+        "pmulhuh    %[B],           %[ftmp8],           %[Ad]     \n\t"
+        "pmullh     %[B],           %[B],               %[mask]   \n\t"
+        "pmulhh     %[C],           %[ftmp9],           %[ftmp1]  \n\t"
+        "psubh      %[B],           %[C],               %[B]      \n\t"
+        "psubh      %[B],           %[B],               %[D]      \n\t"
+
+        LOAD_CONST(%[ftmp8], 54491)
+        LOAD_CONST(%[ftmp9], 36410)
+        "pcmpgth    %[Ad],          %[ftmp10],          %[ftmp5]  \n\t"
+        "or         %[mask],        %[Ad],              %[Gd]     \n\t"
+        "pmullh     %[Cd],          %[ftmp5],           %[mask]   \n\t"
+        "pmulhuh    %[C],           %[ftmp9],           %[Cd]     \n\t"
+        "pmullh     %[C],           %[C],               %[mask]   \n\t"
+        "pcmpgth    %[Bd],          %[ftmp10],          %[ftmp3]  \n\t"
+        "or         %[mask],        %[Bd],              %[Gd]     \n\t"
+        "pmullh     %[D],           %[ftmp3],           %[mask]   \n\t"
+        "pmulhuh    %[D],           %[ftmp8],           %[D]      \n\t"
+        "pmullh     %[D],           %[D],               %[mask]   \n\t"
+        "paddh      %[C],           %[C],               %[D]      \n\t"
+        "paddh      %[C],           %[C],               %[Ad]     \n\t"
+        "paddh      %[C],           %[C],               %[Bd]     \n\t"
+        "pcmpgth    %[Bd],          %[ftmp10],          %[ftmp3]  \n\t"
+        "or         %[mask],        %[Bd],              %[Gd]     \n\t"
+        "pmullh     %[Cd],          %[ftmp3],           %[mask]   \n\t"
+        "pmulhuh    %[D],           %[ftmp9],           %[Cd]     \n\t"
+        "pmullh     %[D],           %[D],               %[mask]   \n\t"
+        "pcmpgth    %[Ed],          %[ftmp10],          %[ftmp5]  \n\t"
+        "or         %[mask],        %[Ed],              %[Gd]     \n\t"
+        "pmullh     %[Ad],          %[ftmp5],           %[mask]   \n\t"
+        "pmulhuh    %[Ad],          %[ftmp8],           %[Ad]     \n\t"
+        "pmullh     %[Ad],          %[Ad],              %[mask]   \n\t"
+        "psubh      %[D],           %[Ad],              %[D]      \n\t"
+        "paddh      %[D],           %[D],               %[Ed]     \n\t"
+        "psubh      %[D],           %[D],               %[Bd]     \n\t"
+
+        LOAD_CONST(%[ftmp8], 46341)
+        "psubh      %[Ad],          %[A],             %[C]        \n\t"
+        "pcmpgth    %[Bd],          %[ftmp10],        %[Ad]       \n\t"
+        "or         %[mask],        %[Bd],            %[Gd]       \n\t"
+        "pmullh     %[Ad],          %[Ad],            %[mask]     \n\t"
+        "pmulhuh    %[Ad],          %[ftmp8],         %[Ad]       \n\t"
+        "pmullh     %[Ad],          %[Ad],            %[mask]     \n\t"
+        "paddh      %[Ad],          %[Ad],            %[Bd]       \n\t"
+        "psubh      %[Bd],          %[B],             %[D]        \n\t"
+        "pcmpgth    %[Cd],          %[ftmp10],        %[Bd]       \n\t"
+        "or         %[mask],        %[Cd],            %[Gd]       \n\t"
+        "pmullh     %[Bd],          %[Bd],            %[mask]     \n\t"
+        "pmulhuh    %[Bd],          %[ftmp8],         %[Bd]       \n\t"
+        "pmullh     %[Bd],          %[Bd],            %[mask]     \n\t"
+        "paddh      %[Bd],          %[Bd],            %[Cd]       \n\t"
+        "paddh      %[Cd],          %[A],             %[C]        \n\t"
+        "paddh      %[Dd],          %[B],             %[D]        \n\t"
+
+        LOAD_CONST(%[Ed], 8)
+        "paddh      %[A],           %[ftmp0],         %[ftmp4]    \n\t"
+        "pcmpgth    %[B],           %[ftmp10],        %[A]        \n\t"
+        "or         %[mask],        %[B],             %[Gd]       \n\t"
+        "pmullh     %[A],           %[A],             %[mask]     \n\t"
+        "pmulhuh    %[A],           %[ftmp8],         %[A]        \n\t"
+        "pmullh     %[A],           %[A],             %[mask]     \n\t"
+        "paddh      %[A],           %[A],             %[B]        \n\t"
+        "paddh      %[A],           %[A],             %[Ed]       \n\t"
+        "psubh      %[B],           %[ftmp0],         %[ftmp4]    \n\t"
+        "pcmpgth    %[C],           %[ftmp10],        %[B]        \n\t"
+        "or         %[mask],        %[C],             %[Gd]       \n\t"
+        "pmullh     %[B],           %[B],             %[mask]     \n\t"
+        "pmulhuh    %[B],           %[ftmp8],         %[B]        \n\t"
+        "pmullh     %[B],           %[B],             %[mask]     \n\t"
+        "paddh      %[B],           %[B],             %[C]        \n\t"
+        "paddh      %[B],           %[B],             %[Ed]       \n\t"
+
+        LOAD_CONST(%[ftmp8], 60547)
+        LOAD_CONST(%[ftmp9], 25080)
+        "pmulhh     %[C],           %[ftmp9],         %[ftmp6]    \n\t"
+        "pcmpgth    %[D],           %[ftmp10],        %[ftmp2]    \n\t"
+        "or         %[mask],        %[D],             %[Gd]       \n\t"
+        "pmullh     %[Ed],          %[ftmp2],         %[mask]     \n\t"
+        "pmulhuh    %[Ed],          %[ftmp8],         %[Ed]       \n\t"
+        "pmullh     %[Ed],          %[Ed],            %[mask]     \n\t"
+        "paddh      %[C],           %[C],             %[Ed]       \n\t"
+        "paddh      %[C],           %[C],             %[D]        \n\t"
+        "pcmpgth    %[Ed],          %[ftmp10],        %[ftmp6]    \n\t"
+        "or         %[mask],        %[Ed],            %[Gd]       \n\t"
+        "pmullh     %[D],           %[ftmp6],         %[mask]     \n\t"
+        "pmulhuh    %[D],           %[ftmp8],         %[D]        \n\t"
+        "pmullh     %[D],           %[D],             %[mask]     \n\t"
+        "pmulhh     %[Gd],          %[ftmp9],         %[ftmp2]    \n\t"
+        "psubh      %[D],           %[Gd],            %[D]        \n\t"
+        "psubh      %[D],           %[D],             %[Ed]       \n\t"
+        "psubh      %[Ed],          %[A],             %[C]        \n\t"
+        "paddh      %[Gd],          %[A],             %[C]        \n\t"
+        "paddh      %[A],           %[B],             %[Ad]       \n\t"
+        "psubh      %[C],           %[B],             %[Ad]       \n\t"
+        "psubh      %[B],           %[Bd],            %[D]        \n\t"
+        "paddh      %[D],           %[Bd],            %[D]        \n\t"
+        "or         %[mask],        %[ftmp1],         %[ftmp2]    \n\t"
+        "or         %[mask],        %[mask],          %[ftmp3]    \n\t"
+        "or         %[mask],        %[mask],          %[ftmp4]    \n\t"
+        "or         %[mask],        %[mask],          %[ftmp5]    \n\t"
+        "or         %[mask],        %[mask],          %[ftmp6]    \n\t"
+        "or         %[mask],        %[mask],          %[ftmp7]    \n\t"
+        "pcmpeqh    %[mask],        %[mask],          %[ftmp10]   \n\t"
+        "li         %[tmp1],        0x04                          \n\t"
+        "dmtc1      %[tmp1],        %[ftmp8]                      \n\t"
+        "paddh      %[ftmp0],       %[Gd],            %[Cd]       \n\t"
+        "psrah      %[ftmp0],       %[ftmp0],         %[ftmp8]    \n\t"
+        "paddh      %[ftmp1],       %[A],             %[D]        \n\t"
+        "psrah      %[ftmp1],       %[ftmp1],         %[ftmp8]    \n\t"
+        "psubh      %[ftmp2],       %[A],             %[D]        \n\t"
+        "psrah      %[ftmp2],       %[ftmp2],         %[ftmp8]    \n\t"
+        "paddh      %[ftmp3],       %[Ed],            %[Dd]       \n\t"
+        "psrah      %[ftmp3],       %[ftmp3],         %[ftmp8]    \n\t"
+        "psubh      %[ftmp4],       %[Ed],            %[Dd]       \n\t"
+        "psrah      %[ftmp4],       %[ftmp4],         %[ftmp8]    \n\t"
+        "paddh      %[ftmp5],       %[C],             %[B]        \n\t"
+        "psrah      %[ftmp5],       %[ftmp5],         %[ftmp8]    \n\t"
+        "psubh      %[ftmp6],       %[C],             %[B]        \n\t"
+        "psrah      %[ftmp6],       %[ftmp6],         %[ftmp8]    \n\t"
+        "psubh      %[ftmp7],       %[Gd],            %[Cd]       \n\t"
+        "psrah      %[ftmp7],       %[ftmp7],         %[ftmp8]    \n\t"
+
+        /* Load from dst */
+        "lwc1       %[A],           0x00(%[dst])                  \n\t"
+        PTR_ADDU   "%[tmp1],        %[dst],           %[stride]   \n\t"
+        "lwc1       %[B],           0x00(%[tmp1])                 \n\t"
+        PTR_ADDU   "%[tmp1],        %[tmp1],          %[stride]   \n\t"
+        "lwc1       %[C],           0x00(%[tmp1])                 \n\t"
+        PTR_ADDU   "%[tmp1],        %[tmp1],          %[stride]   \n\t"
+        "lwc1       %[D],           0x00(%[tmp1])                 \n\t"
+        PTR_ADDU   "%[tmp1],        %[tmp1],          %[stride]   \n\t"
+        "lwc1       %[Ad],          0x00(%[tmp1])                 \n\t"
+        PTR_ADDU   "%[tmp1],        %[tmp1],          %[stride]   \n\t"
+        "lwc1       %[Bd],          0x00(%[tmp1])                 \n\t"
+        PTR_ADDU   "%[tmp1],        %[tmp1],          %[stride]   \n\t"
+        "lwc1       %[Cd],          0x00(%[tmp1])                 \n\t"
+        PTR_ADDU   "%[tmp1],        %[tmp1],          %[stride]   \n\t"
+        "lwc1       %[Dd],          0x00(%[tmp1])                 \n\t"
+        "punpcklbh  %[A],           %[A],             %[ftmp10]   \n\t"
+        "punpcklbh  %[B],           %[B],             %[ftmp10]   \n\t"
+        "punpcklbh  %[C],           %[C],             %[ftmp10]   \n\t"
+        "punpcklbh  %[D],           %[D],             %[ftmp10]   \n\t"
+        "punpcklbh  %[Ad],          %[Ad],            %[ftmp10]   \n\t"
+        "punpcklbh  %[Bd],          %[Bd],            %[ftmp10]   \n\t"
+        "punpcklbh  %[Cd],          %[Cd],            %[ftmp10]   \n\t"
+        "punpcklbh  %[Dd],          %[Dd],            %[ftmp10]   \n\t"
+        "ldc1       %[Ed],          0x00(%[temp_value])           \n\t"
+        "and        %[Ed],          %[Ed],            %[mask]     \n\t"
+        "nor        %[mask],        %[mask],          %[mask]     \n\t"
+        "and        %[ftmp0],       %[ftmp0],         %[mask]     \n\t"
+        "and        %[ftmp1],       %[ftmp1],         %[mask]     \n\t"
+        "and        %[ftmp2],       %[ftmp2],         %[mask]     \n\t"
+        "and        %[ftmp3],       %[ftmp3],         %[mask]     \n\t"
+        "and        %[ftmp4],       %[ftmp4],         %[mask]     \n\t"
+        "and        %[ftmp5],       %[ftmp5],         %[mask]     \n\t"
+        "and        %[ftmp6],       %[ftmp6],         %[mask]     \n\t"
+        "and        %[ftmp7],       %[ftmp7],         %[mask]     \n\t"
+        "paddh      %[ftmp0],       %[ftmp0],         %[A]        \n\t"
+        "paddh      %[ftmp1],       %[ftmp1],         %[B]        \n\t"
+        "paddh      %[ftmp2],       %[ftmp2],         %[C]        \n\t"
+        "paddh      %[ftmp3],       %[ftmp3],         %[D]        \n\t"
+        "paddh      %[ftmp4],       %[ftmp4],         %[Ad]       \n\t"
+        "paddh      %[ftmp5],       %[ftmp5],         %[Bd]       \n\t"
+        "paddh      %[ftmp6],       %[ftmp6],         %[Cd]       \n\t"
+        "paddh      %[ftmp7],       %[ftmp7],         %[Dd]       \n\t"
+        "paddh      %[ftmp0],       %[ftmp0],         %[Ed]       \n\t"
+        "paddh      %[ftmp1],       %[ftmp1],         %[Ed]       \n\t"
+        "paddh      %[ftmp2],       %[ftmp2],         %[Ed]       \n\t"
+        "paddh      %[ftmp3],       %[ftmp3],         %[Ed]       \n\t"
+        "paddh      %[ftmp4],       %[ftmp4],         %[Ed]       \n\t"
+        "paddh      %[ftmp5],       %[ftmp5],         %[Ed]       \n\t"
+        "paddh      %[ftmp6],       %[ftmp6],         %[Ed]       \n\t"
+        "paddh      %[ftmp7],       %[ftmp7],         %[Ed]       \n\t"
+        "pmaxsh     %[ftmp0],       %[ftmp0],         %[ftmp10]   \n\t"
+        "packushb   %[ftmp0],       %[ftmp0],         %[ftmp10]   \n\t"
+        "pmaxsh     %[ftmp1],       %[ftmp1],         %[ftmp10]   \n\t"
+        "packushb   %[ftmp1],       %[ftmp1],         %[ftmp10]   \n\t"
+        "pmaxsh     %[ftmp2],       %[ftmp2],         %[ftmp10]   \n\t"
+        "packushb   %[ftmp2],       %[ftmp2],         %[ftmp10]   \n\t"
+        "pmaxsh     %[ftmp3],       %[ftmp3],         %[ftmp10]   \n\t"
+        "packushb   %[ftmp3],       %[ftmp3],         %[ftmp10]   \n\t"
+        "pmaxsh     %[ftmp4],       %[ftmp4],         %[ftmp10]   \n\t"
+        "packushb   %[ftmp4],       %[ftmp4],         %[ftmp10]   \n\t"
+        "pmaxsh     %[ftmp5],       %[ftmp5],         %[ftmp10]   \n\t"
+        "packushb   %[ftmp5],       %[ftmp5],         %[ftmp10]   \n\t"
+        "pmaxsh     %[ftmp6],       %[ftmp6],         %[ftmp10]   \n\t"
+        "packushb   %[ftmp6],       %[ftmp6],         %[ftmp10]   \n\t"
+        "pmaxsh     %[ftmp7],       %[ftmp7],         %[ftmp10]   \n\t"
+        "packushb   %[ftmp7],       %[ftmp7],         %[ftmp10]   \n\t"
+        "swc1       %[ftmp0],       0x00(%[dst])                  \n\t"
+        PTR_ADDU   "%[tmp1],        %[dst],           %[stride]   \n\t"
+        "swc1       %[ftmp1],       0x00(%[tmp1])                 \n\t"
+        PTR_ADDU   "%[tmp1],        %[tmp1],          %[stride]   \n\t"
+        "swc1       %[ftmp2],       0x00(%[tmp1])                 \n\t"
+        PTR_ADDU   "%[tmp1],        %[tmp1],          %[stride]   \n\t"
+        "swc1       %[ftmp3],       0x00(%[tmp1])                 \n\t"
+        PTR_ADDU   "%[tmp1],        %[tmp1],          %[stride]   \n\t"
+        "swc1       %[ftmp4],       0x00(%[tmp1])                 \n\t"
+        PTR_ADDU   "%[tmp1],        %[tmp1],          %[stride]   \n\t"
+        "swc1       %[ftmp5],       0x00(%[tmp1])                 \n\t"
+        PTR_ADDU   "%[tmp1],        %[tmp1],          %[stride]   \n\t"
+        "swc1       %[ftmp6],       0x00(%[tmp1])                 \n\t"
+        PTR_ADDU   "%[tmp1],        %[tmp1],          %[stride]   \n\t"
+        "swc1       %[ftmp7],       0x00(%[tmp1])                 \n\t"
+        PTR_ADDIU  "%[dst],         %[dst],           0x04        \n\t"
+        PTR_ADDIU  "%[input],       %[input],         0x40        \n\t"
+        PTR_ADDIU  "%[temp_value],  %[temp_value],    0x08        \n\t"
+        PTR_ADDIU  "%[tmp0],        %[tmp0],          -0x01       \n\t"
+        "bnez       %[tmp0],        1b                            \n\t"
+        : [dst]"+&r"(dst), [tmp0]"=&r"(tmp[0]), [tmp1]"=&r"(tmp[1]),
+          [ftmp0]"=&f"(ftmp[0]), [ftmp1]"=&f"(ftmp[1]), [ftmp2]"=&f"(ftmp[2]),
+          [ftmp3]"=&f"(ftmp[3]), [ftmp4]"=&f"(ftmp[4]), [ftmp5]"=&f"(ftmp[5]),
+          [ftmp6]"=&f"(ftmp[6]), [ftmp7]"=&f"(ftmp[7]), [ftmp8]"=&f"(ftmp[8]),
+          [ftmp9]"=&f"(ftmp[9]), [ftmp10]"=&f"(ftmp[10]), [mask]"=&f"(ftmp[11]),
+          [A]"=&f"(ftmp[12]), [B]"=&f"(ftmp[13]), [C]"=&f"(ftmp[14]),
+          [D]"=&f"(ftmp[15]), [Ad]"=&f"(ftmp[16]), [Bd]"=&f"(ftmp[17]),
+          [Cd]"=&f"(ftmp[18]), [Dd]"=&f"(ftmp[19]), [Ed]"=&f"(ftmp[20]),
+          [Gd]"=&f"(ftmp[21]), [input]"+&r"(input)
+        : [stride]"r"(stride), [temp_value]"r"(temp_value)
+        : "memory"
+    );
+}
+static void idct_mmi(uint8_t *dst, int stride, int16_t *input, int type)
+{
+    idct_row_mmi(input);
+    if (type == 1)
+        idct_column_true_mmi(dst, stride, input);
+    else
+        idct_column_false_mmi(dst, stride, input);
+}
+
+void ff_vp3_idct_put_mmi(uint8_t *dest, ptrdiff_t line_size, int16_t *block)
+{
+    idct_mmi(dest, line_size, block, 1);
+    memset(block, 0, sizeof(*block) << 6);
+}
+
+void ff_vp3_idct_add_mmi(uint8_t *dest, ptrdiff_t line_size, int16_t *block)
+{
+    idct_mmi(dest, line_size, block, 2);
+    memset(block, 0, sizeof(*block) << 6);
+}
+void ff_vp3_idct_dc_add_mmi(uint8_t *dest, ptrdiff_t line_size, int16_t *block)
+{
+    int dc = (block[0] + 15) >> 5;
+
+    double ftmp[7];
+    uint64_t tmp;
+    __asm__ volatile (
+        "xor        %[ftmp0],     %[ftmp0],           %[ftmp0]      \n\t"
+        "mtc1       %[dc],        %[ftmp5]                          \n\t"
+        "pshufh     %[ftmp5],     %[ftmp5],           %[ftmp0]      \n\t"
+        "li         %[tmp0],      0x08                              \n\t"
+        "1:                                                         \n\t"
+        "ldc1       %[ftmp1],     0x00(%[dest])                     \n\t"
+        "punpcklbh  %[ftmp2],     %[ftmp1],           %[ftmp0]      \n\t"
+        "punpckhbh  %[ftmp3],     %[ftmp1],           %[ftmp0]      \n\t"
+        "paddh      %[ftmp4],     %[ftmp2],           %[ftmp5]      \n\t"
+        "paddh      %[ftmp6],     %[ftmp3],           %[ftmp5]      \n\t"
+        "packushb   %[ftmp4],     %[ftmp4],           %[ftmp0]      \n\t"
+        "packushb   %[ftmp6],     %[ftmp6],           %[ftmp0]      \n\t"
+        "swc1       %[ftmp4],     0x00(%[dest])                     \n\t"
+        "swc1       %[ftmp6],     0x04(%[dest])                     \n\t"
+        PTR_ADDU   "%[dest],      %[dest],            %[line_size]  \n\t"
+        PTR_ADDIU  "%[tmp0],      %[tmp0],            -0x01         \n\t"
+        "bnez       %[tmp0],      1b                                \n\t"
+        : [dest]"+&r"(dest), [block]"+&r"(block), [tmp0]"=&r"(tmp),
+          [ftmp0]"=&f"(ftmp[0]), [ftmp1]"=&f"(ftmp[1]), [ftmp2]"=&f"(ftmp[2]),
+          [ftmp3]"=&f"(ftmp[3]), [ftmp4]"=&f"(ftmp[4]), [ftmp5]"=&f"(ftmp[5]),
+          [ftmp6]"=&f"(ftmp[6])
+        : [line_size]"r"(line_size), [dc]"r"(dc)
+        : "memory"
+    );
+    block[0] = 0;
+}
+
+void ff_put_no_rnd_pixels_l2_mmi(uint8_t *dst, const uint8_t *src1,
+                                 const uint8_t *src2, ptrdiff_t stride, int h)
+{
+    if (h == 8) {
+        double ftmp[6];
+        uint64_t tmp[2];
+        __asm__ volatile (
+            "li          %[tmp0],        0x08                            \n\t"
+            "li          %[tmp1],        0xfefefefe                      \n\t"
+            "dmtc1       %[tmp1],        %[ftmp4]                        \n\t"
+            "punpcklwd   %[ftmp4],       %[ftmp4],             %[ftmp4]  \n\t"
+            "li          %[tmp1],        0x01                            \n\t"
+            "dmtc1       %[tmp1],        %[ftmp5]                        \n\t"
+            "1:                                                          \n\t"
+            "gsldlc1     %[ftmp1],       0x07(%[src1])                   \n\t"
+            "gsldrc1     %[ftmp1],       0x00(%[src1])                   \n\t"
+            "gsldlc1     %[ftmp2],       0x07(%[src2])                   \n\t"
+            "gsldrc1     %[ftmp2],       0x00(%[src2])                   \n\t"
+            "xor         %[ftmp3],       %[ftmp1],             %[ftmp2]  \n\t"
+            "and         %[ftmp3],       %[ftmp3],             %[ftmp4]  \n\t"
+            "psrlw       %[ftmp3],       %[ftmp3],             %[ftmp5]  \n\t"
+            "and         %[ftmp6],       %[ftmp1],             %[ftmp2]  \n\t"
+            "paddw       %[ftmp3],       %[ftmp3],             %[ftmp6]  \n\t"
+            "sdc1        %[ftmp3],       0x00(%[dst])                    \n\t"
+            PTR_ADDU    "%[src1],        %[src1],              %[stride] \n\t"
+            PTR_ADDU    "%[src2],        %[src2],              %[stride] \n\t"
+            PTR_ADDU    "%[dst],         %[dst],               %[stride] \n\t"
+            PTR_ADDIU   "%[tmp0],        %[tmp0],              -0x01     \n\t"
+            "bnez        %[tmp0],        1b                              \n\t"
+            : [dst]"+&r"(dst), [src1]"+&r"(src1), [src2]"+&r"(src2),
+              [ftmp1]"=&f"(ftmp[0]), [ftmp2]"=&f"(ftmp[1]), [ftmp3]"=&f"(ftmp[2]),
+              [ftmp4]"=&f"(ftmp[3]), [ftmp5]"=&f"(ftmp[4]), [ftmp6]"=&f"(ftmp[5]),
+              [tmp0]"=&r"(tmp[0]), [tmp1]"=&r"(tmp[1])
+            : [stride]"r"(stride)
+            : "memory"
+        );
+    } else {
+        int i;
+
+        for (i = 0; i < h; i++) {
+            uint32_t a, b;
+
+            a = AV_RN32(&src1[i * stride]);
+            b = AV_RN32(&src2[i * stride]);
+            AV_WN32A(&dst[i * stride], no_rnd_avg32(a, b));
+            a = AV_RN32(&src1[i * stride + 4]);
+            b = AV_RN32(&src2[i * stride + 4]);
+            AV_WN32A(&dst[i * stride + 4], no_rnd_avg32(a, b));
+        }
+    }
+}
diff --git a/libavcodec/mips/vp3dsp_idct_msa.c b/libavcodec/mips/vp3dsp_idct_msa.c
new file mode 100644
index 0000000..90c578f
--- /dev/null
+++ b/libavcodec/mips/vp3dsp_idct_msa.c
@@ -0,0 +1,598 @@
+/*
+ * Copyright (c) 2018 gxw <guxiwei-hf@loongson.cn>
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "vp3dsp_mips.h"
+#include "libavutil/mips/generic_macros_msa.h"
+#include "libavutil/intreadwrite.h"
+#include "libavcodec/rnd_avg.h"
+
+static void idct_msa(uint8_t *dst, int stride, int16_t *input, int type)
+{
+    v8i16 r0, r1, r2, r3, r4, r5, r6, r7, sign;
+    v4i32 r0_r, r0_l, r1_r, r1_l, r2_r, r2_l, r3_r, r3_l,
+          r4_r, r4_l, r5_r, r5_l, r6_r, r6_l, r7_r, r7_l;
+    v4i32 A, B, C, D, Ad, Bd, Cd, Dd, E, F, G, H;
+    v4i32 Ed, Gd, Add, Bdd, Fd, Hd;
+    v16u8 sign_l;
+    v16i8 d0, d1, d2, d3, d4, d5, d6, d7;
+    v4i32 c0, c1, c2, c3, c4, c5, c6, c7;
+    v4i32 f0, f1, f2, f3, f4, f5, f6, f7;
+    v4i32 sign_t;
+    v16i8 zero = {0};
+    v16i8 mask = {0, 4, 8, 12, 16, 20, 24, 28, 0, 0, 0, 0, 0, 0, 0, 0};
+    v4i32 cnst64277w = {64277, 64277, 64277, 64277};
+    v4i32 cnst60547w = {60547, 60547, 60547, 60547};
+    v4i32 cnst54491w = {54491, 54491, 54491, 54491};
+    v4i32 cnst46341w = {46341, 46341, 46341, 46341};
+    v4i32 cnst36410w = {36410, 36410, 36410, 36410};
+    v4i32 cnst25080w = {25080, 25080, 25080, 25080};
+    v4i32 cnst12785w = {12785, 12785, 12785, 12785};
+    v4i32 cnst8w = {8, 8, 8, 8};
+    v4i32 cnst2048w = {2048, 2048, 2048, 2048};
+    v4i32 cnst128w = {128, 128, 128, 128};
+
+    /* Extended input data */
+    LD_SH8(input, 8, r0, r1, r2, r3, r4, r5, r6, r7);
+    sign = __msa_clti_s_h(r0, 0);
+    r0_r = (v4i32) __msa_ilvr_h(sign, r0);
+    r0_l = (v4i32) __msa_ilvl_h(sign, r0);
+    sign = __msa_clti_s_h(r1, 0);
+    r1_r = (v4i32) __msa_ilvr_h(sign, r1);
+    r1_l = (v4i32) __msa_ilvl_h(sign, r1);
+    sign = __msa_clti_s_h(r2, 0);
+    r2_r = (v4i32) __msa_ilvr_h(sign, r2);
+    r2_l = (v4i32) __msa_ilvl_h(sign, r2);
+    sign = __msa_clti_s_h(r3, 0);
+    r3_r = (v4i32) __msa_ilvr_h(sign, r3);
+    r3_l = (v4i32) __msa_ilvl_h(sign, r3);
+    sign = __msa_clti_s_h(r4, 0);
+    r4_r = (v4i32) __msa_ilvr_h(sign, r4);
+    r4_l = (v4i32) __msa_ilvl_h(sign, r4);
+    sign = __msa_clti_s_h(r5, 0);
+    r5_r = (v4i32) __msa_ilvr_h(sign, r5);
+    r5_l = (v4i32) __msa_ilvl_h(sign, r5);
+    sign = __msa_clti_s_h(r6, 0);
+    r6_r = (v4i32) __msa_ilvr_h(sign, r6);
+    r6_l = (v4i32) __msa_ilvl_h(sign, r6);
+    sign = __msa_clti_s_h(r7, 0);
+    r7_r = (v4i32) __msa_ilvr_h(sign, r7);
+    r7_l = (v4i32) __msa_ilvl_h(sign, r7);
+
+    /* Right part */
+    A = ((r1_r * cnst64277w) >> 16) + ((r7_r * cnst12785w) >> 16);
+    B = ((r1_r * cnst12785w) >> 16) - ((r7_r * cnst64277w) >> 16);
+    C = ((r3_r * cnst54491w) >> 16) + ((r5_r * cnst36410w) >> 16);
+    D = ((r5_r * cnst54491w) >> 16) - ((r3_r * cnst36410w) >> 16);
+    Ad = ((A - C) * cnst46341w) >> 16;
+    Bd = ((B - D) * cnst46341w) >> 16;
+    Cd = A + C;
+    Dd = B + D;
+    E = ((r0_r + r4_r) * cnst46341w) >> 16;
+    F = ((r0_r - r4_r) * cnst46341w) >> 16;
+    G = ((r2_r * cnst60547w) >> 16) + ((r6_r * cnst25080w) >> 16);
+    H = ((r2_r * cnst25080w) >> 16) - ((r6_r * cnst60547w) >> 16);
+    Ed = E - G;
+    Gd = E + G;
+    Add = F + Ad;
+    Bdd = Bd - H;
+    Fd = F - Ad;
+    Hd = Bd + H;
+    r0_r = Gd + Cd;
+    r7_r = Gd - Cd;
+    r1_r = Add + Hd;
+    r2_r = Add - Hd;
+    r3_r = Ed + Dd;
+    r4_r = Ed - Dd;
+    r5_r = Fd + Bdd;
+    r6_r = Fd - Bdd;
+
+    /* Left part */
+    A = ((r1_l * cnst64277w) >> 16) + ((r7_l * cnst12785w) >> 16);
+    B = ((r1_l * cnst12785w) >> 16) - ((r7_l * cnst64277w) >> 16);
+    C = ((r3_l * cnst54491w) >> 16) + ((r5_l * cnst36410w) >> 16);
+    D = ((r5_l * cnst54491w) >> 16) - ((r3_l * cnst36410w) >> 16);
+    Ad = ((A - C) * cnst46341w) >> 16;
+    Bd = ((B - D) * cnst46341w) >> 16;
+    Cd = A + C;
+    Dd = B + D;
+    E = ((r0_l + r4_l) * cnst46341w) >> 16;
+    F = ((r0_l - r4_l) * cnst46341w) >> 16;
+    G = ((r2_l * cnst60547w) >> 16) + ((r6_l * cnst25080w) >> 16);
+    H = ((r2_l * cnst25080w) >> 16) - ((r6_l * cnst60547w) >> 16);
+    Ed = E - G;
+    Gd = E + G;
+    Add = F + Ad;
+    Bdd = Bd - H;
+    Fd = F - Ad;
+    Hd = Bd + H;
+    r0_l = Gd + Cd;
+    r7_l = Gd - Cd;
+    r1_l = Add + Hd;
+    r2_l = Add - Hd;
+    r3_l = Ed + Dd;
+    r4_l = Ed - Dd;
+    r5_l = Fd + Bdd;
+    r6_l = Fd - Bdd;
+
+    /* Row 0 to 3 */
+    TRANSPOSE4x4_SW_SW(r0_r, r1_r, r2_r, r3_r,
+                       r0_r, r1_r, r2_r, r3_r);
+    TRANSPOSE4x4_SW_SW(r0_l, r1_l, r2_l, r3_l,
+                       r0_l, r1_l, r2_l, r3_l);
+    A = ((r1_r * cnst64277w) >> 16) + ((r3_l * cnst12785w) >> 16);
+    B = ((r1_r * cnst12785w) >> 16) - ((r3_l * cnst64277w) >> 16);
+    C = ((r3_r * cnst54491w) >> 16) + ((r1_l * cnst36410w) >> 16);
+    D = ((r1_l * cnst54491w) >> 16) - ((r3_r * cnst36410w) >> 16);
+    Ad = ((A - C) * cnst46341w) >> 16;
+    Bd = ((B - D) * cnst46341w) >> 16;
+    Cd = A + C;
+    Dd = B + D;
+    E = ((r0_r + r0_l) * cnst46341w) >> 16;
+    E += cnst8w;
+    F = ((r0_r - r0_l) * cnst46341w) >> 16;
+    F += cnst8w;
+    if (type == 1) { // HACK
+        E += cnst2048w;
+        F += cnst2048w;
+    }
+    G = ((r2_r * cnst60547w) >> 16) + ((r2_l * cnst25080w) >> 16);
+    H = ((r2_r * cnst25080w) >> 16) - ((r2_l * cnst60547w) >> 16);
+    Ed = E - G;
+    Gd = E + G;
+    Add = F + Ad;
+    Bdd = Bd - H;
+    Fd = F - Ad;
+    Hd = Bd + H;
+    A = (Gd + Cd) >> 4;
+    B = (Gd - Cd) >> 4;
+    C = (Add + Hd) >> 4;
+    D = (Add - Hd) >> 4;
+    E = (Ed + Dd) >> 4;
+    F = (Ed - Dd) >> 4;
+    G = (Fd + Bdd) >> 4;
+    H = (Fd - Bdd) >> 4;
+    if (type != 1) {
+        LD_SB8(dst, stride, d0, d1, d2, d3, d4, d5, d6, d7);
+        ILVR_B4_SW(zero, d0, zero, d1, zero, d2, zero, d3,
+                   f0, f1, f2, f3);
+        ILVR_B4_SW(zero, d4, zero, d5, zero, d6, zero, d7,
+                   f4, f5, f6, f7);
+        ILVR_H4_SW(zero, f0, zero, f1, zero, f2, zero, f3,
+                   c0, c1, c2, c3);
+        ILVR_H4_SW(zero, f4, zero, f5, zero, f6, zero, f7,
+                   c4, c5, c6, c7);
+        A += c0;
+        B += c7;
+        C += c1;
+        D += c2;
+        E += c3;
+        F += c4;
+        G += c5;
+        H += c6;
+    }
+    CLIP_SW8_0_255(A, B, C, D, E, F, G, H);
+    sign_l = __msa_or_v((v16u8)r1_r, (v16u8)r2_r);
+    sign_l = __msa_or_v(sign_l, (v16u8)r3_r);
+    sign_l = __msa_or_v(sign_l, (v16u8)r0_l);
+    sign_l = __msa_or_v(sign_l, (v16u8)r1_l);
+    sign_l = __msa_or_v(sign_l, (v16u8)r2_l);
+    sign_l = __msa_or_v(sign_l, (v16u8)r3_l);
+    sign_t = __msa_ceqi_w((v4i32)sign_l, 0);
+    Add = ((r0_r * cnst46341w) + (8 << 16)) >> 20;
+    if (type == 1) {
+        Bdd = Add + cnst128w;
+        CLIP_SW_0_255(Bdd);
+        Ad = Bdd;
+        Bd = Bdd;
+        Cd = Bdd;
+        Dd = Bdd;
+        Ed = Bdd;
+        Fd = Bdd;
+        Gd = Bdd;
+        Hd = Bdd;
+    } else {
+        Ad = Add + c0;
+        Bd = Add + c1;
+        Cd = Add + c2;
+        Dd = Add + c3;
+        Ed = Add + c4;
+        Fd = Add + c5;
+        Gd = Add + c6;
+        Hd = Add + c7;
+        CLIP_SW8_0_255(Ad, Bd, Cd, Dd, Ed, Fd, Gd, Hd);
+    }
+    Ad = (v4i32)__msa_and_v((v16u8)Ad, (v16u8)sign_t);
+    Bd = (v4i32)__msa_and_v((v16u8)Bd, (v16u8)sign_t);
+    Cd = (v4i32)__msa_and_v((v16u8)Cd, (v16u8)sign_t);
+    Dd = (v4i32)__msa_and_v((v16u8)Dd, (v16u8)sign_t);
+    Ed = (v4i32)__msa_and_v((v16u8)Ed, (v16u8)sign_t);
+    Fd = (v4i32)__msa_and_v((v16u8)Fd, (v16u8)sign_t);
+    Gd = (v4i32)__msa_and_v((v16u8)Gd, (v16u8)sign_t);
+    Hd = (v4i32)__msa_and_v((v16u8)Hd, (v16u8)sign_t);
+    sign_t = __msa_ceqi_w(sign_t, 0);
+    A = (v4i32)__msa_and_v((v16u8)A, (v16u8)sign_t);
+    B = (v4i32)__msa_and_v((v16u8)B, (v16u8)sign_t);
+    C = (v4i32)__msa_and_v((v16u8)C, (v16u8)sign_t);
+    D = (v4i32)__msa_and_v((v16u8)D, (v16u8)sign_t);
+    E = (v4i32)__msa_and_v((v16u8)E, (v16u8)sign_t);
+    F = (v4i32)__msa_and_v((v16u8)F, (v16u8)sign_t);
+    G = (v4i32)__msa_and_v((v16u8)G, (v16u8)sign_t);
+    H = (v4i32)__msa_and_v((v16u8)H, (v16u8)sign_t);
+    r0_r = Ad + A;
+    r1_r = Bd + C;
+    r2_r = Cd + D;
+    r3_r = Dd + E;
+    r0_l = Ed + F;
+    r1_l = Fd + G;
+    r2_l = Gd + H;
+    r3_l = Hd + B;
+
+    /* Row 4 to 7 */
+    TRANSPOSE4x4_SW_SW(r4_r, r5_r, r6_r, r7_r,
+                       r4_r, r5_r, r6_r, r7_r);
+    TRANSPOSE4x4_SW_SW(r4_l, r5_l, r6_l, r7_l,
+                       r4_l, r5_l, r6_l, r7_l);
+    A = ((r5_r * cnst64277w) >> 16) + ((r7_l * cnst12785w) >> 16);
+    B = ((r5_r * cnst12785w) >> 16) - ((r7_l * cnst64277w) >> 16);
+    C = ((r7_r * cnst54491w) >> 16) + ((r5_l * cnst36410w) >> 16);
+    D = ((r5_l * cnst54491w) >> 16) - ((r7_r * cnst36410w) >> 16);
+    Ad = ((A - C) * cnst46341w) >> 16;
+    Bd = ((B - D) * cnst46341w) >> 16;
+    Cd = A + C;
+    Dd = B + D;
+    E = ((r4_r + r4_l) * cnst46341w) >> 16;
+    E += cnst8w;
+    F = ((r4_r - r4_l) * cnst46341w) >> 16;
+    F += cnst8w;
+    if (type == 1) { // HACK
+        E += cnst2048w;
+        F += cnst2048w;
+    }
+    G = ((r6_r * cnst60547w) >> 16) + ((r6_l * cnst25080w) >> 16);
+    H = ((r6_r * cnst25080w) >> 16) - ((r6_l * cnst60547w) >> 16);
+    Ed = E - G;
+    Gd = E + G;
+    Add = F + Ad;
+    Bdd = Bd - H;
+    Fd = F - Ad;
+    Hd = Bd + H;
+    A = (Gd + Cd) >> 4;
+    B = (Gd - Cd) >> 4;
+    C = (Add + Hd) >> 4;
+    D = (Add - Hd) >> 4;
+    E = (Ed + Dd) >> 4;
+    F = (Ed - Dd) >> 4;
+    G = (Fd + Bdd) >> 4;
+    H = (Fd - Bdd) >> 4;
+    if (type != 1) {
+        ILVL_H4_SW(zero, f0, zero, f1, zero, f2, zero, f3,
+                   c0, c1, c2, c3);
+        ILVL_H4_SW(zero, f4, zero, f5, zero, f6, zero, f7,
+                   c4, c5, c6, c7);
+        A += c0;
+        B += c7;
+        C += c1;
+        D += c2;
+        E += c3;
+        F += c4;
+        G += c5;
+        H += c6;
+    }
+    CLIP_SW8_0_255(A, B, C, D, E, F, G, H);
+    sign_l = __msa_or_v((v16u8)r5_r, (v16u8)r6_r);
+    sign_l = __msa_or_v(sign_l, (v16u8)r7_r);
+    sign_l = __msa_or_v(sign_l, (v16u8)r4_l);
+    sign_l = __msa_or_v(sign_l, (v16u8)r5_l);
+    sign_l = __msa_or_v(sign_l, (v16u8)r6_l);
+    sign_l = __msa_or_v(sign_l, (v16u8)r7_l);
+    sign_t = __msa_ceqi_w((v4i32)sign_l, 0);
+    Add = ((r4_r * cnst46341w) + (8 << 16)) >> 20;
+    if (type == 1) {
+        Bdd = Add + cnst128w;
+        CLIP_SW_0_255(Bdd);
+        Ad = Bdd;
+        Bd = Bdd;
+        Cd = Bdd;
+        Dd = Bdd;
+        Ed = Bdd;
+        Fd = Bdd;
+        Gd = Bdd;
+        Hd = Bdd;
+    } else {
+        Ad = Add + c0;
+        Bd = Add + c1;
+        Cd = Add + c2;
+        Dd = Add + c3;
+        Ed = Add + c4;
+        Fd = Add + c5;
+        Gd = Add + c6;
+        Hd = Add + c7;
+        CLIP_SW8_0_255(Ad, Bd, Cd, Dd, Ed, Fd, Gd, Hd);
+    }
+    Ad = (v4i32)__msa_and_v((v16u8)Ad, (v16u8)sign_t);
+    Bd = (v4i32)__msa_and_v((v16u8)Bd, (v16u8)sign_t);
+    Cd = (v4i32)__msa_and_v((v16u8)Cd, (v16u8)sign_t);
+    Dd = (v4i32)__msa_and_v((v16u8)Dd, (v16u8)sign_t);
+    Ed = (v4i32)__msa_and_v((v16u8)Ed, (v16u8)sign_t);
+    Fd = (v4i32)__msa_and_v((v16u8)Fd, (v16u8)sign_t);
+    Gd = (v4i32)__msa_and_v((v16u8)Gd, (v16u8)sign_t);
+    Hd = (v4i32)__msa_and_v((v16u8)Hd, (v16u8)sign_t);
+    sign_t = __msa_ceqi_w(sign_t, 0);
+    A = (v4i32)__msa_and_v((v16u8)A, (v16u8)sign_t);
+    B = (v4i32)__msa_and_v((v16u8)B, (v16u8)sign_t);
+    C = (v4i32)__msa_and_v((v16u8)C, (v16u8)sign_t);
+    D = (v4i32)__msa_and_v((v16u8)D, (v16u8)sign_t);
+    E = (v4i32)__msa_and_v((v16u8)E, (v16u8)sign_t);
+    F = (v4i32)__msa_and_v((v16u8)F, (v16u8)sign_t);
+    G = (v4i32)__msa_and_v((v16u8)G, (v16u8)sign_t);
+    H = (v4i32)__msa_and_v((v16u8)H, (v16u8)sign_t);
+    r4_r = Ad + A;
+    r5_r = Bd + C;
+    r6_r = Cd + D;
+    r7_r = Dd + E;
+    r4_l = Ed + F;
+    r5_l = Fd + G;
+    r6_l = Gd + H;
+    r7_l = Hd + B;
+    VSHF_B2_SB(r0_r, r4_r, r1_r, r5_r, mask, mask, d0, d1);
+    VSHF_B2_SB(r2_r, r6_r, r3_r, r7_r, mask, mask, d2, d3);
+    VSHF_B2_SB(r0_l, r4_l, r1_l, r5_l, mask, mask, d4, d5);
+    VSHF_B2_SB(r2_l, r6_l, r3_l, r7_l, mask, mask, d6, d7);
+
+    /* Final sequence of operations over-write original dst */
+    ST_D1(d0, 0, dst);
+    ST_D1(d1, 0, dst + stride);
+    ST_D1(d2, 0, dst + 2 * stride);
+    ST_D1(d3, 0, dst + 3 * stride);
+    ST_D1(d4, 0, dst + 4 * stride);
+    ST_D1(d5, 0, dst + 5 * stride);
+    ST_D1(d6, 0, dst + 6 * stride);
+    ST_D1(d7, 0, dst + 7 * stride);
+}
+
+void ff_vp3_idct_put_msa(uint8_t *dest, ptrdiff_t line_size, int16_t *block)
+{
+    idct_msa(dest, line_size, block, 1);
+    memset(block, 0, sizeof(*block) * 64);
+}
+
+void ff_vp3_idct_add_msa(uint8_t *dest, ptrdiff_t line_size, int16_t *block)
+{
+    idct_msa(dest, line_size, block, 2);
+    memset(block, 0, sizeof(*block) * 64);
+}
+
+void ff_vp3_idct_dc_add_msa(uint8_t *dest, ptrdiff_t line_size, int16_t *block)
+{
+    int i = (block[0] + 15) >> 5;
+    v4i32 dc = {i, i, i, i};
+    v16i8 d0, d1, d2, d3, d4, d5, d6, d7;
+    v4i32 c0, c1, c2, c3, c4, c5, c6, c7;
+    v4i32 e0, e1, e2, e3, e4, e5, e6, e7;
+    v4i32 r0, r1, r2, r3, r4, r5, r6, r7;
+    v16i8 mask = {0, 4, 8, 12, 16, 20, 24, 28, 0, 0, 0, 0, 0, 0, 0, 0};
+    v16i8 zero = {0};
+
+    LD_SB8(dest, line_size, d0, d1, d2, d3, d4, d5, d6, d7);
+    ILVR_B4_SW(zero, d0, zero, d1, zero, d2, zero, d3,
+               c0, c1, c2, c3);
+    ILVR_B4_SW(zero, d4, zero, d5, zero, d6, zero, d7,
+               c4, c5, c6, c7);
+    /* Right part */
+    ILVR_H4_SW(zero, c0, zero, c1, zero, c2, zero, c3,
+               e0, e1, e2, e3);
+    ILVR_H4_SW(zero, c4, zero, c5, zero, c6, zero, c7,
+               e4, e5, e6, e7);
+    e0 += dc;
+    e1 += dc;
+    e2 += dc;
+    e3 += dc;
+    e4 += dc;
+    e5 += dc;
+    e6 += dc;
+    e7 += dc;
+    CLIP_SW8_0_255(e0, e1, e2, e3, e4, e5, e6, e7);
+
+    /* Left part */
+    ILVL_H4_SW(zero, c0, zero, c1, zero, c2, zero, c3,
+               r0, r1, r2, r3);
+    ILVL_H4_SW(zero, c4, zero, c5, zero, c6, zero, c7,
+               r4, r5, r6, r7);
+    r0 += dc;
+    r1 += dc;
+    r2 += dc;
+    r3 += dc;
+    r4 += dc;
+    r5 += dc;
+    r6 += dc;
+    r7 += dc;
+    CLIP_SW8_0_255(r0, r1, r2, r3, r4, r5, r6, r7);
+    VSHF_B2_SB(e0, r0, e1, r1, mask, mask, d0, d1);
+    VSHF_B2_SB(e2, r2, e3, r3, mask, mask, d2, d3);
+    VSHF_B2_SB(e4, r4, e5, r5, mask, mask, d4, d5);
+    VSHF_B2_SB(e6, r6, e7, r7, mask, mask, d6, d7);
+
+    /* Final sequence of operations over-write original dst */
+    ST_D1(d0, 0, dest);
+    ST_D1(d1, 0, dest + line_size);
+    ST_D1(d2, 0, dest + 2 * line_size);
+    ST_D1(d3, 0, dest + 3 * line_size);
+    ST_D1(d4, 0, dest + 4 * line_size);
+    ST_D1(d5, 0, dest + 5 * line_size);
+    ST_D1(d6, 0, dest + 6 * line_size);
+    ST_D1(d7, 0, dest + 7 * line_size);
+
+    block[0] = 0;
+}
+
+void ff_vp3_v_loop_filter_msa(uint8_t *first_pixel, ptrdiff_t stride,
+                              int *bounding_values)
+{
+    int nstride = -stride;
+    v4i32 e0, e1, f0, f1, g0, g1;
+    v16i8 zero = {0};
+    v16i8 d0, d1, d2, d3;
+    v8i16 c0, c1, c2, c3;
+    v8i16 r0;
+    v8i16 cnst3h = {3, 3, 3, 3, 3, 3, 3, 3},
+          cnst4h = {4, 4, 4, 4, 4, 4, 4, 4};
+    v16i8 mask = {0, 4, 8, 12, 16, 20, 24, 28, 0, 0, 0, 0, 0, 0, 0, 0};
+    int16_t temp_16[8];
+    int temp_32[8];
+
+    LD_SB4(first_pixel + nstride * 2, stride, d0, d1, d2, d3);
+    ILVR_B4_SH(zero, d0, zero, d1, zero, d2, zero, d3,
+               c0, c1, c2, c3);
+    r0 = (c0 - c3) + (c2 - c1) * cnst3h;
+    r0 += cnst4h;
+    r0 = r0 >> 3;
+    /* Get filter_value from bounding_values one by one */
+    ST_SH(r0, temp_16);
+    for (int i = 0; i < 8; i++)
+        temp_32[i] = bounding_values[temp_16[i]];
+    LD_SW2(temp_32, 4, e0, e1);
+    ILVR_H2_SW(zero, c1, zero, c2, f0, g0);
+    ILVL_H2_SW(zero, c1, zero, c2, f1, g1);
+    f0 += e0;
+    f1 += e1;
+    g0 -= e0;
+    g1 -= e1;
+    CLIP_SW4_0_255(f0, f1, g0, g1);
+    VSHF_B2_SB(f0, f1, g0, g1, mask, mask, d1, d2);
+
+    /* Final move to first_pixel */
+    ST_D1(d1, 0, first_pixel + nstride);
+    ST_D1(d2, 0, first_pixel);
+}
+
+void ff_vp3_h_loop_filter_msa(uint8_t *first_pixel, ptrdiff_t stride,
+                              int *bounding_values)
+{
+    v16i8 d0, d1, d2, d3, d4, d5, d6, d7;
+    v8i16 c0, c1, c2, c3, c4, c5, c6, c7;
+    v8i16 r0;
+    v4i32 e0, e1, f0, f1, g0, g1;
+    v16i8 zero = {0};
+    v8i16 cnst3h = {3, 3, 3, 3, 3, 3, 3, 3},
+          cnst4h = {4, 4, 4, 4, 4, 4, 4, 4};
+    v16i8 mask = {0, 16, 4, 20, 8, 24, 12, 28, 0, 0, 0, 0, 0, 0, 0, 0};
+    int16_t temp_16[8];
+    int temp_32[8];
+
+    LD_SB8(first_pixel - 2, stride, d0, d1, d2, d3, d4, d5, d6, d7);
+    ILVR_B4_SH(zero, d0, zero, d1, zero, d2, zero, d3,
+               c0, c1, c2, c3);
+    ILVR_B4_SH(zero, d4, zero, d5, zero, d6, zero, d7,
+               c4, c5, c6, c7);
+    TRANSPOSE8x8_SH_SH(c0, c1, c2, c3, c4, c5, c6, c7,
+                       c0, c1, c2, c3, c4, c5, c6, c7);
+    r0 = (c0 - c3) + (c2 - c1) * cnst3h;
+    r0 += cnst4h;
+    r0 = r0 >> 3;
+
+    /* Get filter_value from bounding_values one by one */
+    ST_SH(r0, temp_16);
+    for (int i = 0; i < 8; i++)
+        temp_32[i] = bounding_values[temp_16[i]];
+    LD_SW2(temp_32, 4, e0, e1);
+    ILVR_H2_SW(zero, c1, zero, c2, f0, g0);
+    ILVL_H2_SW(zero, c1, zero, c2, f1, g1);
+    f0 += e0;
+    f1 += e1;
+    g0 -= e0;
+    g1 -= e1;
+    CLIP_SW4_0_255(f0, f1, g0, g1);
+    VSHF_B2_SB(f0, g0, f1, g1, mask, mask, d1, d2);
+    /* Final move to first_pixel */
+    ST_H4(d1, 0, 1, 2, 3, first_pixel - 1, stride);
+    ST_H4(d2, 0, 1, 2, 3, first_pixel - 1 + 4 * stride, stride);
+}
+
+void ff_put_no_rnd_pixels_l2_msa(uint8_t *dst, const uint8_t *src1,
+                                 const uint8_t *src2, ptrdiff_t stride, int h)
+{
+    if (h == 8) {
+        v16i8 d0, d1, d2, d3, d4, d5, d6, d7;
+        v16i8 c0, c1, c2, c3;
+        v4i32 a0, a1, a2, a3, b0, b1, b2, b3;
+        v4i32 e0, e1, e2;
+        v4i32 f0, f1, f2;
+        v4u32 t0, t1, t2, t3;
+        v16i8 mask = {0, 1, 2, 3, 16, 17, 18, 19, 4, 5, 6, 7, 20, 21, 22, 23};
+        int32_t value = 0xfefefefe;
+        v4i32 fmask = {value, value, value, value};
+
+        LD_SB8(src1, stride, d0, d1, d2, d3, d4, d5, d6, d7);
+        VSHF_B2_SB(d0, d1, d2, d3, mask, mask, c0, c1);
+        VSHF_B2_SB(d4, d5, d6, d7, mask, mask, c2, c3);
+        a0 = (v4i32) __msa_pckev_d((v2i64)c1, (v2i64)c0);
+        a2 = (v4i32) __msa_pckod_d((v2i64)c1, (v2i64)c0);
+        a1 = (v4i32) __msa_pckev_d((v2i64)c3, (v2i64)c2);
+        a3 = (v4i32) __msa_pckod_d((v2i64)c3, (v2i64)c2);
+
+        LD_SB8(src2, stride, d0, d1, d2, d3, d4, d5, d6, d7);
+        VSHF_B2_SB(d0, d1, d2, d3, mask, mask, c0, c1);
+        VSHF_B2_SB(d4, d5, d6, d7, mask, mask, c2, c3);
+        b0 = (v4i32) __msa_pckev_d((v2i64)c1, (v2i64)c0);
+        b2 = (v4i32) __msa_pckod_d((v2i64)c1, (v2i64)c0);
+        b1 = (v4i32) __msa_pckev_d((v2i64)c3, (v2i64)c2);
+        b3 = (v4i32) __msa_pckod_d((v2i64)c3, (v2i64)c2);
+
+        e0 = (v4i32) __msa_xor_v((v16u8)a0, (v16u8)b0);
+        e0 = (v4i32) __msa_and_v((v16u8)e0, (v16u8)fmask);
+        t0 = ((v4u32)e0) >> 1;
+        e2 = (v4i32) __msa_and_v((v16u8)a0, (v16u8)b0);
+        t0 = t0 + (v4u32)e2;
+
+        e1 = (v4i32) __msa_xor_v((v16u8)a1, (v16u8)b1);
+        e1 = (v4i32) __msa_and_v((v16u8)e1, (v16u8)fmask);
+        t1 = ((v4u32)e1) >> 1;
+        e2 = (v4i32) __msa_and_v((v16u8)a1, (v16u8)b1);
+        t1 = t1 + (v4u32)e2;
+
+        f0 = (v4i32) __msa_xor_v((v16u8)a2, (v16u8)b2);
+        f0 = (v4i32) __msa_and_v((v16u8)f0, (v16u8)fmask);
+        t2 = ((v4u32)f0) >> 1;
+        f2 = (v4i32) __msa_and_v((v16u8)a2, (v16u8)b2);
+        t2 = t2 + (v4u32)f2;
+
+        f1 = (v4i32) __msa_xor_v((v16u8)a3, (v16u8)b3);
+        f1 = (v4i32) __msa_and_v((v16u8)f1, (v16u8)fmask);
+        t3 = ((v4u32)f1) >> 1;
+        f2 = (v4i32) __msa_and_v((v16u8)a3, (v16u8)b3);
+        t3 = t3 + (v4u32)f2;
+
+        ST_W8(t0, t1, 0, 1, 2, 3, 0, 1, 2, 3, dst, stride);
+        ST_W8(t2, t3, 0, 1, 2, 3, 0, 1, 2, 3, dst + 4, stride);
+    } else {
+        int i;
+
+        for (i = 0; i < h; i++) {
+            uint32_t a, b;
+
+            a = AV_RN32(&src1[i * stride]);
+            b = AV_RN32(&src2[i * stride]);
+            AV_WN32A(&dst[i * stride], no_rnd_avg32(a, b));
+            a = AV_RN32(&src1[i * stride + 4]);
+            b = AV_RN32(&src2[i * stride + 4]);
+            AV_WN32A(&dst[i * stride + 4], no_rnd_avg32(a, b));
+        }
+    }
+}
diff --git a/libavcodec/mips/vp3dsp_init_mips.c b/libavcodec/mips/vp3dsp_init_mips.c
new file mode 100644
index 0000000..e183db3
--- /dev/null
+++ b/libavcodec/mips/vp3dsp_init_mips.c
@@ -0,0 +1,60 @@
+
+/*
+ * Copyright (c) 2018 gxw <guxiwei-hf@loongson.cn>
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "config.h"
+#include "libavutil/attributes.h"
+#include "libavcodec/avcodec.h"
+#include "libavcodec/vp3dsp.h"
+#include "vp3dsp_mips.h"
+
+#if HAVE_MSA
+static av_cold void vp3dsp_init_msa(VP3DSPContext *c, int flags)
+{
+    c->put_no_rnd_pixels_l2 = ff_put_no_rnd_pixels_l2_msa;
+
+    c->idct_add      = ff_vp3_idct_add_msa;
+    c->idct_put      = ff_vp3_idct_put_msa;
+    c->idct_dc_add   = ff_vp3_idct_dc_add_msa;
+    c->v_loop_filter = ff_vp3_v_loop_filter_msa;
+    c->h_loop_filter = ff_vp3_h_loop_filter_msa;
+}
+#endif /* HAVE_MSA */
+
+#if HAVE_MMI
+static av_cold void vp3dsp_init_mmi(VP3DSPContext *c, int flags)
+{
+    c->put_no_rnd_pixels_l2 = ff_put_no_rnd_pixels_l2_mmi;
+
+    c->idct_add      = ff_vp3_idct_add_mmi;
+    c->idct_put      = ff_vp3_idct_put_mmi;
+    c->idct_dc_add   = ff_vp3_idct_dc_add_mmi;
+}
+#endif /* HAVE_MMI */
+
+av_cold void ff_vp3dsp_init_mips(VP3DSPContext *c, int flags)
+{
+#if HAVE_MMI
+    vp3dsp_init_mmi(c, flags);
+#endif /* HAVE_MMI */
+#if HAVE_MSA
+    vp3dsp_init_msa(c, flags);
+#endif /* HAVE_MSA */
+}
diff --git a/libavcodec/mips/vp3dsp_mips.h b/libavcodec/mips/vp3dsp_mips.h
new file mode 100644
index 0000000..4685a82
--- /dev/null
+++ b/libavcodec/mips/vp3dsp_mips.h
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 2018 gxw <guxiwei-hf@loongson.cn>
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVCODEC_MIPS_VP3DSP_MIPS_H
+#define AVCODEC_MIPS_VP3DSP_MIPS_H
+
+#include "libavcodec/vp3dsp.h"
+#include <string.h>
+
+void ff_vp3_idct_add_msa(uint8_t *dest, ptrdiff_t line_size, int16_t *block);
+void ff_vp3_idct_put_msa(uint8_t *dest, ptrdiff_t line_size, int16_t *block);
+void ff_vp3_idct_dc_add_msa(uint8_t *dest, ptrdiff_t line_size, int16_t *block);
+void ff_vp3_v_loop_filter_msa(uint8_t *first_pixel, ptrdiff_t stride,
+                              int *bounding_values);
+void ff_put_no_rnd_pixels_l2_msa(uint8_t *dst, const uint8_t *src1,
+                                 const uint8_t *src2, ptrdiff_t stride, int h);
+void ff_vp3_h_loop_filter_msa(uint8_t *first_pixel, ptrdiff_t stride,
+                              int *bounding_values);
+
+void ff_vp3_idct_add_mmi(uint8_t *dest, ptrdiff_t line_size, int16_t *block);
+void ff_vp3_idct_put_mmi(uint8_t *dest, ptrdiff_t line_size, int16_t *block);
+void ff_vp3_idct_dc_add_mmi(uint8_t *dest, ptrdiff_t line_size, int16_t *block);
+void ff_put_no_rnd_pixels_l2_mmi(uint8_t *dst, const uint8_t *src1,
+                                 const uint8_t *src2, ptrdiff_t stride, int h);
+
+#endif /* #ifndef AVCODEC_MIPS_VP3DSP_MIPS_H */
diff --git a/libavcodec/mips/vp8_idct_msa.c b/libavcodec/mips/vp8_idct_msa.c
index 11ac9ff..ce37ca1 100644
--- a/libavcodec/mips/vp8_idct_msa.c
+++ b/libavcodec/mips/vp8_idct_msa.c
@@ -71,12 +71,10 @@
     ILVR_H4_SW(zero, res0, zero, res1, zero, res2, zero, res3,
                res0, res1, res2, res3);
     ADD4(res0, vt0, res1, vt1, res2, vt2, res3, vt3, res0, res1, res2, res3);
-    res0 = CLIP_SW_0_255(res0);
-    res1 = CLIP_SW_0_255(res1);
-    res2 = CLIP_SW_0_255(res2);
-    res3 = CLIP_SW_0_255(res3);
+    CLIP_SW4_0_255(res0, res1, res2, res3);
     VSHF_B2_SB(res0, res1, res2, res3, mask, mask, dest0, dest1);
-    ST4x4_UB(dest0, dest1, 0, 1, 0, 1, dst, stride);
+    ST_W2(dest0, 0, 1, dst, stride);
+    ST_W2(dest1, 0, 1, dst + 2 * stride, stride);
 
     memset(input, 0, 4 * 4 * sizeof(*input));
 }
@@ -97,7 +95,8 @@
     ADD4(res0, vec, res1, vec, res2, vec, res3, vec, res0, res1, res2, res3);
     CLIP_SH4_0_255(res0, res1, res2, res3);
     VSHF_B2_SB(res0, res1, res2, res3, mask, mask, dest0, dest1);
-    ST4x4_UB(dest0, dest1, 0, 1, 0, 1, dst, stride);
+    ST_W2(dest0, 0, 1, dst, stride);
+    ST_W2(dest1, 0, 1, dst + 2 * stride, stride);
 
     in_dc[0] = 0;
 }
diff --git a/libavcodec/mips/vp8_lpf_msa.c b/libavcodec/mips/vp8_lpf_msa.c
index 3590961..1b51334 100644
--- a/libavcodec/mips/vp8_lpf_msa.c
+++ b/libavcodec/mips/vp8_lpf_msa.c
@@ -540,14 +540,8 @@
     ILVRL_B2_SH(q0, p0, tmp1, tmp0);
 
     src -= 1;
-    ST2x4_UB(tmp1, 0, src, pitch);
-    src += 4 * pitch;
-    ST2x4_UB(tmp1, 4, src, pitch);
-    src += 4 * pitch;
-    ST2x4_UB(tmp0, 0, src, pitch);
-    src += 4 * pitch;
-    ST2x4_UB(tmp0, 4, src, pitch);
-    src += 4 * pitch;
+    ST_H8(tmp1, 0, 1, 2, 3, 4, 5, 6, 7, src, pitch)
+    ST_H8(tmp0, 0, 1, 2, 3, 4, 5, 6, 7, src + 8 * pitch, pitch)
 }
 
 void ff_vp8_v_loop_filter8uv_inner_msa(uint8_t *src_u, uint8_t *src_v,
@@ -596,7 +590,6 @@
                                        ptrdiff_t pitch, int b_limit_in,
                                        int limit_in, int thresh_in)
 {
-    uint8_t *temp_src_u, *temp_src_v;
     v16u8 p3, p2, p1, p0, q3, q2, q1, q0;
     v16u8 mask, hev, flat, thresh, limit, b_limit;
     v16u8 row0, row1, row2, row3, row4, row5, row6, row7, row8;
@@ -623,15 +616,8 @@
     tmp1 = (v4i32) __msa_ilvl_b((v16i8) q1, (v16i8) q0);
     ILVRL_H2_SW(tmp1, tmp0, tmp4, tmp5);
 
-    temp_src_u = src_u - 2;
-    ST4x4_UB(tmp2, tmp2, 0, 1, 2, 3, temp_src_u, pitch);
-    temp_src_u += 4 * pitch;
-    ST4x4_UB(tmp3, tmp3, 0, 1, 2, 3, temp_src_u, pitch);
-
-    temp_src_v = src_v - 2;
-    ST4x4_UB(tmp4, tmp4, 0, 1, 2, 3, temp_src_v, pitch);
-    temp_src_v += 4 * pitch;
-    ST4x4_UB(tmp5, tmp5, 0, 1, 2, 3, temp_src_v, pitch);
+    ST_W8(tmp2, tmp3, 0, 1, 2, 3, 0, 1, 2, 3, src_u - 2, pitch);
+    ST_W8(tmp4, tmp5, 0, 1, 2, 3, 0, 1, 2, 3, src_v - 2, pitch);
 }
 
 void ff_vp8_v_loop_filter16_inner_msa(uint8_t *src, ptrdiff_t pitch,
@@ -684,7 +670,6 @@
     ILVRL_H2_SH(tmp1, tmp0, tmp4, tmp5);
 
     src -= 2;
-    ST4x8_UB(tmp2, tmp3, src, pitch);
-    src += (8 * pitch);
-    ST4x8_UB(tmp4, tmp5, src, pitch);
+    ST_W8(tmp2, tmp3, 0, 1, 2, 3, 0, 1, 2, 3, src, pitch)
+    ST_W8(tmp4, tmp5, 0, 1, 2, 3, 0, 1, 2, 3, src + 8 * pitch, pitch)
 }
diff --git a/libavcodec/mips/vp8_mc_msa.c b/libavcodec/mips/vp8_mc_msa.c
index 2bf0abd..a613206 100644
--- a/libavcodec/mips/vp8_mc_msa.c
+++ b/libavcodec/mips/vp8_mc_msa.c
@@ -181,7 +181,7 @@
     SRARI_H2_SH(out0, out1, 7);
     SAT_SH2_SH(out0, out1, 7);
     out = PCKEV_XORI128_UB(out0, out1);
-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
+    ST_W4(out, 0, 1, 2, 3, dst, dst_stride);
 }
 
 static void common_hz_6t_4x8_msa(uint8_t *src, int32_t src_stride,
@@ -214,10 +214,9 @@
     SRARI_H4_SH(out0, out1, out2, out3, 7);
     SAT_SH4_SH(out0, out1, out2, out3, 7);
     out = PCKEV_XORI128_UB(out0, out1);
-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
-    dst += (4 * dst_stride);
+    ST_W4(out, 0, 1, 2, 3, dst, dst_stride);
     out = PCKEV_XORI128_UB(out2, out3);
-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
+    ST_W4(out, 0, 1, 2, 3, dst + 4 * dst_stride, dst_stride);
 }
 
 void ff_put_vp8_epel4_h6_msa(uint8_t *dst, ptrdiff_t dst_stride,
@@ -263,7 +262,7 @@
     SAT_SH4_SH(out0, out1, out2, out3, 7);
     tmp0 = PCKEV_XORI128_UB(out0, out1);
     tmp1 = PCKEV_XORI128_UB(out2, out3);
-    ST8x4_UB(tmp0, tmp1, dst, dst_stride);
+    ST_D4(tmp0, tmp1, 0, 1, 0, 1, dst, dst_stride);
     dst += (4 * dst_stride);
 
     for (loop_cnt = (height >> 2) - 1; loop_cnt--;) {
@@ -276,7 +275,7 @@
         SAT_SH4_SH(out0, out1, out2, out3, 7);
         tmp0 = PCKEV_XORI128_UB(out0, out1);
         tmp1 = PCKEV_XORI128_UB(out2, out3);
-        ST8x4_UB(tmp0, tmp1, dst, dst_stride);
+        ST_D4(tmp0, tmp1, 0, 1, 0, 1, dst, dst_stride);
         dst += (4 * dst_stride);
     }
 }
@@ -368,7 +367,7 @@
         SRARI_H2_SH(out10, out32, 7);
         SAT_SH2_SH(out10, out32, 7);
         out = PCKEV_XORI128_UB(out10, out32);
-        ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
+        ST_W4(out, 0, 1, 2, 3, dst, dst_stride);
         dst += (4 * dst_stride);
 
         src2110 = src6554;
@@ -416,7 +415,7 @@
         SAT_SH4_SH(out0_r, out1_r, out2_r, out3_r, 7);
         tmp0 = PCKEV_XORI128_UB(out0_r, out1_r);
         tmp1 = PCKEV_XORI128_UB(out2_r, out3_r);
-        ST8x4_UB(tmp0, tmp1, dst, dst_stride);
+        ST_D4(tmp0, tmp1, 0, 1, 0, 1, dst, dst_stride);
         dst += (4 * dst_stride);
 
         src10_r = src76_r;
@@ -567,7 +566,7 @@
         SRARI_H2_SH(tmp0, tmp1, 7);
         SAT_SH2_SH(tmp0, tmp1, 7);
         out = PCKEV_XORI128_UB(tmp0, tmp1);
-        ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
+        ST_W4(out, 0, 1, 2, 3, dst, dst_stride);
         dst += (4 * dst_stride);
 
         hz_out3 = hz_out7;
@@ -651,7 +650,7 @@
         SAT_SH4_SH(tmp0, tmp1, tmp2, tmp3, 7);
         vec0 = PCKEV_XORI128_UB(tmp0, tmp1);
         vec1 = PCKEV_XORI128_UB(tmp2, tmp3);
-        ST8x4_UB(vec0, vec1, dst, dst_stride);
+        ST_D4(vec0, vec1, 0, 1, 0, 1, dst, dst_stride);
         dst += (4 * dst_stride);
 
         hz_out4 = hz_out8;
@@ -702,7 +701,7 @@
     SRARI_H2_SH(out0, out1, 7);
     SAT_SH2_SH(out0, out1, 7);
     out = PCKEV_XORI128_UB(out0, out1);
-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
+    ST_W4(out, 0, 1, 2, 3, dst, dst_stride);
 }
 
 static void common_hz_4t_4x8_msa(uint8_t *src, int32_t src_stride,
@@ -735,10 +734,9 @@
     SRARI_H4_SH(out0, out1, out2, out3, 7);
     SAT_SH4_SH(out0, out1, out2, out3, 7);
     out = PCKEV_XORI128_UB(out0, out1);
-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
-    dst += (4 * dst_stride);
+    ST_W4(out, 0, 1, 2, 3, dst, dst_stride);
     out = PCKEV_XORI128_UB(out2, out3);
-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
+    ST_W4(out, 0, 1, 2, 3, dst + 4 * dst_stride, dst_stride);
 }
 
 static void common_hz_4t_4x16_msa(uint8_t *src, int32_t src_stride,
@@ -769,10 +767,10 @@
     SRARI_H4_SH(out0, out1, out2, out3, 7);
     SAT_SH4_SH(out0, out1, out2, out3, 7);
     out = PCKEV_XORI128_UB(out0, out1);
-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
+    ST_W4(out, 0, 1, 2, 3, dst, dst_stride);
     dst += (4 * dst_stride);
     out = PCKEV_XORI128_UB(out2, out3);
-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
+    ST_W4(out, 0, 1, 2, 3, dst, dst_stride);
     dst += (4 * dst_stride);
 
     LD_SB8(src, src_stride, src0, src1, src2, src3, src4, src5, src6, src7);
@@ -785,10 +783,10 @@
     SRARI_H4_SH(out0, out1, out2, out3, 7);
     SAT_SH4_SH(out0, out1, out2, out3, 7);
     out = PCKEV_XORI128_UB(out0, out1);
-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
+    ST_W4(out, 0, 1, 2, 3, dst, dst_stride);
     dst += (4 * dst_stride);
     out = PCKEV_XORI128_UB(out2, out3);
-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
+    ST_W4(out, 0, 1, 2, 3, dst, dst_stride);
 }
 
 void ff_put_vp8_epel4_h4_msa(uint8_t *dst, ptrdiff_t dst_stride,
@@ -836,7 +834,7 @@
         SAT_SH4_SH(out0, out1, out2, out3, 7);
         tmp0 = PCKEV_XORI128_UB(out0, out1);
         tmp1 = PCKEV_XORI128_UB(out2, out3);
-        ST8x4_UB(tmp0, tmp1, dst, dst_stride);
+        ST_D4(tmp0, tmp1, 0, 1, 0, 1, dst, dst_stride);
         dst += (4 * dst_stride);
     }
 }
@@ -932,7 +930,7 @@
         SRARI_H2_SH(out10, out32, 7);
         SAT_SH2_SH(out10, out32, 7);
         out = PCKEV_XORI128_UB(out10, out32);
-        ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
+        ST_W4(out, 0, 1, 2, 3, dst, dst_stride);
         dst += (4 * dst_stride);
     }
 }
@@ -974,7 +972,7 @@
         SAT_SH4_SH(out0_r, out1_r, out2_r, out3_r, 7);
         tmp0 = PCKEV_XORI128_UB(out0_r, out1_r);
         tmp1 = PCKEV_XORI128_UB(out2_r, out3_r);
-        ST8x4_UB(tmp0, tmp1, dst, dst_stride);
+        ST_D4(tmp0, tmp1, 0, 1, 0, 1, dst, dst_stride);
         dst += (4 * dst_stride);
 
         src10_r = src98_r;
@@ -1093,7 +1091,7 @@
         SRARI_H2_SH(tmp0, tmp1, 7);
         SAT_SH2_SH(tmp0, tmp1, 7);
         out = PCKEV_XORI128_UB(tmp0, tmp1);
-        ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
+        ST_W4(out, 0, 1, 2, 3, dst, dst_stride);
         dst += (4 * dst_stride);
 
         hz_out1 = hz_out5;
@@ -1160,7 +1158,7 @@
         SAT_SH4_SH(tmp0, tmp1, tmp2, tmp3, 7);
         out0 = PCKEV_XORI128_UB(tmp0, tmp1);
         out1 = PCKEV_XORI128_UB(tmp2, tmp3);
-        ST8x4_UB(out0, out1, dst, dst_stride);
+        ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
         dst += (4 * dst_stride);
 
         vec0 = vec4;
@@ -1240,7 +1238,8 @@
         SAT_SH2_SH(tmp0, tmp1, 7);
         PCKEV_B2_UB(tmp0, tmp0, tmp1, tmp1, res0, res1);
         XORI_B2_128_UB(res0, res1);
-        ST4x4_UB(res0, res1, 0, 1, 0, 1, dst, dst_stride);
+        ST_W2(res0, 0, 1, dst, dst_stride);
+        ST_W2(res1, 0, 1, dst + 2 * dst_stride, dst_stride);
         dst += (4 * dst_stride);
 
         hz_out1 = hz_out5;
@@ -1316,7 +1315,7 @@
         SAT_SH4_SH(tmp0, tmp1, tmp2, tmp3, 7);
         out0 = PCKEV_XORI128_UB(tmp0, tmp1);
         out1 = PCKEV_XORI128_UB(tmp2, tmp3);
-        ST8x4_UB(out0, out1, dst, dst_stride);
+        ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
         dst += (4 * dst_stride);
     }
 }
@@ -1391,7 +1390,7 @@
         SRARI_H2_SH(tmp0, tmp1, 7);
         SAT_SH2_SH(tmp0, tmp1, 7);
         out = PCKEV_XORI128_UB(tmp0, tmp1);
-        ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
+        ST_W4(out, 0, 1, 2, 3, dst, dst_stride);
         dst += (4 * dst_stride);
 
         hz_out3 = hz_out7;
@@ -1464,7 +1463,7 @@
         SAT_SH4_SH(tmp0, tmp1, tmp2, tmp3, 7);
         vec0 = PCKEV_XORI128_UB(tmp0, tmp1);
         vec1 = PCKEV_XORI128_UB(tmp2, tmp3);
-        ST8x4_UB(vec0, vec1, dst, dst_stride);
+        ST_D4(vec0, vec1, 0, 1, 0, 1, dst, dst_stride);
         dst += (4 * dst_stride);
 
         hz_out4 = hz_out8;
@@ -1509,7 +1508,8 @@
     DOTP_UB2_UH(vec0, vec1, filt0, filt0, vec2, vec3);
     SRARI_H2_UH(vec2, vec3, 7);
     PCKEV_B2_UB(vec2, vec2, vec3, vec3, res0, res1);
-    ST4x4_UB(res0, res1, 0, 1, 0, 1, dst, dst_stride);
+    ST_W2(res0, 0, 1, dst, dst_stride);
+    ST_W2(res1, 0, 1, dst + 2 * dst_stride, dst_stride);
 }
 
 static void common_hz_2t_4x8_msa(uint8_t *src, int32_t src_stride,
@@ -1535,9 +1535,10 @@
     SRARI_H4_UH(vec4, vec5, vec6, vec7, 7);
     PCKEV_B4_SB(vec4, vec4, vec5, vec5, vec6, vec6, vec7, vec7,
                 res0, res1, res2, res3);
-    ST4x4_UB(res0, res1, 0, 1, 0, 1, dst, dst_stride);
-    dst += (4 * dst_stride);
-    ST4x4_UB(res2, res3, 0, 1, 0, 1, dst, dst_stride);
+    ST_W2(res0, 0, 1, dst, dst_stride);
+    ST_W2(res1, 0, 1, dst + 2 * dst_stride, dst_stride);
+    ST_W2(res2, 0, 1, dst + 4 * dst_stride, dst_stride);
+    ST_W2(res3, 0, 1, dst + 6 * dst_stride, dst_stride);
 }
 
 void ff_put_vp8_bilinear4_h_msa(uint8_t *dst, ptrdiff_t dst_stride,
@@ -1574,7 +1575,7 @@
                 vec0, vec1, vec2, vec3);
     SRARI_H4_UH(vec0, vec1, vec2, vec3, 7);
     PCKEV_B2_SB(vec1, vec0, vec3, vec2, src0, src1);
-    ST8x4_UB(src0, src1, dst, dst_stride);
+    ST_D4(src0, src1, 0, 1, 0, 1, dst, dst_stride);
 }
 
 static void common_hz_2t_8x8mult_msa(uint8_t *src, int32_t src_stride,
@@ -1604,8 +1605,7 @@
     src += (4 * src_stride);
 
     PCKEV_B2_SB(vec1, vec0, vec3, vec2, out0, out1);
-    ST8x4_UB(out0, out1, dst, dst_stride);
-    dst += (4 * dst_stride);
+    ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
 
     VSHF_B2_UH(src0, src0, src1, src1, mask, mask, vec0, vec1);
     VSHF_B2_UH(src2, src2, src3, src3, mask, mask, vec2, vec3);
@@ -1613,8 +1613,8 @@
                 vec0, vec1, vec2, vec3);
     SRARI_H4_UH(vec0, vec1, vec2, vec3, 7);
     PCKEV_B2_SB(vec1, vec0, vec3, vec2, out0, out1);
-    ST8x4_UB(out0, out1, dst, dst_stride);
-    dst += (4 * dst_stride);
+    ST_D4(out0, out1, 0, 1, 0, 1, dst + 4 * dst_stride, dst_stride);
+    dst += (8 * dst_stride);
 
     if (16 == height) {
         LD_SB4(src, src_stride, src0, src1, src2, src3);
@@ -1629,7 +1629,7 @@
         src += (4 * src_stride);
 
         PCKEV_B2_SB(vec1, vec0, vec3, vec2, out0, out1);
-        ST8x4_UB(out0, out1, dst, dst_stride);
+        ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
 
         VSHF_B2_UH(src0, src0, src1, src1, mask, mask, vec0, vec1);
         VSHF_B2_UH(src2, src2, src3, src3, mask, mask, vec2, vec3);
@@ -1637,7 +1637,7 @@
                     vec0, vec1, vec2, vec3);
         SRARI_H4_UH(vec0, vec1, vec2, vec3, 7);
         PCKEV_B2_SB(vec1, vec0, vec3, vec2, out0, out1);
-        ST8x4_UB(out0, out1, dst + 4 * dst_stride, dst_stride);
+        ST_D4(out0, out1, 0, 1, 0, 1, dst + 4 * dst_stride, dst_stride);
     }
 }
 
@@ -1745,7 +1745,7 @@
     SRARI_H2_UH(tmp0, tmp1, 7);
     SAT_UH2_UH(tmp0, tmp1, 7);
     src2110 = __msa_pckev_b((v16i8) tmp1, (v16i8) tmp0);
-    ST4x4_UB(src2110, src2110, 0, 1, 2, 3, dst, dst_stride);
+    ST_W4(src2110, 0, 1, 2, 3, dst, dst_stride);
 }
 
 static void common_vt_2t_4x8_msa(uint8_t *src, int32_t src_stride,
@@ -1779,8 +1779,7 @@
     SRARI_H4_UH(tmp0, tmp1, tmp2, tmp3, 7);
     SAT_UH4_UH(tmp0, tmp1, tmp2, tmp3, 7);
     PCKEV_B2_SB(tmp1, tmp0, tmp3, tmp2, src2110, src4332);
-    ST4x4_UB(src2110, src2110, 0, 1, 2, 3, dst, dst_stride);
-    ST4x4_UB(src4332, src4332, 0, 1, 2, 3, dst + 4 * dst_stride, dst_stride);
+    ST_W8(src2110, src4332, 0, 1, 2, 3, 0, 1, 2, 3, dst, dst_stride);
 }
 
 void ff_put_vp8_bilinear4_v_msa(uint8_t *dst, ptrdiff_t dst_stride,
@@ -1817,7 +1816,7 @@
     SRARI_H4_UH(tmp0, tmp1, tmp2, tmp3, 7);
     SAT_UH4_UH(tmp0, tmp1, tmp2, tmp3, 7);
     PCKEV_B2_SB(tmp1, tmp0, tmp3, tmp2, out0, out1);
-    ST8x4_UB(out0, out1, dst, dst_stride);
+    ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
 }
 
 static void common_vt_2t_8x8mult_msa(uint8_t *src, int32_t src_stride,
@@ -1851,16 +1850,15 @@
         SRARI_H4_UH(tmp0, tmp1, tmp2, tmp3, 7);
         SAT_UH4_UH(tmp0, tmp1, tmp2, tmp3, 7);
         PCKEV_B2_SB(tmp1, tmp0, tmp3, tmp2, out0, out1);
-        ST8x4_UB(out0, out1, dst, dst_stride);
-        dst += (4 * dst_stride);
+        ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
 
         DOTP_UB4_UH(vec4, vec5, vec6, vec7, filt0, filt0, filt0, filt0,
                     tmp0, tmp1, tmp2, tmp3);
         SRARI_H4_UH(tmp0, tmp1, tmp2, tmp3, 7);
         SAT_UH4_UH(tmp0, tmp1, tmp2, tmp3, 7);
         PCKEV_B2_SB(tmp1, tmp0, tmp3, tmp2, out0, out1);
-        ST8x4_UB(out0, out1, dst, dst_stride);
-        dst += (4 * dst_stride);
+        ST_D4(out0, out1, 0, 1, 0, 1, dst + 4 * dst_stride, dst_stride);
+        dst += (8 * dst_stride);
 
         src0 = src8;
     }
@@ -1964,7 +1962,8 @@
     SRARI_H2_UH(tmp0, tmp1, 7);
     SAT_UH2_UH(tmp0, tmp1, 7);
     PCKEV_B2_UB(tmp0, tmp0, tmp1, tmp1, res0, res1);
-    ST4x4_UB(res0, res1, 0, 1, 0, 1, dst, dst_stride);
+    ST_W2(res0, 0, 1, dst, dst_stride);
+    ST_W2(res1, 0, 1, dst + 2 * dst_stride, dst_stride);
 }
 
 static void common_hv_2ht_2vt_4x8_msa(uint8_t *src, int32_t src_stride,
@@ -1996,8 +1995,8 @@
     hz_out4 = HORIZ_2TAP_FILT_UH(src4, src5, mask, filt_hz, 7);
     hz_out6 = HORIZ_2TAP_FILT_UH(src6, src7, mask, filt_hz, 7);
     hz_out8 = HORIZ_2TAP_FILT_UH(src8, src8, mask, filt_hz, 7);
-    SLDI_B3_UH(hz_out2, hz_out4, hz_out6, hz_out0, hz_out2, hz_out4, hz_out1,
-               hz_out3, hz_out5, 8);
+    SLDI_B3_UH(hz_out2, hz_out0, hz_out4, hz_out2, hz_out6, hz_out4, 8, hz_out1,
+               hz_out3, hz_out5);
     hz_out7 = (v8u16) __msa_pckod_d((v2i64) hz_out8, (v2i64) hz_out6);
 
     ILVEV_B2_UB(hz_out0, hz_out1, hz_out2, hz_out3, vec0, vec1);
@@ -2008,9 +2007,10 @@
     SAT_UH4_UH(vec4, vec5, vec6, vec7, 7);
     PCKEV_B4_SB(vec4, vec4, vec5, vec5, vec6, vec6, vec7, vec7,
                 res0, res1, res2, res3);
-    ST4x4_UB(res0, res1, 0, 1, 0, 1, dst, dst_stride);
-    dst += (4 * dst_stride);
-    ST4x4_UB(res2, res3, 0, 1, 0, 1, dst, dst_stride);
+    ST_W2(res0, 0, 1, dst, dst_stride);
+    ST_W2(res1, 0, 1, dst + 2 * dst_stride, dst_stride);
+    ST_W2(res2, 0, 1, dst + 4 * dst_stride, dst_stride);
+    ST_W2(res3, 0, 1, dst + 6 * dst_stride, dst_stride);
 }
 
 void ff_put_vp8_bilinear4_hv_msa(uint8_t *dst, ptrdiff_t dst_stride,
@@ -2070,7 +2070,7 @@
     SRARI_H4_UH(tmp0, tmp1, tmp2, tmp3, 7);
     SAT_UH4_UH(tmp0, tmp1, tmp2, tmp3, 7);
     PCKEV_B2_SB(tmp1, tmp0, tmp3, tmp2, out0, out1);
-    ST8x4_UB(out0, out1, dst, dst_stride);
+    ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
 }
 
 static void common_hv_2ht_2vt_8x8mult_msa(uint8_t *src, int32_t src_stride,
@@ -2127,8 +2127,7 @@
         SRARI_H2_UH(tmp3, tmp4, 7);
         SAT_UH2_UH(tmp3, tmp4, 7);
         PCKEV_B2_SB(tmp2, tmp1, tmp4, tmp3, out0, out1);
-        ST8x4_UB(out0, out1, dst, dst_stride);
-        dst += (4 * dst_stride);
+        ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
 
         hz_out1 = HORIZ_2TAP_FILT_UH(src1, src1, mask, filt_hz, 7);
         vec0 = (v16u8) __msa_ilvev_b((v16i8) hz_out1, (v16i8) hz_out0);
@@ -2149,8 +2148,8 @@
         SRARI_H4_UH(tmp5, tmp6, tmp7, tmp8, 7);
         SAT_UH4_UH(tmp5, tmp6, tmp7, tmp8, 7);
         PCKEV_B2_SB(tmp6, tmp5, tmp8, tmp7, out0, out1);
-        ST8x4_UB(out0, out1, dst, dst_stride);
-        dst += (4 * dst_stride);
+        ST_D4(out0, out1, 0, 1, 0, 1, dst + 4 * dst_stride, dst_stride);
+        dst += (8 * dst_stride);
     }
 }
 
diff --git a/libavcodec/mips/vp8dsp_init_mips.c b/libavcodec/mips/vp8dsp_init_mips.c
index 3fc5f8e..7fd8fb0 100644
--- a/libavcodec/mips/vp8dsp_init_mips.c
+++ b/libavcodec/mips/vp8dsp_init_mips.c
@@ -193,10 +193,10 @@
 
 av_cold void ff_vp8dsp_init_mips(VP8DSPContext *dsp)
 {
-#if HAVE_MSA
-    vp8dsp_init_msa(dsp);
-#endif  // #if HAVE_MSA
 #if HAVE_MMI
     vp8dsp_init_mmi(dsp);
 #endif /* HAVE_MMI */
+#if HAVE_MSA
+    vp8dsp_init_msa(dsp);
+#endif  // #if HAVE_MSA
 }
diff --git a/libavcodec/mips/vp9_idct_msa.c b/libavcodec/mips/vp9_idct_msa.c
index bd762f2..53bfbb4 100644
--- a/libavcodec/mips/vp9_idct_msa.c
+++ b/libavcodec/mips/vp9_idct_msa.c
@@ -241,7 +241,7 @@
          res0_m, res1_m, res2_m, res3_m);                         \
     CLIP_SH4_0_255(res0_m, res1_m, res2_m, res3_m);               \
     PCKEV_B2_SB(res1_m, res0_m, res3_m, res2_m, tmp0_m, tmp1_m);  \
-    ST8x4_UB(tmp0_m, tmp1_m, dst_m, dst_stride);                  \
+    ST_D4(tmp0_m, tmp1_m, 0, 1, 0, 1, dst_m, dst_stride);         \
 }
 
 #define VP9_IDCT4x4(in0, in1, in2, in3, out0, out1, out2, out3)       \
@@ -249,6 +249,7 @@
     v8i16 c0_m, c1_m, c2_m, c3_m;                                     \
     v8i16 step0_m, step1_m;                                           \
     v4i32 tmp0_m, tmp1_m, tmp2_m, tmp3_m;                             \
+    v16i8 zeros = { 0 };                                              \
                                                                       \
     c0_m = VP9_SET_COSPI_PAIR(cospi_16_64, cospi_16_64);              \
     c1_m = VP9_SET_COSPI_PAIR(cospi_16_64, -cospi_16_64);             \
@@ -262,7 +263,7 @@
     SRARI_W4_SW(tmp0_m, tmp1_m, tmp2_m, tmp3_m, VP9_DCT_CONST_BITS);  \
                                                                       \
     PCKEV_H2_SW(tmp1_m, tmp0_m, tmp3_m, tmp2_m, tmp0_m, tmp2_m);      \
-    SLDI_B2_0_SW(tmp0_m, tmp2_m, tmp1_m, tmp3_m, 8);                  \
+    SLDI_B2_SW(zeros, tmp0_m, zeros, tmp2_m, 8, tmp1_m, tmp3_m);      \
     BUTTERFLY_4((v8i16) tmp0_m, (v8i16) tmp1_m,                       \
                 (v8i16) tmp2_m, (v8i16) tmp3_m,                       \
                 out0, out1, out2, out3);                              \
@@ -364,7 +365,10 @@
     v8i16 zero = { 0 };
 
     /* load vector elements of 4x4 block */
-    LD4x4_SH(input, in0, in1, in2, in3);
+    in0 = LD_SH(input);
+    in2 = LD_SH(input + 8);
+    in1 = (v8i16) __msa_ilvl_d((v2i64) in0, (v2i64) in0);
+    in3 = (v8i16) __msa_ilvl_d((v2i64) in2, (v2i64) in2);
     ST_SH2(zero, zero, input, 8);
     /* rows */
     VP9_IDCT4x4(in0, in1, in2, in3, in0, in1, in2, in3);
@@ -383,7 +387,10 @@
     v8i16 zero = { 0 };
 
     /* load vector elements of 4x4 block */
-    LD4x4_SH(input, in0, in1, in2, in3);
+    in0 = LD_SH(input);
+    in2 = LD_SH(input + 8);
+    in1 = (v8i16) __msa_ilvl_d((v2i64) in0, (v2i64) in0);
+    in3 = (v8i16) __msa_ilvl_d((v2i64) in2, (v2i64) in2);
     ST_SH2(zero, zero, input, 8);
     /* rows */
     VP9_IADST4x4(in0, in1, in2, in3, in0, in1, in2, in3);
@@ -402,7 +409,10 @@
     v8i16 zero = { 0 };
 
     /* load vector elements of 4x4 block */
-    LD4x4_SH(input, in0, in1, in2, in3);
+    in0 = LD_SH(input);
+    in2 = LD_SH(input + 8);
+    in1 = (v8i16) __msa_ilvl_d((v2i64) in0, (v2i64) in0);
+    in3 = (v8i16) __msa_ilvl_d((v2i64) in2, (v2i64) in2);
     ST_SH2(zero, zero, input, 8);
     /* cols */
     VP9_IADST4x4(in0, in1, in2, in3, in0, in1, in2, in3);
@@ -421,7 +431,10 @@
     v8i16 zero = { 0 };
 
     /* load vector elements of 4x4 block */
-    LD4x4_SH(input, in0, in1, in2, in3);
+    in0 = LD_SH(input);
+    in2 = LD_SH(input + 8);
+    in1 = (v8i16) __msa_ilvl_d((v2i64) in0, (v2i64) in0);
+    in3 = (v8i16) __msa_ilvl_d((v2i64) in2, (v2i64) in2);
     ST_SH2(zero, zero, input, 8);
     /* cols */
     VP9_IDCT4x4(in0, in1, in2, in3, in0, in1, in2, in3);
@@ -751,15 +764,15 @@
 
     res0 = (v8i16) __msa_ilvr_b((v16i8) zero, (v16i8) dst0);
     res0 += out0;
-    res0 = CLIP_SH_0_255(res0);
+    CLIP_SH_0_255(res0);
     res0 = (v8i16) __msa_pckev_b((v16i8) res0, (v16i8) res0);
-    ST8x1_UB(res0, dst);
+    ST_D1(res0, 0, dst);
 
     res7 = (v8i16) __msa_ilvr_b((v16i8) zero, (v16i8) dst7);
     res7 += out7;
-    res7 = CLIP_SH_0_255(res7);
+    CLIP_SH_0_255(res7);
     res7 = (v8i16) __msa_pckev_b((v16i8) res7, (v16i8) res7);
-    ST8x1_UB(res7, dst + 7 * dst_stride);
+    ST_D1(res7, 0, dst + 7 * dst_stride);
 
     cnst1 = __msa_fill_h(cospi_24_64);
     cnst0 = __msa_fill_h(cospi_8_64);
@@ -782,8 +795,8 @@
     ADD2(res1, out1, res6, out6, res1, res6);
     CLIP_SH2_0_255(res1, res6);
     PCKEV_B2_SH(res1, res1, res6, res6, res1, res6);
-    ST8x1_UB(res1, dst + dst_stride);
-    ST8x1_UB(res6, dst + 6 * dst_stride);
+    ST_D1(res1, 0, dst + dst_stride);
+    ST_D1(res6, 0, dst + 6 * dst_stride);
 
     cnst0 = __msa_fill_h(cospi_16_64);
     cnst1 = -cnst0;
@@ -801,8 +814,8 @@
     ADD2(res3, out3, res4, out4, res3, res4);
     CLIP_SH2_0_255(res3, res4);
     PCKEV_B2_SH(res3, res3, res4, res4, res3, res4);
-    ST8x1_UB(res3, dst + 3 * dst_stride);
-    ST8x1_UB(res4, dst + 4 * dst_stride);
+    ST_D1(res3, 0, dst + 3 * dst_stride);
+    ST_D1(res4, 0, dst + 4 * dst_stride);
 
     out2 = VP9_DOT_SHIFT_RIGHT_PCK_H(temp2, temp3, cnst0);
     out5 = VP9_DOT_SHIFT_RIGHT_PCK_H(temp2, temp3, cnst1);
@@ -814,8 +827,8 @@
     ADD2(res2, out2, res5, out5, res2, res5);
     CLIP_SH2_0_255(res2, res5);
     PCKEV_B2_SH(res2, res2, res5, res5, res2, res5);
-    ST8x1_UB(res2, dst + 2 * dst_stride);
-    ST8x1_UB(res5, dst + 5 * dst_stride);
+    ST_D1(res2, 0, dst + 2 * dst_stride);
+    ST_D1(res5, 0, dst + 5 * dst_stride);
 }
 
 static void vp9_iadst_idct_8x8_add_msa(int16_t *input, uint8_t *dst,
@@ -1180,8 +1193,7 @@
              res3);
         ADD4(res4, vec, res5, vec, res6, vec, res7, vec, res4, res5, res6,
              res7);
-        CLIP_SH4_0_255(res0, res1, res2, res3);
-        CLIP_SH4_0_255(res4, res5, res6, res7);
+        CLIP_SH8_0_255(res0, res1, res2, res3, res4, res5, res6, res7);
         PCKEV_B4_UB(res4, res0, res5, res1, res6, res2, res7, res3,
                     tmp0, tmp1, tmp2, tmp3);
         ST_UB4(tmp0, tmp1, tmp2, tmp3, dst, dst_stride);
@@ -1354,8 +1366,8 @@
     ADD2(res0, out0, res1, out1, res0, res1);
     CLIP_SH2_0_255(res0, res1);
     PCKEV_B2_SH(res0, res0, res1, res1, res0, res1);
-    ST8x1_UB(res0, dst);
-    ST8x1_UB(res1, dst + 15 * dst_stride);
+    ST_D1(res0, 0, dst);
+    ST_D1(res1, 0, dst + 15 * dst_stride);
 
     k0 = VP9_SET_COSPI_PAIR(cospi_12_64, cospi_20_64);
     k1 = VP9_SET_COSPI_PAIR(-cospi_20_64, cospi_12_64);
@@ -1371,8 +1383,8 @@
     ADD2(res8, out8, res9, out9, res8, res9);
     CLIP_SH2_0_255(res8, res9);
     PCKEV_B2_SH(res8, res8, res9, res9, res8, res9);
-    ST8x1_UB(res8, dst + dst_stride);
-    ST8x1_UB(res9, dst + 14 * dst_stride);
+    ST_D1(res8, 0, dst + dst_stride);
+    ST_D1(res9, 0, dst + 14 * dst_stride);
 
     k0 = VP9_SET_COSPI_PAIR(cospi_8_64, cospi_24_64);
     k1 = VP9_SET_COSPI_PAIR(cospi_24_64, -cospi_8_64);
@@ -1386,8 +1398,8 @@
     ADD2(res4, out4, res5, out5, res4, res5);
     CLIP_SH2_0_255(res4, res5);
     PCKEV_B2_SH(res4, res4, res5, res5, res4, res5);
-    ST8x1_UB(res4, dst + 3 * dst_stride);
-    ST8x1_UB(res5, dst + 12 * dst_stride);
+    ST_D1(res4, 0, dst + 3 * dst_stride);
+    ST_D1(res5, 0, dst + 12 * dst_stride);
 
     VP9_MADD_BF(h1, h3, h5, h7, k0, k1, k2, k0, out12, out14, out13, out15);
     out13 = -out13;
@@ -1398,8 +1410,8 @@
     ADD2(res12, out12, res13, out13, res12, res13);
     CLIP_SH2_0_255(res12, res13);
     PCKEV_B2_SH(res12, res12, res13, res13, res12, res13);
-    ST8x1_UB(res12, dst + 2 * dst_stride);
-    ST8x1_UB(res13, dst + 13 * dst_stride);
+    ST_D1(res12, 0, dst + 2 * dst_stride);
+    ST_D1(res13, 0, dst + 13 * dst_stride);
 
     k0 = VP9_SET_COSPI_PAIR(cospi_16_64, cospi_16_64);
     k3 = VP9_SET_COSPI_PAIR(-cospi_16_64, cospi_16_64);
@@ -1411,8 +1423,8 @@
     ADD2(res6, out6, res7, out7, res6, res7);
     CLIP_SH2_0_255(res6, res7);
     PCKEV_B2_SH(res6, res6, res7, res7, res6, res7);
-    ST8x1_UB(res6, dst + 4 * dst_stride);
-    ST8x1_UB(res7, dst + 11 * dst_stride);
+    ST_D1(res6, 0, dst + 4 * dst_stride);
+    ST_D1(res7, 0, dst + 11 * dst_stride);
 
     VP9_MADD_SHORT(out10, out11, k0, k3, out10, out11);
     SRARI_H2_SH(out10, out11, 6);
@@ -1422,8 +1434,8 @@
     ADD2(res10, out10, res11, out11, res10, res11);
     CLIP_SH2_0_255(res10, res11);
     PCKEV_B2_SH(res10, res10, res11, res11, res10, res11);
-    ST8x1_UB(res10, dst + 6 * dst_stride);
-    ST8x1_UB(res11, dst + 9 * dst_stride);
+    ST_D1(res10, 0, dst + 6 * dst_stride);
+    ST_D1(res11, 0, dst + 9 * dst_stride);
 
     k1 = VP9_SET_COSPI_PAIR(-cospi_16_64, -cospi_16_64);
     k2 = VP9_SET_COSPI_PAIR(cospi_16_64, -cospi_16_64);
@@ -1435,8 +1447,8 @@
     ADD2(res2, out2, res3, out3, res2, res3);
     CLIP_SH2_0_255(res2, res3);
     PCKEV_B2_SH(res2, res2, res3, res3, res2, res3);
-    ST8x1_UB(res2, dst + 7 * dst_stride);
-    ST8x1_UB(res3, dst + 8 * dst_stride);
+    ST_D1(res2, 0, dst + 7 * dst_stride);
+    ST_D1(res3, 0, dst + 8 * dst_stride);
 
     VP9_MADD_SHORT(out14, out15, k1, k2, out14, out15);
     SRARI_H2_SH(out14, out15, 6);
@@ -1446,8 +1458,8 @@
     ADD2(res14, out14, res15, out15, res14, res15);
     CLIP_SH2_0_255(res14, res15);
     PCKEV_B2_SH(res14, res14, res15, res15, res14, res15);
-    ST8x1_UB(res14, dst + 5 * dst_stride);
-    ST8x1_UB(res15, dst + 10 * dst_stride);
+    ST_D1(res14, 0, dst + 5 * dst_stride);
+    ST_D1(res15, 0, dst + 10 * dst_stride);
 }
 
 static void vp9_iadst16x16_colcol_addblk_msa(int16_t *input, uint8_t *dst,
@@ -1969,8 +1981,7 @@
              res3);
         ADD4(res4, vec, res5, vec, res6, vec, res7, vec, res4, res5, res6,
              res7);
-        CLIP_SH4_0_255(res0, res1, res2, res3);
-        CLIP_SH4_0_255(res4, res5, res6, res7);
+        CLIP_SH8_0_255(res0, res1, res2, res3, res4, res5, res6, res7);
         PCKEV_B4_UB(res4, res0, res5, res1, res6, res2, res7, res3,
                     tmp0, tmp1, tmp2, tmp3);
 
diff --git a/libavcodec/mips/vp9_intra_msa.c b/libavcodec/mips/vp9_intra_msa.c
index 54cf0ae..97cf212 100644
--- a/libavcodec/mips/vp9_intra_msa.c
+++ b/libavcodec/mips/vp9_intra_msa.c
@@ -378,7 +378,8 @@
     IPRED_SUBS_UH2_UH(src_top_left, src_top_left, vec2, vec3);
     SAT_UH4_UH(vec0, vec1, vec2, vec3, 7);
     PCKEV_B2_SB(vec1, vec0, vec3, vec2, tmp0, tmp1);
-    ST4x4_UB(tmp0, tmp1, 0, 2, 0, 2, dst, dst_stride);
+    ST_W2(tmp0, 0, 2, dst, dst_stride);
+    ST_W2(tmp1, 0, 2, dst + 2 * dst_stride, dst_stride);
 }
 
 void ff_tm_8x8_msa(uint8_t *dst, ptrdiff_t dst_stride,
@@ -409,7 +410,7 @@
         IPRED_SUBS_UH2_UH(src_top_left, src_top_left, vec2, vec3);
         SAT_UH4_UH(vec0, vec1, vec2, vec3, 7);
         PCKEV_B2_SB(vec1, vec0, vec3, vec2, tmp0, tmp1);
-        ST8x4_UB(tmp0, tmp1, dst, dst_stride);
+        ST_D4(tmp0, tmp1, 0, 1, 0, 1, dst, dst_stride);
         dst += (4 * dst_stride);
     }
 }
diff --git a/libavcodec/mips/vp9_lpf_msa.c b/libavcodec/mips/vp9_lpf_msa.c
index c82a9e9..cbb1409 100644
--- a/libavcodec/mips/vp9_lpf_msa.c
+++ b/libavcodec/mips/vp9_lpf_msa.c
@@ -1219,9 +1219,7 @@
     ILVRL_H2_SH(vec1, vec0, vec2, vec3);
 
     src -= 2;
-    ST4x4_UB(vec2, vec2, 0, 1, 2, 3, src, pitch);
-    src += 4 * pitch;
-    ST4x4_UB(vec3, vec3, 0, 1, 2, 3, src, pitch);
+    ST_W8(vec2, vec3, 0, 1, 2, 3, 0, 1, 2, 3, src, pitch);
 }
 
 void ff_loop_filter_h_44_16_msa(uint8_t *src, ptrdiff_t pitch,
@@ -1266,9 +1264,8 @@
 
     src -= 2;
 
-    ST4x8_UB(tmp2, tmp3, src, pitch);
-    src += (8 * pitch);
-    ST4x8_UB(tmp4, tmp5, src, pitch);
+    ST_W8(tmp2, tmp3, 0, 1, 2, 3, 0, 1, 2, 3, src, pitch);
+    ST_W8(tmp4, tmp5, 0, 1, 2, 3, 0, 1, 2, 3, src + 8 * pitch, pitch);
 }
 
 void ff_loop_filter_h_8_8_msa(uint8_t *src, ptrdiff_t pitch,
@@ -1313,9 +1310,7 @@
         ILVRL_H2_SH(vec1, vec0, vec2, vec3);
 
         src -= 2;
-        ST4x4_UB(vec2, vec2, 0, 1, 2, 3, src, pitch);
-        src += 4 * pitch;
-        ST4x4_UB(vec3, vec3, 0, 1, 2, 3, src, pitch);
+        ST_W8(vec2, vec3, 0, 1, 2, 3, 0, 1, 2, 3, src, pitch);
     } else {
         ILVR_B8_UH(zero, p3, zero, p2, zero, p1, zero, p0, zero, q0, zero, q1,
                    zero, q2, zero, q3, p3_r, p2_r, p1_r, p0_r, q0_r, q1_r, q2_r,
@@ -1343,11 +1338,11 @@
         vec4 = (v8i16) __msa_ilvr_b((v16i8) q2, (v16i8) q1);
 
         src -= 3;
-        ST4x4_UB(vec2, vec2, 0, 1, 2, 3, src, pitch);
-        ST2x4_UB(vec4, 0, src + 4, pitch);
+        ST_W4(vec2, 0, 1, 2, 3, src, pitch);
+        ST_H4(vec4, 0, 1, 2, 3, src + 4, pitch);
         src += (4 * pitch);
-        ST4x4_UB(vec3, vec3, 0, 1, 2, 3, src, pitch);
-        ST2x4_UB(vec4, 4, src + 4, pitch);
+        ST_W4(vec3, 0, 1, 2, 3, src, pitch);
+        ST_H4(vec4, 4, 5, 6, 7, src + 4, pitch);
     }
 }
 
@@ -1410,9 +1405,8 @@
         ILVRL_H2_SH(vec1, vec0, vec4, vec5);
 
         src -= 2;
-        ST4x8_UB(vec2, vec3, src, pitch);
-        src += 8 * pitch;
-        ST4x8_UB(vec4, vec5, src, pitch);
+        ST_W8(vec2, vec3, 0, 1, 2, 3, 0, 1, 2, 3, src, pitch);
+        ST_W8(vec4, vec5, 0, 1, 2, 3, 0, 1, 2, 3, src + 8 * pitch, pitch);
     } else {
         ILVR_B8_UH(zero, p3, zero, p2, zero, p1, zero, p0, zero, q0, zero, q1,
                    zero, q2, zero, q3, p3_r, p2_r, p1_r, p0_r, q0_r, q1_r, q2_r,
@@ -1451,17 +1445,17 @@
         ILVRL_B2_SH(q2, q1, vec2, vec5);
 
         src -= 3;
-        ST4x4_UB(vec3, vec3, 0, 1, 2, 3, src, pitch);
-        ST2x4_UB(vec2, 0, src + 4, pitch);
+        ST_W4(vec3, 0, 1, 2, 3, src, pitch);
+        ST_H4(vec2, 0, 1, 2, 3, src + 4, pitch);
         src += (4 * pitch);
-        ST4x4_UB(vec4, vec4, 0, 1, 2, 3, src, pitch);
-        ST2x4_UB(vec2, 4, src + 4, pitch);
+        ST_W4(vec4, 0, 1, 2, 3, src, pitch);
+        ST_H4(vec2, 4, 5, 6, 7, src + 4, pitch);
         src += (4 * pitch);
-        ST4x4_UB(vec6, vec6, 0, 1, 2, 3, src, pitch);
-        ST2x4_UB(vec5, 0, src + 4, pitch);
+        ST_W4(vec6, 0, 1, 2, 3, src, pitch);
+        ST_H4(vec5, 0, 1, 2, 3, src + 4, pitch);
         src += (4 * pitch);
-        ST4x4_UB(vec7, vec7, 0, 1, 2, 3, src, pitch);
-        ST2x4_UB(vec5, 4, src + 4, pitch);
+        ST_W4(vec7, 0, 1, 2, 3, src, pitch);
+        ST_H4(vec5, 4, 5, 6, 7, src + 4, pitch);
     }
 }
 
@@ -1523,9 +1517,8 @@
         ILVRL_H2_SH(vec1, vec0, vec4, vec5);
 
         src -= 2;
-        ST4x8_UB(vec2, vec3, src, pitch);
-        src += 8 * pitch;
-        ST4x8_UB(vec4, vec5, src, pitch);
+        ST_W8(vec2, vec3, 0, 1, 2, 3, 0, 1, 2, 3, src, pitch);
+        ST_W8(vec4, vec5, 0, 1, 2, 3, 0, 1, 2, 3, src + 8 * pitch, pitch);
     } else {
         ILVR_B8_UH(zero, p3, zero, p2, zero, p1, zero, p0, zero, q0, zero, q1,
                    zero, q2, zero, q3, p3_r, p2_r, p1_r, p0_r, q0_r, q1_r, q2_r,
@@ -1555,17 +1548,17 @@
         ILVRL_B2_SH(q2, q1, vec2, vec5);
 
         src -= 3;
-        ST4x4_UB(vec3, vec3, 0, 1, 2, 3, src, pitch);
-        ST2x4_UB(vec2, 0, src + 4, pitch);
+        ST_W4(vec3, 0, 1, 2, 3, src, pitch);
+        ST_H4(vec2, 0, 1, 2, 3, src + 4, pitch);
         src += (4 * pitch);
-        ST4x4_UB(vec4, vec4, 0, 1, 2, 3, src, pitch);
-        ST2x4_UB(vec2, 4, src + 4, pitch);
+        ST_W4(vec4, 0, 1, 2, 3, src, pitch);
+        ST_H4(vec2, 4, 5, 6, 7, src + 4, pitch);
         src += (4 * pitch);
-        ST4x4_UB(vec6, vec6, 0, 1, 2, 3, src, pitch);
-        ST2x4_UB(vec5, 0, src + 4, pitch);
+        ST_W4(vec6, 0, 1, 2, 3, src, pitch);
+        ST_H4(vec5, 0, 1, 2, 3, src + 4, pitch);
         src += (4 * pitch);
-        ST4x4_UB(vec7, vec7, 0, 1, 2, 3, src, pitch);
-        ST2x4_UB(vec5, 4, src + 4, pitch);
+        ST_W4(vec7, 0, 1, 2, 3, src, pitch);
+        ST_H4(vec5, 4, 5, 6, 7, src + 4, pitch);
     }
 }
 
@@ -1627,9 +1620,8 @@
         ILVRL_H2_SH(vec1, vec0, vec4, vec5);
 
         src -= 2;
-        ST4x8_UB(vec2, vec3, src, pitch);
-        src += 8 * pitch;
-        ST4x8_UB(vec4, vec5, src, pitch);
+        ST_W8(vec2, vec3, 0, 1, 2, 3, 0, 1, 2, 3, src, pitch);
+        ST_W8(vec4, vec5, 0, 1, 2, 3, 0, 1, 2, 3, src + 8 * pitch, pitch);
     } else {
         ILVL_B4_UH(zero, p3, zero, p2, zero, p1, zero, p0, p3_l, p2_l, p1_l,
                    p0_l);
@@ -1661,17 +1653,17 @@
         ILVRL_B2_SH(q2, q1, vec2, vec5);
 
         src -= 3;
-        ST4x4_UB(vec3, vec3, 0, 1, 2, 3, src, pitch);
-        ST2x4_UB(vec2, 0, src + 4, pitch);
+        ST_W4(vec3, 0, 1, 2, 3, src, pitch);
+        ST_H4(vec2, 0, 1, 2, 3, src + 4, pitch);
         src += (4 * pitch);
-        ST4x4_UB(vec4, vec4, 0, 1, 2, 3, src, pitch);
-        ST2x4_UB(vec2, 4, src + 4, pitch);
+        ST_W4(vec4, 0, 1, 2, 3, src, pitch);
+        ST_H4(vec2, 4, 5, 6, 7, src + 4, pitch);
         src += (4 * pitch);
-        ST4x4_UB(vec6, vec6, 0, 1, 2, 3, src, pitch);
-        ST2x4_UB(vec5, 0, src + 4, pitch);
+        ST_W4(vec6, 0, 1, 2, 3, src, pitch);
+        ST_H4(vec5, 0, 1, 2, 3, src + 4, pitch);
         src += (4 * pitch);
-        ST4x4_UB(vec7, vec7, 0, 1, 2, 3, src, pitch);
-        ST2x4_UB(vec5, 4, src + 4, pitch);
+        ST_W4(vec7, 0, 1, 2, 3, src, pitch);
+        ST_H4(vec5, 4, 5, 6, 7, src + 4, pitch);
     }
 }
 
@@ -1681,6 +1673,7 @@
     v16u8 p7_org, p6_org, p5_org, p4_org, p3_org, p2_org, p1_org, p0_org;
     v16i8 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
     v16u8 p7, p6, p5, p4, p3, p2, p1, p0, q0, q1, q2, q3, q4, q5, q6, q7;
+    v16i8 zeros = { 0 };
 
     LD_UB8(input, in_pitch,
            p7_org, p6_org, p5_org, p4_org, p3_org, p2_org, p1_org, p0_org);
@@ -1694,7 +1687,7 @@
     ILVL_B2_SB(tmp1, tmp0, tmp3, tmp2, tmp5, tmp7);
     ILVR_W2_UB(tmp6, tmp4, tmp7, tmp5, q0, q4);
     ILVL_W2_UB(tmp6, tmp4, tmp7, tmp5, q2, q6);
-    SLDI_B4_0_UB(q0, q2, q4, q6, q1, q3, q5, q7, 8);
+    SLDI_B4_UB(zeros, q0, zeros, q2, zeros, q4, zeros, q6, 8, q1, q3, q5, q7);
 
     ST_UB8(p7, p6, p5, p4, p3, p2, p1, p0, output, out_pitch);
     output += (8 * out_pitch);
@@ -1811,7 +1804,7 @@
     if (__msa_test_bz_v(flat)) {
         ILVR_B2_SH(p0_out, p1_out, q1_out, q0_out, vec0, vec1);
         ILVRL_H2_SH(vec1, vec0, vec2, vec3);
-        ST4x8_UB(vec2, vec3, (src_org - 2), pitch_org);
+        ST_W8(vec2, vec3, 0, 1, 2, 3, 0, 1, 2, 3, (src_org - 2), pitch_org);
         return 1;
     } else {
         ILVR_B8_UH(zero, p3, zero, p2, zero, p1, zero, p0, zero, q0, zero, q1,
@@ -1878,11 +1871,11 @@
         vec2 = (v8i16) __msa_ilvr_b((v16i8) q2, (v16i8) q1);
 
         src_org -= 3;
-        ST4x4_UB(vec3, vec3, 0, 1, 2, 3, src_org, pitch);
-        ST2x4_UB(vec2, 0, (src_org + 4), pitch);
+        ST_W4(vec3, 0, 1, 2, 3, src_org, pitch);
+        ST_H4(vec2, 0, 1, 2, 3, (src_org + 4), pitch);
         src_org += (4 * pitch);
-        ST4x4_UB(vec4, vec4, 0, 1, 2, 3, src_org, pitch);
-        ST2x4_UB(vec2, 4, (src_org + 4), pitch);
+        ST_W4(vec4, 0, 1, 2, 3, src_org, pitch);
+        ST_H4(vec2, 4, 5, 6, 7, (src_org + 4), pitch);
 
         return 1;
     } else {
@@ -1908,7 +1901,7 @@
         r_out = __msa_srari_h((v8i16) tmp1_r, 4);
         r_out = (v8i16) __msa_pckev_b((v16i8) r_out, (v16i8) r_out);
         p6 = __msa_bmnz_v(p6, (v16u8) r_out, flat2);
-        ST8x1_UB(p6, src);
+        ST_D1(p6, 0, src);
         src += 16;
 
         /* p5 */
@@ -1920,7 +1913,7 @@
         r_out = __msa_srari_h((v8i16) tmp1_r, 4);
         r_out = (v8i16) __msa_pckev_b((v16i8) r_out, (v16i8) r_out);
         p5 = __msa_bmnz_v(p5, (v16u8) r_out, flat2);
-        ST8x1_UB(p5, src);
+        ST_D1(p5, 0, src);
         src += 16;
 
         /* p4 */
@@ -1932,7 +1925,7 @@
         r_out = __msa_srari_h((v8i16) tmp1_r, 4);
         r_out = (v8i16) __msa_pckev_b((v16i8) r_out, (v16i8) r_out);
         p4 = __msa_bmnz_v(p4, (v16u8) r_out, flat2);
-        ST8x1_UB(p4, src);
+        ST_D1(p4, 0, src);
         src += 16;
 
         /* p3 */
@@ -1944,7 +1937,7 @@
         r_out = __msa_srari_h((v8i16) tmp1_r, 4);
         r_out = (v8i16) __msa_pckev_b((v16i8) r_out, (v16i8) r_out);
         p3 = __msa_bmnz_v(p3, (v16u8) r_out, flat2);
-        ST8x1_UB(p3, src);
+        ST_D1(p3, 0, src);
         src += 16;
 
         /* p2 */
@@ -1957,7 +1950,7 @@
         r_out = __msa_srari_h((v8i16) tmp1_r, 4);
         r_out = (v8i16) __msa_pckev_b((v16i8) r_out, (v16i8) r_out);
         filter8 = __msa_bmnz_v(filter8, (v16u8) r_out, flat2);
-        ST8x1_UB(filter8, src);
+        ST_D1(filter8, 0, src);
         src += 16;
 
         /* p1 */
@@ -1970,7 +1963,7 @@
         r_out = __msa_srari_h((v8i16) tmp1_r, 4);
         r_out = (v8i16) __msa_pckev_b((v16i8) r_out, (v16i8) r_out);
         filter8 = __msa_bmnz_v(filter8, (v16u8) r_out, flat2);
-        ST8x1_UB(filter8, src);
+        ST_D1(filter8, 0, src);
         src += 16;
 
         /* p0 */
@@ -1983,7 +1976,7 @@
         r_out = __msa_srari_h((v8i16) tmp1_r, 4);
         r_out = (v8i16) __msa_pckev_b((v16i8) r_out, (v16i8) r_out);
         filter8 = __msa_bmnz_v(filter8, (v16u8) r_out, flat2);
-        ST8x1_UB(filter8, src);
+        ST_D1(filter8, 0, src);
         src += 16;
 
         /* q0 */
@@ -1996,7 +1989,7 @@
         r_out = __msa_srari_h((v8i16) tmp1_r, 4);
         r_out = (v8i16) __msa_pckev_b((v16i8) r_out, (v16i8) r_out);
         filter8 = __msa_bmnz_v(filter8, (v16u8) r_out, flat2);
-        ST8x1_UB(filter8, src);
+        ST_D1(filter8, 0, src);
         src += 16;
 
         /* q1 */
@@ -2008,7 +2001,7 @@
         r_out = __msa_srari_h((v8i16) tmp1_r, 4);
         r_out = (v8i16) __msa_pckev_b((v16i8) r_out, (v16i8) r_out);
         filter8 = __msa_bmnz_v(filter8, (v16u8) r_out, flat2);
-        ST8x1_UB(filter8, src);
+        ST_D1(filter8, 0, src);
         src += 16;
 
         /* q2 */
@@ -2020,7 +2013,7 @@
         r_out = __msa_srari_h((v8i16) tmp1_r, 4);
         r_out = (v8i16) __msa_pckev_b((v16i8) r_out, (v16i8) r_out);
         filter8 = __msa_bmnz_v(filter8, (v16u8) r_out, flat2);
-        ST8x1_UB(filter8, src);
+        ST_D1(filter8, 0, src);
         src += 16;
 
         /* q3 */
@@ -2031,7 +2024,7 @@
         r_out = __msa_srari_h((v8i16) tmp1_r, 4);
         r_out = (v8i16) __msa_pckev_b((v16i8) r_out, (v16i8) r_out);
         q3 = __msa_bmnz_v(q3, (v16u8) r_out, flat2);
-        ST8x1_UB(q3, src);
+        ST_D1(q3, 0, src);
         src += 16;
 
         /* q4 */
@@ -2042,7 +2035,7 @@
         r_out = __msa_srari_h((v8i16) tmp1_r, 4);
         r_out = (v8i16) __msa_pckev_b((v16i8) r_out, (v16i8) r_out);
         q4 = __msa_bmnz_v(q4, (v16u8) r_out, flat2);
-        ST8x1_UB(q4, src);
+        ST_D1(q4, 0, src);
         src += 16;
 
         /* q5 */
@@ -2053,7 +2046,7 @@
         r_out = __msa_srari_h((v8i16) tmp1_r, 4);
         r_out = (v8i16) __msa_pckev_b((v16i8) r_out, (v16i8) r_out);
         q5 = __msa_bmnz_v(q5, (v16u8) r_out, flat2);
-        ST8x1_UB(q5, src);
+        ST_D1(q5, 0, src);
         src += 16;
 
         /* q6 */
@@ -2064,7 +2057,7 @@
         r_out = __msa_srari_h((v8i16) tmp1_r, 4);
         r_out = (v8i16) __msa_pckev_b((v16i8) r_out, (v16i8) r_out);
         q6 = __msa_bmnz_v(q6, (v16u8) r_out, flat2);
-        ST8x1_UB(q6, src);
+        ST_D1(q6, 0, src);
 
         return 0;
     }
@@ -2137,9 +2130,8 @@
         ILVRL_H2_SH(vec1, vec0, vec4, vec5);
 
         src_org -= 2;
-        ST4x8_UB(vec2, vec3, src_org, pitch);
-        src_org += 8 * pitch;
-        ST4x8_UB(vec4, vec5, src_org, pitch);
+        ST_W8(vec2, vec3, 0, 1, 2, 3, 0, 1, 2, 3, src_org, pitch);
+        ST_W8(vec4, vec5, 0, 1, 2, 3, 0, 1, 2, 3, src_org + 8 * pitch, pitch);
 
         return 1;
     } else {
@@ -2218,17 +2210,17 @@
         ILVRL_B2_SH(q2, q1, vec2, vec5);
 
         src_org -= 3;
-        ST4x4_UB(vec3, vec3, 0, 1, 2, 3, src_org, pitch);
-        ST2x4_UB(vec2, 0, (src_org + 4), pitch);
+        ST_W4(vec3, 0, 1, 2, 3, src_org, pitch);
+        ST_H4(vec2, 0, 1, 2, 3, (src_org + 4), pitch);
         src_org += (4 * pitch);
-        ST4x4_UB(vec4, vec4, 0, 1, 2, 3, src_org, pitch);
-        ST2x4_UB(vec2, 4, (src_org + 4), pitch);
+        ST_W4(vec4, 0, 1, 2, 3, src_org, pitch);
+        ST_H4(vec2, 4, 5, 6, 7, (src_org + 4), pitch);
         src_org += (4 * pitch);
-        ST4x4_UB(vec6, vec6, 0, 1, 2, 3, src_org, pitch);
-        ST2x4_UB(vec5, 0, (src_org + 4), pitch);
+        ST_W4(vec6, 0, 1, 2, 3, src_org, pitch);
+        ST_H4(vec5, 0, 1, 2, 3, (src_org + 4), pitch);
         src_org += (4 * pitch);
-        ST4x4_UB(vec7, vec7, 0, 1, 2, 3, src_org, pitch);
-        ST2x4_UB(vec5, 4, (src_org + 4), pitch);
+        ST_W4(vec7, 0, 1, 2, 3, src_org, pitch);
+        ST_H4(vec5, 4, 5, 6, 7, (src_org + 4), pitch);
 
         return 1;
     } else {
diff --git a/libavcodec/mips/vp9_mc_mmi.c b/libavcodec/mips/vp9_mc_mmi.c
new file mode 100644
index 0000000..e7a8387
--- /dev/null
+++ b/libavcodec/mips/vp9_mc_mmi.c
@@ -0,0 +1,628 @@
+/*
+ * Copyright (c) 2019 gxw <guxiwei-hf@loongson.cn>
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "libavcodec/vp9dsp.h"
+#include "libavutil/mips/mmiutils.h"
+#include "vp9dsp_mips.h"
+
+#define GET_DATA_H_MMI                                       \
+    "pmaddhw    %[ftmp4],    %[ftmp4],   %[filter1]    \n\t" \
+    "pmaddhw    %[ftmp5],    %[ftmp5],   %[filter2]    \n\t" \
+    "paddw      %[ftmp4],    %[ftmp4],   %[ftmp5]      \n\t" \
+    "punpckhwd  %[ftmp5],    %[ftmp4],   %[ftmp0]      \n\t" \
+    "paddw      %[ftmp4],    %[ftmp4],   %[ftmp5]      \n\t" \
+    "pmaddhw    %[ftmp6],    %[ftmp6],   %[filter1]    \n\t" \
+    "pmaddhw    %[ftmp7],    %[ftmp7],   %[filter2]    \n\t" \
+    "paddw      %[ftmp6],    %[ftmp6],   %[ftmp7]      \n\t" \
+    "punpckhwd  %[ftmp7],    %[ftmp6],   %[ftmp0]      \n\t" \
+    "paddw      %[ftmp6],    %[ftmp6],   %[ftmp7]      \n\t" \
+    "punpcklwd  %[srcl],     %[ftmp4],   %[ftmp6]      \n\t" \
+    "pmaddhw    %[ftmp8],    %[ftmp8],   %[filter1]    \n\t" \
+    "pmaddhw    %[ftmp9],    %[ftmp9],   %[filter2]    \n\t" \
+    "paddw      %[ftmp8],    %[ftmp8],   %[ftmp9]      \n\t" \
+    "punpckhwd  %[ftmp9],    %[ftmp8],   %[ftmp0]      \n\t" \
+    "paddw      %[ftmp8],    %[ftmp8],   %[ftmp9]      \n\t" \
+    "pmaddhw    %[ftmp10],   %[ftmp10],  %[filter1]    \n\t" \
+    "pmaddhw    %[ftmp11],   %[ftmp11],  %[filter2]    \n\t" \
+    "paddw      %[ftmp10],   %[ftmp10],  %[ftmp11]     \n\t" \
+    "punpckhwd  %[ftmp11],   %[ftmp10],  %[ftmp0]      \n\t" \
+    "paddw      %[ftmp10],   %[ftmp10],  %[ftmp11]     \n\t" \
+    "punpcklwd  %[srch],     %[ftmp8],   %[ftmp10]     \n\t"
+
+#define GET_DATA_V_MMI                                       \
+    "punpcklhw  %[srcl],     %[ftmp4],   %[ftmp5]      \n\t" \
+    "pmaddhw    %[srcl],     %[srcl],    %[filter10]   \n\t" \
+    "punpcklhw  %[ftmp12],   %[ftmp6],   %[ftmp7]      \n\t" \
+    "pmaddhw    %[ftmp12],   %[ftmp12],  %[filter32]   \n\t" \
+    "paddw      %[srcl],     %[srcl],    %[ftmp12]     \n\t" \
+    "punpcklhw  %[ftmp12],   %[ftmp8],   %[ftmp9]      \n\t" \
+    "pmaddhw    %[ftmp12],   %[ftmp12],  %[filter54]   \n\t" \
+    "paddw      %[srcl],     %[srcl],    %[ftmp12]     \n\t" \
+    "punpcklhw  %[ftmp12],   %[ftmp10],  %[ftmp11]     \n\t" \
+    "pmaddhw    %[ftmp12],   %[ftmp12],  %[filter76]   \n\t" \
+    "paddw      %[srcl],     %[srcl],    %[ftmp12]     \n\t" \
+    "punpckhhw  %[srch],     %[ftmp4],   %[ftmp5]      \n\t" \
+    "pmaddhw    %[srch],     %[srch],    %[filter10]   \n\t" \
+    "punpckhhw  %[ftmp12],   %[ftmp6],   %[ftmp7]      \n\t" \
+    "pmaddhw    %[ftmp12],   %[ftmp12],  %[filter32]   \n\t" \
+    "paddw      %[srch],     %[srch],    %[ftmp12]     \n\t" \
+    "punpckhhw  %[ftmp12],   %[ftmp8],   %[ftmp9]      \n\t" \
+    "pmaddhw    %[ftmp12],   %[ftmp12],  %[filter54]   \n\t" \
+    "paddw      %[srch],     %[srch],    %[ftmp12]     \n\t" \
+    "punpckhhw  %[ftmp12],   %[ftmp10],  %[ftmp11]     \n\t" \
+    "pmaddhw    %[ftmp12],   %[ftmp12],  %[filter76]   \n\t" \
+    "paddw      %[srch],     %[srch],    %[ftmp12]     \n\t"
+
+static void convolve_horiz_mmi(const uint8_t *src, int32_t src_stride,
+                               uint8_t *dst, int32_t dst_stride,
+                               const uint16_t *filter_x, int32_t w,
+                               int32_t h)
+{
+    double ftmp[15];
+    uint32_t tmp[2];
+    src -= 3;
+    src_stride -= w;
+    dst_stride -= w;
+    __asm__ volatile (
+        "move       %[tmp1],    %[width]                   \n\t"
+        "xor        %[ftmp0],   %[ftmp0],    %[ftmp0]      \n\t"
+        "gsldlc1    %[filter1], 0x03(%[filter])            \n\t"
+        "gsldrc1    %[filter1], 0x00(%[filter])            \n\t"
+        "gsldlc1    %[filter2], 0x0b(%[filter])            \n\t"
+        "gsldrc1    %[filter2], 0x08(%[filter])            \n\t"
+        "li         %[tmp0],    0x07                       \n\t"
+        "dmtc1      %[tmp0],    %[ftmp13]                  \n\t"
+        "punpcklwd  %[ftmp13],  %[ftmp13],   %[ftmp13]     \n\t"
+        "1:                                                \n\t"
+        /* Get 8 data per row */
+        "gsldlc1    %[ftmp5],   0x07(%[src])               \n\t"
+        "gsldrc1    %[ftmp5],   0x00(%[src])               \n\t"
+        "gsldlc1    %[ftmp7],   0x08(%[src])               \n\t"
+        "gsldrc1    %[ftmp7],   0x01(%[src])               \n\t"
+        "gsldlc1    %[ftmp9],   0x09(%[src])               \n\t"
+        "gsldrc1    %[ftmp9],   0x02(%[src])               \n\t"
+        "gsldlc1    %[ftmp11],  0x0A(%[src])               \n\t"
+        "gsldrc1    %[ftmp11],  0x03(%[src])               \n\t"
+        "punpcklbh  %[ftmp4],   %[ftmp5],    %[ftmp0]      \n\t"
+        "punpckhbh  %[ftmp5],   %[ftmp5],    %[ftmp0]      \n\t"
+        "punpcklbh  %[ftmp6],   %[ftmp7],    %[ftmp0]      \n\t"
+        "punpckhbh  %[ftmp7],   %[ftmp7],    %[ftmp0]      \n\t"
+        "punpcklbh  %[ftmp8],   %[ftmp9],    %[ftmp0]      \n\t"
+        "punpckhbh  %[ftmp9],   %[ftmp9],    %[ftmp0]      \n\t"
+        "punpcklbh  %[ftmp10],  %[ftmp11],   %[ftmp0]      \n\t"
+        "punpckhbh  %[ftmp11],  %[ftmp11],   %[ftmp0]      \n\t"
+        PTR_ADDIU  "%[width],   %[width],    -0x04         \n\t"
+        /* Get raw data */
+        GET_DATA_H_MMI
+        ROUND_POWER_OF_TWO_MMI(%[srcl], %[ftmp13], %[ftmp5],
+                               %[ftmp6], %[tmp0])
+        ROUND_POWER_OF_TWO_MMI(%[srch], %[ftmp13], %[ftmp5],
+                               %[ftmp6], %[tmp0])
+        "packsswh   %[srcl],    %[srcl],     %[srch]       \n\t"
+        "packushb   %[ftmp12],  %[srcl],     %[ftmp0]      \n\t"
+        "swc1       %[ftmp12],  0x00(%[dst])               \n\t"
+        PTR_ADDIU  "%[dst],     %[dst],      0x04          \n\t"
+        PTR_ADDIU  "%[src],     %[src],      0x04          \n\t"
+        /* Loop count */
+        "bnez       %[width],   1b                         \n\t"
+        "move       %[width],   %[tmp1]                    \n\t"
+        PTR_ADDU   "%[src],     %[src],      %[src_stride] \n\t"
+        PTR_ADDU   "%[dst],     %[dst],      %[dst_stride] \n\t"
+        PTR_ADDIU  "%[height],  %[height],   -0x01         \n\t"
+        "bnez       %[height],  1b                         \n\t"
+        : [srcl]"=&f"(ftmp[0]),     [srch]"=&f"(ftmp[1]),
+          [filter1]"=&f"(ftmp[2]),  [filter2]"=&f"(ftmp[3]),
+          [ftmp0]"=&f"(ftmp[4]),    [ftmp4]"=&f"(ftmp[5]),
+          [ftmp5]"=&f"(ftmp[6]),    [ftmp6]"=&f"(ftmp[7]),
+          [ftmp7]"=&f"(ftmp[8]),    [ftmp8]"=&f"(ftmp[9]),
+          [ftmp9]"=&f"(ftmp[10]),   [ftmp10]"=&f"(ftmp[11]),
+          [ftmp11]"=&f"(ftmp[12]),  [ftmp12]"=&f"(ftmp[13]),
+          [tmp0]"=&r"(tmp[0]),      [tmp1]"=&r"(tmp[1]),
+          [src]"+&r"(src),          [width]"+&r"(w),
+          [dst]"+&r"(dst),          [height]"+&r"(h),
+          [ftmp13]"=&f"(ftmp[14])
+        : [filter]"r"(filter_x),
+          [src_stride]"r"((mips_reg)src_stride),
+          [dst_stride]"r"((mips_reg)dst_stride)
+        : "memory"
+    );
+}
+
+static void convolve_vert_mmi(const uint8_t *src, int32_t src_stride,
+                              uint8_t *dst, int32_t dst_stride,
+                              const int16_t *filter_y, int32_t w,
+                              int32_t h)
+{
+    double ftmp[17];
+    uint32_t tmp[1];
+    ptrdiff_t addr = src_stride;
+    src_stride -= w;
+    dst_stride -= w;
+
+    __asm__ volatile (
+        "xor        %[ftmp0],    %[ftmp0],   %[ftmp0]      \n\t"
+        "gsldlc1    %[ftmp4],    0x03(%[filter])           \n\t"
+        "gsldrc1    %[ftmp4],    0x00(%[filter])           \n\t"
+        "gsldlc1    %[ftmp5],    0x0b(%[filter])           \n\t"
+        "gsldrc1    %[ftmp5],    0x08(%[filter])           \n\t"
+        "punpcklwd  %[filter10], %[ftmp4],   %[ftmp4]      \n\t"
+        "punpckhwd  %[filter32], %[ftmp4],   %[ftmp4]      \n\t"
+        "punpcklwd  %[filter54], %[ftmp5],   %[ftmp5]      \n\t"
+        "punpckhwd  %[filter76], %[ftmp5],   %[ftmp5]      \n\t"
+        "li         %[tmp0],     0x07                      \n\t"
+        "dmtc1      %[tmp0],     %[ftmp13]                 \n\t"
+        "punpcklwd  %[ftmp13],   %[ftmp13],  %[ftmp13]     \n\t"
+        "1:                                                \n\t"
+        /* Get 8 data per column */
+        "gsldlc1    %[ftmp4],    0x07(%[src])              \n\t"
+        "gsldrc1    %[ftmp4],    0x00(%[src])              \n\t"
+        PTR_ADDU   "%[tmp0],     %[src],     %[addr]       \n\t"
+        "gsldlc1    %[ftmp5],    0x07(%[tmp0])             \n\t"
+        "gsldrc1    %[ftmp5],    0x00(%[tmp0])             \n\t"
+        PTR_ADDU   "%[tmp0],     %[tmp0],    %[addr]       \n\t"
+        "gsldlc1    %[ftmp6],    0x07(%[tmp0])             \n\t"
+        "gsldrc1    %[ftmp6],    0x00(%[tmp0])             \n\t"
+        PTR_ADDU   "%[tmp0],     %[tmp0],    %[addr]       \n\t"
+        "gsldlc1    %[ftmp7],    0x07(%[tmp0])             \n\t"
+        "gsldrc1    %[ftmp7],    0x00(%[tmp0])             \n\t"
+        PTR_ADDU   "%[tmp0],     %[tmp0],    %[addr]       \n\t"
+        "gsldlc1    %[ftmp8],    0x07(%[tmp0])             \n\t"
+        "gsldrc1    %[ftmp8],    0x00(%[tmp0])             \n\t"
+        PTR_ADDU   "%[tmp0],     %[tmp0],    %[addr]       \n\t"
+        "gsldlc1    %[ftmp9],    0x07(%[tmp0])             \n\t"
+        "gsldrc1    %[ftmp9],    0x00(%[tmp0])             \n\t"
+        PTR_ADDU   "%[tmp0],     %[tmp0],    %[addr]       \n\t"
+        "gsldlc1    %[ftmp10],   0x07(%[tmp0])             \n\t"
+        "gsldrc1    %[ftmp10],   0x00(%[tmp0])             \n\t"
+        PTR_ADDU   "%[tmp0],     %[tmp0],    %[addr]       \n\t"
+        "gsldlc1    %[ftmp11],   0x07(%[tmp0])             \n\t"
+        "gsldrc1    %[ftmp11],   0x00(%[tmp0])             \n\t"
+        "punpcklbh  %[ftmp4],    %[ftmp4],   %[ftmp0]      \n\t"
+        "punpcklbh  %[ftmp5],    %[ftmp5],   %[ftmp0]      \n\t"
+        "punpcklbh  %[ftmp6],    %[ftmp6],   %[ftmp0]      \n\t"
+        "punpcklbh  %[ftmp7],    %[ftmp7],   %[ftmp0]      \n\t"
+        "punpcklbh  %[ftmp8],    %[ftmp8],   %[ftmp0]      \n\t"
+        "punpcklbh  %[ftmp9],    %[ftmp9],   %[ftmp0]      \n\t"
+        "punpcklbh  %[ftmp10],   %[ftmp10],  %[ftmp0]      \n\t"
+        "punpcklbh  %[ftmp11],   %[ftmp11],  %[ftmp0]      \n\t"
+        PTR_ADDIU  "%[width],    %[width],   -0x04         \n\t"
+        /* Get raw data */
+        GET_DATA_V_MMI
+        ROUND_POWER_OF_TWO_MMI(%[srcl], %[ftmp13], %[ftmp5],
+                               %[ftmp6], %[tmp0])
+        ROUND_POWER_OF_TWO_MMI(%[srch], %[ftmp13], %[ftmp5],
+                               %[ftmp6], %[tmp0])
+        "packsswh   %[srcl],     %[srcl],    %[srch]       \n\t"
+        "packushb   %[ftmp12],   %[srcl],    %[ftmp0]      \n\t"
+        "swc1       %[ftmp12],   0x00(%[dst])              \n\t"
+        PTR_ADDIU  "%[dst],      %[dst],      0x04         \n\t"
+        PTR_ADDIU  "%[src],      %[src],      0x04         \n\t"
+        /* Loop count */
+        "bnez       %[width],    1b                        \n\t"
+        PTR_SUBU   "%[width],    %[addr],    %[src_stride] \n\t"
+        PTR_ADDU   "%[src],      %[src],     %[src_stride] \n\t"
+        PTR_ADDU   "%[dst],      %[dst],     %[dst_stride] \n\t"
+        PTR_ADDIU  "%[height],   %[height],  -0x01         \n\t"
+        "bnez       %[height],   1b                        \n\t"
+        : [srcl]"=&f"(ftmp[0]),     [srch]"=&f"(ftmp[1]),
+          [filter10]"=&f"(ftmp[2]), [filter32]"=&f"(ftmp[3]),
+          [filter54]"=&f"(ftmp[4]), [filter76]"=&f"(ftmp[5]),
+          [ftmp0]"=&f"(ftmp[6]),    [ftmp4]"=&f"(ftmp[7]),
+          [ftmp5]"=&f"(ftmp[8]),    [ftmp6]"=&f"(ftmp[9]),
+          [ftmp7]"=&f"(ftmp[10]),   [ftmp8]"=&f"(ftmp[11]),
+          [ftmp9]"=&f"(ftmp[12]),   [ftmp10]"=&f"(ftmp[13]),
+          [ftmp11]"=&f"(ftmp[14]),  [ftmp12]"=&f"(ftmp[15]),
+          [src]"+&r"(src),          [dst]"+&r"(dst),
+          [width]"+&r"(w),          [height]"+&r"(h),
+          [tmp0]"=&r"(tmp[0]),      [ftmp13]"=&f"(ftmp[16])
+        : [filter]"r"(filter_y),
+          [src_stride]"r"((mips_reg)src_stride),
+          [dst_stride]"r"((mips_reg)dst_stride),
+          [addr]"r"((mips_reg)addr)
+        : "memory"
+    );
+}
+
+static void convolve_avg_horiz_mmi(const uint8_t *src, int32_t src_stride,
+                                   uint8_t *dst, int32_t dst_stride,
+                                   const uint16_t *filter_x, int32_t w,
+                                   int32_t h)
+{
+    double ftmp[15];
+    uint32_t tmp[2];
+    src -= 3;
+    src_stride -= w;
+    dst_stride -= w;
+
+    __asm__ volatile (
+        "move       %[tmp1],    %[width]                   \n\t"
+        "xor        %[ftmp0],   %[ftmp0],    %[ftmp0]      \n\t"
+        "gsldlc1    %[filter1], 0x03(%[filter])            \n\t"
+        "gsldrc1    %[filter1], 0x00(%[filter])            \n\t"
+        "gsldlc1    %[filter2], 0x0b(%[filter])            \n\t"
+        "gsldrc1    %[filter2], 0x08(%[filter])            \n\t"
+        "li         %[tmp0],    0x07                       \n\t"
+        "dmtc1      %[tmp0],    %[ftmp13]                  \n\t"
+        "punpcklwd  %[ftmp13],  %[ftmp13],   %[ftmp13]     \n\t"
+        "1:                                                \n\t"
+        /* Get 8 data per row */
+        "gsldlc1    %[ftmp5],   0x07(%[src])               \n\t"
+        "gsldrc1    %[ftmp5],   0x00(%[src])               \n\t"
+        "gsldlc1    %[ftmp7],   0x08(%[src])               \n\t"
+        "gsldrc1    %[ftmp7],   0x01(%[src])               \n\t"
+        "gsldlc1    %[ftmp9],   0x09(%[src])               \n\t"
+        "gsldrc1    %[ftmp9],   0x02(%[src])               \n\t"
+        "gsldlc1    %[ftmp11],  0x0A(%[src])               \n\t"
+        "gsldrc1    %[ftmp11],  0x03(%[src])               \n\t"
+        "punpcklbh  %[ftmp4],   %[ftmp5],    %[ftmp0]      \n\t"
+        "punpckhbh  %[ftmp5],   %[ftmp5],    %[ftmp0]      \n\t"
+        "punpcklbh  %[ftmp6],   %[ftmp7],    %[ftmp0]      \n\t"
+        "punpckhbh  %[ftmp7],   %[ftmp7],    %[ftmp0]      \n\t"
+        "punpcklbh  %[ftmp8],   %[ftmp9],    %[ftmp0]      \n\t"
+        "punpckhbh  %[ftmp9],   %[ftmp9],    %[ftmp0]      \n\t"
+        "punpcklbh  %[ftmp10],  %[ftmp11],   %[ftmp0]      \n\t"
+        "punpckhbh  %[ftmp11],  %[ftmp11],   %[ftmp0]      \n\t"
+        PTR_ADDIU  "%[width],   %[width],    -0x04         \n\t"
+        /* Get raw data */
+        GET_DATA_H_MMI
+        ROUND_POWER_OF_TWO_MMI(%[srcl], %[ftmp13], %[ftmp5],
+                               %[ftmp6], %[tmp0])
+        ROUND_POWER_OF_TWO_MMI(%[srch], %[ftmp13], %[ftmp5],
+                               %[ftmp6], %[tmp0])
+        "packsswh   %[srcl],    %[srcl],     %[srch]       \n\t"
+        "packushb   %[ftmp12],  %[srcl],     %[ftmp0]      \n\t"
+        "punpcklbh  %[ftmp12],  %[ftmp12],   %[ftmp0]      \n\t"
+        "gsldlc1    %[ftmp4],   0x07(%[dst])               \n\t"
+        "gsldrc1    %[ftmp4],   0x00(%[dst])               \n\t"
+        "punpcklbh  %[ftmp4],   %[ftmp4],    %[ftmp0]      \n\t"
+        "paddh      %[ftmp12],  %[ftmp12],   %[ftmp4]      \n\t"
+        "li         %[tmp0],    0x10001                    \n\t"
+        "dmtc1      %[tmp0],    %[ftmp5]                   \n\t"
+        "punpcklhw  %[ftmp5],   %[ftmp5],    %[ftmp5]      \n\t"
+        "paddh      %[ftmp12],  %[ftmp12],   %[ftmp5]      \n\t"
+        "psrah      %[ftmp12],  %[ftmp12],   %[ftmp5]      \n\t"
+        "packushb   %[ftmp12],  %[ftmp12],   %[ftmp0]      \n\t"
+        "swc1       %[ftmp12],  0x00(%[dst])               \n\t"
+        PTR_ADDIU  "%[dst],     %[dst],      0x04          \n\t"
+        PTR_ADDIU  "%[src],     %[src],      0x04          \n\t"
+        /* Loop count */
+        "bnez       %[width],   1b                         \n\t"
+        "move       %[width],   %[tmp1]                    \n\t"
+        PTR_ADDU   "%[src],     %[src],      %[src_stride] \n\t"
+        PTR_ADDU   "%[dst],     %[dst],      %[dst_stride] \n\t"
+        PTR_ADDIU  "%[height],  %[height],   -0x01         \n\t"
+        "bnez       %[height],  1b                         \n\t"
+        : [srcl]"=&f"(ftmp[0]),     [srch]"=&f"(ftmp[1]),
+          [filter1]"=&f"(ftmp[2]),  [filter2]"=&f"(ftmp[3]),
+          [ftmp0]"=&f"(ftmp[4]),    [ftmp4]"=&f"(ftmp[5]),
+          [ftmp5]"=&f"(ftmp[6]),    [ftmp6]"=&f"(ftmp[7]),
+          [ftmp7]"=&f"(ftmp[8]),    [ftmp8]"=&f"(ftmp[9]),
+          [ftmp9]"=&f"(ftmp[10]),   [ftmp10]"=&f"(ftmp[11]),
+          [ftmp11]"=&f"(ftmp[12]),  [ftmp12]"=&f"(ftmp[13]),
+          [tmp0]"=&r"(tmp[0]),      [tmp1]"=&r"(tmp[1]),
+          [src]"+&r"(src),          [width]"+&r"(w),
+          [dst]"+&r"(dst),          [height]"+&r"(h),
+          [ftmp13]"=&f"(ftmp[14])
+        : [filter]"r"(filter_x),
+          [src_stride]"r"((mips_reg)src_stride),
+          [dst_stride]"r"((mips_reg)dst_stride)
+        : "memory"
+    );
+}
+
+static void convolve_avg_vert_mmi(const uint8_t *src, int32_t src_stride,
+                                  uint8_t *dst, int32_t dst_stride,
+                                  const int16_t *filter_y, int32_t w,
+                                  int32_t h)
+{
+    double ftmp[17];
+    uint32_t tmp[1];
+    ptrdiff_t addr = src_stride;
+    src_stride -= w;
+    dst_stride -= w;
+
+    __asm__ volatile (
+        "xor        %[ftmp0],    %[ftmp0],   %[ftmp0]      \n\t"
+        "gsldlc1    %[ftmp4],    0x03(%[filter])           \n\t"
+        "gsldrc1    %[ftmp4],    0x00(%[filter])           \n\t"
+        "gsldlc1    %[ftmp5],    0x0b(%[filter])           \n\t"
+        "gsldrc1    %[ftmp5],    0x08(%[filter])           \n\t"
+        "punpcklwd  %[filter10], %[ftmp4],   %[ftmp4]      \n\t"
+        "punpckhwd  %[filter32], %[ftmp4],   %[ftmp4]      \n\t"
+        "punpcklwd  %[filter54], %[ftmp5],   %[ftmp5]      \n\t"
+        "punpckhwd  %[filter76], %[ftmp5],   %[ftmp5]      \n\t"
+        "li         %[tmp0],     0x07                      \n\t"
+        "dmtc1      %[tmp0],     %[ftmp13]                 \n\t"
+        "punpcklwd  %[ftmp13],   %[ftmp13],  %[ftmp13]     \n\t"
+        "1:                                                \n\t"
+        /* Get 8 data per column */
+        "gsldlc1    %[ftmp4],    0x07(%[src])              \n\t"
+        "gsldrc1    %[ftmp4],    0x00(%[src])              \n\t"
+        PTR_ADDU   "%[tmp0],     %[src],     %[addr]       \n\t"
+        "gsldlc1    %[ftmp5],    0x07(%[tmp0])             \n\t"
+        "gsldrc1    %[ftmp5],    0x00(%[tmp0])             \n\t"
+        PTR_ADDU   "%[tmp0],     %[tmp0],    %[addr]       \n\t"
+        "gsldlc1    %[ftmp6],    0x07(%[tmp0])             \n\t"
+        "gsldrc1    %[ftmp6],    0x00(%[tmp0])             \n\t"
+        PTR_ADDU   "%[tmp0],     %[tmp0],    %[addr]       \n\t"
+        "gsldlc1    %[ftmp7],    0x07(%[tmp0])             \n\t"
+        "gsldrc1    %[ftmp7],    0x00(%[tmp0])             \n\t"
+        PTR_ADDU   "%[tmp0],     %[tmp0],    %[addr]       \n\t"
+        "gsldlc1    %[ftmp8],    0x07(%[tmp0])             \n\t"
+        "gsldrc1    %[ftmp8],    0x00(%[tmp0])             \n\t"
+        PTR_ADDU   "%[tmp0],     %[tmp0],    %[addr]       \n\t"
+        "gsldlc1    %[ftmp9],    0x07(%[tmp0])             \n\t"
+        "gsldrc1    %[ftmp9],    0x00(%[tmp0])             \n\t"
+        PTR_ADDU   "%[tmp0],     %[tmp0],    %[addr]       \n\t"
+        "gsldlc1    %[ftmp10],   0x07(%[tmp0])             \n\t"
+        "gsldrc1    %[ftmp10],   0x00(%[tmp0])             \n\t"
+        PTR_ADDU   "%[tmp0],     %[tmp0],    %[addr]       \n\t"
+        "gsldlc1    %[ftmp11],   0x07(%[tmp0])             \n\t"
+        "gsldrc1    %[ftmp11],   0x00(%[tmp0])             \n\t"
+        "punpcklbh  %[ftmp4],    %[ftmp4],   %[ftmp0]      \n\t"
+        "punpcklbh  %[ftmp5],    %[ftmp5],   %[ftmp0]      \n\t"
+        "punpcklbh  %[ftmp6],    %[ftmp6],   %[ftmp0]      \n\t"
+        "punpcklbh  %[ftmp7],    %[ftmp7],   %[ftmp0]      \n\t"
+        "punpcklbh  %[ftmp8],    %[ftmp8],   %[ftmp0]      \n\t"
+        "punpcklbh  %[ftmp9],    %[ftmp9],   %[ftmp0]      \n\t"
+        "punpcklbh  %[ftmp10],   %[ftmp10],  %[ftmp0]      \n\t"
+        "punpcklbh  %[ftmp11],   %[ftmp11],  %[ftmp0]      \n\t"
+        PTR_ADDIU  "%[width],    %[width],   -0x04         \n\t"
+        /* Get raw data */
+        GET_DATA_V_MMI
+        ROUND_POWER_OF_TWO_MMI(%[srcl], %[ftmp13], %[ftmp5],
+                               %[ftmp6], %[tmp0])
+        ROUND_POWER_OF_TWO_MMI(%[srch], %[ftmp13], %[ftmp5],
+                               %[ftmp6], %[tmp0])
+        "packsswh   %[srcl],     %[srcl],    %[srch]       \n\t"
+        "packushb   %[ftmp12],   %[srcl],    %[ftmp0]      \n\t"
+        "punpcklbh  %[ftmp12],   %[ftmp12],  %[ftmp0]      \n\t"
+        "gsldlc1    %[ftmp4],    0x07(%[dst])              \n\t"
+        "gsldrc1    %[ftmp4],    0x00(%[dst])              \n\t"
+        "punpcklbh  %[ftmp4],    %[ftmp4],   %[ftmp0]      \n\t"
+        "paddh      %[ftmp12],   %[ftmp12],  %[ftmp4]      \n\t"
+        "li         %[tmp0],     0x10001                   \n\t"
+        "dmtc1      %[tmp0],     %[ftmp5]                  \n\t"
+        "punpcklhw  %[ftmp5],    %[ftmp5],   %[ftmp5]      \n\t"
+        "paddh      %[ftmp12],   %[ftmp12],  %[ftmp5]      \n\t"
+        "psrah      %[ftmp12],   %[ftmp12],  %[ftmp5]      \n\t"
+        "packushb   %[ftmp12],   %[ftmp12],  %[ftmp0]      \n\t"
+        "swc1       %[ftmp12],   0x00(%[dst])              \n\t"
+        PTR_ADDIU  "%[dst],      %[dst],     0x04          \n\t"
+        PTR_ADDIU  "%[src],      %[src],     0x04          \n\t"
+        /* Loop count */
+        "bnez       %[width],    1b                        \n\t"
+        PTR_SUBU   "%[width],    %[addr],    %[src_stride] \n\t"
+        PTR_ADDU   "%[src],      %[src],     %[src_stride] \n\t"
+        PTR_ADDU   "%[dst],      %[dst],     %[dst_stride] \n\t"
+        PTR_ADDIU  "%[height],   %[height],  -0x01         \n\t"
+        "bnez       %[height],   1b                        \n\t"
+        : [srcl]"=&f"(ftmp[0]),     [srch]"=&f"(ftmp[1]),
+          [filter10]"=&f"(ftmp[2]), [filter32]"=&f"(ftmp[3]),
+          [filter54]"=&f"(ftmp[4]), [filter76]"=&f"(ftmp[5]),
+          [ftmp0]"=&f"(ftmp[6]),    [ftmp4]"=&f"(ftmp[7]),
+          [ftmp5]"=&f"(ftmp[8]),    [ftmp6]"=&f"(ftmp[9]),
+          [ftmp7]"=&f"(ftmp[10]),   [ftmp8]"=&f"(ftmp[11]),
+          [ftmp9]"=&f"(ftmp[12]),   [ftmp10]"=&f"(ftmp[13]),
+          [ftmp11]"=&f"(ftmp[14]),  [ftmp12]"=&f"(ftmp[15]),
+          [src]"+&r"(src),          [dst]"+&r"(dst),
+          [width]"+&r"(w),          [height]"+&r"(h),
+          [tmp0]"=&r"(tmp[0]),      [ftmp13]"=&f"(ftmp[16])
+        : [filter]"r"(filter_y),
+          [src_stride]"r"((mips_reg)src_stride),
+          [dst_stride]"r"((mips_reg)dst_stride),
+          [addr]"r"((mips_reg)addr)
+        : "memory"
+    );
+}
+
+static void convolve_avg_mmi(const uint8_t *src, int32_t src_stride,
+                             uint8_t *dst, int32_t dst_stride,
+                             int32_t w, int32_t h)
+{
+    double ftmp[4];
+    uint32_t tmp[2];
+    src_stride -= w;
+    dst_stride -= w;
+
+    __asm__ volatile (
+        "move       %[tmp1],    %[width]                  \n\t"
+        "xor        %[ftmp0],   %[ftmp0],   %[ftmp0]      \n\t"
+        "li         %[tmp0],    0x10001                   \n\t"
+        "dmtc1      %[tmp0],    %[ftmp3]                  \n\t"
+        "punpcklhw  %[ftmp3],   %[ftmp3],   %[ftmp3]      \n\t"
+        "1:                                               \n\t"
+        "gslwlc1    %[ftmp1],   0x07(%[src])              \n\t"
+        "gslwrc1    %[ftmp1],   0x00(%[src])              \n\t"
+        "gslwlc1    %[ftmp2],   0x07(%[dst])              \n\t"
+        "gslwrc1    %[ftmp2],   0x00(%[dst])              \n\t"
+        "punpcklbh  %[ftmp1],   %[ftmp1],   %[ftmp0]      \n\t"
+        "punpcklbh  %[ftmp2],   %[ftmp2],   %[ftmp0]      \n\t"
+        "paddh      %[ftmp1],   %[ftmp1],   %[ftmp2]      \n\t"
+        "paddh      %[ftmp1],   %[ftmp1],   %[ftmp3]      \n\t"
+        "psrah      %[ftmp1],   %[ftmp1],   %[ftmp3]      \n\t"
+        "packushb   %[ftmp1],   %[ftmp1],   %[ftmp0]      \n\t"
+        "swc1       %[ftmp1],   0x00(%[dst])              \n\t"
+        PTR_ADDIU  "%[width],   %[width],   -0x04         \n\t"
+        PTR_ADDIU  "%[dst],     %[dst],     0x04          \n\t"
+        PTR_ADDIU  "%[src],     %[src],     0x04          \n\t"
+        "bnez       %[width],   1b                        \n\t"
+        "move       %[width],   %[tmp1]                   \n\t"
+        PTR_ADDU   "%[dst],     %[dst],     %[dst_stride] \n\t"
+        PTR_ADDU   "%[src],     %[src],     %[src_stride] \n\t"
+        PTR_ADDIU  "%[height],  %[height],  -0x01         \n\t"
+        "bnez       %[height],  1b                        \n\t"
+        : [ftmp0]"=&f"(ftmp[0]),  [ftmp1]"=&f"(ftmp[1]),
+          [ftmp2]"=&f"(ftmp[2]),  [ftmp3]"=&f"(ftmp[3]),
+          [tmp0]"=&r"(tmp[0]),    [tmp1]"=&r"(tmp[1]),
+          [src]"+&r"(src),        [dst]"+&r"(dst),
+          [width]"+&r"(w),        [height]"+&r"(h)
+        : [src_stride]"r"((mips_reg)src_stride),
+          [dst_stride]"r"((mips_reg)dst_stride)
+        : "memory"
+    );
+}
+
+static const int16_t vp9_subpel_filters_mmi[3][15][8] = {
+    [FILTER_8TAP_REGULAR] = {
+         {0, 1, -5, 126, 8, -3, 1, 0},
+         {-1, 3, -10, 122, 18, -6, 2, 0},
+         {-1, 4, -13, 118, 27, -9, 3, -1},
+         {-1, 4, -16, 112, 37, -11, 4, -1},
+         {-1, 5, -18, 105, 48, -14, 4, -1},
+         {-1, 5, -19, 97, 58, -16, 5, -1},
+         {-1, 6, -19, 88, 68, -18, 5, -1},
+         {-1, 6, -19, 78, 78, -19, 6, -1},
+         {-1, 5, -18, 68, 88, -19, 6, -1},
+         {-1, 5, -16, 58, 97, -19, 5, -1},
+         {-1, 4, -14, 48, 105, -18, 5, -1},
+         {-1, 4, -11, 37, 112, -16, 4, -1},
+         {-1, 3, -9, 27, 118, -13, 4, -1},
+         {0, 2, -6, 18, 122, -10, 3, -1},
+         {0, 1, -3, 8, 126, -5, 1, 0},
+    }, [FILTER_8TAP_SHARP] = {
+        {-1, 3, -7, 127, 8, -3, 1, 0},
+        {-2, 5, -13, 125, 17, -6, 3, -1},
+        {-3, 7, -17, 121, 27, -10, 5, -2},
+        {-4, 9, -20, 115, 37, -13, 6, -2},
+        {-4, 10, -23, 108, 48, -16, 8, -3},
+        {-4, 10, -24, 100, 59, -19, 9, -3},
+        {-4, 11, -24, 90, 70, -21, 10, -4},
+        {-4, 11, -23, 80, 80, -23, 11, -4},
+        {-4, 10, -21, 70, 90, -24, 11, -4},
+        {-3, 9, -19, 59, 100, -24, 10, -4},
+        {-3, 8, -16, 48, 108, -23, 10, -4},
+        {-2, 6, -13, 37, 115, -20, 9, -4},
+        {-2, 5, -10, 27, 121, -17, 7, -3},
+        {-1, 3, -6, 17, 125, -13, 5, -2},
+        {0, 1, -3, 8, 127, -7, 3, -1},
+    }, [FILTER_8TAP_SMOOTH] = {
+        {-3, -1, 32, 64, 38, 1, -3, 0},
+        {-2, -2, 29, 63, 41, 2, -3, 0},
+        {-2, -2, 26, 63, 43, 4, -4, 0},
+        {-2, -3, 24, 62, 46, 5, -4, 0},
+        {-2, -3, 21, 60, 49, 7, -4, 0},
+        {-1, -4, 18, 59, 51, 9, -4, 0},
+        {-1, -4, 16, 57, 53, 12, -4, -1},
+        {-1, -4, 14, 55, 55, 14, -4, -1},
+        {-1, -4, 12, 53, 57, 16, -4, -1},
+        {0, -4, 9, 51, 59, 18, -4, -1},
+        {0, -4, 7, 49, 60, 21, -3, -2},
+        {0, -4, 5, 46, 62, 24, -3, -2},
+        {0, -4, 4, 43, 63, 26, -2, -2},
+        {0, -3, 2, 41, 63, 29, -2, -2},
+        {0, -3, 1, 38, 64, 32, -1, -3},
+    }
+};
+
+#define VP9_8TAP_MIPS_MMI_FUNC(SIZE, TYPE, TYPE_IDX)                           \
+void ff_put_8tap_##TYPE##_##SIZE##h_mmi(uint8_t *dst, ptrdiff_t dststride,     \
+                                        const uint8_t *src,                    \
+                                        ptrdiff_t srcstride,                   \
+                                        int h, int mx, int my)                 \
+{                                                                              \
+    const int16_t *filter = vp9_subpel_filters_mmi[TYPE_IDX][mx-1];            \
+                                                                               \
+    convolve_horiz_mmi(src, srcstride, dst, dststride, filter, SIZE, h);       \
+}                                                                              \
+                                                                               \
+void ff_put_8tap_##TYPE##_##SIZE##v_mmi(uint8_t *dst, ptrdiff_t dststride,     \
+                                        const uint8_t *src,                    \
+                                        ptrdiff_t srcstride,                   \
+                                        int h, int mx, int my)                 \
+{                                                                              \
+    const int16_t *filter = vp9_subpel_filters_mmi[TYPE_IDX][my-1];            \
+                                                                               \
+    src -= (3 * srcstride);                                                    \
+    convolve_vert_mmi(src, srcstride, dst, dststride, filter, SIZE, h);        \
+}                                                                              \
+                                                                               \
+void ff_put_8tap_##TYPE##_##SIZE##hv_mmi(uint8_t *dst, ptrdiff_t dststride,    \
+                                         const uint8_t *src,                   \
+                                         ptrdiff_t srcstride,                  \
+                                         int h, int mx, int my)                \
+{                                                                              \
+    const uint16_t *hfilter = vp9_subpel_filters_mmi[TYPE_IDX][mx-1];          \
+    const uint16_t *vfilter = vp9_subpel_filters_mmi[TYPE_IDX][my-1];          \
+                                                                               \
+    int tmp_h = h + 7;                                                         \
+    uint8_t temp[64 * 71];                                                     \
+    src -= (3 * srcstride);                                                    \
+    convolve_horiz_mmi(src, srcstride, temp, 64, hfilter, SIZE, tmp_h);        \
+    convolve_vert_mmi(temp, 64, dst, dststride, vfilter, SIZE, h);             \
+}                                                                              \
+                                                                               \
+void ff_avg_8tap_##TYPE##_##SIZE##h_mmi(uint8_t *dst, ptrdiff_t dststride,     \
+                                        const uint8_t *src,                    \
+                                        ptrdiff_t srcstride,                   \
+                                        int h, int mx, int my)                 \
+{                                                                              \
+    const int16_t *filter = vp9_subpel_filters_mmi[TYPE_IDX][mx-1];            \
+                                                                               \
+    convolve_avg_horiz_mmi(src, srcstride, dst, dststride, filter, SIZE, h);   \
+}                                                                              \
+                                                                               \
+void ff_avg_8tap_##TYPE##_##SIZE##v_mmi(uint8_t *dst, ptrdiff_t dststride,     \
+                                        const uint8_t *src,                    \
+                                        ptrdiff_t srcstride,                   \
+                                        int h, int mx, int my)                 \
+{                                                                              \
+    const int16_t *filter = vp9_subpel_filters_mmi[TYPE_IDX][my-1];            \
+                                                                               \
+    src -= (3 * srcstride);                                                    \
+    convolve_avg_vert_mmi(src, srcstride, dst, dststride, filter, SIZE, h);    \
+}                                                                              \
+                                                                               \
+void ff_avg_8tap_##TYPE##_##SIZE##hv_mmi(uint8_t *dst, ptrdiff_t dststride,    \
+                                         const uint8_t *src,                   \
+                                         ptrdiff_t srcstride,                  \
+                                         int h, int mx, int my)                \
+{                                                                              \
+    const uint16_t *hfilter = vp9_subpel_filters_mmi[TYPE_IDX][mx-1];          \
+    const uint16_t *vfilter = vp9_subpel_filters_mmi[TYPE_IDX][my-1];          \
+                                                                               \
+    uint8_t temp1[64 * 64];                                                    \
+    uint8_t temp2[64 * 71];                                                    \
+    int tmp_h = h + 7;                                                         \
+    src -= (3 * srcstride);                                                    \
+    convolve_horiz_mmi(src, srcstride, temp2, 64, hfilter, SIZE, tmp_h);       \
+    convolve_vert_mmi(temp2, 64, temp1, 64, vfilter, SIZE, h);                 \
+    convolve_avg_mmi(temp1, 64, dst, dststride, SIZE, h);                      \
+}
+
+VP9_8TAP_MIPS_MMI_FUNC(64, regular, FILTER_8TAP_REGULAR);
+VP9_8TAP_MIPS_MMI_FUNC(32, regular, FILTER_8TAP_REGULAR);
+VP9_8TAP_MIPS_MMI_FUNC(16, regular, FILTER_8TAP_REGULAR);
+VP9_8TAP_MIPS_MMI_FUNC(8, regular, FILTER_8TAP_REGULAR);
+VP9_8TAP_MIPS_MMI_FUNC(4, regular, FILTER_8TAP_REGULAR);
+
+VP9_8TAP_MIPS_MMI_FUNC(64, sharp, FILTER_8TAP_SHARP);
+VP9_8TAP_MIPS_MMI_FUNC(32, sharp, FILTER_8TAP_SHARP);
+VP9_8TAP_MIPS_MMI_FUNC(16, sharp, FILTER_8TAP_SHARP);
+VP9_8TAP_MIPS_MMI_FUNC(8, sharp, FILTER_8TAP_SHARP);
+VP9_8TAP_MIPS_MMI_FUNC(4, sharp, FILTER_8TAP_SHARP);
+
+VP9_8TAP_MIPS_MMI_FUNC(64, smooth, FILTER_8TAP_SMOOTH);
+VP9_8TAP_MIPS_MMI_FUNC(32, smooth, FILTER_8TAP_SMOOTH);
+VP9_8TAP_MIPS_MMI_FUNC(16, smooth, FILTER_8TAP_SMOOTH);
+VP9_8TAP_MIPS_MMI_FUNC(8, smooth, FILTER_8TAP_SMOOTH);
+VP9_8TAP_MIPS_MMI_FUNC(4, smooth, FILTER_8TAP_SMOOTH);
+
+#undef VP9_8TAP_MIPS_MMI_FUNC
diff --git a/libavcodec/mips/vp9_mc_msa.c b/libavcodec/mips/vp9_mc_msa.c
index 749e8cb..57ea425 100644
--- a/libavcodec/mips/vp9_mc_msa.c
+++ b/libavcodec/mips/vp9_mc_msa.c
@@ -153,7 +153,7 @@
                                                               \
     PCKEV_B2_UB(in1, in0, in3, in2, tmp0_m, tmp1_m);          \
     AVER_UB2_UB(tmp0_m, dst0, tmp1_m, dst1, tmp0_m, tmp1_m);  \
-    ST8x4_UB(tmp0_m, tmp1_m, pdst_m, stride);                 \
+    ST_D4(tmp0_m, tmp1_m, 0, 1, 0, 1, pdst_m, stride);        \
 }
 
 static void common_hz_8t_4x4_msa(const uint8_t *src, int32_t src_stride,
@@ -182,7 +182,7 @@
     SRARI_H2_SH(out0, out1, 7);
     SAT_SH2_SH(out0, out1, 7);
     out = PCKEV_XORI128_UB(out0, out1);
-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
+    ST_W4(out, 0, 1, 2, 3, dst, dst_stride);
 }
 
 static void common_hz_8t_4x8_msa(const uint8_t *src, int32_t src_stride,
@@ -217,10 +217,9 @@
     SRARI_H4_SH(out0, out1, out2, out3, 7);
     SAT_SH4_SH(out0, out1, out2, out3, 7);
     out = PCKEV_XORI128_UB(out0, out1);
-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
-    dst += (4 * dst_stride);
+    ST_W4(out, 0, 1, 2, 3, dst, dst_stride);
     out = PCKEV_XORI128_UB(out2, out3);
-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
+    ST_W4(out, 0, 1, 2, 3, dst + 4 * dst_stride, dst_stride);
 }
 
 static void common_hz_8t_4w_msa(const uint8_t *src, int32_t src_stride,
@@ -262,7 +261,7 @@
     SAT_SH4_SH(out0, out1, out2, out3, 7);
     tmp0 = PCKEV_XORI128_UB(out0, out1);
     tmp1 = PCKEV_XORI128_UB(out2, out3);
-    ST8x4_UB(tmp0, tmp1, dst, dst_stride);
+    ST_D4(tmp0, tmp1, 0, 1, 0, 1, dst, dst_stride);
 }
 
 static void common_hz_8t_8x8mult_msa(const uint8_t *src, int32_t src_stride,
@@ -296,7 +295,7 @@
         SAT_SH4_SH(out0, out1, out2, out3, 7);
         tmp0 = PCKEV_XORI128_UB(out0, out1);
         tmp1 = PCKEV_XORI128_UB(out2, out3);
-        ST8x4_UB(tmp0, tmp1, dst, dst_stride);
+        ST_D4(tmp0, tmp1, 0, 1, 0, 1, dst, dst_stride);
         dst += (4 * dst_stride);
     }
 }
@@ -510,7 +509,7 @@
         SRARI_H2_SH(out10, out32, 7);
         SAT_SH2_SH(out10, out32, 7);
         out = PCKEV_XORI128_UB(out10, out32);
-        ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
+        ST_W4(out, 0, 1, 2, 3, dst, dst_stride);
         dst += (4 * dst_stride);
 
         src2110 = src6554;
@@ -562,7 +561,7 @@
         SAT_SH4_SH(out0_r, out1_r, out2_r, out3_r, 7);
         tmp0 = PCKEV_XORI128_UB(out0_r, out1_r);
         tmp1 = PCKEV_XORI128_UB(out2_r, out3_r);
-        ST8x4_UB(tmp0, tmp1, dst, dst_stride);
+        ST_D4(tmp0, tmp1, 0, 1, 0, 1, dst, dst_stride);
         dst += (4 * dst_stride);
 
         src10_r = src54_r;
@@ -796,7 +795,7 @@
                               filt_hz1, filt_hz2, filt_hz3);
     hz_out5 = HORIZ_8TAP_FILT(src5, src6, mask0, mask1, mask2, mask3, filt_hz0,
                               filt_hz1, filt_hz2, filt_hz3);
-    SLDI_B2_SH(hz_out2, hz_out4, hz_out0, hz_out2, hz_out1, hz_out3, 8);
+    SLDI_B2_SH(hz_out2, hz_out0, hz_out4, hz_out2, 8, hz_out1, hz_out3);
 
     filt = LD_SH(filter_vert);
     SPLATI_H4_SH(filt, 0, 1, 2, 3, filt_vt0, filt_vt1, filt_vt2, filt_vt3);
@@ -825,7 +824,7 @@
         SRARI_H2_SH(tmp0, tmp1, 7);
         SAT_SH2_SH(tmp0, tmp1, 7);
         out = PCKEV_XORI128_UB(tmp0, tmp1);
-        ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
+        ST_W4(out, 0, 1, 2, 3, dst, dst_stride);
         dst += (4 * dst_stride);
 
         hz_out5 = hz_out9;
@@ -920,7 +919,7 @@
         SAT_SH4_SH(tmp0, tmp1, tmp2, tmp3, 7);
         vec0 = PCKEV_XORI128_UB(tmp0, tmp1);
         vec1 = PCKEV_XORI128_UB(tmp2, tmp3);
-        ST8x4_UB(vec0, vec1, dst, dst_stride);
+        ST_D4(vec0, vec1, 0, 1, 0, 1, dst, dst_stride);
         dst += (4 * dst_stride);
 
         hz_out6 = hz_out10;
@@ -1016,7 +1015,7 @@
     SAT_SH2_SH(res0, res1, 7);
     res = PCKEV_XORI128_UB(res0, res1);
     res = (v16u8) __msa_aver_u_b(res, dst0);
-    ST4x4_UB(res, res, 0, 1, 2, 3, dst, dst_stride);
+    ST_W4(res, 0, 1, 2, 3, dst, dst_stride);
 }
 
 static void common_hz_8t_and_aver_dst_4x8_msa(const uint8_t *src,
@@ -1061,7 +1060,7 @@
     ILVR_D2_UB(res1, res0, res3, res2, res0, res2);
     XORI_B2_128_UB(res0, res2);
     AVER_UB2_UB(res0, dst0, res2, dst1, res0, res2);
-    ST4x8_UB(res0, res2, dst, dst_stride);
+    ST_W8(res0, res2, 0, 1, 2, 3, 0, 1, 2, 3, dst, dst_stride);
 }
 
 static void common_hz_8t_and_aver_dst_4w_msa(const uint8_t *src,
@@ -1348,7 +1347,7 @@
         out = PCKEV_XORI128_UB(out10, out32);
         out = __msa_aver_u_b(out, dst0);
 
-        ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
+        ST_W4(out, 0, 1, 2, 3, dst, dst_stride);
         dst += (4 * dst_stride);
 
         src2110 = src6554;
@@ -1586,7 +1585,7 @@
                               filt_hz1, filt_hz2, filt_hz3);
     hz_out5 = HORIZ_8TAP_FILT(src5, src6, mask0, mask1, mask2, mask3, filt_hz0,
                               filt_hz1, filt_hz2, filt_hz3);
-    SLDI_B2_SH(hz_out2, hz_out4, hz_out0, hz_out2, hz_out1, hz_out3, 8);
+    SLDI_B2_SH(hz_out2, hz_out0, hz_out4, hz_out2, 8, hz_out1, hz_out3);
 
     filt = LD_SH(filter_vert);
     SPLATI_H4_SH(filt, 0, 1, 2, 3, filt_vt0, filt_vt1, filt_vt2, filt_vt3);
@@ -1619,7 +1618,7 @@
         SAT_SH2_SH(res0, res1, 7);
         res = PCKEV_XORI128_UB(res0, res1);
         res = (v16u8) __msa_aver_u_b(res, dst0);
-        ST4x4_UB(res, res, 0, 1, 2, 3, dst, dst_stride);
+        ST_W4(res, 0, 1, 2, 3, dst, dst_stride);
         dst += (4 * dst_stride);
 
         hz_out5 = hz_out9;
@@ -1812,7 +1811,8 @@
     DOTP_UB2_UH(vec0, vec1, filt0, filt0, vec2, vec3);
     SRARI_H2_UH(vec2, vec3, 7);
     PCKEV_B2_UB(vec2, vec2, vec3, vec3, res0, res1);
-    ST4x4_UB(res0, res1, 0, 1, 0, 1, dst, dst_stride);
+    ST_W2(res0, 0, 1, dst, dst_stride);
+    ST_W2(res1, 0, 1, dst + 2 * dst_stride, dst_stride);
 }
 
 static void common_hz_2t_4x8_msa(const uint8_t *src, int32_t src_stride,
@@ -1838,9 +1838,10 @@
     SRARI_H4_UH(vec4, vec5, vec6, vec7, 7);
     PCKEV_B4_SB(vec4, vec4, vec5, vec5, vec6, vec6, vec7, vec7,
                 res0, res1, res2, res3);
-    ST4x4_UB(res0, res1, 0, 1, 0, 1, dst, dst_stride);
-    dst += (4 * dst_stride);
-    ST4x4_UB(res2, res3, 0, 1, 0, 1, dst, dst_stride);
+    ST_W2(res0, 0, 1, dst, dst_stride);
+    ST_W2(res1, 0, 1, dst + 2 * dst_stride, dst_stride);
+    ST_W2(res2, 0, 1, dst + 4 * dst_stride, dst_stride);
+    ST_W2(res3, 0, 1, dst + 6 * dst_stride, dst_stride);
 }
 
 void ff_put_bilin_4h_msa(uint8_t *dst, ptrdiff_t dst_stride,
@@ -1877,7 +1878,7 @@
                 vec0, vec1, vec2, vec3);
     SRARI_H4_UH(vec0, vec1, vec2, vec3, 7);
     PCKEV_B2_SB(vec1, vec0, vec3, vec2, src0, src1);
-    ST8x4_UB(src0, src1, dst, dst_stride);
+    ST_D4(src0, src1, 0, 1, 0, 1, dst, dst_stride);
 }
 
 static void common_hz_2t_8x8mult_msa(const uint8_t *src, int32_t src_stride,
@@ -1906,8 +1907,7 @@
     src += (4 * src_stride);
 
     PCKEV_B2_SB(vec1, vec0, vec3, vec2, out0, out1);
-    ST8x4_UB(out0, out1, dst, dst_stride);
-    dst += (4 * dst_stride);
+    ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
 
     VSHF_B2_UH(src0, src0, src1, src1, mask, mask, vec0, vec1);
     VSHF_B2_UH(src2, src2, src3, src3, mask, mask, vec2, vec3);
@@ -1915,8 +1915,8 @@
                 vec0, vec1, vec2, vec3);
     SRARI_H4_UH(vec0, vec1, vec2, vec3, 7);
     PCKEV_B2_SB(vec1, vec0, vec3, vec2, out0, out1);
-    ST8x4_UB(out0, out1, dst, dst_stride);
-    dst += (4 * dst_stride);
+    ST_D4(out0, out1, 0, 1, 0, 1, dst + 4 * dst_stride, dst_stride);
+    dst += (8 * dst_stride);
 
     if (16 == height) {
         LD_SB4(src, src_stride, src0, src1, src2, src3);
@@ -1931,7 +1931,7 @@
         src += (4 * src_stride);
 
         PCKEV_B2_SB(vec1, vec0, vec3, vec2, out0, out1);
-        ST8x4_UB(out0, out1, dst, dst_stride);
+        ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
 
         VSHF_B2_UH(src0, src0, src1, src1, mask, mask, vec0, vec1);
         VSHF_B2_UH(src2, src2, src3, src3, mask, mask, vec2, vec3);
@@ -1939,7 +1939,7 @@
                     vec0, vec1, vec2, vec3);
         SRARI_H4_UH(vec0, vec1, vec2, vec3, 7);
         PCKEV_B2_SB(vec1, vec0, vec3, vec2, out0, out1);
-        ST8x4_UB(out0, out1, dst + 4 * dst_stride, dst_stride);
+        ST_D4(out0, out1, 0, 1, 0, 1, dst + 4 * dst_stride, dst_stride);
     }
 }
 
@@ -2093,7 +2093,7 @@
         src4 = LD_SB(src + 32);
         src6 = LD_SB(src + 48);
         src7 = LD_SB(src + 56);
-        SLDI_B3_SB(src2, src4, src6, src0, src2, src4, src1, src3, src5, 8);
+        SLDI_B3_SB(src2, src0, src4, src2, src6, src4, 8, src1, src3, src5);
         src += src_stride;
 
         VSHF_B2_UB(src0, src0, src1, src1, mask, mask, vec0, vec1);
@@ -2137,7 +2137,7 @@
     SRARI_H2_UH(tmp0, tmp1, 7);
     SAT_UH2_UH(tmp0, tmp1, 7);
     src2110 = __msa_pckev_b((v16i8) tmp1, (v16i8) tmp0);
-    ST4x4_UB(src2110, src2110, 0, 1, 2, 3, dst, dst_stride);
+    ST_W4(src2110, 0, 1, 2, 3, dst, dst_stride);
 }
 
 static void common_vt_2t_4x8_msa(const uint8_t *src, int32_t src_stride,
@@ -2171,8 +2171,7 @@
     SRARI_H4_UH(tmp0, tmp1, tmp2, tmp3, 7);
     SAT_UH4_UH(tmp0, tmp1, tmp2, tmp3, 7);
     PCKEV_B2_SB(tmp1, tmp0, tmp3, tmp2, src2110, src4332);
-    ST4x4_UB(src2110, src2110, 0, 1, 2, 3, dst, dst_stride);
-    ST4x4_UB(src4332, src4332, 0, 1, 2, 3, dst + 4 * dst_stride, dst_stride);
+    ST_W8(src2110, src4332, 0, 1, 2, 3, 0, 1, 2, 3, dst, dst_stride);
 }
 
 void ff_put_bilin_4v_msa(uint8_t *dst, ptrdiff_t dst_stride,
@@ -2209,7 +2208,7 @@
     SRARI_H4_UH(tmp0, tmp1, tmp2, tmp3, 7);
     SAT_UH4_UH(tmp0, tmp1, tmp2, tmp3, 7);
     PCKEV_B2_SB(tmp1, tmp0, tmp3, tmp2, out0, out1);
-    ST8x4_UB(out0, out1, dst, dst_stride);
+    ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
 }
 
 static void common_vt_2t_8x8mult_msa(const uint8_t *src, int32_t src_stride,
@@ -2243,16 +2242,15 @@
         SRARI_H4_UH(tmp0, tmp1, tmp2, tmp3, 7);
         SAT_UH4_UH(tmp0, tmp1, tmp2, tmp3, 7);
         PCKEV_B2_SB(tmp1, tmp0, tmp3, tmp2, out0, out1);
-        ST8x4_UB(out0, out1, dst, dst_stride);
-        dst += (4 * dst_stride);
+        ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
 
         DOTP_UB4_UH(vec4, vec5, vec6, vec7, filt0, filt0, filt0, filt0,
                     tmp0, tmp1, tmp2, tmp3);
         SRARI_H4_UH(tmp0, tmp1, tmp2, tmp3, 7);
         SAT_UH4_UH(tmp0, tmp1, tmp2, tmp3, 7);
         PCKEV_B2_SB(tmp1, tmp0, tmp3, tmp2, out0, out1);
-        ST8x4_UB(out0, out1, dst, dst_stride);
-        dst += (4 * dst_stride);
+        ST_D4(out0, out1, 0, 1, 0, 1, dst + 4 * dst_stride, dst_stride);
+        dst += (8 * dst_stride);
 
         src0 = src8;
     }
@@ -2514,7 +2512,8 @@
     SRARI_H2_UH(tmp0, tmp1, 7);
     SAT_UH2_UH(tmp0, tmp1, 7);
     PCKEV_B2_UB(tmp0, tmp0, tmp1, tmp1, res0, res1);
-    ST4x4_UB(res0, res1, 0, 1, 0, 1, dst, dst_stride);
+    ST_W2(res0, 0, 1, dst, dst_stride);
+    ST_W2(res1, 0, 1, dst + 2 * dst_stride, dst_stride);
 }
 
 static void common_hv_2ht_2vt_4x8_msa(const uint8_t *src, int32_t src_stride,
@@ -2545,8 +2544,8 @@
     hz_out4 = HORIZ_2TAP_FILT_UH(src4, src5, mask, filt_hz, 7);
     hz_out6 = HORIZ_2TAP_FILT_UH(src6, src7, mask, filt_hz, 7);
     hz_out8 = HORIZ_2TAP_FILT_UH(src8, src8, mask, filt_hz, 7);
-    SLDI_B3_UH(hz_out2, hz_out4, hz_out6, hz_out0, hz_out2, hz_out4, hz_out1,
-               hz_out3, hz_out5, 8);
+    SLDI_B3_UH(hz_out2, hz_out0, hz_out4, hz_out2, hz_out6, hz_out4, 8, hz_out1,
+               hz_out3, hz_out5);
     hz_out7 = (v8u16) __msa_pckod_d((v2i64) hz_out8, (v2i64) hz_out6);
 
     ILVEV_B2_UB(hz_out0, hz_out1, hz_out2, hz_out3, vec0, vec1);
@@ -2557,9 +2556,10 @@
     SAT_UH4_UH(vec4, vec5, vec6, vec7, 7);
     PCKEV_B4_SB(vec4, vec4, vec5, vec5, vec6, vec6, vec7, vec7,
                 res0, res1, res2, res3);
-    ST4x4_UB(res0, res1, 0, 1, 0, 1, dst, dst_stride);
-    dst += (4 * dst_stride);
-    ST4x4_UB(res2, res3, 0, 1, 0, 1, dst, dst_stride);
+    ST_W2(res0, 0, 1, dst, dst_stride);
+    ST_W2(res1, 0, 1, dst + 2 * dst_stride, dst_stride);
+    ST_W2(res2, 0, 1, dst + 4 * dst_stride, dst_stride);
+    ST_W2(res3, 0, 1, dst + 6 * dst_stride, dst_stride);
 }
 
 void ff_put_bilin_4hv_msa(uint8_t *dst, ptrdiff_t dst_stride,
@@ -2618,7 +2618,7 @@
     SRARI_H4_UH(tmp0, tmp1, tmp2, tmp3, 7);
     SAT_UH4_UH(tmp0, tmp1, tmp2, tmp3, 7);
     PCKEV_B2_SB(tmp1, tmp0, tmp3, tmp2, out0, out1);
-    ST8x4_UB(out0, out1, dst, dst_stride);
+    ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
 }
 
 static void common_hv_2ht_2vt_8x8mult_msa(const uint8_t *src, int32_t src_stride,
@@ -2674,8 +2674,7 @@
         SRARI_H2_UH(tmp3, tmp4, 7);
         SAT_UH2_UH(tmp3, tmp4, 7);
         PCKEV_B2_SB(tmp2, tmp1, tmp4, tmp3, out0, out1);
-        ST8x4_UB(out0, out1, dst, dst_stride);
-        dst += (4 * dst_stride);
+        ST_D4(out0, out1, 0, 1, 0, 1, dst, dst_stride);
 
         hz_out1 = HORIZ_2TAP_FILT_UH(src1, src1, mask, filt_hz, 7);
         vec0 = (v16u8) __msa_ilvev_b((v16i8) hz_out1, (v16i8) hz_out0);
@@ -2696,8 +2695,8 @@
         SRARI_H4_UH(tmp5, tmp6, tmp7, tmp8, 7);
         SAT_UH4_UH(tmp5, tmp6, tmp7, tmp8, 7);
         PCKEV_B2_SB(tmp6, tmp5, tmp8, tmp7, out0, out1);
-        ST8x4_UB(out0, out1, dst, dst_stride);
-        dst += (4 * dst_stride);
+        ST_D4(out0, out1, 0, 1, 0, 1, dst + 4 * dst_stride, dst_stride);
+        dst += (8 * dst_stride);
     }
 }
 
@@ -2842,7 +2841,7 @@
     res = (v16u8) __msa_pckev_b((v16i8) vec3, (v16i8) vec2);
     res = (v16u8) __msa_aver_u_b(res, dst0);
 
-    ST4x4_UB(res, res, 0, 1, 2, 3, dst, dst_stride);
+    ST_W4(res, 0, 1, 2, 3, dst, dst_stride);
 }
 
 static void common_hz_2t_and_aver_dst_4x8_msa(const uint8_t *src,
@@ -2876,7 +2875,7 @@
                 res2, res3);
     ILVR_D2_UB(res1, res0, res3, res2, res0, res2);
     AVER_UB2_UB(res0, dst0, res2, dst1, res0, res2);
-    ST4x8_UB(res0, res2, dst, dst_stride);
+    ST_W8(res0, res2, 0, 1, 2, 3, 0, 1, 2, 3, dst, dst_stride);
 }
 
 void ff_avg_bilin_4h_msa(uint8_t *dst, ptrdiff_t dst_stride,
@@ -3147,7 +3146,7 @@
     for (loop_cnt = height; loop_cnt--;) {
         LD_SB4(src, 16, src0, src2, src4, src6);
         src7 = LD_SB(src + 56);
-        SLDI_B3_SB(src2, src4, src6, src0, src2, src4, src1, src3, src5, 8);
+        SLDI_B3_SB(src2, src0, src4, src2, src6, src4, 8, src1, src3, src5);
         src += src_stride;
 
         VSHF_B2_UB(src0, src0, src1, src1, mask, mask, vec0, vec1);
@@ -3202,7 +3201,7 @@
     out = (v16u8) __msa_pckev_b((v16i8) tmp1, (v16i8) tmp0);
     out = __msa_aver_u_b(out, dst0);
 
-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
+    ST_W4(out, 0, 1, 2, 3, dst, dst_stride);
 }
 
 static void common_vt_2t_and_aver_dst_4x8_msa(const uint8_t *src,
@@ -3241,7 +3240,7 @@
     SAT_UH4_UH(tmp0, tmp1, tmp2, tmp3, 7);
     PCKEV_B2_UB(tmp1, tmp0, tmp3, tmp2, src2110, src4332);
     AVER_UB2_UB(src2110, dst0, src4332, dst1, src2110, src4332);
-    ST4x8_UB(src2110, src4332, dst, dst_stride);
+    ST_W8(src2110, src4332, 0, 1, 2, 3, 0, 1, 2, 3, dst, dst_stride);
 }
 
 void ff_avg_bilin_4v_msa(uint8_t *dst, ptrdiff_t dst_stride,
@@ -3620,7 +3619,7 @@
     out = (v16u8) __msa_pckev_b((v16i8) tmp1, (v16i8) tmp0);
     out = __msa_aver_u_b(out, dst0);
 
-    ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
+    ST_W4(out, 0, 1, 2, 3, dst, dst_stride);
 }
 
 static void common_hv_2ht_2vt_and_aver_dst_4x8_msa(const uint8_t *src,
@@ -3656,8 +3655,8 @@
     hz_out4 = HORIZ_2TAP_FILT_UH(src4, src5, mask, filt_hz, 7);
     hz_out6 = HORIZ_2TAP_FILT_UH(src6, src7, mask, filt_hz, 7);
     hz_out8 = HORIZ_2TAP_FILT_UH(src8, src8, mask, filt_hz, 7);
-    SLDI_B3_UH(hz_out2, hz_out4, hz_out6, hz_out0, hz_out2, hz_out4, hz_out1,
-               hz_out3, hz_out5, 8);
+    SLDI_B3_UH(hz_out2, hz_out0, hz_out4, hz_out2, hz_out6, hz_out4, 8, hz_out1,
+               hz_out3, hz_out5);
     hz_out7 = (v8u16) __msa_pckod_d((v2i64) hz_out8, (v2i64) hz_out6);
 
     LW4(dst, dst_stride, tp0, tp1, tp2, tp3);
@@ -3672,7 +3671,7 @@
     SAT_UH4_UH(tmp0, tmp1, tmp2, tmp3, 7);
     PCKEV_B2_UB(tmp1, tmp0, tmp3, tmp2, res0, res1);
     AVER_UB2_UB(res0, dst0, res1, dst1, res0, res1);
-    ST4x8_UB(res0, res1, dst, dst_stride);
+    ST_W8(res0, res1, 0, 1, 2, 3, 0, 1, 2, 3, dst, dst_stride);
 }
 
 void ff_avg_bilin_4hv_msa(uint8_t *dst, ptrdiff_t dst_stride,
@@ -4071,14 +4070,14 @@
         LW4(dst + 4 * dst_stride, dst_stride, tp0, tp1, tp2, tp3);
         INSERT_W4_UB(tp0, tp1, tp2, tp3, dst1);
         AVER_UB2_UB(src0, dst0, src1, dst1, dst0, dst1);
-        ST4x8_UB(dst0, dst1, dst, dst_stride);
+        ST_W8(dst0, dst1, 0, 1, 2, 3, 0, 1, 2, 3, dst, dst_stride);
     } else if (4 == height) {
         LW4(src, src_stride, tp0, tp1, tp2, tp3);
         INSERT_W4_UB(tp0, tp1, tp2, tp3, src0);
         LW4(dst, dst_stride, tp0, tp1, tp2, tp3);
         INSERT_W4_UB(tp0, tp1, tp2, tp3, dst0);
         dst0 = __msa_aver_u_b(src0, dst0);
-        ST4x4_UB(dst0, dst0, 0, 1, 2, 3, dst, dst_stride);
+        ST_W4(dst0, 0, 1, 2, 3, dst, dst_stride);
     }
 }
 
@@ -4109,7 +4108,7 @@
             INSERT_D2_UB(tp6, tp7, dst3);
             AVER_UB4_UB(src0, dst0, src1, dst1, src2, dst2, src3, dst3, dst0,
                         dst1, dst2, dst3);
-            ST8x8_UB(dst0, dst1, dst2, dst3, dst, dst_stride);
+            ST_D8(dst0, dst1, dst2, dst3, 0, 1, 0, 1, 0, 1, 0, 1, dst, dst_stride);
             dst += 8 * dst_stride;
         }
     } else if (4 == height) {
@@ -4120,7 +4119,7 @@
         INSERT_D2_UB(tp0, tp1, dst0);
         INSERT_D2_UB(tp2, tp3, dst1);
         AVER_UB2_UB(src0, dst0, src1, dst1, dst0, dst1);
-        ST8x4_UB(dst0, dst1, dst, dst_stride);
+        ST_D4(dst0, dst1, 0, 1, 0, 1, dst, dst_stride);
     }
 }
 
diff --git a/libavcodec/mips/vp9dsp_init_mips.c b/libavcodec/mips/vp9dsp_init_mips.c
index c8a4890..5990fa6 100644
--- a/libavcodec/mips/vp9dsp_init_mips.c
+++ b/libavcodec/mips/vp9dsp_init_mips.c
@@ -168,8 +168,50 @@
 }
 #endif  // #if HAVE_MSA
 
+#if HAVE_MMI
+static av_cold void vp9dsp_mc_init_mmi(VP9DSPContext *dsp)
+{
+#define init_subpel1(idx1, idx2, idxh, idxv, sz, dir, type)  \
+    dsp->mc[idx1][FILTER_8TAP_SMOOTH ][idx2][idxh][idxv] =   \
+        ff_##type##_8tap_smooth_##sz##dir##_mmi;             \
+    dsp->mc[idx1][FILTER_8TAP_REGULAR][idx2][idxh][idxv] =   \
+        ff_##type##_8tap_regular_##sz##dir##_mmi;            \
+    dsp->mc[idx1][FILTER_8TAP_SHARP  ][idx2][idxh][idxv] =   \
+        ff_##type##_8tap_sharp_##sz##dir##_mmi;
+
+#define init_subpel2(idx, idxh, idxv, dir, type)      \
+    init_subpel1(0, idx, idxh, idxv, 64, dir, type);  \
+    init_subpel1(1, idx, idxh, idxv, 32, dir, type);  \
+    init_subpel1(2, idx, idxh, idxv, 16, dir, type);  \
+    init_subpel1(3, idx, idxh, idxv,  8, dir, type);  \
+    init_subpel1(4, idx, idxh, idxv,  4, dir, type)
+
+#define init_subpel3(idx, type)         \
+    init_subpel2(idx, 1, 1, hv, type);  \
+    init_subpel2(idx, 0, 1, v, type);   \
+    init_subpel2(idx, 1, 0, h, type)
+
+    init_subpel3(0, put);
+    init_subpel3(1, avg);
+
+#undef init_subpel1
+#undef init_subpel2
+#undef init_subpel3
+}
+
+static av_cold void vp9dsp_init_mmi(VP9DSPContext *dsp, int bpp)
+{
+    if (bpp == 8) {
+        vp9dsp_mc_init_mmi(dsp);
+    }
+}
+#endif  // #if HAVE_MMI
+
 av_cold void ff_vp9dsp_init_mips(VP9DSPContext *dsp, int bpp)
 {
+#if HAVE_MMI
+    vp9dsp_init_mmi(dsp, bpp);
+#endif  // #if HAVE_MMI
 #if HAVE_MSA
     vp9dsp_init_msa(dsp, bpp);
 #endif  // #if HAVE_MSA
diff --git a/libavcodec/mips/vp9dsp_mips.h b/libavcodec/mips/vp9dsp_mips.h
index 4d73038..0b6ce7c 100644
--- a/libavcodec/mips/vp9dsp_mips.h
+++ b/libavcodec/mips/vp9dsp_mips.h
@@ -234,4 +234,54 @@
 void ff_tm_32x32_msa(uint8_t *dst, ptrdiff_t stride, const uint8_t *left,
                      const uint8_t *top);
 
+#define VP9_8TAP_MIPS_MMI_FUNC(SIZE, type, type_idx)                         \
+void ff_put_8tap_##type##_##SIZE##h_mmi(uint8_t *dst, ptrdiff_t dststride,   \
+                                        const uint8_t *src,                  \
+                                        ptrdiff_t srcstride,                 \
+                                        int h, int mx, int my);              \
+                                                                             \
+void ff_put_8tap_##type##_##SIZE##v_mmi(uint8_t *dst, ptrdiff_t dststride,   \
+                                        const uint8_t *src,                  \
+                                        ptrdiff_t srcstride,                 \
+                                        int h, int mx, int my);              \
+                                                                             \
+void ff_put_8tap_##type##_##SIZE##hv_mmi(uint8_t *dst, ptrdiff_t dststride,  \
+                                         const uint8_t *src,                 \
+                                         ptrdiff_t srcstride,                \
+                                         int h, int mx, int my);             \
+                                                                             \
+void ff_avg_8tap_##type##_##SIZE##h_mmi(uint8_t *dst, ptrdiff_t dststride,   \
+                                        const uint8_t *src,                  \
+                                        ptrdiff_t srcstride,                 \
+                                        int h, int mx, int my);              \
+                                                                             \
+void ff_avg_8tap_##type##_##SIZE##v_mmi(uint8_t *dst, ptrdiff_t dststride,   \
+                                        const uint8_t *src,                  \
+                                        ptrdiff_t srcstride,                 \
+                                        int h, int mx, int my);              \
+                                                                             \
+void ff_avg_8tap_##type##_##SIZE##hv_mmi(uint8_t *dst, ptrdiff_t dststride,  \
+                                         const uint8_t *src,                 \
+                                         ptrdiff_t srcstride,                \
+                                         int h, int mx, int my);
+
+VP9_8TAP_MIPS_MMI_FUNC(64, regular, FILTER_8TAP_REGULAR);
+VP9_8TAP_MIPS_MMI_FUNC(32, regular, FILTER_8TAP_REGULAR);
+VP9_8TAP_MIPS_MMI_FUNC(16, regular, FILTER_8TAP_REGULAR);
+VP9_8TAP_MIPS_MMI_FUNC(8, regular, FILTER_8TAP_REGULAR);
+VP9_8TAP_MIPS_MMI_FUNC(4, regular, FILTER_8TAP_REGULAR);
+
+VP9_8TAP_MIPS_MMI_FUNC(64, sharp, FILTER_8TAP_SHARP);
+VP9_8TAP_MIPS_MMI_FUNC(32, sharp, FILTER_8TAP_SHARP);
+VP9_8TAP_MIPS_MMI_FUNC(16, sharp, FILTER_8TAP_SHARP);
+VP9_8TAP_MIPS_MMI_FUNC(8, sharp, FILTER_8TAP_SHARP);
+VP9_8TAP_MIPS_MMI_FUNC(4, sharp, FILTER_8TAP_SHARP);
+
+VP9_8TAP_MIPS_MMI_FUNC(64, smooth, FILTER_8TAP_SMOOTH);
+VP9_8TAP_MIPS_MMI_FUNC(32, smooth, FILTER_8TAP_SMOOTH);
+VP9_8TAP_MIPS_MMI_FUNC(16, smooth, FILTER_8TAP_SMOOTH);
+VP9_8TAP_MIPS_MMI_FUNC(8, smooth, FILTER_8TAP_SMOOTH);
+VP9_8TAP_MIPS_MMI_FUNC(4, smooth, FILTER_8TAP_SMOOTH);
+#undef VP9_8TAP_MIPS_MMI_FUNC
+
 #endif  // #ifndef AVCODEC_MIPS_VP9DSP_MIPS_H
diff --git a/libavcodec/mjpeg2jpeg_bsf.c b/libavcodec/mjpeg2jpeg_bsf.c
index 6f02bc0..76605b2 100644
--- a/libavcodec/mjpeg2jpeg_bsf.c
+++ b/libavcodec/mjpeg2jpeg_bsf.c
@@ -27,7 +27,6 @@
 #include <string.h>
 
 #include "libavutil/error.h"
-#include "libavutil/mem.h"
 #include "libavutil/intreadwrite.h"
 
 #include "avcodec.h"
diff --git a/libavcodec/mjpeg_parser.c b/libavcodec/mjpeg_parser.c
index 07a6b2b..c642b2e 100644
--- a/libavcodec/mjpeg_parser.c
+++ b/libavcodec/mjpeg_parser.c
@@ -50,7 +50,7 @@
         for(i=0; i<buf_size;){
             state= (state<<8) | buf[i];
             if(state>=0xFFC00000 && state<=0xFFFEFFFF){
-                if(state>=0xFFD80000 && state<=0xFFD8FFFF){
+                if(state>=0xFFD8FFC0 && state<=0xFFD8FFFF){
                     i++;
                     vop_found=1;
                     break;
@@ -76,12 +76,14 @@
         for(; i<buf_size;){
             state= (state<<8) | buf[i];
             if(state>=0xFFC00000 && state<=0xFFFEFFFF){
-                if(state>=0xFFD80000 && state<=0xFFD8FFFF){
+                if(state>=0xFFD8FFC0 && state<=0xFFD8FFFF){
                     pc->frame_start_found=0;
                     pc->state=0;
                     return i-3;
                 } else if(state<0xFFD00000 || state>0xFFD9FFFF){
                     m->size= (state&0xFFFF)-1;
+                    if (m->size >= 0x8000)
+                        m->size = 0;
                 }
             }
             if(m->size>0){
diff --git a/libavcodec/mjpegbdec.c b/libavcodec/mjpegbdec.c
index a858707..70ff4cf 100644
--- a/libavcodec/mjpegbdec.c
+++ b/libavcodec/mjpegbdec.c
@@ -56,6 +56,7 @@
     buf_ptr = buf;
     buf_end = buf + buf_size;
     s->got_picture = 0;
+    s->adobe_transform = -1;
 
 read_header:
     /* reset on every SOI */
@@ -70,8 +71,7 @@
 
     skip_bits(&hgb, 32); /* reserved zeros */
 
-    if (get_bits_long(&hgb, 32) != MKBETAG('m','j','p','g'))
-    {
+    if (get_bits_long(&hgb, 32) != MKBETAG('m','j','p','g')) {
         av_log(avctx, AV_LOG_WARNING, "not mjpeg-b (bad fourcc)\n");
         return AVERROR_INVALIDDATA;
     }
@@ -85,19 +85,17 @@
 
     dqt_offs = read_offs(avctx, &hgb, buf_end - buf_ptr, "dqt is %d and size is %d\n");
     av_log(avctx, AV_LOG_DEBUG, "dqt offs: 0x%"PRIx32"\n", dqt_offs);
-    if (dqt_offs)
-    {
+    if (dqt_offs) {
         init_get_bits(&s->gb, buf_ptr+dqt_offs, (buf_end - (buf_ptr+dqt_offs))*8);
         s->start_code = DQT;
-        if (ff_mjpeg_decode_dqt(s) < 0 &&
-            (avctx->err_recognition & AV_EF_EXPLODE))
-          return AVERROR_INVALIDDATA;
+        ret = ff_mjpeg_decode_dqt(s);
+        if (ret < 0 && (avctx->err_recognition & AV_EF_EXPLODE))
+            return ret;
     }
 
     dht_offs = read_offs(avctx, &hgb, buf_end - buf_ptr, "dht is %d and size is %d\n");
     av_log(avctx, AV_LOG_DEBUG, "dht offs: 0x%"PRIx32"\n", dht_offs);
-    if (dht_offs)
-    {
+    if (dht_offs) {
         init_get_bits(&s->gb, buf_ptr+dht_offs, (buf_end - (buf_ptr+dht_offs))*8);
         s->start_code = DHT;
         ff_mjpeg_decode_dht(s);
@@ -105,37 +103,34 @@
 
     sof_offs = read_offs(avctx, &hgb, buf_end - buf_ptr, "sof is %d and size is %d\n");
     av_log(avctx, AV_LOG_DEBUG, "sof offs: 0x%"PRIx32"\n", sof_offs);
-    if (sof_offs)
-    {
+    if (sof_offs) {
         init_get_bits(&s->gb, buf_ptr+sof_offs, (buf_end - (buf_ptr+sof_offs))*8);
         s->start_code = SOF0;
-        if (ff_mjpeg_decode_sof(s) < 0)
-            return -1;
+        if ((ret = ff_mjpeg_decode_sof(s)) < 0)
+            return ret;
     }
 
     sos_offs = read_offs(avctx, &hgb, buf_end - buf_ptr, "sos is %d and size is %d\n");
     av_log(avctx, AV_LOG_DEBUG, "sos offs: 0x%"PRIx32"\n", sos_offs);
     sod_offs = read_offs(avctx, &hgb, buf_end - buf_ptr, "sof is %d and size is %d\n");
     av_log(avctx, AV_LOG_DEBUG, "sod offs: 0x%"PRIx32"\n", sod_offs);
-    if (sos_offs)
-    {
+    if (sos_offs) {
         init_get_bits(&s->gb, buf_ptr + sos_offs,
                       8 * FFMIN(field_size, buf_end - buf_ptr - sos_offs));
         s->mjpb_skiptosod = (sod_offs - sos_offs - show_bits(&s->gb, 16));
         s->start_code = SOS;
-        if (ff_mjpeg_decode_sos(s, NULL, 0, NULL) < 0 &&
-            (avctx->err_recognition & AV_EF_EXPLODE))
-          return AVERROR_INVALIDDATA;
+        ret = ff_mjpeg_decode_sos(s, NULL, 0, NULL);
+        if (ret < 0 && (avctx->err_recognition & AV_EF_EXPLODE))
+            return ret;
     }
 
     if (s->interlaced) {
         s->bottom_field ^= 1;
         /* if not bottom field, do not output image yet */
-        if (s->bottom_field != s->interlace_polarity && second_field_offs)
-        {
+        if (s->bottom_field != s->interlace_polarity && second_field_offs) {
             buf_ptr = buf + second_field_offs;
             goto read_header;
-            }
+        }
     }
 
     //XXX FIXME factorize, this looks very similar to the EOI code
diff --git a/libavcodec/mjpegdec.c b/libavcodec/mjpegdec.c
index 35ee10d..d5e7c21 100644
--- a/libavcodec/mjpegdec.c
+++ b/libavcodec/mjpegdec.c
@@ -43,6 +43,7 @@
 #include "mjpeg.h"
 #include "mjpegdec.h"
 #include "jpeglsdec.h"
+#include "profiles.h"
 #include "put_bits.h"
 #include "tiff.h"
 #include "exif.h"
@@ -72,34 +73,45 @@
                               huff_code, 2, 2, huff_sym, 2, 2, use_static);
 }
 
-static int build_basic_mjpeg_vlc(MJpegDecodeContext *s)
+static int init_default_huffman_tables(MJpegDecodeContext *s)
 {
-    int ret;
+    static const struct {
+        int class;
+        int index;
+        const uint8_t *bits;
+        const uint8_t *values;
+        int codes;
+        int length;
+    } ht[] = {
+        { 0, 0, avpriv_mjpeg_bits_dc_luminance,
+                avpriv_mjpeg_val_dc, 12, 12 },
+        { 0, 1, avpriv_mjpeg_bits_dc_chrominance,
+                avpriv_mjpeg_val_dc, 12, 12 },
+        { 1, 0, avpriv_mjpeg_bits_ac_luminance,
+                avpriv_mjpeg_val_ac_luminance,   251, 162 },
+        { 1, 1, avpriv_mjpeg_bits_ac_chrominance,
+                avpriv_mjpeg_val_ac_chrominance, 251, 162 },
+        { 2, 0, avpriv_mjpeg_bits_ac_luminance,
+                avpriv_mjpeg_val_ac_luminance,   251, 162 },
+        { 2, 1, avpriv_mjpeg_bits_ac_chrominance,
+                avpriv_mjpeg_val_ac_chrominance, 251, 162 },
+    };
+    int i, ret;
 
-    if ((ret = build_vlc(&s->vlcs[0][0], avpriv_mjpeg_bits_dc_luminance,
-                         avpriv_mjpeg_val_dc, 12, 0, 0)) < 0)
-        return ret;
+    for (i = 0; i < FF_ARRAY_ELEMS(ht); i++) {
+        ret = build_vlc(&s->vlcs[ht[i].class][ht[i].index],
+                        ht[i].bits, ht[i].values, ht[i].codes,
+                        0, ht[i].class == 1);
+        if (ret < 0)
+            return ret;
 
-    if ((ret = build_vlc(&s->vlcs[0][1], avpriv_mjpeg_bits_dc_chrominance,
-                         avpriv_mjpeg_val_dc, 12, 0, 0)) < 0)
-        return ret;
-
-    if ((ret = build_vlc(&s->vlcs[1][0], avpriv_mjpeg_bits_ac_luminance,
-                         avpriv_mjpeg_val_ac_luminance, 251, 0, 1)) < 0)
-        return ret;
-
-    if ((ret = build_vlc(&s->vlcs[1][1], avpriv_mjpeg_bits_ac_chrominance,
-                         avpriv_mjpeg_val_ac_chrominance, 251, 0, 1)) < 0)
-        return ret;
-
-    if ((ret = build_vlc(&s->vlcs[2][0], avpriv_mjpeg_bits_ac_luminance,
-                         avpriv_mjpeg_val_ac_luminance, 251, 0, 0)) < 0)
-        return ret;
-
-    if ((ret = build_vlc(&s->vlcs[2][1], avpriv_mjpeg_bits_ac_chrominance,
-                         avpriv_mjpeg_val_ac_chrominance, 251, 0, 0)) < 0)
-        return ret;
-
+        if (ht[i].class < 2) {
+            memcpy(s->raw_huffman_lengths[ht[i].class][ht[i].index],
+                   ht[i].bits + 1, 16);
+            memcpy(s->raw_huffman_values[ht[i].class][ht[i].index],
+                   ht[i].values, ht[i].length);
+        }
+    }
 
     return 0;
 }
@@ -150,7 +162,7 @@
     avctx->colorspace = AVCOL_SPC_BT470BG;
     s->hwaccel_pix_fmt = s->hwaccel_sw_pix_fmt = AV_PIX_FMT_NONE;
 
-    if ((ret = build_basic_mjpeg_vlc(s)) < 0)
+    if ((ret = init_default_huffman_tables(s)) < 0)
         return ret;
 
     if (s->extern_huff) {
@@ -160,7 +172,7 @@
         if (ff_mjpeg_decode_dht(s)) {
             av_log(avctx, AV_LOG_ERROR,
                    "error using external huffman table, switching back to internal\n");
-            build_basic_mjpeg_vlc(s);
+            init_default_huffman_tables(s);
         }
     }
     if (avctx->field_order == AV_FIELD_BB) { /* quicktime icefloe 019 */
@@ -301,7 +313,6 @@
     memset(s->upscale_h, 0, sizeof(s->upscale_h));
     memset(s->upscale_v, 0, sizeof(s->upscale_v));
 
-    /* XXX: verify len field validity */
     len     = get_bits(&s->gb, 16);
     bits    = get_bits(&s->gb, 8);
 
@@ -355,6 +366,11 @@
                                       "bits/component or 16-bit gray");
         return AVERROR_PATCHWELCOME;
     }
+    if (len != 8 + 3 * nb_components) {
+        av_log(s->avctx, AV_LOG_ERROR, "decode_sof0: error, len(%d) mismatch %d components\n", len, nb_components);
+        return AVERROR_INVALIDDATA;
+    }
+
     s->nb_components = nb_components;
     s->h_max         = 1;
     s->v_max         = 1;
@@ -396,6 +412,18 @@
         return AVERROR_PATCHWELCOME;
     }
 
+    if (s->bayer) {
+        if (nb_components == 2) {
+            /* Bayer images embedded in DNGs can contain 2 interleaved components and the
+               width stored in their SOF3 markers is the width of each one.  We only output
+               a single component, therefore we need to adjust the output image width.  We
+               handle the deinterleaving (but not the debayering) in this file. */
+            width *= 2;
+        }
+        /* They can also contain 1 component, which is double the width and half the height
+            of the final image (rows are interleaved).  We don't handle the decoding in this
+            file, but leave that to the TIFF/DNG decoder. */
+    }
 
     /* if different size, realloc/alloc picture */
     if (width != s->width || height != s->height || bits != s->bits ||
@@ -437,269 +465,275 @@
             avpriv_request_sample(s->avctx, "progressively coded interlaced picture");
             return AVERROR_INVALIDDATA;
         }
-    } else{
+    } else {
         if (s->v_max == 1 && s->h_max == 1 && s->lossless==1 && (nb_components==3 || nb_components==4))
             s->rgb = 1;
         else if (!s->lossless)
             s->rgb = 0;
-    /* XXX: not complete test ! */
-    pix_fmt_id = ((unsigned)s->h_count[0] << 28) | (s->v_count[0] << 24) |
-                 (s->h_count[1] << 20) | (s->v_count[1] << 16) |
-                 (s->h_count[2] << 12) | (s->v_count[2] <<  8) |
-                 (s->h_count[3] <<  4) |  s->v_count[3];
-    av_log(s->avctx, AV_LOG_DEBUG, "pix fmt id %x\n", pix_fmt_id);
-    /* NOTE we do not allocate pictures large enough for the possible
-     * padding of h/v_count being 4 */
-    if (!(pix_fmt_id & 0xD0D0D0D0))
-        pix_fmt_id -= (pix_fmt_id & 0xF0F0F0F0) >> 1;
-    if (!(pix_fmt_id & 0x0D0D0D0D))
-        pix_fmt_id -= (pix_fmt_id & 0x0F0F0F0F) >> 1;
+        /* XXX: not complete test ! */
+        pix_fmt_id = ((unsigned)s->h_count[0] << 28) | (s->v_count[0] << 24) |
+                     (s->h_count[1] << 20) | (s->v_count[1] << 16) |
+                     (s->h_count[2] << 12) | (s->v_count[2] <<  8) |
+                     (s->h_count[3] <<  4) |  s->v_count[3];
+        av_log(s->avctx, AV_LOG_DEBUG, "pix fmt id %x\n", pix_fmt_id);
+        /* NOTE we do not allocate pictures large enough for the possible
+         * padding of h/v_count being 4 */
+        if (!(pix_fmt_id & 0xD0D0D0D0))
+            pix_fmt_id -= (pix_fmt_id & 0xF0F0F0F0) >> 1;
+        if (!(pix_fmt_id & 0x0D0D0D0D))
+            pix_fmt_id -= (pix_fmt_id & 0x0F0F0F0F) >> 1;
 
-    for (i = 0; i < 8; i++) {
-        int j = 6 + (i&1) - (i&6);
-        int is = (pix_fmt_id >> (4*i)) & 0xF;
-        int js = (pix_fmt_id >> (4*j)) & 0xF;
+        for (i = 0; i < 8; i++) {
+            int j = 6 + (i&1) - (i&6);
+            int is = (pix_fmt_id >> (4*i)) & 0xF;
+            int js = (pix_fmt_id >> (4*j)) & 0xF;
 
-        if (is == 1 && js != 2 && (i < 2 || i > 5))
-            js = (pix_fmt_id >> ( 8 + 4*(i&1))) & 0xF;
-        if (is == 1 && js != 2 && (i < 2 || i > 5))
-            js = (pix_fmt_id >> (16 + 4*(i&1))) & 0xF;
+            if (is == 1 && js != 2 && (i < 2 || i > 5))
+                js = (pix_fmt_id >> ( 8 + 4*(i&1))) & 0xF;
+            if (is == 1 && js != 2 && (i < 2 || i > 5))
+                js = (pix_fmt_id >> (16 + 4*(i&1))) & 0xF;
 
-        if (is == 1 && js == 2) {
-            if (i & 1) s->upscale_h[j/2] = 1;
-            else       s->upscale_v[j/2] = 1;
-        }
-    }
-
-    switch (pix_fmt_id) {
-    case 0x11111100:
-        if (s->rgb)
-            s->avctx->pix_fmt = s->bits <= 9 ? AV_PIX_FMT_BGR24 : AV_PIX_FMT_BGR48;
-        else {
-            if (s->component_id[0] == 'Q' && s->component_id[1] == 'F' && s->component_id[2] == 'A') {
-                s->avctx->pix_fmt = s->bits <= 8 ? AV_PIX_FMT_GBRP : AV_PIX_FMT_GBRP16;
-            } else {
-                if (s->bits <= 8) s->avctx->pix_fmt = s->cs_itu601 ? AV_PIX_FMT_YUV444P : AV_PIX_FMT_YUVJ444P;
-                else              s->avctx->pix_fmt = AV_PIX_FMT_YUV444P16;
-            s->avctx->color_range = s->cs_itu601 ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG;
+            if (is == 1 && js == 2) {
+                if (i & 1) s->upscale_h[j/2] = 1;
+                else       s->upscale_v[j/2] = 1;
             }
         }
-        av_assert0(s->nb_components == 3);
-        break;
-    case 0x11111111:
-        if (s->rgb)
-            s->avctx->pix_fmt = s->bits <= 9 ? AV_PIX_FMT_ABGR : AV_PIX_FMT_RGBA64;
-        else {
+
+        switch (pix_fmt_id) {
+        case 0x11110000: /* for bayer-encoded huffman lossless JPEGs embedded in DNGs */
+            if (!s->bayer)
+                goto unk_pixfmt;
+            s->avctx->pix_fmt = AV_PIX_FMT_GRAY16LE;
+            break;
+        case 0x11111100:
+            if (s->rgb)
+                s->avctx->pix_fmt = s->bits <= 9 ? AV_PIX_FMT_BGR24 : AV_PIX_FMT_BGR48;
+            else {
+                if (   s->adobe_transform == 0
+                    || s->component_id[0] == 'R' - 1 && s->component_id[1] == 'G' - 1 && s->component_id[2] == 'B' - 1) {
+                    s->avctx->pix_fmt = s->bits <= 8 ? AV_PIX_FMT_GBRP : AV_PIX_FMT_GBRP16;
+                } else {
+                    if (s->bits <= 8) s->avctx->pix_fmt = s->cs_itu601 ? AV_PIX_FMT_YUV444P : AV_PIX_FMT_YUVJ444P;
+                    else              s->avctx->pix_fmt = AV_PIX_FMT_YUV444P16;
+                s->avctx->color_range = s->cs_itu601 ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG;
+                }
+            }
+            av_assert0(s->nb_components == 3);
+            break;
+        case 0x11111111:
+            if (s->rgb)
+                s->avctx->pix_fmt = s->bits <= 9 ? AV_PIX_FMT_ABGR : AV_PIX_FMT_RGBA64;
+            else {
+                if (s->adobe_transform == 0 && s->bits <= 8) {
+                    s->avctx->pix_fmt = AV_PIX_FMT_GBRAP;
+                } else {
+                    s->avctx->pix_fmt = s->bits <= 8 ? AV_PIX_FMT_YUVA444P : AV_PIX_FMT_YUVA444P16;
+                    s->avctx->color_range = s->cs_itu601 ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG;
+                }
+            }
+            av_assert0(s->nb_components == 4);
+            break;
+        case 0x22111122:
+        case 0x22111111:
             if (s->adobe_transform == 0 && s->bits <= 8) {
                 s->avctx->pix_fmt = AV_PIX_FMT_GBRAP;
+                s->upscale_v[1] = s->upscale_v[2] = 1;
+                s->upscale_h[1] = s->upscale_h[2] = 1;
+            } else if (s->adobe_transform == 2 && s->bits <= 8) {
+                s->avctx->pix_fmt = AV_PIX_FMT_YUVA444P;
+                s->upscale_v[1] = s->upscale_v[2] = 1;
+                s->upscale_h[1] = s->upscale_h[2] = 1;
+                s->avctx->color_range = s->cs_itu601 ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG;
             } else {
-                s->avctx->pix_fmt = s->bits <= 8 ? AV_PIX_FMT_YUVA444P : AV_PIX_FMT_YUVA444P16;
+                if (s->bits <= 8) s->avctx->pix_fmt = AV_PIX_FMT_YUVA420P;
+                else              s->avctx->pix_fmt = AV_PIX_FMT_YUVA420P16;
                 s->avctx->color_range = s->cs_itu601 ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG;
             }
-        }
-        av_assert0(s->nb_components == 4);
-        break;
-    case 0x22111122:
-    case 0x22111111:
-        if (s->adobe_transform == 0 && s->bits <= 8) {
-            s->avctx->pix_fmt = AV_PIX_FMT_GBRAP;
-            s->upscale_v[1] = s->upscale_v[2] = 1;
-            s->upscale_h[1] = s->upscale_h[2] = 1;
-        } else if (s->adobe_transform == 2 && s->bits <= 8) {
-            s->avctx->pix_fmt = AV_PIX_FMT_YUVA444P;
-            s->upscale_v[1] = s->upscale_v[2] = 1;
-            s->upscale_h[1] = s->upscale_h[2] = 1;
-            s->avctx->color_range = s->cs_itu601 ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG;
-        } else {
-            if (s->bits <= 8) s->avctx->pix_fmt = AV_PIX_FMT_YUVA420P;
-            else              s->avctx->pix_fmt = AV_PIX_FMT_YUVA420P16;
-            s->avctx->color_range = s->cs_itu601 ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG;
-        }
-        av_assert0(s->nb_components == 4);
-        break;
-    case 0x12121100:
-    case 0x22122100:
-    case 0x21211100:
-    case 0x22211200:
-        if (s->bits <= 8) s->avctx->pix_fmt = s->cs_itu601 ? AV_PIX_FMT_YUV444P : AV_PIX_FMT_YUVJ444P;
-        else
-            goto unk_pixfmt;
-        s->avctx->color_range = s->cs_itu601 ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG;
-        break;
-    case 0x22221100:
-    case 0x22112200:
-    case 0x11222200:
-        if (s->bits <= 8) s->avctx->pix_fmt = s->cs_itu601 ? AV_PIX_FMT_YUV444P : AV_PIX_FMT_YUVJ444P;
-        else
-            goto unk_pixfmt;
-        s->avctx->color_range = s->cs_itu601 ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG;
-        break;
-    case 0x11000000:
-    case 0x13000000:
-    case 0x14000000:
-    case 0x31000000:
-    case 0x33000000:
-    case 0x34000000:
-    case 0x41000000:
-    case 0x43000000:
-    case 0x44000000:
-        if(s->bits <= 8)
-            s->avctx->pix_fmt = AV_PIX_FMT_GRAY8;
-        else
-            s->avctx->pix_fmt = AV_PIX_FMT_GRAY16;
-        break;
-    case 0x12111100:
-    case 0x14121200:
-    case 0x14111100:
-    case 0x22211100:
-    case 0x22112100:
-        if (s->component_id[0] == 'Q' && s->component_id[1] == 'F' && s->component_id[2] == 'A') {
-            if (s->bits <= 8) s->avctx->pix_fmt = AV_PIX_FMT_GBRP;
-            else
-                goto unk_pixfmt;
-            s->upscale_v[0] = s->upscale_v[1] = 1;
-        } else {
-            if (pix_fmt_id == 0x14111100)
-                s->upscale_v[1] = s->upscale_v[2] = 1;
-            if (s->bits <= 8) s->avctx->pix_fmt = s->cs_itu601 ? AV_PIX_FMT_YUV440P : AV_PIX_FMT_YUVJ440P;
+            av_assert0(s->nb_components == 4);
+            break;
+        case 0x12121100:
+        case 0x22122100:
+        case 0x21211100:
+        case 0x22211200:
+        case 0x22221100:
+        case 0x22112200:
+        case 0x11222200:
+            if (s->bits <= 8) s->avctx->pix_fmt = s->cs_itu601 ? AV_PIX_FMT_YUV444P : AV_PIX_FMT_YUVJ444P;
             else
                 goto unk_pixfmt;
             s->avctx->color_range = s->cs_itu601 ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG;
-        }
-        break;
-    case 0x21111100:
-        if (s->component_id[0] == 'Q' && s->component_id[1] == 'F' && s->component_id[2] == 'A') {
-            if (s->bits <= 8) s->avctx->pix_fmt = AV_PIX_FMT_GBRP;
+            break;
+        case 0x11000000:
+        case 0x13000000:
+        case 0x14000000:
+        case 0x31000000:
+        case 0x33000000:
+        case 0x34000000:
+        case 0x41000000:
+        case 0x43000000:
+        case 0x44000000:
+            if(s->bits <= 8)
+                s->avctx->pix_fmt = AV_PIX_FMT_GRAY8;
             else
+                s->avctx->pix_fmt = AV_PIX_FMT_GRAY16;
+            break;
+        case 0x12111100:
+        case 0x14121200:
+        case 0x14111100:
+        case 0x22211100:
+        case 0x22112100:
+            if (s->component_id[0] == 'Q' && s->component_id[1] == 'F' && s->component_id[2] == 'A') {
+                if (s->bits <= 8) s->avctx->pix_fmt = AV_PIX_FMT_GBRP;
+                else
+                    goto unk_pixfmt;
+                s->upscale_v[0] = s->upscale_v[1] = 1;
+            } else {
+                if (pix_fmt_id == 0x14111100)
+                    s->upscale_v[1] = s->upscale_v[2] = 1;
+                if (s->bits <= 8) s->avctx->pix_fmt = s->cs_itu601 ? AV_PIX_FMT_YUV440P : AV_PIX_FMT_YUVJ440P;
+                else
+                    goto unk_pixfmt;
+                s->avctx->color_range = s->cs_itu601 ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG;
+            }
+            break;
+        case 0x21111100:
+            if (s->component_id[0] == 'Q' && s->component_id[1] == 'F' && s->component_id[2] == 'A') {
+                if (s->bits <= 8) s->avctx->pix_fmt = AV_PIX_FMT_GBRP;
+                else
+                    goto unk_pixfmt;
+                s->upscale_h[0] = s->upscale_h[1] = 1;
+            } else {
+                if (s->bits <= 8) s->avctx->pix_fmt = s->cs_itu601 ? AV_PIX_FMT_YUV422P : AV_PIX_FMT_YUVJ422P;
+                else              s->avctx->pix_fmt = AV_PIX_FMT_YUV422P16;
+                s->avctx->color_range = s->cs_itu601 ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG;
+            }
+            break;
+        case 0x31111100:
+            if (s->bits > 8)
                 goto unk_pixfmt;
-            s->upscale_h[0] = s->upscale_h[1] = 1;
-        } else {
+            s->avctx->pix_fmt = s->cs_itu601 ? AV_PIX_FMT_YUV444P : AV_PIX_FMT_YUVJ444P;
+            s->avctx->color_range = s->cs_itu601 ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG;
+            s->upscale_h[1] = s->upscale_h[2] = 2;
+            break;
+        case 0x22121100:
+        case 0x22111200:
             if (s->bits <= 8) s->avctx->pix_fmt = s->cs_itu601 ? AV_PIX_FMT_YUV422P : AV_PIX_FMT_YUVJ422P;
-            else              s->avctx->pix_fmt = AV_PIX_FMT_YUV422P16;
+            else
+                goto unk_pixfmt;
             s->avctx->color_range = s->cs_itu601 ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG;
-        }
-        break;
-    case 0x31111100:
-        if (s->bits > 8)
-            goto unk_pixfmt;
-        s->avctx->pix_fmt = s->cs_itu601 ? AV_PIX_FMT_YUV444P : AV_PIX_FMT_YUVJ444P;
-        s->avctx->color_range = s->cs_itu601 ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG;
-        s->upscale_h[1] = s->upscale_h[2] = 2;
-        break;
-    case 0x22121100:
-    case 0x22111200:
-        if (s->bits <= 8) s->avctx->pix_fmt = s->cs_itu601 ? AV_PIX_FMT_YUV422P : AV_PIX_FMT_YUVJ422P;
-        else
-            goto unk_pixfmt;
-        s->avctx->color_range = s->cs_itu601 ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG;
-        break;
-    case 0x22111100:
-    case 0x42111100:
-    case 0x24111100:
-        if (s->bits <= 8) s->avctx->pix_fmt = s->cs_itu601 ? AV_PIX_FMT_YUV420P : AV_PIX_FMT_YUVJ420P;
-        else              s->avctx->pix_fmt = AV_PIX_FMT_YUV420P16;
-        s->avctx->color_range = s->cs_itu601 ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG;
-        if (pix_fmt_id == 0x42111100) {
-            if (s->bits > 8)
+            break;
+        case 0x22111100:
+        case 0x23111100:
+        case 0x42111100:
+        case 0x24111100:
+            if (s->bits <= 8) s->avctx->pix_fmt = s->cs_itu601 ? AV_PIX_FMT_YUV420P : AV_PIX_FMT_YUVJ420P;
+            else              s->avctx->pix_fmt = AV_PIX_FMT_YUV420P16;
+            s->avctx->color_range = s->cs_itu601 ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG;
+            if (pix_fmt_id == 0x42111100) {
+                if (s->bits > 8)
+                    goto unk_pixfmt;
+                s->upscale_h[1] = s->upscale_h[2] = 1;
+            } else if (pix_fmt_id == 0x24111100) {
+                if (s->bits > 8)
+                    goto unk_pixfmt;
+                s->upscale_v[1] = s->upscale_v[2] = 1;
+            } else if (pix_fmt_id == 0x23111100) {
+                if (s->bits > 8)
+                    goto unk_pixfmt;
+                s->upscale_v[1] = s->upscale_v[2] = 2;
+            }
+            break;
+        case 0x41111100:
+            if (s->bits <= 8) s->avctx->pix_fmt = s->cs_itu601 ? AV_PIX_FMT_YUV411P : AV_PIX_FMT_YUVJ411P;
+            else
                 goto unk_pixfmt;
-            s->upscale_h[1] = s->upscale_h[2] = 1;
-        } else if (pix_fmt_id == 0x24111100) {
-            if (s->bits > 8)
-                goto unk_pixfmt;
-            s->upscale_v[1] = s->upscale_v[2] = 1;
-        }
-        break;
-    case 0x41111100:
-        if (s->bits <= 8) s->avctx->pix_fmt = s->cs_itu601 ? AV_PIX_FMT_YUV411P : AV_PIX_FMT_YUVJ411P;
-        else
-            goto unk_pixfmt;
-        s->avctx->color_range = s->cs_itu601 ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG;
-        break;
-    default:
-unk_pixfmt:
-        avpriv_report_missing_feature(s->avctx, "Pixel format 0x%x bits:%d", pix_fmt_id, s->bits);
-        memset(s->upscale_h, 0, sizeof(s->upscale_h));
-        memset(s->upscale_v, 0, sizeof(s->upscale_v));
-        return AVERROR_PATCHWELCOME;
-    }
-    if ((AV_RB32(s->upscale_h) || AV_RB32(s->upscale_v)) && s->avctx->lowres) {
-        avpriv_report_missing_feature(s->avctx, "Lowres for weird subsampling");
-        return AVERROR_PATCHWELCOME;
-    }
-    if ((AV_RB32(s->upscale_h) || AV_RB32(s->upscale_v)) && s->progressive && s->avctx->pix_fmt == AV_PIX_FMT_GBRP) {
-        avpriv_report_missing_feature(s->avctx, "progressive for weird subsampling");
-        return AVERROR_PATCHWELCOME;
-    }
-    if (s->ls) {
-        memset(s->upscale_h, 0, sizeof(s->upscale_h));
-        memset(s->upscale_v, 0, sizeof(s->upscale_v));
-        if (s->nb_components == 3) {
-            s->avctx->pix_fmt = AV_PIX_FMT_RGB24;
-        } else if (s->nb_components != 1) {
-            av_log(s->avctx, AV_LOG_ERROR, "Unsupported number of components %d\n", s->nb_components);
+            s->avctx->color_range = s->cs_itu601 ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG;
+            break;
+        default:
+    unk_pixfmt:
+            avpriv_report_missing_feature(s->avctx, "Pixel format 0x%x bits:%d", pix_fmt_id, s->bits);
+            memset(s->upscale_h, 0, sizeof(s->upscale_h));
+            memset(s->upscale_v, 0, sizeof(s->upscale_v));
             return AVERROR_PATCHWELCOME;
-        } else if (s->palette_index && s->bits <= 8)
-            s->avctx->pix_fmt = AV_PIX_FMT_PAL8;
-        else if (s->bits <= 8)
-            s->avctx->pix_fmt = AV_PIX_FMT_GRAY8;
-        else
-            s->avctx->pix_fmt = AV_PIX_FMT_GRAY16;
-    }
+        }
+        if ((AV_RB32(s->upscale_h) || AV_RB32(s->upscale_v)) && s->avctx->lowres) {
+            avpriv_report_missing_feature(s->avctx, "Lowres for weird subsampling");
+            return AVERROR_PATCHWELCOME;
+        }
+        if ((AV_RB32(s->upscale_h) || AV_RB32(s->upscale_v)) && s->progressive && s->avctx->pix_fmt == AV_PIX_FMT_GBRP) {
+            avpriv_report_missing_feature(s->avctx, "progressive for weird subsampling");
+            return AVERROR_PATCHWELCOME;
+        }
+        if (s->ls) {
+            memset(s->upscale_h, 0, sizeof(s->upscale_h));
+            memset(s->upscale_v, 0, sizeof(s->upscale_v));
+            if (s->nb_components == 3) {
+                s->avctx->pix_fmt = AV_PIX_FMT_RGB24;
+            } else if (s->nb_components != 1) {
+                av_log(s->avctx, AV_LOG_ERROR, "Unsupported number of components %d\n", s->nb_components);
+                return AVERROR_PATCHWELCOME;
+            } else if (s->palette_index && s->bits <= 8)
+                s->avctx->pix_fmt = AV_PIX_FMT_PAL8;
+            else if (s->bits <= 8)
+                s->avctx->pix_fmt = AV_PIX_FMT_GRAY8;
+            else
+                s->avctx->pix_fmt = AV_PIX_FMT_GRAY16;
+        }
 
-    s->pix_desc = av_pix_fmt_desc_get(s->avctx->pix_fmt);
-    if (!s->pix_desc) {
-        av_log(s->avctx, AV_LOG_ERROR, "Could not get a pixel format descriptor.\n");
-        return AVERROR_BUG;
-    }
+        s->pix_desc = av_pix_fmt_desc_get(s->avctx->pix_fmt);
+        if (!s->pix_desc) {
+            av_log(s->avctx, AV_LOG_ERROR, "Could not get a pixel format descriptor.\n");
+            return AVERROR_BUG;
+        }
 
-    if (s->avctx->pix_fmt == s->hwaccel_sw_pix_fmt && !size_change) {
-        s->avctx->pix_fmt = s->hwaccel_pix_fmt;
-    } else {
-        enum AVPixelFormat pix_fmts[] = {
+        if (s->avctx->pix_fmt == s->hwaccel_sw_pix_fmt && !size_change) {
+            s->avctx->pix_fmt = s->hwaccel_pix_fmt;
+        } else {
+            enum AVPixelFormat pix_fmts[] = {
 #if CONFIG_MJPEG_NVDEC_HWACCEL
-            AV_PIX_FMT_CUDA,
+                AV_PIX_FMT_CUDA,
 #endif
 #if CONFIG_MJPEG_VAAPI_HWACCEL
-            AV_PIX_FMT_VAAPI,
+                AV_PIX_FMT_VAAPI,
 #endif
-            s->avctx->pix_fmt,
-            AV_PIX_FMT_NONE,
-        };
-        s->hwaccel_pix_fmt = ff_get_format(s->avctx, pix_fmts);
-        if (s->hwaccel_pix_fmt < 0)
-            return AVERROR(EINVAL);
+                s->avctx->pix_fmt,
+                AV_PIX_FMT_NONE,
+            };
+            s->hwaccel_pix_fmt = ff_get_format(s->avctx, pix_fmts);
+            if (s->hwaccel_pix_fmt < 0)
+                return AVERROR(EINVAL);
 
-        s->hwaccel_sw_pix_fmt = s->avctx->pix_fmt;
-        s->avctx->pix_fmt     = s->hwaccel_pix_fmt;
-    }
+            s->hwaccel_sw_pix_fmt = s->avctx->pix_fmt;
+            s->avctx->pix_fmt     = s->hwaccel_pix_fmt;
+        }
 
-    if (s->avctx->skip_frame == AVDISCARD_ALL) {
+        if (s->avctx->skip_frame == AVDISCARD_ALL) {
+            s->picture_ptr->pict_type = AV_PICTURE_TYPE_I;
+            s->picture_ptr->key_frame = 1;
+            s->got_picture            = 1;
+            return 0;
+        }
+
+        av_frame_unref(s->picture_ptr);
+        if (ff_get_buffer(s->avctx, s->picture_ptr, AV_GET_BUFFER_FLAG_REF) < 0)
+            return -1;
         s->picture_ptr->pict_type = AV_PICTURE_TYPE_I;
         s->picture_ptr->key_frame = 1;
         s->got_picture            = 1;
-        return 0;
-    }
 
-    av_frame_unref(s->picture_ptr);
-    if (ff_get_buffer(s->avctx, s->picture_ptr, AV_GET_BUFFER_FLAG_REF) < 0)
-        return -1;
-    s->picture_ptr->pict_type = AV_PICTURE_TYPE_I;
-    s->picture_ptr->key_frame = 1;
-    s->got_picture            = 1;
+        for (i = 0; i < 4; i++)
+            s->linesize[i] = s->picture_ptr->linesize[i] << s->interlaced;
 
-    for (i = 0; i < 4; i++)
-        s->linesize[i] = s->picture_ptr->linesize[i] << s->interlaced;
+        ff_dlog(s->avctx, "%d %d %d %d %d %d\n",
+                s->width, s->height, s->linesize[0], s->linesize[1],
+                s->interlaced, s->avctx->height);
 
-    ff_dlog(s->avctx, "%d %d %d %d %d %d\n",
-            s->width, s->height, s->linesize[0], s->linesize[1],
-            s->interlaced, s->avctx->height);
-
-    if (len != (8 + (3 * nb_components)))
-        av_log(s->avctx, AV_LOG_DEBUG, "decode_sof0: error, len(%d) mismatch\n", len);
     }
 
     if ((s->rgb && !s->lossless && !s->ls) ||
-        (!s->rgb && s->ls && s->nb_components > 1)) {
+        (!s->rgb && s->ls && s->nb_components > 1) ||
+        (s->avctx->pix_fmt == AV_PIX_FMT_PAL8 && !s->ls)
+    ) {
         av_log(s->avctx, AV_LOG_ERROR, "Unsupported coding and pixel format combination\n");
         return AVERROR_PATCHWELCOME;
     }
@@ -1019,17 +1053,24 @@
     return reset;
 }
 
+/* Handles 1 to 4 components */
 static int ljpeg_decode_rgb_scan(MJpegDecodeContext *s, int nb_components, int predictor, int point_transform)
 {
     int i, mb_x, mb_y;
+    unsigned width;
     uint16_t (*buffer)[4];
     int left[4], top[4], topleft[4];
     const int linesize = s->linesize[0];
     const int mask     = ((1 << s->bits) - 1) << point_transform;
     int resync_mb_y = 0;
     int resync_mb_x = 0;
+    int vpred[6];
 
-    if (s->nb_components != 3 && s->nb_components != 4)
+    if (!s->bayer && s->nb_components < 3)
+        return AVERROR_INVALIDDATA;
+    if (s->bayer && s->nb_components > 2)
+        return AVERROR_INVALIDDATA;
+    if (s->nb_components <= 0 || s->nb_components > 4)
         return AVERROR_INVALIDDATA;
     if (s->v_max != 1 || s->h_max != 1 || !s->lossless)
         return AVERROR_INVALIDDATA;
@@ -1037,8 +1078,15 @@
 
     s->restart_count = s->restart_interval;
 
-    av_fast_malloc(&s->ljpeg_buffer, &s->ljpeg_buffer_size,
-                   (unsigned)s->mb_width * 4 * sizeof(s->ljpeg_buffer[0][0]));
+    if (s->restart_interval == 0)
+        s->restart_interval = INT_MAX;
+
+    if (s->bayer)
+        width = s->mb_width / nb_components; /* Interleaved, width stored is the total so need to divide */
+    else
+        width = s->mb_width;
+
+    av_fast_malloc(&s->ljpeg_buffer, &s->ljpeg_buffer_size, width * 4 * sizeof(s->ljpeg_buffer[0][0]));
     if (!s->ljpeg_buffer)
         return AVERROR(ENOMEM);
 
@@ -1056,7 +1104,12 @@
         for (i = 0; i < 4; i++)
             top[i] = left[i] = topleft[i] = buffer[0][i];
 
-        for (mb_x = 0; mb_x < s->mb_width; mb_x++) {
+        if ((mb_y * s->width) % s->restart_interval == 0) {
+            for (i = 0; i < 6; i++)
+                vpred[i] = 1 << (s->bits-1);
+        }
+
+        for (mb_x = 0; mb_x < width; mb_x++) {
             int modified_predictor = predictor;
 
             if (get_bits_left(&s->gb) < 1) {
@@ -1080,12 +1133,19 @@
                 topleft[i] = top[i];
                 top[i]     = buffer[mb_x][i];
 
-                PREDICT(pred, topleft[i], top[i], left[i], modified_predictor);
-
                 dc = mjpeg_decode_dc(s, s->dc_index[i]);
                 if(dc == 0xFFFFF)
                     return -1;
 
+                if (!s->bayer || mb_x) {
+                    pred = left[i];
+                } else { /* This path runs only for the first line in bayer images */
+                    vpred[i] += dc;
+                    pred = vpred[i] - dc;
+                }
+
+                PREDICT(pred, topleft[i], top[i], pred, modified_predictor);
+
                 left[i] = buffer[mb_x][i] =
                     mask & (pred + (unsigned)(dc * (1 << point_transform)));
             }
@@ -1129,6 +1189,17 @@
                 ptr[3*mb_x + 0] = buffer[mb_x][1] + ptr[3*mb_x + 1];
                 ptr[3*mb_x + 2] = buffer[mb_x][2] + ptr[3*mb_x + 1];
             }
+        } else if (s->bayer) {
+            if (nb_components == 1) {
+                /* Leave decoding to the TIFF/DNG decoder (see comment in ff_mjpeg_decode_sof) */
+                for (mb_x = 0; mb_x < width; mb_x++)
+                    ((uint16_t*)ptr)[mb_x] = buffer[mb_x][0];
+            } else if (nb_components == 2) {
+                for (mb_x = 0; mb_x < width; mb_x++) {
+                    ((uint16_t*)ptr)[2*mb_x + 0] = buffer[mb_x][0];
+                    ((uint16_t*)ptr)[2*mb_x + 1] = buffer[mb_x][1];
+                }
+            }
         } else {
             for(i=0; i<nb_components; i++) {
                 int c= s->comp_index[i];
@@ -1201,25 +1272,25 @@
                             || v * mb_y + y >= s->height) {
                             // Nothing to do
                         } else if (bits<=8) {
-                        ptr = s->picture_ptr->data[c] + (linesize * (v * mb_y + y)) + (h * mb_x + x); //FIXME optimize this crap
-                        if(y==0 && toprow){
-                            if(x==0 && leftcol){
-                                pred= 1 << (bits - 1);
+                            ptr = s->picture_ptr->data[c] + (linesize * (v * mb_y + y)) + (h * mb_x + x); //FIXME optimize this crap
+                            if(y==0 && toprow){
+                                if(x==0 && leftcol){
+                                    pred= 1 << (bits - 1);
+                                }else{
+                                    pred= ptr[-1];
+                                }
                             }else{
-                                pred= ptr[-1];
+                                if(x==0 && leftcol){
+                                    pred= ptr[-linesize];
+                                }else{
+                                    PREDICT(pred, ptr[-linesize-1], ptr[-linesize], ptr[-1], predictor);
+                                }
                             }
-                        }else{
-                            if(x==0 && leftcol){
-                                pred= ptr[-linesize];
-                            }else{
-                                PREDICT(pred, ptr[-linesize-1], ptr[-linesize], ptr[-1], predictor);
-                            }
-                        }
 
-                        if (s->interlaced && s->bottom_field)
-                            ptr += linesize >> 1;
-                        pred &= mask;
-                        *ptr= pred + ((unsigned)dc << point_transform);
+                            if (s->interlaced && s->bottom_field)
+                                ptr += linesize >> 1;
+                            pred &= mask;
+                            *ptr= pred + ((unsigned)dc << point_transform);
                         }else{
                             ptr16 = (uint16_t*)(s->picture_ptr->data[c] + 2*(linesize * (v * mb_y + y)) + 2*(h * mb_x + x)); //FIXME optimize this crap
                             if(y==0 && toprow){
@@ -1673,7 +1744,7 @@
                                                 point_transform, ilv)) < 0)
                 return ret;
         } else {
-            if (s->rgb) {
+            if (s->rgb || s->bayer) {
                 if ((ret = ljpeg_decode_rgb_scan(s, nb_components, predictor, point_transform)) < 0)
                     return ret;
             } else {
@@ -1737,8 +1808,15 @@
     int len, id, i;
 
     len = get_bits(&s->gb, 16);
-    if (len < 6)
-        return AVERROR_INVALIDDATA;
+    if (len < 6) {
+        if (s->bayer) {
+            // Pentax K-1 (digital camera) JPEG images embedded in DNG images contain unknown APP0 markers
+            av_log(s->avctx, AV_LOG_WARNING, "skipping APPx (len=%"PRId32") for bayer-encoded image\n", len);
+            skip_bits(&s->gb, len);
+            return 0;
+        } else
+            return AVERROR_INVALIDDATA;
+    }
     if (8 * len > get_bits_left(&s->gb))
         return AVERROR_INVALIDDATA;
 
@@ -1883,6 +1961,7 @@
         type   = get_bits(&s->gb, 8);
         len -= 4;
 
+        av_freep(&s->stereo3d);
         s->stereo3d = av_stereo3d_alloc();
         if (!s->stereo3d) {
             goto out;
@@ -1970,7 +2049,7 @@
         unsigned nummarkers;
 
         id   = get_bits_long(&s->gb, 32);
-        id2  = get_bits_long(&s->gb, 24);
+        id2  = get_bits(&s->gb, 24);
         len -= 7;
         if (id != AV_RB32("PROF") || id2 != AV_RB24("ILE")) {
             av_log(s->avctx, AV_LOG_WARNING, "Invalid ICC_PROFILE header in APP2\n");
@@ -2092,7 +2171,7 @@
     while (buf_end - buf_ptr > 1) {
         v  = *buf_ptr++;
         v2 = *buf_ptr;
-        if ((v == 0xff) && (v2 >= 0xc0) && (v2 <= 0xfe) && buf_ptr < buf_end) {
+        if ((v == 0xff) && (v2 >= SOF0) && (v2 <= COM) && buf_ptr < buf_end) {
             val = *buf_ptr++;
             goto found;
         }
@@ -2157,7 +2236,7 @@
                         src--;
                     }
 
-                    if (x < 0xd0 || x > 0xd7) {
+                    if (x < RST0 || x > RST7) {
                         copy_data_segment(1);
                         if (x)
                             break;
@@ -2296,7 +2375,7 @@
             av_log(avctx, AV_LOG_DEBUG, "startcode: %X\n", start_code);
 
         /* process markers */
-        if (start_code >= 0xd0 && start_code <= 0xd7) {
+        if (start_code >= RST0 && start_code <= RST7) {
             av_log(avctx, AV_LOG_DEBUG,
                    "restart marker: %d\n", start_code & 0x0f);
             /* APP fields */
@@ -2528,7 +2607,7 @@
                 w = AV_CEIL_RSHIFT(w, hshift);
                 h = AV_CEIL_RSHIFT(h, vshift);
             }
-            if (s->upscale_v[p])
+            if (s->upscale_v[p] == 1)
                 h = (h+1)>>1;
             av_assert0(w > 0);
             for (i = 0; i < h; i++) {
@@ -2592,9 +2671,9 @@
             }
             dst = &((uint8_t *)s->picture_ptr->data[p])[(h - 1) * s->linesize[p]];
             for (i = h - 1; i; i--) {
-                uint8_t *src1 = &((uint8_t *)s->picture_ptr->data[p])[i / 2 * s->linesize[p]];
-                uint8_t *src2 = &((uint8_t *)s->picture_ptr->data[p])[(i + 1) / 2 * s->linesize[p]];
-                if (src1 == src2 || i == h - 1) {
+                uint8_t *src1 = &((uint8_t *)s->picture_ptr->data[p])[i * s->upscale_v[p] / (s->upscale_v[p] + 1) * s->linesize[p]];
+                uint8_t *src2 = &((uint8_t *)s->picture_ptr->data[p])[(i + 1) * s->upscale_v[p] / (s->upscale_v[p] + 1) * s->linesize[p]];
+                if (s->upscale_v[p] != 2 && (src1 == src2 || i == h - 1)) {
                     memcpy(dst, src1, w);
                 } else {
                     for (index = 0; index < w; index++)
@@ -2791,6 +2870,7 @@
     .capabilities   = AV_CODEC_CAP_DR1,
     .max_lowres     = 3,
     .priv_class     = &mjpegdec_class,
+    .profiles       = NULL_IF_CONFIG_SMALL(ff_mjpeg_profiles),
     .caps_internal  = FF_CODEC_CAP_INIT_THREADSAFE |
                       FF_CODEC_CAP_SKIP_FRAME_FILL_PARAM,
     .hw_configs     = (const AVCodecHWConfigInternal*[]) {
diff --git a/libavcodec/mjpegdec.h b/libavcodec/mjpegdec.h
index 653fe7c..9d1666b 100644
--- a/libavcodec/mjpegdec.h
+++ b/libavcodec/mjpegdec.h
@@ -64,6 +64,7 @@
     int lossless;
     int ls;
     int progressive;
+    int bayer;          /* true if it's a bayer-encoded JPEG embedded in a DNG */
     int rgb;
     uint8_t upscale_h[4];
     uint8_t upscale_v[4];
diff --git a/libavcodec/mjpegenc.c b/libavcodec/mjpegenc.c
index d2fcb8e..0ea7bd3 100644
--- a/libavcodec/mjpegenc.c
+++ b/libavcodec/mjpegenc.c
@@ -38,6 +38,7 @@
 #include "mpegvideo.h"
 #include "mjpeg.h"
 #include "mjpegenc.h"
+#include "profiles.h"
 
 static int alloc_huffman(MpegEncContext *s)
 {
@@ -418,6 +419,7 @@
         AV_PIX_FMT_YUVJ420P, AV_PIX_FMT_YUVJ422P, AV_PIX_FMT_YUVJ444P, AV_PIX_FMT_NONE
     },
     .priv_class     = &mjpeg_class,
+    .profiles       = NULL_IF_CONFIG_SMALL(ff_mjpeg_profiles),
 };
 #endif
 
diff --git a/libavcodec/mjpegenc_common.c b/libavcodec/mjpegenc_common.c
index 31868c9..3038ebd 100644
--- a/libavcodec/mjpegenc_common.c
+++ b/libavcodec/mjpegenc_common.c
@@ -573,7 +573,7 @@
 
     ff_mjpeg_escape_FF(pbc, s->esc_pos);
 
-    if((s->avctx->active_thread_type & FF_THREAD_SLICE) && mb_y < s->mb_height)
+    if((s->avctx->active_thread_type & FF_THREAD_SLICE) && mb_y < s->mb_height - 1)
         put_marker(pbc, RST0 + (mb_y&7));
     s->esc_pos = put_bits_count(pbc) >> 3;
 fail:
diff --git a/libavcodec/mlp_parse.c b/libavcodec/mlp_parse.c
new file mode 100644
index 0000000..4571535
--- /dev/null
+++ b/libavcodec/mlp_parse.c
@@ -0,0 +1,165 @@
+/*
+ * Copyright (c) 2007 Ian Caulfield
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include <stdint.h>
+
+#include "libavutil/channel_layout.h"
+#include "get_bits.h"
+#include "mlp_parse.h"
+#include "mlp.h"
+
+static const uint8_t mlp_quants[16] = {
+    16, 20, 24, 0, 0, 0, 0, 0,
+     0,  0,  0, 0, 0, 0, 0, 0,
+};
+
+static const uint8_t mlp_channels[32] = {
+    1, 2, 3, 4, 3, 4, 5, 3, 4, 5, 4, 5, 6, 4, 5, 4,
+    5, 6, 5, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+static const uint64_t mlp_layout[32] = {
+    AV_CH_LAYOUT_MONO,
+    AV_CH_LAYOUT_STEREO,
+    AV_CH_LAYOUT_2_1,
+    AV_CH_LAYOUT_QUAD,
+    AV_CH_LAYOUT_STEREO|AV_CH_LOW_FREQUENCY,
+    AV_CH_LAYOUT_2_1|AV_CH_LOW_FREQUENCY,
+    AV_CH_LAYOUT_QUAD|AV_CH_LOW_FREQUENCY,
+    AV_CH_LAYOUT_SURROUND,
+    AV_CH_LAYOUT_4POINT0,
+    AV_CH_LAYOUT_5POINT0_BACK,
+    AV_CH_LAYOUT_SURROUND|AV_CH_LOW_FREQUENCY,
+    AV_CH_LAYOUT_4POINT0|AV_CH_LOW_FREQUENCY,
+    AV_CH_LAYOUT_5POINT1_BACK,
+    AV_CH_LAYOUT_4POINT0,
+    AV_CH_LAYOUT_5POINT0_BACK,
+    AV_CH_LAYOUT_SURROUND|AV_CH_LOW_FREQUENCY,
+    AV_CH_LAYOUT_4POINT0|AV_CH_LOW_FREQUENCY,
+    AV_CH_LAYOUT_5POINT1_BACK,
+    AV_CH_LAYOUT_QUAD|AV_CH_LOW_FREQUENCY,
+    AV_CH_LAYOUT_5POINT0_BACK,
+    AV_CH_LAYOUT_5POINT1_BACK,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+};
+
+static int mlp_get_major_sync_size(const uint8_t * buf, int bufsize)
+{
+    int has_extension, extensions = 0;
+    int size = 28;
+    if (bufsize < 28)
+        return -1;
+
+    if (AV_RB32(buf) == 0xf8726fba) {
+        has_extension = buf[25] & 1;
+        if (has_extension) {
+            extensions = buf[26] >> 4;
+            size += 2 + extensions * 2;
+        }
+    }
+    return size;
+}
+
+/** Read a major sync info header - contains high level information about
+ *  the stream - sample rate, channel arrangement etc. Most of this
+ *  information is not actually necessary for decoding, only for playback.
+ *  gb must be a freshly initialized GetBitContext with no bits read.
+ */
+
+int ff_mlp_read_major_sync(void *log, MLPHeaderInfo *mh, GetBitContext *gb)
+{
+    int ratebits, channel_arrangement, header_size;
+    uint16_t checksum;
+
+    av_assert1(get_bits_count(gb) == 0);
+
+    header_size = mlp_get_major_sync_size(gb->buffer, gb->size_in_bits >> 3);
+    if (header_size < 0 || gb->size_in_bits < header_size << 3) {
+        av_log(log, AV_LOG_ERROR, "packet too short, unable to read major sync\n");
+        return -1;
+    }
+
+    checksum = ff_mlp_checksum16(gb->buffer, header_size - 2);
+    if (checksum != AV_RL16(gb->buffer+header_size-2)) {
+        av_log(log, AV_LOG_ERROR, "major sync info header checksum error\n");
+        return AVERROR_INVALIDDATA;
+    }
+
+    if (get_bits(gb, 24) != 0xf8726f) /* Sync words */
+        return AVERROR_INVALIDDATA;
+
+    mh->stream_type = get_bits(gb, 8);
+    mh->header_size = header_size;
+
+    if (mh->stream_type == 0xbb) {
+        mh->group1_bits = mlp_quants[get_bits(gb, 4)];
+        mh->group2_bits = mlp_quants[get_bits(gb, 4)];
+
+        ratebits = get_bits(gb, 4);
+        mh->group1_samplerate = mlp_samplerate(ratebits);
+        mh->group2_samplerate = mlp_samplerate(get_bits(gb, 4));
+
+        skip_bits(gb, 11);
+
+        mh->channel_arrangement=
+        channel_arrangement    = get_bits(gb, 5);
+        mh->channels_mlp       = mlp_channels[channel_arrangement];
+        mh->channel_layout_mlp = mlp_layout[channel_arrangement];
+    } else if (mh->stream_type == 0xba) {
+        mh->group1_bits = 24; // TODO: Is this information actually conveyed anywhere?
+        mh->group2_bits = 0;
+
+        ratebits = get_bits(gb, 4);
+        mh->group1_samplerate = mlp_samplerate(ratebits);
+        mh->group2_samplerate = 0;
+
+        skip_bits(gb, 4);
+
+        mh->channel_modifier_thd_stream0 = get_bits(gb, 2);
+        mh->channel_modifier_thd_stream1 = get_bits(gb, 2);
+
+        mh->channel_arrangement=
+        channel_arrangement            = get_bits(gb, 5);
+        mh->channels_thd_stream1       = truehd_channels(channel_arrangement);
+        mh->channel_layout_thd_stream1 = truehd_layout(channel_arrangement);
+
+        mh->channel_modifier_thd_stream2 = get_bits(gb, 2);
+
+        channel_arrangement            = get_bits(gb, 13);
+        mh->channels_thd_stream2       = truehd_channels(channel_arrangement);
+        mh->channel_layout_thd_stream2 = truehd_layout(channel_arrangement);
+    } else
+        return AVERROR_INVALIDDATA;
+
+    mh->access_unit_size = 40 << (ratebits & 7);
+    mh->access_unit_size_pow2 = 64 << (ratebits & 7);
+
+    skip_bits_long(gb, 48);
+
+    mh->is_vbr = get_bits1(gb);
+
+    mh->peak_bitrate = (get_bits(gb, 15) * mh->group1_samplerate + 8) >> 4;
+
+    mh->num_substreams = get_bits(gb, 4);
+
+    skip_bits_long(gb, 4 + (header_size - 17) * 8);
+
+    return 0;
+}
diff --git a/libavcodec/mlp_parser.h b/libavcodec/mlp_parse.h
similarity index 63%
rename from libavcodec/mlp_parser.h
rename to libavcodec/mlp_parse.h
index c5a2883..a0790ae 100644
--- a/libavcodec/mlp_parser.h
+++ b/libavcodec/mlp_parse.h
@@ -1,5 +1,4 @@
 /*
- * MLP parser prototypes
  * Copyright (c) 2007 Ian Caulfield
  *
  * This file is part of FFmpeg.
@@ -19,13 +18,8 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
-/**
- * @file
- * MLP parser prototypes
- */
-
-#ifndef AVCODEC_MLP_PARSER_H
-#define AVCODEC_MLP_PARSER_H
+#ifndef AVCODEC_MLP_PARSE_H
+#define AVCODEC_MLP_PARSE_H
 
 #include "get_bits.h"
 
@@ -62,10 +56,56 @@
     int num_substreams;                     ///< Number of substreams within stream
 } MLPHeaderInfo;
 
+static const uint8_t thd_chancount[13] = {
+//  LR    C   LFE  LRs LRvh  LRc LRrs  Cs   Ts  LRsd  LRw  Cvh  LFE2
+     2,   1,   1,   2,   2,   2,   2,   1,   1,   2,   2,   1,   1
+};
+
+static const uint64_t thd_layout[13] = {
+    AV_CH_FRONT_LEFT|AV_CH_FRONT_RIGHT,                     // LR
+    AV_CH_FRONT_CENTER,                                     // C
+    AV_CH_LOW_FREQUENCY,                                    // LFE
+    AV_CH_SIDE_LEFT|AV_CH_SIDE_RIGHT,                       // LRs
+    AV_CH_TOP_FRONT_LEFT|AV_CH_TOP_FRONT_RIGHT,             // LRvh
+    AV_CH_FRONT_LEFT_OF_CENTER|AV_CH_FRONT_RIGHT_OF_CENTER, // LRc
+    AV_CH_BACK_LEFT|AV_CH_BACK_RIGHT,                       // LRrs
+    AV_CH_BACK_CENTER,                                      // Cs
+    AV_CH_TOP_CENTER,                                       // Ts
+    AV_CH_SURROUND_DIRECT_LEFT|AV_CH_SURROUND_DIRECT_RIGHT, // LRsd
+    AV_CH_WIDE_LEFT|AV_CH_WIDE_RIGHT,                       // LRw
+    AV_CH_TOP_FRONT_CENTER,                                 // Cvh
+    AV_CH_LOW_FREQUENCY_2,                                  // LFE2
+};
+
+static inline int mlp_samplerate(int in)
+{
+    if (in == 0xF)
+        return 0;
+
+    return (in & 8 ? 44100 : 48000) << (in & 7) ;
+}
+
+static inline int truehd_channels(int chanmap)
+{
+    int channels = 0, i;
+
+    for (i = 0; i < 13; i++)
+        channels += thd_chancount[i] * ((chanmap >> i) & 1);
+
+    return channels;
+}
+
+static inline uint64_t truehd_layout(int chanmap)
+{
+    int i;
+    uint64_t layout = 0;
+
+    for (i = 0; i < 13; i++)
+        layout |= thd_layout[i] * ((chanmap >> i) & 1);
+
+    return layout;
+}
 
 int ff_mlp_read_major_sync(void *log, MLPHeaderInfo *mh, GetBitContext *gb);
-uint64_t ff_truehd_layout(int chanmap);
 
-extern const uint64_t ff_mlp_layout[32];
-
-#endif /* AVCODEC_MLP_PARSER_H */
+#endif /* AVCODEC_MLP_PARSE_H */
diff --git a/libavcodec/mlp_parser.c b/libavcodec/mlp_parser.c
index eb3435b..5d2ddc5 100644
--- a/libavcodec/mlp_parser.c
+++ b/libavcodec/mlp_parser.c
@@ -26,203 +26,12 @@
 
 #include <stdint.h>
 
-#include "libavutil/channel_layout.h"
-#include "libavutil/crc.h"
 #include "libavutil/internal.h"
 #include "get_bits.h"
 #include "parser.h"
-#include "mlp_parser.h"
+#include "mlp_parse.h"
 #include "mlp.h"
 
-static const uint8_t mlp_quants[16] = {
-    16, 20, 24, 0, 0, 0, 0, 0,
-     0,  0,  0, 0, 0, 0, 0, 0,
-};
-
-static const uint8_t mlp_channels[32] = {
-    1, 2, 3, 4, 3, 4, 5, 3, 4, 5, 4, 5, 6, 4, 5, 4,
-    5, 6, 5, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-const uint64_t ff_mlp_layout[32] = {
-    AV_CH_LAYOUT_MONO,
-    AV_CH_LAYOUT_STEREO,
-    AV_CH_LAYOUT_2_1,
-    AV_CH_LAYOUT_QUAD,
-    AV_CH_LAYOUT_STEREO|AV_CH_LOW_FREQUENCY,
-    AV_CH_LAYOUT_2_1|AV_CH_LOW_FREQUENCY,
-    AV_CH_LAYOUT_QUAD|AV_CH_LOW_FREQUENCY,
-    AV_CH_LAYOUT_SURROUND,
-    AV_CH_LAYOUT_4POINT0,
-    AV_CH_LAYOUT_5POINT0_BACK,
-    AV_CH_LAYOUT_SURROUND|AV_CH_LOW_FREQUENCY,
-    AV_CH_LAYOUT_4POINT0|AV_CH_LOW_FREQUENCY,
-    AV_CH_LAYOUT_5POINT1_BACK,
-    AV_CH_LAYOUT_4POINT0,
-    AV_CH_LAYOUT_5POINT0_BACK,
-    AV_CH_LAYOUT_SURROUND|AV_CH_LOW_FREQUENCY,
-    AV_CH_LAYOUT_4POINT0|AV_CH_LOW_FREQUENCY,
-    AV_CH_LAYOUT_5POINT1_BACK,
-    AV_CH_LAYOUT_QUAD|AV_CH_LOW_FREQUENCY,
-    AV_CH_LAYOUT_5POINT0_BACK,
-    AV_CH_LAYOUT_5POINT1_BACK,
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
-};
-
-static const uint8_t thd_chancount[13] = {
-//  LR    C   LFE  LRs LRvh  LRc LRrs  Cs   Ts  LRsd  LRw  Cvh  LFE2
-     2,   1,   1,   2,   2,   2,   2,   1,   1,   2,   2,   1,   1
-};
-
-static const uint64_t thd_layout[13] = {
-    AV_CH_FRONT_LEFT|AV_CH_FRONT_RIGHT,                     // LR
-    AV_CH_FRONT_CENTER,                                     // C
-    AV_CH_LOW_FREQUENCY,                                    // LFE
-    AV_CH_SIDE_LEFT|AV_CH_SIDE_RIGHT,                       // LRs
-    AV_CH_TOP_FRONT_LEFT|AV_CH_TOP_FRONT_RIGHT,             // LRvh
-    AV_CH_FRONT_LEFT_OF_CENTER|AV_CH_FRONT_RIGHT_OF_CENTER, // LRc
-    AV_CH_BACK_LEFT|AV_CH_BACK_RIGHT,                       // LRrs
-    AV_CH_BACK_CENTER,                                      // Cs
-    AV_CH_TOP_CENTER,                                       // Ts
-    AV_CH_SURROUND_DIRECT_LEFT|AV_CH_SURROUND_DIRECT_RIGHT, // LRsd
-    AV_CH_WIDE_LEFT|AV_CH_WIDE_RIGHT,                       // LRw
-    AV_CH_TOP_FRONT_CENTER,                                 // Cvh
-    AV_CH_LOW_FREQUENCY_2,                                  // LFE2
-};
-
-static int mlp_samplerate(int in)
-{
-    if (in == 0xF)
-        return 0;
-
-    return (in & 8 ? 44100 : 48000) << (in & 7) ;
-}
-
-static int truehd_channels(int chanmap)
-{
-    int channels = 0, i;
-
-    for (i = 0; i < 13; i++)
-        channels += thd_chancount[i] * ((chanmap >> i) & 1);
-
-    return channels;
-}
-
-uint64_t ff_truehd_layout(int chanmap)
-{
-    int i;
-    uint64_t layout = 0;
-
-    for (i = 0; i < 13; i++)
-        layout |= thd_layout[i] * ((chanmap >> i) & 1);
-
-    return layout;
-}
-
-static int mlp_get_major_sync_size(const uint8_t * buf, int bufsize)
-{
-    int has_extension, extensions = 0;
-    int size = 28;
-    if (bufsize < 28)
-        return -1;
-
-    if (AV_RB32(buf) == 0xf8726fba) {
-        has_extension = buf[25] & 1;
-        if (has_extension) {
-            extensions = buf[26] >> 4;
-            size += 2 + extensions * 2;
-        }
-    }
-    return size;
-}
-
-/** Read a major sync info header - contains high level information about
- *  the stream - sample rate, channel arrangement etc. Most of this
- *  information is not actually necessary for decoding, only for playback.
- *  gb must be a freshly initialized GetBitContext with no bits read.
- */
-
-int ff_mlp_read_major_sync(void *log, MLPHeaderInfo *mh, GetBitContext *gb)
-{
-    int ratebits, channel_arrangement, header_size;
-    uint16_t checksum;
-
-    av_assert1(get_bits_count(gb) == 0);
-
-    header_size = mlp_get_major_sync_size(gb->buffer, gb->size_in_bits >> 3);
-    if (header_size < 0 || gb->size_in_bits < header_size << 3) {
-        av_log(log, AV_LOG_ERROR, "packet too short, unable to read major sync\n");
-        return -1;
-    }
-
-    checksum = ff_mlp_checksum16(gb->buffer, header_size - 2);
-    if (checksum != AV_RL16(gb->buffer+header_size-2)) {
-        av_log(log, AV_LOG_ERROR, "major sync info header checksum error\n");
-        return AVERROR_INVALIDDATA;
-    }
-
-    if (get_bits_long(gb, 24) != 0xf8726f) /* Sync words */
-        return AVERROR_INVALIDDATA;
-
-    mh->stream_type = get_bits(gb, 8);
-    mh->header_size = header_size;
-
-    if (mh->stream_type == 0xbb) {
-        mh->group1_bits = mlp_quants[get_bits(gb, 4)];
-        mh->group2_bits = mlp_quants[get_bits(gb, 4)];
-
-        ratebits = get_bits(gb, 4);
-        mh->group1_samplerate = mlp_samplerate(ratebits);
-        mh->group2_samplerate = mlp_samplerate(get_bits(gb, 4));
-
-        skip_bits(gb, 11);
-
-        mh->channel_arrangement=
-        channel_arrangement    = get_bits(gb, 5);
-        mh->channels_mlp       = mlp_channels[channel_arrangement];
-        mh->channel_layout_mlp = ff_mlp_layout[channel_arrangement];
-    } else if (mh->stream_type == 0xba) {
-        mh->group1_bits = 24; // TODO: Is this information actually conveyed anywhere?
-        mh->group2_bits = 0;
-
-        ratebits = get_bits(gb, 4);
-        mh->group1_samplerate = mlp_samplerate(ratebits);
-        mh->group2_samplerate = 0;
-
-        skip_bits(gb, 4);
-
-        mh->channel_modifier_thd_stream0 = get_bits(gb, 2);
-        mh->channel_modifier_thd_stream1 = get_bits(gb, 2);
-
-        mh->channel_arrangement=
-        channel_arrangement            = get_bits(gb, 5);
-        mh->channels_thd_stream1       = truehd_channels(channel_arrangement);
-        mh->channel_layout_thd_stream1 = ff_truehd_layout(channel_arrangement);
-
-        mh->channel_modifier_thd_stream2 = get_bits(gb, 2);
-
-        channel_arrangement            = get_bits(gb, 13);
-        mh->channels_thd_stream2       = truehd_channels(channel_arrangement);
-        mh->channel_layout_thd_stream2 = ff_truehd_layout(channel_arrangement);
-    } else
-        return AVERROR_INVALIDDATA;
-
-    mh->access_unit_size = 40 << (ratebits & 7);
-    mh->access_unit_size_pow2 = 64 << (ratebits & 7);
-
-    skip_bits_long(gb, 48);
-
-    mh->is_vbr = get_bits1(gb);
-
-    mh->peak_bitrate = (get_bits(gb, 15) * mh->group1_samplerate + 8) >> 4;
-
-    mh->num_substreams = get_bits(gb, 4);
-
-    skip_bits_long(gb, 4 + (header_size - 17) * 8);
-
-    return 0;
-}
-
 typedef struct MLPParseContext
 {
     ParseContext pc;
@@ -252,6 +61,8 @@
     int ret;
     int i, p = 0;
 
+    s->key_frame = 0;
+
     *poutbuf_size = 0;
     if (buf_size == 0)
         return 0;
@@ -327,6 +138,8 @@
          * access unit header and all the 2- or 4-byte substream headers. */
         // Only check when this isn't a sync frame - syncs have a checksum.
 
+        s->key_frame = 0;
+
         parity_bits = 0;
         for (i = -1; i < mp->num_substreams; i++) {
             parity_bits ^= buf[p++];
@@ -350,12 +163,15 @@
         if (ff_mlp_read_major_sync(avctx, &mh, &gb) < 0)
             goto lost_sync;
 
+        s->key_frame = 1;
+
         avctx->bits_per_raw_sample = mh.group1_bits;
         if (avctx->bits_per_raw_sample > 16)
             avctx->sample_fmt = AV_SAMPLE_FMT_S32;
         else
             avctx->sample_fmt = AV_SAMPLE_FMT_S16;
         avctx->sample_rate = mh.group1_samplerate;
+        avctx->frame_size =
         s->duration = mh.access_unit_size;
 
         if(!avctx->channels || !avctx->channel_layout) {
diff --git a/libavcodec/mlpdec.c b/libavcodec/mlpdec.c
index 8caa266..1a2c0f2 100644
--- a/libavcodec/mlpdec.c
+++ b/libavcodec/mlpdec.c
@@ -34,7 +34,7 @@
 #include "internal.h"
 #include "libavutil/crc.h"
 #include "parser.h"
-#include "mlp_parser.h"
+#include "mlp_parse.h"
 #include "mlpdsp.h"
 #include "mlp.h"
 #include "config.h"
@@ -266,7 +266,7 @@
             return AVERROR_INVALIDDATA;
 
         if (lsb_bits > 0)
-            result = (result << lsb_bits) + get_bits(gbp, lsb_bits);
+            result = (result << lsb_bits) + get_bits_long(gbp, lsb_bits);
 
         result  += cp->sign_huff_offset;
         result *= 1 << quant_step_size;
@@ -829,7 +829,7 @@
     cp->codebook  = get_bits(gbp, 2);
     cp->huff_lsbs = get_bits(gbp, 5);
 
-    if (cp->huff_lsbs > 24) {
+    if (cp->codebook > 0 && cp->huff_lsbs > 24) {
         av_log(m->avctx, AV_LOG_ERROR, "Invalid huff_lsbs.\n");
         cp->huff_lsbs = 0;
         return AVERROR_INVALIDDATA;
@@ -1195,7 +1195,7 @@
         }
 
         if (length < header_size + substr_header_size) {
-            av_log(m->avctx, AV_LOG_ERROR, "Insuffient data for headers\n");
+            av_log(m->avctx, AV_LOG_ERROR, "Insufficient data for headers\n");
             goto error;
         }
 
diff --git a/libavcodec/mlpdsp.c b/libavcodec/mlpdsp.c
index 32a4503..12bef3a 100644
--- a/libavcodec/mlpdsp.c
+++ b/libavcodec/mlpdsp.c
@@ -79,7 +79,7 @@
 
         if (matrix_noise_shift) {
             index &= access_unit_size_pow2 - 1;
-            accum += noise_buffer[index] << (matrix_noise_shift + 7);
+            accum += noise_buffer[index] * (1 << (matrix_noise_shift + 7));
             index += index2;
         }
 
diff --git a/libavcodec/mlpenc.c b/libavcodec/mlpenc.c
index 7536d3b..c6a7963 100644
--- a/libavcodec/mlpenc.c
+++ b/libavcodec/mlpenc.c
@@ -1,6 +1,7 @@
 /**
  * MLP encoder
  * Copyright (c) 2008 Ramiro Polla
+ * Copyright (c) 2016-2019 Jai Luthra
  *
  * This file is part of FFmpeg.
  *
@@ -86,15 +87,15 @@
 } DecodingParams;
 
 typedef struct BestOffset {
-    int16_t offset;
+    int32_t offset;
     int bitcount;
     int lsb_bits;
-    int16_t min;
-    int16_t max;
+    int32_t min;
+    int32_t max;
 } BestOffset;
 
-#define HUFF_OFFSET_MIN    -16384
-#define HUFF_OFFSET_MAX     16383
+#define HUFF_OFFSET_MIN    (-16384)
+#define HUFF_OFFSET_MAX    ( 16383)
 
 /** Number of possible codebooks (counting "no codebooks") */
 #define NUM_CODEBOOKS       4
@@ -466,7 +467,7 @@
  */
 static int inline number_sbits(int number)
 {
-    if (number < 0)
+    if (number < -1)
         number++;
 
     return av_log2(FFABS(number)) + 1 + !!number;
@@ -807,7 +808,7 @@
 static void write_restart_header(MLPEncodeContext *ctx, PutBitContext *pb)
 {
     RestartHeader *rh = ctx->cur_restart_header;
-    int32_t lossless_check = xor_32_to_8(rh->lossless_check_data);
+    uint8_t lossless_check = xor_32_to_8(rh->lossless_check_data);
     unsigned int start_count = put_bits_count(pb);
     PutBitContext tmpb;
     uint8_t checksum;
@@ -986,6 +987,9 @@
                     put_bits(pb, 1, 0);
                 }
             }
+            if (cp->codebook > 0 && cp->huff_lsbs > 24) {
+                av_log(ctx->avctx, AV_LOG_ERROR, "Invalid Huff LSBs\n");
+            }
 
             put_bits(pb, 2, cp->codebook );
             put_bits(pb, 5, cp->huff_lsbs);
@@ -1016,12 +1020,10 @@
         codebook_index  [ch] = cp->codebook  - 1;
         sign_huff_offset[ch] = cp->huff_offset;
 
-        sign_shift = lsb_bits[ch] - 1;
+        sign_shift = lsb_bits[ch] + (cp->codebook ? 2 - cp->codebook : -1);
 
-        if (cp->codebook > 0) {
+        if (cp->codebook > 0)
             sign_huff_offset[ch] -= 7 << lsb_bits[ch];
-            sign_shift += 3 - cp->codebook;
-        }
 
         /* Unsign if needed. */
         if (sign_shift >= 0)
@@ -1031,7 +1033,6 @@
     for (i = 0; i < dp->blocksize; i++) {
         for (ch = rh->min_channel; ch <= rh->max_channel; ch++) {
             int32_t sample = *sample_buffer++ >> dp->quant_step_size[ch];
-
             sample -= sign_huff_offset[ch];
 
             if (codebook_index[ch] >= 0) {
@@ -1251,7 +1252,7 @@
                 uint32_t abs_sample;
                 int32_t sample;
 
-                sample = is24 ? *samples_32++ >> 8 : *samples_16++ << 8;
+                sample = is24 ? *samples_32++ >> 8 : *samples_16++ * 256;
 
                 /* TODO Find out if number_sbits can be used for negative values. */
                 abs_sample = FFABS(sample);
@@ -1562,7 +1563,7 @@
                                     BestOffset *bo)
 {
     DecodingParams *dp = ctx->cur_decoding_params;
-    int32_t unsign;
+    int32_t unsign = 0;
     int lsb_bits;
 
     min -= offset;
@@ -1572,7 +1573,8 @@
 
     lsb_bits += !!lsb_bits;
 
-    unsign = 1 << (lsb_bits - 1);
+    if (lsb_bits > 0)
+        unsign = 1 << (lsb_bits - 1);
 
     bo->offset   = offset;
     bo->lsb_bits = lsb_bits;
@@ -1591,7 +1593,7 @@
 {
     DecodingParams *dp = ctx->cur_decoding_params;
     int16_t offset;
-    int32_t unsign;
+    int32_t unsign = 0;
     uint32_t diff;
     int lsb_bits;
 
@@ -1607,7 +1609,8 @@
 
     lsb_bits = number_sbits(diff) - 1;
 
-    unsign = 1 << (lsb_bits - 1);
+    if (lsb_bits > 0)
+        unsign = 1 << (lsb_bits - 1);
 
     /* If all samples are the same (lsb_bits == 0), offset must be
      * adjusted because of sign_shift. */
@@ -1699,7 +1702,7 @@
     offset_min = FFMAX(min, HUFF_OFFSET_MIN);
     offset_max = FFMIN(max, HUFF_OFFSET_MAX);
 
-    for (;;) {
+    while (offset <= offset_max && offset >= offset_min) {
         BestOffset temp_bo;
 
         codebook_bits_offset(ctx, channel, codebook,
@@ -1718,12 +1721,8 @@
 
         if (direction) {
             offset = temp_bo.max + 1;
-            if (offset > offset_max)
-                break;
         } else {
             offset = temp_bo.min - 1;
-            if (offset < offset_min)
-                break;
         }
     }
 }
@@ -1796,24 +1795,24 @@
 #define SAMPLE_MAX(bitdepth) ((1 << (bitdepth - 1)) - 1)
 #define SAMPLE_MIN(bitdepth) (~SAMPLE_MAX(bitdepth))
 
-#define MSB_MASK(bits)  (-1u << bits)
+#define MSB_MASK(bits)  (-(int)(1u << (bits)))
 
 /** Applies the filter to the current samples, and saves the residual back
  *  into the samples buffer. If the filter is too bad and overflows the
- *  maximum amount of bits allowed (16 or 24), the samples buffer is left as is and
+ *  maximum amount of bits allowed (24), the samples buffer is left as is and
  *  the function returns -1.
  */
 static int apply_filter(MLPEncodeContext *ctx, unsigned int channel)
 {
     FilterParams *fp[NUM_FILTERS] = { &ctx->cur_channel_params[channel].filter_params[FIR],
                                       &ctx->cur_channel_params[channel].filter_params[IIR], };
-    int32_t *filter_state_buffer[NUM_FILTERS];
+    int32_t *filter_state_buffer[NUM_FILTERS] = { NULL };
     int32_t mask = MSB_MASK(ctx->cur_decoding_params->quant_step_size[channel]);
     int32_t *sample_buffer = ctx->sample_buffer + channel;
     unsigned int number_of_samples = ctx->number_of_samples;
     unsigned int filter_shift = fp[FIR]->shift;
     int filter;
-    int i;
+    int i, ret = 0;
 
     for (i = 0; i < NUM_FILTERS; i++) {
         unsigned int size = ctx->number_of_samples;
@@ -1836,7 +1835,7 @@
         int32_t sample = *sample_buffer;
         unsigned int order;
         int64_t accum = 0;
-        int32_t residual;
+        int64_t residual;
 
         for (filter = 0; filter < NUM_FILTERS; filter++) {
             int32_t *fcoeff = ctx->cur_channel_params[channel].coeff[filter];
@@ -1848,11 +1847,13 @@
         accum  >>= filter_shift;
         residual = sample - (accum & mask);
 
-        if (residual < SAMPLE_MIN(ctx->wordlength) || residual > SAMPLE_MAX(ctx->wordlength))
-            return -1;
+        if (residual < SAMPLE_MIN(24) || residual > SAMPLE_MAX(24)) {
+            ret = -1;
+            goto free_and_return;
+        }
 
         filter_state_buffer[FIR][i] = sample;
-        filter_state_buffer[IIR][i] = residual;
+        filter_state_buffer[IIR][i] = (int32_t) residual;
 
         sample_buffer += ctx->num_channels;
     }
@@ -1864,11 +1865,12 @@
         sample_buffer += ctx->num_channels;
     }
 
+free_and_return:
     for (i = 0; i < NUM_FILTERS; i++) {
         av_freep(&filter_state_buffer[i]);
     }
 
-    return 0;
+    return ret;
 }
 
 static void apply_filters(MLPEncodeContext *ctx)
@@ -1897,8 +1899,8 @@
 
     for (i = 0; i < ctx->number_of_samples; i++) {
         uint16_t seed_shr7 = seed >> 7;
-        *sample_buffer++ = ((int8_t)(seed >> 15)) << rh->noise_shift;
-        *sample_buffer++ = ((int8_t) seed_shr7)   << rh->noise_shift;
+        *sample_buffer++ = ((int8_t)(seed >> 15)) * (1 << rh->noise_shift);
+        *sample_buffer++ = ((int8_t) seed_shr7)   * (1 << rh->noise_shift);
 
         seed = (seed << 16) ^ seed_shr7 ^ (seed_shr7 << 5);
 
@@ -2069,9 +2071,9 @@
             best_codebook = *best_path++ - ZERO_PATH;
             cur_bo = &ctx->best_offset[index][channel][best_codebook];
 
-            cp->huff_offset = cur_bo->offset;
-            cp->huff_lsbs   = cur_bo->lsb_bits + dp->quant_step_size[channel];
-            cp->codebook    = best_codebook;
+            cp->huff_offset      = cur_bo->offset;
+            cp->huff_lsbs        = cur_bo->lsb_bits + dp->quant_step_size[channel];
+            cp->codebook         = best_codebook;
         }
     }
 }
@@ -2199,9 +2201,6 @@
     ctx->number_of_samples = ctx->major_frame_size;
 
     for (substr = 0; substr < ctx->num_substreams; substr++) {
-        RestartHeader *rh = ctx->cur_restart_header;
-        unsigned int channel;
-
         ctx->cur_restart_header = &ctx->restart_header[substr];
 
         ctx->cur_decoding_params = &ctx->major_decoding_params[1][substr];
@@ -2210,8 +2209,7 @@
         generate_2_noise_channels(ctx);
         rematrix_channels        (ctx);
 
-        for (channel = rh->min_channel; channel <= rh->max_channel; channel++)
-            apply_filter(ctx, channel);
+        apply_filters(ctx);
     }
 }
 
@@ -2232,10 +2230,8 @@
         return 1;
 
     /* add current frame to queue */
-    if (frame) {
-        if ((ret = ff_af_queue_add(&ctx->afq, frame)) < 0)
-            return ret;
-    }
+    if ((ret = ff_af_queue_add(&ctx->afq, frame)) < 0)
+        return ret;
 
     data = frame->data[0];
 
@@ -2279,7 +2275,7 @@
     if (restart_frame) {
         set_major_params(ctx);
         if (ctx->min_restart_interval != ctx->max_restart_interval)
-        process_major_frame(ctx);
+            process_major_frame(ctx);
     }
 
     if (ctx->min_restart_interval == ctx->max_restart_interval)
@@ -2377,6 +2373,7 @@
     av_freep(&ctx->decoding_params);
     av_freep(&ctx->channel_params);
     av_freep(&ctx->frame_size);
+    av_freep(&ctx->max_output_bits);
     ff_af_queue_close(&ctx->afq);
 
     return 0;
diff --git a/libavcodec/mmvideo.c b/libavcodec/mmvideo.c
index 04de6bb..7f650be 100644
--- a/libavcodec/mmvideo.c
+++ b/libavcodec/mmvideo.c
@@ -201,7 +201,7 @@
     buf_size -= MM_PREAMBLE_SIZE;
     bytestream2_init(&s->gb, buf, buf_size);
 
-    if ((res = ff_reget_buffer(avctx, s->frame)) < 0)
+    if ((res = ff_reget_buffer(avctx, s->frame, 0)) < 0)
         return res;
 
     switch(type) {
diff --git a/libavcodec/motion_est.c b/libavcodec/motion_est.c
index 8b5ce21..02c75fd 100644
--- a/libavcodec/motion_est.c
+++ b/libavcodec/motion_est.c
@@ -633,7 +633,7 @@
                 if(P[i][1] > (c->ymax<<shift)) P[i][1]= (c->ymax<<shift);
             }
 
-        dmin4 = epzs_motion_search4(s, &mx4, &my4, P, block, block, s->p_mv_table, (1<<16)>>shift);
+        dmin4 = epzs_motion_search2(s, &mx4, &my4, P, block, block, s->p_mv_table, (1<<16)>>shift, 1);
 
         dmin4= c->sub_motion_search(s, &mx4, &my4, dmin4, block, block, size, h);
 
@@ -795,7 +795,7 @@
             P_MV1[0]= mx; //FIXME not correct if block != field_select
             P_MV1[1]= my / 2;
 
-            dmin = epzs_motion_search2(s, &mx_i, &my_i, P, block, field_select+ref_index, mv_table, (1<<16)>>1);
+            dmin = epzs_motion_search2(s, &mx_i, &my_i, P, block, field_select+ref_index, mv_table, (1<<16)>>1, 0);
 
             dmin= c->sub_motion_search(s, &mx_i, &my_i, dmin, block, field_select+ref_index, size, h);
 
@@ -971,7 +971,7 @@
         int i_score= varc-500+(s->lambda2>>FF_LAMBDA_SHIFT)*20;
         c->scene_change_score+= ff_sqrt(p_score) - ff_sqrt(i_score);
 
-        if (vard*2 + 200*256 > varc)
+        if (vard*2 + 200*256 > varc && !s->intra_penalty)
             mb_type|= CANDIDATE_MB_TYPE_INTRA;
         if (varc*2 + 200*256 > vard || s->qscale > 24){
 //        if (varc*2 + 200*256 + 50*(s->lambda2>>FF_LAMBDA_SHIFT) > vard){
@@ -1040,7 +1040,7 @@
 
             intra_score= s->mecc.mb_cmp[0](s, c->scratchpad, pix, s->linesize, 16);
         }
-        intra_score += c->mb_penalty_factor*16;
+        intra_score += c->mb_penalty_factor*16 + s->intra_penalty;
 
         if(intra_score < dmin){
             mb_type= CANDIDATE_MB_TYPE_INTRA;
@@ -1648,7 +1648,7 @@
     }
 }
 
-void ff_fix_long_p_mvs(MpegEncContext * s)
+void ff_fix_long_p_mvs(MpegEncContext * s, int type)
 {
     MotionEstContext * const c= &s->me;
     const int f_code= s->f_code;
@@ -1682,8 +1682,8 @@
                         if(   mx >=range || mx <-range
                            || my >=range || my <-range){
                             s->mb_type[i] &= ~CANDIDATE_MB_TYPE_INTER4V;
-                            s->mb_type[i] |= CANDIDATE_MB_TYPE_INTRA;
-                            s->current_picture.mb_type[i] = CANDIDATE_MB_TYPE_INTRA;
+                            s->mb_type[i] |= type;
+                            s->current_picture.mb_type[i] = type;
                         }
                     }
                 }
diff --git a/libavcodec/motion_est.h b/libavcodec/motion_est.h
index 3b3a8d7..817220f 100644
--- a/libavcodec/motion_est.h
+++ b/libavcodec/motion_est.h
@@ -127,7 +127,7 @@
 int ff_get_best_fcode(struct MpegEncContext *s,
                       int16_t (*mv_table)[2], int type);
 
-void ff_fix_long_p_mvs(struct MpegEncContext *s);
+void ff_fix_long_p_mvs(struct MpegEncContext *s, int type);
 void ff_fix_long_mvs(struct MpegEncContext *s, uint8_t *field_select_table,
                      int field_select, int16_t (*mv_table)[2], int f_code,
                      int type, int truncate);
diff --git a/libavcodec/motion_est_template.c b/libavcodec/motion_est_template.c
index 0c21bbf..13e73f2 100644
--- a/libavcodec/motion_est_template.c
+++ b/libavcodec/motion_est_template.c
@@ -157,8 +157,8 @@
                                   int src_index, int ref_index,
                                   int size, int h)
 {
-    (*mx_ptr)<<=1;
-    (*my_ptr)<<=1;
+    (*mx_ptr) *= 2;
+    (*my_ptr) *= 2;
     return dmin;
 }
 
@@ -989,76 +989,16 @@
     }
 }
 
-static int epzs_motion_search4(MpegEncContext * s,
-                             int *mx_ptr, int *my_ptr, int P[10][2],
-                             int src_index, int ref_index, int16_t (*last_mv)[2],
-                             int ref_mv_scale)
-{
-    MotionEstContext * const c= &s->me;
-    int best[2]={0, 0};
-    int d, dmin;
-    unsigned map_generation;
-    const int penalty_factor= c->penalty_factor;
-    const int size=1;
-    const int h=8;
-    const int ref_mv_stride= s->mb_stride;
-    const int ref_mv_xy= s->mb_x + s->mb_y *ref_mv_stride;
-    me_cmp_func cmpf, chroma_cmpf;
-    LOAD_COMMON
-    int flags= c->flags;
-    LOAD_COMMON2
-
-    cmpf        = s->mecc.me_cmp[size];
-    chroma_cmpf = s->mecc.me_cmp[size + 1];
-
-    map_generation= update_map_generation(c);
-
-    dmin = 1000000;
-
-    /* first line */
-    if (s->first_slice_line) {
-        CHECK_MV(P_LEFT[0]>>shift, P_LEFT[1]>>shift)
-        CHECK_CLIPPED_MV((last_mv[ref_mv_xy][0]*ref_mv_scale + (1<<15))>>16,
-                        (last_mv[ref_mv_xy][1]*ref_mv_scale + (1<<15))>>16)
-        CHECK_MV(P_MV1[0]>>shift, P_MV1[1]>>shift)
-    }else{
-        CHECK_MV(P_MV1[0]>>shift, P_MV1[1]>>shift)
-        //FIXME try some early stop
-        CHECK_MV(P_MEDIAN[0]>>shift, P_MEDIAN[1]>>shift)
-        CHECK_MV(P_LEFT[0]>>shift, P_LEFT[1]>>shift)
-        CHECK_MV(P_TOP[0]>>shift, P_TOP[1]>>shift)
-        CHECK_MV(P_TOPRIGHT[0]>>shift, P_TOPRIGHT[1]>>shift)
-        CHECK_CLIPPED_MV((last_mv[ref_mv_xy][0]*ref_mv_scale + (1<<15))>>16,
-                        (last_mv[ref_mv_xy][1]*ref_mv_scale + (1<<15))>>16)
-    }
-    if(dmin>64*4){
-        CHECK_CLIPPED_MV((last_mv[ref_mv_xy+1][0]*ref_mv_scale + (1<<15))>>16,
-                        (last_mv[ref_mv_xy+1][1]*ref_mv_scale + (1<<15))>>16)
-        if(s->mb_y+1<s->end_mb_y)  //FIXME replace at least with last_slice_line
-            CHECK_CLIPPED_MV((last_mv[ref_mv_xy+ref_mv_stride][0]*ref_mv_scale + (1<<15))>>16,
-                            (last_mv[ref_mv_xy+ref_mv_stride][1]*ref_mv_scale + (1<<15))>>16)
-    }
-
-    dmin= diamond_search(s, best, dmin, src_index, ref_index, penalty_factor, size, h, flags);
-
-    *mx_ptr= best[0];
-    *my_ptr= best[1];
-
-    return dmin;
-}
-
-//try to merge with above FIXME (needs PSNR test)
 static int epzs_motion_search2(MpegEncContext * s,
                              int *mx_ptr, int *my_ptr, int P[10][2],
                              int src_index, int ref_index, int16_t (*last_mv)[2],
-                             int ref_mv_scale)
+                             int ref_mv_scale, const int size)
 {
     MotionEstContext * const c= &s->me;
     int best[2]={0, 0};
     int d, dmin;
     unsigned map_generation;
     const int penalty_factor= c->penalty_factor;
-    const int size=0; //FIXME pass as arg
     const int h=8;
     const int ref_mv_stride= s->mb_stride;
     const int ref_mv_xy= s->mb_x + s->mb_y *ref_mv_stride;
diff --git a/libavcodec/motionpixels.c b/libavcodec/motionpixels.c
index a88b837..6cb444a 100644
--- a/libavcodec/motionpixels.c
+++ b/libavcodec/motionpixels.c
@@ -171,7 +171,7 @@
    return 0;
 }
 
-static int mp_gradient(MotionPixelsContext *mp, int component, int v)
+static av_always_inline int mp_gradient(MotionPixelsContext *mp, int component, int v)
 {
     int delta;
 
@@ -196,11 +196,13 @@
     *(uint16_t *)&mp->frame->data[0][y * mp->frame->linesize[0] + x * 2] = color;
 }
 
-static int mp_get_vlc(MotionPixelsContext *mp, GetBitContext *gb)
+static av_always_inline int mp_get_vlc(MotionPixelsContext *mp, GetBitContext *gb)
 {
     int i;
 
     i = (mp->codes_count == 1) ? 0 : get_vlc2(gb, mp->vlc.table, mp->max_codes_bits, 1);
+    if (i < 0)
+        return i;
     return mp->codes[i].delta;
 }
 
@@ -290,7 +292,7 @@
     GetBitContext gb;
     int i, count1, count2, sz, ret;
 
-    if ((ret = ff_reget_buffer(avctx, mp->frame)) < 0)
+    if ((ret = ff_reget_buffer(avctx, mp->frame, 0)) < 0)
         return ret;
 
     /* le32 bitstream msb first */
diff --git a/libavcodec/movsub_bsf.c b/libavcodec/movsub_bsf.c
index 5878607..cd48aa7 100644
--- a/libavcodec/movsub_bsf.c
+++ b/libavcodec/movsub_bsf.c
@@ -75,8 +75,8 @@
        return AVERROR_INVALIDDATA;
     }
 
-    pkt->data += 2;
     pkt->size  = FFMIN(pkt->size - 2, AV_RB16(pkt->data));
+    pkt->data += 2;
 
     return 0;
 }
diff --git a/libavcodec/movtextdec.c b/libavcodec/movtextdec.c
index c38c5ed..4b4da5e 100644
--- a/libavcodec/movtextdec.c
+++ b/libavcodec/movtextdec.c
@@ -21,6 +21,7 @@
 
 #include "avcodec.h"
 #include "ass.h"
+#include "libavutil/opt.h"
 #include "libavutil/avstring.h"
 #include "libavutil/common.h"
 #include "libavutil/bprint.h"
@@ -48,14 +49,19 @@
 #define TOP_CENTER      8
 #define TOP_RIGHT       9
 
+#define RGB_TO_BGR(c) (((c) & 0xff) << 16 | ((c) & 0xff00) | (((c) >> 16) & 0xff))
+
 typedef struct {
-    char *font;
-    int fontsize;
+    uint16_t fontID;
+    const char *font;
+    uint8_t fontsize;
     int color;
+    uint8_t alpha;
     int back_color;
-    int bold;
-    int italic;
-    int underline;
+    uint8_t back_alpha;
+    uint8_t bold;
+    uint8_t italic;
+    uint8_t underline;
     int alignment;
 } MovTextDefault;
 
@@ -68,6 +74,11 @@
     uint16_t style_start;
     uint16_t style_end;
     uint8_t style_flag;
+    uint8_t bold;
+    uint8_t italic;
+    uint8_t underline;
+    int color;
+    uint8_t alpha;
     uint8_t fontsize;
     uint16_t style_fontID;
 } StyleBox;
@@ -86,6 +97,7 @@
 } TextWrapBox;
 
 typedef struct {
+    AVClass *class;
     StyleBox **s;
     StyleBox *s_temp;
     HighlightBox h;
@@ -100,6 +112,8 @@
     int size_var;
     int count_s, count_f;
     int readorder;
+    int frame_width;
+    int frame_height;
 } MovTextContext;
 
 typedef struct {
@@ -141,7 +155,6 @@
     uint8_t *tx3g_ptr = avctx->extradata;
     int i, box_size, font_length;
     int8_t v_align, h_align;
-    int style_fontID;
     StyleBox s_default;
 
     m->count_f = 0;
@@ -181,24 +194,28 @@
     }
     // Background Color
     m->d.back_color = AV_RB24(tx3g_ptr);
-    tx3g_ptr += 4;
+    tx3g_ptr += 3;
+    m->d.back_alpha = AV_RB8(tx3g_ptr);
+    tx3g_ptr += 1;
     // BoxRecord
     tx3g_ptr += 8;
     // StyleRecord
     tx3g_ptr += 4;
     // fontID
-    style_fontID = AV_RB16(tx3g_ptr);
+    m->d.fontID = AV_RB16(tx3g_ptr);
     tx3g_ptr += 2;
     // face-style-flags
     s_default.style_flag = *tx3g_ptr++;
-    m->d.bold = s_default.style_flag & STYLE_FLAG_BOLD;
-    m->d.italic = s_default.style_flag & STYLE_FLAG_ITALIC;
-    m->d.underline = s_default.style_flag & STYLE_FLAG_UNDERLINE;
+    m->d.bold = !!(s_default.style_flag & STYLE_FLAG_BOLD);
+    m->d.italic = !!(s_default.style_flag & STYLE_FLAG_ITALIC);
+    m->d.underline = !!(s_default.style_flag & STYLE_FLAG_UNDERLINE);
     // fontsize
     m->d.fontsize = *tx3g_ptr++;
     // Primary color
     m->d.color = AV_RB24(tx3g_ptr);
-    tx3g_ptr += 4;
+    tx3g_ptr += 3;
+    m->d.alpha = AV_RB8(tx3g_ptr);
+    tx3g_ptr += 1;
     // FontRecord
     // FontRecord Size
     tx3g_ptr += 4;
@@ -246,8 +263,10 @@
         m->ftab_temp = NULL;
         tx3g_ptr = tx3g_ptr + font_length;
     }
+    // In case of broken header, init default font
+    m->d.font = ASS_DEFAULT_FONT;
     for (i = 0; i < m->ftab_entries; i++) {
-        if (style_fontID == m->ftab[i]->fontID)
+        if (m->d.fontID == m->ftab[i]->fontID)
             m->d.font = m->ftab[i]->font;
     }
     return 0;
@@ -311,16 +330,21 @@
         m->s_temp->style_fontID = AV_RB16(tsmb);
         tsmb += 2;
         m->s_temp->style_flag = AV_RB8(tsmb);
+        m->s_temp->bold = !!(m->s_temp->style_flag & STYLE_FLAG_BOLD);
+        m->s_temp->italic = !!(m->s_temp->style_flag & STYLE_FLAG_ITALIC);
+        m->s_temp->underline = !!(m->s_temp->style_flag & STYLE_FLAG_UNDERLINE);
         tsmb++;
         m->s_temp->fontsize = AV_RB8(tsmb);
+        tsmb++;
+        m->s_temp->color = AV_RB24(tsmb);
+        tsmb += 3;
+        m->s_temp->alpha = AV_RB8(tsmb);
+        tsmb++;
         av_dynarray_add(&m->s, &m->count_s, m->s_temp);
         if(!m->s) {
             mov_text_cleanup(m);
             return AVERROR(ENOMEM);
         }
-        tsmb++;
-        // text-color-rgba
-        tsmb += 4;
     }
     return 0;
 }
@@ -353,8 +377,10 @@
 {
     MovTextContext *m = avctx->priv_data;
     int i = 0;
-    int j = 0;
     int text_pos = 0;
+    int style_active = 0;
+    int entry = 0;
+    int color = m->d.color;
 
     if (text < text_end && m->box_flags & TWRP_BOX) {
         if (m->w.wrap_flag == 1) {
@@ -367,26 +393,36 @@
     while (text < text_end) {
         int len;
 
-        if (m->box_flags & STYL_BOX) {
-            for (i = 0; i < m->style_entries; i++) {
-                if (m->s[i]->style_flag && text_pos == m->s[i]->style_end) {
-                    av_bprintf(buf, "{\\r}");
-                }
-            }
-            for (i = 0; i < m->style_entries; i++) {
-                if (m->s[i]->style_flag && text_pos == m->s[i]->style_start) {
-                    if (m->s[i]->style_flag & STYLE_FLAG_BOLD)
-                        av_bprintf(buf, "{\\b1}");
-                    if (m->s[i]->style_flag & STYLE_FLAG_ITALIC)
-                        av_bprintf(buf, "{\\i1}");
-                    if (m->s[i]->style_flag & STYLE_FLAG_UNDERLINE)
-                        av_bprintf(buf, "{\\u1}");
-                    av_bprintf(buf, "{\\fs%d}", m->s[i]->fontsize);
-                    for (j = 0; j < m->ftab_entries; j++) {
-                        if (m->s[i]->style_fontID == m->ftab[j]->fontID)
-                            av_bprintf(buf, "{\\fn%s}", m->ftab[j]->font);
+        if ((m->box_flags & STYL_BOX) && entry < m->style_entries) {
+            if (text_pos == m->s[entry]->style_start) {
+                style_active = 1;
+                if (m->s[entry]->bold ^ m->d.bold)
+                    av_bprintf(buf, "{\\b%d}", m->s[entry]->bold);
+                if (m->s[entry]->italic ^ m->d.italic)
+                    av_bprintf(buf, "{\\i%d}", m->s[entry]->italic);
+                if (m->s[entry]->underline ^ m->d.underline)
+                    av_bprintf(buf, "{\\u%d}", m->s[entry]->underline);
+                if (m->s[entry]->fontsize != m->d.fontsize)
+                    av_bprintf(buf, "{\\fs%d}", m->s[entry]->fontsize);
+                if (m->s[entry]->style_fontID != m->d.fontID)
+                    for (i = 0; i < m->ftab_entries; i++) {
+                        if (m->s[entry]->style_fontID == m->ftab[i]->fontID)
+                            av_bprintf(buf, "{\\fn%s}", m->ftab[i]->font);
                     }
+                if (m->d.color != m->s[entry]->color) {
+                    color = m->s[entry]->color;
+                    av_bprintf(buf, "{\\1c&H%X&}", RGB_TO_BGR(color));
                 }
+                if (m->d.alpha != m->s[entry]->alpha)
+                    av_bprintf(buf, "{\\1a&H%02X&}", 255 - m->s[entry]->alpha);
+            }
+            if (text_pos == m->s[entry]->style_end) {
+                if (style_active) {
+                    av_bprintf(buf, "{\\r}");
+                    style_active = 0;
+                    color = m->d.color;
+                }
+                entry++;
             }
         }
         if (m->box_flags & HLIT_BOX) {
@@ -406,9 +442,10 @@
             }
             if (text_pos == m->h.hlit_end) {
                 if (m->box_flags & HCLR_BOX) {
-                    av_bprintf(buf, "{\\2c&H000000&}");
+                    av_bprintf(buf, "{\\2c&H%X&}", RGB_TO_BGR(m->d.color));
                 } else {
-                    av_bprintf(buf, "{\\1c&HFFFFFF&}{\\2c&H000000&}");
+                    av_bprintf(buf, "{\\1c&H%X&}{\\2c&H%X&}",
+                               RGB_TO_BGR(color), RGB_TO_BGR(m->d.color));
                 }
             }
         }
@@ -448,10 +485,19 @@
     MovTextContext *m = avctx->priv_data;
     ret = mov_text_tx3g(avctx, m);
     if (ret == 0) {
-        return ff_ass_subtitle_header(avctx, m->d.font, m->d.fontsize, m->d.color,
-                                m->d.back_color, m->d.bold, m->d.italic,
-                                m->d.underline, ASS_DEFAULT_BORDERSTYLE,
-                                m->d.alignment);
+        if (!m->frame_width || !m->frame_height) {
+            m->frame_width = ASS_DEFAULT_PLAYRESX;
+            m->frame_height = ASS_DEFAULT_PLAYRESY;
+        }
+        return ff_ass_subtitle_header_full(avctx,
+                    m->frame_width, m->frame_height,
+                    m->d.font, m->d.fontsize,
+                    (255 - m->d.alpha) << 24 | RGB_TO_BGR(m->d.color),
+                    (255 - m->d.alpha) << 24 | RGB_TO_BGR(m->d.color),
+                    (255 - m->d.back_alpha) << 24 | RGB_TO_BGR(m->d.back_color),
+                    (255 - m->d.back_alpha) << 24 | RGB_TO_BGR(m->d.back_color),
+                    m->d.bold, m->d.italic, m->d.underline,
+                    ASS_DEFAULT_BORDERSTYLE, m->d.alignment);
     } else
         return ff_ass_subtitle_header_default(avctx);
 }
@@ -567,12 +613,28 @@
         m->readorder = 0;
 }
 
+#define OFFSET(x) offsetof(MovTextContext, x)
+#define FLAGS AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_SUBTITLE_PARAM
+static const AVOption options[] = {
+    { "width", "Frame width, usually video width", OFFSET(frame_width), AV_OPT_TYPE_INT, {.i64=0}, 0, INT_MAX, FLAGS },
+    { "height", "Frame height, usually video height", OFFSET(frame_height), AV_OPT_TYPE_INT, {.i64=0}, 0, INT_MAX, FLAGS },
+    { NULL },
+};
+
+static const AVClass mov_text_decoder_class = {
+    .class_name = "MOV text decoder",
+    .item_name  = av_default_item_name,
+    .option     = options,
+    .version    = LIBAVUTIL_VERSION_INT,
+};
+
 AVCodec ff_movtext_decoder = {
     .name         = "mov_text",
     .long_name    = NULL_IF_CONFIG_SMALL("3GPP Timed Text subtitle"),
     .type         = AVMEDIA_TYPE_SUBTITLE,
     .id           = AV_CODEC_ID_MOV_TEXT,
     .priv_data_size = sizeof(MovTextContext),
+    .priv_class   = &mov_text_decoder_class,
     .init         = mov_text_init,
     .decode       = mov_text_decode_frame,
     .close        = mov_text_decode_close,
diff --git a/libavcodec/movtextenc.c b/libavcodec/movtextenc.c
index c19ef38..b2368b6 100644
--- a/libavcodec/movtextenc.c
+++ b/libavcodec/movtextenc.c
@@ -21,6 +21,7 @@
 
 #include <stdarg.h>
 #include "avcodec.h"
+#include "libavutil/opt.h"
 #include "libavutil/avassert.h"
 #include "libavutil/avstring.h"
 #include "libavutil/intreadwrite.h"
@@ -39,12 +40,22 @@
 #define HLIT_BOX   (1<<1)
 #define HCLR_BOX   (1<<2)
 
+#define DEFAULT_STYLE_FONT_ID  0x01
+#define DEFAULT_STYLE_FONTSIZE 0x12
+#define DEFAULT_STYLE_COLOR    0xffffffff
+#define DEFAULT_STYLE_FLAG     0x00
+
+#define BGR_TO_RGB(c) (((c) & 0xff) << 16 | ((c) & 0xff00) | (((c) >> 16) & 0xff))
+#define FONTSIZE_SCALE(s,fs) ((fs) * (s)->font_scale_factor + 0.5)
 #define av_bprint_append_any(buf, data, size)   av_bprint_append_data(buf, ((const char*)data), size)
 
 typedef struct {
     uint16_t style_start;
     uint16_t style_end;
     uint8_t style_flag;
+    uint16_t style_fontID;
+    uint8_t style_fontsize;
+    uint32_t style_color;
 } StyleBox;
 
 typedef struct {
@@ -57,9 +68,11 @@
 } HilightcolorBox;
 
 typedef struct {
+    AVClass *class;
     AVCodecContext *avctx;
 
     ASSSplitContext *ass_ctx;
+    ASSStyle *ass_dialog_style;
     AVBPrint buffer;
     StyleBox **style_attributes;
     StyleBox *style_attributes_temp;
@@ -67,12 +80,13 @@
     HilightcolorBox hclr;
     int count;
     uint8_t box_flags;
-    uint16_t style_entries;
-    uint16_t style_fontID;
-    uint8_t style_fontsize;
-    uint32_t style_color;
+    StyleBox d;
     uint16_t text_pos;
     uint16_t byte_count;
+    char ** fonts;
+    int font_count;
+    double font_scale_factor;
+    int frame_height;
 } MovTextContext;
 
 typedef struct {
@@ -89,58 +103,71 @@
         }
         av_freep(&s->style_attributes);
     }
+    if (s->style_attributes_temp) {
+        *s->style_attributes_temp = s->d;
+    }
 }
 
 static void encode_styl(MovTextContext *s, uint32_t tsmb_type)
 {
     int j;
     uint32_t tsmb_size;
-    if (s->box_flags & STYL_BOX) {
+    uint16_t style_entries;
+    if ((s->box_flags & STYL_BOX) && s->count) {
         tsmb_size = s->count * STYLE_RECORD_SIZE + SIZE_ADD;
         tsmb_size = AV_RB32(&tsmb_size);
-        s->style_entries = AV_RB16(&s->count);
-        s->style_fontID = 0x00 | 0x01<<8;
-        s->style_fontsize = 0x12;
-        s->style_color = MKTAG(0xFF, 0xFF, 0xFF, 0xFF);
+        style_entries = AV_RB16(&s->count);
         /*The above three attributes are hard coded for now
         but will come from ASS style in the future*/
         av_bprint_append_any(&s->buffer, &tsmb_size, 4);
         av_bprint_append_any(&s->buffer, &tsmb_type, 4);
-        av_bprint_append_any(&s->buffer, &s->style_entries, 2);
+        av_bprint_append_any(&s->buffer, &style_entries, 2);
         for (j = 0; j < s->count; j++) {
-            av_bprint_append_any(&s->buffer, &s->style_attributes[j]->style_start, 2);
-            av_bprint_append_any(&s->buffer, &s->style_attributes[j]->style_end, 2);
-            av_bprint_append_any(&s->buffer, &s->style_fontID, 2);
+            uint16_t style_start, style_end, style_fontID;
+            uint32_t style_color;
+
+            style_start  = AV_RB16(&s->style_attributes[j]->style_start);
+            style_end    = AV_RB16(&s->style_attributes[j]->style_end);
+            style_color  = AV_RB32(&s->style_attributes[j]->style_color);
+            style_fontID = AV_RB16(&s->style_attributes[j]->style_fontID);
+
+            av_bprint_append_any(&s->buffer, &style_start, 2);
+            av_bprint_append_any(&s->buffer, &style_end, 2);
+            av_bprint_append_any(&s->buffer, &style_fontID, 2);
             av_bprint_append_any(&s->buffer, &s->style_attributes[j]->style_flag, 1);
-            av_bprint_append_any(&s->buffer, &s->style_fontsize, 1);
-            av_bprint_append_any(&s->buffer, &s->style_color, 4);
+            av_bprint_append_any(&s->buffer, &s->style_attributes[j]->style_fontsize, 1);
+            av_bprint_append_any(&s->buffer, &style_color, 4);
         }
-        mov_text_cleanup(s);
     }
+    mov_text_cleanup(s);
 }
 
 static void encode_hlit(MovTextContext *s, uint32_t tsmb_type)
 {
     uint32_t tsmb_size;
+    uint16_t start, end;
     if (s->box_flags & HLIT_BOX) {
         tsmb_size = 12;
         tsmb_size = AV_RB32(&tsmb_size);
+        start     = AV_RB16(&s->hlit.start);
+        end       = AV_RB16(&s->hlit.end);
         av_bprint_append_any(&s->buffer, &tsmb_size, 4);
         av_bprint_append_any(&s->buffer, &tsmb_type, 4);
-        av_bprint_append_any(&s->buffer, &s->hlit.start, 2);
-        av_bprint_append_any(&s->buffer, &s->hlit.end, 2);
+        av_bprint_append_any(&s->buffer, &start, 2);
+        av_bprint_append_any(&s->buffer, &end, 2);
     }
 }
 
 static void encode_hclr(MovTextContext *s, uint32_t tsmb_type)
 {
-    uint32_t tsmb_size;
+    uint32_t tsmb_size, color;
     if (s->box_flags & HCLR_BOX) {
         tsmb_size = 12;
         tsmb_size = AV_RB32(&tsmb_size);
+        color     = AV_RB32(&s->hclr.color);
         av_bprint_append_any(&s->buffer, &tsmb_size, 4);
         av_bprint_append_any(&s->buffer, &tsmb_type, 4);
-        av_bprint_append_any(&s->buffer, &s->hclr.color, 4);
+        av_bprint_append_any(&s->buffer, &color, 4);
     }
 }
 
@@ -152,157 +179,451 @@
 
 const static size_t box_count = FF_ARRAY_ELEMS(box_types);
 
-static av_cold int mov_text_encode_init(AVCodecContext *avctx)
+static int mov_text_encode_close(AVCodecContext *avctx)
 {
-    /*
-     * For now, we'll use a fixed default style. When we add styling
-     * support, this will be generated from the ASS style.
-     */
-    static const uint8_t text_sample_entry[] = {
+    MovTextContext *s = avctx->priv_data;
+    int i;
+
+    ff_ass_split_free(s->ass_ctx);
+    if (s->style_attributes) {
+        for (i = 0; i < s->count; i++) {
+            av_freep(&s->style_attributes[i]);
+        }
+        av_freep(&s->style_attributes);
+    }
+    av_freep(&s->fonts);
+    av_freep(&s->style_attributes_temp);
+    av_bprint_finalize(&s->buffer, NULL);
+    return 0;
+}
+
+static int encode_sample_description(AVCodecContext *avctx)
+{
+    ASS * ass;
+    ASSStyle * style;
+    int i, j;
+    uint32_t tsmb_size, tsmb_type, back_color, style_color;
+    uint16_t style_start, style_end, fontID, count;
+    int font_names_total_len = 0;
+    MovTextContext *s = avctx->priv_data;
+
+    static const uint8_t display_and_justification[] = {
         0x00, 0x00, 0x00, 0x00, // uint32_t displayFlags
         0x01,                   // int8_t horizontal-justification
         0xFF,                   // int8_t vertical-justification
-        0x00, 0x00, 0x00, 0x00, // uint8_t background-color-rgba[4]
-        // BoxRecord {
+    };
+    //  0x00, 0x00, 0x00, 0x00, // uint8_t background-color-rgba[4]
+    static const uint8_t box_record[] = {
+    //     BoxRecord {
         0x00, 0x00,             // int16_t top
         0x00, 0x00,             // int16_t left
         0x00, 0x00,             // int16_t bottom
         0x00, 0x00,             // int16_t right
-        // };
-        // StyleRecord {
-        0x00, 0x00,             // uint16_t startChar
-        0x00, 0x00,             // uint16_t endChar
-        0x00, 0x01,             // uint16_t font-ID
-        0x00,                   // uint8_t face-style-flags
-        0x12,                   // uint8_t font-size
-        0xFF, 0xFF, 0xFF, 0xFF, // uint8_t text-color-rgba[4]
-        // };
-        // FontTableBox {
-        0x00, 0x00, 0x00, 0x12, // uint32_t size
-        'f', 't', 'a', 'b',     // uint8_t name[4]
-        0x00, 0x01,             // uint16_t entry-count
-        // FontRecord {
-        0x00, 0x01,             // uint16_t font-ID
-        0x05,                   // uint8_t font-name-length
-        'S', 'e', 'r', 'i', 'f',// uint8_t font[font-name-length]
-        // };
-        // };
+    //     };
     };
+    //     StyleRecord {
+    //  0x00, 0x00,             // uint16_t startChar
+    //  0x00, 0x00,             // uint16_t endChar
+    //  0x00, 0x01,             // uint16_t font-ID
+    //  0x00,                   // uint8_t face-style-flags
+    //  0x12,                   // uint8_t font-size
+    //  0xFF, 0xFF, 0xFF, 0xFF, // uint8_t text-color-rgba[4]
+    //     };
+    //     FontTableBox {
+    //  0x00, 0x00, 0x00, 0x12, // uint32_t size
+    //  'f', 't', 'a', 'b',     // uint8_t name[4]
+    //  0x00, 0x01,             // uint16_t entry-count
+    //     FontRecord {
+    //  0x00, 0x01,             // uint16_t font-ID
+    //  0x05,                   // uint8_t font-name-length
+    //  'S', 'e', 'r', 'i', 'f',// uint8_t font[font-name-length]
+    //     };
+    //     };
 
+    // Populate sample description from ASS header
+    ass = (ASS*)s->ass_ctx;
+    // Compute font scaling factor based on (optionally) provided
+    // output video height and ASS script play_res_y
+    if (s->frame_height && ass->script_info.play_res_y)
+        s->font_scale_factor = (double)s->frame_height / ass->script_info.play_res_y;
+    else
+        s->font_scale_factor = 1;
+
+    style = ff_ass_style_get(s->ass_ctx, "Default");
+    if (!style && ass->styles_count) {
+        style = &ass->styles[0];
+    }
+    s->d.style_fontID   = DEFAULT_STYLE_FONT_ID;
+    s->d.style_fontsize = DEFAULT_STYLE_FONTSIZE;
+    s->d.style_color    = DEFAULT_STYLE_COLOR;
+    s->d.style_flag     = DEFAULT_STYLE_FLAG;
+    if (style) {
+        s->d.style_fontsize = FONTSIZE_SCALE(s, style->font_size);
+        s->d.style_color = BGR_TO_RGB(style->primary_color & 0xffffff) << 8 |
+                           255 - ((uint32_t)style->primary_color >> 24);
+        s->d.style_flag = (!!style->bold      * STYLE_FLAG_BOLD)   |
+                          (!!style->italic    * STYLE_FLAG_ITALIC) |
+                          (!!style->underline * STYLE_FLAG_UNDERLINE);
+        back_color = (BGR_TO_RGB(style->back_color & 0xffffff) << 8) |
+                     (255 - ((uint32_t)style->back_color >> 24));
+    }
+
+    av_bprint_append_any(&s->buffer, display_and_justification,
+                                     sizeof(display_and_justification));
+    back_color = AV_RB32(&back_color);
+    av_bprint_append_any(&s->buffer, &back_color, 4);
+    //     BoxRecord {
+    av_bprint_append_any(&s->buffer, box_record, sizeof(box_record));
+    //     };
+    //     StyleRecord {
+    style_start  = AV_RB16(&s->d.style_start);
+    style_end    = AV_RB16(&s->d.style_end);
+    fontID = AV_RB16(&s->d.style_fontID);
+    style_color  = AV_RB32(&s->d.style_color);
+    av_bprint_append_any(&s->buffer, &style_start, 2);
+    av_bprint_append_any(&s->buffer, &style_end, 2);
+    av_bprint_append_any(&s->buffer, &fontID, 2);
+    av_bprint_append_any(&s->buffer, &s->d.style_flag, 1);
+    av_bprint_append_any(&s->buffer, &s->d.style_fontsize, 1);
+    av_bprint_append_any(&s->buffer, &style_color, 4);
+    //     };
+
+    // Build font table
+    // We can't build a complete font table since that would require
+    // scanning all dialogs first.  But we can at least fill in what
+    // is avaiable in the ASS header
+    if (style && ass->styles_count) {
+        // Find unique font names
+        av_dynarray_add(&s->fonts, &s->font_count, style->font_name);
+        font_names_total_len += strlen(style->font_name);
+        for (i = 0; i < ass->styles_count; i++) {
+            int found = 0;
+            for (j = 0; j < s->font_count; j++) {
+                if (!strcmp(s->fonts[j], ass->styles[i].font_name)) {
+                    found = 1;
+                    break;
+                }
+            }
+            if (!found) {
+                av_dynarray_add(&s->fonts, &s->font_count,
+                                           ass->styles[i].font_name);
+                font_names_total_len += strlen(ass->styles[i].font_name);
+            }
+        }
+    } else
+        av_dynarray_add(&s->fonts, &s->font_count, (char*)"Serif");
+
+    //     FontTableBox {
+    tsmb_size = SIZE_ADD + 3 * s->font_count + font_names_total_len;
+    tsmb_size = AV_RB32(&tsmb_size);
+    tsmb_type = MKTAG('f','t','a','b');
+    count = AV_RB16(&s->font_count);
+    av_bprint_append_any(&s->buffer, &tsmb_size, 4);
+    av_bprint_append_any(&s->buffer, &tsmb_type, 4);
+    av_bprint_append_any(&s->buffer, &count, 2);
+    //     FontRecord {
+    for (i = 0; i < s->font_count; i++) {
+        int len;
+        fontID = i + 1;
+        fontID = AV_RB16(&fontID);
+        av_bprint_append_any(&s->buffer, &fontID, 2);
+        len = strlen(s->fonts[i]);
+        av_bprint_append_any(&s->buffer, &len, 1);
+        av_bprint_append_any(&s->buffer, s->fonts[i], len);
+    }
+    //     };
+    //     };
+
+    if (!av_bprint_is_complete(&s->buffer)) {
+        return AVERROR(ENOMEM);
+    }
+
+    avctx->extradata_size = s->buffer.len;
+    avctx->extradata = av_mallocz(avctx->extradata_size + AV_INPUT_BUFFER_PADDING_SIZE);
+    if (!avctx->extradata) {
+        return AVERROR(ENOMEM);
+    }
+
+    memcpy(avctx->extradata, s->buffer.str, avctx->extradata_size);
+    av_bprint_clear(&s->buffer);
+
+    return 0;
+}
+
+static av_cold int mov_text_encode_init(AVCodecContext *avctx)
+{
+    int ret;
     MovTextContext *s = avctx->priv_data;
     s->avctx = avctx;
 
-    avctx->extradata_size = sizeof text_sample_entry;
-    avctx->extradata = av_mallocz(avctx->extradata_size + AV_INPUT_BUFFER_PADDING_SIZE);
-    if (!avctx->extradata)
-        return AVERROR(ENOMEM);
-
     av_bprint_init(&s->buffer, 0, AV_BPRINT_SIZE_UNLIMITED);
 
-    memcpy(avctx->extradata, text_sample_entry, avctx->extradata_size);
+    s->style_attributes_temp = av_mallocz(sizeof(*s->style_attributes_temp));
+    if (!s->style_attributes_temp) {
+        ret = AVERROR(ENOMEM);
+        goto fail;
+    }
 
     s->ass_ctx = ff_ass_split(avctx->subtitle_header);
-    return s->ass_ctx ? 0 : AVERROR_INVALIDDATA;
+    if (!s->ass_ctx) {
+        ret = AVERROR_INVALIDDATA;
+        goto fail;
+    }
+    ret = encode_sample_description(avctx);
+    if (ret < 0)
+        goto fail;
+
+    return 0;
+
+fail:
+    mov_text_encode_close(avctx);
+    return ret;
+}
+
+// Start a new style box if needed
+static int mov_text_style_start(MovTextContext *s)
+{
+    // there's an existing style entry
+    if (s->style_attributes_temp->style_start == s->text_pos)
+        // Still at same text pos, use same entry
+        return 1;
+    if (s->style_attributes_temp->style_flag     != s->d.style_flag   ||
+        s->style_attributes_temp->style_color    != s->d.style_color  ||
+        s->style_attributes_temp->style_fontID   != s->d.style_fontID ||
+        s->style_attributes_temp->style_fontsize != s->d.style_fontsize) {
+        // last style != defaults, end the style entry and start a new one
+        s->box_flags |= STYL_BOX;
+        s->style_attributes_temp->style_end = s->text_pos;
+        av_dynarray_add(&s->style_attributes, &s->count, s->style_attributes_temp);
+        s->style_attributes_temp = av_malloc(sizeof(*s->style_attributes_temp));
+        if (!s->style_attributes_temp) {
+            mov_text_cleanup(s);
+            av_bprint_clear(&s->buffer);
+            s->box_flags &= ~STYL_BOX;
+            return 0;
+        }
+
+        *s->style_attributes_temp = s->d;
+        s->style_attributes_temp->style_start = s->text_pos;
+    } else { // style entry matches defaults, drop entry
+        *s->style_attributes_temp = s->d;
+        s->style_attributes_temp->style_start = s->text_pos;
+    }
+    return 1;
+}
+
+static uint8_t mov_text_style_to_flag(const char style)
+{
+    uint8_t style_flag = 0;
+
+    switch (style){
+    case 'b':
+        style_flag = STYLE_FLAG_BOLD;
+        break;
+    case 'i':
+        style_flag = STYLE_FLAG_ITALIC;
+        break;
+    case 'u':
+        style_flag = STYLE_FLAG_UNDERLINE;
+        break;
+    }
+    return style_flag;
+}
+
+static void mov_text_style_set(MovTextContext *s, uint8_t style_flags)
+{
+    if (!s->style_attributes_temp ||
+        !((s->style_attributes_temp->style_flag & style_flags) ^ style_flags)) {
+        // setting flags that that are already set
+        return;
+    }
+    if (mov_text_style_start(s))
+        s->style_attributes_temp->style_flag |= style_flags;
 }
 
 static void mov_text_style_cb(void *priv, const char style, int close)
 {
     MovTextContext *s = priv;
-    if (!close) {
-        if (!(s->box_flags & STYL_BOX)) {   //first style entry
+    uint8_t style_flag = mov_text_style_to_flag(style);
 
-            s->style_attributes_temp = av_malloc(sizeof(*s->style_attributes_temp));
-
-            if (!s->style_attributes_temp) {
-                av_bprint_clear(&s->buffer);
-                s->box_flags &= ~STYL_BOX;
-                return;
-            }
-
-            s->style_attributes_temp->style_flag = 0;
-            s->style_attributes_temp->style_start = AV_RB16(&s->text_pos);
-        } else {
-            if (s->style_attributes_temp->style_flag) { //break the style record here and start a new one
-                s->style_attributes_temp->style_end = AV_RB16(&s->text_pos);
-                av_dynarray_add(&s->style_attributes, &s->count, s->style_attributes_temp);
-                s->style_attributes_temp = av_malloc(sizeof(*s->style_attributes_temp));
-                if (!s->style_attributes_temp) {
-                    mov_text_cleanup(s);
-                    av_bprint_clear(&s->buffer);
-                    s->box_flags &= ~STYL_BOX;
-                    return;
-                }
-
-                s->style_attributes_temp->style_flag = s->style_attributes[s->count - 1]->style_flag;
-                s->style_attributes_temp->style_start = AV_RB16(&s->text_pos);
-            } else {
-                s->style_attributes_temp->style_flag = 0;
-                s->style_attributes_temp->style_start = AV_RB16(&s->text_pos);
-            }
-        }
-        switch (style){
-        case 'b':
-            s->style_attributes_temp->style_flag |= STYLE_FLAG_BOLD;
-            break;
-        case 'i':
-            s->style_attributes_temp->style_flag |= STYLE_FLAG_ITALIC;
-            break;
-        case 'u':
-            s->style_attributes_temp->style_flag |= STYLE_FLAG_UNDERLINE;
-            break;
-        }
-    } else if (!s->style_attributes_temp) {
-        av_log(s->avctx, AV_LOG_WARNING, "Ignoring unmatched close tag\n");
+    if (!s->style_attributes_temp ||
+        !!(s->style_attributes_temp->style_flag & style_flag) != close) {
+        // setting flag that is already set
         return;
-    } else {
-        s->style_attributes_temp->style_end = AV_RB16(&s->text_pos);
-        av_dynarray_add(&s->style_attributes, &s->count, s->style_attributes_temp);
-
-        s->style_attributes_temp = av_malloc(sizeof(*s->style_attributes_temp));
-
-        if (!s->style_attributes_temp) {
-            mov_text_cleanup(s);
-            av_bprint_clear(&s->buffer);
-            s->box_flags &= ~STYL_BOX;
-            return;
-        }
-
-        s->style_attributes_temp->style_flag = s->style_attributes[s->count - 1]->style_flag;
-        switch (style){
-        case 'b':
-            s->style_attributes_temp->style_flag &= ~STYLE_FLAG_BOLD;
-            break;
-        case 'i':
-            s->style_attributes_temp->style_flag &= ~STYLE_FLAG_ITALIC;
-            break;
-        case 'u':
-            s->style_attributes_temp->style_flag &= ~STYLE_FLAG_UNDERLINE;
-            break;
-        }
-        if (s->style_attributes_temp->style_flag) { //start of new style record
-            s->style_attributes_temp->style_start = AV_RB16(&s->text_pos);
-        }
     }
-    s->box_flags |= STYL_BOX;
+    if (mov_text_style_start(s)) {
+        if (!close)
+            s->style_attributes_temp->style_flag |= style_flag;
+        else
+            s->style_attributes_temp->style_flag &= ~style_flag;
+    }
+}
+
+static void mov_text_color_set(MovTextContext *s, uint32_t color)
+{
+    if (!s->style_attributes_temp ||
+        (s->style_attributes_temp->style_color & 0xffffff00) == color) {
+        // color hasn't changed
+        return;
+    }
+    if (mov_text_style_start(s))
+        s->style_attributes_temp->style_color = (color & 0xffffff00) |
+                            (s->style_attributes_temp->style_color & 0xff);
 }
 
 static void mov_text_color_cb(void *priv, unsigned int color, unsigned int color_id)
 {
     MovTextContext *s = priv;
-    if (color_id == 2) {    //secondary color changes
-        if (s->box_flags & HLIT_BOX) {  //close tag
-            s->hlit.end = AV_RB16(&s->text_pos);
-        } else {
+
+    color = BGR_TO_RGB(color) << 8;
+    if (color_id == 1) {    //primary color changes
+        mov_text_color_set(s, color);
+    } else if (color_id == 2) {    //secondary color changes
+        if (!(s->box_flags & HCLR_BOX))
+            // Highlight alpha not set yet, use current primary alpha
+            s->hclr.color = s->style_attributes_temp->style_color;
+        if (!(s->box_flags & HLIT_BOX) || s->hlit.start == s->text_pos) {
             s->box_flags |= HCLR_BOX;
             s->box_flags |= HLIT_BOX;
-            s->hlit.start = AV_RB16(&s->text_pos);
-            s->hclr.color = color | (0xFF << 24);  //set alpha value to FF
+            s->hlit.start = s->text_pos;
+            s->hclr.color = color | (s->hclr.color & 0xFF);
         }
+        else //close tag
+            s->hlit.end = s->text_pos;
+        /* If there are more than one secondary color changes in ASS,
+           take start of first section and end of last section. Movtext
+           allows only one highlight box per sample.
+         */
     }
-    /* If there are more than one secondary color changes in ASS, take start of
-       first section and end of last section. Movtext allows only one
-       highlight box per sample.
-     */
+    // Movtext does not support changes to other color_id (outline, background)
+}
+
+static void mov_text_alpha_set(MovTextContext *s, uint8_t alpha)
+{
+    if (!s->style_attributes_temp ||
+        (s->style_attributes_temp->style_color & 0xff) == alpha) {
+        // color hasn't changed
+        return;
+    }
+    if (mov_text_style_start(s))
+        s->style_attributes_temp->style_color =
+                (s->style_attributes_temp->style_color & 0xffffff00) | alpha;
+}
+
+static void mov_text_alpha_cb(void *priv, int alpha, int alpha_id)
+{
+    MovTextContext *s = priv;
+
+    alpha = 255 - alpha;
+    if (alpha_id == 1) // primary alpha changes
+        mov_text_alpha_set(s, alpha);
+    else if (alpha_id == 2) {    //secondary alpha changes
+        if (!(s->box_flags & HCLR_BOX))
+            // Highlight color not set yet, use current primary color
+            s->hclr.color = s->style_attributes_temp->style_color;
+        if (!(s->box_flags & HLIT_BOX) || s->hlit.start == s->text_pos) {
+            s->box_flags |= HCLR_BOX;
+            s->box_flags |= HLIT_BOX;
+            s->hlit.start = s->text_pos;
+            s->hclr.color = (s->hclr.color & 0xffffff00) | alpha;
+        }
+        else //close tag
+            s->hlit.end = s->text_pos;
+    }
+    // Movtext does not support changes to other alpha_id (outline, background)
+}
+
+static uint16_t find_font_id(MovTextContext * s, const char * name)
+{
+    int i;
+    for (i = 0; i < s->font_count; i++) {
+        if (!strcmp(name, s->fonts[i]))
+            return i + 1;
+    }
+    return 1;
+}
+
+static void mov_text_font_name_set(MovTextContext *s, const char *name)
+{
+    int fontID = find_font_id(s, name);
+    if (!s->style_attributes_temp ||
+        s->style_attributes_temp->style_fontID == fontID) {
+        // color hasn't changed
+        return;
+    }
+    if (mov_text_style_start(s))
+        s->style_attributes_temp->style_fontID = fontID;
+}
+
+static void mov_text_font_name_cb(void *priv, const char *name)
+{
+    mov_text_font_name_set((MovTextContext*)priv, name);
+}
+
+static void mov_text_font_size_set(MovTextContext *s, int size)
+{
+    size = FONTSIZE_SCALE(s, size);
+    if (!s->style_attributes_temp ||
+        s->style_attributes_temp->style_fontsize == size) {
+        // color hasn't changed
+        return;
+    }
+    if (mov_text_style_start(s))
+        s->style_attributes_temp->style_fontsize = size;
+}
+
+static void mov_text_font_size_cb(void *priv, int size)
+{
+    mov_text_font_size_set((MovTextContext*)priv, size);
+}
+
+static void mov_text_end_cb(void *priv)
+{
+    // End of text, close any open style record
+    mov_text_style_start((MovTextContext*)priv);
+}
+
+static void mov_text_ass_style_set(MovTextContext *s, ASSStyle *style)
+{
+    uint8_t    style_flags, alpha;
+    uint32_t   color;
+
+    if (style) {
+        style_flags = (!!style->bold      * STYLE_FLAG_BOLD)   |
+                      (!!style->italic    * STYLE_FLAG_ITALIC) |
+                      (!!style->underline * STYLE_FLAG_UNDERLINE);
+        mov_text_style_set(s, style_flags);
+        color = BGR_TO_RGB(style->primary_color & 0xffffff) << 8;
+        mov_text_color_set(s, color);
+        alpha = 255 - ((uint32_t)style->primary_color >> 24);
+        mov_text_alpha_set(s, alpha);
+        mov_text_font_size_set(s, style->font_size);
+        mov_text_font_name_set(s, style->font_name);
+    } else {
+        // End current style record, go back to defaults
+        mov_text_style_start(s);
+    }
+}
+
+static void mov_text_dialog(MovTextContext *s, ASSDialog *dialog)
+{
+    ASSStyle * style = ff_ass_style_get(s->ass_ctx, dialog->style);
+
+    s->ass_dialog_style = style;
+    mov_text_ass_style_set(s, style);
+}
+
+static void mov_text_cancel_overrides_cb(void *priv, const char * style_name)
+{
+    MovTextContext *s = priv;
+    ASSStyle * style;
+
+    if (!style_name || !*style_name)
+        style = s->ass_dialog_style;
+    else
+        style= ff_ass_style_get(s->ass_ctx, style_name);
+
+    mov_text_ass_style_set(s, style);
 }
 
 static uint16_t utf8_strlen(const char *text, int len)
@@ -344,10 +665,15 @@
 }
 
 static const ASSCodesCallbacks mov_text_callbacks = {
-    .text     = mov_text_text_cb,
-    .new_line = mov_text_new_line_cb,
-    .style    = mov_text_style_cb,
-    .color    = mov_text_color_cb,
+    .text             = mov_text_text_cb,
+    .new_line         = mov_text_new_line_cb,
+    .style            = mov_text_style_cb,
+    .color            = mov_text_color_cb,
+    .alpha            = mov_text_alpha_cb,
+    .font_name        = mov_text_font_name_cb,
+    .font_size        = mov_text_font_size_cb,
+    .cancel_overrides = mov_text_cancel_overrides_cb,
+    .end              = mov_text_end_cb,
 };
 
 static int mov_text_encode_frame(AVCodecContext *avctx, unsigned char *buf,
@@ -362,13 +688,12 @@
     s->text_pos = 0;
     s->count = 0;
     s->box_flags = 0;
-    s->style_entries = 0;
     for (i = 0; i < sub->num_rects; i++) {
         const char *ass = sub->rects[i]->ass;
 
         if (sub->rects[i]->type != SUBTITLE_ASS) {
             av_log(avctx, AV_LOG_ERROR, "Only SUBTITLE_ASS type supported.\n");
-            return AVERROR(ENOSYS);
+            return AVERROR(EINVAL);
         }
 
 #if FF_API_ASS_TIMING
@@ -376,6 +701,7 @@
             int num;
             dialog = ff_ass_split_dialog(s->ass_ctx, ass, 0, &num);
             for (; dialog && num--; dialog++) {
+                mov_text_dialog(s, dialog);
                 ff_ass_split_override_codes(&mov_text_callbacks, s, dialog->text);
             }
         } else {
@@ -383,6 +709,7 @@
             dialog = ff_ass_split_dialog2(s->ass_ctx, ass);
             if (!dialog)
                 return AVERROR(ENOMEM);
+            mov_text_dialog(s, dialog);
             ff_ass_split_override_codes(&mov_text_callbacks, s, dialog->text);
             ff_ass_free_dialog(&dialog);
 #if FF_API_ASS_TIMING
@@ -409,7 +736,7 @@
 
     if (s->buffer.len > bufsize - 3) {
         av_log(avctx, AV_LOG_ERROR, "Buffer too small for ASS event.\n");
-        length = AVERROR(EINVAL);
+        length = AVERROR_BUFFER_TOO_SMALL;
         goto exit;
     }
 
@@ -421,13 +748,19 @@
     return length;
 }
 
-static int mov_text_encode_close(AVCodecContext *avctx)
-{
-    MovTextContext *s = avctx->priv_data;
-    ff_ass_split_free(s->ass_ctx);
-    av_bprint_finalize(&s->buffer, NULL);
-    return 0;
-}
+#define OFFSET(x) offsetof(MovTextContext, x)
+#define FLAGS AV_OPT_FLAG_ENCODING_PARAM | AV_OPT_FLAG_SUBTITLE_PARAM
+static const AVOption options[] = {
+    { "height", "Frame height, usually video height", OFFSET(frame_height), AV_OPT_TYPE_INT, {.i64=0}, 0, INT_MAX, FLAGS },
+    { NULL },
+};
+
+static const AVClass mov_text_encoder_class = {
+    .class_name = "MOV text enoder",
+    .item_name  = av_default_item_name,
+    .option     = options,
+    .version    = LIBAVUTIL_VERSION_INT,
+};
 
 AVCodec ff_movtext_encoder = {
     .name           = "mov_text",
@@ -435,6 +768,7 @@
     .type           = AVMEDIA_TYPE_SUBTITLE,
     .id             = AV_CODEC_ID_MOV_TEXT,
     .priv_data_size = sizeof(MovTextContext),
+    .priv_class     = &mov_text_encoder_class,
     .init           = mov_text_encode_init,
     .encode_sub     = mov_text_encode_frame,
     .close          = mov_text_encode_close,
diff --git a/libavcodec/mp3_header_decompress_bsf.c b/libavcodec/mp3_header_decompress_bsf.c
index 2948589..ab3d420 100644
--- a/libavcodec/mp3_header_decompress_bsf.c
+++ b/libavcodec/mp3_header_decompress_bsf.c
@@ -62,6 +62,11 @@
     lsf     = sample_rate < (24000+32000)/2;
     mpeg25  = sample_rate < (12000+16000)/2;
     sample_rate_index= (header>>10)&3;
+    if (sample_rate_index == 3) {
+        ret = AVERROR_INVALIDDATA;
+        goto fail;
+    }
+
     sample_rate= avpriv_mpa_freq_tab[sample_rate_index] >> (lsf + mpeg25); //in case sample rate is a little off
 
     for(bitrate_index=2; bitrate_index<30; bitrate_index++){
diff --git a/libavcodec/mpc8.c b/libavcodec/mpc8.c
index 3be2f79..03838a9 100644
--- a/libavcodec/mpc8.c
+++ b/libavcodec/mpc8.c
@@ -62,7 +62,7 @@
     do {
         n--;
         if (code >= C[n]) {
-            bits |= 1 << n;
+            bits |= 1U << n;
             code -= C[n];
             C -= 32;
             k--;
@@ -364,8 +364,9 @@
                 for(j = 0; j < SAMPLES_PER_BAND; j += SAMPLES_PER_BAND / 2){
                     cnt = get_vlc2(gb, q1_vlc.table, MPC8_Q1_BITS, 2);
                     t = mpc8_get_mask(gb, 18, cnt);
-                    for(k = 0; k < SAMPLES_PER_BAND / 2; k++, t <<= 1)
-                        c->Q[ch][off + j + k] = (t & 0x20000) ? (get_bits1(gb) << 1) - 1 : 0;
+                    for(k = 0; k < SAMPLES_PER_BAND / 2; k++)
+                        c->Q[ch][off + j + k] = t & (1 << (SAMPLES_PER_BAND / 2 - k - 1))
+                                                ? (get_bits1(gb) << 1) - 1 : 0;
                 }
                 break;
             case 2:
diff --git a/libavcodec/mpc8huff.h b/libavcodec/mpc8huff.h
index 8491037..0566c91 100644
--- a/libavcodec/mpc8huff.h
+++ b/libavcodec/mpc8huff.h
@@ -34,7 +34,7 @@
  0x08, 0x09, 0x06, 0x07, 0x05, 0x05, 0x03, 0x03,
  0x01,
 };
-static const int8_t mpc8_bands_bits[MPC8_BANDS_SIZE] = {
+static const uint8_t mpc8_bands_bits[MPC8_BANDS_SIZE] = {
   1,  3,  5,  6,  7,  8,  8,  9,
  10, 11, 12, 12, 12, 13, 12, 12,
  12, 12, 12, 13, 12, 12, 12, 11,
@@ -48,7 +48,7 @@
 static const uint8_t mpc8_scfi0_codes[MPC8_SCFI0_SIZE] = {
  0x00, 0x01, 0x01, 0x01,
 };
-static const int8_t mpc8_scfi0_bits[MPC8_SCFI0_SIZE] = {
+static const uint8_t mpc8_scfi0_bits[MPC8_SCFI0_SIZE] = {
   3,  3,  1,  2,
 };
 
@@ -60,7 +60,7 @@
  0x04, 0x06, 0x02, 0x02, 0x05, 0x07, 0x03, 0x03,
 
 };
-static const int8_t mpc8_scfi1_bits[MPC8_SCFI1_SIZE] = {
+static const uint8_t mpc8_scfi1_bits[MPC8_SCFI1_SIZE] = {
   6,  7,  6,  6,  7,  5,  5,  5,
   6,  5,  2,  3,  6,  5,  3,  2,
 
@@ -79,7 +79,7 @@
  0x0C, 0x0D, 0x07, 0x08, 0x09, 0x06, 0x07, 0x03,
  0x04, 0x05, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05,
 };
-static const int8_t mpc8_dscf0_bits[MPC8_DSCF0_SIZE] = {
+static const uint8_t mpc8_dscf0_bits[MPC8_DSCF0_SIZE] = {
  12, 12, 12, 11, 11, 11, 10, 10,
  10, 10, 10,  9,  9,  9,  9,  8,
   8,  8,  8,  7,  7,  7,  7,  6,
@@ -105,7 +105,7 @@
  0x05, 0x06, 0x07, 0x01, 0x02, 0x03, 0x04, 0x05,
  0x0D,
 };
-static const int8_t mpc8_dscf1_bits[MPC8_DSCF1_SIZE] = {
+static const uint8_t mpc8_dscf1_bits[MPC8_DSCF1_SIZE] = {
  15, 14, 14, 13, 13, 13, 12, 12,
  12, 12, 11, 11, 11, 11, 10, 10,
  10, 10,  9,  9,  9,  8,  8,  7,
@@ -132,7 +132,7 @@
     0x03,
   }
 };
-static const int8_t mpc8_res_bits[2][MPC8_RES_SIZE] = {
+static const uint8_t mpc8_res_bits[2][MPC8_RES_SIZE] = {
   {
      1,  2,  4,  5,  6,  7,  9, 10,
     11, 12, 13, 14, 15, 16, 16,  8,
@@ -153,7 +153,7 @@
  0x03, 0x04, 0x05, 0x01, 0x01, 0x01, 0x01, 0x01,
  0x01, 0x00, 0x01,
 };
-static const int8_t mpc8_q1_bits[MPC8_Q1_SIZE] = {
+static const uint8_t mpc8_q1_bits[MPC8_Q1_SIZE] = {
   6,  4,  4,  3,  3,  3,  3,  3,
   4,  4,  4,  5,  7,  8,  9, 10,
  11, 12, 12,
@@ -196,7 +196,7 @@
  0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49,
  0x4A, 0x4B, 0x06, 0x07, 0x08, 0x09, 0x00, 0x01,
 };
-static const int8_t mpc8_q9up_bits[MPC8_Q9UP_SIZE] = {
+static const uint8_t mpc8_q9up_bits[MPC8_Q9UP_SIZE] = {
  10, 10, 10, 10, 10,  9,  9,  9,
   9,  9,  9,  9,  9,  9,  9,  9,
   9,  9,  9,  8,  8,  9,  9,  9,
@@ -272,7 +272,7 @@
  0x03, 0x1C, 0x17, 0x1D, 0x05,
 }
 };
-static const int8_t mpc8_q2_bits[2][MPC8_Q2_SIZE] = {
+static const uint8_t mpc8_q2_bits[2][MPC8_Q2_SIZE] = {
 {
  12, 11, 10, 11, 13, 11,  9,  8,
   9, 11, 11,  8,  7,  8, 11, 11,
@@ -324,7 +324,7 @@
  0x06, 0x05, 0x04, 0x03, 0x02, 0x03, 0x02, 0x01,
  0x00,
 };
-static const int8_t mpc8_q3_bits[MPC8_Q3_SIZE] = {
+static const uint8_t mpc8_q3_bits[MPC8_Q3_SIZE] = {
   3,  4,  4,  4,  4,  4,  4,  5,
   5,  5,  5,  5,  5,  6,  6,  6,
   6,  6,  6,  6,  6,  6,  6,  6,
@@ -333,7 +333,7 @@
   8,  8,  8,  8,  8,  9,  9,  9,
   9,
 };
-static const int8_t mpc8_q3_syms[MPC8_Q3_SIZE] = {
+static const uint8_t mpc8_q3_syms[MPC8_Q3_SIZE] = {
    48,    65,    64,    49,    63,    32,    47,    80,
    79,    50,    62,    33,    16,    82,    81,    95,
    94,    66,    78,    34,    46,    17,    31,    30,
@@ -360,7 +360,7 @@
  0x06, 0x05, 0x04, 0x03, 0x02, 0x03, 0x02, 0x01,
  0x00,
 };
-static const int8_t mpc8_q4_bits[MPC8_Q4_SIZE] = {
+static const uint8_t mpc8_q4_bits[MPC8_Q4_SIZE] = {
   4,  5,  5,  5,  5,  5,  5,  5,
   5,  5,  5,  5,  5,  6,  6,  6,
   6,  6,  6,  6,  6,  6,  6,  6,
@@ -373,7 +373,7 @@
   9,  9,  9,  9,  9, 10, 10, 10,
  10,
 };
-static const int8_t mpc8_q4_syms[MPC8_Q4_SIZE] = {
+static const uint8_t mpc8_q4_syms[MPC8_Q4_SIZE] = {
    64,    96,    81,    80,    95,    66,    65,    79,
    78,    49,    48,    63,    32,   113,   112,    98,
    97,   111,   110,    83,    82,    94,    93,    67,
@@ -401,7 +401,7 @@
  0x06, 0x07, 0x04, 0x05, 0x03, 0x02, 0x03,
 }
 };
-static const int8_t mpc8_q5_bits[2][MPC8_Q5_SIZE] = {
+static const uint8_t mpc8_q5_bits[2][MPC8_Q5_SIZE] = {
 {
   7,  7,  6,  5,  4,  3,  3,  2,
   3,  3,  4,  5,  6,  7,  7,
@@ -430,7 +430,7 @@
  0x06, 0x07, 0x05, 0x06, 0x07, 0x02, 0x03,
 }
 };
-static const int8_t mpc8_q6_bits[2][MPC8_Q6_SIZE] = {
+static const uint8_t mpc8_q6_bits[2][MPC8_Q6_SIZE] = {
 {
   9,  9,  9,  9,  8,  8,  7,  6,
   6,  6,  5,  5,  4,  4,  3,  2,
@@ -471,7 +471,7 @@
  0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x02, 0x03,
 }
 };
-static const int8_t mpc8_q7_bits[2][MPC8_Q7_SIZE] = {
+static const uint8_t mpc8_q7_bits[2][MPC8_Q7_SIZE] = {
 {
  10, 10, 10,  9,  9, 10, 10, 10,
  10, 10,  9,  9,  9,  9,  8,  8,
@@ -536,7 +536,7 @@
  0x27, 0x28, 0x29, 0x04, 0x05, 0x06, 0x07,
 }
 };
-static const int8_t mpc8_q8_bits[2][MPC8_Q8_SIZE] = {
+static const uint8_t mpc8_q8_bits[2][MPC8_Q8_SIZE] = {
 {
  11, 11, 10, 10, 10, 10, 10,  9,
  10,  9, 10, 12, 12, 11, 11, 11,
diff --git a/libavcodec/mpeg12dec.c b/libavcodec/mpeg12dec.c
index 83e5378..67ce59d 100644
--- a/libavcodec/mpeg12dec.c
+++ b/libavcodec/mpeg12dec.c
@@ -64,6 +64,7 @@
     int slice_count;
     AVRational save_aspect;
     int save_width, save_height, save_progressive_seq;
+    int rc_buffer_size;
     AVRational frame_rate_ext;  /* MPEG-2 specific framerate modificator */
     int sync;                   /* Did we reach a sync point like a GOP/SEQ/KEYFrame? */
     int tmpgexs;
@@ -586,7 +587,7 @@
     dc = s->last_dc[component];
     dc += diff;
     s->last_dc[component] = dc;
-    block[0] = dc << (3 - s->intra_dc_precision);
+    block[0] = dc * (1 << (3 - s->intra_dc_precision));
     i = 0;
     if (s->intra_vlc_format)
         rl = &ff_rl_mpeg2;
@@ -1398,6 +1399,7 @@
     MpegEncContext *s = &s1->mpeg_enc_ctx;
     int horiz_size_ext, vert_size_ext;
     int bit_rate_ext;
+    AVCPBProperties *cpb_props;
 
     skip_bits(&s->gb, 1); /* profile and level esc*/
     s->avctx->profile       = get_bits(&s->gb, 3);
@@ -1417,7 +1419,7 @@
     bit_rate_ext = get_bits(&s->gb, 12);  /* XXX: handle it */
     s->bit_rate += (bit_rate_ext << 18) * 400LL;
     check_marker(s->avctx, &s->gb, "after bit rate extension");
-    s->avctx->rc_buffer_size += get_bits(&s->gb, 8) * 1024 * 16 << 10;
+    s1->rc_buffer_size += get_bits(&s->gb, 8) * 1024 * 16 << 10;
 
     s->low_delay = get_bits1(&s->gb);
     if (s->avctx->flags & AV_CODEC_FLAG_LOW_DELAY)
@@ -1429,11 +1431,17 @@
     ff_dlog(s->avctx, "sequence extension\n");
     s->codec_id = s->avctx->codec_id = AV_CODEC_ID_MPEG2VIDEO;
 
+    if (cpb_props = ff_add_cpb_side_data(s->avctx)) {
+        cpb_props->buffer_size = s1->rc_buffer_size;
+        if (s->bit_rate != 0x3FFFF*400)
+            cpb_props->max_bitrate = s->bit_rate;
+    }
+
     if (s->avctx->debug & FF_DEBUG_PICT_INFO)
         av_log(s->avctx, AV_LOG_DEBUG,
                "profile: %d, level: %d ps: %d cf:%d vbv buffer: %d, bitrate:%"PRId64"\n",
                s->avctx->profile, s->avctx->level, s->progressive_sequence, s->chroma_format,
-               s->avctx->rc_buffer_size, s->bit_rate);
+               s1->rc_buffer_size, s->bit_rate);
 }
 
 static void mpeg_decode_sequence_display_extension(Mpeg1Context *s1)
@@ -1596,6 +1604,11 @@
     Mpeg1Context *s1      = (Mpeg1Context *) s;
     int ret;
 
+    if (!(avctx->flags2 & AV_CODEC_FLAG2_CHUNKS)) {
+        if (s->mb_width * s->mb_height * 11LL / (33 * 2 * 8) > buf_size)
+            return AVERROR_INVALIDDATA;
+    }
+
     /* start frame decoding */
     if (s->first_field || s->picture_structure == PICT_FRAME) {
         AVFrameSideData *pan_scan;
@@ -1664,8 +1677,7 @@
             return AVERROR_INVALIDDATA;
         }
 
-        if (s->avctx->hwaccel &&
-            (s->avctx->slice_flags & SLICE_FLAG_ALLOW_FIELD)) {
+        if (s->avctx->hwaccel) {
             if ((ret = s->avctx->hwaccel->end_frame(s->avctx)) < 0) {
                 av_log(avctx, AV_LOG_ERROR,
                        "hardware accelerator failed to decode first field\n");
@@ -2011,13 +2023,15 @@
 
         start_code = -1;
         buf        = avpriv_find_start_code(buf, s->gb.buffer_end, &start_code);
+        if (start_code < SLICE_MIN_START_CODE || start_code > SLICE_MAX_START_CODE)
+            return AVERROR_INVALIDDATA;
         mb_y       = start_code - SLICE_MIN_START_CODE;
         if (s->codec_id != AV_CODEC_ID_MPEG1VIDEO && s->mb_height > 2800/16)
             mb_y += (*buf&0xE0)<<2;
         mb_y <<= field_pic;
         if (s->picture_structure == PICT_BOTTOM_FIELD)
             mb_y++;
-        if (mb_y < 0 || mb_y >= s->end_mb_y)
+        if (mb_y >= s->end_mb_y)
             return AVERROR_INVALIDDATA;
     }
 }
@@ -2112,7 +2126,7 @@
         return AVERROR_INVALIDDATA;
     }
 
-    s->avctx->rc_buffer_size = get_bits(&s->gb, 10) * 1024 * 16;
+    s1->rc_buffer_size = get_bits(&s->gb, 10) * 1024 * 16;
     skip_bits(&s->gb, 1);
 
     /* get matrix */
@@ -2161,7 +2175,7 @@
 
     if (s->avctx->debug & FF_DEBUG_PICT_INFO)
         av_log(s->avctx, AV_LOG_DEBUG, "vbv buffer: %d, bitrate:%"PRId64", aspect_ratio_info: %d \n",
-               s->avctx->rc_buffer_size, s->bit_rate, s->aspect_ratio_info);
+               s1->rc_buffer_size, s->bit_rate, s->aspect_ratio_info);
 
     return 0;
 }
diff --git a/libavcodec/mpeg12enc.c b/libavcodec/mpeg12enc.c
index d0b458e..b460e78 100644
--- a/libavcodec/mpeg12enc.c
+++ b/libavcodec/mpeg12enc.c
@@ -61,6 +61,8 @@
 static uint8_t mpeg1_index_run[2][64];
 static int8_t  mpeg1_max_level[2][64];
 
+#define A53_MAX_CC_COUNT 0x1f
+
 static av_cold void init_uni_ac_vlc(RLTable *rl, uint8_t *uni_ac_vlc_len)
 {
     int i;
@@ -544,6 +546,36 @@
         }
     }
 
+    if (s->codec_id == AV_CODEC_ID_MPEG2VIDEO && s->a53_cc) {
+        side_data = av_frame_get_side_data(s->current_picture_ptr->f,
+            AV_FRAME_DATA_A53_CC);
+        if (side_data) {
+            if (side_data->size <= A53_MAX_CC_COUNT * 3 && side_data->size % 3 == 0) {
+                int i = 0;
+
+                put_header (s, USER_START_CODE);
+
+                put_bits(&s->pb, 8, 'G');                   // user_identifier
+                put_bits(&s->pb, 8, 'A');
+                put_bits(&s->pb, 8, '9');
+                put_bits(&s->pb, 8, '4');
+                put_bits(&s->pb, 8, 3);                     // user_data_type_code
+                put_bits(&s->pb, 8,
+                    (side_data->size / 3 & A53_MAX_CC_COUNT) | 0x40); // flags, cc_count
+                put_bits(&s->pb, 8, 0xff);                  // em_data
+
+                for (i = 0; i < side_data->size; i++)
+                    put_bits(&s->pb, 8, side_data->data[i]);
+
+                put_bits(&s->pb, 8, 0xff);                  // marker_bits
+            } else {
+                av_log(s->avctx, AV_LOG_WARNING,
+                    "Warning Closed Caption size (%d) can not exceed 93 bytes "
+                    "and must be a multiple of 3\n", side_data->size);
+            }
+        }
+    }
+
     s->mb_y = 0;
     ff_mpeg1_encode_slice_header(s);
 }
@@ -1102,7 +1134,7 @@
 #define VE AV_OPT_FLAG_ENCODING_PARAM | AV_OPT_FLAG_VIDEO_PARAM
 #define COMMON_OPTS                                                           \
     { "gop_timecode",        "MPEG GOP Timecode in hh:mm:ss[:;.]ff format. Overrides timecode_frame_start.",   \
-      OFFSET(tc_opt_str), AV_OPT_TYPE_STRING, {.str=NULL}, CHAR_MIN, CHAR_MAX, VE },\
+      OFFSET(tc_opt_str), AV_OPT_TYPE_STRING, {.str=NULL}, 0, 0, VE },\
     { "intra_vlc",           "Use MPEG-2 intra VLC table.",                   \
       OFFSET(intra_vlc_format),    AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VE }, \
     { "drop_frame_timecode", "Timecode is in drop frame format.",             \
@@ -1161,6 +1193,7 @@
     .pix_fmts             = (const enum AVPixelFormat[]) { AV_PIX_FMT_YUV420P,
                                                            AV_PIX_FMT_NONE },
     .capabilities         = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_SLICE_THREADS,
+    .caps_internal        = FF_CODEC_CAP_INIT_CLEANUP,
     .priv_class           = &mpeg1_class,
 };
 
@@ -1178,5 +1211,6 @@
                                                            AV_PIX_FMT_YUV422P,
                                                            AV_PIX_FMT_NONE },
     .capabilities         = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_SLICE_THREADS,
+    .caps_internal        = FF_CODEC_CAP_INIT_CLEANUP,
     .priv_class           = &mpeg2_class,
 };
diff --git a/libavcodec/mpeg2_metadata_bsf.c b/libavcodec/mpeg2_metadata_bsf.c
index e787cb3..3f371a0 100644
--- a/libavcodec/mpeg2_metadata_bsf.c
+++ b/libavcodec/mpeg2_metadata_bsf.c
@@ -53,7 +53,7 @@
     MPEG2RawSequenceHeader            *sh = NULL;
     MPEG2RawSequenceExtension         *se = NULL;
     MPEG2RawSequenceDisplayExtension *sde = NULL;
-    int i, se_pos, add_sde = 0;
+    int i, se_pos;
 
     for (i = 0; i < frag->nb_units; i++) {
         if (frag->units[i].type == MPEG2_START_SEQUENCE_HEADER) {
@@ -115,7 +115,7 @@
         ctx->transfer_characteristics >= 0 ||
         ctx->matrix_coefficients      >= 0) {
         if (!sde) {
-            add_sde = 1;
+            int err;
             ctx->sequence_display_extension.extension_start_code =
                 MPEG2_START_EXTENSION;
             ctx->sequence_display_extension.extension_start_code_identifier =
@@ -135,6 +135,16 @@
                 .display_vertical_size =
                     se->vertical_size_extension << 12 | sh->vertical_size_value,
             };
+
+            err = ff_cbs_insert_unit_content(ctx->cbc, frag, se_pos + 1,
+                                             MPEG2_START_EXTENSION,
+                                             &ctx->sequence_display_extension,
+                                             NULL);
+            if (err < 0) {
+                av_log(bsf, AV_LOG_ERROR, "Failed to insert new sequence "
+                       "display extension.\n");
+                return err;
+            }
         }
 
         if (ctx->video_format >= 0)
@@ -147,50 +157,29 @@
 
             if (ctx->colour_primaries >= 0)
                 sde->colour_primaries = ctx->colour_primaries;
-            else if (add_sde)
-                sde->colour_primaries = 2;
 
             if (ctx->transfer_characteristics >= 0)
                 sde->transfer_characteristics = ctx->transfer_characteristics;
-            else if (add_sde)
-                sde->transfer_characteristics = 2;
 
             if (ctx->matrix_coefficients >= 0)
                 sde->matrix_coefficients = ctx->matrix_coefficients;
-            else if (add_sde)
-                sde->matrix_coefficients = 2;
-        }
-    }
-
-    if (add_sde) {
-        int err;
-
-        err = ff_cbs_insert_unit_content(ctx->cbc, frag, se_pos + 1,
-                                         MPEG2_START_EXTENSION,
-                                         &ctx->sequence_display_extension,
-                                         NULL);
-        if (err < 0) {
-            av_log(bsf, AV_LOG_ERROR, "Failed to insert new sequence "
-                   "display extension.\n");
-            return err;
         }
     }
 
     return 0;
 }
 
-static int mpeg2_metadata_filter(AVBSFContext *bsf, AVPacket *out)
+static int mpeg2_metadata_filter(AVBSFContext *bsf, AVPacket *pkt)
 {
     MPEG2MetadataContext *ctx = bsf->priv_data;
-    AVPacket *in = NULL;
     CodedBitstreamFragment *frag = &ctx->fragment;
     int err;
 
-    err = ff_bsf_get_packet(bsf, &in);
+    err = ff_bsf_get_packet_ref(bsf, pkt);
     if (err < 0)
         return err;
 
-    err = ff_cbs_read_packet(ctx->cbc, frag, in);
+    err = ff_cbs_read_packet(ctx->cbc, frag, pkt);
     if (err < 0) {
         av_log(bsf, AV_LOG_ERROR, "Failed to read packet.\n");
         goto fail;
@@ -202,23 +191,18 @@
         goto fail;
     }
 
-    err = ff_cbs_write_packet(ctx->cbc, out, frag);
+    err = ff_cbs_write_packet(ctx->cbc, pkt, frag);
     if (err < 0) {
         av_log(bsf, AV_LOG_ERROR, "Failed to write packet.\n");
         goto fail;
     }
 
-    err = av_packet_copy_props(out, in);
-    if (err < 0)
-        goto fail;
-
     err = 0;
 fail:
-    ff_cbs_fragment_uninit(ctx->cbc, frag);
+    ff_cbs_fragment_reset(ctx->cbc, frag);
 
     if (err < 0)
-        av_packet_unref(out);
-    av_packet_free(&in);
+        av_packet_unref(pkt);
 
     return err;
 }
@@ -229,6 +213,18 @@
     CodedBitstreamFragment *frag = &ctx->fragment;
     int err;
 
+#define VALIDITY_CHECK(name) do { \
+        if (!ctx->name) { \
+            av_log(bsf, AV_LOG_ERROR, "The value 0 for %s is " \
+                                      "forbidden.\n", #name); \
+            return AVERROR(EINVAL); \
+        } \
+    } while (0)
+    VALIDITY_CHECK(colour_primaries);
+    VALIDITY_CHECK(transfer_characteristics);
+    VALIDITY_CHECK(matrix_coefficients);
+#undef VALIDITY_CHECK
+
     err = ff_cbs_init(&ctx->cbc, AV_CODEC_ID_MPEG2VIDEO, bsf);
     if (err < 0)
         return err;
@@ -255,13 +251,15 @@
 
     err = 0;
 fail:
-    ff_cbs_fragment_uninit(ctx->cbc, frag);
+    ff_cbs_fragment_reset(ctx->cbc, frag);
     return err;
 }
 
 static void mpeg2_metadata_close(AVBSFContext *bsf)
 {
     MPEG2MetadataContext *ctx = bsf->priv_data;
+
+    ff_cbs_fragment_free(ctx->cbc, &ctx->fragment);
     ff_cbs_close(&ctx->cbc);
 }
 
diff --git a/libavcodec/mpeg4_unpack_bframes_bsf.c b/libavcodec/mpeg4_unpack_bframes_bsf.c
index e9c535f..1500d21 100644
--- a/libavcodec/mpeg4_unpack_bframes_bsf.c
+++ b/libavcodec/mpeg4_unpack_bframes_bsf.c
@@ -21,81 +21,67 @@
 
 #include "avcodec.h"
 #include "bsf.h"
+#include "internal.h"
 #include "mpeg4video.h"
 
 typedef struct UnpackBFramesBSFContext {
-    AVPacket *b_frame;
+    AVBufferRef *b_frame_ref;
 } UnpackBFramesBSFContext;
 
-/* search next start code */
-static unsigned int find_startcode(const uint8_t *buf, int buf_size, int *pos)
-{
-    unsigned int startcode = 0xFF;
-
-    for (; *pos < buf_size;) {
-        startcode = ((startcode << 8) | buf[*pos]) & 0xFFFFFFFF;
-        *pos +=1;
-        if ((startcode & 0xFFFFFF00) != 0x100)
-            continue;  /* no startcode */
-        return startcode;
-    }
-
-    return 0;
-}
-
 /* determine the position of the packed marker in the userdata,
  * the number of VOPs and the position of the second VOP */
 static void scan_buffer(const uint8_t *buf, int buf_size,
                         int *pos_p, int *nb_vop, int *pos_vop2) {
-    unsigned int startcode;
-    int pos, i;
+    uint32_t startcode;
+    const uint8_t *end = buf + buf_size, *pos = buf;
 
-    for (pos = 0; pos < buf_size;) {
-        startcode = find_startcode(buf, buf_size, &pos);
+    while (pos < end) {
+        startcode = -1;
+        pos = avpriv_find_start_code(pos, end, &startcode);
 
         if (startcode == USER_DATA_STARTCODE && pos_p) {
             /* check if the (DivX) userdata string ends with 'p' (packed) */
-            for (i = 0; i < 255 && pos + i + 1 < buf_size; i++) {
-                if (buf[pos + i] == 'p' && buf[pos + i + 1] == '\0') {
-                    *pos_p = pos + i;
+            for (int i = 0; i < 255 && pos + i + 1 < end; i++) {
+                if (pos[i] == 'p' && pos[i + 1] == '\0') {
+                    *pos_p = pos + i - buf;
                     break;
                 }
             }
         } else if (startcode == VOP_STARTCODE && nb_vop) {
             *nb_vop += 1;
             if (*nb_vop == 2 && pos_vop2) {
-                *pos_vop2 = pos - 4; /* subtract 4 bytes startcode */
+                *pos_vop2 = pos - buf - 4; /* subtract 4 bytes startcode */
             }
         }
     }
 }
 
-static int mpeg4_unpack_bframes_filter(AVBSFContext *ctx, AVPacket *out)
+static int mpeg4_unpack_bframes_filter(AVBSFContext *ctx, AVPacket *pkt)
 {
     UnpackBFramesBSFContext *s = ctx->priv_data;
     int pos_p = -1, nb_vop = 0, pos_vop2 = -1, ret = 0;
-    AVPacket *in;
 
-    ret = ff_bsf_get_packet(ctx, &in);
+    ret = ff_bsf_get_packet_ref(ctx, pkt);
     if (ret < 0)
         return ret;
 
-    scan_buffer(in->data, in->size, &pos_p, &nb_vop, &pos_vop2);
+    scan_buffer(pkt->data, pkt->size, &pos_p, &nb_vop, &pos_vop2);
     av_log(ctx, AV_LOG_DEBUG, "Found %d VOP startcode(s) in this packet.\n", nb_vop);
 
     if (pos_vop2 >= 0) {
-        if (s->b_frame->data) {
+        if (s->b_frame_ref) {
             av_log(ctx, AV_LOG_WARNING,
                    "Missing one N-VOP packet, discarding one B-frame.\n");
-            av_packet_unref(s->b_frame);
+            av_buffer_unref(&s->b_frame_ref);
         }
-        /* store the packed B-frame in the BSFContext */
-        ret = av_packet_ref(s->b_frame, in);
-        if (ret < 0) {
+        /* store a reference to the packed B-frame's data in the BSFContext */
+        s->b_frame_ref = av_buffer_ref(pkt->buf);
+        if (!s->b_frame_ref) {
+            ret = AVERROR(ENOMEM);
             goto fail;
         }
-        s->b_frame->size -= pos_vop2;
-        s->b_frame->data += pos_vop2;
+        s->b_frame_ref->data = pkt->data + pos_vop2;
+        s->b_frame_ref->size = pkt->size - pos_vop2;
     }
 
     if (nb_vop > 2) {
@@ -103,56 +89,49 @@
        "Found %d VOP headers in one packet, only unpacking one.\n", nb_vop);
     }
 
-    if (nb_vop == 1 && s->b_frame->data) {
-        /* use frame from BSFContext */
-        av_packet_move_ref(out, s->b_frame);
+    if (nb_vop == 1 && s->b_frame_ref) {
+        AVBufferRef *tmp = pkt->buf;
 
-        /* use properties from current input packet */
-        ret = av_packet_copy_props(out, in);
-        if (ret < 0) {
-            goto fail;
-        }
+        /* make tmp accurately reflect the packet's data */
+        tmp->data = pkt->data;
+        tmp->size = pkt->size;
 
-        if (in->size <= MAX_NVOP_SIZE) {
-            /* N-VOP */
+        /* replace data in packet with stored data */
+        pkt->buf  = s->b_frame_ref;
+        pkt->data = s->b_frame_ref->data;
+        pkt->size = s->b_frame_ref->size;
+
+        /* store reference to data into BSFContext */
+        s->b_frame_ref = tmp;
+
+        if (s->b_frame_ref->size <= MAX_NVOP_SIZE) {
+            /* N-VOP - discard stored data */
             av_log(ctx, AV_LOG_DEBUG, "Skipping N-VOP.\n");
-        } else {
-            /* copy packet into BSFContext */
-            av_packet_move_ref(s->b_frame, in);
+            av_buffer_unref(&s->b_frame_ref);
         }
     } else if (nb_vop >= 2) {
         /* use first frame of the packet */
-        av_packet_move_ref(out, in);
-        out->size = pos_vop2;
+        pkt->size = pos_vop2;
     } else if (pos_p >= 0) {
-        ret = av_packet_make_writable(in);
+        ret = av_packet_make_writable(pkt);
         if (ret < 0)
             goto fail;
         av_log(ctx, AV_LOG_DEBUG, "Updating DivX userdata (remove trailing 'p').\n");
-        av_packet_move_ref(out, in);
         /* remove 'p' (packed) from the end of the (DivX) userdata string */
-        out->data[pos_p] = '\0';
+        pkt->data[pos_p] = '\0';
     } else {
-        /* copy packet */
-        av_packet_move_ref(out, in);
+        /* use packet as is */
     }
 
 fail:
     if (ret < 0)
-        av_packet_unref(out);
-    av_packet_free(&in);
+        av_packet_unref(pkt);
 
     return ret;
 }
 
 static int mpeg4_unpack_bframes_init(AVBSFContext *ctx)
 {
-    UnpackBFramesBSFContext *s = ctx->priv_data;
-
-    s->b_frame = av_packet_alloc();
-    if (!s->b_frame)
-        return AVERROR(ENOMEM);
-
     if (ctx->par_in->extradata) {
         int pos_p_ext = -1;
         scan_buffer(ctx->par_in->extradata, ctx->par_in->extradata_size, &pos_p_ext, NULL, NULL);
@@ -166,16 +145,10 @@
     return 0;
 }
 
-static void mpeg4_unpack_bframes_flush(AVBSFContext *bsfc)
+static void mpeg4_unpack_bframes_close_flush(AVBSFContext *bsfc)
 {
     UnpackBFramesBSFContext *ctx = bsfc->priv_data;
-    av_packet_unref(ctx->b_frame);
-}
-
-static void mpeg4_unpack_bframes_close(AVBSFContext *bsfc)
-{
-    UnpackBFramesBSFContext *ctx = bsfc->priv_data;
-    av_packet_free(&ctx->b_frame);
+    av_buffer_unref(&ctx->b_frame_ref);
 }
 
 static const enum AVCodecID codec_ids[] = {
@@ -187,7 +160,7 @@
     .priv_data_size = sizeof(UnpackBFramesBSFContext),
     .init           = mpeg4_unpack_bframes_init,
     .filter         = mpeg4_unpack_bframes_filter,
-    .flush          = mpeg4_unpack_bframes_flush,
-    .close          = mpeg4_unpack_bframes_close,
+    .flush          = mpeg4_unpack_bframes_close_flush,
+    .close          = mpeg4_unpack_bframes_close_flush,
     .codec_ids      = codec_ids,
 };
diff --git a/libavcodec/mpeg4audio.c b/libavcodec/mpeg4audio.c
index 2197147..0d83fb8 100644
--- a/libavcodec/mpeg4audio.c
+++ b/libavcodec/mpeg4audio.c
@@ -84,7 +84,7 @@
 }
 
 int ff_mpeg4audio_get_config_gb(MPEG4AudioConfig *c, GetBitContext *gb,
-                                int sync_extension)
+                                int sync_extension, void *logctx)
 {
     int specific_config_bitindex, ret;
     int start_bit_index = get_bits_count(gb);
@@ -93,6 +93,10 @@
     c->chan_config = get_bits(gb, 4);
     if (c->chan_config < FF_ARRAY_ELEMS(ff_mpeg4audio_channels))
         c->channels = ff_mpeg4audio_channels[c->chan_config];
+    else {
+        av_log(logctx, AV_LOG_ERROR, "Invalid chan_config %d\n", c->chan_config);
+        return AVERROR_INVALIDDATA;
+    }
     c->sbr = -1;
     c->ps  = -1;
     if (c->object_type == AOT_SBR || (c->object_type == AOT_PS &&
@@ -114,8 +118,8 @@
 
     if (c->object_type == AOT_ALS) {
         skip_bits(gb, 5);
-        if (show_bits_long(gb, 24) != MKBETAG('\0','A','L','S'))
-            skip_bits_long(gb, 24);
+        if (show_bits(gb, 24) != MKBETAG('\0','A','L','S'))
+            skip_bits(gb, 24);
 
         specific_config_bitindex = get_bits_count(gb);
 
@@ -152,6 +156,7 @@
     return specific_config_bitindex - start_bit_index;
 }
 
+#if LIBAVCODEC_VERSION_MAJOR < 59
 int avpriv_mpeg4audio_get_config(MPEG4AudioConfig *c, const uint8_t *buf,
                                  int bit_size, int sync_extension)
 {
@@ -165,5 +170,22 @@
     if (ret < 0)
         return ret;
 
-    return ff_mpeg4audio_get_config_gb(c, &gb, sync_extension);
+    return ff_mpeg4audio_get_config_gb(c, &gb, sync_extension, NULL);
+}
+#endif
+
+int avpriv_mpeg4audio_get_config2(MPEG4AudioConfig *c, const uint8_t *buf,
+                                  int size, int sync_extension, void *logctx)
+{
+    GetBitContext gb;
+    int ret;
+
+    if (size <= 0)
+        return AVERROR_INVALIDDATA;
+
+    ret = init_get_bits8(&gb, buf, size);
+    if (ret < 0)
+        return ret;
+
+    return ff_mpeg4audio_get_config_gb(c, &gb, sync_extension, logctx);
 }
diff --git a/libavcodec/mpeg4audio.h b/libavcodec/mpeg4audio.h
index b9cea8a..4b390e0 100644
--- a/libavcodec/mpeg4audio.h
+++ b/libavcodec/mpeg4audio.h
@@ -53,21 +53,36 @@
  * @param[in] c        MPEG4AudioConfig structure to fill.
  * @param[in] gb       Extradata from container.
  * @param[in] sync_extension look for a sync extension after config if true.
- * @return On error -1 is returned, on success AudioSpecificConfig bit index in extradata.
+ * @param[in] logctx opaque struct starting with an AVClass element, used for logging.
+ * @return negative AVERROR code on error, on success AudioSpecificConfig bit index in extradata.
  */
 int ff_mpeg4audio_get_config_gb(MPEG4AudioConfig *c, GetBitContext *gb,
-                                int sync_extension);
+                                int sync_extension, void *logctx);
 
+#if LIBAVCODEC_VERSION_MAJOR < 59
 /**
  * Parse MPEG-4 systems extradata from a raw buffer to retrieve audio configuration.
  * @param[in] c        MPEG4AudioConfig structure to fill.
  * @param[in] buf      Extradata from container.
  * @param[in] bit_size Extradata size in bits.
  * @param[in] sync_extension look for a sync extension after config if true.
- * @return On error -1 is returned, on success AudioSpecificConfig bit index in extradata.
+ * @return negative AVERROR code on error, on success AudioSpecificConfig bit index in extradata.
  */
 int avpriv_mpeg4audio_get_config(MPEG4AudioConfig *c, const uint8_t *buf,
                                  int bit_size, int sync_extension);
+#endif
+
+/**
+ * Parse MPEG-4 systems extradata from a raw buffer to retrieve audio configuration.
+ * @param[in] c        MPEG4AudioConfig structure to fill.
+ * @param[in] buf      Extradata from container.
+ * @param[in] size     Extradata size in bytes.
+ * @param[in] sync_extension look for a sync extension after config if true.
+ * @param[in] logctx opaque struct starting with an AVClass element, used for logging.
+ * @return negative AVERROR code on error, AudioSpecificConfig bit index in extradata on success.
+ */
+int avpriv_mpeg4audio_get_config2(MPEG4AudioConfig *c, const uint8_t *buf,
+                                  int size, int sync_extension, void *logctx);
 
 enum AudioObjectType {
     AOT_NULL,
diff --git a/libavcodec/mpeg4video.h b/libavcodec/mpeg4video.h
index dd0a590..1a5da31 100644
--- a/libavcodec/mpeg4video.h
+++ b/libavcodec/mpeg4video.h
@@ -163,7 +163,7 @@
 void ff_set_mpeg4_time(MpegEncContext *s);
 int ff_mpeg4_encode_picture_header(MpegEncContext *s, int picture_number);
 
-int ff_mpeg4_decode_picture_header(Mpeg4DecContext *ctx, GetBitContext *gb);
+int ff_mpeg4_decode_picture_header(Mpeg4DecContext *ctx, GetBitContext *gb, int header);
 void ff_mpeg4_encode_video_packet_header(MpegEncContext *s);
 void ff_mpeg4_clean_buffers(MpegEncContext *s);
 void ff_mpeg4_stuffing(PutBitContext *pbc);
diff --git a/libavcodec/mpeg4video_parser.c b/libavcodec/mpeg4video_parser.c
index 9ebb09a..9ca0f14 100644
--- a/libavcodec/mpeg4video_parser.c
+++ b/libavcodec/mpeg4video_parser.c
@@ -89,13 +89,13 @@
 
     if (avctx->extradata_size && pc->first_picture) {
         init_get_bits(gb, avctx->extradata, avctx->extradata_size * 8);
-        ret = ff_mpeg4_decode_picture_header(dec_ctx, gb);
-        if (ret < -1)
+        ret = ff_mpeg4_decode_picture_header(dec_ctx, gb, 1);
+        if (ret < 0)
             av_log(avctx, AV_LOG_WARNING, "Failed to parse extradata\n");
     }
 
     init_get_bits(gb, buf, 8 * buf_size);
-    ret = ff_mpeg4_decode_picture_header(dec_ctx, gb);
+    ret = ff_mpeg4_decode_picture_header(dec_ctx, gb, 0);
     if (s->width && (!avctx->width || !avctx->height ||
                      !avctx->coded_width || !avctx->coded_height)) {
         ret = ff_set_dimensions(avctx, s->width, s->height);
diff --git a/libavcodec/mpeg4videodec.c b/libavcodec/mpeg4videodec.c
index f435a52..bfb1f92 100644
--- a/libavcodec/mpeg4videodec.c
+++ b/libavcodec/mpeg4videodec.c
@@ -402,7 +402,7 @@
                 llabs(sprite_offset[0][i] + sprite_delta[i][1] * (h+16LL)) >= INT_MAX ||
                 llabs(sprite_offset[0][i] + sprite_delta[i][0] * (w+16LL) + sprite_delta[i][1] * (h+16LL)) >= INT_MAX ||
                 llabs(sprite_delta[i][0] * (w+16LL)) >= INT_MAX ||
-                llabs(sprite_delta[i][1] * (w+16LL)) >= INT_MAX ||
+                llabs(sprite_delta[i][1] * (h+16LL)) >= INT_MAX ||
                 llabs(sd[0]) >= INT_MAX ||
                 llabs(sd[1]) >= INT_MAX ||
                 llabs(sprite_offset[0][i] + sd[0] * (w+16LL)) >= INT_MAX ||
@@ -711,7 +711,7 @@
                 int i;
 
                 do {
-                    if (show_bits_long(&s->gb, 19) == DC_MARKER)
+                    if (show_bits(&s->gb, 19) == DC_MARKER)
                         return mb_num - 1;
 
                     cbpc = get_vlc2(&s->gb, ff_h263_intra_MCBPC_vlc.table, INTRA_MCBPC_VLC_BITS, 2);
@@ -1001,7 +1001,7 @@
     if (s->pict_type == AV_PICTURE_TYPE_I) {
         while (show_bits(&s->gb, 9) == 1)
             skip_bits(&s->gb, 9);
-        if (get_bits_long(&s->gb, 19) != DC_MARKER) {
+        if (get_bits(&s->gb, 19) != DC_MARKER) {
             av_log(s->avctx, AV_LOG_ERROR,
                    "marker missing after first I partition at %d %d\n",
                    s->mb_x, s->mb_y);
@@ -1782,7 +1782,7 @@
 {
     align_get_bits(gb);
 
-    while (get_bits_left(gb) >= 24 && show_bits_long(gb, 24) != 0x1) {
+    while (get_bits_left(gb) >= 24 && show_bits(gb, 24) != 0x1) {
         get_bits(gb, 8);
     }
 }
@@ -1826,6 +1826,7 @@
     uint32_t flc;
     const int min = -1 *  (1 << (s->avctx->bits_per_raw_sample + 6));
     const int max =      ((1 << (s->avctx->bits_per_raw_sample + 6)) - 1);
+    int shift =  3 - s->dct_precision;
 
     mismatch = 1;
 
@@ -1899,14 +1900,20 @@
             code >>= 1;
             run = (1 << (additional_code_len - 1)) + code;
             idx += run;
+            if (idx > 63)
+                return AVERROR_INVALIDDATA;
             j = scantable[idx++];
             block[j] = sign ? 1 : -1;
         } else if (group >= 13 && group <= 20) {
             /* Level value (Table B.49) */
+            if (idx > 63)
+                return AVERROR_INVALIDDATA;
             j = scantable[idx++];
             block[j] = get_xbits(&s->gb, additional_code_len);
         } else if (group == 21) {
             /* Escape */
+            if (idx > 63)
+                return AVERROR_INVALIDDATA;
             j = scantable[idx++];
             additional_code_len = s->avctx->bits_per_raw_sample + s->dct_precision + 4;
             flc = get_bits(&s->gb, additional_code_len);
@@ -1915,7 +1922,7 @@
             else
                 block[j] = flc;
         }
-        block[j] = ((8 * 2 * block[j] * quant_matrix[j] * s->qscale) >> s->dct_precision) / 32;
+        block[j] = ((block[j] * quant_matrix[j] * s->qscale) * (1 << shift)) / 16;
         block[j] = av_clip(block[j], min, max);
         mismatch ^= block[j];
     }
@@ -3056,6 +3063,8 @@
     if (get_bits_left(gb) <= 32)
         return 0;
 
+    s->partitioned_frame = 0;
+    s->interlaced_dct = 0;
     s->decode_mb = mpeg4_decode_studio_mb;
 
     decode_smpte_tc(ctx, gb);
@@ -3201,11 +3210,13 @@
 
 /**
  * Decode MPEG-4 headers.
- * @return <0 if no VOP found (or a damaged one)
+ *
+ * @param  header If set the absence of a VOP is not treated as error; otherwise, it is treated as such.
+ * @return <0 if an error occurred
  *         FRAME_SKIPPED if a not coded VOP is found
- *         0 if a VOP is found
+ *         0 else
  */
-int ff_mpeg4_decode_picture_header(Mpeg4DecContext *ctx, GetBitContext *gb)
+int ff_mpeg4_decode_picture_header(Mpeg4DecContext *ctx, GetBitContext *gb, int header)
 {
     MpegEncContext *s = &ctx->m;
     unsigned startcode, v;
@@ -3234,6 +3245,8 @@
                 (ctx->divx_version >= 0 || ctx->xvid_build >= 0) || s->codec_tag == AV_RL32("QMP4")) {
                 av_log(s->avctx, AV_LOG_VERBOSE, "frame skip %d\n", gb->size_in_bits);
                 return FRAME_SKIPPED;  // divx bug
+            } else if (header && get_bits_count(gb) == gb->size_in_bits) {
+                return 0; // ordinary return value for parsing of extradata
             } else
                 return AVERROR_INVALIDDATA;  // end of stream
         }
@@ -3447,7 +3460,33 @@
     if (ret < 0)
         return ret;
 
-    memcpy(((uint8_t*)s) + sizeof(MpegEncContext), ((uint8_t*)s1) + sizeof(MpegEncContext), sizeof(Mpeg4DecContext) - sizeof(MpegEncContext));
+    // copy all the necessary fields explicitly
+    s->time_increment_bits       = s1->time_increment_bits;
+    s->shape                     = s1->shape;
+    s->vol_sprite_usage          = s1->vol_sprite_usage;
+    s->sprite_brightness_change  = s1->sprite_brightness_change;
+    s->num_sprite_warping_points = s1->num_sprite_warping_points;
+    s->rvlc                      = s1->rvlc;
+    s->resync_marker             = s1->resync_marker;
+    s->t_frame                   = s1->t_frame;
+    s->new_pred                  = s1->new_pred;
+    s->enhancement_type          = s1->enhancement_type;
+    s->scalability               = s1->scalability;
+    s->use_intra_dc_vlc          = s1->use_intra_dc_vlc;
+    s->intra_dc_threshold        = s1->intra_dc_threshold;
+    s->divx_version              = s1->divx_version;
+    s->divx_build                = s1->divx_build;
+    s->xvid_build                = s1->xvid_build;
+    s->lavc_build                = s1->lavc_build;
+    s->showed_packed_warning     = s1->showed_packed_warning;
+    s->vol_control_parameters    = s1->vol_control_parameters;
+    s->cplx_estimation_trash_i   = s1->cplx_estimation_trash_i;
+    s->cplx_estimation_trash_p   = s1->cplx_estimation_trash_p;
+    s->cplx_estimation_trash_b   = s1->cplx_estimation_trash_b;
+    s->rgb                       = s1->rgb;
+
+    memcpy(s->sprite_shift, s1->sprite_shift, sizeof(s1->sprite_shift));
+    memcpy(s->sprite_traj,  s1->sprite_traj,  sizeof(s1->sprite_traj));
 
     if (CONFIG_MPEG4_DECODER && !init && s1->xvid_build >= 0)
         ff_xvid_idct_init(&s->m.idsp, dst);
@@ -3511,7 +3550,6 @@
     ctx->time_increment_bits = 4; /* default value for broken headers */
 
     avctx->chroma_sample_location = AVCHROMA_LOC_LEFT;
-    avctx->internal->allocate_progress = 1;
 
     return 0;
 }
@@ -3521,13 +3559,11 @@
     Mpeg4DecContext *ctx = avctx->priv_data;
     int i;
 
-    if (!avctx->internal->is_copy) {
-        for (i = 0; i < 12; i++)
-            ff_free_vlc(&ctx->studio_intra_tab[i]);
+    for (i = 0; i < 12; i++)
+        ff_free_vlc(&ctx->studio_intra_tab[i]);
 
-        ff_free_vlc(&ctx->studio_luma_dc);
-        ff_free_vlc(&ctx->studio_chroma_dc);
-    }
+    ff_free_vlc(&ctx->studio_luma_dc);
+    ff_free_vlc(&ctx->studio_chroma_dc);
 
     return ff_h263_decode_end(avctx);
 }
@@ -3557,7 +3593,8 @@
     .capabilities          = AV_CODEC_CAP_DRAW_HORIZ_BAND | AV_CODEC_CAP_DR1 |
                              AV_CODEC_CAP_TRUNCATED | AV_CODEC_CAP_DELAY |
                              AV_CODEC_CAP_FRAME_THREADS,
-    .caps_internal         = FF_CODEC_CAP_SKIP_FRAME_FILL_PARAM,
+    .caps_internal         = FF_CODEC_CAP_SKIP_FRAME_FILL_PARAM |
+                             FF_CODEC_CAP_ALLOCATE_PROGRESS,
     .flush                 = ff_mpeg_flush,
     .max_lowres            = 3,
     .pix_fmts              = ff_h263_hwaccel_pixfmt_list_420,
diff --git a/libavcodec/mpeg4videoenc.c b/libavcodec/mpeg4videoenc.c
index f6a5992..2cd5a8c 100644
--- a/libavcodec/mpeg4videoenc.c
+++ b/libavcodec/mpeg4videoenc.c
@@ -104,7 +104,7 @@
     memcpy(s->block_last_index, zigzag_last_index, sizeof(int) * 6);
 
     for (n = 0; n < 6; n++) {
-        int16_t *ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
+        int16_t *ac_val = &s->ac_val[0][0][0] + s->block_index[n] * 16;
 
         st[n] = s->intra_scantable.permutated;
         if (dir[n]) {
@@ -143,7 +143,7 @@
         score -= get_block_rate(s, block[n], s->block_last_index[n],
                                 s->intra_scantable.permutated);
 
-        ac_val  = s->ac_val[0][0] + s->block_index[n] * 16;
+        ac_val  = &s->ac_val[0][0][0] + s->block_index[n] * 16;
         ac_val1 = ac_val;
         if (dir[n]) {
             const int xy = s->mb_x + s->mb_y * s->mb_stride - s->mb_stride;
diff --git a/libavcodec/mpeg_er.c b/libavcodec/mpeg_er.c
index ada1a16..f54cb85 100644
--- a/libavcodec/mpeg_er.c
+++ b/libavcodec/mpeg_er.c
@@ -78,6 +78,8 @@
     ff_update_block_index(s);
 
     s->bdsp.clear_blocks(s->block[0]);
+    if (!s->chroma_y_shift)
+        s->bdsp.clear_blocks(s->block[6]);
 
     s->dest[0] = s->current_picture.f->data[0] +
                  s->mb_y * 16 * s->linesize +
diff --git a/libavcodec/mpegaudio_parser.c b/libavcodec/mpegaudio_parser.c
index a109f12..1005e89 100644
--- a/libavcodec/mpegaudio_parser.c
+++ b/libavcodec/mpegaudio_parser.c
@@ -101,7 +101,7 @@
                             "MP3ADU full parser");
                         *poutbuf = NULL;
                         *poutbuf_size = 0;
-                        return 0; /* parsers must not return error codes */
+                        return buf_size; /* parsers must not return error codes */
                     }
 
                     break;
diff --git a/libavcodec/mpegaudiodec_template.c b/libavcodec/mpegaudiodec_template.c
index 9cce88e..3f1674e 100644
--- a/libavcodec/mpegaudiodec_template.c
+++ b/libavcodec/mpegaudiodec_template.c
@@ -1851,8 +1851,8 @@
         return AVERROR_INVALIDDATA;
     }
 
-    avpriv_mpeg4audio_get_config(&cfg, avctx->extradata,
-                                 avctx->extradata_size * 8, 1);
+    avpriv_mpeg4audio_get_config2(&cfg, avctx->extradata,
+                                  avctx->extradata_size, 1, avctx);
     if (!cfg.chan_config || cfg.chan_config > 7) {
         av_log(avctx, AV_LOG_ERROR, "Invalid channel config number.\n");
         return AVERROR_INVALIDDATA;
diff --git a/libavcodec/mpegaudioenc_template.c b/libavcodec/mpegaudioenc_template.c
index 93363fe..12f7a09 100644
--- a/libavcodec/mpegaudioenc_template.c
+++ b/libavcodec/mpegaudioenc_template.c
@@ -701,7 +701,7 @@
 
                                 /* normalize to P bits */
                                 if (shift < 0)
-                                    q1 = sample << (-shift);
+                                    q1 = sample * (1 << -shift);
                                 else
                                     q1 = sample >> shift;
                                 q1 = (q1 * mult) >> P;
diff --git a/libavcodec/mpegpicture.c b/libavcodec/mpegpicture.c
index c0e0690..5fce25e 100644
--- a/libavcodec/mpegpicture.c
+++ b/libavcodec/mpegpicture.c
@@ -23,6 +23,7 @@
 #include "libavutil/avassert.h"
 #include "libavutil/common.h"
 #include "libavutil/pixdesc.h"
+#include "libavutil/imgutils.h"
 
 #include "avcodec.h"
 #include "motion_est.h"
@@ -57,6 +58,7 @@
 int ff_mpeg_framesize_alloc(AVCodecContext *avctx, MotionEstContext *me,
                             ScratchpadContext *sc, int linesize)
 {
+#   define EMU_EDGE_HEIGHT (4 * 70)
     int alloc_size = FFALIGN(FFABS(linesize) + 64, 32);
 
     if (avctx->hwaccel)
@@ -67,13 +69,16 @@
         return AVERROR_PATCHWELCOME;
     }
 
+    if (av_image_check_size2(alloc_size, EMU_EDGE_HEIGHT, avctx->max_pixels, AV_PIX_FMT_NONE, 0, avctx) < 0)
+        return AVERROR(ENOMEM);
+
     // edge emu needs blocksize + filter length - 1
     // (= 17x17 for  halfpel / 21x21 for H.264)
     // VC-1 computes luma and chroma simultaneously and needs 19X19 + 9x9
     // at uvlinesize. It supports only YUV420 so 24x24 is enough
     // linesize * interlaced * MBsize
     // we also use this buffer for encoding in encode_mb_internal() needig an additional 32 lines
-    FF_ALLOCZ_ARRAY_OR_GOTO(avctx, sc->edge_emu_buffer, alloc_size, 4 * 70,
+    FF_ALLOCZ_ARRAY_OR_GOTO(avctx, sc->edge_emu_buffer, alloc_size, EMU_EDGE_HEIGHT,
                       fail);
 
     FF_ALLOCZ_ARRAY_OR_GOTO(avctx, me->scratchpad, alloc_size, 4 * 16 * 2,
@@ -206,7 +211,7 @@
 #if FF_API_DEBUG_MV
         avctx->debug_mv ||
 #endif
-        (avctx->flags2 & AV_CODEC_FLAG2_EXPORT_MVS)) {
+        (avctx->export_side_data & AV_CODEC_EXPORT_DATA_MVS)) {
         int mv_size        = 2 * (b8_array_size + 4) * sizeof(int16_t);
         int ref_index_size = 4 * mb_array_size;
 
diff --git a/libavcodec/mpegutils.c b/libavcodec/mpegutils.c
index 3f94540..c0ee3aa 100644
--- a/libavcodec/mpegutils.c
+++ b/libavcodec/mpegutils.c
@@ -105,7 +105,7 @@
                          int *low_delay,
                          int mb_width, int mb_height, int mb_stride, int quarter_sample)
 {
-    if ((avctx->flags2 & AV_CODEC_FLAG2_EXPORT_MVS) && mbtype_table && motion_val[0]) {
+    if ((avctx->export_side_data & AV_CODEC_EXPORT_DATA_MVS) && mbtype_table && motion_val[0]) {
         const int shift = 1 + quarter_sample;
         const int scale = 1 << shift;
         const int mv_sample_log2 = avctx->codec_id == AV_CODEC_ID_H264 || avctx->codec_id == AV_CODEC_ID_SVQ3 ? 2 : 1;
diff --git a/libavcodec/mpegvideo.c b/libavcodec/mpegvideo.c
index d4d3bea..22cab28 100644
--- a/libavcodec/mpegvideo.c
+++ b/libavcodec/mpegvideo.c
@@ -32,7 +32,6 @@
 #include "libavutil/imgutils.h"
 #include "libavutil/internal.h"
 #include "libavutil/motion_vector.h"
-#include "libavutil/timer.h"
 #include "avcodec.h"
 #include "blockdsp.h"
 #include "h264chroma.h"
@@ -347,9 +346,9 @@
     ff_init_scantable(s->idsp.idct_permutation, &s->intra_v_scantable, ff_alternate_vertical_scan);
 }
 
-static int alloc_picture(MpegEncContext *s, Picture *pic, int shared)
+static int alloc_picture(MpegEncContext *s, Picture *pic)
 {
-    return ff_alloc_picture(s->avctx, pic, &s->me, &s->sc, shared, 0,
+    return ff_alloc_picture(s->avctx, pic, &s->me, &s->sc, 0, 0,
                             s->chroma_x_shift, s->chroma_y_shift, s->out_format,
                             s->mb_stride, s->mb_width, s->mb_height, s->b8_stride,
                             &s->linesize, &s->uvlinesize);
@@ -469,7 +468,6 @@
     MpegEncContext bak;
     int i, ret;
     // FIXME copy only needed parts
-    // START_TIMER
     backup_duplicate_context(&bak, dst);
     memcpy(dst, src, sizeof(MpegEncContext));
     backup_duplicate_context(dst, &bak);
@@ -487,8 +485,6 @@
                "scratch buffers.\n");
         return ret;
     }
-    // STOP_TIMER("update_duplicate_context")
-    // about 10k cycles / 0.01 sec for  1000frames on 1ghz with 2 threads
     return 0;
 }
 
@@ -538,6 +534,8 @@
     s->avctx->width         = s1->avctx->width;
     s->avctx->height        = s1->avctx->height;
 
+    s->quarter_sample       = s1->quarter_sample;
+
     s->coded_picture_number = s1->coded_picture_number;
     s->picture_number       = s1->picture_number;
 
@@ -1261,7 +1259,7 @@
 
     pic->f->coded_picture_number = s->coded_picture_number++;
 
-    if (alloc_picture(s, pic, 0) < 0)
+    if (alloc_picture(s, pic) < 0)
         return -1;
 
     s->current_picture_ptr = pic;
@@ -1322,7 +1320,7 @@
         s->last_picture_ptr->f->key_frame = 0;
         s->last_picture_ptr->f->pict_type = AV_PICTURE_TYPE_P;
 
-        if (alloc_picture(s, s->last_picture_ptr, 0) < 0) {
+        if (alloc_picture(s, s->last_picture_ptr) < 0) {
             s->last_picture_ptr = NULL;
             return -1;
         }
@@ -1363,7 +1361,7 @@
         s->next_picture_ptr->f->key_frame = 0;
         s->next_picture_ptr->f->pict_type = AV_PICTURE_TYPE_P;
 
-        if (alloc_picture(s, s->next_picture_ptr, 0) < 0) {
+        if (alloc_picture(s, s->next_picture_ptr) < 0) {
             s->next_picture_ptr = NULL;
             return -1;
         }
diff --git a/libavcodec/mpegvideo.h b/libavcodec/mpegvideo.h
index bbc6b56..29e692f 100644
--- a/libavcodec/mpegvideo.h
+++ b/libavcodec/mpegvideo.h
@@ -455,6 +455,7 @@
     /* MPEG-2-specific - I wished not to have to support this mess. */
     int progressive_sequence;
     int mpeg_f_code[2][2];
+    int a53_cc;
 
     // picture structure defines are loaded from mpegutils.h
     int picture_structure;
@@ -579,6 +580,8 @@
 
     int scenechange_threshold;
     int noise_reduction;
+
+    int intra_penalty;
 } MpegEncContext;
 
 /* mpegvideo_enc common options */
@@ -663,6 +666,8 @@
 {"ps", "RTP payload size in bytes",                             FF_MPV_OFFSET(rtp_payload_size), AV_OPT_TYPE_INT, {.i64 = 0 }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS }, \
 {"mepc", "Motion estimation bitrate penalty compensation (1.0 = 256)", FF_MPV_OFFSET(me_penalty_compensation), AV_OPT_TYPE_INT, {.i64 = 256 }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS }, \
 {"mepre", "pre motion estimation", FF_MPV_OFFSET(me_pre), AV_OPT_TYPE_INT, {.i64 = 0 }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS }, \
+{"intra_penalty", "Penalty for intra blocks in block decision", FF_MPV_OFFSET(intra_penalty), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, INT_MAX/2, FF_MPV_OPT_FLAGS }, \
+{"a53cc", "Use A53 Closed Captions (if available)", FF_MPV_OFFSET(a53_cc), AV_OPT_TYPE_BOOL, {.i64 = 1}, 0, 1, FF_MPV_OPT_FLAGS }, \
 
 extern const AVOption ff_mpv_generic_options[];
 
diff --git a/libavcodec/mpegvideo_enc.c b/libavcodec/mpegvideo_enc.c
index 9fdab31..b2eb9cf 100644
--- a/libavcodec/mpegvideo_enc.c
+++ b/libavcodec/mpegvideo_enc.c
@@ -38,7 +38,6 @@
 #include "libavutil/mathematics.h"
 #include "libavutil/pixdesc.h"
 #include "libavutil/opt.h"
-#include "libavutil/timer.h"
 #include "avcodec.h"
 #include "dct.h"
 #include "idctdsp.h"
@@ -165,7 +164,7 @@
         }
     }
     if (shift) {
-        av_log(NULL, AV_LOG_INFO,
+        av_log(s->avctx, AV_LOG_INFO,
                "Warning, QMAT_SHIFT is larger than %d, overflows possible\n",
                QMAT_SHIFT - shift);
     }
@@ -2005,7 +2004,7 @@
                 av_log(s->avctx, AV_LOG_ERROR,
                        "Internal error, negative bits\n");
 
-            assert(s->repeat_first_field == 0);
+            av_assert1(s->repeat_first_field == 0);
 
             vbv_delay = bits * 90000 / s->avctx->rc_max_rate;
             min_delay = (minbits * 90000LL + s->avctx->rc_max_rate - 1) /
@@ -3056,7 +3055,7 @@
                         if(r % d == 0){
                             current_packet_size=0;
                             s->pb.buf_ptr= s->ptr_lastgob;
-                            assert(put_bits_ptr(&s->pb) == s->ptr_lastgob);
+                            av_assert1(put_bits_ptr(&s->pb) == s->ptr_lastgob);
                         }
                     }
 
@@ -3592,8 +3591,8 @@
         }
     }
 
-    assert(put_bits_count(&src->pb) % 8 ==0);
-    assert(put_bits_count(&dst->pb) % 8 ==0);
+    av_assert1(put_bits_count(&src->pb) % 8 ==0);
+    av_assert1(put_bits_count(&dst->pb) % 8 ==0);
     avpriv_copy_bits(&dst->pb, src->pb.buf, put_bits_count(&src->pb));
     flush_put_bits(&dst->pb);
 }
@@ -3642,11 +3641,11 @@
 
     if(s->pict_type==AV_PICTURE_TYPE_B){
         s->pb_time= s->pp_time - (s->last_non_b_time - s->time);
-        assert(s->pb_time > 0 && s->pb_time < s->pp_time);
+        av_assert1(s->pb_time > 0 && s->pb_time < s->pp_time);
     }else{
         s->pp_time= s->time - s->last_non_b_time;
         s->last_non_b_time= s->time;
-        assert(s->picture_number==0 || s->pp_time > 0);
+        av_assert1(s->picture_number==0 || s->pp_time > 0);
     }
 }
 
@@ -3761,14 +3760,14 @@
                 s->f_code= FFMAX3(s->f_code, a, b);
             }
 
-            ff_fix_long_p_mvs(s);
-            ff_fix_long_mvs(s, NULL, 0, s->p_mv_table, s->f_code, CANDIDATE_MB_TYPE_INTER, 0);
+            ff_fix_long_p_mvs(s, s->intra_penalty ? CANDIDATE_MB_TYPE_INTER : CANDIDATE_MB_TYPE_INTRA);
+            ff_fix_long_mvs(s, NULL, 0, s->p_mv_table, s->f_code, CANDIDATE_MB_TYPE_INTER, !!s->intra_penalty);
             if (s->avctx->flags & AV_CODEC_FLAG_INTERLACED_ME) {
                 int j;
                 for(i=0; i<2; i++){
                     for(j=0; j<2; j++)
                         ff_fix_long_mvs(s, s->p_field_select_table[i], j,
-                                        s->p_field_mv_table[i][j], s->f_code, CANDIDATE_MB_TYPE_INTER_I, 0);
+                                        s->p_field_mv_table[i][j], s->f_code, CANDIDATE_MB_TYPE_INTER_I, !!s->intra_penalty);
                 }
             }
         }
@@ -4262,7 +4261,6 @@
     return last_non_zero;
 }
 
-//#define REFINE_STATS 1
 static int16_t basis[64][64];
 
 static void build_basis(uint8_t *perm){
@@ -4301,15 +4299,6 @@
     uint8_t * last_length;
     int lambda;
     int rle_index, run, q = 1, sum; //q is only used when s->mb_intra is true
-#ifdef REFINE_STATS
-static int count=0;
-static int after_last=0;
-static int to_zero=0;
-static int from_zero=0;
-static int raise=0;
-static int lower=0;
-static int messed_sign=0;
-#endif
 
     if(basis[0][0] == 0)
         build_basis(s->idsp.idct_permutation);
@@ -4353,16 +4342,11 @@
     }
     last_non_zero = s->block_last_index[n];
 
-#ifdef REFINE_STATS
-{START_TIMER
-#endif
     dc += (1<<(RECON_SHIFT-1));
     for(i=0; i<64; i++){
         rem[i] = dc - (orig[i] << RECON_SHIFT); // FIXME use orig directly instead of copying to rem[]
     }
-#ifdef REFINE_STATS
-STOP_TIMER("memset rem[]")}
-#endif
+
     sum=0;
     for(i=0; i<64; i++){
         int one= 36;
@@ -4380,9 +4364,7 @@
         sum += w*w;
     }
     lambda= sum*(uint64_t)s->lambda2 >> (FF_LAMBDA_SHIFT - 6 + 6 + 6 + 6);
-#ifdef REFINE_STATS
-{START_TIMER
-#endif
+
     run=0;
     rle_index=0;
     for(i=start_i; i<=last_non_zero; i++){
@@ -4401,41 +4383,21 @@
             run++;
         }
     }
-#ifdef REFINE_STATS
-if(last_non_zero>0){
-STOP_TIMER("init rem[]")
-}
-}
 
-{START_TIMER
-#endif
     for(;;){
         int best_score = s->mpvencdsp.try_8x8basis(rem, weight, basis[0], 0);
         int best_coeff=0;
         int best_change=0;
         int run2, best_unquant_change=0, analyze_gradient;
-#ifdef REFINE_STATS
-{START_TIMER
-#endif
         analyze_gradient = last_non_zero > 2 || s->quantizer_noise_shaping >= 3;
 
         if(analyze_gradient){
-#ifdef REFINE_STATS
-{START_TIMER
-#endif
             for(i=0; i<64; i++){
                 int w= weight[i];
 
                 d1[i] = (rem[i]*w*w + (1<<(RECON_SHIFT+12-1)))>>(RECON_SHIFT+12);
             }
-#ifdef REFINE_STATS
-STOP_TIMER("rem*w*w")}
-{START_TIMER
-#endif
             s->fdsp.fdct(d1);
-#ifdef REFINE_STATS
-STOP_TIMER("dct")}
-#endif
         }
 
         if(start_i){
@@ -4597,9 +4559,6 @@
                 run++;
             }
         }
-#ifdef REFINE_STATS
-STOP_TIMER("iterative step")}
-#endif
 
         if(best_change){
             int j= perm_scantable[ best_coeff ];
@@ -4609,36 +4568,13 @@
             if(best_coeff > last_non_zero){
                 last_non_zero= best_coeff;
                 av_assert2(block[j]);
-#ifdef REFINE_STATS
-after_last++;
-#endif
             }else{
-#ifdef REFINE_STATS
-if(block[j]){
-    if(block[j] - best_change){
-        if(FFABS(block[j]) > FFABS(block[j] - best_change)){
-            raise++;
-        }else{
-            lower++;
-        }
-    }else{
-        from_zero++;
-    }
-}else{
-    to_zero++;
-}
-#endif
                 for(; last_non_zero>=start_i; last_non_zero--){
                     if(block[perm_scantable[last_non_zero]])
                         break;
                 }
             }
-#ifdef REFINE_STATS
-count++;
-if(256*256*256*64 % count == 0){
-    av_log(s->avctx, AV_LOG_DEBUG, "after_last:%d to_zero:%d from_zero:%d raise:%d lower:%d sign:%d xyp:%d/%d/%d\n", after_last, to_zero, from_zero, raise, lower, messed_sign, s->mb_x, s->mb_y, s->picture_number);
-}
-#endif
+
             run=0;
             rle_index=0;
             for(i=start_i; i<=last_non_zero; i++){
@@ -4658,12 +4594,6 @@
             break;
         }
     }
-#ifdef REFINE_STATS
-if(last_non_zero>0){
-STOP_TIMER("iterative search")
-}
-}
-#endif
 
     return last_non_zero;
 }
diff --git a/libavcodec/mpegvideo_parser.c b/libavcodec/mpegvideo_parser.c
index 7a3c7ab..c02cd7f 100644
--- a/libavcodec/mpegvideo_parser.c
+++ b/libavcodec/mpegvideo_parser.c
@@ -154,7 +154,7 @@
             break;
         }
     }
- the_end: ;
+ the_end:
     if (set_dim_ret < 0)
         av_log(avctx, AV_LOG_ERROR, "Failed to set dimensions\n");
 
diff --git a/libavcodec/mpegvideodata.c b/libavcodec/mpegvideodata.c
index 5f1d8f7..da0638e 100644
--- a/libavcodec/mpegvideodata.c
+++ b/libavcodec/mpegvideodata.c
@@ -19,7 +19,6 @@
 #include <stdint.h>
 
 const uint8_t ff_default_chroma_qscale_table[32] = {
-//   0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15
      0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
     16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31
 };
@@ -32,7 +31,6 @@
 };
 
 const uint8_t ff_mpeg1_dc_scale_table[128] = {
-//  0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
     8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
     8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
     8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
@@ -44,7 +42,6 @@
 };
 
 static const uint8_t mpeg2_dc_scale_table1[128] = {
-//  0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
     4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
     4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
     4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
@@ -56,7 +53,6 @@
 };
 
 static const uint8_t mpeg2_dc_scale_table2[128] = {
-//  0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
@@ -68,7 +64,6 @@
 };
 
 static const uint8_t mpeg2_dc_scale_table3[128] = {
-//  0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
diff --git a/libavcodec/msmpeg4dec.c b/libavcodec/msmpeg4dec.c
index 457a37e..16b6719 100644
--- a/libavcodec/msmpeg4dec.c
+++ b/libavcodec/msmpeg4dec.c
@@ -412,6 +412,14 @@
 {
     int code;
 
+    // at minimum one bit per macroblock is required at least in a valid frame,
+    // we discard frames much smaller than this. Frames smaller than 1/8 of the
+    // smallest "black/skip" frame generally contain not much recoverable content
+    // while at the same time they have the highest computational requirements
+    // per byte
+    if (get_bits_left(&s->gb) * 8LL < (s->width+15)/16 * ((s->height+15)/16))
+        return AVERROR_INVALIDDATA;
+
     if(s->msmpeg4_version==1){
         int start_code = get_bits_long(&s->gb, 32);
         if(start_code!=0x00000100){
diff --git a/libavcodec/msrle.c b/libavcodec/msrle.c
index adb55b1..9233b34 100644
--- a/libavcodec/msrle.c
+++ b/libavcodec/msrle.c
@@ -42,8 +42,6 @@
     AVFrame *frame;
 
     GetByteContext gb;
-    const unsigned char *buf;
-    int size;
 
     uint32_t pal[256];
 } MsrleContext;
@@ -92,10 +90,10 @@
     int istride = FFALIGN(avctx->width*avctx->bits_per_coded_sample, 32) / 8;
     int ret;
 
-    s->buf = buf;
-    s->size = buf_size;
+    if (buf_size < 2) //Minimally a end of picture code should be there
+        return AVERROR_INVALIDDATA;
 
-    if ((ret = ff_reget_buffer(avctx, s->frame)) < 0)
+    if ((ret = ff_reget_buffer(avctx, s->frame, 0)) < 0)
         return ret;
 
     if (avctx->bits_per_coded_sample > 1 && avctx->bits_per_coded_sample <= 8) {
@@ -150,6 +148,13 @@
     return buf_size;
 }
 
+static void msrle_decode_flush(AVCodecContext *avctx)
+{
+    MsrleContext *s = avctx->priv_data;
+
+    av_frame_unref(s->frame);
+}
+
 static av_cold int msrle_decode_end(AVCodecContext *avctx)
 {
     MsrleContext *s = avctx->priv_data;
@@ -169,5 +174,6 @@
     .init           = msrle_decode_init,
     .close          = msrle_decode_end,
     .decode         = msrle_decode_frame,
+    .flush          = msrle_decode_flush,
     .capabilities   = AV_CODEC_CAP_DR1,
 };
diff --git a/libavcodec/mss1.c b/libavcodec/mss1.c
index a579d9d..7af8024 100644
--- a/libavcodec/mss1.c
+++ b/libavcodec/mss1.c
@@ -56,6 +56,8 @@
         c->low   <<= 1;
         c->high  <<= 1;
         c->high   |= 1;
+        if (get_bits_left(c->gbc.gb) < 1)
+            c->overread++;
         c->value  |= get_bits1(c->gbc.gb);
     }
 }
@@ -112,6 +114,7 @@
     c->low           = 0;
     c->high          = 0xFFFF;
     c->value         = get_bits(gb, 16);
+    c->overread      = 0;
     c->gbc.gb        = gb;
     c->get_model_sym = arith_get_model_sym;
     c->get_number    = arith_get_number;
@@ -151,7 +154,7 @@
 
     arith_init(&acoder, &gb);
 
-    if ((ret = ff_reget_buffer(avctx, ctx->pic)) < 0)
+    if ((ret = ff_reget_buffer(avctx, ctx->pic, 0)) < 0)
         return ret;
 
     c->pal_pic    =  ctx->pic->data[0] + ctx->pic->linesize[0] * (avctx->height - 1);
diff --git a/libavcodec/mss12.c b/libavcodec/mss12.c
index 3b1a302..5a5bd9a 100644
--- a/libavcodec/mss12.c
+++ b/libavcodec/mss12.c
@@ -161,6 +161,8 @@
 {
     int i, val, pix;
 
+    if (acoder->overread > MAX_OVERREAD)
+        return AVERROR_INVALIDDATA;
     val = acoder->get_model_sym(acoder, &pctx->cache_model);
     if (val < pctx->num_syms) {
         if (any_ngb) {
@@ -306,6 +308,8 @@
             else
                 p = decode_pixel_in_context(acoder, pctx, dst + i, stride,
                                             i, j, width - i - 1);
+            if (p < 0)
+                return p;
             dst[i] = p;
 
             if (rgb_pic)
@@ -398,6 +402,8 @@
                 else
                     p = decode_pixel_in_context(acoder, pctx, dst + i, stride,
                                                 i, j, width - i - 1);
+                if (p < 0)
+                    return p;
                 dst[i] = p;
                 if (c->rgb_pic)
                     AV_WB24(rgb_dst + i * 3, c->pal[p]);
@@ -473,6 +479,8 @@
         uint8_t *rgb_dst = c->rgb_pic + x * 3 + y * rgb_stride;
 
         pix     = decode_pixel(acoder, &sc->intra_pix_ctx, NULL, 0, 0);
+        if (pix < 0)
+            return pix;
         rgb_pix = c->pal[pix];
         for (i = 0; i < height; i++, dst += stride, rgb_dst += rgb_stride) {
             memset(dst, pix, width);
@@ -499,6 +507,8 @@
 
     if (!mode) {
         mode = decode_pixel(acoder, &sc->inter_pix_ctx, NULL, 0, 0);
+        if (mode < 0)
+            return mode;
 
         if (c->avctx->err_recognition & AV_EF_EXPLODE &&
             ( c->rgb_pic && mode != 0x01 && mode != 0x02 && mode != 0x04 ||
@@ -530,6 +540,8 @@
                          int x, int y, int width, int height)
 {
     int mode, pivot;
+    if (acoder->overread > MAX_OVERREAD)
+        return AVERROR_INVALIDDATA;
 
     mode = acoder->get_model_sym(acoder, &sc->split_mode);
 
diff --git a/libavcodec/mss12.h b/libavcodec/mss12.h
index 45c4074..6f68fc3 100644
--- a/libavcodec/mss12.h
+++ b/libavcodec/mss12.h
@@ -47,6 +47,8 @@
 
 typedef struct ArithCoder {
     int low, high, value;
+    int overread;
+#define MAX_OVERREAD 16
     union {
         GetBitContext *gb;
         GetByteContext *gB;
diff --git a/libavcodec/mss2.c b/libavcodec/mss2.c
index 3180af1..9434a74 100644
--- a/libavcodec/mss2.c
+++ b/libavcodec/mss2.c
@@ -152,6 +152,7 @@
     c->low           = 0;
     c->high          = 0xFFFFFF;
     c->value         = bytestream2_get_be24(gB);
+    c->overread      = 0;
     c->gbc.gB        = gB;
     c->get_model_sym = arith2_get_model_sym;
     c->get_number    = arith2_get_number;
@@ -174,7 +175,7 @@
     return 1 + ncol * 3;
 }
 
-static int decode_555(GetByteContext *gB, uint16_t *dst, ptrdiff_t stride,
+static int decode_555(AVCodecContext *avctx, GetByteContext *gB, uint16_t *dst, ptrdiff_t stride,
                       int keyframe, int w, int h)
 {
     int last_symbol = 0, repeat = 0, prev_avail = 0;
@@ -212,7 +213,7 @@
                     repeat = 0;
                     while (b-- > 130) {
                         if (repeat >= (INT_MAX >> 8) - 1) {
-                            av_log(NULL, AV_LOG_ERROR, "repeat overflow\n");
+                            av_log(avctx, AV_LOG_ERROR, "repeat overflow\n");
                             return AVERROR_INVALIDDATA;
                         }
                         repeat = (repeat << 8) + bytestream2_get_byte(gB) + 1;
@@ -411,8 +412,6 @@
 
     ff_mpeg_er_frame_start(s);
 
-    v->bits = buf_size * 8;
-
     v->end_mb_x = (w + 15) >> 4;
     s->end_mb_y = (h + 15) >> 4;
     if (v->respic & 1)
@@ -617,7 +616,7 @@
             return AVERROR_INVALIDDATA;
         }
     } else {
-        if ((ret = ff_reget_buffer(avctx, ctx->last_pic)) < 0)
+        if ((ret = ff_reget_buffer(avctx, ctx->last_pic, 0)) < 0)
             return ret;
         if ((ret = av_frame_ref(frame, ctx->last_pic)) < 0)
             return ret;
@@ -634,7 +633,7 @@
     if (is_555) {
         bytestream2_init(&gB, buf, buf_size);
 
-        if (decode_555(&gB, (uint16_t *)c->rgb_pic, c->rgb_stride >> 1,
+        if (decode_555(avctx, &gB, (uint16_t *)c->rgb_pic, c->rgb_stride >> 1,
                        keyframe, avctx->width, avctx->height))
             return AVERROR_INVALIDDATA;
 
diff --git a/libavcodec/mss3.c b/libavcodec/mss3.c
index 21226f9..113af5b 100644
--- a/libavcodec/mss3.c
+++ b/libavcodec/mss3.c
@@ -298,6 +298,10 @@
             c->got_error = 1;
             c->low = 1;
         }
+        if (c->low > c->range) {
+            c->got_error = 1;
+            c->low = 1;
+        }
         if (c->range >= RAC_BOTTOM)
             return;
     }
@@ -733,7 +737,7 @@
         return buf_size;
     c->got_error = 0;
 
-    if ((ret = ff_reget_buffer(avctx, c->pic)) < 0)
+    if ((ret = ff_reget_buffer(avctx, c->pic, 0)) < 0)
         return ret;
     c->pic->key_frame = keyframe;
     c->pic->pict_type = keyframe ? AV_PICTURE_TYPE_I : AV_PICTURE_TYPE_P;
diff --git a/libavcodec/mss4.c b/libavcodec/mss4.c
index b58c21b..432df29 100644
--- a/libavcodec/mss4.c
+++ b/libavcodec/mss4.c
@@ -552,8 +552,13 @@
                "Empty frame found but it is not a skip frame.\n");
         return AVERROR_INVALIDDATA;
     }
+    mb_width  = FFALIGN(width,  16) >> 4;
+    mb_height = FFALIGN(height, 16) >> 4;
 
-    if ((ret = ff_reget_buffer(avctx, c->pic)) < 0)
+    if (frame_type != SKIP_FRAME && 8*buf_size < 8*HEADER_SIZE + mb_width*mb_height)
+        return AVERROR_INVALIDDATA;
+
+    if ((ret = ff_reget_buffer(avctx, c->pic, 0)) < 0)
         return ret;
     c->pic->key_frame = (frame_type == INTRA_FRAME);
     c->pic->pict_type = (frame_type == INTRA_FRAME) ? AV_PICTURE_TYPE_I
@@ -574,9 +579,6 @@
 
     if ((ret = init_get_bits8(&gb, buf + HEADER_SIZE, buf_size - HEADER_SIZE)) < 0)
         return ret;
-
-    mb_width  = FFALIGN(width,  16) >> 4;
-    mb_height = FFALIGN(height, 16) >> 4;
     dst[0] = c->pic->data[0];
     dst[1] = c->pic->data[1];
     dst[2] = c->pic->data[2];
diff --git a/libavcodec/msvideo1.c b/libavcodec/msvideo1.c
index 29700f5..c9bcce5 100644
--- a/libavcodec/msvideo1.c
+++ b/libavcodec/msvideo1.c
@@ -62,6 +62,9 @@
 
     s->avctx = avctx;
 
+    if (avctx->width < 4 || avctx->height < 4)
+        return AVERROR_INVALIDDATA;
+
     /* figure out the colorspace based on the presence of a palette */
     if (s->avctx->bits_per_coded_sample == 8) {
         s->mode_8bit = 1;
@@ -307,7 +310,7 @@
         return AVERROR_INVALIDDATA;
     }
 
-    if ((ret = ff_reget_buffer(avctx, s->frame)) < 0)
+    if ((ret = ff_reget_buffer(avctx, s->frame, 0)) < 0)
         return ret;
 
     if (s->mode_8bit) {
diff --git a/libavcodec/mv30.c b/libavcodec/mv30.c
new file mode 100644
index 0000000..fed9bcd
--- /dev/null
+++ b/libavcodec/mv30.c
@@ -0,0 +1,715 @@
+/*
+ * MidiVid MV30 decoder
+ *
+ * Copyright (c) 2020 Paul B Mahol
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "libavutil/thread.h"
+
+#include "avcodec.h"
+#include "bytestream.h"
+#include "copy_block.h"
+#include "mathops.h"
+#include "blockdsp.h"
+#include "get_bits.h"
+#include "internal.h"
+#include "aandcttab.h"
+
+typedef struct MV30Context {
+    GetBitContext  gb;
+
+    int intra_quant;
+    int inter_quant;
+    int is_inter;
+    int mode_size;
+    int nb_mvectors;
+
+    int      block[6][64];
+    int16_t *mvectors;
+    unsigned int mvectors_size;
+    int16_t *coeffs;
+    unsigned int coeffs_size;
+
+    int16_t intraq_tab[2][64];
+    int16_t interq_tab[2][64];
+
+    BlockDSPContext bdsp;
+    AVFrame *prev_frame;
+} MV30Context;
+
+static VLC cbp_tab;
+
+static const uint8_t luma_tab[] = {
+    12, 12, 15, 19, 25, 34, 40, 48,
+    12, 12, 18, 22, 27, 44, 47, 46,
+    17, 18, 21, 26, 35, 46, 52, 47,
+    18, 20, 24, 28, 40, 61, 59, 51,
+    20, 24, 32, 43, 50, 72, 72, 63,
+    25, 31, 42, 48, 58, 72, 81, 75,
+    38, 46, 54, 61, 71, 84, 88, 85,
+    50, 61, 65, 68, 79, 78, 86, 91,
+};
+
+static const uint8_t chroma_tab[] = {
+    12, 16, 24, 47, 99, 99, 99, 99,
+    16, 21, 26, 66, 99, 99, 99, 99,
+    24, 26, 56, 99, 99, 99, 99, 99,
+    47, 66, 99, 99, 99, 99, 99, 99,
+    99, 99, 99, 99, 99, 99, 99, 99,
+    99, 99, 99, 99, 99, 99, 99, 99,
+    99, 99, 99, 99, 99, 99, 99, 99,
+    99, 99, 99, 99, 99, 99, 99, 99,
+};
+
+static const uint8_t zigzag[] = {
+     0,  1,  8,  9, 16,  2,  3, 10,
+    17, 24, 32, 25, 18, 11,  4,  5,
+    12, 19, 26, 33, 40, 48, 41, 34,
+    27, 20, 13,  6,  7, 14, 21, 28,
+    35, 42, 49, 56, 57, 50, 43, 36,
+    29, 22, 15, 23, 30, 37, 44, 51,
+    58, 59, 52, 45, 38, 31, 39, 46,
+    53, 60, 61, 54, 47, 55, 62, 63,
+};
+
+static void get_qtable(int16_t *table, int quant, const uint8_t *quant_tab)
+{
+    int factor = quant < 50 ? 5000 / FFMAX(quant, 1) : 200 - FFMIN(quant, 100) * 2;
+
+    for (int i = 0; i < 64; i++) {
+        table[i] = av_clip((quant_tab[i] * factor + 0x32) / 100, 1, 0x7fff);
+        table[i] = ((int)ff_aanscales[i] * (int)table[i] + 0x800) >> 12;
+    }
+}
+
+static inline void idct_1d(int *blk, int step)
+{
+    const int t0 = blk[0 * step] + blk[4 * step];
+    const int t1 = blk[0 * step] - blk[4 * step];
+    const int t2 = blk[2 * step] + blk[6 * step];
+    const int t3 = (((blk[2 * step] - blk[6 * step]) * 362) >> 8) - t2;
+    const int t4 = t0 + t2;
+    const int t5 = t0 - t2;
+    const int t6 = t1 + t3;
+    const int t7 = t1 - t3;
+    const int t8 = blk[5 * step] + blk[3 * step];
+    const int t9 = blk[5 * step] - blk[3 * step];
+    const int tA = blk[1 * step] + blk[7 * step];
+    const int tB = blk[1 * step] - blk[7 * step];
+    const int tC = t8 + tA;
+    const int tD = (tB + t9) * 473 >> 8;
+    const int tE = ((t9 * -669 >> 8) - tC) + tD;
+    const int tF = ((tA - t8) * 362 >> 8) - tE;
+    const int t10 = ((tB * 277 >> 8) - tD) + tF;
+
+    blk[0 * step] = t4 + tC;
+    blk[1 * step] = t6 + tE;
+    blk[2 * step] = t7 + tF;
+    blk[3 * step] = t5 - t10;
+    blk[4 * step] = t5 + t10;
+    blk[5 * step] = t7 - tF;
+    blk[6 * step] = t6 - tE;
+    blk[7 * step] = t4 - tC;
+}
+
+static void idct_put(uint8_t *dst, int stride, int *block)
+{
+    for (int i = 0; i < 8; i++) {
+        if ((block[0x08 + i] |
+             block[0x10 + i] |
+             block[0x18 + i] |
+             block[0x20 + i] |
+             block[0x28 + i] |
+             block[0x30 + i] |
+             block[0x38 + i]) == 0) {
+            block[0x08 + i] = block[i];
+            block[0x10 + i] = block[i];
+            block[0x18 + i] = block[i];
+            block[0x20 + i] = block[i];
+            block[0x28 + i] = block[i];
+            block[0x30 + i] = block[i];
+            block[0x38 + i] = block[i];
+        } else {
+            idct_1d(block + i, 8);
+        }
+    }
+
+    for (int i = 0; i < 8; i++) {
+        idct_1d(block, 1);
+        for (int j = 0; j < 8; j++)
+            dst[j] = av_clip_uint8((block[j] >> 5) + 128);
+        block += 8;
+        dst += stride;
+    }
+}
+
+static void idct_add(uint8_t *dst, int stride,
+                     const uint8_t *src, int in_linesize, int *block)
+{
+    for (int i = 0; i < 8; i++) {
+        if ((block[0x08 + i] |
+             block[0x10 + i] |
+             block[0x18 + i] |
+             block[0x20 + i] |
+             block[0x28 + i] |
+             block[0x30 + i] |
+             block[0x38 + i]) == 0) {
+            block[0x08 + i] = block[i];
+            block[0x10 + i] = block[i];
+            block[0x18 + i] = block[i];
+            block[0x20 + i] = block[i];
+            block[0x28 + i] = block[i];
+            block[0x30 + i] = block[i];
+            block[0x38 + i] = block[i];
+        } else {
+            idct_1d(block + i, 8);
+        }
+    }
+
+    for (int i = 0; i < 8; i++) {
+        idct_1d(block, 1);
+        for (int j = 0; j < 8; j++)
+            dst[j] = av_clip_uint8((block[j] >> 5) + src[j]);
+        block += 8;
+        dst += stride;
+        src += in_linesize;
+    }
+}
+
+static inline void idct2_1d(int *blk, int step)
+{
+    const int t0 = blk[0 * step];
+    const int t1 = blk[1 * step];
+    const int t2 = t1 * 473 >> 8;
+    const int t3 = t2 - t1;
+    const int t4 = (t1 * 362 >> 8) - t3;
+    const int t5 = ((t1 * 277 >> 8) - t2) + t4;
+
+    blk[0 * step] = t1 + t0;
+    blk[1 * step] = t0 + t3;
+    blk[2 * step] = t4 + t0;
+    blk[3 * step] = t0 - t5;
+    blk[4 * step] = t5 + t0;
+    blk[5 * step] = t0 - t4;
+    blk[6 * step] = t0 - t3;
+    blk[7 * step] = t0 - t1;
+}
+
+static void idct2_put(uint8_t *dst, int stride, int *block)
+{
+    for (int i = 0; i < 2; i++) {
+        if ((block[0x08 + i]) == 0) {
+            block[0x08 + i] = block[i];
+            block[0x10 + i] = block[i];
+            block[0x18 + i] = block[i];
+            block[0x20 + i] = block[i];
+            block[0x28 + i] = block[i];
+            block[0x30 + i] = block[i];
+            block[0x38 + i] = block[i];
+        } else {
+            idct2_1d(block + i, 8);
+        }
+    }
+
+    for (int i = 0; i < 8; i++) {
+        if (block[1] == 0) {
+            for (int j = 0; j < 8; j++)
+                dst[j] = av_clip_uint8((block[0] >> 5) + 128);
+        } else {
+            idct2_1d(block, 1);
+            for (int j = 0; j < 8; j++)
+                dst[j] = av_clip_uint8((block[j] >> 5) + 128);
+        }
+        block += 8;
+        dst += stride;
+    }
+}
+
+static void idct2_add(uint8_t *dst, int stride,
+                      const uint8_t *src, int in_linesize,
+                      int *block)
+{
+    for (int i = 0; i < 2; i++) {
+        if ((block[0x08 + i]) == 0) {
+            block[0x08 + i] = block[i];
+            block[0x10 + i] = block[i];
+            block[0x18 + i] = block[i];
+            block[0x20 + i] = block[i];
+            block[0x28 + i] = block[i];
+            block[0x30 + i] = block[i];
+            block[0x38 + i] = block[i];
+        } else {
+            idct2_1d(block + i, 8);
+        }
+    }
+
+    for (int i = 0; i < 8; i++) {
+        if (block[1] == 0) {
+            for (int j = 0; j < 8; j++)
+                dst[j] = av_clip_uint8((block[0] >> 5) + src[j]);
+        } else {
+            idct2_1d(block, 1);
+            for (int j = 0; j < 8; j++)
+                dst[j] = av_clip_uint8((block[j] >> 5) + src[j]);
+        }
+        block += 8;
+        dst += stride;
+        src += in_linesize;
+    }
+}
+
+static void update_inter_block(uint8_t *dst, int stride,
+                               const uint8_t *src, int in_linesize,
+                               int block)
+{
+    for (int i = 0; i < 8; i++) {
+        for (int j = 0; j < 8; j++)
+            dst[j] = av_clip_uint8(block + src[j]);
+        dst += stride;
+        src += in_linesize;
+    }
+}
+
+static int decode_intra_block(AVCodecContext *avctx, int mode,
+                              GetByteContext *gbyte, int16_t *qtab,
+                              int *block, int *pfill,
+                              uint8_t *dst, int linesize)
+{
+    MV30Context *s = avctx->priv_data;
+    int fill;
+
+    switch (mode) {
+    case 0:
+        s->bdsp.fill_block_tab[1](dst, 128, linesize, 8);
+        break;
+    case 1:
+        fill = sign_extend(bytestream2_get_ne16(gbyte), 16);
+        pfill[0] += fill;
+        block[0] = ((pfill[0] * qtab[0]) >> 5) + 128;
+        s->bdsp.fill_block_tab[1](dst, block[0], linesize, 8);
+        break;
+    case 2:
+        memset(block, 0, sizeof(*block) * 64);
+        fill = sign_extend(bytestream2_get_ne16(gbyte), 16);
+        pfill[0] += fill;
+        block[0] = pfill[0] * qtab[0];
+        block[1] = sign_extend(bytestream2_get_ne16(gbyte), 16) * qtab[1];
+        block[8] = sign_extend(bytestream2_get_ne16(gbyte), 16) * qtab[8];
+        block[9] = sign_extend(bytestream2_get_ne16(gbyte), 16) * qtab[9];
+        idct2_put(dst, linesize, block);
+        break;
+    case 3:
+        fill = sign_extend(bytestream2_get_ne16(gbyte), 16);
+        pfill[0] += fill;
+        block[0] = pfill[0] * qtab[0];
+        for (int i = 1; i < 64; i++)
+            block[zigzag[i]] = sign_extend(bytestream2_get_ne16(gbyte), 16) * qtab[zigzag[i]];
+        idct_put(dst, linesize, block);
+        break;
+    }
+
+    return 0;
+}
+
+static int decode_inter_block(AVCodecContext *avctx, int mode,
+                              GetByteContext *gbyte, int16_t *qtab,
+                              int *block, int *pfill,
+                              uint8_t *dst, int linesize,
+                              const uint8_t *src, int in_linesize)
+{
+    int fill;
+
+    switch (mode) {
+    case 0:
+        copy_block8(dst, src, linesize, in_linesize, 8);
+        break;
+    case 1:
+        fill = sign_extend(bytestream2_get_ne16(gbyte), 16);
+        pfill[0] += fill;
+        block[0] = (pfill[0] * qtab[0]) >> 5;
+        update_inter_block(dst, linesize, src, in_linesize, block[0]);
+        break;
+    case 2:
+        memset(block, 0, sizeof(*block) * 64);
+        fill = sign_extend(bytestream2_get_ne16(gbyte), 16);
+        pfill[0] += fill;
+        block[0] = pfill[0] * qtab[0];
+        block[1] = sign_extend(bytestream2_get_ne16(gbyte), 16) * qtab[1];
+        block[8] = sign_extend(bytestream2_get_ne16(gbyte), 16) * qtab[8];
+        block[9] = sign_extend(bytestream2_get_ne16(gbyte), 16) * qtab[9];
+        idct2_add(dst, linesize, src, in_linesize, block);
+        break;
+    case 3:
+        fill = sign_extend(bytestream2_get_ne16(gbyte), 16);
+        pfill[0] += fill;
+        block[0] = pfill[0] * qtab[0];
+        for (int i = 1; i < 64; i++)
+            block[zigzag[i]] = sign_extend(bytestream2_get_ne16(gbyte), 16) * qtab[zigzag[i]];
+        idct_add(dst, linesize, src, in_linesize, block);
+        break;
+    }
+
+    return 0;
+}
+
+static int decode_coeffs(GetBitContext *gb, int16_t *coeffs, int nb_codes)
+{
+    memset(coeffs, 0, nb_codes * sizeof(*coeffs));
+
+    for (int i = 0; i < nb_codes;) {
+        int value = get_vlc2(gb, cbp_tab.table, cbp_tab.bits, 1);
+
+        if (value < 0)
+            return AVERROR_INVALIDDATA;
+
+        if (value > 0) {
+            int x = get_bits(gb, value);
+
+            if (x < (1 << value) / 2) {
+                x =  (1 << (value - 1)) + (x & ((1 << value) - 1 >> 1));
+            } else {
+                x = -(1 << (value - 1)) - (x & ((1 << value) - 1 >> 1));
+            }
+            coeffs[i++] = x;
+        } else {
+            int flag = get_bits1(gb);
+
+            i += get_bits(gb, 3 + flag * 3) + 1 + flag * 8;
+        }
+    }
+
+    return 0;
+}
+
+static int decode_intra(AVCodecContext *avctx, GetBitContext *gb, AVFrame *frame)
+{
+    MV30Context *s = avctx->priv_data;
+    GetBitContext mgb;
+    uint8_t *dst[6];
+    int linesize[6];
+    int ret;
+
+    mgb = *gb;
+    skip_bits_long(gb, s->mode_size * 8);
+
+    linesize[0] = frame->linesize[0];
+    linesize[1] = frame->linesize[0];
+    linesize[2] = frame->linesize[0];
+    linesize[3] = frame->linesize[0];
+    linesize[4] = frame->linesize[1];
+    linesize[5] = frame->linesize[2];
+
+    for (int y = 0; y < avctx->height; y += 16) {
+        GetByteContext gbyte;
+        int pfill[3][1] = { 0 };
+        int nb_codes = get_bits(gb, 16);
+
+        av_fast_padded_malloc(&s->coeffs, &s->coeffs_size, nb_codes * sizeof(*s->coeffs));
+        if (!s->coeffs)
+            return AVERROR(ENOMEM);
+        ret = decode_coeffs(gb, s->coeffs, nb_codes);
+        if (ret < 0)
+            return ret;
+
+        bytestream2_init(&gbyte, (uint8_t *)s->coeffs, nb_codes * sizeof(*s->coeffs));
+
+        for (int x = 0; x < avctx->width; x += 16) {
+            dst[0] = frame->data[0] + linesize[0] * y + x;
+            dst[1] = frame->data[0] + linesize[0] * y + x + 8;
+            dst[2] = frame->data[0] + linesize[0] * (y + 8) + x;
+            dst[3] = frame->data[0] + linesize[0] * (y + 8) + x + 8;
+            dst[4] = frame->data[1] + linesize[4] * (y >> 1) + (x >> 1);
+            dst[5] = frame->data[2] + linesize[5] * (y >> 1) + (x >> 1);
+
+            for (int b = 0; b < 6; b++) {
+                int mode = get_bits_le(&mgb, 2);
+
+                ret = decode_intra_block(avctx, mode, &gbyte, s->intraq_tab[b >= 4],
+                                         s->block[b],
+                                         pfill[(b >= 4) + (b >= 5)],
+                                         dst[b], linesize[b]);
+                if (ret < 0)
+                    return ret;
+            }
+        }
+    }
+
+    return 0;
+}
+
+static int decode_inter(AVCodecContext *avctx, GetBitContext *gb,
+                        AVFrame *frame, AVFrame *prev)
+{
+    MV30Context *s = avctx->priv_data;
+    GetBitContext mask;
+    GetBitContext mgb;
+    GetByteContext mv;
+    const int mask_size = ((avctx->height >> 4) * (avctx->width >> 4) * 2 + 7) / 8;
+    uint8_t *dst[6], *src[6];
+    int in_linesize[6];
+    int linesize[6];
+    int ret, cnt = 0;
+    int flags = 0;
+
+    in_linesize[0] = prev->linesize[0];
+    in_linesize[1] = prev->linesize[0];
+    in_linesize[2] = prev->linesize[0];
+    in_linesize[3] = prev->linesize[0];
+    in_linesize[4] = prev->linesize[1];
+    in_linesize[5] = prev->linesize[2];
+
+    linesize[0] = frame->linesize[0];
+    linesize[1] = frame->linesize[0];
+    linesize[2] = frame->linesize[0];
+    linesize[3] = frame->linesize[0];
+    linesize[4] = frame->linesize[1];
+    linesize[5] = frame->linesize[2];
+
+    av_fast_padded_malloc(&s->mvectors, &s->mvectors_size, 2 * s->nb_mvectors * sizeof(*s->mvectors));
+    if (!s->mvectors) {
+        ret = AVERROR(ENOMEM);
+        goto fail;
+    }
+
+    mask = *gb;
+    skip_bits_long(gb, mask_size * 8);
+    mgb = *gb;
+    skip_bits_long(gb, s->mode_size * 8);
+
+    ret = decode_coeffs(gb, s->mvectors, 2 * s->nb_mvectors);
+    if (ret < 0)
+        goto fail;
+
+    bytestream2_init(&mv, (uint8_t *)s->mvectors, 2 * s->nb_mvectors * sizeof(*s->mvectors));
+
+    for (int y = 0; y < avctx->height; y += 16) {
+        GetByteContext gbyte;
+        int pfill[3][1] = { 0 };
+        int nb_codes = get_bits(gb, 16);
+
+        skip_bits(gb, 8);
+        if (get_bits_left(gb) < 0) {
+            ret = AVERROR_INVALIDDATA;
+            goto fail;
+        }
+
+        av_fast_padded_malloc(&s->coeffs, &s->coeffs_size, nb_codes * sizeof(*s->coeffs));
+        if (!s->coeffs) {
+            ret = AVERROR(ENOMEM);
+            goto fail;
+        }
+
+        ret = decode_coeffs(gb, s->coeffs, nb_codes);
+        if (ret < 0)
+            goto fail;
+
+        bytestream2_init(&gbyte, (uint8_t *)s->coeffs, nb_codes * sizeof(*s->coeffs));
+
+        for (int x = 0; x < avctx->width; x += 16) {
+            if (cnt >= 4)
+                cnt = 0;
+            if (cnt == 0)
+                flags = get_bits(&mask, 8);
+
+            dst[0] = frame->data[0] + linesize[0] * y + x;
+            dst[1] = frame->data[0] + linesize[0] * y + x + 8;
+            dst[2] = frame->data[0] + linesize[0] * (y + 8) + x;
+            dst[3] = frame->data[0] + linesize[0] * (y + 8) + x + 8;
+            dst[4] = frame->data[1] + linesize[4] * (y >> 1) + (x >> 1);
+            dst[5] = frame->data[2] + linesize[5] * (y >> 1) + (x >> 1);
+
+            if ((flags >> (cnt)) & 1) {
+                int mv_x = sign_extend(bytestream2_get_ne16(&mv), 16);
+                int mv_y = sign_extend(bytestream2_get_ne16(&mv), 16);
+
+                int px = x + mv_x;
+                int py = y + mv_y;
+
+                if (px < 0 || px >= avctx->width ||
+                    py < 0 || py >= avctx->height)
+                    return AVERROR_INVALIDDATA;
+
+                src[0] = prev->data[0] + in_linesize[0] * py + px;
+                src[1] = prev->data[0] + in_linesize[0] * py + px + 8;
+                src[2] = prev->data[0] + in_linesize[0] * (py + 8) + px;
+                src[3] = prev->data[0] + in_linesize[0] * (py + 8) + px + 8;
+                src[4] = prev->data[1] + in_linesize[4] * (py >> 1) + (px >> 1);
+                src[5] = prev->data[2] + in_linesize[5] * (py >> 1) + (px >> 1);
+
+                if ((flags >> (cnt + 4)) & 1) {
+                    for (int b = 0; b < 6; b++)
+                        copy_block8(dst[b], src[b], linesize[b], in_linesize[b], 8);
+                } else {
+                    for (int b = 0; b < 6; b++) {
+                        int mode = get_bits_le(&mgb, 2);
+
+                        ret = decode_inter_block(avctx, mode, &gbyte, s->interq_tab[b >= 4],
+                                                 s->block[b],
+                                                 pfill[(b >= 4) + (b >= 5)],
+                                                 dst[b], linesize[b],
+                                                 src[b], in_linesize[b]);
+                        if (ret < 0)
+                            goto fail;
+                    }
+                }
+            } else {
+                for (int b = 0; b < 6; b++) {
+                    int mode = get_bits_le(&mgb, 2);
+
+                    ret = decode_intra_block(avctx, mode, &gbyte, s->intraq_tab[b >= 4],
+                                             s->block[b],
+                                             pfill[(b >= 4) + (b >= 5)],
+                                             dst[b], linesize[b]);
+                    if (ret < 0)
+                        goto fail;
+                }
+            }
+
+            cnt++;
+        }
+    }
+
+fail:
+    return ret;
+}
+
+static int decode_frame(AVCodecContext *avctx, void *data,
+                        int *got_frame, AVPacket *avpkt)
+{
+    MV30Context *s = avctx->priv_data;
+    GetBitContext *gb = &s->gb;
+    AVFrame *frame = data;
+    int ret;
+
+    if ((ret = init_get_bits8(gb, avpkt->data, avpkt->size)) < 0)
+        return ret;
+
+    if ((ret = ff_get_buffer(avctx, frame, AV_GET_BUFFER_FLAG_REF)) < 0)
+        return ret;
+
+    s->intra_quant = get_bits(gb, 8);
+    s->inter_quant = s->intra_quant + get_sbits(gb, 8);
+    s->is_inter = get_bits_le(gb, 16);
+    s->mode_size = get_bits_le(gb, 16);
+    if (s->is_inter)
+        s->nb_mvectors = get_bits_le(gb, 16);
+
+    get_qtable(s->intraq_tab[0], s->intra_quant, luma_tab);
+    get_qtable(s->intraq_tab[1], s->intra_quant, chroma_tab);
+
+    frame->key_frame = s->is_inter == 0;
+
+    if (frame->key_frame) {
+        ret = decode_intra(avctx, gb, frame);
+        if (ret < 0)
+            return ret;
+    } else {
+        get_qtable(s->interq_tab[0], s->inter_quant, luma_tab);
+        get_qtable(s->interq_tab[1], s->inter_quant, chroma_tab);
+
+        if (!s->prev_frame->data[0]) {
+            av_log(avctx, AV_LOG_ERROR, "Missing reference frame.\n");
+            return AVERROR_INVALIDDATA;
+        }
+
+        ret = decode_inter(avctx, gb, frame, s->prev_frame);
+        if (ret < 0)
+            return ret;
+    }
+
+    av_frame_unref(s->prev_frame);
+    if ((ret = av_frame_ref(s->prev_frame, frame)) < 0)
+        return ret;
+
+    *got_frame = 1;
+
+    return avpkt->size;
+}
+
+static const uint16_t cbp_codes[] = {
+    0, 1, 4, 5, 6, 0xE, 0x1E, 0x3E, 0x7E, 0xFE, 0x1FE, 0x1FF,
+};
+
+static const uint8_t cbp_bits[] = {
+    2, 2, 3, 3, 3, 4, 5, 6, 7, 8, 9, 9,
+};
+
+static av_cold void init_static_data(void)
+{
+    INIT_VLC_SPARSE_STATIC(&cbp_tab, 9, FF_ARRAY_ELEMS(cbp_bits),
+                           cbp_bits, 1, 1, cbp_codes, 2, 2, NULL, 0, 0, 512);
+}
+
+static av_cold int decode_init(AVCodecContext *avctx)
+{
+    MV30Context *s = avctx->priv_data;
+    static AVOnce init_static_once = AV_ONCE_INIT;
+
+    avctx->pix_fmt = AV_PIX_FMT_YUV420P;
+    avctx->color_range = AVCOL_RANGE_JPEG;
+
+    ff_blockdsp_init(&s->bdsp, avctx);
+
+    s->prev_frame = av_frame_alloc();
+    if (!s->prev_frame)
+        return AVERROR(ENOMEM);
+
+    ff_thread_once(&init_static_once, init_static_data);
+
+    return 0;
+}
+
+static void decode_flush(AVCodecContext *avctx)
+{
+    MV30Context *s = avctx->priv_data;
+
+    av_frame_unref(s->prev_frame);
+}
+
+static av_cold int decode_close(AVCodecContext *avctx)
+{
+    MV30Context *s = avctx->priv_data;
+
+    av_frame_free(&s->prev_frame);
+    av_freep(&s->coeffs);
+    s->coeffs_size = 0;
+    av_freep(&s->mvectors);
+    s->mvectors_size = 0;
+
+    return 0;
+}
+
+AVCodec ff_mv30_decoder = {
+    .name             = "mv30",
+    .long_name        = NULL_IF_CONFIG_SMALL("MidiVid 3.0"),
+    .type             = AVMEDIA_TYPE_VIDEO,
+    .id               = AV_CODEC_ID_MV30,
+    .priv_data_size   = sizeof(MV30Context),
+    .init             = decode_init,
+    .close            = decode_close,
+    .decode           = decode_frame,
+    .flush            = decode_flush,
+    .capabilities     = AV_CODEC_CAP_DR1,
+    .caps_internal    = FF_CODEC_CAP_INIT_THREADSAFE |
+                        FF_CODEC_CAP_INIT_CLEANUP,
+};
diff --git a/libavcodec/mvha.c b/libavcodec/mvha.c
new file mode 100644
index 0000000..c603ef6
--- /dev/null
+++ b/libavcodec/mvha.c
@@ -0,0 +1,322 @@
+/*
+ * MidiVid Archive codec
+ *
+ * Copyright (c) 2019 Paul B Mahol
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#define CACHED_BITSTREAM_READER !ARCH_X86_32
+#include "libavutil/intreadwrite.h"
+
+#include "avcodec.h"
+#include "bytestream.h"
+#include "get_bits.h"
+#include "internal.h"
+#include "lossless_videodsp.h"
+
+#include <zlib.h>
+
+typedef struct MVHAContext {
+    GetBitContext     gb;
+    int nb_symbols;
+
+    uint8_t           symb[256];
+    uint32_t          prob[256];
+    VLC               vlc;
+
+    z_stream          zstream;
+    LLVidDSPContext   llviddsp;
+} MVHAContext;
+
+typedef struct Node {
+    int16_t  sym;
+    int16_t  n0;
+    int16_t  l, r;
+    uint32_t count;
+} Node;
+
+static void get_tree_codes(uint32_t *bits, int16_t *lens, uint8_t *xlat,
+                           Node *nodes, int node,
+                           uint32_t pfx, int pl, int *pos)
+{
+    int s;
+
+    s = nodes[node].sym;
+    if (s != -1) {
+        bits[*pos] = (~pfx) & ((1ULL << FFMAX(pl, 1)) - 1);
+        lens[*pos] = FFMAX(pl, 1);
+        xlat[*pos] = s + (pl == 0);
+        (*pos)++;
+    } else {
+        pfx <<= 1;
+        pl++;
+        get_tree_codes(bits, lens, xlat, nodes, nodes[node].l, pfx, pl,
+                       pos);
+        pfx |= 1;
+        get_tree_codes(bits, lens, xlat, nodes, nodes[node].r, pfx, pl,
+                       pos);
+    }
+}
+
+static int build_vlc(AVCodecContext *avctx, VLC *vlc)
+{
+    MVHAContext *s = avctx->priv_data;
+    Node nodes[512];
+    uint32_t bits[256];
+    int16_t lens[256];
+    uint8_t xlat[256];
+    int cur_node, i, j, pos = 0;
+
+    ff_free_vlc(vlc);
+
+    for (i = 0; i < s->nb_symbols; i++) {
+        nodes[i].count = s->prob[i];
+        nodes[i].sym   = s->symb[i];
+        nodes[i].n0    = -2;
+        nodes[i].l     = i;
+        nodes[i].r     = i;
+    }
+
+    cur_node = s->nb_symbols;
+    j = 0;
+    do {
+        for (i = 0; ; i++) {
+            int new_node = j;
+            int first_node = cur_node;
+            int second_node = cur_node;
+            unsigned nd, st;
+
+            nodes[cur_node].count = -1;
+
+            do {
+                int val = nodes[new_node].count;
+                if (val && (val < nodes[first_node].count)) {
+                    if (val >= nodes[second_node].count) {
+                        first_node = new_node;
+                    } else {
+                        first_node = second_node;
+                        second_node = new_node;
+                    }
+                }
+                new_node += 1;
+            } while (new_node != cur_node);
+
+            if (first_node == cur_node)
+                break;
+
+            nd = nodes[second_node].count;
+            st = nodes[first_node].count;
+            nodes[second_node].count = 0;
+            nodes[first_node].count  = 0;
+            if (nd >= UINT32_MAX - st) {
+                av_log(avctx, AV_LOG_ERROR, "count overflow\n");
+                return AVERROR_INVALIDDATA;
+            }
+            nodes[cur_node].count = nd + st;
+            nodes[cur_node].sym = -1;
+            nodes[cur_node].n0 = cur_node;
+            nodes[cur_node].l = first_node;
+            nodes[cur_node].r = second_node;
+            cur_node++;
+        }
+        j++;
+    } while (cur_node - s->nb_symbols == j);
+
+    get_tree_codes(bits, lens, xlat, nodes, cur_node - 1, 0, 0, &pos);
+
+    return ff_init_vlc_sparse(vlc, 12, pos, lens, 2, 2, bits, 4, 4, xlat, 1, 1, 0);
+}
+
+static int decode_frame(AVCodecContext *avctx,
+                        void *data, int *got_frame,
+                        AVPacket *avpkt)
+{
+    MVHAContext *s = avctx->priv_data;
+    AVFrame *frame = data;
+    uint32_t type, size;
+    int ret;
+
+    if (avpkt->size <= 8)
+        return AVERROR_INVALIDDATA;
+
+    type = AV_RB32(avpkt->data);
+    size = AV_RL32(avpkt->data + 4);
+
+    if (size < 1 || size >= avpkt->size)
+        return AVERROR_INVALIDDATA;
+
+    if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
+        return ret;
+
+    if (type == MKTAG('L','Z','Y','V')) {
+        ret = inflateReset(&s->zstream);
+        if (ret != Z_OK) {
+            av_log(avctx, AV_LOG_ERROR, "Inflate reset error: %d\n", ret);
+            return AVERROR_EXTERNAL;
+        }
+
+        s->zstream.next_in  = avpkt->data + 8;
+        s->zstream.avail_in = avpkt->size - 8;
+
+        for (int p = 0; p < 3; p++) {
+            for (int y = 0; y < avctx->height; y++) {
+                s->zstream.next_out  = frame->data[p] + (avctx->height - y - 1) * frame->linesize[p];
+                s->zstream.avail_out = avctx->width >> (p > 0);
+
+                ret = inflate(&s->zstream, Z_SYNC_FLUSH);
+                if (ret != Z_OK && ret != Z_STREAM_END) {
+                    av_log(avctx, AV_LOG_ERROR, "Inflate error: %d\n", ret);
+                    return AVERROR_EXTERNAL;
+                }
+            }
+        }
+    } else if (type == MKTAG('H','U','F','Y')) {
+        GetBitContext *gb = &s->gb;
+        int first_symbol, symbol;
+
+        ret = init_get_bits8(gb, avpkt->data + 8, avpkt->size - 8);
+        if (ret < 0)
+            return ret;
+
+        skip_bits(gb, 24);
+
+        first_symbol = get_bits(gb, 8);
+        s->nb_symbols = get_bits(gb, 8) + 1;
+
+        symbol = first_symbol;
+        for (int i = 0; i < s->nb_symbols; symbol++) {
+            int prob;
+
+            if (get_bits_left(gb) < 4)
+                return AVERROR_INVALIDDATA;
+
+            if (get_bits1(gb)) {
+                prob = get_bits(gb, 12);
+            } else {
+                prob = get_bits(gb, 3);
+            }
+
+            if (prob) {
+                s->symb[i] = symbol;
+                s->prob[i] = prob;
+                i++;
+            }
+        }
+
+        ret = build_vlc(avctx, &s->vlc);
+        if (ret < 0)
+            return ret;
+
+        for (int p = 0; p < 3; p++) {
+            int width = avctx->width >> (p > 0);
+            ptrdiff_t stride = frame->linesize[p];
+            uint8_t *dst;
+
+            dst = frame->data[p] + (avctx->height - 1) * frame->linesize[p];
+            for (int y = 0; y < avctx->height; y++) {
+                if (get_bits_left(gb) < width)
+                    return AVERROR_INVALIDDATA;
+                for (int x = 0; x < width; x++) {
+                    int v = get_vlc2(gb, s->vlc.table, s->vlc.bits, 3);
+
+                    if (v < 0)
+                        return AVERROR_INVALIDDATA;
+
+                    dst[x] = v;
+                }
+                dst -= stride;
+            }
+        }
+    } else {
+        return AVERROR_INVALIDDATA;
+    }
+
+    for (int p = 0; p < 3; p++) {
+        int left, lefttop;
+        int width = avctx->width >> (p > 0);
+        ptrdiff_t stride = frame->linesize[p];
+        uint8_t *dst;
+
+        dst = frame->data[p] + (avctx->height - 1) * frame->linesize[p];
+        s->llviddsp.add_left_pred(dst, dst, width, 0);
+        if (avctx->height > 1) {
+            dst -= stride;
+            lefttop = left = dst[0];
+            for (int y = 1; y < avctx->height; y++) {
+                s->llviddsp.add_median_pred(dst, dst + stride, dst, width, &left, &lefttop);
+                lefttop = left = dst[0];
+                dst -= stride;
+            }
+        }
+    }
+
+    frame->pict_type = AV_PICTURE_TYPE_I;
+    frame->key_frame = 1;
+    *got_frame = 1;
+
+    return avpkt->size;
+}
+
+static av_cold int decode_init(AVCodecContext *avctx)
+{
+    MVHAContext *s = avctx->priv_data;
+    int zret;
+
+    avctx->pix_fmt = AV_PIX_FMT_YUV422P;
+
+    s->zstream.zalloc = Z_NULL;
+    s->zstream.zfree = Z_NULL;
+    s->zstream.opaque = Z_NULL;
+    zret = inflateInit(&s->zstream);
+    if (zret != Z_OK) {
+        av_log(avctx, AV_LOG_ERROR, "Inflate init error: %d\n", zret);
+        return AVERROR_EXTERNAL;
+    }
+
+    ff_llviddsp_init(&s->llviddsp);
+
+    return 0;
+}
+
+static av_cold int decode_close(AVCodecContext *avctx)
+{
+    MVHAContext *s = avctx->priv_data;
+
+    inflateEnd(&s->zstream);
+    ff_free_vlc(&s->vlc);
+
+    return 0;
+}
+
+AVCodec ff_mvha_decoder = {
+    .name             = "mvha",
+    .long_name        = NULL_IF_CONFIG_SMALL("MidiVid Archive Codec"),
+    .type             = AVMEDIA_TYPE_VIDEO,
+    .id               = AV_CODEC_ID_MVHA,
+    .priv_data_size   = sizeof(MVHAContext),
+    .init             = decode_init,
+    .close            = decode_close,
+    .decode           = decode_frame,
+    .capabilities     = AV_CODEC_CAP_DR1,
+    .caps_internal    = FF_CODEC_CAP_INIT_THREADSAFE |
+                        FF_CODEC_CAP_INIT_CLEANUP,
+};
diff --git a/libavcodec/mxpegdec.c b/libavcodec/mxpegdec.c
index 2e3ebe6..55ec6e9 100644
--- a/libavcodec/mxpegdec.c
+++ b/libavcodec/mxpegdec.c
@@ -199,6 +199,7 @@
     buf_end = buf + buf_size;
     jpg->got_picture = 0;
     s->got_mxm_bitmask = 0;
+    s->got_sof_data = !!s->got_sof_data;
     while (buf_ptr < buf_end) {
         start_code = ff_mjpeg_find_marker(jpg, &buf_ptr, buf_end,
                                           &unescaped_buf_ptr, &unescaped_buf_size);
@@ -241,6 +242,11 @@
                     return ret;
                 break;
             case SOF0:
+                if (s->got_sof_data > 1) {
+                    av_log(avctx, AV_LOG_ERROR,
+                           "Multiple SOF in a frame\n");
+                    return AVERROR_INVALIDDATA;
+                }
                 s->got_sof_data = 0;
                 ret = ff_mjpeg_decode_sof(jpg);
                 if (ret < 0) {
@@ -253,7 +259,7 @@
                            "Interlaced mode not supported in MxPEG\n");
                     return AVERROR(EINVAL);
                 }
-                s->got_sof_data = 1;
+                s->got_sof_data ++;
                 break;
             case SOS:
                 if (!s->got_sof_data) {
diff --git a/libavcodec/noise_bsf.c b/libavcodec/noise_bsf.c
index d79f63b..b72429a 100644
--- a/libavcodec/noise_bsf.c
+++ b/libavcodec/noise_bsf.c
@@ -19,13 +19,11 @@
  */
 
 #include <stdlib.h>
-#include <string.h>
 
 #include "avcodec.h"
 #include "bsf.h"
 
 #include "libavutil/log.h"
-#include "libavutil/mem.h"
 #include "libavutil/opt.h"
 
 typedef struct NoiseContext {
@@ -39,7 +37,7 @@
 {
     NoiseContext *s = ctx->priv_data;
     int amount = s->amount > 0 ? s->amount : (s->state % 10001 + 1);
-    int i, ret = 0;
+    int i, ret;
 
     if (amount <= 0)
         return AVERROR(EINVAL);
@@ -55,19 +53,18 @@
     }
 
     ret = av_packet_make_writable(pkt);
-    if (ret < 0)
-        goto fail;
+    if (ret < 0) {
+        av_packet_unref(pkt);
+        return ret;
+    }
 
     for (i = 0; i < pkt->size; i++) {
         s->state += pkt->data[i] + 1;
         if (s->state % amount == 0)
             pkt->data[i] = s->state;
     }
-fail:
-    if (ret < 0)
-        av_packet_unref(pkt);
 
-    return ret;
+    return 0;
 }
 
 #define OFFSET(x) offsetof(NoiseContext, x)
diff --git a/libavcodec/nuv.c b/libavcodec/nuv.c
index 32ed658..7958000 100644
--- a/libavcodec/nuv.c
+++ b/libavcodec/nuv.c
@@ -131,10 +131,10 @@
                      + RTJPEG_HEADER_SIZE;
         if (buf_size > INT_MAX/8)
             return -1;
-        if ((ret = av_image_check_size(height, width, 0, avctx)) < 0)
+        if ((ret = ff_set_dimensions(avctx, width, height)) < 0)
             return ret;
-        avctx->width  = c->width  = width;
-        avctx->height = c->height = height;
+        c->width  = width;
+        c->height = height;
         av_fast_malloc(&c->decomp_buf, &c->decomp_size,
                        buf_size);
         if (!c->decomp_buf) {
@@ -162,6 +162,7 @@
     int keyframe, ret;
     int size_change = 0;
     int minsize = 0;
+    int flags = 0;
     int result, init_frame = !avctx->frame_number;
     enum {
         NUV_UNCOMPRESSED  = '0',
@@ -204,6 +205,7 @@
         }
         break;
     case NUV_COPY_LAST:
+        flags |= FF_REGET_BUFFER_FLAG_READONLY;
         keyframe = 0;
         break;
     default:
@@ -217,6 +219,14 @@
     case NUV_RTJPEG:
         minsize = c->width/16 * (c->height/16) * 6;
         break;
+    case NUV_BLACK:
+    case NUV_COPY_LAST:
+    case NUV_LZO:
+    case NUV_RTJPEG_IN_LZO:
+        break;
+    default:
+        av_log(avctx, AV_LOG_ERROR, "unknown compression\n");
+        return AVERROR_INVALIDDATA;
     }
     if (buf_size < minsize / 4)
         return AVERROR_INVALIDDATA;
@@ -268,7 +278,7 @@
         init_frame = 1;
     }
 
-    if ((result = ff_reget_buffer(avctx, c->pic)) < 0)
+    if ((result = ff_reget_buffer(avctx, c->pic, flags)) < 0)
         return result;
     if (init_frame) {
         memset(c->pic->data[0], 0,    avctx->height * c->pic->linesize[0]);
@@ -305,9 +315,6 @@
     case NUV_COPY_LAST:
         /* nothing more to do here */
         break;
-    default:
-        av_log(avctx, AV_LOG_ERROR, "unknown compression\n");
-        return AVERROR_INVALIDDATA;
     }
 
     if ((result = av_frame_ref(picture, c->pic)) < 0)
@@ -365,4 +372,5 @@
     .close          = decode_end,
     .decode         = decode_frame,
     .capabilities   = AV_CODEC_CAP_DR1,
+    .caps_internal  = FF_CODEC_CAP_INIT_CLEANUP,
 };
diff --git a/libavcodec/nvdec.c b/libavcodec/nvdec.c
index e779be3..6168a7e 100644
--- a/libavcodec/nvdec.c
+++ b/libavcodec/nvdec.c
@@ -26,6 +26,7 @@
 #include "libavutil/error.h"
 #include "libavutil/hwcontext.h"
 #include "libavutil/hwcontext_cuda_internal.h"
+#include "libavutil/cuda_check.h"
 #include "libavutil/pixdesc.h"
 #include "libavutil/pixfmt.h"
 
@@ -34,10 +35,16 @@
 #include "nvdec.h"
 #include "internal.h"
 
+#if !NVDECAPI_CHECK_VERSION(9, 0)
+#define cudaVideoSurfaceFormat_YUV444 2
+#define cudaVideoSurfaceFormat_YUV444_16Bit 3
+#endif
+
 typedef struct NVDECDecoder {
     CUvideodecoder decoder;
 
     AVBufferRef *hw_device_ref;
+    AVBufferRef *real_hw_frames_ref;
     CUcontext    cuda_ctx;
     CUstream     stream;
 
@@ -50,6 +57,8 @@
     unsigned int nb_allocated;
 } NVDECFramePool;
 
+#define CHECK_CU(x) FF_CUDA_CHECK_DL(logctx, decoder->cudl, x)
+
 static int map_avcodec_id(enum AVCodecID id)
 {
     switch (id) {
@@ -86,7 +95,7 @@
 static int nvdec_test_capabilities(NVDECDecoder *decoder,
                                    CUVIDDECODECREATEINFO *params, void *logctx)
 {
-    CUresult err;
+    int ret;
     CUVIDDECODECAPS caps = { 0 };
 
     caps.eCodecType      = params->CodecType;
@@ -105,11 +114,9 @@
         return 0;
     }
 
-    err = decoder->cvdl->cuvidGetDecoderCaps(&caps);
-    if (err != CUDA_SUCCESS) {
-        av_log(logctx, AV_LOG_ERROR, "Failed querying decoder capabilities\n");
-        return AVERROR_UNKNOWN;
-    }
+    ret = CHECK_CU(decoder->cvdl->cuvidGetDecoderCaps(&caps));
+    if (ret < 0)
+        return ret;
 
     av_log(logctx, AV_LOG_VERBOSE, "NVDEC capabilities:\n");
     av_log(logctx, AV_LOG_VERBOSE, "format supported: %s, max_mb_count: %d\n",
@@ -149,9 +156,15 @@
 {
     NVDECDecoder *decoder = (NVDECDecoder*)data;
 
-    if (decoder->decoder)
-        decoder->cvdl->cuvidDestroyDecoder(decoder->decoder);
+    if (decoder->decoder) {
+        void *logctx = decoder->hw_device_ref->data;
+        CUcontext dummy;
+        CHECK_CU(decoder->cudl->cuCtxPushCurrent(decoder->cuda_ctx));
+        CHECK_CU(decoder->cvdl->cuvidDestroyDecoder(decoder->decoder));
+        CHECK_CU(decoder->cudl->cuCtxPopCurrent(&dummy));
+    }
 
+    av_buffer_unref(&decoder->real_hw_frames_ref);
     av_buffer_unref(&decoder->hw_device_ref);
 
     cuvid_free_functions(&decoder->cvdl);
@@ -169,7 +182,6 @@
     NVDECDecoder *decoder;
 
     CUcontext dummy;
-    CUresult err;
     int ret;
 
     decoder = av_mallocz(sizeof(*decoder));
@@ -198,25 +210,21 @@
         goto fail;
     }
 
-    err = decoder->cudl->cuCtxPushCurrent(decoder->cuda_ctx);
-    if (err != CUDA_SUCCESS) {
-        ret = AVERROR_UNKNOWN;
+    ret = CHECK_CU(decoder->cudl->cuCtxPushCurrent(decoder->cuda_ctx));
+    if (ret < 0)
         goto fail;
-    }
 
     ret = nvdec_test_capabilities(decoder, params, logctx);
     if (ret < 0) {
-        decoder->cudl->cuCtxPopCurrent(&dummy);
+        CHECK_CU(decoder->cudl->cuCtxPopCurrent(&dummy));
         goto fail;
     }
 
-    err = decoder->cvdl->cuvidCreateDecoder(&decoder->decoder, params);
+    ret = CHECK_CU(decoder->cvdl->cuvidCreateDecoder(&decoder->decoder, params));
 
-    decoder->cudl->cuCtxPopCurrent(&dummy);
+    CHECK_CU(decoder->cudl->cuCtxPopCurrent(&dummy));
 
-    if (err != CUDA_SUCCESS) {
-        av_log(logctx, AV_LOG_ERROR, "Error creating a NVDEC decoder: %d\n", err);
-        ret = AVERROR_UNKNOWN;
+    if (ret < 0) {
         goto fail;
     }
 
@@ -263,17 +271,69 @@
     return 0;
 }
 
+static void nvdec_free_dummy(struct AVHWFramesContext *ctx)
+{
+    av_buffer_pool_uninit(&ctx->pool);
+}
+
+static AVBufferRef *nvdec_alloc_dummy(int size)
+{
+    return av_buffer_create(NULL, 0, NULL, NULL, 0);
+}
+
+static int nvdec_init_hwframes(AVCodecContext *avctx, AVBufferRef **out_frames_ref, int dummy)
+{
+    AVHWFramesContext *frames_ctx;
+    int ret;
+
+    ret = avcodec_get_hw_frames_parameters(avctx,
+                                           avctx->hw_device_ctx,
+                                           avctx->hwaccel->pix_fmt,
+                                           out_frames_ref);
+    if (ret < 0)
+        return ret;
+
+    frames_ctx = (AVHWFramesContext*)(*out_frames_ref)->data;
+
+    if (dummy) {
+        // Copied from ff_decode_get_hw_frames_ctx for compatibility
+        frames_ctx->initial_pool_size += 3;
+
+        frames_ctx->free = nvdec_free_dummy;
+        frames_ctx->pool = av_buffer_pool_init(0, nvdec_alloc_dummy);
+
+        if (!frames_ctx->pool) {
+            av_buffer_unref(out_frames_ref);
+            return AVERROR(ENOMEM);
+        }
+    } else {
+        // This is normally not used to actually allocate frames from
+        frames_ctx->initial_pool_size = 0;
+    }
+
+    ret = av_hwframe_ctx_init(*out_frames_ref);
+    if (ret < 0) {
+        av_buffer_unref(out_frames_ref);
+        return ret;
+    }
+
+    return 0;
+}
+
 int ff_nvdec_decode_init(AVCodecContext *avctx)
 {
     NVDECContext *ctx = avctx->internal->hwaccel_priv_data;
 
+    NVDECDecoder        *decoder;
+    AVBufferRef         *real_hw_frames_ref;
     NVDECFramePool      *pool;
     AVHWFramesContext   *frames_ctx;
     const AVPixFmtDescriptor *sw_desc;
 
     CUVIDDECODECREATEINFO params = { 0 };
 
-    int cuvid_codec_type, cuvid_chroma_format;
+    cudaVideoSurfaceFormat output_format;
+    int cuvid_codec_type, cuvid_chroma_format, chroma_444;
     int ret = 0;
 
     sw_desc = av_pix_fmt_desc_get(avctx->sw_pix_fmt);
@@ -291,11 +351,36 @@
         av_log(avctx, AV_LOG_ERROR, "Unsupported chroma format\n");
         return AVERROR(ENOSYS);
     }
+    chroma_444 = ctx->supports_444 && cuvid_chroma_format == cudaVideoChromaFormat_444;
 
     if (!avctx->hw_frames_ctx) {
-        ret = ff_decode_get_hw_frames_ctx(avctx, AV_HWDEVICE_TYPE_CUDA);
+        ret = nvdec_init_hwframes(avctx, &avctx->hw_frames_ctx, 1);
         if (ret < 0)
             return ret;
+
+        ret = nvdec_init_hwframes(avctx, &real_hw_frames_ref, 0);
+        if (ret < 0)
+            return ret;
+    } else {
+        real_hw_frames_ref = av_buffer_ref(avctx->hw_frames_ctx);
+        if (!real_hw_frames_ref)
+            return AVERROR(ENOMEM);
+    }
+
+    switch (sw_desc->comp[0].depth) {
+    case 8:
+        output_format = chroma_444 ? cudaVideoSurfaceFormat_YUV444 :
+                                     cudaVideoSurfaceFormat_NV12;
+        break;
+    case 10:
+    case 12:
+        output_format = chroma_444 ? cudaVideoSurfaceFormat_YUV444_16Bit :
+                                     cudaVideoSurfaceFormat_P016;
+        break;
+    default:
+        av_log(avctx, AV_LOG_ERROR, "Unsupported bit depth\n");
+        av_buffer_unref(&real_hw_frames_ref);
+        return AVERROR(ENOSYS);
     }
 
     frames_ctx = (AVHWFramesContext*)avctx->hw_frames_ctx->data;
@@ -305,8 +390,7 @@
     params.ulTargetWidth       = avctx->coded_width;
     params.ulTargetHeight      = avctx->coded_height;
     params.bitDepthMinus8      = sw_desc->comp[0].depth - 8;
-    params.OutputFormat        = params.bitDepthMinus8 ?
-                                 cudaVideoSurfaceFormat_P016 : cudaVideoSurfaceFormat_NV12;
+    params.OutputFormat        = output_format;
     params.CodecType           = cuvid_codec_type;
     params.ChromaFormat        = cuvid_chroma_format;
     params.ulNumDecodeSurfaces = frames_ctx->initial_pool_size;
@@ -320,9 +404,14 @@
             av_log(avctx, AV_LOG_WARNING, "Try lowering the amount of threads. Using %d right now.\n",
                    avctx->thread_count);
         }
+        av_buffer_unref(&real_hw_frames_ref);
         return ret;
     }
 
+    decoder = (NVDECDecoder*)ctx->decoder_ref->data;
+    decoder->real_hw_frames_ref = real_hw_frames_ref;
+    real_hw_frames_ref = NULL;
+
     pool = av_mallocz(sizeof(*pool));
     if (!pool) {
         ret = AVERROR(ENOMEM);
@@ -360,21 +449,18 @@
 {
     NVDECFrame *unmap_data = (NVDECFrame*)data;
     NVDECDecoder *decoder = (NVDECDecoder*)unmap_data->decoder_ref->data;
+    void *logctx = decoder->hw_device_ref->data;
     CUdeviceptr devptr = (CUdeviceptr)opaque;
-    CUresult err;
+    int ret;
     CUcontext dummy;
 
-    err = decoder->cudl->cuCtxPushCurrent(decoder->cuda_ctx);
-    if (err != CUDA_SUCCESS) {
-        av_log(NULL, AV_LOG_ERROR, "cuCtxPushCurrent failed\n");
+    ret = CHECK_CU(decoder->cudl->cuCtxPushCurrent(decoder->cuda_ctx));
+    if (ret < 0)
         goto finish;
-    }
 
-    err = decoder->cvdl->cuvidUnmapVideoFrame(decoder->decoder, devptr);
-    if (err != CUDA_SUCCESS)
-        av_log(NULL, AV_LOG_ERROR, "cuvidUnmapVideoFrame failed\n");
+    CHECK_CU(decoder->cvdl->cuvidUnmapVideoFrame(decoder->decoder, devptr));
 
-    decoder->cudl->cuCtxPopCurrent(&dummy);
+    CHECK_CU(decoder->cudl->cuCtxPopCurrent(&dummy));
 
 finish:
     av_buffer_unref(&unmap_data->idx_ref);
@@ -388,32 +474,31 @@
     NVDECFrame        *cf = (NVDECFrame*)fdd->hwaccel_priv;
     NVDECDecoder *decoder = (NVDECDecoder*)cf->decoder_ref->data;
 
+    AVHWFramesContext *hwctx = (AVHWFramesContext *)frame->hw_frames_ctx->data;
+
     CUVIDPROCPARAMS vpp = { 0 };
     NVDECFrame *unmap_data = NULL;
 
-    CUresult err;
     CUcontext dummy;
     CUdeviceptr devptr;
 
     unsigned int pitch, i;
     unsigned int offset = 0;
+    int shift_h = 0, shift_v = 0;
     int ret = 0;
 
     vpp.progressive_frame = 1;
     vpp.output_stream = decoder->stream;
 
-    err = decoder->cudl->cuCtxPushCurrent(decoder->cuda_ctx);
-    if (err != CUDA_SUCCESS)
-        return AVERROR_UNKNOWN;
+    ret = CHECK_CU(decoder->cudl->cuCtxPushCurrent(decoder->cuda_ctx));
+    if (ret < 0)
+        return ret;
 
-    err = decoder->cvdl->cuvidMapVideoFrame(decoder->decoder, cf->idx, &devptr,
-                                            &pitch, &vpp);
-    if (err != CUDA_SUCCESS) {
-        av_log(logctx, AV_LOG_ERROR, "Error mapping a picture with CUVID: %d\n",
-               err);
-        ret = AVERROR_UNKNOWN;
+    ret = CHECK_CU(decoder->cvdl->cuvidMapVideoFrame(decoder->decoder,
+                                                     cf->idx, &devptr,
+                                                     &pitch, &vpp));
+    if (ret < 0)
         goto finish;
-    }
 
     unmap_data = av_mallocz(sizeof(*unmap_data));
     if (!unmap_data) {
@@ -429,28 +514,36 @@
         goto copy_fail;
     }
 
+    av_buffer_unref(&frame->hw_frames_ctx);
+    frame->hw_frames_ctx = av_buffer_ref(decoder->real_hw_frames_ref);
+    if (!frame->hw_frames_ctx) {
+        ret = AVERROR(ENOMEM);
+        goto copy_fail;
+    }
+
     unmap_data->idx = cf->idx;
     unmap_data->idx_ref = av_buffer_ref(cf->idx_ref);
     unmap_data->decoder_ref = av_buffer_ref(cf->decoder_ref);
 
+    av_pix_fmt_get_chroma_sub_sample(hwctx->sw_format, &shift_h, &shift_v);
     for (i = 0; frame->linesize[i]; i++) {
         frame->data[i] = (uint8_t*)(devptr + offset);
         frame->linesize[i] = pitch;
-        offset += pitch * (frame->height >> (i ? 1 : 0));
+        offset += pitch * (frame->height >> (i ? shift_v : 0));
     }
 
     goto finish;
 
 copy_fail:
     if (!frame->buf[1]) {
-        decoder->cvdl->cuvidUnmapVideoFrame(decoder->decoder, devptr);
+        CHECK_CU(decoder->cvdl->cuvidUnmapVideoFrame(decoder->decoder, devptr));
         av_freep(&unmap_data);
     } else {
         av_buffer_unref(&frame->buf[1]);
     }
 
 finish:
-    decoder->cudl->cuCtxPopCurrent(&dummy);
+    CHECK_CU(decoder->cudl->cuCtxPopCurrent(&dummy));
     return ret;
 }
 
@@ -500,9 +593,9 @@
 {
     NVDECContext     *ctx = avctx->internal->hwaccel_priv_data;
     NVDECDecoder *decoder = (NVDECDecoder*)ctx->decoder_ref->data;
+    void *logctx          = avctx;
     CUVIDPICPARAMS    *pp = &ctx->pic_params;
 
-    CUresult err;
     CUcontext dummy;
 
     int ret = 0;
@@ -512,20 +605,16 @@
     pp->nNumSlices        = ctx->nb_slices;
     pp->pSliceDataOffsets = ctx->slice_offsets;
 
-    err = decoder->cudl->cuCtxPushCurrent(decoder->cuda_ctx);
-    if (err != CUDA_SUCCESS)
-        return AVERROR_UNKNOWN;
+    ret = CHECK_CU(decoder->cudl->cuCtxPushCurrent(decoder->cuda_ctx));
+    if (ret < 0)
+        return ret;
 
-    err = decoder->cvdl->cuvidDecodePicture(decoder->decoder, &ctx->pic_params);
-    if (err != CUDA_SUCCESS) {
-        av_log(avctx, AV_LOG_ERROR, "Error decoding a picture with NVDEC: %d\n",
-               err);
-        ret = AVERROR_UNKNOWN;
+    ret = CHECK_CU(decoder->cvdl->cuvidDecodePicture(decoder->decoder, &ctx->pic_params));
+    if (ret < 0)
         goto finish;
-    }
 
 finish:
-    decoder->cudl->cuCtxPopCurrent(&dummy);
+    CHECK_CU(decoder->cudl->cuCtxPopCurrent(&dummy));
 
     return ret;
 }
@@ -560,23 +649,14 @@
     return 0;
 }
 
-static void nvdec_free_dummy(struct AVHWFramesContext *ctx)
-{
-    av_buffer_pool_uninit(&ctx->pool);
-}
-
-static AVBufferRef *nvdec_alloc_dummy(int size)
-{
-    return av_buffer_create(NULL, 0, NULL, NULL, 0);
-}
-
 int ff_nvdec_frame_params(AVCodecContext *avctx,
                           AVBufferRef *hw_frames_ctx,
-                          int dpb_size)
+                          int dpb_size,
+                          int supports_444)
 {
     AVHWFramesContext *frames_ctx = (AVHWFramesContext*)hw_frames_ctx->data;
     const AVPixFmtDescriptor *sw_desc;
-    int cuvid_codec_type, cuvid_chroma_format;
+    int cuvid_codec_type, cuvid_chroma_format, chroma_444;
 
     sw_desc = av_pix_fmt_desc_get(avctx->sw_pix_fmt);
     if (!sw_desc)
@@ -593,27 +673,26 @@
         av_log(avctx, AV_LOG_VERBOSE, "Unsupported chroma format\n");
         return AVERROR(EINVAL);
     }
+    chroma_444 = supports_444 && cuvid_chroma_format == cudaVideoChromaFormat_444;
 
     frames_ctx->format            = AV_PIX_FMT_CUDA;
     frames_ctx->width             = (avctx->coded_width + 1) & ~1;
     frames_ctx->height            = (avctx->coded_height + 1) & ~1;
-    frames_ctx->initial_pool_size = dpb_size;
-
-    frames_ctx->free = nvdec_free_dummy;
-    frames_ctx->pool = av_buffer_pool_init(0, nvdec_alloc_dummy);
-
-    if (!frames_ctx->pool)
-        return AVERROR(ENOMEM);
+    /*
+     * We add two extra frames to the pool to account for deinterlacing filters
+     * holding onto their frames.
+     */
+    frames_ctx->initial_pool_size = dpb_size + 2;
 
     switch (sw_desc->comp[0].depth) {
     case 8:
-        frames_ctx->sw_format = AV_PIX_FMT_NV12;
+        frames_ctx->sw_format = chroma_444 ? AV_PIX_FMT_YUV444P : AV_PIX_FMT_NV12;
         break;
     case 10:
-        frames_ctx->sw_format = AV_PIX_FMT_P010;
+        frames_ctx->sw_format = chroma_444 ? AV_PIX_FMT_YUV444P16 : AV_PIX_FMT_P010;
         break;
     case 12:
-        frames_ctx->sw_format = AV_PIX_FMT_P016;
+        frames_ctx->sw_format = chroma_444 ? AV_PIX_FMT_YUV444P16 : AV_PIX_FMT_P016;
         break;
     default:
         return AVERROR(EINVAL);
diff --git a/libavcodec/nvdec.h b/libavcodec/nvdec.h
index 85a0fcf..09ae8c3 100644
--- a/libavcodec/nvdec.h
+++ b/libavcodec/nvdec.h
@@ -61,6 +61,8 @@
     unsigned     *slice_offsets;
     int           nb_slices;
     unsigned int  slice_offsets_allocated;
+
+    int           supports_444;
 } NVDECContext;
 
 int ff_nvdec_decode_init(AVCodecContext *avctx);
@@ -72,7 +74,8 @@
                                  uint32_t size);
 int ff_nvdec_frame_params(AVCodecContext *avctx,
                           AVBufferRef *hw_frames_ctx,
-                          int dpb_size);
+                          int dpb_size,
+                          int supports_444);
 int ff_nvdec_get_ref_idx(AVFrame *frame);
 
 #endif /* AVCODEC_NVDEC_H */
diff --git a/libavcodec/nvdec_h264.c b/libavcodec/nvdec_h264.c
index 25b3032..116bd4f 100644
--- a/libavcodec/nvdec_h264.c
+++ b/libavcodec/nvdec_h264.c
@@ -166,7 +166,7 @@
 {
     const H264Context *h = avctx->priv_data;
     const SPS       *sps = h->ps.sps;
-    return ff_nvdec_frame_params(avctx, hw_frames_ctx, sps->ref_frame_count + sps->num_reorder_frames);
+    return ff_nvdec_frame_params(avctx, hw_frames_ctx, sps->ref_frame_count + sps->num_reorder_frames, 0);
 }
 
 const AVHWAccel ff_h264_nvdec_hwaccel = {
diff --git a/libavcodec/nvdec_hevc.c b/libavcodec/nvdec_hevc.c
index e04a701..590278b 100644
--- a/libavcodec/nvdec_hevc.c
+++ b/libavcodec/nvdec_hevc.c
@@ -131,6 +131,17 @@
             .IdrPicFlag                                   = IS_IDR(s),
             .bit_depth_luma_minus8                        = sps->bit_depth - 8,
             .bit_depth_chroma_minus8                      = sps->bit_depth - 8,
+#if NVDECAPI_CHECK_VERSION(9, 0)
+            .sps_range_extension_flag                     = sps->sps_range_extension_flag,
+            .transform_skip_rotation_enabled_flag         = sps->transform_skip_rotation_enabled_flag,
+            .transform_skip_context_enabled_flag          = sps->transform_skip_context_enabled_flag,
+            .implicit_rdpcm_enabled_flag                  = sps->implicit_rdpcm_enabled_flag,
+            .explicit_rdpcm_enabled_flag                  = sps->explicit_rdpcm_enabled_flag,
+            .extended_precision_processing_flag           = sps->extended_precision_processing_flag,
+            .intra_smoothing_disabled_flag                = sps->intra_smoothing_disabled_flag,
+            .persistent_rice_adaptation_enabled_flag      = sps->persistent_rice_adaptation_enabled_flag,
+            .cabac_bypass_alignment_enabled_flag          = sps->cabac_bypass_alignment_enabled_flag,
+#endif
 
             .dependent_slice_segments_enabled_flag        = pps->dependent_slice_segments_enabled_flag,
             .slice_segment_header_extension_present_flag  = pps->slice_header_extension_present_flag,
@@ -164,6 +175,13 @@
             .uniform_spacing_flag                         = pps->uniform_spacing_flag,
             .num_tile_columns_minus1                      = pps->num_tile_columns - 1,
             .num_tile_rows_minus1                         = pps->num_tile_rows - 1,
+#if NVDECAPI_CHECK_VERSION(9, 0)
+            .pps_range_extension_flag                     = pps->pps_range_extensions_flag,
+            .cross_component_prediction_enabled_flag      = pps->cross_component_prediction_enabled_flag,
+            .chroma_qp_offset_list_enabled_flag           = pps->chroma_qp_offset_list_enabled_flag,
+            .diff_cu_chroma_qp_offset_depth               = pps->diff_cu_chroma_qp_offset_depth,
+            .chroma_qp_offset_list_len_minus1             = pps->chroma_qp_offset_list_len_minus1,
+#endif
 
             .NumBitsForShortTermRPSInSlice                = s->sh.short_term_rps ? s->sh.short_term_ref_pic_set_size : 0,
             .NumDeltaPocsOfRefRpsIdx                      = s->sh.short_term_rps ? s->sh.short_term_rps->rps_idx_num_delta_pocs : 0,
@@ -185,6 +203,18 @@
     for (i = 0; i < pps->num_tile_rows; i++)
         ppc->row_height_minus1[i] = pps->row_height[i] - 1;
 
+#if NVDECAPI_CHECK_VERSION(9, 0)
+    if (pps->chroma_qp_offset_list_len_minus1 > FF_ARRAY_ELEMS(ppc->cb_qp_offset_list) ||
+        pps->chroma_qp_offset_list_len_minus1 > FF_ARRAY_ELEMS(ppc->cr_qp_offset_list)) {
+        av_log(avctx, AV_LOG_ERROR, "Too many chroma_qp_offsets\n");
+        return AVERROR(ENOSYS);
+    }
+    for (i = 0; i <= pps->chroma_qp_offset_list_len_minus1; i++) {
+        ppc->cb_qp_offset_list[i] = pps->cb_qp_offset_list[i];
+        ppc->cr_qp_offset_list[i] = pps->cr_qp_offset_list[i];
+    }
+#endif
+
     if (s->rps[LT_CURR].nb_refs     > FF_ARRAY_ELEMS(ppc->RefPicSetLtCurr)       ||
         s->rps[ST_CURR_BEF].nb_refs > FF_ARRAY_ELEMS(ppc->RefPicSetStCurrBefore) ||
         s->rps[ST_CURR_AFT].nb_refs > FF_ARRAY_ELEMS(ppc->RefPicSetStCurrAfter)) {
@@ -269,7 +299,13 @@
 {
     const HEVCContext *s = avctx->priv_data;
     const HEVCSPS *sps = s->ps.sps;
-    return ff_nvdec_frame_params(avctx, hw_frames_ctx, sps->temporal_layer[sps->max_sub_layers - 1].max_dec_pic_buffering + 1);
+    return ff_nvdec_frame_params(avctx, hw_frames_ctx, sps->temporal_layer[sps->max_sub_layers - 1].max_dec_pic_buffering + 1, 1);
+}
+
+static int nvdec_hevc_decode_init(AVCodecContext *avctx) {
+    NVDECContext *ctx = avctx->internal->hwaccel_priv_data;
+    ctx->supports_444 = 1;
+    return ff_nvdec_decode_init(avctx);
 }
 
 const AVHWAccel ff_hevc_nvdec_hwaccel = {
@@ -281,7 +317,7 @@
     .end_frame            = ff_nvdec_end_frame,
     .decode_slice         = nvdec_hevc_decode_slice,
     .frame_params         = nvdec_hevc_frame_params,
-    .init                 = ff_nvdec_decode_init,
+    .init                 = nvdec_hevc_decode_init,
     .uninit               = ff_nvdec_decode_uninit,
     .priv_data_size       = sizeof(NVDECContext),
 };
diff --git a/libavcodec/nvdec_mjpeg.c b/libavcodec/nvdec_mjpeg.c
index 7e40424..be39d23 100644
--- a/libavcodec/nvdec_mjpeg.c
+++ b/libavcodec/nvdec_mjpeg.c
@@ -66,7 +66,7 @@
                                   AVBufferRef *hw_frames_ctx)
 {
     // Only need storage for the current frame
-    return ff_nvdec_frame_params(avctx, hw_frames_ctx, 1);
+    return ff_nvdec_frame_params(avctx, hw_frames_ctx, 1, 0);
 }
 
 #if CONFIG_MJPEG_NVDEC_HWACCEL
diff --git a/libavcodec/nvdec_mpeg12.c b/libavcodec/nvdec_mpeg12.c
index 7293d50..9a9030d 100644
--- a/libavcodec/nvdec_mpeg12.c
+++ b/libavcodec/nvdec_mpeg12.c
@@ -50,6 +50,10 @@
         .FrameHeightInMbs  = (cur_frame->height + 15) / 16,
         .CurrPicIdx        = cf->idx,
 
+        .field_pic_flag    = s->picture_structure != PICT_FRAME,
+        .bottom_field_flag = s->picture_structure == PICT_BOTTOM_FIELD,
+        .second_field      = s->picture_structure != PICT_FRAME && !s->first_field,
+
         .intra_pic_flag    = s->pict_type == AV_PICTURE_TYPE_I,
         .ref_pic_flag      = s->pict_type == AV_PICTURE_TYPE_I ||
                              s->pict_type == AV_PICTURE_TYPE_P,
@@ -87,7 +91,7 @@
                                   AVBufferRef *hw_frames_ctx)
 {
     // Each frame can at most have one P and one B reference
-    return ff_nvdec_frame_params(avctx, hw_frames_ctx, 2);
+    return ff_nvdec_frame_params(avctx, hw_frames_ctx, 2, 0);
 }
 
 #if CONFIG_MPEG2_NVDEC_HWACCEL
diff --git a/libavcodec/nvdec_mpeg4.c b/libavcodec/nvdec_mpeg4.c
index 907af13..739b049 100644
--- a/libavcodec/nvdec_mpeg4.c
+++ b/libavcodec/nvdec_mpeg4.c
@@ -103,7 +103,7 @@
                                   AVBufferRef *hw_frames_ctx)
 {
     // Each frame can at most have one P and one B reference
-    return ff_nvdec_frame_params(avctx, hw_frames_ctx, 2);
+    return ff_nvdec_frame_params(avctx, hw_frames_ctx, 2, 0);
 }
 
 const AVHWAccel ff_mpeg4_nvdec_hwaccel = {
diff --git a/libavcodec/nvdec_vc1.c b/libavcodec/nvdec_vc1.c
index 7257692..10e7b5a 100644
--- a/libavcodec/nvdec_vc1.c
+++ b/libavcodec/nvdec_vc1.c
@@ -107,7 +107,7 @@
                                   AVBufferRef *hw_frames_ctx)
 {
     // Each frame can at most have one P and one B reference
-    return ff_nvdec_frame_params(avctx, hw_frames_ctx, 2);
+    return ff_nvdec_frame_params(avctx, hw_frames_ctx, 2, 0);
 }
 
 const AVHWAccel ff_vc1_nvdec_hwaccel = {
diff --git a/libavcodec/nvdec_vp8.c b/libavcodec/nvdec_vp8.c
index 7b37445..9c4608d 100644
--- a/libavcodec/nvdec_vp8.c
+++ b/libavcodec/nvdec_vp8.c
@@ -87,7 +87,7 @@
                                   AVBufferRef *hw_frames_ctx)
 {
     // VP8 uses a fixed size pool of 3 possible reference frames
-    return ff_nvdec_frame_params(avctx, hw_frames_ctx, 3);
+    return ff_nvdec_frame_params(avctx, hw_frames_ctx, 3, 0);
 }
 
 AVHWAccel ff_vp8_nvdec_hwaccel = {
diff --git a/libavcodec/nvdec_vp9.c b/libavcodec/nvdec_vp9.c
index 3b665a9..a76bcf9 100644
--- a/libavcodec/nvdec_vp9.c
+++ b/libavcodec/nvdec_vp9.c
@@ -166,7 +166,7 @@
                                   AVBufferRef *hw_frames_ctx)
 {
     // VP9 uses a fixed size pool of 8 possible reference frames
-    return ff_nvdec_frame_params(avctx, hw_frames_ctx, 8);
+    return ff_nvdec_frame_params(avctx, hw_frames_ctx, 8, 0);
 }
 
 const AVHWAccel ff_vp9_nvdec_hwaccel = {
diff --git a/libavcodec/nvenc.c b/libavcodec/nvenc.c
index e180d7b..9a96bf2 100644
--- a/libavcodec/nvenc.c
+++ b/libavcodec/nvenc.c
@@ -25,12 +25,15 @@
 
 #include "libavutil/hwcontext_cuda.h"
 #include "libavutil/hwcontext.h"
+#include "libavutil/cuda_check.h"
 #include "libavutil/imgutils.h"
 #include "libavutil/avassert.h"
 #include "libavutil/mem.h"
 #include "libavutil/pixdesc.h"
 #include "internal.h"
 
+#define CHECK_CU(x) FF_CUDA_CHECK_DL(avctx, dl_fn->cuda_dl, x)
+
 #define NVENC_CAP 0x30
 #define IS_CBR(rc) (rc == NV_ENC_PARAMS_RC_CBR ||             \
                     rc == NV_ENC_PARAMS_RC_CBR_LOWDELAY_HQ || \
@@ -107,19 +110,49 @@
     return AVERROR_UNKNOWN;
 }
 
-static int nvenc_print_error(void *log_ctx, NVENCSTATUS err,
+static int nvenc_print_error(AVCodecContext *avctx, NVENCSTATUS err,
                              const char *error_string)
 {
     const char *desc;
-    int ret;
-    ret = nvenc_map_error(err, &desc);
-    av_log(log_ctx, AV_LOG_ERROR, "%s: %s (%d)\n", error_string, desc, err);
+    const char *details = "(no details)";
+    int ret = nvenc_map_error(err, &desc);
+
+#ifdef NVENC_HAVE_GETLASTERRORSTRING
+    NvencContext *ctx = avctx->priv_data;
+    NV_ENCODE_API_FUNCTION_LIST *p_nvenc = &ctx->nvenc_dload_funcs.nvenc_funcs;
+
+    if (p_nvenc && ctx->nvencoder)
+        details = p_nvenc->nvEncGetLastErrorString(ctx->nvencoder);
+#endif
+
+    av_log(avctx, AV_LOG_ERROR, "%s: %s (%d): %s\n", error_string, desc, err, details);
+
     return ret;
 }
 
 static void nvenc_print_driver_requirement(AVCodecContext *avctx, int level)
 {
-#if NVENCAPI_CHECK_VERSION(8, 1)
+#if NVENCAPI_CHECK_VERSION(9, 2)
+    const char *minver = "(unknown)";
+#elif NVENCAPI_CHECK_VERSION(9, 1)
+# if defined(_WIN32) || defined(__CYGWIN__)
+    const char *minver = "436.15";
+# else
+    const char *minver = "435.21";
+# endif
+#elif NVENCAPI_CHECK_VERSION(9, 0)
+# if defined(_WIN32) || defined(__CYGWIN__)
+    const char *minver = "418.81";
+# else
+    const char *minver = "418.30";
+# endif
+#elif NVENCAPI_CHECK_VERSION(8, 2)
+# if defined(_WIN32) || defined(__CYGWIN__)
+    const char *minver = "397.93";
+# else
+    const char *minver = "396.24";
+#endif
+#elif NVENCAPI_CHECK_VERSION(8, 1)
 # if defined(_WIN32) || defined(__CYGWIN__)
     const char *minver = "390.77";
 # else
@@ -183,37 +216,23 @@
 {
     NvencContext *ctx            = avctx->priv_data;
     NvencDynLoadFunctions *dl_fn = &ctx->nvenc_dload_funcs;
-    CUresult cu_res;
 
     if (ctx->d3d11_device)
         return 0;
 
-    cu_res = dl_fn->cuda_dl->cuCtxPushCurrent(ctx->cu_context);
-    if (cu_res != CUDA_SUCCESS) {
-        av_log(avctx, AV_LOG_ERROR, "cuCtxPushCurrent failed\n");
-        return AVERROR_EXTERNAL;
-    }
-
-    return 0;
+    return CHECK_CU(dl_fn->cuda_dl->cuCtxPushCurrent(ctx->cu_context));
 }
 
 static int nvenc_pop_context(AVCodecContext *avctx)
 {
     NvencContext *ctx            = avctx->priv_data;
     NvencDynLoadFunctions *dl_fn = &ctx->nvenc_dload_funcs;
-    CUresult cu_res;
     CUcontext dummy;
 
     if (ctx->d3d11_device)
         return 0;
 
-    cu_res = dl_fn->cuda_dl->cuCtxPopCurrent(&dummy);
-    if (cu_res != CUDA_SUCCESS) {
-        av_log(avctx, AV_LOG_ERROR, "cuCtxPopCurrent failed\n");
-        return AVERROR_EXTERNAL;
-    }
-
-    return 0;
+    return CHECK_CU(dl_fn->cuda_dl->cuCtxPopCurrent(&dummy));
 }
 
 static av_cold int nvenc_open_session(AVCodecContext *avctx)
@@ -302,39 +321,39 @@
 
     ret = nvenc_check_codec_support(avctx);
     if (ret < 0) {
-        av_log(avctx, AV_LOG_VERBOSE, "Codec not supported\n");
+        av_log(avctx, AV_LOG_WARNING, "Codec not supported\n");
         return ret;
     }
 
     ret = nvenc_check_cap(avctx, NV_ENC_CAPS_SUPPORT_YUV444_ENCODE);
     if (IS_YUV444(ctx->data_pix_fmt) && ret <= 0) {
-        av_log(avctx, AV_LOG_VERBOSE, "YUV444P not supported\n");
+        av_log(avctx, AV_LOG_WARNING, "YUV444P not supported\n");
         return AVERROR(ENOSYS);
     }
 
     ret = nvenc_check_cap(avctx, NV_ENC_CAPS_SUPPORT_LOSSLESS_ENCODE);
     if (ctx->preset >= PRESET_LOSSLESS_DEFAULT && ret <= 0) {
-        av_log(avctx, AV_LOG_VERBOSE, "Lossless encoding not supported\n");
+        av_log(avctx, AV_LOG_WARNING, "Lossless encoding not supported\n");
         return AVERROR(ENOSYS);
     }
 
     ret = nvenc_check_cap(avctx, NV_ENC_CAPS_WIDTH_MAX);
     if (ret < avctx->width) {
-        av_log(avctx, AV_LOG_VERBOSE, "Width %d exceeds %d\n",
+        av_log(avctx, AV_LOG_WARNING, "Width %d exceeds %d\n",
                avctx->width, ret);
         return AVERROR(ENOSYS);
     }
 
     ret = nvenc_check_cap(avctx, NV_ENC_CAPS_HEIGHT_MAX);
     if (ret < avctx->height) {
-        av_log(avctx, AV_LOG_VERBOSE, "Height %d exceeds %d\n",
+        av_log(avctx, AV_LOG_WARNING, "Height %d exceeds %d\n",
                avctx->height, ret);
         return AVERROR(ENOSYS);
     }
 
     ret = nvenc_check_cap(avctx, NV_ENC_CAPS_NUM_MAX_BFRAMES);
     if (ret < avctx->max_b_frames) {
-        av_log(avctx, AV_LOG_VERBOSE, "Max B-frames %d exceed %d\n",
+        av_log(avctx, AV_LOG_WARNING, "Max B-frames %d exceed %d\n",
                avctx->max_b_frames, ret);
 
         return AVERROR(ENOSYS);
@@ -342,7 +361,7 @@
 
     ret = nvenc_check_cap(avctx, NV_ENC_CAPS_SUPPORT_FIELD_ENCODING);
     if (ret < 1 && avctx->flags & AV_CODEC_FLAG_INTERLACED_DCT) {
-        av_log(avctx, AV_LOG_VERBOSE,
+        av_log(avctx, AV_LOG_WARNING,
                "Interlaced encoding is not supported. Supported level: %d\n",
                ret);
         return AVERROR(ENOSYS);
@@ -350,46 +369,59 @@
 
     ret = nvenc_check_cap(avctx, NV_ENC_CAPS_SUPPORT_10BIT_ENCODE);
     if (IS_10BIT(ctx->data_pix_fmt) && ret <= 0) {
-        av_log(avctx, AV_LOG_VERBOSE, "10 bit encode not supported\n");
+        av_log(avctx, AV_LOG_WARNING, "10 bit encode not supported\n");
         return AVERROR(ENOSYS);
     }
 
     ret = nvenc_check_cap(avctx, NV_ENC_CAPS_SUPPORT_LOOKAHEAD);
     if (ctx->rc_lookahead > 0 && ret <= 0) {
-        av_log(avctx, AV_LOG_VERBOSE, "RC lookahead not supported\n");
+        av_log(avctx, AV_LOG_WARNING, "RC lookahead not supported\n");
         return AVERROR(ENOSYS);
     }
 
     ret = nvenc_check_cap(avctx, NV_ENC_CAPS_SUPPORT_TEMPORAL_AQ);
     if (ctx->temporal_aq > 0 && ret <= 0) {
-        av_log(avctx, AV_LOG_VERBOSE, "Temporal AQ not supported\n");
+        av_log(avctx, AV_LOG_WARNING, "Temporal AQ not supported\n");
         return AVERROR(ENOSYS);
     }
 
     ret = nvenc_check_cap(avctx, NV_ENC_CAPS_SUPPORT_WEIGHTED_PREDICTION);
     if (ctx->weighted_pred > 0 && ret <= 0) {
-        av_log (avctx, AV_LOG_VERBOSE, "Weighted Prediction not supported\n");
+        av_log (avctx, AV_LOG_WARNING, "Weighted Prediction not supported\n");
         return AVERROR(ENOSYS);
     }
 
     ret = nvenc_check_cap(avctx, NV_ENC_CAPS_SUPPORT_CABAC);
     if (ctx->coder == NV_ENC_H264_ENTROPY_CODING_MODE_CABAC && ret <= 0) {
-        av_log(avctx, AV_LOG_VERBOSE, "CABAC entropy coding not supported\n");
+        av_log(avctx, AV_LOG_WARNING, "CABAC entropy coding not supported\n");
         return AVERROR(ENOSYS);
     }
 
 #ifdef NVENC_HAVE_BFRAME_REF_MODE
     ret = nvenc_check_cap(avctx, NV_ENC_CAPS_SUPPORT_BFRAME_REF_MODE);
     if (ctx->b_ref_mode == NV_ENC_BFRAME_REF_MODE_EACH && ret != 1) {
-        av_log(avctx, AV_LOG_VERBOSE, "Each B frame as reference is not supported\n");
+        av_log(avctx, AV_LOG_WARNING, "Each B frame as reference is not supported\n");
         return AVERROR(ENOSYS);
     } else if (ctx->b_ref_mode != NV_ENC_BFRAME_REF_MODE_DISABLED && ret == 0) {
-        av_log(avctx, AV_LOG_VERBOSE, "B frames as references are not supported\n");
+        av_log(avctx, AV_LOG_WARNING, "B frames as references are not supported\n");
         return AVERROR(ENOSYS);
     }
 #else
     if (ctx->b_ref_mode != 0) {
-        av_log(avctx, AV_LOG_VERBOSE, "B frames as references need SDK 8.1 at build time\n");
+        av_log(avctx, AV_LOG_WARNING, "B frames as references need SDK 8.1 at build time\n");
+        return AVERROR(ENOSYS);
+    }
+#endif
+
+#ifdef NVENC_HAVE_MULTIPLE_REF_FRAMES
+    ret = nvenc_check_cap(avctx, NV_ENC_CAPS_SUPPORT_MULTIPLE_REF_FRAMES);
+    if(avctx->refs != NV_ENC_NUM_REF_FRAMES_AUTOSELECT && ret <= 0) {
+        av_log(avctx, AV_LOG_WARNING, "Multiple reference frames are not supported by the device\n");
+        return AVERROR(ENOSYS);
+    }
+#else
+    if(avctx->refs != 0) {
+        av_log(avctx, AV_LOG_WARNING, "Multiple reference frames need SDK 9.1 at build time\n");
         return AVERROR(ENOSYS);
     }
 #endif
@@ -406,32 +438,23 @@
     NV_ENCODE_API_FUNCTION_LIST *p_nvenc = &dl_fn->nvenc_funcs;
     char name[128] = { 0};
     int major, minor, ret;
-    CUresult cu_res;
     CUdevice cu_device;
     int loglevel = AV_LOG_VERBOSE;
 
     if (ctx->device == LIST_DEVICES)
         loglevel = AV_LOG_INFO;
 
-    cu_res = dl_fn->cuda_dl->cuDeviceGet(&cu_device, idx);
-    if (cu_res != CUDA_SUCCESS) {
-        av_log(avctx, AV_LOG_ERROR,
-               "Cannot access the CUDA device %d\n",
-               idx);
-        return -1;
-    }
+    ret = CHECK_CU(dl_fn->cuda_dl->cuDeviceGet(&cu_device, idx));
+    if (ret < 0)
+        return ret;
 
-    cu_res = dl_fn->cuda_dl->cuDeviceGetName(name, sizeof(name), cu_device);
-    if (cu_res != CUDA_SUCCESS) {
-        av_log(avctx, AV_LOG_ERROR, "cuDeviceGetName failed on device %d\n", idx);
-        return -1;
-    }
+    ret = CHECK_CU(dl_fn->cuda_dl->cuDeviceGetName(name, sizeof(name), cu_device));
+    if (ret < 0)
+        return ret;
 
-    cu_res = dl_fn->cuda_dl->cuDeviceComputeCapability(&major, &minor, cu_device);
-    if (cu_res != CUDA_SUCCESS) {
-        av_log(avctx, AV_LOG_ERROR, "cuDeviceComputeCapability failed on device %d\n", idx);
-        return -1;
-    }
+    ret = CHECK_CU(dl_fn->cuda_dl->cuDeviceComputeCapability(&major, &minor, cu_device));
+    if (ret < 0)
+        return ret;
 
     av_log(avctx, loglevel, "[ GPU #%d - < %s > has Compute SM %d.%d ]\n", idx, name, major, minor);
     if (((major << 4) | minor) < NVENC_CAP) {
@@ -442,13 +465,12 @@
     if (ctx->device != idx && ctx->device != ANY_DEVICE)
         return -1;
 
-    cu_res = dl_fn->cuda_dl->cuCtxCreate(&ctx->cu_context_internal, 0, cu_device);
-    if (cu_res != CUDA_SUCCESS) {
-        av_log(avctx, AV_LOG_FATAL, "Failed creating CUDA context for NVENC: 0x%x\n", (int)cu_res);
+    ret = CHECK_CU(dl_fn->cuda_dl->cuCtxCreate(&ctx->cu_context_internal, 0, cu_device));
+    if (ret < 0)
         goto fail;
-    }
 
     ctx->cu_context = ctx->cu_context_internal;
+    ctx->cu_stream = NULL;
 
     if ((ret = nvenc_pop_context(avctx)) < 0)
         goto fail2;
@@ -477,7 +499,7 @@
         return ret;
 
 fail2:
-    dl_fn->cuda_dl->cuCtxDestroy(ctx->cu_context_internal);
+    CHECK_CU(dl_fn->cuda_dl->cuCtxDestroy(ctx->cu_context_internal));
     ctx->cu_context_internal = NULL;
 
 fail:
@@ -535,6 +557,7 @@
 
         if (cuda_device_hwctx) {
             ctx->cu_context = cuda_device_hwctx->cuda_ctx;
+            ctx->cu_stream = cuda_device_hwctx->stream;
         }
 #if CONFIG_D3D11VA
         else if (d3d11_device_hwctx) {
@@ -555,17 +578,11 @@
     } else {
         int i, nb_devices = 0;
 
-        if ((dl_fn->cuda_dl->cuInit(0)) != CUDA_SUCCESS) {
-            av_log(avctx, AV_LOG_ERROR,
-                   "Cannot init CUDA\n");
+        if (CHECK_CU(dl_fn->cuda_dl->cuInit(0)) < 0)
             return AVERROR_UNKNOWN;
-        }
 
-        if ((dl_fn->cuda_dl->cuDeviceGetCount(&nb_devices)) != CUDA_SUCCESS) {
-            av_log(avctx, AV_LOG_ERROR,
-                   "Cannot enumerate the CUDA devices\n");
+        if (CHECK_CU(dl_fn->cuda_dl->cuDeviceGetCount(&nb_devices)) < 0)
             return AVERROR_UNKNOWN;
-        }
 
         if (!nb_devices) {
             av_log(avctx, AV_LOG_FATAL, "No CUDA capable devices found\n");
@@ -584,7 +601,7 @@
             return AVERROR_EXIT;
 
         if (!dl_fn->nvenc_device_count) {
-            av_log(avctx, AV_LOG_FATAL, "No NVENC capable devices found\n");
+            av_log(avctx, AV_LOG_FATAL, "No capable devices found\n");
             return AVERROR_EXTERNAL;
         }
 
@@ -957,9 +974,9 @@
     h264->repeatSPSPPS  = (avctx->flags & AV_CODEC_FLAG_GLOBAL_HEADER) ? 0 : 1;
     h264->outputAUD     = ctx->aud;
 
-    if (avctx->refs >= 0) {
+    if (ctx->dpb_size >= 0) {
         /* 0 means "let the hardware decide" */
-        h264->maxNumRefFrames = avctx->refs;
+        h264->maxNumRefFrames = ctx->dpb_size;
     }
     if (avctx->gop_size >= 0) {
         h264->idrPeriod = cc->gopLength;
@@ -1018,6 +1035,11 @@
     h264->useBFramesAsRef = ctx->b_ref_mode;
 #endif
 
+#ifdef NVENC_HAVE_MULTIPLE_REF_FRAMES
+    h264->numRefL0 = avctx->refs;
+    h264->numRefL1 = avctx->refs;
+#endif
+
     return 0;
 }
 
@@ -1049,9 +1071,9 @@
     hevc->repeatSPSPPS  = (avctx->flags & AV_CODEC_FLAG_GLOBAL_HEADER) ? 0 : 1;
     hevc->outputAUD     = ctx->aud;
 
-    if (avctx->refs >= 0) {
+    if (ctx->dpb_size >= 0) {
         /* 0 means "let the hardware decide" */
-        hevc->maxNumRefFramesInDPB = avctx->refs;
+        hevc->maxNumRefFramesInDPB = ctx->dpb_size;
     }
     if (avctx->gop_size >= 0) {
         hevc->idrPeriod = cc->gopLength;
@@ -1098,6 +1120,15 @@
 
     hevc->tier = ctx->tier;
 
+#ifdef NVENC_HAVE_HEVC_BFRAME_REF_MODE
+    hevc->useBFramesAsRef = ctx->b_ref_mode;
+#endif
+
+#ifdef NVENC_HAVE_MULTIPLE_REF_FRAMES
+    hevc->numRefL0 = avctx->refs;
+    hevc->numRefL1 = avctx->refs;
+#endif
+
     return 0;
 }
 
@@ -1179,7 +1210,7 @@
 
     if (ctx->bluray_compat) {
         ctx->aud = 1;
-        avctx->refs = FFMIN(FFMAX(avctx->refs, 0), 6);
+        ctx->dpb_size = FFMIN(FFMAX(avctx->refs, 0), 6);
         avctx->max_b_frames = FFMIN(avctx->max_b_frames, 3);
         switch (avctx->codec->id) {
         case AV_CODEC_ID_H264:
@@ -1226,15 +1257,25 @@
         return res;
 
     nv_status = p_nvenc->nvEncInitializeEncoder(ctx->nvencoder, &ctx->init_encode_params);
+    if (nv_status != NV_ENC_SUCCESS) {
+        nvenc_pop_context(avctx);
+        return nvenc_print_error(avctx, nv_status, "InitializeEncoder failed");
+    }
+
+#ifdef NVENC_HAVE_CUSTREAM_PTR
+    if (ctx->cu_context) {
+        nv_status = p_nvenc->nvEncSetIOCudaStreams(ctx->nvencoder, &ctx->cu_stream, &ctx->cu_stream);
+        if (nv_status != NV_ENC_SUCCESS) {
+            nvenc_pop_context(avctx);
+            return nvenc_print_error(avctx, nv_status, "SetIOCudaStreams failed");
+        }
+    }
+#endif
 
     res = nvenc_pop_context(avctx);
     if (res < 0)
         return res;
 
-    if (nv_status != NV_ENC_SUCCESS) {
-        return nvenc_print_error(avctx, nv_status, "InitializeEncoder failed");
-    }
-
     if (ctx->encode_config.frameIntervalP > 1)
         avctx->has_b_frames = 2;
 
@@ -1460,7 +1501,7 @@
     ctx->nvencoder = NULL;
 
     if (ctx->cu_context_internal)
-        dl_fn->cuda_dl->cuCtxDestroy(ctx->cu_context_internal);
+        CHECK_CU(dl_fn->cuda_dl->cuCtxDestroy(ctx->cu_context_internal));
     ctx->cu_context = ctx->cu_context_internal = NULL;
 
 #if CONFIG_D3D11VA
@@ -1572,19 +1613,23 @@
     NV_ENCODE_API_FUNCTION_LIST *p_nvenc = &dl_fn->nvenc_funcs;
     NVENCSTATUS nv_status;
 
-    int i;
+    int i, first_round;
 
     if (ctx->nb_registered_frames == FF_ARRAY_ELEMS(ctx->registered_frames)) {
-        for (i = 0; i < ctx->nb_registered_frames; i++) {
-            if (!ctx->registered_frames[i].mapped) {
-                if (ctx->registered_frames[i].regptr) {
-                    nv_status = p_nvenc->nvEncUnregisterResource(ctx->nvencoder, ctx->registered_frames[i].regptr);
-                    if (nv_status != NV_ENC_SUCCESS)
-                        return nvenc_print_error(avctx, nv_status, "Failed unregistering unused input resource");
-                    ctx->registered_frames[i].ptr = NULL;
-                    ctx->registered_frames[i].regptr = NULL;
+        for (first_round = 1; first_round >= 0; first_round--) {
+            for (i = 0; i < ctx->nb_registered_frames; i++) {
+                if (!ctx->registered_frames[i].mapped) {
+                    if (ctx->registered_frames[i].regptr) {
+                        if (first_round)
+                            continue;
+                        nv_status = p_nvenc->nvEncUnregisterResource(ctx->nvencoder, ctx->registered_frames[i].regptr);
+                        if (nv_status != NV_ENC_SUCCESS)
+                            return nvenc_print_error(avctx, nv_status, "Failed unregistering unused input resource");
+                        ctx->registered_frames[i].ptr = NULL;
+                        ctx->registered_frames[i].regptr = NULL;
+                    }
+                    return i;
                 }
-                return i;
             }
         }
     } else {
@@ -1836,7 +1881,11 @@
         goto error;
     }
 
-    if (res = ff_alloc_packet2(avctx, pkt, lock_params.bitstreamSizeInBytes,0)) {
+    res = pkt->data ?
+        ff_alloc_packet2(avctx, pkt, lock_params.bitstreamSizeInBytes, lock_params.bitstreamSizeInBytes) :
+        av_new_packet(pkt, lock_params.bitstreamSizeInBytes);
+
+    if (res < 0) {
         p_nvenc->nvEncUnlockBitstream(ctx->nvencoder, tmpoutsurf->output_surface);
         goto error;
     }
@@ -1858,13 +1907,6 @@
                 res = nvenc_print_error(avctx, nv_status, "Failed unmapping input resource");
                 goto error;
             }
-            nv_status = p_nvenc->nvEncUnregisterResource(ctx->nvencoder, ctx->registered_frames[tmpoutsurf->reg_idx].regptr);
-            if (nv_status != NV_ENC_SUCCESS) {
-                res = nvenc_print_error(avctx, nv_status, "Failed unregistering input resource");
-                goto error;
-            }
-            ctx->registered_frames[tmpoutsurf->reg_idx].ptr = NULL;
-            ctx->registered_frames[tmpoutsurf->reg_idx].regptr = NULL;
         } else if (ctx->registered_frames[tmpoutsurf->reg_idx].mapped < 0) {
             res = AVERROR_BUG;
             goto error;
@@ -2220,3 +2262,8 @@
 
     return 0;
 }
+
+av_cold void ff_nvenc_encode_flush(AVCodecContext *avctx)
+{
+    ff_nvenc_send_frame(avctx, NULL);
+}
diff --git a/libavcodec/nvenc.h b/libavcodec/nvenc.h
index ebb7a80..c44c81e 100644
--- a/libavcodec/nvenc.h
+++ b/libavcodec/nvenc.h
@@ -49,6 +49,18 @@
 #define NVENC_HAVE_QP_MAP_MODE
 #endif
 
+// SDK 9.0 compile time feature checks
+#if NVENCAPI_CHECK_VERSION(9, 0)
+#define NVENC_HAVE_HEVC_BFRAME_REF_MODE
+#endif
+
+// SDK 9.1 compile time feature checks
+#if NVENCAPI_CHECK_VERSION(9, 1)
+#define NVENC_HAVE_MULTIPLE_REF_FRAMES
+#define NVENC_HAVE_CUSTREAM_PTR
+#define NVENC_HAVE_GETLASTERRORSTRING
+#endif
+
 typedef struct NvencSurface
 {
     NV_ENC_INPUT_PTR input_surface;
@@ -122,6 +134,7 @@
     NV_ENC_CONFIG encode_config;
     CUcontext cu_context;
     CUcontext cu_context_internal;
+    CUstream cu_stream;
     ID3D11Device *d3d11_device;
 
     int nb_surfaces;
@@ -187,6 +200,7 @@
     int coder;
     int b_ref_mode;
     int a53_cc;
+    int dpb_size;
 } NvencContext;
 
 int ff_nvenc_encode_init(AVCodecContext *avctx);
@@ -200,6 +214,8 @@
 int ff_nvenc_encode_frame(AVCodecContext *avctx, AVPacket *pkt,
                           const AVFrame *frame, int *got_packet);
 
+void ff_nvenc_encode_flush(AVCodecContext *avctx);
+
 extern const enum AVPixelFormat ff_nvenc_pix_fmts[];
 
 #endif /* AVCODEC_NVENC_H */
diff --git a/libavcodec/nvenc_h264.c b/libavcodec/nvenc_h264.c
index a6623f5..c39f90f 100644
--- a/libavcodec/nvenc_h264.c
+++ b/libavcodec/nvenc_h264.c
@@ -138,6 +138,8 @@
     { "middle",       "",                                   0,                    AV_OPT_TYPE_CONST, { .i64 = 2 }, 0, 0,       VE, "b_ref_mode" },
 #endif
     { "a53cc",        "Use A53 Closed Captions (if available)", OFFSET(a53_cc),   AV_OPT_TYPE_BOOL,  { .i64 = 1 }, 0, 1, VE },
+    { "dpb_size",     "Specifies the DPB size used for encoding (0 means automatic)",
+                                                            OFFSET(dpb_size),     AV_OPT_TYPE_INT,   { .i64 = 0 }, 0, INT_MAX, VE },
     { NULL }
 };
 
@@ -180,10 +182,12 @@
     .receive_packet = ff_nvenc_receive_packet,
     .encode2        = ff_nvenc_encode_frame,
     .close          = ff_nvenc_encode_close,
+    .flush          = ff_nvenc_encode_flush,
     .priv_data_size = sizeof(NvencContext),
     .priv_class     = &nvenc_class,
     .defaults       = defaults,
-    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_HARDWARE,
+    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_HARDWARE |
+                      AV_CODEC_CAP_ENCODER_FLUSH,
     .caps_internal  = FF_CODEC_CAP_INIT_CLEANUP,
     .pix_fmts       = ff_nvenc_pix_fmts,
     .wrapper_name   = "nvenc",
@@ -209,10 +213,12 @@
     .receive_packet = ff_nvenc_receive_packet,
     .encode2        = ff_nvenc_encode_frame,
     .close          = ff_nvenc_encode_close,
+    .flush          = ff_nvenc_encode_flush,
     .priv_data_size = sizeof(NvencContext),
     .priv_class     = &nvenc_h264_class,
     .defaults       = defaults,
-    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_HARDWARE,
+    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_HARDWARE |
+                      AV_CODEC_CAP_ENCODER_FLUSH,
     .caps_internal  = FF_CODEC_CAP_INIT_CLEANUP,
     .pix_fmts       = ff_nvenc_pix_fmts,
     .wrapper_name   = "nvenc",
@@ -238,10 +244,12 @@
     .receive_packet = ff_nvenc_receive_packet,
     .encode2        = ff_nvenc_encode_frame,
     .close          = ff_nvenc_encode_close,
+    .flush          = ff_nvenc_encode_flush,
     .priv_data_size = sizeof(NvencContext),
     .priv_class     = &h264_nvenc_class,
     .defaults       = defaults,
-    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_HARDWARE,
+    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_HARDWARE |
+                      AV_CODEC_CAP_ENCODER_FLUSH,
     .caps_internal  = FF_CODEC_CAP_INIT_CLEANUP,
     .pix_fmts       = ff_nvenc_pix_fmts,
     .wrapper_name   = "nvenc",
diff --git a/libavcodec/nvenc_hevc.c b/libavcodec/nvenc_hevc.c
index 0df7eab..ea337a5 100644
--- a/libavcodec/nvenc_hevc.c
+++ b/libavcodec/nvenc_hevc.c
@@ -116,6 +116,19 @@
                                                             OFFSET(cqp),          AV_OPT_TYPE_INT,   { .i64 = -1 }, -1, 51, VE },
     { "weighted_pred","Set 1 to enable weighted prediction",
                                                             OFFSET(weighted_pred),AV_OPT_TYPE_INT,   { .i64 = 0 }, 0, 1, VE },
+#ifdef NVENC_HAVE_HEVC_BFRAME_REF_MODE
+    { "b_ref_mode",   "Use B frames as references",         OFFSET(b_ref_mode),   AV_OPT_TYPE_INT,   { .i64 = NV_ENC_BFRAME_REF_MODE_DISABLED }, NV_ENC_BFRAME_REF_MODE_DISABLED, NV_ENC_BFRAME_REF_MODE_MIDDLE, VE, "b_ref_mode" },
+    { "disabled",     "B frames will not be used for reference", 0,               AV_OPT_TYPE_CONST, { .i64 = NV_ENC_BFRAME_REF_MODE_DISABLED }, 0, 0, VE, "b_ref_mode" },
+    { "each",         "Each B frame will be used for reference", 0,               AV_OPT_TYPE_CONST, { .i64 = NV_ENC_BFRAME_REF_MODE_EACH }, 0, 0, VE, "b_ref_mode" },
+    { "middle",       "Only (number of B frames)/2 will be used for reference", 0,AV_OPT_TYPE_CONST, { .i64 = NV_ENC_BFRAME_REF_MODE_MIDDLE }, 0, 0, VE, "b_ref_mode" },
+#else
+    { "b_ref_mode",   "(not supported)",                    OFFSET(b_ref_mode),   AV_OPT_TYPE_INT,   { .i64 = 0 }, 0, INT_MAX, VE, "b_ref_mode" },
+    { "disabled",     "",                                   0,                    AV_OPT_TYPE_CONST, { .i64 = 0 }, 0, 0,       VE, "b_ref_mode" },
+    { "each",         "",                                   0,                    AV_OPT_TYPE_CONST, { .i64 = 1 }, 0, 0,       VE, "b_ref_mode" },
+    { "middle",       "",                                   0,                    AV_OPT_TYPE_CONST, { .i64 = 2 }, 0, 0,       VE, "b_ref_mode" },
+#endif
+    { "dpb_size",     "Specifies the DPB size used for encoding (0 means automatic)",
+                                                            OFFSET(dpb_size),     AV_OPT_TYPE_INT,   { .i64 = 0 }, 0, INT_MAX, VE },
     { NULL }
 };
 
@@ -161,7 +174,8 @@
     .priv_class     = &nvenc_hevc_class,
     .defaults       = defaults,
     .pix_fmts       = ff_nvenc_pix_fmts,
-    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_HARDWARE,
+    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_HARDWARE |
+                      AV_CODEC_CAP_ENCODER_FLUSH,
     .caps_internal  = FF_CODEC_CAP_INIT_CLEANUP,
     .wrapper_name   = "nvenc",
 };
@@ -185,11 +199,13 @@
     .receive_packet = ff_nvenc_receive_packet,
     .encode2        = ff_nvenc_encode_frame,
     .close          = ff_nvenc_encode_close,
+    .flush          = ff_nvenc_encode_flush,
     .priv_data_size = sizeof(NvencContext),
     .priv_class     = &hevc_nvenc_class,
     .defaults       = defaults,
     .pix_fmts       = ff_nvenc_pix_fmts,
-    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_HARDWARE,
+    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_HARDWARE |
+                      AV_CODEC_CAP_ENCODER_FLUSH,
     .caps_internal  = FF_CODEC_CAP_INIT_CLEANUP,
     .wrapper_name   = "nvenc",
 };
diff --git a/libavcodec/omx.c b/libavcodec/omx.c
index 466e0be..0a6a308 100644
--- a/libavcodec/omx.c
+++ b/libavcodec/omx.c
@@ -100,7 +100,7 @@
     if (libname2) {
         s->lib2 = dlopen(libname2, RTLD_NOW | RTLD_GLOBAL);
         if (!s->lib2) {
-            av_log(logctx, AV_LOG_WARNING, "%s not found\n", libname);
+            av_log(logctx, AV_LOG_WARNING, "%s not found\n", libname2);
             return AVERROR_ENCODER_NOT_FOUND;
         }
         s->host_init = dlsym(s->lib2, "bcm_host_init");
@@ -473,9 +473,9 @@
     in_port_params.format.video.nFrameWidth  = avctx->width;
     in_port_params.format.video.nFrameHeight = avctx->height;
     if (avctx->framerate.den > 0 && avctx->framerate.num > 0)
-        in_port_params.format.video.xFramerate = (1 << 16) * avctx->framerate.num / avctx->framerate.den;
+        in_port_params.format.video.xFramerate = (1LL << 16) * avctx->framerate.num / avctx->framerate.den;
     else
-        in_port_params.format.video.xFramerate = (1 << 16) * avctx->time_base.den / avctx->time_base.num;
+        in_port_params.format.video.xFramerate = (1LL << 16) * avctx->time_base.den / avctx->time_base.num;
 
     err = OMX_SetParameter(s->handle, OMX_IndexParamPortDefinition, &in_port_params);
     CHECK(err);
@@ -644,10 +644,6 @@
     OMX_BUFFERHEADERTYPE *buffer;
     OMX_ERRORTYPE err;
 
-#if CONFIG_OMX_RPI
-    s->input_zerocopy = 1;
-#endif
-
     s->omx_context = omx_init(avctx, s->libname, s->libprefix);
     if (!s->omx_context)
         return AVERROR_ENCODER_NOT_FOUND;
@@ -739,6 +735,7 @@
     int ret = 0;
     OMX_BUFFERHEADERTYPE* buffer;
     OMX_ERRORTYPE err;
+    int had_partial = 0;
 
     if (frame) {
         uint8_t *dst[4];
@@ -802,6 +799,26 @@
         // Convert the timestamps to microseconds; some encoders can ignore
         // the framerate and do VFR bit allocation based on timestamps.
         buffer->nTimeStamp = to_omx_ticks(av_rescale_q(frame->pts, avctx->time_base, AV_TIME_BASE_Q));
+        if (frame->pict_type == AV_PICTURE_TYPE_I) {
+#if CONFIG_OMX_RPI
+            OMX_CONFIG_BOOLEANTYPE config = {0, };
+            INIT_STRUCT(config);
+            config.bEnabled = OMX_TRUE;
+            err = OMX_SetConfig(s->handle, OMX_IndexConfigBrcmVideoRequestIFrame, &config);
+            if (err != OMX_ErrorNone) {
+                av_log(avctx, AV_LOG_ERROR, "OMX_SetConfig(RequestIFrame) failed: %x\n", err);
+            }
+#else
+            OMX_CONFIG_INTRAREFRESHVOPTYPE config = {0, };
+            INIT_STRUCT(config);
+            config.nPortIndex = s->out_port;
+            config.IntraRefreshVOP = OMX_TRUE;
+            err = OMX_SetConfig(s->handle, OMX_IndexConfigVideoIntraVOPRefresh, &config);
+            if (err != OMX_ErrorNone) {
+                av_log(avctx, AV_LOG_ERROR, "OMX_SetConfig(IntraVOPRefresh) failed: %x\n", err);
+            }
+#endif
+        }
         err = OMX_EmptyThisBuffer(s->handle, buffer);
         if (err != OMX_ErrorNone) {
             append_buffer(&s->input_mutex, &s->input_cond, &s->num_free_in_buffers, s->free_in_buffers, buffer);
@@ -830,7 +847,7 @@
         // packet, or get EOS.
         buffer = get_buffer(&s->output_mutex, &s->output_cond,
                             &s->num_done_out_buffers, s->done_out_buffers,
-                            !frame);
+                            !frame || had_partial);
         if (!buffer)
             break;
 
@@ -865,6 +882,9 @@
                     s->output_buf = NULL;
                     s->output_buf_size = 0;
                 }
+#if CONFIG_OMX_RPI
+                had_partial = 1;
+#endif
             } else {
                 // End of frame, and the caller provided a preallocated frame
                 if ((ret = ff_alloc_packet2(avctx, pkt, s->output_buf_size + buffer->nFilledLen, 0)) < 0) {
@@ -913,7 +933,7 @@
 static const AVOption options[] = {
     { "omx_libname", "OpenMAX library name", OFFSET(libname), AV_OPT_TYPE_STRING, { 0 }, 0, 0, VDE },
     { "omx_libprefix", "OpenMAX library prefix", OFFSET(libprefix), AV_OPT_TYPE_STRING, { 0 }, 0, 0, VDE },
-    { "zerocopy", "Try to avoid copying input frames if possible", OFFSET(input_zerocopy), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
+    { "zerocopy", "Try to avoid copying input frames if possible", OFFSET(input_zerocopy), AV_OPT_TYPE_INT, { .i64 = CONFIG_OMX_RPI }, 0, 1, VE },
     { "profile",  "Set the encoding profile", OFFSET(profile), AV_OPT_TYPE_INT,   { .i64 = FF_PROFILE_UNKNOWN },       FF_PROFILE_UNKNOWN, FF_PROFILE_H264_HIGH, VE, "profile" },
     { "baseline", "",                         0,               AV_OPT_TYPE_CONST, { .i64 = FF_PROFILE_H264_BASELINE }, 0, 0, VE, "profile" },
     { "main",     "",                         0,               AV_OPT_TYPE_CONST, { .i64 = FF_PROFILE_H264_MAIN },     0, 0, VE, "profile" },
diff --git a/libavcodec/options.c b/libavcodec/options.c
index 41b6052..7706a03 100644
--- a/libavcodec/options.c
+++ b/libavcodec/options.c
@@ -55,15 +55,16 @@
 
 static const AVClass *codec_child_class_next(const AVClass *prev)
 {
-    AVCodec *c = NULL;
+    void *iter = NULL;
+    const AVCodec *c = NULL;
 
     /* find the codec that corresponds to prev */
-    while (prev && (c = av_codec_next(c)))
+    while (prev && (c = av_codec_iterate(&iter)))
         if (c->priv_class == prev)
             break;
 
     /* find next codec with priv options */
-    while (c = av_codec_next(c))
+    while (c = av_codec_iterate(&iter))
         if (c->priv_class)
             return c->priv_class;
     return NULL;
@@ -347,172 +348,3 @@
 {
     return &av_subtitle_rect_class;
 }
-
-#ifdef TEST
-static int dummy_init(AVCodecContext *ctx)
-{
-    //TODO: this code should set every possible pointer that could be set by codec and is not an option;
-    ctx->extradata_size = 8;
-    ctx->extradata = av_malloc(ctx->extradata_size);
-    return 0;
-}
-
-static int dummy_close(AVCodecContext *ctx)
-{
-    av_freep(&ctx->extradata);
-    ctx->extradata_size = 0;
-    return 0;
-}
-
-static int dummy_encode(AVCodecContext *ctx, AVPacket *pkt, const AVFrame *frame, int *got_packet)
-{
-    return AVERROR(ENOSYS);
-}
-
-typedef struct Dummy12Context {
-    AVClass  *av_class;
-    int      num;
-    char*    str;
-} Dummy12Context;
-
-typedef struct Dummy3Context {
-    void     *fake_av_class;
-    int      num;
-    char*    str;
-} Dummy3Context;
-
-#define OFFSET(x) offsetof(Dummy12Context, x)
-#define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
-static const AVOption dummy_options[] = {
-    { "str", "set str", OFFSET(str), AV_OPT_TYPE_STRING, { .str = "i'm src default value" }, 0, 0, VE},
-    { "num", "set num", OFFSET(num), AV_OPT_TYPE_INT,    { .i64 = 1500100900 },    0, INT_MAX, VE},
-    { NULL },
-};
-
-static const AVClass dummy_v1_class = {
-    .class_name = "dummy_v1_class",
-    .item_name  = av_default_item_name,
-    .option     = dummy_options,
-    .version    = LIBAVUTIL_VERSION_INT,
-};
-
-static const AVClass dummy_v2_class = {
-    .class_name = "dummy_v2_class",
-    .item_name  = av_default_item_name,
-    .option     = dummy_options,
-    .version    = LIBAVUTIL_VERSION_INT,
-};
-
-/* codec with options */
-static AVCodec dummy_v1_encoder = {
-    .name             = "dummy_v1_codec",
-    .type             = AVMEDIA_TYPE_VIDEO,
-    .id               = AV_CODEC_ID_NONE - 1,
-    .encode2          = dummy_encode,
-    .init             = dummy_init,
-    .close            = dummy_close,
-    .priv_class       = &dummy_v1_class,
-    .priv_data_size   = sizeof(Dummy12Context),
-};
-
-/* codec with options, different class */
-static AVCodec dummy_v2_encoder = {
-    .name             = "dummy_v2_codec",
-    .type             = AVMEDIA_TYPE_VIDEO,
-    .id               = AV_CODEC_ID_NONE - 2,
-    .encode2          = dummy_encode,
-    .init             = dummy_init,
-    .close            = dummy_close,
-    .priv_class       = &dummy_v2_class,
-    .priv_data_size   = sizeof(Dummy12Context),
-};
-
-/* codec with priv data, but no class */
-static AVCodec dummy_v3_encoder = {
-    .name             = "dummy_v3_codec",
-    .type             = AVMEDIA_TYPE_VIDEO,
-    .id               = AV_CODEC_ID_NONE - 3,
-    .encode2          = dummy_encode,
-    .init             = dummy_init,
-    .close            = dummy_close,
-    .priv_data_size   = sizeof(Dummy3Context),
-};
-
-/* codec without priv data */
-static AVCodec dummy_v4_encoder = {
-    .name             = "dummy_v4_codec",
-    .type             = AVMEDIA_TYPE_VIDEO,
-    .id               = AV_CODEC_ID_NONE - 4,
-    .encode2          = dummy_encode,
-    .init             = dummy_init,
-    .close            = dummy_close,
-};
-
-static void test_copy_print_codec(const AVCodecContext *ctx)
-{
-    printf("%-14s: %dx%d prv: %s",
-           ctx->codec ? ctx->codec->name : "NULL",
-           ctx->width, ctx->height,
-           ctx->priv_data ? "set" : "null");
-    if (ctx->codec && ctx->codec->priv_class && ctx->codec->priv_data_size) {
-        int64_t i64;
-        char *str = NULL;
-        av_opt_get_int(ctx->priv_data, "num", 0, &i64);
-        av_opt_get(ctx->priv_data, "str", 0, (uint8_t**)&str);
-        printf(" opts: %"PRId64" %s", i64, str);
-        av_free(str);
-    }
-    printf("\n");
-}
-
-static void test_copy(const AVCodec *c1, const AVCodec *c2)
-{
-    AVCodecContext *ctx1, *ctx2;
-    printf("%s -> %s\nclosed:\n", c1 ? c1->name : "NULL", c2 ? c2->name : "NULL");
-    ctx1 = avcodec_alloc_context3(c1);
-    ctx2 = avcodec_alloc_context3(c2);
-    ctx1->width = ctx1->height = 128;
-    if (ctx2->codec && ctx2->codec->priv_class && ctx2->codec->priv_data_size) {
-        av_opt_set(ctx2->priv_data, "num", "667", 0);
-        av_opt_set(ctx2->priv_data, "str", "i'm dest value before copy", 0);
-    }
-    avcodec_copy_context(ctx2, ctx1);
-    test_copy_print_codec(ctx1);
-    test_copy_print_codec(ctx2);
-    if (ctx1->codec) {
-        printf("opened:\n");
-        avcodec_open2(ctx1, ctx1->codec, NULL);
-        if (ctx2->codec && ctx2->codec->priv_class && ctx2->codec->priv_data_size) {
-            av_opt_set(ctx2->priv_data, "num", "667", 0);
-            av_opt_set(ctx2->priv_data, "str", "i'm dest value before copy", 0);
-        }
-        avcodec_copy_context(ctx2, ctx1);
-        test_copy_print_codec(ctx1);
-        test_copy_print_codec(ctx2);
-        avcodec_close(ctx1);
-    }
-    avcodec_free_context(&ctx1);
-    avcodec_free_context(&ctx2);
-}
-
-int main(void)
-{
-    AVCodec *dummy_codec[] = {
-        &dummy_v1_encoder,
-        &dummy_v2_encoder,
-        &dummy_v3_encoder,
-        &dummy_v4_encoder,
-        NULL,
-    };
-    int i, j;
-
-    for (i = 0; dummy_codec[i]; i++)
-        avcodec_register(dummy_codec[i]);
-
-    printf("testing avcodec_copy_context()\n");
-    for (i = 0; i < FF_ARRAY_ELEMS(dummy_codec); i++)
-        for (j = 0; j < FF_ARRAY_ELEMS(dummy_codec); j++)
-            test_copy(dummy_codec[i], dummy_codec[j]);
-    return 0;
-}
-#endif
diff --git a/libavcodec/options_table.h b/libavcodec/options_table.h
index 099261e..5436674 100644
--- a/libavcodec/options_table.h
+++ b/libavcodec/options_table.h
@@ -67,6 +67,8 @@
 {"ilme", "interlaced motion estimation", 0, AV_OPT_TYPE_CONST, {.i64 = AV_CODEC_FLAG_INTERLACED_ME }, INT_MIN, INT_MAX, V|E, "flags"},
 {"cgop", "closed GOP", 0, AV_OPT_TYPE_CONST, {.i64 = AV_CODEC_FLAG_CLOSED_GOP }, INT_MIN, INT_MAX, V|E, "flags"},
 {"output_corrupt", "Output even potentially corrupted frames", 0, AV_OPT_TYPE_CONST, {.i64 = AV_CODEC_FLAG_OUTPUT_CORRUPT }, INT_MIN, INT_MAX, V|D, "flags"},
+{"drop_changed", "Drop frames whose parameters differ from first decoded frame", 0, AV_OPT_TYPE_CONST, {.i64 = AV_CODEC_FLAG_DROPCHANGED }, INT_MIN, INT_MAX, A|V|D, "flags"},
+{"flags2", NULL, OFFSET(flags2), AV_OPT_TYPE_FLAGS, {.i64 = DEFAULT}, 0, UINT_MAX, V|A|E|D|S, "flags2"},
 {"fast", "allow non-spec-compliant speedup tricks", 0, AV_OPT_TYPE_CONST, {.i64 = AV_CODEC_FLAG2_FAST }, INT_MIN, INT_MAX, V|E, "flags2"},
 {"noout", "skip bitstream encoding", 0, AV_OPT_TYPE_CONST, {.i64 = AV_CODEC_FLAG2_NO_OUTPUT }, INT_MIN, INT_MAX, V|E, "flags2"},
 {"ignorecrop", "ignore cropping information from sps", 0, AV_OPT_TYPE_CONST, {.i64 = AV_CODEC_FLAG2_IGNORE_CROP }, INT_MIN, INT_MAX, V|D, "flags2"},
@@ -74,8 +76,11 @@
 {"chunks", "Frame data might be split into multiple chunks", 0, AV_OPT_TYPE_CONST, {.i64 = AV_CODEC_FLAG2_CHUNKS }, INT_MIN, INT_MAX, V|D, "flags2"},
 {"showall", "Show all frames before the first keyframe", 0, AV_OPT_TYPE_CONST, {.i64 = AV_CODEC_FLAG2_SHOW_ALL }, INT_MIN, INT_MAX, V|D, "flags2"},
 {"export_mvs", "export motion vectors through frame side data", 0, AV_OPT_TYPE_CONST, {.i64 = AV_CODEC_FLAG2_EXPORT_MVS}, INT_MIN, INT_MAX, V|D, "flags2"},
-{"skip_manual", "do not skip samples and export skip information as frame side data", 0, AV_OPT_TYPE_CONST, {.i64 = AV_CODEC_FLAG2_SKIP_MANUAL}, INT_MIN, INT_MAX, V|D, "flags2"},
+{"skip_manual", "do not skip samples and export skip information as frame side data", 0, AV_OPT_TYPE_CONST, {.i64 = AV_CODEC_FLAG2_SKIP_MANUAL}, INT_MIN, INT_MAX, A|D, "flags2"},
 {"ass_ro_flush_noop", "do not reset ASS ReadOrder field on flush", 0, AV_OPT_TYPE_CONST, {.i64 = AV_CODEC_FLAG2_RO_FLUSH_NOOP}, INT_MIN, INT_MAX, S|D, "flags2"},
+{"export_side_data", "Export metadata as side data", OFFSET(export_side_data), AV_OPT_TYPE_FLAGS, {.i64 = DEFAULT}, 0, UINT_MAX, A|V|S|D|E, "export_side_data"},
+{"mvs", "export motion vectors through frame side data", 0, AV_OPT_TYPE_CONST, {.i64 = AV_CODEC_EXPORT_DATA_MVS}, INT_MIN, INT_MAX, V|D, "export_side_data"},
+{"prft", "export Producer Reference Time through packet side data", 0, AV_OPT_TYPE_CONST, {.i64 = AV_CODEC_EXPORT_DATA_PRFT}, INT_MIN, INT_MAX, A|V|S|E, "export_side_data"},
 {"time_base", NULL, OFFSET(time_base), AV_OPT_TYPE_RATIONAL, {.dbl = 0}, 0, INT_MAX},
 {"g", "set the group of picture (GOP) size", OFFSET(gop_size), AV_OPT_TYPE_INT, {.i64 = 12 }, INT_MIN, INT_MAX, V|E},
 {"ar", "set audio sampling rate (in Hz)", OFFSET(sample_rate), AV_OPT_TYPE_INT, {.i64 = DEFAULT }, 0, INT_MAX, A|D|E},
@@ -139,8 +144,8 @@
 {"explode", "abort decoding on minor error detection", 0, AV_OPT_TYPE_CONST, {.i64 = AV_EF_EXPLODE }, INT_MIN, INT_MAX, A|V|D, "err_detect"},
 {"ignore_err", "ignore errors", 0, AV_OPT_TYPE_CONST, {.i64 = AV_EF_IGNORE_ERR }, INT_MIN, INT_MAX, A|V|D, "err_detect"},
 {"careful",    "consider things that violate the spec, are fast to check and have not been seen in the wild as errors", 0, AV_OPT_TYPE_CONST, {.i64 = AV_EF_CAREFUL }, INT_MIN, INT_MAX, A|V|D, "err_detect"},
-{"compliant",  "consider all spec non compliancies as errors", 0, AV_OPT_TYPE_CONST, {.i64 = AV_EF_COMPLIANT }, INT_MIN, INT_MAX, A|V|D, "err_detect"},
-{"aggressive", "consider things that a sane encoder should not do as an error", 0, AV_OPT_TYPE_CONST, {.i64 = AV_EF_AGGRESSIVE }, INT_MIN, INT_MAX, A|V|D, "err_detect"},
+{"compliant",  "consider all spec non compliancies as errors", 0, AV_OPT_TYPE_CONST, {.i64 = AV_EF_COMPLIANT | AV_EF_CAREFUL }, INT_MIN, INT_MAX, A|V|D, "err_detect"},
+{"aggressive", "consider things that a sane encoder should not do as an error", 0, AV_OPT_TYPE_CONST, {.i64 = AV_EF_AGGRESSIVE | AV_EF_COMPLIANT | AV_EF_CAREFUL}, INT_MIN, INT_MAX, A|V|D, "err_detect"},
 {"has_b_frames", NULL, OFFSET(has_b_frames), AV_OPT_TYPE_INT, {.i64 = DEFAULT }, 0, INT_MAX},
 {"block_align", NULL, OFFSET(block_align), AV_OPT_TYPE_INT, {.i64 = DEFAULT }, 0, INT_MAX},
 #if FF_API_PRIVATE_OPT
@@ -217,34 +222,11 @@
 {"buffers", "picture buffer allocations", 0, AV_OPT_TYPE_CONST, {.i64 = FF_DEBUG_BUFFERS }, INT_MIN, INT_MAX, V|D, "debug"},
 {"thread_ops", "threading operations", 0, AV_OPT_TYPE_CONST, {.i64 = FF_DEBUG_THREADS }, INT_MIN, INT_MAX, V|A|D, "debug"},
 {"nomc", "skip motion compensation", 0, AV_OPT_TYPE_CONST, {.i64 = FF_DEBUG_NOMC }, INT_MIN, INT_MAX, V|A|D, "debug"},
-{"cmp", "full-pel ME compare function", OFFSET(me_cmp), AV_OPT_TYPE_INT, {.i64 = DEFAULT }, INT_MIN, INT_MAX, V|E, "cmp_func"},
-{"subcmp", "sub-pel ME compare function", OFFSET(me_sub_cmp), AV_OPT_TYPE_INT, {.i64 = DEFAULT }, INT_MIN, INT_MAX, V|E, "cmp_func"},
-{"mbcmp", "macroblock compare function", OFFSET(mb_cmp), AV_OPT_TYPE_INT, {.i64 = DEFAULT }, INT_MIN, INT_MAX, V|E, "cmp_func"},
-{"ildctcmp", "interlaced DCT compare function", OFFSET(ildct_cmp), AV_OPT_TYPE_INT, {.i64 = FF_CMP_VSAD }, INT_MIN, INT_MAX, V|E, "cmp_func"},
 {"dia_size", "diamond type & size for motion estimation", OFFSET(dia_size), AV_OPT_TYPE_INT, {.i64 = DEFAULT }, INT_MIN, INT_MAX, V|E},
 {"last_pred", "amount of motion predictors from the previous frame", OFFSET(last_predictor_count), AV_OPT_TYPE_INT, {.i64 = DEFAULT }, INT_MIN, INT_MAX, V|E},
 #if FF_API_PRIVATE_OPT
 {"preme", "pre motion estimation", OFFSET(pre_me), AV_OPT_TYPE_INT, {.i64 = DEFAULT }, INT_MIN, INT_MAX, V|E},
 #endif
-{"precmp", "pre motion estimation compare function", OFFSET(me_pre_cmp), AV_OPT_TYPE_INT, {.i64 = DEFAULT }, INT_MIN, INT_MAX, V|E, "cmp_func"},
-{"sad", "sum of absolute differences, fast", 0, AV_OPT_TYPE_CONST, {.i64 = FF_CMP_SAD }, INT_MIN, INT_MAX, V|E, "cmp_func"},
-{"sse", "sum of squared errors", 0, AV_OPT_TYPE_CONST, {.i64 = FF_CMP_SSE }, INT_MIN, INT_MAX, V|E, "cmp_func"},
-{"satd", "sum of absolute Hadamard transformed differences", 0, AV_OPT_TYPE_CONST, {.i64 = FF_CMP_SATD }, INT_MIN, INT_MAX, V|E, "cmp_func"},
-{"dct", "sum of absolute DCT transformed differences", 0, AV_OPT_TYPE_CONST, {.i64 = FF_CMP_DCT }, INT_MIN, INT_MAX, V|E, "cmp_func"},
-{"psnr", "sum of squared quantization errors (avoid, low quality)", 0, AV_OPT_TYPE_CONST, {.i64 = FF_CMP_PSNR }, INT_MIN, INT_MAX, V|E, "cmp_func"},
-{"bit", "number of bits needed for the block", 0, AV_OPT_TYPE_CONST, {.i64 = FF_CMP_BIT }, INT_MIN, INT_MAX, V|E, "cmp_func"},
-{"rd", "rate distortion optimal, slow", 0, AV_OPT_TYPE_CONST, {.i64 = FF_CMP_RD }, INT_MIN, INT_MAX, V|E, "cmp_func"},
-{"zero", "0", 0, AV_OPT_TYPE_CONST, {.i64 = FF_CMP_ZERO }, INT_MIN, INT_MAX, V|E, "cmp_func"},
-{"vsad", "sum of absolute vertical differences", 0, AV_OPT_TYPE_CONST, {.i64 = FF_CMP_VSAD }, INT_MIN, INT_MAX, V|E, "cmp_func"},
-{"vsse", "sum of squared vertical differences", 0, AV_OPT_TYPE_CONST, {.i64 = FF_CMP_VSSE }, INT_MIN, INT_MAX, V|E, "cmp_func"},
-{"nsse", "noise preserving sum of squared differences", 0, AV_OPT_TYPE_CONST, {.i64 = FF_CMP_NSSE }, INT_MIN, INT_MAX, V|E, "cmp_func"},
-#if CONFIG_SNOW_ENCODER
-{"w53", "5/3 wavelet, only used in snow", 0, AV_OPT_TYPE_CONST, {.i64 = FF_CMP_W53 }, INT_MIN, INT_MAX, V|E, "cmp_func"},
-{"w97", "9/7 wavelet, only used in snow", 0, AV_OPT_TYPE_CONST, {.i64 = FF_CMP_W97 }, INT_MIN, INT_MAX, V|E, "cmp_func"},
-#endif
-{"dctmax", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_CMP_DCTMAX }, INT_MIN, INT_MAX, V|E, "cmp_func"},
-{"chroma", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_CMP_CHROMA }, INT_MIN, INT_MAX, V|E, "cmp_func"},
-{"msad", "sum of absolute differences, median predicted", 0, AV_OPT_TYPE_CONST, {.i64 = FF_CMP_MEDIAN_SAD }, INT_MIN, INT_MAX, V|E, "cmp_func"},
 {"pre_dia_size", "diamond type & size for motion estimation pre-pass", OFFSET(pre_dia_size), AV_OPT_TYPE_INT, {.i64 = DEFAULT }, INT_MIN, INT_MAX, V|E},
 {"subq", "sub-pel motion estimation quality", OFFSET(me_subpel_quality), AV_OPT_TYPE_INT, {.i64 = 8 }, INT_MIN, INT_MAX, V|E},
 {"me_range", "limit motion vectors range (1023 for DivX player)", OFFSET(me_range), AV_OPT_TYPE_INT, {.i64 = DEFAULT }, INT_MIN, INT_MAX, V|E},
@@ -271,7 +253,6 @@
 {"nr", "noise reduction", OFFSET(noise_reduction), AV_OPT_TYPE_INT, {.i64 = DEFAULT }, INT_MIN, INT_MAX, V|E},
 #endif
 {"rc_init_occupancy", "number of bits which should be loaded into the rc buffer before decoding starts", OFFSET(rc_initial_buffer_occupancy), AV_OPT_TYPE_INT, {.i64 = DEFAULT }, INT_MIN, INT_MAX, V|E},
-{"flags2", NULL, OFFSET(flags2), AV_OPT_TYPE_FLAGS, {.i64 = DEFAULT}, 0, UINT_MAX, V|A|E|D, "flags2"},
 {"threads", "set the number of threads", OFFSET(thread_count), AV_OPT_TYPE_INT, {.i64 = 1 }, 0, INT_MAX, V|A|E|D, "threads"},
 {"auto", "autodetect a suitable number of threads to use", 0, AV_OPT_TYPE_CONST, {.i64 = 0 }, INT_MIN, INT_MAX, V|E|D, "threads"},
 {"dc", "intra_dc_precision", OFFSET(intra_dc_precision), AV_OPT_TYPE_INT, {.i64 = 0 }, -8, 16, V|E},
@@ -310,6 +291,29 @@
 {"skip_exp", "frame skip exponent", OFFSET(frame_skip_exp), AV_OPT_TYPE_INT, {.i64 = DEFAULT }, INT_MIN, INT_MAX, V|E},
 {"skipcmp", "frame skip compare function", OFFSET(frame_skip_cmp), AV_OPT_TYPE_INT, {.i64 = FF_CMP_DCTMAX }, INT_MIN, INT_MAX, V|E, "cmp_func"},
 #endif
+{"cmp", "full-pel ME compare function", OFFSET(me_cmp), AV_OPT_TYPE_INT, {.i64 = DEFAULT }, INT_MIN, INT_MAX, V|E, "cmp_func"},
+{"subcmp", "sub-pel ME compare function", OFFSET(me_sub_cmp), AV_OPT_TYPE_INT, {.i64 = DEFAULT }, INT_MIN, INT_MAX, V|E, "cmp_func"},
+{"mbcmp", "macroblock compare function", OFFSET(mb_cmp), AV_OPT_TYPE_INT, {.i64 = DEFAULT }, INT_MIN, INT_MAX, V|E, "cmp_func"},
+{"ildctcmp", "interlaced DCT compare function", OFFSET(ildct_cmp), AV_OPT_TYPE_INT, {.i64 = FF_CMP_VSAD }, INT_MIN, INT_MAX, V|E, "cmp_func"},
+{"precmp", "pre motion estimation compare function", OFFSET(me_pre_cmp), AV_OPT_TYPE_INT, {.i64 = DEFAULT }, INT_MIN, INT_MAX, V|E, "cmp_func"},
+{"sad", "sum of absolute differences, fast", 0, AV_OPT_TYPE_CONST, {.i64 = FF_CMP_SAD }, INT_MIN, INT_MAX, V|E, "cmp_func"},
+{"sse", "sum of squared errors", 0, AV_OPT_TYPE_CONST, {.i64 = FF_CMP_SSE }, INT_MIN, INT_MAX, V|E, "cmp_func"},
+{"satd", "sum of absolute Hadamard transformed differences", 0, AV_OPT_TYPE_CONST, {.i64 = FF_CMP_SATD }, INT_MIN, INT_MAX, V|E, "cmp_func"},
+{"dct", "sum of absolute DCT transformed differences", 0, AV_OPT_TYPE_CONST, {.i64 = FF_CMP_DCT }, INT_MIN, INT_MAX, V|E, "cmp_func"},
+{"psnr", "sum of squared quantization errors (avoid, low quality)", 0, AV_OPT_TYPE_CONST, {.i64 = FF_CMP_PSNR }, INT_MIN, INT_MAX, V|E, "cmp_func"},
+{"bit", "number of bits needed for the block", 0, AV_OPT_TYPE_CONST, {.i64 = FF_CMP_BIT }, INT_MIN, INT_MAX, V|E, "cmp_func"},
+{"rd", "rate distortion optimal, slow", 0, AV_OPT_TYPE_CONST, {.i64 = FF_CMP_RD }, INT_MIN, INT_MAX, V|E, "cmp_func"},
+{"zero", "0", 0, AV_OPT_TYPE_CONST, {.i64 = FF_CMP_ZERO }, INT_MIN, INT_MAX, V|E, "cmp_func"},
+{"vsad", "sum of absolute vertical differences", 0, AV_OPT_TYPE_CONST, {.i64 = FF_CMP_VSAD }, INT_MIN, INT_MAX, V|E, "cmp_func"},
+{"vsse", "sum of squared vertical differences", 0, AV_OPT_TYPE_CONST, {.i64 = FF_CMP_VSSE }, INT_MIN, INT_MAX, V|E, "cmp_func"},
+{"nsse", "noise preserving sum of squared differences", 0, AV_OPT_TYPE_CONST, {.i64 = FF_CMP_NSSE }, INT_MIN, INT_MAX, V|E, "cmp_func"},
+#if CONFIG_SNOW_ENCODER
+{"w53", "5/3 wavelet, only used in snow", 0, AV_OPT_TYPE_CONST, {.i64 = FF_CMP_W53 }, INT_MIN, INT_MAX, V|E, "cmp_func"},
+{"w97", "9/7 wavelet, only used in snow", 0, AV_OPT_TYPE_CONST, {.i64 = FF_CMP_W97 }, INT_MIN, INT_MAX, V|E, "cmp_func"},
+#endif
+{"dctmax", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_CMP_DCTMAX }, INT_MIN, INT_MAX, V|E, "cmp_func"},
+{"chroma", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_CMP_CHROMA }, INT_MIN, INT_MAX, V|E, "cmp_func"},
+{"msad", "sum of absolute differences, median predicted", 0, AV_OPT_TYPE_CONST, {.i64 = FF_CMP_MEDIAN_SAD }, INT_MIN, INT_MAX, V|E, "cmp_func"},
 {"mblmin", "minimum macroblock Lagrange factor (VBR)", OFFSET(mb_lmin), AV_OPT_TYPE_INT, {.i64 = FF_QP2LAMBDA * 2 }, 1, FF_LAMBDA_MAX, V|E},
 {"mblmax", "maximum macroblock Lagrange factor (VBR)", OFFSET(mb_lmax), AV_OPT_TYPE_INT, {.i64 = FF_QP2LAMBDA * 31 }, 1, FF_LAMBDA_MAX, V|E},
 #if FF_API_PRIVATE_OPT
@@ -365,6 +369,7 @@
 {"smpte431",    "SMPTE 431-2",    0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_PRI_SMPTE431 },     INT_MIN, INT_MAX, V|E|D, "color_primaries_type"},
 {"smpte432",    "SMPTE 422-1",    0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_PRI_SMPTE432 },     INT_MIN, INT_MAX, V|E|D, "color_primaries_type"},
 {"jedec-p22",   "JEDEC P22",      0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_PRI_JEDEC_P22 },    INT_MIN, INT_MAX, V|E|D, "color_primaries_type"},
+{"ebu3213",     "EBU 3213-E",     0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_PRI_EBU3213 },      INT_MIN, INT_MAX, V|E|D, "color_primaries_type"},
 {"unspecified", "Unspecified",    0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_PRI_UNSPECIFIED },  INT_MIN, INT_MAX, V|E|D, "color_primaries_type"},
 {"color_trc", "color transfer characteristics", OFFSET(color_trc), AV_OPT_TYPE_INT, {.i64 = AVCOL_TRC_UNSPECIFIED }, 1, INT_MAX, V|E|D, "color_trc_type"},
 {"bt709",        "BT.709",           0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_BT709 },        INT_MIN, INT_MAX, V|E|D, "color_trc_type"},
@@ -442,7 +447,7 @@
 {"ka", "Karaoke",            0, AV_OPT_TYPE_CONST, {.i64 = AV_AUDIO_SERVICE_TYPE_KARAOKE },           INT_MIN, INT_MAX, A|E, "audio_service_type"},
 {"request_sample_fmt", "sample format audio decoders should prefer", OFFSET(request_sample_fmt), AV_OPT_TYPE_SAMPLE_FMT, {.i64=AV_SAMPLE_FMT_NONE}, -1, INT_MAX, A|D, "request_sample_fmt"},
 {"pkt_timebase", NULL, OFFSET(pkt_timebase), AV_OPT_TYPE_RATIONAL, {.dbl = 0 }, 0, INT_MAX, 0},
-{"sub_charenc", "set input text subtitles character encoding", OFFSET(sub_charenc), AV_OPT_TYPE_STRING, {.str = NULL}, CHAR_MIN, CHAR_MAX, S|D},
+{"sub_charenc", "set input text subtitles character encoding", OFFSET(sub_charenc), AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, S|D},
 {"sub_charenc_mode", "set input text subtitles character encoding mode", OFFSET(sub_charenc_mode), AV_OPT_TYPE_FLAGS, {.i64 = FF_SUB_CHARENC_MODE_AUTOMATIC}, -1, INT_MAX, S|D, "sub_charenc_mode"},
 {"do_nothing",  NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_SUB_CHARENC_MODE_DO_NOTHING},  INT_MIN, INT_MAX, S|D, "sub_charenc_mode"},
 {"auto",        NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_SUB_CHARENC_MODE_AUTOMATIC},   INT_MIN, INT_MAX, S|D, "sub_charenc_mode"},
@@ -469,16 +474,18 @@
 {"bb", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = AV_FIELD_BB }, 0, 0, V|D|E, "field_order" },
 {"tb", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = AV_FIELD_TB }, 0, 0, V|D|E, "field_order" },
 {"bt", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = AV_FIELD_BT }, 0, 0, V|D|E, "field_order" },
-{"dump_separator", "set information dump field separator", OFFSET(dump_separator), AV_OPT_TYPE_STRING, {.str = NULL}, CHAR_MIN, CHAR_MAX, A|V|S|D|E},
-{"codec_whitelist", "List of decoders that are allowed to be used", OFFSET(codec_whitelist), AV_OPT_TYPE_STRING, { .str = NULL },  CHAR_MIN, CHAR_MAX, A|V|S|D },
+{"dump_separator", "set information dump field separator", OFFSET(dump_separator), AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, A|V|S|D|E},
+{"codec_whitelist", "List of decoders that are allowed to be used", OFFSET(codec_whitelist), AV_OPT_TYPE_STRING, { .str = NULL },  0, 0, A|V|S|D },
 {"pixel_format", "set pixel format", OFFSET(pix_fmt), AV_OPT_TYPE_PIXEL_FMT, {.i64=AV_PIX_FMT_NONE}, -1, INT_MAX, 0 },
 {"video_size", "set video size", OFFSET(width), AV_OPT_TYPE_IMAGE_SIZE, {.str=NULL}, 0, INT_MAX, 0 },
 {"max_pixels", "Maximum number of pixels", OFFSET(max_pixels), AV_OPT_TYPE_INT64, {.i64 = INT_MAX }, 0, INT_MAX, A|V|S|D|E },
+{"max_samples", "Maximum number of samples", OFFSET(max_samples), AV_OPT_TYPE_INT64, {.i64 = INT_MAX }, 0, INT_MAX, A|D|E },
 {"hwaccel_flags", NULL, OFFSET(hwaccel_flags), AV_OPT_TYPE_FLAGS, {.i64 = AV_HWACCEL_FLAG_IGNORE_LEVEL }, 0, UINT_MAX, V|D, "hwaccel_flags"},
 {"ignore_level", "ignore level even if the codec level used is unknown or higher than the maximum supported level reported by the hardware driver", 0, AV_OPT_TYPE_CONST, { .i64 = AV_HWACCEL_FLAG_IGNORE_LEVEL }, INT_MIN, INT_MAX, V | D, "hwaccel_flags" },
 {"allow_high_depth", "allow to output YUV pixel formats with a different chroma sampling than 4:2:0 and/or other than 8 bits per component", 0, AV_OPT_TYPE_CONST, {.i64 = AV_HWACCEL_FLAG_ALLOW_HIGH_DEPTH }, INT_MIN, INT_MAX, V | D, "hwaccel_flags"},
 {"allow_profile_mismatch", "attempt to decode anyway if HW accelerated decoder's supported profiles do not exactly match the stream", 0, AV_OPT_TYPE_CONST, {.i64 = AV_HWACCEL_FLAG_ALLOW_PROFILE_MISMATCH }, INT_MIN, INT_MAX, V | D, "hwaccel_flags"},
 {"extra_hw_frames", "Number of extra hardware frames to allocate for the user", OFFSET(extra_hw_frames), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, INT_MAX, V|D },
+{"discard_damaged_percentage", "Percentage of damaged samples to discard a frame", OFFSET(discard_damaged_percentage), AV_OPT_TYPE_INT, {.i64 = 95 }, 0, 100, V|D },
 {NULL},
 };
 
diff --git a/libavcodec/opus.c b/libavcodec/opus.c
index aa827b6..f74278a 100644
--- a/libavcodec/opus.c
+++ b/libavcodec/opus.c
@@ -31,6 +31,7 @@
 
 #include "opus_celt.h"
 #include "opustab.h"
+#include "internal.h"
 #include "vorbis.h"
 
 static const uint16_t opus_frame_duration[32] = {
@@ -326,6 +327,8 @@
     }
 
     avctx->delay = AV_RL16(extradata + 10);
+    if (avctx->internal)
+        avctx->internal->skip_samples = avctx->delay;
 
     channels = avctx->extradata ? extradata[9] : (avctx->channels == 1) ? 1 : 2;
     if (!channels) {
diff --git a/libavcodec/opus.h b/libavcodec/opus.h
index edbaab5..63ecd0a 100644
--- a/libavcodec/opus.h
+++ b/libavcodec/opus.h
@@ -112,7 +112,7 @@
     DECLARE_ALIGNED(32, float, celt_buf)[2][960];
     float *celt_output[2];
 
-    float redundancy_buf[2][960];
+    DECLARE_ALIGNED(32, float, redundancy_buf)[2][960];
     float *redundancy_output[2];
 
     /* data buffers for the final output data */
diff --git a/libavcodec/opus_celt.c b/libavcodec/opus_celt.c
index 115dd8c..9dbeff1 100644
--- a/libavcodec/opus_celt.c
+++ b/libavcodec/opus_celt.c
@@ -202,40 +202,10 @@
     }
 }
 
-static void celt_postfilter_apply(CeltBlock *block, float *data, int len)
-{
-    const int T = block->pf_period;
-    float g0, g1, g2;
-    float x0, x1, x2, x3, x4;
-    int i;
-
-    if (block->pf_gains[0] == 0.0 || len <= 0)
-        return;
-
-    g0 = block->pf_gains[0];
-    g1 = block->pf_gains[1];
-    g2 = block->pf_gains[2];
-
-    x4 = data[-T - 2];
-    x3 = data[-T - 1];
-    x2 = data[-T];
-    x1 = data[-T + 1];
-
-    for (i = 0; i < len; i++) {
-        x0 = data[i - T + 2];
-        data[i] += g0 * x2        +
-                   g1 * (x1 + x3) +
-                   g2 * (x0 + x4);
-        x4 = x3;
-        x3 = x2;
-        x2 = x1;
-        x1 = x0;
-    }
-}
-
 static void celt_postfilter(CeltFrame *f, CeltBlock *block)
 {
     int len = f->blocksize * f->blocks;
+    const int filter_len = len - 2 * CELT_OVERLAP;
 
     celt_postfilter_apply_transition(block, block->buf + 1024);
 
@@ -247,8 +217,11 @@
 
     if (len > CELT_OVERLAP) {
         celt_postfilter_apply_transition(block, block->buf + 1024 + CELT_OVERLAP);
-        celt_postfilter_apply(block, block->buf + 1024 + 2 * CELT_OVERLAP,
-                              len - 2 * CELT_OVERLAP);
+
+        if (block->pf_gains[0] > FLT_EPSILON && filter_len > 0)
+            f->opusdsp.postfilter(block->buf + 1024 + 2 * CELT_OVERLAP,
+                                  block->pf_period, block->pf_gains,
+                                  filter_len);
 
         block->pf_period_old = block->pf_period;
         memcpy(block->pf_gains_old, block->pf_gains, sizeof(block->pf_gains));
@@ -462,7 +435,6 @@
     /* transform and output for each output channel */
     for (i = 0; i < f->output_channels; i++) {
         CeltBlock *block = &f->block[i];
-        float m = block->emph_coeff;
 
         /* iMDCT and overlap-add */
         for (j = 0; j < f->blocks; j++) {
@@ -480,14 +452,10 @@
         /* postfilter */
         celt_postfilter(f, block);
 
-        /* deemphasis and output scaling */
-        for (j = 0; j < frame_size; j++) {
-            const float tmp = block->buf[1024 - frame_size + j] + m;
-            m = tmp * CELT_EMPH_COEFF;
-            output[i][j] = tmp;
-        }
-
-        block->emph_coeff = m;
+        /* deemphasis */
+        block->emph_coeff = f->opusdsp.deemphasis(output[i],
+                                                  &block->buf[1024 - frame_size],
+                                                  block->emph_coeff, frame_size);
     }
 
     if (channels == 1)
@@ -539,7 +507,11 @@
         memset(block->pf_gains_old, 0, sizeof(block->pf_gains_old));
         memset(block->pf_gains_new, 0, sizeof(block->pf_gains_new));
 
-        block->emph_coeff = 0.0;
+        /* libopus uses CELT_EMPH_COEFF on init, but 0 is better since there's
+         * a lesser discontinuity when seeking.
+         * The deemphasis functions differ from libopus in that they require
+         * an initial state divided by the coefficient. */
+        block->emph_coeff = 0.0f / CELT_EMPH_COEFF;
     }
     f->seed = 0;
 
@@ -596,6 +568,7 @@
         goto fail;
     }
 
+    ff_opus_dsp_init(&frm->opusdsp);
     ff_celt_flush(frm);
 
     *f = frm;
diff --git a/libavcodec/opus_celt.h b/libavcodec/opus_celt.h
index 9289a18..7c1c531 100644
--- a/libavcodec/opus_celt.h
+++ b/libavcodec/opus_celt.h
@@ -28,6 +28,7 @@
 
 #include "opus.h"
 #include "opus_pvq.h"
+#include "opusdsp.h"
 
 #include "mdct15.h"
 #include "libavutil/float_dsp.h"
@@ -40,7 +41,6 @@
 #define CELT_NORM_SCALE              16384
 #define CELT_QTHETA_OFFSET           4
 #define CELT_QTHETA_OFFSET_TWOPHASE  16
-#define CELT_EMPH_COEFF              0.85000610f
 #define CELT_POSTFILTER_MINPERIOD    15
 #define CELT_ENERGY_SILENCE          (-28.0f)
 
@@ -96,6 +96,7 @@
     AVFloatDSPContext   *dsp;
     CeltBlock           block[2];
     CeltPVQ             *pvq;
+    OpusDSP             opusdsp;
     int channels;
     int output_channels;
     int apply_phase_inv;
diff --git a/libavcodec/opus_pvq.c b/libavcodec/opus_pvq.c
index 0dbf141..9c21d67 100644
--- a/libavcodec/opus_pvq.c
+++ b/libavcodec/opus_pvq.c
@@ -903,8 +903,8 @@
     s->pvq_search = ppp_pvq_search_c;
     s->quant_band = encode ? pvq_encode_band : pvq_decode_band;
 
-    if (ARCH_X86)
-        ff_opus_dsp_init_x86(s);
+    if (CONFIG_OPUS_ENCODER && ARCH_X86)
+        ff_celt_pvq_init_x86(s);
 
     *pvq = s;
 
diff --git a/libavcodec/opus_pvq.h b/libavcodec/opus_pvq.h
index e2f01a0..52f9a4e 100644
--- a/libavcodec/opus_pvq.h
+++ b/libavcodec/opus_pvq.h
@@ -40,7 +40,7 @@
     QUANT_FN(*quant_band);
 };
 
-void ff_opus_dsp_init_x86(struct CeltPVQ *s);
+void ff_celt_pvq_init_x86(struct CeltPVQ *s);
 
 int  ff_celt_pvq_init(struct CeltPVQ **pvq, int encode);
 void ff_celt_pvq_uninit(struct CeltPVQ **pvq);
diff --git a/libavcodec/opus_rc.c b/libavcodec/opus_rc.c
index 3972bb0..c432eb9 100644
--- a/libavcodec/opus_rc.c
+++ b/libavcodec/opus_rc.c
@@ -167,7 +167,7 @@
     rc->rb.cachelen = (rc->rb.cachelen + to_write) % 32;
 
     if (!rc->rb.cachelen && count) {
-        AV_WB32(rc->rb.position, rc->rb.cacheval);
+        AV_WB32((uint8_t *)rc->rb.position, rc->rb.cacheval);
         rc->rb.bytes    += 4;
         rc->rb.position -= 4;
         rc->rb.cachelen = count - to_write;
diff --git a/libavcodec/opusdsp.c b/libavcodec/opusdsp.c
new file mode 100644
index 0000000..08df87f
--- /dev/null
+++ b/libavcodec/opusdsp.c
@@ -0,0 +1,62 @@
+/*
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "opusdsp.h"
+
+static void postfilter_c(float *data, int period, float *gains, int len)
+{
+    const float g0 = gains[0];
+    const float g1 = gains[1];
+    const float g2 = gains[2];
+
+    float x4 = data[-period - 2];
+    float x3 = data[-period - 1];
+    float x2 = data[-period + 0];
+    float x1 = data[-period + 1];
+
+    for (int i = 0; i < len; i++) {
+        float x0 = data[i - period + 2];
+        data[i] += g0 * x2        +
+                   g1 * (x1 + x3) +
+                   g2 * (x0 + x4);
+        x4 = x3;
+        x3 = x2;
+        x2 = x1;
+        x1 = x0;
+    }
+}
+
+static float deemphasis_c(float *y, float *x, float coeff, int len)
+{
+    for (int i = 0; i < len; i++)
+        coeff = y[i] = x[i] + coeff*CELT_EMPH_COEFF;
+
+    return coeff;
+}
+
+av_cold void ff_opus_dsp_init(OpusDSP *ctx)
+{
+    ctx->postfilter = postfilter_c;
+    ctx->deemphasis = deemphasis_c;
+
+    if (ARCH_X86)
+        ff_opus_dsp_init_x86(ctx);
+
+    if (ARCH_AARCH64)
+        ff_opus_dsp_init_aarch64(ctx);
+}
diff --git a/libavdevice/libndi_newtek_common.h b/libavcodec/opusdsp.h
similarity index 62%
copy from libavdevice/libndi_newtek_common.h
copy to libavcodec/opusdsp.h
index 8990317..ee3186d 100644
--- a/libavdevice/libndi_newtek_common.h
+++ b/libavcodec/opusdsp.h
@@ -1,7 +1,4 @@
 /*
- * NewTek NDI common code
- * Copyright (c) 2017 Maksym Veremeyenko
- *
  * This file is part of FFmpeg.
  *
  * FFmpeg is free software; you can redistribute it and/or
@@ -19,12 +16,21 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
-#ifndef AVDEVICE_LIBNDI_NEWTEK_COMMON_H
-#define AVDEVICE_LIBNDI_NEWTEK_COMMON_H
+#ifndef AVCODEC_OPUSDSP_H
+#define AVCODEC_OPUSDSP_H
 
-#include <Processing.NDI.Lib.h>
+#include "libavutil/common.h"
 
-#define NDI_TIME_BASE 10000000
-#define NDI_TIME_BASE_Q (AVRational){1, NDI_TIME_BASE}
+#define CELT_EMPH_COEFF 0.8500061035f
 
-#endif
+typedef struct OpusDSP {
+    void (*postfilter)(float *data, int period, float *gains, int len);
+    float (*deemphasis)(float *out, float *in, float coeff, int len);
+} OpusDSP;
+
+void ff_opus_dsp_init(OpusDSP *ctx);
+
+void ff_opus_dsp_init_x86(OpusDSP *ctx);
+void ff_opus_dsp_init_aarch64(OpusDSP *ctx);
+
+#endif /* AVCODEC_OPUSDSP_H */
diff --git a/libavcodec/opusenc.c b/libavcodec/opusenc.c
index 578785f..3c08ebc 100644
--- a/libavcodec/opusenc.c
+++ b/libavcodec/opusenc.c
@@ -543,7 +543,7 @@
         ff_bufqueue_add(avctx, &s->bufqueue, av_frame_clone(frame));
     } else {
         ff_opus_psy_signal_eof(&s->psyctx);
-        if (!s->afq.remaining_samples)
+        if (!s->afq.remaining_samples || !avctx->frame_number)
             return 0; /* We've been flushed and there's nothing left to encode */
     }
 
diff --git a/libavcodec/packet.h b/libavcodec/packet.h
new file mode 100644
index 0000000..41485f4
--- /dev/null
+++ b/libavcodec/packet.h
@@ -0,0 +1,722 @@
+/*
+ * AVPacket public API
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVCODEC_PACKET_H
+#define AVCODEC_PACKET_H
+
+#include <stddef.h>
+#include <stdint.h>
+
+#include "libavutil/attributes.h"
+#include "libavutil/buffer.h"
+#include "libavutil/dict.h"
+#include "libavutil/rational.h"
+
+#include "libavcodec/version.h"
+
+/**
+ * @defgroup lavc_packet AVPacket
+ *
+ * Types and functions for working with AVPacket.
+ * @{
+ */
+enum AVPacketSideDataType {
+    /**
+     * An AV_PKT_DATA_PALETTE side data packet contains exactly AVPALETTE_SIZE
+     * bytes worth of palette. This side data signals that a new palette is
+     * present.
+     */
+    AV_PKT_DATA_PALETTE,
+
+    /**
+     * The AV_PKT_DATA_NEW_EXTRADATA is used to notify the codec or the format
+     * that the extradata buffer was changed and the receiving side should
+     * act upon it appropriately. The new extradata is embedded in the side
+     * data buffer and should be immediately used for processing the current
+     * frame or packet.
+     */
+    AV_PKT_DATA_NEW_EXTRADATA,
+
+    /**
+     * An AV_PKT_DATA_PARAM_CHANGE side data packet is laid out as follows:
+     * @code
+     * u32le param_flags
+     * if (param_flags & AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_COUNT)
+     *     s32le channel_count
+     * if (param_flags & AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_LAYOUT)
+     *     u64le channel_layout
+     * if (param_flags & AV_SIDE_DATA_PARAM_CHANGE_SAMPLE_RATE)
+     *     s32le sample_rate
+     * if (param_flags & AV_SIDE_DATA_PARAM_CHANGE_DIMENSIONS)
+     *     s32le width
+     *     s32le height
+     * @endcode
+     */
+    AV_PKT_DATA_PARAM_CHANGE,
+
+    /**
+     * An AV_PKT_DATA_H263_MB_INFO side data packet contains a number of
+     * structures with info about macroblocks relevant to splitting the
+     * packet into smaller packets on macroblock edges (e.g. as for RFC 2190).
+     * That is, it does not necessarily contain info about all macroblocks,
+     * as long as the distance between macroblocks in the info is smaller
+     * than the target payload size.
+     * Each MB info structure is 12 bytes, and is laid out as follows:
+     * @code
+     * u32le bit offset from the start of the packet
+     * u8    current quantizer at the start of the macroblock
+     * u8    GOB number
+     * u16le macroblock address within the GOB
+     * u8    horizontal MV predictor
+     * u8    vertical MV predictor
+     * u8    horizontal MV predictor for block number 3
+     * u8    vertical MV predictor for block number 3
+     * @endcode
+     */
+    AV_PKT_DATA_H263_MB_INFO,
+
+    /**
+     * This side data should be associated with an audio stream and contains
+     * ReplayGain information in form of the AVReplayGain struct.
+     */
+    AV_PKT_DATA_REPLAYGAIN,
+
+    /**
+     * This side data contains a 3x3 transformation matrix describing an affine
+     * transformation that needs to be applied to the decoded video frames for
+     * correct presentation.
+     *
+     * See libavutil/display.h for a detailed description of the data.
+     */
+    AV_PKT_DATA_DISPLAYMATRIX,
+
+    /**
+     * This side data should be associated with a video stream and contains
+     * Stereoscopic 3D information in form of the AVStereo3D struct.
+     */
+    AV_PKT_DATA_STEREO3D,
+
+    /**
+     * This side data should be associated with an audio stream and corresponds
+     * to enum AVAudioServiceType.
+     */
+    AV_PKT_DATA_AUDIO_SERVICE_TYPE,
+
+    /**
+     * This side data contains quality related information from the encoder.
+     * @code
+     * u32le quality factor of the compressed frame. Allowed range is between 1 (good) and FF_LAMBDA_MAX (bad).
+     * u8    picture type
+     * u8    error count
+     * u16   reserved
+     * u64le[error count] sum of squared differences between encoder in and output
+     * @endcode
+     */
+    AV_PKT_DATA_QUALITY_STATS,
+
+    /**
+     * This side data contains an integer value representing the stream index
+     * of a "fallback" track.  A fallback track indicates an alternate
+     * track to use when the current track can not be decoded for some reason.
+     * e.g. no decoder available for codec.
+     */
+    AV_PKT_DATA_FALLBACK_TRACK,
+
+    /**
+     * This side data corresponds to the AVCPBProperties struct.
+     */
+    AV_PKT_DATA_CPB_PROPERTIES,
+
+    /**
+     * Recommmends skipping the specified number of samples
+     * @code
+     * u32le number of samples to skip from start of this packet
+     * u32le number of samples to skip from end of this packet
+     * u8    reason for start skip
+     * u8    reason for end   skip (0=padding silence, 1=convergence)
+     * @endcode
+     */
+    AV_PKT_DATA_SKIP_SAMPLES,
+
+    /**
+     * An AV_PKT_DATA_JP_DUALMONO side data packet indicates that
+     * the packet may contain "dual mono" audio specific to Japanese DTV
+     * and if it is true, recommends only the selected channel to be used.
+     * @code
+     * u8    selected channels (0=mail/left, 1=sub/right, 2=both)
+     * @endcode
+     */
+    AV_PKT_DATA_JP_DUALMONO,
+
+    /**
+     * A list of zero terminated key/value strings. There is no end marker for
+     * the list, so it is required to rely on the side data size to stop.
+     */
+    AV_PKT_DATA_STRINGS_METADATA,
+
+    /**
+     * Subtitle event position
+     * @code
+     * u32le x1
+     * u32le y1
+     * u32le x2
+     * u32le y2
+     * @endcode
+     */
+    AV_PKT_DATA_SUBTITLE_POSITION,
+
+    /**
+     * Data found in BlockAdditional element of matroska container. There is
+     * no end marker for the data, so it is required to rely on the side data
+     * size to recognize the end. 8 byte id (as found in BlockAddId) followed
+     * by data.
+     */
+    AV_PKT_DATA_MATROSKA_BLOCKADDITIONAL,
+
+    /**
+     * The optional first identifier line of a WebVTT cue.
+     */
+    AV_PKT_DATA_WEBVTT_IDENTIFIER,
+
+    /**
+     * The optional settings (rendering instructions) that immediately
+     * follow the timestamp specifier of a WebVTT cue.
+     */
+    AV_PKT_DATA_WEBVTT_SETTINGS,
+
+    /**
+     * A list of zero terminated key/value strings. There is no end marker for
+     * the list, so it is required to rely on the side data size to stop. This
+     * side data includes updated metadata which appeared in the stream.
+     */
+    AV_PKT_DATA_METADATA_UPDATE,
+
+    /**
+     * MPEGTS stream ID as uint8_t, this is required to pass the stream ID
+     * information from the demuxer to the corresponding muxer.
+     */
+    AV_PKT_DATA_MPEGTS_STREAM_ID,
+
+    /**
+     * Mastering display metadata (based on SMPTE-2086:2014). This metadata
+     * should be associated with a video stream and contains data in the form
+     * of the AVMasteringDisplayMetadata struct.
+     */
+    AV_PKT_DATA_MASTERING_DISPLAY_METADATA,
+
+    /**
+     * This side data should be associated with a video stream and corresponds
+     * to the AVSphericalMapping structure.
+     */
+    AV_PKT_DATA_SPHERICAL,
+
+    /**
+     * Content light level (based on CTA-861.3). This metadata should be
+     * associated with a video stream and contains data in the form of the
+     * AVContentLightMetadata struct.
+     */
+    AV_PKT_DATA_CONTENT_LIGHT_LEVEL,
+
+    /**
+     * ATSC A53 Part 4 Closed Captions. This metadata should be associated with
+     * a video stream. A53 CC bitstream is stored as uint8_t in AVPacketSideData.data.
+     * The number of bytes of CC data is AVPacketSideData.size.
+     */
+    AV_PKT_DATA_A53_CC,
+
+    /**
+     * This side data is encryption initialization data.
+     * The format is not part of ABI, use av_encryption_init_info_* methods to
+     * access.
+     */
+    AV_PKT_DATA_ENCRYPTION_INIT_INFO,
+
+    /**
+     * This side data contains encryption info for how to decrypt the packet.
+     * The format is not part of ABI, use av_encryption_info_* methods to access.
+     */
+    AV_PKT_DATA_ENCRYPTION_INFO,
+
+    /**
+     * Active Format Description data consisting of a single byte as specified
+     * in ETSI TS 101 154 using AVActiveFormatDescription enum.
+     */
+    AV_PKT_DATA_AFD,
+
+    /**
+     * Producer Reference Time data corresponding to the AVProducerReferenceTime struct,
+     * usually exported by some encoders (on demand through the prft flag set in the
+     * AVCodecContext export_side_data field).
+     */
+    AV_PKT_DATA_PRFT,
+
+    /**
+     * ICC profile data consisting of an opaque octet buffer following the
+     * format described by ISO 15076-1.
+     */
+    AV_PKT_DATA_ICC_PROFILE,
+
+    /**
+     * DOVI configuration
+     * ref:
+     * dolby-vision-bitstreams-within-the-iso-base-media-file-format-v2.1.2, section 2.2
+     * dolby-vision-bitstreams-in-mpeg-2-transport-stream-multiplex-v1.2, section 3.3
+     * Tags are stored in struct AVDOVIDecoderConfigurationRecord.
+     */
+    AV_PKT_DATA_DOVI_CONF,
+
+    /**
+     * The number of side data types.
+     * This is not part of the public API/ABI in the sense that it may
+     * change when new side data types are added.
+     * This must stay the last enum value.
+     * If its value becomes huge, some code using it
+     * needs to be updated as it assumes it to be smaller than other limits.
+     */
+    AV_PKT_DATA_NB
+};
+
+#define AV_PKT_DATA_QUALITY_FACTOR AV_PKT_DATA_QUALITY_STATS //DEPRECATED
+
+typedef struct AVPacketSideData {
+    uint8_t *data;
+    int      size;
+    enum AVPacketSideDataType type;
+} AVPacketSideData;
+
+/**
+ * This structure stores compressed data. It is typically exported by demuxers
+ * and then passed as input to decoders, or received as output from encoders and
+ * then passed to muxers.
+ *
+ * For video, it should typically contain one compressed frame. For audio it may
+ * contain several compressed frames. Encoders are allowed to output empty
+ * packets, with no compressed data, containing only side data
+ * (e.g. to update some stream parameters at the end of encoding).
+ *
+ * AVPacket is one of the few structs in FFmpeg, whose size is a part of public
+ * ABI. Thus it may be allocated on stack and no new fields can be added to it
+ * without libavcodec and libavformat major bump.
+ *
+ * The semantics of data ownership depends on the buf field.
+ * If it is set, the packet data is dynamically allocated and is
+ * valid indefinitely until a call to av_packet_unref() reduces the
+ * reference count to 0.
+ *
+ * If the buf field is not set av_packet_ref() would make a copy instead
+ * of increasing the reference count.
+ *
+ * The side data is always allocated with av_malloc(), copied by
+ * av_packet_ref() and freed by av_packet_unref().
+ *
+ * @see av_packet_ref
+ * @see av_packet_unref
+ */
+typedef struct AVPacket {
+    /**
+     * A reference to the reference-counted buffer where the packet data is
+     * stored.
+     * May be NULL, then the packet data is not reference-counted.
+     */
+    AVBufferRef *buf;
+    /**
+     * Presentation timestamp in AVStream->time_base units; the time at which
+     * the decompressed packet will be presented to the user.
+     * Can be AV_NOPTS_VALUE if it is not stored in the file.
+     * pts MUST be larger or equal to dts as presentation cannot happen before
+     * decompression, unless one wants to view hex dumps. Some formats misuse
+     * the terms dts and pts/cts to mean something different. Such timestamps
+     * must be converted to true pts/dts before they are stored in AVPacket.
+     */
+    int64_t pts;
+    /**
+     * Decompression timestamp in AVStream->time_base units; the time at which
+     * the packet is decompressed.
+     * Can be AV_NOPTS_VALUE if it is not stored in the file.
+     */
+    int64_t dts;
+    uint8_t *data;
+    int   size;
+    int   stream_index;
+    /**
+     * A combination of AV_PKT_FLAG values
+     */
+    int   flags;
+    /**
+     * Additional packet data that can be provided by the container.
+     * Packet can contain several types of side information.
+     */
+    AVPacketSideData *side_data;
+    int side_data_elems;
+
+    /**
+     * Duration of this packet in AVStream->time_base units, 0 if unknown.
+     * Equals next_pts - this_pts in presentation order.
+     */
+    int64_t duration;
+
+    int64_t pos;                            ///< byte position in stream, -1 if unknown
+
+#if FF_API_CONVERGENCE_DURATION
+    /**
+     * @deprecated Same as the duration field, but as int64_t. This was required
+     * for Matroska subtitles, whose duration values could overflow when the
+     * duration field was still an int.
+     */
+    attribute_deprecated
+    int64_t convergence_duration;
+#endif
+} AVPacket;
+
+#define AV_PKT_FLAG_KEY     0x0001 ///< The packet contains a keyframe
+#define AV_PKT_FLAG_CORRUPT 0x0002 ///< The packet content is corrupted
+/**
+ * Flag is used to discard packets which are required to maintain valid
+ * decoder state but are not required for output and should be dropped
+ * after decoding.
+ **/
+#define AV_PKT_FLAG_DISCARD   0x0004
+/**
+ * The packet comes from a trusted source.
+ *
+ * Otherwise-unsafe constructs such as arbitrary pointers to data
+ * outside the packet may be followed.
+ */
+#define AV_PKT_FLAG_TRUSTED   0x0008
+/**
+ * Flag is used to indicate packets that contain frames that can
+ * be discarded by the decoder.  I.e. Non-reference frames.
+ */
+#define AV_PKT_FLAG_DISPOSABLE 0x0010
+
+enum AVSideDataParamChangeFlags {
+    AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_COUNT  = 0x0001,
+    AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_LAYOUT = 0x0002,
+    AV_SIDE_DATA_PARAM_CHANGE_SAMPLE_RATE    = 0x0004,
+    AV_SIDE_DATA_PARAM_CHANGE_DIMENSIONS     = 0x0008,
+};
+
+/**
+ * Allocate an AVPacket and set its fields to default values.  The resulting
+ * struct must be freed using av_packet_free().
+ *
+ * @return An AVPacket filled with default values or NULL on failure.
+ *
+ * @note this only allocates the AVPacket itself, not the data buffers. Those
+ * must be allocated through other means such as av_new_packet.
+ *
+ * @see av_new_packet
+ */
+AVPacket *av_packet_alloc(void);
+
+/**
+ * Create a new packet that references the same data as src.
+ *
+ * This is a shortcut for av_packet_alloc()+av_packet_ref().
+ *
+ * @return newly created AVPacket on success, NULL on error.
+ *
+ * @see av_packet_alloc
+ * @see av_packet_ref
+ */
+AVPacket *av_packet_clone(const AVPacket *src);
+
+/**
+ * Free the packet, if the packet is reference counted, it will be
+ * unreferenced first.
+ *
+ * @param pkt packet to be freed. The pointer will be set to NULL.
+ * @note passing NULL is a no-op.
+ */
+void av_packet_free(AVPacket **pkt);
+
+/**
+ * Initialize optional fields of a packet with default values.
+ *
+ * Note, this does not touch the data and size members, which have to be
+ * initialized separately.
+ *
+ * @param pkt packet
+ */
+void av_init_packet(AVPacket *pkt);
+
+/**
+ * Allocate the payload of a packet and initialize its fields with
+ * default values.
+ *
+ * @param pkt packet
+ * @param size wanted payload size
+ * @return 0 if OK, AVERROR_xxx otherwise
+ */
+int av_new_packet(AVPacket *pkt, int size);
+
+/**
+ * Reduce packet size, correctly zeroing padding
+ *
+ * @param pkt packet
+ * @param size new size
+ */
+void av_shrink_packet(AVPacket *pkt, int size);
+
+/**
+ * Increase packet size, correctly zeroing padding
+ *
+ * @param pkt packet
+ * @param grow_by number of bytes by which to increase the size of the packet
+ */
+int av_grow_packet(AVPacket *pkt, int grow_by);
+
+/**
+ * Initialize a reference-counted packet from av_malloc()ed data.
+ *
+ * @param pkt packet to be initialized. This function will set the data, size,
+ *        and buf fields, all others are left untouched.
+ * @param data Data allocated by av_malloc() to be used as packet data. If this
+ *        function returns successfully, the data is owned by the underlying AVBuffer.
+ *        The caller may not access the data through other means.
+ * @param size size of data in bytes, without the padding. I.e. the full buffer
+ *        size is assumed to be size + AV_INPUT_BUFFER_PADDING_SIZE.
+ *
+ * @return 0 on success, a negative AVERROR on error
+ */
+int av_packet_from_data(AVPacket *pkt, uint8_t *data, int size);
+
+#if FF_API_AVPACKET_OLD_API
+/**
+ * @warning This is a hack - the packet memory allocation stuff is broken. The
+ * packet is allocated if it was not really allocated.
+ *
+ * @deprecated Use av_packet_ref or av_packet_make_refcounted
+ */
+attribute_deprecated
+int av_dup_packet(AVPacket *pkt);
+/**
+ * Copy packet, including contents
+ *
+ * @return 0 on success, negative AVERROR on fail
+ *
+ * @deprecated Use av_packet_ref
+ */
+attribute_deprecated
+int av_copy_packet(AVPacket *dst, const AVPacket *src);
+
+/**
+ * Copy packet side data
+ *
+ * @return 0 on success, negative AVERROR on fail
+ *
+ * @deprecated Use av_packet_copy_props
+ */
+attribute_deprecated
+int av_copy_packet_side_data(AVPacket *dst, const AVPacket *src);
+
+/**
+ * Free a packet.
+ *
+ * @deprecated Use av_packet_unref
+ *
+ * @param pkt packet to free
+ */
+attribute_deprecated
+void av_free_packet(AVPacket *pkt);
+#endif
+/**
+ * Allocate new information of a packet.
+ *
+ * @param pkt packet
+ * @param type side information type
+ * @param size side information size
+ * @return pointer to fresh allocated data or NULL otherwise
+ */
+uint8_t* av_packet_new_side_data(AVPacket *pkt, enum AVPacketSideDataType type,
+                                 int size);
+
+/**
+ * Wrap an existing array as a packet side data.
+ *
+ * @param pkt packet
+ * @param type side information type
+ * @param data the side data array. It must be allocated with the av_malloc()
+ *             family of functions. The ownership of the data is transferred to
+ *             pkt.
+ * @param size side information size
+ * @return a non-negative number on success, a negative AVERROR code on
+ *         failure. On failure, the packet is unchanged and the data remains
+ *         owned by the caller.
+ */
+int av_packet_add_side_data(AVPacket *pkt, enum AVPacketSideDataType type,
+                            uint8_t *data, size_t size);
+
+/**
+ * Shrink the already allocated side data buffer
+ *
+ * @param pkt packet
+ * @param type side information type
+ * @param size new side information size
+ * @return 0 on success, < 0 on failure
+ */
+int av_packet_shrink_side_data(AVPacket *pkt, enum AVPacketSideDataType type,
+                               int size);
+
+/**
+ * Get side information from packet.
+ *
+ * @param pkt packet
+ * @param type desired side information type
+ * @param size pointer for side information size to store (optional)
+ * @return pointer to data if present or NULL otherwise
+ */
+uint8_t* av_packet_get_side_data(const AVPacket *pkt, enum AVPacketSideDataType type,
+                                 int *size);
+
+#if FF_API_MERGE_SD_API
+attribute_deprecated
+int av_packet_merge_side_data(AVPacket *pkt);
+
+attribute_deprecated
+int av_packet_split_side_data(AVPacket *pkt);
+#endif
+
+const char *av_packet_side_data_name(enum AVPacketSideDataType type);
+
+/**
+ * Pack a dictionary for use in side_data.
+ *
+ * @param dict The dictionary to pack.
+ * @param size pointer to store the size of the returned data
+ * @return pointer to data if successful, NULL otherwise
+ */
+uint8_t *av_packet_pack_dictionary(AVDictionary *dict, int *size);
+/**
+ * Unpack a dictionary from side_data.
+ *
+ * @param data data from side_data
+ * @param size size of the data
+ * @param dict the metadata storage dictionary
+ * @return 0 on success, < 0 on failure
+ */
+int av_packet_unpack_dictionary(const uint8_t *data, int size, AVDictionary **dict);
+
+
+/**
+ * Convenience function to free all the side data stored.
+ * All the other fields stay untouched.
+ *
+ * @param pkt packet
+ */
+void av_packet_free_side_data(AVPacket *pkt);
+
+/**
+ * Setup a new reference to the data described by a given packet
+ *
+ * If src is reference-counted, setup dst as a new reference to the
+ * buffer in src. Otherwise allocate a new buffer in dst and copy the
+ * data from src into it.
+ *
+ * All the other fields are copied from src.
+ *
+ * @see av_packet_unref
+ *
+ * @param dst Destination packet. Will be completely overwritten.
+ * @param src Source packet
+ *
+ * @return 0 on success, a negative AVERROR on error. On error, dst
+ *         will be blank (as if returned by av_packet_alloc()).
+ */
+int av_packet_ref(AVPacket *dst, const AVPacket *src);
+
+/**
+ * Wipe the packet.
+ *
+ * Unreference the buffer referenced by the packet and reset the
+ * remaining packet fields to their default values.
+ *
+ * @param pkt The packet to be unreferenced.
+ */
+void av_packet_unref(AVPacket *pkt);
+
+/**
+ * Move every field in src to dst and reset src.
+ *
+ * @see av_packet_unref
+ *
+ * @param src Source packet, will be reset
+ * @param dst Destination packet
+ */
+void av_packet_move_ref(AVPacket *dst, AVPacket *src);
+
+/**
+ * Copy only "properties" fields from src to dst.
+ *
+ * Properties for the purpose of this function are all the fields
+ * beside those related to the packet data (buf, data, size)
+ *
+ * @param dst Destination packet
+ * @param src Source packet
+ *
+ * @return 0 on success AVERROR on failure.
+ */
+int av_packet_copy_props(AVPacket *dst, const AVPacket *src);
+
+/**
+ * Ensure the data described by a given packet is reference counted.
+ *
+ * @note This function does not ensure that the reference will be writable.
+ *       Use av_packet_make_writable instead for that purpose.
+ *
+ * @see av_packet_ref
+ * @see av_packet_make_writable
+ *
+ * @param pkt packet whose data should be made reference counted.
+ *
+ * @return 0 on success, a negative AVERROR on error. On failure, the
+ *         packet is unchanged.
+ */
+int av_packet_make_refcounted(AVPacket *pkt);
+
+/**
+ * Create a writable reference for the data described by a given packet,
+ * avoiding data copy if possible.
+ *
+ * @param pkt Packet whose data should be made writable.
+ *
+ * @return 0 on success, a negative AVERROR on failure. On failure, the
+ *         packet is unchanged.
+ */
+int av_packet_make_writable(AVPacket *pkt);
+
+/**
+ * Convert valid timing fields (timestamps / durations) in a packet from one
+ * timebase to another. Timestamps with unknown values (AV_NOPTS_VALUE) will be
+ * ignored.
+ *
+ * @param pkt packet on which the conversion will be performed
+ * @param tb_src source timebase, in which the timing fields in pkt are
+ *               expressed
+ * @param tb_dst destination timebase, to which the timing fields will be
+ *               converted
+ */
+void av_packet_rescale_ts(AVPacket *pkt, AVRational tb_src, AVRational tb_dst);
+
+/**
+ * @}
+ */
+
+#endif // AVCODEC_PACKET_H
diff --git a/libavcodec/pafvideo.c b/libavcodec/pafvideo.c
index 7c5861d..07fa05c 100644
--- a/libavcodec/pafvideo.c
+++ b/libavcodec/pafvideo.c
@@ -55,6 +55,7 @@
 
     int current_frame;
     uint8_t *frame[4];
+    int dirty[4];
     int frame_size;
     int video_size;
 
@@ -187,6 +188,7 @@
             j      = bytestream2_get_le16(&c->gb) + offset;
             if (bytestream2_get_bytes_left(&c->gb) < (j - offset) * 16)
                 return AVERROR_INVALIDDATA;
+            c->dirty[page] = 1;
             do {
                 offset++;
                 if (dst + 3 * c->width + 4 > dend)
@@ -285,13 +287,14 @@
         return AVERROR_INVALIDDATA;
     }
 
-    if ((ret = ff_reget_buffer(avctx, c->pic)) < 0)
+    if ((code & 0xF) == 0 &&
+        c->video_size / 32 - (int64_t)bytestream2_get_bytes_left(&c->gb) > c->video_size / 32 * (int64_t)avctx->discard_damaged_percentage / 100)
+        return AVERROR_INVALIDDATA;
+
+    if ((ret = ff_reget_buffer(avctx, c->pic, 0)) < 0)
         return ret;
 
     if (code & 0x20) {  // frame is keyframe
-        for (i = 0; i < 4; i++)
-            memset(c->frame[i], 0, c->frame_size);
-
         memset(c->pic->data[1], 0, AVPALETTE_SIZE);
         c->current_frame  = 0;
         c->pic->key_frame = 1;
@@ -328,6 +331,14 @@
         c->pic->palette_has_changed = 1;
     }
 
+    c->dirty[c->current_frame] = 1;
+    if (code & 0x20)
+        for (i = 0; i < 4; i++) {
+            if (c->dirty[i])
+                memset(c->frame[i], 0, c->frame_size);
+            c->dirty[i] = 0;
+        }
+
     switch (code & 0x0F) {
     case 0:
         /* Block-based motion compensation using 4x4 blocks with either
diff --git a/libavcodec/parser.c b/libavcodec/parser.c
index 0a994a3..a63f532 100644
--- a/libavcodec/parser.c
+++ b/libavcodec/parser.c
@@ -245,6 +245,9 @@
     for (; pc->overread > 0; pc->overread--)
         pc->buffer[pc->index++] = pc->buffer[pc->overread_index++];
 
+    if (next > *buf_size)
+        return AVERROR(EINVAL);
+
     /* flush remaining if EOF */
     if (!*buf_size && next == END_NOT_FOUND)
         next = 0;
@@ -292,6 +295,10 @@
         *buf      = pc->buffer;
     }
 
+    if (next < -8) {
+        pc->overread += -8 - next;
+        next = -8;
+    }
     /* store overread bytes */
     for (; next < 0; next++) {
         pc->state   = pc->state   << 8 | pc->buffer[pc->last_index + next];
diff --git a/libavcodec/parsers.c b/libavcodec/parsers.c
index f01cad4..9fbf182 100644
--- a/libavcodec/parsers.c
+++ b/libavcodec/parsers.c
@@ -40,7 +40,9 @@
 extern AVCodecParser ff_dvdsub_parser;
 extern AVCodecParser ff_dvd_nav_parser;
 extern AVCodecParser ff_flac_parser;
+extern AVCodecParser ff_g723_1_parser;
 extern AVCodecParser ff_g729_parser;
+extern AVCodecParser ff_gif_parser;
 extern AVCodecParser ff_gsm_parser;
 extern AVCodecParser ff_h261_parser;
 extern AVCodecParser ff_h263_parser;
@@ -64,6 +66,7 @@
 extern AVCodecParser ff_vp3_parser;
 extern AVCodecParser ff_vp8_parser;
 extern AVCodecParser ff_vp9_parser;
+extern AVCodecParser ff_webp_parser;
 extern AVCodecParser ff_xma_parser;
 
 #include "libavcodec/parser_list.c"
diff --git a/libavcodec/pcm-dvdenc.c b/libavcodec/pcm-dvdenc.c
new file mode 100644
index 0000000..d26eaf0
--- /dev/null
+++ b/libavcodec/pcm-dvdenc.c
@@ -0,0 +1,197 @@
+/*
+ * LPCM codecs for PCM formats found in Video DVD streams
+ * Copyright (c) 2018 Paul B Mahol
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "avcodec.h"
+#include "bytestream.h"
+#include "internal.h"
+
+typedef struct PCMDVDContext {
+    uint8_t header[3];       // Header added to every frame
+    int block_size;          // Size of a block of samples in bytes
+    int samples_per_block;   // Number of samples per channel per block
+    int groups_per_block;    // Number of 20/24-bit sample groups per block
+    uint8_t *extra_samples;  // Pointer to leftover samples from a frame
+    int extra_sample_count;  // Number of leftover samples in the buffer
+} PCMDVDContext;
+
+static av_cold int pcm_dvd_encode_init(AVCodecContext *avctx)
+{
+    PCMDVDContext *s = avctx->priv_data;
+    int quant, freq, frame_size;
+
+    switch (avctx->sample_rate) {
+    case 48000:
+        freq = 0;
+        break;
+    case 96000:
+        freq = 1;
+        break;
+    }
+
+    switch (avctx->sample_fmt) {
+    case AV_SAMPLE_FMT_S16:
+        avctx->bits_per_coded_sample = 16;
+        quant = 0;
+        break;
+    case AV_SAMPLE_FMT_S32:
+        avctx->bits_per_coded_sample = 24;
+        quant = 2;
+        break;
+    }
+
+    avctx->bits_per_coded_sample = 16 + quant * 4;
+    avctx->block_align           = avctx->channels * avctx->bits_per_coded_sample / 8;
+    avctx->bit_rate              = avctx->block_align * 8LL * avctx->sample_rate;
+    if (avctx->bit_rate > 9800000) {
+        av_log(avctx, AV_LOG_ERROR, "Too big bitrate: reduce sample rate, bitdepth or channels.\n");
+        return AVERROR(EINVAL);
+    }
+
+    if (avctx->sample_fmt == AV_SAMPLE_FMT_S16) {
+        s->samples_per_block = 1;
+        s->block_size        = avctx->channels * 2;
+        frame_size           = 2008 / s->block_size;
+    } else {
+        switch (avctx->channels) {
+        case 1:
+        case 2:
+        case 4:
+            /* one group has all the samples needed */
+            s->block_size        = 4 * avctx->bits_per_coded_sample / 8;
+            s->samples_per_block = 4 / avctx->channels;
+            s->groups_per_block  = 1;
+            break;
+        case 8:
+            /* two groups have all the samples needed */
+            s->block_size        = 8 * avctx->bits_per_coded_sample / 8;
+            s->samples_per_block = 1;
+            s->groups_per_block  = 2;
+            break;
+        default:
+            /* need avctx->channels groups */
+            s->block_size        = 4 * avctx->channels *
+                                   avctx->bits_per_coded_sample / 8;
+            s->samples_per_block = 4;
+            s->groups_per_block  = avctx->channels;
+            break;
+        }
+
+        frame_size = FFALIGN(2008 / s->block_size, s->samples_per_block);
+    }
+
+    s->header[0] = 0x0c;
+    s->header[1] = (quant << 6) | (freq << 4) | (avctx->channels - 1);
+    s->header[2] = 0x80;
+
+    if (!avctx->frame_size)
+        avctx->frame_size = frame_size;
+
+    return 0;
+}
+
+static int pcm_dvd_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
+                                const AVFrame *frame, int *got_packet_ptr)
+{
+    PCMDVDContext *s = avctx->priv_data;
+    int samples = frame->nb_samples * avctx->channels;
+    int64_t pkt_size = (frame->nb_samples / s->samples_per_block) * s->block_size + 3;
+    int blocks = (pkt_size - 3) / s->block_size;
+    const int16_t *src16;
+    const int32_t *src32;
+    PutByteContext pb;
+    int ret;
+
+    if ((ret = ff_alloc_packet2(avctx, avpkt, pkt_size, 0)) < 0)
+        return ret;
+
+    memcpy(avpkt->data, s->header, 3);
+
+    src16 = (const int16_t *)frame->data[0];
+    src32 = (const int32_t *)frame->data[0];
+
+    bytestream2_init_writer(&pb, avpkt->data + 3, avpkt->size - 3);
+
+    switch (avctx->sample_fmt) {
+    case AV_SAMPLE_FMT_S16:
+        do {
+            bytestream2_put_be16(&pb, *src16++);
+        } while (--samples);
+        break;
+    case AV_SAMPLE_FMT_S32:
+        if (avctx->channels == 1) {
+            do {
+                for (int i = 2; i; i--) {
+                    bytestream2_put_be16(&pb, src32[0] >> 16);
+                    bytestream2_put_be16(&pb, src32[1] >> 16);
+                    bytestream2_put_byte(&pb, (*src32++) >> 24);
+                    bytestream2_put_byte(&pb, (*src32++) >> 24);
+                }
+            } while (--blocks);
+        } else {
+            do {
+                for (int i = s->groups_per_block; i; i--) {
+                    bytestream2_put_be16(&pb, src32[0] >> 16);
+                    bytestream2_put_be16(&pb, src32[1] >> 16);
+                    bytestream2_put_be16(&pb, src32[2] >> 16);
+                    bytestream2_put_be16(&pb, src32[3] >> 16);
+                    bytestream2_put_byte(&pb, (*src32++) >> 24);
+                    bytestream2_put_byte(&pb, (*src32++) >> 24);
+                    bytestream2_put_byte(&pb, (*src32++) >> 24);
+                    bytestream2_put_byte(&pb, (*src32++) >> 24);
+                }
+            } while (--blocks);
+        }
+        break;
+    }
+
+    avpkt->pts      = frame->pts;
+    avpkt->size     = pkt_size;
+    avpkt->duration = ff_samples_to_time_base(avctx, frame->nb_samples);
+    *got_packet_ptr = 1;
+
+    return 0;
+}
+
+static av_cold int pcm_dvd_encode_close(AVCodecContext *avctx)
+{
+    return 0;
+}
+
+AVCodec ff_pcm_dvd_encoder = {
+    .name           = "pcm_dvd",
+    .long_name      = NULL_IF_CONFIG_SMALL("PCM signed 16|20|24-bit big-endian for DVD media"),
+    .type           = AVMEDIA_TYPE_AUDIO,
+    .id             = AV_CODEC_ID_PCM_DVD,
+    .priv_data_size = sizeof(PCMDVDContext),
+    .init           = pcm_dvd_encode_init,
+    .close          = pcm_dvd_encode_close,
+    .encode2        = pcm_dvd_encode_frame,
+    .capabilities   = AV_CODEC_CAP_SMALL_LAST_FRAME,
+    .supported_samplerates = (const int[]) { 48000, 96000, 0},
+    .channel_layouts = (const uint64_t[]) { AV_CH_LAYOUT_MONO,
+                                            AV_CH_LAYOUT_STEREO,
+                                            AV_CH_LAYOUT_5POINT1,
+                                            AV_CH_LAYOUT_7POINT1,
+                                            0 },
+    .sample_fmts    = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_S16,
+                                                     AV_SAMPLE_FMT_S32,
+                                                     AV_SAMPLE_FMT_NONE },
+};
diff --git a/libavcodec/pcm.c b/libavcodec/pcm.c
index 8c326c6..96a68f7 100644
--- a/libavcodec/pcm.c
+++ b/libavcodec/pcm.c
@@ -42,6 +42,9 @@
     case AV_CODEC_ID_PCM_MULAW:
         pcm_ulaw_tableinit();
         break;
+    case AV_CODEC_ID_PCM_VIDC:
+        pcm_vidc_tableinit();
+        break;
     default:
         break;
     }
@@ -216,6 +219,12 @@
             *dst++ = linear_to_ulaw[(v + 32768) >> 2];
         }
         break;
+    case AV_CODEC_ID_PCM_VIDC:
+        for (; n > 0; n--) {
+            v      = *samples++;
+            *dst++ = linear_to_vidc[(v + 32768) >> 2];
+        }
+        break;
     default:
         return -1;
     }
@@ -249,8 +258,15 @@
         for (i = 0; i < 256; i++)
             s->table[i] = ulaw2linear(i);
         break;
+    case AV_CODEC_ID_PCM_VIDC:
+        for (i = 0; i < 256; i++)
+            s->table[i] = vidc2linear(i);
+        break;
     case AV_CODEC_ID_PCM_F16LE:
     case AV_CODEC_ID_PCM_F24LE:
+        if (avctx->bits_per_coded_sample < 1 || avctx->bits_per_coded_sample > 24)
+            return AVERROR_INVALIDDATA;
+
         s->scale = 1. / (1 << (avctx->bits_per_coded_sample - 1));
         s->fdsp = avpriv_float_dsp_alloc(0);
         if (!s->fdsp)
@@ -287,23 +303,23 @@
  * @param shift  Bitshift (bits)
  * @param offset Sample value offset
  */
-#define DECODE(size, endian, src, dst, n, shift, offset)                \
-    for (; n > 0; n--) {                                                \
-        uint ## size ## _t v = bytestream_get_ ## endian(&src);         \
-        AV_WN ## size ## A(dst, (v - offset) << shift);                 \
-        dst += size / 8;                                                \
+#define DECODE(size, endian, src, dst, n, shift, offset)                       \
+    for (; n > 0; n--) {                                                       \
+        uint ## size ## _t v = bytestream_get_ ## endian(&src);                \
+        AV_WN ## size ## A(dst, (uint ## size ## _t)(v - offset) << shift);    \
+        dst += size / 8;                                                       \
     }
 
-#define DECODE_PLANAR(size, endian, src, dst, n, shift, offset)         \
-    n /= avctx->channels;                                               \
-    for (c = 0; c < avctx->channels; c++) {                             \
-        int i;                                                          \
-        dst = frame->extended_data[c];                                \
-        for (i = n; i > 0; i--) {                                       \
-            uint ## size ## _t v = bytestream_get_ ## endian(&src);     \
-            AV_WN ## size ## A(dst, (v - offset) << shift);             \
-            dst += size / 8;                                            \
-        }                                                               \
+#define DECODE_PLANAR(size, endian, src, dst, n, shift, offset)                \
+    n /= avctx->channels;                                                      \
+    for (c = 0; c < avctx->channels; c++) {                                    \
+        int i;                                                                 \
+        dst = frame->extended_data[c];                                         \
+        for (i = n; i > 0; i--) {                                              \
+            uint ## size ## _t v = bytestream_get_ ## endian(&src);            \
+            AV_WN ## size ## A(dst, (uint ## size ##_t)(v - offset) << shift); \
+            dst += size / 8;                                                   \
+        }                                                                      \
     }
 
 static int pcm_decode_frame(AVCodecContext *avctx, void *data,
@@ -475,16 +491,9 @@
             bytestream_get_buffer(&src, samples, n * sample_size);
         }
         break;
-    case AV_CODEC_ID_PCM_ZORK:
-        for (; n > 0; n--) {
-            int v = *src++;
-            if (v < 128)
-                v = 128 - v;
-            *samples++ = v;
-        }
-        break;
     case AV_CODEC_ID_PCM_ALAW:
     case AV_CODEC_ID_PCM_MULAW:
+    case AV_CODEC_ID_PCM_VIDC:
         for (; n > 0; n--) {
             AV_WN16A(samples, s->table[*src++]);
             samples += 2;
@@ -498,13 +507,13 @@
             dst_int32_t = (int32_t *)frame->extended_data[c];
             for (i = 0; i < n; i++) {
                 // extract low 20 bits and expand to 32 bits
-                *dst_int32_t++ =  (src[2]         << 28) |
+                *dst_int32_t++ =  ((uint32_t)src[2]<<28) |
                                   (src[1]         << 20) |
                                   (src[0]         << 12) |
                                  ((src[2] & 0x0F) <<  8) |
                                    src[1];
                 // extract high 20 bits and expand to 32 bits
-                *dst_int32_t++ =  (src[4]         << 24) |
+                *dst_int32_t++ =  ((uint32_t)src[4]<<24) |
                                   (src[3]         << 16) |
                                  ((src[2] & 0xF0) <<  8) |
                                   (src[4]         <<  4) |
@@ -609,6 +618,6 @@
 PCM_CODEC  (PCM_U24LE,        AV_SAMPLE_FMT_S32, pcm_u24le,        "PCM unsigned 24-bit little-endian");
 PCM_CODEC  (PCM_U32BE,        AV_SAMPLE_FMT_S32, pcm_u32be,        "PCM unsigned 32-bit big-endian");
 PCM_CODEC  (PCM_U32LE,        AV_SAMPLE_FMT_S32, pcm_u32le,        "PCM unsigned 32-bit little-endian");
-PCM_DECODER(PCM_ZORK,         AV_SAMPLE_FMT_U8,  pcm_zork,         "PCM Zork");
 PCM_CODEC  (PCM_S64BE,        AV_SAMPLE_FMT_S64, pcm_s64be,        "PCM signed 64-bit big-endian");
 PCM_CODEC  (PCM_S64LE,        AV_SAMPLE_FMT_S64, pcm_s64le,        "PCM signed 64-bit little-endian");
+PCM_CODEC  (PCM_VIDC,         AV_SAMPLE_FMT_S16, pcm_vidc,         "PCM Archimedes VIDC");
diff --git a/libavcodec/pcm_tablegen.c b/libavcodec/pcm_tablegen.c
index bf8e7fb..473a47f 100644
--- a/libavcodec/pcm_tablegen.c
+++ b/libavcodec/pcm_tablegen.c
@@ -29,11 +29,13 @@
 {
     pcm_alaw_tableinit();
     pcm_ulaw_tableinit();
+    pcm_vidc_tableinit();
 
     write_fileheader();
 
     WRITE_ARRAY("static const", uint8_t, linear_to_alaw);
     WRITE_ARRAY("static const", uint8_t, linear_to_ulaw);
+    WRITE_ARRAY("static const", uint8_t, linear_to_vidc);
 
     return 0;
 }
diff --git a/libavcodec/pcm_tablegen.h b/libavcodec/pcm_tablegen.h
index 7ce147f..7274c3c 100644
--- a/libavcodec/pcm_tablegen.h
+++ b/libavcodec/pcm_tablegen.h
@@ -36,47 +36,69 @@
 
 #define         BIAS            (0x84)      /* Bias for linear code. */
 
+#define         VIDC_SIGN_BIT    (1)
+#define         VIDC_QUANT_MASK  (0x1E)
+#define         VIDC_QUANT_SHIFT (1)
+#define         VIDC_SEG_SHIFT   (5)
+#define         VIDC_SEG_MASK    (0xE0)
+
 /* alaw2linear() - Convert an A-law value to 16-bit linear PCM */
 static av_cold int alaw2linear(unsigned char a_val)
 {
-        int t;
-        int seg;
+    int t;
+    int seg;
 
-        a_val ^= 0x55;
+    a_val ^= 0x55;
 
-        t = a_val & QUANT_MASK;
-        seg = ((unsigned)a_val & SEG_MASK) >> SEG_SHIFT;
-        if(seg) t= (t + t + 1 + 32) << (seg + 2);
-        else    t= (t + t + 1     ) << 3;
+    t = a_val & QUANT_MASK;
+    seg = ((unsigned)a_val & SEG_MASK) >> SEG_SHIFT;
+    if(seg) t= (t + t + 1 + 32) << (seg + 2);
+    else    t= (t + t + 1     ) << 3;
 
-        return (a_val & SIGN_BIT) ? t : -t;
+    return (a_val & SIGN_BIT) ? t : -t;
 }
 
 static av_cold int ulaw2linear(unsigned char u_val)
 {
-        int t;
+    int t;
 
-        /* Complement to obtain normal u-law value. */
-        u_val = ~u_val;
+    /* Complement to obtain normal u-law value. */
+    u_val = ~u_val;
 
-        /*
-         * Extract and bias the quantization bits. Then
-         * shift up by the segment number and subtract out the bias.
-         */
-        t = ((u_val & QUANT_MASK) << 3) + BIAS;
-        t <<= ((unsigned)u_val & SEG_MASK) >> SEG_SHIFT;
+    /*
+     * Extract and bias the quantization bits. Then
+     * shift up by the segment number and subtract out the bias.
+     */
+    t = ((u_val & QUANT_MASK) << 3) + BIAS;
+    t <<= ((unsigned)u_val & SEG_MASK) >> SEG_SHIFT;
 
-        return (u_val & SIGN_BIT) ? (BIAS - t) : (t - BIAS);
+    return (u_val & SIGN_BIT) ? (BIAS - t) : (t - BIAS);
+}
+
+static av_cold int vidc2linear(unsigned char u_val)
+{
+    int t;
+
+    /*
+     * Extract and bias the quantization bits. Then
+     * shift up by the segment number and subtract out the bias.
+     */
+    t = (((u_val & VIDC_QUANT_MASK) >> VIDC_QUANT_SHIFT) << 3) + BIAS;
+    t <<= ((unsigned)u_val & VIDC_SEG_MASK) >> VIDC_SEG_SHIFT;
+
+    return (u_val & VIDC_SIGN_BIT) ? (BIAS - t) : (t - BIAS);
 }
 
 #if CONFIG_HARDCODED_TABLES
 #define pcm_alaw_tableinit()
 #define pcm_ulaw_tableinit()
+#define pcm_vidc_tableinit()
 #include "libavcodec/pcm_tables.h"
 #else
 /* 16384 entries per table */
 static uint8_t linear_to_alaw[16384];
 static uint8_t linear_to_ulaw[16384];
+static uint8_t linear_to_vidc[16384];
 
 static av_cold void build_xlaw_table(uint8_t *linear_to_xlaw,
                              int (*xlaw2linear)(unsigned char),
@@ -111,6 +133,11 @@
 {
     build_xlaw_table(linear_to_ulaw, ulaw2linear, 0xff);
 }
+
+static void pcm_vidc_tableinit(void)
+{
+    build_xlaw_table(linear_to_vidc, vidc2linear, 0xff);
+}
 #endif /* CONFIG_HARDCODED_TABLES */
 
 #endif /* AVCODEC_PCM_TABLEGEN_H */
diff --git a/libavcodec/pgssubdec.c b/libavcodec/pgssubdec.c
index b897d72..9c59a22 100644
--- a/libavcodec/pgssubdec.c
+++ b/libavcodec/pgssubdec.c
@@ -614,7 +614,7 @@
     return 1;
 }
 
-static int decode(AVCodecContext *avctx, void *data, int *data_size,
+static int decode(AVCodecContext *avctx, void *data, int *got_sub_ptr,
                   AVPacket *avpkt)
 {
     const uint8_t *buf = avpkt->data;
@@ -636,7 +636,7 @@
     if (i & 15)
         ff_dlog(avctx, "\n");
 
-    *data_size = 0;
+    *got_sub_ptr = 0;
 
     /* Ensure that we have received at a least a segment code and segment length */
     if (buf_size < 3)
@@ -676,9 +676,14 @@
              */
             break;
         case DISPLAY_SEGMENT:
+            if (*got_sub_ptr) {
+                av_log(avctx, AV_LOG_ERROR, "Duplicate display segment\n");
+                ret = AVERROR_INVALIDDATA;
+                break;
+            }
             ret = display_end_segment(avctx, data, buf, segment_length);
             if (ret >= 0)
-                *data_size = ret;
+                *got_sub_ptr = ret;
             break;
         default:
             av_log(avctx, AV_LOG_ERROR, "Unknown subtitle segment type 0x%x, length %d\n",
@@ -686,8 +691,11 @@
             ret = AVERROR_INVALIDDATA;
             break;
         }
-        if (ret < 0 && (avctx->err_recognition & AV_EF_EXPLODE))
+        if (ret < 0 && (avctx->err_recognition & AV_EF_EXPLODE)) {
+            avsubtitle_free(data);
+            *got_sub_ptr = 0;
             return ret;
+        }
 
         buf += segment_length;
     }
diff --git a/libavcodec/pictordec.c b/libavcodec/pictordec.c
index b29a484..6340902 100644
--- a/libavcodec/pictordec.c
+++ b/libavcodec/pictordec.c
@@ -63,29 +63,51 @@
     uint8_t *d;
     int shift = *plane * bits_per_plane;
     unsigned mask  = ((1U << bits_per_plane) - 1) << shift;
+    int xl = *x;
+    int yl = *y;
+    int planel = *plane;
+    int pixels_per_value = 8/bits_per_plane;
     value   <<= shift;
 
+    d = frame->data[0] + yl * frame->linesize[0];
     while (run > 0) {
         int j;
         for (j = 8-bits_per_plane; j >= 0; j -= bits_per_plane) {
-            d = frame->data[0] + *y * frame->linesize[0];
-            d[*x] |= (value >> j) & mask;
-            *x += 1;
-            if (*x == s->width) {
-                *y -= 1;
-                *x = 0;
-                if (*y < 0) {
-                   *y = s->height - 1;
-                   *plane += 1;
-                   if (*plane >= s->nb_planes)
-                       return;
+            d[xl] |= (value >> j) & mask;
+            xl += 1;
+            while (xl == s->width) {
+                yl -= 1;
+                xl = 0;
+                if (yl < 0) {
+                   yl = s->height - 1;
+                   planel += 1;
+                   if (planel >= s->nb_planes)
+                       goto end;
                    value <<= bits_per_plane;
                    mask  <<= bits_per_plane;
                 }
+                d = frame->data[0] + yl * frame->linesize[0];
+                if (s->nb_planes == 1 &&
+                    run*pixels_per_value >= s->width &&
+                    pixels_per_value < s->width &&
+                    s->width % pixels_per_value == 0
+                    ) {
+                    for (; xl < pixels_per_value; xl ++) {
+                        j = (j < bits_per_plane ? 8 : j) - bits_per_plane;
+                        d[xl] |= (value >> j) & mask;
+                    }
+                    av_memcpy_backptr(d+xl, pixels_per_value, s->width - xl);
+                    run -= s->width / pixels_per_value;
+                    xl = s->width;
+                }
             }
         }
         run--;
     }
+end:
+    *x = xl;
+    *y = yl;
+    *plane = planel;
 }
 
 static const uint8_t cga_mode45_index[6][4] = {
@@ -236,6 +258,9 @@
             }
         }
 
+        if (s->nb_planes - plane > 1)
+            return AVERROR_INVALIDDATA;
+
         if (plane < s->nb_planes && x < avctx->width) {
             int run = (y + 1) * avctx->width - x;
             if (bits_per_plane == 8)
diff --git a/libavcodec/pixlet.c b/libavcodec/pixlet.c
index 03a2cda..7b068b1 100644
--- a/libavcodec/pixlet.c
+++ b/libavcodec/pixlet.c
@@ -675,28 +675,12 @@
     return pktsize;
 }
 
-#if HAVE_THREADS
-static int pixlet_init_thread_copy(AVCodecContext *avctx)
-{
-    PixletContext *ctx = avctx->priv_data;
-
-    ctx->filter[0]  = NULL;
-    ctx->filter[1]  = NULL;
-    ctx->prediction = NULL;
-    ctx->w = 0;
-    ctx->h = 0;
-
-    return 0;
-}
-#endif /* HAVE_THREADS */
-
 AVCodec ff_pixlet_decoder = {
     .name             = "pixlet",
     .long_name        = NULL_IF_CONFIG_SMALL("Apple Pixlet"),
     .type             = AVMEDIA_TYPE_VIDEO,
     .id               = AV_CODEC_ID_PIXLET,
     .init             = pixlet_init,
-    .init_thread_copy = ONLY_IF_THREADS_ENABLED(pixlet_init_thread_copy),
     .close            = pixlet_close,
     .decode           = pixlet_decode_frame,
     .priv_data_size   = sizeof(PixletContext),
diff --git a/libavcodec/pngdec.c b/libavcodec/pngdec.c
index 0114468..67bfc41 100644
--- a/libavcodec/pngdec.c
+++ b/libavcodec/pngdec.c
@@ -24,6 +24,7 @@
 #include "libavutil/avassert.h"
 #include "libavutil/bprint.h"
 #include "libavutil/imgutils.h"
+#include "libavutil/intreadwrite.h"
 #include "libavutil/stereo3d.h"
 #include "libavutil/mastering_display_metadata.h"
 
@@ -319,6 +320,15 @@
 YUV2RGB(rgb8, uint8_t)
 YUV2RGB(rgb16, uint16_t)
 
+static int percent_missing(PNGDecContext *s)
+{
+    if (s->interlace_type) {
+        return 100 - 100 * s->pass / (NB_PASSES - 1);
+    } else {
+        return 100 - 100 * s->y / s->cur_h;
+    }
+}
+
 /* process exactly one decompressed row */
 static void png_handle_row(PNGDecContext *s)
 {
@@ -423,7 +433,7 @@
             s->zstream.next_out  = s->crow_buf;
         }
         if (ret == Z_STREAM_END && s->zstream.avail_in > 0) {
-            av_log(NULL, AV_LOG_WARNING,
+            av_log(s->avctx, AV_LOG_WARNING,
                    "%d undecompressed bytes left in buffer\n", s->zstream.avail_in);
             return 0;
         }
@@ -578,6 +588,10 @@
     }
     s->color_type       = bytestream2_get_byte(&s->gb);
     s->compression_type = bytestream2_get_byte(&s->gb);
+    if (s->compression_type) {
+        av_log(avctx, AV_LOG_ERROR, "Invalid compression method %d\n", s->compression_type);
+        goto error;
+    }
     s->filter_type      = bytestream2_get_byte(&s->gb);
     s->interlace_type   = bytestream2_get_byte(&s->gb);
     bytestream2_skip(&s->gb, 4); /* crc */
@@ -1272,8 +1286,10 @@
         case MKTAG('s', 'T', 'E', 'R'): {
             int mode = bytestream2_get_byte(&s->gb);
             AVStereo3D *stereo3d = av_stereo3d_create_side_data(p);
-            if (!stereo3d)
+            if (!stereo3d) {
+                ret = AVERROR(ENOMEM);
                 goto fail;
+            }
 
             if (mode == 0 || mode == 1) {
                 stereo3d->type  = AV_STEREO3D_SIDEBYSIDE;
@@ -1286,7 +1302,7 @@
             break;
         }
         case MKTAG('i', 'C', 'C', 'P'): {
-            if (decode_iccp_chunk(s, length, p) < 0)
+            if ((ret = decode_iccp_chunk(s, length, p)) < 0)
                 goto fail;
             break;
         }
@@ -1349,6 +1365,9 @@
         return 0;
     }
 
+    if (percent_missing(s) > avctx->discard_damaged_percentage)
+        return AVERROR_INVALIDDATA;
+
     if (s->bits_per_pixel <= 4)
         handle_small_bpp(s, p);
 
@@ -1363,15 +1382,35 @@
         for (y = 0; y < s->height; ++y) {
             uint8_t *row = &s->image_buf[s->image_linesize * y];
 
-            /* since we're updating in-place, we have to go from right to left */
-            for (x = s->width; x > 0; --x) {
-                uint8_t *pixel = &row[s->bpp * (x - 1)];
-                memmove(pixel, &row[raw_bpp * (x - 1)], raw_bpp);
+            if (s->bpp == 2 && byte_depth == 1) {
+                uint8_t *pixel = &row[2 * s->width - 1];
+                uint8_t *rowp  = &row[1 * s->width - 1];
+                int tcolor = s->transparent_color_be[0];
+                for (x = s->width; x > 0; --x) {
+                    *pixel-- = *rowp == tcolor ? 0 : 0xff;
+                    *pixel-- = *rowp--;
+                }
+            } else if (s->bpp == 4 && byte_depth == 1) {
+                uint8_t *pixel = &row[4 * s->width - 1];
+                uint8_t *rowp  = &row[3 * s->width - 1];
+                int tcolor = AV_RL24(s->transparent_color_be);
+                for (x = s->width; x > 0; --x) {
+                    *pixel-- = AV_RL24(rowp-2) == tcolor ? 0 : 0xff;
+                    *pixel-- = *rowp--;
+                    *pixel-- = *rowp--;
+                    *pixel-- = *rowp--;
+                }
+            } else {
+                /* since we're updating in-place, we have to go from right to left */
+                for (x = s->width; x > 0; --x) {
+                    uint8_t *pixel = &row[s->bpp * (x - 1)];
+                    memmove(pixel, &row[raw_bpp * (x - 1)], raw_bpp);
 
-                if (!memcmp(pixel, s->transparent_color_be, raw_bpp)) {
-                    memset(&pixel[raw_bpp], 0, byte_depth);
-                } else {
-                    memset(&pixel[raw_bpp], 0xff, byte_depth);
+                    if (!memcmp(pixel, s->transparent_color_be, raw_bpp)) {
+                        memset(&pixel[raw_bpp], 0, byte_depth);
+                    } else {
+                        memset(&pixel[raw_bpp], 0xff, byte_depth);
+                    }
                 }
             }
         }
@@ -1387,6 +1426,9 @@
             if (CONFIG_PNG_DECODER && avctx->codec_id != AV_CODEC_ID_APNG)
                 handle_p_frame_png(s, p);
             else if (CONFIG_APNG_DECODER &&
+                     s->previous_picture.f->width == p->width  &&
+                     s->previous_picture.f->height== p->height &&
+                     s->previous_picture.f->format== p->format &&
                      avctx->codec_id == AV_CODEC_ID_APNG &&
                      (ret = handle_p_frame_apng(avctx, s, p)) < 0)
                 goto fail;
@@ -1521,6 +1563,146 @@
 }
 #endif
 
+#if CONFIG_LSCR_DECODER
+static int decode_frame_lscr(AVCodecContext *avctx,
+                             void *data, int *got_frame,
+                             AVPacket *avpkt)
+{
+    PNGDecContext *const s = avctx->priv_data;
+    GetByteContext *gb = &s->gb;
+    AVFrame *frame = data;
+    int ret, nb_blocks, offset = 0;
+
+    if (avpkt->size < 2)
+        return AVERROR_INVALIDDATA;
+
+    bytestream2_init(gb, avpkt->data, avpkt->size);
+
+    if ((ret = ff_get_buffer(avctx, frame, AV_GET_BUFFER_FLAG_REF)) < 0)
+        return ret;
+
+    nb_blocks = bytestream2_get_le16(gb);
+    if (bytestream2_get_bytes_left(gb) < 2 + nb_blocks * (12 + 8))
+        return AVERROR_INVALIDDATA;
+
+    if (s->last_picture.f->data[0]) {
+        ret = av_frame_copy(frame, s->last_picture.f);
+        if (ret < 0)
+            return ret;
+    }
+
+    for (int b = 0; b < nb_blocks; b++) {
+        int x, y, x2, y2, w, h, left;
+        uint32_t csize, size;
+
+        s->zstream.zalloc = ff_png_zalloc;
+        s->zstream.zfree  = ff_png_zfree;
+        s->zstream.opaque = NULL;
+
+        if ((ret = inflateInit(&s->zstream)) != Z_OK) {
+            av_log(avctx, AV_LOG_ERROR, "inflateInit returned error %d\n", ret);
+            ret = AVERROR_EXTERNAL;
+            goto end;
+        }
+
+        bytestream2_seek(gb, 2 + b * 12, SEEK_SET);
+
+        x = bytestream2_get_le16(gb);
+        y = bytestream2_get_le16(gb);
+        x2 = bytestream2_get_le16(gb);
+        y2 = bytestream2_get_le16(gb);
+        s->width  = s->cur_w = w = x2-x;
+        s->height = s->cur_h = h = y2-y;
+
+        if (w <= 0 || x < 0 || x >= avctx->width || w + x > avctx->width ||
+            h <= 0 || y < 0 || y >= avctx->height || h + y > avctx->height) {
+            ret = AVERROR_INVALIDDATA;
+            goto end;
+        }
+
+        size = bytestream2_get_le32(gb);
+
+        frame->key_frame = (nb_blocks == 1) &&
+                           (w == avctx->width) &&
+                           (h == avctx->height) &&
+                           (x == 0) && (y == 0);
+
+        bytestream2_seek(gb, 2 + nb_blocks * 12 + offset, SEEK_SET);
+        csize = bytestream2_get_be32(gb);
+        if (bytestream2_get_le32(gb) != MKTAG('I', 'D', 'A', 'T')) {
+            ret = AVERROR_INVALIDDATA;
+            goto end;
+        }
+
+        offset += size;
+        left = size;
+
+        s->y                 = 0;
+        s->row_size          = w * 3;
+
+        av_fast_padded_malloc(&s->buffer, &s->buffer_size, s->row_size + 16);
+        if (!s->buffer) {
+            ret = AVERROR(ENOMEM);
+            goto end;
+        }
+
+        av_fast_padded_malloc(&s->last_row, &s->last_row_size, s->row_size);
+        if (!s->last_row) {
+            ret = AVERROR(ENOMEM);
+            goto end;
+        }
+
+        s->crow_size         = w * 3 + 1;
+        s->crow_buf          = s->buffer + 15;
+        s->zstream.avail_out = s->crow_size;
+        s->zstream.next_out  = s->crow_buf;
+        s->image_buf         = frame->data[0] + (avctx->height - y - 1) * frame->linesize[0] + x * 3;
+        s->image_linesize    =-frame->linesize[0];
+        s->bpp               = 3;
+        s->pic_state         = 0;
+
+        while (left > 16) {
+            ret = png_decode_idat(s, csize);
+            if (ret < 0)
+                goto end;
+            left -= csize + 16;
+            if (left > 16) {
+                bytestream2_skip(gb, 4);
+                csize = bytestream2_get_be32(gb);
+                if (bytestream2_get_le32(gb) != MKTAG('I', 'D', 'A', 'T')) {
+                    ret = AVERROR_INVALIDDATA;
+                    goto end;
+                }
+            }
+        }
+
+        inflateEnd(&s->zstream);
+    }
+
+    frame->pict_type = frame->key_frame ? AV_PICTURE_TYPE_I : AV_PICTURE_TYPE_P;
+
+    av_frame_unref(s->last_picture.f);
+    if ((ret = av_frame_ref(s->last_picture.f, frame)) < 0)
+        return ret;
+
+    *got_frame = 1;
+end:
+    inflateEnd(&s->zstream);
+
+    if (ret < 0)
+        return ret;
+    return avpkt->size;
+}
+
+static void decode_flush(AVCodecContext *avctx)
+{
+    PNGDecContext *s = avctx->priv_data;
+
+    av_frame_unref(s->last_picture.f);
+}
+
+#endif
+
 #if HAVE_THREADS
 static int update_thread_context(AVCodecContext *dst, const AVCodecContext *src)
 {
@@ -1577,6 +1759,9 @@
 
     avctx->color_range = AVCOL_RANGE_JPEG;
 
+    if (avctx->codec_id == AV_CODEC_ID_LSCR)
+        avctx->pix_fmt = AV_PIX_FMT_BGR24;
+
     s->avctx = avctx;
     s->previous_picture.f = av_frame_alloc();
     s->last_picture.f = av_frame_alloc();
@@ -1588,10 +1773,7 @@
         return AVERROR(ENOMEM);
     }
 
-    if (!avctx->internal->is_copy) {
-        avctx->internal->allocate_progress = 1;
-        ff_pngdsp_init(&s->dsp);
-    }
+    ff_pngdsp_init(&s->dsp);
 
     return 0;
 }
@@ -1626,10 +1808,10 @@
     .init           = png_dec_init,
     .close          = png_dec_end,
     .decode         = decode_frame_apng,
-    .init_thread_copy = ONLY_IF_THREADS_ENABLED(png_dec_init),
     .update_thread_context = ONLY_IF_THREADS_ENABLED(update_thread_context),
     .capabilities   = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_FRAME_THREADS /*| AV_CODEC_CAP_DRAW_HORIZ_BAND*/,
-    .caps_internal  = FF_CODEC_CAP_INIT_THREADSAFE,
+    .caps_internal  = FF_CODEC_CAP_INIT_THREADSAFE |
+                      FF_CODEC_CAP_ALLOCATE_PROGRESS,
 };
 #endif
 
@@ -1643,9 +1825,26 @@
     .init           = png_dec_init,
     .close          = png_dec_end,
     .decode         = decode_frame_png,
-    .init_thread_copy = ONLY_IF_THREADS_ENABLED(png_dec_init),
     .update_thread_context = ONLY_IF_THREADS_ENABLED(update_thread_context),
     .capabilities   = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_FRAME_THREADS /*| AV_CODEC_CAP_DRAW_HORIZ_BAND*/,
-    .caps_internal  = FF_CODEC_CAP_SKIP_FRAME_FILL_PARAM | FF_CODEC_CAP_INIT_THREADSAFE,
+    .caps_internal  = FF_CODEC_CAP_SKIP_FRAME_FILL_PARAM | FF_CODEC_CAP_INIT_THREADSAFE |
+                      FF_CODEC_CAP_ALLOCATE_PROGRESS,
+};
+#endif
+
+#if CONFIG_LSCR_DECODER
+AVCodec ff_lscr_decoder = {
+    .name           = "lscr",
+    .long_name      = NULL_IF_CONFIG_SMALL("LEAD Screen Capture"),
+    .type           = AVMEDIA_TYPE_VIDEO,
+    .id             = AV_CODEC_ID_LSCR,
+    .priv_data_size = sizeof(PNGDecContext),
+    .init           = png_dec_init,
+    .close          = png_dec_end,
+    .decode         = decode_frame_lscr,
+    .flush          = decode_flush,
+    .capabilities   = AV_CODEC_CAP_DR1 /*| AV_CODEC_CAP_DRAW_HORIZ_BAND*/,
+    .caps_internal  = FF_CODEC_CAP_SKIP_FRAME_FILL_PARAM | FF_CODEC_CAP_INIT_THREADSAFE |
+                      FF_CODEC_CAP_ALLOCATE_PROGRESS,
 };
 #endif
diff --git a/libavcodec/pngenc.c b/libavcodec/pngenc.c
index 69b4495..d4d8dc8 100644
--- a/libavcodec/pngenc.c
+++ b/libavcodec/pngenc.c
@@ -748,11 +748,11 @@
     original_bytestream_end = s->bytestream_end;
 
     temp_bytestream = av_malloc(original_bytestream_end - original_bytestream);
-    temp_bytestream_end = temp_bytestream + (original_bytestream_end - original_bytestream);
     if (!temp_bytestream) {
         ret = AVERROR(ENOMEM);
         goto fail;
     }
+    temp_bytestream_end = temp_bytestream + (original_bytestream_end - original_bytestream);
 
     for (last_fctl_chunk.dispose_op = 0; last_fctl_chunk.dispose_op < 3; ++last_fctl_chunk.dispose_op) {
         // 0: APNG_DISPOSE_OP_NONE
diff --git a/libavcodec/pnm.c b/libavcodec/pnm.c
index b06a6e8..b5c2881 100644
--- a/libavcodec/pnm.c
+++ b/libavcodec/pnm.c
@@ -22,6 +22,7 @@
 #include <stdlib.h>
 #include <string.h>
 
+#include "libavutil/avassert.h"
 #include "libavutil/imgutils.h"
 #include "avcodec.h"
 #include "internal.h"
@@ -36,13 +37,15 @@
 {
     char *s;
     int c;
+    uint8_t *bs  = sc->bytestream;
+    const uint8_t *end = sc->bytestream_end;
 
     /* skip spaces and comments */
-    while (sc->bytestream < sc->bytestream_end) {
-        c = *sc->bytestream++;
+    while (bs < end) {
+        c = *bs++;
         if (c == '#')  {
-            while (c != '\n' && sc->bytestream < sc->bytestream_end) {
-                c = *sc->bytestream++;
+            while (c != '\n' && bs < end) {
+                c = *bs++;
             }
         } else if (!pnm_space(c)) {
             break;
@@ -50,12 +53,12 @@
     }
 
     s = str;
-    while (sc->bytestream < sc->bytestream_end && !pnm_space(c)) {
-        if ((s - str)  < buf_size - 1)
-            *s++ = c;
-        c = *sc->bytestream++;
+    while (bs < end && !pnm_space(c) && (s - str) < buf_size - 1) {
+        *s++ = c;
+        c = *bs++;
     }
     *s = '\0';
+    sc->bytestream = bs;
 }
 
 int ff_pnm_decode_header(AVCodecContext *avctx, PNMContext * const s)
@@ -64,9 +67,15 @@
     int h, w, depth, maxval;
     int ret;
 
-    pnm_get(s, buf1, sizeof(buf1));
-    if(buf1[0] != 'P')
+    if (s->bytestream_end - s->bytestream < 3 ||
+        s->bytestream[0] != 'P' ||
+        s->bytestream[1] < '1'  ||
+        s->bytestream[1] > '7') {
+        s->bytestream += s->bytestream_end > s->bytestream;
+        s->bytestream += s->bytestream_end > s->bytestream;
         return AVERROR_INVALIDDATA;
+    }
+    pnm_get(s, buf1, sizeof(buf1));
     s->type= buf1[1]-'0';
 
     if (s->type==1 || s->type==4) {
@@ -108,6 +117,9 @@
                 return AVERROR_INVALIDDATA;
             }
         }
+        if (!pnm_space(s->bytestream[-1]))
+            return AVERROR_INVALIDDATA;
+
         /* check that all tags are present */
         if (w <= 0 || h <= 0 || maxval <= 0 || maxval > UINT16_MAX || depth <= 0 || tuple_type[0] == '\0' ||
             av_image_check_size(w, h, 0, avctx) || s->bytestream >= s->bytestream_end)
@@ -148,7 +160,7 @@
         }
         return 0;
     } else {
-        return AVERROR_INVALIDDATA;
+        av_assert0(0);
     }
     pnm_get(s, buf1, sizeof(buf1));
     w = atoi(buf1);
@@ -188,6 +200,10 @@
         }
     }else
         s->maxval=1;
+
+    if (!pnm_space(s->bytestream[-1]))
+        return AVERROR_INVALIDDATA;
+
     /* more check if YUV420 */
     if (av_pix_fmt_desc_get(avctx->pix_fmt)->flags & AV_PIX_FMT_FLAG_PLANAR) {
         if ((avctx->width & 1) != 0)
diff --git a/libavcodec/pnm_parser.c b/libavcodec/pnm_parser.c
index 9bf1fdc..d19dbfe 100644
--- a/libavcodec/pnm_parser.c
+++ b/libavcodec/pnm_parser.c
@@ -19,24 +19,45 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
+#include "libavutil/avassert.h"
 #include "libavutil/imgutils.h"
 
 #include "parser.h" //for ParseContext
 #include "pnm.h"
 
+typedef struct PNMParseContext {
+    ParseContext pc;
+    int remaining_bytes;
+    int ascii_scan;
+}PNMParseContext;
 
 static int pnm_parse(AVCodecParserContext *s, AVCodecContext *avctx,
                      const uint8_t **poutbuf, int *poutbuf_size,
                      const uint8_t *buf, int buf_size)
 {
-    ParseContext *pc = s->priv_data;
+    PNMParseContext *pnmpc = s->priv_data;
+    ParseContext *pc = &pnmpc->pc;
     PNMContext pnmctx;
-    int next;
+    int next = END_NOT_FOUND;
     int skip = 0;
 
-    for (; pc->overread > 0; pc->overread--) {
-        pc->buffer[pc->index++]= pc->buffer[pc->overread_index++];
+    if (pc->overread > 0) {
+        memmove(pc->buffer + pc->index, pc->buffer + pc->overread_index, pc->overread);
+        pc->index          += pc->overread;
+        pc->overread_index += pc->overread;
+        pc->overread = 0;
     }
+
+    if (pnmpc->remaining_bytes) {
+        int inc = FFMIN(pnmpc->remaining_bytes, buf_size);
+        skip += inc;
+        pnmpc->remaining_bytes -= inc;
+
+        if (!pnmpc->remaining_bytes)
+            next = skip;
+        goto end;
+    }
+
 retry:
     if (pc->index) {
         pnmctx.bytestream_start =
@@ -51,6 +72,7 @@
         if (pnmctx.bytestream < pnmctx.bytestream_end) {
             if (pc->index) {
                 pc->index = 0;
+                pnmpc->ascii_scan = 0;
             } else {
                 unsigned step = FFMAX(1, pnmctx.bytestream - pnmctx.bytestream_start);
 
@@ -58,18 +80,45 @@
             }
             goto retry;
         }
-        next = END_NOT_FOUND;
     } else if (pnmctx.type < 4) {
-        next = END_NOT_FOUND;
+              uint8_t *bs  = pnmctx.bytestream;
+        const uint8_t *end = pnmctx.bytestream_end;
+        uint8_t *sync      = bs;
+
+        if (pc->index) {
+            av_assert0(pnmpc->ascii_scan <= end - bs);
+            bs += pnmpc->ascii_scan;
+        }
+
+        while (bs < end) {
+            int c;
+            sync = bs;
+            c = *bs++;
+            if (c == '#')  {
+                uint8_t *match = memchr(bs, '\n', end-bs);
+                if (match)
+                    bs = match + 1;
+                else
+                    break;
+            } else if (c == 'P') {
+                next = bs - pnmctx.bytestream_start + skip - 1;
+                pnmpc->ascii_scan = 0;
+                break;
+            }
+        }
+        if (next == END_NOT_FOUND)
+            pnmpc->ascii_scan = sync - pnmctx.bytestream + skip;
     } else {
         next = pnmctx.bytestream - pnmctx.bytestream_start + skip
                + av_image_get_buffer_size(avctx->pix_fmt, avctx->width, avctx->height, 1);
-        if (pnmctx.bytestream_start != buf + skip)
-            next -= pc->index;
-        if (next > buf_size)
-            next = END_NOT_FOUND;
     }
-
+    if (next != END_NOT_FOUND && pnmctx.bytestream_start != buf + skip)
+        next -= pc->index;
+    if (next > buf_size) {
+        pnmpc->remaining_bytes = next - buf_size;
+        next = END_NOT_FOUND;
+    }
+end:
     if (ff_combine_frame(pc, next, &buf, &buf_size) < 0) {
         *poutbuf      = NULL;
         *poutbuf_size = 0;
@@ -83,7 +132,7 @@
 AVCodecParser ff_pnm_parser = {
     .codec_ids      = { AV_CODEC_ID_PGM, AV_CODEC_ID_PGMYUV, AV_CODEC_ID_PPM,
                         AV_CODEC_ID_PBM, AV_CODEC_ID_PAM },
-    .priv_data_size = sizeof(ParseContext),
+    .priv_data_size = sizeof(PNMParseContext),
     .parser_parse   = pnm_parse,
     .parser_close   = ff_parse_close,
 };
diff --git a/libavcodec/pnmdec.c b/libavcodec/pnmdec.c
index 958c5e4..dbcaef3 100644
--- a/libavcodec/pnmdec.c
+++ b/libavcodec/pnmdec.c
@@ -143,7 +143,7 @@
                         v = (*s->bytestream++)&1;
                     } else {
                         /* read a sequence of digits */
-                        for (k = 0; k < 5 && c <= 9; k += 1) {
+                        for (k = 0; k < 6 && c <= 9; k += 1) {
                             v = 10*v + c;
                             c = (*s->bytestream++) - '0';
                         }
diff --git a/libavcodec/ppc/h264dsp.c b/libavcodec/ppc/h264dsp.c
index f510544..d8a3baa 100644
--- a/libavcodec/ppc/h264dsp.c
+++ b/libavcodec/ppc/h264dsp.c
@@ -625,7 +625,7 @@
     q1 = newq1;                                                                              \
 }
 
-static void h264_v_loop_filter_luma_altivec(uint8_t *pix, int stride, int alpha, int beta, int8_t *tc0) {
+static void h264_v_loop_filter_luma_altivec(uint8_t *pix, ptrdiff_t stride, int alpha, int beta, int8_t *tc0) {
 
     if ((tc0[0] & tc0[1] & tc0[2] & tc0[3]) >= 0) {
         register vec_u8 p2 = vec_ld(-3*stride, pix);
@@ -642,7 +642,7 @@
     }
 }
 
-static void h264_h_loop_filter_luma_altivec(uint8_t *pix, int stride, int alpha, int beta, int8_t *tc0) {
+static void h264_h_loop_filter_luma_altivec(uint8_t *pix, ptrdiff_t stride, int alpha, int beta, int8_t *tc0) {
 
     register vec_u8 line0, line1, line2, line3, line4, line5;
     if ((tc0[0] & tc0[1] & tc0[2] & tc0[3]) < 0)
diff --git a/libavcodec/ppc/hevcdsp.c b/libavcodec/ppc/hevcdsp.c
index dcae433..c1d562a 100644
--- a/libavcodec/ppc/hevcdsp.c
+++ b/libavcodec/ppc/hevcdsp.c
@@ -58,7 +58,13 @@
     e1 = vec_msums(src_02, trans4[2], zero);
     o1 = vec_msums(src_13, trans4[3], zero);
 
-    add = vec_sl(vec_splat_s32(1), vec_splat_u32(shift - 1));
+    switch(shift) {
+    case  7: add = vec_sl(vec_splat_s32(1), vec_splat_u32( 7 - 1)); break;
+    case 10: add = vec_sl(vec_splat_s32(1), vec_splat_u32(10 - 1)); break;
+    case 12: add = vec_sl(vec_splat_s32(1), vec_splat_u32(12 - 1)); break;
+    default: abort();
+    }
+
     e0 = vec_add(e0, add);
     e1 = vec_add(e1, add);
 
@@ -72,7 +78,14 @@
                                    const int shift)
 {
     int i;
-    vec_u32 v_shift = vec_splat_u32(shift);
+    vec_u32 v_shift;
+
+    switch(shift) {
+    case  7: v_shift = vec_splat_u32(7) ; break;
+    case 10: v_shift = vec_splat_u32(10); break;
+    case 12: v_shift = vec_splat_u32(12); break;
+    default: abort();
+    }
 
     for (i = 0; i < 4; i++)
         res[i] = vec_sra(res[i], v_shift);
diff --git a/libavcodec/profiles.c b/libavcodec/profiles.c
index c31399f..eaf0d68 100644
--- a/libavcodec/profiles.c
+++ b/libavcodec/profiles.c
@@ -151,4 +151,29 @@
     { FF_PROFILE_UNKNOWN },
 };
 
+const AVProfile ff_prores_profiles[] = {
+    { FF_PROFILE_PRORES_PROXY,    "Proxy"    },
+    { FF_PROFILE_PRORES_LT,       "LT"       },
+    { FF_PROFILE_PRORES_STANDARD, "Standard" },
+    { FF_PROFILE_PRORES_HQ,       "HQ"       },
+    { FF_PROFILE_PRORES_4444,     "4444"     },
+    { FF_PROFILE_PRORES_XQ,       "XQ"       },
+    { FF_PROFILE_UNKNOWN }
+};
+
+const AVProfile ff_mjpeg_profiles[] = {
+    { FF_PROFILE_MJPEG_HUFFMAN_BASELINE_DCT,            "Baseline"    },
+    { FF_PROFILE_MJPEG_HUFFMAN_EXTENDED_SEQUENTIAL_DCT, "Sequential"  },
+    { FF_PROFILE_MJPEG_HUFFMAN_PROGRESSIVE_DCT,         "Progressive" },
+    { FF_PROFILE_MJPEG_HUFFMAN_LOSSLESS,                "Lossless"    },
+    { FF_PROFILE_MJPEG_JPEG_LS,                         "JPEG LS"     },
+    { FF_PROFILE_UNKNOWN }
+};
+
+const AVProfile ff_arib_caption_profiles[] = {
+    { FF_PROFILE_ARIB_PROFILE_A, "Profile A" },
+    { FF_PROFILE_ARIB_PROFILE_C, "Profile C" },
+    { FF_PROFILE_UNKNOWN }
+};
+
 #endif /* !CONFIG_SMALL */
diff --git a/libavcodec/profiles.h b/libavcodec/profiles.h
index 9d7e211..a53b67e 100644
--- a/libavcodec/profiles.h
+++ b/libavcodec/profiles.h
@@ -33,5 +33,8 @@
 extern const AVProfile ff_vp9_profiles[];
 extern const AVProfile ff_av1_profiles[];
 extern const AVProfile ff_sbc_profiles[];
+extern const AVProfile ff_prores_profiles[];
+extern const AVProfile ff_mjpeg_profiles[];
+extern const AVProfile ff_arib_caption_profiles[];
 
 #endif /* AVCODEC_PROFILES_H */
diff --git a/libavcodec/prores_metadata_bsf.c b/libavcodec/prores_metadata_bsf.c
new file mode 100644
index 0000000..0510d35
--- /dev/null
+++ b/libavcodec/prores_metadata_bsf.c
@@ -0,0 +1,172 @@
+/*
+ * Prores Metadata bitstream filter
+ * Copyright (c) 2018 Jokyo Images
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file
+ * Prores Metadata bitstream filter
+ * set frame colorspace property
+ */
+
+#include "libavutil/common.h"
+#include "libavutil/intreadwrite.h"
+#include "libavutil/opt.h"
+#include "bsf.h"
+
+typedef struct ProresMetadataContext {
+    const AVClass *class;
+
+    int color_primaries;
+    int transfer_characteristics;
+    int matrix_coefficients;
+} ProresMetadataContext;
+
+static int prores_metadata(AVBSFContext *bsf, AVPacket *pkt)
+{
+    ProresMetadataContext *ctx = bsf->priv_data;
+    int ret = 0;
+    int buf_size;
+    uint8_t *buf;
+
+    ret = ff_bsf_get_packet_ref(bsf, pkt);
+    if (ret < 0)
+        return ret;
+
+    ret = av_packet_make_writable(pkt);
+    if (ret < 0)
+        goto fail;
+
+    buf = pkt->data;
+    buf_size = pkt->size;
+
+    /* check start of the prores frame */
+    if (buf_size < 28) {
+        av_log(bsf, AV_LOG_ERROR, "not enough data in prores frame\n");
+        ret = AVERROR_INVALIDDATA;
+        goto fail;
+    }
+
+    if (AV_RL32(buf + 4) != AV_RL32("icpf")) {
+        av_log(bsf, AV_LOG_ERROR, "invalid frame header\n");
+        ret = AVERROR_INVALIDDATA;
+        goto fail;
+    }
+
+    if (AV_RB16(buf + 8) < 28) {
+        av_log(bsf, AV_LOG_ERROR, "invalid frame header size\n");
+        ret = AVERROR_INVALIDDATA;
+        goto fail;
+    }
+
+    /* set the new values */
+    if (ctx->color_primaries != -1)
+        buf[8+14] = ctx->color_primaries;
+    if (ctx->transfer_characteristics != -1)
+        buf[8+15] = ctx->transfer_characteristics;
+    if (ctx->matrix_coefficients != -1)
+        buf[8+16] = ctx->matrix_coefficients;
+
+fail:
+    if (ret < 0)
+        av_packet_unref(pkt);
+    return ret;
+}
+
+static const enum AVCodecID codec_ids[] = {
+    AV_CODEC_ID_PRORES, AV_CODEC_ID_NONE,
+};
+
+static int prores_metadata_init(AVBSFContext *bsf)
+{
+    ProresMetadataContext *ctx = bsf->priv_data;
+    /*! check options */
+    switch (ctx->color_primaries) {
+    case -1:
+    case 0:
+    case AVCOL_PRI_BT709:
+    case AVCOL_PRI_BT470BG:
+    case AVCOL_PRI_SMPTE170M:
+    case AVCOL_PRI_BT2020:
+    case AVCOL_PRI_SMPTE431:
+    case AVCOL_PRI_SMPTE432:
+        break;
+    default:
+        av_log(bsf, AV_LOG_ERROR, "Color primaries %d is not a valid value\n", ctx->color_primaries);
+        return AVERROR(EINVAL);
+    }
+
+    switch (ctx->matrix_coefficients) {
+    case -1:
+    case 0:
+    case AVCOL_SPC_BT709:
+    case AVCOL_SPC_SMPTE170M:
+    case AVCOL_SPC_BT2020_NCL:
+        break;
+    default:
+        av_log(bsf, AV_LOG_ERROR, "Colorspace %d is not a valid value\n", ctx->matrix_coefficients);
+        return AVERROR(EINVAL);
+    }
+
+    return 0;
+}
+
+#define OFFSET(x) offsetof(ProresMetadataContext, x)
+#define FLAGS (AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_BSF_PARAM)
+static const AVOption options[] = {
+    {"color_primaries", "select color primaries", OFFSET(color_primaries), AV_OPT_TYPE_INT, {.i64=-1}, -1, AVCOL_PRI_SMPTE432, FLAGS, "color_primaries"},
+    {"auto", "keep the same color primaries",  0, AV_OPT_TYPE_CONST, {.i64=-1},                     INT_MIN, INT_MAX, FLAGS, "color_primaries"},
+    {"unknown",                         NULL,  0, AV_OPT_TYPE_CONST, {.i64=0},                      INT_MIN, INT_MAX, FLAGS, "color_primaries"},
+    {"bt709",                           NULL,  0, AV_OPT_TYPE_CONST, {.i64=AVCOL_PRI_BT709},        INT_MIN, INT_MAX, FLAGS, "color_primaries"},
+    {"bt470bg",                         NULL,  0, AV_OPT_TYPE_CONST, {.i64=AVCOL_PRI_BT470BG},      INT_MIN, INT_MAX, FLAGS, "color_primaries"},
+    {"smpte170m",                       NULL,  0, AV_OPT_TYPE_CONST, {.i64=AVCOL_PRI_SMPTE170M},    INT_MIN, INT_MAX, FLAGS, "color_primaries"},
+    {"bt2020",                          NULL,  0, AV_OPT_TYPE_CONST, {.i64=AVCOL_PRI_BT2020},       INT_MIN, INT_MAX, FLAGS, "color_primaries"},
+    {"smpte431",                        NULL,  0, AV_OPT_TYPE_CONST, {.i64=AVCOL_PRI_SMPTE431},     INT_MIN, INT_MAX, FLAGS, "color_primaries"},
+    {"smpte432",                        NULL,  0, AV_OPT_TYPE_CONST, {.i64=AVCOL_PRI_SMPTE432},     INT_MIN, INT_MAX, FLAGS, "color_primaries"},
+
+    {"color_trc", "select color transfer", OFFSET(transfer_characteristics), AV_OPT_TYPE_INT, {.i64=-1}, -1, AVCOL_TRC_BT709, FLAGS, "color_trc"},
+    {"auto", "keep the same color transfer",  0, AV_OPT_TYPE_CONST, {.i64=-1},                               INT_MIN, INT_MAX, FLAGS, "color_trc"},
+    {"unknown",                        NULL,  0, AV_OPT_TYPE_CONST, {.i64=0},                                INT_MIN, INT_MAX, FLAGS, "color_trc"},
+    {"bt709",                          NULL,  0, AV_OPT_TYPE_CONST, {.i64=AVCOL_TRC_BT709},                  INT_MIN, INT_MAX, FLAGS, "color_trc"},
+
+    {"colorspace", "select colorspace", OFFSET(matrix_coefficients), AV_OPT_TYPE_INT, {.i64=-1}, -1,  AVCOL_SPC_BT2020_NCL, FLAGS, "colorspace"},
+    {"auto", "keep the same colorspace",  0, AV_OPT_TYPE_CONST, {.i64=-1},                            INT_MIN, INT_MAX, FLAGS, "colorspace"},
+    {"unknown",                    NULL,  0, AV_OPT_TYPE_CONST, {.i64=0},                             INT_MIN, INT_MAX, FLAGS, "colorspace"},
+    {"bt709",                      NULL,  0, AV_OPT_TYPE_CONST, {.i64=AVCOL_SPC_BT709},               INT_MIN, INT_MAX, FLAGS, "colorspace"},
+    {"smpte170m",                  NULL,  0, AV_OPT_TYPE_CONST, {.i64=AVCOL_SPC_SMPTE170M},           INT_MIN, INT_MAX, FLAGS, "colorspace"},
+    {"bt2020nc",                   NULL,  0, AV_OPT_TYPE_CONST, {.i64=AVCOL_SPC_BT2020_NCL},          INT_MIN, INT_MAX, FLAGS, "colorspace"},
+
+    { NULL },
+};
+
+static const AVClass prores_metadata_class = {
+    .class_name = "prores_metadata_bsf",
+    .item_name  = av_default_item_name,
+    .option     = options,
+    .version    = LIBAVUTIL_VERSION_INT,
+};
+
+const AVBitStreamFilter ff_prores_metadata_bsf = {
+    .name       = "prores_metadata",
+    .init       = prores_metadata_init,
+    .filter     = prores_metadata,
+    .priv_data_size = sizeof(ProresMetadataContext),
+    .priv_class = &prores_metadata_class,
+    .codec_ids  = codec_ids,
+};
diff --git a/libavcodec/proresdec.h b/libavcodec/proresdec.h
index 14ede5d..06e41dd 100644
--- a/libavcodec/proresdec.h
+++ b/libavcodec/proresdec.h
@@ -22,6 +22,7 @@
 #ifndef AVCODEC_PRORESDEC_H
 #define AVCODEC_PRORESDEC_H
 
+#include "get_bits.h"
 #include "blockdsp.h"
 #include "proresdsp.h"
 
@@ -50,6 +51,7 @@
     const uint8_t *scan;
     int first_field;
     int alpha_info;
+    void (*unpack_alpha)(GetBitContext *gb, uint16_t *dst, int num_coeffs, const int num_bits);
 } ProresContext;
 
 #endif /* AVCODEC_PRORESDEC_H */
diff --git a/libavcodec/proresdec2.c b/libavcodec/proresdec2.c
index d818e5d..d5fbfc6 100644
--- a/libavcodec/proresdec2.c
+++ b/libavcodec/proresdec2.c
@@ -33,6 +33,7 @@
 #include "get_bits.h"
 #include "idctdsp.h"
 #include "internal.h"
+#include "profiles.h"
 #include "simple_idct.h"
 #include "proresdec.h"
 #include "proresdata.h"
@@ -45,15 +46,138 @@
         dst[i] = permutation[src[i]];
 }
 
+#define ALPHA_SHIFT_16_TO_10(alpha_val) (alpha_val >> 6)
+#define ALPHA_SHIFT_8_TO_10(alpha_val)  ((alpha_val << 2) | (alpha_val >> 6))
+#define ALPHA_SHIFT_16_TO_12(alpha_val) (alpha_val >> 4)
+#define ALPHA_SHIFT_8_TO_12(alpha_val)  ((alpha_val << 4) | (alpha_val >> 4))
+
+static void inline unpack_alpha(GetBitContext *gb, uint16_t *dst, int num_coeffs,
+                                const int num_bits, const int decode_precision) {
+    const int mask = (1 << num_bits) - 1;
+    int i, idx, val, alpha_val;
+
+    idx       = 0;
+    alpha_val = mask;
+    do {
+        do {
+            if (get_bits1(gb)) {
+                val = get_bits(gb, num_bits);
+            } else {
+                int sign;
+                val  = get_bits(gb, num_bits == 16 ? 7 : 4);
+                sign = val & 1;
+                val  = (val + 2) >> 1;
+                if (sign)
+                    val = -val;
+            }
+            alpha_val = (alpha_val + val) & mask;
+            if (num_bits == 16) {
+                if (decode_precision == 10) {
+                    dst[idx++] = ALPHA_SHIFT_16_TO_10(alpha_val);
+                } else { /* 12b */
+                    dst[idx++] = ALPHA_SHIFT_16_TO_12(alpha_val);
+                }
+            } else {
+                if (decode_precision == 10) {
+                    dst[idx++] = ALPHA_SHIFT_8_TO_10(alpha_val);
+                } else { /* 12b */
+                    dst[idx++] = ALPHA_SHIFT_8_TO_12(alpha_val);
+                }
+            }
+            if (idx >= num_coeffs)
+                break;
+        } while (get_bits_left(gb)>0 && get_bits1(gb));
+        val = get_bits(gb, 4);
+        if (!val)
+            val = get_bits(gb, 11);
+        if (idx + val > num_coeffs)
+            val = num_coeffs - idx;
+        if (num_bits == 16) {
+            for (i = 0; i < val; i++) {
+                if (decode_precision == 10) {
+                    dst[idx++] = ALPHA_SHIFT_16_TO_10(alpha_val);
+                } else { /* 12b */
+                    dst[idx++] = ALPHA_SHIFT_16_TO_12(alpha_val);
+                }
+            }
+        } else {
+            for (i = 0; i < val; i++) {
+                if (decode_precision == 10) {
+                    dst[idx++] = ALPHA_SHIFT_8_TO_10(alpha_val);
+                } else { /* 12b */
+                    dst[idx++] = ALPHA_SHIFT_8_TO_12(alpha_val);
+                }
+            }
+        }
+    } while (idx < num_coeffs);
+}
+
+static void unpack_alpha_10(GetBitContext *gb, uint16_t *dst, int num_coeffs,
+                            const int num_bits)
+{
+    if (num_bits == 16) {
+        unpack_alpha(gb, dst, num_coeffs, 16, 10);
+    } else { /* 8 bits alpha */
+        unpack_alpha(gb, dst, num_coeffs, 8, 10);
+    }
+}
+
+static void unpack_alpha_12(GetBitContext *gb, uint16_t *dst, int num_coeffs,
+                            const int num_bits)
+{
+    if (num_bits == 16) {
+        unpack_alpha(gb, dst, num_coeffs, 16, 12);
+    } else { /* 8 bits alpha */
+        unpack_alpha(gb, dst, num_coeffs, 8, 12);
+    }
+}
+
 static av_cold int decode_init(AVCodecContext *avctx)
 {
+    int ret = 0;
     ProresContext *ctx = avctx->priv_data;
     uint8_t idct_permutation[64];
 
     avctx->bits_per_raw_sample = 10;
 
+    switch (avctx->codec_tag) {
+    case MKTAG('a','p','c','o'):
+        avctx->profile = FF_PROFILE_PRORES_PROXY;
+        break;
+    case MKTAG('a','p','c','s'):
+        avctx->profile = FF_PROFILE_PRORES_LT;
+        break;
+    case MKTAG('a','p','c','n'):
+        avctx->profile = FF_PROFILE_PRORES_STANDARD;
+        break;
+    case MKTAG('a','p','c','h'):
+        avctx->profile = FF_PROFILE_PRORES_HQ;
+        break;
+    case MKTAG('a','p','4','h'):
+        avctx->profile = FF_PROFILE_PRORES_4444;
+        avctx->bits_per_raw_sample = 12;
+        break;
+    case MKTAG('a','p','4','x'):
+        avctx->profile = FF_PROFILE_PRORES_XQ;
+        avctx->bits_per_raw_sample = 12;
+        break;
+    default:
+        avctx->profile = FF_PROFILE_UNKNOWN;
+        av_log(avctx, AV_LOG_WARNING, "Unknown prores profile %d\n", avctx->codec_tag);
+    }
+
+    if (avctx->bits_per_raw_sample == 10) {
+        av_log(avctx, AV_LOG_DEBUG, "Auto bitdepth precision. Use 10b decoding based on codec tag.\n");
+    } else { /* 12b */
+        av_log(avctx, AV_LOG_DEBUG, "Auto bitdepth precision. Use 12b decoding based on codec tag.\n");
+    }
+
     ff_blockdsp_init(&ctx->bdsp, avctx);
-    ff_proresdsp_init(&ctx->prodsp, avctx);
+    ret = ff_proresdsp_init(&ctx->prodsp, avctx);
+    if (ret < 0) {
+        av_log(avctx, AV_LOG_ERROR, "Fail to init proresdsp for bits per raw sample %d\n", avctx->bits_per_raw_sample);
+        return ret;
+    }
 
     ff_init_scantable_permutation(idct_permutation,
                                   ctx->prodsp.idct_permutation_type);
@@ -61,7 +185,15 @@
     permute(ctx->progressive_scan, ff_prores_progressive_scan, idct_permutation);
     permute(ctx->interlaced_scan, ff_prores_interlaced_scan, idct_permutation);
 
-    return 0;
+    if (avctx->bits_per_raw_sample == 10){
+        ctx->unpack_alpha = unpack_alpha_10;
+    } else if (avctx->bits_per_raw_sample == 12){
+        ctx->unpack_alpha = unpack_alpha_12;
+    } else {
+        av_log(avctx, AV_LOG_ERROR, "Fail to set unpack_alpha for bits per raw sample %d\n", avctx->bits_per_raw_sample);
+        return AVERROR_BUG;
+    }
+    return ret;
 }
 
 static int decode_frame_header(ProresContext *ctx, const uint8_t *buf,
@@ -87,10 +219,14 @@
 
     width  = AV_RB16(buf + 8);
     height = AV_RB16(buf + 10);
+
     if (width != avctx->width || height != avctx->height) {
-        av_log(avctx, AV_LOG_ERROR, "picture resolution change: %dx%d -> %dx%d\n",
+        int ret;
+
+        av_log(avctx, AV_LOG_WARNING, "picture resolution change: %dx%d -> %dx%d\n",
                avctx->width, avctx->height, width, height);
-        return AVERROR_PATCHWELCOME;
+        if ((ret = ff_set_dimensions(avctx, width, height)) < 0)
+            return ret;
     }
 
     ctx->frame_type = (buf[12] >> 2) & 3;
@@ -113,9 +249,17 @@
     }
 
     if (ctx->alpha_info) {
-        avctx->pix_fmt = (buf[12] & 0xC0) == 0xC0 ? AV_PIX_FMT_YUVA444P10 : AV_PIX_FMT_YUVA422P10;
+        if (avctx->bits_per_raw_sample == 10) {
+            avctx->pix_fmt = (buf[12] & 0xC0) == 0xC0 ? AV_PIX_FMT_YUVA444P10 : AV_PIX_FMT_YUVA422P10;
+        } else { /* 12b */
+            avctx->pix_fmt = (buf[12] & 0xC0) == 0xC0 ? AV_PIX_FMT_YUVA444P12 : AV_PIX_FMT_YUVA422P12;
+        }
     } else {
-        avctx->pix_fmt = (buf[12] & 0xC0) == 0xC0 ? AV_PIX_FMT_YUV444P10 : AV_PIX_FMT_YUV422P10;
+        if (avctx->bits_per_raw_sample == 10) {
+            avctx->pix_fmt = (buf[12] & 0xC0) == 0xC0 ? AV_PIX_FMT_YUV444P10 : AV_PIX_FMT_YUV422P10;
+        } else { /* 12b */
+            avctx->pix_fmt = (buf[12] & 0xC0) == 0xC0 ? AV_PIX_FMT_YUV444P12 : AV_PIX_FMT_YUV422P12;
+        }
     }
 
     avctx->color_primaries = buf[14];
@@ -436,51 +580,6 @@
     return 0;
 }
 
-static void unpack_alpha(GetBitContext *gb, uint16_t *dst, int num_coeffs,
-                         const int num_bits)
-{
-    const int mask = (1 << num_bits) - 1;
-    int i, idx, val, alpha_val;
-
-    idx       = 0;
-    alpha_val = mask;
-    do {
-        do {
-            if (get_bits1(gb)) {
-                val = get_bits(gb, num_bits);
-            } else {
-                int sign;
-                val  = get_bits(gb, num_bits == 16 ? 7 : 4);
-                sign = val & 1;
-                val  = (val + 2) >> 1;
-                if (sign)
-                    val = -val;
-            }
-            alpha_val = (alpha_val + val) & mask;
-            if (num_bits == 16) {
-                dst[idx++] = alpha_val >> 6;
-            } else {
-                dst[idx++] = (alpha_val << 2) | (alpha_val >> 6);
-            }
-            if (idx >= num_coeffs)
-                break;
-        } while (get_bits_left(gb)>0 && get_bits1(gb));
-        val = get_bits(gb, 4);
-        if (!val)
-            val = get_bits(gb, 11);
-        if (idx + val > num_coeffs)
-            val = num_coeffs - idx;
-        if (num_bits == 16) {
-            for (i = 0; i < val; i++)
-                dst[idx++] = alpha_val >> 6;
-        } else {
-            for (i = 0; i < val; i++)
-                dst[idx++] = (alpha_val << 2) | (alpha_val >> 6);
-
-        }
-    } while (idx < num_coeffs);
-}
-
 /**
  * Decode alpha slice plane.
  */
@@ -500,12 +599,13 @@
     init_get_bits(&gb, buf, buf_size << 3);
 
     if (ctx->alpha_info == 2) {
-        unpack_alpha(&gb, blocks, blocks_per_slice * 4 * 64, 16);
+        ctx->unpack_alpha(&gb, blocks, blocks_per_slice * 4 * 64, 16);
     } else {
-        unpack_alpha(&gb, blocks, blocks_per_slice * 4 * 64, 8);
+        ctx->unpack_alpha(&gb, blocks, blocks_per_slice * 4 * 64, 8);
     }
 
     block = blocks;
+
     for (i = 0; i < 16; i++) {
         memcpy(dst, block, 16 * blocks_per_slice * sizeof(*dst));
         dst   += dst_stride >> 1;
@@ -527,6 +627,7 @@
     LOCAL_ALIGNED_16(int16_t, qmat_chroma_scaled,[64]);
     int mb_x_shift;
     int ret;
+    uint16_t val_no_chroma;
 
     slice->ret = -1;
     //av_log(avctx, AV_LOG_INFO, "slice %d mb width %d mb x %d y %d\n",
@@ -564,7 +665,8 @@
         chroma_stride = pic->linesize[1] << 1;
     }
 
-    if (avctx->pix_fmt == AV_PIX_FMT_YUV444P10 || avctx->pix_fmt == AV_PIX_FMT_YUVA444P10) {
+    if (avctx->pix_fmt == AV_PIX_FMT_YUV444P10 || avctx->pix_fmt == AV_PIX_FMT_YUVA444P10 ||
+        avctx->pix_fmt == AV_PIX_FMT_YUV444P12 || avctx->pix_fmt == AV_PIX_FMT_YUVA444P12) {
         mb_x_shift = 5;
         log2_chroma_blocks_per_mb = 2;
     } else {
@@ -605,10 +707,15 @@
     else {
         size_t mb_max_x = slice->mb_count << (mb_x_shift - 1);
         size_t i, j;
+        if (avctx->bits_per_raw_sample == 10) {
+            val_no_chroma = 511;
+        } else { /* 12b */
+            val_no_chroma = 511 * 4;
+        }
         for (i = 0; i < 16; ++i)
             for (j = 0; j < mb_max_x; ++j) {
-                *(uint16_t*)(dest_u + (i * chroma_stride) + (j << 1)) = 511;
-                *(uint16_t*)(dest_v + (i * chroma_stride) + (j << 1)) = 511;
+                *(uint16_t*)(dest_u + (i * chroma_stride) + (j << 1)) = val_no_chroma;
+                *(uint16_t*)(dest_v + (i * chroma_stride) + (j << 1)) = val_no_chroma;
             }
     }
 
@@ -671,9 +778,6 @@
     buf += frame_hdr_size;
     buf_size -= frame_hdr_size;
 
-    if ((ret = ff_thread_get_buffer(avctx, &tframe, 0)) < 0)
-        return ret;
-
  decode_picture:
     pic_size = decode_picture_header(avctx, buf, buf_size);
     if (pic_size < 0) {
@@ -681,6 +785,10 @@
         return pic_size;
     }
 
+    if (ctx->first_field)
+        if ((ret = ff_thread_get_buffer(avctx, &tframe, 0)) < 0)
+            return ret;
+
     if ((ret = decode_picture(avctx)) < 0) {
         av_log(avctx, AV_LOG_ERROR, "error decoding picture\n");
         return ret;
@@ -699,17 +807,6 @@
     return avpkt->size;
 }
 
-#if HAVE_THREADS
-static int decode_init_thread_copy(AVCodecContext *avctx)
-{
-    ProresContext *ctx = avctx->priv_data;
-
-    ctx->slices = NULL;
-
-    return 0;
-}
-#endif
-
 static av_cold int decode_close(AVCodecContext *avctx)
 {
     ProresContext *ctx = avctx->priv_data;
@@ -726,8 +823,8 @@
     .id             = AV_CODEC_ID_PRORES,
     .priv_data_size = sizeof(ProresContext),
     .init           = decode_init,
-    .init_thread_copy = ONLY_IF_THREADS_ENABLED(decode_init_thread_copy),
     .close          = decode_close,
     .decode         = decode_frame,
     .capabilities   = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_SLICE_THREADS | AV_CODEC_CAP_FRAME_THREADS,
+    .profiles       = NULL_IF_CONFIG_SMALL(ff_prores_profiles),
 };
diff --git a/libavcodec/proresdsp.c b/libavcodec/proresdsp.c
index 5b5ada2..a3c618c 100644
--- a/libavcodec/proresdsp.c
+++ b/libavcodec/proresdsp.c
@@ -27,42 +27,71 @@
 #include "proresdsp.h"
 #include "simple_idct.h"
 
-#define BIAS     (1 << (PRORES_BITS_PER_SAMPLE - 1))           ///< bias value for converting signed pixels into unsigned ones
-#define CLIP_MIN (1 << (PRORES_BITS_PER_SAMPLE - 8))           ///< minimum value for clipping resulting pixels
-#define CLIP_MAX (1 << PRORES_BITS_PER_SAMPLE) - CLIP_MIN - 1  ///< maximum value for clipping resulting pixels
+#define CLIP_MIN (1 << 2)                     ///< minimum value for clipping resulting pixels
+#define CLIP_MAX_10 (1 << 10) - CLIP_MIN - 1  ///< maximum value for clipping resulting pixels
+#define CLIP_MAX_12 (1 << 12) - CLIP_MIN - 1  ///< maximum value for clipping resulting pixels
 
-#define CLIP(x) (av_clip((x), CLIP_MIN, CLIP_MAX))
+#define CLIP_10(x) (av_clip((x), CLIP_MIN, CLIP_MAX_10))
+#define CLIP_12(x) (av_clip((x), CLIP_MIN, CLIP_MAX_12))
 
 /**
  * Add bias value, clamp and output pixels of a slice
  */
-static void put_pixels(uint16_t *dst, ptrdiff_t linesize, const int16_t *in)
-{
+
+static inline void put_pixel(uint16_t *dst, ptrdiff_t linesize, const int16_t *in, int bits_per_raw_sample) {
     int x, y, src_offset, dst_offset;
 
     for (y = 0, dst_offset = 0; y < 8; y++, dst_offset += linesize) {
         for (x = 0; x < 8; x++) {
             src_offset = (y << 3) + x;
 
-            dst[dst_offset + x] = CLIP(in[src_offset]);
+            if (bits_per_raw_sample == 10) {
+                dst[dst_offset + x] = CLIP_10(in[src_offset]);
+            } else {//12b
+                dst[dst_offset + x] = CLIP_12(in[src_offset]);
+            }
         }
     }
 }
 
-static void prores_idct_put_c(uint16_t *out, ptrdiff_t linesize, int16_t *block, const int16_t *qmat)
+static void put_pixels_10(uint16_t *dst, ptrdiff_t linesize, const int16_t *in)
 {
-    ff_prores_idct(block, qmat);
-    put_pixels(out, linesize >> 1, block);
+    put_pixel(dst, linesize, in, 10);
 }
 
-av_cold void ff_proresdsp_init(ProresDSPContext *dsp, AVCodecContext *avctx)
+static void put_pixels_12(uint16_t *dst, ptrdiff_t linesize, const int16_t *in)
 {
-    dsp->idct_put = prores_idct_put_c;
-    dsp->idct_permutation_type = FF_IDCT_PERM_NONE;
+    put_pixel(dst, linesize, in, 12);
+}
+
+static void prores_idct_put_10_c(uint16_t *out, ptrdiff_t linesize, int16_t *block, const int16_t *qmat)
+{
+    ff_prores_idct_10(block, qmat);
+    put_pixels_10(out, linesize >> 1, block);
+}
+
+static void prores_idct_put_12_c(uint16_t *out, ptrdiff_t linesize, int16_t *block, const int16_t *qmat)
+{
+    ff_prores_idct_12(block, qmat);
+    put_pixels_12(out, linesize >> 1, block);
+}
+
+av_cold int ff_proresdsp_init(ProresDSPContext *dsp, AVCodecContext *avctx)
+{
+    if (avctx->bits_per_raw_sample == 10) {
+        dsp->idct_put = prores_idct_put_10_c;
+        dsp->idct_permutation_type = FF_IDCT_PERM_NONE;
+    } else if (avctx->bits_per_raw_sample == 12) {
+        dsp->idct_put = prores_idct_put_12_c;
+        dsp->idct_permutation_type = FF_IDCT_PERM_NONE;
+    } else {
+        return AVERROR_BUG;
+    }
 
     if (ARCH_X86)
         ff_proresdsp_init_x86(dsp, avctx);
 
     ff_init_scantable_permutation(dsp->idct_permutation,
                                   dsp->idct_permutation_type);
+    return 0;
 }
diff --git a/libavcodec/proresdsp.h b/libavcodec/proresdsp.h
index 558fae5..37ba76b 100644
--- a/libavcodec/proresdsp.h
+++ b/libavcodec/proresdsp.h
@@ -27,15 +27,13 @@
 #include <stdint.h>
 #include "avcodec.h"
 
-#define PRORES_BITS_PER_SAMPLE 10 ///< output precision of prores decoder
-
 typedef struct ProresDSPContext {
     int idct_permutation_type;
     uint8_t idct_permutation[64];
     void (*idct_put)(uint16_t *out, ptrdiff_t linesize, int16_t *block, const int16_t *qmat);
 } ProresDSPContext;
 
-void ff_proresdsp_init(ProresDSPContext *dsp, AVCodecContext *avctx);
+int ff_proresdsp_init(ProresDSPContext *dsp, AVCodecContext *avctx);
 
 void ff_proresdsp_init_x86(ProresDSPContext *dsp, AVCodecContext *avctx);
 
diff --git a/libavcodec/proresenc_anatoliy.c b/libavcodec/proresenc_anatoliy.c
index 0516066..11d0502 100644
--- a/libavcodec/proresenc_anatoliy.c
+++ b/libavcodec/proresenc_anatoliy.c
@@ -2,6 +2,7 @@
  * Apple ProRes encoder
  *
  * Copyright (c) 2011 Anatoliy Wasserman
+ * Copyright (c) 2012 Konstantin Shishkov
  *
  * This file is part of FFmpeg.
  *
@@ -23,47 +24,42 @@
 /**
  * @file
  * Apple ProRes encoder (Anatoliy Wasserman version)
- * Known FOURCCs: 'apch' (HQ), 'apcn' (SD), 'apcs' (LT), 'acpo' (Proxy)
+ * Known FOURCCs: 'ap4h' (444), 'apch' (HQ), 'apcn' (422), 'apcs' (LT), 'acpo' (Proxy)
  */
 
+#include "libavutil/opt.h"
 #include "avcodec.h"
 #include "dct.h"
 #include "internal.h"
+#include "profiles.h"
+#include "proresdata.h"
 #include "put_bits.h"
 #include "bytestream.h"
 #include "fdctdsp.h"
 
 #define DEFAULT_SLICE_MB_WIDTH 8
 
-#define FF_PROFILE_PRORES_PROXY     0
-#define FF_PROFILE_PRORES_LT        1
-#define FF_PROFILE_PRORES_STANDARD  2
-#define FF_PROFILE_PRORES_HQ        3
-
 static const AVProfile profiles[] = {
     { FF_PROFILE_PRORES_PROXY,    "apco"},
     { FF_PROFILE_PRORES_LT,       "apcs"},
     { FF_PROFILE_PRORES_STANDARD, "apcn"},
     { FF_PROFILE_PRORES_HQ,       "apch"},
+    { FF_PROFILE_PRORES_4444,     "ap4h"},
+    { FF_PROFILE_PRORES_XQ,       "ap4x"},
     { FF_PROFILE_UNKNOWN }
 };
 
-static const int qp_start_table[4] = { 4, 1, 1, 1 };
-static const int qp_end_table[4]   = { 8, 9, 6, 6 };
-static const int bitrate_table[5]  = { 1000, 2100, 3500, 5400 };
+static const int qp_start_table[6] = {  8, 3, 2, 1, 1, 1};
+static const int qp_end_table[6]   = { 13, 9, 6, 6, 5, 4};
+static const int bitrate_table[6]  = { 1000, 2100, 3500, 5400, 7000, 10000};
 
-static const uint8_t progressive_scan[64] = {
-     0,  1,  8,  9,  2,  3, 10, 11,
-    16, 17, 24, 25, 18, 19, 26, 27,
-     4,  5, 12, 20, 13,  6,  7, 14,
-    21, 28, 29, 22, 15, 23, 30, 31,
-    32, 33, 40, 48, 41, 34, 35, 42,
-    49, 56, 57, 50, 43, 36, 37, 44,
-    51, 58, 59, 52, 45, 38, 39, 46,
-    53, 60, 61, 54, 47, 55, 62, 63
-};
+static const int valid_primaries[9]  = { AVCOL_PRI_RESERVED0, AVCOL_PRI_BT709, AVCOL_PRI_UNSPECIFIED, AVCOL_PRI_BT470BG,
+                                         AVCOL_PRI_SMPTE170M, AVCOL_PRI_BT2020, AVCOL_PRI_SMPTE431, AVCOL_PRI_SMPTE432,INT_MAX };
+static const int valid_trc[4]        = { AVCOL_TRC_RESERVED0, AVCOL_TRC_BT709, AVCOL_TRC_UNSPECIFIED, INT_MAX };
+static const int valid_colorspace[5] = { AVCOL_SPC_BT709, AVCOL_SPC_UNSPECIFIED, AVCOL_SPC_SMPTE170M,
+                                         AVCOL_SPC_BT2020_NCL, INT_MAX };
 
-static const uint8_t QMAT_LUMA[4][64] = {
+static const uint8_t QMAT_LUMA[6][64] = {
     {
          4,  7,  9, 11, 13, 14, 15, 63,
          7,  7, 11, 12, 14, 15, 63, 63,
@@ -100,10 +96,28 @@
          4,  4,  4,  4,  4,  5,  5,  6,
          4,  4,  4,  4,  5,  5,  6,  7,
          4,  4,  4,  4,  5,  6,  7,  7
+    }, { /* 444 */
+        4,  4,  4,  4,  4,  4,  4,  4,
+        4,  4,  4,  4,  4,  4,  4,  4,
+        4,  4,  4,  4,  4,  4,  4,  4,
+        4,  4,  4,  4,  4,  4,  4,  5,
+        4,  4,  4,  4,  4,  4,  5,  5,
+        4,  4,  4,  4,  4,  5,  5,  6,
+        4,  4,  4,  4,  5,  5,  6,  7,
+        4,  4,  4,  4,  5,  6,  7,  7
+    }, { /* 444 XQ */
+        2,  2,  2,  2,  2,  2,  2,  2,
+        2,  2,  2,  2,  2,  2,  2,  2,
+        2,  2,  2,  2,  2,  2,  2,  2,
+        2,  2,  2,  2,  2,  2,  2,  3,
+        2,  2,  2,  2,  2,  2,  3,  3,
+        2,  2,  2,  2,  2,  3,  3,  3,
+        2,  2,  2,  2,  3,  3,  3,  4,
+        2,  2,  2,  2,  3,  3,  4,  4,
     }
 };
 
-static const uint8_t QMAT_CHROMA[4][64] = {
+static const uint8_t QMAT_CHROMA[6][64] = {
     {
          4,  7,  9, 11, 13, 14, 63, 63,
          7,  7, 11, 12, 14, 63, 63, 63,
@@ -140,18 +154,45 @@
          4,  4,  4,  4,  4,  5,  5,  6,
          4,  4,  4,  4,  5,  5,  6,  7,
          4,  4,  4,  4,  5,  6,  7,  7
+    }, { /* 444 */
+        4,  4,  4,  4,  4,  4,  4,  4,
+        4,  4,  4,  4,  4,  4,  4,  4,
+        4,  4,  4,  4,  4,  4,  4,  4,
+        4,  4,  4,  4,  4,  4,  4,  5,
+        4,  4,  4,  4,  4,  4,  5,  5,
+        4,  4,  4,  4,  4,  5,  5,  6,
+        4,  4,  4,  4,  5,  5,  6,  7,
+        4,  4,  4,  4,  5,  6,  7,  7
+    }, { /* 444 xq */
+        4,  4,  4,  4,  4,  4,  4,  4,
+        4,  4,  4,  4,  4,  4,  4,  4,
+        4,  4,  4,  4,  4,  4,  4,  4,
+        4,  4,  4,  4,  4,  4,  4,  5,
+        4,  4,  4,  4,  4,  4,  5,  5,
+        4,  4,  4,  4,  4,  5,  5,  6,
+        4,  4,  4,  4,  5,  5,  6,  7,
+        4,  4,  4,  4,  5,  6,  7,  7
     }
 };
 
 
 typedef struct {
+    AVClass *class;
     FDCTDSPContext fdsp;
     uint8_t* fill_y;
     uint8_t* fill_u;
     uint8_t* fill_v;
+    uint8_t* fill_a;
 
     int qmat_luma[16][64];
     int qmat_chroma[16][64];
+    const uint8_t *scantable;
+
+    int is_422;
+    int need_alpha;
+    int is_interlaced;
+
+    char *vendor;
 } ProresContext;
 
 static void encode_codeword(PutBitContext *pb, int val, int codebook)
@@ -183,7 +224,7 @@
 }
 
 #define QSCALE(qmat,ind,val) ((val) / ((qmat)[ind]))
-#define TO_GOLOMB(val) (((val) << 1) ^ ((val) >> 31))
+#define TO_GOLOMB(val) (((val) * 2) ^ ((val) >> 31))
 #define DIFF_SIGN(val, sign) (((val) >> 31) ^ (sign))
 #define IS_NEGATIVE(val) ((((val) >> 31) ^ -1) + 1)
 #define TO_GOLOMB2(val,sign) ((val)==0 ? 0 : ((val) << 1) + (sign))
@@ -229,15 +270,15 @@
 static const uint8_t lev_to_cb[10] = { 0x04, 0x0A, 0x05, 0x06, 0x04, 0x28,
         0x28, 0x28, 0x28, 0x4C };
 
-static void encode_ac_coeffs(AVCodecContext *avctx, PutBitContext *pb,
-        int16_t *in, int blocks_per_slice, int *qmat)
+static void encode_ac_coeffs(PutBitContext *pb,
+        int16_t *in, int blocks_per_slice, int *qmat, const uint8_t ff_prores_scan[64])
 {
     int prev_run = 4;
     int prev_level = 2;
 
     int run = 0, level, code, i, j;
     for (i = 1; i < 64; i++) {
-        int indp = progressive_scan[i];
+        int indp = ff_prores_scan[i];
         for (j = 0; j < blocks_per_slice; j++) {
             int val = QSCALE(qmat, indp, in[(j << 6) + indp]);
             if (val) {
@@ -278,81 +319,190 @@
     fdsp->fdct(block);
 }
 
-static int encode_slice_plane(AVCodecContext *avctx, int mb_count,
-        uint8_t *src, int src_stride, uint8_t *buf, unsigned buf_size,
-        int *qmat, int chroma)
+static void calc_plane_dct(FDCTDSPContext *fdsp, uint8_t *src, int16_t * blocks, int src_stride, int mb_count, int chroma, int is_422)
 {
-    ProresContext* ctx = avctx->priv_data;
-    FDCTDSPContext *fdsp = &ctx->fdsp;
-    LOCAL_ALIGNED(16, int16_t, blocks, [DEFAULT_SLICE_MB_WIDTH << 8]);
     int16_t *block;
-    int i, blocks_per_slice;
-    PutBitContext pb;
+    int i;
 
     block = blocks;
-    for (i = 0; i < mb_count; i++) {
-        fdct_get(fdsp, src,                  src_stride, block + (0 << 6));
-        fdct_get(fdsp, src + 8 * src_stride, src_stride, block + ((2 - chroma) << 6));
-        if (!chroma) {
+
+    if (!chroma) { /* Luma plane */
+        for (i = 0; i < mb_count; i++) {
+            fdct_get(fdsp, src,                       src_stride, block + (0 << 6));
             fdct_get(fdsp, src + 16,                  src_stride, block + (1 << 6));
+            fdct_get(fdsp, src +      8 * src_stride, src_stride, block + (2 << 6));
             fdct_get(fdsp, src + 16 + 8 * src_stride, src_stride, block + (3 << 6));
+
+            block += 256;
+            src   += 32;
         }
+    } else if (chroma && is_422){ /* chroma plane 422 */
+        for (i = 0; i < mb_count; i++) {
+            fdct_get(fdsp, src,                  src_stride, block + (0 << 6));
+            fdct_get(fdsp, src + 8 * src_stride, src_stride, block + (1 << 6));
+            block += (256 >> 1);
+            src   += (32  >> 1);
+        }
+    } else { /* chroma plane 444 */
+        for (i = 0; i < mb_count; i++) {
+            fdct_get(fdsp, src,                       src_stride, block + (0 << 6));
+            fdct_get(fdsp, src +      8 * src_stride, src_stride, block + (1 << 6));
+            fdct_get(fdsp, src + 16,                  src_stride, block + (2 << 6));
+            fdct_get(fdsp, src + 16 + 8 * src_stride, src_stride, block + (3 << 6));
 
-        block += (256 >> chroma);
-        src   += (32  >> chroma);
+            block += 256;
+            src   += 32;
+        }
     }
+}
 
-    blocks_per_slice = mb_count << (2 - chroma);
+static int encode_slice_plane(int16_t *blocks, int mb_count, uint8_t *buf, unsigned buf_size, int *qmat, int sub_sample_chroma,
+                              const uint8_t ff_prores_scan[64])
+{
+    int blocks_per_slice;
+    PutBitContext pb;
+
+    blocks_per_slice = mb_count << (2 - sub_sample_chroma);
     init_put_bits(&pb, buf, buf_size);
 
     encode_dc_coeffs(&pb, blocks, blocks_per_slice, qmat);
-    encode_ac_coeffs(avctx, &pb, blocks, blocks_per_slice, qmat);
+    encode_ac_coeffs(&pb, blocks, blocks_per_slice, qmat, ff_prores_scan);
 
     flush_put_bits(&pb);
     return put_bits_ptr(&pb) - pb.buf;
 }
 
 static av_always_inline unsigned encode_slice_data(AVCodecContext *avctx,
-        uint8_t *dest_y, uint8_t *dest_u, uint8_t *dest_v, int luma_stride,
-        int chroma_stride, unsigned mb_count, uint8_t *buf, unsigned data_size,
-        unsigned* y_data_size, unsigned* u_data_size, unsigned* v_data_size,
-        int qp)
+                                                   int16_t * blocks_y, int16_t * blocks_u, int16_t * blocks_v,
+                                                   unsigned mb_count, uint8_t *buf, unsigned data_size,
+                                                   unsigned* y_data_size, unsigned* u_data_size, unsigned* v_data_size,
+                                                   int qp)
 {
     ProresContext* ctx = avctx->priv_data;
 
-    *y_data_size = encode_slice_plane(avctx, mb_count, dest_y, luma_stride,
-            buf, data_size, ctx->qmat_luma[qp - 1], 0);
+    *y_data_size = encode_slice_plane(blocks_y, mb_count,
+                                      buf, data_size, ctx->qmat_luma[qp - 1], 0, ctx->scantable);
 
     if (!(avctx->flags & AV_CODEC_FLAG_GRAY)) {
-        *u_data_size = encode_slice_plane(avctx, mb_count, dest_u,
-                chroma_stride, buf + *y_data_size, data_size - *y_data_size,
-                ctx->qmat_chroma[qp - 1], 1);
+        *u_data_size = encode_slice_plane(blocks_u, mb_count, buf + *y_data_size, data_size - *y_data_size,
+                                          ctx->qmat_chroma[qp - 1], ctx->is_422, ctx->scantable);
 
-        *v_data_size = encode_slice_plane(avctx, mb_count, dest_v,
-                chroma_stride, buf + *y_data_size + *u_data_size,
-                data_size - *y_data_size - *u_data_size,
-                ctx->qmat_chroma[qp - 1], 1);
+        *v_data_size = encode_slice_plane(blocks_v, mb_count, buf + *y_data_size + *u_data_size,
+                                          data_size - *y_data_size - *u_data_size,
+                                          ctx->qmat_chroma[qp - 1], ctx->is_422, ctx->scantable);
     }
 
     return *y_data_size + *u_data_size + *v_data_size;
 }
 
-static void subimage_with_fill(uint16_t *src, unsigned x, unsigned y,
-        unsigned stride, unsigned width, unsigned height, uint16_t *dst,
-        unsigned dst_width, unsigned dst_height)
+static void put_alpha_diff(PutBitContext *pb, int cur, int prev)
 {
+    const int abits = 16;
+    const int dbits = 7;
+    const int dsize = 1 << dbits - 1;
+    int diff = cur - prev;
 
+    diff = av_mod_uintp2(diff, abits);
+    if (diff >= (1 << abits) - dsize)
+        diff -= 1 << abits;
+    if (diff < -dsize || diff > dsize || !diff) {
+        put_bits(pb, 1, 1);
+        put_bits(pb, abits, diff);
+    } else {
+        put_bits(pb, 1, 0);
+        put_bits(pb, dbits - 1, FFABS(diff) - 1);
+        put_bits(pb, 1, diff < 0);
+    }
+}
+
+static inline void put_alpha_run(PutBitContext *pb, int run)
+{
+    if (run) {
+        put_bits(pb, 1, 0);
+        if (run < 0x10)
+            put_bits(pb, 4, run);
+        else
+            put_bits(pb, 15, run);
+    } else {
+        put_bits(pb, 1, 1);
+    }
+}
+
+static av_always_inline int encode_alpha_slice_data(AVCodecContext *avctx, int8_t * src_a,
+                                                   unsigned mb_count, uint8_t *buf, unsigned data_size, unsigned* a_data_size)
+{
+    const int abits = 16;
+    const int mask  = (1 << abits) - 1;
+    const int num_coeffs = mb_count * 256;
+    int prev = mask, cur;
+    int idx = 0;
+    int run = 0;
+    int16_t * blocks = (int16_t *)src_a;
+    PutBitContext pb;
+    init_put_bits(&pb, buf, data_size);
+
+    cur = blocks[idx++];
+    put_alpha_diff(&pb, cur, prev);
+    prev = cur;
+    do {
+        cur = blocks[idx++];
+        if (cur != prev) {
+            put_alpha_run (&pb, run);
+            put_alpha_diff(&pb, cur, prev);
+            prev = cur;
+            run  = 0;
+        } else {
+            run++;
+        }
+    } while (idx < num_coeffs);
+    if (run)
+        put_alpha_run(&pb, run);
+    flush_put_bits(&pb);
+    *a_data_size = put_bits_count(&pb) >> 3;
+
+    if (put_bits_left(&pb) < 0) {
+        av_log(avctx, AV_LOG_ERROR,
+               "Underestimated required buffer size.\n");
+        return AVERROR_BUG;
+    } else {
+        return 0;
+    }
+}
+
+static inline void subimage_with_fill_template(uint16_t *src, unsigned x, unsigned y,
+                                               unsigned stride, unsigned width, unsigned height, uint16_t *dst,
+                                               unsigned dst_width, unsigned dst_height, int is_alpha_plane,
+                                               int is_interlaced, int is_top_field)
+{
     int box_width = FFMIN(width - x, dst_width);
-    int box_height = FFMIN(height - y, dst_height);
-    int i, j, src_stride = stride >> 1;
+    int i, j, src_stride, box_height;
     uint16_t last_pix, *last_line;
 
-    src += y * src_stride + x;
+    if (!is_interlaced) {
+        src_stride = stride >> 1;
+        src += y * src_stride + x;
+        box_height = FFMIN(height - y, dst_height);
+    } else {
+        src_stride = stride; /* 2 lines stride */
+        src += y * src_stride + x;
+        box_height = FFMIN(height/2 - y, dst_height);
+        if (!is_top_field)
+            src += stride >> 1;
+    }
+
     for (i = 0; i < box_height; ++i) {
         for (j = 0; j < box_width; ++j) {
-            dst[j] = src[j];
+            if (!is_alpha_plane) {
+                dst[j] = src[j];
+            } else {
+                dst[j] = src[j] << 6; /* alpha 10b to 16b */
+            }
         }
-        last_pix = dst[j - 1];
+        if (!is_alpha_plane) {
+            last_pix = dst[j - 1];
+        } else {
+            last_pix = dst[j - 1] << 6; /* alpha 10b to 16b */
+        }
         for (; j < dst_width; j++)
             dst[j] = last_pix;
         src += src_stride;
@@ -367,64 +517,113 @@
     }
 }
 
+static void subimage_with_fill(uint16_t *src, unsigned x, unsigned y,
+        unsigned stride, unsigned width, unsigned height, uint16_t *dst,
+        unsigned dst_width, unsigned dst_height, int is_interlaced, int is_top_field)
+{
+    subimage_with_fill_template(src, x, y, stride, width, height, dst, dst_width, dst_height, 0, is_interlaced, is_top_field);
+}
+
+/* reorganize alpha data and convert 10b -> 16b */
+static void subimage_alpha_with_fill(uint16_t *src, unsigned x, unsigned y,
+                               unsigned stride, unsigned width, unsigned height, uint16_t *dst,
+                               unsigned dst_width, unsigned dst_height, int is_interlaced, int is_top_field)
+{
+    subimage_with_fill_template(src, x, y, stride, width, height, dst, dst_width, dst_height, 1, is_interlaced, is_top_field);
+}
+
 static int encode_slice(AVCodecContext *avctx, const AVFrame *pic, int mb_x,
         int mb_y, unsigned mb_count, uint8_t *buf, unsigned data_size,
-        int unsafe, int *qp)
+        int unsafe, int *qp, int is_interlaced, int is_top_field)
 {
-    int luma_stride, chroma_stride;
-    int hdr_size = 6, slice_size;
-    uint8_t *dest_y, *dest_u, *dest_v;
-    unsigned y_data_size = 0, u_data_size = 0, v_data_size = 0;
+    int luma_stride, chroma_stride, alpha_stride = 0;
     ProresContext* ctx = avctx->priv_data;
+    int hdr_size = 6 + (ctx->need_alpha * 2); /* v data size is write when there is alpha */
+    int ret = 0, slice_size;
+    uint8_t *dest_y, *dest_u, *dest_v;
+    unsigned y_data_size = 0, u_data_size = 0, v_data_size = 0, a_data_size = 0;
+    FDCTDSPContext *fdsp = &ctx->fdsp;
     int tgt_bits   = (mb_count * bitrate_table[avctx->profile]) >> 2;
     int low_bytes  = (tgt_bits - (tgt_bits >> 3)) >> 3; // 12% bitrate fluctuation
     int high_bytes = (tgt_bits + (tgt_bits >> 3)) >> 3;
 
+    LOCAL_ALIGNED(16, int16_t, blocks_y, [DEFAULT_SLICE_MB_WIDTH << 8]);
+    LOCAL_ALIGNED(16, int16_t, blocks_u, [DEFAULT_SLICE_MB_WIDTH << 8]);
+    LOCAL_ALIGNED(16, int16_t, blocks_v, [DEFAULT_SLICE_MB_WIDTH << 8]);
+
     luma_stride   = pic->linesize[0];
     chroma_stride = pic->linesize[1];
 
-    dest_y = pic->data[0] + (mb_y << 4) * luma_stride   + (mb_x << 5);
-    dest_u = pic->data[1] + (mb_y << 4) * chroma_stride + (mb_x << 4);
-    dest_v = pic->data[2] + (mb_y << 4) * chroma_stride + (mb_x << 4);
+    if (ctx->need_alpha)
+        alpha_stride = pic->linesize[3];
+
+    if (!is_interlaced) {
+        dest_y = pic->data[0] + (mb_y << 4) * luma_stride   + (mb_x << 5);
+        dest_u = pic->data[1] + (mb_y << 4) * chroma_stride + (mb_x << (5 - ctx->is_422));
+        dest_v = pic->data[2] + (mb_y << 4) * chroma_stride + (mb_x << (5 - ctx->is_422));
+    } else {
+        dest_y = pic->data[0] + (mb_y << 4) * luma_stride * 2   + (mb_x << 5);
+        dest_u = pic->data[1] + (mb_y << 4) * chroma_stride * 2 + (mb_x << (5 - ctx->is_422));
+        dest_v = pic->data[2] + (mb_y << 4) * chroma_stride * 2 + (mb_x << (5 - ctx->is_422));
+        if (!is_top_field){ /* bottom field, offset dest */
+            dest_y += luma_stride;
+            dest_u += chroma_stride;
+            dest_v += chroma_stride;
+        }
+    }
 
     if (unsafe) {
-
         subimage_with_fill((uint16_t *) pic->data[0], mb_x << 4, mb_y << 4,
                 luma_stride, avctx->width, avctx->height,
-                (uint16_t *) ctx->fill_y, mb_count << 4, 16);
-        subimage_with_fill((uint16_t *) pic->data[1], mb_x << 3, mb_y << 4,
-                chroma_stride, avctx->width >> 1, avctx->height,
-                (uint16_t *) ctx->fill_u, mb_count << 3, 16);
-        subimage_with_fill((uint16_t *) pic->data[2], mb_x << 3, mb_y << 4,
-                chroma_stride, avctx->width >> 1, avctx->height,
-                (uint16_t *) ctx->fill_v, mb_count << 3, 16);
+                (uint16_t *) ctx->fill_y, mb_count << 4, 16, is_interlaced, is_top_field);
+        subimage_with_fill((uint16_t *) pic->data[1], mb_x << (4 - ctx->is_422), mb_y << 4,
+                           chroma_stride, avctx->width >> ctx->is_422, avctx->height,
+                           (uint16_t *) ctx->fill_u, mb_count << (4 - ctx->is_422), 16, is_interlaced, is_top_field);
+        subimage_with_fill((uint16_t *) pic->data[2], mb_x << (4 - ctx->is_422), mb_y << 4,
+                           chroma_stride, avctx->width >> ctx->is_422, avctx->height,
+                           (uint16_t *) ctx->fill_v, mb_count << (4 - ctx->is_422), 16, is_interlaced, is_top_field);
 
-        encode_slice_data(avctx, ctx->fill_y, ctx->fill_u, ctx->fill_v,
-                mb_count << 5, mb_count << 4, mb_count, buf + hdr_size,
-                data_size - hdr_size, &y_data_size, &u_data_size, &v_data_size,
-                *qp);
+        /* no need for interlaced special case, data already reorganized in subimage_with_fill */
+        calc_plane_dct(fdsp, ctx->fill_y, blocks_y, mb_count <<  5,                mb_count, 0, 0);
+        calc_plane_dct(fdsp, ctx->fill_u, blocks_u, mb_count << (5 - ctx->is_422), mb_count, 1, ctx->is_422);
+        calc_plane_dct(fdsp, ctx->fill_v, blocks_v, mb_count << (5 - ctx->is_422), mb_count, 1, ctx->is_422);
+
+        slice_size = encode_slice_data(avctx, blocks_y, blocks_u, blocks_v,
+                          mb_count, buf + hdr_size, data_size - hdr_size,
+                          &y_data_size, &u_data_size, &v_data_size,
+                          *qp);
     } else {
-        slice_size = encode_slice_data(avctx, dest_y, dest_u, dest_v,
-                luma_stride, chroma_stride, mb_count, buf + hdr_size,
-                data_size - hdr_size, &y_data_size, &u_data_size, &v_data_size,
-                *qp);
+        if (!is_interlaced) {
+            calc_plane_dct(fdsp, dest_y, blocks_y, luma_stride, mb_count, 0, 0);
+            calc_plane_dct(fdsp, dest_u, blocks_u, chroma_stride, mb_count, 1, ctx->is_422);
+            calc_plane_dct(fdsp, dest_v, blocks_v, chroma_stride, mb_count, 1, ctx->is_422);
+        } else {
+            calc_plane_dct(fdsp, dest_y, blocks_y, luma_stride   * 2, mb_count, 0, 0);
+            calc_plane_dct(fdsp, dest_u, blocks_u, chroma_stride * 2, mb_count, 1, ctx->is_422);
+            calc_plane_dct(fdsp, dest_v, blocks_v, chroma_stride * 2, mb_count, 1, ctx->is_422);
+        }
+
+        slice_size = encode_slice_data(avctx, blocks_y, blocks_u, blocks_v,
+                          mb_count, buf + hdr_size, data_size - hdr_size,
+                          &y_data_size, &u_data_size, &v_data_size,
+                          *qp);
 
         if (slice_size > high_bytes && *qp < qp_end_table[avctx->profile]) {
             do {
                 *qp += 1;
-                slice_size = encode_slice_data(avctx, dest_y, dest_u, dest_v,
-                        luma_stride, chroma_stride, mb_count, buf + hdr_size,
-                        data_size - hdr_size, &y_data_size, &u_data_size,
-                        &v_data_size, *qp);
+                slice_size = encode_slice_data(avctx, blocks_y, blocks_u, blocks_v,
+                                               mb_count, buf + hdr_size, data_size - hdr_size,
+                                               &y_data_size, &u_data_size, &v_data_size,
+                                               *qp);
             } while (slice_size > high_bytes && *qp < qp_end_table[avctx->profile]);
         } else if (slice_size < low_bytes && *qp
                 > qp_start_table[avctx->profile]) {
             do {
                 *qp -= 1;
-                slice_size = encode_slice_data(avctx, dest_y, dest_u, dest_v,
-                        luma_stride, chroma_stride, mb_count, buf + hdr_size,
-                        data_size - hdr_size, &y_data_size, &u_data_size,
-                        &v_data_size, *qp);
+                slice_size = encode_slice_data(avctx, blocks_y, blocks_u, blocks_v,
+                                               mb_count, buf + hdr_size, data_size - hdr_size,
+                                               &y_data_size, &u_data_size, &v_data_size,
+                                               *qp);
             } while (slice_size < low_bytes && *qp > qp_start_table[avctx->profile]);
         }
     }
@@ -434,20 +633,47 @@
     AV_WB16(buf + 2, y_data_size);
     AV_WB16(buf + 4, u_data_size);
 
-    return hdr_size + y_data_size + u_data_size + v_data_size;
+    if (ctx->need_alpha) {
+        AV_WB16(buf + 6, v_data_size); /* write v data size only if there is alpha */
+
+        subimage_alpha_with_fill((uint16_t *) pic->data[3], mb_x << 4, mb_y << 4,
+                           alpha_stride, avctx->width, avctx->height,
+                           (uint16_t *) ctx->fill_a, mb_count << 4, 16, is_interlaced, is_top_field);
+        ret = encode_alpha_slice_data(avctx, ctx->fill_a, mb_count,
+                                      buf + hdr_size + slice_size,
+                                      data_size - hdr_size - slice_size, &a_data_size);
+    }
+
+    if (ret != 0) {
+        return ret;
+    }
+    return hdr_size + y_data_size + u_data_size + v_data_size + a_data_size;
 }
 
 static int prores_encode_picture(AVCodecContext *avctx, const AVFrame *pic,
-        uint8_t *buf, const int buf_size)
+        uint8_t *buf, const int buf_size, const int picture_index, const int is_top_field)
 {
+    ProresContext *ctx = avctx->priv_data;
     int mb_width = (avctx->width + 15) >> 4;
-    int mb_height = (avctx->height + 15) >> 4;
     int hdr_size, sl_size, i;
-    int mb_y, sl_data_size, qp;
+    int mb_y, sl_data_size, qp, mb_height, picture_height, unsafe_mb_height_limit;
     int unsafe_bot, unsafe_right;
     uint8_t *sl_data, *sl_data_sizes;
     int slice_per_line = 0, rem = mb_width;
 
+    if (!ctx->is_interlaced) { /* progressive encoding */
+        mb_height = (avctx->height + 15) >> 4;
+        unsafe_mb_height_limit = mb_height;
+    } else {
+        if (is_top_field) {
+            picture_height = (avctx->height + 1) / 2;
+        } else {
+            picture_height = avctx->height / 2;
+        }
+        mb_height = (picture_height + 15) >> 4;
+        unsafe_mb_height_limit = mb_height;
+    }
+
     for (i = av_log2(DEFAULT_SLICE_MB_WIDTH); i >= 0; --i) {
         slice_per_line += rem >> i;
         rem &= (1 << i) - 1;
@@ -464,11 +690,14 @@
             while (mb_width - mb_x < slice_mb_count)
                 slice_mb_count >>= 1;
 
-            unsafe_bot = (avctx->height & 0xf) && (mb_y == mb_height - 1);
+            unsafe_bot = (avctx->height & 0xf) && (mb_y == unsafe_mb_height_limit - 1);
             unsafe_right = (avctx->width & 0xf) && (mb_x + slice_mb_count == mb_width);
 
             sl_size = encode_slice(avctx, pic, mb_x, mb_y, slice_mb_count,
-                    sl_data, sl_data_size, unsafe_bot || unsafe_right, &qp);
+                    sl_data, sl_data_size, unsafe_bot || unsafe_right, &qp, ctx->is_interlaced, is_top_field);
+            if (sl_size < 0){
+                return sl_size;
+            }
 
             bytestream_put_be16(&sl_data_sizes, sl_size);
             sl_data           += sl_size;
@@ -479,8 +708,8 @@
 
     buf[0] = hdr_size << 3;
     AV_WB32(buf + 1, sl_data - buf);
-    AV_WB16(buf + 5, slice_per_line * mb_height);
-    buf[7] = av_log2(DEFAULT_SLICE_MB_WIDTH) << 4;
+    AV_WB16(buf + 5, slice_per_line * mb_height); /* picture size */
+    buf[7] = av_log2(DEFAULT_SLICE_MB_WIDTH) << 4; /* number of slices */
 
     return sl_data - buf;
 }
@@ -488,9 +717,11 @@
 static int prores_encode_frame(AVCodecContext *avctx, AVPacket *pkt,
                                const AVFrame *pict, int *got_packet)
 {
+    ProresContext *ctx = avctx->priv_data;
     int header_size = 148;
     uint8_t *buf;
-    int pic_size, ret;
+    int compress_frame_size, pic_size, ret, is_top_field_first = 0;
+    uint8_t frame_flags;
     int frame_size = FFALIGN(avctx->width, 16) * FFALIGN(avctx->height, 16)*16 + 500 + AV_INPUT_BUFFER_MIN_SIZE; //FIXME choose tighter limit
 
 
@@ -498,31 +729,71 @@
         return ret;
 
     buf = pkt->data;
-    pic_size = prores_encode_picture(avctx, pict, buf + header_size + 8,
-            pkt->size - header_size - 8);
+    compress_frame_size = 8 + header_size;
 
-    bytestream_put_be32(&buf, pic_size + 8 + header_size);
+    bytestream_put_be32(&buf, compress_frame_size);/* frame size will be update after picture(s) encoding */
     bytestream_put_buffer(&buf, "icpf", 4);
 
     bytestream_put_be16(&buf, header_size);
-    bytestream_put_be16(&buf, 0);
-    bytestream_put_buffer(&buf, "fmpg", 4);
+    bytestream_put_be16(&buf, 0); /* version */
+    bytestream_put_buffer(&buf, ctx->vendor, 4);
     bytestream_put_be16(&buf, avctx->width);
     bytestream_put_be16(&buf, avctx->height);
-    *buf++ = 0x83; // {10}(422){00}{00}(frame){11}
-    *buf++ = 0;
-    *buf++ = 2;
-    *buf++ = 2;
-    *buf++ = 6;
-    *buf++ = 32;
-    *buf++ = 0;
-    *buf++ = 3;
+    frame_flags = 0x82; /* 422 not interlaced */
+    if (avctx->profile >= FF_PROFILE_PRORES_4444) /* 4444 or 4444 Xq */
+        frame_flags |= 0x40; /* 444 chroma */
+    if (ctx->is_interlaced) {
+        if (pict->top_field_first || !pict->interlaced_frame) { /* tff frame or progressive frame interpret as tff */
+            av_log(avctx, AV_LOG_DEBUG, "use interlaced encoding, top field first\n");
+            frame_flags |= 0x04; /* interlaced tff */
+            is_top_field_first = 1;
+        } else {
+            av_log(avctx, AV_LOG_DEBUG, "use interlaced encoding, bottom field first\n");
+            frame_flags |= 0x08; /* interlaced bff */
+        }
+    } else {
+        av_log(avctx, AV_LOG_DEBUG, "use progressive encoding\n");
+    }
+    *buf++ = frame_flags;
+    *buf++ = 0; /* reserved */
+    /* only write color properties, if valid value. set to unspecified otherwise */
+    *buf++ = ff_int_from_list_or_default(avctx, "frame color primaries", pict->color_primaries, valid_primaries, 0);
+    *buf++ = ff_int_from_list_or_default(avctx, "frame color trc", pict->color_trc, valid_trc, 0);
+    *buf++ = ff_int_from_list_or_default(avctx, "frame colorspace", pict->colorspace, valid_colorspace, 0);
+    if (avctx->profile >= FF_PROFILE_PRORES_4444) {
+        if (avctx->pix_fmt == AV_PIX_FMT_YUV444P10) {
+            *buf++ = 0xA0;/* src b64a and no alpha */
+        } else {
+            *buf++ = 0xA2;/* src b64a and 16b alpha */
+        }
+    } else {
+        *buf++ = 32;/* src v210 and no alpha */
+    }
+    *buf++ = 0; /* reserved */
+    *buf++ = 3; /* luma and chroma matrix present */
 
     bytestream_put_buffer(&buf, QMAT_LUMA[avctx->profile],   64);
     bytestream_put_buffer(&buf, QMAT_CHROMA[avctx->profile], 64);
 
+    pic_size = prores_encode_picture(avctx, pict, buf,
+                                     pkt->size - compress_frame_size, 0, is_top_field_first);/* encode progressive or first field */
+    if (pic_size < 0) {
+        return pic_size;
+    }
+    compress_frame_size += pic_size;
+
+    if (ctx->is_interlaced) { /* encode second field */
+        pic_size = prores_encode_picture(avctx, pict, pkt->data + compress_frame_size,
+                                         pkt->size - compress_frame_size, 1, !is_top_field_first);
+        if (pic_size < 0) {
+            return pic_size;
+        }
+        compress_frame_size += pic_size;
+    }
+
+    AV_WB32(pkt->data, compress_frame_size);/* update frame size */
     pkt->flags |= AV_PKT_FLAG_KEY;
-    pkt->size = pic_size + 8 + header_size;
+    pkt->size = compress_frame_size;
     *got_packet = 1;
 
     return 0;
@@ -540,11 +811,14 @@
     int i;
     ProresContext* ctx = avctx->priv_data;
 
-    if (avctx->pix_fmt != AV_PIX_FMT_YUV422P10) {
-        av_log(avctx, AV_LOG_ERROR, "need YUV422P10\n");
-        return AVERROR_PATCHWELCOME;
-    }
     avctx->bits_per_raw_sample = 10;
+    ctx->need_alpha = 0;
+    ctx->is_interlaced = !!(avctx->flags & AV_CODEC_FLAG_INTERLACED_DCT);
+    if (ctx->is_interlaced) {
+        ctx->scantable = ff_prores_interlaced_scan;
+    } else {
+        ctx->scantable = ff_prores_progressive_scan;
+    }
 
     if (avctx->width & 0x1) {
         av_log(avctx, AV_LOG_ERROR,
@@ -558,27 +832,71 @@
         return AVERROR(EINVAL);
     }
 
-    if ((avctx->height & 0xf) || (avctx->width & 0xf)) {
-        ctx->fill_y = av_malloc(4 * (DEFAULT_SLICE_MB_WIDTH << 8));
-        if (!ctx->fill_y)
-            return AVERROR(ENOMEM);
-        ctx->fill_u = ctx->fill_y + (DEFAULT_SLICE_MB_WIDTH << 9);
-        ctx->fill_v = ctx->fill_u + (DEFAULT_SLICE_MB_WIDTH << 8);
+    if (strlen(ctx->vendor) != 4) {
+        av_log(avctx, AV_LOG_ERROR, "vendor ID should be 4 bytes\n");
+        return AVERROR(EINVAL);
     }
 
     if (avctx->profile == FF_PROFILE_UNKNOWN) {
-        avctx->profile = FF_PROFILE_PRORES_STANDARD;
-        av_log(avctx, AV_LOG_INFO,
+        if (avctx->pix_fmt == AV_PIX_FMT_YUV422P10) {
+            avctx->profile = FF_PROFILE_PRORES_STANDARD;
+            av_log(avctx, AV_LOG_INFO,
                 "encoding with ProRes standard (apcn) profile\n");
-
+        } else if (avctx->pix_fmt == AV_PIX_FMT_YUV444P10) {
+            avctx->profile = FF_PROFILE_PRORES_4444;
+            av_log(avctx, AV_LOG_INFO,
+                   "encoding with ProRes 4444 (ap4h) profile\n");
+        } else if (avctx->pix_fmt == AV_PIX_FMT_YUVA444P10) {
+            avctx->profile = FF_PROFILE_PRORES_4444;
+            av_log(avctx, AV_LOG_INFO,
+                   "encoding with ProRes 4444+ (ap4h) profile\n");
+        } else {
+            av_log(avctx, AV_LOG_ERROR, "Unknown pixel format\n");
+            return AVERROR(EINVAL);
+        }
     } else if (avctx->profile < FF_PROFILE_PRORES_PROXY
-            || avctx->profile > FF_PROFILE_PRORES_HQ) {
+            || avctx->profile > FF_PROFILE_PRORES_XQ) {
         av_log(
                 avctx,
                 AV_LOG_ERROR,
-                "unknown profile %d, use [0 - apco, 1 - apcs, 2 - apcn (default), 3 - apch]\n",
+                "unknown profile %d, use [0 - apco, 1 - apcs, 2 - apcn (default), 3 - apch, 4 - ap4h, 5 - ap4x]\n",
                 avctx->profile);
         return AVERROR(EINVAL);
+    } else if ((avctx->pix_fmt == AV_PIX_FMT_YUV422P10) && (avctx->profile > FF_PROFILE_PRORES_HQ)){
+        av_log(avctx, AV_LOG_ERROR,
+               "encoding with ProRes 444/Xq (ap4h/ap4x) profile, need YUV444P10 input\n");
+        return AVERROR(EINVAL);
+    }  else if ((avctx->pix_fmt == AV_PIX_FMT_YUV444P10 || avctx->pix_fmt == AV_PIX_FMT_YUVA444P10)
+                && (avctx->profile < FF_PROFILE_PRORES_4444)){
+        av_log(avctx, AV_LOG_ERROR,
+               "encoding with ProRes Proxy/LT/422/422 HQ (apco, apcs, apcn, ap4h) profile, need YUV422P10 input\n");
+        return AVERROR(EINVAL);
+    }
+
+    if (avctx->profile < FF_PROFILE_PRORES_4444) { /* 422 versions */
+        ctx->is_422 = 1;
+        if ((avctx->height & 0xf) || (avctx->width & 0xf)) {
+            ctx->fill_y = av_malloc(4 * (DEFAULT_SLICE_MB_WIDTH << 8));
+            if (!ctx->fill_y)
+                return AVERROR(ENOMEM);
+            ctx->fill_u = ctx->fill_y + (DEFAULT_SLICE_MB_WIDTH << 9);
+            ctx->fill_v = ctx->fill_u + (DEFAULT_SLICE_MB_WIDTH << 8);
+        }
+    } else { /* 444 */
+        ctx->is_422 = 0;
+        if ((avctx->height & 0xf) || (avctx->width & 0xf)) {
+            ctx->fill_y = av_malloc(3 * (DEFAULT_SLICE_MB_WIDTH << 9));
+            if (!ctx->fill_y)
+                return AVERROR(ENOMEM);
+            ctx->fill_u = ctx->fill_y + (DEFAULT_SLICE_MB_WIDTH << 9);
+            ctx->fill_v = ctx->fill_u + (DEFAULT_SLICE_MB_WIDTH << 9);
+        }
+        if (avctx->pix_fmt == AV_PIX_FMT_YUVA444P10) {
+            ctx->need_alpha = 1;
+            ctx->fill_a = av_malloc(DEFAULT_SLICE_MB_WIDTH << 9); /* 8 blocks x 16px x 16px x sizeof (uint16) */
+            if (!ctx->fill_a)
+                return AVERROR(ENOMEM);
+        }
     }
 
     ff_fdctdsp_init(&ctx->fdsp, avctx);
@@ -597,10 +915,33 @@
 {
     ProresContext* ctx = avctx->priv_data;
     av_freep(&ctx->fill_y);
+    av_freep(&ctx->fill_a);
 
     return 0;
 }
 
+#define OFFSET(x) offsetof(ProresContext, x)
+#define VE     AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
+
+static const AVOption options[] = {
+    { "vendor", "vendor ID", OFFSET(vendor), AV_OPT_TYPE_STRING, { .str = "fmpg" }, 0, 0, VE },
+    { NULL }
+};
+
+static const AVClass proresaw_enc_class = {
+    .class_name = "ProResAw encoder",
+    .item_name  = av_default_item_name,
+    .option     = options,
+    .version    = LIBAVUTIL_VERSION_INT,
+};
+
+static const AVClass prores_enc_class = {
+    .class_name = "ProRes encoder",
+    .item_name  = av_default_item_name,
+    .option     = options,
+    .version    = LIBAVUTIL_VERSION_INT,
+};
+
 AVCodec ff_prores_aw_encoder = {
     .name           = "prores_aw",
     .long_name      = NULL_IF_CONFIG_SMALL("Apple ProRes"),
@@ -610,9 +951,10 @@
     .init           = prores_encode_init,
     .close          = prores_encode_close,
     .encode2        = prores_encode_frame,
-    .pix_fmts       = (const enum AVPixelFormat[]){AV_PIX_FMT_YUV422P10, AV_PIX_FMT_NONE},
+    .pix_fmts       = (const enum AVPixelFormat[]){AV_PIX_FMT_YUV422P10, AV_PIX_FMT_YUV444P10, AV_PIX_FMT_YUVA444P10, AV_PIX_FMT_NONE},
     .capabilities   = AV_CODEC_CAP_FRAME_THREADS | AV_CODEC_CAP_INTRA_ONLY,
-    .profiles       = profiles
+    .priv_class     = &proresaw_enc_class,
+    .profiles       = NULL_IF_CONFIG_SMALL(ff_prores_profiles),
 };
 
 AVCodec ff_prores_encoder = {
@@ -624,7 +966,8 @@
     .init           = prores_encode_init,
     .close          = prores_encode_close,
     .encode2        = prores_encode_frame,
-    .pix_fmts       = (const enum AVPixelFormat[]){AV_PIX_FMT_YUV422P10, AV_PIX_FMT_NONE},
+    .pix_fmts       = (const enum AVPixelFormat[]){AV_PIX_FMT_YUV422P10, AV_PIX_FMT_YUV444P10, AV_PIX_FMT_YUVA444P10, AV_PIX_FMT_NONE},
     .capabilities   = AV_CODEC_CAP_FRAME_THREADS | AV_CODEC_CAP_INTRA_ONLY,
-    .profiles       = profiles
+    .priv_class     = &prores_enc_class,
+    .profiles       = NULL_IF_CONFIG_SMALL(ff_prores_profiles),
 };
diff --git a/libavcodec/proresenc_kostya.c b/libavcodec/proresenc_kostya.c
index 81f3865..6215f8e 100644
--- a/libavcodec/proresenc_kostya.c
+++ b/libavcodec/proresenc_kostya.c
@@ -28,6 +28,7 @@
 #include "avcodec.h"
 #include "fdctdsp.h"
 #include "put_bits.h"
+#include "profiles.h"
 #include "bytestream.h"
 #include "internal.h"
 #include "proresdata.h"
@@ -221,6 +222,7 @@
     DECLARE_ALIGNED(16, int16_t, blocks)[MAX_PLANES][64 * 4 * MAX_MBS_PER_SLICE];
     DECLARE_ALIGNED(16, uint16_t, emu_buf)[16 * 16];
     int16_t custom_q[64];
+    int16_t custom_chroma_q[64];
     struct TrellisNode *nodes;
 } ProresThreadData;
 
@@ -231,6 +233,7 @@
     int16_t quants[MAX_STORED_Q][64];
     int16_t quants_chroma[MAX_STORED_Q][64];
     int16_t custom_q[64];
+    int16_t custom_chroma_q[64];
     const uint8_t *quant_mat;
     const uint8_t *quant_chroma_mat;
     const uint8_t *scantable;
@@ -573,7 +576,7 @@
         qmat_chroma = ctx->quants_chroma[quant];
     } else {
         qmat = ctx->custom_q;
-        qmat_chroma = ctx->custom_q;
+        qmat_chroma = ctx->custom_chroma_q;
         for (i = 0; i < 64; i++) {
             qmat[i] = ctx->quant_mat[i] * quant;
             qmat_chroma[i] = ctx->quant_chroma_mat[i] * quant;
@@ -901,7 +904,7 @@
                 qmat_chroma = ctx->quants_chroma[q];
             } else {
                 qmat = td->custom_q;
-                qmat_chroma = td->custom_q;
+                qmat_chroma = td->custom_chroma_q;
                 for (i = 0; i < 64; i++) {
                     qmat[i] = ctx->quant_mat[i] * q;
                     qmat_chroma[i] = ctx->quant_chroma_mat[i] * q;
@@ -1387,7 +1390,7 @@
     { "4444xq",        NULL, 0, AV_OPT_TYPE_CONST, { .i64 = PRORES_PROFILE_4444XQ },
         0, 0, VE, "profile" },
     { "vendor", "vendor ID", OFFSET(vendor),
-        AV_OPT_TYPE_STRING, { .str = "Lavc" }, CHAR_MIN, CHAR_MAX, VE },
+        AV_OPT_TYPE_STRING, { .str = "Lavc" }, 0, 0, VE },
     { "bits_per_mb", "desired bits per macroblock", OFFSET(bits_per_mb),
         AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 8192, VE },
     { "quant_mat", "quantiser matrix", OFFSET(quant_sel), AV_OPT_TYPE_INT,
@@ -1431,4 +1434,5 @@
                           AV_PIX_FMT_YUVA444P10, AV_PIX_FMT_NONE
                       },
     .priv_class     = &proresenc_class,
+    .profiles       = NULL_IF_CONFIG_SMALL(ff_prores_profiles),
 };
diff --git a/libavcodec/prosumer.c b/libavcodec/prosumer.c
index 6e98677..9950519 100644
--- a/libavcodec/prosumer.c
+++ b/libavcodec/prosumer.c
@@ -38,7 +38,7 @@
 
     unsigned stride;
     unsigned size;
-    uint32_t lut[0x10000];
+    uint32_t lut[0x2000];
     uint8_t *initial_line;
     uint8_t *decbuffer;
 } ProSumerContext;
@@ -57,27 +57,25 @@
     b = lut[2 * idx];
 
     while (1) {
-        if (bytestream2_get_bytes_left_p(pb) <= 0)
+        if (bytestream2_get_bytes_left_p(pb) <= 0 || bytestream2_get_eof(pb))
             return 0;
-        if (((b & 0xFF00u) != 0x8000u) || (b & 0xFFu)) {
+        if ((b & 0xFF00u) != 0x8000u || (b & 0xFFu)) {
             if ((b & 0xFF00u) != 0x8000u) {
                 bytestream2_put_le16(pb, b);
-            } else if (b & 0xFFu) {
+            } else {
                 idx = 0;
                 for (int i = 0; i < (b & 0xFFu); i++)
                     bytestream2_put_le32(pb, 0);
             }
             c = b >> 16;
             if (c & 0xFF00u) {
-                c = (((c >> 8) & 0xFFu) | (c & 0xFF00)) & 0xF00F;
                 fill = lut[2 * idx + 1];
-                if ((c & 0xFF00u) == 0x1000) {
+                if ((c & 0xF000u) == 0x1000) {
                     bytestream2_put_le16(pb, fill);
-                    c &= 0xFFFF00FFu;
                 } else {
                     bytestream2_put_le32(pb, fill);
-                    c &= 0xFFFF00FFu;
                 }
+                c = (c >> 8) & 0x0Fu;
             }
             while (c) {
                 a <<= 4;
@@ -86,21 +84,20 @@
                     if (bytestream2_get_bytes_left(gb) <= 0) {
                         if (!a)
                             return 0;
-                        cnt = 4;
                     } else {
-                        pos = bytestream2_tell(gb) ^ 2;
-                        bytestream2_seek(gb, pos, SEEK_SET);
+                        pos = bytestream2_tell(gb);
+                        bytestream2_seek(gb, pos ^ 2, SEEK_SET);
                         AV_WN16(&a, bytestream2_peek_le16(gb));
-                        pos = pos ^ 2;
-                        bytestream2_seek(gb, pos, SEEK_SET);
-                        bytestream2_skip(gb, 2);
-                        cnt = 4;
+                        bytestream2_seek(gb, pos + 2, SEEK_SET);
                     }
+                    cnt = 4;
                 }
                 c--;
             }
             idx = a >> 20;
             b = lut[2 * idx];
+            if (!b)
+                return AVERROR_INVALIDDATA;
             continue;
         }
         idx = 2;
@@ -119,12 +116,10 @@
                 }
                 return 0;
             }
-            pos = bytestream2_tell(gb) ^ 2;
-            bytestream2_seek(gb, pos, SEEK_SET);
+            pos = bytestream2_tell(gb);
+            bytestream2_seek(gb, pos ^ 2, SEEK_SET);
             AV_WN16(&a, bytestream2_peek_le16(gb));
-            pos = pos ^ 2;
-            bytestream2_seek(gb, pos, SEEK_SET);
-            bytestream2_skip(gb, 2);
+            bytestream2_seek(gb, pos + 2, SEEK_SET);
             cnt = 4;
             idx--;
         }
@@ -158,11 +153,17 @@
     if (avpkt->size <= 32)
         return AVERROR_INVALIDDATA;
 
-    memset(s->decbuffer, 0, s->size);
     bytestream2_init(&s->gb, avpkt->data, avpkt->size);
     bytestream2_init_writer(&s->pb, s->decbuffer, s->size);
+    ret = decompress(&s->gb, AV_RL32(avpkt->data + 28) >> 1, &s->pb, s->lut);
+    if (ret < 0)
+        return ret;
+    if (bytestream2_get_bytes_left_p(&s->pb) > s->size * (int64_t)avctx->discard_damaged_percentage / 100)
+        return AVERROR_INVALIDDATA;
 
-    decompress(&s->gb, AV_RL32(avpkt->data + 28) >> 1, &s->pb, s->lut);
+    av_assert0(s->size >= bytestream2_get_bytes_left_p(&s->pb));
+    memset(s->decbuffer + bytestream2_tell_p(&s->pb), 0, bytestream2_get_bytes_left_p(&s->pb));
+
     vertical_predict((uint32_t *)s->decbuffer, 0, (uint32_t *)s->initial_line, s->stride, 1);
     vertical_predict((uint32_t *)s->decbuffer, s->stride, (uint32_t *)s->decbuffer, s->stride, avctx->height - 1);
 
diff --git a/libavcodec/psd.c b/libavcodec/psd.c
index 4381447..ae7ad4e 100644
--- a/libavcodec/psd.c
+++ b/libavcodec/psd.c
@@ -211,11 +211,9 @@
     case 2:
         avpriv_request_sample(s->avctx, "ZIP without predictor compression");
         return AVERROR_PATCHWELCOME;
-        break;
     case 3:
         avpriv_request_sample(s->avctx, "ZIP with predictor compression");
         return AVERROR_PATCHWELCOME;
-        break;
     default:
         av_log(s->avctx, AV_LOG_ERROR, "Unknown compression %d.\n", s->compression);
         return AVERROR_INVALIDDATA;
@@ -337,6 +335,30 @@
         }
         avctx->pix_fmt = AV_PIX_FMT_PAL8;
         break;
+    case PSD_CMYK:
+        if (s->channel_count == 4) {
+            if (s->channel_depth == 8) {
+                avctx->pix_fmt = AV_PIX_FMT_GBRP;
+            } else if (s->channel_depth == 16) {
+                avctx->pix_fmt = AV_PIX_FMT_GBRP16BE;
+            } else {
+                avpriv_report_missing_feature(avctx, "channel depth %d for cmyk", s->channel_depth);
+                return AVERROR_PATCHWELCOME;
+            }
+        } else if (s->channel_count == 5) {
+            if (s->channel_depth == 8) {
+                avctx->pix_fmt = AV_PIX_FMT_GBRAP;
+            } else if (s->channel_depth == 16) {
+                avctx->pix_fmt = AV_PIX_FMT_GBRAP16BE;
+            } else {
+                avpriv_report_missing_feature(avctx, "channel depth %d for cmyk", s->channel_depth);
+                return AVERROR_PATCHWELCOME;
+            }
+        } else {
+            avpriv_report_missing_feature(avctx, "channel count %d for cmyk", s->channel_count);
+            return AVERROR_PATCHWELCOME;
+        }
+        break;
     case PSD_RGB:
         if (s->channel_count == 3) {
             if (s->channel_depth == 8) {
@@ -435,6 +457,66 @@
                 }
             }
         }
+    } else if (s->color_mode == PSD_CMYK) {
+        uint8_t *dst[4] = { picture->data[0], picture->data[1], picture->data[2], picture->data[3] };
+        const uint8_t *src[5] = { ptr_data };
+        src[1] = src[0] + s->line_size * s->height;
+        src[2] = src[1] + s->line_size * s->height;
+        src[3] = src[2] + s->line_size * s->height;
+        src[4] = src[3] + s->line_size * s->height;
+        if (s->channel_depth == 8) {
+            for (y = 0; y < s->height; y++) {
+                for (x = 0; x < s->width; x++) {
+                    int k = src[3][x];
+                    int r = src[0][x] * k;
+                    int g = src[1][x] * k;
+                    int b = src[2][x] * k;
+                    dst[0][x] = g * 257 >> 16;
+                    dst[1][x] = b * 257 >> 16;
+                    dst[2][x] = r * 257 >> 16;
+                }
+                dst[0] += picture->linesize[0];
+                dst[1] += picture->linesize[1];
+                dst[2] += picture->linesize[2];
+                src[0] += s->line_size;
+                src[1] += s->line_size;
+                src[2] += s->line_size;
+                src[3] += s->line_size;
+            }
+            if (avctx->pix_fmt == AV_PIX_FMT_GBRAP) {
+                for (y = 0; y < s->height; y++) {
+                    memcpy(dst[3], src[4], s->line_size);
+                    src[4] += s->line_size;
+                    dst[3] += picture->linesize[3];
+                }
+            }
+        } else {
+            for (y = 0; y < s->height; y++) {
+                for (x = 0; x < s->width; x++) {
+                    int64_t k = AV_RB16(&src[3][x * 2]);
+                    int64_t r = AV_RB16(&src[0][x * 2]) * k;
+                    int64_t g = AV_RB16(&src[1][x * 2]) * k;
+                    int64_t b = AV_RB16(&src[2][x * 2]) * k;
+                    AV_WB16(&dst[0][x * 2], g * 65537 >> 32);
+                    AV_WB16(&dst[1][x * 2], b * 65537 >> 32);
+                    AV_WB16(&dst[2][x * 2], r * 65537 >> 32);
+                }
+                dst[0] += picture->linesize[0];
+                dst[1] += picture->linesize[1];
+                dst[2] += picture->linesize[2];
+                src[0] += s->line_size;
+                src[1] += s->line_size;
+                src[2] += s->line_size;
+                src[3] += s->line_size;
+            }
+            if (avctx->pix_fmt == AV_PIX_FMT_GBRAP16BE) {
+                for (y = 0; y < s->height; y++) {
+                    memcpy(dst[3], src[4], s->line_size);
+                    src[4] += s->line_size;
+                    dst[3] += picture->linesize[3];
+                }
+            }
+        }
     } else {/* Planar */
         if (s->channel_count == 1)/* gray 8 or gray 16be */
             eq_channel[0] = 0;/* assign first channel, to first plane */
diff --git a/libavcodec/pthread_frame.c b/libavcodec/pthread_frame.c
index 36ac0ac..4cd890b 100644
--- a/libavcodec/pthread_frame.c
+++ b/libavcodec/pthread_frame.c
@@ -93,9 +93,9 @@
      * Array of frames passed to ff_thread_release_buffer().
      * Frames are released after all threads referencing them are finished.
      */
-    AVFrame *released_buffers;
-    int  num_released_buffers;
-    int      released_buffers_allocated;
+    AVFrame **released_buffers;
+    int   num_released_buffers;
+    int       released_buffers_allocated;
 
     AVFrame *requested_frame;       ///< AVFrame the codec passed to get_buffer()
     int      requested_flags;       ///< flags passed to get_buffer() for requested_frame
@@ -201,7 +201,7 @@
         p->result = codec->decode(avctx, p->frame, &p->got_frame, &p->avpkt);
 
         if ((p->result < 0 || !p->got_frame) && p->frame->buf[0]) {
-            if (avctx->internal->allocate_progress)
+            if (avctx->codec->caps_internal & FF_CODEC_CAP_ALLOCATE_PROGRESS)
                 av_log(avctx, AV_LOG_ERROR, "A frame threaded decoder did not "
                        "free the frame on failure. This is a bug, please report it.\n");
             av_frame_unref(p->frame);
@@ -296,6 +296,17 @@
         }
 
         dst->hwaccel_flags = src->hwaccel_flags;
+
+        if (!!dst->internal->pool != !!src->internal->pool ||
+            (dst->internal->pool && dst->internal->pool->data != src->internal->pool->data)) {
+            av_buffer_unref(&dst->internal->pool);
+
+            if (src->internal->pool) {
+                dst->internal->pool = av_buffer_ref(src->internal->pool);
+                if (!dst->internal->pool)
+                    return AVERROR(ENOMEM);
+            }
+        }
     }
 
     if (for_user) {
@@ -322,7 +333,6 @@
  */
 static int update_context_from_user(AVCodecContext *dst, AVCodecContext *src)
 {
-#define copy_fields(s, e) memcpy(&dst->s, &src->s, (char*)&dst->e - (char*)&dst->s);
     dst->flags          = src->flags;
 
     dst->draw_horiz_band= src->draw_horiz_band;
@@ -334,8 +344,11 @@
 
     dst->slice_flags = src->slice_flags;
     dst->flags2      = src->flags2;
+    dst->export_side_data = src->export_side_data;
 
-    copy_fields(skip_loop_filter, subtitle_header);
+    dst->skip_loop_filter = src->skip_loop_filter;
+    dst->skip_idct        = src->skip_idct;
+    dst->skip_frame       = src->skip_frame;
 
     dst->frame_number     = src->frame_number;
     dst->reordered_opaque = src->reordered_opaque;
@@ -353,7 +366,6 @@
     }
     dst->slice_count = src->slice_count;
     return 0;
-#undef copy_fields
 }
 
 /// Releases the buffers that this decoding thread was the last user of.
@@ -369,7 +381,7 @@
         // fix extended data in case the caller screwed it up
         av_assert0(p->avctx->codec_type == AVMEDIA_TYPE_VIDEO ||
                    p->avctx->codec_type == AVMEDIA_TYPE_AUDIO);
-        f = &p->released_buffers[--p->num_released_buffers];
+        f = p->released_buffers[--p->num_released_buffers];
         f->extended_data = f->data;
         av_frame_unref(f);
 
@@ -653,10 +665,17 @@
 {
     FrameThreadContext *fctx = avctx->internal->thread_ctx;
     const AVCodec *codec = avctx->codec;
-    int i;
+    int i, j;
 
     park_frame_worker_threads(fctx, thread_count);
 
+    if (fctx->prev_thread && avctx->internal->hwaccel_priv_data !=
+                             fctx->prev_thread->avctx->internal->hwaccel_priv_data) {
+        if (update_context_from_thread(avctx, fctx->prev_thread->avctx, 1) < 0) {
+            av_log(avctx, AV_LOG_ERROR, "Failed to update user thread.\n");
+        }
+    }
+
     if (fctx->prev_thread && fctx->prev_thread != fctx->threads)
         if (update_context_from_thread(fctx->threads->avctx, fctx->prev_thread->avctx, 0) < 0) {
             av_log(avctx, AV_LOG_ERROR, "Final thread update failed\n");
@@ -692,14 +711,21 @@
         pthread_cond_destroy(&p->progress_cond);
         pthread_cond_destroy(&p->output_cond);
         av_packet_unref(&p->avpkt);
+
+        for (j = 0; j < p->released_buffers_allocated; j++)
+            av_frame_free(&p->released_buffers[j]);
         av_freep(&p->released_buffers);
 
-        if (i && p->avctx) {
+        if (p->avctx) {
+            if (codec->priv_class)
+                av_opt_free(p->avctx->priv_data);
             av_freep(&p->avctx->priv_data);
+
             av_freep(&p->avctx->slice_offset);
         }
 
         if (p->avctx) {
+            av_buffer_unref(&p->avctx->internal->pool);
             av_freep(&p->avctx->internal);
             av_buffer_unref(&p->avctx->hw_frames_ctx);
         }
@@ -801,28 +827,32 @@
         copy->internal->thread_ctx = p;
         copy->internal->last_pkt_props = &p->avpkt;
 
-        if (!i) {
-            src = copy;
-
-            if (codec->init)
-                err = codec->init(copy);
-
-            update_context_from_thread(avctx, copy, 1);
-        } else {
-            copy->priv_data = av_malloc(codec->priv_data_size);
+        if (codec->priv_data_size) {
+            copy->priv_data = av_mallocz(codec->priv_data_size);
             if (!copy->priv_data) {
                 err = AVERROR(ENOMEM);
                 goto error;
             }
-            memcpy(copy->priv_data, src->priv_data, codec->priv_data_size);
-            copy->internal->is_copy = 1;
 
-            if (codec->init_thread_copy)
-                err = codec->init_thread_copy(copy);
+            if (codec->priv_class) {
+                *(const AVClass **)copy->priv_data = codec->priv_class;
+                err = av_opt_copy(copy->priv_data, src->priv_data);
+                if (err < 0)
+                    goto error;
+            }
         }
 
+        if (i)
+            copy->internal->is_copy = 1;
+
+        if (codec->init)
+            err = codec->init(copy);
+
         if (err) goto error;
 
+        if (!i)
+            update_context_from_thread(avctx, copy, 1);
+
         atomic_init(&p->debug_threads, (copy->debug & FF_DEBUG_THREADS) != 0);
 
         err = AVERROR(pthread_create(&p->thread, NULL, frame_worker_thread, p));
@@ -895,7 +925,7 @@
         return -1;
     }
 
-    if (avctx->internal->allocate_progress) {
+    if (avctx->codec->caps_internal & FF_CODEC_CAP_ALLOCATE_PROGRESS) {
         atomic_int *progress;
         f->progress = av_buffer_alloc(2 * sizeof(*progress));
         if (!f->progress) {
@@ -973,11 +1003,12 @@
 {
     PerThreadContext *p = avctx->internal->thread_ctx;
     FrameThreadContext *fctx;
-    AVFrame *dst, *tmp;
+    AVFrame *dst;
+    int ret = 0;
     int can_direct_free = !(avctx->active_thread_type & FF_THREAD_FRAME) ||
                           THREAD_SAFE_CALLBACKS(avctx);
 
-    if (!f->f || !f->f->buf[0])
+    if (!f->f)
         return;
 
     if (avctx->debug & FF_DEBUG_BUFFERS)
@@ -986,7 +1017,8 @@
     av_buffer_unref(&f->progress);
     f->owner[0] = f->owner[1] = NULL;
 
-    if (can_direct_free) {
+    // when the frame buffers are not allocated, just reset it to clean state
+    if (can_direct_free || !f->f->buf[0]) {
         av_frame_unref(f->f);
         return;
     }
@@ -994,20 +1026,36 @@
     fctx = p->parent;
     pthread_mutex_lock(&fctx->buffer_mutex);
 
-    if (p->num_released_buffers + 1 >= INT_MAX / sizeof(*p->released_buffers))
-        goto fail;
-    tmp = av_fast_realloc(p->released_buffers, &p->released_buffers_allocated,
-                          (p->num_released_buffers + 1) *
-                          sizeof(*p->released_buffers));
-    if (!tmp)
-        goto fail;
-    p->released_buffers = tmp;
+    if (p->num_released_buffers == p->released_buffers_allocated) {
+        AVFrame **tmp = av_realloc_array(p->released_buffers, p->released_buffers_allocated + 1,
+                                         sizeof(*p->released_buffers));
+        if (tmp) {
+            tmp[p->released_buffers_allocated] = av_frame_alloc();
+            p->released_buffers = tmp;
+        }
 
-    dst = &p->released_buffers[p->num_released_buffers];
+        if (!tmp || !tmp[p->released_buffers_allocated]) {
+            ret = AVERROR(ENOMEM);
+            goto fail;
+        }
+        p->released_buffers_allocated++;
+    }
+
+    dst = p->released_buffers[p->num_released_buffers];
     av_frame_move_ref(dst, f->f);
 
     p->num_released_buffers++;
 
 fail:
     pthread_mutex_unlock(&fctx->buffer_mutex);
+
+    // make sure the frame is clean even if we fail to free it
+    // this leaks, but it is better than crashing
+    if (ret < 0) {
+        av_log(avctx, AV_LOG_ERROR, "Could not queue a frame for freeing, this will leak\n");
+        memset(f->f->buf, 0, sizeof(f->f->buf));
+        if (f->f->extended_buf)
+            memset(f->f->extended_buf, 0, f->f->nb_extended_buf * sizeof(*f->f->extended_buf));
+        av_frame_unref(f->f);
+    }
 }
diff --git a/libavcodec/ptx.c b/libavcodec/ptx.c
index 42147f4..19f9305 100644
--- a/libavcodec/ptx.c
+++ b/libavcodec/ptx.c
@@ -55,6 +55,9 @@
 
     buf += offset;
 
+    if (buf_end - buf < w * bytes_per_pixel)
+        return AVERROR_INVALIDDATA;
+
     if ((ret = ff_set_dimensions(avctx, w, h)) < 0)
         return ret;
 
diff --git a/libavcodec/put_bits.h b/libavcodec/put_bits.h
index 1ceb1cc..7d11a35 100644
--- a/libavcodec/put_bits.h
+++ b/libavcodec/put_bits.h
@@ -62,24 +62,6 @@
 }
 
 /**
- * Rebase the bit writer onto a reallocated buffer.
- *
- * @param buffer the buffer where to put bits
- * @param buffer_size the size in bytes of buffer,
- *                    must be larger than the previous size
- */
-static inline void rebase_put_bits(PutBitContext *s, uint8_t *buffer,
-                                   int buffer_size)
-{
-    av_assert0(8*buffer_size > s->size_in_bits);
-
-    s->buf_end = buffer + buffer_size;
-    s->buf_ptr = buffer + (s->buf_ptr - s->buf);
-    s->buf     = buffer;
-    s->size_in_bits = 8 * buffer_size;
-}
-
-/**
  * @return the total number of bits written to the bitstream.
  */
 static inline int put_bits_count(PutBitContext *s)
@@ -88,6 +70,24 @@
 }
 
 /**
+ * Rebase the bit writer onto a reallocated buffer.
+ *
+ * @param buffer the buffer where to put bits
+ * @param buffer_size the size in bytes of buffer,
+ *                    must be large enough to hold everything written so far
+ */
+static inline void rebase_put_bits(PutBitContext *s, uint8_t *buffer,
+                                   int buffer_size)
+{
+    av_assert0(8*buffer_size >= put_bits_count(s));
+
+    s->buf_end = buffer + buffer_size;
+    s->buf_ptr = buffer + (s->buf_ptr - s->buf);
+    s->buf     = buffer;
+    s->size_in_bits = 8 * buffer_size;
+}
+
+/**
  * @return the number of bits available in the bitstream.
  */
 static inline int put_bits_left(PutBitContext* s)
diff --git a/libavcodec/qdm2.c b/libavcodec/qdm2.c
index 88b6b19..657b2da 100644
--- a/libavcodec/qdm2.c
+++ b/libavcodec/qdm2.c
@@ -408,7 +408,12 @@
             }
             for (k = 0; k < run; k++) {
                 if (j + k < 128) {
-                    if (coding_method[ch][sb + (j + k) / 64][(j + k) % 64] > coding_method[ch][sb][j]) {
+                    int sbjk = sb + (j + k) / 64;
+                    if (sbjk > 29) {
+                        SAMPLES_NEEDED
+                        continue;
+                    }
+                    if (coding_method[ch][sbjk][(j + k) % 64] > coding_method[ch][sb][j]) {
                         if (k > 0) {
                             SAMPLES_NEEDED
                             //not debugged, almost never used
@@ -1284,6 +1289,10 @@
             }
             offset += (n - 2);
         } else {
+            if (local_int_10 <= 2) {
+                av_log(NULL, AV_LOG_ERROR, "qdm2_fft_decode_tones() stuck\n");
+                return;
+            }
             offset += qdm2_get_vlc(gb, &vlc_tab_fft_tone_offset[local_int_8], 1, 2);
             while (offset >= (local_int_10 - 1)) {
                 offset       += (1 - (local_int_10 - 1));
@@ -1325,6 +1334,9 @@
         if (q->frequency_range > (local_int_14 + 1)) {
             int sub_packet = (local_int_20 + local_int_28);
 
+            if (q->fft_coefs_index + stereo >= FF_ARRAY_ELEMS(q->fft_coefs))
+                return;
+
             qdm2_fft_init_coefficient(q, sub_packet, offset, duration,
                                       channel, exp, phase);
             if (stereo)
@@ -1695,13 +1707,19 @@
     s->group_size = bytestream2_get_be32(&gb);
     s->fft_size = bytestream2_get_be32(&gb);
     s->checksum_size = bytestream2_get_be32(&gb);
-    if (s->checksum_size >= 1U << 28) {
-        av_log(avctx, AV_LOG_ERROR, "data block size too large (%u)\n", s->checksum_size);
+    if (s->checksum_size >= 1U << 28 || s->checksum_size <= 1) {
+        av_log(avctx, AV_LOG_ERROR, "data block size invalid (%u)\n", s->checksum_size);
         return AVERROR_INVALIDDATA;
     }
 
     s->fft_order = av_log2(s->fft_size) + 1;
 
+    // Fail on unknown fft order
+    if ((s->fft_order < 7) || (s->fft_order > 9)) {
+        avpriv_request_sample(avctx, "Unknown FFT order %d", s->fft_order);
+        return AVERROR_PATCHWELCOME;
+    }
+
     // something like max decodable tones
     s->group_order = av_log2(s->group_size) + 1;
     s->frame_size = s->group_size / 16; // 16 iterations per super block
@@ -1712,6 +1730,11 @@
     s->sub_sampling = s->fft_order - 7;
     s->frequency_range = 255 / (1 << (2 - s->sub_sampling));
 
+    if (s->frame_size * 4 >> s->sub_sampling > MPA_FRAME_SIZE) {
+        avpriv_request_sample(avctx, "large frames");
+        return AVERROR_PATCHWELCOME;
+    }
+
     switch ((s->sub_sampling * 2 + s->channels - 1)) {
         case 0: tmp = 40; break;
         case 1: tmp = 48; break;
@@ -1735,11 +1758,6 @@
     else
         s->coeff_per_sb_select = 2;
 
-    // Fail on unknown fft order
-    if ((s->fft_order < 7) || (s->fft_order > 9)) {
-        avpriv_request_sample(avctx, "Unknown FFT order %d", s->fft_order);
-        return AVERROR_PATCHWELCOME;
-    }
     if (s->fft_size != (1 << (s->fft_order - 1))) {
         av_log(avctx, AV_LOG_ERROR, "FFT size %d not power of 2.\n", s->fft_size);
         return AVERROR_INVALIDDATA;
diff --git a/libavcodec/qdmc.c b/libavcodec/qdmc.c
index 8f5b7b9..10ceb7a 100644
--- a/libavcodec/qdmc.c
+++ b/libavcodec/qdmc.c
@@ -367,6 +367,8 @@
 {
     int v;
 
+    if (get_bits_left(gb) < 1)
+        return AVERROR_INVALIDDATA;
     v = get_vlc2(gb, table->table, table->bits, 1);
     if (v < 0)
         return AVERROR_INVALIDDATA;
@@ -577,9 +579,9 @@
     for (j = 2; j < s->subframe_size - 1; j++) {
         float rnd_re, rnd_im;
 
-        s->rndval = 214013 * s->rndval + 2531011;
+        s->rndval = 214013U * s->rndval + 2531011;
         rnd_im = ((s->rndval & 0x7FFF) - 16384.0f) * 0.000030517578f * s->noise2_buffer[j];
-        s->rndval = 214013 * s->rndval + 2531011;
+        s->rndval = 214013U * s->rndval + 2531011;
         rnd_re = ((s->rndval & 0x7FFF) - 16384.0f) * 0.000030517578f * s->noise2_buffer[j];
         im[j  ] += rnd_im;
         re[j  ] += rnd_re;
diff --git a/libavcodec/qdrw.c b/libavcodec/qdrw.c
index 32ba410..65279c9 100644
--- a/libavcodec/qdrw.c
+++ b/libavcodec/qdrw.c
@@ -455,6 +455,8 @@
                 avpriv_request_sample(avctx, "Pack type %d", pack_type);
                 return AVERROR_PATCHWELCOME;
             }
+            if (bytestream2_get_bytes_left(&gbc) < 30)
+                return AVERROR_INVALIDDATA;
             if ((ret = ff_get_buffer(avctx, p, 0)) < 0)
                 return ret;
 
diff --git a/libavcodec/qpeg.c b/libavcodec/qpeg.c
index e1210c1..84304ca 100644
--- a/libavcodec/qpeg.c
+++ b/libavcodec/qpeg.c
@@ -30,7 +30,7 @@
 
 typedef struct QpegContext{
     AVCodecContext *avctx;
-    AVFrame *pic, *ref;
+    AVFrame *ref;
     uint32_t pal[256];
     GetByteContext buffer;
 } QpegContext;
@@ -80,16 +80,27 @@
 
             p = bytestream2_get_byte(&qctx->buffer);
             for(i = 0; i < run; i++) {
-                dst[filled++] = p;
+                int step = FFMIN(run - i, width - filled);
+                memset(dst+filled, p, step);
+                filled += step;
+                i      += step - 1;
                 if (filled >= width) {
                     filled = 0;
                     dst -= stride;
                     rows_to_go--;
+                    while (run - i > width && rows_to_go > 0) {
+                        memset(dst, p, width);
+                        dst -= stride;
+                        rows_to_go--;
+                        i += width;
+                    }
                     if(rows_to_go <= 0)
                         break;
                 }
             }
         } else {
+            if (bytestream2_get_bytes_left(&qctx->buffer) < copy)
+                copy = bytestream2_get_bytes_left(&qctx->buffer);
             for(i = 0; i < copy; i++) {
                 dst[filled++] = bytestream2_get_byte(&qctx->buffer);
                 if (filled >= width) {
@@ -256,10 +267,10 @@
 {
     uint8_t ctable[128];
     QpegContext * const a = avctx->priv_data;
-    AVFrame * const p = a->pic;
+    AVFrame * const p = data;
     AVFrame * const ref = a->ref;
     uint8_t* outdata;
-    int delta, ret;
+    int delta, intra, ret;
     int pal_size;
     const uint8_t *pal = av_packet_get_side_data(avpkt, AV_PKT_DATA_PALETTE, &pal_size);
 
@@ -270,9 +281,6 @@
 
     bytestream2_init(&a->buffer, avpkt->data, avpkt->size);
 
-    av_frame_unref(ref);
-    av_frame_move_ref(ref, p);
-
     if ((ret = ff_get_buffer(avctx, p, AV_GET_BUFFER_FLAG_REF)) < 0)
         return ret;
     outdata = p->data[0];
@@ -281,7 +289,8 @@
     bytestream2_skip(&a->buffer, 1);
 
     delta = bytestream2_get_byte(&a->buffer);
-    if(delta == 0x10) {
+    intra = delta == 0x10;
+    if (intra) {
         qpeg_decode_intra(a, outdata, p->linesize[0], avctx->width, avctx->height);
     } else {
         qpeg_decode_inter(a, outdata, p->linesize[0], avctx->width, avctx->height, delta, ctable, ref->data[0]);
@@ -296,9 +305,13 @@
     }
     memcpy(p->data[1], a->pal, AVPALETTE_SIZE);
 
-    if ((ret = av_frame_ref(data, p)) < 0)
+    av_frame_unref(ref);
+    if ((ret = av_frame_ref(ref, p)) < 0)
         return ret;
 
+    p->key_frame = intra;
+    p->pict_type = intra ? AV_PICTURE_TYPE_I : AV_PICTURE_TYPE_P;
+
     *got_frame      = 1;
 
     return avpkt->size;
@@ -309,6 +322,8 @@
     int i, pal_size;
     const uint8_t *pal_src;
 
+    av_frame_unref(a->ref);
+
     pal_size = FFMIN(1024U, avctx->extradata_size);
     pal_src = avctx->extradata + avctx->extradata_size - pal_size;
 
@@ -320,7 +335,6 @@
 {
     QpegContext * const a = avctx->priv_data;
 
-    av_frame_free(&a->pic);
     av_frame_free(&a->ref);
 
     return 0;
@@ -332,14 +346,11 @@
     a->avctx = avctx;
     avctx->pix_fmt= AV_PIX_FMT_PAL8;
 
-    decode_flush(avctx);
-
-    a->pic = av_frame_alloc();
     a->ref = av_frame_alloc();
-    if (!a->pic || !a->ref) {
-        decode_end(avctx);
+    if (!a->ref)
         return AVERROR(ENOMEM);
-    }
+
+    decode_flush(avctx);
 
     return 0;
 }
@@ -355,4 +366,6 @@
     .decode         = decode_frame,
     .flush          = decode_flush,
     .capabilities   = AV_CODEC_CAP_DR1,
+    .caps_internal  = FF_CODEC_CAP_INIT_THREADSAFE |
+                      FF_CODEC_CAP_INIT_CLEANUP,
 };
diff --git a/libavcodec/qsv.c b/libavcodec/qsv.c
index bb0d795..db98c75 100644
--- a/libavcodec/qsv.c
+++ b/libavcodec/qsv.c
@@ -60,6 +60,11 @@
 #endif
     case AV_CODEC_ID_MJPEG:
         return MFX_CODEC_JPEG;
+#if QSV_VERSION_ATLEAST(1, 19)
+    case AV_CODEC_ID_VP9:
+        return MFX_CODEC_VP9;
+#endif
+
     default:
         break;
     }
@@ -67,20 +72,46 @@
     return AVERROR(ENOSYS);
 }
 
-int ff_qsv_profile_to_mfx(enum AVCodecID codec_id, int profile)
+int ff_qsv_level_to_mfx(enum AVCodecID codec_id, int level)
 {
-    if (profile == FF_PROFILE_UNKNOWN)
-        return MFX_PROFILE_UNKNOWN;
+    if (level == FF_LEVEL_UNKNOWN)
+        return MFX_LEVEL_UNKNOWN;
+
     switch (codec_id) {
-    case AV_CODEC_ID_H264:
     case AV_CODEC_ID_HEVC:
-        return profile;
-    case AV_CODEC_ID_VC1:
-        return 4 * profile + 1;
-    case AV_CODEC_ID_MPEG2VIDEO:
-        return 0x10 * profile;
+        return level / 3;
+    default:
+        return level;
     }
-    return MFX_PROFILE_UNKNOWN;
+}
+
+static const struct {
+    int mfx_iopattern;
+    const char *desc;
+} qsv_iopatterns[] = {
+    {MFX_IOPATTERN_IN_VIDEO_MEMORY,     "input is video memory surface"         },
+    {MFX_IOPATTERN_IN_SYSTEM_MEMORY,    "input is system memory surface"        },
+    {MFX_IOPATTERN_IN_OPAQUE_MEMORY,    "input is opaque memory surface"        },
+    {MFX_IOPATTERN_OUT_VIDEO_MEMORY,    "output is video memory surface"        },
+    {MFX_IOPATTERN_OUT_SYSTEM_MEMORY,   "output is system memory surface"       },
+    {MFX_IOPATTERN_OUT_OPAQUE_MEMORY,   "output is opaque memory surface"       },
+};
+
+int ff_qsv_print_iopattern(void *log_ctx, int mfx_iopattern,
+                           const char *extra_string)
+{
+    const char *desc = NULL;
+
+    for (int i = 0; i < FF_ARRAY_ELEMS(qsv_iopatterns); i++) {
+        if (qsv_iopatterns[i].mfx_iopattern == mfx_iopattern) {
+            desc = qsv_iopatterns[i].desc;
+        }
+    }
+    if (!desc)
+        desc = "unknown iopattern";
+
+    av_log(log_ctx, AV_LOG_VERBOSE, "%s: %s\n", extra_string, desc);
+    return 0;
 }
 
 static const struct {
@@ -158,7 +189,7 @@
     return ret;
 }
 
-static enum AVPixelFormat qsv_map_fourcc(uint32_t fourcc)
+enum AVPixelFormat ff_qsv_map_fourcc(uint32_t fourcc)
 {
     switch (fourcc) {
     case MFX_FOURCC_NV12: return AV_PIX_FMT_NV12;
@@ -196,6 +227,24 @@
     return AVERROR_BUG;
 }
 
+enum AVFieldOrder ff_qsv_map_picstruct(int mfx_pic_struct)
+{
+    enum AVFieldOrder field = AV_FIELD_UNKNOWN;
+    switch (mfx_pic_struct & 0xF) {
+    case MFX_PICSTRUCT_PROGRESSIVE:
+        field = AV_FIELD_PROGRESSIVE;
+        break;
+    case MFX_PICSTRUCT_FIELD_TFF:
+        field = AV_FIELD_TT;
+        break;
+    case MFX_PICSTRUCT_FIELD_BFF:
+        field = AV_FIELD_BB;
+        break;
+    }
+
+    return field;
+}
+
 enum AVPictureType ff_qsv_map_pictype(int mfx_pic_type)
 {
     enum AVPictureType type;
@@ -276,27 +325,73 @@
 
 }
 
-int ff_qsv_init_internal_session(AVCodecContext *avctx, mfxSession *session,
-                                 const char *load_plugins)
+//This code is only required for Linux since a display handle is required.
+//For Windows the session is complete and ready to use.
+
+#ifdef AVCODEC_QSV_LINUX_SESSION_HANDLE
+static int ff_qsv_set_display_handle(AVCodecContext *avctx, QSVSession *qs)
 {
-    mfxIMPL impl   = MFX_IMPL_AUTO_ANY;
-    mfxVersion ver = { { QSV_VERSION_MINOR, QSV_VERSION_MAJOR } };
+    AVDictionary *child_device_opts = NULL;
+    AVVAAPIDeviceContext *hwctx;
+    int ret;
+
+    av_dict_set(&child_device_opts, "kernel_driver", "i915", 0);
+    av_dict_set(&child_device_opts, "driver",        "iHD",  0);
+
+    ret = av_hwdevice_ctx_create(&qs->va_device_ref, AV_HWDEVICE_TYPE_VAAPI, NULL, child_device_opts, 0);
+    if (ret < 0) {
+        av_log(avctx, AV_LOG_ERROR, "Failed to create a VAAPI device.\n");
+        return ret;
+    } else {
+        qs->va_device_ctx = (AVHWDeviceContext*)qs->va_device_ref->data;
+        hwctx = qs->va_device_ctx->hwctx;
+
+        ret = MFXVideoCORE_SetHandle(qs->session,
+                (mfxHandleType)MFX_HANDLE_VA_DISPLAY, (mfxHDL)hwctx->display);
+        if (ret < 0) {
+            return ff_qsv_print_error(avctx, ret, "Error during set display handle\n");
+        }
+    }
+
+    av_dict_free(&child_device_opts);
+
+    return 0;
+}
+#endif //AVCODEC_QSV_LINUX_SESSION_HANDLE
+
+int ff_qsv_init_internal_session(AVCodecContext *avctx, QSVSession *qs,
+                                 const char *load_plugins, int gpu_copy)
+{
+    mfxIMPL          impl = MFX_IMPL_AUTO_ANY;
+    mfxVersion        ver = { { QSV_VERSION_MINOR, QSV_VERSION_MAJOR } };
+    mfxInitParam init_par = { MFX_IMPL_AUTO_ANY };
 
     const char *desc;
     int ret;
 
-    ret = MFXInit(impl, &ver, session);
+#if QSV_VERSION_ATLEAST(1, 16)
+    init_par.GPUCopy        = gpu_copy;
+#endif
+    init_par.Implementation = impl;
+    init_par.Version        = ver;
+    ret = MFXInitEx(init_par, &qs->session);
     if (ret < 0)
         return ff_qsv_print_error(avctx, ret,
                                   "Error initializing an internal MFX session");
 
-    ret = qsv_load_plugins(*session, load_plugins, avctx);
+#ifdef AVCODEC_QSV_LINUX_SESSION_HANDLE
+    ret = ff_qsv_set_display_handle(avctx, qs);
+    if (ret < 0)
+        return ret;
+#endif
+
+    ret = qsv_load_plugins(qs->session, load_plugins, avctx);
     if (ret < 0) {
         av_log(avctx, AV_LOG_ERROR, "Error loading plugins\n");
         return ret;
     }
 
-    MFXQueryIMPL(*session, &impl);
+    MFXQueryIMPL(qs->session, &impl);
 
     switch (MFX_IMPL_BASETYPE(impl)) {
     case MFX_IMPL_SOFTWARE:
@@ -451,7 +546,7 @@
         frames_hwctx = frames_ctx->hwctx;
 
         frames_ctx->format            = AV_PIX_FMT_QSV;
-        frames_ctx->sw_format         = qsv_map_fourcc(i->FourCC);
+        frames_ctx->sw_format         = ff_qsv_map_fourcc(i->FourCC);
         frames_ctx->width             = i->Width;
         frames_ctx->height            = i->Height;
         frames_ctx->initial_pool_size = req->NumFrameSuggested;
@@ -571,7 +666,8 @@
 }
 
 int ff_qsv_init_session_device(AVCodecContext *avctx, mfxSession *psession,
-                               AVBufferRef *device_ref, const char *load_plugins)
+                               AVBufferRef *device_ref, const char *load_plugins,
+                               int gpu_copy)
 {
     static const mfxHandleType handle_types[] = {
         MFX_HANDLE_VA_DISPLAY,
@@ -581,11 +677,12 @@
     AVHWDeviceContext    *device_ctx = (AVHWDeviceContext*)device_ref->data;
     AVQSVDeviceContext *device_hwctx = device_ctx->hwctx;
     mfxSession        parent_session = device_hwctx->session;
+    mfxInitParam            init_par = { MFX_IMPL_AUTO_ANY };
+    mfxHDL                    handle = NULL;
 
     mfxSession    session;
     mfxVersion    ver;
     mfxIMPL       impl;
-    mfxHDL        handle = NULL;
     mfxHandleType handle_type;
     mfxStatus err;
 
@@ -611,7 +708,12 @@
                "from the session\n");
     }
 
-    err = MFXInit(impl, &ver, &session);
+#if QSV_VERSION_ATLEAST(1, 16)
+    init_par.GPUCopy        = gpu_copy;
+#endif
+    init_par.Implementation = impl;
+    init_par.Version        = ver;
+    err = MFXInitEx(init_par, &session);
     if (err != MFX_ERR_NONE)
         return ff_qsv_print_error(avctx, err,
                                   "Error initializing a child MFX session");
@@ -642,7 +744,7 @@
 
 int ff_qsv_init_session_frames(AVCodecContext *avctx, mfxSession *psession,
                                QSVFramesContext *qsv_frames_ctx,
-                               const char *load_plugins, int opaque)
+                               const char *load_plugins, int opaque, int gpu_copy)
 {
     mfxFrameAllocator frame_allocator = {
         .pthis  = qsv_frames_ctx,
@@ -662,7 +764,7 @@
     int ret;
 
     ret = ff_qsv_init_session_device(avctx, &session,
-                                     frames_ctx->device_ref, load_plugins);
+                                     frames_ctx->device_ref, load_plugins, gpu_copy);
     if (ret < 0)
         return ret;
 
@@ -686,3 +788,15 @@
     *psession = session;
     return 0;
 }
+
+int ff_qsv_close_internal_session(QSVSession *qs)
+{
+    if (qs->session) {
+        MFXClose(qs->session);
+        qs->session = NULL;
+    }
+#ifdef AVCODEC_QSV_LINUX_SESSION_HANDLE
+    av_buffer_unref(&qs->va_device_ref);
+#endif
+    return 0;
+}
diff --git a/libavcodec/qsv_internal.h b/libavcodec/qsv_internal.h
index 394c558..6489836 100644
--- a/libavcodec/qsv_internal.h
+++ b/libavcodec/qsv_internal.h
@@ -21,6 +21,22 @@
 #ifndef AVCODEC_QSV_INTERNAL_H
 #define AVCODEC_QSV_INTERNAL_H
 
+#if CONFIG_VAAPI
+#define AVCODEC_QSV_LINUX_SESSION_HANDLE
+#endif //CONFIG_VAAPI
+
+#ifdef AVCODEC_QSV_LINUX_SESSION_HANDLE
+#include <stdio.h>
+#include <string.h>
+#if HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#include <fcntl.h>
+#include <va/va.h>
+#include <va/va_drm.h>
+#include "libavutil/hwcontext_vaapi.h"
+#endif
+
 #include <mfx/mfxvideo.h>
 
 #include "libavutil/frame.h"
@@ -39,8 +55,8 @@
      MFX_VERSION_MAJOR == (MAJOR) && MFX_VERSION_MINOR >= (MINOR))
 
 #define QSV_RUNTIME_VERSION_ATLEAST(MFX_VERSION, MAJOR, MINOR) \
-    (MFX_VERSION.Major > (MAJOR)) ||                           \
-    (MFX_VERSION.Major == (MAJOR) && MFX_VERSION.Minor >= (MINOR))
+    ((MFX_VERSION.Major > (MAJOR)) ||                           \
+    (MFX_VERSION.Major == (MAJOR) && MFX_VERSION.Minor >= (MINOR)))
 
 typedef struct QSVMid {
     AVBufferRef *hw_frames_ref;
@@ -64,6 +80,14 @@
     struct QSVFrame *next;
 } QSVFrame;
 
+typedef struct QSVSession {
+    mfxSession session;
+#ifdef AVCODEC_QSV_LINUX_SESSION_HANDLE
+    AVBufferRef *va_device_ref;
+    AVHWDeviceContext *va_device_ctx;
+#endif
+} QSVSession;
+
 typedef struct QSVFramesContext {
     AVBufferRef *hw_frames_ctx;
     void *logctx;
@@ -77,6 +101,9 @@
     int  nb_mids;
 } QSVFramesContext;
 
+int ff_qsv_print_iopattern(void *log_ctx, int mfx_iopattern,
+                           const char *extra_string);
+
 /**
  * Convert a libmfx error code into an ffmpeg error code.
  */
@@ -89,20 +116,27 @@
                          const char *warning_string);
 
 int ff_qsv_codec_id_to_mfx(enum AVCodecID codec_id);
-int ff_qsv_profile_to_mfx(enum AVCodecID codec_id, int profile);
+int ff_qsv_level_to_mfx(enum AVCodecID codec_id, int level);
+
+enum AVPixelFormat ff_qsv_map_fourcc(uint32_t fourcc);
 
 int ff_qsv_map_pixfmt(enum AVPixelFormat format, uint32_t *fourcc);
 enum AVPictureType ff_qsv_map_pictype(int mfx_pic_type);
 
-int ff_qsv_init_internal_session(AVCodecContext *avctx, mfxSession *session,
-                                 const char *load_plugins);
+enum AVFieldOrder ff_qsv_map_picstruct(int mfx_pic_struct);
+
+int ff_qsv_init_internal_session(AVCodecContext *avctx, QSVSession *qs,
+                                 const char *load_plugins, int gpu_copy);
+
+int ff_qsv_close_internal_session(QSVSession *qs);
 
 int ff_qsv_init_session_device(AVCodecContext *avctx, mfxSession *psession,
-                               AVBufferRef *device_ref, const char *load_plugins);
+                               AVBufferRef *device_ref, const char *load_plugins,
+                               int gpu_copy);
 
 int ff_qsv_init_session_frames(AVCodecContext *avctx, mfxSession *session,
                                QSVFramesContext *qsv_frames_ctx,
-                               const char *load_plugins, int opaque);
+                               const char *load_plugins, int opaque, int gpu_copy);
 
 int ff_qsv_find_surface_idx(QSVFramesContext *ctx, QSVFrame *frame);
 
diff --git a/libavcodec/qsvdec.c b/libavcodec/qsvdec.c
index 22e7a46..fc25dc7 100644
--- a/libavcodec/qsvdec.c
+++ b/libavcodec/qsvdec.c
@@ -34,9 +34,11 @@
 #include "libavutil/pixdesc.h"
 #include "libavutil/pixfmt.h"
 #include "libavutil/time.h"
+#include "libavutil/imgutils.h"
 
 #include "avcodec.h"
 #include "internal.h"
+#include "decode.h"
 #include "qsv.h"
 #include "qsv_internal.h"
 #include "qsvdec.h"
@@ -54,17 +56,60 @@
     NULL
 };
 
+static int ff_qsv_get_continuous_buffer(AVCodecContext *avctx, AVFrame *frame, AVBufferPool *pool)
+{
+    int ret = 0;
+
+    ff_decode_frame_props(avctx, frame);
+
+    frame->width       = avctx->width;
+    frame->height      = avctx->height;
+
+    switch (avctx->pix_fmt) {
+    case AV_PIX_FMT_NV12:
+        frame->linesize[0] = FFALIGN(avctx->width, 128);
+        break;
+    case AV_PIX_FMT_P010:
+        frame->linesize[0] = 2 * FFALIGN(avctx->width, 128);
+        break;
+    default:
+        av_log(avctx, AV_LOG_ERROR, "Unsupported pixel format.\n");
+        return AVERROR(EINVAL);
+    }
+
+    frame->linesize[1] = frame->linesize[0];
+    frame->buf[0]      = av_buffer_pool_get(pool);
+    if (!frame->buf[0])
+        return AVERROR(ENOMEM);
+
+    frame->data[0] = frame->buf[0]->data;
+    frame->data[1] = frame->data[0] +
+                            frame->linesize[0] * FFALIGN(avctx->height, 64);
+
+    ret = ff_attach_decode_data(frame);
+    if (ret < 0)
+        return ret;
+
+    return 0;
+}
+
 static int qsv_init_session(AVCodecContext *avctx, QSVContext *q, mfxSession session,
                             AVBufferRef *hw_frames_ref, AVBufferRef *hw_device_ref)
 {
     int ret;
 
+    if (q->gpu_copy == MFX_GPUCOPY_ON &&
+        !(q->iopattern & MFX_IOPATTERN_OUT_SYSTEM_MEMORY)) {
+        av_log(avctx, AV_LOG_WARNING, "GPU-accelerated memory copy "
+                        "only works in system memory mode.\n");
+        q->gpu_copy = MFX_GPUCOPY_OFF;
+    }
     if (session) {
         q->session = session;
     } else if (hw_frames_ref) {
-        if (q->internal_session) {
-            MFXClose(q->internal_session);
-            q->internal_session = NULL;
+        if (q->internal_qs.session) {
+            MFXClose(q->internal_qs.session);
+            q->internal_qs.session = NULL;
         }
         av_buffer_unref(&q->frames_ctx.hw_frames_ctx);
 
@@ -72,36 +117,37 @@
         if (!q->frames_ctx.hw_frames_ctx)
             return AVERROR(ENOMEM);
 
-        ret = ff_qsv_init_session_frames(avctx, &q->internal_session,
+        ret = ff_qsv_init_session_frames(avctx, &q->internal_qs.session,
                                          &q->frames_ctx, q->load_plugins,
-                                         q->iopattern == MFX_IOPATTERN_OUT_OPAQUE_MEMORY);
+                                         q->iopattern == MFX_IOPATTERN_OUT_OPAQUE_MEMORY,
+                                         q->gpu_copy);
         if (ret < 0) {
             av_buffer_unref(&q->frames_ctx.hw_frames_ctx);
             return ret;
         }
 
-        q->session = q->internal_session;
+        q->session = q->internal_qs.session;
     } else if (hw_device_ref) {
-        if (q->internal_session) {
-            MFXClose(q->internal_session);
-            q->internal_session = NULL;
+        if (q->internal_qs.session) {
+            MFXClose(q->internal_qs.session);
+            q->internal_qs.session = NULL;
         }
 
-        ret = ff_qsv_init_session_device(avctx, &q->internal_session,
-                                         hw_device_ref, q->load_plugins);
+        ret = ff_qsv_init_session_device(avctx, &q->internal_qs.session,
+                                         hw_device_ref, q->load_plugins, q->gpu_copy);
         if (ret < 0)
             return ret;
 
-        q->session = q->internal_session;
+        q->session = q->internal_qs.session;
     } else {
-        if (!q->internal_session) {
-            ret = ff_qsv_init_internal_session(avctx, &q->internal_session,
-                                               q->load_plugins);
+        if (!q->internal_qs.session) {
+            ret = ff_qsv_init_internal_session(avctx, &q->internal_qs,
+                                               q->load_plugins, q->gpu_copy);
             if (ret < 0)
                 return ret;
         }
 
-        q->session = q->internal_session;
+        q->session = q->internal_qs.session;
     }
 
     /* make sure the decoder is uninitialized */
@@ -120,19 +166,21 @@
     return av_fifo_size(fifo) / qsv_fifo_item_size();
 }
 
-static int qsv_decode_init(AVCodecContext *avctx, QSVContext *q)
+static int qsv_decode_preinit(AVCodecContext *avctx, QSVContext *q, enum AVPixelFormat pix_fmt, mfxVideoParam *param)
 {
-    const AVPixFmtDescriptor *desc;
     mfxSession session = NULL;
     int iopattern = 0;
-    mfxVideoParam param = { 0 };
-    int frame_width  = avctx->coded_width;
-    int frame_height = avctx->coded_height;
     int ret;
+    enum AVPixelFormat pix_fmts[3] = {
+        AV_PIX_FMT_QSV, /* opaque format in case of video memory output */
+        pix_fmt,        /* system memory format obtained from bitstream parser */
+        AV_PIX_FMT_NONE };
 
-    desc = av_pix_fmt_desc_get(avctx->sw_pix_fmt);
-    if (!desc)
-        return AVERROR_BUG;
+    ret = ff_get_format(avctx, pix_fmts);
+    if (ret < 0) {
+        q->orig_pix_fmt = avctx->pix_fmt = AV_PIX_FMT_NONE;
+        return ret;
+    }
 
     if (!q->async_fifo) {
         q->async_fifo = av_fifo_alloc(q->async_depth * qsv_fifo_item_size());
@@ -164,54 +212,83 @@
         iopattern = MFX_IOPATTERN_OUT_SYSTEM_MEMORY;
     q->iopattern = iopattern;
 
+    ff_qsv_print_iopattern(avctx, q->iopattern, "Decoder");
+
     ret = qsv_init_session(avctx, q, session, avctx->hw_frames_ctx, avctx->hw_device_ctx);
     if (ret < 0) {
         av_log(avctx, AV_LOG_ERROR, "Error initializing an MFX session\n");
         return ret;
     }
 
-    ret = ff_qsv_codec_id_to_mfx(avctx->codec_id);
-    if (ret < 0)
-        return ret;
+    param->IOPattern   = q->iopattern;
+    param->AsyncDepth  = q->async_depth;
+    param->ExtParam    = q->ext_buffers;
+    param->NumExtParam = q->nb_ext_buffers;
 
-    param.mfx.CodecId      = ret;
-    param.mfx.CodecProfile = ff_qsv_profile_to_mfx(avctx->codec_id, avctx->profile);
-    param.mfx.CodecLevel   = avctx->level == FF_LEVEL_UNKNOWN ? MFX_LEVEL_UNKNOWN : avctx->level;
+    return 0;
+ }
 
-    param.mfx.FrameInfo.BitDepthLuma   = desc->comp[0].depth;
-    param.mfx.FrameInfo.BitDepthChroma = desc->comp[0].depth;
-    param.mfx.FrameInfo.Shift          = desc->comp[0].depth > 8;
-    param.mfx.FrameInfo.FourCC         = q->fourcc;
-    param.mfx.FrameInfo.Width          = frame_width;
-    param.mfx.FrameInfo.Height         = frame_height;
-    param.mfx.FrameInfo.ChromaFormat   = MFX_CHROMAFORMAT_YUV420;
+static int qsv_decode_init(AVCodecContext *avctx, QSVContext *q, mfxVideoParam *param)
+{
+    int ret;
 
-    switch (avctx->field_order) {
-    case AV_FIELD_PROGRESSIVE:
-        param.mfx.FrameInfo.PicStruct = MFX_PICSTRUCT_PROGRESSIVE;
-        break;
-    case AV_FIELD_TT:
-        param.mfx.FrameInfo.PicStruct = MFX_PICSTRUCT_FIELD_TFF;
-        break;
-    case AV_FIELD_BB:
-        param.mfx.FrameInfo.PicStruct = MFX_PICSTRUCT_FIELD_BFF;
-        break;
-    default:
-        param.mfx.FrameInfo.PicStruct = MFX_PICSTRUCT_UNKNOWN;
-        break;
-    }
+    avctx->width        = param->mfx.FrameInfo.CropW;
+    avctx->height       = param->mfx.FrameInfo.CropH;
+    avctx->coded_width  = param->mfx.FrameInfo.Width;
+    avctx->coded_height = param->mfx.FrameInfo.Height;
+    avctx->level        = param->mfx.CodecLevel;
+    avctx->profile      = param->mfx.CodecProfile;
+    avctx->field_order  = ff_qsv_map_picstruct(param->mfx.FrameInfo.PicStruct);
+    avctx->pix_fmt      = ff_qsv_map_fourcc(param->mfx.FrameInfo.FourCC);
 
-    param.IOPattern   = q->iopattern;
-    param.AsyncDepth  = q->async_depth;
-    param.ExtParam    = q->ext_buffers;
-    param.NumExtParam = q->nb_ext_buffers;
-
-    ret = MFXVideoDECODE_Init(q->session, &param);
+    ret = MFXVideoDECODE_Init(q->session, param);
     if (ret < 0)
         return ff_qsv_print_error(avctx, ret,
                                   "Error initializing the MFX video decoder");
 
-    q->frame_info = param.mfx.FrameInfo;
+    q->frame_info = param->mfx.FrameInfo;
+
+    if (!avctx->hw_frames_ctx)
+        q->pool = av_buffer_pool_init(av_image_get_buffer_size(avctx->pix_fmt,
+                    FFALIGN(avctx->width, 128), FFALIGN(avctx->height, 64), 1), av_buffer_allocz);
+    return 0;
+}
+
+static int qsv_decode_header(AVCodecContext *avctx, QSVContext *q, AVPacket *avpkt, enum AVPixelFormat pix_fmt, mfxVideoParam *param)
+{
+    int ret;
+
+    mfxBitstream bs = { 0 };
+
+    if (avpkt->size) {
+        bs.Data       = avpkt->data;
+        bs.DataLength = avpkt->size;
+        bs.MaxLength  = bs.DataLength;
+        bs.TimeStamp  = avpkt->pts;
+        if (avctx->field_order == AV_FIELD_PROGRESSIVE)
+            bs.DataFlag   |= MFX_BITSTREAM_COMPLETE_FRAME;
+    } else
+        return AVERROR_INVALIDDATA;
+
+
+    if(!q->session) {
+        ret = qsv_decode_preinit(avctx, q, pix_fmt, param);
+        if (ret < 0)
+            return ret;
+    }
+
+    ret = ff_qsv_codec_id_to_mfx(avctx->codec_id);
+    if (ret < 0)
+        return ret;
+
+    param->mfx.CodecId = ret;
+    ret = MFXVideoDECODE_DecodeHeader(q->session, &bs, param);
+    if (MFX_ERR_MORE_DATA == ret) {
+       return AVERROR(EAGAIN);
+    }
+    if (ret < 0)
+        return ff_qsv_print_error(avctx, ret,
+                "Error decoding stream header");
 
     return 0;
 }
@@ -220,7 +297,11 @@
 {
     int ret;
 
-    ret = ff_get_buffer(avctx, frame->frame, AV_GET_BUFFER_FLAG_REF);
+    if (q->pool)
+        ret = ff_qsv_get_continuous_buffer(avctx, frame->frame, q->pool);
+    else
+        ret = ff_get_buffer(avctx, frame->frame, AV_GET_BUFFER_FLAG_REF);
+
     if (ret < 0)
         return ret;
 
@@ -372,6 +453,8 @@
         ++q->zero_consume_run;
         if (q->zero_consume_run > 1)
             ff_qsv_print_warning(avctx, ret, "A decode call did not consume any data");
+    } else if (!*sync && bs.DataOffset) {
+        ++q->buffered_count;
     } else {
         q->zero_consume_run = 0;
     }
@@ -474,14 +557,11 @@
     av_fifo_free(q->async_fifo);
     q->async_fifo = NULL;
 
-    av_parser_close(q->parser);
-    avcodec_free_context(&q->avctx_internal);
-
-    if (q->internal_session)
-        MFXClose(q->internal_session);
+    ff_qsv_close_internal_session(&q->internal_qs);
 
     av_buffer_unref(&q->frames_ctx.hw_frames_ctx);
     av_buffer_unref(&q->frames_ctx.mids_buf);
+    av_buffer_pool_uninit(&q->pool);
 
     return 0;
 }
@@ -489,90 +569,67 @@
 int ff_qsv_process_data(AVCodecContext *avctx, QSVContext *q,
                         AVFrame *frame, int *got_frame, AVPacket *pkt)
 {
-    uint8_t *dummy_data;
-    int dummy_size;
     int ret;
-    const AVPixFmtDescriptor *desc;
-
-    if (!q->avctx_internal) {
-        q->avctx_internal = avcodec_alloc_context3(NULL);
-        if (!q->avctx_internal)
-            return AVERROR(ENOMEM);
-
-        q->parser = av_parser_init(avctx->codec_id);
-        if (!q->parser)
-            return AVERROR(ENOMEM);
-
-        q->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
-        q->orig_pix_fmt   = AV_PIX_FMT_NONE;
-    }
+    mfxVideoParam param = { 0 };
+    enum AVPixelFormat pix_fmt = AV_PIX_FMT_NV12;
 
     if (!pkt->size)
         return qsv_decode(avctx, q, frame, got_frame, pkt);
 
-    /* we assume the packets are already split properly and want
-     * just the codec parameters here */
-    av_parser_parse2(q->parser, q->avctx_internal,
-                     &dummy_data, &dummy_size,
-                     pkt->data, pkt->size, pkt->pts, pkt->dts,
-                     pkt->pos);
-
-    avctx->field_order  = q->parser->field_order;
     /* TODO: flush delayed frames on reinit */
-    if (q->parser->format       != q->orig_pix_fmt    ||
-        FFALIGN(q->parser->coded_width, 16)  != FFALIGN(avctx->coded_width, 16) ||
-        FFALIGN(q->parser->coded_height, 16) != FFALIGN(avctx->coded_height, 16)) {
-        enum AVPixelFormat pix_fmts[3] = { AV_PIX_FMT_QSV,
-                                           AV_PIX_FMT_NONE,
-                                           AV_PIX_FMT_NONE };
-        enum AVPixelFormat qsv_format;
 
-        qsv_format = ff_qsv_map_pixfmt(q->parser->format, &q->fourcc);
-        if (qsv_format < 0) {
-            av_log(avctx, AV_LOG_ERROR,
-                   "Decoding pixel format '%s' is not supported\n",
-                   av_get_pix_fmt_name(q->parser->format));
-            ret = AVERROR(ENOSYS);
-            goto reinit_fail;
+    // sw_pix_fmt, coded_width/height should be set for ff_get_format(),
+    // assume sw_pix_fmt is NV12 and coded_width/height to be 1280x720,
+    // the assumption may be not corret but will be updated after header decoded if not true.
+    if (q->orig_pix_fmt != AV_PIX_FMT_NONE)
+        pix_fmt = q->orig_pix_fmt;
+    if (!avctx->coded_width)
+        avctx->coded_width = 1280;
+    if (!avctx->coded_height)
+        avctx->coded_height = 720;
+
+    ret = qsv_decode_header(avctx, q, pkt, pix_fmt, &param);
+
+    if (ret >= 0 && (q->orig_pix_fmt != ff_qsv_map_fourcc(param.mfx.FrameInfo.FourCC) ||
+        avctx->coded_width  != param.mfx.FrameInfo.Width ||
+        avctx->coded_height != param.mfx.FrameInfo.Height)) {
+        AVPacket zero_pkt = {0};
+
+        if (q->buffered_count) {
+            q->reinit_flag = 1;
+            /* decode zero-size pkt to flush the buffered pkt before reinit */
+            q->buffered_count--;
+            return qsv_decode(avctx, q, frame, got_frame, &zero_pkt);
         }
+        q->reinit_flag = 0;
 
-        q->orig_pix_fmt     = q->parser->format;
-        avctx->pix_fmt      = pix_fmts[1] = qsv_format;
-        avctx->width        = q->parser->width;
-        avctx->height       = q->parser->height;
-        avctx->coded_width  = FFALIGN(q->parser->coded_width, 16);
-        avctx->coded_height = FFALIGN(q->parser->coded_height, 16);
-        avctx->level        = q->avctx_internal->level;
-        avctx->profile      = q->avctx_internal->profile;
+        q->orig_pix_fmt = avctx->pix_fmt = pix_fmt = ff_qsv_map_fourcc(param.mfx.FrameInfo.FourCC);
 
-        ret = ff_get_format(avctx, pix_fmts);
+        avctx->coded_width  = param.mfx.FrameInfo.Width;
+        avctx->coded_height = param.mfx.FrameInfo.Height;
+
+        ret = qsv_decode_preinit(avctx, q, pix_fmt, &param);
         if (ret < 0)
             goto reinit_fail;
+        q->initialized = 0;
+    }
 
-        avctx->pix_fmt = ret;
-
-        desc = av_pix_fmt_desc_get(avctx->pix_fmt);
-        if (!desc)
-            goto reinit_fail;
-
-         if (desc->comp[0].depth > 8) {
-            avctx->coded_width =  FFALIGN(q->parser->coded_width, 32);
-            avctx->coded_height = FFALIGN(q->parser->coded_height, 32);
-        }
-
-        ret = qsv_decode_init(avctx, q);
+    if (!q->initialized) {
+        ret = qsv_decode_init(avctx, q, &param);
         if (ret < 0)
             goto reinit_fail;
+        q->initialized = 1;
     }
 
     return qsv_decode(avctx, q, frame, got_frame, pkt);
 
 reinit_fail:
-    q->orig_pix_fmt = q->parser->format = avctx->pix_fmt = AV_PIX_FMT_NONE;
+    q->orig_pix_fmt = avctx->pix_fmt = AV_PIX_FMT_NONE;
     return ret;
 }
 
 void ff_qsv_decode_flush(AVCodecContext *avctx, QSVContext *q)
 {
     q->orig_pix_fmt = AV_PIX_FMT_NONE;
+    q->initialized = 0;
 }
diff --git a/libavcodec/qsvdec.h b/libavcodec/qsvdec.h
index 5b7b03a..dec1f61 100644
--- a/libavcodec/qsvdec.h
+++ b/libavcodec/qsvdec.h
@@ -42,7 +42,7 @@
 
     // the session we allocated internally, in case the caller did not provide
     // one
-    mfxSession internal_session;
+    QSVSession internal_qs;
 
     QSVFramesContext frames_ctx;
 
@@ -53,17 +53,20 @@
 
     AVFifoBuffer *async_fifo;
     int zero_consume_run;
+    int buffered_count;
+    int reinit_flag;
 
-    // the internal parser and codec context for parsing the data
-    AVCodecParserContext *parser;
-    AVCodecContext *avctx_internal;
     enum AVPixelFormat orig_pix_fmt;
     uint32_t fourcc;
     mfxFrameInfo frame_info;
+    AVBufferPool *pool;
+
+    int initialized;
 
     // options set by the caller
     int async_depth;
     int iopattern;
+    int gpu_copy;
 
     char *load_plugins;
 
diff --git a/libavcodec/qsvdec_h2645.c b/libavcodec/qsvdec_h2645.c
index d9d2318..02c4188 100644
--- a/libavcodec/qsvdec_h2645.c
+++ b/libavcodec/qsvdec_h2645.c
@@ -103,6 +103,7 @@
         }
     }
 
+    s->qsv.orig_pix_fmt = AV_PIX_FMT_NV12;
     s->packet_fifo = av_fifo_alloc(sizeof(AVPacket));
     if (!s->packet_fifo) {
         ret = AVERROR(ENOMEM);
@@ -124,7 +125,7 @@
 
     /* buffer the input packet */
     if (avpkt->size) {
-        AVPacket input_ref = { 0 };
+        AVPacket input_ref;
 
         if (av_fifo_space(s->packet_fifo) < sizeof(input_ref)) {
             ret = av_fifo_realloc2(s->packet_fifo,
@@ -146,10 +147,11 @@
             /* no more data */
             if (av_fifo_size(s->packet_fifo) < sizeof(AVPacket))
                 return avpkt->size ? avpkt->size : ff_qsv_process_data(avctx, &s->qsv, frame, got_frame, avpkt);
-
-            av_packet_unref(&s->buffer_pkt);
-
-            av_fifo_generic_read(s->packet_fifo, &s->buffer_pkt, sizeof(s->buffer_pkt), NULL);
+            /* in progress of reinit, no read from fifo and keep the buffer_pkt */
+            if (!s->qsv.reinit_flag) {
+                av_packet_unref(&s->buffer_pkt);
+                av_fifo_generic_read(s->packet_fifo, &s->buffer_pkt, sizeof(s->buffer_pkt), NULL);
+            }
         }
 
         ret = ff_qsv_process_data(avctx, &s->qsv, frame, got_frame, &s->buffer_pkt);
@@ -159,6 +161,8 @@
             av_packet_unref(&s->buffer_pkt);
             return ret;
         }
+        if (s->qsv.reinit_flag)
+            continue;
 
         s->buffer_pkt.size -= ret;
         s->buffer_pkt.data += ret;
@@ -175,12 +179,6 @@
     ff_qsv_decode_flush(avctx, &s->qsv);
 }
 
-#if defined(_WIN32)
-#define LOAD_PLUGIN_DEFAULT LOAD_PLUGIN_HEVC_SW
-#else
-#define LOAD_PLUGIN_DEFAULT LOAD_PLUGIN_HEVC_HW
-#endif
-
 #define OFFSET(x) offsetof(QSVH2645Context, x)
 #define VD AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM
 
@@ -188,13 +186,18 @@
 static const AVOption hevc_options[] = {
     { "async_depth", "Internal parallelization depth, the higher the value the higher the latency.", OFFSET(qsv.async_depth), AV_OPT_TYPE_INT, { .i64 = ASYNC_DEPTH_DEFAULT }, 1, INT_MAX, VD },
 
-    { "load_plugin", "A user plugin to load in an internal session", OFFSET(load_plugin), AV_OPT_TYPE_INT, { .i64 = LOAD_PLUGIN_DEFAULT }, LOAD_PLUGIN_NONE, LOAD_PLUGIN_HEVC_HW, VD, "load_plugin" },
+    { "load_plugin", "A user plugin to load in an internal session", OFFSET(load_plugin), AV_OPT_TYPE_INT, { .i64 = LOAD_PLUGIN_HEVC_HW }, LOAD_PLUGIN_NONE, LOAD_PLUGIN_HEVC_HW, VD, "load_plugin" },
     { "none",     NULL, 0, AV_OPT_TYPE_CONST, { .i64 = LOAD_PLUGIN_NONE },    0, 0, VD, "load_plugin" },
     { "hevc_sw",  NULL, 0, AV_OPT_TYPE_CONST, { .i64 = LOAD_PLUGIN_HEVC_SW }, 0, 0, VD, "load_plugin" },
     { "hevc_hw",  NULL, 0, AV_OPT_TYPE_CONST, { .i64 = LOAD_PLUGIN_HEVC_HW }, 0, 0, VD, "load_plugin" },
 
     { "load_plugins", "A :-separate list of hexadecimal plugin UIDs to load in an internal session",
         OFFSET(qsv.load_plugins), AV_OPT_TYPE_STRING, { .str = "" }, 0, 0, VD },
+
+    { "gpu_copy", "A GPU-accelerated copy between video and system memory", OFFSET(qsv.gpu_copy), AV_OPT_TYPE_INT, { .i64 = MFX_GPUCOPY_DEFAULT }, MFX_GPUCOPY_DEFAULT, MFX_GPUCOPY_OFF, VD, "gpu_copy"},
+        { "default", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_GPUCOPY_DEFAULT }, 0, 0, VD, "gpu_copy"},
+        { "on",      NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_GPUCOPY_ON },      0, 0, VD, "gpu_copy"},
+        { "off",     NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_GPUCOPY_OFF },     0, 0, VD, "gpu_copy"},
     { NULL },
 };
 
@@ -230,6 +233,11 @@
 #if CONFIG_H264_QSV_DECODER
 static const AVOption options[] = {
     { "async_depth", "Internal parallelization depth, the higher the value the higher the latency.", OFFSET(qsv.async_depth), AV_OPT_TYPE_INT, { .i64 = ASYNC_DEPTH_DEFAULT }, 1, INT_MAX, VD },
+
+    { "gpu_copy", "A GPU-accelerated copy between video and system memory", OFFSET(qsv.gpu_copy), AV_OPT_TYPE_INT, { .i64 = MFX_GPUCOPY_DEFAULT }, MFX_GPUCOPY_DEFAULT, MFX_GPUCOPY_OFF, VD, "gpu_copy"},
+        { "default", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_GPUCOPY_DEFAULT }, 0, 0, VD, "gpu_copy"},
+        { "on",      NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_GPUCOPY_ON },      0, 0, VD, "gpu_copy"},
+        { "off",     NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_GPUCOPY_OFF },     0, 0, VD, "gpu_copy"},
     { NULL },
 };
 
diff --git a/libavcodec/qsvdec_other.c b/libavcodec/qsvdec_other.c
index 993c7a8..b4df767 100644
--- a/libavcodec/qsvdec_other.c
+++ b/libavcodec/qsvdec_other.c
@@ -1,5 +1,5 @@
 /*
- * Intel MediaSDK QSV based MPEG-2, VC-1 and VP8 decoders
+ * Intel MediaSDK QSV based MPEG-2, VC-1, VP8, MJPEG and VP9 decoders
  *
  * copyright (c) 2015 Anton Khirnov
  *
@@ -60,8 +60,8 @@
 {
     QSVOtherContext *s = avctx->priv_data;
 
-#if CONFIG_VP8_QSV_DECODER
-    if (avctx->codec_id == AV_CODEC_ID_VP8)
+#if CONFIG_VP8_QSV_DECODER || CONFIG_VP9_QSV_DECODER
+    if (avctx->codec_id == AV_CODEC_ID_VP8 || avctx->codec_id == AV_CODEC_ID_VP9)
         av_freep(&s->qsv.load_plugins);
 #endif
 
@@ -90,6 +90,18 @@
     }
 #endif
 
+#if CONFIG_VP9_QSV_DECODER
+    if (avctx->codec_id == AV_CODEC_ID_VP9) {
+        static const char *uid_vp9dec_hw = "a922394d8d87452f878c51f2fc9b4131";
+
+        av_freep(&s->qsv.load_plugins);
+        s->qsv.load_plugins = av_strdup(uid_vp9dec_hw);
+        if (!s->qsv.load_plugins)
+            return AVERROR(ENOMEM);
+    }
+#endif
+
+    s->qsv.orig_pix_fmt = AV_PIX_FMT_NV12;
     s->packet_fifo = av_fifo_alloc(sizeof(AVPacket));
     if (!s->packet_fifo) {
         ret = AVERROR(ENOMEM);
@@ -111,7 +123,7 @@
 
     /* buffer the input packet */
     if (avpkt->size) {
-        AVPacket input_ref = { 0 };
+        AVPacket input_ref;
 
         if (av_fifo_space(s->packet_fifo) < sizeof(input_ref)) {
             ret = av_fifo_realloc2(s->packet_fifo,
@@ -132,9 +144,11 @@
             /* no more data */
             if (av_fifo_size(s->packet_fifo) < sizeof(AVPacket))
                 return avpkt->size ? avpkt->size : ff_qsv_process_data(avctx, &s->qsv, frame, got_frame, avpkt);
-
-            av_packet_unref(&s->input_ref);
-            av_fifo_generic_read(s->packet_fifo, &s->input_ref, sizeof(s->input_ref), NULL);
+            /* in progress of reinit, no read from fifo and keep the buffer_pkt */
+            if (!s->qsv.reinit_flag) {
+                av_packet_unref(&s->input_ref);
+                av_fifo_generic_read(s->packet_fifo, &s->input_ref, sizeof(s->input_ref), NULL);
+            }
         }
 
         ret = ff_qsv_process_data(avctx, &s->qsv, frame, got_frame, &s->input_ref);
@@ -145,6 +159,8 @@
 
             return ret;
         }
+        if (s->qsv.reinit_flag)
+            continue;
 
         s->input_ref.size -= ret;
         s->input_ref.data += ret;
@@ -165,6 +181,11 @@
 #define VD AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM
 static const AVOption options[] = {
     { "async_depth", "Internal parallelization depth, the higher the value the higher the latency.", OFFSET(qsv.async_depth), AV_OPT_TYPE_INT, { .i64 = ASYNC_DEPTH_DEFAULT }, 1, INT_MAX, VD },
+
+    { "gpu_copy", "A GPU-accelerated copy between video and system memory", OFFSET(qsv.gpu_copy), AV_OPT_TYPE_INT, { .i64 = MFX_GPUCOPY_DEFAULT }, MFX_GPUCOPY_DEFAULT, MFX_GPUCOPY_OFF, VD, "gpu_copy"},
+        { "default", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_GPUCOPY_DEFAULT }, 0, 0, VD, "gpu_copy"},
+        { "on",      NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_GPUCOPY_ON },      0, 0, VD, "gpu_copy"},
+        { "off",     NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_GPUCOPY_OFF },     0, 0, VD, "gpu_copy"},
     { NULL },
 };
 
@@ -251,3 +272,58 @@
     .wrapper_name   = "qsv",
 };
 #endif
+
+#if CONFIG_MJPEG_QSV_DECODER
+static const AVClass mjpeg_qsv_class = {
+    .class_name = "mjpeg_qsv",
+    .item_name  = av_default_item_name,
+    .option     = options,
+    .version    = LIBAVUTIL_VERSION_INT,
+};
+
+AVCodec ff_mjpeg_qsv_decoder = {
+    .name           = "mjpeg_qsv",
+    .long_name      = NULL_IF_CONFIG_SMALL("MJPEG video (Intel Quick Sync Video acceleration)"),
+    .priv_data_size = sizeof(QSVOtherContext),
+    .type           = AVMEDIA_TYPE_VIDEO,
+    .id             = AV_CODEC_ID_MJPEG,
+    .init           = qsv_decode_init,
+    .decode         = qsv_decode_frame,
+    .flush          = qsv_decode_flush,
+    .close          = qsv_decode_close,
+    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_DR1 | AV_CODEC_CAP_AVOID_PROBING | AV_CODEC_CAP_HYBRID,
+    .priv_class     = &mjpeg_qsv_class,
+    .pix_fmts       = (const enum AVPixelFormat[]){ AV_PIX_FMT_NV12,
+                                                    AV_PIX_FMT_QSV,
+                                                    AV_PIX_FMT_NONE },
+};
+#endif
+
+#if CONFIG_VP9_QSV_DECODER
+static const AVClass vp9_qsv_class = {
+    .class_name = "vp9_qsv",
+    .item_name  = av_default_item_name,
+    .option     = options,
+    .version    = LIBAVUTIL_VERSION_INT,
+};
+
+AVCodec ff_vp9_qsv_decoder = {
+    .name           = "vp9_qsv",
+    .long_name      = NULL_IF_CONFIG_SMALL("VP9 video (Intel Quick Sync Video acceleration)"),
+    .priv_data_size = sizeof(QSVOtherContext),
+    .type           = AVMEDIA_TYPE_VIDEO,
+    .id             = AV_CODEC_ID_VP9,
+    .init           = qsv_decode_init,
+    .decode         = qsv_decode_frame,
+    .flush          = qsv_decode_flush,
+    .close          = qsv_decode_close,
+    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_DR1 | AV_CODEC_CAP_AVOID_PROBING | AV_CODEC_CAP_HYBRID,
+    .priv_class     = &vp9_qsv_class,
+    .pix_fmts       = (const enum AVPixelFormat[]){ AV_PIX_FMT_NV12,
+                                                    AV_PIX_FMT_P010,
+                                                    AV_PIX_FMT_QSV,
+                                                    AV_PIX_FMT_NONE },
+    .hw_configs     = ff_qsv_hw_configs,
+    .wrapper_name   = "qsv",
+};
+#endif
diff --git a/libavcodec/qsvenc.c b/libavcodec/qsvenc.c
index 948751d..afab8fd 100644
--- a/libavcodec/qsvenc.c
+++ b/libavcodec/qsvenc.c
@@ -136,6 +136,12 @@
 #if QSV_HAVE_CO2
     mfxExtCodingOption2 *co2 = (mfxExtCodingOption2*)coding_opts[1];
 #endif
+#if QSV_HAVE_CO3
+    mfxExtCodingOption3 *co3 = (mfxExtCodingOption3*)coding_opts[2];
+#endif
+#if QSV_HAVE_EXT_HEVC_TILES
+    mfxExtHEVCTiles *exthevctiles = (mfxExtHEVCTiles *)coding_opts[3 + QSV_HAVE_CO_VPS];
+#endif
 
     av_log(avctx, AV_LOG_VERBOSE, "profile: %s; level: %"PRIu16"\n",
            print_profile(info->CodecProfile), info->CodecLevel);
@@ -158,8 +164,8 @@
 #endif
         ) {
         av_log(avctx, AV_LOG_VERBOSE,
-               "BufferSizeInKB: %"PRIu16"; InitialDelayInKB: %"PRIu16"; TargetKbps: %"PRIu16"; MaxKbps: %"PRIu16"\n",
-               info->BufferSizeInKB, info->InitialDelayInKB, info->TargetKbps, info->MaxKbps);
+               "BufferSizeInKB: %"PRIu16"; InitialDelayInKB: %"PRIu16"; TargetKbps: %"PRIu16"; MaxKbps: %"PRIu16"; BRCParamMultiplier: %"PRIu16"\n",
+               info->BufferSizeInKB, info->InitialDelayInKB, info->TargetKbps, info->MaxKbps, info->BRCParamMultiplier);
     } else if (info->RateControlMethod == MFX_RATECONTROL_CQP) {
         av_log(avctx, AV_LOG_VERBOSE, "QPI: %"PRIu16"; QPP: %"PRIu16"; QPB: %"PRIu16"\n",
                info->QPI, info->QPP, info->QPB);
@@ -167,8 +173,8 @@
 #if QSV_HAVE_AVBR
     else if (info->RateControlMethod == MFX_RATECONTROL_AVBR) {
         av_log(avctx, AV_LOG_VERBOSE,
-               "TargetKbps: %"PRIu16"; Accuracy: %"PRIu16"; Convergence: %"PRIu16"\n",
-               info->TargetKbps, info->Accuracy, info->Convergence);
+               "TargetKbps: %"PRIu16"; Accuracy: %"PRIu16"; Convergence: %"PRIu16"; BRCParamMultiplier: %"PRIu16"\n",
+               info->TargetKbps, info->Accuracy, info->Convergence, info->BRCParamMultiplier);
     }
 #endif
 #if QSV_HAVE_LA
@@ -178,8 +184,8 @@
 #endif
              ) {
         av_log(avctx, AV_LOG_VERBOSE,
-               "TargetKbps: %"PRIu16"; LookAheadDepth: %"PRIu16"\n",
-               info->TargetKbps, co2->LookAheadDepth);
+               "TargetKbps: %"PRIu16"; LookAheadDepth: %"PRIu16"; BRCParamMultiplier: %"PRIu16"\n",
+               info->TargetKbps, co2->LookAheadDepth, info->BRCParamMultiplier);
     }
 #endif
 #if QSV_HAVE_ICQ
@@ -190,20 +196,31 @@
                info->ICQQuality, co2->LookAheadDepth);
     }
 #endif
-
+#if QSV_HAVE_QVBR
+    else if (info->RateControlMethod == MFX_RATECONTROL_QVBR) {
+        av_log(avctx, AV_LOG_VERBOSE, "QVBRQuality: %"PRIu16"\n",
+               co3->QVBRQuality);
+    }
+#endif
     av_log(avctx, AV_LOG_VERBOSE, "NumSlice: %"PRIu16"; NumRefFrame: %"PRIu16"\n",
            info->NumSlice, info->NumRefFrame);
     av_log(avctx, AV_LOG_VERBOSE, "RateDistortionOpt: %s\n",
            print_threestate(co->RateDistortionOpt));
 
+#if QSV_HAVE_EXT_HEVC_TILES
+    if (avctx->codec_id == AV_CODEC_ID_HEVC)
+        av_log(avctx, AV_LOG_VERBOSE, "NumTileColumns: %"PRIu16"; NumTileRows: %"PRIu16"\n",
+               exthevctiles->NumTileColumns, exthevctiles->NumTileRows);
+#endif
+
 #if QSV_HAVE_CO2
     av_log(avctx, AV_LOG_VERBOSE,
            "RecoveryPointSEI: %s IntRefType: %"PRIu16"; IntRefCycleSize: %"PRIu16"; IntRefQPDelta: %"PRId16"\n",
            print_threestate(co->RecoveryPointSEI), co2->IntRefType, co2->IntRefCycleSize, co2->IntRefQPDelta);
 
-    av_log(avctx, AV_LOG_VERBOSE, "MaxFrameSize: %"PRIu16"; ", co2->MaxFrameSize);
+    av_log(avctx, AV_LOG_VERBOSE, "MaxFrameSize: %d; ", co2->MaxFrameSize);
 #if QSV_HAVE_MAX_SLICE_SIZE
-    av_log(avctx, AV_LOG_VERBOSE, "MaxSliceSize: %"PRIu16"; ", co2->MaxSliceSize);
+    av_log(avctx, AV_LOG_VERBOSE, "MaxSliceSize: %d; ", co2->MaxSliceSize);
 #endif
     av_log(avctx, AV_LOG_VERBOSE, "\n");
 
@@ -226,6 +243,10 @@
     av_log(avctx, AV_LOG_VERBOSE, "\n");
 #endif
 
+#if QSV_HAVE_VDENC
+    av_log(avctx, AV_LOG_VERBOSE, "VDENC: %s\n", print_threestate(info->LowPower));
+#endif
+
 #if QSV_VERSION_ATLEAST(1, 8)
     av_log(avctx, AV_LOG_VERBOSE,
            "RepeatPPS: %s; NumMbPerSlice: %"PRIu16"; LookAheadDS: ",
@@ -255,6 +276,11 @@
 #endif
 #endif
 
+#if QSV_HAVE_GPB
+    if (avctx->codec_id == AV_CODEC_ID_HEVC)
+        av_log(avctx, AV_LOG_VERBOSE,"GPB: %s\n", print_threestate(co3->GPB));
+#endif
+
     if (avctx->codec_id == AV_CODEC_ID_H264) {
         av_log(avctx, AV_LOG_VERBOSE, "Entropy coding: %s; MaxDecFrameBuffering: %"PRIu16"\n",
                co->CAVLC == MFX_CODINGOPTION_ON ? "CAVLC" : "CABAC", co->MaxDecFrameBuffering);
@@ -263,6 +289,10 @@
                print_threestate(co->NalHrdConformance), print_threestate(co->SingleSeiNalUnit),
                print_threestate(co->VuiVclHrdParameters), print_threestate(co->VuiNalHrdParameters));
     }
+
+    av_log(avctx, AV_LOG_VERBOSE, "FrameRateExtD: %"PRIu32"; FrameRateExtN: %"PRIu32" \n",
+           info->FrameInfo.FrameRateExtD, info->FrameInfo.FrameRateExtN);
+
 }
 
 static int select_rc_mode(AVCodecContext *avctx, QSVEncContext *q)
@@ -322,7 +352,7 @@
     }
 #endif
 #if QSV_HAVE_ICQ
-    else if (avctx->global_quality > 0) {
+    else if (avctx->global_quality > 0 && !avctx->rc_max_rate) {
         rc_mode = MFX_RATECONTROL_ICQ;
         rc_desc = "intelligent constant quality (ICQ)";
     }
@@ -337,6 +367,12 @@
         rc_desc = "average variable bitrate (AVBR)";
     }
 #endif
+#if QSV_HAVE_QVBR
+    else if (avctx->global_quality > 0) {
+        rc_mode = MFX_RATECONTROL_QVBR;
+        rc_desc = "constant quality with VBR algorithm (QVBR)";
+    }
+#endif
     else {
         rc_mode = MFX_RATECONTROL_VBR;
         rc_desc = "variable bitrate (VBR)";
@@ -434,6 +470,12 @@
     q->param.mfx.Quality              = av_clip(avctx->global_quality, 1, 100);
     q->param.mfx.RestartInterval      = 0;
 
+    q->width_align = 16;
+    q->height_align = 16;
+
+    q->param.mfx.FrameInfo.Width = FFALIGN(avctx->width, q->width_align);
+    q->param.mfx.FrameInfo.Height = FFALIGN(avctx->height, q->height_align);
+
     return 0;
 }
 
@@ -443,6 +485,8 @@
                                    avctx->sw_pix_fmt : avctx->pix_fmt;
     const AVPixFmtDescriptor *desc;
     float quant;
+    int target_bitrate_kbps, max_bitrate_kbps, brc_param_multiplier;
+    int buffer_size_in_kilobytes, initial_delay_in_kilobytes;
     int ret;
 
     ret = ff_qsv_codec_id_to_mfx(avctx->codec_id);
@@ -464,6 +508,18 @@
         }
     }
 
+    if (q->low_power) {
+#if QSV_HAVE_VDENC
+        q->param.mfx.LowPower = MFX_CODINGOPTION_ON;
+#else
+        av_log(avctx, AV_LOG_WARNING, "The low_power option is "
+                            "not supported with this MSDK version.\n");
+        q->low_power = 0;
+        q->param.mfx.LowPower = MFX_CODINGOPTION_OFF;
+#endif
+    } else
+        q->param.mfx.LowPower = MFX_CODINGOPTION_OFF;
+
     q->param.mfx.CodecProfile       = q->profile;
     q->param.mfx.TargetUsage        = avctx->compression_level;
     q->param.mfx.GopPicSize         = FFMAX(0, avctx->gop_size);
@@ -493,10 +549,10 @@
     q->param.mfx.FrameInfo.BitDepthChroma = desc->comp[0].depth;
     q->param.mfx.FrameInfo.Shift          = desc->comp[0].depth > 8;
 
-    // TODO:  detect version of MFX--if the minor version is greater than
-    // or equal to 19, then can use the same alignment settings as H.264
-    // for HEVC
-    q->width_align = avctx->codec_id == AV_CODEC_ID_HEVC ? 32 : 16;
+    // If the minor version is greater than or equal to 19,
+    // then can use the same alignment settings as H.264 for HEVC
+    q->width_align = (avctx->codec_id != AV_CODEC_ID_HEVC ||
+                      QSV_RUNTIME_VERSION_ATLEAST(q->ver, 1, 19)) ? 16 : 32;
     q->param.mfx.FrameInfo.Width = FFALIGN(avctx->width, q->width_align);
 
     if (avctx->flags & AV_CODEC_FLAG_INTERLACED_DCT) {
@@ -534,16 +590,32 @@
     if (ret < 0)
         return ret;
 
+    //libmfx BRC parameters are 16 bits thus maybe overflow, then BRCParamMultiplier is needed
+    buffer_size_in_kilobytes   = avctx->rc_buffer_size / 8000;
+    initial_delay_in_kilobytes = avctx->rc_initial_buffer_occupancy / 8000;
+    target_bitrate_kbps        = avctx->bit_rate / 1000;
+    max_bitrate_kbps           = avctx->rc_max_rate / 1000;
+    brc_param_multiplier       = (FFMAX(FFMAX3(target_bitrate_kbps, max_bitrate_kbps, buffer_size_in_kilobytes),
+                                  initial_delay_in_kilobytes) + 0x10000) / 0x10000;
+
     switch (q->param.mfx.RateControlMethod) {
     case MFX_RATECONTROL_CBR:
     case MFX_RATECONTROL_VBR:
 #if QSV_HAVE_VCM
     case MFX_RATECONTROL_VCM:
 #endif
-        q->param.mfx.BufferSizeInKB   = avctx->rc_buffer_size / 8000;
-        q->param.mfx.InitialDelayInKB = avctx->rc_initial_buffer_occupancy / 1000;
-        q->param.mfx.TargetKbps       = avctx->bit_rate / 1000;
-        q->param.mfx.MaxKbps          = avctx->rc_max_rate / 1000;
+#if QSV_HAVE_QVBR
+    case MFX_RATECONTROL_QVBR:
+#endif
+        q->param.mfx.BufferSizeInKB   = buffer_size_in_kilobytes / brc_param_multiplier;
+        q->param.mfx.InitialDelayInKB = initial_delay_in_kilobytes / brc_param_multiplier;
+        q->param.mfx.TargetKbps       = target_bitrate_kbps / brc_param_multiplier;
+        q->param.mfx.MaxKbps          = max_bitrate_kbps / brc_param_multiplier;
+        q->param.mfx.BRCParamMultiplier = brc_param_multiplier;
+#if QSV_HAVE_QVBR
+        if (q->param.mfx.RateControlMethod == MFX_RATECONTROL_QVBR)
+            q->extco3.QVBRQuality = av_clip(avctx->global_quality, 0, 51);
+#endif
         break;
     case MFX_RATECONTROL_CQP:
         quant = avctx->global_quality / FF_QP2LAMBDA;
@@ -555,15 +627,17 @@
         break;
 #if QSV_HAVE_AVBR
     case MFX_RATECONTROL_AVBR:
-        q->param.mfx.TargetKbps  = avctx->bit_rate / 1000;
+        q->param.mfx.TargetKbps  = target_bitrate_kbps / brc_param_multiplier;
         q->param.mfx.Convergence = q->avbr_convergence;
         q->param.mfx.Accuracy    = q->avbr_accuracy;
+        q->param.mfx.BRCParamMultiplier = brc_param_multiplier;
         break;
 #endif
 #if QSV_HAVE_LA
     case MFX_RATECONTROL_LA:
-        q->param.mfx.TargetKbps  = avctx->bit_rate / 1000;
+        q->param.mfx.TargetKbps  = target_bitrate_kbps / brc_param_multiplier;
         q->extco2.LookAheadDepth = q->look_ahead_depth;
+        q->param.mfx.BRCParamMultiplier = brc_param_multiplier;
         break;
 #if QSV_HAVE_ICQ
     case MFX_RATECONTROL_LA_ICQ:
@@ -575,9 +649,11 @@
 #endif
     }
 
-    // the HEVC encoder plugin currently fails if coding options
-    // are provided
-    if (avctx->codec_id != AV_CODEC_ID_HEVC) {
+    // The HEVC encoder plugin currently fails with some old libmfx version if coding options
+    // are provided. Can't find the extract libmfx version which fixed it, just enable it from
+    // V1.28 in order to keep compatibility security.
+    if (((avctx->codec_id != AV_CODEC_ID_HEVC) || QSV_RUNTIME_VERSION_ATLEAST(q->ver, 1, 28))
+        && (avctx->codec_id != AV_CODEC_ID_VP9)) {
         q->extco.Header.BufferId      = MFX_EXTBUFF_CODING_OPTION;
         q->extco.Header.BufferSz      = sizeof(q->extco);
 
@@ -613,9 +689,6 @@
 
 #if QSV_HAVE_CO2
         if (avctx->codec_id == AV_CODEC_ID_H264) {
-            q->extco2.Header.BufferId     = MFX_EXTBUFF_CODING_OPTION2;
-            q->extco2.Header.BufferSz     = sizeof(q->extco2);
-
             if (q->int_ref_type >= 0)
                 q->extco2.IntRefType = q->int_ref_type;
             if (q->int_ref_cycle_size >= 0)
@@ -627,8 +700,6 @@
                 q->extco2.BitrateLimit = q->bitrate_limit ? MFX_CODINGOPTION_ON : MFX_CODINGOPTION_OFF;
             if (q->mbbrc >= 0)
                 q->extco2.MBBRC = q->mbbrc ? MFX_CODINGOPTION_ON : MFX_CODINGOPTION_OFF;
-            if (q->extbrc >= 0)
-                q->extco2.ExtBRC = q->extbrc ? MFX_CODINGOPTION_ON : MFX_CODINGOPTION_OFF;
 
             if (q->max_frame_size >= 0)
                 q->extco2.MaxFrameSize = q->max_frame_size;
@@ -638,14 +709,16 @@
 #endif
 
 #if QSV_HAVE_TRELLIS
-            q->extco2.Trellis = q->trellis;
+            if (avctx->trellis >= 0)
+                q->extco2.Trellis = (avctx->trellis == 0) ? MFX_TRELLIS_OFF : (MFX_TRELLIS_I | MFX_TRELLIS_P | MFX_TRELLIS_B);
+            else
+                q->extco2.Trellis = MFX_TRELLIS_UNKNOWN;
 #endif
 
-#if QSV_HAVE_LA_DS
+#if QSV_VERSION_ATLEAST(1, 8)
             q->extco2.LookAheadDS = q->look_ahead_downsampling;
-#endif
+            q->extco2.RepeatPPS   = q->repeat_pps ? MFX_CODINGOPTION_ON : MFX_CODINGOPTION_OFF;
 
-#if QSV_HAVE_BREF_TYPE
 #if FF_API_PRIVATE_OPT
 FF_DISABLE_DEPRECATION_WARNINGS
             if (avctx->b_frame_strategy >= 0)
@@ -674,14 +747,22 @@
                 q->extco2.MaxQPP = q->extco2.MaxQPB = q->extco2.MaxQPI;
             }
 #endif
+        }
+
+        if (avctx->codec_id == AV_CODEC_ID_H264 || avctx->codec_id == AV_CODEC_ID_HEVC) {
+            if (q->extbrc >= 0)
+                q->extco2.ExtBRC = q->extbrc ? MFX_CODINGOPTION_ON : MFX_CODINGOPTION_OFF;
+
+            q->extco2.Header.BufferId = MFX_EXTBUFF_CODING_OPTION2;
+            q->extco2.Header.BufferSz = sizeof(q->extco2);
+
             q->extparam_internal[q->nb_extparam_internal++] = (mfxExtBuffer *)&q->extco2;
         }
 #endif
-#if QSV_HAVE_MF
+
         if (avctx->codec_id == AV_CODEC_ID_H264) {
-            mfxVersion    ver;
-            ret = MFXQueryVersion(q->session,&ver);
-            if (ret >= MFX_ERR_NONE && QSV_RUNTIME_VERSION_ATLEAST(ver, 1, 25)) {
+#if QSV_HAVE_MF
+            if (QSV_RUNTIME_VERSION_ATLEAST(q->ver, 1, 25)) {
                 q->extmfp.Header.BufferId     = MFX_EXTBUFF_MULTI_FRAME_PARAM;
                 q->extmfp.Header.BufferSz     = sizeof(q->extmfp);
 
@@ -689,10 +770,38 @@
                 av_log(avctx,AV_LOG_VERBOSE,"MFMode:%d\n", q->extmfp.MFMode);
                 q->extparam_internal[q->nb_extparam_internal++] = (mfxExtBuffer *)&q->extmfp;
             }
+#endif
         }
+#if QSV_HAVE_CO3
+        q->extco3.Header.BufferId      = MFX_EXTBUFF_CODING_OPTION3;
+        q->extco3.Header.BufferSz      = sizeof(q->extco3);
+#if QSV_HAVE_GPB
+        if (avctx->codec_id == AV_CODEC_ID_HEVC)
+            q->extco3.GPB              = q->gpb ? MFX_CODINGOPTION_ON : MFX_CODINGOPTION_OFF;
+#endif
+        q->extparam_internal[q->nb_extparam_internal++] = (mfxExtBuffer *)&q->extco3;
 #endif
     }
 
+#if QSV_HAVE_EXT_VP9_PARAM
+    if (avctx->codec_id == AV_CODEC_ID_VP9) {
+        q->extvp9param.Header.BufferId = MFX_EXTBUFF_VP9_PARAM;
+        q->extvp9param.Header.BufferSz = sizeof(q->extvp9param);
+        q->extvp9param.WriteIVFHeaders = MFX_CODINGOPTION_OFF;
+        q->extparam_internal[q->nb_extparam_internal++] = (mfxExtBuffer *)&q->extvp9param;
+    }
+#endif
+
+#if QSV_HAVE_EXT_HEVC_TILES
+    if (avctx->codec_id == AV_CODEC_ID_HEVC) {
+        q->exthevctiles.Header.BufferId = MFX_EXTBUFF_HEVC_TILES;
+        q->exthevctiles.Header.BufferSz = sizeof(q->exthevctiles);
+        q->exthevctiles.NumTileColumns  = q->tile_cols;
+        q->exthevctiles.NumTileRows     = q->tile_rows;
+        q->extparam_internal[q->nb_extparam_internal++] = (mfxExtBuffer *)&q->exthevctiles;
+    }
+#endif
+
     if (!check_enc_param(avctx,q)) {
         av_log(avctx, AV_LOG_ERROR,
                "some encoding parameters are not supported by the QSV "
@@ -712,7 +821,7 @@
         return ff_qsv_print_error(avctx, ret,
                                   "Error calling GetVideoParam");
 
-    q->packet_size = q->param.mfx.BufferSizeInKB * 1000;
+    q->packet_size = q->param.mfx.BufferSizeInKB * q->param.mfx.BRCParamMultiplier * 1000;
 
     // for qsv mjpeg the return value maybe 0 so alloc the buffer
     if (q->packet_size == 0)
@@ -721,6 +830,55 @@
     return 0;
 }
 
+static int qsv_retrieve_enc_vp9_params(AVCodecContext *avctx, QSVEncContext *q)
+{
+    int ret = 0;
+#if QSV_HAVE_EXT_VP9_PARAM
+    mfxExtVP9Param vp9_extend_buf = {
+         .Header.BufferId = MFX_EXTBUFF_VP9_PARAM,
+         .Header.BufferSz = sizeof(vp9_extend_buf),
+    };
+#endif
+
+#if QSV_HAVE_CO2
+    mfxExtCodingOption2 co2 = {
+        .Header.BufferId = MFX_EXTBUFF_CODING_OPTION2,
+        .Header.BufferSz = sizeof(co2),
+    };
+#endif
+
+#if QSV_HAVE_CO3
+    mfxExtCodingOption3 co3 = {
+        .Header.BufferId = MFX_EXTBUFF_CODING_OPTION3,
+        .Header.BufferSz = sizeof(co3),
+    };
+#endif
+
+    mfxExtBuffer *ext_buffers[] = {
+#if QSV_HAVE_EXT_VP9_PARAM
+        (mfxExtBuffer*)&vp9_extend_buf,
+#endif
+#if QSV_HAVE_CO2
+        (mfxExtBuffer*)&co2,
+#endif
+#if QSV_HAVE_CO3
+        (mfxExtBuffer*)&co3,
+#endif
+    };
+
+    q->param.ExtParam    = ext_buffers;
+    q->param.NumExtParam = FF_ARRAY_ELEMS(ext_buffers);
+
+    ret = MFXVideoENCODE_GetVideoParam(q->session, &q->param);
+    if (ret < 0)
+        return ff_qsv_print_error(avctx, ret,
+                                  "Error calling GetVideoParam");
+
+    q->packet_size = q->param.mfx.BufferSizeInKB * q->param.mfx.BRCParamMultiplier * 1000;
+
+    return 0;
+}
+
 static int qsv_retrieve_enc_params(AVCodecContext *avctx, QSVEncContext *q)
 {
     AVCPBProperties *cpb_props;
@@ -745,42 +903,94 @@
         .Header.BufferSz = sizeof(co2),
     };
 #endif
-
-    mfxExtBuffer *ext_buffers[] = {
-        (mfxExtBuffer*)&extradata,
-        (mfxExtBuffer*)&co,
-#if QSV_HAVE_CO2
-        (mfxExtBuffer*)&co2,
-#endif
+#if QSV_HAVE_CO3
+    mfxExtCodingOption3 co3 = {
+        .Header.BufferId = MFX_EXTBUFF_CODING_OPTION3,
+        .Header.BufferSz = sizeof(co3),
     };
+#endif
+
+#if QSV_HAVE_CO_VPS
+    uint8_t vps_buf[128];
+    mfxExtCodingOptionVPS extradata_vps = {
+        .Header.BufferId = MFX_EXTBUFF_CODING_OPTION_VPS,
+        .Header.BufferSz = sizeof(extradata_vps),
+        .VPSBuffer       = vps_buf,
+        .VPSBufSize      = sizeof(vps_buf),
+    };
+#endif
+
+#if QSV_HAVE_EXT_HEVC_TILES
+    mfxExtHEVCTiles hevc_tile_buf = {
+         .Header.BufferId = MFX_EXTBUFF_HEVC_TILES,
+         .Header.BufferSz = sizeof(hevc_tile_buf),
+    };
+#endif
+
+    mfxExtBuffer *ext_buffers[2 + QSV_HAVE_CO2 + QSV_HAVE_CO3 + QSV_HAVE_CO_VPS + QSV_HAVE_EXT_HEVC_TILES];
 
     int need_pps = avctx->codec_id != AV_CODEC_ID_MPEG2VIDEO;
-    int ret;
+    int ret, ext_buf_num = 0, extradata_offset = 0;
+
+    ext_buffers[ext_buf_num++] = (mfxExtBuffer*)&extradata;
+    ext_buffers[ext_buf_num++] = (mfxExtBuffer*)&co;
+#if QSV_HAVE_CO2
+    ext_buffers[ext_buf_num++] = (mfxExtBuffer*)&co2;
+#endif
+#if QSV_HAVE_CO3
+    ext_buffers[ext_buf_num++] = (mfxExtBuffer*)&co3;
+#endif
+#if QSV_HAVE_CO_VPS
+    q->hevc_vps = ((avctx->codec_id == AV_CODEC_ID_HEVC) && QSV_RUNTIME_VERSION_ATLEAST(q->ver, 1, 17));
+    if (q->hevc_vps)
+        ext_buffers[ext_buf_num++] = (mfxExtBuffer*)&extradata_vps;
+#endif
+#if QSV_HAVE_EXT_HEVC_TILES
+    if (avctx->codec_id == AV_CODEC_ID_HEVC)
+        ext_buffers[ext_buf_num++] = (mfxExtBuffer*)&hevc_tile_buf;
+#endif
 
     q->param.ExtParam    = ext_buffers;
-    q->param.NumExtParam = FF_ARRAY_ELEMS(ext_buffers);
+    q->param.NumExtParam = ext_buf_num;
 
     ret = MFXVideoENCODE_GetVideoParam(q->session, &q->param);
     if (ret < 0)
         return ff_qsv_print_error(avctx, ret,
                                   "Error calling GetVideoParam");
 
-    q->packet_size = q->param.mfx.BufferSizeInKB * 1000;
+    q->packet_size = q->param.mfx.BufferSizeInKB * q->param.mfx.BRCParamMultiplier * 1000;
 
-    if (!extradata.SPSBufSize || (need_pps && !extradata.PPSBufSize)) {
+    if (!extradata.SPSBufSize || (need_pps && !extradata.PPSBufSize)
+#if QSV_HAVE_CO_VPS
+        || (q->hevc_vps && !extradata_vps.VPSBufSize)
+#endif
+    ) {
         av_log(avctx, AV_LOG_ERROR, "No extradata returned from libmfx.\n");
         return AVERROR_UNKNOWN;
     }
 
-    avctx->extradata = av_malloc(extradata.SPSBufSize + need_pps * extradata.PPSBufSize +
-                                 AV_INPUT_BUFFER_PADDING_SIZE);
+    avctx->extradata_size = extradata.SPSBufSize + need_pps * extradata.PPSBufSize;
+#if QSV_HAVE_CO_VPS
+    avctx->extradata_size += q->hevc_vps * extradata_vps.VPSBufSize;
+#endif
+
+    avctx->extradata = av_malloc(avctx->extradata_size + AV_INPUT_BUFFER_PADDING_SIZE);
     if (!avctx->extradata)
         return AVERROR(ENOMEM);
 
-    memcpy(avctx->extradata,                        sps_buf, extradata.SPSBufSize);
-    if (need_pps)
-        memcpy(avctx->extradata + extradata.SPSBufSize, pps_buf, extradata.PPSBufSize);
-    avctx->extradata_size = extradata.SPSBufSize + need_pps * extradata.PPSBufSize;
+#if QSV_HAVE_CO_VPS
+    if (q->hevc_vps) {
+        memcpy(avctx->extradata, vps_buf, extradata_vps.VPSBufSize);
+        extradata_offset += extradata_vps.VPSBufSize;
+    }
+#endif
+
+    memcpy(avctx->extradata + extradata_offset, sps_buf, extradata.SPSBufSize);
+    extradata_offset += extradata.SPSBufSize;
+    if (need_pps) {
+        memcpy(avctx->extradata + extradata_offset, pps_buf, extradata.PPSBufSize);
+        extradata_offset += extradata.PPSBufSize;
+    }
     memset(avctx->extradata + avctx->extradata_size, 0, AV_INPUT_BUFFER_PADDING_SIZE);
 
     cpb_props = ff_add_cpb_side_data(avctx);
@@ -845,29 +1055,31 @@
         if (!q->frames_ctx.hw_frames_ctx)
             return AVERROR(ENOMEM);
 
-        ret = ff_qsv_init_session_frames(avctx, &q->internal_session,
+        ret = ff_qsv_init_session_frames(avctx, &q->internal_qs.session,
                                          &q->frames_ctx, q->load_plugins,
-                                         q->param.IOPattern == MFX_IOPATTERN_IN_OPAQUE_MEMORY);
+                                         q->param.IOPattern == MFX_IOPATTERN_IN_OPAQUE_MEMORY,
+                                         MFX_GPUCOPY_OFF);
         if (ret < 0) {
             av_buffer_unref(&q->frames_ctx.hw_frames_ctx);
             return ret;
         }
 
-        q->session = q->internal_session;
+        q->session = q->internal_qs.session;
     } else if (avctx->hw_device_ctx) {
-        ret = ff_qsv_init_session_device(avctx, &q->internal_session,
-                                         avctx->hw_device_ctx, q->load_plugins);
+        ret = ff_qsv_init_session_device(avctx, &q->internal_qs.session,
+                                         avctx->hw_device_ctx, q->load_plugins,
+                                         MFX_GPUCOPY_OFF);
         if (ret < 0)
             return ret;
 
-        q->session = q->internal_session;
+        q->session = q->internal_qs.session;
     } else {
-        ret = ff_qsv_init_internal_session(avctx, &q->internal_session,
-                                           q->load_plugins);
+        ret = ff_qsv_init_internal_session(avctx, &q->internal_qs,
+                                           q->load_plugins, MFX_GPUCOPY_OFF);
         if (ret < 0)
             return ret;
 
-        q->session = q->internal_session;
+        q->session = q->internal_qs.session;
     }
 
     return 0;
@@ -923,6 +1135,12 @@
     if (ret < 0)
         return ret;
 
+    ret = MFXQueryVersion(q->session,&q->ver);
+    if (ret < 0) {
+        return ff_qsv_print_error(avctx, ret,
+                                  "Error querying mfx version");
+    }
+
     // in the mfxInfoMFX struct, JPEG is different from other codecs
     switch (avctx->codec_id) {
     case AV_CODEC_ID_MJPEG:
@@ -935,25 +1153,6 @@
     if (ret < 0)
         return ret;
 
-    ret = MFXVideoENCODE_Query(q->session, &q->param, &q->param);
-    if (ret == MFX_WRN_PARTIAL_ACCELERATION) {
-        av_log(avctx, AV_LOG_WARNING, "Encoder will work with partial HW acceleration\n");
-    } else if (ret < 0) {
-        return ff_qsv_print_error(avctx, ret,
-                                  "Error querying encoder params");
-    }
-
-    ret = MFXVideoENCODE_QueryIOSurf(q->session, &q->param, &q->req);
-    if (ret < 0)
-        return ff_qsv_print_error(avctx, ret,
-                                  "Error querying (IOSurf) the encoding parameters");
-
-    if (opaque_alloc) {
-        ret = qsv_init_opaque_alloc(avctx, q);
-        if (ret < 0)
-            return ret;
-    }
-
     if (avctx->hwaccel_context) {
         AVQSVContext *qsv = avctx->hwaccel_context;
         int i, j;
@@ -983,6 +1182,25 @@
         q->param.NumExtParam = q->nb_extparam_internal;
     }
 
+    ret = MFXVideoENCODE_Query(q->session, &q->param, &q->param);
+    if (ret == MFX_WRN_PARTIAL_ACCELERATION) {
+        av_log(avctx, AV_LOG_WARNING, "Encoder will work with partial HW acceleration\n");
+    } else if (ret < 0) {
+        return ff_qsv_print_error(avctx, ret,
+                                  "Error querying encoder params");
+    }
+
+    ret = MFXVideoENCODE_QueryIOSurf(q->session, &q->param, &q->req);
+    if (ret < 0)
+        return ff_qsv_print_error(avctx, ret,
+                                  "Error querying (IOSurf) the encoding parameters");
+
+    if (opaque_alloc) {
+        ret = qsv_init_opaque_alloc(avctx, q);
+        if (ret < 0)
+            return ret;
+    }
+
     ret = MFXVideoENCODE_Init(q->session, &q->param);
     if (ret < 0)
         return ff_qsv_print_error(avctx, ret,
@@ -995,6 +1213,9 @@
     case AV_CODEC_ID_MJPEG:
         ret = qsv_retrieve_enc_jpeg_params(avctx, q);
         break;
+    case AV_CODEC_ID_VP9:
+        ret = qsv_retrieve_enc_vp9_params(avctx, q);
+        break;
     default:
         ret = qsv_retrieve_enc_params(avctx, q);
         break;
@@ -1192,6 +1413,12 @@
     if (qsv_frame) {
         surf = &qsv_frame->surface;
         enc_ctrl = &qsv_frame->enc_ctrl;
+
+        if (frame->pict_type == AV_PICTURE_TYPE_I) {
+            enc_ctrl->FrameType = MFX_FRAMETYPE_I | MFX_FRAMETYPE_REF;
+            if (q->forced_idr)
+                enc_ctrl->FrameType |= MFX_FRAMETYPE_IDR;
+        }
     }
 
     ret = av_new_packet(&new_pkt, q->packet_size);
@@ -1320,16 +1547,22 @@
         new_pkt.pts  = av_rescale_q(bs->TimeStamp,       (AVRational){1, 90000}, avctx->time_base);
         new_pkt.size = bs->DataLength;
 
-        if (bs->FrameType & MFX_FRAMETYPE_IDR ||
-            bs->FrameType & MFX_FRAMETYPE_xIDR)
+        if (bs->FrameType & MFX_FRAMETYPE_IDR || bs->FrameType & MFX_FRAMETYPE_xIDR) {
             new_pkt.flags |= AV_PKT_FLAG_KEY;
-
-        if (bs->FrameType & MFX_FRAMETYPE_I || bs->FrameType & MFX_FRAMETYPE_xI)
+            pict_type = AV_PICTURE_TYPE_I;
+        } else if (bs->FrameType & MFX_FRAMETYPE_I || bs->FrameType & MFX_FRAMETYPE_xI)
             pict_type = AV_PICTURE_TYPE_I;
         else if (bs->FrameType & MFX_FRAMETYPE_P || bs->FrameType & MFX_FRAMETYPE_xP)
             pict_type = AV_PICTURE_TYPE_P;
         else if (bs->FrameType & MFX_FRAMETYPE_B || bs->FrameType & MFX_FRAMETYPE_xB)
             pict_type = AV_PICTURE_TYPE_B;
+        else if (bs->FrameType == MFX_FRAMETYPE_UNKNOWN) {
+            pict_type = AV_PICTURE_TYPE_NONE;
+            av_log(avctx, AV_LOG_WARNING, "Unknown FrameType, set pict_type to AV_PICTURE_TYPE_NONE.\n");
+        } else {
+            av_log(avctx, AV_LOG_ERROR, "Invalid FrameType:%d.\n", bs->FrameType);
+            return AVERROR_INVALIDDATA;
+        }
 
 #if FF_API_CODED_FRAME
 FF_DISABLE_DEPRECATION_WARNINGS
@@ -1380,10 +1613,9 @@
 
     if (q->session)
         MFXVideoENCODE_Close(q->session);
-    if (q->internal_session)
-        MFXClose(q->internal_session);
+
     q->session          = NULL;
-    q->internal_session = NULL;
+    ff_qsv_close_internal_session(&q->internal_qs);
 
     av_buffer_unref(&q->frames_ctx.hw_frames_ctx);
     av_buffer_unref(&q->frames_ctx.mids_buf);
diff --git a/libavcodec/qsvenc.h b/libavcodec/qsvenc.h
index 50cc426..6609171 100644
--- a/libavcodec/qsvenc.h
+++ b/libavcodec/qsvenc.h
@@ -36,6 +36,10 @@
 
 #define QSV_HAVE_CO2 QSV_VERSION_ATLEAST(1, 6)
 #define QSV_HAVE_CO3 QSV_VERSION_ATLEAST(1, 11)
+#define QSV_HAVE_CO_VPS  QSV_VERSION_ATLEAST(1, 17)
+
+#define QSV_HAVE_EXT_HEVC_TILES QSV_VERSION_ATLEAST(1, 13)
+#define QSV_HAVE_EXT_VP9_PARAM QSV_VERSION_ATLEAST(1, 26)
 
 #define QSV_HAVE_TRELLIS QSV_VERSION_ATLEAST(1, 8)
 #define QSV_HAVE_MAX_SLICE_SIZE QSV_VERSION_ATLEAST(1, 9)
@@ -44,6 +48,9 @@
 #define QSV_HAVE_LA     QSV_VERSION_ATLEAST(1, 7)
 #define QSV_HAVE_LA_DS  QSV_VERSION_ATLEAST(1, 8)
 #define QSV_HAVE_LA_HRD QSV_VERSION_ATLEAST(1, 11)
+#define QSV_HAVE_VDENC  QSV_VERSION_ATLEAST(1, 15)
+
+#define QSV_HAVE_GPB    QSV_VERSION_ATLEAST(1, 18)
 
 #if defined(_WIN32) || defined(__CYGWIN__)
 #define QSV_HAVE_AVBR   QSV_VERSION_ATLEAST(1, 3)
@@ -53,9 +60,9 @@
 #define QSV_HAVE_MF     0
 #else
 #define QSV_HAVE_AVBR   0
-#define QSV_HAVE_ICQ    0
+#define QSV_HAVE_ICQ    QSV_VERSION_ATLEAST(1, 28)
 #define QSV_HAVE_VCM    0
-#define QSV_HAVE_QVBR   0
+#define QSV_HAVE_QVBR   QSV_VERSION_ATLEAST(1, 28)
 #define QSV_HAVE_MF     QSV_VERSION_ATLEAST(1, 25)
 #endif
 
@@ -87,6 +94,8 @@
 { "adaptive_i",     "Adaptive I-frame placement",             OFFSET(qsv.adaptive_i),     AV_OPT_TYPE_INT, { .i64 = -1 }, -1,          1, VE },                         \
 { "adaptive_b",     "Adaptive B-frame placement",             OFFSET(qsv.adaptive_b),     AV_OPT_TYPE_INT, { .i64 = -1 }, -1,          1, VE },                         \
 { "b_strategy",     "Strategy to choose between I/P/B-frames", OFFSET(qsv.b_strategy),    AV_OPT_TYPE_INT, { .i64 = -1 }, -1,          1, VE },                         \
+{ "forced_idr",     "Forcing I frames as IDR frames",         OFFSET(qsv.forced_idr),     AV_OPT_TYPE_BOOL,{ .i64 = 0  },  0,          1, VE },                         \
+{ "low_power", "enable low power mode(experimental: many limitations by mfx version, BRC modes, etc.)", OFFSET(qsv.low_power), AV_OPT_TYPE_BOOL, { .i64 = 0}, 0, 1, VE},\
 
 typedef int SetEncodeCtrlCB (AVCodecContext *avctx,
                              const AVFrame *frame, mfxEncodeCtrl* enc_ctrl);
@@ -96,7 +105,7 @@
     QSVFrame *work_frames;
 
     mfxSession session;
-    mfxSession internal_session;
+    QSVSession internal_qs;
 
     int packet_size;
     int width_align;
@@ -109,15 +118,25 @@
 #if QSV_HAVE_CO2
     mfxExtCodingOption2 extco2;
 #endif
+#if QSV_HAVE_CO3
+    mfxExtCodingOption3 extco3;
+#endif
 #if QSV_HAVE_MF
     mfxExtMultiFrameParam   extmfp;
     mfxExtMultiFrameControl extmfc;
 #endif
+#if QSV_HAVE_EXT_HEVC_TILES
+    mfxExtHEVCTiles exthevctiles;
+#endif
+#if QSV_HAVE_EXT_VP9_PARAM
+    mfxExtVP9Param  extvp9param;
+#endif
+
     mfxExtOpaqueSurfaceAlloc opaque_alloc;
     mfxFrameSurface1       **opaque_surfaces;
     AVBufferRef             *opaque_alloc_buf;
 
-    mfxExtBuffer  *extparam_internal[2 + QSV_HAVE_CO2 + (QSV_HAVE_MF * 2)];
+    mfxExtBuffer  *extparam_internal[2 + QSV_HAVE_CO2 + QSV_HAVE_CO3 + (QSV_HAVE_MF * 2)];
     int         nb_extparam_internal;
 
     mfxExtBuffer **extparam;
@@ -126,6 +145,10 @@
 
     QSVFramesContext frames_ctx;
 
+    mfxVersion          ver;
+
+    int hevc_vps;
+
     // options set by the caller
     int async_depth;
     int idr_interval;
@@ -142,11 +165,13 @@
     int max_frame_size;
     int max_slice_size;
 
+    int tile_cols;
+    int tile_rows;
+
     int aud;
 
     int single_sei_nal_unit;
     int max_dec_frame_buffering;
-    int trellis;
 
     int bitrate_limit;
     int mbbrc;
@@ -161,6 +186,10 @@
     int int_ref_qp_delta;
     int recovery_point_sei;
 
+    int repeat_pps;
+    int low_power;
+    int gpb;
+
     int a53_cc;
 
 #if QSV_HAVE_MF
@@ -168,6 +197,7 @@
 #endif
     char *load_plugins;
     SetEncodeCtrlCB *set_encode_ctrl_cb;
+    int forced_idr;
 } QSVEncContext;
 
 int ff_qsv_enc_init(AVCodecContext *avctx, QSVEncContext *q);
diff --git a/libavcodec/qsvenc_h264.c b/libavcodec/qsvenc_h264.c
index 07c9d64..27f36b9 100644
--- a/libavcodec/qsvenc_h264.c
+++ b/libavcodec/qsvenc_h264.c
@@ -132,12 +132,6 @@
     { "int_ref_qp_delta",   "QP difference for the refresh MBs",                 OFFSET(qsv.int_ref_qp_delta),        AV_OPT_TYPE_INT, { .i64 = INT16_MIN }, INT16_MIN,  INT16_MAX, VE },
     { "recovery_point_sei", "Insert recovery point SEI messages",                OFFSET(qsv.recovery_point_sei),      AV_OPT_TYPE_INT, { .i64 = -1 },               -1,          1, VE },
 
-    { "trellis",             "Trellis quantization",                             OFFSET(qsv.trellis),                 AV_OPT_TYPE_FLAGS, { .i64 = 0 }, 0, UINT_MAX, VE, "trellis" },
-        { "off", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_TRELLIS_OFF }, .flags = VE, "trellis" },
-        { "I",   NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_TRELLIS_I },   .flags = VE, "trellis" },
-        { "P",   NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_TRELLIS_P },   .flags = VE, "trellis" },
-        { "B",   NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_TRELLIS_B },   .flags = VE, "trellis" },
-
     { "profile", NULL, OFFSET(qsv.profile), AV_OPT_TYPE_INT, { .i64 = MFX_PROFILE_UNKNOWN }, 0, INT_MAX, VE, "profile" },
     { "unknown" , NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_PROFILE_UNKNOWN      }, INT_MIN, INT_MAX,     VE, "profile" },
     { "baseline", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_PROFILE_AVC_BASELINE }, INT_MIN, INT_MAX,     VE, "profile" },
@@ -154,6 +148,8 @@
     { "auto"   , NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_MF_AUTO     }, INT_MIN, INT_MAX,     VE, "mfmode" },
 #endif
 
+    { "repeat_pps", "repeat pps for every frame", OFFSET(qsv.repeat_pps), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VE },
+
     { NULL },
 };
 
@@ -175,7 +171,7 @@
 #if FF_API_CODER_TYPE
     { "coder",     "-1"    },
 #endif
-
+    { "trellis",   "-1"    },
     { "flags",     "+cgop" },
 #if FF_API_PRIVATE_OPT
     { "b_strategy", "-1"   },
diff --git a/libavcodec/qsvenc_hevc.c b/libavcodec/qsvenc_hevc.c
index 4339b31..27e2232 100644
--- a/libavcodec/qsvenc_hevc.c
+++ b/libavcodec/qsvenc_hevc.c
@@ -107,6 +107,7 @@
     /* generate the VPS */
     vps.vps_max_layers     = 1;
     vps.vps_max_sub_layers = sps.max_sub_layers;
+    vps.vps_temporal_id_nesting_flag = sps.temporal_id_nesting_flag;
     memcpy(&vps.ptl, &sps.ptl, sizeof(vps.ptl));
     vps.vps_sub_layer_ordering_info_present_flag = 1;
     for (i = 0; i < HEVC_MAX_SUB_LAYERS; i++) {
@@ -121,6 +122,7 @@
     vps.vps_time_scale                      = sps.vui.vui_time_scale;
     vps.vps_poc_proportional_to_timing_flag = sps.vui.vui_poc_proportional_to_timing_flag;
     vps.vps_num_ticks_poc_diff_one          = sps.vui.vui_num_ticks_poc_diff_one_minus1 + 1;
+    vps.vps_num_hrd_parameters              = 0;
 
     /* generate the encoded RBSP form of the VPS */
     ret = ff_hevc_encode_nal_vps(&vps, sps.vps_id, vps_rbsp_buf, sizeof(vps_rbsp_buf));
@@ -138,8 +140,7 @@
     bytestream2_put_byte(&pbc, 1);                 // header
 
     while (bytestream2_get_bytes_left(&gbc)) {
-        uint32_t b = bytestream2_peek_be24(&gbc);
-        if (b <= 3) {
+        if (bytestream2_get_bytes_left(&gbc) >= 3 && bytestream2_peek_be24(&gbc) <= 3) {
             bytestream2_put_be24(&pbc, 3);
             bytestream2_skip(&gbc, 2);
         } else
@@ -193,10 +194,12 @@
     if (ret < 0)
         return ret;
 
-    ret = generate_fake_vps(&q->qsv, avctx);
-    if (ret < 0) {
-        ff_qsv_enc_close(avctx, &q->qsv);
-        return ret;
+    if (!q->qsv.hevc_vps) {
+        ret = generate_fake_vps(&q->qsv, avctx);
+        if (ret < 0) {
+            ff_qsv_enc_close(avctx, &q->qsv);
+            return ret;
+        }
     }
 
     return 0;
@@ -217,12 +220,6 @@
     return ff_qsv_enc_close(avctx, &q->qsv);
 }
 
-#if defined(_WIN32)
-#define LOAD_PLUGIN_DEFAULT LOAD_PLUGIN_HEVC_SW
-#else
-#define LOAD_PLUGIN_DEFAULT LOAD_PLUGIN_HEVC_HW
-#endif
-
 #define OFFSET(x) offsetof(QSVHEVCEncContext, x)
 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
 static const AVOption options[] = {
@@ -230,7 +227,7 @@
 
     { "idr_interval", "Distance (in I-frames) between IDR frames", OFFSET(qsv.idr_interval), AV_OPT_TYPE_INT, { .i64 = 0 }, -1, INT_MAX, VE, "idr_interval" },
     { "begin_only", "Output an IDR-frame only at the beginning of the stream", 0, AV_OPT_TYPE_CONST, { .i64 = -1 }, 0, 0, VE, "idr_interval" },
-    { "load_plugin", "A user plugin to load in an internal session", OFFSET(load_plugin), AV_OPT_TYPE_INT, { .i64 = LOAD_PLUGIN_DEFAULT }, LOAD_PLUGIN_NONE, LOAD_PLUGIN_HEVC_HW, VE, "load_plugin" },
+    { "load_plugin", "A user plugin to load in an internal session", OFFSET(load_plugin), AV_OPT_TYPE_INT, { .i64 = LOAD_PLUGIN_HEVC_HW }, LOAD_PLUGIN_NONE, LOAD_PLUGIN_HEVC_HW, VE, "load_plugin" },
     { "none",     NULL, 0, AV_OPT_TYPE_CONST, { .i64 = LOAD_PLUGIN_NONE },    0, 0, VE, "load_plugin" },
     { "hevc_sw",  NULL, 0, AV_OPT_TYPE_CONST, { .i64 = LOAD_PLUGIN_HEVC_SW }, 0, 0, VE, "load_plugin" },
     { "hevc_hw",  NULL, 0, AV_OPT_TYPE_CONST, { .i64 = LOAD_PLUGIN_HEVC_HW }, 0, 0, VE, "load_plugin" },
@@ -244,6 +241,11 @@
     { "main10",  NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_PROFILE_HEVC_MAIN10  }, INT_MIN, INT_MAX,     VE, "profile" },
     { "mainsp",  NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_PROFILE_HEVC_MAINSP  }, INT_MIN, INT_MAX,     VE, "profile" },
 
+    { "gpb", "1: GPB (generalized P/B frame); 0: regular P frame", OFFSET(qsv.gpb), AV_OPT_TYPE_BOOL, { .i64 = 1 }, 0, 1, VE},
+
+    { "tile_cols",  "Number of columns for tiled encoding",   OFFSET(qsv.tile_cols),    AV_OPT_TYPE_INT, { .i64 = 0 }, 0, UINT16_MAX, VE },
+    { "tile_rows",  "Number of rows for tiled encoding",      OFFSET(qsv.tile_rows),    AV_OPT_TYPE_INT, { .i64 = 0 }, 0, UINT16_MAX, VE },
+
     { NULL },
 };
 
@@ -260,7 +262,7 @@
     // same as the x264 default
     { "g",         "248"   },
     { "bf",        "8"     },
-
+    { "trellis",   "-1"    },
     { "flags",     "+cgop" },
 #if FF_API_PRIVATE_OPT
     { "b_strategy", "-1"   },
diff --git a/libavcodec/qsvenc_jpeg.c b/libavcodec/qsvenc_jpeg.c
index c18fe91..1619a33 100644
--- a/libavcodec/qsvenc_jpeg.c
+++ b/libavcodec/qsvenc_jpeg.c
@@ -29,7 +29,6 @@
 
 #include "avcodec.h"
 #include "internal.h"
-#include "h264.h"
 #include "qsv.h"
 #include "qsv_internal.h"
 #include "qsvenc.h"
@@ -64,6 +63,7 @@
 #define OFFSET(x) offsetof(QSVMJPEGEncContext, x)
 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
 static const AVOption options[] = {
+    { "async_depth", "Maximum processing parallelism", OFFSET(qsv.async_depth), AV_OPT_TYPE_INT, { .i64 = ASYNC_DEPTH_DEFAULT }, 1, INT_MAX, VE },
     { NULL },
 };
 
@@ -74,6 +74,11 @@
     .version    = LIBAVUTIL_VERSION_INT,
 };
 
+static const AVCodecDefault qsv_enc_defaults[] = {
+    { "global_quality",  "80" },
+    { NULL },
+};
+
 AVCodec ff_mjpeg_qsv_encoder = {
     .name           = "mjpeg_qsv",
     .long_name      = NULL_IF_CONFIG_SMALL("MJPEG (Intel Quick Sync Video acceleration)"),
@@ -88,5 +93,6 @@
                                                     AV_PIX_FMT_QSV,
                                                     AV_PIX_FMT_NONE },
     .priv_class     = &class,
+    .defaults       = qsv_enc_defaults,
     .wrapper_name   = "qsv",
 };
diff --git a/libavcodec/qsvenc_mpeg2.c b/libavcodec/qsvenc_mpeg2.c
index a7427d8..e4ade56 100644
--- a/libavcodec/qsvenc_mpeg2.c
+++ b/libavcodec/qsvenc_mpeg2.c
@@ -87,7 +87,7 @@
     // same as the x264 default
     { "g",         "250"   },
     { "bf",        "3"     },
-
+    { "trellis",   "-1"    },
     { "flags",     "+cgop" },
 #if FF_API_PRIVATE_OPT
     { "b_strategy", "-1"   },
diff --git a/libavcodec/qsvenc_vp9.c b/libavcodec/qsvenc_vp9.c
new file mode 100644
index 0000000..9402f80
--- /dev/null
+++ b/libavcodec/qsvenc_vp9.c
@@ -0,0 +1,113 @@
+/*
+ * Intel MediaSDK QSV based VP9 encoder
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+
+#include <stdint.h>
+#include <sys/types.h>
+
+#include <mfx/mfxvideo.h>
+
+#include "libavutil/common.h"
+#include "libavutil/opt.h"
+
+#include "avcodec.h"
+#include "internal.h"
+#include "qsv.h"
+#include "qsv_internal.h"
+#include "qsvenc.h"
+
+typedef struct QSVVP9EncContext {
+    AVClass *class;
+    QSVEncContext qsv;
+} QSVVP9EncContext;
+
+static av_cold int qsv_enc_init(AVCodecContext *avctx)
+{
+    QSVVP9EncContext *q = avctx->priv_data;
+    q->qsv.low_power = 1;
+
+    return ff_qsv_enc_init(avctx, &q->qsv);
+}
+
+static int qsv_enc_frame(AVCodecContext *avctx, AVPacket *pkt,
+                         const AVFrame *frame, int *got_packet)
+{
+    QSVVP9EncContext *q = avctx->priv_data;
+
+    return ff_qsv_encode(avctx, &q->qsv, pkt, frame, got_packet);
+}
+
+static av_cold int qsv_enc_close(AVCodecContext *avctx)
+{
+    QSVVP9EncContext *q = avctx->priv_data;
+
+    return ff_qsv_enc_close(avctx, &q->qsv);
+}
+
+#define OFFSET(x) offsetof(QSVVP9EncContext, x)
+#define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
+static const AVOption options[] = {
+    QSV_COMMON_OPTS
+
+    { "profile",   NULL, OFFSET(qsv.profile), AV_OPT_TYPE_INT,   { .i64 = MFX_PROFILE_UNKNOWN },   0,       INT_MAX,  VE,  "profile" },
+    { "unknown",   NULL, 0,                   AV_OPT_TYPE_CONST, { .i64 = MFX_PROFILE_UNKNOWN},   INT_MIN,  INT_MAX,  VE,  "profile" },
+    { "profile0",  NULL, 0,                   AV_OPT_TYPE_CONST, { .i64 = MFX_PROFILE_VP9_0   },  INT_MIN,  INT_MAX,  VE,  "profile" },
+    { "profile1",  NULL, 0,                   AV_OPT_TYPE_CONST, { .i64 = MFX_PROFILE_VP9_1   },  INT_MIN,  INT_MAX,  VE,  "profile" },
+    { "profile2",  NULL, 0,                   AV_OPT_TYPE_CONST, { .i64 = MFX_PROFILE_VP9_2   },  INT_MIN,  INT_MAX,  VE,  "profile" },
+    { "profile3",  NULL, 0,                   AV_OPT_TYPE_CONST, { .i64 = MFX_PROFILE_VP9_3   },  INT_MIN,  INT_MAX,  VE,  "profile" },
+
+    { NULL },
+};
+
+static const AVClass class = {
+    .class_name = "vp9_qsv encoder",
+    .item_name  = av_default_item_name,
+    .option     = options,
+    .version    = LIBAVUTIL_VERSION_INT,
+};
+
+static const AVCodecDefault qsv_enc_defaults[] = {
+    { "b",         "1M"    },
+    { "refs",      "0"     },
+    { "g",         "250"   },
+    { "trellis",   "-1"    },
+    { "flags",     "+cgop" },
+    { NULL },
+};
+
+AVCodec ff_vp9_qsv_encoder = {
+    .name           = "vp9_qsv",
+    .long_name      = NULL_IF_CONFIG_SMALL("VP9 video (Intel Quick Sync Video acceleration)"),
+    .priv_data_size = sizeof(QSVVP9EncContext),
+    .type           = AVMEDIA_TYPE_VIDEO,
+    .id             = AV_CODEC_ID_VP9,
+    .init           = qsv_enc_init,
+    .encode2        = qsv_enc_frame,
+    .close          = qsv_enc_close,
+    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_HYBRID,
+    .pix_fmts       = (const enum AVPixelFormat[]){ AV_PIX_FMT_NV12,
+                                                    AV_PIX_FMT_P010,
+                                                    AV_PIX_FMT_QSV,
+                                                    AV_PIX_FMT_NONE },
+    .priv_class     = &class,
+    .defaults       = qsv_enc_defaults,
+    .caps_internal  = FF_CODEC_CAP_INIT_CLEANUP,
+    .wrapper_name   = "qsv",
+};
diff --git a/libavcodec/qtrle.c b/libavcodec/qtrle.c
index 6155b4f..52394f5 100644
--- a/libavcodec/qtrle.c
+++ b/libavcodec/qtrle.c
@@ -297,10 +297,11 @@
 
 static void qtrle_decode_24bpp(QtrleContext *s, int row_ptr, int lines_to_change)
 {
-    int rle_code;
+    int rle_code, rle_code_half;
     int pixel_ptr;
     int row_inc = s->frame->linesize[0];
-    uint8_t r, g, b;
+    uint8_t b;
+    uint16_t rg;
     uint8_t *rgb = s->frame->data[0];
     int pixel_limit = s->frame->linesize[0] * s->avctx->height;
 
@@ -318,25 +319,31 @@
             } else if (rle_code < 0) {
                 /* decode the run length code */
                 rle_code = -rle_code;
-                r = bytestream2_get_byte(&s->g);
-                g = bytestream2_get_byte(&s->g);
+                rg = bytestream2_get_ne16(&s->g);
                 b = bytestream2_get_byte(&s->g);
 
                 CHECK_PIXEL_PTR(rle_code * 3);
 
                 while (rle_code--) {
-                    rgb[pixel_ptr++] = r;
-                    rgb[pixel_ptr++] = g;
-                    rgb[pixel_ptr++] = b;
+                    AV_WN16(rgb + pixel_ptr, rg);
+                    rgb[pixel_ptr + 2] = b;
+                    pixel_ptr += 3;
                 }
             } else {
                 CHECK_PIXEL_PTR(rle_code * 3);
 
-                /* copy pixels directly to output */
-                while (rle_code--) {
-                    rgb[pixel_ptr++] = bytestream2_get_byte(&s->g);
-                    rgb[pixel_ptr++] = bytestream2_get_byte(&s->g);
-                    rgb[pixel_ptr++] = bytestream2_get_byte(&s->g);
+                rle_code_half = rle_code / 2;
+
+                while (rle_code_half--) { /* copy 2 raw rgb value at the same time */
+                    AV_WN32(rgb + pixel_ptr, bytestream2_get_ne32(&s->g)); /* rgbr */
+                    AV_WN16(rgb + pixel_ptr + 4, bytestream2_get_ne16(&s->g)); /* rgbr */
+                    pixel_ptr += 6;
+                }
+
+                if (rle_code % 2 != 0){ /* not even raw value */
+                    AV_WN16(rgb + pixel_ptr, bytestream2_get_ne16(&s->g));
+                    rgb[pixel_ptr + 2] = bytestream2_get_byte(&s->g);
+                    pixel_ptr += 3;
                 }
             }
         }
@@ -346,7 +353,7 @@
 
 static void qtrle_decode_32bpp(QtrleContext *s, int row_ptr, int lines_to_change)
 {
-    int rle_code;
+    int rle_code, rle_code_half;
     int pixel_ptr;
     int row_inc = s->frame->linesize[0];
     unsigned int argb;
@@ -367,7 +374,7 @@
             } else if (rle_code < 0) {
                 /* decode the run length code */
                 rle_code = -rle_code;
-                argb = bytestream2_get_be32(&s->g);
+                argb = bytestream2_get_ne32(&s->g);
 
                 CHECK_PIXEL_PTR(rle_code * 4);
 
@@ -379,10 +386,15 @@
                 CHECK_PIXEL_PTR(rle_code * 4);
 
                 /* copy pixels directly to output */
-                while (rle_code--) {
-                    argb = bytestream2_get_be32(&s->g);
-                    AV_WN32A(rgb + pixel_ptr, argb);
-                    pixel_ptr  += 4;
+                rle_code_half = rle_code / 2;
+                while (rle_code_half--) { /* copy 2 argb raw value at the same time */
+                    AV_WN64(rgb + pixel_ptr, bytestream2_get_ne64(&s->g));
+                    pixel_ptr += 8;
+                }
+
+                if (rle_code % 2 != 0){ /* not even raw value */
+                    AV_WN32A(rgb + pixel_ptr, bytestream2_get_ne32(&s->g));
+                    pixel_ptr += 4;
                 }
             }
         }
@@ -416,7 +428,7 @@
         break;
 
     case 32:
-        avctx->pix_fmt = AV_PIX_FMT_RGB32;
+        avctx->pix_fmt = AV_PIX_FMT_ARGB;
         break;
 
     default:
@@ -440,35 +452,45 @@
     int header, start_line;
     int height, row_ptr;
     int has_palette = 0;
-    int ret;
+    int duplicate = 0;
+    int ret, size;
 
     bytestream2_init(&s->g, avpkt->data, avpkt->size);
 
     /* check if this frame is even supposed to change */
-    if (avpkt->size < 8)
-        return avpkt->size;
+    if (avpkt->size < 8) {
+        duplicate = 1;
+        goto done;
+    }
 
     /* start after the chunk size */
-    bytestream2_seek(&s->g, 4, SEEK_SET);
+    size = bytestream2_get_be32(&s->g) & 0x3FFFFFFF;
+    if (size - avpkt->size >  size * (int64_t)avctx->discard_damaged_percentage / 100)
+        return AVERROR_INVALIDDATA;
+
 
     /* fetch the header */
     header = bytestream2_get_be16(&s->g);
 
     /* if a header is present, fetch additional decoding parameters */
     if (header & 0x0008) {
-        if (avpkt->size < 14)
-            return avpkt->size;
+        if (avpkt->size < 14) {
+            duplicate = 1;
+            goto done;
+        }
         start_line = bytestream2_get_be16(&s->g);
         bytestream2_skip(&s->g, 2);
         height     = bytestream2_get_be16(&s->g);
         bytestream2_skip(&s->g, 2);
-        if (height > s->avctx->height - start_line)
-            return avpkt->size;
+        if (height > s->avctx->height - start_line) {
+            duplicate = 1;
+            goto done;
+        }
     } else {
         start_line = 0;
         height     = s->avctx->height;
     }
-    if ((ret = ff_reget_buffer(avctx, s->frame)) < 0)
+    if ((ret = ff_reget_buffer(avctx, s->frame, 0)) < 0)
         return ret;
 
     row_ptr = s->frame->linesize[0] * start_line;
@@ -531,6 +553,17 @@
         memcpy(s->frame->data[1], s->pal, AVPALETTE_SIZE);
     }
 
+done:
+    if (!s->frame->data[0])
+        return AVERROR_INVALIDDATA;
+    if (duplicate) {
+        // ff_reget_buffer() isn't needed when frames don't change, so just update
+        // frame props.
+        ret = ff_decode_frame_props(avctx, s->frame);
+        if (ret < 0)
+            return ret;
+    }
+
     if ((ret = av_frame_ref(data, s->frame)) < 0)
         return ret;
     *got_frame      = 1;
@@ -539,6 +572,13 @@
     return avpkt->size;
 }
 
+static void qtrle_decode_flush(AVCodecContext *avctx)
+{
+    QtrleContext *s = avctx->priv_data;
+
+    av_frame_unref(s->frame);
+}
+
 static av_cold int qtrle_decode_end(AVCodecContext *avctx)
 {
     QtrleContext *s = avctx->priv_data;
@@ -557,5 +597,6 @@
     .init           = qtrle_decode_init,
     .close          = qtrle_decode_end,
     .decode         = qtrle_decode_frame,
+    .flush          = qtrle_decode_flush,
     .capabilities   = AV_CODEC_CAP_DR1,
 };
diff --git a/libavcodec/qtrleenc.c b/libavcodec/qtrleenc.c
index cdd864b..6669c13 100644
--- a/libavcodec/qtrleenc.c
+++ b/libavcodec/qtrleenc.c
@@ -259,9 +259,10 @@
         /* These bulk costs increase every iteration */
         lowest_bulk_cost += s->pixel_size;
         sec_lowest_bulk_cost += s->pixel_size;
-
-        this_line -= s->pixel_size;
-        prev_line -= s->pixel_size;
+        if (this_line >= p->data[0] + s->pixel_size)
+            this_line -= s->pixel_size;
+        if (prev_line >= s->previous_frame->data[0] + s->pixel_size)
+            prev_line -= s->pixel_size;
     }
 
     /* Good! Now we have the best sequence for this line, let's output it. */
diff --git a/libavcodec/r210dec.c b/libavcodec/r210dec.c
index dbc94c7..407684c7 100644
--- a/libavcodec/r210dec.c
+++ b/libavcodec/r210dec.c
@@ -27,11 +27,7 @@
 
 static av_cold int decode_init(AVCodecContext *avctx)
 {
-    if ((avctx->codec_tag & 0xFFFFFF) == MKTAG('r', '1', '0', 0)) {
-        avctx->pix_fmt = AV_PIX_FMT_BGR48;
-    } else {
-        avctx->pix_fmt = AV_PIX_FMT_RGB48;
-    }
+    avctx->pix_fmt = AV_PIX_FMT_GBRP10;
     avctx->bits_per_raw_sample = 10;
 
     return 0;
@@ -45,7 +41,7 @@
     const uint32_t *src = (const uint32_t *)avpkt->data;
     int aligned_width = FFALIGN(avctx->width,
                                 avctx->codec_id == AV_CODEC_ID_R10K ? 1 : 64);
-    uint8_t *dst_line;
+    uint8_t *g_line, *b_line, *r_line;
     int r10 = (avctx->codec_tag & 0xFFFFFF) == MKTAG('r', '1', '0', 0);
     int le = avctx->codec_tag == MKTAG('R', '1', '0', 'k') &&
              avctx->extradata_size >= 12 && !memcmp(&avctx->extradata[4], "DpxE", 4) &&
@@ -61,10 +57,14 @@
 
     pic->pict_type = AV_PICTURE_TYPE_I;
     pic->key_frame = 1;
-    dst_line = pic->data[0];
+    g_line = pic->data[0];
+    b_line = pic->data[1];
+    r_line = pic->data[2];
 
     for (h = 0; h < avctx->height; h++) {
-        uint16_t *dst = (uint16_t *)dst_line;
+        uint16_t *dstg = (uint16_t *)g_line;
+        uint16_t *dstb = (uint16_t *)b_line;
+        uint16_t *dstr = (uint16_t *)r_line;
         for (w = 0; w < avctx->width; w++) {
             uint32_t pixel;
             uint16_t r, g, b;
@@ -73,21 +73,27 @@
             } else {
                 pixel = av_be2ne32(*src++);
             }
-            if (avctx->codec_id == AV_CODEC_ID_R210 || r10) {
-                b =  pixel <<  6;
-                g = (pixel >>  4) & 0xffc0;
-                r = (pixel >> 14) & 0xffc0;
+            if (avctx->codec_id == AV_CODEC_ID_R210) {
+                b =  pixel & 0x3ff;
+                g = (pixel >> 10) & 0x3ff;
+                r = (pixel >> 20) & 0x3ff;
+            } else if (r10) {
+                r =  pixel & 0x3ff;
+                g = (pixel >> 10) & 0x3ff;
+                b = (pixel >> 20) & 0x3ff;
             } else {
-                b = (pixel <<  4) & 0xffc0;
-                g = (pixel >>  6) & 0xffc0;
-                r = (pixel >> 16) & 0xffc0;
+                b = (pixel >>  2) & 0x3ff;
+                g = (pixel >> 12) & 0x3ff;
+                r = (pixel >> 22) & 0x3ff;
             }
-            *dst++ = r | (r >> 10);
-            *dst++ = g | (g >> 10);
-            *dst++ = b | (b >> 10);
+            *dstr++ = r;
+            *dstg++ = g;
+            *dstb++ = b;
         }
         src += aligned_width - avctx->width;
-        dst_line += pic->linesize[0];
+        g_line += pic->linesize[0];
+        b_line += pic->linesize[1];
+        r_line += pic->linesize[2];
     }
 
     *got_frame      = 1;
diff --git a/libavcodec/r210enc.c b/libavcodec/r210enc.c
index a55e543..b24dc1a 100644
--- a/libavcodec/r210enc.c
+++ b/libavcodec/r210enc.c
@@ -43,22 +43,26 @@
     int aligned_width = FFALIGN(avctx->width,
                                 avctx->codec_id == AV_CODEC_ID_R10K ? 1 : 64);
     int pad = (aligned_width - avctx->width) * 4;
-    uint8_t *src_line;
+    uint8_t *srcr_line, *srcg_line, *srcb_line;
     uint8_t *dst;
 
     if ((ret = ff_alloc_packet2(avctx, pkt, 4 * aligned_width * avctx->height, 0)) < 0)
         return ret;
 
-    src_line = pic->data[0];
+    srcg_line = pic->data[0];
+    srcb_line = pic->data[1];
+    srcr_line = pic->data[2];
     dst = pkt->data;
 
     for (i = 0; i < avctx->height; i++) {
-        uint16_t *src = (uint16_t *)src_line;
+        uint16_t *srcr = (uint16_t *)srcr_line;
+        uint16_t *srcg = (uint16_t *)srcg_line;
+        uint16_t *srcb = (uint16_t *)srcb_line;
         for (j = 0; j < avctx->width; j++) {
             uint32_t pixel;
-            uint16_t r = *src++ >> 6;
-            uint16_t g = *src++ >> 6;
-            uint16_t b = *src++ >> 6;
+            unsigned r = *srcr++;
+            unsigned g = *srcg++;
+            unsigned b = *srcb++;
             if (avctx->codec_id == AV_CODEC_ID_R210)
                 pixel = (r << 20) | (g << 10) | b;
             else
@@ -70,7 +74,9 @@
         }
         memset(dst, 0, pad);
         dst += pad;
-        src_line += pic->linesize[0];
+        srcr_line += pic->linesize[2];
+        srcg_line += pic->linesize[0];
+        srcb_line += pic->linesize[1];
     }
 
     pkt->flags |= AV_PKT_FLAG_KEY;
@@ -87,7 +93,7 @@
     .id             = AV_CODEC_ID_R210,
     .init           = encode_init,
     .encode2        = encode_frame,
-    .pix_fmts       = (const enum AVPixelFormat[]) { AV_PIX_FMT_RGB48, AV_PIX_FMT_NONE },
+    .pix_fmts       = (const enum AVPixelFormat[]) { AV_PIX_FMT_GBRP10, AV_PIX_FMT_NONE },
     .capabilities   = AV_CODEC_CAP_INTRA_ONLY,
 };
 #endif
@@ -99,7 +105,7 @@
     .id             = AV_CODEC_ID_R10K,
     .init           = encode_init,
     .encode2        = encode_frame,
-    .pix_fmts       = (const enum AVPixelFormat[]) { AV_PIX_FMT_RGB48, AV_PIX_FMT_NONE },
+    .pix_fmts       = (const enum AVPixelFormat[]) { AV_PIX_FMT_GBRP10, AV_PIX_FMT_NONE },
     .capabilities   = AV_CODEC_CAP_INTRA_ONLY,
 };
 #endif
@@ -111,7 +117,7 @@
     .id             = AV_CODEC_ID_AVRP,
     .init           = encode_init,
     .encode2        = encode_frame,
-    .pix_fmts       = (const enum AVPixelFormat[]) { AV_PIX_FMT_RGB48, AV_PIX_FMT_NONE },
+    .pix_fmts       = (const enum AVPixelFormat[]) { AV_PIX_FMT_GBRP10, AV_PIX_FMT_NONE },
     .capabilities   = AV_CODEC_CAP_INTRA_ONLY,
 };
 #endif
diff --git a/libavcodec/ra144.c b/libavcodec/ra144.c
index 573703d..65a7448 100644
--- a/libavcodec/ra144.c
+++ b/libavcodec/ra144.c
@@ -1516,7 +1516,7 @@
 
     if (v[0]) {
         for (i=0; i < BLOCKSIZE; i++)
-            dest[i] = ((int)(s1[i]*(unsigned)v[0]) + s2[i]*v[1] + s3[i]*v[2]) >> 12;
+            dest[i] = (int)((s1[i]*(unsigned)v[0]) + s2[i]*v[1] + s3[i]*v[2]) >> 12;
     } else {
         for (i=0; i < BLOCKSIZE; i++)
             dest[i] = (             s2[i]*v[1] + s3[i]*v[2]) >> 12;
diff --git a/libavcodec/ra144enc.c b/libavcodec/ra144enc.c
index cc4f381..059f582 100644
--- a/libavcodec/ra144enc.c
+++ b/libavcodec/ra144enc.c
@@ -477,8 +477,8 @@
                       LPC_ORDER, 16, lpc_coefs, shift, FF_LPC_TYPE_LEVINSON,
                       0, ORDER_METHOD_EST, 0, 12, 0);
     for (i = 0; i < LPC_ORDER; i++)
-        block_coefs[NBLOCKS - 1][i] = -(lpc_coefs[LPC_ORDER - 1][i] <<
-                                        (12 - shift[LPC_ORDER - 1]));
+        block_coefs[NBLOCKS - 1][i] = -lpc_coefs[LPC_ORDER - 1][i]
+                                       * (1 << (12 - shift[LPC_ORDER - 1]));
 
     /**
      * TODO: apply perceptual weighting of the input speech through bandwidth
diff --git a/libavcodec/ra288.c b/libavcodec/ra288.c
index f1b3c8e..aa4bd5d 100644
--- a/libavcodec/ra288.c
+++ b/libavcodec/ra288.c
@@ -77,7 +77,7 @@
     avctx->channel_layout = AV_CH_LAYOUT_MONO;
     avctx->sample_fmt     = AV_SAMPLE_FMT_FLT;
 
-    if (avctx->block_align <= 0) {
+    if (avctx->block_align != 38) {
         av_log(avctx, AV_LOG_ERROR, "unsupported block align\n");
         return AVERROR_PATCHWELCOME;
     }
diff --git a/libavcodec/ralf.c b/libavcodec/ralf.c
index 3f7953c..8317281 100644
--- a/libavcodec/ralf.c
+++ b/libavcodec/ralf.c
@@ -60,7 +60,7 @@
     int     filter_bits;     ///< filter precision for the current channel data
     int32_t filter[64];
 
-    int     bias[2];         ///< a constant value added to channel data after filtering
+    unsigned bias[2];        ///< a constant value added to channel data after filtering
 
     int num_blocks;          ///< number of blocks inside the frame
     int sample_offset;
@@ -220,7 +220,7 @@
         val -= range;
     }
     if (bits)
-        val = (val << bits) | get_bits(gb, bits);
+        val = ((unsigned)val << bits) | get_bits(gb, bits);
     return val;
 }
 
@@ -234,8 +234,10 @@
     int *dst = ctx->channel_data[ch];
 
     ctx->filter_params = get_vlc2(gb, set->filter_params.table, 9, 2);
-    ctx->filter_bits   = (ctx->filter_params - 2) >> 6;
-    ctx->filter_length = ctx->filter_params - (ctx->filter_bits << 6) - 1;
+    if (ctx->filter_params > 1) {
+        ctx->filter_bits   = (ctx->filter_params - 2) >> 6;
+        ctx->filter_length = ctx->filter_params - (ctx->filter_bits << 6) - 1;
+    }
 
     if (ctx->filter_params == FILTER_RAW) {
         for (i = 0; i < length; i++)
@@ -262,8 +264,8 @@
             t = get_vlc2(gb, vlc[cmode].table, vlc[cmode].bits, 2);
             t = extend_code(gb, t, 21, add_bits);
             if (!cmode)
-                coeff -= 12 << add_bits;
-            coeff = t - coeff;
+                coeff -= 12U << add_bits;
+            coeff = (unsigned)t - coeff;
             ctx->filter[i] = coeff;
 
             cmode = coeff >> add_bits;
@@ -286,7 +288,7 @@
             add_bits--;
         range    = 10;
         range2   = 21;
-        code_vlc = set->long_codes + code_params - 15;
+        code_vlc = set->long_codes + (code_params - 15);
     } else {
         add_bits = 0;
         range    = 6;
@@ -300,8 +302,8 @@
         t = get_vlc2(gb, code_vlc->table, code_vlc->bits, 2);
         code1 = t / range2;
         code2 = t % range2;
-        dst[i]     = extend_code(gb, code1, range, 0) << add_bits;
-        dst[i + 1] = extend_code(gb, code2, range, 0) << add_bits;
+        dst[i]     = extend_code(gb, code1, range, 0) * (1U << add_bits);
+        dst[i + 1] = extend_code(gb, code2, range, 0) * (1U << add_bits);
         if (add_bits) {
             dst[i]     |= get_bits(gb, add_bits);
             dst[i + 1] |= get_bits(gb, add_bits);
@@ -323,12 +325,12 @@
 
         acc = 0;
         for (j = 0; j < flen; j++)
-            acc += ctx->filter[j] * audio[i - j - 1];
+            acc += (unsigned)ctx->filter[j] * audio[i - j - 1];
         if (acc < 0) {
             acc = (acc + bias - 1) >> ctx->filter_bits;
             acc = FFMAX(acc, min_clip);
         } else {
-            acc = (acc + bias) >> ctx->filter_bits;
+            acc = ((unsigned)acc + bias) >> ctx->filter_bits;
             acc = FFMIN(acc, max_clip);
         }
         audio[i] += acc;
@@ -406,7 +408,7 @@
     case 4:
         for (i = 0; i < len; i++) {
             t  =   ch1[i] + ctx->bias[1];
-            t2 = ((ch0[i] + ctx->bias[0]) << 1) | (t & 1);
+            t2 = ((ch0[i] + ctx->bias[0]) * 2) | (t & 1);
             dst0[i] = (t2 + t) / 2;
             dst1[i] = (t2 - t) / 2;
         }
diff --git a/libavcodec/rangecoder.c b/libavcodec/rangecoder.c
index 0d53bef..a6a3f08 100644
--- a/libavcodec/rangecoder.c
+++ b/libavcodec/rangecoder.c
@@ -106,8 +106,10 @@
 }
 
 /* Return the number of bytes written. */
-int ff_rac_terminate(RangeCoder *c)
+int ff_rac_terminate(RangeCoder *c, int version)
 {
+    if (version == 1)
+        put_rac(c, (uint8_t[]) { 129 }, 0);
     c->range = 0xFF;
     c->low  += 0xFF;
     renorm_encoder(c);
@@ -119,3 +121,22 @@
 
     return c->bytestream - c->bytestream_start;
 }
+
+int ff_rac_check_termination(RangeCoder *c, int version)
+{
+    if (version == 1) {
+        RangeCoder tmp = *c;
+        get_rac(c, (uint8_t[]) { 129 });
+
+        if (c->bytestream == tmp.bytestream && c->bytestream > c->bytestream_start)
+            tmp.low -= *--tmp.bytestream;
+        tmp.bytestream_end = tmp.bytestream;
+
+        if (get_rac(&tmp, (uint8_t[]) { 129 }))
+            return AVERROR_INVALIDDATA;
+    } else {
+        if (c->bytestream_end != c->bytestream)
+            return AVERROR_INVALIDDATA;
+    }
+    return 0;
+}
diff --git a/libavcodec/rangecoder.h b/libavcodec/rangecoder.h
index 44af88b..4d4ca4d 100644
--- a/libavcodec/rangecoder.h
+++ b/libavcodec/rangecoder.h
@@ -48,7 +48,24 @@
 
 void ff_init_range_encoder(RangeCoder *c, uint8_t *buf, int buf_size);
 void ff_init_range_decoder(RangeCoder *c, const uint8_t *buf, int buf_size);
-int ff_rac_terminate(RangeCoder *c);
+
+/**
+ * Terminates the range coder
+ * @param version version 0 requires the decoder to know the data size in bytes
+ *                version 1 needs about 1 bit more space but does not need to
+ *                          carry the size from encoder to decoder
+ */
+int ff_rac_terminate(RangeCoder *c, int version);
+
+/**
+ * Check if at the current position there is a valid looking termination
+ * @param version version 0 requires the decoder to know the data size in bytes
+ *                version 1 needs about 1 bit more space but does not need to
+ *                          carry the size from encoder to decoder
+ * @returns negative AVERROR code on error or non negative.
+ */
+int ff_rac_check_termination(RangeCoder *c, int version);
+
 void ff_build_rac_states(RangeCoder *c, int factor, int max_p);
 
 static inline void renorm_encoder(RangeCoder *c)
diff --git a/libavcodec/rasc.c b/libavcodec/rasc.c
index e8e0740..cdf20a6 100644
--- a/libavcodec/rasc.c
+++ b/libavcodec/rasc.c
@@ -124,6 +124,8 @@
         clear_plane(avctx, s->frame1);
         return 0;
     }
+    if (bytestream2_get_bytes_left(gb) < 72)
+        return AVERROR_INVALIDDATA;
 
     bytestream2_skip(gb, 8);
     w = bytestream2_get_le32(gb);
@@ -215,7 +217,7 @@
     bytestream2_skip(gb, 8);
     compression = bytestream2_get_le32(gb);
 
-    if (nb_moves > INT32_MAX / 16)
+    if (nb_moves > INT32_MAX / 16 || nb_moves > avctx->width * avctx->height)
         return AVERROR_INVALIDDATA;
 
     uncompressed_size = 16 * nb_moves;
@@ -353,6 +355,8 @@
     compression = bytestream2_get_le32(gb);
 
     if (compression == 1) {
+        if (w * h * s->bpp * 3 < uncompressed_size)
+            return AVERROR_INVALIDDATA;
         ret = decode_zlib(avctx, avpkt, size, uncompressed_size);
         if (ret < 0)
             return ret;
@@ -680,6 +684,9 @@
     while (bytestream2_get_bytes_left(gb) > 0) {
         unsigned type, size = 0;
 
+        if (bytestream2_get_bytes_left(gb) < 8)
+            return AVERROR_INVALIDDATA;
+
         type = bytestream2_get_le32(gb);
         if (type == KBND || type == BNDL) {
             intra = type == KBND;
@@ -718,12 +725,12 @@
             return ret;
     }
 
-    if ((ret = ff_get_buffer(avctx, s->frame, 0)) < 0)
-        return ret;
-
     if (!s->frame2->data[0] || !s->frame1->data[0])
         return AVERROR_INVALIDDATA;
 
+    if ((ret = ff_get_buffer(avctx, s->frame, 0)) < 0)
+        return ret;
+
     copy_plane(avctx, s->frame2, s->frame);
     if (avctx->pix_fmt == AV_PIX_FMT_PAL8)
         memcpy(s->frame->data[1], s->frame2->data[1], 1024);
diff --git a/libavcodec/raw.c b/libavcodec/raw.c
index d731c08..b6fb91c 100644
--- a/libavcodec/raw.c
+++ b/libavcodec/raw.c
@@ -177,6 +177,10 @@
     { AV_PIX_FMT_YUVA422P10BE, MKTAG(10 , 10 , '4', 'Y') },
     { AV_PIX_FMT_YUVA444P10LE, MKTAG('Y', '4',  0 , 10 ) },
     { AV_PIX_FMT_YUVA444P10BE, MKTAG(10 ,  0 , '4', 'Y') },
+    { AV_PIX_FMT_YUVA422P12LE, MKTAG('Y', '4', 10 , 12 ) },
+    { AV_PIX_FMT_YUVA422P12BE, MKTAG(12 , 10 , '4', 'Y') },
+    { AV_PIX_FMT_YUVA444P12LE, MKTAG('Y', '4',  0 , 12 ) },
+    { AV_PIX_FMT_YUVA444P12BE, MKTAG(12 ,  0 , '4', 'Y') },
     { AV_PIX_FMT_YUVA420P16LE, MKTAG('Y', '4', 11 , 16 ) },
     { AV_PIX_FMT_YUVA420P16BE, MKTAG(16 , 11 , '4', 'Y') },
     { AV_PIX_FMT_YUVA422P16LE, MKTAG('Y', '4', 10 , 16 ) },
diff --git a/libavcodec/rawdec.c b/libavcodec/rawdec.c
index 53f5b76..a110a69 100644
--- a/libavcodec/rawdec.c
+++ b/libavcodec/rawdec.c
@@ -223,7 +223,7 @@
                                                            FFALIGN(avctx->width, 16),
                                                            avctx->height, 1);
     } else {
-        context->is_lt_16bpp = av_get_bits_per_pixel(desc) == 16 && avctx->bits_per_coded_sample && avctx->bits_per_coded_sample < 16;
+        context->is_lt_16bpp = av_get_bits_per_pixel(desc) == 16 && avctx->bits_per_coded_sample > 8 && avctx->bits_per_coded_sample < 16;
         context->frame_size = av_image_get_buffer_size(avctx->pix_fmt, avctx->width,
                                                        avctx->height, 1);
     }
@@ -467,10 +467,13 @@
         avctx->pix_fmt   == AV_PIX_FMT_RGBA64BE) {
         uint8_t *dst = frame->data[0];
         uint64_t v;
-        int x;
-        for (x = 0; x >> 3 < avctx->width * avctx->height; x += 8) {
-            v = AV_RB64(&dst[x]);
-            AV_WB64(&dst[x], v << 16 | v >> 48);
+        int x, y;
+        for (y = 0; y < avctx->height; y++) {
+            for (x = 0; x >> 3 < avctx->width; x += 8) {
+                v = AV_RB64(&dst[x]);
+                AV_WB64(&dst[x], v << 16 | v >> 48);
+            }
+            dst += frame->linesize[0];
         }
     }
 
diff --git a/libavcodec/rl2.c b/libavcodec/rl2.c
index 6662979..2d336a6 100644
--- a/libavcodec/rl2.c
+++ b/libavcodec/rl2.c
@@ -134,10 +134,15 @@
     Rl2Context *s = avctx->priv_data;
     int back_size;
     int i;
+    int ret;
 
     s->avctx       = avctx;
     avctx->pix_fmt = AV_PIX_FMT_PAL8;
 
+    ret = ff_set_dimensions(avctx, 320, 200);
+    if (ret < 0)
+        return ret;
+
     /** parse extra data */
     if (!avctx->extradata || avctx->extradata_size < EXTRADATA1_SIZE) {
         av_log(avctx, AV_LOG_ERROR, "invalid extradata size\n");
diff --git a/libavcodec/roqvideodec.c b/libavcodec/roqvideodec.c
index 0ab7d39..a0c293f 100644
--- a/libavcodec/roqvideodec.c
+++ b/libavcodec/roqvideodec.c
@@ -206,7 +206,7 @@
     int copy = !s->current_frame->data[0] && s->last_frame->data[0];
     int ret;
 
-    if ((ret = ff_reget_buffer(avctx, s->current_frame)) < 0)
+    if ((ret = ff_reget_buffer(avctx, s->current_frame, 0)) < 0)
         return ret;
 
     if (copy) {
diff --git a/libavcodec/rpza.c b/libavcodec/rpza.c
index b71ebd1..02bbfe7 100644
--- a/libavcodec/rpza.c
+++ b/libavcodec/rpza.c
@@ -73,13 +73,12 @@
 static int rpza_decode_stream(RpzaContext *s)
 {
     int width = s->avctx->width;
-    int stride = s->frame->linesize[0] / 2;
-    int row_inc = stride - 4;
+    int stride, row_inc, ret;
     int chunk_size;
     uint16_t colorA = 0, colorB;
     uint16_t color4[4];
     uint16_t ta, tb;
-    uint16_t *pixels = (uint16_t *)s->frame->data[0];
+    uint16_t *pixels;
 
     int row_ptr = 0;
     int pixel_ptr = 0;
@@ -106,6 +105,15 @@
     /* Number of 4x4 blocks in frame. */
     total_blocks = ((s->avctx->width + 3) / 4) * ((s->avctx->height + 3) / 4);
 
+    if (total_blocks / 32 > bytestream2_get_bytes_left(&s->gb))
+        return AVERROR_INVALIDDATA;
+
+    if ((ret = ff_reget_buffer(s->avctx, s->frame, 0)) < 0)
+        return ret;
+    pixels = (uint16_t *)s->frame->data[0];
+    stride = s->frame->linesize[0] / 2;
+    row_inc = stride - 4;
+
     /* Process chunk data */
     while (bytestream2_get_bytes_left(&s->gb)) {
         uint8_t opcode = bytestream2_get_byte(&s->gb); /* Get opcode */
@@ -256,9 +264,6 @@
 
     bytestream2_init(&s->gb, avpkt->data, avpkt->size);
 
-    if ((ret = ff_reget_buffer(avctx, s->frame)) < 0)
-        return ret;
-
     ret = rpza_decode_stream(s);
     if (ret < 0)
         return ret;
diff --git a/libavcodec/rscc.c b/libavcodec/rscc.c
index 7921f14..bd05209 100644
--- a/libavcodec/rscc.c
+++ b/libavcodec/rscc.c
@@ -64,6 +64,7 @@
     /* zlib interaction */
     uint8_t *inflated_buf;
     uLongf inflated_size;
+    int valid_pixels;
 } RsccContext;
 
 static av_cold int rscc_init(AVCodecContext *avctx)
@@ -198,6 +199,12 @@
         /* If necessary, uncompress tiles, and hijack the bytestream reader */
         if (packed_tiles_size != tiles_nb * TILE_SIZE) {
             uLongf length = tiles_nb * TILE_SIZE;
+
+            if (bytestream2_get_bytes_left(gbc) < packed_tiles_size) {
+                ret = AVERROR_INVALIDDATA;
+                goto end;
+            }
+
             inflated_tiles = av_malloc(length);
             if (!inflated_tiles) {
                 ret = AVERROR(ENOMEM);
@@ -303,7 +310,7 @@
     }
 
     /* Allocate when needed */
-    ret = ff_reget_buffer(avctx, ctx->reference);
+    ret = ff_reget_buffer(avctx, ctx->reference, 0);
     if (ret < 0)
         goto end;
 
@@ -347,8 +354,11 @@
         }
         memcpy (frame->data[1], ctx->palette, AVPALETTE_SIZE);
     }
-
-    *got_frame = 1;
+    // We only return a picture when enough of it is undamaged, this avoids copying nearly broken frames around
+    if (ctx->valid_pixels < ctx->inflated_size)
+        ctx->valid_pixels += pixel_size;
+    if (ctx->valid_pixels >= ctx->inflated_size * (100 - avctx->discard_damaged_percentage) / 100)
+        *got_frame = 1;
 
     ret = avpkt->size;
 end:
diff --git a/libavcodec/rv10.c b/libavcodec/rv10.c
index 595e217..3b41d30 100644
--- a/libavcodec/rv10.c
+++ b/libavcodec/rv10.c
@@ -388,9 +388,9 @@
             // attempt to keep aspect during typical resolution switches
             if (!old_aspect.num)
                 old_aspect = (AVRational){1, 1};
-            if (2 * new_w * s->height == new_h * s->width)
+            if (2 * (int64_t)new_w * s->height == (int64_t)new_h * s->width)
                 s->avctx->sample_aspect_ratio = av_mul_q(old_aspect, (AVRational){2, 1});
-            if (new_w * s->height == 2 * new_h * s->width)
+            if ((int64_t)new_w * s->height == 2 * (int64_t)new_h * s->width)
                 s->avctx->sample_aspect_ratio = av_mul_q(old_aspect, (AVRational){1, 2});
 
             ret = ff_set_dimensions(s->avctx, new_w, new_h);
@@ -550,7 +550,7 @@
 }
 
 static int rv10_decode_packet(AVCodecContext *avctx, const uint8_t *buf,
-                              int buf_size, int buf_size2)
+                              int buf_size, int buf_size2, int whole_size)
 {
     RVDecContext *rv = avctx->priv_data;
     MpegEncContext *s = &rv->m;
@@ -580,6 +580,9 @@
         return AVERROR_INVALIDDATA;
     }
 
+    if (whole_size < s->mb_width * s->mb_height / 8)
+        return AVERROR_INVALIDDATA;
+
     if ((s->mb_x == 0 && s->mb_y == 0) || !s->current_picture_ptr) {
         // FIXME write parser so we always have complete frames?
         if (s->current_picture_ptr) {
@@ -646,7 +649,7 @@
 
         // Repeat the slice end check from ff_h263_decode_mb with our active
         // bitstream size
-        if (ret != SLICE_ERROR) {
+        if (ret != SLICE_ERROR && active_bits_size >= get_bits_count(&s->gb)) {
             int v = show_bits(&s->gb, 16);
 
             if (get_bits_count(&s->gb) + 16 > active_bits_size)
@@ -754,7 +757,7 @@
             offset + FFMAX(size, size2) > buf_size)
             return AVERROR_INVALIDDATA;
 
-        if ((ret = rv10_decode_packet(avctx, buf + offset, size, size2)) < 0)
+        if ((ret = rv10_decode_packet(avctx, buf + offset, size, size2, buf_size)) < 0)
             return ret;
 
         if (ret > 8 * size)
diff --git a/libavcodec/rv30.c b/libavcodec/rv30.c
index ddaaac6..36cd534 100644
--- a/libavcodec/rv30.c
+++ b/libavcodec/rv30.c
@@ -304,6 +304,6 @@
         AV_PIX_FMT_YUV420P,
         AV_PIX_FMT_NONE
     },
-    .init_thread_copy      = ONLY_IF_THREADS_ENABLED(ff_rv34_decode_init_thread_copy),
     .update_thread_context = ONLY_IF_THREADS_ENABLED(ff_rv34_decode_update_thread_context),
+    .caps_internal         = FF_CODEC_CAP_ALLOCATE_PROGRESS,
 };
diff --git a/libavcodec/rv34.c b/libavcodec/rv34.c
index d171e6e..ec0cd27 100644
--- a/libavcodec/rv34.c
+++ b/libavcodec/rv34.c
@@ -1526,36 +1526,6 @@
     if(!intra_vlcs[0].cbppattern[0].bits)
         rv34_init_tables();
 
-    avctx->internal->allocate_progress = 1;
-
-    return 0;
-}
-
-int ff_rv34_decode_init_thread_copy(AVCodecContext *avctx)
-{
-    int err;
-    RV34DecContext *r = avctx->priv_data;
-
-    r->s.avctx = avctx;
-
-    if (avctx->internal->is_copy) {
-        r->tmp_b_block_base = NULL;
-        r->cbp_chroma       = NULL;
-        r->cbp_luma         = NULL;
-        r->deblock_coefs    = NULL;
-        r->intra_types_hist = NULL;
-        r->mb_type          = NULL;
-
-        ff_mpv_idct_init(&r->s);
-
-        if ((err = ff_mpv_common_init(&r->s)) < 0)
-            return err;
-        if ((err = rv34_decoder_alloc(r)) < 0) {
-            ff_mpv_common_end(&r->s);
-            return err;
-        }
-    }
-
     return 0;
 }
 
diff --git a/libavcodec/rv34.h b/libavcodec/rv34.h
index efff94a..1d55225 100644
--- a/libavcodec/rv34.h
+++ b/libavcodec/rv34.h
@@ -136,7 +136,6 @@
 int ff_rv34_decode_init(AVCodecContext *avctx);
 int ff_rv34_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt);
 int ff_rv34_decode_end(AVCodecContext *avctx);
-int ff_rv34_decode_init_thread_copy(AVCodecContext *avctx);
 int ff_rv34_decode_update_thread_context(AVCodecContext *dst, const AVCodecContext *src);
 
 #endif /* AVCODEC_RV34_H */
diff --git a/libavcodec/rv40.c b/libavcodec/rv40.c
index dfeebda..462024c 100644
--- a/libavcodec/rv40.c
+++ b/libavcodec/rv40.c
@@ -583,6 +583,6 @@
         AV_PIX_FMT_YUV420P,
         AV_PIX_FMT_NONE
     },
-    .init_thread_copy      = ONLY_IF_THREADS_ENABLED(ff_rv34_decode_init_thread_copy),
     .update_thread_context = ONLY_IF_THREADS_ENABLED(ff_rv34_decode_update_thread_context),
+    .caps_internal         = FF_CODEC_CAP_ALLOCATE_PROGRESS,
 };
diff --git a/libavcodec/rv40dsp.c b/libavcodec/rv40dsp.c
index 5579bd9..2ac791d 100644
--- a/libavcodec/rv40dsp.c
+++ b/libavcodec/rv40dsp.c
@@ -385,7 +385,7 @@
 \
     for (j = 0; j < size; j++) {\
         for (i = 0; i < size; i++)\
-            dst[i] = (((w2 * src1[i]) >> 9) + ((w1 * src2[i]) >> 9) + 0x10) >> 5;\
+            dst[i] = ((((unsigned)w2 * src1[i]) >> 9) + (((unsigned)w1 * src2[i]) >> 9) + 0x10) >> 5;\
         src1 += stride;\
         src2 += stride;\
         dst  += stride;\
@@ -397,7 +397,7 @@
 \
     for (j = 0; j < size; j++) {\
         for (i = 0; i < size; i++)\
-            dst[i] = (w2 * src1[i] + w1 * src2[i] + 0x10) >> 5;\
+            dst[i] = ((unsigned)w2 * src1[i] + (unsigned)w1 * src2[i] + 0x10) >> 5;\
         src1 += stride;\
         src2 += stride;\
         dst  += stride;\
diff --git a/libavcodec/sanm.c b/libavcodec/sanm.c
index 811fd21..d0000eb 100644
--- a/libavcodec/sanm.c
+++ b/libavcodec/sanm.c
@@ -491,6 +491,11 @@
 
     ctx->avctx   = avctx;
     ctx->version = !avctx->extradata_size;
+    // early sanity check before allocations to avoid need for deallocation code.
+    if (!ctx->version && avctx->extradata_size < 1026) {
+        av_log(avctx, AV_LOG_ERROR, "Not enough extradata.\n");
+        return AVERROR_INVALIDDATA;
+    }
 
     avctx->pix_fmt = ctx->version ? AV_PIX_FMT_RGB565 : AV_PIX_FMT_PAL8;
 
@@ -506,11 +511,6 @@
     if (!ctx->version) {
         int i;
 
-        if (avctx->extradata_size < 1026) {
-            av_log(avctx, AV_LOG_ERROR, "Not enough extradata.\n");
-            return AVERROR_INVALIDDATA;
-        }
-
         ctx->subversion = AV_RL16(avctx->extradata);
         for (i = 0; i < PALETTE_SIZE; i++)
             ctx->pal[i] = 0xFFU << 24 | AV_RL32(avctx->extradata + 2 + i * 4);
@@ -1358,8 +1358,10 @@
 
 static void fill_frame(uint16_t *pbuf, int buf_size, uint16_t color)
 {
-    while (buf_size--)
+    if (buf_size--) {
         *pbuf++ = color;
+        av_memcpy_backptr((uint8_t*)pbuf, 2, 2*buf_size);
+    }
 }
 
 static int copy_output(SANMVideoContext *ctx, SANMFrameHeader *hdr)
diff --git a/libavcodec/sbcdec.c b/libavcodec/sbcdec.c
index 546b38c..5361ee2 100644
--- a/libavcodec/sbcdec.c
+++ b/libavcodec/sbcdec.c
@@ -30,7 +30,6 @@
  * SBC decoder implementation
  */
 
-#include <stdbool.h>
 #include "avcodec.h"
 #include "internal.h"
 #include "libavutil/intreadwrite.h"
@@ -227,10 +226,10 @@
 
         /* Distribute the new matrix value to the shifted position */
         v[offset[i]] =
-            ( ff_synmatrix4[i][0] * frame->sb_sample[blk][ch][0] +
-              ff_synmatrix4[i][1] * frame->sb_sample[blk][ch][1] +
-              ff_synmatrix4[i][2] * frame->sb_sample[blk][ch][2] +
-              ff_synmatrix4[i][3] * frame->sb_sample[blk][ch][3] ) >> 15;
+            (int)( (unsigned)ff_synmatrix4[i][0] * frame->sb_sample[blk][ch][0] +
+                   (unsigned)ff_synmatrix4[i][1] * frame->sb_sample[blk][ch][1] +
+                   (unsigned)ff_synmatrix4[i][2] * frame->sb_sample[blk][ch][2] +
+                   (unsigned)ff_synmatrix4[i][3] * frame->sb_sample[blk][ch][3] ) >> 15;
     }
 
     /* Compute the samples */
@@ -239,16 +238,16 @@
 
         /* Store in output, Q0 */
         AV_WN16A(&output_frame->data[ch][blk * 8 + i * 2], av_clip_int16(
-            ( v[offset[i] + 0] * ff_sbc_proto_4_40m0[idx + 0] +
-              v[offset[k] + 1] * ff_sbc_proto_4_40m1[idx + 0] +
-              v[offset[i] + 2] * ff_sbc_proto_4_40m0[idx + 1] +
-              v[offset[k] + 3] * ff_sbc_proto_4_40m1[idx + 1] +
-              v[offset[i] + 4] * ff_sbc_proto_4_40m0[idx + 2] +
-              v[offset[k] + 5] * ff_sbc_proto_4_40m1[idx + 2] +
-              v[offset[i] + 6] * ff_sbc_proto_4_40m0[idx + 3] +
-              v[offset[k] + 7] * ff_sbc_proto_4_40m1[idx + 3] +
-              v[offset[i] + 8] * ff_sbc_proto_4_40m0[idx + 4] +
-              v[offset[k] + 9] * ff_sbc_proto_4_40m1[idx + 4] ) >> 15));
+         (int)( (unsigned)v[offset[i] + 0] * ff_sbc_proto_4_40m0[idx + 0] +
+                (unsigned)v[offset[k] + 1] * ff_sbc_proto_4_40m1[idx + 0] +
+                (unsigned)v[offset[i] + 2] * ff_sbc_proto_4_40m0[idx + 1] +
+                (unsigned)v[offset[k] + 3] * ff_sbc_proto_4_40m1[idx + 1] +
+                (unsigned)v[offset[i] + 4] * ff_sbc_proto_4_40m0[idx + 2] +
+                (unsigned)v[offset[k] + 5] * ff_sbc_proto_4_40m1[idx + 2] +
+                (unsigned)v[offset[i] + 6] * ff_sbc_proto_4_40m0[idx + 3] +
+                (unsigned)v[offset[k] + 7] * ff_sbc_proto_4_40m1[idx + 3] +
+                (unsigned)v[offset[i] + 8] * ff_sbc_proto_4_40m0[idx + 4] +
+                (unsigned)v[offset[k] + 9] * ff_sbc_proto_4_40m1[idx + 4] ) >> 15));
     }
 }
 
@@ -270,14 +269,14 @@
 
         /* Distribute the new matrix value to the shifted position */
         v[offset[i]] =
-            ( ff_synmatrix8[i][0] * frame->sb_sample[blk][ch][0] +
-              ff_synmatrix8[i][1] * frame->sb_sample[blk][ch][1] +
-              ff_synmatrix8[i][2] * frame->sb_sample[blk][ch][2] +
-              ff_synmatrix8[i][3] * frame->sb_sample[blk][ch][3] +
-              ff_synmatrix8[i][4] * frame->sb_sample[blk][ch][4] +
-              ff_synmatrix8[i][5] * frame->sb_sample[blk][ch][5] +
-              ff_synmatrix8[i][6] * frame->sb_sample[blk][ch][6] +
-              ff_synmatrix8[i][7] * frame->sb_sample[blk][ch][7] ) >> 15;
+             (int)( (unsigned)ff_synmatrix8[i][0] * frame->sb_sample[blk][ch][0] +
+                    (unsigned)ff_synmatrix8[i][1] * frame->sb_sample[blk][ch][1] +
+                    (unsigned)ff_synmatrix8[i][2] * frame->sb_sample[blk][ch][2] +
+                    (unsigned)ff_synmatrix8[i][3] * frame->sb_sample[blk][ch][3] +
+                    (unsigned)ff_synmatrix8[i][4] * frame->sb_sample[blk][ch][4] +
+                    (unsigned)ff_synmatrix8[i][5] * frame->sb_sample[blk][ch][5] +
+                    (unsigned)ff_synmatrix8[i][6] * frame->sb_sample[blk][ch][6] +
+                    (unsigned)ff_synmatrix8[i][7] * frame->sb_sample[blk][ch][7] ) >> 15;
     }
 
     /* Compute the samples */
@@ -286,16 +285,16 @@
 
         /* Store in output, Q0 */
         AV_WN16A(&output_frame->data[ch][blk * 16 + i * 2], av_clip_int16(
-            ( v[offset[i] + 0] * ff_sbc_proto_8_80m0[idx + 0] +
-              v[offset[k] + 1] * ff_sbc_proto_8_80m1[idx + 0] +
-              v[offset[i] + 2] * ff_sbc_proto_8_80m0[idx + 1] +
-              v[offset[k] + 3] * ff_sbc_proto_8_80m1[idx + 1] +
-              v[offset[i] + 4] * ff_sbc_proto_8_80m0[idx + 2] +
-              v[offset[k] + 5] * ff_sbc_proto_8_80m1[idx + 2] +
-              v[offset[i] + 6] * ff_sbc_proto_8_80m0[idx + 3] +
-              v[offset[k] + 7] * ff_sbc_proto_8_80m1[idx + 3] +
-              v[offset[i] + 8] * ff_sbc_proto_8_80m0[idx + 4] +
-              v[offset[k] + 9] * ff_sbc_proto_8_80m1[idx + 4] ) >> 15));
+         (int)( (unsigned)v[offset[i] + 0] * ff_sbc_proto_8_80m0[idx + 0] +
+                (unsigned)v[offset[k] + 1] * ff_sbc_proto_8_80m1[idx + 0] +
+                (unsigned)v[offset[i] + 2] * ff_sbc_proto_8_80m0[idx + 1] +
+                (unsigned)v[offset[k] + 3] * ff_sbc_proto_8_80m1[idx + 1] +
+                (unsigned)v[offset[i] + 4] * ff_sbc_proto_8_80m0[idx + 2] +
+                (unsigned)v[offset[k] + 5] * ff_sbc_proto_8_80m1[idx + 2] +
+                (unsigned)v[offset[i] + 6] * ff_sbc_proto_8_80m0[idx + 3] +
+                (unsigned)v[offset[k] + 7] * ff_sbc_proto_8_80m1[idx + 3] +
+                (unsigned)v[offset[i] + 8] * ff_sbc_proto_8_80m0[idx + 4] +
+                (unsigned)v[offset[k] + 9] * ff_sbc_proto_8_80m1[idx + 4] ) >> 15));
     }
 }
 
@@ -324,6 +323,8 @@
     SBCDecContext *sbc = avctx->priv_data;
     int i, ch;
 
+    avctx->sample_fmt = AV_SAMPLE_FMT_S16P;
+
     sbc->frame.crc_ctx = av_crc_get_table(AV_CRC_8_EBU);
 
     memset(sbc->dsp.V, 0, sizeof(sbc->dsp.V));
@@ -348,8 +349,8 @@
     if (frame_length <= 0)
         return frame_length;
 
-    frame->channels = sbc->frame.channels;
-    frame->format = AV_SAMPLE_FMT_S16P;
+    avctx->channels = sbc->frame.channels;
+
     frame->nb_samples = sbc->frame.blocks * sbc->frame.subbands;
     if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
         return ret;
diff --git a/libavcodec/sbcenc.c b/libavcodec/sbcenc.c
index e2929e2..631acf7 100644
--- a/libavcodec/sbcenc.c
+++ b/libavcodec/sbcenc.c
@@ -30,7 +30,6 @@
  * SBC encoder implementation
  */
 
-#include <stdbool.h>
 #include "libavutil/opt.h"
 #include "avcodec.h"
 #include "internal.h"
@@ -95,7 +94,7 @@
  * Returns the length of the packed frame.
  */
 static size_t sbc_pack_frame(AVPacket *avpkt, struct sbc_frame *frame,
-                             int joint, bool msbc)
+                             int joint, int msbc)
 {
     PutBitContext pb;
 
diff --git a/libavcodec/sbrdsp_fixed.c b/libavcodec/sbrdsp_fixed.c
index 57d98da..91fa664 100644
--- a/libavcodec/sbrdsp_fixed.c
+++ b/libavcodec/sbrdsp_fixed.c
@@ -34,32 +34,36 @@
 static SoftFloat sbr_sum_square_c(int (*x)[2], int n)
 {
     SoftFloat ret;
-    uint64_t accu, round;
+    uint64_t accu = 0, round;
     uint64_t accu0 = 0, accu1 = 0, accu2 = 0, accu3 = 0;
     int i, nz, nz0;
     unsigned u;
 
+    nz = 0;
     for (i = 0; i < n; i += 2) {
-        // Larger values are inavlid and could cause overflows of accu.
-        av_assert2(FFABS(x[i + 0][0]) >> 30 == 0);
         accu0 += (int64_t)x[i + 0][0] * x[i + 0][0];
-        av_assert2(FFABS(x[i + 0][1]) >> 30 == 0);
         accu1 += (int64_t)x[i + 0][1] * x[i + 0][1];
-        av_assert2(FFABS(x[i + 1][0]) >> 30 == 0);
         accu2 += (int64_t)x[i + 1][0] * x[i + 1][0];
-        av_assert2(FFABS(x[i + 1][1]) >> 30 == 0);
         accu3 += (int64_t)x[i + 1][1] * x[i + 1][1];
+        if ((accu0|accu1|accu2|accu3) > UINT64_MAX - INT32_MIN*(int64_t)INT32_MIN || i+2>=n) {
+            accu0 >>= nz;
+            accu1 >>= nz;
+            accu2 >>= nz;
+            accu3 >>= nz;
+            while ((accu0|accu1|accu2|accu3) > (UINT64_MAX - accu) >> 2) {
+                accu0 >>= 1;
+                accu1 >>= 1;
+                accu2 >>= 1;
+                accu3 >>= 1;
+                accu  >>= 1;
+                nz ++;
+            }
+            accu += accu0 + accu1 + accu2 + accu3;
+            accu0 = accu1 = accu2 = accu3 = 0;
+        }
     }
 
-    nz0 = 15;
-    while ((accu0|accu1|accu2|accu3) >> 62) {
-        accu0 >>= 1;
-        accu1 >>= 1;
-        accu2 >>= 1;
-        accu3 >>= 1;
-        nz0 --;
-    }
-    accu = accu0 + accu1 + accu2 + accu3;
+    nz0 = 15 - nz;
 
     u = accu >> 32;
     if (u) {
diff --git a/libavcodec/scpr.c b/libavcodec/scpr.c
index e41fbbe..2a0ebce 100644
--- a/libavcodec/scpr.c
+++ b/libavcodec/scpr.c
@@ -27,44 +27,13 @@
 #include "avcodec.h"
 #include "bytestream.h"
 #include "internal.h"
+#include "scpr.h"
+#include "scpr3.h"
 
 #define TOP  0x01000000
 #define BOT    0x010000
 
-typedef struct RangeCoder {
-    unsigned   code;
-    unsigned   range;
-    unsigned   code1;
-} RangeCoder;
-
-typedef struct PixelModel {
-    unsigned    freq[256];
-    unsigned    lookup[16];
-    unsigned    total_freq;
-} PixelModel;
-
-typedef struct SCPRContext {
-    AVFrame        *last_frame;
-    AVFrame        *current_frame;
-    GetByteContext  gb;
-    RangeCoder      rc;
-    PixelModel      pixel_model[3][4096];
-    unsigned        op_model[6][7];
-    unsigned        run_model[6][257];
-    unsigned        range_model[257];
-    unsigned        count_model[257];
-    unsigned        fill_model[6];
-    unsigned        sxy_model[4][17];
-    unsigned        mv_model[2][513];
-    unsigned        nbx, nby;
-    unsigned        nbcount;
-    unsigned       *blocks;
-    unsigned        cbits;
-    int             cxshift;
-
-    int           (*get_freq)(RangeCoder *rc, unsigned total_freq, unsigned *freq);
-    int           (*decode)(GetByteContext *gb, RangeCoder *rc, unsigned cumFreq, unsigned freq, unsigned total_freq);
-} SCPRContext;
+#include "scpr3.c"
 
 static void init_rangecoder(RangeCoder *rc, GetByteContext *gb)
 {
@@ -90,14 +59,14 @@
     }
 
     for (j = 0; j < 6; j++) {
-        unsigned *p = s->run_model[j];
+        uint32_t *p = s->run_model[j];
         for (i = 0; i < 256; i++)
             p[i] = 1;
         p[256] = 256;
     }
 
     for (j = 0; j < 6; j++) {
-        unsigned *op = s->op_model[j];
+        uint32_t *op = s->op_model[j];
         for (i = 0; i < 6; i++)
             op[i] = 1;
         op[6] = 6;
@@ -130,13 +99,13 @@
     s->mv_model[1][512] = 512;
 }
 
-static int decode(GetByteContext *gb, RangeCoder *rc, unsigned cumFreq, unsigned freq, unsigned total_freq)
+static int decode(GetByteContext *gb, RangeCoder *rc, uint32_t cumFreq, uint32_t freq, uint32_t total_freq)
 {
     rc->code -= cumFreq * rc->range;
     rc->range *= freq;
 
     while (rc->range < TOP && bytestream2_get_bytes_left(gb) > 0) {
-        unsigned byte = bytestream2_get_byteu(gb);
+        uint32_t byte = bytestream2_get_byteu(gb);
         rc->code = (rc->code << 8) | byte;
         rc->range <<= 8;
     }
@@ -144,7 +113,7 @@
     return 0;
 }
 
-static int get_freq(RangeCoder *rc, unsigned total_freq, unsigned *freq)
+static int get_freq(RangeCoder *rc, uint32_t total_freq, uint32_t *freq)
 {
     if (total_freq == 0)
         return AVERROR_INVALIDDATA;
@@ -159,9 +128,9 @@
     return 0;
 }
 
-static int decode0(GetByteContext *gb, RangeCoder *rc, unsigned cumFreq, unsigned freq, unsigned total_freq)
+static int decode0(GetByteContext *gb, RangeCoder *rc, uint32_t cumFreq, uint32_t freq, uint32_t total_freq)
 {
-    unsigned t;
+    uint32_t t;
 
     if (total_freq == 0)
         return AVERROR_INVALIDDATA;
@@ -172,7 +141,7 @@
     rc->range = rc->range * (uint64_t)(freq + cumFreq) / total_freq - (t + 1);
 
     while (rc->range < TOP && bytestream2_get_bytes_left(gb) > 0) {
-        unsigned byte = bytestream2_get_byteu(gb);
+        uint32_t byte = bytestream2_get_byteu(gb);
         rc->code = (rc->code << 8) | byte;
         rc->code1 <<= 8;
         rc->range <<= 8;
@@ -181,7 +150,7 @@
     return 0;
 }
 
-static int get_freq0(RangeCoder *rc, unsigned total_freq, unsigned *freq)
+static int get_freq0(RangeCoder *rc, uint32_t total_freq, uint32_t *freq)
 {
     if (rc->range == 0)
         return AVERROR_INVALIDDATA;
@@ -191,13 +160,13 @@
     return 0;
 }
 
-static int decode_value(SCPRContext *s, unsigned *cnt, unsigned maxc, unsigned step, unsigned *rval)
+static int decode_value(SCPRContext *s, uint32_t *cnt, uint32_t maxc, uint32_t step, uint32_t *rval)
 {
     GetByteContext *gb = &s->gb;
     RangeCoder *rc = &s->rc;
-    unsigned totfr = cnt[maxc];
-    unsigned value;
-    unsigned c = 0, cumfr = 0, cnt_c = 0;
+    uint32_t totfr = cnt[maxc];
+    uint32_t value;
+    uint32_t c = 0, cumfr = 0, cnt_c = 0;
     int i, ret;
 
     if ((ret = s->get_freq(rc, totfr, &value)) < 0)
@@ -223,7 +192,7 @@
     if (totfr > BOT) {
         totfr = 0;
         for (i = 0; i < maxc; i++) {
-            unsigned nc = (cnt[i] >> 1) + 1;
+            uint32_t nc = (cnt[i] >> 1) + 1;
             cnt[i] = nc;
             totfr += nc;
         }
@@ -235,12 +204,12 @@
     return 0;
 }
 
-static int decode_unit(SCPRContext *s, PixelModel *pixel, unsigned step, unsigned *rval)
+static int decode_unit(SCPRContext *s, PixelModel *pixel, uint32_t step, uint32_t *rval)
 {
     GetByteContext *gb = &s->gb;
     RangeCoder *rc = &s->rc;
-    unsigned totfr = pixel->total_freq;
-    unsigned value, x = 0, cumfr = 0, cnt_x = 0;
+    uint32_t totfr = pixel->total_freq;
+    uint32_t value, x = 0, cumfr = 0, cnt_x = 0;
     int i, j, ret, c, cnt_c;
 
     if ((ret = s->get_freq(rc, totfr, &value)) < 0)
@@ -278,13 +247,13 @@
     if (totfr > BOT) {
         totfr = 0;
         for (i = 0; i < 256; i++) {
-            unsigned nc = (pixel->freq[i] >> 1) + 1;
+            uint32_t nc = (pixel->freq[i] >> 1) + 1;
             pixel->freq[i] = nc;
             totfr += nc;
         }
         for (i = 0; i < 16; i++) {
-            unsigned sum = 0;
-            unsigned i16_17 = i << 4;
+            uint32_t sum = 0;
+            uint32_t i16_17 = i << 4;
             for (j = 0; j < 16; j++)
                 sum += pixel->freq[i16_17 + j];
             pixel->lookup[i] = sum;
@@ -297,7 +266,7 @@
     return 0;
 }
 
-static int decode_units(SCPRContext *s, unsigned *r, unsigned *g, unsigned *b,
+static int decode_units(SCPRContext *s, uint32_t *r, uint32_t *g, uint32_t *b,
                         int *cx, int *cx1)
 {
     const int cxshift = s->cxshift;
@@ -329,10 +298,10 @@
 {
     SCPRContext *s = avctx->priv_data;
     GetByteContext *gb = &s->gb;
-    int cx = 0, cx1 = 0, k = 0, clr = 0;
-    int run, off, y = 0, x = 0, z, ret;
-    unsigned r, g, b, backstep = linesize - avctx->width;
-    unsigned lx, ly, ptype;
+    int cx = 0, cx1 = 0, k = 0;
+    int run, off, y = 0, x = 0, ret;
+    uint32_t clr = 0, r, g, b, backstep = linesize - avctx->width;
+    uint32_t lx, ly, ptype;
 
     reinit_tables(s);
     bytestream2_skip(gb, 2);
@@ -387,120 +356,11 @@
         if (run <= 0)
             return AVERROR_INVALIDDATA;
 
-        switch (ptype) {
-        case 0:
-            while (run-- > 0) {
-                if (y >= avctx->height)
-                    return AVERROR_INVALIDDATA;
-
-                dst[y * linesize + x] = clr;
-                lx = x;
-                ly = y;
-                x++;
-                if (x >= avctx->width) {
-                    x = 0;
-                    y++;
-                }
-            }
-            break;
-        case 1:
-            while (run-- > 0) {
-                if (y >= avctx->height)
-                    return AVERROR_INVALIDDATA;
-
-                dst[y * linesize + x] = dst[ly * linesize + lx];
-                lx = x;
-                ly = y;
-                x++;
-                if (x >= avctx->width) {
-                    x = 0;
-                    y++;
-                }
-            }
-            clr = dst[ly * linesize + lx];
-            break;
-        case 2:
-            while (run-- > 0) {
-                if (y < 1 || y >= avctx->height)
-                    return AVERROR_INVALIDDATA;
-
-                clr = dst[y * linesize + x + off + 1];
-                dst[y * linesize + x] = clr;
-                lx = x;
-                ly = y;
-                x++;
-                if (x >= avctx->width) {
-                    x = 0;
-                    y++;
-                }
-            }
-            break;
-        case 4:
-            while (run-- > 0) {
-                uint8_t *odst = (uint8_t *)dst;
-
-                if (y < 1 || y >= avctx->height ||
-                    (y == 1 && x == 0))
-                    return AVERROR_INVALIDDATA;
-
-                if (x == 0) {
-                    z = backstep;
-                } else {
-                    z = 0;
-                }
-
-                r = odst[(ly * linesize + lx) * 4] +
-                    odst[((y * linesize + x) + off) * 4 + 4] -
-                    odst[((y * linesize + x) + off - z) * 4];
-                g = odst[(ly * linesize + lx) * 4 + 1] +
-                    odst[((y * linesize + x) + off) * 4 + 5] -
-                    odst[((y * linesize + x) + off - z) * 4 + 1];
-                b = odst[(ly * linesize + lx) * 4 + 2] +
-                    odst[((y * linesize + x) + off) * 4 + 6] -
-                    odst[((y * linesize + x) + off - z) * 4 + 2];
-                clr = ((b & 0xFF) << 16) + ((g & 0xFF) << 8) + (r & 0xFF);
-                dst[y * linesize + x] = clr;
-                lx = x;
-                ly = y;
-                x++;
-                if (x >= avctx->width) {
-                    x = 0;
-                    y++;
-                }
-            }
-            break;
-        case 5:
-            while (run-- > 0) {
-                if (y < 1 || y >= avctx->height ||
-                    (y == 1 && x == 0))
-                    return AVERROR_INVALIDDATA;
-
-                if (x == 0) {
-                    z = backstep;
-                } else {
-                    z = 0;
-                }
-
-                clr = dst[y * linesize + x + off - z];
-                dst[y * linesize + x] = clr;
-                lx = x;
-                ly = y;
-                x++;
-                if (x >= avctx->width) {
-                    x = 0;
-                    y++;
-                }
-            }
-            break;
-        }
-
-        if (avctx->bits_per_coded_sample == 16) {
-            cx1 = (clr & 0x3F00) >> 2;
-            cx = (clr & 0x3FFFFF) >> 16;
-        } else {
-            cx1 = (clr & 0xFC00) >> 4;
-            cx = (clr & 0xFFFFFF) >> 18;
-        }
+        ret = decode_run_i(avctx, ptype, run, &x, &y, clr,
+                           dst, linesize, &lx, &ly,
+                           backstep, off, &cx, &cx1);
+        if (ret < 0)
+            return ret;
     }
 
     return 0;
@@ -512,7 +372,7 @@
 {
     SCPRContext *s = avctx->priv_data;
     GetByteContext *gb = &s->gb;
-    int ret, temp, min, max, x, y, cx = 0, cx1 = 0;
+    int ret, temp = 0, min, max, x, y, cx = 0, cx1 = 0;
     int backstep = linesize - avctx->width;
 
     if (bytestream2_get_byte(gb) == 0)
@@ -522,8 +382,11 @@
 
     ret  = decode_value(s, s->range_model, 256, 1, &min);
     ret |= decode_value(s, s->range_model, 256, 1, &temp);
+    if (ret < 0)
+        return ret;
+
     min += temp << 8;
-    ret |= decode_value(s, s->range_model, 256, 1, &max);
+    ret  = decode_value(s, s->range_model, 256, 1, &max);
     ret |= decode_value(s, s->range_model, 256, 1, &temp);
     if (ret < 0)
         return ret;
@@ -549,6 +412,10 @@
         }
     }
 
+    ret = av_frame_copy(s->current_frame, s->last_frame);
+    if (ret < 0)
+        return ret;
+
     for (y = 0; y < s->nby; y++) {
         for (x = 0; x < s->nbx; x++) {
             int sy1 = 0, sy2 = 16, sx1 = 0, sx2 = 16;
@@ -589,8 +456,8 @@
                     }
                 }
             } else {
-                int run, z, bx = x * 16 + sx1, by = y * 16 + sy1;
-                unsigned r, g, b, clr, ptype = 0;
+                int run, bx = x * 16 + sx1, by = y * 16 + sy1;
+                uint32_t r, g, b, clr, ptype = 0;
 
                 for (; by < y * 16 + sy2 && by < avctx->height;) {
                     ret = decode_value(s, s->op_model[ptype], 6, 1000, &ptype);
@@ -611,134 +478,11 @@
                     if (run <= 0)
                         return AVERROR_INVALIDDATA;
 
-                    switch (ptype) {
-                    case 0:
-                        while (run-- > 0) {
-                            if (by >= avctx->height)
-                                return AVERROR_INVALIDDATA;
-
-                            dst[by * linesize + bx] = clr;
-                            bx++;
-                            if (bx >= x * 16 + sx2 || bx >= avctx->width) {
-                                bx = x * 16 + sx1;
-                                by++;
-                            }
-                        }
-                        break;
-                    case 1:
-                        while (run-- > 0) {
-                            if (bx == 0) {
-                                if (by < 1)
-                                    return AVERROR_INVALIDDATA;
-                                z = backstep;
-                            } else {
-                                z = 0;
-                            }
-
-                            if (by >= avctx->height)
-                                return AVERROR_INVALIDDATA;
-
-                            clr = dst[by * linesize + bx - 1 - z];
-                            dst[by * linesize + bx] = clr;
-                            bx++;
-                            if (bx >= x * 16 + sx2 || bx >= avctx->width) {
-                                bx = x * 16 + sx1;
-                                by++;
-                            }
-                        }
-                        break;
-                    case 2:
-                        while (run-- > 0) {
-                            if (by < 1 || by >= avctx->height)
-                                return AVERROR_INVALIDDATA;
-
-                            clr = dst[(by - 1) * linesize + bx];
-                            dst[by * linesize + bx] = clr;
-                            bx++;
-                            if (bx >= x * 16 + sx2 || bx >= avctx->width) {
-                                bx = x * 16 + sx1;
-                                by++;
-                            }
-                        }
-                        break;
-                    case 3:
-                        while (run-- > 0) {
-                            if (by >= avctx->height)
-                                return AVERROR_INVALIDDATA;
-
-                            clr = prev[by * plinesize + bx];
-                            dst[by * linesize + bx] = clr;
-                            bx++;
-                            if (bx >= x * 16 + sx2 || bx >= avctx->width) {
-                                bx = x * 16 + sx1;
-                                by++;
-                            }
-                        }
-                        break;
-                    case 4:
-                        while (run-- > 0) {
-                            uint8_t *odst = (uint8_t *)dst;
-
-                            if (by < 1 || by >= avctx->height)
-                                return AVERROR_INVALIDDATA;
-
-                            if (bx == 0) {
-                                if (by < 2)
-                                    return AVERROR_INVALIDDATA;
-                                z = backstep;
-                            } else {
-                                z = 0;
-                            }
-
-                            r = odst[((by - 1) * linesize + bx) * 4] +
-                                odst[(by * linesize + bx - 1 - z) * 4] -
-                                odst[((by - 1) * linesize + bx - 1 - z) * 4];
-                            g = odst[((by - 1) * linesize + bx) * 4 + 1] +
-                                odst[(by * linesize + bx - 1 - z) * 4 + 1] -
-                                odst[((by - 1) * linesize + bx - 1 - z) * 4 + 1];
-                            b = odst[((by - 1) * linesize + bx) * 4 + 2] +
-                                odst[(by * linesize + bx - 1 - z) * 4 + 2] -
-                                odst[((by - 1) * linesize + bx - 1 - z) * 4 + 2];
-                            clr = ((b & 0xFF) << 16) + ((g & 0xFF) << 8) + (r & 0xFF);
-                            dst[by * linesize + bx] = clr;
-                            bx++;
-                            if (bx >= x * 16 + sx2 || bx >= avctx->width) {
-                                bx = x * 16 + sx1;
-                                by++;
-                            }
-                        }
-                        break;
-                    case 5:
-                        while (run-- > 0) {
-                            if (by < 1 || by >= avctx->height)
-                                return AVERROR_INVALIDDATA;
-
-                            if (bx == 0) {
-                                if (by < 2)
-                                    return AVERROR_INVALIDDATA;
-                                z = backstep;
-                            } else {
-                                z = 0;
-                            }
-
-                            clr = dst[(by - 1) * linesize + bx - 1 - z];
-                            dst[by * linesize + bx] = clr;
-                            bx++;
-                            if (bx >= x * 16 + sx2 || bx >= avctx->width) {
-                                bx = x * 16 + sx1;
-                                by++;
-                            }
-                        }
-                        break;
-                    }
-
-                    if (avctx->bits_per_coded_sample == 16) {
-                        cx1 = (clr & 0x3F00) >> 2;
-                        cx = (clr & 0x3FFFFF) >> 16;
-                    } else {
-                        cx1 = (clr & 0xFC00) >> 4;
-                        cx = (clr & 0xFFFFFF) >> 18;
-                    }
+                    ret = decode_run_p(avctx, ptype, run, x, y, clr,
+                                       dst, prev, linesize, plinesize, &bx, &by,
+                                       backstep, sx1, sx2, &cx, &cx1);
+                    if (ret < 0)
+                        return ret;
                 }
             }
         }
@@ -760,7 +504,7 @@
             return ret;
     }
 
-    if ((ret = ff_reget_buffer(avctx, s->current_frame)) < 0)
+    if ((ret = ff_reget_buffer(avctx, s->current_frame, 0)) < 0)
         return ret;
 
     bytestream2_init(gb, avpkt->data, avpkt->size);
@@ -768,20 +512,30 @@
     type = bytestream2_peek_byte(gb);
 
     if (type == 2) {
+        s->version = 1;
         s->get_freq = get_freq0;
         s->decode = decode0;
         frame->key_frame = 1;
         ret = decompress_i(avctx, (uint32_t *)s->current_frame->data[0],
                            s->current_frame->linesize[0] / 4);
     } else if (type == 18) {
+        s->version = 2;
         s->get_freq = get_freq;
         s->decode = decode;
         frame->key_frame = 1;
         ret = decompress_i(avctx, (uint32_t *)s->current_frame->data[0],
                            s->current_frame->linesize[0] / 4);
-    } else if (type == 17) {
+    } else if (type == 34) {
+        frame->key_frame = 1;
+        s->version = 3;
+        ret = decompress_i3(avctx, (uint32_t *)s->current_frame->data[0],
+                            s->current_frame->linesize[0] / 4);
+    } else if (type == 17 || type == 33) {
         uint32_t clr, *dst = (uint32_t *)s->current_frame->data[0];
-        int x, y;
+        int y;
+
+        if (bytestream2_get_bytes_left(gb) < 3)
+            return AVERROR_INVALIDDATA;
 
         frame->key_frame = 1;
         bytestream2_skip(gb, 1);
@@ -797,22 +551,23 @@
             clr = bytestream2_get_le24(gb);
         }
         for (y = 0; y < avctx->height; y++) {
-            for (x = 0; x < avctx->width; x++) {
-                dst[x] = clr;
-            }
+            dst[0] = clr;
+            av_memcpy_backptr((uint8_t*)(dst+1), 4, 4*avctx->width - 4);
             dst += s->current_frame->linesize[0] / 4;
         }
     } else if (type == 0 || type == 1) {
         frame->key_frame = 0;
 
-        ret = av_frame_copy(s->current_frame, s->last_frame);
-        if (ret < 0)
-            return ret;
-
-        ret = decompress_p(avctx, (uint32_t *)s->current_frame->data[0],
-                           s->current_frame->linesize[0] / 4,
-                           (uint32_t *)s->last_frame->data[0],
-                           s->last_frame->linesize[0] / 4);
+        if (s->version == 1 || s->version == 2)
+            ret = decompress_p(avctx, (uint32_t *)s->current_frame->data[0],
+                               s->current_frame->linesize[0] / 4,
+                               (uint32_t *)s->last_frame->data[0],
+                               s->last_frame->linesize[0] / 4);
+        else
+            ret = decompress_p3(avctx, (uint32_t *)s->current_frame->data[0],
+                                s->current_frame->linesize[0] / 4,
+                                (uint32_t *)s->last_frame->data[0],
+                                s->last_frame->linesize[0] / 4);
         if (ret == 1)
             return avpkt->size;
     } else {
@@ -822,6 +577,9 @@
     if (ret < 0)
         return ret;
 
+    if (bytestream2_get_bytes_left(gb) > 5)
+        return AVERROR_INVALIDDATA;
+
     if (avctx->bits_per_coded_sample != 16) {
         ret = av_frame_ref(data, s->current_frame);
         if (ret < 0)
diff --git a/libavcodec/scpr.h b/libavcodec/scpr.h
new file mode 100644
index 0000000..15cb87c
--- /dev/null
+++ b/libavcodec/scpr.h
@@ -0,0 +1,365 @@
+/*
+ * ScreenPressor decoder
+ *
+ * Copyright (c) 2017 Paul B Mahol
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVCODEC_SCPR_H
+#define AVCODEC_SCPR_H
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "avcodec.h"
+#include "bytestream.h"
+#include "internal.h"
+#include "scpr3.h"
+
+typedef struct RangeCoder {
+    uint32_t   code;
+    uint32_t   range;
+    uint32_t   code1;
+} RangeCoder;
+
+typedef struct PixelModel {
+    uint32_t    freq[256];
+    uint32_t    lookup[16];
+    uint32_t    total_freq;
+} PixelModel;
+
+typedef struct SCPRContext {
+    int             version;
+    AVFrame        *last_frame;
+    AVFrame        *current_frame;
+    GetByteContext  gb;
+    RangeCoder      rc;
+    PixelModel      pixel_model[3][4096];
+    uint32_t        op_model[6][7];
+    uint32_t        run_model[6][257];
+    uint32_t        range_model[257];
+    uint32_t        count_model[257];
+    uint32_t        fill_model[6];
+    uint32_t        sxy_model[4][17];
+    uint32_t        mv_model[2][513];
+    uint32_t        nbx, nby;
+    uint32_t        nbcount;
+    uint32_t       *blocks;
+    uint32_t        cbits;
+    int             cxshift;
+
+    PixelModel3     pixel_model3[3][4096];
+    RunModel3       run_model3[6];
+    RunModel3       range_model3;
+    RunModel3       count_model3;
+    FillModel3      fill_model3;
+    SxyModel3       sxy_model3[4];
+    MVModel3        mv_model3[2];
+    OpModel3        op_model3[6];
+
+    int           (*get_freq)(RangeCoder *rc, uint32_t total_freq, uint32_t *freq);
+    int           (*decode)(GetByteContext *gb, RangeCoder *rc, uint32_t cumFreq, uint32_t freq, uint32_t total_freq);
+} SCPRContext;
+
+static int decode_run_i(AVCodecContext *avctx, uint32_t ptype, int run,
+                        int *px, int *py, uint32_t clr, uint32_t *dst,
+                        int linesize, uint32_t *plx, uint32_t *ply,
+                        uint32_t backstep, int off, int *cx, int *cx1)
+{
+    uint32_t r, g, b;
+    int z;
+    int x = *px,
+        y = *py;
+    uint32_t lx = *plx,
+             ly = *ply;
+
+    if (y >= avctx->height)
+        return AVERROR_INVALIDDATA;
+
+    switch (ptype) {
+    case 0:
+        while (run-- > 0) {
+            dst[y * linesize + x] = clr;
+            lx = x;
+            ly = y;
+            (x)++;
+            if (x >= avctx->width) {
+                x = 0;
+                (y)++;
+                if (y >= avctx->height && run)
+                    return AVERROR_INVALIDDATA;
+            }
+        }
+        break;
+    case 1:
+        while (run-- > 0) {
+            dst[y * linesize + x] = dst[ly * linesize + lx];
+            lx = x;
+            ly = y;
+            (x)++;
+            if (x >= avctx->width) {
+                x = 0;
+                (y)++;
+                if (y >= avctx->height && run)
+                    return AVERROR_INVALIDDATA;
+            }
+        }
+        clr = dst[ly * linesize + lx];
+        break;
+    case 2:
+        if (y < 1)
+            return AVERROR_INVALIDDATA;
+
+        while (run-- > 0) {
+            clr = dst[y * linesize + x + off + 1];
+            dst[y * linesize + x] = clr;
+            lx = x;
+            ly = y;
+            (x)++;
+            if (x >= avctx->width) {
+                x = 0;
+                (y)++;
+                if (y >= avctx->height && run)
+                    return AVERROR_INVALIDDATA;
+            }
+        }
+        break;
+    case 4:
+        if (y < 1 || (y == 1 && x == 0))
+            return AVERROR_INVALIDDATA;
+
+        while (run-- > 0) {
+            uint8_t *odst = (uint8_t *)dst;
+            int off1 = (ly * linesize + lx) * 4;
+            int off2 = ((y * linesize + x) + off) * 4;
+
+            if (x == 0) {
+                z = backstep * 4;
+            } else {
+                z = 0;
+            }
+
+            r = odst[off1] +
+                odst[off2 + 4] -
+                odst[off2 - z ];
+            g = odst[off1 + 1] +
+                odst[off2 + 5] -
+                odst[off2 - z  + 1];
+            b = odst[off1 + 2] +
+                odst[off2 + 6] -
+                odst[off2 - z  + 2];
+            clr = ((b & 0xFF) << 16) + ((g & 0xFF) << 8) + (r & 0xFF);
+            dst[y * linesize + x] = clr;
+            lx = x;
+            ly = y;
+            (x)++;
+            if (x >= avctx->width) {
+                x = 0;
+                (y)++;
+                if (y >= avctx->height && run)
+                    return AVERROR_INVALIDDATA;
+            }
+        }
+        break;
+    case 5:
+        if (y < 1 || (y == 1 && x == 0))
+            return AVERROR_INVALIDDATA;
+
+        while (run-- > 0) {
+            if (x == 0) {
+                z = backstep;
+            } else {
+                z = 0;
+            }
+
+            clr = dst[y * linesize + x + off - z];
+            dst[y * linesize + x] = clr;
+            lx = x;
+            ly = y;
+            (x)++;
+            if (x >= avctx->width) {
+                x = 0;
+                (y)++;
+                if (y >= avctx->height && run)
+                    return AVERROR_INVALIDDATA;
+            }
+        }
+        break;
+    }
+
+    *px = x;
+    *py = y;
+    *plx= lx;
+    *ply= ly;
+
+    if (avctx->bits_per_coded_sample == 16) {
+        *cx1 = (clr & 0x3F00) >> 2;
+        *cx = (clr & 0x3FFFFF) >> 16;
+    } else {
+        *cx1 = (clr & 0xFC00) >> 4;
+        *cx = (clr & 0xFFFFFF) >> 18;
+    }
+
+    return 0;
+}
+
+static int decode_run_p(AVCodecContext *avctx, uint32_t ptype, int run,
+                        int x, int y, uint32_t clr,
+                        uint32_t *dst, uint32_t *prev,
+                        int linesize, int plinesize,
+                        uint32_t *bx, uint32_t *by,
+                        uint32_t backstep, int sx1, int sx2,
+                        int *cx, int *cx1)
+{
+    uint32_t r, g, b;
+    int z;
+
+    switch (ptype) {
+    case 0:
+        while (run-- > 0) {
+            if (*by >= avctx->height)
+                return AVERROR_INVALIDDATA;
+
+            dst[*by * linesize + *bx] = clr;
+            (*bx)++;
+            if (*bx >= x * 16 + sx2 || *bx >= avctx->width) {
+                *bx = x * 16 + sx1;
+                (*by)++;
+            }
+        }
+        break;
+    case 1:
+        while (run-- > 0) {
+            if (*bx == 0) {
+                if (*by < 1)
+                    return AVERROR_INVALIDDATA;
+                z = backstep;
+            } else {
+                z = 0;
+            }
+
+            if (*by >= avctx->height)
+                return AVERROR_INVALIDDATA;
+
+            clr = dst[*by * linesize + *bx - 1 - z];
+            dst[*by * linesize + *bx] = clr;
+            (*bx)++;
+            if (*bx >= x * 16 + sx2 || *bx >= avctx->width) {
+                *bx = x * 16 + sx1;
+                (*by)++;
+            }
+        }
+        break;
+    case 2:
+        while (run-- > 0) {
+            if (*by < 1 || *by >= avctx->height)
+                return AVERROR_INVALIDDATA;
+
+            clr = dst[(*by - 1) * linesize + *bx];
+            dst[*by * linesize + *bx] = clr;
+            (*bx)++;
+            if (*bx >= x * 16 + sx2 || *bx >= avctx->width) {
+                *bx = x * 16 + sx1;
+                (*by)++;
+            }
+        }
+        break;
+    case 3:
+        while (run-- > 0) {
+            if (*by >= avctx->height)
+                return AVERROR_INVALIDDATA;
+
+            clr = prev[*by * plinesize + *bx];
+            dst[*by * linesize + *bx] = clr;
+            (*bx)++;
+            if (*bx >= x * 16 + sx2 || *bx >= avctx->width) {
+                *bx = x * 16 + sx1;
+                (*by)++;
+            }
+        }
+        break;
+    case 4:
+        while (run-- > 0) {
+            uint8_t *odst = (uint8_t *)dst;
+
+            if (*by < 1 || *by >= avctx->height)
+                return AVERROR_INVALIDDATA;
+
+            if (*bx == 0) {
+                if (*by < 2)
+                    return AVERROR_INVALIDDATA;
+                z = backstep;
+            } else {
+                z = 0;
+            }
+
+            r = odst[((*by - 1) * linesize + *bx) * 4] +
+                odst[(*by * linesize + *bx - 1 - z) * 4] -
+                odst[((*by - 1) * linesize + *bx - 1 - z) * 4];
+            g = odst[((*by - 1) * linesize + *bx) * 4 + 1] +
+                odst[(*by * linesize + *bx - 1 - z) * 4 + 1] -
+                odst[((*by - 1) * linesize + *bx - 1 - z) * 4 + 1];
+            b = odst[((*by - 1) * linesize + *bx) * 4 + 2] +
+                odst[(*by * linesize + *bx - 1 - z) * 4 + 2] -
+                odst[((*by - 1) * linesize + *bx - 1 - z) * 4 + 2];
+            clr = ((b & 0xFF) << 16) + ((g & 0xFF) << 8) + (r & 0xFF);
+            dst[*by * linesize + *bx] = clr;
+            (*bx)++;
+            if (*bx >= x * 16 + sx2 || *bx >= avctx->width) {
+                *bx = x * 16 + sx1;
+                (*by)++;
+            }
+        }
+        break;
+    case 5:
+        while (run-- > 0) {
+            if (*by < 1 || *by >= avctx->height)
+                return AVERROR_INVALIDDATA;
+
+            if (*bx == 0) {
+                if (*by < 2)
+                    return AVERROR_INVALIDDATA;
+                z = backstep;
+            } else {
+                z = 0;
+            }
+
+            clr = dst[(*by - 1) * linesize + *bx - 1 - z];
+            dst[*by * linesize + *bx] = clr;
+            (*bx)++;
+            if (*bx >= x * 16 + sx2 || *bx >= avctx->width) {
+                *bx = x * 16 + sx1;
+                (*by)++;
+            }
+        }
+        break;
+    }
+
+    if (avctx->bits_per_coded_sample == 16) {
+        *cx1 = (clr & 0x3F00) >> 2;
+        *cx = (clr & 0x3FFFFF) >> 16;
+    } else {
+        *cx1 = (clr & 0xFC00) >> 4;
+        *cx = (clr & 0xFFFFFF) >> 18;
+    }
+
+    return 0;
+}
+
+#endif /* AVCODEC_SCPR_H */
diff --git a/libavcodec/scpr3.c b/libavcodec/scpr3.c
new file mode 100644
index 0000000..b4d2e21
--- /dev/null
+++ b/libavcodec/scpr3.c
@@ -0,0 +1,1214 @@
+/*
+ * ScreenPressor version 3 decoder
+ *
+ * Copyright (c) 2017 Paul B Mahol
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "libavutil/qsort.h"
+
+#include "avcodec.h"
+#include "bytestream.h"
+#include "internal.h"
+#include "scpr.h"
+
+static void renew_table3(uint32_t nsym, uint32_t *cntsum,
+                         uint16_t *freqs, uint16_t *freqs1,
+                         uint16_t *cnts, uint8_t *dectab)
+{
+    uint32_t a = 0, b = 4096 / nsym, c = b - (b >> 1);
+
+    *cntsum = c * nsym;
+
+    for (int d = 0; d < nsym; d++) {
+        freqs[d] = b;
+        freqs1[d] = a;
+        cnts[d] = c;
+        for (int q = a + 128 - 1 >> 7, f = (a + b - 1 >> 7) + 1; q < f; q++)
+            dectab[q] = d;
+
+        a += b;
+    }
+}
+
+static void reinit_tables3(SCPRContext * s)
+{
+    for (int i = 0; i < 3; i++) {
+        for (int j = 0; j < 4096; j++) {
+            PixelModel3 *m = &s->pixel_model3[i][j];
+            m->type = 0;
+        }
+    }
+
+    for (int i = 0; i < 6; i++) {
+        renew_table3(256, &s->run_model3[i].cntsum,
+                     s->run_model3[i].freqs[0], s->run_model3[i].freqs[1],
+                     s->run_model3[i].cnts, s->run_model3[i].dectab);
+    }
+
+    renew_table3(256, &s->range_model3.cntsum,
+                 s->range_model3.freqs[0], s->range_model3.freqs[1],
+                 s->range_model3.cnts, s->range_model3.dectab);
+
+    renew_table3(5, &s->fill_model3.cntsum,
+                 s->fill_model3.freqs[0], s->fill_model3.freqs[1],
+                 s->fill_model3.cnts, s->fill_model3.dectab);
+
+    renew_table3(256, &s->count_model3.cntsum,
+                 s->count_model3.freqs[0], s->count_model3.freqs[1],
+                 s->count_model3.cnts, s->count_model3.dectab);
+
+    for (int i = 0; i < 4; i++) {
+        renew_table3(16, &s->sxy_model3[i].cntsum,
+                     s->sxy_model3[i].freqs[0], s->sxy_model3[i].freqs[1],
+                     s->sxy_model3[i].cnts, s->sxy_model3[i].dectab);
+    }
+
+    for (int i = 0; i < 2; i++) {
+        renew_table3(512, &s->mv_model3[i].cntsum,
+                     s->mv_model3[i].freqs[0], s->mv_model3[i].freqs[1],
+                     s->mv_model3[i].cnts, s->mv_model3[i].dectab);
+    }
+
+    for (int i = 0; i < 6; i++) {
+        renew_table3(6, &s->op_model3[i].cntsum,
+                     s->op_model3[i].freqs[0], s->op_model3[i].freqs[1],
+                     s->op_model3[i].cnts, s->op_model3[i].dectab);
+    }
+}
+
+static int decode3(GetByteContext *gb, RangeCoder *rc, uint32_t a, uint32_t b)
+{
+    uint32_t code = a * (rc->code >> 12) + (rc->code & 0xFFF) - b;
+
+    while (code < 0x800000 && bytestream2_get_bytes_left(gb) > 0)
+        code = bytestream2_get_byteu(gb) | (code << 8);
+    rc->code = code;
+
+    return 0;
+}
+
+static void rescale(PixelModel3 *m, int *totfr)
+{
+    uint32_t a;
+
+    a = 256 - m->size;
+    for (int b = 0; b < m->size; b++) {
+        m->freqs[b] -= m->freqs[b] >> 1;
+        a += m->freqs[b];
+    }
+
+    *totfr = a;
+}
+
+static int add_symbol(PixelModel3 *m, int index, uint32_t symbol, int *totfr, int max)
+{
+    if (m->size == max)
+        return 0;
+
+    for (int c = m->size - 1; c >= index; c--) {
+        m->symbols[c + 1] = m->symbols[c];
+        m->freqs[c + 1] = m->freqs[c];
+    }
+
+    m->symbols[index] = symbol;
+    m->freqs[index] = 50;
+    m->size++;
+
+    if (m->maxpos >= index)
+        m->maxpos++;
+
+    *totfr += 50;
+    if (*totfr + 50 > 4096)
+        rescale(m, totfr);
+
+    return 1;
+}
+
+static int decode_adaptive45(PixelModel3 *m, int rccode, uint32_t *value,
+                             uint16_t *a, uint16_t *b, uint32_t *c, int max)
+{
+    uint32_t q, g, maxpos, d, e = *c, totfr = *c;
+    int ret;
+
+    for (d = 0; e <= 2048; d++)
+        e <<= 1;
+    maxpos = m->maxpos;
+    rccode >>= d;
+    *c = m->freqs[maxpos];
+    m->freqs[maxpos] += 4096 - e >> d;
+
+    for (q = 0, g = 0, e = 0; q < m->size; q++) {
+        uint32_t f = m->symbols[q];
+        uint32_t p = e + f - g;
+        uint32_t k = m->freqs[q];
+
+        if (rccode < p) {
+            *value = rccode - e + g;
+            *b = rccode << d;
+            *a = 1 << d;
+            m->freqs[maxpos] = *c;
+            ret = add_symbol(m, q, *value, &totfr, max);
+            *c = totfr;
+            return ret;
+        }
+
+        if (p + k > rccode) {
+            *value = f;
+            e += *value - g;
+            *b = e << d;
+            *a = k << d;
+            m->freqs[maxpos] = *c;
+            m->freqs[q] += 50;
+            totfr += 50;
+            if ((q != maxpos) && (m->freqs[q] > m->freqs[maxpos]))
+                m->maxpos = q;
+            if (totfr + 50 > 4096)
+                rescale(m, &totfr);
+            *c = totfr;
+            return 1;
+        }
+
+        e += f - g + k;
+        g = f + 1;
+    }
+
+    m->freqs[maxpos] = *c;
+    *value = g + rccode - e;
+    *b = rccode << d;
+    *a = 1 << d;
+    ret = add_symbol(m, q, *value, &totfr, max);
+    *c = totfr;
+    return ret;
+}
+
+static int update_model6_to_7(PixelModel3 *m)
+{
+    PixelModel3 n = {0};
+    int c, d, e, f, k, p, length, i, j, index;
+    uint16_t *freqs, *freqs1, *cnts;
+
+    n.type = 7;
+
+    length = m->length;
+    freqs = n.freqs;
+    freqs1 = n.freqs1;
+    cnts = n.cnts;
+    n.cntsum = m->cnts[length];
+    for (i = 0; i < length; i++) {
+        if (!m->cnts[i])
+            continue;
+        index = m->symbols[i];
+        freqs[index] = m->freqs[2 * i];
+        freqs1[index] = m->freqs[2 * i + 1];
+        cnts[index] = m->cnts[i];
+    }
+    c = 1 << m->fshift;
+    d = c - (c >> 1);
+    for (j = 0, e = 0; j < 256; j++) {
+        f = freqs[j];
+        if (!f) {
+            f = c;
+            freqs[j] = c;
+            freqs1[j] = e;
+            cnts[j] = d;
+        }
+        p = (e + 127) >> 7;
+        k = ((f + e - 1) >> 7) + 1;
+        for (i = 0; i < k - p; i++)
+            n.dectab[p + i] = j;
+        e += f;
+    }
+
+    memcpy(m, &n, sizeof(n));
+
+    return 0;
+}
+
+static void calc_sum(PixelModel3 *m)
+{
+    uint32_t a;
+    int len;
+
+    len = m->length;
+    a = 256 - m->size << (m->fshift > 0 ? m->fshift - 1 : 0);
+    for (int c = 0; c < len; c++)
+        a += m->cnts[c];
+    m->cnts[len] = a;
+}
+
+static void rescale_dec(PixelModel3 *m)
+{
+    uint16_t cnts[256] = {0};
+    uint16_t freqs[512] = {0};
+    int b, c, e, g;
+    uint32_t a;
+
+    for (a = 1 << (0 < m->fshift ? m->fshift - 1 : 0), b = 0; b < 256; b++)
+        cnts[b] = a;
+
+    for (a = 0, b = m->size; a < b; a++)
+        cnts[m->symbols[a]] = m->cnts[a];
+
+    for (b = a = 0; b < 256; b++) {
+        freqs[2 * b] = cnts[b];
+        freqs[2 * b + 1] = a;
+        a += cnts[b];
+    }
+
+    if (m->fshift > 0)
+        m->fshift--;
+
+    a = 256 - m->size << (0 < m->fshift ? m->fshift - 1 : 0);
+    for (b = 0, c = m->size; b < c; b++) {
+        m->cnts[b] -= m->cnts[b] >> 1;
+        a = a + m->cnts[b];
+        e = m->symbols[b];
+        g = freqs[2 * e + 1];
+        m->freqs[2 * b] = freqs[2 * e];
+        m->freqs[2 * b + 1] = g;
+    }
+    m->cnts[m->length] = a;
+}
+
+static int update_model5_to_6(PixelModel3 *m, uint8_t value)
+{
+    PixelModel3 n = {0};
+    int c, d, e, f, g, k, q, p;
+
+    n.type = 6;
+    n.length = 32;
+
+    for (c = m->size, d = 256 - c, e = 0; e < c; e++)
+        d = d + m->freqs[e];
+
+    for (e = 0; d <= 2048; e++)
+        d <<= 1;
+
+    for (q = d = 0, g = q = 0; g < c; g++) {
+        p = m->symbols[g];
+        d = d + (p - q);
+        q = m->freqs[g];
+        k = q << e;
+        n.freqs[2 * g] = k;
+        n.freqs[2 * g + 1] = d << e;
+        n.cnts[g] = k - (k >> 1);
+        n.symbols[g] = p;
+        d += q;
+        q = p + 1;
+    }
+
+    n.fshift = e;
+    e = 1 << n.fshift;
+    d = 0;
+    if (value > 0) {
+        d = -1;
+        for (p = f = g = 0; p < c; p++) {
+            k = n.symbols[p];
+            if (k > d && k < value) {
+                d = k;
+                g = n.freqs[2 * p];
+                f = n.freqs[2 * p + 1];
+            }
+        }
+        d = 0 < g ? f + g + (value - d - 1 << n.fshift) : value << n.fshift;
+    }
+    n.freqs[2 * c] = e;
+    n.freqs[2 * c + 1] = d;
+    n.cnts[c] = e - (e >> 1);
+    n.symbols[c] = value;
+    n.size = c + 1;
+    e = 25 << n.fshift;
+    n.cnts[c] += e;
+    n.cnts[32] += e;
+    if (n.cnts[32] + e > 4096)
+        rescale_dec(&n);
+
+    calc_sum(&n);
+    for (c = 0, e = n.size - 1; c < e; c++) {
+        for (g = c + 1, f = n.size; g < f; g++) {
+            if (q = n.freqs[2 * g], k = n.freqs[2 * c], q > k) {
+                int l = n.freqs[2 * c + 1];
+                int h = n.freqs[2 * g + 1];
+                n.freqs[2 * c] = q;
+                n.freqs[2 * c + 1] = h;
+                n.freqs[2 * g] = k;
+                n.freqs[2 * g + 1] = l;
+                FFSWAP(uint16_t, n.cnts[c], n.cnts[g]);
+                FFSWAP(uint8_t, n.symbols[c], n.symbols[g]);
+            }
+        }
+    }
+
+    memcpy(m, &n, sizeof(n));
+
+    return 0;
+}
+
+static void grow_dec(PixelModel3 *m)
+{
+    int a;
+
+    a = 2 * m->length;
+    m->cnts[2 * m->length] = m->cnts[m->length];
+    m->length = a;
+}
+
+static int add_dec(PixelModel3 *m, int sym, int f1, int f2)
+{
+    int size;
+
+    if (m->size >= 40 || m->size >= m->length)
+        return -1;
+
+    size = m->size;
+    m->symbols[size] = sym;
+    m->freqs[2 * size] = f1;
+    m->freqs[2 * size + 1] = f2;
+    m->cnts[size] = f1 - (f1 >> 1);
+    m->size++;
+
+    return size;
+}
+
+static void incr_cntdec(PixelModel3 *m, int a)
+{
+    int b, len, d, e, g;
+
+    b = 25 << m->fshift;
+    len = m->length;
+    m->cnts[a] += b;
+    m->cnts[len] += b;
+    if (a > 0 && m->cnts[a] > m->cnts[a - 1]) {
+        FFSWAP(uint16_t, m->cnts[a], m->cnts[a - 1]);
+        d = m->freqs[2 * a];
+        e = m->freqs[2 * a + 1];
+        g = m->freqs[2 * (a - 1) + 1];
+        m->freqs[2 * a] = m->freqs[2 * (a - 1)];
+        m->freqs[2 * a + 1] = g;
+        g = a - 1;
+        m->freqs[2 * g] = d;
+        m->freqs[2 * g + 1] = e;
+        FFSWAP(uint8_t, m->symbols[a], m->symbols[a - 1]);
+    }
+
+    if (m->cnts[len] + b > 4096)
+        rescale_dec(m);
+}
+
+static int decode_adaptive6(PixelModel3 *m, uint32_t code, uint32_t *value,
+                            uint16_t *a, uint16_t *b)
+{
+    int c, d, e, f, g, q;
+
+    for (c = 0, d = 0, e = 0, f = 0, g = 0, q = m->size; g < q; g++) {
+        uint32_t p = m->freqs[2 * g + 1];
+
+        if (p <= code) {
+            uint32_t k = m->freqs[2 * g];
+
+            if (p + k > code) {
+                *value = m->symbols[g];
+                *a = k;
+                *b = p;
+                incr_cntdec(m, g);
+                return 1;
+            }
+
+            if (p >= d) {
+                c = k;
+                d = p;
+                e = m->symbols[g];
+            }
+        }
+    }
+
+    g = 1 << m->fshift;
+    q = f = 0;
+
+    if (c > 0) {
+        f = code - (d + c) >> m->fshift;
+        q = f + e + 1;
+        f = d + c + (f << m->fshift);
+    } else {
+        q = code >> m->fshift;
+        f = q << m->fshift;
+    }
+
+    *a = g;
+    *b = f;
+    *value = q;
+
+    c = add_dec(m, q, g, f);
+    if (c < 0) {
+        if (m->length == 64)
+            return 0;
+        grow_dec(m);
+        c = add_dec(m, q, g, f);
+    }
+
+    incr_cntdec(m, c);
+    return 1;
+}
+
+static int cmpbytes(const void *p1, const void *p2)
+{
+    int left  = *(const uint8_t *)p1;
+    int right = *(const uint8_t *)p2;
+    return FFDIFFSIGN(left, right);
+}
+
+static int update_model1_to_2(PixelModel3 *m, uint32_t val)
+{
+    PixelModel3 n = {0};
+    int i, b;
+
+    n.type = 2;
+    n.size = m->size + 1;
+    b = m->size;
+    for (i = 0; i < b; i++)
+        n.symbols[i] = m->symbols[i];
+    n.symbols[b] = val;
+
+    memcpy(m, &n, sizeof(n));
+
+    return 0;
+}
+
+static int update_model1_to_4(PixelModel3 *m, uint32_t val)
+{
+    PixelModel3 n = {0};
+    int size, i;
+
+    size = m->size;
+    n.type = 4;
+    n.size = size;
+    for (i = 0; i < n.size; i++) {
+        n.symbols[i] = m->symbols[i];
+    }
+    AV_QSORT(n.symbols, size, uint8_t, cmpbytes);
+    for (i = 0; i < n.size; i++) {
+        if (val == n.symbols[i]) {
+            n.freqs[i] = 100;
+            n.maxpos = i;
+        } else {
+            n.freqs[i] = 50;
+        }
+    }
+
+    memcpy(m, &n, sizeof(n));
+
+    return 0;
+}
+
+static int update_model1_to_5(PixelModel3 *m, uint32_t val)
+{
+    PixelModel3 n = {0};
+    int i, size, freqs;
+    uint32_t a;
+
+    size = m->size;
+    n.size = size;
+    for (i = 0; i < size; i++) {
+        n.symbols[i] = m->symbols[i];
+    }
+    AV_QSORT(n.symbols, size, uint8_t, cmpbytes);
+    size = n.size;
+    for (i = 0; i < size; i++) {
+        if (val == n.symbols[i]) {
+            n.freqs[i] = 100;
+            n.maxpos = i;
+        } else {
+            n.freqs[i] = 50;
+        }
+    }
+    a = 256 - size;
+    for (i = 0; i < size; i++, a += freqs)
+        freqs = n.freqs[i];
+    n.type = 5;
+    n.cntsum = a;
+
+    memcpy(m, &n, sizeof(n));
+
+    return 0;
+}
+
+static int decode_static1(PixelModel3 *m, uint32_t val)
+{
+    uint32_t size;
+
+    size = m->size;
+    for (int i = 0; i < size; i++) {
+        if (val == m->symbols[i]) {
+            if (size <= 4)
+                return update_model1_to_4(m, val);
+            else
+                return update_model1_to_5(m, val);
+        }
+    }
+
+    if (size >= 14)
+        return update_model1_to_2(m, val);
+
+    m->symbols[size] = val;
+    m->size++;
+    return 0;
+}
+
+static int update_model2_to_6(PixelModel3 *m, uint8_t value, int a4)
+{
+    PixelModel3 n = {0};
+    int c, d, e, f, g, q;
+
+    n.type = 6;
+    n.length = a4;
+
+    memset(n.symbols, 1u, a4);
+
+    c = m->size;
+    d = 256 - c + (64 * c + 64);
+    for (e = 0; d <= 2048; e++) {
+        d <<= 1;
+    }
+
+    g = q = 0;
+    AV_QSORT(m->symbols, c, uint8_t, cmpbytes);
+    for (f = d = 0; f < c; f++) {
+        int p = f;
+        int k = m->symbols[p];
+        int l;
+        g = g + (k - q);
+
+        if (k == value) {
+            d = p;
+            q = 128;
+        } else {
+            q = 64;
+        }
+        l = q << e;
+        n.freqs[2 * p] = l;
+        n.freqs[2 * p + 1] = g << e;
+        n.symbols[p] = k;
+        n.cnts[p] = l - (l >> 1);
+        g += q;
+        q = k + 1;
+    }
+    n.size = c;
+    n.fshift = e;
+    calc_sum(&n);
+
+    if (d > 0) {
+        c = n.freqs[0];
+        e = n.freqs[1];
+        g = n.freqs[2 * d + 1];
+        n.freqs[0] = n.freqs[2 * d];
+        n.freqs[1] = g;
+        n.freqs[2 * d] = c;
+        n.freqs[2 * d + 1] = e;
+        FFSWAP(uint16_t, n.cnts[0], n.cnts[d]);
+        FFSWAP(uint8_t, n.symbols[0], n.symbols[d]);
+    }
+
+    memcpy(m, &n, sizeof(n));
+
+    return 0;
+}
+
+static int update_model2_to_3(PixelModel3 *m, uint32_t val)
+{
+    PixelModel3 n = {0};
+    uint32_t size;
+
+    n.type = 3;
+    n.size = m->size + 1;
+
+    size = m->size;
+    for (int i = 0; i < size; i++)
+        n.symbols[i] = m->symbols[i];
+    n.symbols[size] = val;
+
+    memcpy(m, &n, sizeof(n));
+
+    return 0;
+}
+
+static int decode_static2(PixelModel3 *m, uint32_t val)
+{
+    uint32_t size;
+
+    size = m->size;
+    for (int i = 0; i < size; i++) {
+        if (val == m->symbols[i]) {
+            int a;
+
+            if (m->size <= 32)
+                a = 32;
+            else
+                a = 64;
+            return update_model2_to_6(m, val, a);
+        }
+    }
+
+    if (size >= 64)
+        return update_model2_to_3(m, val);
+
+    m->symbols[size] = val;
+    m->size++;
+
+    return 0;
+}
+
+static int update_model3_to_7(PixelModel3 *m, uint8_t value)
+{
+    PixelModel3 n = {0};
+    int c, d, e, f, g, q;
+
+    n.type = 7;
+
+    for (c = 0; c < 256; c++) {
+        d = c;
+        n.freqs[d] = 1;
+        n.cnts[d] = 1;
+    }
+
+    for (c = m->size, d = (4096 - (256 - c)) / (c + 1) | 0, e = d - (d >> 1), g = 0; g < c;) {
+        q = g++;
+        q = m->symbols[q];
+        n.freqs[q] = d;
+        n.cnts[q] = e;
+    }
+    n.freqs[value] += d;
+    n.cnts[value] += 16;
+    for (d = c = n.cntsum = 0; 256 > d; d++) {
+        e = d;
+        n.cntsum += n.cnts[e];
+        n.freqs1[e] = c;
+        for (g = n.freqs[e], q = c + 128 - 1 >> 7, f = (c + g - 1 >> 7) + 1; q < f; q++) {
+            n.dectab[q] = e;
+        }
+        c += g;
+    }
+
+    memcpy(m, &n, sizeof(n));
+
+    return 0;
+}
+
+static int decode_static3(PixelModel3 *m, uint32_t val)
+{
+    uint32_t size = m->size;
+
+    for (int i = 0; i < size; i++) {
+        if (val == m->symbols[i])
+            return update_model3_to_7(m, val);
+    }
+
+    if (size >= 256)
+        return 0;
+
+    m->symbols[size] = val;
+    m->size++;
+    return 0;
+}
+
+static void sync_code3(GetByteContext *gb, RangeCoder *rc)
+{
+    rc->code1++;
+    if (rc->code1 == 0x20000) {
+        rc->code = bytestream2_get_le32(gb);
+        rc->code1 = 0;
+    }
+}
+
+static int decode_value3(SCPRContext *s, uint32_t max, uint32_t *cntsum,
+                         uint16_t *freqs1, uint16_t *freqs2,
+                         uint16_t *cnts, uint8_t *dectable,
+                         uint32_t *value)
+{
+    GetByteContext *gb = &s->gb;
+    RangeCoder *rc = &s->rc;
+    uint32_t r, y, a, b, e, g, q;
+
+    r = dectable[(rc->code & 0xFFFu) >> 7];
+    if (r < max) {
+        while (freqs2[r + 1] <= (rc->code & 0xFFF)) {
+            if (++r >= max)
+                break;
+        }
+    }
+
+    if (r > max)
+        return AVERROR_INVALIDDATA;
+
+    cnts[r] += 16;
+    a = freqs1[r];
+    b = freqs2[r];
+    *cntsum += 16;
+    if (*cntsum + 16 > 4096) {
+        *cntsum = 0;
+        for (int c = 0, i = 0; i < max + 1; i++) {
+            e = cnts[i];
+            freqs2[i] = c;
+            freqs1[i] = e;
+            g = (c + 127) >> 7;
+            c += e;
+            q = ((c - 1) >> 7) + 1;
+            if (q > g) {
+                for (int j = 0; j < q - g; j++)
+                    dectable[j + g] = i;
+            }
+            y = e - (e >> 1);
+            cnts[i] = y;
+            *cntsum += y;
+        }
+    }
+
+    decode3(gb, rc, a, b);
+    sync_code3(gb, rc);
+
+    *value = r;
+
+    return 0;
+}
+
+static void calc_sum5(PixelModel3 *m)
+{
+    uint32_t a;
+
+    a = 256 - m->size;
+    for (int b = 0; b < m->size; b++)
+        a += m->freqs[b];
+    m->cntsum = a;
+}
+
+static int update_model4_to_5(PixelModel3 *m, uint32_t value)
+{
+    PixelModel3 n = {0};
+    int c, e, g, totfr;
+
+    n.type = 5;
+
+    for (c = 0, e = 0; c < m->size && m->symbols[c] < value; c++) {
+        n.symbols[c] = m->symbols[c];
+        e += n.freqs[c] = m->freqs[c];
+    }
+
+    g = c;
+    n.symbols[g] = value;
+    e += n.freqs[g++] = 50;
+    for (; c < m->size; g++, c++) {
+        n.symbols[g] = m->symbols[c];
+        e += n.freqs[g] = m->freqs[c];
+    }
+    n.size = m->size + 1;
+    if (e > 4096)
+        rescale(&n, &totfr);
+
+    calc_sum5(&n);
+
+    memcpy(m, &n, sizeof(n));
+
+    return 0;
+}
+
+static int decode_unit3(SCPRContext *s, PixelModel3 *m, uint32_t code, uint32_t *value)
+{
+    GetByteContext *gb = &s->gb;
+    RangeCoder *rc = &s->rc;
+    uint16_t a = 0, b = 0;
+    uint32_t param;
+    int type;
+
+    type = m->type;
+    switch (type) {
+    case 0:
+        *value = bytestream2_get_byte(&s->gb);
+        m->type = 1;
+        m->size = 1;
+        m->symbols[0] = *value;
+        sync_code3(gb, rc);
+        break;
+    case 1:
+        *value = bytestream2_get_byte(&s->gb);
+        decode_static1(m, *value);
+        sync_code3(gb, rc);
+        break;
+    case 2:
+        *value = bytestream2_get_byte(&s->gb);
+        decode_static2(m, *value);
+        sync_code3(gb, rc);
+        break;
+    case 3:
+        *value = bytestream2_get_byte(&s->gb);
+        decode_static3(m, *value);
+        sync_code3(gb, rc);
+        break;
+    case 4:
+        param = m->freqs[0] + m->freqs[1] + m->freqs[2] + m->freqs[3] + 256 - m->size;
+        if (!decode_adaptive45(m, code, value, &a, &b, &param, 4))
+            update_model4_to_5(m, *value);
+        decode3(gb, rc, a, b);
+        sync_code3(gb, rc);
+        break;
+    case 5:
+        if (!decode_adaptive45(m, code, value, &a, &b, &m->cntsum, 16))
+            update_model5_to_6(m, *value);
+        decode3(gb, rc, a, b);
+        sync_code3(gb, rc);
+        break;
+    case 6:
+        if (!decode_adaptive6(m, code, value, &a, &b)) {
+            update_model6_to_7(m);
+        }
+        decode3(gb, rc, a, b);
+        sync_code3(gb, rc);
+        break;
+    case 7:
+        return decode_value3(s, 255, &m->cntsum,
+                             m->freqs, m->freqs1,
+                             m->cnts, m->dectab, value);
+    }
+
+    if (*value > 255)
+        return AVERROR_INVALIDDATA;
+
+    return 0;
+}
+
+static int decode_units3(SCPRContext * s, uint32_t *red,
+                         uint32_t *green, uint32_t *blue,
+                         int *cx, int *cx1)
+{
+    RangeCoder *rc = &s->rc;
+    int ret;
+
+    ret = decode_unit3(s, &s->pixel_model3[0][*cx + *cx1], rc->code & 0xFFF, red);
+    if (ret < 0)
+        return ret;
+
+    *cx1 = (*cx << 6) & 0xFC0;
+    *cx = *red >> 2;
+
+    ret = decode_unit3(s, &s->pixel_model3[1][*cx + *cx1], rc->code & 0xFFF, green);
+    if (ret < 0)
+        return ret;
+
+    *cx1 = (*cx << 6) & 0xFC0;
+    *cx = *green >> 2;
+
+    ret = decode_unit3(s, &s->pixel_model3[2][*cx + *cx1], rc->code & 0xFFF, blue);
+    if (ret < 0)
+        return ret;
+
+    *cx1 = (*cx << 6) & 0xFC0;
+    *cx = *blue >> 2;
+
+    return 0;
+}
+
+static void init_rangecoder3(RangeCoder *rc, GetByteContext *gb)
+{
+    rc->code  = bytestream2_get_le32(gb);
+    rc->code1 = 0;
+}
+
+static int decompress_i3(AVCodecContext *avctx, uint32_t *dst, int linesize)
+{
+    SCPRContext *s = avctx->priv_data;
+    GetByteContext *gb = &s->gb;
+    RangeCoder *rc = &s->rc;
+    int cx = 0, cx1 = 0, k = 0;
+    int run, off, y = 0, x = 0, ret;
+    uint32_t backstep = linesize - avctx->width;
+    uint32_t clr = 0, lx, ly, ptype, r, g, b;
+
+    bytestream2_skip(gb, 1);
+    init_rangecoder3(rc, gb);
+    reinit_tables3(s);
+
+    while (k < avctx->width + 1) {
+        ret = decode_units3(s, &r, &g, &b, &cx, &cx1);
+        if (ret < 0)
+            return ret;
+        ret = decode_value3(s, 255, &s->run_model3[0].cntsum,
+                            s->run_model3[0].freqs[0],
+                            s->run_model3[0].freqs[1],
+                            s->run_model3[0].cnts,
+                            s->run_model3[0].dectab, &run);
+        if (ret < 0)
+            return ret;
+        if (run <= 0)
+            return AVERROR_INVALIDDATA;
+
+        clr = (b << 16) + (g << 8) + r;
+        k += run;
+        while (run-- > 0) {
+            if (y >= avctx->height)
+                return AVERROR_INVALIDDATA;
+
+            dst[y * linesize + x] = clr;
+            lx = x;
+            ly = y;
+            x++;
+            if (x >= avctx->width) {
+                x = 0;
+                y++;
+            }
+        }
+    }
+    off = -linesize - 1;
+    ptype = 0;
+
+    while (x < avctx->width && y < avctx->height) {
+        ret = decode_value3(s, 5, &s->op_model3[ptype].cntsum,
+                            s->op_model3[ptype].freqs[0],
+                            s->op_model3[ptype].freqs[1],
+                            s->op_model3[ptype].cnts,
+                            s->op_model3[ptype].dectab, &ptype);
+        if (ret < 0)
+            return ret;
+        if (ptype == 0) {
+            ret = decode_units3(s, &r, &g, &b, &cx, &cx1);
+            if (ret < 0)
+                return ret;
+            clr = (b << 16) + (g << 8) + r;
+        }
+        if (ptype > 5)
+            return AVERROR_INVALIDDATA;
+        ret = decode_value3(s, 255, &s->run_model3[ptype].cntsum,
+                            s->run_model3[ptype].freqs[0],
+                            s->run_model3[ptype].freqs[1],
+                            s->run_model3[ptype].cnts,
+                            s->run_model3[ptype].dectab, &run);
+        if (ret < 0)
+            return ret;
+        if (run <= 0)
+            return AVERROR_INVALIDDATA;
+
+        ret = decode_run_i(avctx, ptype, run, &x, &y, clr,
+                           dst, linesize, &lx, &ly,
+                           backstep, off, &cx, &cx1);
+        if (ret < 0)
+            return ret;
+    }
+
+    return 0;
+}
+
+static int decompress_p3(AVCodecContext *avctx,
+                         uint32_t *dst, int linesize,
+                         uint32_t *prev, int plinesize)
+{
+    SCPRContext *s = avctx->priv_data;
+    GetByteContext *gb = &s->gb;
+    int ret, temp, min, max, x, y, cx = 0, cx1 = 0;
+    int backstep = linesize - avctx->width;
+    int mvx = 0, mvy = 0;
+
+    if (bytestream2_get_byte(gb) == 0)
+        return 1;
+    init_rangecoder3(&s->rc, gb);
+
+    ret  = decode_value3(s, 255, &s->range_model3.cntsum,
+                         s->range_model3.freqs[0],
+                         s->range_model3.freqs[1],
+                         s->range_model3.cnts,
+                         s->range_model3.dectab, &min);
+    ret |= decode_value3(s, 255, &s->range_model3.cntsum,
+                         s->range_model3.freqs[0],
+                         s->range_model3.freqs[1],
+                         s->range_model3.cnts,
+                         s->range_model3.dectab, &temp);
+    if (ret < 0)
+        return ret;
+
+    min += temp << 8;
+    ret |= decode_value3(s, 255, &s->range_model3.cntsum,
+                         s->range_model3.freqs[0],
+                         s->range_model3.freqs[1],
+                         s->range_model3.cnts,
+                         s->range_model3.dectab, &max);
+    ret |= decode_value3(s, 255, &s->range_model3.cntsum,
+                         s->range_model3.freqs[0],
+                         s->range_model3.freqs[1],
+                         s->range_model3.cnts,
+                         s->range_model3.dectab, &temp);
+    if (ret < 0)
+        return ret;
+
+    max += temp << 8;
+    if (min > max || min >= s->nbcount)
+        return AVERROR_INVALIDDATA;
+
+    memset(s->blocks, 0, sizeof(*s->blocks) * s->nbcount);
+
+    while (min <= max) {
+        int fill, count;
+
+        ret  = decode_value3(s, 4, &s->fill_model3.cntsum,
+                             s->fill_model3.freqs[0],
+                             s->fill_model3.freqs[1],
+                             s->fill_model3.cnts,
+                             s->fill_model3.dectab, &fill);
+        ret |= decode_value3(s, 255, &s->count_model3.cntsum,
+                             s->count_model3.freqs[0],
+                             s->count_model3.freqs[1],
+                             s->count_model3.cnts,
+                             s->count_model3.dectab, &count);
+        if (ret < 0)
+            return ret;
+        if (count <= 0)
+            return AVERROR_INVALIDDATA;
+
+        while (min < s->nbcount && count-- > 0) {
+            s->blocks[min++] = fill;
+        }
+    }
+
+    ret = av_frame_copy(s->current_frame, s->last_frame);
+    if (ret < 0)
+        return ret;
+
+    for (y = 0; y < s->nby; y++) {
+        for (x = 0; x < s->nbx; x++) {
+            int sy1 = 0, sy2 = 16, sx1 = 0, sx2 = 16;
+
+            if (s->blocks[y * s->nbx + x] == 0)
+                continue;
+
+            if (((s->blocks[y * s->nbx + x] + 1) & 1) > 0) {
+                ret  = decode_value3(s, 15, &s->sxy_model3[0].cntsum,
+                                     s->sxy_model3[0].freqs[0],
+                                     s->sxy_model3[0].freqs[1],
+                                     s->sxy_model3[0].cnts,
+                                     s->sxy_model3[0].dectab, &sx1);
+                ret |= decode_value3(s, 15, &s->sxy_model3[1].cntsum,
+                                     s->sxy_model3[1].freqs[0],
+                                     s->sxy_model3[1].freqs[1],
+                                     s->sxy_model3[1].cnts,
+                                     s->sxy_model3[1].dectab, &sy1);
+                ret |= decode_value3(s, 15, &s->sxy_model3[2].cntsum,
+                                     s->sxy_model3[2].freqs[0],
+                                     s->sxy_model3[2].freqs[1],
+                                     s->sxy_model3[2].cnts,
+                                     s->sxy_model3[2].dectab, &sx2);
+                ret |= decode_value3(s, 15, &s->sxy_model3[3].cntsum,
+                                     s->sxy_model3[3].freqs[0],
+                                     s->sxy_model3[3].freqs[1],
+                                     s->sxy_model3[3].cnts,
+                                     s->sxy_model3[3].dectab, &sy2);
+                if (ret < 0)
+                    return ret;
+
+                sx2++;
+                sy2++;
+            }
+            if (((s->blocks[y * s->nbx + x] + 3) & 2) > 0) {
+                int i, a, b, c, j, by = y * 16, bx = x * 16;
+                uint32_t code;
+
+                a = s->rc.code & 0xFFF;
+                c = 1;
+
+                if (a < 0x800)
+                    c = 0;
+                b = 2048;
+                if (!c)
+                    b = 0;
+
+                code = a + ((s->rc.code >> 1) & 0xFFFFF800) - b;
+                while (code < 0x800000 && bytestream2_get_bytes_left(gb) > 0)
+                    code = bytestream2_get_byteu(gb) | (code << 8);
+                s->rc.code = code;
+
+                sync_code3(gb, &s->rc);
+
+                if (!c) {
+                    ret  = decode_value3(s, 511, &s->mv_model3[0].cntsum,
+                                         s->mv_model3[0].freqs[0],
+                                         s->mv_model3[0].freqs[1],
+                                         s->mv_model3[0].cnts,
+                                         s->mv_model3[0].dectab, &mvx);
+                    ret |= decode_value3(s, 511, &s->mv_model3[1].cntsum,
+                                         s->mv_model3[1].freqs[0],
+                                         s->mv_model3[1].freqs[1],
+                                         s->mv_model3[1].cnts,
+                                         s->mv_model3[1].dectab, &mvy);
+                    if (ret < 0)
+                        return ret;
+
+                    mvx -= 256;
+                    mvy -= 256;
+                }
+
+                if (by + mvy + sy1 < 0 || bx + mvx + sx1 < 0 ||
+                    by + mvy + sy1 >= avctx->height || bx + mvx + sx1 >= avctx->width)
+                    return AVERROR_INVALIDDATA;
+
+                for (i = 0; i < sy2 - sy1 && (by + sy1 + i) < avctx->height && (by + mvy + sy1 + i) < avctx->height; i++) {
+                    for (j = 0; j < sx2 - sx1 && (bx + sx1 + j) < avctx->width && (bx + mvx + sx1 + j) < avctx->width; j++) {
+                        dst[(by + i + sy1) * linesize + bx + sx1 + j] = prev[(by + mvy + sy1 + i) * plinesize + bx + sx1 + mvx + j];
+                    }
+                }
+            } else {
+                int run, bx = x * 16 + sx1, by = y * 16 + sy1;
+                uint32_t clr, ptype = 0, r, g, b;
+
+                for (; by < y * 16 + sy2 && by < avctx->height;) {
+                    ret = decode_value3(s, 5, &s->op_model3[ptype].cntsum,
+                                        s->op_model3[ptype].freqs[0],
+                                        s->op_model3[ptype].freqs[1],
+                                        s->op_model3[ptype].cnts,
+                                        s->op_model3[ptype].dectab, &ptype);
+                    if (ret < 0)
+                        return ret;
+                    if (ptype == 0) {
+                        ret = decode_units3(s, &r, &g, &b, &cx, &cx1);
+                        if (ret < 0)
+                            return ret;
+
+                        clr = (b << 16) + (g << 8) + r;
+                    }
+                    if (ptype > 5)
+                        return AVERROR_INVALIDDATA;
+                    ret = decode_value3(s, 255, &s->run_model3[ptype].cntsum,
+                                        s->run_model3[ptype].freqs[0],
+                                        s->run_model3[ptype].freqs[1],
+                                        s->run_model3[ptype].cnts,
+                                        s->run_model3[ptype].dectab, &run);
+                    if (ret < 0)
+                        return ret;
+                    if (run <= 0)
+                        return AVERROR_INVALIDDATA;
+
+                    ret = decode_run_p(avctx, ptype, run, x, y, clr,
+                                       dst, prev, linesize, plinesize, &bx, &by,
+                                       backstep, sx1, sx2, &cx, &cx1);
+                    if (ret < 0)
+                        return ret;
+                }
+            }
+        }
+    }
+
+    return 0;
+}
diff --git a/libavcodec/scpr3.h b/libavcodec/scpr3.h
new file mode 100644
index 0000000..92ad968
--- /dev/null
+++ b/libavcodec/scpr3.h
@@ -0,0 +1,82 @@
+/*
+ * ScreenPressor version 3 decoder
+ *
+ * Copyright (c) 2017 Paul B Mahol
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVCODEC_SCPR3_H
+#define AVCODEC_SCPR3_H
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "avcodec.h"
+#include "internal.h"
+
+typedef struct PixelModel3 {
+    uint8_t    type;
+    uint8_t    length;
+    uint8_t    maxpos;
+    uint8_t    fshift;
+    uint16_t   size;
+    uint32_t   cntsum;
+    uint8_t    symbols[256];
+    uint16_t   freqs[256];
+    uint16_t   freqs1[256];
+    uint16_t   cnts[256];
+    uint8_t    dectab[32];
+} PixelModel3;
+
+typedef struct FillModel3 {
+    uint32_t   cntsum;
+    uint16_t   freqs[2][5];
+    uint16_t   cnts[5];
+    uint8_t    dectab[32];
+} FillModel3;
+
+typedef struct OpModel3 {
+    uint32_t   cntsum;
+    uint16_t   freqs[2][6];
+    uint16_t   cnts[6];
+    uint8_t    dectab[32];
+} OpModel3;
+
+typedef struct RunModel3 {
+    uint32_t   cntsum;
+    uint16_t   freqs[2][256];
+    uint16_t   cnts[256];
+    uint8_t    dectab[32];
+} RunModel3;
+
+typedef struct SxyModel3 {
+    uint32_t   cntsum;
+    uint16_t   freqs[2][16];
+    uint16_t   cnts[16];
+    uint8_t    dectab[32];
+} SxyModel3;
+
+typedef struct MVModel3 {
+    uint32_t   cntsum;
+    uint16_t   freqs[2][512];
+    uint16_t   cnts[512];
+    uint8_t    dectab[32];
+} MVModel3;
+
+#endif /* AVCODEC_SCPR3_H */
diff --git a/libavcodec/screenpresso.c b/libavcodec/screenpresso.c
index fb8bfd4..d73c24d 100644
--- a/libavcodec/screenpresso.c
+++ b/libavcodec/screenpresso.c
@@ -94,8 +94,9 @@
 {
     int i;
     for (; height > 0; height--) {
+        const uint8_t *src1 = &src[(height - 1) * src_linesize];
         for (i = 0; i < bytewidth; i++)
-            dst[i] += src[(height - 1) * src_linesize + i];
+            dst[i] += src1[i];
         dst += dst_linesize;
     }
 }
@@ -145,7 +146,7 @@
         return AVERROR_UNKNOWN;
     }
 
-    ret = ff_reget_buffer(avctx, ctx->current);
+    ret = ff_reget_buffer(avctx, ctx->current, 0);
     if (ret < 0)
         return ret;
 
diff --git a/libavcodec/sheervideo.c b/libavcodec/sheervideo.c
index 50c3ebc..1a43727 100644
--- a/libavcodec/sheervideo.c
+++ b/libavcodec/sheervideo.c
@@ -2063,19 +2063,6 @@
     return avpkt->size;
 }
 
-#if HAVE_THREADS
-static int decode_init_thread_copy(AVCodecContext *avctx)
-{
-    SheerVideoContext *s = avctx->priv_data;
-
-    s->format = 0;
-    memset(&s->vlc[0], 0, sizeof(s->vlc[0]));
-    memset(&s->vlc[1], 0, sizeof(s->vlc[1]));
-
-    return 0;
-}
-#endif
-
 static av_cold int decode_end(AVCodecContext *avctx)
 {
     SheerVideoContext *s = avctx->priv_data;
@@ -2092,7 +2079,6 @@
     .type             = AVMEDIA_TYPE_VIDEO,
     .id               = AV_CODEC_ID_SHEERVIDEO,
     .priv_data_size   = sizeof(SheerVideoContext),
-    .init_thread_copy = ONLY_IF_THREADS_ENABLED(decode_init_thread_copy),
     .close            = decode_end,
     .decode           = decode_frame,
     .capabilities     = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_FRAME_THREADS,
diff --git a/libavcodec/shorten.c b/libavcodec/shorten.c
index 4b45e6d..4134af7 100644
--- a/libavcodec/shorten.c
+++ b/libavcodec/shorten.c
@@ -382,7 +382,7 @@
     /* subtract offset from previous samples to use in prediction */
     if (command == FN_QLPC && coffset)
         for (i = -pred_order; i < 0; i++)
-            s->decoded[channel][i] -= coffset;
+            s->decoded[channel][i] -= (unsigned)coffset;
 
     /* decode residual and do LPC prediction */
     init_sum = pred_order ? (command == FN_QLPC ? s->lpcqoffset : 0) : coffset;
@@ -397,7 +397,7 @@
     /* add offset to current samples */
     if (command == FN_QLPC && coffset)
         for (i = 0; i < s->blocksize; i++)
-            s->decoded[channel][i] += coffset;
+            s->decoded[channel][i] += (unsigned)coffset;
 
     return 0;
 }
diff --git a/libavcodec/simple_idct.c b/libavcodec/simple_idct.c
index 78b29c0..3b2e736 100644
--- a/libavcodec/simple_idct.c
+++ b/libavcodec/simple_idct.c
@@ -236,7 +236,7 @@
     }
 }
 
-void ff_prores_idct(int16_t *block, const int16_t *qmat)
+void ff_prores_idct_10(int16_t *block, const int16_t *qmat)
 {
     int i;
 
@@ -251,3 +251,19 @@
         idctSparseCol_extrashift_10(block + i);
     }
 }
+
+void ff_prores_idct_12(int16_t *block, const int16_t *qmat)
+{
+    int i;
+
+    for (i = 0; i < 64; i++)
+        block[i] *= qmat[i];
+
+    for (i = 0; i < 8; i++)
+        idctRowCondDC_int16_12bit(block + i*8, 0);
+
+    for (i = 0; i < 8; i++) {
+        block[i] += 8192;
+        idctSparseCol_int16_12bit(block + i);
+    }
+}
diff --git a/libavcodec/simple_idct.h b/libavcodec/simple_idct.h
index 39df230..20578b3 100644
--- a/libavcodec/simple_idct.h
+++ b/libavcodec/simple_idct.h
@@ -52,7 +52,8 @@
  * and scales by a factor of 2 more between the two IDCTs to account
  * for larger scale of input coefficients.
  */
-void ff_prores_idct(int16_t *block, const int16_t *qmat);
+void ff_prores_idct_10(int16_t *block, const int16_t *qmat);
+void ff_prores_idct_12(int16_t *block, const int16_t *qmat);
 
 void ff_simple_idct248_put(uint8_t *dest, ptrdiff_t line_size, int16_t *block);
 
diff --git a/libavcodec/simple_idct_template.c b/libavcodec/simple_idct_template.c
index 35c3132..5ddd0b4 100644
--- a/libavcodec/simple_idct_template.c
+++ b/libavcodec/simple_idct_template.c
@@ -121,7 +121,7 @@
 // TODO: Add DC-only support for int32_t input
 #if IN_IDCT_DEPTH == 16
 #if HAVE_FAST_64BIT
-#define ROW0_MASK (0xffffLL << 48 * HAVE_BIGENDIAN)
+#define ROW0_MASK (0xffffULL << 48 * HAVE_BIGENDIAN)
     if (((AV_RN64A(row) & ~ROW0_MASK) | AV_RN64A(row+4)) == 0) {
         uint64_t temp;
         if (DC_SHIFT - extra_shift >= 0) {
@@ -288,42 +288,42 @@
 static inline void FUNC6(idctSparseColAdd)(pixel *dest, ptrdiff_t line_size,
                                           idctin *col)
 {
-    int a0, a1, a2, a3, b0, b1, b2, b3;
+    unsigned a0, a1, a2, a3, b0, b1, b2, b3;
 
     IDCT_COLS;
 
-    dest[0] = av_clip_pixel(dest[0] + ((a0 + b0) >> COL_SHIFT));
+    dest[0] = av_clip_pixel(dest[0] + ((int)(a0 + b0) >> COL_SHIFT));
     dest += line_size;
-    dest[0] = av_clip_pixel(dest[0] + ((a1 + b1) >> COL_SHIFT));
+    dest[0] = av_clip_pixel(dest[0] + ((int)(a1 + b1) >> COL_SHIFT));
     dest += line_size;
-    dest[0] = av_clip_pixel(dest[0] + ((a2 + b2) >> COL_SHIFT));
+    dest[0] = av_clip_pixel(dest[0] + ((int)(a2 + b2) >> COL_SHIFT));
     dest += line_size;
-    dest[0] = av_clip_pixel(dest[0] + ((a3 + b3) >> COL_SHIFT));
+    dest[0] = av_clip_pixel(dest[0] + ((int)(a3 + b3) >> COL_SHIFT));
     dest += line_size;
-    dest[0] = av_clip_pixel(dest[0] + ((a3 - b3) >> COL_SHIFT));
+    dest[0] = av_clip_pixel(dest[0] + ((int)(a3 - b3) >> COL_SHIFT));
     dest += line_size;
-    dest[0] = av_clip_pixel(dest[0] + ((a2 - b2) >> COL_SHIFT));
+    dest[0] = av_clip_pixel(dest[0] + ((int)(a2 - b2) >> COL_SHIFT));
     dest += line_size;
-    dest[0] = av_clip_pixel(dest[0] + ((a1 - b1) >> COL_SHIFT));
+    dest[0] = av_clip_pixel(dest[0] + ((int)(a1 - b1) >> COL_SHIFT));
     dest += line_size;
-    dest[0] = av_clip_pixel(dest[0] + ((a0 - b0) >> COL_SHIFT));
+    dest[0] = av_clip_pixel(dest[0] + ((int)(a0 - b0) >> COL_SHIFT));
 }
 
 static inline void FUNC6(idctSparseCol)(idctin *col)
 #endif
 {
-    int a0, a1, a2, a3, b0, b1, b2, b3;
+    unsigned a0, a1, a2, a3, b0, b1, b2, b3;
 
     IDCT_COLS;
 
-    col[0 ] = ((a0 + b0) >> COL_SHIFT);
-    col[8 ] = ((a1 + b1) >> COL_SHIFT);
-    col[16] = ((a2 + b2) >> COL_SHIFT);
-    col[24] = ((a3 + b3) >> COL_SHIFT);
-    col[32] = ((a3 - b3) >> COL_SHIFT);
-    col[40] = ((a2 - b2) >> COL_SHIFT);
-    col[48] = ((a1 - b1) >> COL_SHIFT);
-    col[56] = ((a0 - b0) >> COL_SHIFT);
+    col[0 ] = ((int)(a0 + b0) >> COL_SHIFT);
+    col[8 ] = ((int)(a1 + b1) >> COL_SHIFT);
+    col[16] = ((int)(a2 + b2) >> COL_SHIFT);
+    col[24] = ((int)(a3 + b3) >> COL_SHIFT);
+    col[32] = ((int)(a3 - b3) >> COL_SHIFT);
+    col[40] = ((int)(a2 - b2) >> COL_SHIFT);
+    col[48] = ((int)(a1 - b1) >> COL_SHIFT);
+    col[56] = ((int)(a0 - b0) >> COL_SHIFT);
 }
 
 #ifndef EXTRA_SHIFT
diff --git a/libavcodec/sinewin.h b/libavcodec/sinewin.h
index 6b97a71..329e9bb 100644
--- a/libavcodec/sinewin.h
+++ b/libavcodec/sinewin.h
@@ -38,6 +38,9 @@
 #define SINETABLE(size) \
     SINETABLE_CONST DECLARE_ALIGNED(32, INTFLOAT, AAC_RENAME(ff_sine_##size))[size]
 
+#define SINETABLE120960(size) \
+    DECLARE_ALIGNED(32, INTFLOAT, AAC_RENAME(ff_sine_##size))[size]
+
 /**
  * Generate a sine window.
  * @param   window  pointer to half window
@@ -52,11 +55,11 @@
 
 extern SINETABLE(  32);
 extern SINETABLE(  64);
-extern SINETABLE( 120);
+extern SINETABLE120960(120);
 extern SINETABLE( 128);
 extern SINETABLE( 256);
 extern SINETABLE( 512);
-extern SINETABLE( 960);
+extern SINETABLE120960(960);
 extern SINETABLE(1024);
 extern SINETABLE(2048);
 extern SINETABLE(4096);
diff --git a/libavcodec/sinewin_tablegen.h b/libavcodec/sinewin_tablegen.h
index 0fa3561..dc52234 100644
--- a/libavcodec/sinewin_tablegen.h
+++ b/libavcodec/sinewin_tablegen.h
@@ -32,8 +32,8 @@
 #include "libavutil/common.h"
 
 #if !USE_FIXED
-SINETABLE( 120);
-SINETABLE( 960);
+SINETABLE120960(120);
+SINETABLE120960(960);
 #endif
 #if !CONFIG_HARDCODED_TABLES
 SINETABLE(  32);
diff --git a/libavcodec/sinewin_tablegen_template.c b/libavcodec/sinewin_tablegen_template.c
index 43ce1ba..b8eb407 100644
--- a/libavcodec/sinewin_tablegen_template.c
+++ b/libavcodec/sinewin_tablegen_template.c
@@ -33,6 +33,8 @@
 #define SINETABLE_CONST
 #define SINETABLE(size) \
     INTFLOAT AAC_RENAME(ff_sine_##size)[size]
+#define SINETABLE120960(size) \
+    INTFLOAT AAC_RENAME(ff_sine_##size)[size]
 #define FF_ARRAY_ELEMS(a) (sizeof(a) / sizeof((a)[0]))
 #include "sinewin_tablegen.h"
 #include "tableprint.h"
diff --git a/libavcodec/siren.c b/libavcodec/siren.c
new file mode 100644
index 0000000..1c17d45
--- /dev/null
+++ b/libavcodec/siren.c
@@ -0,0 +1,780 @@
+/*
+ * Siren audio decoder
+ * Copyright (c) 2012 Youness Alaoui <kakaroto@kakaroto.homelinux.net>
+ * Copyright (c) 2018 Paul B Mahol
+ * Copyright (c) 2019 Lynne <dev@lynne.ee>
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "libavutil/tx.h"
+#include "libavutil/float_dsp.h"
+
+#include "avcodec.h"
+#include "get_bits.h"
+#include "internal.h"
+#include "mathops.h"
+
+static const uint8_t index_table[8] = {4, 4, 3, 3, 2, 2, 1, 0};
+static const uint8_t vector_dimension[8] = { 2, 2, 2, 4, 4, 5, 5, 1 };
+static const uint8_t number_of_vectors[8] = { 10, 10, 10, 5, 5, 4, 4, 20 };
+static const uint8_t expected_bits_table[8] = { 52, 47, 43, 37, 29, 22, 16, 0 };
+static const int8_t differential_decoder_tree[27][24][2] = {
+    {
+        {1, 2}, {3, 4}, {5, 6}, {7, 8}, {9, 10}, {11, -12}, {-11, -10}, {-8, -9}, {-7, -6}, {-13, 12},
+        {-5, -4}, {0, 13}, {-3, -14}, {-2, 14}, {-1, 15}, {-15, 16}, {-16, 17}, {-17, 18}, {19, 20},
+        {21, 22}, {-18, -19}, {-20, -21}, {-22, -23}, {-32, -32}
+    },
+    {
+        {1, 2}, {3, 4}, {5, 6}, {7, 8}, {-10, -9}, {-8, -11}, {-7, -6}, {9, -5}, {10, -12}, {-4, 11},
+        {-13, -3}, {12, -2}, {13, -14}, {-1, 14}, {15, -15}, {0, 16}, {-16, 17}, {-17, 18}, {-18, 19},
+        {20, 21},{22, -19}, {-20, -21}, {-22, -23}, {-32, -32}
+    },
+    {
+        {1, 2}, {3, 4}, {5, 6}, {7, 8}, {9, 10}, {-12, 11}, {-11, -13}, {-10, -9}, {12, -14}, {-8, -7},
+        {-15, -6}, {13, -5}, {-16, -4}, {14, -17}, {15, -3}, {16, -18}, {-2, 17}, {18, -19}, {-1, 19},
+        {-20, 20}, {0, 21}, {22, -21}, {-22, -23}, {-32, -32}
+    },
+    {
+        {1, 2}, {3, 4}, {5, 6}, {-11, -10}, {7, -12}, {8, -9}, {9, -13}, {-14, 10}, {-8, -15}, {-16, 11},
+        {-7, 12}, {-17, -6}, {13, 14}, {-18, 15}, {-5, -4}, {16, 17}, {-3, -2}, {-19, 18}, {-1, 19},
+        {-20, 20}, {21, 22}, {0, -21}, {-22, -23}, {-32, -32}
+    },
+    {
+        {1, 2}, {3, 4}, {5, 6}, {-12, -11}, {-13, 7}, {8, -14}, {-10, 9}, {10, -15}, {-9, 11}, {-8, 12},
+        {-16, 13}, {-7, -6}, {-17, 14}, {-5, -18}, {15, -4}, {16, -19}, {17, -3}, {-20, 18}, {-2, 19},
+        {-21, 20}, {0, 21}, {22, -1}, {-22, -23}, {-32, -32}
+    },
+    {
+        {1, 2}, {3, 4}, {5, 6}, {-11, 7}, {-12, -10}, {-13, -9}, {8, 9}, {-14, -8}, {10, -15}, {-7, 11},
+        {-16, 12}, {-6, -17}, {13, 14}, {-5, 15}, {-18, 16}, {-4, 17}, {-3, -19}, {18, -2}, {-20, 19},
+        {-1, 20}, {0, 21}, {22, -21}, {-22, -23}, {-32, -32}
+    },
+    {
+        {1, 2}, {3, 4}, {5, -12}, {6, -11}, {-10, -13}, {-9, 7}, {8, -14}, {9, -8}, {-15, 10}, {-7, -16},
+        {11, -6}, {12, -17}, {13, -5}, {-18, 14}, {15, -4}, {-19, 16}, {17, -3}, {-20, 18}, {19, 20},
+        {21, 22}, {0, -2}, {-1, -21}, {-22, -23}, {-32, -32}
+    },
+    {
+        {1, 2}, {3, 4}, {5, -12}, {6, -13}, {-11, -10}, {7, -14}, {8, -9}, {9, -15}, {-8, 10}, {-7, -16},
+        {11, 12}, {-6, -17}, {-5, 13}, {14, 15}, {-18, -4}, {-19, 16}, {-3, 17}, {18, -2}, {-20, 19},
+        {20, 21}, {22, 0}, {-1, -21}, {-22, -23}, {-32, -32}
+    },
+    {
+        {1, 2}, {3, 4}, {5, 6}, {-11, -10}, {-12, -9}, {7, 8}, {-13, -8}, {9, -14}, {-7, 10}, {-6, -15},
+        {11, 12}, {-5, -16}, {13, 14}, {-17, 15}, {-4, 16}, {17, -18}, {18, -3}, {-2, 19}, {-1, 0},
+        {-19, 20}, {-20, 21}, {22, -21}, {-22, -23}, {-32, -32}
+    },
+    {
+        {1, 2}, {3, 4}, {5, 6}, {-11, 7}, {-10, -12}, {-9, 8}, {-8, -13}, {9, -7}, {10, -14}, {-6, 11},
+        {-15, 12}, {-5, 13}, {-16, -4}, {14, 15}, {-17, -3}, {-18, 16}, {17, -19}, {-2, 18}, {-20, 19},
+        {-1, 20}, {21, 22}, {0, -21}, {-22, -23}, {-32, -32}
+    },
+    {
+        {1, 2}, {3, 4}, {5, -12}, {6, -11}, {7, 8}, {-10, -13}, {-9, 9}, {-8, -14}, {10, -7}, {11, -15},
+        {-6, 12}, {-5, 13}, {-4, -16}, {14, 15}, {-3, -17}, {16, 17}, {-18, -2}, {18, -19}, {-1, 19},
+        {-20, 20}, {-21, 21}, {22, 0}, {-22, -23}, {-32, -32}
+    },
+    {
+        {1, 2}, {3, 4}, {5, -12}, {-13, 6}, {-11, 7}, {-14, 8}, {-10, 9}, {-15, -9}, {-8, 10}, {-7, -16},
+        {11, -6}, {12, -5}, {-17, 13}, {14, -18}, {15, -4}, {16, -19}, {17, -3}, {18, -2}, {19, -1},
+        {-20, 20}, {21, 22}, {0, -21}, {-22, -23}, {-32, -32}
+    },
+    {
+        {1, 2}, {3, 4}, {-12, 5}, {-11, -13}, {6, -14}, {-10, 7}, {8, -15}, {-9, 9}, {-16, 10}, {-8, -17},
+        {11, 12}, {-7, -18}, {-6, 13}, {14, -5}, {15, -19}, {-4, 16}, {-20, 17}, {18, 19}, {20, 21},
+        {22, 0}, {-1, -3}, {-2, -21}, {-22, -23}, {-32, -32}
+    },
+    {
+        {1, 2}, {3, 4}, {-12, 5}, {-11, -13}, {6, -14}, {-10, 7}, {8, -15}, {-9, 9}, {-16, 10}, {-8, -17},
+        {11, 12}, {-7, -18}, {-6, 13}, {14, -5}, {15, -19}, {-4, 16}, {-20, 17}, {18, 19}, {20, 21},
+        {22, 0}, {-1, -3}, {-2, -21}, {-22, -23}, {-32, -32}
+    },
+    {
+        {1, 2}, {3, 4}, {-12, 5}, {-11, -13}, {6, -14}, {-10, 7}, {8, -15}, {-9, 9}, {-16, 10}, {-8, -17},
+        {11, 12}, {-7, -18}, {-6, 13}, {14, -5}, {15, -19}, {-4, 16}, {-20, 17}, {18, 19}, {20, 21},
+        {22, 0}, {-1, -3}, {-2, -21}, {-22, -23}, {-32, -32}
+    },
+    {
+        {1, 2}, {3, 4}, {-12, 5}, {-11, -13}, {6, -14}, {-10, 7}, {8, -15}, {-9, 9}, {-16, 10}, {-8, -17},
+        {11, 12}, {-7, -18}, {-6, 13}, {14, -5}, {15, -19}, {-4, 16}, {-20, 17}, {18, 19}, {20, 21},
+        {22, 0}, {-1, -3}, {-2, -21}, {-22, -23}, {-32, -32}
+    },
+    {
+        {1, 2}, {3, 4}, {-12, 5}, {-11, -13}, {6, -14}, {-10, 7}, {8, -15}, {-9, 9}, {-16, 10}, {-8, -17},
+        {11, 12}, {-7, -18}, {-6, 13}, {14, -5}, {15, -19}, {-4, 16}, {-20, 17}, {18, 19}, {20, 21},
+        {22, 0}, {-1, -3}, {-2, -21}, {-22, -23}, {-32, -32}
+    },
+    {
+        {1, 2}, {3, 4}, {-12, 5}, {-11, -13}, {6, -14}, {-10, 7}, {8, -15}, {-9, 9}, {-16, 10}, {-8, -17},
+        {11, 12}, {-7, -18}, {-6, 13}, {14, -5}, {15, -19}, {-4, 16}, {-20, 17}, {18, 19}, {20, 21},
+        {22, 0}, {-1, -3}, {-2, -21}, {-22, -23}, {-32, -32}
+    },
+    {
+        {1, 2}, {3, 4}, {-12, 5}, {-11, -13}, {6, -14}, {-10, 7}, {8, -15}, {-9, 9}, {-16, 10}, {-8, -17},
+        {11, 12}, {-7, -18}, {-6, 13}, {14, -5}, {15, -19}, {-4, 16}, {-20, 17}, {18, 19}, {20, 21},
+        {22, 0}, {-1, -3}, {-2, -21}, {-22, -23}, {-32, -32}
+    },
+    {
+        {1, 2}, {3, 4}, {-12, 5}, {-11, -13}, {6, -14}, {-10, 7}, {8, -15}, {-9, 9}, {-16, 10}, {-8, -17},
+        {11, 12}, {-7, -18}, {-6, 13}, {14, -5}, {15, -19}, {-4, 16}, {-20, 17}, {18, 19}, {20, 21},
+        {22, 0}, {-1, -3}, {-2, -21}, {-22, -23}, {-32, -32}
+    },
+    {
+        {1, 2}, {3, 4}, {-12, 5}, {-11, -13}, {6, -14}, {-10, 7}, {8, -15}, {-9, 9}, {-16, 10}, {-8, -17},
+        {11, 12}, {-7, -18}, {-6, 13}, {14, -5}, {15, -19}, {-4, 16}, {-20, 17}, {18, 19}, {20, 21},
+        {22, 0}, {-1, -3}, {-2, -21}, {-22, -23}, {-32, -32}
+    },
+    {
+        {1, 2}, {3, 4}, {-12, 5}, {-11, -13}, {6, -14}, {-10, 7}, {8, -15}, {-9, 9}, {-16, 10}, {-8, -17},
+        {11, 12}, {-7, -18}, {-6, 13}, {14, -5}, {15, -19}, {-4, 16}, {-20, 17}, {18, 19}, {20, 21},
+        {22, 0}, {-1, -3}, {-2, -21}, {-22, -23}, {-32, -32}
+    },
+    {
+        {1, 2}, {3, 4}, {-12, 5}, {-11, -13}, {6, -14}, {-10, 7}, {8, -15}, {-9, 9}, {-16, 10}, {-8, -17},
+        {11, 12}, {-7, -18}, {-6, 13}, {14, -5}, {15, -19}, {-4, 16}, {-20, 17}, {18, 19}, {20, 21},
+        {22, 0}, {-1, -3}, {-2, -21}, {-22, -23}, {-32, -32}
+    },
+    {
+        {1, 2}, {3, 4}, {-12, 5}, {-11, -13}, {6, -14}, {-10, 7}, {8, -15}, {-9, 9}, {-16, 10}, {-8, -17},
+        {11, 12}, {-7, -18}, {-6, 13}, {14, -5}, {15, -19}, {-4, 16}, {-20, 17}, {18, 19}, {20, 21},
+        {22, 0}, {-1, -3}, {-2, -21}, {-22, -23}, {-32, -32}
+    },
+    {
+        {1, 2}, {3, 4}, {-12, 5}, {-11, -13}, {6, -14}, {-10, 7}, {8, -15}, {-9, 9}, {-16, 10}, {-8, -17},
+        {11, 12}, {-7, -18}, {-6, 13}, {14, -5}, {15, -19}, {-4, 16}, {-20, 17}, {18, 19}, {20, 21},
+        {22, 0}, {-1, -3}, {-2, -21}, {-22, -23}, {-32, -32}
+    },
+    {
+        {1, 2}, {3, 4}, {-12, 5}, {-11, -13}, {6, -14}, {-10, 7}, {8, -15}, {-9, 9}, {-16, 10}, {-8, -17},
+        {11, 12}, {-7, -18}, {-6, 13}, {14, -5}, {15, -19}, {-4, 16}, {-20, 17}, {18, 19}, {20, 21},
+        {22, 0}, {-1, -3}, {-2, -21}, {-22, -23}, {-32, -32}
+    },
+    {
+        {1, 2}, {3, 4}, {-12, 5}, {-11, -13}, {6, -14}, {-10, 7}, {8, -15}, {-9, 9}, {-16, 10}, {-8, -17},
+        {11, 12}, {-7, -18}, {-6, 13}, {14, -5}, {15, -19}, {-4, 16}, {-20, 17}, {18, 19}, {20, 21},
+        {22, 0}, {-1, -3}, {-2, -21}, {-22, -23}, {-32, -32}
+    },
+};
+
+static const uint16_t decoder_tree0[360] = {
+    2, 1, 4, 6, 8, 10, 12, 14, 16, 18, 33, 3, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 35, 40,
+    42, 44, 46, 5, 48, 65, 50, 52, 54, 56, 58, 60, 62, 64, 37, 66, 67, 68, 97, 70, 72, 74, 7,
+    76, 78, 80, 82, 84, 86, 88, 99, 90, 39, 92, 94, 96, 129, 98, 9, 100, 102, 104, 106, 108,
+    110, 112, 41, 161, 69, 114, 116, 118, 131, 120, 122, 11, 124, 126, 128, 193, 130, 132, 71,
+    134, 43, 136, 138, 140, 163, 101, 13, 142, 144, 146, 148, 150, 152, 154, 225, 156, 158, 195,
+    160, 162, 45, 164, 15, 166, 73, 168, 170, 133, 47, 172, 257, 174, 176, 178, 75, 103, 180, 165,
+    182, 17, 227, 184, 105, 49, 135, 186, 289, 188, 259, 190, 192, 194, 196, 198, 291, 77, 200,
+    202, 197, 107, 204, 19, 51, 229, 206, 167, 208, 210, 212, 214, 21, 79, 81, 109, 216, 218, 220,
+    222, 53, 137, 224, 199, 226, 323, 321, 169, 228, 111, 230, 232, 139, 261, 234, 83, 236, 201,
+    238, 240, 293, 242, 353, 231, 141, 244, 246, 113, 23, 355, 85, 248, 55, 115, 250, 263, 252,
+    254, 203, 171, 256, 258, 233, 235, 143, 357, 325, 260, 295, 262, 173, 145, 177, 87, 264, 327,
+    267, 266, 268, 175, 270, 272, 117, 297, 274, 265, 147, 179, 205, 276, 207, 237, 269, 278, 57,
+    59, 387, 209, 280, 282, 149, 329, 385, 284, 25, 286, 239, 119, 288, 27, 290, 292, 299, 294, 359,
+    89, 296, 298, 419, 181, 300, 331, 271, 417, 211, 361, 151, 389, 241, 302, 304, 303, 306, 308,
+    421, 91, 310, 312, 391, 314, 121, 316, 333, 318, 275, 213, 301, 243, 183, 335, 320, 363, 322,
+    215, 324, 393, 273, 337, 153, 326, 423, 365, 328, 367, 247, 395, 185, 123, 330, 425, 245, 155,
+    332, 334, 305, 397, 336, 277, 217, 338, 340, 339, 427, 342, 344, 346, 307, 399, 187, 348, 309,
+    341, 350, 369, 279, 311, 429, 249, 219, 352, 354, 356, 358, 431, 373, 401, 371, 313, 281, 433,
+    343, 403, 251, 283
+};
+
+static const uint16_t decoder_tree1[188] = {
+    2, 1, 4, 6, 8, 10, 12, 14, 16, 3, 33, 18, 20, 22, 24, 26, 35, 28, 30, 32, 34, 36, 5, 65, 38, 40,
+    37, 42, 44, 46, 67, 48, 50, 52, 54, 56, 58, 60, 7, 62, 39, 97, 64, 69, 66, 99, 68, 70, 72, 74, 76,
+    78, 80, 129, 41, 131, 82, 9, 71, 84, 86, 101, 88, 90, 92, 94, 96, 161, 43, 11, 73, 98, 103, 100,
+    163, 102, 104, 106, 108, 133, 110, 105, 112, 75, 114, 45, 13, 116, 165, 118, 195, 135, 193, 120, 77,
+    122, 47, 124, 167, 225, 126, 79, 107, 227, 128, 137, 197, 15, 130, 169, 199, 132, 109, 134, 17, 139,
+    49, 136, 229, 138, 140, 81, 259, 142, 144, 171, 146, 141, 148, 111, 150, 201, 231, 152, 51, 257, 289,
+    154, 19, 113, 156, 261, 158, 203, 173, 263, 143, 160, 291, 235, 83, 162, 233, 265, 164, 205, 166, 293,
+    145, 168, 175, 177, 237, 115, 295, 170, 207, 172, 267, 174, 176, 297, 147, 178, 180, 269, 182, 271,
+    209, 299, 239, 179, 184, 301, 241, 211, 0, 0
+};
+
+static const uint16_t decoder_tree2[96] = {
+    2, 1, 4, 6, 8, 10, 12, 3, 17, 14, 19, 16, 18, 20, 22, 24, 26, 5, 21, 35, 33, 28, 30, 32, 34, 36, 38, 37,
+    40, 23, 51, 42, 7, 49, 44, 46, 48, 50, 39, 53, 52, 54, 56, 25, 67, 9, 58, 60, 65, 55, 41, 62, 64, 69, 66,
+    11, 27, 68, 57, 83, 70, 71, 81, 43, 72, 74, 13, 76, 85, 29, 73, 78, 99, 59, 87, 101, 80, 97, 45, 82, 84,
+    75, 89, 61, 86, 103, 88, 77, 90, 105, 91, 92, 107, 93, 0, 0
+};
+
+static const uint16_t decoder_tree3[1040] = {
+    2, 4, 6, 8, 10, 1, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 3, 36, 1025, 38, 40, 42, 44, 46, 48, 50,
+    129, 17, 52, 54, 1153, 19, 56, 58, 60, 62, 64, 66, 68, 145, 70, 72, 74, 76, 78, 1169, 1027, 147, 80, 82, 1171,
+    84, 86, 131, 88, 1155, 1043, 1041, 90, 92, 5, 94, 96, 98, 100, 102, 104, 21, 106, 108, 2049, 2177, 110, 112, 114,
+    116, 118, 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 33, 144, 163, 146, 148, 150, 152, 154, 161,
+    156, 35, 158, 1297, 160, 162, 273, 257, 164, 166, 149, 168, 1281, 170, 172, 2193, 174, 176, 178, 1299, 180, 1045,
+    182, 184, 1173, 186, 3201, 188, 190, 192, 194, 2195, 1187, 23, 2179, 196, 7, 198, 275, 200, 2051, 202, 2065, 204,
+    206, 1029, 1185, 208, 210, 1157, 37, 3073, 2067, 133, 212, 214, 2321, 216, 165, 218, 1059, 220, 1283, 222, 2305,
+    224, 226, 228, 230, 259, 232, 234, 2323, 236, 1409, 1057, 1315, 238, 240, 242, 244, 246, 1425, 248, 1313, 250, 252,
+    254, 256, 258, 260, 289, 262, 264, 1189, 266, 268, 179, 151, 270, 272, 274, 276, 278, 291, 280, 282, 9, 385, 284,
+    286, 177, 49, 401, 1061, 288, 290, 292, 51, 294, 296, 298, 300, 302, 304, 25, 306, 2083, 39, 308, 310, 3329, 167,
+    312, 314, 1175, 316, 318, 1203, 135, 320, 322, 324, 326, 328, 2211, 2307, 330, 1301, 332, 334, 1047, 336, 338, 2449,
+    3217, 340, 1427, 2209, 53, 342, 2339, 3345, 344, 346, 348, 403, 181, 4097, 2197, 350, 2181, 1285, 1317, 1031, 352,
+    354, 356, 3089, 358, 360, 4225, 277, 362, 364, 366, 368, 2069, 370, 3203, 293, 1201, 305, 372, 3219, 307, 2433, 374,
+    376, 378, 380, 2081, 1411, 382, 384, 3075, 1443, 513, 386, 387, 388, 390, 1331, 261, 392, 394, 396, 398, 400, 1441,
+    1075, 67, 1159, 402, 404, 406, 408, 410, 412, 414, 3347, 2325, 416, 65, 418, 420, 422, 424, 426, 2053, 193, 1073, 428,
+    430, 432, 1537, 1329, 2337, 2213, 434, 417, 183, 41, 436, 438, 440, 442, 444, 446, 448, 450, 195, 2435, 452, 2085, 1063,
+    1191, 454, 456, 458, 460, 419, 2071, 1553, 3091, 55, 137, 462, 464, 466, 468, 470, 472, 474, 476, 478, 2309, 4113, 480,
+    482, 484, 486, 2451, 2465, 1205, 153, 488, 490, 492, 494, 496, 498, 500, 502, 504, 506, 508, 510, 512, 514, 516, 518,
+    520, 522, 524, 1333, 526, 1555, 2467, 2227, 3205, 3331, 528, 530, 532, 534, 536, 538, 540, 542, 544, 546, 548, 529, 309,
+    1303, 3473, 3457, 389, 1569, 1445, 1077, 69, 2199, 1539, 4353, 550, 552, 554, 556, 558, 560, 562, 1459, 4241, 3221, 1429,
+    2341, 279, 3475, 169, 564, 545, 3105, 323, 2353, 2097, 3235, 421, 2229, 3107, 3233, 566, 568, 570, 572, 574, 576, 578,
+    580, 582, 584, 586, 588, 590, 592, 594, 596, 2099, 1091, 531, 2437, 4227, 405, 197, 263, 1287, 2577, 1049, 1571, 598, 600,
+    602, 604, 606, 608, 610, 612, 614, 616, 618, 620, 622, 624, 626, 628, 630, 632, 634, 636, 638, 640, 642, 644, 646, 648, 650,
+    1345, 1219, 3077, 1457, 2225, 2579, 515, 2561, 2469, 433, 1221, 2183, 4243, 652, 654, 656, 658, 660, 662, 664, 666, 668,
+    670, 1217, 3333, 3093, 435, 321, 4369, 1089, 2055, 4099, 3361, 1319, 547, 1161, 1177, 672, 2355, 4115, 1413, 4257, 3349,
+    2453, 3109, 2357, 2215, 3363, 1079, 1207, 311, 1033, 1347, 1065, 674, 676, 678, 680, 682, 684, 686, 688, 690, 692, 694, 696,
+    698, 700, 702, 704, 706, 708, 710, 712, 714, 716, 718, 720, 722, 724, 726, 728, 730, 732, 734, 736, 738, 740, 742, 744, 746,
+    748, 750, 752, 754, 756, 758, 760, 762, 764, 766, 768, 770, 772, 774, 776, 778, 780, 782, 784, 786, 788, 790, 792, 794, 796,
+    798, 800, 802, 804, 806, 808, 810, 812, 814, 2593, 2565, 4261, 3253, 437, 325, 3489, 2311, 4259, 1431, 2087, 2563, 295, 2343,
+    449, 199, 265, 2201, 4371, 1193, 816, 533, 1557, 2581, 2241, 3365, 3491, 3603, 549, 2101, 1461, 1093, 2117, 3459, 3079, 4481,
+    3095, 2327, 3461, 4129, 3249, 1447, 2471, 2231, 71, 4497, 2609, 1289, 393, 3251, 2073, 3097, 2371, 1305, 2089, 818, 820, 822,
+    824, 826, 828, 830, 832, 834, 836, 838, 840, 842, 844, 846, 848, 850, 852, 854, 856, 858, 860, 862, 864, 866, 868, 870, 872,
+    874, 876, 878, 880, 882, 884, 886, 888, 890, 892, 894, 896, 898, 900, 902, 904, 906, 908, 910, 912, 914, 916, 918, 920, 922,
+    924, 926, 928, 930, 932, 934, 936, 938, 940, 942, 944, 946, 948, 950, 952, 954, 956, 958, 960, 962, 964, 966, 968, 970, 972,
+    974, 976, 978, 980, 982, 984, 986, 988, 990, 992, 994, 996, 998, 1000, 1002, 1004, 1006, 1008, 1010, 1012, 1014, 1016, 1018,
+    1020, 1022, 1024, 1026, 1028, 1030, 1032, 1034, 1036, 4161, 4273, 3507, 3493, 4517, 2497, 1573, 2597, 3621, 4531, 4627, 3523,
+    3125, 4149, 4529, 3139, 4515, 451, 4277, 2113, 4163, 4499, 3381, 4405, 1473, 4373, 2485, 3509, 565, 1589, 2613, 3585, 3123,
+    4403, 3141, 4147, 563, 2245, 3269, 4357, 1349, 2373, 3397, 453, 1477, 2501, 2481, 579, 1601, 3477, 4103, 3265, 2243, 1587,
+    3207, 4231, 3267, 4501, 1475, 3335, 4359, 391, 1415, 2439, 3463, 4487, 519, 1543, 2567, 3591, 4609, 4289, 4611, 2499, 4119,
+    4385, 4145, 4401, 3223, 4247, 3379, 577, 3393, 3351, 4375, 407, 1585, 2455, 3479, 4503, 535, 1559, 2583, 3607, 3605, 4513,
+    4485, 3111, 4135, 3121, 517, 3377, 3239, 4263, 1541, 4291, 4229, 3367, 4391, 423, 2115, 4131, 3495, 551, 1575, 2599, 3635, 3395,
+    2103, 3127, 4151, 3589, 4101, 1603, 3255, 4279, 3601, 1335, 2359, 3383, 439, 1463, 2487, 3511, 567, 1591, 4133, 1095, 2119, 3143,
+    2369, 1223, 2247, 3271, 327, 1351, 2375, 455, 1479, 3137, 3521, 2057, 3081, 4105, 4387, 3505, 2185, 3209, 4233, 3587, 4355, 2313,
+    3337, 3237, 1417, 2441, 3465, 521, 1545, 3617, 3633, 561, 4625, 4121, 2611, 2483, 2595, 3225, 4249, 281, 4245, 2329, 3353, 409,
+    1433, 2457, 3481, 537, 1561, 4483, 3619, 4389, 3113, 4275, 4117, 2217, 3241, 297, 1321, 2345, 3369, 425, 1449, 2473, 57, 1081,
+    2105, 3129, 185, 1209, 2233, 3257, 313, 1337, 2361, 441, 1465, 73, 1097, 201, 1225, 0, 0
+};
+
+static const uint16_t decoder_tree4[416] = {
+    2, 4, 6, 1, 8, 10, 12, 14, 16, 18, 20, 22, 24, 3, 129, 26, 28, 9, 33, 30, 32,
+    34, 36, 11, 161, 38, 40, 42, 41, 44, 46, 131, 43, 169, 35, 48, 137, 50, 52, 54, 56, 139,
+    163, 171, 58, 60, 62, 64, 5, 66, 68, 70, 257, 72, 74, 76, 13, 78, 80, 289, 82, 84, 17,
+    86, 88, 65, 90, 201, 19, 92, 94, 51, 193, 96, 98, 49, 100, 73, 102, 104, 106, 45, 108, 110,
+    297, 112, 114, 116, 37, 203, 118, 120, 179, 122, 177, 124, 265, 126, 75, 133, 259, 291, 147, 128, 67,
+    195, 130, 141, 173, 299, 132, 145, 134, 165, 136, 138, 140, 142, 7, 144, 146, 21, 267, 148, 53, 150,
+    321, 152, 154, 15, 156, 81, 158, 160, 385, 162, 417, 164, 166, 168, 83, 170, 172, 329, 174, 211, 176,
+    27, 178, 180, 182, 209, 184, 186, 188, 190, 25, 192, 331, 194, 196, 105, 57, 198, 97, 200, 202, 323,
+    225, 59, 149, 204, 206, 233, 307, 208, 77, 181, 210, 212, 214, 216, 218, 220, 222, 47, 224, 226, 69,
+    228, 230, 197, 232, 425, 393, 205, 275, 293, 39, 234, 236, 238, 305, 135, 155, 301, 143, 240, 242, 235,
+    395, 244, 246, 248, 250, 252, 254, 256, 258, 260, 262, 273, 269, 185, 264, 266, 268, 270, 272, 274, 276,
+    261, 153, 278, 280, 282, 187, 337, 387, 107, 284, 427, 227, 167, 419, 286, 288, 290, 292, 294, 296, 298,
+    300, 302, 304, 306, 308, 310, 312, 314, 316, 318, 320, 322, 324, 326, 328, 330, 332, 334, 336, 338, 115,
+    99, 85, 213, 29, 113, 23, 89, 241, 61, 449, 339, 175, 340, 342, 344, 346, 348, 350, 352, 354, 356,
+    358, 360, 362, 364, 366, 368, 370, 372, 374, 376, 378, 380, 382, 384, 386, 388, 390, 392, 394, 396, 398,
+    400, 402, 404, 406, 408, 410, 412, 414, 389, 361, 457, 465, 429, 451, 333, 109, 277, 243, 263, 295, 199,
+    283, 151, 55, 183, 229, 357, 363, 123, 491, 397, 411, 251, 313, 441, 467, 345, 433, 461, 219, 237, 365,
+    435, 353, 347, 405, 409, 217, 309, 437, 369, 371, 341, 117, 245, 249, 157, 285, 403, 189, 317, 93, 221,
+    315, 401, 481, 391, 489, 121, 421, 423, 71, 483, 327, 103, 231, 443, 459, 271, 399, 355, 91, 303, 431,
+    79, 207, 335, 111, 239, 281, 325, 279, 453, 101, 311, 87, 215, 31, 159, 63, 191
+};
+
+static const uint16_t decoder_tree5[384] = {
+    2, 4, 1, 6, 8, 10, 12, 14, 16, 18, 20, 22, 3, 513, 24, 26, 28, 9, 129, 33, 30, 32, 34, 36, 38, 40, 11, 42, 641, 44, 46, 41,
+    161, 48, 515, 50, 52, 131, 54, 35, 545, 137, 56, 58, 60, 521, 62, 43, 673, 64, 169, 66, 68, 523, 70, 163, 643, 139, 553, 72, 649, 74, 547,
+    76, 78, 80, 681, 171, 82, 84, 555, 86, 675, 88, 651, 5, 90, 92, 1025, 94, 96, 98, 683, 13,
+    100, 17, 102, 104, 106, 65, 108, 110, 257, 112, 114, 1153, 19, 116, 118, 120, 122, 124, 49, 126, 128,
+    769, 289, 130, 132, 134, 73, 136, 138, 140, 142, 193, 144, 146, 148, 150, 152, 154, 517, 156, 158, 37,
+    51, 160, 201, 162, 145, 164, 166, 168, 133, 170, 801, 45, 172, 174, 1057, 176, 178, 67, 180, 1027, 577,
+    182, 184, 186, 188, 190, 192, 194, 196, 198, 259, 200, 202, 204, 525, 177, 265, 141, 206, 208, 210, 212,
+    195, 297, 214, 75, 216, 1033, 203, 585, 1155, 1185, 267, 1161, 549, 218, 220, 657, 777, 147, 222, 224, 226,
+    228, 230, 232, 234, 236, 238, 240, 587, 645, 165, 242, 244, 246, 248, 250, 771, 291, 252, 579, 1065, 1035,
+    705, 531, 529, 659, 173, 254, 561, 653, 256, 713, 677, 557, 258, 260, 262, 264, 266, 268, 270, 272, 274,
+    276, 278, 280, 282, 284, 286, 288, 290, 292, 294, 296, 298, 300, 707, 1059, 809, 715, 563, 179, 691, 1193,
+    21, 779, 1067, 299, 1187, 302, 304, 306, 308, 310, 312, 314, 316, 318, 320, 322, 324, 326, 328, 330, 332,
+    334, 336, 338, 340, 342, 344, 346, 348, 350, 352, 354, 356, 358, 360, 362, 364, 366, 368, 370, 372, 374,
+    376, 378, 380, 83, 69, 1281, 803, 321, 1195, 1163, 811, 1323, 689, 1321, 1099, 305, 835, 1227, 331, 843, 785,
+    593, 1043, 1291, 1283, 1171, 275, 787, 1217, 833, 1075, 1313, 1219, 1203, 307, 819, 841, 595, 211, 723, 721, 817,
+    1029, 329, 81, 1157, 261, 773, 1097, 1089, 1061, 1169, 1091, 1189, 293, 805, 1201, 581, 197, 709, 1289, 273, 1037,
+    1315, 1041, 1165, 269, 781, 209, 1073, 1069, 323, 685, 1197, 301, 813, 77, 589, 205, 717, 1225, 533, 149, 661,
+    53, 565, 181, 693, 0, 0
+};
+
+static const uint16_t decoder_tree6[62] = {
+    2, 1, 4, 6, 8, 10, 12, 14, 16, 3, 33, 5, 17, 9, 18, 20, 22, 24, 26, 28, 30, 32, 34, 7, 49, 13, 25, 36, 38, 11,
+    21, 41, 35, 37, 19, 40, 42, 44, 46, 48, 50, 15, 52, 57, 29, 27, 23, 53, 54, 51, 39, 45, 43, 56, 58, 31, 55, 60,
+    61, 47, 59, 63
+};
+
+static const uint16_t *const decoder_tables[7] = {
+    decoder_tree0,
+    decoder_tree1,
+    decoder_tree2,
+    decoder_tree3,
+    decoder_tree4,
+    decoder_tree5,
+    decoder_tree6,
+};
+
+static const int decoder_tables_elements[7] = {
+    FF_ARRAY_ELEMS(decoder_tree0),
+    FF_ARRAY_ELEMS(decoder_tree1),
+    FF_ARRAY_ELEMS(decoder_tree2),
+    FF_ARRAY_ELEMS(decoder_tree3),
+    FF_ARRAY_ELEMS(decoder_tree4),
+    FF_ARRAY_ELEMS(decoder_tree5),
+    FF_ARRAY_ELEMS(decoder_tree6),
+};
+
+static const float mlt_quant[7][14] = {
+    { 0.0f, 0.392f, 0.761f, 1.120f, 1.477f, 1.832f, 2.183f, 2.541f, 2.893f, 3.245f, 3.598f, 3.942f, 4.288f, 4.724f },
+    { 0.0f, 0.544f, 1.060f, 1.563f, 2.068f, 2.571f, 3.072f, 3.562f, 4.070f, 4.620f, 0.0f, 0.0f, 0.0f, 0.0f },
+    { 0.0f, 0.746f, 1.464f, 2.180f, 2.882f, 3.584f, 4.316f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f },
+    { 0.0f, 1.006f, 2.000f, 2.993f, 3.985f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f },
+    { 0.0f, 1.321f, 2.703f, 3.983f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f },
+    { 0.0f, 1.657f, 3.491f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f },
+    { 0.0f, 1.964f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f }
+};
+
+static const float noise_category5[20] = {
+    0.70711f, 0.6179f, 0.5005f, 0.3220f, 0.17678f, 0.17678f, 0.17678f, 0.17678f, 0.17678f, 0.17678f, 0.17678f,
+    0.17678f, 0.17678f, 0.17678f, 0.17678f, 0.17678f, 0.17678f, 0.17678f, 0.17678f, 0.17678f
+};
+
+static const float noise_category6[20] = {
+    0.70711f, 0.5686f, 0.3563f, 0.25f, 0.25f, 0.25f, 0.25f, 0.25f, 0.25f, 0.25f, 0.25f, 0.25f,
+    0.25f, 0.25f, 0.25f, 0.25f, 0.25f, 0.25f, 0.25f, 0.25f
+};
+
+#define FRAME_SIZE 320
+
+typedef struct SirenContext {
+    GetBitContext gb;
+
+    int rate_control_possibilities;
+    int esf_adjustment;
+    int number_of_regions;
+    int scale_factor;
+    int sample_rate_bits;
+    int region_size;
+
+    unsigned dw1, dw2, dw3, dw4;
+
+    int absolute_region_power_index[32];
+    float decoder_standard_deviation[32];
+    int power_categories[32];
+    int category_balance[32];
+    float standard_deviation[64];
+    float backup_frame[FRAME_SIZE];
+
+    AVFloatDSPContext *fdsp;
+    av_tx_fn           tx_fn;
+    AVTXContext       *tx_ctx;
+
+    DECLARE_ALIGNED(32, float, imdct_buf)[4][FRAME_SIZE];
+    float          *window;
+    float          *imdct_in;
+    float          *imdct_out;
+    float          *imdct_prev;
+} SirenContext;
+
+static av_cold int siren_init(AVCodecContext *avctx)
+{
+    const float scale = 1.0f / (22.f * 32768.f);
+    SirenContext *s = avctx->priv_data;
+    int i;
+
+    s->imdct_in   = s->imdct_buf[0];
+    s->imdct_out  = s->imdct_buf[1];
+    s->imdct_prev = s->imdct_buf[2];
+    s->window     = s->imdct_buf[3];
+
+    avctx->channels       = 1;
+    avctx->channel_layout = AV_CH_LAYOUT_MONO;
+    avctx->sample_fmt     = AV_SAMPLE_FMT_FLT;
+
+    s->rate_control_possibilities = 16;
+    s->esf_adjustment = 7;
+    s->number_of_regions = 14;
+    s->scale_factor = 22;
+    s->region_size = 20;
+    s->dw1 = s->dw2 = s->dw3 = s->dw4 = 1;
+
+    for (i = 0; i < 64; i++) {
+        float region_power = powf(10, (i - 24) * 0.3010299957);
+
+        s->standard_deviation[i] = sqrtf(region_power);
+    }
+
+    for (i = 0; i < FRAME_SIZE; i++) {
+        float angle = ((i + 0.5f) * M_PI_2) / 320.f;
+        s->window[i] = sinf(angle);
+    }
+
+    s->fdsp = avpriv_float_dsp_alloc(avctx->flags & AV_CODEC_FLAG_BITEXACT);
+    if (!s->fdsp)
+        return AVERROR(ENOMEM);
+
+    return av_tx_init(&s->tx_ctx, &s->tx_fn, AV_TX_FLOAT_MDCT, 1, FRAME_SIZE, &scale, 0);
+}
+
+static int decode_envelope(SirenContext *s, GetBitContext *gb,
+                           int number_of_regions, float *decoder_standard_deviation,
+                           int *absolute_region_power_index, int esf_adjustment)
+{
+    absolute_region_power_index[0] = (int)get_bits(gb, 5) - esf_adjustment;
+    absolute_region_power_index[0] = av_clip(absolute_region_power_index[0], -24, 39);
+    decoder_standard_deviation[0] = s->standard_deviation[absolute_region_power_index[0] + 24];
+
+    for (int i = 1; i < number_of_regions; i++) {
+        int index = 0;
+
+        do {
+            index = differential_decoder_tree[i - 1][index][get_bits1(gb)];
+        } while (index > 0);
+
+        absolute_region_power_index[i] = av_clip(absolute_region_power_index[i - 1] - index - 12, -24, 39);
+        decoder_standard_deviation[i] = s->standard_deviation[absolute_region_power_index[i] + 24];
+    }
+
+    return get_bits_count(gb);
+}
+
+static int categorize_regions(int number_of_regions, int number_of_available_bits,
+                              int *absolute_region_power_index, int *power_categories,
+                              int *category_balance)
+{
+    int region, delta, i, temp;
+    int expected_number_of_code_bits;
+    int min, max;
+    int offset, num_rate_control_possibilities = 16,
+        raw_value, raw_max_idx = 0, raw_min_idx = 0;
+    int max_rate_categories[28];
+    int min_rate_categories[28];
+    int temp_category_balances[64];
+    int *min_rate_ptr = NULL;
+    int *max_rate_ptr = NULL;
+
+    offset = -32;
+    for (delta = 32; number_of_regions > 0 && delta > 0; delta /= 2) {
+        expected_number_of_code_bits = 0;
+        for (region = 0; region < number_of_regions; region++) {
+            i = (delta + offset -
+                 absolute_region_power_index[region]) >> 1;
+            i = av_clip_uintp2(i, 3);
+            power_categories[region] = i;
+            expected_number_of_code_bits += expected_bits_table[i];
+
+        }
+        if (expected_number_of_code_bits >= number_of_available_bits - 32)
+            offset += delta;
+    }
+
+    expected_number_of_code_bits = 0;
+    for (region = 0; region < number_of_regions; region++) {
+        i = (offset - absolute_region_power_index[region]) >> 1;
+        i = av_clip_uintp2(i, 3);
+        max_rate_categories[region] = min_rate_categories[region] =
+            power_categories[region] = i;
+        expected_number_of_code_bits += expected_bits_table[i];
+    }
+
+    min = max = expected_number_of_code_bits;
+    min_rate_ptr = max_rate_ptr =
+        temp_category_balances + num_rate_control_possibilities;
+    for (i = 0; i < num_rate_control_possibilities - 1; i++) {
+        if (min + max > number_of_available_bits * 2) {
+            raw_value = -99;
+            for (region = number_of_regions - 1; region >= 0; region--) {
+                if (min_rate_categories[region] < 7) {
+                    temp =
+                        offset - absolute_region_power_index[region] -
+                        2 * min_rate_categories[region];
+                    if (temp > raw_value) {
+                        raw_value = temp;
+                        raw_min_idx = region;
+                    }
+                }
+            }
+            if (raw_value == -99)
+                return AVERROR_INVALIDDATA;
+            *min_rate_ptr++ = raw_min_idx;
+            min +=
+                expected_bits_table[min_rate_categories[raw_min_idx] + 1] -
+                expected_bits_table[min_rate_categories[raw_min_idx]];
+            min_rate_categories[raw_min_idx]++;
+        } else {
+            raw_value = 99;
+            for (region = 0; region < number_of_regions; region++) {
+                if (max_rate_categories[region] > 0) {
+                    temp =
+                        offset - absolute_region_power_index[region] -
+                        2 * max_rate_categories[region];
+                    if (temp < raw_value) {
+                        raw_value = temp;
+                        raw_max_idx = region;
+                    }
+                }
+            }
+            if (raw_value == 99)
+                return AVERROR_INVALIDDATA;
+
+            *--max_rate_ptr = raw_max_idx;
+            max += expected_bits_table[max_rate_categories[raw_max_idx] - 1] -
+                   expected_bits_table[max_rate_categories[raw_max_idx]];
+            max_rate_categories[raw_max_idx]--;
+        }
+    }
+
+    for (region = 0; region < number_of_regions; region++)
+        power_categories[region] = max_rate_categories[region];
+
+    for (i = 0; i < num_rate_control_possibilities - 1; i++)
+        category_balance[i] = *max_rate_ptr++;
+
+    return 0;
+}
+
+static int get_dw(SirenContext *s)
+{
+    int ret = s->dw1 + s->dw4;
+
+    if ((ret & 0x8000) != 0)
+        ret++;
+
+    s->dw1 = s->dw2;
+    s->dw2 = s->dw3;
+    s->dw3 = s->dw4;
+    s->dw4 = ret;
+
+    return ret;
+}
+
+static int decode_vector(SirenContext *s, int number_of_regions,
+                         int number_of_available_bits, float *decoder_standard_deviation,
+                         int *power_categories, float *coefs, int scale_factor)
+{
+    GetBitContext *gb = &s->gb;
+    float *coefs_ptr;
+    float decoded_value;
+    float noise;
+    const uint16_t *decoder_tree;
+    int region;
+    int category;
+    int i, j;
+    int index;
+    int error = 0;
+    int dw1;
+    int dw2;
+
+    for (region = 0; region < number_of_regions; region++) {
+        category = power_categories[region];
+        coefs_ptr = coefs + (region * s->region_size);
+
+        if (category >= 0 && category < 7) {
+            decoder_tree = decoder_tables[category];
+
+            for (i = 0; i < number_of_vectors[category]; i++) {
+                index = 0;
+                do {
+                    if (get_bits_left(gb) <= 0) {
+                        error = 1;
+                        break;
+                    }
+
+                    if (index + show_bits1(gb) >= decoder_tables_elements[category]) {
+                        error = 1;
+                        break;
+                    }
+                    index = decoder_tree[index + get_bits1(gb)];
+                } while ((index & 1) == 0);
+
+                index >>= 1;
+
+                if (error == 0 && get_bits_left(gb) >= 0) {
+                    for (j = 0; j < vector_dimension[category]; j++) {
+                        decoded_value = mlt_quant[category][index & ((1 << index_table[category]) - 1)];
+                        index >>= index_table[category];
+
+                        if (decoded_value) {
+                            if (!get_bits1(gb))
+                                decoded_value *= -decoder_standard_deviation[region];
+                            else
+                                decoded_value *= decoder_standard_deviation[region];
+                        }
+
+                        *coefs_ptr++ = decoded_value * scale_factor;
+                    }
+                } else {
+                    error = 1;
+                    break;
+                }
+            }
+
+            if (error == 1) {
+                for (j = region + 1; j < number_of_regions; j++)
+                    power_categories[j] = 7;
+                category = 7;
+            }
+        }
+
+        coefs_ptr = coefs + (region * s->region_size);
+
+        if (category == 5) {
+            i = 0;
+            for (j = 0; j < s->region_size; j++) {
+                if (*coefs_ptr != 0)
+                    i++;
+                coefs_ptr++;
+            }
+
+            noise = decoder_standard_deviation[region] * noise_category5[i];
+        } else if (category == 6) {
+            i = 0;
+            for (j = 0; j < s->region_size; j++) {
+                if (*coefs_ptr++ != 0)
+                    i++;
+            }
+
+            noise = decoder_standard_deviation[region] * noise_category6[i];
+        } else if (category == 7) {
+            noise = decoder_standard_deviation[region] * 0.70711f;
+        } else {
+            noise = 0;
+        }
+
+        coefs_ptr = coefs + (region * s->region_size);
+
+        if (category == 5 || category == 6 || category == 7) {
+            dw1 = get_dw(s);
+            dw2 = get_dw(s);
+
+            for (j = 0; j < 10; j++) {
+                if (category == 7 || *coefs_ptr == 0)
+                    *coefs_ptr = dw1 & 1 ? noise : -noise;
+                coefs_ptr++;
+                dw1 >>= 1;
+
+                if (category == 7 || *coefs_ptr == 0)
+                    *coefs_ptr = dw2 & 1 ? noise : -noise;
+                coefs_ptr++;
+                dw2 >>= 1;
+            }
+        }
+    }
+
+    return error == 1 ? AVERROR_INVALIDDATA : get_bits_left(gb);
+}
+
+static int siren_decode(AVCodecContext *avctx, void *data,
+                        int *got_frame, AVPacket *avpkt)
+{
+    SirenContext *s = avctx->priv_data;
+    GetBitContext *gb = &s->gb;
+    AVFrame *frame = data;
+    int ret, number_of_valid_coefs = 20 * s->number_of_regions;
+    int frame_error = 0, rate_control = 0;
+
+    if ((ret = init_get_bits8(gb, avpkt->data, avpkt->size)) < 0)
+        return ret;
+
+    decode_envelope(s, gb, s->number_of_regions,
+                    s->decoder_standard_deviation,
+                    s->absolute_region_power_index, s->esf_adjustment);
+
+    rate_control = get_bits(gb, 4);
+
+    ret = categorize_regions(s->number_of_regions, get_bits_left(gb),
+                             s->absolute_region_power_index, s->power_categories,
+                             s->category_balance);
+    if (ret < 0)
+        return ret;
+
+    for (int i = 0; i < rate_control; i++)
+        s->power_categories[s->category_balance[i]]++;
+
+    ret = decode_vector(s, s->number_of_regions, get_bits_left(gb),
+                        s->decoder_standard_deviation, s->power_categories,
+                        s->imdct_in, s->scale_factor);
+    if (ret < 0)
+        return ret;
+
+    if (get_bits_left(gb) > 0) {
+        do {
+            frame_error |= !get_bits1(gb);
+        } while (get_bits_left(gb) > 0);
+    } else if (get_bits_left(gb) < 0 &&
+               rate_control + 1 < s->rate_control_possibilities) {
+        frame_error = 1;
+    }
+
+    for (int i = 0; i < s->number_of_regions; i++) {
+        if (s->absolute_region_power_index[i] > 33 ||
+            s->absolute_region_power_index[i] < -31)
+            frame_error = 1;
+    }
+
+    if (frame_error) {
+        memcpy(s->imdct_in, s->backup_frame, number_of_valid_coefs * sizeof(float));
+        memset(s->backup_frame, 0, number_of_valid_coefs * sizeof(float));
+    } else {
+        memcpy(s->backup_frame, s->imdct_in, number_of_valid_coefs * sizeof(float));
+    }
+
+    frame->nb_samples = FRAME_SIZE;
+    if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
+        return ret;
+
+    for (int i = 0; i < 320; i += 2)
+        s->imdct_in[i] *= -1;
+
+    s->tx_fn(s->tx_ctx, s->imdct_out, s->imdct_in, sizeof(float));
+    s->fdsp->vector_fmul_window((float *)frame->data[0],
+                                s->imdct_prev + (FRAME_SIZE >> 1),
+                                s->imdct_out, s->window,
+                                FRAME_SIZE >> 1);
+    FFSWAP(float *, s->imdct_out, s->imdct_prev);
+
+    *got_frame = 1;
+
+    return avpkt->size;
+}
+
+static av_cold void siren_flush(AVCodecContext *avctx)
+{
+    SirenContext *s = avctx->priv_data;
+
+    memset(s->backup_frame, 0, sizeof(s->backup_frame));
+    memset(s->imdct_prev, 0, FRAME_SIZE * sizeof(*s->imdct_prev));
+    memset(s->imdct_out, 0, FRAME_SIZE * sizeof(*s->imdct_out));
+}
+
+static av_cold int siren_close(AVCodecContext *avctx)
+{
+    SirenContext *s = avctx->priv_data;
+
+    av_freep(&s->fdsp);
+    av_tx_uninit(&s->tx_ctx);
+
+    return 0;
+}
+
+AVCodec ff_siren_decoder = {
+    .name           = "siren",
+    .long_name      = NULL_IF_CONFIG_SMALL("Siren"),
+    .priv_data_size = sizeof(SirenContext),
+    .type           = AVMEDIA_TYPE_AUDIO,
+    .id             = AV_CODEC_ID_SIREN,
+    .init           = siren_init,
+    .close          = siren_close,
+    .decode         = siren_decode,
+    .flush          = siren_flush,
+    .capabilities   = AV_CODEC_CAP_DR1,
+    .caps_internal  = FF_CODEC_CAP_INIT_THREADSAFE |
+                      FF_CODEC_CAP_INIT_CLEANUP,
+};
diff --git a/libavcodec/smacker.c b/libavcodec/smacker.c
index 61e3169..b4c463b 100644
--- a/libavcodec/smacker.c
+++ b/libavcodec/smacker.c
@@ -319,6 +319,7 @@
 static int decode_header_trees(SmackVContext *smk) {
     GetBitContext gb;
     int mmap_size, mclr_size, full_size, type_size, ret;
+    int skip = 0;
 
     mmap_size = AV_RL32(smk->avctx->extradata);
     mclr_size = AV_RL32(smk->avctx->extradata + 4);
@@ -330,6 +331,7 @@
         return ret;
 
     if(!get_bits1(&gb)) {
+        skip ++;
         av_log(smk->avctx, AV_LOG_INFO, "Skipping MMAP tree\n");
         smk->mmap_tbl = av_malloc(sizeof(int) * 2);
         if (!smk->mmap_tbl)
@@ -342,6 +344,7 @@
             return ret;
     }
     if(!get_bits1(&gb)) {
+        skip ++;
         av_log(smk->avctx, AV_LOG_INFO, "Skipping MCLR tree\n");
         smk->mclr_tbl = av_malloc(sizeof(int) * 2);
         if (!smk->mclr_tbl)
@@ -354,6 +357,7 @@
             return ret;
     }
     if(!get_bits1(&gb)) {
+        skip ++;
         av_log(smk->avctx, AV_LOG_INFO, "Skipping FULL tree\n");
         smk->full_tbl = av_malloc(sizeof(int) * 2);
         if (!smk->full_tbl)
@@ -366,6 +370,7 @@
             return ret;
     }
     if(!get_bits1(&gb)) {
+        skip ++;
         av_log(smk->avctx, AV_LOG_INFO, "Skipping TYPE tree\n");
         smk->type_tbl = av_malloc(sizeof(int) * 2);
         if (!smk->type_tbl)
@@ -377,6 +382,8 @@
         if (ret < 0)
             return ret;
     }
+    if (skip == 4)
+        return AVERROR_INVALIDDATA;
 
     return 0;
 }
@@ -391,6 +398,8 @@
     int v;
 
     while(*table & SMK_NODE) {
+        if (get_bits_left(gb) < 1)
+            return AVERROR_INVALIDDATA;
         if(get_bits1(gb))
             table += (*table) & (~SMK_NODE);
         table++;
@@ -421,7 +430,7 @@
     if (avpkt->size <= 769)
         return AVERROR_INVALIDDATA;
 
-    if ((ret = ff_reget_buffer(avctx, smk->pic)) < 0)
+    if ((ret = ff_reget_buffer(avctx, smk->pic, 0)) < 0)
         return ret;
 
     /* make the palette available on the way out */
@@ -455,6 +464,8 @@
         uint16_t pix;
 
         type = smk_get_code(&gb, smk->type_tbl, smk->type_last);
+        if (type < 0)
+            return type;
         run = block_runs[(type >> 2) & 0x3F];
         switch(type & 3){
         case SMK_BLK_MONO:
@@ -536,7 +547,7 @@
             while(run-- && blk < blocks){
                 uint32_t col;
                 out = smk->pic->data[0] + (blk / bw) * (stride * 4) + (blk % bw) * 4;
-                col = mode * 0x01010101;
+                col = mode * 0x01010101U;
                 for(i = 0; i < 4; i++) {
                     *((uint32_t*)out) = col;
                     out += stride;
@@ -714,8 +725,10 @@
         for(i = 0; i <= stereo; i++)
             *samples++ = pred[i];
         for(; i < unp_size / 2; i++) {
-            if(get_bits_left(&gb)<0)
-                return AVERROR_INVALIDDATA;
+            if (get_bits_left(&gb) < 0) {
+                ret = AVERROR_INVALIDDATA;
+                goto error;
+            }
             if(i & stereo) {
                 if(vlc[2].table)
                     res = get_vlc2(&gb, vlc[2].table, SMKTREE_BITS, 3);
@@ -723,7 +736,8 @@
                     res = 0;
                 if (res < 0) {
                     av_log(avctx, AV_LOG_ERROR, "invalid vlc\n");
-                    return AVERROR_INVALIDDATA;
+                    ret = AVERROR_INVALIDDATA;
+                    goto error;
                 }
                 val  = h[2].values[res];
                 if(vlc[3].table)
@@ -732,10 +746,11 @@
                     res = 0;
                 if (res < 0) {
                     av_log(avctx, AV_LOG_ERROR, "invalid vlc\n");
-                    return AVERROR_INVALIDDATA;
+                    ret = AVERROR_INVALIDDATA;
+                    goto error;
                 }
                 val |= h[3].values[res] << 8;
-                pred[1] += sign_extend(val, 16);
+                pred[1] += (unsigned)sign_extend(val, 16);
                 *samples++ = pred[1];
             } else {
                 if(vlc[0].table)
@@ -744,7 +759,8 @@
                     res = 0;
                 if (res < 0) {
                     av_log(avctx, AV_LOG_ERROR, "invalid vlc\n");
-                    return AVERROR_INVALIDDATA;
+                    ret = AVERROR_INVALIDDATA;
+                    goto error;
                 }
                 val  = h[0].values[res];
                 if(vlc[1].table)
@@ -753,10 +769,11 @@
                     res = 0;
                 if (res < 0) {
                     av_log(avctx, AV_LOG_ERROR, "invalid vlc\n");
-                    return AVERROR_INVALIDDATA;
+                    ret = AVERROR_INVALIDDATA;
+                    goto error;
                 }
                 val |= h[1].values[res] << 8;
-                pred[0] += sign_extend(val, 16);
+                pred[0] += (unsigned)sign_extend(val, 16);
                 *samples++ = pred[0];
             }
         }
@@ -766,8 +783,10 @@
         for(i = 0; i <= stereo; i++)
             *samples8++ = pred[i];
         for(; i < unp_size; i++) {
-            if(get_bits_left(&gb)<0)
-                return AVERROR_INVALIDDATA;
+            if (get_bits_left(&gb) < 0) {
+                ret = AVERROR_INVALIDDATA;
+                goto error;
+            }
             if(i & stereo){
                 if(vlc[1].table)
                     res = get_vlc2(&gb, vlc[1].table, SMKTREE_BITS, 3);
@@ -775,7 +794,8 @@
                     res = 0;
                 if (res < 0) {
                     av_log(avctx, AV_LOG_ERROR, "invalid vlc\n");
-                    return AVERROR_INVALIDDATA;
+                    ret = AVERROR_INVALIDDATA;
+                    goto error;
                 }
                 pred[1] += sign_extend(h[1].values[res], 8);
                 *samples8++ = pred[1];
@@ -786,7 +806,8 @@
                     res = 0;
                 if (res < 0) {
                     av_log(avctx, AV_LOG_ERROR, "invalid vlc\n");
-                    return AVERROR_INVALIDDATA;
+                    ret = AVERROR_INVALIDDATA;
+                    goto error;
                 }
                 pred[0] += sign_extend(h[0].values[res], 8);
                 *samples8++ = pred[0];
diff --git a/libavcodec/smc.c b/libavcodec/smc.c
index 3cb4834..2beb1ce 100644
--- a/libavcodec/smc.c
+++ b/libavcodec/smc.c
@@ -445,7 +445,7 @@
 
     bytestream2_init(&s->gb, buf, buf_size);
 
-    if ((ret = ff_reget_buffer(avctx, s->frame)) < 0)
+    if ((ret = ff_reget_buffer(avctx, s->frame, 0)) < 0)
         return ret;
 
     if (pal && pal_size == AVPALETTE_SIZE) {
diff --git a/libavcodec/snappy.c b/libavcodec/snappy.c
index 7900b0f..f5c4c65 100644
--- a/libavcodec/snappy.c
+++ b/libavcodec/snappy.c
@@ -39,6 +39,8 @@
 
     do {
         tmp = bytestream2_get_byte(gb);
+        if (shift > 31 || ((tmp & 127LL) << shift) > INT_MAX)
+            return AVERROR_INVALIDDATA;
         val |= (tmp & 127) << shift;
         shift += 7;
     } while (tmp & 128);
diff --git a/libavcodec/snowdec.c b/libavcodec/snowdec.c
index 59bd24e..519e377 100644
--- a/libavcodec/snowdec.c
+++ b/libavcodec/snowdec.c
@@ -502,7 +502,7 @@
               );
 
     av_assert0(!s->avmv);
-    if (s->avctx->flags2 & AV_CODEC_FLAG2_EXPORT_MVS) {
+    if (s->avctx->export_side_data & AV_CODEC_EXPORT_DATA_MVS) {
         s->avmv = av_malloc_array(s->b_width * s->b_height, sizeof(AVMotionVector) << (s->block_max_depth*2));
     }
     s->avmv_index = 0;
diff --git a/libavcodec/snowenc.c b/libavcodec/snowenc.c
index 61a658f..3f2a75a 100644
--- a/libavcodec/snowenc.c
+++ b/libavcodec/snowenc.c
@@ -81,6 +81,7 @@
     s->m.bit_rate= avctx->bit_rate;
     s->m.lmin    = avctx->mb_lmin;
     s->m.lmax    = avctx->mb_lmax;
+    s->m.mb_num  = (avctx->width * avctx->height + 255) / 256; // For ratecontrol
 
     s->m.me.temp      =
     s->m.me.scratchpad= av_mallocz_array((avctx->width+64), 2*16*2*sizeof(uint8_t));
@@ -312,7 +313,7 @@
     if(P_LEFT[1]     > (c->ymax<<shift)) P_LEFT[1]    = (c->ymax<<shift);
     if(P_TOP[0]      > (c->xmax<<shift)) P_TOP[0]     = (c->xmax<<shift);
     if(P_TOP[1]      > (c->ymax<<shift)) P_TOP[1]     = (c->ymax<<shift);
-    if(P_TOPRIGHT[0] < (c->xmin<<shift)) P_TOPRIGHT[0]= (c->xmin<<shift);
+    if(P_TOPRIGHT[0] < (c->xmin * (1<<shift))) P_TOPRIGHT[0]= (c->xmin * (1<<shift));
     if(P_TOPRIGHT[0] > (c->xmax<<shift)) P_TOPRIGHT[0]= (c->xmax<<shift); //due to pmx no clip
     if(P_TOPRIGHT[1] > (c->ymax<<shift)) P_TOPRIGHT[1]= (c->ymax<<shift);
 
@@ -1774,7 +1775,7 @@
             }else{
                 for(y=0; y<h; y++){
                     for(x=0; x<w; x++){
-                        s->spatial_dwt_buffer[y*w + x]=s->spatial_idwt_buffer[y*w + x]<<ENCODER_EXTRA_BITS;
+                        s->spatial_dwt_buffer[y*w + x]= s->spatial_idwt_buffer[y*w + x] * (1 << ENCODER_EXTRA_BITS);
                     }
                 }
             }
@@ -1899,7 +1900,7 @@
 FF_ENABLE_DEPRECATION_WARNINGS
 #endif
 
-    pkt->size = ff_rac_terminate(c);
+    pkt->size = ff_rac_terminate(c, 0);
     if (s->current_picture->key_frame)
         pkt->flags |= AV_PKT_FLAG_KEY;
     *got_packet = 1;
diff --git a/libavcodec/sonic.c b/libavcodec/sonic.c
index 2e3ca79..c975774 100644
--- a/libavcodec/sonic.c
+++ b/libavcodec/sonic.c
@@ -144,6 +144,8 @@
         e= 0;
         while(get_rac(c, state+1 + FFMIN(e,9))){ //1..10
             e++;
+            if (e > 31)
+                return AVERROR_INVALIDDATA;
         }
 
         a= 1;
@@ -473,7 +475,7 @@
     {
         int k_value = *k_ptr, state_value = *state_ptr;
         x -= shift_down(k_value * state_value, LATTICE_SHIFT);
-        state_ptr[1] = state_value + shift_down(k_value * x, LATTICE_SHIFT);
+        state_ptr[1] = state_value + shift_down(k_value * (unsigned)x, LATTICE_SHIFT);
     }
 #else
     for (i = order-2; i >= 0; i--)
@@ -842,7 +844,7 @@
 
 //    av_log(avctx, AV_LOG_DEBUG, "used bytes: %d\n", (put_bits_count(&pb)+7)/8);
 
-    avpkt->size = ff_rac_terminate(&c);
+    avpkt->size = ff_rac_terminate(&c, 0);
     *got_packet_ptr = 1;
     return 0;
 
diff --git a/libavcodec/srtenc.c b/libavcodec/srtenc.c
index 34f0f0d..655b656 100644
--- a/libavcodec/srtenc.c
+++ b/libavcodec/srtenc.c
@@ -241,7 +241,7 @@
 
         if (sub->rects[i]->type != SUBTITLE_ASS) {
             av_log(avctx, AV_LOG_ERROR, "Only SUBTITLE_ASS type supported.\n");
-            return AVERROR(ENOSYS);
+            return AVERROR(EINVAL);
         }
 
 #if FF_API_ASS_TIMING
@@ -276,7 +276,7 @@
 
     if (s->buffer.len > bufsize) {
         av_log(avctx, AV_LOG_ERROR, "Buffer too small for ASS event.\n");
-        return -1;
+        return AVERROR_BUFFER_TOO_SMALL;
     }
     memcpy(buf, s->buffer.str, s->buffer.len);
 
diff --git a/libavcodec/sunrast.c b/libavcodec/sunrast.c
index 0af5626..e1ec8a0 100644
--- a/libavcodec/sunrast.c
+++ b/libavcodec/sunrast.c
@@ -72,7 +72,7 @@
 
     if (type == RT_FORMAT_TIFF || type == RT_FORMAT_IFF) {
         av_log(avctx, AV_LOG_ERROR, "unsupported (compression) type\n");
-        return -1;
+        return AVERROR_PATCHWELCOME;
     }
 
     switch (depth) {
@@ -100,14 +100,18 @@
     if (ret < 0)
         return ret;
 
+    /* scanlines are aligned on 16 bit boundaries */
+    len  = (depth * w + 7) >> 3;
+    alen = len + (len & 1);
+
+    if (buf_end - buf < maplength + (len * h) * 3 / 256)
+        return AVERROR_INVALIDDATA;
+
     if ((ret = ff_get_buffer(avctx, p, 0)) < 0)
         return ret;
 
     p->pict_type = AV_PICTURE_TYPE_I;
 
-    if (buf_end - buf < maplength)
-        return AVERROR_INVALIDDATA;
-
     if (depth > 8 && maplength) {
         av_log(avctx, AV_LOG_WARNING, "useless colormap found or file is corrupted, trying to recover\n");
 
@@ -132,14 +136,10 @@
             return AVERROR(ENOMEM);
         stride = (w + 15 >> 3) * depth;
     } else {
-    ptr    = p->data[0];
-    stride = p->linesize[0];
+        ptr    = p->data[0];
+        stride = p->linesize[0];
     }
 
-    /* scanlines are aligned on 16 bit boundaries */
-    len  = (depth * w + 7) >> 3;
-    alen = len + (len & 1);
-
     if (type == RT_BYTE_ENCODED) {
         int value, run;
         uint8_t *end = ptr + h * stride;
diff --git a/libavcodec/svq1.h b/libavcodec/svq1.h
index 63c0479..0ebc73a 100644
--- a/libavcodec/svq1.h
+++ b/libavcodec/svq1.h
@@ -42,9 +42,6 @@
 #define SVQ1_BLOCK_INTER_4V     2
 #define SVQ1_BLOCK_INTRA        3
 
-uint16_t ff_svq1_packet_checksum(const uint8_t *data,
-                                 const int length, int value);
-
 extern const int8_t *const ff_svq1_inter_codebooks[6];
 extern const int8_t *const ff_svq1_intra_codebooks[6];
 
diff --git a/libavcodec/svq13.c b/libavcodec/svq13.c
deleted file mode 100644
index b821a44..0000000
--- a/libavcodec/svq13.c
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * SVQ1/SVQ3 decoder common code
- *
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with FFmpeg; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-#include <stdint.h>
-
-#include "svq1.h"
-
-static const uint16_t checksum_table[256] = {
-    0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7,
-    0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF,
-    0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6,
-    0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE,
-    0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485,
-    0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D,
-    0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4,
-    0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC,
-    0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823,
-    0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B,
-    0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12,
-    0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A,
-    0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41,
-    0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49,
-    0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70,
-    0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78,
-    0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F,
-    0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067,
-    0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E,
-    0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256,
-    0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D,
-    0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
-    0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C,
-    0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634,
-    0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB,
-    0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3,
-    0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A,
-    0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92,
-    0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9,
-    0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1,
-    0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8,
-    0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0
-};
-
-uint16_t ff_svq1_packet_checksum (const uint8_t *data,
-                                  const int length, int value)
-{
-    int i;
-
-    for (i = 0; i < length; i++)
-        value = checksum_table[data[i] ^ (value >> 8)] ^ ((value & 0xFF) << 8);
-
-    return value;
-}
diff --git a/libavcodec/svq1dec.c b/libavcodec/svq1dec.c
index d3e60c3..b09abc2 100644
--- a/libavcodec/svq1dec.c
+++ b/libavcodec/svq1dec.c
@@ -32,6 +32,8 @@
  *   http://www.pcisys.net/~melanson/codecs/
  */
 
+#include "libavutil/crc.h"
+
 #include "avcodec.h"
 #include "get_bits.h"
 #include "h263.h"
@@ -546,9 +548,7 @@
         if (s->frame_code == 0x50 || s->frame_code == 0x60) {
             int csum = get_bits(bitbuf, 16);
 
-            csum = ff_svq1_packet_checksum(bitbuf->buffer,
-                                           bitbuf->size_in_bits >> 3,
-                                           csum);
+            csum = av_bswap16(av_crc(av_crc_get_table(AV_CRC_16_CCITT), av_bswap16(csum), bitbuf->buffer, bitbuf->size_in_bits >> 3));
 
             ff_dlog(avctx, "%s checksum (%02x) for packet data\n",
                     (csum == 0) ? "correct" : "incorrect", csum);
diff --git a/libavcodec/svq1enc.c b/libavcodec/svq1enc.c
index 80a8af1..6510135 100644
--- a/libavcodec/svq1enc.c
+++ b/libavcodec/svq1enc.c
@@ -345,7 +345,7 @@
             s->m.first_slice_line = 0;
         }
 
-        ff_fix_long_p_mvs(&s->m);
+        ff_fix_long_p_mvs(&s->m, CANDIDATE_MB_TYPE_INTRA);
         ff_fix_long_mvs(&s->m, NULL, 0, s->m.p_mv_table, s->m.f_code,
                         CANDIDATE_MB_TYPE_INTER, 0);
     }
diff --git a/libavcodec/svq3.c b/libavcodec/svq3.c
index 18a4448..c8db08a 100644
--- a/libavcodec/svq3.c
+++ b/libavcodec/svq3.c
@@ -43,6 +43,8 @@
 #include <inttypes.h>
 
 #include "libavutil/attributes.h"
+#include "libavutil/crc.h"
+
 #include "internal.h"
 #include "avcodec.h"
 #include "mpegutils.h"
@@ -1183,6 +1185,7 @@
         GetBitContext gb;
         int frame_size_code;
         int unk0, unk1, unk2, unk3, unk4;
+        int w,h;
 
         size = AV_RB32(&extradata[4]);
         if (size > extradata_end - extradata - 8) {
@@ -1195,38 +1198,41 @@
         frame_size_code = get_bits(&gb, 3);
         switch (frame_size_code) {
         case 0:
-            avctx->width  = 160;
-            avctx->height = 120;
+            w = 160;
+            h = 120;
             break;
         case 1:
-            avctx->width  = 128;
-            avctx->height =  96;
+            w = 128;
+            h =  96;
             break;
         case 2:
-            avctx->width  = 176;
-            avctx->height = 144;
+            w = 176;
+            h = 144;
             break;
         case 3:
-            avctx->width  = 352;
-            avctx->height = 288;
+            w = 352;
+            h = 288;
             break;
         case 4:
-            avctx->width  = 704;
-            avctx->height = 576;
+            w = 704;
+            h = 576;
             break;
         case 5:
-            avctx->width  = 240;
-            avctx->height = 180;
+            w = 240;
+            h = 180;
             break;
         case 6:
-            avctx->width  = 320;
-            avctx->height = 240;
+            w = 320;
+            h = 240;
             break;
         case 7:
-            avctx->width  = get_bits(&gb, 12);
-            avctx->height = get_bits(&gb, 12);
+            w = get_bits(&gb, 12);
+            h = get_bits(&gb, 12);
             break;
         }
+        ret = ff_set_dimensions(avctx, w, h);
+        if (ret < 0)
+            goto fail;
 
         s->halfpel_flag  = get_bits1(&gb);
         s->thirdpel_flag = get_bits1(&gb);
@@ -1289,7 +1295,8 @@
                 ret = -1;
                 goto fail;
             }
-            s->watermark_key = ff_svq1_packet_checksum(buf, buf_len, 0);
+            s->watermark_key = av_bswap16(av_crc(av_crc_get_table(AV_CRC_16_CCITT), 0, buf, buf_len));
+
             s->watermark_key = s->watermark_key << 16 | s->watermark_key;
             av_log(avctx, AV_LOG_DEBUG,
                    "watermark key %#"PRIx32"\n", s->watermark_key);
diff --git a/libavcodec/tableprint_vlc.h b/libavcodec/tableprint_vlc.h
index 3004be3..b3ff365 100644
--- a/libavcodec/tableprint_vlc.h
+++ b/libavcodec/tableprint_vlc.h
@@ -36,6 +36,7 @@
 #define AVCODEC_AVCODEC_H
 #define AVCODEC_INTERNAL_H
 #define AV_INPUT_BUFFER_PADDING_SIZE 64 // the value does not matter for this
+#define avpriv_request_sample(...)
 #include "tableprint.h"
 #include "get_bits.h"
 #include "mathtables.c"
diff --git a/libavcodec/tak_parser.c b/libavcodec/tak_parser.c
index 835a47b..3604b35 100644
--- a/libavcodec/tak_parser.c
+++ b/libavcodec/tak_parser.c
@@ -46,15 +46,16 @@
     int needed   = buf_size ? TAK_MAX_FRAME_HEADER_BYTES : 8;
     int ret;
 
+    *poutbuf      = buf;
+    *poutbuf_size = buf_size;
+
     if (s->flags & PARSER_FLAG_COMPLETE_FRAMES) {
         TAKStreamInfo ti;
         if ((ret = init_get_bits8(&gb, buf, buf_size)) < 0)
-            return ret;
+            return buf_size;
         if (!ff_tak_decode_frame_header(avctx, &gb, &ti, 127))
             s->duration = t->ti.last_frame_samples ? t->ti.last_frame_samples
                                                    : t->ti.frame_samples;
-        *poutbuf      = buf;
-        *poutbuf_size = buf_size;
         return buf_size;
     }
 
@@ -65,7 +66,7 @@
             const uint8_t *tmp_buf = buf;
 
             if (ff_combine_frame(pc, END_NOT_FOUND, &tmp_buf, &tmp_buf_size) != -1)
-                return AVERROR(ENOMEM);
+                goto fail;
             consumed += tmp_buf_size;
             buf      += tmp_buf_size;
             buf_size -= tmp_buf_size;
@@ -78,7 +79,7 @@
 
                 if ((ret = init_get_bits8(&gb, pc->buffer + t->index,
                                           pc->index - t->index)) < 0)
-                    return ret;
+                    goto fail;
                 if (!ff_tak_decode_frame_header(avctx, &gb,
                         pc->frame_start_found ? &ti : &t->ti, 127) &&
                     !ff_tak_check_crc(pc->buffer + t->index,
@@ -103,9 +104,7 @@
 
     if (consumed && !buf_size && next == END_NOT_FOUND ||
         ff_combine_frame(pc, next, &buf, &buf_size) < 0) {
-        *poutbuf      = NULL;
-        *poutbuf_size = 0;
-        return buf_size + consumed;
+        goto fail;
     }
 
     if (next != END_NOT_FOUND) {
@@ -116,6 +115,11 @@
     *poutbuf      = buf;
     *poutbuf_size = buf_size;
     return next;
+
+fail:
+    *poutbuf      = NULL;
+    *poutbuf_size = 0;
+    return buf_size + consumed;
 }
 
 AVCodecParser ff_tak_parser = {
diff --git a/libavcodec/takdec.c b/libavcodec/takdec.c
index 0439a3a..9fa1cb1 100644
--- a/libavcodec/takdec.c
+++ b/libavcodec/takdec.c
@@ -176,8 +176,8 @@
     } else {
         shift = 0;
     }
-    s->uval           = FFALIGN(avctx->sample_rate + 511 >> 9, 4) << shift;
-    s->subframe_scale = FFALIGN(avctx->sample_rate + 511 >> 9, 4) << 1;
+    s->uval           = FFALIGN(avctx->sample_rate + 511LL >> 9, 4) << shift;
+    s->subframe_scale = FFALIGN(avctx->sample_rate + 511LL >> 9, 4) << 1;
 }
 
 static av_cold int tak_decode_init(AVCodecContext *avctx)
@@ -653,7 +653,7 @@
                          s->residues[i    ] * s->filter[0];
                 }
 
-                v = av_clip_intp2(v >> 10, 13) * (1 << dshift) - *p1;
+                v = av_clip_intp2(v >> 10, 13) * (1U << dshift) - *p1;
                 *p1++ = v;
             }
 
@@ -915,13 +915,6 @@
 }
 
 #if HAVE_THREADS
-static int init_thread_copy(AVCodecContext *avctx)
-{
-    TAKDecContext *s = avctx->priv_data;
-    s->avctx = avctx;
-    return 0;
-}
-
 static int update_thread_context(AVCodecContext *dst,
                                  const AVCodecContext *src)
 {
@@ -953,7 +946,6 @@
     .init             = tak_decode_init,
     .close            = tak_decode_close,
     .decode           = tak_decode_frame,
-    .init_thread_copy = ONLY_IF_THREADS_ENABLED(init_thread_copy),
     .update_thread_context = ONLY_IF_THREADS_ENABLED(update_thread_context),
     .capabilities     = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_FRAME_THREADS,
     .sample_fmts      = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_U8P,
diff --git a/libavcodec/targa.c b/libavcodec/targa.c
index 93e0ef7..a61fef1 100644
--- a/libavcodec/targa.c
+++ b/libavcodec/targa.c
@@ -132,12 +132,6 @@
     h         = bytestream2_get_le16(&s->gb);
     bpp       = bytestream2_get_byte(&s->gb);
 
-    if (bytestream2_get_bytes_left(&s->gb) <= idlen) {
-        av_log(avctx, AV_LOG_ERROR,
-                "Not enough data to read header\n");
-        return AVERROR_INVALIDDATA;
-    }
-
     flags     = bytestream2_get_byte(&s->gb);
 
     if (!pal && (first_clr || colors || csize)) {
@@ -146,6 +140,12 @@
         first_clr = colors = csize = 0;
     }
 
+    if (bytestream2_get_bytes_left(&s->gb) < idlen + 2*colors) {
+        av_log(avctx, AV_LOG_ERROR,
+                "Not enough data to read header\n");
+        return AVERROR_INVALIDDATA;
+    }
+
     // skip identifier if any
     bytestream2_skip(&s->gb, idlen);
 
diff --git a/libavcodec/tdsc.c b/libavcodec/tdsc.c
index 4182404..e9ea41e 100644
--- a/libavcodec/tdsc.c
+++ b/libavcodec/tdsc.c
@@ -187,7 +187,7 @@
 static int tdsc_load_cursor(AVCodecContext *avctx)
 {
     TDSCContext *ctx  = avctx->priv_data;
-    int i, j, k, ret, bits, cursor_fmt;
+    int i, j, k, ret, cursor_fmt;
     uint8_t *dst;
 
     ctx->cursor_hot_x = bytestream2_get_le16(&ctx->gbc);
@@ -231,7 +231,7 @@
     case CUR_FMT_MONO:
         for (j = 0; j < ctx->cursor_h; j++) {
             for (i = 0; i < ctx->cursor_w; i += 32) {
-                bits = bytestream2_get_be32(&ctx->gbc);
+                uint32_t bits = bytestream2_get_be32(&ctx->gbc);
                 for (k = 0; k < 32; k++) {
                     dst[0] = !!(bits & 0x80000000);
                     dst   += 4;
@@ -244,7 +244,7 @@
         dst = ctx->cursor;
         for (j = 0; j < ctx->cursor_h; j++) {
             for (i = 0; i < ctx->cursor_w; i += 32) {
-                bits = bytestream2_get_be32(&ctx->gbc);
+                uint32_t bits = bytestream2_get_be32(&ctx->gbc);
                 for (k = 0; k < 32; k++) {
                     int mask_bit = !!(bits & 0x80000000);
                     switch (dst[0] * 2 + mask_bit) {
diff --git a/libavcodec/tests/.gitignore b/libavcodec/tests/.gitignore
index 73945a7..a01a700 100644
--- a/libavcodec/tests/.gitignore
+++ b/libavcodec/tests/.gitignore
@@ -2,12 +2,14 @@
 /avpacket
 /cabac
 /celp_math
+/codec_desc
 /dct
 /fft
 /fft-fixed
 /fft-fixed32
 /golomb
 /h264_levels
+/h265_levels
 /htmlsubtitles
 /iirfilter
 /imgconvert
diff --git a/libavcodec/tests/dct.c b/libavcodec/tests/dct.c
index e8fa4a3..2ca8039 100644
--- a/libavcodec/tests/dct.c
+++ b/libavcodec/tests/dct.c
@@ -73,7 +73,7 @@
     for(i=0; i<64; i++){
         qmat[i]=4;
     }
-    ff_prores_idct(dst, qmat);
+    ff_prores_idct_10(dst, qmat);
     for(i=0; i<64; i++) {
          dst[i] -= 512;
     }
diff --git a/libavcodec/tests/h264_levels.c b/libavcodec/tests/h264_levels.c
index 794517e..98febcc 100644
--- a/libavcodec/tests/h264_levels.c
+++ b/libavcodec/tests/h264_levels.c
@@ -62,6 +62,48 @@
 static const struct {
     int width;
     int height;
+    int framerate;
+    int level_idc;
+} test_framerate[] = {
+    // Some typical sizes and frame rates.
+    // (From H.264 table A-1 and table A-6)
+    {  176,  144,  15, 10 },
+    {  176,  144,  16, 11 },
+    {  320,  240,  10, 11 },
+    {  320,  240,  20, 12 },
+    {  320,  240,  40, 21 },
+    {  352,  288,  30, 13 },
+    {  352,  288,  51, 22 },
+    {  352,  576,  25, 21 },
+    {  352,  576,  26, 30 },
+    {  640,  480,  33, 30 },
+    {  640,  480,  34, 31 },
+    {  720,  480,  50, 31 },
+    {  720,  576,  25, 30 },
+    {  800,  600,  55, 31 },
+    { 1024,  768,  35, 31 },
+    { 1024,  768,  70, 32 },
+    { 1280,  720,  30, 31 },
+    { 1280,  720,  31, 32 },
+    { 1280,  960,  45, 32 },
+    { 1280,  960,  46, 40 },
+    { 1280, 1024,  42, 32 },
+    { 1600, 1200,  32, 40 },
+    { 1600, 1200,  33, 42 },
+    { 1920, 1088,  30, 40 },
+    { 1920, 1088,  55, 42 },
+    { 2048, 1024,  30, 40 },
+    { 2048, 1024,  62, 42 },
+    { 2048, 1088,  60, 42 },
+    { 3680, 1536,  26, 50 },
+    { 4096, 2048,  30, 51 },
+    { 4096, 2048,  59, 52 },
+    { 4096, 2160,  60, 52 },
+};
+
+static const struct {
+    int width;
+    int height;
     int dpb_size;
     int level_idc;
 } test_dpb[] = {
@@ -102,7 +144,7 @@
     // Check level 1b.
     {  32 * 1200,  66, 10 },
     {  32 * 1500, 100, 10 },
-    {  96 * 1200,  66, 10 },
+    {  96 * 1200,  66, 11 },
     {  96 * 1500, 100,  9 },
     { 144 * 1200,  66, 11 },
     { 144 * 1500, 100, 11 },
@@ -147,14 +189,23 @@
     } while (0)
 
     for (i = 0; i < FF_ARRAY_ELEMS(test_sizes); i++) {
-        level = ff_h264_guess_level(0, 0, test_sizes[i].width,
+        level = ff_h264_guess_level(0, 0, 0, test_sizes[i].width,
                                     test_sizes[i].height, 0);
         CHECK(test_sizes[i].level_idc, "size %dx%d",
               test_sizes[i].width, test_sizes[i].height);
     }
 
+    for (i = 0; i < FF_ARRAY_ELEMS(test_framerate); i++) {
+        level = ff_h264_guess_level(0, 0, test_framerate[i].framerate,
+                                    test_framerate[i].width,
+                                    test_framerate[i].height, 0);
+        CHECK(test_framerate[i].level_idc, "framerate %d, size %dx%d",
+              test_framerate[i].framerate, test_framerate[i].width,
+              test_framerate[i].height);
+    }
+
     for (i = 0; i < FF_ARRAY_ELEMS(test_dpb); i++) {
-        level = ff_h264_guess_level(0, 0, test_dpb[i].width,
+        level = ff_h264_guess_level(0, 0, 0, test_dpb[i].width,
                                     test_dpb[i].height,
                                     test_dpb[i].dpb_size);
         CHECK(test_dpb[i].level_idc, "size %dx%d dpb %d",
@@ -165,7 +216,7 @@
     for (i = 0; i < FF_ARRAY_ELEMS(test_bitrate); i++) {
         level = ff_h264_guess_level(test_bitrate[i].profile_idc,
                                     test_bitrate[i].bitrate,
-                                    0, 0, 0);
+                                    0, 0, 0, 0);
         CHECK(test_bitrate[i].level_idc, "bitrate %"PRId64" profile %d",
               test_bitrate[i].bitrate, test_bitrate[i].profile_idc);
     }
@@ -173,6 +224,7 @@
     for (i = 0; i < FF_ARRAY_ELEMS(test_all); i++) {
         level = ff_h264_guess_level(test_all[i].profile_idc,
                                     test_all[i].bitrate,
+                                    0,
                                     test_all[i].width,
                                     test_all[i].height,
                                     test_all[i].dpb_frames);
diff --git a/libavcodec/tests/h265_levels.c b/libavcodec/tests/h265_levels.c
new file mode 100644
index 0000000..66d72c6
--- /dev/null
+++ b/libavcodec/tests/h265_levels.c
@@ -0,0 +1,297 @@
+/*
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "libavutil/common.h"
+#include "libavcodec/h265_profile_level.h"
+
+static const struct {
+    int width;
+    int height;
+    int level_idc;
+} test_sizes[] = {
+    // First level usable at standard sizes, from H.265 table A.9.
+    {  176,  144,  30 }, // QCIF
+    {  352,  288,  60 }, // CIF
+    {  640,  480,  90 }, // VGA
+    {  720,  480,  90 }, // NTSC
+    {  720,  576,  90 }, // PAL
+    { 1024,  768,  93 }, // XGA
+    { 1280,  720,  93 }, // 720p
+    { 1280, 1024, 120 }, // SXGA
+    { 1920, 1080, 120 }, // 1080p
+    { 2048, 1080, 120 }, // 2Kx1080
+    { 2048, 1536, 150 }, // 4XGA
+    { 3840, 2160, 150 }, // 4K
+    { 7680, 4320, 180 }, // 8K
+
+    // Overly wide or tall sizes.
+    {     1,   512,  30 },
+    {     1,  1024,  63 },
+    {     1,  2048,  90 },
+    {     1,  4096, 120 },
+    {     1,  8192, 150 },
+    {     1, 16384, 180 },
+    {     1, 32768,   0 },
+    {   512,     1,  30 },
+    {  1024,     1,  63 },
+    {  2048,     1,  90 },
+    {  4096,     1, 120 },
+    {  8192,     1, 150 },
+    { 16384,     1, 180 },
+    { 32768,     1,   0 },
+    {  2800,   256,  93 },
+    {  2816,   128, 120 },
+    {   256,  4208, 120 },
+    {   128,  4224, 150 },
+    {  8432,   256, 150 },
+    {  8448,   128, 180 },
+    {   256, 16880, 180 },
+    {   128, 16896,   0 },
+};
+
+static const struct {
+    int width;
+    int height;
+    int dpb_size;
+    int level_idc;
+} test_dpb[] = {
+    // First level usable for some DPB sizes.
+
+    // L1:   176 * 144 = 25344 <=  36864 * 3/4 = 27648
+    // L2:                     <= 122880 * 1/4 = 30720
+    {  176,  144,  8,  30 },
+    {  176,  144,  9,  60 },
+
+    // L2:   352 * 288 = 101376 <= 122880
+    // L2.1:                    <= 245760 * 1/2 = 122880
+    // L3:                      <= 552960 * 1/4 = 138240
+    {  352,  288,  6,  60 },
+    {  352,  288,  7,  63 },
+    {  352,  288, 13,  90 },
+
+    // L3.1: 1280 * 720 = 921600 <= 983040
+    // L4:                       <= 2228224 * 1/2 = 1114112
+    // L5:                       <= 8912896 * 1/4 = 2228224
+    { 1280,  720,  6,  93 },
+    { 1280,  720, 12, 120 },
+    { 1280,  720, 16, 150 },
+
+    // L5:   3840 * 2160 = 8294400 <= 8912896
+    // L6:                         <= 35651584 * 1/4 = 8912896
+    { 3840, 2160,  6, 150 },
+    { 3840, 2160,  7, 180 },
+    { 3840, 2160, 16, 180 },
+};
+
+static const H265RawProfileTierLevel profile_main = {
+    // CpbNalFactor = 1100
+    .general_profile_space = 0,
+    .general_profile_idc   = 1,
+    .general_tier_flag     = 0,
+    .general_profile_compatibility_flag[1] = 1,
+};
+
+static const H265RawProfileTierLevel profile_main_12 = {
+    // CpbNalFactor = 1650
+    .general_profile_space = 0,
+    .general_profile_idc   = 4,
+    .general_tier_flag     = 0,
+    .general_profile_compatibility_flag[4]    = 1,
+    .general_max_12bit_constraint_flag        = 1,
+    .general_max_10bit_constraint_flag        = 0,
+    .general_max_8bit_constraint_flag         = 0,
+    .general_max_422chroma_constraint_flag    = 1,
+    .general_max_420chroma_constraint_flag    = 1,
+    .general_max_monochrome_constraint_flag   = 0,
+    .general_intra_constraint_flag            = 0,
+    .general_one_picture_only_constraint_flag = 0,
+    .general_lower_bit_rate_constraint_flag   = 1,
+};
+
+static const H265RawProfileTierLevel profile_main_422_12_intra = {
+    // CpbNalFactor = 2200
+    .general_profile_space = 0,
+    .general_profile_idc   = 4,
+    .general_tier_flag     = 0,
+    .general_profile_compatibility_flag[4]    = 1,
+    .general_max_12bit_constraint_flag        = 1,
+    .general_max_10bit_constraint_flag        = 0,
+    .general_max_8bit_constraint_flag         = 0,
+    .general_max_422chroma_constraint_flag    = 1,
+    .general_max_420chroma_constraint_flag    = 0,
+    .general_max_monochrome_constraint_flag   = 0,
+    .general_intra_constraint_flag            = 1,
+    .general_one_picture_only_constraint_flag = 0,
+};
+
+static const H265RawProfileTierLevel profile_ht_444_14 = {
+    // CpbNalFactor = 3850
+    .general_profile_space = 0,
+    .general_profile_idc   = 5,
+    .general_tier_flag     = 0,
+    .general_profile_compatibility_flag[5]    = 1,
+    .general_max_14bit_constraint_flag        = 1,
+    .general_max_12bit_constraint_flag        = 0,
+    .general_max_10bit_constraint_flag        = 0,
+    .general_max_8bit_constraint_flag         = 0,
+    .general_max_422chroma_constraint_flag    = 0,
+    .general_max_420chroma_constraint_flag    = 0,
+    .general_max_monochrome_constraint_flag   = 0,
+    .general_intra_constraint_flag            = 0,
+    .general_one_picture_only_constraint_flag = 0,
+    .general_lower_bit_rate_constraint_flag   = 1,
+};
+
+static const H265RawProfileTierLevel profile_main_high_tier = {
+    // CpbNalFactor = 1100
+    .general_profile_space = 0,
+    .general_profile_idc   = 1,
+    .general_tier_flag     = 1,
+    .general_profile_compatibility_flag[1] = 1,
+};
+
+static const struct {
+    int64_t bitrate;
+    const H265RawProfileTierLevel *ptl;
+    int level_idc;
+} test_bitrate[] = {
+    // First level usable for some bitrates and profiles.
+
+    // L2.1: 3000 * 1100 = 3300000
+    // L3:   6000 * 1100 = 6600000
+    {   4000000, &profile_main,               90 },
+    // L2:   1500 * 1650 = 2475000
+    // L2.1: 3000 * 1650 = 4950000
+    {   4000000, &profile_main_12,            63 },
+    // L1:    350 * 2200 * 2 = 1540000
+    // L2:   1500 * 2200 * 2 = 6600000
+    {   4000000, &profile_main_422_12_intra,  60 },
+
+    // L5.1: 40000 * 1100 = 44000000
+    // L5.2: 60000 * 1100 = 66000000
+    {  50000000, &profile_main,              156 },
+    // L5:   25000 * 1650 = 41250000
+    // L5.1: 40000 * 1650 = 66000000
+    {  50000000, &profile_main_12,           153 },
+    // L3.1: 10000 * 2200 * 2 = 44000000
+    // L4:   12000 * 2200 * 2 = 52800000
+    {  50000000, &profile_main_422_12_intra, 120 },
+    // L2:    1500 * 3850 * 6 = 34650000
+    // L2.1:  3000 * 3850 * 6 = 69300000
+    {  50000000, &profile_ht_444_14,          63 },
+
+    // Level changes based on tier.
+    {      1000, &profile_main,            30 },
+    {      1000, &profile_main_high_tier, 120 },
+    {  40000000, &profile_main,           153 },
+    {  40000000, &profile_main_high_tier, 123 },
+    { 200000000, &profile_main,           186 },
+    { 200000000, &profile_main_high_tier, 156 },
+
+    // Overflowing 32-bit integers.
+    // L6:    60000 * 3850 * 6 = 1386000000
+    // L6.1: 120000 * 3850 * 6 = 2772000000
+    // L6.2: 240000 * 3850 * 6 = 5544000000
+    { INT64_C(2700000000), &profile_ht_444_14, 183 },
+    { INT64_C(4200000000), &profile_ht_444_14, 186 },
+    { INT64_C(5600000000), &profile_ht_444_14,   0 },
+};
+
+static const struct {
+    int slice_segments;
+    int tile_rows;
+    int tile_cols;
+    int level_idc;
+} test_fragments[] = {
+    // Slices.
+    {   4,  1,  1,  30 },
+    {  32,  1,  1,  93 },
+    {  70,  1,  1, 120 },
+    {  80,  1,  1, 150 },
+    { 201,  1,  1, 180 },
+    { 600,  1,  1, 180 },
+    { 601,  1,  1,   0 },
+
+    // Tiles.
+    {   1,  2,  1,  90 },
+    {   1,  1,  2,  90 },
+    {   1,  3,  3,  93 },
+    {   1,  4,  2, 120 },
+    {   1,  2,  4, 120 },
+    {   1, 11, 10, 150 },
+    {   1, 10, 11, 180 },
+    {   1, 22, 20, 180 },
+    {   1, 20, 22,   0 },
+};
+
+int main(void)
+{
+    const H265ProfileDescriptor *profile;
+    const H265LevelDescriptor *level;
+    int i;
+
+#define CHECK(expected, format, ...) do { \
+        if (expected ? (!level || level->level_idc != expected) \
+                     : !!level) { \
+            av_log(NULL, AV_LOG_ERROR, "Incorrect level for " \
+                   format ": expected %d, got %d.\n", __VA_ARGS__, \
+                   expected, level ? level->level_idc : -1); \
+            return 1; \
+        } \
+    } while (0)
+
+    for (i = 0; i < FF_ARRAY_ELEMS(test_sizes); i++) {
+        level = ff_h265_guess_level(&profile_main, 0,
+                                    test_sizes[i].width,
+                                    test_sizes[i].height,
+                                    0, 0, 0, 0);
+        CHECK(test_sizes[i].level_idc, "size %dx%d",
+              test_sizes[i].width, test_sizes[i].height);
+    }
+
+    for (i = 0; i < FF_ARRAY_ELEMS(test_dpb); i++) {
+        level = ff_h265_guess_level(&profile_main, 0,
+                                    test_dpb[i].width,
+                                    test_dpb[i].height,
+                                    0, 0, 0, test_dpb[i].dpb_size);
+        CHECK(test_dpb[i].level_idc, "size %dx%d dpb %d",
+              test_dpb[i].width, test_dpb[i].height,
+              test_dpb[i].dpb_size);
+    }
+
+    for (i = 0; i < FF_ARRAY_ELEMS(test_bitrate); i++) {
+        profile = ff_h265_get_profile(test_bitrate[i].ptl);
+        level = ff_h265_guess_level(test_bitrate[i].ptl,
+                                    test_bitrate[i].bitrate,
+                                    0, 0, 0, 0, 0, 0);
+        CHECK(test_bitrate[i].level_idc, "bitrate %"PRId64" profile %s",
+              test_bitrate[i].bitrate, profile->name);
+    }
+
+    for (i = 0; i < FF_ARRAY_ELEMS(test_fragments); i++) {
+        level = ff_h265_guess_level(&profile_main, 0, 0, 0,
+                                    test_fragments[i].slice_segments,
+                                    test_fragments[i].tile_rows,
+                                    test_fragments[i].tile_cols, 0);
+        CHECK(test_fragments[i].level_idc, "%d slices %dx%d tiles",
+              test_fragments[i].slice_segments,
+              test_fragments[i].tile_cols, test_fragments[i].tile_rows);
+    }
+
+    return 0;
+}
diff --git a/libavcodec/tests/rangecoder.c b/libavcodec/tests/rangecoder.c
index 2da5c0c..d6cf9ec 100644
--- a/libavcodec/tests/rangecoder.c
+++ b/libavcodec/tests/rangecoder.c
@@ -24,41 +24,53 @@
 
 #include "libavcodec/rangecoder.h"
 
-#define SIZE 10240
+#define SIZE 1240
 
 int main(void)
 {
     RangeCoder c;
-    uint8_t b[9 * SIZE];
+    uint8_t b[9 * SIZE] = {0};
     uint8_t r[9 * SIZE];
-    int i;
+    int i, p, actual_length, version;
     uint8_t state[10];
     AVLFG prng;
 
     av_lfg_init(&prng, 1);
+    for (version = 0; version < 2; version++) {
+        for (p = 0; p< 1024; p++) {
+            ff_init_range_encoder(&c, b, SIZE);
+            ff_build_rac_states(&c, (1LL << 32) / 20, 128 + 64 + 32 + 16);
 
-    ff_init_range_encoder(&c, b, SIZE);
-    ff_build_rac_states(&c, (1LL << 32) / 20, 128 + 64 + 32 + 16);
+            memset(state, 128, sizeof(state));
 
-    memset(state, 128, sizeof(state));
+            for (i = 0; i < SIZE; i++)
+                r[i] = av_lfg_get(&prng) % 7;
 
-    for (i = 0; i < SIZE; i++)
-        r[i] = av_lfg_get(&prng) % 7;
+            for (i = 0; i < SIZE; i++)
+                put_rac(&c, state, r[i] & 1);
 
-    for (i = 0; i < SIZE; i++)
-        put_rac(&c, state, r[i] & 1);
+            actual_length = ff_rac_terminate(&c, version);
 
-    ff_rac_terminate(&c);
+            ff_init_range_decoder(&c, b, version ? SIZE : actual_length);
 
-    ff_init_range_decoder(&c, b, SIZE);
+            memset(state, 128, sizeof(state));
 
-    memset(state, 128, sizeof(state));
+            for (i = 0; i < SIZE; i++)
+                if ((r[i] & 1) != get_rac(&c, state)) {
+                    av_log(NULL, AV_LOG_ERROR, "rac failure at %d pass %d version %d\n", i, p, version);
+                    return 1;
+                }
 
-    for (i = 0; i < SIZE; i++)
-        if ((r[i] & 1) != get_rac(&c, state)) {
-            av_log(NULL, AV_LOG_ERROR, "rac failure at %d\n", i);
-            return 1;
+            if (ff_rac_check_termination(&c, version) < 0) {
+                av_log(NULL, AV_LOG_ERROR, "rac failure at termination pass %d version %d\n", p, version);
+                return 1;
+            }
+            if (c.bytestream - c.bytestream_start - actual_length != version) {
+                av_log(NULL, AV_LOG_ERROR, "rac failure at pass %d version %d\n", p, version);
+                return 1;
+            }
         }
+    }
 
     return 0;
 }
diff --git a/libavcodec/tests/utils.c b/libavcodec/tests/utils.c
index f6ba7fe..9232647 100644
--- a/libavcodec/tests/utils.c
+++ b/libavcodec/tests/utils.c
@@ -19,10 +19,11 @@
 #include "libavcodec/avcodec.h"
 
 int main(void){
-    AVCodec *codec = NULL;
+    void *iter = NULL;
+    const AVCodec *codec = NULL;
     int ret = 0;
 
-    while (codec = av_codec_next(codec)) {
+    while (codec = av_codec_iterate(&iter)) {
         if (av_codec_is_encoder(codec)) {
             if (codec->type == AVMEDIA_TYPE_AUDIO) {
                 if (!codec->sample_fmts) {
diff --git a/libavcodec/tiertexseqv.c b/libavcodec/tiertexseqv.c
index af39f74..91c8314 100644
--- a/libavcodec/tiertexseqv.c
+++ b/libavcodec/tiertexseqv.c
@@ -239,7 +239,7 @@
 
     SeqVideoContext *seq = avctx->priv_data;
 
-    if ((ret = ff_reget_buffer(avctx, seq->frame)) < 0)
+    if ((ret = ff_reget_buffer(avctx, seq->frame, 0)) < 0)
         return ret;
 
     if (seqvideo_decode(seq, buf, buf_size))
diff --git a/libavcodec/tiff.c b/libavcodec/tiff.c
index b537ec0..3b5985e 100644
--- a/libavcodec/tiff.c
+++ b/libavcodec/tiff.c
@@ -35,8 +35,10 @@
 
 #include "libavutil/attributes.h"
 #include "libavutil/avstring.h"
+#include "libavutil/error.h"
 #include "libavutil/intreadwrite.h"
 #include "libavutil/imgutils.h"
+#include "libavutil/opt.h"
 #include "avcodec.h"
 #include "bytestream.h"
 #include "faxcompr.h"
@@ -45,12 +47,24 @@
 #include "mathops.h"
 #include "tiff.h"
 #include "tiff_data.h"
+#include "mjpegdec.h"
 #include "thread.h"
+#include "get_bits.h"
 
 typedef struct TiffContext {
+    AVClass *class;
     AVCodecContext *avctx;
     GetByteContext gb;
 
+    /* JPEG decoding for DNG */
+    AVCodecContext *avctx_mjpeg; // wrapper context for MJPEG
+    AVFrame *jpgframe;           // decoded JPEG tile
+
+    int get_subimage;
+    uint16_t get_page;
+    int get_thumbnail;
+
+    enum TiffType tiff_type;
     int width, height;
     unsigned int bpp, bppcount;
     uint32_t palette[256];
@@ -64,12 +78,30 @@
     int predictor;
     int fill_order;
     uint32_t res[4];
+    int is_thumbnail;
+
+    int is_bayer;
+    uint8_t pattern[4];
+    unsigned black_level;
+    unsigned white_level;
+    uint16_t dng_lut[65536];
+
+    uint32_t sub_ifd;
+    uint16_t cur_page;
 
     int strips, rps, sstype;
     int sot;
     int stripsizesoff, stripsize, stripoff, strippos;
     LZWState *lzw;
 
+    /* Tile support */
+    int is_tiled;
+    int tile_byte_counts_offset, tile_offsets_offset;
+    int tile_width, tile_length;
+    int tile_count;
+
+    int is_jpeg;
+
     uint8_t *deinvert_buf;
     int deinvert_buf_size;
     uint8_t *yuv_line;
@@ -81,6 +113,11 @@
     TiffGeoTag *geotags;
 } TiffContext;
 
+static void tiff_set_type(TiffContext *s, enum TiffType tiff_type) {
+    if (s->tiff_type < tiff_type) // Prioritize higher-valued entries
+        s->tiff_type = tiff_type;
+}
+
 static void free_geotags(TiffContext *const s)
 {
     int i;
@@ -236,7 +273,12 @@
     };
 }
 
-static void av_always_inline horizontal_fill(unsigned int bpp, uint8_t* dst,
+static void av_always_inline dng_blit(TiffContext *s, uint8_t *dst, int dst_stride,
+                                      const uint8_t *src, int src_stride, int width, int height,
+                                      int is_single_comp, int is_u16);
+
+static void av_always_inline horizontal_fill(TiffContext *s,
+                                             unsigned int bpp, uint8_t* dst,
                                              int usePtr, const uint8_t *src,
                                              uint8_t c, int width, int offset)
 {
@@ -267,6 +309,20 @@
             dst[(width+offset)*2+0] = (usePtr ? src[width] : c) >> 4;
         }
         break;
+    case 10:
+    case 12:
+    case 14: {
+            uint16_t *dst16 = (uint16_t *)dst;
+            int is_dng = (s->tiff_type == TIFF_TYPE_DNG || s->tiff_type == TIFF_TYPE_CINEMADNG);
+            uint8_t shift = is_dng ? 0 : 16 - bpp;
+            GetBitContext gb;
+
+            init_get_bits8(&gb, src, width);
+            for (int i = 0; i < s->width; i++) {
+                dst16[i] = get_bits(&gb, bpp) << shift;
+            }
+        }
+        break;
     default:
         if (usePtr) {
             memcpy(dst + offset, src, width);
@@ -289,6 +345,19 @@
     return 0;
 }
 
+static void unpack_gray(TiffContext *s, AVFrame *p,
+                       const uint8_t *src, int lnum, int width, int bpp)
+{
+    GetBitContext gb;
+    uint16_t *dst = (uint16_t *)(p->data[0] + lnum * p->linesize[0]);
+
+    init_get_bits8(&gb, src, width);
+
+    for (int i = 0; i < s->width; i++) {
+        dst[i] = get_bits(&gb, bpp);
+    }
+}
+
 static void unpack_yuv(TiffContext *s, AVFrame *p,
                        const uint8_t *src, int lnum)
 {
@@ -368,7 +437,7 @@
     src = zbuf;
     for (line = 0; line < lines; line++) {
         if (s->bpp < 8 && s->avctx->pix_fmt == AV_PIX_FMT_PAL8) {
-            horizontal_fill(s->bpp, dst, 1, src, 0, width, 0);
+            horizontal_fill(s, s->bpp, dst, 1, src, 0, width, 0);
         } else {
             memcpy(dst, src, width);
         }
@@ -433,7 +502,7 @@
     src = buf;
     for (line = 0; line < lines; line++) {
         if (s->bpp < 8 && s->avctx->pix_fmt == AV_PIX_FMT_PAL8) {
-            horizontal_fill(s->bpp, dst, 1, src, 0, width, 0);
+            horizontal_fill(s, s->bpp, dst, 1, src, 0, width, 0);
         } else {
             memcpy(dst, src, width);
         }
@@ -476,12 +545,14 @@
                           s->compr, s->fax_opts);
     if (s->bpp < 8 && s->avctx->pix_fmt == AV_PIX_FMT_PAL8)
         for (line = 0; line < lines; line++) {
-            horizontal_fill(s->bpp, dst, 1, dst, 0, width, 0);
+            horizontal_fill(s, s->bpp, dst, 1, dst, 0, width, 0);
             dst += stride;
         }
     return ret;
 }
 
+static int dng_decode_strip(AVCodecContext *avctx, AVFrame *frame);
+
 static int tiff_unpack_strip(TiffContext *s, AVFrame *p, uint8_t *dst, int stride,
                              const uint8_t *src, int size, int strip_start, int lines)
 {
@@ -493,6 +564,7 @@
     int is_yuv = !(desc->flags & AV_PIX_FMT_FLAG_RGB) &&
                  (desc->flags & AV_PIX_FMT_FLAG_PLANAR) &&
                  desc->nb_components >= 3;
+    int is_dng;
 
     if (s->planar)
         width /= s->bppcount;
@@ -516,6 +588,18 @@
         av_assert0(width <= bytes_per_row);
         av_assert0(s->bpp == 24);
     }
+    if (s->is_bayer) {
+        width = (s->bpp * s->width + 7) >> 3;
+    }
+    if (p->format == AV_PIX_FMT_GRAY12) {
+        av_fast_padded_malloc(&s->yuv_line, &s->yuv_line_size, width);
+        if (s->yuv_line == NULL) {
+            av_log(s->avctx, AV_LOG_ERROR, "Not enough memory\n");
+            return AVERROR(ENOMEM);
+        }
+        dst = s->yuv_line;
+        stride = 0;
+    }
 
     if (s->compr == TIFF_DEFLATE || s->compr == TIFF_ADOBE_DEFLATE) {
 #if CONFIG_ZLIB
@@ -559,10 +643,12 @@
                 return AVERROR_INVALIDDATA;
             }
             if (s->bpp < 8 && s->avctx->pix_fmt == AV_PIX_FMT_PAL8)
-                horizontal_fill(s->bpp, dst, 1, dst, 0, width, 0);
+                horizontal_fill(s, s->bpp, dst, 1, dst, 0, width, 0);
             if (is_yuv) {
                 unpack_yuv(s, p, dst, strip_start + line);
                 line += s->subsampling[1] - 1;
+            } else if (p->format == AV_PIX_FMT_GRAY12) {
+                unpack_gray(s, p, dst, strip_start + line, width, s->bpp);
             }
             dst += stride;
         }
@@ -571,7 +657,7 @@
     if (s->compr == TIFF_CCITT_RLE ||
         s->compr == TIFF_G3        ||
         s->compr == TIFF_G4) {
-        if (is_yuv)
+        if (is_yuv || p->format == AV_PIX_FMT_GRAY12)
             return AVERROR_INVALIDDATA;
 
         return tiff_unpack_fax(s, dst, stride, src, size, width, lines);
@@ -580,6 +666,19 @@
     bytestream2_init(&s->gb, src, size);
     bytestream2_init_writer(&pb, dst, is_yuv ? s->yuv_line_size : (stride * lines));
 
+    is_dng = (s->tiff_type == TIFF_TYPE_DNG || s->tiff_type == TIFF_TYPE_CINEMADNG);
+
+    /* Decode JPEG-encoded DNGs with strips */
+    if (s->compr == TIFF_NEWJPEG && is_dng) {
+        if (s->strips > 1) {
+            av_log(s->avctx, AV_LOG_ERROR, "More than one DNG JPEG strips unsupported\n");
+            return AVERROR_PATCHWELCOME;
+        }
+        if ((ret = dng_decode_strip(s->avctx, p)) < 0)
+            return ret;
+        return 0;
+    }
+
     for (line = 0; line < lines; line++) {
         if (src - ssrc > size) {
             av_log(s->avctx, AV_LOG_ERROR, "Source data overread\n");
@@ -595,13 +694,33 @@
                 return AVERROR_INVALIDDATA;
 
             if (!s->fill_order) {
-                horizontal_fill(s->bpp * (s->avctx->pix_fmt == AV_PIX_FMT_PAL8),
+                horizontal_fill(s, s->bpp * (s->avctx->pix_fmt == AV_PIX_FMT_PAL8 || s->is_bayer),
                                 dst, 1, src, 0, width, 0);
             } else {
                 int i;
                 for (i = 0; i < width; i++)
                     dst[i] = ff_reverse[src[i]];
             }
+
+            /* Color processing for DNG images with uncompressed strips (non-tiled) */
+            if (is_dng) {
+                int is_u16, pixel_size_bytes, pixel_size_bits;
+
+                is_u16 = (s->bpp > 8);
+                pixel_size_bits = (is_u16 ? 16 : 8);
+                pixel_size_bytes = (is_u16 ? sizeof(uint16_t) : sizeof(uint8_t));
+
+                dng_blit(s,
+                         dst,
+                         0, // no stride, only 1 line
+                         dst,
+                         0, // no stride, only 1 line
+                         width / pixel_size_bytes * pixel_size_bits / s->bpp * s->bppcount, // need to account for [1, 16] bpp
+                         1,
+                         0, // single-component variation is only preset in JPEG-encoded DNGs
+                         is_u16);
+            }
+
             src += width;
             break;
         case TIFF_PACKBITS:
@@ -619,7 +738,7 @@
                                "Copy went out of bounds\n");
                         return AVERROR_INVALIDDATA;
                     }
-                    horizontal_fill(s->bpp * (s->avctx->pix_fmt == AV_PIX_FMT_PAL8),
+                    horizontal_fill(s, s->bpp * (s->avctx->pix_fmt == AV_PIX_FMT_PAL8),
                                     dst, 1, src, 0, code, pixels);
                     src    += code;
                     pixels += code;
@@ -631,7 +750,7 @@
                         return AVERROR_INVALIDDATA;
                     }
                     c = *src++;
-                    horizontal_fill(s->bpp * (s->avctx->pix_fmt == AV_PIX_FMT_PAL8),
+                    horizontal_fill(s, s->bpp * (s->avctx->pix_fmt == AV_PIX_FMT_PAL8),
                                     dst, 0, NULL, c, code, pixels);
                     pixels += code;
                 }
@@ -646,12 +765,265 @@
         if (is_yuv) {
             unpack_yuv(s, p, dst, strip_start + line);
             line += s->subsampling[1] - 1;
+        } else if (p->format == AV_PIX_FMT_GRAY12) {
+            unpack_gray(s, p, dst, strip_start + line, width, s->bpp);
         }
         dst += stride;
     }
     return 0;
 }
 
+/**
+ * Map stored raw sensor values into linear reference values (see: DNG Specification - Chapter 5)
+ */
+static uint16_t av_always_inline dng_process_color16(uint16_t value,
+                                                     const uint16_t *lut,
+                                                     uint16_t black_level,
+                                                     float scale_factor) {
+    float value_norm;
+
+    // Lookup table lookup
+    if (lut)
+        value = lut[value];
+
+    // Black level subtraction
+    value = av_clip_uint16_c((unsigned)value - black_level);
+
+    // Color scaling
+    value_norm = (float)value * scale_factor;
+
+    value = av_clip_uint16_c(value_norm * 65535);
+
+    return value;
+}
+
+static uint16_t av_always_inline dng_process_color8(uint16_t value,
+                                                    const uint16_t *lut,
+                                                    uint16_t black_level,
+                                                    float scale_factor) {
+    return dng_process_color16(value, lut, black_level, scale_factor) >> 8;
+}
+
+static void dng_blit(TiffContext *s, uint8_t *dst, int dst_stride,
+                     const uint8_t *src, int src_stride,
+                     int width, int height, int is_single_comp, int is_u16)
+{
+    int line, col;
+    float scale_factor;
+
+    scale_factor = 1.0f / (s->white_level - s->black_level);
+
+    if (is_single_comp) {
+        if (!is_u16)
+            return; /* <= 8bpp unsupported */
+
+        /* Image is double the width and half the height we need, each row comprises 2 rows of the output
+           (split vertically in the middle). */
+        for (line = 0; line < height / 2; line++) {
+            uint16_t *dst_u16 = (uint16_t *)dst;
+            uint16_t *src_u16 = (uint16_t *)src;
+
+            /* Blit first half of input row row to initial row of output */
+            for (col = 0; col < width; col++)
+                *dst_u16++ = dng_process_color16(*src_u16++, s->dng_lut, s->black_level, scale_factor);
+
+            /* Advance the destination pointer by a row (source pointer remains in the same place) */
+            dst += dst_stride * sizeof(uint16_t);
+            dst_u16 = (uint16_t *)dst;
+
+            /* Blit second half of input row row to next row of output */
+            for (col = 0; col < width; col++)
+                *dst_u16++ = dng_process_color16(*src_u16++, s->dng_lut, s->black_level, scale_factor);
+
+            dst += dst_stride * sizeof(uint16_t);
+            src += src_stride * sizeof(uint16_t);
+        }
+    } else {
+        /* Input and output image are the same size and the MJpeg decoder has done per-component
+           deinterleaving, so blitting here is straightforward. */
+        if (is_u16) {
+            for (line = 0; line < height; line++) {
+                uint16_t *dst_u16 = (uint16_t *)dst;
+                uint16_t *src_u16 = (uint16_t *)src;
+
+                for (col = 0; col < width; col++)
+                    *dst_u16++ = dng_process_color16(*src_u16++, s->dng_lut, s->black_level, scale_factor);
+
+                dst += dst_stride * sizeof(uint16_t);
+                src += src_stride * sizeof(uint16_t);
+            }
+        } else {
+            for (line = 0; line < height; line++) {
+                for (col = 0; col < width; col++)
+                    *dst++ = dng_process_color8(*src++, s->dng_lut, s->black_level, scale_factor);
+
+                dst += dst_stride;
+                src += src_stride;
+            }
+        }
+    }
+}
+
+static int dng_decode_jpeg(AVCodecContext *avctx, AVFrame *frame,
+                           int tile_byte_count, int dst_x, int dst_y, int w, int h)
+{
+    TiffContext *s = avctx->priv_data;
+    AVPacket jpkt;
+    uint8_t *dst_data, *src_data;
+    uint32_t dst_offset; /* offset from dst buffer in pixels */
+    int is_single_comp, is_u16, pixel_size;
+    int ret;
+
+    /* Prepare a packet and send to the MJPEG decoder */
+    av_init_packet(&jpkt);
+    jpkt.data = (uint8_t*)s->gb.buffer;
+    jpkt.size = tile_byte_count;
+
+    if (s->is_bayer) {
+        MJpegDecodeContext *mjpegdecctx = s->avctx_mjpeg->priv_data;
+        /* We have to set this information here, there is no way to know if a given JPEG is a DNG-embedded
+           image or not from its own data (and we need that information when decoding it). */
+        mjpegdecctx->bayer = 1;
+    }
+
+    ret = avcodec_send_packet(s->avctx_mjpeg, &jpkt);
+    if (ret < 0) {
+        av_log(avctx, AV_LOG_ERROR, "Error submitting a packet for decoding\n");
+        return ret;
+    }
+
+    ret = avcodec_receive_frame(s->avctx_mjpeg, s->jpgframe);
+    if (ret < 0) {
+        av_log(avctx, AV_LOG_ERROR, "JPEG decoding error: %s.\n", av_err2str(ret));
+
+        /* Normally skip, error if explode */
+        if (avctx->err_recognition & AV_EF_EXPLODE)
+            return AVERROR_INVALIDDATA;
+        else
+            return 0;
+    }
+
+    /* Copy the outputted tile's pixels from 'jpgframe' to 'frame' (final buffer) */
+
+    /* See dng_blit for explanation */
+    is_single_comp = (s->avctx_mjpeg->width == w * 2 && s->avctx_mjpeg->height == h / 2);
+
+    is_u16 = (s->bpp > 8);
+    pixel_size = (is_u16 ? sizeof(uint16_t) : sizeof(uint8_t));
+
+    if (is_single_comp && !is_u16) {
+        av_log(s->avctx, AV_LOG_ERROR, "DNGs with bpp <= 8 and 1 component are unsupported\n");
+        av_frame_unref(s->jpgframe);
+        return AVERROR_PATCHWELCOME;
+    }
+
+    dst_offset = dst_x + frame->linesize[0] * dst_y / pixel_size;
+    dst_data = frame->data[0] + dst_offset * pixel_size;
+    src_data = s->jpgframe->data[0];
+
+    dng_blit(s,
+             dst_data,
+             frame->linesize[0] / pixel_size,
+             src_data,
+             s->jpgframe->linesize[0] / pixel_size,
+             w,
+             h,
+             is_single_comp,
+             is_u16);
+
+    av_frame_unref(s->jpgframe);
+
+    return 0;
+}
+
+static int dng_decode_tiles(AVCodecContext *avctx, AVFrame *frame, AVPacket *avpkt)
+{
+    TiffContext *s = avctx->priv_data;
+    int tile_idx;
+    int tile_offset_offset, tile_offset;
+    int tile_byte_count_offset, tile_byte_count;
+    int tile_count_x, tile_count_y;
+    int tile_width, tile_length;
+    int has_width_leftover, has_height_leftover;
+    int tile_x = 0, tile_y = 0;
+    int pos_x = 0, pos_y = 0;
+    int ret;
+
+    s->jpgframe->width  = s->tile_width;
+    s->jpgframe->height = s->tile_length;
+
+    s->avctx_mjpeg->width = s->tile_width;
+    s->avctx_mjpeg->height = s->tile_length;
+
+    has_width_leftover = (s->width % s->tile_width != 0);
+    has_height_leftover = (s->height % s->tile_length != 0);
+
+    /* Calculate tile counts (round up) */
+    tile_count_x = (s->width + s->tile_width - 1) / s->tile_width;
+    tile_count_y = (s->height + s->tile_length - 1) / s->tile_length;
+
+    /* Iterate over the number of tiles */
+    for (tile_idx = 0; tile_idx < s->tile_count; tile_idx++) {
+        tile_x = tile_idx % tile_count_x;
+        tile_y = tile_idx / tile_count_x;
+
+        if (has_width_leftover && tile_x == tile_count_x - 1) // If on the right-most tile
+            tile_width = s->width % s->tile_width;
+        else
+            tile_width = s->tile_width;
+
+        if (has_height_leftover && tile_y == tile_count_y - 1) // If on the bottom-most tile
+            tile_length = s->height % s->tile_length;
+        else
+            tile_length = s->tile_length;
+
+        /* Read tile offset */
+        tile_offset_offset = s->tile_offsets_offset + tile_idx * sizeof(int);
+        bytestream2_seek(&s->gb, tile_offset_offset, SEEK_SET);
+        tile_offset = ff_tget_long(&s->gb, s->le);
+
+        /* Read tile byte size */
+        tile_byte_count_offset = s->tile_byte_counts_offset + tile_idx * sizeof(int);
+        bytestream2_seek(&s->gb, tile_byte_count_offset, SEEK_SET);
+        tile_byte_count = ff_tget_long(&s->gb, s->le);
+
+        /* Seek to tile data */
+        bytestream2_seek(&s->gb, tile_offset, SEEK_SET);
+
+        /* Decode JPEG tile and copy it in the reference frame */
+        ret = dng_decode_jpeg(avctx, frame, tile_byte_count, pos_x, pos_y, tile_width, tile_length);
+
+        if (ret < 0)
+            return ret;
+
+        /* Advance current positions */
+        pos_x += tile_width;
+        if (tile_x == tile_count_x - 1) { // If on the right edge
+            pos_x = 0;
+            pos_y += tile_length;
+        }
+    }
+
+    /* Frame is ready to be output */
+    frame->pict_type = AV_PICTURE_TYPE_I;
+    frame->key_frame = 1;
+
+    return avpkt->size;
+}
+
+static int dng_decode_strip(AVCodecContext *avctx, AVFrame *frame)
+{
+    TiffContext *s = avctx->priv_data;
+
+    s->jpgframe->width  = s->width;
+    s->jpgframe->height = s->height;
+
+    s->avctx_mjpeg->width = s->width;
+    s->avctx_mjpeg->height = s->height;
+
+    return dng_decode_jpeg(avctx, frame, s->stripsize, 0, 0, s->width, s->height);
+}
+
 static int init_image(TiffContext *s, ThreadFrame *frame)
 {
     int ret;
@@ -665,7 +1037,7 @@
         return AVERROR_INVALIDDATA;
     }
 
-    switch (s->planar * 1000 + s->bpp * 10 + s->bppcount) {
+    switch (s->planar * 1000 + s->bpp * 10 + s->bppcount + s->is_bayer * 10000) {
     case 11:
         if (!s->palette_is_set) {
             s->avctx->pix_fmt = AV_PIX_FMT_MONOBLACK;
@@ -681,6 +1053,52 @@
     case 81:
         s->avctx->pix_fmt = s->palette_is_set ? AV_PIX_FMT_PAL8 : AV_PIX_FMT_GRAY8;
         break;
+    case 121:
+        s->avctx->pix_fmt = AV_PIX_FMT_GRAY12;
+        break;
+    case 10081:
+        switch (AV_RL32(s->pattern)) {
+        case 0x02010100:
+            s->avctx->pix_fmt = AV_PIX_FMT_BAYER_RGGB8;
+            break;
+        case 0x00010102:
+            s->avctx->pix_fmt = AV_PIX_FMT_BAYER_BGGR8;
+            break;
+        case 0x01000201:
+            s->avctx->pix_fmt = AV_PIX_FMT_BAYER_GBRG8;
+            break;
+        case 0x01020001:
+            s->avctx->pix_fmt = AV_PIX_FMT_BAYER_GRBG8;
+            break;
+        default:
+            av_log(s->avctx, AV_LOG_ERROR, "Unsupported Bayer pattern: 0x%X\n",
+                   AV_RL32(s->pattern));
+            return AVERROR_PATCHWELCOME;
+        }
+        break;
+    case 10101:
+    case 10121:
+    case 10141:
+    case 10161:
+        switch (AV_RL32(s->pattern)) {
+        case 0x02010100:
+            s->avctx->pix_fmt = AV_PIX_FMT_BAYER_RGGB16;
+            break;
+        case 0x00010102:
+            s->avctx->pix_fmt = AV_PIX_FMT_BAYER_BGGR16;
+            break;
+        case 0x01000201:
+            s->avctx->pix_fmt = AV_PIX_FMT_BAYER_GBRG16;
+            break;
+        case 0x01020001:
+            s->avctx->pix_fmt = AV_PIX_FMT_BAYER_GRBG16;
+            break;
+        default:
+            av_log(s->avctx, AV_LOG_ERROR, "Unsupported Bayer pattern: 0x%X\n",
+                   AV_RL32(s->pattern));
+            return AVERROR_PATCHWELCOME;
+        }
+        break;
     case 243:
         if (s->photometric == TIFF_PHOTOMETRIC_YCBCR) {
             if (s->subsampling[0] == 1 && s->subsampling[1] == 1) {
@@ -712,7 +1130,16 @@
         s->avctx->pix_fmt = s->le ? AV_PIX_FMT_YA16LE : AV_PIX_FMT_YA16BE;
         break;
     case 324:
-        s->avctx->pix_fmt = AV_PIX_FMT_RGBA;
+        s->avctx->pix_fmt = s->photometric == TIFF_PHOTOMETRIC_SEPARATED ? AV_PIX_FMT_RGB0 : AV_PIX_FMT_RGBA;
+        break;
+    case 405:
+        if (s->photometric == TIFF_PHOTOMETRIC_SEPARATED)
+            s->avctx->pix_fmt = AV_PIX_FMT_RGBA;
+        else {
+            av_log(s->avctx, AV_LOG_ERROR,
+                "bpp=40 without PHOTOMETRIC_SEPARATED is unsupported\n");
+            return AVERROR_PATCHWELCOME;
+        }
         break;
     case 483:
         s->avctx->pix_fmt = s->le ? AV_PIX_FMT_RGB48LE  : AV_PIX_FMT_RGB48BE;
@@ -791,7 +1218,9 @@
 
 static int tiff_decode_tag(TiffContext *s, AVFrame *frame)
 {
-    unsigned tag, type, count, off, value = 0, value2 = 0;
+    AVFrameSideData *sd;
+    GetByteContext gb_temp;
+    unsigned tag, type, count, off, value = 0, value2 = 1; // value2 is a denominator so init. to 1
     int i, start;
     int pos;
     int ret;
@@ -813,6 +1242,11 @@
         case TIFF_RATIONAL:
             value  = ff_tget(&s->gb, TIFF_LONG, s->le);
             value2 = ff_tget(&s->gb, TIFF_LONG, s->le);
+            if (!value2) {
+                av_log(s->avctx, AV_LOG_ERROR, "Invalid denominator in rational\n");
+                return AVERROR_INVALIDDATA;
+            }
+
             break;
         case TIFF_STRING:
             if (count <= 4) {
@@ -824,6 +1258,9 @@
     }
 
     switch (tag) {
+    case TIFF_SUBFILE:
+        s->is_thumbnail = (value != 0);
+        break;
     case TIFF_WIDTH:
         s->width = value;
         break;
@@ -831,7 +1268,7 @@
         s->height = value;
         break;
     case TIFF_BPP:
-        if (count > 4U) {
+        if (count > 5U) {
             av_log(s->avctx, AV_LOG_ERROR,
                    "This format is not supported (bpp=%d, %d components)\n",
                    value, count);
@@ -862,7 +1299,7 @@
                    "Samples per pixel requires a single value, many provided\n");
             return AVERROR_INVALIDDATA;
         }
-        if (value > 4U) {
+        if (value > 5U) {
             av_log(s->avctx, AV_LOG_ERROR,
                    "Samples per pixel %d is too large\n", value);
             return AVERROR_INVALIDDATA;
@@ -895,8 +1332,8 @@
 #endif
         case TIFF_JPEG:
         case TIFF_NEWJPEG:
-            avpriv_report_missing_feature(s->avctx, "JPEG compression");
-            return AVERROR_PATCHWELCOME;
+            s->is_jpeg = 1;
+            break;
         case TIFF_LZMA:
 #if CONFIG_LZMA
             break;
@@ -951,34 +1388,86 @@
     case TIFF_YRES:
         set_sar(s, tag, value, value2);
         break;
-    case TIFF_TILE_BYTE_COUNTS:
-    case TIFF_TILE_LENGTH:
     case TIFF_TILE_OFFSETS:
+        s->tile_offsets_offset = off;
+        s->tile_count = count;
+        s->is_tiled = 1;
+        break;
+    case TIFF_TILE_BYTE_COUNTS:
+        s->tile_byte_counts_offset = off;
+        break;
+    case TIFF_TILE_LENGTH:
+        s->tile_length = value;
+        break;
     case TIFF_TILE_WIDTH:
-        av_log(s->avctx, AV_LOG_ERROR, "Tiled images are not supported\n");
-        return AVERROR_PATCHWELCOME;
+        s->tile_width = value;
         break;
     case TIFF_PREDICTOR:
         s->predictor = value;
         break;
+    case TIFF_SUB_IFDS:
+        if (count == 1)
+            s->sub_ifd = value;
+        else if (count > 1)
+            s->sub_ifd = ff_tget(&s->gb, TIFF_LONG, s->le); /** Only get the first SubIFD */
+        break;
+    case DNG_LINEARIZATION_TABLE:
+        for (int i = 0; i < FFMIN(count, 1 << s->bpp); i++)
+            s->dng_lut[i] = ff_tget(&s->gb, type, s->le);
+        break;
+    case DNG_BLACK_LEVEL:
+        if (count > 1) {    /* Use the first value in the pattern (assume they're all the same) */
+            if (type == TIFF_RATIONAL) {
+                value  = ff_tget(&s->gb, TIFF_LONG, s->le);
+                value2 = ff_tget(&s->gb, TIFF_LONG, s->le);
+                if (!value2) {
+                    av_log(s->avctx, AV_LOG_ERROR, "Invalid black level denominator\n");
+                    return AVERROR_INVALIDDATA;
+                }
+
+                s->black_level = value / value2;
+            } else
+                s->black_level = ff_tget(&s->gb, type, s->le);
+            av_log(s->avctx, AV_LOG_WARNING, "Assuming black level pattern values are identical\n");
+        } else {
+            s->black_level = value / value2;
+        }
+        break;
+    case DNG_WHITE_LEVEL:
+        s->white_level = value;
+        break;
+    case TIFF_CFA_PATTERN_DIM:
+        if (count != 2 || (ff_tget(&s->gb, type, s->le) != 2 &&
+                           ff_tget(&s->gb, type, s->le) != 2)) {
+            av_log(s->avctx, AV_LOG_ERROR, "CFA Pattern dimensions are not 2x2\n");
+            return AVERROR_INVALIDDATA;
+        }
+        break;
+    case TIFF_CFA_PATTERN:
+        s->is_bayer = 1;
+        s->pattern[0] = ff_tget(&s->gb, type, s->le);
+        s->pattern[1] = ff_tget(&s->gb, type, s->le);
+        s->pattern[2] = ff_tget(&s->gb, type, s->le);
+        s->pattern[3] = ff_tget(&s->gb, type, s->le);
+        break;
     case TIFF_PHOTOMETRIC:
         switch (value) {
         case TIFF_PHOTOMETRIC_WHITE_IS_ZERO:
         case TIFF_PHOTOMETRIC_BLACK_IS_ZERO:
         case TIFF_PHOTOMETRIC_RGB:
         case TIFF_PHOTOMETRIC_PALETTE:
+        case TIFF_PHOTOMETRIC_SEPARATED:
         case TIFF_PHOTOMETRIC_YCBCR:
+        case TIFF_PHOTOMETRIC_CFA:
+        case TIFF_PHOTOMETRIC_LINEAR_RAW: // Used by DNG images
             s->photometric = value;
             break;
         case TIFF_PHOTOMETRIC_ALPHA_MASK:
-        case TIFF_PHOTOMETRIC_SEPARATED:
         case TIFF_PHOTOMETRIC_CIE_LAB:
         case TIFF_PHOTOMETRIC_ICC_LAB:
         case TIFF_PHOTOMETRIC_ITU_LAB:
-        case TIFF_PHOTOMETRIC_CFA:
         case TIFF_PHOTOMETRIC_LOG_L:
         case TIFF_PHOTOMETRIC_LOG_LUV:
-        case TIFF_PHOTOMETRIC_LINEAR_RAW:
             avpriv_report_missing_feature(s->avctx,
                                           "PhotometricInterpretation 0x%04X",
                                           value);
@@ -1156,6 +1645,22 @@
             }
         }
         break;
+    case TIFF_ICC_PROFILE:
+        if (type != TIFF_UNDEFINED)
+            return AVERROR_INVALIDDATA;
+
+        gb_temp = s->gb;
+        bytestream2_seek(&gb_temp, SEEK_SET, off);
+
+        if (bytestream2_get_bytes_left(&gb_temp) < count)
+            return AVERROR_INVALIDDATA;
+
+        sd = av_frame_new_side_data(frame, AV_FRAME_DATA_ICC_PROFILE, count);
+        if (!sd)
+            return AVERROR(ENOMEM);
+
+        bytestream2_get_bufferu(&gb_temp, sd->data, count);
+        break;
     case TIFF_ARTIST:
         ADD_METADATA(count, "artist", NULL);
         break;
@@ -1185,14 +1690,41 @@
         break;
     case TIFF_PAGE_NUMBER:
         ADD_METADATA(count, "page_number", " / ");
+        // need to seek back to re-read the page number
+        bytestream2_seek(&s->gb, -count * sizeof(uint16_t), SEEK_CUR);
+        // read the page number
+        s->cur_page = ff_tget(&s->gb, TIFF_SHORT, s->le);
+        // get back to where we were before the previous seek
+        bytestream2_seek(&s->gb, count * sizeof(uint16_t) - sizeof(uint16_t), SEEK_CUR);
         break;
     case TIFF_SOFTWARE_NAME:
         ADD_METADATA(count, "software", NULL);
         break;
+    case DNG_VERSION:
+        if (count == 4) {
+            unsigned int ver[4];
+            ver[0] = ff_tget(&s->gb, type, s->le);
+            ver[1] = ff_tget(&s->gb, type, s->le);
+            ver[2] = ff_tget(&s->gb, type, s->le);
+            ver[3] = ff_tget(&s->gb, type, s->le);
+
+            av_log(s->avctx, AV_LOG_DEBUG, "DNG file, version %u.%u.%u.%u\n",
+                ver[0], ver[1], ver[2], ver[3]);
+
+            tiff_set_type(s, TIFF_TYPE_DNG);
+        }
+        break;
+    case CINEMADNG_TIME_CODES:
+    case CINEMADNG_FRAME_RATE:
+    case CINEMADNG_T_STOP:
+    case CINEMADNG_REEL_NAME:
+    case CINEMADNG_CAMERA_LABEL:
+        tiff_set_type(s, TIFF_TYPE_CINEMADNG);
+        break;
     default:
         if (s->avctx->err_recognition & AV_EF_EXPLODE) {
             av_log(s->avctx, AV_LOG_ERROR,
-                   "Unknown or unsupported tag %d/0X%0X\n",
+                   "Unknown or unsupported tag %d/0x%0X\n",
                    tag, tag);
             return AVERROR_INVALIDDATA;
         }
@@ -1215,13 +1747,15 @@
     TiffContext *const s = avctx->priv_data;
     AVFrame *const p = data;
     ThreadFrame frame = { .f = data };
-    unsigned off;
+    unsigned off, last_off;
     int le, ret, plane, planes;
     int i, j, entries, stride;
     unsigned soff, ssize;
     uint8_t *dst;
     GetByteContext stripsizes;
     GetByteContext stripdata;
+    int retry_for_subifd, retry_for_page;
+    int is_dng;
 
     bytestream2_init(&s->gb, avpkt->data, avpkt->size);
 
@@ -1235,10 +1769,23 @@
     }
     s->le          = le;
     // TIFF_BPP is not a required tag and defaults to 1
+
+    s->tiff_type   = TIFF_TYPE_TIFF;
+again:
+    s->is_thumbnail = 0;
     s->bppcount    = s->bpp = 1;
     s->photometric = TIFF_PHOTOMETRIC_NONE;
     s->compr       = TIFF_RAW;
     s->fill_order  = 0;
+    s->white_level = 0;
+    s->is_bayer    = 0;
+    s->is_tiled    = 0;
+    s->is_jpeg     = 0;
+    s->cur_page    = 0;
+
+    for (i = 0; i < 65536; i++)
+        s->dng_lut[i] = i;
+
     free_geotags(s);
 
     // Reset these offsets so we can tell if they were set this frame
@@ -1253,6 +1800,46 @@
             return ret;
     }
 
+    if (s->get_thumbnail && !s->is_thumbnail) {
+        av_log(avctx, AV_LOG_INFO, "No embedded thumbnail present\n");
+        return AVERROR_EOF;
+    }
+
+    /** whether we should process this IFD's SubIFD */
+    retry_for_subifd = s->sub_ifd && (s->get_subimage || (!s->get_thumbnail && s->is_thumbnail));
+    /** whether we should process this multi-page IFD's next page */
+    retry_for_page = s->get_page && s->cur_page + 1 < s->get_page;  // get_page is 1-indexed
+
+    last_off = off;
+    if (retry_for_page) {
+        // set offset to the next IFD
+        off = ff_tget_long(&s->gb, le);
+    } else if (retry_for_subifd) {
+        // set offset to the SubIFD
+        off = s->sub_ifd;
+    }
+
+    if (retry_for_subifd || retry_for_page) {
+        if (!off) {
+            av_log(avctx, AV_LOG_ERROR, "Requested entry not found\n");
+            return AVERROR_INVALIDDATA;
+        }
+        if (off <= last_off) {
+            avpriv_request_sample(s->avctx, "non increasing IFD offset\n");
+            return AVERROR_INVALIDDATA;
+        }
+        if (off >= UINT_MAX - 14 || avpkt->size < off + 14) {
+            av_log(avctx, AV_LOG_ERROR, "IFD offset is greater than image size\n");
+            return AVERROR_INVALIDDATA;
+        }
+        s->sub_ifd = 0;
+        goto again;
+    }
+
+    /* At this point we've decided on which (Sub)IFD to process */
+
+    is_dng = (s->tiff_type == TIFF_TYPE_DNG || s->tiff_type == TIFF_TYPE_CINEMADNG);
+
     for (i = 0; i<s->geotag_count; i++) {
         const char *keyname = get_geokey_name(s->geotags[i].key);
         if (!keyname) {
@@ -1270,42 +1857,91 @@
         }
     }
 
-    if (!s->strippos && !s->stripoff) {
+    if (is_dng) {
+        if (s->white_level == 0)
+            s->white_level = (1 << s->bpp) - 1; /* Default value as per the spec */
+
+        if (s->white_level <= s->black_level) {
+            av_log(avctx, AV_LOG_ERROR, "BlackLevel (%"PRId32") must be less than WhiteLevel (%"PRId32")\n",
+                s->black_level, s->white_level);
+            return AVERROR_INVALIDDATA;
+        }
+    }
+
+    if (!s->is_tiled && !s->strippos && !s->stripoff) {
         av_log(avctx, AV_LOG_ERROR, "Image data is missing\n");
         return AVERROR_INVALIDDATA;
     }
+
     /* now we have the data and may start decoding */
     if ((ret = init_image(s, &frame)) < 0)
         return ret;
 
-    if (s->strips == 1 && !s->stripsize) {
-        av_log(avctx, AV_LOG_WARNING, "Image data size missing\n");
-        s->stripsize = avpkt->size - s->stripoff;
+    if (!s->is_tiled) {
+        if (s->strips == 1 && !s->stripsize) {
+            av_log(avctx, AV_LOG_WARNING, "Image data size missing\n");
+            s->stripsize = avpkt->size - s->stripoff;
+        }
+
+        if (s->stripsizesoff) {
+            if (s->stripsizesoff >= (unsigned)avpkt->size)
+                return AVERROR_INVALIDDATA;
+            bytestream2_init(&stripsizes, avpkt->data + s->stripsizesoff,
+                            avpkt->size - s->stripsizesoff);
+        }
+        if (s->strippos) {
+            if (s->strippos >= (unsigned)avpkt->size)
+                return AVERROR_INVALIDDATA;
+            bytestream2_init(&stripdata, avpkt->data + s->strippos,
+                            avpkt->size - s->strippos);
+        }
+
+        if (s->rps <= 0 || s->rps % s->subsampling[1]) {
+            av_log(avctx, AV_LOG_ERROR, "rps %d invalid\n", s->rps);
+            return AVERROR_INVALIDDATA;
+        }
     }
 
-    if (s->stripsizesoff) {
-        if (s->stripsizesoff >= (unsigned)avpkt->size)
-            return AVERROR_INVALIDDATA;
-        bytestream2_init(&stripsizes, avpkt->data + s->stripsizesoff,
-                         avpkt->size - s->stripsizesoff);
-    }
-    if (s->strippos) {
-        if (s->strippos >= (unsigned)avpkt->size)
-            return AVERROR_INVALIDDATA;
-        bytestream2_init(&stripdata, avpkt->data + s->strippos,
-                         avpkt->size - s->strippos);
+    if (s->photometric == TIFF_PHOTOMETRIC_LINEAR_RAW ||
+        s->photometric == TIFF_PHOTOMETRIC_CFA) {
+        p->color_trc = AVCOL_TRC_LINEAR;
+    } else if (s->photometric == TIFF_PHOTOMETRIC_BLACK_IS_ZERO) {
+        p->color_trc = AVCOL_TRC_GAMMA22;
     }
 
-    if (s->rps <= 0 || s->rps % s->subsampling[1]) {
-        av_log(avctx, AV_LOG_ERROR, "rps %d invalid\n", s->rps);
-        return AVERROR_INVALIDDATA;
+    /* Handle DNG images with JPEG-compressed tiles */
+
+    if (is_dng && s->is_tiled) {
+        if (!s->is_jpeg) {
+            avpriv_report_missing_feature(avctx, "DNG uncompressed tiled images");
+            return AVERROR_PATCHWELCOME;
+        } else if (!s->is_bayer) {
+            avpriv_report_missing_feature(avctx, "DNG JPG-compressed tiled non-bayer-encoded images");
+            return AVERROR_PATCHWELCOME;
+        } else {
+            if ((ret = dng_decode_tiles(avctx, (AVFrame*)data, avpkt)) > 0)
+                *got_frame = 1;
+            return ret;
+        }
     }
 
+    /* Handle TIFF images and DNG images with uncompressed strips (non-tiled) */
+
     planes = s->planar ? s->bppcount : 1;
     for (plane = 0; plane < planes; plane++) {
+        uint8_t *five_planes = NULL;
         int remaining = avpkt->size;
+        int decoded_height;
         stride = p->linesize[plane];
         dst = p->data[plane];
+        if (s->photometric == TIFF_PHOTOMETRIC_SEPARATED &&
+            s->avctx->pix_fmt == AV_PIX_FMT_RGBA) {
+            stride = stride * 5 / 4;
+            five_planes =
+            dst = av_malloc(stride * s->height);
+            if (!dst)
+                return AVERROR(ENOMEM);
+        }
         for (i = 0; i < s->height; i += s->rps) {
             if (i)
                 dst += s->rps * stride;
@@ -1321,22 +1957,27 @@
 
             if (soff > avpkt->size || ssize > avpkt->size - soff || ssize > remaining) {
                 av_log(avctx, AV_LOG_ERROR, "Invalid strip size/offset\n");
+                av_freep(&five_planes);
                 return AVERROR_INVALIDDATA;
             }
             remaining -= ssize;
             if ((ret = tiff_unpack_strip(s, p, dst, stride, avpkt->data + soff, ssize, i,
                                          FFMIN(s->rps, s->height - i))) < 0) {
-                if (avctx->err_recognition & AV_EF_EXPLODE)
+                if (avctx->err_recognition & AV_EF_EXPLODE) {
+                    av_freep(&five_planes);
                     return ret;
+                }
                 break;
             }
         }
+        decoded_height = FFMIN(i, s->height);
+
         if (s->predictor == 2) {
             if (s->photometric == TIFF_PHOTOMETRIC_YCBCR) {
                 av_log(s->avctx, AV_LOG_ERROR, "predictor == 2 with YUV is unsupported");
                 return AVERROR_PATCHWELCOME;
             }
-            dst   = p->data[plane];
+            dst   = five_planes ? five_planes : p->data[plane];
             soff  = s->bpp >> 3;
             if (s->planar)
                 soff  = FFMAX(soff / s->bppcount, 1);
@@ -1347,7 +1988,7 @@
                 s->avctx->pix_fmt == AV_PIX_FMT_YA16LE ||
                 s->avctx->pix_fmt == AV_PIX_FMT_GBRP16LE ||
                 s->avctx->pix_fmt == AV_PIX_FMT_GBRAP16LE) {
-                for (i = 0; i < s->height; i++) {
+                for (i = 0; i < decoded_height; i++) {
                     for (j = soff; j < ssize; j += 2)
                         AV_WL16(dst + j, AV_RL16(dst + j) + AV_RL16(dst + j - soff));
                     dst += stride;
@@ -1358,13 +1999,13 @@
                        s->avctx->pix_fmt == AV_PIX_FMT_YA16BE ||
                        s->avctx->pix_fmt == AV_PIX_FMT_GBRP16BE ||
                        s->avctx->pix_fmt == AV_PIX_FMT_GBRAP16BE) {
-                for (i = 0; i < s->height; i++) {
+                for (i = 0; i < decoded_height; i++) {
                     for (j = soff; j < ssize; j += 2)
                         AV_WB16(dst + j, AV_RB16(dst + j) + AV_RB16(dst + j - soff));
                     dst += stride;
                 }
             } else {
-                for (i = 0; i < s->height; i++) {
+                for (i = 0; i < decoded_height; i++) {
                     for (j = soff; j < ssize; j++)
                         dst[j] += dst[j - soff];
                     dst += stride;
@@ -1381,6 +2022,44 @@
                 dst += stride;
             }
         }
+
+        if (s->photometric == TIFF_PHOTOMETRIC_SEPARATED &&
+            (s->avctx->pix_fmt == AV_PIX_FMT_RGB0 || s->avctx->pix_fmt == AV_PIX_FMT_RGBA)) {
+            int x = s->avctx->pix_fmt == AV_PIX_FMT_RGB0 ? 4 : 5;
+            uint8_t *src = five_planes ? five_planes : p->data[plane];
+            dst = p->data[plane];
+            for (i = 0; i < s->height; i++) {
+                for (j = 0; j < s->width; j++) {
+                    int k =  255 - src[x * j + 3];
+                    int r = (255 - src[x * j    ]) * k;
+                    int g = (255 - src[x * j + 1]) * k;
+                    int b = (255 - src[x * j + 2]) * k;
+                    dst[4 * j    ] = r * 257 >> 16;
+                    dst[4 * j + 1] = g * 257 >> 16;
+                    dst[4 * j + 2] = b * 257 >> 16;
+                    dst[4 * j + 3] = s->avctx->pix_fmt == AV_PIX_FMT_RGBA ? src[x * j + 4] : 255;
+                }
+                src += stride;
+                dst += p->linesize[plane];
+            }
+            av_freep(&five_planes);
+        } else if (s->photometric == TIFF_PHOTOMETRIC_SEPARATED &&
+            s->avctx->pix_fmt == AV_PIX_FMT_RGBA64BE) {
+            dst = p->data[plane];
+            for (i = 0; i < s->height; i++) {
+                for (j = 0; j < s->width; j++) {
+                    uint64_t k =  65535 - AV_RB16(dst + 8 * j + 6);
+                    uint64_t r = (65535 - AV_RB16(dst + 8 * j    )) * k;
+                    uint64_t g = (65535 - AV_RB16(dst + 8 * j + 2)) * k;
+                    uint64_t b = (65535 - AV_RB16(dst + 8 * j + 4)) * k;
+                    AV_WB16(dst + 8 * j    , r * 65537 >> 32);
+                    AV_WB16(dst + 8 * j + 2, g * 65537 >> 32);
+                    AV_WB16(dst + 8 * j + 4, b * 65537 >> 32);
+                    AV_WB16(dst + 8 * j + 6, 65535);
+                }
+                dst += p->linesize[plane];
+            }
+        }
     }
 
     if (s->planar && s->bppcount > 2) {
@@ -1390,6 +2069,15 @@
         FFSWAP(int,      p->linesize[0], p->linesize[1]);
     }
 
+    if (s->is_bayer && s->white_level && s->bpp == 16 && !is_dng) {
+        uint16_t *dst = (uint16_t *)p->data[0];
+        for (i = 0; i < s->height; i++) {
+            for (j = 0; j < s->width; j++)
+                dst[j] = FFMIN((dst[j] / (float)s->white_level) * 65535, 65535);
+            dst += stride / 2;
+        }
+    }
+
     *got_frame = 1;
 
     return avpkt->size;
@@ -1398,6 +2086,8 @@
 static av_cold int tiff_init(AVCodecContext *avctx)
 {
     TiffContext *s = avctx->priv_data;
+    const AVCodec *codec;
+    int ret;
 
     s->width  = 0;
     s->height = 0;
@@ -1409,6 +2099,27 @@
         return AVERROR(ENOMEM);
     ff_ccitt_unpack_init();
 
+    /* Allocate JPEG frame */
+    s->jpgframe = av_frame_alloc();
+    if (!s->jpgframe)
+        return AVERROR(ENOMEM);
+
+    /* Prepare everything needed for JPEG decoding */
+    codec = avcodec_find_decoder(AV_CODEC_ID_MJPEG);
+    if (!codec)
+        return AVERROR_BUG;
+    s->avctx_mjpeg = avcodec_alloc_context3(codec);
+    if (!s->avctx_mjpeg)
+        return AVERROR(ENOMEM);
+    s->avctx_mjpeg->flags = avctx->flags;
+    s->avctx_mjpeg->flags2 = avctx->flags2;
+    s->avctx_mjpeg->dct_algo = avctx->dct_algo;
+    s->avctx_mjpeg->idct_algo = avctx->idct_algo;
+    ret = ff_codec_open2_recursive(s->avctx_mjpeg, codec, NULL);
+    if (ret < 0) {
+        return ret;
+    }
+
     return 0;
 }
 
@@ -1421,11 +2132,30 @@
     ff_lzw_decode_close(&s->lzw);
     av_freep(&s->deinvert_buf);
     s->deinvert_buf_size = 0;
+    av_freep(&s->yuv_line);
+    s->yuv_line_size = 0;
     av_freep(&s->fax_buffer);
     s->fax_buffer_size = 0;
+    av_frame_free(&s->jpgframe);
+    avcodec_free_context(&s->avctx_mjpeg);
     return 0;
 }
 
+#define OFFSET(x) offsetof(TiffContext, x)
+static const AVOption tiff_options[] = {
+    { "subimage", "decode subimage instead if available", OFFSET(get_subimage), AV_OPT_TYPE_BOOL, {.i64=0},  0, 1, AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_VIDEO_PARAM },
+    { "thumbnail", "decode embedded thumbnail subimage instead if available", OFFSET(get_thumbnail), AV_OPT_TYPE_BOOL, {.i64=0},  0, 1, AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_VIDEO_PARAM },
+    { "page", "page number of multi-page image to decode (starting from 1)", OFFSET(get_page), AV_OPT_TYPE_INT, {.i64=0}, 0, UINT16_MAX, AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_VIDEO_PARAM },
+    { NULL },
+};
+
+static const AVClass tiff_decoder_class = {
+    .class_name = "TIFF decoder",
+    .item_name  = av_default_item_name,
+    .option     = tiff_options,
+    .version    = LIBAVUTIL_VERSION_INT,
+};
+
 AVCodec ff_tiff_decoder = {
     .name           = "tiff",
     .long_name      = NULL_IF_CONFIG_SMALL("TIFF image"),
@@ -1435,6 +2165,7 @@
     .init           = tiff_init,
     .close          = tiff_end,
     .decode         = decode_frame,
-    .init_thread_copy = ONLY_IF_THREADS_ENABLED(tiff_init),
     .capabilities   = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_FRAME_THREADS,
+    .caps_internal  = FF_CODEC_CAP_INIT_CLEANUP,
+    .priv_class     = &tiff_decoder_class,
 };
diff --git a/libavcodec/tiff.h b/libavcodec/tiff.h
index 3f692af..c07a5d4 100644
--- a/libavcodec/tiff.h
+++ b/libavcodec/tiff.h
@@ -20,7 +20,7 @@
 
 /**
  * @file
- * TIFF tables
+ * TIFF constants & data structures
  *
  * For more information about the TIFF format, check the official docs at:
  * http://partners.adobe.com/public/developer/tiff/index.html
@@ -33,7 +33,17 @@
 #include <stdint.h>
 #include "tiff_common.h"
 
-/** abridged list of TIFF tags */
+/** TIFF types in ascenting priority (last in the list is highest) */
+enum TiffType {
+    /** TIFF image based on the TIFF 6.0 or TIFF/EP (ISO 12234-2) specifications */
+    TIFF_TYPE_TIFF,
+    /** Digital Negative (DNG) image */
+    TIFF_TYPE_DNG,
+    /** Digital Negative (DNG) image part of an CinemaDNG image sequence */
+    TIFF_TYPE_CINEMADNG,
+};
+
+/** abridged list of TIFF and TIFF/EP tags */
 enum TiffTags {
     TIFF_SUBFILE            = 0xfe,
     TIFF_WIDTH              = 0x100,
@@ -70,21 +80,43 @@
     TIFF_TILE_LENGTH        = 0x143,
     TIFF_TILE_OFFSETS       = 0x144,
     TIFF_TILE_BYTE_COUNTS   = 0x145,
+    TIFF_SUB_IFDS           = 0x14A,
     TIFF_EXTRASAMPLES       = 0x152,
     TIFF_YCBCR_COEFFICIENTS = 0x211,
     TIFF_YCBCR_SUBSAMPLING  = 0x212,
     TIFF_YCBCR_POSITIONING  = 0x213,
     TIFF_REFERENCE_BW       = 0x214,
+    TIFF_CFA_PATTERN_DIM    = 0x828D,
+    TIFF_CFA_PATTERN        = 0x828E,
     TIFF_COPYRIGHT          = 0x8298,
     TIFF_MODEL_TIEPOINT     = 0x8482,
     TIFF_MODEL_PIXEL_SCALE  = 0x830E,
     TIFF_MODEL_TRANSFORMATION= 0x8480,
+    TIFF_ICC_PROFILE        = 0x8773,
     TIFF_GEO_KEY_DIRECTORY  = 0x87AF,
     TIFF_GEO_DOUBLE_PARAMS  = 0x87B0,
-    TIFF_GEO_ASCII_PARAMS   = 0x87B1
+    TIFF_GEO_ASCII_PARAMS   = 0x87B1,
 };
 
-/** list of TIFF compression types */
+/** abridged list of DNG tags */
+enum DngTags {
+    DNG_VERSION             = 0xC612,
+    DNG_BACKWARD_VERSION    = 0xC613,
+    DNG_LINEARIZATION_TABLE = 0xC618,
+    DNG_BLACK_LEVEL         = 0xC61A,
+    DNG_WHITE_LEVEL         = 0xC61D,
+};
+
+/** list of CinemaDNG tags */
+enum CinemaDngTags {
+    CINEMADNG_TIME_CODES    = 0xC763,
+    CINEMADNG_FRAME_RATE    = 0xC764,
+    CINEMADNG_T_STOP        = 0xC772,
+    CINEMADNG_REEL_NAME     = 0xC789,
+    CINEMADNG_CAMERA_LABEL  = 0xC7A1,
+};
+
+/** list of TIFF, TIFF/EP and DNG compression types */
 enum TiffCompr {
     TIFF_RAW = 1,
     TIFF_CCITT_RLE,
@@ -147,6 +179,7 @@
     TIFF_VERTICAL_UNITS_GEOKEY               = 4099
 };
 
+/** list of TIFF, TIFF/AP and DNG PhotometricInterpretation (TIFF_PHOTOMETRIC) values */
 enum TiffPhotometric {
     TIFF_PHOTOMETRIC_NONE       = -1,
     TIFF_PHOTOMETRIC_WHITE_IS_ZERO,      /* mono or grayscale, 0 is white */
@@ -159,7 +192,7 @@
     TIFF_PHOTOMETRIC_CIE_LAB    = 8,     /* 1976 CIE L*a*b* */
     TIFF_PHOTOMETRIC_ICC_LAB,            /* ICC L*a*b* */
     TIFF_PHOTOMETRIC_ITU_LAB,            /* ITU L*a*b* */
-    TIFF_PHOTOMETRIC_CFA        = 32803, /* Color Filter Array (DNG) */
+    TIFF_PHOTOMETRIC_CFA        = 32803, /* Color Filter Array (TIFF/AP and DNG) */
     TIFF_PHOTOMETRIC_LOG_L      = 32844, /* CIE Log2(L) */
     TIFF_PHOTOMETRIC_LOG_LUV,            /* CIE Log L*u*v* */
     TIFF_PHOTOMETRIC_LINEAR_RAW = 34892, /* Linear Raw (DNG) */
diff --git a/libavcodec/trace_headers_bsf.c b/libavcodec/trace_headers_bsf.c
index 94a3ef7..3ec78fe 100644
--- a/libavcodec/trace_headers_bsf.c
+++ b/libavcodec/trace_headers_bsf.c
@@ -28,6 +28,7 @@
 
 typedef struct TraceHeadersContext {
     CodedBitstreamContext *cbc;
+    CodedBitstreamFragment fragment;
 } TraceHeadersContext;
 
 
@@ -44,33 +45,30 @@
     ctx->cbc->trace_level  = AV_LOG_INFO;
 
     if (bsf->par_in->extradata) {
-        CodedBitstreamFragment ps;
+        CodedBitstreamFragment *frag = &ctx->fragment;
 
         av_log(bsf, AV_LOG_INFO, "Extradata\n");
 
-        err = ff_cbs_read_extradata(ctx->cbc, &ps, bsf->par_in);
-        if (err < 0) {
-            av_log(bsf, AV_LOG_ERROR, "Failed to read extradata.\n");
-            return err;
-        }
+        err = ff_cbs_read_extradata(ctx->cbc, frag, bsf->par_in);
 
-        ff_cbs_fragment_uninit(ctx->cbc, &ps);
+        ff_cbs_fragment_reset(ctx->cbc, frag);
     }
 
-    return 0;
+    return err;
 }
 
 static void trace_headers_close(AVBSFContext *bsf)
 {
     TraceHeadersContext *ctx = bsf->priv_data;
 
+    ff_cbs_fragment_free(ctx->cbc, &ctx->fragment);
     ff_cbs_close(&ctx->cbc);
 }
 
 static int trace_headers(AVBSFContext *bsf, AVPacket *pkt)
 {
     TraceHeadersContext *ctx = bsf->priv_data;
-    CodedBitstreamFragment au;
+    CodedBitstreamFragment *frag = &ctx->fragment;
     char tmp[256] = { 0 };
     int err;
 
@@ -96,15 +94,13 @@
 
     av_log(bsf, AV_LOG_INFO, "Packet: %d bytes%s.\n", pkt->size, tmp);
 
-    err = ff_cbs_read_packet(ctx->cbc, &au, pkt);
-    if (err < 0) {
+    err = ff_cbs_read_packet(ctx->cbc, frag, pkt);
+
+    ff_cbs_fragment_reset(ctx->cbc, frag);
+
+    if (err < 0)
         av_packet_unref(pkt);
-        return err;
-    }
-
-    ff_cbs_fragment_uninit(ctx->cbc, &au);
-
-    return 0;
+    return err;
 }
 
 const AVBitStreamFilter ff_trace_headers_bsf = {
diff --git a/libavcodec/truehd_core_bsf.c b/libavcodec/truehd_core_bsf.c
new file mode 100644
index 0000000..dfe291d
--- /dev/null
+++ b/libavcodec/truehd_core_bsf.c
@@ -0,0 +1,182 @@
+/*
+ * Copyright (c) 2018 Paul B Mahol
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "avcodec.h"
+#include "bsf.h"
+#include "get_bits.h"
+#include "mlp_parse.h"
+#include "mlp.h"
+
+typedef struct AccessUnit {
+    uint8_t bits[4];
+    uint16_t offset;
+    uint16_t optional;
+} AccessUnit;
+
+typedef struct TrueHDCoreContext {
+    MLPHeaderInfo hdr;
+} TrueHDCoreContext;
+
+static int truehd_core_filter(AVBSFContext *ctx, AVPacket *pkt)
+{
+    TrueHDCoreContext *s = ctx->priv_data;
+    GetBitContext gbc;
+    AccessUnit units[MAX_SUBSTREAMS];
+    int ret, i, last_offset = 0;
+    int in_size, out_size;
+    int have_header = 0;
+    int substream_bytes = 0;
+    int end;
+
+    ret = ff_bsf_get_packet_ref(ctx, pkt);
+    if (ret < 0)
+        return ret;
+
+    if (pkt->size < 4) {
+        ret = AVERROR_INVALIDDATA;
+        goto fail;
+    }
+
+    in_size = (AV_RB16(pkt->data) & 0xFFF) * 2;
+    if (in_size < 4 || in_size > pkt->size) {
+        ret = AVERROR_INVALIDDATA;
+        goto fail;
+    }
+
+    ret = init_get_bits8(&gbc, pkt->data + 4, pkt->size - 4);
+    if (ret < 0)
+        goto fail;
+
+    if (show_bits_long(&gbc, 32) == 0xf8726fba) {
+        if ((ret = ff_mlp_read_major_sync(ctx, &s->hdr, &gbc)) < 0)
+            goto fail;
+        have_header = 1;
+    }
+
+    if (s->hdr.num_substreams > MAX_SUBSTREAMS) {
+        ret = AVERROR_INVALIDDATA;
+        goto fail;
+    }
+
+    for (i = 0; i < s->hdr.num_substreams; i++) {
+        for (int j = 0; j < 4; j++)
+            units[i].bits[j] = get_bits1(&gbc);
+
+        units[i].offset = get_bits(&gbc, 12);
+        if (i < 3) {
+            last_offset = units[i].offset * 2;
+            substream_bytes += 2;
+        }
+
+        if (units[i].bits[0]) {
+            units[i].optional = get_bits(&gbc, 16);
+            if (i < 3)
+                substream_bytes += 2;
+        }
+    }
+    end = get_bits_count(&gbc) >> 3;
+
+    out_size = end + 4 + last_offset;
+    if (out_size < in_size) {
+        int bpos = 0, reduce = end - have_header * 28 - substream_bytes;
+        uint16_t parity_nibble, dts = AV_RB16(pkt->data + 2);
+        uint16_t auheader;
+        uint8_t header[28];
+
+        av_assert1(reduce >= 0 && reduce % 2 == 0);
+
+        if (have_header) {
+            memcpy(header, pkt->data + 4, 28);
+            header[16]  = (header[16] & 0x0c) | (FFMIN(s->hdr.num_substreams, 3) << 4);
+            header[17] &= 0x7f;
+            header[25] &= 0xfe;
+            AV_WL16(header + 26, ff_mlp_checksum16(header, 26));
+        }
+
+        pkt->data += reduce;
+        out_size  -= reduce;
+        pkt->size  = out_size;
+
+        ret = av_packet_make_writable(pkt);
+        if (ret < 0)
+            goto fail;
+
+        AV_WB16(pkt->data + 2, dts);
+        parity_nibble = dts;
+        parity_nibble ^= out_size / 2;
+
+        for (i = 0; i < FFMIN(s->hdr.num_substreams, 3); i++) {
+            uint16_t substr_hdr = 0;
+
+            substr_hdr |= (units[i].bits[0] << 15);
+            substr_hdr |= (units[i].bits[1] << 14);
+            substr_hdr |= (units[i].bits[2] << 13);
+            substr_hdr |= (units[i].bits[3] << 12);
+            substr_hdr |=  units[i].offset;
+
+            AV_WB16(pkt->data + have_header * 28 + 4 + bpos, substr_hdr);
+
+            parity_nibble ^= substr_hdr;
+            bpos          += 2;
+
+            if (units[i].bits[0]) {
+                AV_WB16(pkt->data + have_header * 28 + 4 + bpos, units[i].optional);
+
+                parity_nibble ^= units[i].optional;
+                bpos          += 2;
+            }
+        }
+
+        parity_nibble ^= parity_nibble >> 8;
+        parity_nibble ^= parity_nibble >> 4;
+        parity_nibble &= 0xF;
+
+        auheader  = (parity_nibble ^ 0xF) << 12;
+        auheader |= (out_size / 2) & 0x0fff;
+        AV_WB16(pkt->data, auheader);
+
+        if (have_header)
+            memcpy(pkt->data + 4, header, 28);
+    }
+
+fail:
+    if (ret < 0)
+        av_packet_unref(pkt);
+
+    return ret;
+}
+
+static void truehd_core_flush(AVBSFContext *ctx)
+{
+    TrueHDCoreContext *s = ctx->priv_data;
+    memset(&s->hdr, 0, sizeof(s->hdr));
+}
+
+static const enum AVCodecID codec_ids[] = {
+    AV_CODEC_ID_TRUEHD, AV_CODEC_ID_NONE,
+};
+
+const AVBitStreamFilter ff_truehd_core_bsf = {
+    .name           = "truehd_core",
+    .priv_data_size = sizeof(TrueHDCoreContext),
+    .filter         = truehd_core_filter,
+    .flush          = truehd_core_flush,
+    .codec_ids      = codec_ids,
+};
diff --git a/libavcodec/truemotion1.c b/libavcodec/truemotion1.c
index e182438..b6481cb 100644
--- a/libavcodec/truemotion1.c
+++ b/libavcodec/truemotion1.c
@@ -444,6 +444,8 @@
     if (s->flags & FLAG_KEYFRAME) {
         /* no change bits specified for a keyframe; only index bytes */
         s->index_stream = s->mb_change_bits;
+        if (s->avctx->width * s->avctx->height / 2048 + header.header_size > s->size)
+            return AVERROR_INVALIDDATA;
     } else {
         /* one change bit per 4x4 block */
         s->index_stream = s->mb_change_bits +
@@ -882,7 +884,7 @@
     if ((ret = truemotion1_decode_header(s)) < 0)
         return ret;
 
-    if ((ret = ff_reget_buffer(avctx, s->frame)) < 0)
+    if ((ret = ff_reget_buffer(avctx, s->frame, 0)) < 0)
         return ret;
 
     if (compression_types[s->compression].algorithm == ALGO_RGB24H) {
diff --git a/libavcodec/truemotion2.c b/libavcodec/truemotion2.c
index 58a577f..d90a8ba 100644
--- a/libavcodec/truemotion2.c
+++ b/libavcodec/truemotion2.c
@@ -112,9 +112,13 @@
     int *lens; ///< codelengths
 } TM2Huff;
 
+/**
+ *
+ * @returns the length of the longest code or an AVERROR code
+ */
 static int tm2_read_tree(TM2Context *ctx, uint32_t prefix, int length, TM2Huff *huff)
 {
-    int ret;
+    int ret, ret2;
     if (length > huff->max_bits) {
         av_log(ctx->avctx, AV_LOG_ERROR, "Tree exceeded its given depth (%i)\n",
                huff->max_bits);
@@ -133,14 +137,14 @@
         huff->bits[huff->num] = prefix;
         huff->lens[huff->num] = length;
         huff->num++;
-        return 0;
+        return length;
     } else { /* non-terminal node */
-        if ((ret = tm2_read_tree(ctx, prefix << 1, length + 1, huff)) < 0)
-            return ret;
+        if ((ret2 = tm2_read_tree(ctx, prefix << 1, length + 1, huff)) < 0)
+            return ret2;
         if ((ret = tm2_read_tree(ctx, (prefix << 1) | 1, length + 1, huff)) < 0)
             return ret;
     }
-    return 0;
+    return FFMAX(ret, ret2);
 }
 
 static int tm2_build_huff_table(TM2Context *ctx, TM2Codes *code)
@@ -151,7 +155,7 @@
     huff.val_bits = get_bits(&ctx->gb, 5);
     huff.max_bits = get_bits(&ctx->gb, 5);
     huff.min_bits = get_bits(&ctx->gb, 5);
-    huff.nodes    = get_bits_long(&ctx->gb, 17);
+    huff.nodes    = get_bits(&ctx->gb, 17);
     huff.num      = 0;
 
     /* check for correct codes parameters */
@@ -183,6 +187,11 @@
 
     res = tm2_read_tree(ctx, 0, 0, &huff);
 
+    if (res >= 0 && res != huff.max_bits) {
+        av_log(ctx->avctx, AV_LOG_ERROR, "Got less bits than expected: %i of %i\n",
+               res, huff.max_bits);
+        res = AVERROR_INVALIDDATA;
+    }
     if (huff.num != huff.max_num) {
         av_log(ctx->avctx, AV_LOG_ERROR, "Got less codes than expected: %i of %i\n",
                huff.num, huff.max_num);
@@ -434,7 +443,7 @@
     clast = ctx->clast + bx * 4;
 
 #define TM2_INIT_POINTERS_2() \
-    int *Yo, *Uo, *Vo;\
+    unsigned *Yo, *Uo, *Vo;\
     int oYstride, oUstride, oVstride;\
 \
     TM2_INIT_POINTERS();\
@@ -484,7 +493,7 @@
     }
 }
 
-static inline void tm2_low_chroma(int *data, int stride, int *clast, int *CD, int *deltas, int bx)
+static inline void tm2_low_chroma(int *data, int stride, int *clast, unsigned *CD, int *deltas, int bx)
 {
     int t;
     int l;
@@ -494,8 +503,8 @@
         prev = clast[-3];
     else
         prev = 0;
-    t        = (CD[0] + CD[1]) >> 1;
-    l        = (prev - CD[0] - CD[1] + clast[1]) >> 1;
+    t        = (int)(CD[0] + CD[1]) >> 1;
+    l        = (int)(prev - CD[0] - CD[1] + clast[1]) >> 1;
     CD[1]    = CD[0] + CD[1] - t;
     CD[0]    = t;
     clast[0] = l;
@@ -572,15 +581,15 @@
     deltas[10] = GET_TOK(ctx, TM2_L_LO);
 
     if (bx > 0)
-        last[0] = (last[-1] - ctx->D[0] - ctx->D[1] - ctx->D[2] - ctx->D[3] + last[1]) >> 1;
+        last[0] = (int)((unsigned)last[-1] - ctx->D[0] - ctx->D[1] - ctx->D[2] - ctx->D[3] + last[1]) >> 1;
     else
-        last[0] = (last[1]  - ctx->D[0] - ctx->D[1] - ctx->D[2] - ctx->D[3])>> 1;
-    last[2] = (last[1] + last[3]) >> 1;
+        last[0] = (int)((unsigned)last[1]  - ctx->D[0] - ctx->D[1] - ctx->D[2] - ctx->D[3])>> 1;
+    last[2] = (int)((unsigned)last[1] + last[3]) >> 1;
 
-    t1 = ctx->D[0] + ctx->D[1];
+    t1 = ctx->D[0] + (unsigned)ctx->D[1];
     ctx->D[0] = t1 >> 1;
     ctx->D[1] = t1 - (t1 >> 1);
-    t2 = ctx->D[2] + ctx->D[3];
+    t2 = ctx->D[2] + (unsigned)ctx->D[3];
     ctx->D[2] = t2 >> 1;
     ctx->D[3] = t2 - (t2 >> 1);
 
@@ -591,7 +600,8 @@
 {
     int i;
     int ct;
-    int left, right, diff;
+    unsigned left, right;
+    int diff;
     int deltas[16];
     TM2_INIT_POINTERS();
 
@@ -606,10 +616,10 @@
     for (i = 0; i < 16; i++)
         deltas[i] = 0;
 
-    ct = ctx->D[0] + ctx->D[1] + ctx->D[2] + ctx->D[3];
+    ct = (unsigned)ctx->D[0] + ctx->D[1] + ctx->D[2] + ctx->D[3];
 
     if (bx > 0)
-        left = last[-1] - ct;
+        left = last[-1] - (unsigned)ct;
     else
         left = 0;
 
@@ -620,7 +630,7 @@
     last[2] = right - (diff >> 2);
     last[3] = right;
     {
-        int tp = left;
+        unsigned tp = left;
 
         ctx->D[0] = (tp + (ct >> 2)) - left;
         left     += ctx->D[0];
@@ -671,7 +681,7 @@
 static inline void tm2_update_block(TM2Context *ctx, AVFrame *pic, int bx, int by)
 {
     int i, j;
-    int d;
+    unsigned d;
     TM2_INIT_POINTERS_2();
 
     /* update chroma */
@@ -699,7 +709,7 @@
     for (j = 0; j < 4; j++) {
         d = last[3];
         for (i = 0; i < 4; i++) {
-            Y[i]    = Yo[i] + GET_TOK(ctx, TM2_UPD);
+            Y[i]    = Yo[i] + (unsigned)GET_TOK(ctx, TM2_UPD);
             last[i] = Y[i];
         }
         ctx->D[j] = last[3] - d;
@@ -754,10 +764,10 @@
     }
     /* calculate deltas */
     Y -= Ystride * 4;
-    ctx->D[0] = Y[3] - last[3];
-    ctx->D[1] = Y[3 + Ystride] - Y[3];
-    ctx->D[2] = Y[3 + Ystride * 2] - Y[3 + Ystride];
-    ctx->D[3] = Y[3 + Ystride * 3] - Y[3 + Ystride * 2];
+    ctx->D[0] = (unsigned)Y[3] - last[3];
+    ctx->D[1] = (unsigned)Y[3 + Ystride] - Y[3];
+    ctx->D[2] = (unsigned)Y[3 + Ystride * 2] - Y[3 + Ystride];
+    ctx->D[3] = (unsigned)Y[3 + Ystride * 3] - Y[3 + Ystride * 2];
     for (i = 0; i < 4; i++)
         last[i] = Y[i + Ystride * 3];
 }
@@ -827,7 +837,7 @@
     dst = p->data[0];
     for (j = 0; j < h; j++) {
         for (i = 0; i < w; i++) {
-            int y = Y[i], u = U[i >> 1], v = V[i >> 1];
+            unsigned y = Y[i], u = U[i >> 1], v = V[i >> 1];
             dst[3*i+0] = av_clip_uint8(y + v);
             dst[3*i+1] = av_clip_uint8(y);
             dst[3*i+2] = av_clip_uint8(y + u);
@@ -905,7 +915,7 @@
         return AVERROR(ENOMEM);
     }
 
-    if ((ret = ff_reget_buffer(avctx, p)) < 0)
+    if ((ret = ff_reget_buffer(avctx, p, 0)) < 0)
         return ret;
 
     l->bdsp.bswap_buf((uint32_t *) l->buffer, (const uint32_t *) buf,
diff --git a/libavcodec/truemotion2rt.c b/libavcodec/truemotion2rt.c
index 9df0b52..e3ab998 100644
--- a/libavcodec/truemotion2rt.c
+++ b/libavcodec/truemotion2rt.c
@@ -116,7 +116,7 @@
     if (ret < 0)
         return ret;
 
-    if (avctx->width / s->hscale * avctx->height * s->delta_size > avpkt->size * 8LL * 4)
+    if ((avctx->width + s->hscale - 1)/ s->hscale * avctx->height * s->delta_size > avpkt->size * 8LL * 4)
         return AVERROR_INVALIDDATA;
 
     ret = init_get_bits8(gb, avpkt->data + ret, avpkt->size - ret);
diff --git a/libavcodec/truespeech.c b/libavcodec/truespeech.c
index d4ddfcb..3cdae8c 100644
--- a/libavcodec/truespeech.c
+++ b/libavcodec/truespeech.c
@@ -132,8 +132,7 @@
         if(i > 0){
             memcpy(tmp, dec->cvector, i * sizeof(*tmp));
             for(j = 0; j < i; j++)
-                dec->cvector[j] = ((tmp[i - j - 1] * dec->vector[i]) +
-                                   (dec->cvector[j] << 15) + 0x4000) >> 15;
+                dec->cvector[j] += (tmp[i - j - 1] * dec->vector[i] + 0x4000) >> 15;
         }
         dec->cvector[i] = (8 - dec->vector[i]) >> 3;
     }
@@ -255,8 +254,8 @@
     for(i = 0; i < 60; i++){
         int sum = 0;
         for(k = 0; k < 8; k++)
-            sum += ptr0[k] * ptr1[k];
-        sum = (sum + (out[i] << 12) + 0x800) >> 12;
+            sum += ptr0[k] * (unsigned)ptr1[k];
+        sum = out[i] + ((int)(sum + 0x800U) >> 12);
         out[i] = av_clip(sum, -0x7FFE, 0x7FFE);
         for(k = 7; k > 0; k--)
             ptr0[k] = ptr0[k - 1];
@@ -274,7 +273,7 @@
         for(k = 7; k > 0; k--)
             ptr0[k] = ptr0[k - 1];
         ptr0[0] = out[i];
-        out[i] = ((out[i] << 12) - sum) >> 12;
+        out[i] += (- sum) >> 12;
     }
 
     for(i = 0; i < 8; i++)
@@ -282,7 +281,7 @@
 
     ptr0 = dec->tmp3;
     for(i = 0; i < 60; i++){
-        int sum = out[i] << 12;
+        int sum = out[i] * (1 << 12);
         for(k = 0; k < 8; k++)
             sum += ptr0[k] * t[k];
         for(k = 7; k > 0; k--)
diff --git a/libavcodec/tscc.c b/libavcodec/tscc.c
index fc1ec4d..6d03081 100644
--- a/libavcodec/tscc.c
+++ b/libavcodec/tscc.c
@@ -103,7 +103,7 @@
         return AVERROR_UNKNOWN;
     }
 
-    if ((ret = ff_reget_buffer(avctx, frame)) < 0)
+    if ((ret = ff_reget_buffer(avctx, frame, 0)) < 0)
         return ret;
 
     if (ret != Z_DATA_ERROR) {
diff --git a/libavcodec/tscc2.c b/libavcodec/tscc2.c
index a8c7ee7..65fbb01 100644
--- a/libavcodec/tscc2.c
+++ b/libavcodec/tscc2.c
@@ -240,7 +240,7 @@
         return buf_size;
     }
 
-    if ((ret = ff_reget_buffer(avctx, c->pic)) < 0) {
+    if ((ret = ff_reget_buffer(avctx, c->pic, 0)) < 0) {
         return ret;
     }
 
diff --git a/libavcodec/tta.c b/libavcodec/tta.c
index 8f097b3..e68e4fb 100644
--- a/libavcodec/tta.c
+++ b/libavcodec/tta.c
@@ -129,7 +129,7 @@
 
     s->avctx = avctx;
 
-    // 30bytes includes TTA1 header
+    // 22 bytes for a TTA1 header
     if (avctx->extradata_size < 22)
         return AVERROR_INVALIDDATA;
 
@@ -163,7 +163,7 @@
         s->data_length = get_bits_long(&gb, 32);
         skip_bits_long(&gb, 32); // CRC32 of header
 
-        if (s->channels == 0) {
+        if (s->channels == 0 || s->channels > 16) {
             av_log(avctx, AV_LOG_ERROR, "Invalid number of channels\n");
             return AVERROR_INVALIDDATA;
         } else if (avctx->sample_rate == 0) {
@@ -227,7 +227,7 @@
     GetBitContext gb;
     int i, ret;
     int cur_chan = 0, framelen = s->frame_length;
-    int32_t *p;
+    uint32_t *p;
 
     if (avctx->err_recognition & AV_EF_CRCCHECK) {
         if (buf_size < 4 ||
@@ -261,7 +261,7 @@
     }
 
     i = 0;
-    for (p = s->decode_buffer; p < s->decode_buffer + (framelen * s->channels); p++) {
+    for (p = s->decode_buffer; (int32_t*)p < s->decode_buffer + (framelen * s->channels); p++) {
         int32_t *predictor = &s->ch_ctx[cur_chan].predictor;
         TTAFilter *filter = &s->ch_ctx[cur_chan].filter;
         TTARice *rice = &s->ch_ctx[cur_chan].rice;
@@ -334,7 +334,7 @@
             // decorrelate in case of multiple channels
             if (s->channels > 1) {
                 int32_t *r = p - 1;
-                for (*p += *r / 2; r > p - s->channels; r--)
+                for (*p += *r / 2; r > (int32_t*)p - s->channels; r--)
                     *r = *(r + 1) - *r;
             }
             cur_chan = 0;
@@ -358,13 +358,13 @@
     switch (s->bps) {
     case 1: {
         uint8_t *samples = (uint8_t *)frame->data[0];
-        for (p = s->decode_buffer; p < s->decode_buffer + (framelen * s->channels); p++)
+        for (p = s->decode_buffer; (int32_t*)p < s->decode_buffer + (framelen * s->channels); p++)
             *samples++ = *p + 0x80;
         break;
         }
     case 2: {
         int16_t *samples = (int16_t *)frame->data[0];
-        for (p = s->decode_buffer; p < s->decode_buffer + (framelen * s->channels); p++)
+        for (p = s->decode_buffer; (int32_t*)p < s->decode_buffer + (framelen * s->channels); p++)
             *samples++ = *p;
         break;
         }
@@ -372,7 +372,7 @@
         // shift samples for 24-bit sample format
         int32_t *samples = (int32_t *)frame->data[0];
         for (i = 0; i < framelen * s->channels; i++)
-            *samples++ <<= 8;
+            *samples++ *= 256;
         // reset decode buffer
         s->decode_buffer = NULL;
         break;
@@ -389,13 +389,6 @@
     return ret;
 }
 
-static int init_thread_copy(AVCodecContext *avctx)
-{
-    TTAContext *s = avctx->priv_data;
-    s->avctx = avctx;
-    return allocate_buffers(avctx);
-}
-
 static av_cold int tta_decode_close(AVCodecContext *avctx) {
     TTAContext *s = avctx->priv_data;
 
@@ -430,7 +423,6 @@
     .init           = tta_decode_init,
     .close          = tta_decode_close,
     .decode         = tta_decode_frame,
-    .init_thread_copy = ONLY_IF_THREADS_ENABLED(init_thread_copy),
     .capabilities   = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_FRAME_THREADS,
     .priv_class     = &tta_decoder_class,
 };
diff --git a/libavcodec/ttaenc.c b/libavcodec/ttaenc.c
index 3cc54d7..08a0d04 100644
--- a/libavcodec/ttaenc.c
+++ b/libavcodec/ttaenc.c
@@ -164,7 +164,7 @@
                     put_bits(&pb, 31, 0x7FFFFFFF);
                     unary -= 31;
                 } else {
-                    put_bits(&pb, unary, (1 << unary) - 1);
+                    put_bits(&pb, unary, (1U << unary) - 1);
                     unary = 0;
                 }
             } while (unary);
diff --git a/libavcodec/twinvq.c b/libavcodec/twinvq.c
index 7b2e19e..34ca184 100644
--- a/libavcodec/twinvq.c
+++ b/libavcodec/twinvq.c
@@ -771,23 +771,26 @@
 {
     int ret;
     TwinVQContext *tctx = avctx->priv_data;
+    int64_t frames_per_packet;
 
     tctx->avctx       = avctx;
     avctx->sample_fmt = AV_SAMPLE_FMT_FLTP;
 
     if (!avctx->block_align) {
         avctx->block_align = tctx->frame_size + 7 >> 3;
-    } else if (avctx->block_align * 8 < tctx->frame_size) {
-        av_log(avctx, AV_LOG_ERROR, "Block align is %d bits, expected %d\n",
-               avctx->block_align * 8, tctx->frame_size);
+    }
+    frames_per_packet = avctx->block_align * 8LL / tctx->frame_size;
+    if (frames_per_packet <= 0) {
+        av_log(avctx, AV_LOG_ERROR, "Block align is %"PRId64" bits, expected %d\n",
+               avctx->block_align * (int64_t)8, tctx->frame_size);
         return AVERROR_INVALIDDATA;
     }
-    tctx->frames_per_packet = avctx->block_align * 8 / tctx->frame_size;
-    if (tctx->frames_per_packet > TWINVQ_MAX_FRAMES_PER_PACKET) {
-        av_log(avctx, AV_LOG_ERROR, "Too many frames per packet (%d)\n",
-               tctx->frames_per_packet);
+    if (frames_per_packet > TWINVQ_MAX_FRAMES_PER_PACKET) {
+        av_log(avctx, AV_LOG_ERROR, "Too many frames per packet (%"PRId64")\n",
+               frames_per_packet);
         return AVERROR_INVALIDDATA;
     }
+    tctx->frames_per_packet = frames_per_packet;
 
     tctx->fdsp = avpriv_float_dsp_alloc(avctx->flags & AV_CODEC_FLAG_BITEXACT);
     if (!tctx->fdsp) {
diff --git a/libavcodec/twinvqdec.c b/libavcodec/twinvqdec.c
index c2353f5..c00ebb2 100644
--- a/libavcodec/twinvqdec.c
+++ b/libavcodec/twinvqdec.c
@@ -404,7 +404,7 @@
     tctx->frame_size     = avctx->bit_rate * tctx->mtab->size
                                            / avctx->sample_rate + 8;
     tctx->is_6kbps       = 0;
-    if (avctx->block_align && avctx->block_align * 8 / tctx->frame_size > 1) {
+    if (avctx->block_align && avctx->block_align * 8LL / tctx->frame_size > 1) {
         av_log(avctx, AV_LOG_ERROR,
                "VQF TwinVQ should have only one frame per packet\n");
         return AVERROR_INVALIDDATA;
diff --git a/libavcodec/ulti.c b/libavcodec/ulti.c
index 9318af0..e6fb661 100644
--- a/libavcodec/ulti.c
+++ b/libavcodec/ulti.c
@@ -230,7 +230,7 @@
     int skip;
     int tmp;
 
-    if ((ret = ff_reget_buffer(avctx, s->frame)) < 0)
+    if ((ret = ff_reget_buffer(avctx, s->frame, 0)) < 0)
         return ret;
 
     bytestream2_init(&s->gb, buf, buf_size);
diff --git a/libavcodec/utils.c b/libavcodec/utils.c
index 285bfdb..26c038d 100644
--- a/libavcodec/utils.c
+++ b/libavcodec/utils.c
@@ -214,6 +214,8 @@
     case AV_PIX_FMT_YUVA422P9BE:
     case AV_PIX_FMT_YUVA422P10LE:
     case AV_PIX_FMT_YUVA422P10BE:
+    case AV_PIX_FMT_YUVA422P12LE:
+    case AV_PIX_FMT_YUVA422P12BE:
     case AV_PIX_FMT_YUVA422P16LE:
     case AV_PIX_FMT_YUVA422P16BE:
     case AV_PIX_FMT_YUV440P10LE:
@@ -234,6 +236,8 @@
     case AV_PIX_FMT_YUVA444P9BE:
     case AV_PIX_FMT_YUVA444P10LE:
     case AV_PIX_FMT_YUVA444P10BE:
+    case AV_PIX_FMT_YUVA444P12LE:
+    case AV_PIX_FMT_YUVA444P12BE:
     case AV_PIX_FMT_YUVA444P16LE:
     case AV_PIX_FMT_YUVA444P16BE:
     case AV_PIX_FMT_GBRP9LE:
@@ -408,7 +412,7 @@
 void ff_color_frame(AVFrame *frame, const int c[4])
 {
     const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(frame->format);
-    int p, y, x;
+    int p, y;
 
     av_assert0(desc->flags & AV_PIX_FMT_FLAG_PLANAR);
 
@@ -417,13 +421,19 @@
         int is_chroma = p == 1 || p == 2;
         int bytes  = is_chroma ? AV_CEIL_RSHIFT(frame->width,  desc->log2_chroma_w) : frame->width;
         int height = is_chroma ? AV_CEIL_RSHIFT(frame->height, desc->log2_chroma_h) : frame->height;
-        for (y = 0; y < height; y++) {
-            if (desc->comp[0].depth >= 9) {
-                for (x = 0; x<bytes; x++)
-                    ((uint16_t*)dst)[x] = c[p];
-            }else
-                memset(dst, c[p], bytes);
+        if (desc->comp[0].depth >= 9) {
+            ((uint16_t*)dst)[0] = c[p];
+            av_memcpy_backptr(dst + 2, 2, bytes - 2);
             dst += frame->linesize[p];
+            for (y = 1; y < height; y++) {
+                memcpy(dst, frame->data[p], 2*bytes);
+                dst += frame->linesize[p];
+            }
+        } else {
+            for (y = 0; y < height; y++) {
+                memset(dst, c[p], bytes);
+                dst += frame->linesize[p];
+            }
         }
     }
 }
@@ -538,17 +548,19 @@
 int attribute_align_arg avcodec_open2(AVCodecContext *avctx, const AVCodec *codec, AVDictionary **options)
 {
     int ret = 0;
+    int codec_init_ok = 0;
     AVDictionary *tmp = NULL;
     const AVPixFmtDescriptor *pixdesc;
+    AVCodecInternal *avci;
 
     if (avcodec_is_open(avctx))
         return 0;
 
-    if ((!codec && !avctx->codec)) {
+    if (!codec && !avctx->codec) {
         av_log(avctx, AV_LOG_ERROR, "No codec provided to avcodec_open2()\n");
         return AVERROR(EINVAL);
     }
-    if ((codec && avctx->codec && codec != avctx->codec)) {
+    if (codec && avctx->codec && codec != avctx->codec) {
         av_log(avctx, AV_LOG_ERROR, "This AVCodecContext was allocated for %s, "
                                     "but %s passed to avcodec_open2()\n", avctx->codec->name, codec->name);
         return AVERROR(EINVAL);
@@ -564,55 +576,50 @@
 
     ff_lock_avcodec(avctx, codec);
 
-    avctx->internal = av_mallocz(sizeof(*avctx->internal));
-    if (!avctx->internal) {
+    avci = av_mallocz(sizeof(*avci));
+    if (!avci) {
         ret = AVERROR(ENOMEM);
         goto end;
     }
+    avctx->internal = avci;
 
-    avctx->internal->pool = av_mallocz(sizeof(*avctx->internal->pool));
-    if (!avctx->internal->pool) {
+    avci->to_free = av_frame_alloc();
+    if (!avci->to_free) {
         ret = AVERROR(ENOMEM);
         goto free_and_end;
     }
 
-    avctx->internal->to_free = av_frame_alloc();
-    if (!avctx->internal->to_free) {
+    avci->compat_decode_frame = av_frame_alloc();
+    if (!avci->compat_decode_frame) {
         ret = AVERROR(ENOMEM);
         goto free_and_end;
     }
 
-    avctx->internal->compat_decode_frame = av_frame_alloc();
-    if (!avctx->internal->compat_decode_frame) {
+    avci->buffer_frame = av_frame_alloc();
+    if (!avci->buffer_frame) {
         ret = AVERROR(ENOMEM);
         goto free_and_end;
     }
 
-    avctx->internal->buffer_frame = av_frame_alloc();
-    if (!avctx->internal->buffer_frame) {
+    avci->buffer_pkt = av_packet_alloc();
+    if (!avci->buffer_pkt) {
         ret = AVERROR(ENOMEM);
         goto free_and_end;
     }
 
-    avctx->internal->buffer_pkt = av_packet_alloc();
-    if (!avctx->internal->buffer_pkt) {
+    avci->ds.in_pkt = av_packet_alloc();
+    if (!avci->ds.in_pkt) {
         ret = AVERROR(ENOMEM);
         goto free_and_end;
     }
 
-    avctx->internal->ds.in_pkt = av_packet_alloc();
-    if (!avctx->internal->ds.in_pkt) {
+    avci->last_pkt_props = av_packet_alloc();
+    if (!avci->last_pkt_props) {
         ret = AVERROR(ENOMEM);
         goto free_and_end;
     }
 
-    avctx->internal->last_pkt_props = av_packet_alloc();
-    if (!avctx->internal->last_pkt_props) {
-        ret = AVERROR(ENOMEM);
-        goto free_and_end;
-    }
-
-    avctx->internal->skip_samples_multiplier = 1;
+    avci->skip_samples_multiplier = 1;
 
     if (codec->priv_data_size > 0) {
         if (!avctx->priv_data) {
@@ -643,12 +650,12 @@
     // only call ff_set_dimensions() for non H.264/VP6F/DXV codecs so as not to overwrite previously setup dimensions
     if (!(avctx->coded_width && avctx->coded_height && avctx->width && avctx->height &&
           (avctx->codec_id == AV_CODEC_ID_H264 || avctx->codec_id == AV_CODEC_ID_VP6F || avctx->codec_id == AV_CODEC_ID_DXV))) {
-    if (avctx->coded_width && avctx->coded_height)
-        ret = ff_set_dimensions(avctx, avctx->coded_width, avctx->coded_height);
-    else if (avctx->width && avctx->height)
-        ret = ff_set_dimensions(avctx, avctx->width, avctx->height);
-    if (ret < 0)
-        goto free_and_end;
+        if (avctx->coded_width && avctx->coded_height)
+            ret = ff_set_dimensions(avctx, avctx->coded_width, avctx->coded_height);
+        else if (avctx->width && avctx->height)
+            ret = ff_set_dimensions(avctx, avctx->width, avctx->height);
+        if (ret < 0)
+            goto free_and_end;
     }
 
     if ((avctx->coded_width || avctx->coded_height || avctx->width || avctx->height)
@@ -673,8 +680,18 @@
     if (av_codec_is_decoder(codec))
         av_freep(&avctx->subtitle_header);
 
-    if (avctx->channels > FF_SANE_NB_CHANNELS) {
-        av_log(avctx, AV_LOG_ERROR, "Too many channels: %d\n", avctx->channels);
+    if (avctx->channels > FF_SANE_NB_CHANNELS || avctx->channels < 0) {
+        av_log(avctx, AV_LOG_ERROR, "Too many or invalid channels: %d\n", avctx->channels);
+        ret = AVERROR(EINVAL);
+        goto free_and_end;
+    }
+    if (avctx->sample_rate < 0) {
+        av_log(avctx, AV_LOG_ERROR, "Invalid sample rate: %d\n", avctx->sample_rate);
+        ret = AVERROR(EINVAL);
+        goto free_and_end;
+    }
+    if (avctx->block_align < 0) {
+        av_log(avctx, AV_LOG_ERROR, "Invalid block align: %d\n", avctx->block_align);
         ret = AVERROR(EINVAL);
         goto free_and_end;
     }
@@ -734,7 +751,7 @@
     }
 
     if (HAVE_THREADS
-        && !(avctx->internal->frame_thread_encoder && (avctx->active_thread_type&FF_THREAD_FRAME))) {
+        && !(avci->frame_thread_encoder && (avctx->active_thread_type&FF_THREAD_FRAME))) {
         ret = ff_thread_init(avctx);
         if (ret < 0) {
             goto free_and_end;
@@ -924,13 +941,17 @@
         && avctx->codec_descriptor->type == AVMEDIA_TYPE_VIDEO)
         av_log(avctx, AV_LOG_WARNING,
                "gray decoding requested but not enabled at configuration time\n");
+    if (avctx->flags2 & AV_CODEC_FLAG2_EXPORT_MVS) {
+        avctx->export_side_data |= AV_CODEC_EXPORT_DATA_MVS;
+    }
 
     if (   avctx->codec->init && (!(avctx->active_thread_type&FF_THREAD_FRAME)
-        || avctx->internal->frame_thread_encoder)) {
+        || avci->frame_thread_encoder)) {
         ret = avctx->codec->init(avctx);
         if (ret < 0) {
             goto free_and_end;
         }
+        codec_init_ok = 1;
     }
 
     ret=0;
@@ -958,6 +979,10 @@
             ret = AVERROR(EINVAL);
             goto free_and_end;
         }
+        if (avctx->bits_per_coded_sample < 0) {
+            ret = AVERROR(EINVAL);
+            goto free_and_end;
+        }
         if (avctx->sub_charenc) {
             if (avctx->codec_type != AVMEDIA_TYPE_SUBTITLE) {
                 av_log(avctx, AV_LOG_ERROR, "Character encoding is only "
@@ -1014,10 +1039,14 @@
 
     return ret;
 free_and_end:
-    if (avctx->codec &&
-        (avctx->codec->caps_internal & FF_CODEC_CAP_INIT_CLEANUP))
+    if (avctx->codec && avctx->codec->close &&
+        (codec_init_ok ||
+         (avctx->codec->caps_internal & FF_CODEC_CAP_INIT_CLEANUP)))
         avctx->codec->close(avctx);
 
+    if (HAVE_THREADS && avci->thread_ctx)
+        ff_thread_free(avctx);
+
     if (codec->priv_class && codec->priv_data_size)
         av_opt_free(avctx->priv_data);
     av_opt_free(avctx);
@@ -1030,19 +1059,21 @@
 
     av_dict_free(&tmp);
     av_freep(&avctx->priv_data);
-    if (avctx->internal) {
-        av_frame_free(&avctx->internal->to_free);
-        av_frame_free(&avctx->internal->compat_decode_frame);
-        av_frame_free(&avctx->internal->buffer_frame);
-        av_packet_free(&avctx->internal->buffer_pkt);
-        av_packet_free(&avctx->internal->last_pkt_props);
+    av_freep(&avctx->subtitle_header);
+    if (avci) {
+        av_frame_free(&avci->to_free);
+        av_frame_free(&avci->compat_decode_frame);
+        av_frame_free(&avci->buffer_frame);
+        av_packet_free(&avci->buffer_pkt);
+        av_packet_free(&avci->last_pkt_props);
 
-        av_packet_free(&avctx->internal->ds.in_pkt);
+        av_packet_free(&avci->ds.in_pkt);
         ff_decode_bsfs_uninit(avctx);
 
-        av_freep(&avctx->internal->pool);
+        av_buffer_unref(&avci->pool);
     }
-    av_freep(&avctx->internal);
+    av_freep(&avci);
+    avctx->internal = NULL;
     avctx->codec = NULL;
     goto end;
 }
@@ -1074,7 +1105,6 @@
         return 0;
 
     if (avcodec_is_open(avctx)) {
-        FramePool *pool = avctx->internal->pool;
         if (CONFIG_FRAME_THREAD_ENCODER &&
             avctx->internal->frame_thread_encoder && avctx->thread_count > 1) {
             ff_frame_thread_encoder_free(avctx);
@@ -1093,9 +1123,7 @@
 
         av_packet_free(&avctx->internal->ds.in_pkt);
 
-        for (i = 0; i < FF_ARRAY_ELEMS(pool->pools); i++)
-            av_buffer_pool_uninit(&pool->pools[i]);
-        av_freep(&avctx->internal->pool);
+        av_buffer_unref(&avctx->internal->pool);
 
         if (avctx->hwaccel && avctx->hwaccel->uninit)
             avctx->hwaccel->uninit(avctx);
@@ -1397,10 +1425,8 @@
 
 unsigned avcodec_version(void)
 {
-//    av_assert0(AV_CODEC_ID_V410==164);
     av_assert0(AV_CODEC_ID_PCM_S8_PLANAR==65563);
     av_assert0(AV_CODEC_ID_ADPCM_G722==69660);
-//     av_assert0(AV_CODEC_ID_BMV_AUDIO==86071);
     av_assert0(AV_CODEC_ID_SRT==94216);
     av_assert0(LIBAVCODEC_VERSION_MICRO >= 100);
 
@@ -1415,7 +1441,7 @@
 const char *avcodec_license(void)
 {
 #define LICENSE_PREFIX "libavcodec license: "
-    return LICENSE_PREFIX FFMPEG_LICENSE + sizeof(LICENSE_PREFIX) - 1;
+    return &LICENSE_PREFIX FFMPEG_LICENSE[sizeof(LICENSE_PREFIX) - 1];
 }
 
 int av_get_exact_bits_per_sample(enum AVCodecID codec_id)
@@ -1438,11 +1464,12 @@
     case AV_CODEC_ID_DSD_MSBF_PLANAR:
     case AV_CODEC_ID_PCM_ALAW:
     case AV_CODEC_ID_PCM_MULAW:
+    case AV_CODEC_ID_PCM_VIDC:
     case AV_CODEC_ID_PCM_S8:
     case AV_CODEC_ID_PCM_S8_PLANAR:
     case AV_CODEC_ID_PCM_U8:
-    case AV_CODEC_ID_PCM_ZORK:
     case AV_CODEC_ID_SDX2_DPCM:
+    case AV_CODEC_ID_DERF_DPCM:
         return 8;
     case AV_CODEC_ID_PCM_S16BE:
     case AV_CODEC_ID_PCM_S16BE_PLANAR:
@@ -1480,7 +1507,7 @@
 
 enum AVCodecID av_get_pcm_codec(enum AVSampleFormat fmt, int be)
 {
-    static const enum AVCodecID map[AV_SAMPLE_FMT_NB][2] = {
+    static const enum AVCodecID map[][2] = {
         [AV_SAMPLE_FMT_U8  ] = { AV_CODEC_ID_PCM_U8,    AV_CODEC_ID_PCM_U8    },
         [AV_SAMPLE_FMT_S16 ] = { AV_CODEC_ID_PCM_S16LE, AV_CODEC_ID_PCM_S16BE },
         [AV_SAMPLE_FMT_S32 ] = { AV_CODEC_ID_PCM_S32LE, AV_CODEC_ID_PCM_S32BE },
@@ -1493,7 +1520,7 @@
         [AV_SAMPLE_FMT_FLTP] = { AV_CODEC_ID_PCM_F32LE, AV_CODEC_ID_PCM_F32BE },
         [AV_SAMPLE_FMT_DBLP] = { AV_CODEC_ID_PCM_F64LE, AV_CODEC_ID_PCM_F64BE },
     };
-    if (fmt < 0 || fmt >= AV_SAMPLE_FMT_NB)
+    if (fmt < 0 || fmt >= FF_ARRAY_ELEMS(map))
         return AV_CODEC_ID_NONE;
     if (be < 0 || be > 1)
         be = AV_NE(1, 0);
@@ -1594,8 +1621,6 @@
             return 256 * (frame_bytes / 64);
         if (id == AV_CODEC_ID_RA_144)
             return 160 * (frame_bytes / 20);
-        if (id == AV_CODEC_ID_G723_1)
-            return 240 * (frame_bytes / 24);
 
         if (bps > 0) {
             /* calc from frame_bytes and bits_per_coded_sample */
@@ -1947,6 +1972,11 @@
     AVPacketSideData *tmp;
     AVCPBProperties  *props;
     size_t size;
+    int i;
+
+    for (i = 0; i < avctx->nb_coded_side_data; i++)
+        if (avctx->coded_side_data[i].type == AV_PKT_DATA_CPB_PROPERTIES)
+            return (AVCPBProperties *)avctx->coded_side_data[i].data;
 
     props = av_cpb_properties_alloc(&size);
     if (!props)
@@ -2204,3 +2234,22 @@
 
     return bitrate;
 }
+
+int ff_int_from_list_or_default(void *ctx, const char * val_name, int val,
+                                const int * array_valid_values, int default_value)
+{
+    int i = 0, ref_val;
+
+    while (1) {
+        ref_val = array_valid_values[i];
+        if (ref_val == INT_MAX)
+            break;
+        if (val == ref_val)
+            return val;
+        i++;
+    }
+    /* val is not a valid value */
+    av_log(ctx, AV_LOG_DEBUG,
+           "%s %d are not supported. Set to default value : %d\n", val_name, val, default_value);
+    return default_value;
+}
diff --git a/libavcodec/utvideodec.c b/libavcodec/utvideodec.c
index 3891df3..4da257f 100644
--- a/libavcodec/utvideodec.c
+++ b/libavcodec/utvideodec.c
@@ -258,11 +258,11 @@
             GetBitContext cbit, pbit;
             uint8_t *dest, *p;
 
-            ret = init_get_bits8(&cbit, c->control_stream[plane_no][slice], c->control_stream_size[plane_no][slice]);
+            ret = init_get_bits8_le(&cbit, c->control_stream[plane_no][slice], c->control_stream_size[plane_no][slice]);
             if (ret < 0)
                 return ret;
 
-            ret = init_get_bits8(&pbit, c->packed_stream[plane_no][slice], c->packed_stream_size[plane_no][slice]);
+            ret = init_get_bits8_le(&pbit, c->packed_stream[plane_no][slice], c->packed_stream_size[plane_no][slice]);
             if (ret < 0)
                 return ret;
 
@@ -890,6 +890,15 @@
             }
         }
         break;
+    case AV_PIX_FMT_YUV420P10:
+        for (i = 0; i < 3; i++) {
+            ret = decode_plane10(c, i, (uint16_t *)frame.f->data[i], frame.f->linesize[i] / 2,
+                                 avctx->width >> !!i, avctx->height >> !!i,
+                                 plane_start[i], plane_start[i + 1] - 1024, c->frame_pred == PRED_LEFT);
+            if (ret)
+                return ret;
+        }
+        break;
     case AV_PIX_FMT_YUV422P10:
         for (i = 0; i < 3; i++) {
             ret = decode_plane10(c, i, (uint16_t *)frame.f->data[i], frame.f->linesize[i] / 2,
@@ -948,6 +957,11 @@
         avctx->pix_fmt = AV_PIX_FMT_YUV444P;
         avctx->colorspace = AVCOL_SPC_BT470BG;
         break;
+    case MKTAG('U', 'Q', 'Y', '0'):
+        c->planes      = 3;
+        c->pro         = 1;
+        avctx->pix_fmt = AV_PIX_FMT_YUV420P10;
+        break;
     case MKTAG('U', 'Q', 'Y', '2'):
         c->planes      = 3;
         c->pro         = 1;
diff --git a/libavcodec/v210_template.c b/libavcodec/v210_template.c
new file mode 100644
index 0000000..9e1d9f9
--- /dev/null
+++ b/libavcodec/v210_template.c
@@ -0,0 +1,90 @@
+/*
+ * Copyright (C) 2009 Michael Niedermayer <michaelni@gmx.at>
+ * Copyright (c) 2009 Baptiste Coudurier <baptiste dot coudurier at gmail dot com>
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "bytestream.h"
+#include "internal.h"
+
+#define CLIP(v, depth) av_clip(v, 1<<(depth-8), ((1<<depth)-(1<<(depth-8))-1))
+#define WRITE_PIXELS(a, b, c, depth)                      \
+    do {                                                  \
+        val  =  CLIP(*a++, depth)  << (10-depth);         \
+        val |=  (CLIP(*b++, depth) << (20-depth)) |       \
+                (CLIP(*c++, depth) << (30-depth));        \
+        AV_WL32(dst, val);                                \
+        dst += 4;                                         \
+    } while (0)
+
+static void RENAME(v210_enc)(AVCodecContext *avctx,
+        uint8_t *dst, const AVFrame *pic)
+{
+    V210EncContext *s = avctx->priv_data;
+    int aligned_width = ((avctx->width + 47) / 48) * 48;
+    int stride = aligned_width * 8 / 3;
+    int line_padding = stride - ((avctx->width * 8 + 11) / 12) * 4;
+    int h, w;
+    const TYPE *y = (const TYPE *)pic->data[0];
+    const TYPE *u = (const TYPE *)pic->data[1];
+    const TYPE *v = (const TYPE *)pic->data[2];
+    const int sample_size = 6 * s->RENAME(sample_factor);
+    const int sample_w    = avctx->width / sample_size;
+
+    for (h = 0; h < avctx->height; h++) {
+        uint32_t val;
+        w = sample_w * sample_size;
+        s->RENAME(pack_line)(y, u, v, dst, w);
+
+        y += w;
+        u += w >> 1;
+        v += w >> 1;
+        dst += sample_w * 16 * s->RENAME(sample_factor);
+
+        for (; w < avctx->width - 5; w += 6) {
+            WRITE_PIXELS(u, y, v, DEPTH);
+            WRITE_PIXELS(y, u, y, DEPTH);
+            WRITE_PIXELS(v, y, u, DEPTH);
+            WRITE_PIXELS(y, v, y, DEPTH);
+        }
+        if (w < avctx->width - 1) {
+            WRITE_PIXELS(u, y, v, DEPTH);
+
+            val = CLIP(*y++, DEPTH) << (10-DEPTH);
+            if (w == avctx->width - 2) {
+                AV_WL32(dst, val);
+                dst += 4;
+            }
+        }
+        if (w < avctx->width - 3) {
+            val |= (CLIP(*u++, DEPTH) << (20-DEPTH)) | (CLIP(*y++, DEPTH) << (30-DEPTH));
+            AV_WL32(dst, val);
+            dst += 4;
+
+            val = CLIP(*v++, DEPTH) << (10-DEPTH) | (CLIP(*y++, DEPTH) << (20-DEPTH));
+            AV_WL32(dst, val);
+            dst += 4;
+        }
+
+        memset(dst, 0, line_padding);
+        dst += line_padding;
+        y += pic->linesize[0] / BYTES_PER_PIXEL - avctx->width;
+        u += pic->linesize[1] / BYTES_PER_PIXEL - avctx->width / 2;
+        v += pic->linesize[2] / BYTES_PER_PIXEL - avctx->width / 2;
+    }
+}
diff --git a/libavcodec/v210dec.c b/libavcodec/v210dec.c
index ddc5dbe..044d353 100644
--- a/libavcodec/v210dec.c
+++ b/libavcodec/v210dec.c
@@ -28,6 +28,7 @@
 #include "libavutil/internal.h"
 #include "libavutil/mem.h"
 #include "libavutil/intreadwrite.h"
+#include "thread.h"
 
 #define READ_PIXELS(a, b, c)         \
     do {                             \
@@ -37,6 +38,12 @@
         *c++ = (val >> 20) & 0x3FF;  \
     } while (0)
 
+typedef struct ThreadData {
+    AVFrame *frame;
+    uint8_t *buf;
+    int stride;
+} ThreadData;
+
 static void v210_planar_unpack_c(const uint32_t *src, uint16_t *y, uint16_t *u, uint16_t *v, int width)
 {
     uint32_t val;
@@ -50,6 +57,13 @@
     }
 }
 
+av_cold void ff_v210dec_init(V210DecContext *s)
+{
+    s->unpack_frame = v210_planar_unpack_c;
+    if (ARCH_X86)
+        ff_v210_x86_init(s);
+}
+
 static av_cold int decode_init(AVCodecContext *avctx)
 {
     V210DecContext *s = avctx->priv_data;
@@ -57,10 +71,68 @@
     avctx->pix_fmt             = AV_PIX_FMT_YUV422P10;
     avctx->bits_per_raw_sample = 10;
 
-    s->unpack_frame            = v210_planar_unpack_c;
+    s->thread_count  = av_clip(avctx->thread_count, 1, avctx->height/4);
+    s->aligned_input = 0;
+    ff_v210dec_init(s);
 
-    if (HAVE_MMX)
-        ff_v210_x86_init(s);
+    return 0;
+}
+
+static int v210_decode_slice(AVCodecContext *avctx, void *arg, int jobnr, int threadnr)
+{
+    V210DecContext *s = avctx->priv_data;
+    int h, w;
+    ThreadData *td = arg;
+    AVFrame *frame = td->frame;
+    int stride = td->stride;
+    int slice_start = (avctx->height *  jobnr) / s->thread_count;
+    int slice_end = (avctx->height * (jobnr+1)) / s->thread_count;
+    uint8_t *psrc = td->buf + stride * slice_start;
+    uint16_t *y, *u, *v;
+
+    y = (uint16_t*)frame->data[0] + slice_start * frame->linesize[0] / 2;
+    u = (uint16_t*)frame->data[1] + slice_start * frame->linesize[1] / 2;
+    v = (uint16_t*)frame->data[2] + slice_start * frame->linesize[2] / 2;
+    for (h = slice_start; h < slice_end; h++) {
+        const uint32_t *src = (const uint32_t*)psrc;
+        uint32_t val;
+
+        w = (avctx->width / 12) * 12;
+        s->unpack_frame(src, y, u, v, w);
+
+        y += w;
+        u += w >> 1;
+        v += w >> 1;
+        src += (w << 1) / 3;
+
+        if (w < avctx->width - 5) {
+            READ_PIXELS(u, y, v);
+            READ_PIXELS(y, u, y);
+            READ_PIXELS(v, y, u);
+            READ_PIXELS(y, v, y);
+            w += 6;
+        }
+
+        if (w < avctx->width - 1) {
+            READ_PIXELS(u, y, v);
+
+            val  = av_le2ne32(*src++);
+            *y++ =  val & 0x3FF;
+            if (w < avctx->width - 3) {
+                *u++ = (val >> 10) & 0x3FF;
+                *y++ = (val >> 20) & 0x3FF;
+
+                val  = av_le2ne32(*src++);
+                *v++ =  val & 0x3FF;
+                *y++ = (val >> 10) & 0x3FF;
+            }
+        }
+
+        psrc += stride;
+        y += frame->linesize[0] / 2 - avctx->width + (avctx->width & 1);
+        u += frame->linesize[1] / 2 - avctx->width / 2;
+        v += frame->linesize[2] / 2 - avctx->width / 2;
+    }
 
     return 0;
 }
@@ -69,11 +141,11 @@
                         AVPacket *avpkt)
 {
     V210DecContext *s = avctx->priv_data;
-
-    int h, w, ret, stride, aligned_input;
+    ThreadData td;
+    int ret, stride, aligned_input;
+    ThreadFrame frame = { .f = data };
     AVFrame *pic = data;
     const uint8_t *psrc = avpkt->data;
-    uint16_t *y, *u, *v;
 
     if (s->custom_stride )
         stride = s->custom_stride;
@@ -93,60 +165,28 @@
             return AVERROR_INVALIDDATA;
         }
     }
+    td.stride = stride;
     if (   avctx->codec_tag == MKTAG('C', '2', '1', '0')
         && avpkt->size > 64
         && AV_RN32(psrc) == AV_RN32("INFO")
         && avpkt->size - 64 >= stride * avctx->height)
         psrc += 64;
 
-    aligned_input = !((uintptr_t)psrc & 0xf) && !(stride & 0xf);
+    aligned_input = !((uintptr_t)psrc & 0x1f) && !(stride & 0x1f);
     if (aligned_input != s->aligned_input) {
         s->aligned_input = aligned_input;
-        if (HAVE_MMX)
-            ff_v210_x86_init(s);
+        ff_v210dec_init(s);
     }
 
-    if ((ret = ff_get_buffer(avctx, pic, 0)) < 0)
+    if ((ret = ff_thread_get_buffer(avctx, &frame, 0)) < 0)
         return ret;
 
-    y = (uint16_t*)pic->data[0];
-    u = (uint16_t*)pic->data[1];
-    v = (uint16_t*)pic->data[2];
     pic->pict_type = AV_PICTURE_TYPE_I;
     pic->key_frame = 1;
 
-    for (h = 0; h < avctx->height; h++) {
-        const uint32_t *src = (const uint32_t*)psrc;
-        uint32_t val;
-
-        w = (avctx->width / 6) * 6;
-        s->unpack_frame(src, y, u, v, w);
-
-        y += w;
-        u += w >> 1;
-        v += w >> 1;
-        src += (w << 1) / 3;
-
-        if (w < avctx->width - 1) {
-            READ_PIXELS(u, y, v);
-
-            val  = av_le2ne32(*src++);
-            *y++ =  val & 0x3FF;
-            if (w < avctx->width - 3) {
-                *u++ = (val >> 10) & 0x3FF;
-                *y++ = (val >> 20) & 0x3FF;
-
-                val  = av_le2ne32(*src++);
-                *v++ =  val & 0x3FF;
-                *y++ = (val >> 10) & 0x3FF;
-            }
-        }
-
-        psrc += stride;
-        y += pic->linesize[0] / 2 - avctx->width + (avctx->width & 1);
-        u += pic->linesize[1] / 2 - avctx->width / 2;
-        v += pic->linesize[2] / 2 - avctx->width / 2;
-    }
+    td.buf = (uint8_t*)psrc;
+    td.frame = pic;
+    avctx->execute2(avctx, v210_decode_slice, &td, NULL, s->thread_count);
 
     if (avctx->field_order > AV_FIELD_PROGRESSIVE) {
         /* we have interlaced material flagged in container */
@@ -182,6 +222,8 @@
     .priv_data_size = sizeof(V210DecContext),
     .init           = decode_init,
     .decode         = decode_frame,
-    .capabilities   = AV_CODEC_CAP_DR1,
+    .capabilities   = AV_CODEC_CAP_DR1 |
+                      AV_CODEC_CAP_SLICE_THREADS |
+                      AV_CODEC_CAP_FRAME_THREADS,
     .priv_class     = &v210dec_class,
 };
diff --git a/libavcodec/v210dec.h b/libavcodec/v210dec.h
index 533afc4..662e266 100644
--- a/libavcodec/v210dec.h
+++ b/libavcodec/v210dec.h
@@ -27,10 +27,12 @@
     AVClass *av_class;
     int custom_stride;
     int aligned_input;
+    int thread_count;
     int stride_warning_shown;
     void (*unpack_frame)(const uint32_t *src, uint16_t *y, uint16_t *u, uint16_t *v, int width);
 } V210DecContext;
 
+void ff_v210dec_init(V210DecContext *s);
 void ff_v210_x86_init(V210DecContext *s);
 
 #endif /* AVCODEC_V210DEC_H */
diff --git a/libavcodec/v210enc.c b/libavcodec/v210enc.c
index b024806..16e8810 100644
--- a/libavcodec/v210enc.c
+++ b/libavcodec/v210enc.c
@@ -26,26 +26,25 @@
 #include "internal.h"
 #include "v210enc.h"
 
-#define CLIP(v) av_clip(v, 4, 1019)
-#define CLIP8(v) av_clip(v, 1, 254)
+#define TYPE uint8_t
+#define DEPTH 8
+#define BYTES_PER_PIXEL 1
+#define RENAME(a) a ## _ ## 8
+#include "v210_template.c"
+#undef RENAME
+#undef DEPTH
+#undef BYTES_PER_PIXEL
+#undef TYPE
 
-#define WRITE_PIXELS(a, b, c)           \
-    do {                                \
-        val  =  CLIP(*a++);             \
-        val |= (CLIP(*b++) << 10) |     \
-               (CLIP(*c++) << 20);      \
-        AV_WL32(dst, val);              \
-        dst += 4;                       \
-    } while (0)
-
-#define WRITE_PIXELS8(a, b, c)          \
-    do {                                \
-        val  = (CLIP8(*a++) << 2);      \
-        val |= (CLIP8(*b++) << 12) |    \
-               (CLIP8(*c++) << 22);     \
-        AV_WL32(dst, val);              \
-        dst += 4;                       \
-    } while (0)
+#define TYPE uint16_t
+#define DEPTH 10
+#define BYTES_PER_PIXEL 2
+#define RENAME(a) a ## _ ## 10
+#include "v210_template.c"
+#undef RENAME
+#undef DEPTH
+#undef BYTES_PER_PIXEL
+#undef TYPE
 
 static void v210_planar_pack_8_c(const uint8_t *y, const uint8_t *u,
                                  const uint8_t *v, uint8_t *dst,
@@ -56,14 +55,14 @@
 
     /* unroll this to match the assembly */
     for (i = 0; i < width - 11; i += 12) {
-        WRITE_PIXELS8(u, y, v);
-        WRITE_PIXELS8(y, u, y);
-        WRITE_PIXELS8(v, y, u);
-        WRITE_PIXELS8(y, v, y);
-        WRITE_PIXELS8(u, y, v);
-        WRITE_PIXELS8(y, u, y);
-        WRITE_PIXELS8(v, y, u);
-        WRITE_PIXELS8(y, v, y);
+        WRITE_PIXELS(u, y, v, 8);
+        WRITE_PIXELS(y, u, y, 8);
+        WRITE_PIXELS(v, y, u, 8);
+        WRITE_PIXELS(y, v, y, 8);
+        WRITE_PIXELS(u, y, v, 8);
+        WRITE_PIXELS(y, u, y, 8);
+        WRITE_PIXELS(v, y, u, 8);
+        WRITE_PIXELS(y, v, y, 8);
     }
 }
 
@@ -75,10 +74,10 @@
     int i;
 
     for (i = 0; i < width - 5; i += 6) {
-        WRITE_PIXELS(u, y, v);
-        WRITE_PIXELS(y, u, y);
-        WRITE_PIXELS(v, y, u);
-        WRITE_PIXELS(y, v, y);
+        WRITE_PIXELS(u, y, v, 10);
+        WRITE_PIXELS(y, u, y, 10);
+        WRITE_PIXELS(v, y, u, 10);
+        WRITE_PIXELS(y, v, y, 10);
     }
 }
 
@@ -86,7 +85,7 @@
 {
     s->pack_line_8  = v210_planar_pack_8_c;
     s->pack_line_10 = v210_planar_pack_10_c;
-    s->sample_factor_8  = 1;
+    s->sample_factor_8  = 2;
     s->sample_factor_10 = 1;
 
     if (ARCH_X86)
@@ -119,12 +118,10 @@
 static int encode_frame(AVCodecContext *avctx, AVPacket *pkt,
                         const AVFrame *pic, int *got_packet)
 {
-    V210EncContext *s = avctx->priv_data;
     int aligned_width = ((avctx->width + 47) / 48) * 48;
     int stride = aligned_width * 8 / 3;
-    int line_padding = stride - ((avctx->width * 8 + 11) / 12) * 4;
     AVFrameSideData *side_data;
-    int h, w, ret;
+    int ret;
     uint8_t *dst;
 
     ret = ff_alloc_packet2(avctx, pkt, avctx->height * stride, avctx->height * stride);
@@ -134,105 +131,10 @@
     }
     dst = pkt->data;
 
-    if (pic->format == AV_PIX_FMT_YUV422P10) {
-        const uint16_t *y = (const uint16_t *)pic->data[0];
-        const uint16_t *u = (const uint16_t *)pic->data[1];
-        const uint16_t *v = (const uint16_t *)pic->data[2];
-
-        const int sample_size = 6 * s->sample_factor_10;
-        const int sample_w    = avctx->width / sample_size;
-
-        for (h = 0; h < avctx->height; h++) {
-            uint32_t val;
-            w = sample_w * sample_size;
-            s->pack_line_10(y, u, v, dst, w);
-
-            y += w;
-            u += w >> 1;
-            v += w >> 1;
-            dst += sample_w * 16 * s->sample_factor_10;
-
-            for (; w < avctx->width - 5; w += 6) {
-                WRITE_PIXELS(u, y, v);
-                WRITE_PIXELS(y, u, y);
-                WRITE_PIXELS(v, y, u);
-                WRITE_PIXELS(y, v, y);
-            }
-            if (w < avctx->width - 1) {
-                WRITE_PIXELS(u, y, v);
-
-                val = CLIP(*y++);
-                if (w == avctx->width - 2) {
-                    AV_WL32(dst, val);
-                    dst += 4;
-                }
-            }
-            if (w < avctx->width - 3) {
-                val |= (CLIP(*u++) << 10) | (CLIP(*y++) << 20);
-                AV_WL32(dst, val);
-                dst += 4;
-
-                val = CLIP(*v++) | (CLIP(*y++) << 10);
-                AV_WL32(dst, val);
-                dst += 4;
-            }
-
-            memset(dst, 0, line_padding);
-            dst += line_padding;
-            y += pic->linesize[0] / 2 - avctx->width;
-            u += pic->linesize[1] / 2 - avctx->width / 2;
-            v += pic->linesize[2] / 2 - avctx->width / 2;
-        }
-    } else if(pic->format == AV_PIX_FMT_YUV422P) {
-        const uint8_t *y = pic->data[0];
-        const uint8_t *u = pic->data[1];
-        const uint8_t *v = pic->data[2];
-
-        const int sample_size = 12 * s->sample_factor_8;
-        const int sample_w    = avctx->width / sample_size;
-
-        for (h = 0; h < avctx->height; h++) {
-            uint32_t val;
-            w = sample_w * sample_size;
-            s->pack_line_8(y, u, v, dst, w);
-
-            y += w;
-            u += w >> 1;
-            v += w >> 1;
-            dst += sample_w * 32 * s->sample_factor_8;
-
-            for (; w < avctx->width - 5; w += 6) {
-                WRITE_PIXELS8(u, y, v);
-                WRITE_PIXELS8(y, u, y);
-                WRITE_PIXELS8(v, y, u);
-                WRITE_PIXELS8(y, v, y);
-            }
-            if (w < avctx->width - 1) {
-                WRITE_PIXELS8(u, y, v);
-
-                val = CLIP8(*y++) << 2;
-                if (w == avctx->width - 2) {
-                    AV_WL32(dst, val);
-                    dst += 4;
-                }
-            }
-            if (w < avctx->width - 3) {
-                val |= (CLIP8(*u++) << 12) | (CLIP8(*y++) << 22);
-                AV_WL32(dst, val);
-                dst += 4;
-
-                val = (CLIP8(*v++) << 2) | (CLIP8(*y++) << 12);
-                AV_WL32(dst, val);
-                dst += 4;
-            }
-            memset(dst, 0, line_padding);
-            dst += line_padding;
-
-            y += pic->linesize[0] - avctx->width;
-            u += pic->linesize[1] - avctx->width / 2;
-            v += pic->linesize[2] - avctx->width / 2;
-        }
-    }
+    if (pic->format == AV_PIX_FMT_YUV422P10)
+        v210_enc_10(avctx, dst, pic);
+    else if(pic->format == AV_PIX_FMT_YUV422P)
+        v210_enc_8(avctx, dst, pic);
 
     side_data = av_frame_get_side_data(pic, AV_FRAME_DATA_A53_CC);
     if (side_data && side_data->size) {
diff --git a/libavcodec/v410dec.c b/libavcodec/v410dec.c
index 48fab68..7ad5eb8 100644
--- a/libavcodec/v410dec.c
+++ b/libavcodec/v410dec.c
@@ -24,6 +24,13 @@
 #include "libavutil/intreadwrite.h"
 #include "avcodec.h"
 #include "internal.h"
+#include "thread.h"
+
+typedef struct ThreadData {
+    AVFrame *frame;
+    uint8_t *buf;
+    int stride;
+} ThreadData;
 
 static av_cold int v410_decode_init(AVCodecContext *avctx)
 {
@@ -42,31 +49,24 @@
     return 0;
 }
 
-static int v410_decode_frame(AVCodecContext *avctx, void *data,
-                             int *got_frame, AVPacket *avpkt)
+static int v410_decode_slice(AVCodecContext *avctx, void *arg, int jobnr, int threadnr)
 {
-    AVFrame *pic = data;
-    uint8_t *src = avpkt->data;
+    ThreadData *td = arg;
+    AVFrame *pic = td->frame;
+    int stride = td->stride;
+    int thread_count = av_clip(avctx->thread_count, 1, avctx->height/4);
+    int slice_start = (avctx->height *  jobnr) / thread_count;
+    int slice_end = (avctx->height * (jobnr+1)) / thread_count;
+    const uint8_t *src = td->buf + stride * slice_start;
     uint16_t *y, *u, *v;
     uint32_t val;
-    int i, j, ret;
+    int i, j;
 
-    if (avpkt->size < 4 * avctx->height * avctx->width) {
-        av_log(avctx, AV_LOG_ERROR, "Insufficient input data.\n");
-        return AVERROR(EINVAL);
-    }
+    y = (uint16_t*)pic->data[0] + slice_start * (pic->linesize[0] >> 1);
+    u = (uint16_t*)pic->data[1] + slice_start * (pic->linesize[1] >> 1);
+    v = (uint16_t*)pic->data[2] + slice_start * (pic->linesize[2] >> 1);
 
-    if ((ret = ff_get_buffer(avctx, pic, 0)) < 0)
-        return ret;
-
-    pic->key_frame = 1;
-    pic->pict_type = AV_PICTURE_TYPE_I;
-
-    y = (uint16_t *)pic->data[0];
-    u = (uint16_t *)pic->data[1];
-    v = (uint16_t *)pic->data[2];
-
-    for (i = 0; i < avctx->height; i++) {
+    for (i = slice_start; i < slice_end; i++) {
         for (j = 0; j < avctx->width; j++) {
             val = AV_RL32(src);
 
@@ -82,6 +82,35 @@
         v += pic->linesize[2] >> 1;
     }
 
+    return 0;
+}
+
+static int v410_decode_frame(AVCodecContext *avctx, void *data,
+                             int *got_frame, AVPacket *avpkt)
+{
+    ThreadData td;
+    ThreadFrame frame = { .f = data };
+    AVFrame *pic = data;
+    uint8_t *src = avpkt->data;
+    int ret;
+    int thread_count = av_clip(avctx->thread_count, 1, avctx->height/4);
+
+    td.stride = avctx->width * 4;
+    if (avpkt->size < 4 * avctx->height * avctx->width) {
+        av_log(avctx, AV_LOG_ERROR, "Insufficient input data.\n");
+        return AVERROR(EINVAL);
+    }
+
+    if ((ret = ff_thread_get_buffer(avctx, &frame, 0)) < 0)
+        return ret;
+
+    pic->key_frame = 1;
+    pic->pict_type = AV_PICTURE_TYPE_I;
+
+    td.buf = src;
+    td.frame = pic;
+    avctx->execute2(avctx, v410_decode_slice, &td, NULL, thread_count);
+
     *got_frame = 1;
 
     return avpkt->size;
@@ -94,5 +123,6 @@
     .id           = AV_CODEC_ID_V410,
     .init         = v410_decode_init,
     .decode       = v410_decode_frame,
-    .capabilities = AV_CODEC_CAP_DR1,
+    .capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_SLICE_THREADS |
+                    AV_CODEC_CAP_FRAME_THREADS
 };
diff --git a/libavcodec/v4l2_buffers.c b/libavcodec/v4l2_buffers.c
index aef911f..dc1b9ea 100644
--- a/libavcodec/v4l2_buffers.c
+++ b/libavcodec/v4l2_buffers.c
@@ -29,11 +29,13 @@
 #include <poll.h>
 #include "libavcodec/avcodec.h"
 #include "libavcodec/internal.h"
+#include "libavutil/pixdesc.h"
 #include "v4l2_context.h"
 #include "v4l2_buffers.h"
 #include "v4l2_m2m.h"
 
 #define USEC_PER_SEC 1000000
+static AVRational v4l2_timebase = { 1, USEC_PER_SEC };
 
 static inline V4L2m2mContext *buf_to_m2mctx(V4L2Buffer *buf)
 {
@@ -47,32 +49,37 @@
     return buf_to_m2mctx(buf)->avctx;
 }
 
+static inline AVRational v4l2_get_timebase(V4L2Buffer *avbuf)
+{
+    V4L2m2mContext *s = buf_to_m2mctx(avbuf);
+
+    if (s->avctx->pkt_timebase.num)
+        return s->avctx->pkt_timebase;
+    return s->avctx->time_base;
+}
+
 static inline void v4l2_set_pts(V4L2Buffer *out, int64_t pts)
 {
-    V4L2m2mContext *s = buf_to_m2mctx(out);
-    AVRational v4l2_timebase = { 1, USEC_PER_SEC };
     int64_t v4l2_pts;
 
     if (pts == AV_NOPTS_VALUE)
         pts = 0;
 
     /* convert pts to v4l2 timebase */
-    v4l2_pts = av_rescale_q(pts, s->avctx->time_base, v4l2_timebase);
+    v4l2_pts = av_rescale_q(pts, v4l2_get_timebase(out), v4l2_timebase);
     out->buf.timestamp.tv_usec = v4l2_pts % USEC_PER_SEC;
     out->buf.timestamp.tv_sec = v4l2_pts / USEC_PER_SEC;
 }
 
-static inline uint64_t v4l2_get_pts(V4L2Buffer *avbuf)
+static inline int64_t v4l2_get_pts(V4L2Buffer *avbuf)
 {
-    V4L2m2mContext *s = buf_to_m2mctx(avbuf);
-    AVRational v4l2_timebase = { 1, USEC_PER_SEC };
     int64_t v4l2_pts;
 
     /* convert pts back to encoder timebase */
     v4l2_pts = (int64_t)avbuf->buf.timestamp.tv_sec * USEC_PER_SEC +
                         avbuf->buf.timestamp.tv_usec;
 
-    return av_rescale_q(v4l2_pts, v4l2_timebase, s->avctx->time_base);
+    return av_rescale_q(v4l2_pts, v4l2_timebase, v4l2_get_timebase(avbuf));
 }
 
 static enum AVColorPrimaries v4l2_get_color_primaries(V4L2Buffer *buf)
@@ -227,10 +234,30 @@
     }
 }
 
-static int v4l2_buf_to_bufref(V4L2Buffer *in, int plane, AVBufferRef **buf)
+static int v4l2_buf_increase_ref(V4L2Buffer *in)
 {
     V4L2m2mContext *s = buf_to_m2mctx(in);
 
+    if (in->context_ref)
+        atomic_fetch_add(&in->context_refcount, 1);
+    else {
+        in->context_ref = av_buffer_ref(s->self_ref);
+        if (!in->context_ref)
+            return AVERROR(ENOMEM);
+
+        in->context_refcount = 1;
+    }
+
+    in->status = V4L2BUF_RET_USER;
+    atomic_fetch_add_explicit(&s->refcount, 1, memory_order_relaxed);
+
+    return 0;
+}
+
+static int v4l2_buf_to_bufref(V4L2Buffer *in, int plane, AVBufferRef **buf)
+{
+    int ret;
+
     if (plane >= in->num_planes)
         return AVERROR(EINVAL);
 
@@ -240,34 +267,24 @@
     if (!*buf)
         return AVERROR(ENOMEM);
 
-    if (in->context_ref)
-        atomic_fetch_add(&in->context_refcount, 1);
-    else {
-        in->context_ref = av_buffer_ref(s->self_ref);
-        if (!in->context_ref) {
-            av_buffer_unref(buf);
-            return AVERROR(ENOMEM);
-        }
-        in->context_refcount = 1;
-    }
+    ret = v4l2_buf_increase_ref(in);
+    if (ret)
+        av_buffer_unref(buf);
 
-    in->status = V4L2BUF_RET_USER;
-    atomic_fetch_add_explicit(&s->refcount, 1, memory_order_relaxed);
-
-    return 0;
+    return ret;
 }
 
-static int v4l2_bufref_to_buf(V4L2Buffer *out, int plane, const uint8_t* data, int size, AVBufferRef* bref)
+static int v4l2_bufref_to_buf(V4L2Buffer *out, int plane, const uint8_t* data, int size, int offset, AVBufferRef* bref)
 {
     unsigned int bytesused, length;
 
     if (plane >= out->num_planes)
         return AVERROR(EINVAL);
 
-    bytesused = FFMIN(size, out->plane_info[plane].length);
     length = out->plane_info[plane].length;
+    bytesused = FFMIN(size+offset, length);
 
-    memcpy(out->plane_info[plane].mm_addr, data, FFMIN(size, out->plane_info[plane].length));
+    memcpy((uint8_t*)out->plane_info[plane].mm_addr+offset, data, FFMIN(size, length-offset));
 
     if (V4L2_TYPE_IS_MULTIPLANAR(out->buf.type)) {
         out->planes[plane].bytesused = bytesused;
@@ -280,35 +297,12 @@
     return 0;
 }
 
-/******************************************************************************
- *
- *              V4L2uffer interface
- *
- ******************************************************************************/
-
-int ff_v4l2_buffer_avframe_to_buf(const AVFrame *frame, V4L2Buffer* out)
+static int v4l2_buffer_buf_to_swframe(AVFrame *frame, V4L2Buffer *avbuf)
 {
     int i, ret;
 
-    for(i = 0; i < out->num_planes; i++) {
-        ret = v4l2_bufref_to_buf(out, i, frame->buf[i]->data, frame->buf[i]->size, frame->buf[i]);
-        if (ret)
-            return ret;
-    }
+    frame->format = avbuf->context->av_pix_fmt;
 
-    v4l2_set_pts(out, frame->pts);
-
-    return 0;
-}
-
-int ff_v4l2_buffer_buf_to_avframe(AVFrame *frame, V4L2Buffer *avbuf)
-{
-    V4L2m2mContext *s = buf_to_m2mctx(avbuf);
-    int i, ret;
-
-    av_frame_unref(frame);
-
-    /* 1. get references to the actual data */
     for (i = 0; i < avbuf->num_planes; i++) {
         ret = v4l2_buf_to_bufref(avbuf, i, &frame->buf[i]);
         if (ret)
@@ -318,30 +312,134 @@
         frame->data[i] = frame->buf[i]->data;
     }
 
-    /* 1.1 fixup special cases */
+    /* fixup special cases */
     switch (avbuf->context->av_pix_fmt) {
     case AV_PIX_FMT_NV12:
+    case AV_PIX_FMT_NV21:
         if (avbuf->num_planes > 1)
             break;
         frame->linesize[1] = avbuf->plane_info[0].bytesperline;
         frame->data[1] = frame->buf[0]->data + avbuf->plane_info[0].bytesperline * avbuf->context->format.fmt.pix_mp.height;
         break;
+
+    case AV_PIX_FMT_YUV420P:
+        if (avbuf->num_planes > 1)
+            break;
+        frame->linesize[1] = avbuf->plane_info[0].bytesperline >> 1;
+        frame->linesize[2] = avbuf->plane_info[0].bytesperline >> 1;
+        frame->data[1] = frame->buf[0]->data + avbuf->plane_info[0].bytesperline * avbuf->context->format.fmt.pix_mp.height;
+        frame->data[2] = frame->data[1] + ((avbuf->plane_info[0].bytesperline * avbuf->context->format.fmt.pix_mp.height) >> 2);
+        break;
+
     default:
         break;
     }
 
+    return 0;
+}
+
+static int v4l2_buffer_swframe_to_buf(const AVFrame *frame, V4L2Buffer *out)
+{
+    int i, ret;
+    struct v4l2_format fmt = out->context->format;
+    int pixel_format = V4L2_TYPE_IS_MULTIPLANAR(fmt.type) ?
+                       fmt.fmt.pix_mp.pixelformat : fmt.fmt.pix.pixelformat;
+    int height       = V4L2_TYPE_IS_MULTIPLANAR(fmt.type) ?
+                       fmt.fmt.pix_mp.height : fmt.fmt.pix.height;
+    int is_planar_format = 0;
+
+    switch (pixel_format) {
+    case V4L2_PIX_FMT_YUV420M:
+    case V4L2_PIX_FMT_YVU420M:
+#ifdef V4L2_PIX_FMT_YUV422M
+    case V4L2_PIX_FMT_YUV422M:
+#endif
+#ifdef V4L2_PIX_FMT_YVU422M
+    case V4L2_PIX_FMT_YVU422M:
+#endif
+#ifdef V4L2_PIX_FMT_YUV444M
+    case V4L2_PIX_FMT_YUV444M:
+#endif
+#ifdef V4L2_PIX_FMT_YVU444M
+    case V4L2_PIX_FMT_YVU444M:
+#endif
+    case V4L2_PIX_FMT_NV12M:
+    case V4L2_PIX_FMT_NV21M:
+    case V4L2_PIX_FMT_NV12MT_16X16:
+    case V4L2_PIX_FMT_NV12MT:
+    case V4L2_PIX_FMT_NV16M:
+    case V4L2_PIX_FMT_NV61M:
+        is_planar_format = 1;
+    }
+
+    if (!is_planar_format) {
+        const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(frame->format);
+        int planes_nb = 0;
+        int offset = 0;
+
+        for (i = 0; i < desc->nb_components; i++)
+            planes_nb = FFMAX(planes_nb, desc->comp[i].plane + 1);
+
+        for (i = 0; i < planes_nb; i++) {
+            int size, h = height;
+            if (i == 1 || i == 2) {
+                h = AV_CEIL_RSHIFT(h, desc->log2_chroma_h);
+            }
+            size = frame->linesize[i] * h;
+            ret = v4l2_bufref_to_buf(out, 0, frame->data[i], size, offset, frame->buf[i]);
+            if (ret)
+                return ret;
+            offset += size;
+        }
+        return 0;
+    }
+
+    for (i = 0; i < out->num_planes; i++) {
+        ret = v4l2_bufref_to_buf(out, i, frame->buf[i]->data, frame->buf[i]->size, 0, frame->buf[i]);
+        if (ret)
+            return ret;
+    }
+
+    return 0;
+}
+
+/******************************************************************************
+ *
+ *              V4L2Buffer interface
+ *
+ ******************************************************************************/
+
+int ff_v4l2_buffer_avframe_to_buf(const AVFrame *frame, V4L2Buffer *out)
+{
+    v4l2_set_pts(out, frame->pts);
+
+    return v4l2_buffer_swframe_to_buf(frame, out);
+}
+
+int ff_v4l2_buffer_buf_to_avframe(AVFrame *frame, V4L2Buffer *avbuf)
+{
+    int ret;
+
+    av_frame_unref(frame);
+
+    /* 1. get references to the actual data */
+    ret = v4l2_buffer_buf_to_swframe(frame, avbuf);
+    if (ret)
+        return ret;
+
     /* 2. get frame information */
     frame->key_frame = !!(avbuf->buf.flags & V4L2_BUF_FLAG_KEYFRAME);
-    frame->format = avbuf->context->av_pix_fmt;
     frame->color_primaries = v4l2_get_color_primaries(avbuf);
     frame->colorspace = v4l2_get_color_space(avbuf);
     frame->color_range = v4l2_get_color_range(avbuf);
     frame->color_trc = v4l2_get_color_trc(avbuf);
     frame->pts = v4l2_get_pts(avbuf);
+    frame->pkt_dts = AV_NOPTS_VALUE;
 
-    /* these two values are updated also during re-init in v4l2_process_driver_event */
-    frame->height = s->output.height;
-    frame->width = s->output.width;
+    /* these values are updated also during re-init in v4l2_process_driver_event */
+    frame->height = avbuf->context->height;
+    frame->width = avbuf->context->width;
+    frame->sample_aspect_ratio = avbuf->context->sample_aspect_ratio;
 
     /* 3. report errors upstream */
     if (avbuf->buf.flags & V4L2_BUF_FLAG_ERROR) {
@@ -381,7 +479,7 @@
 {
     int ret;
 
-    ret = v4l2_bufref_to_buf(out, 0, pkt->data, pkt->size, pkt->buf);
+    ret = v4l2_bufref_to_buf(out, 0, pkt->data, pkt->size, 0, pkt->buf);
     if (ret)
         return ret;
 
@@ -413,11 +511,9 @@
 
     if (V4L2_TYPE_IS_MULTIPLANAR(ctx->type)) {
         avbuf->num_planes = 0;
-        for (;;) {
-            /* in MP, the V4L2 API states that buf.length means num_planes */
-            if (avbuf->num_planes >= avbuf->buf.length)
-                break;
-            if (avbuf->buf.m.planes[avbuf->num_planes].length)
+        /* in MP, the V4L2 API states that buf.length means num_planes */
+        for (i = 0; i < avbuf->buf.length; i++) {
+            if (avbuf->buf.m.planes[i].length)
                 avbuf->num_planes++;
         }
     } else
diff --git a/libavcodec/v4l2_buffers.h b/libavcodec/v4l2_buffers.h
index 7a57caf..8dbc7fc 100644
--- a/libavcodec/v4l2_buffers.h
+++ b/libavcodec/v4l2_buffers.h
@@ -106,7 +106,7 @@
  *
  * @returns 0 in case of success, a negative AVERROR code otherwise
  */
-int ff_v4l2_buffer_avframe_to_buf(const AVFrame *frame, V4L2Buffer* out);
+int ff_v4l2_buffer_avframe_to_buf(const AVFrame *frame, V4L2Buffer *out);
 
 /**
  * Initializes a V4L2Buffer
diff --git a/libavcodec/v4l2_context.c b/libavcodec/v4l2_context.c
index efcb042..6c2db5c 100644
--- a/libavcodec/v4l2_context.c
+++ b/libavcodec/v4l2_context.c
@@ -63,6 +63,24 @@
     return V4L2_TYPE_IS_MULTIPLANAR(fmt->type) ? fmt->fmt.pix_mp.height : fmt->fmt.pix.height;
 }
 
+static AVRational v4l2_get_sar(V4L2Context *ctx)
+{
+    struct AVRational sar = { 0, 1 };
+    struct v4l2_cropcap cropcap;
+    int ret;
+
+    memset(&cropcap, 0, sizeof(cropcap));
+    cropcap.type = ctx->type;
+
+    ret = ioctl(ctx_to_m2mctx(ctx)->fd, VIDIOC_CROPCAP, &cropcap);
+    if (ret)
+        return sar;
+
+    sar.num = cropcap.pixelaspect.numerator;
+    sar.den = cropcap.pixelaspect.denominator;
+    return sar;
+}
+
 static inline unsigned int v4l2_resolution_changed(V4L2Context *ctx, struct v4l2_format *fmt2)
 {
     struct v4l2_format *fmt1 = &ctx->format;
@@ -96,7 +114,7 @@
     const int SZ_4K = 0x1000;
     int size;
 
-    if (av_codec_is_decoder(s->avctx->codec))
+    if (s->avctx && av_codec_is_decoder(s->avctx->codec))
         return ((width * height * 3 / 2) / 2) + 128;
 
     /* encoder */
@@ -136,6 +154,7 @@
 }
 
 /**
+ * handle resolution change event and end of stream event
  * returns 1 if reinit was successful, negative if it failed
  * returns 0 if reinit was not executed
  */
@@ -153,6 +172,11 @@
         return 0;
     }
 
+    if (evt.type == V4L2_EVENT_EOS) {
+        ctx->done = 1;
+        return 0;
+    }
+
     if (evt.type != V4L2_EVENT_SOURCE_CHANGE)
         return 0;
 
@@ -172,12 +196,14 @@
     if (full_reinit) {
         s->output.height = v4l2_get_height(&out_fmt);
         s->output.width = v4l2_get_width(&out_fmt);
+        s->output.sample_aspect_ratio = v4l2_get_sar(&s->output);
     }
 
     reinit = v4l2_resolution_changed(&s->capture, &cap_fmt);
     if (reinit) {
         s->capture.height = v4l2_get_height(&cap_fmt);
         s->capture.width = v4l2_get_width(&cap_fmt);
+        s->capture.sample_aspect_ratio = v4l2_get_sar(&s->capture);
     }
 
     if (full_reinit || reinit)
@@ -187,20 +213,21 @@
         ret = ff_v4l2_m2m_codec_full_reinit(s);
         if (ret) {
             av_log(logger(ctx), AV_LOG_ERROR, "v4l2_m2m_codec_full_reinit\n");
-            return -EINVAL;
+            return AVERROR(EINVAL);
         }
         goto reinit_run;
     }
 
     if (reinit) {
-        ret = ff_set_dimensions(s->avctx, s->capture.width, s->capture.height);
+        if (s->avctx)
+            ret = ff_set_dimensions(s->avctx, s->capture.width, s->capture.height);
         if (ret < 0)
             av_log(logger(ctx), AV_LOG_WARNING, "update avcodec height and width\n");
 
         ret = ff_v4l2_m2m_codec_reinit(s);
         if (ret) {
             av_log(logger(ctx), AV_LOG_ERROR, "v4l2_m2m_codec_reinit\n");
-            return -EINVAL;
+            return AVERROR(EINVAL);
         }
         goto reinit_run;
     }
@@ -226,6 +253,8 @@
         /* DECODER_CMD is optional */
         if (errno == ENOTTY)
             return ff_v4l2_context_set_status(ctx, VIDIOC_STREAMOFF);
+        else
+            return AVERROR(errno);
     }
 
     return 0;
@@ -244,6 +273,8 @@
         /* ENCODER_CMD is optional */
         if (errno == ENOTTY)
             return ff_v4l2_context_set_status(ctx, VIDIOC_STREAMOFF);
+        else
+            return AVERROR(errno);
     }
 
     return 0;
@@ -253,7 +284,7 @@
 {
     struct v4l2_plane planes[VIDEO_MAX_PLANES];
     struct v4l2_buffer buf = { 0 };
-    V4L2Buffer* avbuf = NULL;
+    V4L2Buffer *avbuf;
     struct pollfd pfd = {
         .events =  POLLIN | POLLRDNORM | POLLPRI | POLLOUT | POLLWRNORM, /* default blocking capture */
         .fd = ctx_to_m2mctx(ctx)->fd,
@@ -263,6 +294,12 @@
     /* if we are draining and there are no more capture buffers queued in the driver we are done */
     if (!V4L2_TYPE_IS_OUTPUT(ctx->type) && ctx_to_m2mctx(ctx)->draining) {
         for (i = 0; i < ctx->num_buffers; i++) {
+            /* capture buffer initialization happens during decode hence
+             * detection happens at runtime
+             */
+            if (!ctx->buffers)
+                break;
+
             if (ctx->buffers[i].status == V4L2BUF_IN_DRIVER)
                 goto start;
         }
@@ -562,7 +599,7 @@
 
     avbuf = v4l2_getfree_v4l2buf(ctx);
     if (!avbuf)
-        return AVERROR(ENOMEM);
+        return AVERROR(EAGAIN);
 
     ret = ff_v4l2_buffer_avpkt_to_buf(pkt, avbuf);
     if (ret)
@@ -571,16 +608,16 @@
     return ff_v4l2_buffer_enqueue(avbuf);
 }
 
-int ff_v4l2_context_dequeue_frame(V4L2Context* ctx, AVFrame* frame)
+int ff_v4l2_context_dequeue_frame(V4L2Context* ctx, AVFrame* frame, int timeout)
 {
-    V4L2Buffer* avbuf = NULL;
+    V4L2Buffer *avbuf;
 
     /*
-     * blocks until:
+     * timeout=-1 blocks until:
      *  1. decoded frame available
      *  2. an input buffer is ready to be dequeued
      */
-    avbuf = v4l2_dequeue_v4l2buf(ctx, -1);
+    avbuf = v4l2_dequeue_v4l2buf(ctx, timeout);
     if (!avbuf) {
         if (ctx->done)
             return AVERROR_EOF;
@@ -593,7 +630,7 @@
 
 int ff_v4l2_context_dequeue_packet(V4L2Context* ctx, AVPacket* pkt)
 {
-    V4L2Buffer* avbuf = NULL;
+    V4L2Buffer *avbuf;
 
     /*
      * blocks until:
@@ -611,7 +648,7 @@
     return ff_v4l2_buffer_buf_to_avpkt(pkt, avbuf);
 }
 
-int ff_v4l2_context_get_format(V4L2Context* ctx)
+int ff_v4l2_context_get_format(V4L2Context* ctx, int probe)
 {
     struct v4l2_format_update fmt = { 0 };
     int ret;
@@ -621,7 +658,7 @@
         if (ret)
             return ret;
 
-        fmt.update_avfmt = 1;
+        fmt.update_avfmt = !probe;
         v4l2_save_to_context(ctx, &fmt);
 
         /* format has been tried already */
@@ -654,8 +691,7 @@
     if (ret)
         av_log(logger(ctx), AV_LOG_WARNING, "V4L2 failed to unmap the %s buffers\n", ctx->name);
 
-    av_free(ctx->buffers);
-    ctx->buffers = NULL;
+    av_freep(&ctx->buffers);
 }
 
 int ff_v4l2_context_init(V4L2Context* ctx)
@@ -678,23 +714,24 @@
     req.memory = V4L2_MEMORY_MMAP;
     req.type = ctx->type;
     ret = ioctl(s->fd, VIDIOC_REQBUFS, &req);
-    if (ret < 0)
+    if (ret < 0) {
+        av_log(logger(ctx), AV_LOG_ERROR, "%s VIDIOC_REQBUFS failed: %s\n", ctx->name, strerror(errno));
         return AVERROR(errno);
+    }
 
     ctx->num_buffers = req.count;
     ctx->buffers = av_mallocz(ctx->num_buffers * sizeof(V4L2Buffer));
     if (!ctx->buffers) {
-            av_log(logger(ctx), AV_LOG_ERROR, "%s malloc enomem\n", ctx->name);
-            return AVERROR(ENOMEM);
+        av_log(logger(ctx), AV_LOG_ERROR, "%s malloc enomem\n", ctx->name);
+        return AVERROR(ENOMEM);
     }
 
     for (i = 0; i < req.count; i++) {
         ctx->buffers[i].context = ctx;
         ret = ff_v4l2_buffer_initialize(&ctx->buffers[i], i);
         if (ret < 0) {
-            av_log(logger(ctx), AV_LOG_ERROR, "%s buffer initialization (%s)\n", ctx->name, av_err2str(ret));
-            av_free(ctx->buffers);
-            return ret;
+            av_log(logger(ctx), AV_LOG_ERROR, "%s buffer[%d] initialization (%s)\n", ctx->name, i, av_err2str(ret));
+            goto error;
         }
     }
 
@@ -707,4 +744,11 @@
         V4L2_TYPE_IS_MULTIPLANAR(ctx->type) ? ctx->format.fmt.pix_mp.plane_fmt[0].bytesperline : ctx->format.fmt.pix.bytesperline);
 
     return 0;
+
+error:
+    v4l2_release_buffers(ctx);
+
+    av_freep(&ctx->buffers);
+
+    return ret;
 }
diff --git a/libavcodec/v4l2_context.h b/libavcodec/v4l2_context.h
index 632f1d0..22a9532 100644
--- a/libavcodec/v4l2_context.h
+++ b/libavcodec/v4l2_context.h
@@ -69,6 +69,7 @@
      * or accepts (in case of an output context, e.g. when encoding).
      */
     int width, height;
+    AVRational sample_aspect_ratio;
 
     /**
      * Indexed array of V4L2Buffers
@@ -113,9 +114,10 @@
  * Queries the driver for a valid v4l2 format and copies it to the context.
  *
  * @param[in] ctx A pointer to a V4L2Context. See V4L2Context description for required variables.
+ * @param[in] probe Probe only and ignore changes to the format.
  * @return 0 in case of success, a negative value representing the error otherwise.
  */
-int ff_v4l2_context_get_format(V4L2Context* ctx);
+int ff_v4l2_context_get_format(V4L2Context* ctx, int probe);
 
 /**
  * Releases a V4L2Context.
@@ -153,9 +155,10 @@
  * The frame must be non NULL.
  * @param[in] ctx The V4L2Context to dequeue from.
  * @param[inout] f The AVFrame to dequeue to.
+ * @param[in] timeout The timeout for dequeue (-1 to block, 0 to return immediately, or milliseconds)
  * @return 0 in case of success, AVERROR(EAGAIN) if no buffer was ready, another negative error in case of error.
  */
-int ff_v4l2_context_dequeue_frame(V4L2Context* ctx, AVFrame* f);
+int ff_v4l2_context_dequeue_frame(V4L2Context* ctx, AVFrame* f, int timeout);
 
 /**
  * Enqueues a buffer to a V4L2Context from an AVPacket
diff --git a/libavcodec/v4l2_m2m.c b/libavcodec/v4l2_m2m.c
index 427e165..e48b3a8 100644
--- a/libavcodec/v4l2_m2m.c
+++ b/libavcodec/v4l2_m2m.c
@@ -60,14 +60,15 @@
     return 0;
 }
 
-static int v4l2_prepare_contexts(V4L2m2mContext* s)
+static int v4l2_prepare_contexts(V4L2m2mContext *s, int probe)
 {
     struct v4l2_capability cap;
+    void *log_ctx = s->avctx;
     int ret;
 
     s->capture.done = s->output.done = 0;
     s->capture.name = "capture";
-    s->output.name = "output ";
+    s->output.name = "output";
     atomic_init(&s->refcount, 0);
     sem_init(&s->refsync, 0, 0);
 
@@ -76,7 +77,10 @@
     if (ret < 0)
         return ret;
 
-    av_log(s->avctx, AV_LOG_INFO, "driver '%s' on card '%s'\n", cap.driver, cap.card);
+    av_log(log_ctx, probe ? AV_LOG_DEBUG : AV_LOG_INFO,
+                     "driver '%s' on card '%s' in %s mode\n", cap.driver, cap.card,
+                     v4l2_mplane_video(&cap) ? "mplane" :
+                     v4l2_splane_video(&cap) ? "splane" : "unknown");
 
     if (v4l2_mplane_video(&cap)) {
         s->capture.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
@@ -93,42 +97,7 @@
     return AVERROR(EINVAL);
 }
 
-static int v4l2_probe_driver(V4L2m2mContext* s)
-{
-    int ret;
-
-    s->fd = open(s->devname, O_RDWR | O_NONBLOCK, 0);
-    if (s->fd < 0)
-        return AVERROR(errno);
-
-    ret = v4l2_prepare_contexts(s);
-    if (ret < 0)
-        goto done;
-
-    ret = ff_v4l2_context_get_format(&s->output);
-    if (ret) {
-        av_log(s->avctx, AV_LOG_DEBUG, "v4l2 output format not supported\n");
-        goto done;
-    }
-
-    ret = ff_v4l2_context_get_format(&s->capture);
-    if (ret) {
-        av_log(s->avctx, AV_LOG_DEBUG, "v4l2 capture format not supported\n");
-        goto done;
-    }
-
-done:
-    if (close(s->fd) < 0) {
-        ret = AVERROR(errno);
-        av_log(s->avctx, AV_LOG_ERROR, "failure closing %s (%s)\n", s->devname, av_err2str(AVERROR(errno)));
-    }
-
-    s->fd = -1;
-
-    return ret;
-}
-
-static int v4l2_configure_contexts(V4L2m2mContext* s)
+static int v4l2_probe_driver(V4L2m2mContext *s)
 {
     void *log_ctx = s->avctx;
     int ret;
@@ -137,10 +106,57 @@
     if (s->fd < 0)
         return AVERROR(errno);
 
-    ret = v4l2_prepare_contexts(s);
+    ret = v4l2_prepare_contexts(s, 1);
+    if (ret < 0)
+        goto done;
+
+    ret = ff_v4l2_context_get_format(&s->output, 1);
+    if (ret) {
+        av_log(log_ctx, AV_LOG_DEBUG, "v4l2 output format not supported\n");
+        goto done;
+    }
+
+    ret = ff_v4l2_context_get_format(&s->capture, 1);
+    if (ret) {
+        av_log(log_ctx, AV_LOG_DEBUG, "v4l2 capture format not supported\n");
+        goto done;
+    }
+
+done:
+    if (close(s->fd) < 0) {
+        ret = AVERROR(errno);
+        av_log(log_ctx, AV_LOG_ERROR, "failure closing %s (%s)\n", s->devname, av_err2str(AVERROR(errno)));
+    }
+
+    s->fd = -1;
+
+    return ret;
+}
+
+static int v4l2_configure_contexts(V4L2m2mContext *s)
+{
+    void *log_ctx = s->avctx;
+    int ret;
+    struct v4l2_format ofmt, cfmt;
+
+    s->fd = open(s->devname, O_RDWR | O_NONBLOCK, 0);
+    if (s->fd < 0)
+        return AVERROR(errno);
+
+    ret = v4l2_prepare_contexts(s, 0);
     if (ret < 0)
         goto error;
 
+    ofmt = s->output.format;
+    cfmt = s->capture.format;
+    av_log(log_ctx, AV_LOG_INFO, "requesting formats: output=%s capture=%s\n",
+                                 av_fourcc2str(V4L2_TYPE_IS_MULTIPLANAR(ofmt.type) ?
+                                               ofmt.fmt.pix_mp.pixelformat :
+                                               ofmt.fmt.pix.pixelformat),
+                                 av_fourcc2str(V4L2_TYPE_IS_MULTIPLANAR(cfmt.type) ?
+                                               cfmt.fmt.pix_mp.pixelformat :
+                                               cfmt.fmt.pix.pixelformat));
+
     ret = ff_v4l2_context_set_format(&s->output);
     if (ret) {
         av_log(log_ctx, AV_LOG_ERROR, "can't set v4l2 output format\n");
@@ -160,7 +176,7 @@
     }
 
     /* decoder's buffers need to be updated at a later stage */
-    if (!av_codec_is_decoder(s->avctx->codec)) {
+    if (s->avctx && !av_codec_is_decoder(s->avctx->codec)) {
         ret = ff_v4l2_context_init(&s->capture);
         if (ret) {
             av_log(log_ctx, AV_LOG_ERROR, "no v4l2 capture context's buffers\n");
@@ -186,38 +202,39 @@
  *                  V4L2 M2M Interface
  *
  ******************************************************************************/
-int ff_v4l2_m2m_codec_reinit(V4L2m2mContext* s)
+int ff_v4l2_m2m_codec_reinit(V4L2m2mContext *s)
 {
+    void *log_ctx = s->avctx;
     int ret;
 
-    av_log(s->avctx, AV_LOG_DEBUG, "reinit context\n");
+    av_log(log_ctx, AV_LOG_DEBUG, "reinit context\n");
 
     /* 1. streamoff */
     ret = ff_v4l2_context_set_status(&s->capture, VIDIOC_STREAMOFF);
     if (ret)
-        av_log(s->avctx, AV_LOG_ERROR, "capture VIDIOC_STREAMOFF\n");
+        av_log(log_ctx, AV_LOG_ERROR, "capture VIDIOC_STREAMOFF\n");
 
     /* 2. unmap the capture buffers (v4l2 and ffmpeg):
      *    we must wait for all references to be released before being allowed
      *    to queue new buffers.
      */
-    av_log(s->avctx, AV_LOG_DEBUG, "waiting for user to release AVBufferRefs\n");
+    av_log(log_ctx, AV_LOG_DEBUG, "waiting for user to release AVBufferRefs\n");
     if (atomic_load(&s->refcount))
         while(sem_wait(&s->refsync) == -1 && errno == EINTR);
 
     ff_v4l2_context_release(&s->capture);
 
     /* 3. get the new capture format */
-    ret = ff_v4l2_context_get_format(&s->capture);
+    ret = ff_v4l2_context_get_format(&s->capture, 0);
     if (ret) {
-        av_log(s->avctx, AV_LOG_ERROR, "query the new capture format\n");
+        av_log(log_ctx, AV_LOG_ERROR, "query the new capture format\n");
         return ret;
     }
 
     /* 4. set the capture format */
     ret = ff_v4l2_context_set_format(&s->capture);
     if (ret) {
-        av_log(s->avctx, AV_LOG_ERROR, "setting capture format\n");
+        av_log(log_ctx, AV_LOG_ERROR, "setting capture format\n");
         return ret;
     }
 
@@ -241,14 +258,14 @@
 
     ret = ff_v4l2_context_set_status(&s->output, VIDIOC_STREAMOFF);
     if (ret) {
-        av_log(s->avctx, AV_LOG_ERROR, "output VIDIOC_STREAMOFF\n");
+        av_log(log_ctx, AV_LOG_ERROR, "output VIDIOC_STREAMOFF\n");
         goto error;
     }
 
     ret = ff_v4l2_context_set_status(&s->capture, VIDIOC_STREAMOFF);
     if (ret) {
-            av_log(s->avctx, AV_LOG_ERROR, "capture VIDIOC_STREAMOFF\n");
-            goto error;
+        av_log(log_ctx, AV_LOG_ERROR, "capture VIDIOC_STREAMOFF\n");
+        goto error;
     }
 
     /* release and unmmap the buffers */
@@ -259,13 +276,13 @@
     s->draining = 0;
     s->reinit = 0;
 
-    ret = ff_v4l2_context_get_format(&s->output);
+    ret = ff_v4l2_context_get_format(&s->output, 0);
     if (ret) {
         av_log(log_ctx, AV_LOG_DEBUG, "v4l2 output format not supported\n");
         goto error;
     }
 
-    ret = ff_v4l2_context_get_format(&s->capture);
+    ret = ff_v4l2_context_get_format(&s->capture, 0);
     if (ret) {
         av_log(log_ctx, AV_LOG_DEBUG, "v4l2 capture format not supported\n");
         goto error;
@@ -290,7 +307,7 @@
     }
 
     /* decoder's buffers need to be updated at a later stage */
-    if (!av_codec_is_decoder(s->avctx->codec)) {
+    if (s->avctx && !av_codec_is_decoder(s->avctx->codec)) {
         ret = ff_v4l2_context_init(&s->capture);
         if (ret) {
             av_log(log_ctx, AV_LOG_ERROR, "no v4l2 capture context's buffers\n");
@@ -316,19 +333,18 @@
     av_free(s);
 }
 
-int ff_v4l2_m2m_codec_end(AVCodecContext *avctx)
+int ff_v4l2_m2m_codec_end(V4L2m2mPriv *priv)
 {
-    V4L2m2mPriv *priv = avctx->priv_data;
-    V4L2m2mContext* s = priv->context;
+    V4L2m2mContext *s = priv->context;
     int ret;
 
     ret = ff_v4l2_context_set_status(&s->output, VIDIOC_STREAMOFF);
     if (ret)
-            av_log(avctx, AV_LOG_ERROR, "VIDIOC_STREAMOFF %s\n", s->output.name);
+        av_log(s->avctx, AV_LOG_ERROR, "VIDIOC_STREAMOFF %s\n", s->output.name);
 
     ret = ff_v4l2_context_set_status(&s->capture, VIDIOC_STREAMOFF);
     if (ret)
-        av_log(avctx, AV_LOG_ERROR, "VIDIOC_STREAMOFF %s\n", s->capture.name);
+        av_log(s->avctx, AV_LOG_ERROR, "VIDIOC_STREAMOFF %s\n", s->capture.name);
 
     ff_v4l2_context_release(&s->output);
 
@@ -338,15 +354,13 @@
     return 0;
 }
 
-int ff_v4l2_m2m_codec_init(AVCodecContext *avctx)
+int ff_v4l2_m2m_codec_init(V4L2m2mPriv *priv)
 {
     int ret = AVERROR(EINVAL);
     struct dirent *entry;
-    char node[PATH_MAX];
     DIR *dirp;
 
-    V4L2m2mContext *s = ((V4L2m2mPriv*)avctx->priv_data)->context;
-    s->avctx = avctx;
+    V4L2m2mContext *s = priv->context;
 
     dirp = opendir("/dev");
     if (!dirp)
@@ -357,12 +371,11 @@
         if (strncmp(entry->d_name, "video", 5))
             continue;
 
-        snprintf(node, sizeof(node), "/dev/%s", entry->d_name);
-        av_log(s->avctx, AV_LOG_DEBUG, "probing device %s\n", node);
-        strncpy(s->devname, node, strlen(node) + 1);
+        snprintf(s->devname, sizeof(s->devname), "/dev/%s", entry->d_name);
+        av_log(s->avctx, AV_LOG_DEBUG, "probing device %s\n", s->devname);
         ret = v4l2_probe_driver(s);
         if (!ret)
-                break;
+            break;
     }
 
     closedir(dirp);
@@ -374,15 +387,13 @@
         return ret;
     }
 
-    av_log(s->avctx, AV_LOG_INFO, "Using device %s\n", node);
+    av_log(s->avctx, AV_LOG_INFO, "Using device %s\n", s->devname);
 
     return v4l2_configure_contexts(s);
 }
 
-int ff_v4l2_m2m_create_context(AVCodecContext *avctx, V4L2m2mContext **s)
+int ff_v4l2_m2m_create_context(V4L2m2mPriv *priv, V4L2m2mContext **s)
 {
-    V4L2m2mPriv *priv = avctx->priv_data;
-
     *s = av_mallocz(sizeof(V4L2m2mContext));
     if (!*s)
         return AVERROR(ENOMEM);
@@ -396,11 +407,13 @@
 
     /* assign the context */
     priv->context = *s;
+    (*s)->priv = priv;
 
     /* populate it */
     priv->context->capture.num_buffers = priv->num_capture_buffers;
     priv->context->output.num_buffers  = priv->num_output_buffers;
     priv->context->self_ref = priv->context_ref;
+    priv->context->fd = -1;
 
     return 0;
 }
diff --git a/libavcodec/v4l2_m2m.h b/libavcodec/v4l2_m2m.h
index 452bf0d..456281f 100644
--- a/libavcodec/v4l2_m2m.h
+++ b/libavcodec/v4l2_m2m.h
@@ -56,13 +56,16 @@
 
     /* null frame/packet received */
     int draining;
+    AVPacket buf_pkt;
 
     /* Reference to self; only valid while codec is active. */
     AVBufferRef *self_ref;
+
+    /* reference back to V4L2m2mPriv */
+    void *priv;
 } V4L2m2mContext;
 
-typedef struct V4L2m2mPriv
-{
+typedef struct V4L2m2mPriv {
     AVClass *class;
 
     V4L2m2mContext *context;
@@ -75,36 +78,36 @@
 /**
  * Allocate a new context and references for a V4L2 M2M instance.
  *
- * @param[in] ctx The AVCodecContext instantiated by the encoder/decoder.
+ * @param[in] ctx The V4L2m2mPriv instantiated by the encoder/decoder.
  * @param[out] ctx The V4L2m2mContext.
  *
  * @returns 0 in success, a negative error code otherwise.
  */
-int ff_v4l2_m2m_create_context(AVCodecContext *avctx, V4L2m2mContext **s);
+int ff_v4l2_m2m_create_context(V4L2m2mPriv *priv, V4L2m2mContext **s);
 
 
 /**
  * Probes the video nodes looking for the required codec capabilities.
  *
- * @param[in] ctx The AVCodecContext instantiated by the encoder/decoder.
+ * @param[in] ctx The V4L2m2mPriv instantiated by the encoder/decoder.
  *
  * @returns 0 if a driver is found, a negative number otherwise.
  */
-int ff_v4l2_m2m_codec_init(AVCodecContext *avctx);
+int ff_v4l2_m2m_codec_init(V4L2m2mPriv *priv);
 
 /**
  * Releases all the codec resources if all AVBufferRefs have been returned to the
  * ctx. Otherwise keep the driver open.
  *
- * @param[in] The AVCodecContext instantiated by the encoder/decoder.
+ * @param[in] The V4L2m2mPriv instantiated by the encoder/decoder.
  *
  * @returns 0
  *
  */
-int ff_v4l2_m2m_codec_end(AVCodecContext *avctx);
+int ff_v4l2_m2m_codec_end(V4L2m2mPriv *priv);
 
 /**
- * Reinitializes the V4L2m2mContext when the driver cant continue processing
+ * Reinitializes the V4L2m2mContext when the driver cannot continue processing
  * with the capture parameters.
  *
  * @param[in] ctx The V4L2m2mContext instantiated by the encoder/decoder.
@@ -114,7 +117,7 @@
 int ff_v4l2_m2m_codec_reinit(V4L2m2mContext *ctx);
 
 /**
- * Reinitializes the V4L2m2mContext when the driver cant continue processing
+ * Reinitializes the V4L2m2mContext when the driver cannot continue processing
  * with the  any of the current V4L2Contexts (ie, changes in output and capture).
  *
  * @param[in] ctx The V4L2m2mContext instantiated by the encoder/decoder.
diff --git a/libavcodec/v4l2_m2m_dec.c b/libavcodec/v4l2_m2m_dec.c
index 710e40e..3e17e0f 100644
--- a/libavcodec/v4l2_m2m_dec.c
+++ b/libavcodec/v4l2_m2m_dec.c
@@ -28,6 +28,7 @@
 #include "libavutil/opt.h"
 #include "libavcodec/avcodec.h"
 #include "libavcodec/decode.h"
+#include "libavcodec/internal.h"
 
 #include "v4l2_context.h"
 #include "v4l2_m2m.h"
@@ -38,7 +39,7 @@
     V4L2m2mContext *s = ((V4L2m2mPriv*)avctx->priv_data)->context;
     V4L2Context *const capture = &s->capture;
     V4L2Context *const output = &s->output;
-    struct v4l2_selection selection;
+    struct v4l2_selection selection = { 0 };
     int ret;
 
     /* 1. start the output process */
@@ -86,8 +87,8 @@
     if (!capture->buffers) {
         ret = ff_v4l2_context_init(capture);
         if (ret) {
-            av_log(avctx, AV_LOG_DEBUG, "can't request output buffers\n");
-            return ret;
+            av_log(avctx, AV_LOG_ERROR, "can't request capture buffers\n");
+            return AVERROR(ENOMEM);
         }
     }
 
@@ -122,6 +123,13 @@
         }
     }
 
+    memset(&sub, 0, sizeof(sub));
+    sub.type = V4L2_EVENT_EOS;
+    ret = ioctl(s->fd, VIDIOC_SUBSCRIBE_EVENT, &sub);
+    if (ret < 0)
+        av_log(s->avctx, AV_LOG_WARNING,
+               "the v4l2 driver does not support end of stream VIDIOC_SUBSCRIBE_EVENT\n");
+
     return 0;
 }
 
@@ -133,17 +141,24 @@
     AVPacket avpkt = {0};
     int ret;
 
-    ret = ff_decode_get_packet(avctx, &avpkt);
-    if (ret < 0 && ret != AVERROR_EOF)
-        return ret;
+    if (s->buf_pkt.size) {
+        avpkt = s->buf_pkt;
+        memset(&s->buf_pkt, 0, sizeof(AVPacket));
+    } else {
+        ret = ff_decode_get_packet(avctx, &avpkt);
+        if (ret < 0 && ret != AVERROR_EOF)
+            return ret;
+    }
 
     if (s->draining)
         goto dequeue;
 
     ret = ff_v4l2_context_enqueue_packet(output, &avpkt);
     if (ret < 0) {
-        if (ret != AVERROR(ENOMEM))
+        if (ret != AVERROR(EAGAIN))
            return ret;
+
+        s->buf_pkt = avpkt;
         /* no input buffers available, continue dequeing */
     }
 
@@ -151,22 +166,29 @@
         ret = v4l2_try_start(avctx);
         if (ret) {
             av_packet_unref(&avpkt);
+
+            /* cant recover */
+            if (ret == AVERROR(ENOMEM))
+                return ret;
+
             return 0;
         }
     }
 
 dequeue:
-    av_packet_unref(&avpkt);
-    return ff_v4l2_context_dequeue_frame(capture, frame);
+    if (!s->buf_pkt.size)
+        av_packet_unref(&avpkt);
+    return ff_v4l2_context_dequeue_frame(capture, frame, -1);
 }
 
 static av_cold int v4l2_decode_init(AVCodecContext *avctx)
 {
     V4L2Context *capture, *output;
     V4L2m2mContext *s;
+    V4L2m2mPriv *priv = avctx->priv_data;
     int ret;
 
-    ret = ff_v4l2_m2m_create_context(avctx, &s);
+    ret = ff_v4l2_m2m_create_context(priv, &s);
     if (ret < 0)
         return ret;
 
@@ -186,15 +208,27 @@
     capture->av_codec_id = AV_CODEC_ID_RAWVIDEO;
     capture->av_pix_fmt = avctx->pix_fmt;
 
-    ret = ff_v4l2_m2m_codec_init(avctx);
+    s->avctx = avctx;
+    ret = ff_v4l2_m2m_codec_init(priv);
     if (ret) {
         av_log(avctx, AV_LOG_ERROR, "can't configure decoder\n");
+        s->self_ref = NULL;
+        av_buffer_unref(&priv->context_ref);
+
         return ret;
     }
 
     return v4l2_prepare_decoder(s);
 }
 
+static av_cold int v4l2_decode_close(AVCodecContext *avctx)
+{
+    V4L2m2mPriv *priv = avctx->priv_data;
+    V4L2m2mContext *s = priv->context;
+    av_packet_unref(&s->buf_pkt);
+    return ff_v4l2_m2m_codec_end(priv);
+}
+
 #define OFFSET(x) offsetof(V4L2m2mPriv, x)
 #define FLAGS AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM
 
@@ -205,29 +239,31 @@
     { NULL},
 };
 
+#define M2MDEC_CLASS(NAME) \
+    static const AVClass v4l2_m2m_ ## NAME ## _dec_class = { \
+        .class_name = #NAME "_v4l2m2m_decoder", \
+        .item_name  = av_default_item_name, \
+        .option     = options, \
+        .version    = LIBAVUTIL_VERSION_INT, \
+    };
+
 #define M2MDEC(NAME, LONGNAME, CODEC, bsf_name) \
-static const AVClass v4l2_m2m_ ## NAME ## _dec_class = {\
-    .class_name = #NAME "_v4l2_m2m_decoder",\
-    .item_name  = av_default_item_name,\
-    .option     = options,\
-    .version    = LIBAVUTIL_VERSION_INT,\
-};\
-\
-AVCodec ff_ ## NAME ## _v4l2m2m_decoder = { \
-    .name           = #NAME "_v4l2m2m" ,\
-    .long_name      = NULL_IF_CONFIG_SMALL("V4L2 mem2mem " LONGNAME " decoder wrapper"),\
-    .type           = AVMEDIA_TYPE_VIDEO,\
-    .id             = CODEC ,\
-    .priv_data_size = sizeof(V4L2m2mPriv),\
-    .priv_class     = &v4l2_m2m_ ## NAME ## _dec_class,\
-    .init           = v4l2_decode_init,\
-    .receive_frame  = v4l2_receive_frame,\
-    .close          = ff_v4l2_m2m_codec_end,\
-    .bsfs           = bsf_name, \
-    .capabilities   = AV_CODEC_CAP_HARDWARE | AV_CODEC_CAP_DELAY | \
-                      AV_CODEC_CAP_AVOID_PROBING, \
-    .wrapper_name   = "v4l2m2m", \
-};
+    M2MDEC_CLASS(NAME) \
+    AVCodec ff_ ## NAME ## _v4l2m2m_decoder = { \
+        .name           = #NAME "_v4l2m2m" , \
+        .long_name      = NULL_IF_CONFIG_SMALL("V4L2 mem2mem " LONGNAME " decoder wrapper"), \
+        .type           = AVMEDIA_TYPE_VIDEO, \
+        .id             = CODEC , \
+        .priv_data_size = sizeof(V4L2m2mPriv), \
+        .priv_class     = &v4l2_m2m_ ## NAME ## _dec_class, \
+        .init           = v4l2_decode_init, \
+        .receive_frame  = v4l2_receive_frame, \
+        .close          = v4l2_decode_close, \
+        .bsfs           = bsf_name, \
+        .capabilities   = AV_CODEC_CAP_HARDWARE | AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AVOID_PROBING, \
+        .caps_internal  = FF_CODEC_CAP_SETS_PKT_DTS, \
+        .wrapper_name   = "v4l2m2m", \
+    }
 
 M2MDEC(h264,  "H.264", AV_CODEC_ID_H264,       "h264_mp4toannexb");
 M2MDEC(hevc,  "HEVC",  AV_CODEC_ID_HEVC,       "hevc_mp4toannexb");
diff --git a/libavcodec/v4l2_m2m_enc.c b/libavcodec/v4l2_m2m_enc.c
index 636e1a9..a025860 100644
--- a/libavcodec/v4l2_m2m_enc.c
+++ b/libavcodec/v4l2_m2m_enc.c
@@ -30,6 +30,7 @@
 #include "libavutil/opt.h"
 #include "v4l2_context.h"
 #include "v4l2_m2m.h"
+#include "v4l2_fmt.h"
 
 #define MPEG_CID(x) V4L2_CID_MPEG_VIDEO_##x
 #define MPEG_VIDEO(x) V4L2_MPEG_VIDEO_##x
@@ -58,10 +59,10 @@
 
     /* set ctrl*/
     ctrl.value = value;
-    ctrl.id = id ;
+    ctrl.id = id;
 
     if (ioctl(s->fd, VIDIOC_S_EXT_CTRLS, &ctrls) < 0)
-        av_log(s->avctx, AV_LOG_WARNING, "Failed to set %s\n", name);
+        av_log(s->avctx, AV_LOG_WARNING, "Failed to set %s: %s\n", name, strerror(errno));
     else
         av_log(s->avctx, AV_LOG_DEBUG, "Encoder: %s = %d\n", name, value);
 }
@@ -82,7 +83,7 @@
 
     ret = ioctl(s->fd, VIDIOC_G_EXT_CTRLS, &ctrls);
     if (ret < 0) {
-        av_log(s->avctx, AV_LOG_WARNING, "Failed to set %s\n", name);
+        av_log(s->avctx, AV_LOG_WARNING, "Failed to get %s\n", name);
         return ret;
     }
 
@@ -154,6 +155,17 @@
     return AVERROR_PATCHWELCOME;
 }
 
+static inline void v4l2_subscribe_eos_event(V4L2m2mContext *s)
+{
+    struct v4l2_event_subscription sub;
+
+    memset(&sub, 0, sizeof(sub));
+    sub.type = V4L2_EVENT_EOS;
+    if (ioctl(s->fd, VIDIOC_SUBSCRIBE_EVENT, &sub) < 0)
+        av_log(s->avctx, AV_LOG_WARNING,
+               "the v4l2 driver does not support end of stream VIDIOC_SUBSCRIBE_EVENT\n");
+}
+
 static int v4l2_prepare_encoder(V4L2m2mContext *s)
 {
     AVCodecContext *avctx = s->avctx;
@@ -163,6 +175,8 @@
     /**
      * requirements
      */
+    v4l2_subscribe_eos_event(s);
+
     ret = v4l2_check_b_frame_support(s);
     if (ret)
         return ret;
@@ -171,7 +185,7 @@
      * settingss
      */
     if (avctx->framerate.num || avctx->framerate.den)
-        v4l2_set_timeperframe(s, avctx->framerate.num, avctx->framerate.den);
+        v4l2_set_timeperframe(s, avctx->framerate.den, avctx->framerate.num);
 
     /* set ext ctrls */
     v4l2_set_ext_ctrl(s, MPEG_CID(HEADER_MODE), MPEG_VIDEO(HEADER_MODE_SEPARATE), "header mode");
@@ -245,6 +259,11 @@
     V4L2m2mContext *s = ((V4L2m2mPriv*)avctx->priv_data)->context;
     V4L2Context *const output = &s->output;
 
+#ifdef V4L2_CID_MPEG_VIDEO_FORCE_KEY_FRAME
+    if (frame && frame->pict_type == AV_PICTURE_TYPE_I)
+        v4l2_set_ext_ctrl(s, MPEG_CID(FORCE_KEY_FRAME), 0, "force key frame");
+#endif
+
     return ff_v4l2_context_enqueue_frame(output, frame);
 }
 
@@ -261,7 +280,7 @@
     if (!output->streamon) {
         ret = ff_v4l2_context_set_status(output, VIDIOC_STREAMON);
         if (ret) {
-            av_log(avctx, AV_LOG_ERROR, "VIDIOC_STREAMOFF failed on output context\n");
+            av_log(avctx, AV_LOG_ERROR, "VIDIOC_STREAMON failed on output context\n");
             return ret;
         }
     }
@@ -282,9 +301,12 @@
 {
     V4L2Context *capture, *output;
     V4L2m2mContext *s;
+    V4L2m2mPriv *priv = avctx->priv_data;
+    enum AVPixelFormat pix_fmt_output;
+    uint32_t v4l2_fmt_output;
     int ret;
 
-    ret = ff_v4l2_m2m_create_context(avctx, &s);
+    ret = ff_v4l2_m2m_create_context(priv, &s);
     if (ret < 0)
         return ret;
 
@@ -303,15 +325,33 @@
     capture->av_codec_id = avctx->codec_id;
     capture->av_pix_fmt = AV_PIX_FMT_NONE;
 
-    ret = ff_v4l2_m2m_codec_init(avctx);
+    s->avctx = avctx;
+    ret = ff_v4l2_m2m_codec_init(priv);
     if (ret) {
         av_log(avctx, AV_LOG_ERROR, "can't configure encoder\n");
         return ret;
     }
 
+    if (V4L2_TYPE_IS_MULTIPLANAR(output->type))
+        v4l2_fmt_output = output->format.fmt.pix_mp.pixelformat;
+    else
+        v4l2_fmt_output = output->format.fmt.pix.pixelformat;
+
+    pix_fmt_output = ff_v4l2_format_v4l2_to_avfmt(v4l2_fmt_output, AV_CODEC_ID_RAWVIDEO);
+    if (pix_fmt_output != avctx->pix_fmt) {
+        const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt_output);
+        av_log(avctx, AV_LOG_ERROR, "Encoder requires %s pixel format.\n", desc->name);
+        return AVERROR(EINVAL);
+    }
+
     return v4l2_prepare_encoder(s);
 }
 
+static av_cold int v4l2_encode_close(AVCodecContext *avctx)
+{
+    return ff_v4l2_m2m_codec_end(avctx->priv_data);
+}
+
 #define OFFSET(x) offsetof(V4L2m2mPriv, x)
 #define FLAGS AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
 
@@ -322,28 +362,30 @@
     { NULL },
 };
 
+#define M2MENC_CLASS(NAME) \
+    static const AVClass v4l2_m2m_ ## NAME ## _enc_class = { \
+        .class_name = #NAME "_v4l2m2m_encoder", \
+        .item_name  = av_default_item_name, \
+        .option     = options, \
+        .version    = LIBAVUTIL_VERSION_INT, \
+    };
+
 #define M2MENC(NAME, LONGNAME, CODEC) \
-static const AVClass v4l2_m2m_ ## NAME ## _enc_class = {\
-    .class_name = #NAME "_v4l2_m2m_encoder",\
-    .item_name  = av_default_item_name,\
-    .option     = options,\
-    .version    = LIBAVUTIL_VERSION_INT,\
-};\
-\
-AVCodec ff_ ## NAME ## _v4l2m2m_encoder = { \
-    .name           = #NAME "_v4l2m2m" ,\
-    .long_name      = NULL_IF_CONFIG_SMALL("V4L2 mem2mem " LONGNAME " encoder wrapper"),\
-    .type           = AVMEDIA_TYPE_VIDEO,\
-    .id             = CODEC ,\
-    .priv_data_size = sizeof(V4L2m2mPriv),\
-    .priv_class     = &v4l2_m2m_ ## NAME ##_enc_class,\
-    .init           = v4l2_encode_init,\
-    .send_frame     = v4l2_send_frame,\
-    .receive_packet = v4l2_receive_packet,\
-    .close          = ff_v4l2_m2m_codec_end,\
-    .capabilities   = AV_CODEC_CAP_HARDWARE | AV_CODEC_CAP_DELAY, \
-    .wrapper_name   = "v4l2m2m", \
-};
+    M2MENC_CLASS(NAME) \
+    AVCodec ff_ ## NAME ## _v4l2m2m_encoder = { \
+        .name           = #NAME "_v4l2m2m" , \
+        .long_name      = NULL_IF_CONFIG_SMALL("V4L2 mem2mem " LONGNAME " encoder wrapper"), \
+        .type           = AVMEDIA_TYPE_VIDEO, \
+        .id             = CODEC , \
+        .priv_data_size = sizeof(V4L2m2mPriv), \
+        .priv_class     = &v4l2_m2m_ ## NAME ##_enc_class, \
+        .init           = v4l2_encode_init, \
+        .send_frame     = v4l2_send_frame, \
+        .receive_packet = v4l2_receive_packet, \
+        .close          = v4l2_encode_close, \
+        .capabilities   = AV_CODEC_CAP_HARDWARE | AV_CODEC_CAP_DELAY, \
+        .wrapper_name   = "v4l2m2m", \
+    };
 
 M2MENC(mpeg4,"MPEG4", AV_CODEC_ID_MPEG4);
 M2MENC(h263, "H.263", AV_CODEC_ID_H263);
diff --git a/libavcodec/vaapi_decode.c b/libavcodec/vaapi_decode.c
index 69512e1..5e4f62b 100644
--- a/libavcodec/vaapi_decode.c
+++ b/libavcodec/vaapi_decode.c
@@ -24,6 +24,7 @@
 #include "decode.h"
 #include "internal.h"
 #include "vaapi_decode.h"
+#include "vaapi_hevc.h"
 
 
 int ff_vaapi_decode_make_param_buffer(AVCodecContext *avctx,
@@ -256,6 +257,10 @@
 #ifdef VA_FOURCC_YV16
     MAP(YV16, YUV422P),
 #endif
+    MAP(YUY2, YUYV422),
+#ifdef VA_FOURCC_Y210
+    MAP(Y210,    Y210),
+#endif
     // 4:4:0
     MAP(422V, YUV440P),
     // 4:4:4
@@ -364,8 +369,9 @@
     enum AVCodecID codec_id;
     int codec_profile;
     VAProfile va_profile;
+    VAProfile (*profile_parser)(AVCodecContext *avctx);
 } vaapi_profile_map[] = {
-#define MAP(c, p, v) { AV_CODEC_ID_ ## c, FF_PROFILE_ ## p, VAProfile ## v }
+#define MAP(c, p, v, ...) { AV_CODEC_ID_ ## c, FF_PROFILE_ ## p, VAProfile ## v, __VA_ARGS__ }
     MAP(MPEG2VIDEO,  MPEG2_SIMPLE,    MPEG2Simple ),
     MAP(MPEG2VIDEO,  MPEG2_MAIN,      MPEG2Main   ),
     MAP(H263,        UNKNOWN,         H263Baseline),
@@ -380,6 +386,12 @@
 #if VA_CHECK_VERSION(0, 37, 0)
     MAP(HEVC,        HEVC_MAIN,       HEVCMain    ),
     MAP(HEVC,        HEVC_MAIN_10,    HEVCMain10  ),
+    MAP(HEVC,        HEVC_MAIN_STILL_PICTURE,
+                                      HEVCMain    ),
+#endif
+#if VA_CHECK_VERSION(1, 2, 0) && CONFIG_HEVC_VAAPI_HWACCEL
+    MAP(HEVC,        HEVC_REXT,       None,
+                 ff_vaapi_parse_hevc_rext_profile ),
 #endif
     MAP(MJPEG,       MJPEG_HUFFMAN_BASELINE_DCT,
                                       JPEGBaseline),
@@ -415,8 +427,8 @@
     VAStatus vas;
     int err, i, j;
     const AVCodecDescriptor *codec_desc;
-    VAProfile *profile_list = NULL, matched_va_profile;
-    int profile_count, exact_match, matched_ff_profile;
+    VAProfile *profile_list = NULL, matched_va_profile, va_profile;
+    int profile_count, exact_match, matched_ff_profile, codec_profile;
 
     AVHWDeviceContext    *device = (AVHWDeviceContext*)device_ref->data;
     AVVAAPIDeviceContext *hwctx = device->hwctx;
@@ -454,15 +466,21 @@
         if (avctx->profile == vaapi_profile_map[i].codec_profile ||
             vaapi_profile_map[i].codec_profile == FF_PROFILE_UNKNOWN)
             profile_match = 1;
+
+        va_profile = vaapi_profile_map[i].profile_parser ?
+                     vaapi_profile_map[i].profile_parser(avctx) :
+                     vaapi_profile_map[i].va_profile;
+        codec_profile = vaapi_profile_map[i].codec_profile;
+
         for (j = 0; j < profile_count; j++) {
-            if (vaapi_profile_map[i].va_profile == profile_list[j]) {
+            if (va_profile == profile_list[j]) {
                 exact_match = profile_match;
                 break;
             }
         }
         if (j < profile_count) {
-            matched_va_profile = vaapi_profile_map[i].va_profile;
-            matched_ff_profile = vaapi_profile_map[i].codec_profile;
+            matched_va_profile = va_profile;
+            matched_ff_profile = codec_profile;
             if (exact_match)
                 break;
         }
diff --git a/libavcodec/vaapi_encode.c b/libavcodec/vaapi_encode.c
index 2c34cdc..8ff720e 100644
--- a/libavcodec/vaapi_encode.c
+++ b/libavcodec/vaapi_encode.c
@@ -103,6 +103,29 @@
     return 0;
 }
 
+static int vaapi_encode_make_misc_param_buffer(AVCodecContext *avctx,
+                                               VAAPIEncodePicture *pic,
+                                               int type,
+                                               const void *data, size_t len)
+{
+    // Construct the buffer on the stack - 1KB is much larger than any
+    // current misc parameter buffer type (the largest is EncQuality at
+    // 224 bytes).
+    uint8_t buffer[1024];
+    VAEncMiscParameterBuffer header = {
+        .type = type,
+    };
+    size_t buffer_size = sizeof(header) + len;
+    av_assert0(buffer_size <= sizeof(buffer));
+
+    memcpy(buffer, &header, sizeof(header));
+    memcpy(buffer + sizeof(header), data, len);
+
+    return vaapi_encode_make_param_buffer(avctx, pic,
+                                          VAEncMiscParameterBufferType,
+                                          buffer, buffer_size);
+}
+
 static int vaapi_encode_wait(AVCodecContext *avctx,
                              VAAPIEncodePicture *pic)
 {
@@ -143,6 +166,7 @@
     int err, i;
     char data[MAX_PARAM_BUFFER_SIZE];
     size_t bit_len;
+    av_unused AVFrameSideData *sd;
 
     av_log(avctx, AV_LOG_DEBUG, "Issuing encode for pic %"PRId64"/%"PRId64" "
            "as type %s.\n", pic->display_order, pic->encode_order,
@@ -158,16 +182,10 @@
         av_log(avctx, AV_LOG_DEBUG, ".\n");
     }
 
-    av_assert0(pic->input_available && !pic->encode_issued);
+    av_assert0(!pic->encode_issued);
     for (i = 0; i < pic->nb_refs; i++) {
         av_assert0(pic->refs[i]);
-        // If we are serialised then the references must have already
-        // completed.  If not, they must have been issued but need not
-        // have completed yet.
-        if (ctx->issue_mode == ISSUE_MODE_SERIALISE_EVERYTHING)
-            av_assert0(pic->refs[i]->encode_complete);
-        else
-            av_assert0(pic->refs[i]->encode_issued);
+        av_assert0(pic->refs[i]->encode_issued);
     }
 
     av_log(avctx, AV_LOG_DEBUG, "Input surface is %#x.\n", pic->input_surface);
@@ -218,10 +236,10 @@
 
     if (pic->type == PICTURE_TYPE_IDR) {
         for (i = 0; i < ctx->nb_global_params; i++) {
-            err = vaapi_encode_make_param_buffer(avctx, pic,
-                                                 VAEncMiscParameterBufferType,
-                                                 (char*)ctx->global_params[i],
-                                                 ctx->global_params_size[i]);
+            err = vaapi_encode_make_misc_param_buffer(avctx, pic,
+                                                      ctx->global_params_type[i],
+                                                      ctx->global_params[i],
+                                                      ctx->global_params_size[i]);
             if (err < 0)
                 goto fail;
         }
@@ -319,16 +337,60 @@
         }
     }
 
+    if (pic->nb_slices == 0)
+        pic->nb_slices = ctx->nb_slices;
     if (pic->nb_slices > 0) {
+        int rounding;
+
         pic->slices = av_mallocz_array(pic->nb_slices, sizeof(*pic->slices));
         if (!pic->slices) {
             err = AVERROR(ENOMEM);
             goto fail;
         }
+
+        for (i = 0; i < pic->nb_slices; i++)
+            pic->slices[i].row_size = ctx->slice_size;
+
+        rounding = ctx->slice_block_rows - ctx->nb_slices * ctx->slice_size;
+        if (rounding > 0) {
+            // Place rounding error at top and bottom of frame.
+            av_assert0(rounding < pic->nb_slices);
+            // Some Intel drivers contain a bug where the encoder will fail
+            // if the last slice is smaller than the one before it.  Since
+            // that's straightforward to avoid here, just do so.
+            if (rounding <= 2) {
+                for (i = 0; i < rounding; i++)
+                    ++pic->slices[i].row_size;
+            } else {
+                for (i = 0; i < (rounding + 1) / 2; i++)
+                    ++pic->slices[pic->nb_slices - i - 1].row_size;
+                for (i = 0; i < rounding / 2; i++)
+                    ++pic->slices[i].row_size;
+            }
+        } else if (rounding < 0) {
+            // Remove rounding error from last slice only.
+            av_assert0(rounding < ctx->slice_size);
+            pic->slices[pic->nb_slices - 1].row_size += rounding;
+        }
     }
     for (i = 0; i < pic->nb_slices; i++) {
         slice = &pic->slices[i];
         slice->index = i;
+        if (i == 0) {
+            slice->row_start   = 0;
+            slice->block_start = 0;
+        } else {
+            const VAAPIEncodeSlice *prev = &pic->slices[i - 1];
+            slice->row_start   = prev->row_start   + prev->row_size;
+            slice->block_start = prev->block_start + prev->block_size;
+        }
+        slice->block_size  = slice->row_size * ctx->slice_block_cols;
+
+        av_log(avctx, AV_LOG_DEBUG, "Slice %d: %d-%d (%d rows), "
+               "%d-%d (%d blocks).\n", i, slice->row_start,
+               slice->row_start + slice->row_size - 1, slice->row_size,
+               slice->block_start, slice->block_start + slice->block_size - 1,
+               slice->block_size);
 
         if (ctx->codec->slice_params_size > 0) {
             slice->codec_slice_params = av_mallocz(ctx->codec->slice_params_size);
@@ -374,6 +436,71 @@
         }
     }
 
+#if VA_CHECK_VERSION(1, 0, 0)
+    sd = av_frame_get_side_data(pic->input_image,
+                                AV_FRAME_DATA_REGIONS_OF_INTEREST);
+    if (sd && ctx->roi_allowed) {
+        const AVRegionOfInterest *roi;
+        uint32_t roi_size;
+        VAEncMiscParameterBufferROI param_roi;
+        int nb_roi, i, v;
+
+        roi = (const AVRegionOfInterest*)sd->data;
+        roi_size = roi->self_size;
+        av_assert0(roi_size && sd->size % roi_size == 0);
+        nb_roi = sd->size / roi_size;
+        if (nb_roi > ctx->roi_max_regions) {
+            if (!ctx->roi_warned) {
+                av_log(avctx, AV_LOG_WARNING, "More ROIs set than "
+                       "supported by driver (%d > %d).\n",
+                       nb_roi, ctx->roi_max_regions);
+                ctx->roi_warned = 1;
+            }
+            nb_roi = ctx->roi_max_regions;
+        }
+
+        pic->roi = av_mallocz_array(nb_roi, sizeof(*pic->roi));
+        if (!pic->roi) {
+            err = AVERROR(ENOMEM);
+            goto fail;
+        }
+        // For overlapping regions, the first in the array takes priority.
+        for (i = 0; i < nb_roi; i++) {
+            roi = (const AVRegionOfInterest*)(sd->data + roi_size * i);
+
+            av_assert0(roi->qoffset.den != 0);
+            v = roi->qoffset.num * ctx->roi_quant_range / roi->qoffset.den;
+            av_log(avctx, AV_LOG_DEBUG, "ROI: (%d,%d)-(%d,%d) -> %+d.\n",
+                   roi->top, roi->left, roi->bottom, roi->right, v);
+
+            pic->roi[i] = (VAEncROI) {
+                .roi_rectangle = {
+                    .x      = roi->left,
+                    .y      = roi->top,
+                    .width  = roi->right  - roi->left,
+                    .height = roi->bottom - roi->top,
+                },
+                .roi_value = av_clip_int8(v),
+            };
+        }
+
+        param_roi = (VAEncMiscParameterBufferROI) {
+            .num_roi      = nb_roi,
+            .max_delta_qp = INT8_MAX,
+            .min_delta_qp = INT8_MIN,
+            .roi          = pic->roi,
+            .roi_flags.bits.roi_value_is_qp_delta = 1,
+        };
+
+        err = vaapi_encode_make_misc_param_buffer(avctx, pic,
+                                                  VAEncMiscParameterTypeROI,
+                                                  &param_roi,
+                                                  sizeof(param_roi));
+        if (err < 0)
+            goto fail;
+    }
+#endif
+
     vas = vaBeginPicture(ctx->hwctx->display, ctx->va_context,
                          pic->input_surface);
     if (vas != VA_STATUS_SUCCESS) {
@@ -422,10 +549,7 @@
 
     pic->encode_issued = 1;
 
-    if (ctx->issue_mode == ISSUE_MODE_SERIALISE_EVERYTHING)
-        return vaapi_encode_wait(avctx, pic);
-    else
-        return 0;
+    return 0;
 
 fail_with_picture:
     vaEndPicture(ctx->hwctx->display, ctx->va_context);
@@ -442,6 +566,7 @@
     av_freep(&pic->codec_picture_params);
     av_freep(&pic->param_buffers);
     av_freep(&pic->slices);
+    av_freep(&pic->roi);
     av_frame_free(&pic->recon_image);
     av_buffer_unref(&pic->output_buffer_ref);
     pic->output_buffer = VA_INVALID_ID;
@@ -454,6 +579,8 @@
     VAAPIEncodeContext *ctx = avctx->priv_data;
     VACodedBufferSegment *buf_list, *buf;
     VAStatus vas;
+    int total_size = 0;
+    uint8_t *ptr;
     int err;
 
     err = vaapi_encode_wait(avctx, pic);
@@ -470,15 +597,21 @@
         goto fail;
     }
 
+    for (buf = buf_list; buf; buf = buf->next)
+        total_size += buf->size;
+
+    err = av_new_packet(pkt, total_size);
+    ptr = pkt->data;
+
+    if (err < 0)
+        goto fail_mapped;
+
     for (buf = buf_list; buf; buf = buf->next) {
         av_log(avctx, AV_LOG_DEBUG, "Output buffer: %u bytes "
                "(status %08x).\n", buf->size, buf->status);
 
-        err = av_new_packet(pkt, buf->size);
-        if (err < 0)
-            goto fail_mapped;
-
-        memcpy(pkt->data, buf->buf, buf->size);
+        memcpy(ptr, buf->buf, buf->size);
+        ptr += buf->size;
     }
 
     if (pic->type == PICTURE_TYPE_IDR)
@@ -526,14 +659,23 @@
     return 0;
 }
 
-static VAAPIEncodePicture *vaapi_encode_alloc(void)
+static VAAPIEncodePicture *vaapi_encode_alloc(AVCodecContext *avctx)
 {
+    VAAPIEncodeContext *ctx = avctx->priv_data;
     VAAPIEncodePicture *pic;
 
     pic = av_mallocz(sizeof(*pic));
     if (!pic)
         return NULL;
 
+    if (ctx->codec->picture_priv_data_size > 0) {
+        pic->priv_data = av_mallocz(ctx->codec->picture_priv_data_size);
+        if (!pic->priv_data) {
+            av_freep(&pic);
+            return NULL;
+        }
+    }
+
     pic->input_surface = VA_INVALID_ID;
     pic->recon_surface = VA_INVALID_ID;
     pic->output_buffer = VA_INVALID_ID;
@@ -567,321 +709,367 @@
 
     av_freep(&pic->priv_data);
     av_freep(&pic->codec_picture_params);
+    av_freep(&pic->roi);
 
     av_free(pic);
 
     return 0;
 }
 
-static int vaapi_encode_step(AVCodecContext *avctx,
-                             VAAPIEncodePicture *target)
+static void vaapi_encode_add_ref(AVCodecContext *avctx,
+                                 VAAPIEncodePicture *pic,
+                                 VAAPIEncodePicture *target,
+                                 int is_ref, int in_dpb, int prev)
 {
-    VAAPIEncodeContext *ctx = avctx->priv_data;
-    VAAPIEncodePicture *pic;
-    int i, err;
+    int refs = 0;
 
-    if (ctx->issue_mode == ISSUE_MODE_SERIALISE_EVERYTHING ||
-        ctx->issue_mode == ISSUE_MODE_MINIMISE_LATENCY) {
-        // These two modes are equivalent, except that we wait for
-        // immediate completion on each operation if serialised.
-
-        if (!target) {
-            // No target, nothing to do yet.
-            return 0;
-        }
-
-        if (target->encode_complete) {
-            // Already done.
-            return 0;
-        }
-
-        pic = target;
-        for (i = 0; i < pic->nb_refs; i++) {
-            if (!pic->refs[i]->encode_complete) {
-                err = vaapi_encode_step(avctx, pic->refs[i]);
-                if (err < 0)
-                    return err;
-            }
-        }
-
-        err = vaapi_encode_issue(avctx, pic);
-        if (err < 0)
-            return err;
-
-    } else if (ctx->issue_mode == ISSUE_MODE_MAXIMISE_THROUGHPUT) {
-        int activity;
-
-        // Run through the list of all available pictures repeatedly
-        // and issue the first one found which has all dependencies
-        // available (including previously-issued but not necessarily
-        // completed pictures).
-        do {
-            activity = 0;
-            for (pic = ctx->pic_start; pic; pic = pic->next) {
-                if (!pic->input_available || pic->encode_issued)
-                    continue;
-                for (i = 0; i < pic->nb_refs; i++) {
-                    if (!pic->refs[i]->encode_issued)
-                        break;
-                }
-                if (i < pic->nb_refs)
-                    continue;
-                err = vaapi_encode_issue(avctx, pic);
-                if (err < 0)
-                    return err;
-                activity = 1;
-                // Start again from the beginning of the list,
-                // because issuing this picture may have satisfied
-                // forward dependencies of earlier ones.
-                break;
-            }
-        } while(activity);
-
-        // If we had a defined target for this step then it will
-        // always have been issued by now.
-        if (target) {
-            av_assert0(target->encode_issued && "broken dependencies?");
-        }
-
-    } else {
-        av_assert0(0);
+    if (is_ref) {
+        av_assert0(pic != target);
+        av_assert0(pic->nb_refs < MAX_PICTURE_REFERENCES);
+        pic->refs[pic->nb_refs++] = target;
+        ++refs;
     }
 
-    return 0;
+    if (in_dpb) {
+        av_assert0(pic->nb_dpb_pics < MAX_DPB_SIZE);
+        pic->dpb[pic->nb_dpb_pics++] = target;
+        ++refs;
+    }
+
+    if (prev) {
+        av_assert0(!pic->prev);
+        pic->prev = target;
+        ++refs;
+    }
+
+    target->ref_count[0] += refs;
+    target->ref_count[1] += refs;
 }
 
-static int vaapi_encode_get_next(AVCodecContext *avctx,
-                                 VAAPIEncodePicture **pic_out)
+static void vaapi_encode_remove_refs(AVCodecContext *avctx,
+                                     VAAPIEncodePicture *pic,
+                                     int level)
 {
-    VAAPIEncodeContext *ctx = avctx->priv_data;
-    VAAPIEncodePicture *start, *end, *pic;
     int i;
 
-    for (pic = ctx->pic_start; pic; pic = pic->next) {
-        if (pic->next)
-            av_assert0(pic->display_order + 1 == pic->next->display_order);
-        if (pic->display_order == ctx->input_order) {
-            *pic_out = pic;
-            return 0;
-        }
+    if (pic->ref_removed[level])
+        return;
+
+    for (i = 0; i < pic->nb_refs; i++) {
+        av_assert0(pic->refs[i]);
+        --pic->refs[i]->ref_count[level];
+        av_assert0(pic->refs[i]->ref_count[level] >= 0);
     }
 
-    pic = vaapi_encode_alloc();
-    if (!pic)
-        return AVERROR(ENOMEM);
-
-    if (ctx->input_order == 0 || ctx->force_idr ||
-        ctx->gop_counter >= ctx->gop_size) {
-        pic->type = PICTURE_TYPE_IDR;
-        ctx->force_idr = 0;
-        ctx->gop_counter = 1;
-        ctx->p_counter = 0;
-    } else if (ctx->p_counter >= ctx->p_per_i) {
-        pic->type = PICTURE_TYPE_I;
-        ++ctx->gop_counter;
-        ctx->p_counter = 0;
-    } else {
-        pic->type = PICTURE_TYPE_P;
-        pic->refs[0] = ctx->pic_end;
-        pic->nb_refs = 1;
-        ++ctx->gop_counter;
-        ++ctx->p_counter;
-    }
-    start = end = pic;
-
-    if (pic->type != PICTURE_TYPE_IDR) {
-        // If that was not an IDR frame, add B-frames display-before and
-        // encode-after it, but not exceeding the GOP size.
-
-        for (i = 0; i < ctx->b_per_p &&
-             ctx->gop_counter < ctx->gop_size; i++) {
-            pic = vaapi_encode_alloc();
-            if (!pic)
-                goto fail;
-
-            pic->type = PICTURE_TYPE_B;
-            pic->refs[0] = ctx->pic_end;
-            pic->refs[1] = end;
-            pic->nb_refs = 2;
-
-            pic->next = start;
-            pic->display_order = ctx->input_order + ctx->b_per_p - i - 1;
-            pic->encode_order  = pic->display_order + 1;
-            start = pic;
-
-            ++ctx->gop_counter;
-        }
+    for (i = 0; i < pic->nb_dpb_pics; i++) {
+        av_assert0(pic->dpb[i]);
+        --pic->dpb[i]->ref_count[level];
+        av_assert0(pic->dpb[i]->ref_count[level] >= 0);
     }
 
-    if (ctx->input_order == 0) {
-        pic->display_order = 0;
-        pic->encode_order  = 0;
-
-        ctx->pic_start = ctx->pic_end = pic;
-
-    } else {
-        for (i = 0, pic = start; pic; i++, pic = pic->next) {
-            pic->display_order = ctx->input_order + i;
-            if (end->type == PICTURE_TYPE_IDR)
-                pic->encode_order = ctx->input_order + i;
-            else if (pic == end)
-                pic->encode_order = ctx->input_order;
-            else
-                pic->encode_order = ctx->input_order + i + 1;
-        }
-
-        av_assert0(ctx->pic_end);
-        ctx->pic_end->next = start;
-        ctx->pic_end = end;
+    av_assert0(pic->prev || pic->type == PICTURE_TYPE_IDR);
+    if (pic->prev) {
+        --pic->prev->ref_count[level];
+        av_assert0(pic->prev->ref_count[level] >= 0);
     }
-    *pic_out = start;
 
-    av_log(avctx, AV_LOG_DEBUG, "Pictures:");
-    for (pic = ctx->pic_start; pic; pic = pic->next) {
-        av_log(avctx, AV_LOG_DEBUG, " %s (%"PRId64"/%"PRId64")",
-               picture_type_name[pic->type],
-               pic->display_order, pic->encode_order);
-    }
-    av_log(avctx, AV_LOG_DEBUG, "\n");
-
-    return 0;
-
-fail:
-    while (start) {
-        pic = start->next;
-        vaapi_encode_free(avctx, start);
-        start = pic;
-    }
-    return AVERROR(ENOMEM);
+    pic->ref_removed[level] = 1;
 }
 
-static int vaapi_encode_truncate_gop(AVCodecContext *avctx)
+static void vaapi_encode_set_b_pictures(AVCodecContext *avctx,
+                                        VAAPIEncodePicture *start,
+                                        VAAPIEncodePicture *end,
+                                        VAAPIEncodePicture *prev,
+                                        int current_depth,
+                                        VAAPIEncodePicture **last)
 {
     VAAPIEncodeContext *ctx = avctx->priv_data;
-    VAAPIEncodePicture *pic, *last_pic, *next;
+    VAAPIEncodePicture *pic, *next, *ref;
+    int i, len;
 
-    av_assert0(!ctx->pic_start || ctx->pic_start->input_available);
+    av_assert0(start && end && start != end && start->next != end);
 
-    // Find the last picture we actually have input for.
+    // If we are at the maximum depth then encode all pictures as
+    // non-referenced B-pictures.  Also do this if there is exactly one
+    // picture left, since there will be nothing to reference it.
+    if (current_depth == ctx->max_b_depth || start->next->next == end) {
+        for (pic = start->next; pic; pic = pic->next) {
+            if (pic == end)
+                break;
+            pic->type    = PICTURE_TYPE_B;
+            pic->b_depth = current_depth;
+
+            vaapi_encode_add_ref(avctx, pic, start, 1, 1, 0);
+            vaapi_encode_add_ref(avctx, pic, end,   1, 1, 0);
+            vaapi_encode_add_ref(avctx, pic, prev,  0, 0, 1);
+
+            for (ref = end->refs[1]; ref; ref = ref->refs[1])
+                vaapi_encode_add_ref(avctx, pic, ref, 0, 1, 0);
+        }
+        *last = prev;
+
+    } else {
+        // Split the current list at the midpoint with a referenced
+        // B-picture, then descend into each side separately.
+        len = 0;
+        for (pic = start->next; pic != end; pic = pic->next)
+            ++len;
+        for (pic = start->next, i = 1; 2 * i < len; pic = pic->next, i++);
+
+        pic->type    = PICTURE_TYPE_B;
+        pic->b_depth = current_depth;
+
+        pic->is_reference = 1;
+
+        vaapi_encode_add_ref(avctx, pic, pic,   0, 1, 0);
+        vaapi_encode_add_ref(avctx, pic, start, 1, 1, 0);
+        vaapi_encode_add_ref(avctx, pic, end,   1, 1, 0);
+        vaapi_encode_add_ref(avctx, pic, prev,  0, 0, 1);
+
+        for (ref = end->refs[1]; ref; ref = ref->refs[1])
+            vaapi_encode_add_ref(avctx, pic, ref, 0, 1, 0);
+
+        if (i > 1)
+            vaapi_encode_set_b_pictures(avctx, start, pic, pic,
+                                        current_depth + 1, &next);
+        else
+            next = pic;
+
+        vaapi_encode_set_b_pictures(avctx, pic, end, next,
+                                    current_depth + 1, last);
+    }
+}
+
+static int vaapi_encode_pick_next(AVCodecContext *avctx,
+                                  VAAPIEncodePicture **pic_out)
+{
+    VAAPIEncodeContext *ctx = avctx->priv_data;
+    VAAPIEncodePicture *pic = NULL, *next, *start;
+    int i, b_counter, closed_gop_end;
+
+    // If there are any B-frames already queued, the next one to encode
+    // is the earliest not-yet-issued frame for which all references are
+    // available.
     for (pic = ctx->pic_start; pic; pic = pic->next) {
-        if (!pic->input_available)
+        if (pic->encode_issued)
+            continue;
+        if (pic->type != PICTURE_TYPE_B)
+            continue;
+        for (i = 0; i < pic->nb_refs; i++) {
+            if (!pic->refs[i]->encode_issued)
+                break;
+        }
+        if (i == pic->nb_refs)
             break;
-        last_pic = pic;
     }
 
     if (pic) {
-        if (last_pic->type == PICTURE_TYPE_B) {
-            // Some fixing up is required.  Change the type of this
-            // picture to P, then modify preceding B references which
-            // point beyond it to point at it instead.
+        av_log(avctx, AV_LOG_DEBUG, "Pick B-picture at depth %d to "
+               "encode next.\n", pic->b_depth);
+        *pic_out = pic;
+        return 0;
+    }
 
-            last_pic->type = PICTURE_TYPE_P;
-            last_pic->encode_order = last_pic->refs[1]->encode_order;
+    // Find the B-per-Pth available picture to become the next picture
+    // on the top layer.
+    start = NULL;
+    b_counter = 0;
+    closed_gop_end = ctx->closed_gop ||
+                     ctx->idr_counter == ctx->gop_per_idr;
+    for (pic = ctx->pic_start; pic; pic = next) {
+        next = pic->next;
+        if (pic->encode_issued) {
+            start = pic;
+            continue;
+        }
+        // If the next available picture is force-IDR, encode it to start
+        // a new GOP immediately.
+        if (pic->force_idr)
+            break;
+        if (b_counter == ctx->b_per_p)
+            break;
+        // If this picture ends a closed GOP or starts a new GOP then it
+        // needs to be in the top layer.
+        if (ctx->gop_counter + b_counter + closed_gop_end >= ctx->gop_size)
+            break;
+        // If the picture after this one is force-IDR, we need to encode
+        // this one in the top layer.
+        if (next && next->force_idr)
+            break;
+        ++b_counter;
+    }
 
-            for (pic = ctx->pic_start; pic != last_pic; pic = pic->next) {
-                if (pic->type == PICTURE_TYPE_B &&
-                    pic->refs[1] == last_pic->refs[1])
-                    pic->refs[1] = last_pic;
-            }
+    // At the end of the stream the last picture must be in the top layer.
+    if (!pic && ctx->end_of_stream) {
+        --b_counter;
+        pic = ctx->pic_end;
+        if (pic->encode_issued)
+            return AVERROR_EOF;
+    }
 
-            last_pic->nb_refs = 1;
-            last_pic->refs[1] = NULL;
+    if (!pic) {
+        av_log(avctx, AV_LOG_DEBUG, "Pick nothing to encode next - "
+               "need more input for reference pictures.\n");
+        return AVERROR(EAGAIN);
+    }
+    if (ctx->input_order <= ctx->decode_delay && !ctx->end_of_stream) {
+        av_log(avctx, AV_LOG_DEBUG, "Pick nothing to encode next - "
+               "need more input for timestamps.\n");
+        return AVERROR(EAGAIN);
+    }
+
+    if (pic->force_idr) {
+        av_log(avctx, AV_LOG_DEBUG, "Pick forced IDR-picture to "
+               "encode next.\n");
+        pic->type = PICTURE_TYPE_IDR;
+        ctx->idr_counter = 1;
+        ctx->gop_counter = 1;
+
+    } else if (ctx->gop_counter + b_counter >= ctx->gop_size) {
+        if (ctx->idr_counter == ctx->gop_per_idr) {
+            av_log(avctx, AV_LOG_DEBUG, "Pick new-GOP IDR-picture to "
+                   "encode next.\n");
+            pic->type = PICTURE_TYPE_IDR;
+            ctx->idr_counter = 1;
         } else {
-            // We can use the current structure (no references point
-            // beyond the end), but there are unused pics to discard.
+            av_log(avctx, AV_LOG_DEBUG, "Pick new-GOP I-picture to "
+                   "encode next.\n");
+            pic->type = PICTURE_TYPE_I;
+            ++ctx->idr_counter;
         }
-
-        // Discard all following pics, they will never be used.
-        for (pic = last_pic->next; pic; pic = next) {
-            next = pic->next;
-            vaapi_encode_free(avctx, pic);
-        }
-
-        last_pic->next = NULL;
-        ctx->pic_end = last_pic;
+        ctx->gop_counter = 1;
 
     } else {
-        // Input is available for all pictures, so we don't need to
-        // mangle anything.
+        if (ctx->gop_counter + b_counter + closed_gop_end == ctx->gop_size) {
+            av_log(avctx, AV_LOG_DEBUG, "Pick group-end P-picture to "
+                   "encode next.\n");
+        } else {
+            av_log(avctx, AV_LOG_DEBUG, "Pick normal P-picture to "
+                   "encode next.\n");
+        }
+        pic->type = PICTURE_TYPE_P;
+        av_assert0(start);
+        ctx->gop_counter += 1 + b_counter;
     }
+    pic->is_reference = 1;
+    *pic_out = pic;
 
-    av_log(avctx, AV_LOG_DEBUG, "Pictures ending truncated GOP:");
-    for (pic = ctx->pic_start; pic; pic = pic->next) {
-        av_log(avctx, AV_LOG_DEBUG, " %s (%"PRId64"/%"PRId64")",
-               picture_type_name[pic->type],
-               pic->display_order, pic->encode_order);
+    vaapi_encode_add_ref(avctx, pic, pic, 0, 1, 0);
+    if (pic->type != PICTURE_TYPE_IDR) {
+        vaapi_encode_add_ref(avctx, pic, start,
+                             pic->type == PICTURE_TYPE_P,
+                             b_counter > 0, 0);
+        vaapi_encode_add_ref(avctx, pic, ctx->next_prev, 0, 0, 1);
     }
-    av_log(avctx, AV_LOG_DEBUG, "\n");
+    if (ctx->next_prev)
+        --ctx->next_prev->ref_count[0];
 
+    if (b_counter > 0) {
+        vaapi_encode_set_b_pictures(avctx, start, pic, pic, 1,
+                                    &ctx->next_prev);
+    } else {
+        ctx->next_prev = pic;
+    }
+    ++ctx->next_prev->ref_count[0];
     return 0;
 }
 
 static int vaapi_encode_clear_old(AVCodecContext *avctx)
 {
     VAAPIEncodeContext *ctx = avctx->priv_data;
-    VAAPIEncodePicture *pic, *old;
-    int i;
+    VAAPIEncodePicture *pic, *prev, *next;
 
-    while (ctx->pic_start != ctx->pic_end) {
-        old = ctx->pic_start;
-        if (old->encode_order > ctx->output_order)
-            break;
+    av_assert0(ctx->pic_start);
 
-        for (pic = old->next; pic; pic = pic->next) {
-            if (pic->encode_complete)
-                continue;
-            for (i = 0; i < pic->nb_refs; i++) {
-                if (pic->refs[i] == old) {
-                    // We still need this picture because it's referred to
-                    // directly by a later one, so it and all following
-                    // pictures have to stay.
-                    return 0;
-                }
-            }
+    // Remove direct references once each picture is complete.
+    for (pic = ctx->pic_start; pic; pic = pic->next) {
+        if (pic->encode_complete && pic->next)
+            vaapi_encode_remove_refs(avctx, pic, 0);
+    }
+
+    // Remove indirect references once a picture has no direct references.
+    for (pic = ctx->pic_start; pic; pic = pic->next) {
+        if (pic->encode_complete && pic->ref_count[0] == 0)
+            vaapi_encode_remove_refs(avctx, pic, 1);
+    }
+
+    // Clear out all complete pictures with no remaining references.
+    prev = NULL;
+    for (pic = ctx->pic_start; pic; pic = next) {
+        next = pic->next;
+        if (pic->encode_complete && pic->ref_count[1] == 0) {
+            av_assert0(pic->ref_removed[0] && pic->ref_removed[1]);
+            if (prev)
+                prev->next = next;
+            else
+                ctx->pic_start = next;
+            vaapi_encode_free(avctx, pic);
+        } else {
+            prev = pic;
         }
-
-        pic = ctx->pic_start;
-        ctx->pic_start = pic->next;
-        vaapi_encode_free(avctx, pic);
     }
 
     return 0;
 }
 
-int ff_vaapi_encode2(AVCodecContext *avctx, AVPacket *pkt,
-                     const AVFrame *input_image, int *got_packet)
+static int vaapi_encode_check_frame(AVCodecContext *avctx,
+                                    const AVFrame *frame)
+{
+    VAAPIEncodeContext *ctx = avctx->priv_data;
+
+    if ((frame->crop_top  || frame->crop_bottom ||
+         frame->crop_left || frame->crop_right) && !ctx->crop_warned) {
+        av_log(avctx, AV_LOG_WARNING, "Cropping information on input "
+               "frames ignored due to lack of API support.\n");
+        ctx->crop_warned = 1;
+    }
+
+    if (!ctx->roi_allowed) {
+        AVFrameSideData *sd =
+            av_frame_get_side_data(frame, AV_FRAME_DATA_REGIONS_OF_INTEREST);
+
+        if (sd && !ctx->roi_warned) {
+            av_log(avctx, AV_LOG_WARNING, "ROI side data on input "
+                   "frames ignored due to lack of driver support.\n");
+            ctx->roi_warned = 1;
+        }
+    }
+
+    return 0;
+}
+
+int ff_vaapi_encode_send_frame(AVCodecContext *avctx, const AVFrame *frame)
 {
     VAAPIEncodeContext *ctx = avctx->priv_data;
     VAAPIEncodePicture *pic;
     int err;
 
-    if (input_image) {
-        av_log(avctx, AV_LOG_DEBUG, "Encode frame: %ux%u (%"PRId64").\n",
-               input_image->width, input_image->height, input_image->pts);
+    if (frame) {
+        av_log(avctx, AV_LOG_DEBUG, "Input frame: %ux%u (%"PRId64").\n",
+               frame->width, frame->height, frame->pts);
 
-        if (input_image->pict_type == AV_PICTURE_TYPE_I) {
-            err = vaapi_encode_truncate_gop(avctx);
-            if (err < 0)
-                goto fail;
-            ctx->force_idr = 1;
-        }
-
-        err = vaapi_encode_get_next(avctx, &pic);
-        if (err) {
-            av_log(avctx, AV_LOG_ERROR, "Input setup failed: %d.\n", err);
+        err = vaapi_encode_check_frame(avctx, frame);
+        if (err < 0)
             return err;
-        }
+
+        pic = vaapi_encode_alloc(avctx);
+        if (!pic)
+            return AVERROR(ENOMEM);
 
         pic->input_image = av_frame_alloc();
         if (!pic->input_image) {
             err = AVERROR(ENOMEM);
             goto fail;
         }
-        err = av_frame_ref(pic->input_image, input_image);
+        err = av_frame_ref(pic->input_image, frame);
         if (err < 0)
             goto fail;
-        pic->input_surface = (VASurfaceID)(uintptr_t)input_image->data[3];
-        pic->pts = input_image->pts;
+
+        if (ctx->input_order == 0 || frame->pict_type == AV_PICTURE_TYPE_I)
+            pic->force_idr = 1;
+
+        pic->input_surface = (VASurfaceID)(uintptr_t)frame->data[3];
+        pic->pts = frame->pts;
 
         if (ctx->input_order == 0)
             ctx->first_pts = pic->pts;
@@ -890,82 +1078,95 @@
         if (ctx->output_delay > 0)
             ctx->ts_ring[ctx->input_order % (3 * ctx->output_delay)] = pic->pts;
 
-        pic->input_available = 1;
+        pic->display_order = ctx->input_order;
+        ++ctx->input_order;
 
-    } else {
-        if (!ctx->end_of_stream) {
-            err = vaapi_encode_truncate_gop(avctx);
-            if (err < 0)
-                goto fail;
-            ctx->end_of_stream = 1;
-        }
-    }
-
-    ++ctx->input_order;
-    ++ctx->output_order;
-    av_assert0(ctx->output_order + ctx->output_delay + 1 == ctx->input_order);
-
-    for (pic = ctx->pic_start; pic; pic = pic->next)
-        if (pic->encode_order == ctx->output_order)
-            break;
-
-    // pic can be null here if we don't have a specific target in this
-    // iteration.  We might still issue encodes if things can be overlapped,
-    // even though we don't intend to output anything.
-
-    err = vaapi_encode_step(avctx, pic);
-    if (err < 0) {
-        av_log(avctx, AV_LOG_ERROR, "Encode failed: %d.\n", err);
-        goto fail;
-    }
-
-    if (!pic) {
-        *got_packet = 0;
-    } else {
-        err = vaapi_encode_output(avctx, pic, pkt);
-        if (err < 0) {
-            av_log(avctx, AV_LOG_ERROR, "Output failed: %d.\n", err);
-            goto fail;
-        }
-
-        if (ctx->output_delay == 0) {
-            pkt->dts = pkt->pts;
-        } else if (ctx->output_order < ctx->decode_delay) {
-            if (ctx->ts_ring[ctx->output_order] < INT64_MIN + ctx->dts_pts_diff)
-                pkt->dts = INT64_MIN;
-            else
-                pkt->dts = ctx->ts_ring[ctx->output_order] - ctx->dts_pts_diff;
+        if (ctx->pic_start) {
+            ctx->pic_end->next = pic;
+            ctx->pic_end       = pic;
         } else {
-            pkt->dts = ctx->ts_ring[(ctx->output_order - ctx->decode_delay) %
-                                    (3 * ctx->output_delay)];
+            ctx->pic_start     = pic;
+            ctx->pic_end       = pic;
         }
 
-        *got_packet = 1;
-    }
+    } else {
+        ctx->end_of_stream = 1;
 
-    err = vaapi_encode_clear_old(avctx);
-    if (err < 0) {
-        av_log(avctx, AV_LOG_ERROR, "List clearing failed: %d.\n", err);
-        goto fail;
+        // Fix timestamps if we hit end-of-stream before the initial decode
+        // delay has elapsed.
+        if (ctx->input_order < ctx->decode_delay)
+            ctx->dts_pts_diff = ctx->pic_end->pts - ctx->first_pts;
     }
 
     return 0;
 
 fail:
-    // Unclear what to clean up on failure.  There are probably some things we
-    // could do usefully clean up here, but for now just leave them for uninit()
-    // to do instead.
+    vaapi_encode_free(avctx, pic);
     return err;
 }
 
-static av_cold void vaapi_encode_add_global_param(AVCodecContext *avctx,
-                                                  VAEncMiscParameterBuffer *buffer,
-                                                  size_t size)
+int ff_vaapi_encode_receive_packet(AVCodecContext *avctx, AVPacket *pkt)
+{
+    VAAPIEncodeContext *ctx = avctx->priv_data;
+    VAAPIEncodePicture *pic;
+    int err;
+
+    if (!ctx->pic_start) {
+        if (ctx->end_of_stream)
+            return AVERROR_EOF;
+        else
+            return AVERROR(EAGAIN);
+    }
+
+    pic = NULL;
+    err = vaapi_encode_pick_next(avctx, &pic);
+    if (err < 0)
+        return err;
+    av_assert0(pic);
+
+    pic->encode_order = ctx->encode_order++;
+
+    err = vaapi_encode_issue(avctx, pic);
+    if (err < 0) {
+        av_log(avctx, AV_LOG_ERROR, "Encode failed: %d.\n", err);
+        return err;
+    }
+
+    err = vaapi_encode_output(avctx, pic, pkt);
+    if (err < 0) {
+        av_log(avctx, AV_LOG_ERROR, "Output failed: %d.\n", err);
+        return err;
+    }
+
+    if (ctx->output_delay == 0) {
+        pkt->dts = pkt->pts;
+    } else if (pic->encode_order < ctx->decode_delay) {
+        if (ctx->ts_ring[pic->encode_order] < INT64_MIN + ctx->dts_pts_diff)
+            pkt->dts = INT64_MIN;
+        else
+            pkt->dts = ctx->ts_ring[pic->encode_order] - ctx->dts_pts_diff;
+    } else {
+        pkt->dts = ctx->ts_ring[(pic->encode_order - ctx->decode_delay) %
+                                (3 * ctx->output_delay)];
+    }
+    av_log(avctx, AV_LOG_DEBUG, "Output packet: pts %"PRId64" dts %"PRId64".\n",
+           pkt->pts, pkt->dts);
+
+    ctx->output_order = pic->encode_order;
+    vaapi_encode_clear_old(avctx);
+
+    return 0;
+}
+
+
+static av_cold void vaapi_encode_add_global_param(AVCodecContext *avctx, int type,
+                                                  void *buffer, size_t size)
 {
     VAAPIEncodeContext *ctx = avctx->priv_data;
 
     av_assert0(ctx->nb_global_params < MAX_GLOBAL_PARAMS);
 
+    ctx->global_params_type[ctx->nb_global_params] = type;
     ctx->global_params     [ctx->nb_global_params] = buffer;
     ctx->global_params_size[ctx->nb_global_params] = size;
 
@@ -1091,8 +1292,9 @@
                 break;
         }
         if (j >= n) {
-            av_log(avctx, AV_LOG_VERBOSE, "Matching profile %d is "
-                   "not supported by driver.\n", profile->va_profile);
+            av_log(avctx, AV_LOG_VERBOSE, "Compatible profile %s (%d) "
+                   "is not supported by driver.\n", profile_string,
+                   profile->va_profile);
             continue;
         }
 
@@ -1206,17 +1408,42 @@
     return err;
 }
 
+static const VAAPIEncodeRCMode vaapi_encode_rc_modes[] = {
+    //                                  Bitrate   Quality
+    //                                     | Maxrate | HRD/VBV
+    { 0 }, //                              |    |    |    |
+    { RC_MODE_CQP,  "CQP",  1, VA_RC_CQP,  0,   0,   1,   0 },
+    { RC_MODE_CBR,  "CBR",  1, VA_RC_CBR,  1,   0,   0,   1 },
+    { RC_MODE_VBR,  "VBR",  1, VA_RC_VBR,  1,   1,   0,   1 },
+#if VA_CHECK_VERSION(1, 1, 0)
+    { RC_MODE_ICQ,  "ICQ",  1, VA_RC_ICQ,  0,   0,   1,   0 },
+#else
+    { RC_MODE_ICQ,  "ICQ",  0 },
+#endif
+#if VA_CHECK_VERSION(1, 3, 0)
+    { RC_MODE_QVBR, "QVBR", 1, VA_RC_QVBR, 1,   1,   1,   1 },
+    { RC_MODE_AVBR, "AVBR", 0, VA_RC_AVBR, 1,   0,   0,   0 },
+#else
+    { RC_MODE_QVBR, "QVBR", 0 },
+    { RC_MODE_AVBR, "AVBR", 0 },
+#endif
+};
+
 static av_cold int vaapi_encode_init_rate_control(AVCodecContext *avctx)
 {
     VAAPIEncodeContext *ctx = avctx->priv_data;
+    uint32_t supported_va_rc_modes;
+    const VAAPIEncodeRCMode *rc_mode;
     int64_t rc_bits_per_second;
     int     rc_target_percentage;
     int     rc_window_size;
+    int     rc_quality;
     int64_t hrd_buffer_size;
     int64_t hrd_initial_buffer_fullness;
     int fr_num, fr_den;
     VAConfigAttrib rc_attr = { VAConfigAttribRateControl };
     VAStatus vas;
+    char supported_rc_modes_string[64];
 
     vas = vaGetConfigAttributes(ctx->hwctx->display,
                                 ctx->va_profile, ctx->va_entrypoint,
@@ -1226,118 +1453,213 @@
                "config attribute: %d (%s).\n", vas, vaErrorStr(vas));
         return AVERROR_EXTERNAL;
     }
-
     if (rc_attr.value == VA_ATTRIB_NOT_SUPPORTED) {
         av_log(avctx, AV_LOG_VERBOSE, "Driver does not report any "
-               "supported rate control modes: assuming constant-quality.\n");
-        ctx->va_rc_mode = VA_RC_CQP;
-        return 0;
-    }
-    if (avctx->flags & AV_CODEC_FLAG_QSCALE ||
-        avctx->bit_rate <= 0) {
-        if (rc_attr.value & VA_RC_CQP) {
-            av_log(avctx, AV_LOG_VERBOSE, "Using constant-quality mode.\n");
-            ctx->va_rc_mode = VA_RC_CQP;
-            if (avctx->bit_rate > 0 || avctx->rc_max_rate > 0) {
-                av_log(avctx, AV_LOG_WARNING, "Bitrate target parameters "
-                       "ignored in constant-quality mode.\n");
+               "supported rate control modes: assuming CQP only.\n");
+        supported_va_rc_modes = VA_RC_CQP;
+        strcpy(supported_rc_modes_string, "unknown");
+    } else {
+        char *str = supported_rc_modes_string;
+        size_t len = sizeof(supported_rc_modes_string);
+        int i, first = 1, res;
+
+        supported_va_rc_modes = rc_attr.value;
+        for (i = 0; i < FF_ARRAY_ELEMS(vaapi_encode_rc_modes); i++) {
+            rc_mode = &vaapi_encode_rc_modes[i];
+            if (supported_va_rc_modes & rc_mode->va_mode) {
+                res = snprintf(str, len, "%s%s",
+                               first ? "" : ", ", rc_mode->name);
+                first = 0;
+                if (res < 0) {
+                    *str = 0;
+                    break;
+                }
+                len -= res;
+                str += res;
+                if (len == 0)
+                    break;
             }
-            return 0;
-        } else {
-            av_log(avctx, AV_LOG_ERROR, "Driver does not support "
-                   "constant-quality mode (%#x).\n", rc_attr.value);
-            return AVERROR(EINVAL);
         }
+
+        av_log(avctx, AV_LOG_DEBUG, "Driver supports RC modes %s.\n",
+               supported_rc_modes_string);
     }
 
-    if (!(rc_attr.value & (VA_RC_CBR | VA_RC_VBR))) {
-        av_log(avctx, AV_LOG_ERROR, "Driver does not support any "
-               "bitrate-targetted rate control modes.\n");
-        return AVERROR(EINVAL);
+    // Rate control mode selection:
+    // * If the user has set a mode explicitly with the rc_mode option,
+    //   use it and fail if it is not available.
+    // * If an explicit QP option has been set, use CQP.
+    // * If the codec is CQ-only, use CQP.
+    // * If the QSCALE avcodec option is set, use CQP.
+    // * If bitrate and quality are both set, try QVBR.
+    // * If quality is set, try ICQ, then CQP.
+    // * If bitrate and maxrate are set and have the same value, try CBR.
+    // * If a bitrate is set, try AVBR, then VBR, then CBR.
+    // * If no bitrate is set, try ICQ, then CQP.
+
+#define TRY_RC_MODE(mode, fail) do { \
+        rc_mode = &vaapi_encode_rc_modes[mode]; \
+        if (!(rc_mode->va_mode & supported_va_rc_modes)) { \
+            if (fail) { \
+                av_log(avctx, AV_LOG_ERROR, "Driver does not support %s " \
+                       "RC mode (supported modes: %s).\n", rc_mode->name, \
+                       supported_rc_modes_string); \
+                return AVERROR(EINVAL); \
+            } \
+            av_log(avctx, AV_LOG_DEBUG, "Driver does not support %s " \
+                   "RC mode.\n", rc_mode->name); \
+            rc_mode = NULL; \
+        } else { \
+            goto rc_mode_found; \
+        } \
+    } while (0)
+
+    if (ctx->explicit_rc_mode)
+        TRY_RC_MODE(ctx->explicit_rc_mode, 1);
+
+    if (ctx->explicit_qp)
+        TRY_RC_MODE(RC_MODE_CQP, 1);
+
+    if (ctx->codec->flags & FLAG_CONSTANT_QUALITY_ONLY)
+        TRY_RC_MODE(RC_MODE_CQP, 1);
+
+    if (avctx->flags & AV_CODEC_FLAG_QSCALE)
+        TRY_RC_MODE(RC_MODE_CQP, 1);
+
+    if (avctx->bit_rate > 0 && avctx->global_quality > 0)
+        TRY_RC_MODE(RC_MODE_QVBR, 0);
+
+    if (avctx->global_quality > 0) {
+        TRY_RC_MODE(RC_MODE_ICQ, 0);
+        TRY_RC_MODE(RC_MODE_CQP, 0);
     }
 
-    if (avctx->rc_buffer_size)
-        hrd_buffer_size = avctx->rc_buffer_size;
-    else if (avctx->rc_max_rate > 0)
-        hrd_buffer_size = avctx->rc_max_rate;
-    else
-        hrd_buffer_size = avctx->bit_rate;
-    if (avctx->rc_initial_buffer_occupancy) {
-        if (avctx->rc_initial_buffer_occupancy > hrd_buffer_size) {
-            av_log(avctx, AV_LOG_ERROR, "Invalid RC buffer settings: "
-                   "must have initial buffer size (%d) < "
-                   "buffer size (%"PRId64").\n",
-                   avctx->rc_initial_buffer_occupancy, hrd_buffer_size);
-            return AVERROR(EINVAL);
-        }
-        hrd_initial_buffer_fullness = avctx->rc_initial_buffer_occupancy;
+    if (avctx->bit_rate > 0 && avctx->rc_max_rate == avctx->bit_rate)
+        TRY_RC_MODE(RC_MODE_CBR, 0);
+
+    if (avctx->bit_rate > 0) {
+        TRY_RC_MODE(RC_MODE_AVBR, 0);
+        TRY_RC_MODE(RC_MODE_VBR, 0);
+        TRY_RC_MODE(RC_MODE_CBR, 0);
     } else {
-        hrd_initial_buffer_fullness = hrd_buffer_size * 3 / 4;
+        TRY_RC_MODE(RC_MODE_ICQ, 0);
+        TRY_RC_MODE(RC_MODE_CQP, 0);
     }
 
-    if (avctx->rc_max_rate && avctx->rc_max_rate < avctx->bit_rate) {
-        av_log(avctx, AV_LOG_ERROR, "Invalid bitrate settings: must have "
-               "bitrate (%"PRId64") <= maxrate (%"PRId64").\n",
-               avctx->bit_rate, avctx->rc_max_rate);
-        return AVERROR(EINVAL);
-    }
+    av_log(avctx, AV_LOG_ERROR, "Driver does not support any "
+           "RC mode compatible with selected options "
+           "(supported modes: %s).\n", supported_rc_modes_string);
+    return AVERROR(EINVAL);
 
-    if (avctx->rc_max_rate > avctx->bit_rate) {
-        if (!(rc_attr.value & VA_RC_VBR)) {
-            av_log(avctx, AV_LOG_WARNING, "Driver does not support "
-                   "VBR mode (%#x), using CBR mode instead.\n",
-                   rc_attr.value);
-            ctx->va_rc_mode = VA_RC_CBR;
+rc_mode_found:
+    if (rc_mode->bitrate) {
+        if (avctx->bit_rate <= 0) {
+            av_log(avctx, AV_LOG_ERROR, "Bitrate must be set for %s "
+                   "RC mode.\n", rc_mode->name);
+            return AVERROR(EINVAL);
+        }
 
+        if (rc_mode->mode == RC_MODE_AVBR) {
+            // For maximum confusion AVBR is hacked into the existing API
+            // by overloading some of the fields with completely different
+            // meanings.
+
+            // Target percentage does not apply in AVBR mode.
+            rc_bits_per_second = avctx->bit_rate;
+
+            // Accuracy tolerance range for meeting the specified target
+            // bitrate.  It's very unclear how this is actually intended
+            // to work - since we do want to get the specified bitrate,
+            // set the accuracy to 100% for now.
+            rc_target_percentage = 100;
+
+            // Convergence period in frames.  The GOP size reflects the
+            // user's intended block size for cutting, so reusing that
+            // as the convergence period seems a reasonable default.
+            rc_window_size = avctx->gop_size > 0 ? avctx->gop_size : 60;
+
+        } else if (rc_mode->maxrate) {
+            if (avctx->rc_max_rate > 0) {
+                if (avctx->rc_max_rate < avctx->bit_rate) {
+                    av_log(avctx, AV_LOG_ERROR, "Invalid bitrate settings: "
+                           "bitrate (%"PRId64") must not be greater than "
+                           "maxrate (%"PRId64").\n", avctx->bit_rate,
+                           avctx->rc_max_rate);
+                    return AVERROR(EINVAL);
+                }
+                rc_bits_per_second   = avctx->rc_max_rate;
+                rc_target_percentage = (avctx->bit_rate * 100) /
+                                       avctx->rc_max_rate;
+            } else {
+                // We only have a target bitrate, but this mode requires
+                // that a maximum rate be supplied as well.  Since the
+                // user does not want this to be a constraint, arbitrarily
+                // pick a maximum rate of double the target rate.
+                rc_bits_per_second   = 2 * avctx->bit_rate;
+                rc_target_percentage = 50;
+            }
+        } else {
+            if (avctx->rc_max_rate > avctx->bit_rate) {
+                av_log(avctx, AV_LOG_WARNING, "Max bitrate is ignored "
+                       "in %s RC mode.\n", rc_mode->name);
+            }
             rc_bits_per_second   = avctx->bit_rate;
             rc_target_percentage = 100;
-        } else {
-            ctx->va_rc_mode = VA_RC_VBR;
-
-            rc_bits_per_second   = avctx->rc_max_rate;
-            rc_target_percentage = (avctx->bit_rate * 100) /
-                                   avctx->rc_max_rate;
         }
-
-    } else if (avctx->rc_max_rate == avctx->bit_rate) {
-        if (!(rc_attr.value & VA_RC_CBR)) {
-            av_log(avctx, AV_LOG_WARNING, "Driver does not support "
-                   "CBR mode (%#x), using VBR mode instead.\n",
-                   rc_attr.value);
-            ctx->va_rc_mode = VA_RC_VBR;
-        } else {
-            ctx->va_rc_mode = VA_RC_CBR;
-        }
-
-        rc_bits_per_second   = avctx->bit_rate;
+    } else {
+        rc_bits_per_second   = 0;
         rc_target_percentage = 100;
-
-    } else {
-        if (rc_attr.value & VA_RC_VBR) {
-            ctx->va_rc_mode = VA_RC_VBR;
-
-            // We only have a target bitrate, but VAAPI requires that a
-            // maximum rate be supplied as well.  Since the user has
-            // offered no particular constraint, arbitrarily pick a
-            // maximum rate of double the target rate.
-            rc_bits_per_second   = 2 * avctx->bit_rate;
-            rc_target_percentage = 50;
-        } else {
-            ctx->va_rc_mode = VA_RC_CBR;
-
-            rc_bits_per_second   = avctx->bit_rate;
-            rc_target_percentage = 100;
-        }
     }
 
-    rc_window_size = (hrd_buffer_size * 1000) / rc_bits_per_second;
+    if (rc_mode->quality) {
+        if (ctx->explicit_qp) {
+            rc_quality = ctx->explicit_qp;
+        } else if (avctx->global_quality > 0) {
+            rc_quality = avctx->global_quality;
+        } else {
+            rc_quality = ctx->codec->default_quality;
+            av_log(avctx, AV_LOG_WARNING, "No quality level set; "
+                   "using default (%d).\n", rc_quality);
+        }
+    } else {
+        rc_quality = 0;
+    }
 
-    av_log(avctx, AV_LOG_VERBOSE, "RC mode: %s, %d%% of %"PRId64" bps "
-           "over %d ms.\n", ctx->va_rc_mode == VA_RC_VBR ? "VBR" : "CBR",
-           rc_target_percentage, rc_bits_per_second, rc_window_size);
-    av_log(avctx, AV_LOG_VERBOSE, "RC buffer: %"PRId64" bits, "
-           "initial fullness %"PRId64" bits.\n",
-           hrd_buffer_size, hrd_initial_buffer_fullness);
+    if (rc_mode->hrd) {
+        if (avctx->rc_buffer_size)
+            hrd_buffer_size = avctx->rc_buffer_size;
+        else if (avctx->rc_max_rate > 0)
+            hrd_buffer_size = avctx->rc_max_rate;
+        else
+            hrd_buffer_size = avctx->bit_rate;
+        if (avctx->rc_initial_buffer_occupancy) {
+            if (avctx->rc_initial_buffer_occupancy > hrd_buffer_size) {
+                av_log(avctx, AV_LOG_ERROR, "Invalid RC buffer settings: "
+                       "must have initial buffer size (%d) <= "
+                       "buffer size (%"PRId64").\n",
+                       avctx->rc_initial_buffer_occupancy, hrd_buffer_size);
+                return AVERROR(EINVAL);
+            }
+            hrd_initial_buffer_fullness = avctx->rc_initial_buffer_occupancy;
+        } else {
+            hrd_initial_buffer_fullness = hrd_buffer_size * 3 / 4;
+        }
+
+        rc_window_size = (hrd_buffer_size * 1000) / rc_bits_per_second;
+    } else {
+        if (avctx->rc_buffer_size || avctx->rc_initial_buffer_occupancy) {
+            av_log(avctx, AV_LOG_WARNING, "Buffering settings are ignored "
+                   "in %s RC mode.\n", rc_mode->name);
+        }
+
+        hrd_buffer_size             = 0;
+        hrd_initial_buffer_fullness = 0;
+
+        if (rc_mode->mode != RC_MODE_AVBR) {
+            // Already set (with completely different meaning) for AVBR.
+            rc_window_size = 1000;
+        }
+    }
 
     if (rc_bits_per_second          > UINT32_MAX ||
         hrd_buffer_size             > UINT32_MAX ||
@@ -1347,36 +1669,72 @@
         return AVERROR(EINVAL);
     }
 
+    ctx->rc_mode     = rc_mode;
+    ctx->rc_quality  = rc_quality;
+    ctx->va_rc_mode  = rc_mode->va_mode;
     ctx->va_bit_rate = rc_bits_per_second;
 
-    ctx->config_attributes[ctx->nb_config_attributes++] =
-        (VAConfigAttrib) {
-        .type  = VAConfigAttribRateControl,
-        .value = ctx->va_rc_mode,
-    };
+    av_log(avctx, AV_LOG_VERBOSE, "RC mode: %s.\n", rc_mode->name);
+    if (rc_attr.value == VA_ATTRIB_NOT_SUPPORTED) {
+        // This driver does not want the RC mode attribute to be set.
+    } else {
+        ctx->config_attributes[ctx->nb_config_attributes++] =
+            (VAConfigAttrib) {
+            .type  = VAConfigAttribRateControl,
+            .value = ctx->va_rc_mode,
+        };
+    }
 
-    ctx->rc_params.misc.type = VAEncMiscParameterTypeRateControl;
-    ctx->rc_params.rc = (VAEncMiscParameterRateControl) {
-        .bits_per_second   = rc_bits_per_second,
-        .target_percentage = rc_target_percentage,
-        .window_size       = rc_window_size,
-        .initial_qp        = 0,
-        .min_qp            = (avctx->qmin > 0 ? avctx->qmin : 0),
-        .basic_unit_size   = 0,
+    if (rc_mode->quality)
+        av_log(avctx, AV_LOG_VERBOSE, "RC quality: %d.\n", rc_quality);
+
+    if (rc_mode->va_mode != VA_RC_CQP) {
+        if (rc_mode->mode == RC_MODE_AVBR) {
+            av_log(avctx, AV_LOG_VERBOSE, "RC target: %"PRId64" bps "
+                   "converging in %d frames with %d%% accuracy.\n",
+                   rc_bits_per_second, rc_window_size,
+                   rc_target_percentage);
+        } else if (rc_mode->bitrate) {
+            av_log(avctx, AV_LOG_VERBOSE, "RC target: %d%% of "
+                   "%"PRId64" bps over %d ms.\n", rc_target_percentage,
+                   rc_bits_per_second, rc_window_size);
+        }
+
+        ctx->rc_params = (VAEncMiscParameterRateControl) {
+            .bits_per_second    = rc_bits_per_second,
+            .target_percentage  = rc_target_percentage,
+            .window_size        = rc_window_size,
+            .initial_qp         = 0,
+            .min_qp             = (avctx->qmin > 0 ? avctx->qmin : 0),
+            .basic_unit_size    = 0,
 #if VA_CHECK_VERSION(1, 1, 0)
-        .max_qp            = (avctx->qmax > 0 ? avctx->qmax : 0),
+            .ICQ_quality_factor = av_clip(rc_quality, 1, 51),
+            .max_qp             = (avctx->qmax > 0 ? avctx->qmax : 0),
 #endif
-    };
-    vaapi_encode_add_global_param(avctx, &ctx->rc_params.misc,
-                                  sizeof(ctx->rc_params));
+#if VA_CHECK_VERSION(1, 3, 0)
+            .quality_factor     = rc_quality,
+#endif
+        };
+        vaapi_encode_add_global_param(avctx,
+                                      VAEncMiscParameterTypeRateControl,
+                                      &ctx->rc_params,
+                                      sizeof(ctx->rc_params));
+    }
 
-    ctx->hrd_params.misc.type = VAEncMiscParameterTypeHRD;
-    ctx->hrd_params.hrd = (VAEncMiscParameterHRD) {
-        .initial_buffer_fullness = hrd_initial_buffer_fullness,
-        .buffer_size             = hrd_buffer_size,
-    };
-    vaapi_encode_add_global_param(avctx, &ctx->hrd_params.misc,
-                                  sizeof(ctx->hrd_params));
+    if (rc_mode->hrd) {
+        av_log(avctx, AV_LOG_VERBOSE, "RC buffer: %"PRId64" bits, "
+               "initial fullness %"PRId64" bits.\n",
+               hrd_buffer_size, hrd_initial_buffer_fullness);
+
+        ctx->hrd_params = (VAEncMiscParameterHRD) {
+            .initial_buffer_fullness = hrd_initial_buffer_fullness,
+            .buffer_size             = hrd_buffer_size,
+        };
+        vaapi_encode_add_global_param(avctx,
+                                      VAEncMiscParameterTypeHRD,
+                                      &ctx->hrd_params,
+                                      sizeof(ctx->hrd_params));
+    }
 
     if (avctx->framerate.num > 0 && avctx->framerate.den > 0)
         av_reduce(&fr_num, &fr_den,
@@ -1385,11 +1743,16 @@
         av_reduce(&fr_num, &fr_den,
                   avctx->time_base.den, avctx->time_base.num, 65535);
 
-    ctx->fr_params.misc.type = VAEncMiscParameterTypeFrameRate;
-    ctx->fr_params.fr.framerate = (unsigned int)fr_den << 16 | fr_num;
+    av_log(avctx, AV_LOG_VERBOSE, "RC framerate: %d/%d (%.2f fps).\n",
+           fr_num, fr_den, (double)fr_num / fr_den);
 
+    ctx->fr_params = (VAEncMiscParameterFrameRate) {
+        .framerate = (unsigned int)fr_den << 16 | fr_num,
+    };
 #if VA_CHECK_VERSION(0, 40, 0)
-    vaapi_encode_add_global_param(avctx, &ctx->fr_params.misc,
+    vaapi_encode_add_global_param(avctx,
+                                  VAEncMiscParameterTypeFrameRate,
+                                  &ctx->fr_params,
                                   sizeof(ctx->fr_params));
 #endif
 
@@ -1420,14 +1783,16 @@
         ref_l1 = attr.value >> 16 & 0xffff;
     }
 
-    if (avctx->gop_size <= 1) {
+    if (ctx->codec->flags & FLAG_INTRA_ONLY ||
+        avctx->gop_size <= 1) {
         av_log(avctx, AV_LOG_VERBOSE, "Using intra frames only.\n");
         ctx->gop_size = 1;
     } else if (ref_l0 < 1) {
         av_log(avctx, AV_LOG_ERROR, "Driver does not support any "
                "reference frames.\n");
         return AVERROR(EINVAL);
-    } else if (ref_l1 < 1 || avctx->max_b_frames < 1) {
+    } else if (!(ctx->codec->flags & FLAG_B_PICTURES) ||
+               ref_l1 < 1 || avctx->max_b_frames < 1) {
         av_log(avctx, AV_LOG_VERBOSE, "Using intra and P-frames "
                "(supported references: %d / %d).\n", ref_l0, ref_l1);
         ctx->gop_size = avctx->gop_size;
@@ -1439,8 +1804,122 @@
         ctx->gop_size = avctx->gop_size;
         ctx->p_per_i  = INT_MAX;
         ctx->b_per_p  = avctx->max_b_frames;
+        if (ctx->codec->flags & FLAG_B_PICTURE_REFERENCES) {
+            ctx->max_b_depth = FFMIN(ctx->desired_b_depth,
+                                     av_log2(ctx->b_per_p) + 1);
+        } else {
+            ctx->max_b_depth = 1;
+        }
     }
 
+    if (ctx->codec->flags & FLAG_NON_IDR_KEY_PICTURES) {
+        ctx->closed_gop  = !!(avctx->flags & AV_CODEC_FLAG_CLOSED_GOP);
+        ctx->gop_per_idr = ctx->idr_interval + 1;
+    } else {
+        ctx->closed_gop  = 1;
+        ctx->gop_per_idr = 1;
+    }
+
+    return 0;
+}
+
+static av_cold int vaapi_encode_init_slice_structure(AVCodecContext *avctx)
+{
+    VAAPIEncodeContext *ctx = avctx->priv_data;
+    VAConfigAttrib attr[2] = { { VAConfigAttribEncMaxSlices },
+                               { VAConfigAttribEncSliceStructure } };
+    VAStatus vas;
+    uint32_t max_slices, slice_structure;
+    int req_slices;
+
+    if (!(ctx->codec->flags & FLAG_SLICE_CONTROL)) {
+        if (avctx->slices > 0) {
+            av_log(avctx, AV_LOG_WARNING, "Multiple slices were requested "
+                   "but this codec does not support controlling slices.\n");
+        }
+        return 0;
+    }
+
+    ctx->slice_block_rows = (avctx->height + ctx->slice_block_height - 1) /
+                             ctx->slice_block_height;
+    ctx->slice_block_cols = (avctx->width  + ctx->slice_block_width  - 1) /
+                             ctx->slice_block_width;
+
+    if (avctx->slices <= 1) {
+        ctx->nb_slices  = 1;
+        ctx->slice_size = ctx->slice_block_rows;
+        return 0;
+    }
+
+    vas = vaGetConfigAttributes(ctx->hwctx->display,
+                                ctx->va_profile,
+                                ctx->va_entrypoint,
+                                attr, FF_ARRAY_ELEMS(attr));
+    if (vas != VA_STATUS_SUCCESS) {
+        av_log(avctx, AV_LOG_ERROR, "Failed to query slice "
+               "attributes: %d (%s).\n", vas, vaErrorStr(vas));
+        return AVERROR_EXTERNAL;
+    }
+    max_slices      = attr[0].value;
+    slice_structure = attr[1].value;
+    if (max_slices      == VA_ATTRIB_NOT_SUPPORTED ||
+        slice_structure == VA_ATTRIB_NOT_SUPPORTED) {
+        av_log(avctx, AV_LOG_ERROR, "Driver does not support encoding "
+               "pictures as multiple slices.\n.");
+        return AVERROR(EINVAL);
+    }
+
+    // For fixed-size slices currently we only support whole rows, making
+    // rectangular slices.  This could be extended to arbitrary runs of
+    // blocks, but since slices tend to be a conformance requirement and
+    // most cases (such as broadcast or bluray) want rectangular slices
+    // only it would need to be gated behind another option.
+    if (avctx->slices > ctx->slice_block_rows) {
+        av_log(avctx, AV_LOG_WARNING, "Not enough rows to use "
+               "configured number of slices (%d < %d); using "
+               "maximum.\n", ctx->slice_block_rows, avctx->slices);
+        req_slices = ctx->slice_block_rows;
+    } else {
+        req_slices = avctx->slices;
+    }
+    if (slice_structure & VA_ENC_SLICE_STRUCTURE_ARBITRARY_ROWS ||
+        slice_structure & VA_ENC_SLICE_STRUCTURE_ARBITRARY_MACROBLOCKS) {
+        ctx->nb_slices  = req_slices;
+        ctx->slice_size = ctx->slice_block_rows / ctx->nb_slices;
+    } else if (slice_structure & VA_ENC_SLICE_STRUCTURE_POWER_OF_TWO_ROWS) {
+        int k;
+        for (k = 1;; k *= 2) {
+            if (2 * k * (req_slices - 1) + 1 >= ctx->slice_block_rows)
+                break;
+        }
+        ctx->nb_slices  = (ctx->slice_block_rows + k - 1) / k;
+        ctx->slice_size = k;
+#if VA_CHECK_VERSION(1, 0, 0)
+    } else if (slice_structure & VA_ENC_SLICE_STRUCTURE_EQUAL_ROWS) {
+        ctx->nb_slices  = ctx->slice_block_rows;
+        ctx->slice_size = 1;
+#endif
+    } else {
+        av_log(avctx, AV_LOG_ERROR, "Driver does not support any usable "
+               "slice structure modes (%#x).\n", slice_structure);
+        return AVERROR(EINVAL);
+    }
+
+    if (ctx->nb_slices > avctx->slices) {
+        av_log(avctx, AV_LOG_WARNING, "Slice count rounded up to "
+               "%d (from %d) due to driver constraints on slice "
+               "structure.\n", ctx->nb_slices, avctx->slices);
+    }
+    if (ctx->nb_slices > max_slices) {
+        av_log(avctx, AV_LOG_ERROR, "Driver does not support "
+               "encoding with %d slices (max %"PRIu32").\n",
+               ctx->nb_slices, max_slices);
+        return AVERROR(EINVAL);
+    }
+
+    av_log(avctx, AV_LOG_VERBOSE, "Encoding pictures with %d slices "
+           "(default size %d block rows).\n",
+           ctx->nb_slices, ctx->slice_size);
     return 0;
 }
 
@@ -1535,10 +2014,12 @@
             quality = attr.value;
         }
 
-        ctx->quality_params.misc.type = VAEncMiscParameterTypeQualityLevel;
-        ctx->quality_params.quality.quality_level = quality;
-
-        vaapi_encode_add_global_param(avctx, &ctx->quality_params.misc,
+        ctx->quality_params = (VAEncMiscParameterBufferQualityLevel) {
+            .quality_level = quality,
+        };
+        vaapi_encode_add_global_param(avctx,
+                                      VAEncMiscParameterTypeQualityLevel,
+                                      &ctx->quality_params,
                                       sizeof(ctx->quality_params));
     }
 #else
@@ -1549,6 +2030,39 @@
     return 0;
 }
 
+static av_cold int vaapi_encode_init_roi(AVCodecContext *avctx)
+{
+#if VA_CHECK_VERSION(1, 0, 0)
+    VAAPIEncodeContext *ctx = avctx->priv_data;
+    VAStatus vas;
+    VAConfigAttrib attr = { VAConfigAttribEncROI };
+
+    vas = vaGetConfigAttributes(ctx->hwctx->display,
+                                ctx->va_profile,
+                                ctx->va_entrypoint,
+                                &attr, 1);
+    if (vas != VA_STATUS_SUCCESS) {
+        av_log(avctx, AV_LOG_ERROR, "Failed to query ROI "
+               "config attribute: %d (%s).\n", vas, vaErrorStr(vas));
+        return AVERROR_EXTERNAL;
+    }
+
+    if (attr.value == VA_ATTRIB_NOT_SUPPORTED) {
+        ctx->roi_allowed = 0;
+    } else {
+        VAConfigAttribValEncROI roi = {
+            .value = attr.value,
+        };
+
+        ctx->roi_max_regions = roi.bits.num_roi_regions;
+        ctx->roi_allowed = ctx->roi_max_regions > 0 &&
+            (ctx->va_rc_mode == VA_RC_CQP ||
+             roi.bits.roi_rc_qp_delta_support);
+    }
+#endif
+    return 0;
+}
+
 static void vaapi_encode_free_output_buffer(void *opaque,
                                             uint8_t *data)
 {
@@ -1673,9 +2187,6 @@
     ctx->recon_frames->sw_format = recon_format;
     ctx->recon_frames->width     = ctx->surface_width;
     ctx->recon_frames->height    = ctx->surface_height;
-    // At most three IDR/I/P frames and two runs of B frames can be in
-    // flight at any one time.
-    ctx->recon_frames->initial_pool_size = 3 + 2 * ctx->b_per_p;
 
     err = av_hwframe_ctx_init(ctx->recon_frames_ref);
     if (err < 0) {
@@ -1734,10 +2245,18 @@
     if (err < 0)
         goto fail;
 
+    err = vaapi_encode_init_slice_structure(avctx);
+    if (err < 0)
+        goto fail;
+
     err = vaapi_encode_init_packed_headers(avctx);
     if (err < 0)
         goto fail;
 
+    err = vaapi_encode_init_roi(avctx);
+    if (err < 0)
+        goto fail;
+
     if (avctx->compression_level >= 0) {
         err = vaapi_encode_init_quality(avctx);
         if (err < 0)
@@ -1787,10 +2306,8 @@
             goto fail;
     }
 
-    ctx->input_order  = 0;
     ctx->output_delay = ctx->b_per_p;
-    ctx->decode_delay = 1;
-    ctx->output_order = - ctx->output_delay - 1;
+    ctx->decode_delay = ctx->max_b_depth;
 
     if (ctx->codec->sequence_params_size > 0) {
         ctx->codec_sequence_params =
@@ -1818,10 +2335,6 @@
         }
     }
 
-    // This should be configurable somehow.  (Needs testing on a machine
-    // where it actually overlaps properly, though.)
-    ctx->issue_mode = ISSUE_MODE_MAXIMISE_THROUGHPUT;
-
     if (ctx->va_packed_headers & VA_ENC_PACKED_HEADER_SEQUENCE &&
         ctx->codec->write_sequence_header &&
         avctx->flags & AV_CODEC_FLAG_GLOBAL_HEADER) {
diff --git a/libavcodec/vaapi_encode.h b/libavcodec/vaapi_encode.h
index 091889f..b9a3def 100644
--- a/libavcodec/vaapi_encode.h
+++ b/libavcodec/vaapi_encode.h
@@ -38,6 +38,7 @@
 enum {
     MAX_CONFIG_ATTRIBUTES  = 4,
     MAX_GLOBAL_PARAMS      = 4,
+    MAX_DPB_SIZE           = 16,
     MAX_PICTURE_REFERENCES = 2,
     MAX_REORDER_DELAY      = 16,
     MAX_PARAM_BUFFER_SIZE  = 1024,
@@ -52,6 +53,10 @@
 
 typedef struct VAAPIEncodeSlice {
     int             index;
+    int             row_start;
+    int             row_size;
+    int             block_start;
+    int             block_size;
     void           *priv_data;
     void           *codec_slice_params;
 } VAAPIEncodeSlice;
@@ -62,9 +67,17 @@
     int64_t         display_order;
     int64_t         encode_order;
     int64_t         pts;
+    int             force_idr;
+
+#if VA_CHECK_VERSION(1, 0, 0)
+    // ROI regions.
+    VAEncROI       *roi;
+#else
+    void           *roi;
+#endif
 
     int             type;
-    int             input_available;
+    int             b_depth;
     int             encode_issued;
     int             encode_complete;
 
@@ -83,8 +96,26 @@
     void           *priv_data;
     void           *codec_picture_params;
 
-    int          nb_refs;
+    // Whether this picture is a reference picture.
+    int             is_reference;
+
+    // The contents of the DPB after this picture has been decoded.
+    // This will contain the picture itself if it is a reference picture,
+    // but not if it isn't.
+    int                     nb_dpb_pics;
+    struct VAAPIEncodePicture *dpb[MAX_DPB_SIZE];
+    // The reference pictures used in decoding this picture.  If they are
+    // used by later pictures they will also appear in the DPB.
+    int                     nb_refs;
     struct VAAPIEncodePicture *refs[MAX_PICTURE_REFERENCES];
+    // The previous reference picture in encode order.  Must be in at least
+    // one of the reference list and DPB list.
+    struct VAAPIEncodePicture *prev;
+    // Reference count for other pictures referring to this one through
+    // the above pointers, directly from incomplete pictures and indirectly
+    // through completed pictures.
+    int             ref_count[2];
+    int             ref_removed[2];
 
     int          nb_slices;
     VAAPIEncodeSlice *slices;
@@ -105,6 +136,36 @@
     VAProfile va_profile;
 } VAAPIEncodeProfile;
 
+enum {
+    RC_MODE_AUTO,
+    RC_MODE_CQP,
+    RC_MODE_CBR,
+    RC_MODE_VBR,
+    RC_MODE_ICQ,
+    RC_MODE_QVBR,
+    RC_MODE_AVBR,
+    RC_MODE_MAX = RC_MODE_AVBR,
+};
+
+typedef struct VAAPIEncodeRCMode {
+    // Mode from above enum (RC_MODE_*).
+    int mode;
+    // Name.
+    const char *name;
+    // Supported in the compile-time VAAPI version.
+    int supported;
+    // VA mode value (VA_RC_*).
+    uint32_t va_mode;
+    // Uses bitrate parameters.
+    int bitrate;
+    // Supports maxrate distinct from bitrate.
+    int maxrate;
+    // Uses quality value.
+    int quality;
+    // Supports HRD/VBV parameters.
+    int hrd;
+} VAAPIEncodeRCMode;
+
 typedef struct VAAPIEncodeContext {
     const AVClass *class;
 
@@ -116,6 +177,20 @@
     // Use low power encoding mode.
     int             low_power;
 
+    // Number of I frames between IDR frames.
+    int             idr_interval;
+
+    // Desired B frame reference depth.
+    int             desired_b_depth;
+
+    // Explicitly set RC mode (otherwise attempt to pick from
+    // available modes).
+    int             explicit_rc_mode;
+
+    // Explicitly-set QP, for use with the "qp" options.
+    // (Forces CQP mode when set, overriding everything else.)
+    int             explicit_qp;
+
     // Desired packed headers.
     unsigned int    desired_packed_headers;
 
@@ -125,12 +200,22 @@
     int             surface_width;
     int             surface_height;
 
+    // The block size for slice calculations.
+    int             slice_block_width;
+    int             slice_block_height;
+
     // Everything above this point must be set before calling
     // ff_vaapi_encode_init().
 
     // Chosen encoding profile details.
     const VAAPIEncodeProfile *profile;
 
+    // Chosen rate control mode details.
+    const VAAPIEncodeRCMode *rc_mode;
+    // RC quality level - meaning depends on codec and RC mode.
+    // In CQP mode this sets the fixed quantiser value.
+    int             rc_quality;
+
     // Encoding profile (VAProfile*).
     VAProfile       va_profile;
     // Encoding entrypoint (VAEntryoint*).
@@ -166,28 +251,17 @@
 
     // Global parameters which will be applied at the start of the
     // sequence (includes rate control parameters below).
-    VAEncMiscParameterBuffer *global_params[MAX_GLOBAL_PARAMS];
+    int             global_params_type[MAX_GLOBAL_PARAMS];
+    const void     *global_params     [MAX_GLOBAL_PARAMS];
     size_t          global_params_size[MAX_GLOBAL_PARAMS];
     int          nb_global_params;
 
     // Rate control parameters.
-    struct {
-        VAEncMiscParameterBuffer misc;
-        VAEncMiscParameterRateControl rc;
-    } rc_params;
-    struct {
-        VAEncMiscParameterBuffer misc;
-        VAEncMiscParameterHRD hrd;
-    } hrd_params;
-    struct {
-        VAEncMiscParameterBuffer misc;
-        VAEncMiscParameterFrameRate fr;
-    } fr_params;
+    VAEncMiscParameterRateControl rc_params;
+    VAEncMiscParameterHRD        hrd_params;
+    VAEncMiscParameterFrameRate   fr_params;
 #if VA_CHECK_VERSION(0, 36, 0)
-    struct {
-        VAEncMiscParameterBuffer misc;
-        VAEncMiscParameterBufferQualityLevel quality;
-    } quality_params;
+    VAEncMiscParameterBufferQualityLevel quality_params;
 #endif
 
     // Per-sequence parameter structure (VAEncSequenceParameterBuffer*).
@@ -199,51 +273,97 @@
 
     // Current encoding window, in display (input) order.
     VAAPIEncodePicture *pic_start, *pic_end;
+    // The next picture to use as the previous reference picture in
+    // encoding order.
+    VAAPIEncodePicture *next_prev;
 
     // Next input order index (display order).
     int64_t         input_order;
     // Number of frames that output is behind input.
     int64_t         output_delay;
+    // Next encode order index.
+    int64_t         encode_order;
     // Number of frames decode output will need to be delayed.
     int64_t         decode_delay;
-    // Next output order index (encode order).
+    // Next output order index (in encode order).
     int64_t         output_order;
 
-    enum {
-        // All encode operations are done independently (synchronise
-        // immediately after every operation).
-        ISSUE_MODE_SERIALISE_EVERYTHING = 0,
-        // Overlap as many operations as possible.
-        ISSUE_MODE_MAXIMISE_THROUGHPUT,
-        // Overlap operations only when satisfying parallel dependencies.
-        ISSUE_MODE_MINIMISE_LATENCY,
-    } issue_mode;
-
     // Timestamp handling.
     int64_t         first_pts;
     int64_t         dts_pts_diff;
     int64_t         ts_ring[MAX_REORDER_DELAY * 3];
 
+    // Slice structure.
+    int slice_block_rows;
+    int slice_block_cols;
+    int nb_slices;
+    int slice_size;
+
     // Frame type decision.
     int gop_size;
+    int closed_gop;
+    int gop_per_idr;
     int p_per_i;
+    int max_b_depth;
     int b_per_p;
     int force_idr;
+    int idr_counter;
     int gop_counter;
-    int p_counter;
     int end_of_stream;
+
+    // Whether the driver supports ROI at all.
+    int             roi_allowed;
+    // Maximum number of regions supported by the driver.
+    int             roi_max_regions;
+    // Quantisation range for offset calculations.  Set by codec-specific
+    // code, as it may change based on parameters.
+    int             roi_quant_range;
+
+    // The encoder does not support cropping information, so warn about
+    // it the first time we encounter any nonzero crop fields.
+    int             crop_warned;
+    // If the driver does not support ROI then warn the first time we
+    // encounter a frame with ROI side data.
+    int             roi_warned;
 } VAAPIEncodeContext;
 
+enum {
+    // Codec supports controlling the subdivision of pictures into slices.
+    FLAG_SLICE_CONTROL         = 1 << 0,
+    // Codec only supports constant quality (no rate control).
+    FLAG_CONSTANT_QUALITY_ONLY = 1 << 1,
+    // Codec is intra-only.
+    FLAG_INTRA_ONLY            = 1 << 2,
+    // Codec supports B-pictures.
+    FLAG_B_PICTURES            = 1 << 3,
+    // Codec supports referencing B-pictures.
+    FLAG_B_PICTURE_REFERENCES  = 1 << 4,
+    // Codec supports non-IDR key pictures (that is, key pictures do
+    // not necessarily empty the DPB).
+    FLAG_NON_IDR_KEY_PICTURES  = 1 << 5,
+};
+
 typedef struct VAAPIEncodeType {
     // List of supported profiles and corresponding VAAPI profiles.
     // (Must end with FF_PROFILE_UNKNOWN.)
     const VAAPIEncodeProfile *profiles;
 
+    // Codec feature flags.
+    int flags;
+
+    // Default quality for this codec - used as quantiser or RC quality
+    // factor depending on RC mode.
+    int default_quality;
+
     // Perform any extra codec-specific configuration after the
     // codec context is initialised (set up the private data and
     // add any necessary global parameters).
     int (*configure)(AVCodecContext *avctx);
 
+    // The size of any private data structure associated with each
+    // picture (can be zero if not required).
+    size_t picture_priv_data_size;
+
     // The size of the parameter structures:
     // sizeof(VAEnc{type}ParameterBuffer{codec}).
     size_t sequence_params_size;
@@ -296,8 +416,8 @@
 } VAAPIEncodeType;
 
 
-int ff_vaapi_encode2(AVCodecContext *avctx, AVPacket *pkt,
-                     const AVFrame *input_image, int *got_packet);
+int ff_vaapi_encode_send_frame(AVCodecContext *avctx, const AVFrame *frame);
+int ff_vaapi_encode_receive_packet(AVCodecContext *avctx, AVPacket *pkt);
 
 int ff_vaapi_encode_init(AVCodecContext *avctx);
 int ff_vaapi_encode_close(AVCodecContext *avctx);
@@ -308,7 +428,32 @@
       "Use low-power encoding mode (only available on some platforms; " \
       "may not support all encoding features)", \
       OFFSET(common.low_power), AV_OPT_TYPE_BOOL, \
-      { .i64 = 0 }, 0, 1, FLAGS }
+      { .i64 = 0 }, 0, 1, FLAGS }, \
+    { "idr_interval", \
+      "Distance (in I-frames) between IDR frames", \
+      OFFSET(common.idr_interval), AV_OPT_TYPE_INT, \
+      { .i64 = 0 }, 0, INT_MAX, FLAGS }, \
+    { "b_depth", \
+      "Maximum B-frame reference depth", \
+      OFFSET(common.desired_b_depth), AV_OPT_TYPE_INT, \
+      { .i64 = 1 }, 1, INT_MAX, FLAGS }
+
+#define VAAPI_ENCODE_RC_MODE(name, desc) \
+    { #name, desc, 0, AV_OPT_TYPE_CONST, { .i64 = RC_MODE_ ## name }, \
+      0, 0, FLAGS, "rc_mode" }
+#define VAAPI_ENCODE_RC_OPTIONS \
+    { "rc_mode",\
+      "Set rate control mode", \
+      OFFSET(common.explicit_rc_mode), AV_OPT_TYPE_INT, \
+      { .i64 = RC_MODE_AUTO }, RC_MODE_AUTO, RC_MODE_MAX, FLAGS, "rc_mode" }, \
+    { "auto", "Choose mode automatically based on other parameters", \
+      0, AV_OPT_TYPE_CONST, { .i64 = RC_MODE_AUTO }, 0, 0, FLAGS, "rc_mode" }, \
+    VAAPI_ENCODE_RC_MODE(CQP,  "Constant-quality"), \
+    VAAPI_ENCODE_RC_MODE(CBR,  "Constant-bitrate"), \
+    VAAPI_ENCODE_RC_MODE(VBR,  "Variable-bitrate"), \
+    VAAPI_ENCODE_RC_MODE(ICQ,  "Intelligent constant-quality"), \
+    VAAPI_ENCODE_RC_MODE(QVBR, "Quality-defined variable-bitrate"), \
+    VAAPI_ENCODE_RC_MODE(AVBR, "Average variable-bitrate")
 
 
 #endif /* AVCODEC_VAAPI_ENCODE_H */
diff --git a/libavcodec/vaapi_encode_h264.c b/libavcodec/vaapi_encode_h264.c
index 8feae0d..f4965d8 100644
--- a/libavcodec/vaapi_encode_h264.c
+++ b/libavcodec/vaapi_encode_h264.c
@@ -47,6 +47,20 @@
     0x96, 0x75, 0x19, 0xd4, 0x1f, 0xea, 0xa9, 0x4d,
 };
 
+typedef struct VAAPIEncodeH264Picture {
+    int frame_num;
+    int pic_order_cnt;
+
+    int64_t last_idr_frame;
+    uint16_t idr_pic_id;
+
+    int primary_pic_type;
+    int slice_type;
+
+    int cpb_delay;
+    int dpb_delay;
+} VAAPIEncodeH264Picture;
+
 typedef struct VAAPIEncodeH264Context {
     VAAPIEncodeContext common;
 
@@ -67,18 +81,7 @@
     int fixed_qp_p;
     int fixed_qp_b;
 
-    // Stream state.
-    int frame_num;
-    int pic_order_cnt;
-    int next_frame_num;
-    int64_t last_idr_frame;
-    int64_t idr_pic_count;
-
-    int primary_pic_type;
-    int slice_type;
-
-    int cpb_delay;
-    int dpb_delay;
+    int dpb_frames;
 
     // Writer structures.
     CodedBitstreamContext *cbc;
@@ -171,7 +174,7 @@
 
     err = vaapi_encode_h264_write_access_unit(avctx, data, data_len, au);
 fail:
-    ff_cbs_fragment_uninit(priv->cbc, au);
+    ff_cbs_fragment_reset(priv->cbc, au);
     return err;
 }
 
@@ -197,7 +200,7 @@
 
     err = vaapi_encode_h264_write_access_unit(avctx, data, data_len, au);
 fail:
-    ff_cbs_fragment_uninit(priv->cbc, au);
+    ff_cbs_fragment_reset(priv->cbc, au);
     return err;
 }
 
@@ -261,7 +264,7 @@
         if (err < 0)
             goto fail;
 
-        ff_cbs_fragment_uninit(priv->cbc, au);
+        ff_cbs_fragment_reset(priv->cbc, au);
 
         *type = VAEncPackedHeaderRawData;
         return 0;
@@ -283,7 +286,7 @@
     }
 
 fail:
-    ff_cbs_fragment_uninit(priv->cbc, au);
+    ff_cbs_fragment_reset(priv->cbc, au);
     return err;
 }
 
@@ -295,10 +298,6 @@
     H264RawPPS                        *pps = &priv->raw_pps;
     VAEncSequenceParameterBufferH264 *vseq = ctx->codec_sequence_params;
     VAEncPictureParameterBufferH264  *vpic = ctx->codec_picture_params;
-    int dpb_frames;
-
-    memset(&priv->current_access_unit, 0,
-           sizeof(priv->current_access_unit));
 
     memset(sps, 0, sizeof(*sps));
     memset(pps, 0, sizeof(*pps));
@@ -322,20 +321,27 @@
     }
 
     if (ctx->gop_size == 1)
-        dpb_frames = 0;
+        priv->dpb_frames = 0;
     else
-        dpb_frames = 1 + (ctx->b_per_p > 0);
+        priv->dpb_frames = 1 + ctx->max_b_depth;
 
     if (avctx->level != FF_LEVEL_UNKNOWN) {
         sps->level_idc = avctx->level;
     } else {
         const H264LevelDescriptor *level;
+        int framerate;
+
+        if (avctx->framerate.num > 0 && avctx->framerate.den > 0)
+            framerate = avctx->framerate.num / avctx->framerate.den;
+        else
+            framerate = 0;
 
         level = ff_h264_guess_level(sps->profile_idc,
                                     avctx->bit_rate,
+                                    framerate,
                                     priv->mb_width  * 16,
                                     priv->mb_height * 16,
-                                    dpb_frames);
+                                    priv->dpb_frames);
         if (level) {
             av_log(avctx, AV_LOG_VERBOSE, "Using level %s.\n", level->name);
             if (level->constraint_set3_flag)
@@ -353,10 +359,9 @@
 
     sps->log2_max_frame_num_minus4 = 4;
     sps->pic_order_cnt_type        = 0;
-    sps->log2_max_pic_order_cnt_lsb_minus4 =
-        av_clip(av_log2(ctx->b_per_p + 1) - 2, 0, 12);
+    sps->log2_max_pic_order_cnt_lsb_minus4 = 4;
 
-    sps->max_num_ref_frames = dpb_frames;
+    sps->max_num_ref_frames = priv->dpb_frames;
 
     sps->pic_width_in_mbs_minus1        = priv->mb_width  - 1;
     sps->pic_height_in_map_units_minus1 = priv->mb_height - 1;
@@ -389,18 +394,20 @@
             {  80, 33 }, {  18, 11 }, {  15, 11 }, {  64, 33 },
             { 160, 99 }, {   4,  3 }, {   3,  2 }, {   2,  1 },
         };
-        int i;
+        int num, den, i;
+        av_reduce(&num, &den, avctx->sample_aspect_ratio.num,
+                  avctx->sample_aspect_ratio.den, 65535);
         for (i = 0; i < FF_ARRAY_ELEMS(sar_idc); i++) {
-            if (avctx->sample_aspect_ratio.num == sar_idc[i].num &&
-                avctx->sample_aspect_ratio.den == sar_idc[i].den) {
+            if (num == sar_idc[i].num &&
+                den == sar_idc[i].den) {
                 sps->vui.aspect_ratio_idc = i;
                 break;
             }
         }
         if (i >= FF_ARRAY_ELEMS(sar_idc)) {
             sps->vui.aspect_ratio_idc = 255;
-            sps->vui.sar_width  = avctx->sample_aspect_ratio.num;
-            sps->vui.sar_height = avctx->sample_aspect_ratio.den;
+            sps->vui.sar_width  = num;
+            sps->vui.sar_height = den;
         }
         sps->vui.aspect_ratio_info_present_flag = 1;
     }
@@ -464,9 +471,9 @@
             (ctx->va_bit_rate >> hrd->bit_rate_scale + 6) - 1;
 
         hrd->cpb_size_scale =
-            av_clip_uintp2(av_log2(ctx->hrd_params.hrd.buffer_size) - 15 - 4, 4);
+            av_clip_uintp2(av_log2(ctx->hrd_params.buffer_size) - 15 - 4, 4);
         hrd->cpb_size_value_minus1[0] =
-            (ctx->hrd_params.hrd.buffer_size >> hrd->cpb_size_scale + 4) - 1;
+            (ctx->hrd_params.buffer_size >> hrd->cpb_size_scale + 4) - 1;
 
         // CBR mode as defined for the HRD cannot be achieved without filler
         // data, so this flag cannot be set even with VAAPI CBR modes.
@@ -481,8 +488,8 @@
 
         // This calculation can easily overflow 32 bits.
         bp->nal.initial_cpb_removal_delay[0] = 90000 *
-            (uint64_t)ctx->hrd_params.hrd.initial_buffer_fullness /
-            ctx->hrd_params.hrd.buffer_size;
+            (uint64_t)ctx->hrd_params.initial_buffer_fullness /
+            ctx->hrd_params.buffer_size;
         bp->nal.initial_cpb_removal_delay_offset[0] = 0;
     } else {
         sps->vui.nal_hrd_parameters_present_flag = 0;
@@ -493,8 +500,8 @@
     sps->vui.motion_vectors_over_pic_boundaries_flag = 1;
     sps->vui.log2_max_mv_length_horizontal = 15;
     sps->vui.log2_max_mv_length_vertical   = 15;
-    sps->vui.max_num_reorder_frames        = (ctx->b_per_p > 0);
-    sps->vui.max_dec_frame_buffering       = sps->max_num_ref_frames;
+    sps->vui.max_num_reorder_frames        = ctx->max_b_depth;
+    sps->vui.max_dec_frame_buffering       = ctx->max_b_depth + 1;
 
     pps->nal_unit_header.nal_ref_idc = 3;
     pps->nal_unit_header.nal_unit_type = H264_NAL_PPS;
@@ -615,46 +622,43 @@
 {
     VAAPIEncodeContext               *ctx = avctx->priv_data;
     VAAPIEncodeH264Context          *priv = avctx->priv_data;
-    H264RawSPS                       *sps = &priv->raw_sps;
+    VAAPIEncodeH264Picture          *hpic = pic->priv_data;
+    VAAPIEncodePicture              *prev = pic->prev;
+    VAAPIEncodeH264Picture         *hprev = prev ? prev->priv_data : NULL;
     VAEncPictureParameterBufferH264 *vpic = pic->codec_picture_params;
     int i;
 
-    memset(&priv->current_access_unit, 0,
-           sizeof(priv->current_access_unit));
-
     if (pic->type == PICTURE_TYPE_IDR) {
         av_assert0(pic->display_order == pic->encode_order);
-        priv->frame_num      = 0;
-        priv->next_frame_num = 1;
-        priv->cpb_delay      = 0;
-        priv->last_idr_frame = pic->display_order;
-        ++priv->idr_pic_count;
 
-        priv->slice_type       = 7;
-        priv->primary_pic_type = 0;
+        hpic->frame_num      = 0;
+        hpic->last_idr_frame = pic->display_order;
+        hpic->idr_pic_id     = hprev ? hprev->idr_pic_id + 1 : 0;
+
+        hpic->primary_pic_type = 0;
+        hpic->slice_type       = 7;
     } else {
-        priv->frame_num      = priv->next_frame_num;
+        av_assert0(prev);
 
-        if (pic->type != PICTURE_TYPE_B) {
-            // Reference picture, so frame_num advances.
-            priv->next_frame_num = (priv->frame_num + 1) &
-                ((1 << (4 + sps->log2_max_frame_num_minus4)) - 1);
-        }
-        ++priv->cpb_delay;
+        hpic->frame_num = hprev->frame_num + prev->is_reference;
+
+        hpic->last_idr_frame = hprev->last_idr_frame;
+        hpic->idr_pic_id     = hprev->idr_pic_id;
 
         if (pic->type == PICTURE_TYPE_I) {
-            priv->slice_type       = 7;
-            priv->primary_pic_type = 0;
+            hpic->slice_type       = 7;
+            hpic->primary_pic_type = 0;
         } else if (pic->type == PICTURE_TYPE_P) {
-            priv->slice_type       = 5;
-            priv->primary_pic_type = 1;
+            hpic->slice_type       = 5;
+            hpic->primary_pic_type = 1;
         } else {
-            priv->slice_type       = 6;
-            priv->primary_pic_type = 2;
+            hpic->slice_type       = 6;
+            hpic->primary_pic_type = 2;
         }
     }
-    priv->pic_order_cnt = pic->display_order - priv->last_idr_frame;
-    priv->dpb_delay     = pic->display_order - pic->encode_order + 1;
+    hpic->pic_order_cnt = pic->display_order - hpic->last_idr_frame;
+    hpic->dpb_delay     = pic->display_order - pic->encode_order + ctx->max_b_depth;
+    hpic->cpb_delay     = pic->encode_order - hpic->last_idr_frame;
 
     if (priv->aud) {
         priv->aud_needed = 1;
@@ -662,7 +666,7 @@
             .nal_unit_header = {
                 .nal_unit_type = H264_NAL_AUD,
             },
-            .primary_pic_type  = priv->primary_pic_type,
+            .primary_pic_type  = hpic->primary_pic_type,
         };
     } else {
         priv->aud_needed = 0;
@@ -679,8 +683,8 @@
 
     if (priv->sei & SEI_TIMING) {
         priv->sei_pic_timing = (H264RawSEIPicTiming) {
-            .cpb_removal_delay = 2 * priv->cpb_delay,
-            .dpb_output_delay  = 2 * priv->dpb_delay,
+            .cpb_removal_delay = 2 * hpic->cpb_delay,
+            .dpb_output_delay  = 2 * hpic->dpb_delay,
         };
 
         priv->sei_needed |= SEI_TIMING;
@@ -698,25 +702,25 @@
 
     vpic->CurrPic = (VAPictureH264) {
         .picture_id          = pic->recon_surface,
-        .frame_idx           = priv->frame_num,
+        .frame_idx           = hpic->frame_num,
         .flags               = 0,
-        .TopFieldOrderCnt    = priv->pic_order_cnt,
-        .BottomFieldOrderCnt = priv->pic_order_cnt,
+        .TopFieldOrderCnt    = hpic->pic_order_cnt,
+        .BottomFieldOrderCnt = hpic->pic_order_cnt,
     };
 
     for (i = 0; i < pic->nb_refs; i++) {
-        VAAPIEncodePicture *ref = pic->refs[i];
-        unsigned int frame_num = (ref->encode_order - priv->last_idr_frame) &
-            ((1 << (4 + sps->log2_max_frame_num_minus4)) - 1);
-        unsigned int pic_order_cnt = ref->display_order - priv->last_idr_frame;
+        VAAPIEncodePicture      *ref = pic->refs[i];
+        VAAPIEncodeH264Picture *href;
 
         av_assert0(ref && ref->encode_order < pic->encode_order);
+        href = ref->priv_data;
+
         vpic->ReferenceFrames[i] = (VAPictureH264) {
             .picture_id          = ref->recon_surface,
-            .frame_idx           = frame_num,
+            .frame_idx           = href->frame_num,
             .flags               = VA_PICTURE_H264_SHORT_TERM_REFERENCE,
-            .TopFieldOrderCnt    = pic_order_cnt,
-            .BottomFieldOrderCnt = pic_order_cnt,
+            .TopFieldOrderCnt    = href->pic_order_cnt,
+            .BottomFieldOrderCnt = href->pic_order_cnt,
         };
     }
     for (; i < FF_ARRAY_ELEMS(vpic->ReferenceFrames); i++) {
@@ -728,46 +732,142 @@
 
     vpic->coded_buf = pic->output_buffer;
 
-    vpic->frame_num = priv->frame_num;
+    vpic->frame_num = hpic->frame_num;
 
     vpic->pic_fields.bits.idr_pic_flag       = (pic->type == PICTURE_TYPE_IDR);
     vpic->pic_fields.bits.reference_pic_flag = (pic->type != PICTURE_TYPE_B);
 
-    pic->nb_slices = 1;
-
     return 0;
 }
 
+static void vaapi_encode_h264_default_ref_pic_list(AVCodecContext *avctx,
+                                                   VAAPIEncodePicture *pic,
+                                                   VAAPIEncodePicture **rpl0,
+                                                   VAAPIEncodePicture **rpl1,
+                                                   int *rpl_size)
+{
+    VAAPIEncodePicture *prev;
+    VAAPIEncodeH264Picture *hp, *hn, *hc;
+    int i, j, n = 0;
+
+    prev = pic->prev;
+    av_assert0(prev);
+    hp = pic->priv_data;
+
+    for (i = 0; i < pic->prev->nb_dpb_pics; i++) {
+        hn = prev->dpb[i]->priv_data;
+        av_assert0(hn->frame_num < hp->frame_num);
+
+        if (pic->type == PICTURE_TYPE_P) {
+            for (j = n; j > 0; j--) {
+                hc = rpl0[j - 1]->priv_data;
+                av_assert0(hc->frame_num != hn->frame_num);
+                if (hc->frame_num > hn->frame_num)
+                    break;
+                rpl0[j] = rpl0[j - 1];
+            }
+            rpl0[j] = prev->dpb[i];
+
+        } else if (pic->type == PICTURE_TYPE_B) {
+            for (j = n; j > 0; j--) {
+                hc = rpl0[j - 1]->priv_data;
+                av_assert0(hc->pic_order_cnt != hp->pic_order_cnt);
+                if (hc->pic_order_cnt < hp->pic_order_cnt) {
+                    if (hn->pic_order_cnt > hp->pic_order_cnt ||
+                        hn->pic_order_cnt < hc->pic_order_cnt)
+                        break;
+                } else {
+                    if (hn->pic_order_cnt > hc->pic_order_cnt)
+                        break;
+                }
+                rpl0[j] = rpl0[j - 1];
+            }
+            rpl0[j] = prev->dpb[i];
+
+            for (j = n; j > 0; j--) {
+                hc = rpl1[j - 1]->priv_data;
+                av_assert0(hc->pic_order_cnt != hp->pic_order_cnt);
+                if (hc->pic_order_cnt > hp->pic_order_cnt) {
+                    if (hn->pic_order_cnt < hp->pic_order_cnt ||
+                        hn->pic_order_cnt > hc->pic_order_cnt)
+                        break;
+                } else {
+                    if (hn->pic_order_cnt < hc->pic_order_cnt)
+                        break;
+                }
+                rpl1[j] = rpl1[j - 1];
+            }
+            rpl1[j] = prev->dpb[i];
+        }
+
+        ++n;
+    }
+
+    if (pic->type == PICTURE_TYPE_B) {
+        for (i = 0; i < n; i++) {
+            if (rpl0[i] != rpl1[i])
+                break;
+        }
+        if (i == n)
+            FFSWAP(VAAPIEncodePicture*, rpl1[0], rpl1[1]);
+    }
+
+    if (pic->type == PICTURE_TYPE_P ||
+        pic->type == PICTURE_TYPE_B) {
+        av_log(avctx, AV_LOG_DEBUG, "Default RefPicList0 for fn=%d/poc=%d:",
+               hp->frame_num, hp->pic_order_cnt);
+        for (i = 0; i < n; i++) {
+            hn = rpl0[i]->priv_data;
+            av_log(avctx, AV_LOG_DEBUG, "  fn=%d/poc=%d",
+                   hn->frame_num, hn->pic_order_cnt);
+        }
+        av_log(avctx, AV_LOG_DEBUG, "\n");
+    }
+    if (pic->type == PICTURE_TYPE_B) {
+        av_log(avctx, AV_LOG_DEBUG, "Default RefPicList1 for fn=%d/poc=%d:",
+               hp->frame_num, hp->pic_order_cnt);
+        for (i = 0; i < n; i++) {
+            hn = rpl1[i]->priv_data;
+            av_log(avctx, AV_LOG_DEBUG, "  fn=%d/poc=%d",
+                   hn->frame_num, hn->pic_order_cnt);
+        }
+        av_log(avctx, AV_LOG_DEBUG, "\n");
+    }
+
+    *rpl_size = n;
+}
+
 static int vaapi_encode_h264_init_slice_params(AVCodecContext *avctx,
                                                VAAPIEncodePicture *pic,
                                                VAAPIEncodeSlice *slice)
 {
     VAAPIEncodeH264Context          *priv = avctx->priv_data;
+    VAAPIEncodeH264Picture          *hpic = pic->priv_data;
+    VAAPIEncodePicture              *prev = pic->prev;
     H264RawSPS                       *sps = &priv->raw_sps;
     H264RawPPS                       *pps = &priv->raw_pps;
     H264RawSliceHeader                *sh = &priv->raw_slice.header;
     VAEncPictureParameterBufferH264 *vpic = pic->codec_picture_params;
     VAEncSliceParameterBufferH264 *vslice = slice->codec_slice_params;
-    int i;
+    int i, j;
 
     if (pic->type == PICTURE_TYPE_IDR) {
         sh->nal_unit_header.nal_unit_type = H264_NAL_IDR_SLICE;
         sh->nal_unit_header.nal_ref_idc   = 3;
     } else {
         sh->nal_unit_header.nal_unit_type = H264_NAL_SLICE;
-        sh->nal_unit_header.nal_ref_idc   = pic->type != PICTURE_TYPE_B;
+        sh->nal_unit_header.nal_ref_idc   = pic->is_reference;
     }
 
-    // Only one slice per frame.
-    sh->first_mb_in_slice = 0;
-    sh->slice_type        = priv->slice_type;
+    sh->first_mb_in_slice = slice->block_start;
+    sh->slice_type        = hpic->slice_type;
 
     sh->pic_parameter_set_id = pps->pic_parameter_set_id;
 
-    sh->frame_num  = priv->frame_num;
-    sh->idr_pic_id = priv->idr_pic_count;
-
-    sh->pic_order_cnt_lsb = priv->pic_order_cnt &
+    sh->frame_num = hpic->frame_num &
+        ((1 << (4 + sps->log2_max_frame_num_minus4)) - 1);
+    sh->idr_pic_id = hpic->idr_pic_id;
+    sh->pic_order_cnt_lsb = hpic->pic_order_cnt &
         ((1 << (4 + sps->log2_max_pic_order_cnt_lsb_minus4)) - 1);
 
     sh->direct_spatial_mv_pred_flag = 1;
@@ -779,9 +879,149 @@
     else
         sh->slice_qp_delta = priv->fixed_qp_idr - (pps->pic_init_qp_minus26 + 26);
 
+    if (pic->is_reference && pic->type != PICTURE_TYPE_IDR) {
+        VAAPIEncodePicture *discard_list[MAX_DPB_SIZE];
+        int discard = 0, keep = 0;
 
-    vslice->macroblock_address = sh->first_mb_in_slice;
-    vslice->num_macroblocks    = priv->mb_width * priv->mb_height;
+        // Discard everything which is in the DPB of the previous frame but
+        // not in the DPB of this one.
+        for (i = 0; i < prev->nb_dpb_pics; i++) {
+            for (j = 0; j < pic->nb_dpb_pics; j++) {
+                if (prev->dpb[i] == pic->dpb[j])
+                    break;
+            }
+            if (j == pic->nb_dpb_pics) {
+                discard_list[discard] = prev->dpb[i];
+                ++discard;
+            } else {
+                ++keep;
+            }
+        }
+        av_assert0(keep <= priv->dpb_frames);
+
+        if (discard == 0) {
+            sh->adaptive_ref_pic_marking_mode_flag = 0;
+        } else {
+            sh->adaptive_ref_pic_marking_mode_flag = 1;
+            for (i = 0; i < discard; i++) {
+                VAAPIEncodeH264Picture *old = discard_list[i]->priv_data;
+                av_assert0(old->frame_num < hpic->frame_num);
+                sh->mmco[i].memory_management_control_operation = 1;
+                sh->mmco[i].difference_of_pic_nums_minus1 =
+                    hpic->frame_num - old->frame_num - 1;
+            }
+            sh->mmco[i].memory_management_control_operation = 0;
+        }
+    }
+
+    // If the intended references are not the first entries of RefPicListN
+    // by default, use ref-pic-list-modification to move them there.
+    if (pic->type == PICTURE_TYPE_P || pic->type == PICTURE_TYPE_B) {
+        VAAPIEncodePicture *def_l0[MAX_DPB_SIZE], *def_l1[MAX_DPB_SIZE];
+        VAAPIEncodeH264Picture *href;
+        int n;
+
+        vaapi_encode_h264_default_ref_pic_list(avctx, pic,
+                                               def_l0, def_l1, &n);
+
+        if (pic->type == PICTURE_TYPE_P) {
+            int need_rplm = 0;
+            for (i = 0; i < pic->nb_refs; i++) {
+                av_assert0(pic->refs[i]);
+                if (pic->refs[i] != def_l0[i])
+                    need_rplm = 1;
+            }
+
+            sh->ref_pic_list_modification_flag_l0 = need_rplm;
+            if (need_rplm) {
+                int pic_num = hpic->frame_num;
+                for (i = 0; i < pic->nb_refs; i++) {
+                    href = pic->refs[i]->priv_data;
+                    av_assert0(href->frame_num != pic_num);
+                    if (href->frame_num < pic_num) {
+                        sh->rplm_l0[i].modification_of_pic_nums_idc = 0;
+                        sh->rplm_l0[i].abs_diff_pic_num_minus1 =
+                            pic_num - href->frame_num - 1;
+                    } else {
+                        sh->rplm_l0[i].modification_of_pic_nums_idc = 1;
+                        sh->rplm_l0[i].abs_diff_pic_num_minus1 =
+                            href->frame_num - pic_num - 1;
+                    }
+                    pic_num = href->frame_num;
+                }
+                sh->rplm_l0[i].modification_of_pic_nums_idc = 3;
+            }
+
+        } else {
+            int need_rplm_l0 = 0, need_rplm_l1 = 0;
+            int n0 = 0, n1 = 0;
+            for (i = 0; i < pic->nb_refs; i++) {
+                av_assert0(pic->refs[i]);
+                href = pic->refs[i]->priv_data;
+                av_assert0(href->pic_order_cnt != hpic->pic_order_cnt);
+                if (href->pic_order_cnt < hpic->pic_order_cnt) {
+                    if (pic->refs[i] != def_l0[n0])
+                        need_rplm_l0 = 1;
+                    ++n0;
+                } else {
+                    if (pic->refs[i] != def_l1[n1])
+                        need_rplm_l1 = 1;
+                    ++n1;
+                }
+            }
+
+            sh->ref_pic_list_modification_flag_l0 = need_rplm_l0;
+            if (need_rplm_l0) {
+                int pic_num = hpic->frame_num;
+                for (i = j = 0; i < pic->nb_refs; i++) {
+                    href = pic->refs[i]->priv_data;
+                    if (href->pic_order_cnt > hpic->pic_order_cnt)
+                        continue;
+                    av_assert0(href->frame_num != pic_num);
+                    if (href->frame_num < pic_num) {
+                        sh->rplm_l0[j].modification_of_pic_nums_idc = 0;
+                        sh->rplm_l0[j].abs_diff_pic_num_minus1 =
+                            pic_num - href->frame_num - 1;
+                    } else {
+                        sh->rplm_l0[j].modification_of_pic_nums_idc = 1;
+                        sh->rplm_l0[j].abs_diff_pic_num_minus1 =
+                            href->frame_num - pic_num - 1;
+                    }
+                    pic_num = href->frame_num;
+                    ++j;
+                }
+                av_assert0(j == n0);
+                sh->rplm_l0[j].modification_of_pic_nums_idc = 3;
+            }
+
+            sh->ref_pic_list_modification_flag_l1 = need_rplm_l1;
+            if (need_rplm_l1) {
+                int pic_num = hpic->frame_num;
+                for (i = j = 0; i < pic->nb_refs; i++) {
+                    href = pic->refs[i]->priv_data;
+                    if (href->pic_order_cnt < hpic->pic_order_cnt)
+                        continue;
+                    av_assert0(href->frame_num != pic_num);
+                    if (href->frame_num < pic_num) {
+                        sh->rplm_l1[j].modification_of_pic_nums_idc = 0;
+                        sh->rplm_l1[j].abs_diff_pic_num_minus1 =
+                            pic_num - href->frame_num - 1;
+                    } else {
+                        sh->rplm_l1[j].modification_of_pic_nums_idc = 1;
+                        sh->rplm_l1[j].abs_diff_pic_num_minus1 =
+                            href->frame_num - pic_num - 1;
+                    }
+                    pic_num = href->frame_num;
+                    ++j;
+                }
+                av_assert0(j == n1);
+                sh->rplm_l1[j].modification_of_pic_nums_idc = 3;
+            }
+        }
+    }
+
+    vslice->macroblock_address = slice->block_start;
+    vslice->num_macroblocks    = slice->block_size;
 
     vslice->macroblock_info = VA_INVALID_ID;
 
@@ -832,33 +1072,34 @@
     priv->mb_height = FFALIGN(avctx->height, 16) / 16;
 
     if (ctx->va_rc_mode == VA_RC_CQP) {
-        priv->fixed_qp_p = priv->qp;
+        priv->fixed_qp_p = av_clip(ctx->rc_quality, 1, 51);
         if (avctx->i_quant_factor > 0.0)
-            priv->fixed_qp_idr = (int)((priv->fixed_qp_p * avctx->i_quant_factor +
-                                        avctx->i_quant_offset) + 0.5);
+            priv->fixed_qp_idr =
+                av_clip((avctx->i_quant_factor * priv->fixed_qp_p +
+                         avctx->i_quant_offset) + 0.5, 1, 51);
         else
             priv->fixed_qp_idr = priv->fixed_qp_p;
         if (avctx->b_quant_factor > 0.0)
-            priv->fixed_qp_b = (int)((priv->fixed_qp_p * avctx->b_quant_factor +
-                                      avctx->b_quant_offset) + 0.5);
+            priv->fixed_qp_b =
+                av_clip((avctx->b_quant_factor * priv->fixed_qp_p +
+                         avctx->b_quant_offset) + 0.5, 1, 51);
         else
             priv->fixed_qp_b = priv->fixed_qp_p;
 
-        priv->sei &= ~SEI_TIMING;
-
         av_log(avctx, AV_LOG_DEBUG, "Using fixed QP = "
                "%d / %d / %d for IDR- / P- / B-frames.\n",
                priv->fixed_qp_idr, priv->fixed_qp_p, priv->fixed_qp_b);
 
-    } else if (ctx->va_rc_mode == VA_RC_CBR ||
-               ctx->va_rc_mode == VA_RC_VBR) {
+    } else {
         // These still need to be  set for pic_init_qp/slice_qp_delta.
         priv->fixed_qp_idr = 26;
         priv->fixed_qp_p   = 26;
         priv->fixed_qp_b   = 26;
+    }
 
-    } else {
-        av_assert0(0 && "Invalid RC mode.");
+    if (!ctx->rc_mode->hrd) {
+        // Timing SEI requires a mode respecting HRD parameters.
+        priv->sei &= ~SEI_TIMING;
     }
 
     if (priv->sei & SEI_IDENTIFIER) {
@@ -889,6 +1130,8 @@
         }
     }
 
+    ctx->roi_quant_range = 51 + 6 * (ctx->profile->depth - 8);
+
     return 0;
 }
 
@@ -903,8 +1146,17 @@
 static const VAAPIEncodeType vaapi_encode_type_h264 = {
     .profiles              = vaapi_encode_h264_profiles,
 
+    .flags                 = FLAG_SLICE_CONTROL |
+                             FLAG_B_PICTURES |
+                             FLAG_B_PICTURE_REFERENCES |
+                             FLAG_NON_IDR_KEY_PICTURES,
+
+    .default_quality       = 20,
+
     .configure             = &vaapi_encode_h264_configure,
 
+    .picture_priv_data_size = sizeof(VAAPIEncodeH264Picture),
+
     .sequence_params_size  = sizeof(VAEncSequenceParameterBufferH264),
     .init_sequence_params  = &vaapi_encode_h264_init_sequence_params,
 
@@ -978,6 +1230,11 @@
     ctx->surface_width  = FFALIGN(avctx->width,  16);
     ctx->surface_height = FFALIGN(avctx->height, 16);
 
+    ctx->slice_block_height = ctx->slice_block_width = 16;
+
+    if (priv->qp > 0)
+        ctx->explicit_qp = priv->qp;
+
     return ff_vaapi_encode_init(avctx);
 }
 
@@ -985,6 +1242,7 @@
 {
     VAAPIEncodeH264Context *priv = avctx->priv_data;
 
+    ff_cbs_fragment_free(priv->cbc, &priv->current_access_unit);
     ff_cbs_close(&priv->cbc);
     av_freep(&priv->sei_identifier_string);
 
@@ -995,9 +1253,10 @@
 #define FLAGS (AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM)
 static const AVOption vaapi_encode_h264_options[] = {
     VAAPI_ENCODE_COMMON_OPTIONS,
+    VAAPI_ENCODE_RC_OPTIONS,
 
     { "qp", "Constant QP (for P-frames; scaled by qfactor/qoffset for I/B)",
-      OFFSET(qp), AV_OPT_TYPE_INT, { .i64 = 20 }, 0, 52, FLAGS },
+      OFFSET(qp), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 52, FLAGS },
     { "quality", "Set encode quality (trades off against speed, higher is faster)",
       OFFSET(quality), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, INT_MAX, FLAGS },
     { "coder", "Entropy coder type",
@@ -1092,7 +1351,8 @@
     .id             = AV_CODEC_ID_H264,
     .priv_data_size = sizeof(VAAPIEncodeH264Context),
     .init           = &vaapi_encode_h264_init,
-    .encode2        = &ff_vaapi_encode2,
+    .send_frame     = &ff_vaapi_encode_send_frame,
+    .receive_packet = &ff_vaapi_encode_receive_packet,
     .close          = &vaapi_encode_h264_close,
     .priv_class     = &vaapi_encode_h264_class,
     .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_HARDWARE,
diff --git a/libavcodec/vaapi_encode_h265.c b/libavcodec/vaapi_encode_h265.c
index 10312fb..97dc5a7 100644
--- a/libavcodec/vaapi_encode_h265.c
+++ b/libavcodec/vaapi_encode_h265.c
@@ -42,6 +42,16 @@
     SEI_CONTENT_LIGHT_LEVEL     = 0x10,
 };
 
+typedef struct VAAPIEncodeH265Picture {
+    int pic_order_cnt;
+
+    int64_t last_idr_frame;
+
+    int slice_nal_unit;
+    int slice_type;
+    int pic_type;
+} VAAPIEncodeH265Picture;
+
 typedef struct VAAPIEncodeH265Context {
     VAAPIEncodeContext common;
 
@@ -54,21 +64,10 @@
     int sei;
 
     // Derived settings.
-    unsigned int ctu_width;
-    unsigned int ctu_height;
-
     int fixed_qp_idr;
     int fixed_qp_p;
     int fixed_qp_b;
 
-    // Stream state.
-    int64_t last_idr_frame;
-    int pic_order_cnt;
-
-    int slice_nal_unit;
-    int slice_type;
-    int pic_type;
-
     // Writer structures.
     H265RawAUD   raw_aud;
     H265RawVPS   raw_vps;
@@ -160,7 +159,7 @@
 
     err = vaapi_encode_h265_write_access_unit(avctx, data, data_len, au);
 fail:
-    ff_cbs_fragment_uninit(priv->cbc, au);
+    ff_cbs_fragment_reset(priv->cbc, au);
     return err;
 }
 
@@ -186,7 +185,7 @@
 
     err = vaapi_encode_h265_write_access_unit(avctx, data, data_len, au);
 fail:
-    ff_cbs_fragment_uninit(priv->cbc, au);
+    ff_cbs_fragment_reset(priv->cbc, au);
     return err;
 }
 
@@ -243,7 +242,7 @@
         if (err < 0)
             goto fail;
 
-        ff_cbs_fragment_uninit(priv->cbc, au);
+        ff_cbs_fragment_reset(priv->cbc, au);
 
         *type = VAEncPackedHeaderRawData;
         return 0;
@@ -252,7 +251,7 @@
     }
 
 fail:
-    ff_cbs_fragment_uninit(priv->cbc, au);
+    ff_cbs_fragment_reset(priv->cbc, au);
     return err;
 }
 
@@ -271,9 +270,6 @@
     int chroma_format, bit_depth;
     int i;
 
-    memset(&priv->current_access_unit, 0,
-           sizeof(priv->current_access_unit));
-
     memset(vps, 0, sizeof(*vps));
     memset(sps, 0, sizeof(*sps));
     memset(pps, 0, sizeof(*pps));
@@ -349,7 +345,8 @@
 
         level = ff_h265_guess_level(ptl, avctx->bit_rate,
                                     ctx->surface_width, ctx->surface_height,
-                                    1, 1, 1, (ctx->b_per_p > 0) + 1);
+                                    ctx->nb_slices, 1, 1,
+                                    (ctx->b_per_p > 0) + 1);
         if (level) {
             av_log(avctx, AV_LOG_VERBOSE, "Using level %s.\n", level->name);
             ptl->general_level_idc = level->level_idc;
@@ -363,8 +360,8 @@
     }
 
     vps->vps_sub_layer_ordering_info_present_flag = 0;
-    vps->vps_max_dec_pic_buffering_minus1[0]      = (ctx->b_per_p > 0) + 1;
-    vps->vps_max_num_reorder_pics[0]              = (ctx->b_per_p > 0);
+    vps->vps_max_dec_pic_buffering_minus1[0]      = ctx->max_b_depth + 1;
+    vps->vps_max_num_reorder_pics[0]              = ctx->max_b_depth;
     vps->vps_max_latency_increase_plus1[0]        = 0;
 
     vps->vps_max_layer_id             = 0;
@@ -413,10 +410,10 @@
         sps->conformance_window_flag = 1;
         sps->conf_win_left_offset   = 0;
         sps->conf_win_right_offset  =
-            (ctx->surface_width - avctx->width) / 2;
+            (ctx->surface_width - avctx->width) >> desc->log2_chroma_w;
         sps->conf_win_top_offset    = 0;
         sps->conf_win_bottom_offset =
-            (ctx->surface_height - avctx->height) / 2;
+            (ctx->surface_height - avctx->height) >> desc->log2_chroma_h;
     } else {
         sps->conformance_window_flag = 0;
     }
@@ -474,18 +471,20 @@
             {  80, 33 }, {  18, 11 }, {  15, 11 }, {  64, 33 },
             { 160, 99 }, {   4,  3 }, {   3,  2 }, {   2,  1 },
         };
-        int i;
+        int num, den, i;
+        av_reduce(&num, &den, avctx->sample_aspect_ratio.num,
+                  avctx->sample_aspect_ratio.den, 65535);
         for (i = 0; i < FF_ARRAY_ELEMS(sar_idc); i++) {
-            if (avctx->sample_aspect_ratio.num == sar_idc[i].num &&
-                avctx->sample_aspect_ratio.den == sar_idc[i].den) {
+            if (num == sar_idc[i].num &&
+                den == sar_idc[i].den) {
                 vui->aspect_ratio_idc = i;
                 break;
             }
         }
         if (i >= FF_ARRAY_ELEMS(sar_idc)) {
             vui->aspect_ratio_idc = 255;
-            vui->sar_width  = avctx->sample_aspect_ratio.num;
-            vui->sar_height = avctx->sample_aspect_ratio.den;
+            vui->sar_width  = num;
+            vui->sar_height = den;
         }
         vui->aspect_ratio_info_present_flag = 1;
     }
@@ -673,41 +672,54 @@
 static int vaapi_encode_h265_init_picture_params(AVCodecContext *avctx,
                                                  VAAPIEncodePicture *pic)
 {
+    VAAPIEncodeContext               *ctx = avctx->priv_data;
     VAAPIEncodeH265Context          *priv = avctx->priv_data;
+    VAAPIEncodeH265Picture          *hpic = pic->priv_data;
+    VAAPIEncodePicture              *prev = pic->prev;
+    VAAPIEncodeH265Picture         *hprev = prev ? prev->priv_data : NULL;
     VAEncPictureParameterBufferHEVC *vpic = pic->codec_picture_params;
     int i;
 
     if (pic->type == PICTURE_TYPE_IDR) {
         av_assert0(pic->display_order == pic->encode_order);
 
-        priv->last_idr_frame = pic->display_order;
+        hpic->last_idr_frame = pic->display_order;
 
-        priv->slice_nal_unit = HEVC_NAL_IDR_W_RADL;
-        priv->slice_type     = HEVC_SLICE_I;
-        priv->pic_type       = 0;
+        hpic->slice_nal_unit = HEVC_NAL_IDR_W_RADL;
+        hpic->slice_type     = HEVC_SLICE_I;
+        hpic->pic_type       = 0;
     } else {
-        av_assert0(pic->encode_order > priv->last_idr_frame);
+        av_assert0(prev);
+        hpic->last_idr_frame = hprev->last_idr_frame;
 
         if (pic->type == PICTURE_TYPE_I) {
-            priv->slice_nal_unit = HEVC_NAL_CRA_NUT;
-            priv->slice_type     = HEVC_SLICE_I;
-            priv->pic_type       = 0;
+            hpic->slice_nal_unit = HEVC_NAL_CRA_NUT;
+            hpic->slice_type     = HEVC_SLICE_I;
+            hpic->pic_type       = 0;
         } else if (pic->type == PICTURE_TYPE_P) {
             av_assert0(pic->refs[0]);
-            priv->slice_nal_unit = HEVC_NAL_TRAIL_R;
-            priv->slice_type     = HEVC_SLICE_P;
-            priv->pic_type       = 1;
+            hpic->slice_nal_unit = HEVC_NAL_TRAIL_R;
+            hpic->slice_type     = HEVC_SLICE_P;
+            hpic->pic_type       = 1;
         } else {
+            VAAPIEncodePicture *irap_ref;
             av_assert0(pic->refs[0] && pic->refs[1]);
-            if (pic->refs[1]->type == PICTURE_TYPE_I)
-                priv->slice_nal_unit = HEVC_NAL_RASL_N;
-            else
-                priv->slice_nal_unit = HEVC_NAL_TRAIL_N;
-            priv->slice_type = HEVC_SLICE_B;
-            priv->pic_type   = 2;
+            for (irap_ref = pic; irap_ref; irap_ref = irap_ref->refs[1]) {
+                if (irap_ref->type == PICTURE_TYPE_I)
+                    break;
+            }
+            if (pic->b_depth == ctx->max_b_depth) {
+                hpic->slice_nal_unit = irap_ref ? HEVC_NAL_RASL_N
+                                                : HEVC_NAL_TRAIL_N;
+            } else {
+                hpic->slice_nal_unit = irap_ref ? HEVC_NAL_RASL_R
+                                                : HEVC_NAL_TRAIL_R;
+            }
+            hpic->slice_type = HEVC_SLICE_B;
+            hpic->pic_type   = 2;
         }
     }
-    priv->pic_order_cnt = pic->display_order - priv->last_idr_frame;
+    hpic->pic_order_cnt = pic->display_order - hpic->last_idr_frame;
 
     if (priv->aud) {
         priv->aud_needed = 1;
@@ -717,7 +729,7 @@
                 .nuh_layer_id          = 0,
                 .nuh_temporal_id_plus1 = 1,
             },
-            .pic_type = priv->pic_type,
+            .pic_type = hpic->pic_type,
         };
     } else {
         priv->aud_needed = 0;
@@ -797,17 +809,20 @@
 
     vpic->decoded_curr_pic = (VAPictureHEVC) {
         .picture_id    = pic->recon_surface,
-        .pic_order_cnt = priv->pic_order_cnt,
+        .pic_order_cnt = hpic->pic_order_cnt,
         .flags         = 0,
     };
 
     for (i = 0; i < pic->nb_refs; i++) {
-        VAAPIEncodePicture *ref = pic->refs[i];
+        VAAPIEncodePicture      *ref = pic->refs[i];
+        VAAPIEncodeH265Picture *href;
+
         av_assert0(ref && ref->encode_order < pic->encode_order);
+        href = ref->priv_data;
 
         vpic->reference_frames[i] = (VAPictureHEVC) {
             .picture_id    = ref->recon_surface,
-            .pic_order_cnt = ref->display_order - priv->last_idr_frame,
+            .pic_order_cnt = href->pic_order_cnt,
             .flags = (ref->display_order < pic->display_order ?
                       VA_PICTURE_HEVC_RPS_ST_CURR_BEFORE : 0) |
                      (ref->display_order > pic->display_order ?
@@ -823,7 +838,7 @@
 
     vpic->coded_buf = pic->output_buffer;
 
-    vpic->nal_unit_type = priv->slice_nal_unit;
+    vpic->nal_unit_type = hpic->slice_nal_unit;
 
     switch (pic->type) {
     case PICTURE_TYPE_IDR:
@@ -850,8 +865,6 @@
         av_assert0(0 && "invalid picture type");
     }
 
-    pic->nb_slices = 1;
-
     return 0;
 }
 
@@ -859,8 +872,8 @@
                                                VAAPIEncodePicture *pic,
                                                VAAPIEncodeSlice *slice)
 {
-    VAAPIEncodeContext                *ctx = avctx->priv_data;
     VAAPIEncodeH265Context           *priv = avctx->priv_data;
+    VAAPIEncodeH265Picture           *hpic = pic->priv_data;
     const H265RawSPS                  *sps = &priv->raw_sps;
     const H265RawPPS                  *pps = &priv->raw_pps;
     H265RawSliceHeader                 *sh = &priv->raw_slice.header;
@@ -869,75 +882,93 @@
     int i;
 
     sh->nal_unit_header = (H265RawNALUnitHeader) {
-        .nal_unit_type         = priv->slice_nal_unit,
+        .nal_unit_type         = hpic->slice_nal_unit,
         .nuh_layer_id          = 0,
         .nuh_temporal_id_plus1 = 1,
     };
 
     sh->slice_pic_parameter_set_id      = pps->pps_pic_parameter_set_id;
 
-    // Currently we only support one slice per frame.
-    sh->first_slice_segment_in_pic_flag = 1;
-    sh->slice_segment_address           = 0;
+    sh->first_slice_segment_in_pic_flag = slice->index == 0;
+    sh->slice_segment_address           = slice->block_start;
 
-    sh->slice_type = priv->slice_type;
+    sh->slice_type = hpic->slice_type;
 
-    sh->slice_pic_order_cnt_lsb = priv->pic_order_cnt &
+    sh->slice_pic_order_cnt_lsb = hpic->pic_order_cnt &
         (1 << (sps->log2_max_pic_order_cnt_lsb_minus4 + 4)) - 1;
 
     if (pic->type != PICTURE_TYPE_IDR) {
         H265RawSTRefPicSet *rps;
-        VAAPIEncodePicture *st;
-        int used;
+        const VAAPIEncodeH265Picture *strp;
+        int rps_poc[MAX_DPB_SIZE];
+        int rps_used[MAX_DPB_SIZE];
+        int i, j, poc, rps_pics;
 
         sh->short_term_ref_pic_set_sps_flag = 0;
 
         rps = &sh->short_term_ref_pic_set;
         memset(rps, 0, sizeof(*rps));
 
-        for (st = ctx->pic_start; st; st = st->next) {
-            if (st->encode_order >= pic->encode_order) {
-                // Not yet in DPB.
+        rps_pics = 0;
+        for (i = 0; i < pic->nb_refs; i++) {
+            strp = pic->refs[i]->priv_data;
+            rps_poc[rps_pics]  = strp->pic_order_cnt;
+            rps_used[rps_pics] = 1;
+            ++rps_pics;
+        }
+        for (i = 0; i < pic->nb_dpb_pics; i++) {
+            if (pic->dpb[i] == pic)
                 continue;
+            for (j = 0; j < pic->nb_refs; j++) {
+                if (pic->dpb[i] == pic->refs[j])
+                    break;
             }
-            used = 0;
-            for (i = 0; i < pic->nb_refs; i++) {
-                if (pic->refs[i] == st)
-                    used = 1;
+            if (j < pic->nb_refs)
+                continue;
+            strp = pic->dpb[i]->priv_data;
+            rps_poc[rps_pics]  = strp->pic_order_cnt;
+            rps_used[rps_pics] = 0;
+            ++rps_pics;
+        }
+
+        for (i = 1; i < rps_pics; i++) {
+            for (j = i; j > 0; j--) {
+                if (rps_poc[j] > rps_poc[j - 1])
+                    break;
+                av_assert0(rps_poc[j] != rps_poc[j - 1]);
+                FFSWAP(int, rps_poc[j],  rps_poc[j - 1]);
+                FFSWAP(int, rps_used[j], rps_used[j - 1]);
             }
-            if (!used) {
-                // Usually each picture always uses all of the others in the
-                // DPB as references.  The one case we have to treat here is
-                // a non-IDR IRAP picture, which may need to hold unused
-                // references across itself to be used for the decoding of
-                // following RASL pictures.  This looks for such an RASL
-                // picture, and keeps the reference if there is one.
-                VAAPIEncodePicture *rp;
-                for (rp = ctx->pic_start; rp; rp = rp->next) {
-                    if (rp->encode_order < pic->encode_order)
-                        continue;
-                    if (rp->type != PICTURE_TYPE_B)
-                        continue;
-                    if (rp->refs[0] == st && rp->refs[1] == pic)
-                        break;
-                }
-                if (!rp)
-                    continue;
-            }
-            // This only works for one instance of each (delta_poc_sN_minus1
-            // is relative to the previous frame in the list, not relative to
-            // the current frame directly).
-            if (st->display_order < pic->display_order) {
-                rps->delta_poc_s0_minus1[rps->num_negative_pics] =
-                    pic->display_order - st->display_order - 1;
-                rps->used_by_curr_pic_s0_flag[rps->num_negative_pics] = used;
-                ++rps->num_negative_pics;
-            } else {
-                rps->delta_poc_s1_minus1[rps->num_positive_pics] =
-                    st->display_order - pic->display_order - 1;
-                rps->used_by_curr_pic_s1_flag[rps->num_positive_pics] = used;
-                ++rps->num_positive_pics;
-            }
+        }
+
+        av_log(avctx, AV_LOG_DEBUG, "RPS for POC %d:",
+               hpic->pic_order_cnt);
+        for (i = 0; i < rps_pics; i++) {
+            av_log(avctx, AV_LOG_DEBUG, " (%d,%d)",
+                   rps_poc[i], rps_used[i]);
+        }
+        av_log(avctx, AV_LOG_DEBUG, "\n");
+
+        for (i = 0; i < rps_pics; i++) {
+            av_assert0(rps_poc[i] != hpic->pic_order_cnt);
+            if (rps_poc[i] > hpic->pic_order_cnt)
+                break;
+        }
+
+        rps->num_negative_pics = i;
+        poc = hpic->pic_order_cnt;
+        for (j = i - 1; j >= 0; j--) {
+            rps->delta_poc_s0_minus1[i - 1 - j] = poc - rps_poc[j] - 1;
+            rps->used_by_curr_pic_s0_flag[i - 1 - j] = rps_used[j];
+            poc = rps_poc[j];
+        }
+
+        rps->num_positive_pics = rps_pics - i;
+        poc = hpic->pic_order_cnt;
+        for (j = i; j < rps_pics; j++) {
+            rps->delta_poc_s1_minus1[j - i] = rps_poc[j] - poc - 1;
+            rps->used_by_curr_pic_s1_flag[j - i] = rps_used[j];
+            poc = rps_poc[j];
         }
 
         sh->num_long_term_sps  = 0;
@@ -968,7 +999,7 @@
 
     *vslice = (VAEncSliceParameterBufferHEVC) {
         .slice_segment_address = sh->slice_segment_address,
-        .num_ctu_in_slice      = priv->ctu_width * priv->ctu_height,
+        .num_ctu_in_slice      = slice->block_size,
 
         .slice_type                 = sh->slice_type,
         .slice_pic_parameter_set_id = sh->slice_pic_parameter_set_id,
@@ -989,7 +1020,7 @@
         .slice_tc_offset_div2   = sh->slice_tc_offset_div2,
 
         .slice_fields.bits = {
-            .last_slice_of_pic_flag       = 1,
+            .last_slice_of_pic_flag       = slice->index == pic->nb_slices - 1,
             .dependent_slice_segment_flag = sh->dependent_slice_segment_flag,
             .colour_plane_id              = sh->colour_plane_id,
             .slice_temporal_mvp_enabled_flag =
@@ -1041,23 +1072,22 @@
     if (err < 0)
         return err;
 
-    priv->ctu_width     = FFALIGN(ctx->surface_width,  32) / 32;
-    priv->ctu_height    = FFALIGN(ctx->surface_height, 32) / 32;
-
-    av_log(avctx, AV_LOG_VERBOSE, "Input %ux%u -> Surface %ux%u -> CTU %ux%u.\n",
-           avctx->width, avctx->height, ctx->surface_width,
-           ctx->surface_height, priv->ctu_width, priv->ctu_height);
-
     if (ctx->va_rc_mode == VA_RC_CQP) {
-        priv->fixed_qp_p = priv->qp;
+        // Note that VAAPI only supports positive QP values - the range is
+        // therefore always bounded below by 1, even in 10-bit mode where
+        // it should go down to -12.
+
+        priv->fixed_qp_p = av_clip(ctx->rc_quality, 1, 51);
         if (avctx->i_quant_factor > 0.0)
-            priv->fixed_qp_idr = (int)((priv->fixed_qp_p * avctx->i_quant_factor +
-                                        avctx->i_quant_offset) + 0.5);
+            priv->fixed_qp_idr =
+                av_clip((avctx->i_quant_factor * priv->fixed_qp_p +
+                         avctx->i_quant_offset) + 0.5, 1, 51);
         else
             priv->fixed_qp_idr = priv->fixed_qp_p;
         if (avctx->b_quant_factor > 0.0)
-            priv->fixed_qp_b = (int)((priv->fixed_qp_p * avctx->b_quant_factor +
-                                      avctx->b_quant_offset) + 0.5);
+            priv->fixed_qp_b =
+                av_clip((avctx->b_quant_factor * priv->fixed_qp_p +
+                         avctx->b_quant_offset) + 0.5, 1, 51);
         else
             priv->fixed_qp_b = priv->fixed_qp_p;
 
@@ -1065,17 +1095,15 @@
                "%d / %d / %d for IDR- / P- / B-frames.\n",
                priv->fixed_qp_idr, priv->fixed_qp_p, priv->fixed_qp_b);
 
-    } else if (ctx->va_rc_mode == VA_RC_CBR ||
-               ctx->va_rc_mode == VA_RC_VBR) {
-        // These still need to be  set for pic_init_qp/slice_qp_delta.
+    } else {
+        // These still need to be set for init_qp/slice_qp_delta.
         priv->fixed_qp_idr = 30;
         priv->fixed_qp_p   = 30;
         priv->fixed_qp_b   = 30;
-
-    } else {
-        av_assert0(0 && "Invalid RC mode.");
     }
 
+    ctx->roi_quant_range = 51 + 6 * (ctx->profile->depth - 8);
+
     return 0;
 }
 
@@ -1092,8 +1120,17 @@
 static const VAAPIEncodeType vaapi_encode_type_h265 = {
     .profiles              = vaapi_encode_h265_profiles,
 
+    .flags                 = FLAG_SLICE_CONTROL |
+                             FLAG_B_PICTURES |
+                             FLAG_B_PICTURE_REFERENCES |
+                             FLAG_NON_IDR_KEY_PICTURES,
+
+    .default_quality       = 25,
+
     .configure             = &vaapi_encode_h265_configure,
 
+    .picture_priv_data_size = sizeof(VAAPIEncodeH265Picture),
+
     .sequence_params_size  = sizeof(VAEncSequenceParameterBufferHEVC),
     .init_sequence_params  = &vaapi_encode_h265_init_sequence_params,
 
@@ -1138,6 +1175,12 @@
     ctx->surface_width  = FFALIGN(avctx->width,  16);
     ctx->surface_height = FFALIGN(avctx->height, 16);
 
+    // CTU size is currently hard-coded to 32.
+    ctx->slice_block_width = ctx->slice_block_height = 32;
+
+    if (priv->qp > 0)
+        ctx->explicit_qp = priv->qp;
+
     return ff_vaapi_encode_init(avctx);
 }
 
@@ -1145,6 +1188,7 @@
 {
     VAAPIEncodeH265Context *priv = avctx->priv_data;
 
+    ff_cbs_fragment_free(priv->cbc, &priv->current_access_unit);
     ff_cbs_close(&priv->cbc);
 
     return ff_vaapi_encode_close(avctx);
@@ -1154,9 +1198,10 @@
 #define FLAGS (AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM)
 static const AVOption vaapi_encode_h265_options[] = {
     VAAPI_ENCODE_COMMON_OPTIONS,
+    VAAPI_ENCODE_RC_OPTIONS,
 
     { "qp", "Constant QP (for P-frames; scaled by qfactor/qoffset for I/B)",
-      OFFSET(qp), AV_OPT_TYPE_INT, { .i64 = 25 }, 0, 52, FLAGS },
+      OFFSET(qp), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 52, FLAGS },
 
     { "aud", "Include AUD",
       OFFSET(aud), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, FLAGS },
@@ -1242,7 +1287,8 @@
     .id             = AV_CODEC_ID_HEVC,
     .priv_data_size = sizeof(VAAPIEncodeH265Context),
     .init           = &vaapi_encode_h265_init,
-    .encode2        = &ff_vaapi_encode2,
+    .send_frame     = &ff_vaapi_encode_send_frame,
+    .receive_packet = &ff_vaapi_encode_receive_packet,
     .close          = &vaapi_encode_h265_close,
     .priv_class     = &vaapi_encode_h265_class,
     .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_HARDWARE,
diff --git a/libavcodec/vaapi_encode_mjpeg.c b/libavcodec/vaapi_encode_mjpeg.c
index fe8439c..bd029cc 100644
--- a/libavcodec/vaapi_encode_mjpeg.c
+++ b/libavcodec/vaapi_encode_mjpeg.c
@@ -142,7 +142,7 @@
 
     err = 0;
 fail:
-    ff_cbs_fragment_uninit(priv->cbc, frag);
+    ff_cbs_fragment_reset(priv->cbc, frag);
     return err;
 }
 
@@ -227,15 +227,19 @@
     JPEGRawScanHeader                 *sh = &priv->scan.header;
     VAEncPictureParameterBufferJPEG *vpic = pic->codec_picture_params;
     const AVPixFmtDescriptor *desc;
+    const uint8_t components_rgb[3] = { 'R', 'G', 'B' };
+    const uint8_t components_yuv[3] = {  1,   2,   3  };
     const uint8_t *components;
     int t, i, quant_scale, len;
 
+    av_assert0(pic->type == PICTURE_TYPE_IDR);
+
     desc = av_pix_fmt_desc_get(priv->common.input_frames->sw_format);
     av_assert0(desc);
     if (desc->flags & AV_PIX_FMT_FLAG_RGB)
-        components = (uint8_t[3]) { 'R', 'G', 'B' };
+        components = components_rgb;
     else
-        components = (uint8_t[3]) {  1,   2,   3  };
+        components = components_yuv;
 
     // Frame header.
 
@@ -436,7 +440,7 @@
     VAAPIEncodeMJPEGContext *priv = avctx->priv_data;
     int err;
 
-    priv->quality = avctx->global_quality;
+    priv->quality = ctx->rc_quality;
     if (priv->quality < 1 || priv->quality > 100) {
         av_log(avctx, AV_LOG_ERROR, "Invalid quality value %d "
                "(must be 1-100).\n", priv->quality);
@@ -476,8 +480,13 @@
 static const VAAPIEncodeType vaapi_encode_type_mjpeg = {
     .profiles              = vaapi_encode_mjpeg_profiles,
 
+    .flags                 = FLAG_CONSTANT_QUALITY_ONLY |
+                             FLAG_INTRA_ONLY,
+
     .configure             = &vaapi_encode_mjpeg_configure,
 
+    .default_quality       = 80,
+
     .picture_params_size   = sizeof(VAEncPictureParameterBufferJPEG),
     .init_picture_params   = &vaapi_encode_mjpeg_init_picture_params,
 
@@ -510,6 +519,7 @@
 {
     VAAPIEncodeMJPEGContext *priv = avctx->priv_data;
 
+    ff_cbs_fragment_free(priv->cbc, &priv->current_fragment);
     ff_cbs_close(&priv->cbc);
 
     return ff_vaapi_encode_close(avctx);
@@ -531,9 +541,7 @@
 };
 
 static const AVCodecDefault vaapi_encode_mjpeg_defaults[] = {
-    { "global_quality", "80" },
     { "b",              "0"  },
-    { "g",              "1"  },
     { NULL },
 };
 
@@ -551,7 +559,8 @@
     .id             = AV_CODEC_ID_MJPEG,
     .priv_data_size = sizeof(VAAPIEncodeMJPEGContext),
     .init           = &vaapi_encode_mjpeg_init,
-    .encode2        = &ff_vaapi_encode2,
+    .send_frame     = &ff_vaapi_encode_send_frame,
+    .receive_packet = &ff_vaapi_encode_receive_packet,
     .close          = &vaapi_encode_mjpeg_close,
     .priv_class     = &vaapi_encode_mjpeg_class,
     .capabilities   = AV_CODEC_CAP_HARDWARE |
diff --git a/libavcodec/vaapi_encode_mpeg2.c b/libavcodec/vaapi_encode_mpeg2.c
index 1377eeb..bac9ea1 100644
--- a/libavcodec/vaapi_encode_mpeg2.c
+++ b/libavcodec/vaapi_encode_mpeg2.c
@@ -35,9 +35,6 @@
     int level;
 
     // Derived settings.
-    int mb_width;
-    int mb_height;
-
     int quant_i;
     int quant_p;
     int quant_b;
@@ -138,7 +135,7 @@
 
     err = vaapi_encode_mpeg2_write_fragment(avctx, data, data_len, frag);
 fail:
-    ff_cbs_fragment_uninit(priv->cbc, frag);
+    ff_cbs_fragment_reset(priv->cbc, frag);
     return 0;
 }
 
@@ -162,7 +159,7 @@
 
     err = vaapi_encode_mpeg2_write_fragment(avctx, data, data_len, frag);
 fail:
-    ff_cbs_fragment_uninit(priv->cbc, frag);
+    ff_cbs_fragment_reset(priv->cbc, frag);
     return 0;
 }
 
@@ -316,7 +313,8 @@
 
     goph->group_start_code = MPEG2_START_GROUP;
 
-    goph->time_code   = 0;
+    // Marker bit in the middle of time_code.
+    goph->time_code   = 1 << 12;
     goph->closed_gop  = 1;
     goph->broken_link = 0;
 
@@ -477,8 +475,6 @@
     vpic->f_code[1][0]       = pce->f_code[1][0];
     vpic->f_code[1][1]       = pce->f_code[1][1];
 
-    pic->nb_slices = priv->mb_height;
-
     return 0;
 }
 
@@ -490,8 +486,8 @@
     VAEncSliceParameterBufferMPEG2   *vslice = slice->codec_slice_params;
     int qp;
 
-    vslice->macroblock_address = priv->mb_width * slice->index;
-    vslice->num_macroblocks    = priv->mb_width;
+    vslice->macroblock_address = slice->block_start;
+    vslice->num_macroblocks    = slice->block_size;
 
     switch (pic->type) {
     case PICTURE_TYPE_IDR:
@@ -525,23 +521,18 @@
     if (err < 0)
         return err;
 
-    priv->mb_width  = FFALIGN(avctx->width,  16) / 16;
-    priv->mb_height = FFALIGN(avctx->height, 16) / 16;
-
     if (ctx->va_rc_mode == VA_RC_CQP) {
-        priv->quant_p = av_clip(avctx->global_quality, 1, 31);
+        priv->quant_p = av_clip(ctx->rc_quality, 1, 31);
         if (avctx->i_quant_factor > 0.0)
-            priv->quant_i = av_clip((avctx->global_quality *
-                                     avctx->i_quant_factor +
-                                     avctx->i_quant_offset) + 0.5,
-                                    1, 31);
+            priv->quant_i =
+                av_clip((avctx->i_quant_factor * priv->quant_p +
+                         avctx->i_quant_offset) + 0.5, 1, 31);
         else
             priv->quant_i = priv->quant_p;
         if (avctx->b_quant_factor > 0.0)
-            priv->quant_b = av_clip((avctx->global_quality *
-                                     avctx->b_quant_factor +
-                                     avctx->b_quant_offset) + 0.5,
-                                    1, 31);
+            priv->quant_b =
+                av_clip((avctx->b_quant_factor * priv->quant_p +
+                         avctx->b_quant_offset) + 0.5, 1, 31);
         else
             priv->quant_b = priv->quant_p;
 
@@ -550,9 +541,19 @@
                priv->quant_i, priv->quant_p, priv->quant_b);
 
     } else {
-        av_assert0(0 && "Invalid RC mode.");
+        priv->quant_i = 16;
+        priv->quant_p = 16;
+        priv->quant_b = 16;
     }
 
+    ctx->slice_block_rows = FFALIGN(avctx->height, 16) / 16;
+    ctx->slice_block_cols = FFALIGN(avctx->width,  16) / 16;
+
+    ctx->nb_slices  = ctx->slice_block_rows;
+    ctx->slice_size = 1;
+
+    ctx->roi_quant_range = 31;
+
     return 0;
 }
 
@@ -565,8 +566,12 @@
 static const VAAPIEncodeType vaapi_encode_type_mpeg2 = {
     .profiles              = vaapi_encode_mpeg2_profiles,
 
+    .flags                 = FLAG_B_PICTURES,
+
     .configure             = &vaapi_encode_mpeg2_configure,
 
+    .default_quality       = 10,
+
     .sequence_params_size  = sizeof(VAEncSequenceParameterBufferMPEG2),
     .init_sequence_params  = &vaapi_encode_mpeg2_init_sequence_params,
 
@@ -628,6 +633,7 @@
 {
     VAAPIEncodeMPEG2Context *priv = avctx->priv_data;
 
+    ff_cbs_fragment_free(priv->cbc, &priv->current_fragment);
     ff_cbs_close(&priv->cbc);
 
     return ff_vaapi_encode_close(avctx);
@@ -637,6 +643,7 @@
 #define FLAGS (AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM)
 static const AVOption vaapi_encode_mpeg2_options[] = {
     VAAPI_ENCODE_COMMON_OPTIONS,
+    VAAPI_ENCODE_RC_OPTIONS,
 
     { "profile", "Set profile (in profile_and_level_indication)",
       OFFSET(profile), AV_OPT_TYPE_INT,
@@ -671,7 +678,6 @@
     { "i_qoffset",      "0"   },
     { "b_qfactor",      "6/5" },
     { "b_qoffset",      "0"   },
-    { "global_quality", "10"  },
     { "qmin",           "-1"  },
     { "qmax",           "-1"  },
     { NULL },
@@ -691,7 +697,8 @@
     .id             = AV_CODEC_ID_MPEG2VIDEO,
     .priv_data_size = sizeof(VAAPIEncodeMPEG2Context),
     .init           = &vaapi_encode_mpeg2_init,
-    .encode2        = &ff_vaapi_encode2,
+    .send_frame     = &ff_vaapi_encode_send_frame,
+    .receive_packet = &ff_vaapi_encode_receive_packet,
     .close          = &vaapi_encode_mpeg2_close,
     .priv_class     = &vaapi_encode_mpeg2_class,
     .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_HARDWARE,
diff --git a/libavcodec/vaapi_encode_vp8.c b/libavcodec/vaapi_encode_vp8.c
index 697b465..6e7bf9d 100644
--- a/libavcodec/vaapi_encode_vp8.c
+++ b/libavcodec/vaapi_encode_vp8.c
@@ -161,17 +161,20 @@
 
 static av_cold int vaapi_encode_vp8_configure(AVCodecContext *avctx)
 {
+    VAAPIEncodeContext     *ctx = avctx->priv_data;
     VAAPIEncodeVP8Context *priv = avctx->priv_data;
 
-    priv->q_index_p = av_clip(avctx->global_quality, 0, VP8_MAX_QUANT);
+    priv->q_index_p = av_clip(ctx->rc_quality, 0, VP8_MAX_QUANT);
     if (avctx->i_quant_factor > 0.0)
-        priv->q_index_i = av_clip((avctx->global_quality *
-                                   avctx->i_quant_factor +
-                                   avctx->i_quant_offset) + 0.5,
-                                  0, VP8_MAX_QUANT);
+        priv->q_index_i =
+            av_clip((avctx->i_quant_factor * priv->q_index_p  +
+                     avctx->i_quant_offset) + 0.5,
+                    0, VP8_MAX_QUANT);
     else
         priv->q_index_i = priv->q_index_p;
 
+    ctx->roi_quant_range = VP8_MAX_QUANT;
+
     return 0;
 }
 
@@ -185,6 +188,8 @@
 
     .configure             = &vaapi_encode_vp8_configure,
 
+    .default_quality       = 40,
+
     .sequence_params_size  = sizeof(VAEncSequenceParameterBufferVP8),
     .init_sequence_params  = &vaapi_encode_vp8_init_sequence_params,
 
@@ -215,6 +220,8 @@
 #define FLAGS (AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM)
 static const AVOption vaapi_encode_vp8_options[] = {
     VAAPI_ENCODE_COMMON_OPTIONS,
+    VAAPI_ENCODE_RC_OPTIONS,
+
     { "loop_filter_level", "Loop filter level",
       OFFSET(loop_filter_level), AV_OPT_TYPE_INT, { .i64 = 16 }, 0, 63, FLAGS },
     { "loop_filter_sharpness", "Loop filter sharpness",
@@ -226,7 +233,6 @@
     { "b",              "0"   },
     { "bf",             "0"   },
     { "g",              "120" },
-    { "global_quality", "40"  },
     { "qmin",           "-1"  },
     { "qmax",           "-1"  },
     { NULL },
@@ -246,7 +252,8 @@
     .id             = AV_CODEC_ID_VP8,
     .priv_data_size = sizeof(VAAPIEncodeVP8Context),
     .init           = &vaapi_encode_vp8_init,
-    .encode2        = &ff_vaapi_encode2,
+    .send_frame     = &ff_vaapi_encode_send_frame,
+    .receive_packet = &ff_vaapi_encode_receive_packet,
     .close          = &ff_vaapi_encode_close,
     .priv_class     = &vaapi_encode_vp8_class,
     .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_HARDWARE,
diff --git a/libavcodec/vaapi_encode_vp9.c b/libavcodec/vaapi_encode_vp9.c
index 39bc868..d7f415d 100644
--- a/libavcodec/vaapi_encode_vp9.c
+++ b/libavcodec/vaapi_encode_vp9.c
@@ -32,6 +32,10 @@
 #define VP9_MAX_QUANT 255
 
 
+typedef struct VAAPIEncodeVP9Picture {
+    int slot;
+} VAAPIEncodeVP9Picture;
+
 typedef struct VAAPIEncodeVP9Context {
     VAAPIEncodeContext common;
 
@@ -43,22 +47,9 @@
     int q_idx_idr;
     int q_idx_p;
     int q_idx_b;
-
-    // Stream state.
-
-    // Reference direction for B-like frames:
-    // 0 - most recent P/IDR frame is last.
-    // 1 - most recent P frame is golden.
-    int last_ref_dir;
 } VAAPIEncodeVP9Context;
 
 
-#define vseq_var(name)     vseq->name, name
-#define vseq_field(name)   vseq->seq_fields.bits.name, name
-#define vpic_var(name)     vpic->name, name
-#define vpic_field(name)   vpic->pic_fields.bits.name, name
-
-
 static int vaapi_encode_vp9_init_sequence_params(AVCodecContext *avctx)
 {
     VAAPIEncodeContext               *ctx = avctx->priv_data;
@@ -88,6 +79,7 @@
 {
     VAAPIEncodeContext              *ctx = avctx->priv_data;
     VAAPIEncodeVP9Context          *priv = avctx->priv_data;
+    VAAPIEncodeVP9Picture          *hpic = pic->priv_data;
     VAEncPictureParameterBufferVP9 *vpic = pic->codec_picture_params;
     int i;
 
@@ -98,65 +90,71 @@
     case PICTURE_TYPE_IDR:
         av_assert0(pic->nb_refs == 0);
         vpic->ref_flags.bits.force_kf = 1;
-        vpic->refresh_frame_flags = 0x01;
-        priv->last_ref_dir = 0;
+        vpic->refresh_frame_flags = 0xff;
+        hpic->slot = 0;
         break;
     case PICTURE_TYPE_P:
         av_assert0(pic->nb_refs == 1);
-        if (ctx->b_per_p > 0) {
-            if (priv->last_ref_dir) {
-                vpic->ref_flags.bits.ref_frame_ctrl_l0  = 2;
-                vpic->ref_flags.bits.ref_gf_idx         = 1;
-                vpic->ref_flags.bits.ref_gf_sign_bias   = 1;
-                vpic->refresh_frame_flags = 0x01;
+        {
+            VAAPIEncodeVP9Picture *href = pic->refs[0]->priv_data;
+            av_assert0(href->slot == 0 || href->slot == 1);
+
+            if (ctx->max_b_depth > 0) {
+                hpic->slot = !href->slot;
+                vpic->refresh_frame_flags = 1 << hpic->slot | 0xfc;
             } else {
-                vpic->ref_flags.bits.ref_frame_ctrl_l0  = 1;
-                vpic->ref_flags.bits.ref_last_idx       = 0;
-                vpic->ref_flags.bits.ref_last_sign_bias = 1;
-                vpic->refresh_frame_flags = 0x02;
+                hpic->slot = 0;
+                vpic->refresh_frame_flags = 0xff;
             }
-        } else {
             vpic->ref_flags.bits.ref_frame_ctrl_l0  = 1;
-            vpic->ref_flags.bits.ref_last_idx       = 0;
+            vpic->ref_flags.bits.ref_last_idx       = href->slot;
             vpic->ref_flags.bits.ref_last_sign_bias = 1;
-            vpic->refresh_frame_flags = 0x01;
         }
         break;
     case PICTURE_TYPE_B:
         av_assert0(pic->nb_refs == 2);
-        if (priv->last_ref_dir) {
+        {
+            VAAPIEncodeVP9Picture *href0 = pic->refs[0]->priv_data,
+                                  *href1 = pic->refs[1]->priv_data;
+            av_assert0(href0->slot < pic->b_depth + 1 &&
+                       href1->slot < pic->b_depth + 1);
+
+            if (pic->b_depth == ctx->max_b_depth) {
+                // Unreferenced frame.
+                vpic->refresh_frame_flags = 0x00;
+                hpic->slot = 8;
+            } else {
+                vpic->refresh_frame_flags = 0xfe << pic->b_depth & 0xff;
+                hpic->slot = 1 + pic->b_depth;
+            }
             vpic->ref_flags.bits.ref_frame_ctrl_l0  = 1;
             vpic->ref_flags.bits.ref_frame_ctrl_l1  = 2;
-            vpic->ref_flags.bits.ref_last_idx       = 0;
+            vpic->ref_flags.bits.ref_last_idx       = href0->slot;
             vpic->ref_flags.bits.ref_last_sign_bias = 1;
-            vpic->ref_flags.bits.ref_gf_idx         = 1;
+            vpic->ref_flags.bits.ref_gf_idx         = href1->slot;
             vpic->ref_flags.bits.ref_gf_sign_bias   = 0;
-        } else {
-            vpic->ref_flags.bits.ref_frame_ctrl_l0  = 2;
-            vpic->ref_flags.bits.ref_frame_ctrl_l1  = 1;
-            vpic->ref_flags.bits.ref_last_idx       = 0;
-            vpic->ref_flags.bits.ref_last_sign_bias = 0;
-            vpic->ref_flags.bits.ref_gf_idx         = 1;
-            vpic->ref_flags.bits.ref_gf_sign_bias   = 1;
         }
-        vpic->refresh_frame_flags = 0x00;
         break;
     default:
         av_assert0(0 && "invalid picture type");
     }
+    if (vpic->refresh_frame_flags == 0x00) {
+        av_log(avctx, AV_LOG_DEBUG, "Pic %"PRId64" not stored.\n",
+               pic->display_order);
+    } else {
+        av_log(avctx, AV_LOG_DEBUG, "Pic %"PRId64" stored in slot %d.\n",
+               pic->display_order, hpic->slot);
+    }
 
     for (i = 0; i < FF_ARRAY_ELEMS(vpic->reference_frames); i++)
         vpic->reference_frames[i] = VA_INVALID_SURFACE;
-    if (pic->type == PICTURE_TYPE_P) {
-        av_assert0(pic->refs[0]);
-        vpic->reference_frames[priv->last_ref_dir] =
-            pic->refs[0]->recon_surface;
-    } else if (pic->type == PICTURE_TYPE_B) {
-        av_assert0(pic->refs[0] && pic->refs[1]);
-        vpic->reference_frames[!priv->last_ref_dir] =
-            pic->refs[0]->recon_surface;
-        vpic->reference_frames[priv->last_ref_dir] =
-            pic->refs[1]->recon_surface;
+
+    for (i = 0; i < pic->nb_refs; i++) {
+        VAAPIEncodePicture *ref_pic = pic->refs[i];
+        int slot;
+        slot = ((VAAPIEncodeVP9Picture*)ref_pic->priv_data)->slot;
+        av_assert0(vpic->reference_frames[slot] == VA_INVALID_SURFACE);
+        vpic->reference_frames[slot] = ref_pic->recon_surface;
     }
 
     vpic->pic_flags.bits.frame_type = (pic->type != PICTURE_TYPE_IDR);
@@ -175,31 +173,36 @@
     vpic->filter_level    = priv->loop_filter_level;
     vpic->sharpness_level = priv->loop_filter_sharpness;
 
-    if (ctx->b_per_p > 0 && pic->type == PICTURE_TYPE_P)
-        priv->last_ref_dir = !priv->last_ref_dir;
-
     return 0;
 }
 
 static av_cold int vaapi_encode_vp9_configure(AVCodecContext *avctx)
 {
+    VAAPIEncodeContext     *ctx = avctx->priv_data;
     VAAPIEncodeVP9Context *priv = avctx->priv_data;
 
-    priv->q_idx_p = av_clip(avctx->global_quality, 0, VP9_MAX_QUANT);
-    if (avctx->i_quant_factor > 0.0)
-        priv->q_idx_idr = av_clip((avctx->global_quality *
-                                   avctx->i_quant_factor +
-                                   avctx->i_quant_offset) + 0.5,
-                                  0, VP9_MAX_QUANT);
-    else
-        priv->q_idx_idr = priv->q_idx_p;
-    if (avctx->b_quant_factor > 0.0)
-        priv->q_idx_b = av_clip((avctx->global_quality *
-                                 avctx->b_quant_factor +
-                                 avctx->b_quant_offset) + 0.5,
-                                0, VP9_MAX_QUANT);
-    else
-        priv->q_idx_b = priv->q_idx_p;
+    if (ctx->rc_mode->quality) {
+        priv->q_idx_p = av_clip(ctx->rc_quality, 0, VP9_MAX_QUANT);
+        if (avctx->i_quant_factor > 0.0)
+            priv->q_idx_idr =
+                av_clip((avctx->i_quant_factor * priv->q_idx_p  +
+                         avctx->i_quant_offset) + 0.5,
+                        0, VP9_MAX_QUANT);
+        else
+            priv->q_idx_idr = priv->q_idx_p;
+        if (avctx->b_quant_factor > 0.0)
+            priv->q_idx_b =
+                av_clip((avctx->b_quant_factor * priv->q_idx_p  +
+                         avctx->b_quant_offset) + 0.5,
+                        0, VP9_MAX_QUANT);
+        else
+            priv->q_idx_b = priv->q_idx_p;
+    } else {
+        // Arbitrary value.
+        priv->q_idx_idr = priv->q_idx_p = priv->q_idx_b = 100;
+    }
+
+    ctx->roi_quant_range = VP9_MAX_QUANT;
 
     return 0;
 }
@@ -213,6 +216,13 @@
 static const VAAPIEncodeType vaapi_encode_type_vp9 = {
     .profiles              = vaapi_encode_vp9_profiles,
 
+    .flags                 = FLAG_B_PICTURES |
+                             FLAG_B_PICTURE_REFERENCES,
+
+    .default_quality       = 100,
+
+    .picture_priv_data_size = sizeof(VAAPIEncodeVP9Picture),
+
     .configure             = &vaapi_encode_vp9_configure,
 
     .sequence_params_size  = sizeof(VAEncSequenceParameterBufferVP9),
@@ -244,6 +254,8 @@
 #define FLAGS (AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM)
 static const AVOption vaapi_encode_vp9_options[] = {
     VAAPI_ENCODE_COMMON_OPTIONS,
+    VAAPI_ENCODE_RC_OPTIONS,
+
     { "loop_filter_level", "Loop filter level",
       OFFSET(loop_filter_level), AV_OPT_TYPE_INT, { .i64 = 16 }, 0, 63, FLAGS },
     { "loop_filter_sharpness", "Loop filter sharpness",
@@ -255,7 +267,6 @@
     { "b",              "0"   },
     { "bf",             "0"   },
     { "g",              "250" },
-    { "global_quality", "100" },
     { "qmin",           "-1"  },
     { "qmax",           "-1"  },
     { NULL },
@@ -275,7 +286,8 @@
     .id             = AV_CODEC_ID_VP9,
     .priv_data_size = sizeof(VAAPIEncodeVP9Context),
     .init           = &vaapi_encode_vp9_init,
-    .encode2        = &ff_vaapi_encode2,
+    .send_frame     = &ff_vaapi_encode_send_frame,
+    .receive_packet = &ff_vaapi_encode_receive_packet,
     .close          = &ff_vaapi_encode_close,
     .priv_class     = &vaapi_encode_vp9_class,
     .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_HARDWARE,
diff --git a/libavcodec/vaapi_h264.c b/libavcodec/vaapi_h264.c
index 5854587..dd2a657 100644
--- a/libavcodec/vaapi_h264.c
+++ b/libavcodec/vaapi_h264.c
@@ -256,9 +256,6 @@
             .log2_max_pic_order_cnt_lsb_minus4      = sps->log2_max_poc_lsb - 4,
             .delta_pic_order_always_zero_flag       = sps->delta_pic_order_always_zero_flag,
         },
-        .num_slice_groups_minus1                    = pps->slice_group_count - 1,
-        .slice_group_map_type                       = pps->mb_slice_group_map_type,
-        .slice_group_change_rate_minus1             = 0, /* FMO is not implemented */
         .pic_init_qp_minus26                        = pps->init_qp - 26,
         .pic_init_qs_minus26                        = pps->init_qs - 26,
         .chroma_qp_index_offset                     = pps->chroma_qp_index_offset[0],
diff --git a/libavcodec/vaapi_hevc.c b/libavcodec/vaapi_hevc.c
index 19aabcd..d832b8c 100644
--- a/libavcodec/vaapi_hevc.c
+++ b/libavcodec/vaapi_hevc.c
@@ -27,10 +27,17 @@
 #include "hevcdec.h"
 #include "hwaccel.h"
 #include "vaapi_decode.h"
+#include "vaapi_hevc.h"
+#include "h265_profile_level.h"
 
 typedef struct VAAPIDecodePictureHEVC {
+#if VA_CHECK_VERSION(1, 2, 0)
+    VAPictureParameterBufferHEVCExtension pic_param;
+    VASliceParameterBufferHEVCExtension last_slice_param;
+#else
     VAPictureParameterBufferHEVC pic_param;
     VASliceParameterBufferHEVC last_slice_param;
+#endif
     const uint8_t *last_buffer;
     size_t         last_size;
 
@@ -117,13 +124,13 @@
     const HEVCPPS          *pps = h->ps.pps;
 
     const ScalingList *scaling_list = NULL;
-    int err, i;
+    int pic_param_size, err, i;
+
+    VAPictureParameterBufferHEVC *pic_param = (VAPictureParameterBufferHEVC *)&pic->pic_param;
 
     pic->pic.output_surface = ff_vaapi_get_surface_id(h->ref->frame);
 
-    pic->pic_param = (VAPictureParameterBufferHEVC) {
-        .pic_fields.value                             = 0,
-        .slice_parsing_fields.value                   = 0,
+    *pic_param = (VAPictureParameterBufferHEVC) {
         .pic_width_in_luma_samples                    = sps->width,
         .pic_height_in_luma_samples                   = sps->height,
         .log2_min_luma_coding_block_size_minus3       = sps->log2_min_cb_size - 3,
@@ -190,29 +197,61 @@
         },
     };
 
-    fill_vaapi_pic(&pic->pic_param.CurrPic, h->ref, 0);
-    fill_vaapi_reference_frames(h, &pic->pic_param);
+    fill_vaapi_pic(&pic_param->CurrPic, h->ref, 0);
+    fill_vaapi_reference_frames(h, pic_param);
 
     if (pps->tiles_enabled_flag) {
-        pic->pic_param.num_tile_columns_minus1 = pps->num_tile_columns - 1;
-        pic->pic_param.num_tile_rows_minus1    = pps->num_tile_rows - 1;
+        pic_param->num_tile_columns_minus1 = pps->num_tile_columns - 1;
+        pic_param->num_tile_rows_minus1    = pps->num_tile_rows - 1;
 
         for (i = 0; i < pps->num_tile_columns; i++)
-            pic->pic_param.column_width_minus1[i] = pps->column_width[i] - 1;
+            pic_param->column_width_minus1[i] = pps->column_width[i] - 1;
 
         for (i = 0; i < pps->num_tile_rows; i++)
-            pic->pic_param.row_height_minus1[i] = pps->row_height[i] - 1;
+            pic_param->row_height_minus1[i] = pps->row_height[i] - 1;
     }
 
     if (h->sh.short_term_ref_pic_set_sps_flag == 0 && h->sh.short_term_rps) {
-        pic->pic_param.st_rps_bits = h->sh.short_term_ref_pic_set_size;
+        pic_param->st_rps_bits = h->sh.short_term_ref_pic_set_size;
     } else {
-        pic->pic_param.st_rps_bits = 0;
+        pic_param->st_rps_bits = 0;
     }
 
+#if VA_CHECK_VERSION(1, 2, 0)
+    if (avctx->profile == FF_PROFILE_HEVC_REXT) {
+        pic->pic_param.rext = (VAPictureParameterBufferHEVCRext) {
+            .range_extension_pic_fields.bits  = {
+                .transform_skip_rotation_enabled_flag       = sps->transform_skip_rotation_enabled_flag,
+                .transform_skip_context_enabled_flag        = sps->transform_skip_context_enabled_flag,
+                .implicit_rdpcm_enabled_flag                = sps->implicit_rdpcm_enabled_flag,
+                .explicit_rdpcm_enabled_flag                = sps->explicit_rdpcm_enabled_flag,
+                .extended_precision_processing_flag         = sps->extended_precision_processing_flag,
+                .intra_smoothing_disabled_flag              = sps->intra_smoothing_disabled_flag,
+                .high_precision_offsets_enabled_flag        = sps->high_precision_offsets_enabled_flag,
+                .persistent_rice_adaptation_enabled_flag    = sps->persistent_rice_adaptation_enabled_flag,
+                .cabac_bypass_alignment_enabled_flag        = sps->cabac_bypass_alignment_enabled_flag,
+                .cross_component_prediction_enabled_flag    = pps->cross_component_prediction_enabled_flag,
+                .chroma_qp_offset_list_enabled_flag         = pps->chroma_qp_offset_list_enabled_flag,
+            },
+            .diff_cu_chroma_qp_offset_depth                 = pps->diff_cu_chroma_qp_offset_depth,
+            .chroma_qp_offset_list_len_minus1               = pps->chroma_qp_offset_list_len_minus1,
+            .log2_sao_offset_scale_luma                     = pps->log2_sao_offset_scale_luma,
+            .log2_sao_offset_scale_chroma                   = pps->log2_sao_offset_scale_chroma,
+            .log2_max_transform_skip_block_size_minus2      = pps->log2_max_transform_skip_block_size - 2,
+        };
+
+        for (i = 0; i < 6; i++)
+            pic->pic_param.rext.cb_qp_offset_list[i]        = pps->cb_qp_offset_list[i];
+        for (i = 0; i < 6; i++)
+            pic->pic_param.rext.cr_qp_offset_list[i]        = pps->cr_qp_offset_list[i];
+    }
+#endif
+    pic_param_size = avctx->profile == FF_PROFILE_HEVC_REXT ?
+                            sizeof(pic->pic_param) : sizeof(VAPictureParameterBufferHEVC);
+
     err = ff_vaapi_decode_make_param_buffer(avctx, &pic->pic,
                                             VAPictureParameterBufferType,
-                                            &pic->pic_param, sizeof(pic->pic_param));
+                                            &pic->pic_param, pic_param_size);
     if (err < 0)
         goto fail;
 
@@ -257,12 +296,16 @@
 {
     const HEVCContext        *h = avctx->priv_data;
     VAAPIDecodePictureHEVC *pic = h->ref->hwaccel_picture_private;
+    VASliceParameterBufferHEVC *last_slice_param = (VASliceParameterBufferHEVC *)&pic->last_slice_param;
     int ret;
 
+    int slice_param_size = avctx->profile == FF_PROFILE_HEVC_REXT ?
+                            sizeof(pic->last_slice_param) : sizeof(VASliceParameterBufferHEVC);
+
     if (pic->last_size) {
-        pic->last_slice_param.LongSliceFlags.fields.LastSliceOfPic = 1;
+        last_slice_param->LongSliceFlags.fields.LastSliceOfPic = 1;
         ret = ff_vaapi_decode_make_slice_buffer(avctx, &pic->pic,
-                                                &pic->last_slice_param, sizeof(pic->last_slice_param),
+                                                &pic->last_slice_param, slice_param_size,
                                                 pic->last_buffer, pic->last_size);
         if (ret < 0)
             goto fail;
@@ -332,7 +375,7 @@
 static uint8_t get_ref_pic_index(const HEVCContext *h, const HEVCFrame *frame)
 {
     VAAPIDecodePictureHEVC *pic = h->ref->hwaccel_picture_private;
-    VAPictureParameterBufferHEVC *pp = &pic->pic_param;
+    VAPictureParameterBufferHEVC *pp = (VAPictureParameterBufferHEVC *)&pic->pic_param;
     uint8_t i;
 
     if (!frame)
@@ -355,6 +398,10 @@
     const HEVCContext        *h = avctx->priv_data;
     const SliceHeader       *sh = &h->sh;
     VAAPIDecodePictureHEVC *pic = h->ref->hwaccel_picture_private;
+    VASliceParameterBufferHEVC *last_slice_param = (VASliceParameterBufferHEVC *)&pic->last_slice_param;
+
+    int slice_param_size = avctx->profile == FF_PROFILE_HEVC_REXT ?
+                            sizeof(pic->last_slice_param) : sizeof(VASliceParameterBufferHEVC);
 
     int nb_list = (sh->slice_type == HEVC_SLICE_B) ?
                   2 : (sh->slice_type == HEVC_SLICE_I ? 0 : 1);
@@ -363,7 +410,7 @@
 
     if (!sh->first_slice_in_pic_flag) {
         err = ff_vaapi_decode_make_slice_buffer(avctx, &pic->pic,
-                                                &pic->last_slice_param, sizeof(pic->last_slice_param),
+                                                &pic->last_slice_param, slice_param_size,
                                                 pic->last_buffer, pic->last_size);
         pic->last_buffer = NULL;
         pic->last_size   = 0;
@@ -373,7 +420,7 @@
         }
     }
 
-    pic->last_slice_param = (VASliceParameterBufferHEVC) {
+    *last_slice_param = (VASliceParameterBufferHEVC) {
         .slice_data_size               = size,
         .slice_data_offset             = 0,
         .slice_data_flag               = VA_SLICE_DATA_FLAG_ALL,
@@ -406,16 +453,35 @@
         },
     };
 
-    memset(pic->last_slice_param.RefPicList, 0xFF, sizeof(pic->last_slice_param.RefPicList));
+    memset(last_slice_param->RefPicList, 0xFF, sizeof(last_slice_param->RefPicList));
 
     for (list_idx = 0; list_idx < nb_list; list_idx++) {
         RefPicList *rpl = &h->ref->refPicList[list_idx];
 
         for (i = 0; i < rpl->nb_refs; i++)
-            pic->last_slice_param.RefPicList[list_idx][i] = get_ref_pic_index(h, rpl->ref[i]);
+            last_slice_param->RefPicList[list_idx][i] = get_ref_pic_index(h, rpl->ref[i]);
     }
 
-    fill_pred_weight_table(h, sh, &pic->last_slice_param);
+    fill_pred_weight_table(h, sh, last_slice_param);
+
+#if VA_CHECK_VERSION(1, 2, 0)
+    if (avctx->profile == FF_PROFILE_HEVC_REXT) {
+        pic->last_slice_param.rext = (VASliceParameterBufferHEVCRext) {
+            .slice_ext_flags.bits = {
+                .cu_chroma_qp_offset_enabled_flag = sh->cu_chroma_qp_offset_enabled_flag,
+            },
+        };
+
+        memcpy(pic->last_slice_param.rext.luma_offset_l0, pic->last_slice_param.base.luma_offset_l0,
+                                                    sizeof(pic->last_slice_param.base.luma_offset_l0));
+        memcpy(pic->last_slice_param.rext.luma_offset_l1, pic->last_slice_param.base.luma_offset_l1,
+                                                    sizeof(pic->last_slice_param.base.luma_offset_l1));
+        memcpy(pic->last_slice_param.rext.ChromaOffsetL0, pic->last_slice_param.base.ChromaOffsetL0,
+                                                    sizeof(pic->last_slice_param.base.ChromaOffsetL0));
+        memcpy(pic->last_slice_param.rext.ChromaOffsetL1, pic->last_slice_param.base.ChromaOffsetL1,
+                                                    sizeof(pic->last_slice_param.base.ChromaOffsetL1));
+    }
+#endif
 
     pic->last_buffer = buffer;
     pic->last_size   = size;
@@ -423,6 +489,82 @@
     return 0;
 }
 
+static int ptl_convert(const PTLCommon *general_ptl, H265RawProfileTierLevel *h265_raw_ptl)
+{
+    h265_raw_ptl->general_profile_space = general_ptl->profile_space;
+    h265_raw_ptl->general_tier_flag     = general_ptl->tier_flag;
+    h265_raw_ptl->general_profile_idc   = general_ptl->profile_idc;
+
+    memcpy(h265_raw_ptl->general_profile_compatibility_flag,
+                                  general_ptl->profile_compatibility_flag, 32 * sizeof(uint8_t));
+
+#define copy_field(name) h265_raw_ptl->general_ ## name = general_ptl->name
+    copy_field(progressive_source_flag);
+    copy_field(interlaced_source_flag);
+    copy_field(non_packed_constraint_flag);
+    copy_field(frame_only_constraint_flag);
+    copy_field(max_12bit_constraint_flag);
+    copy_field(max_10bit_constraint_flag);
+    copy_field(max_422chroma_constraint_flag);
+    copy_field(max_420chroma_constraint_flag);
+    copy_field(max_monochrome_constraint_flag);
+    copy_field(intra_constraint_flag);
+    copy_field(one_picture_only_constraint_flag);
+    copy_field(lower_bit_rate_constraint_flag);
+    copy_field(max_14bit_constraint_flag);
+    copy_field(inbld_flag);
+    copy_field(level_idc);
+#undef copy_field
+
+    return 0;
+}
+
+/*
+ * Find exact va_profile for HEVC Range Extension
+ */
+VAProfile ff_vaapi_parse_hevc_rext_profile(AVCodecContext *avctx)
+{
+    const HEVCContext *h = avctx->priv_data;
+    const HEVCSPS *sps = h->ps.sps;
+    const PTL *ptl = &sps->ptl;
+    const PTLCommon *general_ptl = &ptl->general_ptl;
+    const H265ProfileDescriptor *profile;
+    H265RawProfileTierLevel h265_raw_ptl = {0};
+
+    /* convert PTLCommon to H265RawProfileTierLevel */
+    ptl_convert(general_ptl, &h265_raw_ptl);
+
+    profile = ff_h265_get_profile(&h265_raw_ptl);
+    if (!profile) {
+        av_log(avctx, AV_LOG_WARNING, "HEVC profile is not found.\n");
+        goto end;
+    } else {
+        av_log(avctx, AV_LOG_VERBOSE, "HEVC profile %s is found.\n", profile->name);
+    }
+
+#if VA_CHECK_VERSION(1, 2, 0)
+    if (!strcmp(profile->name, "Main 4:2:2 10") ||
+        !strcmp(profile->name, "Main 4:2:2 10 Intra"))
+        return VAProfileHEVCMain422_10;
+    else if (!strcmp(profile->name, "Main 4:4:4") ||
+             !strcmp(profile->name, "Main 4:4:4 Intra"))
+        return VAProfileHEVCMain444;
+    else if (!strcmp(profile->name, "Main 4:4:4 10") ||
+             !strcmp(profile->name, "Main 4:4:4 10 Intra"))
+        return VAProfileHEVCMain444_10;
+#else
+    av_log(avctx, AV_LOG_WARNING, "HEVC profile %s is "
+           "not supported with this VA version.\n", profile->name);
+#endif
+
+end:
+    if (avctx->hwaccel_flags & AV_HWACCEL_FLAG_ALLOW_PROFILE_MISMATCH) {
+        // Default to selecting Main profile if profile mismatch is allowed
+        return VAProfileHEVCMain;
+    } else
+        return VAProfileNone;
+}
+
 const AVHWAccel ff_hevc_vaapi_hwaccel = {
     .name                 = "hevc_vaapi",
     .type                 = AVMEDIA_TYPE_VIDEO,
diff --git a/libavfilter/scale.h b/libavcodec/vaapi_hevc.h
similarity index 75%
rename from libavfilter/scale.h
rename to libavcodec/vaapi_hevc.h
index dfe67d0..b3b0e6f 100644
--- a/libavfilter/scale.h
+++ b/libavcodec/vaapi_hevc.h
@@ -16,13 +16,12 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
-#ifndef AVFILTER_SCALE_H
-#define AVFILTER_SCALE_H
+#ifndef AVCODEC_VAAPI_HEVC_H
+#define AVCODEC_VAAPI_HEVC_H
 
-#include "avfilter.h"
+#include <va/va.h>
+#include "avcodec.h"
 
-int ff_scale_eval_dimensions(void *ctx,
-    const char *w_expr, const char *h_expr,
-    AVFilterLink *inlink, AVFilterLink *outlink,
-    int *ret_w, int *ret_h);
-#endif
+VAProfile ff_vaapi_parse_hevc_rext_profile(AVCodecContext *avctx);
+
+#endif /* AVCODEC_VAAPI_HEVC_H */
diff --git a/libavcodec/vb.c b/libavcodec/vb.c
index c6dd6fb..d9c6b93 100644
--- a/libavcodec/vb.c
+++ b/libavcodec/vb.c
@@ -199,6 +199,9 @@
     uint32_t size;
     int offset = 0;
 
+    if (avpkt->size < 2)
+        return AVERROR_INVALIDDATA;
+
     bytestream2_init(&c->stream, avpkt->data, avpkt->size);
 
     if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
diff --git a/libavcodec/vble.c b/libavcodec/vble.c
index c25ee98..c48c131 100644
--- a/libavcodec/vble.c
+++ b/libavcodec/vble.c
@@ -214,6 +214,5 @@
     .close          = vble_decode_close,
     .decode         = vble_decode_frame,
     .capabilities   = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_FRAME_THREADS,
-    .init_thread_copy = ONLY_IF_THREADS_ENABLED(vble_decode_init),
     .caps_internal  = FF_CODEC_CAP_INIT_THREADSAFE,
 };
diff --git a/libavcodec/vc1.c b/libavcodec/vc1.c
index 3581d87..9df778b 100644
--- a/libavcodec/vc1.c
+++ b/libavcodec/vc1.c
@@ -379,11 +379,6 @@
     } else {
         v->res_rtm_flag = get_bits1(gb); //reserved
     }
-    if (!v->res_rtm_flag) {
-        av_log(avctx, AV_LOG_ERROR,
-               "Old WMV3 version detected, some frames may be decoded incorrectly\n");
-        //return -1;
-    }
     //TODO: figure out what they mean (always 0x402F)
     if (!v->res_fasttx)
         skip_bits(gb, 16);
@@ -456,7 +451,11 @@
             h = get_bits(gb, 8) + 1;
             v->s.avctx->sample_aspect_ratio = (AVRational){w, h};
         } else {
-            av_reduce(&v->s.avctx->sample_aspect_ratio.num,
+            if (v->s.avctx->width  > v->max_coded_width ||
+                v->s.avctx->height > v->max_coded_height) {
+                avpriv_request_sample(v->s.avctx, "Huge resolution");
+            } else
+                av_reduce(&v->s.avctx->sample_aspect_ratio.num,
                       &v->s.avctx->sample_aspect_ratio.den,
                       v->s.avctx->height * w,
                       v->s.avctx->width * h,
@@ -938,7 +937,9 @@
         else if ((v->s.pict_type != AV_PICTURE_TYPE_B) && (v->s.pict_type != AV_PICTURE_TYPE_BI)) {
             v->refdist = get_bits(gb, 2);
             if (v->refdist == 3)
-                v->refdist += get_unary(gb, 0, 16);
+                v->refdist += get_unary(gb, 0, 14);
+            if (v->refdist > 16)
+                return AVERROR_INVALIDDATA;
         }
         if ((v->s.pict_type == AV_PICTURE_TYPE_B) || (v->s.pict_type == AV_PICTURE_TYPE_BI)) {
             if (read_bfraction(v, gb) < 0)
@@ -1318,16 +1319,17 @@
         break;
     }
 
-    if (v->fcm != PROGRESSIVE && !v->s.quarter_sample) {
-        v->range_x <<= 1;
-        v->range_y <<= 1;
-    }
 
     /* AC Syntax */
     v->c_ac_table_index = decode012(gb);
     if (v->s.pict_type == AV_PICTURE_TYPE_I || v->s.pict_type == AV_PICTURE_TYPE_BI) {
         v->y_ac_table_index = decode012(gb);
     }
+    else if (v->fcm != PROGRESSIVE && !v->s.quarter_sample) {
+        v->range_x <<= 1;
+        v->range_y <<= 1;
+    }
+
     /* DC Syntax */
     v->s.dc_table_index = get_bits1(gb);
     if ((v->s.pict_type == AV_PICTURE_TYPE_I || v->s.pict_type == AV_PICTURE_TYPE_BI)
diff --git a/libavcodec/vc1.h b/libavcodec/vc1.h
index 69f6ca9..4559a06 100644
--- a/libavcodec/vc1.h
+++ b/libavcodec/vc1.h
@@ -176,8 +176,6 @@
     H264ChromaContext h264chroma;
     VC1DSPContext vc1dsp;
 
-    int bits;
-
     /** Simple/Main Profile sequence header */
     //@{
     int res_sprite;       ///< reserved, sprite mode
diff --git a/libavcodec/vc1_block.c b/libavcodec/vc1_block.c
index 86320db..16542db 100644
--- a/libavcodec/vc1_block.c
+++ b/libavcodec/vc1_block.c
@@ -430,12 +430,12 @@
     if (c_avail && (n != 1 && n != 3)) {
         q2 = FFABS(s->current_picture.qscale_table[mb_pos - 1]);
         if (q2 && q2 != q1)
-            c = (c * s->y_dc_scale_table[q2] * ff_vc1_dqscale[dqscale_index] + 0x20000) >> 18;
+            c = (int)((unsigned)c * s->y_dc_scale_table[q2] * ff_vc1_dqscale[dqscale_index] + 0x20000) >> 18;
     }
     if (a_avail && (n != 2 && n != 3)) {
         q2 = FFABS(s->current_picture.qscale_table[mb_pos - s->mb_stride]);
         if (q2 && q2 != q1)
-            a = (a * s->y_dc_scale_table[q2] * ff_vc1_dqscale[dqscale_index] + 0x20000) >> 18;
+            a = (int)((unsigned)a * s->y_dc_scale_table[q2] * ff_vc1_dqscale[dqscale_index] + 0x20000) >> 18;
     }
     if (a_avail && c_avail && (n != 3)) {
         int off = mb_pos;
@@ -445,7 +445,7 @@
             off -= s->mb_stride;
         q2 = FFABS(s->current_picture.qscale_table[off]);
         if (q2 && q2 != q1)
-            b = (b * s->y_dc_scale_table[q2] * ff_vc1_dqscale[dqscale_index] + 0x20000) >> 18;
+            b = (int)((unsigned)b * s->y_dc_scale_table[q2] * ff_vc1_dqscale[dqscale_index] + 0x20000) >> 18;
     }
 
     if (c_avail && (!a_avail || abs(a - b) <= abs(b - c))) {
@@ -508,13 +508,15 @@
  * @param codingset set of VLC to decode data
  * @see 8.1.3.4
  */
-static void vc1_decode_ac_coeff(VC1Context *v, int *last, int *skip,
+static int vc1_decode_ac_coeff(VC1Context *v, int *last, int *skip,
                                 int *value, int codingset)
 {
     GetBitContext *gb = &v->s.gb;
     int index, run, level, lst, sign;
 
     index = get_vlc2(gb, ff_vc1_ac_coeff_table[codingset].table, AC_VLC_BITS, 3);
+    if (index < 0)
+        return index;
     if (index != ff_vc1_ac_sizes[codingset] - 1) {
         run   = vc1_index_decode_table[codingset][index][0];
         level = vc1_index_decode_table[codingset][index][1];
@@ -524,6 +526,8 @@
         int escape = decode210(gb);
         if (escape != 2) {
             index = get_vlc2(gb, ff_vc1_ac_coeff_table[codingset].table, AC_VLC_BITS, 3);
+            if (index >= ff_vc1_ac_sizes[codingset] - 1U)
+                return AVERROR_INVALIDDATA;
             run   = vc1_index_decode_table[codingset][index][0];
             level = vc1_index_decode_table[codingset][index][1];
             lst   = index >= vc1_last_decode_table[codingset];
@@ -560,6 +564,8 @@
     *last  = lst;
     *skip  = run;
     *value = (level ^ -sign) + sign;
+
+    return 0;
 }
 
 /** Decode intra block in intra frames - should be faster than decode_intra_block
@@ -639,7 +645,9 @@
             zz_table = v->zz_8x8[1];
 
         while (!last) {
-            vc1_decode_ac_coeff(v, &last, &skip, &value, codingset);
+            int ret = vc1_decode_ac_coeff(v, &last, &skip, &value, codingset);
+            if (ret < 0)
+                return ret;
             i += skip;
             if (i > 63)
                 break;
@@ -812,7 +820,9 @@
         }
 
         while (!last) {
-            vc1_decode_ac_coeff(v, &last, &skip, &value, codingset);
+            int ret = vc1_decode_ac_coeff(v, &last, &skip, &value, codingset);
+            if (ret < 0)
+                return ret;
             i += skip;
             if (i > 63)
                 break;
@@ -836,7 +846,7 @@
                 q2 = FFABS(q2) * 2 + ((q2 < 0) ? 0 : v->halfpq) - 1;
             if (q2 && q1 != q2) {
                 for (k = 1; k < 8; k++)
-                    block[k << sh] += (ac_val[k] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18;
+                    block[k << sh] += (int)(ac_val[k] * (unsigned)q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18;
             } else {
                 for (k = 1; k < 8; k++)
                     block[k << sh] += ac_val[k];
@@ -879,7 +889,7 @@
                 q2 = FFABS(q2) * 2 + ((q2 < 0) ? 0 : v->halfpq) - 1;
             if (q2 && q1 != q2) {
                 for (k = 1; k < 8; k++)
-                    ac_val2[k] = (ac_val2[k] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18;
+                    ac_val2[k] = (int)(ac_val2[k] * q2 * (unsigned)ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18;
             }
             for (k = 1; k < 8; k++) {
                 block[k << sh] = ac_val2[k] * scale;
@@ -995,7 +1005,9 @@
         int k;
 
         while (!last) {
-            vc1_decode_ac_coeff(v, &last, &skip, &value, codingset);
+            int ret = vc1_decode_ac_coeff(v, &last, &skip, &value, codingset);
+            if (ret < 0)
+                return ret;
             i += skip;
             if (i > 63)
                 break;
@@ -1024,10 +1036,10 @@
             if (q2 && q1 != q2) {
                 if (dc_pred_dir) { // left
                     for (k = 1; k < 8; k++)
-                        block[k << v->left_blk_sh] += (ac_val[k] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18;
+                        block[k << v->left_blk_sh] += (int)(ac_val[k] * q2 * (unsigned)ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18;
                 } else { //top
                     for (k = 1; k < 8; k++)
-                        block[k << v->top_blk_sh] += (ac_val[k + 8] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18;
+                        block[k << v->top_blk_sh] += (int)(ac_val[k + 8] * q2 * (unsigned)ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18;
                 }
             } else {
                 if (dc_pred_dir) { // left
@@ -1161,7 +1173,9 @@
         i    = 0;
         last = 0;
         while (!last) {
-            vc1_decode_ac_coeff(v, &last, &skip, &value, v->codingset2);
+            int ret = vc1_decode_ac_coeff(v, &last, &skip, &value, v->codingset2);
+            if (ret < 0)
+                return ret;
             i += skip;
             if (i > 63)
                 break;
@@ -1189,7 +1203,9 @@
             i    = 0;
             off  = (j & 1) * 4 + (j & 2) * 16;
             while (!last) {
-                vc1_decode_ac_coeff(v, &last, &skip, &value, v->codingset2);
+                int ret = vc1_decode_ac_coeff(v, &last, &skip, &value, v->codingset2);
+                if (ret < 0)
+                    return ret;
                 i += skip;
                 if (i > 15)
                     break;
@@ -1216,7 +1232,9 @@
             i    = 0;
             off  = j * 32;
             while (!last) {
-                vc1_decode_ac_coeff(v, &last, &skip, &value, v->codingset2);
+                int ret = vc1_decode_ac_coeff(v, &last, &skip, &value, v->codingset2);
+                if (ret < 0)
+                    return ret;
                 i += skip;
                 if (i > 31)
                     break;
@@ -1243,7 +1261,9 @@
             i    = 0;
             off  = j * 4;
             while (!last) {
-                vc1_decode_ac_coeff(v, &last, &skip, &value, v->codingset2);
+                int ret = vc1_decode_ac_coeff(v, &last, &skip, &value, v->codingset2);
+                if (ret < 0)
+                    return ret;
                 i += skip;
                 if (i > 31)
                     break;
@@ -1358,13 +1378,15 @@
                     v->vc1dsp.vc1_inv_trans_8x8(v->block[v->cur_blk_idx][block_map[i]]);
                     if (v->rangeredfrm)
                         for (j = 0; j < 64; j++)
-                            v->block[v->cur_blk_idx][block_map[i]][j] <<= 1;
+                            v->block[v->cur_blk_idx][block_map[i]][j] *= 2;
                     block_cbp   |= 0xF << (i << 2);
                     block_intra |= 1 << i;
                 } else if (val) {
                     pat = vc1_decode_p_block(v, v->block[v->cur_blk_idx][block_map[i]], i, mquant, ttmb, first_block,
                                              s->dest[dst_idx] + off, (i & 4) ? s->uvlinesize : s->linesize,
                                              CONFIG_GRAY && (i & 4) && (s->avctx->flags & AV_CODEC_FLAG_GRAY), &block_tt);
+                    if (pat < 0)
+                        return pat;
                     block_cbp |= pat << (i << 2);
                     if (!v->ttmbf && ttmb < 8)
                         ttmb = -1;
@@ -1459,7 +1481,7 @@
                     v->vc1dsp.vc1_inv_trans_8x8(v->block[v->cur_blk_idx][block_map[i]]);
                     if (v->rangeredfrm)
                         for (j = 0; j < 64; j++)
-                            v->block[v->cur_blk_idx][block_map[i]][j] <<= 1;
+                            v->block[v->cur_blk_idx][block_map[i]][j] *= 2;
                     block_cbp   |= 0xF << (i << 2);
                     block_intra |= 1 << i;
                 } else if (is_coded[i]) {
@@ -1468,6 +1490,8 @@
                                              (i & 4) ? s->uvlinesize : s->linesize,
                                              CONFIG_GRAY && (i & 4) && (s->avctx->flags & AV_CODEC_FLAG_GRAY),
                                              &block_tt);
+                    if (pat < 0)
+                        return pat;
                     block_cbp |= pat << (i << 2);
                     if (!v->ttmbf && ttmb < 8)
                         ttmb = -1;
@@ -1678,6 +1702,8 @@
                                              first_block, s->dest[dst_idx] + off,
                                              (i & 4) ? s->uvlinesize : (s->linesize << fieldtx),
                                              CONFIG_GRAY && (i & 4) && (s->avctx->flags & AV_CODEC_FLAG_GRAY), &block_tt);
+                    if (pat < 0)
+                        return pat;
                     block_cbp |= pat << (i << 2);
                     if (!v->ttmbf && ttmb < 8)
                         ttmb = -1;
@@ -1814,6 +1840,8 @@
                                          (i & 4) ? s->uvlinesize : s->linesize,
                                          CONFIG_GRAY && (i & 4) && (s->avctx->flags & AV_CODEC_FLAG_GRAY),
                                          &block_tt);
+                if (pat < 0)
+                    return pat;
                 block_cbp |= pat << (i << 2);
                 if (!v->ttmbf && ttmb < 8)
                     ttmb = -1;
@@ -1833,7 +1861,7 @@
 
 /** Decode one B-frame MB (in Main profile)
  */
-static void vc1_decode_b_mb(VC1Context *v)
+static int vc1_decode_b_mb(VC1Context *v)
 {
     MpegEncContext *s = &v->s;
     GetBitContext *gb = &s->gb;
@@ -1899,7 +1927,7 @@
             bmvtype = BMV_TYPE_INTERPOLATED;
         ff_vc1_pred_b_mv(v, dmv_x, dmv_y, direct, bmvtype);
         vc1_b_mc(v, dmv_x, dmv_y, direct, bmvtype);
-        return;
+        return 0;
     }
     if (direct) {
         cbp = get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2);
@@ -1916,7 +1944,7 @@
             /* no coded blocks - effectively skipped */
             ff_vc1_pred_b_mv(v, dmv_x, dmv_y, direct, bmvtype);
             vc1_b_mc(v, dmv_x, dmv_y, direct, bmvtype);
-            return;
+            return 0;
         }
         if (s->mb_intra && !mb_has_coeffs) {
             GET_MQUANT();
@@ -1931,7 +1959,7 @@
                     /* interpolated skipped block */
                     ff_vc1_pred_b_mv(v, dmv_x, dmv_y, direct, bmvtype);
                     vc1_b_mc(v, dmv_x, dmv_y, direct, bmvtype);
-                    return;
+                    return 0;
                 }
             }
             ff_vc1_pred_b_mv(v, dmv_x, dmv_y, direct, bmvtype);
@@ -1969,26 +1997,29 @@
             v->vc1dsp.vc1_inv_trans_8x8(s->block[i]);
             if (v->rangeredfrm)
                 for (j = 0; j < 64; j++)
-                    s->block[i][j] <<= 1;
+                    s->block[i][j] *= 2;
             s->idsp.put_signed_pixels_clamped(s->block[i],
                                               s->dest[dst_idx] + off,
                                               i & 4 ? s->uvlinesize
                                                     : s->linesize);
         } else if (val) {
-            vc1_decode_p_block(v, s->block[i], i, mquant, ttmb,
-                               first_block, s->dest[dst_idx] + off,
-                               (i & 4) ? s->uvlinesize : s->linesize,
-                               CONFIG_GRAY && (i & 4) && (s->avctx->flags & AV_CODEC_FLAG_GRAY), NULL);
+            int pat = vc1_decode_p_block(v, s->block[i], i, mquant, ttmb,
+                                         first_block, s->dest[dst_idx] + off,
+                                         (i & 4) ? s->uvlinesize : s->linesize,
+                                         CONFIG_GRAY && (i & 4) && (s->avctx->flags & AV_CODEC_FLAG_GRAY), NULL);
+            if (pat < 0)
+                return pat;
             if (!v->ttmbf && ttmb < 8)
                 ttmb = -1;
             first_block = 0;
         }
     }
+    return 0;
 }
 
 /** Decode one B-frame MB (in interlaced field B picture)
  */
-static void vc1_decode_b_mb_intfi(VC1Context *v)
+static int vc1_decode_b_mb_intfi(VC1Context *v)
 {
     MpegEncContext *s = &v->s;
     GetBitContext *gb = &s->gb;
@@ -2093,7 +2124,7 @@
                 dmv_x[1] = dmv_y[1] = pred_flag[0] = 0;
                 if (!s->next_picture_ptr->field_picture) {
                     av_log(s->avctx, AV_LOG_ERROR, "Mixed field/frame direct mode not supported\n");
-                    return;
+                    return AVERROR_INVALIDDATA;
                 }
             }
             ff_vc1_pred_b_mv_intfi(v, 0, dmv_x, dmv_y, 1, pred_flag);
@@ -2138,6 +2169,8 @@
                                          first_block, s->dest[dst_idx] + off,
                                          (i & 4) ? s->uvlinesize : s->linesize,
                                          CONFIG_GRAY && (i & 4) && (s->avctx->flags & AV_CODEC_FLAG_GRAY), &block_tt);
+                if (pat < 0)
+                    return pat;
                 block_cbp |= pat << (i << 2);
                 if (!v->ttmbf && ttmb < 8)
                     ttmb = -1;
@@ -2147,6 +2180,8 @@
     }
     v->cbp[s->mb_x]      = block_cbp;
     v->ttblk[s->mb_x]    = block_tt;
+
+    return 0;
 }
 
 /** Decode one B-frame MB (in interlaced frame B picture)
@@ -2433,6 +2468,8 @@
                                              first_block, s->dest[dst_idx] + off,
                                              (i & 4) ? s->uvlinesize : (s->linesize << fieldtx),
                                              CONFIG_GRAY && (i & 4) && (s->avctx->flags & AV_CODEC_FLAG_GRAY), &block_tt);
+                    if (pat < 0)
+                        return pat;
                     block_cbp |= pat << (i << 2);
                     if (!v->ttmbf && ttmb < 8)
                         ttmb = -1;
@@ -2582,23 +2619,23 @@
                 if (v->rangeredfrm)
                     for (k = 0; k < 6; k++)
                         for (j = 0; j < 64; j++)
-                            v->block[v->cur_blk_idx][block_map[k]][j] <<= 1;
+                            v->block[v->cur_blk_idx][block_map[k]][j] *= 2;
                 vc1_put_blocks_clamped(v, 1);
             } else {
                 if (v->rangeredfrm)
                     for (k = 0; k < 6; k++)
                         for (j = 0; j < 64; j++)
-                            v->block[v->cur_blk_idx][block_map[k]][j] = (v->block[v->cur_blk_idx][block_map[k]][j] - 64) << 1;
+                            v->block[v->cur_blk_idx][block_map[k]][j] = (v->block[v->cur_blk_idx][block_map[k]][j] - 64) * 2;
                 vc1_put_blocks_clamped(v, 0);
             }
 
             if (v->s.loop_filter)
                 ff_vc1_i_loop_filter(v);
 
-            if (get_bits_count(&s->gb) > v->bits) {
+            if (get_bits_left(&s->gb) < 0) {
                 ff_er_add_slice(&s->er, 0, 0, s->mb_x, s->mb_y, ER_MB_ERROR);
                 av_log(s->avctx, AV_LOG_ERROR, "Bits overconsumption: %i > %i\n",
-                       get_bits_count(&s->gb), v->bits);
+                       get_bits_count(&s->gb), s->gb.size_in_bits);
                 return;
             }
 
@@ -2624,7 +2661,7 @@
 
 /** Decode blocks of I-frame for advanced profile
  */
-static void vc1_decode_i_blocks_adv(VC1Context *v)
+static int vc1_decode_i_blocks_adv(VC1Context *v)
 {
     int k;
     MpegEncContext *s = &v->s;
@@ -2635,6 +2672,9 @@
     int mqdiff;
     GetBitContext *gb = &s->gb;
 
+    if (get_bits_left(gb) <= 1)
+        return AVERROR_INVALIDDATA;
+
     /* select coding mode used for VLC tables selection */
     switch (v->y_ac_table_index) {
     case 0:
@@ -2688,6 +2728,11 @@
             // do actual MB decoding and displaying
             if (v->fieldtx_is_raw)
                 v->fieldtx_plane[mb_pos] = get_bits1(&v->s.gb);
+            if (get_bits_left(&v->s.gb) <= 1) {
+                ff_er_add_slice(&s->er, 0, s->start_mb_y, s->mb_x, s->mb_y, ER_MB_ERROR);
+                return 0;
+            }
+
             cbp = get_vlc2(&v->s.gb, ff_msmp4_mb_i_vlc.table, MB_INTRA_VLC_BITS, 2);
             if (v->acpred_is_raw)
                 v->s.ac_pred = get_bits1(&v->s.gb);
@@ -2733,12 +2778,12 @@
             if (v->s.loop_filter)
                 ff_vc1_i_loop_filter(v);
 
-            if (get_bits_count(&s->gb) > v->bits) {
+            if (get_bits_left(&s->gb) < 0) {
                 // TODO: may need modification to handle slice coding
                 ff_er_add_slice(&s->er, 0, s->start_mb_y, s->mb_x, s->mb_y, ER_MB_ERROR);
                 av_log(s->avctx, AV_LOG_ERROR, "Bits overconsumption: %i > %i\n",
-                       get_bits_count(&s->gb), v->bits);
-                return;
+                       get_bits_count(&s->gb), s->gb.size_in_bits);
+                return 0;
             }
             inc_blk_idx(v->topleft_blk_idx);
             inc_blk_idx(v->top_blk_idx);
@@ -2756,6 +2801,7 @@
         ff_mpeg_draw_horiz_band(s, (s->end_mb_y - 1) * 16, 16);
     ff_er_add_slice(&s->er, 0, s->start_mb_y << v->field_mode, s->mb_width - 1,
                     (s->end_mb_y << v->field_mode) - 1, ER_MB_END);
+    return 0;
 }
 
 static void vc1_decode_p_blocks(VC1Context *v)
@@ -2797,6 +2843,12 @@
         for (; s->mb_x < s->mb_width; s->mb_x++) {
             ff_update_block_index(s);
 
+            if (v->fcm == ILACE_FIELD || (v->fcm == PROGRESSIVE && v->mv_type_is_raw) || v->skip_is_raw)
+                if (get_bits_left(&v->s.gb) <= 1) {
+                    ff_er_add_slice(&s->er, 0, s->start_mb_y, s->mb_x, s->mb_y, ER_MB_ERROR);
+                    return;
+                }
+
             if (v->fcm == ILACE_FIELD) {
                 vc1_decode_p_mb_intfi(v);
                 if (apply_loop_filter)
@@ -2810,11 +2862,11 @@
                 if (apply_loop_filter)
                     ff_vc1_p_loop_filter(v);
             }
-            if (get_bits_count(&s->gb) > v->bits || get_bits_count(&s->gb) < 0) {
+            if (get_bits_left(&s->gb) < 0 || get_bits_count(&s->gb) < 0) {
                 // TODO: may need modification to handle slice coding
                 ff_er_add_slice(&s->er, 0, s->start_mb_y, s->mb_x, s->mb_y, ER_MB_ERROR);
                 av_log(s->avctx, AV_LOG_ERROR, "Bits overconsumption: %i > %i at %ix%i\n",
-                       get_bits_count(&s->gb), v->bits, s->mb_x, s->mb_y);
+                       get_bits_count(&s->gb), s->gb.size_in_bits, s->mb_x, s->mb_y);
                 return;
             }
             inc_blk_idx(v->topleft_blk_idx);
@@ -2880,6 +2932,12 @@
         for (; s->mb_x < s->mb_width; s->mb_x++) {
             ff_update_block_index(s);
 
+            if (v->fcm == ILACE_FIELD || v->skip_is_raw || v->dmb_is_raw)
+                if (get_bits_left(&v->s.gb) <= 1) {
+                    ff_er_add_slice(&s->er, 0, s->start_mb_y, s->mb_x, s->mb_y, ER_MB_ERROR);
+                    return;
+                }
+
             if (v->fcm == ILACE_FIELD) {
                 vc1_decode_b_mb_intfi(v);
                 if (v->s.loop_filter)
@@ -2893,11 +2951,11 @@
                 if (v->s.loop_filter)
                     ff_vc1_i_loop_filter(v);
             }
-            if (get_bits_count(&s->gb) > v->bits || get_bits_count(&s->gb) < 0) {
+            if (get_bits_left(&s->gb) < 0 || get_bits_count(&s->gb) < 0) {
                 // TODO: may need modification to handle slice coding
                 ff_er_add_slice(&s->er, 0, s->start_mb_y, s->mb_x, s->mb_y, ER_MB_ERROR);
                 av_log(s->avctx, AV_LOG_ERROR, "Bits overconsumption: %i > %i at %ix%i\n",
-                       get_bits_count(&s->gb), v->bits, s->mb_x, s->mb_y);
+                       get_bits_count(&s->gb), s->gb.size_in_bits, s->mb_x, s->mb_y);
                 return;
             }
         }
diff --git a/libavcodec/vc1_parser.c b/libavcodec/vc1_parser.c
index bb54947..493ffde 100644
--- a/libavcodec/vc1_parser.c
+++ b/libavcodec/vc1_parser.c
@@ -67,7 +67,7 @@
     int ret;
     vpc->v.s.avctx = avctx;
     vpc->v.parse_only = 1;
-    init_get_bits(&gb, buf, buf_size * 8);
+    init_get_bits8(&gb, buf, buf_size);
     switch (vpc->prev_start_code) {
     case VC1_CODE_SEQHDR & 0xFF:
         ff_vc1_decode_sequence_header(avctx, &vpc->v, &gb);
diff --git a/libavcodec/vc1_pred.c b/libavcodec/vc1_pred.c
index de736ec..f70956e 100644
--- a/libavcodec/vc1_pred.c
+++ b/libavcodec/vc1_pred.c
@@ -178,7 +178,7 @@
     brfd      = FFMIN(v->brfd, 3);
     scalesame = ff_vc1_b_field_mvpred_scales[0][brfd];
 
-    n = (n * scalesame >> 8) << hpel;
+    n = (n * scalesame >> 8) * (1 << hpel);
     return n;
 }
 
@@ -191,15 +191,16 @@
     n >>= hpel;
     if (v->s.pict_type == AV_PICTURE_TYPE_B && !v->second_field && dir == 1) {
         if (dim)
-            n = scaleforopp_y(v, n, dir) << hpel;
+            n = scaleforopp_y(v, n, dir) * (1 << hpel);
         else
-            n = scaleforopp_x(v, n) << hpel;
+            n = scaleforopp_x(v, n)      * (1 << hpel);
         return n;
     }
     if (v->s.pict_type != AV_PICTURE_TYPE_B)
-        refdist = FFMIN(v->refdist, 3);
+        refdist = v->refdist;
     else
         refdist = dir ? v->brfd : v->frfd;
+    refdist = FFMIN(refdist, 3);
     scaleopp = ff_vc1_field_mvpred_scales[dir ^ v->second_field][0][refdist];
 
     n = (n * scaleopp >> 8) * (1 << hpel);
@@ -262,18 +263,23 @@
         return;
     }
 
-    C = s->current_picture.motion_val[dir][xy -    1 + v->blocks_off];
-    A = s->current_picture.motion_val[dir][xy - wrap + v->blocks_off];
+    a_valid = !s->first_slice_line || (n == 2 || n == 3);
+    b_valid = a_valid;
+    c_valid = s->mb_x || (n == 1 || n == 3);
     if (mv1) {
         if (v->field_mode && mixedmv_pic)
             off = (s->mb_x == (s->mb_width - 1)) ? -2 : 2;
         else
             off = (s->mb_x == (s->mb_width - 1)) ? -1 : 2;
+        b_valid = b_valid && s->mb_width > 1;
     } else {
         //in 4-MV mode different blocks have different B predictor position
         switch (n) {
         case 0:
-            off = (s->mb_x > 0) ? -1 : 1;
+            if (v->res_rtm_flag)
+                off = s->mb_x ? -1 : 1;
+            else
+                off = s->mb_x ? -1 : 2 * s->mb_width - wrap - 1;
             break;
         case 1:
             off = (s->mb_x == (s->mb_width - 1)) ? -1 : 1;
@@ -284,12 +290,10 @@
         case 3:
             off = -1;
         }
+        if (v->field_mode && s->mb_width == 1)
+            b_valid = b_valid && c_valid;
     }
-    B = s->current_picture.motion_val[dir][xy - wrap + off + v->blocks_off];
 
-    a_valid = !s->first_slice_line || (n == 2 || n == 3);
-    b_valid = a_valid && (s->mb_width > 1);
-    c_valid = s->mb_x || (n == 1 || n == 3);
     if (v->field_mode) {
         a_valid = a_valid && !is_intra[xy - wrap];
         b_valid = b_valid && !is_intra[xy - wrap + off];
@@ -297,6 +301,7 @@
     }
 
     if (a_valid) {
+        A = s->current_picture.motion_val[dir][xy - wrap + v->blocks_off];
         a_f = v->mv_f[dir][xy - wrap + v->blocks_off];
         num_oppfield  += a_f;
         num_samefield += 1 - a_f;
@@ -307,6 +312,7 @@
         a_f = 0;
     }
     if (b_valid) {
+        B = s->current_picture.motion_val[dir][xy - wrap + off + v->blocks_off];
         b_f = v->mv_f[dir][xy - wrap + off + v->blocks_off];
         num_oppfield  += b_f;
         num_samefield += 1 - b_f;
@@ -317,6 +323,7 @@
         b_f = 0;
     }
     if (c_valid) {
+        C = s->current_picture.motion_val[dir][xy - 1 + v->blocks_off];
         c_f = v->mv_f[dir][xy - 1 + v->blocks_off];
         num_oppfield  += c_f;
         num_samefield += 1 - c_f;
diff --git a/libavcodec/vc1dec.c b/libavcodec/vc1dec.c
index 9519864..15783e3 100644
--- a/libavcodec/vc1dec.c
+++ b/libavcodec/vc1dec.c
@@ -431,7 +431,7 @@
     v->output_height = avctx->height;
 
     if (!avctx->extradata_size || !avctx->extradata)
-        return -1;
+        return AVERROR_INVALIDDATA;
     v->s.avctx = avctx;
 
     if ((ret = ff_vc1_init_common(v)) < 0)
@@ -450,6 +450,11 @@
         if ((ret = ff_vc1_decode_sequence_header(avctx, v, &gb)) < 0)
           return ret;
 
+        if (avctx->codec_id == AV_CODEC_ID_WMV3IMAGE && !v->res_sprite) {
+            avpriv_request_sample(avctx, "Non sprite WMV3IMAGE");
+            return AVERROR_PATCHWELCOME;
+        }
+
         count = avctx->extradata_size*8 - get_bits_count(&gb);
         if (count > 0) {
             av_log(avctx, AV_LOG_INFO, "Extra data: %i bits left, value: %X\n",
@@ -467,7 +472,7 @@
 
         if (avctx->extradata_size < 16) {
             av_log(avctx, AV_LOG_ERROR, "Extradata size too small: %i\n", avctx->extradata_size);
-            return -1;
+            return AVERROR_INVALIDDATA;
         }
 
         buf2  = av_mallocz(avctx->extradata_size + AV_INPUT_BUFFER_PADDING_SIZE);
@@ -503,7 +508,7 @@
         av_free(buf2);
         if (!seq_initialized || !ep_initialized) {
             av_log(avctx, AV_LOG_ERROR, "Incomplete extradata\n");
-            return -1;
+            return AVERROR_INVALIDDATA;
         }
         v->res_sprite = (avctx->codec_id == AV_CODEC_ID_VC1IMAGE);
     }
@@ -571,14 +576,21 @@
         if (v->sprite_width  > 1 << 14 ||
             v->sprite_height > 1 << 14 ||
             v->output_width  > 1 << 14 ||
-            v->output_height > 1 << 14) return -1;
+            v->output_height > 1 << 14) {
+            ret = AVERROR_INVALIDDATA;
+            goto error;
+        }
 
         if ((v->sprite_width&1) || (v->sprite_height&1)) {
             avpriv_request_sample(avctx, "odd sprites support");
-            return AVERROR_PATCHWELCOME;
+            ret = AVERROR_PATCHWELCOME;
+            goto error;
         }
     }
     return 0;
+error:
+    av_frame_free(&v->sprite_output_frame);
+    return ret;
 }
 
 /** Close a VC1/WMV3 decoder
@@ -683,13 +695,13 @@
                     int buf_size3;
                     if (avctx->hwaccel)
                         buf_start_second_field = start;
-                    tmp = av_realloc_array(slices, sizeof(*slices), (n_slices+1));
+                    tmp = av_realloc_array(slices, sizeof(*slices), n_slices+1);
                     if (!tmp) {
                         ret = AVERROR(ENOMEM);
                         goto err;
                     }
                     slices = tmp;
-                    slices[n_slices].buf = av_mallocz(buf_size + AV_INPUT_BUFFER_PADDING_SIZE);
+                    slices[n_slices].buf = av_mallocz(size + AV_INPUT_BUFFER_PADDING_SIZE);
                     if (!slices[n_slices].buf) {
                         ret = AVERROR(ENOMEM);
                         goto err;
@@ -712,13 +724,13 @@
                     break;
                 case VC1_CODE_SLICE: {
                     int buf_size3;
-                    tmp = av_realloc_array(slices, sizeof(*slices), (n_slices+1));
+                    tmp = av_realloc_array(slices, sizeof(*slices), n_slices+1);
                     if (!tmp) {
                         ret = AVERROR(ENOMEM);
                         goto err;
                     }
                     slices = tmp;
-                    slices[n_slices].buf = av_mallocz(buf_size + AV_INPUT_BUFFER_PADDING_SIZE);
+                    slices[n_slices].buf = av_mallocz(size + AV_INPUT_BUFFER_PADDING_SIZE);
                     if (!slices[n_slices].buf) {
                         ret = AVERROR(ENOMEM);
                         goto err;
@@ -747,7 +759,7 @@
             } else { // found field marker, unescape second field
                 if (avctx->hwaccel)
                     buf_start_second_field = divider;
-                tmp = av_realloc_array(slices, sizeof(*slices), (n_slices+1));
+                tmp = av_realloc_array(slices, sizeof(*slices), n_slices+1);
                 if (!tmp) {
                     ret = AVERROR(ENOMEM);
                     goto err;
@@ -842,7 +854,12 @@
         ret = AVERROR_INVALIDDATA;
         goto err;
     }
-
+    if ((avctx->codec_id == AV_CODEC_ID_WMV3IMAGE || avctx->codec_id == AV_CODEC_ID_VC1IMAGE)
+        && v->field_mode) {
+        av_log(v->s.avctx, AV_LOG_ERROR, "Sprite decoder: expected Frames not Fields\n");
+        ret = AVERROR_INVALIDDATA;
+        goto err;
+    }
     if ((s->mb_height >> v->field_mode) == 0) {
         av_log(v->s.avctx, AV_LOG_ERROR, "image too short\n");
         ret = AVERROR_INVALIDDATA;
@@ -1021,7 +1038,6 @@
 
         ff_mpeg_er_frame_start(s);
 
-        v->bits = buf_size * 8;
         v->end_mb_x = s->mb_width;
         if (v->field_mode) {
             s->current_picture.f->linesize[0] <<= 1;
@@ -1095,8 +1111,9 @@
                 continue;
             }
             ff_vc1_decode_blocks(v);
-            if (i != n_slices)
+            if (i != n_slices) {
                 s->gb = slices[i].gb;
+            }
         }
         if (v->field_mode) {
             v->second_field = 0;
diff --git a/libavcodec/vc1dsp.c b/libavcodec/vc1dsp.c
index 778b811..c25a6f3 100644
--- a/libavcodec/vc1dsp.c
+++ b/libavcodec/vc1dsp.c
@@ -95,10 +95,10 @@
         d1 = a - d;
         d2 = a - d + b - c;
 
-        top[48]   = ((a << 3) - d1 + rnd1) >> 3;
-        top[56]   = ((b << 3) - d2 + rnd2) >> 3;
-        bottom[0] = ((c << 3) + d2 + rnd1) >> 3;
-        bottom[8] = ((d << 3) + d1 + rnd2) >> 3;
+        top[48]   = ((a * 8) - d1 + rnd1) >> 3;
+        top[56]   = ((b * 8) - d2 + rnd2) >> 3;
+        bottom[0] = ((c * 8) + d2 + rnd1) >> 3;
+        bottom[8] = ((d * 8) + d1 + rnd2) >> 3;
 
         bottom++;
         top++;
@@ -122,10 +122,10 @@
         d1 = a - d;
         d2 = a - d + b - c;
 
-        left[6]  = ((a << 3) - d1 + rnd1) >> 3;
-        left[7]  = ((b << 3) - d2 + rnd2) >> 3;
-        right[0] = ((c << 3) + d2 + rnd1) >> 3;
-        right[1] = ((d << 3) + d1 + rnd2) >> 3;
+        left[6]  = ((a * 8) - d1 + rnd1) >> 3;
+        left[7]  = ((b * 8) - d2 + rnd2) >> 3;
+        right[0] = ((c * 8) + d2 + rnd1) >> 3;
+        right[1] = ((d * 8) + d1 + rnd2) >> 3;
 
         right += right_stride;
         left  += left_stride;
diff --git a/libavcodec/vc2enc.c b/libavcodec/vc2enc.c
index d0101e0..ba5a03e 100644
--- a/libavcodec/vc2enc.c
+++ b/libavcodec/vc2enc.c
@@ -867,6 +867,7 @@
             for (x = 0; x < p->width; x++) {
                 buf[x] = pix[x] - s->diff_offset;
             }
+            memset(&buf[x], 0, (p->coef_stride - p->width)*sizeof(dwtcoef));
             buf += p->coef_stride;
             pix += pix_stride;
         }
@@ -876,6 +877,7 @@
             for (x = 0; x < p->width; x++) {
                 buf[x] = pix[x] - s->diff_offset;
             }
+            memset(&buf[x], 0, (p->coef_stride - p->width)*sizeof(dwtcoef));
             buf += p->coef_stride;
             pix += pix_stride;
         }
diff --git a/libavcodec/vc2enc_dwt.c b/libavcodec/vc2enc_dwt.c
index d22af8a..a8d3f1c 100644
--- a/libavcodec/vc2enc_dwt.c
+++ b/libavcodec/vc2enc_dwt.c
@@ -66,7 +66,7 @@
      */
     for (y = 0; y < synth_height; y++) {
         for (x = 0; x < synth_width; x++)
-            synthl[x] = datal[x] << 1;
+            synthl[x] = datal[x] * 2;
         synthl += synth_width;
         datal += stride;
     }
diff --git a/libavcodec/vdpau.c b/libavcodec/vdpau.c
index 1b2ec98..167f06d 100644
--- a/libavcodec/vdpau.c
+++ b/libavcodec/vdpau.c
@@ -208,8 +208,12 @@
         return vdpau_error(status);
     if (avctx->codec_id == AV_CODEC_ID_HEVC && strncmp(info_string, "NVIDIA ", 7) == 0 &&
         !(avctx->hwaccel_flags & AV_HWACCEL_FLAG_ALLOW_PROFILE_MISMATCH)) {
-        av_log(avctx, AV_LOG_VERBOSE, "HEVC with NVIDIA VDPAU drivers is buggy, skipping.\n");
-        return AVERROR(ENOTSUP);
+        int driver_version = 0;
+        sscanf(info_string, "NVIDIA VDPAU Driver Shared Library  %d", &driver_version);
+        if (driver_version < 410) {
+            av_log(avctx, AV_LOG_VERBOSE, "HEVC with NVIDIA VDPAU drivers is buggy, skipping.\n");
+            return AVERROR(ENOTSUP);
+        }
     }
 
     status = vdctx->get_proc_address(vdctx->device,
diff --git a/libavcodec/vdpau_hevc.c b/libavcodec/vdpau_hevc.c
index 421135b..024ac6e 100644
--- a/libavcodec/vdpau_hevc.c
+++ b/libavcodec/vdpau_hevc.c
@@ -38,6 +38,9 @@
     struct vdpau_picture_context *pic_ctx = pic->hwaccel_picture_private;
 
     VdpPictureInfoHEVC *info = &pic_ctx->info.hevc;
+#ifdef VDP_YCBCR_FORMAT_Y_U_V_444
+    VdpPictureInfoHEVC444 *info2 = &pic_ctx->info.hevc_444;
+#endif
 
     const HEVCSPS *sps = h->ps.sps;
     const HEVCPPS *pps = h->ps.pps;
@@ -355,6 +358,41 @@
         }
     }
 
+#ifdef VDP_YCBCR_FORMAT_Y_U_V_444
+    if (sps->sps_range_extension_flag) {
+        info2->sps_range_extension_flag             = 1;
+        info2->transformSkipRotationEnableFlag      = sps->transform_skip_rotation_enabled_flag;
+        info2->transformSkipContextEnableFlag       = sps->transform_skip_context_enabled_flag;
+        info2->implicitRdpcmEnableFlag              = sps->implicit_rdpcm_enabled_flag;
+        info2->explicitRdpcmEnableFlag              = sps->explicit_rdpcm_enabled_flag;
+        info2->extendedPrecisionProcessingFlag      = sps->extended_precision_processing_flag;
+        info2->intraSmoothingDisabledFlag           = sps->intra_smoothing_disabled_flag;
+        info2->highPrecisionOffsetsEnableFlag       = sps->high_precision_offsets_enabled_flag;
+        info2->persistentRiceAdaptationEnableFlag   = sps->persistent_rice_adaptation_enabled_flag;
+        info2->cabacBypassAlignmentEnableFlag       = sps->cabac_bypass_alignment_enabled_flag;
+    } else {
+        info2->sps_range_extension_flag = 0;
+    }
+    if (pps->pps_range_extensions_flag) {
+        info2->pps_range_extension_flag             = 1;
+        info2->log2MaxTransformSkipSize             = pps->log2_max_transform_skip_block_size;
+        info2->crossComponentPredictionEnableFlag   = pps->cross_component_prediction_enabled_flag;
+        info2->chromaQpAdjustmentEnableFlag         = pps->chroma_qp_offset_list_enabled_flag;
+        info2->diffCuChromaQpAdjustmentDepth        = pps->diff_cu_chroma_qp_offset_depth;
+        info2->chromaQpAdjustmentTableSize          = pps->chroma_qp_offset_list_len_minus1 + 1;
+        info2->log2SaoOffsetScaleLuma               = pps->log2_sao_offset_scale_luma;
+        info2->log2SaoOffsetScaleChroma             = pps->log2_sao_offset_scale_chroma;
+        for (ssize_t i = 0; i < info2->chromaQpAdjustmentTableSize; i++)
+        {
+            info2->cb_qp_adjustment[i] = pps->cb_qp_offset_list[i];
+            info2->cr_qp_adjustment[i] = pps->cr_qp_offset_list[i];
+        }
+
+    } else {
+        info2->pps_range_extension_flag = 0;
+    }
+#endif
+
     return ff_vdpau_common_start_frame(pic_ctx, buffer, size);
 }
 
@@ -406,6 +444,9 @@
     case FF_PROFILE_HEVC_MAIN_STILL_PICTURE:
         profile = VDP_DECODER_PROFILE_HEVC_MAIN_STILL;
         break;
+    case FF_PROFILE_HEVC_REXT:
+        profile = VDP_DECODER_PROFILE_HEVC_MAIN_444;
+        break;
     default:
         return AVERROR(ENOTSUP);
     }
diff --git a/libavcodec/vdpau_internal.h b/libavcodec/vdpau_internal.h
index 4d63e50..b6ea078 100644
--- a/libavcodec/vdpau_internal.h
+++ b/libavcodec/vdpau_internal.h
@@ -51,6 +51,12 @@
 #ifdef VDP_DECODER_PROFILE_HEVC_MAIN
     VdpPictureInfoHEVC        hevc;
 #endif
+#ifdef VDP_YCBCR_FORMAT_Y_U_V_444
+    VdpPictureInfoHEVC444     hevc_444;
+#endif
+#ifdef VDP_DECODER_PROFILE_VP9_PROFILE_0
+    VdpPictureInfoVP9        vp9;
+#endif
 };
 
 typedef struct VDPAUHWContext {
diff --git a/libavcodec/vdpau_vp9.c b/libavcodec/vdpau_vp9.c
new file mode 100644
index 0000000..54e060f
--- /dev/null
+++ b/libavcodec/vdpau_vp9.c
@@ -0,0 +1,241 @@
+/*
+ * VP9 HW decode acceleration through VDPAU
+ *
+ * Copyright (c) 2019 Manoj Gupta Bonda
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include <vdpau/vdpau.h>
+#include "libavutil/pixdesc.h"
+#include "avcodec.h"
+#include "internal.h"
+#include "vp9data.h"
+#include "vp9dec.h"
+#include "hwaccel.h"
+#include "vdpau.h"
+#include "vdpau_internal.h"
+
+static int vdpau_vp9_start_frame(AVCodecContext *avctx,
+                                  const uint8_t *buffer, uint32_t size)
+{
+    VP9Context *s = avctx->priv_data;
+    VP9SharedContext *h = &(s->s);
+    VP9Frame pic = h->frames[CUR_FRAME];
+    struct vdpau_picture_context *pic_ctx = pic.hwaccel_picture_private;
+    int i;
+
+    VdpPictureInfoVP9 *info = &pic_ctx->info.vp9;
+    const AVPixFmtDescriptor *pixdesc = av_pix_fmt_desc_get(avctx->sw_pix_fmt);
+    if (!pixdesc) {
+        return AV_PIX_FMT_NONE;
+    }
+
+    info->width = avctx->width;
+    info->height = avctx->height;
+    /*  fill LvPictureInfoVP9 struct */
+    info->lastReference  = VDP_INVALID_HANDLE;
+    info->goldenReference = VDP_INVALID_HANDLE;
+    info->altReference = VDP_INVALID_HANDLE;
+
+    if (h->refs[h->h.refidx[0]].f && h->refs[h->h.refidx[0]].f->private_ref) {
+        info->lastReference               = ff_vdpau_get_surface_id(h->refs[h->h.refidx[0]].f);
+    }
+    if (h->refs[h->h.refidx[1]].f && h->refs[h->h.refidx[1]].f->private_ref) {
+        info->goldenReference             = ff_vdpau_get_surface_id(h->refs[h->h.refidx[1]].f);
+    }
+    if (h->refs[h->h.refidx[2]].f && h->refs[h->h.refidx[2]].f->private_ref) {
+        info->altReference                = ff_vdpau_get_surface_id(h->refs[h->h.refidx[2]].f);
+    }
+
+    info->profile                  = h->h.profile;
+    info->frameContextIdx          = h->h.framectxid;
+    info->keyFrame                 = h->h.keyframe;
+    info->showFrame                = !h->h.invisible;
+    info->errorResilient           = h->h.errorres;
+    info->frameParallelDecoding    = h->h.parallelmode;
+
+    info->subSamplingX             = pixdesc->log2_chroma_w;
+    info->subSamplingY             = pixdesc->log2_chroma_h;
+
+    info->intraOnly                = h->h.intraonly;
+    info->allowHighPrecisionMv     = h->h.keyframe ? 0 : h->h.highprecisionmvs;
+    info->refreshEntropyProbs      = h->h.refreshctx;
+
+    info->bitDepthMinus8Luma       = pixdesc->comp[0].depth - 8;
+    info->bitDepthMinus8Chroma     = pixdesc->comp[1].depth - 8;
+
+    info->loopFilterLevel          = h->h.filter.level;
+    info->loopFilterSharpness      = h->h.filter.sharpness;
+    info->modeRefLfEnabled         = h->h.lf_delta.enabled;
+
+    info->log2TileColumns          = h->h.tiling.log2_tile_cols;
+    info->log2TileRows             = h->h.tiling.log2_tile_rows;
+
+    info->segmentEnabled           = h->h.segmentation.enabled;
+    info->segmentMapUpdate         = h->h.segmentation.update_map;
+    info->segmentMapTemporalUpdate = h->h.segmentation.temporal;
+    info->segmentFeatureMode       = h->h.segmentation.absolute_vals;
+
+    info->qpYAc                    = h->h.yac_qi;
+    info->qpYDc                    = h->h.ydc_qdelta;
+    info->qpChDc                   = h->h.uvdc_qdelta;
+    info->qpChAc                   = h->h.uvac_qdelta;
+
+    info->resetFrameContext        = h->h.resetctx;
+    info->mcompFilterType          = h->h.filtermode ^ (h->h.filtermode <= 1);
+    info->uncompressedHeaderSize   = h->h.uncompressed_header_size;
+    info->compressedHeaderSize     = h->h.compressed_header_size;
+    info->refFrameSignBias[0]      = 0;
+
+
+    for (i = 0; i < FF_ARRAY_ELEMS(info->mbModeLfDelta); i++)
+        info->mbModeLfDelta[i] = h->h.lf_delta.mode[i];
+
+    for (i = 0; i < FF_ARRAY_ELEMS(info->mbRefLfDelta); i++)
+        info->mbRefLfDelta[i] = h->h.lf_delta.ref[i];
+
+    for (i = 0; i < FF_ARRAY_ELEMS(info->mbSegmentTreeProbs); i++)
+        info->mbSegmentTreeProbs[i] = h->h.segmentation.prob[i];
+
+    for (i = 0; i < FF_ARRAY_ELEMS(info->activeRefIdx); i++) {
+        info->activeRefIdx[i] = h->h.refidx[i];
+        info->segmentPredProbs[i] = h->h.segmentation.pred_prob[i];
+        info->refFrameSignBias[i + 1] = h->h.signbias[i];
+    }
+
+    for (i = 0; i < FF_ARRAY_ELEMS(info->segmentFeatureEnable); i++) {
+        info->segmentFeatureEnable[i][0] = h->h.segmentation.feat[i].q_enabled;
+        info->segmentFeatureEnable[i][1] = h->h.segmentation.feat[i].lf_enabled;
+        info->segmentFeatureEnable[i][2] = h->h.segmentation.feat[i].ref_enabled;
+        info->segmentFeatureEnable[i][3] = h->h.segmentation.feat[i].skip_enabled;
+
+        info->segmentFeatureData[i][0] = h->h.segmentation.feat[i].q_val;
+        info->segmentFeatureData[i][1] = h->h.segmentation.feat[i].lf_val;
+        info->segmentFeatureData[i][2] = h->h.segmentation.feat[i].ref_val;
+        info->segmentFeatureData[i][3] = 0;
+    }
+
+    switch (avctx->colorspace) {
+    default:
+    case AVCOL_SPC_UNSPECIFIED:
+        info->colorSpace = 0;
+        break;
+    case AVCOL_SPC_BT470BG:
+        info->colorSpace = 1;
+        break;
+    case AVCOL_SPC_BT709:
+        info->colorSpace = 2;
+        break;
+    case AVCOL_SPC_SMPTE170M:
+        info->colorSpace = 3;
+        break;
+    case AVCOL_SPC_SMPTE240M:
+        info->colorSpace = 4;
+        break;
+    case AVCOL_SPC_BT2020_NCL:
+        info->colorSpace = 5;
+        break;
+    case AVCOL_SPC_RESERVED:
+        info->colorSpace = 6;
+        break;
+    case AVCOL_SPC_RGB:
+        info->colorSpace = 7;
+        break;
+    }
+
+    return ff_vdpau_common_start_frame(pic_ctx, buffer, size);
+
+}
+
+static const uint8_t start_code_prefix[3] = { 0x00, 0x00, 0x01 };
+
+static int vdpau_vp9_decode_slice(AVCodecContext *avctx,
+                                   const uint8_t *buffer, uint32_t size)
+{
+    VP9SharedContext *h = avctx->priv_data;
+    VP9Frame pic = h->frames[CUR_FRAME];
+    struct vdpau_picture_context *pic_ctx = pic.hwaccel_picture_private;
+
+    int val;
+
+    val = ff_vdpau_add_buffer(pic_ctx, start_code_prefix, 3);
+    if (val)
+        return val;
+
+    val = ff_vdpau_add_buffer(pic_ctx, buffer, size);
+    if (val)
+        return val;
+
+    return 0;
+}
+
+static int vdpau_vp9_end_frame(AVCodecContext *avctx)
+{
+    VP9SharedContext *h = avctx->priv_data;
+    VP9Frame pic = h->frames[CUR_FRAME];
+    struct vdpau_picture_context *pic_ctx = pic.hwaccel_picture_private;
+
+    int val;
+
+    val = ff_vdpau_common_end_frame(avctx, pic.tf.f, pic_ctx);
+    if (val < 0)
+        return val;
+
+    return 0;
+}
+
+static int vdpau_vp9_init(AVCodecContext *avctx)
+{
+    VdpDecoderProfile profile;
+    uint32_t level = avctx->level;
+
+    switch (avctx->profile) {
+    case FF_PROFILE_VP9_0:
+        profile = VDP_DECODER_PROFILE_VP9_PROFILE_0;
+        break;
+    case FF_PROFILE_VP9_1:
+        profile = VDP_DECODER_PROFILE_VP9_PROFILE_1;
+        break;
+    case FF_PROFILE_VP9_2:
+        profile = VDP_DECODER_PROFILE_VP9_PROFILE_2;
+        break;
+    case FF_PROFILE_VP9_3:
+        profile = VDP_DECODER_PROFILE_VP9_PROFILE_3;
+        break;
+    default:
+        return AVERROR(ENOTSUP);
+    }
+
+    return ff_vdpau_common_init(avctx, profile, level);
+}
+
+const AVHWAccel ff_vp9_vdpau_hwaccel = {
+    .name           = "vp9_vdpau",
+    .type           = AVMEDIA_TYPE_VIDEO,
+    .id             = AV_CODEC_ID_VP9,
+    .pix_fmt        = AV_PIX_FMT_VDPAU,
+    .start_frame    = vdpau_vp9_start_frame,
+    .end_frame      = vdpau_vp9_end_frame,
+    .decode_slice   = vdpau_vp9_decode_slice,
+    .frame_priv_data_size = sizeof(struct vdpau_picture_context),
+    .init           = vdpau_vp9_init,
+    .uninit         = ff_vdpau_common_uninit,
+    .frame_params   = ff_vdpau_common_frame_params,
+    .priv_data_size = sizeof(VDPAUContext),
+    .caps_internal  = HWACCEL_CAP_ASYNC_SAFE,
+};
diff --git a/libavcodec/version.h b/libavcodec/version.h
index 7e51585..ad85fb1 100644
--- a/libavcodec/version.h
+++ b/libavcodec/version.h
@@ -28,7 +28,7 @@
 #include "libavutil/version.h"
 
 #define LIBAVCODEC_VERSION_MAJOR  58
-#define LIBAVCODEC_VERSION_MINOR  33
+#define LIBAVCODEC_VERSION_MINOR  81
 #define LIBAVCODEC_VERSION_MICRO 100
 
 #define LIBAVCODEC_VERSION_INT  AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
@@ -132,6 +132,9 @@
 #ifndef FF_API_NEXT
 #define FF_API_NEXT              (LIBAVCODEC_VERSION_MAJOR < 59)
 #endif
+#ifndef FF_API_UNSANITIZED_BITRATES
+#define FF_API_UNSANITIZED_BITRATES (LIBAVCODEC_VERSION_MAJOR < 59)
+#endif
 
 
 #endif /* AVCODEC_VERSION_H */
diff --git a/libavcodec/videodsp_template.c b/libavcodec/videodsp_template.c
index 94c1b71..55123a5 100644
--- a/libavcodec/videodsp_template.c
+++ b/libavcodec/videodsp_template.c
@@ -44,7 +44,8 @@
         src_y = 1 - block_h;
     }
     if (src_x >= w) {
-        src  += (w - 1 - src_x) * sizeof(pixel);
+        // The subtracted expression has an unsigned type and must thus not be negative
+        src  -= (1 + src_x - w) * sizeof(pixel);
         src_x = w - 1;
     } else if (src_x <= -block_w) {
         src  += (1 - block_w - src_x) * sizeof(pixel);
diff --git a/libavcodec/videotoolbox.c b/libavcodec/videotoolbox.c
index ac45e23..8773de3 100644
--- a/libavcodec/videotoolbox.c
+++ b/libavcodec/videotoolbox.c
@@ -26,6 +26,7 @@
 #include "vt_internal.h"
 #include "libavutil/avutil.h"
 #include "libavutil/hwcontext.h"
+#include "libavutil/pixdesc.h"
 #include "bytestream.h"
 #include "decode.h"
 #include "h264dec.h"
@@ -90,6 +91,11 @@
         return AVERROR_EXTERNAL;
     }
 
+    frame->crop_right = 0;
+    frame->crop_left = 0;
+    frame->crop_top = 0;
+    frame->crop_bottom = 0;
+
     frame->data[3] = (uint8_t*)ref->pixbuf;
 
     if (ref->hw_frames_ctx) {
@@ -176,26 +182,31 @@
 CFDataRef ff_videotoolbox_hvcc_extradata_create(AVCodecContext *avctx)
 {
     HEVCContext *h = avctx->priv_data;
-    const HEVCVPS *vps = (const HEVCVPS *)h->ps.vps_list[0]->data;
-    const HEVCSPS *sps = (const HEVCSPS *)h->ps.sps_list[0]->data;
-    int i, num_pps = 0;
+    int i, num_vps = 0, num_sps = 0, num_pps = 0;
+    const HEVCVPS *vps = h->ps.vps;
+    const HEVCSPS *sps = h->ps.sps;
     const HEVCPPS *pps = h->ps.pps;
     PTLCommon ptlc = vps->ptl.general_ptl;
     VUI vui = sps->vui;
     uint8_t parallelismType;
     CFDataRef data = NULL;
     uint8_t *p;
-    int vt_extradata_size = 23 + 5 + vps->data_size + 5 + sps->data_size + 3;
+    int vt_extradata_size = 23 + 3 + 3 + 3;
     uint8_t *vt_extradata;
 
-    for (i = 0; i < HEVC_MAX_PPS_COUNT; i++) {
-        if (h->ps.pps_list[i]) {
-            const HEVCPPS *pps = (const HEVCPPS *)h->ps.pps_list[i]->data;
-            vt_extradata_size += 2 + pps->data_size;
-            num_pps++;
-        }
+#define COUNT_SIZE_PS(T, t) \
+    for (i = 0; i < HEVC_MAX_##T##PS_COUNT; i++) { \
+        if (h->ps.t##ps_list[i]) { \
+            const HEVC##T##PS *lps = (const HEVC##T##PS *)h->ps.t##ps_list[i]->data; \
+            vt_extradata_size += 2 + lps->data_size; \
+            num_##t##ps++; \
+        } \
     }
 
+    COUNT_SIZE_PS(V, v)
+    COUNT_SIZE_PS(S, s)
+    COUNT_SIZE_PS(P, p)
+
     vt_extradata = av_malloc(vt_extradata_size);
     if (!vt_extradata)
         return NULL;
@@ -286,44 +297,33 @@
     AV_W8(p + 22, 3);
 
     p += 23;
-    /* vps */
-    /*
-     * bit(1) array_completeness;
-     * unsigned int(1) reserved = 0;
-     * unsigned int(6) NAL_unit_type;
-     */
-    AV_W8(p, 1 << 7 |
-             HEVC_NAL_VPS & 0x3f);
-    /* unsigned int(16) numNalus; */
-    AV_WB16(p + 1, 1);
-    /* unsigned int(16) nalUnitLength; */
-    AV_WB16(p + 3, vps->data_size);
-    /* bit(8*nalUnitLength) nalUnit; */
-    memcpy(p + 5, vps->data, vps->data_size);
-    p += 5 + vps->data_size;
 
-    /* sps */
-    AV_W8(p, 1 << 7 |
-             HEVC_NAL_SPS & 0x3f);
-    AV_WB16(p + 1, 1);
-    AV_WB16(p + 3, sps->data_size);
-    memcpy(p + 5, sps->data, sps->data_size);
-    p += 5 + sps->data_size;
-
-    /* pps */
-    AV_W8(p, 1 << 7 |
-             HEVC_NAL_PPS & 0x3f);
-    AV_WB16(p + 1, num_pps);
-    p += 3;
-    for (i = 0; i < HEVC_MAX_PPS_COUNT; i++) {
-        if (h->ps.pps_list[i]) {
-            const HEVCPPS *pps = (const HEVCPPS *)h->ps.pps_list[i]->data;
-            AV_WB16(p, pps->data_size);
-            memcpy(p + 2, pps->data, pps->data_size);
-            p += 2 + pps->data_size;
-        }
+#define APPEND_PS(T, t) \
+    /* \
+     * bit(1) array_completeness; \
+     * unsigned int(1) reserved = 0; \
+     * unsigned int(6) NAL_unit_type; \
+     */ \
+    AV_W8(p, 1 << 7 | \
+             HEVC_NAL_##T##PS & 0x3f); \
+    /* unsigned int(16) numNalus; */ \
+    AV_WB16(p + 1, num_##t##ps); \
+    p += 3; \
+    for (i = 0; i < HEVC_MAX_##T##PS_COUNT; i++) { \
+        if (h->ps.t##ps_list[i]) { \
+            const HEVC##T##PS *lps = (const HEVC##T##PS *)h->ps.t##ps_list[i]->data; \
+            /* unsigned int(16) nalUnitLength; */ \
+            AV_WB16(p, lps->data_size); \
+            /* bit(8*nalUnitLength) nalUnit; */ \
+            memcpy(p + 2, lps->data, lps->data_size); \
+            p += 2 + lps->data_size; \
+        } \
     }
 
+    APPEND_PS(V, v)
+    APPEND_PS(S, s)
+    APPEND_PS(P, p)
+
     av_assert0(p - vt_extradata == vt_extradata_size);
 
     data = CFDataCreate(kCFAllocatorDefault, vt_extradata, vt_extradata_size);
@@ -617,7 +617,7 @@
     }
 
     if (!image_buffer) {
-        av_log(NULL, AV_LOG_DEBUG, "vt decoder cb: output image buffer is null\n");
+        av_log(avctx, AV_LOG_DEBUG, "vt decoder cb: output image buffer is null\n");
         return;
     }
 
@@ -969,6 +969,12 @@
     HEVCContext *h = avctx->priv_data;
     AVFrame *frame = h->ref->frame;
     VTContext *vtctx = avctx->internal->hwaccel_priv_data;
+
+    h->output_frame->crop_right = 0;
+    h->output_frame->crop_left = 0;
+    h->output_frame->crop_top = 0;
+    h->output_frame->crop_bottom = 0;
+
     int ret = videotoolbox_common_end_frame(avctx, frame);
     vtctx->bitstream_size = 0;
     return ret;
@@ -1015,6 +1021,19 @@
     return 0;
 }
 
+static enum AVPixelFormat videotoolbox_best_pixel_format(AVCodecContext *avctx) {
+    const AVPixFmtDescriptor *descriptor = av_pix_fmt_desc_get(avctx->pix_fmt);
+    if (!descriptor)
+        return AV_PIX_FMT_NV12; // same as av_videotoolbox_alloc_context()
+
+    int depth = descriptor->comp[0].depth;
+    if (depth > 8) {
+        return AV_PIX_FMT_P010;
+    }
+
+    return AV_PIX_FMT_NV12;
+}
+
 static int videotoolbox_common_init(AVCodecContext *avctx)
 {
     VTContext *vtctx = avctx->internal->hwaccel_priv_data;
@@ -1048,7 +1067,7 @@
 
         hw_frames = (AVHWFramesContext*)avctx->hw_frames_ctx->data;
         hw_frames->format = AV_PIX_FMT_VIDEOTOOLBOX;
-        hw_frames->sw_format = AV_PIX_FMT_NV12; // same as av_videotoolbox_alloc_context()
+        hw_frames->sw_format = videotoolbox_best_pixel_format(avctx);
         hw_frames->width = avctx->width;
         hw_frames->height = avctx->height;
 
@@ -1065,8 +1084,9 @@
         goto fail;
     }
 
+    bool full_range = avctx->color_range == AVCOL_RANGE_JPEG;
     vtctx->vt_ctx->cv_pix_fmt_type =
-        av_map_videotoolbox_format_from_pixfmt(hw_frames->sw_format);
+        av_map_videotoolbox_format_from_pixfmt2(hw_frames->sw_format, full_range);
     if (!vtctx->vt_ctx->cv_pix_fmt_type) {
         av_log(avctx, AV_LOG_ERROR, "Unknown sw_format.\n");
         err = AVERROR(EINVAL);
@@ -1092,7 +1112,7 @@
     frames_ctx->format            = AV_PIX_FMT_VIDEOTOOLBOX;
     frames_ctx->width             = avctx->coded_width;
     frames_ctx->height            = avctx->coded_height;
-    frames_ctx->sw_format         = AV_PIX_FMT_NV12;
+    frames_ctx->sw_format         = videotoolbox_best_pixel_format(avctx);
 
     return 0;
 }
@@ -1124,7 +1144,7 @@
     .end_frame      = videotoolbox_hevc_end_frame,
     .frame_params   = videotoolbox_frame_params,
     .init           = videotoolbox_common_init,
-    .uninit         = ff_videotoolbox_uninit,
+    .uninit         = videotoolbox_uninit,
     .priv_data_size = sizeof(VTContext),
 };
 
@@ -1189,18 +1209,29 @@
     .priv_data_size = sizeof(VTContext),
 };
 
-AVVideotoolboxContext *av_videotoolbox_alloc_context(void)
+static AVVideotoolboxContext *av_videotoolbox_alloc_context_with_pix_fmt(enum AVPixelFormat pix_fmt,
+                                                                         bool full_range)
 {
     AVVideotoolboxContext *ret = av_mallocz(sizeof(*ret));
 
     if (ret) {
         ret->output_callback = videotoolbox_decoder_callback;
-        ret->cv_pix_fmt_type = kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange;
+
+        OSType cv_pix_fmt_type = av_map_videotoolbox_format_from_pixfmt2(pix_fmt, full_range);
+        if (cv_pix_fmt_type == 0) {
+            cv_pix_fmt_type = kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange;
+        }
+        ret->cv_pix_fmt_type = cv_pix_fmt_type;
     }
 
     return ret;
 }
 
+AVVideotoolboxContext *av_videotoolbox_alloc_context(void)
+{
+    return av_videotoolbox_alloc_context_with_pix_fmt(AV_PIX_FMT_NONE, false);
+}
+
 int av_videotoolbox_default_init(AVCodecContext *avctx)
 {
     return av_videotoolbox_default_init2(avctx, NULL);
@@ -1208,7 +1239,9 @@
 
 int av_videotoolbox_default_init2(AVCodecContext *avctx, AVVideotoolboxContext *vtctx)
 {
-    avctx->hwaccel_context = vtctx ?: av_videotoolbox_alloc_context();
+    enum AVPixelFormat pix_fmt = videotoolbox_best_pixel_format(avctx);
+    bool full_range = avctx->color_range == AVCOL_RANGE_JPEG;
+    avctx->hwaccel_context = vtctx ?: av_videotoolbox_alloc_context_with_pix_fmt(pix_fmt, full_range);
     if (!avctx->hwaccel_context)
         return AVERROR(ENOMEM);
     return videotoolbox_start(avctx);
diff --git a/libavcodec/videotoolboxenc.c b/libavcodec/videotoolboxenc.c
index 50aba2d..cc08cf6 100644
--- a/libavcodec/videotoolboxenc.c
+++ b/libavcodec/videotoolboxenc.c
@@ -39,6 +39,11 @@
 enum { kCMVideoCodecType_HEVC = 'hvc1' };
 #endif
 
+#if !HAVE_KCVPIXELFORMATTYPE_420YPCBCR10BIPLANARVIDEORANGE
+enum { kCVPixelFormatType_420YpCbCr10BiPlanarFullRange = 'xf20' };
+enum { kCVPixelFormatType_420YpCbCr10BiPlanarVideoRange = 'x420' };
+#endif
+
 typedef OSStatus (*getParameterSetAtIndex)(CMFormatDescriptionRef videoDesc,
                                            size_t parameterSetIndex,
                                            const uint8_t **parameterSetPointerOut,
@@ -75,6 +80,8 @@
     CFStringRef kVTProfileLevel_H264_High_5_1;
     CFStringRef kVTProfileLevel_H264_High_5_2;
     CFStringRef kVTProfileLevel_H264_High_AutoLevel;
+    CFStringRef kVTProfileLevel_H264_Extended_5_0;
+    CFStringRef kVTProfileLevel_H264_Extended_AutoLevel;
 
     CFStringRef kVTProfileLevel_HEVC_Main_AutoLevel;
     CFStringRef kVTProfileLevel_HEVC_Main10_AutoLevel;
@@ -132,6 +139,8 @@
     GET_SYM(kVTProfileLevel_H264_High_5_1,           "H264_High_5_1");
     GET_SYM(kVTProfileLevel_H264_High_5_2,           "H264_High_5_2");
     GET_SYM(kVTProfileLevel_H264_High_AutoLevel,     "H264_High_AutoLevel");
+    GET_SYM(kVTProfileLevel_H264_Extended_5_0,       "H264_Extended_5_0");
+    GET_SYM(kVTProfileLevel_H264_Extended_AutoLevel, "H264_Extended_AutoLevel");
 
     GET_SYM(kVTProfileLevel_HEVC_Main_AutoLevel,     "HEVC_Main_AutoLevel");
     GET_SYM(kVTProfileLevel_HEVC_Main10_AutoLevel,   "HEVC_Main10_AutoLevel");
@@ -149,6 +158,7 @@
     H264_PROF_BASELINE,
     H264_PROF_MAIN,
     H264_PROF_HIGH,
+    H264_PROF_EXTENDED,
     H264_PROF_COUNT
 } VT_H264Profile;
 
@@ -210,6 +220,7 @@
     int64_t frames_after;
 
     int64_t allow_sw;
+    int64_t require_sw;
 
     bool flushing;
     bool has_b_frames;
@@ -563,12 +574,16 @@
         return;
     }
 
-    if (status || !sample_buffer) {
+    if (status) {
         av_log(avctx, AV_LOG_ERROR, "Error encoding frame: %d\n", (int)status);
         set_async_error(vtctx, AVERROR_EXTERNAL);
         return;
     }
 
+    if (!sample_buffer) {
+        return;
+    }
+
     if (!avctx->extradata && (avctx->flags & AV_CODEC_FLAG_GLOBAL_HEADER)) {
         int set_status = set_extradata(avctx, sample_buffer);
         if (set_status) {
@@ -698,6 +713,14 @@
                                   compat_keys.kVTProfileLevel_H264_High_5_2;       break;
             }
             break;
+        case H264_PROF_EXTENDED:
+            switch (vtctx->level) {
+                case  0: *profile_level_val =
+                                  compat_keys.kVTProfileLevel_H264_Extended_AutoLevel; break;
+                case 50: *profile_level_val =
+                                  compat_keys.kVTProfileLevel_H264_Extended_5_0;       break;
+            }
+            break;
     }
 
     if (!*profile_level_val) {
@@ -761,6 +784,11 @@
         *av_pixel_format = range == AVCOL_RANGE_JPEG ?
                                         kCVPixelFormatType_420YpCbCr8PlanarFullRange :
                                         kCVPixelFormatType_420YpCbCr8Planar;
+    } else if (fmt == AV_PIX_FMT_P010LE) {
+        *av_pixel_format = range == AVCOL_RANGE_JPEG ?
+                                        kCVPixelFormatType_420YpCbCr10BiPlanarFullRange :
+                                        kCVPixelFormatType_420YpCbCr10BiPlanarVideoRange;
+        *av_pixel_format = kCVPixelFormatType_420YpCbCr10BiPlanarVideoRange;
     } else {
         return AVERROR(EINVAL);
     }
@@ -866,6 +894,14 @@
             *primaries = NULL;
             break;
 
+        case AVCOL_PRI_BT470BG:
+            *primaries = kCVImageBufferColorPrimaries_EBU_3213;
+            break;
+
+        case AVCOL_PRI_SMPTE170M:
+            *primaries = kCVImageBufferColorPrimaries_SMPTE_C;
+            break;
+
         case AVCOL_PRI_BT709:
             *primaries = kCVImageBufferColorPrimaries_ITU_R_709_2;
             break;
@@ -904,6 +940,22 @@
             *transfer_fnc = kCVImageBufferTransferFunction_SMPTE_240M_1995;
             break;
 
+#if HAVE_KCVIMAGEBUFFERTRANSFERFUNCTION_SMPTE_ST_2084_PQ
+        case AVCOL_TRC_SMPTE2084:
+            *transfer_fnc = kCVImageBufferTransferFunction_SMPTE_ST_2084_PQ;
+            break;
+#endif
+#if HAVE_KCVIMAGEBUFFERTRANSFERFUNCTION_LINEAR
+        case AVCOL_TRC_LINEAR:
+            *transfer_fnc = kCVImageBufferTransferFunction_Linear;
+            break;
+#endif
+#if HAVE_KCVIMAGEBUFFERTRANSFERFUNCTION_ITU_R_2100_HLG
+        case AVCOL_TRC_ARIB_STD_B67:
+            *transfer_fnc = kCVImageBufferTransferFunction_ITU_R_2100_HLG;
+            break;
+#endif
+
         case AVCOL_TRC_GAMMA22:
             gamma = 2.2;
             *transfer_fnc = kCVImageBufferTransferFunction_UseGamma;
@@ -922,6 +974,7 @@
             break;
 
         default:
+            *transfer_fnc = NULL;
             av_log(avctx, AV_LOG_ERROR, "Transfer function %s is not supported.\n", av_color_transfer_name(trc));
             return -1;
     }
@@ -1067,7 +1120,7 @@
                                         kVTCompressionPropertyKey_ProfileLevel,
                                         profile_level);
             if (status) {
-                av_log(avctx, AV_LOG_ERROR, "Error setting profile/level property: %d\n", status);
+                av_log(avctx, AV_LOG_ERROR, "Error setting profile/level property: %d. Output will be encoded using a supported profile/level combination.\n", status);
             }
         }
     }
@@ -1314,7 +1367,11 @@
     if (!enc_info) return AVERROR(ENOMEM);
 
 #if !TARGET_OS_IPHONE
-    if (!vtctx->allow_sw) {
+    if(vtctx->require_sw) {
+        CFDictionarySetValue(enc_info,
+                             compat_keys.kVTVideoEncoderSpecification_EnableHardwareAcceleratedVideoEncoder,
+                             kCFBooleanFalse);
+    } else if (!vtctx->allow_sw) {
         CFDictionarySetValue(enc_info,
                              compat_keys.kVTVideoEncoderSpecification_RequireHardwareAcceleratedVideoEncoder,
                              kCFBooleanTrue);
@@ -1981,6 +2038,17 @@
         strides[2] = frame ? frame->linesize[2] : (avctx->width + 1) / 2;
         break;
 
+    case AV_PIX_FMT_P010LE:
+        *plane_count = 2;
+        widths[0] = avctx->width;
+        heights[0] = avctx->height;
+        strides[0] = frame ? frame->linesize[0] : (avctx->width * 2 + 63) & -64;
+
+        widths[1] = (avctx->width + 1) / 2;
+        heights[1] = (avctx->height + 1) / 2;
+        strides[1] = frame ? frame->linesize[1] : ((avctx->width + 1) / 2 + 63) & -64;
+        break;
+
     default:
         av_log(
                avctx,
@@ -2006,19 +2074,6 @@
     return 0;
 }
 
-#if !TARGET_OS_IPHONE
-//Not used on iOS - frame is always copied.
-static void free_avframe(
-    void       *release_ctx,
-    const void *data,
-    size_t      size,
-    size_t      plane_count,
-    const void *plane_addresses[])
-{
-    AVFrame *frame = release_ctx;
-    av_frame_free(&frame);
-}
-#else
 //Not used on OSX - frame is never copied.
 static int copy_avframe_to_pixel_buffer(AVCodecContext   *avctx,
                                         const AVFrame    *frame,
@@ -2111,7 +2166,6 @@
 
     return 0;
 }
-#endif //!TARGET_OS_IPHONE
 
 static int create_cv_pixel_buffer(AVCodecContext   *avctx,
                                   const AVFrame    *frame,
@@ -2124,18 +2178,8 @@
     size_t strides[AV_NUM_DATA_POINTERS];
     int status;
     size_t contiguous_buf_size;
-#if TARGET_OS_IPHONE
     CVPixelBufferPoolRef pix_buf_pool;
     VTEncContext* vtctx = avctx->priv_data;
-#else
-    CFMutableDictionaryRef pix_buf_attachments = CFDictionaryCreateMutable(
-                                                   kCFAllocatorDefault,
-                                                   10,
-                                                   &kCFCopyStringDictionaryKeyCallBacks,
-                                                   &kCFTypeDictionaryValueCallBacks);
-
-    if (!pix_buf_attachments) return AVERROR(ENOMEM);
-#endif
 
     if (avctx->pix_fmt == AV_PIX_FMT_VIDEOTOOLBOX) {
         av_assert0(frame->format == AV_PIX_FMT_VIDEOTOOLBOX);
@@ -2175,7 +2219,6 @@
         return AVERROR_EXTERNAL;
     }
 
-#if TARGET_OS_IPHONE
     pix_buf_pool = VTCompressionSessionGetPixelBufferPool(vtctx->session);
     if (!pix_buf_pool) {
         /* On iOS, the VT session is invalidated when the APP switches from
@@ -2217,43 +2260,6 @@
         *cv_img = NULL;
         return status;
     }
-#else
-    AVFrame *enc_frame = av_frame_alloc();
-    if (!enc_frame) return AVERROR(ENOMEM);
-
-    status = av_frame_ref(enc_frame, frame);
-    if (status) {
-        av_frame_free(&enc_frame);
-        return status;
-    }
-
-    status = CVPixelBufferCreateWithPlanarBytes(
-        kCFAllocatorDefault,
-        enc_frame->width,
-        enc_frame->height,
-        color,
-        NULL,
-        contiguous_buf_size,
-        plane_count,
-        (void **)enc_frame->data,
-        widths,
-        heights,
-        strides,
-        free_avframe,
-        enc_frame,
-        NULL,
-        cv_img
-    );
-
-    add_color_attr(avctx, pix_buf_attachments);
-    CVBufferSetAttachments(*cv_img, pix_buf_attachments, kCVAttachmentMode_ShouldPropagate);
-    CFRelease(pix_buf_attachments);
-
-    if (status) {
-        av_log(avctx, AV_LOG_ERROR, "Error: Could not create CVPixelBuffer: %d\n", status);
-        return AVERROR_EXTERNAL;
-    }
-#endif
 
     return 0;
 }
@@ -2405,21 +2411,11 @@
                                     CFDictionaryRef  pixel_buffer_info)
 {
     VTEncContext *vtctx = avctx->priv_data;
-    AVFrame *frame = av_frame_alloc();
-    int y_size = avctx->width * avctx->height;
-    int chroma_size = (avctx->width / 2) * (avctx->height / 2);
-    CMSampleBufferRef buf = NULL;
     int status;
-
-    if (!frame)
-        return AVERROR(ENOMEM);
-
-    frame->buf[0] = av_buffer_alloc(y_size + 2 * chroma_size);
-
-    if(!frame->buf[0]){
-        status = AVERROR(ENOMEM);
-        goto pe_cleanup;
-    }
+    CVPixelBufferPoolRef pool = NULL;
+    CVPixelBufferRef pix_buf = NULL;
+    CMTime time;
+    CMSampleBufferRef buf = NULL;
 
     status = vtenc_create_encoder(avctx,
                                   codec_type,
@@ -2431,39 +2427,36 @@
     if (status)
         goto pe_cleanup;
 
-    frame->data[0] = frame->buf[0]->data;
-    memset(frame->data[0],   0,      y_size);
-
-    frame->data[1] = frame->buf[0]->data + y_size;
-    memset(frame->data[1], 128, chroma_size);
-
-
-    if (avctx->pix_fmt == AV_PIX_FMT_YUV420P) {
-        frame->data[2] = frame->buf[0]->data + y_size + chroma_size;
-        memset(frame->data[2], 128, chroma_size);
+    pool = VTCompressionSessionGetPixelBufferPool(vtctx->session);
+    if(!pool){
+        av_log(avctx, AV_LOG_ERROR, "Error getting pixel buffer pool.\n");
+        goto pe_cleanup;
     }
 
-    frame->linesize[0] = avctx->width;
+    status = CVPixelBufferPoolCreatePixelBuffer(NULL,
+                                                pool,
+                                                &pix_buf);
 
-    if (avctx->pix_fmt == AV_PIX_FMT_YUV420P) {
-        frame->linesize[1] =
-        frame->linesize[2] = (avctx->width + 1) / 2;
-    } else {
-        frame->linesize[1] = (avctx->width + 1) / 2;
+    if(status != kCVReturnSuccess){
+        av_log(avctx, AV_LOG_ERROR, "Error creating frame from pool: %d\n", status);
+        goto pe_cleanup;
     }
 
-    frame->format          = avctx->pix_fmt;
-    frame->width           = avctx->width;
-    frame->height          = avctx->height;
-    frame->colorspace      = avctx->colorspace;
-    frame->color_range     = avctx->color_range;
-    frame->color_trc       = avctx->color_trc;
-    frame->color_primaries = avctx->color_primaries;
+    time = CMTimeMake(0, avctx->time_base.den);
+    status = VTCompressionSessionEncodeFrame(vtctx->session,
+                                             pix_buf,
+                                             time,
+                                             kCMTimeInvalid,
+                                             NULL,
+                                             NULL,
+                                             NULL);
 
-    frame->pts = 0;
-    status = vtenc_send_frame(avctx, vtctx, frame);
     if (status) {
-        av_log(avctx, AV_LOG_ERROR, "Error sending frame: %d\n", status);
+        av_log(avctx,
+               AV_LOG_ERROR,
+               "Error sending frame for extradata: %d\n",
+               status);
+
         goto pe_cleanup;
     }
 
@@ -2491,9 +2484,6 @@
     vtctx->session = NULL;
     vtctx->frame_ct_out = 0;
 
-    av_frame_unref(frame);
-    av_frame_free(&frame);
-
     av_assert0(status != 0 || (avctx->extradata && avctx->extradata_size > 0));
 
     return status;
@@ -2532,17 +2522,27 @@
     return 0;
 }
 
-static const enum AVPixelFormat pix_fmts[] = {
+static const enum AVPixelFormat avc_pix_fmts[] = {
     AV_PIX_FMT_VIDEOTOOLBOX,
     AV_PIX_FMT_NV12,
     AV_PIX_FMT_YUV420P,
     AV_PIX_FMT_NONE
 };
 
+static const enum AVPixelFormat hevc_pix_fmts[] = {
+    AV_PIX_FMT_VIDEOTOOLBOX,
+    AV_PIX_FMT_NV12,
+    AV_PIX_FMT_YUV420P,
+    AV_PIX_FMT_P010LE,
+    AV_PIX_FMT_NONE
+};
+
 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
 #define COMMON_OPTIONS \
     { "allow_sw", "Allow software encoding", OFFSET(allow_sw), AV_OPT_TYPE_BOOL, \
         { .i64 = 0 }, 0, 1, VE }, \
+    { "require_sw", "Require software encoding", OFFSET(require_sw), AV_OPT_TYPE_BOOL, \
+        { .i64 = 0 }, 0, 1, VE }, \
     { "realtime", "Hint that encoding should happen in real-time if not faster (e.g. capturing from camera).", \
         OFFSET(realtime), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VE }, \
     { "frames_before", "Other frames will come before the frames in this session. This helps smooth concatenation issues.", \
@@ -2556,6 +2556,7 @@
     { "baseline", "Baseline Profile", 0, AV_OPT_TYPE_CONST, { .i64 = H264_PROF_BASELINE }, INT_MIN, INT_MAX, VE, "profile" },
     { "main",     "Main Profile",     0, AV_OPT_TYPE_CONST, { .i64 = H264_PROF_MAIN     }, INT_MIN, INT_MAX, VE, "profile" },
     { "high",     "High Profile",     0, AV_OPT_TYPE_CONST, { .i64 = H264_PROF_HIGH     }, INT_MIN, INT_MAX, VE, "profile" },
+    { "extended", "Extend Profile",   0, AV_OPT_TYPE_CONST, { .i64 = H264_PROF_EXTENDED }, INT_MIN, INT_MAX, VE, "profile" },
 
     { "level", "Level", OFFSET(level), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 52, VE, "level" },
     { "1.3", "Level 1.3, only available with Baseline Profile", 0, AV_OPT_TYPE_CONST, { .i64 = 13 }, INT_MIN, INT_MAX, VE, "level" },
@@ -2594,7 +2595,7 @@
     .type             = AVMEDIA_TYPE_VIDEO,
     .id               = AV_CODEC_ID_H264,
     .priv_data_size   = sizeof(VTEncContext),
-    .pix_fmts         = pix_fmts,
+    .pix_fmts         = avc_pix_fmts,
     .init             = vtenc_init,
     .encode2          = vtenc_frame,
     .close            = vtenc_close,
@@ -2626,7 +2627,7 @@
     .type             = AVMEDIA_TYPE_VIDEO,
     .id               = AV_CODEC_ID_HEVC,
     .priv_data_size   = sizeof(VTEncContext),
-    .pix_fmts         = pix_fmts,
+    .pix_fmts         = hevc_pix_fmts,
     .init             = vtenc_init,
     .encode2          = vtenc_frame,
     .close            = vtenc_close,
diff --git a/libavcodec/vmdaudio.c b/libavcodec/vmdaudio.c
index e8c8a06..dfbd49f 100644
--- a/libavcodec/vmdaudio.c
+++ b/libavcodec/vmdaudio.c
@@ -76,7 +76,9 @@
         av_log(avctx, AV_LOG_ERROR, "invalid number of channels\n");
         return AVERROR(EINVAL);
     }
-    if (avctx->block_align < 1 || avctx->block_align % avctx->channels) {
+    if (avctx->block_align < 1 || avctx->block_align % avctx->channels ||
+        avctx->block_align > INT_MAX - avctx->channels
+    ) {
         av_log(avctx, AV_LOG_ERROR, "invalid block align\n");
         return AVERROR(EINVAL);
     }
@@ -179,6 +181,9 @@
     /* drop incomplete chunks */
     buf_size     = audio_chunks * s->chunk_size;
 
+    if (silent_chunks + audio_chunks >= INT_MAX / avctx->block_align)
+        return AVERROR_INVALIDDATA;
+
     /* get output buffer */
     frame->nb_samples = ((silent_chunks + audio_chunks) * avctx->block_align) /
                         avctx->channels;
diff --git a/libavcodec/vmdvideo.c b/libavcodec/vmdvideo.c
index b97032f..c1dc5b9 100644
--- a/libavcodec/vmdvideo.c
+++ b/libavcodec/vmdvideo.c
@@ -226,7 +226,7 @@
         frame_y + frame_height > s->avctx->height) {
         av_log(s->avctx, AV_LOG_ERROR,
                "Invalid vertical range %d-%d\n",
-               frame_x, frame_width);
+               frame_y, frame_height);
         return AVERROR_INVALIDDATA;
     }
 
diff --git a/libavcodec/vmnc.c b/libavcodec/vmnc.c
index 30b1414..7f441bc 100644
--- a/libavcodec/vmnc.c
+++ b/libavcodec/vmnc.c
@@ -333,10 +333,14 @@
     uint8_t *outptr;
     int dx, dy, w, h, depth, enc, chunks, res, size_left, ret;
 
-    if ((ret = ff_reget_buffer(avctx, c->pic)) < 0)
-        return ret;
-
     bytestream2_init(gb, buf, buf_size);
+    bytestream2_skip(gb, 2);
+    chunks = bytestream2_get_be16(gb);
+    if (12LL * chunks > bytestream2_get_bytes_left(gb))
+        return AVERROR_INVALIDDATA;
+
+    if ((ret = ff_reget_buffer(avctx, c->pic, 0)) < 0)
+        return ret;
 
     c->pic->key_frame = 0;
     c->pic->pict_type = AV_PICTURE_TYPE_P;
@@ -369,8 +373,7 @@
             }
         }
     }
-    bytestream2_skip(gb, 2);
-    chunks = bytestream2_get_be16(gb);
+
     while (chunks--) {
         if (bytestream2_get_bytes_left(gb) < 12) {
             av_log(avctx, AV_LOG_ERROR, "Premature end of data!\n");
diff --git a/libavcodec/vorbisdec.c b/libavcodec/vorbisdec.c
index 00e9cd8..be6d1b2 100644
--- a/libavcodec/vorbisdec.c
+++ b/libavcodec/vorbisdec.c
@@ -1097,13 +1097,14 @@
 {
     vorbis_floor0 *vf = &vfu->t0;
     float *lsp = vf->lsp;
-    unsigned amplitude, book_idx;
+    unsigned book_idx;
+    uint64_t amplitude;
     unsigned blockflag = vc->modes[vc->mode_number].blockflag;
 
     if (!vf->amplitude_bits)
         return 1;
 
-    amplitude = get_bits(&vc->gb, vf->amplitude_bits);
+    amplitude = get_bits64(&vc->gb, vf->amplitude_bits);
     if (amplitude > 0) {
         float last = 0;
         unsigned idx, lsp_len = 0;
@@ -1127,8 +1128,10 @@
             ff_dlog(NULL, "floor0 dec: maximum depth: %d\n", codebook.maxdepth);
             /* read temp vector */
             vec_off = get_vlc2(&vc->gb, codebook.vlc.table,
-                               codebook.nb_bits, codebook.maxdepth)
-                      * codebook.dimensions;
+                               codebook.nb_bits, codebook.maxdepth);
+            if (vec_off < 0)
+                return AVERROR_INVALIDDATA;
+            vec_off *= codebook.dimensions;
             ff_dlog(NULL, "floor0 dec: vector offset: %d\n", vec_off);
             /* copy each vector component and add last to it */
             for (idx = 0; idx < codebook.dimensions; ++idx)
@@ -1179,9 +1182,12 @@
                     q *= q;
                 }
 
+                if (p + q == 0.0)
+                    return AVERROR_INVALIDDATA;
+
                 /* calculate linear floor value */
                 q = exp((((amplitude*vf->amplitude_offset) /
-                          (((1 << vf->amplitude_bits) - 1) * sqrt(p + q)))
+                          (((1ULL << vf->amplitude_bits) - 1) * sqrt(p + q)))
                          - vf->amplitude_offset) * .11512925f);
 
                 /* fill vector */
@@ -1355,8 +1361,12 @@
                 return AVERROR_INVALIDDATA;
             }
 
-            av_assert0(vr->classifications > 1); //needed for inverse[]
-
+            if (vr->classifications == 1) {
+                for (i = partition_count + c_p_c - 1; i >= partition_count; i--) {
+                    if (i < ptns_to_read)
+                        vr->classifs[p + i] = 0;
+                }
+            } else {
             for (i = partition_count + c_p_c - 1; i >= partition_count; i--) {
                 temp2 = (((uint64_t)temp) * inverse_class) >> 32;
 
@@ -1364,6 +1374,7 @@
                     vr->classifs[p + i] = temp - temp2 * vr->classifications;
                 temp = temp2;
             }
+            }
         }
         p += ptns_to_read;
     }
@@ -1431,7 +1442,7 @@
                         int vqbook  = vr->books[vqclass][pass];
 
                         if (vqbook >= 0 && vc->codebooks[vqbook].codevectors) {
-                            unsigned coffs;
+                            int coffs;
                             unsigned dim  = vc->codebooks[vqbook].dimensions;
                             unsigned step = FASTDIV(vr->partition_size << 1, dim << 1);
                             vorbis_codebook codebook = vc->codebooks[vqbook];
@@ -1440,14 +1451,20 @@
 
                                 voffs = voffset+j*vlen;
                                 for (k = 0; k < step; ++k) {
-                                    coffs = get_vlc2(gb, codebook.vlc.table, codebook.nb_bits, 3) * dim;
+                                    coffs = get_vlc2(gb, codebook.vlc.table, codebook.nb_bits, 3);
+                                    if (coffs < 0)
+                                        return coffs;
+                                    coffs *= dim;
                                     for (l = 0; l < dim; ++l)
                                         vec[voffs + k + l * step] += codebook.codevectors[coffs + l];
                                 }
                             } else if (vr_type == 1) {
                                 voffs = voffset + j * vlen;
                                 for (k = 0; k < step; ++k) {
-                                    coffs = get_vlc2(gb, codebook.vlc.table, codebook.nb_bits, 3) * dim;
+                                    coffs = get_vlc2(gb, codebook.vlc.table, codebook.nb_bits, 3);
+                                    if (coffs < 0)
+                                        return coffs;
+                                    coffs *= dim;
                                     for (l = 0; l < dim; ++l, ++voffs) {
                                         vec[voffs]+=codebook.codevectors[coffs+l];
 
@@ -1460,13 +1477,19 @@
 
                                 if (dim == 2) {
                                     for (k = 0; k < step; ++k) {
-                                        coffs = get_vlc2(gb, codebook.vlc.table, codebook.nb_bits, 3) * 2;
+                                        coffs = get_vlc2(gb, codebook.vlc.table, codebook.nb_bits, 3);
+                                        if (coffs < 0)
+                                            return coffs;
+                                        coffs *= 2;
                                         vec[voffs + k       ] += codebook.codevectors[coffs    ];
                                         vec[voffs + k + vlen] += codebook.codevectors[coffs + 1];
                                     }
                                 } else if (dim == 4) {
                                     for (k = 0; k < step; ++k, voffs += 2) {
-                                        coffs = get_vlc2(gb, codebook.vlc.table, codebook.nb_bits, 3) * 4;
+                                        coffs = get_vlc2(gb, codebook.vlc.table, codebook.nb_bits, 3);
+                                        if (coffs < 0)
+                                            return coffs;
+                                        coffs *= 4;
                                         vec[voffs           ] += codebook.codevectors[coffs    ];
                                         vec[voffs + 1       ] += codebook.codevectors[coffs + 2];
                                         vec[voffs + vlen    ] += codebook.codevectors[coffs + 1];
@@ -1474,7 +1497,10 @@
                                     }
                                 } else
                                 for (k = 0; k < step; ++k) {
-                                    coffs = get_vlc2(gb, codebook.vlc.table, codebook.nb_bits, 3) * dim;
+                                    coffs = get_vlc2(gb, codebook.vlc.table, codebook.nb_bits, 3);
+                                    if (coffs < 0)
+                                        return coffs;
+                                    coffs *= dim;
                                     for (l = 0; l < dim; l += 2, voffs++) {
                                         vec[voffs       ] += codebook.codevectors[coffs + l    ];
                                         vec[voffs + vlen] += codebook.codevectors[coffs + l + 1];
@@ -1487,11 +1513,14 @@
                                 }
 
                             } else if (vr_type == 2) {
-                                unsigned voffs_div = FASTDIV(voffset << 1, ch <<1);
+                                unsigned voffs_div = ch == 1 ? voffset : FASTDIV(voffset, ch);
                                 unsigned voffs_mod = voffset - voffs_div * ch;
 
                                 for (k = 0; k < step; ++k) {
-                                    coffs = get_vlc2(gb, codebook.vlc.table, codebook.nb_bits, 3) * dim;
+                                    coffs = get_vlc2(gb, codebook.vlc.table, codebook.nb_bits, 3);
+                                    if (coffs < 0)
+                                        return coffs;
+                                    coffs *= dim;
                                     for (l = 0; l < dim; ++l) {
                                         vec[voffs_div + voffs_mod * vlen] +=
                                             codebook.codevectors[coffs + l];
diff --git a/libavcodec/vp3.c b/libavcodec/vp3.c
index 0e6da89..6fe1ca4 100644
--- a/libavcodec/vp3.c
+++ b/libavcodec/vp3.c
@@ -1,5 +1,6 @@
 /*
  * Copyright (C) 2003-2004 The FFmpeg project
+ * Copyright (C) 2019 Peter Ross
  *
  * This file is part of FFmpeg.
  *
@@ -20,7 +21,7 @@
 
 /**
  * @file
- * On2 VP3 Video Decoder
+ * On2 VP3/VP4 Video Decoder
  *
  * VP3 Video Decoder by Mike Melanson (mike at multimedia.cx)
  * For more information about the VP3 coding process, visit:
@@ -43,6 +44,7 @@
 #include "thread.h"
 #include "videodsp.h"
 #include "vp3data.h"
+#include "vp4data.h"
 #include "vp3dsp.h"
 #include "xiph.h"
 
@@ -127,6 +129,30 @@
     { 3, 1 }, { 2, 1 }, { 2, 0 }, { 3, 0 }
 };
 
+enum {
+    VP4_DC_INTRA  = 0,
+    VP4_DC_INTER  = 1,
+    VP4_DC_GOLDEN = 2,
+    NB_VP4_DC_TYPES,
+    VP4_DC_UNDEFINED = NB_VP4_DC_TYPES
+};
+
+static const uint8_t vp4_pred_block_type_map[8] = {
+    [MODE_INTER_NO_MV]      = VP4_DC_INTER,
+    [MODE_INTRA]            = VP4_DC_INTRA,
+    [MODE_INTER_PLUS_MV]    = VP4_DC_INTER,
+    [MODE_INTER_LAST_MV]    = VP4_DC_INTER,
+    [MODE_INTER_PRIOR_LAST] = VP4_DC_INTER,
+    [MODE_USING_GOLDEN]     = VP4_DC_GOLDEN,
+    [MODE_GOLDEN_MV]        = VP4_DC_GOLDEN,
+    [MODE_INTER_FOURMV]     = VP4_DC_INTER,
+};
+
+typedef struct {
+    int dc;
+    int type;
+} VP4Predictor;
+
 #define MIN_DEQUANT_VAL 2
 
 typedef struct Vp3DecodeContext {
@@ -164,9 +190,13 @@
     int v_superblock_start;
     unsigned char *superblock_coding;
 
-    int macroblock_count;
+    int macroblock_count; /* y macroblock count */
     int macroblock_width;
     int macroblock_height;
+    int c_macroblock_count;
+    int c_macroblock_width;
+    int c_macroblock_height;
+    int yuv_macroblock_count; /* y+u+v macroblock count */
 
     int fragment_count;
     int fragment_width[2];
@@ -182,7 +212,7 @@
     int8_t (*motion_val[2])[2];
 
     /* tables */
-    uint16_t coded_dc_scale_factor[64];
+    uint16_t coded_dc_scale_factor[2][64];
     uint32_t coded_ac_scale_factor[64];
     uint8_t base_matrix[384][64];
     uint8_t qr_count[2][3];
@@ -223,16 +253,22 @@
      * which of the fragments are coded */
     int *coded_fragment_list[3];
 
+    int *kf_coded_fragment_list;
+    int *nkf_coded_fragment_list;
+    int num_kf_coded_fragment[3];
+
     VLC dc_vlc[16];
     VLC ac_vlc_1[16];
     VLC ac_vlc_2[16];
     VLC ac_vlc_3[16];
     VLC ac_vlc_4[16];
 
-    VLC superblock_run_length_vlc;
-    VLC fragment_run_length_vlc;
+    VLC superblock_run_length_vlc; /* version < 2 */
+    VLC fragment_run_length_vlc; /* version < 2 */
+    VLC block_pattern_vlc[2]; /* version >= 2*/
     VLC mode_code_vlc;
-    VLC motion_vector_vlc;
+    VLC motion_vector_vlc; /* version < 2 */
+    VLC vp4_mv_vlc[2][7]; /* version >=2 */
 
     /* these arrays need to be on 16-byte boundaries since SSE2 operations
      * index into them */
@@ -259,6 +295,8 @@
 
     uint8_t filter_limit_values[64];
     DECLARE_ALIGNED(8, int, bounding_values_array)[256 + 2];
+
+    VP4Predictor * dc_pred_row; /* dc_pred_row[y_superblock_width * 4] */
 } Vp3DecodeContext;
 
 /************************************************************************
@@ -271,10 +309,12 @@
 
     av_freep(&s->superblock_coding);
     av_freep(&s->all_fragments);
-    av_freep(&s->coded_fragment_list[0]);
+    av_freep(&s->nkf_coded_fragment_list);
+    av_freep(&s->kf_coded_fragment_list);
     av_freep(&s->dct_tokens_base);
     av_freep(&s->superblock_fragments);
     av_freep(&s->macroblock_coding);
+    av_freep(&s->dc_pred_row);
     av_freep(&s->motion_val[0]);
     av_freep(&s->motion_val[1]);
 }
@@ -294,7 +334,7 @@
 static av_cold int vp3_decode_end(AVCodecContext *avctx)
 {
     Vp3DecodeContext *s = avctx->priv_data;
-    int i;
+    int i, j;
 
     free_tables(avctx);
     av_freep(&s->edge_emu_buffer);
@@ -307,9 +347,6 @@
     av_frame_free(&s->last_frame.f);
     av_frame_free(&s->golden_frame.f);
 
-    if (avctx->internal->is_copy)
-        return 0;
-
     for (i = 0; i < 16; i++) {
         ff_free_vlc(&s->dc_vlc[i]);
         ff_free_vlc(&s->ac_vlc_1[i]);
@@ -323,6 +360,12 @@
     ff_free_vlc(&s->mode_code_vlc);
     ff_free_vlc(&s->motion_vector_vlc);
 
+    for (j = 0; j < 2; j++)
+        for (i = 0; i < 7; i++)
+            ff_free_vlc(&s->vp4_mv_vlc[j][i]);
+
+    for (i = 0; i < 2; i++)
+        ff_free_vlc(&s->block_pattern_vlc[i]);
     return 0;
 }
 
@@ -370,11 +413,11 @@
 static void init_dequantizer(Vp3DecodeContext *s, int qpi)
 {
     int ac_scale_factor = s->coded_ac_scale_factor[s->qps[qpi]];
-    int dc_scale_factor = s->coded_dc_scale_factor[s->qps[qpi]];
     int i, plane, inter, qri, bmi, bmj, qistart;
 
     for (inter = 0; inter < 2; inter++) {
         for (plane = 0; plane < 3; plane++) {
+            int dc_scale_factor = s->coded_dc_scale_factor[!!plane][s->qps[qpi]];
             int sum = 0;
             for (qri = 0; qri < s->qr_count[inter][plane]; qri++) {
                 sum += s->qr_size[inter][plane][qri];
@@ -392,9 +435,10 @@
 
                 int qmin   = 8 << (inter + !i);
                 int qscale = i ? ac_scale_factor : dc_scale_factor;
-
+                int qbias = (1 + inter) * 3;
                 s->qmat[qpi][inter][plane][s->idct_permutation[i]] =
-                    av_clip((qscale * coeff) / 100 * 4, qmin, 4096);
+                    (i == 0 || s->version < 2) ? av_clip((qscale * coeff) / 100 * 4, qmin, 4096)
+                                               : (qscale * (coeff - qbias) / 100 + qbias) * 4;
             }
             /* all DC coefficients use the same quant so as not to interfere
              * with DC prediction */
@@ -411,27 +455,7 @@
  */
 static void init_loop_filter(Vp3DecodeContext *s)
 {
-    int *bounding_values = s->bounding_values_array + 127;
-    int filter_limit;
-    int x;
-    int value;
-
-    filter_limit = s->filter_limit_values[s->qps[0]];
-    av_assert0(filter_limit < 128U);
-
-    /* set up the bounding values */
-    memset(s->bounding_values_array, 0, 256 * sizeof(int));
-    for (x = 0; x < filter_limit; x++) {
-        bounding_values[-x] = -x;
-        bounding_values[x] = x;
-    }
-    for (x = value = filter_limit; x < 128 && value; x++, value--) {
-        bounding_values[ x] =  value;
-        bounding_values[-x] = -value;
-    }
-    if (value)
-        bounding_values[128] = value;
-    bounding_values[129] = bounding_values[130] = filter_limit * 0x02020202;
+    ff_vp3dsp_set_bounding_values(s->bounding_values_array, s->filter_limit_values[s->qps[0]]);
 }
 
 /*
@@ -538,44 +562,65 @@
     s->total_num_coded_frags = 0;
     memset(s->macroblock_coding, MODE_COPY, s->macroblock_count);
 
+    s->coded_fragment_list[0] = s->keyframe ? s->kf_coded_fragment_list
+                                            : s->nkf_coded_fragment_list;
+
     for (plane = 0; plane < 3; plane++) {
         int sb_start = superblock_starts[plane];
         int sb_end   = sb_start + (plane ? s->c_superblock_count
                                          : s->y_superblock_count);
         int num_coded_frags = 0;
 
-        for (i = sb_start; i < sb_end && get_bits_left(gb) > 0; i++) {
-            if (s->keyframe == 0 && get_bits_left(gb) < plane0_num_coded_frags >> 2) {
-                return AVERROR_INVALIDDATA;
-            }
-            /* iterate through all 16 fragments in a superblock */
-            for (j = 0; j < 16; j++) {
-                /* if the fragment is in bounds, check its coding status */
-                current_fragment = s->superblock_fragments[i * 16 + j];
-                if (current_fragment != -1) {
-                    int coded = s->superblock_coding[i];
-
-                    if (s->superblock_coding[i] == SB_PARTIALLY_CODED) {
-                        /* fragment may or may not be coded; this is the case
-                         * that cares about the fragment coding runs */
-                        if (current_run-- == 0) {
-                            bit        ^= 1;
-                            current_run = get_vlc2(gb, s->fragment_run_length_vlc.table, 5, 2);
+        if (s->keyframe) {
+            if (s->num_kf_coded_fragment[plane] == -1) {
+                for (i = sb_start; i < sb_end; i++) {
+                    /* iterate through all 16 fragments in a superblock */
+                    for (j = 0; j < 16; j++) {
+                        /* if the fragment is in bounds, check its coding status */
+                        current_fragment = s->superblock_fragments[i * 16 + j];
+                        if (current_fragment != -1) {
+                            s->coded_fragment_list[plane][num_coded_frags++] =
+                                current_fragment;
                         }
-                        coded = bit;
                     }
+                }
+                s->num_kf_coded_fragment[plane] = num_coded_frags;
+            } else
+                num_coded_frags = s->num_kf_coded_fragment[plane];
+        } else {
+            for (i = sb_start; i < sb_end && get_bits_left(gb) > 0; i++) {
+                if (get_bits_left(gb) < plane0_num_coded_frags >> 2) {
+                    return AVERROR_INVALIDDATA;
+                }
+                /* iterate through all 16 fragments in a superblock */
+                for (j = 0; j < 16; j++) {
+                    /* if the fragment is in bounds, check its coding status */
+                    current_fragment = s->superblock_fragments[i * 16 + j];
+                    if (current_fragment != -1) {
+                        int coded = s->superblock_coding[i];
 
-                    if (coded) {
-                        /* default mode; actual mode will be decoded in
-                         * the next phase */
-                        s->all_fragments[current_fragment].coding_method =
-                            MODE_INTER_NO_MV;
-                        s->coded_fragment_list[plane][num_coded_frags++] =
-                            current_fragment;
-                    } else {
-                        /* not coded; copy this fragment from the prior frame */
-                        s->all_fragments[current_fragment].coding_method =
-                            MODE_COPY;
+                        if (coded == SB_PARTIALLY_CODED) {
+                            /* fragment may or may not be coded; this is the case
+                             * that cares about the fragment coding runs */
+                            if (current_run-- == 0) {
+                                bit        ^= 1;
+                                current_run = get_vlc2(gb, s->fragment_run_length_vlc.table, 5, 2);
+                            }
+                            coded = bit;
+                        }
+
+                        if (coded) {
+                            /* default mode; actual mode will be decoded in
+                             * the next phase */
+                            s->all_fragments[current_fragment].coding_method =
+                                MODE_INTER_NO_MV;
+                            s->coded_fragment_list[plane][num_coded_frags++] =
+                                current_fragment;
+                        } else {
+                            /* not coded; copy this fragment from the prior frame */
+                            s->all_fragments[current_fragment].coding_method =
+                                MODE_COPY;
+                        }
                     }
                 }
             }
@@ -592,6 +637,152 @@
     return 0;
 }
 
+#define BLOCK_X (2 * mb_x + (k & 1))
+#define BLOCK_Y (2 * mb_y + (k >> 1))
+
+#if CONFIG_VP4_DECODER
+/**
+ * @return number of blocks, or > yuv_macroblock_count on error.
+ *         return value is always >= 1.
+ */
+static int vp4_get_mb_count(Vp3DecodeContext *s, GetBitContext *gb)
+{
+    int v = 1;
+    int bits;
+    while ((bits = show_bits(gb, 9)) == 0x1ff) {
+        skip_bits(gb, 9);
+        v += 256;
+        if (v > s->yuv_macroblock_count) {
+            av_log(s->avctx, AV_LOG_ERROR, "Invalid run length\n");
+            return v;
+        }
+    }
+#define body(n) { \
+    skip_bits(gb, 2 + n); \
+    v += (1 << n) + get_bits(gb, n); }
+#define thresh(n) (0x200 - (0x80 >> n))
+#define else_if(n) else if (bits < thresh(n)) body(n)
+    if (bits < 0x100) {
+        skip_bits(gb, 1);
+    } else if (bits < thresh(0)) {
+        skip_bits(gb, 2);
+        v += 1;
+    }
+    else_if(1)
+    else_if(2)
+    else_if(3)
+    else_if(4)
+    else_if(5)
+    else_if(6)
+    else body(7)
+#undef body
+#undef thresh
+#undef else_if
+    return v;
+}
+
+static int vp4_get_block_pattern(Vp3DecodeContext *s, GetBitContext *gb, int *next_block_pattern_table)
+{
+    int v = get_vlc2(gb, s->block_pattern_vlc[*next_block_pattern_table].table, 3, 2);
+    if (v == -1) {
+        av_log(s->avctx, AV_LOG_ERROR, "Invalid block pattern\n");
+        *next_block_pattern_table = 0;
+        return 0;
+    }
+    *next_block_pattern_table = vp4_block_pattern_table_selector[v];
+    return v + 1;
+}
+
+static int vp4_unpack_macroblocks(Vp3DecodeContext *s, GetBitContext *gb)
+{
+    int plane, i, j, k, fragment;
+    int next_block_pattern_table;
+    int bit, current_run, has_partial;
+
+    memset(s->macroblock_coding, MODE_COPY, s->macroblock_count);
+
+    if (s->keyframe)
+        return 0;
+
+    has_partial = 0;
+    bit         = get_bits1(gb);
+    for (i = 0; i < s->yuv_macroblock_count; i += current_run) {
+        if (get_bits_left(gb) <= 0)
+            return AVERROR_INVALIDDATA;
+        current_run = vp4_get_mb_count(s, gb);
+        if (current_run > s->yuv_macroblock_count - i)
+            return -1;
+        memset(s->superblock_coding + i, 2 * bit, current_run);
+        bit ^= 1;
+        has_partial |= bit;
+    }
+
+    if (has_partial) {
+        if (get_bits_left(gb) <= 0)
+            return AVERROR_INVALIDDATA;
+        bit  = get_bits1(gb);
+        current_run = vp4_get_mb_count(s, gb);
+        for (i = 0; i < s->yuv_macroblock_count; i++) {
+            if (!s->superblock_coding[i]) {
+                if (!current_run) {
+                    bit ^= 1;
+                    current_run = vp4_get_mb_count(s, gb);
+                }
+                s->superblock_coding[i] = bit;
+                current_run--;
+            }
+        }
+        if (current_run) /* handle situation when vp4_get_mb_count() fails */
+            return -1;
+    }
+
+    next_block_pattern_table = 0;
+    i = 0;
+    for (plane = 0; plane < 3; plane++) {
+        int sb_x, sb_y;
+        int sb_width = plane ? s->c_superblock_width : s->y_superblock_width;
+        int sb_height = plane ? s->c_superblock_height : s->y_superblock_height;
+        int mb_width = plane ? s->c_macroblock_width : s->macroblock_width;
+        int mb_height = plane ? s->c_macroblock_height : s->macroblock_height;
+        int fragment_width = s->fragment_width[!!plane];
+        int fragment_height = s->fragment_height[!!plane];
+
+        for (sb_y = 0; sb_y < sb_height; sb_y++) {
+            for (sb_x = 0; sb_x < sb_width; sb_x++) {
+                for (j = 0; j < 4; j++) {
+                    int mb_x = 2 * sb_x + (j >> 1);
+                    int mb_y = 2 * sb_y + (j >> 1) ^ (j & 1);
+                    int mb_coded, pattern, coded;
+
+                    if (mb_x >= mb_width || mb_y >= mb_height)
+                        continue;
+
+                    mb_coded = s->superblock_coding[i++];
+
+                    if (mb_coded == SB_FULLY_CODED)
+                        pattern = 0xF;
+                    else if (mb_coded == SB_PARTIALLY_CODED)
+                        pattern = vp4_get_block_pattern(s, gb, &next_block_pattern_table);
+                    else
+                        pattern = 0;
+
+                    for (k = 0; k < 4; k++) {
+                        if (BLOCK_X >= fragment_width || BLOCK_Y >= fragment_height)
+                            continue;
+                        fragment = s->fragment_start[plane] + BLOCK_Y * fragment_width + BLOCK_X;
+                        coded = pattern & (8 >> k);
+                        /* MODE_INTER_NO_MV is the default for coded fragments.
+                           the actual method is decoded in the next phase. */
+                        s->all_fragments[fragment].coding_method = coded ? MODE_INTER_NO_MV : MODE_COPY;
+                    }
+                }
+            }
+        }
+    }
+    return 0;
+}
+#endif
+
 /*
  * This function unpacks all the coding mode data for individual macroblocks
  * from the bitstream.
@@ -640,8 +831,6 @@
                         mb_y >= s->macroblock_height)
                         continue;
 
-#define BLOCK_X (2 * mb_x + (k & 1))
-#define BLOCK_Y (2 * mb_y + (k >> 1))
                     /* coding modes are only stored if the macroblock has
                      * at least one luma block coded, otherwise it must be
                      * INTER_NO_MV */
@@ -701,6 +890,12 @@
     return 0;
 }
 
+static int vp4_get_mv(Vp3DecodeContext *s, GetBitContext *gb, int axis, int last_motion)
+{
+    int v = get_vlc2(gb, s->vp4_mv_vlc[axis][vp4_mv_table_selector[FFABS(last_motion)]].table, 6, 2) - 31;
+    return last_motion < 0 ? -v : v;
+}
+
 /*
  * This function unpacks all the motion vectors for the individual
  * macroblocks from the bitstream.
@@ -715,6 +910,8 @@
     int last_motion_y = 0;
     int prior_last_motion_x = 0;
     int prior_last_motion_y = 0;
+    int last_gold_motion_x = 0;
+    int last_gold_motion_y = 0;
     int current_macroblock;
     int current_fragment;
     int frag;
@@ -722,8 +919,8 @@
     if (s->keyframe)
         return 0;
 
-    /* coding mode 0 is the VLC scheme; 1 is the fixed code scheme */
-    coding_mode = get_bits1(gb);
+    /* coding mode 0 is the VLC scheme; 1 is the fixed code scheme; 2 is VP4 code scheme */
+    coding_mode = s->version < 2 ? get_bits1(gb) : 2;
 
     /* iterate through all of the macroblocks that contain 1 or more
      * coded fragments */
@@ -743,15 +940,23 @@
                     continue;
 
                 switch (s->macroblock_coding[current_macroblock]) {
-                case MODE_INTER_PLUS_MV:
                 case MODE_GOLDEN_MV:
+                    if (coding_mode == 2) { /* VP4 */
+                        last_gold_motion_x = motion_x[0] = vp4_get_mv(s, gb, 0, last_gold_motion_x);
+                        last_gold_motion_y = motion_y[0] = vp4_get_mv(s, gb, 1, last_gold_motion_y);
+                        break;
+                    } /* otherwise fall through */
+                case MODE_INTER_PLUS_MV:
                     /* all 6 fragments use the same motion vector */
                     if (coding_mode == 0) {
                         motion_x[0] = motion_vector_table[get_vlc2(gb, s->motion_vector_vlc.table, 6, 2)];
                         motion_y[0] = motion_vector_table[get_vlc2(gb, s->motion_vector_vlc.table, 6, 2)];
-                    } else {
+                    } else if (coding_mode == 1) {
                         motion_x[0] = fixed_motion_vector_table[get_bits(gb, 6)];
                         motion_y[0] = fixed_motion_vector_table[get_bits(gb, 6)];
+                    } else { /* VP4 */
+                        motion_x[0] = vp4_get_mv(s, gb, 0, last_motion_x);
+                        motion_y[0] = vp4_get_mv(s, gb, 1, last_motion_y);
                     }
 
                     /* vector maintenance, only on MODE_INTER_PLUS_MV */
@@ -776,9 +981,12 @@
                             if (coding_mode == 0) {
                                 motion_x[k] = motion_vector_table[get_vlc2(gb, s->motion_vector_vlc.table, 6, 2)];
                                 motion_y[k] = motion_vector_table[get_vlc2(gb, s->motion_vector_vlc.table, 6, 2)];
-                            } else {
+                            } else if (coding_mode == 1) {
                                 motion_x[k] = fixed_motion_vector_table[get_bits(gb, 6)];
                                 motion_y[k] = fixed_motion_vector_table[get_bits(gb, 6)];
+                            } else { /* VP4 */
+                                motion_x[k] = vp4_get_mv(s, gb, 0, prior_last_motion_x);
+                                motion_y[k] = vp4_get_mv(s, gb, 1, prior_last_motion_y);
                             }
                             last_motion_x = motion_x[k];
                             last_motion_y = motion_y[k];
@@ -840,8 +1048,10 @@
                         motion_y[0] = RSHIFT(motion_y[0] + motion_y[1] +
                                              motion_y[2] + motion_y[3], 2);
                     }
-                    motion_x[0] = (motion_x[0] >> 1) | (motion_x[0] & 1);
-                    motion_y[0] = (motion_y[0] >> 1) | (motion_y[0] & 1);
+                    if (s->version <= 2) {
+                        motion_x[0] = (motion_x[0] >> 1) | (motion_x[0] & 1);
+                        motion_y[0] = (motion_y[0] >> 1) | (motion_y[0] & 1);
+                    }
                     frag = mb_y * s->fragment_width[1] + mb_x;
                     s->motion_val[1][frag][0] = motion_x[0];
                     s->motion_val[1][frag][1] = motion_y[0];
@@ -855,9 +1065,10 @@
                         motion_x[1] = motion_x[0];
                         motion_y[1] = motion_y[0];
                     }
-                    motion_x[0] = (motion_x[0] >> 1) | (motion_x[0] & 1);
-                    motion_x[1] = (motion_x[1] >> 1) | (motion_x[1] & 1);
-
+                    if (s->version <= 2) {
+                        motion_x[0] = (motion_x[0] >> 1) | (motion_x[0] & 1);
+                        motion_x[1] = (motion_x[1] >> 1) | (motion_x[1] & 1);
+                    }
                     frag = 2 * mb_y * s->fragment_width[1] + mb_x;
                     for (k = 0; k < 2; k++) {
                         s->motion_val[1][frag][0] = motion_x[k];
@@ -925,6 +1136,30 @@
     return 0;
 }
 
+static inline int get_eob_run(GetBitContext *gb, int token)
+{
+    int v = eob_run_table[token].base;
+    if (eob_run_table[token].bits)
+        v += get_bits(gb, eob_run_table[token].bits);
+    return v;
+}
+
+static inline int get_coeff(GetBitContext *gb, int token, int16_t *coeff)
+{
+    int bits_to_get, zero_run;
+
+    bits_to_get = coeff_get_bits[token];
+    if (bits_to_get)
+        bits_to_get = get_bits(gb, bits_to_get);
+    *coeff = coeff_tables[token][bits_to_get];
+
+    zero_run = zero_run_base[token];
+    if (zero_run_get_bits[token])
+        zero_run += get_bits(gb, zero_run_get_bits[token]);
+
+    return zero_run;
+}
+
 /*
  * This function is called by unpack_dct_coeffs() to extract the VLCs from
  * the bitstream. The VLCs encode tokens which are used to unpack DCT
@@ -946,7 +1181,6 @@
     int token;
     int zero_run  = 0;
     int16_t coeff = 0;
-    int bits_to_get;
     int blocks_ended;
     int coeff_i = 0;
     int num_coeffs      = s->num_coded_frags[plane][coeff_index];
@@ -982,10 +1216,7 @@
         token = get_vlc2(gb, vlc_table, 11, 3);
         /* use the token to get a zero run, a coefficient, and an eob run */
         if ((unsigned) token <= 6U) {
-            eob_run = eob_run_base[token];
-            if (eob_run_get_bits[token])
-                eob_run += get_bits(gb, eob_run_get_bits[token]);
-
+            eob_run = get_eob_run(gb, token);
             if (!eob_run)
                 eob_run = INT_MAX;
 
@@ -1003,14 +1234,7 @@
                 eob_run         = 0;
             }
         } else if (token >= 0) {
-            bits_to_get = coeff_get_bits[token];
-            if (bits_to_get)
-                bits_to_get = get_bits(gb, bits_to_get);
-            coeff = coeff_tables[token][bits_to_get];
-
-            zero_run = zero_run_base[token];
-            if (zero_run_get_bits[token])
-                zero_run += get_bits(gb, zero_run_get_bits[token]);
+            zero_run = get_coeff(gb, token, &coeff);
 
             if (zero_run) {
                 dct_tokens[j++] = TOKEN_ZERO_RUN(coeff, zero_run);
@@ -1162,6 +1386,237 @@
     return 0;
 }
 
+#if CONFIG_VP4_DECODER
+/**
+ * eob_tracker[] is instead of TOKEN_EOB(value)
+ * a dummy TOKEN_EOB(0) value is used to make vp3_dequant work
+ *
+ * @return < 0 on error
+ */
+static int vp4_unpack_vlcs(Vp3DecodeContext *s, GetBitContext *gb,
+                       VLC *vlc_tables[64],
+                       int plane, int eob_tracker[64], int fragment)
+{
+    int token;
+    int zero_run  = 0;
+    int16_t coeff = 0;
+    int coeff_i = 0;
+    int eob_run;
+
+    while (!eob_tracker[coeff_i]) {
+        if (get_bits_left(gb) < 1)
+            return AVERROR_INVALIDDATA;
+
+        token = get_vlc2(gb, vlc_tables[coeff_i]->table, 11, 3);
+
+        /* use the token to get a zero run, a coefficient, and an eob run */
+        if ((unsigned) token <= 6U) {
+            eob_run = get_eob_run(gb, token);
+            *s->dct_tokens[plane][coeff_i]++ = TOKEN_EOB(0);
+            eob_tracker[coeff_i] = eob_run - 1;
+            return 0;
+        } else if (token >= 0) {
+            zero_run = get_coeff(gb, token, &coeff);
+
+            if (zero_run) {
+                if (coeff_i + zero_run > 64) {
+                    av_log(s->avctx, AV_LOG_DEBUG,
+                        "Invalid zero run of %d with %d coeffs left\n",
+                        zero_run, 64 - coeff_i);
+                    zero_run = 64 - coeff_i;
+                }
+                *s->dct_tokens[plane][coeff_i]++ = TOKEN_ZERO_RUN(coeff, zero_run);
+                coeff_i += zero_run;
+            } else {
+                if (!coeff_i)
+                    s->all_fragments[fragment].dc = coeff;
+
+                *s->dct_tokens[plane][coeff_i]++ = TOKEN_COEFF(coeff);
+            }
+            coeff_i++;
+            if (coeff_i >= 64) /* > 64 occurs when there is a zero_run overflow */
+                return 0; /* stop */
+        } else {
+            av_log(s->avctx, AV_LOG_ERROR, "Invalid token %d\n", token);
+            return -1;
+        }
+    }
+    *s->dct_tokens[plane][coeff_i]++ = TOKEN_EOB(0);
+    eob_tracker[coeff_i]--;
+    return 0;
+}
+
+static void vp4_dc_predictor_reset(VP4Predictor *p)
+{
+    p->dc = 0;
+    p->type = VP4_DC_UNDEFINED;
+}
+
+static void vp4_dc_pred_before(const Vp3DecodeContext *s, VP4Predictor dc_pred[6][6], int sb_x)
+{
+    int i, j;
+
+    for (i = 0; i < 4; i++)
+        dc_pred[0][i + 1] = s->dc_pred_row[sb_x * 4 + i];
+
+    for (j = 1; j < 5; j++)
+        for (i = 0; i < 4; i++)
+            vp4_dc_predictor_reset(&dc_pred[j][i + 1]);
+}
+
+static void vp4_dc_pred_after(Vp3DecodeContext *s, VP4Predictor dc_pred[6][6], int sb_x)
+{
+    int i;
+
+    for (i = 0; i < 4; i++)
+        s->dc_pred_row[sb_x * 4 + i] = dc_pred[4][i + 1];
+
+    for (i = 1; i < 5; i++)
+        dc_pred[i][0] = dc_pred[i][4];
+}
+
+/* note: dc_pred points to the current block */
+static int vp4_dc_pred(const Vp3DecodeContext *s, const VP4Predictor * dc_pred, const int * last_dc, int type, int plane)
+{
+    int count = 0;
+    int dc = 0;
+
+    if (dc_pred[-6].type == type) {
+        dc += dc_pred[-6].dc;
+        count++;
+    }
+
+    if (dc_pred[6].type == type) {
+        dc += dc_pred[6].dc;
+        count++;
+    }
+
+    if (count != 2 && dc_pred[-1].type == type) {
+        dc += dc_pred[-1].dc;
+        count++;
+    }
+
+    if (count != 2 && dc_pred[1].type == type) {
+        dc += dc_pred[1].dc;
+        count++;
+    }
+
+    /* using division instead of shift to correctly handle negative values */
+    return count == 2 ? dc / 2 : last_dc[type];
+}
+
+static void vp4_set_tokens_base(Vp3DecodeContext *s)
+{
+    int plane, i;
+    int16_t *base = s->dct_tokens_base;
+    for (plane = 0; plane < 3; plane++) {
+        for (i = 0; i < 64; i++) {
+            s->dct_tokens[plane][i] = base;
+            base += s->fragment_width[!!plane] * s->fragment_height[!!plane];
+        }
+    }
+}
+
+static int vp4_unpack_dct_coeffs(Vp3DecodeContext *s, GetBitContext *gb)
+{
+    int i, j;
+    int dc_y_table;
+    int dc_c_table;
+    int ac_y_table;
+    int ac_c_table;
+    VLC *tables[2][64];
+    int plane, sb_y, sb_x;
+    int eob_tracker[64];
+    VP4Predictor dc_pred[6][6];
+    int last_dc[NB_VP4_DC_TYPES];
+
+    if (get_bits_left(gb) < 16)
+        return AVERROR_INVALIDDATA;
+
+    /* fetch the DC table indexes */
+    dc_y_table = get_bits(gb, 4);
+    dc_c_table = get_bits(gb, 4);
+
+    ac_y_table = get_bits(gb, 4);
+    ac_c_table = get_bits(gb, 4);
+
+    /* build tables of DC/AC VLC tables */
+
+    tables[0][0] = &s->dc_vlc[dc_y_table];
+    tables[1][0] = &s->dc_vlc[dc_c_table];
+    for (i = 1; i <= 5; i++) {
+        tables[0][i] = &s->ac_vlc_1[ac_y_table];
+        tables[1][i] = &s->ac_vlc_1[ac_c_table];
+    }
+    for (i = 6; i <= 14; i++) {
+        tables[0][i] = &s->ac_vlc_2[ac_y_table];
+        tables[1][i] = &s->ac_vlc_2[ac_c_table];
+    }
+    for (i = 15; i <= 27; i++) {
+        tables[0][i] = &s->ac_vlc_3[ac_y_table];
+        tables[1][i] = &s->ac_vlc_3[ac_c_table];
+    }
+    for (i = 28; i <= 63; i++) {
+        tables[0][i] = &s->ac_vlc_4[ac_y_table];
+        tables[1][i] = &s->ac_vlc_4[ac_c_table];
+    }
+
+    vp4_set_tokens_base(s);
+
+    memset(last_dc, 0, sizeof(last_dc));
+
+    for (plane = 0; plane < ((s->avctx->flags & AV_CODEC_FLAG_GRAY) ? 1 : 3); plane++) {
+        memset(eob_tracker, 0, sizeof(eob_tracker));
+
+        /* initialise dc prediction */
+        for (i = 0; i < s->fragment_width[!!plane]; i++)
+            vp4_dc_predictor_reset(&s->dc_pred_row[i]);
+
+        for (j = 0; j < 6; j++)
+            for (i = 0; i < 6; i++)
+                vp4_dc_predictor_reset(&dc_pred[j][i]);
+
+        for (sb_y = 0; sb_y * 4 < s->fragment_height[!!plane]; sb_y++) {
+            for (sb_x = 0; sb_x *4 < s->fragment_width[!!plane]; sb_x++) {
+                vp4_dc_pred_before(s, dc_pred, sb_x);
+                for (j = 0; j < 16; j++) {
+                        int hx = hilbert_offset[j][0];
+                        int hy = hilbert_offset[j][1];
+                        int x  = 4 * sb_x + hx;
+                        int y  = 4 * sb_y + hy;
+                        VP4Predictor *this_dc_pred = &dc_pred[hy + 1][hx + 1];
+                        int fragment, dc_block_type;
+
+                        if (x >= s->fragment_width[!!plane] || y >= s->fragment_height[!!plane])
+                            continue;
+
+                        fragment = s->fragment_start[plane] + y * s->fragment_width[!!plane] + x;
+
+                        if (s->all_fragments[fragment].coding_method == MODE_COPY)
+                            continue;
+
+                        if (vp4_unpack_vlcs(s, gb, tables[!!plane], plane, eob_tracker, fragment) < 0)
+                            return -1;
+
+                        dc_block_type = vp4_pred_block_type_map[s->all_fragments[fragment].coding_method];
+
+                        s->all_fragments[fragment].dc +=
+                            vp4_dc_pred(s, this_dc_pred, last_dc, dc_block_type, plane);
+
+                        this_dc_pred->type = dc_block_type,
+                        this_dc_pred->dc   = last_dc[dc_block_type] = s->all_fragments[fragment].dc;
+                }
+                vp4_dc_pred_after(s, dc_pred, sb_x);
+            }
+        }
+    }
+
+    vp4_set_tokens_base(s);
+
+    return 0;
+}
+#endif
+
 /*
  * This function reverses the DC prediction for each coded fragment in
  * the frame. Much of this function is adapted directly from the original
@@ -1494,6 +1949,105 @@
     ff_thread_await_progress(ref_frame, ref_row, 0);
 }
 
+#if CONFIG_VP4_DECODER
+/**
+ * @return non-zero if temp (edge_emu_buffer) was populated
+ */
+static int vp4_mc_loop_filter(Vp3DecodeContext *s, int plane, int motion_x, int motion_y, int bx, int by,
+       uint8_t * motion_source, int stride, int src_x, int src_y, uint8_t *temp)
+{
+    int motion_shift = plane ? 4 : 2;
+    int subpel_mask = plane ? 3 : 1;
+    int *bounding_values = s->bounding_values_array + 127;
+
+    int i;
+    int x, y;
+    int x2, y2;
+    int x_subpel, y_subpel;
+    int x_offset, y_offset;
+
+    int block_width = plane ? 8 : 16;
+    int plane_width  = s->width  >> (plane && s->chroma_x_shift);
+    int plane_height = s->height >> (plane && s->chroma_y_shift);
+
+#define loop_stride 12
+    uint8_t loop[12 * loop_stride];
+
+    /* using division instead of shift to correctly handle negative values */
+    x = 8 * bx + motion_x / motion_shift;
+    y = 8 * by + motion_y / motion_shift;
+
+    x_subpel = motion_x & subpel_mask;
+    y_subpel = motion_y & subpel_mask;
+
+    if (x_subpel || y_subpel) {
+        x--;
+        y--;
+
+        if (x_subpel)
+            x = FFMIN(x, x + FFSIGN(motion_x));
+
+        if (y_subpel)
+            y = FFMIN(y, y + FFSIGN(motion_y));
+
+        x2 = x + block_width;
+        y2 = y + block_width;
+
+        if (x2 < 0 || x2 >= plane_width || y2 < 0 || y2 >= plane_height)
+            return 0;
+
+        x_offset = (-(x + 2) & 7) + 2;
+        y_offset = (-(y + 2) & 7) + 2;
+
+        if (x_offset > 8 + x_subpel && y_offset > 8 + y_subpel)
+            return 0;
+
+        s->vdsp.emulated_edge_mc(loop, motion_source - stride - 1,
+             loop_stride, stride,
+             12, 12, src_x - 1, src_y - 1,
+             plane_width,
+             plane_height);
+
+        if (x_offset <= 8 + x_subpel)
+            ff_vp3dsp_h_loop_filter_12(loop + x_offset, loop_stride, bounding_values);
+
+        if (y_offset <= 8 + y_subpel)
+            ff_vp3dsp_v_loop_filter_12(loop + y_offset*loop_stride, loop_stride, bounding_values);
+
+    } else {
+
+        x_offset = -x & 7;
+        y_offset = -y & 7;
+
+        if (!x_offset && !y_offset)
+            return 0;
+
+        s->vdsp.emulated_edge_mc(loop, motion_source - stride - 1,
+             loop_stride, stride,
+             12, 12, src_x - 1, src_y - 1,
+             plane_width,
+             plane_height);
+
+#define safe_loop_filter(name, ptr, stride, bounding_values) \
+    if ((uintptr_t)(ptr) & 7) \
+        s->vp3dsp.name##_unaligned(ptr, stride, bounding_values); \
+    else \
+        s->vp3dsp.name(ptr, stride, bounding_values);
+
+        if (x_offset)
+            safe_loop_filter(h_loop_filter, loop + loop_stride + x_offset + 1, loop_stride, bounding_values);
+
+        if (y_offset)
+            safe_loop_filter(v_loop_filter, loop + (y_offset + 1)*loop_stride + 1, loop_stride, bounding_values);
+    }
+
+    for (i = 0; i < 9; i++)
+        memcpy(temp + i*stride, loop + (i + 1) * loop_stride + 1, 9);
+
+    return 1;
+}
+#endif
+
 /*
  * Perform the final rendering for a particular slice of data.
  * The slice number ranges from 0..(c_superblock_height - 1).
@@ -1579,8 +2133,15 @@
                         if ((s->all_fragments[i].coding_method > MODE_INTRA) &&
                             (s->all_fragments[i].coding_method != MODE_USING_GOLDEN)) {
                             int src_x, src_y;
+                            int standard_mc = 1;
                             motion_x = motion_val[fragment][0];
                             motion_y = motion_val[fragment][1];
+#if CONFIG_VP4_DECODER
+                            if (plane && s->version >= 2) {
+                                motion_x = (motion_x >> 1) | (motion_x & 1);
+                                motion_y = (motion_y >> 1) | (motion_y & 1);
+                            }
+#endif
 
                             src_x = (motion_x >> 1) + 8 * x;
                             src_y = (motion_y >> 1) + 8 * y;
@@ -1591,9 +2152,22 @@
                             motion_halfpel_index |= (motion_y & 0x01) << 1;
                             motion_source        += ((motion_y >> 1) * stride);
 
-                            if (src_x < 0 || src_y < 0 ||
+#if CONFIG_VP4_DECODER
+                            if (s->version >= 2) {
+                                uint8_t *temp = s->edge_emu_buffer;
+                                if (stride < 0)
+                                    temp -= 8 * stride;
+                                if (vp4_mc_loop_filter(s, plane, motion_val[fragment][0], motion_val[fragment][1], x, y, motion_source, stride, src_x, src_y, temp)) {
+                                    motion_source = temp;
+                                    standard_mc = 0;
+                                }
+                            }
+#endif
+
+                            if (standard_mc && (
+                                src_x < 0 || src_y < 0 ||
                                 src_x + 9 >= plane_width ||
-                                src_y + 9 >= plane_height) {
+                                src_y + 9 >= plane_height)) {
                                 uint8_t *temp = s->edge_emu_buffer;
                                 if (stride < 0)
                                     temp -= 8 * stride;
@@ -1659,7 +2233,7 @@
             }
 
             // Filter up to the last row in the superblock row
-            if (!s->skip_loop_filter)
+            if (s->version < 2 && !s->skip_loop_filter)
                 apply_loop_filter(s, plane, 4 * sb_y - !!sb_y,
                                   FFMIN(4 * sb_y + 3, fragment_height - 1));
         }
@@ -1688,10 +2262,13 @@
     y_fragment_count = s->fragment_width[0] * s->fragment_height[0];
     c_fragment_count = s->fragment_width[1] * s->fragment_height[1];
 
-    s->superblock_coding = av_mallocz(s->superblock_count);
+    /* superblock_coding is used by unpack_superblocks (VP3/Theora) and vp4_unpack_macroblocks (VP4) */
+    s->superblock_coding = av_mallocz(FFMAX(s->superblock_count, s->yuv_macroblock_count));
     s->all_fragments     = av_mallocz_array(s->fragment_count, sizeof(Vp3Fragment));
 
-    s->coded_fragment_list[0] = av_mallocz_array(s->fragment_count, sizeof(int));
+    s-> kf_coded_fragment_list = av_mallocz_array(s->fragment_count, sizeof(int));
+    s->nkf_coded_fragment_list = av_mallocz_array(s->fragment_count, sizeof(int));
+    memset(s-> num_kf_coded_fragment, -1, sizeof(s-> num_kf_coded_fragment));
 
     s->dct_tokens_base = av_mallocz_array(s->fragment_count,
                                           64 * sizeof(*s->dct_tokens_base));
@@ -1702,9 +2279,13 @@
     s->superblock_fragments = av_mallocz_array(s->superblock_count, 16 * sizeof(int));
     s->macroblock_coding    = av_mallocz(s->macroblock_count + 1);
 
+    s->dc_pred_row = av_malloc_array(s->y_superblock_width * 4, sizeof(*s->dc_pred_row));
+
     if (!s->superblock_coding    || !s->all_fragments          ||
-        !s->dct_tokens_base      || !s->coded_fragment_list[0] ||
+        !s->dct_tokens_base      || !s->kf_coded_fragment_list ||
+        !s->nkf_coded_fragment_list ||
         !s->superblock_fragments || !s->macroblock_coding      ||
+        !s->dc_pred_row ||
         !s->motion_val[0]        || !s->motion_val[1]) {
         vp3_decode_end(avctx);
         return -1;
@@ -1738,14 +2319,17 @@
     int c_width;
     int c_height;
     int y_fragment_count, c_fragment_count;
+#if CONFIG_VP4_DECODER
+    int j;
+#endif
 
     ret = init_frames(s);
     if (ret < 0)
         return ret;
 
-    avctx->internal->allocate_progress = 1;
-
-    if (avctx->codec_tag == MKTAG('V', 'P', '3', '0'))
+    if (avctx->codec_tag == MKTAG('V', 'P', '4', '0'))
+        s->version = 3;
+    else if (avctx->codec_tag == MKTAG('V', 'P', '3', '0'))
         s->version = 0;
     else
         s->version = 1;
@@ -1794,6 +2378,10 @@
     s->macroblock_width  = (s->width  + 15) / 16;
     s->macroblock_height = (s->height + 15) / 16;
     s->macroblock_count  = s->macroblock_width * s->macroblock_height;
+    s->c_macroblock_width  = (c_width  + 15) / 16;
+    s->c_macroblock_height = (c_height + 15) / 16;
+    s->c_macroblock_count  = s->c_macroblock_width * s->c_macroblock_height;
+    s->yuv_macroblock_count = s->macroblock_count + 2 * s->c_macroblock_count;
 
     s->fragment_width[0]  = s->width / FRAGMENT_PIXELS;
     s->fragment_height[0] = s->height / FRAGMENT_PIXELS;
@@ -1809,12 +2397,13 @@
 
     if (!s->theora_tables) {
         for (i = 0; i < 64; i++) {
-            s->coded_dc_scale_factor[i] = vp31_dc_scale_factor[i];
-            s->coded_ac_scale_factor[i] = vp31_ac_scale_factor[i];
-            s->base_matrix[0][i]        = vp31_intra_y_dequant[i];
-            s->base_matrix[1][i]        = vp31_intra_c_dequant[i];
-            s->base_matrix[2][i]        = vp31_inter_dequant[i];
-            s->filter_limit_values[i]   = vp31_filter_limit_values[i];
+            s->coded_dc_scale_factor[0][i] = s->version < 2 ? vp31_dc_scale_factor[i] : vp4_y_dc_scale_factor[i];
+            s->coded_dc_scale_factor[1][i] = s->version < 2 ? vp31_dc_scale_factor[i] : vp4_uv_dc_scale_factor[i];
+            s->coded_ac_scale_factor[i] = s->version < 2 ? vp31_ac_scale_factor[i] : vp4_ac_scale_factor[i];
+            s->base_matrix[0][i]        = s->version < 2 ? vp31_intra_y_dequant[i] : vp4_generic_dequant[i];
+            s->base_matrix[1][i]        = s->version < 2 ? vp31_intra_c_dequant[i] : vp4_generic_dequant[i];
+            s->base_matrix[2][i]        = s->version < 2 ? vp31_inter_dequant[i]   : vp4_generic_dequant[i];
+            s->filter_limit_values[i]   = s->version < 2 ? vp31_filter_limit_values[i] : vp4_filter_limit_values[i];
         }
 
         for (inter = 0; inter < 2; inter++) {
@@ -1827,31 +2416,62 @@
         }
 
         /* init VLC tables */
-        for (i = 0; i < 16; i++) {
-            /* DC histograms */
-            init_vlc(&s->dc_vlc[i], 11, 32,
-                     &dc_bias[i][0][1], 4, 2,
-                     &dc_bias[i][0][0], 4, 2, 0);
+        if (s->version < 2) {
+            for (i = 0; i < 16; i++) {
+                /* DC histograms */
+                init_vlc(&s->dc_vlc[i], 11, 32,
+                         &dc_bias[i][0][1], 4, 2,
+                         &dc_bias[i][0][0], 4, 2, 0);
 
-            /* group 1 AC histograms */
-            init_vlc(&s->ac_vlc_1[i], 11, 32,
-                     &ac_bias_0[i][0][1], 4, 2,
-                     &ac_bias_0[i][0][0], 4, 2, 0);
+                /* group 1 AC histograms */
+                init_vlc(&s->ac_vlc_1[i], 11, 32,
+                         &ac_bias_0[i][0][1], 4, 2,
+                         &ac_bias_0[i][0][0], 4, 2, 0);
 
-            /* group 2 AC histograms */
-            init_vlc(&s->ac_vlc_2[i], 11, 32,
-                     &ac_bias_1[i][0][1], 4, 2,
-                     &ac_bias_1[i][0][0], 4, 2, 0);
+                /* group 2 AC histograms */
+                init_vlc(&s->ac_vlc_2[i], 11, 32,
+                         &ac_bias_1[i][0][1], 4, 2,
+                         &ac_bias_1[i][0][0], 4, 2, 0);
 
-            /* group 3 AC histograms */
-            init_vlc(&s->ac_vlc_3[i], 11, 32,
-                     &ac_bias_2[i][0][1], 4, 2,
-                     &ac_bias_2[i][0][0], 4, 2, 0);
+                /* group 3 AC histograms */
+                init_vlc(&s->ac_vlc_3[i], 11, 32,
+                         &ac_bias_2[i][0][1], 4, 2,
+                         &ac_bias_2[i][0][0], 4, 2, 0);
 
-            /* group 4 AC histograms */
-            init_vlc(&s->ac_vlc_4[i], 11, 32,
-                     &ac_bias_3[i][0][1], 4, 2,
-                     &ac_bias_3[i][0][0], 4, 2, 0);
+                /* group 4 AC histograms */
+                init_vlc(&s->ac_vlc_4[i], 11, 32,
+                         &ac_bias_3[i][0][1], 4, 2,
+                         &ac_bias_3[i][0][0], 4, 2, 0);
+            }
+#if CONFIG_VP4_DECODER
+        } else { /* version >= 2 */
+            for (i = 0; i < 16; i++) {
+                /* DC histograms */
+                init_vlc(&s->dc_vlc[i], 11, 32,
+                         &vp4_dc_bias[i][0][1], 4, 2,
+                         &vp4_dc_bias[i][0][0], 4, 2, 0);
+
+                /* group 1 AC histograms */
+                init_vlc(&s->ac_vlc_1[i], 11, 32,
+                         &vp4_ac_bias_0[i][0][1], 4, 2,
+                         &vp4_ac_bias_0[i][0][0], 4, 2, 0);
+
+                /* group 2 AC histograms */
+                init_vlc(&s->ac_vlc_2[i], 11, 32,
+                         &vp4_ac_bias_1[i][0][1], 4, 2,
+                         &vp4_ac_bias_1[i][0][0], 4, 2, 0);
+
+                /* group 3 AC histograms */
+                init_vlc(&s->ac_vlc_3[i], 11, 32,
+                         &vp4_ac_bias_2[i][0][1], 4, 2,
+                         &vp4_ac_bias_2[i][0][0], 4, 2, 0);
+
+                /* group 4 AC histograms */
+                init_vlc(&s->ac_vlc_4[i], 11, 32,
+                         &vp4_ac_bias_3[i][0][1], 4, 2,
+                         &vp4_ac_bias_3[i][0][0], 4, 2, 0);
+            }
+#endif
         }
     } else {
         for (i = 0; i < 16; i++) {
@@ -1903,6 +2523,20 @@
              &motion_vector_vlc_table[0][1], 2, 1,
              &motion_vector_vlc_table[0][0], 2, 1, 0);
 
+#if CONFIG_VP4_DECODER
+    for (j = 0; j < 2; j++)
+        for (i = 0; i < 7; i++)
+            init_vlc(&s->vp4_mv_vlc[j][i], 6, 63,
+                 &vp4_mv_vlc[j][i][0][1], 4, 2,
+                 &vp4_mv_vlc[j][i][0][0], 4, 2, 0);
+
+    /* version >= 2 */
+    for (i = 0; i < 2; i++)
+        init_vlc(&s->block_pattern_vlc[i], 3, 14,
+             &vp4_block_pattern_vlc[i][0][1], 2, 1,
+             &vp4_block_pattern_vlc[i][0][0], 2, 1, 0);
+#endif
+
     return allocate_tables(avctx);
 
 vlc_fail:
@@ -1932,6 +2566,7 @@
     return ret;
 }
 
+#if HAVE_THREADS
 static int ref_frame(Vp3DecodeContext *s, ThreadFrame *dst, ThreadFrame *src)
 {
     ff_thread_release_buffer(s->avctx, dst);
@@ -1950,16 +2585,11 @@
     return 0;
 }
 
-#if HAVE_THREADS
 static int vp3_update_thread_context(AVCodecContext *dst, const AVCodecContext *src)
 {
     Vp3DecodeContext *s = dst->priv_data, *s1 = src->priv_data;
     int qps_changed = 0, i, err;
 
-#define copy_fields(to, from, start_field, end_field)                         \
-    memcpy(&to->start_field, &from->start_field,                              \
-           (char *) &to->end_field - (char *) &to->start_field)
-
     if (!s1->current_frame.f->data[0] ||
         s->width != s1->width || s->height != s1->height) {
         if (s != s1)
@@ -1968,23 +2598,6 @@
     }
 
     if (s != s1) {
-        if (!s->current_frame.f)
-            return AVERROR(ENOMEM);
-        // init tables if the first frame hasn't been decoded
-        if (!s->current_frame.f->data[0]) {
-            int y_fragment_count, c_fragment_count;
-            s->avctx = dst;
-            err = allocate_tables(dst);
-            if (err)
-                return err;
-            y_fragment_count = s->fragment_width[0] * s->fragment_height[0];
-            c_fragment_count = s->fragment_width[1] * s->fragment_height[1];
-            memcpy(s->motion_val[0], s1->motion_val[0],
-                   y_fragment_count * sizeof(*s->motion_val[0]));
-            memcpy(s->motion_val[1], s1->motion_val[1],
-                   c_fragment_count * sizeof(*s->motion_val[1]));
-        }
-
         // copy previous frame data
         if ((err = ref_frames(s, s1)) < 0)
             return err;
@@ -2003,9 +2616,11 @@
             memcpy(&s->bounding_values_array, &s1->bounding_values_array,
                    sizeof(s->bounding_values_array));
 
-        if (qps_changed)
-            copy_fields(s, s1, qps, superblock_count);
-#undef copy_fields
+        if (qps_changed) {
+            memcpy(s->qps,      s1->qps,      sizeof(s->qps));
+            memcpy(s->last_qps, s1->last_qps, sizeof(s->last_qps));
+            s->nqps = s1->nqps;
+        }
     }
 
     return update_frames(dst);
@@ -2104,7 +2719,7 @@
     s->current_frame.f->pict_type = s->keyframe ? AV_PICTURE_TYPE_I
                                                 : AV_PICTURE_TYPE_P;
     s->current_frame.f->key_frame = s->keyframe;
-    if (ff_thread_get_buffer(avctx, &s->current_frame, AV_GET_BUFFER_FLAG_REF) < 0)
+    if ((ret = ff_thread_get_buffer(avctx, &s->current_frame, AV_GET_BUFFER_FLAG_REF)) < 0)
         goto error;
 
     if (!s->edge_emu_buffer)
@@ -2126,6 +2741,29 @@
                 av_log(s->avctx, AV_LOG_ERROR,
                        "Warning, unsupported keyframe coding type?!\n");
             skip_bits(&gb, 2); /* reserved? */
+
+#if CONFIG_VP4_DECODER
+            if (s->version >= 2) {
+                int mb_height, mb_width;
+                int mb_width_mul, mb_width_div, mb_height_mul, mb_height_div;
+
+                mb_height = get_bits(&gb, 8);
+                mb_width  = get_bits(&gb, 8);
+                if (mb_height != s->macroblock_height ||
+                    mb_width != s->macroblock_width)
+                    avpriv_request_sample(s->avctx, "macroblock dimension mismatch");
+
+                mb_width_mul = get_bits(&gb, 5);
+                mb_width_div = get_bits(&gb, 3);
+                mb_height_mul = get_bits(&gb, 5);
+                mb_height_div = get_bits(&gb, 3);
+                if (mb_width_mul != 1 || mb_width_div != 1 || mb_height_mul != 1 || mb_height_div != 1)
+                    avpriv_request_sample(s->avctx, "unexpected macroblock dimension multipler/divider");
+
+                if (get_bits(&gb, 2))
+                    avpriv_request_sample(s->avctx, "unknown bits");
+            }
+#endif
         }
     } else {
         if (!s->golden_frame.f->data[0]) {
@@ -2133,8 +2771,8 @@
                    "vp3: first frame not a keyframe\n");
 
             s->golden_frame.f->pict_type = AV_PICTURE_TYPE_I;
-            if (ff_thread_get_buffer(avctx, &s->golden_frame,
-                                     AV_GET_BUFFER_FLAG_REF) < 0)
+            if ((ret = ff_thread_get_buffer(avctx, &s->golden_frame,
+                                     AV_GET_BUFFER_FLAG_REF)) < 0)
                 goto error;
             ff_thread_release_buffer(avctx, &s->last_frame);
             if ((ret = ff_thread_ref_frame(&s->last_frame,
@@ -2147,25 +2785,44 @@
     memset(s->all_fragments, 0, s->fragment_count * sizeof(Vp3Fragment));
     ff_thread_finish_setup(avctx);
 
-    if (unpack_superblocks(s, &gb)) {
-        av_log(s->avctx, AV_LOG_ERROR, "error in unpack_superblocks\n");
-        goto error;
+    if (s->version < 2) {
+        if ((ret = unpack_superblocks(s, &gb)) < 0) {
+            av_log(s->avctx, AV_LOG_ERROR, "error in unpack_superblocks\n");
+            goto error;
+        }
+#if CONFIG_VP4_DECODER
+    } else {
+        if ((ret = vp4_unpack_macroblocks(s, &gb)) < 0) {
+            av_log(s->avctx, AV_LOG_ERROR, "error in vp4_unpack_macroblocks\n");
+            goto error;
     }
-    if (unpack_modes(s, &gb)) {
+#endif
+    }
+    if ((ret = unpack_modes(s, &gb)) < 0) {
         av_log(s->avctx, AV_LOG_ERROR, "error in unpack_modes\n");
         goto error;
     }
-    if (unpack_vectors(s, &gb)) {
+    if (ret = unpack_vectors(s, &gb)) {
         av_log(s->avctx, AV_LOG_ERROR, "error in unpack_vectors\n");
         goto error;
     }
-    if (unpack_block_qpis(s, &gb)) {
+    if ((ret = unpack_block_qpis(s, &gb)) < 0) {
         av_log(s->avctx, AV_LOG_ERROR, "error in unpack_block_qpis\n");
         goto error;
     }
-    if (unpack_dct_coeffs(s, &gb)) {
-        av_log(s->avctx, AV_LOG_ERROR, "error in unpack_dct_coeffs\n");
-        goto error;
+
+    if (s->version < 2) {
+        if ((ret = unpack_dct_coeffs(s, &gb)) < 0) {
+            av_log(s->avctx, AV_LOG_ERROR, "error in unpack_dct_coeffs\n");
+            goto error;
+        }
+#if CONFIG_VP4_DECODER
+    } else {
+        if ((ret = vp4_unpack_dct_coeffs(s, &gb)) < 0) {
+            av_log(s->avctx, AV_LOG_ERROR, "error in vp4_unpack_dct_coeffs\n");
+            goto error;
+        }
+#endif
     }
 
     for (i = 0; i < 3; i++) {
@@ -2181,10 +2838,11 @@
         render_slice(s, i);
 
     // filter the last row
-    for (i = 0; i < 3; i++) {
-        int row = (s->height >> (3 + (i && s->chroma_y_shift))) - 1;
-        apply_loop_filter(s, i, row, row + 1);
-    }
+    if (s->version < 2)
+        for (i = 0; i < 3; i++) {
+            int row = (s->height >> (3 + (i && s->chroma_y_shift))) - 1;
+            apply_loop_filter(s, i, row, row + 1);
+        }
     vp3_draw_horiz_band(s, s->height);
 
     /* output frame, offset as needed */
@@ -2212,7 +2870,7 @@
     if (!HAVE_THREADS || !(s->avctx->active_thread_type & FF_THREAD_FRAME))
         av_frame_unref(s->current_frame.f);
 
-    return -1;
+    return ret;
 }
 
 static int read_huffman_tree(AVCodecContext *avctx, GetBitContext *gb)
@@ -2249,25 +2907,6 @@
     return 0;
 }
 
-#if HAVE_THREADS
-static int vp3_init_thread_copy(AVCodecContext *avctx)
-{
-    Vp3DecodeContext *s = avctx->priv_data;
-
-    s->superblock_coding      = NULL;
-    s->all_fragments          = NULL;
-    s->coded_fragment_list[0] = NULL;
-    s->dct_tokens_base        = NULL;
-    s->superblock_fragments   = NULL;
-    s->macroblock_coding      = NULL;
-    s->motion_val[0]          = NULL;
-    s->motion_val[1]          = NULL;
-    s->edge_emu_buffer        = NULL;
-
-    return init_frames(s);
-}
-#endif
-
 #if CONFIG_THEORA_DECODER
 static const enum AVPixelFormat theora_pix_fmts[4] = {
     AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE, AV_PIX_FMT_YUV422P, AV_PIX_FMT_YUV444P
@@ -2282,8 +2921,12 @@
     AVRational fps, aspect;
 
     s->theora_header = 0;
-    s->theora = get_bits_long(gb, 24);
+    s->theora = get_bits(gb, 24);
     av_log(avctx, AV_LOG_DEBUG, "Theora bitstream version %X\n", s->theora);
+    if (!s->theora) {
+        s->theora = 1;
+        avpriv_request_sample(s->avctx, "theora 0");
+    }
 
     /* 3.2.0 aka alpha3 has the same frame orientation as original vp3
      * but previous versions have the image flipped relative to vp3 */
@@ -2299,8 +2942,8 @@
     s->height      = get_bits(gb, 16) << 4;
 
     if (s->theora >= 0x030200) {
-        visible_width  = get_bits_long(gb, 24);
-        visible_height = get_bits_long(gb, 24);
+        visible_width  = get_bits(gb, 24);
+        visible_height = get_bits(gb, 24);
 
         offset_x = get_bits(gb, 8); /* offset x */
         offset_y = get_bits(gb, 8); /* offset y, from bottom */
@@ -2328,8 +2971,8 @@
                   fps.den, fps.num, 1 << 30);
     }
 
-    aspect.num = get_bits_long(gb, 24);
-    aspect.den = get_bits_long(gb, 24);
+    aspect.num = get_bits(gb, 24);
+    aspect.den = get_bits(gb, 24);
     if (aspect.num && aspect.den) {
         av_reduce(&avctx->sample_aspect_ratio.num,
                   &avctx->sample_aspect_ratio.den,
@@ -2411,7 +3054,8 @@
         n = 16;
     /* dc scale factor table */
     for (i = 0; i < 64; i++)
-        s->coded_dc_scale_factor[i] = get_bits(gb, n);
+        s->coded_dc_scale_factor[0][i] =
+        s->coded_dc_scale_factor[1][i] = get_bits(gb, n);
 
     if (s->theora >= 0x030200)
         matrices = get_bits(gb, 9) + 1;
@@ -2576,9 +3220,8 @@
     .capabilities          = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DRAW_HORIZ_BAND |
                              AV_CODEC_CAP_FRAME_THREADS,
     .flush                 = vp3_decode_flush,
-    .init_thread_copy      = ONLY_IF_THREADS_ENABLED(vp3_init_thread_copy),
     .update_thread_context = ONLY_IF_THREADS_ENABLED(vp3_update_thread_context),
-    .caps_internal         = FF_CODEC_CAP_EXPORTS_CROPPING,
+    .caps_internal         = FF_CODEC_CAP_EXPORTS_CROPPING | FF_CODEC_CAP_ALLOCATE_PROGRESS,
 };
 #endif
 
@@ -2594,6 +3237,24 @@
     .capabilities          = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DRAW_HORIZ_BAND |
                              AV_CODEC_CAP_FRAME_THREADS,
     .flush                 = vp3_decode_flush,
-    .init_thread_copy      = ONLY_IF_THREADS_ENABLED(vp3_init_thread_copy),
     .update_thread_context = ONLY_IF_THREADS_ENABLED(vp3_update_thread_context),
+    .caps_internal         = FF_CODEC_CAP_ALLOCATE_PROGRESS,
 };
+
+#if CONFIG_VP4_DECODER
+AVCodec ff_vp4_decoder = {
+    .name                  = "vp4",
+    .long_name             = NULL_IF_CONFIG_SMALL("On2 VP4"),
+    .type                  = AVMEDIA_TYPE_VIDEO,
+    .id                    = AV_CODEC_ID_VP4,
+    .priv_data_size        = sizeof(Vp3DecodeContext),
+    .init                  = vp3_decode_init,
+    .close                 = vp3_decode_end,
+    .decode                = vp3_decode_frame,
+    .capabilities          = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DRAW_HORIZ_BAND |
+                             AV_CODEC_CAP_FRAME_THREADS,
+    .flush                 = vp3_decode_flush,
+    .update_thread_context = ONLY_IF_THREADS_ENABLED(vp3_update_thread_context),
+    .caps_internal         = FF_CODEC_CAP_ALLOCATE_PROGRESS,
+};
+#endif
diff --git a/libavcodec/vp3data.h b/libavcodec/vp3data.h
index 3884bca..3f24d5f 100644
--- a/libavcodec/vp3data.h
+++ b/libavcodec/vp3data.h
@@ -26,7 +26,7 @@
 
 /* these coefficients dequantize intraframe Y plane coefficients
  * (note: same as JPEG) */
-static const int8_t vp31_intra_y_dequant[64] = {
+static const uint8_t vp31_intra_y_dequant[64] = {
     16, 11, 10, 16,  24,  40,  51,  61,
     12, 12, 14, 19,  26,  58,  60,  55,
     14, 13, 16, 24,  40,  57,  69,  56,
@@ -39,7 +39,7 @@
 
 /* these coefficients dequantize intraframe C plane coefficients
  * (note: same as JPEG) */
-static const int8_t vp31_intra_c_dequant[64] = {
+static const uint8_t vp31_intra_c_dequant[64] = {
     17, 18, 24, 47, 99, 99, 99, 99,
     18, 21, 26, 66, 99, 99, 99, 99,
     24, 26, 56, 99, 99, 99, 99, 99,
@@ -51,7 +51,7 @@
 };
 
 /* these coefficients dequantize interframe coefficients (all planes) */
-static const int8_t vp31_inter_dequant[64] = {
+static const uint8_t vp31_inter_dequant[64] = {
     16, 16, 16, 20, 24, 28,  32,  40,
     16, 16, 20, 24, 28, 32,  40,  48,
     16, 20, 24, 28, 32, 40,  48,  64,
@@ -73,7 +73,7 @@
      20,  10,  10,  10,  10,  10,  10,  10
 };
 
-static const uint32_t vp31_ac_scale_factor[64] = {
+static const uint16_t vp31_ac_scale_factor[64] = {
     500, 450, 400, 370, 340, 310, 285, 265,
     245, 225, 210, 195, 185, 180, 170, 160,
     150, 145, 135, 130, 125, 115, 110, 107,
@@ -198,11 +198,10 @@
 };
 
 /* only tokens 0..6 indicate eob runs */
-static const uint8_t eob_run_base[7] = {
-    1, 2, 3, 4, 8, 16, 0
-};
-static const uint8_t eob_run_get_bits[7] = {
-    0, 0, 0, 2, 3, 4, 12
+static const struct {
+    uint8_t base, bits;
+} eob_run_table[7] = {
+    {1, 0}, {2, 0}, {3, 0}, {4, 2}, {8, 3}, {16, 4}, {0, 12}
 };
 
 static const uint8_t zero_run_base[32] = {
diff --git a/libavcodec/vp3dsp.c b/libavcodec/vp3dsp.c
index fdaa292..f485fba 100644
--- a/libavcodec/vp3dsp.c
+++ b/libavcodec/vp3dsp.c
@@ -27,6 +27,7 @@
 #include "libavutil/attributes.h"
 #include "libavutil/common.h"
 #include "libavutil/intreadwrite.h"
+#include "libavutil/avassert.h"
 
 #include "avcodec.h"
 #include "rnd_avg.h"
@@ -194,6 +195,158 @@
     }
 }
 
+static av_always_inline void idct10(uint8_t *dst, ptrdiff_t stride,
+                                    int16_t *input, int type)
+{
+    int16_t *ip = input;
+
+    int A, B, C, D, Ad, Bd, Cd, Dd, E, F, G, H;
+    int Ed, Gd, Add, Bdd, Fd, Hd;
+
+    int i;
+
+    /* Inverse DCT on the rows now */
+    for (i = 0; i < 4; i++) {
+        /* Check for non-zero values */
+        if (ip[0 * 8] | ip[1 * 8] | ip[2 * 8] | ip[3 * 8]) {
+            A =  M(xC1S7, ip[1 * 8]);
+            B =  M(xC7S1, ip[1 * 8]);
+            C =  M(xC3S5, ip[3 * 8]);
+            D = -M(xC5S3, ip[3 * 8]);
+
+            Ad = M(xC4S4, (A - C));
+            Bd = M(xC4S4, (B - D));
+
+            Cd = A + C;
+            Dd = B + D;
+
+            E = M(xC4S4, ip[0 * 8]);
+            F = E;
+
+            G = M(xC2S6, ip[2 * 8]);
+            H = M(xC6S2, ip[2 * 8]);
+
+            Ed = E - G;
+            Gd = E + G;
+
+            Add = F + Ad;
+            Bdd = Bd - H;
+
+            Fd = F - Ad;
+            Hd = Bd + H;
+
+            /* Final sequence of operations over-write original inputs */
+            ip[0 * 8] = Gd + Cd;
+            ip[7 * 8] = Gd - Cd;
+
+            ip[1 * 8] = Add + Hd;
+            ip[2 * 8] = Add - Hd;
+
+            ip[3 * 8] = Ed + Dd;
+            ip[4 * 8] = Ed - Dd;
+
+            ip[5 * 8] = Fd + Bdd;
+            ip[6 * 8] = Fd - Bdd;
+
+        }
+
+        ip += 1;
+    }
+
+    ip = input;
+
+    for (i = 0; i < 8; i++) {
+        /* Check for non-zero values (bitwise or faster than ||) */
+        if (ip[0] | ip[1] | ip[2] | ip[3]) {
+            A =  M(xC1S7, ip[1]);
+            B =  M(xC7S1, ip[1]);
+            C =  M(xC3S5, ip[3]);
+            D = -M(xC5S3, ip[3]);
+
+            Ad = M(xC4S4, (A - C));
+            Bd = M(xC4S4, (B - D));
+
+            Cd = A + C;
+            Dd = B + D;
+
+            E = M(xC4S4, ip[0]);
+            if (type == 1)
+                E += 16 * 128;
+            F = E;
+
+            G = M(xC2S6, ip[2]);
+            H = M(xC6S2, ip[2]);
+
+            Ed = E - G;
+            Gd = E + G;
+
+            Add = F + Ad;
+            Bdd = Bd - H;
+
+            Fd = F - Ad;
+            Hd = Bd + H;
+
+            Gd += 8;
+            Add += 8;
+            Ed += 8;
+            Fd += 8;
+
+            /* Final sequence of operations over-write original inputs. */
+            if (type == 1) {
+                dst[0 * stride] = av_clip_uint8((Gd + Cd) >> 4);
+                dst[7 * stride] = av_clip_uint8((Gd - Cd) >> 4);
+
+                dst[1 * stride] = av_clip_uint8((Add + Hd) >> 4);
+                dst[2 * stride] = av_clip_uint8((Add - Hd) >> 4);
+
+                dst[3 * stride] = av_clip_uint8((Ed + Dd) >> 4);
+                dst[4 * stride] = av_clip_uint8((Ed - Dd) >> 4);
+
+                dst[5 * stride] = av_clip_uint8((Fd + Bdd) >> 4);
+                dst[6 * stride] = av_clip_uint8((Fd - Bdd) >> 4);
+            } else {
+                dst[0 * stride] = av_clip_uint8(dst[0 * stride] + ((Gd + Cd) >> 4));
+                dst[7 * stride] = av_clip_uint8(dst[7 * stride] + ((Gd - Cd) >> 4));
+
+                dst[1 * stride] = av_clip_uint8(dst[1 * stride] + ((Add + Hd) >> 4));
+                dst[2 * stride] = av_clip_uint8(dst[2 * stride] + ((Add - Hd) >> 4));
+
+                dst[3 * stride] = av_clip_uint8(dst[3 * stride] + ((Ed + Dd) >> 4));
+                dst[4 * stride] = av_clip_uint8(dst[4 * stride] + ((Ed - Dd) >> 4));
+
+                dst[5 * stride] = av_clip_uint8(dst[5 * stride] + ((Fd + Bdd) >> 4));
+                dst[6 * stride] = av_clip_uint8(dst[6 * stride] + ((Fd - Bdd) >> 4));
+            }
+        } else {
+            if (type == 1) {
+                dst[0*stride] =
+                dst[1*stride] =
+                dst[2*stride] =
+                dst[3*stride] =
+                dst[4*stride] =
+                dst[5*stride] =
+                dst[6*stride] =
+                dst[7*stride] = 128;
+            }
+        }
+
+        ip += 8;
+        dst++;
+    }
+}
+
+void ff_vp3dsp_idct10_put(uint8_t *dest, ptrdiff_t stride, int16_t *block)
+{
+    idct10(dest, stride, block, 1);
+    memset(block, 0, sizeof(*block) * 64);
+}
+
+void ff_vp3dsp_idct10_add(uint8_t *dest, ptrdiff_t stride, int16_t *block)
+{
+    idct10(dest, stride, block, 2);
+    memset(block, 0, sizeof(*block) * 64);
+}
+
 static void vp3_idct_put_c(uint8_t *dest /* align 8 */, ptrdiff_t stride,
                            int16_t *block /* align 16 */)
 {
@@ -227,14 +380,14 @@
     block[0] = 0;
 }
 
-static void vp3_v_loop_filter_c(uint8_t *first_pixel, ptrdiff_t stride,
-                                int *bounding_values)
+static av_always_inline void vp3_v_loop_filter_c(uint8_t *first_pixel, ptrdiff_t stride,
+                                                 int *bounding_values, int count)
 {
     unsigned char *end;
     int filter_value;
     const ptrdiff_t nstride = -stride;
 
-    for (end = first_pixel + 8; first_pixel < end; first_pixel++) {
+    for (end = first_pixel + count; first_pixel < end; first_pixel++) {
         filter_value = (first_pixel[2 * nstride] - first_pixel[stride]) +
                        (first_pixel[0] - first_pixel[nstride]) * 3;
         filter_value = bounding_values[(filter_value + 4) >> 3];
@@ -244,13 +397,13 @@
     }
 }
 
-static void vp3_h_loop_filter_c(uint8_t *first_pixel, ptrdiff_t stride,
-                                int *bounding_values)
+static av_always_inline void vp3_h_loop_filter_c(uint8_t *first_pixel, ptrdiff_t stride,
+                                                 int *bounding_values, int count)
 {
     unsigned char *end;
     int filter_value;
 
-    for (end = first_pixel + 8 * stride; first_pixel != end; first_pixel += stride) {
+    for (end = first_pixel + count * stride; first_pixel != end; first_pixel += stride) {
         filter_value = (first_pixel[-2] - first_pixel[1]) +
                        (first_pixel[ 0] - first_pixel[-1]) * 3;
         filter_value = bounding_values[(filter_value + 4) >> 3];
@@ -260,6 +413,18 @@
     }
 }
 
+#define LOOP_FILTER(prefix, suffix, dim, count) \
+void prefix##_##dim##_loop_filter_##count##suffix(uint8_t *first_pixel, ptrdiff_t stride, \
+                                int *bounding_values) \
+{ \
+    vp3_##dim##_loop_filter_c(first_pixel, stride, bounding_values, count); \
+}
+
+static LOOP_FILTER(vp3,_c, v, 8)
+static LOOP_FILTER(vp3,_c, h, 8)
+LOOP_FILTER(ff_vp3dsp, , v, 12)
+LOOP_FILTER(ff_vp3dsp, , h, 12)
+
 static void put_no_rnd_pixels_l2(uint8_t *dst, const uint8_t *src1,
                                  const uint8_t *src2, ptrdiff_t stride, int h)
 {
@@ -284,8 +449,8 @@
     c->idct_put      = vp3_idct_put_c;
     c->idct_add      = vp3_idct_add_c;
     c->idct_dc_add   = vp3_idct_dc_add_c;
-    c->v_loop_filter = vp3_v_loop_filter_c;
-    c->h_loop_filter = vp3_h_loop_filter_c;
+    c->v_loop_filter = c->v_loop_filter_unaligned = vp3_v_loop_filter_8_c;
+    c->h_loop_filter = c->h_loop_filter_unaligned = vp3_h_loop_filter_8_c;
 
     if (ARCH_ARM)
         ff_vp3dsp_init_arm(c, flags);
@@ -293,4 +458,37 @@
         ff_vp3dsp_init_ppc(c, flags);
     if (ARCH_X86)
         ff_vp3dsp_init_x86(c, flags);
+    if (ARCH_MIPS)
+        ff_vp3dsp_init_mips(c, flags);
+}
+
+/*
+ * This function initializes the loop filter boundary limits if the frame's
+ * quality index is different from the previous frame's.
+ *
+ * where sizeof(bounding_values_array) is 256 * sizeof(int)
+ *
+ * The filter_limit_values may not be larger than 127.
+ */
+void ff_vp3dsp_set_bounding_values(int * bounding_values_array, int filter_limit)
+{
+    int *bounding_values = bounding_values_array + 127;
+    int x;
+    int value;
+
+    av_assert0(filter_limit < 128U);
+
+    /* set up the bounding values */
+    memset(bounding_values_array, 0, 256 * sizeof(int));
+    for (x = 0; x < filter_limit; x++) {
+        bounding_values[-x] = -x;
+        bounding_values[x] = x;
+    }
+    for (x = value = filter_limit; x < 128 && value; x++, value--) {
+        bounding_values[ x] =  value;
+        bounding_values[-x] = -value;
+    }
+    if (value)
+        bounding_values[128] = value;
+    bounding_values[129] = bounding_values[130] = filter_limit * 0x02020202;
 }
diff --git a/libavcodec/vp3dsp.h b/libavcodec/vp3dsp.h
index 2fdad16..3b849ec 100644
--- a/libavcodec/vp3dsp.h
+++ b/libavcodec/vp3dsp.h
@@ -43,11 +43,22 @@
     void (*idct_dc_add)(uint8_t *dest, ptrdiff_t stride, int16_t *block);
     void (*v_loop_filter)(uint8_t *src, ptrdiff_t stride, int *bounding_values);
     void (*h_loop_filter)(uint8_t *src, ptrdiff_t stride, int *bounding_values);
+    void (*v_loop_filter_unaligned)(uint8_t *src, ptrdiff_t stride, int *bounding_values);
+    void (*h_loop_filter_unaligned)(uint8_t *src, ptrdiff_t stride, int *bounding_values);
 } VP3DSPContext;
 
+void ff_vp3dsp_v_loop_filter_12(uint8_t *first_pixel, ptrdiff_t stride, int *bounding_values);
+void ff_vp3dsp_h_loop_filter_12(uint8_t *first_pixel, ptrdiff_t stride, int *bounding_values);
+
+void ff_vp3dsp_idct10_put(uint8_t *dest, ptrdiff_t stride, int16_t *block);
+void ff_vp3dsp_idct10_add(uint8_t *dest, ptrdiff_t stride, int16_t *block);
+
 void ff_vp3dsp_init(VP3DSPContext *c, int flags);
 void ff_vp3dsp_init_arm(VP3DSPContext *c, int flags);
 void ff_vp3dsp_init_ppc(VP3DSPContext *c, int flags);
 void ff_vp3dsp_init_x86(VP3DSPContext *c, int flags);
+void ff_vp3dsp_init_mips(VP3DSPContext *c, int flags);
+
+void ff_vp3dsp_set_bounding_values(int * bound_values_array, int filter_limit);
 
 #endif /* AVCODEC_VP3DSP_H */
diff --git a/libavcodec/vp4data.h b/libavcodec/vp4data.h
new file mode 100644
index 0000000..69a009e
--- /dev/null
+++ b/libavcodec/vp4data.h
@@ -0,0 +1,1186 @@
+/*
+ * Copyright (C) 2019 Peter Ross
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file
+ * VP4 video decoder
+ */
+
+#ifndef AVCODEC_VP4DATA_H
+#define AVCODEC_VP4DATA_H
+
+#include <stdint.h>
+
+static const uint8_t vp4_generic_dequant[64] = {
+    16, 17, 18, 20, 22, 24, 26, 28,
+    17, 18, 20, 22, 24, 26, 28, 32,
+    18, 20, 22, 24, 26, 28, 32, 36,
+    20, 22, 24, 26, 28, 32, 36, 40,
+    22, 24, 26, 28, 32, 36, 40, 44,
+    24, 26, 28, 32, 36, 40, 44, 48,
+    26, 28, 32, 36, 40, 44, 48, 52,
+    28, 32, 36, 40, 44, 48, 52, 56
+};
+
+static const uint8_t vp4_y_dc_scale_factor[64] = {
+    180, 180, 180, 180, 180, 180, 175, 170,
+    165, 160, 157, 155, 152, 150, 147, 145,
+    142, 140, 137, 135, 132, 130, 127, 125,
+    122, 120, 117, 115, 112, 110, 107, 105,
+    102, 100,  97,  95,  92,  90,  87,  85,
+     82,  80,  77,  75,  72,  70,  67,  65,
+     62,  60,  57,  55,  52,  50,  47,  45,
+     42,  40,  37,  35,  32,  30,  27,  25
+};
+
+static const uint8_t vp4_uv_dc_scale_factor[64] = {
+    150, 150, 150, 150, 150, 150, 150, 150,
+    150, 150, 150, 150, 150, 150, 147, 145,
+    142, 140, 137, 135, 132, 130, 127, 125,
+    122, 120, 117, 115, 112, 110, 107, 105,
+    102, 100,  97,  95,  92,  90,  87,  85,
+     82,  80,  77,  75,  72,  70,  67,  65,
+     62,  60,  57,  55,  52,  50,  47,  45,
+     42,  40,  37,  35,  32,  30,  27,  25
+};
+
+static const uint16_t vp4_ac_scale_factor[64] = {
+    500, 475, 450, 430, 410, 390, 370, 350,
+    330, 315, 300, 285, 270, 260, 250, 240,
+    230, 220, 210, 200, 190, 185, 180, 170,
+    160, 150, 143, 135, 128, 120, 113, 106,
+    100,  94,  90,  85,  80,  75,  70,  66,
+     62,  57,  52,  49,  45,  41,  38,  35,
+     33,  30,  27,  24,  22,  20,  18,  16,
+     14,  12,  10,   9,   7,   6,   4,   1
+};
+
+static const uint8_t vp4_filter_limit_values[64] = {
+    30, 25, 20, 20, 15, 15, 14, 14,
+    13, 13, 12, 12, 11, 11, 10, 10,
+     9,  9,  8,  8,  7,  7,  7,  7,
+     6,  6,  6,  6,  5,  5,  5,  5,
+     4,  4,  4,  4,  3,  3,  3,  3,
+     2,  2,  2,  2,  2,  2,  2,  2,
+     2,  2,  2,  2,  2,  2,  2,  2,
+     1,  1,  1,  1,  1,  1,  1,  1
+};
+
+static const uint8_t vp4_block_pattern_table_selector[14] = {
+    0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1
+};
+
+static const uint8_t vp4_block_pattern_vlc[2][14][2] = {
+    {
+        { 0x0, 3 }, { 0xf, 4 }, { 0x9, 4 }, { 0x2, 3 },
+        { 0xd, 4 }, { 0xe, 5 }, { 0xb, 4 }, { 0x1, 3 },
+        { 0xf, 5 }, { 0x8, 4 }, { 0x6, 4 }, { 0xe, 4 },
+        { 0xc, 4 }, { 0xa, 4 }
+    },
+    {
+        { 0x7, 4 }, { 0xa, 4 }, { 0x9, 4 }, { 0xc, 4 },
+        { 0x8, 4 }, { 0xd, 5 }, { 0x0, 3 }, { 0xe, 4 },
+        { 0xc, 5 }, { 0xd, 4 }, { 0x1, 3 }, { 0xb, 4 },
+        { 0xf, 4 }, { 0x2, 3 }
+    }
+};
+
+static const uint8_t vp4_mv_table_selector[32] = {
+    0, 1, 2, 2, 3, 3, 3, 3,
+    4, 4, 4, 4, 4, 4, 4, 4,
+    5, 5, 5, 5, 5, 5, 5, 5,
+    6, 6, 6, 6, 6, 6, 6, 6,
+};
+
+static const uint16_t vp4_mv_vlc[2][7][63][2] = {
+    { /* x-axis tables */
+        {
+            {   0x6A,  7 }, {  0x11A,  9 }, {  0x18E,  9 }, {  0x237, 10 },
+            {   0x4A,  8 }, {  0x236, 10 }, {   0x7A,  8 }, {   0xD6,  9 },
+            {   0x7E,  8 }, {  0x1FD, 10 }, {   0x8C,  8 }, {   0xD7,  9 },
+            {   0x87,  8 }, {  0x183,  9 }, {   0x3C,  7 }, {   0x61,  7 },
+            {   0x47,  7 }, {   0x69,  8 }, {   0x40,  7 }, {   0x48,  8 },
+            {   0x49,  7 }, {   0x86,  8 }, {   0x13,  6 }, {   0xD2,  8 },
+            {   0x1C,  6 }, {   0x42,  7 }, {   0x25,  6 }, {   0x1B,  6 },
+            {   0x13,  5 }, {    0x5,  4 }, {    0x0,  2 }, {    0x7,  3 },
+            {    0x5,  3 }, {   0x1B,  5 }, {   0x19,  5 }, {   0x19,  6 },
+            {    0x8,  5 }, {   0x45,  7 }, {   0x1D,  6 }, {   0xC6,  8 },
+            {   0x68,  7 }, {   0x90,  8 }, {   0x41,  7 }, {   0x4B,  8 },
+            {   0x31,  7 }, {  0x18F,  9 }, {   0x62,  7 }, {   0x3E,  7 },
+            {   0x44,  7 }, {   0x68,  8 }, {   0x30,  7 }, {  0x182,  9 },
+            {   0xC0,  8 }, {  0x1A7,  9 }, {   0x91,  8 }, {   0x92,  9 },
+            {   0x7B,  8 }, {   0xFF,  9 }, {  0x1A6,  9 }, {  0x1FC, 10 },
+            {   0x6A,  8 }, {   0x93,  9 }, {   0x6B,  7 }
+        },
+        {
+            {   0x39,  7 }, {  0x259, 10 }, {   0x1B,  8 }, {  0x1D1, 10 },
+            {  0x137,  9 }, {  0x1D0, 10 }, {   0x1A,  8 }, {  0x1B5, 10 },
+            {   0x1D,  8 }, {  0x4BC, 11 }, {   0x6C,  8 }, {   0x38,  9 },
+            {   0x71,  8 }, {   0x2D,  9 }, {   0x7D,  8 }, {   0x75,  8 },
+            {   0x19,  7 }, {   0xE9,  9 }, {   0x37,  7 }, {   0x15,  8 },
+            {   0x1E,  7 }, {   0xDB,  9 }, {   0x4C,  7 }, {   0x70,  8 },
+            {    0xD,  6 }, {    0xC,  7 }, {   0x27,  6 }, {    0x4,  6 },
+            {    0x2,  4 }, {    0x0,  4 }, {    0x5,  3 }, {    0x7,  3 },
+            {    0x6,  3 }, {    0x2,  3 }, {    0x8,  4 }, {   0x24,  6 },
+            {    0xC,  5 }, {   0x3B,  7 }, {   0x1E,  6 }, {   0x9A,  8 },
+            {    0xE,  6 }, {   0x69,  8 }, {   0x4A,  7 }, {  0x12D,  9 },
+            {   0x35,  7 }, {   0xF9,  9 }, {   0x18,  7 }, {   0x7F,  8 },
+            {    0xF,  7 }, {   0xF8,  9 }, {   0x7E,  8 }, {  0x25F, 10 },
+            {   0x68,  8 }, {   0x2C,  9 }, {   0x14,  8 }, {  0x258, 10 },
+            {  0x136,  9 }, {  0x4BD, 11 }, {  0x12E,  9 }, {  0x1B4, 10 },
+            {   0x17,  8 }, {   0x39,  9 }, {   0x1F,  7 }
+        },
+        {
+            {   0x29,  7 }, {  0x3CB, 10 }, {  0x1F5,  9 }, {  0x263, 10 },
+            {  0x1F4,  9 }, {  0x3DA, 10 }, {   0x50,  8 }, {  0x260, 10 },
+            {  0x1EC,  9 }, {  0x3D3, 10 }, {  0x109,  9 }, {  0x3D2, 10 },
+            {   0x51,  8 }, {  0x792, 11 }, {   0xF3,  8 }, {   0x9A,  8 },
+            {   0xF7,  8 }, {  0x132,  9 }, {   0xC1,  8 }, {  0x1E8,  9 },
+            {   0x2A,  7 }, {   0x85,  8 }, {   0x61,  7 }, {  0x1F7,  9 },
+            {   0x78,  7 }, {   0xC7,  8 }, {   0x23,  6 }, {   0x7C,  7 },
+            {   0x12,  5 }, {    0xB,  5 }, {    0xE,  4 }, {    0xD,  4 },
+            {    0x0,  2 }, {    0x5,  3 }, {    0x3,  3 }, {    0x4,  4 },
+            {   0x19,  5 }, {   0x20,  6 }, {   0x3F,  6 }, {   0x43,  7 },
+            {   0x62,  7 }, {   0x9F,  8 }, {   0x4E,  7 }, {  0x181,  9 },
+            {   0x2B,  7 }, {  0x137,  9 }, {   0xF5,  8 }, {   0x89,  8 },
+            {   0xC6,  8 }, {  0x262, 10 }, {   0x88,  8 }, {  0x3C8, 10 },
+            {  0x1F6,  9 }, {  0x3CA, 10 }, {   0x9E,  8 }, {  0x261, 10 },
+            {  0x136,  9 }, {  0x108,  9 }, {  0x133,  9 }, {  0x793, 11 },
+            {  0x180,  9 }, {  0x3DB, 10 }, {   0x45,  7 }
+        },
+        {
+            {    0x1,  6 }, {  0x1C7,  9 }, {   0x67,  8 }, {   0xB5,  9 },
+            {   0x66,  8 }, {  0x139,  9 }, {   0x99,  8 }, {   0xB4,  9 },
+            {   0xC3,  8 }, {  0x130,  9 }, {    0x0,  7 }, {  0x131,  9 },
+            {   0x9E,  8 }, {   0xB7,  9 }, {   0x2C,  7 }, {    0x1,  7 },
+            {   0x28,  7 }, {  0x138,  9 }, {   0x4B,  7 }, {   0x31,  8 },
+            {   0x60,  7 }, {   0x91,  8 }, {    0x3,  6 }, {   0x9D,  8 },
+            {   0x17,  6 }, {   0x4D,  7 }, {   0x31,  6 }, {   0x70,  7 },
+            {    0x7,  5 }, {   0x3A,  6 }, {    0x7,  4 }, {    0x2,  4 },
+            {    0xB,  4 }, {    0x1,  4 }, {    0xF,  4 }, {    0x8,  4 },
+            {    0xD,  4 }, {    0x4,  4 }, {    0xA,  4 }, {    0xD,  5 },
+            {   0x19,  5 }, {    0x2,  6 }, {   0x3B,  6 }, {   0x4A,  7 },
+            {   0x15,  6 }, {   0xC2,  8 }, {   0x18,  6 }, {   0x32,  7 },
+            {   0x72,  7 }, {  0x1C6,  9 }, {   0x29,  7 }, {  0x1C5,  9 },
+            {   0x49,  7 }, {  0x121,  9 }, {   0x1B,  7 }, {   0x30,  8 },
+            {   0x1A,  7 }, {  0x1C4,  9 }, {   0x9F,  8 }, {   0xB6,  9 },
+            {   0x19,  7 }, {  0x120,  9 }, {   0x73,  7 }
+        },
+        {
+            {   0x23,  6 }, {  0x1C8,  9 }, {   0x43,  8 }, {  0x110,  9 },
+            {    0xC,  7 }, {  0x153,  9 }, {   0x22,  7 }, {  0x111,  9 },
+            {    0xF,  7 }, {   0x42,  8 }, {   0x23,  7 }, {  0x1C9,  9 },
+            {   0x2A,  7 }, {   0x1B,  8 }, {   0x73,  7 }, {   0x45,  7 },
+            {   0x6E,  7 }, {   0x89,  8 }, {   0x6C,  7 }, {   0x1A,  8 },
+            {   0x6F,  7 }, {   0xB6,  8 }, {    0xB,  6 }, {   0xE5,  8 },
+            {   0x25,  6 }, {   0x20,  7 }, {   0x29,  6 }, {   0x4D,  7 },
+            {    0x2,  5 }, {   0x14,  6 }, {   0x1A,  5 }, {   0x17,  5 },
+            {   0x1E,  5 }, {   0x27,  6 }, {   0x18,  5 }, {   0x28,  6 },
+            {   0x1F,  5 }, {    0x0,  5 }, {    0x6,  4 }, {   0x10,  5 },
+            {    0x7,  4 }, {    0xB,  5 }, {    0x3,  4 }, {    0x4,  5 },
+            {   0x1D,  5 }, {   0x2C,  6 }, {   0x19,  5 }, {   0x2B,  6 },
+            {    0x9,  5 }, {   0x55,  7 }, {   0x38,  6 }, {    0xE,  7 },
+            {   0x24,  6 }, {   0xA8,  8 }, {    0xA,  6 }, {   0x99,  8 },
+            {   0x5A,  7 }, {   0x98,  8 }, {   0x6D,  7 }, {  0x152,  9 },
+            {   0x2B,  7 }, {   0xB7,  8 }, {    0x1,  5 }
+        },
+        {
+            {   0x3D,  6 }, {   0xB1,  8 }, {   0xDD,  8 }, {  0x1F6,  9 },
+            {   0xC5,  8 }, {  0x188,  9 }, {   0x37,  7 }, {   0x3F,  8 },
+            {   0x1E,  7 }, {  0x189,  9 }, {    0xF,  7 }, {   0x3E,  8 },
+            {   0x6A,  7 }, {  0x1F7,  9 }, {   0x61,  7 }, {   0x79,  7 },
+            {   0x18,  6 }, {   0xB0,  8 }, {    0xE,  6 }, {   0xB3,  8 },
+            {    0xC,  6 }, {   0xDF,  8 }, {    0x6,  6 }, {   0xDC,  8 },
+            {   0x19,  6 }, {   0xDE,  8 }, {   0x27,  6 }, {    0xE,  7 },
+            {   0x1A,  6 }, {   0x63,  7 }, {    0xF,  5 }, {    0xE,  5 },
+            {   0x14,  5 }, {   0x7C,  7 }, {   0x36,  6 }, {   0x6B,  7 },
+            {   0x3F,  6 }, {   0x60,  7 }, {    0x8,  5 }, {   0x74,  7 },
+            {    0x9,  5 }, {   0x78,  7 }, {   0x12,  5 }, {    0xD,  6 },
+            {   0x15,  5 }, {   0x2D,  6 }, {    0x2,  4 }, {   0x1C,  5 },
+            {    0x5,  4 }, {   0x3B,  6 }, {    0x0,  4 }, {   0x34,  6 },
+            {   0x19,  5 }, {   0x26,  6 }, {   0x10,  5 }, {   0x75,  7 },
+            {    0x2,  5 }, {   0x36,  7 }, {   0x23,  6 }, {   0xB2,  8 },
+            {   0x22,  6 }, {   0xFA,  8 }, {   0x17,  5 }
+        },
+        {
+            {   0x15,  5 }, {   0xDD,  8 }, {   0x3E,  7 }, {  0x16E,  9 },
+            {   0x4C,  7 }, {   0x12,  8 }, {   0x5D,  7 }, {   0xB6,  8 },
+            {   0x6F,  7 }, {  0x1F1,  9 }, {   0x69,  7 }, {  0x1F0,  9 },
+            {   0x1D,  7 }, {  0x16F,  9 }, {    0x2,  6 }, {   0x6B,  7 },
+            {    0xC,  6 }, {   0xDC,  8 }, {   0x68,  7 }, {   0x9B,  8 },
+            {   0x7D,  7 }, {   0x9A,  8 }, {    0xD,  6 }, {   0x13,  8 },
+            {    0x8,  6 }, {   0xF9,  8 }, {   0x2C,  6 }, {   0x12,  7 },
+            {   0x33,  6 }, {   0x4F,  7 }, {    0xD,  5 }, {    0x5,  5 },
+            {   0x12,  5 }, {   0x3F,  7 }, {   0x32,  6 }, {   0x13,  7 },
+            {   0x3B,  6 }, {    0x5,  6 }, {   0x2F,  6 }, {   0x5A,  7 },
+            {   0x3F,  6 }, {   0x1C,  7 }, {   0x3A,  6 }, {    0x8,  7 },
+            {   0x36,  6 }, {   0x5C,  7 }, {   0x10,  5 }, {    0x0,  5 },
+            {    0xC,  5 }, {   0x4E,  7 }, {    0x3,  5 }, {   0x6A,  7 },
+            {    0xE,  5 }, {    0x3,  6 }, {   0x14,  5 }, {   0x1E,  6 },
+            {   0x1C,  5 }, {    0xF,  6 }, {   0x18,  5 }, {   0x23,  6 },
+            {   0x1E,  5 }, {   0x22,  6 }, {    0x2,  3 }
+        }
+    },
+    { /* y-axis tables */
+        {
+            {   0x52,  7 }, {  0x14C,  9 }, {  0x1FA,  9 }, {  0x124,  9 },
+            {   0x82,  8 }, {  0x29E, 10 }, {   0x8E,  8 }, {  0x24B, 10 },
+            {   0x9C,  8 }, {  0x3F7, 10 }, {   0x86,  8 }, {  0x114,  9 },
+            {   0x83,  8 }, {  0x3A5, 10 }, {   0xFA,  8 }, {   0x4F,  7 },
+            {   0xFB,  8 }, {  0x13B,  9 }, {   0xFC,  8 }, {  0x172,  9 },
+            {   0x44,  7 }, {  0x173,  9 }, {   0x51,  7 }, {   0x87,  8 },
+            {   0x5F,  7 }, {   0xBA,  8 }, {   0x26,  6 }, {   0x5E,  7 },
+            {   0x16,  5 }, {   0x15,  5 }, {    0x6,  3 }, {    0x1,  2 },
+            {    0x0,  2 }, {   0x1C,  5 }, {   0x1E,  5 }, {   0x75,  7 },
+            {   0x3B,  6 }, {   0xFF,  8 }, {   0x25,  6 }, {   0xBB,  8 },
+            {   0x7C,  7 }, {   0x8B,  8 }, {   0x48,  7 }, {  0x171,  9 },
+            {   0x42,  7 }, {  0x14E,  9 }, {   0x46,  7 }, {   0xFE,  8 },
+            {   0x40,  7 }, {  0x13A,  9 }, {   0x93,  8 }, {  0x115,  9 },
+            {   0x8F,  8 }, {  0x3F6, 10 }, {  0x170,  9 }, {  0x29F, 10 },
+            {  0x1D1,  9 }, {  0x24A, 10 }, {  0x1D3,  9 }, {  0x3A4, 10 },
+            {  0x1D0,  9 }, {  0x14D,  9 }, {   0x50,  7 }
+        },
+        {
+            {   0xDE,  8 }, {  0x223, 10 }, {  0x136,  9 }, {  0x7C5, 11 },
+            {  0x12F,  9 }, {  0x4A1, 11 }, {  0x3D7, 10 }, {  0x7AC, 11 },
+            {  0x133,  9 }, {  0x7C4, 11 }, {  0x1B8,  9 }, {  0x222, 10 },
+            {   0x96,  8 }, {  0x251, 10 }, {   0x95,  8 }, {  0x1F0,  9 },
+            {   0xDA,  8 }, {  0x110,  9 }, {   0x9A,  8 }, {  0x360, 10 },
+            {   0xDD,  8 }, {  0x12E,  9 }, {   0x48,  7 }, {   0x92,  8 },
+            {   0x78,  7 }, {   0x98,  8 }, {   0x27,  6 }, {   0x45,  7 },
+            {   0x1A,  5 }, {   0x10,  5 }, {    0x5,  3 }, {    0x0,  2 },
+            {    0x1,  2 }, {    0xE,  4 }, {    0xC,  4 }, {   0x23,  6 },
+            {   0x3F,  6 }, {   0xF4,  8 }, {   0x7D,  7 }, {   0x89,  8 },
+            {   0x7B,  7 }, {  0x1BE,  9 }, {   0xF9,  8 }, {  0x3E3, 10 },
+            {   0xF3,  8 }, {  0x127,  9 }, {   0xDB,  8 }, {  0x1EA,  9 },
+            {   0xD9,  8 }, {  0x6E7, 11 }, {  0x1BF,  9 }, {  0x4A0, 11 },
+            {  0x1B1,  9 }, {  0x6E6, 11 }, {  0x137,  9 }, {  0x7AD, 11 },
+            {  0x126,  9 }, {  0x6C2, 11 }, {  0x132,  9 }, {  0x6C3, 11 },
+            {  0x129,  9 }, {  0x372, 10 }, {   0xF2,  8 }
+        },
+        {
+            {   0x16,  7 }, {   0x9C,  9 }, {  0x13C,  9 }, {   0x9E, 10 },
+            {  0x12B,  9 }, {   0xBA, 10 }, {  0x181,  9 }, {  0x317, 10 },
+            {   0x84,  8 }, {   0x4E,  9 }, {   0x26,  8 }, {  0x316, 10 },
+            {  0x180,  9 }, {   0x5C,  9 }, {   0xC1,  8 }, {   0x2F,  8 },
+            {   0x10,  7 }, {   0x45,  9 }, {   0x12,  7 }, {  0x189,  9 },
+            {   0x24,  7 }, {  0x13D,  9 }, {   0x66,  7 }, {   0x23,  8 },
+            {   0x67,  7 }, {   0xC6,  8 }, {   0x24,  6 }, {   0x4B,  7 },
+            {   0x11,  5 }, {   0x32,  6 }, {    0xD,  4 }, {    0x0,  3 },
+            {    0x7,  3 }, {    0x5,  3 }, {    0x3,  3 }, {    0x3,  4 },
+            {    0x5,  4 }, {   0x20,  6 }, {    0x8,  5 }, {   0x25,  7 },
+            {   0x26,  6 }, {   0x4F,  8 }, {   0x61,  7 }, {   0x2B,  8 },
+            {   0x4E,  7 }, {  0x18A,  9 }, {   0x43,  7 }, {   0x9F,  8 },
+            {   0x14,  7 }, {  0x254, 10 }, {   0x94,  8 }, {  0x310, 10 },
+            {   0x85,  8 }, {  0x311, 10 }, {   0x2A,  8 }, {   0xBB, 10 },
+            {  0x18F,  9 }, {  0x255, 10 }, {   0x9D,  9 }, {   0x9F, 10 },
+            {  0x18E,  9 }, {   0x44,  9 }, {   0x26,  7 }
+        },
+        {
+            {   0x61,  7 }, {  0x12A,  9 }, {    0xD,  8 }, {  0x3BD, 10 },
+            {   0x89,  8 }, {  0x109,  9 }, {  0x18E,  9 }, {  0x210, 10 },
+            {  0x1D3,  9 }, {  0x211, 10 }, {   0x88,  8 }, {   0x19,  9 },
+            {   0x85,  8 }, {   0x18,  9 }, {   0xE8,  8 }, {   0xCE,  8 },
+            {   0x40,  7 }, {  0x119,  9 }, {   0x45,  7 }, {  0x1D2,  9 },
+            {   0x4B,  7 }, {  0x1DD,  9 }, {   0x62,  7 }, {   0x94,  8 },
+            {   0x75,  7 }, {    0xC,  7 }, {   0x27,  6 }, {    0xD,  7 },
+            {    0x2,  5 }, {   0x26,  6 }, {    0x6,  4 }, {   0x1E,  5 },
+            {    0xD,  4 }, {   0x1F,  5 }, {    0x1,  3 }, {    0xA,  4 },
+            {    0x2,  3 }, {    0x7,  4 }, {    0xB,  4 }, {    0x0,  5 },
+            {   0x1C,  5 }, {   0x76,  7 }, {   0x32,  6 }, {    0x7,  7 },
+            {   0x24,  6 }, {   0xC0,  8 }, {    0x7,  6 }, {   0x41,  7 },
+            {    0x2,  6 }, {  0x18F,  9 }, {   0x47,  7 }, {  0x1DC,  9 },
+            {   0x43,  7 }, {  0x12B,  9 }, {   0xCF,  8 }, {  0x118,  9 },
+            {   0xC6,  8 }, {  0x3BC, 10 }, {   0x8D,  8 }, {  0x3BF, 10 },
+            {   0xC1,  8 }, {  0x3BE, 10 }, {   0x66,  7 }
+        },
+        {
+            {    0x7,  6 }, {  0x14D,  9 }, {   0xA0,  8 }, {   0x9E,  9 },
+            {   0xCF,  8 }, {  0x39C, 10 }, {   0xA1,  8 }, {  0x39D, 10 },
+            {   0xAB,  8 }, {  0x1C5,  9 }, {   0x26,  7 }, {  0x14C,  9 },
+            {   0x25,  7 }, {  0x19C,  9 }, {   0x3F,  7 }, {   0xE1,  8 },
+            {   0x66,  7 }, {  0x1CF,  9 }, {   0x3E,  7 }, {  0x1C4,  9 },
+            {   0x72,  7 }, {   0x4E,  8 }, {    0x6,  6 }, {   0xAA,  8 },
+            {   0x1C,  6 }, {   0xE6,  8 }, {   0x32,  6 }, {   0x51,  7 },
+            {   0x3B,  6 }, {    0x5,  6 }, {   0x1F,  5 }, {   0x18,  5 },
+            {    0x2,  4 }, {   0x3A,  6 }, {    0x0,  4 }, {   0x36,  6 },
+            {    0x5,  4 }, {    0x8,  5 }, {    0x8,  4 }, {   0x16,  5 },
+            {    0x9,  4 }, {    0xD,  5 }, {    0x3,  4 }, {   0x2F,  6 },
+            {   0x1E,  5 }, {   0x2E,  6 }, {   0x1A,  5 }, {   0x2B,  6 },
+            {    0xC,  5 }, {   0x24,  7 }, {   0x1E,  6 }, {   0xE0,  8 },
+            {    0x4,  6 }, {   0xA7,  8 }, {   0x54,  7 }, {  0x1C7,  9 },
+            {   0x52,  7 }, {  0x19D,  9 }, {   0x3A,  7 }, {   0x9F,  9 },
+            {   0x3B,  7 }, {  0x1C6,  9 }, {   0x37,  6 }
+        },
+        {
+            {   0x2A,  6 }, {   0x39,  8 }, {   0x25,  7 }, {  0x115,  9 },
+            {   0x24,  7 }, {  0x1FA,  9 }, {   0x2F,  7 }, {  0x114,  9 },
+            {   0x75,  7 }, {   0x38,  8 }, {   0xFC,  8 }, {   0x36,  8 },
+            {   0x1E,  7 }, {  0x1FB,  9 }, {   0x7F,  7 }, {   0x68,  7 },
+            {   0x16,  6 }, {   0x37,  8 }, {   0x1F,  7 }, {   0x5C,  8 },
+            {   0x13,  6 }, {   0x8B,  8 }, {    0x1,  6 }, {   0xFB,  8 },
+            {   0x21,  6 }, {   0x44,  7 }, {   0x2B,  6 }, {   0x6B,  7 },
+            {   0x3B,  6 }, {    0xC,  6 }, {   0x1C,  5 }, {   0x19,  5 },
+            {    0x1,  4 }, {   0x20,  6 }, {   0x16,  5 }, {   0x7C,  7 },
+            {    0xC,  5 }, {   0x74,  7 }, {    0xA,  5 }, {   0x1C,  6 },
+            {   0x12,  5 }, {   0x69,  7 }, {    0xF,  5 }, {   0x6A,  7 },
+            {   0x14,  5 }, {   0x11,  6 }, {   0x1E,  5 }, {   0x17,  5 },
+            {    0x2,  4 }, {   0x31,  6 }, {   0x1B,  5 }, {   0x30,  6 },
+            {    0xD,  5 }, {    0x0,  6 }, {    0x1,  5 }, {   0x1D,  7 },
+            {   0x23,  6 }, {   0x1A,  7 }, {   0x1D,  6 }, {   0x5D,  8 },
+            {   0x10,  6 }, {   0xFA,  8 }, {   0x13,  5 }
+        },
+        {
+            {   0x12,  5 }, {   0x26,  7 }, {   0x41,  7 }, {   0x22,  8 },
+            {   0x1A,  7 }, {   0xA9,  8 }, {   0x4C,  7 }, {  0x1B2,  9 },
+            {   0x5C,  7 }, {   0xA8,  8 }, {   0x58,  7 }, {  0x1B3,  9 },
+            {   0x40,  7 }, {   0x79,  8 }, {    0xC,  6 }, {   0x55,  7 },
+            {   0x1F,  6 }, {   0xD8,  8 }, {   0x76,  7 }, {   0x23,  8 },
+            {   0x5F,  7 }, {   0x78,  8 }, {    0xB,  6 }, {   0x1B,  7 },
+            {   0x2D,  6 }, {   0x10,  7 }, {   0x37,  6 }, {   0x6D,  7 },
+            {   0x32,  6 }, {    0xA,  6 }, {   0x1A,  5 }, {   0x1E,  5 },
+            {   0x1F,  5 }, {   0x2B,  6 }, {    0xD,  5 }, {   0x77,  7 },
+            {   0x31,  6 }, {   0x5D,  7 }, {   0x38,  6 }, {   0x27,  7 },
+            {    0xC,  5 }, {   0xE9,  8 }, {   0x33,  6 }, {   0x5E,  7 },
+            {   0x30,  6 }, {   0x4D,  7 }, {    0xA,  5 }, {   0x21,  6 },
+            {    0x7,  5 }, {   0x3D,  7 }, {   0x39,  6 }, {   0xE8,  8 },
+            {    0xB,  5 }, {   0x59,  7 }, {   0x14,  5 }, {   0x27,  6 },
+            {   0x11,  5 }, {   0x75,  7 }, {    0xE,  5 }, {    0x9,  6 },
+            {    0x8,  5 }, {   0x12,  6 }, {    0x0,  3 }
+        }
+    }
+};
+
+static const uint16_t vp4_dc_bias[16][32][2] = {
+    { /* DC bias table 0 */
+        {    0xC,  5 }, {   0x70,  7 }, {  0x1CA,  9 }, {  0x1CB,  9 },
+        {  0x391, 10 }, { 0x1C9B, 13 }, { 0x3935, 14 }, {   0x71,  7 },
+        { 0x3934, 14 }, {    0xB,  4 }, {    0xF,  4 }, {   0x19,  5 },
+        {    0x2,  4 }, {    0x9,  4 }, {    0x3,  4 }, {   0x1D,  5 },
+        {   0x18,  5 }, {    0x7,  4 }, {    0xD,  4 }, {    0x2,  3 },
+        {    0x0,  3 }, {    0xA,  4 }, {    0x8,  4 }, {   0x1A,  6 },
+        {   0x73,  7 }, {   0x6F,  8 }, {  0xE4C, 12 }, {  0x727, 11 },
+        {  0x392, 10 }, {  0x390, 10 }, {   0x36,  7 }, {   0x6E,  8 }
+    },
+    { /* DC bias table 1 */
+        {   0x11,  5 }, {   0x7A,  7 }, {   0x83,  8 }, {   0x40,  7 },
+        {  0x105,  9 }, {  0x413, 11 }, {  0x410, 11 }, {   0x7B,  7 },
+        {  0x822, 12 }, {    0xE,  4 }, {    0x2,  3 }, {    0x2,  4 },
+        {    0x6,  4 }, {    0xA,  4 }, {    0x7,  4 }, {   0x1F,  5 },
+        {   0x17,  5 }, {    0x9,  4 }, {    0xD,  4 }, {    0x0,  3 },
+        {    0xC,  4 }, {    0x3,  4 }, {   0x3C,  6 }, {   0x2C,  6 },
+        {   0x21,  6 }, {  0x169,  9 }, {  0x412, 11 }, {  0x2D0, 10 },
+        {  0x2D1, 10 }, {  0x823, 12 }, {   0x5B,  7 }, {   0xB5,  8 }
+    },
+    { /* DC bias table 2 */
+        {   0x17,  5 }, {   0x10,  6 }, {   0xB6,  8 }, {   0x22,  7 },
+        {  0x16A,  9 }, {  0x2D0, 10 }, {  0xB48, 12 }, {   0x77,  7 },
+        { 0x1692, 13 }, {    0x0,  3 }, {    0x3,  3 }, {    0x3,  4 },
+        {    0x9,  4 }, {    0xC,  4 }, {    0x5,  4 }, {    0x2,  4 },
+        {   0x1C,  5 }, {    0x8,  4 }, {    0xD,  4 }, {    0xF,  4 },
+        {    0xA,  4 }, {    0x9,  5 }, {   0x23,  7 }, {   0x3A,  6 },
+        {   0x2C,  6 }, {  0x16B,  9 }, {  0x5A5, 11 }, {  0x2D3, 10 },
+        {  0x2D1, 10 }, { 0x1693, 13 }, {   0x76,  7 }, {   0xB7,  8 }
+    },
+    { /* DC bias table 3 */
+        {   0x1E,  5 }, {   0x13,  6 }, {   0xFB,  8 }, {   0x7C,  7 },
+        {   0x46,  8 }, {  0x7D6, 11 }, {  0xFA9, 12 }, {   0x12,  6 },
+        { 0x1F50, 13 }, {    0x1,  3 }, {    0x4,  3 }, {    0x5,  4 },
+        {    0xA,  4 }, {    0xE,  4 }, {    0x7,  4 }, {    0x0,  4 },
+        {   0x17,  5 }, {    0x6,  4 }, {    0xD,  4 }, {    0xC,  4 },
+        {    0x1,  4 }, {   0x2C,  6 }, {   0x8F,  9 }, {   0x3F,  6 },
+        {   0x2D,  6 }, {  0x1F4,  9 }, {  0x7D5, 11 }, {   0x8E,  9 },
+        {  0x7D7, 11 }, { 0x1F51, 13 }, {   0x10,  6 }, {   0x22,  7 }
+    },
+    { /* DC bias table 4 */
+        {    0x1,  4 }, {   0x2B,  6 }, {   0x12,  7 }, {   0x55,  7 },
+        {   0x27,  8 }, {  0x3B0, 10 }, {  0x762, 11 }, {   0x77,  7 },
+        {  0x261, 12 }, {    0x2,  3 }, {    0x6,  3 }, {    0x7,  4 },
+        {    0xB,  4 }, {    0xF,  4 }, {    0x8,  4 }, {    0x0,  4 },
+        {   0x1C,  5 }, {    0x3,  4 }, {    0x9,  4 }, {    0x6,  4 },
+        {   0x14,  5 }, {   0x54,  7 }, {  0x131, 11 }, {    0x5,  5 },
+        {   0x3A,  6 }, {  0x1D9,  9 }, {   0x99, 10 }, {   0x4D,  9 },
+        {  0x763, 11 }, {  0x260, 12 }, {    0x8,  6 }, {   0xED,  8 }
+    },
+    { /* DC bias table 5 */
+        {    0x4,  4 }, {   0x33,  6 }, {   0x60,  7 }, {   0x65,  7 },
+        {   0xC2,  8 }, {  0x30D, 10 }, {  0x619, 11 }, {   0x64,  7 },
+        { 0x1862, 13 }, {    0x4,  3 }, {    0x7,  3 }, {    0xA,  4 },
+        {    0xB,  4 }, {    0xD,  4 }, {    0x6,  4 }, {    0x0,  4 },
+        {    0xF,  5 }, {    0x3,  4 }, {    0x5,  4 }, {    0x2,  4 },
+        {    0x2,  5 }, {   0x77,  8 }, {  0xC30, 12 }, {    0x3,  5 },
+        {   0x31,  6 }, {  0x187,  9 }, {  0x1D9, 10 }, {   0xED,  9 },
+        {  0x1D8, 10 }, { 0x1863, 13 }, {   0x1C,  6 }, {   0x3A,  7 }
+    },
+    { /* DC bias table 6 */
+        {    0x8,  4 }, {    0xA,  5 }, {   0x6A,  7 }, {   0x16,  6 },
+        {   0x1E,  7 }, {  0x34E, 10 }, {  0x69F, 11 }, {   0x68,  7 },
+        {  0xD28, 12 }, {    0x5,  3 }, {    0x7,  3 }, {    0x7,  4 },
+        {    0xC,  4 }, {    0x0,  3 }, {    0x6,  4 }, {   0x1B,  5 },
+        {   0x12,  5 }, {    0x2,  4 }, {    0x4,  4 }, {   0x13,  5 },
+        {    0xE,  6 }, {  0x34B, 10 }, { 0x1A53, 13 }, {    0x6,  5 },
+        {   0x17,  6 }, {  0x1A6,  9 }, {  0x69E, 11 }, {  0x1A4,  9 },
+        {  0x695, 11 }, { 0x1A52, 13 }, {   0x6B,  7 }, {   0x1F,  7 }
+    },
+    { /* DC bias table 7 */
+        {    0xE,  4 }, {    0xF,  5 }, {   0x17,  6 }, {   0x25,  6 },
+        {   0x9F,  8 }, {  0x138,  9 }, {  0x24B, 10 }, {   0x93,  8 },
+        {  0x92A, 12 }, {    0x5,  3 }, {    0x0,  2 }, {    0x8,  4 },
+        {    0xD,  4 }, {    0xF,  4 }, {    0x6,  4 }, {    0x4,  4 },
+        {    0xE,  5 }, {   0x19,  5 }, {   0x18,  5 }, {    0xA,  5 },
+        {   0x9E,  8 }, {  0x494, 11 }, { 0x1256, 13 }, {   0x26,  6 },
+        {   0x16,  6 }, {  0x124,  9 }, {  0x4E5, 11 }, {  0x273, 10 },
+        {  0x4E4, 11 }, { 0x1257, 13 }, {   0x48,  7 }, {   0x9D,  8 }
+    },
+    { /* DC bias table 8 */
+        {    0x4,  4 }, {   0x2C,  6 }, {   0x50,  7 }, {   0x1E,  7 },
+        {   0x71,  9 }, {   0xE1, 10 }, {   0xE0, 10 }, {   0x1D,  7 },
+        {    0x6,  6 }, {    0x7,  3 }, {    0x6,  3 }, {    0x7,  4 },
+        {    0x5,  4 }, {    0x6,  4 }, {   0x15,  5 }, {    0x0,  5 },
+        {   0x29,  6 }, {    0x2,  5 }, {    0x6,  5 }, {    0x1,  5 },
+        {   0x23,  6 }, {   0x1F,  7 }, {   0x39,  8 }, {    0x9,  4 },
+        {    0x2,  4 }, {   0x10,  5 }, {    0x7,  6 }, {   0x2D,  6 },
+        {   0x2F,  6 }, {   0x2E,  6 }, {   0x22,  6 }, {   0x51,  7 }
+    },
+    { /* DC bias table 9 */
+        {    0x8,  4 }, {   0x2F,  6 }, {   0x51,  7 }, {   0x50,  7 },
+        {  0x2ED, 10 }, {  0x5D9, 11 }, {  0x5D8, 11 }, {   0xBA,  8 },
+        {   0x5C,  7 }, {    0x7,  3 }, {    0x6,  3 }, {    0x9,  4 },
+        {    0x6,  4 }, {    0x7,  4 }, {   0x16,  5 }, {    0x5,  5 },
+        {   0x2B,  6 }, {    0x6,  5 }, {    0xA,  5 }, {    0x1,  5 },
+        {    0xF,  6 }, {   0x1D,  7 }, {  0x177,  9 }, {    0x4,  4 },
+        {    0x1,  4 }, {    0x4,  5 }, {    0x1,  6 }, {   0x2A,  6 },
+        {    0xB,  5 }, {   0x29,  6 }, {    0x0,  6 }, {   0x1C,  7 }
+    },
+    { /* DC bias table 10 */
+        {    0xA,  4 }, {   0x3C,  6 }, {   0x74,  7 }, {   0x4E,  7 },
+        {  0x26D, 10 }, {  0x4D9, 11 }, {  0x4D8, 11 }, {   0x9A,  8 },
+        {   0x4C,  7 }, {    0x0,  2 }, {    0x6,  3 }, {    0x8,  4 },
+        {    0x7,  4 }, {    0x6,  4 }, {   0x16,  5 }, {    0x8,  5 },
+        {   0x2E,  6 }, {    0xA,  5 }, {    0xB,  5 }, {   0x3D,  6 },
+        {   0x24,  6 }, {   0xEB,  8 }, {  0x137,  9 }, {   0x1F,  5 },
+        {   0x1C,  5 }, {   0x3B,  6 }, {   0x12,  6 }, {   0x25,  6 },
+        {   0x2F,  6 }, {   0x13,  6 }, {   0x4F,  7 }, {   0xEA,  8 }
+    },
+    { /* DC bias table 11 */
+        {    0xA,  4 }, {    0xA,  5 }, {    0x3,  6 }, {   0x16,  6 },
+        {    0x9,  8 }, {   0x21, 10 }, {   0x20, 10 }, {   0xB3,  8 },
+        {   0x58,  7 }, {    0x7,  3 }, {    0x6,  3 }, {    0x7,  4 },
+        {    0x6,  4 }, {    0x4,  4 }, {   0x13,  5 }, {    0x2,  5 },
+        {   0x25,  6 }, {    0x0,  5 }, {    0x3,  5 }, {   0x2D,  6 },
+        {   0x5D,  7 }, {   0xB2,  8 }, {   0x11,  9 }, {    0x8,  4 },
+        {    0x2,  4 }, {    0x6,  5 }, {   0x17,  6 }, {   0x2F,  6 },
+        {    0x7,  5 }, {   0x24,  6 }, {   0x5C,  7 }, {    0x5,  7 }
+    },
+    { /* DC bias table 12 */
+        {    0xB,  4 }, {   0x13,  5 }, {   0x1F,  6 }, {   0x31,  6 },
+        {   0x21,  7 }, {  0x295, 10 }, {  0x528, 11 }, {   0xA4,  8 },
+        {   0x3C,  7 }, {    0x0,  2 }, {    0x7,  3 }, {    0x6,  4 },
+        {    0x5,  4 }, {   0x1B,  5 }, {   0x12,  5 }, {   0x32,  6 },
+        {   0x1D,  6 }, {   0x2B,  6 }, {   0x30,  6 }, {   0x1C,  6 },
+        {   0x3D,  7 }, {  0x14B,  9 }, {  0x529, 11 }, {    0x8,  4 },
+        {   0x1A,  5 }, {   0x33,  6 }, {   0x11,  6 }, {   0x2A,  6 },
+        {    0x9,  5 }, {   0x28,  6 }, {   0x53,  7 }, {   0x20,  7 }
+    },
+    { /* DC bias table 13 */
+        {    0xE,  4 }, {   0x15,  5 }, {   0x29,  6 }, {   0x3F,  6 },
+        {   0x4D,  7 }, {  0x2F1, 10 }, {  0x5E0, 11 }, {   0x92,  8 },
+        {   0x48,  7 }, {    0x0,  2 }, {    0x6,  3 }, {    0x6,  4 },
+        {    0x5,  4 }, {    0x4,  4 }, {    0xF,  5 }, {   0x2E,  6 },
+        {   0x1D,  6 }, {   0x28,  6 }, {   0x27,  6 }, {   0x5F,  7 },
+        {   0xBD,  8 }, {  0x179,  9 }, {  0x5E1, 11 }, {    0x8,  4 },
+        {   0x1E,  5 }, {   0x2D,  6 }, {   0x1C,  6 }, {   0x2C,  6 },
+        {   0x3E,  6 }, {   0x25,  6 }, {   0x4C,  7 }, {   0x93,  8 }
+    },
+    { /* DC bias table 14 */
+        {    0xC,  4 }, {   0x17,  5 }, {   0x35,  6 }, {   0x13,  5 },
+        {   0x21,  6 }, {   0xAD,  8 }, {  0x6F1, 11 }, {  0x1BD,  9 },
+        {   0xD9,  8 }, {    0x0,  2 }, {    0x7,  3 }, {    0x7,  4 },
+        {    0x6,  4 }, {    0x4,  4 }, {   0x11,  5 }, {   0x2A,  6 },
+        {   0x6E,  7 }, {   0x25,  6 }, {   0x24,  6 }, {   0x57,  7 },
+        {   0xD8,  8 }, {  0x379, 10 }, {  0x6F0, 11 }, {    0x5,  4 },
+        {   0x16,  5 }, {   0x29,  6 }, {   0x6D,  7 }, {   0x28,  6 },
+        {   0x34,  6 }, {   0x20,  6 }, {   0xDF,  8 }, {   0xAC,  8 }
+    },
+    { /* DC bias table 15 */
+        {    0x0,  3 }, {   0x1A,  5 }, {    0x6,  5 }, {   0x19,  5 },
+        {   0x30,  6 }, {   0x5A,  7 }, {  0x18A,  9 }, {  0x2DD, 10 },
+        {  0x18B,  9 }, {    0x1,  2 }, {    0x7,  3 }, {    0xA,  4 },
+        {    0x9,  4 }, {    0x2,  4 }, {   0x10,  5 }, {   0x2E,  6 },
+        {   0x6E,  7 }, {   0x2C,  6 }, {    0xE,  6 }, {   0x5E,  7 },
+        {   0xC4,  8 }, {  0x5B9, 11 }, {  0x5B8, 11 }, {   0x11,  5 },
+        {   0x36,  6 }, {   0x5F,  7 }, {   0x1E,  7 }, {   0x63,  7 },
+        {   0x6F,  7 }, {   0x1F,  7 }, {   0xB6,  8 }, {  0x16F,  9 }
+    }
+};
+
+static const uint16_t vp4_ac_bias_0[16][32][2] = {
+    { /* AC bias group 1, table 0 */
+        {    0x6,  5 }, {   0x1E,  7 }, {  0x1CC,  9 }, {  0x1CE,  9 },
+        {  0x734, 11 }, { 0x1CD5, 13 }, { 0x1CD4, 13 }, {   0x18,  5 },
+        {  0xE6B, 12 }, {    0x0,  3 }, {    0xF,  4 }, {    0x6,  4 },
+        {    0x7,  4 }, {    0xD,  4 }, {    0x8,  4 }, {    0x2,  4 },
+        {   0x19,  5 }, {    0x5,  4 }, {    0xB,  4 }, {    0xA,  4 },
+        {   0x1D,  5 }, {   0x27,  6 }, {  0x1CF,  9 }, {    0x4,  4 },
+        {   0x38,  6 }, {    0xE,  6 }, {   0x4C,  7 }, {   0x1F,  7 },
+        {   0x4D,  7 }, {  0x39B, 10 }, {   0x12,  5 }, {   0x72,  7 }
+    },
+    { /* AC bias group 1, table 1 */
+        {    0x9,  5 }, {   0x4B,  7 }, {   0x90,  8 }, {   0x91,  8 },
+        {  0x745, 11 }, { 0x1D11, 13 }, { 0x1D10, 13 }, {   0x19,  5 },
+        {  0xE89, 12 }, {    0x0,  3 }, {    0xF,  4 }, {    0x8,  4 },
+        {    0x7,  4 }, {    0xD,  4 }, {    0xB,  4 }, {    0x2,  4 },
+        {   0x1C,  5 }, {    0x3,  4 }, {    0xA,  4 }, {    0x5,  4 },
+        {   0x18,  5 }, {   0x10,  6 }, {  0x1D0,  9 }, {    0x6,  4 },
+        {   0x3B,  6 }, {   0x11,  6 }, {   0x4A,  7 }, {   0x49,  7 },
+        {   0xE9,  8 }, {  0x3A3, 10 }, {   0x13,  5 }, {   0x75,  7 }
+    },
+    { /* AC bias group 1, table 2 */
+        {   0x19,  5 }, {   0x74,  7 }, {   0x1D,  8 }, {   0xEA,  8 },
+        {   0x73, 10 }, {  0x1CA, 12 }, {  0x396, 13 }, {   0x1C,  5 },
+        {   0xE4, 11 }, {    0x2,  3 }, {    0x1,  3 }, {    0x7,  4 },
+        {    0x8,  4 }, {    0xD,  4 }, {    0x9,  4 }, {   0x1F,  5 },
+        {   0x18,  5 }, {    0x0,  4 }, {    0x6,  4 }, {   0x1E,  5 },
+        {   0x3B,  6 }, {   0xEB,  8 }, {  0x397, 13 }, {    0xA,  4 },
+        {    0x2,  5 }, {   0x2C,  6 }, {   0x5B,  7 }, {   0x5A,  7 },
+        {    0xF,  7 }, {   0x38,  9 }, {   0x17,  5 }, {    0x6,  6 }
+    },
+    { /* AC bias group 1, table 3 */
+        {   0x1E,  5 }, {   0x6F,  7 }, {   0xAE,  8 }, {   0xAF,  8 },
+        {  0x187, 10 }, {  0x61B, 12 }, {  0xC35, 13 }, {   0x1A,  5 },
+        {  0x30C, 11 }, {    0x2,  3 }, {    0x1,  3 }, {    0x7,  4 },
+        {    0x8,  4 }, {    0xE,  4 }, {    0x9,  4 }, {   0x1F,  5 },
+        {   0x14,  5 }, {    0x0,  4 }, {    0x1,  4 }, {   0x19,  5 },
+        {   0x2A,  6 }, {   0x60,  8 }, {  0xC34, 13 }, {    0xB,  4 },
+        {    0xD,  5 }, {   0x36,  6 }, {   0x6E,  7 }, {   0x56,  7 },
+        {   0x31,  7 }, {   0xC2,  9 }, {   0x18,  5 }, {   0x19,  6 }
+    },
+    { /* AC bias group 1, table 4 */
+        {    0x1,  4 }, {   0x2C,  6 }, {    0x5,  7 }, {   0x15,  7 },
+        {    0x8,  8 }, {   0x97, 12 }, {  0x12D, 13 }, {   0x17,  5 },
+        {   0x4A, 11 }, {    0x3,  3 }, {    0x2,  3 }, {    0x9,  4 },
+        {    0xA,  4 }, {    0xE,  4 }, {    0x8,  4 }, {   0x1F,  5 },
+        {    0x7,  5 }, {   0x1E,  5 }, {   0x1B,  5 }, {    0x4,  5 },
+        {   0x5A,  7 }, {   0x24, 10 }, {  0x12C, 13 }, {    0xC,  4 },
+        {    0x6,  5 }, {    0x0,  5 }, {    0x3,  6 }, {   0x5B,  7 },
+        {   0x14,  7 }, {   0x13,  9 }, {   0x1A,  5 }, {    0xB,  6 }
+    },
+    { /* AC bias group 1, table 5 */
+        {    0x4,  4 }, {    0x0,  5 }, {   0x17,  7 }, {   0x63,  7 },
+        {  0x18B,  9 }, {  0x310, 10 }, {  0xC44, 12 }, {   0x19,  5 },
+        {  0x623, 11 }, {    0x4,  3 }, {    0x3,  3 }, {    0xA,  4 },
+        {    0xB,  4 }, {    0xD,  4 }, {    0x3,  4 }, {   0x1C,  5 },
+        {    0x3,  5 }, {    0xA,  5 }, {    0x4,  5 }, {    0x3,  6 },
+        {  0x18A,  9 }, { 0x188B, 13 }, { 0x188A, 13 }, {    0xF,  4 },
+        {    0xB,  5 }, {    0x2,  5 }, {    0xA,  6 }, {    0x2,  6 },
+        {   0x16,  7 }, {  0x189,  9 }, {   0x1D,  5 }, {   0x30,  6 }
+    },
+    { /* AC bias group 1, table 6 */
+        {    0xD,  4 }, {    0x3,  5 }, {   0x77,  7 }, {    0xD,  6 },
+        {   0x82,  8 }, {  0x20D, 10 }, {  0x830, 12 }, {   0x19,  5 },
+        {  0x419, 11 }, {    0x3,  3 }, {    0x2,  3 }, {    0xA,  4 },
+        {    0x9,  4 }, {    0xB,  4 }, {    0x2,  4 }, {   0x11,  5 },
+        {   0x39,  6 }, {    0x2,  5 }, {   0x21,  6 }, {   0x40,  7 },
+        { 0x1063, 13 }, { 0x20C5, 14 }, { 0x20C4, 14 }, {    0xF,  4 },
+        {   0x18,  5 }, {    0x7,  5 }, {   0x38,  6 }, {    0xC,  6 },
+        {   0x76,  7 }, {  0x107,  9 }, {    0x0,  4 }, {   0x3A,  6 }
+    },
+    { /* AC bias group 1, table 7 */
+        {    0xF,  4 }, {   0x1C,  5 }, {   0x36,  6 }, {    0x8,  5 },
+        {   0x61,  7 }, {   0x91,  8 }, {  0x243, 10 }, {    0x9,  5 },
+        {  0x120,  9 }, {    0x5,  3 }, {    0x3,  3 }, {    0x8,  4 },
+        {    0x5,  4 }, {    0x1,  4 }, {   0x13,  5 }, {   0x31,  6 },
+        {   0x76,  7 }, {   0x60,  7 }, {   0x93,  8 }, {  0x909, 12 },
+        {  0x908, 12 }, {  0x90B, 12 }, {  0x90A, 12 }, {    0x1,  3 },
+        {   0x1A,  5 }, {   0x19,  5 }, {   0x3A,  6 }, {   0x25,  6 },
+        {   0x77,  7 }, {   0x92,  8 }, {    0x0,  4 }, {   0x37,  6 }
+    },
+    { /* AC bias group 1, table 8 */
+        {   0x1F,  5 }, {   0x79,  7 }, {   0xF1,  8 }, {   0xF0,  8 },
+        {  0x11B, 10 }, {  0x469, 12 }, {  0x468, 12 }, {   0x3B,  6 },
+        {   0x22,  7 }, {    0x5,  3 }, {    0x4,  3 }, {    0x7,  4 },
+        {    0x5,  4 }, {    0x6,  4 }, {   0x1C,  5 }, {    0x1,  5 },
+        {   0x35,  6 }, {   0x3D,  6 }, {   0x3A,  6 }, {   0x10,  6 },
+        {   0x47,  8 }, {   0x8C,  9 }, {  0x235, 11 }, {    0x1,  3 },
+        {    0x1,  4 }, {   0x19,  5 }, {    0x0,  5 }, {   0x30,  6 },
+        {    0x9,  5 }, {   0x31,  6 }, {   0x1B,  5 }, {   0x34,  6 }
+    },
+    { /* AC bias group 1, table 9 */
+        {    0x3,  4 }, {   0x1B,  6 }, {   0xF3,  8 }, {   0xFD,  8 },
+        {  0x3C9, 10 }, {  0xF20, 12 }, { 0x1E42, 13 }, {   0x3D,  6 },
+        {   0xFC,  8 }, {    0x6,  3 }, {    0x4,  3 }, {    0x2,  4 },
+        {    0x0,  4 }, {    0x1,  4 }, {   0x17,  5 }, {   0x3E,  6 },
+        {   0x1A,  6 }, {   0x39,  6 }, {   0x2B,  6 }, {   0x78,  7 },
+        {  0x1E5,  9 }, {  0x791, 11 }, { 0x1E43, 13 }, {    0x2,  3 },
+        {    0x7,  4 }, {   0x1D,  5 }, {    0xC,  5 }, {   0x38,  6 },
+        {   0x14,  5 }, {   0x7F,  7 }, {   0x16,  5 }, {   0x2A,  6 }
+    },
+    { /* AC bias group 1, table 10 */
+        {    0x7,  4 }, {   0x39,  6 }, {   0x51,  7 }, {   0x78,  7 },
+        {  0x3CB, 10 }, {  0xF29, 12 }, { 0x1E51, 13 }, {   0x3D,  6 },
+        {   0xF3,  8 }, {    0x6,  3 }, {    0x4,  3 }, {    0x2,  4 },
+        {    0x0,  4 }, {    0x1,  4 }, {   0x17,  5 }, {   0x3E,  6 },
+        {   0x7F,  7 }, {   0x2B,  6 }, {   0x7E,  7 }, {   0x50,  7 },
+        {  0x1E4,  9 }, {  0x795, 11 }, { 0x1E50, 13 }, {    0x2,  3 },
+        {    0x6,  4 }, {   0x1D,  5 }, {    0x6,  5 }, {   0x38,  6 },
+        {    0x7,  5 }, {   0x29,  6 }, {   0x16,  5 }, {   0x2A,  6 }
+    },
+    { /* AC bias group 1, table 11 */
+        {    0x8,  4 }, {   0x3B,  6 }, {   0x1D,  7 }, {   0x72,  7 },
+        {  0x1CC,  9 }, {  0x734, 11 }, { 0x1CD5, 13 }, {   0x3A,  6 },
+        {   0x1C,  7 }, {    0x6,  3 }, {    0x5,  3 }, {    0x2,  4 },
+        {    0x1,  4 }, {    0x0,  4 }, {   0x12,  5 }, {   0x3E,  6 },
+        {   0x7F,  7 }, {   0x1E,  6 }, {   0x7E,  7 }, {   0xE7,  8 },
+        {  0x39B, 10 }, {  0xE6B, 12 }, { 0x1CD4, 13 }, {    0x2,  3 },
+        {    0x6,  4 }, {   0x1E,  5 }, {    0xE,  5 }, {   0x38,  6 },
+        {    0x6,  5 }, {    0xF,  6 }, {   0x13,  5 }, {   0x1F,  6 }
+    },
+    { /* AC bias group 1, table 12 */
+        {    0xD,  4 }, {   0x3F,  6 }, {   0x73,  7 }, {    0xC,  6 },
+        {   0xE4,  8 }, {  0x72B, 11 }, {  0xE54, 12 }, {   0x3A,  6 },
+        {   0x1A,  7 }, {    0x5,  3 }, {    0x4,  3 }, {    0x2,  4 },
+        {    0x1,  4 }, {    0x0,  4 }, {    0x7,  5 }, {   0x38,  6 },
+        {   0x76,  7 }, {   0x77,  7 }, {   0x1B,  7 }, {  0x1CB,  9 },
+        {  0x394, 10 }, { 0x1CAB, 13 }, { 0x1CAA, 13 }, {    0x2,  3 },
+        {    0x6,  4 }, {   0x1E,  5 }, {    0xE,  5 }, {   0x3E,  6 },
+        {   0x19,  5 }, {   0x1F,  6 }, {   0x18,  5 }, {   0x1E,  6 }
+    },
+    { /* AC bias group 1, table 13 */
+        {    0xE,  4 }, {    0x7,  5 }, {    0xC,  6 }, {   0x1C,  6 },
+        {   0xBD,  8 }, {  0x2F3, 10 }, {  0xBC9, 12 }, {   0x1F,  6 },
+        {   0xBF,  8 }, {    0x6,  3 }, {    0x4,  3 }, {    0x2,  4 },
+        {    0x1,  4 }, {   0x1E,  5 }, {    0x1,  5 }, {    0xD,  6 },
+        {   0x3A,  7 }, {   0x3B,  7 }, {   0xBE,  8 }, {  0x178,  9 },
+        {  0x5E5, 11 }, { 0x1791, 13 }, { 0x1790, 13 }, {    0x2,  3 },
+        {    0x6,  4 }, {   0x1F,  5 }, {   0x16,  5 }, {    0x0,  5 },
+        {   0x15,  5 }, {   0x2E,  6 }, {   0x14,  5 }, {   0x1E,  6 }
+    },
+    { /* AC bias group 1, table 14 */
+        {    0x0,  3 }, {   0x1B,  5 }, {   0x31,  6 }, {   0x3A,  6 },
+        {   0x60,  7 }, {   0x6F,  9 }, {  0x1B9, 11 }, {    0xE,  6 },
+        {   0x1A,  7 }, {    0x5,  3 }, {    0x3,  3 }, {    0x2,  4 },
+        {   0x1F,  5 }, {   0x1A,  5 }, {   0x39,  6 }, {    0xC,  6 },
+        {   0xC3,  8 }, {   0xC2,  8 }, {   0x36,  8 }, {   0xDD, 10 },
+        {  0x370, 12 }, {  0x6E3, 13 }, {  0x6E2, 13 }, {    0x2,  3 },
+        {    0x8,  4 }, {   0x1E,  5 }, {   0x19,  5 }, {   0x3B,  6 },
+        {   0x12,  5 }, {    0xF,  6 }, {   0x13,  5 }, {   0x38,  6 }
+    },
+    { /* AC bias group 1, table 15 */
+        {    0x2,  3 }, {    0x0,  4 }, {    0x3,  5 }, {   0x1C,  5 },
+        {   0x32,  6 }, {   0x1C,  7 }, {  0x199,  9 }, {    0x4,  6 },
+        {   0xCD,  8 }, {    0x4,  3 }, {    0x3,  3 }, {   0x1B,  5 },
+        {   0x1A,  5 }, {   0x3D,  6 }, {   0x67,  7 }, {   0x3B,  8 },
+        {  0x198,  9 }, {   0x75,  9 }, {   0xE9, 10 }, {  0x3A1, 12 },
+        {  0x3A0, 12 }, {  0x3A3, 12 }, {  0x3A2, 12 }, {    0x5,  3 },
+        {    0x2,  4 }, {   0x1F,  5 }, {   0x1D,  5 }, {   0x3C,  6 },
+        {   0x18,  5 }, {    0xF,  6 }, {    0x6,  5 }, {    0x5,  6 }
+    }
+};
+
+static const uint16_t vp4_ac_bias_1[16][32][2] = {
+    { /* AC bias group 2, table 0 */
+        {    0x4,  5 }, {   0xF5,  8 }, {  0x182,  9 }, {  0x60F, 11 },
+        { 0x1839, 13 }, { 0x1838, 13 }, { 0x183B, 13 }, {   0x13,  5 },
+        {   0xC0,  8 }, {    0x3,  3 }, {    0x2,  3 }, {    0xB,  4 },
+        {    0xA,  4 }, {    0xE,  4 }, {    0x8,  4 }, {    0x1,  4 },
+        {   0x12,  5 }, {   0x1F,  5 }, {    0x0,  4 }, {    0x6,  5 },
+        {   0x7B,  7 }, {  0x306, 10 }, { 0x183A, 13 }, {    0xD,  4 },
+        {    0x7,  5 }, {   0x31,  6 }, {    0xA,  6 }, {   0x61,  7 },
+        {   0x3C,  6 }, {   0xF4,  8 }, {   0x19,  5 }, {    0xB,  6 }
+    },
+    { /* AC bias group 2, table 1 */
+        {    0xA,  5 }, {   0x1A,  7 }, {  0x1D8,  9 }, {  0x3B3, 10 },
+        {  0xECA, 12 }, { 0x1D96, 13 }, { 0x3B2F, 14 }, {   0x14,  5 },
+        {   0x36,  8 }, {    0x4,  3 }, {    0x3,  3 }, {    0xC,  4 },
+        {    0xB,  4 }, {    0x0,  3 }, {    0x4,  4 }, {   0x1C,  5 },
+        {    0x5,  5 }, {   0x15,  5 }, {    0x7,  5 }, {   0x17,  6 },
+        {   0x37,  8 }, {  0x764, 11 }, { 0x3B2E, 14 }, {    0xF,  4 },
+        {   0x1A,  5 }, {   0x3A,  6 }, {    0xC,  6 }, {   0x77,  7 },
+        {    0x4,  5 }, {   0xED,  8 }, {   0x1B,  5 }, {   0x16,  6 }
+    },
+    { /* AC bias group 2, table 2 */
+        {   0x1A,  5 }, {   0x2D,  7 }, {   0x58,  8 }, {  0x1F4,  9 },
+        {  0x7D4, 11 }, { 0x1F55, 13 }, { 0x1F54, 13 }, {   0x14,  5 },
+        {   0x59,  8 }, {    0x4,  3 }, {    0x3,  3 }, {    0xB,  4 },
+        {    0xC,  4 }, {    0xE,  4 }, {    0x4,  4 }, {   0x15,  5 },
+        {    0x5,  5 }, {    0x7,  5 }, {    0x4,  5 }, {   0x7C,  7 },
+        {  0x3EB, 10 }, { 0x1F57, 13 }, { 0x1F56, 13 }, {    0x0,  3 },
+        {   0x1B,  5 }, {   0x3F,  6 }, {    0xD,  6 }, {    0xC,  6 },
+        {    0xA,  5 }, {   0xFB,  8 }, {   0x1E,  5 }, {   0x17,  6 }
+    },
+    { /* AC bias group 2, table 3 */
+        {    0x0,  4 }, {   0x75,  7 }, {   0x4A,  8 }, {   0x97,  9 },
+        {  0x25B, 11 }, {  0x969, 13 }, {  0x968, 13 }, {    0xB,  5 },
+        {   0xE8,  8 }, {    0x5,  3 }, {    0x4,  3 }, {    0x7,  4 },
+        {    0xC,  4 }, {    0xD,  4 }, {    0x1,  4 }, {    0xA,  5 },
+        {   0x39,  6 }, {   0x3B,  6 }, {   0x18,  6 }, {   0xE9,  8 },
+        {  0x12C, 10 }, {  0x96B, 13 }, {  0x96A, 13 }, {    0x1,  3 },
+        {   0x1F,  5 }, {    0x8,  5 }, {   0x19,  6 }, {   0x13,  6 },
+        {    0xD,  5 }, {   0x24,  7 }, {   0x1E,  5 }, {   0x38,  6 }
+    },
+    { /* AC bias group 2, table 4 */
+        {    0x4,  4 }, {   0x14,  6 }, {   0x6E,  8 }, {   0x57,  8 },
+        {  0x159, 10 }, {  0x562, 12 }, {  0xAC7, 13 }, {    0xB,  5 },
+        {   0x6F,  8 }, {    0x6,  3 }, {    0x5,  3 }, {    0x8,  4 },
+        {    0x9,  4 }, {    0x7,  4 }, {   0x1E,  5 }, {    0x2,  5 },
+        {    0x7,  6 }, {    0x6,  6 }, {   0x2A,  7 }, {   0xAD,  9 },
+        {  0xAC6, 13 }, {  0x561, 12 }, {  0x560, 12 }, {    0x1,  3 },
+        {   0x1F,  5 }, {    0xC,  5 }, {   0x39,  6 }, {   0x1A,  6 },
+        {    0x0,  4 }, {   0x36,  7 }, {   0x1D,  5 }, {   0x38,  6 }
+    },
+    { /* AC bias group 2, table 5 */
+        {    0x7,  4 }, {   0x1B,  6 }, {    0xE,  7 }, {    0xD,  7 },
+        {  0x3E1, 10 }, { 0x1F06, 13 }, { 0x3E0F, 14 }, {    0x2,  5 },
+        {   0xF9,  8 }, {    0x5,  3 }, {    0x6,  3 }, {    0x8,  4 },
+        {    0x9,  4 }, {    0x4,  4 }, {    0xC,  5 }, {   0x1A,  6 },
+        {    0xF,  7 }, {    0xC,  7 }, {  0x1F1,  9 }, {  0x7C0, 11 },
+        { 0x3E0E, 14 }, { 0x1F05, 13 }, { 0x1F04, 13 }, {    0x1,  3 },
+        {    0x0,  4 }, {   0x1C,  5 }, {   0x3F,  6 }, {   0x3D,  6 },
+        {    0x5,  4 }, {   0x7D,  7 }, {   0x1D,  5 }, {   0x3C,  6 }
+    },
+    { /* AC bias group 2, table 6 */
+        {    0xF,  4 }, {    0xA,  5 }, {   0x71,  7 }, {    0x6,  6 },
+        {  0x1C2,  9 }, {  0x702, 11 }, { 0x1C0E, 13 }, {    0x2,  5 },
+        {    0xE,  7 }, {    0x5,  3 }, {    0x4,  3 }, {    0x6,  4 },
+        {    0x7,  4 }, {   0x1D,  5 }, {   0x17,  6 }, {    0xF,  7 },
+        {  0x1C3,  9 }, {  0x1C1,  9 }, {  0x380, 10 }, { 0x381F, 14 },
+        { 0x381E, 14 }, { 0x1C0D, 13 }, { 0x1C0C, 13 }, {    0x1,  3 },
+        {    0x4,  4 }, {   0x18,  5 }, {    0x1,  5 }, {    0x0,  5 },
+        {    0xD,  4 }, {   0x16,  6 }, {   0x19,  5 }, {   0x39,  6 }
+    },
+    { /* AC bias group 2, table 7 */
+        {    0x2,  3 }, {   0x1E,  5 }, {   0x3B,  6 }, {    0xD,  5 },
+        {   0x61,  7 }, {  0x1FA,  9 }, { 0x1FB5, 13 }, {   0x31,  6 },
+        {   0xFC,  8 }, {    0x4,  3 }, {    0x5,  3 }, {    0x1,  4 },
+        {    0x7,  4 }, {   0x3A,  6 }, {   0x60,  7 }, {  0x3F7, 10 },
+        {  0x7EC, 11 }, { 0x1FB7, 13 }, { 0x3F6C, 14 }, { 0x7EDB, 15 },
+        { 0x7EDA, 15 }, { 0x3F69, 14 }, { 0x3F68, 14 }, {    0x1,  3 },
+        {    0x0,  4 }, {   0x19,  5 }, {   0x3E,  6 }, {   0x39,  6 },
+        {    0xD,  4 }, {   0x38,  6 }, {    0xC,  5 }, {   0x7F,  7 }
+    },
+    { /* AC bias group 2, table 8 */
+        {   0x1E,  5 }, {   0x70,  7 }, {  0x127,  9 }, {  0x126,  9 },
+        {  0x492, 11 }, { 0x124D, 13 }, { 0x124C, 13 }, {    0x1,  5 },
+        {   0x7F,  7 }, {    0x6,  3 }, {    0x5,  3 }, {    0x5,  4 },
+        {    0x4,  4 }, {    0x1,  4 }, {    0x7,  5 }, {   0x25,  6 },
+        {   0x71,  7 }, {   0x7E,  7 }, {   0x48,  7 }, {  0x125,  9 },
+        {  0x248, 10 }, { 0x124F, 13 }, { 0x124E, 13 }, {    0x3,  3 },
+        {    0x8,  4 }, {   0x1D,  5 }, {    0x6,  5 }, {   0x3E,  6 },
+        {    0x2,  4 }, {    0x0,  5 }, {   0x13,  5 }, {   0x39,  6 }
+    },
+    { /* AC bias group 2, table 9 */
+        {    0x1,  4 }, {    0x1,  6 }, {   0xE7,  8 }, {   0x91,  8 },
+        {  0x240, 10 }, { 0x120D, 13 }, { 0x120C, 13 }, {   0x3C,  6 },
+        {    0x0,  6 }, {    0x6,  3 }, {    0x5,  3 }, {    0x5,  4 },
+        {    0x4,  4 }, {   0x1F,  5 }, {    0x4,  5 }, {   0x25,  6 },
+        {   0x72,  7 }, {   0x49,  7 }, {   0xE6,  8 }, {  0x121,  9 },
+        {  0x482, 11 }, { 0x120F, 13 }, { 0x120E, 13 }, {    0x3,  3 },
+        {    0x8,  4 }, {   0x1D,  5 }, {    0x5,  5 }, {   0x3D,  6 },
+        {    0x3,  4 }, {    0x1,  5 }, {   0x13,  5 }, {   0x38,  6 }
+    },
+    { /* AC bias group 2, table 10 */
+        {    0x4,  4 }, {    0xF,  6 }, {   0xF4,  8 }, {   0x5B,  8 },
+        {  0x2D3, 11 }, {  0xB4A, 13 }, { 0x1697, 14 }, {   0x3C,  6 },
+        {    0xE,  6 }, {    0x6,  3 }, {    0x5,  3 }, {    0x2,  4 },
+        {    0x1,  4 }, {   0x1D,  5 }, {    0x0,  5 }, {   0x7B,  7 },
+        {   0x2C,  7 }, {   0xF5,  8 }, {   0xB5,  9 }, {  0x168, 10 },
+        { 0x1696, 14 }, {  0xB49, 13 }, {  0xB48, 13 }, {    0x3,  3 },
+        {    0x9,  4 }, {   0x1F,  5 }, {    0xA,  5 }, {    0x1,  5 },
+        {    0x8,  4 }, {    0x6,  5 }, {   0x1C,  5 }, {   0x17,  6 }
+    },
+    { /* AC bias group 2, table 11 */
+        {    0x8,  4 }, {   0x39,  6 }, {   0x1A,  7 }, {    0x3,  7 },
+        {   0xDB, 10 }, {  0x6D6, 13 }, {  0xDAF, 14 }, {   0x3C,  6 },
+        {    0xC,  6 }, {    0x6,  3 }, {    0x5,  3 }, {    0x2,  4 },
+        {    0x1,  4 }, {   0x1D,  5 }, {   0x3D,  6 }, {    0x0,  6 },
+        {    0x2,  7 }, {   0x37,  8 }, {   0x6C,  9 }, {  0x1B4, 11 },
+        {  0xDAE, 14 }, {  0x6D5, 13 }, {  0x6D4, 13 }, {    0x2,  3 },
+        {    0x7,  4 }, {   0x1F,  5 }, {    0x7,  5 }, {    0x1,  5 },
+        {    0x9,  4 }, {    0xD,  5 }, {    0xC,  5 }, {   0x38,  6 }
+    },
+    { /* AC bias group 2, table 12 */
+        {    0xF,  4 }, {    0x4,  5 }, {   0x2F,  7 }, {   0x2E,  7 },
+        {   0x54,  9 }, {  0x555, 13 }, {  0x554, 13 }, {   0x16,  6 },
+        {    0xE,  6 }, {    0x6,  3 }, {    0x5,  3 }, {    0x1,  4 },
+        {    0x0,  4 }, {    0x9,  5 }, {    0xB,  6 }, {   0x14,  7 },
+        {   0x57,  9 }, {   0x56,  9 }, {   0xAB, 10 }, {  0x557, 13 },
+        {  0x556, 13 }, {  0x2A9, 12 }, {  0x2A8, 12 }, {    0x3,  3 },
+        {    0x8,  4 }, {   0x13,  5 }, {    0xA,  5 }, {    0x8,  5 },
+        {    0xE,  4 }, {   0x12,  5 }, {    0x6,  5 }, {    0xF,  6 }
+    },
+    { /* AC bias group 2, table 13 */
+        {    0x1,  3 }, {    0xE,  5 }, {    0x6,  6 }, {    0x4,  6 },
+        {   0xDA,  9 }, {  0xDBE, 13 }, { 0x1B7E, 14 }, {    0x7,  6 },
+        {   0x1A,  6 }, {    0x5,  3 }, {    0x4,  3 }, {   0x1C,  5 },
+        {   0x1B,  5 }, {   0x3A,  6 }, {   0x37,  7 }, {   0x6C,  8 },
+        {  0x1B6, 10 }, {  0x36E, 11 }, {  0xDBD, 13 }, { 0x36FF, 15 },
+        { 0x36FE, 15 }, { 0x1B79, 14 }, { 0x1B78, 14 }, {    0x2,  3 },
+        {    0xC,  4 }, {    0x0,  4 }, {    0xF,  5 }, {    0xC,  5 },
+        {    0xF,  4 }, {   0x1A,  5 }, {   0x3B,  6 }, {    0x5,  6 }
+    },
+    { /* AC bias group 2, table 14 */
+        {    0x5,  3 }, {   0x1E,  5 }, {   0x3A,  6 }, {   0x3E,  6 },
+        {   0xFC,  8 }, {  0xFD7, 12 }, { 0x3F55, 14 }, {   0x77,  7 },
+        {   0x30,  6 }, {    0x3,  3 }, {    0x4,  3 }, {   0x1A,  5 },
+        {   0x19,  5 }, {   0x7F,  7 }, {  0x1FB,  9 }, {  0x3F4, 10 },
+        {  0xFD6, 12 }, { 0x1FA9, 13 }, { 0x3F54, 14 }, { 0x3F57, 14 },
+        { 0x3F56, 14 }, { 0x3F51, 14 }, { 0x3F50, 14 }, {    0x1,  3 },
+        {    0x4,  4 }, {   0x1C,  5 }, {    0xB,  5 }, {    0xA,  5 },
+        {    0x0,  3 }, {   0x1B,  5 }, {   0x31,  6 }, {   0x76,  7 }
+    },
+    { /* AC bias group 2, table 15 */
+        {    0x5,  3 }, {    0xC,  4 }, {   0x1B,  5 }, {    0x8,  4 },
+        {   0x38,  6 }, {   0x15,  8 }, {   0xA3, 11 }, {   0xE6,  8 },
+        {    0x4,  6 }, {    0x1,  3 }, {    0x2,  3 }, {   0x12,  5 },
+        {    0x3,  5 }, {    0xB,  7 }, {   0x29,  9 }, {   0xA0, 11 },
+        {  0x142, 12 }, {  0x287, 13 }, {  0x286, 13 }, {  0x289, 13 },
+        {  0x288, 13 }, {  0x28B, 13 }, {  0x28A, 13 }, {    0xF,  4 },
+        {   0x1D,  5 }, {   0x13,  5 }, {    0x1,  5 }, {    0x0,  5 },
+        {    0x3,  3 }, {   0x1A,  5 }, {   0x72,  7 }, {   0xE7,  8 }
+    }
+};
+
+static const uint16_t vp4_ac_bias_2[16][32][2] = {
+    { /* AC bias group 3, table 0 */
+        {    0x9,  5 }, {   0x15,  7 }, {   0x28,  8 }, {   0x52,  9 },
+        {  0x29A, 12 }, {  0x537, 13 }, {  0x536, 13 }, {    0xA,  5 },
+        {   0x54,  7 }, {    0x4,  3 }, {    0x3,  3 }, {    0xC,  4 },
+        {    0xB,  4 }, {    0xD,  4 }, {    0x3,  4 }, {   0x14,  5 },
+        {   0x3A,  6 }, {    0x4,  5 }, {   0x38,  6 }, {   0x55,  7 },
+        {   0xA7, 10 }, {  0x299, 12 }, {  0x298, 12 }, {    0x0,  3 },
+        {   0x1E,  5 }, {    0x8,  5 }, {   0x2B,  6 }, {    0xB,  6 },
+        {    0xB,  5 }, {   0x3B,  6 }, {   0x1F,  5 }, {   0x39,  6 }
+    },
+    { /* AC bias group 3, table 1 */
+        {   0x1D,  5 }, {   0x2F,  7 }, {    0x2,  8 }, {    0x7,  9 },
+        {   0x19, 11 }, {   0x35, 12 }, {   0x34, 12 }, {    0x9,  5 },
+        {   0x2E,  7 }, {    0x6,  3 }, {    0x5,  3 }, {    0x9,  4 },
+        {    0x8,  4 }, {    0x7,  4 }, {   0x1F,  5 }, {    0x8,  5 },
+        {   0x18,  6 }, {   0x19,  6 }, {    0x1,  6 }, {    0x0,  7 },
+        {   0x18, 11 }, {   0x37, 12 }, {   0x36, 12 }, {    0x1,  3 },
+        {    0x1,  4 }, {    0xA,  5 }, {   0x39,  6 }, {   0x16,  6 },
+        {    0xD,  5 }, {    0x1,  5 }, {   0x1E,  5 }, {   0x38,  6 }
+    },
+    { /* AC bias group 3, table 2 */
+        {    0x1,  4 }, {   0x71,  7 }, {   0xE0,  8 }, {  0x1C3,  9 },
+        {  0x708, 11 }, { 0x1C26, 13 }, { 0x384F, 14 }, {    0x1,  5 },
+        {   0x31,  7 }, {    0x6,  3 }, {    0x5,  3 }, {    0x9,  4 },
+        {    0x8,  4 }, {    0x5,  4 }, {    0xF,  5 }, {   0x39,  6 },
+        {   0x77,  7 }, {   0x76,  7 }, {   0x30,  7 }, {  0x385, 10 },
+        { 0x384E, 14 }, { 0x1C25, 13 }, { 0x1C24, 13 }, {    0x1,  3 },
+        {    0x4,  4 }, {    0xD,  5 }, {    0x0,  5 }, {   0x19,  6 },
+        {   0x1F,  5 }, {    0xE,  5 }, {   0x1E,  5 }, {   0x3A,  6 }
+    },
+    { /* AC bias group 3, table 3 */
+        {    0x6,  4 }, {    0xC,  6 }, {   0xD6,  8 }, {   0x7B,  8 },
+        {  0x1E8, 10 }, {  0x7A4, 12 }, {  0xF4B, 13 }, {   0x36,  6 },
+        {   0x6A,  7 }, {    0x7,  3 }, {    0x5,  3 }, {    0x8,  4 },
+        {    0x9,  4 }, {    0x1,  4 }, {    0x7,  5 }, {    0xD,  6 },
+        {   0x3C,  7 }, {   0xD7,  8 }, {   0xF5,  9 }, {  0x7A7, 12 },
+        {  0xF4A, 13 }, {  0xF4D, 13 }, {  0xF4C, 13 }, {    0x2,  3 },
+        {    0x2,  4 }, {    0xE,  5 }, {   0x37,  6 }, {   0x34,  6 },
+        {    0x0,  4 }, {   0x19,  5 }, {   0x18,  5 }, {   0x1F,  6 }
+    },
+    { /* AC bias group 3, table 4 */
+        {    0xA,  4 }, {   0x27,  6 }, {   0xBF,  8 }, {   0xBE,  8 },
+        {  0x224, 10 }, { 0x225D, 14 }, { 0x225C, 14 }, {   0x26,  6 },
+        {   0x5E,  7 }, {    0x7,  3 }, {    0x6,  3 }, {    0x6,  4 },
+        {    0x7,  4 }, {   0x16,  5 }, {   0x2E,  6 }, {   0x45,  7 },
+        {   0x88,  8 }, {  0x113,  9 }, {  0x44A, 11 }, { 0x225F, 14 },
+        { 0x225E, 14 }, { 0x112D, 13 }, { 0x112C, 13 }, {    0x2,  3 },
+        {    0x2,  4 }, {   0x12,  5 }, {    0x3,  5 }, {    0x2,  5 },
+        {    0x3,  4 }, {    0x0,  4 }, {   0x10,  5 }, {   0x23,  6 }
+    },
+    { /* AC bias group 3, table 5 */
+        {    0xF,  4 }, {    0x6,  5 }, {   0x75,  7 }, {   0x74,  7 },
+        {    0xA,  9 }, {   0xBF, 13 }, {   0xB9, 13 }, {   0x22,  6 },
+        {    0x3,  7 }, {    0x5,  3 }, {    0x6,  3 }, {    0x1,  4 },
+        {    0x2,  4 }, {    0x7,  5 }, {    0x0,  6 }, {    0x4,  8 },
+        {   0x16, 10 }, {   0x5E, 12 }, {   0xB8, 13 }, {   0xBB, 13 },
+        {   0xBA, 13 }, {  0x17D, 14 }, {  0x17C, 14 }, {    0x2,  3 },
+        {    0x6,  4 }, {   0x1C,  5 }, {   0x10,  5 }, {   0x3B,  6 },
+        {    0x9,  4 }, {    0x7,  4 }, {    0x1,  5 }, {   0x23,  6 }
+    },
+    { /* AC bias group 3, table 6 */
+        {    0x1,  3 }, {   0x1C,  5 }, {   0x36,  6 }, {   0x3B,  6 },
+        {   0xEA,  8 }, {  0x75B, 11 }, { 0x1D65, 13 }, {   0x19,  6 },
+        {   0x74,  7 }, {    0x4,  3 }, {    0x5,  3 }, {    0x0,  4 },
+        {    0x1,  4 }, {   0x37,  6 }, {  0x1D7,  9 }, {  0x75A, 11 },
+        { 0x1D64, 13 }, { 0x1D67, 13 }, { 0x1D66, 13 }, { 0x1D61, 13 },
+        { 0x1D60, 13 }, { 0x1D63, 13 }, { 0x1D62, 13 }, {    0x2,  3 },
+        {   0x1F,  5 }, {   0x1A,  5 }, {    0xD,  5 }, {   0x3D,  6 },
+        {    0xC,  4 }, {    0x7,  4 }, {   0x3C,  6 }, {   0x18,  6 }
+    },
+    { /* AC bias group 3, table 7 */
+        {    0x2,  3 }, {    0x1,  4 }, {   0x14,  5 }, {    0x0,  4 },
+        {   0x2F,  6 }, {   0xBB,  8 }, {  0x2E4, 10 }, {   0x7D,  7 },
+        {   0xBA,  8 }, {    0x3,  3 }, {    0x4,  3 }, {   0x16,  5 },
+        {   0x1A,  5 }, {   0xB8,  8 }, { 0x172E, 13 }, { 0x2E5F, 14 },
+        { 0x2E5E, 14 }, { 0x1729, 13 }, { 0x1728, 13 }, { 0x172B, 13 },
+        { 0x172A, 13 }, { 0x172D, 13 }, { 0x172C, 13 }, {    0x1,  3 },
+        {   0x1E,  5 }, {   0x15,  5 }, {   0x1B,  5 }, {   0x3F,  6 },
+        {    0xC,  4 }, {    0xE,  4 }, {   0x7C,  7 }, {  0x173,  9 }
+    },
+    { /* AC bias group 3, table 8 */
+        {    0x3,  4 }, {   0x7B,  7 }, {   0x58,  8 }, {  0x1EA,  9 },
+        { 0x1EB1, 13 }, { 0x1EB0, 13 }, { 0x1EB3, 13 }, {   0x13,  6 },
+        {   0x12,  6 }, {    0x5,  3 }, {    0x6,  3 }, {    0x2,  4 },
+        {    0x1,  4 }, {   0x13,  5 }, {   0x3C,  6 }, {   0x2D,  7 },
+        {   0xF4,  8 }, {   0x59,  8 }, {  0x3D7, 10 }, {  0xF5B, 12 },
+        { 0x1EB2, 13 }, { 0x1EB5, 13 }, { 0x1EB4, 13 }, {    0x3,  3 },
+        {    0xE,  4 }, {   0x1F,  5 }, {   0x12,  5 }, {    0x8,  5 },
+        {    0x8,  4 }, {    0x0,  4 }, {    0xA,  5 }, {   0x17,  6 }
+    },
+    { /* AC bias group 3, table 9 */
+        {    0x8,  4 }, {   0x3C,  6 }, {   0xF5,  8 }, {   0xF4,  8 },
+        { 0x1EF7, 13 }, { 0x3DE9, 14 }, { 0x3DE8, 14 }, {   0x1C,  6 },
+        {    0xD,  6 }, {    0x5,  3 }, {    0x6,  3 }, {    0x1,  4 },
+        {    0x0,  4 }, {    0x7,  5 }, {    0xC,  6 }, {   0xF6,  8 },
+        {  0x1EE,  9 }, {  0x3DF, 10 }, {  0x7BC, 11 }, { 0x3DEB, 14 },
+        { 0x3DEA, 14 }, { 0x3DED, 14 }, { 0x3DEC, 14 }, {    0x2,  3 },
+        {    0x9,  4 }, {   0x1F,  5 }, {    0xF,  5 }, {    0x5,  5 },
+        {    0xE,  4 }, {    0x6,  4 }, {    0x4,  5 }, {   0x1D,  6 }
+    },
+    { /* AC bias group 3, table 10 */
+        {    0x9,  4 }, {   0x39,  6 }, {   0x19,  7 }, {   0x18,  7 },
+        {  0x706, 11 }, { 0x383D, 14 }, { 0x383C, 14 }, {    0xD,  6 },
+        {    0xF,  6 }, {    0x5,  3 }, {    0x6,  3 }, {    0x0,  4 },
+        {   0x1D,  5 }, {    0x3,  5 }, {   0x71,  7 }, {   0xE1,  8 },
+        {  0x1C0,  9 }, {  0x382, 10 }, { 0x1C1D, 13 }, { 0x383F, 14 },
+        { 0x383E, 14 }, { 0x3839, 14 }, { 0x3838, 14 }, {    0x2,  3 },
+        {    0x8,  4 }, {    0x2,  4 }, {    0xD,  5 }, {    0xC,  5 },
+        {    0xF,  4 }, {    0x7,  4 }, {    0x2,  5 }, {    0xE,  6 }
+    },
+    { /* AC bias group 3, table 11 */
+        {    0x0,  3 }, {    0x6,  5 }, {   0x35,  7 }, {   0x34,  7 },
+        {  0x777, 11 }, { 0x1DD4, 13 }, { 0x3BAB, 14 }, {    0xE,  6 },
+        {    0xF,  6 }, {    0x5,  3 }, {    0x4,  3 }, {   0x1C,  5 },
+        {   0x19,  5 }, {   0x3A,  6 }, {   0xEF,  8 }, {  0x1DC,  9 },
+        {  0x776, 11 }, {  0x774, 11 }, { 0x3BAA, 14 }, { 0x3BAD, 14 },
+        { 0x3BAC, 14 }, { 0x3BAF, 14 }, { 0x3BAE, 14 }, {    0x2,  3 },
+        {    0x7,  4 }, {    0x2,  4 }, {   0x18,  5 }, {    0xC,  5 },
+        {    0xF,  4 }, {    0xD,  4 }, {   0x1B,  6 }, {   0x76,  7 }
+    },
+    { /* AC bias group 3, table 12 */
+        {    0x2,  3 }, {   0x11,  5 }, {    0x6,  6 }, {   0x4F,  7 },
+        {  0x130,  9 }, { 0x1319, 13 }, { 0x1318, 13 }, {   0x4E,  7 },
+        {    0x7,  6 }, {    0x6,  3 }, {    0x5,  3 }, {   0x10,  5 },
+        {    0xD,  5 }, {    0x5,  6 }, {   0x99,  8 }, {  0x262, 10 },
+        {  0x98E, 12 }, { 0x131B, 13 }, { 0x131A, 13 }, { 0x263D, 14 },
+        { 0x263C, 14 }, { 0x263F, 14 }, { 0x263E, 14 }, {    0x1,  3 },
+        {    0x7,  4 }, {    0x0,  4 }, {   0x12,  5 }, {    0xC,  5 },
+        {    0xE,  4 }, {    0xF,  4 }, {    0x4,  6 }, {   0x4D,  7 }
+    },
+    { /* AC bias group 3, table 13 */
+        {    0x3,  3 }, {    0x0,  4 }, {    0x2,  5 }, {   0x37,  6 },
+        {  0x1B7,  9 }, {  0xDB5, 12 }, { 0x36DD, 14 }, {   0x6C,  7 },
+        {   0x16,  6 }, {    0x5,  3 }, {    0x4,  3 }, {    0x3,  5 },
+        {    0xA,  5 }, {   0x2E,  7 }, {  0x36C, 10 }, {  0xDB4, 12 },
+        { 0x36DC, 14 }, { 0x36DF, 14 }, { 0x36DE, 14 }, { 0x36D9, 14 },
+        { 0x36D8, 14 }, { 0x36DB, 14 }, { 0x36DA, 14 }, {    0xE,  4 },
+        {    0x4,  4 }, {   0x1A,  5 }, {   0x19,  5 }, {   0x18,  5 },
+        {    0xF,  4 }, {    0x1,  3 }, {   0x2F,  7 }, {   0xDA,  8 }
+    },
+    { /* AC bias group 3, table 14 */
+        {    0x6,  3 }, {    0x6,  4 }, {    0xF,  5 }, {    0x0,  4 },
+        {   0x75,  7 }, {  0x3B8, 10 }, { 0x1DCA, 13 }, {   0x74,  7 },
+        {   0x76,  7 }, {    0x4,  3 }, {    0x5,  3 }, {    0x3,  5 },
+        {    0x2,  5 }, {  0x1DE,  9 }, {  0xEE6, 12 }, { 0x3B97, 14 },
+        { 0x3B96, 14 }, { 0x3B9D, 14 }, { 0x3B9C, 14 }, { 0x3B9F, 14 },
+        { 0x3B9E, 14 }, { 0x1DC9, 13 }, { 0x1DC8, 13 }, {    0x5,  4 },
+        {   0x1C,  5 }, {    0x9,  5 }, {    0xE,  5 }, {    0x8,  5 },
+        {    0xF,  4 }, {    0x1,  3 }, {  0x1DF,  9 }, {  0x1DD,  9 }
+    },
+    { /* AC bias group 3, table 15 */
+        {    0x4,  3 }, {    0xB,  4 }, {   0x1D,  5 }, {    0xC,  4 },
+        {   0x14,  5 }, {   0xE0,  8 }, { 0x3875, 14 }, {  0x386, 10 },
+        {  0x1C2,  9 }, {    0x0,  2 }, {    0x1,  2 }, {   0x71,  7 },
+        {   0x72,  7 }, { 0x1C3F, 13 }, { 0x3874, 14 }, { 0x3877, 14 },
+        { 0x3876, 14 }, { 0x3871, 14 }, { 0x3870, 14 }, { 0x3873, 14 },
+        { 0x3872, 14 }, { 0x3879, 14 }, { 0x3878, 14 }, {   0x3C,  6 },
+        {   0x73,  7 }, {   0x2A,  6 }, {   0x3D,  6 }, {   0x2B,  6 },
+        {   0x1F,  5 }, {    0xD,  4 }, { 0x1C3E, 13 }, { 0x1C3D, 13 }
+    }
+};
+
+static const uint16_t vp4_ac_bias_3[16][32][2] = {
+    { /* AC bias group 4, table 0 */
+        {    0x7,  4 }, {    0xF,  6 }, {   0xBB,  8 }, {   0xBA,  8 },
+        {  0x5CF, 11 }, { 0x173A, 13 }, { 0x2E77, 14 }, {   0x29,  6 },
+        {  0x172,  9 }, {    0x7,  3 }, {    0x6,  3 }, {    0x9,  4 },
+        {    0x8,  4 }, {    0x1,  4 }, {    0x5,  5 }, {    0xD,  6 },
+        {   0x1D,  7 }, {   0x1C,  7 }, {   0xB8,  8 }, {  0x2E6, 10 },
+        { 0x2E76, 14 }, { 0x1739, 13 }, { 0x1738, 13 }, {    0x2,  3 },
+        {    0x6,  4 }, {   0x16,  5 }, {    0x4,  5 }, {   0x28,  6 },
+        {   0x15,  5 }, {    0xC,  6 }, {    0x0,  4 }, {   0x2F,  6 }
+    },
+    { /* AC bias group 4, table 1 */
+        {    0xB,  4 }, {    0x2,  5 }, {   0x54,  7 }, {   0x2F,  7 },
+        {  0x2AC, 10 }, { 0x156B, 13 }, { 0x1568, 13 }, {   0x16,  6 },
+        {  0x154,  9 }, {    0x7,  3 }, {    0x6,  3 }, {    0x4,  4 },
+        {    0x3,  4 }, {   0x13,  5 }, {   0x28,  6 }, {   0x2E,  7 },
+        {  0x157,  9 }, {  0x155,  9 }, {  0x55B, 11 }, { 0x2AD3, 14 },
+        { 0x2AD2, 14 }, { 0x2AD5, 14 }, { 0x2AD4, 14 }, {    0x3,  3 },
+        {    0x8,  4 }, {    0x0,  4 }, {    0xA,  5 }, {    0x3,  5 },
+        {    0x2,  4 }, {   0x2B,  6 }, {   0x12,  5 }, {   0x29,  6 }
+    },
+    { /* AC bias group 4, table 2 */
+        {    0xF,  4 }, {    0x7,  5 }, {    0x1,  6 }, {    0x0,  6 },
+        {  0x1C4,  9 }, {  0x703, 11 }, {  0xE02, 12 }, {   0x11,  6 },
+        {   0xE1,  8 }, {    0x5,  3 }, {    0x6,  3 }, {    0x2,  4 },
+        {    0x1,  4 }, {    0x9,  5 }, {   0x10,  6 }, {   0xE3,  8 },
+        {  0x1C5,  9 }, {  0x1C1,  9 }, {  0x702, 11 }, { 0x1C07, 13 },
+        { 0x1C06, 13 }, {  0xE01, 12 }, {  0xE00, 12 }, {    0x4,  3 },
+        {    0x7,  4 }, {   0x1D,  5 }, {    0xD,  5 }, {    0x1,  5 },
+        {    0x5,  4 }, {    0x6,  5 }, {    0xC,  5 }, {   0x39,  6 }
+    },
+    { /* AC bias group 4, table 3 */
+        {    0x1,  3 }, {   0x1C,  5 }, {   0x11,  6 }, {   0x13,  6 },
+        {   0x42,  8 }, {  0x207, 11 }, {  0x815, 13 }, {   0x75,  7 },
+        {   0x41,  8 }, {    0x5,  3 }, {    0x6,  3 }, {    0x0,  4 },
+        {   0x1F,  5 }, {   0x3B,  6 }, {   0x74,  7 }, {   0x43,  8 },
+        {   0x80,  9 }, {  0x206, 11 }, {  0x814, 13 }, {  0x817, 13 },
+        {  0x816, 13 }, {  0x409, 12 }, {  0x408, 12 }, {    0x3,  3 },
+        {    0x9,  4 }, {   0x1E,  5 }, {   0x11,  5 }, {    0x3,  5 },
+        {    0x5,  4 }, {   0x10,  5 }, {    0x2,  5 }, {   0x12,  6 }
+    },
+    { /* AC bias group 4, table 4 */
+        {    0x1,  3 }, {   0x1F,  5 }, {   0x27,  6 }, {    0x1,  5 },
+        {   0x4B,  8 }, {  0x123, 10 }, {  0x915, 13 }, {    0x0,  6 },
+        {   0x49,  8 }, {    0x5,  3 }, {    0x6,  3 }, {   0x1D,  5 },
+        {   0x1C,  5 }, {   0x13,  6 }, {   0x4A,  8 }, {   0x90,  9 },
+        {  0x914, 13 }, {  0x917, 13 }, {  0x916, 13 }, {  0x911, 13 },
+        {  0x910, 13 }, {  0x913, 13 }, {  0x912, 13 }, {    0x3,  3 },
+        {    0x5,  4 }, {    0x1,  4 }, {   0x12,  5 }, {    0x8,  5 },
+        {    0x8,  4 }, {   0x1E,  5 }, {   0x26,  6 }, {    0x1,  6 }
+    },
+    { /* AC bias group 4, table 5 */
+        {    0x3,  3 }, {    0x1,  4 }, {   0x3F,  6 }, {    0xB,  5 },
+        {   0x4E,  7 }, {  0x132,  9 }, {  0x99A, 12 }, {   0x4F,  7 },
+        {   0x98,  8 }, {    0x6,  3 }, {    0x5,  3 }, {   0x1D,  5 },
+        {   0x1C,  5 }, {   0x7C,  7 }, {  0x267, 10 }, { 0x1331, 13 },
+        { 0x1330, 13 }, { 0x1333, 13 }, { 0x1332, 13 }, { 0x266D, 14 },
+        { 0x266C, 14 }, { 0x266F, 14 }, { 0x266E, 14 }, {    0x1,  3 },
+        {    0x4,  4 }, {   0x1E,  5 }, {   0x12,  5 }, {    0xA,  5 },
+        {    0x8,  4 }, {    0x0,  4 }, {   0x7D,  7 }, {   0x4D,  7 }
+    },
+    { /* AC bias group 4, table 6 */
+        {    0x2,  3 }, {    0x7,  4 }, {   0x15,  5 }, {    0x3,  4 },
+        {    0x4,  5 }, {   0xA7,  8 }, {  0x536, 11 }, {   0x28,  6 },
+        {  0x29A, 10 }, {    0x6,  3 }, {    0x4,  3 }, {   0x1C,  5 },
+        {   0x17,  5 }, {   0xA4,  8 }, { 0x29BE, 14 }, { 0x537F, 15 },
+        { 0x537E, 15 }, { 0x29B9, 14 }, { 0x29B8, 14 }, { 0x29BB, 14 },
+        { 0x29BA, 14 }, { 0x29BD, 14 }, { 0x29BC, 14 }, {    0xF,  4 },
+        {    0x0,  4 }, {    0x5,  5 }, {   0x16,  5 }, {   0x1D,  5 },
+        {    0x6,  4 }, {    0x1,  4 }, {   0xA5,  8 }, {  0x14C,  9 }
+    },
+    { /* AC bias group 4, table 7 */
+        {    0x4,  3 }, {    0x7,  4 }, {   0x1A,  5 }, {    0xC,  4 },
+        {    0x6,  4 }, {   0x29,  6 }, {  0x1BD,  9 }, { 0x1BE3, 13 },
+        { 0x1BE0, 13 }, {    0x0,  2 }, {    0x7,  3 }, {   0x6E,  7 },
+        {  0x1BC,  9 }, { 0x37C3, 14 }, { 0x37C2, 14 }, { 0x37CD, 14 },
+        { 0x37CC, 14 }, { 0x37CF, 14 }, { 0x37CE, 14 }, { 0x37C9, 14 },
+        { 0x37C8, 14 }, { 0x37CB, 14 }, { 0x37CA, 14 }, {   0x15,  5 },
+        {  0x1BF,  9 }, {  0x37D, 10 }, {   0x36,  6 }, {    0x2,  3 },
+        {    0xB,  4 }, {   0x28,  6 }, { 0x37C5, 14 }, { 0x37C4, 14 }
+    },
+    { /* AC bias group 4, table 8 */
+        {    0x1,  3 }, {    0x9,  5 }, {    0x3,  6 }, {    0x2,  6 },
+        {  0x11F, 10 }, {  0x8E9, 13 }, {  0x8E8, 13 }, {   0x2D,  7 },
+        {   0x22,  7 }, {    0x6,  3 }, {    0x7,  3 }, {   0x10,  5 },
+        {   0x11,  5 }, {   0x17,  6 }, {   0x2C,  7 }, {   0x46,  8 },
+        {  0x11E, 10 }, {  0x11C, 10 }, {  0x477, 12 }, {  0x8EB, 13 },
+        {  0x8EA, 13 }, {  0x8ED, 13 }, {  0x8EC, 13 }, {    0x3,  3 },
+        {    0xB,  4 }, {    0x1,  4 }, {   0x14,  5 }, {    0xA,  5 },
+        {    0x9,  4 }, {   0x15,  5 }, {    0x0,  5 }, {   0x10,  6 }
+    },
+    { /* AC bias group 4, table 9 */
+        {    0x1,  3 }, {   0x1D,  5 }, {   0x22,  6 }, {   0x13,  6 },
+        {  0x11E,  9 }, {  0x8FC, 12 }, { 0x23F5, 14 }, {   0x23,  7 },
+        {   0x22,  7 }, {    0x5,  3 }, {    0x6,  3 }, {   0x10,  5 },
+        {    0xB,  5 }, {   0x10,  6 }, {   0x8E,  8 }, {  0x23E, 10 },
+        {  0x8FF, 12 }, { 0x11FD, 13 }, { 0x23F4, 14 }, { 0x23F7, 14 },
+        { 0x23F6, 14 }, { 0x23F9, 14 }, { 0x23F8, 14 }, {    0x3,  3 },
+        {    0x9,  4 }, {    0x0,  4 }, {   0x1C,  5 }, {    0xA,  5 },
+        {    0xF,  4 }, {    0x1,  4 }, {   0x12,  6 }, {   0x46,  7 }
+    },
+    { /* AC bias group 4, table 10 */
+        {    0x3,  3 }, {   0x1F,  5 }, {   0x3C,  6 }, {   0x3D,  6 },
+        {   0x86,  8 }, {  0x877, 12 }, { 0x10E8, 13 }, {   0x41,  7 },
+        {   0x40,  7 }, {    0x5,  3 }, {    0x6,  3 }, {    0x7,  5 },
+        {    0x6,  5 }, {    0x4,  6 }, {  0x10F,  9 }, {  0x21C, 10 },
+        {  0x875, 12 }, { 0x21D3, 14 }, { 0x21D2, 14 }, { 0x21D9, 14 },
+        { 0x21D8, 14 }, { 0x21DB, 14 }, { 0x21DA, 14 }, {    0x2,  3 },
+        {    0x9,  4 }, {    0x0,  4 }, {   0x11,  5 }, {    0x3,  5 },
+        {    0xE,  4 }, {    0x2,  4 }, {    0x5,  6 }, {   0x42,  7 }
+    },
+    { /* AC bias group 4, table 11 */
+        {    0x4,  3 }, {    0x1,  4 }, {   0x3D,  6 }, {    0x9,  5 },
+        {   0xF3,  8 }, {  0x793, 11 }, { 0x1E45, 13 }, {    0x0,  7 },
+        {    0x2,  7 }, {    0x5,  3 }, {    0x6,  3 }, {    0x8,  5 },
+        {    0x1,  5 }, {    0x3,  7 }, {  0x1E5,  9 }, {  0x792, 11 },
+        { 0x1E44, 13 }, { 0x1E47, 13 }, { 0x1E46, 13 }, { 0x1E41, 13 },
+        { 0x1E40, 13 }, { 0x1E43, 13 }, { 0x1E42, 13 }, {    0x1,  3 },
+        {    0x6,  4 }, {   0x1F,  5 }, {    0xF,  5 }, {    0xE,  5 },
+        {    0xE,  4 }, {    0x5,  4 }, {   0x78,  7 }, {    0x1,  7 }
+    },
+    { /* AC bias group 4, table 12 */
+        {    0x4,  3 }, {    0x5,  4 }, {    0xE,  5 }, {   0x17,  5 },
+        {   0x3E,  7 }, {   0xF0,  9 }, {  0xF1E, 13 }, {   0x7A,  8 },
+        {   0x7F,  8 }, {    0x6,  3 }, {    0x7,  3 }, {    0x5,  5 },
+        {    0x4,  5 }, {   0x7B,  8 }, {  0x1E2, 10 }, { 0x1E3F, 14 },
+        { 0x1E3E, 14 }, {  0xF19, 13 }, {  0xF18, 13 }, {  0xF1B, 13 },
+        {  0xF1A, 13 }, {  0xF1D, 13 }, {  0xF1C, 13 }, {    0x0,  3 },
+        {    0x3,  4 }, {   0x16,  5 }, {    0x9,  5 }, {    0x8,  5 },
+        {    0xA,  4 }, {    0x6,  4 }, {   0x7E,  8 }, {   0x79,  8 }
+    },
+    { /* AC bias group 4, table 13 */
+        {    0x5,  3 }, {    0xC,  4 }, {   0x1A,  5 }, {    0x4,  4 },
+        {   0x1A,  6 }, {   0xDE,  9 }, {  0xDF4, 13 }, {   0xDD,  9 },
+        {   0x6D,  8 }, {    0x0,  2 }, {    0x7,  3 }, {   0x25,  6 },
+        {   0x24,  6 }, {   0xDC,  9 }, {  0xDF7, 13 }, { 0x1BEB, 14 },
+        { 0x1BEA, 14 }, {  0xDF1, 13 }, {  0xDF0, 13 }, {  0xDF3, 13 },
+        {  0xDF2, 13 }, { 0x1BED, 14 }, { 0x1BEC, 14 }, {    0x8,  4 },
+        {   0x13,  5 }, {    0xC,  5 }, {   0x37,  6 }, {   0x36,  6 },
+        {    0x5,  4 }, {    0x7,  4 }, {   0x6C,  8 }, {  0x1BF, 10 }
+    },
+    { /* AC bias group 4, table 14 */
+        {    0x5,  3 }, {    0xD,  4 }, {   0x1F,  5 }, {    0xC,  4 },
+        {   0x3B,  6 }, {   0x40,  7 }, {  0x41A, 11 }, {  0x104,  9 },
+        {  0x107,  9 }, {    0x1,  2 }, {    0x0,  2 }, {   0x24,  6 },
+        {   0x21,  6 }, {  0x20B, 10 }, { 0x106E, 13 }, { 0x20DF, 14 },
+        { 0x20DE, 14 }, { 0x1055, 13 }, { 0x1054, 13 }, { 0x1057, 13 },
+        { 0x1056, 13 }, { 0x106D, 13 }, { 0x106C, 13 }, {   0x11,  5 },
+        {   0x3A,  6 }, {   0x25,  6 }, {   0x38,  6 }, {   0x39,  6 },
+        {   0x13,  5 }, {   0x1E,  5 }, {  0x20C, 10 }, {  0x414, 11 }
+    },
+    { /* AC bias group 4, table 15 */
+        {    0x0,  2 }, {    0x7,  4 }, {    0xD,  5 }, {    0x5,  4 },
+        {    0x9,  5 }, {   0x22,  7 }, {  0xCD1, 13 }, {  0xCD0, 13 },
+        {  0xCD3, 13 }, {    0x3,  2 }, {    0x2,  2 }, {   0x8D,  9 },
+        {   0xCC,  9 }, {  0x66B, 12 }, {  0xCD2, 13 }, { 0x19B5, 14 },
+        { 0x19B4, 14 }, { 0x19B7, 14 }, { 0x19B6, 14 }, { 0x19B1, 14 },
+        { 0x19B0, 14 }, { 0x19B3, 14 }, { 0x19B2, 14 }, {   0x47,  8 },
+        {   0x8C,  9 }, {  0x337, 11 }, {   0x67,  8 }, {   0x18,  6 },
+        {   0x10,  6 }, {   0x32,  7 }, {  0xCD5, 13 }, {  0xCD4, 13 }
+    }
+};
+
+#endif /* AVCODEC_VP4DATA_H */
diff --git a/libavcodec/vp5.c b/libavcodec/vp5.c
index cb08cec..f3946f5 100644
--- a/libavcodec/vp5.c
+++ b/libavcodec/vp5.c
@@ -48,6 +48,8 @@
     ff_vp56_init_dequant(s, vp56_rac_gets(c, 6));
     if (s->frames[VP56_FRAME_CURRENT]->key_frame)
     {
+        int render_x, render_y;
+
         vp56_rac_gets(c, 8);
         if(vp56_rac_gets(c, 5) > 5)
             return AVERROR_INVALIDDATA;
@@ -63,8 +65,11 @@
                    cols << 4, rows << 4);
             return AVERROR_INVALIDDATA;
         }
-        vp56_rac_gets(c, 8);  /* number of displayed macroblock rows */
-        vp56_rac_gets(c, 8);  /* number of displayed macroblock cols */
+        render_y = vp56_rac_gets(c, 8);  /* number of displayed macroblock rows */
+        render_x = vp56_rac_gets(c, 8);  /* number of displayed macroblock cols */
+        if (render_x == 0 || render_x > cols ||
+            render_y == 0 || render_y > rows)
+            return AVERROR_INVALIDDATA;
         vp56_rac_gets(c, 2);
         if (!s->macroblocks || /* first frame */
             16*cols != s->avctx->coded_width ||
@@ -183,7 +188,7 @@
     int b, i, cg, idx, ctx, ctx_last;
     int pt = 0;    /* plane type (0 for Y, 1 for U or V) */
 
-    if (c->end <= c->buffer && c->bits >= 0) {
+    if (vpX_rac_is_end(c)) {
         av_log(s->avctx, AV_LOG_ERROR, "End of AC stream reached in vp5_parse_coeff\n");
         return AVERROR_INVALIDDATA;
     }
@@ -252,6 +257,7 @@
             for (i=coeff_idx; i<=ctx_last; i++)
                 s->coeff_ctx[ff_vp56_b6to4[b]][i] = 5;
         s->above_blocks[s->above_block_idx[b]].not_null_dc = s->coeff_ctx[ff_vp56_b6to4[b]][0];
+        s->idct_selector[b] = 63;
     }
     return 0;
 }
diff --git a/libavcodec/vp56.c b/libavcodec/vp56.c
index b69fe6c..695f37e 100644
--- a/libavcodec/vp56.c
+++ b/libavcodec/vp56.c
@@ -33,6 +33,8 @@
 
 void ff_vp56_init_dequant(VP56Context *s, int quantizer)
 {
+    if (s->quantizer != quantizer)
+        ff_vp3dsp_set_bounding_values(s->bounding_values_array, ff_vp56_filter_threshold[quantizer]);
     s->quantizer = quantizer;
     s->dequant_dc = ff_vp56_dc_dequant[quantizer] << 2;
     s->dequant_ac = ff_vp56_ac_dequant[quantizer] << 2;
@@ -196,12 +198,8 @@
     s->macroblocks[row * s->mb_width + col].mv = s->mv[3];
 
     /* chroma vectors are average luma vectors */
-    if (s->avctx->codec->id == AV_CODEC_ID_VP5) {
-        s->mv[4].x = s->mv[5].x = RSHIFT(mv.x,2);
-        s->mv[4].y = s->mv[5].y = RSHIFT(mv.y,2);
-    } else {
-        s->mv[4] = s->mv[5] = (VP56mv) {mv.x/4, mv.y/4};
-    }
+    s->mv[4].x = s->mv[5].x = RSHIFT(mv.x,2);
+    s->mv[4].y = s->mv[5].y = RSHIFT(mv.y,2);
 }
 
 static VP56mb vp56_decode_mv(VP56Context *s, int row, int col)
@@ -324,9 +322,17 @@
 static void vp56_deblock_filter(VP56Context *s, uint8_t *yuv,
                                 ptrdiff_t stride, int dx, int dy)
 {
+    if (s->avctx->codec->id == AV_CODEC_ID_VP5) {
     int t = ff_vp56_filter_threshold[s->quantizer];
     if (dx)  s->vp56dsp.edge_filter_hor(yuv +         10-dx , stride, t);
     if (dy)  s->vp56dsp.edge_filter_ver(yuv + stride*(10-dy), stride, t);
+    } else {
+        int * bounding_values = s->bounding_values_array + 127;
+        if (dx)
+            ff_vp3dsp_h_loop_filter_12(yuv +         10-dx, stride, bounding_values);
+        if (dy)
+            ff_vp3dsp_v_loop_filter_12(yuv + stride*(10-dy), stride, bounding_values);
+    }
 }
 
 static void vp56_mc(VP56Context *s, int b, int plane, uint8_t *src,
@@ -400,6 +406,24 @@
     }
 }
 
+static void vp56_idct_put(VP56Context *s, uint8_t * dest, ptrdiff_t stride, int16_t *block, int selector)
+{
+    if (selector > 10 || selector == 1)
+        s->vp3dsp.idct_put(dest, stride, block);
+    else
+        ff_vp3dsp_idct10_put(dest, stride, block);
+}
+
+static void vp56_idct_add(VP56Context *s, uint8_t * dest, ptrdiff_t stride, int16_t *block, int selector)
+{
+    if (selector > 10)
+        s->vp3dsp.idct_add(dest, stride, block);
+    else if (selector > 1)
+        ff_vp3dsp_idct10_add(dest, stride, block);
+    else
+        s->vp3dsp.idct_dc_add(dest, stride, block);
+}
+
 static av_always_inline void vp56_render_mb(VP56Context *s, int row, int col, int is_alpha, VP56mb mb_type)
 {
     int b, ab, b_max, plane, off;
@@ -420,8 +444,8 @@
         case VP56_MB_INTRA:
             for (b=0; b<b_max; b++) {
                 plane = ff_vp56_b2p[b+ab];
-                s->vp3dsp.idct_put(frame_current->data[plane] + s->block_offset[b],
-                                s->stride[plane], s->block_coeff[b]);
+                vp56_idct_put(s, frame_current->data[plane] + s->block_offset[b],
+                                s->stride[plane], s->block_coeff[b], s->idct_selector[b]);
             }
             break;
 
@@ -433,8 +457,8 @@
                 s->hdsp.put_pixels_tab[1][0](frame_current->data[plane] + off,
                                              frame_ref->data[plane] + off,
                                              s->stride[plane], 8);
-                s->vp3dsp.idct_add(frame_current->data[plane] + off,
-                                s->stride[plane], s->block_coeff[b]);
+                vp56_idct_add(s, frame_current->data[plane] + off,
+                              s->stride[plane], s->block_coeff[b], s->idct_selector[b]);
             }
             break;
 
@@ -451,8 +475,8 @@
                 plane = ff_vp56_b2p[b+ab];
                 vp56_mc(s, b, plane, frame_ref->data[plane], s->stride[plane],
                         16*col+x_off, 16*row+y_off);
-                s->vp3dsp.idct_add(frame_current->data[plane] + s->block_offset[b],
-                                s->stride[plane], s->block_coeff[b]);
+                vp56_idct_add(s, frame_current->data[plane] + s->block_offset[b],
+                              s->stride[plane], s->block_coeff[b], s->idct_selector[b]);
             }
             break;
     }
@@ -548,7 +572,7 @@
     VP56Context *s = avctx->priv_data;
     AVFrame *const p = s->frames[VP56_FRAME_CURRENT];
     int remaining_buf_size = avpkt->size;
-    int av_uninit(alpha_offset);
+    int alpha_offset = remaining_buf_size;
     int i, res;
     int ret;
 
@@ -561,7 +585,7 @@
             return AVERROR_INVALIDDATA;
     }
 
-    res = s->parse_header(s, buf, remaining_buf_size);
+    res = s->parse_header(s, buf, alpha_offset);
     if (res < 0)
         return res;
 
diff --git a/libavcodec/vp56.h b/libavcodec/vp56.h
index b8dda9e..65cf468 100644
--- a/libavcodec/vp56.h
+++ b/libavcodec/vp56.h
@@ -89,6 +89,7 @@
     const uint8_t *buffer;
     const uint8_t *end;
     unsigned int code_word;
+    int end_reached;
 } VP56RangeCoder;
 
 typedef struct VP56RefDc {
@@ -105,6 +106,7 @@
 typedef struct VP56Model {
     uint8_t coeff_reorder[64];       /* used in vp6 only */
     uint8_t coeff_index_to_pos[64];  /* used in vp6 only */
+    uint8_t coeff_index_to_idct_selector[64]; /* used in vp6 only */
     uint8_t vector_sig[2];           /* delta sign */
     uint8_t vector_dct[2];           /* delta coding types */
     uint8_t vector_pdi[2][2];        /* predefined delta init */
@@ -157,6 +159,7 @@
     VP56mb mb_type;
     VP56Macroblock *macroblocks;
     DECLARE_ALIGNED(16, int16_t, block_coeff)[6][64];
+    int idct_selector[6];
 
     /* motion vectors */
     VP56mv mv[6];  /* vectors for each block in MB */
@@ -170,6 +173,7 @@
     int filter_mode;
     int max_vector_length;
     int sample_variance_threshold;
+    DECLARE_ALIGNED(8, int, bounding_values_array)[256];
 
     uint8_t coeff_ctx[4][64];              /* used in vp5 only */
     uint8_t coeff_ctx_last[4];             /* used in vp5 only */
@@ -227,6 +231,16 @@
 extern const uint8_t ff_vp56_norm_shift[256];
 int ff_vp56_init_range_decoder(VP56RangeCoder *c, const uint8_t *buf, int buf_size);
 
+/**
+ * vp5689 returns 1 if the end of the stream has been reached, 0 otherwise.
+ */
+static av_always_inline int vpX_rac_is_end(VP56RangeCoder *c)
+{
+    if (c->end <= c->buffer && c->bits >= 0)
+        c->end_reached ++;
+    return c->end_reached > 10;
+}
+
 static av_always_inline unsigned int vp56_rac_renorm(VP56RangeCoder *c)
 {
     int shift = ff_vp56_norm_shift[c->high];
diff --git a/libavcodec/vp56dsp.c b/libavcodec/vp56dsp.c
index 9f299dc..e8d93d6 100644
--- a/libavcodec/vp56dsp.c
+++ b/libavcodec/vp56dsp.c
@@ -72,27 +72,8 @@
 #endif /* CONFIG_VP5_DECODER */
 
 #if CONFIG_VP6_DECODER
-static int vp6_adjust(int v, int t)
-{
-    int V = v, s = v >> 31;
-    V ^= s;
-    V -= s;
-    if (V-t-1 >= (unsigned)(t-1))
-        return v;
-    V = 2*t - V;
-    V += s;
-    V ^= s;
-    return V;
-}
-
-VP56_EDGE_FILTER(vp6, hor, 1, stride)
-VP56_EDGE_FILTER(vp6, ver, stride, 1)
-
 av_cold void ff_vp6dsp_init(VP56DSPContext *s)
 {
-    s->edge_filter_hor = vp6_edge_filter_hor;
-    s->edge_filter_ver = vp6_edge_filter_ver;
-
     s->vp6_filter_diag4 = ff_vp6_filter_diag4_c;
 
     if (ARCH_ARM)
diff --git a/libavcodec/vp56rac.c b/libavcodec/vp56rac.c
index e70302b..64fb6a9 100644
--- a/libavcodec/vp56rac.c
+++ b/libavcodec/vp56rac.c
@@ -43,6 +43,7 @@
     c->bits = -16;
     c->buffer = buf;
     c->end = buf + buf_size;
+    c->end_reached = 0;
     if (buf_size < 1)
         return AVERROR_INVALIDDATA;
     c->code_word = bytestream_get_be24(&c->buffer);
diff --git a/libavcodec/vp6.c b/libavcodec/vp6.c
index 645fc5c..e5dec19 100644
--- a/libavcodec/vp6.c
+++ b/libavcodec/vp6.c
@@ -194,6 +194,18 @@
         for (pos=1; pos<64; pos++)
             if (s->modelp->coeff_reorder[pos] == i)
                 s->modelp->coeff_index_to_pos[idx++] = pos;
+
+    for (idx = 0; idx < 64; idx++) {
+        int max = 0;
+        for (i = 0; i <= idx; i++) {
+            int v = s->modelp->coeff_index_to_pos[i];
+            if (v > max)
+                max = v;
+        }
+        if (s->sub_version > 6)
+            max++;
+        s->modelp->coeff_index_to_idct_selector[idx] = max;
+    }
 }
 
 static void vp6_default_models_init(VP56Context *s)
@@ -446,6 +458,7 @@
             cg = FFMIN(vp6_coeff_groups[coeff_idx], 3);
             vlc_coeff = &s->ract_vlc[pt][ct][cg];
         }
+        s->idct_selector[b] = model->coeff_index_to_idct_selector[FFMIN(coeff_idx, 63)];
     }
     return 0;
 }
@@ -460,7 +473,7 @@
     int b, i, cg, idx, ctx;
     int pt = 0;    /* plane type (0 for Y, 1 for U or V) */
 
-    if (c->end <= c->buffer && c->bits >= 0) {
+    if (vpX_rac_is_end(c)) {
         av_log(s->avctx, AV_LOG_ERROR, "End of AC stream reached in vp6_parse_coeff\n");
         return AVERROR_INVALIDDATA;
     }
@@ -527,6 +540,7 @@
 
         s->left_block[ff_vp56_b6to4[b]].not_null_dc =
         s->above_blocks[s->above_block_idx[b]].not_null_dc = !!s->block_coeff[b][0];
+        s->idct_selector[b] = model->coeff_index_to_idct_selector[FFMIN(coeff_idx, 63)];
     }
     return 0;
 }
diff --git a/libavcodec/vp8.c b/libavcodec/vp8.c
index a06692c..1794d6d 100644
--- a/libavcodec/vp8.c
+++ b/libavcodec/vp8.c
@@ -501,15 +501,10 @@
     }
 }
 
-static int vp7_fade_frame(VP8Context *s, VP56RangeCoder *c)
+static int vp7_fade_frame(VP8Context *s, int alpha, int beta)
 {
-    int alpha = (int8_t) vp8_rac_get_uint(c, 8);
-    int beta  = (int8_t) vp8_rac_get_uint(c, 8);
     int ret;
 
-    if (c->end <= c->buffer && c->bits >= 0)
-        return AVERROR_INVALIDDATA;
-
     if (!s->keyframe && (alpha || beta)) {
         int width  = s->mb_width * 16;
         int height = s->mb_height * 16;
@@ -549,6 +544,8 @@
     int part1_size, hscale, vscale, i, j, ret;
     int width  = s->avctx->width;
     int height = s->avctx->height;
+    int alpha = 0;
+    int beta  = 0;
 
     if (buf_size < 4) {
         return AVERROR_INVALIDDATA;
@@ -661,12 +658,12 @@
             s->fade_present = vp8_rac_get(c);
     }
 
-    if (c->end <= c->buffer && c->bits >= 0)
+    if (vpX_rac_is_end(c))
         return AVERROR_INVALIDDATA;
     /* E. Fading information for previous frame */
     if (s->fade_present && vp8_rac_get(c)) {
-        if ((ret = vp7_fade_frame(s ,c)) < 0)
-            return ret;
+        alpha = (int8_t) vp8_rac_get_uint(c, 8);
+        beta  = (int8_t) vp8_rac_get_uint(c, 8);
     }
 
     /* F. Loop filter type */
@@ -696,6 +693,12 @@
         vp78_update_pred16x16_pred8x8_mvc_probabilities(s, VP7_MVC_SIZE);
     }
 
+    if (vpX_rac_is_end(c))
+        return AVERROR_INVALIDDATA;
+
+    if ((ret = vp7_fade_frame(s, alpha, beta)) < 0)
+        return ret;
+
     return 0;
 }
 
@@ -2268,7 +2271,7 @@
 
 #define MARGIN (16 << 2)
 static av_always_inline
-void vp78_decode_mv_mb_modes(AVCodecContext *avctx, VP8Frame *curframe,
+int vp78_decode_mv_mb_modes(AVCodecContext *avctx, VP8Frame *curframe,
                                     VP8Frame *prev_frame, int is_vp7)
 {
     VP8Context *s = avctx->priv_data;
@@ -2285,6 +2288,10 @@
 
         s->mv_bounds.mv_min.x = -MARGIN;
         s->mv_bounds.mv_max.x = ((s->mb_width - 1) << 6) + MARGIN;
+
+        if (vpX_rac_is_end(&s->c)) {
+            return AVERROR_INVALIDDATA;
+        }
         for (mb_x = 0; mb_x < s->mb_width; mb_x++, mb_xy++, mb++) {
             if (mb_y == 0)
                 AV_WN32A((mb - s->mb_width - 1)->intra4x4_pred_mode_top,
@@ -2298,18 +2305,19 @@
         s->mv_bounds.mv_min.y -= 64;
         s->mv_bounds.mv_max.y -= 64;
     }
+    return 0;
 }
 
-static void vp7_decode_mv_mb_modes(AVCodecContext *avctx, VP8Frame *cur_frame,
+static int vp7_decode_mv_mb_modes(AVCodecContext *avctx, VP8Frame *cur_frame,
                                    VP8Frame *prev_frame)
 {
-    vp78_decode_mv_mb_modes(avctx, cur_frame, prev_frame, IS_VP7);
+    return vp78_decode_mv_mb_modes(avctx, cur_frame, prev_frame, IS_VP7);
 }
 
-static void vp8_decode_mv_mb_modes(AVCodecContext *avctx, VP8Frame *cur_frame,
+static int vp8_decode_mv_mb_modes(AVCodecContext *avctx, VP8Frame *cur_frame,
                                    VP8Frame *prev_frame)
 {
-    vp78_decode_mv_mb_modes(avctx, cur_frame, prev_frame, IS_VP8);
+    return vp78_decode_mv_mb_modes(avctx, cur_frame, prev_frame, IS_VP8);
 }
 
 #if HAVE_THREADS
@@ -2367,7 +2375,7 @@
         curframe->tf.f->data[2] +  8 * mb_y * s->uvlinesize
     };
 
-    if (c->end <= c->buffer && c->bits >= 0)
+    if (vpX_rac_is_end(c))
          return AVERROR_INVALIDDATA;
 
     if (mb_y == 0)
@@ -2398,7 +2406,7 @@
     td->mv_bounds.mv_max.x = ((s->mb_width - 1) << 6) + MARGIN;
 
     for (mb_x = 0; mb_x < s->mb_width; mb_x++, mb_xy++, mb++) {
-        if (c->end <= c->buffer && c->bits >= 0)
+        if (vpX_rac_is_end(c))
             return AVERROR_INVALIDDATA;
         // Wait for previous thread to read mb_x+2, and reach mb_y-1.
         if (prev_td != td) {
@@ -2707,7 +2715,8 @@
 
     s->next_framep[VP56_FRAME_CURRENT] = curframe;
 
-    ff_thread_finish_setup(avctx);
+    if (avctx->codec->update_thread_context)
+        ff_thread_finish_setup(avctx);
 
     if (avctx->hwaccel) {
         ret = avctx->hwaccel->start_frame(avctx, avpkt->data, avpkt->size);
@@ -2744,9 +2753,11 @@
                 !s->segmentation.update_map)
                 ff_thread_await_progress(&prev_frame->tf, 1, 0);
             if (is_vp7)
-                vp7_decode_mv_mb_modes(avctx, curframe, prev_frame);
+                ret = vp7_decode_mv_mb_modes(avctx, curframe, prev_frame);
             else
-                vp8_decode_mv_mb_modes(avctx, curframe, prev_frame);
+                ret = vp8_decode_mv_mb_modes(avctx, curframe, prev_frame);
+            if (ret < 0)
+                goto err;
         }
 
         if (avctx->active_thread_type == FF_THREAD_FRAME)
@@ -2842,7 +2853,6 @@
     s->vp7   = avctx->codec->id == AV_CODEC_ID_VP7;
     s->pix_fmt = AV_PIX_FMT_NONE;
     avctx->pix_fmt = AV_PIX_FMT_YUV420P;
-    avctx->internal->allocate_progress = 1;
 
     ff_videodsp_init(&s->vdsp, 8);
 
@@ -2884,21 +2894,6 @@
 
 #if CONFIG_VP8_DECODER
 #if HAVE_THREADS
-static av_cold int vp8_decode_init_thread_copy(AVCodecContext *avctx)
-{
-    VP8Context *s = avctx->priv_data;
-    int ret;
-
-    s->avctx = avctx;
-
-    if ((ret = vp8_init_frames(s)) < 0) {
-        ff_vp8_decode_free(avctx);
-        return ret;
-    }
-
-    return 0;
-}
-
 #define REBASE(pic) ((pic) ? (pic) - &s_src->frames[0] + &s->frames[0] : NULL)
 
 static int vp8_decode_update_thread_context(AVCodecContext *dst,
@@ -2966,7 +2961,6 @@
     .capabilities          = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_FRAME_THREADS |
                              AV_CODEC_CAP_SLICE_THREADS,
     .flush                 = vp8_decode_flush,
-    .init_thread_copy      = ONLY_IF_THREADS_ENABLED(vp8_decode_init_thread_copy),
     .update_thread_context = ONLY_IF_THREADS_ENABLED(vp8_decode_update_thread_context),
     .hw_configs            = (const AVCodecHWConfigInternal*[]) {
 #if CONFIG_VP8_VAAPI_HWACCEL
@@ -2977,5 +2971,6 @@
 #endif
                                NULL
                            },
+    .caps_internal         = FF_CODEC_CAP_ALLOCATE_PROGRESS,
 };
 #endif /* CONFIG_VP7_DECODER */
diff --git a/libavcodec/vp8dsp.c b/libavcodec/vp8dsp.c
index fed5c67..4ff63d0 100644
--- a/libavcodec/vp8dsp.c
+++ b/libavcodec/vp8dsp.c
@@ -673,6 +673,8 @@
     VP78_BILINEAR_MC_FUNC(1, 8);
     VP78_BILINEAR_MC_FUNC(2, 4);
 
+    if (ARCH_AARCH64)
+        ff_vp78dsp_init_aarch64(dsp);
     if (ARCH_ARM)
         ff_vp78dsp_init_arm(dsp);
     if (ARCH_PPC)
@@ -733,6 +735,8 @@
     dsp->vp8_v_loop_filter_simple = vp8_v_loop_filter_simple_c;
     dsp->vp8_h_loop_filter_simple = vp8_h_loop_filter_simple_c;
 
+    if (ARCH_AARCH64)
+        ff_vp8dsp_init_aarch64(dsp);
     if (ARCH_ARM)
         ff_vp8dsp_init_arm(dsp);
     if (ARCH_X86)
diff --git a/libavcodec/vp8dsp.h b/libavcodec/vp8dsp.h
index eaae4ae..cfe1524 100644
--- a/libavcodec/vp8dsp.h
+++ b/libavcodec/vp8dsp.h
@@ -91,11 +91,13 @@
 void ff_vp7dsp_init(VP8DSPContext *c);
 
 void ff_vp78dsp_init(VP8DSPContext *c);
+void ff_vp78dsp_init_aarch64(VP8DSPContext *c);
 void ff_vp78dsp_init_arm(VP8DSPContext *c);
 void ff_vp78dsp_init_ppc(VP8DSPContext *c);
 void ff_vp78dsp_init_x86(VP8DSPContext *c);
 
 void ff_vp8dsp_init(VP8DSPContext *c);
+void ff_vp8dsp_init_aarch64(VP8DSPContext *c);
 void ff_vp8dsp_init_arm(VP8DSPContext *c);
 void ff_vp8dsp_init_x86(VP8DSPContext *c);
 void ff_vp8dsp_init_mips(VP8DSPContext *c);
diff --git a/libavcodec/vp9.c b/libavcodec/vp9.c
index b1178c9..2a3a455 100644
--- a/libavcodec/vp9.c
+++ b/libavcodec/vp9.c
@@ -112,10 +112,20 @@
         return ret;
 
     sz = 64 * s->sb_cols * s->sb_rows;
-    f->extradata = av_buffer_allocz(sz * (1 + sizeof(VP9mvrefPair)));
+    if (sz != s->frame_extradata_pool_size) {
+        av_buffer_pool_uninit(&s->frame_extradata_pool);
+        s->frame_extradata_pool = av_buffer_pool_init(sz * (1 + sizeof(VP9mvrefPair)), NULL);
+        if (!s->frame_extradata_pool) {
+            s->frame_extradata_pool_size = 0;
+            goto fail;
+        }
+        s->frame_extradata_pool_size = sz;
+    }
+    f->extradata = av_buffer_pool_get(s->frame_extradata_pool);
     if (!f->extradata) {
         goto fail;
     }
+    memset(f->extradata->data, 0, f->extradata->size);
 
     f->segmentation_map = f->extradata->data;
     f->mv = (VP9mvrefPair *) (f->extradata->data + sz);
@@ -173,7 +183,8 @@
 #define HWACCEL_MAX (CONFIG_VP9_DXVA2_HWACCEL + \
                      CONFIG_VP9_D3D11VA_HWACCEL * 2 + \
                      CONFIG_VP9_NVDEC_HWACCEL + \
-                     CONFIG_VP9_VAAPI_HWACCEL)
+                     CONFIG_VP9_VAAPI_HWACCEL + \
+                     CONFIG_VP9_VDPAU_HWACCEL)
     enum AVPixelFormat pix_fmts[HWACCEL_MAX + 2], *fmtp = pix_fmts;
     VP9Context *s = avctx->priv_data;
     uint8_t *p;
@@ -188,6 +199,9 @@
 
         switch (s->pix_fmt) {
         case AV_PIX_FMT_YUV420P:
+#if CONFIG_VP9_VDPAU_HWACCEL
+            *fmtp++ = AV_PIX_FMT_VDPAU;
+#endif
         case AV_PIX_FMT_YUV420P10:
 #if CONFIG_VP9_DXVA2_HWACCEL
             *fmtp++ = AV_PIX_FMT_DXVA2_VLD;
@@ -353,7 +367,7 @@
 // differential forward probability updates
 static int update_prob(VP56RangeCoder *c, int p)
 {
-    static const int inv_map_table[255] = {
+    static const uint8_t inv_map_table[255] = {
           7,  20,  33,  46,  59,  72,  85,  98, 111, 124, 137, 150, 163, 176,
         189, 202, 215, 228, 241, 254,   1,   2,   3,   4,   5,   6,   8,   9,
          10,  11,  12,  13,  14,  15,  16,  17,  18,  19,  21,  22,  23,  24,
@@ -510,7 +524,7 @@
     s->s.h.use_last_frame_mvs = !s->s.h.errorres && !last_invisible;
 
     if (s->s.h.keyframe) {
-        if (get_bits_long(&s->gb, 24) != VP9_SYNCCODE) { // synccode
+        if (get_bits(&s->gb, 24) != VP9_SYNCCODE) { // synccode
             av_log(avctx, AV_LOG_ERROR, "Invalid sync code\n");
             return AVERROR_INVALIDDATA;
         }
@@ -526,7 +540,7 @@
         s->s.h.intraonly = s->s.h.invisible ? get_bits1(&s->gb) : 0;
         s->s.h.resetctx  = s->s.h.errorres ? 0 : get_bits(&s->gb, 2);
         if (s->s.h.intraonly) {
-            if (get_bits_long(&s->gb, 24) != VP9_SYNCCODE) { // synccode
+            if (get_bits(&s->gb, 24) != VP9_SYNCCODE) { // synccode
                 av_log(avctx, AV_LOG_ERROR, "Invalid sync code\n");
                 return AVERROR_INVALIDDATA;
             }
@@ -1206,6 +1220,7 @@
             vp9_frame_unref(avctx, &s->s.frames[i]);
         av_frame_free(&s->s.frames[i].tf.f);
     }
+    av_buffer_pool_uninit(&s->frame_extradata_pool);
     for (i = 0; i < 8; i++) {
         if (s->s.refs[i].f->buf[0])
             ff_thread_release_buffer(avctx, &s->s.refs[i]);
@@ -1306,6 +1321,9 @@
                         decode_sb_mem(td, row, col, lflvl_ptr,
                                       yoff2, uvoff2, BL_64X64);
                     } else {
+                        if (vpX_rac_is_end(td->c)) {
+                            return AVERROR_INVALIDDATA;
+                        }
                         decode_sb(td, row, col, lflvl_ptr,
                                   yoff2, uvoff2, BL_64X64);
                     }
@@ -1723,7 +1741,6 @@
 {
     VP9Context *s = avctx->priv_data;
 
-    avctx->internal->allocate_progress = 1;
     s->last_bpp = 0;
     s->s.h.filter.sharpness = -1;
 
@@ -1731,11 +1748,6 @@
 }
 
 #if HAVE_THREADS
-static av_cold int vp9_decode_init_thread_copy(AVCodecContext *avctx)
-{
-    return init_frames(avctx);
-}
-
 static int vp9_decode_update_thread_context(AVCodecContext *dst, const AVCodecContext *src)
 {
     int i, ret;
@@ -1792,9 +1804,9 @@
     .close                 = vp9_decode_free,
     .decode                = vp9_decode_frame,
     .capabilities          = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_FRAME_THREADS | AV_CODEC_CAP_SLICE_THREADS,
-    .caps_internal         = FF_CODEC_CAP_SLICE_THREAD_HAS_MF,
+    .caps_internal         = FF_CODEC_CAP_SLICE_THREAD_HAS_MF |
+                             FF_CODEC_CAP_ALLOCATE_PROGRESS,
     .flush                 = vp9_decode_flush,
-    .init_thread_copy      = ONLY_IF_THREADS_ENABLED(vp9_decode_init_thread_copy),
     .update_thread_context = ONLY_IF_THREADS_ENABLED(vp9_decode_update_thread_context),
     .profiles              = NULL_IF_CONFIG_SMALL(ff_vp9_profiles),
     .bsfs                  = "vp9_superframe_split",
@@ -1814,6 +1826,9 @@
 #if CONFIG_VP9_VAAPI_HWACCEL
                                HWACCEL_VAAPI(vp9),
 #endif
+#if CONFIG_VP9_VDPAU_HWACCEL
+                               HWACCEL_VDPAU(vp9),
+#endif
                                NULL
                            },
 };
diff --git a/libavcodec/vp9_metadata_bsf.c b/libavcodec/vp9_metadata_bsf.c
index be010ed..52e962b 100644
--- a/libavcodec/vp9_metadata_bsf.c
+++ b/libavcodec/vp9_metadata_bsf.c
@@ -33,22 +33,21 @@
     int color_space;
     int color_range;
 
-    int color_range_rgb_warned;
+    int color_warnings;
 } VP9MetadataContext;
 
 
-static int vp9_metadata_filter(AVBSFContext *bsf, AVPacket *out)
+static int vp9_metadata_filter(AVBSFContext *bsf, AVPacket *pkt)
 {
     VP9MetadataContext *ctx = bsf->priv_data;
-    AVPacket *in = NULL;
     CodedBitstreamFragment *frag = &ctx->fragment;
     int err, i;
 
-    err = ff_bsf_get_packet(bsf, &in);
+    err = ff_bsf_get_packet_ref(bsf, pkt);
     if (err < 0)
         return err;
 
-    err = ff_cbs_read_packet(ctx->cbc, frag, in);
+    err = ff_cbs_read_packet(ctx->cbc, frag, pkt);
     if (err < 0) {
         av_log(bsf, AV_LOG_ERROR, "Failed to read packet.\n");
         goto fail;
@@ -57,40 +56,51 @@
     for (i = 0; i < frag->nb_units; i++) {
         VP9RawFrame *frame = frag->units[i].content;
         VP9RawFrameHeader *header = &frame->header;
+        int profile = (header->profile_high_bit << 1) + header->profile_low_bit;
 
-        if (ctx->color_space >= 0) {
-            header->color_space = ctx->color_space;
-        }
-        if (ctx->color_range >= 0) {
-            if (ctx->color_range == 0 &&
-                header->color_space == VP9_CS_RGB &&
-                !ctx->color_range_rgb_warned) {
-                av_log(bsf, AV_LOG_WARNING, "Warning: color_range cannot "
-                       "be set to limited in RGB streams.\n");
-                ctx->color_range_rgb_warned = 1;
-            } else {
-                header->color_range = ctx->color_range;
+        if (header->frame_type == VP9_KEY_FRAME ||
+            header->intra_only && profile > 0) {
+            if (ctx->color_space >= 0) {
+                if (!(profile & 1) && ctx->color_space == VP9_CS_RGB) {
+                    if (!(ctx->color_warnings & 2)) {
+                        av_log(bsf, AV_LOG_WARNING, "Warning: RGB "
+                               "incompatible with profiles 0 and 2.\n");
+                        ctx->color_warnings |= 2;
+                    }
+                } else
+                    header->color_space = ctx->color_space;
             }
+
+            if (ctx->color_range >= 0)
+                header->color_range = ctx->color_range;
+            if (header->color_space == VP9_CS_RGB) {
+                if (!(ctx->color_warnings & 1) && !header->color_range) {
+                    av_log(bsf, AV_LOG_WARNING, "Warning: Color space RGB "
+                           "implicitly sets color range to PC range.\n");
+                    ctx->color_warnings |= 1;
+                }
+                header->color_range = 1;
+            }
+        } else if (!(ctx->color_warnings & 4) && header->intra_only && !profile &&
+                   ctx->color_space >= 0 && ctx->color_space != VP9_CS_BT_601) {
+            av_log(bsf, AV_LOG_WARNING, "Warning: Intra-only frames in "
+                   "profile 0 are automatically BT.601.\n");
+            ctx->color_warnings |= 4;
         }
     }
 
-    err = ff_cbs_write_packet(ctx->cbc, out, frag);
+    err = ff_cbs_write_packet(ctx->cbc, pkt, frag);
     if (err < 0) {
         av_log(bsf, AV_LOG_ERROR, "Failed to write packet.\n");
         goto fail;
     }
 
-    err = av_packet_copy_props(out, in);
-    if (err < 0)
-        goto fail;
-
     err = 0;
 fail:
-    ff_cbs_fragment_uninit(ctx->cbc, frag);
+    ff_cbs_fragment_reset(ctx->cbc, frag);
 
     if (err < 0)
-        av_packet_unref(out);
-    av_packet_free(&in);
+        av_packet_unref(pkt);
 
     return err;
 }
@@ -105,6 +115,8 @@
 static void vp9_metadata_close(AVBSFContext *bsf)
 {
     VP9MetadataContext *ctx = bsf->priv_data;
+
+    ff_cbs_fragment_free(ctx->cbc, &ctx->fragment);
     ff_cbs_close(&ctx->cbc);
 }
 
diff --git a/libavcodec/vp9_parser.c b/libavcodec/vp9_parser.c
index 9531f34..c957a75 100644
--- a/libavcodec/vp9_parser.c
+++ b/libavcodec/vp9_parser.c
@@ -36,12 +36,16 @@
     *out_data = data;
     *out_size = size;
 
-    if ((res = init_get_bits8(&gb, data, size)) < 0)
+    if (!size || (res = init_get_bits8(&gb, data, size)) < 0)
         return size; // parsers can't return errors
     get_bits(&gb, 2); // frame marker
     profile  = get_bits1(&gb);
     profile |= get_bits1(&gb) << 1;
     if (profile == 3) profile += get_bits1(&gb);
+    if (profile > 3)
+        return size;
+
+    avctx->profile = profile;
 
     if (get_bits1(&gb)) {
         keyframe = 0;
diff --git a/libavcodec/vp9_raw_reorder_bsf.c b/libavcodec/vp9_raw_reorder_bsf.c
index 01f3dad..2a1bdb9 100644
--- a/libavcodec/vp9_raw_reorder_bsf.c
+++ b/libavcodec/vp9_raw_reorder_bsf.c
@@ -20,7 +20,6 @@
 #include "libavutil/intmath.h"
 #include "libavutil/log.h"
 #include "libavutil/mem.h"
-#include "libavutil/opt.h"
 
 #include "bsf.h"
 #include "get_bits.h"
@@ -292,7 +291,7 @@
             return err;
         }
 
-        if (in->data[in->size - 1] & 0xe0 == 0xc0) {
+        if ((in->data[in->size - 1] & 0xe0) == 0xc0) {
             av_log(bsf, AV_LOG_ERROR, "Input in superframes is not "
                    "supported.\n");
             av_packet_free(&in);
@@ -385,6 +384,16 @@
     return err;
 }
 
+static void vp9_raw_reorder_flush(AVBSFContext *bsf)
+{
+    VP9RawReorderContext *ctx = bsf->priv_data;
+
+    for (int s = 0; s < FRAME_SLOTS; s++)
+        vp9_raw_reorder_clear_slot(ctx, s);
+    ctx->next_frame = NULL;
+    ctx->sequence = 0;
+}
+
 static void vp9_raw_reorder_close(AVBSFContext *bsf)
 {
     VP9RawReorderContext *ctx = bsf->priv_data;
@@ -402,6 +411,7 @@
     .name           = "vp9_raw_reorder",
     .priv_data_size = sizeof(VP9RawReorderContext),
     .close          = &vp9_raw_reorder_close,
+    .flush          = &vp9_raw_reorder_flush,
     .filter         = &vp9_raw_reorder_filter,
     .codec_ids      = vp9_raw_reorder_codec_ids,
 };
diff --git a/libavcodec/vp9_superframe_bsf.c b/libavcodec/vp9_superframe_bsf.c
index ea67507..b79911b 100644
--- a/libavcodec/vp9_superframe_bsf.c
+++ b/libavcodec/vp9_superframe_bsf.c
@@ -97,26 +97,25 @@
     return 0;
 }
 
-static int vp9_superframe_filter(AVBSFContext *ctx, AVPacket *out)
+static int vp9_superframe_filter(AVBSFContext *ctx, AVPacket *pkt)
 {
     GetBitContext gb;
     VP9BSFContext *s = ctx->priv_data;
-    AVPacket *in;
     int res, invisible, profile, marker, uses_superframe_syntax = 0, n;
 
-    res = ff_bsf_get_packet(ctx, &in);
+    res = ff_bsf_get_packet_ref(ctx, pkt);
     if (res < 0)
         return res;
 
-    marker = in->data[in->size - 1];
+    marker = pkt->data[pkt->size - 1];
     if ((marker & 0xe0) == 0xc0) {
         int nbytes = 1 + ((marker >> 3) & 0x3);
         int n_frames = 1 + (marker & 0x7), idx_sz = 2 + n_frames * nbytes;
 
-        uses_superframe_syntax = in->size >= idx_sz && in->data[in->size - idx_sz] == marker;
+        uses_superframe_syntax = pkt->size >= idx_sz && pkt->data[pkt->size - idx_sz] == marker;
     }
 
-    if ((res = init_get_bits8(&gb, in->data, in->size)) < 0)
+    if ((res = init_get_bits8(&gb, pkt->data, pkt->size)) < 0)
         goto done;
 
     get_bits(&gb, 2); // frame marker
@@ -133,33 +132,31 @@
 
     if (uses_superframe_syntax && s->n_cache > 0) {
         av_log(ctx, AV_LOG_ERROR,
-               "Mixing of superframe syntax and naked VP9 frames not supported");
+               "Mixing of superframe syntax and naked VP9 frames not supported\n");
         res = AVERROR(ENOSYS);
         goto done;
     } else if ((!invisible || uses_superframe_syntax) && !s->n_cache) {
         // passthrough
-        av_packet_move_ref(out, in);
-        goto done;
+        return 0;
     } else if (s->n_cache + 1 >= MAX_CACHE) {
         av_log(ctx, AV_LOG_ERROR,
-               "Too many invisible frames");
+               "Too many invisible frames\n");
         res = AVERROR_INVALIDDATA;
         goto done;
     }
 
-    av_packet_move_ref(s->cache[s->n_cache++], in);
+    av_packet_move_ref(s->cache[s->n_cache++], pkt);
 
     if (invisible) {
-        res = AVERROR(EAGAIN);
-        goto done;
+        return AVERROR(EAGAIN);
     }
     av_assert0(s->n_cache > 0);
 
     // build superframe
-    if ((res = merge_superframe(s->cache, s->n_cache, out)) < 0)
+    if ((res = merge_superframe(s->cache, s->n_cache, pkt)) < 0)
         goto done;
 
-    res = av_packet_copy_props(out, s->cache[s->n_cache - 1]);
+    res = av_packet_copy_props(pkt, s->cache[s->n_cache - 1]);
     if (res < 0)
         goto done;
 
@@ -169,8 +166,7 @@
 
 done:
     if (res < 0)
-        av_packet_unref(out);
-    av_packet_free(&in);
+        av_packet_unref(pkt);
     return res;
 }
 
diff --git a/libavcodec/vp9dec.h b/libavcodec/vp9dec.h
index 66573ed..de02b14 100644
--- a/libavcodec/vp9dec.h
+++ b/libavcodec/vp9dec.h
@@ -152,6 +152,10 @@
     int block_alloc_using_2pass;
     uint16_t mvscale[3][2];
     uint8_t mvstep[3][2];
+
+    // frame specific buffer pools
+    AVBufferPool *frame_extradata_pool;
+    int frame_extradata_pool_size;
 } VP9Context;
 
 struct VP9TileData {
diff --git a/libavcodec/vqavideo.c b/libavcodec/vqavideo.c
index 0e70be1..f45390c 100644
--- a/libavcodec/vqavideo.c
+++ b/libavcodec/vqavideo.c
@@ -147,7 +147,7 @@
     }
     s->width = AV_RL16(&s->avctx->extradata[6]);
     s->height = AV_RL16(&s->avctx->extradata[8]);
-    if ((ret = av_image_check_size(s->width, s->height, 0, avctx)) < 0) {
+    if ((ret = ff_set_dimensions(avctx, s->width, s->height)) < 0) {
         s->width= s->height= 0;
         return ret;
     }
@@ -637,6 +637,11 @@
     return 0;
 }
 
+static const AVCodecDefault vqa_defaults[] = {
+    { "max_pixels", "320*240" },
+    { NULL },
+};
+
 AVCodec ff_vqa_decoder = {
     .name           = "vqavideo",
     .long_name      = NULL_IF_CONFIG_SMALL("Westwood Studios VQA (Vector Quantized Animation) video"),
@@ -647,4 +652,5 @@
     .close          = vqa_decode_end,
     .decode         = vqa_decode_frame,
     .capabilities   = AV_CODEC_CAP_DR1,
+    .defaults       = vqa_defaults,
 };
diff --git a/libavcodec/wavpack.c b/libavcodec/wavpack.c
index 8306ec0..58ab561 100644
--- a/libavcodec/wavpack.c
+++ b/libavcodec/wavpack.c
@@ -1,6 +1,7 @@
 /*
  * WavPack lossless audio decoder
  * Copyright (c) 2006,2011 Konstantin Shishkov
+ * Copyright (c) 2020 David Bryant
  *
  * This file is part of FFmpeg.
  *
@@ -19,6 +20,7 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
+#include "libavutil/buffer.h"
 #include "libavutil/channel_layout.h"
 
 #define BITSTREAM_READER_LE
@@ -29,18 +31,37 @@
 #include "thread.h"
 #include "unary.h"
 #include "wavpack.h"
+#include "dsd.h"
 
 /**
  * @file
  * WavPack lossless audio decoder
  */
 
-typedef struct SavedContext {
-    int offset;
-    int size;
-    int bits_used;
-    uint32_t crc;
-} SavedContext;
+#define DSD_BYTE_READY(low,high) (!(((low) ^ (high)) & 0xff000000))
+
+#define PTABLE_BITS 8
+#define PTABLE_BINS (1<<PTABLE_BITS)
+#define PTABLE_MASK (PTABLE_BINS-1)
+
+#define UP   0x010000fe
+#define DOWN 0x00010000
+#define DECAY 8
+
+#define PRECISION 20
+#define VALUE_ONE (1 << PRECISION)
+#define PRECISION_USE 12
+
+#define RATE_S 20
+
+#define MAX_HISTORY_BITS    5
+#define MAX_HISTORY_BINS    (1 << MAX_HISTORY_BITS)
+#define MAX_BIN_BYTES       1280    // for value_lookup, per bin (2k - 512 - 256)
+
+typedef enum {
+    MODULATION_PCM,     // pulse code modulation
+    MODULATION_DSD      // pulse density modulation (aka DSD)
+} Modulation;
 
 typedef struct WavpackFrameContext {
     AVCodecContext *avctx;
@@ -52,7 +73,6 @@
     int got_extra_bits;
     uint32_t crc_extra_bits;
     GetBitContext gb_extra_bits;
-    int data_size; // in bits
     int samples;
     int terms;
     Decorr decorr[MAX_TERMS];
@@ -66,8 +86,13 @@
     int float_shift;
     int float_max_exp;
     WvChannel ch[2];
-    int pos;
-    SavedContext sc, extra_sc;
+
+    GetByteContext gbyte;
+    int ptable [PTABLE_BINS];
+    uint8_t value_lookup_buffer[MAX_HISTORY_BINS*MAX_BIN_BYTES];
+    uint16_t summed_probabilities[MAX_HISTORY_BINS][256];
+    uint8_t probabilities[MAX_HISTORY_BINS][256];
+    uint8_t *value_lookup[MAX_HISTORY_BINS];
 } WavpackFrameContext;
 
 #define WV_MAX_FRAME_DECODERS 14
@@ -81,6 +106,14 @@
     int block;
     int samples;
     int ch_offset;
+
+    AVFrame *frame;
+    ThreadFrame curr_frame, prev_frame;
+    Modulation modulation;
+
+    AVBufferRef *dsd_ref;
+    DSDContext *dsdctx;
+    int dsd_channels;
 } WavpackContext;
 
 #define LEVEL_DECAY(a)  (((a) + 0x80) >> 8)
@@ -365,12 +398,6 @@
     return value.f;
 }
 
-static void wv_reset_saved_context(WavpackFrameContext *s)
-{
-    s->pos    = 0;
-    s->sc.crc = s->extra_sc.crc = 0xFFFFFFFF;
-}
-
 static inline int wv_check_crc(WavpackFrameContext *s, uint32_t crc,
                                uint32_t crc_extra_bits)
 {
@@ -386,15 +413,372 @@
     return 0;
 }
 
+static void init_ptable(int *table, int rate_i, int rate_s)
+{
+    int value = 0x808000, rate = rate_i << 8;
+
+    for (int c = (rate + 128) >> 8; c--;)
+        value += (DOWN - value) >> DECAY;
+
+    for (int i = 0; i < PTABLE_BINS/2; i++) {
+        table[i] = value;
+        table[PTABLE_BINS-1-i] = 0x100ffff - value;
+
+        if (value > 0x010000) {
+            rate += (rate * rate_s + 128) >> 8;
+
+            for (int c = (rate + 64) >> 7; c--;)
+                value += (DOWN - value) >> DECAY;
+        }
+    }
+}
+
+typedef struct {
+    int32_t value, fltr0, fltr1, fltr2, fltr3, fltr4, fltr5, fltr6, factor;
+    unsigned int byte;
+} DSDfilters;
+
+static int wv_unpack_dsd_high(WavpackFrameContext *s, uint8_t *dst_left, uint8_t *dst_right)
+{
+    uint32_t checksum = 0xFFFFFFFF;
+    uint8_t *dst_l = dst_left, *dst_r = dst_right;
+    int total_samples = s->samples, stereo = dst_r ? 1 : 0;
+    DSDfilters filters[2], *sp = filters;
+    int rate_i, rate_s;
+    uint32_t low, high, value;
+
+    if (bytestream2_get_bytes_left(&s->gbyte) < (stereo ? 20 : 13))
+        return AVERROR_INVALIDDATA;
+
+    rate_i = bytestream2_get_byte(&s->gbyte);
+    rate_s = bytestream2_get_byte(&s->gbyte);
+
+    if (rate_s != RATE_S)
+        return AVERROR_INVALIDDATA;
+
+    init_ptable(s->ptable, rate_i, rate_s);
+
+    for (int channel = 0; channel < stereo + 1; channel++) {
+        DSDfilters *sp = filters + channel;
+
+        sp->fltr1 = bytestream2_get_byte(&s->gbyte) << (PRECISION - 8);
+        sp->fltr2 = bytestream2_get_byte(&s->gbyte) << (PRECISION - 8);
+        sp->fltr3 = bytestream2_get_byte(&s->gbyte) << (PRECISION - 8);
+        sp->fltr4 = bytestream2_get_byte(&s->gbyte) << (PRECISION - 8);
+        sp->fltr5 = bytestream2_get_byte(&s->gbyte) << (PRECISION - 8);
+        sp->fltr6 = 0;
+        sp->factor = bytestream2_get_byte(&s->gbyte) & 0xff;
+        sp->factor |= (bytestream2_get_byte(&s->gbyte) << 8) & 0xff00;
+        sp->factor = (int32_t)((uint32_t)sp->factor << 16) >> 16;
+    }
+
+    value = bytestream2_get_be32(&s->gbyte);
+    high = 0xffffffff;
+    low = 0x0;
+
+    while (total_samples--) {
+        int bitcount = 8;
+
+        sp[0].value = sp[0].fltr1 - sp[0].fltr5 + ((sp[0].fltr6 * sp[0].factor) >> 2);
+
+        if (stereo)
+            sp[1].value = sp[1].fltr1 - sp[1].fltr5 + ((sp[1].fltr6 * sp[1].factor) >> 2);
+
+        while (bitcount--) {
+            int32_t *pp = s->ptable + ((sp[0].value >> (PRECISION - PRECISION_USE)) & PTABLE_MASK);
+            uint32_t split = low + ((high - low) >> 8) * (*pp >> 16);
+
+            if (value <= split) {
+                high = split;
+                *pp += (UP - *pp) >> DECAY;
+                sp[0].fltr0 = -1;
+            } else {
+                low = split + 1;
+                *pp += (DOWN - *pp) >> DECAY;
+                sp[0].fltr0 = 0;
+            }
+
+            while (DSD_BYTE_READY(high, low) && bytestream2_get_bytes_left(&s->gbyte)) {
+                value = (value << 8) | bytestream2_get_byte(&s->gbyte);
+                high = (high << 8) | 0xff;
+                low <<= 8;
+            }
+
+            sp[0].value += sp[0].fltr6 * 8;
+            sp[0].byte = (sp[0].byte << 1) | (sp[0].fltr0 & 1);
+            sp[0].factor += (((sp[0].value ^ sp[0].fltr0) >> 31) | 1) &
+                ((sp[0].value ^ (sp[0].value - (sp[0].fltr6 * 16))) >> 31);
+            sp[0].fltr1 += ((sp[0].fltr0 & VALUE_ONE) - sp[0].fltr1) >> 6;
+            sp[0].fltr2 += ((sp[0].fltr0 & VALUE_ONE) - sp[0].fltr2) >> 4;
+            sp[0].fltr3 += (sp[0].fltr2 - sp[0].fltr3) >> 4;
+            sp[0].fltr4 += (sp[0].fltr3 - sp[0].fltr4) >> 4;
+            sp[0].value = (sp[0].fltr4 - sp[0].fltr5) >> 4;
+            sp[0].fltr5 += sp[0].value;
+            sp[0].fltr6 += (sp[0].value - sp[0].fltr6) >> 3;
+            sp[0].value = sp[0].fltr1 - sp[0].fltr5 + ((sp[0].fltr6 * sp[0].factor) >> 2);
+
+            if (!stereo)
+                continue;
+
+            pp = s->ptable + ((sp[1].value >> (PRECISION - PRECISION_USE)) & PTABLE_MASK);
+            split = low + ((high - low) >> 8) * (*pp >> 16);
+
+            if (value <= split) {
+                high = split;
+                *pp += (UP - *pp) >> DECAY;
+                sp[1].fltr0 = -1;
+            } else {
+                low = split + 1;
+                *pp += (DOWN - *pp) >> DECAY;
+                sp[1].fltr0 = 0;
+            }
+
+            while (DSD_BYTE_READY(high, low) && bytestream2_get_bytes_left(&s->gbyte)) {
+                value = (value << 8) | bytestream2_get_byte(&s->gbyte);
+                high = (high << 8) | 0xff;
+                low <<= 8;
+            }
+
+            sp[1].value += sp[1].fltr6 * 8;
+            sp[1].byte = (sp[1].byte << 1) | (sp[1].fltr0 & 1);
+            sp[1].factor += (((sp[1].value ^ sp[1].fltr0) >> 31) | 1) &
+                ((sp[1].value ^ (sp[1].value - (sp[1].fltr6 * 16))) >> 31);
+            sp[1].fltr1 += ((sp[1].fltr0 & VALUE_ONE) - sp[1].fltr1) >> 6;
+            sp[1].fltr2 += ((sp[1].fltr0 & VALUE_ONE) - sp[1].fltr2) >> 4;
+            sp[1].fltr3 += (sp[1].fltr2 - sp[1].fltr3) >> 4;
+            sp[1].fltr4 += (sp[1].fltr3 - sp[1].fltr4) >> 4;
+            sp[1].value = (sp[1].fltr4 - sp[1].fltr5) >> 4;
+            sp[1].fltr5 += sp[1].value;
+            sp[1].fltr6 += (sp[1].value - sp[1].fltr6) >> 3;
+            sp[1].value = sp[1].fltr1 - sp[1].fltr5 + ((sp[1].fltr6 * sp[1].factor) >> 2);
+        }
+
+        checksum += (checksum << 1) + (*dst_l = sp[0].byte & 0xff);
+        sp[0].factor -= (sp[0].factor + 512) >> 10;
+        dst_l += 4;
+
+        if (stereo) {
+            checksum += (checksum << 1) + (*dst_r = filters[1].byte & 0xff);
+            filters[1].factor -= (filters[1].factor + 512) >> 10;
+            dst_r += 4;
+        }
+    }
+
+    if (wv_check_crc(s, checksum, 0)) {
+        if (s->avctx->err_recognition & AV_EF_CRCCHECK)
+            return AVERROR_INVALIDDATA;
+
+        memset(dst_left, 0x69, s->samples * 4);
+
+        if (dst_r)
+            memset(dst_right, 0x69, s->samples * 4);
+    }
+
+    return 0;
+}
+
+static int wv_unpack_dsd_fast(WavpackFrameContext *s, uint8_t *dst_left, uint8_t *dst_right)
+{
+    uint8_t *dst_l = dst_left, *dst_r = dst_right;
+    uint8_t history_bits, max_probability;
+    int total_summed_probabilities  = 0;
+    int total_samples               = s->samples;
+    uint8_t *vlb                    = s->value_lookup_buffer;
+    int history_bins, p0, p1, chan;
+    uint32_t checksum               = 0xFFFFFFFF;
+    uint32_t low, high, value;
+
+    if (!bytestream2_get_bytes_left(&s->gbyte))
+        return AVERROR_INVALIDDATA;
+
+    history_bits = bytestream2_get_byte(&s->gbyte);
+
+    if (!bytestream2_get_bytes_left(&s->gbyte) || history_bits > MAX_HISTORY_BITS)
+        return AVERROR_INVALIDDATA;
+
+    history_bins = 1 << history_bits;
+    max_probability = bytestream2_get_byte(&s->gbyte);
+
+    if (max_probability < 0xff) {
+        uint8_t *outptr = (uint8_t *)s->probabilities;
+        uint8_t *outend = outptr + sizeof(*s->probabilities) * history_bins;
+
+        while (outptr < outend && bytestream2_get_bytes_left(&s->gbyte)) {
+            int code = bytestream2_get_byte(&s->gbyte);
+
+            if (code > max_probability) {
+                int zcount = code - max_probability;
+
+                while (outptr < outend && zcount--)
+                    *outptr++ = 0;
+            } else if (code) {
+                *outptr++ = code;
+            }
+            else {
+                break;
+            }
+        }
+
+        if (outptr < outend ||
+            (bytestream2_get_bytes_left(&s->gbyte) && bytestream2_get_byte(&s->gbyte)))
+                return AVERROR_INVALIDDATA;
+    } else if (bytestream2_get_bytes_left(&s->gbyte) > (int)sizeof(*s->probabilities) * history_bins) {
+        bytestream2_get_buffer(&s->gbyte, (uint8_t *)s->probabilities,
+            sizeof(*s->probabilities) * history_bins);
+    } else {
+        return AVERROR_INVALIDDATA;
+    }
+
+    for (p0 = 0; p0 < history_bins; p0++) {
+        int32_t sum_values = 0;
+
+        for (int i = 0; i < 256; i++)
+            s->summed_probabilities[p0][i] = sum_values += s->probabilities[p0][i];
+
+        if (sum_values) {
+            total_summed_probabilities += sum_values;
+
+            if (total_summed_probabilities > history_bins * MAX_BIN_BYTES)
+                return AVERROR_INVALIDDATA;
+
+            s->value_lookup[p0] = vlb;
+
+            for (int i = 0; i < 256; i++) {
+                int c = s->probabilities[p0][i];
+
+                while (c--)
+                    *vlb++ = i;
+            }
+        }
+    }
+
+    if (bytestream2_get_bytes_left(&s->gbyte) < 4)
+        return AVERROR_INVALIDDATA;
+
+    chan = p0 = p1 = 0;
+    low = 0; high = 0xffffffff;
+    value = bytestream2_get_be32(&s->gbyte);
+
+    if (dst_r)
+        total_samples *= 2;
+
+    while (total_samples--) {
+        unsigned int mult, index, code;
+
+        if (!s->summed_probabilities[p0][255])
+            return AVERROR_INVALIDDATA;
+
+        mult = (high - low) / s->summed_probabilities[p0][255];
+
+        if (!mult) {
+            if (bytestream2_get_bytes_left(&s->gbyte) >= 4)
+                value = bytestream2_get_be32(&s->gbyte);
+
+            low = 0;
+            high = 0xffffffff;
+            mult = high / s->summed_probabilities[p0][255];
+
+            if (!mult)
+                return AVERROR_INVALIDDATA;
+        }
+
+        index = (value - low) / mult;
+
+        if (index >= s->summed_probabilities[p0][255])
+            return AVERROR_INVALIDDATA;
+
+        if (!dst_r) {
+            if ((*dst_l = code = s->value_lookup[p0][index]))
+                low += s->summed_probabilities[p0][code-1] * mult;
+
+            dst_l += 4;
+        } else {
+            if ((code = s->value_lookup[p0][index]))
+                low += s->summed_probabilities[p0][code-1] * mult;
+
+            if (chan) {
+                *dst_r = code;
+                dst_r += 4;
+            }
+            else {
+                *dst_l = code;
+                dst_l += 4;
+            }
+
+            chan ^= 1;
+        }
+
+        high = low + s->probabilities[p0][code] * mult - 1;
+        checksum += (checksum << 1) + code;
+
+        if (!dst_r) {
+            p0 = code & (history_bins-1);
+        } else {
+            p0 = p1;
+            p1 = code & (history_bins-1);
+        }
+
+        while (DSD_BYTE_READY(high, low) && bytestream2_get_bytes_left(&s->gbyte)) {
+            value = (value << 8) | bytestream2_get_byte(&s->gbyte);
+            high = (high << 8) | 0xff;
+            low <<= 8;
+        }
+    }
+
+    if (wv_check_crc(s, checksum, 0)) {
+        if (s->avctx->err_recognition & AV_EF_CRCCHECK)
+            return AVERROR_INVALIDDATA;
+
+        memset(dst_left, 0x69, s->samples * 4);
+
+        if (dst_r)
+            memset(dst_right, 0x69, s->samples * 4);
+    }
+
+    return 0;
+}
+
+static int wv_unpack_dsd_copy(WavpackFrameContext *s, uint8_t *dst_left, uint8_t *dst_right)
+{
+    uint8_t *dst_l = dst_left, *dst_r = dst_right;
+    int total_samples           = s->samples;
+    uint32_t checksum           = 0xFFFFFFFF;
+
+    if (bytestream2_get_bytes_left(&s->gbyte) != total_samples * (dst_r ? 2 : 1))
+        return AVERROR_INVALIDDATA;
+
+    while (total_samples--) {
+        checksum += (checksum << 1) + (*dst_l = bytestream2_get_byte(&s->gbyte));
+        dst_l += 4;
+
+        if (dst_r) {
+            checksum += (checksum << 1) + (*dst_r = bytestream2_get_byte(&s->gbyte));
+            dst_r += 4;
+        }
+    }
+
+    if (wv_check_crc(s, checksum, 0)) {
+        if (s->avctx->err_recognition & AV_EF_CRCCHECK)
+            return AVERROR_INVALIDDATA;
+
+        memset(dst_left, 0x69, s->samples * 4);
+
+        if (dst_r)
+            memset(dst_right, 0x69, s->samples * 4);
+    }
+
+    return 0;
+}
+
 static inline int wv_unpack_stereo(WavpackFrameContext *s, GetBitContext *gb,
                                    void *dst_l, void *dst_r, const int type)
 {
     int i, j, count = 0;
     int last, t;
     int A, B, L, L2, R, R2;
-    int pos                 = s->pos;
-    uint32_t crc            = s->sc.crc;
-    uint32_t crc_extra_bits = s->extra_sc.crc;
+    int pos                 = 0;
+    uint32_t crc            = 0xFFFFFFFF;
+    uint32_t crc_extra_bits = 0xFFFFFFFF;
     int16_t *dst16_l        = dst_l;
     int16_t *dst16_r        = dst_r;
     int32_t *dst32_l        = dst_l;
@@ -504,8 +888,6 @@
         count++;
     } while (!last && count < s->samples);
 
-    wv_reset_saved_context(s);
-
     if (last && count < s->samples) {
         int size = av_get_bytes_per_sample(type);
         memset((uint8_t*)dst_l + count*size, 0, (s->samples-count)*size);
@@ -525,9 +907,9 @@
     int i, j, count = 0;
     int last, t;
     int A, S, T;
-    int pos                  = s->pos;
-    uint32_t crc             = s->sc.crc;
-    uint32_t crc_extra_bits  = s->extra_sc.crc;
+    int pos                  = 0;
+    uint32_t crc             = 0xFFFFFFFF;
+    uint32_t crc_extra_bits  = 0xFFFFFFFF;
     int16_t *dst16           = dst;
     int32_t *dst32           = dst;
     float *dstfl             = dst;
@@ -572,8 +954,6 @@
         count++;
     } while (!last && count < s->samples);
 
-    wv_reset_saved_context(s);
-
     if (last && count < s->samples) {
         int size = av_get_bytes_per_sample(type);
         memset((uint8_t*)dst + count*size, 0, (s->samples-count)*size);
@@ -598,16 +978,63 @@
         return -1;
     c->fdec_num++;
     c->fdec[c->fdec_num - 1]->avctx = c->avctx;
-    wv_reset_saved_context(c->fdec[c->fdec_num - 1]);
+
+    return 0;
+}
+
+static int wv_dsd_reset(WavpackContext *s, int channels)
+{
+    int i;
+
+    s->dsdctx = NULL;
+    s->dsd_channels = 0;
+    av_buffer_unref(&s->dsd_ref);
+
+    if (!channels)
+        return 0;
+
+    if (channels > INT_MAX / sizeof(*s->dsdctx))
+        return AVERROR(EINVAL);
+
+    s->dsd_ref = av_buffer_allocz(channels * sizeof(*s->dsdctx));
+    if (!s->dsd_ref)
+        return AVERROR(ENOMEM);
+    s->dsdctx = (DSDContext*)s->dsd_ref->data;
+    s->dsd_channels = channels;
+
+    for (i = 0; i < channels; i++)
+        memset(s->dsdctx[i].buf, 0x69, sizeof(s->dsdctx[i].buf));
 
     return 0;
 }
 
 #if HAVE_THREADS
-static int init_thread_copy(AVCodecContext *avctx)
+static int update_thread_context(AVCodecContext *dst, const AVCodecContext *src)
 {
-    WavpackContext *s = avctx->priv_data;
-    s->avctx = avctx;
+    WavpackContext *fsrc = src->priv_data;
+    WavpackContext *fdst = dst->priv_data;
+    int ret;
+
+    if (dst == src)
+        return 0;
+
+    ff_thread_release_buffer(dst, &fdst->curr_frame);
+    if (fsrc->curr_frame.f->data[0]) {
+        if ((ret = ff_thread_ref_frame(&fdst->curr_frame, &fsrc->curr_frame)) < 0)
+            return ret;
+    }
+
+    av_buffer_unref(&fdst->dsd_ref);
+    fdst->dsdctx = NULL;
+    fdst->dsd_channels = 0;
+    if (fsrc->dsd_ref) {
+        fdst->dsd_ref = av_buffer_ref(fsrc->dsd_ref);
+        if (!fdst->dsd_ref)
+            return AVERROR(ENOMEM);
+        fdst->dsdctx = (DSDContext*)fdst->dsd_ref->data;
+        fdst->dsd_channels = fsrc->dsd_channels;
+    }
+
     return 0;
 }
 #endif
@@ -620,35 +1047,52 @@
 
     s->fdec_num = 0;
 
+    s->curr_frame.f = av_frame_alloc();
+    s->prev_frame.f = av_frame_alloc();
+
+    if (!s->curr_frame.f || !s->prev_frame.f)
+        return AVERROR(ENOMEM);
+
+    ff_init_dsd_data();
+
     return 0;
 }
 
 static av_cold int wavpack_decode_end(AVCodecContext *avctx)
 {
     WavpackContext *s = avctx->priv_data;
-    int i;
 
-    for (i = 0; i < s->fdec_num; i++)
+    for (int i = 0; i < s->fdec_num; i++)
         av_freep(&s->fdec[i]);
     s->fdec_num = 0;
 
+    ff_thread_release_buffer(avctx, &s->curr_frame);
+    av_frame_free(&s->curr_frame.f);
+
+    ff_thread_release_buffer(avctx, &s->prev_frame);
+    av_frame_free(&s->prev_frame.f);
+
+    av_buffer_unref(&s->dsd_ref);
+
     return 0;
 }
 
 static int wavpack_decode_block(AVCodecContext *avctx, int block_no,
-                                AVFrame *frame, const uint8_t *buf, int buf_size)
+                                const uint8_t *buf, int buf_size)
 {
     WavpackContext *wc = avctx->priv_data;
-    ThreadFrame tframe = { .f = frame };
     WavpackFrameContext *s;
     GetByteContext gb;
+    enum AVSampleFormat sample_fmt;
     void *samples_l = NULL, *samples_r = NULL;
     int ret;
     int got_terms   = 0, got_weights = 0, got_samples = 0,
-        got_entropy = 0, got_bs      = 0, got_float   = 0, got_hybrid = 0;
+        got_entropy = 0, got_pcm     = 0, got_float   = 0, got_hybrid = 0;
+    int got_dsd = 0;
     int i, j, id, size, ssize, weights, t;
-    int bpp, chan = 0, chmask = 0, orig_bpp, sample_rate = 0;
+    int bpp, chan = 0, orig_bpp, sample_rate = 0, rate_x = 1, dsd_mode = 0;
     int multiblock;
+    uint64_t chmask = 0;
 
     if (block_no >= wc->fdec_num && wv_alloc_frame_context(wc) < 0) {
         av_log(avctx, AV_LOG_ERROR, "Error creating frame decode context\n");
@@ -677,7 +1121,15 @@
         return AVERROR_INVALIDDATA;
     }
     s->frame_flags = bytestream2_get_le32(&gb);
-    bpp            = av_get_bytes_per_sample(avctx->sample_fmt);
+
+    if (s->frame_flags & (WV_FLOAT_DATA | WV_DSD_DATA))
+        sample_fmt = AV_SAMPLE_FMT_FLTP;
+    else if ((s->frame_flags & 0x03) <= 1)
+        sample_fmt = AV_SAMPLE_FMT_S16P;
+    else
+        sample_fmt          = AV_SAMPLE_FMT_S32P;
+
+    bpp            = av_get_bytes_per_sample(sample_fmt);
     orig_bpp       = ((s->frame_flags & 0x03) + 1) << 3;
     multiblock     = (s->frame_flags & WV_SINGLE_BLOCK) != WV_SINGLE_BLOCK;
 
@@ -698,10 +1150,8 @@
     while (bytestream2_get_bytes_left(&gb)) {
         id   = bytestream2_get_byte(&gb);
         size = bytestream2_get_byte(&gb);
-        if (id & WP_IDF_LONG) {
-            size |= (bytestream2_get_byte(&gb)) << 8;
-            size |= (bytestream2_get_byte(&gb)) << 16;
-        }
+        if (id & WP_IDF_LONG)
+            size |= (bytestream2_get_le16u(&gb)) << 8;
         size <<= 1; // size is specified in words
         ssize  = size;
         if (id & WP_IDF_ODD)
@@ -897,13 +1347,28 @@
             bytestream2_skip(&gb, 1);
             break;
         case WP_ID_DATA:
-            s->sc.offset = bytestream2_tell(&gb);
-            s->sc.size   = size * 8;
             if ((ret = init_get_bits8(&s->gb, gb.buffer, size)) < 0)
                 return ret;
-            s->data_size = size * 8;
             bytestream2_skip(&gb, size);
-            got_bs       = 1;
+            got_pcm      = 1;
+            break;
+        case WP_ID_DSD_DATA:
+            if (size < 2) {
+                av_log(avctx, AV_LOG_ERROR, "Invalid DSD_DATA, size = %i\n",
+                       size);
+                bytestream2_skip(&gb, ssize);
+                continue;
+            }
+            rate_x = 1 << bytestream2_get_byte(&gb);
+            dsd_mode = bytestream2_get_byte(&gb);
+            if (dsd_mode && dsd_mode != 1 && dsd_mode != 3) {
+                av_log(avctx, AV_LOG_ERROR, "Invalid DSD encoding mode: %d\n",
+                    dsd_mode);
+                return AVERROR_INVALIDDATA;
+            }
+            bytestream2_init(&s->gbyte, gb.buffer, size-2);
+            bytestream2_skip(&gb, size-2);
+            got_dsd      = 1;
             break;
         case WP_ID_EXTRABITS:
             if (size <= 4) {
@@ -912,8 +1377,6 @@
                 bytestream2_skip(&gb, size);
                 continue;
             }
-            s->extra_sc.offset = bytestream2_tell(&gb);
-            s->extra_sc.size   = size * 8;
             if ((ret = init_get_bits8(&s->gb_extra_bits, gb.buffer, size)) < 0)
                 return ret;
             s->crc_extra_bits  = get_bits_long(&s->gb_extra_bits, 32);
@@ -940,13 +1403,23 @@
             case 3:
                 chmask = bytestream2_get_le32(&gb);
                 break;
+            case 4:
+                size = bytestream2_get_byte(&gb);
+                chan  |= (bytestream2_get_byte(&gb) & 0xF) << 8;
+                chan  += 1;
+                if (avctx->channels != chan)
+                    av_log(avctx, AV_LOG_WARNING, "%i channels signalled"
+                           " instead of %i.\n", chan, avctx->channels);
+                chmask = bytestream2_get_le24(&gb);
+                break;
             case 5:
                 size = bytestream2_get_byte(&gb);
-                if (avctx->channels != size)
-                    av_log(avctx, AV_LOG_WARNING, "%i channels signalled"
-                           " instead of %i.\n", size, avctx->channels);
                 chan  |= (bytestream2_get_byte(&gb) & 0xF) << 8;
-                chmask = bytestream2_get_le16(&gb);
+                chan  += 1;
+                if (avctx->channels != chan)
+                    av_log(avctx, AV_LOG_WARNING, "%i channels signalled"
+                           " instead of %i.\n", chan, avctx->channels);
+                chmask = bytestream2_get_le32(&gb);
                 break;
             default:
                 av_log(avctx, AV_LOG_ERROR, "Invalid channel info size %d\n",
@@ -969,70 +1442,111 @@
             bytestream2_skip(&gb, 1);
     }
 
-    if (!got_terms) {
-        av_log(avctx, AV_LOG_ERROR, "No block with decorrelation terms\n");
-        return AVERROR_INVALIDDATA;
-    }
-    if (!got_weights) {
-        av_log(avctx, AV_LOG_ERROR, "No block with decorrelation weights\n");
-        return AVERROR_INVALIDDATA;
-    }
-    if (!got_samples) {
-        av_log(avctx, AV_LOG_ERROR, "No block with decorrelation samples\n");
-        return AVERROR_INVALIDDATA;
-    }
-    if (!got_entropy) {
-        av_log(avctx, AV_LOG_ERROR, "No block with entropy info\n");
-        return AVERROR_INVALIDDATA;
-    }
-    if (s->hybrid && !got_hybrid) {
-        av_log(avctx, AV_LOG_ERROR, "Hybrid config not found\n");
-        return AVERROR_INVALIDDATA;
-    }
-    if (!got_bs) {
-        av_log(avctx, AV_LOG_ERROR, "Packed samples not found\n");
-        return AVERROR_INVALIDDATA;
-    }
-    if (!got_float && avctx->sample_fmt == AV_SAMPLE_FMT_FLTP) {
-        av_log(avctx, AV_LOG_ERROR, "Float information not found\n");
-        return AVERROR_INVALIDDATA;
-    }
-    if (s->got_extra_bits && avctx->sample_fmt != AV_SAMPLE_FMT_FLTP) {
-        const int size   = get_bits_left(&s->gb_extra_bits);
-        const int wanted = s->samples * s->extra_bits << s->stereo_in;
-        if (size < wanted) {
-            av_log(avctx, AV_LOG_ERROR, "Too small EXTRABITS\n");
-            s->got_extra_bits = 0;
+    if (got_pcm) {
+        if (!got_terms) {
+            av_log(avctx, AV_LOG_ERROR, "No block with decorrelation terms\n");
+            return AVERROR_INVALIDDATA;
+        }
+        if (!got_weights) {
+            av_log(avctx, AV_LOG_ERROR, "No block with decorrelation weights\n");
+            return AVERROR_INVALIDDATA;
+        }
+        if (!got_samples) {
+            av_log(avctx, AV_LOG_ERROR, "No block with decorrelation samples\n");
+            return AVERROR_INVALIDDATA;
+        }
+        if (!got_entropy) {
+            av_log(avctx, AV_LOG_ERROR, "No block with entropy info\n");
+            return AVERROR_INVALIDDATA;
+        }
+        if (s->hybrid && !got_hybrid) {
+            av_log(avctx, AV_LOG_ERROR, "Hybrid config not found\n");
+            return AVERROR_INVALIDDATA;
+        }
+        if (!got_float && sample_fmt == AV_SAMPLE_FMT_FLTP) {
+            av_log(avctx, AV_LOG_ERROR, "Float information not found\n");
+            return AVERROR_INVALIDDATA;
+        }
+        if (s->got_extra_bits && sample_fmt != AV_SAMPLE_FMT_FLTP) {
+            const int size   = get_bits_left(&s->gb_extra_bits);
+            const int wanted = s->samples * s->extra_bits << s->stereo_in;
+            if (size < wanted) {
+                av_log(avctx, AV_LOG_ERROR, "Too small EXTRABITS\n");
+                s->got_extra_bits = 0;
+            }
         }
     }
 
+    if (!got_pcm && !got_dsd) {
+        av_log(avctx, AV_LOG_ERROR, "Packed samples not found\n");
+        return AVERROR_INVALIDDATA;
+    }
+
+    if ((got_pcm && wc->modulation != MODULATION_PCM) ||
+        (got_dsd && wc->modulation != MODULATION_DSD)) {
+            av_log(avctx, AV_LOG_ERROR, "Invalid PCM/DSD mix encountered\n");
+            return AVERROR_INVALIDDATA;
+    }
+
     if (!wc->ch_offset) {
+        int      new_channels = avctx->channels;
+        uint64_t new_chmask   = avctx->channel_layout;
+        int new_samplerate;
         int sr = (s->frame_flags >> 23) & 0xf;
         if (sr == 0xf) {
             if (!sample_rate) {
                 av_log(avctx, AV_LOG_ERROR, "Custom sample rate missing.\n");
                 return AVERROR_INVALIDDATA;
             }
-            avctx->sample_rate = sample_rate;
+            new_samplerate = sample_rate * rate_x;
         } else
-            avctx->sample_rate = wv_rates[sr];
+            new_samplerate = wv_rates[sr] * rate_x;
 
         if (multiblock) {
             if (chan)
-                avctx->channels = chan;
+                new_channels = chan;
             if (chmask)
-                avctx->channel_layout = chmask;
+                new_chmask = chmask;
         } else {
-            avctx->channels       = s->stereo ? 2 : 1;
-            avctx->channel_layout = s->stereo ? AV_CH_LAYOUT_STEREO :
-                                                AV_CH_LAYOUT_MONO;
+            new_channels = s->stereo ? 2 : 1;
+            new_chmask   = s->stereo ? AV_CH_LAYOUT_STEREO :
+                                       AV_CH_LAYOUT_MONO;
         }
 
+        if (new_chmask &&
+            av_get_channel_layout_nb_channels(new_chmask) != new_channels) {
+            av_log(avctx, AV_LOG_ERROR, "Channel mask does not match the channel count\n");
+            return AVERROR_INVALIDDATA;
+        }
+
+        /* clear DSD state if stream properties change */
+        if (new_channels   != wc->dsd_channels      ||
+            new_chmask     != avctx->channel_layout ||
+            new_samplerate != avctx->sample_rate    ||
+            !!got_dsd      != !!wc->dsdctx) {
+            ret = wv_dsd_reset(wc, got_dsd ? new_channels : 0);
+            if (ret < 0) {
+                av_log(avctx, AV_LOG_ERROR, "Error reinitializing the DSD context\n");
+                return ret;
+            }
+            ff_thread_release_buffer(avctx, &wc->curr_frame);
+        }
+        avctx->channels            = new_channels;
+        avctx->channel_layout      = new_chmask;
+        avctx->sample_rate         = new_samplerate;
+        avctx->sample_fmt          = sample_fmt;
+        avctx->bits_per_raw_sample = orig_bpp;
+
+        ff_thread_release_buffer(avctx, &wc->prev_frame);
+        FFSWAP(ThreadFrame, wc->curr_frame, wc->prev_frame);
+
         /* get output buffer */
-        frame->nb_samples = s->samples + 1;
-        if ((ret = ff_thread_get_buffer(avctx, &tframe, 0)) < 0)
+        wc->curr_frame.f->nb_samples = s->samples;
+        if ((ret = ff_thread_get_buffer(avctx, &wc->curr_frame, AV_GET_BUFFER_FLAG_REF)) < 0)
             return ret;
-        frame->nb_samples = s->samples;
+
+        wc->frame = wc->curr_frame.f;
+        ff_thread_finish_setup(avctx);
     }
 
     if (wc->ch_offset + s->stereo >= avctx->channels) {
@@ -1040,18 +1554,38 @@
         return ((avctx->err_recognition & AV_EF_EXPLODE) || !wc->ch_offset) ? AVERROR_INVALIDDATA : 0;
     }
 
-    samples_l = frame->extended_data[wc->ch_offset];
+    samples_l = wc->frame->extended_data[wc->ch_offset];
     if (s->stereo)
-        samples_r = frame->extended_data[wc->ch_offset + 1];
+        samples_r = wc->frame->extended_data[wc->ch_offset + 1];
 
     wc->ch_offset += 1 + s->stereo;
 
     if (s->stereo_in) {
-        ret = wv_unpack_stereo(s, &s->gb, samples_l, samples_r, avctx->sample_fmt);
+        if (got_dsd) {
+            if (dsd_mode == 3) {
+                ret = wv_unpack_dsd_high(s, samples_l, samples_r);
+            } else if (dsd_mode == 1) {
+                ret = wv_unpack_dsd_fast(s, samples_l, samples_r);
+            } else {
+                ret = wv_unpack_dsd_copy(s, samples_l, samples_r);
+            }
+        } else {
+            ret = wv_unpack_stereo(s, &s->gb, samples_l, samples_r, avctx->sample_fmt);
+        }
         if (ret < 0)
             return ret;
     } else {
-        ret = wv_unpack_mono(s, &s->gb, samples_l, avctx->sample_fmt);
+        if (got_dsd) {
+            if (dsd_mode == 3) {
+                ret = wv_unpack_dsd_high(s, samples_l, NULL);
+            } else if (dsd_mode == 1) {
+                ret = wv_unpack_dsd_fast(s, samples_l, NULL);
+            } else {
+                ret = wv_unpack_dsd_copy(s, samples_l, NULL);
+            }
+        } else {
+            ret = wv_unpack_mono(s, &s->gb, samples_l, avctx->sample_fmt);
+        }
         if (ret < 0)
             return ret;
 
@@ -1065,10 +1599,20 @@
 static void wavpack_decode_flush(AVCodecContext *avctx)
 {
     WavpackContext *s = avctx->priv_data;
-    int i;
 
-    for (i = 0; i < s->fdec_num; i++)
-        wv_reset_saved_context(s->fdec[i]);
+    wv_dsd_reset(s, 0);
+}
+
+static int dsd_channel(AVCodecContext *avctx, void *frmptr, int jobnr, int threadnr)
+{
+    WavpackContext *s  = avctx->priv_data;
+    AVFrame *frame = frmptr;
+
+    ff_dsd2pcm_translate (&s->dsdctx [jobnr], s->samples, 0,
+        (uint8_t *)frame->extended_data[jobnr], 4,
+        (float *)frame->extended_data[jobnr], 1);
+
+    return 0;
 }
 
 static int wavpack_decode_frame(AVCodecContext *avctx, void *data,
@@ -1077,12 +1621,12 @@
     WavpackContext *s  = avctx->priv_data;
     const uint8_t *buf = avpkt->data;
     int buf_size       = avpkt->size;
-    AVFrame *frame     = data;
     int frame_size, ret, frame_flags;
 
     if (avpkt->size <= WV_HEADER_SIZE)
         return AVERROR_INVALIDDATA;
 
+    s->frame     = NULL;
     s->block     = 0;
     s->ch_offset = 0;
 
@@ -1095,18 +1639,9 @@
         return AVERROR_INVALIDDATA;
     }
 
-    if (frame_flags & 0x80) {
-        avctx->sample_fmt = AV_SAMPLE_FMT_FLTP;
-    } else if ((frame_flags & 0x03) <= 1) {
-        avctx->sample_fmt = AV_SAMPLE_FMT_S16P;
-    } else {
-        avctx->sample_fmt          = AV_SAMPLE_FMT_S32P;
-        avctx->bits_per_raw_sample = ((frame_flags & 0x03) + 1) << 3;
-    }
+    s->modulation = (frame_flags & WV_DSD_DATA) ? MODULATION_DSD : MODULATION_PCM;
 
-    while (buf_size > 0) {
-        if (buf_size <= WV_HEADER_SIZE)
-            break;
+    while (buf_size > WV_HEADER_SIZE) {
         frame_size = AV_RL32(buf + 4) - 12;
         buf       += 20;
         buf_size  -= 20;
@@ -1114,14 +1649,11 @@
             av_log(avctx, AV_LOG_ERROR,
                    "Block %d has invalid size (size %d vs. %d bytes left)\n",
                    s->block, frame_size, buf_size);
-            wavpack_decode_flush(avctx);
-            return AVERROR_INVALIDDATA;
+            ret = AVERROR_INVALIDDATA;
+            goto error;
         }
-        if ((ret = wavpack_decode_block(avctx, s->block,
-                                        frame, buf, frame_size)) < 0) {
-            wavpack_decode_flush(avctx);
-            return ret;
-        }
+        if ((ret = wavpack_decode_block(avctx, s->block, buf, frame_size)) < 0)
+            goto error;
         s->block++;
         buf      += frame_size;
         buf_size -= frame_size;
@@ -1129,12 +1661,33 @@
 
     if (s->ch_offset != avctx->channels) {
         av_log(avctx, AV_LOG_ERROR, "Not enough channels coded in a packet.\n");
-        return AVERROR_INVALIDDATA;
+        ret = AVERROR_INVALIDDATA;
+        goto error;
     }
 
+    ff_thread_await_progress(&s->prev_frame, INT_MAX, 0);
+    ff_thread_release_buffer(avctx, &s->prev_frame);
+
+    if (s->modulation == MODULATION_DSD)
+        avctx->execute2(avctx, dsd_channel, s->frame, NULL, avctx->channels);
+
+    ff_thread_report_progress(&s->curr_frame, INT_MAX, 0);
+
+    if ((ret = av_frame_ref(data, s->frame)) < 0)
+        return ret;
+
     *got_frame_ptr = 1;
 
     return avpkt->size;
+
+error:
+    if (s->frame) {
+        ff_thread_await_progress(&s->prev_frame, INT_MAX, 0);
+        ff_thread_release_buffer(avctx, &s->prev_frame);
+        ff_thread_report_progress(&s->curr_frame, INT_MAX, 0);
+    }
+
+    return ret;
 }
 
 AVCodec ff_wavpack_decoder = {
@@ -1147,6 +1700,8 @@
     .close          = wavpack_decode_end,
     .decode         = wavpack_decode_frame,
     .flush          = wavpack_decode_flush,
-    .init_thread_copy = ONLY_IF_THREADS_ENABLED(init_thread_copy),
-    .capabilities   = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_FRAME_THREADS,
+    .update_thread_context = ONLY_IF_THREADS_ENABLED(update_thread_context),
+    .capabilities   = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_FRAME_THREADS |
+                      AV_CODEC_CAP_SLICE_THREADS,
+    .caps_internal  = FF_CODEC_CAP_ALLOCATE_PROGRESS,
 };
diff --git a/libavcodec/wavpack.h b/libavcodec/wavpack.h
index 6caad03..43aaac8 100644
--- a/libavcodec/wavpack.h
+++ b/libavcodec/wavpack.h
@@ -35,6 +35,7 @@
 #define WV_FLOAT_DATA     0x00000080
 #define WV_INT32_DATA     0x00000100
 #define WV_FALSE_STEREO   0x40000000
+#define WV_DSD_DATA       0x80000000
 
 #define WV_HYBRID_MODE    0x00000008
 #define WV_HYBRID_SHAPE   0x00000008
@@ -77,6 +78,7 @@
     WP_ID_CORR,
     WP_ID_EXTRABITS,
     WP_ID_CHANINFO,
+    WP_ID_DSD_DATA,
     WP_ID_SAMPLE_RATE = 0x27,
 };
 
diff --git a/libavcodec/wavpackenc.c b/libavcodec/wavpackenc.c
index 979b921..0c85fbe 100644
--- a/libavcodec/wavpackenc.c
+++ b/libavcodec/wavpackenc.c
@@ -529,9 +529,9 @@
 
 static int restore_weight(int8_t weight)
 {
-    int result;
+    int result = 8 * weight;
 
-    if ((result = (int) weight << 3) > 0)
+    if (result > 0)
         result += (result + 64) >> 7;
 
     return result;
@@ -637,21 +637,15 @@
     }
 }
 
+#define count_bits(av) ((av) ? 32 - ff_clz(av) : 0)
+
 static uint32_t log2sample(uint32_t v, int limit, uint32_t *result)
 {
-    uint32_t dbits;
+    uint32_t dbits = count_bits(v);
 
     if ((v += v >> 9) < (1 << 8)) {
-        dbits = nbits_table[v];
         *result += (dbits << 8) + wp_log2_table[(v << (9 - dbits)) & 0xff];
     } else {
-        if (v < (1 << 16))
-            dbits = nbits_table[v >> 8] + 8;
-        else if (v < (1 << 24))
-            dbits = nbits_table[v >> 16] + 16;
-        else
-            dbits = nbits_table[v >> 24] + 24;
-
         *result += dbits = (dbits << 8) + wp_log2_table[(v >> (dbits - 9)) & 0xff];
 
         if (limit && dbits >= limit)
@@ -1969,14 +1963,6 @@
     return 0;
 }
 
-#define count_bits(av) ( \
- (av) < (1 << 8) ? nbits_table[av] : \
-  ( \
-   (av) < (1 << 16) ? nbits_table[(av) >> 8] + 8 : \
-   ((av) < (1 << 24) ? nbits_table[(av) >> 16] + 16 : nbits_table[(av) >> 24] + 24) \
-  ) \
-)
-
 static void encode_flush(WavPackEncodeContext *s)
 {
     WavPackWords *w = &s->w;
@@ -2571,7 +2557,7 @@
             ret = wv_mono(s, samples_l, !s->num_terms, 1);
     } else {
         for (i = 0; i < nb_samples; i++)
-            crc += (crc << 3) + (samples_l[i] << 1) + samples_l[i] + samples_r[i];
+            crc += (crc << 3) + ((uint32_t)samples_l[i] << 1) + samples_l[i] + samples_r[i];
 
         if (s->num_passes)
             ret = wv_stereo(s, samples_l, samples_r, !s->num_terms, 1);
diff --git a/libavcodec/wavpackenc.h b/libavcodec/wavpackenc.h
index 9dd2a01..1191433 100644
--- a/libavcodec/wavpackenc.h
+++ b/libavcodec/wavpackenc.h
@@ -650,15 +650,4 @@
 
 static const uint8_t decorr_filter_nterms[] = { 2, 5, 10, 16 };
 
-static const int8_t nbits_table[] = {
- 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8
-};
-
 #endif /* AVCODEC_WAVPACKENC_H */
diff --git a/libavcodec/wcmv.c b/libavcodec/wcmv.c
index ebd5ef6..d7a3cbd 100644
--- a/libavcodec/wcmv.c
+++ b/libavcodec/wcmv.c
@@ -45,7 +45,7 @@
 {
     WCMVContext *s = avctx->priv_data;
     AVFrame *frame = data;
-    int skip, blocks, zret, ret, intra = 0, bpp = s->bpp;
+    int skip, blocks, zret, ret, intra = 0, flags = 0, bpp = s->bpp;
     GetByteContext gb;
     uint8_t *dst;
 
@@ -56,21 +56,13 @@
     }
 
     bytestream2_init(&gb, avpkt->data, avpkt->size);
+    blocks = bytestream2_get_le16(&gb);
+    if (!blocks)
+        flags |= FF_REGET_BUFFER_FLAG_READONLY;
 
-    if ((ret = ff_get_buffer(avctx, frame, AV_GET_BUFFER_FLAG_REF)) < 0)
+    if ((ret = ff_reget_buffer(avctx, s->prev_frame, flags)) < 0)
         return ret;
 
-    if (s->prev_frame->data[0]) {
-        ret = av_frame_copy(frame, s->prev_frame);
-        if (ret < 0)
-            return ret;
-    } else {
-        ptrdiff_t linesize[4] = { frame->linesize[0], 0, 0, 0 };
-        av_image_fill_black(frame->data, linesize, avctx->pix_fmt, 0,
-                            avctx->width, avctx->height);
-    }
-
-    blocks = bytestream2_get_le16(&gb);
     if (blocks > 5) {
         GetByteContext bgb;
         int x = 0, size;
@@ -162,6 +154,15 @@
         bytestream2_seek(&gb, 2, SEEK_SET);
     }
 
+    if (bytestream2_get_bytes_left(&gb) < 8LL * blocks)
+        return AVERROR_INVALIDDATA;
+
+    if (!avctx->frame_number) {
+        ptrdiff_t linesize[4] = { s->prev_frame->linesize[0], 0, 0, 0 };
+        av_image_fill_black(s->prev_frame->data, linesize, avctx->pix_fmt, 0,
+                            avctx->width, avctx->height);
+    }
+
     for (int block = 0; block < blocks; block++) {
         int x, y, w, h;
 
@@ -179,7 +180,7 @@
         if (w > avctx->width || h > avctx->height)
             return AVERROR_INVALIDDATA;
 
-        dst = frame->data[0] + (avctx->height - y - 1) * frame->linesize[0] + x * bpp;
+        dst = s->prev_frame->data[0] + (avctx->height - y - 1) * s->prev_frame->linesize[0] + x * bpp;
         for (int i = 0; i < h; i++) {
             s->zstream.next_out  = dst;
             s->zstream.avail_out = w * bpp;
@@ -191,15 +192,14 @@
                 return AVERROR_INVALIDDATA;
             }
 
-            dst -= frame->linesize[0];
+            dst -= s->prev_frame->linesize[0];
         }
     }
 
-    frame->key_frame = intra;
-    frame->pict_type = intra ? AV_PICTURE_TYPE_I : AV_PICTURE_TYPE_P;
+    s->prev_frame->key_frame = intra;
+    s->prev_frame->pict_type = intra ? AV_PICTURE_TYPE_I : AV_PICTURE_TYPE_P;
 
-    av_frame_unref(s->prev_frame);
-    if ((ret = av_frame_ref(s->prev_frame, frame)) < 0)
+    if ((ret = av_frame_ref(frame, s->prev_frame)) < 0)
         return ret;
 
     *got_frame = 1;
diff --git a/libavcodec/webp.c b/libavcodec/webp.c
index 077bb06..c6d0206 100644
--- a/libavcodec/webp.c
+++ b/libavcodec/webp.c
@@ -1412,8 +1412,11 @@
             return AVERROR_INVALIDDATA;
         chunk_size += chunk_size & 1;
 
-        if (bytestream2_get_bytes_left(&gb) < chunk_size)
-            return AVERROR_INVALIDDATA;
+        if (bytestream2_get_bytes_left(&gb) < chunk_size) {
+           /* we seem to be running out of data, but it could also be that the
+              bitstream has trailing junk leading to bogus chunk_size. */
+            break;
+        }
 
         switch (chunk_type) {
         case MKTAG('V', 'P', '8', ' '):
diff --git a/libavcodec/webp_parser.c b/libavcodec/webp_parser.c
new file mode 100644
index 0000000..fdb7c38
--- /dev/null
+++ b/libavcodec/webp_parser.c
@@ -0,0 +1,112 @@
+/*
+ * WebP parser
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file
+ * WebP parser
+ */
+
+#include "libavutil/bswap.h"
+#include "libavutil/common.h"
+
+#include "parser.h"
+
+typedef struct WebPParseContext {
+    ParseContext pc;
+    uint32_t fsize;
+    uint32_t remaining_size;
+} WebPParseContext;
+
+static int webp_parse(AVCodecParserContext *s, AVCodecContext *avctx,
+                      const uint8_t **poutbuf, int *poutbuf_size,
+                      const uint8_t *buf, int buf_size)
+{
+    WebPParseContext *ctx = s->priv_data;
+    uint64_t state = ctx->pc.state64;
+    int next = END_NOT_FOUND;
+    int i = 0;
+
+    *poutbuf      = NULL;
+    *poutbuf_size = 0;
+
+restart:
+    if (ctx->pc.frame_start_found <= 8) {
+        for (; i < buf_size; i++) {
+            state = (state << 8) | buf[i];
+            if (ctx->pc.frame_start_found == 0) {
+                if ((state >> 32) == MKBETAG('R', 'I', 'F', 'F')) {
+                    ctx->fsize = av_bswap32(state);
+                    if (ctx->fsize > 15 && ctx->fsize <= UINT32_MAX - 10) {
+                        ctx->pc.frame_start_found = 1;
+                        ctx->fsize += 8;
+                    }
+                }
+            } else if (ctx->pc.frame_start_found == 8) {
+                if ((state >> 32) != MKBETAG('W', 'E', 'B', 'P')) {
+                    ctx->pc.frame_start_found = 0;
+                    continue;
+                }
+                ctx->pc.frame_start_found++;
+                ctx->remaining_size = ctx->fsize + i - 15;
+                if (ctx->pc.index + i > 15) {
+                    next = i - 15;
+                    state = 0;
+                    break;
+                } else {
+                    ctx->pc.state64 = 0;
+                    goto restart;
+                }
+            } else if (ctx->pc.frame_start_found)
+                ctx->pc.frame_start_found++;
+        }
+        ctx->pc.state64 = state;
+    } else {
+        if (ctx->remaining_size) {
+            i = FFMIN(ctx->remaining_size, buf_size);
+            ctx->remaining_size -= i;
+            if (ctx->remaining_size)
+                goto flush;
+
+            ctx->pc.frame_start_found = 0;
+            goto restart;
+        }
+    }
+
+flush:
+    if (ff_combine_frame(&ctx->pc, next, &buf, &buf_size) < 0)
+        return buf_size;
+
+    if (next != END_NOT_FOUND && next < 0)
+        ctx->pc.frame_start_found = FFMAX(ctx->pc.frame_start_found - i - 1, 0);
+    else
+        ctx->pc.frame_start_found = 0;
+
+    *poutbuf      = buf;
+    *poutbuf_size = buf_size;
+
+    return next;
+}
+
+AVCodecParser ff_webp_parser = {
+    .codec_ids      = { AV_CODEC_ID_WEBP },
+    .priv_data_size = sizeof(WebPParseContext),
+    .parser_parse   = webp_parse,
+    .parser_close   = ff_parse_close,
+};
diff --git a/libavcodec/webvttenc.c b/libavcodec/webvttenc.c
index c84bbf4..febf6ee 100644
--- a/libavcodec/webvttenc.c
+++ b/libavcodec/webvttenc.c
@@ -168,7 +168,7 @@
 
         if (sub->rects[i]->type != SUBTITLE_ASS) {
             av_log(avctx, AV_LOG_ERROR, "Only SUBTITLE_ASS type supported.\n");
-            return AVERROR(ENOSYS);
+            return AVERROR(EINVAL);
         }
 
 #if FF_API_ASS_TIMING
@@ -200,7 +200,7 @@
 
     if (s->buffer.len > bufsize) {
         av_log(avctx, AV_LOG_ERROR, "Buffer too small for ASS event.\n");
-        return -1;
+        return AVERROR_BUFFER_TOO_SMALL;
     }
     memcpy(buf, s->buffer.str, s->buffer.len);
 
diff --git a/libavcodec/wma.h b/libavcodec/wma.h
index 325f03c..c7fcf50 100644
--- a/libavcodec/wma.h
+++ b/libavcodec/wma.h
@@ -123,6 +123,7 @@
     uint8_t last_superframe[MAX_CODED_SUPERFRAME_SIZE + AV_INPUT_BUFFER_PADDING_SIZE]; /* padding added */
     int last_bitoffset;
     int last_superframe_len;
+    int exponents_initialized[MAX_CHANNELS];
     float noise_table[NOISE_TAB_SIZE];
     int noise_index;
     float noise_mult; /* XXX: suppress that and integrate it in the noise array */
diff --git a/libavcodec/wmadec.c b/libavcodec/wmadec.c
index 78b51e5..07fd960 100644
--- a/libavcodec/wmadec.c
+++ b/libavcodec/wmadec.c
@@ -585,10 +585,16 @@
                     decode_exp_lsp(s, ch);
                 }
                 s->exponents_bsize[ch] = bsize;
+                s->exponents_initialized[ch] = 1;
             }
         }
     }
 
+    for (ch = 0; ch < s->avctx->channels; ch++) {
+        if (s->channel_coded[ch] && !s->exponents_initialized[ch])
+            return AVERROR_INVALIDDATA;
+    }
+
     /* parse spectral coefficients : just RLE encoding */
     for (ch = 0; ch < s->avctx->channels; ch++) {
         if (s->channel_coded[ch]) {
@@ -889,11 +895,11 @@
             q   = s->last_superframe + s->last_superframe_len;
             len = bit_offset;
             while (len > 7) {
-                *q++ = (get_bits) (&s->gb, 8);
+                *q++ = get_bits(&s->gb, 8);
                 len -= 8;
             }
             if (len > 0)
-                *q++ = (get_bits) (&s->gb, len) << (8 - len);
+                *q++ = get_bits(&s->gb, len) << (8 - len);
             memset(q, 0, AV_INPUT_BUFFER_PADDING_SIZE);
 
             /* XXX: bit_offset bits into last frame */
diff --git a/libavcodec/wmalosslessdec.c b/libavcodec/wmalosslessdec.c
index eb1db61..8885487 100644
--- a/libavcodec/wmalosslessdec.c
+++ b/libavcodec/wmalosslessdec.c
@@ -184,11 +184,18 @@
     unsigned int channel_mask;
     int i, log2_max_num_subframes;
 
-    if (!avctx->block_align) {
-        av_log(avctx, AV_LOG_ERROR, "block_align is not set\n");
+    if (avctx->block_align <= 0) {
+        av_log(avctx, AV_LOG_ERROR, "block_align is not set or invalid\n");
         return AVERROR(EINVAL);
     }
 
+    av_assert0(avctx->channels >= 0);
+    if (avctx->channels > WMALL_MAX_CHANNELS) {
+        avpriv_request_sample(avctx,
+                              "More than " AV_STRINGIFY(WMALL_MAX_CHANNELS) " channels");
+        return AVERROR_PATCHWELCOME;
+    }
+
     s->max_frame_size = MAX_FRAMESIZE * avctx->channels;
     s->frame_data = av_mallocz(s->max_frame_size + AV_INPUT_BUFFER_PADDING_SIZE);
     if (!s->frame_data)
@@ -267,16 +274,6 @@
                 ++s->lfe_channel;
     }
 
-    if (s->num_channels < 0) {
-        av_log(avctx, AV_LOG_ERROR, "invalid number of channels %"PRId8"\n",
-               s->num_channels);
-        return AVERROR_INVALIDDATA;
-    } else if (s->num_channels > WMALL_MAX_CHANNELS) {
-        avpriv_request_sample(avctx,
-                              "More than %d channels", WMALL_MAX_CHANNELS);
-        return AVERROR_PATCHWELCOME;
-    }
-
     s->frame = av_frame_alloc();
     if (!s->frame)
         return AVERROR(ENOMEM);
@@ -535,7 +532,8 @@
         i++;
     }
     for (; i < tile_size; i++) {
-        int quo = 0, rem, rem_bits, residue;
+        int rem, rem_bits;
+        unsigned quo = 0, residue;
         while(get_bits1(&s->gb)) {
             quo++;
             if (get_bits_left(&s->gb) <= 0)
@@ -628,7 +626,7 @@
     int range        = 1 << (s->bits_per_sample - 1);
 
     for (ich = 0; ich < num_channels; ich++) {
-        pred_error = s->channel_residues[ich][icoef] - pred[ich];
+        pred_error = s->channel_residues[ich][icoef] - (unsigned)pred[ich];
         if (pred_error > 0) {
             for (i = 0; i < order * num_channels; i++)
                 s->mclms_coeffs[i + ich * order * num_channels] +=
@@ -678,9 +676,9 @@
         for (i = 0; i < ich; i++)
             pred[ich] += (uint32_t)s->channel_residues[i][icoef] *
                          s->mclms_coeffs_cur[i + num_channels * ich];
-        pred[ich] += 1 << s->mclms_scaling - 1;
+        pred[ich] += (1 << s->mclms_scaling) >> 1;
         pred[ich] >>= s->mclms_scaling;
-        s->channel_residues[ich][icoef] += pred[ich];
+        s->channel_residues[ich][icoef] += (unsigned)pred[ich];
     }
 }
 
@@ -766,7 +764,7 @@
     for (ilms = num_lms - 1; ilms >= 0; ilms--) { \
         for (icoef = coef_begin; icoef < coef_end; icoef++) { \
             int##bits##_t *prevvalues = (int##bits##_t *)s->cdlms[ch][ilms].lms_prevvalues; \
-            pred = 1 << (s->cdlms[ch][ilms].scaling - 1); \
+            pred = (1 << s->cdlms[ch][ilms].scaling) >> 1; \
             residue = s->channel_residues[ch][icoef]; \
             pred += s->dsp.scalarproduct_and_madd_int## bits (s->cdlms[ch][ilms].coefs, \
                                                         prevvalues + s->cdlms[ch][ilms].recent, \
@@ -774,7 +772,7 @@
                                                         s->cdlms[ch][ilms].recent, \
                                                         FFALIGN(s->cdlms[ch][ilms].order, ROUND), \
                                                         WMASIGN(residue)); \
-            input = residue + (pred >> s->cdlms[ch][ilms].scaling); \
+            input = residue + (unsigned)(pred >> s->cdlms[ch][ilms].scaling); \
             lms_update ## bits(s, ch, ilms, input); \
             s->channel_residues[ch][icoef] = input; \
         } \
@@ -811,22 +809,25 @@
             pred = 0;
             for (j = 0; j < order; j++) {
                 if (i <= j)
-                    pred += filter_coeffs[j] * prevvalues[j - i];
+                    pred += (uint32_t)filter_coeffs[j] * prevvalues[j - i];
                 else
-                    pred += s->channel_residues[ich][i - j - 1] * filter_coeffs[j];
+                    pred += (uint32_t)s->channel_residues[ich][i - j - 1] * filter_coeffs[j];
             }
             pred >>= scaling;
-            s->channel_residues[ich][i] += pred;
+            s->channel_residues[ich][i] += (unsigned)pred;
         }
         for (i = order; i < tile_size; i++) {
             pred = 0;
             for (j = 0; j < order; j++)
                 pred += (uint32_t)s->channel_residues[ich][i - j - 1] * filter_coeffs[j];
             pred >>= scaling;
-            s->channel_residues[ich][i] += pred;
+            s->channel_residues[ich][i] += (unsigned)pred;
         }
-        for (j = 0; j < order; j++)
-            prevvalues[j] = s->channel_residues[ich][tile_size - j - 1];
+        for (j = order - 1; j >= 0; j--)
+            if (tile_size <= j) {
+                prevvalues[j] = prevvalues[j - tile_size];
+            }else
+                prevvalues[j] = s->channel_residues[ich][tile_size - j - 1];
     }
 }
 
@@ -950,6 +951,8 @@
             for (j = 0; j < subframe_len; j++)
                 s->channel_residues[i][j] = get_sbits_long(&s->gb, bits);
     } else {
+        if (s->bits_per_sample < padding_zeroes)
+            return AVERROR_INVALIDDATA;
         for (i = 0; i < s->num_channels; i++) {
             if (s->is_channel_coded[i]) {
                 decode_channel_residues(s, i, subframe_len);
@@ -977,7 +980,7 @@
         if (s->quant_stepsize != 1)
             for (i = 0; i < s->num_channels; i++)
                 for (j = 0; j < subframe_len; j++)
-                    s->channel_residues[i][j] *= s->quant_stepsize;
+                    s->channel_residues[i][j] *= (unsigned)s->quant_stepsize;
     }
 
     /* Write to proper output buffer depending on bit-depth */
@@ -987,9 +990,9 @@
 
         for (j = 0; j < subframe_len; j++) {
             if (s->bits_per_sample == 16) {
-                *s->samples_16[c]++ = (int16_t) s->channel_residues[c][j] << padding_zeroes;
+                *s->samples_16[c]++ = (int16_t) s->channel_residues[c][j] * (1 << padding_zeroes);
             } else {
-                *s->samples_32[c]++ = s->channel_residues[c][j] << (padding_zeroes + 8);
+                *s->samples_32[c]++ = s->channel_residues[c][j] * (256U << padding_zeroes);
             }
         }
     }
@@ -1327,6 +1330,7 @@
     .decode         = decode_packet,
     .flush          = flush,
     .capabilities   = AV_CODEC_CAP_SUBFRAMES | AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY,
+    .caps_internal  = FF_CODEC_CAP_INIT_CLEANUP,
     .sample_fmts    = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_S16P,
                                                       AV_SAMPLE_FMT_S32P,
                                                       AV_SAMPLE_FMT_NONE },
diff --git a/libavcodec/wmaprodec.c b/libavcodec/wmaprodec.c
index 9439bfa..cbf5fa7f 100644
--- a/libavcodec/wmaprodec.c
+++ b/libavcodec/wmaprodec.c
@@ -210,6 +210,7 @@
     int              subframe_offset;               ///< subframe offset in the bit reservoir
     uint8_t          packet_loss;                   ///< set in case of bitstream error
     uint8_t          packet_done;                   ///< set when a packet is fully decoded
+    uint8_t          eof_done;                      ///< set when EOF reached and extra subframe is written (XMA1/2)
 
     /* frame decode state */
     uint32_t         frame_num;                     ///< current frame number (not used for decoding)
@@ -436,7 +437,7 @@
         av_log(avctx, AV_LOG_ERROR, "invalid number of channels per XMA stream %d\n",
                s->nb_channels);
         return AVERROR_INVALIDDATA;
-    } else if (s->nb_channels > WMAPRO_MAX_CHANNELS) {
+    } else if (s->nb_channels > WMAPRO_MAX_CHANNELS || s->nb_channels > avctx->channels) {
         avpriv_request_sample(avctx,
                               "More than %d channels", WMAPRO_MAX_CHANNELS);
         return AVERROR_PATCHWELCOME;
@@ -543,7 +544,7 @@
     for (i = 0; i < WMAPRO_BLOCK_SIZES; i++)
         ff_mdct_init(&s->mdct_ctx[i], WMAPRO_BLOCK_MIN_BITS+1+i, 1,
                      1.0 / (1 << (WMAPRO_BLOCK_MIN_BITS + i - 1))
-                     / (1 << (s->bits_per_sample - 1)));
+                     / (1ll << (s->bits_per_sample - 1)));
 
     /** init MDCT windows: simple sine window */
     for (i = 0; i < WMAPRO_BLOCK_SIZES; i++) {
@@ -1564,9 +1565,9 @@
         s->frame_offset = get_bits_count(gb) & 7;
         s->num_saved_bits = s->frame_offset;
         init_put_bits(&s->pb, s->frame_data, MAX_FRAMESIZE);
-    }
-
-    buflen = (put_bits_count(&s->pb) + len + 8) >> 3;
+        buflen = (s->num_saved_bits      + len + 7) >> 3;
+    } else
+        buflen = (put_bits_count(&s->pb) + len + 7) >> 3;
 
     if (len <= 0 || buflen > MAX_FRAMESIZE) {
         avpriv_request_sample(s->avctx, "Too small input buffer");
@@ -1609,13 +1610,41 @@
 
     *got_frame_ptr = 0;
 
-    if (s->packet_done || s->packet_loss) {
+    if (!buf_size) {
+        AVFrame *frame = data;
+        int i;
+
+        /** Must output remaining samples after stream end. WMAPRO 5.1 created
+         * by XWMA encoder don't though (maybe only 1/2ch streams need it). */
+        s->packet_done = 0;
+        if (s->eof_done)
+            return 0;
+
+        /** clean output buffer and copy last IMDCT samples */
+        for (i = 0; i < s->nb_channels; i++) {
+            memset(frame->extended_data[i], 0,
+            s->samples_per_frame * sizeof(*s->channel[i].out));
+
+            memcpy(frame->extended_data[i], s->channel[i].out,
+                   s->samples_per_frame * sizeof(*s->channel[i].out) >> 1);
+        }
+
+        /* TODO: XMA should output 128 samples only (instead of 512) and WMAPRO
+         * maybe 768 (with 2048), XMA needs changes in multi-stream handling though. */
+
+        s->eof_done = 1;
+        s->packet_done = 1;
+        *got_frame_ptr = 1;
+        return 0;
+    }
+    else if (s->packet_done || s->packet_loss) {
         s->packet_done = 0;
 
         /** sanity check for the buffer length */
         if (avctx->codec_id == AV_CODEC_ID_WMAPRO && buf_size < avctx->block_align) {
             av_log(avctx, AV_LOG_ERROR, "Input packet too small (%d < %d)\n",
                    buf_size, avctx->block_align);
+            s->packet_loss = 1;
             return AVERROR_INVALIDDATA;
         }
 
@@ -1765,10 +1794,21 @@
     AVFrame *frame = data;
     int i, ret, offset = INT_MAX;
 
+    if (!s->frames[s->current_stream]->data[0]) {
+        s->frames[s->current_stream]->nb_samples = 512;
+        if ((ret = ff_get_buffer(avctx, s->frames[s->current_stream], 0)) < 0) {
+            return ret;
+        }
+    }
     /* decode current stream packet */
     ret = decode_packet(avctx, &s->xma[s->current_stream], s->frames[s->current_stream],
                         &got_stream_frame_ptr, avpkt);
 
+    if (got_stream_frame_ptr && s->offset[s->current_stream] >= 64) {
+        got_stream_frame_ptr = 0;
+        ret = AVERROR_INVALIDDATA;
+    }
+
     /* copy stream samples (1/2ch) to sample buffer (Nch) */
     if (got_stream_frame_ptr) {
         int start_ch = s->start_channel[s->current_stream];
@@ -1860,12 +1900,14 @@
         s->num_streams = avctx->extradata[1];
         if (avctx->extradata_size != (32 + ((avctx->extradata[0]==3)?0:8) + 4*s->num_streams)) {
             av_log(avctx, AV_LOG_ERROR, "Incorrect XMA2 extradata size\n");
+            s->num_streams = 0;
             return AVERROR(EINVAL);
         }
     } else if (avctx->codec_id == AV_CODEC_ID_XMA1 && avctx->extradata_size >= 4) { /* XMAWAVEFORMAT */
         s->num_streams = avctx->extradata[4];
         if (avctx->extradata_size != (8 + 20*s->num_streams)) {
             av_log(avctx, AV_LOG_ERROR, "Incorrect XMA1 extradata size\n");
+            s->num_streams = 0;
             return AVERROR(EINVAL);
         }
     } else {
@@ -1874,8 +1916,11 @@
     }
 
     /* encoder supports up to 64 streams / 64*2 channels (would have to alloc arrays) */
-    if (avctx->channels > XMA_MAX_CHANNELS || s->num_streams > XMA_MAX_STREAMS) {
+    if (avctx->channels > XMA_MAX_CHANNELS || s->num_streams > XMA_MAX_STREAMS ||
+        s->num_streams <= 0
+    ) {
         avpriv_request_sample(avctx, "More than %d channels in %d streams", XMA_MAX_CHANNELS, s->num_streams);
+        s->num_streams = 0;
         return AVERROR_PATCHWELCOME;
     }
 
@@ -1887,14 +1932,12 @@
         s->frames[i] = av_frame_alloc();
         if (!s->frames[i])
             return AVERROR(ENOMEM);
-        s->frames[i]->nb_samples = 512;
-        if ((ret = ff_get_buffer(avctx, s->frames[i], 0)) < 0) {
-            return AVERROR(ENOMEM);
-        }
 
         s->start_channel[i] = start_channels;
         start_channels += s->xma[i].nb_channels;
     }
+    if (start_channels != avctx->channels)
+        return AVERROR_INVALIDDATA;
 
     return ret;
 }
@@ -1908,6 +1951,7 @@
         decode_end(&s->xma[i]);
         av_frame_free(&s->frames[i]);
     }
+    s->num_streams = 0;
 
     return 0;
 }
@@ -1922,6 +1966,7 @@
                sizeof(*s->channel[i].out));
     s->packet_loss = 1;
     s->skip_packets = 0;
+    s->eof_done = 0;
 }
 
 
@@ -1962,6 +2007,7 @@
     .close          = wmapro_decode_end,
     .decode         = wmapro_decode_packet,
     .capabilities   = AV_CODEC_CAP_SUBFRAMES | AV_CODEC_CAP_DR1,
+    .caps_internal  = FF_CODEC_CAP_INIT_CLEANUP,
     .flush          = wmapro_flush,
     .sample_fmts    = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_FLTP,
                                                       AV_SAMPLE_FMT_NONE },
@@ -1976,7 +2022,8 @@
     .init           = xma_decode_init,
     .close          = xma_decode_end,
     .decode         = xma_decode_packet,
-    .capabilities   = AV_CODEC_CAP_SUBFRAMES | AV_CODEC_CAP_DR1,
+    .capabilities   = AV_CODEC_CAP_SUBFRAMES | AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY,
+    .caps_internal  = FF_CODEC_CAP_INIT_CLEANUP,
     .sample_fmts    = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_FLTP,
                                                       AV_SAMPLE_FMT_NONE },
 };
@@ -1991,7 +2038,8 @@
     .close          = xma_decode_end,
     .decode         = xma_decode_packet,
     .flush          = xma_flush,
-    .capabilities   = AV_CODEC_CAP_SUBFRAMES | AV_CODEC_CAP_DR1,
+    .capabilities   = AV_CODEC_CAP_SUBFRAMES | AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY,
+    .caps_internal  = FF_CODEC_CAP_INIT_CLEANUP,
     .sample_fmts    = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_FLTP,
                                                       AV_SAMPLE_FMT_NONE },
 };
diff --git a/libavcodec/wmavoice.c b/libavcodec/wmavoice.c
index 444e303..f6550c6 100644
--- a/libavcodec/wmavoice.c
+++ b/libavcodec/wmavoice.c
@@ -386,7 +386,7 @@
                ctx->extradata_size);
         return AVERROR_INVALIDDATA;
     }
-    if (ctx->block_align <= 0) {
+    if (ctx->block_align <= 0 || ctx->block_align > (1<<22)) {
         av_log(ctx, AV_LOG_ERROR, "Invalid block alignment %d.\n", ctx->block_align);
         return AVERROR_INVALIDDATA;
     }
@@ -433,6 +433,9 @@
         return AVERROR_INVALIDDATA;
     }
 
+    if (ctx->sample_rate >= INT_MAX / (256 * 37))
+        return AVERROR_INVALIDDATA;
+
     s->min_pitch_val    = ((ctx->sample_rate << 8)      /  400 + 50) >> 8;
     s->max_pitch_val    = ((ctx->sample_rate << 8) * 37 / 2000 + 50) >> 8;
     pitch_range         = s->max_pitch_val - s->min_pitch_val;
@@ -633,12 +636,14 @@
     for (n = 0; n <= 64; n++) {
         float pwr;
 
-        idx = FFMAX(0, lrint((max - lpcs[n]) * irange) - 1);
+        idx = lrint((max - lpcs[n]) * irange - 1);
+        idx = FFMAX(0, idx);
         pwr = wmavoice_denoise_power_table[s->denoise_strength][idx];
         lpcs[n] = angle_mul * pwr;
 
         /* 70.57 =~ 1/log10(1.0331663) */
-        idx = (pwr * gain_mul - 0.0295) * 70.570526123;
+        idx = av_clipf((pwr * gain_mul - 0.0295) * 70.570526123, 0, INT_MAX / 2);
+
         if (idx > 127) { // fall back if index falls outside table range
             coeffs[n] = wmavoice_energy_table[127] *
                         powf(1.0331663, idx - 127);
@@ -1520,7 +1525,7 @@
 
         /* "pitch-diff-per-sample" for calculation of pitch per sample */
         s->pitch_diff_sh16 =
-            ((cur_pitch_val - s->last_pitch_val) << 16) / MAX_FRAMESIZE;
+            (cur_pitch_val - s->last_pitch_val) * (1 << 16) / MAX_FRAMESIZE;
     }
 
     /* Global gain (if silence) and pitch-adaptive window coordinates */
@@ -1840,6 +1845,9 @@
     skip_bits(gb, 4);          // packet sequence number
     s->has_residual_lsps = get_bits1(gb);
     do {
+        if (get_bits_left(gb) < 6 + s->spillover_bitsize)
+            return AVERROR_INVALIDDATA;
+
         res = get_bits(gb, 6); // number of superframes per packet
                                // (minus first one if there is spillover)
         n_superframes += res;
@@ -1906,7 +1914,7 @@
      * in a single "muxer" packet, so we artificially emulate that by
      * capping the packet size at ctx->block_align. */
     for (size = avpkt->size; size > ctx->block_align; size -= ctx->block_align);
-    init_get_bits(&s->gb, avpkt->data, size << 3);
+    init_get_bits8(&s->gb, avpkt->data, size);
 
     /* size == ctx->block_align is used to indicate whether we are dealing with
      * a new packet or a packet of which we already read the packet header
@@ -1998,5 +2006,6 @@
     .close            = wmavoice_decode_end,
     .decode           = wmavoice_decode_packet,
     .capabilities     = AV_CODEC_CAP_SUBFRAMES | AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY,
+    .caps_internal    = FF_CODEC_CAP_INIT_CLEANUP,
     .flush            = wmavoice_flush,
 };
diff --git a/libavcodec/wmv2dec.c b/libavcodec/wmv2dec.c
index 4f97d92..afa6547 100644
--- a/libavcodec/wmv2dec.c
+++ b/libavcodec/wmv2dec.c
@@ -33,6 +33,7 @@
 static int parse_mb_skip(Wmv2Context *w)
 {
     int mb_x, mb_y;
+    int coded_mb_count = 0;
     MpegEncContext *const s = &w->s;
     uint32_t *const mb_type = s->current_picture_ptr->mb_type;
 
@@ -83,6 +84,14 @@
         }
         break;
     }
+
+    for (mb_y = 0; mb_y < s->mb_height; mb_y++)
+        for (mb_x = 0; mb_x < s->mb_width; mb_x++)
+            coded_mb_count += !IS_SKIP(mb_type[mb_y * s->mb_stride + mb_x]);
+
+    if (coded_mb_count > get_bits_left(&s->gb))
+        return AVERROR_INVALIDDATA;
+
     return 0;
 }
 
@@ -181,6 +190,14 @@
             }
 
             s->dc_table_index = get_bits1(&s->gb);
+
+            // at minimum one bit per macroblock is required at least in a valid frame,
+            // we discard frames much smaller than this. Frames smaller than 1/8 of the
+            // smallest "black/skip" frame generally contain not much recoverable content
+            // while at the same time they have the highest computational requirements
+            // per byte
+            if (get_bits_left(&s->gb) * 8LL < (s->width+15)/16 * ((s->height+15)/16))
+                return AVERROR_INVALIDDATA;
         }
         s->inter_intra_pred = 0;
         s->no_rounding      = 1;
@@ -222,6 +239,9 @@
             s->rl_chroma_table_index = s->rl_table_index;
         }
 
+        if (get_bits_left(&s->gb) < 2)
+            return AVERROR_INVALIDDATA;
+
         s->dc_table_index   = get_bits1(&s->gb);
         s->mv_table_index   = get_bits1(&s->gb);
 
diff --git a/libavcodec/x86/Makefile b/libavcodec/x86/Makefile
index 2350c8b..194135d 100644
--- a/libavcodec/x86/Makefile
+++ b/libavcodec/x86/Makefile
@@ -53,10 +53,11 @@
 OBJS-$(CONFIG_DCA_DECODER)             += x86/dcadsp_init.o x86/synth_filter_init.o
 OBJS-$(CONFIG_DNXHD_ENCODER)           += x86/dnxhdenc_init.o
 OBJS-$(CONFIG_EXR_DECODER)             += x86/exrdsp_init.o
-OBJS-$(CONFIG_OPUS_DECODER)            += x86/opus_dsp_init.o
-OBJS-$(CONFIG_OPUS_ENCODER)            += x86/opus_dsp_init.o
+OBJS-$(CONFIG_OPUS_DECODER)            += x86/opusdsp_init.o
+OBJS-$(CONFIG_OPUS_ENCODER)            += x86/celt_pvq_init.o
 OBJS-$(CONFIG_HEVC_DECODER)            += x86/hevcdsp_init.o
 OBJS-$(CONFIG_JPEG2000_DECODER)        += x86/jpeg2000dsp_init.o
+OBJS-$(CONFIG_LSCR_DECODER)            += x86/pngdsp_init.o
 OBJS-$(CONFIG_MLP_DECODER)             += x86/mlpdsp_init.o
 OBJS-$(CONFIG_MPEG4_DECODER)           += x86/xvididct_init.o
 OBJS-$(CONFIG_PNG_DECODER)             += x86/pngdsp_init.o
@@ -127,7 +128,8 @@
 X86ASM-OBJS-$(CONFIG_ME_CMP)           += x86/me_cmp.o
 X86ASM-OBJS-$(CONFIG_MPEGAUDIODSP)     += x86/imdct36.o
 X86ASM-OBJS-$(CONFIG_MPEGVIDEOENC)     += x86/mpegvideoencdsp.o
-X86ASM-OBJS-$(CONFIG_OPUS_ENCODER)     += x86/opus_pvq_search.o
+X86ASM-OBJS-$(CONFIG_OPUS_DECODER)     += x86/opusdsp.o
+X86ASM-OBJS-$(CONFIG_OPUS_ENCODER)     += x86/celt_pvq_search.o
 X86ASM-OBJS-$(CONFIG_PIXBLOCKDSP)      += x86/pixblockdsp.o
 X86ASM-OBJS-$(CONFIG_QPELDSP)          += x86/qpeldsp.o                 \
                                           x86/fpel.o                    \
@@ -167,6 +169,7 @@
                                           x86/hevc_sao.o                \
                                           x86/hevc_sao_10bit.o
 X86ASM-OBJS-$(CONFIG_JPEG2000_DECODER) += x86/jpeg2000dsp.o
+X86ASM-OBJS-$(CONFIG_LSCR_DECODER)     += x86/pngdsp.o
 X86ASM-OBJS-$(CONFIG_MLP_DECODER)      += x86/mlpdsp.o
 X86ASM-OBJS-$(CONFIG_MPEG4_DECODER)    += x86/xvididct.o
 X86ASM-OBJS-$(CONFIG_PNG_DECODER)      += x86/pngdsp.o
diff --git a/libavcodec/x86/opus_dsp_init.c b/libavcodec/x86/celt_pvq_init.c
similarity index 94%
rename from libavcodec/x86/opus_dsp_init.c
rename to libavcodec/x86/celt_pvq_init.c
index a9f8a96..13724c3 100644
--- a/libavcodec/x86/opus_dsp_init.c
+++ b/libavcodec/x86/celt_pvq_init.c
@@ -28,11 +28,10 @@
 extern float ff_pvq_search_approx_sse4(float *X, int *y, int K, int N);
 extern float ff_pvq_search_exact_avx  (float *X, int *y, int K, int N);
 
-av_cold void ff_opus_dsp_init_x86(CeltPVQ *s)
+av_cold void ff_celt_pvq_init_x86(CeltPVQ *s)
 {
     int cpu_flags = av_get_cpu_flags();
 
-#if CONFIG_OPUS_ENCODER
     if (EXTERNAL_SSE2(cpu_flags))
         s->pvq_search = ff_pvq_search_approx_sse2;
 
@@ -41,5 +40,4 @@
 
     if (EXTERNAL_AVX_FAST(cpu_flags))
         s->pvq_search = ff_pvq_search_exact_avx;
-#endif
 }
diff --git a/libavcodec/x86/opus_pvq_search.asm b/libavcodec/x86/celt_pvq_search.asm
similarity index 100%
rename from libavcodec/x86/opus_pvq_search.asm
rename to libavcodec/x86/celt_pvq_search.asm
diff --git a/libavcodec/x86/diracdsp.asm b/libavcodec/x86/diracdsp.asm
index cc8a26f..17145ba 100644
--- a/libavcodec/x86/diracdsp.asm
+++ b/libavcodec/x86/diracdsp.asm
@@ -274,7 +274,7 @@
     movd   m3, qsd
     SPLATD m2
     SPLATD m3
-    mov    r4, tot_hq
+    mov    r4d, tot_hd
     mov    r3, dstq
 
     .loop_v:
@@ -294,8 +294,9 @@
 
     add    srcq, mmsize
     add    dstq, mmsize
-    sub    tot_hd, 4
+    sub    tot_hq, 4
     jg     .loop_h
+    lea    srcq, [srcq + 4*tot_hq]
 
     add    r3, strideq
     dec    tot_vd
diff --git a/libavcodec/x86/h264dsp_init.c b/libavcodec/x86/h264dsp_init.c
index 39f65c1..08eb7ea 100644
--- a/libavcodec/x86/h264dsp_init.c
+++ b/libavcodec/x86/h264dsp_init.c
@@ -101,13 +101,13 @@
 
 #define LF_FUNC(DIR, TYPE, DEPTH, OPT)                                        \
 void ff_deblock_ ## DIR ## _ ## TYPE ## _ ## DEPTH ## _ ## OPT(uint8_t *pix,  \
-                                                               int stride,    \
+                                                               ptrdiff_t stride, \
                                                                int alpha,     \
                                                                int beta,      \
                                                                int8_t *tc0);
 #define LF_IFUNC(DIR, TYPE, DEPTH, OPT) \
 void ff_deblock_ ## DIR ## _ ## TYPE ## _ ## DEPTH ## _ ## OPT(uint8_t *pix,  \
-                                                               int stride,    \
+                                                               ptrdiff_t stride, \
                                                                int alpha,     \
                                                                int beta);
 
diff --git a/libavcodec/x86/hevc_add_res.asm b/libavcodec/x86/hevc_add_res.asm
index 36d4d8e..c6c4007 100644
--- a/libavcodec/x86/hevc_add_res.asm
+++ b/libavcodec/x86/hevc_add_res.asm
@@ -30,27 +30,26 @@
 %macro ADD_RES_MMX_4_8 0
     mova              m0, [r1]
     mova              m2, [r1+8]
-    pxor              m1, m1
-    pxor              m3, m3
-    psubw             m1, m0
-    psubw             m3, m2
-    packuswb          m0, m2
-    packuswb          m1, m3
 
-    movd              m2, [r0]
+    movd              m1, [r0]
     movd              m3, [r0+r2]
-    punpckldq         m2, m3
-    paddusb           m0, m2
-    psubusb           m0, m1
+    punpcklbw         m1, m4
+    punpcklbw         m3, m4
+
+    paddsw            m0, m1
+    paddsw            m2, m3
+    packuswb          m0, m4
+    packuswb          m2, m4
+
     movd            [r0], m0
-    psrlq             m0, 32
-    movd         [r0+r2], m0
+    movd         [r0+r2], m2
 %endmacro
 
 
 INIT_MMX mmxext
 ; void ff_hevc_add_residual_4_8_mmxext(uint8_t *dst, int16_t *res, ptrdiff_t stride)
 cglobal hevc_add_residual_4_8, 3, 3, 6
+    pxor              m4, m4
     ADD_RES_MMX_4_8
     add               r1, 16
     lea               r0, [r0+r2*2]
@@ -58,69 +57,70 @@
     RET
 
 %macro ADD_RES_SSE_8_8 0
-    pxor              m3, m3
-    mova              m4, [r1]
-    mova              m6, [r1+16]
-    mova              m0, [r1+32]
-    mova              m2, [r1+48]
-    psubw             m5, m3, m4
-    psubw             m7, m3, m6
-    psubw             m1, m3, m0
-    packuswb          m4, m0
-    packuswb          m5, m1
-    psubw             m3, m2
-    packuswb          m6, m2
-    packuswb          m7, m3
-
     movq              m0, [r0]
     movq              m1, [r0+r2]
-    movhps            m0, [r0+r2*2]
-    movhps            m1, [r0+r3]
-    paddusb           m0, m4
-    paddusb           m1, m6
-    psubusb           m0, m5
-    psubusb           m1, m7
+    punpcklbw         m0, m4
+    punpcklbw         m1, m4
+    mova              m2, [r1]
+    mova              m3, [r1+16]
+    paddsw            m0, m2
+    paddsw            m1, m3
+    packuswb          m0, m1
+
+    movq              m2, [r0+r2*2]
+    movq              m3, [r0+r3]
+    punpcklbw         m2, m4
+    punpcklbw         m3, m4
+    mova              m6, [r1+32]
+    mova              m7, [r1+48]
+    paddsw            m2, m6
+    paddsw            m3, m7
+    packuswb          m2, m3
+
     movq            [r0], m0
-    movq         [r0+r2], m1
-    movhps     [r0+2*r2], m0
-    movhps       [r0+r3], m1
+    movhps       [r0+r2], m0
+    movq       [r0+r2*2], m2
+    movhps       [r0+r3], m2
 %endmacro
 
 %macro ADD_RES_SSE_16_32_8 3
-    mova             xm2, [r1+%1]
+    mova              m1, [%2]
+    mova              m2, m1
+    punpcklbw         m1, m0
+    punpckhbw         m2, m0
+    mova             xm5, [r1+%1]
     mova             xm6, [r1+%1+16]
 %if cpuflag(avx2)
-    vinserti128       m2, m2, [r1+%1+32], 1
+    vinserti128       m5, m5, [r1+%1+32], 1
     vinserti128       m6, m6, [r1+%1+48], 1
 %endif
-    psubw             m1, m0, m2
-    psubw             m5, m0, m6
-    packuswb          m2, m6
-    packuswb          m1, m5
+    paddsw            m1, m5
+    paddsw            m2, m6
 
-    mova             xm4, [r1+%1+mmsize*2]
+    mova              m3, [%3]
+    mova              m4, m3
+    punpcklbw         m3, m0
+    punpckhbw         m4, m0
+    mova             xm5, [r1+%1+mmsize*2]
     mova             xm6, [r1+%1+mmsize*2+16]
 %if cpuflag(avx2)
-    vinserti128       m4, m4, [r1+%1+96 ], 1
+    vinserti128       m5, m5, [r1+%1+96], 1
     vinserti128       m6, m6, [r1+%1+112], 1
 %endif
-    psubw             m3, m0, m4
-    psubw             m5, m0, m6
-    packuswb          m4, m6
-    packuswb          m3, m5
+    paddsw            m3, m5
+    paddsw            m4, m6
 
-    paddusb           m2, [%2]
-    paddusb           m4, [%3]
-    psubusb           m2, m1
-    psubusb           m4, m3
-    mova            [%2], m2
-    mova            [%3], m4
+    packuswb          m1, m2
+    packuswb          m3, m4
+    mova            [%2], m1
+    mova            [%3], m3
 %endmacro
 
 
 %macro TRANSFORM_ADD_8 0
 ; void ff_hevc_add_residual_8_8_<opt>(uint8_t *dst, int16_t *res, ptrdiff_t stride)
 cglobal hevc_add_residual_8_8, 3, 4, 8
+    pxor              m4, m4
     lea               r3, [r2*3]
     ADD_RES_SSE_8_8
     add               r1, 64
diff --git a/libavcodec/x86/opusdsp.asm b/libavcodec/x86/opusdsp.asm
new file mode 100644
index 0000000..418cc16
--- /dev/null
+++ b/libavcodec/x86/opusdsp.asm
@@ -0,0 +1,111 @@
+;******************************************************************************
+;* Opus SIMD functions
+;*
+;* This file is part of FFmpeg.
+;*
+;* FFmpeg is free software; you can redistribute it and/or
+;* modify it under the terms of the GNU Lesser General Public
+;* License as published by the Free Software Foundation; either
+;* version 2.1 of the License, or (at your option) any later version.
+;*
+;* FFmpeg is distributed in the hope that it will be useful,
+;* but WITHOUT ANY WARRANTY; without even the implied warranty of
+;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+;* Lesser General Public License for more details.
+;*
+;* You should have received a copy of the GNU Lesser General Public
+;* License along with FFmpeg; if not, write to the Free Software
+;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+;******************************************************************************
+
+%include "libavutil/x86/x86util.asm"
+
+SECTION_RODATA
+
+         ; 0.85..^1    0.85..^2    0.85..^3    0.85..^4
+tab_st: dd 0x3f599a00, 0x3f38f671, 0x3f1d382a, 0x3f05a32f
+
+SECTION .text
+
+INIT_XMM fma3
+%if UNIX64
+cglobal opus_deemphasis, 3, 3, 8, out, in, len
+%else
+cglobal opus_deemphasis, 4, 4, 8, out, in, coeff, len
+%endif
+%if ARCH_X86_32
+    VBROADCASTSS m0, coeffm
+%elif WIN64
+    shufps m0, m2, m2, 0
+%else
+    shufps m0, m0, 0
+%endif
+
+    movaps m4, [tab_st]
+    VBROADCASTSS m5, m4
+    shufps m6, m4, m4, q1111
+    shufps m7, m4, m4, q2222
+
+.loop:
+    movaps  m1, [inq]                ; x0, x1, x2, x3
+
+    pslldq  m2, m1, 4                ;  0, x0, x1, x2
+    pslldq  m3, m1, 8                ;  0,  0, x0, x1
+
+    fmaddps m2, m2, m5, m1           ; x + c1*x[0-2]
+    pslldq  m1, 12                   ;  0,  0,  0, x0
+
+    fmaddps m2, m3, m6, m2           ; x + c1*x[0-2] + c2*x[0-1]
+    fmaddps m1, m1, m7, m2           ; x + c1*x[0-2] + c2*x[0-1] + c3*x[0]
+    fmaddps m0, m0, m4, m1           ; x + c1*x[0-2] + c2*x[0-1] + c3*x[0] + c*s
+
+    movaps [outq], m0
+    shufps m0, m0, q3333             ; new state
+
+    add inq,  mmsize
+    add outq, mmsize
+    sub lend, mmsize >> 2
+    jg .loop
+
+%if ARCH_X86_64 == 0
+    movss r0m, m0
+    fld dword r0m
+%endif
+    RET
+
+
+INIT_XMM fma3
+cglobal opus_postfilter, 4, 4, 8, data, period, gains, len
+    VBROADCASTSS m0, [gainsq + 0]
+    VBROADCASTSS m1, [gainsq + 4]
+    VBROADCASTSS m2, [gainsq + 8]
+
+    shl periodd, 2
+    add periodq, 8
+    neg periodq
+
+    movups  m3, [dataq + periodq]
+    mulps   m3, m2
+
+.loop:
+    movups  m4, [dataq + periodq +  4]
+    movups  m5, [dataq + periodq +  8]
+    movups  m6, [dataq + periodq + 12]
+    movups  m7, [dataq + periodq + 16]
+
+    fmaddps m3, m7, m2, m3
+    addps   m6, m4
+
+    fmaddps m5, m5, m0, [dataq]
+    fmaddps m6, m6, m1, m3
+
+    addps   m5, m6
+    mulps   m3, m7, m2
+
+    movaps  [dataq], m5
+
+    add dataq, mmsize
+    sub lend,  mmsize >> 2
+    jg .loop
+
+    RET
diff --git a/libavdevice/libndi_newtek_common.h b/libavcodec/x86/opusdsp_init.c
similarity index 61%
copy from libavdevice/libndi_newtek_common.h
copy to libavcodec/x86/opusdsp_init.c
index 8990317..5c8a4c2 100644
--- a/libavdevice/libndi_newtek_common.h
+++ b/libavcodec/x86/opusdsp_init.c
@@ -1,7 +1,4 @@
 /*
- * NewTek NDI common code
- * Copyright (c) 2017 Maksym Veremeyenko
- *
  * This file is part of FFmpeg.
  *
  * FFmpeg is free software; you can redistribute it and/or
@@ -19,12 +16,20 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
-#ifndef AVDEVICE_LIBNDI_NEWTEK_COMMON_H
-#define AVDEVICE_LIBNDI_NEWTEK_COMMON_H
+#include "config.h"
 
-#include <Processing.NDI.Lib.h>
+#include "libavutil/x86/cpu.h"
+#include "libavcodec/opusdsp.h"
 
-#define NDI_TIME_BASE 10000000
-#define NDI_TIME_BASE_Q (AVRational){1, NDI_TIME_BASE}
+void ff_opus_postfilter_fma3(float *data, int period, float *gains, int len);
+float ff_opus_deemphasis_fma3(float *out, float *in, float coeff, int len);
 
-#endif
+av_cold void ff_opus_dsp_init_x86(OpusDSP *ctx)
+{
+    int cpu_flags = av_get_cpu_flags();
+
+    if (EXTERNAL_FMA3(cpu_flags)) {
+        ctx->postfilter = ff_opus_postfilter_fma3;
+        ctx->deemphasis = ff_opus_deemphasis_fma3;
+    }
+}
diff --git a/libavcodec/x86/proresdsp_init.c b/libavcodec/x86/proresdsp_init.c
index 8ca4d4d..bde79ab 100644
--- a/libavcodec/x86/proresdsp_init.c
+++ b/libavcodec/x86/proresdsp_init.c
@@ -35,14 +35,16 @@
 #if ARCH_X86_64
     int cpu_flags = av_get_cpu_flags();
 
-    if (EXTERNAL_SSE2(cpu_flags)) {
-        dsp->idct_permutation_type = FF_IDCT_PERM_TRANSPOSE;
-        dsp->idct_put = ff_prores_idct_put_10_sse2;
-    }
+    if (avctx->bits_per_raw_sample == 10){
+        if (EXTERNAL_SSE2(cpu_flags)) {
+            dsp->idct_permutation_type = FF_IDCT_PERM_TRANSPOSE;
+            dsp->idct_put = ff_prores_idct_put_10_sse2;
+        }
 
-    if (EXTERNAL_AVX(cpu_flags)) {
-        dsp->idct_permutation_type = FF_IDCT_PERM_TRANSPOSE;
-        dsp->idct_put = ff_prores_idct_put_10_avx;
+        if (EXTERNAL_AVX(cpu_flags)) {
+            dsp->idct_permutation_type = FF_IDCT_PERM_TRANSPOSE;
+            dsp->idct_put = ff_prores_idct_put_10_avx;
+        }
     }
 #endif /* ARCH_X86_64 */
 }
diff --git a/libavcodec/x86/v210-init.c b/libavcodec/x86/v210-init.c
index d64dbca..cb9a6cb 100644
--- a/libavcodec/x86/v210-init.c
+++ b/libavcodec/x86/v210-init.c
@@ -21,9 +21,11 @@
 
 extern void ff_v210_planar_unpack_unaligned_ssse3(const uint32_t *src, uint16_t *y, uint16_t *u, uint16_t *v, int width);
 extern void ff_v210_planar_unpack_unaligned_avx(const uint32_t *src, uint16_t *y, uint16_t *u, uint16_t *v, int width);
+extern void ff_v210_planar_unpack_unaligned_avx2(const uint32_t *src, uint16_t *y, uint16_t *u, uint16_t *v, int width);
 
 extern void ff_v210_planar_unpack_aligned_ssse3(const uint32_t *src, uint16_t *y, uint16_t *u, uint16_t *v, int width);
 extern void ff_v210_planar_unpack_aligned_avx(const uint32_t *src, uint16_t *y, uint16_t *u, uint16_t *v, int width);
+extern void ff_v210_planar_unpack_aligned_avx2(const uint32_t *src, uint16_t *y, uint16_t *u, uint16_t *v, int width);
 
 av_cold void ff_v210_x86_init(V210DecContext *s)
 {
@@ -36,6 +38,9 @@
 
         if (HAVE_AVX_EXTERNAL && cpu_flags & AV_CPU_FLAG_AVX)
             s->unpack_frame = ff_v210_planar_unpack_aligned_avx;
+
+        if (HAVE_AVX2_EXTERNAL && cpu_flags & AV_CPU_FLAG_AVX2)
+            s->unpack_frame = ff_v210_planar_unpack_aligned_avx2;
     }
     else {
         if (cpu_flags & AV_CPU_FLAG_SSSE3)
@@ -43,6 +48,9 @@
 
         if (HAVE_AVX_EXTERNAL && cpu_flags & AV_CPU_FLAG_AVX)
             s->unpack_frame = ff_v210_planar_unpack_unaligned_avx;
+
+        if (HAVE_AVX2_EXTERNAL && cpu_flags & AV_CPU_FLAG_AVX2)
+            s->unpack_frame = ff_v210_planar_unpack_unaligned_avx2;
     }
 #endif
 }
diff --git a/libavcodec/x86/v210.asm b/libavcodec/x86/v210.asm
index c24c765..3b9e076 100644
--- a/libavcodec/x86/v210.asm
+++ b/libavcodec/x86/v210.asm
@@ -22,9 +22,14 @@
 
 %include "libavutil/x86/x86util.asm"
 
-SECTION_RODATA
+SECTION_RODATA 32
 
-v210_mask: times 4 dd 0x3ff
+; for AVX2 version only
+v210_luma_permute: dd 0,1,2,4,5,6,7,7  ; 32-byte alignment required
+v210_chroma_shuf2: db 0,1,2,3,4,5,8,9,10,11,12,13,-1,-1,-1,-1
+v210_luma_shuf_avx2: db 0,1,4,5,6,7,8,9,12,13,14,15,-1,-1,-1,-1
+v210_chroma_shuf_avx2: db 0,1,4,5,10,11,-1,-1,2,3,8,9,12,13,-1,-1
+
 v210_mult: dw 64,4,64,4,64,4,64,4
 v210_luma_shuf: db 8,9,0,1,2,3,12,13,4,5,6,7,-1,-1,-1,-1
 v210_chroma_shuf: db 0,1,8,9,6,7,-1,-1,2,3,4,5,12,13,-1,-1
@@ -34,40 +39,64 @@
 %macro v210_planar_unpack 1
 
 ; v210_planar_unpack(const uint32_t *src, uint16_t *y, uint16_t *u, uint16_t *v, int width)
-cglobal v210_planar_unpack_%1, 5, 5, 7
-    movsxdifnidn r4, r4d
-    lea    r1, [r1+2*r4]
-    add    r2, r4
-    add    r3, r4
-    neg    r4
+cglobal v210_planar_unpack_%1, 5, 5, 6 + 2 * cpuflag(avx2), src, y, u, v, w
+    movsxdifnidn wq, wd
+    lea    yq, [yq+2*wq]
+    add    uq, wq
+    add    vq, wq
+    neg    wq
 
-    mova   m3, [v210_mult]
-    mova   m4, [v210_mask]
-    mova   m5, [v210_luma_shuf]
-    mova   m6, [v210_chroma_shuf]
+    VBROADCASTI128   m3, [v210_mult]
+
+%if cpuflag(avx2)
+    VBROADCASTI128   m4, [v210_luma_shuf_avx2]
+    VBROADCASTI128   m5, [v210_chroma_shuf_avx2]
+    mova             m6, [v210_luma_permute]
+    VBROADCASTI128   m7, [v210_chroma_shuf2]
+%else
+    VBROADCASTI128   m4, [v210_luma_shuf]
+    VBROADCASTI128   m5, [v210_chroma_shuf]
+%endif
+
 .loop:
 %ifidn %1, unaligned
-    movu   m0, [r0]
+    movu   m0, [srcq]  ; yB v5 yA  u5 y9 v4  y8 u4 y7  v3 y6 u3  y5 v2 y4  u2 y3 v1  y2 u1 y1  v0 y0 u0
 %else
-    mova   m0, [r0]
+    mova   m0, [srcq]
 %endif
 
     pmullw m1, m0, m3
-    psrld  m0, 10
-    psrlw  m1, 6  ; u0 v0 y1 y2 v1 u2 y4 y5
-    pand   m0, m4 ; y0 __ u1 __ y3 __ v2 __
+    pslld  m0, 12
+    psrlw  m1, 6                       ; yB yA u5 v4 y8 y7 v3 u3 y5 y4 u2 v1 y2 y1 v0 u0
+    psrld  m0, 22                      ; 00 v5 00 y9 00 u4 00 y6 00 v2 00 y3 00 u1 00 y0
 
-    shufps m2, m1, m0, 0x8d ; y1 y2 y4 y5 y0 __ y3 __
-    pshufb m2, m5 ; y0 y1 y2 y3 y4 y5 __ __
-    movu   [r1+2*r4], m2
+%if cpuflag(avx2)
+    vpblendd m2, m1, m0, 0x55          ; yB yA 00 y9 y8 y7 00 y6 y5 y4 00 y3 y2 y1 00 y0
+    pshufb m2, m4                      ; 00 00 yB yA y9 y8 y7 y6 00 00 y5 y4 y3 y2 y1 y0
+    vpermd m2, m6, m2                  ; 00 00 00 00 yB yA y9 y8 y7 y6 y5 y4 y3 y2 y1 y0
+    movu   [yq+2*wq], m2
 
-    shufps m1, m0, 0xd8 ; u0 v0 v1 u2 u1 __ v2 __
-    pshufb m1, m6 ; u0 u1 u2 __ v0 v1 v2 __
-    movq   [r2+r4], m1
-    movhps [r3+r4], m1
+    vpblendd m1, m1, m0, 0xaa          ; 00 v5 u5 v4 00 u4 v3 u3 00 v2 u2 v1 00 u1 v0 u0
+    pshufb m1, m5                      ; 00 v5 v4 v3 00 u5 u4 u3 00 v2 v1 v0 00 u2 u1 u0
+    vpermq m1, m1, 0xd8                ; 00 v5 v4 v3 00 v2 v1 v0 00 u5 u4 u3 00 u2 u1 u0
+    pshufb m1, m7                      ; 00 00 v5 v4 v3 v2 v1 v0 00 00 u5 u4 u3 u2 u1 u0
 
-    add r0, mmsize
-    add r4, 6
+    movu   [uq+wq], xm1
+    vextracti128 [vq+wq], m1, 1
+%else
+    shufps m2, m1, m0, 0x8d            ; 00 y9 00 y6 yB yA y8 y7 00 y3 00 y0 y5 y4 y2 y1
+    pshufb m2, m4                      ; 00 00 yB yA y9 y8 y7 y6 00 00 y5 y4 y3 y2 y1 y0
+    movu   [yq+2*wq], m2
+
+    shufps m1, m0, 0xd8                ; 00 v5 00 u4 u5 v4 v3 u3 00 v2 00 u1 u2 v1 v0 u0
+    pshufb m1, m5                      ; 00 v5 v4 v3 00 u5 u4 u3 00 v2 v1 v0 00 u2 u1 u0
+
+    movq   [uq+wq], m1
+    movhps [vq+wq], m1
+%endif
+
+    add srcq, mmsize
+    add wq, (mmsize*3)/8
     jl  .loop
 
     REP_RET
@@ -81,6 +110,11 @@
 v210_planar_unpack unaligned
 %endif
 
+%if HAVE_AVX2_EXTERNAL
+INIT_YMM avx2
+v210_planar_unpack unaligned
+%endif
+
 INIT_XMM ssse3
 v210_planar_unpack aligned
 
@@ -88,3 +122,8 @@
 INIT_XMM avx
 v210_planar_unpack aligned
 %endif
+
+%if HAVE_AVX2_EXTERNAL
+INIT_YMM avx2
+v210_planar_unpack aligned
+%endif
diff --git a/libavcodec/x86/vp3dsp_init.c b/libavcodec/x86/vp3dsp_init.c
index 1ba9576..ba47e1c 100644
--- a/libavcodec/x86/vp3dsp_init.c
+++ b/libavcodec/x86/vp3dsp_init.c
@@ -59,8 +59,8 @@
         c->idct_dc_add = ff_vp3_idct_dc_add_mmxext;
 
         if (!(flags & AV_CODEC_FLAG_BITEXACT)) {
-            c->v_loop_filter = ff_vp3_v_loop_filter_mmxext;
-            c->h_loop_filter = ff_vp3_h_loop_filter_mmxext;
+            c->v_loop_filter = c->v_loop_filter_unaligned = ff_vp3_v_loop_filter_mmxext;
+            c->h_loop_filter = c->v_loop_filter_unaligned = ff_vp3_h_loop_filter_mmxext;
         }
     }
 
diff --git a/libavcodec/xfacedec.c b/libavcodec/xfacedec.c
index d045cb6..ab4c082 100644
--- a/libavcodec/xfacedec.c
+++ b/libavcodec/xfacedec.c
@@ -123,7 +123,7 @@
     if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
         return ret;
 
-    for (i = 0, k = 0; avpkt->data[i] && i < avpkt->size; i++) {
+    for (i = 0, k = 0; i < avpkt->size && avpkt->data[i]; i++) {
         c = avpkt->data[i];
 
         /* ignore invalid digits */
diff --git a/libavcodec/xpmdec.c b/libavcodec/xpmdec.c
index 03172e4..922dfc0 100644
--- a/libavcodec/xpmdec.c
+++ b/libavcodec/xpmdec.c
@@ -26,6 +26,10 @@
 #include "avcodec.h"
 #include "internal.h"
 
+#define MIN_ELEMENT ' '
+#define MAX_ELEMENT 0xfe
+#define NB_ELEMENTS (MAX_ELEMENT - MIN_ELEMENT + 1)
+
 typedef struct XPMContext {
     uint32_t  *pixels;
     int        pixels_size;
@@ -290,10 +294,10 @@
     int n = 0, m = 1, i;
 
     for (i = 0; i < cpp; i++) {
-        if (*p < ' ' || *p > '~')
+        if (*p < MIN_ELEMENT || *p > MAX_ELEMENT)
             return AVERROR_INVALIDDATA;
-        n += (*p++ - ' ') * m;
-        m *= 95;
+        n += (*p++ - MIN_ELEMENT) * m;
+        m *= NB_ELEMENTS;
     }
     return n;
 }
@@ -307,6 +311,7 @@
     int ncolors, cpp, ret, i, j;
     int64_t size;
     uint32_t *dst;
+    int width, height;
 
     avctx->pix_fmt = AV_PIX_FMT_BGRA;
 
@@ -328,12 +333,12 @@
 
     ptr += mod_strcspn(ptr, "\"");
     if (sscanf(ptr, "\"%u %u %u %u\",",
-               &avctx->width, &avctx->height, &ncolors, &cpp) != 4) {
+               &width, &height, &ncolors, &cpp) != 4) {
         av_log(avctx, AV_LOG_ERROR, "missing image parameters\n");
         return AVERROR_INVALIDDATA;
     }
 
-    if ((ret = ff_set_dimensions(avctx, avctx->width, avctx->height)) < 0)
+    if ((ret = ff_set_dimensions(avctx, width, height)) < 0)
         return ret;
 
     if ((ret = ff_get_buffer(avctx, p, 0)) < 0)
@@ -346,7 +351,7 @@
 
     size = 1;
     for (i = 0; i < cpp; i++)
-        size *= 95;
+        size *= NB_ELEMENTS;
 
     if (ncolors <= 0 || ncolors > size) {
         av_log(avctx, AV_LOG_ERROR, "invalid number of colors: %d\n", ncolors);
diff --git a/libavcodec/xsubdec.c b/libavcodec/xsubdec.c
index 93fd0f4..c1c6e11 100644
--- a/libavcodec/xsubdec.c
+++ b/libavcodec/xsubdec.c
@@ -46,7 +46,7 @@
     return ms - packet_time;
 }
 
-static int decode_frame(AVCodecContext *avctx, void *data, int *data_size,
+static int decode_frame(AVCodecContext *avctx, void *data, int *got_sub_ptr,
                         AVPacket *avpkt) {
     const uint8_t *buf = avpkt->data;
     int buf_size = avpkt->size;
@@ -130,7 +130,7 @@
             ((uint32_t *)sub->rects[0]->data[1])[i] |= 0xff000000;
     } else {
         for (i = 0; i < sub->rects[0]->nb_colors; i++)
-            ((uint32_t *)sub->rects[0]->data[1])[i] |= *buf++ << 24;
+            ((uint32_t *)sub->rects[0]->data[1])[i] |= (unsigned)*buf++ << 24;
     }
 
 #if FF_API_AVPICTURE
@@ -169,7 +169,7 @@
         bitmap += w;
         align_get_bits(&gb);
     }
-    *data_size = 1;
+    *got_sub_ptr = 1;
     return buf_size;
 }
 
diff --git a/libavcodec/xsubenc.c b/libavcodec/xsubenc.c
index b3da909..4d58e0f 100644
--- a/libavcodec/xsubenc.c
+++ b/libavcodec/xsubenc.c
@@ -63,7 +63,7 @@
         while (x0 < w) {
             // Make sure we have enough room for at least one run and padding
             if (pb->size_in_bits - put_bits_count(pb) < 7*8)
-                return -1;
+                return AVERROR_BUFFER_TOO_SMALL;
 
             x1 = x0;
             color = bitmap[x1++] & 3;
@@ -124,7 +124,7 @@
 
     if (bufsize < 27 + 7*2 + 4*3) {
         av_log(avctx, AV_LOG_ERROR, "Buffer too small for XSUB header.\n");
-        return -1;
+        return AVERROR_BUFFER_TOO_SMALL;
     }
 
     // TODO: support multiple rects
@@ -147,7 +147,7 @@
     // TODO: render text-based subtitles into bitmaps
     if (!h->rects[0]->data[0] || !h->rects[0]->data[1]) {
         av_log(avctx, AV_LOG_WARNING, "No subtitle bitmap available.\n");
-        return -1;
+        return AVERROR(EINVAL);
     }
 
     // TODO: color reduction, similar to dvdsub encoder
@@ -160,7 +160,7 @@
 
     if (make_tc(startTime, start_tc) || make_tc(endTime, end_tc)) {
         av_log(avctx, AV_LOG_WARNING, "Time code >= 100 hours.\n");
-        return -1;
+        return AVERROR(EINVAL);
     }
 
     snprintf(buf, 28,
@@ -195,13 +195,13 @@
     if (xsub_encode_rle(&pb, h->rects[0]->data[0],
                         h->rects[0]->linesize[0] * 2,
                         h->rects[0]->w, (h->rects[0]->h + 1) >> 1))
-        return -1;
+        return AVERROR_BUFFER_TOO_SMALL;
     bytestream_put_le16(&rlelenptr, put_bits_count(&pb) >> 3); // Length of first field
 
     if (xsub_encode_rle(&pb, h->rects[0]->data[0] + h->rects[0]->linesize[0],
                         h->rects[0]->linesize[0] * 2,
                         h->rects[0]->w, h->rects[0]->h >> 1))
-        return -1;
+        return AVERROR_BUFFER_TOO_SMALL;
 
     // Enforce total height to be a multiple of 2
     if (h->rects[0]->h & 1) {
diff --git a/libavcodec/xvididct.c b/libavcodec/xvididct.c
index d8f3dd7..14116bd 100644
--- a/libavcodec/xvididct.c
+++ b/libavcodec/xvididct.c
@@ -142,7 +142,7 @@
 #define TAN3  0xAB0E
 #define SQRT2 0x5A82
 
-#define MULT(c, x, n)  (((c) * (x)) >> (n))
+#define MULT(c, x, n)  ((unsigned)((int)((c) * (unsigned)(x)) >> (n)))
 // 12b version => #define MULT(c,x, n)  ((((c) >> 3) * (x)) >> ((n) - 3))
 // 12b zero-testing version:
 
diff --git a/libavcodec/xxan.c b/libavcodec/xxan.c
index 8bb7087..afe60e1 100644
--- a/libavcodec/xxan.c
+++ b/libavcodec/xxan.c
@@ -410,7 +410,7 @@
     int ftype;
     int ret;
 
-    if ((ret = ff_reget_buffer(avctx, s->pic)) < 0)
+    if ((ret = ff_reget_buffer(avctx, s->pic, 0)) < 0)
         return ret;
 
     bytestream2_init(&s->gb, avpkt->data, avpkt->size);
diff --git a/libavcodec/ylc.c b/libavcodec/ylc.c
index 1133322..2afe3fc 100644
--- a/libavcodec/ylc.c
+++ b/libavcodec/ylc.c
@@ -453,24 +453,6 @@
     return avpkt->size;
 }
 
-#if HAVE_THREADS
-static int init_thread_copy(AVCodecContext *avctx)
-{
-    YLCContext *s = avctx->priv_data;
-
-    memset(&s->vlc[0], 0, sizeof(VLC));
-    memset(&s->vlc[1], 0, sizeof(VLC));
-    memset(&s->vlc[2], 0, sizeof(VLC));
-    memset(&s->vlc[3], 0, sizeof(VLC));
-    s->table_bits = NULL;
-    s->table_bits_size = 0;
-    s->bitstream_bits = NULL;
-    s->bitstream_bits_size = 0;
-
-    return 0;
-}
-#endif
-
 static av_cold int decode_end(AVCodecContext *avctx)
 {
     YLCContext *s = avctx->priv_data;
@@ -494,7 +476,6 @@
     .id             = AV_CODEC_ID_YLC,
     .priv_data_size = sizeof(YLCContext),
     .init           = decode_init,
-    .init_thread_copy = ONLY_IF_THREADS_ENABLED(init_thread_copy),
     .close          = decode_end,
     .decode         = decode_frame,
     .capabilities   = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_FRAME_THREADS,
diff --git a/libavcodec/yop.c b/libavcodec/yop.c
index 32cfea2..aff28ef 100644
--- a/libavcodec/yop.c
+++ b/libavcodec/yop.c
@@ -204,7 +204,7 @@
         return AVERROR_INVALIDDATA;
     }
 
-    if ((ret = ff_reget_buffer(avctx, frame)) < 0)
+    if ((ret = ff_reget_buffer(avctx, frame, 0)) < 0)
         return ret;
 
     if (!avctx->frame_number)
diff --git a/libavcodec/zerocodec.c b/libavcodec/zerocodec.c
index e67eee4..1051fda 100644
--- a/libavcodec/zerocodec.c
+++ b/libavcodec/zerocodec.c
@@ -131,14 +131,19 @@
     }
 
     zc->previous_frame = av_frame_alloc();
-    if (!zc->previous_frame) {
-        zerocodec_decode_close(avctx);
+    if (!zc->previous_frame)
         return AVERROR(ENOMEM);
-    }
 
     return 0;
 }
 
+static void zerocodec_decode_flush(AVCodecContext *avctx)
+{
+    ZeroCodecContext *zc = avctx->priv_data;
+
+    av_frame_unref(zc->previous_frame);
+}
+
 AVCodec ff_zerocodec_decoder = {
     .type           = AVMEDIA_TYPE_VIDEO,
     .name           = "zerocodec",
@@ -147,7 +152,9 @@
     .priv_data_size = sizeof(ZeroCodecContext),
     .init           = zerocodec_decode_init,
     .decode         = zerocodec_decode_frame,
+    .flush          = zerocodec_decode_flush,
     .close          = zerocodec_decode_close,
     .capabilities   = AV_CODEC_CAP_DR1,
-    .caps_internal  = FF_CODEC_CAP_INIT_THREADSAFE,
+    .caps_internal  = FF_CODEC_CAP_INIT_THREADSAFE |
+                      FF_CODEC_CAP_INIT_CLEANUP,
 };
diff --git a/libavcodec/zmbv.c b/libavcodec/zmbv.c
index 79e0892..02599bf 100644
--- a/libavcodec/zmbv.c
+++ b/libavcodec/zmbv.c
@@ -69,8 +69,8 @@
     int stride;
     int bw, bh, bx, by;
     int decomp_len;
+    int got_keyframe;
     z_stream zstream;
-    int (*decode_intra)(struct ZmbvContext *c);
     int (*decode_xor)(struct ZmbvContext *c);
 } ZmbvContext;
 
@@ -121,6 +121,8 @@
             for (j = 0; j < bh2; j++) {
                 if (my + j < 0 || my + j >= c->height) {
                     memset(out, 0, bw2);
+                } else if (mx >= 0 && mx + bw2 <= c->width){
+                    memcpy(out, tprev, sizeof(*out) * bw2);
                 } else {
                     for (i = 0; i < bw2; i++) {
                         if (mx + i < 0 || mx + i >= c->width)
@@ -193,6 +195,8 @@
             for (j = 0; j < bh2; j++) {
                 if (my + j < 0 || my + j >= c->height) {
                     memset(out, 0, bw2 * 2);
+                } else if (mx >= 0 && mx + bw2 <= c->width){
+                    memcpy(out, tprev, sizeof(*out) * bw2);
                 } else {
                     for (i = 0; i < bw2; i++) {
                         if (mx + i < 0 || mx + i >= c->width)
@@ -270,6 +274,8 @@
             for (j = 0; j < bh2; j++) {
                 if (my + j < 0 || my + j >= c->height) {
                     memset(out, 0, bw2 * 3);
+                } else if (mx >= 0 && mx + bw2 <= c->width){
+                    memcpy(out, tprev, 3 * bw2);
                 } else {
                     for (i = 0; i < bw2; i++){
                         if (mx + i < 0 || mx + i >= c->width) {
@@ -303,7 +309,7 @@
         prev += stride * c->bh;
     }
     if (src - c->decomp_buf != c->decomp_len)
-        av_log(c->avctx, AV_LOG_ERROR, "Used %i of %i bytes\n",
+        av_log(c->avctx, AV_LOG_ERROR, "Used %"PTRDIFF_SPECIFIER" of %i bytes\n",
                src-c->decomp_buf, c->decomp_len);
     return 0;
 }
@@ -351,6 +357,8 @@
             for (j = 0; j < bh2; j++) {
                 if (my + j < 0 || my + j >= c->height) {
                     memset(out, 0, bw2 * 4);
+                } else if (mx >= 0 && mx + bw2 <= c->width){
+                    memcpy(out, tprev, sizeof(*out) * bw2);
                 } else {
                     for (i = 0; i < bw2; i++){
                         if (mx + i < 0 || mx + i >= c->width)
@@ -417,8 +425,7 @@
     c->flags = buf[0];
     buf++; len--;
     if (c->flags & ZMBV_KEYFRAME) {
-        void *decode_intra = NULL;
-        c->decode_intra= NULL;
+        c->got_keyframe = 0;
 
         if (len < 6)
             return AVERROR_INVALIDDATA;
@@ -428,7 +435,6 @@
         c->fmt = buf[3];
         c->bw = buf[4];
         c->bh = buf[5];
-        c->decode_intra = NULL;
         c->decode_xor = NULL;
 
         buf += 6;
@@ -452,7 +458,6 @@
         switch (c->fmt) {
         case ZMBV_FMT_8BPP:
             c->bpp = 8;
-            decode_intra = zmbv_decode_intra;
             c->decode_xor = zmbv_decode_xor_8;
             avctx->pix_fmt = AV_PIX_FMT_PAL8;
             c->stride = c->width;
@@ -460,7 +465,6 @@
         case ZMBV_FMT_15BPP:
         case ZMBV_FMT_16BPP:
             c->bpp = 16;
-            decode_intra = zmbv_decode_intra;
             c->decode_xor = zmbv_decode_xor_16;
             if (c->fmt == ZMBV_FMT_15BPP)
                 avctx->pix_fmt = AV_PIX_FMT_RGB555LE;
@@ -471,15 +475,13 @@
 #ifdef ZMBV_ENABLE_24BPP
         case ZMBV_FMT_24BPP:
             c->bpp = 24;
-            decode_intra = zmbv_decode_intra;
             c->decode_xor = zmbv_decode_xor_24;
-            avctx->pix_fmt = AV_PIX_FMT_RGB24;
+            avctx->pix_fmt = AV_PIX_FMT_BGR24;
             c->stride = c->width * 3;
             break;
 #endif //ZMBV_ENABLE_24BPP
         case ZMBV_FMT_32BPP:
             c->bpp = 32;
-            decode_intra = zmbv_decode_intra;
             c->decode_xor = zmbv_decode_xor_32;
             avctx->pix_fmt = AV_PIX_FMT_BGR0;
             c->stride = c->width * 4;
@@ -509,7 +511,7 @@
         }
         memset(c->cur, 0, avctx->width * avctx->height * (c->bpp / 8));
         memset(c->prev, 0, avctx->width * avctx->height * (c->bpp / 8));
-        c->decode_intra= decode_intra;
+        c->got_keyframe = 1;
     }
     if (c->flags & ZMBV_KEYFRAME) {
         expected_size = avctx->width * avctx->height * (c->bpp / 8);
@@ -520,14 +522,11 @@
         (c->flags & (ZMBV_DELTAPAL | ZMBV_KEYFRAME)))
         expected_size += 768;
 
-    if (!c->decode_intra) {
+    if (!c->got_keyframe) {
         av_log(avctx, AV_LOG_ERROR, "Error! Got no format or no keyframe!\n");
         return AVERROR_INVALIDDATA;
     }
 
-    if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
-        return ret;
-
     if (c->comp == 0) { // uncompressed data
         if (c->decomp_size < len) {
             av_log(avctx, AV_LOG_ERROR, "Buffer too small\n");
@@ -553,10 +552,13 @@
         av_log(avctx, AV_LOG_ERROR, "decompressed size %d is incorrect, expected %d\n", c->decomp_len, expected_size);
         return AVERROR_INVALIDDATA;
     }
+    if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
+        return ret;
+
     if (c->flags & ZMBV_KEYFRAME) {
         frame->key_frame = 1;
         frame->pict_type = AV_PICTURE_TYPE_I;
-        c->decode_intra(c);
+        zmbv_decode_intra(c);
     } else {
         frame->key_frame = 0;
         frame->pict_type = AV_PICTURE_TYPE_P;
diff --git a/libavcodec/zmbvenc.c b/libavcodec/zmbvenc.c
index 4d91476..319381dd 100644
--- a/libavcodec/zmbvenc.c
+++ b/libavcodec/zmbvenc.c
@@ -34,34 +34,53 @@
 
 #include <zlib.h>
 
+/* Frame header flags */
 #define ZMBV_KEYFRAME 1
 #define ZMBV_DELTAPAL 2
 
+/* Motion block width/height (maximum allowed value is 255)
+ * Note: histogram datatype in block_cmp() must be big enough to hold values
+ * up to (4 * ZMBV_BLOCK * ZMBV_BLOCK)
+ */
 #define ZMBV_BLOCK 16
 
+/* Keyframe header format values */
+enum ZmbvFormat {
+    ZMBV_FMT_NONE  = 0,
+    ZMBV_FMT_1BPP  = 1,
+    ZMBV_FMT_2BPP  = 2,
+    ZMBV_FMT_4BPP  = 3,
+    ZMBV_FMT_8BPP  = 4,
+    ZMBV_FMT_15BPP = 5,
+    ZMBV_FMT_16BPP = 6,
+    ZMBV_FMT_24BPP = 7,
+    ZMBV_FMT_32BPP = 8
+};
+
 /**
  * Encoder context
  */
 typedef struct ZmbvEncContext {
     AVCodecContext *avctx;
 
-    int range;
+    int lrange, urange;
     uint8_t *comp_buf, *work_buf;
     uint8_t pal[768];
     uint32_t pal2[256]; //for quick comparisons
-    uint8_t *prev;
+    uint8_t *prev, *prev_buf;
     int pstride;
     int comp_size;
     int keyint, curfrm;
+    int bypp;
+    enum ZmbvFormat fmt;
     z_stream zstream;
 
-    int score_tab[256];
+    int score_tab[ZMBV_BLOCK * ZMBV_BLOCK * 4 + 1];
 } ZmbvEncContext;
 
 
 /** Block comparing function
  * XXX should be optimized and moved to DSPContext
- * TODO handle out of edge ME
  */
 static inline int block_cmp(ZmbvEncContext *c, uint8_t *src, int stride,
                             uint8_t *src2, int stride2, int bw, int bh,
@@ -69,20 +88,27 @@
 {
     int sum = 0;
     int i, j;
-    uint8_t histogram[256] = {0};
+    uint16_t histogram[256] = {0};
+    int bw_bytes = bw * c->bypp;
 
-    *xored = 0;
+    /* Build frequency histogram of byte values for src[] ^ src2[] */
     for(j = 0; j < bh; j++){
-        for(i = 0; i < bw; i++){
+        for(i = 0; i < bw_bytes; i++){
             int t = src[i] ^ src2[i];
             histogram[t]++;
-            *xored |= t;
         }
         src += stride;
         src2 += stride2;
     }
 
-    for(i = 1; i < 256; i++)
+    /* If not all the xored values were 0, then the blocks are different */
+    *xored = (histogram[0] < bw_bytes * bh);
+
+    /* Exit early if blocks are equal */
+    if (!*xored) return 0;
+
+    /* Sum the entropy of all values */
+    for(i = 0; i < 256; i++)
         sum += c->score_tab[histogram[i]];
 
     return sum;
@@ -94,23 +120,42 @@
 static int zmbv_me(ZmbvEncContext *c, uint8_t *src, int sstride, uint8_t *prev,
                    int pstride, int x, int y, int *mx, int *my, int *xored)
 {
-    int dx, dy, tx, ty, tv, bv, bw, bh;
+    int dx, dy, txored, tv, bv, bw, bh;
+    int mx0, my0;
 
-    *mx = *my = 0;
+    mx0 = *mx;
+    my0 = *my;
     bw = FFMIN(ZMBV_BLOCK, c->avctx->width - x);
     bh = FFMIN(ZMBV_BLOCK, c->avctx->height - y);
+
+    /* Try (0,0) */
     bv = block_cmp(c, src, sstride, prev, pstride, bw, bh, xored);
+    *mx = *my = 0;
     if(!bv) return 0;
-    for(ty = FFMAX(y - c->range, 0); ty < FFMIN(y + c->range, c->avctx->height - bh); ty++){
-        for(tx = FFMAX(x - c->range, 0); tx < FFMIN(x + c->range, c->avctx->width - bw); tx++){
-            if(tx == x && ty == y) continue; // we already tested this block
-            dx = tx - x;
-            dy = ty - y;
-            tv = block_cmp(c, src, sstride, prev + dx + dy * pstride, pstride, bw, bh, xored);
+
+    /* Try previous block's MV (if not 0,0) */
+    if (mx0 || my0){
+        tv = block_cmp(c, src, sstride, prev + mx0 * c->bypp + my0 * pstride, pstride, bw, bh, &txored);
+        if(tv < bv){
+            bv = tv;
+            *mx = mx0;
+            *my = my0;
+            *xored = txored;
+            if(!bv) return 0;
+        }
+    }
+
+    /* Try other MVs from top-to-bottom, left-to-right */
+    for(dy = -c->lrange; dy <= c->urange; dy++){
+        for(dx = -c->lrange; dx <= c->urange; dx++){
+            if(!dx && !dy) continue; // we already tested this block
+            if(dx == mx0 && dy == my0) continue; // this one too
+            tv = block_cmp(c, src, sstride, prev + dx * c->bypp + dy * pstride, pstride, bw, bh, &txored);
             if(tv < bv){
                  bv = tv;
                  *mx = dx;
                  *my = dy;
+                 *xored = txored;
                  if(!bv) return 0;
              }
          }
@@ -141,9 +186,10 @@
     avctx->coded_frame->key_frame = keyframe;
 FF_ENABLE_DEPRECATION_WARNINGS
 #endif
-    chpal = !keyframe && memcmp(p->data[1], c->pal2, 1024);
 
-    palptr = (uint32_t*)p->data[1];
+    palptr = (avctx->pix_fmt == AV_PIX_FMT_PAL8) ? (uint32_t *)p->data[1] : NULL;
+    chpal = !keyframe && palptr && memcmp(palptr, c->pal2, 1024);
+
     src = p->data[0];
     prev = c->prev;
     if(chpal){
@@ -157,25 +203,27 @@
             c->pal[i * 3 + 1] = tpal[1];
             c->pal[i * 3 + 2] = tpal[2];
         }
-        memcpy(c->pal2, p->data[1], 1024);
+        memcpy(c->pal2, palptr, 1024);
     }
     if(keyframe){
-        for(i = 0; i < 256; i++){
-            AV_WB24(c->pal+(i*3), palptr[i]);
+        if (palptr){
+            for(i = 0; i < 256; i++){
+                AV_WB24(c->pal+(i*3), palptr[i]);
+            }
+            memcpy(c->work_buf, c->pal, 768);
+            memcpy(c->pal2, palptr, 1024);
+            work_size = 768;
         }
-        memcpy(c->work_buf, c->pal, 768);
-        memcpy(c->pal2, p->data[1], 1024);
-        work_size = 768;
         for(i = 0; i < avctx->height; i++){
-            memcpy(c->work_buf + work_size, src, avctx->width);
+            memcpy(c->work_buf + work_size, src, avctx->width * c->bypp);
             src += p->linesize[0];
-            work_size += avctx->width;
+            work_size += avctx->width * c->bypp;
         }
     }else{
         int x, y, bh2, bw2, xored;
         uint8_t *tsrc, *tprev;
         uint8_t *mv;
-        int mx, my;
+        int mx = 0, my = 0;
 
         bw = (avctx->width + ZMBV_BLOCK - 1) / ZMBV_BLOCK;
         bh = (avctx->height + ZMBV_BLOCK - 1) / ZMBV_BLOCK;
@@ -188,16 +236,16 @@
             for(x = 0; x < avctx->width; x += ZMBV_BLOCK, mv += 2) {
                 bw2 = FFMIN(avctx->width - x, ZMBV_BLOCK);
 
-                tsrc = src + x;
-                tprev = prev + x;
+                tsrc = src + x * c->bypp;
+                tprev = prev + x * c->bypp;
 
                 zmbv_me(c, tsrc, p->linesize[0], tprev, c->pstride, x, y, &mx, &my, &xored);
-                mv[0] = (mx << 1) | !!xored;
-                mv[1] = my << 1;
-                tprev += mx + my * c->pstride;
+                mv[0] = (mx * 2) | !!xored;
+                mv[1] = my * 2;
+                tprev += mx * c->bypp + my * c->pstride;
                 if(xored){
                     for(j = 0; j < bh2; j++){
-                        for(i = 0; i < bw2; i++)
+                        for(i = 0; i < bw2 * c->bypp; i++)
                             c->work_buf[work_size++] = tsrc[i] ^ tprev[i];
                         tsrc += p->linesize[0];
                         tprev += c->pstride;
@@ -212,7 +260,7 @@
     src = p->data[0];
     prev = c->prev;
     for(i = 0; i < avctx->height; i++){
-        memcpy(prev, src, avctx->width);
+        memcpy(prev, src, avctx->width * c->bypp);
         prev += c->pstride;
         src += p->linesize[0];
     }
@@ -243,7 +291,7 @@
         *buf++ = 0; // hi ver
         *buf++ = 1; // lo ver
         *buf++ = 1; // comp
-        *buf++ = 4; // format - 8bpp
+        *buf++ = c->fmt; // format
         *buf++ = ZMBV_BLOCK; // block width
         *buf++ = ZMBV_BLOCK; // block height
     }
@@ -263,7 +311,7 @@
     av_freep(&c->work_buf);
 
     deflateEnd(&c->zstream);
-    av_freep(&c->prev);
+    av_freep(&c->prev_buf);
 
     return 0;
 }
@@ -277,17 +325,54 @@
     int zret; // Zlib return code
     int i;
     int lvl = 9;
+    int prev_size, prev_offset;
 
-    for(i=1; i<256; i++)
-        c->score_tab[i] = -i * log2(i / (double)(ZMBV_BLOCK * ZMBV_BLOCK)) * 256;
+    switch (avctx->pix_fmt) {
+    case AV_PIX_FMT_PAL8:
+        c->fmt = ZMBV_FMT_8BPP;
+        c->bypp = 1;
+        break;
+    case AV_PIX_FMT_RGB555LE:
+        c->fmt = ZMBV_FMT_15BPP;
+        c->bypp = 2;
+        break;
+    case AV_PIX_FMT_RGB565LE:
+        c->fmt = ZMBV_FMT_16BPP;
+        c->bypp = 2;
+        break;
+#ifdef ZMBV_ENABLE_24BPP
+    case AV_PIX_FMT_BGR24:
+        c->fmt = ZMBV_FMT_24BPP;
+        c->bypp = 3;
+        break;
+#endif //ZMBV_ENABLE_24BPP
+    case AV_PIX_FMT_BGR0:
+        c->fmt = ZMBV_FMT_32BPP;
+        c->bypp = 4;
+        break;
+    default:
+        av_log(avctx, AV_LOG_INFO, "unsupported pixel format\n");
+        return AVERROR(EINVAL);
+    }
+
+    /* Entropy-based score tables for comparing blocks.
+     * Suitable for blocks up to (ZMBV_BLOCK * ZMBV_BLOCK) bytes.
+     * Scores are nonnegative, lower is better.
+     */
+    for(i = 1; i <= ZMBV_BLOCK * ZMBV_BLOCK * c->bypp; i++)
+        c->score_tab[i] = -i * log2(i / (double)(ZMBV_BLOCK * ZMBV_BLOCK * c->bypp)) * 256;
 
     c->avctx = avctx;
 
     c->curfrm = 0;
     c->keyint = avctx->keyint_min;
-    c->range = 8;
-    if(avctx->me_range > 0)
-        c->range = FFMIN(avctx->me_range, 127);
+
+    /* Motion estimation range: maximum distance is -64..63 */
+    c->lrange = c->urange = 8;
+    if(avctx->me_range > 0){
+        c->lrange = FFMIN(avctx->me_range, 64);
+        c->urange = FFMIN(avctx->me_range, 63);
+    }
 
     if(avctx->compression_level >= 0)
         lvl = avctx->compression_level;
@@ -298,7 +383,7 @@
 
     // Needed if zlib unused or init aborted before deflateInit
     memset(&c->zstream, 0, sizeof(z_stream));
-    c->comp_size = avctx->width * avctx->height + 1024 +
+    c->comp_size = avctx->width * c->bypp * avctx->height + 1024 +
         ((avctx->width + ZMBV_BLOCK - 1) / ZMBV_BLOCK) * ((avctx->height + ZMBV_BLOCK - 1) / ZMBV_BLOCK) * 2 + 4;
     if (!(c->work_buf = av_malloc(c->comp_size))) {
         av_log(avctx, AV_LOG_ERROR, "Can't allocate work buffer.\n");
@@ -313,11 +398,23 @@
         av_log(avctx, AV_LOG_ERROR, "Can't allocate compression buffer.\n");
         return AVERROR(ENOMEM);
     }
-    c->pstride = FFALIGN(avctx->width, 16);
-    if (!(c->prev = av_malloc(c->pstride * avctx->height))) {
+
+    /* Allocate prev buffer - pad around the image to allow out-of-edge ME:
+     * - The image should be padded with `lrange` rows before and `urange` rows
+     *   after.
+     * - The stride should be padded with `lrange` pixels, then rounded up to a
+     *   multiple of 16 bytes.
+     * - The first row should also be padded with `lrange` pixels before, then
+     *   aligned up to a multiple of 16 bytes.
+     */
+    c->pstride = FFALIGN((avctx->width + c->lrange) * c->bypp, 16);
+    prev_size = FFALIGN(c->lrange * c->bypp, 16) + c->pstride * (c->lrange + avctx->height + c->urange);
+    prev_offset = FFALIGN(c->lrange * c->bypp, 16) + c->pstride * c->lrange;
+    if (!(c->prev_buf = av_mallocz(prev_size))) {
         av_log(avctx, AV_LOG_ERROR, "Can't allocate picture.\n");
         return AVERROR(ENOMEM);
     }
+    c->prev = c->prev_buf + prev_offset;
 
     c->zstream.zalloc = Z_NULL;
     c->zstream.zfree = Z_NULL;
@@ -340,5 +437,12 @@
     .init           = encode_init,
     .encode2        = encode_frame,
     .close          = encode_end,
-    .pix_fmts       = (const enum AVPixelFormat[]){ AV_PIX_FMT_PAL8, AV_PIX_FMT_NONE },
+    .pix_fmts       = (const enum AVPixelFormat[]) { AV_PIX_FMT_PAL8,
+                                                     AV_PIX_FMT_RGB555LE,
+                                                     AV_PIX_FMT_RGB565LE,
+#ifdef ZMBV_ENABLE_24BPP
+                                                     AV_PIX_FMT_BGR24,
+#endif //ZMBV_ENABLE_24BPP
+                                                     AV_PIX_FMT_BGR0,
+                                                     AV_PIX_FMT_NONE },
 };
diff --git a/libavdevice/Makefile b/libavdevice/Makefile
index f11a6f2..6ea62b9 100644
--- a/libavdevice/Makefile
+++ b/libavdevice/Makefile
@@ -20,8 +20,6 @@
 OBJS-$(CONFIG_CACA_OUTDEV)               += caca.o
 OBJS-$(CONFIG_DECKLINK_OUTDEV)           += decklink_enc.o decklink_enc_c.o decklink_common.o
 OBJS-$(CONFIG_DECKLINK_INDEV)            += decklink_dec.o decklink_dec_c.o decklink_common.o
-OBJS-$(CONFIG_LIBNDI_NEWTEK_OUTDEV)      += libndi_newtek_enc.o
-OBJS-$(CONFIG_LIBNDI_NEWTEK_INDEV)       += libndi_newtek_dec.o
 OBJS-$(CONFIG_DSHOW_INDEV)               += dshow_crossbar.o dshow.o dshow_enummediatypes.o \
                                             dshow_enumpins.o dshow_filter.o \
                                             dshow_pin.o dshow_common.o
@@ -61,8 +59,6 @@
 SKIPHEADERS                              += decklink_common.h
 SKIPHEADERS-$(CONFIG_DECKLINK)           += decklink_enc.h decklink_dec.h \
                                             decklink_common_c.h
-SKIPHEADERS-$(CONFIG_LIBNDI_NEWTEK_INDEV) += libndi_newtek_common.h
-SKIPHEADERS-$(CONFIG_LIBNDI_NEWTEK_OUTDEV) += libndi_newtek_common.h
 SKIPHEADERS-$(CONFIG_DSHOW_INDEV)        += dshow_capture.h
 SKIPHEADERS-$(CONFIG_FBDEV_INDEV)        += fbdev_common.h
 SKIPHEADERS-$(CONFIG_FBDEV_OUTDEV)       += fbdev_common.h
diff --git a/libavdevice/alldevices.c b/libavdevice/alldevices.c
index adde749..8633433 100644
--- a/libavdevice/alldevices.c
+++ b/libavdevice/alldevices.c
@@ -32,8 +32,6 @@
 extern AVOutputFormat ff_caca_muxer;
 extern AVInputFormat  ff_decklink_demuxer;
 extern AVOutputFormat ff_decklink_muxer;
-extern AVInputFormat  ff_libndi_newtek_demuxer;
-extern AVOutputFormat ff_libndi_newtek_muxer;
 extern AVInputFormat  ff_dshow_demuxer;
 extern AVInputFormat  ff_fbdev_demuxer;
 extern AVOutputFormat ff_fbdev_muxer;
diff --git a/libavdevice/alsa.c b/libavdevice/alsa.c
index 1b21beb..117b2ea 100644
--- a/libavdevice/alsa.c
+++ b/libavdevice/alsa.c
@@ -300,8 +300,10 @@
 {
     AlsaData *s = s1->priv_data;
 
-    snd_pcm_nonblock(s->h, 0);
-    snd_pcm_drain(s->h);
+    if (snd_pcm_stream(s->h) == SND_PCM_STREAM_PLAYBACK) {
+        snd_pcm_nonblock(s->h, 0);
+        snd_pcm_drain(s->h);
+    }
     av_freep(&s->reorder_buf);
     if (CONFIG_ALSA_INDEV)
         ff_timefilter_destroy(s->timefilter);
diff --git a/libavdevice/alsa_dec.c b/libavdevice/alsa_dec.c
index c50ce71..36494e9 100644
--- a/libavdevice/alsa_dec.c
+++ b/libavdevice/alsa_dec.c
@@ -148,7 +148,7 @@
 };
 
 static const AVClass alsa_demuxer_class = {
-    .class_name     = "ALSA demuxer",
+    .class_name     = "ALSA indev",
     .item_name      = av_default_item_name,
     .option         = options,
     .version        = LIBAVUTIL_VERSION_INT,
diff --git a/libavdevice/alsa_enc.c b/libavdevice/alsa_enc.c
index 0bef625..1a6d01e 100644
--- a/libavdevice/alsa_enc.c
+++ b/libavdevice/alsa_enc.c
@@ -151,7 +151,7 @@
 }
 
 static const AVClass alsa_muxer_class = {
-    .class_name     = "ALSA muxer",
+    .class_name     = "ALSA outdev",
     .item_name      = av_default_item_name,
     .version        = LIBAVUTIL_VERSION_INT,
     .category       = AV_CLASS_CATEGORY_DEVICE_AUDIO_OUTPUT,
diff --git a/libavdevice/avdevice.c b/libavdevice/avdevice.c
index 72e1b67..3d03d89 100644
--- a/libavdevice/avdevice.c
+++ b/libavdevice/avdevice.c
@@ -75,7 +75,7 @@
 const char * avdevice_license(void)
 {
 #define LICENSE_PREFIX "libavdevice license: "
-    return LICENSE_PREFIX FFMPEG_LICENSE + sizeof(LICENSE_PREFIX) - 1;
+    return &LICENSE_PREFIX FFMPEG_LICENSE[sizeof(LICENSE_PREFIX) - 1];
 }
 
 static void *device_next(void *prev, int output,
diff --git a/libavdevice/avfoundation.m b/libavdevice/avfoundation.m
index 98552ac..0b18886 100644
--- a/libavdevice/avfoundation.m
+++ b/libavdevice/avfoundation.m
@@ -88,7 +88,6 @@
     int64_t         first_pts;
     int64_t         first_audio_pts;
     pthread_mutex_t frame_lock;
-    pthread_cond_t  frame_wait_cond;
     id              avf_delegate;
     id              avf_audio_delegate;
 
@@ -97,6 +96,10 @@
 
     int             capture_cursor;
     int             capture_mouse_clicks;
+    int             capture_raw_data;
+    int             drop_late_frames;
+    int             video_is_muxed;
+    int             video_is_screen;
 
     int             list_devices;
     int             video_device_index;
@@ -127,6 +130,10 @@
     AVCaptureAudioDataOutput *audio_output;
     CMSampleBufferRef         current_frame;
     CMSampleBufferRef         current_audio_frame;
+
+    AVCaptureDevice          *observed_device;
+    AVCaptureDeviceTransportControlsPlaybackMode observed_mode;
+    int                      observed_quit;
 } AVFContext;
 
 static void lock_frames(AVFContext* ctx)
@@ -160,10 +167,56 @@
 {
     if (self = [super init]) {
         _context = context;
+
+        // start observing if a device is set for it
+#if !TARGET_OS_IPHONE && __MAC_OS_X_VERSION_MIN_REQUIRED >= 1070
+        if (_context->observed_device) {
+            NSString *keyPath = NSStringFromSelector(@selector(transportControlsPlaybackMode));
+            NSKeyValueObservingOptions options = NSKeyValueObservingOptionNew;
+
+            [_context->observed_device addObserver: self
+                                        forKeyPath: keyPath
+                                           options: options
+                                           context: _context];
+        }
+#endif
     }
     return self;
 }
 
+- (void)dealloc {
+    // stop observing if a device is set for it
+#if !TARGET_OS_IPHONE && __MAC_OS_X_VERSION_MIN_REQUIRED >= 1070
+    if (_context->observed_device) {
+        NSString *keyPath = NSStringFromSelector(@selector(transportControlsPlaybackMode));
+        [_context->observed_device removeObserver: self forKeyPath: keyPath];
+    }
+#endif
+    [super dealloc];
+}
+
+- (void)observeValueForKeyPath:(NSString *)keyPath
+                      ofObject:(id)object
+                        change:(NSDictionary *)change
+                       context:(void *)context {
+    if (context == _context) {
+        AVCaptureDeviceTransportControlsPlaybackMode mode =
+            [change[NSKeyValueChangeNewKey] integerValue];
+
+        if (mode != _context->observed_mode) {
+            if (mode == AVCaptureDeviceTransportControlsNotPlayingMode) {
+                _context->observed_quit = 1;
+            }
+            _context->observed_mode = mode;
+        }
+    } else {
+        [super observeValueForKeyPath: keyPath
+                             ofObject: object
+                               change: change
+                              context: context];
+    }
+}
+
 - (void)  captureOutput:(AVCaptureOutput *)captureOutput
   didOutputSampleBuffer:(CMSampleBufferRef)videoFrame
          fromConnection:(AVCaptureConnection *)connection
@@ -176,8 +229,6 @@
 
     _context->current_frame = (CMSampleBufferRef)CFRetain(videoFrame);
 
-    pthread_cond_signal(&_context->frame_wait_cond);
-
     unlock_frames(_context);
 
     ++_context->frames_captured;
@@ -222,8 +273,6 @@
 
     _context->current_audio_frame = (CMSampleBufferRef)CFRetain(audioFrame);
 
-    pthread_cond_signal(&_context->frame_wait_cond);
-
     unlock_frames(_context);
 
     ++_context->audio_frames_captured;
@@ -250,7 +299,6 @@
     av_freep(&ctx->audio_buffer);
 
     pthread_mutex_destroy(&ctx->frame_lock);
-    pthread_cond_destroy(&ctx->frame_wait_cond);
 
     if (ctx->current_frame) {
         CFRelease(ctx->current_frame);
@@ -291,51 +339,65 @@
     NSObject *selected_range = nil;
     NSObject *selected_format = nil;
 
-    for (format in [video_device valueForKey:@"formats"]) {
-        CMFormatDescriptionRef formatDescription;
-        CMVideoDimensions dimensions;
+    // try to configure format by formats list
+    // might raise an exception if no format list is given
+    // (then fallback to default, no configuration)
+    @try {
+        for (format in [video_device valueForKey:@"formats"]) {
+            CMFormatDescriptionRef formatDescription;
+            CMVideoDimensions dimensions;
 
-        formatDescription = (CMFormatDescriptionRef) [format performSelector:@selector(formatDescription)];
-        dimensions = CMVideoFormatDescriptionGetDimensions(formatDescription);
+            formatDescription = (CMFormatDescriptionRef) [format performSelector:@selector(formatDescription)];
+            dimensions = CMVideoFormatDescriptionGetDimensions(formatDescription);
 
-        if ((ctx->width == 0 && ctx->height == 0) ||
-            (dimensions.width == ctx->width && dimensions.height == ctx->height)) {
+            if ((ctx->width == 0 && ctx->height == 0) ||
+                (dimensions.width == ctx->width && dimensions.height == ctx->height)) {
 
-            selected_format = format;
+                selected_format = format;
 
-            for (range in [format valueForKey:@"videoSupportedFrameRateRanges"]) {
-                double max_framerate;
+                for (range in [format valueForKey:@"videoSupportedFrameRateRanges"]) {
+                    double max_framerate;
 
-                [[range valueForKey:@"maxFrameRate"] getValue:&max_framerate];
-                if (fabs (framerate - max_framerate) < 0.01) {
-                    selected_range = range;
-                    break;
+                    [[range valueForKey:@"maxFrameRate"] getValue:&max_framerate];
+                    if (fabs (framerate - max_framerate) < 0.01) {
+                        selected_range = range;
+                        break;
+                    }
                 }
             }
         }
-    }
 
-    if (!selected_format) {
-        av_log(s, AV_LOG_ERROR, "Selected video size (%dx%d) is not supported by the device\n",
-            ctx->width, ctx->height);
-        goto unsupported_format;
-    }
+        if (!selected_format) {
+            av_log(s, AV_LOG_ERROR, "Selected video size (%dx%d) is not supported by the device.\n",
+                ctx->width, ctx->height);
+            goto unsupported_format;
+        }
 
-    if (!selected_range) {
-        av_log(s, AV_LOG_ERROR, "Selected framerate (%f) is not supported by the device\n",
-            framerate);
-        goto unsupported_format;
-    }
+        if (!selected_range) {
+            av_log(s, AV_LOG_ERROR, "Selected framerate (%f) is not supported by the device.\n",
+                framerate);
+            if (ctx->video_is_muxed) {
+                av_log(s, AV_LOG_ERROR, "Falling back to default.\n");
+            } else {
+                goto unsupported_format;
+            }
+        }
 
-    if ([video_device lockForConfiguration:NULL] == YES) {
-        NSValue *min_frame_duration = [selected_range valueForKey:@"minFrameDuration"];
-
-        [video_device setValue:selected_format forKey:@"activeFormat"];
-        [video_device setValue:min_frame_duration forKey:@"activeVideoMinFrameDuration"];
-        [video_device setValue:min_frame_duration forKey:@"activeVideoMaxFrameDuration"];
-    } else {
-        av_log(s, AV_LOG_ERROR, "Could not lock device for configuration");
-        return AVERROR(EINVAL);
+        if ([video_device lockForConfiguration:NULL] == YES) {
+            if (selected_format) {
+                [video_device setValue:selected_format forKey:@"activeFormat"];
+            }
+            if (selected_range) {
+                NSValue *min_frame_duration = [selected_range valueForKey:@"minFrameDuration"];
+                [video_device setValue:min_frame_duration forKey:@"activeVideoMinFrameDuration"];
+                [video_device setValue:min_frame_duration forKey:@"activeVideoMaxFrameDuration"];
+            }
+        } else {
+            av_log(s, AV_LOG_ERROR, "Could not lock device for configuration.\n");
+            return AVERROR(EINVAL);
+        }
+    } @catch(NSException *e) {
+        av_log(ctx, AV_LOG_WARNING, "Configuration of video device failed, falling back to default.\n");
     }
 
     return 0;
@@ -468,13 +530,32 @@
         }
     }
 
-    ctx->pixel_format          = pxl_fmt_spec.ff_id;
-    pixel_format = [NSNumber numberWithUnsignedInt:pxl_fmt_spec.avf_id];
-    capture_dict = [NSDictionary dictionaryWithObject:pixel_format
-                                               forKey:(id)kCVPixelBufferPixelFormatTypeKey];
+    // set videoSettings to an empty dict for receiving raw data of muxed devices
+    if (ctx->capture_raw_data) {
+        ctx->pixel_format = pxl_fmt_spec.ff_id;
+        ctx->video_output.videoSettings = @{ };
+    } else {
+        ctx->pixel_format = pxl_fmt_spec.ff_id;
+        pixel_format = [NSNumber numberWithUnsignedInt:pxl_fmt_spec.avf_id];
+        capture_dict = [NSDictionary dictionaryWithObject:pixel_format
+                                                   forKey:(id)kCVPixelBufferPixelFormatTypeKey];
 
-    [ctx->video_output setVideoSettings:capture_dict];
-    [ctx->video_output setAlwaysDiscardsLateVideoFrames:YES];
+        [ctx->video_output setVideoSettings:capture_dict];
+    }
+    [ctx->video_output setAlwaysDiscardsLateVideoFrames:ctx->drop_late_frames];
+
+#if !TARGET_OS_IPHONE && __MAC_OS_X_VERSION_MIN_REQUIRED >= 1070
+    // check for transport control support and set observer device if supported
+    if (!ctx->video_is_screen) {
+        int trans_ctrl = [video_device transportControlsSupported];
+        AVCaptureDeviceTransportControlsPlaybackMode trans_mode = [video_device transportControlsPlaybackMode];
+
+        if (trans_ctrl) {
+            ctx->observed_mode   = trans_mode;
+            ctx->observed_device = video_device;
+        }
+    }
+#endif
 
     ctx->avf_delegate = [[AVFFrameReceiver alloc] initWithContext:ctx];
 
@@ -540,6 +621,7 @@
 {
     AVFContext *ctx = (AVFContext*)s->priv_data;
     CVImageBufferRef image_buffer;
+    CMBlockBufferRef block_buffer;
     CGSize image_buffer_size;
     AVStream* stream = avformat_new_stream(s, NULL);
 
@@ -558,14 +640,22 @@
 
     avpriv_set_pts_info(stream, 64, 1, avf_time_base);
 
-    image_buffer      = CMSampleBufferGetImageBuffer(ctx->current_frame);
-    image_buffer_size = CVImageBufferGetEncodedSize(image_buffer);
+    image_buffer = CMSampleBufferGetImageBuffer(ctx->current_frame);
+    block_buffer = CMSampleBufferGetDataBuffer(ctx->current_frame);
 
-    stream->codecpar->codec_id   = AV_CODEC_ID_RAWVIDEO;
-    stream->codecpar->codec_type = AVMEDIA_TYPE_VIDEO;
-    stream->codecpar->width      = (int)image_buffer_size.width;
-    stream->codecpar->height     = (int)image_buffer_size.height;
-    stream->codecpar->format     = ctx->pixel_format;
+    if (image_buffer) {
+        image_buffer_size = CVImageBufferGetEncodedSize(image_buffer);
+
+        stream->codecpar->codec_id   = AV_CODEC_ID_RAWVIDEO;
+        stream->codecpar->codec_type = AVMEDIA_TYPE_VIDEO;
+        stream->codecpar->width      = (int)image_buffer_size.width;
+        stream->codecpar->height     = (int)image_buffer_size.height;
+        stream->codecpar->format     = ctx->pixel_format;
+    } else {
+        stream->codecpar->codec_id   = AV_CODEC_ID_DVVIDEO;
+        stream->codecpar->codec_type = AVMEDIA_TYPE_VIDEO;
+        stream->codecpar->format     = ctx->pixel_format;
+    }
 
     CFRelease(ctx->current_frame);
     ctx->current_frame = nil;
@@ -663,20 +753,19 @@
 static int avf_read_header(AVFormatContext *s)
 {
     NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
-    int capture_screen      = 0;
     uint32_t num_screens    = 0;
     AVFContext *ctx         = (AVFContext*)s->priv_data;
     AVCaptureDevice *video_device = nil;
     AVCaptureDevice *audio_device = nil;
     // Find capture device
     NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];
-    ctx->num_video_devices = [devices count];
+    NSArray *devices_muxed = [AVCaptureDevice devicesWithMediaType:AVMediaTypeMuxed];
 
+    ctx->num_video_devices = [devices count] + [devices_muxed count];
     ctx->first_pts          = av_gettime();
     ctx->first_audio_pts    = av_gettime();
 
     pthread_mutex_init(&ctx->frame_lock, NULL);
-    pthread_cond_init(&ctx->frame_wait_cond, NULL);
 
 #if !TARGET_OS_IPHONE && __MAC_OS_X_VERSION_MIN_REQUIRED >= 1070
     CGGetActiveDisplayList(0, NULL, &num_screens);
@@ -690,14 +779,18 @@
             const char *name = [[device localizedName] UTF8String];
             index            = [devices indexOfObject:device];
             av_log(ctx, AV_LOG_INFO, "[%d] %s\n", index, name);
-            index++;
+        }
+        for (AVCaptureDevice *device in devices_muxed) {
+            const char *name = [[device localizedName] UTF8String];
+            index            = [devices count] + [devices_muxed indexOfObject:device];
+            av_log(ctx, AV_LOG_INFO, "[%d] %s\n", index, name);
         }
 #if !TARGET_OS_IPHONE && __MAC_OS_X_VERSION_MIN_REQUIRED >= 1070
         if (num_screens > 0) {
             CGDirectDisplayID screens[num_screens];
             CGGetActiveDisplayList(num_screens, screens, &num_screens);
             for (int i = 0; i < num_screens; i++) {
-                av_log(ctx, AV_LOG_INFO, "[%d] Capture screen %d\n", index + i, i);
+                av_log(ctx, AV_LOG_INFO, "[%d] Capture screen %d\n", ctx->num_video_devices + i, i);
             }
         }
 #endif
@@ -725,7 +818,12 @@
 
     if (ctx->video_device_index >= 0) {
         if (ctx->video_device_index < ctx->num_video_devices) {
-            video_device = [devices objectAtIndex:ctx->video_device_index];
+            if (ctx->video_device_index < [devices count]) {
+                video_device = [devices objectAtIndex:ctx->video_device_index];
+            } else {
+                video_device = [devices_muxed objectAtIndex:(ctx->video_device_index - [devices count])];
+                ctx->video_is_muxed = 1;
+            }
         } else if (ctx->video_device_index < ctx->num_video_devices + num_screens) {
 #if !TARGET_OS_IPHONE && __MAC_OS_X_VERSION_MIN_REQUIRED >= 1070
             CGDirectDisplayID screens[num_screens];
@@ -751,7 +849,7 @@
             }
 
             video_device = (AVCaptureDevice*) capture_screen_input;
-            capture_screen = 1;
+            ctx->video_is_screen = 1;
 #endif
          } else {
             av_log(ctx, AV_LOG_ERROR, "Invalid device index\n");
@@ -769,6 +867,14 @@
                 break;
             }
         }
+        // looking for muxed inputs
+        for (AVCaptureDevice *device in devices_muxed) {
+            if (!strncmp(ctx->video_filename, [[device localizedName] UTF8String], strlen(ctx->video_filename))) {
+                video_device = device;
+                ctx->video_is_muxed = 1;
+                break;
+            }
+        }
 
 #if !TARGET_OS_IPHONE && __MAC_OS_X_VERSION_MIN_REQUIRED >= 1070
         // looking for screen inputs
@@ -780,7 +886,7 @@
                 AVCaptureScreenInput* capture_screen_input = [[[AVCaptureScreenInput alloc] initWithDisplayID:screens[idx]] autorelease];
                 video_device = (AVCaptureDevice*) capture_screen_input;
                 ctx->video_device_index = ctx->num_video_devices + idx;
-                capture_screen = 1;
+                ctx->video_is_screen = 1;
 
                 if (ctx->framerate.num > 0) {
                     capture_screen_input.minFrameDuration = CMTimeMake(ctx->framerate.den, ctx->framerate.num);
@@ -871,7 +977,7 @@
 
     /* Unlock device configuration only after the session is started so it
      * does not reset the capture formats */
-    if (!capture_screen) {
+    if (!ctx->video_is_screen) {
         [video_device unlockForConfiguration];
     }
 
@@ -909,7 +1015,7 @@
 
     status = CVPixelBufferLockBaseAddress(image_buffer, 0);
     if (status != kCVReturnSuccess) {
-        av_log(s, AV_LOG_ERROR, "Could not lock base address: %d\n", status);
+        av_log(s, AV_LOG_ERROR, "Could not lock base address: %d (%dx%d)\n", status, width, height);
         return AVERROR_EXTERNAL;
     }
 
@@ -942,13 +1048,25 @@
 
     do {
         CVImageBufferRef image_buffer;
+        CMBlockBufferRef block_buffer;
         lock_frames(ctx);
 
-        image_buffer = CMSampleBufferGetImageBuffer(ctx->current_frame);
-
         if (ctx->current_frame != nil) {
             int status;
-            if (av_new_packet(pkt, (int)CVPixelBufferGetDataSize(image_buffer)) < 0) {
+            int length = 0;
+
+            image_buffer = CMSampleBufferGetImageBuffer(ctx->current_frame);
+            block_buffer = CMSampleBufferGetDataBuffer(ctx->current_frame);
+
+            if (image_buffer != nil) {
+                length = (int)CVPixelBufferGetDataSize(image_buffer);
+            } else if (block_buffer != nil) {
+                length = (int)CMBlockBufferGetDataLength(block_buffer);
+            } else  {
+                return AVERROR(EINVAL);
+            }
+
+            if (av_new_packet(pkt, length) < 0) {
                 return AVERROR(EIO);
             }
 
@@ -963,7 +1081,15 @@
             pkt->stream_index  = ctx->video_stream_index;
             pkt->flags        |= AV_PKT_FLAG_KEY;
 
-            status = copy_cvpixelbuffer(s, image_buffer, pkt);
+            if (image_buffer) {
+                status = copy_cvpixelbuffer(s, image_buffer, pkt);
+            } else {
+                status = 0;
+                OSStatus ret = CMBlockBufferCopyDataBytes(block_buffer, 0, pkt->size, pkt->data);
+                if (ret != kCMBlockBufferNoErr) {
+                    status = AVERROR(EIO);
+                }
+             }
             CFRelease(ctx->current_frame);
             ctx->current_frame = nil;
 
@@ -1040,7 +1166,12 @@
             ctx->current_audio_frame = nil;
         } else {
             pkt->data = NULL;
-            pthread_cond_wait(&ctx->frame_wait_cond, &ctx->frame_lock);
+            unlock_frames(ctx);
+            if (ctx->observed_quit) {
+                return AVERROR_EOF;
+            } else {
+                return AVERROR(EAGAIN);
+            }
         }
 
         unlock_frames(ctx);
@@ -1057,22 +1188,22 @@
 }
 
 static const AVOption options[] = {
-    { "list_devices", "list available devices", offsetof(AVFContext, list_devices), AV_OPT_TYPE_INT, {.i64=0}, 0, 1, AV_OPT_FLAG_DECODING_PARAM, "list_devices" },
-    { "true", "", 0, AV_OPT_TYPE_CONST, {.i64=1}, 0, 0, AV_OPT_FLAG_DECODING_PARAM, "list_devices" },
-    { "false", "", 0, AV_OPT_TYPE_CONST, {.i64=0}, 0, 0, AV_OPT_FLAG_DECODING_PARAM, "list_devices" },
+    { "list_devices", "list available devices", offsetof(AVFContext, list_devices), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, AV_OPT_FLAG_DECODING_PARAM },
     { "video_device_index", "select video device by index for devices with same name (starts at 0)", offsetof(AVFContext, video_device_index), AV_OPT_TYPE_INT, {.i64 = -1}, -1, INT_MAX, AV_OPT_FLAG_DECODING_PARAM },
     { "audio_device_index", "select audio device by index for devices with same name (starts at 0)", offsetof(AVFContext, audio_device_index), AV_OPT_TYPE_INT, {.i64 = -1}, -1, INT_MAX, AV_OPT_FLAG_DECODING_PARAM },
     { "pixel_format", "set pixel format", offsetof(AVFContext, pixel_format), AV_OPT_TYPE_PIXEL_FMT, {.i64 = AV_PIX_FMT_YUV420P}, 0, INT_MAX, AV_OPT_FLAG_DECODING_PARAM},
     { "framerate", "set frame rate", offsetof(AVFContext, framerate), AV_OPT_TYPE_VIDEO_RATE, {.str = "ntsc"}, 0, INT_MAX, AV_OPT_FLAG_DECODING_PARAM },
     { "video_size", "set video size", offsetof(AVFContext, width), AV_OPT_TYPE_IMAGE_SIZE, {.str = NULL}, 0, 0, AV_OPT_FLAG_DECODING_PARAM },
-    { "capture_cursor", "capture the screen cursor", offsetof(AVFContext, capture_cursor), AV_OPT_TYPE_INT, {.i64=0}, 0, 1, AV_OPT_FLAG_DECODING_PARAM },
-    { "capture_mouse_clicks", "capture the screen mouse clicks", offsetof(AVFContext, capture_mouse_clicks), AV_OPT_TYPE_INT, {.i64=0}, 0, 1, AV_OPT_FLAG_DECODING_PARAM },
+    { "capture_cursor", "capture the screen cursor", offsetof(AVFContext, capture_cursor), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, AV_OPT_FLAG_DECODING_PARAM },
+    { "capture_mouse_clicks", "capture the screen mouse clicks", offsetof(AVFContext, capture_mouse_clicks), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, AV_OPT_FLAG_DECODING_PARAM },
+    { "capture_raw_data", "capture the raw data from device connection", offsetof(AVFContext, capture_raw_data), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, AV_OPT_FLAG_DECODING_PARAM },
+    { "drop_late_frames", "drop frames that are available later than expected", offsetof(AVFContext, drop_late_frames), AV_OPT_TYPE_BOOL, {.i64=1}, 0, 1, AV_OPT_FLAG_DECODING_PARAM },
 
     { NULL },
 };
 
 static const AVClass avf_class = {
-    .class_name = "AVFoundation input device",
+    .class_name = "AVFoundation indev",
     .item_name  = av_default_item_name,
     .option     = options,
     .version    = LIBAVUTIL_VERSION_INT,
diff --git a/libavdevice/bktr.c b/libavdevice/bktr.c
index 993cc19..2601adb 100644
--- a/libavdevice/bktr.c
+++ b/libavdevice/bktr.c
@@ -341,7 +341,7 @@
 };
 
 static const AVClass bktr_class = {
-    .class_name = "BKTR grab interface",
+    .class_name = "BKTR grab indev",
     .item_name  = av_default_item_name,
     .option     = options,
     .version    = LIBAVUTIL_VERSION_INT,
diff --git a/libavdevice/caca.c b/libavdevice/caca.c
index 47de824..be3ff79 100644
--- a/libavdevice/caca.c
+++ b/libavdevice/caca.c
@@ -220,7 +220,7 @@
 };
 
 static const AVClass caca_class = {
-    .class_name = "caca_outdev",
+    .class_name = "caca outdev",
     .item_name  = av_default_item_name,
     .option     = options,
     .version    = LIBAVUTIL_VERSION_INT,
diff --git a/libavdevice/decklink_common.cpp b/libavdevice/decklink_common.cpp
index b88d6c6..53b57ff 100644
--- a/libavdevice/decklink_common.cpp
+++ b/libavdevice/decklink_common.cpp
@@ -77,13 +77,13 @@
     return iter;
 }
 
-int decklink_get_attr_string(IDeckLink *dl, BMDDeckLinkAttributeID cfg_id, const char **s)
+static int decklink_get_attr_string(IDeckLink *dl, BMDDeckLinkAttributeID cfg_id, const char **s)
 {
     DECKLINK_STR tmp;
     HRESULT hr;
-    IDeckLinkAttributes *attr;
+    IDeckLinkProfileAttributes *attr;
     *s = NULL;
-    if (dl->QueryInterface(IID_IDeckLinkAttributes, (void **)&attr) != S_OK)
+    if (dl->QueryInterface(IID_IDeckLinkProfileAttributes, (void **)&attr) != S_OK)
         return AVERROR_EXTERNAL;
     hr = attr->GetString(cfg_id, &tmp);
     attr->Release();
@@ -149,11 +149,28 @@
     if (ctx->duplex_mode) {
         DECKLINK_BOOL duplex_supported = false;
 
+#if BLACKMAGIC_DECKLINK_API_VERSION >= 0x0b000000
+        IDeckLinkProfileManager *manager = NULL;
+        if (ctx->dl->QueryInterface(IID_IDeckLinkProfileManager, (void **)&manager) == S_OK)
+            duplex_supported = true;
+#else
         if (ctx->attr->GetFlag(BMDDeckLinkSupportsDuplexModeConfiguration, &duplex_supported) != S_OK)
             duplex_supported = false;
+#endif
 
         if (duplex_supported) {
+#if BLACKMAGIC_DECKLINK_API_VERSION >= 0x0b000000
+            IDeckLinkProfile *profile = NULL;
+            BMDProfileID bmd_profile_id = ctx->duplex_mode == 2 ? bmdProfileOneSubDeviceFullDuplex : bmdProfileTwoSubDevicesHalfDuplex;
+            res = manager->GetProfile(bmd_profile_id, &profile);
+            if (res == S_OK) {
+                res = profile->SetActive();
+                profile->Release();
+            }
+            manager->Release();
+#else
             res = ctx->cfg->SetInt(bmdDeckLinkConfigDuplexMode, ctx->duplex_mode == 2 ? bmdDuplexModeFull : bmdDuplexModeHalf);
+#endif
             if (res != S_OK)
                 av_log(avctx, AV_LOG_WARNING, "Setting duplex mode failed.\n");
             else
@@ -171,6 +188,11 @@
         if (ret < 0)
             return ret;
     }
+    if (direction == DIRECTION_OUT && cctx->timing_offset != INT_MIN) {
+        res = ctx->cfg->SetInt(bmdDeckLinkConfigReferenceInputTimingOffset, cctx->timing_offset);
+        if (res != S_OK)
+            av_log(avctx, AV_LOG_WARNING, "Setting timing offset failed.\n");
+    }
     return 0;
 }
 
@@ -178,18 +200,22 @@
                                int width, int height,
                                int tb_num, int tb_den,
                                enum AVFieldOrder field_order,
-                               decklink_direction_t direction, int num)
+                               decklink_direction_t direction)
 {
     struct decklink_cctx *cctx = (struct decklink_cctx *)avctx->priv_data;
     struct decklink_ctx *ctx = (struct decklink_ctx *)cctx->ctx;
+#if BLACKMAGIC_DECKLINK_API_VERSION >= 0x0b000000
+    DECKLINK_BOOL support;
+#else
     BMDDisplayModeSupport support;
+#endif
     IDeckLinkDisplayModeIterator *itermode;
     IDeckLinkDisplayMode *mode;
     int i = 1;
     HRESULT res;
 
-    av_log(avctx, AV_LOG_DEBUG, "Trying to find mode for frame size %dx%d, frame timing %d/%d, field order %d, direction %d, mode number %d, format code %s\n",
-        width, height, tb_num, tb_den, field_order, direction, num, (cctx->format_code) ? cctx->format_code : "(unset)");
+    av_log(avctx, AV_LOG_DEBUG, "Trying to find mode for frame size %dx%d, frame timing %d/%d, field order %d, direction %d, format code %s\n",
+        width, height, tb_num, tb_den, field_order, direction, cctx->format_code ? cctx->format_code : "(unset)");
 
     if (direction == DIRECTION_IN) {
         res = ctx->dli->GetDisplayModeIterator (&itermode);
@@ -222,7 +248,6 @@
              bmd_height == height &&
              !av_cmp_q(mode_tb, target_tb) &&
              field_order_eq(field_order, bmd_field_dominance))
-             || i == num
              || target_mode == bmd_mode) {
             ctx->bmd_mode   = bmd_mode;
             ctx->bmd_width  = bmd_width;
@@ -243,6 +268,40 @@
 
     if (ctx->bmd_mode == bmdModeUnknown)
         return -1;
+
+#if BLACKMAGIC_DECKLINK_API_VERSION >= 0x0b050000
+    if (direction == DIRECTION_IN) {
+        BMDDisplayMode actualMode = ctx->bmd_mode;
+        if (ctx->dli->DoesSupportVideoMode(ctx->video_input, ctx->bmd_mode, (BMDPixelFormat) cctx->raw_format,
+                                           bmdNoVideoInputConversion, bmdSupportedVideoModeDefault,
+                                           &actualMode, &support) != S_OK || !support || ctx->bmd_mode != actualMode)
+            return -1;
+    } else {
+        BMDDisplayMode actualMode = ctx->bmd_mode;
+        if (ctx->dlo->DoesSupportVideoMode(bmdVideoConnectionUnspecified, ctx->bmd_mode, ctx->raw_format,
+                                           bmdNoVideoOutputConversion, bmdSupportedVideoModeDefault,
+                                           &actualMode, &support) != S_OK || !support || ctx->bmd_mode != actualMode)
+            return -1;
+    }
+    return 0;
+#elif BLACKMAGIC_DECKLINK_API_VERSION >= 0x0b000000
+    if (direction == DIRECTION_IN) {
+        if (ctx->dli->DoesSupportVideoMode(ctx->video_input, ctx->bmd_mode, (BMDPixelFormat) cctx->raw_format,
+                                           bmdSupportedVideoModeDefault,
+                                           &support) != S_OK)
+            return -1;
+    } else {
+        BMDDisplayMode actualMode = ctx->bmd_mode;
+        if (ctx->dlo->DoesSupportVideoMode(bmdVideoConnectionUnspecified, ctx->bmd_mode, ctx->raw_format,
+                                           bmdSupportedVideoModeDefault,
+                                           &actualMode, &support) != S_OK || !support || ctx->bmd_mode != actualMode) {
+            return -1;
+        }
+
+    }
+    if (support)
+        return 0;
+#else
     if (direction == DIRECTION_IN) {
         if (ctx->dli->DoesSupportVideoMode(ctx->bmd_mode, (BMDPixelFormat) cctx->raw_format,
                                            bmdVideoOutputFlagDefault,
@@ -251,7 +310,7 @@
     } else {
         if (!ctx->supports_vanc || ctx->dlo->DoesSupportVideoMode(ctx->bmd_mode, ctx->raw_format,
                                                                   bmdVideoOutputVANC,
-                                                                  &support, NULL) != S_OK) {
+                                                                  &support, NULL) != S_OK || support != bmdDisplayModeSupported) {
             /* Try without VANC enabled */
             if (ctx->dlo->DoesSupportVideoMode(ctx->bmd_mode, ctx->raw_format,
                                                bmdVideoOutputFlagDefault,
@@ -264,12 +323,13 @@
     }
     if (support == bmdDisplayModeSupported)
         return 0;
+#endif
 
     return -1;
 }
 
-int ff_decklink_set_format(AVFormatContext *avctx, decklink_direction_t direction, int num) {
-    return ff_decklink_set_format(avctx, 0, 0, 0, 0, AV_FIELD_UNKNOWN, direction, num);
+int ff_decklink_set_format(AVFormatContext *avctx, decklink_direction_t direction) {
+    return ff_decklink_set_format(avctx, 0, 0, 0, 0, AV_FIELD_UNKNOWN, direction);
 }
 
 int ff_decklink_list_devices(AVFormatContext *avctx,
@@ -468,7 +528,7 @@
         return AVERROR_EXTERNAL;
     }
 
-    if (ctx->dl->QueryInterface(IID_IDeckLinkAttributes, (void **)&ctx->attr) != S_OK) {
+    if (ctx->dl->QueryInterface(IID_IDeckLinkProfileAttributes, (void **)&ctx->attr) != S_OK) {
         av_log(avctx, AV_LOG_ERROR, "Could not get attributes interface for '%s'\n", name);
         ff_decklink_cleanup(avctx);
         return AVERROR_EXTERNAL;
diff --git a/libavdevice/decklink_common.h b/libavdevice/decklink_common.h
index d2fc3f7..27ce6a8 100644
--- a/libavdevice/decklink_common.h
+++ b/libavdevice/decklink_common.h
@@ -24,6 +24,10 @@
 #define AVDEVICE_DECKLINK_COMMON_H
 
 #include <DeckLinkAPIVersion.h>
+#if BLACKMAGIC_DECKLINK_API_VERSION < 0x0b000000
+#define IID_IDeckLinkProfileAttributes IID_IDeckLinkAttributes
+#define IDeckLinkProfileAttributes IDeckLinkAttributes
+#endif
 
 #include "libavutil/thread.h"
 #include "decklink_common_c.h"
@@ -87,7 +91,7 @@
     IDeckLinkOutput *dlo;
     IDeckLinkInput *dli;
     IDeckLinkConfiguration *cfg;
-    IDeckLinkAttributes *attr;
+    IDeckLinkProfileAttributes *attr;
     decklink_output_callback *output_callback;
 
     /* DeckLink mode information */
@@ -111,7 +115,6 @@
 
     /* Status */
     int playback_started;
-    int capture_started;
     int64_t last_pts;
     unsigned long frameCount;
     unsigned int dropped;
@@ -145,6 +148,7 @@
 
     int channels;
     int audio_depth;
+    unsigned long tc_seen;    // used with option wait_for_tc
 };
 
 typedef enum { DIRECTION_IN, DIRECTION_OUT} decklink_direction_t;
@@ -192,8 +196,8 @@
 };
 
 int ff_decklink_set_configs(AVFormatContext *avctx, decklink_direction_t direction);
-int ff_decklink_set_format(AVFormatContext *avctx, int width, int height, int tb_num, int tb_den, enum AVFieldOrder field_order, decklink_direction_t direction = DIRECTION_OUT, int num = 0);
-int ff_decklink_set_format(AVFormatContext *avctx, decklink_direction_t direction, int num);
+int ff_decklink_set_format(AVFormatContext *avctx, int width, int height, int tb_num, int tb_den, enum AVFieldOrder field_order, decklink_direction_t direction = DIRECTION_OUT);
+int ff_decklink_set_format(AVFormatContext *avctx, decklink_direction_t direction);
 int ff_decklink_list_devices(AVFormatContext *avctx, struct AVDeviceInfoList *device_list, int show_inputs, int show_outputs);
 void ff_decklink_list_devices_legacy(AVFormatContext *avctx, int show_inputs, int show_outputs);
 int ff_decklink_list_formats(AVFormatContext *avctx, decklink_direction_t direction = DIRECTION_OUT);
diff --git a/libavdevice/decklink_common_c.h b/libavdevice/decklink_common_c.h
index 8e3bbeb..88b1eae 100644
--- a/libavdevice/decklink_common_c.h
+++ b/libavdevice/decklink_common_c.h
@@ -42,7 +42,6 @@
     int list_formats;
     int64_t teletext_lines;
     double preroll;
-    int v210;
     int audio_channels;
     int audio_depth;
     int duplex_mode;
@@ -57,6 +56,8 @@
     int64_t queue_size;
     int copyts;
     int64_t timestamp_align;
+    int timing_offset;
+    int wait_for_tc;
 };
 
 #endif /* AVDEVICE_DECKLINK_COMMON_C_H */
diff --git a/libavdevice/decklink_dec.cpp b/libavdevice/decklink_dec.cpp
index deb8f78..82106aa 100644
--- a/libavdevice/decklink_dec.cpp
+++ b/libavdevice/decklink_dec.cpp
@@ -784,6 +784,8 @@
                             if (packed_metadata) {
                                 if (av_packet_add_side_data(&pkt, AV_PKT_DATA_STRINGS_METADATA, packed_metadata, metadata_len) < 0)
                                     av_freep(&packed_metadata);
+                                else if (!ctx->tc_seen)
+                                    ctx->tc_seen = ctx->frameCount;
                             }
                         }
                     }
@@ -793,6 +795,14 @@
             }
         }
 
+        if (ctx->tc_format && cctx->wait_for_tc && !ctx->tc_seen) {
+
+            av_log(avctx, AV_LOG_WARNING, "No TC detected yet. wait_for_tc set. Dropping. \n");
+            av_log(avctx, AV_LOG_WARNING, "Frame received (#%lu) - "
+                        "- Frames dropped %u\n", ctx->frameCount, ++ctx->dropped);
+            return S_OK;
+        }
+
         pkt.pts = get_pkt_pts(videoFrame, audioFrame, wallclock, abs_wallclock, ctx->video_pts_source, ctx->video_st->time_base, &initial_video_pts, cctx->copyts);
         pkt.dts = pkt.pts;
 
@@ -940,8 +950,8 @@
         return -1;
     }
 
-    // 1 second timeout
-    for (i = 0; i < 10; i++) {
+    // 3 second timeout
+    for (i = 0; i < 30; i++) {
         av_usleep(100000);
         /* Sometimes VideoInputFrameArrived is called without the
          * bmdFrameHasNoInputSource flag before VideoInputFormatChanged.
@@ -973,7 +983,7 @@
     struct decklink_cctx *cctx = (struct decklink_cctx *)avctx->priv_data;
     struct decklink_ctx *ctx = (struct decklink_ctx *)cctx->ctx;
 
-    if (ctx->capture_started) {
+    if (ctx->dli) {
         ctx->dli->StopStreams();
         ctx->dli->DisableVideoInput();
         ctx->dli->DisableAudioInput();
@@ -995,9 +1005,6 @@
     class decklink_input_callback *input_callback;
     AVStream *st;
     HRESULT result;
-    char fname[1024];
-    char *tmp;
-    int mode_num = 0;
     int ret;
 
     ctx = (struct decklink_ctx *) av_mallocz(sizeof(struct decklink_ctx));
@@ -1043,24 +1050,12 @@
 
     /* List available devices. */
     if (ctx->list_devices) {
+        av_log(avctx, AV_LOG_WARNING, "The -list_devices option is deprecated and will be removed. Please use ffmpeg -sources decklink instead.\n");
         ff_decklink_list_devices_legacy(avctx, 1, 0);
         return AVERROR_EXIT;
     }
 
-    if (cctx->v210) {
-        av_log(avctx, AV_LOG_WARNING, "The bm_v210 option is deprecated and will be removed. Please use the -raw_format yuv422p10.\n");
-        cctx->raw_format = MKBETAG('v','2','1','0');
-    }
-
-    av_strlcpy(fname, avctx->url, sizeof(fname));
-    tmp=strchr (fname, '@');
-    if (tmp != NULL) {
-        av_log(avctx, AV_LOG_WARNING, "The @mode syntax is deprecated and will be removed. Please use the -format_code option.\n");
-        mode_num = atoi (tmp+1);
-        *tmp = 0;
-    }
-
-    ret = ff_decklink_init_device(avctx, fname);
+    ret = ff_decklink_init_device(avctx, avctx->url);
     if (ret < 0)
         return ret;
 
@@ -1072,6 +1067,12 @@
         goto error;
     }
 
+    if (ff_decklink_set_configs(avctx, DIRECTION_IN) < 0) {
+        av_log(avctx, AV_LOG_ERROR, "Could not set input configuration\n");
+        ret = AVERROR(EIO);
+        goto error;
+    }
+
     /* List supported formats. */
     if (ctx->list_formats) {
         ff_decklink_list_formats(avctx, DIRECTION_IN);
@@ -1079,12 +1080,6 @@
         goto error;
     }
 
-    if (ff_decklink_set_configs(avctx, DIRECTION_IN) < 0) {
-        av_log(avctx, AV_LOG_ERROR, "Could not set input configuration\n");
-        ret = AVERROR(EIO);
-        goto error;
-    }
-
     input_callback = new decklink_input_callback(avctx);
     ret = (ctx->dli->SetCallback(input_callback) == S_OK ? 0 : AVERROR_EXTERNAL);
     input_callback->Release();
@@ -1101,7 +1096,7 @@
         goto error;
     }
 
-    if (mode_num == 0 && !cctx->format_code) {
+    if (!cctx->format_code) {
         if (decklink_autodetect(cctx) < 0) {
             av_log(avctx, AV_LOG_ERROR, "Cannot Autodetect input stream or No signal\n");
             ret = AVERROR(EIO);
@@ -1109,9 +1104,9 @@
         }
         av_log(avctx, AV_LOG_INFO, "Autodetected the input mode\n");
     }
-    if (ff_decklink_set_format(avctx, DIRECTION_IN, mode_num) < 0) {
-        av_log(avctx, AV_LOG_ERROR, "Could not set mode number %d or format code %s for %s\n",
-            mode_num, (cctx->format_code) ? cctx->format_code : "(unset)", fname);
+    if (ff_decklink_set_format(avctx, DIRECTION_IN) < 0) {
+        av_log(avctx, AV_LOG_ERROR, "Could not set format code %s for %s\n",
+            cctx->format_code ? cctx->format_code : "(unset)", avctx->url);
         ret = AVERROR(EIO);
         goto error;
     }
@@ -1167,14 +1162,14 @@
         break;
     case bmdFormat8BitARGB:
         st->codecpar->codec_id    = AV_CODEC_ID_RAWVIDEO;
-        st->codecpar->codec_tag   = avcodec_pix_fmt_to_codec_tag((enum AVPixelFormat)st->codecpar->format);
         st->codecpar->format      = AV_PIX_FMT_0RGB;
+        st->codecpar->codec_tag   = avcodec_pix_fmt_to_codec_tag((enum AVPixelFormat)st->codecpar->format);
         st->codecpar->bit_rate    = av_rescale(ctx->bmd_width * ctx->bmd_height * 32, st->time_base.den, st->time_base.num);
         break;
     case bmdFormat8BitBGRA:
         st->codecpar->codec_id    = AV_CODEC_ID_RAWVIDEO;
-        st->codecpar->codec_tag   = avcodec_pix_fmt_to_codec_tag((enum AVPixelFormat)st->codecpar->format);
         st->codecpar->format      = AV_PIX_FMT_BGR0;
+        st->codecpar->codec_tag   = avcodec_pix_fmt_to_codec_tag((enum AVPixelFormat)st->codecpar->format);
         st->codecpar->bit_rate    = av_rescale(ctx->bmd_width * ctx->bmd_height * 32, st->time_base.den, st->time_base.num);
         break;
     case bmdFormat10BitRGB:
diff --git a/libavdevice/decklink_dec_c.c b/libavdevice/decklink_dec_c.c
index 91d2839..b598769 100644
--- a/libavdevice/decklink_dec_c.c
+++ b/libavdevice/decklink_dec_c.c
@@ -33,7 +33,6 @@
     { "list_devices", "list available devices"  , OFFSET(list_devices), AV_OPT_TYPE_INT   , { .i64 = 0   }, 0, 1, DEC },
     { "list_formats", "list supported formats"  , OFFSET(list_formats), AV_OPT_TYPE_INT   , { .i64 = 0   }, 0, 1, DEC },
     { "format_code",  "set format by fourcc"    , OFFSET(format_code),  AV_OPT_TYPE_STRING, { .str = NULL}, 0, 0, DEC },
-    { "bm_v210",      "v210 10 bit per channel" , OFFSET(v210),         AV_OPT_TYPE_INT   , { .i64 = 0   }, 0, 1, DEC },
     { "raw_format",   "pixel format to be returned by the card when capturing" , OFFSET(raw_format),  AV_OPT_TYPE_INT, { .i64 = MKBETAG('2','v','u','y')}, 0, UINT_MAX, DEC, "raw_format" },
     { "uyvy422",       NULL,   0,  AV_OPT_TYPE_CONST, { .i64 = MKBETAG('2','v','u','y') }, 0, 0, DEC, "raw_format"},
     { "yuv422p10",     NULL,   0,  AV_OPT_TYPE_CONST, { .i64 = MKBETAG('v','2','1','0') }, 0, 0, DEC, "raw_format"},
@@ -85,11 +84,12 @@
     { "audio_depth",   "audio bitdepth (16 or 32)", OFFSET(audio_depth),  AV_OPT_TYPE_INT,   { .i64 = 16}, 16, 32, DEC },
     { "decklink_copyts", "copy timestamps, do not remove the initial offset", OFFSET(copyts), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, DEC },
     { "timestamp_align", "capture start time alignment (in seconds)", OFFSET(timestamp_align), AV_OPT_TYPE_DURATION, { .i64 = 0 }, 0, INT_MAX, DEC },
+    { "wait_for_tc",     "drop frames till a frame with timecode is received. TC format must be set", OFFSET(wait_for_tc), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, DEC },
     { NULL },
 };
 
 static const AVClass decklink_demuxer_class = {
-    .class_name = "Blackmagic DeckLink demuxer",
+    .class_name = "Blackmagic DeckLink indev",
     .item_name  = av_default_item_name,
     .option     = options,
     .version    = LIBAVUTIL_VERSION_INT,
diff --git a/libavdevice/decklink_enc.cpp b/libavdevice/decklink_enc.cpp
index 8b621d0..883fdea 100644
--- a/libavdevice/decklink_enc.cpp
+++ b/libavdevice/decklink_enc.cpp
@@ -197,8 +197,11 @@
                " Check available formats with -list_formats 1.\n");
         return -1;
     }
-    if (ctx->dlo->EnableVideoOutput(ctx->bmd_mode,
-                                    ctx->supports_vanc ? bmdVideoOutputVANC : bmdVideoOutputFlagDefault) != S_OK) {
+    if (ctx->supports_vanc && ctx->dlo->EnableVideoOutput(ctx->bmd_mode, bmdVideoOutputVANC) != S_OK) {
+        av_log(avctx, AV_LOG_WARNING, "Could not enable video output with VANC! Trying without...\n");
+        ctx->supports_vanc = 0;
+    }
+    if (!ctx->supports_vanc && ctx->dlo->EnableVideoOutput(ctx->bmd_mode, bmdVideoOutputFlagDefault) != S_OK) {
         av_log(avctx, AV_LOG_ERROR, "Could not enable video output!\n");
         return -1;
     }
@@ -565,6 +568,7 @@
 
     /* List available devices and exit. */
     if (ctx->list_devices) {
+        av_log(avctx, AV_LOG_WARNING, "The -list_devices option is deprecated and will be removed. Please use ffmpeg -sinks decklink instead.\n");
         ff_decklink_list_devices_legacy(avctx, 0, 1);
         return AVERROR_EXIT;
     }
diff --git a/libavdevice/decklink_enc_c.c b/libavdevice/decklink_enc_c.c
index 6169078..682c714 100644
--- a/libavdevice/decklink_enc_c.c
+++ b/libavdevice/decklink_enc_c.c
@@ -35,11 +35,13 @@
     { "unset"       ,  NULL                     , 0                   , AV_OPT_TYPE_CONST , { .i64 = 0   }, 0, 0, ENC, "duplex_mode"},
     { "half"        ,  NULL                     , 0                   , AV_OPT_TYPE_CONST , { .i64 = 1   }, 0, 0, ENC, "duplex_mode"},
     { "full"        ,  NULL                     , 0                   , AV_OPT_TYPE_CONST , { .i64 = 2   }, 0, 0, ENC, "duplex_mode"},
+    { "timing_offset", "genlock timing pixel offset", OFFSET(timing_offset), AV_OPT_TYPE_INT,   { .i64 = INT_MIN }, INT_MIN, INT_MAX, ENC, "timing_offset"},
+    { "unset"       ,  NULL                     , 0                        , AV_OPT_TYPE_CONST, { .i64 = INT_MIN },       0,       0, ENC, "timing_offset"},
     { NULL },
 };
 
 static const AVClass decklink_muxer_class = {
-    .class_name = "Blackmagic DeckLink muxer",
+    .class_name = "Blackmagic DeckLink outdev",
     .item_name  = av_default_item_name,
     .option     = options,
     .version    = LIBAVUTIL_VERSION_INT,
diff --git a/libavdevice/dshow.c b/libavdevice/dshow.c
index 2548158..d7f5bd7 100644
--- a/libavdevice/dshow.c
+++ b/libavdevice/dshow.c
@@ -278,12 +278,12 @@
                     goto fail1;
                 }
                 *device_unique_name = unique_name;
+                unique_name = NULL;
                 // success, loop will end now
             }
         } else {
             av_log(avctx, AV_LOG_INFO, " \"%s\"\n", friendly_name);
             av_log(avctx, AV_LOG_INFO, "    Alternative name \"%s\"\n", unique_name);
-            av_free(unique_name);
         }
 
 fail1:
@@ -291,7 +291,8 @@
             IMalloc_Free(co_malloc, olestr);
         if (bind_ctx)
             IBindCtx_Release(bind_ctx);
-        av_free(friendly_name);
+        av_freep(&friendly_name);
+        av_freep(&unique_name);
         if (bag)
             IPropertyBag_Release(bag);
         IMoniker_Release(m);
@@ -941,6 +942,8 @@
     AVStream *st;
     int ret = AVERROR(EIO);
 
+    type.pbFormat = NULL;
+
     st = avformat_new_stream(avctx, NULL);
     if (!st) {
         ret = AVERROR(ENOMEM);
@@ -989,7 +992,8 @@
             if (par->codec_id == AV_CODEC_ID_NONE) {
                 av_log(avctx, AV_LOG_ERROR, "Unknown compression type. "
                                  "Please report type 0x%X.\n", (int) bih->biCompression);
-                return AVERROR_PATCHWELCOME;
+                ret = AVERROR_PATCHWELCOME;
+                goto error;
             }
             par->bits_per_coded_sample = bih->biBitCount;
         } else {
@@ -1030,6 +1034,8 @@
     ret = 0;
 
 error:
+    if (type.pbFormat)
+        CoTaskMemFree(type.pbFormat);
     return ret;
 }
 
diff --git a/libavdevice/dshow_pin.c b/libavdevice/dshow_pin.c
index 664246d..53b1c91 100644
--- a/libavdevice/dshow_pin.c
+++ b/libavdevice/dshow_pin.c
@@ -249,8 +249,20 @@
 
     return 1;
 }
+
+static void
+libAVPin_Free(libAVPin *this)
+{
+    if (!this)
+        return;
+    av_freep(&this->imemvtbl);
+    if (this->type.pbFormat) {
+        CoTaskMemFree(this->type.pbFormat);
+        this->type.pbFormat = NULL;
+    }
+}
 DECLARE_CREATE(libAVPin, libAVPin_Setup(this, filter), libAVFilter *filter)
-DECLARE_DESTROY(libAVPin, nothing)
+DECLARE_DESTROY(libAVPin, libAVPin_Free)
 
 /*****************************************************************************
  * libAVMemInputPin
diff --git a/libavdevice/gdigrab.c b/libavdevice/gdigrab.c
index ab08c11..f444440 100644
--- a/libavdevice/gdigrab.c
+++ b/libavdevice/gdigrab.c
@@ -277,14 +277,20 @@
     }
     bpp = GetDeviceCaps(source_hdc, BITSPIXEL);
 
+    horzres = GetDeviceCaps(source_hdc, HORZRES);
+    vertres = GetDeviceCaps(source_hdc, VERTRES);
+    desktophorzres = GetDeviceCaps(source_hdc, DESKTOPHORZRES);
+    desktopvertres = GetDeviceCaps(source_hdc, DESKTOPVERTRES);
+
     if (hwnd) {
         GetClientRect(hwnd, &virtual_rect);
+        /* window -- get the right height and width for scaling DPI */
+        virtual_rect.left   = virtual_rect.left   * desktophorzres / horzres;
+        virtual_rect.right  = virtual_rect.right  * desktophorzres / horzres;
+        virtual_rect.top    = virtual_rect.top    * desktopvertres / vertres;
+        virtual_rect.bottom = virtual_rect.bottom * desktopvertres / vertres;
     } else {
         /* desktop -- get the right height and width for scaling DPI */
-        horzres = GetDeviceCaps(source_hdc, HORZRES);
-        vertres = GetDeviceCaps(source_hdc, VERTRES);
-        desktophorzres = GetDeviceCaps(source_hdc, DESKTOPHORZRES);
-        desktopvertres = GetDeviceCaps(source_hdc, DESKTOPVERTRES);
         virtual_rect.left = GetSystemMetrics(SM_XVIRTUALSCREEN);
         virtual_rect.top = GetSystemMetrics(SM_YVIRTUALSCREEN);
         virtual_rect.right = (virtual_rect.left + GetSystemMetrics(SM_CXVIRTUALSCREEN)) * desktophorzres / horzres;
@@ -473,25 +479,26 @@
             goto icon_error;
         }
 
-        pos.x = ci.ptScreenPos.x - clip_rect.left - info.xHotspot;
-        pos.y = ci.ptScreenPos.y - clip_rect.top - info.yHotspot;
-
         if (hwnd) {
             RECT rect;
 
             if (GetWindowRect(hwnd, &rect)) {
-                pos.x -= rect.left;
-                pos.y -= rect.top;
+                pos.x = ci.ptScreenPos.x - clip_rect.left - info.xHotspot - rect.left;
+                pos.y = ci.ptScreenPos.y - clip_rect.top - info.yHotspot - rect.top;
+
+                //that would keep the correct location of mouse with hidpi screens
+                pos.x = pos.x * desktophorzres / horzres;
+                pos.y = pos.y * desktopvertres / vertres;
             } else {
                 CURSOR_ERROR("Couldn't get window rectangle");
                 goto icon_error;
             }
+        } else {
+            //that would keep the correct location of mouse with hidpi screens
+            pos.x = ci.ptScreenPos.x * desktophorzres / horzres - clip_rect.left - info.xHotspot;
+            pos.y = ci.ptScreenPos.y * desktopvertres / vertres - clip_rect.top - info.yHotspot;
         }
 
-        //that would keep the correct location of mouse with hidpi screens
-        pos.x = pos.x * desktophorzres / horzres;
-        pos.y = pos.y * desktopvertres / vertres;
-
         av_log(s1, AV_LOG_DEBUG, "Cursor pos (%li,%li) -> (%li,%li)\n",
                 ci.ptScreenPos.x, ci.ptScreenPos.y, pos.x, pos.y);
 
@@ -640,6 +647,7 @@
     .item_name  = av_default_item_name,
     .option     = options,
     .version    = LIBAVUTIL_VERSION_INT,
+    .category   = AV_CLASS_CATEGORY_DEVICE_VIDEO_INPUT,
 };
 
 /** gdi grabber device demuxer declaration */
diff --git a/libavdevice/iec61883.c b/libavdevice/iec61883.c
index dcf7553..cafafb2 100644
--- a/libavdevice/iec61883.c
+++ b/libavdevice/iec61883.c
@@ -23,7 +23,7 @@
  * libiec61883 interface
  */
 
-#include <sys/poll.h>
+#include <poll.h>
 #include <libraw1394/raw1394.h>
 #include <libavc1394/avc1394.h>
 #include <libavc1394/rom1394.h>
diff --git a/libavdevice/lavfi.c b/libavdevice/lavfi.c
index ca8f05f..c949ff7 100644
--- a/libavdevice/lavfi.c
+++ b/libavdevice/lavfi.c
@@ -302,9 +302,13 @@
 
     if (lavfi->dump_graph) {
         char *dump = avfilter_graph_dump(lavfi->graph, lavfi->dump_graph);
-        fputs(dump, stderr);
-        fflush(stderr);
-        av_free(dump);
+        if (dump != NULL) {
+            fputs(dump, stderr);
+            fflush(stderr);
+            av_free(dump);
+        } else {
+            FAIL(AVERROR(ENOMEM));
+        }
     }
 
     /* fill each stream with the information in the corresponding sink */
diff --git a/libavdevice/libndi_newtek_dec.c b/libavdevice/libndi_newtek_dec.c
deleted file mode 100644
index 4fb7197..0000000
--- a/libavdevice/libndi_newtek_dec.c
+++ /dev/null
@@ -1,340 +0,0 @@
-/*
- * Newtek NDI input
- * Copyright (c) 2017 Maksym Veremeyenko
- *
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with FFmpeg; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-#include "libavformat/avformat.h"
-#include "libavformat/internal.h"
-#include "libavutil/opt.h"
-#include "libavutil/imgutils.h"
-
-#include "libndi_newtek_common.h"
-
-struct NDIContext {
-    const AVClass *cclass;
-
-    /* Options */
-    int find_sources;
-    int64_t wait_sources;
-    int allow_video_fields;
-
-    /* Runtime */
-    NDIlib_recv_create_t *recv;
-    NDIlib_find_instance_t ndi_find;
-
-    /* Streams */
-    AVStream *video_st, *audio_st;
-};
-
-static int ndi_set_video_packet(AVFormatContext *avctx, NDIlib_video_frame_t *v, AVPacket *pkt)
-{
-    int ret;
-    struct NDIContext *ctx = avctx->priv_data;
-
-    ret = av_new_packet(pkt, v->yres * v->line_stride_in_bytes);
-    if (ret < 0)
-        return ret;
-
-    pkt->dts = pkt->pts = av_rescale_q(v->timecode, NDI_TIME_BASE_Q, ctx->video_st->time_base);
-    pkt->duration = av_rescale_q(1, (AVRational){v->frame_rate_D, v->frame_rate_N}, ctx->video_st->time_base);
-
-    av_log(avctx, AV_LOG_DEBUG, "%s: pkt->dts = pkt->pts = %"PRId64", duration=%"PRId64", timecode=%"PRId64"\n",
-        __func__, pkt->dts, pkt->duration, v->timecode);
-
-    pkt->flags         |= AV_PKT_FLAG_KEY;
-    pkt->stream_index   = ctx->video_st->index;
-
-    memcpy(pkt->data, v->p_data, pkt->size);
-
-    return 0;
-}
-
-static int ndi_set_audio_packet(AVFormatContext *avctx, NDIlib_audio_frame_t *a, AVPacket *pkt)
-{
-    int ret;
-    struct NDIContext *ctx = avctx->priv_data;
-
-    NDIlib_audio_frame_interleaved_16s_t dst;
-
-    ret = av_new_packet(pkt, 2 * a->no_samples * a->no_channels);
-    if (ret < 0)
-        return ret;
-
-    pkt->dts = pkt->pts = av_rescale_q(a->timecode, NDI_TIME_BASE_Q, ctx->audio_st->time_base);
-    pkt->duration = av_rescale_q(1, (AVRational){a->no_samples, a->sample_rate}, ctx->audio_st->time_base);
-
-    av_log(avctx, AV_LOG_DEBUG, "%s: pkt->dts = pkt->pts = %"PRId64", duration=%"PRId64", timecode=%"PRId64"\n",
-        __func__, pkt->dts, pkt->duration, a->timecode);
-
-    pkt->flags       |= AV_PKT_FLAG_KEY;
-    pkt->stream_index = ctx->audio_st->index;
-
-    dst.reference_level = 0;
-    dst.p_data = (short *)pkt->data;
-    NDIlib_util_audio_to_interleaved_16s(a, &dst);
-
-    return 0;
-}
-
-static int ndi_find_sources(AVFormatContext *avctx, const char *name, NDIlib_source_t *source_to_connect_to)
-{
-    int j = AVERROR(ENODEV);
-    unsigned int n, i;
-    struct NDIContext *ctx = avctx->priv_data;
-    const NDIlib_source_t *ndi_srcs = NULL;
-    const NDIlib_find_create_t find_create_desc = { .show_local_sources = true,
-        .p_groups = NULL, .p_extra_ips = NULL };
-
-    if (!ctx->ndi_find)
-        ctx->ndi_find = NDIlib_find_create2(&find_create_desc);
-    if (!ctx->ndi_find) {
-        av_log(avctx, AV_LOG_ERROR, "NDIlib_find_create failed.\n");
-        return AVERROR(EIO);
-    }
-
-    while (1)
-    {
-        int f, t = ctx->wait_sources / 1000;
-        av_log(avctx, AV_LOG_DEBUG, "Waiting for sources %d miliseconds\n", t);
-        f = NDIlib_find_wait_for_sources(ctx->ndi_find, t);
-        av_log(avctx, AV_LOG_DEBUG, "NDIlib_find_wait_for_sources returns %d\n", f);
-        if (!f)
-            break;
-    };
-
-    ndi_srcs = NDIlib_find_get_current_sources(ctx->ndi_find, &n);
-
-    if (ctx->find_sources)
-        av_log(avctx, AV_LOG_INFO, "Found %d NDI sources:\n", n);
-
-    for (i = 0; i < n; i++) {
-        if (ctx->find_sources)
-            av_log(avctx, AV_LOG_INFO, "\t'%s'\t'%s'\n", ndi_srcs[i].p_ndi_name, ndi_srcs[i].p_ip_address);
-
-        if (!strcmp(name, ndi_srcs[i].p_ndi_name)) {
-            *source_to_connect_to = ndi_srcs[i];
-            j = i;
-        }
-    }
-
-    return j;
-}
-
-static int ndi_read_header(AVFormatContext *avctx)
-{
-    int ret;
-    NDIlib_recv_create_t recv_create_desc;
-    const NDIlib_tally_t tally_state = { .on_program = true, .on_preview = false };
-    struct NDIContext *ctx = avctx->priv_data;
-
-    if (!NDIlib_initialize()) {
-        av_log(avctx, AV_LOG_ERROR, "NDIlib_initialize failed.\n");
-        return AVERROR_EXTERNAL;
-    }
-
-    /* Find available sources. */
-    ret = ndi_find_sources(avctx, avctx->url, &recv_create_desc.source_to_connect_to);
-    if (ctx->find_sources) {
-        return AVERROR_EXIT;
-    }
-    if (ret < 0)
-        return ret;
-
-    /* Create receiver description */
-    recv_create_desc.color_format = NDIlib_recv_color_format_e_UYVY_RGBA;
-    recv_create_desc.bandwidth = NDIlib_recv_bandwidth_highest;
-    recv_create_desc.allow_video_fields = ctx->allow_video_fields;
-
-    /* Create the receiver */
-    ctx->recv = NDIlib_recv_create(&recv_create_desc);
-    if (!ctx->recv) {
-        av_log(avctx, AV_LOG_ERROR, "NDIlib_recv_create2 failed.\n");
-        return AVERROR(EIO);
-    }
-
-    /* Set tally */
-    NDIlib_recv_set_tally(ctx->recv, &tally_state);
-
-    avctx->ctx_flags |= AVFMTCTX_NOHEADER;
-
-    return 0;
-}
-
-static int ndi_create_video_stream(AVFormatContext *avctx, NDIlib_video_frame_t *v)
-{
-    AVStream *st;
-    AVRational tmp;
-    struct NDIContext *ctx = avctx->priv_data;
-
-    st = avformat_new_stream(avctx, NULL);
-    if (!st) {
-        av_log(avctx, AV_LOG_ERROR, "Cannot add video stream\n");
-        return AVERROR(ENOMEM);
-    }
-
-    st->time_base                   = NDI_TIME_BASE_Q;
-    st->r_frame_rate                = av_make_q(v->frame_rate_N, v->frame_rate_D);
-
-    tmp = av_mul_q(av_d2q(v->picture_aspect_ratio, INT_MAX), (AVRational){v->yres, v->xres});
-    av_reduce(&st->sample_aspect_ratio.num, &st->sample_aspect_ratio.den, tmp.num, tmp.den, 1000);
-    st->codecpar->sample_aspect_ratio = st->sample_aspect_ratio;
-
-    st->codecpar->codec_type        = AVMEDIA_TYPE_VIDEO;
-    st->codecpar->width             = v->xres;
-    st->codecpar->height            = v->yres;
-    st->codecpar->codec_id          = AV_CODEC_ID_RAWVIDEO;
-    st->codecpar->bit_rate          = av_rescale(v->xres * v->yres * 16, v->frame_rate_N, v->frame_rate_D);
-    st->codecpar->field_order       = v->frame_format_type == NDIlib_frame_format_type_progressive
-        ? AV_FIELD_PROGRESSIVE : AV_FIELD_TT;
-
-    if (NDIlib_FourCC_type_UYVY == v->FourCC || NDIlib_FourCC_type_UYVA == v->FourCC) {
-        st->codecpar->format        = AV_PIX_FMT_UYVY422;
-        st->codecpar->codec_tag     = MKTAG('U', 'Y', 'V', 'Y');
-        if (NDIlib_FourCC_type_UYVA == v->FourCC)
-            av_log(avctx, AV_LOG_WARNING, "Alpha channel ignored\n");
-    } else if (NDIlib_FourCC_type_BGRA == v->FourCC) {
-        st->codecpar->format        = AV_PIX_FMT_BGRA;
-        st->codecpar->codec_tag     = MKTAG('B', 'G', 'R', 'A');
-    } else if (NDIlib_FourCC_type_BGRX == v->FourCC) {
-        st->codecpar->format        = AV_PIX_FMT_BGR0;
-        st->codecpar->codec_tag     = MKTAG('B', 'G', 'R', '0');
-    } else if (NDIlib_FourCC_type_RGBA == v->FourCC) {
-        st->codecpar->format        = AV_PIX_FMT_RGBA;
-        st->codecpar->codec_tag     = MKTAG('R', 'G', 'B', 'A');
-    } else if (NDIlib_FourCC_type_RGBX == v->FourCC) {
-        st->codecpar->format        = AV_PIX_FMT_RGB0;
-        st->codecpar->codec_tag     = MKTAG('R', 'G', 'B', '0');
-    } else {
-        av_log(avctx, AV_LOG_ERROR, "Unsupported video stream format, v->FourCC=%d\n", v->FourCC);
-        return AVERROR(EINVAL);
-    }
-
-    avpriv_set_pts_info(st, 64, 1, NDI_TIME_BASE);
-
-    ctx->video_st = st;
-
-    return 0;
-}
-
-static int ndi_create_audio_stream(AVFormatContext *avctx, NDIlib_audio_frame_t *a)
-{
-    AVStream *st;
-    struct NDIContext *ctx = avctx->priv_data;
-
-    st = avformat_new_stream(avctx, NULL);
-    if (!st) {
-        av_log(avctx, AV_LOG_ERROR, "Cannot add audio stream\n");
-        return AVERROR(ENOMEM);
-    }
-
-    st->codecpar->codec_type        = AVMEDIA_TYPE_AUDIO;
-    st->codecpar->codec_id          = AV_CODEC_ID_PCM_S16LE;
-    st->codecpar->sample_rate       = a->sample_rate;
-    st->codecpar->channels          = a->no_channels;
-
-    avpriv_set_pts_info(st, 64, 1, NDI_TIME_BASE);
-
-    ctx->audio_st = st;
-
-    return 0;
-}
-
-static int ndi_read_packet(AVFormatContext *avctx, AVPacket *pkt)
-{
-    int ret = 0;
-    struct NDIContext *ctx = avctx->priv_data;
-
-    while (!ret) {
-        NDIlib_video_frame_t v;
-        NDIlib_audio_frame_t a;
-        NDIlib_metadata_frame_t m;
-        NDIlib_frame_type_e t;
-
-        av_log(avctx, AV_LOG_DEBUG, "NDIlib_recv_capture...\n");
-        t = NDIlib_recv_capture(ctx->recv, &v, &a, &m, 40);
-        av_log(avctx, AV_LOG_DEBUG, "NDIlib_recv_capture=%d\n", t);
-
-        if (t == NDIlib_frame_type_video) {
-            if (!ctx->video_st)
-                ret = ndi_create_video_stream(avctx, &v);
-            if (!ret)
-                ret = ndi_set_video_packet(avctx, &v, pkt);
-            NDIlib_recv_free_video(ctx->recv, &v);
-            break;
-        }
-        else if (t == NDIlib_frame_type_audio) {
-            if (!ctx->audio_st)
-                ret = ndi_create_audio_stream(avctx, &a);
-            if (!ret)
-                ret = ndi_set_audio_packet(avctx, &a, pkt);
-            NDIlib_recv_free_audio(ctx->recv, &a);
-            break;
-        }
-        else if (t == NDIlib_frame_type_metadata)
-            NDIlib_recv_free_metadata(ctx->recv, &m);
-        else if (t == NDIlib_frame_type_error){
-            av_log(avctx, AV_LOG_ERROR, "NDIlib_recv_capture failed with error\n");
-            ret = AVERROR(EIO);
-        }
-    };
-
-    return ret;
-}
-
-static int ndi_read_close(AVFormatContext *avctx)
-{
-    struct NDIContext *ctx = (struct NDIContext *)avctx->priv_data;
-
-    if (ctx->recv)
-        NDIlib_recv_destroy(ctx->recv);
-
-    if (ctx->ndi_find)
-        NDIlib_find_destroy(ctx->ndi_find);
-
-    return 0;
-}
-
-#define OFFSET(x) offsetof(struct NDIContext, x)
-#define DEC AV_OPT_FLAG_DECODING_PARAM
-
-static const AVOption options[] = {
-    { "find_sources", "Find available sources"  , OFFSET(find_sources), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, DEC },
-    { "wait_sources", "Time to wait until the number of online sources have changed"  , OFFSET(wait_sources), AV_OPT_TYPE_DURATION, { .i64 = 1000000 }, 100000, 20000000, DEC },
-    { "allow_video_fields", "When this flag is FALSE, all video that you receive will be progressive"  , OFFSET(allow_video_fields), AV_OPT_TYPE_BOOL, { .i64 = 1 }, 0, 1, DEC },
-    { NULL },
-};
-
-static const AVClass libndi_newtek_demuxer_class = {
-    .class_name = "NDI demuxer",
-    .item_name  = av_default_item_name,
-    .option     = options,
-    .version    = LIBAVUTIL_VERSION_INT,
-    .category   = AV_CLASS_CATEGORY_DEVICE_VIDEO_INPUT,
-};
-
-AVInputFormat ff_libndi_newtek_demuxer = {
-    .name           = "libndi_newtek",
-    .long_name      = NULL_IF_CONFIG_SMALL("Network Device Interface (NDI) input using NewTek library"),
-    .flags          = AVFMT_NOFILE,
-    .priv_class     = &libndi_newtek_demuxer_class,
-    .priv_data_size = sizeof(struct NDIContext),
-    .read_header   = ndi_read_header,
-    .read_packet   = ndi_read_packet,
-    .read_close    = ndi_read_close,
-};
diff --git a/libavdevice/libndi_newtek_enc.c b/libavdevice/libndi_newtek_enc.c
deleted file mode 100644
index f3603f5..0000000
--- a/libavdevice/libndi_newtek_enc.c
+++ /dev/null
@@ -1,299 +0,0 @@
-/*
- * NewTek NDI output
- * Copyright (c) 2017 Maksym Veremeyenko
- *
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with FFmpeg; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-#include "libavformat/avformat.h"
-#include "libavformat/internal.h"
-#include "libavutil/opt.h"
-#include "libavutil/imgutils.h"
-
-#include "libndi_newtek_common.h"
-
-struct NDIContext {
-    const AVClass *cclass;
-
-    /* Options */
-    int reference_level;
-    int clock_video, clock_audio;
-
-    NDIlib_video_frame_t *video;
-    NDIlib_audio_frame_interleaved_16s_t *audio;
-    NDIlib_send_instance_t ndi_send;
-    AVFrame *last_avframe;
-};
-
-static int ndi_write_trailer(AVFormatContext *avctx)
-{
-    struct NDIContext *ctx = avctx->priv_data;
-
-    if (ctx->ndi_send) {
-        NDIlib_send_destroy(ctx->ndi_send);
-        av_frame_free(&ctx->last_avframe);
-    }
-
-    av_freep(&ctx->video);
-    av_freep(&ctx->audio);
-
-    return 0;
-}
-
-static int ndi_write_video_packet(AVFormatContext *avctx, AVStream *st, AVPacket *pkt)
-{
-    struct NDIContext *ctx = avctx->priv_data;
-    AVFrame *avframe, *tmp = (AVFrame *)pkt->data;
-
-    if (tmp->format != AV_PIX_FMT_UYVY422 && tmp->format != AV_PIX_FMT_BGRA &&
-        tmp->format != AV_PIX_FMT_BGR0 && tmp->format != AV_PIX_FMT_RGBA &&
-        tmp->format != AV_PIX_FMT_RGB0) {
-        av_log(avctx, AV_LOG_ERROR, "Got a frame with invalid pixel format.\n");
-        return AVERROR(EINVAL);
-    }
-
-    if (tmp->linesize[0] < 0) {
-        av_log(avctx, AV_LOG_ERROR, "Got a frame with negative linesize.\n");
-        return AVERROR(EINVAL);
-    }
-
-    if (tmp->width  != ctx->video->xres ||
-        tmp->height != ctx->video->yres) {
-        av_log(avctx, AV_LOG_ERROR, "Got a frame with invalid dimension.\n");
-        av_log(avctx, AV_LOG_ERROR, "tmp->width=%d, tmp->height=%d, ctx->video->xres=%d, ctx->video->yres=%d\n",
-            tmp->width, tmp->height, ctx->video->xres, ctx->video->yres);
-        return AVERROR(EINVAL);
-    }
-
-    avframe = av_frame_clone(tmp);
-    if (!avframe)
-        return AVERROR(ENOMEM);
-
-    ctx->video->timecode = av_rescale_q(pkt->pts, st->time_base, NDI_TIME_BASE_Q);
-
-    ctx->video->line_stride_in_bytes = avframe->linesize[0];
-    ctx->video->p_data = (void *)(avframe->data[0]);
-
-    av_log(avctx, AV_LOG_DEBUG, "%s: pkt->pts=%"PRId64", timecode=%"PRId64", st->time_base=%d/%d\n",
-        __func__, pkt->pts, ctx->video->timecode, st->time_base.num, st->time_base.den);
-
-    /* asynchronous for one frame, but will block if a second frame
-        is given before the first one has been sent */
-    NDIlib_send_send_video_async(ctx->ndi_send, ctx->video);
-
-    av_frame_free(&ctx->last_avframe);
-    ctx->last_avframe = avframe;
-
-    return 0;
-}
-
-static int ndi_write_audio_packet(AVFormatContext *avctx, AVStream *st, AVPacket *pkt)
-{
-    struct NDIContext *ctx = avctx->priv_data;
-
-    ctx->audio->p_data = (short *)pkt->data;
-    ctx->audio->timecode = av_rescale_q(pkt->pts, st->time_base, NDI_TIME_BASE_Q);
-    ctx->audio->no_samples = pkt->size / (ctx->audio->no_channels << 1);
-
-    av_log(avctx, AV_LOG_DEBUG, "%s: pkt->pts=%"PRId64", timecode=%"PRId64", st->time_base=%d/%d\n",
-        __func__, pkt->pts, ctx->audio->timecode, st->time_base.num, st->time_base.den);
-
-    NDIlib_util_send_send_audio_interleaved_16s(ctx->ndi_send, ctx->audio);
-
-    return 0;
-}
-
-static int ndi_write_packet(AVFormatContext *avctx, AVPacket *pkt)
-{
-    AVStream *st = avctx->streams[pkt->stream_index];
-
-    if      (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO)
-        return ndi_write_video_packet(avctx, st, pkt);
-    else if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO)
-        return ndi_write_audio_packet(avctx, st, pkt);
-
-    return AVERROR_BUG;
-}
-
-static int ndi_setup_audio(AVFormatContext *avctx, AVStream *st)
-{
-    struct NDIContext *ctx = avctx->priv_data;
-    AVCodecParameters *c = st->codecpar;
-
-    if (ctx->audio) {
-        av_log(avctx, AV_LOG_ERROR, "Only one audio stream is supported!\n");
-        return AVERROR(EINVAL);
-    }
-
-    ctx->audio = av_mallocz(sizeof(NDIlib_audio_frame_interleaved_16s_t));
-    if (!ctx->audio)
-        return AVERROR(ENOMEM);
-
-    ctx->audio->sample_rate = c->sample_rate;
-    ctx->audio->no_channels = c->channels;
-    ctx->audio->reference_level = ctx->reference_level;
-
-    avpriv_set_pts_info(st, 64, 1, NDI_TIME_BASE);
-
-    return 0;
-}
-
-static int ndi_setup_video(AVFormatContext *avctx, AVStream *st)
-{
-    struct NDIContext *ctx = avctx->priv_data;
-    AVCodecParameters *c = st->codecpar;
-
-    if (ctx->video) {
-        av_log(avctx, AV_LOG_ERROR, "Only one video stream is supported!\n");
-        return AVERROR(EINVAL);
-    }
-
-    if (c->codec_id != AV_CODEC_ID_WRAPPED_AVFRAME) {
-        av_log(avctx, AV_LOG_ERROR, "Unsupported codec format!"
-               " Only AV_CODEC_ID_WRAPPED_AVFRAME is supported (-vcodec wrapped_avframe).\n");
-        return AVERROR(EINVAL);
-    }
-
-    if (c->format != AV_PIX_FMT_UYVY422 && c->format != AV_PIX_FMT_BGRA &&
-        c->format != AV_PIX_FMT_BGR0 && c->format != AV_PIX_FMT_RGBA &&
-        c->format != AV_PIX_FMT_RGB0) {
-        av_log(avctx, AV_LOG_ERROR, "Unsupported pixel format!"
-               " Only AV_PIX_FMT_UYVY422, AV_PIX_FMT_BGRA, AV_PIX_FMT_BGR0,"
-               " AV_PIX_FMT_RGBA, AV_PIX_FMT_RGB0 is supported.\n");
-        return AVERROR(EINVAL);
-    }
-
-    if (c->field_order == AV_FIELD_BB || c->field_order == AV_FIELD_BT) {
-        av_log(avctx, AV_LOG_ERROR, "Lower field-first disallowed");
-        return AVERROR(EINVAL);
-    }
-
-    ctx->video = av_mallocz(sizeof(NDIlib_video_frame_t));
-    if (!ctx->video)
-        return AVERROR(ENOMEM);
-
-    switch(c->format) {
-        case AV_PIX_FMT_UYVY422:
-            ctx->video->FourCC = NDIlib_FourCC_type_UYVY;
-            break;
-        case AV_PIX_FMT_BGRA:
-            ctx->video->FourCC = NDIlib_FourCC_type_BGRA;
-            break;
-        case AV_PIX_FMT_BGR0:
-            ctx->video->FourCC = NDIlib_FourCC_type_BGRX;
-            break;
-        case AV_PIX_FMT_RGBA:
-            ctx->video->FourCC = NDIlib_FourCC_type_RGBA;
-            break;
-        case AV_PIX_FMT_RGB0:
-            ctx->video->FourCC = NDIlib_FourCC_type_RGBX;
-            break;
-    }
-
-    ctx->video->xres = c->width;
-    ctx->video->yres = c->height;
-    ctx->video->frame_rate_N = st->avg_frame_rate.num;
-    ctx->video->frame_rate_D = st->avg_frame_rate.den;
-    ctx->video->frame_format_type = c->field_order == AV_FIELD_PROGRESSIVE
-        ? NDIlib_frame_format_type_progressive
-        : NDIlib_frame_format_type_interleaved;
-
-    if (st->sample_aspect_ratio.num) {
-        AVRational display_aspect_ratio;
-        av_reduce(&display_aspect_ratio.num, &display_aspect_ratio.den,
-                  st->codecpar->width  * (int64_t)st->sample_aspect_ratio.num,
-                  st->codecpar->height * (int64_t)st->sample_aspect_ratio.den,
-                  1024 * 1024);
-        ctx->video->picture_aspect_ratio = av_q2d(display_aspect_ratio);
-    }
-    else
-        ctx->video->picture_aspect_ratio = (double)st->codecpar->width/st->codecpar->height;
-
-    avpriv_set_pts_info(st, 64, 1, NDI_TIME_BASE);
-
-    return 0;
-}
-
-static int ndi_write_header(AVFormatContext *avctx)
-{
-    int ret = 0;
-    unsigned int n;
-    struct NDIContext *ctx = avctx->priv_data;
-    const NDIlib_send_create_t ndi_send_desc = { .p_ndi_name = avctx->url,
-        .p_groups = NULL, .clock_video = ctx->clock_video, .clock_audio = ctx->clock_audio };
-
-    if (!NDIlib_initialize()) {
-        av_log(avctx, AV_LOG_ERROR, "NDIlib_initialize failed.\n");
-        return AVERROR_EXTERNAL;
-    }
-
-    /* check if streams compatible */
-    for (n = 0; n < avctx->nb_streams; n++) {
-        AVStream *st = avctx->streams[n];
-        AVCodecParameters *c = st->codecpar;
-        if        (c->codec_type == AVMEDIA_TYPE_AUDIO) {
-            if ((ret = ndi_setup_audio(avctx, st)))
-                goto error;
-        } else if (c->codec_type == AVMEDIA_TYPE_VIDEO) {
-            if ((ret = ndi_setup_video(avctx, st)))
-                goto error;
-        } else {
-            av_log(avctx, AV_LOG_ERROR, "Unsupported stream type.\n");
-            ret = AVERROR(EINVAL);
-            goto error;
-        }
-    }
-
-    ctx->ndi_send = NDIlib_send_create(&ndi_send_desc);
-    if (!ctx->ndi_send) {
-        av_log(avctx, AV_LOG_ERROR, "Failed to create NDI output %s\n", avctx->url);
-        ret = AVERROR_EXTERNAL;
-    }
-
-error:
-    return ret;
-}
-
-#define OFFSET(x) offsetof(struct NDIContext, x)
-static const AVOption options[] = {
-    { "reference_level", "The audio reference level in dB"  , OFFSET(reference_level), AV_OPT_TYPE_INT, { .i64 = 0 }, -20, 20, AV_OPT_FLAG_ENCODING_PARAM | AV_OPT_FLAG_AUDIO_PARAM},
-    { "clock_video", "These specify whether video 'clock' themselves"  , OFFSET(clock_video), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, AV_OPT_FLAG_ENCODING_PARAM | AV_OPT_FLAG_VIDEO_PARAM },
-    { "clock_audio", "These specify whether audio 'clock' themselves"  , OFFSET(clock_audio), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, AV_OPT_FLAG_ENCODING_PARAM | AV_OPT_FLAG_AUDIO_PARAM },
-    { NULL },
-};
-
-static const AVClass libndi_newtek_muxer_class = {
-    .class_name = "NDI muxer",
-    .item_name  = av_default_item_name,
-    .option     = options,
-    .version    = LIBAVUTIL_VERSION_INT,
-    .category   = AV_CLASS_CATEGORY_DEVICE_VIDEO_OUTPUT,
-};
-
-AVOutputFormat ff_libndi_newtek_muxer = {
-    .name           = "libndi_newtek",
-    .long_name      = NULL_IF_CONFIG_SMALL("Network Device Interface (NDI) output using NewTek library"),
-    .audio_codec    = AV_CODEC_ID_PCM_S16LE,
-    .video_codec    = AV_CODEC_ID_WRAPPED_AVFRAME,
-    .subtitle_codec = AV_CODEC_ID_NONE,
-    .flags          = AVFMT_NOFILE,
-    .priv_class     = &libndi_newtek_muxer_class,
-    .priv_data_size = sizeof(struct NDIContext),
-    .write_header   = ndi_write_header,
-    .write_packet   = ndi_write_packet,
-    .write_trailer  = ndi_write_trailer,
-};
diff --git a/libavdevice/openal-dec.c b/libavdevice/openal-dec.c
index c19048e..57de665 100644
--- a/libavdevice/openal-dec.c
+++ b/libavdevice/openal-dec.c
@@ -241,7 +241,7 @@
 };
 
 static const AVClass class = {
-    .class_name = "openal",
+    .class_name = "openal indev",
     .item_name = av_default_item_name,
     .option = options,
     .version = LIBAVUTIL_VERSION_INT,
diff --git a/libavdevice/opengl_enc.c b/libavdevice/opengl_enc.c
index 54c7e61..2bdb8da 100644
--- a/libavdevice/opengl_enc.c
+++ b/libavdevice/opengl_enc.c
@@ -25,7 +25,6 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
-#include <unistd.h>
 #include <stddef.h>
 
 #include "config.h"
@@ -569,8 +568,9 @@
     matrix[15] = 1.0f;
 }
 
-static av_cold int opengl_read_limits(OpenGLContext *opengl)
+static av_cold int opengl_read_limits(AVFormatContext *h)
 {
+    OpenGLContext *opengl = h->priv_data;
     static const struct{
         const char *extension;
         int major;
@@ -588,17 +588,21 @@
 
     version = glGetString(GL_VERSION);
     extensions = glGetString(GL_EXTENSIONS);
+    if (!version || !extensions) {
+        av_log(h, AV_LOG_ERROR, "No OpenGL context initialized for the current thread\n");
+        return AVERROR(ENOSYS);
+    }
 
-    av_log(opengl, AV_LOG_DEBUG, "OpenGL version: %s\n", version);
+    av_log(h, AV_LOG_DEBUG, "OpenGL version: %s\n", version);
     sscanf(version, "%d.%d", &major, &minor);
 
     for (i = 0; required_extensions[i].extension; i++) {
         if (major < required_extensions[i].major &&
             (major == required_extensions[i].major && minor < required_extensions[i].minor) &&
             !strstr(extensions, required_extensions[i].extension)) {
-            av_log(opengl, AV_LOG_ERROR, "Required extension %s is not supported.\n",
+            av_log(h, AV_LOG_ERROR, "Required extension %s is not supported.\n",
                    required_extensions[i].extension);
-            av_log(opengl, AV_LOG_DEBUG, "Supported extensions are: %s\n", extensions);
+            av_log(h, AV_LOG_DEBUG, "Supported extensions are: %s\n", extensions);
             return AVERROR(ENOSYS);
         }
     }
@@ -611,10 +615,10 @@
     opengl->unpack_subimage = 1;
 #endif
 
-    av_log(opengl, AV_LOG_DEBUG, "Non Power of 2 textures support: %s\n", opengl->non_pow_2_textures ? "Yes" : "No");
-    av_log(opengl, AV_LOG_DEBUG, "Unpack Subimage extension support: %s\n", opengl->unpack_subimage ? "Yes" : "No");
-    av_log(opengl, AV_LOG_DEBUG, "Max texture size: %dx%d\n", opengl->max_texture_size, opengl->max_texture_size);
-    av_log(opengl, AV_LOG_DEBUG, "Max viewport size: %dx%d\n",
+    av_log(h, AV_LOG_DEBUG, "Non Power of 2 textures support: %s\n", opengl->non_pow_2_textures ? "Yes" : "No");
+    av_log(h, AV_LOG_DEBUG, "Unpack Subimage extension support: %s\n", opengl->unpack_subimage ? "Yes" : "No");
+    av_log(h, AV_LOG_DEBUG, "Max texture size: %dx%d\n", opengl->max_texture_size, opengl->max_texture_size);
+    av_log(h, AV_LOG_DEBUG, "Max viewport size: %dx%d\n",
            opengl->max_viewport_width, opengl->max_viewport_height);
 
     OPENGL_ERROR_CHECK(opengl);
@@ -1051,13 +1055,14 @@
 static av_cold int opengl_write_header(AVFormatContext *h)
 {
     OpenGLContext *opengl = h->priv_data;
+    AVCodecParameters *par = h->streams[0]->codecpar;
     AVStream *st;
     int ret;
 
     if (h->nb_streams != 1 ||
-        h->streams[0]->codecpar->codec_type != AVMEDIA_TYPE_VIDEO ||
-        h->streams[0]->codecpar->codec_id != AV_CODEC_ID_RAWVIDEO) {
-        av_log(opengl, AV_LOG_ERROR, "Only a single video stream is supported.\n");
+        par->codec_type != AVMEDIA_TYPE_VIDEO ||
+        (par->codec_id != AV_CODEC_ID_WRAPPED_AVFRAME && par->codec_id != AV_CODEC_ID_RAWVIDEO)) {
+        av_log(opengl, AV_LOG_ERROR, "Only a single raw or wrapped avframe video stream is supported.\n");
         return AVERROR(EINVAL);
     }
     st = h->streams[0];
@@ -1075,7 +1080,7 @@
     if ((ret = opengl_create_window(h)))
         goto fail;
 
-    if ((ret = opengl_read_limits(opengl)) < 0)
+    if ((ret = opengl_read_limits(h)) < 0)
         goto fail;
 
     if (opengl->width > opengl->max_texture_size || opengl->height > opengl->max_texture_size) {
@@ -1252,7 +1257,13 @@
 
 static int opengl_write_packet(AVFormatContext *h, AVPacket *pkt)
 {
-    return opengl_draw(h, pkt, 0, 1);
+    AVCodecParameters *par = h->streams[0]->codecpar;
+    if (par->codec_id == AV_CODEC_ID_WRAPPED_AVFRAME) {
+        AVFrame *frame = (AVFrame *)pkt->data;
+        return opengl_draw(h, frame, 0, 0);
+    } else {
+        return opengl_draw(h, pkt, 0, 1);
+    }
 }
 
 static int opengl_write_frame(AVFormatContext *h, int stream_index,
@@ -1266,7 +1277,7 @@
 #define OFFSET(x) offsetof(OpenGLContext, x)
 #define ENC AV_OPT_FLAG_ENCODING_PARAM
 static const AVOption options[] = {
-    { "background",   "set background color",   OFFSET(background),   AV_OPT_TYPE_COLOR,  {.str = "black"}, CHAR_MIN, CHAR_MAX, ENC },
+    { "background",   "set background color",   OFFSET(background),   AV_OPT_TYPE_COLOR,  {.str = "black"}, 0, 0, ENC },
     { "no_window",    "disable default window", OFFSET(no_window),    AV_OPT_TYPE_INT,    {.i64 = 0}, INT_MIN, INT_MAX, ENC },
     { "window_title", "set window title",       OFFSET(window_title), AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, ENC },
     { "window_size",  "set window size",        OFFSET(window_width), AV_OPT_TYPE_IMAGE_SIZE, {.str = NULL}, 0, 0, ENC },
@@ -1286,7 +1297,7 @@
     .long_name      = NULL_IF_CONFIG_SMALL("OpenGL output"),
     .priv_data_size = sizeof(OpenGLContext),
     .audio_codec    = AV_CODEC_ID_NONE,
-    .video_codec    = AV_CODEC_ID_RAWVIDEO,
+    .video_codec    = AV_CODEC_ID_WRAPPED_AVFRAME,
     .write_header   = opengl_write_header,
     .write_packet   = opengl_write_packet,
     .write_uncoded_frame = opengl_write_frame,
diff --git a/libavdevice/oss_dec.c b/libavdevice/oss_dec.c
index d0dc327..13ace70 100644
--- a/libavdevice/oss_dec.c
+++ b/libavdevice/oss_dec.c
@@ -125,7 +125,7 @@
 };
 
 static const AVClass oss_demuxer_class = {
-    .class_name     = "OSS demuxer",
+    .class_name     = "OSS indev",
     .item_name      = av_default_item_name,
     .option         = options,
     .version        = LIBAVUTIL_VERSION_INT,
diff --git a/libavdevice/oss_enc.c b/libavdevice/oss_enc.c
index e3172af..274c760 100644
--- a/libavdevice/oss_enc.c
+++ b/libavdevice/oss_enc.c
@@ -90,7 +90,7 @@
 }
 
 static const AVClass oss_muxer_class = {
-    .class_name     = "OSS muxer",
+    .class_name     = "OSS outdev",
     .item_name      = av_default_item_name,
     .version        = LIBAVUTIL_VERSION_INT,
     .category       = AV_CLASS_CATEGORY_DEVICE_AUDIO_OUTPUT,
diff --git a/libavdevice/pulse_audio_dec.c b/libavdevice/pulse_audio_dec.c
index 042fe76..50a3c97 100644
--- a/libavdevice/pulse_audio_dec.c
+++ b/libavdevice/pulse_audio_dec.c
@@ -359,7 +359,7 @@
 };
 
 static const AVClass pulse_demuxer_class = {
-    .class_name     = "Pulse demuxer",
+    .class_name     = "Pulse indev",
     .item_name      = av_default_item_name,
     .option         = options,
     .version        = LIBAVUTIL_VERSION_INT,
diff --git a/libavdevice/pulse_audio_enc.c b/libavdevice/pulse_audio_enc.c
index d430b77..e0a631b 100644
--- a/libavdevice/pulse_audio_enc.c
+++ b/libavdevice/pulse_audio_enc.c
@@ -771,7 +771,7 @@
 };
 
 static const AVClass pulse_muxer_class = {
-    .class_name     = "PulseAudio muxer",
+    .class_name     = "PulseAudio outdev",
     .item_name      = av_default_item_name,
     .option         = options,
     .version        = LIBAVUTIL_VERSION_INT,
diff --git a/libavdevice/sdl2.c b/libavdevice/sdl2.c
index da51430..d6fc74a 100644
--- a/libavdevice/sdl2.c
+++ b/libavdevice/sdl2.c
@@ -40,6 +40,7 @@
     SDL_Renderer *renderer;
     char *window_title;
     int window_width, window_height;  /**< size of the window */
+    int window_x, window_y;           /**< position of the window */
     int window_fullscreen;
     int window_borderless;
     int enable_quit_action;
@@ -155,8 +156,6 @@
     return 0;
 }
 
-#define SDL_BASE_FLAGS (SDL_SWSURFACE|SDL_WINDOW_RESIZABLE)
-
 static int sdl2_write_header(AVFormatContext *s)
 {
     SDLContext *sdl = s->priv_data;
@@ -196,8 +195,9 @@
     }
 
     /* resize texture to width and height from the codec context information */
-    flags = SDL_BASE_FLAGS | (sdl->window_fullscreen ? SDL_WINDOW_FULLSCREEN : 0) |
-                             (sdl->window_borderless ? SDL_WINDOW_BORDERLESS : 0);
+    flags = SDL_WINDOW_HIDDEN |
+            (sdl->window_fullscreen ? SDL_WINDOW_FULLSCREEN : 0) |
+            (sdl->window_borderless ? SDL_WINDOW_BORDERLESS : SDL_WINDOW_RESIZABLE);
 
     /* initialization */
     if (!sdl->inited){
@@ -216,6 +216,8 @@
     }
 
     SDL_SetWindowTitle(sdl->window, sdl->window_title);
+    SDL_SetWindowPosition(sdl->window, sdl->window_x, sdl->window_y);
+    SDL_ShowWindow(sdl->window);
 
     sdl->texture = SDL_CreateTexture(sdl->renderer, sdl->texture_fmt, SDL_TEXTUREACCESS_STREAMING,
                                      codecpar->width, codecpar->height);
@@ -337,6 +339,8 @@
 static const AVOption options[] = {
     { "window_title",      "set SDL window title",       OFFSET(window_title), AV_OPT_TYPE_STRING,     { .str = NULL }, 0, 0, AV_OPT_FLAG_ENCODING_PARAM },
     { "window_size",       "set SDL window forced size", OFFSET(window_width), AV_OPT_TYPE_IMAGE_SIZE, { .str = NULL }, 0, 0, AV_OPT_FLAG_ENCODING_PARAM },
+    { "window_x",          "set SDL window x position",  OFFSET(window_x),     AV_OPT_TYPE_INT,        { .i64 = SDL_WINDOWPOS_CENTERED }, INT_MIN, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM },
+    { "window_y",          "set SDL window y position",  OFFSET(window_y),     AV_OPT_TYPE_INT,        { .i64 = SDL_WINDOWPOS_CENTERED }, INT_MIN, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM },
     { "window_fullscreen", "set SDL window fullscreen",  OFFSET(window_fullscreen), AV_OPT_TYPE_BOOL,  { .i64 = 0 },    0, 1, AV_OPT_FLAG_ENCODING_PARAM },
     { "window_borderless", "set SDL window border off",  OFFSET(window_borderless), AV_OPT_TYPE_BOOL,  { .i64 = 0 },    0, 1, AV_OPT_FLAG_ENCODING_PARAM },
     { "window_enable_quit", "set if quit action is available", OFFSET(enable_quit_action), AV_OPT_TYPE_INT, {.i64=1},   0, 1, AV_OPT_FLAG_ENCODING_PARAM },
diff --git a/libavdevice/v4l2-common.c b/libavdevice/v4l2-common.c
index 2d6bfac..b5b4448 100644
--- a/libavdevice/v4l2-common.c
+++ b/libavdevice/v4l2-common.c
@@ -46,6 +46,9 @@
 #ifdef V4L2_PIX_FMT_Y16
     { AV_PIX_FMT_GRAY16LE,AV_CODEC_ID_RAWVIDEO, V4L2_PIX_FMT_Y16     },
 #endif
+#ifdef V4L2_PIX_FMT_Z16
+    { AV_PIX_FMT_GRAY16LE,AV_CODEC_ID_RAWVIDEO, V4L2_PIX_FMT_Z16     },
+#endif
     { AV_PIX_FMT_NV12,    AV_CODEC_ID_RAWVIDEO, V4L2_PIX_FMT_NV12    },
     { AV_PIX_FMT_NONE,    AV_CODEC_ID_MJPEG,    V4L2_PIX_FMT_MJPEG   },
     { AV_PIX_FMT_NONE,    AV_CODEC_ID_MJPEG,    V4L2_PIX_FMT_JPEG    },
diff --git a/libavdevice/v4l2.c b/libavdevice/v4l2.c
index 10a0ff0..365bacd 100644
--- a/libavdevice/v4l2.c
+++ b/libavdevice/v4l2.c
@@ -95,7 +95,11 @@
     int (*open_f)(const char *file, int oflag, ...);
     int (*close_f)(int fd);
     int (*dup_f)(int fd);
+#ifdef __GLIBC__
     int (*ioctl_f)(int fd, unsigned long int request, ...);
+#else
+    int (*ioctl_f)(int fd, int request, ...);
+#endif
     ssize_t (*read_f)(int fd, void *buffer, size_t n);
     void *(*mmap_f)(void *start, size_t length, int prot, int flags, int fd, int64_t offset);
     int (*munmap_f)(void *_start, size_t length);
@@ -534,11 +538,10 @@
             s->frame_size = buf.bytesused;
 
         if (s->frame_size > 0 && buf.bytesused != s->frame_size) {
-            av_log(ctx, AV_LOG_ERROR,
+            av_log(ctx, AV_LOG_WARNING,
                    "Dequeued v4l2 buffer contains %d bytes, but %d were expected. Flags: 0x%08X.\n",
                    buf.bytesused, s->frame_size, buf.flags);
-            enqueue_buffer(s, &buf);
-            return AVERROR_INVALIDDATA;
+            buf.bytesused = 0;
         }
     }
 
@@ -808,11 +811,12 @@
     }
 
     *codec_id = ff_fmt_v4l2codec(*desired_format);
-    av_assert0(*codec_id != AV_CODEC_ID_NONE);
+    if (*codec_id == AV_CODEC_ID_NONE)
+        av_assert0(ret == AVERROR(EINVAL));
     return ret;
 }
 
-static int v4l2_read_probe(AVProbeData *p)
+static int v4l2_read_probe(const AVProbeData *p)
 {
     if (av_strstart(p->filename, "/dev/video", NULL))
         return AVPROBE_SCORE_MAX - 1;
diff --git a/libavdevice/version.h b/libavdevice/version.h
index e6ee009..1071756 100644
--- a/libavdevice/version.h
+++ b/libavdevice/version.h
@@ -28,8 +28,8 @@
 #include "libavutil/version.h"
 
 #define LIBAVDEVICE_VERSION_MAJOR  58
-#define LIBAVDEVICE_VERSION_MINOR   4
-#define LIBAVDEVICE_VERSION_MICRO 105
+#define LIBAVDEVICE_VERSION_MINOR   9
+#define LIBAVDEVICE_VERSION_MICRO 103
 
 #define LIBAVDEVICE_VERSION_INT AV_VERSION_INT(LIBAVDEVICE_VERSION_MAJOR, \
                                                LIBAVDEVICE_VERSION_MINOR, \
diff --git a/libavdevice/xcbgrab.c b/libavdevice/xcbgrab.c
index 6d142ab..6f6b2db 100644
--- a/libavdevice/xcbgrab.c
+++ b/libavdevice/xcbgrab.c
@@ -49,16 +49,15 @@
 typedef struct XCBGrabContext {
     const AVClass *class;
 
-    uint8_t *buffer;
-
     xcb_connection_t *conn;
     xcb_screen_t *screen;
     xcb_window_t window;
 #if CONFIG_LIBXCB_SHM
-    xcb_shm_seg_t segment;
+    AVBufferPool *shm_pool;
 #endif
     int64_t time_frame;
     AVRational time_base;
+    int64_t frame_duration;
 
     int x, y;
     int width, height;
@@ -71,7 +70,6 @@
     int region_border;
     int centered;
 
-    const char *video_size;
     const char *framerate;
 
     int has_shm;
@@ -86,7 +84,7 @@
     { "y", "Initial y coordinate.", OFFSET(y), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, D },
     { "grab_x", "Initial x coordinate.", OFFSET(x), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, D },
     { "grab_y", "Initial y coordinate.", OFFSET(y), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, D },
-    { "video_size", "A string describing frame size, such as 640x480 or hd720.", OFFSET(video_size), AV_OPT_TYPE_STRING, {.str = "vga" }, 0, 0, D },
+    { "video_size", "A string describing frame size, such as 640x480 or hd720.", OFFSET(width), AV_OPT_TYPE_IMAGE_SIZE, {.str = NULL }, 0, 0, D },
     { "framerate", "", OFFSET(framerate), AV_OPT_TYPE_STRING, {.str = "ntsc" }, 0, 0, D },
     { "draw_mouse", "Draw the mouse pointer.", OFFSET(draw_mouse), AV_OPT_TYPE_INT, { .i64 = 1 }, 0, 1, D },
     { "follow_mouse", "Move the grabbing region when the mouse pointer reaches within specified amount of pixels to the edge of region.",
@@ -127,7 +125,7 @@
         int left   = x + f;
         int right  = x + w - f;
         int top    = y + f;
-        int bottom = y + h + f;
+        int bottom = y + h - f;
         if (p_x > right) {
             x += p_x - right;
         } else if (p_x < left) {
@@ -146,6 +144,11 @@
     return 0;
 }
 
+static void xcbgrab_image_reply_free(void *opaque, uint8_t *data)
+{
+    free(opaque);
+}
+
 static int xcbgrab_frame(AVFormatContext *s, AVPacket *pkt)
 {
     XCBGrabContext *c = s->priv_data;
@@ -154,7 +157,7 @@
     xcb_drawable_t drawable = c->screen->root;
     xcb_generic_error_t *e = NULL;
     uint8_t *data;
-    int length, ret;
+    int length;
 
     iq  = xcb_get_image(c->conn, XCB_IMAGE_FORMAT_Z_PIXMAP, drawable,
                         c->x, c->y, c->width, c->height, ~0);
@@ -168,6 +171,7 @@
                "sequence:%u resource_id:%u minor_code:%u major_code:%u.\n",
                e->response_type, e->error_code,
                e->sequence, e->resource_id, e->minor_code, e->major_code);
+        free(e);
         return AVERROR(EACCES);
     }
 
@@ -177,23 +181,26 @@
     data   = xcb_get_image_data(img);
     length = xcb_get_image_data_length(img);
 
-    ret = av_new_packet(pkt, length);
+    av_init_packet(pkt);
 
-    if (!ret)
-        memcpy(pkt->data, data, length);
+    pkt->buf = av_buffer_create(data, length, xcbgrab_image_reply_free, img, 0);
+    if (!pkt->buf) {
+        free(img);
+        return AVERROR(ENOMEM);
+    }
 
-    free(img);
+    pkt->data = data;
+    pkt->size = length;
 
-    return ret;
+    return 0;
 }
 
-static void wait_frame(AVFormatContext *s, AVPacket *pkt)
+static int64_t wait_frame(AVFormatContext *s, AVPacket *pkt)
 {
     XCBGrabContext *c = s->priv_data;
     int64_t curtime, delay;
-    int64_t frame_time = av_rescale_q(1, c->time_base, AV_TIME_BASE_Q);
 
-    c->time_frame += frame_time;
+    c->time_frame += c->frame_duration;
 
     for (;;) {
         curtime = av_gettime();
@@ -203,7 +210,7 @@
         av_usleep(delay);
     }
 
-    pkt->pts = curtime;
+    return curtime;
 }
 
 #if CONFIG_LIBXCB_SHM
@@ -221,31 +228,35 @@
     return 0;
 }
 
-static int allocate_shm(AVFormatContext *s)
+static void free_shm_buffer(void *opaque, uint8_t *data)
 {
-    XCBGrabContext *c = s->priv_data;
-    int size = c->frame_size + AV_INPUT_BUFFER_PADDING_SIZE;
+    shmdt(data);
+}
+
+static AVBufferRef *allocate_shm_buffer(void *opaque, int size)
+{
+    xcb_connection_t *conn = opaque;
+    xcb_shm_seg_t segment;
+    AVBufferRef *ref;
     uint8_t *data;
     int id;
 
-    if (c->buffer)
-        return 0;
     id = shmget(IPC_PRIVATE, size, IPC_CREAT | 0777);
-    if (id == -1) {
-        char errbuf[1024];
-        int err = AVERROR(errno);
-        av_strerror(err, errbuf, sizeof(errbuf));
-        av_log(s, AV_LOG_ERROR, "Cannot get %d bytes of shared memory: %s.\n",
-               size, errbuf);
-        return err;
-    }
-    xcb_shm_attach(c->conn, c->segment, id, 0);
+    if (id == -1)
+        return NULL;
+
+    segment = xcb_generate_id(conn);
+    xcb_shm_attach(conn, segment, id, 0);
     data = shmat(id, NULL, 0);
     shmctl(id, IPC_RMID, 0);
     if ((intptr_t)data == -1 || !data)
-        return AVERROR(errno);
-    c->buffer = data;
-    return 0;
+        return NULL;
+
+    ref = av_buffer_create(data, size, free_shm_buffer, (void *)(ptrdiff_t)segment, 0);
+    if (!ref)
+        shmdt(data);
+
+    return ref;
 }
 
 static int xcbgrab_frame_shm(AVFormatContext *s, AVPacket *pkt)
@@ -255,15 +266,19 @@
     xcb_shm_get_image_reply_t *img;
     xcb_drawable_t drawable = c->screen->root;
     xcb_generic_error_t *e = NULL;
-    int ret;
+    AVBufferRef *buf;
+    xcb_shm_seg_t segment;
 
-    ret = allocate_shm(s);
-    if (ret < 0)
-        return ret;
+    buf = av_buffer_pool_get(c->shm_pool);
+    if (!buf) {
+        av_log(s, AV_LOG_ERROR, "Could not get shared memory buffer.\n");
+        return AVERROR(ENOMEM);
+    }
+    segment = (xcb_shm_seg_t)av_buffer_pool_buffer_get_opaque(buf);
 
     iq = xcb_shm_get_image(c->conn, drawable,
                            c->x, c->y, c->width, c->height, ~0,
-                           XCB_IMAGE_FORMAT_Z_PIXMAP, c->segment, 0);
+                           XCB_IMAGE_FORMAT_Z_PIXMAP, segment, 0);
     img = xcb_shm_get_image_reply(c->conn, iq, &e);
 
     xcb_flush(c->conn);
@@ -276,12 +291,17 @@
                e->response_type, e->error_code,
                e->sequence, e->resource_id, e->minor_code, e->major_code);
 
+        free(e);
+        av_buffer_unref(&buf);
         return AVERROR(EACCES);
     }
 
     free(img);
 
-    pkt->data = c->buffer;
+    av_init_packet(pkt);
+
+    pkt->buf = buf;
+    pkt->data = buf->data;
     pkt->size = c->frame_size;
 
     return 0;
@@ -397,8 +417,9 @@
     xcb_query_pointer_reply_t *p  = NULL;
     xcb_get_geometry_reply_t *geo = NULL;
     int ret = 0;
+    int64_t pts;
 
-    wait_frame(s, pkt);
+    pts = wait_frame(s, pkt);
 
     if (c->follow_mouse || c->draw_mouse) {
         pc  = xcb_query_pointer(c->conn, c->screen->root);
@@ -414,11 +435,15 @@
         xcbgrab_update_region(s);
 
 #if CONFIG_LIBXCB_SHM
-    if (c->has_shm && xcbgrab_frame_shm(s, pkt) < 0)
+    if (c->has_shm && xcbgrab_frame_shm(s, pkt) < 0) {
+        av_log(s, AV_LOG_WARNING, "Continuing without shared memory.\n");
         c->has_shm = 0;
+    }
 #endif
     if (!c->has_shm)
         ret = xcbgrab_frame(s, pkt);
+    pkt->dts = pkt->pts = pts;
+    pkt->duration = c->frame_duration;
 
 #if CONFIG_LIBXCB_XFIXES
     if (ret >= 0 && c->draw_mouse && p->same_screen)
@@ -436,9 +461,7 @@
     XCBGrabContext *ctx = s->priv_data;
 
 #if CONFIG_LIBXCB_SHM
-    if (ctx->buffer) {
-        shmdt(ctx->buffer);
-    }
+    av_buffer_pool_uninit(&ctx->shm_pool);
 #endif
 
     xcb_disconnect(ctx->conn);
@@ -464,7 +487,7 @@
 }
 
 static int pixfmt_from_pixmap_format(AVFormatContext *s, int depth,
-                                     int *pix_fmt)
+                                     int *pix_fmt, int *bpp)
 {
     XCBGrabContext *c        = s->priv_data;
     const xcb_setup_t *setup = xcb_get_setup(c->conn);
@@ -502,8 +525,7 @@
         }
 
         if (*pix_fmt) {
-            c->bpp        = fmt->bits_per_pixel;
-            c->frame_size = c->width * c->height * fmt->bits_per_pixel / 8;
+            *bpp        = fmt->bits_per_pixel;
             return 0;
         }
 
@@ -520,15 +542,12 @@
     AVStream *st      = avformat_new_stream(s, NULL);
     xcb_get_geometry_cookie_t gc;
     xcb_get_geometry_reply_t *geo;
+    int64_t frame_size_bits;
     int ret;
 
     if (!st)
         return AVERROR(ENOMEM);
 
-    ret = av_parse_video_size(&c->width, &c->height, c->video_size);
-    if (ret < 0)
-        return ret;
-
     ret = av_parse_video_rate(&st->avg_frame_rate, c->framerate);
     if (ret < 0)
         return ret;
@@ -537,6 +556,13 @@
 
     gc  = xcb_get_geometry(c->conn, c->screen->root);
     geo = xcb_get_geometry_reply(c->conn, gc, NULL);
+    if (!geo)
+        return AVERROR_EXTERNAL;
+
+    if (!c->width || !c->height) {
+        c->width = geo->width;
+        c->height = geo->height;
+    }
 
     if (c->x + c->width > geo->width ||
         c->y + c->height > geo->height) {
@@ -546,21 +572,39 @@
                c->width, c->height,
                c->x, c->y,
                geo->width, geo->height);
+        free(geo);
         return AVERROR(EINVAL);
     }
 
     c->time_base  = (AVRational){ st->avg_frame_rate.den,
                                   st->avg_frame_rate.num };
+    c->frame_duration = av_rescale_q(1, c->time_base, AV_TIME_BASE_Q);
     c->time_frame = av_gettime();
 
+    ret = pixfmt_from_pixmap_format(s, geo->depth, &st->codecpar->format, &c->bpp);
+    free(geo);
+    if (ret < 0)
+        return ret;
+
+    frame_size_bits = (int64_t)c->width * c->height * c->bpp;
+    if (frame_size_bits / 8 + AV_INPUT_BUFFER_PADDING_SIZE > INT_MAX) {
+        av_log(s, AV_LOG_ERROR, "Captured area is too large\n");
+        return AVERROR_PATCHWELCOME;
+    }
+    c->frame_size = frame_size_bits / 8;
+
+#if CONFIG_LIBXCB_SHM
+    c->shm_pool = av_buffer_pool_init2(c->frame_size + AV_INPUT_BUFFER_PADDING_SIZE,
+                                           c->conn, allocate_shm_buffer, NULL);
+    if (!c->shm_pool)
+        return AVERROR(ENOMEM);
+#endif
+
     st->codecpar->codec_type = AVMEDIA_TYPE_VIDEO;
     st->codecpar->codec_id   = AV_CODEC_ID_RAWVIDEO;
     st->codecpar->width      = c->width;
     st->codecpar->height     = c->height;
-
-    ret = pixfmt_from_pixmap_format(s, geo->depth, &st->codecpar->format);
-
-    free(geo);
+    st->codecpar->bit_rate   = av_rescale(frame_size_bits, st->avg_frame_rate.num, st->avg_frame_rate.den);
 
     return ret;
 }
@@ -666,8 +710,7 @@
     }
 
 #if CONFIG_LIBXCB_SHM
-    if ((c->has_shm = check_shm(c->conn)))
-        c->segment = xcb_generate_id(c->conn);
+    c->has_shm = check_shm(c->conn);
 #endif
 
 #if CONFIG_LIBXCB_XFIXES
diff --git a/libavdevice/xv.c b/libavdevice/xv.c
index c3ed2e4..50dc4e0 100644
--- a/libavdevice/xv.c
+++ b/libavdevice/xv.c
@@ -113,8 +113,8 @@
 
     if (   s->nb_streams > 1
         || par->codec_type != AVMEDIA_TYPE_VIDEO
-        || par->codec_id   != AV_CODEC_ID_RAWVIDEO) {
-        av_log(s, AV_LOG_ERROR, "Only supports one rawvideo stream\n");
+        || (par->codec_id != AV_CODEC_ID_WRAPPED_AVFRAME && par->codec_id != AV_CODEC_ID_RAWVIDEO)) {
+        av_log(s, AV_LOG_ERROR, "Only a single raw or wrapped avframe video stream is supported.\n");
         return AVERROR(EINVAL);
     }
 
@@ -322,12 +322,18 @@
 static int xv_write_packet(AVFormatContext *s, AVPacket *pkt)
 {
     AVCodecParameters *par = s->streams[0]->codecpar;
-    uint8_t *data[4];
-    int linesize[4];
 
-    av_image_fill_arrays(data, linesize, pkt->data, par->format,
-                         par->width, par->height, 1);
-    return write_picture(s, data, linesize);
+    if (par->codec_id == AV_CODEC_ID_WRAPPED_AVFRAME) {
+        AVFrame *frame = (AVFrame *)pkt->data;
+        return write_picture(s, frame->data, frame->linesize);
+    } else {
+        uint8_t *data[4];
+        int linesize[4];
+
+        av_image_fill_arrays(data, linesize, pkt->data, par->format,
+                             par->width, par->height, 1);
+        return write_picture(s, data, linesize);
+    }
 }
 
 static int xv_write_frame(AVFormatContext *s, int stream_index, AVFrame **frame,
@@ -375,7 +381,7 @@
     .long_name      = NULL_IF_CONFIG_SMALL("XV (XVideo) output device"),
     .priv_data_size = sizeof(XVContext),
     .audio_codec    = AV_CODEC_ID_NONE,
-    .video_codec    = AV_CODEC_ID_RAWVIDEO,
+    .video_codec    = AV_CODEC_ID_WRAPPED_AVFRAME,
     .write_header   = xv_write_header,
     .write_packet   = xv_write_packet,
     .write_uncoded_frame = xv_write_frame,
diff --git a/libavfilter/Makefile b/libavfilter/Makefile
index 62cc2f5..e1205eb 100644
--- a/libavfilter/Makefile
+++ b/libavfilter/Makefile
@@ -26,8 +26,8 @@
 
 # subsystems
 OBJS-$(CONFIG_QSVVPP)                        += qsvvpp.o
-DNN-OBJS-$(CONFIG_LIBTENSORFLOW)             += dnn_backend_tf.o
-OBJS-$(CONFIG_DNN)                           += dnn_interface.o dnn_backend_native.o $(DNN-OBJS-yes)
+OBJS-$(CONFIG_SCENE_SAD)                     += scene_sad.o
+include $(SRC_PATH)/libavfilter/dnn/Makefile
 
 # audio filters
 OBJS-$(CONFIG_ABENCH_FILTER)                 += f_bench.o
@@ -62,6 +62,8 @@
 OBJS-$(CONFIG_AMIX_FILTER)                   += af_amix.o
 OBJS-$(CONFIG_AMULTIPLY_FILTER)              += af_amultiply.o
 OBJS-$(CONFIG_ANEQUALIZER_FILTER)            += af_anequalizer.o
+OBJS-$(CONFIG_ANLMDN_FILTER)                 += af_anlmdn.o
+OBJS-$(CONFIG_ANLMS_FILTER)                  += af_anlms.o
 OBJS-$(CONFIG_ANULL_FILTER)                  += af_anull.o
 OBJS-$(CONFIG_APAD_FILTER)                   += af_apad.o
 OBJS-$(CONFIG_APERMS_FILTER)                 += f_perms.o
@@ -70,6 +72,7 @@
 OBJS-$(CONFIG_AREALTIME_FILTER)              += f_realtime.o
 OBJS-$(CONFIG_ARESAMPLE_FILTER)              += af_aresample.o
 OBJS-$(CONFIG_AREVERSE_FILTER)               += f_reverse.o
+OBJS-$(CONFIG_ARNNDN_FILTER)                 += af_arnndn.o
 OBJS-$(CONFIG_ASELECT_FILTER)                += f_select.o
 OBJS-$(CONFIG_ASENDCMD_FILTER)               += f_sendcmd.o
 OBJS-$(CONFIG_ASETNSAMPLES_FILTER)           += af_asetnsamples.o
@@ -78,11 +81,14 @@
 OBJS-$(CONFIG_ASETTB_FILTER)                 += settb.o
 OBJS-$(CONFIG_ASHOWINFO_FILTER)              += af_ashowinfo.o
 OBJS-$(CONFIG_ASIDEDATA_FILTER)              += f_sidedata.o
+OBJS-$(CONFIG_ASOFTCLIP_FILTER)              += af_asoftclip.o
 OBJS-$(CONFIG_ASPLIT_FILTER)                 += split.o
+OBJS-$(CONFIG_ASR_FILTER)                    += af_asr.o
 OBJS-$(CONFIG_ASTATS_FILTER)                 += af_astats.o
 OBJS-$(CONFIG_ASTREAMSELECT_FILTER)          += f_streamselect.o framesync.o
 OBJS-$(CONFIG_ATEMPO_FILTER)                 += af_atempo.o
 OBJS-$(CONFIG_ATRIM_FILTER)                  += trim.o
+OBJS-$(CONFIG_AXCORRELATE_FILTER)            += af_axcorrelate.o
 OBJS-$(CONFIG_AZMQ_FILTER)                   += f_zmq.o
 OBJS-$(CONFIG_BANDPASS_FILTER)               += af_biquads.o
 OBJS-$(CONFIG_BANDREJECT_FILTER)             += af_biquads.o
@@ -97,6 +103,7 @@
 OBJS-$(CONFIG_CROSSFEED_FILTER)              += af_crossfeed.o
 OBJS-$(CONFIG_CRYSTALIZER_FILTER)            += af_crystalizer.o
 OBJS-$(CONFIG_DCSHIFT_FILTER)                += af_dcshift.o
+OBJS-$(CONFIG_DEESSER_FILTER)                += af_deesser.o
 OBJS-$(CONFIG_DRMETER_FILTER)                += af_drmeter.o
 OBJS-$(CONFIG_DYNAUDNORM_FILTER)             += af_dynaudnorm.o
 OBJS-$(CONFIG_EARWAX_FILTER)                 += af_earwax.o
@@ -137,15 +144,18 @@
 OBJS-$(CONFIG_VOLUMEDETECT_FILTER)           += af_volumedetect.o
 
 OBJS-$(CONFIG_AEVALSRC_FILTER)               += aeval.o
+OBJS-$(CONFIG_AFIRSRC_FILTER)                += asrc_afirsrc.o
 OBJS-$(CONFIG_ANOISESRC_FILTER)              += asrc_anoisesrc.o
 OBJS-$(CONFIG_ANULLSRC_FILTER)               += asrc_anullsrc.o
 OBJS-$(CONFIG_FLITE_FILTER)                  += asrc_flite.o
 OBJS-$(CONFIG_HILBERT_FILTER)                += asrc_hilbert.o
+OBJS-$(CONFIG_SINC_FILTER)                   += asrc_sinc.o
 OBJS-$(CONFIG_SINE_FILTER)                   += asrc_sine.o
 
 OBJS-$(CONFIG_ANULLSINK_FILTER)              += asink_anullsink.o
 
 # video filters
+OBJS-$(CONFIG_ADDROI_FILTER)                 += vf_addroi.o
 OBJS-$(CONFIG_ALPHAEXTRACT_FILTER)           += vf_extractplanes.o
 OBJS-$(CONFIG_ALPHAMERGE_FILTER)             += vf_alphamerge.o
 OBJS-$(CONFIG_AMPLIFY_FILTER)                += vf_amplify.o
@@ -154,23 +164,32 @@
 OBJS-$(CONFIG_AVGBLUR_FILTER)                += vf_avgblur.o
 OBJS-$(CONFIG_AVGBLUR_OPENCL_FILTER)         += vf_avgblur_opencl.o opencl.o \
                                                 opencl/avgblur.o boxblur.o
+OBJS-$(CONFIG_AVGBLUR_VULKAN_FILTER)         += vf_avgblur_vulkan.o vulkan.o
 OBJS-$(CONFIG_BBOX_FILTER)                   += bbox.o vf_bbox.o
 OBJS-$(CONFIG_BENCH_FILTER)                  += f_bench.o
+OBJS-$(CONFIG_BILATERAL_FILTER)              += vf_bilateral.o
 OBJS-$(CONFIG_BITPLANENOISE_FILTER)          += vf_bitplanenoise.o
 OBJS-$(CONFIG_BLACKDETECT_FILTER)            += vf_blackdetect.o
 OBJS-$(CONFIG_BLACKFRAME_FILTER)             += vf_blackframe.o
 OBJS-$(CONFIG_BLEND_FILTER)                  += vf_blend.o framesync.o
-OBJS-$(CONFIG_BM3D_FILTER)                   += vf_bm3d.o
+OBJS-$(CONFIG_BM3D_FILTER)                   += vf_bm3d.o framesync.o
 OBJS-$(CONFIG_BOXBLUR_FILTER)                += vf_boxblur.o boxblur.o
 OBJS-$(CONFIG_BOXBLUR_OPENCL_FILTER)         += vf_avgblur_opencl.o opencl.o \
                                                 opencl/avgblur.o boxblur.o
-OBJS-$(CONFIG_BWDIF_FILTER)                  += vf_bwdif.o
+OBJS-$(CONFIG_BWDIF_FILTER)                  += vf_bwdif.o yadif_common.o
+OBJS-$(CONFIG_CAS_FILTER)                    += vf_cas.o
+OBJS-$(CONFIG_CHROMABER_VULKAN_FILTER)       += vf_chromaber_vulkan.o vulkan.o
+OBJS-$(CONFIG_CHROMAHOLD_FILTER)             += vf_chromakey.o
 OBJS-$(CONFIG_CHROMAKEY_FILTER)              += vf_chromakey.o
+OBJS-$(CONFIG_CHROMASHIFT_FILTER)            += vf_chromashift.o
 OBJS-$(CONFIG_CIESCOPE_FILTER)               += vf_ciescope.o
 OBJS-$(CONFIG_CODECVIEW_FILTER)              += vf_codecview.o
 OBJS-$(CONFIG_COLORBALANCE_FILTER)           += vf_colorbalance.o
 OBJS-$(CONFIG_COLORCHANNELMIXER_FILTER)      += vf_colorchannelmixer.o
 OBJS-$(CONFIG_COLORKEY_FILTER)               += vf_colorkey.o
+OBJS-$(CONFIG_COLORKEY_OPENCL_FILTER)        += vf_colorkey_opencl.o opencl.o \
+                                                opencl/colorkey.o
+OBJS-$(CONFIG_COLORHOLD_FILTER)              += vf_colorkey.o
 OBJS-$(CONFIG_COLORLEVELS_FILTER)            += vf_colorlevels.o
 OBJS-$(CONFIG_COLORMATRIX_FILTER)            += vf_colormatrix.o
 OBJS-$(CONFIG_COLORSPACE_FILTER)             += vf_colorspace.o colorspace.o colorspacedsp.o
@@ -190,7 +209,9 @@
 OBJS-$(CONFIG_DEBAND_FILTER)                 += vf_deband.o
 OBJS-$(CONFIG_DEBLOCK_FILTER)                += vf_deblock.o
 OBJS-$(CONFIG_DECIMATE_FILTER)               += vf_decimate.o
+OBJS-$(CONFIG_DERAIN_FILTER)                 += vf_derain.o
 OBJS-$(CONFIG_DECONVOLVE_FILTER)             += vf_convolve.o framesync.o
+OBJS-$(CONFIG_DEDOT_FILTER)                  += vf_dedot.o
 OBJS-$(CONFIG_DEFLATE_FILTER)                += vf_neighbor.o
 OBJS-$(CONFIG_DEFLICKER_FILTER)              += vf_deflicker.o
 OBJS-$(CONFIG_DEINTERLACE_QSV_FILTER)        += vf_deinterlace_qsv.o
@@ -198,6 +219,8 @@
 OBJS-$(CONFIG_DEJUDDER_FILTER)               += vf_dejudder.o
 OBJS-$(CONFIG_DELOGO_FILTER)                 += vf_delogo.o
 OBJS-$(CONFIG_DENOISE_VAAPI_FILTER)          += vf_misc_vaapi.o vaapi_vpp.o
+OBJS-$(CONFIG_DESHAKE_OPENCL_FILTER)        += vf_deshake_opencl.o opencl.o \
+                                                opencl/deshake.o
 OBJS-$(CONFIG_DESHAKE_FILTER)                += vf_deshake.o
 OBJS-$(CONFIG_DESPILL_FILTER)                += vf_despill.o
 OBJS-$(CONFIG_DETELECINE_FILTER)             += vf_detelecine.o
@@ -205,6 +228,7 @@
 OBJS-$(CONFIG_DILATION_OPENCL_FILTER)        += vf_neighbor_opencl.o opencl.o \
                                                 opencl/neighbor.o
 OBJS-$(CONFIG_DISPLACE_FILTER)               += vf_displace.o framesync.o
+OBJS-$(CONFIG_DNN_PROCESSING_FILTER)         += vf_dnn_processing.o
 OBJS-$(CONFIG_DOUBLEWEAVE_FILTER)            += vf_weave.o
 OBJS-$(CONFIG_DRAWBOX_FILTER)                += vf_drawbox.o
 OBJS-$(CONFIG_DRAWGRAPH_FILTER)              += f_drawgraph.o
@@ -233,11 +257,14 @@
 OBJS-$(CONFIG_FRAMEPACK_FILTER)              += vf_framepack.o
 OBJS-$(CONFIG_FRAMERATE_FILTER)              += vf_framerate.o
 OBJS-$(CONFIG_FRAMESTEP_FILTER)              += vf_framestep.o
+OBJS-$(CONFIG_FREEZEDETECT_FILTER)           += vf_freezedetect.o
+OBJS-$(CONFIG_FREEZEFRAMES_FILTER)           += vf_freezeframes.o
 OBJS-$(CONFIG_FREI0R_FILTER)                 += vf_frei0r.o
 OBJS-$(CONFIG_FSPP_FILTER)                   += vf_fspp.o
 OBJS-$(CONFIG_GBLUR_FILTER)                  += vf_gblur.o
 OBJS-$(CONFIG_GEQ_FILTER)                    += vf_geq.o
 OBJS-$(CONFIG_GRADFUN_FILTER)                += vf_gradfun.o
+OBJS-$(CONFIG_GRAPHMONITOR_FILTER)           += f_graphmonitor.o
 OBJS-$(CONFIG_GREYEDGE_FILTER)               += vf_colorconstancy.o
 OBJS-$(CONFIG_HALDCLUT_FILTER)               += vf_lut3d.o framesync.o
 OBJS-$(CONFIG_HFLIP_FILTER)                  += vf_hflip.o
@@ -258,6 +285,7 @@
 OBJS-$(CONFIG_INTERLACE_FILTER)              += vf_tinterlace.o
 OBJS-$(CONFIG_INTERLEAVE_FILTER)             += f_interleave.o
 OBJS-$(CONFIG_KERNDEINT_FILTER)              += vf_kerndeint.o
+OBJS-$(CONFIG_LAGFUN_FILTER)                 += vf_lagfun.o
 OBJS-$(CONFIG_LENSCORRECTION_FILTER)         += vf_lenscorrection.o
 OBJS-$(CONFIG_LENSFUN_FILTER)                += vf_lensfun.o
 OBJS-$(CONFIG_LIBVMAF_FILTER)                += vf_libvmaf.o framesync.o
@@ -267,21 +295,27 @@
 OBJS-$(CONFIG_LUT1D_FILTER)                  += vf_lut3d.o
 OBJS-$(CONFIG_LUT_FILTER)                    += vf_lut.o
 OBJS-$(CONFIG_LUT2_FILTER)                   += vf_lut2.o framesync.o
-OBJS-$(CONFIG_LUT3D_FILTER)                  += vf_lut3d.o
+OBJS-$(CONFIG_LUT3D_FILTER)                  += vf_lut3d.o framesync.o
 OBJS-$(CONFIG_LUTRGB_FILTER)                 += vf_lut.o
 OBJS-$(CONFIG_LUTYUV_FILTER)                 += vf_lut.o
 OBJS-$(CONFIG_MASKEDCLAMP_FILTER)            += vf_maskedclamp.o framesync.o
+OBJS-$(CONFIG_MASKEDMAX_FILTER)              += vf_maskedminmax.o framesync.o
 OBJS-$(CONFIG_MASKEDMERGE_FILTER)            += vf_maskedmerge.o framesync.o
+OBJS-$(CONFIG_MASKEDMIN_FILTER)              += vf_maskedminmax.o framesync.o
+OBJS-$(CONFIG_MASKEDTHRESHOLD_FILTER)        += vf_maskedthreshold.o framesync.o
+OBJS-$(CONFIG_MASKFUN_FILTER)                += vf_maskfun.o
 OBJS-$(CONFIG_MCDEINT_FILTER)                += vf_mcdeint.o
+OBJS-$(CONFIG_MEDIAN_FILTER)                 += vf_median.o
 OBJS-$(CONFIG_MERGEPLANES_FILTER)            += vf_mergeplanes.o framesync.o
 OBJS-$(CONFIG_MESTIMATE_FILTER)              += vf_mestimate.o motion_estimation.o
 OBJS-$(CONFIG_METADATA_FILTER)               += f_metadata.o
 OBJS-$(CONFIG_MIDEQUALIZER_FILTER)           += vf_midequalizer.o framesync.o
 OBJS-$(CONFIG_MINTERPOLATE_FILTER)           += vf_minterpolate.o motion_estimation.o
-OBJS-$(CONFIG_MIX_FILTER)                    += vf_mix.o
+OBJS-$(CONFIG_MIX_FILTER)                    += vf_mix.o framesync.o
 OBJS-$(CONFIG_MPDECIMATE_FILTER)             += vf_mpdecimate.o
 OBJS-$(CONFIG_NEGATE_FILTER)                 += vf_lut.o
 OBJS-$(CONFIG_NLMEANS_FILTER)                += vf_nlmeans.o
+OBJS-$(CONFIG_NLMEANS_OPENCL_FILTER)         += vf_nlmeans_opencl.o opencl.o opencl/nlmeans.o
 OBJS-$(CONFIG_NNEDI_FILTER)                  += vf_nnedi.o
 OBJS-$(CONFIG_NOFORMAT_FILTER)               += vf_format.o
 OBJS-$(CONFIG_NOISE_FILTER)                  += vf_noise.o
@@ -291,16 +325,20 @@
 OBJS-$(CONFIG_OCV_FILTER)                    += vf_libopencv.o
 OBJS-$(CONFIG_OSCILLOSCOPE_FILTER)           += vf_datascope.o
 OBJS-$(CONFIG_OVERLAY_FILTER)                += vf_overlay.o framesync.o
+OBJS-$(CONFIG_OVERLAY_CUDA_FILTER)           += vf_overlay_cuda.o framesync.o vf_overlay_cuda.ptx.o
 OBJS-$(CONFIG_OVERLAY_OPENCL_FILTER)         += vf_overlay_opencl.o opencl.o \
                                                 opencl/overlay.o framesync.o
 OBJS-$(CONFIG_OVERLAY_QSV_FILTER)            += vf_overlay_qsv.o framesync.o
+OBJS-$(CONFIG_OVERLAY_VULKAN_FILTER)         += vf_overlay_vulkan.o vulkan.o
 OBJS-$(CONFIG_OWDENOISE_FILTER)              += vf_owdenoise.o
 OBJS-$(CONFIG_PAD_FILTER)                    += vf_pad.o
+OBJS-$(CONFIG_PAD_OPENCL_FILTER)             += vf_pad_opencl.o opencl.o opencl/pad.o
 OBJS-$(CONFIG_PALETTEGEN_FILTER)             += vf_palettegen.o
 OBJS-$(CONFIG_PALETTEUSE_FILTER)             += vf_paletteuse.o framesync.o
 OBJS-$(CONFIG_PERMS_FILTER)                  += f_perms.o
 OBJS-$(CONFIG_PERSPECTIVE_FILTER)            += vf_perspective.o
 OBJS-$(CONFIG_PHASE_FILTER)                  += vf_phase.o
+OBJS-$(CONFIG_PHOTOSENSITIVITY_FILTER)       += vf_photosensitivity.o
 OBJS-$(CONFIG_PIXDESCTEST_FILTER)            += vf_pixdesctest.o
 OBJS-$(CONFIG_PIXSCOPE_FILTER)               += vf_datascope.o
 OBJS-$(CONFIG_PP_FILTER)                     += vf_pp.o
@@ -324,23 +362,27 @@
 OBJS-$(CONFIG_REMOVELOGO_FILTER)             += bbox.o lswsutils.o lavfutils.o vf_removelogo.o
 OBJS-$(CONFIG_REPEATFIELDS_FILTER)           += vf_repeatfields.o
 OBJS-$(CONFIG_REVERSE_FILTER)                += f_reverse.o
+OBJS-$(CONFIG_RGBASHIFT_FILTER)              += vf_chromashift.o
 OBJS-$(CONFIG_ROBERTS_FILTER)                += vf_convolution.o
 OBJS-$(CONFIG_ROBERTS_OPENCL_FILTER)         += vf_convolution_opencl.o opencl.o \
                                                 opencl/convolution.o
 OBJS-$(CONFIG_ROTATE_FILTER)                 += vf_rotate.o
 OBJS-$(CONFIG_SAB_FILTER)                    += vf_sab.o
-OBJS-$(CONFIG_SCALE_FILTER)                  += vf_scale.o scale.o
-OBJS-$(CONFIG_SCALE_CUDA_FILTER)             += vf_scale_cuda.o vf_scale_cuda.ptx.o
-OBJS-$(CONFIG_SCALE_NPP_FILTER)              += vf_scale_npp.o scale.o
+OBJS-$(CONFIG_SCALE_FILTER)                  += vf_scale.o scale_eval.o
+OBJS-$(CONFIG_SCALE_CUDA_FILTER)             += vf_scale_cuda.o vf_scale_cuda.ptx.o scale_eval.o
+OBJS-$(CONFIG_SCALE_NPP_FILTER)              += vf_scale_npp.o scale_eval.o
 OBJS-$(CONFIG_SCALE_QSV_FILTER)              += vf_scale_qsv.o
-OBJS-$(CONFIG_SCALE_VAAPI_FILTER)            += vf_scale_vaapi.o scale.o vaapi_vpp.o
-OBJS-$(CONFIG_SCALE2REF_FILTER)              += vf_scale.o scale.o
+OBJS-$(CONFIG_SCALE_VAAPI_FILTER)            += vf_scale_vaapi.o scale_eval.o vaapi_vpp.o
+OBJS-$(CONFIG_SCALE_VULKAN_FILTER)           += vf_scale_vulkan.o vulkan.o
+OBJS-$(CONFIG_SCALE2REF_FILTER)              += vf_scale.o scale_eval.o
+OBJS-$(CONFIG_SCROLL_FILTER)                 += vf_scroll.o
 OBJS-$(CONFIG_SELECT_FILTER)                 += f_select.o
 OBJS-$(CONFIG_SELECTIVECOLOR_FILTER)         += vf_selectivecolor.o
 OBJS-$(CONFIG_SENDCMD_FILTER)                += f_sendcmd.o
 OBJS-$(CONFIG_SEPARATEFIELDS_FILTER)         += vf_separatefields.o
 OBJS-$(CONFIG_SETDAR_FILTER)                 += vf_aspect.o
-OBJS-$(CONFIG_SETFIELD_FILTER)               += vf_setfield.o
+OBJS-$(CONFIG_SETFIELD_FILTER)               += vf_setparams.o
+OBJS-$(CONFIG_SETPARAMS_FILTER)              += vf_setparams.o
 OBJS-$(CONFIG_SETPTS_FILTER)                 += setpts.o
 OBJS-$(CONFIG_SETRANGE_FILTER)               += vf_setparams.o
 OBJS-$(CONFIG_SETSAR_FILTER)                 += vf_aspect.o
@@ -369,28 +411,36 @@
 OBJS-$(CONFIG_SWAPUV_FILTER)                 += vf_swapuv.o
 OBJS-$(CONFIG_TBLEND_FILTER)                 += vf_blend.o framesync.o
 OBJS-$(CONFIG_TELECINE_FILTER)               += vf_telecine.o
+OBJS-$(CONFIG_THISTOGRAM_FILTER)             += vf_histogram.o
 OBJS-$(CONFIG_THRESHOLD_FILTER)              += vf_threshold.o framesync.o
 OBJS-$(CONFIG_THUMBNAIL_FILTER)              += vf_thumbnail.o
 OBJS-$(CONFIG_THUMBNAIL_CUDA_FILTER)         += vf_thumbnail_cuda.o vf_thumbnail_cuda.ptx.o
 OBJS-$(CONFIG_TILE_FILTER)                   += vf_tile.o
 OBJS-$(CONFIG_TINTERLACE_FILTER)             += vf_tinterlace.o
 OBJS-$(CONFIG_TLUT2_FILTER)                  += vf_lut2.o framesync.o
+OBJS-$(CONFIG_TMEDIAN_FILTER)                += vf_xmedian.o framesync.o
 OBJS-$(CONFIG_TMIX_FILTER)                   += vf_mix.o framesync.o
 OBJS-$(CONFIG_TONEMAP_FILTER)                += vf_tonemap.o colorspace.o
 OBJS-$(CONFIG_TONEMAP_OPENCL_FILTER)         += vf_tonemap_opencl.o colorspace.o opencl.o \
                                                 opencl/tonemap.o opencl/colorspace_common.o
+OBJS-$(CONFIG_TONEMAP_VAAPI_FILTER)          += vf_tonemap_vaapi.o vaapi_vpp.o
+OBJS-$(CONFIG_TPAD_FILTER)                   += vf_tpad.o
 OBJS-$(CONFIG_TRANSPOSE_FILTER)              += vf_transpose.o
 OBJS-$(CONFIG_TRANSPOSE_NPP_FILTER)          += vf_transpose_npp.o
+OBJS-$(CONFIG_TRANSPOSE_OPENCL_FILTER)       += vf_transpose_opencl.o opencl.o opencl/transpose.o
+OBJS-$(CONFIG_TRANSPOSE_VAAPI_FILTER)        += vf_transpose_vaapi.o vaapi_vpp.o
 OBJS-$(CONFIG_TRIM_FILTER)                   += trim.o
 OBJS-$(CONFIG_UNPREMULTIPLY_FILTER)          += vf_premultiply.o framesync.o
 OBJS-$(CONFIG_UNSHARP_FILTER)                += vf_unsharp.o
 OBJS-$(CONFIG_UNSHARP_OPENCL_FILTER)         += vf_unsharp_opencl.o opencl.o \
                                                 opencl/unsharp.o
 OBJS-$(CONFIG_USPP_FILTER)                   += vf_uspp.o
+OBJS-$(CONFIG_V360_FILTER)                   += vf_v360.o
 OBJS-$(CONFIG_VAGUEDENOISER_FILTER)          += vf_vaguedenoiser.o
 OBJS-$(CONFIG_VECTORSCOPE_FILTER)            += vf_vectorscope.o
 OBJS-$(CONFIG_VFLIP_FILTER)                  += vf_vflip.o
 OBJS-$(CONFIG_VFRDET_FILTER)                 += vf_vfrdet.o
+OBJS-$(CONFIG_VIBRANCE_FILTER)               += vf_vibrance.o
 OBJS-$(CONFIG_VIDSTABDETECT_FILTER)          += vidstabutils.o vf_vidstabdetect.o
 OBJS-$(CONFIG_VIDSTABTRANSFORM_FILTER)       += vidstabutils.o vf_vidstabtransform.o
 OBJS-$(CONFIG_VIGNETTE_FILTER)               += vf_vignette.o
@@ -401,7 +451,14 @@
 OBJS-$(CONFIG_WAVEFORM_FILTER)               += vf_waveform.o
 OBJS-$(CONFIG_WEAVE_FILTER)                  += vf_weave.o
 OBJS-$(CONFIG_XBR_FILTER)                    += vf_xbr.o
-OBJS-$(CONFIG_YADIF_FILTER)                  += vf_yadif.o
+OBJS-$(CONFIG_XFADE_FILTER)                  += vf_xfade.o
+OBJS-$(CONFIG_XFADE_OPENCL_FILTER)           += vf_xfade_opencl.o opencl.o opencl/xfade.o
+OBJS-$(CONFIG_XMEDIAN_FILTER)                += vf_xmedian.o framesync.o
+OBJS-$(CONFIG_XSTACK_FILTER)                 += vf_stack.o framesync.o
+OBJS-$(CONFIG_YADIF_FILTER)                  += vf_yadif.o yadif_common.o
+OBJS-$(CONFIG_YADIF_CUDA_FILTER)             += vf_yadif_cuda.o vf_yadif_cuda.ptx.o \
+                                                yadif_common.o
+OBJS-$(CONFIG_YAEPBLUR_FILTER)               += vf_yaepblur.o
 OBJS-$(CONFIG_ZMQ_FILTER)                    += f_zmq.o
 OBJS-$(CONFIG_ZOOMPAN_FILTER)                += vf_zoompan.o
 OBJS-$(CONFIG_ZSCALE_FILTER)                 += vf_zscale.o
@@ -421,6 +478,7 @@
 OBJS-$(CONFIG_PAL75BARS_FILTER)              += vsrc_testsrc.o
 OBJS-$(CONFIG_PAL100BARS_FILTER)             += vsrc_testsrc.o
 OBJS-$(CONFIG_RGBTESTSRC_FILTER)             += vsrc_testsrc.o
+OBJS-$(CONFIG_SIERPINSKI_FILTER)             += vsrc_sierpinski.o
 OBJS-$(CONFIG_SMPTEBARS_FILTER)              += vsrc_testsrc.o
 OBJS-$(CONFIG_SMPTEHDBARS_FILTER)            += vsrc_testsrc.o
 OBJS-$(CONFIG_TESTSRC_FILTER)                += vsrc_testsrc.o
@@ -432,12 +490,14 @@
 # multimedia filters
 OBJS-$(CONFIG_ABITSCOPE_FILTER)              += avf_abitscope.o
 OBJS-$(CONFIG_ADRAWGRAPH_FILTER)             += f_drawgraph.o
+OBJS-$(CONFIG_AGRAPHMONITOR_FILTER)          += f_graphmonitor.o
 OBJS-$(CONFIG_AHISTOGRAM_FILTER)             += avf_ahistogram.o
 OBJS-$(CONFIG_APHASEMETER_FILTER)            += avf_aphasemeter.o
 OBJS-$(CONFIG_AVECTORSCOPE_FILTER)           += avf_avectorscope.o
 OBJS-$(CONFIG_CONCAT_FILTER)                 += avf_concat.o
 OBJS-$(CONFIG_SHOWCQT_FILTER)                += avf_showcqt.o lswsutils.o lavfutils.o
 OBJS-$(CONFIG_SHOWFREQS_FILTER)              += avf_showfreqs.o
+OBJS-$(CONFIG_SHOWSPATIAL_FILTER)            += avf_showspatial.o
 OBJS-$(CONFIG_SHOWSPECTRUM_FILTER)           += avf_showspectrum.o
 OBJS-$(CONFIG_SHOWSPECTRUMPIC_FILTER)        += avf_showspectrum.o
 OBJS-$(CONFIG_SHOWVOLUME_FILTER)             += avf_showvolume.o
@@ -459,6 +519,9 @@
 SKIPHEADERS-$(CONFIG_QSVVPP)                 += qsvvpp.h
 SKIPHEADERS-$(CONFIG_OPENCL)                 += opencl.h
 SKIPHEADERS-$(CONFIG_VAAPI)                  += vaapi_vpp.h
+SKIPHEADERS-$(CONFIG_VULKAN)                 += vulkan.h
+
+OBJS-$(CONFIG_LIBGLSLANG)                    += glslang.o
 
 TOOLS     = graph2dot
 TESTPROGS = drawutils filtfmts formats integral
@@ -466,7 +529,7 @@
 TOOLS-$(CONFIG_LIBZMQ) += zmqsend
 
 clean::
-	$(RM) $(CLEANSUFFIXES:%=libavfilter/libmpcodecs/%)
+	$(RM) $(CLEANSUFFIXES:%=libavfilter/dnn/%)
 
 OPENCL = $(subst $(SRC_PATH)/,,$(wildcard $(SRC_PATH)/libavfilter/opencl/*.cl))
 .SECONDARY: $(OPENCL:.cl=.c)
diff --git a/libavfilter/aeval.c b/libavfilter/aeval.c
index cdddbaf..32cd6de 100644
--- a/libavfilter/aeval.c
+++ b/libavfilter/aeval.c
@@ -89,8 +89,8 @@
     { "exprs",       "set the '|'-separated list of channels expressions", OFFSET(exprs), AV_OPT_TYPE_STRING, {.str = NULL}, .flags = FLAGS },
     { "nb_samples",  "set the number of samples per requested frame", OFFSET(nb_samples),      AV_OPT_TYPE_INT,    {.i64 = 1024},    0,        INT_MAX, FLAGS },
     { "n",           "set the number of samples per requested frame", OFFSET(nb_samples),      AV_OPT_TYPE_INT,    {.i64 = 1024},    0,        INT_MAX, FLAGS },
-    { "sample_rate", "set the sample rate",                           OFFSET(sample_rate_str), AV_OPT_TYPE_STRING, {.str = "44100"}, CHAR_MIN, CHAR_MAX, FLAGS },
-    { "s",           "set the sample rate",                           OFFSET(sample_rate_str), AV_OPT_TYPE_STRING, {.str = "44100"}, CHAR_MIN, CHAR_MAX, FLAGS },
+    { "sample_rate", "set the sample rate",                           OFFSET(sample_rate_str), AV_OPT_TYPE_STRING, {.str = "44100"}, 0, 0, FLAGS },
+    { "s",           "set the sample rate",                           OFFSET(sample_rate_str), AV_OPT_TYPE_STRING, {.str = "44100"}, 0, 0, FLAGS },
     { "duration",    "set audio duration", OFFSET(duration), AV_OPT_TYPE_DURATION, {.i64 = -1}, -1, INT64_MAX, FLAGS },
     { "d",           "set audio duration", OFFSET(duration), AV_OPT_TYPE_DURATION, {.i64 = -1}, -1, INT64_MAX, FLAGS },
     { "channel_layout", "set channel layout", OFFSET(chlayout_str), AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, FLAGS },
diff --git a/libavfilter/af_acopy.c b/libavfilter/af_acopy.c
index d849060..2d91501 100644
--- a/libavfilter/af_acopy.c
+++ b/libavfilter/af_acopy.c
@@ -24,15 +24,25 @@
 {
     AVFilterLink *outlink = inlink->dst->outputs[0];
     AVFrame *out = ff_get_audio_buffer(outlink, in->nb_samples);
+    int ret;
 
     if (!out) {
-        av_frame_free(&in);
-        return AVERROR(ENOMEM);
+        ret = AVERROR(ENOMEM);
+        goto fail;
     }
-    av_frame_copy_props(out, in);
-    av_frame_copy(out, in);
+
+    ret = av_frame_copy_props(out, in);
+    if (ret < 0)
+        goto fail;
+    ret = av_frame_copy(out, in);
+    if (ret < 0)
+        goto fail;
     av_frame_free(&in);
     return ff_filter_frame(outlink, out);
+fail:
+    av_frame_free(&in);
+    av_frame_free(&out);
+    return ret;
 }
 
 static const AVFilterPad acopy_inputs[] = {
diff --git a/libavfilter/af_acrossover.c b/libavfilter/af_acrossover.c
index 9acf3f1..002f378 100644
--- a/libavfilter/af_acrossover.c
+++ b/libavfilter/af_acrossover.c
@@ -26,6 +26,7 @@
 #include "libavutil/attributes.h"
 #include "libavutil/avstring.h"
 #include "libavutil/channel_layout.h"
+#include "libavutil/eval.h"
 #include "libavutil/internal.h"
 #include "libavutil/opt.h"
 
@@ -60,6 +61,9 @@
     float *splits;
 
     CrossoverChannel *xover;
+
+    AVFrame *input_frame;
+    AVFrame *frames[MAX_BANDS];
 } AudioCrossoverContext;
 
 #define OFFSET(x) offsetof(AudioCrossoverContext, x)
@@ -95,8 +99,10 @@
 
         p = NULL;
 
-        ret = sscanf(arg, "%f", &freq);
-
+        if (av_sscanf(arg, "%f", &freq) != 1) {
+            av_log(ctx, AV_LOG_ERROR, "Invalid syntax for frequency[%d].\n", i);
+            return AVERROR(EINVAL);
+        }
         if (freq <= 0) {
             av_log(ctx, AV_LOG_ERROR, "Frequency %f must be positive number.\n", freq);
             return AVERROR(EINVAL);
@@ -131,21 +137,22 @@
     return ret;
 }
 
-static void set_lp(BiquadContext *b, float fc, float q, float sr)
+static void set_lp(BiquadContext *b, double fc, double q, double sr)
 {
-    double omega = (2.0 * M_PI * fc / sr);
+    double omega = 2.0 * M_PI * fc / sr;
     double sn = sin(omega);
     double cs = cos(omega);
-    double alpha = (sn / (2 * q));
-    double inv = (1.0 / (1.0 + alpha));
+    double alpha = sn / (2. * q);
+    double inv = 1.0 / (1.0 + alpha);
 
-    b->a2 = b->a0 = (inv * (1.0 - cs) * 0.5);
-    b->a1 = b->a0 + b->a0;
+    b->a0 = (1. - cs) * 0.5 * inv;
+    b->a1 = (1. - cs) * inv;
+    b->a2 = b->a0;
     b->b1 = -2. * cs * inv;
     b->b2 = (1. - alpha) * inv;
 }
 
-static void set_hp(BiquadContext *b, float fc, float q, float sr)
+static void set_hp(BiquadContext *b, double fc, double q, double sr)
 {
     double omega = 2 * M_PI * fc / sr;
     double sn = sin(omega);
@@ -250,12 +257,53 @@
     return out;
 }
 
+static int filter_channels(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
+{
+    AudioCrossoverContext *s = ctx->priv;
+    AVFrame *in = s->input_frame;
+    AVFrame **frames = s->frames;
+    const int start = (in->channels * jobnr) / nb_jobs;
+    const int end = (in->channels * (jobnr+1)) / nb_jobs;
+    int f, band;
+
+    for (int ch = start; ch < end; ch++) {
+        const double *src = (const double *)in->extended_data[ch];
+        CrossoverChannel *xover = &s->xover[ch];
+
+        for (int i = 0; i < in->nb_samples; i++) {
+            double sample = src[i], lo, hi;
+
+            for (band = 0; band < ctx->nb_outputs; band++) {
+                double *dst = (double *)frames[band]->extended_data[ch];
+
+                lo = sample;
+                hi = sample;
+                for (f = 0; band + 1 < ctx->nb_outputs && f < s->filter_count; f++) {
+                    BiquadContext *lp = &xover->lp[band][f];
+                    lo = biquad_process(lp, lo);
+                }
+
+                for (f = 0; band + 1 < ctx->nb_outputs && f < s->filter_count; f++) {
+                    BiquadContext *hp = &xover->hp[band][f];
+                    hi = biquad_process(hp, hi);
+                }
+
+                dst[i] = lo;
+
+                sample = hi;
+            }
+        }
+    }
+
+    return 0;
+}
+
 static int filter_frame(AVFilterLink *inlink, AVFrame *in)
 {
     AVFilterContext *ctx = inlink->dst;
     AudioCrossoverContext *s = ctx->priv;
-    AVFrame *frames[MAX_BANDS] = { NULL };
-    int i, f, ch, band, ret = 0;
+    AVFrame **frames = s->frames;
+    int i, ret = 0;
 
     for (i = 0; i < ctx->nb_outputs; i++) {
         frames[i] = ff_get_audio_buffer(ctx->outputs[i], in->nb_samples);
@@ -271,39 +319,22 @@
     if (ret < 0)
         goto fail;
 
-    for (ch = 0; ch < inlink->channels; ch++) {
-        const double *src = (const double *)in->extended_data[ch];
-        CrossoverChannel *xover = &s->xover[ch];
-
-        for (band = 0; band < ctx->nb_outputs; band++) {
-            double *dst = (double *)frames[band]->extended_data[ch];
-
-            for (i = 0; i < in->nb_samples; i++) {
-                dst[i] = src[i];
-
-                for (f = 0; f < s->filter_count; f++) {
-                    if (band + 1 < ctx->nb_outputs) {
-                        BiquadContext *lp = &xover->lp[band][f];
-                        dst[i] = biquad_process(lp, dst[i]);
-                    }
-
-                    if (band - 1 >= 0) {
-                        BiquadContext *hp = &xover->hp[band - 1][f];
-                        dst[i] = biquad_process(hp, dst[i]);
-                    }
-                }
-            }
-        }
-    }
+    s->input_frame = in;
+    ctx->internal->execute(ctx, filter_channels, NULL, NULL, FFMIN(inlink->channels,
+                                                                   ff_filter_get_nb_threads(ctx)));
 
     for (i = 0; i < ctx->nb_outputs; i++) {
         ret = ff_filter_frame(ctx->outputs[i], frames[i]);
+        frames[i] = NULL;
         if (ret < 0)
             break;
     }
 
 fail:
+    for (i = 0; i < ctx->nb_outputs; i++)
+        av_frame_free(&frames[i]);
     av_frame_free(&in);
+    s->input_frame = NULL;
 
     return ret;
 }
@@ -314,6 +345,7 @@
     int i;
 
     av_freep(&s->splits);
+    av_freep(&s->xover);
 
     for (i = 0; i < ctx->nb_outputs; i++)
         av_freep(&ctx->output_pads[i].name);
@@ -339,5 +371,6 @@
     .query_formats  = query_formats,
     .inputs         = inputs,
     .outputs        = NULL,
-    .flags          = AVFILTER_FLAG_DYNAMIC_OUTPUTS,
+    .flags          = AVFILTER_FLAG_DYNAMIC_OUTPUTS |
+                      AVFILTER_FLAG_SLICE_THREADS,
 };
diff --git a/libavfilter/af_adeclick.c b/libavfilter/af_adeclick.c
index bf0b7cb..e86a1f7 100644
--- a/libavfilter/af_adeclick.c
+++ b/libavfilter/af_adeclick.c
@@ -22,7 +22,9 @@
 #include "libavutil/opt.h"
 #include "avfilter.h"
 #include "audio.h"
+#include "filters.h"
 #include "formats.h"
+#include "internal.h"
 
 typedef struct DeclickChannel {
     double *auxiliary;
@@ -61,6 +63,7 @@
     int hop_size;
     int overlap_skip;
 
+    AVFrame *enabled;
     AVFrame *in;
     AVFrame *out;
     AVFrame *buffer;
@@ -73,7 +76,9 @@
     uint64_t nb_samples;
     uint64_t detected_errors;
     int samples_left;
+    int eof;
 
+    AVAudioFifo *efifo;
     AVAudioFifo *fifo;
     double *window_func_lut;
 
@@ -156,13 +161,17 @@
     av_frame_free(&s->out);
     av_frame_free(&s->buffer);
     av_frame_free(&s->is);
+    s->enabled = ff_get_audio_buffer(inlink, s->window_size);
     s->in = ff_get_audio_buffer(inlink, s->window_size);
     s->out = ff_get_audio_buffer(inlink, s->window_size);
     s->buffer = ff_get_audio_buffer(inlink, s->window_size * 2);
     s->is = ff_get_audio_buffer(inlink, s->window_size);
-    if (!s->in || !s->out || !s->buffer || !s->is)
+    if (!s->in || !s->out || !s->buffer || !s->is || !s->enabled)
         return AVERROR(ENOMEM);
 
+    s->efifo = av_audio_fifo_alloc(inlink->format, 1, s->window_size);
+    if (!s->efifo)
+        return AVERROR(ENOMEM);
     s->fifo = av_audio_fifo_alloc(inlink->format, inlink->channels, s->window_size);
     if (!s->fifo)
         return AVERROR(ENOMEM);
@@ -510,14 +519,20 @@
         nb_errors = s->detector(s, c, sigmae, c->detection, c->acoefficients,
                                 c->click, index, src, dst);
         if (nb_errors > 0) {
+            double *enabled = (double *)s->enabled->extended_data[0];
+
             ret = interpolation(c, src, s->ar_order, c->acoefficients, index,
                                 nb_errors, c->auxiliary, interpolated);
             if (ret < 0)
                 return ret;
 
+            av_audio_fifo_peek(s->efifo, (void**)s->enabled->extended_data, s->window_size);
+
             for (j = 0; j < nb_errors; j++) {
-                dst[index[j]] = interpolated[j];
-                is[index[j]] = 1;
+                if (enabled[index[j]]) {
+                    dst[index[j]] = interpolated[j];
+                    is[index[j]] = 1;
+                }
             }
         }
     } else {
@@ -544,68 +559,58 @@
     return 0;
 }
 
-static int filter_frame(AVFilterLink *inlink, AVFrame *in)
+static int filter_frame(AVFilterLink *inlink)
 {
     AVFilterContext *ctx = inlink->dst;
     AVFilterLink *outlink = ctx->outputs[0];
     AudioDeclickContext *s = ctx->priv;
     AVFrame *out = NULL;
-    int ret = 0;
+    int ret = 0, j, ch, detected_errors = 0;
+    ThreadData td;
 
-    if (s->pts == AV_NOPTS_VALUE)
-        s->pts = in->pts;
+    out = ff_get_audio_buffer(outlink, s->hop_size);
+    if (!out)
+        return AVERROR(ENOMEM);
 
-    ret = av_audio_fifo_write(s->fifo, (void **)in->extended_data,
-                              in->nb_samples);
-    av_frame_free(&in);
+    ret = av_audio_fifo_peek(s->fifo, (void **)s->in->extended_data,
+                             s->window_size);
+    if (ret < 0)
+        goto fail;
 
-    while (av_audio_fifo_size(s->fifo) >= s->window_size) {
-        int j, ch, detected_errors = 0;
-        ThreadData td;
+    td.out = out;
+    ret = ctx->internal->execute(ctx, filter_channel, &td, NULL, inlink->channels);
+    if (ret < 0)
+        goto fail;
 
-        out = ff_get_audio_buffer(outlink, s->hop_size);
-        if (!out)
-            return AVERROR(ENOMEM);
+    for (ch = 0; ch < s->in->channels; ch++) {
+        double *is = (double *)s->is->extended_data[ch];
 
-        ret = av_audio_fifo_peek(s->fifo, (void **)s->in->extended_data,
-                                 s->window_size);
-        if (ret < 0)
-            break;
-
-        td.out = out;
-        ret = ctx->internal->execute(ctx, filter_channel, &td, NULL, inlink->channels);
-        if (ret < 0)
-            goto fail;
-
-        for (ch = 0; ch < s->in->channels; ch++) {
-            double *is = (double *)s->is->extended_data[ch];
-
-            for (j = 0; j < s->hop_size; j++) {
-                if (is[j])
-                    detected_errors++;
-            }
+        for (j = 0; j < s->hop_size; j++) {
+            if (is[j])
+                detected_errors++;
         }
+    }
 
-        av_audio_fifo_drain(s->fifo, s->hop_size);
+    av_audio_fifo_drain(s->fifo, s->hop_size);
+    av_audio_fifo_drain(s->efifo, s->hop_size);
 
-        if (s->samples_left > 0)
-            out->nb_samples = FFMIN(s->hop_size, s->samples_left);
+    if (s->samples_left > 0)
+        out->nb_samples = FFMIN(s->hop_size, s->samples_left);
 
-        out->pts = s->pts;
-        s->pts += s->hop_size;
+    out->pts = s->pts;
+    s->pts += av_rescale_q(s->hop_size, (AVRational){1, outlink->sample_rate}, outlink->time_base);
 
-        s->detected_errors += detected_errors;
-        s->nb_samples += out->nb_samples * inlink->channels;
+    s->detected_errors += detected_errors;
+    s->nb_samples += out->nb_samples * inlink->channels;
 
-        ret = ff_filter_frame(outlink, out);
-        if (ret < 0)
-            break;
+    ret = ff_filter_frame(outlink, out);
+    if (ret < 0)
+        return ret;
 
-        if (s->samples_left > 0) {
-            s->samples_left -= s->hop_size;
-            if (s->samples_left <= 0)
-                av_audio_fifo_drain(s->fifo, av_audio_fifo_size(s->fifo));
-        }
+    if (s->samples_left > 0) {
+        s->samples_left -= s->hop_size;
+        if (s->samples_left <= 0)
+            av_audio_fifo_drain(s->fifo, av_audio_fifo_size(s->fifo));
     }
 
 fail:
@@ -614,27 +619,64 @@
     return ret;
 }
 
-static int request_frame(AVFilterLink *outlink)
+static int activate(AVFilterContext *ctx)
 {
-    AVFilterContext *ctx = outlink->src;
+    AVFilterLink *inlink = ctx->inputs[0];
+    AVFilterLink *outlink = ctx->outputs[0];
     AudioDeclickContext *s = ctx->priv;
-    int ret = 0;
+    AVFrame *in;
+    int ret, status;
+    int64_t pts;
 
-    ret = ff_request_frame(ctx->inputs[0]);
+    FF_FILTER_FORWARD_STATUS_BACK(outlink, inlink);
 
-    if (ret == AVERROR_EOF && av_audio_fifo_size(s->fifo) > 0) {
-        if (!s->samples_left)
+    ret = ff_inlink_consume_samples(inlink, s->window_size, s->window_size, &in);
+    if (ret < 0)
+        return ret;
+    if (ret > 0) {
+        double *e = (double *)s->enabled->extended_data[0];
+
+        if (s->pts == AV_NOPTS_VALUE)
+            s->pts = in->pts;
+
+        ret = av_audio_fifo_write(s->fifo, (void **)in->extended_data,
+                                  in->nb_samples);
+        for (int i = 0; i < in->nb_samples; i++)
+            e[i] = !ctx->is_disabled;
+
+        av_audio_fifo_write(s->efifo, (void**)s->enabled->extended_data, in->nb_samples);
+        av_frame_free(&in);
+        if (ret < 0)
+            return ret;
+    }
+
+    if (av_audio_fifo_size(s->fifo) >= s->window_size ||
+        s->samples_left > 0)
+        return filter_frame(inlink);
+
+    if (av_audio_fifo_size(s->fifo) >= s->window_size) {
+        ff_filter_set_ready(ctx, 100);
+        return 0;
+    }
+
+    if (!s->eof && ff_inlink_acknowledge_status(inlink, &status, &pts)) {
+        if (status == AVERROR_EOF) {
+            s->eof = 1;
             s->samples_left = av_audio_fifo_size(s->fifo) - s->overlap_skip;
-
-        if (s->samples_left > 0) {
-            AVFrame *in = ff_get_audio_buffer(outlink, s->window_size - s->samples_left);
-            if (!in)
-                return AVERROR(ENOMEM);
-            ret = filter_frame(ctx->inputs[0], in);
+            ff_filter_set_ready(ctx, 100);
+            return 0;
         }
     }
 
-    return ret;
+    if (s->eof && s->samples_left <= 0) {
+        ff_outlink_set_status(outlink, AVERROR_EOF, s->pts);
+        return 0;
+    }
+
+    if (!s->eof)
+        FF_FILTER_FORWARD_WANTED(outlink, inlink);
+
+    return FFERROR_NOT_READY;
 }
 
 static av_cold int init(AVFilterContext *ctx)
@@ -661,7 +703,9 @@
            s->nb_samples, 100. * s->detected_errors / s->nb_samples);
 
     av_audio_fifo_free(s->fifo);
+    av_audio_fifo_free(s->efifo);
     av_freep(&s->window_func_lut);
+    av_frame_free(&s->enabled);
     av_frame_free(&s->in);
     av_frame_free(&s->out);
     av_frame_free(&s->buffer);
@@ -697,7 +741,6 @@
     {
         .name         = "default",
         .type         = AVMEDIA_TYPE_AUDIO,
-        .filter_frame = filter_frame,
         .config_props = config_input,
     },
     { NULL }
@@ -707,7 +750,6 @@
     {
         .name          = "default",
         .type          = AVMEDIA_TYPE_AUDIO,
-        .request_frame = request_frame,
     },
     { NULL }
 };
@@ -719,10 +761,11 @@
     .priv_size     = sizeof(AudioDeclickContext),
     .priv_class    = &adeclick_class,
     .init          = init,
+    .activate      = activate,
     .uninit        = uninit,
     .inputs        = inputs,
     .outputs       = outputs,
-    .flags         = AVFILTER_FLAG_SLICE_THREADS,
+    .flags         = AVFILTER_FLAG_SLICE_THREADS | AVFILTER_FLAG_SUPPORT_TIMELINE_INTERNAL,
 };
 
 static const AVOption adeclip_options[] = {
@@ -746,8 +789,9 @@
     .priv_size     = sizeof(AudioDeclickContext),
     .priv_class    = &adeclip_class,
     .init          = init,
+    .activate      = activate,
     .uninit        = uninit,
     .inputs        = inputs,
     .outputs       = outputs,
-    .flags         = AVFILTER_FLAG_SLICE_THREADS,
+    .flags         = AVFILTER_FLAG_SLICE_THREADS | AVFILTER_FLAG_SUPPORT_TIMELINE_INTERNAL,
 };
diff --git a/libavfilter/af_adelay.c b/libavfilter/af_adelay.c
index d6d81ba..c964777 100644
--- a/libavfilter/af_adelay.c
+++ b/libavfilter/af_adelay.c
@@ -19,10 +19,12 @@
  */
 
 #include "libavutil/avstring.h"
+#include "libavutil/eval.h"
 #include "libavutil/opt.h"
 #include "libavutil/samplefmt.h"
 #include "avfilter.h"
 #include "audio.h"
+#include "filters.h"
 #include "internal.h"
 
 typedef struct ChanDelay {
@@ -34,12 +36,15 @@
 
 typedef struct AudioDelayContext {
     const AVClass *class;
+    int all;
     char *delays;
     ChanDelay *chandelay;
     int nb_delays;
     int block_align;
-    unsigned max_delay;
+    int64_t padding;
+    int64_t max_delay;
     int64_t next_pts;
+    int eof;
 
     void (*delay_channel)(ChanDelay *d, int nb_samples,
                           const uint8_t *src, uint8_t *dst);
@@ -50,6 +55,7 @@
 
 static const AVOption adelay_options[] = {
     { "delays", "set list of delays for each channel", OFFSET(delays), AV_OPT_TYPE_STRING, {.str=NULL}, 0, 0, A },
+    { "all",    "use last available delay for remained channels", OFFSET(all), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, A },
     { NULL }
 };
 
@@ -137,7 +143,7 @@
     p = s->delays;
     for (i = 0; i < s->nb_delays; i++) {
         ChanDelay *d = &s->chandelay[i];
-        float delay;
+        float delay, div;
         char type = 0;
         int ret;
 
@@ -146,10 +152,11 @@
 
         p = NULL;
 
-        ret = sscanf(arg, "%d%c", &d->delay, &type);
+        ret = av_sscanf(arg, "%d%c", &d->delay, &type);
         if (ret != 2 || type != 'S') {
-            sscanf(arg, "%f", &delay);
-            d->delay = delay * inlink->sample_rate / 1000.0;
+            div = type == 's' ? 1.0 : 1000.0;
+            av_sscanf(arg, "%f", &delay);
+            d->delay = delay * inlink->sample_rate / div;
         }
 
         if (d->delay < 0) {
@@ -158,6 +165,26 @@
         }
     }
 
+    if (s->all && i) {
+        for (int j = i; j < s->nb_delays; j++)
+            s->chandelay[j].delay = s->chandelay[i-1].delay;
+    }
+
+    s->padding = s->chandelay[0].delay;
+    for (i = 1; i < s->nb_delays; i++) {
+        ChanDelay *d = &s->chandelay[i];
+
+        s->padding = FFMIN(s->padding, d->delay);
+    }
+
+    if (s->padding) {
+        for (i = 0; i < s->nb_delays; i++) {
+            ChanDelay *d = &s->chandelay[i];
+
+            d->delay -= s->padding;
+        }
+    }
+
     for (i = 0; i < s->nb_delays; i++) {
         ChanDelay *d = &s->chandelay[i];
 
@@ -210,21 +237,57 @@
             s->delay_channel(d, frame->nb_samples, src, dst);
     }
 
-    s->next_pts = frame->pts + av_rescale_q(frame->nb_samples, (AVRational){1, inlink->sample_rate}, inlink->time_base);
+    out_frame->pts = s->next_pts;
+    s->next_pts += av_rescale_q(frame->nb_samples, (AVRational){1, inlink->sample_rate}, inlink->time_base);
     av_frame_free(&frame);
     return ff_filter_frame(ctx->outputs[0], out_frame);
 }
 
-static int request_frame(AVFilterLink *outlink)
+static int activate(AVFilterContext *ctx)
 {
-    AVFilterContext *ctx = outlink->src;
+    AVFilterLink *inlink = ctx->inputs[0];
+    AVFilterLink *outlink = ctx->outputs[0];
     AudioDelayContext *s = ctx->priv;
-    int ret;
+    AVFrame *frame = NULL;
+    int ret, status;
+    int64_t pts;
 
-    ret = ff_request_frame(ctx->inputs[0]);
-    if (ret == AVERROR_EOF && !ctx->is_disabled && s->max_delay) {
+    FF_FILTER_FORWARD_STATUS_BACK(outlink, inlink);
+
+    if (s->padding) {
+        int nb_samples = FFMIN(s->padding, 2048);
+
+        frame = ff_get_audio_buffer(outlink, nb_samples);
+        if (!frame)
+            return AVERROR(ENOMEM);
+        s->padding -= nb_samples;
+
+        av_samples_set_silence(frame->extended_data, 0,
+                               frame->nb_samples,
+                               outlink->channels,
+                               frame->format);
+
+        frame->pts = s->next_pts;
+        if (s->next_pts != AV_NOPTS_VALUE)
+            s->next_pts += av_rescale_q(nb_samples, (AVRational){1, outlink->sample_rate}, outlink->time_base);
+
+        return ff_filter_frame(outlink, frame);
+    }
+
+    ret = ff_inlink_consume_frame(inlink, &frame);
+    if (ret < 0)
+        return ret;
+
+    if (ret > 0)
+        return filter_frame(inlink, frame);
+
+    if (ff_inlink_acknowledge_status(inlink, &status, &pts)) {
+        if (status == AVERROR_EOF)
+            s->eof = 1;
+    }
+
+    if (s->eof && s->max_delay) {
         int nb_samples = FFMIN(s->max_delay, 2048);
-        AVFrame *frame;
 
         frame = ff_get_audio_buffer(outlink, nb_samples);
         if (!frame)
@@ -237,22 +300,28 @@
                                frame->format);
 
         frame->pts = s->next_pts;
-        if (s->next_pts != AV_NOPTS_VALUE)
-            s->next_pts += av_rescale_q(nb_samples, (AVRational){1, outlink->sample_rate}, outlink->time_base);
-
-        ret = filter_frame(ctx->inputs[0], frame);
+        return filter_frame(inlink, frame);
     }
 
-    return ret;
+    if (s->eof && s->max_delay == 0) {
+        ff_outlink_set_status(outlink, AVERROR_EOF, s->next_pts);
+        return 0;
+    }
+
+    if (!s->eof)
+        FF_FILTER_FORWARD_WANTED(outlink, inlink);
+
+    return FFERROR_NOT_READY;
 }
 
 static av_cold void uninit(AVFilterContext *ctx)
 {
     AudioDelayContext *s = ctx->priv;
-    int i;
 
-    for (i = 0; i < s->nb_delays; i++)
-        av_freep(&s->chandelay[i].samples);
+    if (s->chandelay) {
+        for (int i = 0; i < s->nb_delays; i++)
+            av_freep(&s->chandelay[i].samples);
+    }
     av_freep(&s->chandelay);
 }
 
@@ -261,16 +330,14 @@
         .name         = "default",
         .type         = AVMEDIA_TYPE_AUDIO,
         .config_props = config_input,
-        .filter_frame = filter_frame,
     },
     { NULL }
 };
 
 static const AVFilterPad adelay_outputs[] = {
     {
-        .name          = "default",
-        .request_frame = request_frame,
-        .type          = AVMEDIA_TYPE_AUDIO,
+        .name = "default",
+        .type = AVMEDIA_TYPE_AUDIO,
     },
     { NULL }
 };
@@ -281,6 +348,7 @@
     .query_formats = query_formats,
     .priv_size     = sizeof(AudioDelayContext),
     .priv_class    = &adelay_class,
+    .activate      = activate,
     .uninit        = uninit,
     .inputs        = adelay_inputs,
     .outputs       = adelay_outputs,
diff --git a/libavfilter/af_aecho.c b/libavfilter/af_aecho.c
index b9ac18d..7a7b8bc 100644
--- a/libavfilter/af_aecho.c
+++ b/libavfilter/af_aecho.c
@@ -24,6 +24,7 @@
 #include "libavutil/samplefmt.h"
 #include "avfilter.h"
 #include "audio.h"
+#include "filters.h"
 #include "internal.h"
 
 typedef struct AudioEchoContext {
@@ -36,6 +37,7 @@
     uint8_t **delayptrs;
     int max_samples, fade_out;
     int *samples;
+    int eof;
     int64_t next_pts;
 
     void (*echo_samples)(struct AudioEchoContext *ctx, uint8_t **delayptrs,
@@ -78,7 +80,7 @@
         char *tstr = av_strtok(p, "|", &saveptr);
         p = NULL;
         if (tstr)
-            new_nb_items += sscanf(tstr, "%f", &items[new_nb_items]) == 1;
+            new_nb_items += av_sscanf(tstr, "%f", &items[new_nb_items]) == 1;
     }
 
     *nb_items = new_nb_items;
@@ -302,42 +304,65 @@
 {
     AVFilterContext *ctx = outlink->src;
     AudioEchoContext *s = ctx->priv;
-    int ret;
+    int nb_samples = FFMIN(s->fade_out, 2048);
+    AVFrame *frame = ff_get_audio_buffer(outlink, nb_samples);
 
-    ret = ff_request_frame(ctx->inputs[0]);
+    if (!frame)
+        return AVERROR(ENOMEM);
+    s->fade_out -= nb_samples;
 
-    if (ret == AVERROR_EOF && !ctx->is_disabled && s->fade_out) {
-        int nb_samples = FFMIN(s->fade_out, 2048);
-        AVFrame *frame;
+    av_samples_set_silence(frame->extended_data, 0,
+                           frame->nb_samples,
+                           outlink->channels,
+                           frame->format);
 
-        frame = ff_get_audio_buffer(outlink, nb_samples);
-        if (!frame)
-            return AVERROR(ENOMEM);
-        s->fade_out -= nb_samples;
+    s->echo_samples(s, s->delayptrs, frame->extended_data, frame->extended_data,
+                    frame->nb_samples, outlink->channels);
 
-        av_samples_set_silence(frame->extended_data, 0,
-                               frame->nb_samples,
-                               outlink->channels,
-                               frame->format);
+    frame->pts = s->next_pts;
+    if (s->next_pts != AV_NOPTS_VALUE)
+        s->next_pts += av_rescale_q(nb_samples, (AVRational){1, outlink->sample_rate}, outlink->time_base);
 
-        s->echo_samples(s, s->delayptrs, frame->extended_data, frame->extended_data,
-                        frame->nb_samples, outlink->channels);
+    return ff_filter_frame(outlink, frame);
+}
 
-        frame->pts = s->next_pts;
-        if (s->next_pts != AV_NOPTS_VALUE)
-            s->next_pts += av_rescale_q(nb_samples, (AVRational){1, outlink->sample_rate}, outlink->time_base);
+static int activate(AVFilterContext *ctx)
+{
+    AVFilterLink *inlink = ctx->inputs[0];
+    AVFilterLink *outlink = ctx->outputs[0];
+    AudioEchoContext *s = ctx->priv;
+    AVFrame *in;
+    int ret, status;
+    int64_t pts;
 
-        return ff_filter_frame(outlink, frame);
+    FF_FILTER_FORWARD_STATUS_BACK(outlink, inlink);
+
+    ret = ff_inlink_consume_frame(inlink, &in);
+    if (ret < 0)
+        return ret;
+    if (ret > 0)
+        return filter_frame(inlink, in);
+
+    if (!s->eof && ff_inlink_acknowledge_status(inlink, &status, &pts)) {
+        if (status == AVERROR_EOF)
+            s->eof = 1;
     }
 
-    return ret;
+    if (s->eof && s->fade_out <= 0) {
+        ff_outlink_set_status(outlink, AVERROR_EOF, s->next_pts);
+        return 0;
+    }
+
+    if (!s->eof)
+        FF_FILTER_FORWARD_WANTED(outlink, inlink);
+
+    return request_frame(outlink);
 }
 
 static const AVFilterPad aecho_inputs[] = {
     {
         .name         = "default",
         .type         = AVMEDIA_TYPE_AUDIO,
-        .filter_frame = filter_frame,
     },
     { NULL }
 };
@@ -345,7 +370,6 @@
 static const AVFilterPad aecho_outputs[] = {
     {
         .name          = "default",
-        .request_frame = request_frame,
         .config_props  = config_output,
         .type          = AVMEDIA_TYPE_AUDIO,
     },
@@ -359,6 +383,7 @@
     .priv_size     = sizeof(AudioEchoContext),
     .priv_class    = &aecho_class,
     .init          = init,
+    .activate      = activate,
     .uninit        = uninit,
     .inputs        = aecho_inputs,
     .outputs       = aecho_outputs,
diff --git a/libavfilter/af_afade.c b/libavfilter/af_afade.c
index 9aab644..4edfd27 100644
--- a/libavfilter/af_afade.c
+++ b/libavfilter/af_afade.c
@@ -23,10 +23,6 @@
  * fade audio filter
  */
 
-#define FF_INTERNAL_FIELDS 1
-#include "framequeue.h"
-
-#include "libavutil/audio_fifo.h"
 #include "libavutil/opt.h"
 #include "audio.h"
 #include "avfilter.h"
@@ -43,9 +39,7 @@
     int64_t start_time;
     int overlap;
     int cf0_eof;
-    int prev_size;
     int crossfade_is_over;
-    AVAudioFifo *fifo[2];
     int64_t pts;
 
     void (*fade_samples)(uint8_t **dst, uint8_t * const *src,
@@ -57,7 +51,7 @@
                               int curve0, int curve1);
 } AudioFadeContext;
 
-enum CurveType { TRI, QSIN, ESIN, HSIN, LOG, IPAR, QUA, CUB, SQU, CBR, PAR, EXP, IQSIN, IHSIN, DESE, DESI, LOSI, NB_CURVES };
+enum CurveType { TRI, QSIN, ESIN, HSIN, LOG, IPAR, QUA, CUB, SQU, CBR, PAR, EXP, IQSIN, IHSIN, DESE, DESI, LOSI, NONE, NB_CURVES };
 
 #define OFFSET(x) offsetof(AudioFadeContext, x)
 #define FLAGS AV_OPT_FLAG_AUDIO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
@@ -159,6 +153,9 @@
                    gain = (A - B) / (C - B);
                }
         break;
+    case NONE:
+        gain = 1.0;
+        break;
     }
 
     return gain;
@@ -245,8 +242,8 @@
     { "ns",           "set number of samples for fade duration",     OFFSET(nb_samples),   AV_OPT_TYPE_INT64,  {.i64 = 44100}, 1, INT64_MAX, FLAGS },
     { "start_time",   "set time to start fading",                    OFFSET(start_time),   AV_OPT_TYPE_DURATION, {.i64 = 0. }, 0, INT64_MAX, FLAGS },
     { "st",           "set time to start fading",                    OFFSET(start_time),   AV_OPT_TYPE_DURATION, {.i64 = 0. }, 0, INT64_MAX, FLAGS },
-    { "duration",     "set fade duration",                           OFFSET(duration),     AV_OPT_TYPE_DURATION, {.i64 = 0. }, 0, INT32_MAX, FLAGS },
-    { "d",            "set fade duration",                           OFFSET(duration),     AV_OPT_TYPE_DURATION, {.i64 = 0. }, 0, INT32_MAX, FLAGS },
+    { "duration",     "set fade duration",                           OFFSET(duration),     AV_OPT_TYPE_DURATION, {.i64 = 0. }, 0, INT64_MAX, FLAGS },
+    { "d",            "set fade duration",                           OFFSET(duration),     AV_OPT_TYPE_DURATION, {.i64 = 0. }, 0, INT64_MAX, FLAGS },
     { "curve",        "set fade curve type",                         OFFSET(curve),        AV_OPT_TYPE_INT,    {.i64 = TRI  }, 0, NB_CURVES - 1, FLAGS, "curve" },
     { "c",            "set fade curve type",                         OFFSET(curve),        AV_OPT_TYPE_INT,    {.i64 = TRI  }, 0, NB_CURVES - 1, FLAGS, "curve" },
     { "tri",          "linear slope",                                0,                    AV_OPT_TYPE_CONST,  {.i64 = TRI  }, 0, 0, FLAGS, "curve" },
@@ -266,6 +263,7 @@
     { "dese",         "double-exponential seat",                     0,                    AV_OPT_TYPE_CONST,  {.i64 = DESE }, 0, 0, FLAGS, "curve" },
     { "desi",         "double-exponential sigmoid",                  0,                    AV_OPT_TYPE_CONST,  {.i64 = DESI }, 0, 0, FLAGS, "curve" },
     { "losi",         "logistic sigmoid",                            0,                    AV_OPT_TYPE_CONST,  {.i64 = LOSI }, 0, 0, FLAGS, "curve" },
+    { "nofade",       "no fade; keep audio as-is",                   0,                    AV_OPT_TYPE_CONST,  {.i64 = NONE }, 0, 0, FLAGS, "curve" },
     { NULL }
 };
 
@@ -386,6 +384,7 @@
     {     "dese",     "double-exponential seat",                       0,                    AV_OPT_TYPE_CONST,  {.i64 = DESE }, 0, 0, FLAGS, "curve" },
     {     "desi",     "double-exponential sigmoid",                    0,                    AV_OPT_TYPE_CONST,  {.i64 = DESI }, 0, 0, FLAGS, "curve" },
     {     "losi",     "logistic sigmoid",                              0,                    AV_OPT_TYPE_CONST,  {.i64 = LOSI }, 0, 0, FLAGS, "curve" },
+    {     "nofade",   "no fade; keep audio as-is",                     0,                    AV_OPT_TYPE_CONST,  {.i64 = NONE }, 0, 0, FLAGS, "curve" },
     { "curve2",       "set fade curve type for 2nd stream",            OFFSET(curve2),       AV_OPT_TYPE_INT,    {.i64 = TRI  }, 0, NB_CURVES - 1, FLAGS, "curve" },
     { "c2",           "set fade curve type for 2nd stream",            OFFSET(curve2),       AV_OPT_TYPE_INT,    {.i64 = TRI  }, 0, NB_CURVES - 1, FLAGS, "curve" },
     { NULL }
@@ -455,25 +454,26 @@
 
     if (s->crossfade_is_over) {
         ret = ff_inlink_consume_frame(ctx->inputs[1], &in);
-        if (ret < 0) {
+        if (ret > 0) {
+            in->pts = s->pts;
+            s->pts += av_rescale_q(in->nb_samples,
+                      (AVRational){ 1, outlink->sample_rate }, outlink->time_base);
+            return ff_filter_frame(outlink, in);
+        } else if (ret < 0) {
             return ret;
         } else if (ff_inlink_acknowledge_status(ctx->inputs[1], &status, &pts)) {
             ff_outlink_set_status(ctx->outputs[0], status, pts);
             return 0;
-        } else {
-            if (ff_outlink_frame_wanted(ctx->outputs[0]) && !in) {
+        } else if (!ret) {
+            if (ff_outlink_frame_wanted(ctx->outputs[0])) {
                 ff_inlink_request_frame(ctx->inputs[1]);
                 return 0;
             }
         }
-        in->pts = s->pts;
-        s->pts += av_rescale_q(in->nb_samples,
-            (AVRational){ 1, outlink->sample_rate }, outlink->time_base);
-        return ff_filter_frame(outlink, in);
     }
 
-    if (ff_framequeue_queued_samples(&ctx->inputs[0]->fifo) > s->nb_samples) {
-        nb_samples = ff_framequeue_queued_samples(&ctx->inputs[0]->fifo) - s->nb_samples;
+    if (ff_inlink_queued_samples(ctx->inputs[0]) > s->nb_samples) {
+        nb_samples = ff_inlink_queued_samples(ctx->inputs[0]) - s->nb_samples;
         if (nb_samples > 0) {
             ret = ff_inlink_consume_samples(ctx->inputs[0], nb_samples, nb_samples, &in);
             if (ret < 0) {
@@ -484,7 +484,8 @@
         s->pts += av_rescale_q(in->nb_samples,
             (AVRational){ 1, outlink->sample_rate }, outlink->time_base);
         return ff_filter_frame(outlink, in);
-    } else if (ff_framequeue_queued_samples(&ctx->inputs[1]->fifo) >= s->nb_samples) {
+    } else if (ff_inlink_queued_samples(ctx->inputs[0]) >= s->nb_samples &&
+               ff_inlink_queued_samples(ctx->inputs[1]) >= s->nb_samples && s->cf0_eof) {
         if (s->overlap) {
             out = ff_get_audio_buffer(outlink, s->nb_samples);
             if (!out)
@@ -554,10 +555,10 @@
             return ff_filter_frame(outlink, out);
         }
     } else if (ff_outlink_frame_wanted(ctx->outputs[0])) {
-        if (!s->cf0_eof && ctx->inputs[0]->status_in) {
+        if (!s->cf0_eof && ff_outlink_get_status(ctx->inputs[0])) {
             s->cf0_eof = 1;
         }
-        if (ctx->inputs[1]->status_in) {
+        if (ff_outlink_get_status(ctx->inputs[1])) {
             ff_outlink_set_status(ctx->outputs[0], AVERROR_EOF, AV_NOPTS_VALUE);
             return 0;
         }
diff --git a/libavfilter/af_afftdn.c b/libavfilter/af_afftdn.c
index fbcb0f1..bde5ff6 100644
--- a/libavfilter/af_afftdn.c
+++ b/libavfilter/af_afftdn.c
@@ -28,6 +28,7 @@
 #include "avfilter.h"
 #include "audio.h"
 #include "formats.h"
+#include "filters.h"
 
 #define C       (M_LN10 * 0.1)
 #define RATIO    0.98
@@ -140,24 +141,25 @@
 } AudioFFTDeNoiseContext;
 
 #define OFFSET(x) offsetof(AudioFFTDeNoiseContext, x)
-#define A AV_OPT_FLAG_AUDIO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
+#define AF  AV_OPT_FLAG_AUDIO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
+#define AFR AV_OPT_FLAG_AUDIO_PARAM|AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_RUNTIME_PARAM
 
 static const AVOption afftdn_options[] = {
-    { "nr", "set the noise reduction",    OFFSET(noise_reduction), AV_OPT_TYPE_FLOAT,  {.dbl = 12},          .01, 97, A },
-    { "nf", "set the noise floor",        OFFSET(noise_floor),     AV_OPT_TYPE_FLOAT,  {.dbl =-50},          -80,-20, A },
-    { "nt", "set the noise type",         OFFSET(noise_type),      AV_OPT_TYPE_INT,    {.i64 = WHITE_NOISE}, WHITE_NOISE, NB_NOISE-1, A, "type" },
-    {  "w", "white noise",                0,                       AV_OPT_TYPE_CONST,  {.i64 = WHITE_NOISE},   0,  0, A, "type" },
-    {  "v", "vinyl noise",                0,                       AV_OPT_TYPE_CONST,  {.i64 = VINYL_NOISE},   0,  0, A, "type" },
-    {  "s", "shellac noise",              0,                       AV_OPT_TYPE_CONST,  {.i64 = SHELLAC_NOISE}, 0,  0, A, "type" },
-    {  "c", "custom noise",               0,                       AV_OPT_TYPE_CONST,  {.i64 = CUSTOM_NOISE},  0,  0, A, "type" },
-    { "bn", "set the custom bands noise", OFFSET(band_noise_str),  AV_OPT_TYPE_STRING, {.str = 0},             0,  0, A },
-    { "rf", "set the residual floor",     OFFSET(residual_floor),  AV_OPT_TYPE_FLOAT,  {.dbl =-38},          -80,-20, A },
-    { "tn", "track noise",                OFFSET(track_noise),     AV_OPT_TYPE_BOOL,   {.i64 =  0},            0,  1, A },
-    { "tr", "track residual",             OFFSET(track_residual),  AV_OPT_TYPE_BOOL,   {.i64 =  0},            0,  1, A },
-    { "om", "set output mode",            OFFSET(output_mode),     AV_OPT_TYPE_INT,    {.i64 = OUT_MODE},      0,  NB_MODES-1, A, "mode" },
-    {  "i", "input",                      0,                       AV_OPT_TYPE_CONST,  {.i64 = IN_MODE},       0,  0, A, "mode" },
-    {  "o", "output",                     0,                       AV_OPT_TYPE_CONST,  {.i64 = OUT_MODE},      0,  0, A, "mode" },
-    {  "n", "noise",                      0,                       AV_OPT_TYPE_CONST,  {.i64 = NOISE_MODE},    0,  0, A, "mode" },
+    { "nr", "set the noise reduction",    OFFSET(noise_reduction), AV_OPT_TYPE_FLOAT,  {.dbl = 12},          .01, 97, AFR },
+    { "nf", "set the noise floor",        OFFSET(noise_floor),     AV_OPT_TYPE_FLOAT,  {.dbl =-50},          -80,-20, AFR },
+    { "nt", "set the noise type",         OFFSET(noise_type),      AV_OPT_TYPE_INT,    {.i64 = WHITE_NOISE}, WHITE_NOISE, NB_NOISE-1, AF, "type" },
+    {  "w", "white noise",                0,                       AV_OPT_TYPE_CONST,  {.i64 = WHITE_NOISE},   0,  0, AF, "type" },
+    {  "v", "vinyl noise",                0,                       AV_OPT_TYPE_CONST,  {.i64 = VINYL_NOISE},   0,  0, AF, "type" },
+    {  "s", "shellac noise",              0,                       AV_OPT_TYPE_CONST,  {.i64 = SHELLAC_NOISE}, 0,  0, AF, "type" },
+    {  "c", "custom noise",               0,                       AV_OPT_TYPE_CONST,  {.i64 = CUSTOM_NOISE},  0,  0, AF, "type" },
+    { "bn", "set the custom bands noise", OFFSET(band_noise_str),  AV_OPT_TYPE_STRING, {.str = 0},             0,  0, AF },
+    { "rf", "set the residual floor",     OFFSET(residual_floor),  AV_OPT_TYPE_FLOAT,  {.dbl =-38},          -80,-20, AFR },
+    { "tn", "track noise",                OFFSET(track_noise),     AV_OPT_TYPE_BOOL,   {.i64 =  0},            0,  1, AFR },
+    { "tr", "track residual",             OFFSET(track_residual),  AV_OPT_TYPE_BOOL,   {.i64 =  0},            0,  1, AFR },
+    { "om", "set output mode",            OFFSET(output_mode),     AV_OPT_TYPE_INT,    {.i64 = OUT_MODE},      0,  NB_MODES-1, AFR, "mode" },
+    {  "i", "input",                      0,                       AV_OPT_TYPE_CONST,  {.i64 = IN_MODE},       0,  0, AFR, "mode" },
+    {  "o", "output",                     0,                       AV_OPT_TYPE_CONST,  {.i64 = OUT_MODE},      0,  0, AFR, "mode" },
+    {  "n", "noise",                      0,                       AV_OPT_TYPE_CONST,  {.i64 = NOISE_MODE},    0,  0, AFR, "mode" },
     { NULL }
 };
 
@@ -563,7 +565,7 @@
 
         p = NULL;
 
-        ret = sscanf(arg, "%d", &band_noise[i]);
+        ret = av_sscanf(arg, "%d", &band_noise[i]);
         if (ret != 1) {
             av_log(s, AV_LOG_ERROR, "Custom band noise must be integer.\n");
             break;
@@ -1153,7 +1155,7 @@
     }
 }
 
-static int filter_frame(AVFilterLink *inlink, AVFrame *frame)
+static int output_frame(AVFilterLink *inlink)
 {
     AVFilterContext *ctx = inlink->dst;
     AVFilterLink *outlink = ctx->outputs[0];
@@ -1162,119 +1164,147 @@
     ThreadData td;
     int ret = 0;
 
-    if (s->pts == AV_NOPTS_VALUE)
-        s->pts = frame->pts;
+    in = ff_get_audio_buffer(outlink, s->window_length);
+    if (!in)
+        return AVERROR(ENOMEM);
 
-    ret = av_audio_fifo_write(s->fifo, (void **)frame->extended_data, frame->nb_samples);
-    av_frame_free(&frame);
+    ret = av_audio_fifo_peek(s->fifo, (void **)in->extended_data, s->window_length);
     if (ret < 0)
-        return ret;
+        goto end;
 
-    while (av_audio_fifo_size(s->fifo) >= s->window_length) {
-        if (!in) {
-            in = ff_get_audio_buffer(outlink, s->window_length);
-            if (!in)
-                return AVERROR(ENOMEM);
-        }
-
-        ret = av_audio_fifo_peek(s->fifo, (void **)in->extended_data, s->window_length);
-        if (ret < 0)
-            break;
-
-        if (s->track_noise) {
-            for (int ch = 0; ch < inlink->channels; ch++) {
-                DeNoiseChannel *dnch = &s->dnch[ch];
-                double levels[15];
-
-                get_auto_noise_levels(s, dnch, levels);
-                set_noise_profile(s, dnch, levels, 0);
-            }
-
-            if (s->noise_floor != s->last_noise_floor)
-                set_parameters(s);
-        }
-
-        if (s->sample_noise_start) {
-            for (int ch = 0; ch < inlink->channels; ch++) {
-                DeNoiseChannel *dnch = &s->dnch[ch];
-
-                init_sample_noise(dnch);
-            }
-            s->sample_noise_start = 0;
-            s->sample_noise = 1;
-        }
-
-        if (s->sample_noise) {
-            for (int ch = 0; ch < inlink->channels; ch++) {
-                DeNoiseChannel *dnch = &s->dnch[ch];
-
-                sample_noise_block(s, dnch, in, ch);
-            }
-        }
-
-        if (s->sample_noise_end) {
-            for (int ch = 0; ch < inlink->channels; ch++) {
-                DeNoiseChannel *dnch = &s->dnch[ch];
-                double sample_noise[15];
-
-                finish_sample_noise(s, dnch, sample_noise);
-                set_noise_profile(s, dnch, sample_noise, 1);
-                set_band_parameters(s, dnch);
-            }
-            s->sample_noise = 0;
-            s->sample_noise_end = 0;
-        }
-
-        s->block_count++;
-        td.in = in;
-        ctx->internal->execute(ctx, filter_channel, &td, NULL,
-                               FFMIN(outlink->channels, ff_filter_get_nb_threads(ctx)));
-
-        out = ff_get_audio_buffer(outlink, s->sample_advance);
-        if (!out) {
-            ret = AVERROR(ENOMEM);
-            break;
-        }
-
+    if (s->track_noise) {
         for (int ch = 0; ch < inlink->channels; ch++) {
             DeNoiseChannel *dnch = &s->dnch[ch];
-            double *src = dnch->out_samples;
-            float *orig = (float *)in->extended_data[ch];
-            float *dst = (float *)out->extended_data[ch];
+            double levels[15];
 
-            switch (s->output_mode) {
-            case IN_MODE:
-                for (int m = 0; m < s->sample_advance; m++)
-                    dst[m] = orig[m];
-                break;
-            case OUT_MODE:
-                for (int m = 0; m < s->sample_advance; m++)
-                    dst[m] = src[m];
-                break;
-            case NOISE_MODE:
-                for (int m = 0; m < s->sample_advance; m++)
-                    dst[m] = orig[m] - src[m];
-                break;
-            default:
-                return AVERROR_BUG;
-            }
-            memmove(src, src + s->sample_advance, (s->window_length - s->sample_advance) * sizeof(*src));
-            memset(src + (s->window_length - s->sample_advance), 0, s->sample_advance * sizeof(*src));
+            get_auto_noise_levels(s, dnch, levels);
+            set_noise_profile(s, dnch, levels, 0);
         }
 
-        av_audio_fifo_drain(s->fifo, s->sample_advance);
-
-        out->pts = s->pts;
-        ret = ff_filter_frame(outlink, out);
-        if (ret < 0)
-            break;
-        s->pts += s->sample_advance;
+        if (s->noise_floor != s->last_noise_floor)
+            set_parameters(s);
     }
+
+    if (s->sample_noise_start) {
+        for (int ch = 0; ch < inlink->channels; ch++) {
+            DeNoiseChannel *dnch = &s->dnch[ch];
+
+            init_sample_noise(dnch);
+        }
+        s->sample_noise_start = 0;
+        s->sample_noise = 1;
+    }
+
+    if (s->sample_noise) {
+        for (int ch = 0; ch < inlink->channels; ch++) {
+            DeNoiseChannel *dnch = &s->dnch[ch];
+
+            sample_noise_block(s, dnch, in, ch);
+        }
+    }
+
+    if (s->sample_noise_end) {
+        for (int ch = 0; ch < inlink->channels; ch++) {
+            DeNoiseChannel *dnch = &s->dnch[ch];
+            double sample_noise[15];
+
+            finish_sample_noise(s, dnch, sample_noise);
+            set_noise_profile(s, dnch, sample_noise, 1);
+            set_band_parameters(s, dnch);
+        }
+        s->sample_noise = 0;
+        s->sample_noise_end = 0;
+    }
+
+    s->block_count++;
+    td.in = in;
+    ctx->internal->execute(ctx, filter_channel, &td, NULL,
+                           FFMIN(outlink->channels, ff_filter_get_nb_threads(ctx)));
+
+    out = ff_get_audio_buffer(outlink, s->sample_advance);
+    if (!out) {
+        ret = AVERROR(ENOMEM);
+        goto end;
+    }
+
+    for (int ch = 0; ch < inlink->channels; ch++) {
+        DeNoiseChannel *dnch = &s->dnch[ch];
+        double *src = dnch->out_samples;
+        float *orig = (float *)in->extended_data[ch];
+        float *dst = (float *)out->extended_data[ch];
+
+        switch (s->output_mode) {
+        case IN_MODE:
+            for (int m = 0; m < s->sample_advance; m++)
+                dst[m] = orig[m];
+            break;
+        case OUT_MODE:
+            for (int m = 0; m < s->sample_advance; m++)
+                dst[m] = src[m];
+            break;
+        case NOISE_MODE:
+            for (int m = 0; m < s->sample_advance; m++)
+                dst[m] = orig[m] - src[m];
+            break;
+        default:
+            av_frame_free(&out);
+            ret = AVERROR_BUG;
+            goto end;
+        }
+        memmove(src, src + s->sample_advance, (s->window_length - s->sample_advance) * sizeof(*src));
+        memset(src + (s->window_length - s->sample_advance), 0, s->sample_advance * sizeof(*src));
+    }
+
+    av_audio_fifo_drain(s->fifo, s->sample_advance);
+
+    out->pts = s->pts;
+    ret = ff_filter_frame(outlink, out);
+    if (ret < 0)
+        goto end;
+    s->pts += av_rescale_q(s->sample_advance, (AVRational){1, outlink->sample_rate}, outlink->time_base);
+end:
     av_frame_free(&in);
 
     return ret;
 }
 
+static int activate(AVFilterContext *ctx)
+{
+    AVFilterLink *inlink = ctx->inputs[0];
+    AVFilterLink *outlink = ctx->outputs[0];
+    AudioFFTDeNoiseContext *s = ctx->priv;
+    AVFrame *frame = NULL;
+    int ret;
+
+    FF_FILTER_FORWARD_STATUS_BACK(outlink, inlink);
+
+    ret = ff_inlink_consume_frame(inlink, &frame);
+    if (ret < 0)
+        return ret;
+
+    if (ret > 0) {
+        if (s->pts == AV_NOPTS_VALUE)
+            s->pts = frame->pts;
+
+        ret = av_audio_fifo_write(s->fifo, (void **)frame->extended_data, frame->nb_samples);
+        av_frame_free(&frame);
+        if (ret < 0)
+            return ret;
+    }
+
+    if (av_audio_fifo_size(s->fifo) >= s->window_length)
+        return output_frame(inlink);
+
+    FF_FILTER_FORWARD_STATUS(inlink, outlink);
+    if (ff_outlink_frame_wanted(outlink) &&
+        av_audio_fifo_size(s->fifo) < s->window_length) {
+        ff_inlink_request_frame(inlink);
+        return 0;
+    }
+
+    return FFERROR_NOT_READY;
+}
+
 static av_cold void uninit(AVFilterContext *ctx)
 {
     AudioFFTDeNoiseContext *s = ctx->priv;
@@ -1346,41 +1376,23 @@
 {
     AudioFFTDeNoiseContext *s = ctx->priv;
     int need_reset = 0;
+    int ret = 0;
 
     if (!strcmp(cmd, "sample_noise") ||
         !strcmp(cmd, "sn")) {
         if (!strcmp(args, "start")) {
             s->sample_noise_start = 1;
             s->sample_noise_end = 0;
-        } else if (!strcmp(args, "end")) {
+        } else if (!strcmp(args, "end") ||
+                   !strcmp(args, "stop")) {
             s->sample_noise_start = 0;
             s->sample_noise_end = 1;
         }
-    } else if (!strcmp(cmd, "nr") ||
-               !strcmp(cmd, "noise_reduction")) {
-        float nr;
-
-        if (sscanf(args, "%f", &nr) == 1) {
-            s->noise_reduction = av_clipf(nr, 0.01, 97);
-            need_reset = 1;
-        }
-    } else if (!strcmp(cmd, "nf") ||
-               !strcmp(cmd, "noise_floor")) {
-        float nf;
-
-        if (sscanf(args, "%f", &nf) == 1) {
-            s->noise_floor = av_clipf(nf, -80, -20);
-            need_reset = 1;
-        }
-    } else if (!strcmp(cmd, "output_mode") ||
-               !strcmp(cmd, "om")) {
-        if (!strcmp(args, "i")) {
-            s->output_mode = IN_MODE;
-        } else if (!strcmp(args, "o")) {
-            s->output_mode = OUT_MODE;
-        } else if (!strcmp(args, "n")) {
-            s->output_mode = NOISE_MODE;
-        }
+    } else {
+        ret = ff_filter_process_command(ctx, cmd, args, res, res_len, flags);
+        if (ret < 0)
+            return ret;
+        need_reset = 1;
     }
 
     if (need_reset)
@@ -1393,7 +1405,6 @@
     {
         .name         = "default",
         .type         = AVMEDIA_TYPE_AUDIO,
-        .filter_frame = filter_frame,
         .config_props = config_input,
     },
     { NULL }
@@ -1413,6 +1424,7 @@
     .query_formats   = query_formats,
     .priv_size       = sizeof(AudioFFTDeNoiseContext),
     .priv_class      = &afftdn_class,
+    .activate        = activate,
     .uninit          = uninit,
     .inputs          = inputs,
     .outputs         = outputs,
diff --git a/libavfilter/af_afftfilt.c b/libavfilter/af_afftfilt.c
index 7f28e1f..a6156bf 100644
--- a/libavfilter/af_afftfilt.c
+++ b/libavfilter/af_afftfilt.c
@@ -26,17 +26,21 @@
 #include "libavcodec/avfft.h"
 #include "libavutil/eval.h"
 #include "audio.h"
+#include "filters.h"
 #include "window_func.h"
 
 typedef struct AFFTFiltContext {
     const AVClass *class;
     char *real_str;
     char *img_str;
+    int fft_size;
     int fft_bits;
 
     FFTContext *fft, *ifft;
     FFTComplex **fft_data;
+    FFTComplex **fft_temp;
     int nb_exprs;
+    int channels;
     int window_size;
     AVExpr **real;
     AVExpr **imag;
@@ -45,59 +49,90 @@
     int hop_size;
     float overlap;
     AVFrame *buffer;
-    int start, end;
+    int eof;
     int win_func;
-    float win_scale;
     float *window_func_lut;
 } AFFTFiltContext;
 
-static const char *const var_names[] = {            "sr",     "b",       "nb",        "ch",        "chs",   "pts",        NULL };
-enum                                   { VAR_SAMPLE_RATE, VAR_BIN, VAR_NBBINS, VAR_CHANNEL, VAR_CHANNELS, VAR_PTS, VAR_VARS_NB };
+static const char *const var_names[] = {            "sr",     "b",       "nb",        "ch",        "chs",   "pts",     "re",     "im", NULL };
+enum                                   { VAR_SAMPLE_RATE, VAR_BIN, VAR_NBBINS, VAR_CHANNEL, VAR_CHANNELS, VAR_PTS, VAR_REAL, VAR_IMAG, VAR_VARS_NB };
 
 #define OFFSET(x) offsetof(AFFTFiltContext, x)
 #define A AV_OPT_FLAG_AUDIO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
 
 static const AVOption afftfilt_options[] = {
-    { "real", "set channels real expressions",       OFFSET(real_str), AV_OPT_TYPE_STRING, {.str = "1" }, 0, 0, A },
-    { "imag",  "set channels imaginary expressions", OFFSET(img_str),  AV_OPT_TYPE_STRING, {.str = NULL }, 0, 0, A },
-    { "win_size", "set window size", OFFSET(fft_bits), AV_OPT_TYPE_INT, {.i64=12}, 4, 17, A, "fft" },
-        { "w16",    0, 0, AV_OPT_TYPE_CONST, {.i64=4},  0, 0, A, "fft" },
-        { "w32",    0, 0, AV_OPT_TYPE_CONST, {.i64=5},  0, 0, A, "fft" },
-        { "w64",    0, 0, AV_OPT_TYPE_CONST, {.i64=6},  0, 0, A, "fft" },
-        { "w128",   0, 0, AV_OPT_TYPE_CONST, {.i64=7},  0, 0, A, "fft" },
-        { "w256",   0, 0, AV_OPT_TYPE_CONST, {.i64=8},  0, 0, A, "fft" },
-        { "w512",   0, 0, AV_OPT_TYPE_CONST, {.i64=9},  0, 0, A, "fft" },
-        { "w1024",  0, 0, AV_OPT_TYPE_CONST, {.i64=10}, 0, 0, A, "fft" },
-        { "w2048",  0, 0, AV_OPT_TYPE_CONST, {.i64=11}, 0, 0, A, "fft" },
-        { "w4096",  0, 0, AV_OPT_TYPE_CONST, {.i64=12}, 0, 0, A, "fft" },
-        { "w8192",  0, 0, AV_OPT_TYPE_CONST, {.i64=13}, 0, 0, A, "fft" },
-        { "w16384", 0, 0, AV_OPT_TYPE_CONST, {.i64=14}, 0, 0, A, "fft" },
-        { "w32768", 0, 0, AV_OPT_TYPE_CONST, {.i64=15}, 0, 0, A, "fft" },
-        { "w65536", 0, 0, AV_OPT_TYPE_CONST, {.i64=16}, 0, 0, A, "fft" },
-        { "w131072",0, 0, AV_OPT_TYPE_CONST, {.i64=17}, 0, 0, A, "fft" },
+    { "real", "set channels real expressions",       OFFSET(real_str), AV_OPT_TYPE_STRING, {.str = "re" }, 0, 0, A },
+    { "imag", "set channels imaginary expressions",  OFFSET(img_str),  AV_OPT_TYPE_STRING, {.str = "im" }, 0, 0, A },
+    { "win_size", "set window size", OFFSET(fft_size), AV_OPT_TYPE_INT, {.i64=4096}, 16, 131072, A },
     { "win_func", "set window function", OFFSET(win_func), AV_OPT_TYPE_INT, {.i64 = WFUNC_HANNING}, 0, NB_WFUNC-1, A, "win_func" },
         { "rect",     "Rectangular",      0, AV_OPT_TYPE_CONST, {.i64=WFUNC_RECT},     0, 0, A, "win_func" },
         { "bartlett", "Bartlett",         0, AV_OPT_TYPE_CONST, {.i64=WFUNC_BARTLETT}, 0, 0, A, "win_func" },
         { "hann",     "Hann",             0, AV_OPT_TYPE_CONST, {.i64=WFUNC_HANNING},  0, 0, A, "win_func" },
         { "hanning",  "Hanning",          0, AV_OPT_TYPE_CONST, {.i64=WFUNC_HANNING},  0, 0, A, "win_func" },
         { "hamming",  "Hamming",          0, AV_OPT_TYPE_CONST, {.i64=WFUNC_HAMMING},  0, 0, A, "win_func" },
+        { "blackman", "Blackman",         0, AV_OPT_TYPE_CONST, {.i64=WFUNC_BLACKMAN}, 0, 0, A, "win_func" },
+        { "welch",    "Welch",            0, AV_OPT_TYPE_CONST, {.i64=WFUNC_WELCH},    0, 0, A, "win_func" },
+        { "flattop",  "Flat-top",         0, AV_OPT_TYPE_CONST, {.i64=WFUNC_FLATTOP},  0, 0, A, "win_func" },
+        { "bharris",  "Blackman-Harris",  0, AV_OPT_TYPE_CONST, {.i64=WFUNC_BHARRIS},  0, 0, A, "win_func" },
+        { "bnuttall", "Blackman-Nuttall", 0, AV_OPT_TYPE_CONST, {.i64=WFUNC_BNUTTALL}, 0, 0, A, "win_func" },
+        { "bhann",    "Bartlett-Hann",    0, AV_OPT_TYPE_CONST, {.i64=WFUNC_BHANN},    0, 0, A, "win_func" },
         { "sine",     "Sine",             0, AV_OPT_TYPE_CONST, {.i64=WFUNC_SINE},     0, 0, A, "win_func" },
+        { "nuttall",  "Nuttall",          0, AV_OPT_TYPE_CONST, {.i64=WFUNC_NUTTALL},  0, 0, A, "win_func" },
+        { "lanczos",  "Lanczos",          0, AV_OPT_TYPE_CONST, {.i64=WFUNC_LANCZOS},  0, 0, A, "win_func" },
+        { "gauss",    "Gauss",            0, AV_OPT_TYPE_CONST, {.i64=WFUNC_GAUSS},    0, 0, A, "win_func" },
+        { "tukey",    "Tukey",            0, AV_OPT_TYPE_CONST, {.i64=WFUNC_TUKEY},    0, 0, A, "win_func" },
+        { "dolph",    "Dolph-Chebyshev",  0, AV_OPT_TYPE_CONST, {.i64=WFUNC_DOLPH},    0, 0, A, "win_func" },
+        { "cauchy",   "Cauchy",           0, AV_OPT_TYPE_CONST, {.i64=WFUNC_CAUCHY},   0, 0, A, "win_func" },
+        { "parzen",   "Parzen",           0, AV_OPT_TYPE_CONST, {.i64=WFUNC_PARZEN},   0, 0, A, "win_func" },
+        { "poisson",  "Poisson",          0, AV_OPT_TYPE_CONST, {.i64=WFUNC_POISSON},  0, 0, A, "win_func" },
+        { "bohman",   "Bohman",           0, AV_OPT_TYPE_CONST, {.i64=WFUNC_BOHMAN},   0, 0, A, "win_func" },
     { "overlap", "set window overlap", OFFSET(overlap), AV_OPT_TYPE_FLOAT, {.dbl=0.75}, 0,  1, A },
     { NULL },
 };
 
 AVFILTER_DEFINE_CLASS(afftfilt);
 
+static inline double getreal(void *priv, double x, double ch)
+{
+    AFFTFiltContext *s = priv;
+    int ich, ix;
+
+    ich = av_clip(ch, 0, s->nb_exprs - 1);
+    ix = av_clip(x, 0, s->window_size / 2);
+
+    return s->fft_data[ich][ix].re;
+}
+
+static inline double getimag(void *priv, double x, double ch)
+{
+    AFFTFiltContext *s = priv;
+    int ich, ix;
+
+    ich = av_clip(ch, 0, s->nb_exprs - 1);
+    ix = av_clip(x, 0, s->window_size / 2);
+
+    return s->fft_data[ich][ix].im;
+}
+
+static double realf(void *priv, double x, double ch) { return getreal(priv, x, ch); }
+static double imagf(void *priv, double x, double ch) { return getimag(priv, x, ch); }
+
+static const char *const func2_names[]    = { "real", "imag", NULL };
+double (*func2[])(void *, double, double) = {  realf,  imagf, NULL };
+
 static int config_input(AVFilterLink *inlink)
 {
     AVFilterContext *ctx = inlink->dst;
     AFFTFiltContext *s = ctx->priv;
     char *saveptr = NULL;
-    int ret = 0, ch, i;
+    int ret = 0, ch;
     float overlap;
     char *args;
     const char *last_expr = "1";
 
+    s->channels = inlink->channels;
+    s->pts  = AV_NOPTS_VALUE;
+    s->fft_bits = av_log2(s->fft_size);
     s->fft  = av_fft_init(s->fft_bits, 0);
     s->ifft = av_fft_init(s->fft_bits, 1);
     if (!s->fft || !s->ifft)
@@ -109,12 +144,22 @@
     if (!s->fft_data)
         return AVERROR(ENOMEM);
 
+    s->fft_temp = av_calloc(inlink->channels, sizeof(*s->fft_temp));
+    if (!s->fft_temp)
+        return AVERROR(ENOMEM);
+
     for (ch = 0; ch < inlink->channels; ch++) {
         s->fft_data[ch] = av_calloc(s->window_size, sizeof(**s->fft_data));
         if (!s->fft_data[ch])
             return AVERROR(ENOMEM);
     }
 
+    for (ch = 0; ch < inlink->channels; ch++) {
+        s->fft_temp[ch] = av_calloc(s->window_size, sizeof(**s->fft_temp));
+        if (!s->fft_temp[ch])
+            return AVERROR(ENOMEM);
+    }
+
     s->real = av_calloc(inlink->channels, sizeof(*s->real));
     if (!s->real)
         return AVERROR(ENOMEM);
@@ -131,32 +176,34 @@
         char *arg = av_strtok(ch == 0 ? args : NULL, "|", &saveptr);
 
         ret = av_expr_parse(&s->real[ch], arg ? arg : last_expr, var_names,
-                            NULL, NULL, NULL, NULL, 0, ctx);
+                            NULL, NULL, func2_names, func2, 0, ctx);
         if (ret < 0)
-            break;
+            goto fail;
         if (arg)
             last_expr = arg;
         s->nb_exprs++;
     }
 
-    av_free(args);
+    av_freep(&args);
 
     args = av_strdup(s->img_str ? s->img_str : s->real_str);
     if (!args)
         return AVERROR(ENOMEM);
 
+    saveptr = NULL;
+    last_expr = "1";
     for (ch = 0; ch < inlink->channels; ch++) {
         char *arg = av_strtok(ch == 0 ? args : NULL, "|", &saveptr);
 
         ret = av_expr_parse(&s->imag[ch], arg ? arg : last_expr, var_names,
-                            NULL, NULL, NULL, NULL, 0, ctx);
+                            NULL, NULL, func2_names, func2, 0, ctx);
         if (ret < 0)
-            break;
+            goto fail;
         if (arg)
             last_expr = arg;
     }
 
-    av_free(args);
+    av_freep(&args);
 
     s->fifo = av_audio_fifo_alloc(inlink->format, inlink->channels, s->window_size);
     if (!s->fifo)
@@ -170,10 +217,6 @@
     if (s->overlap == 1)
         s->overlap = overlap;
 
-    for (s->win_scale = 0, i = 0; i < s->window_size; i++) {
-        s->win_scale += s->window_func_lut[i] * s->window_func_lut[i];
-    }
-
     s->hop_size = s->window_size * (1 - s->overlap);
     if (s->hop_size <= 0)
         return AVERROR(EINVAL);
@@ -182,145 +225,180 @@
     if (!s->buffer)
         return AVERROR(ENOMEM);
 
+fail:
+    av_freep(&args);
+
     return ret;
 }
 
-static int filter_frame(AVFilterLink *inlink, AVFrame *frame)
+static int filter_frame(AVFilterLink *inlink)
 {
     AVFilterContext *ctx = inlink->dst;
     AVFilterLink *outlink = ctx->outputs[0];
     AFFTFiltContext *s = ctx->priv;
     const int window_size = s->window_size;
-    const float f = 1. / s->win_scale;
+    const float f = 1. / (s->window_size / 2);
     double values[VAR_VARS_NB];
     AVFrame *out, *in = NULL;
-    int ch, n, ret, i, j, k;
-    int start = s->start, end = s->end;
+    int ch, n, ret, i;
 
-    ret = av_audio_fifo_write(s->fifo, (void **)frame->extended_data, frame->nb_samples);
-    av_frame_free(&frame);
-    if (ret < 0)
-        return ret;
-
-    while (av_audio_fifo_size(s->fifo) >= window_size) {
-        if (!in) {
-            in = ff_get_audio_buffer(outlink, window_size);
-            if (!in)
-                return AVERROR(ENOMEM);
-        }
-
-        ret = av_audio_fifo_peek(s->fifo, (void **)in->extended_data, window_size);
-        if (ret < 0)
-            break;
-
-        for (ch = 0; ch < inlink->channels; ch++) {
-            const float *src = (float *)in->extended_data[ch];
-            FFTComplex *fft_data = s->fft_data[ch];
-
-            for (n = 0; n < in->nb_samples; n++) {
-                fft_data[n].re = src[n] * s->window_func_lut[n];
-                fft_data[n].im = 0;
-            }
-
-            for (; n < window_size; n++) {
-                fft_data[n].re = 0;
-                fft_data[n].im = 0;
-            }
-        }
-
-        values[VAR_PTS]         = s->pts;
-        values[VAR_SAMPLE_RATE] = inlink->sample_rate;
-        values[VAR_NBBINS]      = window_size / 2;
-        values[VAR_CHANNELS]    = inlink->channels;
-
-        for (ch = 0; ch < inlink->channels; ch++) {
-            FFTComplex *fft_data = s->fft_data[ch];
-            float *buf = (float *)s->buffer->extended_data[ch];
-            int x;
-
-            values[VAR_CHANNEL] = ch;
-
-            av_fft_permute(s->fft, fft_data);
-            av_fft_calc(s->fft, fft_data);
-
-            for (n = 0; n < window_size / 2; n++) {
-                float fr, fi;
-
-                values[VAR_BIN] = n;
-
-                fr = av_expr_eval(s->real[ch], values, s);
-                fi = av_expr_eval(s->imag[ch], values, s);
-
-                fft_data[n].re *= fr;
-                fft_data[n].im *= fi;
-            }
-
-            for (n = window_size / 2 + 1, x = window_size / 2 - 1; n < window_size; n++, x--) {
-                fft_data[n].re =  fft_data[x].re;
-                fft_data[n].im = -fft_data[x].im;
-            }
-
-            av_fft_permute(s->ifft, fft_data);
-            av_fft_calc(s->ifft, fft_data);
-
-            start = s->start;
-            end = s->end;
-            k = end;
-            for (i = 0, j = start; j < k && i < window_size; i++, j++) {
-                buf[j] += s->fft_data[ch][i].re * f;
-            }
-
-            for (; i < window_size; i++, j++) {
-                buf[j] = s->fft_data[ch][i].re * f;
-            }
-
-            start += s->hop_size;
-            end = j;
-        }
-
-        s->start = start;
-        s->end = end;
-
-        if (start >= window_size) {
-            float *dst, *buf;
-
-            start -= window_size;
-            end   -= window_size;
-
-            s->start = start;
-            s->end = end;
-
-            out = ff_get_audio_buffer(outlink, window_size);
-            if (!out) {
-                ret = AVERROR(ENOMEM);
-                break;
-            }
-
-            out->pts = s->pts;
-            s->pts += window_size;
-
-            for (ch = 0; ch < inlink->channels; ch++) {
-                dst = (float *)out->extended_data[ch];
-                buf = (float *)s->buffer->extended_data[ch];
-
-                for (n = 0; n < window_size; n++) {
-                    dst[n] = buf[n] * (1 - s->overlap);
-                }
-                memmove(buf, buf + window_size, window_size * 4);
-            }
-
-            ret = ff_filter_frame(outlink, out);
-            if (ret < 0)
-                break;
-        }
-
-        av_audio_fifo_drain(s->fifo, s->hop_size);
+    if (!in) {
+        in = ff_get_audio_buffer(outlink, window_size);
+        if (!in)
+            return AVERROR(ENOMEM);
     }
 
+    ret = av_audio_fifo_peek(s->fifo, (void **)in->extended_data, window_size);
+    if (ret < 0)
+        goto fail;
+
+    for (ch = 0; ch < inlink->channels; ch++) {
+        const float *src = (float *)in->extended_data[ch];
+        FFTComplex *fft_data = s->fft_data[ch];
+
+        for (n = 0; n < in->nb_samples; n++) {
+            fft_data[n].re = src[n] * s->window_func_lut[n];
+            fft_data[n].im = 0;
+        }
+
+        for (; n < window_size; n++) {
+            fft_data[n].re = 0;
+            fft_data[n].im = 0;
+        }
+    }
+
+    values[VAR_PTS]         = s->pts;
+    values[VAR_SAMPLE_RATE] = inlink->sample_rate;
+    values[VAR_NBBINS]      = window_size / 2;
+    values[VAR_CHANNELS]    = inlink->channels;
+
+    for (ch = 0; ch < inlink->channels; ch++) {
+        FFTComplex *fft_data = s->fft_data[ch];
+
+        av_fft_permute(s->fft, fft_data);
+        av_fft_calc(s->fft, fft_data);
+    }
+
+    for (ch = 0; ch < inlink->channels; ch++) {
+        FFTComplex *fft_data = s->fft_data[ch];
+        FFTComplex *fft_temp = s->fft_temp[ch];
+        float *buf = (float *)s->buffer->extended_data[ch];
+        int x;
+        values[VAR_CHANNEL] = ch;
+
+        for (n = 0; n <= window_size / 2; n++) {
+            float fr, fi;
+
+            values[VAR_BIN] = n;
+            values[VAR_REAL] = fft_data[n].re;
+            values[VAR_IMAG] = fft_data[n].im;
+
+            fr = av_expr_eval(s->real[ch], values, s);
+            fi = av_expr_eval(s->imag[ch], values, s);
+
+            fft_temp[n].re = fr;
+            fft_temp[n].im = fi;
+        }
+
+        for (n = window_size / 2 + 1, x = window_size / 2 - 1; n < window_size; n++, x--) {
+            fft_temp[n].re =  fft_temp[x].re;
+            fft_temp[n].im = -fft_temp[x].im;
+        }
+
+        av_fft_permute(s->ifft, fft_temp);
+        av_fft_calc(s->ifft, fft_temp);
+
+        for (i = 0; i < window_size; i++) {
+            buf[i] += s->fft_temp[ch][i].re * f;
+        }
+    }
+
+    out = ff_get_audio_buffer(outlink, s->hop_size);
+    if (!out) {
+        ret = AVERROR(ENOMEM);
+        goto fail;
+    }
+
+    out->pts = s->pts;
+    s->pts += av_rescale_q(s->hop_size, (AVRational){1, outlink->sample_rate}, outlink->time_base);
+
+    for (ch = 0; ch < inlink->channels; ch++) {
+        float *dst = (float *)out->extended_data[ch];
+        float *buf = (float *)s->buffer->extended_data[ch];
+
+        for (n = 0; n < s->hop_size; n++)
+            dst[n] = buf[n] * (1.f - s->overlap);
+        memmove(buf, buf + s->hop_size, window_size * 4);
+    }
+
+    ret = ff_filter_frame(outlink, out);
+    if (ret < 0)
+        goto fail;
+
+    av_audio_fifo_drain(s->fifo, s->hop_size);
+
+fail:
     av_frame_free(&in);
     return ret < 0 ? ret : 0;
 }
 
+static int activate(AVFilterContext *ctx)
+{
+    AVFilterLink *inlink = ctx->inputs[0];
+    AVFilterLink *outlink = ctx->outputs[0];
+    AFFTFiltContext *s = ctx->priv;
+    AVFrame *in = NULL;
+    int ret = 0, status;
+    int64_t pts;
+
+    FF_FILTER_FORWARD_STATUS_BACK(outlink, inlink);
+
+    if (!s->eof && av_audio_fifo_size(s->fifo) < s->window_size) {
+        ret = ff_inlink_consume_frame(inlink, &in);
+        if (ret < 0)
+            return ret;
+
+        if (ret > 0) {
+            ret = av_audio_fifo_write(s->fifo, (void **)in->extended_data,
+                                      in->nb_samples);
+            if (ret >= 0 && s->pts == AV_NOPTS_VALUE)
+                s->pts = in->pts;
+
+            av_frame_free(&in);
+            if (ret < 0)
+                return ret;
+        }
+    }
+
+    if ((av_audio_fifo_size(s->fifo) >= s->window_size) ||
+        (av_audio_fifo_size(s->fifo) > 0 && s->eof)) {
+        ret = filter_frame(inlink);
+        if (av_audio_fifo_size(s->fifo) >= s->window_size)
+            ff_filter_set_ready(ctx, 100);
+        return ret;
+    }
+
+    if (!s->eof && ff_inlink_acknowledge_status(inlink, &status, &pts)) {
+        if (status == AVERROR_EOF) {
+            s->eof = 1;
+            if (av_audio_fifo_size(s->fifo) >= 0) {
+                ff_filter_set_ready(ctx, 100);
+                return 0;
+            }
+        }
+    }
+
+    if (s->eof && av_audio_fifo_size(s->fifo) <= 0) {
+        ff_outlink_set_status(outlink, AVERROR_EOF, s->pts);
+        return 0;
+    }
+
+    if (!s->eof)
+        FF_FILTER_FORWARD_WANTED(outlink, inlink);
+
+    return FFERROR_NOT_READY;
+}
+
 static int query_formats(AVFilterContext *ctx)
 {
     AVFilterFormats *formats;
@@ -359,11 +437,14 @@
     av_fft_end(s->fft);
     av_fft_end(s->ifft);
 
-    for (i = 0; i < s->nb_exprs; i++) {
+    for (i = 0; i < s->channels; i++) {
         if (s->fft_data)
             av_freep(&s->fft_data[i]);
+        if (s->fft_temp)
+            av_freep(&s->fft_temp[i]);
     }
     av_freep(&s->fft_data);
+    av_freep(&s->fft_temp);
 
     for (i = 0; i < s->nb_exprs; i++) {
         av_expr_free(s->real[i]);
@@ -383,7 +464,6 @@
         .name         = "default",
         .type         = AVMEDIA_TYPE_AUDIO,
         .config_props = config_input,
-        .filter_frame = filter_frame,
     },
     { NULL }
 };
@@ -403,6 +483,7 @@
     .priv_class      = &afftfilt_class,
     .inputs          = inputs,
     .outputs         = outputs,
+    .activate        = activate,
     .query_formats   = query_formats,
     .uninit          = uninit,
 };
diff --git a/libavfilter/af_afir.c b/libavfilter/af_afir.c
index 244da3a..7c7e845 100644
--- a/libavfilter/af_afir.c
+++ b/libavfilter/af_afir.c
@@ -25,6 +25,7 @@
 
 #include <float.h>
 
+#include "libavutil/avstring.h"
 #include "libavutil/common.h"
 #include "libavutil/float_dsp.h"
 #include "libavutil/intreadwrite.h"
@@ -56,61 +57,150 @@
     sum[2 * n] += t[2 * n] * c[2 * n];
 }
 
-static int fir_channel(AVFilterContext *ctx, void *arg, int ch, int nb_jobs)
+static void direct(const float *in, const FFTComplex *ir, int len, float *out)
+{
+    for (int n = 0; n < len; n++)
+        for (int m = 0; m <= n; m++)
+            out[n] += ir[m].re * in[n - m];
+}
+
+static int fir_quantum(AVFilterContext *ctx, AVFrame *out, int ch, int offset)
 {
     AudioFIRContext *s = ctx->priv;
-    const float *src = (const float *)s->in[0]->extended_data[ch];
-    int index1 = (s->index + 1) % 3;
-    int index2 = (s->index + 2) % 3;
-    float *sum = s->sum[ch];
-    AVFrame *out = arg;
-    float *block;
-    float *dst;
+    const float *in = (const float *)s->in->extended_data[ch] + offset;
+    float *block, *buf, *ptr = (float *)out->extended_data[ch] + offset;
+    const int nb_samples = FFMIN(s->min_part_size, out->nb_samples - offset);
     int n, i, j;
 
-    memset(sum, 0, sizeof(*sum) * s->fft_length);
-    block = s->block[ch] + s->part_index * s->block_size;
-    memset(block, 0, sizeof(*block) * s->fft_length);
+    for (int segment = 0; segment < s->nb_segments; segment++) {
+        AudioFIRSegment *seg = &s->seg[segment];
+        float *src = (float *)seg->input->extended_data[ch];
+        float *dst = (float *)seg->output->extended_data[ch];
+        float *sum = (float *)seg->sum->extended_data[ch];
 
-    s->fdsp->vector_fmul_scalar(block + s->part_size, src, s->dry_gain, FFALIGN(s->nb_samples, 4));
-    emms_c();
+        if (s->min_part_size >= 8) {
+            s->fdsp->vector_fmul_scalar(src + seg->input_offset, in, s->dry_gain, FFALIGN(nb_samples, 4));
+            emms_c();
+        } else {
+            for (n = 0; n < nb_samples; n++)
+                src[seg->input_offset + n] = in[n] * s->dry_gain;
+        }
 
-    av_rdft_calc(s->rdft[ch], block);
-    block[2 * s->part_size] = block[1];
-    block[1] = 0;
+        seg->output_offset[ch] += s->min_part_size;
+        if (seg->output_offset[ch] == seg->part_size) {
+            seg->output_offset[ch] = 0;
+        } else {
+            memmove(src, src + s->min_part_size, (seg->input_size - s->min_part_size) * sizeof(*src));
 
-    j = s->part_index;
+            dst += seg->output_offset[ch];
+            for (n = 0; n < nb_samples; n++) {
+                ptr[n] += dst[n];
+            }
+            continue;
+        }
 
-    for (i = 0; i < s->nb_partitions; i++) {
-        const int coffset = i * s->coeff_size;
-        const FFTComplex *coeff = s->coeff[ch * !s->one2many] + coffset;
+        if (seg->part_size < 8) {
+            memset(dst, 0, sizeof(*dst) * seg->part_size * seg->nb_partitions);
 
-        block = s->block[ch] + j * s->block_size;
-        s->fcmul_add(sum, block, (const float *)coeff, s->part_size);
+            j = seg->part_index[ch];
 
-        if (j == 0)
-            j = s->nb_partitions;
-        j--;
+            for (i = 0; i < seg->nb_partitions; i++) {
+                const int coffset = j * seg->coeff_size;
+                const FFTComplex *coeff = (const FFTComplex *)seg->coeff->extended_data[ch * !s->one2many] + coffset;
+
+                direct(src, coeff, nb_samples, dst);
+
+                if (j == 0)
+                    j = seg->nb_partitions;
+                j--;
+            }
+
+            seg->part_index[ch] = (seg->part_index[ch] + 1) % seg->nb_partitions;
+
+            memmove(src, src + s->min_part_size, (seg->input_size - s->min_part_size) * sizeof(*src));
+
+            for (n = 0; n < nb_samples; n++) {
+                ptr[n] += dst[n];
+            }
+            continue;
+        }
+
+        memset(sum, 0, sizeof(*sum) * seg->fft_length);
+        block = (float *)seg->block->extended_data[ch] + seg->part_index[ch] * seg->block_size;
+        memset(block + seg->part_size, 0, sizeof(*block) * (seg->fft_length - seg->part_size));
+
+        memcpy(block, src, sizeof(*src) * seg->part_size);
+
+        av_rdft_calc(seg->rdft[ch], block);
+        block[2 * seg->part_size] = block[1];
+        block[1] = 0;
+
+        j = seg->part_index[ch];
+
+        for (i = 0; i < seg->nb_partitions; i++) {
+            const int coffset = j * seg->coeff_size;
+            const float *block = (const float *)seg->block->extended_data[ch] + i * seg->block_size;
+            const FFTComplex *coeff = (const FFTComplex *)seg->coeff->extended_data[ch * !s->one2many] + coffset;
+
+            s->afirdsp.fcmul_add(sum, block, (const float *)coeff, seg->part_size);
+
+            if (j == 0)
+                j = seg->nb_partitions;
+            j--;
+        }
+
+        sum[1] = sum[2 * seg->part_size];
+        av_rdft_calc(seg->irdft[ch], sum);
+
+        buf = (float *)seg->buffer->extended_data[ch];
+        for (n = 0; n < seg->part_size; n++) {
+            buf[n] += sum[n];
+        }
+
+        memcpy(dst, buf, seg->part_size * sizeof(*dst));
+
+        buf = (float *)seg->buffer->extended_data[ch];
+        memcpy(buf, sum + seg->part_size, seg->part_size * sizeof(*buf));
+
+        seg->part_index[ch] = (seg->part_index[ch] + 1) % seg->nb_partitions;
+
+        memmove(src, src + s->min_part_size, (seg->input_size - s->min_part_size) * sizeof(*src));
+
+        for (n = 0; n < nb_samples; n++) {
+            ptr[n] += dst[n];
+        }
     }
 
-    sum[1] = sum[2 * s->part_size];
-    av_rdft_calc(s->irdft[ch], sum);
-
-    dst = (float *)s->buffer->extended_data[ch] + index1 * s->part_size;
-    for (n = 0; n < s->part_size; n++) {
-        dst[n] += sum[n];
-    }
-
-    dst = (float *)s->buffer->extended_data[ch] + index2 * s->part_size;
-
-    memcpy(dst, sum + s->part_size, s->part_size * sizeof(*dst));
-
-    dst = (float *)s->buffer->extended_data[ch] + s->index * s->part_size;
-
-    if (out) {
-        float *ptr = (float *)out->extended_data[ch];
-        s->fdsp->vector_fmul_scalar(ptr, dst, s->wet_gain, FFALIGN(out->nb_samples, 4));
+    if (s->min_part_size >= 8) {
+        s->fdsp->vector_fmul_scalar(ptr, ptr, s->wet_gain, FFALIGN(nb_samples, 4));
         emms_c();
+    } else {
+        for (n = 0; n < nb_samples; n++)
+            ptr[n] *= s->wet_gain;
+    }
+
+    return 0;
+}
+
+static int fir_channel(AVFilterContext *ctx, AVFrame *out, int ch)
+{
+    AudioFIRContext *s = ctx->priv;
+
+    for (int offset = 0; offset < out->nb_samples; offset += s->min_part_size) {
+        fir_quantum(ctx, out, ch, offset);
+    }
+
+    return 0;
+}
+
+static int fir_channels(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
+{
+    AVFrame *out = arg;
+    const int start = (out->channels * jobnr) / nb_jobs;
+    const int end = (out->channels * (jobnr+1)) / nb_jobs;
+
+    for (int ch = start; ch < end; ch++) {
+        fir_channel(ctx, out, ch);
     }
 
     return 0;
@@ -120,43 +210,27 @@
 {
     AVFilterContext *ctx = outlink->src;
     AVFrame *out = NULL;
-    int ret;
 
-    s->nb_samples = in->nb_samples;
-
-    if (!s->want_skip) {
-        out = ff_get_audio_buffer(outlink, s->nb_samples);
-        if (!out)
-            return AVERROR(ENOMEM);
+    out = ff_get_audio_buffer(outlink, in->nb_samples);
+    if (!out) {
+        av_frame_free(&in);
+        return AVERROR(ENOMEM);
     }
 
     if (s->pts == AV_NOPTS_VALUE)
         s->pts = in->pts;
-    s->in[0] = in;
-    ctx->internal->execute(ctx, fir_channel, out, NULL, outlink->channels);
+    s->in = in;
+    ctx->internal->execute(ctx, fir_channels, out, NULL, FFMIN(outlink->channels,
+                                                               ff_filter_get_nb_threads(ctx)));
 
-    s->part_index = (s->part_index + 1) % s->nb_partitions;
-
-    if (!s->want_skip) {
-        out->pts = s->pts;
-        if (s->pts != AV_NOPTS_VALUE)
-            s->pts += av_rescale_q(out->nb_samples, (AVRational){1, outlink->sample_rate}, outlink->time_base);
-    }
-
-    s->index++;
-    if (s->index == 3)
-        s->index = 0;
+    out->pts = s->pts;
+    if (s->pts != AV_NOPTS_VALUE)
+        s->pts += av_rescale_q(out->nb_samples, (AVRational){1, outlink->sample_rate}, outlink->time_base);
 
     av_frame_free(&in);
+    s->in = NULL;
 
-    if (s->want_skip == 1) {
-        s->want_skip = 0;
-        ret = 0;
-    } else {
-        ret = ff_filter_frame(outlink, out);
-    }
-
-    return ret;
+    return ff_filter_frame(outlink, out);
 }
 
 static void drawtext(AVFrame *pic, int x, int y, const char *txt, uint32_t color)
@@ -211,8 +285,9 @@
 static void draw_response(AVFilterContext *ctx, AVFrame *out)
 {
     AudioFIRContext *s = ctx->priv;
-    float *mag, *phase, min = FLT_MAX, max = FLT_MIN;
-    int prev_ymag = -1, prev_yphase = -1;
+    float *mag, *phase, *delay, min = FLT_MAX, max = FLT_MIN;
+    float min_delay = FLT_MAX, max_delay = FLT_MIN;
+    int prev_ymag = -1, prev_yphase = -1, prev_ydelay = -1;
     char text[32];
     int channel, i, x;
 
@@ -220,44 +295,56 @@
 
     phase = av_malloc_array(s->w, sizeof(*phase));
     mag = av_malloc_array(s->w, sizeof(*mag));
-    if (!mag || !phase)
+    delay = av_malloc_array(s->w, sizeof(*delay));
+    if (!mag || !phase || !delay)
         goto end;
 
-    channel = av_clip(s->ir_channel, 0, s->in[1]->channels - 1);
+    channel = av_clip(s->ir_channel, 0, s->ir[s->selir]->channels - 1);
     for (i = 0; i < s->w; i++) {
-        const float *src = (const float *)s->in[1]->extended_data[channel];
+        const float *src = (const float *)s->ir[s->selir]->extended_data[channel];
         double w = i * M_PI / (s->w - 1);
-        double real = 0.;
-        double imag = 0.;
+        double div, real_num = 0., imag_num = 0., real = 0., imag = 0.;
 
         for (x = 0; x < s->nb_taps; x++) {
             real += cos(-x * w) * src[x];
             imag += sin(-x * w) * src[x];
+            real_num += cos(-x * w) * src[x] * x;
+            imag_num += sin(-x * w) * src[x] * x;
         }
 
         mag[i] = hypot(real, imag);
         phase[i] = atan2(imag, real);
+        div = real * real + imag * imag;
+        delay[i] = (real_num * real + imag_num * imag) / div;
         min = fminf(min, mag[i]);
         max = fmaxf(max, mag[i]);
+        min_delay = fminf(min_delay, delay[i]);
+        max_delay = fmaxf(max_delay, delay[i]);
     }
 
     for (i = 0; i < s->w; i++) {
         int ymag = mag[i] / max * (s->h - 1);
+        int ydelay = (delay[i] - min_delay) / (max_delay - min_delay) * (s->h - 1);
         int yphase = (0.5 * (1. + phase[i] / M_PI)) * (s->h - 1);
 
         ymag = s->h - 1 - av_clip(ymag, 0, s->h - 1);
         yphase = s->h - 1 - av_clip(yphase, 0, s->h - 1);
+        ydelay = s->h - 1 - av_clip(ydelay, 0, s->h - 1);
 
         if (prev_ymag < 0)
             prev_ymag = ymag;
         if (prev_yphase < 0)
             prev_yphase = yphase;
+        if (prev_ydelay < 0)
+            prev_ydelay = ydelay;
 
         draw_line(out, i,   ymag, FFMAX(i - 1, 0),   prev_ymag, 0xFFFF00FF);
         draw_line(out, i, yphase, FFMAX(i - 1, 0), prev_yphase, 0xFF00FF00);
+        draw_line(out, i, ydelay, FFMAX(i - 1, 0), prev_ydelay, 0xFF00FFFF);
 
         prev_ymag   = ymag;
         prev_yphase = yphase;
+        prev_ydelay = ydelay;
     }
 
     if (s->w > 400 && s->h > 100) {
@@ -268,100 +355,174 @@
         drawtext(out, 2, 12, "Min Magnitude:", 0xDDDDDDDD);
         snprintf(text, sizeof(text), "%.2f", min);
         drawtext(out, 15 * 8 + 2, 12, text, 0xDDDDDDDD);
+
+        drawtext(out, 2, 22, "Max Delay:", 0xDDDDDDDD);
+        snprintf(text, sizeof(text), "%.2f", max_delay);
+        drawtext(out, 11 * 8 + 2, 22, text, 0xDDDDDDDD);
+
+        drawtext(out, 2, 32, "Min Delay:", 0xDDDDDDDD);
+        snprintf(text, sizeof(text), "%.2f", min_delay);
+        drawtext(out, 11 * 8 + 2, 32, text, 0xDDDDDDDD);
     }
 
 end:
+    av_free(delay);
     av_free(phase);
     av_free(mag);
 }
 
+static int init_segment(AVFilterContext *ctx, AudioFIRSegment *seg,
+                        int offset, int nb_partitions, int part_size)
+{
+    AudioFIRContext *s = ctx->priv;
+
+    seg->rdft  = av_calloc(ctx->inputs[0]->channels, sizeof(*seg->rdft));
+    seg->irdft = av_calloc(ctx->inputs[0]->channels, sizeof(*seg->irdft));
+    if (!seg->rdft || !seg->irdft)
+        return AVERROR(ENOMEM);
+
+    seg->fft_length    = part_size * 2 + 1;
+    seg->part_size     = part_size;
+    seg->block_size    = FFALIGN(seg->fft_length, 32);
+    seg->coeff_size    = FFALIGN(seg->part_size + 1, 32);
+    seg->nb_partitions = nb_partitions;
+    seg->input_size    = offset + s->min_part_size;
+    seg->input_offset  = offset;
+
+    seg->part_index    = av_calloc(ctx->inputs[0]->channels, sizeof(*seg->part_index));
+    seg->output_offset = av_calloc(ctx->inputs[0]->channels, sizeof(*seg->output_offset));
+    if (!seg->part_index || !seg->output_offset)
+        return AVERROR(ENOMEM);
+
+    for (int ch = 0; ch < ctx->inputs[0]->channels && part_size >= 8; ch++) {
+        seg->rdft[ch]  = av_rdft_init(av_log2(2 * part_size), DFT_R2C);
+        seg->irdft[ch] = av_rdft_init(av_log2(2 * part_size), IDFT_C2R);
+        if (!seg->rdft[ch] || !seg->irdft[ch])
+            return AVERROR(ENOMEM);
+    }
+
+    seg->sum    = ff_get_audio_buffer(ctx->inputs[0], seg->fft_length);
+    seg->block  = ff_get_audio_buffer(ctx->inputs[0], seg->nb_partitions * seg->block_size);
+    seg->buffer = ff_get_audio_buffer(ctx->inputs[0], seg->part_size);
+    seg->coeff  = ff_get_audio_buffer(ctx->inputs[1 + s->selir], seg->nb_partitions * seg->coeff_size * 2);
+    seg->input  = ff_get_audio_buffer(ctx->inputs[0], seg->input_size);
+    seg->output = ff_get_audio_buffer(ctx->inputs[0], seg->part_size);
+    if (!seg->buffer || !seg->sum || !seg->block || !seg->coeff || !seg->input || !seg->output)
+        return AVERROR(ENOMEM);
+
+    return 0;
+}
+
+static void uninit_segment(AVFilterContext *ctx, AudioFIRSegment *seg)
+{
+    AudioFIRContext *s = ctx->priv;
+
+    if (seg->rdft) {
+        for (int ch = 0; ch < s->nb_channels; ch++) {
+            av_rdft_end(seg->rdft[ch]);
+        }
+    }
+    av_freep(&seg->rdft);
+
+    if (seg->irdft) {
+        for (int ch = 0; ch < s->nb_channels; ch++) {
+            av_rdft_end(seg->irdft[ch]);
+        }
+    }
+    av_freep(&seg->irdft);
+
+    av_freep(&seg->output_offset);
+    av_freep(&seg->part_index);
+
+    av_frame_free(&seg->block);
+    av_frame_free(&seg->sum);
+    av_frame_free(&seg->buffer);
+    av_frame_free(&seg->coeff);
+    av_frame_free(&seg->input);
+    av_frame_free(&seg->output);
+    seg->input_size = 0;
+}
+
 static int convert_coeffs(AVFilterContext *ctx)
 {
     AudioFIRContext *s = ctx->priv;
-    int ret, i, ch, n, N;
+    int ret, i, ch, n, cur_nb_taps;
     float power = 0;
 
-    s->nb_taps = ff_inlink_queued_samples(ctx->inputs[1]);
-    if (s->nb_taps <= 0)
-        return AVERROR(EINVAL);
+    if (!s->nb_taps) {
+        int part_size, max_part_size;
+        int left, offset = 0;
 
-    for (n = 4; (1 << n) < s->nb_taps; n++);
-    N = FFMIN(n, 16);
-    s->ir_length = 1 << n;
-    s->fft_length = (1 << (N + 1)) + 1;
-    s->part_size = 1 << (N - 1);
-    s->block_size = FFALIGN(s->fft_length, 32);
-    s->coeff_size = FFALIGN(s->part_size + 1, 32);
-    s->nb_partitions = (s->nb_taps + s->part_size - 1) / s->part_size;
-    s->nb_coeffs = s->ir_length + s->nb_partitions;
+        s->nb_taps = ff_inlink_queued_samples(ctx->inputs[1 + s->selir]);
+        if (s->nb_taps <= 0)
+            return AVERROR(EINVAL);
 
-    for (ch = 0; ch < ctx->inputs[0]->channels; ch++) {
-        s->sum[ch] = av_calloc(s->fft_length, sizeof(**s->sum));
-        if (!s->sum[ch])
-            return AVERROR(ENOMEM);
+        if (s->minp > s->maxp) {
+            s->maxp = s->minp;
+        }
+
+        left = s->nb_taps;
+        part_size = 1 << av_log2(s->minp);
+        max_part_size = 1 << av_log2(s->maxp);
+
+        s->min_part_size = part_size;
+
+        for (i = 0; left > 0; i++) {
+            int step = part_size == max_part_size ? INT_MAX : 1 + (i == 0);
+            int nb_partitions = FFMIN(step, (left + part_size - 1) / part_size);
+
+            s->nb_segments = i + 1;
+            ret = init_segment(ctx, &s->seg[i], offset, nb_partitions, part_size);
+            if (ret < 0)
+                return ret;
+            offset += nb_partitions * part_size;
+            left -= nb_partitions * part_size;
+            part_size *= 2;
+            part_size = FFMIN(part_size, max_part_size);
+        }
     }
 
-    for (ch = 0; ch < ctx->inputs[1]->channels; ch++) {
-        s->coeff[ch] = av_calloc(s->nb_partitions * s->coeff_size, sizeof(**s->coeff));
-        if (!s->coeff[ch])
-            return AVERROR(ENOMEM);
+    if (!s->ir[s->selir]) {
+        ret = ff_inlink_consume_samples(ctx->inputs[1 + s->selir], s->nb_taps, s->nb_taps, &s->ir[s->selir]);
+        if (ret < 0)
+            return ret;
+        if (ret == 0)
+            return AVERROR_BUG;
     }
 
-    for (ch = 0; ch < ctx->inputs[0]->channels; ch++) {
-        s->block[ch] = av_calloc(s->nb_partitions * s->block_size, sizeof(**s->block));
-        if (!s->block[ch])
-            return AVERROR(ENOMEM);
-    }
-
-    for (ch = 0; ch < ctx->inputs[0]->channels; ch++) {
-        s->rdft[ch]  = av_rdft_init(N, DFT_R2C);
-        s->irdft[ch] = av_rdft_init(N, IDFT_C2R);
-        if (!s->rdft[ch] || !s->irdft[ch])
-            return AVERROR(ENOMEM);
-    }
-
-    s->buffer = ff_get_audio_buffer(ctx->inputs[0], s->part_size * 3);
-    if (!s->buffer)
-        return AVERROR(ENOMEM);
-
-    ret = ff_inlink_consume_samples(ctx->inputs[1], s->nb_taps, s->nb_taps, &s->in[1]);
-    if (ret < 0)
-        return ret;
-    if (ret == 0)
-        return AVERROR_BUG;
-
     if (s->response)
         draw_response(ctx, s->video);
 
     s->gain = 1;
+    cur_nb_taps = s->ir[s->selir]->nb_samples;
 
     switch (s->gtype) {
     case -1:
-        /* nothinkg to do */
+        /* nothing to do */
         break;
     case 0:
-        for (ch = 0; ch < ctx->inputs[1]->channels; ch++) {
-            float *time = (float *)s->in[1]->extended_data[!s->one2many * ch];
+        for (ch = 0; ch < ctx->inputs[1 + s->selir]->channels; ch++) {
+            float *time = (float *)s->ir[s->selir]->extended_data[!s->one2many * ch];
 
-            for (i = 0; i < s->nb_taps; i++)
+            for (i = 0; i < cur_nb_taps; i++)
                 power += FFABS(time[i]);
         }
-        s->gain = ctx->inputs[1]->channels / power;
+        s->gain = ctx->inputs[1 + s->selir]->channels / power;
         break;
     case 1:
-        for (ch = 0; ch < ctx->inputs[1]->channels; ch++) {
-            float *time = (float *)s->in[1]->extended_data[!s->one2many * ch];
+        for (ch = 0; ch < ctx->inputs[1 + s->selir]->channels; ch++) {
+            float *time = (float *)s->ir[s->selir]->extended_data[!s->one2many * ch];
 
-            for (i = 0; i < s->nb_taps; i++)
+            for (i = 0; i < cur_nb_taps; i++)
                 power += time[i];
         }
-        s->gain = ctx->inputs[1]->channels / power;
+        s->gain = ctx->inputs[1 + s->selir]->channels / power;
         break;
     case 2:
-        for (ch = 0; ch < ctx->inputs[1]->channels; ch++) {
-            float *time = (float *)s->in[1]->extended_data[!s->one2many * ch];
+        for (ch = 0; ch < ctx->inputs[1 + s->selir]->channels; ch++) {
+            float *time = (float *)s->ir[s->selir]->extended_data[!s->one2many * ch];
 
-            for (i = 0; i < s->nb_taps; i++)
+            for (i = 0; i < cur_nb_taps; i++)
                 power += time[i] * time[i];
         }
         s->gain = sqrtf(ch / power);
@@ -372,50 +533,72 @@
 
     s->gain = FFMIN(s->gain * s->ir_gain, 1.f);
     av_log(ctx, AV_LOG_DEBUG, "power %f, gain %f\n", power, s->gain);
-    for (ch = 0; ch < ctx->inputs[1]->channels; ch++) {
-        float *time = (float *)s->in[1]->extended_data[!s->one2many * ch];
+    for (ch = 0; ch < ctx->inputs[1 + s->selir]->channels; ch++) {
+        float *time = (float *)s->ir[s->selir]->extended_data[!s->one2many * ch];
 
-        s->fdsp->vector_fmul_scalar(time, time, s->gain, FFALIGN(s->nb_taps, 4));
+        s->fdsp->vector_fmul_scalar(time, time, s->gain, FFALIGN(cur_nb_taps, 4));
     }
 
-    for (ch = 0; ch < ctx->inputs[1]->channels; ch++) {
-        float *time = (float *)s->in[1]->extended_data[!s->one2many * ch];
-        float *block = s->block[ch];
-        FFTComplex *coeff = s->coeff[ch];
+    av_log(ctx, AV_LOG_DEBUG, "nb_taps: %d\n", cur_nb_taps);
+    av_log(ctx, AV_LOG_DEBUG, "nb_segments: %d\n", s->nb_segments);
+
+    for (ch = 0; ch < ctx->inputs[1 + s->selir]->channels; ch++) {
+        float *time = (float *)s->ir[s->selir]->extended_data[!s->one2many * ch];
+        int toffset = 0;
 
         for (i = FFMAX(1, s->length * s->nb_taps); i < s->nb_taps; i++)
             time[i] = 0;
 
-        for (i = 0; i < s->nb_partitions; i++) {
-            const float scale = 1.f / s->part_size;
-            const int toffset = i * s->part_size;
-            const int coffset = i * s->coeff_size;
-            const int boffset = s->part_size;
-            const int remaining = s->nb_taps - (i * s->part_size);
-            const int size = remaining >= s->part_size ? s->part_size : remaining;
+        av_log(ctx, AV_LOG_DEBUG, "channel: %d\n", ch);
 
-            memset(block, 0, sizeof(*block) * s->fft_length);
-            memcpy(block + boffset, time + toffset, size * sizeof(*block));
+        for (int segment = 0; segment < s->nb_segments; segment++) {
+            AudioFIRSegment *seg = &s->seg[segment];
+            float *block = (float *)seg->block->extended_data[ch];
+            FFTComplex *coeff = (FFTComplex *)seg->coeff->extended_data[ch];
 
-            av_rdft_calc(s->rdft[0], block);
+            av_log(ctx, AV_LOG_DEBUG, "segment: %d\n", segment);
 
-            coeff[coffset].re = block[0] * scale;
-            coeff[coffset].im = 0;
-            for (n = 1; n < s->part_size; n++) {
-                coeff[coffset + n].re = block[2 * n] * scale;
-                coeff[coffset + n].im = block[2 * n + 1] * scale;
+            for (i = 0; i < seg->nb_partitions; i++) {
+                const float scale = 1.f / seg->part_size;
+                const int coffset = i * seg->coeff_size;
+                const int remaining = s->nb_taps - toffset;
+                const int size = remaining >= seg->part_size ? seg->part_size : remaining;
+
+                if (size < 8) {
+                    for (n = 0; n < size; n++)
+                        coeff[coffset + n].re = time[toffset + n];
+
+                    toffset += size;
+                    continue;
+                }
+
+                memset(block, 0, sizeof(*block) * seg->fft_length);
+                memcpy(block, time + toffset, size * sizeof(*block));
+
+                av_rdft_calc(seg->rdft[0], block);
+
+                coeff[coffset].re = block[0] * scale;
+                coeff[coffset].im = 0;
+                for (n = 1; n < seg->part_size; n++) {
+                    coeff[coffset + n].re = block[2 * n] * scale;
+                    coeff[coffset + n].im = block[2 * n + 1] * scale;
+                }
+                coeff[coffset + seg->part_size].re = block[1] * scale;
+                coeff[coffset + seg->part_size].im = 0;
+
+                toffset += size;
             }
-            coeff[coffset + s->part_size].re = block[1] * scale;
-            coeff[coffset + s->part_size].im = 0;
+
+            av_log(ctx, AV_LOG_DEBUG, "nb_partitions: %d\n", seg->nb_partitions);
+            av_log(ctx, AV_LOG_DEBUG, "partition size: %d\n", seg->part_size);
+            av_log(ctx, AV_LOG_DEBUG, "block size: %d\n", seg->block_size);
+            av_log(ctx, AV_LOG_DEBUG, "fft_length: %d\n", seg->fft_length);
+            av_log(ctx, AV_LOG_DEBUG, "coeff_size: %d\n", seg->coeff_size);
+            av_log(ctx, AV_LOG_DEBUG, "input_size: %d\n", seg->input_size);
+            av_log(ctx, AV_LOG_DEBUG, "input_offset: %d\n", seg->input_offset);
         }
     }
 
-    av_frame_free(&s->in[1]);
-    av_log(ctx, AV_LOG_DEBUG, "nb_taps: %d\n", s->nb_taps);
-    av_log(ctx, AV_LOG_DEBUG, "nb_partitions: %d\n", s->nb_partitions);
-    av_log(ctx, AV_LOG_DEBUG, "partition size: %d\n", s->part_size);
-    av_log(ctx, AV_LOG_DEBUG, "ir_length: %d\n", s->ir_length);
-
     s->have_coeffs = 1;
 
     return 0;
@@ -441,64 +624,66 @@
 {
     AudioFIRContext *s = ctx->priv;
     AVFilterLink *outlink = ctx->outputs[0];
+    int ret, status, available, wanted;
     AVFrame *in = NULL;
-    int ret, status;
     int64_t pts;
 
     FF_FILTER_FORWARD_STATUS_BACK_ALL(ctx->outputs[0], ctx);
     if (s->response)
         FF_FILTER_FORWARD_STATUS_BACK_ALL(ctx->outputs[1], ctx);
-    if (!s->eof_coeffs) {
+    if (!s->eof_coeffs[s->selir]) {
         AVFrame *ir = NULL;
 
-        ret = check_ir(ctx->inputs[1], ir);
+        ret = check_ir(ctx->inputs[1 + s->selir], ir);
         if (ret < 0)
             return ret;
 
-        if (ff_outlink_get_status(ctx->inputs[1]) == AVERROR_EOF)
-            s->eof_coeffs = 1;
+        if (ff_outlink_get_status(ctx->inputs[1 + s->selir]) == AVERROR_EOF)
+            s->eof_coeffs[s->selir] = 1;
 
-        if (!s->eof_coeffs) {
+        if (!s->eof_coeffs[s->selir]) {
             if (ff_outlink_frame_wanted(ctx->outputs[0]))
-                ff_inlink_request_frame(ctx->inputs[1]);
+                ff_inlink_request_frame(ctx->inputs[1 + s->selir]);
+            else if (s->response && ff_outlink_frame_wanted(ctx->outputs[1]))
+                ff_inlink_request_frame(ctx->inputs[1 + s->selir]);
             return 0;
         }
     }
 
-    if (!s->have_coeffs && s->eof_coeffs) {
+    if (!s->have_coeffs && s->eof_coeffs[s->selir]) {
         ret = convert_coeffs(ctx);
         if (ret < 0)
             return ret;
     }
 
-    if (s->need_padding) {
-        in = ff_get_audio_buffer(outlink, s->part_size);
-        if (!in)
-            return AVERROR(ENOMEM);
-        s->need_padding = 0;
-        ret = 1;
-    } else {
-        ret = ff_inlink_consume_samples(ctx->inputs[0], s->part_size, s->part_size, &in);
-    }
-
-    if (ret > 0) {
+    available = ff_inlink_queued_samples(ctx->inputs[0]);
+    wanted = FFMAX(s->min_part_size, (available / s->min_part_size) * s->min_part_size);
+    ret = ff_inlink_consume_samples(ctx->inputs[0], wanted, wanted, &in);
+    if (ret > 0)
         ret = fir_frame(s, in, outlink);
-        if (ret < 0)
-            return ret;
-    }
 
     if (ret < 0)
         return ret;
 
     if (s->response && s->have_coeffs) {
-        if (ff_outlink_frame_wanted(ctx->outputs[1])) {
-            s->video->pts = s->pts;
-            ret = ff_filter_frame(ctx->outputs[1], av_frame_clone(s->video));
-            if (ret < 0)
-                return ret;
+        int64_t old_pts = s->video->pts;
+        int64_t new_pts = av_rescale_q(s->pts, ctx->inputs[0]->time_base, ctx->outputs[1]->time_base);
+
+        if (ff_outlink_frame_wanted(ctx->outputs[1]) && old_pts < new_pts) {
+            AVFrame *clone;
+            s->video->pts = new_pts;
+            clone = av_frame_clone(s->video);
+            if (!clone)
+                return AVERROR(ENOMEM);
+            return ff_filter_frame(ctx->outputs[1], clone);
         }
     }
 
+    if (ff_inlink_queued_samples(ctx->inputs[0]) >= s->min_part_size) {
+        ff_filter_set_ready(ctx, 10);
+        return 0;
+    }
+
     if (ff_inlink_acknowledge_status(ctx->inputs[0], &status, &pts)) {
         if (status == AVERROR_EOF) {
             ff_outlink_set_status(ctx->outputs[0], status, pts);
@@ -508,17 +693,20 @@
         }
     }
 
-    if (ff_outlink_frame_wanted(ctx->outputs[0])) {
+    if (ff_outlink_frame_wanted(ctx->outputs[0]) &&
+        !ff_outlink_get_status(ctx->inputs[0])) {
         ff_inlink_request_frame(ctx->inputs[0]);
         return 0;
     }
 
-    if (s->response && ff_outlink_frame_wanted(ctx->outputs[1])) {
+    if (s->response &&
+        ff_outlink_frame_wanted(ctx->outputs[1]) &&
+        !ff_outlink_get_status(ctx->inputs[0])) {
         ff_inlink_request_frame(ctx->inputs[0]);
         return 0;
     }
 
-    return 0;
+    return FFERROR_NOT_READY;
 }
 
 static int query_formats(AVFilterContext *ctx)
@@ -562,8 +750,10 @@
             return ret;
         if ((ret = ff_channel_layouts_ref(layouts, &ctx->outputs[0]->in_channel_layouts)) < 0)
             return ret;
-        if ((ret = ff_channel_layouts_ref(mono, &ctx->inputs[1]->out_channel_layouts)) < 0)
-            return ret;
+        for (int i = 1; i < ctx->nb_inputs; i++) {
+            if ((ret = ff_channel_layouts_ref(mono, &ctx->inputs[i]->out_channel_layouts)) < 0)
+                return ret;
+        }
     }
 
     formats = ff_make_format_list(sample_fmts);
@@ -579,24 +769,14 @@
     AVFilterContext *ctx = outlink->src;
     AudioFIRContext *s = ctx->priv;
 
-    s->one2many = ctx->inputs[1]->channels == 1;
+    s->one2many = ctx->inputs[1 + s->selir]->channels == 1;
     outlink->sample_rate = ctx->inputs[0]->sample_rate;
     outlink->time_base   = ctx->inputs[0]->time_base;
     outlink->channel_layout = ctx->inputs[0]->channel_layout;
     outlink->channels = ctx->inputs[0]->channels;
 
-    s->sum = av_calloc(outlink->channels, sizeof(*s->sum));
-    s->coeff = av_calloc(ctx->inputs[1]->channels, sizeof(*s->coeff));
-    s->block = av_calloc(ctx->inputs[0]->channels, sizeof(*s->block));
-    s->rdft = av_calloc(outlink->channels, sizeof(*s->rdft));
-    s->irdft = av_calloc(outlink->channels, sizeof(*s->irdft));
-    if (!s->sum || !s->coeff || !s->block || !s->rdft || !s->irdft)
-        return AVERROR(ENOMEM);
-
     s->nb_channels = outlink->channels;
-    s->nb_coef_channels = ctx->inputs[1]->channels;
-    s->want_skip = 1;
-    s->need_padding = 1;
+    s->nb_coef_channels = ctx->inputs[1 + s->selir]->channels;
     s->pts = AV_NOPTS_VALUE;
 
     return 0;
@@ -605,48 +785,20 @@
 static av_cold void uninit(AVFilterContext *ctx)
 {
     AudioFIRContext *s = ctx->priv;
-    int ch;
 
-    if (s->sum) {
-        for (ch = 0; ch < s->nb_channels; ch++) {
-            av_freep(&s->sum[ch]);
-        }
+    for (int i = 0; i < s->nb_segments; i++) {
+        uninit_segment(ctx, &s->seg[i]);
     }
-    av_freep(&s->sum);
-
-    if (s->coeff) {
-        for (ch = 0; ch < s->nb_coef_channels; ch++) {
-            av_freep(&s->coeff[ch]);
-        }
-    }
-    av_freep(&s->coeff);
-
-    if (s->block) {
-        for (ch = 0; ch < s->nb_channels; ch++) {
-            av_freep(&s->block[ch]);
-        }
-    }
-    av_freep(&s->block);
-
-    if (s->rdft) {
-        for (ch = 0; ch < s->nb_channels; ch++) {
-            av_rdft_end(s->rdft[ch]);
-        }
-    }
-    av_freep(&s->rdft);
-
-    if (s->irdft) {
-        for (ch = 0; ch < s->nb_channels; ch++) {
-            av_rdft_end(s->irdft[ch]);
-        }
-    }
-    av_freep(&s->irdft);
-
-    av_frame_free(&s->in[1]);
-    av_frame_free(&s->buffer);
 
     av_freep(&s->fdsp);
 
+    for (int i = 0; i < s->nb_irs; i++) {
+        av_frame_free(&s->ir[i]);
+    }
+
+    for (int i = 0; i < ctx->nb_inputs; i++)
+        av_freep(&ctx->input_pads[i].name);
+
     for (int i = 0; i < ctx->nb_outputs; i++)
         av_freep(&ctx->output_pads[i].name);
     av_frame_free(&s->video);
@@ -660,6 +812,8 @@
     outlink->sample_aspect_ratio = (AVRational){1,1};
     outlink->w = s->w;
     outlink->h = s->h;
+    outlink->frame_rate = s->frame_rate;
+    outlink->time_base = av_inv_q(outlink->frame_rate);
 
     av_frame_free(&s->video);
     s->video = ff_get_video_buffer(outlink, outlink->w, outlink->h);
@@ -669,13 +823,51 @@
     return 0;
 }
 
+void ff_afir_init(AudioFIRDSPContext *dsp)
+{
+    dsp->fcmul_add = fcmul_add_c;
+
+    if (ARCH_X86)
+        ff_afir_init_x86(dsp);
+}
+
 static av_cold int init(AVFilterContext *ctx)
 {
     AudioFIRContext *s = ctx->priv;
     AVFilterPad pad, vpad;
     int ret;
 
-    pad = (AVFilterPad){
+    pad = (AVFilterPad) {
+        .name = av_strdup("main"),
+        .type = AVMEDIA_TYPE_AUDIO,
+    };
+
+    if (!pad.name)
+        return AVERROR(ENOMEM);
+
+    ret = ff_insert_inpad(ctx, 0, &pad);
+    if (ret < 0) {
+        av_freep(&pad.name);
+        return ret;
+    }
+
+    for (int n = 0; n < s->nb_irs; n++) {
+        pad = (AVFilterPad) {
+            .name = av_asprintf("ir%d", n),
+            .type = AVMEDIA_TYPE_AUDIO,
+        };
+
+        if (!pad.name)
+            return AVERROR(ENOMEM);
+
+        ret = ff_insert_inpad(ctx, n + 1, &pad);
+        if (ret < 0) {
+            av_freep(&pad.name);
+            return ret;
+        }
+    }
+
+    pad = (AVFilterPad) {
         .name          = av_strdup("default"),
         .type          = AVMEDIA_TYPE_AUDIO,
         .config_props  = config_output,
@@ -708,30 +900,40 @@
         }
     }
 
-    s->fcmul_add = fcmul_add_c;
-
     s->fdsp = avpriv_float_dsp_alloc(0);
     if (!s->fdsp)
         return AVERROR(ENOMEM);
 
-    if (ARCH_X86)
-        ff_afir_init_x86(s);
+    ff_afir_init(&s->afirdsp);
 
     return 0;
 }
 
-static const AVFilterPad afir_inputs[] = {
-    {
-        .name           = "main",
-        .type           = AVMEDIA_TYPE_AUDIO,
-    },{
-        .name           = "ir",
-        .type           = AVMEDIA_TYPE_AUDIO,
-    },
-    { NULL }
-};
+static int process_command(AVFilterContext *ctx,
+                           const char *cmd,
+                           const char *arg,
+                           char *res,
+                           int res_len,
+                           int flags)
+{
+    AudioFIRContext *s = ctx->priv;
+    int prev_ir = s->selir;
+    int ret = ff_filter_process_command(ctx, cmd, arg, res, res_len, flags);
+
+    if (ret < 0)
+        return ret;
+
+    s->selir = FFMIN(s->nb_irs - 1, s->selir);
+
+    if (prev_ir != s->selir) {
+        s->have_coeffs = 0;
+    }
+
+    return 0;
+}
 
 #define AF AV_OPT_FLAG_AUDIO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
+#define AFR AV_OPT_FLAG_AUDIO_PARAM|AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_RUNTIME_PARAM
 #define VF AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
 #define OFFSET(x) offsetof(AudioFIRContext, x)
 
@@ -752,6 +954,11 @@
     { "response", "show IR frequency response", OFFSET(response), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, VF },
     { "channel", "set IR channel to display frequency response", OFFSET(ir_channel), AV_OPT_TYPE_INT, {.i64=0}, 0, 1024, VF },
     { "size",   "set video size",    OFFSET(w),          AV_OPT_TYPE_IMAGE_SIZE, {.str = "hd720"}, 0, 0, VF },
+    { "rate",   "set video rate",    OFFSET(frame_rate), AV_OPT_TYPE_VIDEO_RATE, {.str = "25"}, 0, INT32_MAX, VF },
+    { "minp",   "set min partition size", OFFSET(minp),  AV_OPT_TYPE_INT,   {.i64=8192}, 1, 32768, AF },
+    { "maxp",   "set max partition size", OFFSET(maxp),  AV_OPT_TYPE_INT,   {.i64=8192}, 8, 32768, AF },
+    { "nbirs",  "set number of input IRs",OFFSET(nb_irs),AV_OPT_TYPE_INT,   {.i64=1},    1,    32, AF },
+    { "ir",     "select IR",              OFFSET(selir), AV_OPT_TYPE_INT,   {.i64=0},    0,    31, AFR },
     { NULL }
 };
 
@@ -759,14 +966,15 @@
 
 AVFilter ff_af_afir = {
     .name          = "afir",
-    .description   = NULL_IF_CONFIG_SMALL("Apply Finite Impulse Response filter with supplied coefficients in 2nd stream."),
+    .description   = NULL_IF_CONFIG_SMALL("Apply Finite Impulse Response filter with supplied coefficients in additional stream(s)."),
     .priv_size     = sizeof(AudioFIRContext),
     .priv_class    = &afir_class,
     .query_formats = query_formats,
     .init          = init,
     .activate      = activate,
     .uninit        = uninit,
-    .inputs        = afir_inputs,
-    .flags         = AVFILTER_FLAG_DYNAMIC_OUTPUTS |
+    .process_command = process_command,
+    .flags         = AVFILTER_FLAG_DYNAMIC_INPUTS  |
+                     AVFILTER_FLAG_DYNAMIC_OUTPUTS |
                      AVFILTER_FLAG_SLICE_THREADS,
 };
diff --git a/libavfilter/af_afir.h b/libavfilter/af_afir.h
index 7d4f32e..4f44675 100644
--- a/libavfilter/af_afir.h
+++ b/libavfilter/af_afir.h
@@ -21,7 +21,6 @@
 #ifndef AVFILTER_AFIR_H
 #define AVFILTER_AFIR_H
 
-#include "libavutil/audio_fifo.h"
 #include "libavutil/common.h"
 #include "libavutil/float_dsp.h"
 #include "libavutil/opt.h"
@@ -32,6 +31,33 @@
 #include "formats.h"
 #include "internal.h"
 
+typedef struct AudioFIRSegment {
+    int nb_partitions;
+    int part_size;
+    int block_size;
+    int fft_length;
+    int coeff_size;
+    int input_size;
+    int input_offset;
+
+    int *output_offset;
+    int *part_index;
+
+    AVFrame *sum;
+    AVFrame *block;
+    AVFrame *buffer;
+    AVFrame *coeff;
+    AVFrame *input;
+    AVFrame *output;
+
+    RDFTContext **rdft, **irdft;
+} AudioFIRSegment;
+
+typedef struct AudioFIRDSPContext {
+    void (*fcmul_add)(float *sum, const float *t, const float *c,
+                      ptrdiff_t len);
+} AudioFIRDSPContext;
+
 typedef struct AudioFIRContext {
     const AVClass *class;
 
@@ -44,45 +70,37 @@
     float max_ir_len;
     int response;
     int w, h;
+    AVRational frame_rate;
     int ir_channel;
+    int minp;
+    int maxp;
+    int nb_irs;
+    int selir;
 
     float gain;
 
-    int eof_coeffs;
+    int eof_coeffs[32];
     int have_coeffs;
-    int nb_coeffs;
     int nb_taps;
-    int part_size;
-    int part_index;
-    int coeff_size;
-    int block_size;
-    int nb_partitions;
     int nb_channels;
-    int ir_length;
-    int fft_length;
     int nb_coef_channels;
     int one2many;
-    int nb_samples;
-    int want_skip;
-    int need_padding;
 
-    RDFTContext **rdft, **irdft;
-    float **sum;
-    float **block;
-    FFTComplex **coeff;
+    AudioFIRSegment seg[1024];
+    int nb_segments;
 
-    AVAudioFifo *fifo;
-    AVFrame *in[2];
-    AVFrame *buffer;
+    AVFrame *in;
+    AVFrame *ir[32];
     AVFrame *video;
+    int min_part_size;
     int64_t pts;
-    int index;
 
+    AudioFIRDSPContext afirdsp;
     AVFloatDSPContext *fdsp;
-    void (*fcmul_add)(float *sum, const float *t, const float *c,
-                      ptrdiff_t len);
+
 } AudioFIRContext;
 
-void ff_afir_init_x86(AudioFIRContext *s);
+void ff_afir_init(AudioFIRDSPContext *s);
+void ff_afir_init_x86(AudioFIRDSPContext *s);
 
 #endif /* AVFILTER_AFIR_H */
diff --git a/libavfilter/af_aformat.c b/libavfilter/af_aformat.c
index e431495..1a70277 100644
--- a/libavfilter/af_aformat.c
+++ b/libavfilter/af_aformat.c
@@ -50,8 +50,11 @@
 #define F AV_OPT_FLAG_FILTERING_PARAM
 static const AVOption aformat_options[] = {
     { "sample_fmts",     "A '|'-separated list of sample formats.",  OFFSET(formats_str),         AV_OPT_TYPE_STRING, .flags = A|F },
+    { "f",               "A '|'-separated list of sample formats.",  OFFSET(formats_str),         AV_OPT_TYPE_STRING, .flags = A|F },
     { "sample_rates",    "A '|'-separated list of sample rates.",    OFFSET(sample_rates_str),    AV_OPT_TYPE_STRING, .flags = A|F },
+    { "r",               "A '|'-separated list of sample rates.",    OFFSET(sample_rates_str),    AV_OPT_TYPE_STRING, .flags = A|F },
     { "channel_layouts", "A '|'-separated list of channel layouts.", OFFSET(channel_layouts_str), AV_OPT_TYPE_STRING, .flags = A|F },
+    { "cl",              "A '|'-separated list of channel layouts.", OFFSET(channel_layouts_str), AV_OPT_TYPE_STRING, .flags = A|F },
     { NULL }
 };
 
diff --git a/libavfilter/af_agate.c b/libavfilter/af_agate.c
index ba96863..936caa0 100644
--- a/libavfilter/af_agate.c
+++ b/libavfilter/af_agate.c
@@ -47,11 +47,13 @@
     double range;
     int link;
     int detection;
+    int mode;
 
     double thres;
     double knee_start;
-    double lin_knee_stop;
     double knee_stop;
+    double lin_knee_start;
+    double lin_knee_stop;
     double lin_slope;
     double attack_coeff;
     double release_coeff;
@@ -65,6 +67,9 @@
 
 static const AVOption options[] = {
     { "level_in",  "set input level",        OFFSET(level_in),  AV_OPT_TYPE_DOUBLE, {.dbl=1},           0.015625,   64, A },
+    { "mode",      "set mode",               OFFSET(mode),      AV_OPT_TYPE_INT,    {.i64=0},           0, 1, A, "mode" },
+    {   "downward",0,                        0,                 AV_OPT_TYPE_CONST,  {.i64=0},           0, 0, A, "mode" },
+    {   "upward",  0,                        0,                 AV_OPT_TYPE_CONST,  {.i64=1},           0, 0, A, "mode" },
     { "range",     "set max gain reduction", OFFSET(range),     AV_OPT_TYPE_DOUBLE, {.dbl=0.06125},     0, 1, A },
     { "threshold", "set threshold",          OFFSET(threshold), AV_OPT_TYPE_DOUBLE, {.dbl=0.125},       0, 1, A },
     { "ratio",     "set ratio",              OFFSET(ratio),     AV_OPT_TYPE_DOUBLE, {.dbl=2},           1,  9000, A },
@@ -88,7 +93,6 @@
     AudioGateContext *s = ctx->priv;
     double lin_threshold = s->threshold;
     double lin_knee_sqrt = sqrt(s->knee);
-    double lin_knee_start;
 
     if (s->detection)
         lin_threshold *= lin_threshold;
@@ -96,9 +100,9 @@
     s->attack_coeff  = FFMIN(1., 1. / (s->attack * inlink->sample_rate / 4000.));
     s->release_coeff = FFMIN(1., 1. / (s->release * inlink->sample_rate / 4000.));
     s->lin_knee_stop = lin_threshold * lin_knee_sqrt;
-    lin_knee_start = lin_threshold / lin_knee_sqrt;
+    s->lin_knee_start = lin_threshold / lin_knee_sqrt;
     s->thres = log(lin_threshold);
-    s->knee_start = log(lin_knee_start);
+    s->knee_start = log(s->lin_knee_start);
     s->knee_stop = log(s->lin_knee_stop);
 
     return 0;
@@ -112,26 +116,26 @@
 
 static double output_gain(double lin_slope, double ratio, double thres,
                           double knee, double knee_start, double knee_stop,
-                          double lin_knee_stop, double range)
+                          double range, int mode)
 {
-    if (lin_slope < lin_knee_stop) {
-        double slope = log(lin_slope);
-        double tratio = ratio;
-        double gain = 0.;
-        double delta = 0.;
+    double slope = log(lin_slope);
+    double tratio = ratio;
+    double gain = 0.;
+    double delta = 0.;
 
-        if (IS_FAKE_INFINITY(ratio))
-            tratio = 1000.;
-        gain = (slope - thres) * tratio + thres;
-        delta = tratio;
+    if (IS_FAKE_INFINITY(ratio))
+        tratio = 1000.;
+    gain = (slope - thres) * tratio + thres;
+    delta = tratio;
 
-        if (knee > 1. && slope > knee_start) {
+    if (mode) {
+        if (knee > 1. && slope < knee_stop)
+            gain = hermite_interpolation(slope, knee_stop, knee_start, ((knee_stop - thres) * tratio  + thres), knee_start, delta, 1.);
+    } else {
+        if (knee > 1. && slope > knee_start)
             gain = hermite_interpolation(slope, knee_start, knee_stop, ((knee_start - thres) * tratio  + thres), knee_stop, delta, 1.);
-        }
-        return FFMAX(range, exp(gain - slope));
     }
-
-    return 1.;
+    return FFMAX(range, exp(gain - slope));
 }
 
 static void gate(AudioGateContext *s,
@@ -146,6 +150,7 @@
 
     for (n = 0; n < nb_samples; n++, src += inlink->channels, dst += inlink->channels, scsrc += sclink->channels) {
         double abs_sample = fabs(scsrc[0] * level_sc), gain = 1.0;
+        int detected;
 
         if (s->link == 1) {
             for (c = 1; c < sclink->channels; c++)
@@ -161,10 +166,16 @@
             abs_sample *= abs_sample;
 
         s->lin_slope += (abs_sample - s->lin_slope) * (abs_sample > s->lin_slope ? attack_coeff : release_coeff);
-        if (s->lin_slope > 0.0)
+
+        if (s->mode)
+            detected = s->lin_slope > s->lin_knee_start;
+        else
+            detected = s->lin_slope < s->lin_knee_stop;
+
+        if (s->lin_slope > 0.0 && detected)
             gain = output_gain(s->lin_slope, s->ratio, s->thres,
                                s->knee, s->knee_start, s->knee_stop,
-                               s->lin_knee_stop, s->range);
+                               s->range, s->mode);
 
         for (c = 0; c < inlink->channels; c++)
             dst[c] = src[c] * level_in * gain * makeup;
@@ -307,7 +318,7 @@
 
         dst = (double *)out->data[0];
         out->pts = s->pts;
-        s->pts += nb_samples;
+        s->pts += av_rescale_q(nb_samples, (AVRational){1, ctx->outputs[0]->sample_rate}, ctx->outputs[0]->time_base);
 
         gate(s, (double *)in[0]->data[0], dst,
              (double *)in[1]->data[0], nb_samples,
diff --git a/libavfilter/af_aiir.c b/libavfilter/af_aiir.c
index 845d542..89c8936 100644
--- a/libavfilter/af_aiir.c
+++ b/libavfilter/af_aiir.c
@@ -38,8 +38,8 @@
 } Pair;
 
 typedef struct BiquadContext {
-    double a0, a1, a2;
-    double b0, b1, b2;
+    double a[3];
+    double b[3];
     double i1, i2;
     double o1, o2;
 } BiquadContext;
@@ -57,12 +57,14 @@
     const AVClass *class;
     char *a_str, *b_str, *g_str;
     double dry_gain, wet_gain;
+    double mix;
     int format;
     int process;
     int precision;
     int response;
     int w, h;
     int ir_channel;
+    AVRational rate;
 
     AVFrame *video;
 
@@ -123,6 +125,7 @@
     AudioIIRContext *s = ctx->priv;                                     \
     const double ig = s->dry_gain;                                      \
     const double og = s->wet_gain;                                      \
+    const double mix = s->mix;                                          \
     ThreadData *td = arg;                                               \
     AVFrame *in = td->in, *out = td->out;                               \
     const type *src = (const type *)in->extended_data[ch];              \
@@ -132,6 +135,7 @@
     const int nb_b = s->iir[ch].nb_ab[1];                               \
     const double *a = s->iir[ch].ab[0];                                 \
     const double *b = s->iir[ch].ab[1];                                 \
+    const double g = s->iir[ch].g;                                      \
     int *clippings = &s->iir[ch].clippings;                             \
     type *dst = (type *)out->extended_data[ch];                         \
     int n;                                                              \
@@ -150,7 +154,8 @@
             sample -= a[x] * oc[x];                                     \
                                                                         \
         oc[0] = sample;                                                 \
-        sample *= og;                                                   \
+        sample *= og * g;                                               \
+        sample = sample * mix + ic[0] * (1. - mix);                     \
         if (need_clipping && sample < min) {                            \
             (*clippings)++;                                             \
             dst[n] = min;                                               \
@@ -176,21 +181,23 @@
     AudioIIRContext *s = ctx->priv;                                     \
     const double ig = s->dry_gain;                                      \
     const double og = s->wet_gain;                                      \
+    const double mix = s->mix;                                          \
     ThreadData *td = arg;                                               \
     AVFrame *in = td->in, *out = td->out;                               \
     const type *src = (const type *)in->extended_data[ch];              \
     type *dst = (type *)out->extended_data[ch];                         \
     IIRChannel *iir = &s->iir[ch];                                      \
+    const double g = iir->g;                                            \
     int *clippings = &iir->clippings;                                   \
     int nb_biquads = (FFMAX(iir->nb_ab[0], iir->nb_ab[1]) + 1) / 2;     \
     int n, i;                                                           \
                                                                         \
     for (i = 0; i < nb_biquads; i++) {                                  \
-        const double a1 = -iir->biquads[i].a1;                          \
-        const double a2 = -iir->biquads[i].a2;                          \
-        const double b0 = iir->biquads[i].b0;                           \
-        const double b1 = iir->biquads[i].b1;                           \
-        const double b2 = iir->biquads[i].b2;                           \
+        const double a1 = -iir->biquads[i].a[1];                        \
+        const double a2 = -iir->biquads[i].a[2];                        \
+        const double b0 = iir->biquads[i].b[0];                         \
+        const double b1 = iir->biquads[i].b[1];                         \
+        const double b2 = iir->biquads[i].b[2];                         \
         double i1 = iir->biquads[i].i1;                                 \
         double i2 = iir->biquads[i].i2;                                 \
         double o1 = iir->biquads[i].o1;                                 \
@@ -204,8 +211,9 @@
             i1 = src[n];                                                \
             o2 = o1;                                                    \
             o1 = o0;                                                    \
-            o0 *= og;                                                   \
+            o0 *= og * g;                                               \
                                                                         \
+            o0 = o0 * mix + (1. - mix) * sample;                        \
             if (need_clipping && o0 < min) {                            \
                 (*clippings)++;                                         \
                 dst[n] = min;                                           \
@@ -491,6 +499,7 @@
             double a[6] = { 0 };
             double min_distance = DBL_MAX;
             double max_mag = 0;
+            double factor;
             int i;
 
             for (i = 0; i < iir->nb_ab[0]; i++) {
@@ -506,7 +515,7 @@
                 }
             }
 
-            for (i = 0; i < iir->nb_ab[1]; i++) {
+            for (i = 0; i < iir->nb_ab[0]; i++) {
                 if (isnan(iir->ab[0][2 * i]) || isnan(iir->ab[0][2 * i + 1]))
                     continue;
 
@@ -585,20 +594,41 @@
             iir->ab[1][2 * nearest_zero.a] = iir->ab[1][2 * nearest_zero.a + 1] = NAN;
             iir->ab[1][2 * nearest_zero.b] = iir->ab[1][2 * nearest_zero.b + 1] = NAN;
 
-            iir->biquads[current_biquad].a0 = 1.0;
-            iir->biquads[current_biquad].a1 = a[2] / a[4];
-            iir->biquads[current_biquad].a2 = a[0] / a[4];
-            iir->biquads[current_biquad].b0 = b[4] / a[4] * (current_biquad ? 1.0 : iir->g);
-            iir->biquads[current_biquad].b1 = b[2] / a[4] * (current_biquad ? 1.0 : iir->g);
-            iir->biquads[current_biquad].b2 = b[0] / a[4] * (current_biquad ? 1.0 : iir->g);
+            iir->biquads[current_biquad].a[0] = 1.;
+            iir->biquads[current_biquad].a[1] = a[2] / a[4];
+            iir->biquads[current_biquad].a[2] = a[0] / a[4];
+            iir->biquads[current_biquad].b[0] = b[4] / a[4];
+            iir->biquads[current_biquad].b[1] = b[2] / a[4];
+            iir->biquads[current_biquad].b[2] = b[0] / a[4];
+
+            if (fabs(iir->biquads[current_biquad].b[0] +
+                     iir->biquads[current_biquad].b[1] +
+                     iir->biquads[current_biquad].b[2]) > 1e-6) {
+                factor = (iir->biquads[current_biquad].a[0] +
+                          iir->biquads[current_biquad].a[1] +
+                          iir->biquads[current_biquad].a[2]) /
+                         (iir->biquads[current_biquad].b[0] +
+                          iir->biquads[current_biquad].b[1] +
+                          iir->biquads[current_biquad].b[2]);
+
+                av_log(ctx, AV_LOG_VERBOSE, "factor=%f\n", factor);
+
+                iir->biquads[current_biquad].b[0] *= factor;
+                iir->biquads[current_biquad].b[1] *= factor;
+                iir->biquads[current_biquad].b[2] *= factor;
+            }
+
+            iir->biquads[current_biquad].b[0] *= (current_biquad ? 1.0 : iir->g);
+            iir->biquads[current_biquad].b[1] *= (current_biquad ? 1.0 : iir->g);
+            iir->biquads[current_biquad].b[2] *= (current_biquad ? 1.0 : iir->g);
 
             av_log(ctx, AV_LOG_VERBOSE, "a=%f %f %f:b=%f %f %f\n",
-                   iir->biquads[current_biquad].a0,
-                   iir->biquads[current_biquad].a1,
-                   iir->biquads[current_biquad].a2,
-                   iir->biquads[current_biquad].b0,
-                   iir->biquads[current_biquad].b1,
-                   iir->biquads[current_biquad].b2);
+                   iir->biquads[current_biquad].a[0],
+                   iir->biquads[current_biquad].a[1],
+                   iir->biquads[current_biquad].a[2],
+                   iir->biquads[current_biquad].b[0],
+                   iir->biquads[current_biquad].b[1],
+                   iir->biquads[current_biquad].b[2]);
 
             current_biquad++;
         }
@@ -661,6 +691,25 @@
     }
 }
 
+static void check_stability(AVFilterContext *ctx, int channels)
+{
+    AudioIIRContext *s = ctx->priv;
+    int ch;
+
+    for (ch = 0; ch < channels; ch++) {
+        IIRChannel *iir = &s->iir[ch];
+
+        for (int n = 0; n < iir->nb_ab[0]; n++) {
+            double pr = hypot(iir->ab[0][2*n], iir->ab[0][2*n+1]);
+
+            if (pr >= 1.) {
+                av_log(ctx, AV_LOG_WARNING, "pole %d at channel %d is unstable\n", n, ch);
+                break;
+            }
+        }
+    }
+}
+
 static void drawtext(AVFrame *pic, int x, int y, const char *txt, uint32_t color)
 {
     const uint8_t *font;
@@ -710,76 +759,93 @@
     }
 }
 
+static void get_response(int channel, int format, double w,
+                         const double *b, const double *a,
+                         int nb_b, int nb_a, double *r, double *i)
+{
+    double realz, realp;
+    double imagz, imagp;
+    double real, imag;
+    double div;
+
+    if (format == 0) {
+        realz = 0., realp = 0.;
+        imagz = 0., imagp = 0.;
+        for (int x = 0; x < nb_a; x++) {
+            realz += cos(-x * w) * a[x];
+            imagz += sin(-x * w) * a[x];
+        }
+
+        for (int x = 0; x < nb_b; x++) {
+            realp += cos(-x * w) * b[x];
+            imagp += sin(-x * w) * b[x];
+        }
+
+        div = realp * realp + imagp * imagp;
+        real = (realz * realp + imagz * imagp) / div;
+        imag = (imagz * realp - imagp * realz) / div;
+    } else {
+        real = 1;
+        imag = 0;
+        for (int x = 0; x < nb_a; x++) {
+            double ore, oim, re, im;
+
+            re = cos(w) - a[2 * x];
+            im = sin(w) - a[2 * x + 1];
+
+            ore = real;
+            oim = imag;
+
+            real = ore * re - oim * im;
+            imag = ore * im + oim * re;
+        }
+
+        for (int x = 0; x < nb_b; x++) {
+            double ore, oim, re, im;
+
+            re = cos(w) - b[2 * x];
+            im = sin(w) - b[2 * x + 1];
+
+            ore = real;
+            oim = imag;
+            div = re * re + im * im;
+
+            real = (ore * re + oim * im) / div;
+            imag = (oim * re - ore * im) / div;
+        }
+    }
+
+    *r = real;
+    *i = imag;
+}
+
 static void draw_response(AVFilterContext *ctx, AVFrame *out)
 {
     AudioIIRContext *s = ctx->priv;
-    float *mag, *phase, min = FLT_MAX, max = FLT_MIN;
-    int prev_ymag = -1, prev_yphase = -1;
+    float *mag, *phase, *delay, min = FLT_MAX, max = FLT_MIN;
+    float min_delay = FLT_MAX, max_delay = FLT_MIN;
+    int prev_ymag = -1, prev_yphase = -1, prev_ydelay = -1;
     char text[32];
-    int ch, i, x;
+    int ch, i;
 
     memset(out->data[0], 0, s->h * out->linesize[0]);
 
     phase = av_malloc_array(s->w, sizeof(*phase));
     mag = av_malloc_array(s->w, sizeof(*mag));
-    if (!mag || !phase)
+    delay = av_malloc_array(s->w, sizeof(*delay));
+    if (!mag || !phase || !delay)
         goto end;
 
     ch = av_clip(s->ir_channel, 0, s->channels - 1);
     for (i = 0; i < s->w; i++) {
         const double *b = s->iir[ch].ab[0];
         const double *a = s->iir[ch].ab[1];
+        const int nb_b = s->iir[ch].nb_ab[0];
+        const int nb_a = s->iir[ch].nb_ab[1];
         double w = i * M_PI / (s->w - 1);
-        double realz, realp;
-        double imagz, imagp;
-        double real, imag, div;
+        double real, imag;
 
-        if (s->format == 0) {
-            realz = 0., realp = 0.;
-            imagz = 0., imagp = 0.;
-            for (x = 0; x < s->iir[ch].nb_ab[1]; x++) {
-                realz += cos(-x * w) * a[x];
-                imagz += sin(-x * w) * a[x];
-            }
-
-            for (x = 0; x < s->iir[ch].nb_ab[0]; x++) {
-                realp += cos(-x * w) * b[x];
-                imagp += sin(-x * w) * b[x];
-            }
-
-            div = realp * realp + imagp * imagp;
-            real = (realz * realp + imagz * imagp) / div;
-            imag = (imagz * realp - imagp * realz) / div;
-        } else {
-            real = 1;
-            imag = 0;
-            for (x = 0; x < s->iir[ch].nb_ab[1]; x++) {
-                double ore, oim, re, im;
-
-                re = cos(w) - a[2 * x];
-                im = sin(w) - a[2 * x + 1];
-
-                ore = real;
-                oim = imag;
-
-                real = ore * re - oim * im;
-                imag = ore * im + oim * re;
-            }
-
-            for (x = 0; x < s->iir[ch].nb_ab[0]; x++) {
-                double ore, oim, re, im;
-
-                re = cos(w) - b[2 * x];
-                im = sin(w) - b[2 * x + 1];
-
-                ore = real;
-                oim = imag;
-                div = re * re + im * im;
-
-                real = (ore * re + oim * im) / div;
-                imag = (oim * re - ore * im) / div;
-            }
-        }
+        get_response(ch, s->format, w, b, a, nb_b, nb_a, &real, &imag);
 
         mag[i] = s->iir[ch].g * hypot(real, imag);
         phase[i] = atan2(imag, real);
@@ -787,23 +853,39 @@
         max = fmaxf(max, mag[i]);
     }
 
+    for (i = 0; i < s->w - 1; i++) {
+        float dw =  M_PI / (s->w - 1);
+
+        delay[i] = -(phase[i + 1] - phase[i]) / dw;
+        min_delay = fminf(min_delay, delay[i]);
+        max_delay = fmaxf(max_delay, delay[i]);
+    }
+
+    delay[i] = delay[i - 1];
+
     for (i = 0; i < s->w; i++) {
         int ymag = mag[i] / max * (s->h - 1);
+        int ydelay = (delay[i] - min_delay) / (max_delay - min_delay) * (s->h - 1);
         int yphase = (0.5 * (1. + phase[i] / M_PI)) * (s->h - 1);
 
         ymag = s->h - 1 - av_clip(ymag, 0, s->h - 1);
         yphase = s->h - 1 - av_clip(yphase, 0, s->h - 1);
+        ydelay = s->h - 1 - av_clip(ydelay, 0, s->h - 1);
 
         if (prev_ymag < 0)
             prev_ymag = ymag;
         if (prev_yphase < 0)
             prev_yphase = yphase;
+        if (prev_ydelay < 0)
+            prev_ydelay = ydelay;
 
         draw_line(out, i,   ymag, FFMAX(i - 1, 0),   prev_ymag, 0xFFFF00FF);
         draw_line(out, i, yphase, FFMAX(i - 1, 0), prev_yphase, 0xFF00FF00);
+        draw_line(out, i, ydelay, FFMAX(i - 1, 0), prev_ydelay, 0xFF00FFFF);
 
         prev_ymag   = ymag;
         prev_yphase = yphase;
+        prev_ydelay = ydelay;
     }
 
     if (s->w > 400 && s->h > 100) {
@@ -814,9 +896,18 @@
         drawtext(out, 2, 12, "Min Magnitude:", 0xDDDDDDDD);
         snprintf(text, sizeof(text), "%.2f", min);
         drawtext(out, 15 * 8 + 2, 12, text, 0xDDDDDDDD);
+
+        drawtext(out, 2, 22, "Max Delay:", 0xDDDDDDDD);
+        snprintf(text, sizeof(text), "%.2f", max_delay);
+        drawtext(out, 11 * 8 + 2, 22, text, 0xDDDDDDDD);
+
+        drawtext(out, 2, 32, "Min Delay:", 0xDDDDDDDD);
+        snprintf(text, sizeof(text), "%.2f", min_delay);
+        drawtext(out, 11 * 8 + 2, 32, text, 0xDDDDDDDD);
     }
 
 end:
+    av_free(delay);
     av_free(phase);
     av_free(mag);
 }
@@ -850,6 +941,9 @@
     } else if (s->format == 3) {
         convert_pd2zp(ctx, inlink->channels);
     }
+    if (s->format > 0) {
+        check_stability(ctx, inlink->channels);
+    }
 
     av_frame_free(&s->video);
     if (s->response) {
@@ -939,11 +1033,20 @@
 
     if (s->response) {
         AVFilterLink *outlink = ctx->outputs[1];
+        int64_t old_pts = s->video->pts;
+        int64_t new_pts = av_rescale_q(out->pts, ctx->inputs[0]->time_base, outlink->time_base);
 
-        s->video->pts = out->pts;
-        ret = ff_filter_frame(outlink, av_frame_clone(s->video));
-        if (ret < 0)
-            return ret;
+        if (new_pts > old_pts) {
+            AVFrame *clone;
+
+            s->video->pts = new_pts;
+            clone = av_frame_clone(s->video);
+            if (!clone)
+                return AVERROR(ENOMEM);
+            ret = ff_filter_frame(outlink, clone);
+            if (ret < 0)
+                return ret;
+        }
     }
 
     return ff_filter_frame(outlink, out);
@@ -957,6 +1060,8 @@
     outlink->sample_aspect_ratio = (AVRational){1,1};
     outlink->w = s->w;
     outlink->h = s->h;
+    outlink->frame_rate = s->rate;
+    outlink->time_base = av_inv_q(outlink->frame_rate);
 
     return 0;
 }
@@ -1067,9 +1172,11 @@
     { "flt", "single-precision floating-point",    0,                AV_OPT_TYPE_CONST,  {.i64=1},     0, 0, AF, "precision" },
     { "i32", "32-bit integers",                    0,                AV_OPT_TYPE_CONST,  {.i64=2},     0, 0, AF, "precision" },
     { "i16", "16-bit integers",                    0,                AV_OPT_TYPE_CONST,  {.i64=3},     0, 0, AF, "precision" },
+    { "mix", "set mix",                            OFFSET(mix),      AV_OPT_TYPE_DOUBLE, {.dbl=1},     0, 1, AF },
     { "response", "show IR frequency response",    OFFSET(response), AV_OPT_TYPE_BOOL,   {.i64=0},     0, 1, VF },
     { "channel", "set IR channel to display frequency response", OFFSET(ir_channel), AV_OPT_TYPE_INT, {.i64=0}, 0, 1024, VF },
     { "size",   "set video size",                  OFFSET(w),        AV_OPT_TYPE_IMAGE_SIZE, {.str = "hd720"}, 0, 0, VF },
+    { "rate",   "set video rate",                  OFFSET(rate),     AV_OPT_TYPE_VIDEO_RATE, {.str = "25"}, 0, INT32_MAX, VF },
     { NULL },
 };
 
diff --git a/libavfilter/af_amerge.c b/libavfilter/af_amerge.c
index 3961c90..567f259 100644
--- a/libavfilter/af_amerge.c
+++ b/libavfilter/af_amerge.c
@@ -23,9 +23,6 @@
  * Audio merging filter
  */
 
-#define FF_INTERNAL_FIELDS 1
-#include "framequeue.h"
-
 #include "libavutil/avstring.h"
 #include "libavutil/bprint.h"
 #include "libavutil/channel_layout.h"
@@ -285,9 +282,9 @@
 
     FF_FILTER_FORWARD_STATUS_BACK_ALL(ctx->outputs[0], ctx);
 
-    nb_samples = ff_framequeue_queued_samples(&ctx->inputs[0]->fifo);
+    nb_samples = ff_inlink_queued_samples(ctx->inputs[0]);
     for (i = 1; i < ctx->nb_inputs && nb_samples > 0; i++) {
-        nb_samples = FFMIN(ff_framequeue_queued_samples(&ctx->inputs[i]->fifo), nb_samples);
+        nb_samples = FFMIN(ff_inlink_queued_samples(ctx->inputs[i]), nb_samples);
     }
 
     if (nb_samples) {
@@ -297,7 +294,7 @@
     }
 
     for (i = 0; i < ctx->nb_inputs; i++) {
-        if (ff_framequeue_queued_samples(&ctx->inputs[i]->fifo))
+        if (ff_inlink_queued_samples(ctx->inputs[i]))
             continue;
 
         if (ff_inlink_acknowledge_status(ctx->inputs[i], &status, &pts)) {
diff --git a/libavfilter/af_amix.c b/libavfilter/af_amix.c
index ec2556f..c09f8b0 100644
--- a/libavfilter/af_amix.c
+++ b/libavfilter/af_amix.c
@@ -34,6 +34,7 @@
 #include "libavutil/avstring.h"
 #include "libavutil/channel_layout.h"
 #include "libavutil/common.h"
+#include "libavutil/eval.h"
 #include "libavutil/float_dsp.h"
 #include "libavutil/mathematics.h"
 #include "libavutil/opt.h"
@@ -182,7 +183,7 @@
 #define F AV_OPT_FLAG_FILTERING_PARAM
 static const AVOption amix_options[] = {
     { "inputs", "Number of inputs.",
-            OFFSET(nb_inputs), AV_OPT_TYPE_INT, { .i64 = 2 }, 1, 1024, A|F },
+            OFFSET(nb_inputs), AV_OPT_TYPE_INT, { .i64 = 2 }, 1, INT16_MAX, A|F },
     { "duration", "How to determine the end-of-stream.",
             OFFSET(duration_mode), AV_OPT_TYPE_INT, { .i64 = DURATION_LONGEST }, 0,  2, A|F, "duration" },
         { "longest",  "Duration of longest input.",  0, AV_OPT_TYPE_CONST, { .i64 = DURATION_LONGEST  }, 0, 0, A|F, "duration" },
@@ -212,21 +213,21 @@
 
     for (i = 0; i < s->nb_inputs; i++)
         if (s->input_state[i] & INPUT_ON)
-            weight_sum += s->weights[i];
+            weight_sum += FFABS(s->weights[i]);
 
     for (i = 0; i < s->nb_inputs; i++) {
         if (s->input_state[i] & INPUT_ON) {
-            if (s->scale_norm[i] > weight_sum / s->weights[i]) {
-                s->scale_norm[i] -= ((s->weight_sum / s->weights[i]) / s->nb_inputs) *
+            if (s->scale_norm[i] > weight_sum / FFABS(s->weights[i])) {
+                s->scale_norm[i] -= ((s->weight_sum / FFABS(s->weights[i])) / s->nb_inputs) *
                                     nb_samples / (s->dropout_transition * s->sample_rate);
-                s->scale_norm[i] = FFMAX(s->scale_norm[i], weight_sum / s->weights[i]);
+                s->scale_norm[i] = FFMAX(s->scale_norm[i], weight_sum / FFABS(s->weights[i]));
             }
         }
     }
 
     for (i = 0; i < s->nb_inputs; i++) {
         if (s->input_state[i] & INPUT_ON)
-            s->input_scale[i] = 1.0f / s->scale_norm[i];
+            s->input_scale[i] = 1.0f / s->scale_norm[i] * FFSIGN(s->weights[i]);
         else
             s->input_scale[i] = 0.0f;
     }
@@ -270,7 +271,7 @@
     if (!s->input_scale || !s->scale_norm)
         return AVERROR(ENOMEM);
     for (i = 0; i < s->nb_inputs; i++)
-        s->scale_norm[i] = s->weight_sum / s->weights[i];
+        s->scale_norm[i] = s->weight_sum / FFABS(s->weights[i]);
     calculate_scales(s, 0);
 
     av_get_channel_layout_string(buf, sizeof(buf), -1, outlink->channel_layout);
@@ -506,9 +507,9 @@
 static av_cold int init(AVFilterContext *ctx)
 {
     MixContext *s = ctx->priv;
-    char *p, *arg, *saveptr = NULL;
     float last_weight = 1.f;
     int i, ret;
+    char *p;
 
     for (i = 0; i < s->nb_inputs; i++) {
         AVFilterPad pad = { 0 };
@@ -534,18 +535,20 @@
 
     p = s->weights_str;
     for (i = 0; i < s->nb_inputs; i++) {
-        if (!(arg = av_strtok(p, " ", &saveptr)))
-            break;
-
-        p = NULL;
-        sscanf(arg, "%f", &last_weight);
+        last_weight = av_strtod(p, &p);
         s->weights[i] = last_weight;
-        s->weight_sum += last_weight;
+        s->weight_sum += FFABS(last_weight);
+        if (p && *p) {
+            p++;
+        } else {
+            i++;
+            break;
+        }
     }
 
     for (; i < s->nb_inputs; i++) {
         s->weights[i] = last_weight;
-        s->weight_sum += last_weight;
+        s->weight_sum += FFABS(last_weight);
     }
 
     return 0;
diff --git a/libavfilter/af_amultiply.c b/libavfilter/af_amultiply.c
index a742f6a..cc03284 100644
--- a/libavfilter/af_amultiply.c
+++ b/libavfilter/af_amultiply.c
@@ -24,9 +24,6 @@
 #include "libavutil/float_dsp.h"
 #include "libavutil/opt.h"
 
-#define FF_INTERNAL_FIELDS 1
-#include "framequeue.h"
-
 #include "audio.h"
 #include "avfilter.h"
 #include "formats.h"
@@ -37,7 +34,6 @@
     const AVClass *class;
 
     AVFrame *frames[2];
-    int64_t pts;
     int planes;
     int channels;
     int samples_align;
@@ -85,8 +81,8 @@
 
     FF_FILTER_FORWARD_STATUS_BACK_ALL(ctx->outputs[0], ctx);
 
-    nb_samples = FFMIN(ff_framequeue_queued_samples(&ctx->inputs[0]->fifo),
-                       ff_framequeue_queued_samples(&ctx->inputs[1]->fifo));
+    nb_samples = FFMIN(ff_inlink_queued_samples(ctx->inputs[0]),
+                       ff_inlink_queued_samples(ctx->inputs[1]));
     for (i = 0; i < ctx->nb_inputs && nb_samples > 0; i++) {
         if (s->frames[i])
             continue;
@@ -98,21 +94,20 @@
         }
     }
 
-    if (nb_samples > 0 && s->frames[0] && s->frames[1]) {
+    if (s->frames[0] && s->frames[1]) {
         AVFrame *out;
         int plane_samples;
 
         if (av_sample_fmt_is_planar(ctx->inputs[0]->format))
-            plane_samples = FFALIGN(nb_samples, s->samples_align);
+            plane_samples = FFALIGN(s->frames[0]->nb_samples, s->samples_align);
         else
-            plane_samples = FFALIGN(nb_samples * s->channels, s->samples_align);
+            plane_samples = FFALIGN(s->frames[0]->nb_samples * s->channels, s->samples_align);
 
-        out = ff_get_audio_buffer(ctx->outputs[0], nb_samples);
+        out = ff_get_audio_buffer(ctx->outputs[0], s->frames[0]->nb_samples);
         if (!out)
             return AVERROR(ENOMEM);
 
-        out->pts = s->pts;
-        s->pts += nb_samples;
+        out->pts = s->frames[0]->pts;
 
         if (av_get_packed_sample_fmt(ctx->inputs[0]->format) == AV_SAMPLE_FMT_FLT) {
             for (i = 0; i < s->planes; i++) {
@@ -150,7 +145,7 @@
 
     if (ff_outlink_frame_wanted(ctx->outputs[0])) {
         for (i = 0; i < 2; i++) {
-            if (ff_framequeue_queued_samples(&ctx->inputs[i]->fifo) > 0)
+            if (ff_inlink_queued_samples(ctx->inputs[i]) > 0)
                 continue;
             ff_inlink_request_frame(ctx->inputs[i]);
             return 0;
diff --git a/libavfilter/af_anequalizer.c b/libavfilter/af_anequalizer.c
index 03d939f..177e1c7 100644
--- a/libavfilter/af_anequalizer.c
+++ b/libavfilter/af_anequalizer.c
@@ -205,8 +205,10 @@
             .type         = AVMEDIA_TYPE_VIDEO,
             .config_props = config_video,
         };
-        if (!vpad.name)
+        if (!vpad.name) {
+            av_freep(&pad.name);
             return AVERROR(ENOMEM);
+        }
     }
 
     ret = ff_insert_outpad(ctx, 0, &pad);
@@ -564,7 +566,7 @@
 static int add_filter(AudioNEqualizerContext *s, AVFilterLink *inlink)
 {
     equalizer(&s->filters[s->nb_filters], inlink->sample_rate);
-    if (s->nb_filters >= s->nb_allocated) {
+    if (s->nb_filters >= s->nb_allocated - 1) {
         EqualizatorFilter *filters;
 
         filters = av_calloc(s->nb_allocated, 2 * sizeof(*s->filters));
@@ -731,13 +733,18 @@
     }
 
     if (s->draw_curves) {
+        AVFrame *clone;
+
         const int64_t pts = buf->pts +
             av_rescale_q(buf->nb_samples, (AVRational){ 1, inlink->sample_rate },
                          outlink->time_base);
         int ret;
 
         s->video->pts = pts;
-        ret = ff_filter_frame(ctx->outputs[1], av_frame_clone(s->video));
+        clone = av_frame_clone(s->video);
+        if (!clone)
+            return AVERROR(ENOMEM);
+        ret = ff_filter_frame(ctx->outputs[1], clone);
         if (ret < 0)
             return ret;
     }
diff --git a/libavfilter/af_anlmdn.c b/libavfilter/af_anlmdn.c
new file mode 100644
index 0000000..b8aef31
--- /dev/null
+++ b/libavfilter/af_anlmdn.c
@@ -0,0 +1,374 @@
+/*
+ * Copyright (c) 2019 Paul B Mahol
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include <float.h>
+
+#include "libavutil/avassert.h"
+#include "libavutil/audio_fifo.h"
+#include "libavutil/avstring.h"
+#include "libavutil/opt.h"
+#include "avfilter.h"
+#include "audio.h"
+#include "formats.h"
+
+#include "af_anlmdndsp.h"
+
+#define WEIGHT_LUT_NBITS 20
+#define WEIGHT_LUT_SIZE  (1<<WEIGHT_LUT_NBITS)
+
+#define SQR(x) ((x) * (x))
+
+typedef struct AudioNLMeansContext {
+    const AVClass *class;
+
+    float a;
+    int64_t pd;
+    int64_t rd;
+    float m;
+    int om;
+
+    float pdiff_lut_scale;
+    float weight_lut[WEIGHT_LUT_SIZE];
+
+    int K;
+    int S;
+    int N;
+    int H;
+
+    int offset;
+    AVFrame *in;
+    AVFrame *cache;
+
+    int64_t pts;
+
+    AVAudioFifo *fifo;
+    int eof_left;
+
+    AudioNLMDNDSPContext dsp;
+} AudioNLMeansContext;
+
+enum OutModes {
+    IN_MODE,
+    OUT_MODE,
+    NOISE_MODE,
+    NB_MODES
+};
+
+#define OFFSET(x) offsetof(AudioNLMeansContext, x)
+#define AF AV_OPT_FLAG_AUDIO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
+#define AFT AV_OPT_FLAG_AUDIO_PARAM|AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_RUNTIME_PARAM
+
+static const AVOption anlmdn_options[] = {
+    { "s", "set denoising strength", OFFSET(a),  AV_OPT_TYPE_FLOAT,    {.dbl=0.00001},0.00001, 10, AFT },
+    { "p", "set patch duration",     OFFSET(pd), AV_OPT_TYPE_DURATION, {.i64=2000}, 1000, 100000, AF },
+    { "r", "set research duration",  OFFSET(rd), AV_OPT_TYPE_DURATION, {.i64=6000}, 2000, 300000, AF },
+    { "o", "set output mode",        OFFSET(om), AV_OPT_TYPE_INT,      {.i64=OUT_MODE},  0, NB_MODES-1, AFT, "mode" },
+    {  "i", "input",                 0,          AV_OPT_TYPE_CONST,    {.i64=IN_MODE},   0,  0, AFT, "mode" },
+    {  "o", "output",                0,          AV_OPT_TYPE_CONST,    {.i64=OUT_MODE},  0,  0, AFT, "mode" },
+    {  "n", "noise",                 0,          AV_OPT_TYPE_CONST,    {.i64=NOISE_MODE},0,  0, AFT, "mode" },
+    { "m", "set smooth factor",      OFFSET(m),  AV_OPT_TYPE_FLOAT,    {.dbl=11.},       1, 15, AF },
+    { NULL }
+};
+
+AVFILTER_DEFINE_CLASS(anlmdn);
+
+static int query_formats(AVFilterContext *ctx)
+{
+    AVFilterFormats *formats = NULL;
+    AVFilterChannelLayouts *layouts = NULL;
+    static const enum AVSampleFormat sample_fmts[] = {
+        AV_SAMPLE_FMT_FLTP,
+        AV_SAMPLE_FMT_NONE
+    };
+    int ret;
+
+    formats = ff_make_format_list(sample_fmts);
+    if (!formats)
+        return AVERROR(ENOMEM);
+    ret = ff_set_common_formats(ctx, formats);
+    if (ret < 0)
+        return ret;
+
+    layouts = ff_all_channel_counts();
+    if (!layouts)
+        return AVERROR(ENOMEM);
+
+    ret = ff_set_common_channel_layouts(ctx, layouts);
+    if (ret < 0)
+        return ret;
+
+    formats = ff_all_samplerates();
+    return ff_set_common_samplerates(ctx, formats);
+}
+
+static float compute_distance_ssd_c(const float *f1, const float *f2, ptrdiff_t K)
+{
+    float distance = 0.;
+
+    for (int k = -K; k <= K; k++)
+        distance += SQR(f1[k] - f2[k]);
+
+    return distance;
+}
+
+static void compute_cache_c(float *cache, const float *f,
+                            ptrdiff_t S, ptrdiff_t K,
+                            ptrdiff_t i, ptrdiff_t jj)
+{
+    int v = 0;
+
+    for (int j = jj; j < jj + S; j++, v++)
+        cache[v] += -SQR(f[i - K - 1] - f[j - K - 1]) + SQR(f[i + K] - f[j + K]);
+}
+
+void ff_anlmdn_init(AudioNLMDNDSPContext *dsp)
+{
+    dsp->compute_distance_ssd = compute_distance_ssd_c;
+    dsp->compute_cache        = compute_cache_c;
+
+    if (ARCH_X86)
+        ff_anlmdn_init_x86(dsp);
+}
+
+static int config_output(AVFilterLink *outlink)
+{
+    AVFilterContext *ctx = outlink->src;
+    AudioNLMeansContext *s = ctx->priv;
+    int ret;
+
+    s->K = av_rescale(s->pd, outlink->sample_rate, AV_TIME_BASE);
+    s->S = av_rescale(s->rd, outlink->sample_rate, AV_TIME_BASE);
+
+    s->eof_left = -1;
+    s->pts = AV_NOPTS_VALUE;
+    s->H = s->K * 2 + 1;
+    s->N = s->H + (s->K + s->S) * 2;
+
+    av_log(ctx, AV_LOG_DEBUG, "K:%d S:%d H:%d N:%d\n", s->K, s->S, s->H, s->N);
+
+    av_frame_free(&s->in);
+    av_frame_free(&s->cache);
+    s->in = ff_get_audio_buffer(outlink, s->N);
+    if (!s->in)
+        return AVERROR(ENOMEM);
+
+    s->cache = ff_get_audio_buffer(outlink, s->S * 2);
+    if (!s->cache)
+        return AVERROR(ENOMEM);
+
+    s->fifo = av_audio_fifo_alloc(outlink->format, outlink->channels, s->N);
+    if (!s->fifo)
+        return AVERROR(ENOMEM);
+
+    ret = av_audio_fifo_write(s->fifo, (void **)s->in->extended_data, s->K + s->S);
+    if (ret < 0)
+        return ret;
+
+    s->pdiff_lut_scale = 1.f / s->m * WEIGHT_LUT_SIZE;
+    for (int i = 0; i < WEIGHT_LUT_SIZE; i++) {
+        float w = -i / s->pdiff_lut_scale;
+
+        s->weight_lut[i] = expf(w);
+    }
+
+    ff_anlmdn_init(&s->dsp);
+
+    return 0;
+}
+
+static int filter_channel(AVFilterContext *ctx, void *arg, int ch, int nb_jobs)
+{
+    AudioNLMeansContext *s = ctx->priv;
+    AVFrame *out = arg;
+    const int S = s->S;
+    const int K = s->K;
+    const int om = s->om;
+    const float *f = (const float *)(s->in->extended_data[ch]) + K;
+    float *cache = (float *)s->cache->extended_data[ch];
+    const float sw = (65536.f / (4 * K + 2)) / sqrtf(s->a);
+    float *dst = (float *)out->extended_data[ch] + s->offset;
+    const float smooth = s->m;
+
+    for (int i = S; i < s->H + S; i++) {
+        float P = 0.f, Q = 0.f;
+        int v = 0;
+
+        if (i == S) {
+            for (int j = i - S; j <= i + S; j++) {
+                if (i == j)
+                    continue;
+                cache[v++] = s->dsp.compute_distance_ssd(f + i, f + j, K);
+            }
+        } else {
+            s->dsp.compute_cache(cache, f, S, K, i, i - S);
+            s->dsp.compute_cache(cache + S, f, S, K, i, i + 1);
+        }
+
+        for (int j = 0; j < 2 * S && !ctx->is_disabled; j++) {
+            const float distance = cache[j];
+            unsigned weight_lut_idx;
+            float w;
+
+            if (distance < 0.f) {
+                cache[j] = 0.f;
+                continue;
+            }
+            w = distance * sw;
+            if (w >= smooth)
+                continue;
+            weight_lut_idx = w * s->pdiff_lut_scale;
+            av_assert2(weight_lut_idx < WEIGHT_LUT_SIZE);
+            w = s->weight_lut[weight_lut_idx];
+            P += w * f[i - S + j + (j >= S)];
+            Q += w;
+        }
+
+        P += f[i];
+        Q += 1;
+
+        switch (om) {
+        case IN_MODE:    dst[i - S] = f[i];           break;
+        case OUT_MODE:   dst[i - S] = P / Q;          break;
+        case NOISE_MODE: dst[i - S] = f[i] - (P / Q); break;
+        }
+    }
+
+    return 0;
+}
+
+static int filter_frame(AVFilterLink *inlink, AVFrame *in)
+{
+    AVFilterContext *ctx = inlink->dst;
+    AVFilterLink *outlink = ctx->outputs[0];
+    AudioNLMeansContext *s = ctx->priv;
+    AVFrame *out = NULL;
+    int available, wanted, ret;
+
+    if (s->pts == AV_NOPTS_VALUE)
+        s->pts = in->pts;
+
+    ret = av_audio_fifo_write(s->fifo, (void **)in->extended_data,
+                              in->nb_samples);
+    av_frame_free(&in);
+
+    s->offset = 0;
+    available = av_audio_fifo_size(s->fifo);
+    wanted = (available / s->H) * s->H;
+
+    if (wanted >= s->H && available >= s->N) {
+        out = ff_get_audio_buffer(outlink, wanted);
+        if (!out)
+            return AVERROR(ENOMEM);
+    }
+
+    while (available >= s->N) {
+        ret = av_audio_fifo_peek(s->fifo, (void **)s->in->extended_data, s->N);
+        if (ret < 0)
+            break;
+
+        ctx->internal->execute(ctx, filter_channel, out, NULL, inlink->channels);
+
+        av_audio_fifo_drain(s->fifo, s->H);
+
+        s->offset += s->H;
+        available -= s->H;
+    }
+
+    if (out) {
+        out->pts = s->pts;
+        out->nb_samples = s->offset;
+        if (s->eof_left >= 0) {
+            out->nb_samples = FFMIN(s->eof_left, s->offset);
+            s->eof_left -= out->nb_samples;
+        }
+        s->pts += av_rescale_q(s->offset, (AVRational){1, outlink->sample_rate}, outlink->time_base);
+
+        return ff_filter_frame(outlink, out);
+    }
+
+    return ret;
+}
+
+static int request_frame(AVFilterLink *outlink)
+{
+    AVFilterContext *ctx = outlink->src;
+    AudioNLMeansContext *s = ctx->priv;
+    int ret;
+
+    ret = ff_request_frame(ctx->inputs[0]);
+
+    if (ret == AVERROR_EOF && s->eof_left != 0) {
+        AVFrame *in;
+
+        if (s->eof_left < 0)
+            s->eof_left = av_audio_fifo_size(s->fifo) - (s->S + s->K);
+        if (s->eof_left <= 0)
+            return AVERROR_EOF;
+        in = ff_get_audio_buffer(outlink, s->H);
+        if (!in)
+            return AVERROR(ENOMEM);
+
+        return filter_frame(ctx->inputs[0], in);
+    }
+
+    return ret;
+}
+
+static av_cold void uninit(AVFilterContext *ctx)
+{
+    AudioNLMeansContext *s = ctx->priv;
+
+    av_audio_fifo_free(s->fifo);
+    av_frame_free(&s->in);
+    av_frame_free(&s->cache);
+}
+
+static const AVFilterPad inputs[] = {
+    {
+        .name         = "default",
+        .type         = AVMEDIA_TYPE_AUDIO,
+        .filter_frame = filter_frame,
+    },
+    { NULL }
+};
+
+static const AVFilterPad outputs[] = {
+    {
+        .name          = "default",
+        .type          = AVMEDIA_TYPE_AUDIO,
+        .config_props  = config_output,
+        .request_frame = request_frame,
+    },
+    { NULL }
+};
+
+AVFilter ff_af_anlmdn = {
+    .name          = "anlmdn",
+    .description   = NULL_IF_CONFIG_SMALL("Reduce broadband noise from stream using Non-Local Means."),
+    .query_formats = query_formats,
+    .priv_size     = sizeof(AudioNLMeansContext),
+    .priv_class    = &anlmdn_class,
+    .uninit        = uninit,
+    .inputs        = inputs,
+    .outputs       = outputs,
+    .process_command = ff_filter_process_command,
+    .flags         = AVFILTER_FLAG_SUPPORT_TIMELINE_INTERNAL |
+                     AVFILTER_FLAG_SLICE_THREADS,
+};
diff --git a/libavfilter/af_anlmdndsp.h b/libavfilter/af_anlmdndsp.h
new file mode 100644
index 0000000..d8f5136
--- /dev/null
+++ b/libavfilter/af_anlmdndsp.h
@@ -0,0 +1,40 @@
+/*
+ * Copyright (c) 2019 Paul B Mahol
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVFILTER_ANLMDNDSP_H
+#define AVFILTER_ANLMDNDSP_H
+
+#include "libavutil/common.h"
+
+#include "audio.h"
+#include "avfilter.h"
+#include "formats.h"
+#include "internal.h"
+
+typedef struct AudioNLMDNDSPContext {
+    float (*compute_distance_ssd)(const float *f1, const float *f2, ptrdiff_t K);
+    void (*compute_cache)(float *cache, const float *f, ptrdiff_t S, ptrdiff_t K,
+                          ptrdiff_t i, ptrdiff_t jj);
+} AudioNLMDNDSPContext;
+
+void ff_anlmdn_init(AudioNLMDNDSPContext *s);
+void ff_anlmdn_init_x86(AudioNLMDNDSPContext *s);
+
+#endif /* AVFILTER_ANLMDNDSP_H */
diff --git a/libavfilter/af_anlms.c b/libavfilter/af_anlms.c
new file mode 100644
index 0000000..55e6946
--- /dev/null
+++ b/libavfilter/af_anlms.c
@@ -0,0 +1,330 @@
+/*
+ * Copyright (c) 2019 Paul B Mahol
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "libavutil/avassert.h"
+#include "libavutil/channel_layout.h"
+#include "libavutil/common.h"
+#include "libavutil/float_dsp.h"
+#include "libavutil/opt.h"
+
+#include "audio.h"
+#include "avfilter.h"
+#include "formats.h"
+#include "filters.h"
+#include "internal.h"
+
+enum OutModes {
+    IN_MODE,
+    DESIRED_MODE,
+    OUT_MODE,
+    NOISE_MODE,
+    NB_OMODES
+};
+
+typedef struct AudioNLMSContext {
+    const AVClass *class;
+
+    int order;
+    float mu;
+    float eps;
+    float leakage;
+    int output_mode;
+
+    int kernel_size;
+    AVFrame *offset;
+    AVFrame *delay;
+    AVFrame *coeffs;
+    AVFrame *tmp;
+
+    AVFrame *frame[2];
+
+    AVFloatDSPContext *fdsp;
+} AudioNLMSContext;
+
+#define OFFSET(x) offsetof(AudioNLMSContext, x)
+#define A AV_OPT_FLAG_AUDIO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
+#define AT AV_OPT_FLAG_AUDIO_PARAM|AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_RUNTIME_PARAM
+
+static const AVOption anlms_options[] = {
+    { "order",   "set the filter order",   OFFSET(order),   AV_OPT_TYPE_INT,   {.i64=256},  1, INT16_MAX, A },
+    { "mu",      "set the filter mu",      OFFSET(mu),      AV_OPT_TYPE_FLOAT, {.dbl=0.75}, 0, 2, AT },
+    { "eps",     "set the filter eps",     OFFSET(eps),     AV_OPT_TYPE_FLOAT, {.dbl=1},    0, 1, AT },
+    { "leakage", "set the filter leakage", OFFSET(leakage), AV_OPT_TYPE_FLOAT, {.dbl=0},    0, 1, AT },
+    { "out_mode", "set output mode",       OFFSET(output_mode), AV_OPT_TYPE_INT, {.i64=OUT_MODE}, 0, NB_OMODES-1, AT, "mode" },
+    {  "i", "input",                 0,          AV_OPT_TYPE_CONST,    {.i64=IN_MODE},      0, 0, AT, "mode" },
+    {  "d", "desired",               0,          AV_OPT_TYPE_CONST,    {.i64=DESIRED_MODE}, 0, 0, AT, "mode" },
+    {  "o", "output",                0,          AV_OPT_TYPE_CONST,    {.i64=OUT_MODE},     0, 0, AT, "mode" },
+    {  "n", "noise",                 0,          AV_OPT_TYPE_CONST,    {.i64=NOISE_MODE},   0, 0, AT, "mode" },
+    { NULL }
+};
+
+AVFILTER_DEFINE_CLASS(anlms);
+
+static int query_formats(AVFilterContext *ctx)
+{
+    AVFilterFormats *formats;
+    AVFilterChannelLayouts *layouts;
+    static const enum AVSampleFormat sample_fmts[] = {
+        AV_SAMPLE_FMT_FLTP,
+        AV_SAMPLE_FMT_NONE
+    };
+    int ret;
+
+    layouts = ff_all_channel_counts();
+    if (!layouts)
+        return AVERROR(ENOMEM);
+    ret = ff_set_common_channel_layouts(ctx, layouts);
+    if (ret < 0)
+        return ret;
+
+    formats = ff_make_format_list(sample_fmts);
+    if (!formats)
+        return AVERROR(ENOMEM);
+    ret = ff_set_common_formats(ctx, formats);
+    if (ret < 0)
+        return ret;
+
+    formats = ff_all_samplerates();
+    if (!formats)
+        return AVERROR(ENOMEM);
+    return ff_set_common_samplerates(ctx, formats);
+}
+
+static float fir_sample(AudioNLMSContext *s, float sample, float *delay,
+                        float *coeffs, float *tmp, int *offset)
+{
+    const int order = s->order;
+    float output;
+
+    delay[*offset] = sample;
+
+    memcpy(tmp, coeffs + order - *offset, order * sizeof(float));
+
+    output = s->fdsp->scalarproduct_float(delay, tmp, s->kernel_size);
+
+    if (--(*offset) < 0)
+        *offset = order - 1;
+
+    return output;
+}
+
+static float process_sample(AudioNLMSContext *s, float input, float desired,
+                            float *delay, float *coeffs, float *tmp, int *offsetp)
+{
+    const int order = s->order;
+    const float leakage = s->leakage;
+    const float mu = s->mu;
+    const float a = 1.f - leakage * mu;
+    float sum, output, e, norm, b;
+    int offset = *offsetp;
+
+    delay[offset + order] = input;
+
+    output = fir_sample(s, input, delay, coeffs, tmp, offsetp);
+    e = desired - output;
+
+    sum = s->fdsp->scalarproduct_float(delay, delay, s->kernel_size);
+
+    norm = s->eps + sum;
+    b = mu * e / norm;
+
+    memcpy(tmp, delay + offset, order * sizeof(float));
+
+    s->fdsp->vector_fmul_scalar(coeffs, coeffs, a, s->kernel_size);
+
+    s->fdsp->vector_fmac_scalar(coeffs, tmp, b, s->kernel_size);
+
+    memcpy(coeffs + order, coeffs, order * sizeof(float));
+
+    switch (s->output_mode) {
+    case IN_MODE:       output = input;         break;
+    case DESIRED_MODE:  output = desired;       break;
+    case OUT_MODE: /*output = output;*/         break;
+    case NOISE_MODE: output = desired - output; break;
+    }
+    return output;
+}
+
+static int process_channels(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
+{
+    AudioNLMSContext *s = ctx->priv;
+    AVFrame *out = arg;
+    const int start = (out->channels * jobnr) / nb_jobs;
+    const int end = (out->channels * (jobnr+1)) / nb_jobs;
+
+    for (int c = start; c < end; c++) {
+        const float *input = (const float *)s->frame[0]->extended_data[c];
+        const float *desired = (const float *)s->frame[1]->extended_data[c];
+        float *delay = (float *)s->delay->extended_data[c];
+        float *coeffs = (float *)s->coeffs->extended_data[c];
+        float *tmp = (float *)s->tmp->extended_data[c];
+        int *offset = (int *)s->offset->extended_data[c];
+        float *output = (float *)out->extended_data[c];
+
+        for (int n = 0; n < out->nb_samples; n++)
+            output[n] = process_sample(s, input[n], desired[n], delay, coeffs, tmp, offset);
+    }
+
+    return 0;
+}
+
+static int activate(AVFilterContext *ctx)
+{
+    AudioNLMSContext *s = ctx->priv;
+    int i, ret, status;
+    int nb_samples;
+    int64_t pts;
+
+    FF_FILTER_FORWARD_STATUS_BACK_ALL(ctx->outputs[0], ctx);
+
+    nb_samples = FFMIN(ff_inlink_queued_samples(ctx->inputs[0]),
+                       ff_inlink_queued_samples(ctx->inputs[1]));
+    for (i = 0; i < ctx->nb_inputs && nb_samples > 0; i++) {
+        if (s->frame[i])
+            continue;
+
+        if (ff_inlink_check_available_samples(ctx->inputs[i], nb_samples) > 0) {
+            ret = ff_inlink_consume_samples(ctx->inputs[i], nb_samples, nb_samples, &s->frame[i]);
+            if (ret < 0)
+                return ret;
+        }
+    }
+
+    if (s->frame[0] && s->frame[1]) {
+        AVFrame *out;
+
+        out = ff_get_audio_buffer(ctx->outputs[0], s->frame[0]->nb_samples);
+        if (!out) {
+            av_frame_free(&s->frame[0]);
+            av_frame_free(&s->frame[1]);
+            return AVERROR(ENOMEM);
+        }
+
+        ctx->internal->execute(ctx, process_channels, out, NULL, FFMIN(ctx->outputs[0]->channels,
+                                                                       ff_filter_get_nb_threads(ctx)));
+
+        out->pts = s->frame[0]->pts;
+
+        av_frame_free(&s->frame[0]);
+        av_frame_free(&s->frame[1]);
+
+        ret = ff_filter_frame(ctx->outputs[0], out);
+        if (ret < 0)
+            return ret;
+    }
+
+    if (!nb_samples) {
+        for (i = 0; i < 2; i++) {
+            if (ff_inlink_acknowledge_status(ctx->inputs[i], &status, &pts)) {
+                ff_outlink_set_status(ctx->outputs[0], status, pts);
+                return 0;
+            }
+        }
+    }
+
+    if (ff_outlink_frame_wanted(ctx->outputs[0])) {
+        for (i = 0; i < 2; i++) {
+            if (ff_inlink_queued_samples(ctx->inputs[i]) > 0)
+                continue;
+            ff_inlink_request_frame(ctx->inputs[i]);
+            return 0;
+        }
+    }
+    return 0;
+}
+
+static int config_output(AVFilterLink *outlink)
+{
+    AVFilterContext *ctx = outlink->src;
+    AudioNLMSContext *s = ctx->priv;
+
+    s->kernel_size = FFALIGN(s->order, 16);
+
+    if (!s->offset)
+        s->offset = ff_get_audio_buffer(outlink, 1);
+    if (!s->delay)
+        s->delay = ff_get_audio_buffer(outlink, 2 * s->kernel_size);
+    if (!s->coeffs)
+        s->coeffs = ff_get_audio_buffer(outlink, 2 * s->kernel_size);
+    if (!s->tmp)
+        s->tmp = ff_get_audio_buffer(outlink, s->kernel_size);
+    if (!s->delay || !s->coeffs || !s->offset || !s->tmp)
+        return AVERROR(ENOMEM);
+
+    return 0;
+}
+
+static av_cold int init(AVFilterContext *ctx)
+{
+    AudioNLMSContext *s = ctx->priv;
+
+    s->fdsp = avpriv_float_dsp_alloc(0);
+    if (!s->fdsp)
+        return AVERROR(ENOMEM);
+
+    return 0;
+}
+
+static av_cold void uninit(AVFilterContext *ctx)
+{
+    AudioNLMSContext *s = ctx->priv;
+
+    av_freep(&s->fdsp);
+    av_frame_free(&s->delay);
+    av_frame_free(&s->coeffs);
+    av_frame_free(&s->offset);
+    av_frame_free(&s->tmp);
+}
+
+static const AVFilterPad inputs[] = {
+    {
+        .name = "input",
+        .type = AVMEDIA_TYPE_AUDIO,
+    },
+    {
+        .name = "desired",
+        .type = AVMEDIA_TYPE_AUDIO,
+    },
+    { NULL }
+};
+
+static const AVFilterPad outputs[] = {
+    {
+        .name         = "default",
+        .type         = AVMEDIA_TYPE_AUDIO,
+        .config_props = config_output,
+    },
+    { NULL }
+};
+
+AVFilter ff_af_anlms = {
+    .name           = "anlms",
+    .description    = NULL_IF_CONFIG_SMALL("Apply Normalized Least-Mean-Squares algorithm to first audio stream."),
+    .priv_size      = sizeof(AudioNLMSContext),
+    .priv_class     = &anlms_class,
+    .init           = init,
+    .uninit         = uninit,
+    .activate       = activate,
+    .query_formats  = query_formats,
+    .inputs         = inputs,
+    .outputs        = outputs,
+    .flags          = AVFILTER_FLAG_SLICE_THREADS,
+    .process_command = ff_filter_process_command,
+};
diff --git a/libavfilter/af_apad.c b/libavfilter/af_apad.c
index f7a4199..fbcf6d1 100644
--- a/libavfilter/af_apad.c
+++ b/libavfilter/af_apad.c
@@ -41,6 +41,8 @@
     int packet_size;
     int64_t pad_len, pad_len_left;
     int64_t whole_len, whole_len_left;
+    int64_t pad_dur;
+    int64_t whole_dur;
 } APadContext;
 
 #define OFFSET(x) offsetof(APadContext, x)
@@ -50,6 +52,8 @@
     { "packet_size", "set silence packet size",                                  OFFSET(packet_size), AV_OPT_TYPE_INT,   { .i64 = 4096 }, 0, INT_MAX, A },
     { "pad_len",     "set number of samples of silence to add",                  OFFSET(pad_len),     AV_OPT_TYPE_INT64, { .i64 = -1 }, -1, INT64_MAX, A },
     { "whole_len",   "set minimum target number of samples in the audio stream", OFFSET(whole_len),   AV_OPT_TYPE_INT64, { .i64 = -1 }, -1, INT64_MAX, A },
+    { "pad_dur",     "set duration of silence to add",                           OFFSET(pad_dur),     AV_OPT_TYPE_DURATION, { .i64 = 0 }, 0, INT64_MAX, A },
+    { "whole_dur",   "set minimum target duration in the audio stream",          OFFSET(whole_dur),   AV_OPT_TYPE_DURATION, { .i64 = 0 }, 0, INT64_MAX, A },
     { NULL }
 };
 
@@ -64,8 +68,6 @@
         av_log(ctx, AV_LOG_ERROR, "Both whole and pad length are set, this is not possible\n");
         return AVERROR(EINVAL);
     }
-    s->pad_len_left   = s->pad_len;
-    s->whole_len_left = s->whole_len;
 
     return 0;
 }
@@ -131,6 +133,22 @@
     return ret;
 }
 
+static int config_output(AVFilterLink *outlink)
+{
+    AVFilterContext *ctx = outlink->src;
+    APadContext *s  = ctx->priv;
+
+    if (s->pad_dur)
+        s->pad_len = av_rescale(s->pad_dur, outlink->sample_rate, AV_TIME_BASE);
+    if (s->whole_dur)
+        s->whole_len = av_rescale(s->whole_dur, outlink->sample_rate, AV_TIME_BASE);
+
+    s->pad_len_left   = s->pad_len;
+    s->whole_len_left = s->whole_len;
+
+    return 0;
+}
+
 static const AVFilterPad apad_inputs[] = {
     {
         .name         = "default",
@@ -144,6 +162,7 @@
     {
         .name          = "default",
         .request_frame = request_frame,
+        .config_props  = config_output,
         .type          = AVMEDIA_TYPE_AUDIO,
     },
     { NULL }
diff --git a/libavfilter/af_arnndn.c b/libavfilter/af_arnndn.c
new file mode 100644
index 0000000..7a26f89
--- /dev/null
+++ b/libavfilter/af_arnndn.c
@@ -0,0 +1,1549 @@
+/*
+ * Copyright (c) 2018 Gregor Richards
+ * Copyright (c) 2017 Mozilla
+ * Copyright (c) 2005-2009 Xiph.Org Foundation
+ * Copyright (c) 2007-2008 CSIRO
+ * Copyright (c) 2008-2011 Octasic Inc.
+ * Copyright (c) Jean-Marc Valin
+ * Copyright (c) 2019 Paul B Mahol
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <float.h>
+
+#include "libavutil/avassert.h"
+#include "libavutil/avstring.h"
+#include "libavutil/float_dsp.h"
+#include "libavutil/opt.h"
+#include "libavutil/tx.h"
+#include "avfilter.h"
+#include "audio.h"
+#include "filters.h"
+#include "formats.h"
+
+#define FRAME_SIZE_SHIFT 2
+#define FRAME_SIZE (120<<FRAME_SIZE_SHIFT)
+#define WINDOW_SIZE (2*FRAME_SIZE)
+#define FREQ_SIZE (FRAME_SIZE + 1)
+
+#define PITCH_MIN_PERIOD 60
+#define PITCH_MAX_PERIOD 768
+#define PITCH_FRAME_SIZE 960
+#define PITCH_BUF_SIZE (PITCH_MAX_PERIOD+PITCH_FRAME_SIZE)
+
+#define SQUARE(x) ((x)*(x))
+
+#define NB_BANDS 22
+
+#define CEPS_MEM 8
+#define NB_DELTA_CEPS 6
+
+#define NB_FEATURES (NB_BANDS+3*NB_DELTA_CEPS+2)
+
+#define WEIGHTS_SCALE (1.f/256)
+
+#define MAX_NEURONS 128
+
+#define ACTIVATION_TANH    0
+#define ACTIVATION_SIGMOID 1
+#define ACTIVATION_RELU    2
+
+#define Q15ONE 1.0f
+
+typedef struct DenseLayer {
+    const float *bias;
+    const float *input_weights;
+    int nb_inputs;
+    int nb_neurons;
+    int activation;
+} DenseLayer;
+
+typedef struct GRULayer {
+    const float *bias;
+    const float *input_weights;
+    const float *recurrent_weights;
+    int nb_inputs;
+    int nb_neurons;
+    int activation;
+} GRULayer;
+
+typedef struct RNNModel {
+    int input_dense_size;
+    const DenseLayer *input_dense;
+
+    int vad_gru_size;
+    const GRULayer *vad_gru;
+
+    int noise_gru_size;
+    const GRULayer *noise_gru;
+
+    int denoise_gru_size;
+    const GRULayer *denoise_gru;
+
+    int denoise_output_size;
+    const DenseLayer *denoise_output;
+
+    int vad_output_size;
+    const DenseLayer *vad_output;
+} RNNModel;
+
+typedef struct RNNState {
+    float *vad_gru_state;
+    float *noise_gru_state;
+    float *denoise_gru_state;
+    RNNModel *model;
+} RNNState;
+
+typedef struct DenoiseState {
+    float analysis_mem[FRAME_SIZE];
+    float cepstral_mem[CEPS_MEM][NB_BANDS];
+    int memid;
+    DECLARE_ALIGNED(32, float, synthesis_mem)[FRAME_SIZE];
+    float pitch_buf[PITCH_BUF_SIZE];
+    float pitch_enh_buf[PITCH_BUF_SIZE];
+    float last_gain;
+    int last_period;
+    float mem_hp_x[2];
+    float lastg[NB_BANDS];
+    RNNState rnn;
+    AVTXContext *tx, *txi;
+    av_tx_fn tx_fn, txi_fn;
+} DenoiseState;
+
+typedef struct AudioRNNContext {
+    const AVClass *class;
+
+    char *model_name;
+
+    int channels;
+    DenoiseState *st;
+
+    DECLARE_ALIGNED(32, float, window)[WINDOW_SIZE];
+    float dct_table[NB_BANDS*NB_BANDS];
+
+    RNNModel *model;
+
+    AVFloatDSPContext *fdsp;
+} AudioRNNContext;
+
+#define F_ACTIVATION_TANH       0
+#define F_ACTIVATION_SIGMOID    1
+#define F_ACTIVATION_RELU       2
+
+static void rnnoise_model_free(RNNModel *model)
+{
+#define FREE_MAYBE(ptr) do { if (ptr) free(ptr); } while (0)
+#define FREE_DENSE(name) do { \
+    if (model->name) { \
+        av_free((void *) model->name->input_weights); \
+        av_free((void *) model->name->bias); \
+        av_free((void *) model->name); \
+    } \
+    } while (0)
+#define FREE_GRU(name) do { \
+    if (model->name) { \
+        av_free((void *) model->name->input_weights); \
+        av_free((void *) model->name->recurrent_weights); \
+        av_free((void *) model->name->bias); \
+        av_free((void *) model->name); \
+    } \
+    } while (0)
+
+    if (!model)
+        return;
+    FREE_DENSE(input_dense);
+    FREE_GRU(vad_gru);
+    FREE_GRU(noise_gru);
+    FREE_GRU(denoise_gru);
+    FREE_DENSE(denoise_output);
+    FREE_DENSE(vad_output);
+    av_free(model);
+}
+
+static RNNModel *rnnoise_model_from_file(FILE *f)
+{
+    RNNModel *ret;
+    DenseLayer *input_dense;
+    GRULayer *vad_gru;
+    GRULayer *noise_gru;
+    GRULayer *denoise_gru;
+    DenseLayer *denoise_output;
+    DenseLayer *vad_output;
+    int in;
+
+    if (fscanf(f, "rnnoise-nu model file version %d\n", &in) != 1 || in != 1)
+        return NULL;
+
+    ret = av_calloc(1, sizeof(RNNModel));
+    if (!ret)
+        return NULL;
+
+#define ALLOC_LAYER(type, name) \
+    name = av_calloc(1, sizeof(type)); \
+    if (!name) { \
+        rnnoise_model_free(ret); \
+        return NULL; \
+    } \
+    ret->name = name
+
+    ALLOC_LAYER(DenseLayer, input_dense);
+    ALLOC_LAYER(GRULayer, vad_gru);
+    ALLOC_LAYER(GRULayer, noise_gru);
+    ALLOC_LAYER(GRULayer, denoise_gru);
+    ALLOC_LAYER(DenseLayer, denoise_output);
+    ALLOC_LAYER(DenseLayer, vad_output);
+
+#define INPUT_VAL(name) do { \
+    if (fscanf(f, "%d", &in) != 1 || in < 0 || in > 128) { \
+        rnnoise_model_free(ret); \
+        return NULL; \
+    } \
+    name = in; \
+    } while (0)
+
+#define INPUT_ACTIVATION(name) do { \
+    int activation; \
+    INPUT_VAL(activation); \
+    switch (activation) { \
+    case F_ACTIVATION_SIGMOID: \
+        name = ACTIVATION_SIGMOID; \
+        break; \
+    case F_ACTIVATION_RELU: \
+        name = ACTIVATION_RELU; \
+        break; \
+    default: \
+        name = ACTIVATION_TANH; \
+    } \
+    } while (0)
+
+#define INPUT_ARRAY(name, len) do { \
+    float *values = av_calloc((len), sizeof(float)); \
+    if (!values) { \
+        rnnoise_model_free(ret); \
+        return NULL; \
+    } \
+    name = values; \
+    for (int i = 0; i < (len); i++) { \
+        if (fscanf(f, "%d", &in) != 1) { \
+            rnnoise_model_free(ret); \
+            return NULL; \
+        } \
+        values[i] = in; \
+    } \
+    } while (0)
+
+#define INPUT_ARRAY3(name, len0, len1, len2) do { \
+    float *values = av_calloc(FFALIGN((len0), 4) * FFALIGN((len1), 4) * (len2), sizeof(float)); \
+    if (!values) { \
+        rnnoise_model_free(ret); \
+        return NULL; \
+    } \
+    name = values; \
+    for (int k = 0; k < (len0); k++) { \
+        for (int i = 0; i < (len2); i++) { \
+            for (int j = 0; j < (len1); j++) { \
+                if (fscanf(f, "%d", &in) != 1) { \
+                    rnnoise_model_free(ret); \
+                    return NULL; \
+                } \
+                values[j * (len2) * FFALIGN((len0), 4) + i * FFALIGN((len0), 4) + k] = in; \
+            } \
+        } \
+    } \
+    } while (0)
+
+#define INPUT_DENSE(name) do { \
+    INPUT_VAL(name->nb_inputs); \
+    INPUT_VAL(name->nb_neurons); \
+    ret->name ## _size = name->nb_neurons; \
+    INPUT_ACTIVATION(name->activation); \
+    INPUT_ARRAY(name->input_weights, name->nb_inputs * name->nb_neurons); \
+    INPUT_ARRAY(name->bias, name->nb_neurons); \
+    } while (0)
+
+#define INPUT_GRU(name) do { \
+    INPUT_VAL(name->nb_inputs); \
+    INPUT_VAL(name->nb_neurons); \
+    ret->name ## _size = name->nb_neurons; \
+    INPUT_ACTIVATION(name->activation); \
+    INPUT_ARRAY3(name->input_weights, name->nb_inputs, name->nb_neurons, 3); \
+    INPUT_ARRAY3(name->recurrent_weights, name->nb_neurons, name->nb_neurons, 3); \
+    INPUT_ARRAY(name->bias, name->nb_neurons * 3); \
+    } while (0)
+
+    INPUT_DENSE(input_dense);
+    INPUT_GRU(vad_gru);
+    INPUT_GRU(noise_gru);
+    INPUT_GRU(denoise_gru);
+    INPUT_DENSE(denoise_output);
+    INPUT_DENSE(vad_output);
+
+    if (vad_output->nb_neurons != 1) {
+        rnnoise_model_free(ret);
+        return NULL;
+    }
+
+    return ret;
+}
+
+static int query_formats(AVFilterContext *ctx)
+{
+    AVFilterFormats *formats = NULL;
+    AVFilterChannelLayouts *layouts = NULL;
+    static const enum AVSampleFormat sample_fmts[] = {
+        AV_SAMPLE_FMT_FLTP,
+        AV_SAMPLE_FMT_NONE
+    };
+    int ret, sample_rates[] = { 48000, -1 };
+
+    formats = ff_make_format_list(sample_fmts);
+    if (!formats)
+        return AVERROR(ENOMEM);
+    ret = ff_set_common_formats(ctx, formats);
+    if (ret < 0)
+        return ret;
+
+    layouts = ff_all_channel_counts();
+    if (!layouts)
+        return AVERROR(ENOMEM);
+
+    ret = ff_set_common_channel_layouts(ctx, layouts);
+    if (ret < 0)
+        return ret;
+
+    formats = ff_make_format_list(sample_rates);
+    if (!formats)
+        return AVERROR(ENOMEM);
+    return ff_set_common_samplerates(ctx, formats);
+}
+
+static int config_input(AVFilterLink *inlink)
+{
+    AVFilterContext *ctx = inlink->dst;
+    AudioRNNContext *s = ctx->priv;
+    int ret;
+
+    s->channels = inlink->channels;
+
+    s->st = av_calloc(s->channels, sizeof(DenoiseState));
+    if (!s->st)
+        return AVERROR(ENOMEM);
+
+    for (int i = 0; i < s->channels; i++) {
+        DenoiseState *st = &s->st[i];
+
+        st->rnn.model = s->model;
+        st->rnn.vad_gru_state = av_calloc(sizeof(float), FFALIGN(s->model->vad_gru_size, 16));
+        st->rnn.noise_gru_state = av_calloc(sizeof(float), FFALIGN(s->model->noise_gru_size, 16));
+        st->rnn.denoise_gru_state = av_calloc(sizeof(float), FFALIGN(s->model->denoise_gru_size, 16));
+        if (!st->rnn.vad_gru_state ||
+            !st->rnn.noise_gru_state ||
+            !st->rnn.denoise_gru_state)
+            return AVERROR(ENOMEM);
+
+        ret = av_tx_init(&st->tx, &st->tx_fn, AV_TX_FLOAT_FFT, 0, WINDOW_SIZE, NULL, 0);
+        if (ret < 0)
+            return ret;
+
+        ret = av_tx_init(&st->txi, &st->txi_fn, AV_TX_FLOAT_FFT, 1, WINDOW_SIZE, NULL, 0);
+        if (ret < 0)
+            return ret;
+    }
+
+    return 0;
+}
+
+static void biquad(float *y, float mem[2], const float *x,
+                   const float *b, const float *a, int N)
+{
+    for (int i = 0; i < N; i++) {
+        float xi, yi;
+
+        xi = x[i];
+        yi = x[i] + mem[0];
+        mem[0] = mem[1] + (b[0]*xi - a[0]*yi);
+        mem[1] = (b[1]*xi - a[1]*yi);
+        y[i] = yi;
+    }
+}
+
+#define RNN_MOVE(dst, src, n) (memmove((dst), (src), (n)*sizeof(*(dst)) + 0*((dst)-(src)) ))
+#define RNN_CLEAR(dst, n) (memset((dst), 0, (n)*sizeof(*(dst))))
+#define RNN_COPY(dst, src, n) (memcpy((dst), (src), (n)*sizeof(*(dst)) + 0*((dst)-(src)) ))
+
+static void forward_transform(DenoiseState *st, AVComplexFloat *out, const float *in)
+{
+    AVComplexFloat x[WINDOW_SIZE];
+    AVComplexFloat y[WINDOW_SIZE];
+
+    for (int i = 0; i < WINDOW_SIZE; i++) {
+        x[i].re = in[i];
+        x[i].im = 0;
+    }
+
+    st->tx_fn(st->tx, y, x, sizeof(float));
+
+    RNN_COPY(out, y, FREQ_SIZE);
+}
+
+static void inverse_transform(DenoiseState *st, float *out, const AVComplexFloat *in)
+{
+    AVComplexFloat x[WINDOW_SIZE];
+    AVComplexFloat y[WINDOW_SIZE];
+
+    for (int i = 0; i < FREQ_SIZE; i++)
+        x[i] = in[i];
+
+    for (int i = FREQ_SIZE; i < WINDOW_SIZE; i++) {
+        x[i].re =  x[WINDOW_SIZE - i].re;
+        x[i].im = -x[WINDOW_SIZE - i].im;
+    }
+
+    st->txi_fn(st->txi, y, x, sizeof(float));
+
+    for (int i = 0; i < WINDOW_SIZE; i++)
+        out[i] = y[i].re / WINDOW_SIZE;
+}
+
+static const uint8_t eband5ms[] = {
+/*0  200 400 600 800  1k 1.2 1.4 1.6  2k 2.4 2.8 3.2  4k 4.8 5.6 6.8  8k 9.6 12k 15.6 20k*/
+  0,  1,  2,  3,  4,   5, 6,  7,  8,  10, 12, 14, 16, 20, 24, 28, 34, 40, 48, 60, 78, 100
+};
+
+static void compute_band_energy(float *bandE, const AVComplexFloat *X)
+{
+    float sum[NB_BANDS] = {0};
+
+    for (int i = 0; i < NB_BANDS - 1; i++) {
+        int band_size;
+
+        band_size = (eband5ms[i + 1] - eband5ms[i]) << FRAME_SIZE_SHIFT;
+        for (int j = 0; j < band_size; j++) {
+            float tmp, frac = (float)j / band_size;
+
+            tmp         = SQUARE(X[(eband5ms[i] << FRAME_SIZE_SHIFT) + j].re);
+            tmp        += SQUARE(X[(eband5ms[i] << FRAME_SIZE_SHIFT) + j].im);
+            sum[i]     += (1.f - frac) * tmp;
+            sum[i + 1] +=        frac  * tmp;
+        }
+    }
+
+    sum[0] *= 2;
+    sum[NB_BANDS - 1] *= 2;
+
+    for (int i = 0; i < NB_BANDS; i++)
+        bandE[i] = sum[i];
+}
+
+static void compute_band_corr(float *bandE, const AVComplexFloat *X, const AVComplexFloat *P)
+{
+    float sum[NB_BANDS] = { 0 };
+
+    for (int i = 0; i < NB_BANDS - 1; i++) {
+        int band_size;
+
+        band_size = (eband5ms[i + 1] - eband5ms[i]) << FRAME_SIZE_SHIFT;
+        for (int j = 0; j < band_size; j++) {
+            float tmp, frac = (float)j / band_size;
+
+            tmp  = X[(eband5ms[i]<<FRAME_SIZE_SHIFT) + j].re * P[(eband5ms[i]<<FRAME_SIZE_SHIFT) + j].re;
+            tmp += X[(eband5ms[i]<<FRAME_SIZE_SHIFT) + j].im * P[(eband5ms[i]<<FRAME_SIZE_SHIFT) + j].im;
+            sum[i]     += (1 - frac) * tmp;
+            sum[i + 1] +=      frac  * tmp;
+        }
+    }
+
+    sum[0] *= 2;
+    sum[NB_BANDS-1] *= 2;
+
+    for (int i = 0; i < NB_BANDS; i++)
+        bandE[i] = sum[i];
+}
+
+static void frame_analysis(AudioRNNContext *s, DenoiseState *st, AVComplexFloat *X, float *Ex, const float *in)
+{
+    LOCAL_ALIGNED_32(float, x, [WINDOW_SIZE]);
+
+    RNN_COPY(x, st->analysis_mem, FRAME_SIZE);
+    RNN_COPY(x + FRAME_SIZE, in, FRAME_SIZE);
+    RNN_COPY(st->analysis_mem, in, FRAME_SIZE);
+    s->fdsp->vector_fmul(x, x, s->window, WINDOW_SIZE);
+    forward_transform(st, X, x);
+    compute_band_energy(Ex, X);
+}
+
+static void frame_synthesis(AudioRNNContext *s, DenoiseState *st, float *out, const AVComplexFloat *y)
+{
+    LOCAL_ALIGNED_32(float, x, [WINDOW_SIZE]);
+
+    inverse_transform(st, x, y);
+    s->fdsp->vector_fmul(x, x, s->window, WINDOW_SIZE);
+    s->fdsp->vector_fmac_scalar(x, st->synthesis_mem, 1.f, FRAME_SIZE);
+    RNN_COPY(out, x, FRAME_SIZE);
+    RNN_COPY(st->synthesis_mem, &x[FRAME_SIZE], FRAME_SIZE);
+}
+
+static inline void xcorr_kernel(const float *x, const float *y, float sum[4], int len)
+{
+    float y_0, y_1, y_2, y_3 = 0;
+    int j;
+
+    y_0 = *y++;
+    y_1 = *y++;
+    y_2 = *y++;
+
+    for (j = 0; j < len - 3; j += 4) {
+        float tmp;
+
+        tmp = *x++;
+        y_3 = *y++;
+        sum[0] += tmp * y_0;
+        sum[1] += tmp * y_1;
+        sum[2] += tmp * y_2;
+        sum[3] += tmp * y_3;
+        tmp = *x++;
+        y_0 = *y++;
+        sum[0] += tmp * y_1;
+        sum[1] += tmp * y_2;
+        sum[2] += tmp * y_3;
+        sum[3] += tmp * y_0;
+        tmp = *x++;
+        y_1 = *y++;
+        sum[0] += tmp * y_2;
+        sum[1] += tmp * y_3;
+        sum[2] += tmp * y_0;
+        sum[3] += tmp * y_1;
+        tmp = *x++;
+        y_2 = *y++;
+        sum[0] += tmp * y_3;
+        sum[1] += tmp * y_0;
+        sum[2] += tmp * y_1;
+        sum[3] += tmp * y_2;
+    }
+
+    if (j++ < len) {
+        float tmp = *x++;
+
+        y_3 = *y++;
+        sum[0] += tmp * y_0;
+        sum[1] += tmp * y_1;
+        sum[2] += tmp * y_2;
+        sum[3] += tmp * y_3;
+    }
+
+    if (j++ < len) {
+        float tmp=*x++;
+
+        y_0 = *y++;
+        sum[0] += tmp * y_1;
+        sum[1] += tmp * y_2;
+        sum[2] += tmp * y_3;
+        sum[3] += tmp * y_0;
+    }
+
+    if (j < len) {
+        float tmp=*x++;
+
+        y_1 = *y++;
+        sum[0] += tmp * y_2;
+        sum[1] += tmp * y_3;
+        sum[2] += tmp * y_0;
+        sum[3] += tmp * y_1;
+    }
+}
+
+static inline float celt_inner_prod(const float *x,
+                                    const float *y, int N)
+{
+    float xy = 0.f;
+
+    for (int i = 0; i < N; i++)
+        xy += x[i] * y[i];
+
+    return xy;
+}
+
+static void celt_pitch_xcorr(const float *x, const float *y,
+                             float *xcorr, int len, int max_pitch)
+{
+    int i;
+
+    for (i = 0; i < max_pitch - 3; i += 4) {
+        float sum[4] = { 0, 0, 0, 0};
+
+        xcorr_kernel(x, y + i, sum, len);
+
+        xcorr[i]     = sum[0];
+        xcorr[i + 1] = sum[1];
+        xcorr[i + 2] = sum[2];
+        xcorr[i + 3] = sum[3];
+    }
+    /* In case max_pitch isn't a multiple of 4, do non-unrolled version. */
+    for (; i < max_pitch; i++) {
+        xcorr[i] = celt_inner_prod(x, y + i, len);
+    }
+}
+
+static int celt_autocorr(const float *x,   /*  in: [0...n-1] samples x   */
+                         float       *ac,  /* out: [0...lag-1] ac values */
+                         const float *window,
+                         int          overlap,
+                         int          lag,
+                         int          n)
+{
+    int fastN = n - lag;
+    int shift;
+    const float *xptr;
+    float xx[PITCH_BUF_SIZE>>1];
+
+    if (overlap == 0) {
+        xptr = x;
+    } else {
+        for (int i = 0; i < n; i++)
+            xx[i] = x[i];
+        for (int i = 0; i < overlap; i++) {
+            xx[i] = x[i] * window[i];
+            xx[n-i-1] = x[n-i-1] * window[i];
+        }
+        xptr = xx;
+    }
+
+    shift = 0;
+    celt_pitch_xcorr(xptr, xptr, ac, fastN, lag+1);
+
+    for (int k = 0; k <= lag; k++) {
+        float d = 0.f;
+
+        for (int i = k + fastN; i < n; i++)
+            d += xptr[i] * xptr[i-k];
+        ac[k] += d;
+    }
+
+    return shift;
+}
+
+static void celt_lpc(float *lpc, /* out: [0...p-1] LPC coefficients      */
+                const float *ac,   /* in:  [0...p] autocorrelation values  */
+                          int p)
+{
+    float r, error = ac[0];
+
+    RNN_CLEAR(lpc, p);
+    if (ac[0] != 0) {
+        for (int i = 0; i < p; i++) {
+            /* Sum up this iteration's reflection coefficient */
+            float rr = 0;
+            for (int j = 0; j < i; j++)
+                rr += (lpc[j] * ac[i - j]);
+            rr += ac[i + 1];
+            r = -rr/error;
+            /*  Update LPC coefficients and total error */
+            lpc[i] = r;
+            for (int j = 0; j < (i + 1) >> 1; j++) {
+                float tmp1, tmp2;
+                tmp1 = lpc[j];
+                tmp2 = lpc[i-1-j];
+                lpc[j]     = tmp1 + (r*tmp2);
+                lpc[i-1-j] = tmp2 + (r*tmp1);
+            }
+
+            error = error - (r * r *error);
+            /* Bail out once we get 30 dB gain */
+            if (error < .001f * ac[0])
+                break;
+        }
+    }
+}
+
+static void celt_fir5(const float *x,
+                      const float *num,
+                      float *y,
+                      int N,
+                      float *mem)
+{
+    float num0, num1, num2, num3, num4;
+    float mem0, mem1, mem2, mem3, mem4;
+
+    num0 = num[0];
+    num1 = num[1];
+    num2 = num[2];
+    num3 = num[3];
+    num4 = num[4];
+    mem0 = mem[0];
+    mem1 = mem[1];
+    mem2 = mem[2];
+    mem3 = mem[3];
+    mem4 = mem[4];
+
+    for (int i = 0; i < N; i++) {
+        float sum = x[i];
+
+        sum += (num0*mem0);
+        sum += (num1*mem1);
+        sum += (num2*mem2);
+        sum += (num3*mem3);
+        sum += (num4*mem4);
+        mem4 = mem3;
+        mem3 = mem2;
+        mem2 = mem1;
+        mem1 = mem0;
+        mem0 = x[i];
+        y[i] = sum;
+    }
+
+    mem[0] = mem0;
+    mem[1] = mem1;
+    mem[2] = mem2;
+    mem[3] = mem3;
+    mem[4] = mem4;
+}
+
+static void pitch_downsample(float *x[], float *x_lp,
+                             int len, int C)
+{
+    float ac[5];
+    float tmp=Q15ONE;
+    float lpc[4], mem[5]={0,0,0,0,0};
+    float lpc2[5];
+    float c1 = .8f;
+
+    for (int i = 1; i < len >> 1; i++)
+        x_lp[i] = .5f * (.5f * (x[0][(2*i-1)]+x[0][(2*i+1)])+x[0][2*i]);
+    x_lp[0] = .5f * (.5f * (x[0][1])+x[0][0]);
+    if (C==2) {
+        for (int i = 1; i < len >> 1; i++)
+            x_lp[i] += (.5f * (.5f * (x[1][(2*i-1)]+x[1][(2*i+1)])+x[1][2*i]));
+        x_lp[0] += .5f * (.5f * (x[1][1])+x[1][0]);
+    }
+
+    celt_autocorr(x_lp, ac, NULL, 0, 4, len>>1);
+
+    /* Noise floor -40 dB */
+    ac[0] *= 1.0001f;
+    /* Lag windowing */
+    for (int i = 1; i <= 4; i++) {
+        /*ac[i] *= exp(-.5*(2*M_PI*.002*i)*(2*M_PI*.002*i));*/
+        ac[i] -= ac[i]*(.008f*i)*(.008f*i);
+    }
+
+    celt_lpc(lpc, ac, 4);
+    for (int i = 0; i < 4; i++) {
+        tmp = .9f * tmp;
+        lpc[i] = (lpc[i] * tmp);
+    }
+    /* Add a zero */
+    lpc2[0] = lpc[0] + .8f;
+    lpc2[1] = lpc[1] + (c1 * lpc[0]);
+    lpc2[2] = lpc[2] + (c1 * lpc[1]);
+    lpc2[3] = lpc[3] + (c1 * lpc[2]);
+    lpc2[4] = (c1 * lpc[3]);
+    celt_fir5(x_lp, lpc2, x_lp, len>>1, mem);
+}
+
+static inline void dual_inner_prod(const float *x, const float *y01, const float *y02,
+                                   int N, float *xy1, float *xy2)
+{
+    float xy01 = 0, xy02 = 0;
+
+    for (int i = 0; i < N; i++) {
+        xy01 += (x[i] * y01[i]);
+        xy02 += (x[i] * y02[i]);
+    }
+
+    *xy1 = xy01;
+    *xy2 = xy02;
+}
+
+static float compute_pitch_gain(float xy, float xx, float yy)
+{
+    return xy / sqrtf(1.f + xx * yy);
+}
+
+static const int second_check[16] = {0, 0, 3, 2, 3, 2, 5, 2, 3, 2, 3, 2, 5, 2, 3, 2};
+static float remove_doubling(float *x, int maxperiod, int minperiod, int N,
+                             int *T0_, int prev_period, float prev_gain)
+{
+    int k, i, T, T0;
+    float g, g0;
+    float pg;
+    float xy,xx,yy,xy2;
+    float xcorr[3];
+    float best_xy, best_yy;
+    int offset;
+    int minperiod0;
+    float yy_lookup[PITCH_MAX_PERIOD+1];
+
+    minperiod0 = minperiod;
+    maxperiod /= 2;
+    minperiod /= 2;
+    *T0_ /= 2;
+    prev_period /= 2;
+    N /= 2;
+    x += maxperiod;
+    if (*T0_>=maxperiod)
+        *T0_=maxperiod-1;
+
+    T = T0 = *T0_;
+    dual_inner_prod(x, x, x-T0, N, &xx, &xy);
+    yy_lookup[0] = xx;
+    yy=xx;
+    for (i = 1; i <= maxperiod; i++) {
+        yy = yy+(x[-i] * x[-i])-(x[N-i] * x[N-i]);
+        yy_lookup[i] = FFMAX(0, yy);
+    }
+    yy = yy_lookup[T0];
+    best_xy = xy;
+    best_yy = yy;
+    g = g0 = compute_pitch_gain(xy, xx, yy);
+    /* Look for any pitch at T/k */
+    for (k = 2; k <= 15; k++) {
+        int T1, T1b;
+        float g1;
+        float cont=0;
+        float thresh;
+        T1 = (2*T0+k)/(2*k);
+        if (T1 < minperiod)
+            break;
+        /* Look for another strong correlation at T1b */
+        if (k==2)
+        {
+            if (T1+T0>maxperiod)
+                T1b = T0;
+            else
+                T1b = T0+T1;
+        } else
+        {
+            T1b = (2*second_check[k]*T0+k)/(2*k);
+        }
+        dual_inner_prod(x, &x[-T1], &x[-T1b], N, &xy, &xy2);
+        xy = .5f * (xy + xy2);
+        yy = .5f * (yy_lookup[T1] + yy_lookup[T1b]);
+        g1 = compute_pitch_gain(xy, xx, yy);
+        if (FFABS(T1-prev_period)<=1)
+            cont = prev_gain;
+        else if (FFABS(T1-prev_period)<=2 && 5 * k * k < T0)
+            cont = prev_gain * .5f;
+        else
+            cont = 0;
+        thresh = FFMAX(.3f, (.7f * g0) - cont);
+        /* Bias against very high pitch (very short period) to avoid false-positives
+           due to short-term correlation */
+        if (T1<3*minperiod)
+            thresh = FFMAX(.4f, (.85f * g0) - cont);
+        else if (T1<2*minperiod)
+            thresh = FFMAX(.5f, (.9f * g0) - cont);
+        if (g1 > thresh)
+        {
+            best_xy = xy;
+            best_yy = yy;
+            T = T1;
+            g = g1;
+        }
+    }
+    best_xy = FFMAX(0, best_xy);
+    if (best_yy <= best_xy)
+        pg = Q15ONE;
+    else
+        pg = best_xy/(best_yy + 1);
+
+    for (k = 0; k < 3; k++)
+        xcorr[k] = celt_inner_prod(x, x-(T+k-1), N);
+    if ((xcorr[2]-xcorr[0]) > .7f * (xcorr[1]-xcorr[0]))
+        offset = 1;
+    else if ((xcorr[0]-xcorr[2]) > (.7f * (xcorr[1] - xcorr[2])))
+        offset = -1;
+    else
+        offset = 0;
+    if (pg > g)
+        pg = g;
+    *T0_ = 2*T+offset;
+
+    if (*T0_<minperiod0)
+        *T0_=minperiod0;
+    return pg;
+}
+
+static void find_best_pitch(float *xcorr, float *y, int len,
+                            int max_pitch, int *best_pitch)
+{
+    float best_num[2];
+    float best_den[2];
+    float Syy = 1.f;
+
+    best_num[0] = -1;
+    best_num[1] = -1;
+    best_den[0] = 0;
+    best_den[1] = 0;
+    best_pitch[0] = 0;
+    best_pitch[1] = 1;
+
+    for (int j = 0; j < len; j++)
+        Syy += y[j] * y[j];
+
+    for (int i = 0; i < max_pitch; i++) {
+        if (xcorr[i]>0) {
+            float num;
+            float xcorr16;
+
+            xcorr16 = xcorr[i];
+            /* Considering the range of xcorr16, this should avoid both underflows
+               and overflows (inf) when squaring xcorr16 */
+            xcorr16 *= 1e-12f;
+            num = xcorr16 * xcorr16;
+            if ((num * best_den[1]) > (best_num[1] * Syy)) {
+                if ((num * best_den[0]) > (best_num[0] * Syy)) {
+                    best_num[1] = best_num[0];
+                    best_den[1] = best_den[0];
+                    best_pitch[1] = best_pitch[0];
+                    best_num[0] = num;
+                    best_den[0] = Syy;
+                    best_pitch[0] = i;
+                } else {
+                    best_num[1] = num;
+                    best_den[1] = Syy;
+                    best_pitch[1] = i;
+                }
+            }
+        }
+        Syy += y[i+len]*y[i+len] - y[i] * y[i];
+        Syy = FFMAX(1, Syy);
+    }
+}
+
+static void pitch_search(const float *x_lp, float *y,
+                         int len, int max_pitch, int *pitch)
+{
+    int lag;
+    int best_pitch[2]={0,0};
+    int offset;
+
+    float x_lp4[WINDOW_SIZE];
+    float y_lp4[WINDOW_SIZE];
+    float xcorr[WINDOW_SIZE];
+
+    lag = len+max_pitch;
+
+    /* Downsample by 2 again */
+    for (int j = 0; j < len >> 2; j++)
+        x_lp4[j] = x_lp[2*j];
+    for (int j = 0; j < lag >> 2; j++)
+        y_lp4[j] = y[2*j];
+
+    /* Coarse search with 4x decimation */
+
+    celt_pitch_xcorr(x_lp4, y_lp4, xcorr, len>>2, max_pitch>>2);
+
+    find_best_pitch(xcorr, y_lp4, len>>2, max_pitch>>2, best_pitch);
+
+    /* Finer search with 2x decimation */
+    for (int i = 0; i < max_pitch >> 1; i++) {
+        float sum;
+        xcorr[i] = 0;
+        if (FFABS(i-2*best_pitch[0])>2 && FFABS(i-2*best_pitch[1])>2)
+            continue;
+        sum = celt_inner_prod(x_lp, y+i, len>>1);
+        xcorr[i] = FFMAX(-1, sum);
+    }
+
+    find_best_pitch(xcorr, y, len>>1, max_pitch>>1, best_pitch);
+
+    /* Refine by pseudo-interpolation */
+    if (best_pitch[0] > 0 && best_pitch[0] < (max_pitch >> 1) - 1) {
+        float a, b, c;
+
+        a = xcorr[best_pitch[0] - 1];
+        b = xcorr[best_pitch[0]];
+        c = xcorr[best_pitch[0] + 1];
+        if (c - a > .7f * (b - a))
+            offset = 1;
+        else if (a - c > .7f * (b-c))
+            offset = -1;
+        else
+            offset = 0;
+    } else {
+        offset = 0;
+    }
+
+    *pitch = 2 * best_pitch[0] - offset;
+}
+
+static void dct(AudioRNNContext *s, float *out, const float *in)
+{
+    for (int i = 0; i < NB_BANDS; i++) {
+        float sum = 0.f;
+
+        for (int j = 0; j < NB_BANDS; j++) {
+            sum += in[j] * s->dct_table[j * NB_BANDS + i];
+        }
+        out[i] = sum * sqrtf(2.f / 22);
+    }
+}
+
+static int compute_frame_features(AudioRNNContext *s, DenoiseState *st, AVComplexFloat *X, AVComplexFloat *P,
+                                  float *Ex, float *Ep, float *Exp, float *features, const float *in)
+{
+    float E = 0;
+    float *ceps_0, *ceps_1, *ceps_2;
+    float spec_variability = 0;
+    float Ly[NB_BANDS];
+    LOCAL_ALIGNED_32(float, p, [WINDOW_SIZE]);
+    float pitch_buf[PITCH_BUF_SIZE>>1];
+    int pitch_index;
+    float gain;
+    float *(pre[1]);
+    float tmp[NB_BANDS];
+    float follow, logMax;
+
+    frame_analysis(s, st, X, Ex, in);
+    RNN_MOVE(st->pitch_buf, &st->pitch_buf[FRAME_SIZE], PITCH_BUF_SIZE-FRAME_SIZE);
+    RNN_COPY(&st->pitch_buf[PITCH_BUF_SIZE-FRAME_SIZE], in, FRAME_SIZE);
+    pre[0] = &st->pitch_buf[0];
+    pitch_downsample(pre, pitch_buf, PITCH_BUF_SIZE, 1);
+    pitch_search(pitch_buf+(PITCH_MAX_PERIOD>>1), pitch_buf, PITCH_FRAME_SIZE,
+            PITCH_MAX_PERIOD-3*PITCH_MIN_PERIOD, &pitch_index);
+    pitch_index = PITCH_MAX_PERIOD-pitch_index;
+
+    gain = remove_doubling(pitch_buf, PITCH_MAX_PERIOD, PITCH_MIN_PERIOD,
+            PITCH_FRAME_SIZE, &pitch_index, st->last_period, st->last_gain);
+    st->last_period = pitch_index;
+    st->last_gain = gain;
+
+    for (int i = 0; i < WINDOW_SIZE; i++)
+        p[i] = st->pitch_buf[PITCH_BUF_SIZE-WINDOW_SIZE-pitch_index+i];
+
+    s->fdsp->vector_fmul(p, p, s->window, WINDOW_SIZE);
+    forward_transform(st, P, p);
+    compute_band_energy(Ep, P);
+    compute_band_corr(Exp, X, P);
+
+    for (int i = 0; i < NB_BANDS; i++)
+        Exp[i] = Exp[i] / sqrtf(.001f+Ex[i]*Ep[i]);
+
+    dct(s, tmp, Exp);
+
+    for (int i = 0; i < NB_DELTA_CEPS; i++)
+        features[NB_BANDS+2*NB_DELTA_CEPS+i] = tmp[i];
+
+    features[NB_BANDS+2*NB_DELTA_CEPS] -= 1.3;
+    features[NB_BANDS+2*NB_DELTA_CEPS+1] -= 0.9;
+    features[NB_BANDS+3*NB_DELTA_CEPS] = .01*(pitch_index-300);
+    logMax = -2;
+    follow = -2;
+
+    for (int i = 0; i < NB_BANDS; i++) {
+        Ly[i] = log10f(1e-2f + Ex[i]);
+        Ly[i] = FFMAX(logMax-7, FFMAX(follow-1.5, Ly[i]));
+        logMax = FFMAX(logMax, Ly[i]);
+        follow = FFMAX(follow-1.5, Ly[i]);
+        E += Ex[i];
+    }
+
+    if (E < 0.04f) {
+        /* If there's no audio, avoid messing up the state. */
+        RNN_CLEAR(features, NB_FEATURES);
+        return 1;
+    }
+
+    dct(s, features, Ly);
+    features[0] -= 12;
+    features[1] -= 4;
+    ceps_0 = st->cepstral_mem[st->memid];
+    ceps_1 = (st->memid < 1) ? st->cepstral_mem[CEPS_MEM+st->memid-1] : st->cepstral_mem[st->memid-1];
+    ceps_2 = (st->memid < 2) ? st->cepstral_mem[CEPS_MEM+st->memid-2] : st->cepstral_mem[st->memid-2];
+
+    for (int i = 0; i < NB_BANDS; i++)
+        ceps_0[i] = features[i];
+
+    st->memid++;
+    for (int i = 0; i < NB_DELTA_CEPS; i++) {
+        features[i] = ceps_0[i] + ceps_1[i] + ceps_2[i];
+        features[NB_BANDS+i] = ceps_0[i] - ceps_2[i];
+        features[NB_BANDS+NB_DELTA_CEPS+i] =  ceps_0[i] - 2*ceps_1[i] + ceps_2[i];
+    }
+    /* Spectral variability features. */
+    if (st->memid == CEPS_MEM)
+        st->memid = 0;
+
+    for (int i = 0; i < CEPS_MEM; i++) {
+        float mindist = 1e15f;
+        for (int j = 0; j < CEPS_MEM; j++) {
+            float dist = 0.f;
+            for (int k = 0; k < NB_BANDS; k++) {
+                float tmp;
+
+                tmp = st->cepstral_mem[i][k] - st->cepstral_mem[j][k];
+                dist += tmp*tmp;
+            }
+
+            if (j != i)
+                mindist = FFMIN(mindist, dist);
+        }
+
+        spec_variability += mindist;
+    }
+
+    features[NB_BANDS+3*NB_DELTA_CEPS+1] = spec_variability/CEPS_MEM-2.1;
+
+    return 0;
+}
+
+static void interp_band_gain(float *g, const float *bandE)
+{
+    memset(g, 0, sizeof(*g) * FREQ_SIZE);
+
+    for (int i = 0; i < NB_BANDS - 1; i++) {
+        const int band_size = (eband5ms[i + 1] - eband5ms[i]) << FRAME_SIZE_SHIFT;
+
+        for (int j = 0; j < band_size; j++) {
+            float frac = (float)j / band_size;
+
+            g[(eband5ms[i] << FRAME_SIZE_SHIFT) + j] = (1.f - frac) * bandE[i] + frac * bandE[i + 1];
+        }
+    }
+}
+
+static void pitch_filter(AVComplexFloat *X, const AVComplexFloat *P, const float *Ex, const float *Ep,
+                         const float *Exp, const float *g)
+{
+    float newE[NB_BANDS];
+    float r[NB_BANDS];
+    float norm[NB_BANDS];
+    float rf[FREQ_SIZE] = {0};
+    float normf[FREQ_SIZE]={0};
+
+    for (int i = 0; i < NB_BANDS; i++) {
+        if (Exp[i]>g[i]) r[i] = 1;
+        else r[i] = SQUARE(Exp[i])*(1-SQUARE(g[i]))/(.001 + SQUARE(g[i])*(1-SQUARE(Exp[i])));
+        r[i]  = sqrtf(av_clipf(r[i], 0, 1));
+        r[i] *= sqrtf(Ex[i]/(1e-8+Ep[i]));
+    }
+    interp_band_gain(rf, r);
+    for (int i = 0; i < FREQ_SIZE; i++) {
+        X[i].re += rf[i]*P[i].re;
+        X[i].im += rf[i]*P[i].im;
+    }
+    compute_band_energy(newE, X);
+    for (int i = 0; i < NB_BANDS; i++) {
+        norm[i] = sqrtf(Ex[i] / (1e-8+newE[i]));
+    }
+    interp_band_gain(normf, norm);
+    for (int i = 0; i < FREQ_SIZE; i++) {
+        X[i].re *= normf[i];
+        X[i].im *= normf[i];
+    }
+}
+
+static const float tansig_table[201] = {
+    0.000000f, 0.039979f, 0.079830f, 0.119427f, 0.158649f,
+    0.197375f, 0.235496f, 0.272905f, 0.309507f, 0.345214f,
+    0.379949f, 0.413644f, 0.446244f, 0.477700f, 0.507977f,
+    0.537050f, 0.564900f, 0.591519f, 0.616909f, 0.641077f,
+    0.664037f, 0.685809f, 0.706419f, 0.725897f, 0.744277f,
+    0.761594f, 0.777888f, 0.793199f, 0.807569f, 0.821040f,
+    0.833655f, 0.845456f, 0.856485f, 0.866784f, 0.876393f,
+    0.885352f, 0.893698f, 0.901468f, 0.908698f, 0.915420f,
+    0.921669f, 0.927473f, 0.932862f, 0.937863f, 0.942503f,
+    0.946806f, 0.950795f, 0.954492f, 0.957917f, 0.961090f,
+    0.964028f, 0.966747f, 0.969265f, 0.971594f, 0.973749f,
+    0.975743f, 0.977587f, 0.979293f, 0.980869f, 0.982327f,
+    0.983675f, 0.984921f, 0.986072f, 0.987136f, 0.988119f,
+    0.989027f, 0.989867f, 0.990642f, 0.991359f, 0.992020f,
+    0.992631f, 0.993196f, 0.993718f, 0.994199f, 0.994644f,
+    0.995055f, 0.995434f, 0.995784f, 0.996108f, 0.996407f,
+    0.996682f, 0.996937f, 0.997172f, 0.997389f, 0.997590f,
+    0.997775f, 0.997946f, 0.998104f, 0.998249f, 0.998384f,
+    0.998508f, 0.998623f, 0.998728f, 0.998826f, 0.998916f,
+    0.999000f, 0.999076f, 0.999147f, 0.999213f, 0.999273f,
+    0.999329f, 0.999381f, 0.999428f, 0.999472f, 0.999513f,
+    0.999550f, 0.999585f, 0.999617f, 0.999646f, 0.999673f,
+    0.999699f, 0.999722f, 0.999743f, 0.999763f, 0.999781f,
+    0.999798f, 0.999813f, 0.999828f, 0.999841f, 0.999853f,
+    0.999865f, 0.999875f, 0.999885f, 0.999893f, 0.999902f,
+    0.999909f, 0.999916f, 0.999923f, 0.999929f, 0.999934f,
+    0.999939f, 0.999944f, 0.999948f, 0.999952f, 0.999956f,
+    0.999959f, 0.999962f, 0.999965f, 0.999968f, 0.999970f,
+    0.999973f, 0.999975f, 0.999977f, 0.999978f, 0.999980f,
+    0.999982f, 0.999983f, 0.999984f, 0.999986f, 0.999987f,
+    0.999988f, 0.999989f, 0.999990f, 0.999990f, 0.999991f,
+    0.999992f, 0.999992f, 0.999993f, 0.999994f, 0.999994f,
+    0.999994f, 0.999995f, 0.999995f, 0.999996f, 0.999996f,
+    0.999996f, 0.999997f, 0.999997f, 0.999997f, 0.999997f,
+    0.999997f, 0.999998f, 0.999998f, 0.999998f, 0.999998f,
+    0.999998f, 0.999998f, 0.999999f, 0.999999f, 0.999999f,
+    0.999999f, 0.999999f, 0.999999f, 0.999999f, 0.999999f,
+    0.999999f, 0.999999f, 0.999999f, 0.999999f, 0.999999f,
+    1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
+    1.000000f, 1.000000f, 1.000000f, 1.000000f, 1.000000f,
+    1.000000f,
+};
+
+static inline float tansig_approx(float x)
+{
+    float y, dy;
+    float sign=1;
+    int i;
+
+    /* Tests are reversed to catch NaNs */
+    if (!(x<8))
+        return 1;
+    if (!(x>-8))
+        return -1;
+    /* Another check in case of -ffast-math */
+
+    if (isnan(x))
+       return 0;
+
+    if (x < 0) {
+       x=-x;
+       sign=-1;
+    }
+    i = (int)floor(.5f+25*x);
+    x -= .04f*i;
+    y = tansig_table[i];
+    dy = 1-y*y;
+    y = y + x*dy*(1 - y*x);
+    return sign*y;
+}
+
+static inline float sigmoid_approx(float x)
+{
+    return .5f + .5f*tansig_approx(.5f*x);
+}
+
+static void compute_dense(const DenseLayer *layer, float *output, const float *input)
+{
+    const int N = layer->nb_neurons, M = layer->nb_inputs, stride = N;
+
+    for (int i = 0; i < N; i++) {
+        /* Compute update gate. */
+        float sum = layer->bias[i];
+
+        for (int j = 0; j < M; j++)
+            sum += layer->input_weights[j * stride + i] * input[j];
+
+        output[i] = WEIGHTS_SCALE * sum;
+    }
+
+    if (layer->activation == ACTIVATION_SIGMOID) {
+        for (int i = 0; i < N; i++)
+            output[i] = sigmoid_approx(output[i]);
+    } else if (layer->activation == ACTIVATION_TANH) {
+        for (int i = 0; i < N; i++)
+            output[i] = tansig_approx(output[i]);
+    } else if (layer->activation == ACTIVATION_RELU) {
+        for (int i = 0; i < N; i++)
+            output[i] = FFMAX(0, output[i]);
+    } else {
+        av_assert0(0);
+    }
+}
+
+static void compute_gru(AudioRNNContext *s, const GRULayer *gru, float *state, const float *input)
+{
+    LOCAL_ALIGNED_32(float, z, [MAX_NEURONS]);
+    LOCAL_ALIGNED_32(float, r, [MAX_NEURONS]);
+    LOCAL_ALIGNED_32(float, h, [MAX_NEURONS]);
+    const int M = gru->nb_inputs;
+    const int N = gru->nb_neurons;
+    const int AN = FFALIGN(N, 4);
+    const int AM = FFALIGN(M, 4);
+    const int stride = 3 * AN, istride = 3 * AM;
+
+    for (int i = 0; i < N; i++) {
+        /* Compute update gate. */
+        float sum = gru->bias[i];
+
+        sum += s->fdsp->scalarproduct_float(gru->input_weights + i * istride, input, AM);
+        sum += s->fdsp->scalarproduct_float(gru->recurrent_weights + i * stride, state, AN);
+        z[i] = sigmoid_approx(WEIGHTS_SCALE * sum);
+    }
+
+    for (int i = 0; i < N; i++) {
+        /* Compute reset gate. */
+        float sum = gru->bias[N + i];
+
+        sum += s->fdsp->scalarproduct_float(gru->input_weights + AM + i * istride, input, AM);
+        sum += s->fdsp->scalarproduct_float(gru->recurrent_weights + AN + i * stride, state, AN);
+        r[i] = sigmoid_approx(WEIGHTS_SCALE * sum);
+    }
+
+    for (int i = 0; i < N; i++) {
+        /* Compute output. */
+        float sum = gru->bias[2 * N + i];
+
+        sum += s->fdsp->scalarproduct_float(gru->input_weights + 2 * AM + i * istride, input, AM);
+        for (int j = 0; j < N; j++)
+            sum += gru->recurrent_weights[2 * AN + i * stride + j] * state[j] * r[j];
+
+        if (gru->activation == ACTIVATION_SIGMOID)
+            sum = sigmoid_approx(WEIGHTS_SCALE * sum);
+        else if (gru->activation == ACTIVATION_TANH)
+            sum = tansig_approx(WEIGHTS_SCALE * sum);
+        else if (gru->activation == ACTIVATION_RELU)
+            sum = FFMAX(0, WEIGHTS_SCALE * sum);
+        else
+            av_assert0(0);
+        h[i] = z[i] * state[i] + (1.f - z[i]) * sum;
+    }
+
+    RNN_COPY(state, h, N);
+}
+
+#define INPUT_SIZE 42
+
+static void compute_rnn(AudioRNNContext *s, RNNState *rnn, float *gains, float *vad, const float *input)
+{
+    LOCAL_ALIGNED_32(float, dense_out,     [MAX_NEURONS]);
+    LOCAL_ALIGNED_32(float, noise_input,   [MAX_NEURONS * 3]);
+    LOCAL_ALIGNED_32(float, denoise_input, [MAX_NEURONS * 3]);
+
+    compute_dense(rnn->model->input_dense, dense_out, input);
+    compute_gru(s, rnn->model->vad_gru, rnn->vad_gru_state, dense_out);
+    compute_dense(rnn->model->vad_output, vad, rnn->vad_gru_state);
+
+    for (int i = 0; i < rnn->model->input_dense_size; i++)
+        noise_input[i] = dense_out[i];
+    for (int i = 0; i < rnn->model->vad_gru_size; i++)
+        noise_input[i + rnn->model->input_dense_size] = rnn->vad_gru_state[i];
+    for (int i = 0; i < INPUT_SIZE; i++)
+        noise_input[i + rnn->model->input_dense_size + rnn->model->vad_gru_size] = input[i];
+
+    compute_gru(s, rnn->model->noise_gru, rnn->noise_gru_state, noise_input);
+
+    for (int i = 0; i < rnn->model->vad_gru_size; i++)
+        denoise_input[i] = rnn->vad_gru_state[i];
+    for (int i = 0; i < rnn->model->noise_gru_size; i++)
+        denoise_input[i + rnn->model->vad_gru_size] = rnn->noise_gru_state[i];
+    for (int i = 0; i < INPUT_SIZE; i++)
+        denoise_input[i + rnn->model->vad_gru_size + rnn->model->noise_gru_size] = input[i];
+
+    compute_gru(s, rnn->model->denoise_gru, rnn->denoise_gru_state, denoise_input);
+    compute_dense(rnn->model->denoise_output, gains, rnn->denoise_gru_state);
+}
+
+static float rnnoise_channel(AudioRNNContext *s, DenoiseState *st, float *out, const float *in)
+{
+    AVComplexFloat X[FREQ_SIZE];
+    AVComplexFloat P[WINDOW_SIZE];
+    float x[FRAME_SIZE];
+    float Ex[NB_BANDS], Ep[NB_BANDS];
+    float Exp[NB_BANDS];
+    float features[NB_FEATURES];
+    float g[NB_BANDS];
+    float gf[FREQ_SIZE];
+    float vad_prob = 0;
+    static const float a_hp[2] = {-1.99599, 0.99600};
+    static const float b_hp[2] = {-2, 1};
+    int silence;
+
+    biquad(x, st->mem_hp_x, in, b_hp, a_hp, FRAME_SIZE);
+    silence = compute_frame_features(s, st, X, P, Ex, Ep, Exp, features, x);
+
+    if (!silence) {
+        compute_rnn(s, &st->rnn, g, &vad_prob, features);
+        pitch_filter(X, P, Ex, Ep, Exp, g);
+        for (int i = 0; i < NB_BANDS; i++) {
+            float alpha = .6f;
+
+            g[i] = FFMAX(g[i], alpha * st->lastg[i]);
+            st->lastg[i] = g[i];
+        }
+
+        interp_band_gain(gf, g);
+
+        for (int i = 0; i < FREQ_SIZE; i++) {
+            X[i].re *= gf[i];
+            X[i].im *= gf[i];
+        }
+    }
+
+    frame_synthesis(s, st, out, X);
+
+    return vad_prob;
+}
+
+typedef struct ThreadData {
+    AVFrame *in, *out;
+} ThreadData;
+
+static int rnnoise_channels(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
+{
+    AudioRNNContext *s = ctx->priv;
+    ThreadData *td = arg;
+    AVFrame *in = td->in;
+    AVFrame *out = td->out;
+    const int start = (out->channels * jobnr) / nb_jobs;
+    const int end = (out->channels * (jobnr+1)) / nb_jobs;
+
+    for (int ch = start; ch < end; ch++) {
+        rnnoise_channel(s, &s->st[ch],
+                        (float *)out->extended_data[ch],
+                        (const float *)in->extended_data[ch]);
+    }
+
+    return 0;
+}
+
+static int filter_frame(AVFilterLink *inlink, AVFrame *in)
+{
+    AVFilterContext *ctx = inlink->dst;
+    AVFilterLink *outlink = ctx->outputs[0];
+    AVFrame *out = NULL;
+    ThreadData td;
+
+    out = ff_get_audio_buffer(outlink, FRAME_SIZE);
+    if (!out) {
+        av_frame_free(&in);
+        return AVERROR(ENOMEM);
+    }
+    out->pts = in->pts;
+
+    td.in = in; td.out = out;
+    ctx->internal->execute(ctx, rnnoise_channels, &td, NULL, FFMIN(outlink->channels,
+                                                                   ff_filter_get_nb_threads(ctx)));
+
+    av_frame_free(&in);
+    return ff_filter_frame(outlink, out);
+}
+
+static int activate(AVFilterContext *ctx)
+{
+    AVFilterLink *inlink = ctx->inputs[0];
+    AVFilterLink *outlink = ctx->outputs[0];
+    AVFrame *in = NULL;
+    int ret;
+
+    FF_FILTER_FORWARD_STATUS_BACK(outlink, inlink);
+
+    ret = ff_inlink_consume_samples(inlink, FRAME_SIZE, FRAME_SIZE, &in);
+    if (ret < 0)
+        return ret;
+
+    if (ret > 0)
+        return filter_frame(inlink, in);
+
+    FF_FILTER_FORWARD_STATUS(inlink, outlink);
+    FF_FILTER_FORWARD_WANTED(outlink, inlink);
+
+    return FFERROR_NOT_READY;
+}
+
+static av_cold int init(AVFilterContext *ctx)
+{
+    AudioRNNContext *s = ctx->priv;
+    FILE *f;
+
+    s->fdsp = avpriv_float_dsp_alloc(0);
+    if (!s->fdsp)
+        return AVERROR(ENOMEM);
+
+    if (!s->model_name)
+        return AVERROR(EINVAL);
+    f = av_fopen_utf8(s->model_name, "r");
+    if (!f)
+        return AVERROR(EINVAL);
+
+    s->model = rnnoise_model_from_file(f);
+    fclose(f);
+    if (!s->model)
+        return AVERROR(EINVAL);
+
+    for (int i = 0; i < FRAME_SIZE; i++) {
+        s->window[i] = sin(.5*M_PI*sin(.5*M_PI*(i+.5)/FRAME_SIZE) * sin(.5*M_PI*(i+.5)/FRAME_SIZE));
+        s->window[WINDOW_SIZE - 1 - i] = s->window[i];
+    }
+
+    for (int i = 0; i < NB_BANDS; i++) {
+        for (int j = 0; j < NB_BANDS; j++) {
+            s->dct_table[i*NB_BANDS + j] = cosf((i + .5f) * j * M_PI / NB_BANDS);
+            if (j == 0)
+                s->dct_table[i*NB_BANDS + j] *= sqrtf(.5);
+        }
+    }
+
+    return 0;
+}
+
+static av_cold void uninit(AVFilterContext *ctx)
+{
+    AudioRNNContext *s = ctx->priv;
+
+    av_freep(&s->fdsp);
+    rnnoise_model_free(s->model);
+    s->model = NULL;
+
+    if (s->st) {
+        for (int ch = 0; ch < s->channels; ch++) {
+            av_freep(&s->st[ch].rnn.vad_gru_state);
+            av_freep(&s->st[ch].rnn.noise_gru_state);
+            av_freep(&s->st[ch].rnn.denoise_gru_state);
+            av_tx_uninit(&s->st[ch].tx);
+            av_tx_uninit(&s->st[ch].txi);
+        }
+    }
+    av_freep(&s->st);
+}
+
+static const AVFilterPad inputs[] = {
+    {
+        .name         = "default",
+        .type         = AVMEDIA_TYPE_AUDIO,
+        .config_props = config_input,
+    },
+    { NULL }
+};
+
+static const AVFilterPad outputs[] = {
+    {
+        .name          = "default",
+        .type          = AVMEDIA_TYPE_AUDIO,
+    },
+    { NULL }
+};
+
+#define OFFSET(x) offsetof(AudioRNNContext, x)
+#define AF AV_OPT_FLAG_AUDIO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
+
+static const AVOption arnndn_options[] = {
+    { "model", "set model name", OFFSET(model_name), AV_OPT_TYPE_STRING, {.str=NULL}, 0, 0, AF },
+    { "m",     "set model name", OFFSET(model_name), AV_OPT_TYPE_STRING, {.str=NULL}, 0, 0, AF },
+    { NULL }
+};
+
+AVFILTER_DEFINE_CLASS(arnndn);
+
+AVFilter ff_af_arnndn = {
+    .name          = "arnndn",
+    .description   = NULL_IF_CONFIG_SMALL("Reduce noise from speech using Recurrent Neural Networks."),
+    .query_formats = query_formats,
+    .priv_size     = sizeof(AudioRNNContext),
+    .priv_class    = &arnndn_class,
+    .activate      = activate,
+    .init          = init,
+    .uninit        = uninit,
+    .inputs        = inputs,
+    .outputs       = outputs,
+    .flags         = AVFILTER_FLAG_SLICE_THREADS,
+};
diff --git a/libavfilter/af_asetnsamples.c b/libavfilter/af_asetnsamples.c
index e8daec8..bbc391a 100644
--- a/libavfilter/af_asetnsamples.c
+++ b/libavfilter/af_asetnsamples.c
@@ -67,8 +67,12 @@
         return ret;
 
     if (ret > 0) {
-        if ((!s->pad || (s->pad && frame->nb_samples == s->nb_out_samples)))
-            return ff_filter_frame(outlink, frame);
+        if (!s->pad || frame->nb_samples == s->nb_out_samples) {
+            ret = ff_filter_frame(outlink, frame);
+            if (ff_inlink_queued_samples(inlink) >= s->nb_out_samples)
+                ff_filter_set_ready(ctx, 100);
+            return ret;
+        }
 
         pad_frame = ff_get_audio_buffer(outlink, s->nb_out_samples);
         if (!pad_frame) {
@@ -76,6 +80,13 @@
             return AVERROR(ENOMEM);
         }
 
+        ret = av_frame_copy_props(pad_frame, frame);
+        if (ret < 0) {
+            av_frame_free(&pad_frame);
+            av_frame_free(&frame);
+            return ret;
+        }
+
         av_samples_copy(pad_frame->extended_data, frame->extended_data,
                         0, 0, frame->nb_samples, frame->channels, frame->format);
         av_samples_set_silence(pad_frame->extended_data, frame->nb_samples,
diff --git a/libavfilter/af_asoftclip.c b/libavfilter/af_asoftclip.c
new file mode 100644
index 0000000..e9e3666
--- /dev/null
+++ b/libavfilter/af_asoftclip.c
@@ -0,0 +1,319 @@
+/*
+ * Copyright (c) 2019 The FFmpeg Project
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "libavutil/channel_layout.h"
+#include "libavutil/opt.h"
+#include "avfilter.h"
+#include "audio.h"
+#include "formats.h"
+
+enum ASoftClipTypes {
+    ASC_TANH,
+    ASC_ATAN,
+    ASC_CUBIC,
+    ASC_EXP,
+    ASC_ALG,
+    ASC_QUINTIC,
+    ASC_SIN,
+    NB_TYPES,
+};
+
+typedef struct ASoftClipContext {
+    const AVClass *class;
+
+    int type;
+    double param;
+
+    void (*filter)(struct ASoftClipContext *s, void **dst, const void **src,
+                   int nb_samples, int channels, int start, int end);
+} ASoftClipContext;
+
+#define OFFSET(x) offsetof(ASoftClipContext, x)
+#define A AV_OPT_FLAG_AUDIO_PARAM|AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_RUNTIME_PARAM
+
+static const AVOption asoftclip_options[] = {
+    { "type", "set softclip type", OFFSET(type), AV_OPT_TYPE_INT,    {.i64=0},          0, NB_TYPES-1, A, "types" },
+    { "tanh",                NULL,            0, AV_OPT_TYPE_CONST,  {.i64=ASC_TANH},   0,          0, A, "types" },
+    { "atan",                NULL,            0, AV_OPT_TYPE_CONST,  {.i64=ASC_ATAN},   0,          0, A, "types" },
+    { "cubic",               NULL,            0, AV_OPT_TYPE_CONST,  {.i64=ASC_CUBIC},  0,          0, A, "types" },
+    { "exp",                 NULL,            0, AV_OPT_TYPE_CONST,  {.i64=ASC_EXP},    0,          0, A, "types" },
+    { "alg",                 NULL,            0, AV_OPT_TYPE_CONST,  {.i64=ASC_ALG},    0,          0, A, "types" },
+    { "quintic",             NULL,            0, AV_OPT_TYPE_CONST,  {.i64=ASC_QUINTIC},0,          0, A, "types" },
+    { "sin",                 NULL,            0, AV_OPT_TYPE_CONST,  {.i64=ASC_SIN},    0,          0, A, "types" },
+    { "param", "set softclip parameter", OFFSET(param), AV_OPT_TYPE_DOUBLE, {.dbl=1}, 0.01,        3, A },
+    { NULL }
+};
+
+AVFILTER_DEFINE_CLASS(asoftclip);
+
+static int query_formats(AVFilterContext *ctx)
+{
+    AVFilterFormats *formats = NULL;
+    AVFilterChannelLayouts *layouts = NULL;
+    static const enum AVSampleFormat sample_fmts[] = {
+        AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_FLTP,
+        AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_DBLP,
+        AV_SAMPLE_FMT_NONE
+    };
+    int ret;
+
+    formats = ff_make_format_list(sample_fmts);
+    if (!formats)
+        return AVERROR(ENOMEM);
+    ret = ff_set_common_formats(ctx, formats);
+    if (ret < 0)
+        return ret;
+
+    layouts = ff_all_channel_counts();
+    if (!layouts)
+        return AVERROR(ENOMEM);
+
+    ret = ff_set_common_channel_layouts(ctx, layouts);
+    if (ret < 0)
+        return ret;
+
+    formats = ff_all_samplerates();
+    return ff_set_common_samplerates(ctx, formats);
+}
+
+#define SQR(x) ((x) * (x))
+
+static void filter_flt(ASoftClipContext *s,
+                       void **dptr, const void **sptr,
+                       int nb_samples, int channels,
+                       int start, int end)
+{
+    float param = s->param;
+
+    for (int c = start; c < end; c++) {
+        const float *src = sptr[c];
+        float *dst = dptr[c];
+
+        switch (s->type) {
+        case ASC_TANH:
+            for (int n = 0; n < nb_samples; n++) {
+                dst[n] = tanhf(src[n] * param);
+            }
+            break;
+        case ASC_ATAN:
+            for (int n = 0; n < nb_samples; n++)
+                dst[n] = 2.f / M_PI * atanf(src[n] * param);
+            break;
+        case ASC_CUBIC:
+            for (int n = 0; n < nb_samples; n++) {
+                if (FFABS(src[n]) >= 1.5f)
+                    dst[n] = FFSIGN(src[n]);
+                else
+                    dst[n] = src[n] - 0.1481f * powf(src[n], 3.f);
+            }
+            break;
+        case ASC_EXP:
+            for (int n = 0; n < nb_samples; n++)
+                dst[n] = 2.f / (1.f + expf(-2.f * src[n])) - 1.;
+            break;
+        case ASC_ALG:
+            for (int n = 0; n < nb_samples; n++)
+                dst[n] = src[n] / (sqrtf(param + src[n] * src[n]));
+            break;
+        case ASC_QUINTIC:
+            for (int n = 0; n < nb_samples; n++) {
+                if (FFABS(src[n]) >= 1.25)
+                    dst[n] = FFSIGN(src[n]);
+                else
+                    dst[n] = src[n] - 0.08192f * powf(src[n], 5.f);
+            }
+            break;
+        case ASC_SIN:
+            for (int n = 0; n < nb_samples; n++) {
+                if (FFABS(src[n]) >= M_PI_2)
+                    dst[n] = FFSIGN(src[n]);
+                else
+                    dst[n] = sinf(src[n]);
+            }
+            break;
+        }
+    }
+}
+
+static void filter_dbl(ASoftClipContext *s,
+                       void **dptr, const void **sptr,
+                       int nb_samples, int channels,
+                       int start, int end)
+{
+    double param = s->param;
+
+    for (int c = start; c < end; c++) {
+        const double *src = sptr[c];
+        double *dst = dptr[c];
+
+        switch (s->type) {
+        case ASC_TANH:
+            for (int n = 0; n < nb_samples; n++) {
+                dst[n] = tanh(src[n] * param);
+            }
+            break;
+        case ASC_ATAN:
+            for (int n = 0; n < nb_samples; n++)
+                dst[n] = 2. / M_PI * atan(src[n] * param);
+            break;
+        case ASC_CUBIC:
+            for (int n = 0; n < nb_samples; n++) {
+                if (FFABS(src[n]) >= 1.5)
+                    dst[n] = FFSIGN(src[n]);
+                else
+                    dst[n] = src[n] - 0.1481 * pow(src[n], 3.);
+            }
+            break;
+        case ASC_EXP:
+            for (int n = 0; n < nb_samples; n++)
+                dst[n] = 2. / (1. + exp(-2. * src[n])) - 1.;
+            break;
+        case ASC_ALG:
+            for (int n = 0; n < nb_samples; n++)
+                dst[n] = src[n] / (sqrt(param + src[n] * src[n]));
+            break;
+        case ASC_QUINTIC:
+            for (int n = 0; n < nb_samples; n++) {
+                if (FFABS(src[n]) >= 1.25)
+                    dst[n] = FFSIGN(src[n]);
+                else
+                    dst[n] = src[n] - 0.08192 * pow(src[n], 5.);
+            }
+            break;
+        case ASC_SIN:
+            for (int n = 0; n < nb_samples; n++) {
+                if (FFABS(src[n]) >= M_PI_2)
+                    dst[n] = FFSIGN(src[n]);
+                else
+                    dst[n] = sin(src[n]);
+            }
+            break;
+        }
+    }
+}
+
+static int config_input(AVFilterLink *inlink)
+{
+    AVFilterContext *ctx = inlink->dst;
+    ASoftClipContext *s = ctx->priv;
+
+    switch (inlink->format) {
+    case AV_SAMPLE_FMT_FLT:
+    case AV_SAMPLE_FMT_FLTP: s->filter = filter_flt; break;
+    case AV_SAMPLE_FMT_DBL:
+    case AV_SAMPLE_FMT_DBLP: s->filter = filter_dbl; break;
+    }
+
+    return 0;
+}
+
+typedef struct ThreadData {
+    AVFrame *in, *out;
+    int nb_samples;
+    int channels;
+} ThreadData;
+
+static int filter_channels(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
+{
+    ASoftClipContext *s = ctx->priv;
+    ThreadData *td = arg;
+    AVFrame *out = td->out;
+    AVFrame *in = td->in;
+    const int channels = td->channels;
+    const int nb_samples = td->nb_samples;
+    const int start = (channels * jobnr) / nb_jobs;
+    const int end = (channels * (jobnr+1)) / nb_jobs;
+
+    s->filter(s, (void **)out->extended_data, (const void **)in->extended_data,
+              nb_samples, channels, start, end);
+
+    return 0;
+}
+
+static int filter_frame(AVFilterLink *inlink, AVFrame *in)
+{
+    AVFilterContext *ctx = inlink->dst;
+    AVFilterLink *outlink = ctx->outputs[0];
+    int nb_samples, channels;
+    ThreadData td;
+    AVFrame *out;
+
+    if (av_frame_is_writable(in)) {
+        out = in;
+    } else {
+        out = ff_get_audio_buffer(outlink, in->nb_samples);
+        if (!out) {
+            av_frame_free(&in);
+            return AVERROR(ENOMEM);
+        }
+        av_frame_copy_props(out, in);
+    }
+
+    if (av_sample_fmt_is_planar(in->format)) {
+        nb_samples = in->nb_samples;
+        channels = in->channels;
+    } else {
+        nb_samples = in->channels * in->nb_samples;
+        channels = 1;
+    }
+
+    td.in = in;
+    td.out = out;
+    td.nb_samples = nb_samples;
+    td.channels = channels;
+    ctx->internal->execute(ctx, filter_channels, &td, NULL, FFMIN(channels,
+                                                            ff_filter_get_nb_threads(ctx)));
+
+    if (out != in)
+        av_frame_free(&in);
+
+    return ff_filter_frame(outlink, out);
+}
+
+static const AVFilterPad inputs[] = {
+    {
+        .name         = "default",
+        .type         = AVMEDIA_TYPE_AUDIO,
+        .filter_frame = filter_frame,
+        .config_props = config_input,
+    },
+    { NULL }
+};
+
+static const AVFilterPad outputs[] = {
+    {
+        .name = "default",
+        .type = AVMEDIA_TYPE_AUDIO,
+    },
+    { NULL }
+};
+
+AVFilter ff_af_asoftclip = {
+    .name           = "asoftclip",
+    .description    = NULL_IF_CONFIG_SMALL("Audio Soft Clipper."),
+    .query_formats  = query_formats,
+    .priv_size      = sizeof(ASoftClipContext),
+    .priv_class     = &asoftclip_class,
+    .inputs         = inputs,
+    .outputs        = outputs,
+    .process_command = ff_filter_process_command,
+    .flags          = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC |
+                      AVFILTER_FLAG_SLICE_THREADS,
+};
diff --git a/libavfilter/af_asr.c b/libavfilter/af_asr.c
new file mode 100644
index 0000000..0c08df1
--- /dev/null
+++ b/libavfilter/af_asr.c
@@ -0,0 +1,181 @@
+/*
+ * Copyright (c) 2019 Paul B Mahol
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include <pocketsphinx/pocketsphinx.h>
+
+#include "libavutil/avassert.h"
+#include "libavutil/avstring.h"
+#include "libavutil/channel_layout.h"
+#include "libavutil/opt.h"
+#include "audio.h"
+#include "avfilter.h"
+#include "internal.h"
+
+typedef struct ASRContext {
+    const AVClass *class;
+
+    int   rate;
+    char *hmm;
+    char *dict;
+    char *lm;
+    char *lmctl;
+    char *lmname;
+    char *logfn;
+
+    ps_decoder_t *ps;
+    cmd_ln_t *config;
+
+    int utt_started;
+} ASRContext;
+
+#define OFFSET(x) offsetof(ASRContext, x)
+#define FLAGS AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_FILTERING_PARAM
+static const AVOption asr_options[] = {
+    { "rate",  "set sampling rate",                             OFFSET(rate),   AV_OPT_TYPE_INT,    {.i64=16000}, 0, INT_MAX, .flags = FLAGS },
+    { "hmm",   "set directory containing acoustic model files", OFFSET(hmm),    AV_OPT_TYPE_STRING, {.str=NULL},              .flags = FLAGS },
+    { "dict",  "set pronunciation dictionary",                  OFFSET(dict),   AV_OPT_TYPE_STRING, {.str=NULL},              .flags = FLAGS },
+    { "lm",    "set language model file",                       OFFSET(lm),     AV_OPT_TYPE_STRING, {.str=NULL},              .flags = FLAGS },
+    { "lmctl", "set language model set",                        OFFSET(lmctl),  AV_OPT_TYPE_STRING, {.str=NULL},              .flags = FLAGS },
+    { "lmname","set which language model to use",               OFFSET(lmname), AV_OPT_TYPE_STRING, {.str=NULL},              .flags = FLAGS },
+    { "logfn", "set output for log messages",                   OFFSET(logfn),  AV_OPT_TYPE_STRING, {.str="/dev/null"},       .flags = FLAGS },
+    { NULL }
+};
+
+AVFILTER_DEFINE_CLASS(asr);
+
+static int filter_frame(AVFilterLink *inlink, AVFrame *in)
+{
+    AVFilterContext *ctx = inlink->dst;
+    AVDictionary **metadata = &in->metadata;
+    ASRContext *s = ctx->priv;
+    int have_speech;
+    const char *speech;
+
+    ps_process_raw(s->ps, (const int16_t *)in->data[0], in->nb_samples, 0, 0);
+    have_speech = ps_get_in_speech(s->ps);
+    if (have_speech && !s->utt_started)
+        s->utt_started = 1;
+    if (!have_speech && s->utt_started) {
+        ps_end_utt(s->ps);
+        speech = ps_get_hyp(s->ps, NULL);
+        if (speech != NULL)
+            av_dict_set(metadata, "lavfi.asr.text", speech, 0);
+        ps_start_utt(s->ps);
+        s->utt_started = 0;
+    }
+
+    return ff_filter_frame(ctx->outputs[0], in);
+}
+
+static int config_input(AVFilterLink *inlink)
+{
+    AVFilterContext *ctx = inlink->dst;
+    ASRContext *s = ctx->priv;
+
+    ps_start_utt(s->ps);
+
+    return 0;
+}
+
+static av_cold int asr_init(AVFilterContext *ctx)
+{
+    ASRContext *s = ctx->priv;
+    const float frate = s->rate;
+    char *rate = av_asprintf("%f", frate);
+    const char *argv[] = { "-logfn",    s->logfn,
+                           "-hmm",      s->hmm,
+                           "-lm",       s->lm,
+                           "-lmctl",    s->lmctl,
+                           "-lmname",   s->lmname,
+                           "-dict",     s->dict,
+                           "-samprate", rate,
+                           NULL };
+
+    s->config = cmd_ln_parse_r(NULL, ps_args(), 14, (char **)argv, 0);
+    av_free(rate);
+    if (!s->config)
+        return AVERROR(ENOMEM);
+
+    ps_default_search_args(s->config);
+    s->ps = ps_init(s->config);
+    if (!s->ps)
+        return AVERROR(ENOMEM);
+
+    return 0;
+}
+
+static int query_formats(AVFilterContext *ctx)
+{
+    ASRContext *s = ctx->priv;
+    int sample_rates[] = { s->rate, -1 };
+    int ret;
+
+    AVFilterFormats *formats = NULL;
+    AVFilterChannelLayouts *layout = NULL;
+
+    if ((ret = ff_add_format                 (&formats, AV_SAMPLE_FMT_S16                 )) < 0 ||
+        (ret = ff_set_common_formats         (ctx     , formats                           )) < 0 ||
+        (ret = ff_add_channel_layout         (&layout , AV_CH_LAYOUT_MONO                 )) < 0 ||
+        (ret = ff_set_common_channel_layouts (ctx     , layout                            )) < 0 ||
+        (ret = ff_set_common_samplerates     (ctx     , ff_make_format_list(sample_rates) )) < 0)
+        return ret;
+
+    return 0;
+}
+
+static av_cold void asr_uninit(AVFilterContext *ctx)
+{
+    ASRContext *s = ctx->priv;
+
+    ps_free(s->ps);
+    s->ps = NULL;
+    cmd_ln_free_r(s->config);
+    s->config = NULL;
+}
+
+static const AVFilterPad asr_inputs[] = {
+    {
+        .name         = "default",
+        .type         = AVMEDIA_TYPE_AUDIO,
+        .filter_frame = filter_frame,
+        .config_props = config_input,
+    },
+    { NULL }
+};
+
+static const AVFilterPad asr_outputs[] = {
+    {
+        .name = "default",
+        .type = AVMEDIA_TYPE_AUDIO,
+    },
+    { NULL }
+};
+
+AVFilter ff_af_asr = {
+    .name          = "asr",
+    .description   = NULL_IF_CONFIG_SMALL("Automatic Speech Recognition."),
+    .priv_size     = sizeof(ASRContext),
+    .priv_class    = &asr_class,
+    .init          = asr_init,
+    .uninit        = asr_uninit,
+    .query_formats = query_formats,
+    .inputs        = asr_inputs,
+    .outputs       = asr_outputs,
+};
diff --git a/libavfilter/af_astats.c b/libavfilter/af_astats.c
index a91cfdc..2703638 100644
--- a/libavfilter/af_astats.c
+++ b/libavfilter/af_astats.c
@@ -20,12 +20,46 @@
  */
 
 #include <float.h>
+#include <math.h>
 
 #include "libavutil/opt.h"
 #include "audio.h"
 #include "avfilter.h"
 #include "internal.h"
 
+#define HISTOGRAM_SIZE                  8192
+#define HISTOGRAM_MAX                   (HISTOGRAM_SIZE-1)
+
+#define MEASURE_ALL                     UINT_MAX
+#define MEASURE_NONE                           0
+
+#define MEASURE_DC_OFFSET               (1 <<  0)
+#define MEASURE_MIN_LEVEL               (1 <<  1)
+#define MEASURE_MAX_LEVEL               (1 <<  2)
+#define MEASURE_MIN_DIFFERENCE          (1 <<  3)
+#define MEASURE_MAX_DIFFERENCE          (1 <<  4)
+#define MEASURE_MEAN_DIFFERENCE         (1 <<  5)
+#define MEASURE_RMS_DIFFERENCE          (1 <<  6)
+#define MEASURE_PEAK_LEVEL              (1 <<  7)
+#define MEASURE_RMS_LEVEL               (1 <<  8)
+#define MEASURE_RMS_PEAK                (1 <<  9)
+#define MEASURE_RMS_TROUGH              (1 << 10)
+#define MEASURE_CREST_FACTOR            (1 << 11)
+#define MEASURE_FLAT_FACTOR             (1 << 12)
+#define MEASURE_PEAK_COUNT              (1 << 13)
+#define MEASURE_BIT_DEPTH               (1 << 14)
+#define MEASURE_DYNAMIC_RANGE           (1 << 15)
+#define MEASURE_ZERO_CROSSINGS          (1 << 16)
+#define MEASURE_ZERO_CROSSINGS_RATE     (1 << 17)
+#define MEASURE_NUMBER_OF_SAMPLES       (1 << 18)
+#define MEASURE_NUMBER_OF_NANS          (1 << 19)
+#define MEASURE_NUMBER_OF_INFS          (1 << 20)
+#define MEASURE_NUMBER_OF_DENORMALS     (1 << 21)
+#define MEASURE_NOISE_FLOOR             (1 << 22)
+#define MEASURE_NOISE_FLOOR_COUNT       (1 << 23)
+
+#define MEASURE_MINMAXPEAK              (MEASURE_MIN_LEVEL | MEASURE_MAX_LEVEL | MEASURE_PEAK_LEVEL)
+
 typedef struct ChannelStats {
     double last;
     double last_non_zero;
@@ -41,8 +75,17 @@
     double diff1_sum_x2;
     uint64_t mask, imask;
     uint64_t min_count, max_count;
+    uint64_t noise_floor_count;
     uint64_t zero_runs;
     uint64_t nb_samples;
+    uint64_t nb_nans;
+    uint64_t nb_infs;
+    uint64_t nb_denormals;
+    double *win_samples;
+    unsigned histogram[HISTOGRAM_SIZE];
+    int win_pos;
+    int max_index;
+    double noise_floor;
 } ChannelStats;
 
 typedef struct AudioStatsContext {
@@ -56,6 +99,10 @@
     int reset_count;
     int nb_frames;
     int maxbitdepth;
+    int measure_perchannel;
+    int measure_overall;
+    int is_float;
+    int is_double;
 } AudioStatsContext;
 
 #define OFFSET(x) offsetof(AudioStatsContext, x)
@@ -65,6 +112,34 @@
     { "length", "set the window length", OFFSET(time_constant), AV_OPT_TYPE_DOUBLE, {.dbl=.05}, .01, 10, FLAGS },
     { "metadata", "inject metadata in the filtergraph", OFFSET(metadata), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS },
     { "reset", "recalculate stats after this many frames", OFFSET(reset_count), AV_OPT_TYPE_INT, {.i64=0}, 0, INT_MAX, FLAGS },
+    { "measure_perchannel", "only measure_perchannel these per-channel statistics", OFFSET(measure_perchannel), AV_OPT_TYPE_FLAGS, {.i64=MEASURE_ALL}, 0, UINT_MAX, FLAGS, "measure" },
+      { "none"                      , "", 0, AV_OPT_TYPE_CONST, {.i64=MEASURE_NONE                }, 0, 0, FLAGS, "measure" },
+      { "all"                       , "", 0, AV_OPT_TYPE_CONST, {.i64=MEASURE_ALL                 }, 0, 0, FLAGS, "measure" },
+      { "DC_offset"                 , "", 0, AV_OPT_TYPE_CONST, {.i64=MEASURE_DC_OFFSET           }, 0, 0, FLAGS, "measure" },
+      { "Min_level"                 , "", 0, AV_OPT_TYPE_CONST, {.i64=MEASURE_MIN_LEVEL           }, 0, 0, FLAGS, "measure" },
+      { "Max_level"                 , "", 0, AV_OPT_TYPE_CONST, {.i64=MEASURE_MAX_LEVEL           }, 0, 0, FLAGS, "measure" },
+      { "Min_difference"            , "", 0, AV_OPT_TYPE_CONST, {.i64=MEASURE_MIN_DIFFERENCE      }, 0, 0, FLAGS, "measure" },
+      { "Max_difference"            , "", 0, AV_OPT_TYPE_CONST, {.i64=MEASURE_MAX_DIFFERENCE      }, 0, 0, FLAGS, "measure" },
+      { "Mean_difference"           , "", 0, AV_OPT_TYPE_CONST, {.i64=MEASURE_MEAN_DIFFERENCE     }, 0, 0, FLAGS, "measure" },
+      { "RMS_difference"            , "", 0, AV_OPT_TYPE_CONST, {.i64=MEASURE_RMS_DIFFERENCE      }, 0, 0, FLAGS, "measure" },
+      { "Peak_level"                , "", 0, AV_OPT_TYPE_CONST, {.i64=MEASURE_PEAK_LEVEL          }, 0, 0, FLAGS, "measure" },
+      { "RMS_level"                 , "", 0, AV_OPT_TYPE_CONST, {.i64=MEASURE_RMS_LEVEL           }, 0, 0, FLAGS, "measure" },
+      { "RMS_peak"                  , "", 0, AV_OPT_TYPE_CONST, {.i64=MEASURE_RMS_PEAK            }, 0, 0, FLAGS, "measure" },
+      { "RMS_trough"                , "", 0, AV_OPT_TYPE_CONST, {.i64=MEASURE_RMS_TROUGH          }, 0, 0, FLAGS, "measure" },
+      { "Crest_factor"              , "", 0, AV_OPT_TYPE_CONST, {.i64=MEASURE_CREST_FACTOR        }, 0, 0, FLAGS, "measure" },
+      { "Flat_factor"               , "", 0, AV_OPT_TYPE_CONST, {.i64=MEASURE_FLAT_FACTOR         }, 0, 0, FLAGS, "measure" },
+      { "Peak_count"                , "", 0, AV_OPT_TYPE_CONST, {.i64=MEASURE_PEAK_COUNT          }, 0, 0, FLAGS, "measure" },
+      { "Bit_depth"                 , "", 0, AV_OPT_TYPE_CONST, {.i64=MEASURE_BIT_DEPTH           }, 0, 0, FLAGS, "measure" },
+      { "Dynamic_range"             , "", 0, AV_OPT_TYPE_CONST, {.i64=MEASURE_DYNAMIC_RANGE       }, 0, 0, FLAGS, "measure" },
+      { "Zero_crossings"            , "", 0, AV_OPT_TYPE_CONST, {.i64=MEASURE_ZERO_CROSSINGS      }, 0, 0, FLAGS, "measure" },
+      { "Zero_crossings_rate"       , "", 0, AV_OPT_TYPE_CONST, {.i64=MEASURE_ZERO_CROSSINGS_RATE }, 0, 0, FLAGS, "measure" },
+      { "Noise_floor"               , "", 0, AV_OPT_TYPE_CONST, {.i64=MEASURE_NOISE_FLOOR         }, 0, 0, FLAGS, "measure" },
+      { "Noise_floor_count"         , "", 0, AV_OPT_TYPE_CONST, {.i64=MEASURE_NOISE_FLOOR_COUNT   }, 0, 0, FLAGS, "measure" },
+      { "Number_of_samples"         , "", 0, AV_OPT_TYPE_CONST, {.i64=MEASURE_NUMBER_OF_SAMPLES   }, 0, 0, FLAGS, "measure" },
+      { "Number_of_NaNs"            , "", 0, AV_OPT_TYPE_CONST, {.i64=MEASURE_NUMBER_OF_NANS      }, 0, 0, FLAGS, "measure" },
+      { "Number_of_Infs"            , "", 0, AV_OPT_TYPE_CONST, {.i64=MEASURE_NUMBER_OF_INFS      }, 0, 0, FLAGS, "measure" },
+      { "Number_of_denormals"       , "", 0, AV_OPT_TYPE_CONST, {.i64=MEASURE_NUMBER_OF_DENORMALS }, 0, 0, FLAGS, "measure" },
+    { "measure_overall", "only measure_perchannel these overall statistics", OFFSET(measure_overall), AV_OPT_TYPE_FLAGS, {.i64=MEASURE_ALL}, 0, UINT_MAX, FLAGS, "measure" },
     { NULL }
 };
 
@@ -112,10 +187,10 @@
         ChannelStats *p = &s->chstats[c];
 
         p->min = p->nmin = p->min_sigma_x2 = DBL_MAX;
-        p->max = p->nmax = p->max_sigma_x2 = DBL_MIN;
+        p->max = p->nmax = p->max_sigma_x2 =-DBL_MAX;
         p->min_non_zero = DBL_MAX;
         p->min_diff = DBL_MAX;
-        p->max_diff = DBL_MIN;
+        p->max_diff = 0;
         p->sigma_x = 0;
         p->sigma_x2 = 0;
         p->avg_sigma_x2 = 0;
@@ -131,6 +206,15 @@
         p->max_count = 0;
         p->zero_runs = 0;
         p->nb_samples = 0;
+        p->nb_nans = 0;
+        p->nb_infs = 0;
+        p->nb_denormals = 0;
+        p->last = NAN;
+        p->noise_floor = NAN;
+        p->noise_floor_count = 0;
+        p->win_pos = 0;
+        memset(p->win_samples, 0, s->tc_samples * sizeof(*p->win_samples));
+        memset(p->histogram, 0, sizeof(p->histogram));
     }
 }
 
@@ -141,11 +225,26 @@
     s->chstats = av_calloc(sizeof(*s->chstats), outlink->channels);
     if (!s->chstats)
         return AVERROR(ENOMEM);
-    s->nb_channels = outlink->channels;
-    s->mult = exp((-1 / s->time_constant / outlink->sample_rate));
+
     s->tc_samples = 5 * s->time_constant * outlink->sample_rate + .5;
+    s->nb_channels = outlink->channels;
+
+    for (int i = 0; i < s->nb_channels; i++) {
+        ChannelStats *p = &s->chstats[i];
+
+        p->win_samples = av_calloc(s->tc_samples, sizeof(*p->win_samples));
+        if (!p->win_samples)
+            return AVERROR(ENOMEM);
+    }
+
+    s->mult = exp((-1 / s->time_constant / outlink->sample_rate));
     s->nb_frames = 0;
     s->maxbitdepth = av_get_bytes_per_sample(outlink->format) * 8;
+    s->is_double = outlink->format == AV_SAMPLE_FMT_DBL  ||
+                   outlink->format == AV_SAMPLE_FMT_DBLP;
+
+    s->is_float = outlink->format == AV_SAMPLE_FMT_FLT  ||
+                  outlink->format == AV_SAMPLE_FMT_FLTP;
 
     reset_stats(s);
 
@@ -168,8 +267,19 @@
             depth->num++;
 }
 
+static inline void update_minmax(AudioStatsContext *s, ChannelStats *p, double d)
+{
+    if (d < p->min)
+        p->min = d;
+    if (d > p->max)
+        p->max = d;
+}
+
 static inline void update_stat(AudioStatsContext *s, ChannelStats *p, double d, double nd, int64_t i)
 {
+    double drop;
+    int index;
+
     if (d < p->min) {
         p->min = d;
         p->nmin = nd;
@@ -207,14 +317,54 @@
     p->sigma_x += nd;
     p->sigma_x2 += nd * nd;
     p->avg_sigma_x2 = p->avg_sigma_x2 * s->mult + (1.0 - s->mult) * nd * nd;
-    p->min_diff = FFMIN(p->min_diff, fabs(d - p->last));
-    p->max_diff = FFMAX(p->max_diff, fabs(d - p->last));
-    p->diff1_sum += fabs(d - p->last);
-    p->diff1_sum_x2 += (d - p->last) * (d - p->last);
+    if (!isnan(p->last)) {
+        p->min_diff = FFMIN(p->min_diff, fabs(d - p->last));
+        p->max_diff = FFMAX(p->max_diff, fabs(d - p->last));
+        p->diff1_sum += fabs(d - p->last);
+        p->diff1_sum_x2 += (d - p->last) * (d - p->last);
+    }
     p->last = d;
     p->mask |= i;
     p->imask &= i;
 
+    drop = p->win_samples[p->win_pos];
+    p->win_samples[p->win_pos] = nd;
+    index = av_clip(FFABS(nd) * HISTOGRAM_MAX, 0, HISTOGRAM_MAX);
+    p->max_index = FFMAX(p->max_index, index);
+    p->histogram[index]++;
+    if (!isnan(p->noise_floor))
+        p->histogram[av_clip(FFABS(drop) * HISTOGRAM_MAX, 0, HISTOGRAM_MAX)]--;
+    p->win_pos++;
+
+    while (p->histogram[p->max_index] == 0)
+        p->max_index--;
+    if (p->win_pos >= s->tc_samples || !isnan(p->noise_floor)) {
+        double noise_floor = 1.;
+
+        for (int i = p->max_index; i >= 0; i--) {
+            if (p->histogram[i]) {
+                noise_floor = i / (double)HISTOGRAM_MAX;
+                break;
+            }
+        }
+
+        if (isnan(p->noise_floor)) {
+            p->noise_floor = noise_floor;
+            p->noise_floor_count = 1;
+        } else {
+            if (noise_floor < p->noise_floor) {
+                p->noise_floor = noise_floor;
+                p->noise_floor_count = 1;
+            } else if (noise_floor == p->noise_floor) {
+                p->noise_floor_count++;
+            }
+        }
+    }
+
+    if (p->win_pos >= s->tc_samples) {
+        p->win_pos = 0;
+    }
+
     if (p->nb_samples >= s->tc_samples) {
         p->max_sigma_x2 = FFMAX(p->max_sigma_x2, p->avg_sigma_x2);
         p->min_sigma_x2 = FFMIN(p->min_sigma_x2, p->avg_sigma_x2);
@@ -222,6 +372,24 @@
     p->nb_samples++;
 }
 
+static inline void update_float_stat(AudioStatsContext *s, ChannelStats *p, float d)
+{
+    int type = fpclassify(d);
+
+    p->nb_nans      += type == FP_NAN;
+    p->nb_infs      += type == FP_INFINITE;
+    p->nb_denormals += type == FP_SUBNORMAL;
+}
+
+static inline void update_double_stat(AudioStatsContext *s, ChannelStats *p, double d)
+{
+    int type = fpclassify(d);
+
+    p->nb_nans      += type == FP_NAN;
+    p->nb_infs      += type == FP_INFINITE;
+    p->nb_denormals += type == FP_SUBNORMAL;
+}
+
 static void set_meta(AVDictionary **metadata, int chan, const char *key,
                      const char *fmt, double val)
 {
@@ -240,17 +408,19 @@
 
 static void set_metadata(AudioStatsContext *s, AVDictionary **metadata)
 {
-    uint64_t mask = 0, imask = 0xFFFFFFFFFFFFFFFF, min_count = 0, max_count = 0, nb_samples = 0;
+    uint64_t mask = 0, imask = 0xFFFFFFFFFFFFFFFF, min_count = 0, max_count = 0, nb_samples = 0, noise_floor_count = 0;
+    uint64_t nb_nans = 0, nb_infs = 0, nb_denormals = 0;
     double min_runs = 0, max_runs = 0,
-           min = DBL_MAX, max = DBL_MIN, min_diff = DBL_MAX, max_diff = 0,
-           nmin = DBL_MAX, nmax = DBL_MIN,
+           min = DBL_MAX, max =-DBL_MAX, min_diff = DBL_MAX, max_diff = 0,
+           nmin = DBL_MAX, nmax =-DBL_MAX,
            max_sigma_x = 0,
            diff1_sum = 0,
            diff1_sum_x2 = 0,
            sigma_x = 0,
            sigma_x2 = 0,
+           noise_floor = 0,
            min_sigma_x2 = DBL_MAX,
-           max_sigma_x2 = DBL_MIN;
+           max_sigma_x2 =-DBL_MAX;
     AVRational depth;
     int c;
 
@@ -272,6 +442,8 @@
         max_sigma_x2 = FFMAX(max_sigma_x2, p->max_sigma_x2);
         sigma_x += p->sigma_x;
         sigma_x2 += p->sigma_x2;
+        noise_floor = FFMAX(noise_floor, p->noise_floor);
+        noise_floor_count += p->noise_floor_count;
         min_count += p->min_count;
         max_count += p->max_count;
         min_runs += p->min_runs;
@@ -279,56 +451,191 @@
         mask |= p->mask;
         imask &= p->imask;
         nb_samples += p->nb_samples;
+        nb_nans += p->nb_nans;
+        nb_infs += p->nb_infs;
+        nb_denormals += p->nb_denormals;
         if (fabs(p->sigma_x) > fabs(max_sigma_x))
             max_sigma_x = p->sigma_x;
 
-        set_meta(metadata, c + 1, "DC_offset", "%f", p->sigma_x / p->nb_samples);
-        set_meta(metadata, c + 1, "Min_level", "%f", p->min);
-        set_meta(metadata, c + 1, "Max_level", "%f", p->max);
-        set_meta(metadata, c + 1, "Min_difference", "%f", p->min_diff);
-        set_meta(metadata, c + 1, "Max_difference", "%f", p->max_diff);
-        set_meta(metadata, c + 1, "Mean_difference", "%f", p->diff1_sum / (p->nb_samples - 1));
-        set_meta(metadata, c + 1, "RMS_difference", "%f", sqrt(p->diff1_sum_x2 / (p->nb_samples - 1)));
-        set_meta(metadata, c + 1, "Peak_level", "%f", LINEAR_TO_DB(FFMAX(-p->nmin, p->nmax)));
-        set_meta(metadata, c + 1, "RMS_level", "%f", LINEAR_TO_DB(sqrt(p->sigma_x2 / p->nb_samples)));
-        set_meta(metadata, c + 1, "RMS_peak", "%f", LINEAR_TO_DB(sqrt(p->max_sigma_x2)));
-        set_meta(metadata, c + 1, "RMS_trough", "%f", LINEAR_TO_DB(sqrt(p->min_sigma_x2)));
-        set_meta(metadata, c + 1, "Crest_factor", "%f", p->sigma_x2 ? FFMAX(-p->min, p->max) / sqrt(p->sigma_x2 / p->nb_samples) : 1);
-        set_meta(metadata, c + 1, "Flat_factor", "%f", LINEAR_TO_DB((p->min_runs + p->max_runs) / (p->min_count + p->max_count)));
-        set_meta(metadata, c + 1, "Peak_count", "%f", (float)(p->min_count + p->max_count));
-        bit_depth(s, p->mask, p->imask, &depth);
-        set_meta(metadata, c + 1, "Bit_depth", "%f", depth.num);
-        set_meta(metadata, c + 1, "Bit_depth2", "%f", depth.den);
-        set_meta(metadata, c + 1, "Dynamic_range", "%f", LINEAR_TO_DB(2 * FFMAX(FFABS(p->min), FFABS(p->max))/ p->min_non_zero));
-        set_meta(metadata, c + 1, "Zero_crossings", "%f", p->zero_runs);
-        set_meta(metadata, c + 1, "Zero_crossings_rate", "%f", p->zero_runs/(double)p->nb_samples);
+        if (s->measure_perchannel & MEASURE_DC_OFFSET)
+            set_meta(metadata, c + 1, "DC_offset", "%f", p->sigma_x / p->nb_samples);
+        if (s->measure_perchannel & MEASURE_MIN_LEVEL)
+            set_meta(metadata, c + 1, "Min_level", "%f", p->min);
+        if (s->measure_perchannel & MEASURE_MAX_LEVEL)
+            set_meta(metadata, c + 1, "Max_level", "%f", p->max);
+        if (s->measure_perchannel & MEASURE_MIN_DIFFERENCE)
+            set_meta(metadata, c + 1, "Min_difference", "%f", p->min_diff);
+        if (s->measure_perchannel & MEASURE_MAX_DIFFERENCE)
+            set_meta(metadata, c + 1, "Max_difference", "%f", p->max_diff);
+        if (s->measure_perchannel & MEASURE_MEAN_DIFFERENCE)
+            set_meta(metadata, c + 1, "Mean_difference", "%f", p->diff1_sum / (p->nb_samples - 1));
+        if (s->measure_perchannel & MEASURE_RMS_DIFFERENCE)
+            set_meta(metadata, c + 1, "RMS_difference", "%f", sqrt(p->diff1_sum_x2 / (p->nb_samples - 1)));
+        if (s->measure_perchannel & MEASURE_PEAK_LEVEL)
+            set_meta(metadata, c + 1, "Peak_level", "%f", LINEAR_TO_DB(FFMAX(-p->nmin, p->nmax)));
+        if (s->measure_perchannel & MEASURE_RMS_LEVEL)
+            set_meta(metadata, c + 1, "RMS_level", "%f", LINEAR_TO_DB(sqrt(p->sigma_x2 / p->nb_samples)));
+        if (s->measure_perchannel & MEASURE_RMS_PEAK)
+            set_meta(metadata, c + 1, "RMS_peak", "%f", LINEAR_TO_DB(sqrt(p->max_sigma_x2)));
+        if (s->measure_perchannel & MEASURE_RMS_TROUGH)
+            set_meta(metadata, c + 1, "RMS_trough", "%f", LINEAR_TO_DB(sqrt(p->min_sigma_x2)));
+        if (s->measure_perchannel & MEASURE_CREST_FACTOR)
+            set_meta(metadata, c + 1, "Crest_factor", "%f", p->sigma_x2 ? FFMAX(-p->min, p->max) / sqrt(p->sigma_x2 / p->nb_samples) : 1);
+        if (s->measure_perchannel & MEASURE_FLAT_FACTOR)
+            set_meta(metadata, c + 1, "Flat_factor", "%f", LINEAR_TO_DB((p->min_runs + p->max_runs) / (p->min_count + p->max_count)));
+        if (s->measure_perchannel & MEASURE_PEAK_COUNT)
+            set_meta(metadata, c + 1, "Peak_count", "%f", (float)(p->min_count + p->max_count));
+        if (s->measure_perchannel & MEASURE_NOISE_FLOOR)
+            set_meta(metadata, c + 1, "Noise_floor", "%f", LINEAR_TO_DB(p->noise_floor));
+        if (s->measure_perchannel & MEASURE_NOISE_FLOOR_COUNT)
+            set_meta(metadata, c + 1, "Noise_floor_count", "%f", p->noise_floor_count);
+        if (s->measure_perchannel & MEASURE_BIT_DEPTH) {
+            bit_depth(s, p->mask, p->imask, &depth);
+            set_meta(metadata, c + 1, "Bit_depth", "%f", depth.num);
+            set_meta(metadata, c + 1, "Bit_depth2", "%f", depth.den);
+        }
+        if (s->measure_perchannel & MEASURE_DYNAMIC_RANGE)
+            set_meta(metadata, c + 1, "Dynamic_range", "%f", LINEAR_TO_DB(2 * FFMAX(FFABS(p->min), FFABS(p->max))/ p->min_non_zero));
+        if (s->measure_perchannel & MEASURE_ZERO_CROSSINGS)
+            set_meta(metadata, c + 1, "Zero_crossings", "%f", p->zero_runs);
+        if (s->measure_perchannel & MEASURE_ZERO_CROSSINGS_RATE)
+            set_meta(metadata, c + 1, "Zero_crossings_rate", "%f", p->zero_runs/(double)p->nb_samples);
+        if ((s->is_float || s->is_double) && s->measure_perchannel & MEASURE_NUMBER_OF_NANS)
+            set_meta(metadata, c + 1, "Number of NaNs", "%f", p->nb_nans);
+        if ((s->is_float || s->is_double) && s->measure_perchannel & MEASURE_NUMBER_OF_INFS)
+            set_meta(metadata, c + 1, "Number of Infs", "%f", p->nb_infs);
+        if ((s->is_float || s->is_double) && s->measure_perchannel & MEASURE_NUMBER_OF_DENORMALS)
+            set_meta(metadata, c + 1, "Number of denormals", "%f", p->nb_denormals);
     }
 
-    set_meta(metadata, 0, "Overall.DC_offset", "%f", max_sigma_x / (nb_samples / s->nb_channels));
-    set_meta(metadata, 0, "Overall.Min_level", "%f", min);
-    set_meta(metadata, 0, "Overall.Max_level", "%f", max);
-    set_meta(metadata, 0, "Overall.Min_difference", "%f", min_diff);
-    set_meta(metadata, 0, "Overall.Max_difference", "%f", max_diff);
-    set_meta(metadata, 0, "Overall.Mean_difference", "%f", diff1_sum / (nb_samples - s->nb_channels));
-    set_meta(metadata, 0, "Overall.RMS_difference", "%f", sqrt(diff1_sum_x2 / (nb_samples - s->nb_channels)));
-    set_meta(metadata, 0, "Overall.Peak_level", "%f", LINEAR_TO_DB(FFMAX(-nmin, nmax)));
-    set_meta(metadata, 0, "Overall.RMS_level", "%f", LINEAR_TO_DB(sqrt(sigma_x2 / nb_samples)));
-    set_meta(metadata, 0, "Overall.RMS_peak", "%f", LINEAR_TO_DB(sqrt(max_sigma_x2)));
-    set_meta(metadata, 0, "Overall.RMS_trough", "%f", LINEAR_TO_DB(sqrt(min_sigma_x2)));
-    set_meta(metadata, 0, "Overall.Flat_factor", "%f", LINEAR_TO_DB((min_runs + max_runs) / (min_count + max_count)));
-    set_meta(metadata, 0, "Overall.Peak_count", "%f", (float)(min_count + max_count) / (double)s->nb_channels);
-    bit_depth(s, mask, imask, &depth);
-    set_meta(metadata, 0, "Overall.Bit_depth", "%f", depth.num);
-    set_meta(metadata, 0, "Overall.Bit_depth2", "%f", depth.den);
-    set_meta(metadata, 0, "Overall.Number_of_samples", "%f", nb_samples / s->nb_channels);
+    if (s->measure_overall & MEASURE_DC_OFFSET)
+        set_meta(metadata, 0, "Overall.DC_offset", "%f", max_sigma_x / (nb_samples / s->nb_channels));
+    if (s->measure_overall & MEASURE_MIN_LEVEL)
+        set_meta(metadata, 0, "Overall.Min_level", "%f", min);
+    if (s->measure_overall & MEASURE_MAX_LEVEL)
+        set_meta(metadata, 0, "Overall.Max_level", "%f", max);
+    if (s->measure_overall & MEASURE_MIN_DIFFERENCE)
+        set_meta(metadata, 0, "Overall.Min_difference", "%f", min_diff);
+    if (s->measure_overall & MEASURE_MAX_DIFFERENCE)
+        set_meta(metadata, 0, "Overall.Max_difference", "%f", max_diff);
+    if (s->measure_overall & MEASURE_MEAN_DIFFERENCE)
+        set_meta(metadata, 0, "Overall.Mean_difference", "%f", diff1_sum / (nb_samples - s->nb_channels));
+    if (s->measure_overall & MEASURE_RMS_DIFFERENCE)
+        set_meta(metadata, 0, "Overall.RMS_difference", "%f", sqrt(diff1_sum_x2 / (nb_samples - s->nb_channels)));
+    if (s->measure_overall & MEASURE_PEAK_LEVEL)
+        set_meta(metadata, 0, "Overall.Peak_level", "%f", LINEAR_TO_DB(FFMAX(-nmin, nmax)));
+    if (s->measure_overall & MEASURE_RMS_LEVEL)
+        set_meta(metadata, 0, "Overall.RMS_level", "%f", LINEAR_TO_DB(sqrt(sigma_x2 / nb_samples)));
+    if (s->measure_overall & MEASURE_RMS_PEAK)
+        set_meta(metadata, 0, "Overall.RMS_peak", "%f", LINEAR_TO_DB(sqrt(max_sigma_x2)));
+    if (s->measure_overall & MEASURE_RMS_TROUGH)
+        set_meta(metadata, 0, "Overall.RMS_trough", "%f", LINEAR_TO_DB(sqrt(min_sigma_x2)));
+    if (s->measure_overall & MEASURE_FLAT_FACTOR)
+        set_meta(metadata, 0, "Overall.Flat_factor", "%f", LINEAR_TO_DB((min_runs + max_runs) / (min_count + max_count)));
+    if (s->measure_overall & MEASURE_PEAK_COUNT)
+        set_meta(metadata, 0, "Overall.Peak_count", "%f", (float)(min_count + max_count) / (double)s->nb_channels);
+    if (s->measure_overall & MEASURE_NOISE_FLOOR)
+        set_meta(metadata, 0, "Overall.Noise_floor", "%f", LINEAR_TO_DB(noise_floor));
+    if (s->measure_overall & MEASURE_NOISE_FLOOR_COUNT)
+        set_meta(metadata, 0, "Overall.Noise_floor_count", "%f", noise_floor_count / (double)s->nb_channels);
+    if (s->measure_overall & MEASURE_BIT_DEPTH) {
+        bit_depth(s, mask, imask, &depth);
+        set_meta(metadata, 0, "Overall.Bit_depth", "%f", depth.num);
+        set_meta(metadata, 0, "Overall.Bit_depth2", "%f", depth.den);
+    }
+    if (s->measure_overall & MEASURE_NUMBER_OF_SAMPLES)
+        set_meta(metadata, 0, "Overall.Number_of_samples", "%f", nb_samples / s->nb_channels);
+    if ((s->is_float || s->is_double) && s->measure_overall & MEASURE_NUMBER_OF_NANS)
+        set_meta(metadata, 0, "Number of NaNs", "%f", nb_nans / (float)s->nb_channels);
+    if ((s->is_float || s->is_double) && s->measure_overall & MEASURE_NUMBER_OF_INFS)
+        set_meta(metadata, 0, "Number of Infs", "%f", nb_infs / (float)s->nb_channels);
+    if ((s->is_float || s->is_double) && s->measure_overall & MEASURE_NUMBER_OF_DENORMALS)
+        set_meta(metadata, 0, "Number of denormals", "%f", nb_denormals / (float)s->nb_channels);
+}
+
+#define UPDATE_STATS_P(type, update_func, update_float, channel_func)           \
+    for (int c = start; c < end; c++) {                                         \
+        ChannelStats *p = &s->chstats[c];                                       \
+        const type *src = (const type *)data[c];                                \
+        const type * const srcend = src + samples;                              \
+        for (; src < srcend; src++) {                                           \
+            update_func;                                                        \
+            update_float;                                                       \
+        }                                                                       \
+        channel_func;                                                           \
+    }
+
+#define UPDATE_STATS_I(type, update_func, update_float, channel_func)           \
+    for (int c = start; c < end; c++) {                                         \
+        ChannelStats *p = &s->chstats[c];                                       \
+        const type *src = (const type *)data[0];                                \
+        const type * const srcend = src + samples * channels;                   \
+        for (src += c; src < srcend; src += channels) {                         \
+            update_func;                                                        \
+            update_float;                                                       \
+        }                                                                       \
+        channel_func;                                                           \
+    }
+
+#define UPDATE_STATS(planar, type, sample, normalizer_suffix, int_sample) \
+    if ((s->measure_overall | s->measure_perchannel) & ~MEASURE_MINMAXPEAK) {                          \
+        UPDATE_STATS_##planar(type, update_stat(s, p, sample, sample normalizer_suffix, int_sample), s->is_float ? update_float_stat(s, p, sample) : s->is_double ? update_double_stat(s, p, sample) : (void)NULL, ); \
+    } else {                                                                                           \
+        UPDATE_STATS_##planar(type, update_minmax(s, p, sample), , p->nmin = p->min normalizer_suffix; p->nmax = p->max normalizer_suffix;); \
+    }
+
+static int filter_channel(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
+{
+    AudioStatsContext *s = ctx->priv;
+    AVFilterLink *inlink = ctx->inputs[0];
+    AVFrame *buf = arg;
+    const uint8_t * const * const data = (const uint8_t * const *)buf->extended_data;
+    const int channels = s->nb_channels;
+    const int samples = buf->nb_samples;
+    const int start = (buf->channels * jobnr) / nb_jobs;
+    const int end = (buf->channels * (jobnr+1)) / nb_jobs;
+
+    switch (inlink->format) {
+    case AV_SAMPLE_FMT_DBLP:
+        UPDATE_STATS(P, double, *src, , llrint(*src * (UINT64_C(1) << 63)));
+        break;
+    case AV_SAMPLE_FMT_DBL:
+        UPDATE_STATS(I, double, *src, , llrint(*src * (UINT64_C(1) << 63)));
+        break;
+    case AV_SAMPLE_FMT_FLTP:
+        UPDATE_STATS(P, float, *src, , llrint(*src * (UINT64_C(1) << 31)));
+        break;
+    case AV_SAMPLE_FMT_FLT:
+        UPDATE_STATS(I, float, *src, , llrint(*src * (UINT64_C(1) << 31)));
+        break;
+    case AV_SAMPLE_FMT_S64P:
+        UPDATE_STATS(P, int64_t, *src, / (double)INT64_MAX, *src);
+        break;
+    case AV_SAMPLE_FMT_S64:
+        UPDATE_STATS(I, int64_t, *src, / (double)INT64_MAX, *src);
+        break;
+    case AV_SAMPLE_FMT_S32P:
+        UPDATE_STATS(P, int32_t, *src, / (double)INT32_MAX, *src);
+        break;
+    case AV_SAMPLE_FMT_S32:
+        UPDATE_STATS(I, int32_t, *src, / (double)INT32_MAX, *src);
+        break;
+    case AV_SAMPLE_FMT_S16P:
+        UPDATE_STATS(P, int16_t, *src, / (double)INT16_MAX, *src);
+        break;
+    case AV_SAMPLE_FMT_S16:
+        UPDATE_STATS(I, int16_t, *src, / (double)INT16_MAX, *src);
+        break;
+    }
+
+    return 0;
 }
 
 static int filter_frame(AVFilterLink *inlink, AVFrame *buf)
 {
-    AudioStatsContext *s = inlink->dst->priv;
+    AVFilterContext *ctx = inlink->dst;
+    AudioStatsContext *s = ctx->priv;
     AVDictionary **metadata = &buf->metadata;
-    const int channels = s->nb_channels;
-    int i, c;
 
     if (s->reset_count > 0) {
         if (s->nb_frames >= s->reset_count) {
@@ -338,93 +645,7 @@
         s->nb_frames++;
     }
 
-    switch (inlink->format) {
-    case AV_SAMPLE_FMT_DBLP:
-        for (c = 0; c < channels; c++) {
-            ChannelStats *p = &s->chstats[c];
-            const double *src = (const double *)buf->extended_data[c];
-
-            for (i = 0; i < buf->nb_samples; i++, src++)
-                update_stat(s, p, *src, *src, llrint(*src * (UINT64_C(1) << 63)));
-        }
-        break;
-    case AV_SAMPLE_FMT_DBL: {
-        const double *src = (const double *)buf->extended_data[0];
-
-        for (i = 0; i < buf->nb_samples; i++) {
-            for (c = 0; c < channels; c++, src++)
-                update_stat(s, &s->chstats[c], *src, *src, llrint(*src * (UINT64_C(1) << 63)));
-        }}
-        break;
-    case AV_SAMPLE_FMT_FLTP:
-        for (c = 0; c < channels; c++) {
-            ChannelStats *p = &s->chstats[c];
-            const float *src = (const float *)buf->extended_data[c];
-
-            for (i = 0; i < buf->nb_samples; i++, src++)
-                update_stat(s, p, *src, *src, llrint(*src * (UINT64_C(1) << 31)));
-        }
-        break;
-    case AV_SAMPLE_FMT_FLT: {
-        const float *src = (const float *)buf->extended_data[0];
-
-        for (i = 0; i < buf->nb_samples; i++) {
-            for (c = 0; c < channels; c++, src++)
-                update_stat(s, &s->chstats[c], *src, *src, llrint(*src * (UINT64_C(1) << 31)));
-        }}
-        break;
-    case AV_SAMPLE_FMT_S64P:
-        for (c = 0; c < channels; c++) {
-            ChannelStats *p = &s->chstats[c];
-            const int64_t *src = (const int64_t *)buf->extended_data[c];
-
-            for (i = 0; i < buf->nb_samples; i++, src++)
-                update_stat(s, p, *src, *src / (double)INT64_MAX, *src);
-        }
-        break;
-    case AV_SAMPLE_FMT_S64: {
-        const int64_t *src = (const int64_t *)buf->extended_data[0];
-
-        for (i = 0; i < buf->nb_samples; i++) {
-            for (c = 0; c < channels; c++, src++)
-                update_stat(s, &s->chstats[c], *src, *src / (double)INT64_MAX, *src);
-        }}
-        break;
-    case AV_SAMPLE_FMT_S32P:
-        for (c = 0; c < channels; c++) {
-            ChannelStats *p = &s->chstats[c];
-            const int32_t *src = (const int32_t *)buf->extended_data[c];
-
-            for (i = 0; i < buf->nb_samples; i++, src++)
-                update_stat(s, p, *src, *src / (double)INT32_MAX, *src);
-        }
-        break;
-    case AV_SAMPLE_FMT_S32: {
-        const int32_t *src = (const int32_t *)buf->extended_data[0];
-
-        for (i = 0; i < buf->nb_samples; i++) {
-            for (c = 0; c < channels; c++, src++)
-                update_stat(s, &s->chstats[c], *src, *src / (double)INT32_MAX, *src);
-        }}
-        break;
-    case AV_SAMPLE_FMT_S16P:
-        for (c = 0; c < channels; c++) {
-            ChannelStats *p = &s->chstats[c];
-            const int16_t *src = (const int16_t *)buf->extended_data[c];
-
-            for (i = 0; i < buf->nb_samples; i++, src++)
-                update_stat(s, p, *src, *src / (double)INT16_MAX, *src);
-        }
-        break;
-    case AV_SAMPLE_FMT_S16: {
-        const int16_t *src = (const int16_t *)buf->extended_data[0];
-
-        for (i = 0; i < buf->nb_samples; i++) {
-            for (c = 0; c < channels; c++, src++)
-                update_stat(s, &s->chstats[c], *src, *src / (double)INT16_MAX, *src);
-        }}
-        break;
-    }
+    ctx->internal->execute(ctx, filter_channel, buf, NULL, FFMIN(inlink->channels, ff_filter_get_nb_threads(ctx)));
 
     if (s->metadata)
         set_metadata(s, metadata);
@@ -435,17 +656,19 @@
 static void print_stats(AVFilterContext *ctx)
 {
     AudioStatsContext *s = ctx->priv;
-    uint64_t mask = 0, imask = 0xFFFFFFFFFFFFFFFF, min_count = 0, max_count = 0, nb_samples = 0;
+    uint64_t mask = 0, imask = 0xFFFFFFFFFFFFFFFF, min_count = 0, max_count = 0, nb_samples = 0, noise_floor_count = 0;
+    uint64_t nb_nans = 0, nb_infs = 0, nb_denormals = 0;
     double min_runs = 0, max_runs = 0,
-           min = DBL_MAX, max = DBL_MIN, min_diff = DBL_MAX, max_diff = 0,
-           nmin = DBL_MAX, nmax = DBL_MIN,
+           min = DBL_MAX, max =-DBL_MAX, min_diff = DBL_MAX, max_diff = 0,
+           nmin = DBL_MAX, nmax =-DBL_MAX,
            max_sigma_x = 0,
            diff1_sum_x2 = 0,
            diff1_sum = 0,
            sigma_x = 0,
            sigma_x2 = 0,
+           noise_floor = 0,
            min_sigma_x2 = DBL_MAX,
-           max_sigma_x2 = DBL_MIN;
+           max_sigma_x2 =-DBL_MAX;
     AVRational depth;
     int c;
 
@@ -467,57 +690,117 @@
         max_sigma_x2 = FFMAX(max_sigma_x2, p->max_sigma_x2);
         sigma_x += p->sigma_x;
         sigma_x2 += p->sigma_x2;
+        noise_floor = FFMAX(noise_floor, p->noise_floor);
         min_count += p->min_count;
         max_count += p->max_count;
+        noise_floor_count += p->noise_floor_count;
         min_runs += p->min_runs;
         max_runs += p->max_runs;
         mask |= p->mask;
         imask &= p->imask;
         nb_samples += p->nb_samples;
+        nb_nans += p->nb_nans;
+        nb_infs += p->nb_infs;
+        nb_denormals += p->nb_denormals;
         if (fabs(p->sigma_x) > fabs(max_sigma_x))
             max_sigma_x = p->sigma_x;
 
         av_log(ctx, AV_LOG_INFO, "Channel: %d\n", c + 1);
-        av_log(ctx, AV_LOG_INFO, "DC offset: %f\n", p->sigma_x / p->nb_samples);
-        av_log(ctx, AV_LOG_INFO, "Min level: %f\n", p->min);
-        av_log(ctx, AV_LOG_INFO, "Max level: %f\n", p->max);
-        av_log(ctx, AV_LOG_INFO, "Min difference: %f\n", p->min_diff);
-        av_log(ctx, AV_LOG_INFO, "Max difference: %f\n", p->max_diff);
-        av_log(ctx, AV_LOG_INFO, "Mean difference: %f\n", p->diff1_sum / (p->nb_samples - 1));
-        av_log(ctx, AV_LOG_INFO, "RMS difference: %f\n", sqrt(p->diff1_sum_x2 / (p->nb_samples - 1)));
-        av_log(ctx, AV_LOG_INFO, "Peak level dB: %f\n", LINEAR_TO_DB(FFMAX(-p->nmin, p->nmax)));
-        av_log(ctx, AV_LOG_INFO, "RMS level dB: %f\n", LINEAR_TO_DB(sqrt(p->sigma_x2 / p->nb_samples)));
-        av_log(ctx, AV_LOG_INFO, "RMS peak dB: %f\n", LINEAR_TO_DB(sqrt(p->max_sigma_x2)));
-        if (p->min_sigma_x2 != 1)
-            av_log(ctx, AV_LOG_INFO, "RMS trough dB: %f\n",LINEAR_TO_DB(sqrt(p->min_sigma_x2)));
-        av_log(ctx, AV_LOG_INFO, "Crest factor: %f\n", p->sigma_x2 ? FFMAX(-p->nmin, p->nmax) / sqrt(p->sigma_x2 / p->nb_samples) : 1);
-        av_log(ctx, AV_LOG_INFO, "Flat factor: %f\n", LINEAR_TO_DB((p->min_runs + p->max_runs) / (p->min_count + p->max_count)));
-        av_log(ctx, AV_LOG_INFO, "Peak count: %"PRId64"\n", p->min_count + p->max_count);
-        bit_depth(s, p->mask, p->imask, &depth);
-        av_log(ctx, AV_LOG_INFO, "Bit depth: %u/%u\n", depth.num, depth.den);
-        av_log(ctx, AV_LOG_INFO, "Dynamic range: %f\n", LINEAR_TO_DB(2 * FFMAX(FFABS(p->min), FFABS(p->max))/ p->min_non_zero));
-        av_log(ctx, AV_LOG_INFO, "Zero crossings: %"PRId64"\n", p->zero_runs);
-        av_log(ctx, AV_LOG_INFO, "Zero crossings rate: %f\n", p->zero_runs/(double)p->nb_samples);
+        if (s->measure_perchannel & MEASURE_DC_OFFSET)
+            av_log(ctx, AV_LOG_INFO, "DC offset: %f\n", p->sigma_x / p->nb_samples);
+        if (s->measure_perchannel & MEASURE_MIN_LEVEL)
+            av_log(ctx, AV_LOG_INFO, "Min level: %f\n", p->min);
+        if (s->measure_perchannel & MEASURE_MAX_LEVEL)
+            av_log(ctx, AV_LOG_INFO, "Max level: %f\n", p->max);
+        if (s->measure_perchannel & MEASURE_MIN_DIFFERENCE)
+            av_log(ctx, AV_LOG_INFO, "Min difference: %f\n", p->min_diff);
+        if (s->measure_perchannel & MEASURE_MAX_DIFFERENCE)
+            av_log(ctx, AV_LOG_INFO, "Max difference: %f\n", p->max_diff);
+        if (s->measure_perchannel & MEASURE_MEAN_DIFFERENCE)
+            av_log(ctx, AV_LOG_INFO, "Mean difference: %f\n", p->diff1_sum / (p->nb_samples - 1));
+        if (s->measure_perchannel & MEASURE_RMS_DIFFERENCE)
+            av_log(ctx, AV_LOG_INFO, "RMS difference: %f\n", sqrt(p->diff1_sum_x2 / (p->nb_samples - 1)));
+        if (s->measure_perchannel & MEASURE_PEAK_LEVEL)
+            av_log(ctx, AV_LOG_INFO, "Peak level dB: %f\n", LINEAR_TO_DB(FFMAX(-p->nmin, p->nmax)));
+        if (s->measure_perchannel & MEASURE_RMS_LEVEL)
+            av_log(ctx, AV_LOG_INFO, "RMS level dB: %f\n", LINEAR_TO_DB(sqrt(p->sigma_x2 / p->nb_samples)));
+        if (s->measure_perchannel & MEASURE_RMS_PEAK)
+            av_log(ctx, AV_LOG_INFO, "RMS peak dB: %f\n", LINEAR_TO_DB(sqrt(p->max_sigma_x2)));
+        if (s->measure_perchannel & MEASURE_RMS_TROUGH)
+            if (p->min_sigma_x2 != 1)
+                av_log(ctx, AV_LOG_INFO, "RMS trough dB: %f\n",LINEAR_TO_DB(sqrt(p->min_sigma_x2)));
+        if (s->measure_perchannel & MEASURE_CREST_FACTOR)
+            av_log(ctx, AV_LOG_INFO, "Crest factor: %f\n", p->sigma_x2 ? FFMAX(-p->nmin, p->nmax) / sqrt(p->sigma_x2 / p->nb_samples) : 1);
+        if (s->measure_perchannel & MEASURE_FLAT_FACTOR)
+            av_log(ctx, AV_LOG_INFO, "Flat factor: %f\n", LINEAR_TO_DB((p->min_runs + p->max_runs) / (p->min_count + p->max_count)));
+        if (s->measure_perchannel & MEASURE_PEAK_COUNT)
+            av_log(ctx, AV_LOG_INFO, "Peak count: %"PRId64"\n", p->min_count + p->max_count);
+        if (s->measure_perchannel & MEASURE_NOISE_FLOOR)
+            av_log(ctx, AV_LOG_INFO, "Noise floor dB: %f\n", LINEAR_TO_DB(p->noise_floor));
+        if (s->measure_perchannel & MEASURE_NOISE_FLOOR_COUNT)
+            av_log(ctx, AV_LOG_INFO, "Noise floor count: %"PRId64"\n", p->noise_floor_count);
+        if (s->measure_perchannel & MEASURE_BIT_DEPTH) {
+            bit_depth(s, p->mask, p->imask, &depth);
+            av_log(ctx, AV_LOG_INFO, "Bit depth: %u/%u\n", depth.num, depth.den);
+        }
+        if (s->measure_perchannel & MEASURE_DYNAMIC_RANGE)
+            av_log(ctx, AV_LOG_INFO, "Dynamic range: %f\n", LINEAR_TO_DB(2 * FFMAX(FFABS(p->min), FFABS(p->max))/ p->min_non_zero));
+        if (s->measure_perchannel & MEASURE_ZERO_CROSSINGS)
+            av_log(ctx, AV_LOG_INFO, "Zero crossings: %"PRId64"\n", p->zero_runs);
+        if (s->measure_perchannel & MEASURE_ZERO_CROSSINGS_RATE)
+            av_log(ctx, AV_LOG_INFO, "Zero crossings rate: %f\n", p->zero_runs/(double)p->nb_samples);
+        if ((s->is_float || s->is_double) && s->measure_perchannel & MEASURE_NUMBER_OF_NANS)
+            av_log(ctx, AV_LOG_INFO, "Number of NaNs: %"PRId64"\n", p->nb_nans);
+        if ((s->is_float || s->is_double) && s->measure_perchannel & MEASURE_NUMBER_OF_INFS)
+            av_log(ctx, AV_LOG_INFO, "Number of Infs: %"PRId64"\n", p->nb_infs);
+        if ((s->is_float || s->is_double) && s->measure_perchannel & MEASURE_NUMBER_OF_DENORMALS)
+            av_log(ctx, AV_LOG_INFO, "Number of denormals: %"PRId64"\n", p->nb_denormals);
     }
 
     av_log(ctx, AV_LOG_INFO, "Overall\n");
-    av_log(ctx, AV_LOG_INFO, "DC offset: %f\n", max_sigma_x / (nb_samples / s->nb_channels));
-    av_log(ctx, AV_LOG_INFO, "Min level: %f\n", min);
-    av_log(ctx, AV_LOG_INFO, "Max level: %f\n", max);
-    av_log(ctx, AV_LOG_INFO, "Min difference: %f\n", min_diff);
-    av_log(ctx, AV_LOG_INFO, "Max difference: %f\n", max_diff);
-    av_log(ctx, AV_LOG_INFO, "Mean difference: %f\n", diff1_sum / (nb_samples - s->nb_channels));
-    av_log(ctx, AV_LOG_INFO, "RMS difference: %f\n", sqrt(diff1_sum_x2 / (nb_samples - s->nb_channels)));
-    av_log(ctx, AV_LOG_INFO, "Peak level dB: %f\n", LINEAR_TO_DB(FFMAX(-nmin, nmax)));
-    av_log(ctx, AV_LOG_INFO, "RMS level dB: %f\n", LINEAR_TO_DB(sqrt(sigma_x2 / nb_samples)));
-    av_log(ctx, AV_LOG_INFO, "RMS peak dB: %f\n", LINEAR_TO_DB(sqrt(max_sigma_x2)));
-    if (min_sigma_x2 != 1)
-        av_log(ctx, AV_LOG_INFO, "RMS trough dB: %f\n", LINEAR_TO_DB(sqrt(min_sigma_x2)));
-    av_log(ctx, AV_LOG_INFO, "Flat factor: %f\n", LINEAR_TO_DB((min_runs + max_runs) / (min_count + max_count)));
-    av_log(ctx, AV_LOG_INFO, "Peak count: %f\n", (min_count + max_count) / (double)s->nb_channels);
-    bit_depth(s, mask, imask, &depth);
-    av_log(ctx, AV_LOG_INFO, "Bit depth: %u/%u\n", depth.num, depth.den);
-    av_log(ctx, AV_LOG_INFO, "Number of samples: %"PRId64"\n", nb_samples / s->nb_channels);
+    if (s->measure_overall & MEASURE_DC_OFFSET)
+        av_log(ctx, AV_LOG_INFO, "DC offset: %f\n", max_sigma_x / (nb_samples / s->nb_channels));
+    if (s->measure_overall & MEASURE_MIN_LEVEL)
+        av_log(ctx, AV_LOG_INFO, "Min level: %f\n", min);
+    if (s->measure_overall & MEASURE_MAX_LEVEL)
+        av_log(ctx, AV_LOG_INFO, "Max level: %f\n", max);
+    if (s->measure_overall & MEASURE_MIN_DIFFERENCE)
+        av_log(ctx, AV_LOG_INFO, "Min difference: %f\n", min_diff);
+    if (s->measure_overall & MEASURE_MAX_DIFFERENCE)
+        av_log(ctx, AV_LOG_INFO, "Max difference: %f\n", max_diff);
+    if (s->measure_overall & MEASURE_MEAN_DIFFERENCE)
+        av_log(ctx, AV_LOG_INFO, "Mean difference: %f\n", diff1_sum / (nb_samples - s->nb_channels));
+    if (s->measure_overall & MEASURE_RMS_DIFFERENCE)
+        av_log(ctx, AV_LOG_INFO, "RMS difference: %f\n", sqrt(diff1_sum_x2 / (nb_samples - s->nb_channels)));
+    if (s->measure_overall & MEASURE_PEAK_LEVEL)
+        av_log(ctx, AV_LOG_INFO, "Peak level dB: %f\n", LINEAR_TO_DB(FFMAX(-nmin, nmax)));
+    if (s->measure_overall & MEASURE_RMS_LEVEL)
+        av_log(ctx, AV_LOG_INFO, "RMS level dB: %f\n", LINEAR_TO_DB(sqrt(sigma_x2 / nb_samples)));
+    if (s->measure_overall & MEASURE_RMS_PEAK)
+        av_log(ctx, AV_LOG_INFO, "RMS peak dB: %f\n", LINEAR_TO_DB(sqrt(max_sigma_x2)));
+    if (s->measure_overall & MEASURE_RMS_TROUGH)
+        if (min_sigma_x2 != 1)
+            av_log(ctx, AV_LOG_INFO, "RMS trough dB: %f\n", LINEAR_TO_DB(sqrt(min_sigma_x2)));
+    if (s->measure_overall & MEASURE_FLAT_FACTOR)
+        av_log(ctx, AV_LOG_INFO, "Flat factor: %f\n", LINEAR_TO_DB((min_runs + max_runs) / (min_count + max_count)));
+    if (s->measure_overall & MEASURE_PEAK_COUNT)
+        av_log(ctx, AV_LOG_INFO, "Peak count: %f\n", (min_count + max_count) / (double)s->nb_channels);
+    if (s->measure_overall & MEASURE_NOISE_FLOOR)
+        av_log(ctx, AV_LOG_INFO, "Noise floor dB: %f\n", LINEAR_TO_DB(noise_floor));
+    if (s->measure_overall & MEASURE_NOISE_FLOOR_COUNT)
+        av_log(ctx, AV_LOG_INFO, "Noise floor count: %f\n", noise_floor_count / (double)s->nb_channels);
+    if (s->measure_overall & MEASURE_BIT_DEPTH) {
+        bit_depth(s, mask, imask, &depth);
+        av_log(ctx, AV_LOG_INFO, "Bit depth: %u/%u\n", depth.num, depth.den);
+    }
+    if (s->measure_overall & MEASURE_NUMBER_OF_SAMPLES)
+        av_log(ctx, AV_LOG_INFO, "Number of samples: %"PRId64"\n", nb_samples / s->nb_channels);
+    if ((s->is_float || s->is_double) && s->measure_overall & MEASURE_NUMBER_OF_NANS)
+        av_log(ctx, AV_LOG_INFO, "Number of NaNs: %f\n", nb_nans / (float)s->nb_channels);
+    if ((s->is_float || s->is_double) && s->measure_overall & MEASURE_NUMBER_OF_INFS)
+        av_log(ctx, AV_LOG_INFO, "Number of Infs: %f\n", nb_infs / (float)s->nb_channels);
+    if ((s->is_float || s->is_double) && s->measure_overall & MEASURE_NUMBER_OF_DENORMALS)
+        av_log(ctx, AV_LOG_INFO, "Number of denormals: %f\n", nb_denormals / (float)s->nb_channels);
 }
 
 static av_cold void uninit(AVFilterContext *ctx)
@@ -526,6 +809,13 @@
 
     if (s->nb_channels)
         print_stats(ctx);
+    if (s->chstats) {
+        for (int i = 0; i < s->nb_channels; i++) {
+            ChannelStats *p = &s->chstats[i];
+
+            av_freep(&p->win_samples);
+        }
+    }
     av_freep(&s->chstats);
 }
 
@@ -556,4 +846,5 @@
     .uninit        = uninit,
     .inputs        = astats_inputs,
     .outputs       = astats_outputs,
+    .flags         = AVFILTER_FLAG_SLICE_THREADS,
 };
diff --git a/libavfilter/af_atempo.c b/libavfilter/af_atempo.c
index bfdad7d..e4fc691 100644
--- a/libavfilter/af_atempo.c
+++ b/libavfilter/af_atempo.c
@@ -103,6 +103,9 @@
     // 1: output sample position
     int64_t position[2];
 
+    // first input timestamp, all other timestamps are offset by this one
+    int64_t start_pts;
+
     // sample format:
     enum AVSampleFormat format;
 
@@ -159,7 +162,7 @@
       OFFSET(tempo), AV_OPT_TYPE_DOUBLE, { .dbl = 1.0 },
       YAE_ATEMPO_MIN,
       YAE_ATEMPO_MAX,
-      AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_FILTERING_PARAM },
+      AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_FILTERING_PARAM | AV_OPT_FLAG_RUNTIME_PARAM },
     { NULL }
 };
 
@@ -186,6 +189,7 @@
 
     atempo->nfrag = 0;
     atempo->state = YAE_LOAD_FRAGMENT;
+    atempo->start_pts = AV_NOPTS_VALUE;
 
     atempo->position[0] = 0;
     atempo->position[1] = 0;
@@ -324,28 +328,14 @@
     return 0;
 }
 
-static int yae_set_tempo(AVFilterContext *ctx, const char *arg_tempo)
+static int yae_update(AVFilterContext *ctx)
 {
     const AudioFragment *prev;
     ATempoContext *atempo = ctx->priv;
-    char   *tail = NULL;
-    double tempo = av_strtod(arg_tempo, &tail);
-
-    if (tail && *tail) {
-        av_log(ctx, AV_LOG_ERROR, "Invalid tempo value '%s'\n", arg_tempo);
-        return AVERROR(EINVAL);
-    }
-
-    if (tempo < YAE_ATEMPO_MIN || tempo > YAE_ATEMPO_MAX) {
-        av_log(ctx, AV_LOG_ERROR, "Tempo value %f exceeds [%f, %f] range\n",
-               tempo, YAE_ATEMPO_MIN, YAE_ATEMPO_MAX);
-        return AVERROR(EINVAL);
-    }
 
     prev = yae_prev_frag(atempo);
     atempo->origin[0] = prev->position[0] + atempo->window / 2;
     atempo->origin[1] = prev->position[1] + atempo->window / 2;
-    atempo->tempo = tempo;
     return 0;
 }
 
@@ -1068,7 +1058,7 @@
     atempo->dst_buffer->nb_samples  = n_out;
 
     // adjust the PTS:
-    atempo->dst_buffer->pts =
+    atempo->dst_buffer->pts = atempo->start_pts +
         av_rescale_q(atempo->nsamples_out,
                      (AVRational){ 1, outlink->sample_rate },
                      outlink->time_base);
@@ -1097,6 +1087,11 @@
     const uint8_t *src = src_buffer->data[0];
     const uint8_t *src_end = src + n_in * atempo->stride;
 
+    if (atempo->start_pts == AV_NOPTS_VALUE)
+        atempo->start_pts = av_rescale_q(src_buffer->pts,
+                                         inlink->time_base,
+                                         outlink->time_base);
+
     while (src < src_end) {
         if (!atempo->dst_buffer) {
             atempo->dst_buffer = ff_get_audio_buffer(outlink, n_out);
@@ -1180,7 +1175,12 @@
                            int res_len,
                            int flags)
 {
-    return !strcmp(cmd, "tempo") ? yae_set_tempo(ctx, arg) : AVERROR(ENOSYS);
+    int ret = ff_filter_process_command(ctx, cmd, arg, res, res_len, flags);
+
+    if (ret < 0)
+        return ret;
+
+    return yae_update(ctx);
 }
 
 static const AVFilterPad atempo_inputs[] = {
diff --git a/libavfilter/af_axcorrelate.c b/libavfilter/af_axcorrelate.c
new file mode 100644
index 0000000..6e9a028
--- /dev/null
+++ b/libavfilter/af_axcorrelate.c
@@ -0,0 +1,378 @@
+/*
+ * Copyright (c) 2019 Paul B Mahol
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "libavutil/avassert.h"
+#include "libavutil/audio_fifo.h"
+#include "libavutil/channel_layout.h"
+#include "libavutil/common.h"
+#include "libavutil/opt.h"
+
+#include "audio.h"
+#include "avfilter.h"
+#include "formats.h"
+#include "filters.h"
+#include "internal.h"
+
+typedef struct AudioXCorrelateContext {
+    const AVClass *class;
+
+    int size;
+    int algo;
+    int64_t pts;
+
+    AVAudioFifo *fifo[2];
+    AVFrame *cache[2];
+    AVFrame *mean_sum[2];
+    AVFrame *num_sum;
+    AVFrame *den_sum[2];
+    int used;
+
+    int (*xcorrelate)(AVFilterContext *ctx, AVFrame *out);
+} AudioXCorrelateContext;
+
+static int query_formats(AVFilterContext *ctx)
+{
+    AVFilterFormats *formats;
+    AVFilterChannelLayouts *layouts;
+    static const enum AVSampleFormat sample_fmts[] = {
+        AV_SAMPLE_FMT_FLTP,
+        AV_SAMPLE_FMT_NONE
+    };
+    int ret;
+
+    layouts = ff_all_channel_counts();
+    if (!layouts)
+        return AVERROR(ENOMEM);
+    ret = ff_set_common_channel_layouts(ctx, layouts);
+    if (ret < 0)
+        return ret;
+
+    formats = ff_make_format_list(sample_fmts);
+    if (!formats)
+        return AVERROR(ENOMEM);
+    ret = ff_set_common_formats(ctx, formats);
+    if (ret < 0)
+        return ret;
+
+    formats = ff_all_samplerates();
+    if (!formats)
+        return AVERROR(ENOMEM);
+    return ff_set_common_samplerates(ctx, formats);
+}
+
+static float mean_sum(const float *in, int size)
+{
+    float mean_sum = 0.f;
+
+    for (int i = 0; i < size; i++)
+        mean_sum += in[i];
+
+    return mean_sum;
+}
+
+static float square_sum(const float *x, const float *y, int size)
+{
+    float square_sum = 0.f;
+
+    for (int i = 0; i < size; i++)
+        square_sum += x[i] * y[i];
+
+    return square_sum;
+}
+
+static float xcorrelate(const float *x, const float *y, float sumx, float sumy, int size)
+{
+    const float xm = sumx / size, ym = sumy / size;
+    float num = 0.f, den, den0 = 0.f, den1 = 0.f;
+
+    for (int i = 0; i < size; i++) {
+        float xd = x[i] - xm;
+        float yd = y[i] - ym;
+
+        num += xd * yd;
+        den0 += xd * xd;
+        den1 += yd * yd;
+    }
+
+    num /= size;
+    den  = sqrtf((den0 * den1) / (size * size));
+
+    return den <= 1e-6f ? 0.f : num / den;
+}
+
+static int xcorrelate_slow(AVFilterContext *ctx, AVFrame *out)
+{
+    AudioXCorrelateContext *s = ctx->priv;
+    const int size = s->size;
+    int used;
+
+    for (int ch = 0; ch < out->channels; ch++) {
+        const float *x = (const float *)s->cache[0]->extended_data[ch];
+        const float *y = (const float *)s->cache[1]->extended_data[ch];
+        float *sumx = (float *)s->mean_sum[0]->extended_data[ch];
+        float *sumy = (float *)s->mean_sum[1]->extended_data[ch];
+        float *dst = (float *)out->extended_data[ch];
+
+        used = s->used;
+        if (!used) {
+            sumx[0] = mean_sum(x, size);
+            sumy[0] = mean_sum(y, size);
+            used = 1;
+        }
+
+        for (int n = 0; n < out->nb_samples; n++) {
+            dst[n] = xcorrelate(x + n, y + n, sumx[0], sumy[0], size);
+
+            sumx[0] -= x[n];
+            sumx[0] += x[n + size];
+            sumy[0] -= y[n];
+            sumy[0] += y[n + size];
+        }
+    }
+
+    return used;
+}
+
+static int xcorrelate_fast(AVFilterContext *ctx, AVFrame *out)
+{
+    AudioXCorrelateContext *s = ctx->priv;
+    const int size = s->size;
+    int used;
+
+    for (int ch = 0; ch < out->channels; ch++) {
+        const float *x = (const float *)s->cache[0]->extended_data[ch];
+        const float *y = (const float *)s->cache[1]->extended_data[ch];
+        float *num_sum = (float *)s->num_sum->extended_data[ch];
+        float *den_sumx = (float *)s->den_sum[0]->extended_data[ch];
+        float *den_sumy = (float *)s->den_sum[1]->extended_data[ch];
+        float *dst = (float *)out->extended_data[ch];
+
+        used = s->used;
+        if (!used) {
+            num_sum[0]  = square_sum(x, y, size);
+            den_sumx[0] = square_sum(x, x, size);
+            den_sumy[0] = square_sum(y, y, size);
+            used = 1;
+        }
+
+        for (int n = 0; n < out->nb_samples; n++) {
+            float num, den;
+
+            num = num_sum[0] / size;
+            den = sqrtf((den_sumx[0] * den_sumy[0]) / (size * size));
+
+            dst[n] = den <= 1e-6f ? 0.f : num / den;
+
+            num_sum[0]  -= x[n] * y[n];
+            num_sum[0]  += x[n + size] * y[n + size];
+            den_sumx[0] -= x[n] * x[n];
+            den_sumx[0]  = FFMAX(den_sumx[0], 0.f);
+            den_sumx[0] += x[n + size] * x[n + size];
+            den_sumy[0] -= y[n] * y[n];
+            den_sumy[0]  = FFMAX(den_sumy[0], 0.f);
+            den_sumy[0] += y[n + size] * y[n + size];
+        }
+    }
+
+    return used;
+}
+
+static int activate(AVFilterContext *ctx)
+{
+    AudioXCorrelateContext *s = ctx->priv;
+    AVFrame *frame = NULL;
+    int ret, status;
+    int available;
+    int64_t pts;
+
+    FF_FILTER_FORWARD_STATUS_BACK_ALL(ctx->outputs[0], ctx);
+
+    for (int i = 0; i < 2; i++) {
+        ret = ff_inlink_consume_frame(ctx->inputs[i], &frame);
+        if (ret > 0) {
+            if (s->pts == AV_NOPTS_VALUE)
+                s->pts = frame->pts;
+            ret = av_audio_fifo_write(s->fifo[i], (void **)frame->extended_data,
+                                      frame->nb_samples);
+            av_frame_free(&frame);
+            if (ret < 0)
+                return ret;
+        }
+    }
+
+    available = FFMIN(av_audio_fifo_size(s->fifo[0]), av_audio_fifo_size(s->fifo[1]));
+    if (available > s->size) {
+        const int out_samples = available - s->size;
+        AVFrame *out;
+
+        if (!s->cache[0] || s->cache[0]->nb_samples < available) {
+            av_frame_free(&s->cache[0]);
+            s->cache[0] = ff_get_audio_buffer(ctx->outputs[0], available);
+            if (!s->cache[0])
+                return AVERROR(ENOMEM);
+        }
+
+        if (!s->cache[1] || s->cache[1]->nb_samples < available) {
+            av_frame_free(&s->cache[1]);
+            s->cache[1] = ff_get_audio_buffer(ctx->outputs[0], available);
+            if (!s->cache[1])
+                return AVERROR(ENOMEM);
+        }
+
+        ret = av_audio_fifo_peek(s->fifo[0], (void **)s->cache[0]->extended_data, available);
+        if (ret < 0)
+            return ret;
+
+        ret = av_audio_fifo_peek(s->fifo[1], (void **)s->cache[1]->extended_data, available);
+        if (ret < 0)
+            return ret;
+
+        out = ff_get_audio_buffer(ctx->outputs[0], out_samples);
+        if (!out)
+            return AVERROR(ENOMEM);
+
+        s->used = s->xcorrelate(ctx, out);
+
+        out->pts = s->pts;
+        s->pts += out_samples;
+
+        av_audio_fifo_drain(s->fifo[0], out_samples);
+        av_audio_fifo_drain(s->fifo[1], out_samples);
+
+        return ff_filter_frame(ctx->outputs[0], out);
+    }
+
+    if (av_audio_fifo_size(s->fifo[0]) > s->size &&
+        av_audio_fifo_size(s->fifo[1]) > s->size) {
+        ff_filter_set_ready(ctx, 10);
+        return 0;
+    }
+
+    for (int i = 0; i < 2; i++) {
+        if (ff_inlink_acknowledge_status(ctx->inputs[i], &status, &pts)) {
+            ff_outlink_set_status(ctx->outputs[0], status, pts);
+            return 0;
+        }
+    }
+
+    if (ff_outlink_frame_wanted(ctx->outputs[0])) {
+        for (int i = 0; i < 2; i++) {
+            if (av_audio_fifo_size(s->fifo[i]) > s->size)
+                continue;
+            ff_inlink_request_frame(ctx->inputs[i]);
+            return 0;
+        }
+    }
+
+    return FFERROR_NOT_READY;
+}
+
+static int config_output(AVFilterLink *outlink)
+{
+    AVFilterContext *ctx = outlink->src;
+    AVFilterLink *inlink = ctx->inputs[0];
+    AudioXCorrelateContext *s = ctx->priv;
+
+    s->pts = AV_NOPTS_VALUE;
+
+    outlink->format = inlink->format;
+    outlink->channels = inlink->channels;
+    s->fifo[0] = av_audio_fifo_alloc(outlink->format, outlink->channels, s->size);
+    s->fifo[1] = av_audio_fifo_alloc(outlink->format, outlink->channels, s->size);
+    if (!s->fifo[0] || !s->fifo[1])
+        return AVERROR(ENOMEM);
+
+    s->mean_sum[0] = ff_get_audio_buffer(outlink, 1);
+    s->mean_sum[1] = ff_get_audio_buffer(outlink, 1);
+    s->num_sum = ff_get_audio_buffer(outlink, 1);
+    s->den_sum[0] = ff_get_audio_buffer(outlink, 1);
+    s->den_sum[1] = ff_get_audio_buffer(outlink, 1);
+    if (!s->mean_sum[0] || !s->mean_sum[1] || !s->num_sum ||
+        !s->den_sum[0] || !s->den_sum[1])
+        return AVERROR(ENOMEM);
+
+    switch (s->algo) {
+    case 0: s->xcorrelate = xcorrelate_slow; break;
+    case 1: s->xcorrelate = xcorrelate_fast; break;
+    }
+
+    return 0;
+}
+
+static av_cold void uninit(AVFilterContext *ctx)
+{
+    AudioXCorrelateContext *s = ctx->priv;
+
+    av_audio_fifo_free(s->fifo[0]);
+    av_audio_fifo_free(s->fifo[1]);
+    av_frame_free(&s->cache[0]);
+    av_frame_free(&s->cache[1]);
+    av_frame_free(&s->mean_sum[0]);
+    av_frame_free(&s->mean_sum[1]);
+    av_frame_free(&s->num_sum);
+    av_frame_free(&s->den_sum[0]);
+    av_frame_free(&s->den_sum[1]);
+}
+
+static const AVFilterPad inputs[] = {
+    {
+        .name = "axcorrelate0",
+        .type = AVMEDIA_TYPE_AUDIO,
+    },
+    {
+        .name = "axcorrelate1",
+        .type = AVMEDIA_TYPE_AUDIO,
+    },
+    { NULL }
+};
+
+static const AVFilterPad outputs[] = {
+    {
+        .name         = "default",
+        .type         = AVMEDIA_TYPE_AUDIO,
+        .config_props = config_output,
+    },
+    { NULL }
+};
+
+#define AF AV_OPT_FLAG_AUDIO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
+#define OFFSET(x) offsetof(AudioXCorrelateContext, x)
+
+static const AVOption axcorrelate_options[] = {
+    { "size", "set segment size", OFFSET(size), AV_OPT_TYPE_INT,   {.i64=256}, 2, 131072, AF },
+    { "algo", "set alghorithm",   OFFSET(algo), AV_OPT_TYPE_INT,   {.i64=0},   0,      1, AF, "algo" },
+    { "slow", "slow algorithm",   0,            AV_OPT_TYPE_CONST, {.i64=0},   0,      0, AF, "algo" },
+    { "fast", "fast algorithm",   0,            AV_OPT_TYPE_CONST, {.i64=1},   0,      0, AF, "algo" },
+    { NULL }
+};
+
+AVFILTER_DEFINE_CLASS(axcorrelate);
+
+AVFilter ff_af_axcorrelate = {
+    .name           = "axcorrelate",
+    .description    = NULL_IF_CONFIG_SMALL("Cross-correlate two audio streams."),
+    .priv_size      = sizeof(AudioXCorrelateContext),
+    .priv_class     = &axcorrelate_class,
+    .query_formats  = query_formats,
+    .activate       = activate,
+    .uninit         = uninit,
+    .inputs         = inputs,
+    .outputs        = outputs,
+};
diff --git a/libavfilter/af_biquads.c b/libavfilter/af_biquads.c
index ae5e1c6..a2f7e3f 100644
--- a/libavfilter/af_biquads.c
+++ b/libavfilter/af_biquads.c
@@ -63,6 +63,7 @@
  */
 
 #include "libavutil/avassert.h"
+#include "libavutil/ffmath.h"
 #include "libavutil/opt.h"
 #include "audio.h"
 #include "avfilter.h"
@@ -109,7 +110,9 @@
     double gain;
     double frequency;
     double width;
+    double mix;
     uint64_t channels;
+    int normalize;
 
     double a0, a1, a2;
     double b0, b1, b2;
@@ -119,7 +122,8 @@
 
     void (*filter)(struct BiquadsContext *s, const void *ibuf, void *obuf, int len,
                    double *i1, double *i2, double *o1, double *o2,
-                   double b0, double b1, double b2, double a1, double a2, int *clippings);
+                   double b0, double b1, double b2, double a1, double a2, int *clippings,
+                   int disabled);
 } BiquadsContext;
 
 static av_cold int init(AVFilterContext *ctx)
@@ -176,7 +180,8 @@
                             double *in1, double *in2,                         \
                             double *out1, double *out2,                       \
                             double b0, double b1, double b2,                  \
-                            double a1, double a2, int *clippings)             \
+                            double a1, double a2, int *clippings,             \
+                            int disabled)                                     \
 {                                                                             \
     const type *ibuf = input;                                                 \
     type *obuf = output;                                                      \
@@ -184,6 +189,9 @@
     double i2 = *in2;                                                         \
     double o1 = *out1;                                                        \
     double o2 = *out2;                                                        \
+    double wet = s->mix;                                                      \
+    double dry = 1. - wet;                                                    \
+    double out;                                                               \
     int i;                                                                    \
     a1 = -a1;                                                                 \
     a2 = -a2;                                                                 \
@@ -191,26 +199,32 @@
     for (i = 0; i+1 < len; i++) {                                             \
         o2 = i2 * b2 + i1 * b1 + ibuf[i] * b0 + o2 * a2 + o1 * a1;            \
         i2 = ibuf[i];                                                         \
-        if (need_clipping && o2 < min) {                                      \
+        out = o2 * wet + i2 * dry;                                            \
+        if (disabled) {                                                       \
+            obuf[i] = i2;                                                     \
+        } else if (need_clipping && out < min) {                              \
             (*clippings)++;                                                   \
             obuf[i] = min;                                                    \
-        } else if (need_clipping && o2 > max) {                               \
+        } else if (need_clipping && out > max) {                              \
             (*clippings)++;                                                   \
             obuf[i] = max;                                                    \
         } else {                                                              \
-            obuf[i] = o2;                                                     \
+            obuf[i] = out;                                                    \
         }                                                                     \
         i++;                                                                  \
         o1 = i1 * b2 + i2 * b1 + ibuf[i] * b0 + o1 * a2 + o2 * a1;            \
         i1 = ibuf[i];                                                         \
-        if (need_clipping && o1 < min) {                                      \
+        out = o1 * wet + i1 * dry;                                            \
+        if (disabled) {                                                       \
+            obuf[i] = i1;                                                     \
+        } else if (need_clipping && out < min) {                              \
             (*clippings)++;                                                   \
             obuf[i] = min;                                                    \
-        } else if (need_clipping && o1 > max) {                               \
+        } else if (need_clipping && out > max) {                              \
             (*clippings)++;                                                   \
             obuf[i] = max;                                                    \
         } else {                                                              \
-            obuf[i] = o1;                                                     \
+            obuf[i] = out;                                                    \
         }                                                                     \
     }                                                                         \
     if (i < len) {                                                            \
@@ -219,14 +233,17 @@
         i1 = ibuf[i];                                                         \
         o2 = o1;                                                              \
         o1 = o0;                                                              \
-        if (need_clipping && o0 < min) {                                      \
+        out = o0 * wet + i1 * dry;                                            \
+        if (disabled) {                                                       \
+            obuf[i] = i1;                                                     \
+        } else if (need_clipping && out < min) {                              \
             (*clippings)++;                                                   \
             obuf[i] = min;                                                    \
-        } else if (need_clipping && o0 > max) {                               \
+        } else if (need_clipping && out > max) {                              \
             (*clippings)++;                                                   \
             obuf[i] = max;                                                    \
         } else {                                                              \
-            obuf[i] = o0;                                                     \
+            obuf[i] = out;                                                    \
         }                                                                     \
     }                                                                         \
     *in1  = i1;                                                               \
@@ -245,7 +262,7 @@
     AVFilterContext *ctx    = outlink->src;
     BiquadsContext *s       = ctx->priv;
     AVFilterLink *inlink    = ctx->inputs[0];
-    double A = exp(s->gain / 40 * log(10.));
+    double A = ff_exp10(s->gain / 40);
     double w0 = 2 * M_PI * s->frequency / inlink->sample_rate;
     double alpha, beta;
 
@@ -392,6 +409,14 @@
     s->b2 /= s->a0;
     s->a0 /= s->a0;
 
+    if (s->normalize && fabs(s->b0 + s->b1 + s->b2) > 1e-6) {
+        double factor = (s->a0 + s->a1 + s->a2) / (s->b0 + s->b1 + s->b2);
+
+        s->b0 *= factor;
+        s->b1 *= factor;
+        s->b2 *= factor;
+    }
+
     s->cache = av_realloc_f(s->cache, sizeof(ChanCache), inlink->channels);
     if (!s->cache)
         return AVERROR(ENOMEM);
@@ -441,7 +466,7 @@
 
         s->filter(s, buf->extended_data[ch], out_buf->extended_data[ch], buf->nb_samples,
                   &s->cache[ch].i1, &s->cache[ch].i2, &s->cache[ch].o1, &s->cache[ch].o2,
-                  s->b0, s->b1, s->b2, s->a1, s->a2, &s->cache[ch].clippings);
+                  s->b0, s->b1, s->b2, s->a1, s->a2, &s->cache[ch].clippings, ctx->is_disabled);
     }
 
     return 0;
@@ -487,118 +512,12 @@
 static int process_command(AVFilterContext *ctx, const char *cmd, const char *args,
                            char *res, int res_len, int flags)
 {
-    BiquadsContext *s = ctx->priv;
     AVFilterLink *outlink = ctx->outputs[0];
+    int ret;
 
-    if ((!strcmp(cmd, "frequency") || !strcmp(cmd, "f")) &&
-        (s->filter_type == equalizer ||
-         s->filter_type == lowshelf  ||
-         s->filter_type == highshelf ||
-         s->filter_type == bass      ||
-         s->filter_type == treble    ||
-         s->filter_type == bandpass  ||
-         s->filter_type == bandreject||
-         s->filter_type == lowpass   ||
-         s->filter_type == highpass  ||
-         s->filter_type == allpass)) {
-        double freq;
-
-        if (sscanf(args, "%lf", &freq) != 1) {
-            av_log(ctx, AV_LOG_ERROR, "Invalid frequency value.\n");
-            return AVERROR(EINVAL);
-        }
-
-        s->frequency = freq;
-    } else if ((!strcmp(cmd, "gain") || !strcmp(cmd, "g")) &&
-        (s->filter_type == equalizer ||
-         s->filter_type == lowshelf  ||
-         s->filter_type == highshelf ||
-         s->filter_type == bass      ||
-         s->filter_type == treble)) {
-        double gain;
-
-        if (sscanf(args, "%lf", &gain) != 1) {
-            av_log(ctx, AV_LOG_ERROR, "Invalid gain value.\n");
-            return AVERROR(EINVAL);
-        }
-
-        s->gain = gain;
-    } else if ((!strcmp(cmd, "width") || !strcmp(cmd, "w")) &&
-        (s->filter_type == equalizer ||
-         s->filter_type == lowshelf  ||
-         s->filter_type == highshelf ||
-         s->filter_type == bass      ||
-         s->filter_type == treble    ||
-         s->filter_type == bandpass  ||
-         s->filter_type == bandreject||
-         s->filter_type == lowpass   ||
-         s->filter_type == highpass  ||
-         s->filter_type == allpass)) {
-        double width;
-
-        if (sscanf(args, "%lf", &width) != 1) {
-            av_log(ctx, AV_LOG_ERROR, "Invalid width value.\n");
-            return AVERROR(EINVAL);
-        }
-
-        s->width = width;
-    } else if ((!strcmp(cmd, "width_type") || !strcmp(cmd, "t")) &&
-        (s->filter_type == equalizer ||
-         s->filter_type == lowshelf  ||
-         s->filter_type == highshelf ||
-         s->filter_type == bass      ||
-         s->filter_type == treble    ||
-         s->filter_type == bandpass  ||
-         s->filter_type == bandreject||
-         s->filter_type == lowpass   ||
-         s->filter_type == highpass  ||
-         s->filter_type == allpass)) {
-        char width_type;
-
-        if (sscanf(args, "%c", &width_type) != 1) {
-            av_log(ctx, AV_LOG_ERROR, "Invalid width_type value.\n");
-            return AVERROR(EINVAL);
-        }
-
-        switch (width_type) {
-        case 'h': width_type = HERTZ;   break;
-        case 'q': width_type = QFACTOR; break;
-        case 'o': width_type = OCTAVE;  break;
-        case 's': width_type = SLOPE;   break;
-        case 'k': width_type = KHERTZ;  break;
-        default:
-            av_log(ctx, AV_LOG_ERROR, "Invalid width_type value: %c\n", width_type);
-            return AVERROR(EINVAL);
-        }
-
-        s->width_type = width_type;
-    } else if ((!strcmp(cmd, "a0") ||
-                !strcmp(cmd, "a1") ||
-                !strcmp(cmd, "a2") ||
-                !strcmp(cmd, "b0") ||
-                !strcmp(cmd, "b1") ||
-                !strcmp(cmd, "b2")) &&
-               s->filter_type == biquad) {
-        double value;
-
-        if (sscanf(args, "%lf", &value) != 1) {
-            av_log(ctx, AV_LOG_ERROR, "Invalid biquad value.\n");
-            return AVERROR(EINVAL);
-        }
-
-        if (!strcmp(cmd, "a0"))
-            s->a0 = value;
-        else if (!strcmp(cmd, "a1"))
-            s->a1 = value;
-        else if (!strcmp(cmd, "a2"))
-            s->a2 = value;
-        else if (!strcmp(cmd, "b0"))
-            s->b0 = value;
-        else if (!strcmp(cmd, "b1"))
-            s->b1 = value;
-        else if (!strcmp(cmd, "b2"))
-            s->b2 = value;
-    }
+    ret = ff_filter_process_command(ctx, cmd, args, res, res_len, flags);
+    if (ret < 0)
+        return ret;
 
     return config_filter(outlink, 0);
 }
@@ -629,7 +548,8 @@
 };
 
 #define OFFSET(x) offsetof(BiquadsContext, x)
-#define FLAGS AV_OPT_FLAG_AUDIO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
+#define FLAGS AV_OPT_FLAG_AUDIO_PARAM|AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_RUNTIME_PARAM
+#define AF AV_OPT_FLAG_AUDIO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
 
 #define DEFINE_BIQUAD_FILTER(name_, description_)                       \
 AVFILTER_DEFINE_CLASS(name_);                                           \
@@ -652,7 +572,7 @@
     .outputs       = outputs,                            \
     .priv_class    = &name_##_class,                     \
     .process_command = process_command,                  \
-    .flags         = AVFILTER_FLAG_SLICE_THREADS,        \
+    .flags         = AVFILTER_FLAG_SLICE_THREADS | AVFILTER_FLAG_SUPPORT_TIMELINE_INTERNAL, \
 }
 
 #if CONFIG_EQUALIZER_FILTER
@@ -670,8 +590,12 @@
     {"w",     "set band-width", OFFSET(width), AV_OPT_TYPE_DOUBLE, {.dbl=1}, 0, 99999, FLAGS},
     {"gain", "set gain", OFFSET(gain), AV_OPT_TYPE_DOUBLE, {.dbl=0}, -900, 900, FLAGS},
     {"g",    "set gain", OFFSET(gain), AV_OPT_TYPE_DOUBLE, {.dbl=0}, -900, 900, FLAGS},
+    {"mix", "set mix", OFFSET(mix), AV_OPT_TYPE_DOUBLE, {.dbl=1}, 0, 1, FLAGS},
+    {"m",   "set mix", OFFSET(mix), AV_OPT_TYPE_DOUBLE, {.dbl=1}, 0, 1, FLAGS},
     {"channels", "set channels to filter", OFFSET(channels), AV_OPT_TYPE_CHANNEL_LAYOUT, {.i64=-1}, INT64_MIN, INT64_MAX, FLAGS},
     {"c",        "set channels to filter", OFFSET(channels), AV_OPT_TYPE_CHANNEL_LAYOUT, {.i64=-1}, INT64_MIN, INT64_MAX, FLAGS},
+    {"normalize", "normalize coefficients", OFFSET(normalize), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS},
+    {"n",         "normalize coefficients", OFFSET(normalize), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS},
     {NULL}
 };
 
@@ -692,8 +616,12 @@
     {"w",     "set shelf transition steep", OFFSET(width), AV_OPT_TYPE_DOUBLE, {.dbl=0.5}, 0, 99999, FLAGS},
     {"gain", "set gain", OFFSET(gain), AV_OPT_TYPE_DOUBLE, {.dbl=0}, -900, 900, FLAGS},
     {"g",    "set gain", OFFSET(gain), AV_OPT_TYPE_DOUBLE, {.dbl=0}, -900, 900, FLAGS},
+    {"mix", "set mix", OFFSET(mix), AV_OPT_TYPE_DOUBLE, {.dbl=1}, 0, 1, FLAGS},
+    {"m",   "set mix", OFFSET(mix), AV_OPT_TYPE_DOUBLE, {.dbl=1}, 0, 1, FLAGS},
     {"channels", "set channels to filter", OFFSET(channels), AV_OPT_TYPE_CHANNEL_LAYOUT, {.i64=-1}, INT64_MIN, INT64_MAX, FLAGS},
     {"c",        "set channels to filter", OFFSET(channels), AV_OPT_TYPE_CHANNEL_LAYOUT, {.i64=-1}, INT64_MIN, INT64_MAX, FLAGS},
+    {"normalize", "normalize coefficients", OFFSET(normalize), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS},
+    {"n",         "normalize coefficients", OFFSET(normalize), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS},
     {NULL}
 };
 
@@ -714,8 +642,12 @@
     {"w",     "set shelf transition steep", OFFSET(width), AV_OPT_TYPE_DOUBLE, {.dbl=0.5}, 0, 99999, FLAGS},
     {"gain", "set gain", OFFSET(gain), AV_OPT_TYPE_DOUBLE, {.dbl=0}, -900, 900, FLAGS},
     {"g",    "set gain", OFFSET(gain), AV_OPT_TYPE_DOUBLE, {.dbl=0}, -900, 900, FLAGS},
+    {"mix", "set mix", OFFSET(mix), AV_OPT_TYPE_DOUBLE, {.dbl=1}, 0, 1, FLAGS},
+    {"m",   "set mix", OFFSET(mix), AV_OPT_TYPE_DOUBLE, {.dbl=1}, 0, 1, FLAGS},
     {"channels", "set channels to filter", OFFSET(channels), AV_OPT_TYPE_CHANNEL_LAYOUT, {.i64=-1}, INT64_MIN, INT64_MAX, FLAGS},
     {"c",        "set channels to filter", OFFSET(channels), AV_OPT_TYPE_CHANNEL_LAYOUT, {.i64=-1}, INT64_MIN, INT64_MAX, FLAGS},
+    {"normalize", "normalize coefficients", OFFSET(normalize), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS},
+    {"n",         "normalize coefficients", OFFSET(normalize), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS},
     {NULL}
 };
 
@@ -735,8 +667,12 @@
     {"width", "set band-width", OFFSET(width), AV_OPT_TYPE_DOUBLE, {.dbl=0.5}, 0, 99999, FLAGS},
     {"w",     "set band-width", OFFSET(width), AV_OPT_TYPE_DOUBLE, {.dbl=0.5}, 0, 99999, FLAGS},
     {"csg",   "use constant skirt gain", OFFSET(csg), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS},
+    {"mix", "set mix", OFFSET(mix), AV_OPT_TYPE_DOUBLE, {.dbl=1}, 0, 1, FLAGS},
+    {"m",   "set mix", OFFSET(mix), AV_OPT_TYPE_DOUBLE, {.dbl=1}, 0, 1, FLAGS},
     {"channels", "set channels to filter", OFFSET(channels), AV_OPT_TYPE_CHANNEL_LAYOUT, {.i64=-1}, INT64_MIN, INT64_MAX, FLAGS},
     {"c",        "set channels to filter", OFFSET(channels), AV_OPT_TYPE_CHANNEL_LAYOUT, {.i64=-1}, INT64_MIN, INT64_MAX, FLAGS},
+    {"normalize", "normalize coefficients", OFFSET(normalize), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS},
+    {"n",         "normalize coefficients", OFFSET(normalize), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS},
     {NULL}
 };
 
@@ -755,8 +691,12 @@
     {"k", "kHz", 0, AV_OPT_TYPE_CONST, {.i64=KHERTZ}, 0, 0, FLAGS, "width_type"},
     {"width", "set band-width", OFFSET(width), AV_OPT_TYPE_DOUBLE, {.dbl=0.5}, 0, 99999, FLAGS},
     {"w",     "set band-width", OFFSET(width), AV_OPT_TYPE_DOUBLE, {.dbl=0.5}, 0, 99999, FLAGS},
+    {"mix", "set mix", OFFSET(mix), AV_OPT_TYPE_DOUBLE, {.dbl=1}, 0, 1, FLAGS},
+    {"m",   "set mix", OFFSET(mix), AV_OPT_TYPE_DOUBLE, {.dbl=1}, 0, 1, FLAGS},
     {"channels", "set channels to filter", OFFSET(channels), AV_OPT_TYPE_CHANNEL_LAYOUT, {.i64=-1}, INT64_MIN, INT64_MAX, FLAGS},
     {"c",        "set channels to filter", OFFSET(channels), AV_OPT_TYPE_CHANNEL_LAYOUT, {.i64=-1}, INT64_MIN, INT64_MAX, FLAGS},
+    {"normalize", "normalize coefficients", OFFSET(normalize), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS},
+    {"n",         "normalize coefficients", OFFSET(normalize), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS},
     {NULL}
 };
 
@@ -775,10 +715,14 @@
     {"k", "kHz", 0, AV_OPT_TYPE_CONST, {.i64=KHERTZ}, 0, 0, FLAGS, "width_type"},
     {"width", "set width", OFFSET(width), AV_OPT_TYPE_DOUBLE, {.dbl=0.707}, 0, 99999, FLAGS},
     {"w",     "set width", OFFSET(width), AV_OPT_TYPE_DOUBLE, {.dbl=0.707}, 0, 99999, FLAGS},
-    {"poles", "set number of poles", OFFSET(poles), AV_OPT_TYPE_INT, {.i64=2}, 1, 2, FLAGS},
-    {"p",     "set number of poles", OFFSET(poles), AV_OPT_TYPE_INT, {.i64=2}, 1, 2, FLAGS},
+    {"poles", "set number of poles", OFFSET(poles), AV_OPT_TYPE_INT, {.i64=2}, 1, 2, AF},
+    {"p",     "set number of poles", OFFSET(poles), AV_OPT_TYPE_INT, {.i64=2}, 1, 2, AF},
+    {"mix", "set mix", OFFSET(mix), AV_OPT_TYPE_DOUBLE, {.dbl=1}, 0, 1, FLAGS},
+    {"m",   "set mix", OFFSET(mix), AV_OPT_TYPE_DOUBLE, {.dbl=1}, 0, 1, FLAGS},
     {"channels", "set channels to filter", OFFSET(channels), AV_OPT_TYPE_CHANNEL_LAYOUT, {.i64=-1}, INT64_MIN, INT64_MAX, FLAGS},
     {"c",        "set channels to filter", OFFSET(channels), AV_OPT_TYPE_CHANNEL_LAYOUT, {.i64=-1}, INT64_MIN, INT64_MAX, FLAGS},
+    {"normalize", "normalize coefficients", OFFSET(normalize), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS},
+    {"n",         "normalize coefficients", OFFSET(normalize), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS},
     {NULL}
 };
 
@@ -797,10 +741,14 @@
     {"k", "kHz", 0, AV_OPT_TYPE_CONST, {.i64=KHERTZ}, 0, 0, FLAGS, "width_type"},
     {"width", "set width", OFFSET(width), AV_OPT_TYPE_DOUBLE, {.dbl=0.707}, 0, 99999, FLAGS},
     {"w",     "set width", OFFSET(width), AV_OPT_TYPE_DOUBLE, {.dbl=0.707}, 0, 99999, FLAGS},
-    {"poles", "set number of poles", OFFSET(poles), AV_OPT_TYPE_INT, {.i64=2}, 1, 2, FLAGS},
-    {"p",     "set number of poles", OFFSET(poles), AV_OPT_TYPE_INT, {.i64=2}, 1, 2, FLAGS},
+    {"poles", "set number of poles", OFFSET(poles), AV_OPT_TYPE_INT, {.i64=2}, 1, 2, AF},
+    {"p",     "set number of poles", OFFSET(poles), AV_OPT_TYPE_INT, {.i64=2}, 1, 2, AF},
+    {"mix", "set mix", OFFSET(mix), AV_OPT_TYPE_DOUBLE, {.dbl=1}, 0, 1, FLAGS},
+    {"m",   "set mix", OFFSET(mix), AV_OPT_TYPE_DOUBLE, {.dbl=1}, 0, 1, FLAGS},
     {"channels", "set channels to filter", OFFSET(channels), AV_OPT_TYPE_CHANNEL_LAYOUT, {.i64=-1}, INT64_MIN, INT64_MAX, FLAGS},
     {"c",        "set channels to filter", OFFSET(channels), AV_OPT_TYPE_CHANNEL_LAYOUT, {.i64=-1}, INT64_MIN, INT64_MAX, FLAGS},
+    {"normalize", "normalize coefficients", OFFSET(normalize), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS},
+    {"n",         "normalize coefficients", OFFSET(normalize), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS},
     {NULL}
 };
 
@@ -819,8 +767,12 @@
     {"k", "kHz", 0, AV_OPT_TYPE_CONST, {.i64=KHERTZ}, 0, 0, FLAGS, "width_type"},
     {"width", "set filter-width", OFFSET(width), AV_OPT_TYPE_DOUBLE, {.dbl=707.1}, 0, 99999, FLAGS},
     {"w",     "set filter-width", OFFSET(width), AV_OPT_TYPE_DOUBLE, {.dbl=707.1}, 0, 99999, FLAGS},
+    {"mix", "set mix", OFFSET(mix), AV_OPT_TYPE_DOUBLE, {.dbl=1}, 0, 1, FLAGS},
+    {"m",   "set mix", OFFSET(mix), AV_OPT_TYPE_DOUBLE, {.dbl=1}, 0, 1, FLAGS},
     {"channels", "set channels to filter", OFFSET(channels), AV_OPT_TYPE_CHANNEL_LAYOUT, {.i64=-1}, INT64_MIN, INT64_MAX, FLAGS},
     {"c",        "set channels to filter", OFFSET(channels), AV_OPT_TYPE_CHANNEL_LAYOUT, {.i64=-1}, INT64_MIN, INT64_MAX, FLAGS},
+    {"normalize", "normalize coefficients", OFFSET(normalize), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS},
+    {"n",         "normalize coefficients", OFFSET(normalize), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS},
     {NULL}
 };
 
@@ -841,8 +793,12 @@
     {"w",     "set shelf transition steep", OFFSET(width), AV_OPT_TYPE_DOUBLE, {.dbl=0.5}, 0, 99999, FLAGS},
     {"gain", "set gain", OFFSET(gain), AV_OPT_TYPE_DOUBLE, {.dbl=0}, -900, 900, FLAGS},
     {"g",    "set gain", OFFSET(gain), AV_OPT_TYPE_DOUBLE, {.dbl=0}, -900, 900, FLAGS},
+    {"mix", "set mix", OFFSET(mix), AV_OPT_TYPE_DOUBLE, {.dbl=1}, 0, 1, FLAGS},
+    {"m",   "set mix", OFFSET(mix), AV_OPT_TYPE_DOUBLE, {.dbl=1}, 0, 1, FLAGS},
     {"channels", "set channels to filter", OFFSET(channels), AV_OPT_TYPE_CHANNEL_LAYOUT, {.i64=-1}, INT64_MIN, INT64_MAX, FLAGS},
     {"c",        "set channels to filter", OFFSET(channels), AV_OPT_TYPE_CHANNEL_LAYOUT, {.i64=-1}, INT64_MIN, INT64_MAX, FLAGS},
+    {"normalize", "normalize coefficients", OFFSET(normalize), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS},
+    {"n",         "normalize coefficients", OFFSET(normalize), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS},
     {NULL}
 };
 
@@ -863,8 +819,12 @@
     {"w",     "set shelf transition steep", OFFSET(width), AV_OPT_TYPE_DOUBLE, {.dbl=0.5}, 0, 99999, FLAGS},
     {"gain", "set gain", OFFSET(gain), AV_OPT_TYPE_DOUBLE, {.dbl=0}, -900, 900, FLAGS},
     {"g",    "set gain", OFFSET(gain), AV_OPT_TYPE_DOUBLE, {.dbl=0}, -900, 900, FLAGS},
+    {"mix", "set mix", OFFSET(mix), AV_OPT_TYPE_DOUBLE, {.dbl=1}, 0, 1, FLAGS},
+    {"m",   "set mix", OFFSET(mix), AV_OPT_TYPE_DOUBLE, {.dbl=1}, 0, 1, FLAGS},
     {"channels", "set channels to filter", OFFSET(channels), AV_OPT_TYPE_CHANNEL_LAYOUT, {.i64=-1}, INT64_MIN, INT64_MAX, FLAGS},
     {"c",        "set channels to filter", OFFSET(channels), AV_OPT_TYPE_CHANNEL_LAYOUT, {.i64=-1}, INT64_MIN, INT64_MAX, FLAGS},
+    {"normalize", "normalize coefficients", OFFSET(normalize), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS},
+    {"n",         "normalize coefficients", OFFSET(normalize), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS},
     {NULL}
 };
 
@@ -878,8 +838,12 @@
     {"b0", NULL, OFFSET(b0), AV_OPT_TYPE_DOUBLE, {.dbl=0}, INT32_MIN, INT32_MAX, FLAGS},
     {"b1", NULL, OFFSET(b1), AV_OPT_TYPE_DOUBLE, {.dbl=0}, INT32_MIN, INT32_MAX, FLAGS},
     {"b2", NULL, OFFSET(b2), AV_OPT_TYPE_DOUBLE, {.dbl=0}, INT32_MIN, INT32_MAX, FLAGS},
+    {"mix", "set mix", OFFSET(mix), AV_OPT_TYPE_DOUBLE, {.dbl=1}, 0, 1, FLAGS},
+    {"m",   "set mix", OFFSET(mix), AV_OPT_TYPE_DOUBLE, {.dbl=1}, 0, 1, FLAGS},
     {"channels", "set channels to filter", OFFSET(channels), AV_OPT_TYPE_CHANNEL_LAYOUT, {.i64=-1}, INT64_MIN, INT64_MAX, FLAGS},
     {"c",        "set channels to filter", OFFSET(channels), AV_OPT_TYPE_CHANNEL_LAYOUT, {.i64=-1}, INT64_MIN, INT64_MAX, FLAGS},
+    {"normalize", "normalize coefficients", OFFSET(normalize), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS},
+    {"n",         "normalize coefficients", OFFSET(normalize), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS},
     {NULL}
 };
 
diff --git a/libavfilter/af_compand.c b/libavfilter/af_compand.c
index c138f0b..d4a816d 100644
--- a/libavfilter/af_compand.c
+++ b/libavfilter/af_compand.c
@@ -349,9 +349,10 @@
     }
 
     if (nb_attacks > channels || nb_decays > channels) {
-        av_log(ctx, AV_LOG_ERROR,
-                "Number of attacks/decays bigger than number of channels.\n");
-        return AVERROR(EINVAL);
+        av_log(ctx, AV_LOG_WARNING,
+                "Number of attacks/decays bigger than number of channels. Ignoring rest of entries.\n");
+        nb_attacks = FFMIN(nb_attacks, channels);
+        nb_decays  = FFMIN(nb_decays, channels);
     }
 
     uninit(ctx);
diff --git a/libavfilter/af_crossfeed.c b/libavfilter/af_crossfeed.c
index a0af280..c819ca5 100644
--- a/libavfilter/af_crossfeed.c
+++ b/libavfilter/af_crossfeed.c
@@ -17,6 +17,7 @@
  */
 
 #include "libavutil/channel_layout.h"
+#include "libavutil/ffmath.h"
 #include "libavutil/opt.h"
 #include "avfilter.h"
 #include "audio.h"
@@ -57,7 +58,7 @@
 {
     AVFilterContext *ctx = inlink->dst;
     CrossfeedContext *s = ctx->priv;
-    double A = exp(s->strength * -30 / 40 * log(10.));
+    double A = ff_exp10(s->strength * -30 / 40);
     double w0 = 2 * M_PI * (1. - s->range) * 2100 / inlink->sample_rate;
     double alpha;
 
@@ -118,8 +119,13 @@
         s->o2 = s->o1;
         s->o1 = oside;
 
-        dst[0] = (mid + oside) * level_out;
-        dst[1] = (mid - oside) * level_out;
+        if (ctx->is_disabled) {
+            dst[0] = src[0];
+            dst[1] = src[1];
+        } else {
+            dst[0] = (mid + oside) * level_out;
+            dst[1] = (mid - oside) * level_out;
+        }
     }
 
     if (out != in)
@@ -166,4 +172,5 @@
     .priv_class     = &crossfeed_class,
     .inputs         = inputs,
     .outputs        = outputs,
+    .flags          = AVFILTER_FLAG_SUPPORT_TIMELINE_INTERNAL,
 };
diff --git a/libavfilter/af_crystalizer.c b/libavfilter/af_crystalizer.c
index 5b27e1f..f3d8ae6 100644
--- a/libavfilter/af_crystalizer.c
+++ b/libavfilter/af_crystalizer.c
@@ -29,12 +29,11 @@
     float mult;
     int clip;
     AVFrame *prev;
-    void (*filter)(void **dst, void **prv, const void **src,
-                   int nb_samples, int channels, float mult, int clip);
+    int (*filter)(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs);
 } CrystalizerContext;
 
 #define OFFSET(x) offsetof(CrystalizerContext, x)
-#define A AV_OPT_FLAG_AUDIO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
+#define A AV_OPT_FLAG_AUDIO_PARAM|AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_RUNTIME_PARAM
 
 static const AVOption crystalizer_options[] = {
     { "i", "set intensity",    OFFSET(mult), AV_OPT_TYPE_FLOAT, {.dbl=2.0}, 0, 10, A },
@@ -74,42 +73,71 @@
     return ff_set_common_samplerates(ctx, formats);
 }
 
-static void filter_flt(void **d, void **p, const void **s,
-                       int nb_samples, int channels,
-                       float mult, int clip)
+typedef struct ThreadData {
+    void **d;
+    void **p;
+    const void **s;
+    int nb_samples;
+    int channels;
+    float mult;
+    int clip;
+} ThreadData;
+
+static int filter_flt(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
 {
-    const float *src = s[0];
-    float *dst = d[0];
+    ThreadData *td = arg;
+    void **d = td->d;
+    void **p = td->p;
+    const void **s = td->s;
+    const int nb_samples = td->nb_samples;
+    const int channels = td->channels;
+    float mult = td->mult;
+    const int clip = td->clip;
+    const int start = (channels * jobnr) / nb_jobs;
+    const int end = (channels * (jobnr+1)) / nb_jobs;
     float *prv = p[0];
     int n, c;
 
-    for (n = 0; n < nb_samples; n++) {
-        for (c = 0; c < channels; c++) {
-            float current = src[c];
+    for (c = start; c < end; c++) {
+        const float *src = s[0];
+        float *dst = d[0];
 
+        for (n = 0; n < nb_samples; n++) {
+            float current = src[c];
             dst[c] = current + (current - prv[c]) * mult;
             prv[c] = current;
             if (clip) {
                 dst[c] = av_clipf(dst[c], -1, 1);
             }
-        }
 
-        dst += c;
-        src += c;
+            dst += channels;
+            src += channels;
+        }
     }
+
+    return 0;
 }
 
-static void filter_dbl(void **d, void **p, const void **s,
-                       int nb_samples, int channels,
-                       float mult, int clip)
+static int filter_dbl(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
 {
-    const double *src = s[0];
-    double *dst = d[0];
+    ThreadData *td = arg;
+    void **d = td->d;
+    void **p = td->p;
+    const void **s = td->s;
+    const int nb_samples = td->nb_samples;
+    const int channels = td->channels;
+    float mult = td->mult;
+    const int clip = td->clip;
+    const int start = (channels * jobnr) / nb_jobs;
+    const int end = (channels * (jobnr+1)) / nb_jobs;
     double *prv = p[0];
     int n, c;
 
-    for (n = 0; n < nb_samples; n++) {
-        for (c = 0; c < channels; c++) {
+    for (c = start; c < end; c++) {
+        const double *src = s[0];
+        double *dst = d[0];
+
+        for (n = 0; n < nb_samples; n++) {
             double current = src[c];
 
             dst[c] = current + (current - prv[c]) * mult;
@@ -117,20 +145,30 @@
             if (clip) {
                 dst[c] = av_clipd(dst[c], -1, 1);
             }
-        }
 
-        dst += c;
-        src += c;
+            dst += channels;
+            src += channels;
+        }
     }
+
+    return 0;
 }
 
-static void filter_fltp(void **d, void **p, const void **s,
-                        int nb_samples, int channels,
-                        float mult, int clip)
+static int filter_fltp(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
 {
+    ThreadData *td = arg;
+    void **d = td->d;
+    void **p = td->p;
+    const void **s = td->s;
+    const int nb_samples = td->nb_samples;
+    const int channels = td->channels;
+    float mult = td->mult;
+    const int clip = td->clip;
+    const int start = (channels * jobnr) / nb_jobs;
+    const int end = (channels * (jobnr+1)) / nb_jobs;
     int n, c;
 
-    for (c = 0; c < channels; c++) {
+    for (c = start; c < end; c++) {
         const float *src = s[c];
         float *dst = d[c];
         float *prv = p[c];
@@ -145,15 +183,25 @@
             }
         }
     }
+
+    return 0;
 }
 
-static void filter_dblp(void **d, void **p, const void **s,
-                        int nb_samples, int channels,
-                        float mult, int clip)
+static int filter_dblp(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
 {
+    ThreadData *td = arg;
+    void **d = td->d;
+    void **p = td->p;
+    const void **s = td->s;
+    const int nb_samples = td->nb_samples;
+    const int channels = td->channels;
+    float mult = td->mult;
+    const int clip = td->clip;
+    const int start = (channels * jobnr) / nb_jobs;
+    const int end = (channels * (jobnr+1)) / nb_jobs;
     int n, c;
 
-    for (c = 0; c < channels; c++) {
+    for (c = start; c < end; c++) {
         const double *src = s[c];
         double *dst = d[c];
         double *prv = p[c];
@@ -168,6 +216,8 @@
             }
         }
     }
+
+    return 0;
 }
 
 static int config_input(AVFilterLink *inlink)
@@ -191,6 +241,7 @@
     AVFilterLink *outlink = ctx->outputs[0];
     CrystalizerContext *s = ctx->priv;
     AVFrame *out;
+    ThreadData td;
 
     if (!s->prev) {
         s->prev = ff_get_audio_buffer(inlink, 1);
@@ -211,8 +262,15 @@
         av_frame_copy_props(out, in);
     }
 
-    s->filter((void **)out->extended_data, (void **)s->prev->extended_data, (const void **)in->extended_data,
-              in->nb_samples, in->channels, s->mult, s->clip);
+    td.d = (void **)out->extended_data;
+    td.s = (const void **)in->extended_data;
+    td.p = (void **)s->prev->extended_data;
+    td.nb_samples = in->nb_samples;
+    td.channels = in->channels;
+    td.mult = ctx->is_disabled ? 0.f : s->mult;
+    td.clip = s->clip;
+    ctx->internal->execute(ctx, s->filter, &td, NULL, FFMIN(inlink->channels,
+                                                            ff_filter_get_nb_threads(ctx)));
 
     if (out != in)
         av_frame_free(&in);
@@ -254,4 +312,7 @@
     .uninit         = uninit,
     .inputs         = inputs,
     .outputs        = outputs,
+    .process_command = ff_filter_process_command,
+    .flags          = AVFILTER_FLAG_SUPPORT_TIMELINE_INTERNAL |
+                      AVFILTER_FLAG_SLICE_THREADS,
 };
diff --git a/libavfilter/af_deesser.c b/libavfilter/af_deesser.c
new file mode 100644
index 0000000..fad3e98
--- /dev/null
+++ b/libavfilter/af_deesser.c
@@ -0,0 +1,244 @@
+/*
+ * Copyright (c) 2018 Chris Johnson
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+#include "libavutil/channel_layout.h"
+#include "libavutil/opt.h"
+#include "avfilter.h"
+#include "audio.h"
+#include "formats.h"
+
+typedef struct DeesserChannel {
+    double s1, s2, s3;
+    double m1, m2;
+    double ratioA, ratioB;
+    double iirSampleA, iirSampleB;
+    int flip;
+} DeesserChannel;
+
+typedef struct DeesserContext {
+    const AVClass *class;
+
+    double intensity;
+    double max;
+    double frequency;
+    int    mode;
+
+    DeesserChannel *chan;
+} DeesserContext;
+
+enum OutModes {
+    IN_MODE,
+    OUT_MODE,
+    ESS_MODE,
+    NB_MODES
+};
+
+#define OFFSET(x) offsetof(DeesserContext, x)
+#define A AV_OPT_FLAG_AUDIO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
+
+static const AVOption deesser_options[] = {
+    { "i", "set intensity",    OFFSET(intensity), AV_OPT_TYPE_DOUBLE, {.dbl=0.0}, 0.0, 1.0, A },
+    { "m", "set max deessing", OFFSET(max),       AV_OPT_TYPE_DOUBLE, {.dbl=0.5}, 0.0, 1.0, A },
+    { "f", "set frequency",    OFFSET(frequency), AV_OPT_TYPE_DOUBLE, {.dbl=0.5}, 0.0, 1.0, A },
+    { "s", "set output mode",  OFFSET(mode),      AV_OPT_TYPE_INT,    {.i64=OUT_MODE}, 0, NB_MODES-1, A, "mode" },
+    {  "i", "input",           0,                 AV_OPT_TYPE_CONST,  {.i64=IN_MODE},  0, 0, A, "mode" },
+    {  "o", "output",          0,                 AV_OPT_TYPE_CONST,  {.i64=OUT_MODE}, 0, 0, A, "mode" },
+    {  "e", "ess",             0,                 AV_OPT_TYPE_CONST,  {.i64=ESS_MODE}, 0, 0, A, "mode" },
+    { NULL }
+};
+
+AVFILTER_DEFINE_CLASS(deesser);
+
+static int query_formats(AVFilterContext *ctx)
+{
+    AVFilterFormats *formats = NULL;
+    AVFilterChannelLayouts *layouts = NULL;
+    static const enum AVSampleFormat sample_fmts[] = {
+        AV_SAMPLE_FMT_DBLP,
+        AV_SAMPLE_FMT_NONE
+    };
+    int ret;
+
+    formats = ff_make_format_list(sample_fmts);
+    if (!formats)
+        return AVERROR(ENOMEM);
+    ret = ff_set_common_formats(ctx, formats);
+    if (ret < 0)
+        return ret;
+
+    layouts = ff_all_channel_counts();
+    if (!layouts)
+        return AVERROR(ENOMEM);
+
+    ret = ff_set_common_channel_layouts(ctx, layouts);
+    if (ret < 0)
+        return ret;
+
+    formats = ff_all_samplerates();
+    return ff_set_common_samplerates(ctx, formats);
+}
+
+static int config_input(AVFilterLink *inlink)
+{
+    AVFilterContext *ctx = inlink->dst;
+    DeesserContext *s = ctx->priv;
+
+    s->chan = av_calloc(inlink->channels, sizeof(*s->chan));
+    if (!s->chan)
+        return AVERROR(ENOMEM);
+
+    for (int i = 0; i < inlink->channels; i++) {
+        DeesserChannel *chan = &s->chan[i];
+
+        chan->ratioA = chan->ratioB = 1.0;
+    }
+
+    return 0;
+}
+
+static int filter_frame(AVFilterLink *inlink, AVFrame *in)
+{
+    AVFilterContext *ctx = inlink->dst;
+    AVFilterLink *outlink = ctx->outputs[0];
+    DeesserContext *s = ctx->priv;
+    AVFrame *out;
+
+    if (av_frame_is_writable(in)) {
+        out = in;
+    } else {
+        out = ff_get_audio_buffer(outlink, in->nb_samples);
+        if (!out) {
+            av_frame_free(&in);
+            return AVERROR(ENOMEM);
+        }
+        av_frame_copy_props(out, in);
+    }
+
+    for (int ch = 0; ch < inlink->channels; ch++) {
+        DeesserChannel *dec = &s->chan[ch];
+        double *src = (double *)in->extended_data[ch];
+        double *dst = (double *)out->extended_data[ch];
+        double overallscale = inlink->sample_rate < 44100 ? 44100.0 / inlink->sample_rate : inlink->sample_rate / 44100.0;
+        double intensity = pow(s->intensity, 5) * (8192 / overallscale);
+        double maxdess = 1.0 / pow(10.0, ((s->max - 1.0) * 48.0) / 20);
+        double iirAmount = pow(s->frequency, 2) / overallscale;
+        double offset;
+        double sense;
+        double recovery;
+        double attackspeed;
+
+        for (int i = 0; i < in->nb_samples; i++) {
+            double sample = src[i];
+
+            dec->s3 = dec->s2;
+            dec->s2 = dec->s1;
+            dec->s1 = sample;
+            dec->m1 = (dec->s1 - dec->s2) * ((dec->s1 - dec->s2) / 1.3);
+            dec->m2 = (dec->s2 - dec->s3) * ((dec->s1 - dec->s2) / 1.3);
+            sense = (dec->m1 - dec->m2) * ((dec->m1 - dec->m2) / 1.3);
+            attackspeed = 7.0 + sense * 1024;
+
+            sense = 1.0 + intensity * intensity * sense;
+            sense = FFMIN(sense, intensity);
+            recovery = 1.0 + (0.01 / sense);
+
+            offset = 1.0 - fabs(sample);
+
+            if (dec->flip) {
+                dec->iirSampleA = (dec->iirSampleA * (1.0 - (offset * iirAmount))) +
+                                  (sample * (offset * iirAmount));
+                if (dec->ratioA < sense) {
+                    dec->ratioA = ((dec->ratioA * attackspeed) + sense) / (attackspeed + 1.0);
+                } else {
+                    dec->ratioA = 1.0 + ((dec->ratioA - 1.0) / recovery);
+                }
+
+                dec->ratioA = FFMIN(dec->ratioA, maxdess);
+                sample = dec->iirSampleA + ((sample - dec->iirSampleA) / dec->ratioA);
+            } else {
+                dec->iirSampleB = (dec->iirSampleB * (1.0 - (offset * iirAmount))) +
+                                  (sample * (offset * iirAmount));
+                if (dec->ratioB < sense) {
+                    dec->ratioB = ((dec->ratioB * attackspeed) + sense) / (attackspeed + 1.0);
+                } else {
+                    dec->ratioB = 1.0 + ((dec->ratioB - 1.0) / recovery);
+                }
+
+                dec->ratioB = FFMIN(dec->ratioB, maxdess);
+                sample = dec->iirSampleB + ((sample - dec->iirSampleB) / dec->ratioB);
+            }
+
+            dec->flip = !dec->flip;
+
+            if (ctx->is_disabled)
+                sample = src[i];
+
+            switch (s->mode) {
+            case IN_MODE:  dst[i] = src[i]; break;
+            case OUT_MODE: dst[i] = sample; break;
+            case ESS_MODE: dst[i] = src[i] - sample; break;
+            }
+        }
+    }
+
+    if (out != in)
+        av_frame_free(&in);
+
+    return ff_filter_frame(outlink, out);
+}
+
+static av_cold void uninit(AVFilterContext *ctx)
+{
+    DeesserContext *s = ctx->priv;
+
+    av_freep(&s->chan);
+}
+
+static const AVFilterPad inputs[] = {
+    {
+        .name         = "default",
+        .type         = AVMEDIA_TYPE_AUDIO,
+        .filter_frame = filter_frame,
+        .config_props = config_input,
+    },
+    { NULL }
+};
+
+static const AVFilterPad outputs[] = {
+    {
+        .name = "default",
+        .type = AVMEDIA_TYPE_AUDIO,
+    },
+    { NULL }
+};
+
+AVFilter ff_af_deesser = {
+    .name          = "deesser",
+    .description   = NULL_IF_CONFIG_SMALL("Apply de-essing to the audio."),
+    .query_formats = query_formats,
+    .priv_size     = sizeof(DeesserContext),
+    .priv_class    = &deesser_class,
+    .uninit        = uninit,
+    .inputs        = inputs,
+    .outputs       = outputs,
+    .flags         = AVFILTER_FLAG_SUPPORT_TIMELINE_INTERNAL,
+};
diff --git a/libavfilter/af_dynaudnorm.c b/libavfilter/af_dynaudnorm.c
index 5919304..365453d 100644
--- a/libavfilter/af_dynaudnorm.c
+++ b/libavfilter/af_dynaudnorm.c
@@ -29,18 +29,27 @@
 #include "libavutil/avassert.h"
 #include "libavutil/opt.h"
 
-#define FF_BUFQUEUE_SIZE 302
+#define MIN_FILTER_SIZE 3
+#define MAX_FILTER_SIZE 301
+
+#define FF_BUFQUEUE_SIZE (MAX_FILTER_SIZE + 1)
 #include "libavfilter/bufferqueue.h"
 
 #include "audio.h"
 #include "avfilter.h"
+#include "filters.h"
 #include "internal.h"
 
+typedef struct local_gain {
+    double max_gain;
+    double threshold;
+} local_gain;
+
 typedef struct cqueue {
     double *elements;
     int size;
+    int max_size;
     int nb_elements;
-    int first;
 } cqueue;
 
 typedef struct DynamicAudioNormalizerContext {
@@ -59,33 +68,48 @@
     double max_amplification;
     double target_rms;
     double compress_factor;
+    double threshold;
     double *prev_amplification_factor;
     double *dc_correction_value;
     double *compress_threshold;
-    double *fade_factors[2];
     double *weights;
 
     int channels;
-    int delay;
+    int eof;
+    int64_t pts;
 
     cqueue **gain_history_original;
     cqueue **gain_history_minimum;
     cqueue **gain_history_smoothed;
+    cqueue **threshold_history;
+
+    cqueue *is_enabled;
 } DynamicAudioNormalizerContext;
 
 #define OFFSET(x) offsetof(DynamicAudioNormalizerContext, x)
-#define FLAGS AV_OPT_FLAG_AUDIO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
+#define FLAGS AV_OPT_FLAG_AUDIO_PARAM|AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_RUNTIME_PARAM
 
 static const AVOption dynaudnorm_options[] = {
-    { "f", "set the frame length in msec",     OFFSET(frame_len_msec),    AV_OPT_TYPE_INT,    {.i64 = 500},   10,  8000, FLAGS },
-    { "g", "set the filter size",              OFFSET(filter_size),       AV_OPT_TYPE_INT,    {.i64 = 31},     3,   301, FLAGS },
-    { "p", "set the peak value",               OFFSET(peak_value),        AV_OPT_TYPE_DOUBLE, {.dbl = 0.95}, 0.0,   1.0, FLAGS },
-    { "m", "set the max amplification",        OFFSET(max_amplification), AV_OPT_TYPE_DOUBLE, {.dbl = 10.0}, 1.0, 100.0, FLAGS },
-    { "r", "set the target RMS",               OFFSET(target_rms),        AV_OPT_TYPE_DOUBLE, {.dbl = 0.0},  0.0,   1.0, FLAGS },
-    { "n", "set channel coupling",             OFFSET(channels_coupled),  AV_OPT_TYPE_BOOL,   {.i64 = 1},      0,     1, FLAGS },
-    { "c", "set DC correction",                OFFSET(dc_correction),     AV_OPT_TYPE_BOOL,   {.i64 = 0},      0,     1, FLAGS },
-    { "b", "set alternative boundary mode",    OFFSET(alt_boundary_mode), AV_OPT_TYPE_BOOL,   {.i64 = 0},      0,     1, FLAGS },
-    { "s", "set the compress factor",          OFFSET(compress_factor),   AV_OPT_TYPE_DOUBLE, {.dbl = 0.0},  0.0,  30.0, FLAGS },
+    { "framelen",    "set the frame length in msec",     OFFSET(frame_len_msec),    AV_OPT_TYPE_INT,    {.i64 = 500},   10,  8000, FLAGS },
+    { "f",           "set the frame length in msec",     OFFSET(frame_len_msec),    AV_OPT_TYPE_INT,    {.i64 = 500},   10,  8000, FLAGS },
+    { "gausssize",   "set the filter size",              OFFSET(filter_size),       AV_OPT_TYPE_INT,    {.i64 = 31},     3,   301, FLAGS },
+    { "g",           "set the filter size",              OFFSET(filter_size),       AV_OPT_TYPE_INT,    {.i64 = 31},     3,   301, FLAGS },
+    { "peak",        "set the peak value",               OFFSET(peak_value),        AV_OPT_TYPE_DOUBLE, {.dbl = 0.95}, 0.0,   1.0, FLAGS },
+    { "p",           "set the peak value",               OFFSET(peak_value),        AV_OPT_TYPE_DOUBLE, {.dbl = 0.95}, 0.0,   1.0, FLAGS },
+    { "maxgain",     "set the max amplification",        OFFSET(max_amplification), AV_OPT_TYPE_DOUBLE, {.dbl = 10.0}, 1.0, 100.0, FLAGS },
+    { "m",           "set the max amplification",        OFFSET(max_amplification), AV_OPT_TYPE_DOUBLE, {.dbl = 10.0}, 1.0, 100.0, FLAGS },
+    { "targetrms",   "set the target RMS",               OFFSET(target_rms),        AV_OPT_TYPE_DOUBLE, {.dbl = 0.0},  0.0,   1.0, FLAGS },
+    { "r",           "set the target RMS",               OFFSET(target_rms),        AV_OPT_TYPE_DOUBLE, {.dbl = 0.0},  0.0,   1.0, FLAGS },
+    { "coupling",    "set channel coupling",             OFFSET(channels_coupled),  AV_OPT_TYPE_BOOL,   {.i64 = 1},      0,     1, FLAGS },
+    { "n",           "set channel coupling",             OFFSET(channels_coupled),  AV_OPT_TYPE_BOOL,   {.i64 = 1},      0,     1, FLAGS },
+    { "correctdc",   "set DC correction",                OFFSET(dc_correction),     AV_OPT_TYPE_BOOL,   {.i64 = 0},      0,     1, FLAGS },
+    { "c",           "set DC correction",                OFFSET(dc_correction),     AV_OPT_TYPE_BOOL,   {.i64 = 0},      0,     1, FLAGS },
+    { "altboundary", "set alternative boundary mode",    OFFSET(alt_boundary_mode), AV_OPT_TYPE_BOOL,   {.i64 = 0},      0,     1, FLAGS },
+    { "b",           "set alternative boundary mode",    OFFSET(alt_boundary_mode), AV_OPT_TYPE_BOOL,   {.i64 = 0},      0,     1, FLAGS },
+    { "compress",    "set the compress factor",          OFFSET(compress_factor),   AV_OPT_TYPE_DOUBLE, {.dbl = 0.0},  0.0,  30.0, FLAGS },
+    { "s",           "set the compress factor",          OFFSET(compress_factor),   AV_OPT_TYPE_DOUBLE, {.dbl = 0.0},  0.0,  30.0, FLAGS },
+    { "threshold",   "set the threshold value",          OFFSET(threshold),         AV_OPT_TYPE_DOUBLE, {.dbl = 0.0},  0.0,   1.0, FLAGS },
+    { "t",           "set the threshold value",          OFFSET(threshold),         AV_OPT_TYPE_DOUBLE, {.dbl = 0.0},  0.0,   1.0, FLAGS },
     { NULL }
 };
 
@@ -96,8 +120,8 @@
     DynamicAudioNormalizerContext *s = ctx->priv;
 
     if (!(s->filter_size & 1)) {
-        av_log(ctx, AV_LOG_ERROR, "filter size %d is invalid. Must be an odd value.\n", s->filter_size);
-        return AVERROR(EINVAL);
+        av_log(ctx, AV_LOG_WARNING, "filter size %d is invalid. Changing to an odd value.\n", s->filter_size);
+        s->filter_size |= 1;
     }
 
     return 0;
@@ -139,30 +163,22 @@
     return frame_size + (frame_size % 2);
 }
 
-static void precalculate_fade_factors(double *fade_factors[2], int frame_len)
-{
-    const double step_size = 1.0 / frame_len;
-    int pos;
-
-    for (pos = 0; pos < frame_len; pos++) {
-        fade_factors[0][pos] = 1.0 - (step_size * (pos + 1.0));
-        fade_factors[1][pos] = 1.0 - fade_factors[0][pos];
-    }
-}
-
-static cqueue *cqueue_create(int size)
+static cqueue *cqueue_create(int size, int max_size)
 {
     cqueue *q;
 
+    if (max_size < size)
+        return NULL;
+
     q = av_malloc(sizeof(cqueue));
     if (!q)
         return NULL;
 
+    q->max_size = max_size;
     q->size = size;
     q->nb_elements = 0;
-    q->first = 0;
 
-    q->elements = av_malloc_array(size, sizeof(double));
+    q->elements = av_malloc_array(max_size, sizeof(double));
     if (!q->elements) {
         av_free(q);
         return NULL;
@@ -185,17 +201,14 @@
 
 static int cqueue_empty(cqueue *q)
 {
-    return !q->nb_elements;
+    return q->nb_elements <= 0;
 }
 
 static int cqueue_enqueue(cqueue *q, double element)
 {
-    int i;
+    av_assert2(q->nb_elements < q->max_size);
 
-    av_assert2(q->nb_elements != q->size);
-
-    i = (q->first + q->nb_elements) % q->size;
-    q->elements[i] = element;
+    q->elements[q->nb_elements] = element;
     q->nb_elements++;
 
     return 0;
@@ -204,15 +217,15 @@
 static double cqueue_peek(cqueue *q, int index)
 {
     av_assert2(index < q->nb_elements);
-    return q->elements[(q->first + index) % q->size];
+    return q->elements[index];
 }
 
 static int cqueue_dequeue(cqueue *q, double *element)
 {
     av_assert2(!cqueue_empty(q));
 
-    *element = q->elements[q->first];
-    q->first = (q->first + 1) % q->size;
+    *element = q->elements[0];
+    memmove(&q->elements[0], &q->elements[1], (q->nb_elements - 1) * sizeof(double));
     q->nb_elements--;
 
     return 0;
@@ -222,12 +235,34 @@
 {
     av_assert2(!cqueue_empty(q));
 
-    q->first = (q->first + 1) % q->size;
+    memmove(&q->elements[0], &q->elements[1], (q->nb_elements - 1) * sizeof(double));
     q->nb_elements--;
 
     return 0;
 }
 
+static void cqueue_resize(cqueue *q, int new_size)
+{
+    av_assert2(q->max_size >= new_size);
+    av_assert2(MIN_FILTER_SIZE <= new_size);
+
+    if (new_size > q->nb_elements) {
+        const int side = (new_size - q->nb_elements) / 2;
+
+        memmove(q->elements + side, q->elements, sizeof(double) * q->nb_elements);
+        for (int i = 0; i < side; i++)
+            q->elements[i] = q->elements[side];
+        q->nb_elements = new_size - 1 - side;
+    } else {
+        int count = (q->size - new_size + 1) / 2;
+
+        while (count-- > 0)
+            cqueue_pop(q);
+    }
+
+    q->size = new_size;
+}
+
 static void init_gaussian_filter(DynamicAudioNormalizerContext *s)
 {
     double total_weight = 0.0;
@@ -263,8 +298,6 @@
     av_freep(&s->prev_amplification_factor);
     av_freep(&s->dc_correction_value);
     av_freep(&s->compress_threshold);
-    av_freep(&s->fade_factors[0]);
-    av_freep(&s->fade_factors[1]);
 
     for (c = 0; c < s->channels; c++) {
         if (s->gain_history_original)
@@ -273,11 +306,17 @@
             cqueue_free(s->gain_history_minimum[c]);
         if (s->gain_history_smoothed)
             cqueue_free(s->gain_history_smoothed[c]);
+        if (s->threshold_history)
+            cqueue_free(s->threshold_history[c]);
     }
 
     av_freep(&s->gain_history_original);
     av_freep(&s->gain_history_minimum);
     av_freep(&s->gain_history_smoothed);
+    av_freep(&s->threshold_history);
+
+    cqueue_free(s->is_enabled);
+    s->is_enabled = NULL;
 
     av_freep(&s->weights);
 
@@ -292,53 +331,50 @@
 
     uninit(ctx);
 
-    s->frame_len =
-    inlink->min_samples =
-    inlink->max_samples =
-    inlink->partial_buf_size = frame_size(inlink->sample_rate, s->frame_len_msec);
+    s->channels = inlink->channels;
+    s->frame_len = frame_size(inlink->sample_rate, s->frame_len_msec);
     av_log(ctx, AV_LOG_DEBUG, "frame len %d\n", s->frame_len);
 
-    s->fade_factors[0] = av_malloc_array(s->frame_len, sizeof(*s->fade_factors[0]));
-    s->fade_factors[1] = av_malloc_array(s->frame_len, sizeof(*s->fade_factors[1]));
-
     s->prev_amplification_factor = av_malloc_array(inlink->channels, sizeof(*s->prev_amplification_factor));
     s->dc_correction_value = av_calloc(inlink->channels, sizeof(*s->dc_correction_value));
     s->compress_threshold = av_calloc(inlink->channels, sizeof(*s->compress_threshold));
     s->gain_history_original = av_calloc(inlink->channels, sizeof(*s->gain_history_original));
     s->gain_history_minimum = av_calloc(inlink->channels, sizeof(*s->gain_history_minimum));
     s->gain_history_smoothed = av_calloc(inlink->channels, sizeof(*s->gain_history_smoothed));
-    s->weights = av_malloc_array(s->filter_size, sizeof(*s->weights));
+    s->threshold_history = av_calloc(inlink->channels, sizeof(*s->threshold_history));
+    s->weights = av_malloc_array(MAX_FILTER_SIZE, sizeof(*s->weights));
+    s->is_enabled = cqueue_create(s->filter_size, MAX_FILTER_SIZE);
     if (!s->prev_amplification_factor || !s->dc_correction_value ||
-        !s->compress_threshold || !s->fade_factors[0] || !s->fade_factors[1] ||
+        !s->compress_threshold ||
         !s->gain_history_original || !s->gain_history_minimum ||
-        !s->gain_history_smoothed || !s->weights)
+        !s->gain_history_smoothed || !s->threshold_history ||
+        !s->is_enabled || !s->weights)
         return AVERROR(ENOMEM);
 
     for (c = 0; c < inlink->channels; c++) {
         s->prev_amplification_factor[c] = 1.0;
 
-        s->gain_history_original[c] = cqueue_create(s->filter_size);
-        s->gain_history_minimum[c]  = cqueue_create(s->filter_size);
-        s->gain_history_smoothed[c] = cqueue_create(s->filter_size);
+        s->gain_history_original[c] = cqueue_create(s->filter_size, MAX_FILTER_SIZE);
+        s->gain_history_minimum[c]  = cqueue_create(s->filter_size, MAX_FILTER_SIZE);
+        s->gain_history_smoothed[c] = cqueue_create(s->filter_size, MAX_FILTER_SIZE);
+        s->threshold_history[c]     = cqueue_create(s->filter_size, MAX_FILTER_SIZE);
 
         if (!s->gain_history_original[c] || !s->gain_history_minimum[c] ||
-            !s->gain_history_smoothed[c])
+            !s->gain_history_smoothed[c] || !s->threshold_history[c])
             return AVERROR(ENOMEM);
     }
 
-    precalculate_fade_factors(s->fade_factors, s->frame_len);
     init_gaussian_filter(s);
 
-    s->channels = inlink->channels;
-    s->delay = s->filter_size;
-
     return 0;
 }
 
-static inline double fade(double prev, double next, int pos,
-                          double *fade_factors[2])
+static inline double fade(double prev, double next, int pos, int length)
 {
-    return fade_factors[0][pos] * prev + fade_factors[1][pos] * next;
+    const double step_size = 1.0 / length;
+    const double f0 = 1.0 - (step_size * (pos + 1.0));
+    const double f1 = 1.0 - f0;
+    return f0 * prev + f1 * next;
 }
 
 static inline double pow_2(const double value)
@@ -401,12 +437,18 @@
     return FFMAX(sqrt(rms_value), DBL_EPSILON);
 }
 
-static double get_max_local_gain(DynamicAudioNormalizerContext *s, AVFrame *frame,
-                                 int channel)
+static local_gain get_max_local_gain(DynamicAudioNormalizerContext *s, AVFrame *frame,
+                                     int channel)
 {
-    const double maximum_gain = s->peak_value / find_peak_magnitude(frame, channel);
+    const double peak_magnitude = find_peak_magnitude(frame, channel);
+    const double maximum_gain = s->peak_value / peak_magnitude;
     const double rms_gain = s->target_rms > DBL_EPSILON ? (s->target_rms / compute_frame_rms(frame, channel)) : DBL_MAX;
-    return bound(s->max_amplification, FFMIN(maximum_gain, rms_gain));
+    local_gain gain;
+
+    gain.threshold = peak_magnitude > s->threshold;
+    gain.max_gain  = bound(s->max_amplification, FFMIN(maximum_gain, rms_gain));
+
+    return gain;
 }
 
 static double minimum_filter(cqueue *q)
@@ -421,38 +463,41 @@
     return min;
 }
 
-static double gaussian_filter(DynamicAudioNormalizerContext *s, cqueue *q)
+static double gaussian_filter(DynamicAudioNormalizerContext *s, cqueue *q, cqueue *tq)
 {
-    double result = 0.0;
+    double result = 0.0, tsum = 0.0;
     int i;
 
     for (i = 0; i < cqueue_size(q); i++) {
-        result += cqueue_peek(q, i) * s->weights[i];
+        tsum += cqueue_peek(tq, i) * s->weights[i];
+        result += cqueue_peek(q, i) * s->weights[i] * cqueue_peek(tq, i);
     }
 
+    if (tsum == 0.0)
+        result = 1.0;
+
     return result;
 }
 
 static void update_gain_history(DynamicAudioNormalizerContext *s, int channel,
-                                double current_gain_factor)
+                                local_gain gain)
 {
-    if (cqueue_empty(s->gain_history_original[channel]) ||
-        cqueue_empty(s->gain_history_minimum[channel])) {
+    if (cqueue_empty(s->gain_history_original[channel])) {
         const int pre_fill_size = s->filter_size / 2;
-        const double initial_value = s->alt_boundary_mode ? current_gain_factor : 1.0;
+        const double initial_value = s->alt_boundary_mode ? gain.max_gain : s->peak_value;
 
         s->prev_amplification_factor[channel] = initial_value;
 
         while (cqueue_size(s->gain_history_original[channel]) < pre_fill_size) {
             cqueue_enqueue(s->gain_history_original[channel], initial_value);
+            cqueue_enqueue(s->threshold_history[channel], gain.threshold);
         }
     }
 
-    cqueue_enqueue(s->gain_history_original[channel], current_gain_factor);
+    cqueue_enqueue(s->gain_history_original[channel], gain.max_gain);
 
     while (cqueue_size(s->gain_history_original[channel]) >= s->filter_size) {
         double minimum;
-        av_assert0(cqueue_size(s->gain_history_original[channel]) == s->filter_size);
 
         if (cqueue_empty(s->gain_history_minimum[channel])) {
             const int pre_fill_size = s->filter_size / 2;
@@ -470,17 +515,22 @@
 
         cqueue_enqueue(s->gain_history_minimum[channel], minimum);
 
+        cqueue_enqueue(s->threshold_history[channel], gain.threshold);
+
         cqueue_pop(s->gain_history_original[channel]);
     }
 
     while (cqueue_size(s->gain_history_minimum[channel]) >= s->filter_size) {
-        double smoothed;
-        av_assert0(cqueue_size(s->gain_history_minimum[channel]) == s->filter_size);
-        smoothed = gaussian_filter(s, s->gain_history_minimum[channel]);
+        double smoothed, limit;
+
+        smoothed = gaussian_filter(s, s->gain_history_minimum[channel], s->threshold_history[channel]);
+        limit    = cqueue_peek(s->gain_history_original[channel], 0);
+        smoothed = FFMIN(smoothed, limit);
 
         cqueue_enqueue(s->gain_history_smoothed[channel], smoothed);
 
         cqueue_pop(s->gain_history_minimum[channel]);
+        cqueue_pop(s->threshold_history[channel]);
     }
 }
 
@@ -508,7 +558,7 @@
         s->dc_correction_value[c] = is_first_frame ? current_average_value : update_value(current_average_value, s->dc_correction_value[c], 0.1);
 
         for (i = 0; i < frame->nb_samples; i++) {
-            dst_ptr[i] -= fade(prev_value, s->dc_correction_value[c], i, s->fade_factors);
+            dst_ptr[i] -= fade(prev_value, s->dc_correction_value[c], i, frame->nb_samples);
         }
     }
 }
@@ -581,7 +631,7 @@
         for (c = 0; c < s->channels; c++) {
             double *const dst_ptr = (double *)frame->extended_data[c];
             for (i = 0; i < frame->nb_samples; i++) {
-                const double localThresh = fade(prev_actual_thresh, curr_actual_thresh, i, s->fade_factors);
+                const double localThresh = fade(prev_actual_thresh, curr_actual_thresh, i, frame->nb_samples);
                 dst_ptr[i] = copysign(bound(localThresh, fabs(dst_ptr[i])), dst_ptr[i]);
             }
         }
@@ -600,7 +650,7 @@
 
             dst_ptr = (double *)frame->extended_data[c];
             for (i = 0; i < frame->nb_samples; i++) {
-                const double localThresh = fade(prev_actual_thresh, curr_actual_thresh, i, s->fade_factors);
+                const double localThresh = fade(prev_actual_thresh, curr_actual_thresh, i, frame->nb_samples);
                 dst_ptr[i] = copysign(bound(localThresh, fabs(dst_ptr[i])), dst_ptr[i]);
             }
         }
@@ -618,11 +668,11 @@
     }
 
     if (s->channels_coupled) {
-        const double current_gain_factor = get_max_local_gain(s, frame, -1);
+        const local_gain gain = get_max_local_gain(s, frame, -1);
         int c;
 
         for (c = 0; c < s->channels; c++)
-            update_gain_history(s, c, current_gain_factor);
+            update_gain_history(s, c, gain);
     } else {
         int c;
 
@@ -631,7 +681,7 @@
     }
 }
 
-static void amplify_frame(DynamicAudioNormalizerContext *s, AVFrame *frame)
+static void amplify_frame(DynamicAudioNormalizerContext *s, AVFrame *frame, int enabled)
 {
     int c, i;
 
@@ -641,15 +691,12 @@
 
         cqueue_dequeue(s->gain_history_smoothed[c], &current_amplification_factor);
 
-        for (i = 0; i < frame->nb_samples; i++) {
+        for (i = 0; i < frame->nb_samples && enabled; i++) {
             const double amplification_factor = fade(s->prev_amplification_factor[c],
                                                      current_amplification_factor, i,
-                                                     s->fade_factors);
+                                                     frame->nb_samples);
 
             dst_ptr[i] *= amplification_factor;
-
-            if (fabs(dst_ptr[i]) > s->peak_value)
-                dst_ptr[i] = copysign(s->peak_value, dst_ptr[i]);
         }
 
         s->prev_amplification_factor[c] = current_amplification_factor;
@@ -660,18 +707,29 @@
 {
     AVFilterContext *ctx = inlink->dst;
     DynamicAudioNormalizerContext *s = ctx->priv;
-    AVFilterLink *outlink = inlink->dst->outputs[0];
-    int ret = 0;
+    AVFilterLink *outlink = ctx->outputs[0];
+    int ret = 1;
 
-    if (!cqueue_empty(s->gain_history_smoothed[0])) {
+    while (((s->queue.available >= s->filter_size) ||
+            (s->eof && s->queue.available)) &&
+           !cqueue_empty(s->gain_history_smoothed[0])) {
         AVFrame *out = ff_bufqueue_get(&s->queue);
+        double is_enabled;
 
-        amplify_frame(s, out);
+        cqueue_dequeue(s->is_enabled, &is_enabled);
+
+        amplify_frame(s, out, is_enabled > 0.);
         ret = ff_filter_frame(outlink, out);
     }
 
+    av_frame_make_writable(in);
     analyze_frame(s, in);
-    ff_bufqueue_add(ctx, &s->queue, in);
+    if (!s->eof) {
+        ff_bufqueue_add(ctx, &s->queue, in);
+        cqueue_enqueue(s->is_enabled, !ctx->is_disabled);
+    } else {
+        av_frame_free(&in);
+    }
 
     return ret;
 }
@@ -697,38 +755,106 @@
         }
     }
 
-    s->delay--;
     return filter_frame(inlink, out);
 }
 
-static int request_frame(AVFilterLink *outlink)
+static int flush(AVFilterLink *outlink)
 {
     AVFilterContext *ctx = outlink->src;
     DynamicAudioNormalizerContext *s = ctx->priv;
     int ret = 0;
 
-    ret = ff_request_frame(ctx->inputs[0]);
+    if (!cqueue_empty(s->gain_history_smoothed[0])) {
+        ret = flush_buffer(s, ctx->inputs[0], outlink);
+    } else if (s->queue.available) {
+        AVFrame *out = ff_bufqueue_get(&s->queue);
 
-    if (ret == AVERROR_EOF && !ctx->is_disabled && s->delay) {
-        if (!cqueue_empty(s->gain_history_smoothed[0])) {
-            ret = flush_buffer(s, ctx->inputs[0], outlink);
-        } else if (s->queue.available) {
-            AVFrame *out = ff_bufqueue_get(&s->queue);
-
-            ret = ff_filter_frame(outlink, out);
-        }
+        s->pts = out->pts;
+        ret = ff_filter_frame(outlink, out);
     }
 
     return ret;
 }
 
+static int activate(AVFilterContext *ctx)
+{
+    AVFilterLink *inlink = ctx->inputs[0];
+    AVFilterLink *outlink = ctx->outputs[0];
+    DynamicAudioNormalizerContext *s = ctx->priv;
+    AVFrame *in = NULL;
+    int ret = 0, status;
+    int64_t pts;
+
+    FF_FILTER_FORWARD_STATUS_BACK(outlink, inlink);
+
+    if (!s->eof) {
+        ret = ff_inlink_consume_samples(inlink, s->frame_len, s->frame_len, &in);
+        if (ret < 0)
+            return ret;
+        if (ret > 0) {
+            ret = filter_frame(inlink, in);
+            if (ret <= 0)
+                return ret;
+        }
+
+        if (ff_inlink_queued_samples(inlink) >= s->frame_len) {
+            ff_filter_set_ready(ctx, 10);
+            return 0;
+        }
+    }
+
+    if (!s->eof && ff_inlink_acknowledge_status(inlink, &status, &pts)) {
+        if (status == AVERROR_EOF)
+            s->eof = 1;
+    }
+
+    if (s->eof && s->queue.available)
+        return flush(outlink);
+
+    if (s->eof && !s->queue.available) {
+        ff_outlink_set_status(outlink, AVERROR_EOF, s->pts);
+        return 0;
+    }
+
+    if (!s->eof)
+        FF_FILTER_FORWARD_WANTED(outlink, inlink);
+
+    return FFERROR_NOT_READY;
+}
+
+static int process_command(AVFilterContext *ctx, const char *cmd, const char *args,
+                           char *res, int res_len, int flags)
+{
+    DynamicAudioNormalizerContext *s = ctx->priv;
+    AVFilterLink *inlink = ctx->inputs[0];
+    int prev_filter_size = s->filter_size;
+    int ret;
+
+    ret = ff_filter_process_command(ctx, cmd, args, res, res_len, flags);
+    if (ret < 0)
+        return ret;
+
+    s->filter_size |= 1;
+    if (prev_filter_size != s->filter_size) {
+        init_gaussian_filter(s);
+
+        for (int c = 0; c < s->channels; c++) {
+            cqueue_resize(s->gain_history_original[c], s->filter_size);
+            cqueue_resize(s->gain_history_minimum[c], s->filter_size);
+            cqueue_resize(s->threshold_history[c], s->filter_size);
+        }
+    }
+
+    s->frame_len = frame_size(inlink->sample_rate, s->frame_len_msec);
+
+    return 0;
+}
+
 static const AVFilterPad avfilter_af_dynaudnorm_inputs[] = {
     {
         .name           = "default",
         .type           = AVMEDIA_TYPE_AUDIO,
-        .filter_frame   = filter_frame,
         .config_props   = config_input,
-        .needs_writable = 1,
     },
     { NULL }
 };
@@ -737,7 +863,6 @@
     {
         .name          = "default",
         .type          = AVMEDIA_TYPE_AUDIO,
-        .request_frame = request_frame,
     },
     { NULL }
 };
@@ -749,7 +874,10 @@
     .priv_size     = sizeof(DynamicAudioNormalizerContext),
     .init          = init,
     .uninit        = uninit,
+    .activate      = activate,
     .inputs        = avfilter_af_dynaudnorm_inputs,
     .outputs       = avfilter_af_dynaudnorm_outputs,
     .priv_class    = &dynaudnorm_class,
+    .flags         = AVFILTER_FLAG_SUPPORT_TIMELINE_INTERNAL,
+    .process_command = process_command,
 };
diff --git a/libavfilter/af_extrastereo.c b/libavfilter/af_extrastereo.c
index 13c6f47..d8e4da9 100644
--- a/libavfilter/af_extrastereo.c
+++ b/libavfilter/af_extrastereo.c
@@ -31,7 +31,7 @@
 } ExtraStereoContext;
 
 #define OFFSET(x) offsetof(ExtraStereoContext, x)
-#define A AV_OPT_FLAG_AUDIO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
+#define A AV_OPT_FLAG_AUDIO_PARAM|AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_RUNTIME_PARAM
 
 static const AVOption extrastereo_options[] = {
     { "m", "set the difference coefficient", OFFSET(mult), AV_OPT_TYPE_FLOAT, {.dbl=2.5}, -10, 10, A },
@@ -128,4 +128,6 @@
     .priv_class     = &extrastereo_class,
     .inputs         = inputs,
     .outputs        = outputs,
+    .flags          = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC,
+    .process_command = ff_filter_process_command,
 };
diff --git a/libavfilter/af_firequalizer.c b/libavfilter/af_firequalizer.c
index 00ddc87..f4513a1 100644
--- a/libavfilter/af_firequalizer.c
+++ b/libavfilter/af_firequalizer.c
@@ -112,10 +112,11 @@
 
 #define OFFSET(x) offsetof(FIREqualizerContext, x)
 #define FLAGS AV_OPT_FLAG_AUDIO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
+#define TFLAGS AV_OPT_FLAG_AUDIO_PARAM|AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_RUNTIME_PARAM
 
 static const AVOption firequalizer_options[] = {
-    { "gain", "set gain curve", OFFSET(gain), AV_OPT_TYPE_STRING, { .str = "gain_interpolate(f)" }, 0, 0, FLAGS },
-    { "gain_entry", "set gain entry", OFFSET(gain_entry), AV_OPT_TYPE_STRING, { .str = NULL }, 0, 0, FLAGS },
+    { "gain", "set gain curve", OFFSET(gain), AV_OPT_TYPE_STRING, { .str = "gain_interpolate(f)" }, 0, 0, TFLAGS },
+    { "gain_entry", "set gain entry", OFFSET(gain_entry), AV_OPT_TYPE_STRING, { .str = NULL }, 0, 0, TFLAGS },
     { "delay", "set delay", OFFSET(delay), AV_OPT_TYPE_DOUBLE, { .dbl = 0.01 }, 0.0, 1e10, FLAGS },
     { "accuracy", "set accuracy", OFFSET(accuracy), AV_OPT_TYPE_DOUBLE, { .dbl = 5.0 }, 0.0, 1e10, FLAGS },
     { "wfunc", "set window function", OFFSET(wfunc), AV_OPT_TYPE_INT, { .i64 = WFUNC_HANN }, 0, NB_WFUNC-1, FLAGS, "wfunc" },
diff --git a/libavfilter/af_flanger.c b/libavfilter/af_flanger.c
index b7497a1..33c8245 100644
--- a/libavfilter/af_flanger.c
+++ b/libavfilter/af_flanger.c
@@ -72,7 +72,7 @@
 
 AVFILTER_DEFINE_CLASS(flanger);
 
-static int init(AVFilterContext *ctx)
+static av_cold int init(AVFilterContext *ctx)
 {
     FlangerContext *s = ctx->priv;
 
diff --git a/libavfilter/af_headphone.c b/libavfilter/af_headphone.c
index 760b97b..552ad84 100644
--- a/libavfilter/af_headphone.c
+++ b/libavfilter/af_headphone.c
@@ -50,6 +50,7 @@
     int eof_hrirs;
 
     int ir_len;
+    int air_len;
 
     int mapping[64];
 
@@ -72,6 +73,7 @@
     float *data_ir[2];
     float *temp_src[2];
     FFTComplex *temp_fft[2];
+    FFTComplex *temp_afft[2];
 
     FFTContext *fft[2], *ifft[2];
     FFTComplex *data_hrtf[2];
@@ -157,6 +159,7 @@
     float **ringbuffer;
     float **temp_src;
     FFTComplex **temp_fft;
+    FFTComplex **temp_afft;
 } ThreadData;
 
 static int headphone_convolute(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
@@ -172,6 +175,7 @@
     float *ringbuffer = td->ringbuffer[jobnr];
     float *temp_src = td->temp_src[jobnr];
     const int ir_len = s->ir_len;
+    const int air_len = s->air_len;
     const float *src = (const float *)in->data[0];
     float *dst = (float *)out->data[0];
     const int in_channels = in->channels;
@@ -200,7 +204,7 @@
 
             if (l == s->lfe_channel) {
                 *dst += *(buffer[s->lfe_channel] + wr) * s->gain_lfe;
-                temp_ir += FFALIGN(ir_len, 16);
+                temp_ir += air_len;
                 continue;
             }
 
@@ -209,18 +213,18 @@
             if (read + ir_len < buffer_length) {
                 memcpy(temp_src, bptr + read, ir_len * sizeof(*temp_src));
             } else {
-                int len = FFMIN(ir_len - (read % ir_len), buffer_length - read);
+                int len = FFMIN(air_len - (read % ir_len), buffer_length - read);
 
                 memcpy(temp_src, bptr + read, len * sizeof(*temp_src));
-                memcpy(temp_src + len, bptr, (ir_len - len) * sizeof(*temp_src));
+                memcpy(temp_src + len, bptr, (air_len - len) * sizeof(*temp_src));
             }
 
-            dst[0] += s->fdsp->scalarproduct_float(temp_ir, temp_src, ir_len);
-            temp_ir += FFALIGN(ir_len, 16);
+            dst[0] += s->fdsp->scalarproduct_float(temp_ir, temp_src, FFALIGN(ir_len, 32));
+            temp_ir += air_len;
         }
 
-        if (fabs(*dst) > 1)
-            *n_clippings += 1;
+        if (fabsf(dst[0]) > 1)
+            n_clippings[0]++;
 
         dst += 2;
         src += in_channels;
@@ -249,6 +253,7 @@
     const int buffer_length = s->buffer_length;
     const uint32_t modulo = (uint32_t)buffer_length - 1;
     FFTComplex *fft_in = s->temp_fft[jobnr];
+    FFTComplex *fft_acc = s->temp_afft[jobnr];
     FFTContext *ifft = s->ifft[jobnr];
     FFTContext *fft = s->fft[jobnr];
     const int n_fft = s->n_fft;
@@ -260,7 +265,7 @@
 
     dst += offset;
 
-    n_read = FFMIN(s->ir_len, in->nb_samples);
+    n_read = FFMIN(ir_len, in->nb_samples);
     for (j = 0; j < n_read; j++) {
         dst[2 * j]     = ringbuffer[wr];
         ringbuffer[wr] = 0.0;
@@ -271,6 +276,8 @@
         dst[2 * j] = 0;
     }
 
+    memset(fft_acc, 0, sizeof(FFTComplex) * n_fft);
+
     for (i = 0; i < in_channels; i++) {
         if (i == s->lfe_channel) {
             for (j = 0; j < in->nb_samples; j++) {
@@ -295,26 +302,26 @@
             const float re = fft_in[j].re;
             const float im = fft_in[j].im;
 
-            fft_in[j].re = re * hcomplex->re - im * hcomplex->im;
-            fft_in[j].im = re * hcomplex->im + im * hcomplex->re;
-        }
-
-        av_fft_permute(ifft, fft_in);
-        av_fft_calc(ifft, fft_in);
-
-        for (j = 0; j < in->nb_samples; j++) {
-            dst[2 * j] += fft_in[j].re * fft_scale;
-        }
-
-        for (j = 0; j < ir_len - 1; j++) {
-            int write_pos = (wr + j) & modulo;
-
-            *(ringbuffer + write_pos) += fft_in[in->nb_samples + j].re * fft_scale;
+            fft_acc[j].re += re * hcomplex->re - im * hcomplex->im;
+            fft_acc[j].im += re * hcomplex->im + im * hcomplex->re;
         }
     }
 
+    av_fft_permute(ifft, fft_acc);
+    av_fft_calc(ifft, fft_acc);
+
+    for (j = 0; j < in->nb_samples; j++) {
+        dst[2 * j] += fft_acc[j].re * fft_scale;
+    }
+
+    for (j = 0; j < ir_len - 1; j++) {
+        int write_pos = (wr + j) & modulo;
+
+        *(ringbuffer + write_pos) += fft_acc[in->nb_samples + j].re * fft_scale;
+    }
+
     for (i = 0; i < out->nb_samples; i++) {
-        if (fabs(*dst) > 1) {
+        if (fabsf(dst[0]) > 1) {
             n_clippings[0]++;
         }
 
@@ -362,6 +369,7 @@
     td.delay = s->delay; td.ir = s->data_ir; td.n_clippings = n_clippings;
     td.ringbuffer = s->ringbuffer; td.temp_src = s->temp_src;
     td.temp_fft = s->temp_fft;
+    td.temp_afft = s->temp_afft;
 
     if (s->type == TIME_DOMAIN) {
         ctx->internal->execute(ctx, headphone_convolute, &td, NULL, 2);
@@ -396,8 +404,9 @@
     int n_fft;
     int i, j, k;
 
-    s->buffer_length = 1 << (32 - ff_clz(s->ir_len));
-    s->n_fft = n_fft = 1 << (32 - ff_clz(s->ir_len + s->size));
+    s->air_len = 1 << (32 - ff_clz(ir_len));
+    s->buffer_length = 1 << (32 - ff_clz(s->air_len));
+    s->n_fft = n_fft = 1 << (32 - ff_clz(ir_len + s->size));
 
     if (s->type == FREQUENCY_DOMAIN) {
         fft_in_l = av_calloc(n_fft, sizeof(*fft_in_l));
@@ -409,12 +418,12 @@
 
         av_fft_end(s->fft[0]);
         av_fft_end(s->fft[1]);
-        s->fft[0] = av_fft_init(log2(s->n_fft), 0);
-        s->fft[1] = av_fft_init(log2(s->n_fft), 0);
+        s->fft[0] = av_fft_init(av_log2(s->n_fft), 0);
+        s->fft[1] = av_fft_init(av_log2(s->n_fft), 0);
         av_fft_end(s->ifft[0]);
         av_fft_end(s->ifft[1]);
-        s->ifft[0] = av_fft_init(log2(s->n_fft), 1);
-        s->ifft[1] = av_fft_init(log2(s->n_fft), 1);
+        s->ifft[0] = av_fft_init(av_log2(s->n_fft), 1);
+        s->ifft[1] = av_fft_init(av_log2(s->n_fft), 1);
 
         if (!s->fft[0] || !s->fft[1] || !s->ifft[0] || !s->ifft[1]) {
             av_log(ctx, AV_LOG_ERROR, "Unable to create FFT contexts of size %d.\n", s->n_fft);
@@ -423,8 +432,8 @@
         }
     }
 
-    s->data_ir[0] = av_calloc(FFALIGN(s->ir_len, 16), sizeof(float) * s->nb_irs);
-    s->data_ir[1] = av_calloc(FFALIGN(s->ir_len, 16), sizeof(float) * s->nb_irs);
+    s->data_ir[0] = av_calloc(s->air_len, sizeof(float) * s->nb_irs);
+    s->data_ir[1] = av_calloc(s->air_len, sizeof(float) * s->nb_irs);
     s->delay[0] = av_calloc(s->nb_irs, sizeof(float));
     s->delay[1] = av_calloc(s->nb_irs, sizeof(float));
 
@@ -436,7 +445,10 @@
         s->ringbuffer[1] = av_calloc(s->buffer_length, sizeof(float));
         s->temp_fft[0] = av_calloc(s->n_fft, sizeof(FFTComplex));
         s->temp_fft[1] = av_calloc(s->n_fft, sizeof(FFTComplex));
-        if (!s->temp_fft[0] || !s->temp_fft[1]) {
+        s->temp_afft[0] = av_calloc(s->n_fft, sizeof(FFTComplex));
+        s->temp_afft[1] = av_calloc(s->n_fft, sizeof(FFTComplex));
+        if (!s->temp_fft[0] || !s->temp_fft[1] ||
+            !s->temp_afft[0] || !s->temp_afft[1]) {
             ret = AVERROR(ENOMEM);
             goto fail;
         }
@@ -449,11 +461,11 @@
     }
 
     if (s->type == TIME_DOMAIN) {
-        s->temp_src[0] = av_calloc(FFALIGN(ir_len, 16), sizeof(float));
-        s->temp_src[1] = av_calloc(FFALIGN(ir_len, 16), sizeof(float));
+        s->temp_src[0] = av_calloc(s->air_len, sizeof(float));
+        s->temp_src[1] = av_calloc(s->air_len, sizeof(float));
 
-        data_ir_l = av_calloc(nb_irs * FFALIGN(ir_len, 16), sizeof(*data_ir_l));
-        data_ir_r = av_calloc(nb_irs * FFALIGN(ir_len, 16), sizeof(*data_ir_r));
+        data_ir_l = av_calloc(nb_irs * s->air_len, sizeof(*data_ir_l));
+        data_ir_r = av_calloc(nb_irs * s->air_len, sizeof(*data_ir_r));
         if (!data_ir_r || !data_ir_l || !s->temp_src[0] || !s->temp_src[1]) {
             ret = AVERROR(ENOMEM);
             goto fail;
@@ -475,7 +487,7 @@
 
         ret = ff_inlink_consume_samples(ctx->inputs[i + 1], len, len, &s->in[i + 1].frame);
         if (ret < 0)
-            return ret;
+            goto fail;
         ptr = (float *)s->in[i + 1].frame->extended_data[0];
 
         if (s->hrir_fmt == HRIR_STEREO) {
@@ -495,7 +507,7 @@
             if (idx == -1)
                 continue;
             if (s->type == TIME_DOMAIN) {
-                offset = idx * FFALIGN(len, 16);
+                offset = idx * s->air_len;
                 for (j = 0; j < len; j++) {
                     data_ir_l[offset + j] = ptr[len * 2 - j * 2 - 2] * gain_lin;
                     data_ir_r[offset + j] = ptr[len * 2 - j * 2 - 1] * gain_lin;
@@ -538,7 +550,7 @@
 
                 I = idx * 2;
                 if (s->type == TIME_DOMAIN) {
-                    offset = idx * FFALIGN(len, 16);
+                    offset = idx * s->air_len;
                     for (j = 0; j < len; j++) {
                         data_ir_l[offset + j] = ptr[len * N - j * N - N + I    ] * gain_lin;
                         data_ir_r[offset + j] = ptr[len * N - j * N - N + I + 1] * gain_lin;
@@ -567,8 +579,8 @@
     }
 
     if (s->type == TIME_DOMAIN) {
-        memcpy(s->data_ir[0], data_ir_l, sizeof(float) * nb_irs * FFALIGN(ir_len, 16));
-        memcpy(s->data_ir[1], data_ir_r, sizeof(float) * nb_irs * FFALIGN(ir_len, 16));
+        memcpy(s->data_ir[0], data_ir_l, sizeof(float) * nb_irs * s->air_len);
+        memcpy(s->data_ir[1], data_ir_r, sizeof(float) * nb_irs * s->air_len);
     } else {
         s->data_hrtf[0] = av_calloc(n_fft * s->nb_irs, sizeof(FFTComplex));
         s->data_hrtf[1] = av_calloc(n_fft * s->nb_irs, sizeof(FFTComplex));
@@ -587,6 +599,9 @@
 
 fail:
 
+    for (i = 0; i < s->nb_inputs - 1; i++)
+        av_frame_free(&s->in[i + 1].frame);
+
     av_freep(&data_ir_l);
     av_freep(&data_ir_r);
 
@@ -694,7 +709,7 @@
     if (s->hrir_fmt == HRIR_MULTI) {
         hrir_layouts = ff_all_channel_counts();
         if (!hrir_layouts)
-            ret = AVERROR(ENOMEM);
+            return AVERROR(ENOMEM);
         ret = ff_channel_layouts_ref(hrir_layouts, &ctx->inputs[1]->out_channel_layouts);
         if (ret)
             return ret;
@@ -789,7 +804,7 @@
         }
     }
 
-    s->gain_lfe = expf((s->gain - 3 * inlink->channels - 6 + s->lfe_gain) / 20 * M_LN10);
+    s->gain_lfe = expf((s->gain - 3 * inlink->channels + s->lfe_gain) / 20 * M_LN10);
 
     return 0;
 }
@@ -813,6 +828,8 @@
     av_freep(&s->temp_src[1]);
     av_freep(&s->temp_fft[0]);
     av_freep(&s->temp_fft[1]);
+    av_freep(&s->temp_afft[0]);
+    av_freep(&s->temp_afft[1]);
     av_freep(&s->data_hrtf[0]);
     av_freep(&s->data_hrtf[1]);
     av_freep(&s->fdsp);
diff --git a/libavfilter/af_join.c b/libavfilter/af_join.c
index 930c9e4..ea03b60 100644
--- a/libavfilter/af_join.c
+++ b/libavfilter/af_join.c
@@ -25,6 +25,7 @@
  */
 
 #include "libavutil/avassert.h"
+#include "libavutil/avstring.h"
 #include "libavutil/channel_layout.h"
 #include "libavutil/common.h"
 #include "libavutil/opt.h"
@@ -185,12 +186,10 @@
         return ret;
 
     for (i = 0; i < s->inputs; i++) {
-        char name[32];
         AVFilterPad pad = { 0 };
 
-        snprintf(name, sizeof(name), "input%d", i);
-        pad.type           = AVMEDIA_TYPE_AUDIO;
-        pad.name           = av_strdup(name);
+        pad.type = AVMEDIA_TYPE_AUDIO;
+        pad.name = av_asprintf("input%d", i);
         if (!pad.name)
             return AVERROR(ENOMEM);
 
@@ -208,9 +207,12 @@
     JoinContext *s = ctx->priv;
     int i;
 
+    for (i = 0; i < s->inputs && s->input_frames; i++) {
+        av_frame_free(&s->input_frames[i]);
+    }
+
     for (i = 0; i < ctx->nb_inputs; i++) {
         av_freep(&ctx->input_pads[i].name);
-        av_frame_free(&s->input_frames[i]);
     }
 
     av_freep(&s->channels);
diff --git a/libavfilter/af_ladspa.c b/libavfilter/af_ladspa.c
index 3be26bc..a8562fc 100644
--- a/libavfilter/af_ladspa.c
+++ b/libavfilter/af_ladspa.c
@@ -548,8 +548,8 @@
             break;
         p = NULL;
 
-        if (sscanf(arg, "c%d=%f", &i, &val) != 2) {
-            if (sscanf(arg, "%f", &val) != 1) {
+        if (av_sscanf(arg, "c%d=%f", &i, &val) != 2) {
+            if (av_sscanf(arg, "%f", &val) != 1) {
                 av_log(ctx, AV_LOG_ERROR, "Invalid syntax.\n");
                 return AVERROR(EINVAL);
             }
@@ -715,7 +715,7 @@
     LADSPA_Data value;
     unsigned long port;
 
-    if (sscanf(cmd, "c%ld", &port) + sscanf(args, "%f", &value) != 2)
+    if (av_sscanf(cmd, "c%ld", &port) + av_sscanf(args, "%f", &value) != 2)
         return AVERROR(EINVAL);
 
     return set_control(ctx, port, value);
diff --git a/libavfilter/af_pan.c b/libavfilter/af_pan.c
index 34e522c..6924d1c 100644
--- a/libavfilter/af_pan.c
+++ b/libavfilter/af_pan.c
@@ -424,7 +424,7 @@
 #define OFFSET(x) offsetof(PanContext, x)
 
 static const AVOption pan_options[] = {
-    { "args", NULL, OFFSET(args), AV_OPT_TYPE_STRING, { .str = NULL }, CHAR_MIN, CHAR_MAX, AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_FILTERING_PARAM },
+    { "args", NULL, OFFSET(args), AV_OPT_TYPE_STRING, { .str = NULL }, 0, 0, AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_FILTERING_PARAM },
     { NULL }
 };
 
diff --git a/libavfilter/af_replaygain.c b/libavfilter/af_replaygain.c
index 9761734..53fe49d 100644
--- a/libavfilter/af_replaygain.c
+++ b/libavfilter/af_replaygain.c
@@ -551,7 +551,7 @@
     AVFilterContext *ctx = inlink->dst;
     AVFilterLink *outlink = ctx->outputs[0];
     ReplayGainContext *s = ctx->priv;
-    uint32_t level;
+    int64_t level;
     AVFrame *out;
 
     out = ff_get_audio_buffer(outlink, in->nb_samples);
@@ -567,9 +567,9 @@
                                                  out->nb_samples);
     butter_filter_stereo_samples(s, (float *)out->data[0],
                                              out->nb_samples);
-    level = (uint32_t)floor(100 * calc_stereo_rms((float *)out->data[0],
-                                                           out->nb_samples));
-    level = av_clip(level, 0, HISTOGRAM_SLOTS - 1);
+    level = lrint(floor(100 * calc_stereo_rms((float *)out->data[0],
+                                                           out->nb_samples)));
+    level = av_clip64(level, 0, HISTOGRAM_SLOTS - 1);
 
     s->histogram[level]++;
 
diff --git a/libavfilter/af_rubberband.c b/libavfilter/af_rubberband.c
index ea6f4ff..1dfd7442 100644
--- a/libavfilter/af_rubberband.c
+++ b/libavfilter/af_rubberband.c
@@ -24,6 +24,7 @@
 
 #include "audio.h"
 #include "avfilter.h"
+#include "filters.h"
 #include "formats.h"
 #include "internal.h"
 
@@ -36,15 +37,17 @@
         smoothing, formant, opitch, channels;
     int64_t nb_samples_out;
     int64_t nb_samples_in;
-    int flushed;
+    int64_t first_pts;
+    int nb_samples;
 } RubberBandContext;
 
 #define OFFSET(x) offsetof(RubberBandContext, x)
 #define A AV_OPT_FLAG_AUDIO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
+#define AT AV_OPT_FLAG_AUDIO_PARAM|AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_RUNTIME_PARAM
 
 static const AVOption rubberband_options[] = {
-    { "tempo",      "set tempo scale factor", OFFSET(tempo), AV_OPT_TYPE_DOUBLE, {.dbl=1}, 0.01, 100, A },
-    { "pitch",      "set pitch scale factor", OFFSET(pitch), AV_OPT_TYPE_DOUBLE, {.dbl=1}, 0.01, 100, A },
+    { "tempo",      "set tempo scale factor", OFFSET(tempo), AV_OPT_TYPE_DOUBLE, {.dbl=1}, 0.01, 100, AT },
+    { "pitch",      "set pitch scale factor", OFFSET(pitch), AV_OPT_TYPE_DOUBLE, {.dbl=1}, 0.01, 100, AT },
     { "transients", "set transients", OFFSET(transients), AV_OPT_TYPE_INT, {.i64=0}, 0, INT_MAX, A, "transients" },
         { "crisp",  0,                0,                  AV_OPT_TYPE_CONST, {.i64=RubberBandOptionTransientsCrisp},  0, 0, A, "transients" },
         { "mixed",  0,                0,                  AV_OPT_TYPE_CONST, {.i64=RubberBandOptionTransientsMixed},  0, 0, A, "transients" },
@@ -118,12 +121,16 @@
 
 static int filter_frame(AVFilterLink *inlink, AVFrame *in)
 {
-    RubberBandContext *s = inlink->dst->priv;
-    AVFilterLink *outlink = inlink->dst->outputs[0];
+    AVFilterContext *ctx = inlink->dst;
+    RubberBandContext *s = ctx->priv;
+    AVFilterLink *outlink = ctx->outputs[0];
     AVFrame *out;
     int ret = 0, nb_samples;
 
-    rubberband_process(s->rbs, (const float *const *)in->data, in->nb_samples, 0);
+    if (s->first_pts == AV_NOPTS_VALUE)
+        s->first_pts = in->pts;
+
+    rubberband_process(s->rbs, (const float *const *)in->data, in->nb_samples, ff_outlink_get_status(inlink));
     s->nb_samples_in += in->nb_samples;
 
     nb_samples = rubberband_available(s->rbs);
@@ -133,7 +140,7 @@
             av_frame_free(&in);
             return AVERROR(ENOMEM);
         }
-        out->pts = av_rescale_q(s->nb_samples_out,
+        out->pts = s->first_pts + av_rescale_q(s->nb_samples_out,
                      (AVRational){ 1, outlink->sample_rate },
                      outlink->time_base);
         nb_samples = rubberband_retrieve(s->rbs, (float *const *)out->data, nb_samples);
@@ -143,7 +150,9 @@
     }
 
     av_frame_free(&in);
-    return ret;
+    if (ff_inlink_queued_samples(inlink) >= s->nb_samples)
+        ff_filter_set_ready(ctx, 100);
+    return ret < 0 ? ret : nb_samples;
 }
 
 static int config_input(AVFilterLink *inlink)
@@ -157,84 +166,52 @@
     if (s->rbs)
         rubberband_delete(s->rbs);
     s->rbs = rubberband_new(inlink->sample_rate, inlink->channels, opts, 1. / s->tempo, s->pitch);
+    if (!s->rbs)
+        return AVERROR(ENOMEM);
 
-    inlink->partial_buf_size =
-    inlink->min_samples =
-    inlink->max_samples = rubberband_get_samples_required(s->rbs);
+    s->nb_samples = rubberband_get_samples_required(s->rbs);
+    s->first_pts = AV_NOPTS_VALUE;
 
     return 0;
 }
 
-static int request_frame(AVFilterLink *outlink)
+static int activate(AVFilterContext *ctx)
 {
-    AVFilterContext *ctx = outlink->src;
-    RubberBandContext *s = ctx->priv;
     AVFilterLink *inlink = ctx->inputs[0];
-    int ret = 0;
+    AVFilterLink *outlink = ctx->outputs[0];
+    RubberBandContext *s = ctx->priv;
+    AVFrame *in = NULL;
+    int ret;
 
-    ret = ff_request_frame(ctx->inputs[0]);
+    FF_FILTER_FORWARD_STATUS_BACK(outlink, inlink);
 
-    if (ret == AVERROR_EOF && !s->flushed) {
-        if (rubberband_available(s->rbs) > 0) {
-            AVFrame *out = ff_get_audio_buffer(inlink, 1);
-            int nb_samples;
-
-            if (!out)
-                return AVERROR(ENOMEM);
-
-            rubberband_process(s->rbs, (const float *const *)out->data, 1, 1);
-            av_frame_free(&out);
-            nb_samples = rubberband_available(s->rbs);
-
-            if (nb_samples > 0) {
-                out = ff_get_audio_buffer(outlink, nb_samples);
-                if (!out)
-                    return AVERROR(ENOMEM);
-                out->pts = av_rescale_q(s->nb_samples_out,
-                             (AVRational){ 1, outlink->sample_rate },
-                             outlink->time_base);
-                nb_samples = rubberband_retrieve(s->rbs, (float *const *)out->data, nb_samples);
-                out->nb_samples = nb_samples;
-                ret = ff_filter_frame(outlink, out);
-                s->nb_samples_out += nb_samples;
-            }
-        }
-        s->flushed = 1;
-        av_log(ctx, AV_LOG_DEBUG, "nb_samples_in %"PRId64" nb_samples_out %"PRId64"\n",
-                                   s->nb_samples_in, s->nb_samples_out);
+    ret = ff_inlink_consume_samples(inlink, s->nb_samples, s->nb_samples, &in);
+    if (ret < 0)
+        return ret;
+    if (ret > 0) {
+        ret = filter_frame(inlink, in);
+        if (ret != 0)
+            return ret;
     }
 
-    return ret;
+    FF_FILTER_FORWARD_STATUS(inlink, outlink);
+    FF_FILTER_FORWARD_WANTED(outlink, inlink);
+
+    return FFERROR_NOT_READY;
 }
 
 static int process_command(AVFilterContext *ctx, const char *cmd, const char *args,
                            char *res, int res_len, int flags)
 {
     RubberBandContext *s = ctx->priv;
+    int ret;
 
-    if (!strcmp(cmd, "tempo")) {
-        double arg;
+    ret = ff_filter_process_command(ctx, cmd, args, res, res_len, flags);
+    if (ret < 0)
+        return ret;
 
-        sscanf(args, "%lf", &arg);
-        if (arg < 0.01 || arg > 100) {
-            av_log(ctx, AV_LOG_ERROR,
-                   "Tempo scale factor '%f' out of range\n", arg);
-            return AVERROR(EINVAL);
-        }
-        rubberband_set_time_ratio(s->rbs, 1. / arg);
-    }
-
-    if (!strcmp(cmd, "pitch")) {
-        double arg;
-
-        sscanf(args, "%lf", &arg);
-        if (arg < 0.01 || arg > 100) {
-            av_log(ctx, AV_LOG_ERROR,
-                   "Pitch scale factor '%f' out of range\n", arg);
-            return AVERROR(EINVAL);
-        }
-        rubberband_set_pitch_scale(s->rbs, arg);
-    }
+    rubberband_set_time_ratio(s->rbs, 1. / s->tempo);
+    rubberband_set_pitch_scale(s->rbs, s->pitch);
 
     return 0;
 }
@@ -244,7 +221,6 @@
         .name          = "default",
         .type          = AVMEDIA_TYPE_AUDIO,
         .config_props  = config_input,
-        .filter_frame  = filter_frame,
     },
     { NULL }
 };
@@ -253,7 +229,6 @@
     {
         .name          = "default",
         .type          = AVMEDIA_TYPE_AUDIO,
-        .request_frame = request_frame,
     },
     { NULL }
 };
@@ -265,6 +240,7 @@
     .priv_size     = sizeof(RubberBandContext),
     .priv_class    = &rubberband_class,
     .uninit        = uninit,
+    .activate      = activate,
     .inputs        = rubberband_inputs,
     .outputs       = rubberband_outputs,
     .process_command = process_command,
diff --git a/libavfilter/af_sidechaincompress.c b/libavfilter/af_sidechaincompress.c
index 888049e..e79c04d 100644
--- a/libavfilter/af_sidechaincompress.c
+++ b/libavfilter/af_sidechaincompress.c
@@ -54,10 +54,14 @@
     double knee_start;
     double knee_stop;
     double lin_knee_start;
+    double lin_knee_stop;
     double adj_knee_start;
+    double adj_knee_stop;
+    double compressed_knee_start;
     double compressed_knee_stop;
     int link;
     int detection;
+    int mode;
 
     AVAudioFifo *fifo[2];
     int64_t pts;
@@ -66,23 +70,27 @@
 #define OFFSET(x) offsetof(SidechainCompressContext, x)
 #define A AV_OPT_FLAG_AUDIO_PARAM
 #define F AV_OPT_FLAG_FILTERING_PARAM
+#define R AV_OPT_FLAG_RUNTIME_PARAM
 
 static const AVOption options[] = {
-    { "level_in",  "set input gain",     OFFSET(level_in),  AV_OPT_TYPE_DOUBLE, {.dbl=1},        0.015625,   64, A|F },
-    { "threshold", "set threshold",      OFFSET(threshold), AV_OPT_TYPE_DOUBLE, {.dbl=0.125}, 0.000976563,    1, A|F },
-    { "ratio",     "set ratio",          OFFSET(ratio),     AV_OPT_TYPE_DOUBLE, {.dbl=2},               1,   20, A|F },
-    { "attack",    "set attack",         OFFSET(attack),    AV_OPT_TYPE_DOUBLE, {.dbl=20},           0.01, 2000, A|F },
-    { "release",   "set release",        OFFSET(release),   AV_OPT_TYPE_DOUBLE, {.dbl=250},          0.01, 9000, A|F },
-    { "makeup",    "set make up gain",   OFFSET(makeup),    AV_OPT_TYPE_DOUBLE, {.dbl=1},               1,   64, A|F },
-    { "knee",      "set knee",           OFFSET(knee),      AV_OPT_TYPE_DOUBLE, {.dbl=2.82843},         1,    8, A|F },
-    { "link",      "set link type",      OFFSET(link),      AV_OPT_TYPE_INT,    {.i64=0},               0,    1, A|F, "link" },
-    {   "average", 0,                    0,                 AV_OPT_TYPE_CONST,  {.i64=0},               0,    0, A|F, "link" },
-    {   "maximum", 0,                    0,                 AV_OPT_TYPE_CONST,  {.i64=1},               0,    0, A|F, "link" },
-    { "detection", "set detection",      OFFSET(detection), AV_OPT_TYPE_INT,    {.i64=1},               0,    1, A|F, "detection" },
-    {   "peak",    0,                    0,                 AV_OPT_TYPE_CONST,  {.i64=0},               0,    0, A|F, "detection" },
-    {   "rms",     0,                    0,                 AV_OPT_TYPE_CONST,  {.i64=1},               0,    0, A|F, "detection" },
-    { "level_sc",  "set sidechain gain", OFFSET(level_sc),  AV_OPT_TYPE_DOUBLE, {.dbl=1},        0.015625,   64, A|F },
-    { "mix",       "set mix",            OFFSET(mix),       AV_OPT_TYPE_DOUBLE, {.dbl=1},               0,    1, A|F },
+    { "level_in",  "set input gain",     OFFSET(level_in),  AV_OPT_TYPE_DOUBLE, {.dbl=1},        0.015625,   64, A|F|R },
+    { "mode",      "set mode",           OFFSET(mode),      AV_OPT_TYPE_INT,    {.i64=0},               0,    1, A|F|R, "mode" },
+    {   "downward",0,                    0,                 AV_OPT_TYPE_CONST,  {.i64=0},               0,    0, A|F|R, "mode" },
+    {   "upward",  0,                    0,                 AV_OPT_TYPE_CONST,  {.i64=1},               0,    0, A|F|R, "mode" },
+    { "threshold", "set threshold",      OFFSET(threshold), AV_OPT_TYPE_DOUBLE, {.dbl=0.125}, 0.000976563,    1, A|F|R },
+    { "ratio",     "set ratio",          OFFSET(ratio),     AV_OPT_TYPE_DOUBLE, {.dbl=2},               1,   20, A|F|R },
+    { "attack",    "set attack",         OFFSET(attack),    AV_OPT_TYPE_DOUBLE, {.dbl=20},           0.01, 2000, A|F|R },
+    { "release",   "set release",        OFFSET(release),   AV_OPT_TYPE_DOUBLE, {.dbl=250},          0.01, 9000, A|F|R },
+    { "makeup",    "set make up gain",   OFFSET(makeup),    AV_OPT_TYPE_DOUBLE, {.dbl=1},               1,   64, A|F|R },
+    { "knee",      "set knee",           OFFSET(knee),      AV_OPT_TYPE_DOUBLE, {.dbl=2.82843},         1,    8, A|F|R },
+    { "link",      "set link type",      OFFSET(link),      AV_OPT_TYPE_INT,    {.i64=0},               0,    1, A|F|R, "link" },
+    {   "average", 0,                    0,                 AV_OPT_TYPE_CONST,  {.i64=0},               0,    0, A|F|R, "link" },
+    {   "maximum", 0,                    0,                 AV_OPT_TYPE_CONST,  {.i64=1},               0,    0, A|F|R, "link" },
+    { "detection", "set detection",      OFFSET(detection), AV_OPT_TYPE_INT,    {.i64=1},               0,    1, A|F|R, "detection" },
+    {   "peak",    0,                    0,                 AV_OPT_TYPE_CONST,  {.i64=0},               0,    0, A|F|R, "detection" },
+    {   "rms",     0,                    0,                 AV_OPT_TYPE_CONST,  {.i64=1},               0,    0, A|F|R, "detection" },
+    { "level_sc",  "set sidechain gain", OFFSET(level_sc),  AV_OPT_TYPE_DOUBLE, {.dbl=1},        0.015625,   64, A|F|R },
+    { "mix",       "set mix",            OFFSET(mix),       AV_OPT_TYPE_DOUBLE, {.dbl=1},               0,    1, A|F|R },
     { NULL }
 };
 
@@ -97,7 +105,9 @@
 
 static double output_gain(double lin_slope, double ratio, double thres,
                           double knee, double knee_start, double knee_stop,
-                          double compressed_knee_stop, int detection)
+                          double compressed_knee_start,
+                          double compressed_knee_stop,
+                          int detection, int mode)
 {
     double slope = log(lin_slope);
     double gain = 0.0;
@@ -114,10 +124,17 @@
         delta = 1.0 / ratio;
     }
 
-    if (knee > 1.0 && slope < knee_stop)
-        gain = hermite_interpolation(slope, knee_start, knee_stop,
-                                     knee_start, compressed_knee_stop,
-                                     1.0, delta);
+    if (mode) {
+        if (knee > 1.0 && slope > knee_start)
+            gain = hermite_interpolation(slope, knee_stop, knee_start,
+                                         knee_stop, compressed_knee_start,
+                                         1.0, delta);
+    } else {
+        if (knee > 1.0 && slope < knee_stop)
+            gain = hermite_interpolation(slope, knee_start, knee_stop,
+                                         knee_start, compressed_knee_stop,
+                                         1.0, delta);
+    }
 
     return exp(gain - slope);
 }
@@ -129,9 +146,12 @@
 
     s->thres = log(s->threshold);
     s->lin_knee_start = s->threshold / sqrt(s->knee);
+    s->lin_knee_stop = s->threshold * sqrt(s->knee);
     s->adj_knee_start = s->lin_knee_start * s->lin_knee_start;
+    s->adj_knee_stop = s->lin_knee_stop * s->lin_knee_stop;
     s->knee_start = log(s->lin_knee_start);
-    s->knee_stop = log(s->threshold * sqrt(s->knee));
+    s->knee_stop = log(s->lin_knee_stop);
+    s->compressed_knee_start = (s->knee_start - s->thres) / s->ratio + s->thres;
     s->compressed_knee_stop = (s->knee_stop - s->thres) / s->ratio + s->thres;
 
     s->attack_coeff = FFMIN(1., 1. / (s->attack * outlink->sample_rate / 4000.));
@@ -151,6 +171,8 @@
 
     for (i = 0; i < nb_samples; i++) {
         double abs_sample, gain = 1.0;
+        double detector;
+        int detected;
 
         abs_sample = fabs(scsrc[0] * level_sc);
 
@@ -169,10 +191,20 @@
 
         s->lin_slope += (abs_sample - s->lin_slope) * (abs_sample > s->lin_slope ? s->attack_coeff : s->release_coeff);
 
-        if (s->lin_slope > 0.0 && s->lin_slope > (s->detection ? s->adj_knee_start : s->lin_knee_start))
+        if (s->mode) {
+            detector = (s->detection ? s->adj_knee_stop : s->lin_knee_stop);
+            detected = s->lin_slope < detector;
+        } else {
+            detector = (s->detection ? s->adj_knee_start : s->lin_knee_start);
+            detected = s->lin_slope > detector;
+        }
+
+        if (s->lin_slope > 0.0 && detected)
             gain = output_gain(s->lin_slope, s->ratio, s->thres, s->knee,
                                s->knee_start, s->knee_stop,
-                               s->compressed_knee_stop, s->detection);
+                               s->compressed_knee_start,
+                               s->compressed_knee_stop,
+                               s->detection, s->mode);
 
         for (c = 0; c < inlink->channels; c++)
             dst[c] = src[c] * level_in * (gain * makeup * mix + (1. - mix));
@@ -183,6 +215,20 @@
     }
 }
 
+static int process_command(AVFilterContext *ctx, const char *cmd, const char *args,
+                           char *res, int res_len, int flags)
+{
+    int ret;
+
+    ret = ff_filter_process_command(ctx, cmd, args, res, res_len, flags);
+    if (ret < 0)
+        return ret;
+
+    compressor_config_output(ctx->outputs[0]);
+
+    return 0;
+}
+
 #if CONFIG_SIDECHAINCOMPRESS_FILTER
 static int activate(AVFilterContext *ctx)
 {
@@ -225,7 +271,7 @@
 
         dst = (double *)out->data[0];
         out->pts = s->pts;
-        s->pts += nb_samples;
+        s->pts += av_rescale_q(nb_samples, (AVRational){1, ctx->outputs[0]->sample_rate}, ctx->outputs[0]->time_base);
 
         compressor(s, (double *)in[0]->data[0], dst,
                    (double *)in[1]->data[0], nb_samples,
@@ -351,6 +397,7 @@
     .uninit         = uninit,
     .inputs         = sidechaincompress_inputs,
     .outputs        = sidechaincompress_outputs,
+    .process_command = process_command,
 };
 #endif  /* CONFIG_SIDECHAINCOMPRESS_FILTER */
 
@@ -444,5 +491,6 @@
     .query_formats  = acompressor_query_formats,
     .inputs         = acompressor_inputs,
     .outputs        = acompressor_outputs,
+    .process_command = process_command,
 };
 #endif  /* CONFIG_ACOMPRESSOR_FILTER */
diff --git a/libavfilter/af_silencedetect.c b/libavfilter/af_silencedetect.c
index 3a71f39..ff3b219 100644
--- a/libavfilter/af_silencedetect.c
+++ b/libavfilter/af_silencedetect.c
@@ -35,7 +35,7 @@
 typedef struct SilenceDetectContext {
     const AVClass *class;
     double noise;               ///< noise amplitude ratio
-    double duration;            ///< minimum duration of silence until notification
+    int64_t duration;           ///< minimum duration of silence until notification
     int mono;                   ///< mono mode : check each channel separately (default = check when ALL channels are silent)
     int channels;               ///< number of channels
     int independent_channels;   ///< number of entries in following arrays (always 1 in mono mode)
@@ -50,15 +50,16 @@
                           AVRational time_base);
 } SilenceDetectContext;
 
+#define MAX_DURATION (24*3600*1000000LL)
 #define OFFSET(x) offsetof(SilenceDetectContext, x)
 #define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_AUDIO_PARAM
 static const AVOption silencedetect_options[] = {
     { "n",         "set noise tolerance",              OFFSET(noise),     AV_OPT_TYPE_DOUBLE, {.dbl=0.001},          0, DBL_MAX,  FLAGS },
     { "noise",     "set noise tolerance",              OFFSET(noise),     AV_OPT_TYPE_DOUBLE, {.dbl=0.001},          0, DBL_MAX,  FLAGS },
-    { "d",         "set minimum duration in seconds",  OFFSET(duration),  AV_OPT_TYPE_DOUBLE, {.dbl=2.},             0, 24*60*60, FLAGS },
-    { "duration",  "set minimum duration in seconds",  OFFSET(duration),  AV_OPT_TYPE_DOUBLE, {.dbl=2.},             0, 24*60*60, FLAGS },
-    { "mono",      "check each channel separately",    OFFSET(mono),      AV_OPT_TYPE_BOOL,   {.i64=0.},             0, 1,        FLAGS },
-    { "m",         "check each channel separately",    OFFSET(mono),      AV_OPT_TYPE_BOOL,   {.i64=0.},             0, 1,        FLAGS },
+    { "d",         "set minimum duration in seconds",  OFFSET(duration),  AV_OPT_TYPE_DURATION, {.i64=2000000},      0, MAX_DURATION,FLAGS },
+    { "duration",  "set minimum duration in seconds",  OFFSET(duration),  AV_OPT_TYPE_DURATION, {.i64=2000000},      0, MAX_DURATION,FLAGS },
+    { "mono",      "check each channel separately",    OFFSET(mono),      AV_OPT_TYPE_BOOL,   {.i64=0},              0, 1,        FLAGS },
+    { "m",         "check each channel separately",    OFFSET(mono),      AV_OPT_TYPE_BOOL,   {.i64=0},              0, 1,        FLAGS },
     { NULL }
 };
 
@@ -142,6 +143,7 @@
     int c;
 
     s->channels = inlink->channels;
+    s->duration = av_rescale(s->duration, inlink->sample_rate, AV_TIME_BASE);
     s->independent_channels = s->mono ? s->channels : 1;
     s->nb_null_samples = av_mallocz_array(sizeof(*s->nb_null_samples), s->independent_channels);
     if (!s->nb_null_samples)
@@ -174,7 +176,7 @@
     const int nb_channels           = inlink->channels;
     const int srate                 = inlink->sample_rate;
     const int nb_samples            = insamples->nb_samples     * nb_channels;
-    const int64_t nb_samples_notify = srate * s->duration * (s->mono ? 1 : nb_channels);
+    const int64_t nb_samples_notify = s->duration * (s->mono ? 1 : nb_channels);
     int c;
 
     // scale number of null samples to the new sample rate
@@ -187,7 +189,6 @@
     s->frame_end = insamples->pts + av_rescale_q(insamples->nb_samples,
             (AVRational){ 1, s->last_sample_rate }, inlink->time_base);
 
-    // TODO: document metadata
     s->silencedetect(s, insamples, nb_samples, nb_samples_notify,
                      inlink->time_base);
 
diff --git a/libavfilter/af_silenceremove.c b/libavfilter/af_silenceremove.c
index 335f55b..7dd8c5a 100644
--- a/libavfilter/af_silenceremove.c
+++ b/libavfilter/af_silenceremove.c
@@ -206,6 +206,7 @@
     AVFilterContext *ctx = inlink->dst;
     SilenceRemoveContext *s = ctx->priv;
 
+    s->next_pts = AV_NOPTS_VALUE;
     s->window_size = FFMAX((inlink->sample_rate * s->window_ratio), 1) * inlink->channels;
     s->window = av_malloc_array(s->window_size, sizeof(*s->window));
     if (!s->window)
@@ -328,6 +329,9 @@
 
     nb_samples_read = nb_samples_written = 0;
 
+    if (s->next_pts == AV_NOPTS_VALUE)
+        s->next_pts = in->pts;
+
     switch (s->mode) {
     case SILENCE_TRIM:
 silence_trim:
diff --git a/libavfilter/af_sofalizer.c b/libavfilter/af_sofalizer.c
index d9098d7..ccf3872 100644
--- a/libavfilter/af_sofalizer.c
+++ b/libavfilter/af_sofalizer.c
@@ -35,6 +35,7 @@
 #include "libavutil/intmath.h"
 #include "libavutil/opt.h"
 #include "avfilter.h"
+#include "filters.h"
 #include "internal.h"
 #include "audio.h"
 
@@ -42,9 +43,13 @@
 #define FREQUENCY_DOMAIN 1
 
 typedef struct MySofa {  /* contains data of one SOFA file */
-    struct MYSOFA_EASY *easy;
-    int n_samples;       /* length of one impulse response (IR) */
+    struct MYSOFA_HRTF *hrtf;
+    struct MYSOFA_LOOKUP *lookup;
+    struct MYSOFA_NEIGHBORHOOD *neighborhood;
+    int ir_samples;      /* length of one impulse response (IR) */
+    int n_samples;       /* ir_samples to next power of 2 */
     float *lir, *rir;    /* IRs (time-domain) */
+    float *fir;
     int max_delay;
 } MySofa;
 
@@ -77,6 +82,7 @@
     int buffer_length;          /* is: longest IR plus max. delay in all SOFA files */
                                 /* then choose next power of 2 */
     int n_fft;                  /* number of samples in one FFT block */
+    int nb_samples;
 
                                 /* netCDF variables */
     int *delay[2];              /* broadband delay for each channel/IR to be convolved */
@@ -84,7 +90,8 @@
     float *data_ir[2];          /* IRs for all channels to be convolved */
                                 /* (this excludes the LFE) */
     float *temp_src[2];
-    FFTComplex *temp_fft[2];
+    FFTComplex *temp_fft[2];    /* Array to hold FFT values */
+    FFTComplex *temp_afft[2];   /* Array to accumulate FFT values prior to IFFT */
 
                          /* control variables */
     float gain;          /* filter gain (in dB) */
@@ -92,6 +99,12 @@
     float elevation;     /* elevation of virtual loudspeakers (in deg.) */
     float radius;        /* distance virtual loudspeakers to listener (in metres) */
     int type;            /* processing type */
+    int framesize;       /* size of buffer */
+    int normalize;       /* should all IRs be normalized upon import ? */
+    int interpolate;     /* should wanted IRs be interpolated from neighbors ? */
+    int minphase;        /* should all IRs be minphased upon import ? */
+    float anglestep;     /* neighbor search angle step, in agles */
+    float radstep;       /* neighbor search radius step, in meters */
 
     VirtualSpeaker vspkrpos[64];
 
@@ -103,8 +116,16 @@
 
 static int close_sofa(struct MySofa *sofa)
 {
-    mysofa_close(sofa->easy);
-    sofa->easy = NULL;
+    if (sofa->neighborhood)
+        mysofa_neighborhood_free(sofa->neighborhood);
+    sofa->neighborhood = NULL;
+    if (sofa->lookup)
+        mysofa_lookup_free(sofa->lookup);
+    sofa->lookup = NULL;
+    if (sofa->hrtf)
+        mysofa_free(sofa->hrtf);
+    sofa->hrtf = NULL;
+    av_freep(&sofa->fir);
 
     return 0;
 }
@@ -113,19 +134,51 @@
 {
     struct SOFAlizerContext *s = ctx->priv;
     struct MYSOFA_HRTF *mysofa;
+    char *license;
     int ret;
 
     mysofa = mysofa_load(filename, &ret);
+    s->sofa.hrtf = mysofa;
     if (ret || !mysofa) {
         av_log(ctx, AV_LOG_ERROR, "Can't find SOFA-file '%s'\n", filename);
         return AVERROR(EINVAL);
     }
 
+    ret = mysofa_check(mysofa);
+    if (ret != MYSOFA_OK) {
+        av_log(ctx, AV_LOG_ERROR, "Selected SOFA file is invalid. Please select valid SOFA file.\n");
+        return ret;
+    }
+
+    if (s->normalize)
+        mysofa_loudness(s->sofa.hrtf);
+
+    if (s->minphase)
+        mysofa_minphase(s->sofa.hrtf, 0.01f);
+
+    mysofa_tocartesian(s->sofa.hrtf);
+
+    s->sofa.lookup = mysofa_lookup_init(s->sofa.hrtf);
+    if (s->sofa.lookup == NULL)
+        return AVERROR(EINVAL);
+
+    if (s->interpolate)
+        s->sofa.neighborhood = mysofa_neighborhood_init_withstepdefine(s->sofa.hrtf,
+                                                                       s->sofa.lookup,
+                                                                       s->anglestep,
+                                                                       s->radstep);
+
+    s->sofa.fir = av_calloc(s->sofa.hrtf->N * s->sofa.hrtf->R, sizeof(*s->sofa.fir));
+    if (!s->sofa.fir)
+        return AVERROR(ENOMEM);
+
     if (mysofa->DataSamplingRate.elements != 1)
         return AVERROR(EINVAL);
+    av_log(ctx, AV_LOG_DEBUG, "Original IR length: %d.\n", mysofa->N);
     *samplingrate = mysofa->DataSamplingRate.values[0];
-    s->sofa.n_samples = mysofa->N;
-    mysofa_free(mysofa);
+    license = mysofa_getAttribute(mysofa->attributes, (char *)"License");
+    if (license)
+        av_log(ctx, AV_LOG_INFO, "SOFA license: %s\n", license);
 
     return 0;
 }
@@ -136,7 +189,7 @@
     int64_t layout, layout0;
 
     /* try to parse a channel name, e.g. "FL" */
-    if (sscanf(*arg, "%7[A-Z]%n", buf, &len)) {
+    if (av_sscanf(*arg, "%7[A-Z]%n", buf, &len)) {
         layout0 = layout = av_get_channel_layout(buf);
         /* channel_id <- first set bit in layout */
         for (i = 32; i > 0; i >>= 1) {
@@ -174,11 +227,11 @@
             av_log(ctx, AV_LOG_WARNING, "Failed to parse \'%s\' as channel name.\n", buf);
             continue;
         }
-        if (sscanf(arg, "%f %f", &azim, &elev) == 2) {
+        if (av_sscanf(arg, "%f %f", &azim, &elev) == 2) {
             s->vspkrpos[out_ch_id].set = 1;
             s->vspkrpos[out_ch_id].azim = azim;
             s->vspkrpos[out_ch_id].elev = elev;
-        } else if (sscanf(arg, "%f", &azim) == 1) {
+        } else if (av_sscanf(arg, "%f", &azim) == 1) {
             s->vspkrpos[out_ch_id].set = 1;
             s->vspkrpos[out_ch_id].azim = azim;
             s->vspkrpos[out_ch_id].elev = 0;
@@ -272,6 +325,7 @@
     float **ringbuffer;
     float **temp_src;
     FFTComplex **temp_fft;
+    FFTComplex **temp_afft;
 } ThreadData;
 
 static int sofalizer_convolute(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
@@ -286,9 +340,12 @@
     int *n_clippings = &td->n_clippings[jobnr];
     float *ringbuffer = td->ringbuffer[jobnr];
     float *temp_src = td->temp_src[jobnr];
-    const int n_samples = s->sofa.n_samples; /* length of one IR */
-    const float *src = (const float *)in->data[0]; /* get pointer to audio input buffer */
-    float *dst = (float *)out->data[0]; /* get pointer to audio output buffer */
+    const int ir_samples = s->sofa.ir_samples; /* length of one IR */
+    const int n_samples = s->sofa.n_samples;
+    const int planar = in->format == AV_SAMPLE_FMT_FLTP;
+    const int mult = 1 + !planar;
+    const float *src = (const float *)in->extended_data[0]; /* get pointer to audio input buffer */
+    float *dst = (float *)out->extended_data[jobnr * planar]; /* get pointer to audio output buffer */
     const int in_channels = s->n_conv; /* number of input channels */
     /* ring buffer length is: longest IR plus max. delay -> next power of 2 */
     const int buffer_length = s->buffer_length;
@@ -299,7 +356,9 @@
     int read;
     int i, l;
 
-    dst += offset;
+    if (!planar)
+        dst += offset;
+
     for (l = 0; l < in_channels; l++) {
         /* get starting address of ringbuffer for each input channel */
         buffer[l] = ringbuffer + l * buffer_length;
@@ -309,9 +368,18 @@
         const float *temp_ir = ir; /* using same set of IRs for each sample */
 
         dst[0] = 0;
-        for (l = 0; l < in_channels; l++) {
-            /* write current input sample to ringbuffer (for each channel) */
-            buffer[l][wr] = src[l];
+        if (planar) {
+            for (l = 0; l < in_channels; l++) {
+                const float *srcp = (const float *)in->extended_data[l];
+
+                /* write current input sample to ringbuffer (for each channel) */
+                buffer[l][wr] = srcp[i];
+            }
+        } else {
+            for (l = 0; l < in_channels; l++) {
+                /* write current input sample to ringbuffer (for each channel) */
+                buffer[l][wr] = src[l];
+            }
         }
 
         /* loop goes through all channels to be convolved */
@@ -321,36 +389,36 @@
             if (l == s->lfe_channel) {
                 /* LFE is an input channel but requires no convolution */
                 /* apply gain to LFE signal and add to output buffer */
-                *dst += *(buffer[s->lfe_channel] + wr) * s->gain_lfe;
-                temp_ir += FFALIGN(n_samples, 32);
+                dst[0] += *(buffer[s->lfe_channel] + wr) * s->gain_lfe;
+                temp_ir += n_samples;
                 continue;
             }
 
             /* current read position in ringbuffer: input sample write position
              * - delay for l-th ch. + diff. betw. IR length and buffer length
              * (mod buffer length) */
-            read = (wr - delay[l] - (n_samples - 1) + buffer_length) & modulo;
+            read = (wr - delay[l] - (ir_samples - 1) + buffer_length) & modulo;
 
-            if (read + n_samples < buffer_length) {
-                memmove(temp_src, bptr + read, n_samples * sizeof(*temp_src));
+            if (read + ir_samples < buffer_length) {
+                memmove(temp_src, bptr + read, ir_samples * sizeof(*temp_src));
             } else {
-                int len = FFMIN(n_samples - (read % n_samples), buffer_length - read);
+                int len = FFMIN(n_samples - (read % ir_samples), buffer_length - read);
 
                 memmove(temp_src, bptr + read, len * sizeof(*temp_src));
                 memmove(temp_src + len, bptr, (n_samples - len) * sizeof(*temp_src));
             }
 
             /* multiply signal and IR, and add up the results */
-            dst[0] += s->fdsp->scalarproduct_float(temp_ir, temp_src, n_samples);
-            temp_ir += FFALIGN(n_samples, 32);
+            dst[0] += s->fdsp->scalarproduct_float(temp_ir, temp_src, FFALIGN(ir_samples, 32));
+            temp_ir += n_samples;
         }
 
         /* clippings counter */
-        if (fabs(dst[0]) > 1)
-            *n_clippings += 1;
+        if (fabsf(dst[0]) > 1)
+            n_clippings[0]++;
 
         /* move output buffer pointer by +2 to get to next sample of processed channel: */
-        dst += 2;
+        dst += mult;
         src += in_channels;
         wr   = (wr + 1) & modulo; /* update ringbuffer write position */
     }
@@ -370,15 +438,17 @@
     FFTComplex *hrtf = s->data_hrtf[jobnr]; /* get pointers to current HRTF data */
     int *n_clippings = &td->n_clippings[jobnr];
     float *ringbuffer = td->ringbuffer[jobnr];
-    const int n_samples = s->sofa.n_samples; /* length of one IR */
-    const float *src = (const float *)in->data[0]; /* get pointer to audio input buffer */
-    float *dst = (float *)out->data[0]; /* get pointer to audio output buffer */
+    const int ir_samples = s->sofa.ir_samples; /* length of one IR */
+    const int planar = in->format == AV_SAMPLE_FMT_FLTP;
+    const int mult = 1 + !planar;
+    float *dst = (float *)out->extended_data[jobnr * planar]; /* get pointer to audio output buffer */
     const int in_channels = s->n_conv; /* number of input channels */
     /* ring buffer length is: longest IR plus max. delay -> next power of 2 */
     const int buffer_length = s->buffer_length;
     /* -1 for AND instead of MODULO (applied to powers of 2): */
     const uint32_t modulo = (uint32_t)buffer_length - 1;
     FFTComplex *fft_in = s->temp_fft[jobnr]; /* temporary array for FFT input/output data */
+    FFTComplex *fft_acc = s->temp_afft[jobnr];
     FFTContext *ifft = s->ifft[jobnr];
     FFTContext *fft = s->fft[jobnr];
     const int n_conv = s->n_conv;
@@ -389,29 +459,42 @@
     int n_read;
     int i, j;
 
-    dst += offset;
+    if (!planar)
+        dst += offset;
 
     /* find minimum between number of samples and output buffer length:
      * (important, if one IR is longer than the output buffer) */
-    n_read = FFMIN(s->sofa.n_samples, in->nb_samples);
+    n_read = FFMIN(ir_samples, in->nb_samples);
     for (j = 0; j < n_read; j++) {
         /* initialize output buf with saved signal from overflow buf */
-        dst[2 * j]     = ringbuffer[wr];
-        ringbuffer[wr] = 0.0; /* re-set read samples to zero */
+        dst[mult * j]  = ringbuffer[wr];
+        ringbuffer[wr] = 0.0f; /* re-set read samples to zero */
         /* update ringbuffer read/write position */
         wr  = (wr + 1) & modulo;
     }
 
     /* initialize rest of output buffer with 0 */
     for (j = n_read; j < in->nb_samples; j++) {
-        dst[2 * j] = 0;
+        dst[mult * j] = 0;
     }
 
+    /* fill FFT accumulation with 0 */
+    memset(fft_acc, 0, sizeof(FFTComplex) * n_fft);
+
     for (i = 0; i < n_conv; i++) {
+        const float *src = (const float *)in->extended_data[i * planar]; /* get pointer to audio input buffer */
+
         if (i == s->lfe_channel) { /* LFE */
-            for (j = 0; j < in->nb_samples; j++) {
-                /* apply gain to LFE signal and add to output buffer */
-                dst[2 * j] += src[i + j * in_channels] * s->gain_lfe;
+            if (in->format == AV_SAMPLE_FMT_FLT) {
+                for (j = 0; j < in->nb_samples; j++) {
+                    /* apply gain to LFE signal and add to output buffer */
+                    dst[2 * j] += src[i + j * in_channels] * s->gain_lfe;
+                }
+            } else {
+                for (j = 0; j < in->nb_samples; j++) {
+                    /* apply gain to LFE signal and add to output buffer */
+                    dst[j] += src[j] * s->gain_lfe;
+                }
             }
             continue;
         }
@@ -423,10 +506,18 @@
         /* fill FFT input with 0 (we want to zero-pad) */
         memset(fft_in, 0, sizeof(FFTComplex) * n_fft);
 
-        for (j = 0; j < in->nb_samples; j++) {
-            /* prepare input for FFT */
-            /* write all samples of current input channel to FFT input array */
-            fft_in[j].re = src[j * in_channels + i];
+        if (in->format == AV_SAMPLE_FMT_FLT) {
+            for (j = 0; j < in->nb_samples; j++) {
+                /* prepare input for FFT */
+                /* write all samples of current input channel to FFT input array */
+                fft_in[j].re = src[j * in_channels + i];
+            }
+        } else {
+            for (j = 0; j < in->nb_samples; j++) {
+                /* prepare input for FFT */
+                /* write all samples of current input channel to FFT input array */
+                fft_in[j].re = src[j];
+            }
         }
 
         /* transform input signal of current channel to frequency domain */
@@ -439,37 +530,34 @@
 
             /* complex multiplication of input signal and HRTFs */
             /* output channel (real): */
-            fft_in[j].re = re * hcomplex->re - im * hcomplex->im;
+            fft_acc[j].re += re * hcomplex->re - im * hcomplex->im;
             /* output channel (imag): */
-            fft_in[j].im = re * hcomplex->im + im * hcomplex->re;
+            fft_acc[j].im += re * hcomplex->im + im * hcomplex->re;
         }
+    }
 
-        /* transform output signal of current channel back to time domain */
-        av_fft_permute(ifft, fft_in);
-        av_fft_calc(ifft, fft_in);
+    /* transform output signal of current channel back to time domain */
+    av_fft_permute(ifft, fft_acc);
+    av_fft_calc(ifft, fft_acc);
 
-        for (j = 0; j < in->nb_samples; j++) {
-            /* write output signal of current channel to output buffer */
-            dst[2 * j] += fft_in[j].re * fft_scale;
-        }
+    for (j = 0; j < in->nb_samples; j++) {
+        /* write output signal of current channel to output buffer */
+        dst[mult * j] += fft_acc[j].re * fft_scale;
+    }
 
-        for (j = 0; j < n_samples - 1; j++) { /* overflow length is IR length - 1 */
-            /* write the rest of output signal to overflow buffer */
-            int write_pos = (wr + j) & modulo;
+    for (j = 0; j < ir_samples - 1; j++) { /* overflow length is IR length - 1 */
+        /* write the rest of output signal to overflow buffer */
+        int write_pos = (wr + j) & modulo;
 
-            *(ringbuffer + write_pos) += fft_in[in->nb_samples + j].re * fft_scale;
-        }
+        *(ringbuffer + write_pos) += fft_acc[in->nb_samples + j].re * fft_scale;
     }
 
     /* go through all samples of current output buffer: count clippings */
     for (i = 0; i < out->nb_samples; i++) {
         /* clippings counter */
-        if (fabs(*dst) > 1) { /* if current output sample > 1 */
+        if (fabsf(dst[i * mult]) > 1) { /* if current output sample > 1 */
             n_clippings[0]++;
         }
-
-        /* move output buffer pointer by +2 to get to next sample of processed channel: */
-        dst += 2;
     }
 
     /* remember read/write position in ringbuffer for next call */
@@ -498,10 +586,11 @@
     td.delay = s->delay; td.ir = s->data_ir; td.n_clippings = n_clippings;
     td.ringbuffer = s->ringbuffer; td.temp_src = s->temp_src;
     td.temp_fft = s->temp_fft;
+    td.temp_afft = s->temp_afft;
 
     if (s->type == TIME_DOMAIN) {
         ctx->internal->execute(ctx, sofalizer_convolute, &td, NULL, 2);
-    } else {
+    } else if (s->type == FREQUENCY_DOMAIN) {
         ctx->internal->execute(ctx, sofalizer_fast_convolute, &td, NULL, 2);
     }
     emms_c();
@@ -516,16 +605,45 @@
     return ff_filter_frame(outlink, out);
 }
 
+static int activate(AVFilterContext *ctx)
+{
+    AVFilterLink *inlink = ctx->inputs[0];
+    AVFilterLink *outlink = ctx->outputs[0];
+    SOFAlizerContext *s = ctx->priv;
+    AVFrame *in;
+    int ret;
+
+    FF_FILTER_FORWARD_STATUS_BACK(outlink, inlink);
+
+    if (s->nb_samples)
+        ret = ff_inlink_consume_samples(inlink, s->nb_samples, s->nb_samples, &in);
+    else
+        ret = ff_inlink_consume_frame(inlink, &in);
+    if (ret < 0)
+        return ret;
+    if (ret > 0)
+        return filter_frame(inlink, in);
+
+    FF_FILTER_FORWARD_STATUS(inlink, outlink);
+    FF_FILTER_FORWARD_WANTED(outlink, inlink);
+
+    return FFERROR_NOT_READY;
+}
+
 static int query_formats(AVFilterContext *ctx)
 {
     struct SOFAlizerContext *s = ctx->priv;
     AVFilterFormats *formats = NULL;
     AVFilterChannelLayouts *layouts = NULL;
     int ret, sample_rates[] = { 48000, -1 };
+    static const enum AVSampleFormat sample_fmts[] = {
+        AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_FLTP,
+        AV_SAMPLE_FMT_NONE
+    };
 
-    ret = ff_add_format(&formats, AV_SAMPLE_FMT_FLT);
-    if (ret)
-        return ret;
+    formats = ff_make_format_list(sample_fmts);
+    if (!formats)
+        return AVERROR(ENOMEM);
     ret = ff_set_common_formats(ctx, formats);
     if (ret)
         return ret;
@@ -554,10 +672,55 @@
     return ff_set_common_samplerates(ctx, formats);
 }
 
+static int getfilter_float(AVFilterContext *ctx, float x, float y, float z,
+                           float *left, float *right,
+                           float *delay_left, float *delay_right)
+{
+    struct SOFAlizerContext *s = ctx->priv;
+    float c[3], delays[2];
+    float *fl, *fr;
+    int nearest;
+    int *neighbors;
+    float *res;
+
+    c[0] = x, c[1] = y, c[2] = z;
+    nearest = mysofa_lookup(s->sofa.lookup, c);
+    if (nearest < 0)
+        return AVERROR(EINVAL);
+
+    if (s->interpolate) {
+        neighbors = mysofa_neighborhood(s->sofa.neighborhood, nearest);
+        res = mysofa_interpolate(s->sofa.hrtf, c,
+                                 nearest, neighbors,
+                                 s->sofa.fir, delays);
+    } else {
+        if (s->sofa.hrtf->DataDelay.elements > s->sofa.hrtf->R) {
+            delays[0] = s->sofa.hrtf->DataDelay.values[nearest * s->sofa.hrtf->R];
+            delays[1] = s->sofa.hrtf->DataDelay.values[nearest * s->sofa.hrtf->R + 1];
+        } else {
+            delays[0] = s->sofa.hrtf->DataDelay.values[0];
+            delays[1] = s->sofa.hrtf->DataDelay.values[1];
+        }
+        res = s->sofa.hrtf->DataIR.values + nearest * s->sofa.hrtf->N * s->sofa.hrtf->R;
+    }
+
+    *delay_left  = delays[0];
+    *delay_right = delays[1];
+
+    fl = res;
+    fr = res + s->sofa.hrtf->N;
+
+    memcpy(left, fl, sizeof(float) * s->sofa.hrtf->N);
+    memcpy(right, fr, sizeof(float) * s->sofa.hrtf->N);
+
+    return 0;
+}
+
 static int load_data(AVFilterContext *ctx, int azim, int elev, float radius, int sample_rate)
 {
     struct SOFAlizerContext *s = ctx->priv;
     int n_samples;
+    int ir_samples;
     int n_conv = s->n_conv; /* no. channels to convolve */
     int n_fft;
     float delay_l; /* broadband delay for each IR */
@@ -572,39 +735,46 @@
     float *data_ir_r = NULL;
     int offset = 0; /* used for faster pointer arithmetics in for-loop */
     int i, j, azim_orig = azim, elev_orig = elev;
-    int filter_length, ret = 0;
+    int ret = 0;
     int n_current;
     int n_max = 0;
 
-    s->sofa.easy = mysofa_open(s->filename, sample_rate, &filter_length, &ret);
-    if (!s->sofa.easy || ret) { /* if an invalid SOFA file has been selected */
-        av_log(ctx, AV_LOG_ERROR, "Selected SOFA file is invalid. Please select valid SOFA file.\n");
-        return AVERROR_INVALIDDATA;
-    }
+    av_log(ctx, AV_LOG_DEBUG, "IR length: %d.\n", s->sofa.hrtf->N);
+    s->sofa.ir_samples = s->sofa.hrtf->N;
+    s->sofa.n_samples = 1 << (32 - ff_clz(s->sofa.ir_samples));
 
     n_samples = s->sofa.n_samples;
+    ir_samples = s->sofa.ir_samples;
 
-    s->data_ir[0] = av_calloc(FFALIGN(n_samples, 32), sizeof(float) * s->n_conv);
-    s->data_ir[1] = av_calloc(FFALIGN(n_samples, 32), sizeof(float) * s->n_conv);
+    if (s->type == TIME_DOMAIN) {
+        s->data_ir[0] = av_calloc(n_samples, sizeof(float) * s->n_conv);
+        s->data_ir[1] = av_calloc(n_samples, sizeof(float) * s->n_conv);
+
+        if (!s->data_ir[0] || !s->data_ir[1]) {
+            ret = AVERROR(ENOMEM);
+            goto fail;
+        }
+    }
+
     s->delay[0] = av_calloc(s->n_conv, sizeof(int));
     s->delay[1] = av_calloc(s->n_conv, sizeof(int));
 
-    if (!s->data_ir[0] || !s->data_ir[1] || !s->delay[0] || !s->delay[1]) {
+    if (!s->delay[0] || !s->delay[1]) {
         ret = AVERROR(ENOMEM);
         goto fail;
     }
 
     /* get temporary IR for L and R channel */
-    data_ir_l = av_calloc(n_conv * FFALIGN(n_samples, 32), sizeof(*data_ir_l));
-    data_ir_r = av_calloc(n_conv * FFALIGN(n_samples, 32), sizeof(*data_ir_r));
+    data_ir_l = av_calloc(n_conv * n_samples, sizeof(*data_ir_l));
+    data_ir_r = av_calloc(n_conv * n_samples, sizeof(*data_ir_r));
     if (!data_ir_r || !data_ir_l) {
         ret = AVERROR(ENOMEM);
         goto fail;
     }
 
     if (s->type == TIME_DOMAIN) {
-        s->temp_src[0] = av_calloc(FFALIGN(n_samples, 32), sizeof(float));
-        s->temp_src[1] = av_calloc(FFALIGN(n_samples, 32), sizeof(float));
+        s->temp_src[0] = av_calloc(n_samples, sizeof(float));
+        s->temp_src[1] = av_calloc(n_samples, sizeof(float));
         if (!s->temp_src[0] || !s->temp_src[1]) {
             ret = AVERROR(ENOMEM);
             goto fail;
@@ -638,10 +808,12 @@
         mysofa_s2c(coordinates);
 
         /* get id of IR closest to desired position */
-        mysofa_getfilter_float(s->sofa.easy, coordinates[0], coordinates[1], coordinates[2],
-                               data_ir_l + FFALIGN(n_samples, 32) * i,
-                               data_ir_r + FFALIGN(n_samples, 32) * i,
-                               &delay_l, &delay_r);
+        ret = getfilter_float(ctx, coordinates[0], coordinates[1], coordinates[2],
+                              data_ir_l + n_samples * i,
+                              data_ir_r + n_samples * i,
+                              &delay_l, &delay_r);
+        if (ret < 0)
+            goto fail;
 
         s->delay[0][i] = delay_l * sample_rate;
         s->delay[1][i] = delay_r * sample_rate;
@@ -651,24 +823,24 @@
 
     /* get size of ringbuffer (longest IR plus max. delay) */
     /* then choose next power of 2 for performance optimization */
-    n_current = s->sofa.n_samples + s->sofa.max_delay;
+    n_current = n_samples + s->sofa.max_delay;
     /* length of longest IR plus max. delay */
     n_max = FFMAX(n_max, n_current);
 
     /* buffer length is longest IR plus max. delay -> next power of 2
        (32 - count leading zeros gives required exponent)  */
     s->buffer_length = 1 << (32 - ff_clz(n_max));
-    s->n_fft = n_fft = 1 << (32 - ff_clz(n_max + sample_rate));
+    s->n_fft = n_fft = 1 << (32 - ff_clz(n_max + s->framesize));
 
     if (s->type == FREQUENCY_DOMAIN) {
         av_fft_end(s->fft[0]);
         av_fft_end(s->fft[1]);
-        s->fft[0] = av_fft_init(log2(s->n_fft), 0);
-        s->fft[1] = av_fft_init(log2(s->n_fft), 0);
+        s->fft[0] = av_fft_init(av_log2(s->n_fft), 0);
+        s->fft[1] = av_fft_init(av_log2(s->n_fft), 0);
         av_fft_end(s->ifft[0]);
         av_fft_end(s->ifft[1]);
-        s->ifft[0] = av_fft_init(log2(s->n_fft), 1);
-        s->ifft[1] = av_fft_init(log2(s->n_fft), 1);
+        s->ifft[0] = av_fft_init(av_log2(s->n_fft), 1);
+        s->ifft[1] = av_fft_init(av_log2(s->n_fft), 1);
 
         if (!s->fft[0] || !s->fft[1] || !s->ifft[0] || !s->ifft[1]) {
             av_log(ctx, AV_LOG_ERROR, "Unable to create FFT contexts of size %d.\n", s->n_fft);
@@ -680,7 +852,7 @@
     if (s->type == TIME_DOMAIN) {
         s->ringbuffer[0] = av_calloc(s->buffer_length, sizeof(float) * nb_input_channels);
         s->ringbuffer[1] = av_calloc(s->buffer_length, sizeof(float) * nb_input_channels);
-    } else {
+    } else if (s->type == FREQUENCY_DOMAIN) {
         /* get temporary HRTF memory for L and R channel */
         data_hrtf_l = av_malloc_array(n_fft, sizeof(*data_hrtf_l) * n_conv);
         data_hrtf_r = av_malloc_array(n_fft, sizeof(*data_hrtf_r) * n_conv);
@@ -693,7 +865,10 @@
         s->ringbuffer[1] = av_calloc(s->buffer_length, sizeof(float));
         s->temp_fft[0] = av_malloc_array(s->n_fft, sizeof(FFTComplex));
         s->temp_fft[1] = av_malloc_array(s->n_fft, sizeof(FFTComplex));
-        if (!s->temp_fft[0] || !s->temp_fft[1]) {
+        s->temp_afft[0] = av_malloc_array(s->n_fft, sizeof(FFTComplex));
+        s->temp_afft[1] = av_malloc_array(s->n_fft, sizeof(FFTComplex));
+        if (!s->temp_fft[0] || !s->temp_fft[1] ||
+            !s->temp_afft[0] || !s->temp_afft[1]) {
             ret = AVERROR(ENOMEM);
             goto fail;
         }
@@ -716,28 +891,28 @@
     for (i = 0; i < s->n_conv; i++) {
         float *lir, *rir;
 
-        offset = i * FFALIGN(n_samples, 32); /* no. samples already written */
+        offset = i * n_samples; /* no. samples already written */
 
         lir = data_ir_l + offset;
         rir = data_ir_r + offset;
 
         if (s->type == TIME_DOMAIN) {
-            for (j = 0; j < n_samples; j++) {
+            for (j = 0; j < ir_samples; j++) {
                 /* load reversed IRs of the specified source position
                  * sample-by-sample for left and right ear; and apply gain */
-                s->data_ir[0][offset + j] = lir[n_samples - 1 - j] * gain_lin;
-                s->data_ir[1][offset + j] = rir[n_samples - 1 - j] * gain_lin;
+                s->data_ir[0][offset + j] = lir[ir_samples - 1 - j] * gain_lin;
+                s->data_ir[1][offset + j] = rir[ir_samples - 1 - j] * gain_lin;
             }
-        } else {
+        } else if (s->type == FREQUENCY_DOMAIN) {
             memset(fft_in_l, 0, n_fft * sizeof(*fft_in_l));
             memset(fft_in_r, 0, n_fft * sizeof(*fft_in_r));
 
             offset = i * n_fft; /* no. samples already written */
-            for (j = 0; j < n_samples; j++) {
+            for (j = 0; j < ir_samples; j++) {
                 /* load non-reversed IRs of the specified source position
                  * sample-by-sample and apply gain,
                  * L channel is loaded to real part, R channel to imag part,
-                 * IRs ared shifted by L and R delay */
+                 * IRs are shifted by L and R delay */
                 fft_in_l[s->delay[0][i] + j].re = lir[j] * gain_lin;
                 fft_in_r[s->delay[1][i] + j].re = rir[j] * gain_lin;
             }
@@ -816,14 +991,11 @@
     SOFAlizerContext *s = ctx->priv;
     int ret;
 
-    if (s->type == FREQUENCY_DOMAIN) {
-        inlink->partial_buf_size =
-        inlink->min_samples =
-        inlink->max_samples = inlink->sample_rate;
-    }
+    if (s->type == FREQUENCY_DOMAIN)
+        s->nb_samples = s->framesize;
 
-    /* gain -3 dB per channel, -6 dB to get LFE on a similar level */
-    s->gain_lfe = expf((s->gain - 3 * inlink->channels - 6 + s->lfe_gain) / 20 * M_LN10);
+    /* gain -3 dB per channel */
+    s->gain_lfe = expf((s->gain - 3 * inlink->channels + s->lfe_gain) / 20 * M_LN10);
 
     s->n_conv = inlink->channels;
 
@@ -846,6 +1018,10 @@
     av_fft_end(s->ifft[1]);
     av_fft_end(s->fft[0]);
     av_fft_end(s->fft[1]);
+    s->ifft[0] = NULL;
+    s->ifft[1] = NULL;
+    s->fft[0] = NULL;
+    s->fft[1] = NULL;
     av_freep(&s->delay[0]);
     av_freep(&s->delay[1]);
     av_freep(&s->data_ir[0]);
@@ -856,6 +1032,8 @@
     av_freep(&s->speaker_elev);
     av_freep(&s->temp_src[0]);
     av_freep(&s->temp_src[1]);
+    av_freep(&s->temp_afft[0]);
+    av_freep(&s->temp_afft[1]);
     av_freep(&s->temp_fft[0]);
     av_freep(&s->temp_fft[1]);
     av_freep(&s->data_hrtf[0]);
@@ -871,12 +1049,18 @@
     { "gain",      "set gain in dB", OFFSET(gain),      AV_OPT_TYPE_FLOAT,  {.dbl=0},     -20,  40, .flags = FLAGS },
     { "rotation",  "set rotation"  , OFFSET(rotation),  AV_OPT_TYPE_FLOAT,  {.dbl=0},    -360, 360, .flags = FLAGS },
     { "elevation", "set elevation",  OFFSET(elevation), AV_OPT_TYPE_FLOAT,  {.dbl=0},     -90,  90, .flags = FLAGS },
-    { "radius",    "set radius",     OFFSET(radius),    AV_OPT_TYPE_FLOAT,  {.dbl=1},       0,   3, .flags = FLAGS },
+    { "radius",    "set radius",     OFFSET(radius),    AV_OPT_TYPE_FLOAT,  {.dbl=1},       0,   5, .flags = FLAGS },
     { "type",      "set processing", OFFSET(type),      AV_OPT_TYPE_INT,    {.i64=1},       0,   1, .flags = FLAGS, "type" },
     { "time",      "time domain",      0,               AV_OPT_TYPE_CONST,  {.i64=0},       0,   0, .flags = FLAGS, "type" },
     { "freq",      "frequency domain", 0,               AV_OPT_TYPE_CONST,  {.i64=1},       0,   0, .flags = FLAGS, "type" },
     { "speakers",  "set speaker custom positions", OFFSET(speakers_pos), AV_OPT_TYPE_STRING,  {.str=0},    0, 0, .flags = FLAGS },
-    { "lfegain",   "set lfe gain",                 OFFSET(lfe_gain),     AV_OPT_TYPE_FLOAT,   {.dbl=0},   -9, 9, .flags = FLAGS },
+    { "lfegain",   "set lfe gain",                 OFFSET(lfe_gain),     AV_OPT_TYPE_FLOAT,   {.dbl=0},  -20,40, .flags = FLAGS },
+    { "framesize", "set frame size", OFFSET(framesize), AV_OPT_TYPE_INT,    {.i64=1024},1024,96000, .flags = FLAGS },
+    { "normalize", "normalize IRs",  OFFSET(normalize), AV_OPT_TYPE_BOOL,   {.i64=1},       0,   1, .flags = FLAGS },
+    { "interpolate","interpolate IRs from neighbors",   OFFSET(interpolate),AV_OPT_TYPE_BOOL,    {.i64=0},       0,   1, .flags = FLAGS },
+    { "minphase",  "minphase IRs",   OFFSET(minphase),  AV_OPT_TYPE_BOOL,   {.i64=0},       0,   1, .flags = FLAGS },
+    { "anglestep", "set neighbor search angle step",    OFFSET(anglestep),  AV_OPT_TYPE_FLOAT,   {.dbl=.5},      0.01, 10, .flags = FLAGS },
+    { "radstep",   "set neighbor search radius step",   OFFSET(radstep),    AV_OPT_TYPE_FLOAT,   {.dbl=.01},     0.01,  1, .flags = FLAGS },
     { NULL }
 };
 
@@ -887,7 +1071,6 @@
         .name         = "default",
         .type         = AVMEDIA_TYPE_AUDIO,
         .config_props = config_input,
-        .filter_frame = filter_frame,
     },
     { NULL }
 };
@@ -906,6 +1089,7 @@
     .priv_size     = sizeof(SOFAlizerContext),
     .priv_class    = &sofalizer_class,
     .init          = init,
+    .activate      = activate,
     .uninit        = uninit,
     .query_formats = query_formats,
     .inputs        = inputs,
diff --git a/libavfilter/af_stereowiden.c b/libavfilter/af_stereowiden.c
index ef16fce..251f084 100644
--- a/libavfilter/af_stereowiden.c
+++ b/libavfilter/af_stereowiden.c
@@ -39,13 +39,14 @@
 } StereoWidenContext;
 
 #define OFFSET(x) offsetof(StereoWidenContext, x)
-#define A AV_OPT_FLAG_AUDIO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
+#define A  AV_OPT_FLAG_AUDIO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
+#define AT AV_OPT_FLAG_AUDIO_PARAM|AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_RUNTIME_PARAM
 
 static const AVOption stereowiden_options[] = {
     { "delay",     "set delay time",    OFFSET(delay),     AV_OPT_TYPE_FLOAT, {.dbl=20}, 1, 100, A },
-    { "feedback",  "set feedback gain", OFFSET(feedback),  AV_OPT_TYPE_FLOAT, {.dbl=.3}, 0, 0.9, A },
-    { "crossfeed", "set cross feed",    OFFSET(crossfeed), AV_OPT_TYPE_FLOAT, {.dbl=.3}, 0, 0.8, A },
-    { "drymix",    "set dry-mix",       OFFSET(drymix),    AV_OPT_TYPE_FLOAT, {.dbl=.8}, 0, 1.0, A },
+    { "feedback",  "set feedback gain", OFFSET(feedback),  AV_OPT_TYPE_FLOAT, {.dbl=.3}, 0, 0.9, AT },
+    { "crossfeed", "set cross feed",    OFFSET(crossfeed), AV_OPT_TYPE_FLOAT, {.dbl=.3}, 0, 0.8, AT },
+    { "drymix",    "set dry-mix",       OFFSET(drymix),    AV_OPT_TYPE_FLOAT, {.dbl=.8}, 0, 1.0, AT },
     { NULL }
 };
 
@@ -113,8 +114,13 @@
         if (s->cur == s->buffer + s->length)
             s->cur = s->buffer;
 
-        dst[0] = drymix * left - crossfeed * right - feedback * s->cur[1];
-        dst[1] = drymix * right - crossfeed * left - feedback * s->cur[0];
+        if (ctx->is_disabled) {
+            dst[0] = left;
+            dst[1] = right;
+        } else {
+            dst[0] = drymix * left - crossfeed * right - feedback * s->cur[1];
+            dst[1] = drymix * right - crossfeed * left - feedback * s->cur[0];
+        }
 
         s->cur[0] = left;
         s->cur[1] = right;
@@ -159,4 +165,6 @@
     .uninit         = uninit,
     .inputs         = inputs,
     .outputs        = outputs,
+    .flags          = AVFILTER_FLAG_SUPPORT_TIMELINE_INTERNAL,
+    .process_command = ff_filter_process_command,
 };
diff --git a/libavfilter/af_superequalizer.c b/libavfilter/af_superequalizer.c
index f38cca5..f11ec9e 100644
--- a/libavfilter/af_superequalizer.c
+++ b/libavfilter/af_superequalizer.c
@@ -25,6 +25,7 @@
 
 #include "audio.h"
 #include "avfilter.h"
+#include "filters.h"
 #include "internal.h"
 
 #define NBANDS 17
@@ -203,7 +204,7 @@
         dst = (float *)s->out->extended_data[ch];
         src = (float *)in->extended_data[ch];
 
-        for (i = 0; i < s->winlen; i++)
+        for (i = 0; i < in->nb_samples; i++)
             fsamples[i] = src[i];
         for (; i < s->tabsize; i++)
             fsamples[i] = 0;
@@ -240,6 +241,28 @@
     return ff_filter_frame(outlink, out);
 }
 
+static int activate(AVFilterContext *ctx)
+{
+    AVFilterLink *inlink = ctx->inputs[0];
+    AVFilterLink *outlink = ctx->outputs[0];
+    SuperEqualizerContext *s = ctx->priv;
+    AVFrame *in = NULL;
+    int ret;
+
+    FF_FILTER_FORWARD_STATUS_BACK(outlink, inlink);
+
+    ret = ff_inlink_consume_samples(inlink, s->winlen, s->winlen, &in);
+    if (ret < 0)
+        return ret;
+    if (ret > 0)
+        return filter_frame(inlink, in);
+
+    FF_FILTER_FORWARD_STATUS(inlink, outlink);
+    FF_FILTER_FORWARD_WANTED(outlink, inlink);
+
+    return FFERROR_NOT_READY;
+}
+
 static av_cold int init(AVFilterContext *ctx)
 {
     SuperEqualizerContext *s = ctx->priv;
@@ -277,10 +300,6 @@
     AVFilterContext *ctx = inlink->dst;
     SuperEqualizerContext *s = ctx->priv;
 
-    inlink->partial_buf_size =
-    inlink->min_samples =
-    inlink->max_samples = s->winlen;
-
     s->out = ff_get_audio_buffer(inlink, s->tabsize);
     if (!s->out)
         return AVERROR(ENOMEM);
@@ -314,7 +333,6 @@
     {
         .name         = "default",
         .type         = AVMEDIA_TYPE_AUDIO,
-        .filter_frame = filter_frame,
         .config_props = config_input,
     },
     { NULL }
@@ -363,6 +381,7 @@
     .priv_class    = &superequalizer_class,
     .query_formats = query_formats,
     .init          = init,
+    .activate      = activate,
     .uninit        = uninit,
     .inputs        = superequalizer_inputs,
     .outputs       = superequalizer_outputs,
diff --git a/libavfilter/af_surround.c b/libavfilter/af_surround.c
index f29afec..1140678 100644
--- a/libavfilter/af_surround.c
+++ b/libavfilter/af_surround.c
@@ -18,13 +18,17 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
+#include "libavutil/avassert.h"
 #include "libavutil/audio_fifo.h"
 #include "libavutil/channel_layout.h"
 #include "libavutil/opt.h"
 #include "libavcodec/avfft.h"
 #include "avfilter.h"
 #include "audio.h"
+#include "filters.h"
+#include "internal.h"
 #include "formats.h"
+#include "window_func.h"
 
 typedef struct AudioSurroundContext {
     const AVClass *class;
@@ -36,8 +40,48 @@
     float level_out;
     float fc_in;
     float fc_out;
+    float fl_in;
+    float fl_out;
+    float fr_in;
+    float fr_out;
+    float sl_in;
+    float sl_out;
+    float sr_in;
+    float sr_out;
+    float bl_in;
+    float bl_out;
+    float br_in;
+    float br_out;
+    float bc_in;
+    float bc_out;
     float lfe_in;
     float lfe_out;
+    int   lfe_mode;
+    float angle;
+    int   win_size;
+    int   win_func;
+    float overlap;
+
+    float all_x;
+    float all_y;
+
+    float fc_x;
+    float fl_x;
+    float fr_x;
+    float bl_x;
+    float br_x;
+    float sl_x;
+    float sr_x;
+    float bc_x;
+
+    float fc_y;
+    float fl_y;
+    float fr_y;
+    float bl_y;
+    float br_y;
+    float sl_y;
+    float sr_y;
+    float bc_y;
 
     float *input_levels;
     float *output_levels;
@@ -64,6 +108,7 @@
     float *window_func_lut;
 
     int64_t pts;
+    int eof;
 
     void (*filter)(AVFilterContext *ctx);
     void (*upmix_stereo)(AVFilterContext *ctx,
@@ -173,6 +218,27 @@
     ch = av_get_channel_layout_channel_index(inlink->channel_layout, AV_CH_FRONT_CENTER);
     if (ch >= 0)
         s->input_levels[ch] *= s->fc_in;
+    ch = av_get_channel_layout_channel_index(inlink->channel_layout, AV_CH_FRONT_LEFT);
+    if (ch >= 0)
+        s->input_levels[ch] *= s->fl_in;
+    ch = av_get_channel_layout_channel_index(inlink->channel_layout, AV_CH_FRONT_RIGHT);
+    if (ch >= 0)
+        s->input_levels[ch] *= s->fr_in;
+    ch = av_get_channel_layout_channel_index(inlink->channel_layout, AV_CH_SIDE_LEFT);
+    if (ch >= 0)
+        s->input_levels[ch] *= s->sl_in;
+    ch = av_get_channel_layout_channel_index(inlink->channel_layout, AV_CH_SIDE_RIGHT);
+    if (ch >= 0)
+        s->input_levels[ch] *= s->sr_in;
+    ch = av_get_channel_layout_channel_index(inlink->channel_layout, AV_CH_BACK_LEFT);
+    if (ch >= 0)
+        s->input_levels[ch] *= s->bl_in;
+    ch = av_get_channel_layout_channel_index(inlink->channel_layout, AV_CH_BACK_RIGHT);
+    if (ch >= 0)
+        s->input_levels[ch] *= s->br_in;
+    ch = av_get_channel_layout_channel_index(inlink->channel_layout, AV_CH_BACK_CENTER);
+    if (ch >= 0)
+        s->input_levels[ch] *= s->bc_in;
     ch = av_get_channel_layout_channel_index(inlink->channel_layout, AV_CH_LOW_FREQUENCY);
     if (ch >= 0)
         s->input_levels[ch] *= s->lfe_in;
@@ -215,6 +281,27 @@
     ch = av_get_channel_layout_channel_index(outlink->channel_layout, AV_CH_FRONT_CENTER);
     if (ch >= 0)
         s->output_levels[ch] *= s->fc_out;
+    ch = av_get_channel_layout_channel_index(outlink->channel_layout, AV_CH_FRONT_LEFT);
+    if (ch >= 0)
+        s->output_levels[ch] *= s->fl_out;
+    ch = av_get_channel_layout_channel_index(outlink->channel_layout, AV_CH_FRONT_RIGHT);
+    if (ch >= 0)
+        s->output_levels[ch] *= s->fr_out;
+    ch = av_get_channel_layout_channel_index(outlink->channel_layout, AV_CH_SIDE_LEFT);
+    if (ch >= 0)
+        s->output_levels[ch] *= s->sl_out;
+    ch = av_get_channel_layout_channel_index(outlink->channel_layout, AV_CH_SIDE_RIGHT);
+    if (ch >= 0)
+        s->output_levels[ch] *= s->sr_out;
+    ch = av_get_channel_layout_channel_index(outlink->channel_layout, AV_CH_BACK_LEFT);
+    if (ch >= 0)
+        s->output_levels[ch] *= s->bl_out;
+    ch = av_get_channel_layout_channel_index(outlink->channel_layout, AV_CH_BACK_RIGHT);
+    if (ch >= 0)
+        s->output_levels[ch] *= s->br_out;
+    ch = av_get_channel_layout_channel_index(outlink->channel_layout, AV_CH_BACK_CENTER);
+    if (ch >= 0)
+        s->output_levels[ch] *= s->bc_out;
     ch = av_get_channel_layout_channel_index(outlink->channel_layout, AV_CH_LOW_FREQUENCY);
     if (ch >= 0)
         s->output_levels[ch] *= s->lfe_out;
@@ -227,19 +314,42 @@
     return 0;
 }
 
+static void stereo_transform(float *x, float *y, float angle)
+{
+    float reference, r, a;
+
+    if (angle == 90.f)
+        return;
+
+    reference = angle * M_PI / 180.f;
+    r = hypotf(*x, *y);
+    a = atan2f(*x, *y);
+
+    if (fabsf(a) <= M_PI_4)
+        a *= reference / M_PI_2;
+    else
+        a = M_PI + 2 * (-2 * M_PI + reference) * (M_PI - fabsf(a)) * FFDIFFSIGN(a, 0) / (3 * M_PI);
+
+    *x = av_clipf(sinf(a) * r, -1, 1);
+    *y = av_clipf(cosf(a) * r, -1, 1);
+}
+
 static void stereo_position(float a, float p, float *x, float *y)
 {
-      *x = av_clipf(a+FFMAX(0, sinf(p-M_PI_2))*FFDIFFSIGN(a,0), -1, 1);
-      *y = av_clipf(cosf(a*M_PI_2+M_PI)*cosf(M_PI_2-p/M_PI)*M_LN10+1, -1, 1);
+    av_assert2(a >= -1.f && a <= 1.f);
+    av_assert2(p >= 0.f && p <= M_PI);
+    *x = av_clipf(a+a*FFMAX(0, p*p-M_PI_2), -1, 1);
+    *y = av_clipf(cosf(a*M_PI_2+M_PI)*cosf(M_PI_2-p/M_PI)*M_LN10+1, -1, 1);
 }
 
 static inline void get_lfe(int output_lfe, int n, float lowcut, float highcut,
-                           float *lfe_mag, float *mag_total)
+                           float *lfe_mag, float *mag_total, int lfe_mode)
 {
     if (output_lfe && n < highcut) {
         *lfe_mag    = n < lowcut ? 1.f : .5f*(1.f+cosf(M_PI*(lowcut-n)/(lowcut-highcut)));
         *lfe_mag   *= *mag_total;
-        *mag_total -= *lfe_mag;
+        if (lfe_mode)
+            *mag_total -= *lfe_mag;
     } else {
         *lfe_mag = 0.f;
     }
@@ -258,7 +368,7 @@
 
     dst = (float *)s->output->extended_data[0];
 
-    mag = sqrtf(1.f - fabsf(x)) * ((y + 1.f) * .5f) * mag_total;
+    mag = powf(1.f - fabsf(x), s->fc_x) * powf((y + 1.f) * .5f, s->fc_y) * mag_total;
 
     dst[2 * n    ] = mag * cosf(c_phase);
     dst[2 * n + 1] = mag * sinf(c_phase);
@@ -278,8 +388,8 @@
     dstl = (float *)s->output->extended_data[0];
     dstr = (float *)s->output->extended_data[1];
 
-    l_mag = sqrtf(.5f * ( x + 1.f)) * ((y + 1.f) * .5f) * mag_total;
-    r_mag = sqrtf(.5f * (-x + 1.f)) * ((y + 1.f) * .5f) * mag_total;
+    l_mag = powf(.5f * ( x + 1.f), s->fl_x) * powf((y + 1.f) * .5f, s->fl_y) * mag_total;
+    r_mag = powf(.5f * (-x + 1.f), s->fr_x) * powf((y + 1.f) * .5f, s->fr_y) * mag_total;
 
     dstl[2 * n    ] = l_mag * cosf(l_phase);
     dstl[2 * n + 1] = l_mag * sinf(l_phase);
@@ -303,10 +413,10 @@
     dstr = (float *)s->output->extended_data[1];
     dstlfe = (float *)s->output->extended_data[2];
 
-    get_lfe(s->output_lfe, n, s->lowcut, s->highcut, &lfe_mag, &mag_total);
+    get_lfe(s->output_lfe, n, s->lowcut, s->highcut, &lfe_mag, &mag_total, s->lfe_mode);
 
-    l_mag = sqrtf(.5f * ( x + 1.f)) * ((y + 1.f) * .5f) * mag_total;
-    r_mag = sqrtf(.5f * (-x + 1.f)) * ((y + 1.f) * .5f) * mag_total;
+    l_mag = powf(.5f * ( x + 1.f), s->fl_x) * powf((y + 1.f) * .5f, s->fl_y) * mag_total;
+    r_mag = powf(.5f * (-x + 1.f), s->fr_x) * powf((y + 1.f) * .5f, s->fr_y) * mag_total;
 
     dstl[2 * n    ] = l_mag * cosf(l_phase);
     dstl[2 * n + 1] = l_mag * sinf(l_phase);
@@ -333,9 +443,9 @@
     dstr = (float *)s->output->extended_data[1];
     dstc = (float *)s->output->extended_data[2];
 
-    c_mag = sqrtf(1.f - fabsf(x))   * ((y + 1.f) * .5f) * mag_total;
-    l_mag = sqrtf(.5f * ( x + 1.f)) * ((y + 1.f) * .5f) * mag_total;
-    r_mag = sqrtf(.5f * (-x + 1.f)) * ((y + 1.f) * .5f) * mag_total;
+    c_mag = powf(1.f - fabsf(x),   s->fc_x) * powf((y + 1.f) * .5f, s->fc_y) * mag_total;
+    l_mag = powf(.5f * ( x + 1.f), s->fl_x) * powf((y + 1.f) * .5f, s->fl_y) * mag_total;
+    r_mag = powf(.5f * (-x + 1.f), s->fr_x) * powf((y + 1.f) * .5f, s->fr_y) * mag_total;
 
     dstl[2 * n    ] = l_mag * cosf(l_phase);
     dstl[2 * n + 1] = l_mag * sinf(l_phase);
@@ -363,11 +473,11 @@
     dstc = (float *)s->output->extended_data[2];
     dstlfe = (float *)s->output->extended_data[3];
 
-    get_lfe(s->output_lfe, n, s->lowcut, s->highcut, &lfe_mag, &mag_total);
+    get_lfe(s->output_lfe, n, s->lowcut, s->highcut, &lfe_mag, &mag_total, s->lfe_mode);
 
-    c_mag = sqrtf(1.f - fabsf(x))   * ((y + 1.f) * .5f) * mag_total;
-    l_mag = sqrtf(.5f * ( x + 1.f)) * ((y + 1.f) * .5f) * mag_total;
-    r_mag = sqrtf(.5f * (-x + 1.f)) * ((y + 1.f) * .5f) * mag_total;
+    c_mag = powf(1.f - fabsf(x),   s->fc_x) * powf((y + 1.f) * .5f, s->fc_y) * mag_total;
+    l_mag = powf(.5f * ( x + 1.f), s->fl_x) * powf((y + 1.f) * .5f, s->fl_y) * mag_total;
+    r_mag = powf(.5f * (-x + 1.f), s->fr_x) * powf((y + 1.f) * .5f, s->fr_y) * mag_total;
 
     dstl[2 * n    ] = l_mag * cosf(l_phase);
     dstl[2 * n + 1] = l_mag * sinf(l_phase);
@@ -399,10 +509,10 @@
     dstc = (float *)s->output->extended_data[2];
     dstlfe = (float *)s->output->extended_data[3];
 
-    get_lfe(s->output_lfe, n, s->lowcut, s->highcut, &lfe_mag, &c_mag);
+    get_lfe(s->output_lfe, n, s->lowcut, s->highcut, &lfe_mag, &c_mag, s->lfe_mode);
 
-    l_mag = sqrtf(.5f * ( x + 1.f)) * ((y + 1.f) * .5f) * mag_total;
-    r_mag = sqrtf(.5f * (-x + 1.f)) * ((y + 1.f) * .5f) * mag_total;
+    l_mag = powf(.5f * ( x + 1.f), s->fl_x) * powf((y + 1.f) * .5f, s->fl_y) * mag_total;
+    r_mag = powf(.5f * (-x + 1.f), s->fr_x) * powf((y + 1.f) * .5f, s->fr_y) * mag_total;
 
     dstl[2 * n    ] = l_mag * cosf(l_phase);
     dstl[2 * n + 1] = l_mag * sinf(l_phase);
@@ -425,18 +535,18 @@
                       float x, float y,
                       int n)
 {
-    float b_mag, l_mag, r_mag, c_mag, *dstc, *dstl, *dstr, *dstb;
     AudioSurroundContext *s = ctx->priv;
+    float b_mag, l_mag, r_mag, c_mag, *dstc, *dstl, *dstr, *dstb;
 
     dstl = (float *)s->output->extended_data[0];
     dstr = (float *)s->output->extended_data[1];
     dstc = (float *)s->output->extended_data[2];
     dstb = (float *)s->output->extended_data[3];
 
-    c_mag = sqrtf(1.f - fabsf(x))   * ((y + 1.f) * .5f) * mag_total;
-    b_mag = sqrtf(1.f - fabsf(x))   * ((1.f - y) * .5f) * mag_total;
-    l_mag = sqrtf(.5f * ( x + 1.f)) * ((y + 1.f) * .5f) * mag_total;
-    r_mag = sqrtf(.5f * (-x + 1.f)) * ((y + 1.f) * .5f) * mag_total;
+    c_mag = powf(1.f - fabsf(x),   s->fc_x) * powf((y + 1.f) * .5f, s->fc_y) * mag_total;
+    b_mag = powf(1.f - fabsf(x),   s->bc_x) * powf((1.f - y) * .5f, s->bc_y) * mag_total;
+    l_mag = powf(.5f * ( x + 1.f), s->fl_x) * powf((y + 1.f) * .5f, s->fl_y) * mag_total;
+    r_mag = powf(.5f * (-x + 1.f), s->fr_x) * powf((y + 1.f) * .5f, s->fr_y) * mag_total;
 
     dstl[2 * n    ] = l_mag * cosf(l_phase);
     dstl[2 * n + 1] = l_mag * sinf(l_phase);
@@ -459,8 +569,8 @@
                       float x, float y,
                       int n)
 {
-    float lfe_mag, b_mag, l_mag, r_mag, c_mag, *dstc, *dstl, *dstr, *dstb, *dstlfe;
     AudioSurroundContext *s = ctx->priv;
+    float lfe_mag, b_mag, l_mag, r_mag, c_mag, *dstc, *dstl, *dstr, *dstb, *dstlfe;
 
     dstl = (float *)s->output->extended_data[0];
     dstr = (float *)s->output->extended_data[1];
@@ -468,15 +578,15 @@
     dstlfe = (float *)s->output->extended_data[3];
     dstb = (float *)s->output->extended_data[4];
 
-    get_lfe(s->output_lfe, n, s->lowcut, s->highcut, &lfe_mag, &mag_total);
+    get_lfe(s->output_lfe, n, s->lowcut, s->highcut, &lfe_mag, &mag_total, s->lfe_mode);
 
     dstlfe[2 * n    ] = lfe_mag * cosf(c_phase);
     dstlfe[2 * n + 1] = lfe_mag * sinf(c_phase);
 
-    c_mag = sqrtf(1.f - fabsf(x))   * ((y + 1.f) * .5f) * mag_total;
-    b_mag = sqrtf(1.f - fabsf(x))   * ((1.f - y) * .5f) * mag_total;
-    l_mag = sqrtf(.5f * ( x + 1.f)) * ((y + 1.f) * .5f) * mag_total;
-    r_mag = sqrtf(.5f * (-x + 1.f)) * ((y + 1.f) * .5f) * mag_total;
+    c_mag = powf(1.f - fabsf(x),   s->fc_x) * powf((y + 1.f) * .5f, s->fc_y) * mag_total;
+    b_mag = powf(1.f - fabsf(x),   s->bc_x) * powf((1.f - y) * .5f, s->bc_y) * mag_total;
+    l_mag = powf(.5f * ( x + 1.f), s->fl_x) * powf((y + 1.f) * .5f, s->fl_y) * mag_total;
+    r_mag = powf(.5f * (-x + 1.f), s->fr_x) * powf((y + 1.f) * .5f, s->fr_y) * mag_total;
 
     dstl[2 * n    ] = l_mag * cosf(l_phase);
     dstl[2 * n + 1] = l_mag * sinf(l_phase);
@@ -499,8 +609,8 @@
                            float x, float y,
                            int n)
 {
-    float l_mag, r_mag, ls_mag, rs_mag, c_mag, *dstc, *dstl, *dstr, *dstls, *dstrs;
     AudioSurroundContext *s = ctx->priv;
+    float l_mag, r_mag, ls_mag, rs_mag, c_mag, *dstc, *dstl, *dstr, *dstls, *dstrs;
 
     dstl  = (float *)s->output->extended_data[0];
     dstr  = (float *)s->output->extended_data[1];
@@ -508,11 +618,11 @@
     dstls = (float *)s->output->extended_data[3];
     dstrs = (float *)s->output->extended_data[4];
 
-    c_mag  = sqrtf(1.f - fabsf(x))   * ((y + 1.f) * .5f) * mag_total;
-    l_mag  = sqrtf(.5f * ( x + 1.f)) * ((y + 1.f) * .5f) * mag_total;
-    r_mag  = sqrtf(.5f * (-x + 1.f)) * ((y + 1.f) * .5f) * mag_total;
-    ls_mag = sqrtf(.5f * ( x + 1.f)) * (1.f - ((y + 1.f) * .5f)) * mag_total;
-    rs_mag = sqrtf(.5f * (-x + 1.f)) * (1.f - ((y + 1.f) * .5f)) * mag_total;
+    c_mag  = powf(1.f - fabsf(x),   s->fc_x) * powf((y + 1.f) * .5f, s->fc_y) * mag_total;
+    l_mag  = powf(.5f * ( x + 1.f), s->fl_x) * powf((y + 1.f) * .5f, s->fl_y) * mag_total;
+    r_mag  = powf(.5f * (-x + 1.f), s->fr_x) * powf((y + 1.f) * .5f, s->fr_y) * mag_total;
+    ls_mag = powf(.5f * ( x + 1.f), s->bl_x) * powf(1.f - ((y + 1.f) * .5f), s->bl_y) * mag_total;
+    rs_mag = powf(.5f * (-x + 1.f), s->br_x) * powf(1.f - ((y + 1.f) * .5f), s->br_y) * mag_total;
 
     dstl[2 * n    ] = l_mag * cosf(l_phase);
     dstl[2 * n + 1] = l_mag * sinf(l_phase);
@@ -538,8 +648,8 @@
                            float x, float y,
                            int n)
 {
-    float lfe_mag, l_mag, r_mag, ls_mag, rs_mag, c_mag, *dstc, *dstl, *dstr, *dstls, *dstrs, *dstlfe;
     AudioSurroundContext *s = ctx->priv;
+    float lfe_mag, l_mag, r_mag, ls_mag, rs_mag, c_mag, *dstc, *dstl, *dstr, *dstls, *dstrs, *dstlfe;
 
     dstl  = (float *)s->output->extended_data[0];
     dstr  = (float *)s->output->extended_data[1];
@@ -548,13 +658,13 @@
     dstls = (float *)s->output->extended_data[4];
     dstrs = (float *)s->output->extended_data[5];
 
-    get_lfe(s->output_lfe, n, s->lowcut, s->highcut, &lfe_mag, &mag_total);
+    get_lfe(s->output_lfe, n, s->lowcut, s->highcut, &lfe_mag, &mag_total, s->lfe_mode);
 
-    c_mag  = sqrtf(1.f - fabsf(x))   * ((y + 1.f) * .5f) * mag_total;
-    l_mag  = sqrtf(.5f * ( x + 1.f)) * ((y + 1.f) * .5f) * mag_total;
-    r_mag  = sqrtf(.5f * (-x + 1.f)) * ((y + 1.f) * .5f) * mag_total;
-    ls_mag = sqrtf(.5f * ( x + 1.f)) * (1.f - ((y + 1.f) * .5f)) * mag_total;
-    rs_mag = sqrtf(.5f * (-x + 1.f)) * (1.f - ((y + 1.f) * .5f)) * mag_total;
+    c_mag  = powf(1.f - fabsf(x),   s->fc_x) * powf((y + 1.f) * .5f, s->fc_y) * mag_total;
+    l_mag  = powf(.5f * ( x + 1.f), s->fl_x) * powf((y + 1.f) * .5f, s->fl_y) * mag_total;
+    r_mag  = powf(.5f * (-x + 1.f), s->fr_x) * powf((y + 1.f) * .5f, s->fr_y) * mag_total;
+    ls_mag = powf(.5f * ( x + 1.f), s->bl_x) * powf(1.f - ((y + 1.f) * .5f), s->bl_y) * mag_total;
+    rs_mag = powf(.5f * (-x + 1.f), s->br_x) * powf(1.f - ((y + 1.f) * .5f), s->br_y) * mag_total;
 
     dstl[2 * n    ] = l_mag * cosf(l_phase);
     dstl[2 * n + 1] = l_mag * sinf(l_phase);
@@ -575,6 +685,100 @@
     dstrs[2 * n + 1] = rs_mag * sinf(r_phase);
 }
 
+static void upmix_6_0(AVFilterContext *ctx,
+                      float l_phase,
+                      float r_phase,
+                      float c_phase,
+                      float mag_total,
+                      float x, float y,
+                      int n)
+{
+    AudioSurroundContext *s = ctx->priv;
+    float l_mag, r_mag, ls_mag, rs_mag, c_mag, b_mag, *dstc, *dstb, *dstl, *dstr, *dstls, *dstrs;
+
+    dstl  = (float *)s->output->extended_data[0];
+    dstr  = (float *)s->output->extended_data[1];
+    dstc  = (float *)s->output->extended_data[2];
+    dstb  = (float *)s->output->extended_data[3];
+    dstls = (float *)s->output->extended_data[4];
+    dstrs = (float *)s->output->extended_data[5];
+
+    c_mag  = powf(1.f - fabsf(x),   s->fc_x) * powf((y + 1.f) * .5f, s->fc_y) * mag_total;
+    b_mag  = powf(1.f - fabsf(x),   s->bc_x) * powf((1.f - y) * .5f, s->bc_y) * mag_total;
+    l_mag  = powf(.5f * ( x + 1.f), s->fl_x) * powf((y + 1.f) * .5f, s->fl_y) * mag_total;
+    r_mag  = powf(.5f * (-x + 1.f), s->fr_x) * powf((y + 1.f) * .5f, s->fr_y) * mag_total;
+    ls_mag = powf(.5f * ( x + 1.f), s->bl_x) * powf(1.f - ((y + 1.f) * .5f), s->bl_y) * mag_total;
+    rs_mag = powf(.5f * (-x + 1.f), s->br_x) * powf(1.f - ((y + 1.f) * .5f), s->br_y) * mag_total;
+
+    dstl[2 * n    ] = l_mag * cosf(l_phase);
+    dstl[2 * n + 1] = l_mag * sinf(l_phase);
+
+    dstr[2 * n    ] = r_mag * cosf(r_phase);
+    dstr[2 * n + 1] = r_mag * sinf(r_phase);
+
+    dstc[2 * n    ] = c_mag * cosf(c_phase);
+    dstc[2 * n + 1] = c_mag * sinf(c_phase);
+
+    dstls[2 * n    ] = ls_mag * cosf(l_phase);
+    dstls[2 * n + 1] = ls_mag * sinf(l_phase);
+
+    dstrs[2 * n    ] = rs_mag * cosf(r_phase);
+    dstrs[2 * n + 1] = rs_mag * sinf(r_phase);
+
+    dstb[2 * n    ] = b_mag * cosf(c_phase);
+    dstb[2 * n + 1] = b_mag * sinf(c_phase);
+}
+
+static void upmix_6_1(AVFilterContext *ctx,
+                      float l_phase,
+                      float r_phase,
+                      float c_phase,
+                      float mag_total,
+                      float x, float y,
+                      int n)
+{
+    AudioSurroundContext *s = ctx->priv;
+    float lfe_mag, l_mag, r_mag, ls_mag, rs_mag, c_mag, b_mag, *dstc, *dstb, *dstl, *dstr, *dstls, *dstrs, *dstlfe;
+
+    dstl  = (float *)s->output->extended_data[0];
+    dstr  = (float *)s->output->extended_data[1];
+    dstc  = (float *)s->output->extended_data[2];
+    dstlfe = (float *)s->output->extended_data[3];
+    dstb  = (float *)s->output->extended_data[4];
+    dstls = (float *)s->output->extended_data[5];
+    dstrs = (float *)s->output->extended_data[6];
+
+    get_lfe(s->output_lfe, n, s->lowcut, s->highcut, &lfe_mag, &mag_total, s->lfe_mode);
+
+    c_mag  = powf(1.f - fabsf(x),   s->fc_x) * powf((y + 1.f) * .5f, s->fc_y) * mag_total;
+    b_mag  = powf(1.f - fabsf(x),   s->bc_x) * powf((1.f - y) * .5f, s->bc_y) * mag_total;
+    l_mag  = powf(.5f * ( x + 1.f), s->fl_x) * powf((y + 1.f) * .5f, s->fl_y) * mag_total;
+    r_mag  = powf(.5f * (-x + 1.f), s->fr_x) * powf((y + 1.f) * .5f, s->fr_y) * mag_total;
+    ls_mag = powf(.5f * ( x + 1.f), s->bl_x) * powf(1.f - ((y + 1.f) * .5f), s->bl_y) * mag_total;
+    rs_mag = powf(.5f * (-x + 1.f), s->br_x) * powf(1.f - ((y + 1.f) * .5f), s->br_y) * mag_total;
+
+    dstl[2 * n    ] = l_mag * cosf(l_phase);
+    dstl[2 * n + 1] = l_mag * sinf(l_phase);
+
+    dstr[2 * n    ] = r_mag * cosf(r_phase);
+    dstr[2 * n + 1] = r_mag * sinf(r_phase);
+
+    dstc[2 * n    ] = c_mag * cosf(c_phase);
+    dstc[2 * n + 1] = c_mag * sinf(c_phase);
+
+    dstlfe[2 * n    ] = lfe_mag * cosf(c_phase);
+    dstlfe[2 * n + 1] = lfe_mag * sinf(c_phase);
+
+    dstls[2 * n    ] = ls_mag * cosf(l_phase);
+    dstls[2 * n + 1] = ls_mag * sinf(l_phase);
+
+    dstrs[2 * n    ] = rs_mag * cosf(r_phase);
+    dstrs[2 * n + 1] = rs_mag * sinf(r_phase);
+
+    dstb[2 * n    ] = b_mag * cosf(c_phase);
+    dstb[2 * n + 1] = b_mag * sinf(c_phase);
+}
+
 static void upmix_5_1_back_surround(AVFilterContext *ctx,
                                     float l_phase,
                                     float r_phase,
@@ -595,12 +799,12 @@
     dstls = (float *)s->output->extended_data[4];
     dstrs = (float *)s->output->extended_data[5];
 
-    get_lfe(s->output_lfe, n, s->lowcut, s->highcut, &lfe_mag, &c_mag);
+    get_lfe(s->output_lfe, n, s->lowcut, s->highcut, &lfe_mag, &c_mag, s->lfe_mode);
 
-    l_mag = sqrtf(.5f * ( x + 1.f)) * ((y + 1.f) * .5f) * mag_total;
-    r_mag = sqrtf(.5f * (-x + 1.f)) * ((y + 1.f) * .5f) * mag_total;
-    ls_mag = sqrtf(.5f * ( x + 1.f)) * (1.f - ((y + 1.f) * .5f)) * mag_total;
-    rs_mag = sqrtf(.5f * (-x + 1.f)) * (1.f - ((y + 1.f) * .5f)) * mag_total;
+    l_mag = powf(.5f * ( x + 1.f),  s->fl_x) * powf((y + 1.f) * .5f, s->fl_y) * mag_total;
+    r_mag = powf(.5f * (-x + 1.f),  s->fr_x) * powf((y + 1.f) * .5f, s->fr_y) * mag_total;
+    ls_mag = powf(.5f * ( x + 1.f), s->bl_x) * powf(1.f - ((y + 1.f) * .5f), s->bl_y) * mag_total;
+    rs_mag = powf(.5f * (-x + 1.f), s->br_x) * powf(1.f - ((y + 1.f) * .5f), s->br_y) * mag_total;
 
     dstl[2 * n    ] = l_mag * cosf(l_phase);
     dstl[2 * n + 1] = l_mag * sinf(l_phase);
@@ -642,11 +846,11 @@
     dstls = (float *)s->output->extended_data[4];
     dstrs = (float *)s->output->extended_data[5];
 
-    c_mag  = sqrtf(1.f - fabsf(x))   * ((y + 1.f) * .5f) * mag_total;
-    l_mag  = sqrtf(.5f * ( x + 1.f)) * ((y + 1.f) * .5f) * mag_total;
-    r_mag  = sqrtf(.5f * (-x + 1.f)) * ((y + 1.f) * .5f) * mag_total;
-    ls_mag = sqrtf(.5f * ( x + 1.f)) * (1.f - ((y + 1.f) * .5f)) * mag_total;
-    rs_mag = sqrtf(.5f * (-x + 1.f)) * (1.f - ((y + 1.f) * .5f)) * mag_total;
+    c_mag  = powf(1.f - fabsf(x),   s->fc_x) * powf((y + 1.f) * .5f, s->fc_y) * mag_total;
+    l_mag  = powf(.5f * ( x + 1.f), s->fl_x) * powf((y + 1.f) * .5f, s->fl_y) * mag_total;
+    r_mag  = powf(.5f * (-x + 1.f), s->fr_x) * powf((y + 1.f) * .5f, s->fr_y) * mag_total;
+    ls_mag = powf(.5f * ( x + 1.f), s->bl_x) * powf(1.f - ((y + 1.f) * .5f), s->bl_y) * mag_total;
+    rs_mag = powf(.5f * (-x + 1.f), s->br_x) * powf(1.f - ((y + 1.f) * .5f), s->br_y) * mag_total;
 
     dstl[2 * n    ] = l_mag * cosf(l_phase);
     dstl[2 * n + 1] = l_mag * sinf(l_phase);
@@ -687,13 +891,13 @@
     dstls = (float *)s->output->extended_data[5];
     dstrs = (float *)s->output->extended_data[6];
 
-    c_mag  = sqrtf(1.f - fabsf(x))   * ((y + 1.f) * .5f) * mag_total;
-    l_mag  = sqrtf(.5f * ( x + 1.f)) * ((y + 1.f) * .5f) * mag_total;
-    r_mag  = sqrtf(.5f * (-x + 1.f)) * ((y + 1.f) * .5f) * mag_total;
-    lb_mag = sqrtf(.5f * ( x + 1.f)) * (1.f - ((y + 1.f) * .5f)) * mag_total;
-    rb_mag = sqrtf(.5f * (-x + 1.f)) * (1.f - ((y + 1.f) * .5f)) * mag_total;
-    ls_mag = sqrtf(.5f * ( x + 1.f)) * (1.f - fabsf(y)) * mag_total;
-    rs_mag = sqrtf(.5f * (-x + 1.f)) * (1.f - fabsf(y)) * mag_total;
+    c_mag  = powf(1.f - fabsf(x),   s->fc_x) * powf((y + 1.f) * .5f, s->fc_y) * mag_total;
+    l_mag  = powf(.5f * ( x + 1.f), s->fl_x) * powf((y + 1.f) * .5f, s->fl_y) * mag_total;
+    r_mag  = powf(.5f * (-x + 1.f), s->fr_x) * powf((y + 1.f) * .5f, s->fr_y) * mag_total;
+    lb_mag = powf(.5f * ( x + 1.f), s->bl_x) * powf(1.f - ((y + 1.f) * .5f), s->bl_y) * mag_total;
+    rb_mag = powf(.5f * (-x + 1.f), s->br_x) * powf(1.f - ((y + 1.f) * .5f), s->br_y) * mag_total;
+    ls_mag = powf(.5f * ( x + 1.f), s->sl_x) * powf(1.f - fabsf(y), s->sl_y) * mag_total;
+    rs_mag = powf(.5f * (-x + 1.f), s->sr_x) * powf(1.f - fabsf(y), s->sr_y) * mag_total;
 
     dstl[2 * n    ] = l_mag * cosf(l_phase);
     dstl[2 * n + 1] = l_mag * sinf(l_phase);
@@ -738,15 +942,15 @@
     dstls = (float *)s->output->extended_data[6];
     dstrs = (float *)s->output->extended_data[7];
 
-    get_lfe(s->output_lfe, n, s->lowcut, s->highcut, &lfe_mag, &mag_total);
+    get_lfe(s->output_lfe, n, s->lowcut, s->highcut, &lfe_mag, &mag_total, s->lfe_mode);
 
-    c_mag  = sqrtf(1.f - fabsf(x))   * ((y + 1.f) * .5f) * mag_total;
-    l_mag  = sqrtf(.5f * ( x + 1.f)) * ((y + 1.f) * .5f) * mag_total;
-    r_mag  = sqrtf(.5f * (-x + 1.f)) * ((y + 1.f) * .5f) * mag_total;
-    lb_mag = sqrtf(.5f * ( x + 1.f)) * (1.f - ((y + 1.f) * .5f)) * mag_total;
-    rb_mag = sqrtf(.5f * (-x + 1.f)) * (1.f - ((y + 1.f) * .5f)) * mag_total;
-    ls_mag = sqrtf(.5f * ( x + 1.f)) * (1.f - fabsf(y)) * mag_total;
-    rs_mag = sqrtf(.5f * (-x + 1.f)) * (1.f - fabsf(y)) * mag_total;
+    c_mag  = powf(1.f - fabsf(x), s->fc_x)   * powf((y + 1.f) * .5f, s->fc_y) * mag_total;
+    l_mag  = powf(.5f * ( x + 1.f), s->fl_x) * powf((y + 1.f) * .5f, s->fl_y) * mag_total;
+    r_mag  = powf(.5f * (-x + 1.f), s->fr_x) * powf((y + 1.f) * .5f, s->fr_y) * mag_total;
+    lb_mag = powf(.5f * ( x + 1.f), s->bl_x) * powf(1.f - ((y + 1.f) * .5f), s->bl_y) * mag_total;
+    rb_mag = powf(.5f * (-x + 1.f), s->br_x) * powf(1.f - ((y + 1.f) * .5f), s->br_y) * mag_total;
+    ls_mag = powf(.5f * ( x + 1.f), s->sl_x) * powf(1.f - fabsf(y), s->sl_y) * mag_total;
+    rs_mag = powf(.5f * (-x + 1.f), s->sr_x) * powf(1.f - fabsf(y), s->sr_y) * mag_total;
 
     dstl[2 * n    ] = l_mag * cosf(l_phase);
     dstl[2 * n + 1] = l_mag * sinf(l_phase);
@@ -799,14 +1003,14 @@
 
     c_phase = atan2f(c_im, c_re);
 
-    get_lfe(s->output_lfe, n, s->lowcut, s->highcut, &lfe_mag, &mag_total);
+    get_lfe(s->output_lfe, n, s->lowcut, s->highcut, &lfe_mag, &mag_total, s->lfe_mode);
 
-    fl_mag = sqrtf(.5f * (xl + 1.f)) * ((yl + 1.f) * .5f) * mag_totall;
-    fr_mag = sqrtf(.5f * (xr + 1.f)) * ((yr + 1.f) * .5f) * mag_totalr;
-    lb_mag = sqrtf(.5f * (-xl + 1.f)) * ((yl + 1.f) * .5f) * mag_totall;
-    rb_mag = sqrtf(.5f * (-xr + 1.f)) * ((yr + 1.f) * .5f) * mag_totalr;
-    ls_mag = sqrtf(1.f - fabsf(xl)) * ((yl + 1.f) * .5f) * mag_totall;
-    rs_mag = sqrtf(1.f - fabsf(xr)) * ((yr + 1.f) * .5f) * mag_totalr;
+    fl_mag = powf(.5f * (xl + 1.f), s->fl_x) * powf((yl + 1.f) * .5f, s->fl_y) * mag_totall;
+    fr_mag = powf(.5f * (xr + 1.f), s->fr_x) * powf((yr + 1.f) * .5f, s->fr_y) * mag_totalr;
+    lb_mag = powf(.5f * (-xl + 1.f), s->bl_x) * powf((yl + 1.f) * .5f, s->bl_y) * mag_totall;
+    rb_mag = powf(.5f * (-xr + 1.f), s->br_x) * powf((yr + 1.f) * .5f, s->br_y) * mag_totalr;
+    ls_mag = powf(1.f - fabsf(xl), s->sl_x) * powf((yl + 1.f) * .5f, s->sl_y) * mag_totall;
+    rs_mag = powf(1.f - fabsf(xr), s->sr_x) * powf((yr + 1.f) * .5f, s->sr_y) * mag_totalr;
 
     dstl[2 * n    ] = fl_mag * cosf(fl_phase);
     dstl[2 * n + 1] = fl_mag * sinf(fl_phase);
@@ -857,12 +1061,12 @@
     dstls = (float *)s->output->extended_data[6];
     dstrs = (float *)s->output->extended_data[7];
 
-    fl_mag = sqrtf(.5f * (xl + 1.f)) * ((yl + 1.f) * .5f) * mag_totall;
-    fr_mag = sqrtf(.5f * (xr + 1.f)) * ((yr + 1.f) * .5f) * mag_totalr;
-    lb_mag = sqrtf(.5f * (-xl + 1.f)) * ((yl + 1.f) * .5f) * mag_totall;
-    rb_mag = sqrtf(.5f * (-xr + 1.f)) * ((yr + 1.f) * .5f) * mag_totalr;
-    ls_mag = sqrtf(1.f - fabsf(xl)) * ((yl + 1.f) * .5f) * mag_totall;
-    rs_mag = sqrtf(1.f - fabsf(xr)) * ((yr + 1.f) * .5f) * mag_totalr;
+    fl_mag = powf(.5f * (xl + 1.f), s->fl_x) * powf((yl + 1.f) * .5f, s->fl_y) * mag_totall;
+    fr_mag = powf(.5f * (xr + 1.f), s->fr_x) * powf((yr + 1.f) * .5f, s->fr_y) * mag_totalr;
+    lb_mag = powf(.5f * (-xl + 1.f), s->bl_x) * powf((yl + 1.f) * .5f, s->bl_y) * mag_totall;
+    rb_mag = powf(.5f * (-xr + 1.f), s->br_x) * powf((yr + 1.f) * .5f, s->br_y) * mag_totalr;
+    ls_mag = powf(1.f - fabsf(xl), s->sl_x) * powf((yl + 1.f) * .5f, s->sl_y) * mag_totall;
+    rs_mag = powf(1.f - fabsf(xr), s->sr_x) * powf((yr + 1.f) * .5f, s->sr_y) * mag_totalr;
 
     dstl[2 * n    ] = fl_mag * cosf(fl_phase);
     dstl[2 * n + 1] = fl_mag * sinf(fl_phase);
@@ -907,7 +1111,8 @@
         float l_phase = atan2f(l_im, l_re);
         float r_phase = atan2f(r_im, r_re);
         float phase_dif = fabsf(l_phase - r_phase);
-        float mag_dif = (l_mag - r_mag) / (l_mag + r_mag);
+        float mag_sum = l_mag + r_mag;
+        float mag_dif = mag_sum < 0.000001 ? FFDIFFSIGN(l_mag, r_mag) : (l_mag - r_mag) / mag_sum;
         float mag_total = hypotf(l_mag, r_mag);
         float x, y;
 
@@ -915,6 +1120,7 @@
             phase_dif = 2 * M_PI - phase_dif;
 
         stereo_position(mag_dif, phase_dif, &x, &y);
+        stereo_transform(&x, &y, s->angle);
 
         s->upmix_stereo(ctx, l_phase, r_phase, c_phase, mag_total, x, y, n);
     }
@@ -941,7 +1147,8 @@
         float l_phase = atan2f(l_im, l_re);
         float r_phase = atan2f(r_im, r_re);
         float phase_dif = fabsf(l_phase - r_phase);
-        float mag_dif = (l_mag - r_mag) / (l_mag + r_mag);
+        float mag_sum = l_mag + r_mag;
+        float mag_dif = mag_sum < 0.000001 ? FFDIFFSIGN(l_mag, r_mag) : (l_mag - r_mag) / mag_sum;
         float mag_total = hypotf(l_mag, r_mag);
         float x, y;
 
@@ -949,6 +1156,7 @@
             phase_dif = 2 * M_PI - phase_dif;
 
         stereo_position(mag_dif, phase_dif, &x, &y);
+        stereo_transform(&x, &y, s->angle);
 
         s->upmix_3_0(ctx, l_phase, r_phase, c_phase, c_mag, mag_total, x, y, n);
     }
@@ -974,7 +1182,8 @@
         float l_phase = atan2f(l_im, l_re);
         float r_phase = atan2f(r_im, r_re);
         float phase_dif = fabsf(l_phase - r_phase);
-        float mag_dif = (l_mag - r_mag) / (l_mag + r_mag);
+        float mag_sum = l_mag + r_mag;
+        float mag_dif = mag_sum < 0.000001 ? FFDIFFSIGN(l_mag, r_mag) : (l_mag - r_mag) / mag_sum;
         float mag_total = hypotf(l_mag, r_mag);
         float x, y;
 
@@ -982,6 +1191,7 @@
             phase_dif = 2 * M_PI - phase_dif;
 
         stereo_position(mag_dif, phase_dif, &x, &y);
+        stereo_transform(&x, &y, s->angle);
 
         s->upmix_2_1(ctx, l_phase, r_phase, c_phase, mag_total, lfe_re, lfe_im, x, y, n);
     }
@@ -1015,8 +1225,10 @@
         float sr_phase = atan2f(sr_im, sr_re);
         float phase_difl = fabsf(fl_phase - sl_phase);
         float phase_difr = fabsf(fr_phase - sr_phase);
-        float mag_difl = (fl_mag - sl_mag) / (fl_mag + sl_mag);
-        float mag_difr = (fr_mag - sr_mag) / (fr_mag + sr_mag);
+        float magl_sum = fl_mag + sl_mag;
+        float magr_sum = fr_mag + sr_mag;
+        float mag_difl = magl_sum < 0.000001 ? FFDIFFSIGN(fl_mag, sl_mag) : (fl_mag - sl_mag) / magl_sum;
+        float mag_difr = magr_sum < 0.000001 ? FFDIFFSIGN(fr_mag, sr_mag) : (fr_mag - sr_mag) / magr_sum;
         float mag_totall = hypotf(fl_mag, sl_mag);
         float mag_totalr = hypotf(fr_mag, sr_mag);
         float bl_phase = atan2f(fl_im + sl_im, fl_re + sl_re);
@@ -1072,8 +1284,10 @@
         float sr_phase = atan2f(sr_im, sr_re);
         float phase_difl = fabsf(fl_phase - sl_phase);
         float phase_difr = fabsf(fr_phase - sr_phase);
-        float mag_difl = (fl_mag - sl_mag) / (fl_mag + sl_mag);
-        float mag_difr = (fr_mag - sr_mag) / (fr_mag + sr_mag);
+        float magl_sum = fl_mag + sl_mag;
+        float magr_sum = fr_mag + sr_mag;
+        float mag_difl = magl_sum < 0.000001 ? FFDIFFSIGN(fl_mag, sl_mag) : (fl_mag - sl_mag) / magl_sum;
+        float mag_difr = magr_sum < 0.000001 ? FFDIFFSIGN(fr_mag, sr_mag) : (fr_mag - sr_mag) / magr_sum;
         float mag_totall = hypotf(fl_mag, sl_mag);
         float mag_totalr = hypotf(fr_mag, sr_mag);
         float bl_phase = atan2f(fl_im + sl_im, fl_re + sl_re);
@@ -1129,8 +1343,10 @@
         float br_phase = atan2f(br_im, br_re);
         float phase_difl = fabsf(fl_phase - bl_phase);
         float phase_difr = fabsf(fr_phase - br_phase);
-        float mag_difl = (fl_mag - bl_mag) / (fl_mag + bl_mag);
-        float mag_difr = (fr_mag - br_mag) / (fr_mag + br_mag);
+        float magl_sum = fl_mag + bl_mag;
+        float magr_sum = fr_mag + br_mag;
+        float mag_difl = magl_sum < 0.000001 ? FFDIFFSIGN(fl_mag, bl_mag) : (fl_mag - bl_mag) / magl_sum;
+        float mag_difr = magr_sum < 0.000001 ? FFDIFFSIGN(fr_mag, br_mag) : (fr_mag - br_mag) / magr_sum;
         float mag_totall = hypotf(fl_mag, bl_mag);
         float mag_totalr = hypotf(fr_mag, br_mag);
         float sl_phase = atan2f(fl_im + bl_im, fl_re + bl_re);
@@ -1156,7 +1372,7 @@
     }
 }
 
-static int init(AVFilterContext *ctx)
+static av_cold int init(AVFilterContext *ctx)
 {
     AudioSurroundContext *s = ctx->priv;
     float overlap;
@@ -1211,6 +1427,12 @@
         case AV_CH_LAYOUT_5POINT1_BACK:
             s->upmix_stereo = upmix_5_1_back;
             break;
+        case AV_CH_LAYOUT_6POINT0:
+            s->upmix_stereo = upmix_6_0;
+            break;
+        case AV_CH_LAYOUT_6POINT1:
+            s->upmix_stereo = upmix_6_1;
+            break;
         case AV_CH_LAYOUT_7POINT0:
             s->upmix_stereo = upmix_7_0;
             break;
@@ -1281,17 +1503,27 @@
         return AVERROR(EINVAL);
     }
 
-    s->buf_size = 4096;
+    s->buf_size = 1 << av_log2(s->win_size);
     s->pts = AV_NOPTS_VALUE;
 
     s->window_func_lut = av_calloc(s->buf_size, sizeof(*s->window_func_lut));
     if (!s->window_func_lut)
         return AVERROR(ENOMEM);
 
+    generate_window_func(s->window_func_lut, s->buf_size, s->win_func, &overlap);
+    if (s->overlap == 1)
+        s->overlap = overlap;
+
     for (i = 0; i < s->buf_size; i++)
-        s->window_func_lut[i] = sqrtf(0.5 * (1 - cosf(2 * M_PI * i / s->buf_size)) / s->buf_size);
-    overlap = .5;
-    s->hop_size = s->buf_size * (1. - overlap);
+        s->window_func_lut[i] = sqrtf(s->window_func_lut[i] / s->buf_size);
+    s->hop_size = s->buf_size * (1. - s->overlap);
+    if (s->hop_size <= 0)
+        return AVERROR(EINVAL);
+
+    if (s->all_x >= 0.f)
+        s->fc_x = s->fl_x = s->fr_x = s->bc_x = s->sl_x = s->sr_x = s->bl_x = s->br_x = s->all_x;
+    if (s->all_y >= 0.f)
+        s->fc_y = s->fl_y = s->fr_y = s->bc_y = s->sl_y = s->sr_y = s->bl_y = s->br_y = s->all_y;
 
     return 0;
 }
@@ -1345,70 +1577,91 @@
     return 0;
 }
 
-static int filter_frame(AVFilterLink *inlink, AVFrame *in)
+static int filter_frame(AVFilterLink *inlink)
 {
     AVFilterContext *ctx = inlink->dst;
     AVFilterLink *outlink = ctx->outputs[0];
     AudioSurroundContext *s = ctx->priv;
+    AVFrame *out;
     int ret;
 
-    ret = av_audio_fifo_write(s->fifo, (void **)in->extended_data,
-                              in->nb_samples);
-    if (ret >= 0 && s->pts == AV_NOPTS_VALUE)
-        s->pts = in->pts;
-
-    av_frame_free(&in);
+    ret = av_audio_fifo_peek(s->fifo, (void **)s->input->extended_data, s->buf_size);
     if (ret < 0)
         return ret;
 
-    while (av_audio_fifo_size(s->fifo) >= s->buf_size) {
-        AVFrame *out;
+    ctx->internal->execute(ctx, fft_channel, NULL, NULL, inlink->channels);
 
-        ret = av_audio_fifo_peek(s->fifo, (void **)s->input->extended_data, s->buf_size);
-        if (ret < 0)
-            return ret;
+    s->filter(ctx);
 
-        ctx->internal->execute(ctx, fft_channel, NULL, NULL, inlink->channels);
+    out = ff_get_audio_buffer(outlink, s->hop_size);
+    if (!out)
+        return AVERROR(ENOMEM);
 
-        s->filter(ctx);
+    ctx->internal->execute(ctx, ifft_channel, out, NULL, outlink->channels);
 
-        out = ff_get_audio_buffer(outlink, s->hop_size);
-        if (!out)
-            return AVERROR(ENOMEM);
+    out->pts = s->pts;
+    if (s->pts != AV_NOPTS_VALUE)
+        s->pts += av_rescale_q(out->nb_samples, (AVRational){1, outlink->sample_rate}, outlink->time_base);
+    av_audio_fifo_drain(s->fifo, FFMIN(av_audio_fifo_size(s->fifo), s->hop_size));
 
-        ctx->internal->execute(ctx, ifft_channel, out, NULL, outlink->channels);
-
-        out->pts = s->pts;
-        if (s->pts != AV_NOPTS_VALUE)
-            s->pts += av_rescale_q(out->nb_samples, (AVRational){1, outlink->sample_rate}, outlink->time_base);
-        av_audio_fifo_drain(s->fifo, s->hop_size);
-        ret = ff_filter_frame(outlink, out);
-        if (ret < 0)
-            return ret;
-    }
-
-    return 0;
+    return ff_filter_frame(outlink, out);
 }
 
-static int request_frame(AVFilterLink *outlink)
+static int activate(AVFilterContext *ctx)
 {
-    AVFilterContext *ctx = outlink->src;
+    AVFilterLink *inlink = ctx->inputs[0];
+    AVFilterLink *outlink = ctx->outputs[0];
     AudioSurroundContext *s = ctx->priv;
-    int ret = 0;
+    AVFrame *in = NULL;
+    int ret = 0, status;
+    int64_t pts;
 
-    ret = ff_request_frame(ctx->inputs[0]);
+    FF_FILTER_FORWARD_STATUS_BACK(outlink, inlink);
 
-    if (ret == AVERROR_EOF && av_audio_fifo_size(s->fifo) > 0 && av_audio_fifo_size(s->fifo) < s->buf_size) {
-        AVFrame *in;
+    if (!s->eof && av_audio_fifo_size(s->fifo) < s->buf_size) {
+        ret = ff_inlink_consume_frame(inlink, &in);
+        if (ret < 0)
+            return ret;
 
-        in = ff_get_audio_buffer(outlink, s->buf_size - av_audio_fifo_size(s->fifo));
-        if (!in)
-            return AVERROR(ENOMEM);
-        ret = filter_frame(ctx->inputs[0], in);
-        av_audio_fifo_drain(s->fifo, s->buf_size);
+        if (ret > 0) {
+            ret = av_audio_fifo_write(s->fifo, (void **)in->extended_data,
+                                      in->nb_samples);
+            if (ret >= 0 && s->pts == AV_NOPTS_VALUE)
+                s->pts = in->pts;
+
+            av_frame_free(&in);
+            if (ret < 0)
+                return ret;
+        }
     }
 
-    return ret;
+    if ((av_audio_fifo_size(s->fifo) >= s->buf_size) ||
+        (av_audio_fifo_size(s->fifo) > 0 && s->eof)) {
+        ret = filter_frame(inlink);
+        if (av_audio_fifo_size(s->fifo) >= s->buf_size)
+            ff_filter_set_ready(ctx, 100);
+        return ret;
+    }
+
+    if (!s->eof && ff_inlink_acknowledge_status(inlink, &status, &pts)) {
+        if (status == AVERROR_EOF) {
+            s->eof = 1;
+            if (av_audio_fifo_size(s->fifo) >= 0) {
+                ff_filter_set_ready(ctx, 100);
+                return 0;
+            }
+        }
+    }
+
+    if (s->eof && av_audio_fifo_size(s->fifo) <= 0) {
+        ff_outlink_set_status(outlink, AVERROR_EOF, s->pts);
+        return 0;
+    }
+
+    if (!s->eof)
+        FF_FILTER_FORWARD_WANTED(outlink, inlink);
+
+    return FFERROR_NOT_READY;
 }
 
 static av_cold void uninit(AVFilterContext *ctx)
@@ -1445,10 +1698,70 @@
     { "lfe",       "output LFE",                OFFSET(output_lfe),             AV_OPT_TYPE_BOOL,   {.i64=1},     0,   1, FLAGS },
     { "lfe_low",   "LFE low cut off",           OFFSET(lowcutf),                AV_OPT_TYPE_INT,    {.i64=128},   0, 256, FLAGS },
     { "lfe_high",  "LFE high cut off",          OFFSET(highcutf),               AV_OPT_TYPE_INT,    {.i64=256},   0, 512, FLAGS },
+    { "lfe_mode",  "set LFE channel mode",      OFFSET(lfe_mode),               AV_OPT_TYPE_INT,    {.i64=0},     0,   1, FLAGS, "lfe_mode" },
+    {  "add",      "just add LFE channel",                  0,                  AV_OPT_TYPE_CONST,  {.i64=0},     0,   1, FLAGS, "lfe_mode" },
+    {  "sub",      "substract LFE channel with others",     0,                  AV_OPT_TYPE_CONST,  {.i64=1},     0,   1, FLAGS, "lfe_mode" },
+    { "angle",     "set soundfield transform angle",        OFFSET(angle),      AV_OPT_TYPE_FLOAT,  {.dbl=90},    0, 360, FLAGS },
     { "fc_in",     "set front center channel input level",  OFFSET(fc_in),      AV_OPT_TYPE_FLOAT,  {.dbl=1},     0,  10, FLAGS },
     { "fc_out",    "set front center channel output level", OFFSET(fc_out),     AV_OPT_TYPE_FLOAT,  {.dbl=1},     0,  10, FLAGS },
+    { "fl_in",     "set front left channel input level",    OFFSET(fl_in),      AV_OPT_TYPE_FLOAT,  {.dbl=1},     0,  10, FLAGS },
+    { "fl_out",    "set front left channel output level",   OFFSET(fl_out),     AV_OPT_TYPE_FLOAT,  {.dbl=1},     0,  10, FLAGS },
+    { "fr_in",     "set front right channel input level",   OFFSET(fr_in),      AV_OPT_TYPE_FLOAT,  {.dbl=1},     0,  10, FLAGS },
+    { "fr_out",    "set front right channel output level",  OFFSET(fr_out),     AV_OPT_TYPE_FLOAT,  {.dbl=1},     0,  10, FLAGS },
+    { "sl_in",     "set side left channel input level",     OFFSET(sl_in),      AV_OPT_TYPE_FLOAT,  {.dbl=1},     0,  10, FLAGS },
+    { "sl_out",    "set side left channel output level",    OFFSET(sl_out),     AV_OPT_TYPE_FLOAT,  {.dbl=1},     0,  10, FLAGS },
+    { "sr_in",     "set side right channel input level",    OFFSET(sr_in),      AV_OPT_TYPE_FLOAT,  {.dbl=1},     0,  10, FLAGS },
+    { "sr_out",    "set side right channel output level",   OFFSET(sr_out),     AV_OPT_TYPE_FLOAT,  {.dbl=1},     0,  10, FLAGS },
+    { "bl_in",     "set back left channel input level",     OFFSET(bl_in),      AV_OPT_TYPE_FLOAT,  {.dbl=1},     0,  10, FLAGS },
+    { "bl_out",    "set back left channel output level",    OFFSET(bl_out),     AV_OPT_TYPE_FLOAT,  {.dbl=1},     0,  10, FLAGS },
+    { "br_in",     "set back right channel input level",    OFFSET(br_in),      AV_OPT_TYPE_FLOAT,  {.dbl=1},     0,  10, FLAGS },
+    { "br_out",    "set back right channel output level",   OFFSET(br_out),     AV_OPT_TYPE_FLOAT,  {.dbl=1},     0,  10, FLAGS },
+    { "bc_in",     "set back center channel input level",   OFFSET(bc_in),      AV_OPT_TYPE_FLOAT,  {.dbl=1},     0,  10, FLAGS },
+    { "bc_out",    "set back center channel output level",  OFFSET(bc_out),     AV_OPT_TYPE_FLOAT,  {.dbl=1},     0,  10, FLAGS },
     { "lfe_in",    "set lfe channel input level",  OFFSET(lfe_in),              AV_OPT_TYPE_FLOAT,  {.dbl=1},     0,  10, FLAGS },
     { "lfe_out",   "set lfe channel output level", OFFSET(lfe_out),             AV_OPT_TYPE_FLOAT,  {.dbl=1},     0,  10, FLAGS },
+    { "allx",      "set all channel's x spread",         OFFSET(all_x),         AV_OPT_TYPE_FLOAT,  {.dbl=-1},   -1,  15, FLAGS },
+    { "ally",      "set all channel's y spread",         OFFSET(all_y),         AV_OPT_TYPE_FLOAT,  {.dbl=-1},   -1,  15, FLAGS },
+    { "fcx",       "set front center channel x spread",  OFFSET(fc_x),          AV_OPT_TYPE_FLOAT,  {.dbl=1},     0,  15, FLAGS },
+    { "flx",       "set front left channel x spread",    OFFSET(fl_x),          AV_OPT_TYPE_FLOAT,  {.dbl=1},     0,  15, FLAGS },
+    { "frx",       "set front right channel x spread",   OFFSET(fr_x),          AV_OPT_TYPE_FLOAT,  {.dbl=1},     0,  15, FLAGS },
+    { "blx",       "set back left channel x spread",     OFFSET(bl_x),          AV_OPT_TYPE_FLOAT,  {.dbl=1},     0,  15, FLAGS },
+    { "brx",       "set back right channel x spread",    OFFSET(br_x),          AV_OPT_TYPE_FLOAT,  {.dbl=1},     0,  15, FLAGS },
+    { "slx",       "set side left channel x spread",     OFFSET(sl_x),          AV_OPT_TYPE_FLOAT,  {.dbl=1},     0,  15, FLAGS },
+    { "srx",       "set side right channel x spread",    OFFSET(sr_x),          AV_OPT_TYPE_FLOAT,  {.dbl=1},     0,  15, FLAGS },
+    { "bcx",       "set back center channel x spread",   OFFSET(bc_x),          AV_OPT_TYPE_FLOAT,  {.dbl=1},     0,  15, FLAGS },
+    { "fcy",       "set front center channel y spread",  OFFSET(fc_y),          AV_OPT_TYPE_FLOAT,  {.dbl=1},     0,  15, FLAGS },
+    { "fly",       "set front left channel y spread",    OFFSET(fl_y),          AV_OPT_TYPE_FLOAT,  {.dbl=1},     0,  15, FLAGS },
+    { "fry",       "set front right channel y spread",   OFFSET(fr_y),          AV_OPT_TYPE_FLOAT,  {.dbl=1},     0,  15, FLAGS },
+    { "bly",       "set back left channel y spread",     OFFSET(bl_y),          AV_OPT_TYPE_FLOAT,  {.dbl=1},     0,  15, FLAGS },
+    { "bry",       "set back right channel y spread",    OFFSET(br_y),          AV_OPT_TYPE_FLOAT,  {.dbl=1},     0,  15, FLAGS },
+    { "sly",       "set side left channel y spread",     OFFSET(sl_y),          AV_OPT_TYPE_FLOAT,  {.dbl=1},     0,  15, FLAGS },
+    { "sry",       "set side right channel y spread",    OFFSET(sr_y),          AV_OPT_TYPE_FLOAT,  {.dbl=1},     0,  15, FLAGS },
+    { "bcy",       "set back center channel y spread",   OFFSET(bc_y),          AV_OPT_TYPE_FLOAT,  {.dbl=1},     0,  15, FLAGS },
+    { "win_size", "set window size", OFFSET(win_size), AV_OPT_TYPE_INT, {.i64 = 4096}, 1024, 65536, FLAGS },
+    { "win_func", "set window function", OFFSET(win_func), AV_OPT_TYPE_INT, {.i64 = WFUNC_HANNING}, 0, NB_WFUNC-1, FLAGS, "win_func" },
+        { "rect",     "Rectangular",      0, AV_OPT_TYPE_CONST, {.i64=WFUNC_RECT},     0, 0, FLAGS, "win_func" },
+        { "bartlett", "Bartlett",         0, AV_OPT_TYPE_CONST, {.i64=WFUNC_BARTLETT}, 0, 0, FLAGS, "win_func" },
+        { "hann",     "Hann",             0, AV_OPT_TYPE_CONST, {.i64=WFUNC_HANNING},  0, 0, FLAGS, "win_func" },
+        { "hanning",  "Hanning",          0, AV_OPT_TYPE_CONST, {.i64=WFUNC_HANNING},  0, 0, FLAGS, "win_func" },
+        { "hamming",  "Hamming",          0, AV_OPT_TYPE_CONST, {.i64=WFUNC_HAMMING},  0, 0, FLAGS, "win_func" },
+        { "blackman", "Blackman",         0, AV_OPT_TYPE_CONST, {.i64=WFUNC_BLACKMAN}, 0, 0, FLAGS, "win_func" },
+        { "welch",    "Welch",            0, AV_OPT_TYPE_CONST, {.i64=WFUNC_WELCH},    0, 0, FLAGS, "win_func" },
+        { "flattop",  "Flat-top",         0, AV_OPT_TYPE_CONST, {.i64=WFUNC_FLATTOP},  0, 0, FLAGS, "win_func" },
+        { "bharris",  "Blackman-Harris",  0, AV_OPT_TYPE_CONST, {.i64=WFUNC_BHARRIS},  0, 0, FLAGS, "win_func" },
+        { "bnuttall", "Blackman-Nuttall", 0, AV_OPT_TYPE_CONST, {.i64=WFUNC_BNUTTALL}, 0, 0, FLAGS, "win_func" },
+        { "bhann",    "Bartlett-Hann",    0, AV_OPT_TYPE_CONST, {.i64=WFUNC_BHANN},    0, 0, FLAGS, "win_func" },
+        { "sine",     "Sine",             0, AV_OPT_TYPE_CONST, {.i64=WFUNC_SINE},     0, 0, FLAGS, "win_func" },
+        { "nuttall",  "Nuttall",          0, AV_OPT_TYPE_CONST, {.i64=WFUNC_NUTTALL},  0, 0, FLAGS, "win_func" },
+        { "lanczos",  "Lanczos",          0, AV_OPT_TYPE_CONST, {.i64=WFUNC_LANCZOS},  0, 0, FLAGS, "win_func" },
+        { "gauss",    "Gauss",            0, AV_OPT_TYPE_CONST, {.i64=WFUNC_GAUSS},    0, 0, FLAGS, "win_func" },
+        { "tukey",    "Tukey",            0, AV_OPT_TYPE_CONST, {.i64=WFUNC_TUKEY},    0, 0, FLAGS, "win_func" },
+        { "dolph",    "Dolph-Chebyshev",  0, AV_OPT_TYPE_CONST, {.i64=WFUNC_DOLPH},    0, 0, FLAGS, "win_func" },
+        { "cauchy",   "Cauchy",           0, AV_OPT_TYPE_CONST, {.i64=WFUNC_CAUCHY},   0, 0, FLAGS, "win_func" },
+        { "parzen",   "Parzen",           0, AV_OPT_TYPE_CONST, {.i64=WFUNC_PARZEN},   0, 0, FLAGS, "win_func" },
+        { "poisson",  "Poisson",          0, AV_OPT_TYPE_CONST, {.i64=WFUNC_POISSON},  0, 0, FLAGS, "win_func" },
+        { "bohman",   "Bohman",           0, AV_OPT_TYPE_CONST, {.i64=WFUNC_BOHMAN},   0, 0, FLAGS, "win_func" },
+    { "overlap", "set window overlap", OFFSET(overlap), AV_OPT_TYPE_FLOAT, {.dbl=0.5}, 0, 1, FLAGS },
     { NULL }
 };
 
@@ -1458,7 +1771,6 @@
     {
         .name         = "default",
         .type         = AVMEDIA_TYPE_AUDIO,
-        .filter_frame = filter_frame,
         .config_props = config_input,
     },
     { NULL }
@@ -1468,7 +1780,6 @@
     {
         .name          = "default",
         .type          = AVMEDIA_TYPE_AUDIO,
-        .request_frame = request_frame,
         .config_props  = config_output,
     },
     { NULL }
@@ -1482,6 +1793,7 @@
     .priv_class     = &surround_class,
     .init           = init,
     .uninit         = uninit,
+    .activate       = activate,
     .inputs         = inputs,
     .outputs        = outputs,
     .flags          = AVFILTER_FLAG_SLICE_THREADS,
diff --git a/libavfilter/af_tremolo.c b/libavfilter/af_tremolo.c
index 8cbc798..f55e8e2 100644
--- a/libavfilter/af_tremolo.c
+++ b/libavfilter/af_tremolo.c
@@ -28,6 +28,7 @@
     double freq;
     double depth;
     double *table;
+    int table_size;
     int index;
 } TremoloContext;
 
@@ -72,7 +73,7 @@
         dst += channels;
         src += channels;
         s->index++;
-        if (s->index >= inlink->sample_rate / s->freq)
+        if (s->index >= s->table_size)
             s->index = 0;
     }
 
@@ -125,11 +126,12 @@
     const double offset = 1. - s->depth / 2.;
     int i;
 
-    s->table = av_malloc_array(inlink->sample_rate / s->freq, sizeof(*s->table));
+    s->table_size = inlink->sample_rate / s->freq;
+    s->table = av_malloc_array(s->table_size, sizeof(*s->table));
     if (!s->table)
         return AVERROR(ENOMEM);
 
-    for (i = 0; i < inlink->sample_rate / s->freq; i++) {
+    for (i = 0; i < s->table_size; i++) {
         double env = s->freq * i / inlink->sample_rate;
         env = sin(2 * M_PI * fmod(env + 0.25, 1.0));
         s->table[i] = env * (1 - fabs(offset)) + offset;
diff --git a/libavfilter/af_volume.c b/libavfilter/af_volume.c
index b106ed8..213c571 100644
--- a/libavfilter/af_volume.c
+++ b/libavfilter/af_volume.c
@@ -62,10 +62,11 @@
 #define OFFSET(x) offsetof(VolumeContext, x)
 #define A AV_OPT_FLAG_AUDIO_PARAM
 #define F AV_OPT_FLAG_FILTERING_PARAM
+#define T AV_OPT_FLAG_RUNTIME_PARAM
 
 static const AVOption volume_options[] = {
     { "volume", "set volume adjustment expression",
-            OFFSET(volume_expr), AV_OPT_TYPE_STRING, { .str = "1.0" }, .flags = A|F },
+            OFFSET(volume_expr), AV_OPT_TYPE_STRING, { .str = "1.0" }, .flags = A|F|T },
     { "precision", "select mathematical precision",
             OFFSET(precision), AV_OPT_TYPE_INT, { .i64 = PRECISION_FLOAT }, PRECISION_FIXED, PRECISION_DOUBLE, A|F, "precision" },
         { "fixed",  "select 8-bit fixed-point",     0, AV_OPT_TYPE_CONST, { .i64 = PRECISION_FIXED  }, INT_MIN, INT_MAX, A|F, "precision" },
diff --git a/libavfilter/allfilters.c b/libavfilter/allfilters.c
index 5e72803..6354375 100644
--- a/libavfilter/allfilters.c
+++ b/libavfilter/allfilters.c
@@ -55,6 +55,8 @@
 extern AVFilter ff_af_amix;
 extern AVFilter ff_af_amultiply;
 extern AVFilter ff_af_anequalizer;
+extern AVFilter ff_af_anlmdn;
+extern AVFilter ff_af_anlms;
 extern AVFilter ff_af_anull;
 extern AVFilter ff_af_apad;
 extern AVFilter ff_af_aperms;
@@ -63,6 +65,7 @@
 extern AVFilter ff_af_arealtime;
 extern AVFilter ff_af_aresample;
 extern AVFilter ff_af_areverse;
+extern AVFilter ff_af_arnndn;
 extern AVFilter ff_af_aselect;
 extern AVFilter ff_af_asendcmd;
 extern AVFilter ff_af_asetnsamples;
@@ -71,17 +74,21 @@
 extern AVFilter ff_af_asettb;
 extern AVFilter ff_af_ashowinfo;
 extern AVFilter ff_af_asidedata;
+extern AVFilter ff_af_asoftclip;
 extern AVFilter ff_af_asplit;
+extern AVFilter ff_af_asr;
 extern AVFilter ff_af_astats;
 extern AVFilter ff_af_astreamselect;
 extern AVFilter ff_af_atempo;
 extern AVFilter ff_af_atrim;
+extern AVFilter ff_af_axcorrelate;
 extern AVFilter ff_af_azmq;
 extern AVFilter ff_af_bandpass;
 extern AVFilter ff_af_bandreject;
 extern AVFilter ff_af_bass;
 extern AVFilter ff_af_biquad;
 extern AVFilter ff_af_bs2b;
+extern AVFilter ff_vf_chromaber_vulkan;
 extern AVFilter ff_af_channelmap;
 extern AVFilter ff_af_channelsplit;
 extern AVFilter ff_af_chorus;
@@ -90,6 +97,7 @@
 extern AVFilter ff_af_crossfeed;
 extern AVFilter ff_af_crystalizer;
 extern AVFilter ff_af_dcshift;
+extern AVFilter ff_af_deesser;
 extern AVFilter ff_af_drmeter;
 extern AVFilter ff_af_dynaudnorm;
 extern AVFilter ff_af_earwax;
@@ -130,14 +138,17 @@
 extern AVFilter ff_af_volumedetect;
 
 extern AVFilter ff_asrc_aevalsrc;
+extern AVFilter ff_asrc_afirsrc;
 extern AVFilter ff_asrc_anoisesrc;
 extern AVFilter ff_asrc_anullsrc;
 extern AVFilter ff_asrc_flite;
 extern AVFilter ff_asrc_hilbert;
+extern AVFilter ff_asrc_sinc;
 extern AVFilter ff_asrc_sine;
 
 extern AVFilter ff_asink_anullsink;
 
+extern AVFilter ff_vf_addroi;
 extern AVFilter ff_vf_alphaextract;
 extern AVFilter ff_vf_alphamerge;
 extern AVFilter ff_vf_amplify;
@@ -145,8 +156,10 @@
 extern AVFilter ff_vf_atadenoise;
 extern AVFilter ff_vf_avgblur;
 extern AVFilter ff_vf_avgblur_opencl;
+extern AVFilter ff_vf_avgblur_vulkan;
 extern AVFilter ff_vf_bbox;
 extern AVFilter ff_vf_bench;
+extern AVFilter ff_vf_bilateral;
 extern AVFilter ff_vf_bitplanenoise;
 extern AVFilter ff_vf_blackdetect;
 extern AVFilter ff_vf_blackframe;
@@ -155,12 +168,17 @@
 extern AVFilter ff_vf_boxblur;
 extern AVFilter ff_vf_boxblur_opencl;
 extern AVFilter ff_vf_bwdif;
+extern AVFilter ff_vf_cas;
+extern AVFilter ff_vf_chromahold;
 extern AVFilter ff_vf_chromakey;
+extern AVFilter ff_vf_chromashift;
 extern AVFilter ff_vf_ciescope;
 extern AVFilter ff_vf_codecview;
 extern AVFilter ff_vf_colorbalance;
 extern AVFilter ff_vf_colorchannelmixer;
 extern AVFilter ff_vf_colorkey;
+extern AVFilter ff_vf_colorkey_opencl;
+extern AVFilter ff_vf_colorhold;
 extern AVFilter ff_vf_colorlevels;
 extern AVFilter ff_vf_colormatrix;
 extern AVFilter ff_vf_colorspace;
@@ -180,6 +198,7 @@
 extern AVFilter ff_vf_deblock;
 extern AVFilter ff_vf_decimate;
 extern AVFilter ff_vf_deconvolve;
+extern AVFilter ff_vf_dedot;
 extern AVFilter ff_vf_deflate;
 extern AVFilter ff_vf_deflicker;
 extern AVFilter ff_vf_deinterlace_qsv;
@@ -187,12 +206,15 @@
 extern AVFilter ff_vf_dejudder;
 extern AVFilter ff_vf_delogo;
 extern AVFilter ff_vf_denoise_vaapi;
+extern AVFilter ff_vf_derain;
 extern AVFilter ff_vf_deshake;
+extern AVFilter ff_vf_deshake_opencl;
 extern AVFilter ff_vf_despill;
 extern AVFilter ff_vf_detelecine;
 extern AVFilter ff_vf_dilation;
 extern AVFilter ff_vf_dilation_opencl;
 extern AVFilter ff_vf_displace;
+extern AVFilter ff_vf_dnn_processing;
 extern AVFilter ff_vf_doubleweave;
 extern AVFilter ff_vf_drawbox;
 extern AVFilter ff_vf_drawgraph;
@@ -220,11 +242,14 @@
 extern AVFilter ff_vf_framepack;
 extern AVFilter ff_vf_framerate;
 extern AVFilter ff_vf_framestep;
+extern AVFilter ff_vf_freezedetect;
+extern AVFilter ff_vf_freezeframes;
 extern AVFilter ff_vf_frei0r;
 extern AVFilter ff_vf_fspp;
 extern AVFilter ff_vf_gblur;
 extern AVFilter ff_vf_geq;
 extern AVFilter ff_vf_gradfun;
+extern AVFilter ff_vf_graphmonitor;
 extern AVFilter ff_vf_greyedge;
 extern AVFilter ff_vf_haldclut;
 extern AVFilter ff_vf_hflip;
@@ -245,6 +270,7 @@
 extern AVFilter ff_vf_interlace;
 extern AVFilter ff_vf_interleave;
 extern AVFilter ff_vf_kerndeint;
+extern AVFilter ff_vf_lagfun;
 extern AVFilter ff_vf_lenscorrection;
 extern AVFilter ff_vf_lensfun;
 extern AVFilter ff_vf_libvmaf;
@@ -258,8 +284,13 @@
 extern AVFilter ff_vf_lutrgb;
 extern AVFilter ff_vf_lutyuv;
 extern AVFilter ff_vf_maskedclamp;
+extern AVFilter ff_vf_maskedmax;
 extern AVFilter ff_vf_maskedmerge;
+extern AVFilter ff_vf_maskedmin;
+extern AVFilter ff_vf_maskedthreshold;
+extern AVFilter ff_vf_maskfun;
 extern AVFilter ff_vf_mcdeint;
+extern AVFilter ff_vf_median;
 extern AVFilter ff_vf_mergeplanes;
 extern AVFilter ff_vf_mestimate;
 extern AVFilter ff_vf_metadata;
@@ -269,6 +300,7 @@
 extern AVFilter ff_vf_mpdecimate;
 extern AVFilter ff_vf_negate;
 extern AVFilter ff_vf_nlmeans;
+extern AVFilter ff_vf_nlmeans_opencl;
 extern AVFilter ff_vf_nnedi;
 extern AVFilter ff_vf_noformat;
 extern AVFilter ff_vf_noise;
@@ -280,13 +312,17 @@
 extern AVFilter ff_vf_overlay;
 extern AVFilter ff_vf_overlay_opencl;
 extern AVFilter ff_vf_overlay_qsv;
+extern AVFilter ff_vf_overlay_vulkan;
+extern AVFilter ff_vf_overlay_cuda;
 extern AVFilter ff_vf_owdenoise;
 extern AVFilter ff_vf_pad;
+extern AVFilter ff_vf_pad_opencl;
 extern AVFilter ff_vf_palettegen;
 extern AVFilter ff_vf_paletteuse;
 extern AVFilter ff_vf_perms;
 extern AVFilter ff_vf_perspective;
 extern AVFilter ff_vf_phase;
+extern AVFilter ff_vf_photosensitivity;
 extern AVFilter ff_vf_pixdesctest;
 extern AVFilter ff_vf_pixscope;
 extern AVFilter ff_vf_pp;
@@ -309,6 +345,7 @@
 extern AVFilter ff_vf_removelogo;
 extern AVFilter ff_vf_repeatfields;
 extern AVFilter ff_vf_reverse;
+extern AVFilter ff_vf_rgbashift;
 extern AVFilter ff_vf_roberts;
 extern AVFilter ff_vf_roberts_opencl;
 extern AVFilter ff_vf_rotate;
@@ -318,13 +355,16 @@
 extern AVFilter ff_vf_scale_npp;
 extern AVFilter ff_vf_scale_qsv;
 extern AVFilter ff_vf_scale_vaapi;
+extern AVFilter ff_vf_scale_vulkan;
 extern AVFilter ff_vf_scale2ref;
+extern AVFilter ff_vf_scroll;
 extern AVFilter ff_vf_select;
 extern AVFilter ff_vf_selectivecolor;
 extern AVFilter ff_vf_sendcmd;
 extern AVFilter ff_vf_separatefields;
 extern AVFilter ff_vf_setdar;
 extern AVFilter ff_vf_setfield;
+extern AVFilter ff_vf_setparams;
 extern AVFilter ff_vf_setpts;
 extern AVFilter ff_vf_setrange;
 extern AVFilter ff_vf_setsar;
@@ -352,26 +392,34 @@
 extern AVFilter ff_vf_swapuv;
 extern AVFilter ff_vf_tblend;
 extern AVFilter ff_vf_telecine;
+extern AVFilter ff_vf_thistogram;
 extern AVFilter ff_vf_threshold;
 extern AVFilter ff_vf_thumbnail;
 extern AVFilter ff_vf_thumbnail_cuda;
 extern AVFilter ff_vf_tile;
 extern AVFilter ff_vf_tinterlace;
 extern AVFilter ff_vf_tlut2;
+extern AVFilter ff_vf_tmedian;
 extern AVFilter ff_vf_tmix;
 extern AVFilter ff_vf_tonemap;
 extern AVFilter ff_vf_tonemap_opencl;
+extern AVFilter ff_vf_tonemap_vaapi;
+extern AVFilter ff_vf_tpad;
 extern AVFilter ff_vf_transpose;
 extern AVFilter ff_vf_transpose_npp;
+extern AVFilter ff_vf_transpose_opencl;
+extern AVFilter ff_vf_transpose_vaapi;
 extern AVFilter ff_vf_trim;
 extern AVFilter ff_vf_unpremultiply;
 extern AVFilter ff_vf_unsharp;
 extern AVFilter ff_vf_unsharp_opencl;
 extern AVFilter ff_vf_uspp;
+extern AVFilter ff_vf_v360;
 extern AVFilter ff_vf_vaguedenoiser;
 extern AVFilter ff_vf_vectorscope;
 extern AVFilter ff_vf_vflip;
 extern AVFilter ff_vf_vfrdet;
+extern AVFilter ff_vf_vibrance;
 extern AVFilter ff_vf_vidstabdetect;
 extern AVFilter ff_vf_vidstabtransform;
 extern AVFilter ff_vf_vignette;
@@ -382,7 +430,13 @@
 extern AVFilter ff_vf_waveform;
 extern AVFilter ff_vf_weave;
 extern AVFilter ff_vf_xbr;
+extern AVFilter ff_vf_xfade;
+extern AVFilter ff_vf_xfade_opencl;
+extern AVFilter ff_vf_xmedian;
+extern AVFilter ff_vf_xstack;
 extern AVFilter ff_vf_yadif;
+extern AVFilter ff_vf_yadif_cuda;
+extern AVFilter ff_vf_yaepblur;
 extern AVFilter ff_vf_zmq;
 extern AVFilter ff_vf_zoompan;
 extern AVFilter ff_vf_zscale;
@@ -402,6 +456,7 @@
 extern AVFilter ff_vsrc_pal75bars;
 extern AVFilter ff_vsrc_pal100bars;
 extern AVFilter ff_vsrc_rgbtestsrc;
+extern AVFilter ff_vsrc_sierpinski;
 extern AVFilter ff_vsrc_smptebars;
 extern AVFilter ff_vsrc_smptehdbars;
 extern AVFilter ff_vsrc_testsrc;
@@ -413,12 +468,14 @@
 /* multimedia filters */
 extern AVFilter ff_avf_abitscope;
 extern AVFilter ff_avf_adrawgraph;
+extern AVFilter ff_avf_agraphmonitor;
 extern AVFilter ff_avf_ahistogram;
 extern AVFilter ff_avf_aphasemeter;
 extern AVFilter ff_avf_avectorscope;
 extern AVFilter ff_avf_concat;
 extern AVFilter ff_avf_showcqt;
 extern AVFilter ff_avf_showfreqs;
+extern AVFilter ff_avf_showspatial;
 extern AVFilter ff_avf_showspectrum;
 extern AVFilter ff_avf_showspectrumpic;
 extern AVFilter ff_avf_showvolume;
diff --git a/libavfilter/asink_anullsink.c b/libavfilter/asink_anullsink.c
index 9b53d3f..c10a348 100644
--- a/libavfilter/asink_anullsink.c
+++ b/libavfilter/asink_anullsink.c
@@ -40,9 +40,7 @@
 AVFilter ff_asink_anullsink = {
     .name        = "anullsink",
     .description = NULL_IF_CONFIG_SMALL("Do absolutely nothing with the input audio."),
-
-    .priv_size = 0,
-
-    .inputs    = avfilter_asink_anullsink_inputs,
-    .outputs   = NULL,
+    .priv_size   = 0,
+    .inputs      = avfilter_asink_anullsink_inputs,
+    .outputs     = NULL,
 };
diff --git a/libavfilter/asrc_afirsrc.c b/libavfilter/asrc_afirsrc.c
new file mode 100644
index 0000000..b90ffad
--- /dev/null
+++ b/libavfilter/asrc_afirsrc.c
@@ -0,0 +1,330 @@
+/*
+ * Copyright (c) 2020 Paul B Mahol
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with FFmpeg; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "libavutil/eval.h"
+#include "libavutil/opt.h"
+#include "libavutil/tx.h"
+#include "audio.h"
+#include "avfilter.h"
+#include "internal.h"
+#include "window_func.h"
+
+typedef struct AudioFIRSourceContext {
+    const AVClass *class;
+
+    char *freq_points_str;
+    char *magnitude_str;
+    char *phase_str;
+    int nb_taps;
+    int sample_rate;
+    int nb_samples;
+    int win_func;
+
+    AVComplexFloat *complexf;
+    float *freq;
+    float *magnitude;
+    float *phase;
+    int freq_size;
+    int magnitude_size;
+    int phase_size;
+    int nb_freq;
+    int nb_magnitude;
+    int nb_phase;
+
+    float *taps;
+    float *win;
+    int64_t pts;
+
+    AVTXContext *tx_ctx;
+    av_tx_fn tx_fn;
+} AudioFIRSourceContext;
+
+#define OFFSET(x) offsetof(AudioFIRSourceContext, x)
+#define FLAGS AV_OPT_FLAG_AUDIO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
+
+static const AVOption afirsrc_options[] = {
+    { "taps",      "set number of taps",   OFFSET(nb_taps),         AV_OPT_TYPE_INT,    {.i64=1025}, 9, UINT16_MAX, FLAGS },
+    { "t",         "set number of taps",   OFFSET(nb_taps),         AV_OPT_TYPE_INT,    {.i64=1025}, 9, UINT16_MAX, FLAGS },
+    { "frequency", "set frequency points", OFFSET(freq_points_str), AV_OPT_TYPE_STRING, {.str="0 1"}, 0, 0, FLAGS },
+    { "f",         "set frequency points", OFFSET(freq_points_str), AV_OPT_TYPE_STRING, {.str="0 1"}, 0, 0, FLAGS },
+    { "magnitude", "set magnitude values", OFFSET(magnitude_str),   AV_OPT_TYPE_STRING, {.str="1 1"}, 0, 0, FLAGS },
+    { "m",         "set magnitude values", OFFSET(magnitude_str),   AV_OPT_TYPE_STRING, {.str="1 1"}, 0, 0, FLAGS },
+    { "phase",     "set phase values",     OFFSET(phase_str),       AV_OPT_TYPE_STRING, {.str="0 0"}, 0, 0, FLAGS },
+    { "p",         "set phase values",     OFFSET(phase_str),       AV_OPT_TYPE_STRING, {.str="0 0"}, 0, 0, FLAGS },
+    { "sample_rate", "set sample rate",    OFFSET(sample_rate), AV_OPT_TYPE_INT, {.i64=44100},  1, INT_MAX,    FLAGS },
+    { "r",           "set sample rate",    OFFSET(sample_rate), AV_OPT_TYPE_INT, {.i64=44100},  1, INT_MAX,    FLAGS },
+    { "nb_samples", "set the number of samples per requested frame", OFFSET(nb_samples), AV_OPT_TYPE_INT, {.i64 = 1024}, 1, INT_MAX, FLAGS },
+    { "n",          "set the number of samples per requested frame", OFFSET(nb_samples), AV_OPT_TYPE_INT, {.i64 = 1024}, 1, INT_MAX, FLAGS },
+    { "win_func", "set window function", OFFSET(win_func), AV_OPT_TYPE_INT, {.i64=WFUNC_BLACKMAN}, 0, NB_WFUNC-1, FLAGS, "win_func" },
+    { "w",        "set window function", OFFSET(win_func), AV_OPT_TYPE_INT, {.i64=WFUNC_BLACKMAN}, 0, NB_WFUNC-1, FLAGS, "win_func" },
+        { "rect",     "Rectangular",      0, AV_OPT_TYPE_CONST, {.i64=WFUNC_RECT},     0, 0, FLAGS, "win_func" },
+        { "bartlett", "Bartlett",         0, AV_OPT_TYPE_CONST, {.i64=WFUNC_BARTLETT}, 0, 0, FLAGS, "win_func" },
+        { "hanning",  "Hanning",          0, AV_OPT_TYPE_CONST, {.i64=WFUNC_HANNING},  0, 0, FLAGS, "win_func" },
+        { "hamming",  "Hamming",          0, AV_OPT_TYPE_CONST, {.i64=WFUNC_HAMMING},  0, 0, FLAGS, "win_func" },
+        { "blackman", "Blackman",         0, AV_OPT_TYPE_CONST, {.i64=WFUNC_BLACKMAN}, 0, 0, FLAGS, "win_func" },
+        { "welch",    "Welch",            0, AV_OPT_TYPE_CONST, {.i64=WFUNC_WELCH},    0, 0, FLAGS, "win_func" },
+        { "flattop",  "Flat-top",         0, AV_OPT_TYPE_CONST, {.i64=WFUNC_FLATTOP},  0, 0, FLAGS, "win_func" },
+        { "bharris",  "Blackman-Harris",  0, AV_OPT_TYPE_CONST, {.i64=WFUNC_BHARRIS},  0, 0, FLAGS, "win_func" },
+        { "bnuttall", "Blackman-Nuttall", 0, AV_OPT_TYPE_CONST, {.i64=WFUNC_BNUTTALL}, 0, 0, FLAGS, "win_func" },
+        { "bhann",    "Bartlett-Hann",    0, AV_OPT_TYPE_CONST, {.i64=WFUNC_BHANN},    0, 0, FLAGS, "win_func" },
+        { "sine",     "Sine",             0, AV_OPT_TYPE_CONST, {.i64=WFUNC_SINE},     0, 0, FLAGS, "win_func" },
+        { "nuttall",  "Nuttall",          0, AV_OPT_TYPE_CONST, {.i64=WFUNC_NUTTALL},  0, 0, FLAGS, "win_func" },
+        { "lanczos",  "Lanczos",          0, AV_OPT_TYPE_CONST, {.i64=WFUNC_LANCZOS},  0, 0, FLAGS, "win_func" },
+        { "gauss",    "Gauss",            0, AV_OPT_TYPE_CONST, {.i64=WFUNC_GAUSS},    0, 0, FLAGS, "win_func" },
+        { "tukey",    "Tukey",            0, AV_OPT_TYPE_CONST, {.i64=WFUNC_TUKEY},    0, 0, FLAGS, "win_func" },
+        { "dolph",    "Dolph-Chebyshev",  0, AV_OPT_TYPE_CONST, {.i64=WFUNC_DOLPH},    0, 0, FLAGS, "win_func" },
+        { "cauchy",   "Cauchy",           0, AV_OPT_TYPE_CONST, {.i64=WFUNC_CAUCHY},   0, 0, FLAGS, "win_func" },
+        { "parzen",   "Parzen",           0, AV_OPT_TYPE_CONST, {.i64=WFUNC_PARZEN},   0, 0, FLAGS, "win_func" },
+        { "poisson",  "Poisson",          0, AV_OPT_TYPE_CONST, {.i64=WFUNC_POISSON},  0, 0, FLAGS, "win_func" },
+        { "bohman" ,  "Bohman",           0, AV_OPT_TYPE_CONST, {.i64=WFUNC_BOHMAN},   0, 0, FLAGS, "win_func" },
+    {NULL}
+};
+
+AVFILTER_DEFINE_CLASS(afirsrc);
+
+static av_cold int init(AVFilterContext *ctx)
+{
+    AudioFIRSourceContext *s = ctx->priv;
+
+    if (!(s->nb_taps & 1)) {
+        av_log(s, AV_LOG_WARNING, "Number of taps %d must be odd length.\n", s->nb_taps);
+        s->nb_taps |= 1;
+    }
+
+    return 0;
+}
+
+static av_cold void uninit(AVFilterContext *ctx)
+{
+    AudioFIRSourceContext *s = ctx->priv;
+
+    av_freep(&s->win);
+    av_freep(&s->taps);
+    av_freep(&s->freq);
+    av_freep(&s->magnitude);
+    av_freep(&s->phase);
+    av_freep(&s->complexf);
+    av_tx_uninit(&s->tx_ctx);
+}
+
+static av_cold int query_formats(AVFilterContext *ctx)
+{
+    AudioFIRSourceContext *s = ctx->priv;
+    static const int64_t chlayouts[] = { AV_CH_LAYOUT_MONO, -1 };
+    int sample_rates[] = { s->sample_rate, -1 };
+    static const enum AVSampleFormat sample_fmts[] = {
+        AV_SAMPLE_FMT_FLT,
+        AV_SAMPLE_FMT_NONE
+    };
+
+    AVFilterFormats *formats;
+    AVFilterChannelLayouts *layouts;
+    int ret;
+
+    formats = ff_make_format_list(sample_fmts);
+    if (!formats)
+        return AVERROR(ENOMEM);
+    ret = ff_set_common_formats (ctx, formats);
+    if (ret < 0)
+        return ret;
+
+    layouts = avfilter_make_format64_list(chlayouts);
+    if (!layouts)
+        return AVERROR(ENOMEM);
+    ret = ff_set_common_channel_layouts(ctx, layouts);
+    if (ret < 0)
+        return ret;
+
+    formats = ff_make_format_list(sample_rates);
+    if (!formats)
+        return AVERROR(ENOMEM);
+    return ff_set_common_samplerates(ctx, formats);
+}
+
+static int parse_string(char *str, float **items, int *nb_items, int *items_size)
+{
+    float *new_items;
+    char *tail;
+
+    new_items = av_fast_realloc(NULL, items_size, 1 * sizeof(float));
+    if (!new_items)
+        return AVERROR(ENOMEM);
+    *items = new_items;
+
+    tail = str;
+    if (!tail)
+        return AVERROR(EINVAL);
+
+    do {
+        (*items)[(*nb_items)++] = av_strtod(tail, &tail);
+        new_items = av_fast_realloc(*items, items_size, (*nb_items + 1) * sizeof(float));
+        if (!new_items)
+            return AVERROR(ENOMEM);
+        *items = new_items;
+        if (tail && *tail)
+            tail++;
+    } while (tail && *tail);
+
+    return 0;
+}
+
+static void lininterp(AVComplexFloat *complexf,
+                      const float *freq,
+                      const float *magnitude,
+                      const float *phase,
+                      int m, int minterp)
+{
+    for (int i = 0; i < minterp; i++) {
+        for (int j = 1; j < m; j++) {
+            const float x = i / (float)minterp;
+
+            if (x <= freq[j]) {
+                const float mg = (x - freq[j-1]) / (freq[j] - freq[j-1]) * (magnitude[j] - magnitude[j-1]) + magnitude[j-1];
+                const float ph = (x - freq[j-1]) / (freq[j] - freq[j-1]) * (phase[j] - phase[j-1]) + phase[j-1];
+
+                complexf[i].re = mg * cosf(ph);
+                complexf[i].im = mg * sinf(ph);
+                break;
+            }
+        }
+    }
+}
+
+static av_cold int config_output(AVFilterLink *outlink)
+{
+    AVFilterContext *ctx = outlink->src;
+    AudioFIRSourceContext *s = ctx->priv;
+    float overlap, scale = 1.f, compensation;
+    int fft_size, middle, ret;
+
+    s->nb_freq = s->nb_magnitude = s->nb_phase = 0;
+
+    ret = parse_string(s->freq_points_str, &s->freq, &s->nb_freq, &s->freq_size);
+    if (ret < 0)
+        return ret;
+
+    ret = parse_string(s->magnitude_str, &s->magnitude, &s->nb_magnitude, &s->magnitude_size);
+    if (ret < 0)
+        return ret;
+
+    ret = parse_string(s->phase_str, &s->phase, &s->nb_phase, &s->phase_size);
+    if (ret < 0)
+        return ret;
+
+    if (s->nb_freq != s->nb_magnitude && s->nb_freq != s->nb_phase && s->nb_freq >= 2) {
+        av_log(ctx, AV_LOG_ERROR, "Number of frequencies, magnitudes and phases must be same and >= 2.\n");
+        return AVERROR(EINVAL);
+    }
+
+    for (int i = 0; i < s->nb_freq; i++) {
+        if (i == 0 && s->freq[i] != 0.f) {
+            av_log(ctx, AV_LOG_ERROR, "First frequency must be 0.\n");
+            return AVERROR(EINVAL);
+        }
+
+        if (i == s->nb_freq - 1 && s->freq[i] != 1.f) {
+            av_log(ctx, AV_LOG_ERROR, "Last frequency must be 1.\n");
+            return AVERROR(EINVAL);
+        }
+
+        if (i && s->freq[i] < s->freq[i-1]) {
+            av_log(ctx, AV_LOG_ERROR, "Frequencies must be in increasing order.\n");
+            return AVERROR(EINVAL);
+        }
+    }
+
+    fft_size = 1 << (av_log2(s->nb_taps) + 1);
+    s->complexf = av_calloc(fft_size * 2, sizeof(*s->complexf));
+    if (!s->complexf)
+        return AVERROR(ENOMEM);
+
+    ret = av_tx_init(&s->tx_ctx, &s->tx_fn, AV_TX_FLOAT_FFT, 1, fft_size, &scale, 0);
+    if (ret < 0)
+        return ret;
+
+    s->taps = av_calloc(s->nb_taps, sizeof(*s->taps));
+    if (!s->taps)
+        return AVERROR(ENOMEM);
+
+    s->win = av_calloc(s->nb_taps, sizeof(*s->win));
+    if (!s->win)
+        return AVERROR(ENOMEM);
+
+    generate_window_func(s->win, s->nb_taps, s->win_func, &overlap);
+
+    lininterp(s->complexf, s->freq, s->magnitude, s->phase, s->nb_freq, fft_size / 2);
+
+    s->tx_fn(s->tx_ctx, s->complexf + fft_size, s->complexf, sizeof(float));
+
+    compensation = 2.f / fft_size;
+    middle = s->nb_taps / 2;
+
+    for (int i = 0; i <= middle; i++) {
+        s->taps[         i] = s->complexf[fft_size + middle - i].re * compensation * s->win[i];
+        s->taps[middle + i] = s->complexf[fft_size          + i].re * compensation * s->win[middle + i];
+    }
+
+    s->pts = 0;
+
+    return 0;
+}
+
+static int request_frame(AVFilterLink *outlink)
+{
+    AVFilterContext *ctx = outlink->src;
+    AudioFIRSourceContext *s = ctx->priv;
+    AVFrame *frame;
+    int nb_samples;
+
+    nb_samples = FFMIN(s->nb_samples, s->nb_taps - s->pts);
+    if (!nb_samples)
+        return AVERROR_EOF;
+
+    if (!(frame = ff_get_audio_buffer(outlink, nb_samples)))
+        return AVERROR(ENOMEM);
+
+    memcpy(frame->data[0], s->taps + s->pts, nb_samples * sizeof(float));
+
+    frame->pts = s->pts;
+    s->pts    += nb_samples;
+    return ff_filter_frame(outlink, frame);
+}
+
+static const AVFilterPad afirsrc_outputs[] = {
+    {
+        .name          = "default",
+        .type          = AVMEDIA_TYPE_AUDIO,
+        .request_frame = request_frame,
+        .config_props  = config_output,
+    },
+    { NULL }
+};
+
+AVFilter ff_asrc_afirsrc = {
+    .name          = "afirsrc",
+    .description   = NULL_IF_CONFIG_SMALL("Generate a FIR coefficients audio stream."),
+    .query_formats = query_formats,
+    .init          = init,
+    .uninit        = uninit,
+    .priv_size     = sizeof(AudioFIRSourceContext),
+    .inputs        = NULL,
+    .outputs       = afirsrc_outputs,
+    .priv_class    = &afirsrc_class,
+};
diff --git a/libavfilter/asrc_anoisesrc.c b/libavfilter/asrc_anoisesrc.c
index 78f0af4..ebcc446 100644
--- a/libavfilter/asrc_anoisesrc.c
+++ b/libavfilter/asrc_anoisesrc.c
@@ -30,13 +30,13 @@
     int sample_rate;
     double amplitude;
     int64_t duration;
-    int64_t color;
+    int color;
     int64_t seed;
     int nb_samples;
 
     int64_t pts;
     int infinite;
-    double (*filter)(double white, double *buf);
+    double (*filter)(double white, double *buf, double half_amplitude);
     double buf[7];
     AVLFG c;
 } ANoiseSrcContext;
@@ -47,6 +47,7 @@
     NM_BROWN,
     NM_BLUE,
     NM_VIOLET,
+    NM_VELVET,
     NM_NB
 };
 
@@ -68,6 +69,7 @@
     {     "brown",    0,                  0,                    AV_OPT_TYPE_CONST,     {.i64 = NM_BROWN},   0,  0,          FLAGS, "color" },
     {     "blue",     0,                  0,                    AV_OPT_TYPE_CONST,     {.i64 = NM_BLUE},    0,  0,          FLAGS, "color" },
     {     "violet",   0,                  0,                    AV_OPT_TYPE_CONST,     {.i64 = NM_VIOLET},  0,  0,          FLAGS, "color" },
+    {     "velvet",   0,                  0,                    AV_OPT_TYPE_CONST,     {.i64 = NM_VELVET},  0,  0,          FLAGS, "color" },
     { "seed",         "set random seed",  OFFSET(seed),         AV_OPT_TYPE_INT64,     {.i64 = -1},        -1,  UINT_MAX,   FLAGS },
     { "s",            "set random seed",  OFFSET(seed),         AV_OPT_TYPE_INT64,     {.i64 = -1},        -1,  UINT_MAX,   FLAGS },
     { "nb_samples",   "set the number of samples per requested frame", OFFSET(nb_samples), AV_OPT_TYPE_INT, {.i64 = 1024}, 1, INT_MAX, FLAGS },
@@ -111,12 +113,12 @@
     return ff_set_common_samplerates(ctx, formats);
 }
 
-static double white_filter(double white, double *buf)
+static double white_filter(double white, double *buf, double ha)
 {
     return white;
 }
 
-static double pink_filter(double white, double *buf)
+static double pink_filter(double white, double *buf, double ha)
 {
     double pink;
 
@@ -132,7 +134,7 @@
     return pink * 0.11;
 }
 
-static double blue_filter(double white, double *buf)
+static double blue_filter(double white, double *buf, double ha)
 {
     double blue;
 
@@ -148,7 +150,7 @@
     return blue * 0.11;
 }
 
-static double brown_filter(double white, double *buf)
+static double brown_filter(double white, double *buf, double ha)
 {
     double brown;
 
@@ -157,7 +159,7 @@
     return brown * 3.5;
 }
 
-static double violet_filter(double white, double *buf)
+static double violet_filter(double white, double *buf, double ha)
 {
     double violet;
 
@@ -166,6 +168,11 @@
     return violet * 3.5;
 }
 
+static double velvet_filter(double white, double *buf, double ha)
+{
+    return 2. * ha * ((white > ha) - (white < -ha));
+}
+
 static av_cold int config_props(AVFilterLink *outlink)
 {
     AVFilterContext *ctx = outlink->src;
@@ -185,6 +192,7 @@
     case NM_BROWN:  s->filter = brown_filter;  break;
     case NM_BLUE:   s->filter = blue_filter;   break;
     case NM_VIOLET: s->filter = violet_filter; break;
+    case NM_VELVET: s->filter = velvet_filter; break;
     }
 
     return 0;
@@ -213,7 +221,7 @@
     for (i = 0; i < nb_samples; i++) {
         double white;
         white = s->amplitude * ((2 * ((double) av_lfg_get(&s->c) / 0xffffffff)) - 1);
-        dst[i] = s->filter(white, s->buf);
+        dst[i] = s->filter(white, s->buf, s->amplitude * 0.5);
     }
 
     if (!s->infinite)
diff --git a/libavfilter/asrc_anullsrc.c b/libavfilter/asrc_anullsrc.c
index cb67694..52db616 100644
--- a/libavfilter/asrc_anullsrc.c
+++ b/libavfilter/asrc_anullsrc.c
@@ -114,11 +114,8 @@
         return AVERROR(ENOMEM);
 
     samplesref->pts = null->pts;
-    samplesref->channel_layout = null->channel_layout;
-    samplesref->sample_rate = outlink->sample_rate;
 
-    ret = ff_filter_frame(outlink, av_frame_clone(samplesref));
-    av_frame_free(&samplesref);
+    ret = ff_filter_frame(outlink, samplesref);
     if (ret < 0)
         return ret;
 
diff --git a/libavfilter/asrc_flite.c b/libavfilter/asrc_flite.c
index c9619eb..3e543a3 100644
--- a/libavfilter/asrc_flite.c
+++ b/libavfilter/asrc_flite.c
@@ -54,10 +54,10 @@
     { "list_voices", "list voices and exit",              OFFSET(list_voices), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS },
     { "nb_samples",  "set number of samples per frame",   OFFSET(frame_nb_samples), AV_OPT_TYPE_INT, {.i64=512}, 0, INT_MAX, FLAGS },
     { "n",           "set number of samples per frame",   OFFSET(frame_nb_samples), AV_OPT_TYPE_INT, {.i64=512}, 0, INT_MAX, FLAGS },
-    { "text",        "set text to speak",                 OFFSET(text),      AV_OPT_TYPE_STRING, {.str=NULL}, CHAR_MIN, CHAR_MAX, FLAGS },
-    { "textfile",    "set filename of the text to speak", OFFSET(textfile),  AV_OPT_TYPE_STRING, {.str=NULL}, CHAR_MIN, CHAR_MAX, FLAGS },
-    { "v",           "set voice",                         OFFSET(voice_str), AV_OPT_TYPE_STRING, {.str="kal"}, CHAR_MIN, CHAR_MAX, FLAGS },
-    { "voice",       "set voice",                         OFFSET(voice_str), AV_OPT_TYPE_STRING, {.str="kal"}, CHAR_MIN, CHAR_MAX, FLAGS },
+    { "text",        "set text to speak",                 OFFSET(text),      AV_OPT_TYPE_STRING, {.str=NULL}, 0, 0, FLAGS },
+    { "textfile",    "set filename of the text to speak", OFFSET(textfile),  AV_OPT_TYPE_STRING, {.str=NULL}, 0, 0, FLAGS },
+    { "v",           "set voice",                         OFFSET(voice_str), AV_OPT_TYPE_STRING, {.str="kal"}, 0, 0, FLAGS },
+    { "voice",       "set voice",                         OFFSET(voice_str), AV_OPT_TYPE_STRING, {.str="kal"}, 0, 0, FLAGS },
     { NULL }
 };
 
diff --git a/libavfilter/asrc_hilbert.c b/libavfilter/asrc_hilbert.c
index a3a3952..a51c676 100644
--- a/libavfilter/asrc_hilbert.c
+++ b/libavfilter/asrc_hilbert.c
@@ -67,6 +67,7 @@
         { "cauchy",   "Cauchy",           0, AV_OPT_TYPE_CONST, {.i64=WFUNC_CAUCHY},   0, 0, FLAGS, "win_func" },
         { "parzen",   "Parzen",           0, AV_OPT_TYPE_CONST, {.i64=WFUNC_PARZEN},   0, 0, FLAGS, "win_func" },
         { "poisson",  "Poisson",          0, AV_OPT_TYPE_CONST, {.i64=WFUNC_POISSON},  0, 0, FLAGS, "win_func" },
+        { "bohman" ,  "Bohman",           0, AV_OPT_TYPE_CONST, {.i64=WFUNC_BOHMAN},   0, 0, FLAGS, "win_func" },
     {NULL}
 };
 
diff --git a/libavfilter/asrc_sinc.c b/libavfilter/asrc_sinc.c
new file mode 100644
index 0000000..24aeab6
--- /dev/null
+++ b/libavfilter/asrc_sinc.c
@@ -0,0 +1,456 @@
+/*
+ * Copyright (c) 2008-2009 Rob Sykes <robs@users.sourceforge.net>
+ * Copyright (c) 2017 Paul B Mahol
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "libavutil/avassert.h"
+#include "libavutil/opt.h"
+
+#include "libavcodec/avfft.h"
+
+#include "audio.h"
+#include "avfilter.h"
+#include "internal.h"
+
+typedef struct SincContext {
+    const AVClass *class;
+
+    int sample_rate, nb_samples;
+    float att, beta, phase, Fc0, Fc1, tbw0, tbw1;
+    int num_taps[2];
+    int round;
+
+    int n, rdft_len;
+    float *coeffs;
+    int64_t pts;
+
+    RDFTContext *rdft, *irdft;
+} SincContext;
+
+static int request_frame(AVFilterLink *outlink)
+{
+    AVFilterContext *ctx = outlink->src;
+    SincContext *s = ctx->priv;
+    const float *coeffs = s->coeffs;
+    AVFrame *frame = NULL;
+    int nb_samples;
+
+    nb_samples = FFMIN(s->nb_samples, s->n - s->pts);
+    if (nb_samples <= 0)
+        return AVERROR_EOF;
+
+    if (!(frame = ff_get_audio_buffer(outlink, nb_samples)))
+        return AVERROR(ENOMEM);
+
+    memcpy(frame->data[0], coeffs + s->pts, nb_samples * sizeof(float));
+
+    frame->pts = s->pts;
+    s->pts    += nb_samples;
+
+    return ff_filter_frame(outlink, frame);
+}
+
+static int query_formats(AVFilterContext *ctx)
+{
+    SincContext *s = ctx->priv;
+    static const int64_t chlayouts[] = { AV_CH_LAYOUT_MONO, -1 };
+    int sample_rates[] = { s->sample_rate, -1 };
+    static const enum AVSampleFormat sample_fmts[] = { AV_SAMPLE_FMT_FLT,
+                                                       AV_SAMPLE_FMT_NONE };
+    AVFilterFormats *formats;
+    AVFilterChannelLayouts *layouts;
+    int ret;
+
+    formats = ff_make_format_list(sample_fmts);
+    if (!formats)
+        return AVERROR(ENOMEM);
+    ret = ff_set_common_formats (ctx, formats);
+    if (ret < 0)
+        return ret;
+
+    layouts = avfilter_make_format64_list(chlayouts);
+    if (!layouts)
+        return AVERROR(ENOMEM);
+    ret = ff_set_common_channel_layouts(ctx, layouts);
+    if (ret < 0)
+        return ret;
+
+    formats = ff_make_format_list(sample_rates);
+    if (!formats)
+        return AVERROR(ENOMEM);
+    return ff_set_common_samplerates(ctx, formats);
+}
+
+static float bessel_I_0(float x)
+{
+    float term = 1, sum = 1, last_sum, x2 = x / 2;
+    int i = 1;
+
+    do {
+        float y = x2 / i++;
+
+        last_sum = sum;
+        sum += term *= y * y;
+    } while (sum != last_sum);
+
+    return sum;
+}
+
+static float *make_lpf(int num_taps, float Fc, float beta, float rho,
+                       float scale, int dc_norm)
+{
+    int i, m = num_taps - 1;
+    float *h = av_calloc(num_taps, sizeof(*h)), sum = 0;
+    float mult = scale / bessel_I_0(beta), mult1 = 1.f / (.5f * m + rho);
+
+    av_assert0(Fc >= 0 && Fc <= 1);
+
+    for (i = 0; i <= m / 2; i++) {
+        float z = i - .5f * m, x = z * M_PI, y = z * mult1;
+        h[i] = x ? sinf(Fc * x) / x : Fc;
+        sum += h[i] *= bessel_I_0(beta * sqrtf(1.f - y * y)) * mult;
+        if (m - i != i) {
+            h[m - i] = h[i];
+            sum += h[i];
+        }
+    }
+
+    for (i = 0; dc_norm && i < num_taps; i++)
+        h[i] *= scale / sum;
+
+    return h;
+}
+
+static float kaiser_beta(float att, float tr_bw)
+{
+    if (att >= 60.f) {
+        static const float coefs[][4] = {
+            {-6.784957e-10, 1.02856e-05, 0.1087556, -0.8988365 + .001},
+            {-6.897885e-10, 1.027433e-05, 0.10876, -0.8994658 + .002},
+            {-1.000683e-09, 1.030092e-05, 0.1087677, -0.9007898 + .003},
+            {-3.654474e-10, 1.040631e-05, 0.1087085, -0.8977766 + .006},
+            {8.106988e-09, 6.983091e-06, 0.1091387, -0.9172048 + .015},
+            {9.519571e-09, 7.272678e-06, 0.1090068, -0.9140768 + .025},
+            {-5.626821e-09, 1.342186e-05, 0.1083999, -0.9065452 + .05},
+            {-9.965946e-08, 5.073548e-05, 0.1040967, -0.7672778 + .085},
+            {1.604808e-07, -5.856462e-05, 0.1185998, -1.34824 + .1},
+            {-1.511964e-07, 6.363034e-05, 0.1064627, -0.9876665 + .18},
+        };
+        float realm = logf(tr_bw / .0005f) / logf(2.f);
+        float const *c0 = coefs[av_clip((int)realm, 0, FF_ARRAY_ELEMS(coefs) - 1)];
+        float const *c1 = coefs[av_clip(1 + (int)realm, 0, FF_ARRAY_ELEMS(coefs) - 1)];
+        float b0 = ((c0[0] * att + c0[1]) * att + c0[2]) * att + c0[3];
+        float b1 = ((c1[0] * att + c1[1]) * att + c1[2]) * att + c1[3];
+
+        return b0 + (b1 - b0) * (realm - (int)realm);
+    }
+    if (att > 50.f)
+        return .1102f * (att - 8.7f);
+    if (att > 20.96f)
+        return .58417f * powf(att - 20.96f, .4f) + .07886f * (att - 20.96f);
+    return 0;
+}
+
+static void kaiser_params(float att, float Fc, float tr_bw, float *beta, int *num_taps)
+{
+    *beta = *beta < 0.f ? kaiser_beta(att, tr_bw * .5f / Fc): *beta;
+    att = att < 60.f ? (att - 7.95f) / (2.285f * M_PI * 2.f) :
+        ((.0007528358f-1.577737e-05 * *beta) * *beta + 0.6248022f) * *beta + .06186902f;
+    *num_taps = !*num_taps ? ceilf(att/tr_bw + 1) : *num_taps;
+}
+
+static float *lpf(float Fn, float Fc, float tbw, int *num_taps, float att, float *beta, int round)
+{
+    int n = *num_taps;
+
+    if ((Fc /= Fn) <= 0.f || Fc >= 1.f) {
+        *num_taps = 0;
+        return NULL;
+    }
+
+    att = att ? att : 120.f;
+
+    kaiser_params(att, Fc, (tbw ? tbw / Fn : .05f) * .5f, beta, num_taps);
+
+    if (!n) {
+        n = *num_taps;
+        *num_taps = av_clip(n, 11, 32767);
+        if (round)
+            *num_taps = 1 + 2 * (int)((int)((*num_taps / 2) * Fc + .5f) / Fc + .5f);
+    }
+
+    return make_lpf(*num_taps |= 1, Fc, *beta, 0.f, 1.f, 0);
+}
+
+static void invert(float *h, int n)
+{
+    for (int i = 0; i < n; i++)
+        h[i] = -h[i];
+
+    h[(n - 1) / 2] += 1;
+}
+
+#define PACK(h, n)   h[1] = h[n]
+#define UNPACK(h, n) h[n] = h[1], h[n + 1] = h[1] = 0;
+#define SQR(a) ((a) * (a))
+
+static float safe_log(float x)
+{
+    av_assert0(x >= 0);
+    if (x)
+        return logf(x);
+    return -26;
+}
+
+static int fir_to_phase(SincContext *s, float **h, int *len, int *post_len, float phase)
+{
+    float *pi_wraps, *work, phase1 = (phase > 50.f ? 100.f - phase : phase) / 50.f;
+    int i, work_len, begin, end, imp_peak = 0, peak = 0;
+    float imp_sum = 0, peak_imp_sum = 0;
+    float prev_angle2 = 0, cum_2pi = 0, prev_angle1 = 0, cum_1pi = 0;
+
+    for (i = *len, work_len = 2 * 2 * 8; i > 1; work_len <<= 1, i >>= 1);
+
+    /* The first part is for work (+2 for (UN)PACK), the latter for pi_wraps. */
+    work = av_calloc((work_len + 2) + (work_len / 2 + 1), sizeof(float));
+    if (!work)
+        return AVERROR(ENOMEM);
+    pi_wraps = &work[work_len + 2];
+
+    memcpy(work, *h, *len * sizeof(*work));
+
+    av_rdft_end(s->rdft);
+    av_rdft_end(s->irdft);
+    s->rdft = s->irdft = NULL;
+    s->rdft  = av_rdft_init(av_log2(work_len), DFT_R2C);
+    s->irdft = av_rdft_init(av_log2(work_len), IDFT_C2R);
+    if (!s->rdft || !s->irdft) {
+        av_free(work);
+        return AVERROR(ENOMEM);
+    }
+
+    av_rdft_calc(s->rdft, work);   /* Cepstral: */
+    UNPACK(work, work_len);
+
+    for (i = 0; i <= work_len; i += 2) {
+        float angle = atan2f(work[i + 1], work[i]);
+        float detect = 2 * M_PI;
+        float delta = angle - prev_angle2;
+        float adjust = detect * ((delta < -detect * .7f) - (delta > detect * .7f));
+
+        prev_angle2 = angle;
+        cum_2pi += adjust;
+        angle += cum_2pi;
+        detect = M_PI;
+        delta = angle - prev_angle1;
+        adjust = detect * ((delta < -detect * .7f) - (delta > detect * .7f));
+        prev_angle1 = angle;
+        cum_1pi += fabsf(adjust);        /* fabs for when 2pi and 1pi have combined */
+        pi_wraps[i >> 1] = cum_1pi;
+
+        work[i] = safe_log(sqrtf(SQR(work[i]) + SQR(work[i + 1])));
+        work[i + 1] = 0;
+    }
+
+    PACK(work, work_len);
+    av_rdft_calc(s->irdft, work);
+
+    for (i = 0; i < work_len; i++)
+        work[i] *= 2.f / work_len;
+
+    for (i = 1; i < work_len / 2; i++) {        /* Window to reject acausal components */
+        work[i] *= 2;
+        work[i + work_len / 2] = 0;
+    }
+    av_rdft_calc(s->rdft, work);
+
+    for (i = 2; i < work_len; i += 2)   /* Interpolate between linear & min phase */
+        work[i + 1] = phase1 * i / work_len * pi_wraps[work_len >> 1] + (1 - phase1) * (work[i + 1] + pi_wraps[i >> 1]) - pi_wraps[i >> 1];
+
+    work[0] = exp(work[0]);
+    work[1] = exp(work[1]);
+    for (i = 2; i < work_len; i += 2) {
+        float x = expf(work[i]);
+
+        work[i    ] = x * cosf(work[i + 1]);
+        work[i + 1] = x * sinf(work[i + 1]);
+    }
+
+    av_rdft_calc(s->irdft, work);
+    for (i = 0; i < work_len; i++)
+        work[i] *= 2.f / work_len;
+
+    /* Find peak pos. */
+    for (i = 0; i <= (int) (pi_wraps[work_len >> 1] / M_PI + .5f); i++) {
+        imp_sum += work[i];
+        if (fabs(imp_sum) > fabs(peak_imp_sum)) {
+            peak_imp_sum = imp_sum;
+            peak = i;
+        }
+        if (work[i] > work[imp_peak])   /* For debug check only */
+            imp_peak = i;
+    }
+
+    while (peak && fabsf(work[peak - 1]) > fabsf(work[peak]) && (work[peak - 1] * work[peak] > 0)) {
+        peak--;
+    }
+
+    if (!phase1) {
+        begin = 0;
+    } else if (phase1 == 1) {
+        begin = peak - *len / 2;
+    } else {
+        begin = (.997f - (2 - phase1) * .22f) * *len + .5f;
+        end = (.997f + (0 - phase1) * .22f) * *len + .5f;
+        begin = peak - (begin & ~3);
+        end = peak + 1 + ((end + 3) & ~3);
+        *len = end - begin;
+        *h = av_realloc_f(*h, *len, sizeof(**h));
+        if (!*h) {
+            av_free(work);
+            return AVERROR(ENOMEM);
+        }
+    }
+
+    for (i = 0; i < *len; i++) {
+        (*h)[i] = work[(begin + (phase > 50.f ? *len - 1 - i : i) + work_len) & (work_len - 1)];
+    }
+    *post_len = phase > 50 ? peak - begin : begin + *len - (peak + 1);
+
+    av_log(s, AV_LOG_DEBUG, "%d nPI=%g peak-sum@%i=%g (val@%i=%g); len=%i post=%i (%g%%)\n",
+           work_len, pi_wraps[work_len >> 1] / M_PI, peak, peak_imp_sum, imp_peak,
+           work[imp_peak], *len, *post_len, 100.f - 100.f * *post_len / (*len - 1));
+
+    av_free(work);
+
+    return 0;
+}
+
+static int config_output(AVFilterLink *outlink)
+{
+    AVFilterContext *ctx = outlink->src;
+    SincContext *s = ctx->priv;
+    float Fn = s->sample_rate * .5f;
+    float *h[2];
+    int i, n, post_peak, longer;
+
+    outlink->sample_rate = s->sample_rate;
+    s->pts = 0;
+
+    if (s->Fc0 >= Fn || s->Fc1 >= Fn) {
+        av_log(ctx, AV_LOG_ERROR,
+               "filter frequency must be less than %d/2.\n", s->sample_rate);
+        return AVERROR(EINVAL);
+    }
+
+    h[0] = lpf(Fn, s->Fc0, s->tbw0, &s->num_taps[0], s->att, &s->beta, s->round);
+    h[1] = lpf(Fn, s->Fc1, s->tbw1, &s->num_taps[1], s->att, &s->beta, s->round);
+
+    if (h[0])
+        invert(h[0], s->num_taps[0]);
+
+    longer = s->num_taps[1] > s->num_taps[0];
+    n = s->num_taps[longer];
+
+    if (h[0] && h[1]) {
+        for (i = 0; i < s->num_taps[!longer]; i++)
+            h[longer][i + (n - s->num_taps[!longer]) / 2] += h[!longer][i];
+
+        if (s->Fc0 < s->Fc1)
+            invert(h[longer], n);
+
+        av_free(h[!longer]);
+    }
+
+    if (s->phase != 50.f) {
+        int ret = fir_to_phase(s, &h[longer], &n, &post_peak, s->phase);
+        if (ret < 0)
+            return ret;
+    } else {
+        post_peak = n >> 1;
+    }
+
+    s->n = 1 << (av_log2(n) + 1);
+    s->rdft_len = 1 << av_log2(n);
+    s->coeffs = av_calloc(s->n, sizeof(*s->coeffs));
+    if (!s->coeffs)
+        return AVERROR(ENOMEM);
+
+    for (i = 0; i < n; i++)
+        s->coeffs[i] = h[longer][i];
+    av_free(h[longer]);
+
+    av_rdft_end(s->rdft);
+    av_rdft_end(s->irdft);
+    s->rdft = s->irdft = NULL;
+
+    return 0;
+}
+
+static av_cold void uninit(AVFilterContext *ctx)
+{
+    SincContext *s = ctx->priv;
+
+    av_freep(&s->coeffs);
+    av_rdft_end(s->rdft);
+    av_rdft_end(s->irdft);
+    s->rdft = s->irdft = NULL;
+}
+
+static const AVFilterPad sinc_outputs[] = {
+    {
+        .name          = "default",
+        .type          = AVMEDIA_TYPE_AUDIO,
+        .config_props  = config_output,
+        .request_frame = request_frame,
+    },
+    { NULL }
+};
+
+#define AF AV_OPT_FLAG_AUDIO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
+#define OFFSET(x) offsetof(SincContext, x)
+
+static const AVOption sinc_options[] = {
+    { "sample_rate", "set sample rate",                               OFFSET(sample_rate), AV_OPT_TYPE_INT,   {.i64=44100},  1, INT_MAX, AF },
+    { "r",           "set sample rate",                               OFFSET(sample_rate), AV_OPT_TYPE_INT,   {.i64=44100},  1, INT_MAX, AF },
+    { "nb_samples",  "set the number of samples per requested frame", OFFSET(nb_samples),  AV_OPT_TYPE_INT,   {.i64=1024},   1, INT_MAX, AF },
+    { "n",           "set the number of samples per requested frame", OFFSET(nb_samples),  AV_OPT_TYPE_INT,   {.i64=1024},   1, INT_MAX, AF },
+    { "hp",          "set high-pass filter frequency",                OFFSET(Fc0),         AV_OPT_TYPE_FLOAT, {.dbl=0},      0, INT_MAX, AF },
+    { "lp",          "set low-pass filter frequency",                 OFFSET(Fc1),         AV_OPT_TYPE_FLOAT, {.dbl=0},      0, INT_MAX, AF },
+    { "phase",       "set filter phase response",                     OFFSET(phase),       AV_OPT_TYPE_FLOAT, {.dbl=50},     0,     100, AF },
+    { "beta",        "set kaiser window beta",                        OFFSET(beta),        AV_OPT_TYPE_FLOAT, {.dbl=-1},    -1,     256, AF },
+    { "att",         "set stop-band attenuation",                     OFFSET(att),         AV_OPT_TYPE_FLOAT, {.dbl=120},   40,     180, AF },
+    { "round",       "enable rounding",                               OFFSET(round),       AV_OPT_TYPE_BOOL,  {.i64=0},      0,       1, AF },
+    { "hptaps",      "set number of taps for high-pass filter",       OFFSET(num_taps[0]), AV_OPT_TYPE_INT,   {.i64=0},      0,   32768, AF },
+    { "lptaps",      "set number of taps for low-pass filter",        OFFSET(num_taps[1]), AV_OPT_TYPE_INT,   {.i64=0},      0,   32768, AF },
+    { NULL }
+};
+
+AVFILTER_DEFINE_CLASS(sinc);
+
+AVFilter ff_asrc_sinc = {
+    .name          = "sinc",
+    .description   = NULL_IF_CONFIG_SMALL("Generate a sinc kaiser-windowed low-pass, high-pass, band-pass, or band-reject FIR coefficients."),
+    .priv_size     = sizeof(SincContext),
+    .priv_class    = &sinc_class,
+    .query_formats = query_formats,
+    .uninit        = uninit,
+    .inputs        = NULL,
+    .outputs       = sinc_outputs,
+};
diff --git a/libavfilter/atadenoise.h b/libavfilter/atadenoise.h
new file mode 100644
index 0000000..26cb20b
--- /dev/null
+++ b/libavfilter/atadenoise.h
@@ -0,0 +1,42 @@
+ /*
+ * Copyright (c) 2019 Paul B Mahol
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVFILTER_ATADENOISE_H
+#define AVFILTER_ATADENOISE_H
+
+#include <stddef.h>
+#include <stdint.h>
+
+enum ATAAlgorithm {
+    PARALLEL,
+    SERIAL,
+    NB_ATAA
+};
+
+typedef struct ATADenoiseDSPContext {
+    void (*filter_row)(const uint8_t *src, uint8_t *dst,
+                       const uint8_t **srcf,
+                       int w, int mid, int size,
+                       int thra, int thrb);
+} ATADenoiseDSPContext;
+
+void ff_atadenoise_init_x86(ATADenoiseDSPContext *dsp, int depth, int algorithm);
+
+#endif /* AVFILTER_ATADENOISE_H */
diff --git a/libavfilter/avf_abitscope.c b/libavfilter/avf_abitscope.c
index 0e3eaa4..759f821 100644
--- a/libavfilter/avf_abitscope.c
+++ b/libavfilter/avf_abitscope.c
@@ -24,6 +24,7 @@
 #include "libavutil/opt.h"
 #include "libavutil/parseutils.h"
 #include "avfilter.h"
+#include "filters.h"
 #include "formats.h"
 #include "audio.h"
 #include "video.h"
@@ -36,6 +37,7 @@
     char *colors;
 
     int nb_channels;
+    int nb_samples;
     int depth;
     uint8_t *fg;
 
@@ -91,13 +93,10 @@
 {
     AVFilterContext *ctx = inlink->dst;
     AudioBitScopeContext *s = ctx->priv;
-    int ch, nb_samples;
+    int ch;
     char *colors, *saveptr = NULL;
 
-    nb_samples = FFMAX(1024, ((double)inlink->sample_rate / av_q2d(s->frame_rate)) + 0.5);
-    inlink->partial_buf_size =
-    inlink->min_samples =
-    inlink->max_samples = nb_samples;
+    s->nb_samples = FFMAX(1, av_rescale(inlink->sample_rate, s->frame_rate.den, s->frame_rate.num));
     s->nb_channels = inlink->channels;
     s->depth = inlink->format == AV_SAMPLE_FMT_S16P ? 16 : 32;
 
@@ -143,7 +142,7 @@
     int i;
 
     for (i = 0; i < max; i++) {
-        if (sample & (1 << i))
+        if (sample & (1U << i))
             s->counter[i]++;
     }
 }
@@ -222,12 +221,33 @@
     return ff_filter_frame(outlink, outpicref);
 }
 
+static int activate(AVFilterContext *ctx)
+{
+    AVFilterLink *inlink = ctx->inputs[0];
+    AVFilterLink *outlink = ctx->outputs[0];
+    AudioBitScopeContext *s = ctx->priv;
+    AVFrame *in;
+    int ret;
+
+    FF_FILTER_FORWARD_STATUS_BACK(outlink, inlink);
+
+    ret = ff_inlink_consume_samples(inlink, s->nb_samples, s->nb_samples, &in);
+    if (ret < 0)
+        return ret;
+    if (ret > 0)
+        return filter_frame(inlink, in);
+
+    FF_FILTER_FORWARD_STATUS(inlink, outlink);
+    FF_FILTER_FORWARD_WANTED(outlink, inlink);
+
+    return FFERROR_NOT_READY;
+}
+
 static const AVFilterPad inputs[] = {
     {
         .name         = "default",
         .type         = AVMEDIA_TYPE_AUDIO,
         .config_props = config_input,
-        .filter_frame = filter_frame,
     },
     { NULL }
 };
@@ -248,5 +268,6 @@
     .priv_size     = sizeof(AudioBitScopeContext),
     .inputs        = inputs,
     .outputs       = outputs,
+    .activate      = activate,
     .priv_class    = &abitscope_class,
 };
diff --git a/libavfilter/avf_ahistogram.c b/libavfilter/avf_ahistogram.c
index 5874151..92cda46 100644
--- a/libavfilter/avf_ahistogram.c
+++ b/libavfilter/avf_ahistogram.c
@@ -22,6 +22,7 @@
 #include "libavutil/opt.h"
 #include "libavutil/parseutils.h"
 #include "avfilter.h"
+#include "filters.h"
 #include "formats.h"
 #include "audio.h"
 #include "video.h"
@@ -54,6 +55,7 @@
     float *combine_buffer;
     AVFrame *in[101];
     int first;
+    int nb_samples;
 } AudioHistogramContext;
 
 #define OFFSET(x) offsetof(AudioHistogramContext, x)
@@ -117,13 +119,8 @@
 {
     AVFilterContext *ctx = inlink->dst;
     AudioHistogramContext *s = ctx->priv;
-    int nb_samples;
 
-    nb_samples = FFMAX(1024, ((double)inlink->sample_rate / av_q2d(s->frame_rate)) + 0.5);
-    inlink->partial_buf_size =
-    inlink->min_samples =
-    inlink->max_samples = nb_samples;
-
+    s->nb_samples = FFMAX(1, av_rescale(inlink->sample_rate, s->frame_rate.den, s->frame_rate.num));
     s->dchannels = s->dmode == SINGLE ? 1 : inlink->channels;
     s->shistogram = av_calloc(s->w, s->dchannels * sizeof(*s->shistogram));
     if (!s->shistogram)
@@ -166,6 +163,7 @@
     const int w = s->w;
     int c, y, n, p, bin;
     uint64_t acmax = 1;
+    AVFrame *clone;
 
     if (!s->out || s->out->width  != outlink->w ||
                    s->out->height != outlink->h) {
@@ -366,7 +364,33 @@
             s->ypos = H;
     }
 
-    return ff_filter_frame(outlink, av_frame_clone(s->out));
+    clone = av_frame_clone(s->out);
+    if (!clone)
+        return AVERROR(ENOMEM);
+
+    return ff_filter_frame(outlink, clone);
+}
+
+static int activate(AVFilterContext *ctx)
+{
+    AVFilterLink *inlink = ctx->inputs[0];
+    AVFilterLink *outlink = ctx->outputs[0];
+    AudioHistogramContext *s = ctx->priv;
+    AVFrame *in;
+    int ret;
+
+    FF_FILTER_FORWARD_STATUS_BACK(outlink, inlink);
+
+    ret = ff_inlink_consume_samples(inlink, s->nb_samples, s->nb_samples, &in);
+    if (ret < 0)
+        return ret;
+    if (ret > 0)
+        return filter_frame(inlink, in);
+
+    FF_FILTER_FORWARD_STATUS(inlink, outlink);
+    FF_FILTER_FORWARD_WANTED(outlink, inlink);
+
+    return FFERROR_NOT_READY;
 }
 
 static av_cold void uninit(AVFilterContext *ctx)
@@ -382,17 +406,16 @@
         av_frame_free(&s->in[i]);
 }
 
-static const AVFilterPad audiovectorscope_inputs[] = {
+static const AVFilterPad ahistogram_inputs[] = {
     {
         .name         = "default",
         .type         = AVMEDIA_TYPE_AUDIO,
         .config_props = config_input,
-        .filter_frame = filter_frame,
     },
     { NULL }
 };
 
-static const AVFilterPad audiovectorscope_outputs[] = {
+static const AVFilterPad ahistogram_outputs[] = {
     {
         .name         = "default",
         .type         = AVMEDIA_TYPE_VIDEO,
@@ -407,7 +430,8 @@
     .uninit        = uninit,
     .query_formats = query_formats,
     .priv_size     = sizeof(AudioHistogramContext),
-    .inputs        = audiovectorscope_inputs,
-    .outputs       = audiovectorscope_outputs,
+    .activate      = activate,
+    .inputs        = ahistogram_inputs,
+    .outputs       = ahistogram_outputs,
     .priv_class    = &ahistogram_class,
 };
diff --git a/libavfilter/avf_aphasemeter.c b/libavfilter/avf_aphasemeter.c
index ed83705..be0b2fb 100644
--- a/libavfilter/avf_aphasemeter.c
+++ b/libavfilter/avf_aphasemeter.c
@@ -106,7 +106,7 @@
     int nb_samples;
 
     if (s->do_video) {
-        nb_samples = FFMAX(1024, ((double)inlink->sample_rate / av_q2d(s->frame_rate)) + 0.5);
+        nb_samples = FFMAX(1, av_rescale(inlink->sample_rate, s->frame_rate.den, s->frame_rate.num));
         inlink->partial_buf_size =
         inlink->min_samples =
         inlink->max_samples = nb_samples;
@@ -213,8 +213,13 @@
     }
 
     if (s->do_video) {
+        AVFrame *clone;
+
         s->out->pts = in->pts;
-        ff_filter_frame(outlink, av_frame_clone(s->out));
+        clone = av_frame_clone(s->out);
+        if (!clone)
+            return AVERROR(ENOMEM);
+        ff_filter_frame(outlink, clone);
     }
     return ff_filter_frame(aoutlink, in);
 }
diff --git a/libavfilter/avf_avectorscope.c b/libavfilter/avf_avectorscope.c
index af9f1da..b288ff6 100644
--- a/libavfilter/avf_avectorscope.c
+++ b/libavfilter/avf_avectorscope.c
@@ -28,6 +28,7 @@
 #include "libavutil/opt.h"
 #include "libavutil/parseutils.h"
 #include "avfilter.h"
+#include "filters.h"
 #include "formats.h"
 #include "audio.h"
 #include "video.h"
@@ -69,6 +70,7 @@
     int mirror;
     unsigned prev_x, prev_y;
     AVRational frame_rate;
+    int nb_samples;
 } AudioVectorScopeContext;
 
 #define OFFSET(x) offsetof(AudioVectorScopeContext, x)
@@ -208,12 +210,8 @@
 {
     AVFilterContext *ctx = inlink->dst;
     AudioVectorScopeContext *s = ctx->priv;
-    int nb_samples;
 
-    nb_samples = FFMAX(1024, ((double)inlink->sample_rate / av_q2d(s->frame_rate)) + 0.5);
-    inlink->partial_buf_size =
-    inlink->min_samples =
-    inlink->max_samples = nb_samples;
+    s->nb_samples = FFMAX(1, av_rescale(inlink->sample_rate, s->frame_rate.den, s->frame_rate.num));
 
     return 0;
 }
@@ -240,6 +238,7 @@
     AudioVectorScopeContext *s = ctx->priv;
     const int hw = s->hw;
     const int hh = s->hh;
+    AVFrame *clone;
     unsigned x, y;
     unsigned prev_x = s->prev_x, prev_y = s->prev_y;
     double zoom = s->zoom;
@@ -362,7 +361,33 @@
     s->prev_x = x, s->prev_y = y;
     av_frame_free(&insamples);
 
-    return ff_filter_frame(outlink, av_frame_clone(s->outpicref));
+    clone = av_frame_clone(s->outpicref);
+    if (!clone)
+        return AVERROR(ENOMEM);
+
+    return ff_filter_frame(outlink, clone);
+}
+
+static int activate(AVFilterContext *ctx)
+{
+    AVFilterLink *inlink = ctx->inputs[0];
+    AVFilterLink *outlink = ctx->outputs[0];
+    AudioVectorScopeContext *s = ctx->priv;
+    AVFrame *in;
+    int ret;
+
+    FF_FILTER_FORWARD_STATUS_BACK(outlink, inlink);
+
+    ret = ff_inlink_consume_samples(inlink, s->nb_samples, s->nb_samples, &in);
+    if (ret < 0)
+        return ret;
+    if (ret > 0)
+        return filter_frame(inlink, in);
+
+    FF_FILTER_FORWARD_STATUS(inlink, outlink);
+    FF_FILTER_FORWARD_WANTED(outlink, inlink);
+
+    return FFERROR_NOT_READY;
 }
 
 static av_cold void uninit(AVFilterContext *ctx)
@@ -377,7 +402,6 @@
         .name         = "default",
         .type         = AVMEDIA_TYPE_AUDIO,
         .config_props = config_input,
-        .filter_frame = filter_frame,
     },
     { NULL }
 };
@@ -397,6 +421,7 @@
     .uninit        = uninit,
     .query_formats = query_formats,
     .priv_size     = sizeof(AudioVectorScopeContext),
+    .activate      = activate,
     .inputs        = audiovectorscope_inputs,
     .outputs       = audiovectorscope_outputs,
     .priv_class    = &avectorscope_class,
diff --git a/libavfilter/avf_concat.c b/libavfilter/avf_concat.c
index 1d0c2de..28bd540 100644
--- a/libavfilter/avf_concat.c
+++ b/libavfilter/avf_concat.c
@@ -131,8 +131,21 @@
     outlink->h                   = inlink->h;
     outlink->sample_aspect_ratio = inlink->sample_aspect_ratio;
     outlink->format              = inlink->format;
+    outlink->frame_rate          = inlink->frame_rate;
+
     for (seg = 1; seg < cat->nb_segments; seg++) {
-        inlink = ctx->inputs[in_no += ctx->nb_outputs];
+        inlink = ctx->inputs[in_no + seg * ctx->nb_outputs];
+        if (outlink->frame_rate.num != inlink->frame_rate.num ||
+            outlink->frame_rate.den != inlink->frame_rate.den) {
+            av_log(ctx, AV_LOG_VERBOSE,
+                    "Video inputs have different frame rates, output will be VFR\n");
+            outlink->frame_rate = av_make_q(1, 0);
+            break;
+        }
+    }
+
+    for (seg = 1; seg < cat->nb_segments; seg++) {
+        inlink = ctx->inputs[in_no + seg * ctx->nb_outputs];
         if (!outlink->sample_aspect_ratio.num)
             outlink->sample_aspect_ratio = inlink->sample_aspect_ratio;
         /* possible enhancement: unsafe mode, do not check */
diff --git a/libavfilter/avf_showcqt.c b/libavfilter/avf_showcqt.c
index 875ba48..cf8a102 100644
--- a/libavfilter/avf_showcqt.c
+++ b/libavfilter/avf_showcqt.c
@@ -67,10 +67,10 @@
     { "axis_h",      "set axis height", OFFSET(axis_h),       AV_OPT_TYPE_INT, { .i64 = -1 },              -1, INT_MAX,  FLAGS },
     { "sono_h",  "set sonogram height", OFFSET(sono_h),       AV_OPT_TYPE_INT, { .i64 = -1 },              -1, INT_MAX,  FLAGS },
     { "fullhd",      "set fullhd size", OFFSET(fullhd),      AV_OPT_TYPE_BOOL, { .i64 = 1 },                0, 1,        FLAGS },
-    { "sono_v",  "set sonogram volume", OFFSET(sono_v),    AV_OPT_TYPE_STRING, { .str = "16" },      CHAR_MIN, CHAR_MAX, FLAGS },
-    { "volume",  "set sonogram volume", OFFSET(sono_v),    AV_OPT_TYPE_STRING, { .str = "16" },      CHAR_MIN, CHAR_MAX, FLAGS },
-    { "bar_v",   "set bargraph volume", OFFSET(bar_v),     AV_OPT_TYPE_STRING, { .str = "sono_v" },  CHAR_MIN, CHAR_MAX, FLAGS },
-    { "volume2", "set bargraph volume", OFFSET(bar_v),     AV_OPT_TYPE_STRING, { .str = "sono_v" },  CHAR_MIN, CHAR_MAX, FLAGS },
+    { "sono_v",  "set sonogram volume", OFFSET(sono_v),    AV_OPT_TYPE_STRING, { .str = "16" },      0, 0, FLAGS },
+    { "volume",  "set sonogram volume", OFFSET(sono_v),    AV_OPT_TYPE_STRING, { .str = "16" },      0, 0, FLAGS },
+    { "bar_v",   "set bargraph volume", OFFSET(bar_v),     AV_OPT_TYPE_STRING, { .str = "sono_v" },  0, 0, FLAGS },
+    { "volume2", "set bargraph volume", OFFSET(bar_v),     AV_OPT_TYPE_STRING, { .str = "sono_v" },  0, 0, FLAGS },
     { "sono_g",   "set sonogram gamma", OFFSET(sono_g),     AV_OPT_TYPE_FLOAT, { .dbl = 3.0 },            1.0, 7.0,      FLAGS },
     { "gamma",    "set sonogram gamma", OFFSET(sono_g),     AV_OPT_TYPE_FLOAT, { .dbl = 3.0 },            1.0, 7.0,      FLAGS },
     { "bar_g",    "set bargraph gamma", OFFSET(bar_g),      AV_OPT_TYPE_FLOAT, { .dbl = 1.0 },            1.0, 7.0,      FLAGS },
@@ -82,13 +82,13 @@
     { "basefreq", "set base frequency", OFFSET(basefreq),  AV_OPT_TYPE_DOUBLE, { .dbl = BASEFREQ },      10.0, 100000.0, FLAGS },
     { "endfreq",   "set end frequency", OFFSET(endfreq),   AV_OPT_TYPE_DOUBLE, { .dbl = ENDFREQ },       10.0, 100000.0, FLAGS },
     { "coeffclamp",   "set coeffclamp", OFFSET(coeffclamp), AV_OPT_TYPE_FLOAT, { .dbl = 1.0 },            0.1, 10.0,     FLAGS },
-    { "tlength",         "set tlength", OFFSET(tlength),   AV_OPT_TYPE_STRING, { .str = TLENGTH },   CHAR_MIN, CHAR_MAX, FLAGS },
+    { "tlength",         "set tlength", OFFSET(tlength),   AV_OPT_TYPE_STRING, { .str = TLENGTH },   0, 0, FLAGS },
     { "count",   "set transform count", OFFSET(count),        AV_OPT_TYPE_INT, { .i64 = 6 },                1, 30,       FLAGS },
     { "fcount",  "set frequency count", OFFSET(fcount),       AV_OPT_TYPE_INT, { .i64 = 0 },                0, 10,       FLAGS },
-    { "fontfile", "set axis font file", OFFSET(fontfile),  AV_OPT_TYPE_STRING, { .str = NULL },      CHAR_MIN, CHAR_MAX, FLAGS },
-    { "font",          "set axis font", OFFSET(font),      AV_OPT_TYPE_STRING, { .str = NULL },      CHAR_MIN, CHAR_MAX, FLAGS },
-    { "fontcolor",    "set font color", OFFSET(fontcolor), AV_OPT_TYPE_STRING, { .str = FONTCOLOR }, CHAR_MIN, CHAR_MAX, FLAGS },
-    { "axisfile",     "set axis image", OFFSET(axisfile),  AV_OPT_TYPE_STRING, { .str = NULL },      CHAR_MIN, CHAR_MAX, FLAGS },
+    { "fontfile", "set axis font file", OFFSET(fontfile),  AV_OPT_TYPE_STRING, { .str = NULL },      0, 0, FLAGS },
+    { "font",          "set axis font", OFFSET(font),      AV_OPT_TYPE_STRING, { .str = NULL },      0, 0, FLAGS },
+    { "fontcolor",    "set font color", OFFSET(fontcolor), AV_OPT_TYPE_STRING, { .str = FONTCOLOR }, 0, 0, FLAGS },
+    { "axisfile",     "set axis image", OFFSET(axisfile),  AV_OPT_TYPE_STRING, { .str = NULL },      0, 0, FLAGS },
     { "axis",              "draw axis", OFFSET(axis),        AV_OPT_TYPE_BOOL, { .i64 = 1 },                0, 1,        FLAGS },
     { "text",              "draw axis", OFFSET(axis),        AV_OPT_TYPE_BOOL, { .i64 = 1 },                0, 1,        FLAGS },
     { "csp",         "set color space", OFFSET(csp),          AV_OPT_TYPE_INT, { .i64 = AVCOL_SPC_UNSPECIFIED }, 0, INT_MAX, FLAGS, "csp" },
@@ -99,7 +99,7 @@
         { "smpte170m",     "smpte170m", 0,                  AV_OPT_TYPE_CONST, { .i64 = AVCOL_SPC_SMPTE170M },   0, 0, FLAGS, "csp" },
         { "smpte240m",     "smpte240m", 0,                  AV_OPT_TYPE_CONST, { .i64 = AVCOL_SPC_SMPTE240M },   0, 0, FLAGS, "csp" },
         { "bt2020ncl",     "bt2020ncl", 0,                  AV_OPT_TYPE_CONST, { .i64 = AVCOL_SPC_BT2020_NCL },  0, 0, FLAGS, "csp" },
-    { "cscheme",    "set color scheme", OFFSET(cscheme),   AV_OPT_TYPE_STRING, { .str = CSCHEME },   CHAR_MIN, CHAR_MAX, FLAGS },
+    { "cscheme",    "set color scheme", OFFSET(cscheme),   AV_OPT_TYPE_STRING, { .str = CSCHEME },   0, 0, FLAGS },
     { NULL }
 };
 
diff --git a/libavfilter/avf_showfreqs.c b/libavfilter/avf_showfreqs.c
index 22f28ec..645754d 100644
--- a/libavfilter/avf_showfreqs.c
+++ b/libavfilter/avf_showfreqs.c
@@ -30,6 +30,7 @@
 #include "libavutil/opt.h"
 #include "libavutil/parseutils.h"
 #include "audio.h"
+#include "filters.h"
 #include "video.h"
 #include "avfilter.h"
 #include "internal.h"
@@ -45,6 +46,7 @@
     int w, h;
     int mode;
     int cmode;
+    int fft_size;
     int fft_bits;
     int ascale, fscale;
     int avg;
@@ -84,20 +86,7 @@
         { "lin",  "linear",              0, AV_OPT_TYPE_CONST, {.i64=FS_LINEAR}, 0, 0, FLAGS, "fscale" },
         { "log",  "logarithmic",         0, AV_OPT_TYPE_CONST, {.i64=FS_LOG},    0, 0, FLAGS, "fscale" },
         { "rlog", "reverse logarithmic", 0, AV_OPT_TYPE_CONST, {.i64=FS_RLOG},   0, 0, FLAGS, "fscale" },
-    { "win_size", "set window size", OFFSET(fft_bits), AV_OPT_TYPE_INT, {.i64=11}, 4, 16, FLAGS, "fft" },
-        { "w16",    0, 0, AV_OPT_TYPE_CONST, {.i64=4},  0, 0, FLAGS, "fft" },
-        { "w32",    0, 0, AV_OPT_TYPE_CONST, {.i64=5},  0, 0, FLAGS, "fft" },
-        { "w64",    0, 0, AV_OPT_TYPE_CONST, {.i64=6},  0, 0, FLAGS, "fft" },
-        { "w128",   0, 0, AV_OPT_TYPE_CONST, {.i64=7},  0, 0, FLAGS, "fft" },
-        { "w256",   0, 0, AV_OPT_TYPE_CONST, {.i64=8},  0, 0, FLAGS, "fft" },
-        { "w512",   0, 0, AV_OPT_TYPE_CONST, {.i64=9},  0, 0, FLAGS, "fft" },
-        { "w1024",  0, 0, AV_OPT_TYPE_CONST, {.i64=10}, 0, 0, FLAGS, "fft" },
-        { "w2048",  0, 0, AV_OPT_TYPE_CONST, {.i64=11}, 0, 0, FLAGS, "fft" },
-        { "w4096",  0, 0, AV_OPT_TYPE_CONST, {.i64=12}, 0, 0, FLAGS, "fft" },
-        { "w8192",  0, 0, AV_OPT_TYPE_CONST, {.i64=13}, 0, 0, FLAGS, "fft" },
-        { "w16384", 0, 0, AV_OPT_TYPE_CONST, {.i64=14}, 0, 0, FLAGS, "fft" },
-        { "w32768", 0, 0, AV_OPT_TYPE_CONST, {.i64=15}, 0, 0, FLAGS, "fft" },
-        { "w65536", 0, 0, AV_OPT_TYPE_CONST, {.i64=16}, 0, 0, FLAGS, "fft" },
+    { "win_size", "set window size", OFFSET(fft_size), AV_OPT_TYPE_INT, {.i64=2048}, 16, 65536, FLAGS },
     { "win_func", "set window function", OFFSET(win_func), AV_OPT_TYPE_INT, {.i64=WFUNC_HANNING}, 0, NB_WFUNC-1, FLAGS, "win_func" },
         { "rect",     "Rectangular",      0, AV_OPT_TYPE_CONST, {.i64=WFUNC_RECT},     0, 0, FLAGS, "win_func" },
         { "bartlett", "Bartlett",         0, AV_OPT_TYPE_CONST, {.i64=WFUNC_BARTLETT}, 0, 0, FLAGS, "win_func" },
@@ -118,6 +107,7 @@
         { "cauchy",   "Cauchy",           0, AV_OPT_TYPE_CONST, {.i64=WFUNC_CAUCHY},   0, 0, FLAGS, "win_func" },
         { "parzen",   "Parzen",           0, AV_OPT_TYPE_CONST, {.i64=WFUNC_PARZEN},   0, 0, FLAGS, "win_func" },
         { "poisson",  "Poisson",          0, AV_OPT_TYPE_CONST, {.i64=WFUNC_POISSON},  0, 0, FLAGS, "win_func" },
+        { "bohman",   "Bohman",           0, AV_OPT_TYPE_CONST, {.i64=WFUNC_BOHMAN} ,  0, 0, FLAGS, "win_func" },
     { "overlap",  "set window overlap", OFFSET(overlap), AV_OPT_TYPE_FLOAT, {.dbl=1.}, 0., 1., FLAGS },
     { "averaging", "set time averaging", OFFSET(avg), AV_OPT_TYPE_INT, {.i64=1}, 0, INT32_MAX, FLAGS },
     { "colors", "set channels colors", OFFSET(colors), AV_OPT_TYPE_STRING, {.str = "red|green|blue|yellow|orange|lime|pink|magenta|brown" }, 0, 0, FLAGS },
@@ -178,6 +168,7 @@
     float overlap;
     int i;
 
+    s->fft_bits = av_log2(s->fft_size);
     s->nb_freq = 1 << (s->fft_bits - 1);
     s->win_size = s->nb_freq << 1;
     av_audio_fifo_free(s->fifo);
@@ -204,7 +195,7 @@
     if (!s->fft_data)
         return AVERROR(ENOMEM);
     s->avg_data = av_calloc(s->nb_channels, sizeof(*s->avg_data));
-    if (!s->fft_data)
+    if (!s->avg_data)
         return AVERROR(ENOMEM);
     for (i = 0; i < s->nb_channels; i++) {
         s->fft_data[i] = av_calloc(s->win_size, sizeof(**s->fft_data));
@@ -438,45 +429,67 @@
     return ff_filter_frame(outlink, out);
 }
 
-static int filter_frame(AVFilterLink *inlink, AVFrame *in)
+static int filter_frame(AVFilterLink *inlink)
 {
     AVFilterContext *ctx = inlink->dst;
     ShowFreqsContext *s = ctx->priv;
     AVFrame *fin = NULL;
-    int consumed = 0;
     int ret = 0;
 
-    if (s->pts == AV_NOPTS_VALUE)
-        s->pts = in->pts - av_audio_fifo_size(s->fifo);
-
-    av_audio_fifo_write(s->fifo, (void **)in->extended_data, in->nb_samples);
-    while (av_audio_fifo_size(s->fifo) >= s->win_size) {
-        fin = ff_get_audio_buffer(inlink, s->win_size);
-        if (!fin) {
-            ret = AVERROR(ENOMEM);
-            goto fail;
-        }
-
-        fin->pts = s->pts + consumed;
-        consumed += s->hop_size;
-        ret = av_audio_fifo_peek(s->fifo, (void **)fin->extended_data, s->win_size);
-        if (ret < 0)
-            goto fail;
-
-        ret = plot_freqs(inlink, fin);
-        av_frame_free(&fin);
-        av_audio_fifo_drain(s->fifo, s->hop_size);
-        if (ret < 0)
-            goto fail;
+    fin = ff_get_audio_buffer(inlink, s->win_size);
+    if (!fin) {
+        ret = AVERROR(ENOMEM);
+        goto fail;
     }
 
-fail:
-    s->pts = AV_NOPTS_VALUE;
+    fin->pts = s->pts;
+    s->pts += s->hop_size;
+    ret = av_audio_fifo_peek(s->fifo, (void **)fin->extended_data, s->win_size);
+    if (ret < 0)
+        goto fail;
+
+    ret = plot_freqs(inlink, fin);
     av_frame_free(&fin);
-    av_frame_free(&in);
+    av_audio_fifo_drain(s->fifo, s->hop_size);
+
+fail:
+    av_frame_free(&fin);
     return ret;
 }
 
+static int activate(AVFilterContext *ctx)
+{
+    AVFilterLink *inlink = ctx->inputs[0];
+    AVFilterLink *outlink = ctx->outputs[0];
+    ShowFreqsContext *s = ctx->priv;
+    AVFrame *in = NULL;
+    int ret = 0;
+
+    FF_FILTER_FORWARD_STATUS_BACK(outlink, inlink);
+
+    if (av_audio_fifo_size(s->fifo) < s->win_size)
+        ret = ff_inlink_consume_samples(inlink, s->win_size, s->win_size, &in);
+    if (ret < 0)
+        return ret;
+    if (ret > 0) {
+        av_audio_fifo_write(s->fifo, (void **)in->extended_data, in->nb_samples);
+        if (s->pts == AV_NOPTS_VALUE)
+            s->pts = in->pts;
+        av_frame_free(&in);
+    }
+
+    if (av_audio_fifo_size(s->fifo) >= s->win_size) {
+        ret = filter_frame(inlink);
+        if (ret <= 0)
+            return ret;
+    }
+
+    FF_FILTER_FORWARD_STATUS(inlink, outlink);
+    FF_FILTER_FORWARD_WANTED(outlink, inlink);
+
+    return FFERROR_NOT_READY;
+}
+
 static av_cold void uninit(AVFilterContext *ctx)
 {
     ShowFreqsContext *s = ctx->priv;
@@ -499,7 +512,6 @@
     {
         .name         = "default",
         .type         = AVMEDIA_TYPE_AUDIO,
-        .filter_frame = filter_frame,
     },
     { NULL }
 };
@@ -520,6 +532,7 @@
     .uninit        = uninit,
     .query_formats = query_formats,
     .priv_size     = sizeof(ShowFreqsContext),
+    .activate      = activate,
     .inputs        = showfreqs_inputs,
     .outputs       = showfreqs_outputs,
     .priv_class    = &showfreqs_class,
diff --git a/libavfilter/avf_showspatial.c b/libavfilter/avf_showspatial.c
new file mode 100644
index 0000000..80109a3
--- /dev/null
+++ b/libavfilter/avf_showspatial.c
@@ -0,0 +1,372 @@
+/*
+ * Copyright (c) 2019 Paul B Mahol
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include <float.h>
+#include <math.h>
+
+#include "libavcodec/avfft.h"
+#include "libavutil/audio_fifo.h"
+#include "libavutil/avassert.h"
+#include "libavutil/channel_layout.h"
+#include "libavutil/opt.h"
+#include "libavutil/parseutils.h"
+#include "audio.h"
+#include "video.h"
+#include "avfilter.h"
+#include "filters.h"
+#include "internal.h"
+#include "window_func.h"
+
+typedef struct ShowSpatialContext {
+    const AVClass *class;
+    int w, h;
+    AVRational frame_rate;
+    FFTContext *fft[2];           ///< Fast Fourier Transform context
+    FFTContext *ifft[2];          ///< Inverse Fast Fourier Transform context
+    int fft_bits;                 ///< number of bits (FFT window size = 1<<fft_bits)
+    FFTComplex *fft_data[2];      ///< bins holder for each (displayed) channels
+    float *window_func_lut;       ///< Window function LUT
+    int win_func;
+    int win_size;
+    int buf_size;
+    float overlap;
+    int consumed;
+    int hop_size;
+    AVAudioFifo *fifo;
+    int64_t pts;
+} ShowSpatialContext;
+
+#define OFFSET(x) offsetof(ShowSpatialContext, x)
+#define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM
+
+static const AVOption showspatial_options[] = {
+    { "size", "set video size", OFFSET(w), AV_OPT_TYPE_IMAGE_SIZE, {.str = "512x512"}, 0, 0, FLAGS },
+    { "s",    "set video size", OFFSET(w), AV_OPT_TYPE_IMAGE_SIZE, {.str = "512x512"}, 0, 0, FLAGS },
+    { "win_size", "set window size", OFFSET(win_size), AV_OPT_TYPE_INT, {.i64 = 4096}, 1024, 65536, FLAGS },
+    { "win_func", "set window function", OFFSET(win_func), AV_OPT_TYPE_INT, {.i64 = WFUNC_HANNING}, 0, NB_WFUNC-1, FLAGS, "win_func" },
+        { "rect",     "Rectangular",      0, AV_OPT_TYPE_CONST, {.i64=WFUNC_RECT},     0, 0, FLAGS, "win_func" },
+        { "bartlett", "Bartlett",         0, AV_OPT_TYPE_CONST, {.i64=WFUNC_BARTLETT}, 0, 0, FLAGS, "win_func" },
+        { "hann",     "Hann",             0, AV_OPT_TYPE_CONST, {.i64=WFUNC_HANNING},  0, 0, FLAGS, "win_func" },
+        { "hanning",  "Hanning",          0, AV_OPT_TYPE_CONST, {.i64=WFUNC_HANNING},  0, 0, FLAGS, "win_func" },
+        { "hamming",  "Hamming",          0, AV_OPT_TYPE_CONST, {.i64=WFUNC_HAMMING},  0, 0, FLAGS, "win_func" },
+        { "blackman", "Blackman",         0, AV_OPT_TYPE_CONST, {.i64=WFUNC_BLACKMAN}, 0, 0, FLAGS, "win_func" },
+        { "welch",    "Welch",            0, AV_OPT_TYPE_CONST, {.i64=WFUNC_WELCH},    0, 0, FLAGS, "win_func" },
+        { "flattop",  "Flat-top",         0, AV_OPT_TYPE_CONST, {.i64=WFUNC_FLATTOP},  0, 0, FLAGS, "win_func" },
+        { "bharris",  "Blackman-Harris",  0, AV_OPT_TYPE_CONST, {.i64=WFUNC_BHARRIS},  0, 0, FLAGS, "win_func" },
+        { "bnuttall", "Blackman-Nuttall", 0, AV_OPT_TYPE_CONST, {.i64=WFUNC_BNUTTALL}, 0, 0, FLAGS, "win_func" },
+        { "bhann",    "Bartlett-Hann",    0, AV_OPT_TYPE_CONST, {.i64=WFUNC_BHANN},    0, 0, FLAGS, "win_func" },
+        { "sine",     "Sine",             0, AV_OPT_TYPE_CONST, {.i64=WFUNC_SINE},     0, 0, FLAGS, "win_func" },
+        { "nuttall",  "Nuttall",          0, AV_OPT_TYPE_CONST, {.i64=WFUNC_NUTTALL},  0, 0, FLAGS, "win_func" },
+        { "lanczos",  "Lanczos",          0, AV_OPT_TYPE_CONST, {.i64=WFUNC_LANCZOS},  0, 0, FLAGS, "win_func" },
+        { "gauss",    "Gauss",            0, AV_OPT_TYPE_CONST, {.i64=WFUNC_GAUSS},    0, 0, FLAGS, "win_func" },
+        { "tukey",    "Tukey",            0, AV_OPT_TYPE_CONST, {.i64=WFUNC_TUKEY},    0, 0, FLAGS, "win_func" },
+        { "dolph",    "Dolph-Chebyshev",  0, AV_OPT_TYPE_CONST, {.i64=WFUNC_DOLPH},    0, 0, FLAGS, "win_func" },
+        { "cauchy",   "Cauchy",           0, AV_OPT_TYPE_CONST, {.i64=WFUNC_CAUCHY},   0, 0, FLAGS, "win_func" },
+        { "parzen",   "Parzen",           0, AV_OPT_TYPE_CONST, {.i64=WFUNC_PARZEN},   0, 0, FLAGS, "win_func" },
+        { "poisson",  "Poisson",          0, AV_OPT_TYPE_CONST, {.i64=WFUNC_POISSON},  0, 0, FLAGS, "win_func" },
+        { "bohman",   "Bohman",           0, AV_OPT_TYPE_CONST, {.i64=WFUNC_BOHMAN},   0, 0, FLAGS, "win_func" },
+    { "overlap", "set window overlap", OFFSET(overlap), AV_OPT_TYPE_FLOAT, {.dbl=0.5}, 0, 1, FLAGS },
+    { NULL }
+};
+
+AVFILTER_DEFINE_CLASS(showspatial);
+
+static av_cold void uninit(AVFilterContext *ctx)
+{
+    ShowSpatialContext *s = ctx->priv;
+    int i;
+
+    for (i = 0; i < 2; i++)
+        av_fft_end(s->fft[i]);
+    for (i = 0; i < 2; i++)
+        av_fft_end(s->ifft[i]);
+    for (i = 0; i < 2; i++)
+        av_freep(&s->fft_data[i]);
+    av_freep(&s->window_func_lut);
+    av_audio_fifo_free(s->fifo);
+}
+
+static int query_formats(AVFilterContext *ctx)
+{
+    AVFilterFormats *formats = NULL;
+    AVFilterChannelLayouts *layout = NULL;
+    AVFilterLink *inlink = ctx->inputs[0];
+    AVFilterLink *outlink = ctx->outputs[0];
+    static const enum AVSampleFormat sample_fmts[] = { AV_SAMPLE_FMT_FLTP, AV_SAMPLE_FMT_NONE };
+    static const enum AVPixelFormat pix_fmts[] = { AV_PIX_FMT_GBRP, AV_PIX_FMT_NONE };
+    int ret;
+
+    formats = ff_make_format_list(sample_fmts);
+    if ((ret = ff_formats_ref         (formats, &inlink->out_formats        )) < 0 ||
+        (ret = ff_add_channel_layout  (&layout, AV_CH_LAYOUT_STEREO         )) < 0 ||
+        (ret = ff_channel_layouts_ref (layout , &inlink->out_channel_layouts)) < 0)
+        return ret;
+
+    formats = ff_all_samplerates();
+    if ((ret = ff_formats_ref(formats, &inlink->out_samplerates)) < 0)
+        return ret;
+
+    formats = ff_make_format_list(pix_fmts);
+    if ((ret = ff_formats_ref(formats, &outlink->in_formats)) < 0)
+        return ret;
+
+    return 0;
+}
+
+static int run_channel_fft(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
+{
+    ShowSpatialContext *s = ctx->priv;
+    const float *window_func_lut = s->window_func_lut;
+    AVFrame *fin = arg;
+    const int ch = jobnr;
+    const float *p = (float *)fin->extended_data[ch];
+
+    for (int n = 0; n < fin->nb_samples; n++) {
+        s->fft_data[ch][n].re = p[n] * window_func_lut[n];
+        s->fft_data[ch][n].im = 0;
+    }
+
+    av_fft_permute(s->fft[ch], s->fft_data[ch]);
+    av_fft_calc(s->fft[ch], s->fft_data[ch]);
+
+    return 0;
+}
+
+static int config_output(AVFilterLink *outlink)
+{
+    AVFilterContext *ctx = outlink->src;
+    AVFilterLink *inlink = ctx->inputs[0];
+    ShowSpatialContext *s = ctx->priv;
+    int i, fft_bits;
+    float overlap;
+
+    outlink->w = s->w;
+    outlink->h = s->h;
+    outlink->sample_aspect_ratio = (AVRational){1,1};
+
+    s->buf_size = 1 << av_log2(s->win_size);
+    s->win_size = s->buf_size;
+    fft_bits = av_log2(s->win_size);
+
+    /* (re-)configuration if the video output changed (or first init) */
+    if (fft_bits != s->fft_bits) {
+        s->fft_bits = fft_bits;
+
+        /* FFT buffers: x2 for each channel buffer.
+         * Note: we use free and malloc instead of a realloc-like function to
+         * make sure the buffer is aligned in memory for the FFT functions. */
+        for (i = 0; i < 2; i++) {
+            av_fft_end(s->fft[i]);
+            av_freep(&s->fft_data[i]);
+        }
+        for (i = 0; i < 2; i++) {
+            s->fft[i] = av_fft_init(fft_bits, 0);
+            if (!s->fft[i]) {
+                av_log(ctx, AV_LOG_ERROR, "Unable to create FFT context. "
+                       "The window size might be too high.\n");
+                return AVERROR(EINVAL);
+            }
+        }
+
+        for (i = 0; i < 2; i++) {
+            s->fft_data[i] = av_calloc(s->buf_size, sizeof(**s->fft_data));
+            if (!s->fft_data[i])
+                return AVERROR(ENOMEM);
+        }
+
+        /* pre-calc windowing function */
+        s->window_func_lut =
+            av_realloc_f(s->window_func_lut, s->win_size,
+                         sizeof(*s->window_func_lut));
+        if (!s->window_func_lut)
+            return AVERROR(ENOMEM);
+        generate_window_func(s->window_func_lut, s->win_size, s->win_func, &overlap);
+        if (s->overlap == 1)
+            s->overlap = overlap;
+
+        s->hop_size = (1.f - s->overlap) * s->win_size;
+        if (s->hop_size < 1) {
+            av_log(ctx, AV_LOG_ERROR, "overlap %f too big\n", s->overlap);
+            return AVERROR(EINVAL);
+        }
+    }
+
+    outlink->time_base = av_inv_q(outlink->frame_rate);
+
+    av_audio_fifo_free(s->fifo);
+    s->fifo = av_audio_fifo_alloc(inlink->format, inlink->channels, s->win_size);
+    if (!s->fifo)
+        return AVERROR(ENOMEM);
+    return 0;
+}
+
+#define RE(y, ch) s->fft_data[ch][y].re
+#define IM(y, ch) s->fft_data[ch][y].im
+
+static void draw_dot(uint8_t *dst, int linesize, int value)
+{
+    dst[0] = value;
+    dst[1] = value;
+    dst[-1] = value;
+    dst[linesize] = value;
+    dst[-linesize] = value;
+}
+
+static int draw_spatial(AVFilterLink *inlink, AVFrame *insamples)
+{
+    AVFilterContext *ctx = inlink->dst;
+    AVFilterLink *outlink = ctx->outputs[0];
+    ShowSpatialContext *s = ctx->priv;
+    AVFrame *outpicref;
+    int h = s->h - 2;
+    int w = s->w - 2;
+    int z = s->win_size / 2;
+
+    outpicref = ff_get_video_buffer(outlink, outlink->w, outlink->h);
+    if (!outpicref)
+        return AVERROR(ENOMEM);
+
+    outpicref->sample_aspect_ratio = (AVRational){1,1};
+    for (int i = 0; i < outlink->h; i++) {
+        memset(outpicref->data[0] + i * outpicref->linesize[0], 0, outlink->w);
+        memset(outpicref->data[1] + i * outpicref->linesize[1], 0, outlink->w);
+        memset(outpicref->data[2] + i * outpicref->linesize[2], 0, outlink->w);
+    }
+
+    for (int j = 0; j < z; j++) {
+        const int idx = z - 1 - j;
+        float l = hypotf(RE(idx, 0), IM(idx, 0));
+        float r = hypotf(RE(idx, 1), IM(idx, 1));
+        float sum = l + r;
+        float lp = atan2f(IM(idx, 0), RE(idx, 0));
+        float rp = atan2f(IM(idx, 1), RE(idx, 1));
+        float diffp = ((rp - lp) / (2.f * M_PI) + 1.f) * 0.5f;
+        float diff = (sum < 0.000001f ? 0.f : (r - l) / sum) * 0.5f + 0.5f;
+        float cr = av_clipf(cbrtf(l / sum), 0, 1) * 255.f;
+        float cb = av_clipf(cbrtf(r / sum), 0, 1) * 255.f;
+        float cg;
+        int x, y;
+
+        cg = diffp * 255.f;
+        x = av_clip(w * diff,  0, w - 2) + 1;
+        y = av_clip(h * diffp, 0, h - 2) + 1;
+
+        draw_dot(outpicref->data[0] + outpicref->linesize[0] * y + x, outpicref->linesize[0], cg);
+        draw_dot(outpicref->data[1] + outpicref->linesize[1] * y + x, outpicref->linesize[1], cb);
+        draw_dot(outpicref->data[2] + outpicref->linesize[2] * y + x, outpicref->linesize[2], cr);
+    }
+
+    outpicref->pts = av_rescale_q(insamples->pts, inlink->time_base, outlink->time_base);
+
+    return ff_filter_frame(outlink, outpicref);
+}
+
+static int spatial_activate(AVFilterContext *ctx)
+{
+    AVFilterLink *inlink = ctx->inputs[0];
+    AVFilterLink *outlink = ctx->outputs[0];
+    ShowSpatialContext *s = ctx->priv;
+    int ret;
+
+    FF_FILTER_FORWARD_STATUS_BACK(outlink, inlink);
+
+    if (av_audio_fifo_size(s->fifo) < s->win_size) {
+        AVFrame *frame = NULL;
+
+        ret = ff_inlink_consume_frame(inlink, &frame);
+        if (ret < 0)
+            return ret;
+        if (ret > 0) {
+            s->pts = frame->pts;
+            s->consumed = 0;
+
+            av_audio_fifo_write(s->fifo, (void **)frame->extended_data, frame->nb_samples);
+            av_frame_free(&frame);
+        }
+    }
+
+    if (av_audio_fifo_size(s->fifo) >= s->win_size) {
+        AVFrame *fin = ff_get_audio_buffer(inlink, s->win_size);
+        if (!fin)
+            return AVERROR(ENOMEM);
+
+        fin->pts = s->pts + s->consumed;
+        s->consumed += s->hop_size;
+        ret = av_audio_fifo_peek(s->fifo, (void **)fin->extended_data,
+                                 FFMIN(s->win_size, av_audio_fifo_size(s->fifo)));
+        if (ret < 0) {
+            av_frame_free(&fin);
+            return ret;
+        }
+
+        av_assert0(fin->nb_samples == s->win_size);
+
+        ctx->internal->execute(ctx, run_channel_fft, fin, NULL, 2);
+
+        ret = draw_spatial(inlink, fin);
+
+        av_frame_free(&fin);
+        av_audio_fifo_drain(s->fifo, s->hop_size);
+        if (ret <= 0)
+            return ret;
+    }
+
+    FF_FILTER_FORWARD_STATUS(inlink, outlink);
+    if (ff_outlink_frame_wanted(outlink) && av_audio_fifo_size(s->fifo) < s->win_size) {
+        ff_inlink_request_frame(inlink);
+        return 0;
+    }
+
+    if (av_audio_fifo_size(s->fifo) >= s->win_size) {
+        ff_filter_set_ready(ctx, 10);
+        return 0;
+    }
+    return FFERROR_NOT_READY;
+}
+
+static const AVFilterPad showspatial_inputs[] = {
+    {
+        .name         = "default",
+        .type         = AVMEDIA_TYPE_AUDIO,
+    },
+    { NULL }
+};
+
+static const AVFilterPad showspatial_outputs[] = {
+    {
+        .name          = "default",
+        .type          = AVMEDIA_TYPE_VIDEO,
+        .config_props  = config_output,
+    },
+    { NULL }
+};
+
+AVFilter ff_avf_showspatial = {
+    .name          = "showspatial",
+    .description   = NULL_IF_CONFIG_SMALL("Convert input audio to a spatial video output."),
+    .uninit        = uninit,
+    .query_formats = query_formats,
+    .priv_size     = sizeof(ShowSpatialContext),
+    .inputs        = showspatial_inputs,
+    .outputs       = showspatial_outputs,
+    .activate      = spatial_activate,
+    .priv_class    = &showspatial_class,
+    .flags         = AVFILTER_FLAG_SLICE_THREADS,
+};
diff --git a/libavfilter/avf_showspectrum.c b/libavfilter/avf_showspectrum.c
index 41693a0..a4dd7b7 100644
--- a/libavfilter/avf_showspectrum.c
+++ b/libavfilter/avf_showspectrum.c
@@ -45,8 +45,9 @@
 
 enum DisplayMode  { COMBINED, SEPARATE, NB_MODES };
 enum DataMode     { D_MAGNITUDE, D_PHASE, NB_DMODES };
+enum FrequencyScale { F_LINEAR, F_LOG, NB_FSCALES };
 enum DisplayScale { LINEAR, SQRT, CBRT, LOG, FOURTHRT, FIFTHRT, NB_SCALES };
-enum ColorMode    { CHANNEL, INTENSITY, RAINBOW, MORELAND, NEBULAE, FIRE, FIERY, FRUIT, COOL, MAGMA, GREEN, NB_CLMODES };
+enum ColorMode    { CHANNEL, INTENSITY, RAINBOW, MORELAND, NEBULAE, FIRE, FIERY, FRUIT, COOL, MAGMA, GREEN, VIRIDIS, PLASMA, CIVIDIS, TERRAIN, NB_CLMODES };
 enum SlideMode    { REPLACE, SCROLL, FULLFRAME, RSCROLL, NB_SLIDES };
 enum Orientation  { VERTICAL, HORIZONTAL, NB_ORIENTATIONS };
 
@@ -65,6 +66,7 @@
     int mode;                   ///< channel display mode
     int color_mode;             ///< display color scheme
     int scale;
+    int fscale;
     float saturation;           ///< color saturation multiplier
     float rotation;             ///< color rotation
     int start, stop;            ///< zoom mode
@@ -95,6 +97,7 @@
     int single_pic;
     int legend;
     int start_x, start_y;
+    int (*plot_channel)(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs);
 } ShowSpectrumContext;
 
 #define OFFSET(x) offsetof(ShowSpectrumContext, x)
@@ -123,6 +126,10 @@
         { "cool",      "cool based coloring",             0, AV_OPT_TYPE_CONST, {.i64=COOL},      0, 0, FLAGS, "color" },
         { "magma",     "magma based coloring",            0, AV_OPT_TYPE_CONST, {.i64=MAGMA},     0, 0, FLAGS, "color" },
         { "green",     "green based coloring",            0, AV_OPT_TYPE_CONST, {.i64=GREEN},     0, 0, FLAGS, "color" },
+        { "viridis",   "viridis based coloring",          0, AV_OPT_TYPE_CONST, {.i64=VIRIDIS},   0, 0, FLAGS, "color" },
+        { "plasma",    "plasma based coloring",           0, AV_OPT_TYPE_CONST, {.i64=PLASMA},    0, 0, FLAGS, "color" },
+        { "cividis",   "cividis based coloring",          0, AV_OPT_TYPE_CONST, {.i64=CIVIDIS},   0, 0, FLAGS, "color" },
+        { "terrain",   "terrain based coloring",          0, AV_OPT_TYPE_CONST, {.i64=TERRAIN},   0, 0, FLAGS, "color" },
     { "scale", "set display scale", OFFSET(scale), AV_OPT_TYPE_INT, {.i64=SQRT}, LINEAR, NB_SCALES-1, FLAGS, "scale" },
         { "lin",  "linear",      0, AV_OPT_TYPE_CONST, {.i64=LINEAR}, 0, 0, FLAGS, "scale" },
         { "sqrt", "square root", 0, AV_OPT_TYPE_CONST, {.i64=SQRT},   0, 0, FLAGS, "scale" },
@@ -130,6 +137,9 @@
         { "log",  "logarithmic", 0, AV_OPT_TYPE_CONST, {.i64=LOG},    0, 0, FLAGS, "scale" },
         { "4thrt","4th root",    0, AV_OPT_TYPE_CONST, {.i64=FOURTHRT}, 0, 0, FLAGS, "scale" },
         { "5thrt","5th root",    0, AV_OPT_TYPE_CONST, {.i64=FIFTHRT},  0, 0, FLAGS, "scale" },
+    { "fscale", "set frequency scale", OFFSET(fscale), AV_OPT_TYPE_INT, {.i64=F_LINEAR}, 0, NB_FSCALES-1, FLAGS, "fscale" },
+        { "lin",  "linear",      0, AV_OPT_TYPE_CONST, {.i64=F_LINEAR}, 0, 0, FLAGS, "fscale" },
+        { "log",  "logarithmic", 0, AV_OPT_TYPE_CONST, {.i64=F_LOG},    0, 0, FLAGS, "fscale" },
     { "saturation", "color saturation multiplier", OFFSET(saturation), AV_OPT_TYPE_FLOAT, {.dbl = 1}, -10, 10, FLAGS },
     { "win_func", "set window function", OFFSET(win_func), AV_OPT_TYPE_INT, {.i64 = WFUNC_HANNING}, 0, NB_WFUNC-1, FLAGS, "win_func" },
         { "rect",     "Rectangular",      0, AV_OPT_TYPE_CONST, {.i64=WFUNC_RECT},     0, 0, FLAGS, "win_func" },
@@ -152,6 +162,7 @@
         { "cauchy",   "Cauchy",           0, AV_OPT_TYPE_CONST, {.i64=WFUNC_CAUCHY},   0, 0, FLAGS, "win_func" },
         { "parzen",   "Parzen",           0, AV_OPT_TYPE_CONST, {.i64=WFUNC_PARZEN},   0, 0, FLAGS, "win_func" },
         { "poisson",  "Poisson",          0, AV_OPT_TYPE_CONST, {.i64=WFUNC_POISSON},  0, 0, FLAGS, "win_func" },
+        { "bohman",   "Bohman",           0, AV_OPT_TYPE_CONST, {.i64=WFUNC_BOHMAN},   0, 0, FLAGS, "win_func" },
     { "orientation", "set orientation", OFFSET(orientation), AV_OPT_TYPE_INT, {.i64=VERTICAL}, 0, NB_ORIENTATIONS-1, FLAGS, "orientation" },
         { "vertical",   NULL, 0, AV_OPT_TYPE_CONST, {.i64=VERTICAL},   0, 0, FLAGS, "orientation" },
         { "horizontal", NULL, 0, AV_OPT_TYPE_CONST, {.i64=HORIZONTAL}, 0, 0, FLAGS, "orientation" },
@@ -247,12 +258,43 @@
     { 0.35,            85/256.,     (138-128)/256.,      (179-128)/256. },
     { 0.48,            96/256.,     (128-128)/256.,      (189-128)/256. },
     { 0.64,           128/256.,     (103-128)/256.,      (214-128)/256. },
-    { 0.78,           167/256.,      (85-128)/256.,      (174-128)/256. },
-    {    1,           205/256.,      (80-128)/256.,      (152-128)/256. }},
+    { 0.92,           205/256.,      (80-128)/256.,      (152-128)/256. },
+    {    1,                  1,                  0,                   0 }},
     [GREEN] = {
     {    0,                  0,                  0,                   0 },
     {  .75,                 .5,                  0,                 -.5 },
     {    1,                  1,                  0,                   0 }},
+    [VIRIDIS] = {
+    {    0,                  0,                  0,                   0 },
+    { 0.10,          0x39/255.,   (0x9D -128)/255.,    (0x8F -128)/255. },
+    { 0.23,          0x5C/255.,   (0x9A -128)/255.,    (0x68 -128)/255. },
+    { 0.35,          0x69/255.,   (0x93 -128)/255.,    (0x57 -128)/255. },
+    { 0.48,          0x76/255.,   (0x88 -128)/255.,    (0x4B -128)/255. },
+    { 0.64,          0x8A/255.,   (0x72 -128)/255.,    (0x4F -128)/255. },
+    { 0.80,          0xA3/255.,   (0x50 -128)/255.,    (0x66 -128)/255. },
+    {    1,          0xCC/255.,   (0x2F -128)/255.,    (0x87 -128)/255. }},
+    [PLASMA] = {
+    {    0,                  0,                  0,                   0 },
+    { 0.10,          0x27/255.,   (0xC2 -128)/255.,    (0x82 -128)/255. },
+    { 0.58,          0x5B/255.,   (0x9A -128)/255.,    (0xAE -128)/255. },
+    { 0.70,          0x89/255.,   (0x44 -128)/255.,    (0xAB -128)/255. },
+    { 0.80,          0xB4/255.,   (0x2B -128)/255.,    (0x9E -128)/255. },
+    { 0.91,          0xD2/255.,   (0x38 -128)/255.,    (0x92 -128)/255. },
+    {    1,                  1,                  0,                  0. }},
+    [CIVIDIS] = {
+    {    0,                  0,                  0,                   0 },
+    { 0.20,          0x28/255.,   (0x98 -128)/255.,    (0x6F -128)/255. },
+    { 0.50,          0x48/255.,   (0x95 -128)/255.,    (0x74 -128)/255. },
+    { 0.63,          0x69/255.,   (0x84 -128)/255.,    (0x7F -128)/255. },
+    { 0.76,          0x89/255.,   (0x75 -128)/255.,    (0x84 -128)/255. },
+    { 0.90,          0xCE/255.,   (0x35 -128)/255.,    (0x95 -128)/255. },
+    {    1,                  1,                  0,                  0. }},
+    [TERRAIN] = {
+    {    0,                  0,                  0,                   0 },
+    { 0.15,                  0,                 .5,                   0 },
+    { 0.60,                  1,                -.5,                 -.5 },
+    { 0.85,                  1,                -.5,                  .5 },
+    {    1,                  1,                  0,                   0 }},
 };
 
 static av_cold void uninit(AVFilterContext *ctx)
@@ -350,29 +392,29 @@
     }
 
     if (s->stop) {
-        double theta, phi, psi, a, b, S, c;
+        float theta, phi, psi, a, b, S, c;
         FFTComplex *g = s->fft_data[ch];
         FFTComplex *h = s->fft_scratch[ch];
         int L = s->buf_size;
         int N = s->win_size;
         int M = s->win_size / 2;
 
-        phi = 2.0 * M_PI * (s->stop - s->start) / (double)inlink->sample_rate / (M - 1);
-        theta = 2.0 * M_PI * s->start / (double)inlink->sample_rate;
+        phi = 2.f * M_PI * (s->stop - s->start) / (float)inlink->sample_rate / (M - 1);
+        theta = 2.f * M_PI * s->start / (float)inlink->sample_rate;
 
         for (int n = 0; n < M; n++) {
-            h[n].re = cos(n * n / 2.0 * phi);
-            h[n].im = sin(n * n / 2.0 * phi);
+            h[n].re = cosf(n * n / 2.f * phi);
+            h[n].im = sinf(n * n / 2.f * phi);
         }
 
         for (int n = M; n < L; n++) {
-            h[n].re = 0.0;
-            h[n].im = 0.0;
+            h[n].re = 0.f;
+            h[n].im = 0.f;
         }
 
         for (int n = L - N; n < L; n++) {
-            h[n].re = cos((L - n) * (L - n) / 2.0 * phi);
-            h[n].im = sin((L - n) * (L - n) / 2.0 * phi);
+            h[n].re = cosf((L - n) * (L - n) / 2.f * phi);
+            h[n].im = sinf((L - n) * (L - n) / 2.f * phi);
         }
 
         for (int n = 0; n < N; n++) {
@@ -381,14 +423,14 @@
         }
 
         for (int n = N; n < L; n++) {
-            g[n].re = 0.;
-            g[n].im = 0.;
+            g[n].re = 0.f;
+            g[n].im = 0.f;
         }
 
         for (int n = 0; n < N; n++) {
-            psi = n * theta + n * n / 2.0 * phi;
-            c =  cos(psi);
-            S = -sin(psi);
+            psi = n * theta + n * n / 2.f * phi;
+            c =  cosf(psi);
+            S = -sinf(psi);
             a = c * g[n].re - S * g[n].im;
             b = S * g[n].re + c * g[n].im;
             g[n].re = a;
@@ -415,9 +457,9 @@
         av_fft_calc(s->ifft[ch], g);
 
         for (int k = 0; k < M; k++) {
-            psi = k * k / 2.0 * phi;
-            c =  cos(psi);
-            S = -sin(psi);
+            psi = k * k / 2.f * phi;
+            c =  cosf(psi);
+            S = -sinf(psi);
             a = c * g[k].re - S * g[k].im;
             b = S * g[k].re + c * g[k].im;
             s->fft_data[ch][k].re = a;
@@ -482,6 +524,10 @@
         case FRUIT:
         case COOL:
         case GREEN:
+        case VIRIDIS:
+        case PLASMA:
+        case CIVIDIS:
+        case TERRAIN:
         case MAGMA:
         case INTENSITY:
             *uf = *yf;
@@ -509,15 +555,15 @@
 
     if (s->color_mode == CHANNEL) {
         if (s->nb_display_channels > 1) {
-            *uf *= 0.5 * sin((2 * M_PI * ch) / s->nb_display_channels + M_PI * s->rotation);
-            *vf *= 0.5 * cos((2 * M_PI * ch) / s->nb_display_channels + M_PI * s->rotation);
+            *uf *= 0.5f * sinf((2 * M_PI * ch) / s->nb_display_channels + M_PI * s->rotation);
+            *vf *= 0.5f * cosf((2 * M_PI * ch) / s->nb_display_channels + M_PI * s->rotation);
         } else {
-            *uf *= 0.5 * sin(M_PI * s->rotation);
-            *vf *= 0.5 * cos(M_PI * s->rotation + M_PI_2);
+            *uf *= 0.5f * sinf(M_PI * s->rotation);
+            *vf *= 0.5f * cosf(M_PI * s->rotation + M_PI_2);
         }
     } else {
-        *uf += *uf * sin(M_PI * s->rotation);
-        *vf += *vf * cos(M_PI * s->rotation + M_PI_2);
+        *uf += *uf * sinf(M_PI * s->rotation);
+        *vf += *vf * cosf(M_PI * s->rotation + M_PI_2);
     }
 
     *uf *= s->saturation;
@@ -583,6 +629,56 @@
     return units;
 }
 
+static float log_scale(const float value, const float min, const float max)
+{
+    if (value < min)
+        return min;
+    if (value > max)
+        return max;
+
+    {
+        const float b = logf(max / min) / (max - min);
+        const float a = max / expf(max * b);
+
+        return expf(value * b) * a;
+    }
+}
+
+static float get_log_hz(const int bin, const int num_bins, const float sample_rate)
+{
+    const float max_freq = sample_rate / 2;
+    const float hz_per_bin = max_freq / num_bins;
+    const float freq = hz_per_bin * bin;
+    const float scaled_freq = log_scale(freq + 1, 21, max_freq) - 1;
+
+    return num_bins * scaled_freq / max_freq;
+}
+
+static float inv_log_scale(const float value, const float min, const float max)
+{
+    if (value < min)
+        return min;
+    if (value > max)
+        return max;
+
+    {
+        const float b = logf(max / min) / (max - min);
+        const float a = max / expf(max * b);
+
+        return logf(value / a) / b;
+    }
+}
+
+static float bin_pos(const int bin, const int num_bins, const float sample_rate)
+{
+    const float max_freq = sample_rate / 2;
+    const float hz_per_bin = max_freq / num_bins;
+    const float freq = hz_per_bin * bin;
+    const float scaled_freq = inv_log_scale(freq + 1, 21, max_freq) - 1;
+
+    return num_bins * scaled_freq / max_freq;
+}
+
 static int draw_legend(AVFilterContext *ctx, int samples)
 {
     ShowSpectrumContext *s = ctx->priv;
@@ -599,17 +695,20 @@
                                  inlink->channel_layout);
 
     text = av_asprintf("%d Hz | %s", inlink->sample_rate, chlayout_str);
+    if (!text)
+        return AVERROR(ENOMEM);
 
     drawtext(s->outpicref, 2, outlink->h - 10, "CREATED BY LIBAVFILTER", 0);
     drawtext(s->outpicref, outlink->w - 2 - strlen(text) * 10, outlink->h - 10, text, 0);
+    av_freep(&text);
     if (s->stop) {
-        char *text = av_asprintf("Zoom: %d Hz - %d Hz", s->start, s->stop);
+        text = av_asprintf("Zoom: %d Hz - %d Hz", s->start, s->stop);
+        if (!text)
+            return AVERROR(ENOMEM);
         drawtext(s->outpicref, outlink->w - 2 - strlen(text) * 10, 3, text, 0);
         av_freep(&text);
     }
 
-    av_freep(&text);
-
     dst = s->outpicref->data[0] + (s->start_y - 1) * s->outpicref->linesize[0] + s->start_x - 1;
     for (x = 0; x < s->w + 1; x++)
         dst[x] = 200;
@@ -651,7 +750,8 @@
             }
             for (y = 0; y < h; y += 40) {
                 float range = s->stop ? s->stop - s->start : inlink->sample_rate / 2;
-                float hertz = s->start + y * range / (float)(1 << (int)ceil(log2(h)));
+                float bin = s->fscale == F_LINEAR ? y : get_log_hz(y, h, inlink->sample_rate);
+                float hertz = s->start + bin * range / (float)(1 << (int)ceil(log2(h)));
                 char *units;
 
                 if (hertz == 0)
@@ -669,6 +769,8 @@
         for (x = 0; x < s->w && s->single_pic; x+=80) {
             float seconds = x * spp / inlink->sample_rate;
             char *units = get_time(ctx, seconds, x);
+            if (!units)
+                return AVERROR(ENOMEM);
 
             drawtext(s->outpicref, s->start_x + x - 4 * strlen(units), s->h + s->start_y + 6, units, 0);
             drawtext(s->outpicref, s->start_x + x - 4 * strlen(units), s->start_y - 12, units, 0);
@@ -706,7 +808,8 @@
             }
             for (x = 0; x < w - 79; x += 80) {
                 float range = s->stop ? s->stop - s->start : inlink->sample_rate / 2;
-                float hertz = s->start + x * range / (float)(1 << (int)ceil(log2(w)));
+                float bin = s->fscale == F_LINEAR ? x : get_log_hz(x, w, inlink->sample_rate);
+                float hertz = s->start + bin * range / (float)(1 << (int)ceil(log2(w)));
                 char *units;
 
                 if (hertz == 0)
@@ -724,6 +827,8 @@
         for (y = 0; y < s->h && s->single_pic; y+=40) {
             float seconds = y * spp / inlink->sample_rate;
             char *units = get_time(ctx, seconds, x);
+            if (!units)
+                return AVERROR(ENOMEM);
 
             drawtext(s->outpicref, s->start_x - 8 * strlen(units) - 4, s->start_y + y - 4, units, 0);
             av_free(units);
@@ -756,7 +861,7 @@
         }
 
         for (y = 0; ch == 0 && y < h; y += h / 10) {
-            float value = 120.0 * log10(1. - y / (float)h);
+            float value = 120.f * log10f(1.f - y / (float)h);
             char *text;
 
             if (value < -120)
@@ -772,6 +877,110 @@
     return 0;
 }
 
+static float get_value(AVFilterContext *ctx, int ch, int y)
+{
+    ShowSpectrumContext *s = ctx->priv;
+    float *magnitudes = s->magnitudes[ch];
+    float *phases = s->phases[ch];
+    float a;
+
+    switch (s->data) {
+    case D_MAGNITUDE:
+        /* get magnitude */
+        a = magnitudes[y];
+        break;
+    case D_PHASE:
+        /* get phase */
+        a = phases[y];
+        break;
+    default:
+        av_assert0(0);
+    }
+
+    /* apply scale */
+    switch (s->scale) {
+    case LINEAR:
+        a = av_clipf(a, 0, 1);
+        break;
+    case SQRT:
+        a = av_clipf(sqrtf(a), 0, 1);
+        break;
+    case CBRT:
+        a = av_clipf(cbrtf(a), 0, 1);
+        break;
+    case FOURTHRT:
+        a = av_clipf(sqrtf(sqrtf(a)), 0, 1);
+        break;
+    case FIFTHRT:
+        a = av_clipf(powf(a, 0.20), 0, 1);
+        break;
+    case LOG:
+        a = 1.f + log10f(av_clipf(a, 1e-6, 1)) / 6.f; // zero = -120dBFS
+        break;
+    default:
+        av_assert0(0);
+    }
+
+    return a;
+}
+
+static int plot_channel_lin(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
+{
+    ShowSpectrumContext *s = ctx->priv;
+    const int h = s->orientation == VERTICAL ? s->channel_height : s->channel_width;
+    const int ch = jobnr;
+    float yf, uf, vf;
+    int y;
+
+    /* decide color range */
+    color_range(s, ch, &yf, &uf, &vf);
+
+    /* draw the channel */
+    for (y = 0; y < h; y++) {
+        int row = (s->mode == COMBINED) ? y : ch * h + y;
+        float *out = &s->color_buffer[ch][3 * row];
+        float a = get_value(ctx, ch, y);
+
+        pick_color(s, yf, uf, vf, a, out);
+    }
+
+    return 0;
+}
+
+static int plot_channel_log(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
+{
+    ShowSpectrumContext *s = ctx->priv;
+    AVFilterLink *inlink = ctx->inputs[0];
+    const int h = s->orientation == VERTICAL ? s->channel_height : s->channel_width;
+    const int ch = jobnr;
+    float y, yf, uf, vf;
+    int yy = 0;
+
+    /* decide color range */
+    color_range(s, ch, &yf, &uf, &vf);
+
+    /* draw the channel */
+    for (y = 0; y < h && yy < h; yy++) {
+        float pos0 = bin_pos(yy+0, h, inlink->sample_rate);
+        float pos1 = bin_pos(yy+1, h, inlink->sample_rate);
+        float delta = pos1 - pos0;
+        float a0, a1;
+
+        a0 = get_value(ctx, ch, yy+0);
+        a1 = get_value(ctx, ch, FFMIN(yy+1, h-1));
+        for (float j = pos0; j < pos1 && y + j - pos0 < h; j++) {
+            float row = (s->mode == COMBINED) ? y + j - pos0 : ch * h + y + j - pos0;
+            float *out = &s->color_buffer[ch][3 * FFMIN(lrintf(row), h-1)];
+            float lerpfrac = (j - pos0) / delta;
+
+            pick_color(s, yf, uf, vf, lerpfrac * a1 + (1.f-lerpfrac) * a0, out);
+        }
+        y += delta;
+    }
+
+    return 0;
+}
+
 static int config_output(AVFilterLink *outlink)
 {
     AVFilterContext *ctx = outlink->src;
@@ -780,6 +989,12 @@
     int i, fft_bits, h, w;
     float overlap;
 
+    switch (s->fscale) {
+    case F_LINEAR: s->plot_channel = plot_channel_lin; break;
+    case F_LOG:    s->plot_channel = plot_channel_log; break;
+    default: return AVERROR_BUG;
+    }
+
     s->stop = FFMIN(s->stop, inlink->sample_rate / 2);
     if (s->stop && s->stop <= s->start) {
         av_log(ctx, AV_LOG_ERROR, "Stop frequency should be greater than start.\n");
@@ -920,7 +1135,7 @@
         generate_window_func(s->window_func_lut, s->win_size, s->win_func, &overlap);
         if (s->overlap == 1)
             s->overlap = overlap;
-        s->hop_size = (1. - s->overlap) * s->win_size;
+        s->hop_size = (1.f - s->overlap) * s->win_size;
         if (s->hop_size < 1) {
             av_log(ctx, AV_LOG_ERROR, "overlap %f too big\n", s->overlap);
             return AVERROR(EINVAL);
@@ -929,7 +1144,7 @@
         for (s->win_scale = 0, i = 0; i < s->win_size; i++) {
             s->win_scale += s->window_func_lut[i] * s->window_func_lut[i];
         }
-        s->win_scale = 1. / sqrt(s->win_scale);
+        s->win_scale = 1.f / sqrtf(s->win_scale);
 
         /* prepare the initial picref buffer (black frame) */
         av_frame_free(&s->outpicref);
@@ -990,8 +1205,8 @@
 
 #define RE(y, ch) s->fft_data[ch][y].re
 #define IM(y, ch) s->fft_data[ch][y].im
-#define MAGNITUDE(y, ch) hypot(RE(y, ch), IM(y, ch))
-#define PHASE(y, ch) atan2(IM(y, ch), RE(y, ch))
+#define MAGNITUDE(y, ch) hypotf(RE(y, ch), IM(y, ch))
+#define PHASE(y, ch) atan2f(IM(y, ch), RE(y, ch))
 
 static int calc_channel_magnitudes(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
 {
@@ -1059,68 +1274,6 @@
     }
 }
 
-static int plot_channel(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
-{
-    ShowSpectrumContext *s = ctx->priv;
-    const int h = s->orientation == VERTICAL ? s->channel_height : s->channel_width;
-    const int ch = jobnr;
-    float *magnitudes = s->magnitudes[ch];
-    float *phases = s->phases[ch];
-    float yf, uf, vf;
-    int y;
-
-    /* decide color range */
-    color_range(s, ch, &yf, &uf, &vf);
-
-    /* draw the channel */
-    for (y = 0; y < h; y++) {
-        int row = (s->mode == COMBINED) ? y : ch * h + y;
-        float *out = &s->color_buffer[ch][3 * row];
-        float a;
-
-        switch (s->data) {
-        case D_MAGNITUDE:
-            /* get magnitude */
-            a = magnitudes[y];
-            break;
-        case D_PHASE:
-            /* get phase */
-            a = phases[y];
-            break;
-        default:
-            av_assert0(0);
-        }
-
-        /* apply scale */
-        switch (s->scale) {
-        case LINEAR:
-            a = av_clipf(a, 0, 1);
-            break;
-        case SQRT:
-            a = av_clipf(sqrt(a), 0, 1);
-            break;
-        case CBRT:
-            a = av_clipf(cbrt(a), 0, 1);
-            break;
-        case FOURTHRT:
-            a = av_clipf(sqrt(sqrt(a)), 0, 1);
-            break;
-        case FIFTHRT:
-            a = av_clipf(pow(a, 0.20), 0, 1);
-            break;
-        case LOG:
-            a = 1 + log10(av_clipd(a, 1e-6, 1)) / 6; // zero = -120dBFS
-            break;
-        default:
-            av_assert0(0);
-        }
-
-        pick_color(s, yf, uf, vf, a, out);
-    }
-
-    return 0;
-}
-
 static int plot_spectrum_column(AVFilterLink *inlink, AVFrame *insamples)
 {
     AVFilterContext *ctx = inlink->dst;
@@ -1133,7 +1286,7 @@
     /* initialize buffer for combining to black */
     clear_combine_buffer(s, z);
 
-    ctx->internal->execute(ctx, plot_channel, NULL, NULL, s->nb_display_channels);
+    ctx->internal->execute(ctx, s->plot_channel, NULL, NULL, s->nb_display_channels);
 
     for (y = 0; y < z * 3; y++) {
         for (x = 0; x < s->nb_display_channels; x++) {
@@ -1212,8 +1365,12 @@
         s->xpos = 0;
     if (!s->single_pic && (s->sliding != FULLFRAME || s->xpos == 0)) {
         if (s->old_pts < outpicref->pts) {
+            AVFrame *clone;
+
             if (s->legend) {
                 char *units = get_time(ctx, insamples->pts /(float)inlink->sample_rate, x);
+                if (!units)
+                    return AVERROR(ENOMEM);
 
                 if (s->orientation == VERTICAL) {
                     for (y = 0; y < 10; y++) {
@@ -1238,7 +1395,10 @@
                 av_free(units);
             }
             s->old_pts = outpicref->pts;
-            ret = ff_filter_frame(outlink, av_frame_clone(s->outpicref));
+            clone = av_frame_clone(s->outpicref);
+            if (!clone)
+                return AVERROR(ENOMEM);
+            ret = ff_filter_frame(outlink, clone);
             if (ret < 0)
                 return ret;
             return 0;
@@ -1396,6 +1556,10 @@
         { "cool",      "cool based coloring",             0, AV_OPT_TYPE_CONST, {.i64=COOL},      0, 0, FLAGS, "color" },
         { "magma",     "magma based coloring",            0, AV_OPT_TYPE_CONST, {.i64=MAGMA},     0, 0, FLAGS, "color" },
         { "green",     "green based coloring",            0, AV_OPT_TYPE_CONST, {.i64=GREEN},     0, 0, FLAGS, "color" },
+        { "viridis",   "viridis based coloring",          0, AV_OPT_TYPE_CONST, {.i64=VIRIDIS},   0, 0, FLAGS, "color" },
+        { "plasma",    "plasma based coloring",           0, AV_OPT_TYPE_CONST, {.i64=PLASMA},    0, 0, FLAGS, "color" },
+        { "cividis",   "cividis based coloring",          0, AV_OPT_TYPE_CONST, {.i64=CIVIDIS},   0, 0, FLAGS, "color" },
+        { "terrain",   "terrain based coloring",          0, AV_OPT_TYPE_CONST, {.i64=TERRAIN},   0, 0, FLAGS, "color" },
     { "scale", "set display scale", OFFSET(scale), AV_OPT_TYPE_INT, {.i64=LOG}, 0, NB_SCALES-1, FLAGS, "scale" },
         { "lin",  "linear",      0, AV_OPT_TYPE_CONST, {.i64=LINEAR}, 0, 0, FLAGS, "scale" },
         { "sqrt", "square root", 0, AV_OPT_TYPE_CONST, {.i64=SQRT},   0, 0, FLAGS, "scale" },
@@ -1403,6 +1567,9 @@
         { "log",  "logarithmic", 0, AV_OPT_TYPE_CONST, {.i64=LOG},    0, 0, FLAGS, "scale" },
         { "4thrt","4th root",    0, AV_OPT_TYPE_CONST, {.i64=FOURTHRT}, 0, 0, FLAGS, "scale" },
         { "5thrt","5th root",    0, AV_OPT_TYPE_CONST, {.i64=FIFTHRT},  0, 0, FLAGS, "scale" },
+    { "fscale", "set frequency scale", OFFSET(fscale), AV_OPT_TYPE_INT, {.i64=F_LINEAR}, 0, NB_FSCALES-1, FLAGS, "fscale" },
+        { "lin",  "linear",      0, AV_OPT_TYPE_CONST, {.i64=F_LINEAR}, 0, 0, FLAGS, "fscale" },
+        { "log",  "logarithmic", 0, AV_OPT_TYPE_CONST, {.i64=F_LOG},    0, 0, FLAGS, "fscale" },
     { "saturation", "color saturation multiplier", OFFSET(saturation), AV_OPT_TYPE_FLOAT, {.dbl = 1}, -10, 10, FLAGS },
     { "win_func", "set window function", OFFSET(win_func), AV_OPT_TYPE_INT, {.i64 = WFUNC_HANNING}, 0, NB_WFUNC-1, FLAGS, "win_func" },
         { "rect",     "Rectangular",      0, AV_OPT_TYPE_CONST, {.i64=WFUNC_RECT},     0, 0, FLAGS, "win_func" },
@@ -1425,6 +1592,7 @@
         { "cauchy",   "Cauchy",           0, AV_OPT_TYPE_CONST, {.i64=WFUNC_CAUCHY},   0, 0, FLAGS, "win_func" },
         { "parzen",   "Parzen",           0, AV_OPT_TYPE_CONST, {.i64=WFUNC_PARZEN},   0, 0, FLAGS, "win_func" },
         { "poisson",  "Poisson",          0, AV_OPT_TYPE_CONST, {.i64=WFUNC_POISSON},  0, 0, FLAGS, "win_func" },
+        { "bohman",   "Bohman",           0, AV_OPT_TYPE_CONST, {.i64=WFUNC_BOHMAN},   0, 0, FLAGS, "win_func" },
     { "orientation", "set orientation", OFFSET(orientation), AV_OPT_TYPE_INT, {.i64=VERTICAL}, 0, NB_ORIENTATIONS-1, FLAGS, "orientation" },
         { "vertical",   NULL, 0, AV_OPT_TYPE_CONST, {.i64=VERTICAL},   0, 0, FLAGS, "orientation" },
         { "horizontal", NULL, 0, AV_OPT_TYPE_CONST, {.i64=HORIZONTAL}, 0, 0, FLAGS, "orientation" },
@@ -1485,7 +1653,7 @@
             if (consumed >= spb) {
                 int h = s->orientation == VERTICAL ? s->h : s->w;
 
-                scale_magnitudes(s, 1. / (consumed / spf));
+                scale_magnitudes(s, 1.f / (consumed / spf));
                 plot_spectrum_column(inlink, fin);
                 consumed = 0;
                 x++;
diff --git a/libavfilter/avf_showvolume.c b/libavfilter/avf_showvolume.c
index 6b553c4..7ab2fcf 100644
--- a/libavfilter/avf_showvolume.c
+++ b/libavfilter/avf_showvolume.c
@@ -26,6 +26,7 @@
 #include "libavutil/parseutils.h"
 #include "libavutil/xga_font_data.h"
 #include "avfilter.h"
+#include "filters.h"
 #include "formats.h"
 #include "audio.h"
 #include "video.h"
@@ -47,6 +48,7 @@
     float bgopacity;
     int mode;
 
+    int nb_samples;
     AVFrame *out;
     AVExpr *c_expr;
     int draw_text;
@@ -80,7 +82,7 @@
     { "t", "display channel names", OFFSET(draw_text), AV_OPT_TYPE_BOOL, {.i64=1}, 0, 1, FLAGS },
     { "v", "display volume value", OFFSET(draw_volume), AV_OPT_TYPE_BOOL, {.i64=1}, 0, 1, FLAGS },
     { "dm", "duration for max value display", OFFSET(draw_persistent_duration), AV_OPT_TYPE_DOUBLE, {.dbl=0.}, 0, 9000, FLAGS},
-    { "dmc","set color of the max value line", OFFSET(persistant_max_rgba), AV_OPT_TYPE_COLOR, {.str = "orange"}, CHAR_MIN, CHAR_MAX, FLAGS },
+    { "dmc","set color of the max value line", OFFSET(persistant_max_rgba), AV_OPT_TYPE_COLOR, {.str = "orange"}, 0, 0, FLAGS },
     { "o", "set orientation", OFFSET(orientation), AV_OPT_TYPE_INT, {.i64=0}, 0, 1, FLAGS, "orientation" },
     {   "h", "horizontal", 0, AV_OPT_TYPE_CONST, {.i64=0}, 0, 0, FLAGS, "orientation" },
     {   "v", "vertical",   0, AV_OPT_TYPE_CONST, {.i64=1}, 0, 0, FLAGS, "orientation" },
@@ -162,12 +164,8 @@
 {
     AVFilterContext *ctx = inlink->dst;
     ShowVolumeContext *s = ctx->priv;
-    int nb_samples;
 
-    nb_samples = FFMAX(1024, ((double)inlink->sample_rate / av_q2d(s->frame_rate)) + 0.5);
-    inlink->partial_buf_size =
-    inlink->min_samples =
-    inlink->max_samples = nb_samples;
+    s->nb_samples = FFMAX(1, av_rescale(inlink->sample_rate, s->frame_rate.den, s->frame_rate.num));
     s->values = av_calloc(inlink->channels * VAR_VARS_NB, sizeof(double));
     if (!s->values)
         return AVERROR(ENOMEM);
@@ -449,6 +447,28 @@
     return ff_filter_frame(outlink, out);
 }
 
+static int activate(AVFilterContext *ctx)
+{
+    AVFilterLink *inlink = ctx->inputs[0];
+    AVFilterLink *outlink = ctx->outputs[0];
+    ShowVolumeContext *s = ctx->priv;
+    AVFrame *in = NULL;
+    int ret;
+
+    FF_FILTER_FORWARD_STATUS_BACK(outlink, inlink);
+
+    ret = ff_inlink_consume_samples(inlink, s->nb_samples, s->nb_samples, &in);
+    if (ret < 0)
+        return ret;
+    if (ret > 0)
+        return filter_frame(inlink, in);
+
+    FF_FILTER_FORWARD_STATUS(inlink, outlink);
+    FF_FILTER_FORWARD_WANTED(outlink, inlink);
+
+    return FFERROR_NOT_READY;
+}
+
 static av_cold void uninit(AVFilterContext *ctx)
 {
     ShowVolumeContext *s = ctx->priv;
@@ -465,7 +485,6 @@
         .name         = "default",
         .type         = AVMEDIA_TYPE_AUDIO,
         .config_props = config_input,
-        .filter_frame = filter_frame,
     },
     { NULL }
 };
@@ -483,6 +502,7 @@
     .name          = "showvolume",
     .description   = NULL_IF_CONFIG_SMALL("Convert input audio volume to video output."),
     .init          = init,
+    .activate      = activate,
     .uninit        = uninit,
     .query_formats = query_formats,
     .priv_size     = sizeof(ShowVolumeContext),
diff --git a/libavfilter/avf_showwaves.c b/libavfilter/avf_showwaves.c
index bb7f4ea..afe05fb 100644
--- a/libavfilter/avf_showwaves.c
+++ b/libavfilter/avf_showwaves.c
@@ -29,6 +29,7 @@
 #include "libavutil/opt.h"
 #include "libavutil/parseutils.h"
 #include "avfilter.h"
+#include "filters.h"
 #include "formats.h"
 #include "audio.h"
 #include "video.h"
@@ -416,7 +417,7 @@
         showwaves->n = 1;
 
     if (!showwaves->n)
-        showwaves->n = FFMAX(1, ((double)inlink->sample_rate / (showwaves->w * av_q2d(showwaves->rate))) + 0.5);
+        showwaves->n = FFMAX(1, av_rescale_q(inlink->sample_rate, av_make_q(1, showwaves->w), showwaves->rate));
 
     showwaves->buf_idx = 0;
     if (!(showwaves->buf_idy = av_mallocz_array(nb_channels, sizeof(*showwaves->buf_idy)))) {
@@ -559,7 +560,9 @@
     AVFilterContext *ctx = outlink->src;
     AVFilterLink *inlink = ctx->inputs[0];
     ShowWavesContext *showwaves = ctx->priv;
-    int64_t n = 0, max_samples = showwaves->total_samples / outlink->w;
+    int64_t n = 0, column_max_samples = showwaves->total_samples / outlink->w;
+    int64_t remaining_samples = showwaves->total_samples - (column_max_samples * outlink->w);
+    int64_t last_column_samples = column_max_samples + remaining_samples;
     AVFrame *out = showwaves->outpicref;
     struct frame_node *node;
     const int nb_channels = inlink->channels;
@@ -569,12 +572,12 @@
     int col = 0;
     int64_t *sum = showwaves->sum;
 
-    if (max_samples == 0) {
+    if (column_max_samples == 0) {
         av_log(ctx, AV_LOG_ERROR, "Too few samples\n");
         return AVERROR(EINVAL);
     }
 
-    av_log(ctx, AV_LOG_DEBUG, "Create frame averaging %"PRId64" samples per column\n", max_samples);
+    av_log(ctx, AV_LOG_DEBUG, "Create frame averaging %"PRId64" samples per column\n", column_max_samples);
 
     memset(sum, 0, nb_channels);
 
@@ -584,11 +587,13 @@
         const int16_t *p = (const int16_t *)frame->data[0];
 
         for (i = 0; i < frame->nb_samples; i++) {
+            int64_t max_samples = col == outlink->w - 1 ? last_column_samples: column_max_samples;
             int ch;
 
             for (ch = 0; ch < nb_channels; ch++)
                 sum[ch] += abs(p[ch + i*nb_channels]) << 1;
-            if (n++ == max_samples) {
+            n++;
+            if (n == max_samples) {
                 for (ch = 0; ch < nb_channels; ch++) {
                     int16_t sample = sum[ch] / max_samples;
                     uint8_t *buf = out->data[0] + col * pixstep;
@@ -702,7 +707,8 @@
             showwaves->sample_count_mod = 0;
             showwaves->buf_idx++;
         }
-        if (showwaves->buf_idx == showwaves->w)
+        if (showwaves->buf_idx == showwaves->w ||
+            (ff_outlink_get_status(inlink) && i == nb_samples - 1))
             if ((ret = push_frame(outlink)) < 0)
                 break;
         outpicref = showwaves->outpicref;
@@ -713,11 +719,33 @@
     return ret;
 }
 
+static int activate(AVFilterContext *ctx)
+{
+    AVFilterLink *inlink = ctx->inputs[0];
+    AVFilterLink *outlink = ctx->outputs[0];
+    ShowWavesContext *showwaves = ctx->priv;
+    AVFrame *in;
+    const int nb_samples = showwaves->n * outlink->w;
+    int ret;
+
+    FF_FILTER_FORWARD_STATUS_BACK(outlink, inlink);
+
+    ret = ff_inlink_consume_samples(inlink, nb_samples, nb_samples, &in);
+    if (ret < 0)
+        return ret;
+    if (ret > 0)
+        return showwaves_filter_frame(inlink, in);
+
+    FF_FILTER_FORWARD_STATUS(inlink, outlink);
+    FF_FILTER_FORWARD_WANTED(outlink, inlink);
+
+    return FFERROR_NOT_READY;
+}
+
 static const AVFilterPad showwaves_inputs[] = {
     {
         .name         = "default",
         .type         = AVMEDIA_TYPE_AUDIO,
-        .filter_frame = showwaves_filter_frame,
     },
     { NULL }
 };
@@ -727,7 +755,6 @@
         .name          = "default",
         .type          = AVMEDIA_TYPE_VIDEO,
         .config_props  = config_output,
-        .request_frame = request_frame,
     },
     { NULL }
 };
@@ -740,6 +767,7 @@
     .query_formats = query_formats,
     .priv_size     = sizeof(ShowWavesContext),
     .inputs        = showwaves_inputs,
+    .activate      = activate,
     .outputs       = showwaves_outputs,
     .priv_class    = &showwaves_class,
 };
@@ -761,6 +789,9 @@
         { "log", "logarithmic",    0, AV_OPT_TYPE_CONST, {.i64=SCALE_LOG}, .flags=FLAGS, .unit="scale"},
         { "sqrt", "square root",   0, AV_OPT_TYPE_CONST, {.i64=SCALE_SQRT}, .flags=FLAGS, .unit="scale"},
         { "cbrt", "cubic root",    0, AV_OPT_TYPE_CONST, {.i64=SCALE_CBRT}, .flags=FLAGS, .unit="scale"},
+    { "draw", "set draw mode", OFFSET(draw_mode), AV_OPT_TYPE_INT, {.i64 = DRAW_SCALE}, 0, DRAW_NB-1, FLAGS, .unit="draw" },
+        { "scale", "scale pixel values for each drawn sample", 0, AV_OPT_TYPE_CONST, {.i64=DRAW_SCALE}, .flags=FLAGS, .unit="draw"},
+        { "full",  "draw every pixel for sample directly",     0, AV_OPT_TYPE_CONST, {.i64=DRAW_FULL},  .flags=FLAGS, .unit="draw"},
     { NULL }
 };
 
diff --git a/libavfilter/avfilter.c b/libavfilter/avfilter.c
index 93e866b..3948119 100644
--- a/libavfilter/avfilter.c
+++ b/libavfilter/avfilter.c
@@ -88,7 +88,7 @@
 const char *avfilter_license(void)
 {
 #define LICENSE_PREFIX "libavfilter license: "
-    return LICENSE_PREFIX FFMPEG_LICENSE + sizeof(LICENSE_PREFIX) - 1;
+    return &LICENSE_PREFIX FFMPEG_LICENSE[sizeof(LICENSE_PREFIX) - 1];
 }
 
 void ff_command_queue_pop(AVFilterContext *filter)
@@ -467,24 +467,6 @@
     return ret;
 }
 
-int ff_poll_frame(AVFilterLink *link)
-{
-    int i, min = INT_MAX;
-
-    if (link->srcpad->poll_frame)
-        return link->srcpad->poll_frame(link);
-
-    for (i = 0; i < link->src->nb_inputs; i++) {
-        int val;
-        if (!link->src->inputs[i])
-            return AVERROR(EINVAL);
-        val = ff_poll_frame(link->src->inputs[i]);
-        min = FFMIN(min, val);
-    }
-
-    return min;
-}
-
 static const char *const var_names[] = {
     "t",
     "n",
@@ -801,9 +783,9 @@
 
 int ff_filter_get_nb_threads(AVFilterContext *ctx)
 {
-     if (ctx->nb_threads > 0)
-         return FFMIN(ctx->nb_threads, ctx->graph->nb_threads);
-     return ctx->graph->nb_threads;
+    if (ctx->nb_threads > 0)
+        return FFMIN(ctx->nb_threads, ctx->graph->nb_threads);
+    return ctx->graph->nb_threads;
 }
 
 static int process_options(AVFilterContext *ctx, AVDictionary **options,
@@ -884,6 +866,19 @@
     return count;
 }
 
+int ff_filter_process_command(AVFilterContext *ctx, const char *cmd,
+                              const char *arg, char *res, int res_len, int flags)
+{
+    const AVOption *o;
+
+    if (!ctx->filter->priv_class)
+        return 0;
+    o = av_opt_find2(ctx->priv, cmd, NULL, AV_OPT_FLAG_RUNTIME_PARAM | AV_OPT_FLAG_FILTERING_PARAM, AV_OPT_SEARCH_CHILDREN, NULL);
+    if (!o)
+        return AVERROR(ENOSYS);
+    return av_opt_set(ctx->priv, cmd, arg, 0);
+}
+
 int avfilter_init_dict(AVFilterContext *ctx, AVDictionary **options)
 {
     int ret = 0;
diff --git a/libavfilter/avfilter.h b/libavfilter/avfilter.h
index 9d70e71..49b4f7a 100644
--- a/libavfilter/avfilter.h
+++ b/libavfilter/avfilter.h
@@ -79,7 +79,7 @@
  * Get the name of an AVFilterPad.
  *
  * @param pads an array of AVFilterPads
- * @param pad_idx index of the pad in the array it; is the caller's
+ * @param pad_idx index of the pad in the array; it is the caller's
  *                responsibility to ensure the index is valid
  *
  * @return name of the pad_idx'th pad in pads
@@ -947,7 +947,7 @@
 /**
  * Create and add a filter instance into an existing graph.
  * The filter instance is created from the filter filt and inited
- * with the parameters args and opaque.
+ * with the parameter args. opaque is currently ignored.
  *
  * In case of success put in *filt_ctx the pointer to the created
  * filter instance, otherwise set *filt_ctx to NULL.
diff --git a/libavfilter/avfiltergraph.c b/libavfilter/avfiltergraph.c
index a149f8f..2fe4f0b 100644
--- a/libavfilter/avfiltergraph.c
+++ b/libavfilter/avfiltergraph.c
@@ -419,8 +419,10 @@
         av_freep(&ret);
         return 1;
     } else {
-        av_freep(&a->formats);
-        av_freep(&b->formats);
+        if (a)
+            av_freep(&a->formats);
+        if (b)
+            av_freep(&b->formats);
         av_freep(&a);
         av_freep(&b);
         return 0;
diff --git a/libavfilter/blend.h b/libavfilter/blend.h
index eb20226..00db518 100644
--- a/libavfilter/blend.h
+++ b/libavfilter/blend.h
@@ -74,7 +74,7 @@
                   struct FilterParams *param, double *values, int starty);
 } FilterParams;
 
-void ff_blend_init(FilterParams *param, int is_16bit);
-void ff_blend_init_x86(FilterParams *param, int is_16bit);
+void ff_blend_init(FilterParams *param, int depth);
+void ff_blend_init_x86(FilterParams *param, int depth);
 
 #endif /* AVFILTER_BLEND_H */
diff --git a/libavfilter/boxblur.c b/libavfilter/boxblur.c
index 4534b45..2287396 100644
--- a/libavfilter/boxblur.c
+++ b/libavfilter/boxblur.c
@@ -91,7 +91,7 @@
                                  NULL, NULL, NULL, NULL, NULL, 0, ctx); \
     comp->radius = res;                                                 \
     if (ret < 0) {                                                      \
-        av_log(NULL, AV_LOG_ERROR,                                      \
+        av_log(ctx, AV_LOG_ERROR,                                      \
                "Error when evaluating " #comp " radius expression '%s'\n", expr); \
         return ret;                                                     \
     }
diff --git a/libavfilter/buffersink.c b/libavfilter/buffersink.c
index 0f87b54..76a46f6 100644
--- a/libavfilter/buffersink.c
+++ b/libavfilter/buffersink.c
@@ -61,8 +61,6 @@
 } BufferSinkContext;
 
 #define NB_ITEMS(list) (list ## _size / sizeof(*list))
-#define FIFO_INIT_SIZE 8
-#define FIFO_INIT_ELEMENT_SIZE sizeof(void *)
 
 int attribute_align_arg av_buffersink_get_frame(AVFilterContext *ctx, AVFrame *frame)
 {
@@ -127,6 +125,7 @@
     return get_frame_internal(ctx, frame, 0, nb_samples);
 }
 
+#if FF_API_NEXT
 AVBufferSinkParams *av_buffersink_params_alloc(void)
 {
     static const int pixel_fmts[] = { AV_PIX_FMT_NONE };
@@ -146,6 +145,7 @@
         return NULL;
     return params;
 }
+#endif
 
 static av_cold int common_init(AVFilterContext *ctx)
 {
@@ -201,20 +201,6 @@
 
 MAKE_AVFILTERLINK_ACCESSOR(AVBufferRef *    , hw_frames_ctx      )
 
-static av_cold int vsink_init(AVFilterContext *ctx, void *opaque)
-{
-    BufferSinkContext *buf = ctx->priv;
-    AVBufferSinkParams *params = opaque;
-    int ret;
-
-    if (params) {
-        if ((ret = av_opt_set_int_list(buf, "pix_fmts", params->pixel_fmts, AV_PIX_FMT_NONE, 0)) < 0)
-            return ret;
-    }
-
-    return common_init(ctx);
-}
-
 #define CHECK_LIST_SIZE(field) \
         if (buf->field ## _size % sizeof(*buf->field)) { \
             av_log(ctx, AV_LOG_ERROR, "Invalid size for " #field ": %d, " \
@@ -244,23 +230,6 @@
     return 0;
 }
 
-static av_cold int asink_init(AVFilterContext *ctx, void *opaque)
-{
-    BufferSinkContext *buf = ctx->priv;
-    AVABufferSinkParams *params = opaque;
-    int ret;
-
-    if (params) {
-        if ((ret = av_opt_set_int_list(buf, "sample_fmts",     params->sample_fmts,  AV_SAMPLE_FMT_NONE, 0)) < 0 ||
-            (ret = av_opt_set_int_list(buf, "sample_rates",    params->sample_rates,    -1, 0)) < 0 ||
-            (ret = av_opt_set_int_list(buf, "channel_layouts", params->channel_layouts, -1, 0)) < 0 ||
-            (ret = av_opt_set_int_list(buf, "channel_counts",  params->channel_counts,  -1, 0)) < 0 ||
-            (ret = av_opt_set_int(buf, "all_channel_counts", params->all_channel_counts, 0)) < 0)
-            return ret;
-    }
-    return common_init(ctx);
-}
-
 static int asink_query_formats(AVFilterContext *ctx)
 {
     BufferSinkContext *buf = ctx->priv;
@@ -320,7 +289,7 @@
     { NULL },
 };
 #undef FLAGS
-#define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM
+#define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_AUDIO_PARAM
 static const AVOption abuffersink_options[] = {
     { "sample_fmts",     "set the supported sample formats",  OFFSET(sample_fmts),     AV_OPT_TYPE_BINARY, .flags = FLAGS },
     { "sample_rates",    "set the supported sample rates",    OFFSET(sample_rates),    AV_OPT_TYPE_BINARY, .flags = FLAGS },
@@ -336,42 +305,40 @@
 
 static const AVFilterPad avfilter_vsink_buffer_inputs[] = {
     {
-        .name         = "default",
-        .type         = AVMEDIA_TYPE_VIDEO,
+        .name = "default",
+        .type = AVMEDIA_TYPE_VIDEO,
     },
     { NULL }
 };
 
 AVFilter ff_vsink_buffer = {
-    .name        = "buffersink",
-    .description = NULL_IF_CONFIG_SMALL("Buffer video frames, and make them available to the end of the filter graph."),
-    .priv_size   = sizeof(BufferSinkContext),
-    .priv_class  = &buffersink_class,
-    .init_opaque = vsink_init,
-
+    .name          = "buffersink",
+    .description   = NULL_IF_CONFIG_SMALL("Buffer video frames, and make them available to the end of the filter graph."),
+    .priv_size     = sizeof(BufferSinkContext),
+    .priv_class    = &buffersink_class,
+    .init          = common_init,
     .query_formats = vsink_query_formats,
-    .activate    = activate,
-    .inputs      = avfilter_vsink_buffer_inputs,
-    .outputs     = NULL,
+    .activate      = activate,
+    .inputs        = avfilter_vsink_buffer_inputs,
+    .outputs       = NULL,
 };
 
 static const AVFilterPad avfilter_asink_abuffer_inputs[] = {
     {
-        .name         = "default",
-        .type         = AVMEDIA_TYPE_AUDIO,
+        .name = "default",
+        .type = AVMEDIA_TYPE_AUDIO,
     },
     { NULL }
 };
 
 AVFilter ff_asink_abuffer = {
-    .name        = "abuffersink",
-    .description = NULL_IF_CONFIG_SMALL("Buffer audio frames, and make them available to the end of the filter graph."),
-    .priv_class  = &abuffersink_class,
-    .priv_size   = sizeof(BufferSinkContext),
-    .init_opaque = asink_init,
-
+    .name          = "abuffersink",
+    .description   = NULL_IF_CONFIG_SMALL("Buffer audio frames, and make them available to the end of the filter graph."),
+    .priv_class    = &abuffersink_class,
+    .priv_size     = sizeof(BufferSinkContext),
+    .init          = common_init,
     .query_formats = asink_query_formats,
-    .activate    = activate,
-    .inputs      = avfilter_asink_abuffer_inputs,
-    .outputs     = NULL,
+    .activate      = activate,
+    .inputs        = avfilter_asink_abuffer_inputs,
+    .outputs       = NULL,
 };
diff --git a/libavfilter/buffersink.h b/libavfilter/buffersink.h
index 3c846bb..2ec821c 100644
--- a/libavfilter/buffersink.h
+++ b/libavfilter/buffersink.h
@@ -59,6 +59,7 @@
  */
 #define AV_BUFFERSINK_FLAG_NO_REQUEST 2
 
+#if FF_API_NEXT
 /**
  * Struct to use for initializing a buffersink context.
  */
@@ -71,6 +72,7 @@
  *
  * Must be freed with av_free().
  */
+attribute_deprecated
 AVBufferSinkParams *av_buffersink_params_alloc(void);
 
 /**
@@ -89,7 +91,9 @@
  *
  * Must be freed with av_free().
  */
+attribute_deprecated
 AVABufferSinkParams *av_abuffersink_params_alloc(void);
+#endif
 
 /**
  * Set the frame size for an audio buffer sink.
diff --git a/libavfilter/buffersrc.c b/libavfilter/buffersrc.c
index cd56f8c..bf30f54 100644
--- a/libavfilter/buffersrc.c
+++ b/libavfilter/buffersrc.c
@@ -25,14 +25,15 @@
 
 #include <float.h>
 
+#include "libavutil/avassert.h"
 #include "libavutil/channel_layout.h"
 #include "libavutil/common.h"
-#include "libavutil/fifo.h"
 #include "libavutil/frame.h"
 #include "libavutil/imgutils.h"
 #include "libavutil/internal.h"
 #include "libavutil/opt.h"
 #include "libavutil/samplefmt.h"
+#include "libavutil/timestamp.h"
 #include "audio.h"
 #include "avfilter.h"
 #include "buffersrc.h"
@@ -42,17 +43,17 @@
 
 typedef struct BufferSourceContext {
     const AVClass    *class;
-    AVFifoBuffer     *fifo;
     AVRational        time_base;     ///< time_base to set in the output link
     AVRational        frame_rate;    ///< frame_rate to set in the output link
     unsigned          nb_failed_requests;
-    unsigned          warning_limit;
 
     /* video only */
     int               w, h;
     enum AVPixelFormat  pix_fmt;
     AVRational        pixel_aspect;
+#if FF_API_SWS_PARAM_OPTION
     char              *sws_param;
+#endif
 
     AVBufferRef *hw_frames_ctx;
 
@@ -63,19 +64,23 @@
     uint64_t channel_layout;
     char    *channel_layout_str;
 
-    int got_format_from_params;
     int eof;
 } BufferSourceContext;
 
-#define CHECK_VIDEO_PARAM_CHANGE(s, c, width, height, format)\
+#define CHECK_VIDEO_PARAM_CHANGE(s, c, width, height, format, pts)\
     if (c->w != width || c->h != height || c->pix_fmt != format) {\
-        av_log(s, AV_LOG_INFO, "Changing frame properties on the fly is not supported by all filters.\n");\
+        av_log(s, AV_LOG_INFO, "filter context - w: %d h: %d fmt: %d, incoming frame - w: %d h: %d fmt: %d pts_time: %s\n",\
+               c->w, c->h, c->pix_fmt, width, height, format, av_ts2timestr(pts, &s->outputs[0]->time_base));\
+        av_log(s, AV_LOG_WARNING, "Changing video frame properties on the fly is not supported by all filters.\n");\
     }
 
-#define CHECK_AUDIO_PARAM_CHANGE(s, c, srate, ch_layout, ch_count, format)\
+#define CHECK_AUDIO_PARAM_CHANGE(s, c, srate, ch_layout, ch_count, format, pts)\
     if (c->sample_fmt != format || c->sample_rate != srate ||\
         c->channel_layout != ch_layout || c->channels != ch_count) {\
-        av_log(s, AV_LOG_ERROR, "Changing frame properties on the fly is not supported.\n");\
+        av_log(s, AV_LOG_INFO, "filter context - fmt: %s r: %d layout: %"PRIX64" ch: %d, incoming frame - fmt: %s r: %d layout: %"PRIX64" ch: %d pts_time: %s\n",\
+               av_get_sample_fmt_name(c->sample_fmt), c->sample_rate, c->channel_layout, c->channels,\
+               av_get_sample_fmt_name(format), srate, ch_layout, ch_count, av_ts2timestr(pts, &s->outputs[0]->time_base));\
+        av_log(s, AV_LOG_ERROR, "Changing audio frame properties on the fly is not supported.\n");\
         return AVERROR(EINVAL);\
     }
 
@@ -100,7 +105,6 @@
     switch (ctx->filter->outputs[0].type) {
     case AVMEDIA_TYPE_VIDEO:
         if (param->format != AV_PIX_FMT_NONE) {
-            s->got_format_from_params = 1;
             s->pix_fmt = param->format;
         }
         if (param->width > 0)
@@ -120,7 +124,6 @@
         break;
     case AVMEDIA_TYPE_AUDIO:
         if (param->format != AV_SAMPLE_FMT_NONE) {
-            s->got_format_from_params = 1;
             s->sample_fmt = param->format;
         }
         if (param->sample_rate > 0)
@@ -205,29 +208,24 @@
 
     if (!(flags & AV_BUFFERSRC_FLAG_NO_CHECK_FORMAT)) {
 
-    switch (ctx->outputs[0]->type) {
-    case AVMEDIA_TYPE_VIDEO:
-        CHECK_VIDEO_PARAM_CHANGE(ctx, s, frame->width, frame->height,
-                                 frame->format);
-        break;
-    case AVMEDIA_TYPE_AUDIO:
-        /* For layouts unknown on input but known on link after negotiation. */
-        if (!frame->channel_layout)
-            frame->channel_layout = s->channel_layout;
-        CHECK_AUDIO_PARAM_CHANGE(ctx, s, frame->sample_rate, frame->channel_layout,
-                                 frame->channels, frame->format);
-        break;
-    default:
-        return AVERROR(EINVAL);
-    }
+        switch (ctx->outputs[0]->type) {
+        case AVMEDIA_TYPE_VIDEO:
+            CHECK_VIDEO_PARAM_CHANGE(ctx, s, frame->width, frame->height,
+                                     frame->format, frame->pts);
+            break;
+        case AVMEDIA_TYPE_AUDIO:
+            /* For layouts unknown on input but known on link after negotiation. */
+            if (!frame->channel_layout)
+                frame->channel_layout = s->channel_layout;
+            CHECK_AUDIO_PARAM_CHANGE(ctx, s, frame->sample_rate, frame->channel_layout,
+                                     frame->channels, frame->format, frame->pts);
+            break;
+        default:
+            return AVERROR(EINVAL);
+        }
 
     }
 
-    if (!av_fifo_space(s->fifo) &&
-        (ret = av_fifo_realloc2(s->fifo, av_fifo_size(s->fifo) +
-                                         sizeof(copy))) < 0)
-        return ret;
-
     if (!(copy = av_frame_alloc()))
         return AVERROR(ENOMEM);
 
@@ -241,14 +239,8 @@
         }
     }
 
-    if ((ret = av_fifo_generic_write(s->fifo, &copy, sizeof(copy), NULL)) < 0) {
-        if (refcounted)
-            av_frame_move_ref(frame, copy);
-        av_frame_free(&copy);
-        return ret;
-    }
-
-    if ((ret = ctx->output_pads[0].request_frame(ctx->outputs[0])) < 0)
+    ret = ff_filter_frame(ctx->outputs[0], copy);
+    if (ret < 0)
         return ret;
 
     if ((flags & AV_BUFFERSRC_FLAG_PUSH)) {
@@ -273,20 +265,22 @@
 {
     BufferSourceContext *c = ctx->priv;
 
-    if (!(c->pix_fmt != AV_PIX_FMT_NONE || c->got_format_from_params) || !c->w || !c->h ||
+    if (c->pix_fmt == AV_PIX_FMT_NONE || !c->w || !c->h ||
         av_q2d(c->time_base) <= 0) {
         av_log(ctx, AV_LOG_ERROR, "Invalid parameters provided.\n");
         return AVERROR(EINVAL);
     }
 
-    if (!(c->fifo = av_fifo_alloc(sizeof(AVFrame*))))
-        return AVERROR(ENOMEM);
-
-    av_log(ctx, AV_LOG_VERBOSE, "w:%d h:%d pixfmt:%s tb:%d/%d fr:%d/%d sar:%d/%d sws_param:%s\n",
+    av_log(ctx, AV_LOG_VERBOSE, "w:%d h:%d pixfmt:%s tb:%d/%d fr:%d/%d sar:%d/%d\n",
            c->w, c->h, av_get_pix_fmt_name(c->pix_fmt),
            c->time_base.num, c->time_base.den, c->frame_rate.num, c->frame_rate.den,
-           c->pixel_aspect.num, c->pixel_aspect.den, (char *)av_x_if_null(c->sws_param, ""));
-    c->warning_limit = 100;
+           c->pixel_aspect.num, c->pixel_aspect.den);
+
+#if FF_API_SWS_PARAM_OPTION
+    if (c->sws_param)
+        av_log(ctx, AV_LOG_WARNING, "sws_param option is deprecated and ignored\n");
+#endif
+
     return 0;
 }
 
@@ -308,7 +302,9 @@
     { "pixel_aspect",  "sample aspect ratio",    OFFSET(pixel_aspect),     AV_OPT_TYPE_RATIONAL, { .dbl = 0 }, 0, DBL_MAX, V },
     { "time_base",     NULL,                     OFFSET(time_base),        AV_OPT_TYPE_RATIONAL, { .dbl = 0 }, 0, DBL_MAX, V },
     { "frame_rate",    NULL,                     OFFSET(frame_rate),       AV_OPT_TYPE_RATIONAL, { .dbl = 0 }, 0, DBL_MAX, V },
+#if FF_API_SWS_PARAM_OPTION
     { "sws_param",     NULL,                     OFFSET(sws_param),        AV_OPT_TYPE_STRING,                    .flags = V },
+#endif
     { NULL },
 };
 
@@ -330,7 +326,7 @@
     BufferSourceContext *s = ctx->priv;
     int ret = 0;
 
-    if (!(s->sample_fmt != AV_SAMPLE_FMT_NONE || s->got_format_from_params)) {
+    if (s->sample_fmt == AV_SAMPLE_FMT_NONE) {
         av_log(ctx, AV_LOG_ERROR, "Sample format was not set or was invalid\n");
         return AVERROR(EINVAL);
     }
@@ -363,9 +359,6 @@
         return AVERROR(EINVAL);
     }
 
-    if (!(s->fifo = av_fifo_alloc(sizeof(AVFrame*))))
-        return AVERROR(ENOMEM);
-
     if (!s->time_base.num)
         s->time_base = (AVRational){1, s->sample_rate};
 
@@ -373,7 +366,6 @@
            "tb:%d/%d samplefmt:%s samplerate:%d chlayout:%s\n",
            s->time_base.num, s->time_base.den, av_get_sample_fmt_name(s->sample_fmt),
            s->sample_rate, s->channel_layout_str);
-    s->warning_limit = 100;
 
     return ret;
 }
@@ -381,13 +373,7 @@
 static av_cold void uninit(AVFilterContext *ctx)
 {
     BufferSourceContext *s = ctx->priv;
-    while (s->fifo && av_fifo_size(s->fifo)) {
-        AVFrame *frame;
-        av_fifo_generic_read(s->fifo, &frame, sizeof(frame), NULL);
-        av_frame_free(&frame);
-    }
     av_buffer_unref(&s->hw_frames_ctx);
-    av_fifo_freep(&s->fifo);
 }
 
 static int query_formats(AVFilterContext *ctx)
@@ -457,29 +443,11 @@
 static int request_frame(AVFilterLink *link)
 {
     BufferSourceContext *c = link->src->priv;
-    AVFrame *frame;
-    int ret;
 
-    if (!av_fifo_size(c->fifo)) {
-        if (c->eof)
-            return AVERROR_EOF;
-        c->nb_failed_requests++;
-        return AVERROR(EAGAIN);
-    }
-    av_fifo_generic_read(c->fifo, &frame, sizeof(frame), NULL);
-
-    ret = ff_filter_frame(link, frame);
-
-    return ret;
-}
-
-static int poll_frame(AVFilterLink *link)
-{
-    BufferSourceContext *c = link->src->priv;
-    int size = av_fifo_size(c->fifo);
-    if (!size && c->eof)
+    if (c->eof)
         return AVERROR_EOF;
-    return size/sizeof(AVFrame*);
+    c->nb_failed_requests++;
+    return AVERROR(EAGAIN);
 }
 
 static const AVFilterPad avfilter_vsrc_buffer_outputs[] = {
@@ -487,7 +455,6 @@
         .name          = "default",
         .type          = AVMEDIA_TYPE_VIDEO,
         .request_frame = request_frame,
-        .poll_frame    = poll_frame,
         .config_props  = config_props,
     },
     { NULL }
@@ -512,7 +479,6 @@
         .name          = "default",
         .type          = AVMEDIA_TYPE_AUDIO,
         .request_frame = request_frame,
-        .poll_frame    = poll_frame,
         .config_props  = config_props,
     },
     { NULL }
diff --git a/libavfilter/bwdif.h b/libavfilter/bwdif.h
index 8b42c76..889ff77 100644
--- a/libavfilter/bwdif.h
+++ b/libavfilter/bwdif.h
@@ -21,36 +21,10 @@
 
 #include "libavutil/pixdesc.h"
 #include "avfilter.h"
-
-enum BWDIFMode {
-    BWDIF_MODE_SEND_FRAME = 0, ///< send 1 frame for each frame
-    BWDIF_MODE_SEND_FIELD = 1, ///< send 1 frame for each field
-};
-
-enum BWDIFParity {
-    BWDIF_PARITY_TFF  =  0, ///< top field first
-    BWDIF_PARITY_BFF  =  1, ///< bottom field first
-    BWDIF_PARITY_AUTO = -1, ///< auto detection
-};
-
-enum BWDIFDeint {
-    BWDIF_DEINT_ALL        = 0, ///< deinterlace all frames
-    BWDIF_DEINT_INTERLACED = 1, ///< only deinterlace frames marked as interlaced
-};
+#include "yadif.h"
 
 typedef struct BWDIFContext {
-    const AVClass *class;
-
-    int mode;           ///< BWDIFMode
-    int parity;         ///< BWDIFParity
-    int deint;          ///< BWDIFDeint
-
-    int frame_pending;
-
-    AVFrame *cur;
-    AVFrame *next;
-    AVFrame *prev;
-    AVFrame *out;
+    YADIFContext yadif;
 
     void (*filter_intra)(void *dst1, void *cur1, int w, int prefs, int mrefs,
                          int prefs3, int mrefs3, int parity, int clip_max);
@@ -61,10 +35,6 @@
     void (*filter_edge)(void *dst, void *prev, void *cur, void *next,
                         int w, int prefs, int mrefs, int prefs2, int mrefs2,
                         int parity, int clip_max, int spat);
-
-    const AVPixFmtDescriptor *csp;
-    int inter_field;
-    int eof;
 } BWDIFContext;
 
 void ff_bwdif_init_x86(BWDIFContext *bwdif);
diff --git a/libavfilter/colorspace.c b/libavfilter/colorspace.c
index c668221..19616e4 100644
--- a/libavfilter/colorspace.c
+++ b/libavfilter/colorspace.c
@@ -93,6 +93,77 @@
     rgb2xyz[2][1] *= sg;
     rgb2xyz[2][2] *= sb;
 }
+static const double ycgco_matrix[3][3] =
+{
+    {  0.25, 0.5,  0.25 },
+    { -0.25, 0.5, -0.25 },
+    {  0.5,  0,   -0.5  },
+};
+
+static const double gbr_matrix[3][3] =
+{
+    { 0,    1,   0   },
+    { 0,   -0.5, 0.5 },
+    { 0.5, -0.5, 0   },
+};
+
+/*
+ * All constants explained in e.g. https://linuxtv.org/downloads/v4l-dvb-apis/ch02s06.html
+ * The older ones (bt470bg/m) are also explained in their respective ITU docs
+ * (e.g. https://www.itu.int/dms_pubrec/itu-r/rec/bt/R-REC-BT.470-5-199802-S!!PDF-E.pdf)
+ * whereas the newer ones can typically be copied directly from wikipedia :)
+ */
+static const struct LumaCoefficients luma_coefficients[AVCOL_SPC_NB] = {
+    [AVCOL_SPC_FCC]        = { 0.30,   0.59,   0.11   },
+    [AVCOL_SPC_BT470BG]    = { 0.299,  0.587,  0.114  },
+    [AVCOL_SPC_SMPTE170M]  = { 0.299,  0.587,  0.114  },
+    [AVCOL_SPC_BT709]      = { 0.2126, 0.7152, 0.0722 },
+    [AVCOL_SPC_SMPTE240M]  = { 0.212,  0.701,  0.087  },
+    [AVCOL_SPC_YCOCG]      = { 0.25,   0.5,    0.25   },
+    [AVCOL_SPC_RGB]        = { 1,      1,      1      },
+    [AVCOL_SPC_BT2020_NCL] = { 0.2627, 0.6780, 0.0593 },
+    [AVCOL_SPC_BT2020_CL]  = { 0.2627, 0.6780, 0.0593 },
+};
+
+const struct LumaCoefficients *ff_get_luma_coefficients(enum AVColorSpace csp)
+{
+    const struct LumaCoefficients *coeffs;
+
+    if (csp >= AVCOL_SPC_NB)
+        return NULL;
+    coeffs = &luma_coefficients[csp];
+    if (!coeffs->cr)
+        return NULL;
+
+    return coeffs;
+}
+
+void ff_fill_rgb2yuv_table(const struct LumaCoefficients *coeffs,
+                           double rgb2yuv[3][3])
+{
+    double bscale, rscale;
+
+    // special ycgco matrix
+    if (coeffs->cr == 0.25 && coeffs->cg == 0.5 && coeffs->cb == 0.25) {
+        memcpy(rgb2yuv, ycgco_matrix, sizeof(double) * 9);
+        return;
+    } else if (coeffs->cr == 1 && coeffs->cg == 1 && coeffs->cb == 1) {
+        memcpy(rgb2yuv, gbr_matrix, sizeof(double) * 9);
+        return;
+    }
+
+    rgb2yuv[0][0] = coeffs->cr;
+    rgb2yuv[0][1] = coeffs->cg;
+    rgb2yuv[0][2] = coeffs->cb;
+    bscale = 0.5 / (coeffs->cb - 1.0);
+    rscale = 0.5 / (coeffs->cr - 1.0);
+    rgb2yuv[1][0] = bscale * coeffs->cr;
+    rgb2yuv[1][1] = bscale * coeffs->cg;
+    rgb2yuv[1][2] = 0.5;
+    rgb2yuv[2][0] = 0.5;
+    rgb2yuv[2][1] = rscale * coeffs->cg;
+    rgb2yuv[2][2] = rscale * coeffs->cb;
+}
 
 double ff_determine_signal_peak(AVFrame *in)
 {
diff --git a/libavfilter/colorspace.h b/libavfilter/colorspace.h
index 9366818..459a5df 100644
--- a/libavfilter/colorspace.h
+++ b/libavfilter/colorspace.h
@@ -44,6 +44,10 @@
                            const struct WhitepointCoefficients *wp,
                            double rgb2xyz[3][3]);
 
+const struct LumaCoefficients *ff_get_luma_coefficients(enum AVColorSpace csp);
+void ff_fill_rgb2yuv_table(const struct LumaCoefficients *coeffs,
+                           double rgb2yuv[3][3]);
+
 double ff_determine_signal_peak(AVFrame *in);
 void ff_update_hdr_metadata(AVFrame *in, double peak);
 
diff --git a/libavfilter/convolution.h b/libavfilter/convolution.h
new file mode 100644
index 0000000..fc6aad5
--- /dev/null
+++ b/libavfilter/convolution.h
@@ -0,0 +1,64 @@
+/*
+ * Copyright (c) 2012-2013 Oka Motofumi (chikuzen.mo at gmail dot com)
+ * Copyright (c) 2015 Paul B Mahol
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+#ifndef AVFILTER_CONVOLUTION_H
+#define AVFILTER_CONVOLUTION_H
+#include "avfilter.h"
+
+enum MatrixMode {
+    MATRIX_SQUARE,
+    MATRIX_ROW,
+    MATRIX_COLUMN,
+    MATRIX_NBMODES,
+};
+
+typedef struct ConvolutionContext {
+    const AVClass *class;
+
+    char *matrix_str[4];
+    float rdiv[4];
+    float bias[4];
+    int mode[4];
+    float scale;
+    float delta;
+    int planes;
+
+    int size[4];
+    int depth;
+    int max;
+    int bpc;
+    int nb_planes;
+    int nb_threads;
+    int planewidth[4];
+    int planeheight[4];
+    int matrix[4][49];
+    int matrix_length[4];
+    int copy[4];
+
+    void (*setup[4])(int radius, const uint8_t *c[], const uint8_t *src, int stride,
+                     int x, int width, int y, int height, int bpc);
+    void (*filter[4])(uint8_t *dst, int width,
+                      float rdiv, float bias, const int *const matrix,
+                      const uint8_t *c[], int peak, int radius,
+                      int dstride, int stride);
+} ConvolutionContext;
+
+void ff_convolution_init_x86(ConvolutionContext *s);
+#endif
diff --git a/libavfilter/dnn/Makefile b/libavfilter/dnn/Makefile
new file mode 100644
index 0000000..ce52958
--- /dev/null
+++ b/libavfilter/dnn/Makefile
@@ -0,0 +1,12 @@
+OBJS-$(CONFIG_DNN)                           += dnn/dnn_interface.o
+OBJS-$(CONFIG_DNN)                           += dnn/dnn_backend_native.o
+OBJS-$(CONFIG_DNN)                           += dnn/dnn_backend_native_layers.o
+OBJS-$(CONFIG_DNN)                           += dnn/dnn_backend_native_layer_pad.o
+OBJS-$(CONFIG_DNN)                           += dnn/dnn_backend_native_layer_conv2d.o
+OBJS-$(CONFIG_DNN)                           += dnn/dnn_backend_native_layer_depth2space.o
+OBJS-$(CONFIG_DNN)                           += dnn/dnn_backend_native_layer_maximum.o
+OBJS-$(CONFIG_DNN)                           += dnn/dnn_backend_native_layer_mathbinary.o
+
+DNN-OBJS-$(CONFIG_LIBTENSORFLOW)             += dnn/dnn_backend_tf.o
+
+OBJS-$(CONFIG_DNN)                           += $(DNN-OBJS-yes)
diff --git a/libavfilter/dnn/dnn_backend_native.c b/libavfilter/dnn/dnn_backend_native.c
new file mode 100644
index 0000000..94634b3
--- /dev/null
+++ b/libavfilter/dnn/dnn_backend_native.c
@@ -0,0 +1,336 @@
+/*
+ * Copyright (c) 2018 Sergey Lavrushkin
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file
+ * DNN native backend implementation.
+ */
+
+#include "dnn_backend_native.h"
+#include "libavutil/avassert.h"
+#include "dnn_backend_native_layer_conv2d.h"
+#include "dnn_backend_native_layers.h"
+
+static DNNReturnType get_input_native(void *model, DNNData *input, const char *input_name)
+{
+    ConvolutionalNetwork *network = (ConvolutionalNetwork *)model;
+
+    for (int i = 0; i < network->operands_num; ++i) {
+        DnnOperand *oprd = &network->operands[i];
+        if (strcmp(oprd->name, input_name) == 0) {
+            if (oprd->type != DOT_INPUT)
+                return DNN_ERROR;
+            input->dt = oprd->data_type;
+            av_assert0(oprd->dims[0] == 1);
+            input->height = oprd->dims[1];
+            input->width = oprd->dims[2];
+            input->channels = oprd->dims[3];
+            return DNN_SUCCESS;
+        }
+    }
+
+    // do not find the input operand
+    return DNN_ERROR;
+}
+
+static DNNReturnType set_input_output_native(void *model, DNNData *input, const char *input_name, const char **output_names, uint32_t nb_output)
+{
+    ConvolutionalNetwork *network = (ConvolutionalNetwork *)model;
+    DnnOperand *oprd = NULL;
+
+    if (network->layers_num <= 0 || network->operands_num <= 0)
+        return DNN_ERROR;
+
+    /* inputs */
+    for (int i = 0; i < network->operands_num; ++i) {
+        oprd = &network->operands[i];
+        if (strcmp(oprd->name, input_name) == 0) {
+            if (oprd->type != DOT_INPUT)
+                return DNN_ERROR;
+            break;
+        }
+        oprd = NULL;
+    }
+
+    if (!oprd)
+        return DNN_ERROR;
+
+    oprd->dims[0] = 1;
+    oprd->dims[1] = input->height;
+    oprd->dims[2] = input->width;
+    oprd->dims[3] = input->channels;
+
+    av_freep(&oprd->data);
+    oprd->length = calculate_operand_data_length(oprd);
+    oprd->data = av_malloc(oprd->length);
+    if (!oprd->data)
+        return DNN_ERROR;
+
+    input->data = oprd->data;
+
+    /* outputs */
+    network->nb_output = 0;
+    av_freep(&network->output_indexes);
+    network->output_indexes = av_mallocz_array(nb_output, sizeof(*network->output_indexes));
+    if (!network->output_indexes)
+        return DNN_ERROR;
+
+    for (uint32_t i = 0; i < nb_output; ++i) {
+        const char *output_name = output_names[i];
+        for (int j = 0; j < network->operands_num; ++j) {
+            oprd = &network->operands[j];
+            if (strcmp(oprd->name, output_name) == 0) {
+                network->output_indexes[network->nb_output++] = j;
+                break;
+            }
+        }
+    }
+
+    if (network->nb_output != nb_output)
+        return DNN_ERROR;
+
+    return DNN_SUCCESS;
+}
+
+// Loads model and its parameters that are stored in a binary file with following structure:
+// layers_num,layer_type,layer_parameterss,layer_type,layer_parameters...
+// For CONV layer: activation_function, input_num, output_num, kernel_size, kernel, biases
+// For DEPTH_TO_SPACE layer: block_size
+DNNModel *ff_dnn_load_model_native(const char *model_filename)
+{
+    DNNModel *model = NULL;
+    char header_expected[] = "FFMPEGDNNNATIVE";
+    char *buf;
+    size_t size;
+    int version, header_size, major_version_expected = 1;
+    ConvolutionalNetwork *network = NULL;
+    AVIOContext *model_file_context;
+    int file_size, dnn_size, parsed_size;
+    int32_t layer;
+    DNNLayerType layer_type;
+
+    model = av_malloc(sizeof(DNNModel));
+    if (!model){
+        return NULL;
+    }
+
+    if (avio_open(&model_file_context, model_filename, AVIO_FLAG_READ) < 0){
+        av_freep(&model);
+        return NULL;
+    }
+    file_size = avio_size(model_file_context);
+
+    /**
+     * check file header with string and version
+     */
+    size = sizeof(header_expected);
+    buf = av_malloc(size);
+    if (!buf) {
+        avio_closep(&model_file_context);
+        av_freep(&model);
+        return NULL;
+    }
+
+    // size - 1 to skip the ending '\0' which is not saved in file
+    avio_get_str(model_file_context, size - 1, buf, size);
+    dnn_size = size - 1;
+    if (strncmp(buf, header_expected, size) != 0) {
+        av_freep(&buf);
+        avio_closep(&model_file_context);
+        av_freep(&model);
+        return NULL;
+    }
+    av_freep(&buf);
+
+    version = (int32_t)avio_rl32(model_file_context);
+    dnn_size += 4;
+    if (version != major_version_expected) {
+        avio_closep(&model_file_context);
+        av_freep(&model);
+        return NULL;
+    }
+
+    // currently no need to check minor version
+    version = (int32_t)avio_rl32(model_file_context);
+    dnn_size += 4;
+    header_size = dnn_size;
+
+    network = av_mallocz(sizeof(ConvolutionalNetwork));
+    if (!network){
+        avio_closep(&model_file_context);
+        av_freep(&model);
+        return NULL;
+    }
+    model->model = (void *)network;
+
+    avio_seek(model_file_context, file_size - 8, SEEK_SET);
+    network->layers_num = (int32_t)avio_rl32(model_file_context);
+    network->operands_num = (int32_t)avio_rl32(model_file_context);
+    dnn_size += 8;
+    avio_seek(model_file_context, header_size, SEEK_SET);
+
+    network->layers = av_mallocz(network->layers_num * sizeof(Layer));
+    if (!network->layers){
+        avio_closep(&model_file_context);
+        ff_dnn_free_model_native(&model);
+        return NULL;
+    }
+
+    network->operands = av_mallocz(network->operands_num * sizeof(DnnOperand));
+    if (!network->operands){
+        avio_closep(&model_file_context);
+        ff_dnn_free_model_native(&model);
+        return NULL;
+    }
+
+    for (layer = 0; layer < network->layers_num; ++layer){
+        layer_type = (int32_t)avio_rl32(model_file_context);
+        dnn_size += 4;
+
+        if (layer_type >= DLT_COUNT) {
+            avio_closep(&model_file_context);
+            ff_dnn_free_model_native(&model);
+            return NULL;
+        }
+
+        network->layers[layer].type = layer_type;
+        parsed_size = layer_funcs[layer_type].pf_load(&network->layers[layer], model_file_context, file_size);
+        if (!parsed_size) {
+            avio_closep(&model_file_context);
+            ff_dnn_free_model_native(&model);
+            return NULL;
+        }
+        dnn_size += parsed_size;
+    }
+
+    for (int32_t i = 0; i < network->operands_num; ++i){
+        DnnOperand *oprd;
+        int32_t name_len;
+        int32_t operand_index = (int32_t)avio_rl32(model_file_context);
+        dnn_size += 4;
+
+        oprd = &network->operands[operand_index];
+        name_len = (int32_t)avio_rl32(model_file_context);
+        dnn_size += 4;
+
+        avio_get_str(model_file_context, name_len, oprd->name, sizeof(oprd->name));
+        dnn_size += name_len;
+
+        oprd->type = (int32_t)avio_rl32(model_file_context);
+        dnn_size += 4;
+
+        oprd->data_type = (int32_t)avio_rl32(model_file_context);
+        dnn_size += 4;
+
+        for (int32_t dim = 0; dim < 4; ++dim) {
+            oprd->dims[dim] = (int32_t)avio_rl32(model_file_context);
+            dnn_size += 4;
+        }
+
+        oprd->isNHWC = 1;
+    }
+
+    avio_closep(&model_file_context);
+
+    if (dnn_size != file_size){
+        ff_dnn_free_model_native(&model);
+        return NULL;
+    }
+
+    model->set_input_output = &set_input_output_native;
+    model->get_input = &get_input_native;
+
+    return model;
+}
+
+DNNReturnType ff_dnn_execute_model_native(const DNNModel *model, DNNData *outputs, uint32_t nb_output)
+{
+    ConvolutionalNetwork *network = (ConvolutionalNetwork *)model->model;
+    int32_t layer;
+    uint32_t nb = FFMIN(nb_output, network->nb_output);
+
+    if (network->layers_num <= 0 || network->operands_num <= 0)
+        return DNN_ERROR;
+    if (!network->operands[0].data)
+        return DNN_ERROR;
+
+    for (layer = 0; layer < network->layers_num; ++layer){
+        DNNLayerType layer_type = network->layers[layer].type;
+        layer_funcs[layer_type].pf_exec(network->operands,
+                                  network->layers[layer].input_operand_indexes,
+                                  network->layers[layer].output_operand_index,
+                                  network->layers[layer].params);
+    }
+
+    for (uint32_t i = 0; i < nb; ++i) {
+        DnnOperand *oprd = &network->operands[network->output_indexes[i]];
+        outputs[i].data = oprd->data;
+        outputs[i].height = oprd->dims[1];
+        outputs[i].width = oprd->dims[2];
+        outputs[i].channels = oprd->dims[3];
+        outputs[i].dt = oprd->data_type;
+    }
+
+    return DNN_SUCCESS;
+}
+
+int32_t calculate_operand_dims_count(const DnnOperand *oprd)
+{
+    int32_t result = 1;
+    for (int i = 0; i < 4; ++i)
+        result *= oprd->dims[i];
+
+    return result;
+}
+
+int32_t calculate_operand_data_length(const DnnOperand* oprd)
+{
+    // currently, we just support DNN_FLOAT
+    return oprd->dims[0] * oprd->dims[1] * oprd->dims[2] * oprd->dims[3] * sizeof(float);
+}
+
+void ff_dnn_free_model_native(DNNModel **model)
+{
+    ConvolutionalNetwork *network;
+    ConvolutionalParams *conv_params;
+    int32_t layer;
+
+    if (*model)
+    {
+        network = (ConvolutionalNetwork *)(*model)->model;
+        for (layer = 0; layer < network->layers_num; ++layer){
+            if (network->layers[layer].type == DLT_CONV2D){
+                conv_params = (ConvolutionalParams *)network->layers[layer].params;
+                av_freep(&conv_params->kernel);
+                av_freep(&conv_params->biases);
+            }
+            av_freep(&network->layers[layer].params);
+        }
+        av_freep(&network->layers);
+
+        for (uint32_t operand = 0; operand < network->operands_num; ++operand)
+            av_freep(&network->operands[operand].data);
+        av_freep(&network->operands);
+
+        av_freep(&network->output_indexes);
+        av_freep(&network);
+        av_freep(model);
+    }
+}
diff --git a/libavfilter/dnn/dnn_backend_native.h b/libavfilter/dnn/dnn_backend_native.h
new file mode 100644
index 0000000..5d76d87
--- /dev/null
+++ b/libavfilter/dnn/dnn_backend_native.h
@@ -0,0 +1,124 @@
+/*
+ * Copyright (c) 2018 Sergey Lavrushkin
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file
+ * DNN inference functions interface for native backend.
+ */
+
+
+#ifndef AVFILTER_DNN_DNN_BACKEND_NATIVE_H
+#define AVFILTER_DNN_DNN_BACKEND_NATIVE_H
+
+#include "../dnn_interface.h"
+#include "libavformat/avio.h"
+
+/**
+ * the enum value of DNNLayerType should not be changed,
+ * the same values are used in convert_from_tensorflow.py
+ * and, it is used to index the layer execution/load function pointer.
+ */
+typedef enum {
+    DLT_INPUT = 0,
+    DLT_CONV2D = 1,
+    DLT_DEPTH_TO_SPACE = 2,
+    DLT_MIRROR_PAD = 3,
+    DLT_MAXIMUM = 4,
+    DLT_MATH_BINARY = 5,
+    DLT_COUNT
+} DNNLayerType;
+
+typedef enum {DOT_INPUT = 1, DOT_OUTPUT = 2, DOT_INTERMEDIATE = DOT_INPUT | DOT_INPUT} DNNOperandType;
+
+typedef struct Layer{
+    DNNLayerType type;
+    /**
+     * a layer can have multiple inputs and one output.
+     * 4 is just a big enough number for input operands (increase it if necessary),
+     * do not use 'int32_t *input_operand_indexes', so we don't worry about mem leaks.
+     */
+    int32_t input_operand_indexes[4];
+    int32_t output_operand_index;
+    void *params;
+} Layer;
+
+typedef struct DnnOperand{
+    /**
+     * there are two memory layouts, NHWC or NCHW, so we use dims,
+     * dims[0] is Number.
+     */
+    int32_t dims[4];
+
+    /**
+     * input/output/intermediate operand of the network
+     */
+    DNNOperandType type;
+
+    /**
+     * support different kinds of data type such as float, half float, int8 etc,
+     * first support float now.
+     */
+    DNNDataType data_type;
+
+    /**
+     * NHWC if 1, otherwise NCHW.
+     * let's first support NHWC only, this flag is for extensive usage.
+     */
+    int8_t isNHWC;
+
+    /**
+     * to avoid possible memory leak, do not use char *name
+     */
+    char name[128];
+
+    /**
+     * data pointer with data length in bytes.
+     * usedNumbersLeft is only valid for intermediate operand,
+     * it means how many layers still depend on this operand,
+     * todo: the memory can be reused when usedNumbersLeft is zero.
+     */
+    void *data;
+    int32_t length;
+    int32_t usedNumbersLeft;
+}DnnOperand;
+
+typedef struct InputParams{
+    int height, width, channels;
+} InputParams;
+
+// Represents simple feed-forward convolutional network.
+typedef struct ConvolutionalNetwork{
+    Layer *layers;
+    int32_t layers_num;
+    DnnOperand *operands;
+    int32_t operands_num;
+    int32_t *output_indexes;
+    uint32_t nb_output;
+} ConvolutionalNetwork;
+
+DNNModel *ff_dnn_load_model_native(const char *model_filename);
+
+DNNReturnType ff_dnn_execute_model_native(const DNNModel *model, DNNData *outputs, uint32_t nb_output);
+
+void ff_dnn_free_model_native(DNNModel **model);
+
+int32_t calculate_operand_data_length(const DnnOperand *oprd);
+int32_t calculate_operand_dims_count(const DnnOperand *oprd);
+#endif
diff --git a/libavfilter/dnn/dnn_backend_native_layer_conv2d.c b/libavfilter/dnn/dnn_backend_native_layer_conv2d.c
new file mode 100644
index 0000000..7b29697
--- /dev/null
+++ b/libavfilter/dnn/dnn_backend_native_layer_conv2d.c
@@ -0,0 +1,167 @@
+/*
+ * Copyright (c) 2018 Sergey Lavrushkin
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "libavutil/avassert.h"
+#include "dnn_backend_native_layer_conv2d.h"
+
+#define CLAMP_TO_EDGE(x, w) ((x) < 0 ? 0 : ((x) >= (w) ? (w - 1) : (x)))
+
+int dnn_load_layer_conv2d(Layer *layer, AVIOContext *model_file_context, int file_size)
+{
+    ConvolutionalParams *conv_params;
+    int kernel_size;
+    int dnn_size = 0;
+    conv_params = av_malloc(sizeof(*conv_params));
+    if (!conv_params)
+        return 0;
+
+    conv_params->dilation = (int32_t)avio_rl32(model_file_context);
+    conv_params->padding_method = (int32_t)avio_rl32(model_file_context);
+    conv_params->activation = (int32_t)avio_rl32(model_file_context);
+    conv_params->input_num = (int32_t)avio_rl32(model_file_context);
+    conv_params->output_num = (int32_t)avio_rl32(model_file_context);
+    conv_params->kernel_size = (int32_t)avio_rl32(model_file_context);
+    conv_params->has_bias = (int32_t)avio_rl32(model_file_context);
+    dnn_size += 28;
+
+    kernel_size = conv_params->input_num * conv_params->output_num *
+                      conv_params->kernel_size * conv_params->kernel_size;
+    dnn_size += kernel_size * 4;
+    if (conv_params->has_bias)
+        dnn_size += conv_params->output_num * 4;
+
+    if (dnn_size > file_size || conv_params->input_num <= 0 ||
+        conv_params->output_num <= 0 || conv_params->kernel_size <= 0){
+        av_freep(&conv_params);
+        return 0;
+    }
+
+    conv_params->kernel = av_malloc(kernel_size * sizeof(float));
+    if (!conv_params->kernel) {
+        av_freep(&conv_params);
+        return 0;
+    }
+    for (int i = 0; i < kernel_size; ++i) {
+        conv_params->kernel[i] = av_int2float(avio_rl32(model_file_context));
+    }
+
+    conv_params->biases = NULL;
+    if (conv_params->has_bias) {
+        conv_params->biases = av_malloc(conv_params->output_num * sizeof(float));
+        if (!conv_params->biases){
+            av_freep(&conv_params->kernel);
+            av_freep(&conv_params);
+            return 0;
+        }
+        for (int i = 0; i < conv_params->output_num; ++i){
+            conv_params->biases[i] = av_int2float(avio_rl32(model_file_context));
+        }
+    }
+
+    layer->params = conv_params;
+
+    layer->input_operand_indexes[0] = (int32_t)avio_rl32(model_file_context);
+    layer->output_operand_index = (int32_t)avio_rl32(model_file_context);
+    dnn_size += 8;
+    return dnn_size;
+}
+
+int dnn_execute_layer_conv2d(DnnOperand *operands, const int32_t *input_operand_indexes,
+                             int32_t output_operand_index, const void *parameters)
+{
+    float *output;
+    int32_t input_operand_index = input_operand_indexes[0];
+    int number = operands[input_operand_index].dims[0];
+    int height = operands[input_operand_index].dims[1];
+    int width = operands[input_operand_index].dims[2];
+    int channel = operands[input_operand_index].dims[3];
+    const float *input = operands[input_operand_index].data;
+    const ConvolutionalParams *conv_params = (const ConvolutionalParams *)parameters;
+
+    int radius = conv_params->kernel_size >> 1;
+    int src_linesize = width * conv_params->input_num;
+    int filter_linesize = conv_params->kernel_size * conv_params->input_num;
+    int filter_size = conv_params->kernel_size * filter_linesize;
+    int pad_size = (conv_params->padding_method == VALID) ? (conv_params->kernel_size - 1) / 2 * conv_params->dilation : 0;
+
+    DnnOperand *output_operand = &operands[output_operand_index];
+    output_operand->dims[0] = number;
+    output_operand->dims[1] = height - pad_size * 2;
+    output_operand->dims[2] = width - pad_size * 2;
+    output_operand->dims[3] = conv_params->output_num;
+    output_operand->data_type = operands[input_operand_index].data_type;
+    output_operand->length = calculate_operand_data_length(output_operand);
+    output_operand->data = av_realloc(output_operand->data, output_operand->length);
+    if (!output_operand->data)
+        return -1;
+    output = output_operand->data;
+
+    av_assert0(channel == conv_params->input_num);
+
+    for (int y = pad_size; y < height - pad_size; ++y) {
+        for (int x = pad_size; x < width - pad_size; ++x) {
+            for (int n_filter = 0; n_filter < conv_params->output_num; ++n_filter) {
+                if (conv_params->has_bias)
+                    output[n_filter] = conv_params->biases[n_filter];
+                else
+                    output[n_filter] = 0.f;
+
+                for (int ch = 0; ch < conv_params->input_num; ++ch) {
+                    for (int kernel_y = 0; kernel_y < conv_params->kernel_size; ++kernel_y) {
+                        for (int kernel_x = 0; kernel_x < conv_params->kernel_size; ++kernel_x) {
+                            float input_pel;
+                            if (conv_params->padding_method == SAME_CLAMP_TO_EDGE) {
+                                int y_pos = CLAMP_TO_EDGE(y + (kernel_y - radius) * conv_params->dilation, height);
+                                int x_pos = CLAMP_TO_EDGE(x + (kernel_x - radius) * conv_params->dilation, width);
+                                input_pel = input[y_pos * src_linesize + x_pos * conv_params->input_num + ch];
+                            } else {
+                                int y_pos = y + (kernel_y - radius) * conv_params->dilation;
+                                int x_pos = x + (kernel_x - radius) * conv_params->dilation;
+                                input_pel = (x_pos < 0 || x_pos >= width || y_pos < 0 || y_pos >= height) ? 0.0 :
+                                                   input[y_pos * src_linesize + x_pos * conv_params->input_num + ch];
+                            }
+
+
+                            output[n_filter] += input_pel * conv_params->kernel[n_filter * filter_size + kernel_y * filter_linesize +
+                                                                                kernel_x * conv_params->input_num + ch];
+                        }
+                    }
+                }
+                switch (conv_params->activation){
+                case RELU:
+                    output[n_filter] = FFMAX(output[n_filter], 0.0);
+                    break;
+                case TANH:
+                    output[n_filter] = 2.0f  / (1.0f + exp(-2.0f * output[n_filter])) - 1.0f;
+                    break;
+                case SIGMOID:
+                    output[n_filter] = 1.0f / (1.0f + exp(-output[n_filter]));
+                    break;
+                case NONE:
+                    break;
+                case LEAKY_RELU:
+                    output[n_filter] = FFMAX(output[n_filter], 0.0) + 0.2 * FFMIN(output[n_filter], 0.0);
+                }
+            }
+            output += conv_params->output_num;
+        }
+    }
+    return 0;
+}
diff --git a/libavfilter/dnn/dnn_backend_native_layer_conv2d.h b/libavfilter/dnn/dnn_backend_native_layer_conv2d.h
new file mode 100644
index 0000000..bf87264
--- /dev/null
+++ b/libavfilter/dnn/dnn_backend_native_layer_conv2d.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2018 Sergey Lavrushkin
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVFILTER_DNN_DNN_BACKEND_NATIVE_LAYER_CONV2D_H
+#define AVFILTER_DNN_DNN_BACKEND_NATIVE_LAYER_CONV2D_H
+
+#include "dnn_backend_native.h"
+
+typedef enum {RELU, TANH, SIGMOID, NONE, LEAKY_RELU} DNNActivationFunc;
+typedef enum {VALID, SAME, SAME_CLAMP_TO_EDGE} DNNConvPaddingParam;
+
+typedef struct ConvolutionalParams{
+    int32_t input_num, output_num, kernel_size;
+    DNNActivationFunc activation;
+    DNNConvPaddingParam padding_method;
+    int32_t dilation;
+    int32_t has_bias;
+    float *kernel;
+    float *biases;
+} ConvolutionalParams;
+
+int dnn_load_layer_conv2d(Layer *layer, AVIOContext *model_file_context, int file_size);
+int dnn_execute_layer_conv2d(DnnOperand *operands, const int32_t *input_operand_indexes,
+                             int32_t output_operand_index, const void *parameters);
+#endif
diff --git a/libavfilter/dnn/dnn_backend_native_layer_depth2space.c b/libavfilter/dnn/dnn_backend_native_layer_depth2space.c
new file mode 100644
index 0000000..7dab19d
--- /dev/null
+++ b/libavfilter/dnn/dnn_backend_native_layer_depth2space.c
@@ -0,0 +1,93 @@
+/*
+ * Copyright (c) 2018 Sergey Lavrushkin
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file
+ * DNN native backend implementation.
+ */
+
+#include "dnn_backend_native.h"
+#include "libavutil/avassert.h"
+#include "dnn_backend_native_layer_depth2space.h"
+
+int dnn_load_layer_depth2space(Layer *layer, AVIOContext *model_file_context, int file_size)
+{
+    DepthToSpaceParams *params;
+    int dnn_size = 0;
+    params = av_malloc(sizeof(*params));
+    if (!params)
+        return 0;
+
+    params->block_size = (int32_t)avio_rl32(model_file_context);
+    dnn_size += 4;
+    layer->input_operand_indexes[0] = (int32_t)avio_rl32(model_file_context);
+    layer->output_operand_index = (int32_t)avio_rl32(model_file_context);
+    dnn_size += 8;
+    layer->params = params;
+
+    return dnn_size;
+}
+
+int dnn_execute_layer_depth2space(DnnOperand *operands, const int32_t *input_operand_indexes,
+                                  int32_t output_operand_index, const void *parameters)
+{
+    float *output;
+    const DepthToSpaceParams *params = (const DepthToSpaceParams *)parameters;
+    int block_size = params->block_size;
+    int32_t input_operand_index = input_operand_indexes[0];
+    int number = operands[input_operand_index].dims[0];
+    int height = operands[input_operand_index].dims[1];
+    int width = operands[input_operand_index].dims[2];
+    int channels = operands[input_operand_index].dims[3];
+    const float *input = operands[input_operand_index].data;
+
+    int y, x, by, bx, ch;
+    int new_channels = channels / (block_size * block_size);
+    int output_linesize = width * channels;
+    int by_linesize = output_linesize / block_size;
+    int x_linesize = new_channels * block_size;
+
+    DnnOperand *output_operand = &operands[output_operand_index];
+    output_operand->dims[0] = number;
+    output_operand->dims[1] = height * block_size;
+    output_operand->dims[2] = width * block_size;
+    output_operand->dims[3] = new_channels;
+    output_operand->data_type = operands[input_operand_index].data_type;
+    output_operand->length = calculate_operand_data_length(output_operand);
+    output_operand->data = av_realloc(output_operand->data, output_operand->length);
+    if (!output_operand->data)
+        return -1;
+    output = output_operand->data;
+
+    for (y = 0; y < height; ++y){
+        for (x = 0; x < width; ++x){
+            for (by = 0; by < block_size; ++by){
+                for (bx = 0; bx < block_size; ++bx){
+                    for (ch = 0; ch < new_channels; ++ch){
+                        output[by * by_linesize + x * x_linesize + bx * new_channels + ch] = input[ch];
+                    }
+                    input += new_channels;
+                }
+            }
+        }
+        output += output_linesize;
+    }
+    return 0;
+}
diff --git a/libavfilter/dnn/dnn_backend_native_layer_depth2space.h b/libavfilter/dnn/dnn_backend_native_layer_depth2space.h
new file mode 100644
index 0000000..e5465f1
--- /dev/null
+++ b/libavfilter/dnn/dnn_backend_native_layer_depth2space.h
@@ -0,0 +1,41 @@
+/*
+ * Copyright (c) 2018 Sergey Lavrushkin
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file
+ * DNN inference functions interface for native backend.
+ */
+
+
+#ifndef AVFILTER_DNN_DNN_BACKEND_NATIVE_LAYER_DEPTH2SPACE_H
+#define AVFILTER_DNN_DNN_BACKEND_NATIVE_LAYER_DEPTH2SPACE_H
+
+#include "../dnn_interface.h"
+#include "libavformat/avio.h"
+
+typedef struct DepthToSpaceParams{
+    int block_size;
+} DepthToSpaceParams;
+
+int dnn_load_layer_depth2space(Layer *layer, AVIOContext *model_file_context, int file_size);
+int dnn_execute_layer_depth2space(DnnOperand *operands, const int32_t *input_operand_indexes,
+                                  int32_t output_operand_index, const void *parameters);
+
+#endif
diff --git a/libavfilter/dnn/dnn_backend_native_layer_mathbinary.c b/libavfilter/dnn/dnn_backend_native_layer_mathbinary.c
new file mode 100644
index 0000000..c32a042
--- /dev/null
+++ b/libavfilter/dnn/dnn_backend_native_layer_mathbinary.c
@@ -0,0 +1,156 @@
+/*
+ * Copyright (c) 2020
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file
+ * DNN native backend implementation.
+ */
+
+#include "dnn_backend_native.h"
+#include "libavutil/avassert.h"
+#include "dnn_backend_native_layer_mathbinary.h"
+
+int dnn_load_layer_math_binary(Layer *layer, AVIOContext *model_file_context, int file_size)
+{
+    DnnLayerMathBinaryParams *params;
+    int dnn_size = 0;
+    int input_index = 0;
+    params = av_malloc(sizeof(*params));
+    if (!params)
+        return 0;
+
+    params->bin_op = (int32_t)avio_rl32(model_file_context);
+    dnn_size += 4;
+
+    params->input0_broadcast = (int32_t)avio_rl32(model_file_context);
+    dnn_size += 4;
+    if (params->input0_broadcast) {
+        params->v = av_int2float(avio_rl32(model_file_context));
+    } else {
+        layer->input_operand_indexes[input_index] = (int32_t)avio_rl32(model_file_context);
+        input_index++;
+    }
+    dnn_size += 4;
+
+    params->input1_broadcast = (int32_t)avio_rl32(model_file_context);
+    dnn_size += 4;
+    if (params->input1_broadcast) {
+        params->v = av_int2float(avio_rl32(model_file_context));
+    } else {
+        layer->input_operand_indexes[input_index] = (int32_t)avio_rl32(model_file_context);
+        input_index++;
+    }
+    dnn_size += 4;
+
+    layer->output_operand_index = (int32_t)avio_rl32(model_file_context);
+    dnn_size += 4;
+    layer->params = params;
+
+    return dnn_size;
+}
+
+int dnn_execute_layer_math_binary(DnnOperand *operands, const int32_t *input_operand_indexes,
+                                 int32_t output_operand_index, const void *parameters)
+{
+    const DnnOperand *input = &operands[input_operand_indexes[0]];
+    DnnOperand *output = &operands[output_operand_index];
+    const DnnLayerMathBinaryParams *params = (const DnnLayerMathBinaryParams *)parameters;
+    int dims_count;
+    const float *src;
+    float *dst;
+
+    for (int i = 0; i < 4; ++i)
+        output->dims[i] = input->dims[i];
+
+    output->data_type = input->data_type;
+    output->length = calculate_operand_data_length(output);
+    output->data = av_realloc(output->data, output->length);
+    if (!output->data)
+        return DNN_ERROR;
+
+    dims_count = calculate_operand_dims_count(output);
+    src = input->data;
+    dst = output->data;
+
+    switch (params->bin_op) {
+    case DMBO_SUB:
+        if (params->input0_broadcast) {
+            for (int i = 0; i < dims_count; ++i) {
+                dst[i] = params->v - src[i];
+            }
+        } else if (params->input1_broadcast) {
+            for (int i = 0; i < dims_count; ++i) {
+                dst[i] = src[i] - params->v;
+            }
+        } else {
+            const DnnOperand *input1 = &operands[input_operand_indexes[1]];
+            const float *src1 = input1->data;
+            for (int i = 0; i < dims_count; ++i) {
+                dst[i] = src[i] - src1[i];
+            }
+        }
+        return 0;
+    case DMBO_ADD:
+        if (params->input0_broadcast || params->input1_broadcast) {
+            for (int i = 0; i < dims_count; ++i) {
+                dst[i] = params->v + src[i];
+            }
+        } else {
+            const DnnOperand *input1 = &operands[input_operand_indexes[1]];
+            const float *src1 = input1->data;
+            for (int i = 0; i < dims_count; ++i) {
+                dst[i] = src[i] + src1[i];
+            }
+        }
+        return 0;
+    case DMBO_MUL:
+        if (params->input0_broadcast || params->input1_broadcast) {
+            for (int i = 0; i < dims_count; ++i) {
+                dst[i] = params->v * src[i];
+            }
+        } else {
+            const DnnOperand *input1 = &operands[input_operand_indexes[1]];
+            const float *src1 = input1->data;
+            for (int i = 0; i < dims_count; ++i) {
+                dst[i] = src[i] * src1[i];
+            }
+        }
+        return 0;
+    case DMBO_REALDIV:
+        if (params->input0_broadcast) {
+            for (int i = 0; i < dims_count; ++i) {
+                dst[i] = params->v / src[i];
+            }
+        } else if (params->input1_broadcast) {
+            for (int i = 0; i < dims_count; ++i) {
+                dst[i] = src[i] / params->v;
+            }
+        } else {
+            const DnnOperand *input1 = &operands[input_operand_indexes[1]];
+            const float *src1 = input1->data;
+            for (int i = 0; i < dims_count; ++i) {
+                dst[i] = src[i] / src1[i];
+            }
+        }
+        return 0;
+    default:
+        return -1;
+    }
+}
diff --git a/libavfilter/dnn/dnn_backend_native_layer_mathbinary.h b/libavfilter/dnn/dnn_backend_native_layer_mathbinary.h
new file mode 100644
index 0000000..2ffbb66
--- /dev/null
+++ b/libavfilter/dnn/dnn_backend_native_layer_mathbinary.h
@@ -0,0 +1,52 @@
+/*
+ * Copyright (c) 2020
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file
+ * DNN inference functions interface for native backend.
+ */
+
+
+#ifndef AVFILTER_DNN_DNN_BACKEND_NATIVE_LAYER_MATHBINARY_H
+#define AVFILTER_DNN_DNN_BACKEND_NATIVE_LAYER_MATHBINARY_H
+
+#include "libavformat/avio.h"
+#include "dnn_backend_native.h"
+
+typedef enum {
+    DMBO_SUB = 0,
+    DMBO_ADD = 1,
+    DMBO_MUL = 2,
+    DMBO_REALDIV = 3,
+    DMBO_COUNT
+} DNNMathBinaryOperation;
+
+typedef struct DnnLayerMathBinaryParams{
+    DNNMathBinaryOperation bin_op;
+    int input0_broadcast;
+    int input1_broadcast;
+    float v;
+} DnnLayerMathBinaryParams;
+
+int dnn_load_layer_math_binary(Layer *layer, AVIOContext *model_file_context, int file_size);
+int dnn_execute_layer_math_binary(DnnOperand *operands, const int32_t *input_operand_indexes,
+                                 int32_t output_operand_index, const void *parameters);
+
+#endif
diff --git a/libavfilter/dnn/dnn_backend_native_layer_maximum.c b/libavfilter/dnn/dnn_backend_native_layer_maximum.c
new file mode 100644
index 0000000..19f0e8d
--- /dev/null
+++ b/libavfilter/dnn/dnn_backend_native_layer_maximum.c
@@ -0,0 +1,74 @@
+/*
+ * Copyright (c) 2019 Guo Yejun
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file
+ * DNN native backend implementation.
+ */
+
+#include "dnn_backend_native.h"
+#include "libavutil/avassert.h"
+#include "dnn_backend_native_layer_maximum.h"
+
+int dnn_load_layer_maximum(Layer *layer, AVIOContext *model_file_context, int file_size)
+{
+    DnnLayerMaximumParams *params;
+    int dnn_size = 0;
+    params = av_malloc(sizeof(*params));
+    if (!params)
+        return 0;
+
+    params->val.u32 = avio_rl32(model_file_context);
+    dnn_size += 4;
+    layer->params = params;
+    layer->input_operand_indexes[0] = (int32_t)avio_rl32(model_file_context);
+    layer->output_operand_index = (int32_t)avio_rl32(model_file_context);
+    dnn_size += 8;
+
+    return dnn_size;
+}
+
+int dnn_execute_layer_maximum(DnnOperand *operands, const int32_t *input_operand_indexes,
+                              int32_t output_operand_index, const void *parameters)
+{
+    const DnnOperand *input = &operands[input_operand_indexes[0]];
+    DnnOperand *output = &operands[output_operand_index];
+    const DnnLayerMaximumParams *params = (const DnnLayerMaximumParams *)parameters;
+    int dims_count;
+    const float *src;
+    float *dst;
+
+    for (int i = 0; i < 4; ++i)
+        output->dims[i] = input->dims[i];
+
+    output->data_type = input->data_type;
+    output->length = calculate_operand_data_length(output);
+    output->data = av_realloc(output->data, output->length);
+    if (!output->data)
+        return DNN_ERROR;
+
+    dims_count = calculate_operand_dims_count(output);
+    src = input->data;
+    dst = output->data;
+    for (int i = 0; i < dims_count; ++i)
+        dst[i] = FFMAX(src[i], params->val.y);
+
+    return 0;
+}
diff --git a/libavfilter/dnn/dnn_backend_native_layer_maximum.h b/libavfilter/dnn/dnn_backend_native_layer_maximum.h
new file mode 100644
index 0000000..601158b
--- /dev/null
+++ b/libavfilter/dnn/dnn_backend_native_layer_maximum.h
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 2019 Guo Yejun
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file
+ * DNN inference functions interface for native backend.
+ */
+
+
+#ifndef AVFILTER_DNN_DNN_BACKEND_NATIVE_LAYER_MAXIMUM_H
+#define AVFILTER_DNN_DNN_BACKEND_NATIVE_LAYER_MAXIMUM_H
+
+#include "libavformat/avio.h"
+#include "dnn_backend_native.h"
+
+typedef struct DnnLayerMaximumParams{
+    union {
+        uint32_t u32;
+        float y;
+    }val;
+} DnnLayerMaximumParams;
+
+int dnn_load_layer_maximum(Layer *layer, AVIOContext *model_file_context, int file_size);
+int dnn_execute_layer_maximum(DnnOperand *operands, const int32_t *input_operand_indexes,
+                              int32_t output_operand_index, const void *parameters);
+
+#endif
diff --git a/libavfilter/dnn/dnn_backend_native_layer_pad.c b/libavfilter/dnn/dnn_backend_native_layer_pad.c
new file mode 100644
index 0000000..8e5959b
--- /dev/null
+++ b/libavfilter/dnn/dnn_backend_native_layer_pad.c
@@ -0,0 +1,258 @@
+/*
+ * Copyright (c) 2019 Guo Yejun
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include <string.h>
+#include "libavutil/avassert.h"
+#include "dnn_backend_native_layer_pad.h"
+
+int dnn_load_layer_pad(Layer *layer, AVIOContext *model_file_context, int file_size)
+{
+    LayerPadParams *params;
+    int dnn_size = 0;
+    params = av_malloc(sizeof(*params));
+    if (!params)
+        return 0;
+
+    params->mode = (int32_t)avio_rl32(model_file_context);
+    dnn_size += 4;
+    for (int i = 0; i < 4; ++i) {
+        params->paddings[i][0] = avio_rl32(model_file_context);
+        params->paddings[i][1] = avio_rl32(model_file_context);
+        dnn_size += 8;
+    }
+    layer->input_operand_indexes[0] = (int32_t)avio_rl32(model_file_context);
+    layer->output_operand_index = (int32_t)avio_rl32(model_file_context);
+    dnn_size += 8;
+    layer->params = params;
+
+    return dnn_size;
+}
+
+static int before_get_buddy(int given, int paddings, LayerPadModeParam mode)
+{
+    if (mode == LPMP_SYMMETRIC) {
+        return (2 * paddings - 1 - given);
+    } else if (mode == LPMP_REFLECT) {
+        return (2 * paddings - given);
+    } else {
+        av_assert0(!"should not reach here");
+        return 0;
+    }
+}
+
+static int after_get_buddy(int given, int border, LayerPadModeParam mode)
+{
+    if (mode == LPMP_SYMMETRIC) {
+        int offset = given - border;
+        return (border - 1 - offset);
+    } else if (mode == LPMP_REFLECT) {
+        int offset = given - border;
+        return (border - 2 - offset);
+    } else {
+        av_assert0(!"should not reach here");
+        return 0;
+    }
+}
+
+int dnn_execute_layer_pad(DnnOperand *operands, const int32_t *input_operand_indexes,
+                          int32_t output_operand_index, const void *parameters)
+{
+    int32_t before_paddings;
+    int32_t after_paddings;
+    float* output;
+    const LayerPadParams *params = (const LayerPadParams *)parameters;
+
+    // suppose format is <N, H, W, C>
+    int32_t input_operand_index = input_operand_indexes[0];
+    int number = operands[input_operand_index].dims[0];
+    int height = operands[input_operand_index].dims[1];
+    int width = operands[input_operand_index].dims[2];
+    int channel = operands[input_operand_index].dims[3];
+    const float *input = operands[input_operand_index].data;
+
+    int new_number = number + params->paddings[0][0] + params->paddings[0][1];
+    int new_height = height + params->paddings[1][0] + params->paddings[1][1];
+    int new_width = width + params->paddings[2][0] + params->paddings[2][1];
+    int new_channel = channel + params->paddings[3][0] + params->paddings[3][1];
+
+    int c_stride = channel;
+    int wc_stride = c_stride * width;
+    int hwc_stride = wc_stride * height;
+
+    int new_c_stride = new_channel;
+    int new_wc_stride = new_c_stride * new_width;
+    int new_hwc_stride = new_wc_stride * new_height;
+
+    DnnOperand *output_operand = &operands[output_operand_index];
+    output_operand->dims[0] = new_number;
+    output_operand->dims[1] = new_height;
+    output_operand->dims[2] = new_width;
+    output_operand->dims[3] = new_channel;
+    output_operand->data_type = operands[input_operand_index].data_type;
+    output_operand->length = calculate_operand_data_length(output_operand);
+    output_operand->data = av_realloc(output_operand->data, output_operand->length);
+    if (!output_operand->data)
+        return -1;
+    output = output_operand->data;
+
+    // copy the original data
+    for (int n = 0; n < number; n++) {
+        for (int h = 0; h < height; h++) {
+            for (int w = 0; w < width; w++) {
+                const float *src = input + n * hwc_stride + h * wc_stride + w * c_stride;
+                float *dst = output + (n + params->paddings[0][0]) * new_hwc_stride
+                                    + (h + params->paddings[1][0]) * new_wc_stride
+                                    + (w + params->paddings[2][0]) * new_c_stride
+                                    + params->paddings[3][0];
+                memcpy(dst, src, channel * sizeof(float));
+            }
+        }
+    }
+
+    // handle the first dimension
+    before_paddings = params->paddings[0][0];
+    after_paddings = params->paddings[0][1];
+    for (int n = 0; n < before_paddings; n++) {
+        float *dst = output + n * new_hwc_stride;
+        if (params->mode == LPMP_CONSTANT) {
+            for (int i = 0; i < new_hwc_stride; i++) {
+                dst[i] = params->constant_values;
+            }
+        }
+        else {
+            int buddy = before_get_buddy(n, before_paddings, params->mode);
+            float *src = output + buddy * new_hwc_stride;
+            memcpy(dst, src, new_hwc_stride * sizeof(float));
+        }
+    }
+    for (int n = 0; n < after_paddings; n++) {
+        int given = number + before_paddings + n;
+        float *dst = output + given * new_hwc_stride;
+        if (params->mode == LPMP_CONSTANT) {
+            for (int i = 0; i < new_hwc_stride; i++) {
+                dst[i] = params->constant_values;
+            }
+        } else {
+            int buddy = after_get_buddy(given, number + before_paddings, params->mode);
+            float *src = output + buddy * new_hwc_stride;
+            memcpy(dst, src, new_hwc_stride * sizeof(float));
+        }
+    }
+
+    // handle the second dimension
+    before_paddings = params->paddings[1][0];
+    after_paddings = params->paddings[1][1];
+    for (int n = 0; n < new_number; n++) {
+        float *start = output + n * new_hwc_stride;
+        for (int h = 0; h < before_paddings; h++) {
+            float *dst = start + h * new_wc_stride;
+            if (params->mode == LPMP_CONSTANT) {
+                for (int i = 0; i < new_wc_stride; i++) {
+                    dst[i] = params->constant_values;
+                }
+            } else {
+                int buddy = before_get_buddy(h, before_paddings, params->mode);
+                float *src = start + buddy * new_wc_stride;
+                memcpy(dst, src, new_wc_stride * sizeof(float));
+            }
+        }
+        for (int h = 0; h < after_paddings; h++) {
+            int given = height + before_paddings + h;
+            float *dst = start + given * new_wc_stride;
+            if (params->mode == LPMP_CONSTANT) {
+                for (int i = 0; i < new_wc_stride; i++) {
+                    dst[i] = params->constant_values;
+                }
+            } else {
+                int buddy = after_get_buddy(given, height + before_paddings, params->mode);
+                float *src = start + buddy * new_wc_stride;
+                memcpy(dst, src, new_wc_stride * sizeof(float));
+            }
+        }
+    }
+
+    // handle the third dimension
+    before_paddings = params->paddings[2][0];
+    after_paddings = params->paddings[2][1];
+    for (int n = 0; n < new_number; n++) {
+        for (int h = 0; h < new_height; h++) {
+            float *start = output + n * new_hwc_stride + h * new_wc_stride;
+            for (int w = 0; w < before_paddings; w++) {
+                float *dst = start + w * new_c_stride;
+                if (params->mode == LPMP_CONSTANT) {
+                    for (int i = 0; i < new_c_stride; i++) {
+                        dst[i] = params->constant_values;
+                    }
+                } else {
+                    int buddy = before_get_buddy(w, before_paddings, params->mode);
+                    float *src = start + buddy * new_c_stride;
+                    memcpy(dst, src, new_c_stride * sizeof(float));
+                }
+            }
+            for (int w = 0; w < after_paddings; w++) {
+                int given = width + before_paddings + w;
+                float *dst = start + given * new_c_stride;
+                if (params->mode == LPMP_CONSTANT) {
+                    for (int i = 0; i < new_c_stride; i++) {
+                        dst[i] = params->constant_values;
+                    }
+                } else {
+                    int buddy = after_get_buddy(given, width + before_paddings, params->mode);
+                    float *src = start + buddy * new_c_stride;
+                    memcpy(dst, src, new_c_stride * sizeof(float));
+                }
+            }
+        }
+    }
+
+    // handle the fourth dimension
+    before_paddings = params->paddings[3][0];
+    after_paddings = params->paddings[3][1];
+    for (int n = 0; n < new_number; n++) {
+        for (int h = 0; h < new_height; h++) {
+            for (int w = 0; w < new_width; w++) {
+                float *start = output + n * new_hwc_stride + h * new_wc_stride + w * new_c_stride;
+                for (int c = 0; c < before_paddings; c++) {
+                    float *dst = start + c;
+                    if (params->mode == LPMP_CONSTANT) {
+                        *dst = params->constant_values;
+                    } else {
+                        int buddy = before_get_buddy(c, before_paddings, params->mode);
+                        float *src = start + buddy;
+                        *dst = *src;
+                    }
+                }
+                for (int c = 0; c < after_paddings; c++) {
+                    int given = channel + before_paddings + c;
+                    float *dst = start + given;
+                    if (params->mode == LPMP_CONSTANT) {
+                        *dst = params->constant_values;
+                    } else {
+                        int buddy = after_get_buddy(given, channel + before_paddings, params->mode);
+                        float *src = start + buddy;
+                        *dst = *src;
+                    }
+                }
+            }
+        }
+    }
+
+    return 0;
+}
diff --git a/libavfilter/dnn/dnn_backend_native_layer_pad.h b/libavfilter/dnn/dnn_backend_native_layer_pad.h
new file mode 100644
index 0000000..936a9bd
--- /dev/null
+++ b/libavfilter/dnn/dnn_backend_native_layer_pad.h
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 2019 Guo Yejun
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file
+ * layer pad (equivalent to tf.pad) for native backend.
+ */
+#ifndef AVFILTER_DNN_DNN_BACKEND_NATIVE_LAYER_PAD_H
+#define AVFILTER_DNN_DNN_BACKEND_NATIVE_LAYER_PAD_H
+
+#include <stdint.h>
+#include "dnn_backend_native.h"
+
+typedef enum {LPMP_CONSTANT, LPMP_REFLECT, LPMP_SYMMETRIC} LayerPadModeParam;
+
+typedef struct LayerPadParams{
+    int32_t paddings[4][2];
+    LayerPadModeParam mode;
+    float constant_values;
+} LayerPadParams;
+
+int dnn_load_layer_pad(Layer *layer, AVIOContext *model_file_context, int file_size);
+int dnn_execute_layer_pad(DnnOperand *operands, const int32_t *input_operand_indexes,
+                          int32_t output_operand_index, const void *parameters);
+
+#endif
diff --git a/libavfilter/dnn/dnn_backend_native_layers.c b/libavfilter/dnn/dnn_backend_native_layers.c
new file mode 100644
index 0000000..af18552
--- /dev/null
+++ b/libavfilter/dnn/dnn_backend_native_layers.c
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 2019 Guo Yejun
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include <string.h>
+#include "dnn_backend_native_layers.h"
+#include "dnn_backend_native_layer_pad.h"
+#include "dnn_backend_native_layer_conv2d.h"
+#include "dnn_backend_native_layer_depth2space.h"
+#include "dnn_backend_native_layer_maximum.h"
+#include "dnn_backend_native_layer_mathbinary.h"
+
+LayerFunc layer_funcs[DLT_COUNT] = {
+    {NULL, NULL},
+    {dnn_execute_layer_conv2d,      dnn_load_layer_conv2d},
+    {dnn_execute_layer_depth2space, dnn_load_layer_depth2space},
+    {dnn_execute_layer_pad,         dnn_load_layer_pad},
+    {dnn_execute_layer_maximum,     dnn_load_layer_maximum},
+    {dnn_execute_layer_math_binary, dnn_load_layer_math_binary},
+};
diff --git a/libavfilter/dnn/dnn_backend_native_layers.h b/libavfilter/dnn/dnn_backend_native_layers.h
new file mode 100644
index 0000000..2df0ce9
--- /dev/null
+++ b/libavfilter/dnn/dnn_backend_native_layers.h
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 2019 Guo Yejun
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVFILTER_DNN_DNN_BACKEND_NATIVE_LAYERS_H
+#define AVFILTER_DNN_DNN_BACKEND_NATIVE_LAYERS_H
+
+#include <stdint.h>
+#include "dnn_backend_native.h"
+
+typedef int (*LAYER_EXEC_FUNC)(DnnOperand *operands, const int32_t *input_operand_indexes,
+                               int32_t output_operand_index, const void *parameters);
+typedef int (*LAYER_LOAD_FUNC)(Layer *layer, AVIOContext *model_file_context, int file_size);
+
+typedef struct LayerFunc {
+    LAYER_EXEC_FUNC pf_exec;
+    LAYER_LOAD_FUNC pf_load;
+}LayerFunc;
+
+extern LayerFunc layer_funcs[DLT_COUNT];
+
+#endif
diff --git a/libavfilter/dnn_backend_tf.c b/libavfilter/dnn/dnn_backend_tf.c
similarity index 69%
rename from libavfilter/dnn_backend_tf.c
rename to libavfilter/dnn/dnn_backend_tf.c
index 5bc7f06..9ceca5c 100644
--- a/libavfilter/dnn_backend_tf.c
+++ b/libavfilter/dnn/dnn_backend_tf.c
@@ -25,7 +25,12 @@
 
 #include "dnn_backend_tf.h"
 #include "dnn_backend_native.h"
+#include "dnn_backend_native_layer_conv2d.h"
+#include "dnn_backend_native_layer_depth2space.h"
 #include "libavformat/avio.h"
+#include "libavutil/avassert.h"
+#include "dnn_backend_native_layer_pad.h"
+#include "dnn_backend_native_layer_maximum.h"
 
 #include <tensorflow/c/c_api.h>
 
@@ -33,9 +38,11 @@
     TF_Graph *graph;
     TF_Session *session;
     TF_Status *status;
-    TF_Output input, output;
+    TF_Output input;
     TF_Tensor *input_tensor;
-    DNNData *output_data;
+    TF_Output *outputs;
+    TF_Tensor **output_tensors;
+    uint32_t nb_output;
 } TFModel;
 
 static void free_buffer(void *data, size_t length)
@@ -76,16 +83,67 @@
     return graph_buf;
 }
 
-static DNNReturnType set_input_output_tf(void *model, DNNData *input, DNNData *output)
+static TF_Tensor *allocate_input_tensor(const DNNData *input)
+{
+    TF_DataType dt;
+    size_t size;
+    int64_t input_dims[] = {1, input->height, input->width, input->channels};
+    switch (input->dt) {
+    case DNN_FLOAT:
+        dt = TF_FLOAT;
+        size = sizeof(float);
+        break;
+    case DNN_UINT8:
+        dt = TF_UINT8;
+        size = 1;
+        break;
+    default:
+        av_assert0(!"should not reach here");
+    }
+
+    return TF_AllocateTensor(dt, input_dims, 4,
+                             input_dims[1] * input_dims[2] * input_dims[3] * size);
+}
+
+static DNNReturnType get_input_tf(void *model, DNNData *input, const char *input_name)
 {
     TFModel *tf_model = (TFModel *)model;
-    int64_t input_dims[] = {1, input->height, input->width, input->channels};
+    TF_Status *status;
+    int64_t dims[4];
+
+    TF_Output tf_output;
+    tf_output.oper = TF_GraphOperationByName(tf_model->graph, input_name);
+    if (!tf_output.oper)
+        return DNN_ERROR;
+
+    tf_output.index = 0;
+    input->dt = TF_OperationOutputType(tf_output);
+
+    status = TF_NewStatus();
+    TF_GraphGetTensorShape(tf_model->graph, tf_output, dims, 4, status);
+    if (TF_GetCode(status) != TF_OK){
+        TF_DeleteStatus(status);
+        return DNN_ERROR;
+    }
+    TF_DeleteStatus(status);
+
+    // currently only NHWC is supported
+    av_assert0(dims[0] == 1);
+    input->height = dims[1];
+    input->width = dims[2];
+    input->channels = dims[3];
+
+    return DNN_SUCCESS;
+}
+
+static DNNReturnType set_input_output_tf(void *model, DNNData *input, const char *input_name, const char **output_names, uint32_t nb_output)
+{
+    TFModel *tf_model = (TFModel *)model;
     TF_SessionOptions *sess_opts;
     const TF_Operation *init_op = TF_GraphOperationByName(tf_model->graph, "init");
-    TF_Tensor *output_tensor;
 
-    // Input operation should be named 'x'
-    tf_model->input.oper = TF_GraphOperationByName(tf_model->graph, "x");
+    // Input operation
+    tf_model->input.oper = TF_GraphOperationByName(tf_model->graph, input_name);
     if (!tf_model->input.oper){
         return DNN_ERROR;
     }
@@ -93,19 +151,45 @@
     if (tf_model->input_tensor){
         TF_DeleteTensor(tf_model->input_tensor);
     }
-    tf_model->input_tensor = TF_AllocateTensor(TF_FLOAT, input_dims, 4,
-                                               input_dims[1] * input_dims[2] * input_dims[3] * sizeof(float));
+    tf_model->input_tensor = allocate_input_tensor(input);
     if (!tf_model->input_tensor){
         return DNN_ERROR;
     }
     input->data = (float *)TF_TensorData(tf_model->input_tensor);
 
-    // Output operation should be named 'y'
-    tf_model->output.oper = TF_GraphOperationByName(tf_model->graph, "y");
-    if (!tf_model->output.oper){
+    // Output operation
+    if (nb_output == 0)
+        return DNN_ERROR;
+
+    av_freep(&tf_model->outputs);
+    tf_model->outputs = av_malloc_array(nb_output, sizeof(*tf_model->outputs));
+    if (!tf_model->outputs)
+        return DNN_ERROR;
+    for (int i = 0; i < nb_output; ++i) {
+        tf_model->outputs[i].oper = TF_GraphOperationByName(tf_model->graph, output_names[i]);
+        if (!tf_model->outputs[i].oper){
+            av_freep(&tf_model->outputs);
+            return DNN_ERROR;
+        }
+        tf_model->outputs[i].index = 0;
+    }
+
+    if (tf_model->output_tensors) {
+        for (uint32_t i = 0; i < tf_model->nb_output; ++i) {
+            if (tf_model->output_tensors[i]) {
+                TF_DeleteTensor(tf_model->output_tensors[i]);
+                tf_model->output_tensors[i] = NULL;
+            }
+        }
+    }
+    av_freep(&tf_model->output_tensors);
+    tf_model->output_tensors = av_mallocz_array(nb_output, sizeof(*tf_model->output_tensors));
+    if (!tf_model->output_tensors) {
+        av_freep(&tf_model->outputs);
         return DNN_ERROR;
     }
-    tf_model->output.index = 0;
+
+    tf_model->nb_output = nb_output;
 
     if (tf_model->session){
         TF_CloseSession(tf_model->session, tf_model->status);
@@ -132,26 +216,6 @@
         }
     }
 
-    // Execute network to get output height, width and number of channels
-    TF_SessionRun(tf_model->session, NULL,
-                  &tf_model->input, &tf_model->input_tensor, 1,
-                  &tf_model->output, &output_tensor, 1,
-                  NULL, 0, NULL, tf_model->status);
-    if (TF_GetCode(tf_model->status) != TF_OK){
-        return DNN_ERROR;
-    }
-    else{
-        output->height = TF_Dim(output_tensor, 1);
-        output->width = TF_Dim(output_tensor, 2);
-        output->channels = TF_Dim(output_tensor, 3);
-        output->data = av_malloc(output->height * output->width * output->channels * sizeof(float));
-        if (!output->data){
-            return DNN_ERROR;
-        }
-        tf_model->output_data = output;
-        TF_DeleteTensor(output_tensor);
-    }
-
     return DNN_SUCCESS;
 }
 
@@ -318,23 +382,8 @@
     return DNN_SUCCESS;
 }
 
-static int calculate_pad(const ConvolutionalNetwork *conv_network)
-{
-    ConvolutionalParams *params;
-    int32_t layer;
-    int pad = 0;
-
-    for (layer = 0; layer < conv_network->layers_num; ++layer){
-        if (conv_network->layers[layer].type == CONV){
-            params = (ConvolutionalParams *)conv_network->layers[layer].params;
-            pad += params->kernel_size >> 1;
-        }
-    }
-
-    return pad;
-}
-
-static DNNReturnType add_pad_op(TFModel *tf_model, TF_Operation **cur_op, const int32_t pad)
+static DNNReturnType add_pad_layer(TFModel *tf_model, TF_Operation **cur_op,
+                                              LayerPadParams *params, const int layer)
 {
     TF_Operation *op;
     TF_Tensor *tensor;
@@ -343,16 +392,21 @@
     int32_t *pads;
     int64_t pads_shape[] = {4, 2};
 
-    input.index = 0;
+    char name_buffer[NAME_BUFFER_SIZE];
+    snprintf(name_buffer, NAME_BUFFER_SIZE, "pad%d", layer);
 
-    op_desc = TF_NewOperation(tf_model->graph, "Const", "pads");
+    op_desc = TF_NewOperation(tf_model->graph, "Const", name_buffer);
     TF_SetAttrType(op_desc, "dtype", TF_INT32);
     tensor = TF_AllocateTensor(TF_INT32, pads_shape, 2, 4 * 2 * sizeof(int32_t));
     pads = (int32_t *)TF_TensorData(tensor);
-    pads[0] = 0;   pads[1] = 0;
-    pads[2] = pad; pads[3] = pad;
-    pads[4] = pad; pads[5] = pad;
-    pads[6] = 0;   pads[7] = 0;
+    pads[0] = params->paddings[0][0];
+    pads[1] = params->paddings[0][1];
+    pads[2] = params->paddings[1][0];
+    pads[3] = params->paddings[1][1];
+    pads[4] = params->paddings[2][0];
+    pads[5] = params->paddings[2][1];
+    pads[6] = params->paddings[3][0];
+    pads[7] = params->paddings[3][1];
     TF_SetAttrTensor(op_desc, "value", tensor, tf_model->status);
     if (TF_GetCode(tf_model->status) != TF_OK){
         return DNN_ERROR;
@@ -364,6 +418,7 @@
 
     op_desc = TF_NewOperation(tf_model->graph, "MirrorPad", "mirror_pad");
     input.oper = *cur_op;
+    input.index = 0;
     TF_AddInput(op_desc, input);
     input.oper = op;
     TF_AddInput(op_desc, input);
@@ -378,6 +433,48 @@
     return DNN_SUCCESS;
 }
 
+static DNNReturnType add_maximum_layer(TFModel *tf_model, TF_Operation **cur_op,
+                                       DnnLayerMaximumParams *params, const int layer)
+{
+    TF_Operation *op;
+    TF_Tensor *tensor;
+    TF_OperationDescription *op_desc;
+    TF_Output input;
+    float *y;
+
+    char name_buffer[NAME_BUFFER_SIZE];
+    snprintf(name_buffer, NAME_BUFFER_SIZE, "maximum/y%d", layer);
+
+    op_desc = TF_NewOperation(tf_model->graph, "Const", name_buffer);
+    TF_SetAttrType(op_desc, "dtype", TF_FLOAT);
+    tensor = TF_AllocateTensor(TF_FLOAT, NULL, 0, TF_DataTypeSize(TF_FLOAT));
+    y = (float *)TF_TensorData(tensor);
+    *y = params->val.y;
+    TF_SetAttrTensor(op_desc, "value", tensor, tf_model->status);
+    if (TF_GetCode(tf_model->status) != TF_OK){
+        return DNN_ERROR;
+    }
+    op = TF_FinishOperation(op_desc, tf_model->status);
+    if (TF_GetCode(tf_model->status) != TF_OK){
+        return DNN_ERROR;
+    }
+
+    snprintf(name_buffer, NAME_BUFFER_SIZE, "maximum%d", layer);
+    op_desc = TF_NewOperation(tf_model->graph, "Maximum", name_buffer);
+    input.oper = *cur_op;
+    input.index = 0;
+    TF_AddInput(op_desc, input);
+    input.oper = op;
+    TF_AddInput(op_desc, input);
+    TF_SetAttrType(op_desc, "T", TF_FLOAT);
+    *cur_op = TF_FinishOperation(op_desc, tf_model->status);
+    if (TF_GetCode(tf_model->status) != TF_OK){
+        return DNN_ERROR;
+    }
+
+    return DNN_SUCCESS;
+}
+
 static DNNReturnType load_native_model(TFModel *tf_model, const char *model_filename)
 {
     int32_t layer;
@@ -389,7 +486,6 @@
     int32_t *transpose_perm;
     int64_t transpose_perm_shape[] = {4};
     int64_t input_shape[] = {1, -1, -1, -1};
-    int32_t pad;
     DNNReturnType layer_add_res;
     DNNModel *native_model = NULL;
     ConvolutionalNetwork *conv_network;
@@ -400,7 +496,6 @@
     }
 
     conv_network = (ConvolutionalNetwork *)native_model->model;
-    pad = calculate_pad(conv_network);
     tf_model->graph = TF_NewGraph();
     tf_model->status = TF_NewStatus();
 
@@ -419,10 +514,6 @@
         CLEANUP_ON_ERROR(tf_model);
     }
 
-    if (add_pad_op(tf_model, &op, pad) != DNN_SUCCESS){
-        CLEANUP_ON_ERROR(tf_model);
-    }
-
     op_desc = TF_NewOperation(tf_model->graph, "Const", "transpose_perm");
     TF_SetAttrType(op_desc, "dtype", TF_INT32);
     tensor = TF_AllocateTensor(TF_INT32, transpose_perm_shape, 1, 4 * sizeof(int32_t));
@@ -439,16 +530,25 @@
 
     for (layer = 0; layer < conv_network->layers_num; ++layer){
         switch (conv_network->layers[layer].type){
-        case INPUT:
+        case DLT_INPUT:
+            layer_add_res = DNN_SUCCESS;
             break;
-        case CONV:
+        case DLT_CONV2D:
             layer_add_res = add_conv_layer(tf_model, transpose_op, &op,
                                            (ConvolutionalParams *)conv_network->layers[layer].params, layer);
             break;
-        case DEPTH_TO_SPACE:
+        case DLT_DEPTH_TO_SPACE:
             layer_add_res = add_depth_to_space_layer(tf_model, &op,
                                                      (DepthToSpaceParams *)conv_network->layers[layer].params, layer);
             break;
+        case DLT_MIRROR_PAD:
+            layer_add_res = add_pad_layer(tf_model, &op,
+                                          (LayerPadParams *)conv_network->layers[layer].params, layer);
+            break;
+        case DLT_MAXIMUM:
+            layer_add_res = add_maximum_layer(tf_model, &op,
+                                          (DnnLayerMaximumParams *)conv_network->layers[layer].params, layer);
+            break;
         default:
             CLEANUP_ON_ERROR(tf_model);
         }
@@ -460,6 +560,7 @@
 
     op_desc = TF_NewOperation(tf_model->graph, "Identity", "y");
     input.oper = op;
+    input.index = 0;
     TF_AddInput(op_desc, input);
     TF_FinishOperation(op_desc, tf_model->status);
     if (TF_GetCode(tf_model->status) != TF_OK){
@@ -481,14 +582,11 @@
         return NULL;
     }
 
-    tf_model = av_malloc(sizeof(TFModel));
+    tf_model = av_mallocz(sizeof(TFModel));
     if (!tf_model){
         av_freep(&model);
         return NULL;
     }
-    tf_model->session = NULL;
-    tf_model->input_tensor = NULL;
-    tf_model->output_data = NULL;
 
     if (load_tf_model(tf_model, model_filename) != DNN_SUCCESS){
         if (load_native_model(tf_model, model_filename) != DNN_SUCCESS){
@@ -501,33 +599,46 @@
 
     model->model = (void *)tf_model;
     model->set_input_output = &set_input_output_tf;
+    model->get_input = &get_input_tf;
 
     return model;
 }
 
 
 
-DNNReturnType ff_dnn_execute_model_tf(const DNNModel *model)
+DNNReturnType ff_dnn_execute_model_tf(const DNNModel *model, DNNData *outputs, uint32_t nb_output)
 {
     TFModel *tf_model = (TFModel *)model->model;
-    TF_Tensor *output_tensor;
+    uint32_t nb = FFMIN(nb_output, tf_model->nb_output);
+    if (nb == 0)
+        return DNN_ERROR;
+
+    av_assert0(tf_model->output_tensors);
+    for (uint32_t i = 0; i < tf_model->nb_output; ++i) {
+        if (tf_model->output_tensors[i]) {
+            TF_DeleteTensor(tf_model->output_tensors[i]);
+            tf_model->output_tensors[i] = NULL;
+        }
+    }
 
     TF_SessionRun(tf_model->session, NULL,
                   &tf_model->input, &tf_model->input_tensor, 1,
-                  &tf_model->output, &output_tensor, 1,
+                  tf_model->outputs, tf_model->output_tensors, nb,
                   NULL, 0, NULL, tf_model->status);
 
     if (TF_GetCode(tf_model->status) != TF_OK){
         return DNN_ERROR;
     }
-    else{
-        memcpy(tf_model->output_data->data, TF_TensorData(output_tensor),
-               tf_model->output_data->height * tf_model->output_data->width *
-               tf_model->output_data->channels * sizeof(float));
-        TF_DeleteTensor(output_tensor);
 
-        return DNN_SUCCESS;
+    for (uint32_t i = 0; i < nb; ++i) {
+        outputs[i].height = TF_Dim(tf_model->output_tensors[i], 1);
+        outputs[i].width = TF_Dim(tf_model->output_tensors[i], 2);
+        outputs[i].channels = TF_Dim(tf_model->output_tensors[i], 3);
+        outputs[i].data = TF_TensorData(tf_model->output_tensors[i]);
+        outputs[i].dt = TF_TensorType(tf_model->output_tensors[i]);
     }
+
+    return DNN_SUCCESS;
 }
 
 void ff_dnn_free_model_tf(DNNModel **model)
@@ -549,9 +660,16 @@
         if (tf_model->input_tensor){
             TF_DeleteTensor(tf_model->input_tensor);
         }
-        if (tf_model->output_data){
-            av_freep(&tf_model->output_data->data);
+        if (tf_model->output_tensors) {
+            for (uint32_t i = 0; i < tf_model->nb_output; ++i) {
+                if (tf_model->output_tensors[i]) {
+                    TF_DeleteTensor(tf_model->output_tensors[i]);
+                    tf_model->output_tensors[i] = NULL;
+                }
+            }
         }
+        av_freep(&tf_model->outputs);
+        av_freep(&tf_model->output_tensors);
         av_freep(&tf_model);
         av_freep(model);
     }
diff --git a/libavfilter/dnn_backend_tf.h b/libavfilter/dnn/dnn_backend_tf.h
similarity index 82%
rename from libavfilter/dnn_backend_tf.h
rename to libavfilter/dnn/dnn_backend_tf.h
index 7ba84f4..3e450891 100644
--- a/libavfilter/dnn_backend_tf.h
+++ b/libavfilter/dnn/dnn_backend_tf.h
@@ -24,14 +24,14 @@
  */
 
 
-#ifndef AVFILTER_DNN_BACKEND_TF_H
-#define AVFILTER_DNN_BACKEND_TF_H
+#ifndef AVFILTER_DNN_DNN_BACKEND_TF_H
+#define AVFILTER_DNN_DNN_BACKEND_TF_H
 
-#include "dnn_interface.h"
+#include "../dnn_interface.h"
 
 DNNModel *ff_dnn_load_model_tf(const char *model_filename);
 
-DNNReturnType ff_dnn_execute_model_tf(const DNNModel *model);
+DNNReturnType ff_dnn_execute_model_tf(const DNNModel *model, DNNData *outputs, uint32_t nb_output);
 
 void ff_dnn_free_model_tf(DNNModel **model);
 
diff --git a/libavfilter/dnn_interface.c b/libavfilter/dnn/dnn_interface.c
similarity index 98%
rename from libavfilter/dnn_interface.c
rename to libavfilter/dnn/dnn_interface.c
index 86fc283..62da55f 100644
--- a/libavfilter/dnn_interface.c
+++ b/libavfilter/dnn/dnn_interface.c
@@ -23,7 +23,7 @@
  * Implements DNN module initialization with specified backend.
  */
 
-#include "dnn_interface.h"
+#include "../dnn_interface.h"
 #include "dnn_backend_native.h"
 #include "dnn_backend_tf.h"
 #include "libavutil/mem.h"
diff --git a/libavfilter/dnn_backend_native.c b/libavfilter/dnn_backend_native.c
deleted file mode 100644
index 70d857f..0000000
--- a/libavfilter/dnn_backend_native.c
+++ /dev/null
@@ -1,350 +0,0 @@
-/*
- * Copyright (c) 2018 Sergey Lavrushkin
- *
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with FFmpeg; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-/**
- * @file
- * DNN native backend implementation.
- */
-
-#include "dnn_backend_native.h"
-
-static DNNReturnType set_input_output_native(void *model, DNNData *input, DNNData *output)
-{
-    ConvolutionalNetwork *network = (ConvolutionalNetwork *)model;
-    InputParams *input_params;
-    ConvolutionalParams *conv_params;
-    DepthToSpaceParams *depth_to_space_params;
-    int cur_width, cur_height, cur_channels;
-    int32_t layer;
-
-    if (network->layers_num <= 0 || network->layers[0].type != INPUT){
-        return DNN_ERROR;
-    }
-    else{
-        input_params = (InputParams *)network->layers[0].params;
-        input_params->width = cur_width = input->width;
-        input_params->height = cur_height = input->height;
-        input_params->channels = cur_channels = input->channels;
-        if (input->data){
-            av_freep(&input->data);
-        }
-        network->layers[0].output = input->data = av_malloc(cur_height * cur_width * cur_channels * sizeof(float));
-        if (!network->layers[0].output){
-            return DNN_ERROR;
-        }
-    }
-
-    for (layer = 1; layer < network->layers_num; ++layer){
-        switch (network->layers[layer].type){
-        case CONV:
-            conv_params = (ConvolutionalParams *)network->layers[layer].params;
-            if (conv_params->input_num != cur_channels){
-                return DNN_ERROR;
-            }
-            cur_channels = conv_params->output_num;
-            break;
-        case DEPTH_TO_SPACE:
-            depth_to_space_params = (DepthToSpaceParams *)network->layers[layer].params;
-            if (cur_channels % (depth_to_space_params->block_size * depth_to_space_params->block_size) != 0){
-                return DNN_ERROR;
-            }
-            cur_channels = cur_channels / (depth_to_space_params->block_size * depth_to_space_params->block_size);
-            cur_height *= depth_to_space_params->block_size;
-            cur_width *= depth_to_space_params->block_size;
-            break;
-        default:
-            return DNN_ERROR;
-        }
-        if (network->layers[layer].output){
-            av_freep(&network->layers[layer].output);
-        }
-        network->layers[layer].output = av_malloc(cur_height * cur_width * cur_channels * sizeof(float));
-        if (!network->layers[layer].output){
-            return DNN_ERROR;
-        }
-    }
-
-    output->data = network->layers[network->layers_num - 1].output;
-    output->height = cur_height;
-    output->width = cur_width;
-    output->channels = cur_channels;
-
-    return DNN_SUCCESS;
-}
-
-// Loads model and its parameters that are stored in a binary file with following structure:
-// layers_num,layer_type,layer_parameterss,layer_type,layer_parameters...
-// For CONV layer: activation_function, input_num, output_num, kernel_size, kernel, biases
-// For DEPTH_TO_SPACE layer: block_size
-DNNModel *ff_dnn_load_model_native(const char *model_filename)
-{
-    DNNModel *model = NULL;
-    ConvolutionalNetwork *network = NULL;
-    AVIOContext *model_file_context;
-    int file_size, dnn_size, kernel_size, i;
-    int32_t layer;
-    DNNLayerType layer_type;
-    ConvolutionalParams *conv_params;
-    DepthToSpaceParams *depth_to_space_params;
-
-    model = av_malloc(sizeof(DNNModel));
-    if (!model){
-        return NULL;
-    }
-
-    if (avio_open(&model_file_context, model_filename, AVIO_FLAG_READ) < 0){
-        av_freep(&model);
-        return NULL;
-    }
-    file_size = avio_size(model_file_context);
-
-    network = av_malloc(sizeof(ConvolutionalNetwork));
-    if (!network){
-        avio_closep(&model_file_context);
-        av_freep(&model);
-        return NULL;
-    }
-    model->model = (void *)network;
-
-    network->layers_num = 1 + (int32_t)avio_rl32(model_file_context);
-    dnn_size = 4;
-
-    network->layers = av_malloc(network->layers_num * sizeof(Layer));
-    if (!network->layers){
-        av_freep(&network);
-        avio_closep(&model_file_context);
-        av_freep(&model);
-        return NULL;
-    }
-
-    for (layer = 0; layer < network->layers_num; ++layer){
-        network->layers[layer].output = NULL;
-        network->layers[layer].params = NULL;
-    }
-    network->layers[0].type = INPUT;
-    network->layers[0].params = av_malloc(sizeof(InputParams));
-    if (!network->layers[0].params){
-        avio_closep(&model_file_context);
-        ff_dnn_free_model_native(&model);
-        return NULL;
-    }
-
-    for (layer = 1; layer < network->layers_num; ++layer){
-        layer_type = (int32_t)avio_rl32(model_file_context);
-        dnn_size += 4;
-        switch (layer_type){
-        case CONV:
-            conv_params = av_malloc(sizeof(ConvolutionalParams));
-            if (!conv_params){
-                avio_closep(&model_file_context);
-                ff_dnn_free_model_native(&model);
-                return NULL;
-            }
-            conv_params->activation = (int32_t)avio_rl32(model_file_context);
-            conv_params->input_num = (int32_t)avio_rl32(model_file_context);
-            conv_params->output_num = (int32_t)avio_rl32(model_file_context);
-            conv_params->kernel_size = (int32_t)avio_rl32(model_file_context);
-            kernel_size = conv_params->input_num * conv_params->output_num *
-                          conv_params->kernel_size * conv_params->kernel_size;
-            dnn_size += 16 + (kernel_size + conv_params->output_num << 2);
-            if (dnn_size > file_size || conv_params->input_num <= 0 ||
-                conv_params->output_num <= 0 || conv_params->kernel_size <= 0){
-                avio_closep(&model_file_context);
-                ff_dnn_free_model_native(&model);
-                return NULL;
-            }
-            conv_params->kernel = av_malloc(kernel_size * sizeof(float));
-            conv_params->biases = av_malloc(conv_params->output_num * sizeof(float));
-            if (!conv_params->kernel || !conv_params->biases){
-                avio_closep(&model_file_context);
-                ff_dnn_free_model_native(&model);
-                return NULL;
-            }
-            for (i = 0; i < kernel_size; ++i){
-                conv_params->kernel[i] = av_int2float(avio_rl32(model_file_context));
-            }
-            for (i = 0; i < conv_params->output_num; ++i){
-                conv_params->biases[i] = av_int2float(avio_rl32(model_file_context));
-            }
-            network->layers[layer].type = CONV;
-            network->layers[layer].params = conv_params;
-            break;
-        case DEPTH_TO_SPACE:
-            depth_to_space_params = av_malloc(sizeof(DepthToSpaceParams));
-            if (!depth_to_space_params){
-                avio_closep(&model_file_context);
-                ff_dnn_free_model_native(&model);
-                return NULL;
-            }
-            depth_to_space_params->block_size = (int32_t)avio_rl32(model_file_context);
-            dnn_size += 4;
-            network->layers[layer].type = DEPTH_TO_SPACE;
-            network->layers[layer].params = depth_to_space_params;
-            break;
-        default:
-            avio_closep(&model_file_context);
-            ff_dnn_free_model_native(&model);
-            return NULL;
-        }
-    }
-
-    avio_closep(&model_file_context);
-
-    if (dnn_size != file_size){
-        ff_dnn_free_model_native(&model);
-        return NULL;
-    }
-
-    model->set_input_output = &set_input_output_native;
-
-    return model;
-}
-
-#define CLAMP_TO_EDGE(x, w) ((x) < 0 ? 0 : ((x) >= (w) ? (w - 1) : (x)))
-
-static void convolve(const float *input, float *output, const ConvolutionalParams *conv_params, int width, int height)
-{
-    int y, x, n_filter, ch, kernel_y, kernel_x;
-    int radius = conv_params->kernel_size >> 1;
-    int src_linesize = width * conv_params->input_num;
-    int filter_linesize = conv_params->kernel_size * conv_params->input_num;
-    int filter_size = conv_params->kernel_size * filter_linesize;
-
-    for (y = 0; y < height; ++y){
-        for (x = 0; x < width; ++x){
-            for (n_filter = 0; n_filter < conv_params->output_num; ++n_filter){
-                output[n_filter] = conv_params->biases[n_filter];
-                for (ch = 0; ch < conv_params->input_num; ++ch){
-                    for (kernel_y = 0; kernel_y < conv_params->kernel_size; ++kernel_y){
-                        for (kernel_x = 0; kernel_x < conv_params->kernel_size; ++kernel_x){
-                            output[n_filter] += input[CLAMP_TO_EDGE(y + kernel_y - radius, height) * src_linesize +
-                                                      CLAMP_TO_EDGE(x + kernel_x - radius, width) * conv_params->input_num + ch] *
-                                                conv_params->kernel[n_filter * filter_size + kernel_y * filter_linesize +
-                                                                    kernel_x * conv_params->input_num + ch];
-                        }
-                    }
-                }
-                switch (conv_params->activation){
-                case RELU:
-                    output[n_filter] = FFMAX(output[n_filter], 0.0);
-                    break;
-                case TANH:
-                    output[n_filter] = 2.0f  / (1.0f + exp(-2.0f * output[n_filter])) - 1.0f;
-                    break;
-                case SIGMOID:
-                    output[n_filter] = 1.0f / (1.0f + exp(-output[n_filter]));
-                }
-            }
-            output += conv_params->output_num;
-        }
-    }
-}
-
-static void depth_to_space(const float *input, float *output, int block_size, int width, int height, int channels)
-{
-    int y, x, by, bx, ch;
-    int new_channels = channels / (block_size * block_size);
-    int output_linesize = width * channels;
-    int by_linesize = output_linesize / block_size;
-    int x_linesize = new_channels * block_size;
-
-    for (y = 0; y < height; ++y){
-        for (x = 0; x < width; ++x){
-            for (by = 0; by < block_size; ++by){
-                for (bx = 0; bx < block_size; ++bx){
-                    for (ch = 0; ch < new_channels; ++ch){
-                        output[by * by_linesize + x * x_linesize + bx * new_channels + ch] = input[ch];
-                    }
-                    input += new_channels;
-                }
-            }
-        }
-        output += output_linesize;
-    }
-}
-
-DNNReturnType ff_dnn_execute_model_native(const DNNModel *model)
-{
-    ConvolutionalNetwork *network = (ConvolutionalNetwork *)model->model;
-    int cur_width, cur_height, cur_channels;
-    int32_t layer;
-    InputParams *input_params;
-    ConvolutionalParams *conv_params;
-    DepthToSpaceParams *depth_to_space_params;
-
-    if (network->layers_num <= 0 || network->layers[0].type != INPUT || !network->layers[0].output){
-        return DNN_ERROR;
-    }
-    else{
-        input_params = (InputParams *)network->layers[0].params;
-        cur_width = input_params->width;
-        cur_height = input_params->height;
-        cur_channels = input_params->channels;
-    }
-
-    for (layer = 1; layer < network->layers_num; ++layer){
-        if (!network->layers[layer].output){
-            return DNN_ERROR;
-        }
-        switch (network->layers[layer].type){
-        case CONV:
-            conv_params = (ConvolutionalParams *)network->layers[layer].params;
-            convolve(network->layers[layer - 1].output, network->layers[layer].output, conv_params, cur_width, cur_height);
-            cur_channels = conv_params->output_num;
-            break;
-        case DEPTH_TO_SPACE:
-            depth_to_space_params = (DepthToSpaceParams *)network->layers[layer].params;
-            depth_to_space(network->layers[layer - 1].output, network->layers[layer].output,
-                           depth_to_space_params->block_size, cur_width, cur_height, cur_channels);
-            cur_height *= depth_to_space_params->block_size;
-            cur_width *= depth_to_space_params->block_size;
-            cur_channels /= depth_to_space_params->block_size * depth_to_space_params->block_size;
-            break;
-        case INPUT:
-            return DNN_ERROR;
-        }
-    }
-
-    return DNN_SUCCESS;
-}
-
-void ff_dnn_free_model_native(DNNModel **model)
-{
-    ConvolutionalNetwork *network;
-    ConvolutionalParams *conv_params;
-    int32_t layer;
-
-    if (*model)
-    {
-        network = (ConvolutionalNetwork *)(*model)->model;
-        for (layer = 0; layer < network->layers_num; ++layer){
-            av_freep(&network->layers[layer].output);
-            if (network->layers[layer].type == CONV){
-                conv_params = (ConvolutionalParams *)network->layers[layer].params;
-                av_freep(&conv_params->kernel);
-                av_freep(&conv_params->biases);
-            }
-            av_freep(&network->layers[layer].params);
-        }
-        av_freep(&network->layers);
-        av_freep(&network);
-        av_freep(model);
-    }
-}
diff --git a/libavfilter/dnn_backend_native.h b/libavfilter/dnn_backend_native.h
deleted file mode 100644
index 51d4cac..0000000
--- a/libavfilter/dnn_backend_native.h
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright (c) 2018 Sergey Lavrushkin
- *
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with FFmpeg; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-/**
- * @file
- * DNN inference functions interface for native backend.
- */
-
-
-#ifndef AVFILTER_DNN_BACKEND_NATIVE_H
-#define AVFILTER_DNN_BACKEND_NATIVE_H
-
-#include "dnn_interface.h"
-#include "libavformat/avio.h"
-
-typedef enum {INPUT, CONV, DEPTH_TO_SPACE} DNNLayerType;
-
-typedef enum {RELU, TANH, SIGMOID} DNNActivationFunc;
-
-typedef struct Layer{
-    DNNLayerType type;
-    float *output;
-    void *params;
-} Layer;
-
-typedef struct ConvolutionalParams{
-    int32_t input_num, output_num, kernel_size;
-    DNNActivationFunc activation;
-    float *kernel;
-    float *biases;
-} ConvolutionalParams;
-
-typedef struct InputParams{
-    int height, width, channels;
-} InputParams;
-
-typedef struct DepthToSpaceParams{
-    int block_size;
-} DepthToSpaceParams;
-
-// Represents simple feed-forward convolutional network.
-typedef struct ConvolutionalNetwork{
-    Layer *layers;
-    int32_t layers_num;
-} ConvolutionalNetwork;
-
-DNNModel *ff_dnn_load_model_native(const char *model_filename);
-
-DNNReturnType ff_dnn_execute_model_native(const DNNModel *model);
-
-void ff_dnn_free_model_native(DNNModel **model);
-
-#endif
diff --git a/libavfilter/dnn_interface.h b/libavfilter/dnn_interface.h
index e367343..b20e5c8 100644
--- a/libavfilter/dnn_interface.h
+++ b/libavfilter/dnn_interface.h
@@ -26,21 +26,29 @@
 #ifndef AVFILTER_DNN_INTERFACE_H
 #define AVFILTER_DNN_INTERFACE_H
 
+#include <stdint.h>
+
 typedef enum {DNN_SUCCESS, DNN_ERROR} DNNReturnType;
 
 typedef enum {DNN_NATIVE, DNN_TF} DNNBackendType;
 
+typedef enum {DNN_FLOAT = 1, DNN_UINT8 = 4} DNNDataType;
+
 typedef struct DNNData{
-    float *data;
+    void *data;
+    DNNDataType dt;
     int width, height, channels;
 } DNNData;
 
 typedef struct DNNModel{
     // Stores model that can be different for different backends.
     void *model;
-    // Sets model input and output, while allocating additional memory for intermediate calculations.
+    // Gets model input information
+    // Just reuse struct DNNData here, actually the DNNData.data field is not needed.
+    DNNReturnType (*get_input)(void *model, DNNData *input, const char *input_name);
+    // Sets model input and output.
     // Should be called at least once before model execution.
-    DNNReturnType (*set_input_output)(void *model, DNNData *input, DNNData *output);
+    DNNReturnType (*set_input_output)(void *model, DNNData *input, const char *input_name, const char **output_names, uint32_t nb_output);
 } DNNModel;
 
 // Stores pointers to functions for loading, executing, freeing DNN models for one of the backends.
@@ -48,7 +56,7 @@
     // Loads model and parameters from given file. Returns NULL if it is not possible.
     DNNModel *(*load_model)(const char *model_filename);
     // Executes model with specified input and output. Returns DNN_ERROR otherwise.
-    DNNReturnType (*execute_model)(const DNNModel *model);
+    DNNReturnType (*execute_model)(const DNNModel *model, DNNData *outputs, uint32_t nb_output);
     // Frees memory allocated for model.
     void (*free_model)(DNNModel **model);
 } DNNModule;
diff --git a/libavfilter/ebur128.c b/libavfilter/ebur128.c
index e110080..ca2fca0 100644
--- a/libavfilter/ebur128.c
+++ b/libavfilter/ebur128.c
@@ -155,7 +155,7 @@
 {
     size_t i;
     st->d->channel_map =
-        (int *) av_malloc_array(st->channels, sizeof(int));
+        (int *) av_malloc_array(st->channels, sizeof(*st->d->channel_map));
     if (!st->d->channel_map)
         return AVERROR(ENOMEM);
     if (st->channels == 4) {
@@ -221,17 +221,17 @@
     int errcode;
     FFEBUR128State *st;
 
-    st = (FFEBUR128State *) av_malloc(sizeof(FFEBUR128State));
+    st = (FFEBUR128State *) av_malloc(sizeof(*st));
     CHECK_ERROR(!st, 0, exit)
     st->d = (struct FFEBUR128StateInternal *)
-        av_malloc(sizeof(struct FFEBUR128StateInternal));
+        av_malloc(sizeof(*st->d));
     CHECK_ERROR(!st->d, 0, free_state)
     st->channels = channels;
     errcode = ebur128_init_channel_map(st);
     CHECK_ERROR(errcode, 0, free_internal)
 
     st->d->sample_peak =
-        (double *) av_mallocz_array(channels, sizeof(double));
+        (double *) av_mallocz_array(channels, sizeof(*st->d->sample_peak));
     CHECK_ERROR(!st->d->sample_peak, 0, free_channel_map)
 
     st->samplerate = samplerate;
@@ -253,16 +253,16 @@
     }
     st->d->audio_data =
         (double *) av_mallocz_array(st->d->audio_data_frames,
-                                    st->channels * sizeof(double));
+                                    st->channels * sizeof(*st->d->audio_data));
     CHECK_ERROR(!st->d->audio_data, 0, free_sample_peak)
 
     ebur128_init_filter(st);
 
     st->d->block_energy_histogram =
-        av_mallocz(1000 * sizeof(unsigned long));
+        av_mallocz(1000 * sizeof(*st->d->block_energy_histogram));
     CHECK_ERROR(!st->d->block_energy_histogram, 0, free_audio_data)
     st->d->short_term_block_energy_histogram =
-        av_mallocz(1000 * sizeof(unsigned long));
+        av_mallocz(1000 * sizeof(*st->d->short_term_block_energy_histogram));
     CHECK_ERROR(!st->d->short_term_block_energy_histogram, 0,
                 free_block_energy_histogram)
     st->d->short_term_frame_counter = 0;
@@ -275,7 +275,7 @@
     if (ff_thread_once(&histogram_init, &init_histogram) != 0)
         goto free_short_term_block_energy_histogram;
 
-    st->d->data_ptrs = av_malloc_array(channels, sizeof(void *));
+    st->d->data_ptrs = av_malloc_array(channels, sizeof(*st->d->data_ptrs));
     CHECK_ERROR(!st->d->data_ptrs, 0,
                 free_short_term_block_energy_histogram);
 
@@ -368,7 +368,7 @@
 
 static double ebur128_energy_to_loudness(double energy)
 {
-    return 10 * (log(energy) / log(10.0)) - 0.691;
+    return 10 * log10(energy) - 0.691;
 }
 
 static size_t find_histogram_index(double energy)
diff --git a/libavfilter/f_drawgraph.c b/libavfilter/f_drawgraph.c
index f49d5b8..030afb9 100644
--- a/libavfilter/f_drawgraph.c
+++ b/libavfilter/f_drawgraph.c
@@ -20,6 +20,7 @@
 
 #include "float.h"
 
+#include "libavutil/avstring.h"
 #include "libavutil/eval.h"
 #include "libavutil/intreadwrite.h"
 #include "libavutil/opt.h"
@@ -39,6 +40,7 @@
     int           mode;
     int           slide;
     int           w, h;
+    AVRational    frame_rate;
 
     AVFrame       *out;
     int           x;
@@ -47,21 +49,22 @@
     float         *values[4];
     int           values_size[4];
     int           nb_values;
+    int64_t       prev_pts;
 } DrawGraphContext;
 
 #define OFFSET(x) offsetof(DrawGraphContext, x)
 #define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
 
 static const AVOption drawgraph_options[] = {
-    { "m1", "set 1st metadata key", OFFSET(key[0]), AV_OPT_TYPE_STRING, {.str=""}, CHAR_MIN, CHAR_MAX, FLAGS },
-    { "fg1", "set 1st foreground color expression", OFFSET(fg_str[0]), AV_OPT_TYPE_STRING, {.str="0xffff0000"}, CHAR_MIN, CHAR_MAX, FLAGS },
-    { "m2", "set 2nd metadata key", OFFSET(key[1]), AV_OPT_TYPE_STRING, {.str=""}, CHAR_MIN, CHAR_MAX, FLAGS },
-    { "fg2", "set 2nd foreground color expression", OFFSET(fg_str[1]), AV_OPT_TYPE_STRING, {.str="0xff00ff00"}, CHAR_MIN, CHAR_MAX, FLAGS },
-    { "m3", "set 3rd metadata key", OFFSET(key[2]), AV_OPT_TYPE_STRING, {.str=""}, CHAR_MIN, CHAR_MAX, FLAGS },
-    { "fg3", "set 3rd foreground color expression", OFFSET(fg_str[2]), AV_OPT_TYPE_STRING, {.str="0xffff00ff"}, CHAR_MIN, CHAR_MAX, FLAGS },
-    { "m4", "set 4th metadata key", OFFSET(key[3]), AV_OPT_TYPE_STRING, {.str=""}, CHAR_MIN, CHAR_MAX, FLAGS },
-    { "fg4", "set 4th foreground color expression", OFFSET(fg_str[3]), AV_OPT_TYPE_STRING, {.str="0xffffff00"}, CHAR_MIN, CHAR_MAX, FLAGS },
-    { "bg", "set background color", OFFSET(bg), AV_OPT_TYPE_COLOR, {.str="white"}, CHAR_MIN, CHAR_MAX, FLAGS },
+    { "m1", "set 1st metadata key", OFFSET(key[0]), AV_OPT_TYPE_STRING, {.str=""}, 0, 0, FLAGS },
+    { "fg1", "set 1st foreground color expression", OFFSET(fg_str[0]), AV_OPT_TYPE_STRING, {.str="0xffff0000"}, 0, 0, FLAGS },
+    { "m2", "set 2nd metadata key", OFFSET(key[1]), AV_OPT_TYPE_STRING, {.str=""}, 0, 0, FLAGS },
+    { "fg2", "set 2nd foreground color expression", OFFSET(fg_str[1]), AV_OPT_TYPE_STRING, {.str="0xff00ff00"}, 0, 0, FLAGS },
+    { "m3", "set 3rd metadata key", OFFSET(key[2]), AV_OPT_TYPE_STRING, {.str=""}, 0, 0, FLAGS },
+    { "fg3", "set 3rd foreground color expression", OFFSET(fg_str[2]), AV_OPT_TYPE_STRING, {.str="0xffff00ff"}, 0, 0, FLAGS },
+    { "m4", "set 4th metadata key", OFFSET(key[3]), AV_OPT_TYPE_STRING, {.str=""}, 0, 0, FLAGS },
+    { "fg4", "set 4th foreground color expression", OFFSET(fg_str[3]), AV_OPT_TYPE_STRING, {.str="0xffffff00"}, 0, 0, FLAGS },
+    { "bg", "set background color", OFFSET(bg), AV_OPT_TYPE_COLOR, {.str="white"}, 0, 0, FLAGS },
     { "min", "set minimal value", OFFSET(min), AV_OPT_TYPE_FLOAT, {.dbl=-1.}, INT_MIN, INT_MAX, FLAGS },
     { "max", "set maximal value", OFFSET(max), AV_OPT_TYPE_FLOAT, {.dbl=1.}, INT_MIN, INT_MAX, FLAGS },
     { "mode", "set graph mode", OFFSET(mode), AV_OPT_TYPE_INT, {.i64=2}, 0, 2, FLAGS, "mode" },
@@ -76,6 +79,8 @@
         {"picture", "display graph in single frame", OFFSET(slide), AV_OPT_TYPE_CONST, {.i64=4}, 0, 0, FLAGS, "slide"},
     { "size", "set graph size", OFFSET(w), AV_OPT_TYPE_IMAGE_SIZE, {.str="900x256"}, 0, 0, FLAGS },
     { "s", "set graph size", OFFSET(w), AV_OPT_TYPE_IMAGE_SIZE, {.str="900x256"}, 0, 0, FLAGS },
+    { "rate", "set video rate", OFFSET(frame_rate), AV_OPT_TYPE_VIDEO_RATE, {.str="25"}, 0, INT_MAX, FLAGS },
+    { "r",    "set video rate", OFFSET(frame_rate), AV_OPT_TYPE_VIDEO_RATE, {.str="25"}, 0, INT_MAX, FLAGS },
     { NULL }
 };
 
@@ -158,6 +163,8 @@
     AVDictionary *metadata;
     AVDictionaryEntry *e;
     AVFrame *out = s->out;
+    AVFrame *clone = NULL;
+    int64_t in_pts, out_pts;
     int i;
 
     if (s->slide == 4 && s->nb_values >= s->values_size[0] / sizeof(float)) {
@@ -215,7 +222,7 @@
         if (!e || !e->value)
             continue;
 
-        if (sscanf(e->value, "%f", &vf) != 1)
+        if (av_sscanf(e->value, "%f", &vf) != 1)
             continue;
 
         vf = av_clipf(vf, s->min, s->max);
@@ -308,12 +315,24 @@
     s->nb_values++;
     s->x++;
 
+    in_pts = in->pts;
+
     av_frame_free(&in);
 
     if (s->slide == 4)
         return 0;
 
-    return ff_filter_frame(outlink, av_frame_clone(s->out));
+    out_pts = av_rescale_q(in_pts, inlink->time_base, outlink->time_base);
+
+    if (out_pts == s->prev_pts)
+        return 0;
+
+    clone = av_frame_clone(s->out);
+    if (!clone)
+        return AVERROR(ENOMEM);
+
+    clone->pts = s->prev_pts = out_pts;
+    return ff_filter_frame(outlink, clone);
 }
 
 static int request_frame(AVFilterLink *outlink)
@@ -405,6 +424,9 @@
     outlink->w = s->w;
     outlink->h = s->h;
     outlink->sample_aspect_ratio = (AVRational){1,1};
+    outlink->frame_rate = s->frame_rate;
+    outlink->time_base = av_inv_q(outlink->frame_rate);
+    s->prev_pts = AV_NOPTS_VALUE;
 
     return 0;
 }
diff --git a/libavfilter/f_ebur128.c b/libavfilter/f_ebur128.c
index e03adc9..31b75ab 100644
--- a/libavfilter/f_ebur128.c
+++ b/libavfilter/f_ebur128.c
@@ -420,7 +420,7 @@
 
     for (i = 0; i < nb_channels; i++) {
         /* channel weighting */
-        const uint16_t chl = av_channel_layout_extract_channel(outlink->channel_layout, i);
+        const uint64_t chl = av_channel_layout_extract_channel(outlink->channel_layout, i);
         if (chl & (AV_CH_LOW_FREQUENCY|AV_CH_LOW_FREQUENCY_2)) {
             ebur128->ch_weighting[i] = 0;
         } else if (chl & BACK_MASK) {
@@ -774,9 +774,11 @@
 
             /* push one video frame */
             if (ebur128->do_video) {
+                AVFrame *clone;
                 int x, y, ret;
                 uint8_t *p;
                 double gauge_value;
+                int y_loudness_lu_graph, y_loudness_lu_gauge;
 
                 if (ebur128->gauge_type == GAUGE_TYPE_MOMENTARY) {
                     gauge_value = loudness_400 - ebur128->target;
@@ -784,8 +786,8 @@
                     gauge_value = loudness_3000 - ebur128->target;
                 }
 
-                const int y_loudness_lu_graph = lu_to_y(ebur128, loudness_3000 - ebur128->target);
-                const int y_loudness_lu_gauge = lu_to_y(ebur128, gauge_value);
+                y_loudness_lu_graph = lu_to_y(ebur128, loudness_3000 - ebur128->target);
+                y_loudness_lu_gauge = lu_to_y(ebur128, gauge_value);
 
                 /* draw the graph using the short-term loudness */
                 p = pic->data[0] + ebur128->graph.y*pic->linesize[0] + ebur128->graph.x*3;
@@ -822,7 +824,10 @@
 
                 /* set pts and push frame */
                 pic->pts = pts;
-                ret = ff_filter_frame(outlink, av_frame_clone(pic));
+                clone = av_frame_clone(pic);
+                if (!clone)
+                    return AVERROR(ENOMEM);
+                ret = ff_filter_frame(outlink, clone);
                 if (ret < 0)
                     return ret;
             }
diff --git a/libavfilter/f_graphmonitor.c b/libavfilter/f_graphmonitor.c
new file mode 100644
index 0000000..a9c4ba4
--- /dev/null
+++ b/libavfilter/f_graphmonitor.c
@@ -0,0 +1,432 @@
+/*
+ * Copyright (c) 2018 Paul B Mahol
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "float.h"
+
+#include "libavutil/pixdesc.h"
+#include "libavutil/eval.h"
+#include "libavutil/intreadwrite.h"
+#include "libavutil/opt.h"
+#include "libavutil/timestamp.h"
+#include "libavutil/xga_font_data.h"
+#include "avfilter.h"
+#include "filters.h"
+#include "formats.h"
+#include "internal.h"
+#include "video.h"
+
+typedef struct GraphMonitorContext {
+    const AVClass *class;
+
+    int w, h;
+    float opacity;
+    int mode;
+    int flags;
+    AVRational frame_rate;
+
+    int64_t pts;
+    int64_t next_pts;
+    uint8_t white[4];
+    uint8_t yellow[4];
+    uint8_t red[4];
+    uint8_t green[4];
+    uint8_t bg[4];
+} GraphMonitorContext;
+
+enum {
+    MODE_QUEUE = 1 << 0,
+    MODE_FCIN  = 1 << 1,
+    MODE_FCOUT = 1 << 2,
+    MODE_PTS   = 1 << 3,
+    MODE_TIME  = 1 << 4,
+    MODE_TB    = 1 << 5,
+    MODE_FMT   = 1 << 6,
+    MODE_SIZE  = 1 << 7,
+    MODE_RATE  = 1 << 8,
+};
+
+#define OFFSET(x) offsetof(GraphMonitorContext, x)
+#define VF AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
+
+static const AVOption graphmonitor_options[] = {
+    { "size", "set monitor size", OFFSET(w), AV_OPT_TYPE_IMAGE_SIZE, {.str="hd720"}, 0, 0, VF },
+    { "s",    "set monitor size", OFFSET(w), AV_OPT_TYPE_IMAGE_SIZE, {.str="hd720"}, 0, 0, VF },
+    { "opacity", "set video opacity", OFFSET(opacity), AV_OPT_TYPE_FLOAT, {.dbl=.9}, 0, 1, VF },
+    { "o",       "set video opacity", OFFSET(opacity), AV_OPT_TYPE_FLOAT, {.dbl=.9}, 0, 1, VF },
+    { "mode", "set mode", OFFSET(mode), AV_OPT_TYPE_INT, {.i64=0}, 0, 1, VF, "mode" },
+    { "m",    "set mode", OFFSET(mode), AV_OPT_TYPE_INT, {.i64=0}, 0, 1, VF, "mode" },
+        { "full",     NULL, 0, AV_OPT_TYPE_CONST, {.i64=0},   0, 0, VF, "mode" },
+        { "compact",  NULL, 0, AV_OPT_TYPE_CONST, {.i64=1},   0, 0, VF, "mode" },
+    { "flags", "set flags", OFFSET(flags), AV_OPT_TYPE_FLAGS, {.i64=MODE_QUEUE}, 0, INT_MAX, VF, "flags" },
+    { "f",     "set flags", OFFSET(flags), AV_OPT_TYPE_FLAGS, {.i64=MODE_QUEUE}, 0, INT_MAX, VF, "flags" },
+        { "queue",            NULL, 0, AV_OPT_TYPE_CONST, {.i64=MODE_QUEUE},   0, 0, VF, "flags" },
+        { "frame_count_in",   NULL, 0, AV_OPT_TYPE_CONST, {.i64=MODE_FCOUT},   0, 0, VF, "flags" },
+        { "frame_count_out",  NULL, 0, AV_OPT_TYPE_CONST, {.i64=MODE_FCIN},    0, 0, VF, "flags" },
+        { "pts",              NULL, 0, AV_OPT_TYPE_CONST, {.i64=MODE_PTS},     0, 0, VF, "flags" },
+        { "time",             NULL, 0, AV_OPT_TYPE_CONST, {.i64=MODE_TIME},    0, 0, VF, "flags" },
+        { "timebase",         NULL, 0, AV_OPT_TYPE_CONST, {.i64=MODE_TB},      0, 0, VF, "flags" },
+        { "format",           NULL, 0, AV_OPT_TYPE_CONST, {.i64=MODE_FMT},     0, 0, VF, "flags" },
+        { "size",             NULL, 0, AV_OPT_TYPE_CONST, {.i64=MODE_SIZE},    0, 0, VF, "flags" },
+        { "rate",             NULL, 0, AV_OPT_TYPE_CONST, {.i64=MODE_RATE},    0, 0, VF, "flags" },
+    { "rate", "set video rate", OFFSET(frame_rate), AV_OPT_TYPE_VIDEO_RATE, {.str = "25"}, 0, INT_MAX, VF },
+    { "r",    "set video rate", OFFSET(frame_rate), AV_OPT_TYPE_VIDEO_RATE, {.str = "25"}, 0, INT_MAX, VF },
+    { NULL }
+};
+
+static int query_formats(AVFilterContext *ctx)
+{
+    AVFilterLink *outlink = ctx->outputs[0];
+    static const enum AVPixelFormat pix_fmts[] = {
+        AV_PIX_FMT_RGBA,
+        AV_PIX_FMT_NONE
+    };
+    int ret;
+
+    AVFilterFormats *fmts_list = ff_make_format_list(pix_fmts);
+    if ((ret = ff_formats_ref(fmts_list, &outlink->in_formats)) < 0)
+        return ret;
+
+    return 0;
+}
+
+static void clear_image(GraphMonitorContext *s, AVFrame *out, AVFilterLink *outlink)
+{
+    int bg = AV_RN32(s->bg);
+
+    for (int i = 0; i < out->height; i++)
+        for (int j = 0; j < out->width; j++)
+            AV_WN32(out->data[0] + i * out->linesize[0] + j * 4, bg);
+}
+
+static void drawtext(AVFrame *pic, int x, int y, const char *txt, uint8_t *color)
+{
+    const uint8_t *font;
+    int font_height;
+    int i;
+
+    font = avpriv_cga_font,   font_height =  8;
+
+    if (y + 8 >= pic->height ||
+        x + strlen(txt) * 8 >= pic->width)
+        return;
+
+    for (i = 0; txt[i]; i++) {
+        int char_y, mask;
+
+        uint8_t *p = pic->data[0] + y*pic->linesize[0] + (x + i*8)*4;
+        for (char_y = 0; char_y < font_height; char_y++) {
+            for (mask = 0x80; mask; mask >>= 1) {
+                if (font[txt[i] * font_height + char_y] & mask) {
+                    p[0] = color[0];
+                    p[1] = color[1];
+                    p[2] = color[2];
+                }
+                p += 4;
+            }
+            p += pic->linesize[0] - 8 * 4;
+        }
+    }
+}
+
+static int filter_have_queued(AVFilterContext *filter)
+{
+    for (int j = 0; j < filter->nb_inputs; j++) {
+        AVFilterLink *l = filter->inputs[j];
+        size_t frames = ff_inlink_queued_frames(l);
+
+        if (frames)
+            return 1;
+    }
+
+    for (int j = 0; j < filter->nb_outputs; j++) {
+        AVFilterLink *l = filter->outputs[j];
+        size_t frames = ff_inlink_queued_frames(l);
+
+        if (frames)
+            return 1;
+    }
+
+    return 0;
+}
+
+static void draw_items(AVFilterContext *ctx, AVFrame *out,
+                       int xpos, int ypos,
+                       AVFilterLink *l,
+                       size_t frames)
+{
+    GraphMonitorContext *s = ctx->priv;
+    char buffer[1024] = { 0 };
+
+    if (s->flags & MODE_FMT) {
+        if (l->type == AVMEDIA_TYPE_VIDEO) {
+            snprintf(buffer, sizeof(buffer)-1, " | format: %s",
+                     av_get_pix_fmt_name(l->format));
+        } else if (l->type == AVMEDIA_TYPE_AUDIO) {
+            snprintf(buffer, sizeof(buffer)-1, " | format: %s",
+                     av_get_sample_fmt_name(l->format));
+        }
+        drawtext(out, xpos, ypos, buffer, s->white);
+        xpos += strlen(buffer) * 8;
+    }
+    if (s->flags & MODE_SIZE) {
+        if (l->type == AVMEDIA_TYPE_VIDEO) {
+            snprintf(buffer, sizeof(buffer)-1, " | size: %dx%d", l->w, l->h);
+        } else if (l->type == AVMEDIA_TYPE_AUDIO) {
+            snprintf(buffer, sizeof(buffer)-1, " | channels: %d", l->channels);
+        }
+        drawtext(out, xpos, ypos, buffer, s->white);
+        xpos += strlen(buffer) * 8;
+    }
+    if (s->flags & MODE_RATE) {
+        if (l->type == AVMEDIA_TYPE_VIDEO) {
+            snprintf(buffer, sizeof(buffer)-1, " | fps: %d/%d", l->frame_rate.num, l->frame_rate.den);
+        } else if (l->type == AVMEDIA_TYPE_AUDIO) {
+            snprintf(buffer, sizeof(buffer)-1, " | samplerate: %d", l->sample_rate);
+        }
+        drawtext(out, xpos, ypos, buffer, s->white);
+        xpos += strlen(buffer) * 8;
+    }
+    if (s->flags & MODE_TB) {
+        snprintf(buffer, sizeof(buffer)-1, " | tb: %d/%d", l->time_base.num, l->time_base.den);
+        drawtext(out, xpos, ypos, buffer, s->white);
+        xpos += strlen(buffer) * 8;
+    }
+    if (s->flags & MODE_QUEUE) {
+        snprintf(buffer, sizeof(buffer)-1, " | queue: ");
+        drawtext(out, xpos, ypos, buffer, s->white);
+        xpos += strlen(buffer) * 8;
+        snprintf(buffer, sizeof(buffer)-1, "%"SIZE_SPECIFIER, frames);
+        drawtext(out, xpos, ypos, buffer, frames > 0 ? frames >= 10 ? frames >= 50 ? s->red : s->yellow : s->green : s->white);
+        xpos += strlen(buffer) * 8;
+    }
+    if (s->flags & MODE_FCIN) {
+        snprintf(buffer, sizeof(buffer)-1, " | in: %"PRId64, l->frame_count_in);
+        drawtext(out, xpos, ypos, buffer, s->white);
+        xpos += strlen(buffer) * 8;
+    }
+    if (s->flags & MODE_FCOUT) {
+        snprintf(buffer, sizeof(buffer)-1, " | out: %"PRId64, l->frame_count_out);
+        drawtext(out, xpos, ypos, buffer, s->white);
+        xpos += strlen(buffer) * 8;
+    }
+    if (s->flags & MODE_PTS) {
+        snprintf(buffer, sizeof(buffer)-1, " | pts: %s", av_ts2str(l->current_pts_us));
+        drawtext(out, xpos, ypos, buffer, s->white);
+        xpos += strlen(buffer) * 8;
+    }
+    if (s->flags & MODE_TIME) {
+        snprintf(buffer, sizeof(buffer)-1, " | time: %s", av_ts2timestr(l->current_pts_us, &AV_TIME_BASE_Q));
+        drawtext(out, xpos, ypos, buffer, s->white);
+        xpos += strlen(buffer) * 8;
+    }
+}
+
+static int create_frame(AVFilterContext *ctx, int64_t pts)
+{
+    GraphMonitorContext *s = ctx->priv;
+    AVFilterLink *outlink = ctx->outputs[0];
+    AVFrame *out;
+    int xpos, ypos = 0;
+
+    out = ff_get_video_buffer(outlink, outlink->w, outlink->h);
+    if (!out)
+        return AVERROR(ENOMEM);
+
+    clear_image(s, out, outlink);
+
+    for (int i = 0; i < ctx->graph->nb_filters; i++) {
+        AVFilterContext *filter = ctx->graph->filters[i];
+        char buffer[1024] = { 0 };
+
+        if (s->mode && !filter_have_queued(filter))
+            continue;
+
+        xpos = 0;
+        drawtext(out, xpos, ypos, filter->name, s->white);
+        xpos += strlen(filter->name) * 8 + 10;
+        drawtext(out, xpos, ypos, filter->filter->name, s->white);
+        ypos += 10;
+        for (int j = 0; j < filter->nb_inputs; j++) {
+            AVFilterLink *l = filter->inputs[j];
+            size_t frames = ff_inlink_queued_frames(l);
+
+            if (s->mode && !frames)
+                continue;
+
+            xpos = 10;
+            snprintf(buffer, sizeof(buffer)-1, "in%d: ", j);
+            drawtext(out, xpos, ypos, buffer, s->white);
+            xpos += strlen(buffer) * 8;
+            drawtext(out, xpos, ypos, l->src->name, s->white);
+            xpos += strlen(l->src->name) * 8 + 10;
+            draw_items(ctx, out, xpos, ypos, l, frames);
+            ypos += 10;
+        }
+
+        ypos += 2;
+        for (int j = 0; j < filter->nb_outputs; j++) {
+            AVFilterLink *l = filter->outputs[j];
+            size_t frames = ff_inlink_queued_frames(l);
+
+            if (s->mode && !frames)
+                continue;
+
+            xpos = 10;
+            snprintf(buffer, sizeof(buffer)-1, "out%d: ", j);
+            drawtext(out, xpos, ypos, buffer, s->white);
+            xpos += strlen(buffer) * 8;
+            drawtext(out, xpos, ypos, l->dst->name, s->white);
+            xpos += strlen(l->dst->name) * 8 + 10;
+            draw_items(ctx, out, xpos, ypos, l, frames);
+            ypos += 10;
+        }
+        ypos += 5;
+    }
+
+    out->pts = pts;
+    s->pts = pts + 1;
+    return ff_filter_frame(outlink, out);
+}
+
+static int activate(AVFilterContext *ctx)
+{
+    GraphMonitorContext *s = ctx->priv;
+    AVFilterLink *inlink = ctx->inputs[0];
+    AVFilterLink *outlink = ctx->outputs[0];
+    int64_t pts = AV_NOPTS_VALUE;
+
+    FF_FILTER_FORWARD_STATUS_BACK(outlink, inlink);
+
+    if (ff_inlink_queued_frames(inlink)) {
+        AVFrame *frame = NULL;
+        int ret;
+
+        ret = ff_inlink_consume_frame(inlink, &frame);
+        if (ret < 0)
+            return ret;
+        if (ret > 0) {
+            pts = frame->pts;
+            av_frame_free(&frame);
+        }
+    }
+
+    if (pts != AV_NOPTS_VALUE) {
+        pts = av_rescale_q(pts, inlink->time_base, outlink->time_base);
+        if (s->pts == AV_NOPTS_VALUE)
+            s->pts = pts;
+        s->next_pts = pts;
+    }
+
+    if (s->pts < s->next_pts && ff_outlink_frame_wanted(outlink))
+        return create_frame(ctx, s->pts);
+
+    FF_FILTER_FORWARD_STATUS(inlink, outlink);
+    FF_FILTER_FORWARD_WANTED(outlink, inlink);
+
+    return FFERROR_NOT_READY;
+}
+
+static int config_output(AVFilterLink *outlink)
+{
+    GraphMonitorContext *s = outlink->src->priv;
+
+    s->bg[3] = 255 * s->opacity;
+    s->white[0] = s->white[1] = s->white[2] = 255;
+    s->yellow[0] = s->yellow[1] = 255;
+    s->red[0] = 255;
+    s->green[1] = 255;
+    s->pts = AV_NOPTS_VALUE;
+    s->next_pts = AV_NOPTS_VALUE;
+    outlink->w = s->w;
+    outlink->h = s->h;
+    outlink->sample_aspect_ratio = (AVRational){1,1};
+    outlink->frame_rate = s->frame_rate;
+    outlink->time_base = av_inv_q(s->frame_rate);
+
+    return 0;
+}
+
+#if CONFIG_GRAPHMONITOR_FILTER
+
+AVFILTER_DEFINE_CLASS(graphmonitor);
+
+static const AVFilterPad graphmonitor_inputs[] = {
+    {
+        .name = "default",
+        .type = AVMEDIA_TYPE_VIDEO,
+    },
+    { NULL }
+};
+
+static const AVFilterPad graphmonitor_outputs[] = {
+    {
+        .name         = "default",
+        .type         = AVMEDIA_TYPE_VIDEO,
+        .config_props = config_output,
+    },
+    { NULL }
+};
+
+AVFilter ff_vf_graphmonitor = {
+    .name          = "graphmonitor",
+    .description   = NULL_IF_CONFIG_SMALL("Show various filtergraph stats."),
+    .priv_size     = sizeof(GraphMonitorContext),
+    .priv_class    = &graphmonitor_class,
+    .query_formats = query_formats,
+    .activate      = activate,
+    .inputs        = graphmonitor_inputs,
+    .outputs       = graphmonitor_outputs,
+};
+
+#endif // CONFIG_GRAPHMONITOR_FILTER
+
+#if CONFIG_AGRAPHMONITOR_FILTER
+
+#define agraphmonitor_options graphmonitor_options
+AVFILTER_DEFINE_CLASS(agraphmonitor);
+
+static const AVFilterPad agraphmonitor_inputs[] = {
+    {
+        .name = "default",
+        .type = AVMEDIA_TYPE_AUDIO,
+    },
+    { NULL }
+};
+
+static const AVFilterPad agraphmonitor_outputs[] = {
+    {
+        .name         = "default",
+        .type         = AVMEDIA_TYPE_VIDEO,
+        .config_props = config_output,
+    },
+    { NULL }
+};
+
+AVFilter ff_avf_agraphmonitor = {
+    .name          = "agraphmonitor",
+    .description   = NULL_IF_CONFIG_SMALL("Show various filtergraph stats."),
+    .priv_size     = sizeof(GraphMonitorContext),
+    .priv_class    = &agraphmonitor_class,
+    .query_formats = query_formats,
+    .activate      = activate,
+    .inputs        = agraphmonitor_inputs,
+    .outputs       = agraphmonitor_outputs,
+};
+#endif // CONFIG_AGRAPHMONITOR_FILTER
diff --git a/libavfilter/f_interleave.c b/libavfilter/f_interleave.c
index d8a73b5..06f4cda 100644
--- a/libavfilter/f_interleave.c
+++ b/libavfilter/f_interleave.c
@@ -27,12 +27,9 @@
 #include "libavutil/avstring.h"
 #include "libavutil/opt.h"
 
-#define FF_INTERNAL_FIELDS 1
-#include "framequeue.h"
-
 #include "avfilter.h"
-#include "bufferqueue.h"
 #include "formats.h"
+#include "filters.h"
 #include "internal.h"
 #include "audio.h"
 #include "video.h"
@@ -40,7 +37,7 @@
 typedef struct InterleaveContext {
     const AVClass *class;
     int nb_inputs;
-    struct FFBufQueue *queues;
+    int64_t pts;
 } InterleaveContext;
 
 #define OFFSET(x) offsetof(InterleaveContext, x)
@@ -52,58 +49,78 @@
    { NULL }                                                         \
 }
 
-inline static int push_frame(AVFilterContext *ctx)
+static int activate(AVFilterContext *ctx)
 {
+    AVFilterLink *outlink = ctx->outputs[0];
     InterleaveContext *s = ctx->priv;
-    AVFrame *frame;
-    int i, queue_idx = -1;
-    int64_t pts_min = INT64_MAX;
+    int64_t q_pts, pts = INT64_MAX;
+    int i, nb_eofs = 0, input_idx = -1;
 
-    /* look for oldest frame */
+    FF_FILTER_FORWARD_STATUS_BACK_ALL(outlink, ctx);
+
     for (i = 0; i < ctx->nb_inputs; i++) {
-        struct FFBufQueue *q = &s->queues[i];
+        if (!ff_outlink_get_status(ctx->inputs[i]) &&
+            !ff_inlink_queued_frames(ctx->inputs[i]))
+            break;
+    }
 
-        if (!q->available && !ctx->inputs[i]->status_out)
-            return 0;
-        if (q->available) {
-            frame = ff_bufqueue_peek(q, 0);
-            if (frame->pts < pts_min) {
-                pts_min = frame->pts;
-                queue_idx = i;
+    if (i == ctx->nb_inputs) {
+        for (i = 0; i < ctx->nb_inputs; i++) {
+            AVFrame *frame;
+
+            if (ff_outlink_get_status(ctx->inputs[i]))
+                continue;
+
+            frame = ff_inlink_peek_frame(ctx->inputs[i], 0);
+            if (frame->pts == AV_NOPTS_VALUE) {
+                int ret;
+
+                av_log(ctx, AV_LOG_WARNING,
+                       "NOPTS value for input frame cannot be accepted, frame discarded\n");
+                ret = ff_inlink_consume_frame(ctx->inputs[i], &frame);
+                if (ret < 0)
+                    return ret;
+                av_frame_free(&frame);
+                return AVERROR_INVALIDDATA;
             }
+
+            q_pts = av_rescale_q(frame->pts, ctx->inputs[i]->time_base, AV_TIME_BASE_Q);
+            if (q_pts < pts) {
+                pts = q_pts;
+                input_idx = i;
+            }
+        }
+
+        if (input_idx >= 0) {
+            AVFrame *frame;
+            int ret;
+
+            ret = ff_inlink_consume_frame(ctx->inputs[input_idx], &frame);
+            if (ret < 0)
+                return ret;
+
+            frame->pts = s->pts = pts;
+            return ff_filter_frame(outlink, frame);
         }
     }
 
-    /* all inputs are closed */
-    if (queue_idx < 0)
-        return AVERROR_EOF;
-
-    frame = ff_bufqueue_get(&s->queues[queue_idx]);
-    av_log(ctx, AV_LOG_DEBUG, "queue:%d -> frame time:%f\n",
-           queue_idx, frame->pts * av_q2d(AV_TIME_BASE_Q));
-    return ff_filter_frame(ctx->outputs[0], frame);
-}
-
-static int filter_frame(AVFilterLink *inlink, AVFrame *frame)
-{
-    AVFilterContext *ctx = inlink->dst;
-    InterleaveContext *s = ctx->priv;
-    unsigned in_no = FF_INLINK_IDX(inlink);
-
-    if (frame->pts == AV_NOPTS_VALUE) {
-        av_log(ctx, AV_LOG_WARNING,
-               "NOPTS value for input frame cannot be accepted, frame discarded\n");
-        av_frame_free(&frame);
-        return AVERROR_INVALIDDATA;
+    for (i = 0; i < ctx->nb_inputs; i++) {
+        if (ff_inlink_queued_frames(ctx->inputs[i]))
+            continue;
+        if (ff_outlink_frame_wanted(outlink) &&
+            !ff_outlink_get_status(ctx->inputs[i])) {
+            ff_inlink_request_frame(ctx->inputs[i]);
+            return 0;
+        }
+        nb_eofs++;
     }
 
-    /* queue frame */
-    frame->pts = av_rescale_q(frame->pts, inlink->time_base, AV_TIME_BASE_Q);
-    av_log(ctx, AV_LOG_DEBUG, "frame pts:%f -> queue idx:%d available:%d\n",
-           frame->pts * av_q2d(AV_TIME_BASE_Q), in_no, s->queues[in_no].available);
-    ff_bufqueue_add(ctx, &s->queues[in_no], frame);
+    if (nb_eofs == ctx->nb_inputs) {
+        ff_outlink_set_status(outlink, AVERROR_EOF, s->pts);
+        return 0;
+    }
 
-    return push_frame(ctx);
+    return FFERROR_NOT_READY;
 }
 
 static av_cold int init(AVFilterContext *ctx)
@@ -112,10 +129,6 @@
     const AVFilterPad *outpad = &ctx->filter->outputs[0];
     int i, ret;
 
-    s->queues = av_calloc(s->nb_inputs, sizeof(s->queues[0]));
-    if (!s->queues)
-        return AVERROR(ENOMEM);
-
     for (i = 0; i < s->nb_inputs; i++) {
         AVFilterPad inpad = { 0 };
 
@@ -123,7 +136,6 @@
         if (!inpad.name)
             return AVERROR(ENOMEM);
         inpad.type         = outpad->type;
-        inpad.filter_frame = filter_frame;
 
         switch (outpad->type) {
         case AVMEDIA_TYPE_VIDEO:
@@ -144,14 +156,8 @@
 
 static av_cold void uninit(AVFilterContext *ctx)
 {
-    InterleaveContext *s = ctx->priv;
-    int i;
-
-    for (i = 0; i < ctx->nb_inputs; i++) {
-        ff_bufqueue_discard_all(&s->queues[i]);
-        av_freep(&s->queues[i]);
+    for (int i = 0; i < ctx->nb_inputs; i++)
         av_freep(&ctx->input_pads[i].name);
-    }
 }
 
 static int config_output(AVFilterLink *outlink)
@@ -190,23 +196,6 @@
     return 0;
 }
 
-static int request_frame(AVFilterLink *outlink)
-{
-    AVFilterContext *ctx = outlink->src;
-    InterleaveContext *s = ctx->priv;
-    int i, ret;
-
-    for (i = 0; i < ctx->nb_inputs; i++) {
-        if (!s->queues[i].available && !ctx->inputs[i]->status_out) {
-            ret = ff_request_frame(ctx->inputs[i]);
-            if (ret != AVERROR_EOF)
-                return ret;
-        }
-    }
-
-    return push_frame(ctx);
-}
-
 #if CONFIG_INTERLEAVE_FILTER
 
 DEFINE_OPTIONS(interleave, AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM);
@@ -217,7 +206,6 @@
         .name          = "default",
         .type          = AVMEDIA_TYPE_VIDEO,
         .config_props  = config_output,
-        .request_frame = request_frame,
     },
     { NULL }
 };
@@ -228,6 +216,7 @@
     .priv_size   = sizeof(InterleaveContext),
     .init        = init,
     .uninit      = uninit,
+    .activate    = activate,
     .outputs     = interleave_outputs,
     .priv_class  = &interleave_class,
     .flags       = AVFILTER_FLAG_DYNAMIC_INPUTS,
@@ -245,7 +234,6 @@
         .name          = "default",
         .type          = AVMEDIA_TYPE_AUDIO,
         .config_props  = config_output,
-        .request_frame = request_frame,
     },
     { NULL }
 };
@@ -256,6 +244,7 @@
     .priv_size   = sizeof(InterleaveContext),
     .init        = init,
     .uninit      = uninit,
+    .activate    = activate,
     .outputs     = ainterleave_outputs,
     .priv_class  = &ainterleave_class,
     .flags       = AVFILTER_FLAG_DYNAMIC_INPUTS,
diff --git a/libavfilter/f_loop.c b/libavfilter/f_loop.c
index 255fe64..0a029f0 100644
--- a/libavfilter/f_loop.c
+++ b/libavfilter/f_loop.c
@@ -25,6 +25,7 @@
 #include "libavutil/opt.h"
 #include "avfilter.h"
 #include "audio.h"
+#include "filters.h"
 #include "formats.h"
 #include "internal.h"
 #include "video.h"
@@ -44,6 +45,7 @@
     int64_t ignored_samples;
 
     int loop;
+    int eof;
     int64_t size;
     int64_t start;
     int64_t pts;
@@ -53,6 +55,15 @@
 #define VFLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
 #define OFFSET(x) offsetof(LoopContext, x)
 
+static void check_size(AVFilterContext *ctx)
+{
+    LoopContext *s = ctx->priv;
+
+    if (!s->size)
+        av_log(ctx, AV_LOG_WARNING, "Number of %s to loop is not set!\n",
+               ctx->input_pads[0].type == AVMEDIA_TYPE_VIDEO ? "frames" : "samples");
+}
+
 #if CONFIG_ALOOP_FILTER
 
 static int aconfig_input(AVFilterLink *inlink)
@@ -65,6 +76,8 @@
     if (!s->fifo || !s->left)
         return AVERROR(ENOMEM);
 
+    check_size(ctx);
+
     return 0;
 }
 
@@ -94,7 +107,7 @@
         }
         out->pts = s->pts;
         out->nb_samples = ret;
-        s->pts += out->nb_samples;
+        s->pts += av_rescale_q(out->nb_samples, (AVRational){1, outlink->sample_rate}, outlink->time_base);
         i += out->nb_samples;
         s->current_sample += out->nb_samples;
 
@@ -103,6 +116,7 @@
             return ret;
 
         if (s->current_sample >= s->nb_samples) {
+            s->duration = s->pts;
             s->current_sample = 0;
 
             if (s->loop > 0)
@@ -132,7 +146,7 @@
                 drain = FFMAX(0, s->start - s->ignored_samples);
                 s->pts = frame->pts;
                 av_audio_fifo_drain(s->fifo, drain);
-                s->pts += s->start - s->ignored_samples;
+                s->pts += av_rescale_q(s->start - s->ignored_samples, (AVRational){1, outlink->sample_rate}, outlink->time_base);
             }
             s->nb_samples += ret - drain;
             drain = frame->nb_samples - written;
@@ -145,7 +159,7 @@
                 av_audio_fifo_drain(s->left, drain);
             }
             frame->nb_samples = ret;
-            s->pts += ret;
+            s->pts += av_rescale_q(ret, (AVRational){1, outlink->sample_rate}, outlink->time_base);
             ret = ff_filter_frame(outlink, frame);
         } else {
             int nb_samples = frame->nb_samples;
@@ -156,7 +170,7 @@
     } else {
         s->ignored_samples += frame->nb_samples;
         frame->pts = s->pts;
-        s->pts += frame->nb_samples;
+        s->pts += av_rescale_q(frame->nb_samples, (AVRational){1, outlink->sample_rate}, outlink->time_base);
         ret = ff_filter_frame(outlink, frame);
     }
 
@@ -182,7 +196,7 @@
                 return AVERROR(ENOMEM);
             av_audio_fifo_read(s->left, (void **)out->extended_data, nb_samples);
             out->pts = s->pts;
-            s->pts += nb_samples;
+            s->pts += av_rescale_q(nb_samples, (AVRational){1, outlink->sample_rate}, outlink->time_base);
             ret = ff_filter_frame(outlink, out);
             if (ret < 0)
                 return ret;
@@ -192,13 +206,55 @@
         ret = push_samples(ctx, 1024);
     }
 
-    if (ret == AVERROR_EOF && s->nb_samples > 0 && s->loop != 0) {
-        ret = push_samples(ctx, outlink->sample_rate);
+    if (s->eof && s->nb_samples > 0 && s->loop != 0) {
+        ret = push_samples(ctx, 1024);
     }
 
     return ret;
 }
 
+static int aactivate(AVFilterContext *ctx)
+{
+    AVFilterLink *inlink = ctx->inputs[0];
+    AVFilterLink *outlink = ctx->outputs[0];
+    LoopContext *s = ctx->priv;
+    AVFrame *frame = NULL;
+    int ret, status;
+    int64_t pts;
+
+    FF_FILTER_FORWARD_STATUS_BACK(outlink, inlink);
+
+    if (!s->eof && (s->nb_samples < s->size || !s->loop || !s->size)) {
+        ret = ff_inlink_consume_frame(inlink, &frame);
+        if (ret < 0)
+            return ret;
+        if (ret > 0)
+            return afilter_frame(inlink, frame);
+    }
+
+    if (!s->eof && ff_inlink_acknowledge_status(inlink, &status, &pts)) {
+        if (status == AVERROR_EOF) {
+            s->size = s->nb_samples;
+            s->eof = 1;
+        }
+    }
+
+    if (s->eof && (!s->loop || !s->size)) {
+        ff_outlink_set_status(outlink, AVERROR_EOF, s->duration);
+        return 0;
+    }
+
+    if (!s->eof && (!s->size ||
+        (s->nb_samples < s->size) ||
+        (s->nb_samples >= s->size && s->loop == 0))) {
+        FF_FILTER_FORWARD_WANTED(outlink, inlink);
+    } else if (s->loop && s->nb_samples == s->size) {
+        return arequest_frame(outlink);
+    }
+
+    return FFERROR_NOT_READY;
+}
+
 static const AVOption aloop_options[] = {
     { "loop",  "number of loops",               OFFSET(loop),  AV_OPT_TYPE_INT,   {.i64 = 0 }, -1, INT_MAX,   AFLAGS },
     { "size",  "max number of samples to loop", OFFSET(size),  AV_OPT_TYPE_INT64, {.i64 = 0 },  0, INT32_MAX, AFLAGS },
@@ -212,7 +268,6 @@
     {
         .name         = "default",
         .type         = AVMEDIA_TYPE_AUDIO,
-        .filter_frame = afilter_frame,
         .config_props = aconfig_input,
     },
     { NULL }
@@ -222,7 +277,6 @@
     {
         .name          = "default",
         .type          = AVMEDIA_TYPE_AUDIO,
-        .request_frame = arequest_frame,
     },
     { NULL }
 };
@@ -232,6 +286,7 @@
     .description   = NULL_IF_CONFIG_SMALL("Loop audio samples."),
     .priv_size     = sizeof(LoopContext),
     .priv_class    = &aloop_class,
+    .activate      = aactivate,
     .uninit        = auninit,
     .inputs        = ainputs,
     .outputs       = aoutputs,
@@ -248,6 +303,8 @@
     if (!s->frames)
         return AVERROR(ENOMEM);
 
+    check_size(ctx);
+
     return 0;
 }
 
@@ -267,7 +324,7 @@
 {
     AVFilterLink *outlink = ctx->outputs[0];
     LoopContext *s = ctx->priv;
-    int64_t pts;
+    int64_t pts, duration;
     int ret;
 
     AVFrame *out = av_frame_clone(s->frames[s->current_frame]);
@@ -275,7 +332,11 @@
     if (!out)
         return AVERROR(ENOMEM);
     out->pts += s->duration - s->start_pts;
-    pts = out->pts + out->pkt_duration;
+    if (out->pkt_duration)
+        duration = out->pkt_duration;
+    else
+        duration = av_rescale_q(1, av_inv_q(outlink->frame_rate), outlink->time_base);
+    pts = out->pts + duration;
     ret = ff_filter_frame(outlink, out);
     s->current_frame++;
 
@@ -295,6 +356,7 @@
     AVFilterContext *ctx = inlink->dst;
     AVFilterLink *outlink = ctx->outputs[0];
     LoopContext *s = ctx->priv;
+    int64_t duration;
     int ret = 0;
 
     if (inlink->frame_count_out >= s->start && s->size > 0 && s->loop != 0) {
@@ -307,7 +369,11 @@
                 return AVERROR(ENOMEM);
             }
             s->nb_frames++;
-            s->duration = frame->pts + frame->pkt_duration;
+            if (frame->pkt_duration)
+                duration = frame->pkt_duration;
+            else
+                duration = av_rescale_q(1, av_inv_q(outlink->frame_rate), outlink->time_base);
+            s->duration = frame->pts + duration;
             ret = ff_filter_frame(outlink, frame);
         } else {
             av_frame_free(&frame);
@@ -321,25 +387,46 @@
     return ret;
 }
 
-static int request_frame(AVFilterLink *outlink)
+static int activate(AVFilterContext *ctx)
 {
-    AVFilterContext *ctx = outlink->src;
+    AVFilterLink *inlink = ctx->inputs[0];
+    AVFilterLink *outlink = ctx->outputs[0];
     LoopContext *s = ctx->priv;
-    int ret = 0;
+    AVFrame *frame = NULL;
+    int ret, status;
+    int64_t pts;
 
-    if ((!s->size) ||
+    FF_FILTER_FORWARD_STATUS_BACK(outlink, inlink);
+
+    if (!s->eof && (s->nb_frames < s->size || !s->loop || !s->size)) {
+        ret = ff_inlink_consume_frame(inlink, &frame);
+        if (ret < 0)
+            return ret;
+        if (ret > 0)
+            return filter_frame(inlink, frame);
+    }
+
+    if (!s->eof && ff_inlink_acknowledge_status(inlink, &status, &pts)) {
+        if (status == AVERROR_EOF) {
+            s->size = s->nb_frames;
+            s->eof = 1;
+        }
+    }
+
+    if (s->eof && (!s->loop || !s->size)) {
+        ff_outlink_set_status(outlink, AVERROR_EOF, s->duration);
+        return 0;
+    }
+
+    if (!s->eof && (!s->size ||
         (s->nb_frames < s->size) ||
-        (s->nb_frames >= s->size && s->loop == 0)) {
-        ret = ff_request_frame(ctx->inputs[0]);
-    } else {
-        ret = push_frame(ctx);
+        (s->nb_frames >= s->size && s->loop == 0))) {
+        FF_FILTER_FORWARD_WANTED(outlink, inlink);
+    } else if (s->loop && s->nb_frames == s->size) {
+        return push_frame(ctx);
     }
 
-    if (ret == AVERROR_EOF && s->nb_frames > 0 && s->loop != 0) {
-        ret = push_frame(ctx);
-    }
-
-    return ret;
+    return FFERROR_NOT_READY;
 }
 
 static const AVOption loop_options[] = {
@@ -353,18 +440,16 @@
 
 static const AVFilterPad inputs[] = {
     {
-        .name         = "default",
-        .type         = AVMEDIA_TYPE_VIDEO,
-        .filter_frame = filter_frame,
+        .name = "default",
+        .type = AVMEDIA_TYPE_VIDEO,
     },
     { NULL }
 };
 
 static const AVFilterPad outputs[] = {
     {
-        .name          = "default",
-        .type          = AVMEDIA_TYPE_VIDEO,
-        .request_frame = request_frame,
+        .name = "default",
+        .type = AVMEDIA_TYPE_VIDEO,
     },
     { NULL }
 };
@@ -376,6 +461,7 @@
     .priv_class  = &loop_class,
     .init        = init,
     .uninit      = uninit,
+    .activate    = activate,
     .inputs      = inputs,
     .outputs     = outputs,
 };
diff --git a/libavfilter/f_metadata.c b/libavfilter/f_metadata.c
index 523a94d..598257b 100644
--- a/libavfilter/f_metadata.c
+++ b/libavfilter/f_metadata.c
@@ -54,6 +54,7 @@
     METADATAF_EQUAL,
     METADATAF_GREATER,
     METADATAF_EXPR,
+    METADATAF_ENDS_WITH,
     METADATAF_NB
 };
 
@@ -87,6 +88,8 @@
     int (*compare)(struct MetadataContext *s,
                    const char *value1, const char *value2);
     void (*print)(AVFilterContext *ctx, const char *msg, ...) av_printf_format(2, 3);
+
+    int direct;    // reduces buffering when printing to user-supplied URL
 } MetadataContext;
 
 #define OFFSET(x) offsetof(MetadataContext, x)
@@ -107,8 +110,10 @@
     {   "equal",       NULL, 0, AV_OPT_TYPE_CONST, {.i64 = METADATAF_EQUAL   },     0, 3, FLAGS, "function" }, \
     {   "greater",     NULL, 0, AV_OPT_TYPE_CONST, {.i64 = METADATAF_GREATER },     0, 3, FLAGS, "function" }, \
     {   "expr",        NULL, 0, AV_OPT_TYPE_CONST, {.i64 = METADATAF_EXPR    },     0, 3, FLAGS, "function" }, \
+    {   "ends_with",   NULL, 0, AV_OPT_TYPE_CONST, {.i64 = METADATAF_ENDS_WITH },   0, 0, FLAGS, "function" }, \
     { "expr", "set expression for expr function", OFFSET(expr_str), AV_OPT_TYPE_STRING, {.str = NULL }, 0, 0, FLAGS }, \
     { "file", "set file where to print metadata information", OFFSET(file_str), AV_OPT_TYPE_STRING, {.str=NULL}, 0, 0, FLAGS }, \
+    { "direct", "reduce buffering when printing to user-set file or pipe", OFFSET(direct), AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, FLAGS }, \
     { NULL } \
 }
 
@@ -122,6 +127,14 @@
     return !strncmp(value1, value2, strlen(value2));
 }
 
+static int ends_with(MetadataContext *s, const char *value1, const char *value2)
+{
+    const int len1 = strlen(value1);
+    const int len2 = strlen(value2);
+
+    return !strncmp(value1 + FFMAX(len1 - len2, 0), value2, len2);
+}
+
 static int equal(MetadataContext *s, const char *value1, const char *value2)
 {
     float f1, f2;
@@ -212,6 +225,9 @@
     case METADATAF_STARTS_WITH:
         s->compare = starts_with;
         break;
+    case METADATAF_ENDS_WITH:
+        s->compare = ends_with;
+        break;
     case METADATAF_LESS:
         s->compare = less;
         break;
@@ -261,6 +277,9 @@
                    s->file_str, buf);
             return ret;
         }
+
+        if (s->direct)
+            s->avio_context->direct = AVIO_FLAG_DIRECT;
     }
 
     return 0;
@@ -270,6 +289,8 @@
 {
     MetadataContext *s = ctx->priv;
 
+    av_expr_free(s->expr);
+    s->expr = NULL;
     if (s->avio_context) {
         avio_closep(&s->avio_context);
     }
@@ -283,7 +304,7 @@
     AVDictionary **metadata = &frame->metadata;
     AVDictionaryEntry *e;
 
-    if (!*metadata)
+    if (!*metadata && s->mode != METADATA_ADD)
         return ff_filter_frame(outlink, frame);
 
     e = av_dict_get(*metadata, !s->key ? "" : s->key, NULL,
@@ -305,13 +326,11 @@
             av_dict_set(metadata, s->key, s->value, 0);
         }
         return ff_filter_frame(outlink, frame);
-        break;
     case METADATA_MODIFY:
         if (e && e->value) {
             av_dict_set(metadata, s->key, s->value, 0);
         }
         return ff_filter_frame(outlink, frame);
-        break;
     case METADATA_PRINT:
         if (!s->key && e) {
             s->print(ctx, "frame:%-4"PRId64" pts:%-7s pts_time:%s\n",
@@ -326,7 +345,6 @@
             s->print(ctx, "%s=%s\n", s->key, e->value);
         }
         return ff_filter_frame(outlink, frame);
-        break;
     case METADATA_DELETE:
         if (!s->key) {
             av_dict_free(metadata);
@@ -334,7 +352,6 @@
             av_dict_set(metadata, s->key, NULL, 0);
         }
         return ff_filter_frame(outlink, frame);
-        break;
     default:
         av_assert0(0);
     };
diff --git a/libavfilter/f_realtime.c b/libavfilter/f_realtime.c
index 171c16a..6fd3559 100644
--- a/libavfilter/f_realtime.c
+++ b/libavfilter/f_realtime.c
@@ -22,11 +22,13 @@
 #include "libavutil/time.h"
 #include "avfilter.h"
 #include "internal.h"
+#include <float.h>
 
 typedef struct RealtimeContext {
     const AVClass *class;
     int64_t delta;
     int64_t limit;
+    double speed;
     unsigned inited;
 } RealtimeContext;
 
@@ -36,7 +38,7 @@
     RealtimeContext *s = ctx->priv;
 
     if (frame->pts != AV_NOPTS_VALUE) {
-        int64_t pts = av_rescale_q(frame->pts, inlink->time_base, AV_TIME_BASE_Q);
+        int64_t pts = av_rescale_q(frame->pts, inlink->time_base, AV_TIME_BASE_Q) / s->speed;
         int64_t now = av_gettime_relative();
         int64_t sleep = pts - now + s->delta;
         if (!s->inited) {
@@ -44,7 +46,7 @@
             sleep = 0;
             s->delta = now - pts;
         }
-        if (sleep > s->limit || sleep < -s->limit) {
+        if (FFABS(sleep) > s->limit / s->speed) {
             av_log(ctx, AV_LOG_WARNING,
                    "time discontinuity detected: %"PRIi64" us, resetting\n",
                    sleep);
@@ -65,6 +67,7 @@
 #define FLAGS AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_FILTERING_PARAM
 static const AVOption options[] = {
     { "limit", "sleep time limit", OFFSET(limit), AV_OPT_TYPE_DURATION, { .i64 = 2000000 }, 0, INT64_MAX, FLAGS },
+    { "speed", "speed factor", OFFSET(speed), AV_OPT_TYPE_DOUBLE, { .dbl = 1.0 }, DBL_MIN, DBL_MAX, FLAGS },
     { NULL }
 };
 
diff --git a/libavfilter/f_reverse.c b/libavfilter/f_reverse.c
index 5f27927..1e27264 100644
--- a/libavfilter/f_reverse.c
+++ b/libavfilter/f_reverse.c
@@ -58,6 +58,11 @@
 {
     ReverseContext *s = ctx->priv;
 
+    while (s->nb_frames > 0) {
+        av_frame_free(&s->frames[s->nb_frames - 1]);
+        s->nb_frames--;
+    }
+
     av_freep(&s->pts);
     av_freep(&s->frames);
 }
@@ -103,6 +108,7 @@
         AVFrame *out = s->frames[s->nb_frames - 1];
         out->pts     = s->pts[s->flush_idx++];
         ret          = ff_filter_frame(outlink, out);
+        s->frames[s->nb_frames - 1] = NULL;
         s->nb_frames--;
     }
 
@@ -262,6 +268,7 @@
         else
             reverse_samples_packed(out);
         ret = ff_filter_frame(outlink, out);
+        s->frames[s->nb_frames - 1] = NULL;
         s->nb_frames--;
     }
 
diff --git a/libavfilter/f_select.c b/libavfilter/f_select.c
index b1b2cbc..755e10a 100644
--- a/libavfilter/f_select.c
+++ b/libavfilter/f_select.c
@@ -26,14 +26,16 @@
 #include "libavutil/avstring.h"
 #include "libavutil/eval.h"
 #include "libavutil/fifo.h"
+#include "libavutil/imgutils.h"
 #include "libavutil/internal.h"
 #include "libavutil/opt.h"
-#include "libavutil/pixelutils.h"
+#include "libavutil/pixdesc.h"
 #include "avfilter.h"
 #include "audio.h"
 #include "formats.h"
 #include "internal.h"
 #include "video.h"
+#include "scene_sad.h"
 
 static const char *const var_names[] = {
     "TB",                ///< timebase
@@ -144,8 +146,12 @@
     char *expr_str;
     AVExpr *expr;
     double var_values[VAR_VARS_NB];
+    int bitdepth;
+    int nb_planes;
+    ptrdiff_t width[4];
+    ptrdiff_t height[4];
     int do_scene_detect;            ///< 1 if the expression requires scene detection variables, 0 otherwise
-    av_pixelutils_sad_fn sad;       ///< Sum of the absolute difference function (scene detect only)
+    ff_scene_sad_fn sad;            ///< Sum of the absolute difference function (scene detect only)
     double prev_mafd;               ///< previous MAFD                           (scene detect only)
     AVFrame *prev_picref;           ///< previous frame                          (scene detect only)
     double select;
@@ -202,6 +208,21 @@
 static int config_input(AVFilterLink *inlink)
 {
     SelectContext *select = inlink->dst->priv;
+    const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(inlink->format);
+    int is_yuv = !(desc->flags & AV_PIX_FMT_FLAG_RGB) &&
+                 (desc->flags & AV_PIX_FMT_FLAG_PLANAR) &&
+                 desc->nb_components >= 3;
+
+    select->bitdepth = desc->comp[0].depth;
+    select->nb_planes = is_yuv ? 1 : av_pix_fmt_count_planes(inlink->format);
+
+    for (int plane = 0; plane < select->nb_planes; plane++) {
+        ptrdiff_t line_size = av_image_get_linesize(inlink->format, inlink->w, plane);
+        int vsub = desc->log2_chroma_h;
+
+        select->width[plane] = line_size >> (select->bitdepth > 8);
+        select->height[plane] = plane == 1 || plane == 2 ?  AV_CEIL_RSHIFT(inlink->h, vsub) : inlink->h;
+    }
 
     select->var_values[VAR_N]          = 0.0;
     select->var_values[VAR_SELECTED_N] = 0.0;
@@ -241,8 +262,8 @@
     select->var_values[VAR_SAMPLE_RATE] =
         inlink->type == AVMEDIA_TYPE_AUDIO ? inlink->sample_rate : NAN;
 
-    if (select->do_scene_detect) {
-        select->sad = av_pixelutils_get_sad_fn(3, 3, 2, select); // 8x8 both sources aligned
+    if (CONFIG_SELECT_FILTER && select->do_scene_detect) {
+        select->sad = ff_scene_sad_get_fn(select->bitdepth == 8 ? 8 : 16);
         if (!select->sad)
             return AVERROR(EINVAL);
     }
@@ -258,24 +279,21 @@
     if (prev_picref &&
         frame->height == prev_picref->height &&
         frame->width  == prev_picref->width) {
-        int x, y, nb_sad = 0;
-        int64_t sad = 0;
+        uint64_t sad = 0;
         double mafd, diff;
-        uint8_t *p1 =      frame->data[0];
-        uint8_t *p2 = prev_picref->data[0];
-        const int p1_linesize =       frame->linesize[0];
-        const int p2_linesize = prev_picref->linesize[0];
+        uint64_t count = 0;
 
-        for (y = 0; y < frame->height - 7; y += 8) {
-            for (x = 0; x < frame->width*3 - 7; x += 8) {
-                sad += select->sad(p1 + x, p1_linesize, p2 + x, p2_linesize);
-                nb_sad += 8 * 8;
-            }
-            p1 += 8 * p1_linesize;
-            p2 += 8 * p2_linesize;
+        for (int plane = 0; plane < select->nb_planes; plane++) {
+            uint64_t plane_sad;
+            select->sad(prev_picref->data[plane], prev_picref->linesize[plane],
+                    frame->data[plane], frame->linesize[plane],
+                    select->width[plane], select->height[plane], &plane_sad);
+            sad += plane_sad;
+            count += select->width[plane] * select->height[plane];
         }
+
         emms_c();
-        mafd = nb_sad ? (double)sad / nb_sad : 0;
+        mafd = (double)sad / count / (1ULL << (select->bitdepth - 8));
         diff = fabs(mafd - select->prev_mafd);
         ret  = av_clipf(FFMIN(mafd, diff) / 100., 0, 1);
         select->prev_mafd = mafd;
@@ -430,29 +448,6 @@
     }
 }
 
-static int query_formats(AVFilterContext *ctx)
-{
-    SelectContext *select = ctx->priv;
-
-    if (!select->do_scene_detect) {
-        return ff_default_query_formats(ctx);
-    } else {
-        int ret;
-        static const enum AVPixelFormat pix_fmts[] = {
-            AV_PIX_FMT_RGB24, AV_PIX_FMT_BGR24,
-            AV_PIX_FMT_NONE
-        };
-        AVFilterFormats *fmts_list = ff_make_format_list(pix_fmts);
-
-        if (!fmts_list)
-            return AVERROR(ENOMEM);
-        ret = ff_set_common_formats(ctx, fmts_list);
-        if (ret < 0)
-            return ret;
-    }
-    return 0;
-}
-
 #if CONFIG_ASELECT_FILTER
 
 DEFINE_OPTIONS(aselect, AV_OPT_FLAG_AUDIO_PARAM|AV_OPT_FLAG_FILTERING_PARAM);
@@ -498,6 +493,33 @@
 
 #if CONFIG_SELECT_FILTER
 
+static int query_formats(AVFilterContext *ctx)
+{
+    SelectContext *select = ctx->priv;
+
+    if (!select->do_scene_detect) {
+        return ff_default_query_formats(ctx);
+    } else {
+        int ret;
+        static const enum AVPixelFormat pix_fmts[] = {
+            AV_PIX_FMT_RGB24, AV_PIX_FMT_BGR24, AV_PIX_FMT_RGBA,
+            AV_PIX_FMT_ABGR, AV_PIX_FMT_BGRA, AV_PIX_FMT_GRAY8,
+            AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUVJ420P,
+            AV_PIX_FMT_YUV422P, AV_PIX_FMT_YUVJ422P,
+            AV_PIX_FMT_YUV420P10,
+            AV_PIX_FMT_NONE
+        };
+        AVFilterFormats *fmts_list = ff_make_format_list(pix_fmts);
+
+        if (!fmts_list)
+            return AVERROR(ENOMEM);
+        ret = ff_set_common_formats(ctx, fmts_list);
+        if (ret < 0)
+            return ret;
+    }
+    return 0;
+}
+
 DEFINE_OPTIONS(select, AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM);
 AVFILTER_DEFINE_CLASS(select);
 
diff --git a/libavfilter/f_sendcmd.c b/libavfilter/f_sendcmd.c
index b8740e8..0ac87e0 100644
--- a/libavfilter/f_sendcmd.c
+++ b/libavfilter/f_sendcmd.c
@@ -25,6 +25,7 @@
 
 #include "libavutil/avstring.h"
 #include "libavutil/bprint.h"
+#include "libavutil/eval.h"
 #include "libavutil/file.h"
 #include "libavutil/opt.h"
 #include "libavutil/parseutils.h"
@@ -35,10 +36,33 @@
 
 #define COMMAND_FLAG_ENTER 1
 #define COMMAND_FLAG_LEAVE 2
+#define COMMAND_FLAG_EXPR  4
+
+static const char *const var_names[] = {
+    "N",     /* frame number */
+    "T",     /* frame time in seconds */
+    "POS",   /* original position in the file of the frame */
+    "PTS",   /* frame pts */
+    "TS",    /* interval start time in seconds */
+    "TE",    /* interval end time in seconds */
+    "TI",    /* interval interpolated value: TI = (T - TS) / (TE - TS) */
+    NULL
+};
+
+enum var_name {
+    VAR_N,
+    VAR_T,
+    VAR_POS,
+    VAR_PTS,
+    VAR_TS,
+    VAR_TE,
+    VAR_TI,
+    VAR_VARS_NB
+};
 
 static inline char *make_command_flags_str(AVBPrint *pbuf, int flags)
 {
-    static const char * const flag_strings[] = { "enter", "leave" };
+    static const char * const flag_strings[] = { "enter", "leave", "expr" };
     int i, is_first = 1;
 
     av_bprint_init(pbuf, 0, AV_BPRINT_SIZE_AUTOMATIC);
@@ -129,6 +153,7 @@
 
             if      (!strncmp(*buf, "enter", strlen("enter"))) cmd->flags |= COMMAND_FLAG_ENTER;
             else if (!strncmp(*buf, "leave", strlen("leave"))) cmd->flags |= COMMAND_FLAG_LEAVE;
+            else if (!strncmp(*buf, "expr",  strlen("expr")))  cmd->flags |= COMMAND_FLAG_EXPR;
             else {
                 char flag_buf[64];
                 av_strlcpy(flag_buf, *buf, sizeof(flag_buf));
@@ -450,6 +475,9 @@
     av_freep(&s->intervals);
 }
 
+#define TS2D(ts) ((ts) == AV_NOPTS_VALUE ? NAN : (double)(ts))
+#define TS2T(ts, tb) ((ts) == AV_NOPTS_VALUE ? NAN : (double)(ts)*av_q2d(tb))
+
 static int filter_frame(AVFilterLink *inlink, AVFrame *ref)
 {
     AVFilterContext *ctx = inlink->dst;
@@ -476,6 +504,8 @@
             flags += COMMAND_FLAG_LEAVE;
             interval->enabled = 0;
         }
+        if (interval->enabled)
+            flags += COMMAND_FLAG_EXPR;
 
         if (flags) {
             AVBPrint pbuf;
@@ -487,19 +517,49 @@
 
             for (j = 0; flags && j < interval->nb_commands; j++) {
                 Command *cmd = &interval->commands[j];
+                char *cmd_arg = cmd->arg;
                 char buf[1024];
 
                 if (cmd->flags & flags) {
+                    if (cmd->flags & COMMAND_FLAG_EXPR) {
+                        double var_values[VAR_VARS_NB], res;
+                        double start = TS2T(interval->start_ts, AV_TIME_BASE_Q);
+                        double end = TS2T(interval->end_ts, AV_TIME_BASE_Q);
+                        double current = TS2T(ref->pts, inlink->time_base);
+
+                        var_values[VAR_N]   = inlink->frame_count_in;
+                        var_values[VAR_POS] = ref->pkt_pos == -1 ? NAN : ref->pkt_pos;
+                        var_values[VAR_PTS] = TS2D(ref->pts);
+                        var_values[VAR_T]   = current;
+                        var_values[VAR_TS]  = start;
+                        var_values[VAR_TE]  = end;
+                        var_values[VAR_TI]  = (current - start) / (end - start);
+
+                        if ((ret = av_expr_parse_and_eval(&res, cmd->arg, var_names, var_values,
+                                                          NULL, NULL, NULL, NULL, NULL, 0, NULL)) < 0) {
+                            av_log(ctx, AV_LOG_ERROR, "Invalid expression '%s' for command argument.\n", cmd->arg);
+                            av_frame_free(&ref);
+                            return AVERROR(EINVAL);
+                        }
+
+                        cmd_arg = av_asprintf("%g", res);
+                        if (!cmd_arg) {
+                            av_frame_free(&ref);
+                            return AVERROR(ENOMEM);
+                        }
+                    }
                     av_log(ctx, AV_LOG_VERBOSE,
                            "Processing command #%d target:%s command:%s arg:%s\n",
-                           cmd->index, cmd->target, cmd->command, cmd->arg);
+                           cmd->index, cmd->target, cmd->command, cmd_arg);
                     ret = avfilter_graph_send_command(inlink->graph,
-                                                      cmd->target, cmd->command, cmd->arg,
+                                                      cmd->target, cmd->command, cmd_arg,
                                                       buf, sizeof(buf),
                                                       AVFILTER_CMD_FLAG_ONE);
                     av_log(ctx, AV_LOG_VERBOSE,
                            "Command reply for command #%d: ret:%s res:%s\n",
                            cmd->index, av_err2str(ret), buf);
+                    if (cmd->flags & COMMAND_FLAG_EXPR)
+                        av_freep(&cmd_arg);
                 }
             }
         }
diff --git a/libavfilter/f_sidedata.c b/libavfilter/f_sidedata.c
index 45d246b..4210dca 100644
--- a/libavfilter/f_sidedata.c
+++ b/libavfilter/f_sidedata.c
@@ -39,10 +39,11 @@
     const AVClass *class;
 
     int mode;
-    enum AVFrameSideDataType type;
+    int type;   // enum AVFrameSideDataType or -1 for delete side data mode
 } SideDataContext;
 
 #define OFFSET(x) offsetof(SideDataContext, x)
+#if FF_API_FRAME_QP
 #define DEFINE_OPTIONS(filt_name, FLAGS) \
 static const AVOption filt_name##_options[] = { \
     { "mode", "set a mode of operation", OFFSET(mode),   AV_OPT_TYPE_INT,    {.i64 = 0 }, 0, SIDEDATA_NB-1, FLAGS, "mode" }, \
@@ -62,8 +63,45 @@
     {   "AUDIO_SERVICE_TYPE",         "", 0,             AV_OPT_TYPE_CONST,  {.i64 = AV_FRAME_DATA_AUDIO_SERVICE_TYPE         }, 0, 0, FLAGS, "type" }, \
     {   "MASTERING_DISPLAY_METADATA", "", 0,             AV_OPT_TYPE_CONST,  {.i64 = AV_FRAME_DATA_MASTERING_DISPLAY_METADATA }, 0, 0, FLAGS, "type" }, \
     {   "GOP_TIMECODE",               "", 0,             AV_OPT_TYPE_CONST,  {.i64 = AV_FRAME_DATA_GOP_TIMECODE               }, 0, 0, FLAGS, "type" }, \
+    {   "SPHERICAL",                  "", 0,             AV_OPT_TYPE_CONST,  {.i64 = AV_FRAME_DATA_SPHERICAL                  }, 0, 0, FLAGS, "type" }, \
+    {   "CONTENT_LIGHT_LEVEL",        "", 0,             AV_OPT_TYPE_CONST,  {.i64 = AV_FRAME_DATA_CONTENT_LIGHT_LEVEL        }, 0, 0, FLAGS, "type" }, \
+    {   "ICC_PROFILE",                "", 0,             AV_OPT_TYPE_CONST,  {.i64 = AV_FRAME_DATA_ICC_PROFILE                }, 0, 0, FLAGS, "type" }, \
+    {   "QP_TABLE_PROPERTIES",        "", 0,             AV_OPT_TYPE_CONST,  {.i64 = AV_FRAME_DATA_QP_TABLE_PROPERTIES        }, 0, 0, FLAGS, "type" }, \
+    {   "QP_TABLE_DATA",              "", 0,             AV_OPT_TYPE_CONST,  {.i64 = AV_FRAME_DATA_QP_TABLE_DATA              }, 0, 0, FLAGS, "type" }, \
+    {   "S12M_TIMECOD",               "", 0,             AV_OPT_TYPE_CONST,  {.i64 = AV_FRAME_DATA_S12M_TIMECODE              }, 0, 0, FLAGS, "type" }, \
+    {   "DYNAMIC_HDR_PLUS",           "", 0,             AV_OPT_TYPE_CONST,  {.i64 = AV_FRAME_DATA_DYNAMIC_HDR_PLUS           }, 0, 0, FLAGS, "type" }, \
+    {   "REGIONS_OF_INTEREST",        "", 0,             AV_OPT_TYPE_CONST,  {.i64 = AV_FRAME_DATA_REGIONS_OF_INTEREST        }, 0, 0, FLAGS, "type" }, \
     { NULL } \
 }
+#else
+#define DEFINE_OPTIONS(filt_name, FLAGS) \
+static const AVOption filt_name##_options[] = { \
+    { "mode", "set a mode of operation", OFFSET(mode),   AV_OPT_TYPE_INT,    {.i64 = 0 }, 0, SIDEDATA_NB-1, FLAGS, "mode" }, \
+    {   "select", "select frame",        0,              AV_OPT_TYPE_CONST,  {.i64 = SIDEDATA_SELECT }, 0, 0, FLAGS, "mode" }, \
+    {   "delete", "delete side data",    0,              AV_OPT_TYPE_CONST,  {.i64 = SIDEDATA_DELETE }, 0, 0, FLAGS, "mode" }, \
+    { "type",   "set side data type",    OFFSET(type),   AV_OPT_TYPE_INT,    {.i64 = -1 }, -1, INT_MAX, FLAGS, "type" }, \
+    {   "PANSCAN",                    "", 0,             AV_OPT_TYPE_CONST,  {.i64 = AV_FRAME_DATA_PANSCAN                    }, 0, 0, FLAGS, "type" }, \
+    {   "A53_CC",                     "", 0,             AV_OPT_TYPE_CONST,  {.i64 = AV_FRAME_DATA_A53_CC                     }, 0, 0, FLAGS, "type" }, \
+    {   "STEREO3D",                   "", 0,             AV_OPT_TYPE_CONST,  {.i64 = AV_FRAME_DATA_STEREO3D                   }, 0, 0, FLAGS, "type" }, \
+    {   "MATRIXENCODING",             "", 0,             AV_OPT_TYPE_CONST,  {.i64 = AV_FRAME_DATA_MATRIXENCODING             }, 0, 0, FLAGS, "type" }, \
+    {   "DOWNMIX_INFO",               "", 0,             AV_OPT_TYPE_CONST,  {.i64 = AV_FRAME_DATA_DOWNMIX_INFO               }, 0, 0, FLAGS, "type" }, \
+    {   "REPLAYGAIN",                 "", 0,             AV_OPT_TYPE_CONST,  {.i64 = AV_FRAME_DATA_REPLAYGAIN                 }, 0, 0, FLAGS, "type" }, \
+    {   "DISPLAYMATRIX",              "", 0,             AV_OPT_TYPE_CONST,  {.i64 = AV_FRAME_DATA_DISPLAYMATRIX              }, 0, 0, FLAGS, "type" }, \
+    {   "AFD",                        "", 0,             AV_OPT_TYPE_CONST,  {.i64 = AV_FRAME_DATA_AFD                        }, 0, 0, FLAGS, "type" }, \
+    {   "MOTION_VECTORS",             "", 0,             AV_OPT_TYPE_CONST,  {.i64 = AV_FRAME_DATA_MOTION_VECTORS             }, 0, 0, FLAGS, "type" }, \
+    {   "SKIP_SAMPLES",               "", 0,             AV_OPT_TYPE_CONST,  {.i64 = AV_FRAME_DATA_SKIP_SAMPLES               }, 0, 0, FLAGS, "type" }, \
+    {   "AUDIO_SERVICE_TYPE",         "", 0,             AV_OPT_TYPE_CONST,  {.i64 = AV_FRAME_DATA_AUDIO_SERVICE_TYPE         }, 0, 0, FLAGS, "type" }, \
+    {   "MASTERING_DISPLAY_METADATA", "", 0,             AV_OPT_TYPE_CONST,  {.i64 = AV_FRAME_DATA_MASTERING_DISPLAY_METADATA }, 0, 0, FLAGS, "type" }, \
+    {   "GOP_TIMECODE",               "", 0,             AV_OPT_TYPE_CONST,  {.i64 = AV_FRAME_DATA_GOP_TIMECODE               }, 0, 0, FLAGS, "type" }, \
+    {   "SPHERICAL",                  "", 0,             AV_OPT_TYPE_CONST,  {.i64 = AV_FRAME_DATA_SPHERICAL                  }, 0, 0, FLAGS, "type" }, \
+    {   "CONTENT_LIGHT_LEVEL",        "", 0,             AV_OPT_TYPE_CONST,  {.i64 = AV_FRAME_DATA_CONTENT_LIGHT_LEVEL        }, 0, 0, FLAGS, "type" }, \
+    {   "ICC_PROFILE",                "", 0,             AV_OPT_TYPE_CONST,  {.i64 = AV_FRAME_DATA_ICC_PROFILE                }, 0, 0, FLAGS, "type" }, \
+    {   "S12M_TIMECOD",               "", 0,             AV_OPT_TYPE_CONST,  {.i64 = AV_FRAME_DATA_S12M_TIMECODE              }, 0, 0, FLAGS, "type" }, \
+    {   "DYNAMIC_HDR_PLUS",           "", 0,             AV_OPT_TYPE_CONST,  {.i64 = AV_FRAME_DATA_DYNAMIC_HDR_PLUS           }, 0, 0, FLAGS, "type" }, \
+    {   "REGIONS_OF_INTEREST",        "", 0,             AV_OPT_TYPE_CONST,  {.i64 = AV_FRAME_DATA_REGIONS_OF_INTEREST        }, 0, 0, FLAGS, "type" }, \
+    { NULL } \
+}
+#endif
 
 static av_cold int init(AVFilterContext *ctx)
 {
diff --git a/libavfilter/f_streamselect.c b/libavfilter/f_streamselect.c
index 923deb1..b3ae4be 100644
--- a/libavfilter/f_streamselect.c
+++ b/libavfilter/f_streamselect.c
@@ -21,6 +21,7 @@
 #include "libavutil/opt.h"
 #include "avfilter.h"
 #include "audio.h"
+#include "filters.h"
 #include "formats.h"
 #include "framesync.h"
 #include "internal.h"
@@ -40,9 +41,10 @@
 
 #define OFFSET(x) offsetof(StreamSelectContext, x)
 #define FLAGS AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_FILTERING_PARAM
+#define TFLAGS AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_FILTERING_PARAM | AV_OPT_FLAG_RUNTIME_PARAM
 static const AVOption streamselect_options[] = {
     { "inputs",  "number of input streams",           OFFSET(nb_inputs),  AV_OPT_TYPE_INT,    {.i64=2},    2, INT_MAX,  .flags=FLAGS },
-    { "map",     "input indexes to remap to outputs", OFFSET(map_str),    AV_OPT_TYPE_STRING, {.str=NULL},              .flags=FLAGS },
+    { "map",     "input indexes to remap to outputs", OFFSET(map_str),    AV_OPT_TYPE_STRING, {.str=NULL},              .flags=TFLAGS },
     { NULL }
 };
 
@@ -53,7 +55,7 @@
     AVFilterContext *ctx = fs->parent;
     StreamSelectContext *s = fs->opaque;
     AVFrame **in = s->frames;
-    int i, j, ret = 0;
+    int i, j, ret = 0, have_out = 0;
 
     for (i = 0; i < ctx->nb_inputs; i++) {
         if ((ret = ff_framesync_get_frame(&s->fs, i, &in[i], 0)) < 0)
@@ -75,12 +77,15 @@
                 out->pts = av_rescale_q(s->fs.pts, s->fs.time_base, ctx->outputs[i]->time_base);
                 s->last_pts[j] = in[j]->pts;
                 ret = ff_filter_frame(ctx->outputs[i], out);
+                have_out = 1;
                 if (ret < 0)
                     return ret;
             }
         }
     }
 
+    if (!have_out)
+        ff_filter_set_ready(ctx, 100);
     return ret;
 }
 
@@ -290,6 +295,12 @@
     av_freep(&s->map);
     av_freep(&s->frames);
     ff_framesync_uninit(&s->fs);
+
+    for (int i = 0; i < ctx->nb_inputs; i++)
+        av_freep(&ctx->input_pads[i].name);
+
+    for (int i = 0; i < ctx->nb_outputs; i++)
+        av_freep(&ctx->output_pads[i].name);
 }
 
 static int query_formats(AVFilterContext *ctx)
diff --git a/libavfilter/f_zmq.c b/libavfilter/f_zmq.c
index 89da5be..744c721 100644
--- a/libavfilter/f_zmq.c
+++ b/libavfilter/f_zmq.c
@@ -139,7 +139,7 @@
         ret = AVERROR(ENOMEM);
         goto end;
     }
-    memcpy(*buf, zmq_msg_data(&msg), *buf_size);
+    memcpy(*buf, zmq_msg_data(&msg), *buf_size - 1);
     (*buf)[*buf_size-1] = 0;
 
 end:
diff --git a/libavfilter/fifo.c b/libavfilter/fifo.c
index 0fa0f86..f5587df 100644
--- a/libavfilter/fifo.c
+++ b/libavfilter/fifo.c
@@ -36,7 +36,7 @@
 
 typedef struct Buf {
     AVFrame *frame;
-    struct Buf        *next;
+    struct Buf *next;
 } Buf;
 
 typedef struct FifoContext {
@@ -53,38 +53,38 @@
 
 static av_cold int init(AVFilterContext *ctx)
 {
-    FifoContext *fifo = ctx->priv;
-    fifo->last = &fifo->root;
+    FifoContext *s = ctx->priv;
+    s->last = &s->root;
 
     return 0;
 }
 
 static av_cold void uninit(AVFilterContext *ctx)
 {
-    FifoContext *fifo = ctx->priv;
+    FifoContext *s = ctx->priv;
     Buf *buf, *tmp;
 
-    for (buf = fifo->root.next; buf; buf = tmp) {
+    for (buf = s->root.next; buf; buf = tmp) {
         tmp = buf->next;
         av_frame_free(&buf->frame);
         av_free(buf);
     }
 
-    av_frame_free(&fifo->out);
+    av_frame_free(&s->out);
 }
 
 static int add_to_queue(AVFilterLink *inlink, AVFrame *frame)
 {
-    FifoContext *fifo = inlink->dst->priv;
+    FifoContext *s = inlink->dst->priv;
 
-    fifo->last->next = av_mallocz(sizeof(Buf));
-    if (!fifo->last->next) {
+    s->last->next = av_mallocz(sizeof(Buf));
+    if (!s->last->next) {
         av_frame_free(&frame);
         return AVERROR(ENOMEM);
     }
 
-    fifo->last = fifo->last->next;
-    fifo->last->frame = frame;
+    s->last = s->last->next;
+    s->last->frame = frame;
 
     return 0;
 }
@@ -229,24 +229,24 @@
 
 static int request_frame(AVFilterLink *outlink)
 {
-    FifoContext *fifo = outlink->src->priv;
+    FifoContext *s = outlink->src->priv;
     int ret = 0;
 
-    if (!fifo->root.next) {
+    if (!s->root.next) {
         if ((ret = ff_request_frame(outlink->src->inputs[0])) < 0) {
             if (ret == AVERROR_EOF && outlink->request_samples)
                 return return_audio_frame(outlink->src);
             return ret;
         }
-        if (!fifo->root.next)
+        if (!s->root.next)
             return 0;
     }
 
     if (outlink->request_samples) {
         return return_audio_frame(outlink->src);
     } else {
-        ret = ff_filter_frame(outlink, fifo->root.next->frame);
-        queue_pop(fifo);
+        ret = ff_filter_frame(outlink, s->root.next->frame);
+        queue_pop(s);
     }
 
     return ret;
@@ -254,9 +254,9 @@
 
 static const AVFilterPad avfilter_vf_fifo_inputs[] = {
     {
-        .name             = "default",
-        .type             = AVMEDIA_TYPE_VIDEO,
-        .filter_frame     = add_to_queue,
+        .name         = "default",
+        .type         = AVMEDIA_TYPE_VIDEO,
+        .filter_frame = add_to_queue,
     },
     { NULL }
 };
@@ -271,23 +271,20 @@
 };
 
 AVFilter ff_vf_fifo = {
-    .name      = "fifo",
+    .name        = "fifo",
     .description = NULL_IF_CONFIG_SMALL("Buffer input images and send them when they are requested."),
-
-    .init      = init,
-    .uninit    = uninit,
-
-    .priv_size = sizeof(FifoContext),
-
-    .inputs    = avfilter_vf_fifo_inputs,
-    .outputs   = avfilter_vf_fifo_outputs,
+    .init        = init,
+    .uninit      = uninit,
+    .priv_size   = sizeof(FifoContext),
+    .inputs      = avfilter_vf_fifo_inputs,
+    .outputs     = avfilter_vf_fifo_outputs,
 };
 
 static const AVFilterPad avfilter_af_afifo_inputs[] = {
     {
-        .name             = "default",
-        .type             = AVMEDIA_TYPE_AUDIO,
-        .filter_frame     = add_to_queue,
+        .name         = "default",
+        .type         = AVMEDIA_TYPE_AUDIO,
+        .filter_frame = add_to_queue,
     },
     { NULL }
 };
@@ -304,12 +301,9 @@
 AVFilter ff_af_afifo = {
     .name        = "afifo",
     .description = NULL_IF_CONFIG_SMALL("Buffer input frames and send them when they are requested."),
-
-    .init      = init,
-    .uninit    = uninit,
-
-    .priv_size = sizeof(FifoContext),
-
-    .inputs    = avfilter_af_afifo_inputs,
-    .outputs   = avfilter_af_afifo_outputs,
+    .init        = init,
+    .uninit      = uninit,
+    .priv_size   = sizeof(FifoContext),
+    .inputs      = avfilter_af_afifo_inputs,
+    .outputs     = avfilter_af_afifo_outputs,
 };
diff --git a/libavfilter/formats.c b/libavfilter/formats.c
index 31ee445..33c6466 100644
--- a/libavfilter/formats.c
+++ b/libavfilter/formats.c
@@ -317,7 +317,6 @@
     void *oldf = *f;                                        \
                                                             \
     if (!(*f) && !(*f = av_mallocz(sizeof(**f)))) {         \
-        unref_fn(f);                                        \
         return AVERROR(ENOMEM);                             \
     }                                                       \
                                                             \
@@ -456,7 +455,7 @@
 do {                                                               \
     int idx = -1;                                                  \
                                                                    \
-    if (!*ref || !(*ref)->refs)                                    \
+    if (!ref || !*ref || !(*ref)->refs)                            \
         return;                                                    \
                                                                    \
     FIND_REF_INDEX(ref, idx);                                      \
@@ -518,7 +517,8 @@
             int ret = ref_fn(fmts, &ctx->inputs[i]->out_fmts);      \
             if (ret < 0) {                                          \
                 unref_fn(&fmts);                                    \
-                av_freep(&fmts->list);                              \
+                if (fmts)                                           \
+                    av_freep(&fmts->list);                          \
                 av_freep(&fmts);                                    \
                 return ret;                                         \
             }                                                       \
@@ -530,7 +530,8 @@
             int ret = ref_fn(fmts, &ctx->outputs[i]->in_fmts);      \
             if (ret < 0) {                                          \
                 unref_fn(&fmts);                                    \
-                av_freep(&fmts->list);                              \
+                if (fmts)                                           \
+                    av_freep(&fmts->list);                          \
                 av_freep(&fmts);                                    \
                 return ret;                                         \
             }                                                       \
diff --git a/libavfilter/framerate.h b/libavfilter/framerate.h
index a42d5af..d255635 100644
--- a/libavfilter/framerate.h
+++ b/libavfilter/framerate.h
@@ -19,7 +19,7 @@
 #ifndef AVFILTER_FRAMERATE_H
 #define AVFILTER_FRAMERATE_H
 
-#include "libavutil/pixelutils.h"
+#include "scene_sad.h"
 #include "avfilter.h"
 
 #define BLEND_FUNC_PARAMS const uint8_t *src1, ptrdiff_t src1_linesize, \
@@ -28,8 +28,7 @@
                           ptrdiff_t width, ptrdiff_t height, \
                           int factor1, int factor2, int half
 
-#define BLEND_FACTOR_DEPTH8   7
-#define BLEND_FACTOR_DEPTH16 15
+#define BLEND_FACTOR_DEPTH(n) (n-1)
 
 typedef void (*blend_func)(BLEND_FUNC_PARAMS);
 
@@ -43,12 +42,13 @@
     int interp_end;                     ///< end of range to apply linear interpolation
 
     int line_size[4];                   ///< bytes of pixel data per line for each plane
+    int height[4];                      ///< height of each plane
     int vsub;
 
     AVRational srce_time_base;          ///< timebase of source
     AVRational dest_time_base;          ///< timebase of destination
 
-    av_pixelutils_sad_fn sad;           ///< Sum of the absolute difference function (scene detect only)
+    ff_scene_sad_fn sad;                ///< Sum of the absolute difference function (scene detect only)
     double prev_mafd;                   ///< previous MAFD                           (scene detect only)
 
     int blend_factor_max;
diff --git a/libavfilter/framesync.c b/libavfilter/framesync.c
index 22d3f09..bc95f7d 100644
--- a/libavfilter/framesync.c
+++ b/libavfilter/framesync.c
@@ -127,16 +127,16 @@
         fs->opt_shortest = 1;
         fs->opt_eof_action = EOF_ACTION_ENDALL;
     }
-    if (fs->opt_shortest) {
-        for (i = 0; i < fs->nb_in; i++)
-            fs->in[i].after = EXT_STOP;
-    }
     if (!fs->opt_repeatlast) {
         for (i = 1; i < fs->nb_in; i++) {
             fs->in[i].after = EXT_NULL;
             fs->in[i].sync  = 0;
         }
     }
+    if (fs->opt_shortest) {
+        for (i = 0; i < fs->nb_in; i++)
+            fs->in[i].after = EXT_STOP;
+    }
 
     if (!fs->time_base.num) {
         for (i = 0; i < fs->nb_in; i++) {
diff --git a/libavfilter/gblur.h b/libavfilter/gblur.h
new file mode 100644
index 0000000..8712980
--- /dev/null
+++ b/libavfilter/gblur.h
@@ -0,0 +1,55 @@
+/*
+ * Copyright (c) 2011 Pascal Getreuer
+ * Copyright (c) 2016 Paul B Mahol
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ *  * Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  * Redistributions in binary form must reproduce the above
+ *    copyright notice, this list of conditions and the following
+ *    disclaimer in the documentation and/or other materials provided
+ *    with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef AVFILTER_GBLUR_H
+#define AVFILTER_GBLUR_H
+#include "avfilter.h"
+
+typedef struct GBlurContext {
+    const AVClass *class;
+
+    float sigma;
+    float sigmaV;
+    int steps;
+    int planes;
+
+    int depth;
+    int planewidth[4];
+    int planeheight[4];
+    float *buffer;
+    float boundaryscale;
+    float boundaryscaleV;
+    float postscale;
+    float postscaleV;
+    float nu;
+    float nuV;
+    int nb_planes;
+    void (*horiz_slice)(float *buffer, int width, int height, int steps, float nu, float bscale);
+} GBlurContext;
+void ff_gblur_init(GBlurContext *s);
+void ff_gblur_init_x86(GBlurContext *s);
+#endif
diff --git a/libavfilter/glslang.cpp b/libavfilter/glslang.cpp
new file mode 100644
index 0000000..497df6e
--- /dev/null
+++ b/libavfilter/glslang.cpp
@@ -0,0 +1,243 @@
+/*
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include <pthread.h>
+
+extern "C" {
+#include "libavutil/mem.h"
+#include "libavutil/avassert.h"
+}
+
+#include <glslang/Include/ResourceLimits.h>
+#include <glslang/Include/revision.h>
+#include <glslang/Public/ShaderLang.h>
+#include <glslang/SPIRV/GlslangToSpv.h>
+
+#include "glslang.h"
+
+using namespace glslang;
+
+static pthread_mutex_t glslang_mutex = PTHREAD_MUTEX_INITIALIZER;
+static int glslang_refcount = 0;
+
+/* We require Vulkan 1.1 */
+#define GLSL_VERSION EShTargetVulkan_1_1
+
+/* Vulkan 1.1 implementations require SPIR-V 1.3 to be implemented */
+#define SPIRV_VERSION EShTargetSpv_1_3
+
+// Taken from glslang's examples, which apparently generally bases the choices
+// on OpenGL specification limits
+static const TBuiltInResource DefaultTBuiltInResource = {
+    /* .MaxLights = */ 32,
+    /* .MaxClipPlanes = */ 6,
+    /* .MaxTextureUnits = */ 32,
+    /* .MaxTextureCoords = */ 32,
+    /* .MaxVertexAttribs = */ 64,
+    /* .MaxVertexUniformComponents = */ 4096,
+    /* .MaxVaryingFloats = */ 64,
+    /* .MaxVertexTextureImageUnits = */ 32,
+    /* .MaxCombinedTextureImageUnits = */ 80,
+    /* .MaxTextureImageUnits = */ 32,
+    /* .MaxFragmentUniformComponents = */ 4096,
+    /* .MaxDrawBuffers = */ 32,
+    /* .MaxVertexUniformVectors = */ 128,
+    /* .MaxVaryingVectors = */ 8,
+    /* .MaxFragmentUniformVectors = */ 16,
+    /* .MaxVertexOutputVectors = */ 16,
+    /* .MaxFragmentInputVectors = */ 15,
+    /* .MinProgramTexelOffset = */ -8,
+    /* .MaxProgramTexelOffset = */ 7,
+    /* .MaxClipDistances = */ 8,
+    /* .MaxComputeWorkGroupCountX = */ 65535,
+    /* .MaxComputeWorkGroupCountY = */ 65535,
+    /* .MaxComputeWorkGroupCountZ = */ 65535,
+    /* .MaxComputeWorkGroupSizeX = */ 1024,
+    /* .MaxComputeWorkGroupSizeY = */ 1024,
+    /* .MaxComputeWorkGroupSizeZ = */ 64,
+    /* .MaxComputeUniformComponents = */ 1024,
+    /* .MaxComputeTextureImageUnits = */ 16,
+    /* .MaxComputeImageUniforms = */ 8,
+    /* .MaxComputeAtomicCounters = */ 8,
+    /* .MaxComputeAtomicCounterBuffers = */ 1,
+    /* .MaxVaryingComponents = */ 60,
+    /* .MaxVertexOutputComponents = */ 64,
+    /* .MaxGeometryInputComponents = */ 64,
+    /* .MaxGeometryOutputComponents = */ 128,
+    /* .MaxFragmentInputComponents = */ 128,
+    /* .MaxImageUnits = */ 8,
+    /* .MaxCombinedImageUnitsAndFragmentOutputs = */ 8,
+    /* .MaxCombinedShaderOutputResources = */ 8,
+    /* .MaxImageSamples = */ 0,
+    /* .MaxVertexImageUniforms = */ 0,
+    /* .MaxTessControlImageUniforms = */ 0,
+    /* .MaxTessEvaluationImageUniforms = */ 0,
+    /* .MaxGeometryImageUniforms = */ 0,
+    /* .MaxFragmentImageUniforms = */ 8,
+    /* .MaxCombinedImageUniforms = */ 8,
+    /* .MaxGeometryTextureImageUnits = */ 16,
+    /* .MaxGeometryOutputVertices = */ 256,
+    /* .MaxGeometryTotalOutputComponents = */ 1024,
+    /* .MaxGeometryUniformComponents = */ 1024,
+    /* .MaxGeometryVaryingComponents = */ 64,
+    /* .MaxTessControlInputComponents = */ 128,
+    /* .MaxTessControlOutputComponents = */ 128,
+    /* .MaxTessControlTextureImageUnits = */ 16,
+    /* .MaxTessControlUniformComponents = */ 1024,
+    /* .MaxTessControlTotalOutputComponents = */ 4096,
+    /* .MaxTessEvaluationInputComponents = */ 128,
+    /* .MaxTessEvaluationOutputComponents = */ 128,
+    /* .MaxTessEvaluationTextureImageUnits = */ 16,
+    /* .MaxTessEvaluationUniformComponents = */ 1024,
+    /* .MaxTessPatchComponents = */ 120,
+    /* .MaxPatchVertices = */ 32,
+    /* .MaxTessGenLevel = */ 64,
+    /* .MaxViewports = */ 16,
+    /* .MaxVertexAtomicCounters = */ 0,
+    /* .MaxTessControlAtomicCounters = */ 0,
+    /* .MaxTessEvaluationAtomicCounters = */ 0,
+    /* .MaxGeometryAtomicCounters = */ 0,
+    /* .MaxFragmentAtomicCounters = */ 8,
+    /* .MaxCombinedAtomicCounters = */ 8,
+    /* .MaxAtomicCounterBindings = */ 1,
+    /* .MaxVertexAtomicCounterBuffers = */ 0,
+    /* .MaxTessControlAtomicCounterBuffers = */ 0,
+    /* .MaxTessEvaluationAtomicCounterBuffers = */ 0,
+    /* .MaxGeometryAtomicCounterBuffers = */ 0,
+    /* .MaxFragmentAtomicCounterBuffers = */ 1,
+    /* .MaxCombinedAtomicCounterBuffers = */ 1,
+    /* .MaxAtomicCounterBufferSize = */ 16384,
+    /* .MaxTransformFeedbackBuffers = */ 4,
+    /* .MaxTransformFeedbackInterleavedComponents = */ 64,
+    /* .MaxCullDistances = */ 8,
+    /* .MaxCombinedClipAndCullDistances = */ 8,
+    /* .MaxSamples = */ 4,
+    /* .maxMeshOutputVerticesNV = */ 256,
+    /* .maxMeshOutputPrimitivesNV = */ 512,
+    /* .maxMeshWorkGroupSizeX_NV = */ 32,
+    /* .maxMeshWorkGroupSizeY_NV = */ 1,
+    /* .maxMeshWorkGroupSizeZ_NV = */ 1,
+    /* .maxTaskWorkGroupSizeX_NV = */ 32,
+    /* .maxTaskWorkGroupSizeY_NV = */ 1,
+    /* .maxTaskWorkGroupSizeZ_NV = */ 1,
+    /* .maxMeshViewCountNV = */ 4,
+
+    .limits = {
+        /* .nonInductiveForLoops = */ 1,
+        /* .whileLoops = */ 1,
+        /* .doWhileLoops = */ 1,
+        /* .generalUniformIndexing = */ 1,
+        /* .generalAttributeMatrixVectorIndexing = */ 1,
+        /* .generalVaryingIndexing = */ 1,
+        /* .generalSamplerIndexing = */ 1,
+        /* .generalVariableIndexing = */ 1,
+        /* .generalConstantMatrixVectorIndexing = */ 1,
+    }
+};
+
+GLSlangResult *glslang_compile(const char *glsl, enum GLSlangStage stage)
+{
+    GLSlangResult *res = (GLSlangResult *)av_mallocz(sizeof(*res));
+    if (!res)
+        return NULL;
+
+    static const EShLanguage lang[] = {
+        [GLSLANG_VERTEX]   = EShLangVertex,
+        [GLSLANG_FRAGMENT] = EShLangFragment,
+        [GLSLANG_COMPUTE]  = EShLangCompute,
+    };
+
+    assert(glslang_refcount);
+    TShader *shader = new TShader(lang[stage]);
+    if (!shader) {
+        res->rval = AVERROR(ENOMEM);
+        return res;
+    }
+
+    shader->setEnvClient(EShClientVulkan, GLSL_VERSION);
+    shader->setEnvTarget(EShTargetSpv, SPIRV_VERSION);
+    shader->setStrings(&glsl, 1);
+    if (!shader->parse(&DefaultTBuiltInResource, GLSL_VERSION, true, EShMsgDefault)) {
+        res->error_msg = av_strdup(shader->getInfoLog());
+        res->rval = AVERROR_EXTERNAL;
+        delete shader;
+        return res;
+    }
+
+    TProgram *prog = new TProgram();
+    if (!prog) {
+        res->rval = AVERROR(ENOMEM);
+        delete shader;
+        return res;
+    }
+
+    prog->addShader(shader);
+    if (!prog->link(EShMsgDefault)) {
+        res->error_msg = av_strdup(prog->getInfoLog());
+        res->rval = AVERROR_EXTERNAL;
+        delete shader;
+        delete prog;
+        return res;
+    }
+
+    std::vector<unsigned int> spirv; /* Result */
+
+    SpvOptions options; /* Options - by default all optimizations are off */
+    options.generateDebugInfo = false; /* Makes sense for files but not here */
+    options.disassemble = false; /* Will print disassembly on compilation */
+    options.validate = false; /* Validates the generated SPIRV, unneeded */
+    options.disableOptimizer = false; /* For debugging */
+    options.optimizeSize = true; /* Its faster */
+
+    GlslangToSpv(*prog->getIntermediate(lang[stage]), spirv, NULL, &options);
+
+    res->size = spirv.size()*sizeof(unsigned int);
+    res->data = av_memdup(spirv.data(), res->size);
+    if (!res->data) {
+        res->rval = AVERROR(ENOMEM);
+        delete shader;
+        delete prog;
+        return res;
+    }
+
+    delete shader;
+    delete prog;
+
+    return res;
+}
+
+int glslang_init(void)
+{
+    int ret = 0;
+
+    pthread_mutex_lock(&glslang_mutex);
+    if (glslang_refcount++ == 0)
+        ret = !InitializeProcess();
+    pthread_mutex_unlock(&glslang_mutex);
+
+    return ret;
+}
+
+void glslang_uninit(void)
+{
+    pthread_mutex_lock(&glslang_mutex);
+    av_assert0(glslang_refcount > 0);
+    if (--glslang_refcount == 0)
+        FinalizeProcess();
+    pthread_mutex_unlock(&glslang_mutex);
+}
diff --git a/libavfilter/glslang.h b/libavfilter/glslang.h
new file mode 100644
index 0000000..d33808b
--- /dev/null
+++ b/libavfilter/glslang.h
@@ -0,0 +1,52 @@
+/*
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVFILTER_GLSLANG_H
+#define AVFILTER_GLSLANG_H
+
+#include <stdlib.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+int glslang_init(void);
+void glslang_uninit(void);
+
+typedef struct GLSlangResult {
+    int rval;
+    char *error_msg;
+
+    void *data; /* Shader data or NULL */
+    size_t size;
+} GLSlangResult;
+
+enum GLSlangStage {
+    GLSLANG_VERTEX,
+    GLSLANG_FRAGMENT,
+    GLSLANG_COMPUTE,
+};
+
+/* Compile GLSL into a SPIRV stream, if possible */
+GLSlangResult *glslang_compile(const char *glsl, enum GLSlangStage stage);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* AVFILTER_GLSLANG_H */
diff --git a/libavfilter/graphdump.c b/libavfilter/graphdump.c
index 8bc7b16..79ef1a7 100644
--- a/libavfilter/graphdump.c
+++ b/libavfilter/graphdump.c
@@ -154,7 +154,7 @@
 char *avfilter_graph_dump(AVFilterGraph *graph, const char *options)
 {
     AVBPrint buf;
-    char *dump;
+    char *dump = NULL;
 
     av_bprint_init(&buf, 0, AV_BPRINT_SIZE_COUNT_ONLY);
     avfilter_graph_dump_to_buf(&buf, graph);
diff --git a/libavfilter/internal.h b/libavfilter/internal.h
index 498bd33..abe7537 100644
--- a/libavfilter/internal.h
+++ b/libavfilter/internal.h
@@ -93,17 +93,6 @@
     int (*filter_frame)(AVFilterLink *link, AVFrame *frame);
 
     /**
-     * Frame poll callback. This returns the number of immediately available
-     * samples. It should return a positive value if the next request_frame()
-     * is guaranteed to return one frame (with no delay).
-     *
-     * Defaults to just calling the source poll_frame() method.
-     *
-     * Output pads only.
-     */
-    int (*poll_frame)(AVFilterLink *link);
-
-    /**
      * Frame request callback. A call to this should result in some progress
      * towards producing output over the given link. This should return zero
      * on success, and another value on error.
@@ -290,15 +279,6 @@
 }
 
 /**
- * Poll a frame from the filter chain.
- *
- * @param  link the input link
- * @return the number of immediately available frames, a negative
- * number in case of error
- */
-int ff_poll_frame(AVFilterLink *link);
-
-/**
  * Request an input frame from the filter at the other end of the link.
  *
  * This function must not be used by filters using the activate callback,
@@ -412,6 +392,13 @@
 int ff_filter_get_nb_threads(AVFilterContext *ctx);
 
 /**
+ * Generic processing of user supplied commands that are set
+ * in the same way as the filter options.
+ */
+int ff_filter_process_command(AVFilterContext *ctx, const char *cmd,
+                              const char *arg, char *res, int res_len, int flags);
+
+/**
  * Perform any additional setup required for hardware frames.
  *
  * link->hw_frames_ctx must be set before calling this function.
diff --git a/libavfilter/dnn_backend_tf.h b/libavfilter/maskedclamp.h
similarity index 60%
copy from libavfilter/dnn_backend_tf.h
copy to libavfilter/maskedclamp.h
index 7ba84f4..6a1fd9c 100644
--- a/libavfilter/dnn_backend_tf.h
+++ b/libavfilter/maskedclamp.h
@@ -1,5 +1,5 @@
-/*
- * Copyright (c) 2018 Sergey Lavrushkin
+ /*
+ * Copyright (c) 2019 Paul B Mahol
  *
  * This file is part of FFmpeg.
  *
@@ -18,21 +18,18 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
-/**
- * @file
- * DNN inference functions interface for TensorFlow backend.
- */
+#ifndef AVFILTER_MASKEDCLAMP_H
+#define AVFILTER_MASKEDCLAMP_H
 
+#include <stddef.h>
+#include <stdint.h>
 
-#ifndef AVFILTER_DNN_BACKEND_TF_H
-#define AVFILTER_DNN_BACKEND_TF_H
+typedef struct MaskedClampDSPContext {
+    void (*maskedclamp)(const uint8_t *bsrc, uint8_t *dst,
+                        const uint8_t *darksrc, const uint8_t *brightsrc,
+                        int w, int undershoot, int overshoot);
+} MaskedClampDSPContext;
 
-#include "dnn_interface.h"
+void ff_maskedclamp_init_x86(MaskedClampDSPContext *dsp, int depth);
 
-DNNModel *ff_dnn_load_model_tf(const char *model_filename);
-
-DNNReturnType ff_dnn_execute_model_tf(const DNNModel *model);
-
-void ff_dnn_free_model_tf(DNNModel **model);
-
-#endif
+#endif /* AVFILTER_MASKEDCLAMP_H */
diff --git a/libavfilter/median.h b/libavfilter/median.h
new file mode 100644
index 0000000..672607c
--- /dev/null
+++ b/libavfilter/median.h
@@ -0,0 +1,56 @@
+/*
+ * Copyright (c) 2019 Paul B Mahol
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ */
+
+#ifndef AVFILTER_MEDIAN_H
+#define AVFILTER_MEDIAN_H
+
+#include "avfilter.h"
+
+typedef struct MedianContext {
+    const AVClass *class;
+
+    int planes;
+    int radius;
+    int radiusV;
+    float percentile;
+
+    int planewidth[4];
+    int planeheight[4];
+    int depth;
+    int nb_planes;
+    int nb_threads;
+
+    uint16_t **coarse, **fine;
+    int coarse_size, fine_size;
+    int bins;
+    int t;
+
+    void (*hadd)(uint16_t *dst, const uint16_t *src, int bins);
+    void (*hsub)(uint16_t *dst, const uint16_t *src, int bins);
+    void (*hmuladd)(uint16_t *dst, const uint16_t *src, int f, int bins);
+
+    void (*filter_plane)(AVFilterContext *ctx, const uint8_t *ssrc, int src_linesize,
+                         uint8_t *ddst, int dst_linesize, int width, int height,
+                         int slice_h_start, int slice_h_end, int jobnr);
+} MedianContext;
+
+#endif
diff --git a/libavfilter/median_template.c b/libavfilter/median_template.c
new file mode 100644
index 0000000..bb7646e
--- /dev/null
+++ b/libavfilter/median_template.c
@@ -0,0 +1,160 @@
+/*
+ * Copyright (c) 2019 Paul B Mahol
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ */
+
+#include "libavutil/avassert.h"
+#include "avfilter.h"
+#include "formats.h"
+#include "internal.h"
+#include "video.h"
+
+#undef pixel
+#if DEPTH == 8
+#define pixel uint8_t
+#else
+#define pixel uint16_t
+#endif
+
+#undef htype
+#define htype uint16_t
+
+#undef fn
+#undef fn2
+#undef fn3
+#define SHIFT   ((DEPTH + 1) / 2)
+#define BINS    (1 << SHIFT)
+#define MASK    (BINS - 1)
+#define fn3(a,b)   a##_##b
+#define fn2(a,b)   fn3(a,b)
+#define fn(a)      fn2(a, DEPTH)
+
+#define PICK_COARSE_BIN(x, y) (BINS * (x) + ((y) >> SHIFT))
+#define PICK_FINE_BIN(x, y, z) (BINS * ((x) * ((y) >> SHIFT) + (z)) + ((y) & MASK))
+
+static void fn(filter_plane)(AVFilterContext *ctx, const uint8_t *ssrc, int src_linesize,
+                             uint8_t *ddst, int dst_linesize, int width, int height,
+                             int slice_h_start, int slice_h_end, int jobnr)
+{
+    MedianContext *s = ctx->priv;
+    htype *ccoarse = s->coarse[jobnr];
+    htype *cfine = s->fine[jobnr];
+    const int radius = s->radius;
+    const int radiusV = s->radiusV;
+    const int t = s->t;
+    const pixel *src = (const pixel *)ssrc;
+    pixel *dst = (pixel *)ddst;
+    const pixel *srcp;
+    const pixel *p;
+
+    src_linesize /= sizeof(pixel);
+    dst_linesize /= sizeof(pixel);
+
+    memset(cfine, 0, s->fine_size * sizeof(*cfine));
+    memset(ccoarse, 0, s->coarse_size * sizeof(*ccoarse));
+
+    srcp = src + FFMAX(0, slice_h_start - radiusV) * src_linesize;
+    if (jobnr == 0) {
+        for (int i = 0; i < width; i++) {
+            cfine[PICK_FINE_BIN(width, srcp[i], i)] += radiusV + 1;
+            ccoarse[PICK_COARSE_BIN(i, srcp[i])] += radiusV + 1;
+        }
+    }
+
+    srcp = src + FFMAX(0, slice_h_start - radiusV - (jobnr != 0)) * src_linesize;
+    for (int i = 0; i < radiusV + (jobnr != 0) * (1 + radiusV); i++) {
+        for (int j = 0; j < width; j++) {
+            cfine[PICK_FINE_BIN(width, srcp[j], j)]++;
+            ccoarse[PICK_COARSE_BIN(j, srcp[j])]++;
+        }
+        srcp += src_linesize;
+    }
+
+    srcp = src;
+
+    for (int i = slice_h_start; i < slice_h_end; i++) {
+        htype coarse[BINS] = { 0 };
+        htype fine[BINS][BINS] = { { 0 } };
+        htype luc[BINS] = { 0 };
+
+        p = srcp + src_linesize * FFMAX(0, i - radiusV - 1);
+        for (int j = 0; j < width; j++) {
+            cfine[PICK_FINE_BIN(width, p[j], j)]--;
+            ccoarse[PICK_COARSE_BIN(j, p[j])]--;
+        }
+
+        p = srcp + src_linesize * FFMIN(height - 1, i + radiusV);
+        for (int j = 0; j < width; j++) {
+            cfine[PICK_FINE_BIN(width, p[j], j)]++;
+            ccoarse[PICK_COARSE_BIN(j, p[j])]++;
+        }
+
+        s->hmuladd(coarse, &ccoarse[0], radius, BINS);
+        for (int j = 0; j < radius; j++)
+            s->hadd(coarse, &ccoarse[BINS * j], BINS);
+        for (int k = 0; k < BINS; k++)
+            s->hmuladd(&fine[k][0], &cfine[BINS * width * k], 2 * radius + 1, BINS);
+
+        for (int j = 0; j < width; j++) {
+            int sum = 0, k, b;
+            htype *segment;
+
+            s->hadd(coarse, &ccoarse[BINS * FFMIN(j + radius, width - 1)], BINS);
+
+            for (k = 0; k < BINS; k++) {
+                sum += coarse[k];
+                if (sum > t) {
+                    sum -= coarse[k];
+                    break;
+                }
+            }
+            av_assert0(k < BINS);
+
+            if (luc[k] <= j - radius) {
+                memset(&fine[k], 0, BINS * sizeof(htype));
+                for (luc[k] = j - radius; luc[k] < FFMIN(j + radius + 1, width); luc[k]++)
+                    s->hadd(fine[k], &cfine[BINS * (width * k + luc[k])], BINS);
+                if (luc[k] < j + radius + 1) {
+                    s->hmuladd(&fine[k][0], &cfine[BINS * (width * k + width - 1)], j + radius + 1 - width, BINS);
+                    luc[k] = j + radius + 1;
+                }
+            } else {
+                for (; luc[k] < j + radius + 1; luc[k]++) {
+                    s->hsub(fine[k], &cfine[BINS * (width * k + FFMAX(luc[k] - 2 * radius - 1, 0))], BINS);
+                    s->hadd(fine[k], &cfine[BINS * (width * k + FFMIN(luc[k], width - 1))], BINS);
+                }
+            }
+
+            s->hsub(coarse, &ccoarse[BINS * FFMAX(j - radius, 0)], BINS);
+
+            segment = fine[k];
+            for (b = 0; b < BINS; b++) {
+                sum += segment[b];
+                if (sum > t) {
+                    dst[j] = BINS * k + b;
+                    break;
+                }
+            }
+            av_assert0(b < BINS);
+        }
+
+        dst += dst_linesize;
+    }
+}
diff --git a/libavfilter/opencl.c b/libavfilter/opencl.c
index ac5eec6..9c46cfd 100644
--- a/libavfilter/opencl.c
+++ b/libavfilter/opencl.c
@@ -225,7 +225,7 @@
     const char *src_const;
     int err;
 
-    file = fopen(filename, "r");
+    file = av_fopen_utf8(filename, "r");
     if (!file) {
         av_log(avctx, AV_LOG_ERROR, "Unable to open program "
                "source file \"%s\".\n", filename);
@@ -337,3 +337,26 @@
 
     return 0;
 }
+
+void ff_opencl_print_const_matrix_3x3(AVBPrint *buf, const char *name_str,
+                                      double mat[3][3])
+{
+    int i, j;
+    av_bprintf(buf, "__constant float %s[9] = {\n", name_str);
+    for (i = 0; i < 3; i++) {
+        for (j = 0; j < 3; j++)
+            av_bprintf(buf, " %.5ff,", mat[i][j]);
+        av_bprintf(buf, "\n");
+    }
+    av_bprintf(buf, "};\n");
+}
+
+cl_ulong ff_opencl_get_event_time(cl_event event) {
+    cl_ulong time_start;
+    cl_ulong time_end;
+
+    clGetEventProfilingInfo(event, CL_PROFILING_COMMAND_START, sizeof(time_start), &time_start, NULL);
+    clGetEventProfilingInfo(event, CL_PROFILING_COMMAND_END, sizeof(time_end), &time_end, NULL);
+
+    return time_end - time_start;
+}
diff --git a/libavfilter/opencl.h b/libavfilter/opencl.h
index 1b7f117..7487e60 100644
--- a/libavfilter/opencl.h
+++ b/libavfilter/opencl.h
@@ -25,6 +25,7 @@
 // it was introduced in OpenCL 2.0.
 #define CL_USE_DEPRECATED_OPENCL_1_2_APIS
 
+#include "libavutil/bprint.h"
 #include "libavutil/buffer.h"
 #include "libavutil/hwcontext.h"
 #include "libavutil/hwcontext_opencl.h"
@@ -46,6 +47,11 @@
     int                output_height;
 } OpenCLFilterContext;
 
+// Groups together information about a kernel argument
+typedef struct OpenCLKernelArg {
+    size_t arg_size;
+    const void *arg_val;
+} OpenCLKernelArg;
 
 /**
  * set argument to specific Kernel.
@@ -74,6 +80,163 @@
     } while(0)
 
 /**
+ * Create a kernel with the given name.
+ *
+ * The kernel variable in the context structure must have a name of the form
+ * kernel_<kernel_name>.
+ *
+ * The OpenCLFilterContext variable in the context structure must be named ocf.
+ *
+ * Requires the presence of a local cl_int variable named cle and a fail label for error
+ * handling.
+ */
+#define CL_CREATE_KERNEL(ctx, kernel_name) do {                                                 \
+    ctx->kernel_ ## kernel_name = clCreateKernel(ctx->ocf.program, #kernel_name, &cle);         \
+    CL_FAIL_ON_ERROR(AVERROR(EIO), "Failed to create %s kernel: %d.\n", #kernel_name, cle);     \
+} while(0)
+
+/**
+ * release an OpenCL Kernel
+ */
+#define CL_RELEASE_KERNEL(k)                                  \
+do {                                                          \
+    if (k) {                                                  \
+        cle = clReleaseKernel(k);                             \
+        if (cle != CL_SUCCESS)                                \
+            av_log(avctx, AV_LOG_ERROR, "Failed to release "  \
+                   "OpenCL kernel: %d.\n", cle);              \
+    }                                                         \
+} while(0)
+
+/**
+ * release an OpenCL Memory Object
+ */
+#define CL_RELEASE_MEMORY(m)                                  \
+do {                                                          \
+    if (m) {                                                  \
+        cle = clReleaseMemObject(m);                          \
+        if (cle != CL_SUCCESS)                                \
+            av_log(avctx, AV_LOG_ERROR, "Failed to release "  \
+                   "OpenCL memory: %d.\n", cle);              \
+    }                                                         \
+} while(0)
+
+/**
+ * release an OpenCL Command Queue
+ */
+#define CL_RELEASE_QUEUE(q)                                   \
+do {                                                          \
+    if (q) {                                                  \
+        cle = clReleaseCommandQueue(q);                       \
+        if (cle != CL_SUCCESS)                                \
+            av_log(avctx, AV_LOG_ERROR, "Failed to release "  \
+                   "OpenCL command queue: %d.\n", cle);       \
+    }                                                         \
+} while(0)
+
+/**
+ * Enqueue a kernel with the given information.
+ *
+ * Kernel arguments are provided as KernelArg structures and are set in the order
+ * that they are passed.
+ *
+ * Requires the presence of a local cl_int variable named cle and a fail label for error
+ * handling.
+ */
+#define CL_ENQUEUE_KERNEL_WITH_ARGS(queue, kernel, global_work_size, local_work_size, event, ...)   \
+do {                                                                                                \
+    OpenCLKernelArg args[] = {__VA_ARGS__};                                                         \
+    for (int i = 0; i < FF_ARRAY_ELEMS(args); i++) {                                                \
+        cle = clSetKernelArg(kernel, i, args[i].arg_size, args[i].arg_val);                         \
+        if (cle != CL_SUCCESS) {                                                                    \
+            av_log(avctx, AV_LOG_ERROR, "Failed to set kernel "                                     \
+                "argument %d: error %d.\n", i, cle);                                                \
+            err = AVERROR(EIO);                                                                     \
+            goto fail;                                                                              \
+        }                                                                                           \
+    }                                                                                               \
+                                                                                                    \
+    cle = clEnqueueNDRangeKernel(                                                                   \
+        queue,                                                                                      \
+        kernel,                                                                                     \
+        FF_ARRAY_ELEMS(global_work_size),                                                           \
+        NULL,                                                                                       \
+        global_work_size,                                                                           \
+        local_work_size,                                                                            \
+        0,                                                                                          \
+        NULL,                                                                                       \
+        event                                                                                       \
+    );                                                                                              \
+    CL_FAIL_ON_ERROR(AVERROR(EIO), "Failed to enqueue kernel: %d.\n", cle);                         \
+} while (0)
+
+/**
+ * Uses the above macro to enqueue the given kernel and then additionally runs it to
+ * completion via clFinish.
+ *
+ * Requires the presence of a local cl_int variable named cle and a fail label for error
+ * handling.
+ */
+#define CL_RUN_KERNEL_WITH_ARGS(queue, kernel, global_work_size, local_work_size, event, ...) do {  \
+    CL_ENQUEUE_KERNEL_WITH_ARGS(                                                                    \
+        queue, kernel, global_work_size, local_work_size, event, __VA_ARGS__                        \
+    );                                                                                              \
+                                                                                                    \
+    cle = clFinish(queue);                                                                          \
+    CL_FAIL_ON_ERROR(AVERROR(EIO), "Failed to finish command queue: %d.\n", cle);                   \
+} while (0)
+
+/**
+ * Create a buffer with the given information.
+ *
+ * The buffer variable in the context structure must be named <buffer_name>.
+ *
+ * Requires the presence of a local cl_int variable named cle and a fail label for error
+ * handling.
+ */
+#define CL_CREATE_BUFFER_FLAGS(ctx, buffer_name, flags, size, host_ptr) do {                    \
+    ctx->buffer_name = clCreateBuffer(                                                          \
+        ctx->ocf.hwctx->context,                                                                \
+        flags,                                                                                  \
+        size,                                                                                   \
+        host_ptr,                                                                               \
+        &cle                                                                                    \
+    );                                                                                          \
+    CL_FAIL_ON_ERROR(AVERROR(EIO), "Failed to create buffer %s: %d.\n", #buffer_name, cle);     \
+} while(0)
+
+/**
+ * Perform a blocking write to a buffer.
+ *
+ * Requires the presence of a local cl_int variable named cle and a fail label for error
+ * handling.
+ */
+#define CL_BLOCKING_WRITE_BUFFER(queue, buffer, size, host_ptr, event) do {                     \
+    cle = clEnqueueWriteBuffer(                                                                 \
+        queue,                                                                                  \
+        buffer,                                                                                 \
+        CL_TRUE,                                                                                \
+        0,                                                                                      \
+        size,                                                                                   \
+        host_ptr,                                                                               \
+        0,                                                                                      \
+        NULL,                                                                                   \
+        event                                                                                   \
+    );                                                                                          \
+    CL_FAIL_ON_ERROR(AVERROR(EIO), "Failed to write buffer to device: %d.\n", cle);             \
+} while(0)
+
+/**
+ * Create a buffer with the given information.
+ *
+ * The buffer variable in the context structure must be named <buffer_name>.
+ *
+ * Requires the presence of a local cl_int variable named cle and a fail label for error
+ * handling.
+ */
+#define CL_CREATE_BUFFER(ctx, buffer_name, size) CL_CREATE_BUFFER_FLAGS(ctx, buffer_name, 0, size, NULL)
+
+/**
  * Return that all inputs and outputs support only AV_PIX_FMT_OPENCL.
  */
 int ff_opencl_filter_query_formats(AVFilterContext *avctx);
@@ -124,5 +287,18 @@
                                           size_t *work_size,
                                           AVFrame *frame, int plane,
                                           int block_alignment);
+/**
+ * Print a 3x3 matrix into a buffer as __constant array, which could
+ * be included in an OpenCL program.
+*/
+
+void ff_opencl_print_const_matrix_3x3(AVBPrint *buf, const char *name_str,
+                                      double mat[3][3]);
+
+/**
+ * Gets the command start and end times for the given event and returns the
+ * difference (the time that the event took).
+ */
+cl_ulong ff_opencl_get_event_time(cl_event event);
 
 #endif /* AVFILTER_OPENCL_H */
diff --git a/libavfilter/opencl/colorkey.cl b/libavfilter/opencl/colorkey.cl
new file mode 100644
index 0000000..6d71f17
--- /dev/null
+++ b/libavfilter/opencl/colorkey.cl
@@ -0,0 +1,49 @@
+/*
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+const sampler_t sampler = CLK_NORMALIZED_COORDS_FALSE |
+                          CLK_FILTER_NEAREST;
+
+__kernel void colorkey_blend(
+    __read_only  image2d_t src,
+    __write_only image2d_t dst,
+    float4 colorkey_rgba,
+    float similarity,
+    float blend
+) {
+    int2 loc = (int2)(get_global_id(0), get_global_id(1));
+    float4 pixel = read_imagef(src, sampler, loc);
+    float diff = distance(pixel.xyz, colorkey_rgba.xyz);
+
+    pixel.s3 = clamp((diff - similarity) / blend, 0.0f, 1.0f);
+    write_imagef(dst, loc, pixel);
+}
+
+__kernel void colorkey(
+    __read_only  image2d_t src,
+    __write_only image2d_t dst,
+    float4 colorkey_rgba,
+    float similarity
+) {
+    int2 loc = (int2)(get_global_id(0), get_global_id(1));
+    float4 pixel = read_imagef(src, sampler, loc);
+    float diff = distance(pixel.xyz, colorkey_rgba.xyz);
+
+    pixel.s3 = (diff > similarity) ? 1.0f : 0.0f;
+    write_imagef(dst, loc, pixel);
+}
diff --git a/libavfilter/opencl/colorspace_common.cl b/libavfilter/opencl/colorspace_common.cl
index 94a4dd0..ac911f0 100644
--- a/libavfilter/opencl/colorspace_common.cl
+++ b/libavfilter/opencl/colorspace_common.cl
@@ -39,31 +39,6 @@
 constant const float ST2084_C2 = 18.8515625f;
 constant const float ST2084_C3 = 18.6875f;
 
-__constant float yuv2rgb_bt2020[] = {
-    1.0f, 0.0f, 1.4746f,
-    1.0f, -0.16455f, -0.57135f,
-    1.0f, 1.8814f, 0.0f
-};
-
-__constant float yuv2rgb_bt709[] = {
-    1.0f, 0.0f, 1.5748f,
-    1.0f, -0.18732f, -0.46812f,
-    1.0f, 1.8556f, 0.0f
-};
-
-__constant float rgb2yuv_bt709[] = {
-    0.2126f, 0.7152f, 0.0722f,
-    -0.11457f, -0.38543f, 0.5f,
-    0.5f, -0.45415f, -0.04585f
-};
-
-__constant float rgb2yuv_bt2020[] ={
-    0.2627f, 0.678f, 0.0593f,
-    -0.1396f, -0.36037f, 0.5f,
-    0.5f, -0.4598f, -0.0402f,
-};
-
-
 float get_luma_dst(float3 c) {
     return luma_dst.x * c.x + luma_dst.y * c.y + luma_dst.z * c.z;
 }
@@ -149,10 +124,14 @@
 
 float3 yuv2lrgb(float3 yuv) {
     float3 rgb = yuv2rgb(yuv.x, yuv.y, yuv.z);
+#ifdef linearize
     float r = linearize(rgb.x);
     float g = linearize(rgb.y);
     float b = linearize(rgb.z);
     return (float3)(r, g, b);
+#else
+    return rgb;
+#endif
 }
 
 float3 rgb2yuv(float r, float g, float b) {
@@ -176,19 +155,25 @@
 }
 
 float3 lrgb2yuv(float3 c) {
+#ifdef delinearize
     float r = delinearize(c.x);
     float g = delinearize(c.y);
     float b = delinearize(c.z);
-
     return rgb2yuv(r, g, b);
+#else
+    return rgb2yuv(c.x, c.y, c.z);
+#endif
 }
 
 float lrgb2y(float3 c) {
+#ifdef delinearize
     float r = delinearize(c.x);
     float g = delinearize(c.y);
     float b = delinearize(c.z);
-
     return rgb2y(r, g, b);
+#else
+    return rgb2y(c.x, c.y, c.z);
+#endif
 }
 
 float3 lrgb2lrgb(float3 c) {
diff --git a/libavfilter/opencl/deshake.cl b/libavfilter/opencl/deshake.cl
new file mode 100644
index 0000000..fef2681
--- /dev/null
+++ b/libavfilter/opencl/deshake.cl
@@ -0,0 +1,647 @@
+/*
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Copyright (C) 2000, Intel Corporation, all rights reserved.
+ * Copyright (C) 2013, OpenCV Foundation, all rights reserved.
+ * Third party copyrights are property of their respective owners.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ *   * Redistribution's of source code must retain the above copyright notice,
+ *     this list of conditions and the following disclaimer.
+ *
+ *   * Redistribution's in binary form must reproduce the above copyright notice,
+ *     this list of conditions and the following disclaimer in the documentation
+ *     and/or other materials provided with the distribution.
+ *
+ *   * The name of the copyright holders may not be used to endorse or promote products
+ *     derived from this software without specific prior written permission.
+ *
+ * This software is provided by the copyright holders and contributors "as is" and
+ * any express or implied warranties, including, but not limited to, the implied
+ * warranties of merchantability and fitness for a particular purpose are disclaimed.
+ * In no event shall the Intel Corporation or contributors be liable for any direct,
+ * indirect, incidental, special, exemplary, or consequential damages
+ * (including, but not limited to, procurement of substitute goods or services;
+ * loss of use, data, or profits; or business interruption) however caused
+ * and on any theory of liability, whether in contract, strict liability,
+ * or tort (including negligence or otherwise) arising in any way out of
+ * the use of this software, even if advised of the possibility of such damage.
+ */
+
+#define HARRIS_THRESHOLD 3.0f
+// Block size over which to compute harris response
+//
+// Note that changing this will require fiddling with the local array sizes in
+// harris_response
+#define HARRIS_RADIUS 2
+#define DISTANCE_THRESHOLD 80
+
+// Sub-pixel refinement window for feature points
+#define REFINE_WIN_HALF_W 5
+#define REFINE_WIN_HALF_H 5
+#define REFINE_WIN_W 11 // REFINE_WIN_HALF_W * 2 + 1
+#define REFINE_WIN_H 11
+
+// Non-maximum suppression window size
+#define NONMAX_WIN 30
+#define NONMAX_WIN_HALF 15 // NONMAX_WIN / 2
+
+typedef struct PointPair {
+    // Previous frame
+    float2 p1;
+    // Current frame
+    float2 p2;
+} PointPair;
+
+typedef struct SmoothedPointPair {
+    // Non-smoothed point in current frame
+    int2 p1;
+    // Smoothed point in current frame
+    float2 p2;
+} SmoothedPointPair;
+
+typedef struct MotionVector {
+    PointPair p;
+    // Used to mark vectors as potential outliers
+    int should_consider;
+} MotionVector;
+
+const sampler_t sampler = CLK_NORMALIZED_COORDS_FALSE |
+                          CLK_ADDRESS_CLAMP_TO_EDGE |
+                          CLK_FILTER_NEAREST;
+
+const sampler_t sampler_linear = CLK_NORMALIZED_COORDS_FALSE |
+                          CLK_ADDRESS_CLAMP_TO_EDGE |
+                          CLK_FILTER_LINEAR;
+
+const sampler_t sampler_linear_mirror = CLK_NORMALIZED_COORDS_TRUE |
+                          CLK_ADDRESS_MIRRORED_REPEAT |
+                          CLK_FILTER_LINEAR;
+
+// Writes to a 1D array at loc, treating it as a 2D array with the same
+// dimensions as the global work size.
+static void write_to_1d_arrf(__global float *buf, int2 loc, float val) {
+    buf[loc.x + loc.y * get_global_size(0)] = val;
+}
+
+static void write_to_1d_arrul8(__global ulong8 *buf, int2 loc, ulong8 val) {
+    buf[loc.x + loc.y * get_global_size(0)] = val;
+}
+
+static void write_to_1d_arrvec(__global MotionVector *buf, int2 loc, MotionVector val) {
+    buf[loc.x + loc.y * get_global_size(0)] = val;
+}
+
+static void write_to_1d_arrf2(__global float2 *buf, int2 loc, float2 val) {
+    buf[loc.x + loc.y * get_global_size(0)] = val;
+}
+
+static ulong8 read_from_1d_arrul8(__global const ulong8 *buf, int2 loc) {
+    return buf[loc.x + loc.y * get_global_size(0)];
+}
+
+static float2 read_from_1d_arrf2(__global const float2 *buf, int2 loc) {
+    return buf[loc.x + loc.y * get_global_size(0)];
+}
+
+// Returns the grayscale value at the given point.
+static float pixel_grayscale(__read_only image2d_t src, int2 loc) {
+    float4 pixel = read_imagef(src, sampler, loc);
+    return (pixel.x + pixel.y + pixel.z) / 3.0f;
+}
+
+static float convolve(
+    __local const float *grayscale,
+    int local_idx_x,
+    int local_idx_y,
+    float mask[3][3]
+) {
+    float ret = 0;
+
+    // These loops touch each pixel surrounding loc as well as loc itself
+    for (int i = 1, i2 = 0; i >= -1; --i, ++i2) {
+        for (int j = -1, j2 = 0; j <= 1; ++j, ++j2) {
+            ret += mask[i2][j2] * grayscale[(local_idx_x + 3 + j) + (local_idx_y + 3 + i) * 14];
+        }
+    }
+
+    return ret;
+}
+
+// Sums dx * dy for all pixels within radius of loc
+static float sum_deriv_prod(
+    __local const float *grayscale,
+    float mask_x[3][3],
+    float mask_y[3][3]
+) {
+    float ret = 0;
+
+    for (int i = HARRIS_RADIUS; i >= -HARRIS_RADIUS; --i) {
+        for (int j = -HARRIS_RADIUS; j <= HARRIS_RADIUS; ++j) {
+            ret += convolve(grayscale, get_local_id(0) + j, get_local_id(1) + i, mask_x) *
+                   convolve(grayscale, get_local_id(0) + j, get_local_id(1) + i, mask_y);
+        }
+    }
+
+    return ret;
+}
+
+// Sums d<>^2 (determined by mask) for all pixels within radius of loc
+static float sum_deriv_pow(__local const float *grayscale, float mask[3][3])
+{
+    float ret = 0;
+
+    for (int i = HARRIS_RADIUS; i >= -HARRIS_RADIUS; --i) {
+        for (int j = -HARRIS_RADIUS; j <= HARRIS_RADIUS; ++j) {
+            float deriv = convolve(grayscale, get_local_id(0) + j, get_local_id(1) + i, mask);
+            ret += deriv * deriv;
+        }
+    }
+
+    return ret;
+}
+
+// Fills a box with the given radius and pixel around loc
+static void draw_box(__write_only image2d_t dst, int2 loc, float4 pixel, int radius)
+{
+    for (int i = -radius; i <= radius; ++i) {
+        for (int j = -radius; j <= radius; ++j) {
+            write_imagef(
+                dst,
+                (int2)(
+                    // Clamp to avoid writing outside image bounds
+                    clamp(loc.x + i, 0, get_image_dim(dst).x - 1),
+                    clamp(loc.y + j, 0, get_image_dim(dst).y - 1)
+                ),
+                pixel
+            );
+        }
+    }
+}
+
+// Converts the src image to grayscale
+__kernel void grayscale(
+    __read_only image2d_t src,
+    __write_only image2d_t grayscale
+) {
+    int2 loc = (int2)(get_global_id(0), get_global_id(1));
+    write_imagef(grayscale, loc, (float4)(pixel_grayscale(src, loc), 0.0f, 0.0f, 1.0f));
+}
+
+// This kernel computes the harris response for the given grayscale src image
+// within the given radius and writes it to harris_buf
+__kernel void harris_response(
+    __read_only image2d_t grayscale,
+    __global float *harris_buf
+) {
+    int2 loc = (int2)(get_global_id(0), get_global_id(1));
+
+    if (loc.x > get_image_width(grayscale) - 1 || loc.y > get_image_height(grayscale) - 1) {
+        write_to_1d_arrf(harris_buf, loc, 0);
+        return;
+    }
+
+    float scale = 1.0f / ((1 << 2) * HARRIS_RADIUS * 255.0f);
+
+    float sobel_mask_x[3][3] = {
+        {-1, 0, 1},
+        {-2, 0, 2},
+        {-1, 0, 1}
+    };
+
+    float sobel_mask_y[3][3] = {
+        { 1,  2,  1},
+        { 0,  0,  0},
+        {-1, -2, -1}
+    };
+
+    // 8 x 8 local work + 3 pixels around each side (needed to accomodate for the
+    // block size radius of 2)
+    __local float grayscale_data[196];
+
+    int idx = get_group_id(0) * get_local_size(0);
+    int idy = get_group_id(1) * get_local_size(1);
+
+    for (int i = idy - 3, it = 0; i < idy + (int)get_local_size(1) + 3; i++, it++) {
+        for (int j = idx - 3, jt = 0; j < idx + (int)get_local_size(0) + 3; j++, jt++) {
+            grayscale_data[jt + it * 14] = read_imagef(grayscale, sampler, (int2)(j, i)).x;
+        }
+    }
+
+    barrier(CLK_LOCAL_MEM_FENCE);
+
+    float sumdxdy = sum_deriv_prod(grayscale_data, sobel_mask_x, sobel_mask_y);
+    float sumdx2 = sum_deriv_pow(grayscale_data, sobel_mask_x);
+    float sumdy2 = sum_deriv_pow(grayscale_data, sobel_mask_y);
+
+    float trace = sumdx2 + sumdy2;
+    // r = det(M) - k(trace(M))^2
+    // k usually between 0.04 to 0.06
+    float r = (sumdx2 * sumdy2 - sumdxdy * sumdxdy) - 0.04f * (trace * trace) * pown(scale, 4);
+
+    // Threshold the r value
+    harris_buf[loc.x + loc.y * get_image_width(grayscale)] = r * step(HARRIS_THRESHOLD, r);
+}
+
+// Gets a patch centered around a float coordinate from a grayscale image using
+// bilinear interpolation
+static void get_rect_sub_pix(
+    __read_only image2d_t grayscale,
+    float *buffer,
+    int size_x,
+    int size_y,
+    float2 center
+) {
+    float2 offset = ((float2)(size_x, size_y) - 1.0f) * 0.5f;
+
+    for (int i = 0; i < size_y; i++) {
+        for (int j = 0; j < size_x; j++) {
+            buffer[i * size_x + j] = read_imagef(
+                grayscale,
+                sampler_linear,
+                (float2)(j, i) + center - offset
+            ).x * 255.0f;
+        }
+    }
+}
+
+// Refines detected features at a sub-pixel level
+//
+// This function is ported from OpenCV
+static float2 corner_sub_pix(
+    __read_only image2d_t grayscale,
+    float2 feature,
+    float *mask
+) {
+    float2 init = feature;
+    int src_width = get_global_size(0);
+    int src_height = get_global_size(1);
+
+    const int max_iters = 40;
+    const float eps = 0.001f * 0.001f;
+    int i, j, k;
+
+    int iter = 0;
+    float err = 0;
+    float subpix[(REFINE_WIN_W + 2) * (REFINE_WIN_H + 2)];
+    const float flt_epsilon = 0x1.0p-23f;
+
+    do {
+        float2 feature_tmp;
+        float a = 0, b = 0, c = 0, bb1 = 0, bb2 = 0;
+
+        get_rect_sub_pix(grayscale, subpix, REFINE_WIN_W + 2, REFINE_WIN_H + 2, feature);
+        float *subpix_ptr = subpix;
+        subpix_ptr += REFINE_WIN_W + 2 + 1;
+
+        // process gradient
+        for (i = 0, k = 0; i < REFINE_WIN_H; i++, subpix_ptr += REFINE_WIN_W + 2) {
+            float py = i - REFINE_WIN_HALF_H;
+
+            for (j = 0; j < REFINE_WIN_W; j++, k++) {
+                float m = mask[k];
+                float tgx = subpix_ptr[j + 1] - subpix_ptr[j - 1];
+                float tgy = subpix_ptr[j + REFINE_WIN_W + 2] - subpix_ptr[j - REFINE_WIN_W - 2];
+                float gxx = tgx * tgx * m;
+                float gxy = tgx * tgy * m;
+                float gyy = tgy * tgy * m;
+                float px = j - REFINE_WIN_HALF_W;
+
+                a += gxx;
+                b += gxy;
+                c += gyy;
+
+                bb1 += gxx * px + gxy * py;
+                bb2 += gxy * px + gyy * py;
+            }
+        }
+
+        float det = a * c - b * b;
+        if (fabs(det) <= flt_epsilon * flt_epsilon) {
+            break;
+        }
+
+        // 2x2 matrix inversion
+        float scale = 1.0f / det;
+        feature_tmp.x = (float)(feature.x + (c * scale * bb1) - (b * scale * bb2));
+        feature_tmp.y = (float)(feature.y - (b * scale * bb1) + (a * scale * bb2));
+        err = dot(feature_tmp - feature, feature_tmp - feature);
+
+        feature = feature_tmp;
+        if (feature.x < 0 || feature.x >= src_width || feature.y < 0 || feature.y >= src_height) {
+            break;
+        }
+    } while (++iter < max_iters && err > eps);
+
+    // Make sure new point isn't too far from the initial point (indicates poor convergence)
+    if (fabs(feature.x - init.x) > REFINE_WIN_HALF_W || fabs(feature.y - init.y) > REFINE_WIN_HALF_H) {
+        feature = init;
+    }
+
+    return feature;
+}
+
+// Performs non-maximum suppression on the harris response and writes the resulting
+// feature locations to refined_features.
+//
+// Assumes that refined_features and the global work sizes are set up such that the image
+// is split up into a grid of 32x32 blocks where each block has a single slot in the
+// refined_features buffer. This kernel finds the best corner in each block (if the
+// block has any) and writes it to the corresponding slot in the buffer.
+//
+// If subpixel_refine is true, the features are additionally refined at a sub-pixel
+// level for increased precision.
+__kernel void refine_features(
+    __read_only image2d_t grayscale,
+    __global const float *harris_buf,
+    __global float2 *refined_features,
+    int subpixel_refine
+) {
+    int2 loc = (int2)(get_global_id(0), get_global_id(1));
+    // The location in the grayscale buffer rather than the compacted grid
+    int2 loc_i = (int2)(loc.x * 32, loc.y * 32);
+
+    float new_val;
+    float max_val = 0;
+    float2 loc_max = (float2)(-1, -1);
+
+    int end_x = min(loc_i.x + 32, (int)get_image_dim(grayscale).x - 1);
+    int end_y = min(loc_i.y + 32, (int)get_image_dim(grayscale).y - 1);
+
+    for (int i = loc_i.x; i < end_x; ++i) {
+        for (int j = loc_i.y; j < end_y; ++j) {
+            new_val = harris_buf[i + j * get_image_dim(grayscale).x];
+
+            if (new_val > max_val) {
+                max_val = new_val;
+                loc_max = (float2)(i, j);
+            }
+        }
+    }
+
+    if (max_val == 0) {
+        // There are no features in this part of the frame
+        write_to_1d_arrf2(refined_features, loc, loc_max);
+        return;
+    }
+
+    if (subpixel_refine) {
+        float mask[REFINE_WIN_H * REFINE_WIN_W];
+        for (int i = 0; i < REFINE_WIN_H; i++) {
+            float y = (float)(i - REFINE_WIN_HALF_H) / REFINE_WIN_HALF_H;
+            float vy = exp(-y * y);
+
+            for (int j = 0; j < REFINE_WIN_W; j++) {
+                float x = (float)(j - REFINE_WIN_HALF_W) / REFINE_WIN_HALF_W;
+                mask[i * REFINE_WIN_W + j] = (float)(vy * exp(-x * x));
+            }
+        }
+
+        loc_max = corner_sub_pix(grayscale, loc_max, mask);
+    }
+
+    write_to_1d_arrf2(refined_features, loc, loc_max);
+}
+
+// Extracts BRIEF descriptors from the grayscale src image for the given features
+// using the provided sampler.
+__kernel void brief_descriptors(
+    __read_only image2d_t grayscale,
+    __global const float2 *refined_features,
+    // for 512 bit descriptors
+    __global ulong8 *desc_buf,
+    __global const PointPair *brief_pattern
+) {
+    int2 loc = (int2)(get_global_id(0), get_global_id(1));
+    float2 feature = read_from_1d_arrf2(refined_features, loc);
+
+    // There was no feature in this part of the frame
+    if (feature.x == -1) {
+        write_to_1d_arrul8(desc_buf, loc, (ulong8)(0));
+        return;
+    }
+
+    ulong8 desc = 0;
+    ulong *p = &desc;
+
+    for (int i = 0; i < 8; ++i) {
+        for (int j = 0; j < 64; ++j) {
+            PointPair pair = brief_pattern[j * (i + 1)];
+            float l1 = read_imagef(grayscale, sampler_linear, feature + pair.p1).x;
+            float l2 = read_imagef(grayscale, sampler_linear, feature + pair.p2).x;
+
+            if (l1 < l2) {
+                p[i] |= 1UL << j;
+            }
+        }
+    }
+
+    write_to_1d_arrul8(desc_buf, loc, desc);
+}
+
+// Given buffers with descriptors for the current and previous frame, determines
+// which ones match, writing correspondences to matches_buf.
+//
+// Feature and descriptor buffers are assumed to be compacted (each element sourced
+// from a 32x32 block in the frame being processed).
+__kernel void match_descriptors(
+    __global const float2 *prev_refined_features,
+    __global const float2 *refined_features,
+    __global const ulong8 *desc_buf,
+    __global const ulong8 *prev_desc_buf,
+    __global MotionVector *matches_buf
+) {
+    int2 loc = (int2)(get_global_id(0), get_global_id(1));
+    ulong8 desc = read_from_1d_arrul8(desc_buf, loc);
+    const int search_radius = 3;
+
+    MotionVector invalid_vector = (MotionVector) {
+        (PointPair) {
+            (float2)(-1, -1),
+            (float2)(-1, -1)
+        },
+        0
+    };
+
+    if (desc.s0 == 0 && desc.s1 == 0) {
+        // There was no feature in this part of the frame
+        write_to_1d_arrvec(
+            matches_buf,
+            loc,
+            invalid_vector
+        );
+        return;
+    }
+
+    int2 start = max(loc - search_radius, 0);
+    int2 end = min(loc + search_radius, (int2)(get_global_size(0) - 1, get_global_size(1) - 1));
+
+    for (int i = start.x; i < end.x; ++i) {
+        for (int j = start.y; j < end.y; ++j) {
+            int2 prev_point = (int2)(i, j);
+            int total_dist = 0;
+
+            ulong8 prev_desc = read_from_1d_arrul8(prev_desc_buf, prev_point);
+
+            if (prev_desc.s0 == 0 && prev_desc.s1 == 0) {
+                continue;
+            }
+
+            ulong *prev_desc_p = &prev_desc;
+            ulong *desc_p = &desc;
+
+            for (int i = 0; i < 8; i++) {
+                total_dist += popcount(desc_p[i] ^ prev_desc_p[i]);
+            }
+
+            if (total_dist < DISTANCE_THRESHOLD) {
+                write_to_1d_arrvec(
+                    matches_buf,
+                    loc,
+                    (MotionVector) {
+                        (PointPair) {
+                            read_from_1d_arrf2(prev_refined_features, prev_point),
+                            read_from_1d_arrf2(refined_features, loc)
+                        },
+                        1
+                    }
+                );
+
+                return;
+            }
+        }
+    }
+
+    // There is no found match for this point
+    write_to_1d_arrvec(
+        matches_buf,
+        loc,
+        invalid_vector
+    );
+}
+
+// Returns the position of the given point after the transform is applied
+static float2 transformed_point(float2 p, __global const float *transform) {
+    float2 ret;
+
+    ret.x = p.x * transform[0] + p.y * transform[1] + transform[2];
+    ret.y = p.x * transform[3] + p.y * transform[4] + transform[5];
+
+    return ret;
+}
+
+
+// Performs the given transform on the src image
+__kernel void transform(
+    __read_only image2d_t src,
+    __write_only image2d_t dst,
+    __global const float *transform
+) {
+    int2 loc = (int2)(get_global_id(0), get_global_id(1));
+    float2 norm = convert_float2(get_image_dim(src));
+
+    write_imagef(
+        dst,
+        loc,
+        read_imagef(
+            src,
+            sampler_linear_mirror,
+            transformed_point((float2)(loc.x, loc.y), transform) / norm
+        )
+    );
+}
+
+// Returns the new location of the given point using the given crop bounding box
+// and the width and height of the original frame.
+static float2 cropped_point(
+    float2 p,
+    float2 top_left,
+    float2 bottom_right,
+    int2 orig_dim
+) {
+    float2 ret;
+
+    float crop_width  = bottom_right.x - top_left.x;
+    float crop_height = bottom_right.y - top_left.y;
+
+    float width_norm = p.x / (float)orig_dim.x;
+    float height_norm = p.y / (float)orig_dim.y;
+
+    ret.x = (width_norm * crop_width) + top_left.x;
+    ret.y = (height_norm * crop_height) + ((float)orig_dim.y - bottom_right.y);
+
+    return ret;
+}
+
+// Upscales the given cropped region to the size of the original frame
+__kernel void crop_upscale(
+    __read_only image2d_t src,
+    __write_only image2d_t dst,
+    float2 top_left,
+    float2 bottom_right
+) {
+    int2 loc = (int2)(get_global_id(0), get_global_id(1));
+
+    write_imagef(
+        dst,
+        loc,
+        read_imagef(
+            src,
+            sampler_linear,
+            cropped_point((float2)(loc.x, loc.y), top_left, bottom_right, get_image_dim(dst))
+        )
+    );
+}
+
+// Draws boxes to represent the given point matches and uses the given transform
+// and crop info to make sure their positions are accurate on the transformed frame.
+//
+// model_matches is an array of three points that were used by the RANSAC process
+// to generate the given transform
+__kernel void draw_debug_info(
+    __write_only image2d_t dst,
+    __global const MotionVector *matches,
+    __global const MotionVector *model_matches,
+    int num_model_matches,
+    __global const float *transform
+) {
+    int loc = get_global_id(0);
+    MotionVector vec = matches[loc];
+    // Black box: matched point that RANSAC considered an outlier
+    float4 big_rect_color = (float4)(0.1f, 0.1f, 0.1f, 1.0f);
+
+    if (vec.should_consider) {
+        // Green box: matched point that RANSAC considered an inlier
+        big_rect_color = (float4)(0.0f, 1.0f, 0.0f, 1.0f);
+    }
+
+    for (int i = 0; i < num_model_matches; i++) {
+        if (vec.p.p2.x == model_matches[i].p.p2.x && vec.p.p2.y == model_matches[i].p.p2.y) {
+            // Orange box: point used to calculate model
+            big_rect_color = (float4)(1.0f, 0.5f, 0.0f, 1.0f);
+        }
+    }
+
+    float2 transformed_p1 = transformed_point(vec.p.p1, transform);
+    float2 transformed_p2 = transformed_point(vec.p.p2, transform);
+
+    draw_box(dst, (int2)(transformed_p2.x, transformed_p2.y), big_rect_color, 5);
+    // Small light blue box: the point in the previous frame
+    draw_box(dst, (int2)(transformed_p1.x, transformed_p1.y), (float4)(0.0f, 0.3f, 0.7f, 1.0f), 3);
+}
diff --git a/libavfilter/opencl/nlmeans.cl b/libavfilter/opencl/nlmeans.cl
new file mode 100644
index 0000000..72bd681
--- /dev/null
+++ b/libavfilter/opencl/nlmeans.cl
@@ -0,0 +1,115 @@
+/*
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+const sampler_t sampler = (CLK_NORMALIZED_COORDS_FALSE |
+                           CLK_ADDRESS_CLAMP_TO_EDGE   |
+                           CLK_FILTER_NEAREST);
+
+kernel void horiz_sum(__global uint4 *integral_img,
+                      __read_only image2d_t src,
+                      int width,
+                      int height,
+                      int4 dx,
+                      int4 dy)
+{
+
+    int y = get_global_id(0);
+    int work_size = get_global_size(0);
+
+    uint4 sum = (uint4)(0);
+    float4 s2;
+    for (int i = 0; i < width; i++) {
+        float s1 = read_imagef(src, sampler, (int2)(i, y)).x;
+        s2.x = read_imagef(src, sampler, (int2)(i + dx.x, y + dy.x)).x;
+        s2.y = read_imagef(src, sampler, (int2)(i + dx.y, y + dy.y)).x;
+        s2.z = read_imagef(src, sampler, (int2)(i + dx.z, y + dy.z)).x;
+        s2.w = read_imagef(src, sampler, (int2)(i + dx.w, y + dy.w)).x;
+        sum += convert_uint4((s1 - s2) * (s1 - s2) * 255 * 255);
+        integral_img[y * width + i] = sum;
+    }
+}
+
+kernel void vert_sum(__global uint4 *integral_img,
+                     __global int *overflow,
+                     int width,
+                     int height)
+{
+    int x = get_global_id(0);
+    uint4 sum = 0;
+    for (int i = 0; i < height; i++) {
+        if (any((uint4)UINT_MAX - integral_img[i * width + x] < sum))
+            atomic_inc(overflow);
+        integral_img[i * width + x] += sum;
+        sum = integral_img[i * width + x];
+    }
+}
+
+kernel void weight_accum(global float *sum, global float *weight,
+                         global uint4 *integral_img, __read_only image2d_t src,
+                         int width, int height, int p, float h,
+                         int4 dx, int4 dy)
+{
+    // w(x) = integral_img(x-p, y-p) +
+    //        integral_img(x+p, y+p) -
+    //        integral_img(x+p, y-p) -
+    //        integral_img(x-p, y+p)
+    // total_sum[x] += w(x, y) * src(x + dx, y + dy)
+    // total_weight += w(x, y)
+
+    int x = get_global_id(0);
+    int y = get_global_id(1);
+    int4 xoff = x + dx;
+    int4 yoff = y + dy;
+    uint4 a = 0, b = 0, c = 0, d = 0;
+    uint4 src_pix = 0;
+
+    // out-of-bounding-box?
+    int oobb = (x - p) < 0 || (y - p) < 0 || (y + p) >= height || (x + p) >= width;
+
+    src_pix.x = (int)(255 * read_imagef(src, sampler, (int2)(xoff.x, yoff.x)).x);
+    src_pix.y = (int)(255 * read_imagef(src, sampler, (int2)(xoff.y, yoff.y)).x);
+    src_pix.z = (int)(255 * read_imagef(src, sampler, (int2)(xoff.z, yoff.z)).x);
+    src_pix.w = (int)(255 * read_imagef(src, sampler, (int2)(xoff.w, yoff.w)).x);
+    if (!oobb) {
+        a = integral_img[(y - p) * width + x - p];
+        b = integral_img[(y + p) * width + x - p];
+        c = integral_img[(y - p) * width + x + p];
+        d = integral_img[(y + p) * width + x + p];
+    }
+
+    float4 patch_diff = convert_float4(d + a - c - b);
+    float4 w = native_exp(-patch_diff / (h * h));
+    float w_sum = w.x + w.y + w.z + w.w;
+    weight[y * width + x] += w_sum;
+    sum[y * width + x] += dot(w, convert_float4(src_pix));
+}
+
+kernel void average(__write_only image2d_t dst,
+                    __read_only image2d_t src,
+                    global float *sum, global float *weight) {
+    int x = get_global_id(0);
+    int y = get_global_id(1);
+    int2 dim = get_image_dim(dst);
+
+    float w = weight[y * dim.x + x];
+    float s = sum[y * dim.x + x];
+    float src_pix = read_imagef(src, sampler, (int2)(x, y)).x;
+    float r = (s + src_pix * 255) / (1.0f + w) / 255.0f;
+    if (x < dim.x && y < dim.y)
+        write_imagef(dst, (int2)(x, y), (float4)(r, 0.0f, 0.0f, 1.0f));
+}
diff --git a/libavfilter/opencl/pad.cl b/libavfilter/opencl/pad.cl
new file mode 100644
index 0000000..e8dd6d6
--- /dev/null
+++ b/libavfilter/opencl/pad.cl
@@ -0,0 +1,36 @@
+/*
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+const sampler_t sampler = CLK_NORMALIZED_COORDS_FALSE |
+                          CLK_FILTER_NEAREST;
+
+__kernel void pad (
+    __read_only  image2d_t src,
+    __write_only image2d_t dst,
+    float4 color,
+    int2 xy)
+{
+    int2 size_src = get_image_dim(src);
+    int2 loc = (int2)(get_global_id(0), get_global_id(1));
+    int2 src_pos = (int2)(get_global_id(0) - xy.x, get_global_id(1) - xy.y);
+    float4 pixel = loc.x >= size_src.x + xy.x ||
+                   loc.y >= size_src.y + xy.y ||
+                   loc.x < xy.x ||
+                   loc.y < xy.y ? color : read_imagef(src, sampler, src_pos);
+    write_imagef(dst, loc, pixel);
+}
diff --git a/libavfilter/opencl/transpose.cl b/libavfilter/opencl/transpose.cl
new file mode 100644
index 0000000..e6388ab
--- /dev/null
+++ b/libavfilter/opencl/transpose.cl
@@ -0,0 +1,35 @@
+/*
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+kernel void transpose(__write_only image2d_t dst,
+                      __read_only image2d_t src,
+                      int dir) {
+    const sampler_t sampler = (CLK_NORMALIZED_COORDS_FALSE |
+                               CLK_ADDRESS_CLAMP_TO_EDGE   |
+                               CLK_FILTER_NEAREST);
+
+    int2 size = get_image_dim(dst);
+    int x = get_global_id(0);
+    int y = get_global_id(1);
+
+    int xin = (dir & 2) ? (size.y - 1 - y) : y;
+    int yin = (dir & 1) ? (size.x - 1 - x) : x;
+    float4 data = read_imagef(src, sampler, (int2)(xin, yin));
+
+    if (x < size.x && y < size.y)
+        write_imagef(dst, (int2)(x, y), data);
+}
diff --git a/libavfilter/opencl/xfade.cl b/libavfilter/opencl/xfade.cl
new file mode 100644
index 0000000..ae2f33c
--- /dev/null
+++ b/libavfilter/opencl/xfade.cl
@@ -0,0 +1,145 @@
+/*
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+const sampler_t sampler = (CLK_NORMALIZED_COORDS_FALSE |
+                           CLK_FILTER_NEAREST);
+
+__kernel void fade(__write_only image2d_t dst,
+                   __read_only  image2d_t src1,
+                   __read_only  image2d_t src2,
+                   float progress)
+{
+    int2  p = (int2)(get_global_id(0), get_global_id(1));
+
+    float4 val1 = read_imagef(src1, sampler, p);
+    float4 val2 = read_imagef(src2, sampler, p);
+
+    write_imagef(dst, p, mix(val2, val1, progress));
+}
+
+__kernel void wipeleft(__write_only image2d_t dst,
+                       __read_only  image2d_t src1,
+                       __read_only  image2d_t src2,
+                       float progress)
+{
+    int   s = (int)(get_image_dim(src1).x * progress);
+    int2  p = (int2)(get_global_id(0), get_global_id(1));
+
+    float4 val1 = read_imagef(src1, sampler, p);
+    float4 val2 = read_imagef(src2, sampler, p);
+
+    write_imagef(dst, p, p.x > s ? val2 : val1);
+}
+
+__kernel void wiperight(__write_only image2d_t dst,
+                        __read_only  image2d_t src1,
+                        __read_only  image2d_t src2,
+                        float progress)
+{
+    int   s = (int)(get_image_dim(src1).x * (1.f - progress));
+    int2  p = (int2)(get_global_id(0), get_global_id(1));
+
+    float4 val1 = read_imagef(src1, sampler, p);
+    float4 val2 = read_imagef(src2, sampler, p);
+
+    write_imagef(dst, p, p.x > s ? val1 : val2);
+}
+
+__kernel void wipeup(__write_only image2d_t dst,
+                     __read_only  image2d_t src1,
+                     __read_only  image2d_t src2,
+                     float progress)
+{
+    int   s = (int)(get_image_dim(src1).y * progress);
+    int2  p = (int2)(get_global_id(0), get_global_id(1));
+
+    float4 val1 = read_imagef(src1, sampler, p);
+    float4 val2 = read_imagef(src2, sampler, p);
+
+    write_imagef(dst, p, p.y > s ? val2 : val1);
+}
+
+__kernel void wipedown(__write_only image2d_t dst,
+                       __read_only  image2d_t src1,
+                       __read_only  image2d_t src2,
+                       float progress)
+{
+    int   s = (int)(get_image_dim(src1).y * (1.f - progress));
+    int2  p = (int2)(get_global_id(0), get_global_id(1));
+
+    float4 val1 = read_imagef(src1, sampler, p);
+    float4 val2 = read_imagef(src2, sampler, p);
+
+    write_imagef(dst, p, p.y > s ? val1 : val2);
+}
+
+void slide(__write_only image2d_t dst,
+           __read_only  image2d_t src1,
+           __read_only  image2d_t src2,
+           float progress,
+           int2 direction)
+{
+    int   w = get_image_dim(src1).x;
+    int   h = get_image_dim(src1).y;
+    int2 wh = (int2)(w, h);
+    int2 uv = (int2)(get_global_id(0), get_global_id(1));
+    int2 pi = (int2)(progress * w, progress * h);
+    int2 p = uv + pi * direction;
+    int2 f = p % wh;
+
+    f = f + (int2)(w, h) * (int2)(f.x < 0, f.y < 0);
+    float4 val1 = read_imagef(src1, sampler, f);
+    float4 val2 = read_imagef(src2, sampler, f);
+    write_imagef(dst, uv, mix(val1, val2, (p.y >= 0) * (h > p.y) * (p.x >= 0) * (w > p.x)));
+}
+
+__kernel void slidedown(__write_only image2d_t dst,
+                        __read_only  image2d_t src1,
+                        __read_only  image2d_t src2,
+                        float progress)
+{
+    int2 direction = (int2)(0, 1);
+    slide(dst, src1, src2, progress, direction);
+}
+
+__kernel void slideup(__write_only image2d_t dst,
+                      __read_only  image2d_t src1,
+                      __read_only  image2d_t src2,
+                      float progress)
+{
+    int2 direction = (int2)(0, -1);
+    slide(dst, src1, src2, progress, direction);
+}
+
+__kernel void slideleft(__write_only image2d_t dst,
+                        __read_only  image2d_t src1,
+                        __read_only  image2d_t src2,
+                        float progress)
+{
+    int2 direction = (int2)(-1, 0);
+    slide(dst, src1, src2, progress, direction);
+}
+
+__kernel void slideright(__write_only image2d_t dst,
+                         __read_only  image2d_t src1,
+                         __read_only  image2d_t src2,
+                         float progress)
+{
+    int2 direction = (int2)(1, 0);
+    slide(dst, src1, src2, progress, direction);
+}
diff --git a/libavfilter/opencl_source.h b/libavfilter/opencl_source.h
index 2f67d89..7e81330 100644
--- a/libavfilter/opencl_source.h
+++ b/libavfilter/opencl_source.h
@@ -20,11 +20,17 @@
 #define AVFILTER_OPENCL_SOURCE_H
 
 extern const char *ff_opencl_source_avgblur;
+extern const char *ff_opencl_source_colorkey;
 extern const char *ff_opencl_source_colorspace_common;
 extern const char *ff_opencl_source_convolution;
+extern const char *ff_opencl_source_deshake;
 extern const char *ff_opencl_source_neighbor;
+extern const char *ff_opencl_source_nlmeans;
 extern const char *ff_opencl_source_overlay;
+extern const char *ff_opencl_source_pad;
 extern const char *ff_opencl_source_tonemap;
+extern const char *ff_opencl_source_transpose;
 extern const char *ff_opencl_source_unsharp;
+extern const char *ff_opencl_source_xfade;
 
 #endif /* AVFILTER_OPENCL_SOURCE_H */
diff --git a/libavfilter/phase_template.c b/libavfilter/phase_template.c
new file mode 100644
index 0000000..491612b
--- /dev/null
+++ b/libavfilter/phase_template.c
@@ -0,0 +1,183 @@
+/*
+ * Copyright (c) 2004 Ville Saari
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "libavutil/avassert.h"
+#include "avfilter.h"
+#include "formats.h"
+#include "internal.h"
+#include "video.h"
+
+#undef pixel
+#undef accumulator
+#if DEPTH == 8
+#define pixel uint8_t
+#define accumulator int
+#else
+#define pixel uint16_t
+#define accumulator int64_t
+#endif
+
+#define fn3(a,b)   a##_##b
+#define fn2(a,b)   fn3(a,b)
+#define fn(a)      fn2(a, DEPTH)
+
+/*
+ * This macro interpolates the value of both fields at a point halfway
+ * between lines and takes the squared difference. In field resolution
+ * the point is a quarter pixel below a line in one field and a quarter
+ * pixel above a line in other.
+ *
+ * (The result is actually multiplied by 25)
+ */
+#define DIFF(a, as, b, bs) ((t) = ((*(a) - (b)[bs]) << 2) + (a)[(as) << 1] - (b)[-(bs)], (t) * (t))
+
+/*
+ * Find which field combination has the smallest average squared difference
+ * between the fields.
+ */
+static enum PhaseMode fn(analyze_plane)(void *ctx, enum PhaseMode mode, AVFrame *old, AVFrame *new)
+{
+    double bdiff, tdiff, pdiff;
+
+    if (mode == AUTO) {
+        mode = new->interlaced_frame ? new->top_field_first ?
+               TOP_FIRST : BOTTOM_FIRST : PROGRESSIVE;
+    } else if (mode == AUTO_ANALYZE) {
+        mode = new->interlaced_frame ? new->top_field_first ?
+               TOP_FIRST_ANALYZE : BOTTOM_FIRST_ANALYZE : FULL_ANALYZE;
+    }
+
+    if (mode <= BOTTOM_FIRST) {
+        bdiff = pdiff = tdiff = 65536.0;
+    } else {
+        const double factor = 1. / (25. * (1 << (DEPTH - 8)) * (1 << (DEPTH - 8)));
+        const int ns = new->linesize[0] / sizeof(pixel);
+        const int os = old->linesize[0] / sizeof(pixel);
+        const pixel *nptr = (pixel *)new->data[0];
+        const pixel *optr = (pixel *)old->data[0];
+        const int h = new->height;
+        const int w = new->width;
+        accumulator bdif, tdif, pdif;
+        double scale;
+
+        int top = 0, t;
+        const pixel *rend, *end = nptr + (h - 2) * ns;
+
+        bdiff = pdiff = tdiff = 0.0;
+
+        nptr += ns;
+        optr += os;
+        while (nptr < end) {
+            pdif = tdif = bdif = 0;
+
+            switch (mode) {
+            case TOP_FIRST_ANALYZE:
+                if (top) {
+                    for (rend = nptr + w; nptr < rend; nptr++, optr++) {
+                        pdif += DIFF(nptr, ns, nptr, ns);
+                        tdif += DIFF(nptr, ns, optr, os);
+                    }
+                } else {
+                    for (rend = nptr + w; nptr < rend; nptr++, optr++) {
+                        pdif += DIFF(nptr, ns, nptr, ns);
+                        tdif += DIFF(optr, os, nptr, ns);
+                    }
+                }
+                break;
+            case BOTTOM_FIRST_ANALYZE:
+                if (top) {
+                    for (rend = nptr + w; nptr < rend; nptr++, optr++) {
+                        pdif += DIFF(nptr, ns, nptr, ns);
+                        bdif += DIFF(optr, os, nptr, ns);
+                    }
+                } else {
+                    for (rend = nptr + w; nptr < rend; nptr++, optr++) {
+                        pdif += DIFF(nptr, ns, nptr, ns);
+                        bdif += DIFF(nptr, ns, optr, os);
+                    }
+                }
+                break;
+            case ANALYZE:
+                if (top) {
+                    for (rend = nptr + w; nptr < rend; nptr++, optr++) {
+                        tdif += DIFF(nptr, ns, optr, os);
+                        bdif += DIFF(optr, os, nptr, ns);
+                    }
+                } else {
+                    for (rend = nptr + w; nptr < rend; nptr++, optr++) {
+                        bdif += DIFF(nptr, ns, optr, os);
+                        tdif += DIFF(optr, os, nptr, ns);
+                    }
+                }
+                break;
+            case FULL_ANALYZE:
+                if (top) {
+                    for (rend = nptr + w; nptr < rend; nptr++, optr++) {
+                        pdif += DIFF(nptr, ns, nptr, ns);
+                        tdif += DIFF(nptr, ns, optr, os);
+                        bdif += DIFF(optr, os, nptr, ns);
+                    }
+                } else {
+                    for (rend = nptr + w; nptr < rend; nptr++, optr++) {
+                        pdif += DIFF(nptr, ns, nptr, ns);
+                        bdif += DIFF(nptr, ns, optr, os);
+                        tdif += DIFF(optr, os, nptr, ns);
+                    }
+                }
+                break;
+            default:
+                av_assert0(0);
+            }
+
+            pdiff += (double)pdif;
+            tdiff += (double)tdif;
+            bdiff += (double)bdif;
+            nptr += ns - w;
+            optr += os - w;
+            top ^= 1;
+        }
+
+        scale = 1.0 / (w * (h - 3)) * factor;
+        pdiff *= scale;
+        tdiff *= scale;
+        bdiff *= scale;
+
+        if (mode == TOP_FIRST_ANALYZE) {
+            bdiff = 65536.0;
+        } else if (mode == BOTTOM_FIRST_ANALYZE) {
+            tdiff = 65536.0;
+        } else if (mode == ANALYZE) {
+            pdiff = 65536.0;
+        }
+
+        if (bdiff < pdiff && bdiff < tdiff) {
+            mode = BOTTOM_FIRST;
+        } else if (tdiff < pdiff && tdiff < bdiff) {
+            mode = TOP_FIRST;
+        } else {
+            mode = PROGRESSIVE;
+        }
+    }
+
+    av_log(ctx, AV_LOG_DEBUG, "mode=%c tdiff=%f bdiff=%f pdiff=%f\n",
+           mode == BOTTOM_FIRST ? 'b' : mode == TOP_FIRST ? 't' : 'p',
+           tdiff, bdiff, pdiff);
+    return mode;
+}
diff --git a/libavfilter/qsvvpp.c b/libavfilter/qsvvpp.c
index 06efdf5..8d5ff2e 100644
--- a/libavfilter/qsvvpp.c
+++ b/libavfilter/qsvvpp.c
@@ -153,6 +153,7 @@
 {
     switch (frame->format) {
     case AV_PIX_FMT_NV12:
+    case AV_PIX_FMT_P010:
         surface->Data.Y  = frame->data[0];
         surface->Data.UV = frame->data[1];
         break;
@@ -316,7 +317,6 @@
             }
 
             av_frame_copy_props(qsv_frame->frame, picref);
-            av_frame_free(&picref);
         } else
             qsv_frame->frame = av_frame_clone(picref);
 
@@ -461,6 +461,8 @@
         out_frames_ctx->height            = FFALIGN(outlink->h, 32);
         out_frames_ctx->sw_format         = s->out_sw_format;
         out_frames_ctx->initial_pool_size = 64;
+        if (avctx->extra_hw_frames > 0)
+            out_frames_ctx->initial_pool_size += avctx->extra_hw_frames;
         out_frames_hwctx->frame_type      = s->out_mem_mode;
 
         ret = av_hwframe_ctx_init(out_frames_ref);
diff --git a/libavfilter/qsvvpp.h b/libavfilter/qsvvpp.h
index ff02b64..c2bcce7 100644
--- a/libavfilter/qsvvpp.h
+++ b/libavfilter/qsvvpp.h
@@ -36,8 +36,8 @@
      MFX_VERSION_MAJOR == (MAJOR) && MFX_VERSION_MINOR >= (MINOR))
 
 #define QSV_RUNTIME_VERSION_ATLEAST(MFX_VERSION, MAJOR, MINOR) \
-    (MFX_VERSION.Major > (MAJOR)) ||                           \
-    (MFX_VERSION.Major == (MAJOR) && MFX_VERSION.Minor >= (MINOR))
+    ((MFX_VERSION.Major > (MAJOR)) ||                           \
+    (MFX_VERSION.Major == (MAJOR) && MFX_VERSION.Minor >= (MINOR)))
 
 typedef struct QSVVPPContext QSVVPPContext;
 
diff --git a/libavfilter/scale.c b/libavfilter/scale_eval.c
similarity index 62%
rename from libavfilter/scale.c
rename to libavfilter/scale_eval.c
index eaee95f..dfec081 100644
--- a/libavfilter/scale.c
+++ b/libavfilter/scale_eval.c
@@ -19,15 +19,12 @@
  */
 
 #include <stdint.h>
-#include "scale.h"
+#include "scale_eval.h"
 #include "libavutil/eval.h"
 #include "libavutil/mathematics.h"
 #include "libavutil/pixdesc.h"
 
 static const char *const var_names[] = {
-    "PI",
-    "PHI",
-    "E",
     "in_w",   "iw",
     "in_h",   "ih",
     "out_w",  "ow",
@@ -43,9 +40,6 @@
 };
 
 enum var_name {
-    VAR_PI,
-    VAR_PHI,
-    VAR_E,
     VAR_IN_W,   VAR_IW,
     VAR_IN_H,   VAR_IH,
     VAR_OUT_W,  VAR_OW,
@@ -60,49 +54,6 @@
     VARS_NB
 };
 
-/**
- * This must be kept in sync with var_names so that it is always a
- * complete list of var_names with the scale2ref specific names
- * appended. scale2ref values must appear in the order they appear
- * in the var_name_scale2ref enum but also be below all of the
- * non-scale2ref specific values.
- */
-static const char *const var_names_scale2ref[] = {
-    "PI",
-    "PHI",
-    "E",
-    "in_w",   "iw",
-    "in_h",   "ih",
-    "out_w",  "ow",
-    "out_h",  "oh",
-    "a",
-    "sar",
-    "dar",
-    "hsub",
-    "vsub",
-    "ohsub",
-    "ovsub",
-    "main_w",
-    "main_h",
-    "main_a",
-    "main_sar",
-    "main_dar", "mdar",
-    "main_hsub",
-    "main_vsub",
-    NULL
-};
-
-enum var_name_scale2ref {
-    VAR_S2R_MAIN_W,
-    VAR_S2R_MAIN_H,
-    VAR_S2R_MAIN_A,
-    VAR_S2R_MAIN_SAR,
-    VAR_S2R_MAIN_DAR, VAR_S2R_MDAR,
-    VAR_S2R_MAIN_HSUB,
-    VAR_S2R_MAIN_VSUB,
-    VARS_S2R_NB
-};
-
 int ff_scale_eval_dimensions(void *log_ctx,
     const char *w_expr, const char *h_expr,
     AVFilterLink *inlink, AVFilterLink *outlink,
@@ -111,24 +62,10 @@
     const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(inlink->format);
     const AVPixFmtDescriptor *out_desc = av_pix_fmt_desc_get(outlink->format);
     const char *expr;
-    int w, h;
-    int factor_w, factor_h;
     int eval_w, eval_h;
     int ret;
-    const char scale2ref = outlink->src->nb_inputs == 2 && outlink->src->inputs[1] == inlink;
-    double var_values[VARS_NB + VARS_S2R_NB], res;
-    const AVPixFmtDescriptor *main_desc;
-    const AVFilterLink *main_link;
-    const char *const *names = scale2ref ? var_names_scale2ref : var_names;
+    double var_values[VARS_NB], res;
 
-    if (scale2ref) {
-        main_link = outlink->src->inputs[0];
-        main_desc = av_pix_fmt_desc_get(main_link->format);
-    }
-
-    var_values[VAR_PI]    = M_PI;
-    var_values[VAR_PHI]   = M_PHI;
-    var_values[VAR_E]     = M_E;
     var_values[VAR_IN_W]  = var_values[VAR_IW] = inlink->w;
     var_values[VAR_IN_H]  = var_values[VAR_IH] = inlink->h;
     var_values[VAR_OUT_W] = var_values[VAR_OW] = NAN;
@@ -142,40 +79,48 @@
     var_values[VAR_OHSUB] = 1 << out_desc->log2_chroma_w;
     var_values[VAR_OVSUB] = 1 << out_desc->log2_chroma_h;
 
-    if (scale2ref) {
-        var_values[VARS_NB + VAR_S2R_MAIN_W] = main_link->w;
-        var_values[VARS_NB + VAR_S2R_MAIN_H] = main_link->h;
-        var_values[VARS_NB + VAR_S2R_MAIN_A] = (double) main_link->w / main_link->h;
-        var_values[VARS_NB + VAR_S2R_MAIN_SAR] = main_link->sample_aspect_ratio.num ?
-            (double) main_link->sample_aspect_ratio.num / main_link->sample_aspect_ratio.den : 1;
-        var_values[VARS_NB + VAR_S2R_MAIN_DAR] = var_values[VARS_NB + VAR_S2R_MDAR] =
-            var_values[VARS_NB + VAR_S2R_MAIN_A] * var_values[VARS_NB + VAR_S2R_MAIN_SAR];
-        var_values[VARS_NB + VAR_S2R_MAIN_HSUB] = 1 << main_desc->log2_chroma_w;
-        var_values[VARS_NB + VAR_S2R_MAIN_VSUB] = 1 << main_desc->log2_chroma_h;
-    }
-
     /* evaluate width and height */
     av_expr_parse_and_eval(&res, (expr = w_expr),
-                           names, var_values,
+                           var_names, var_values,
                            NULL, NULL, NULL, NULL, NULL, 0, log_ctx);
     eval_w = var_values[VAR_OUT_W] = var_values[VAR_OW] = (int) res == 0 ? inlink->w : (int) res;
 
     if ((ret = av_expr_parse_and_eval(&res, (expr = h_expr),
-                                      names, var_values,
+                                      var_names, var_values,
                                       NULL, NULL, NULL, NULL, NULL, 0, log_ctx)) < 0)
         goto fail;
     eval_h = var_values[VAR_OUT_H] = var_values[VAR_OH] = (int) res == 0 ? inlink->h : (int) res;
     /* evaluate again the width, as it may depend on the output height */
     if ((ret = av_expr_parse_and_eval(&res, (expr = w_expr),
-                                      names, var_values,
+                                      var_names, var_values,
                                       NULL, NULL, NULL, NULL, NULL, 0, log_ctx)) < 0)
         goto fail;
     eval_w = (int) res == 0 ? inlink->w : (int) res;
 
-    w = eval_w;
-    h = eval_h;
+    *ret_w = eval_w;
+    *ret_h = eval_h;
 
-    /* Check if it is requested that the result has to be divisible by a some
+    return 0;
+
+fail:
+    av_log(log_ctx, AV_LOG_ERROR,
+           "Error when evaluating the expression '%s'.\n"
+           "Maybe the expression for out_w:'%s' or for out_h:'%s' is self-referencing.\n",
+           expr, w_expr, h_expr);
+    return ret;
+}
+
+int ff_scale_adjust_dimensions(AVFilterLink *inlink,
+    int *ret_w, int *ret_h,
+    int force_original_aspect_ratio, int force_divisible_by)
+{
+    int w, h;
+    int factor_w, factor_h;
+
+    w = *ret_w;
+    h = *ret_h;
+
+    /* Check if it is requested that the result has to be divisible by some
      * factor (w or h = -n with n being the factor). */
     factor_w = 1;
     factor_h = 1;
@@ -192,22 +137,41 @@
     }
 
     /* Make sure that the result is divisible by the factor we determined
-     * earlier. If no factor was set, it is nothing will happen as the default
+     * earlier. If no factor was set, nothing will happen as the default
      * factor is 1 */
     if (w < 0)
         w = av_rescale(h, inlink->w, inlink->h * factor_w) * factor_w;
     if (h < 0)
         h = av_rescale(w, inlink->h, inlink->w * factor_h) * factor_h;
 
+    /* Note that force_original_aspect_ratio may overwrite the previous set
+     * dimensions so that it is not divisible by the set factors anymore
+     * unless force_divisible_by is defined as well */
+    if (force_original_aspect_ratio) {
+        int tmp_w = av_rescale(h, inlink->w, inlink->h);
+        int tmp_h = av_rescale(w, inlink->h, inlink->w);
+
+        if (force_original_aspect_ratio == 1) {
+             w = FFMIN(tmp_w, w);
+             h = FFMIN(tmp_h, h);
+             if (force_divisible_by > 1) {
+                 // round down
+                 w = w / force_divisible_by * force_divisible_by;
+                 h = h / force_divisible_by * force_divisible_by;
+             }
+        } else {
+             w = FFMAX(tmp_w, w);
+             h = FFMAX(tmp_h, h);
+             if (force_divisible_by > 1) {
+                 // round up
+                 w = (w + force_divisible_by - 1) / force_divisible_by * force_divisible_by;
+                 h = (h + force_divisible_by - 1) / force_divisible_by * force_divisible_by;
+             }
+        }
+    }
+
     *ret_w = w;
     *ret_h = h;
 
     return 0;
-
-fail:
-    av_log(log_ctx, AV_LOG_ERROR,
-           "Error when evaluating the expression '%s'.\n"
-           "Maybe the expression for out_w:'%s' or for out_h:'%s' is self-referencing.\n",
-           expr, w_expr, h_expr);
-    return ret;
 }
diff --git a/libavfilter/scale_eval.h b/libavfilter/scale_eval.h
new file mode 100644
index 0000000..fceb023
--- /dev/null
+++ b/libavfilter/scale_eval.h
@@ -0,0 +1,48 @@
+/*
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVFILTER_SCALE_EVAL_H
+#define AVFILTER_SCALE_EVAL_H
+
+#include "avfilter.h"
+
+/**
+ * Parse and evaluate string expressions for width and height. Upon success,
+ * ff_scale_adjust_dimensions must be called with evaluated width and height
+ * to obtain actual target dimensions.
+ *
+ * Returns 0 upon success, negative value if one of the expressions could
+ * not be parsed or if NaN was the result of their evaluation.
+ */
+int ff_scale_eval_dimensions(void *ctx,
+    const char *w_expr, const char *h_expr,
+    AVFilterLink *inlink, AVFilterLink *outlink,
+    int *ret_w, int *ret_h);
+
+/**
+ * Transform evaluated width and height obtained from ff_scale_eval_dimensions
+ * into actual target width and height for scaling. Adjustment can occur if one
+ * or both of the evaluated values are of the form '-n' or if
+ * force_original_aspect_ratio is set.
+ *
+ * Returns 0.
+ */
+int ff_scale_adjust_dimensions(AVFilterLink *inlink,
+    int *ret_w, int *ret_h,
+    int force_original_aspect_ratio, int force_divisible_by);
+#endif
diff --git a/libavfilter/scene_sad.c b/libavfilter/scene_sad.c
new file mode 100644
index 0000000..73d3eac
--- /dev/null
+++ b/libavfilter/scene_sad.c
@@ -0,0 +1,72 @@
+/*
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file
+ * Scene SAD functions
+ */
+
+#include "scene_sad.h"
+
+void ff_scene_sad16_c(SCENE_SAD_PARAMS)
+{
+    uint64_t sad = 0;
+    const uint16_t *src1w = (const uint16_t *)src1;
+    const uint16_t *src2w = (const uint16_t *)src2;
+    int x, y;
+
+    stride1 /= 2;
+    stride2 /= 2;
+
+    for (y = 0; y < height; y++) {
+        for (x = 0; x < width; x++)
+            sad += FFABS(src1w[x] - src2w[x]);
+        src1w += stride1;
+        src2w += stride2;
+    }
+    *sum = sad;
+}
+
+void ff_scene_sad_c(SCENE_SAD_PARAMS)
+{
+    uint64_t sad = 0;
+    int x, y;
+
+    for (y = 0; y < height; y++) {
+        for (x = 0; x < width; x++)
+            sad += FFABS(src1[x] - src2[x]);
+        src1 += stride1;
+        src2 += stride2;
+    }
+    *sum = sad;
+}
+
+ff_scene_sad_fn ff_scene_sad_get_fn(int depth)
+{
+    ff_scene_sad_fn sad = NULL;
+    if (ARCH_X86)
+        sad = ff_scene_sad_get_fn_x86(depth);
+    if (!sad) {
+        if (depth == 8)
+            sad = ff_scene_sad_c;
+        if (depth == 16)
+            sad = ff_scene_sad16_c;
+    }
+    return sad;
+}
+
diff --git a/libavfilter/scene_sad.h b/libavfilter/scene_sad.h
new file mode 100644
index 0000000..173a051
--- /dev/null
+++ b/libavfilter/scene_sad.h
@@ -0,0 +1,44 @@
+/*
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file
+ * Scene SAD functions
+ */
+
+#ifndef AVFILTER_SCENE_SAD_H
+#define AVFILTER_SCENE_SAD_H
+
+#include "avfilter.h"
+
+#define SCENE_SAD_PARAMS const uint8_t *src1, ptrdiff_t stride1, \
+                         const uint8_t *src2, ptrdiff_t stride2, \
+                         ptrdiff_t width, ptrdiff_t height, \
+                         uint64_t *sum
+
+typedef void (*ff_scene_sad_fn)(SCENE_SAD_PARAMS);
+
+void ff_scene_sad_c(SCENE_SAD_PARAMS);
+
+void ff_scene_sad16_c(SCENE_SAD_PARAMS);
+
+ff_scene_sad_fn ff_scene_sad_get_fn_x86(int depth);
+
+ff_scene_sad_fn ff_scene_sad_get_fn(int depth);
+
+#endif /* AVFILTER_SCENE_SAD_H */
diff --git a/libavfilter/setpts.c b/libavfilter/setpts.c
index 800ba6a..c7c3836 100644
--- a/libavfilter/setpts.c
+++ b/libavfilter/setpts.c
@@ -33,6 +33,7 @@
 #include "libavutil/time.h"
 #include "audio.h"
 #include "avfilter.h"
+#include "filters.h"
 #include "internal.h"
 #include "video.h"
 
@@ -154,6 +155,28 @@
     return buf;
 }
 
+static double eval_pts(SetPTSContext *setpts, AVFilterLink *inlink, AVFrame *frame, int64_t pts)
+{
+    if (isnan(setpts->var_values[VAR_STARTPTS])) {
+        setpts->var_values[VAR_STARTPTS] = TS2D(pts);
+        setpts->var_values[VAR_STARTT  ] = TS2T(pts, inlink->time_base);
+    }
+    setpts->var_values[VAR_PTS       ] = TS2D(pts);
+    setpts->var_values[VAR_T         ] = TS2T(pts, inlink->time_base);
+    setpts->var_values[VAR_POS       ] = !frame || frame->pkt_pos == -1 ? NAN : frame->pkt_pos;
+    setpts->var_values[VAR_RTCTIME   ] = av_gettime();
+
+    if (frame) {
+        if (inlink->type == AVMEDIA_TYPE_VIDEO) {
+            setpts->var_values[VAR_INTERLACED] = frame->interlaced_frame;
+        } else if (inlink->type == AVMEDIA_TYPE_AUDIO) {
+            setpts->var_values[VAR_S] = frame->nb_samples;
+            setpts->var_values[VAR_NB_SAMPLES] = frame->nb_samples;
+        }
+    }
+
+    return av_expr_eval(setpts->expr, setpts->var_values, NULL);
+}
 #define d2istr(v) double2int64str((char[BUF_SIZE]){0}, v)
 
 static int filter_frame(AVFilterLink *inlink, AVFrame *frame)
@@ -162,23 +185,7 @@
     int64_t in_pts = frame->pts;
     double d;
 
-    if (isnan(setpts->var_values[VAR_STARTPTS])) {
-        setpts->var_values[VAR_STARTPTS] = TS2D(frame->pts);
-        setpts->var_values[VAR_STARTT  ] = TS2T(frame->pts, inlink->time_base);
-    }
-    setpts->var_values[VAR_PTS       ] = TS2D(frame->pts);
-    setpts->var_values[VAR_T         ] = TS2T(frame->pts, inlink->time_base);
-    setpts->var_values[VAR_POS       ] = frame->pkt_pos == -1 ? NAN : frame->pkt_pos;
-    setpts->var_values[VAR_RTCTIME   ] = av_gettime();
-
-    if (inlink->type == AVMEDIA_TYPE_VIDEO) {
-        setpts->var_values[VAR_INTERLACED] = frame->interlaced_frame;
-    } else if (inlink->type == AVMEDIA_TYPE_AUDIO) {
-        setpts->var_values[VAR_S] = frame->nb_samples;
-        setpts->var_values[VAR_NB_SAMPLES] = frame->nb_samples;
-    }
-
-    d = av_expr_eval(setpts->expr, setpts->var_values, NULL);
+    d = eval_pts(setpts, inlink, frame, frame->pts);
     frame->pts = D2TS(d);
 
     av_log(inlink->dst, AV_LOG_TRACE,
@@ -216,6 +223,41 @@
     return ff_filter_frame(inlink->dst->outputs[0], frame);
 }
 
+static int activate(AVFilterContext *ctx)
+{
+    SetPTSContext *setpts = ctx->priv;
+    AVFilterLink *inlink = ctx->inputs[0];
+    AVFilterLink *outlink = ctx->outputs[0];
+    AVFrame *in;
+    int status;
+    int64_t pts;
+    int ret;
+
+    FF_FILTER_FORWARD_STATUS_BACK(outlink, inlink);
+
+    ret = ff_inlink_consume_frame(inlink, &in);
+    if (ret < 0)
+        return ret;
+    if (ret > 0)
+        return filter_frame(inlink, in);
+
+    if (ff_inlink_acknowledge_status(inlink, &status, &pts)) {
+        double d = eval_pts(setpts, inlink, NULL, pts);
+
+        av_log(ctx, AV_LOG_TRACE, "N:EOF PTS:%s T:%f POS:%s -> PTS:%s T:%f\n",
+               d2istr(setpts->var_values[VAR_PTS]),
+               setpts->var_values[VAR_T],
+               d2istr(setpts->var_values[VAR_POS]),
+               d2istr(d), TS2T(d, inlink->time_base));
+        ff_outlink_set_status(outlink, status, D2TS(d));
+        return 0;
+    }
+
+    FF_FILTER_FORWARD_WANTED(outlink, inlink);
+
+    return FFERROR_NOT_READY;
+}
+
 static av_cold void uninit(AVFilterContext *ctx)
 {
     SetPTSContext *setpts = ctx->priv;
@@ -239,7 +281,6 @@
         .name         = "default",
         .type         = AVMEDIA_TYPE_VIDEO,
         .config_props = config_input,
-        .filter_frame = filter_frame,
     },
     { NULL }
 };
@@ -256,6 +297,7 @@
     .name      = "setpts",
     .description = NULL_IF_CONFIG_SMALL("Set PTS for the output video frame."),
     .init      = init,
+    .activate  = activate,
     .uninit    = uninit,
 
     .priv_size = sizeof(SetPTSContext),
@@ -276,7 +318,6 @@
         .name         = "default",
         .type         = AVMEDIA_TYPE_AUDIO,
         .config_props = config_input,
-        .filter_frame = filter_frame,
     },
     { NULL }
 };
@@ -293,6 +334,7 @@
     .name        = "asetpts",
     .description = NULL_IF_CONFIG_SMALL("Set PTS for the output audio frame."),
     .init        = init,
+    .activate    = activate,
     .uninit      = uninit,
     .priv_size   = sizeof(SetPTSContext),
     .priv_class  = &asetpts_class,
diff --git a/libavfilter/settb.c b/libavfilter/settb.c
index 83616c1..dba52cf 100644
--- a/libavfilter/settb.c
+++ b/libavfilter/settb.c
@@ -34,6 +34,7 @@
 #include "libavutil/rational.h"
 #include "audio.h"
 #include "avfilter.h"
+#include "filters.h"
 #include "internal.h"
 #include "video.h"
 
@@ -104,22 +105,58 @@
     return 0;
 }
 
+static int64_t rescale_pts(AVFilterLink *inlink, AVFilterLink *outlink, int64_t orig_pts)
+{
+    AVFilterContext *ctx = inlink->dst;
+    int64_t new_pts = orig_pts;
+
+    if (av_cmp_q(inlink->time_base, outlink->time_base)) {
+        new_pts = av_rescale_q(orig_pts, inlink->time_base, outlink->time_base);
+        av_log(ctx, AV_LOG_DEBUG, "tb:%d/%d pts:%"PRId64" -> tb:%d/%d pts:%"PRId64"\n",
+               inlink ->time_base.num, inlink ->time_base.den, orig_pts,
+               outlink->time_base.num, outlink->time_base.den, new_pts);
+    }
+
+    return new_pts;
+}
+
 static int filter_frame(AVFilterLink *inlink, AVFrame *frame)
 {
     AVFilterContext *ctx = inlink->dst;
     AVFilterLink *outlink = ctx->outputs[0];
 
-    if (av_cmp_q(inlink->time_base, outlink->time_base)) {
-        int64_t orig_pts = frame->pts;
-        frame->pts = av_rescale_q(frame->pts, inlink->time_base, outlink->time_base);
-        av_log(ctx, AV_LOG_DEBUG, "tb:%d/%d pts:%"PRId64" -> tb:%d/%d pts:%"PRId64"\n",
-               inlink ->time_base.num, inlink ->time_base.den, orig_pts,
-               outlink->time_base.num, outlink->time_base.den, frame->pts);
-    }
+    frame->pts = rescale_pts(inlink, outlink, frame->pts);
 
     return ff_filter_frame(outlink, frame);
 }
 
+static int activate(AVFilterContext *ctx)
+{
+    AVFilterLink *inlink = ctx->inputs[0];
+    AVFilterLink *outlink = ctx->outputs[0];
+    AVFrame *in;
+    int status;
+    int64_t pts;
+    int ret;
+
+    FF_FILTER_FORWARD_STATUS_BACK(outlink, inlink);
+
+    ret = ff_inlink_consume_frame(inlink, &in);
+    if (ret < 0)
+        return ret;
+    if (ret > 0)
+        return filter_frame(inlink, in);
+
+    if (ff_inlink_acknowledge_status(inlink, &status, &pts)) {
+        ff_outlink_set_status(outlink, status, rescale_pts(inlink, outlink, pts));
+        return 0;
+    }
+
+    FF_FILTER_FORWARD_WANTED(outlink, inlink);
+
+    return FFERROR_NOT_READY;
+}
+
 #if CONFIG_SETTB_FILTER
 
 DEFINE_OPTIONS(settb, VIDEO);
@@ -129,7 +166,6 @@
     {
         .name         = "default",
         .type         = AVMEDIA_TYPE_VIDEO,
-        .filter_frame = filter_frame,
     },
     { NULL }
 };
@@ -150,6 +186,7 @@
     .priv_class  = &settb_class,
     .inputs      = avfilter_vf_settb_inputs,
     .outputs     = avfilter_vf_settb_outputs,
+    .activate    = activate,
 };
 #endif /* CONFIG_SETTB_FILTER */
 
@@ -162,7 +199,6 @@
     {
         .name         = "default",
         .type         = AVMEDIA_TYPE_AUDIO,
-        .filter_frame = filter_frame,
     },
     { NULL }
 };
@@ -183,5 +219,6 @@
     .inputs      = avfilter_af_asettb_inputs,
     .outputs     = avfilter_af_asettb_outputs,
     .priv_class  = &asettb_class,
+    .activate    = activate,
 };
 #endif /* CONFIG_ASETTB_FILTER */
diff --git a/libavfilter/split.c b/libavfilter/split.c
index 8b260a9..622838d 100644
--- a/libavfilter/split.c
+++ b/libavfilter/split.c
@@ -26,15 +26,14 @@
 #include <stdio.h>
 
 #include "libavutil/attributes.h"
+#include "libavutil/avstring.h"
 #include "libavutil/internal.h"
 #include "libavutil/mem.h"
 #include "libavutil/opt.h"
 
-#define FF_INTERNAL_FIELDS 1
-#include "framequeue.h"
-
 #include "avfilter.h"
 #include "audio.h"
+#include "filters.h"
 #include "formats.h"
 #include "internal.h"
 #include "video.h"
@@ -50,12 +49,10 @@
     int i, ret;
 
     for (i = 0; i < s->nb_outputs; i++) {
-        char name[32];
         AVFilterPad pad = { 0 };
 
-        snprintf(name, sizeof(name), "output%d", i);
         pad.type = ctx->filter->inputs[0].type;
-        pad.name = av_strdup(name);
+        pad.name = av_asprintf("output%d", i);
         if (!pad.name)
             return AVERROR(ENOMEM);
 
@@ -84,7 +81,7 @@
     for (i = 0; i < ctx->nb_outputs; i++) {
         AVFrame *buf_out;
 
-        if (ctx->outputs[i]->status_in)
+        if (ff_outlink_get_status(ctx->outputs[i]))
             continue;
         buf_out = av_frame_clone(frame);
         if (!buf_out) {
diff --git a/libavfilter/src_movie.c b/libavfilter/src_movie.c
index bcabfcc..476b8d3 100644
--- a/libavfilter/src_movie.c
+++ b/libavfilter/src_movie.c
@@ -89,8 +89,8 @@
     { "si",           "set stream index",        OFFSET(stream_index), AV_OPT_TYPE_INT,    { .i64 = -1 }, -1, INT_MAX,                 FLAGS  },
     { "seek_point",   "set seekpoint (seconds)", OFFSET(seek_point_d), AV_OPT_TYPE_DOUBLE, { .dbl =  0 },  0, (INT64_MAX-1) / 1000000, FLAGS },
     { "sp",           "set seekpoint (seconds)", OFFSET(seek_point_d), AV_OPT_TYPE_DOUBLE, { .dbl =  0 },  0, (INT64_MAX-1) / 1000000, FLAGS },
-    { "streams",      "set streams",             OFFSET(stream_specs), AV_OPT_TYPE_STRING, {.str =  0},  CHAR_MAX, CHAR_MAX, FLAGS },
-    { "s",            "set streams",             OFFSET(stream_specs), AV_OPT_TYPE_STRING, {.str =  0},  CHAR_MAX, CHAR_MAX, FLAGS },
+    { "streams",      "set streams",             OFFSET(stream_specs), AV_OPT_TYPE_STRING, {.str =  0},  0, 0, FLAGS },
+    { "s",            "set streams",             OFFSET(stream_specs), AV_OPT_TYPE_STRING, {.str =  0},  0, 0, FLAGS },
     { "loop",         "set loop count",          OFFSET(loop_count),   AV_OPT_TYPE_INT,    {.i64 =  1},  0,        INT_MAX, FLAGS },
     { "discontinuity", "set discontinuity threshold", OFFSET(discontinuity_threshold), AV_OPT_TYPE_DURATION, {.i64 = 0}, 0, INT64_MAX, FLAGS },
     { NULL },
@@ -153,14 +153,14 @@
     return found;
 }
 
-static int open_stream(void *log, MovieStream *st)
+static int open_stream(AVFilterContext *ctx, MovieStream *st)
 {
     AVCodec *codec;
     int ret;
 
     codec = avcodec_find_decoder(st->st->codecpar->codec_id);
     if (!codec) {
-        av_log(log, AV_LOG_ERROR, "Failed to find any codec\n");
+        av_log(ctx, AV_LOG_ERROR, "Failed to find any codec\n");
         return AVERROR(EINVAL);
     }
 
@@ -173,9 +173,10 @@
         return ret;
 
     st->codec_ctx->refcounted_frames = 1;
+    st->codec_ctx->thread_count = ff_filter_get_nb_threads(ctx);
 
     if ((ret = avcodec_open2(st->codec_ctx, codec, NULL)) < 0) {
-        av_log(log, AV_LOG_ERROR, "Failed to open codec\n");
+        av_log(ctx, AV_LOG_ERROR, "Failed to open codec\n");
         return ret;
     }
 
diff --git a/libavfilter/ssim.h b/libavfilter/ssim.h
index ac0395a..a6a41aa 100644
--- a/libavfilter/ssim.h
+++ b/libavfilter/ssim.h
@@ -28,7 +28,7 @@
     void (*ssim_4x4_line)(const uint8_t *buf, ptrdiff_t buf_stride,
                           const uint8_t *ref, ptrdiff_t ref_stride,
                           int (*sums)[4], int w);
-    float (*ssim_end_line)(const int (*sum0)[4], const int (*sum1)[4], int w);
+    double (*ssim_end_line)(const int (*sum0)[4], const int (*sum1)[4], int w);
 } SSIMDSPContext;
 
 void ff_ssim_init_x86(SSIMDSPContext *dsp);
diff --git a/libavfilter/tests/integral.c b/libavfilter/tests/integral.c
index 2a8e8ff..03b1e77 100644
--- a/libavfilter/tests/integral.c
+++ b/libavfilter/tests/integral.c
@@ -33,8 +33,11 @@
 int main(void)
 {
     int ret = 0, xoff, yoff;
+    uint32_t *ii_start;
+    uint32_t *ii_start2;
+    NLMeansDSPContext dsp = {0};
 
-    // arbitrary test source of size 6x4 and linesize=8
+    // arbitrary test source of size 6x5 and linesize=8
     const int w = 6, h = 5, lz = 8;
     static const uint8_t src[] = {
         0xb0, 0x71, 0xfb, 0xd8, 0x01, 0xd9, /***/ 0x01, 0x02,
@@ -54,16 +57,14 @@
     uint32_t *ii  = av_mallocz_array(ii_h + 1, ii_lz_32 * sizeof(*ii));
     uint32_t *ii2 = av_mallocz_array(ii_h + 1, ii_lz_32 * sizeof(*ii2));
 
-    uint32_t *ii_start  = ii  + ii_lz_32 + 1; // skip top 0-line and left 0-column
-    uint32_t *ii_start2 = ii2 + ii_lz_32 + 1; // skip top 0-line and left 0-column
-
-    NLMeansDSPContext dsp = {0};
-
-    ff_nlmeans_init(&dsp);
-
     if (!ii || !ii2)
         return -1;
 
+    ii_start  = ii  + ii_lz_32 + 1; // skip top 0-line and left 0-column
+    ii_start2 = ii2 + ii_lz_32 + 1; // skip top 0-line and left 0-column
+
+    ff_nlmeans_init(&dsp);
+
     for (yoff = -e; yoff <= e; yoff++) {
         for (xoff = -e; xoff <= e; xoff++) {
             printf("xoff=%d yoff=%d\n", xoff, yoff);
diff --git a/libavfilter/transform.c b/libavfilter/transform.c
index f92fc4d..f4f9e0a 100644
--- a/libavfilter/transform.c
+++ b/libavfilter/transform.c
@@ -103,12 +103,19 @@
     }
 }
 
-void avfilter_get_matrix(float x_shift, float y_shift, float angle, float zoom, float *matrix) {
-    matrix[0] = zoom * cos(angle);
+void ff_get_matrix(
+    float x_shift,
+    float y_shift,
+    float angle,
+    float scale_x,
+    float scale_y,
+    float *matrix
+) {
+    matrix[0] = scale_x * cos(angle);
     matrix[1] = -sin(angle);
     matrix[2] = x_shift;
     matrix[3] = -matrix[1];
-    matrix[4] = matrix[0];
+    matrix[4] = scale_y * cos(angle);
     matrix[5] = y_shift;
     matrix[6] = 0;
     matrix[7] = 0;
diff --git a/libavfilter/transform.h b/libavfilter/transform.h
index 07436bf..9b0c19c 100644
--- a/libavfilter/transform.h
+++ b/libavfilter/transform.h
@@ -60,20 +60,28 @@
 #define FILL_DEFAULT FILL_ORIGINAL
 
 /**
- * Get an affine transformation matrix from a given translation, rotation, and
- * zoom factor. The matrix will look like:
+ * Get an affine transformation matrix from given translation, rotation, and
+ * zoom factors. The matrix will look like:
  *
- * [ zoom * cos(angle),           -sin(angle),     x_shift,
- *          sin(angle),     zoom * cos(angle),     y_shift,
- *                   0,                     0,           1 ]
+ * [ scale_x * cos(angle),           -sin(angle),     x_shift,
+ *             sin(angle),  scale_y * cos(angle),     y_shift,
+ *                      0,                     0,           1 ]
  *
- * @param x_shift horizontal translation
- * @param y_shift vertical translation
- * @param angle   rotation in radians
- * @param zoom    scale percent (1.0 = 100%)
- * @param matrix  9-item affine transformation matrix
+ * @param x_shift   horizontal translation
+ * @param y_shift   vertical translation
+ * @param angle     rotation in radians
+ * @param scale_x   x scale percent (1.0 = 100%)
+ * @param scale_y   y scale percent (1.0 = 100%)
+ * @param matrix    9-item affine transformation matrix
  */
-void avfilter_get_matrix(float x_shift, float y_shift, float angle, float zoom, float *matrix);
+void ff_get_matrix(
+    float x_shift,
+    float y_shift,
+    float angle,
+    float scale_x,
+    float scale_y,
+    float *matrix
+);
 
 /**
  * Add two matrices together. result = m1 + m2.
diff --git a/libavfilter/transpose.h b/libavfilter/transpose.h
new file mode 100644
index 0000000..4e850ef
--- /dev/null
+++ b/libavfilter/transpose.h
@@ -0,0 +1,50 @@
+/*
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+#ifndef AVFILTER_TRANSPOSE_H
+#define AVFILTER_TRANSPOSE_H
+
+#include <stddef.h>
+#include <stdint.h>
+
+enum PassthroughType {
+    TRANSPOSE_PT_TYPE_NONE,
+    TRANSPOSE_PT_TYPE_LANDSCAPE,
+    TRANSPOSE_PT_TYPE_PORTRAIT,
+};
+
+enum TransposeDir {
+    TRANSPOSE_CCLOCK_FLIP,
+    TRANSPOSE_CLOCK,
+    TRANSPOSE_CCLOCK,
+    TRANSPOSE_CLOCK_FLIP,
+    TRANSPOSE_REVERSAL,    // rotate by half-turn
+    TRANSPOSE_HFLIP,
+    TRANSPOSE_VFLIP,
+};
+
+typedef struct TransVtable {
+    void (*transpose_8x8)(uint8_t *src, ptrdiff_t src_linesize,
+                          uint8_t *dst, ptrdiff_t dst_linesize);
+    void (*transpose_block)(uint8_t *src, ptrdiff_t src_linesize,
+                            uint8_t *dst, ptrdiff_t dst_linesize,
+                            int w, int h);
+} TransVtable;
+
+void ff_transpose_init_x86(TransVtable *v, int pixstep);
+
+#endif
diff --git a/libavfilter/trim.c b/libavfilter/trim.c
index 1dbbabb..889fe96 100644
--- a/libavfilter/trim.c
+++ b/libavfilter/trim.c
@@ -300,7 +300,8 @@
     s->nb_samples += frame->nb_samples;
     start_sample   = FFMAX(0, start_sample);
     end_sample     = FFMIN(frame->nb_samples, end_sample);
-    av_assert0(start_sample < end_sample || (start_sample == end_sample && !frame->nb_samples));
+    if (start_sample >= end_sample || !frame->nb_samples)
+        goto drop;
 
     if (start_sample) {
         AVFrame *out = ff_get_audio_buffer(ctx->outputs[0], end_sample - start_sample);
diff --git a/libavfilter/unsharp.h b/libavfilter/unsharp.h
index caff986..a60b30f 100644
--- a/libavfilter/unsharp.h
+++ b/libavfilter/unsharp.h
@@ -37,7 +37,8 @@
     int steps_y;                             ///< vertical step count
     int scalebits;                           ///< bits to shift pixel
     int32_t halfscale;                       ///< amount to add to pixel
-    uint32_t *sc[MAX_MATRIX_SIZE - 1];       ///< finite state machine storage
+    uint32_t *sr;        ///< finite state machine storage within a row
+    uint32_t **sc;       ///< finite state machine storage across rows
 } UnsharpFilterParam;
 
 typedef struct UnsharpContext {
@@ -47,6 +48,7 @@
     UnsharpFilterParam luma;   ///< luma parameters (width, height, amount)
     UnsharpFilterParam chroma; ///< chroma parameters (width, height, amount)
     int hsub, vsub;
+    int nb_threads;
     int opencl;
     int (* apply_unsharp)(AVFilterContext *ctx, AVFrame *in, AVFrame *out);
 } UnsharpContext;
diff --git a/libavfilter/v360.h b/libavfilter/v360.h
new file mode 100644
index 0000000..e9a4759
--- /dev/null
+++ b/libavfilter/v360.h
@@ -0,0 +1,190 @@
+/*
+ * Copyright (c) 2019 Eugene Lyapustin
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVFILTER_V360_H
+#define AVFILTER_V360_H
+#include "avfilter.h"
+
+enum StereoFormats {
+    STEREO_2D,
+    STEREO_SBS,
+    STEREO_TB,
+    NB_STEREO_FMTS,
+};
+
+enum Projections {
+    EQUIRECTANGULAR,
+    CUBEMAP_3_2,
+    CUBEMAP_6_1,
+    EQUIANGULAR,
+    FLAT,
+    DUAL_FISHEYE,
+    BARREL,
+    CUBEMAP_1_6,
+    STEREOGRAPHIC,
+    MERCATOR,
+    BALL,
+    HAMMER,
+    SINUSOIDAL,
+    FISHEYE,
+    PANNINI,
+    CYLINDRICAL,
+    PERSPECTIVE,
+    TETRAHEDRON,
+    BARREL_SPLIT,
+    TSPYRAMID,
+    HEQUIRECTANGULAR,
+    NB_PROJECTIONS,
+};
+
+enum InterpMethod {
+    NEAREST,
+    BILINEAR,
+    LAGRANGE9,
+    BICUBIC,
+    LANCZOS,
+    SPLINE16,
+    GAUSSIAN,
+    NB_INTERP_METHODS,
+};
+
+enum Faces {
+    TOP_LEFT,
+    TOP_MIDDLE,
+    TOP_RIGHT,
+    BOTTOM_LEFT,
+    BOTTOM_MIDDLE,
+    BOTTOM_RIGHT,
+    NB_FACES,
+};
+
+enum Direction {
+    RIGHT,  ///< Axis +X
+    LEFT,   ///< Axis -X
+    UP,     ///< Axis +Y
+    DOWN,   ///< Axis -Y
+    FRONT,  ///< Axis -Z
+    BACK,   ///< Axis +Z
+    NB_DIRECTIONS,
+};
+
+enum Rotation {
+    ROT_0,
+    ROT_90,
+    ROT_180,
+    ROT_270,
+    NB_ROTATIONS,
+};
+
+enum RotationOrder {
+    YAW,
+    PITCH,
+    ROLL,
+    NB_RORDERS,
+};
+
+typedef struct XYRemap {
+    int16_t u[4][4];
+    int16_t v[4][4];
+    float ker[4][4];
+} XYRemap;
+
+typedef struct V360Context {
+    const AVClass *class;
+    int in, out;
+    int interp;
+    int alpha;
+    int width, height;
+    char *in_forder;
+    char *out_forder;
+    char *in_frot;
+    char *out_frot;
+    char *rorder;
+
+    int in_cubemap_face_order[6];
+    int out_cubemap_direction_order[6];
+    int in_cubemap_face_rotation[6];
+    int out_cubemap_face_rotation[6];
+    int rotation_order[3];
+
+    int in_stereo, out_stereo;
+
+    float in_pad, out_pad;
+    int fin_pad, fout_pad;
+
+    float yaw, pitch, roll;
+
+    int ih_flip, iv_flip;
+    int h_flip, v_flip, d_flip;
+    int in_transpose, out_transpose;
+
+    float h_fov, v_fov, d_fov;
+    float ih_fov, iv_fov, id_fov;
+    float flat_range[2];
+    float iflat_range[2];
+
+    float rot_mat[3][3];
+
+    float input_mirror_modifier[2];
+    float output_mirror_modifier[3];
+
+    int in_width, in_height;
+    int out_width, out_height;
+
+    int pr_width[4], pr_height[4];
+
+    int in_offset_w[4], in_offset_h[4];
+    int out_offset_w[4], out_offset_h[4];
+
+    int planewidth[4], planeheight[4];
+    int inplanewidth[4], inplaneheight[4];
+    int uv_linesize[4];
+    int nb_planes;
+    int nb_allocated;
+    int elements;
+    int mask_size;
+    int max_value;
+
+    int16_t *u[2], *v[2];
+    int16_t *ker[2];
+    uint8_t *mask;
+    unsigned map[4];
+
+    int (*in_transform)(const struct V360Context *s,
+                        const float *vec, int width, int height,
+                        int16_t us[4][4], int16_t vs[4][4], float *du, float *dv);
+
+    int (*out_transform)(const struct V360Context *s,
+                         int i, int j, int width, int height,
+                         float *vec);
+
+    void (*calculate_kernel)(float du, float dv, const XYRemap *rmap,
+                             int16_t *u, int16_t *v, int16_t *ker);
+
+    int (*remap_slice)(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs);
+
+    void (*remap_line)(uint8_t *dst, int width, const uint8_t *const src, ptrdiff_t in_linesize,
+                       const int16_t *const u, const int16_t *const v, const int16_t *const ker);
+} V360Context;
+
+void ff_v360_init(V360Context *s, int depth);
+void ff_v360_init_x86(V360Context *s, int depth);
+
+#endif /* AVFILTER_V360_H */
diff --git a/libavfilter/vaapi_vpp.c b/libavfilter/vaapi_vpp.c
index c5bbc3b..b5b245c 100644
--- a/libavfilter/vaapi_vpp.c
+++ b/libavfilter/vaapi_vpp.c
@@ -234,18 +234,330 @@
     return err;
 }
 
-int ff_vaapi_vpp_colour_standard(enum AVColorSpace av_cs)
+typedef struct VAAPIColourProperties {
+    VAProcColorStandardType va_color_standard;
+
+    enum AVColorPrimaries color_primaries;
+    enum AVColorTransferCharacteristic color_trc;
+    enum AVColorSpace colorspace;
+
+    uint8_t va_chroma_sample_location;
+    uint8_t va_color_range;
+
+    enum AVColorRange color_range;
+    enum AVChromaLocation chroma_sample_location;
+} VAAPIColourProperties;
+
+static const VAAPIColourProperties vaapi_colour_standard_map[] = {
+    { VAProcColorStandardBT601,       5,  6,  5 },
+    { VAProcColorStandardBT601,       6,  6,  6 },
+    { VAProcColorStandardBT709,       1,  1,  1 },
+    { VAProcColorStandardBT470M,      4,  4,  4 },
+    { VAProcColorStandardBT470BG,     5,  5,  5 },
+    { VAProcColorStandardSMPTE170M,   6,  6,  6 },
+    { VAProcColorStandardSMPTE240M,   7,  7,  7 },
+    { VAProcColorStandardGenericFilm, 8,  1,  1 },
+#if VA_CHECK_VERSION(1, 1, 0)
+    { VAProcColorStandardSRGB,        1, 13,  0 },
+    { VAProcColorStandardXVYCC601,    1, 11,  5 },
+    { VAProcColorStandardXVYCC709,    1, 11,  1 },
+    { VAProcColorStandardBT2020,      9, 14,  9 },
+#endif
+};
+
+static void vaapi_vpp_fill_colour_standard(VAAPIColourProperties *props,
+                                           VAProcColorStandardType *vacs,
+                                           int nb_vacs)
 {
-    switch(av_cs) {
-#define CS(av, va) case AVCOL_SPC_ ## av: return VAProcColorStandard ## va;
-        CS(BT709,     BT709);
-        CS(BT470BG,   BT601);
-        CS(SMPTE170M, SMPTE170M);
-        CS(SMPTE240M, SMPTE240M);
-#undef CS
-    default:
-        return VAProcColorStandardNone;
+    const VAAPIColourProperties *t;
+    int i, j, score, best_score, worst_score;
+    VAProcColorStandardType best_standard;
+
+#if VA_CHECK_VERSION(1, 3, 0)
+    // If the driver supports explicit use of the standard values then just
+    // use them and avoid doing any mapping.  (The driver may not support
+    // some particular code point, but it still has enough information to
+    // make a better fallback choice than we do in that case.)
+    for (i = 0; i < nb_vacs; i++) {
+        if (vacs[i] == VAProcColorStandardExplicit) {
+            props->va_color_standard = VAProcColorStandardExplicit;
+            return;
+        }
     }
+#endif
+
+    // Give scores to the possible options and choose the lowest one.
+    // An exact match will score zero and therefore always be chosen, as
+    // will a partial match where all unmatched elements are explicitly
+    // unspecified.  If no options match at all then just pass "none" to
+    // the driver and let it make its own choice.
+    best_standard = VAProcColorStandardNone;
+    best_score = -1;
+    worst_score = 4 * (props->colorspace != AVCOL_SPC_UNSPECIFIED &&
+                       props->colorspace != AVCOL_SPC_RGB) +
+                  2 * (props->color_trc != AVCOL_TRC_UNSPECIFIED) +
+                      (props->color_primaries != AVCOL_PRI_UNSPECIFIED);
+
+    if (worst_score == 0) {
+        // No properties are specified, so we aren't going to be able to
+        // make a useful choice.
+        props->va_color_standard = VAProcColorStandardNone;
+        return;
+    }
+
+    for (i = 0; i < nb_vacs; i++) {
+        for (j = 0; j < FF_ARRAY_ELEMS(vaapi_colour_standard_map); j++) {
+            t = &vaapi_colour_standard_map[j];
+            if (t->va_color_standard != vacs[i])
+                continue;
+
+            score = 0;
+            if (props->colorspace != AVCOL_SPC_UNSPECIFIED &&
+                props->colorspace != AVCOL_SPC_RGB)
+                score += 4 * (props->colorspace != t->colorspace);
+            if (props->color_trc != AVCOL_TRC_UNSPECIFIED)
+                score += 2 * (props->color_trc != t->color_trc);
+            if (props->color_primaries != AVCOL_PRI_UNSPECIFIED)
+                score += (props->color_primaries != t->color_primaries);
+
+            // Only include choices which matched something.
+            if (score < worst_score &&
+                (best_score == -1 || score < best_score)) {
+                best_score    = score;
+                best_standard = t->va_color_standard;
+            }
+        }
+    }
+    props->va_color_standard = best_standard;
+}
+
+static void vaapi_vpp_fill_chroma_sample_location(VAAPIColourProperties *props)
+{
+#if VA_CHECK_VERSION(1, 1, 0)
+    static const struct {
+        enum AVChromaLocation av;
+        uint8_t va;
+    } csl_map[] = {
+        { AVCHROMA_LOC_UNSPECIFIED, VA_CHROMA_SITING_UNKNOWN },
+        { AVCHROMA_LOC_LEFT,        VA_CHROMA_SITING_VERTICAL_CENTER |
+                                    VA_CHROMA_SITING_HORIZONTAL_LEFT },
+        { AVCHROMA_LOC_CENTER,      VA_CHROMA_SITING_VERTICAL_CENTER |
+                                    VA_CHROMA_SITING_HORIZONTAL_CENTER },
+        { AVCHROMA_LOC_TOPLEFT,     VA_CHROMA_SITING_VERTICAL_TOP |
+                                    VA_CHROMA_SITING_HORIZONTAL_LEFT },
+        { AVCHROMA_LOC_TOP,         VA_CHROMA_SITING_VERTICAL_TOP |
+                                    VA_CHROMA_SITING_HORIZONTAL_CENTER },
+        { AVCHROMA_LOC_BOTTOMLEFT,  VA_CHROMA_SITING_VERTICAL_BOTTOM |
+                                    VA_CHROMA_SITING_HORIZONTAL_LEFT },
+        { AVCHROMA_LOC_BOTTOM,      VA_CHROMA_SITING_VERTICAL_BOTTOM |
+                                    VA_CHROMA_SITING_HORIZONTAL_CENTER },
+    };
+    int i;
+
+    for (i = 0; i < FF_ARRAY_ELEMS(csl_map); i++) {
+        if (props->chroma_sample_location == csl_map[i].av) {
+            props->va_chroma_sample_location = csl_map[i].va;
+            return;
+        }
+    }
+    props->va_chroma_sample_location = VA_CHROMA_SITING_UNKNOWN;
+#else
+    props->va_chroma_sample_location = 0;
+#endif
+}
+
+static void vaapi_vpp_fill_colour_range(VAAPIColourProperties *props)
+{
+#if VA_CHECK_VERSION(1, 1, 0)
+    switch (props->color_range) {
+    case AVCOL_RANGE_MPEG:
+        props->va_color_range = VA_SOURCE_RANGE_REDUCED;
+        break;
+    case AVCOL_RANGE_JPEG:
+        props->va_color_range = VA_SOURCE_RANGE_FULL;
+        break;
+    case AVCOL_RANGE_UNSPECIFIED:
+    default:
+        props->va_color_range = VA_SOURCE_RANGE_UNKNOWN;
+    }
+#else
+    props->va_color_range = 0;
+#endif
+}
+
+static void vaapi_vpp_fill_colour_properties(AVFilterContext *avctx,
+                                             VAAPIColourProperties *props,
+                                             VAProcColorStandardType *vacs,
+                                             int nb_vacs)
+{
+    vaapi_vpp_fill_colour_standard(props, vacs, nb_vacs);
+    vaapi_vpp_fill_chroma_sample_location(props);
+    vaapi_vpp_fill_colour_range(props);
+
+    av_log(avctx, AV_LOG_DEBUG, "Mapped colour properties %s %s/%s/%s %s "
+           "to VA standard %d chroma siting %#x range %#x.\n",
+           av_color_range_name(props->color_range),
+           av_color_space_name(props->colorspace),
+           av_color_primaries_name(props->color_primaries),
+           av_color_transfer_name(props->color_trc),
+           av_chroma_location_name(props->chroma_sample_location),
+           props->va_color_standard,
+           props->va_chroma_sample_location, props->va_color_range);
+}
+
+static int vaapi_vpp_frame_is_rgb(const AVFrame *frame)
+{
+    const AVHWFramesContext *hwfc;
+    const AVPixFmtDescriptor *desc;
+    av_assert0(frame->format == AV_PIX_FMT_VAAPI &&
+               frame->hw_frames_ctx);
+    hwfc = (const AVHWFramesContext*)frame->hw_frames_ctx->data;
+    desc = av_pix_fmt_desc_get(hwfc->sw_format);
+    av_assert0(desc);
+    return !!(desc->flags & AV_PIX_FMT_FLAG_RGB);
+}
+
+static int vaapi_vpp_colour_properties(AVFilterContext *avctx,
+                                       VAProcPipelineParameterBuffer *params,
+                                       const AVFrame *input_frame,
+                                       AVFrame *output_frame)
+{
+    VAAPIVPPContext *ctx = avctx->priv;
+    VAAPIColourProperties input_props, output_props;
+    VAProcPipelineCaps caps;
+    VAStatus vas;
+
+    vas = vaQueryVideoProcPipelineCaps(ctx->hwctx->display, ctx->va_context,
+                                       ctx->filter_buffers, ctx->nb_filter_buffers,
+                                       &caps);
+    if (vas != VA_STATUS_SUCCESS) {
+        av_log(avctx, AV_LOG_ERROR, "Failed to query capabilities for "
+               "colour standard support: %d (%s).\n", vas, vaErrorStr(vas));
+        return AVERROR_EXTERNAL;
+    }
+
+    input_props = (VAAPIColourProperties) {
+        .colorspace = vaapi_vpp_frame_is_rgb(input_frame)
+                ? AVCOL_SPC_RGB : input_frame->colorspace,
+        .color_primaries        = input_frame->color_primaries,
+        .color_trc              = input_frame->color_trc,
+        .color_range            = input_frame->color_range,
+        .chroma_sample_location = input_frame->chroma_location,
+    };
+
+    vaapi_vpp_fill_colour_properties(avctx, &input_props,
+                                     caps.input_color_standards,
+                                     caps.num_input_color_standards);
+
+    output_props = (VAAPIColourProperties) {
+        .colorspace = vaapi_vpp_frame_is_rgb(output_frame)
+                ? AVCOL_SPC_RGB : output_frame->colorspace,
+        .color_primaries        = output_frame->color_primaries,
+        .color_trc              = output_frame->color_trc,
+        .color_range            = output_frame->color_range,
+        .chroma_sample_location = output_frame->chroma_location,
+    };
+    vaapi_vpp_fill_colour_properties(avctx, &output_props,
+                                     caps.output_color_standards,
+                                     caps.num_output_color_standards);
+
+    // If the properties weren't filled completely in the output frame and
+    // we chose a fixed standard then fill the known values in here.
+#if VA_CHECK_VERSION(1, 3, 0)
+    if (output_props.va_color_standard != VAProcColorStandardExplicit)
+#endif
+    {
+        const VAAPIColourProperties *output_standard = NULL;
+        int i;
+
+        for (i = 0; i < FF_ARRAY_ELEMS(vaapi_colour_standard_map); i++) {
+            if (output_props.va_color_standard ==
+                vaapi_colour_standard_map[i].va_color_standard) {
+                output_standard = &vaapi_colour_standard_map[i];
+                break;
+            }
+        }
+        if (output_standard) {
+            output_frame->colorspace = vaapi_vpp_frame_is_rgb(output_frame)
+                          ? AVCOL_SPC_RGB : output_standard->colorspace;
+            output_frame->color_primaries = output_standard->color_primaries;
+            output_frame->color_trc       = output_standard->color_trc;
+        }
+    }
+
+    params->surface_color_standard = input_props.va_color_standard;
+    params->output_color_standard = output_props.va_color_standard;
+
+#if VA_CHECK_VERSION(1, 1, 0)
+    params->input_color_properties = (VAProcColorProperties) {
+        .chroma_sample_location   = input_props.va_chroma_sample_location,
+        .color_range              = input_props.va_color_range,
+#if VA_CHECK_VERSION(1, 3, 0)
+        .colour_primaries         = input_props.color_primaries,
+        .transfer_characteristics = input_props.color_trc,
+        .matrix_coefficients      = input_props.colorspace,
+#endif
+    };
+    params->output_color_properties = (VAProcColorProperties) {
+        .chroma_sample_location   = output_props.va_chroma_sample_location,
+        .color_range              = output_props.va_color_range,
+#if VA_CHECK_VERSION(1, 3, 0)
+        .colour_primaries         = output_props.color_primaries,
+        .transfer_characteristics = output_props.color_trc,
+        .matrix_coefficients      = output_props.colorspace,
+#endif
+    };
+#endif
+
+    return 0;
+}
+
+int ff_vaapi_vpp_init_params(AVFilterContext *avctx,
+                             VAProcPipelineParameterBuffer *params,
+                             const AVFrame *input_frame,
+                             AVFrame *output_frame)
+{
+    VAAPIVPPContext *ctx = avctx->priv;
+    VASurfaceID input_surface;
+    int err;
+
+    ctx->input_region = (VARectangle) {
+        .x      = input_frame->crop_left,
+        .y      = input_frame->crop_top,
+        .width  = input_frame->width -
+                 (input_frame->crop_left + input_frame->crop_right),
+        .height = input_frame->height -
+                 (input_frame->crop_top + input_frame->crop_bottom),
+    };
+    output_frame->crop_top    = 0;
+    output_frame->crop_bottom = 0;
+    output_frame->crop_left   = 0;
+    output_frame->crop_right  = 0;
+
+    input_surface = (VASurfaceID)(uintptr_t)input_frame->data[3],
+
+    *params = (VAProcPipelineParameterBuffer) {
+        .surface                 = input_surface,
+        .surface_region          = &ctx->input_region,
+        .output_region           = NULL,
+        .output_background_color = VAAPI_VPP_BACKGROUND_BLACK,
+        .pipeline_flags          = 0,
+        .filter_flags            = VA_FRAME_PICTURE,
+
+        // Filter and reference data filled by the filter itself.
+
+#if VA_CHECK_VERSION(1, 1, 0)
+        .rotation_state = VA_ROTATION_NONE,
+        .mirror_state   = VA_MIRROR_NONE,
+#endif
+    };
+
+    err = vaapi_vpp_colour_properties(avctx, params,
+                                      input_frame, output_frame);
+    if (err < 0)
+        return err;
+
+    return 0;
 }
 
 int ff_vaapi_vpp_make_param_buffers(AVFilterContext *avctx,
@@ -279,12 +591,15 @@
 
 int ff_vaapi_vpp_render_picture(AVFilterContext *avctx,
                                 VAProcPipelineParameterBuffer *params,
-                                VASurfaceID output_surface)
+                                AVFrame *output_frame)
 {
+    VAAPIVPPContext *ctx = avctx->priv;
+    VASurfaceID output_surface;
     VABufferID params_id;
     VAStatus vas;
-    int err = 0;
-    VAAPIVPPContext *ctx   = avctx->priv;
+    int err;
+
+    output_surface = (VASurfaceID)(uintptr_t)output_frame->data[3];
 
     vas = vaBeginPicture(ctx->hwctx->display,
                          ctx->va_context, output_surface);
diff --git a/libavfilter/vaapi_vpp.h b/libavfilter/vaapi_vpp.h
index 0bc3101..c3da917 100644
--- a/libavfilter/vaapi_vpp.h
+++ b/libavfilter/vaapi_vpp.h
@@ -27,6 +27,9 @@
 
 #include "avfilter.h"
 
+// ARGB black, for VAProcPipelineParameterBuffer.output_background_color.
+#define VAAPI_VPP_BACKGROUND_BLACK 0xff000000
+
 typedef struct VAAPIVPPContext {
     const AVClass *class;
 
@@ -39,6 +42,7 @@
 
     AVBufferRef       *input_frames_ref;
     AVHWFramesContext *input_frames;
+    VARectangle        input_region;
 
     enum AVPixelFormat output_format;
     int output_width;   // computed width
@@ -64,7 +68,10 @@
 
 int ff_vaapi_vpp_config_output(AVFilterLink *outlink);
 
-int ff_vaapi_vpp_colour_standard(enum AVColorSpace av_cs);
+int ff_vaapi_vpp_init_params(AVFilterContext *avctx,
+                             VAProcPipelineParameterBuffer *params,
+                             const AVFrame *input_frame,
+                             AVFrame *output_frame);
 
 int ff_vaapi_vpp_make_param_buffers(AVFilterContext *avctx,
                                     int type,
@@ -74,6 +81,6 @@
 
 int ff_vaapi_vpp_render_picture(AVFilterContext *avctx,
                                 VAProcPipelineParameterBuffer *params,
-                                VASurfaceID output_surface);
+                                AVFrame *output_frame);
 
 #endif /* AVFILTER_VAAPI_VPP_H */
diff --git a/libavfilter/version.h b/libavfilter/version.h
index 30e961b..8b06e70 100644
--- a/libavfilter/version.h
+++ b/libavfilter/version.h
@@ -30,8 +30,9 @@
 #include "libavutil/version.h"
 
 #define LIBAVFILTER_VERSION_MAJOR   7
-#define LIBAVFILTER_VERSION_MINOR  33
-#define LIBAVFILTER_VERSION_MICRO 101
+#define LIBAVFILTER_VERSION_MINOR  79
+#define LIBAVFILTER_VERSION_MICRO 100
+
 
 #define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \
                                                LIBAVFILTER_VERSION_MINOR, \
@@ -58,6 +59,9 @@
 #ifndef FF_API_FILTER_GET_SET
 #define FF_API_FILTER_GET_SET               (LIBAVFILTER_VERSION_MAJOR < 8)
 #endif
+#ifndef FF_API_SWS_PARAM_OPTION
+#define FF_API_SWS_PARAM_OPTION             (LIBAVFILTER_VERSION_MAJOR < 8)
+#endif
 #ifndef FF_API_NEXT
 #define FF_API_NEXT                         (LIBAVFILTER_VERSION_MAJOR < 8)
 #endif
diff --git a/libavfilter/vf_addroi.c b/libavfilter/vf_addroi.c
new file mode 100644
index 0000000..489998c
--- /dev/null
+++ b/libavfilter/vf_addroi.c
@@ -0,0 +1,269 @@
+/*
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "libavutil/avassert.h"
+#include "libavutil/eval.h"
+#include "libavutil/opt.h"
+#include "avfilter.h"
+#include "internal.h"
+
+enum {
+    X, Y, W, H,
+    NB_PARAMS,
+};
+static const char *addroi_param_names[] = {
+    "x", "y", "w", "h",
+};
+
+enum {
+    VAR_IW,
+    VAR_IH,
+    NB_VARS,
+};
+static const char *const addroi_var_names[] = {
+    "iw",
+    "ih",
+};
+
+typedef struct AddROIContext {
+    const AVClass *class;
+
+    char   *region_str[NB_PARAMS];
+    AVExpr *region_expr[NB_PARAMS];
+
+    int region[NB_PARAMS];
+    AVRational qoffset;
+
+    int clear;
+} AddROIContext;
+
+static int addroi_config_input(AVFilterLink *inlink)
+{
+    AVFilterContext *avctx = inlink->dst;
+    AddROIContext     *ctx = avctx->priv;
+    int i;
+    double vars[NB_VARS];
+    double val;
+
+    vars[VAR_IW] = inlink->w;
+    vars[VAR_IH] = inlink->h;
+
+    for (i = 0; i < NB_PARAMS; i++) {
+        int max_value;
+        switch (i) {
+        case X: max_value = inlink->w;                  break;
+        case Y: max_value = inlink->h;                  break;
+        case W: max_value = inlink->w - ctx->region[X]; break;
+        case H: max_value = inlink->h - ctx->region[Y]; break;
+        }
+
+        val = av_expr_eval(ctx->region_expr[i], vars, NULL);
+        if (val < 0.0) {
+            av_log(avctx, AV_LOG_WARNING, "Calculated value %g for %s is "
+                   "less than zero - using zero instead.\n", val,
+                   addroi_param_names[i]);
+            val = 0.0;
+        } else if (val > max_value) {
+            av_log(avctx, AV_LOG_WARNING, "Calculated value %g for %s is "
+                   "greater than maximum allowed value %d - "
+                   "using %d instead.\n", val, addroi_param_names[i],
+                   max_value, max_value);
+            val = max_value;
+        }
+        ctx->region[i] = val;
+    }
+
+    return 0;
+}
+
+static int addroi_filter_frame(AVFilterLink *inlink, AVFrame *frame)
+{
+    AVFilterContext *avctx = inlink->dst;
+    AVFilterLink  *outlink = avctx->outputs[0];
+    AddROIContext     *ctx = avctx->priv;
+    AVRegionOfInterest *roi;
+    AVFrameSideData *sd;
+    int err;
+
+    if (ctx->clear) {
+        av_frame_remove_side_data(frame, AV_FRAME_DATA_REGIONS_OF_INTEREST);
+        sd = NULL;
+    } else {
+        sd = av_frame_get_side_data(frame, AV_FRAME_DATA_REGIONS_OF_INTEREST);
+    }
+    if (sd) {
+        const AVRegionOfInterest *old_roi;
+        uint32_t old_roi_size;
+        AVBufferRef *roi_ref;
+        int nb_roi, i;
+
+        old_roi = (const AVRegionOfInterest*)sd->data;
+        old_roi_size = old_roi->self_size;
+        av_assert0(old_roi_size && sd->size % old_roi_size == 0);
+        nb_roi = sd->size / old_roi_size + 1;
+
+        roi_ref = av_buffer_alloc(sizeof(*roi) * nb_roi);
+        if (!roi_ref) {
+            err = AVERROR(ENOMEM);
+            goto fail;
+        }
+        roi = (AVRegionOfInterest*)roi_ref->data;
+
+        for (i = 0; i < nb_roi - 1; i++) {
+            old_roi = (const AVRegionOfInterest*)
+                (sd->data + old_roi_size * i);
+
+            roi[i] = (AVRegionOfInterest) {
+                .self_size = sizeof(*roi),
+                .top       = old_roi->top,
+                .bottom    = old_roi->bottom,
+                .left      = old_roi->left,
+                .right     = old_roi->right,
+                .qoffset   = old_roi->qoffset,
+            };
+        }
+
+        roi[nb_roi - 1] = (AVRegionOfInterest) {
+            .self_size = sizeof(*roi),
+            .top       = ctx->region[Y],
+            .bottom    = ctx->region[Y] + ctx->region[H],
+            .left      = ctx->region[X],
+            .right     = ctx->region[X] + ctx->region[W],
+            .qoffset   = ctx->qoffset,
+        };
+
+        av_frame_remove_side_data(frame, AV_FRAME_DATA_REGIONS_OF_INTEREST);
+
+        sd = av_frame_new_side_data_from_buf(frame,
+                                             AV_FRAME_DATA_REGIONS_OF_INTEREST,
+                                             roi_ref);
+        if (!sd) {
+            av_buffer_unref(&roi_ref);
+            err = AVERROR(ENOMEM);
+            goto fail;
+        }
+
+    } else {
+        sd = av_frame_new_side_data(frame, AV_FRAME_DATA_REGIONS_OF_INTEREST,
+                                    sizeof(AVRegionOfInterest));
+        if (!sd) {
+            err = AVERROR(ENOMEM);
+            goto fail;
+        }
+        roi = (AVRegionOfInterest*)sd->data;
+        *roi = (AVRegionOfInterest) {
+            .self_size = sizeof(*roi),
+            .top       = ctx->region[Y],
+            .bottom    = ctx->region[Y] + ctx->region[H],
+            .left      = ctx->region[X],
+            .right     = ctx->region[X] + ctx->region[W],
+            .qoffset   = ctx->qoffset,
+        };
+    }
+
+    return ff_filter_frame(outlink, frame);
+
+fail:
+    av_frame_free(&frame);
+    return err;
+}
+
+static av_cold int addroi_init(AVFilterContext *avctx)
+{
+    AddROIContext *ctx = avctx->priv;
+    int i, err;
+
+    for (i = 0; i < NB_PARAMS; i++) {
+        err = av_expr_parse(&ctx->region_expr[i], ctx->region_str[i],
+                            addroi_var_names, NULL, NULL, NULL, NULL,
+                            0, avctx);
+        if (err < 0) {
+            av_log(ctx, AV_LOG_ERROR,
+                   "Error parsing %s expression '%s'.\n",
+                   addroi_param_names[i], ctx->region_str[i]);
+            return err;
+        }
+    }
+
+    return 0;
+}
+
+static av_cold void addroi_uninit(AVFilterContext *avctx)
+{
+    AddROIContext *ctx = avctx->priv;
+    int i;
+
+    for (i = 0; i < NB_PARAMS; i++) {
+        av_expr_free(ctx->region_expr[i]);
+        ctx->region_expr[i] = NULL;
+    }
+}
+
+#define OFFSET(x) offsetof(AddROIContext, x)
+#define FLAGS AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_FILTERING_PARAM
+static const AVOption addroi_options[] = {
+    { "x", "Region distance from left edge of frame.",
+      OFFSET(region_str[X]), AV_OPT_TYPE_STRING, { .str = "0" }, .flags = FLAGS },
+    { "y", "Region distance from top edge of frame.",
+      OFFSET(region_str[Y]), AV_OPT_TYPE_STRING, { .str = "0" }, .flags = FLAGS },
+    { "w", "Region width.",
+      OFFSET(region_str[W]), AV_OPT_TYPE_STRING, { .str = "0" }, .flags = FLAGS },
+    { "h", "Region height.",
+      OFFSET(region_str[H]), AV_OPT_TYPE_STRING, { .str = "0" }, .flags = FLAGS },
+
+    { "qoffset", "Quantisation offset to apply in the region.",
+      OFFSET(qoffset), AV_OPT_TYPE_RATIONAL, { .dbl = -0.1 }, -1, +1, FLAGS },
+
+    { "clear", "Remove any existing regions of interest before adding the new one.",
+      OFFSET(clear), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, FLAGS },
+
+    { NULL }
+};
+
+AVFILTER_DEFINE_CLASS(addroi);
+
+static const AVFilterPad addroi_inputs[] = {
+    {
+        .name         = "default",
+        .type         = AVMEDIA_TYPE_VIDEO,
+        .config_props = addroi_config_input,
+        .filter_frame = addroi_filter_frame,
+    },
+    { NULL }
+};
+
+static const AVFilterPad addroi_outputs[] = {
+    {
+        .name = "default",
+        .type = AVMEDIA_TYPE_VIDEO,
+    },
+    { NULL }
+};
+
+AVFilter ff_vf_addroi = {
+    .name        = "addroi",
+    .description = NULL_IF_CONFIG_SMALL("Add region of interest to frame."),
+    .init        = addroi_init,
+    .uninit      = addroi_uninit,
+
+    .priv_size   = sizeof(AddROIContext),
+    .priv_class  = &addroi_class,
+
+    .inputs      = addroi_inputs,
+    .outputs     = addroi_outputs,
+};
diff --git a/libavfilter/vf_alphamerge.c b/libavfilter/vf_alphamerge.c
index 45fa340..85b6d9b 100644
--- a/libavfilter/vf_alphamerge.c
+++ b/libavfilter/vf_alphamerge.c
@@ -26,30 +26,26 @@
 #include <string.h>
 
 #include "libavutil/imgutils.h"
+#include "libavutil/opt.h"
 #include "libavutil/pixfmt.h"
 #include "avfilter.h"
-#include "bufferqueue.h"
 #include "drawutils.h"
 #include "formats.h"
+#include "filters.h"
 #include "internal.h"
 #include "video.h"
 
 enum { Y, U, V, A };
 
 typedef struct AlphaMergeContext {
+    const AVClass *class;
+
     int is_packed_rgb;
     uint8_t rgba_map[4];
-    struct FFBufQueue queue_main;
-    struct FFBufQueue queue_alpha;
+    AVFrame *main_frame;
+    AVFrame *alpha_frame;
 } AlphaMergeContext;
 
-static av_cold void uninit(AVFilterContext *ctx)
-{
-    AlphaMergeContext *merge = ctx->priv;
-    ff_bufqueue_discard_all(&merge->queue_main);
-    ff_bufqueue_discard_all(&merge->queue_alpha);
-}
-
 static int query_formats(AVFilterContext *ctx)
 {
     static const enum AVPixelFormat main_fmts[] = {
@@ -84,9 +80,9 @@
 
 static int config_input_main(AVFilterLink *inlink)
 {
-    AlphaMergeContext *merge = inlink->dst->priv;
-    merge->is_packed_rgb =
-        ff_fill_rgba_map(merge->rgba_map, inlink->format) >= 0 &&
+    AlphaMergeContext *s = inlink->dst->priv;
+    s->is_packed_rgb =
+        ff_fill_rgba_map(s->rgba_map, inlink->format) >= 0 &&
         inlink->format != AV_PIX_FMT_GBRAP;
     return 0;
 }
@@ -116,15 +112,15 @@
                        AVFrame *main_buf,
                        AVFrame *alpha_buf)
 {
-    AlphaMergeContext *merge = ctx->priv;
+    AlphaMergeContext *s = ctx->priv;
     int h = main_buf->height;
 
-    if (merge->is_packed_rgb) {
+    if (s->is_packed_rgb) {
         int x, y;
         uint8_t *pin, *pout;
         for (y = 0; y < h; y++) {
             pin = alpha_buf->data[0] + y * alpha_buf->linesize[0];
-            pout = main_buf->data[0] + y * main_buf->linesize[0] + merge->rgba_map[A];
+            pout = main_buf->data[0] + y * main_buf->linesize[0] + s->rgba_map[A];
             for (x = 0; x < main_buf->width; x++) {
                 *pout = *pin;
                 pin += 1;
@@ -140,44 +136,53 @@
     }
 }
 
-static int filter_frame(AVFilterLink *inlink, AVFrame *buf)
+static int activate(AVFilterContext *ctx)
 {
-    AVFilterContext *ctx = inlink->dst;
-    AlphaMergeContext *merge = ctx->priv;
+    AVFilterLink *outlink = ctx->outputs[0];
+    AlphaMergeContext *s = ctx->priv;
+    int ret;
 
-    int ret = 0;
-    int is_alpha = (inlink == ctx->inputs[1]);
-    struct FFBufQueue *queue =
-        (is_alpha ? &merge->queue_alpha : &merge->queue_main);
-    ff_bufqueue_add(ctx, queue, buf);
+    FF_FILTER_FORWARD_STATUS_BACK_ALL(outlink, ctx);
 
-    do {
-        AVFrame *main_buf, *alpha_buf;
+    if (!s->main_frame) {
+        ret = ff_inlink_consume_frame(ctx->inputs[0], &s->main_frame);
+        if (ret < 0)
+            return ret;
+    }
 
-        if (!ff_bufqueue_peek(&merge->queue_main, 0) ||
-            !ff_bufqueue_peek(&merge->queue_alpha, 0)) break;
+    if (!s->alpha_frame) {
+        ret = ff_inlink_consume_frame(ctx->inputs[1], &s->alpha_frame);
+        if (ret < 0)
+            return ret;
+    }
 
-        main_buf = ff_bufqueue_get(&merge->queue_main);
-        alpha_buf = ff_bufqueue_get(&merge->queue_alpha);
-
-        draw_frame(ctx, main_buf, alpha_buf);
-        ret = ff_filter_frame(ctx->outputs[0], main_buf);
-        av_frame_free(&alpha_buf);
-    } while (ret >= 0);
-    return ret;
-}
-
-static int request_frame(AVFilterLink *outlink)
-{
-    AVFilterContext *ctx = outlink->src;
-    AlphaMergeContext *merge = ctx->priv;
-    int in, ret;
-
-    in = ff_bufqueue_peek(&merge->queue_main, 0) ? 1 : 0;
-    ret = ff_request_frame(ctx->inputs[in]);
-    if (ret < 0)
+    if (s->main_frame && s->alpha_frame) {
+        if (!ctx->is_disabled)
+            draw_frame(ctx, s->main_frame, s->alpha_frame);
+        ret = ff_filter_frame(outlink, s->main_frame);
+        av_frame_free(&s->alpha_frame);
+        s->main_frame = NULL;
         return ret;
-    return 0;
+    }
+
+    FF_FILTER_FORWARD_STATUS(ctx->inputs[0], outlink);
+    FF_FILTER_FORWARD_STATUS(ctx->inputs[1], outlink);
+
+    if (ff_outlink_frame_wanted(ctx->outputs[0]) &&
+        !ff_outlink_get_status(ctx->inputs[0]) &&
+        !s->main_frame) {
+        ff_inlink_request_frame(ctx->inputs[0]);
+        return 0;
+    }
+
+    if (ff_outlink_frame_wanted(ctx->outputs[0]) &&
+        !ff_outlink_get_status(ctx->inputs[1]) &&
+        !s->alpha_frame) {
+        ff_inlink_request_frame(ctx->inputs[1]);
+        return 0;
+    }
+
+    return FFERROR_NOT_READY;
 }
 
 static const AVFilterPad alphamerge_inputs[] = {
@@ -185,12 +190,10 @@
         .name             = "main",
         .type             = AVMEDIA_TYPE_VIDEO,
         .config_props     = config_input_main,
-        .filter_frame     = filter_frame,
         .needs_writable   = 1,
     },{
         .name             = "alpha",
         .type             = AVMEDIA_TYPE_VIDEO,
-        .filter_frame     = filter_frame,
     },
     { NULL }
 };
@@ -200,18 +203,25 @@
         .name          = "default",
         .type          = AVMEDIA_TYPE_VIDEO,
         .config_props  = config_output,
-        .request_frame = request_frame,
     },
     { NULL }
 };
 
+static const AVOption alphamerge_options[] = {
+    { NULL }
+};
+
+AVFILTER_DEFINE_CLASS(alphamerge);
+
 AVFilter ff_vf_alphamerge = {
     .name           = "alphamerge",
     .description    = NULL_IF_CONFIG_SMALL("Copy the luma value of the second "
                       "input into the alpha channel of the first input."),
-    .uninit         = uninit,
     .priv_size      = sizeof(AlphaMergeContext),
+    .priv_class     = &alphamerge_class,
     .query_formats  = query_formats,
     .inputs         = alphamerge_inputs,
     .outputs        = alphamerge_outputs,
+    .activate       = activate,
+    .flags          = AVFILTER_FLAG_SUPPORT_TIMELINE_INTERNAL,
 };
diff --git a/libavfilter/vf_amplify.c b/libavfilter/vf_amplify.c
index 08243ad..84d9765 100644
--- a/libavfilter/vf_amplify.c
+++ b/libavfilter/vf_amplify.c
@@ -34,6 +34,7 @@
     int radius;
     float factor;
     float threshold;
+    float tolerance;
     int planes;
 
     int llimit;
@@ -70,6 +71,11 @@
         AV_PIX_FMT_YUV420P16, AV_PIX_FMT_YUV422P16, AV_PIX_FMT_YUV444P16,
         AV_PIX_FMT_GBRP, AV_PIX_FMT_GBRP9, AV_PIX_FMT_GBRP10,
         AV_PIX_FMT_GBRP12, AV_PIX_FMT_GBRP14, AV_PIX_FMT_GBRP16,
+        AV_PIX_FMT_YUVA420P,  AV_PIX_FMT_YUVA422P,   AV_PIX_FMT_YUVA444P,
+        AV_PIX_FMT_YUVA444P9, AV_PIX_FMT_YUVA444P10, AV_PIX_FMT_YUVA444P12, AV_PIX_FMT_YUVA444P16,
+        AV_PIX_FMT_YUVA422P9, AV_PIX_FMT_YUVA422P10, AV_PIX_FMT_YUVA422P12, AV_PIX_FMT_YUVA422P16,
+        AV_PIX_FMT_YUVA420P9, AV_PIX_FMT_YUVA420P10, AV_PIX_FMT_YUVA420P16,
+        AV_PIX_FMT_GBRAP,     AV_PIX_FMT_GBRAP10,    AV_PIX_FMT_GBRAP12,    AV_PIX_FMT_GBRAP16,
         AV_PIX_FMT_NONE
     };
     AVFilterFormats *formats = ff_make_format_list(pixel_fmts);
@@ -104,6 +110,7 @@
     const int radius = s->radius;
     const int nb_inputs = s->nb_inputs;
     const float threshold = s->threshold;
+    const float tolerance = s->tolerance;
     const float factor = s->factor;
     const int llimit = s->llimit;
     const int hlimit = s->hlimit;
@@ -136,7 +143,7 @@
 
                     avg = sum / (float)nb_inputs;
                     diff = src - avg;
-                    if (fabsf(diff) < threshold) {
+                    if (fabsf(diff) < threshold && fabsf(diff) > tolerance) {
                         int amp;
                         if (diff < 0) {
                             amp = -FFMIN(FFABS(diff * factor), llimit);
@@ -179,7 +186,7 @@
                     avg = sum / (float)nb_inputs;
                     diff = src - avg;
 
-                    if (fabsf(diff) < threshold) {
+                    if (fabsf(diff) < threshold && fabsf(diff) > tolerance) {
                         int amp;
                         if (diff < 0) {
                             amp = -FFMIN(FFABS(diff * factor), llimit);
@@ -229,7 +236,7 @@
 
     if (s->frames) {
         for (i = 0; i < s->nb_frames; i++)
-           av_frame_free(&s->frames[i]);
+            av_frame_free(&s->frames[i]);
     }
     av_freep(&s->frames);
 }
@@ -252,28 +259,37 @@
         s->frames[s->nb_inputs - 1] = in;
     }
 
-    out = ff_get_video_buffer(outlink, outlink->w, outlink->h);
-    if (!out)
-        return AVERROR(ENOMEM);
-    out->pts = s->frames[0]->pts;
+    if (!ctx->is_disabled) {
+        out = ff_get_video_buffer(outlink, outlink->w, outlink->h);
+        if (!out)
+            return AVERROR(ENOMEM);
+        av_frame_copy_props(out, s->frames[0]);
 
-    td.out = out;
-    td.in = s->frames;
-    ctx->internal->execute(ctx, amplify_frame, &td, NULL, FFMIN(s->height[1], ff_filter_get_nb_threads(ctx)));
+        td.out = out;
+        td.in = s->frames;
+        ctx->internal->execute(ctx, amplify_frame, &td, NULL, FFMIN(s->height[1], ff_filter_get_nb_threads(ctx)));
+    } else {
+        out = av_frame_clone(s->frames[s->radius]);
+        if (!out)
+            return AVERROR(ENOMEM);
+        out->pts = s->frames[0]->pts;
+    }
 
     return ff_filter_frame(outlink, out);
 }
 
 #define OFFSET(x) offsetof(AmplifyContext, x)
 #define FLAGS AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_FILTERING_PARAM
+#define VFT AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_FILTERING_PARAM | AV_OPT_FLAG_RUNTIME_PARAM
 
 static const AVOption amplify_options[] = {
     { "radius", "set radius", OFFSET(radius), AV_OPT_TYPE_INT, {.i64=2}, 1, 63, .flags = FLAGS },
-    { "factor", "set factor", OFFSET(factor), AV_OPT_TYPE_FLOAT, {.dbl=2}, 0, UINT16_MAX, .flags = FLAGS },
-    { "threshold", "set threshold", OFFSET(threshold), AV_OPT_TYPE_FLOAT, {.dbl=10}, 0, UINT16_MAX, .flags = FLAGS },
-    { "low", "set low limit for amplification", OFFSET(llimit), AV_OPT_TYPE_INT, {.i64=UINT16_MAX}, 0, UINT16_MAX, .flags = FLAGS },
-    { "high", "set high limit for amplification", OFFSET(hlimit), AV_OPT_TYPE_INT, {.i64=UINT16_MAX}, 0, UINT16_MAX, .flags = FLAGS },
-    { "planes", "set what planes to filter", OFFSET(planes), AV_OPT_TYPE_FLAGS, {.i64=7},    0, 15,  FLAGS },
+    { "factor", "set factor", OFFSET(factor), AV_OPT_TYPE_FLOAT, {.dbl=2}, 0, UINT16_MAX, .flags = VFT },
+    { "threshold", "set threshold", OFFSET(threshold), AV_OPT_TYPE_FLOAT, {.dbl=10}, 0, UINT16_MAX, .flags = VFT },
+    { "tolerance", "set tolerance", OFFSET(tolerance), AV_OPT_TYPE_FLOAT, {.dbl=0}, 0, UINT16_MAX, .flags = VFT },
+    { "low", "set low limit for amplification", OFFSET(llimit), AV_OPT_TYPE_INT, {.i64=UINT16_MAX}, 0, UINT16_MAX, .flags = VFT },
+    { "high", "set high limit for amplification", OFFSET(hlimit), AV_OPT_TYPE_INT, {.i64=UINT16_MAX}, 0, UINT16_MAX, .flags = VFT },
+    { "planes", "set what planes to filter", OFFSET(planes), AV_OPT_TYPE_FLAGS, {.i64=7},    0, 15,  VFT },
     { NULL },
 };
 
@@ -307,5 +323,6 @@
     .inputs        = inputs,
     .init          = init,
     .uninit        = uninit,
-    .flags         = AVFILTER_FLAG_SLICE_THREADS,
+    .flags         = AVFILTER_FLAG_SUPPORT_TIMELINE_INTERNAL | AVFILTER_FLAG_SLICE_THREADS,
+    .process_command = ff_filter_process_command,
 };
diff --git a/libavfilter/vf_aspect.c b/libavfilter/vf_aspect.c
index c042698..70e7fed 100644
--- a/libavfilter/vf_aspect.c
+++ b/libavfilter/vf_aspect.c
@@ -78,7 +78,7 @@
 static inline void compute_dar(AVRational *dar, AVRational sar, int w, int h)
 {
     if (sar.num && sar.den) {
-        av_reduce(&dar->num, &dar->den, sar.num * w, sar.den * h, INT_MAX);
+        av_reduce(&dar->num, &dar->den, sar.num * (int64_t)w, sar.den * (int64_t)h, INT_MAX);
     } else {
         av_reduce(&dar->num, &dar->den, w, h, INT_MAX);
     }
diff --git a/libavfilter/vf_atadenoise.c b/libavfilter/vf_atadenoise.c
index b7d958b..e1a8220 100644
--- a/libavfilter/vf_atadenoise.c
+++ b/libavfilter/vf_atadenoise.c
@@ -33,6 +33,7 @@
 #define FF_BUFQUEUE_SIZE 129
 #include "bufferqueue.h"
 
+#include "atadenoise.h"
 #include "formats.h"
 #include "internal.h"
 #include "video.h"
@@ -44,6 +45,7 @@
 
     float fthra[4], fthrb[4];
     int thra[4], thrb[4];
+    int algorithm;
 
     int planes;
     int nb_planes;
@@ -57,10 +59,13 @@
     int available;
 
     int (*filter_slice)(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs);
+
+    ATADenoiseDSPContext dsp;
 } ATADenoiseContext;
 
 #define OFFSET(x) offsetof(ATADenoiseContext, x)
-#define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
+#define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_RUNTIME_PARAM
+#define VF AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
 
 static const AVOption atadenoise_options[] = {
     { "0a", "set threshold A for 1st plane", OFFSET(fthra[0]), AV_OPT_TYPE_FLOAT, {.dbl=0.02}, 0, 0.3, FLAGS },
@@ -69,8 +74,11 @@
     { "1b", "set threshold B for 2nd plane", OFFSET(fthrb[1]), AV_OPT_TYPE_FLOAT, {.dbl=0.04}, 0, 5.0, FLAGS },
     { "2a", "set threshold A for 3rd plane", OFFSET(fthra[2]), AV_OPT_TYPE_FLOAT, {.dbl=0.02}, 0, 0.3, FLAGS },
     { "2b", "set threshold B for 3rd plane", OFFSET(fthrb[2]), AV_OPT_TYPE_FLOAT, {.dbl=0.04}, 0, 5.0, FLAGS },
-    { "s",  "set how many frames to use",    OFFSET(size),     AV_OPT_TYPE_INT,   {.i64=9},   5, SIZE, FLAGS },
+    { "s",  "set how many frames to use",    OFFSET(size),     AV_OPT_TYPE_INT,   {.i64=9},   5, SIZE, VF    },
     { "p",  "set what planes to filter",     OFFSET(planes),   AV_OPT_TYPE_FLAGS, {.i64=7},    0, 15,  FLAGS },
+    { "a",  "set variant of algorithm",      OFFSET(algorithm),AV_OPT_TYPE_INT,   {.i64=PARALLEL},  0, NB_ATAA-1, FLAGS, "a" },
+    { "p",  "parallel",                      0,                AV_OPT_TYPE_CONST, {.i64=PARALLEL},  0, 0,         FLAGS, "a" },
+    { "s",  "serial",                        0,                AV_OPT_TYPE_CONST, {.i64=SERIAL},    0, 0,         FLAGS, "a" },
     { NULL }
 };
 
@@ -100,6 +108,11 @@
         AV_PIX_FMT_YUV420P16, AV_PIX_FMT_YUV422P16, AV_PIX_FMT_YUV444P16,
         AV_PIX_FMT_GBRP, AV_PIX_FMT_GBRP9, AV_PIX_FMT_GBRP10,
         AV_PIX_FMT_GBRP12, AV_PIX_FMT_GBRP14, AV_PIX_FMT_GBRP16,
+        AV_PIX_FMT_YUVA420P,  AV_PIX_FMT_YUVA422P,   AV_PIX_FMT_YUVA444P,
+        AV_PIX_FMT_YUVA444P9, AV_PIX_FMT_YUVA444P10, AV_PIX_FMT_YUVA444P12, AV_PIX_FMT_YUVA444P16,
+        AV_PIX_FMT_YUVA422P9, AV_PIX_FMT_YUVA422P10, AV_PIX_FMT_YUVA422P12, AV_PIX_FMT_YUVA422P16,
+        AV_PIX_FMT_YUVA420P9, AV_PIX_FMT_YUVA420P10, AV_PIX_FMT_YUVA420P16,
+        AV_PIX_FMT_GBRAP,     AV_PIX_FMT_GBRAP10,    AV_PIX_FMT_GBRAP12,    AV_PIX_FMT_GBRAP16,
         AV_PIX_FMT_NONE
     };
     AVFilterFormats *formats = ff_make_format_list(pixel_fmts);
@@ -125,7 +138,103 @@
     AVFrame *in, *out;
 } ThreadData;
 
-static int filter_slice8(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
+#define FILTER_ROW(type, name)                                              \
+static void filter_row##name(const uint8_t *ssrc, uint8_t *ddst,            \
+                             const uint8_t *ssrcf[SIZE],                    \
+                             int w, int mid, int size,                      \
+                             int thra, int thrb)                            \
+{                                                                           \
+    const type *src = (const type *)ssrc;                                   \
+    const type **srcf = (const type **)ssrcf;                               \
+    type *dst = (type *)ddst;                                               \
+                                                                            \
+    for (int x = 0; x < w; x++) {                                           \
+       const int srcx = src[x];                                             \
+       unsigned lsumdiff = 0, rsumdiff = 0;                                 \
+       unsigned ldiff, rdiff;                                               \
+       unsigned sum = srcx;                                                 \
+       int l = 0, r = 0;                                                    \
+       int srcjx, srcix;                                                    \
+                                                                            \
+       for (int j = mid - 1, i = mid + 1; j >= 0 && i < size; j--, i++) {   \
+           srcjx = srcf[j][x];                                              \
+                                                                            \
+           ldiff = FFABS(srcx - srcjx);                                     \
+           lsumdiff += ldiff;                                               \
+           if (ldiff > thra ||                                              \
+               lsumdiff > thrb)                                             \
+               break;                                                       \
+           l++;                                                             \
+           sum += srcjx;                                                    \
+                                                                            \
+           srcix = srcf[i][x];                                              \
+                                                                            \
+           rdiff = FFABS(srcx - srcix);                                     \
+           rsumdiff += rdiff;                                               \
+           if (rdiff > thra ||                                              \
+               rsumdiff > thrb)                                             \
+               break;                                                       \
+           r++;                                                             \
+           sum += srcix;                                                    \
+       }                                                                    \
+                                                                            \
+       dst[x] = (sum + ((r + l + 1) >> 1)) / (r + l + 1);                   \
+   }                                                                        \
+}
+
+FILTER_ROW(uint8_t, 8)
+FILTER_ROW(uint16_t, 16)
+
+#define FILTER_ROW_SERIAL(type, name)                                       \
+static void filter_row##name##_serial(const uint8_t *ssrc, uint8_t *ddst,   \
+                                      const uint8_t *ssrcf[SIZE],           \
+                                      int w, int mid, int size,             \
+                                      int thra, int thrb)                   \
+{                                                                           \
+    const type *src = (const type *)ssrc;                                   \
+    const type **srcf = (const type **)ssrcf;                               \
+    type *dst = (type *)ddst;                                               \
+                                                                            \
+    for (int x = 0; x < w; x++) {                                           \
+       const int srcx = src[x];                                             \
+       unsigned lsumdiff = 0, rsumdiff = 0;                                 \
+       unsigned ldiff, rdiff;                                               \
+       unsigned sum = srcx;                                                 \
+       int l = 0, r = 0;                                                    \
+       int srcjx, srcix;                                                    \
+                                                                            \
+       for (int j = mid - 1; j >= 0; j--) {                                 \
+           srcjx = srcf[j][x];                                              \
+                                                                            \
+           ldiff = FFABS(srcx - srcjx);                                     \
+           lsumdiff += ldiff;                                               \
+           if (ldiff > thra ||                                              \
+               lsumdiff > thrb)                                             \
+               break;                                                       \
+           l++;                                                             \
+           sum += srcjx;                                                    \
+       }                                                                    \
+                                                                            \
+       for (int i = mid + 1; i < size; i++) {                               \
+           srcix = srcf[i][x];                                              \
+                                                                            \
+           rdiff = FFABS(srcx - srcix);                                     \
+           rsumdiff += rdiff;                                               \
+           if (rdiff > thra ||                                              \
+               rsumdiff > thrb)                                             \
+               break;                                                       \
+           r++;                                                             \
+           sum += srcix;                                                    \
+       }                                                                    \
+                                                                            \
+       dst[x] = (sum + ((r + l + 1) >> 1)) / (r + l + 1);                   \
+   }                                                                        \
+}
+
+FILTER_ROW_SERIAL(uint8_t, 8)
+FILTER_ROW_SERIAL(uint16_t, 16)
+
+static int filter_slice(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
 {
     ATADenoiseContext *s = ctx->priv;
     ThreadData *td = arg;
@@ -133,7 +242,7 @@
     AVFrame *out = td->out;
     const int size = s->size;
     const int mid = s->mid;
-    int p, x, y, i, j;
+    int p, y, i;
 
     for (p = 0; p < s->nb_planes; p++) {
         const int h = s->planeheight[p];
@@ -158,38 +267,7 @@
             srcf[i] = data[i] + slice_start * linesize[i];
 
         for (y = slice_start; y < slice_end; y++) {
-            for (x = 0; x < w; x++) {
-                const int srcx = src[x];
-                unsigned lsumdiff = 0, rsumdiff = 0;
-                unsigned ldiff, rdiff;
-                unsigned sum = srcx;
-                int l = 0, r = 0;
-                int srcjx, srcix;
-
-                for (j = mid - 1, i = mid + 1; j >= 0 && i < size; j--, i++) {
-                    srcjx = srcf[j][x];
-
-                    ldiff = FFABS(srcx - srcjx);
-                    lsumdiff += ldiff;
-                    if (ldiff > thra ||
-                        lsumdiff > thrb)
-                        break;
-                    l++;
-                    sum += srcjx;
-
-                    srcix = srcf[i][x];
-
-                    rdiff = FFABS(srcx - srcix);
-                    rsumdiff += rdiff;
-                    if (rdiff > thra ||
-                        rsumdiff > thrb)
-                        break;
-                    r++;
-                    sum += srcix;
-                }
-
-                dst[x] = sum / (r + l + 1);
-            }
+            s->dsp.filter_row(src, dst, srcf, w, mid, size, thra, thrb);
 
             dst += out->linesize[p];
             src += in->linesize[p];
@@ -202,83 +280,6 @@
     return 0;
 }
 
-static int filter_slice16(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
-{
-    ATADenoiseContext *s = ctx->priv;
-    ThreadData *td = arg;
-    AVFrame *in = td->in;
-    AVFrame *out = td->out;
-    const int size = s->size;
-    const int mid = s->mid;
-    int p, x, y, i, j;
-
-    for (p = 0; p < s->nb_planes; p++) {
-        const int h = s->planeheight[p];
-        const int w = s->planewidth[p];
-        const int slice_start = (h * jobnr) / nb_jobs;
-        const int slice_end = (h * (jobnr+1)) / nb_jobs;
-        const uint16_t *src = (uint16_t *)(in->data[p] + slice_start * in->linesize[p]);
-        uint16_t *dst = (uint16_t *)(out->data[p] + slice_start * out->linesize[p]);
-        const int thra = s->thra[p];
-        const int thrb = s->thrb[p];
-        const uint8_t **data = (const uint8_t **)s->data[p];
-        const int *linesize = (const int *)s->linesize[p];
-        const uint16_t *srcf[SIZE];
-
-        if (!((1 << p) & s->planes)) {
-            av_image_copy_plane((uint8_t *)dst, out->linesize[p], (uint8_t *)src, in->linesize[p],
-                                w * 2, slice_end - slice_start);
-            continue;
-        }
-
-        for (i = 0; i < s->size; i++)
-            srcf[i] = (const uint16_t *)(data[i] + slice_start * linesize[i]);
-
-        for (y = slice_start; y < slice_end; y++) {
-            for (x = 0; x < w; x++) {
-                const int srcx = src[x];
-                unsigned lsumdiff = 0, rsumdiff = 0;
-                unsigned ldiff, rdiff;
-                unsigned sum = srcx;
-                int l = 0, r = 0;
-                int srcjx, srcix;
-
-                for (j = mid - 1, i = mid + 1; j >= 0 && i < size; j--, i++) {
-                    srcjx = srcf[j][x];
-
-                    ldiff = FFABS(srcx - srcjx);
-                    lsumdiff += ldiff;
-                    if (ldiff > thra ||
-                        lsumdiff > thrb)
-                        break;
-                    l++;
-                    sum += srcjx;
-
-                    srcix = srcf[i][x];
-
-                    rdiff = FFABS(srcx - srcix);
-                    rsumdiff += rdiff;
-                    if (rdiff > thra ||
-                        rsumdiff > thrb)
-                        break;
-                    r++;
-                    sum += srcix;
-                }
-
-                dst[x] = sum / (r + l + 1);
-            }
-
-            dst += out->linesize[p] / 2;
-            src += in->linesize[p] / 2;
-
-            for (i = 0; i < size; i++)
-                srcf[i] += linesize[i] / 2;
-        }
-    }
-
-    return 0;
-}
-
 static int config_input(AVFilterLink *inlink)
 {
     const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(inlink->format);
@@ -294,10 +295,11 @@
     s->planewidth[0]  = s->planewidth[3]  = inlink->w;
 
     depth = desc->comp[0].depth;
+    s->filter_slice = filter_slice;
     if (depth == 8)
-        s->filter_slice = filter_slice8;
+        s->dsp.filter_row = s->algorithm == PARALLEL ? filter_row8 : filter_row8_serial;
     else
-        s->filter_slice = filter_slice16;
+        s->dsp.filter_row = s->algorithm == PARALLEL ? filter_row16 : filter_row16_serial;
 
     s->thra[0] = s->fthra[0] * (1 << depth) - 1;
     s->thra[1] = s->fthra[1] * (1 << depth) - 1;
@@ -306,6 +308,9 @@
     s->thrb[1] = s->fthrb[1] * (1 << depth) - 1;
     s->thrb[2] = s->fthrb[2] * (1 << depth) - 1;
 
+    if (ARCH_X86)
+        ff_atadenoise_init_x86(&s->dsp, depth, s->algorithm);
+
     return 0;
 }
 
@@ -405,6 +410,21 @@
     ff_bufqueue_discard_all(&s->q);
 }
 
+static int process_command(AVFilterContext *ctx,
+                           const char *cmd,
+                           const char *arg,
+                           char *res,
+                           int res_len,
+                           int flags)
+{
+    int ret = ff_filter_process_command(ctx, cmd, arg, res, res_len, flags);
+
+    if (ret < 0)
+        return ret;
+
+    return config_input(ctx->inputs[0]);
+}
+
 static const AVFilterPad inputs[] = {
     {
         .name         = "default",
@@ -435,4 +455,5 @@
     .inputs        = inputs,
     .outputs       = outputs,
     .flags         = AVFILTER_FLAG_SUPPORT_TIMELINE_INTERNAL | AVFILTER_FLAG_SLICE_THREADS,
+    .process_command = process_command,
 };
diff --git a/libavfilter/vf_avgblur.c b/libavfilter/vf_avgblur.c
index c7b8842..7fd65ea 100644
--- a/libavfilter/vf_avgblur.c
+++ b/libavfilter/vf_avgblur.c
@@ -46,7 +46,7 @@
 } AverageBlurContext;
 
 #define OFFSET(x) offsetof(AverageBlurContext, x)
-#define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
+#define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_RUNTIME_PARAM
 
 static const AVOption avgblur_options[] = {
     { "sizeX",  "set horizontal size",  OFFSET(radius),  AV_OPT_TYPE_INT, {.i64=1},   1, 1024, FLAGS },
@@ -138,7 +138,6 @@
         float acc = 0;                                                                        \
         int count = 0;                                                                        \
                                                                                               \
-        ptr = buffer + x;                                                                     \
         src = s->buffer + x;                                                                  \
                                                                                               \
         for (i = 0; i < radius; i++) {                                                        \
@@ -149,7 +148,7 @@
                                                                                               \
         src = s->buffer + x;                                                                  \
         ptr = buffer + x;                                                                     \
-        for (i = 0; i <= radius; i++) {                                                       \
+        for (i = 0; i + radius < height && i <= radius; i++) {                                \
             acc += src[(i + radius) * width];                                                 \
             count++;                                                                          \
             ptr[i * linesize] = acc / count;                                                  \
@@ -238,6 +237,7 @@
         AV_PIX_FMT_YUV420P16, AV_PIX_FMT_YUV422P16, AV_PIX_FMT_YUV444P16,
         AV_PIX_FMT_YUVA420P9, AV_PIX_FMT_YUVA422P9, AV_PIX_FMT_YUVA444P9,
         AV_PIX_FMT_YUVA420P10, AV_PIX_FMT_YUVA422P10, AV_PIX_FMT_YUVA444P10,
+        AV_PIX_FMT_YUVA422P12, AV_PIX_FMT_YUVA444P12,
         AV_PIX_FMT_YUVA420P16, AV_PIX_FMT_YUVA422P16, AV_PIX_FMT_YUVA444P16,
         AV_PIX_FMT_GBRP, AV_PIX_FMT_GBRP9, AV_PIX_FMT_GBRP10,
         AV_PIX_FMT_GBRP12, AV_PIX_FMT_GBRP14, AV_PIX_FMT_GBRP16,
@@ -323,4 +323,5 @@
     .inputs        = avgblur_inputs,
     .outputs       = avgblur_outputs,
     .flags         = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC | AVFILTER_FLAG_SLICE_THREADS,
+    .process_command = ff_filter_process_command,
 };
diff --git a/libavfilter/vf_avgblur_vulkan.c b/libavfilter/vf_avgblur_vulkan.c
new file mode 100644
index 0000000..105d753
--- /dev/null
+++ b/libavfilter/vf_avgblur_vulkan.c
@@ -0,0 +1,406 @@
+/*
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "libavutil/opt.h"
+#include "vulkan.h"
+#include "internal.h"
+
+#define CGS 32
+
+typedef struct AvgBlurVulkanContext {
+    VulkanFilterContext vkctx;
+
+    int initialized;
+    FFVkExecContext *exec;
+    VulkanPipeline *pl_hor;
+    VulkanPipeline *pl_ver;
+
+    /* Shader updators, must be in the main filter struct */
+    VkDescriptorImageInfo input_images[3];
+    VkDescriptorImageInfo tmp_images[3];
+    VkDescriptorImageInfo output_images[3];
+
+    int size_x;
+    int size_y;
+    int planes;
+} AvgBlurVulkanContext;
+
+static const char blur_kernel[] = {
+    C(0, shared vec4 cache[DIR(gl_WorkGroupSize) + FILTER_RADIUS*2 + 1];           )
+    C(0,                                                                           )
+    C(0, void distort(const ivec2 pos, const int idx)                              )
+    C(0, {                                                                         )
+    C(1,     const uint cp = DIR(gl_LocalInvocationID) + FILTER_RADIUS;            )
+    C(0,                                                                           )
+    C(1,     cache[cp] = texture(input_img[idx], pos);                             )
+    C(0,                                                                           )
+    C(1,     const ivec2 loc_l = pos - INC(FILTER_RADIUS);                         )
+    C(1,     cache[cp - FILTER_RADIUS] = texture(input_img[idx], loc_l);           )
+    C(0,                                                                           )
+    C(1,     const ivec2 loc_h = pos + INC(DIR(gl_WorkGroupSize));                 )
+    C(1,     cache[cp + DIR(gl_WorkGroupSize)] = texture(input_img[idx], loc_h);   )
+    C(0,                                                                           )
+    C(1,     barrier();                                                            )
+    C(0,                                                                           )
+    C(1,     vec4 sum = vec4(0);                                                   )
+    C(1,     for (int p = -FILTER_RADIUS; p <= FILTER_RADIUS; p++)                 )
+    C(2,         sum += cache[cp + p];                                             )
+    C(0,                                                                           )
+    C(1,     sum /= vec4(FILTER_RADIUS*2 + 1);                                     )
+    C(1,     imageStore(output_img[idx], pos, sum);                                )
+    C(0, }                                                                         )
+};
+
+static av_cold int init_filter(AVFilterContext *ctx, AVFrame *in)
+{
+    int err;
+    SPIRVShader *shd;
+    AvgBlurVulkanContext *s = ctx->priv;
+    const int planes = av_pix_fmt_count_planes(s->vkctx.output_format);
+    VkSampler *sampler = ff_vk_init_sampler(ctx, 1, VK_FILTER_LINEAR);
+
+    VulkanDescriptorSetBinding desc_i[2] = {
+        {
+            .name       = "input_img",
+            .type       = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
+            .dimensions = 2,
+            .elems      = planes,
+            .stages     = VK_SHADER_STAGE_COMPUTE_BIT,
+            .samplers   = DUP_SAMPLER_ARRAY4(*sampler),
+        },
+        {
+            .name       = "output_img",
+            .type       = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
+            .mem_layout = ff_vk_shader_rep_fmt(s->vkctx.output_format),
+            .mem_quali  = "writeonly",
+            .dimensions = 2,
+            .elems      = planes,
+            .stages     = VK_SHADER_STAGE_COMPUTE_BIT,
+        },
+    };
+
+    if (!sampler)
+        return AVERROR_EXTERNAL;
+
+    { /* Create shader for the horizontal pass */
+        desc_i[0].updater = s->input_images;
+        desc_i[1].updater = s->tmp_images;
+
+        s->pl_hor = ff_vk_create_pipeline(ctx);
+        if (!s->pl_hor)
+            return AVERROR(ENOMEM);
+
+        shd = ff_vk_init_shader(ctx, s->pl_hor, "avgblur_compute_hor",
+                                VK_SHADER_STAGE_COMPUTE_BIT);
+
+        ff_vk_set_compute_shader_sizes(ctx, shd, (int [3]){ CGS, 1, 1 });
+
+        RET(ff_vk_add_descriptor_set(ctx, s->pl_hor, shd, desc_i, 2, 0));
+
+        GLSLF(0, #define FILTER_RADIUS (%i)                     ,s->size_x - 1);
+        GLSLC(0, #define INC(x) (ivec2(x, 0))                                 );
+        GLSLC(0, #define DIR(var) (var.x)                                     );
+        GLSLD(   blur_kernel                                                  );
+        GLSLC(0, void main()                                                  );
+        GLSLC(0, {                                                            );
+        GLSLC(1,     ivec2 size;                                              );
+        GLSLC(1,     const ivec2 pos = ivec2(gl_GlobalInvocationID.xy);       );
+        for (int i = 0; i < planes; i++) {
+            GLSLC(0,                                                          );
+            GLSLF(1,  size = imageSize(output_img[%i]);                     ,i);
+            GLSLC(1,  if (IS_WITHIN(pos, size)) {                             );
+            if (s->planes & (1 << i)) {
+                GLSLF(2, distort(pos, %i);                                  ,i);
+            } else {
+                GLSLF(2, vec4 res = texture(input_img[%i], pos);            ,i);
+                GLSLF(2, imageStore(output_img[%i], pos, res);              ,i);
+            }
+            GLSLC(1, }                                                        );
+        }
+        GLSLC(0, }                                                            );
+
+        RET(ff_vk_compile_shader(ctx, shd, "main"));
+
+        RET(ff_vk_init_pipeline_layout(ctx, s->pl_hor));
+        RET(ff_vk_init_compute_pipeline(ctx, s->pl_hor));
+    }
+
+    { /* Create shader for the vertical pass */
+        desc_i[0].updater = s->tmp_images;
+        desc_i[1].updater = s->output_images;
+
+        s->pl_ver = ff_vk_create_pipeline(ctx);
+        if (!s->pl_ver)
+            return AVERROR(ENOMEM);
+
+        shd = ff_vk_init_shader(ctx, s->pl_ver, "avgblur_compute_ver",
+                                VK_SHADER_STAGE_COMPUTE_BIT);
+
+        ff_vk_set_compute_shader_sizes(ctx, shd, (int [3]){ 1, CGS, 1 });
+
+        RET(ff_vk_add_descriptor_set(ctx, s->pl_ver, shd, desc_i, 2, 0));
+
+        GLSLF(0, #define FILTER_RADIUS (%i)                     ,s->size_y - 1);
+        GLSLC(0, #define INC(x) (ivec2(0, x))                                 );
+        GLSLC(0, #define DIR(var) (var.y)                                     );
+        GLSLD(   blur_kernel                                                  );
+        GLSLC(0, void main()                                                  );
+        GLSLC(0, {                                                            );
+        GLSLC(1,     ivec2 size;                                              );
+        GLSLC(1,     const ivec2 pos = ivec2(gl_GlobalInvocationID.xy);       );
+        for (int i = 0; i < planes; i++) {
+            GLSLC(0,                                                          );
+            GLSLF(1,  size = imageSize(output_img[%i]);                     ,i);
+            GLSLC(1,  if (IS_WITHIN(pos, size)) {                             );
+            if (s->planes & (1 << i)) {
+                GLSLF(2, distort(pos, %i);                                  ,i);
+            } else {
+                GLSLF(2, vec4 res = texture(input_img[%i], pos);            ,i);
+                GLSLF(2, imageStore(output_img[%i], pos, res);              ,i);
+            }
+            GLSLC(1, }                                                        );
+        }
+        GLSLC(0, }                                                            );
+
+        RET(ff_vk_compile_shader(ctx, shd, "main"));
+
+        RET(ff_vk_init_pipeline_layout(ctx, s->pl_ver));
+        RET(ff_vk_init_compute_pipeline(ctx, s->pl_ver));
+    }
+
+    /* Execution context */
+    RET(ff_vk_create_exec_ctx(ctx, &s->exec,
+                              s->vkctx.hwctx->queue_family_comp_index));
+
+    s->initialized = 1;
+
+    return 0;
+
+fail:
+    return err;
+}
+
+static int process_frames(AVFilterContext *avctx, AVFrame *out_f, AVFrame *tmp_f, AVFrame *in_f)
+{
+    int err;
+    AvgBlurVulkanContext *s = avctx->priv;
+    AVVkFrame *in = (AVVkFrame *)in_f->data[0];
+    AVVkFrame *tmp = (AVVkFrame *)tmp_f->data[0];
+    AVVkFrame *out = (AVVkFrame *)out_f->data[0];
+    int planes = av_pix_fmt_count_planes(s->vkctx.output_format);
+
+    for (int i = 0; i < planes; i++) {
+        RET(ff_vk_create_imageview(avctx, &s->input_images[i].imageView, in->img[i],
+                                   av_vkfmt_from_pixfmt(s->vkctx.input_format)[i],
+                                   ff_comp_identity_map));
+
+        RET(ff_vk_create_imageview(avctx, &s->tmp_images[i].imageView, tmp->img[i],
+                                   av_vkfmt_from_pixfmt(s->vkctx.output_format)[i],
+                                   ff_comp_identity_map));
+
+        RET(ff_vk_create_imageview(avctx, &s->output_images[i].imageView, out->img[i],
+                                   av_vkfmt_from_pixfmt(s->vkctx.output_format)[i],
+                                   ff_comp_identity_map));
+
+        s->input_images[i].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
+        s->tmp_images[i].imageLayout = VK_IMAGE_LAYOUT_GENERAL;
+        s->output_images[i].imageLayout = VK_IMAGE_LAYOUT_GENERAL;
+    }
+
+    ff_vk_update_descriptor_set(avctx, s->pl_hor, 0);
+    ff_vk_update_descriptor_set(avctx, s->pl_ver, 0);
+
+    ff_vk_start_exec_recording(avctx, s->exec);
+
+    for (int i = 0; i < planes; i++) {
+        VkImageMemoryBarrier bar[] = {
+            {
+                .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
+                .srcAccessMask = 0,
+                .dstAccessMask = VK_ACCESS_SHADER_READ_BIT,
+                .oldLayout = in->layout[i],
+                .newLayout = s->input_images[i].imageLayout,
+                .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
+                .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
+                .image = in->img[i],
+                .subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
+                .subresourceRange.levelCount = 1,
+                .subresourceRange.layerCount = 1,
+            },
+            {
+                .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
+                .srcAccessMask = 0,
+                .dstAccessMask = VK_ACCESS_SHADER_WRITE_BIT | VK_ACCESS_SHADER_READ_BIT,
+                .oldLayout = tmp->layout[i],
+                .newLayout = s->tmp_images[i].imageLayout,
+                .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
+                .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
+                .image = tmp->img[i],
+                .subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
+                .subresourceRange.levelCount = 1,
+                .subresourceRange.layerCount = 1,
+            },
+            {
+                .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
+                .srcAccessMask = 0,
+                .dstAccessMask = VK_ACCESS_SHADER_WRITE_BIT,
+                .oldLayout = out->layout[i],
+                .newLayout = s->output_images[i].imageLayout,
+                .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
+                .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
+                .image = out->img[i],
+                .subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
+                .subresourceRange.levelCount = 1,
+                .subresourceRange.layerCount = 1,
+            },
+        };
+
+        vkCmdPipelineBarrier(s->exec->buf, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
+                             VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, 0,
+                             0, NULL, 0, NULL, FF_ARRAY_ELEMS(bar), bar);
+
+        in->layout[i]  = bar[0].newLayout;
+        in->access[i]  = bar[0].dstAccessMask;
+
+        tmp->layout[i] = bar[1].newLayout;
+        tmp->access[i] = bar[1].dstAccessMask;
+
+        out->layout[i] = bar[2].newLayout;
+        out->access[i] = bar[2].dstAccessMask;
+    }
+
+    ff_vk_bind_pipeline_exec(avctx, s->exec, s->pl_hor);
+
+    vkCmdDispatch(s->exec->buf, FFALIGN(s->vkctx.output_width, CGS)/CGS,
+                  s->vkctx.output_height, 1);
+
+    ff_vk_bind_pipeline_exec(avctx, s->exec, s->pl_ver);
+
+    vkCmdDispatch(s->exec->buf, s->vkctx.output_width,
+                  FFALIGN(s->vkctx.output_height, CGS)/CGS, 1);
+
+    ff_vk_add_exec_dep(avctx, s->exec, in_f, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
+    ff_vk_add_exec_dep(avctx, s->exec, out_f, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
+
+    err = ff_vk_submit_exec_queue(avctx, s->exec);
+    if (err)
+        return err;
+
+fail:
+
+    for (int i = 0; i < planes; i++) {
+        ff_vk_destroy_imageview(avctx, &s->input_images[i].imageView);
+        ff_vk_destroy_imageview(avctx, &s->tmp_images[i].imageView);
+        ff_vk_destroy_imageview(avctx, &s->output_images[i].imageView);
+    }
+
+    return err;
+}
+
+static int avgblur_vulkan_filter_frame(AVFilterLink *link, AVFrame *in)
+{
+    int err;
+    AVFrame *tmp = NULL, *out = NULL;
+    AVFilterContext *ctx = link->dst;
+    AvgBlurVulkanContext *s = ctx->priv;
+    AVFilterLink *outlink = ctx->outputs[0];
+
+    out = ff_get_video_buffer(outlink, outlink->w, outlink->h);
+    if (!out) {
+        err = AVERROR(ENOMEM);
+        goto fail;
+    }
+
+    tmp = ff_get_video_buffer(outlink, outlink->w, outlink->h);
+    if (!out) {
+        err = AVERROR(ENOMEM);
+        goto fail;
+    }
+
+    if (!s->initialized)
+        RET(init_filter(ctx, in));
+
+    RET(process_frames(ctx, out, tmp, in));
+
+    err = av_frame_copy_props(out, in);
+    if (err < 0)
+        goto fail;
+
+    av_frame_free(&in);
+    av_frame_free(&tmp);
+
+    return ff_filter_frame(outlink, out);
+
+fail:
+    av_frame_free(&in);
+    av_frame_free(&tmp);
+    av_frame_free(&out);
+    return err;
+}
+
+static void avgblur_vulkan_uninit(AVFilterContext *avctx)
+{
+    AvgBlurVulkanContext *s = avctx->priv;
+
+    ff_vk_filter_uninit(avctx);
+
+    s->initialized = 0;
+}
+
+#define OFFSET(x) offsetof(AvgBlurVulkanContext, x)
+#define FLAGS (AV_OPT_FLAG_FILTERING_PARAM | AV_OPT_FLAG_VIDEO_PARAM)
+static const AVOption avgblur_vulkan_options[] = {
+    { "sizeX",  "Set horizontal radius", OFFSET(size_x), AV_OPT_TYPE_INT, {.i64 = 3}, 1, 32, .flags = FLAGS },
+    { "planes", "Set planes to filter (bitmask)", OFFSET(planes), AV_OPT_TYPE_INT, {.i64 = 0xF}, 0, 0xF, .flags = FLAGS },
+    { "sizeY",  "Set vertical radius", OFFSET(size_y), AV_OPT_TYPE_INT, {.i64 = 3}, 1, 32, .flags = FLAGS },
+    { NULL },
+};
+
+AVFILTER_DEFINE_CLASS(avgblur_vulkan);
+
+static const AVFilterPad avgblur_vulkan_inputs[] = {
+    {
+        .name         = "default",
+        .type         = AVMEDIA_TYPE_VIDEO,
+        .filter_frame = &avgblur_vulkan_filter_frame,
+        .config_props = &ff_vk_filter_config_input,
+    },
+    { NULL }
+};
+
+static const AVFilterPad avgblur_vulkan_outputs[] = {
+    {
+        .name = "default",
+        .type = AVMEDIA_TYPE_VIDEO,
+        .config_props = &ff_vk_filter_config_output,
+    },
+    { NULL }
+};
+
+AVFilter ff_vf_avgblur_vulkan = {
+    .name           = "avgblur_vulkan",
+    .description    = NULL_IF_CONFIG_SMALL("Apply avgblur mask to input video"),
+    .priv_size      = sizeof(AvgBlurVulkanContext),
+    .init           = &ff_vk_filter_init,
+    .uninit         = &avgblur_vulkan_uninit,
+    .query_formats  = &ff_vk_filter_query_formats,
+    .inputs         = avgblur_vulkan_inputs,
+    .outputs        = avgblur_vulkan_outputs,
+    .priv_class     = &avgblur_vulkan_class,
+    .flags_internal = FF_FILTER_FLAG_HWFRAME_AWARE,
+};
diff --git a/libavfilter/vf_bilateral.c b/libavfilter/vf_bilateral.c
new file mode 100644
index 0000000..3c9d800
--- /dev/null
+++ b/libavfilter/vf_bilateral.c
@@ -0,0 +1,370 @@
+/*
+ * Copyright (c) 2017 Ming Yang
+ * Copyright (c) 2019 Paul B Mahol
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+#include "libavutil/imgutils.h"
+#include "libavutil/opt.h"
+#include "libavutil/pixdesc.h"
+#include "avfilter.h"
+#include "formats.h"
+#include "internal.h"
+#include "video.h"
+
+typedef struct BilateralContext {
+    const AVClass *class;
+
+    float sigmaS;
+    float sigmaR;
+    int planes;
+
+    int nb_planes;
+    int depth;
+    int planewidth[4];
+    int planeheight[4];
+
+    float range_table[65536];
+
+    float *img_out_f;
+    float *img_temp;
+    float *map_factor_a;
+    float *map_factor_b;
+    float *slice_factor_a;
+    float *slice_factor_b;
+    float *line_factor_a;
+    float *line_factor_b;
+} BilateralContext;
+
+#define OFFSET(x) offsetof(BilateralContext, x)
+#define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
+
+static const AVOption bilateral_options[] = {
+    { "sigmaS", "set spatial sigma",    OFFSET(sigmaS), AV_OPT_TYPE_FLOAT, {.dbl=0.1}, 0.0,  10, FLAGS },
+    { "sigmaR", "set range sigma",      OFFSET(sigmaR), AV_OPT_TYPE_FLOAT, {.dbl=0.1}, 0.0,   1, FLAGS },
+    { "planes", "set planes to filter", OFFSET(planes), AV_OPT_TYPE_INT,   {.i64=1},     0, 0xF, FLAGS },
+    { NULL }
+};
+
+AVFILTER_DEFINE_CLASS(bilateral);
+
+static int query_formats(AVFilterContext *ctx)
+{
+    static const enum AVPixelFormat pix_fmts[] = {
+        AV_PIX_FMT_YUVA444P, AV_PIX_FMT_YUV444P, AV_PIX_FMT_YUV440P,
+        AV_PIX_FMT_YUVJ444P, AV_PIX_FMT_YUVJ440P,
+        AV_PIX_FMT_YUVA422P, AV_PIX_FMT_YUV422P, AV_PIX_FMT_YUVA420P, AV_PIX_FMT_YUV420P,
+        AV_PIX_FMT_YUVJ422P, AV_PIX_FMT_YUVJ420P,
+        AV_PIX_FMT_YUVJ411P, AV_PIX_FMT_YUV411P, AV_PIX_FMT_YUV410P,
+        AV_PIX_FMT_YUV420P9, AV_PIX_FMT_YUV422P9, AV_PIX_FMT_YUV444P9,
+        AV_PIX_FMT_YUV420P10, AV_PIX_FMT_YUV422P10, AV_PIX_FMT_YUV444P10,
+        AV_PIX_FMT_YUV420P12, AV_PIX_FMT_YUV422P12, AV_PIX_FMT_YUV444P12, AV_PIX_FMT_YUV440P12,
+        AV_PIX_FMT_YUV420P14, AV_PIX_FMT_YUV422P14, AV_PIX_FMT_YUV444P14,
+        AV_PIX_FMT_YUV420P16, AV_PIX_FMT_YUV422P16, AV_PIX_FMT_YUV444P16,
+        AV_PIX_FMT_YUVA420P9, AV_PIX_FMT_YUVA422P9, AV_PIX_FMT_YUVA444P9,
+        AV_PIX_FMT_YUVA420P10, AV_PIX_FMT_YUVA422P10, AV_PIX_FMT_YUVA444P10,
+        AV_PIX_FMT_YUVA420P16, AV_PIX_FMT_YUVA422P16, AV_PIX_FMT_YUVA444P16,
+        AV_PIX_FMT_GBRP, AV_PIX_FMT_GBRP9, AV_PIX_FMT_GBRP10,
+        AV_PIX_FMT_GBRP12, AV_PIX_FMT_GBRP14, AV_PIX_FMT_GBRP16,
+        AV_PIX_FMT_GBRAP, AV_PIX_FMT_GBRAP10, AV_PIX_FMT_GBRAP12, AV_PIX_FMT_GBRAP16,
+        AV_PIX_FMT_GRAY8, AV_PIX_FMT_GRAY9, AV_PIX_FMT_GRAY10, AV_PIX_FMT_GRAY12, AV_PIX_FMT_GRAY14, AV_PIX_FMT_GRAY16,
+        AV_PIX_FMT_NONE
+    };
+
+    return ff_set_common_formats(ctx, ff_make_format_list(pix_fmts));
+}
+
+static int config_input(AVFilterLink *inlink)
+{
+    BilateralContext *s = inlink->dst->priv;
+    const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(inlink->format);
+    float inv_sigma_range;
+
+    s->depth = desc->comp[0].depth;
+    inv_sigma_range = 1.0f / (s->sigmaR * ((1 << s->depth) - 1));
+
+    //compute a lookup table
+    for (int i = 0; i < (1 << s->depth); i++)
+        s->range_table[i] = expf(-i * inv_sigma_range);
+
+    s->planewidth[1] = s->planewidth[2] = AV_CEIL_RSHIFT(inlink->w, desc->log2_chroma_w);
+    s->planewidth[0] = s->planewidth[3] = inlink->w;
+    s->planeheight[1] = s->planeheight[2] = AV_CEIL_RSHIFT(inlink->h, desc->log2_chroma_h);
+    s->planeheight[0] = s->planeheight[3] = inlink->h;
+
+    s->nb_planes = av_pix_fmt_count_planes(inlink->format);
+
+    s->img_out_f = av_calloc(inlink->w * inlink->h, sizeof(float));
+    s->img_temp = av_calloc(inlink->w * inlink->h, sizeof(float));
+    s->map_factor_a = av_calloc(inlink->w * inlink->h, sizeof(float));
+    s->map_factor_b = av_calloc(inlink->w * inlink->h, sizeof(float));
+    s->slice_factor_a = av_calloc(inlink->w, sizeof(float));
+    s->slice_factor_b = av_calloc(inlink->w, sizeof(float));
+    s->line_factor_a = av_calloc(inlink->w, sizeof(float));
+    s->line_factor_b = av_calloc(inlink->w, sizeof(float));
+
+    if (!s->img_out_f ||
+        !s->img_temp ||
+        !s->map_factor_a ||
+        !s->map_factor_b ||
+        !s->slice_factor_a ||
+        !s->slice_factor_a ||
+        !s->line_factor_a ||
+        !s->line_factor_a)
+        return AVERROR(ENOMEM);
+
+    return 0;
+}
+
+#define BILATERAL(type, name)                                                           \
+static void bilateral_##name(BilateralContext *s, const uint8_t *ssrc, uint8_t *ddst,   \
+                             float sigma_spatial, float sigma_range,                    \
+                             int width, int height, int src_linesize, int dst_linesize) \
+{                                                                                       \
+    type *dst = (type *)ddst;                                                           \
+    const type *src = (const type *)ssrc;                                               \
+    float *img_out_f = s->img_out_f, *img_temp = s->img_temp;                           \
+    float *map_factor_a = s->map_factor_a, *map_factor_b = s->map_factor_b;             \
+    float *slice_factor_a = s->slice_factor_a, *slice_factor_b = s->slice_factor_b;     \
+    float *line_factor_a = s->line_factor_a, *line_factor_b = s->line_factor_b;         \
+    float *range_table = s->range_table;                                                \
+    float alpha = expf(-sqrtf(2.f) / (sigma_spatial * width));                          \
+    float ypr, ycr, *ycy, *ypy, *xcy, fp, fc;                                           \
+    float inv_alpha_ = 1 - alpha;                                                       \
+    float *ycf, *ypf, *xcf, *in_factor;                                                 \
+    const type *tcy, *tpy;                                                                \
+    int h1;                                                                               \
+                                                                                          \
+    for (int y = 0; y < height; y++) {                                                    \
+        float *temp_factor_x, *temp_x = &img_temp[y * width];                             \
+        const type *in_x = &src[y * src_linesize];                                        \
+        const type *texture_x = &src[y * src_linesize];                                   \
+        type tpr;                                                                         \
+                                                                                          \
+        *temp_x++ = ypr = *in_x++;                                                        \
+        tpr = *texture_x++;                                                               \
+                                                                                          \
+        temp_factor_x = &map_factor_a[y * width];                                         \
+        *temp_factor_x++ = fp = 1;                                                        \
+                                                                                          \
+        for (int x = 1; x < width; x++) {                                                 \
+            float weight, alpha_;                                                         \
+            int range_dist;                                                               \
+            type tcr = *texture_x++;                                                      \
+            type dr = abs(tcr - tpr);                                                     \
+                                                                                          \
+            range_dist = dr;                                                              \
+            weight = range_table[range_dist];                                             \
+            alpha_ = weight*alpha;                                                        \
+            *temp_x++ = ycr = inv_alpha_*(*in_x++) + alpha_*ypr;                          \
+            tpr = tcr;                                                                    \
+            ypr = ycr;                                                                    \
+            *temp_factor_x++ = fc = inv_alpha_ + alpha_ * fp;                             \
+            fp = fc;                                                                      \
+        }                                                                                 \
+        --temp_x; *temp_x = 0.5f*((*temp_x) + (*--in_x));                                 \
+        tpr = *--texture_x;                                                               \
+        ypr = *in_x;                                                                      \
+                                                                                          \
+        --temp_factor_x; *temp_factor_x = 0.5f*((*temp_factor_x) + 1);                    \
+        fp = 1;                                                                           \
+                                                                                          \
+        for (int x = width - 2; x >= 0; x--) {                                            \
+            type tcr = *--texture_x;                                                      \
+            type dr = abs(tcr - tpr);                                                     \
+            int range_dist = dr;                                                          \
+            float weight = range_table[range_dist];                                       \
+            float alpha_ = weight * alpha;                                                \
+                                                                                          \
+            ycr = inv_alpha_ * (*--in_x) + alpha_ * ypr;                                  \
+            --temp_x; *temp_x = 0.5f*((*temp_x) + ycr);                                   \
+            tpr = tcr;                                                                    \
+            ypr = ycr;                                                                    \
+                                                                                          \
+            fc = inv_alpha_ + alpha_*fp;                                                  \
+            --temp_factor_x;                                                              \
+            *temp_factor_x = 0.5f*((*temp_factor_x) + fc);                                \
+            fp = fc;                                                                      \
+        }                                                                                 \
+    }                                                                                     \
+    memcpy(img_out_f, img_temp, sizeof(float) * width);                                   \
+                                                                                          \
+    alpha = expf(-sqrtf(2.f) / (sigma_spatial * height));                                 \
+    inv_alpha_ = 1 - alpha;                                                               \
+    in_factor = map_factor_a;                                                             \
+    memcpy(map_factor_b, in_factor, sizeof(float) * width);                               \
+    for (int y = 1; y < height; y++) {                                                    \
+        tpy = &src[(y - 1) * src_linesize];                                               \
+        tcy = &src[y * src_linesize];                                                     \
+        xcy = &img_temp[y * width];                                                       \
+        ypy = &img_out_f[(y - 1) * width];                                                \
+        ycy = &img_out_f[y * width];                                                      \
+                                                                                          \
+        xcf = &in_factor[y * width];                                                      \
+        ypf = &map_factor_b[(y - 1) * width];                                             \
+        ycf = &map_factor_b[y * width];                                                   \
+        for (int x = 0; x < width; x++) {                                                 \
+            type dr = abs((*tcy++) - (*tpy++));                                           \
+            int range_dist = dr;                                                          \
+            float weight = range_table[range_dist];                                       \
+            float alpha_ = weight*alpha;                                                  \
+                                                                                          \
+            *ycy++ = inv_alpha_*(*xcy++) + alpha_*(*ypy++);                               \
+            *ycf++ = inv_alpha_*(*xcf++) + alpha_*(*ypf++);                               \
+        }                                                                                 \
+    }                                                                                     \
+    h1 = height - 1;                                                                      \
+    ycf = line_factor_a;                                                                  \
+    ypf = line_factor_b;                                                                  \
+    memcpy(ypf, &in_factor[h1 * width], sizeof(float) * width);                           \
+    for (int x = 0; x < width; x++)                                                       \
+        map_factor_b[h1 * width + x] = 0.5f*(map_factor_b[h1 * width + x] + ypf[x]);      \
+                                                                                          \
+    ycy = slice_factor_a;                                                                 \
+    ypy = slice_factor_b;                                                                 \
+    memcpy(ypy, &img_temp[h1 * width], sizeof(float) * width);                            \
+    for (int x = 0, k = 0; x < width; x++) {                                              \
+        int idx = h1 * width + x;                                                         \
+        img_out_f[idx] = 0.5f*(img_out_f[idx] + ypy[k++]) / map_factor_b[h1 * width + x]; \
+    }                                                                                     \
+                                                                                          \
+    for (int y = h1 - 1; y >= 0; y--) {                                                   \
+        float *ycf_, *ypf_, *factor_;                                                     \
+        float *ycy_, *ypy_, *out_;                                                        \
+                                                                                          \
+        tpy = &src[(y + 1) * src_linesize];                                               \
+        tcy = &src[y * src_linesize];                                                     \
+        xcy = &img_temp[y * width];                                                       \
+        ycy_ = ycy;                                                                       \
+        ypy_ = ypy;                                                                       \
+        out_ = &img_out_f[y * width];                                                     \
+                                                                                          \
+        xcf = &in_factor[y * width];                                                      \
+        ycf_ = ycf;                                                                       \
+        ypf_ = ypf;                                                                       \
+        factor_ = &map_factor_b[y * width];                                               \
+        for (int x = 0; x < width; x++) {                                                 \
+            type dr = abs((*tcy++) - (*tpy++));                                           \
+            int range_dist = dr;                                                          \
+            float weight = range_table[range_dist];                                       \
+            float alpha_ = weight*alpha;                                                  \
+            float ycc, fcc = inv_alpha_*(*xcf++) + alpha_*(*ypf_++);                      \
+                                                                                          \
+            *ycf_++ = fcc;                                                                \
+            *factor_ = 0.5f * (*factor_ + fcc);                                           \
+                                                                                          \
+            ycc = inv_alpha_*(*xcy++) + alpha_*(*ypy_++);                                 \
+            *ycy_++ = ycc;                                                                \
+            *out_ = 0.5f * (*out_ + ycc) / (*factor_);                                    \
+            out_++;                                                                       \
+            factor_++;                                                                    \
+        }                                                                                 \
+                                                                                          \
+        memcpy(ypy, ycy, sizeof(float) * width);                                          \
+        memcpy(ypf, ycf, sizeof(float) * width);                                          \
+    }                                                                                     \
+                                                                                          \
+    for (int i = 0; i < height; i++)                                                      \
+        for (int j = 0; j < width; j++)                                                   \
+            dst[j + i * dst_linesize] = img_out_f[i * width + j];                         \
+}
+
+BILATERAL(uint8_t, byte)
+BILATERAL(uint16_t, word)
+
+static int filter_frame(AVFilterLink *inlink, AVFrame *in)
+{
+    AVFilterContext *ctx = inlink->dst;
+    BilateralContext *s = ctx->priv;
+    AVFilterLink *outlink = ctx->outputs[0];
+    AVFrame *out;
+
+    out = ff_get_video_buffer(outlink, outlink->w, outlink->h);
+    if (!out) {
+        av_frame_free(&in);
+        return AVERROR(ENOMEM);
+    }
+    av_frame_copy_props(out, in);
+
+    for (int plane = 0; plane < s->nb_planes; plane++) {
+        if (!(s->planes & (1 << plane))) {
+            av_image_copy_plane(out->data[plane], out->linesize[plane],
+                                in->data[plane], in->linesize[plane],
+                                s->planewidth[plane] * ((s->depth + 7) / 8), s->planeheight[plane]);
+            continue;
+        }
+
+        if (s->depth <= 8)
+           bilateral_byte(s, in->data[plane], out->data[plane], s->sigmaS, s->sigmaR,
+                      s->planewidth[plane], s->planeheight[plane],
+                      in->linesize[plane], out->linesize[plane]);
+        else
+           bilateral_word(s, in->data[plane], out->data[plane], s->sigmaS, s->sigmaR,
+                      s->planewidth[plane], s->planeheight[plane],
+                      in->linesize[plane] / 2, out->linesize[plane] / 2);
+    }
+
+    av_frame_free(&in);
+    return ff_filter_frame(outlink, out);
+}
+
+static av_cold void uninit(AVFilterContext *ctx)
+{
+    BilateralContext *s = ctx->priv;
+
+    av_freep(&s->img_out_f);
+    av_freep(&s->img_temp);
+    av_freep(&s->map_factor_a);
+    av_freep(&s->map_factor_b);
+    av_freep(&s->slice_factor_a);
+    av_freep(&s->slice_factor_b);
+    av_freep(&s->line_factor_a);
+    av_freep(&s->line_factor_b);
+}
+
+static const AVFilterPad bilateral_inputs[] = {
+    {
+        .name         = "default",
+        .type         = AVMEDIA_TYPE_VIDEO,
+        .config_props = config_input,
+        .filter_frame = filter_frame,
+    },
+    { NULL }
+};
+
+static const AVFilterPad bilateral_outputs[] = {
+    {
+        .name = "default",
+        .type = AVMEDIA_TYPE_VIDEO,
+    },
+    { NULL }
+};
+
+AVFilter ff_vf_bilateral = {
+    .name          = "bilateral",
+    .description   = NULL_IF_CONFIG_SMALL("Apply Bilateral filter."),
+    .priv_size     = sizeof(BilateralContext),
+    .priv_class    = &bilateral_class,
+    .uninit        = uninit,
+    .query_formats = query_formats,
+    .inputs        = bilateral_inputs,
+    .outputs       = bilateral_outputs,
+    .flags         = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC,
+};
diff --git a/libavfilter/vf_bitplanenoise.c b/libavfilter/vf_bitplanenoise.c
index 4ec3a22..94aa24a 100644
--- a/libavfilter/vf_bitplanenoise.c
+++ b/libavfilter/vf_bitplanenoise.c
@@ -122,7 +122,7 @@
 
     if (s->depth <= 8) {
         for (plane = 0; plane < s->nb_planes; plane++) {
-            const int linesize = in->linesize[plane];
+            const int linesize = s->planeheight[plane] > 1 ? in->linesize[plane] : 0;
             const int dlinesize = out->linesize[plane];
             uint8_t *val = in->data[plane];
             uint8_t *dst = s->filter ? out->data[plane]: NULL;
@@ -151,7 +151,7 @@
         }
     } else {
         for (plane = 0; plane < s->nb_planes; plane++) {
-            const int linesize = in->linesize[plane] / 2;
+            const int linesize = s->planeheight[plane] > 1 ? in->linesize[plane] / 2 : 0;
             const int dlinesize = out->linesize[plane] / 2;
             uint16_t *val = (uint16_t *)in->data[plane];
             uint16_t *dst = s->filter ? (uint16_t *)out->data[plane] : NULL;
diff --git a/libavfilter/vf_blackdetect.c b/libavfilter/vf_blackdetect.c
index 06ef998..4b5d8ff 100644
--- a/libavfilter/vf_blackdetect.c
+++ b/libavfilter/vf_blackdetect.c
@@ -136,7 +136,6 @@
     return ret;
 }
 
-// TODO: document metadata
 static int filter_frame(AVFilterLink *inlink, AVFrame *picref)
 {
     AVFilterContext *ctx = inlink->dst;
diff --git a/libavfilter/vf_blend.c b/libavfilter/vf_blend.c
index e83a0db..a88d5df 100644
--- a/libavfilter/vf_blend.c
+++ b/libavfilter/vf_blend.c
@@ -23,7 +23,6 @@
 #include "libavutil/opt.h"
 #include "libavutil/pixfmt.h"
 #include "avfilter.h"
-#include "bufferqueue.h"
 #include "formats.h"
 #include "framesync.h"
 #include "internal.h"
@@ -42,6 +41,7 @@
     enum BlendMode all_mode;
     double all_opacity;
 
+    int depth;
     FilterParams params[4];
     int tblend;
     AVFrame *prev_frame;        /* only used with tblend */
@@ -100,11 +100,11 @@
     { "subtract",   "", 0, AV_OPT_TYPE_CONST, {.i64=BLEND_SUBTRACT},   0, 0, FLAGS, "mode" },\
     { "vividlight", "", 0, AV_OPT_TYPE_CONST, {.i64=BLEND_VIVIDLIGHT}, 0, 0, FLAGS, "mode" },\
     { "xor",        "", 0, AV_OPT_TYPE_CONST, {.i64=BLEND_XOR},        0, 0, FLAGS, "mode" },\
-    { "c0_expr",  "set color component #0 expression", OFFSET(params[0].expr_str), AV_OPT_TYPE_STRING, {.str=NULL}, CHAR_MIN, CHAR_MAX, FLAGS },\
-    { "c1_expr",  "set color component #1 expression", OFFSET(params[1].expr_str), AV_OPT_TYPE_STRING, {.str=NULL}, CHAR_MIN, CHAR_MAX, FLAGS },\
-    { "c2_expr",  "set color component #2 expression", OFFSET(params[2].expr_str), AV_OPT_TYPE_STRING, {.str=NULL}, CHAR_MIN, CHAR_MAX, FLAGS },\
-    { "c3_expr",  "set color component #3 expression", OFFSET(params[3].expr_str), AV_OPT_TYPE_STRING, {.str=NULL}, CHAR_MIN, CHAR_MAX, FLAGS },\
-    { "all_expr", "set expression for all color components", OFFSET(all_expr), AV_OPT_TYPE_STRING, {.str=NULL}, CHAR_MIN, CHAR_MAX, FLAGS },\
+    { "c0_expr",  "set color component #0 expression", OFFSET(params[0].expr_str), AV_OPT_TYPE_STRING, {.str=NULL}, 0, 0, FLAGS },\
+    { "c1_expr",  "set color component #1 expression", OFFSET(params[1].expr_str), AV_OPT_TYPE_STRING, {.str=NULL}, 0, 0, FLAGS },\
+    { "c2_expr",  "set color component #2 expression", OFFSET(params[2].expr_str), AV_OPT_TYPE_STRING, {.str=NULL}, 0, 0, FLAGS },\
+    { "c3_expr",  "set color component #3 expression", OFFSET(params[3].expr_str), AV_OPT_TYPE_STRING, {.str=NULL}, 0, 0, FLAGS },\
+    { "all_expr", "set expression for all color components", OFFSET(all_expr), AV_OPT_TYPE_STRING, {.str=NULL}, 0, 0, FLAGS },\
     { "c0_opacity",  "set color component #0 opacity", OFFSET(params[0].opacity), AV_OPT_TYPE_DOUBLE, {.dbl=1}, 0, 1, FLAGS },\
     { "c1_opacity",  "set color component #1 opacity", OFFSET(params[1].opacity), AV_OPT_TYPE_DOUBLE, {.dbl=1}, 0, 1, FLAGS },\
     { "c2_opacity",  "set color component #2 opacity", OFFSET(params[2].opacity), AV_OPT_TYPE_DOUBLE, {.dbl=1}, 0, 1, FLAGS },\
@@ -121,19 +121,22 @@
 
 FRAMESYNC_DEFINE_CLASS(blend, BlendContext, fs);
 
-#define COPY(src)                                                            \
-static void blend_copy ## src(const uint8_t *top, ptrdiff_t top_linesize,    \
+#define COPY(src, depth)                                                            \
+static void blend_copy ## src##_##depth(const uint8_t *top, ptrdiff_t top_linesize,    \
                             const uint8_t *bottom, ptrdiff_t bottom_linesize,\
                             uint8_t *dst, ptrdiff_t dst_linesize,            \
                             ptrdiff_t width, ptrdiff_t height,               \
                             FilterParams *param, double *values, int starty) \
 {                                                                            \
     av_image_copy_plane(dst, dst_linesize, src, src ## _linesize,            \
-                        width, height);                                 \
+                        width * depth / 8, height);                          \
 }
 
-COPY(top)
-COPY(bottom)
+COPY(top, 8)
+COPY(bottom, 8)
+
+COPY(top, 16)
+COPY(bottom, 16)
 
 #undef COPY
 
@@ -201,15 +204,15 @@
     }                                                                          \
 }
 
-#define DEFINE_BLEND16(name, expr)                                             \
-static void blend_## name##_16bit(const uint8_t *_top, ptrdiff_t top_linesize,       \
+#define DEFINE_BLEND16(name, expr, depth)                                            \
+static void blend_## name##_##depth##bit(const uint8_t *_top, ptrdiff_t top_linesize,\
                                   const uint8_t *_bottom, ptrdiff_t bottom_linesize, \
                                   uint8_t *_dst, ptrdiff_t dst_linesize,             \
                                   ptrdiff_t width, ptrdiff_t height,           \
                                   FilterParams *param, double *values, int starty)         \
 {                                                                              \
-    const uint16_t *top = (uint16_t*)_top;                                     \
-    const uint16_t *bottom = (uint16_t*)_bottom;                               \
+    const uint16_t *top = (const uint16_t*)_top;                               \
+    const uint16_t *bottom = (const uint16_t*)_bottom;                         \
     uint16_t *dst = (uint16_t*)_dst;                                           \
     double opacity = param->opacity;                                           \
     int i, j;                                                                  \
@@ -278,38 +281,167 @@
 #define BURN(a, b)        (((a) == 0) ? (a) : FFMAX(0, 65535 - ((65535 - (b)) << 16) / (a)))
 #define DODGE(a, b)       (((a) == 65535) ? (a) : FFMIN(65535, (((b) << 16) / (65535 - (a)))))
 
-DEFINE_BLEND16(addition,   FFMIN(65535, A + B))
-DEFINE_BLEND16(grainmerge, av_clip_uint16(A + B - 32768))
-DEFINE_BLEND16(average,    (A + B) / 2)
-DEFINE_BLEND16(subtract,   FFMAX(0, A - B))
-DEFINE_BLEND16(multiply,   MULTIPLY(1, A, B))
-DEFINE_BLEND16(multiply128, av_clip_uint16((A - 32768) * B / 8192. + 32768))
-DEFINE_BLEND16(negation,   65535 - FFABS(65535 - A - B))
-DEFINE_BLEND16(extremity,  FFABS(65535 - A - B))
-DEFINE_BLEND16(difference, FFABS(A - B))
-DEFINE_BLEND16(grainextract, av_clip_uint16(32768 + A - B))
-DEFINE_BLEND16(screen,     SCREEN(1, A, B))
-DEFINE_BLEND16(overlay,    (A < 32768) ? MULTIPLY(2, A, B) : SCREEN(2, A, B))
-DEFINE_BLEND16(hardlight,  (B < 32768) ? MULTIPLY(2, B, A) : SCREEN(2, B, A))
-DEFINE_BLEND16(hardmix,    (A < (65535 - B)) ? 0: 65535)
-DEFINE_BLEND16(heat,       (A == 0) ? 0 : 65535 - FFMIN(((65535 - B) * (65535 - B)) / A, 65535))
-DEFINE_BLEND16(freeze,     (B == 0) ? 0 : 65535 - FFMIN(((65535 - A) * (65535 - A)) / B, 65535))
-DEFINE_BLEND16(darken,     FFMIN(A, B))
-DEFINE_BLEND16(lighten,    FFMAX(A, B))
-DEFINE_BLEND16(divide,     av_clip_uint16(B == 0 ? 65535 : 65535 * A / B))
-DEFINE_BLEND16(dodge,      DODGE(A, B))
-DEFINE_BLEND16(burn,       BURN(A, B))
-DEFINE_BLEND16(softlight,  (A > 32767) ? B + (65535 - B) * (A - 32767.5) / 32767.5 * (0.5 - fabs(B - 32767.5) / 65535): B - B * ((32767.5 - A) / 32767.5) * (0.5 - fabs(B - 32767.5)/65535))
-DEFINE_BLEND16(exclusion,  A + B - 2 * A * B / 65535)
-DEFINE_BLEND16(pinlight,   (B < 32768) ? FFMIN(A, 2 * B) : FFMAX(A, 2 * (B - 32768)))
-DEFINE_BLEND16(phoenix,    FFMIN(A, B) - FFMAX(A, B) + 65535)
-DEFINE_BLEND16(reflect,    (B == 65535) ? B : FFMIN(65535, (A * A / (65535 - B))))
-DEFINE_BLEND16(glow,       (A == 65535) ? A : FFMIN(65535, (B * B / (65535 - A))))
-DEFINE_BLEND16(and,        A & B)
-DEFINE_BLEND16(or,         A | B)
-DEFINE_BLEND16(xor,        A ^ B)
-DEFINE_BLEND16(vividlight, (A < 32768) ? BURN(2 * A, B) : DODGE(2 * (A - 32768), B))
-DEFINE_BLEND16(linearlight,av_clip_uint16((B < 32768) ? B + 2 * A - 65535 : B + 2 * (A - 32768)))
+DEFINE_BLEND16(addition,   FFMIN(65535, A + B), 16)
+DEFINE_BLEND16(grainmerge, av_clip_uint16(A + B - 32768), 16)
+DEFINE_BLEND16(average,    (A + B) / 2, 16)
+DEFINE_BLEND16(subtract,   FFMAX(0, A - B), 16)
+DEFINE_BLEND16(multiply,   MULTIPLY(1, A, B), 16)
+DEFINE_BLEND16(multiply128, av_clip_uint16((A - 32768) * B / 8192. + 32768), 16)
+DEFINE_BLEND16(negation,   65535 - FFABS(65535 - A - B), 16)
+DEFINE_BLEND16(extremity,  FFABS(65535 - A - B), 16)
+DEFINE_BLEND16(difference, FFABS(A - B), 16)
+DEFINE_BLEND16(grainextract, av_clip_uint16(32768 + A - B), 16)
+DEFINE_BLEND16(screen,     SCREEN(1, A, B), 16)
+DEFINE_BLEND16(overlay,    (A < 32768) ? MULTIPLY(2, A, B) : SCREEN(2, A, B), 16)
+DEFINE_BLEND16(hardlight,  (B < 32768) ? MULTIPLY(2, B, A) : SCREEN(2, B, A), 16)
+DEFINE_BLEND16(hardmix,    (A < (65535 - B)) ? 0: 65535, 16)
+DEFINE_BLEND16(heat,       (A == 0) ? 0 : 65535 - FFMIN(((65535 - B) * (65535 - B)) / A, 65535), 16)
+DEFINE_BLEND16(freeze,     (B == 0) ? 0 : 65535 - FFMIN(((65535 - A) * (65535 - A)) / B, 65535), 16)
+DEFINE_BLEND16(darken,     FFMIN(A, B), 16)
+DEFINE_BLEND16(lighten,    FFMAX(A, B), 16)
+DEFINE_BLEND16(divide,     av_clip_uint16(B == 0 ? 65535 : 65535 * A / B), 16)
+DEFINE_BLEND16(dodge,      DODGE(A, B), 16)
+DEFINE_BLEND16(burn,       BURN(A, B), 16)
+DEFINE_BLEND16(softlight,  (A > 32767) ? B + (65535 - B) * (A - 32767.5) / 32767.5 * (0.5 - fabs(B - 32767.5) / 65535): B - B * ((32767.5 - A) / 32767.5) * (0.5 - fabs(B - 32767.5)/65535), 16)
+DEFINE_BLEND16(exclusion,  A + B - 2 * A * B / 65535, 16)
+DEFINE_BLEND16(pinlight,   (B < 32768) ? FFMIN(A, 2 * B) : FFMAX(A, 2 * (B - 32768)), 16)
+DEFINE_BLEND16(phoenix,    FFMIN(A, B) - FFMAX(A, B) + 65535, 16)
+DEFINE_BLEND16(reflect,    (B == 65535) ? B : FFMIN(65535, (A * A / (65535 - B))), 16)
+DEFINE_BLEND16(glow,       (A == 65535) ? A : FFMIN(65535, (B * B / (65535 - A))), 16)
+DEFINE_BLEND16(and,        A & B, 16)
+DEFINE_BLEND16(or,         A | B, 16)
+DEFINE_BLEND16(xor,        A ^ B, 16)
+DEFINE_BLEND16(vividlight, (A < 32768) ? BURN(2 * A, B) : DODGE(2 * (A - 32768), B), 16)
+DEFINE_BLEND16(linearlight,av_clip_uint16((B < 32768) ? B + 2 * A - 65535 : B + 2 * (A - 32768)), 16)
+
+#undef MULTIPLY
+#undef SCREEN
+#undef BURN
+#undef DODGE
+
+#define MULTIPLY(x, a, b) ((x) * (((a) * (b)) / 1023))
+#define SCREEN(x, a, b)   (1023 - (x) * ((1023 - (a)) * (1023 - (b)) / 1023))
+#define BURN(a, b)        (((a) == 0) ? (a) : FFMAX(0, 1023 - ((1023 - (b)) << 10) / (a)))
+#define DODGE(a, b)       (((a) == 1023) ? (a) : FFMIN(1023, (((b) << 10) / (1023 - (a)))))
+
+DEFINE_BLEND16(addition,   FFMIN(1023, A + B), 10)
+DEFINE_BLEND16(grainmerge, (int)av_clip_uintp2(A + B - 512, 10), 10)
+DEFINE_BLEND16(average,    (A + B) / 2, 10)
+DEFINE_BLEND16(subtract,   FFMAX(0, A - B), 10)
+DEFINE_BLEND16(multiply,   MULTIPLY(1, A, B), 10)
+DEFINE_BLEND16(multiply128, (int)av_clip_uintp2((A - 512) * B / 128. + 512, 10), 10)
+DEFINE_BLEND16(negation,   1023 - FFABS(1023 - A - B), 10)
+DEFINE_BLEND16(extremity,  FFABS(1023 - A - B), 10)
+DEFINE_BLEND16(difference, FFABS(A - B), 10)
+DEFINE_BLEND16(grainextract, (int)av_clip_uintp2(512 + A - B, 10), 10)
+DEFINE_BLEND16(screen,     SCREEN(1, A, B), 10)
+DEFINE_BLEND16(overlay,    (A < 512) ? MULTIPLY(2, A, B) : SCREEN(2, A, B), 10)
+DEFINE_BLEND16(hardlight,  (B < 512) ? MULTIPLY(2, B, A) : SCREEN(2, B, A), 10)
+DEFINE_BLEND16(hardmix,    (A < (1023 - B)) ? 0: 1023, 10)
+DEFINE_BLEND16(heat,       (A == 0) ? 0 : 1023 - FFMIN(((1023 - B) * (1023 - B)) / A, 1023), 10)
+DEFINE_BLEND16(freeze,     (B == 0) ? 0 : 1023 - FFMIN(((1023 - A) * (1023 - A)) / B, 1023), 10)
+DEFINE_BLEND16(darken,     FFMIN(A, B), 10)
+DEFINE_BLEND16(lighten,    FFMAX(A, B), 10)
+DEFINE_BLEND16(divide,     (int)av_clip_uintp2(B == 0 ? 1023 : 1023 * A / B, 10), 10)
+DEFINE_BLEND16(dodge,      DODGE(A, B), 10)
+DEFINE_BLEND16(burn,       BURN(A, B), 10)
+DEFINE_BLEND16(softlight,  (A > 511) ? B + (1023 - B) * (A - 511.5) / 511.5 * (0.5 - fabs(B - 511.5) / 1023): B - B * ((511.5 - A) / 511.5) * (0.5 - fabs(B - 511.5)/1023), 10)
+DEFINE_BLEND16(exclusion,  A + B - 2 * A * B / 1023, 10)
+DEFINE_BLEND16(pinlight,   (B < 512) ? FFMIN(A, 2 * B) : FFMAX(A, 2 * (B - 512)), 10)
+DEFINE_BLEND16(phoenix,    FFMIN(A, B) - FFMAX(A, B) + 1023, 10)
+DEFINE_BLEND16(reflect,    (B == 1023) ? B : FFMIN(1023, (A * A / (1023 - B))), 10)
+DEFINE_BLEND16(glow,       (A == 1023) ? A : FFMIN(1023, (B * B / (1023 - A))), 10)
+DEFINE_BLEND16(and,        A & B, 10)
+DEFINE_BLEND16(or,         A | B, 10)
+DEFINE_BLEND16(xor,        A ^ B, 10)
+DEFINE_BLEND16(vividlight, (A < 512) ? BURN(2 * A, B) : DODGE(2 * (A - 512), B), 10)
+DEFINE_BLEND16(linearlight,(int)av_clip_uintp2((B < 512) ? B + 2 * A - 1023 : B + 2 * (A - 512), 10), 10)
+
+#undef MULTIPLY
+#undef SCREEN
+#undef BURN
+#undef DODGE
+
+#define MULTIPLY(x, a, b) ((x) * (((a) * (b)) / 4095))
+#define SCREEN(x, a, b)   (4095 - (x) * ((4095 - (a)) * (4095 - (b)) / 4095))
+#define BURN(a, b)        (((a) == 0) ? (a) : FFMAX(0, 4095 - ((4095 - (b)) << 12) / (a)))
+#define DODGE(a, b)       (((a) == 4095) ? (a) : FFMIN(4095, (((b) << 12) / (4095 - (a)))))
+
+DEFINE_BLEND16(addition,   FFMIN(4095, A + B), 12)
+DEFINE_BLEND16(grainmerge, (int)av_clip_uintp2(A + B - 2048, 12), 12)
+DEFINE_BLEND16(average,    (A + B) / 2, 12)
+DEFINE_BLEND16(subtract,   FFMAX(0, A - B), 12)
+DEFINE_BLEND16(multiply,   MULTIPLY(1, A, B), 12)
+DEFINE_BLEND16(multiply128, (int)av_clip_uintp2((A - 2048) * B / 512. + 2048, 12), 12)
+DEFINE_BLEND16(negation,   4095 - FFABS(4095 - A - B), 12)
+DEFINE_BLEND16(extremity,  FFABS(4095 - A - B), 12)
+DEFINE_BLEND16(difference, FFABS(A - B), 12)
+DEFINE_BLEND16(grainextract, (int)av_clip_uintp2(2048 + A - B, 12), 12)
+DEFINE_BLEND16(screen,     SCREEN(1, A, B), 12)
+DEFINE_BLEND16(overlay,    (A < 2048) ? MULTIPLY(2, A, B) : SCREEN(2, A, B), 12)
+DEFINE_BLEND16(hardlight,  (B < 2048) ? MULTIPLY(2, B, A) : SCREEN(2, B, A), 12)
+DEFINE_BLEND16(hardmix,    (A < (4095 - B)) ? 0: 4095, 12)
+DEFINE_BLEND16(heat,       (A == 0) ? 0 : 4095 - FFMIN(((4095 - B) * (4095 - B)) / A, 4095), 12)
+DEFINE_BLEND16(freeze,     (B == 0) ? 0 : 4095 - FFMIN(((4095 - A) * (4095 - A)) / B, 4095), 12)
+DEFINE_BLEND16(darken,     FFMIN(A, B), 12)
+DEFINE_BLEND16(lighten,    FFMAX(A, B), 12)
+DEFINE_BLEND16(divide,     (int)av_clip_uintp2(B == 0 ? 4095 : 4095 * A / B, 12), 12)
+DEFINE_BLEND16(dodge,      DODGE(A, B), 12)
+DEFINE_BLEND16(burn,       BURN(A, B), 12)
+DEFINE_BLEND16(softlight,  (A > 2047) ? B + (4095 - B) * (A - 2047.5) / 2047.5 * (0.5 - fabs(B - 2047.5) / 4095): B - B * ((2047.5 - A) / 2047.5) * (0.5 - fabs(B - 2047.5)/4095), 12)
+DEFINE_BLEND16(exclusion,  A + B - 2 * A * B / 4095, 12)
+DEFINE_BLEND16(pinlight,   (B < 2048) ? FFMIN(A, 2 * B) : FFMAX(A, 2 * (B - 2048)), 12)
+DEFINE_BLEND16(phoenix,    FFMIN(A, B) - FFMAX(A, B) + 4095, 12)
+DEFINE_BLEND16(reflect,    (B == 4095) ? B : FFMIN(4095, (A * A / (4095 - B))), 12)
+DEFINE_BLEND16(glow,       (A == 4095) ? A : FFMIN(4095, (B * B / (4095 - A))), 12)
+DEFINE_BLEND16(and,        A & B, 12)
+DEFINE_BLEND16(or,         A | B, 12)
+DEFINE_BLEND16(xor,        A ^ B, 12)
+DEFINE_BLEND16(vividlight, (A < 2048) ? BURN(2 * A, B) : DODGE(2 * (A - 2048), B), 12)
+DEFINE_BLEND16(linearlight,(int)av_clip_uintp2((B < 2048) ? B + 2 * A - 4095 : B + 2 * (A - 2048), 12), 12)
+
+#undef MULTIPLY
+#undef SCREEN
+#undef BURN
+#undef DODGE
+
+#define MULTIPLY(x, a, b) ((x) * (((a) * (b)) / 511))
+#define SCREEN(x, a, b)   (511 - (x) * ((511 - (a)) * (511 - (b)) / 511))
+#define BURN(a, b)        (((a) == 0) ? (a) : FFMAX(0, 511 - ((511 - (b)) << 9) / (a)))
+#define DODGE(a, b)       (((a) == 511) ? (a) : FFMIN(511, (((b) << 9) / (511 - (a)))))
+
+DEFINE_BLEND16(addition,   FFMIN(511, A + B), 9)
+DEFINE_BLEND16(grainmerge, (int)av_clip_uintp2(A + B - 256, 9), 9)
+DEFINE_BLEND16(average,    (A + B) / 2, 9)
+DEFINE_BLEND16(subtract,   FFMAX(0, A - B), 9)
+DEFINE_BLEND16(multiply,   MULTIPLY(1, A, B), 9)
+DEFINE_BLEND16(multiply128, (int)av_clip_uintp2((A - 256) * B / 64. + 256, 9), 9)
+DEFINE_BLEND16(negation,   511 - FFABS(511 - A - B), 9)
+DEFINE_BLEND16(extremity,  FFABS(511 - A - B), 9)
+DEFINE_BLEND16(difference, FFABS(A - B), 9)
+DEFINE_BLEND16(grainextract, (int)av_clip_uintp2(256 + A - B, 9), 9)
+DEFINE_BLEND16(screen,     SCREEN(1, A, B), 9)
+DEFINE_BLEND16(overlay,    (A < 256) ? MULTIPLY(2, A, B) : SCREEN(2, A, B), 9)
+DEFINE_BLEND16(hardlight,  (B < 256) ? MULTIPLY(2, B, A) : SCREEN(2, B, A), 9)
+DEFINE_BLEND16(hardmix,    (A < (511 - B)) ? 0: 511, 9)
+DEFINE_BLEND16(heat,       (A == 0) ? 0 : 511 - FFMIN(((511 - B) * (511 - B)) / A, 511), 9)
+DEFINE_BLEND16(freeze,     (B == 0) ? 0 : 511 - FFMIN(((511 - A) * (511 - A)) / B, 511), 9)
+DEFINE_BLEND16(darken,     FFMIN(A, B), 9)
+DEFINE_BLEND16(lighten,    FFMAX(A, B), 9)
+DEFINE_BLEND16(divide,     (int)av_clip_uintp2(B == 0 ? 511 : 511 * A / B, 9), 9)
+DEFINE_BLEND16(dodge,      DODGE(A, B), 9)
+DEFINE_BLEND16(burn,       BURN(A, B), 9)
+DEFINE_BLEND16(softlight,  (A > 511) ? B + (511 - B) * (A - 511.5) / 511.5 * (0.5 - fabs(B - 511.5) / 511): B - B * ((511.5 - A) / 511.5) * (0.5 - fabs(B - 511.5)/511), 9)
+DEFINE_BLEND16(exclusion,  A + B - 2 * A * B / 511, 9)
+DEFINE_BLEND16(pinlight,   (B < 256) ? FFMIN(A, 2 * B) : FFMAX(A, 2 * (B - 256)), 9)
+DEFINE_BLEND16(phoenix,    FFMIN(A, B) - FFMAX(A, B) + 511, 9)
+DEFINE_BLEND16(reflect,    (B == 511) ? B : FFMIN(511, (A * A / (511 - B))), 9)
+DEFINE_BLEND16(glow,       (A == 511) ? A : FFMIN(511, (B * B / (511 - A))), 9)
+DEFINE_BLEND16(and,        A & B, 9)
+DEFINE_BLEND16(or,         A | B, 9)
+DEFINE_BLEND16(xor,        A ^ B, 9)
+DEFINE_BLEND16(vividlight, (A < 256) ? BURN(2 * A, B) : DODGE(2 * (A - 256), B), 9)
+DEFINE_BLEND16(linearlight,(int)av_clip_uintp2((B < 256) ? B + 2 * A - 511 : B + 2 * (A - 256), 9), 9)
 
 #define DEFINE_BLEND_EXPR(type, name, div)                                     \
 static void blend_expr_## name(const uint8_t *_top, ptrdiff_t top_linesize,          \
@@ -437,6 +569,14 @@
         AV_PIX_FMT_YUVJ444P, AV_PIX_FMT_YUVJ440P, AV_PIX_FMT_YUVJ422P,AV_PIX_FMT_YUVJ420P, AV_PIX_FMT_YUVJ411P,
         AV_PIX_FMT_YUV444P, AV_PIX_FMT_YUV440P, AV_PIX_FMT_YUV422P, AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUV411P, AV_PIX_FMT_YUV410P,
         AV_PIX_FMT_GBRP, AV_PIX_FMT_GBRAP, AV_PIX_FMT_GRAY8,
+        AV_PIX_FMT_YUV420P9, AV_PIX_FMT_YUV422P9, AV_PIX_FMT_YUV444P9,
+        AV_PIX_FMT_YUVA420P9, AV_PIX_FMT_YUVA422P9, AV_PIX_FMT_YUVA444P9, AV_PIX_FMT_GBRP9,
+        AV_PIX_FMT_YUV420P10, AV_PIX_FMT_YUV422P10, AV_PIX_FMT_YUV444P10, AV_PIX_FMT_YUV440P10,
+        AV_PIX_FMT_YUVA420P10, AV_PIX_FMT_YUVA422P10, AV_PIX_FMT_YUVA444P10,
+        AV_PIX_FMT_GBRP10, AV_PIX_FMT_GBRAP10, AV_PIX_FMT_GRAY10,
+        AV_PIX_FMT_YUV420P12, AV_PIX_FMT_YUV422P12, AV_PIX_FMT_YUV444P12, AV_PIX_FMT_YUV440P12,
+        AV_PIX_FMT_YUVA422P12, AV_PIX_FMT_YUVA444P12,
+        AV_PIX_FMT_GBRP12, AV_PIX_FMT_GBRAP12, AV_PIX_FMT_GRAY12,
         AV_PIX_FMT_YUV420P16, AV_PIX_FMT_YUV422P16, AV_PIX_FMT_YUV444P16,
         AV_PIX_FMT_YUVA420P16, AV_PIX_FMT_YUVA422P16, AV_PIX_FMT_YUVA444P16,
         AV_PIX_FMT_GBRP16, AV_PIX_FMT_GBRAP16, AV_PIX_FMT_GRAY16,
@@ -461,52 +601,82 @@
         av_expr_free(s->params[i].e);
 }
 
-void ff_blend_init(FilterParams *param, int is_16bit)
+#define DEFINE_INIT_BLEND_FUNC(depth, nbits)                                          \
+static av_cold void init_blend_func_##depth##_##nbits##bit(FilterParams *param)       \
+{                                                                                     \
+    switch (param->mode) {                                                            \
+    case BLEND_ADDITION:     param->blend = blend_addition_##depth##bit;     break;   \
+    case BLEND_GRAINMERGE:   param->blend = blend_grainmerge_##depth##bit;   break;   \
+    case BLEND_AND:          param->blend = blend_and_##depth##bit;          break;   \
+    case BLEND_AVERAGE:      param->blend = blend_average_##depth##bit;      break;   \
+    case BLEND_BURN:         param->blend = blend_burn_##depth##bit;         break;   \
+    case BLEND_DARKEN:       param->blend = blend_darken_##depth##bit;       break;   \
+    case BLEND_DIFFERENCE:   param->blend = blend_difference_##depth##bit;   break;   \
+    case BLEND_GRAINEXTRACT: param->blend = blend_grainextract_##depth##bit; break;   \
+    case BLEND_DIVIDE:       param->blend = blend_divide_##depth##bit;       break;   \
+    case BLEND_DODGE:        param->blend = blend_dodge_##depth##bit;        break;   \
+    case BLEND_EXCLUSION:    param->blend = blend_exclusion_##depth##bit;    break;   \
+    case BLEND_EXTREMITY:    param->blend = blend_extremity_##depth##bit;    break;   \
+    case BLEND_FREEZE:       param->blend = blend_freeze_##depth##bit;       break;   \
+    case BLEND_GLOW:         param->blend = blend_glow_##depth##bit;         break;   \
+    case BLEND_HARDLIGHT:    param->blend = blend_hardlight_##depth##bit;    break;   \
+    case BLEND_HARDMIX:      param->blend = blend_hardmix_##depth##bit;      break;   \
+    case BLEND_HEAT:         param->blend = blend_heat_##depth##bit;         break;   \
+    case BLEND_LIGHTEN:      param->blend = blend_lighten_##depth##bit;      break;   \
+    case BLEND_LINEARLIGHT:  param->blend = blend_linearlight_##depth##bit;  break;   \
+    case BLEND_MULTIPLY:     param->blend = blend_multiply_##depth##bit;     break;   \
+    case BLEND_MULTIPLY128:  param->blend = blend_multiply128_##depth##bit;  break;   \
+    case BLEND_NEGATION:     param->blend = blend_negation_##depth##bit;     break;   \
+    case BLEND_NORMAL:       param->blend = blend_normal_##nbits##bit;       break;   \
+    case BLEND_OR:           param->blend = blend_or_##depth##bit;           break;   \
+    case BLEND_OVERLAY:      param->blend = blend_overlay_##depth##bit;      break;   \
+    case BLEND_PHOENIX:      param->blend = blend_phoenix_##depth##bit;      break;   \
+    case BLEND_PINLIGHT:     param->blend = blend_pinlight_##depth##bit;     break;   \
+    case BLEND_REFLECT:      param->blend = blend_reflect_##depth##bit;      break;   \
+    case BLEND_SCREEN:       param->blend = blend_screen_##depth##bit;       break;   \
+    case BLEND_SOFTLIGHT:    param->blend = blend_softlight_##depth##bit;    break;   \
+    case BLEND_SUBTRACT:     param->blend = blend_subtract_##depth##bit;     break;   \
+    case BLEND_VIVIDLIGHT:   param->blend = blend_vividlight_##depth##bit;   break;   \
+    case BLEND_XOR:          param->blend = blend_xor_##depth##bit;          break;   \
+    }                                                                                 \
+}
+DEFINE_INIT_BLEND_FUNC(8, 8)
+DEFINE_INIT_BLEND_FUNC(9, 16)
+DEFINE_INIT_BLEND_FUNC(10, 16)
+DEFINE_INIT_BLEND_FUNC(12, 16)
+DEFINE_INIT_BLEND_FUNC(16, 16)
+
+void ff_blend_init(FilterParams *param, int depth)
 {
-    switch (param->mode) {
-    case BLEND_ADDITION:   param->blend = is_16bit ? blend_addition_16bit   : blend_addition_8bit;   break;
-    case BLEND_GRAINMERGE: param->blend = is_16bit ? blend_grainmerge_16bit : blend_grainmerge_8bit; break;
-    case BLEND_AND:        param->blend = is_16bit ? blend_and_16bit        : blend_and_8bit;        break;
-    case BLEND_AVERAGE:    param->blend = is_16bit ? blend_average_16bit    : blend_average_8bit;    break;
-    case BLEND_BURN:       param->blend = is_16bit ? blend_burn_16bit       : blend_burn_8bit;       break;
-    case BLEND_DARKEN:     param->blend = is_16bit ? blend_darken_16bit     : blend_darken_8bit;     break;
-    case BLEND_DIFFERENCE: param->blend = is_16bit ? blend_difference_16bit : blend_difference_8bit; break;
-    case BLEND_GRAINEXTRACT: param->blend = is_16bit ? blend_grainextract_16bit: blend_grainextract_8bit; break;
-    case BLEND_DIVIDE:     param->blend = is_16bit ? blend_divide_16bit     : blend_divide_8bit;     break;
-    case BLEND_DODGE:      param->blend = is_16bit ? blend_dodge_16bit      : blend_dodge_8bit;      break;
-    case BLEND_EXCLUSION:  param->blend = is_16bit ? blend_exclusion_16bit  : blend_exclusion_8bit;  break;
-    case BLEND_EXTREMITY:  param->blend = is_16bit ? blend_extremity_16bit  : blend_extremity_8bit;  break;
-    case BLEND_FREEZE:     param->blend = is_16bit ? blend_freeze_16bit     : blend_freeze_8bit;     break;
-    case BLEND_GLOW:       param->blend = is_16bit ? blend_glow_16bit       : blend_glow_8bit;       break;
-    case BLEND_HARDLIGHT:  param->blend = is_16bit ? blend_hardlight_16bit  : blend_hardlight_8bit;  break;
-    case BLEND_HARDMIX:    param->blend = is_16bit ? blend_hardmix_16bit    : blend_hardmix_8bit;    break;
-    case BLEND_HEAT:       param->blend = is_16bit ? blend_heat_16bit       : blend_heat_8bit;       break;
-    case BLEND_LIGHTEN:    param->blend = is_16bit ? blend_lighten_16bit    : blend_lighten_8bit;    break;
-    case BLEND_LINEARLIGHT:param->blend = is_16bit ? blend_linearlight_16bit: blend_linearlight_8bit;break;
-    case BLEND_MULTIPLY:   param->blend = is_16bit ? blend_multiply_16bit   : blend_multiply_8bit;   break;
-    case BLEND_MULTIPLY128:param->blend = is_16bit ? blend_multiply128_16bit: blend_multiply128_8bit;break;
-    case BLEND_NEGATION:   param->blend = is_16bit ? blend_negation_16bit   : blend_negation_8bit;   break;
-    case BLEND_NORMAL:     param->blend = param->opacity == 1 ? blend_copytop :
-                                          param->opacity == 0 ? blend_copybottom :
-                                          is_16bit ? blend_normal_16bit     : blend_normal_8bit;     break;
-    case BLEND_OR:         param->blend = is_16bit ? blend_or_16bit         : blend_or_8bit;         break;
-    case BLEND_OVERLAY:    param->blend = is_16bit ? blend_overlay_16bit    : blend_overlay_8bit;    break;
-    case BLEND_PHOENIX:    param->blend = is_16bit ? blend_phoenix_16bit    : blend_phoenix_8bit;    break;
-    case BLEND_PINLIGHT:   param->blend = is_16bit ? blend_pinlight_16bit   : blend_pinlight_8bit;   break;
-    case BLEND_REFLECT:    param->blend = is_16bit ? blend_reflect_16bit    : blend_reflect_8bit;    break;
-    case BLEND_SCREEN:     param->blend = is_16bit ? blend_screen_16bit     : blend_screen_8bit;     break;
-    case BLEND_SOFTLIGHT:  param->blend = is_16bit ? blend_softlight_16bit  : blend_softlight_8bit;  break;
-    case BLEND_SUBTRACT:   param->blend = is_16bit ? blend_subtract_16bit   : blend_subtract_8bit;   break;
-    case BLEND_VIVIDLIGHT: param->blend = is_16bit ? blend_vividlight_16bit : blend_vividlight_8bit; break;
-    case BLEND_XOR:        param->blend = is_16bit ? blend_xor_16bit        : blend_xor_8bit;        break;
+    switch (depth) {
+    case 8:
+        init_blend_func_8_8bit(param);
+        break;
+    case 9:
+        init_blend_func_9_16bit(param);
+        break;
+    case 10:
+        init_blend_func_10_16bit(param);
+        break;
+    case 12:
+        init_blend_func_12_16bit(param);
+        break;
+    case 16:
+        init_blend_func_16_16bit(param);
+        break;
     }
 
     if (param->opacity == 0 && param->mode != BLEND_NORMAL) {
-        param->blend = blend_copytop;
+        param->blend = depth > 8 ? blend_copytop_16 : blend_copytop_8;
+    } else if (param->mode == BLEND_NORMAL) {
+        if (param->opacity == 1)
+            param->blend = depth > 8 ? blend_copytop_16 : blend_copytop_8;
+        else if (param->opacity == 0)
+            param->blend = depth > 8 ? blend_copybottom_16 : blend_copybottom_8;
     }
 
     if (ARCH_X86)
-        ff_blend_init_x86(param, is_16bit);
+        ff_blend_init_x86(param, depth);
 }
 
 static int config_output(AVFilterLink *outlink)
@@ -515,7 +685,7 @@
     AVFilterLink *toplink = ctx->inputs[TOP];
     BlendContext *s = ctx->priv;
     const AVPixFmtDescriptor *pix_desc = av_pix_fmt_desc_get(toplink->format);
-    int ret, plane, is_16bit;
+    int ret, plane;
 
     if (!s->tblend) {
         AVFilterLink *bottomlink = ctx->inputs[BOTTOM];
@@ -543,7 +713,7 @@
     s->hsub = pix_desc->log2_chroma_w;
     s->vsub = pix_desc->log2_chroma_h;
 
-    is_16bit = pix_desc->comp[0].depth == 16;
+    s->depth = pix_desc->comp[0].depth;
     s->nb_planes = av_pix_fmt_count_planes(toplink->format);
 
     if (!s->tblend)
@@ -558,7 +728,7 @@
         if (s->all_opacity < 1)
             param->opacity = s->all_opacity;
 
-        ff_blend_init(param, is_16bit);
+        ff_blend_init(param, s->depth);
 
         if (s->all_expr && !param->expr_str) {
             param->expr_str = av_strdup(s->all_expr);
@@ -570,11 +740,17 @@
                                 NULL, NULL, NULL, NULL, 0, ctx);
             if (ret < 0)
                 return ret;
-            param->blend = is_16bit? blend_expr_16bit : blend_expr_8bit;
+            param->blend = s->depth > 8 ? blend_expr_16bit : blend_expr_8bit;
         }
     }
 
-    return s->tblend ? 0 : ff_framesync_configure(&s->fs);
+    if (s->tblend)
+        return 0;
+
+    ret = ff_framesync_configure(&s->fs);
+    outlink->time_base = s->fs.time_base;
+
+    return ret;
 }
 
 #if CONFIG_BLEND_FILTER
diff --git a/libavfilter/vf_bm3d.c b/libavfilter/vf_bm3d.c
index 75c3567..e5d2b8b 100644
--- a/libavfilter/vf_bm3d.c
+++ b/libavfilter/vf_bm3d.c
@@ -153,7 +153,7 @@
     { "final",  "final estimate",
         0,                      AV_OPT_TYPE_CONST, {.i64=FINAL}, 0,            0, FLAGS, "mode" },
     { "ref",    "have reference stream",
-        OFFSET(ref),            AV_OPT_TYPE_INT,    {.i64=0},    0,            1, FLAGS },
+        OFFSET(ref),            AV_OPT_TYPE_BOOL,  {.i64=0},     0,            1, FLAGS },
     { "planes", "set planes to filter",
         OFFSET(planes),         AV_OPT_TYPE_INT,   {.i64=7},     0,           15, FLAGS },
     { NULL }
@@ -164,9 +164,8 @@
 static int query_formats(AVFilterContext *ctx)
 {
     static const enum AVPixelFormat pix_fmts[] = {
-        AV_PIX_FMT_GRAY8,
-        AV_PIX_FMT_GRAY9,   AV_PIX_FMT_GRAY10,
-        AV_PIX_FMT_GRAY12,  AV_PIX_FMT_GRAY16,
+        AV_PIX_FMT_GRAY8, AV_PIX_FMT_GRAY9, AV_PIX_FMT_GRAY10,
+        AV_PIX_FMT_GRAY12, AV_PIX_FMT_GRAY14, AV_PIX_FMT_GRAY16,
         AV_PIX_FMT_YUV410P, AV_PIX_FMT_YUV411P,
         AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUV422P,
         AV_PIX_FMT_YUV440P, AV_PIX_FMT_YUV444P,
@@ -182,6 +181,11 @@
         AV_PIX_FMT_YUV420P16, AV_PIX_FMT_YUV422P16, AV_PIX_FMT_YUV444P16,
         AV_PIX_FMT_GBRP, AV_PIX_FMT_GBRP9, AV_PIX_FMT_GBRP10,
         AV_PIX_FMT_GBRP12, AV_PIX_FMT_GBRP14, AV_PIX_FMT_GBRP16,
+        AV_PIX_FMT_YUVA420P,  AV_PIX_FMT_YUVA422P,   AV_PIX_FMT_YUVA444P,
+        AV_PIX_FMT_YUVA444P9, AV_PIX_FMT_YUVA444P10, AV_PIX_FMT_YUVA444P12, AV_PIX_FMT_YUVA444P16,
+        AV_PIX_FMT_YUVA422P9, AV_PIX_FMT_YUVA422P10, AV_PIX_FMT_YUVA422P12, AV_PIX_FMT_YUVA422P16,
+        AV_PIX_FMT_YUVA420P9, AV_PIX_FMT_YUVA420P10, AV_PIX_FMT_YUVA420P16,
+        AV_PIX_FMT_GBRAP,     AV_PIX_FMT_GBRAP10,    AV_PIX_FMT_GBRAP12,    AV_PIX_FMT_GBRAP16,
         AV_PIX_FMT_NONE
     };
 
@@ -439,7 +443,7 @@
         }
     }
 
-    threshold[0] = s->hard_threshold * s->sigma;
+    threshold[0] = s->hard_threshold * s->sigma * M_SQRT2 * block_size * block_size * (1 << (s->depth - 8)) / 255.f;
     threshold[1] = threshold[0] * sqrtf(2.f);
     threshold[2] = threshold[0] * 2.f;
     threshold[3] = threshold[0] * sqrtf(8.f);
@@ -660,7 +664,7 @@
                 sum_den += den;
             }
 
-            dstp[j] = av_clip_uint8(sum_num / sum_den);
+            dstp[j] = av_clip_uint8(lrintf(sum_num / sum_den));
         }
     }
 }
@@ -688,7 +692,7 @@
                 sum_den += den;
             }
 
-            dstp[j] = av_clip_uintp2_c(sum_num / sum_den, depth);
+            dstp[j] = av_clip_uintp2_c(lrintf(sum_num / sum_den), depth);
         }
     }
 }
@@ -706,8 +710,8 @@
     const int plane = td->plane;
     const int width = s->planewidth[plane];
     const int height = s->planeheight[plane];
-    const int block_pos_bottom = height - s->block_size;
-    const int block_pos_right  = width - s->block_size;
+    const int block_pos_bottom = FFMAX(0, height - s->block_size);
+    const int block_pos_right  = FFMAX(0, width - s->block_size);
     const int slice_start = (((height + block_step - 1) / block_step) * jobnr / nb_jobs) * block_step;
     const int slice_end = (jobnr == nb_jobs - 1) ? block_pos_bottom + block_step :
                           (((height + block_step - 1) / block_step) * (jobnr + 1) / nb_jobs) * block_step;
@@ -748,7 +752,7 @@
     av_frame_copy_props(*out, in);
 
     for (p = 0; p < s->nb_planes; p++) {
-        const int nb_jobs = FFMIN(s->nb_threads, s->planeheight[p] / s->block_step);
+        const int nb_jobs = FFMAX(1, FFMIN(s->nb_threads, s->planeheight[p] / s->block_size));
         ThreadData td;
 
         if (!((1 << p) & s->planes) || ctx->is_disabled) {
@@ -796,8 +800,8 @@
     for (i = 0; i < s->nb_threads; i++) {
         SliceContext *sc = &s->slices[i];
 
-        sc->num = av_calloc(s->planewidth[0] * s->planeheight[0], sizeof(FFTSample));
-        sc->den = av_calloc(s->planewidth[0] * s->planeheight[0], sizeof(FFTSample));
+        sc->num = av_calloc(FFALIGN(s->planewidth[0], s->block_size) * FFALIGN(s->planeheight[0], s->block_size), sizeof(FFTSample));
+        sc->den = av_calloc(FFALIGN(s->planewidth[0], s->block_size) * FFALIGN(s->planeheight[0], s->block_size), sizeof(FFTSample));
         if (!sc->num || !sc->den)
             return AVERROR(ENOMEM);
 
@@ -857,6 +861,8 @@
         int ret, status;
         int64_t pts;
 
+        FF_FILTER_FORWARD_STATUS_BACK(ctx->outputs[0], ctx->inputs[0]);
+
         if ((ret = ff_inlink_consume_frame(ctx->inputs[0], &frame)) > 0) {
             ret = filter_frame(ctx, &out, frame, frame);
             av_frame_free(&frame);
diff --git a/libavfilter/vf_bwdif.c b/libavfilter/vf_bwdif.c
index b691983..b6aed7a 100644
--- a/libavfilter/vf_bwdif.c
+++ b/libavfilter/vf_bwdif.c
@@ -216,10 +216,11 @@
 static int filter_slice(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
 {
     BWDIFContext *s = ctx->priv;
+    YADIFContext *yadif = &s->yadif;
     ThreadData *td  = arg;
-    int linesize = s->cur->linesize[td->plane];
-    int clip_max = (1 << (s->csp->comp[td->plane].depth)) - 1;
-    int df = (s->csp->comp[td->plane].depth + 7) / 8;
+    int linesize = yadif->cur->linesize[td->plane];
+    int clip_max = (1 << (yadif->csp->comp[td->plane].depth)) - 1;
+    int df = (yadif->csp->comp[td->plane].depth + 7) / 8;
     int refs = linesize / df;
     int slice_start = (td->h *  jobnr   ) / nb_jobs;
     int slice_end   = (td->h * (jobnr+1)) / nb_jobs;
@@ -227,11 +228,11 @@
 
     for (y = slice_start; y < slice_end; y++) {
         if ((y ^ td->parity) & 1) {
-            uint8_t *prev = &s->prev->data[td->plane][y * linesize];
-            uint8_t *cur  = &s->cur ->data[td->plane][y * linesize];
-            uint8_t *next = &s->next->data[td->plane][y * linesize];
+            uint8_t *prev = &yadif->prev->data[td->plane][y * linesize];
+            uint8_t *cur  = &yadif->cur ->data[td->plane][y * linesize];
+            uint8_t *next = &yadif->next->data[td->plane][y * linesize];
             uint8_t *dst  = &td->frame->data[td->plane][y * td->frame->linesize[td->plane]];
-            if (!s->inter_field) {
+            if (yadif->current_field == YADIF_FIELD_END) {
                 s->filter_intra(dst, cur, td->w, (y + df) < td->h ? refs : -refs,
                                 y > (df - 1) ? -refs : refs,
                                 (y + 3*df) < td->h ? 3 * refs : -refs,
@@ -252,7 +253,7 @@
             }
         } else {
             memcpy(&td->frame->data[td->plane][y * td->frame->linesize[td->plane]],
-                   &s->cur->data[td->plane][y * linesize], td->w * df);
+                   &yadif->cur->data[td->plane][y * linesize], td->w * df);
         }
     }
     return 0;
@@ -262,16 +263,17 @@
                    int parity, int tff)
 {
     BWDIFContext *bwdif = ctx->priv;
+    YADIFContext *yadif = &bwdif->yadif;
     ThreadData td = { .frame = dstpic, .parity = parity, .tff = tff };
     int i;
 
-    for (i = 0; i < bwdif->csp->nb_components; i++) {
+    for (i = 0; i < yadif->csp->nb_components; i++) {
         int w = dstpic->width;
         int h = dstpic->height;
 
         if (i == 1 || i == 2) {
-            w = AV_CEIL_RSHIFT(w, bwdif->csp->log2_chroma_w);
-            h = AV_CEIL_RSHIFT(h, bwdif->csp->log2_chroma_h);
+            w = AV_CEIL_RSHIFT(w, yadif->csp->log2_chroma_w);
+            h = AV_CEIL_RSHIFT(h, yadif->csp->log2_chroma_h);
         }
 
         td.w     = w;
@@ -280,186 +282,21 @@
 
         ctx->internal->execute(ctx, filter_slice, &td, NULL, FFMIN(h, ff_filter_get_nb_threads(ctx)));
     }
-    if (!bwdif->inter_field) {
-        bwdif->inter_field = 1;
+    if (yadif->current_field == YADIF_FIELD_END) {
+        yadif->current_field = YADIF_FIELD_NORMAL;
     }
 
     emms_c();
 }
 
-static int return_frame(AVFilterContext *ctx, int is_second)
-{
-    BWDIFContext *bwdif = ctx->priv;
-    AVFilterLink *link  = ctx->outputs[0];
-    int tff, ret;
-
-    if (bwdif->parity == -1) {
-        tff = bwdif->cur->interlaced_frame ?
-              bwdif->cur->top_field_first : 1;
-    } else {
-        tff = bwdif->parity ^ 1;
-    }
-
-    if (is_second) {
-        bwdif->out = ff_get_video_buffer(link, link->w, link->h);
-        if (!bwdif->out)
-            return AVERROR(ENOMEM);
-
-        av_frame_copy_props(bwdif->out, bwdif->cur);
-        bwdif->out->interlaced_frame = 0;
-        if (bwdif->inter_field < 0)
-            bwdif->inter_field = 0;
-    }
-
-    filter(ctx, bwdif->out, tff ^ !is_second, tff);
-
-    if (is_second) {
-        int64_t cur_pts  = bwdif->cur->pts;
-        int64_t next_pts = bwdif->next->pts;
-
-        if (next_pts != AV_NOPTS_VALUE && cur_pts != AV_NOPTS_VALUE) {
-            bwdif->out->pts = cur_pts + next_pts;
-        } else {
-            bwdif->out->pts = AV_NOPTS_VALUE;
-        }
-    }
-    ret = ff_filter_frame(ctx->outputs[0], bwdif->out);
-
-    bwdif->frame_pending = (bwdif->mode&1) && !is_second;
-    return ret;
-}
-
-static int checkstride(BWDIFContext *bwdif, const AVFrame *a, const AVFrame *b)
-{
-    int i;
-    for (i = 0; i < bwdif->csp->nb_components; i++)
-        if (a->linesize[i] != b->linesize[i])
-            return 1;
-    return 0;
-}
-
-static void fixstride(AVFilterLink *link, AVFrame *f)
-{
-    AVFrame *dst = ff_default_get_video_buffer(link, f->width, f->height);
-    if(!dst)
-        return;
-    av_frame_copy_props(dst, f);
-    av_image_copy(dst->data, dst->linesize,
-                  (const uint8_t **)f->data, f->linesize,
-                  dst->format, dst->width, dst->height);
-    av_frame_unref(f);
-    av_frame_move_ref(f, dst);
-    av_frame_free(&dst);
-}
-
-static int filter_frame(AVFilterLink *link, AVFrame *frame)
-{
-    AVFilterContext *ctx = link->dst;
-    BWDIFContext *bwdif = ctx->priv;
-
-    av_assert0(frame);
-
-    if (bwdif->frame_pending)
-        return_frame(ctx, 1);
-
-    if (bwdif->prev)
-        av_frame_free(&bwdif->prev);
-    bwdif->prev = bwdif->cur;
-    bwdif->cur  = bwdif->next;
-    bwdif->next = frame;
-
-    if (!bwdif->cur) {
-        bwdif->cur = av_frame_clone(bwdif->next);
-        if (!bwdif->cur)
-            return AVERROR(ENOMEM);
-        bwdif->inter_field = 0;
-    }
-
-    if (checkstride(bwdif, bwdif->next, bwdif->cur)) {
-        av_log(ctx, AV_LOG_VERBOSE, "Reallocating frame due to differing stride\n");
-        fixstride(link, bwdif->next);
-    }
-    if (checkstride(bwdif, bwdif->next, bwdif->cur))
-        fixstride(link, bwdif->cur);
-    if (bwdif->prev && checkstride(bwdif, bwdif->next, bwdif->prev))
-        fixstride(link, bwdif->prev);
-    if (checkstride(bwdif, bwdif->next, bwdif->cur) || (bwdif->prev && checkstride(bwdif, bwdif->next, bwdif->prev))) {
-        av_log(ctx, AV_LOG_ERROR, "Failed to reallocate frame\n");
-        return -1;
-    }
-
-    if (!bwdif->prev)
-        return 0;
-
-    if ((bwdif->deint && !bwdif->cur->interlaced_frame) ||
-        ctx->is_disabled ||
-        (bwdif->deint && !bwdif->prev->interlaced_frame && bwdif->prev->repeat_pict) ||
-        (bwdif->deint && !bwdif->next->interlaced_frame && bwdif->next->repeat_pict)
-    ) {
-        bwdif->out  = av_frame_clone(bwdif->cur);
-        if (!bwdif->out)
-            return AVERROR(ENOMEM);
-
-        av_frame_free(&bwdif->prev);
-        if (bwdif->out->pts != AV_NOPTS_VALUE)
-            bwdif->out->pts *= 2;
-        return ff_filter_frame(ctx->outputs[0], bwdif->out);
-    }
-
-    bwdif->out = ff_get_video_buffer(ctx->outputs[0], link->w, link->h);
-    if (!bwdif->out)
-        return AVERROR(ENOMEM);
-
-    av_frame_copy_props(bwdif->out, bwdif->cur);
-    bwdif->out->interlaced_frame = 0;
-
-    if (bwdif->out->pts != AV_NOPTS_VALUE)
-        bwdif->out->pts *= 2;
-
-    return return_frame(ctx, 0);
-}
-
-static int request_frame(AVFilterLink *link)
-{
-    AVFilterContext *ctx = link->src;
-    BWDIFContext *bwdif = ctx->priv;
-    int ret;
-
-    if (bwdif->frame_pending) {
-        return_frame(ctx, 1);
-        return 0;
-    }
-
-    if (bwdif->eof)
-        return AVERROR_EOF;
-
-    ret  = ff_request_frame(link->src->inputs[0]);
-
-    if (ret == AVERROR_EOF && bwdif->cur) {
-        AVFrame *next = av_frame_clone(bwdif->next);
-
-        if (!next)
-            return AVERROR(ENOMEM);
-
-        bwdif->inter_field = -1;
-        next->pts = bwdif->next->pts * 2 - bwdif->cur->pts;
-
-        filter_frame(link->src->inputs[0], next);
-        bwdif->eof = 1;
-    } else if (ret < 0) {
-        return ret;
-    }
-
-    return 0;
-}
-
 static av_cold void uninit(AVFilterContext *ctx)
 {
     BWDIFContext *bwdif = ctx->priv;
+    YADIFContext *yadif = &bwdif->yadif;
 
-    av_frame_free(&bwdif->prev);
-    av_frame_free(&bwdif->cur );
-    av_frame_free(&bwdif->next);
+    av_frame_free(&yadif->prev);
+    av_frame_free(&yadif->cur );
+    av_frame_free(&yadif->next);
 }
 
 static int query_formats(AVFilterContext *ctx)
@@ -496,22 +333,24 @@
 {
     AVFilterContext *ctx = link->src;
     BWDIFContext *s = link->src->priv;
+    YADIFContext *yadif = &s->yadif;
 
     link->time_base.num = link->src->inputs[0]->time_base.num;
     link->time_base.den = link->src->inputs[0]->time_base.den * 2;
     link->w             = link->src->inputs[0]->w;
     link->h             = link->src->inputs[0]->h;
 
-    if(s->mode&1)
+    if(yadif->mode&1)
         link->frame_rate = av_mul_q(link->src->inputs[0]->frame_rate, (AVRational){2,1});
 
-    if (link->w < 3 || link->h < 3) {
-        av_log(ctx, AV_LOG_ERROR, "Video of less than 3 columns or lines is not supported\n");
+    if (link->w < 3 || link->h < 4) {
+        av_log(ctx, AV_LOG_ERROR, "Video of less than 3 columns or 4 lines is not supported\n");
         return AVERROR(EINVAL);
     }
 
-    s->csp = av_pix_fmt_desc_get(link->format);
-    if (s->csp->comp[0].depth > 8) {
+    yadif->csp = av_pix_fmt_desc_get(link->format);
+    yadif->filter = filter;
+    if (yadif->csp->comp[0].depth > 8) {
         s->filter_intra = filter_intra_16bit;
         s->filter_line  = filter_line_c_16bit;
         s->filter_edge  = filter_edge_16bit;
@@ -528,24 +367,24 @@
 }
 
 
-#define OFFSET(x) offsetof(BWDIFContext, x)
+#define OFFSET(x) offsetof(YADIFContext, x)
 #define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
 
 #define CONST(name, help, val, unit) { name, help, 0, AV_OPT_TYPE_CONST, {.i64=val}, INT_MIN, INT_MAX, FLAGS, unit }
 
 static const AVOption bwdif_options[] = {
-    { "mode",   "specify the interlacing mode", OFFSET(mode), AV_OPT_TYPE_INT, {.i64=BWDIF_MODE_SEND_FIELD}, 0, 1, FLAGS, "mode"},
-    CONST("send_frame", "send one frame for each frame", BWDIF_MODE_SEND_FRAME, "mode"),
-    CONST("send_field", "send one frame for each field", BWDIF_MODE_SEND_FIELD, "mode"),
+    { "mode",   "specify the interlacing mode", OFFSET(mode), AV_OPT_TYPE_INT, {.i64=YADIF_MODE_SEND_FIELD}, 0, 1, FLAGS, "mode"},
+    CONST("send_frame", "send one frame for each frame", YADIF_MODE_SEND_FRAME, "mode"),
+    CONST("send_field", "send one frame for each field", YADIF_MODE_SEND_FIELD, "mode"),
 
-    { "parity", "specify the assumed picture field parity", OFFSET(parity), AV_OPT_TYPE_INT, {.i64=BWDIF_PARITY_AUTO}, -1, 1, FLAGS, "parity" },
-    CONST("tff",  "assume top field first",    BWDIF_PARITY_TFF,  "parity"),
-    CONST("bff",  "assume bottom field first", BWDIF_PARITY_BFF,  "parity"),
-    CONST("auto", "auto detect parity",        BWDIF_PARITY_AUTO, "parity"),
+    { "parity", "specify the assumed picture field parity", OFFSET(parity), AV_OPT_TYPE_INT, {.i64=YADIF_PARITY_AUTO}, -1, 1, FLAGS, "parity" },
+    CONST("tff",  "assume top field first",    YADIF_PARITY_TFF,  "parity"),
+    CONST("bff",  "assume bottom field first", YADIF_PARITY_BFF,  "parity"),
+    CONST("auto", "auto detect parity",        YADIF_PARITY_AUTO, "parity"),
 
-    { "deint", "specify which frames to deinterlace", OFFSET(deint), AV_OPT_TYPE_INT, {.i64=BWDIF_DEINT_ALL}, 0, 1, FLAGS, "deint" },
-    CONST("all",        "deinterlace all frames",                       BWDIF_DEINT_ALL,        "deint"),
-    CONST("interlaced", "only deinterlace frames marked as interlaced", BWDIF_DEINT_INTERLACED, "deint"),
+    { "deint", "specify which frames to deinterlace", OFFSET(deint), AV_OPT_TYPE_INT, {.i64=YADIF_DEINT_ALL}, 0, 1, FLAGS, "deint" },
+    CONST("all",        "deinterlace all frames",                       YADIF_DEINT_ALL,        "deint"),
+    CONST("interlaced", "only deinterlace frames marked as interlaced", YADIF_DEINT_INTERLACED, "deint"),
 
     { NULL }
 };
@@ -556,7 +395,7 @@
     {
         .name          = "default",
         .type          = AVMEDIA_TYPE_VIDEO,
-        .filter_frame  = filter_frame,
+        .filter_frame  = ff_yadif_filter_frame,
     },
     { NULL }
 };
@@ -565,7 +404,7 @@
     {
         .name          = "default",
         .type          = AVMEDIA_TYPE_VIDEO,
-        .request_frame = request_frame,
+        .request_frame = ff_yadif_request_frame,
         .config_props  = config_props,
     },
     { NULL }
diff --git a/libavfilter/vf_cas.c b/libavfilter/vf_cas.c
new file mode 100644
index 0000000..7c32ed5
--- /dev/null
+++ b/libavfilter/vf_cas.c
@@ -0,0 +1,299 @@
+/*
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "libavutil/opt.h"
+#include "libavutil/imgutils.h"
+#include "avfilter.h"
+#include "formats.h"
+#include "internal.h"
+#include "video.h"
+
+typedef struct CASContext {
+    const AVClass *class;
+
+    float strength;
+    int planes;
+    int nb_planes;
+
+    int depth;
+    int planeheight[4];
+    int planewidth[4];
+
+    AVFrame *in;
+
+    int (*do_slice)(AVFilterContext *s, void *arg,
+                    int jobnr, int nb_jobs);
+} CASContext;
+
+static inline float lerpf(float v0, float v1, float f)
+{
+    return v0 + (v1 - v0) * f;
+}
+
+static int cas_slice8(AVFilterContext *avctx, void *arg, int jobnr, int nb_jobs)
+{
+    CASContext *s = avctx->priv;
+    const float strength = -lerpf(16.f, 4.01f, s->strength);
+    AVFrame *out = arg;
+    AVFrame *in = s->in;
+
+    for (int p = 0; p < s->nb_planes; p++) {
+        const int slice_start = (s->planeheight[p] * jobnr) / nb_jobs;
+        const int slice_end = (s->planeheight[p] * (jobnr+1)) / nb_jobs;
+        const int linesize = out->linesize[p];
+        const int in_linesize = in->linesize[p];
+        const int w = s->planewidth[p];
+        const int w1 = w - 1;
+        const int h = s->planeheight[p];
+        const int h1 = h - 1;
+        uint8_t *dst = out->data[p] + slice_start * linesize;
+        const uint8_t *src = in->data[p];
+
+        if (!((1 << p) & s->planes)) {
+            av_image_copy_plane(dst, linesize, src + slice_start * linesize, in_linesize,
+                                w, slice_end - slice_start);
+            continue;
+        }
+
+        for (int y = slice_start; y < slice_end; y++) {
+            const int y0 = FFMAX(y - 1, 0);
+            const int y1 = FFMIN(y + 1, h1);
+            for (int x = 0; x < w; x++) {
+                const int x0 = FFMAX(x - 1, 0);
+                const int x1 = FFMIN(x + 1, w1);
+                int a = src[y0 * in_linesize + x0];
+                int b = src[y0 * in_linesize + x];
+                int c = src[y0 * in_linesize + x1];
+                int d = src[y * in_linesize + x0];
+                int e = src[y * in_linesize + x];
+                int f = src[y * in_linesize + x1];
+                int g = src[y1 * in_linesize + x0];
+                int h = src[y1 * in_linesize + x];
+                int i = src[y1 * in_linesize + x1];
+                int mn, mn2, mx, mx2;
+                float amp, weight;
+
+                mn  = FFMIN3(FFMIN3( d, e, f), b, h);
+                mn2 = FFMIN3(FFMIN3(mn, a, c), g, i);
+
+                mn = mn + mn2;
+
+                mx  = FFMAX3(FFMAX3( d, e, f), b, h);
+                mx2 = FFMAX3(FFMAX3(mx, a, c), g, i);
+
+                mx = mx + mx2;
+
+                amp = sqrtf(av_clipf(FFMIN(mn, 511 - mx) / (float)mx, 0.f, 1.f));
+
+                weight = amp / strength;
+
+                dst[x] = av_clip_uint8(((b + d + f + h) * weight + e) / (1.f + 4.f * weight));
+            }
+            dst += linesize;
+        }
+    }
+
+    return 0;
+}
+
+static int cas_slice16(AVFilterContext *avctx, void *arg, int jobnr, int nb_jobs)
+{
+    CASContext *s = avctx->priv;
+    const float strength = -lerpf(16.f, 4.01f, s->strength);
+    const int max = 2 * (1 << s->depth) - 1;
+    AVFrame *out = arg;
+    AVFrame *in = s->in;
+
+    for (int p = 0; p < s->nb_planes; p++) {
+        const int slice_start = (s->planeheight[p] * jobnr) / nb_jobs;
+        const int slice_end = (s->planeheight[p] * (jobnr+1)) / nb_jobs;
+        const int linesize = out->linesize[p] / 2;
+        const int in_linesize = in->linesize[p] / 2;
+        const int w = s->planewidth[p];
+        const int w1 = w - 1;
+        const int h = s->planeheight[p];
+        const int h1 = h - 1;
+        uint16_t *dst = (uint16_t *)out->data[p] + slice_start * linesize;
+        const uint16_t *src = (const uint16_t *)in->data[p];
+
+        if (!((1 << p) & s->planes)) {
+            av_image_copy_plane((uint8_t *)dst, linesize, (uint8_t *)(src + slice_start * linesize),
+                                in_linesize, w * 2, slice_end - slice_start);
+            continue;
+        }
+
+        for (int y = slice_start; y < slice_end; y++) {
+            const int y0 = FFMAX(y - 1, 0);
+            const int y1 = FFMIN(y + 1, h1);
+            for (int x = 0; x < w; x++) {
+                const int x0 = FFMAX(x - 1, 0);
+                const int x1 = FFMIN(x + 1, w1);
+                int a = src[y0 * in_linesize + x0];
+                int b = src[y0 * in_linesize + x];
+                int c = src[y0 * in_linesize + x1];
+                int d = src[y * in_linesize + x0];
+                int e = src[y * in_linesize + x];
+                int f = src[y * in_linesize + x1];
+                int g = src[y1 * in_linesize + x0];
+                int h = src[y1 * in_linesize + x];
+                int i = src[y1 * in_linesize + x1];
+                int mn, mn2, mx, mx2;
+                float amp, weight;
+
+                mn  = FFMIN3(FFMIN3( d, e, f), b, h);
+                mn2 = FFMIN3(FFMIN3(mn, a, c), g, i);
+
+                mn = mn + mn2;
+
+                mx  = FFMAX3(FFMAX3( d, e, f), b, h);
+                mx2 = FFMAX3(FFMAX3(mx, a, c), g, i);
+
+                mx = mx + mx2;
+
+                amp = sqrtf(av_clipf(FFMIN(mn, max - mx) / (float)mx, 0.f, 1.f));
+
+                weight = amp / strength;
+
+                dst[x] = av_clip_uintp2_c(((b + d + f + h) * weight + e) / (1.f + 4.f * weight), s->depth);
+            }
+            dst += linesize;
+        }
+    }
+
+    return 0;
+}
+
+static int filter_frame(AVFilterLink *inlink, AVFrame *in)
+{
+    AVFilterContext *ctx = inlink->dst;
+    AVFilterLink *outlink = ctx->outputs[0];
+    CASContext *s = ctx->priv;
+    AVFrame *out;
+
+    out = ff_get_video_buffer(outlink, outlink->w, outlink->h);
+    if (!out) {
+        av_frame_free(&in);
+        return AVERROR(ENOMEM);
+    }
+    av_frame_copy_props(out, in);
+
+    s->in = in;
+    ctx->internal->execute(ctx, s->do_slice, out, NULL,
+                           FFMIN(in->height, ff_filter_get_nb_threads(ctx)));
+    av_frame_free(&in);
+    s->in = NULL;
+
+    return ff_filter_frame(ctx->outputs[0], out);
+}
+
+static av_cold int query_formats(AVFilterContext *avctx)
+{
+    static const enum AVPixelFormat pixel_fmts[] = {
+        AV_PIX_FMT_GRAY8,
+        AV_PIX_FMT_GRAY9,  AV_PIX_FMT_GRAY10,
+        AV_PIX_FMT_GRAY12, AV_PIX_FMT_GRAY14, AV_PIX_FMT_GRAY16,
+        AV_PIX_FMT_YUV410P, AV_PIX_FMT_YUV411P,
+        AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUV422P,
+        AV_PIX_FMT_YUV440P, AV_PIX_FMT_YUV444P,
+        AV_PIX_FMT_YUVJ420P, AV_PIX_FMT_YUVJ422P,
+        AV_PIX_FMT_YUVJ440P, AV_PIX_FMT_YUVJ444P,
+        AV_PIX_FMT_YUVJ411P,
+        AV_PIX_FMT_YUV420P9, AV_PIX_FMT_YUV422P9, AV_PIX_FMT_YUV444P9,
+        AV_PIX_FMT_YUV420P10, AV_PIX_FMT_YUV422P10, AV_PIX_FMT_YUV444P10,
+        AV_PIX_FMT_YUV440P10,
+        AV_PIX_FMT_YUV444P12, AV_PIX_FMT_YUV422P12, AV_PIX_FMT_YUV420P12,
+        AV_PIX_FMT_YUV440P12,
+        AV_PIX_FMT_YUV444P14, AV_PIX_FMT_YUV422P14, AV_PIX_FMT_YUV420P14,
+        AV_PIX_FMT_YUV420P16, AV_PIX_FMT_YUV422P16, AV_PIX_FMT_YUV444P16,
+        AV_PIX_FMT_GBRP, AV_PIX_FMT_GBRP9, AV_PIX_FMT_GBRP10,
+        AV_PIX_FMT_GBRP12, AV_PIX_FMT_GBRP14, AV_PIX_FMT_GBRP16,
+        AV_PIX_FMT_YUVA420P,  AV_PIX_FMT_YUVA422P,   AV_PIX_FMT_YUVA444P,
+        AV_PIX_FMT_YUVA444P9, AV_PIX_FMT_YUVA444P10, AV_PIX_FMT_YUVA444P12, AV_PIX_FMT_YUVA444P16,
+        AV_PIX_FMT_YUVA422P9, AV_PIX_FMT_YUVA422P10, AV_PIX_FMT_YUVA422P12, AV_PIX_FMT_YUVA422P16,
+        AV_PIX_FMT_YUVA420P9, AV_PIX_FMT_YUVA420P10, AV_PIX_FMT_YUVA420P16,
+        AV_PIX_FMT_GBRAP,     AV_PIX_FMT_GBRAP10,    AV_PIX_FMT_GBRAP12,    AV_PIX_FMT_GBRAP16,
+        AV_PIX_FMT_NONE
+    };
+
+    AVFilterFormats *formats = NULL;
+
+    formats = ff_make_format_list(pixel_fmts);
+    if (!formats)
+        return AVERROR(ENOMEM);
+
+    return ff_set_common_formats(avctx, formats);
+}
+
+static av_cold int config_input(AVFilterLink *inlink)
+{
+    AVFilterContext *avctx = inlink->dst;
+    CASContext *s = avctx->priv;
+    const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(inlink->format);
+
+    s->planeheight[1] = s->planeheight[2] = AV_CEIL_RSHIFT(inlink->h, desc->log2_chroma_h);
+    s->planeheight[0] = s->planeheight[3] = inlink->h;
+    s->planewidth[1]  = s->planewidth[2]  = AV_CEIL_RSHIFT(inlink->w, desc->log2_chroma_w);
+    s->planewidth[0]  = s->planewidth[3]  = inlink->w;
+
+    s->depth = desc->comp[0].depth;
+    s->nb_planes = desc->nb_components;
+    s->do_slice = s->depth <= 8 ? cas_slice8 : cas_slice16;
+
+    return 0;
+}
+
+static const AVFilterPad cas_inputs[] = {
+    {
+        .name           = "default",
+        .type           = AVMEDIA_TYPE_VIDEO,
+        .filter_frame   = filter_frame,
+        .config_props   = config_input,
+    },
+    { NULL }
+};
+
+static const AVFilterPad cas_outputs[] = {
+    {
+        .name = "default",
+        .type = AVMEDIA_TYPE_VIDEO,
+    },
+    { NULL }
+};
+
+#define OFFSET(x) offsetof(CASContext, x)
+#define VF AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_RUNTIME_PARAM
+
+static const AVOption cas_options[] = {
+    { "strength", "set the sharpening strength", OFFSET(strength), AV_OPT_TYPE_FLOAT, {.dbl=0}, 0,  1, VF },
+    { "planes",  "set what planes to filter",    OFFSET(planes),   AV_OPT_TYPE_FLAGS, {.i64=7}, 0, 15, VF },
+    { NULL }
+};
+
+AVFILTER_DEFINE_CLASS(cas);
+
+AVFilter ff_vf_cas = {
+    .name          = "cas",
+    .description   = NULL_IF_CONFIG_SMALL("Contrast Adaptive Sharpen."),
+    .priv_size     = sizeof(CASContext),
+    .priv_class    = &cas_class,
+    .query_formats = query_formats,
+    .inputs        = cas_inputs,
+    .outputs       = cas_outputs,
+    .flags         = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC | AVFILTER_FLAG_SLICE_THREADS,
+    .process_command = ff_filter_process_command,
+};
diff --git a/libavfilter/vf_chromaber_vulkan.c b/libavfilter/vf_chromaber_vulkan.c
new file mode 100644
index 0000000..673b3a7
--- /dev/null
+++ b/libavfilter/vf_chromaber_vulkan.c
@@ -0,0 +1,340 @@
+/*
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "libavutil/opt.h"
+#include "vulkan.h"
+#include "internal.h"
+
+#define CGROUPS (int [3]){ 32, 32, 1 }
+
+typedef struct ChromaticAberrationVulkanContext {
+    VulkanFilterContext vkctx;
+
+    int initialized;
+    FFVkExecContext *exec;
+    VulkanPipeline *pl;
+
+    /* Shader updators, must be in the main filter struct */
+    VkDescriptorImageInfo input_images[3];
+    VkDescriptorImageInfo output_images[3];
+
+    /* Push constants / options */
+    struct {
+        float dist[2];
+    } opts;
+} ChromaticAberrationVulkanContext;
+
+static const char distort_chroma_kernel[] = {
+    C(0, void distort_rgb(ivec2 size, ivec2 pos)                               )
+    C(0, {                                                                     )
+    C(1,     const vec2 p = ((vec2(pos)/vec2(size)) - 0.5f)*2.0f;              )
+    C(1,     const vec2 o = p * (dist - 1.0f);                                 )
+    C(0,                                                                       )
+    C(1,     vec4 res;                                                         )
+    C(1,     res.r = texture(input_img[0], ((p - o)/2.0f) + 0.5f).r;           )
+    C(1,     res.g = texture(input_img[0], ((p    )/2.0f) + 0.5f).g;           )
+    C(1,     res.b = texture(input_img[0], ((p + o)/2.0f) + 0.5f).b;           )
+    C(1,     res.a = texture(input_img[0], ((p    )/2.0f) + 0.5f).a;           )
+    C(1,     imageStore(output_img[0], pos, res);                              )
+    C(0, }                                                                     )
+    C(0,                                                                       )
+    C(0, void distort_chroma(int idx, ivec2 size, ivec2 pos)                   )
+    C(0, {                                                                     )
+    C(1,     vec2 p = ((vec2(pos)/vec2(size)) - 0.5f)*2.0f;                    )
+    C(1,     float d = sqrt(p.x*p.x + p.y*p.y);                                )
+    C(1,     p *= d / (d*     dist);                                           )
+    C(1,     vec4 res = texture(input_img[idx], (p/2.0f) + 0.5f);              )
+    C(1,     imageStore(output_img[idx], pos, res);                            )
+    C(0, }                                                                     )
+};
+
+static av_cold int init_filter(AVFilterContext *ctx, AVFrame *in)
+{
+    int err;
+    ChromaticAberrationVulkanContext *s = ctx->priv;
+
+    /* Create a sampler */
+    VkSampler *sampler = ff_vk_init_sampler(ctx, 0, VK_FILTER_LINEAR);
+    if (!sampler)
+        return AVERROR_EXTERNAL;
+
+    s->pl = ff_vk_create_pipeline(ctx);
+    if (!s->pl)
+        return AVERROR(ENOMEM);
+
+    /* Normalize options */
+    s->opts.dist[0] = (s->opts.dist[0] / 100.0f) + 1.0f;
+    s->opts.dist[1] = (s->opts.dist[1] / 100.0f) + 1.0f;
+
+    { /* Create the shader */
+        const int planes = av_pix_fmt_count_planes(s->vkctx.output_format);
+        VulkanDescriptorSetBinding desc_i[2] = {
+            {
+                .name       = "input_img",
+                .type       = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
+                .dimensions = 2,
+                .elems      = planes,
+                .stages     = VK_SHADER_STAGE_COMPUTE_BIT,
+                .updater    = s->input_images,
+                .samplers   = DUP_SAMPLER_ARRAY4(*sampler),
+            },
+            {
+                .name       = "output_img",
+                .type       = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
+                .mem_layout = ff_vk_shader_rep_fmt(s->vkctx.output_format),
+                .mem_quali  = "writeonly",
+                .dimensions = 2,
+                .elems      = planes,
+                .stages     = VK_SHADER_STAGE_COMPUTE_BIT,
+                .updater    = s->output_images,
+            },
+        };
+
+        SPIRVShader *shd = ff_vk_init_shader(ctx, s->pl, "chromaber_compute",
+                                             VK_SHADER_STAGE_COMPUTE_BIT);
+        if (!shd)
+            return AVERROR(ENOMEM);
+
+        ff_vk_set_compute_shader_sizes(ctx, shd, CGROUPS);
+
+        GLSLC(0, layout(push_constant, std430) uniform pushConstants {        );
+        GLSLC(1,    vec2 dist;                                                );
+        GLSLC(0, };                                                           );
+        GLSLC(0,                                                              );
+
+        ff_vk_add_push_constant(ctx, s->pl, 0, sizeof(s->opts),
+                                VK_SHADER_STAGE_COMPUTE_BIT);
+
+        RET(ff_vk_add_descriptor_set(ctx, s->pl, shd, desc_i, 2, 0)); /* set 0 */
+
+        GLSLD(   distort_chroma_kernel                                        );
+        GLSLC(0, void main()                                                  );
+        GLSLC(0, {                                                            );
+        GLSLC(1,     ivec2 pos = ivec2(gl_GlobalInvocationID.xy);             );
+        if (planes == 1) {
+            GLSLC(1, distort_rgb(imageSize(output_img[0]), pos);              );
+        } else {
+            GLSLC(1, ivec2 size = imageSize(output_img[0]);                   );
+            GLSLC(1, vec2 npos = vec2(pos)/vec2(size);                        );
+            GLSLC(1, vec4 res = texture(input_img[0], npos);                  );
+            GLSLC(1, imageStore(output_img[0], pos, res);                     );
+            for (int i = 1; i < planes; i++) {
+                GLSLC(0,                                                      );
+                GLSLF(1,  size = imageSize(output_img[%i]);                 ,i);
+                GLSLC(1,  if (IS_WITHIN(pos, size)) {                         );
+                GLSLF(2,      distort_chroma(%i, size, pos);                ,i);
+                GLSLC(1,  } else {                                            );
+                GLSLC(2,    npos = vec2(pos)/vec2(size);                      );
+                GLSLF(2,    res = texture(input_img[%i], npos);             ,i);
+                GLSLF(2,    imageStore(output_img[%i], pos, res);           ,i);
+                GLSLC(1, }                                                    );
+            }
+        }
+        GLSLC(0, }                                                            );
+
+        RET(ff_vk_compile_shader(ctx, shd, "main"));
+    }
+
+    RET(ff_vk_init_pipeline_layout(ctx, s->pl));
+    RET(ff_vk_init_compute_pipeline(ctx, s->pl));
+
+    /* Execution context */
+    RET(ff_vk_create_exec_ctx(ctx, &s->exec,
+                              s->vkctx.hwctx->queue_family_comp_index));
+
+    s->initialized = 1;
+
+    return 0;
+
+fail:
+    return err;
+}
+
+static int process_frames(AVFilterContext *avctx, AVFrame *out_f, AVFrame *in_f)
+{
+    int err = 0;
+    ChromaticAberrationVulkanContext *s = avctx->priv;
+    AVVkFrame *in = (AVVkFrame *)in_f->data[0];
+    AVVkFrame *out = (AVVkFrame *)out_f->data[0];
+    int planes = av_pix_fmt_count_planes(s->vkctx.output_format);
+
+    for (int i = 0; i < planes; i++) {
+        RET(ff_vk_create_imageview(avctx, &s->input_images[i].imageView, in->img[i],
+                                   av_vkfmt_from_pixfmt(s->vkctx.input_format)[i],
+                                   ff_comp_identity_map));
+
+        RET(ff_vk_create_imageview(avctx, &s->output_images[i].imageView, out->img[i],
+                                   av_vkfmt_from_pixfmt(s->vkctx.output_format)[i],
+                                   ff_comp_identity_map));
+
+        s->input_images[i].imageLayout  = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
+        s->output_images[i].imageLayout = VK_IMAGE_LAYOUT_GENERAL;
+    }
+
+    ff_vk_update_descriptor_set(avctx, s->pl, 0);
+
+    ff_vk_start_exec_recording(avctx, s->exec);
+
+    for (int i = 0; i < planes; i++) {
+        VkImageMemoryBarrier bar[2] = {
+            {
+                .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
+                .srcAccessMask = 0,
+                .dstAccessMask = VK_ACCESS_SHADER_READ_BIT,
+                .oldLayout = in->layout[i],
+                .newLayout = s->input_images[i].imageLayout,
+                .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
+                .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
+                .image = in->img[i],
+                .subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
+                .subresourceRange.levelCount = 1,
+                .subresourceRange.layerCount = 1,
+            },
+            {
+                .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
+                .srcAccessMask = 0,
+                .dstAccessMask = VK_ACCESS_SHADER_WRITE_BIT,
+                .oldLayout = out->layout[i],
+                .newLayout = s->output_images[i].imageLayout,
+                .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
+                .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
+                .image = out->img[i],
+                .subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
+                .subresourceRange.levelCount = 1,
+                .subresourceRange.layerCount = 1,
+            },
+        };
+
+        vkCmdPipelineBarrier(s->exec->buf, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
+                             VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, 0,
+                             0, NULL, 0, NULL, FF_ARRAY_ELEMS(bar), bar);
+
+        in->layout[i]  = bar[0].newLayout;
+        in->access[i]  = bar[0].dstAccessMask;
+
+        out->layout[i] = bar[1].newLayout;
+        out->access[i] = bar[1].dstAccessMask;
+    }
+
+    ff_vk_bind_pipeline_exec(avctx, s->exec, s->pl);
+
+    ff_vk_update_push_exec(avctx, s->exec, VK_SHADER_STAGE_COMPUTE_BIT,
+                           0, sizeof(s->opts), &s->opts);
+
+    vkCmdDispatch(s->exec->buf,
+                  FFALIGN(s->vkctx.output_width,  CGROUPS[0])/CGROUPS[0],
+                  FFALIGN(s->vkctx.output_height, CGROUPS[1])/CGROUPS[1], 1);
+
+    ff_vk_add_exec_dep(avctx, s->exec, in_f, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
+    ff_vk_add_exec_dep(avctx, s->exec, out_f, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
+
+    err = ff_vk_submit_exec_queue(avctx, s->exec);
+    if (err)
+        return err;
+
+    for (int i = 0; i < planes; i++) {
+        ff_vk_destroy_imageview(avctx, &s->input_images[i].imageView);
+        ff_vk_destroy_imageview(avctx, &s->output_images[i].imageView);
+    }
+
+fail:
+    return err;
+}
+
+static int chromaber_vulkan_filter_frame(AVFilterLink *link, AVFrame *in)
+{
+    int err;
+    AVFilterContext *ctx = link->dst;
+    ChromaticAberrationVulkanContext *s = ctx->priv;
+    AVFilterLink *outlink = ctx->outputs[0];
+
+    AVFrame *out = ff_get_video_buffer(outlink, outlink->w, outlink->h);
+    if (!out) {
+        err = AVERROR(ENOMEM);
+        goto fail;
+    }
+
+    if (!s->initialized)
+        RET(init_filter(ctx, in));
+
+    RET(process_frames(ctx, out, in));
+
+    err = av_frame_copy_props(out, in);
+    if (err < 0)
+        goto fail;
+
+    av_frame_free(&in);
+
+    return ff_filter_frame(outlink, out);
+
+fail:
+    av_frame_free(&in);
+    av_frame_free(&out);
+    return err;
+}
+
+static void chromaber_vulkan_uninit(AVFilterContext *avctx)
+{
+    ChromaticAberrationVulkanContext *s = avctx->priv;
+
+    ff_vk_filter_uninit(avctx);
+
+    s->initialized = 0;
+}
+
+#define OFFSET(x) offsetof(ChromaticAberrationVulkanContext, x)
+#define FLAGS (AV_OPT_FLAG_FILTERING_PARAM | AV_OPT_FLAG_VIDEO_PARAM)
+static const AVOption chromaber_vulkan_options[] = {
+    { "dist_x", "Set horizontal distortion amount", OFFSET(opts.dist[0]), AV_OPT_TYPE_FLOAT, {.dbl = 0.0f}, -10.0f, 10.0f, .flags = FLAGS },
+    { "dist_y", "Set vertical distortion amount",   OFFSET(opts.dist[1]), AV_OPT_TYPE_FLOAT, {.dbl = 0.0f}, -10.0f, 10.0f, .flags = FLAGS },
+    { NULL },
+};
+
+AVFILTER_DEFINE_CLASS(chromaber_vulkan);
+
+static const AVFilterPad chromaber_vulkan_inputs[] = {
+    {
+        .name         = "default",
+        .type         = AVMEDIA_TYPE_VIDEO,
+        .filter_frame = &chromaber_vulkan_filter_frame,
+        .config_props = &ff_vk_filter_config_input,
+    },
+    { NULL }
+};
+
+static const AVFilterPad chromaber_vulkan_outputs[] = {
+    {
+        .name = "default",
+        .type = AVMEDIA_TYPE_VIDEO,
+        .config_props = &ff_vk_filter_config_output,
+    },
+    { NULL }
+};
+
+AVFilter ff_vf_chromaber_vulkan = {
+    .name           = "chromaber_vulkan",
+    .description    = NULL_IF_CONFIG_SMALL("Offset chroma of input video (chromatic aberration)"),
+    .priv_size      = sizeof(ChromaticAberrationVulkanContext),
+    .init           = &ff_vk_filter_init,
+    .uninit         = &chromaber_vulkan_uninit,
+    .query_formats  = &ff_vk_filter_query_formats,
+    .inputs         = chromaber_vulkan_inputs,
+    .outputs        = chromaber_vulkan_outputs,
+    .priv_class     = &chromaber_vulkan_class,
+    .flags_internal = FF_FILTER_FLAG_HWFRAME_AWARE,
+};
diff --git a/libavfilter/vf_chromakey.c b/libavfilter/vf_chromakey.c
index 8841478..ce80036 100644
--- a/libavfilter/vf_chromakey.c
+++ b/libavfilter/vf_chromakey.c
@@ -20,6 +20,7 @@
 
 #include "libavutil/opt.h"
 #include "libavutil/imgutils.h"
+#include "libavutil/intreadwrite.h"
 #include "avfilter.h"
 #include "formats.h"
 #include "internal.h"
@@ -29,15 +30,21 @@
     const AVClass *class;
 
     uint8_t chromakey_rgba[4];
-    uint8_t chromakey_uv[2];
+    uint16_t chromakey_uv[2];
 
     float similarity;
     float blend;
 
     int is_yuv;
+    int depth;
+    int mid;
+    int max;
 
     int hsub_log2;
     int vsub_log2;
+
+    int (*do_slice)(AVFilterContext *ctx, void *arg,
+                    int jobnr, int nb_jobs);
 } ChromakeyContext;
 
 static uint8_t do_chromakey_pixel(ChromakeyContext *ctx, uint8_t u[9], uint8_t v[9])
@@ -61,6 +68,28 @@
     }
 }
 
+static uint16_t do_chromakey_pixel16(ChromakeyContext *ctx, uint16_t u[9], uint16_t v[9])
+{
+    double max = ctx->max;
+    double diff = 0.0;
+    int du, dv, i;
+
+    for (i = 0; i < 9; ++i) {
+        du = (int)u[i] - ctx->chromakey_uv[0];
+        dv = (int)v[i] - ctx->chromakey_uv[1];
+
+        diff += sqrt((du * du + dv * dv) / (max * max));
+    }
+
+    diff /= 9.0;
+
+    if (ctx->blend > 0.0001) {
+        return av_clipd((diff - ctx->similarity) / ctx->blend, 0.0, 1.0) * max;
+    } else {
+        return (diff > ctx->similarity) ? max : 0;
+    }
+}
+
 static av_always_inline void get_pixel_uv(AVFrame *frame, int hsub_log2, int vsub_log2, int x, int y, uint8_t *u, uint8_t *v)
 {
     if (x < 0 || x >= frame->width || y < 0 || y >= frame->height)
@@ -73,6 +102,18 @@
     *v = frame->data[2][frame->linesize[2] * y + x];
 }
 
+static av_always_inline void get_pixel16_uv(AVFrame *frame, int hsub_log2, int vsub_log2, int x, int y, uint16_t *u, uint16_t *v)
+{
+    if (x < 0 || x >= frame->width || y < 0 || y >= frame->height)
+        return;
+
+    x >>= hsub_log2;
+    y >>= vsub_log2;
+
+    *u = AV_RN16(&frame->data[1][frame->linesize[1] * y + 2 * x]);
+    *v = AV_RN16(&frame->data[2][frame->linesize[2] * y + 2 * x]);
+}
+
 static int do_chromakey_slice(AVFilterContext *avctx, void *arg, int jobnr, int nb_jobs)
 {
     AVFrame *frame = arg;
@@ -103,12 +144,123 @@
     return 0;
 }
 
+static int do_chromakey16_slice(AVFilterContext *avctx, void *arg, int jobnr, int nb_jobs)
+{
+    AVFrame *frame = arg;
+
+    const int slice_start = (frame->height * jobnr) / nb_jobs;
+    const int slice_end = (frame->height * (jobnr + 1)) / nb_jobs;
+
+    ChromakeyContext *ctx = avctx->priv;
+
+    int x, y, xo, yo;
+    uint16_t u[9], v[9];
+
+    for (int i = 0; i < 9; i++) {
+        u[i] = ctx->chromakey_uv[0];
+        v[i] = ctx->chromakey_uv[1];
+    }
+
+    for (y = slice_start; y < slice_end; ++y) {
+        for (x = 0; x < frame->width; ++x) {
+            uint16_t *dst = (uint16_t *)(frame->data[3] + frame->linesize[3] * y);
+
+            for (yo = 0; yo < 3; ++yo) {
+                for (xo = 0; xo < 3; ++xo) {
+                    get_pixel16_uv(frame, ctx->hsub_log2, ctx->vsub_log2, x + xo - 1, y + yo - 1, &u[yo * 3 + xo], &v[yo * 3 + xo]);
+                }
+            }
+
+            dst[x] = do_chromakey_pixel16(ctx, u, v);
+        }
+    }
+
+    return 0;
+}
+
+static int do_chromahold_slice(AVFilterContext *avctx, void *arg, int jobnr, int nb_jobs)
+{
+    ChromakeyContext *ctx = avctx->priv;
+    AVFrame *frame = arg;
+    const int slice_start = ((frame->height >> ctx->vsub_log2) * jobnr) / nb_jobs;
+    const int slice_end = ((frame->height >> ctx->vsub_log2) * (jobnr + 1)) / nb_jobs;
+
+    int x, y, alpha;
+
+    for (y = slice_start; y < slice_end; ++y) {
+        for (x = 0; x < frame->width >> ctx->hsub_log2; ++x) {
+            int u = frame->data[1][frame->linesize[1] * y + x];
+            int v = frame->data[2][frame->linesize[2] * y + x];
+            double diff;
+            int du, dv;
+
+            du = u - ctx->chromakey_uv[0];
+            dv = v - ctx->chromakey_uv[1];
+
+            diff = sqrt((du * du + dv * dv) / (255.0 * 255.0));
+
+            alpha = diff > ctx->similarity;
+            if (ctx->blend > 0.0001) {
+                double f = 1. - av_clipd((diff - ctx->similarity) / ctx->blend, 0.0, 1.0);
+
+                frame->data[1][frame->linesize[1] * y + x] = 128 + (u - 128) * f;
+                frame->data[2][frame->linesize[2] * y + x] = 128 + (v - 128) * f;
+            } else if (alpha) {
+                frame->data[1][frame->linesize[1] * y + x] = 128;
+                frame->data[2][frame->linesize[2] * y + x] = 128;
+            }
+        }
+    }
+
+    return 0;
+}
+
+static int do_chromahold16_slice(AVFilterContext *avctx, void *arg, int jobnr, int nb_jobs)
+{
+    ChromakeyContext *ctx = avctx->priv;
+    AVFrame *frame = arg;
+    const int slice_start = ((frame->height >> ctx->vsub_log2) * jobnr) / nb_jobs;
+    const int slice_end = ((frame->height >> ctx->vsub_log2) * (jobnr + 1)) / nb_jobs;
+    const int mid = ctx->mid;
+    double max = ctx->max;
+
+    int x, y, alpha;
+
+    for (y = slice_start; y < slice_end; ++y) {
+        for (x = 0; x < frame->width >> ctx->hsub_log2; ++x) {
+            int u = AV_RN16(&frame->data[1][frame->linesize[1] * y + 2 * x]);
+            int v = AV_RN16(&frame->data[2][frame->linesize[2] * y + 2 * x]);
+            double diff;
+            int du, dv;
+
+            du = u - ctx->chromakey_uv[0];
+            dv = v - ctx->chromakey_uv[1];
+
+            diff = sqrt((du * du + dv * dv) / (max * max));
+
+            alpha = diff > ctx->similarity;
+            if (ctx->blend > 0.0001) {
+                double f = 1. - av_clipd((diff - ctx->similarity) / ctx->blend, 0.0, 1.0);
+
+                AV_WN16(&frame->data[1][frame->linesize[1] * y + 2 * x], mid + (u - mid) * f);
+                AV_WN16(&frame->data[2][frame->linesize[2] * y + 2 * x], mid + (v - mid) * f);
+            } else if (alpha) {
+                AV_WN16(&frame->data[1][frame->linesize[1] * y + 2 * x], mid);
+                AV_WN16(&frame->data[2][frame->linesize[2] * y + 2 * x], mid);
+            }
+        }
+    }
+
+    return 0;
+}
+
 static int filter_frame(AVFilterLink *link, AVFrame *frame)
 {
     AVFilterContext *avctx = link->dst;
+    ChromakeyContext *ctx = avctx->priv;
     int res;
 
-    if (res = avctx->internal->execute(avctx, do_chromakey_slice, frame, NULL, FFMIN(frame->height, ff_filter_get_nb_threads(avctx))))
+    if (res = avctx->internal->execute(avctx, ctx->do_slice, frame, NULL, FFMIN(frame->height, ff_filter_get_nb_threads(avctx))))
         return res;
 
     return ff_filter_frame(avctx->outputs[0], frame);
@@ -118,16 +270,31 @@
 #define RGB_TO_U(rgb) (((- FIXNUM(0.16874) * rgb[0] - FIXNUM(0.33126) * rgb[1] + FIXNUM(0.50000) * rgb[2] + (1 << 9) - 1) >> 10) + 128)
 #define RGB_TO_V(rgb) (((  FIXNUM(0.50000) * rgb[0] - FIXNUM(0.41869) * rgb[1] - FIXNUM(0.08131) * rgb[2] + (1 << 9) - 1) >> 10) + 128)
 
-static av_cold int initialize_chromakey(AVFilterContext *avctx)
+static av_cold int config_output(AVFilterLink *outlink)
 {
+    const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(outlink->format);
+    AVFilterContext *avctx = outlink->src;
     ChromakeyContext *ctx = avctx->priv;
+    int factor;
+
+    ctx->depth = desc->comp[0].depth;
+    ctx->mid = 1 << (ctx->depth - 1);
+    ctx->max = (1 << ctx->depth) - 1;
+
+    factor = 1 << (ctx->depth - 8);
 
     if (ctx->is_yuv) {
-        ctx->chromakey_uv[0] = ctx->chromakey_rgba[1];
-        ctx->chromakey_uv[1] = ctx->chromakey_rgba[2];
+        ctx->chromakey_uv[0] = ctx->chromakey_rgba[1] * factor;
+        ctx->chromakey_uv[1] = ctx->chromakey_rgba[2] * factor;
     } else {
-        ctx->chromakey_uv[0] = RGB_TO_U(ctx->chromakey_rgba);
-        ctx->chromakey_uv[1] = RGB_TO_V(ctx->chromakey_rgba);
+        ctx->chromakey_uv[0] = RGB_TO_U(ctx->chromakey_rgba) * factor;
+        ctx->chromakey_uv[1] = RGB_TO_V(ctx->chromakey_rgba) * factor;
+    }
+
+    if (!strcmp(avctx->filter->name, "chromakey")) {
+        ctx->do_slice = ctx->depth <= 8 ? do_chromakey_slice : do_chromakey16_slice;
+    } else {
+        ctx->do_slice = ctx->depth <= 8 ? do_chromahold_slice: do_chromahold16_slice;
     }
 
     return 0;
@@ -139,12 +306,35 @@
         AV_PIX_FMT_YUVA420P,
         AV_PIX_FMT_YUVA422P,
         AV_PIX_FMT_YUVA444P,
+        AV_PIX_FMT_YUVA420P9,  AV_PIX_FMT_YUVA422P9,  AV_PIX_FMT_YUVA444P9,
+        AV_PIX_FMT_YUVA420P10, AV_PIX_FMT_YUVA422P10, AV_PIX_FMT_YUVA444P10,
+        AV_PIX_FMT_YUVA422P12, AV_PIX_FMT_YUVA444P12,
+        AV_PIX_FMT_YUVA420P16, AV_PIX_FMT_YUVA422P16, AV_PIX_FMT_YUVA444P16,
+        AV_PIX_FMT_NONE
+    };
+
+    static const enum AVPixelFormat hold_pixel_fmts[] = {
+        AV_PIX_FMT_YUV420P,
+        AV_PIX_FMT_YUV422P,
+        AV_PIX_FMT_YUV444P,
+        AV_PIX_FMT_YUVA420P,
+        AV_PIX_FMT_YUVA422P,
+        AV_PIX_FMT_YUVA444P,
+        AV_PIX_FMT_YUV420P9,   AV_PIX_FMT_YUV422P9,   AV_PIX_FMT_YUV444P9,
+        AV_PIX_FMT_YUV420P10,  AV_PIX_FMT_YUV422P10,  AV_PIX_FMT_YUV444P10,
+        AV_PIX_FMT_YUV444P12,  AV_PIX_FMT_YUV422P12,  AV_PIX_FMT_YUV420P12,
+        AV_PIX_FMT_YUV444P14,  AV_PIX_FMT_YUV422P14,  AV_PIX_FMT_YUV420P14,
+        AV_PIX_FMT_YUV420P16,  AV_PIX_FMT_YUV422P16,  AV_PIX_FMT_YUV444P16,
+        AV_PIX_FMT_YUVA420P9,  AV_PIX_FMT_YUVA422P9,  AV_PIX_FMT_YUVA444P9,
+        AV_PIX_FMT_YUVA420P10, AV_PIX_FMT_YUVA422P10, AV_PIX_FMT_YUVA444P10,
+        AV_PIX_FMT_YUVA422P12, AV_PIX_FMT_YUVA444P12,
+        AV_PIX_FMT_YUVA420P16, AV_PIX_FMT_YUVA422P16, AV_PIX_FMT_YUVA444P16,
         AV_PIX_FMT_NONE
     };
 
     AVFilterFormats *formats = NULL;
 
-    formats = ff_make_format_list(pixel_fmts);
+    formats = ff_make_format_list(!strcmp(avctx->filter->name, "chromahold") ? hold_pixel_fmts : pixel_fmts);
     if (!formats)
         return AVERROR(ENOMEM);
 
@@ -163,6 +353,18 @@
     return 0;
 }
 
+static int process_command(AVFilterContext *ctx, const char *cmd, const char *args,
+                           char *res, int res_len, int flags)
+{
+    int ret;
+
+    ret = ff_filter_process_command(ctx, cmd, args, res, res_len, flags);
+    if (ret < 0)
+        return ret;
+
+    return config_output(ctx->outputs[0]);
+}
+
 static const AVFilterPad chromakey_inputs[] = {
     {
         .name           = "default",
@@ -178,15 +380,16 @@
     {
         .name           = "default",
         .type           = AVMEDIA_TYPE_VIDEO,
+        .config_props   = config_output,
     },
     { NULL }
 };
 
 #define OFFSET(x) offsetof(ChromakeyContext, x)
-#define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM
+#define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_RUNTIME_PARAM
 
 static const AVOption chromakey_options[] = {
-    { "color", "set the chromakey key color", OFFSET(chromakey_rgba), AV_OPT_TYPE_COLOR, { .str = "black" }, CHAR_MIN, CHAR_MAX, FLAGS },
+    { "color", "set the chromakey key color", OFFSET(chromakey_rgba), AV_OPT_TYPE_COLOR, { .str = "black" }, 0, 0, FLAGS },
     { "similarity", "set the chromakey similarity value", OFFSET(similarity), AV_OPT_TYPE_FLOAT, { .dbl = 0.01 }, 0.01, 1.0, FLAGS },
     { "blend", "set the chromakey key blend value", OFFSET(blend), AV_OPT_TYPE_FLOAT, { .dbl = 0.0 }, 0.0, 1.0, FLAGS },
     { "yuv", "color parameter is in yuv instead of rgb", OFFSET(is_yuv), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, FLAGS },
@@ -200,9 +403,51 @@
     .description   = NULL_IF_CONFIG_SMALL("Turns a certain color into transparency. Operates on YUV colors."),
     .priv_size     = sizeof(ChromakeyContext),
     .priv_class    = &chromakey_class,
-    .init          = initialize_chromakey,
     .query_formats = query_formats,
     .inputs        = chromakey_inputs,
     .outputs       = chromakey_outputs,
     .flags         = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC | AVFILTER_FLAG_SLICE_THREADS,
+    .process_command = process_command,
+};
+
+static const AVOption chromahold_options[] = {
+    { "color", "set the chromahold key color", OFFSET(chromakey_rgba), AV_OPT_TYPE_COLOR, { .str = "black" }, 0, 0, FLAGS },
+    { "similarity", "set the chromahold similarity value", OFFSET(similarity), AV_OPT_TYPE_FLOAT, { .dbl = 0.01 }, 0.01, 1.0, FLAGS },
+    { "blend", "set the chromahold blend value", OFFSET(blend), AV_OPT_TYPE_FLOAT, { .dbl = 0.0 }, 0.0, 1.0, FLAGS },
+    { "yuv", "color parameter is in yuv instead of rgb", OFFSET(is_yuv), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, FLAGS },
+    { NULL }
+};
+
+static const AVFilterPad chromahold_inputs[] = {
+    {
+        .name           = "default",
+        .type           = AVMEDIA_TYPE_VIDEO,
+        .needs_writable = 1,
+        .filter_frame   = filter_frame,
+        .config_props   = config_input,
+    },
+    { NULL }
+};
+
+static const AVFilterPad chromahold_outputs[] = {
+    {
+        .name           = "default",
+        .type           = AVMEDIA_TYPE_VIDEO,
+        .config_props   = config_output,
+    },
+    { NULL }
+};
+
+AVFILTER_DEFINE_CLASS(chromahold);
+
+AVFilter ff_vf_chromahold = {
+    .name          = "chromahold",
+    .description   = NULL_IF_CONFIG_SMALL("Turns a certain color range into gray."),
+    .priv_size     = sizeof(ChromakeyContext),
+    .priv_class    = &chromahold_class,
+    .query_formats = query_formats,
+    .inputs        = chromahold_inputs,
+    .outputs       = chromahold_outputs,
+    .flags         = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC | AVFILTER_FLAG_SLICE_THREADS,
+    .process_command = process_command,
 };
diff --git a/libavfilter/vf_chromashift.c b/libavfilter/vf_chromashift.c
new file mode 100644
index 0000000..94de7a0
--- /dev/null
+++ b/libavfilter/vf_chromashift.c
@@ -0,0 +1,488 @@
+/*
+ * Copyright (c) 2018 Paul B Mahol
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "libavutil/avstring.h"
+#include "libavutil/eval.h"
+#include "libavutil/imgutils.h"
+#include "libavutil/intreadwrite.h"
+#include "libavutil/opt.h"
+#include "libavutil/pixdesc.h"
+
+#include "avfilter.h"
+#include "formats.h"
+#include "internal.h"
+#include "video.h"
+
+typedef struct ChromaShiftContext {
+    const AVClass *class;
+    int cbh, cbv;
+    int crh, crv;
+    int rh, rv;
+    int gh, gv;
+    int bh, bv;
+    int ah, av;
+    int edge;
+
+    int nb_planes;
+    int depth;
+    int height[4];
+    int width[4];
+    int linesize[4];
+
+    AVFrame *in;
+
+    int is_rgbashift;
+    int (*filter_slice)(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs);
+} ChromaShiftContext;
+
+static int query_formats(AVFilterContext *ctx)
+{
+    static const enum AVPixelFormat yuv_pix_fmts[] = {
+        AV_PIX_FMT_YUVA444P, AV_PIX_FMT_YUVA422P, AV_PIX_FMT_YUVA420P,
+        AV_PIX_FMT_YUVJ444P, AV_PIX_FMT_YUVJ440P, AV_PIX_FMT_YUVJ422P,AV_PIX_FMT_YUVJ420P, AV_PIX_FMT_YUVJ411P,
+        AV_PIX_FMT_YUV444P, AV_PIX_FMT_YUV440P, AV_PIX_FMT_YUV422P, AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUV411P, AV_PIX_FMT_YUV410P,
+        AV_PIX_FMT_YUV420P9, AV_PIX_FMT_YUV422P9, AV_PIX_FMT_YUV444P9,
+        AV_PIX_FMT_YUV420P10, AV_PIX_FMT_YUV422P10, AV_PIX_FMT_YUV444P10, AV_PIX_FMT_YUV440P10,
+        AV_PIX_FMT_YUVA420P10, AV_PIX_FMT_YUVA422P10, AV_PIX_FMT_YUVA444P10,
+        AV_PIX_FMT_YUV420P12, AV_PIX_FMT_YUV422P12, AV_PIX_FMT_YUV444P12, AV_PIX_FMT_YUV440P12,
+        AV_PIX_FMT_YUVA422P12, AV_PIX_FMT_YUVA444P12,
+        AV_PIX_FMT_YUV444P14, AV_PIX_FMT_YUV422P14, AV_PIX_FMT_YUV420P14,
+        AV_PIX_FMT_YUV420P16, AV_PIX_FMT_YUV422P16, AV_PIX_FMT_YUV444P16,
+        AV_PIX_FMT_YUVA420P16, AV_PIX_FMT_YUVA422P16, AV_PIX_FMT_YUVA444P16,
+        AV_PIX_FMT_NONE
+    };
+    static const enum AVPixelFormat rgb_pix_fmts[] = {
+        AV_PIX_FMT_GBRP, AV_PIX_FMT_GBRAP, AV_PIX_FMT_GBRP9,
+        AV_PIX_FMT_GBRP10, AV_PIX_FMT_GBRP12,
+        AV_PIX_FMT_GBRP14, AV_PIX_FMT_GBRP16,
+        AV_PIX_FMT_GBRAP10, AV_PIX_FMT_GBRAP12, AV_PIX_FMT_GBRAP16,
+        AV_PIX_FMT_NONE
+    };
+    const enum AVPixelFormat *pix_fmts;
+    AVFilterFormats *fmts_list;
+
+    if (!strcmp(ctx->filter->name, "rgbashift"))
+        pix_fmts = rgb_pix_fmts;
+    else
+        pix_fmts = yuv_pix_fmts;
+
+    fmts_list = ff_make_format_list(pix_fmts);
+    if (!fmts_list)
+        return AVERROR(ENOMEM);
+    return ff_set_common_formats(ctx, fmts_list);
+}
+
+#define DEFINE_SMEAR(depth, type, div)                                                    \
+static int smear_slice ## depth(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)  \
+{                                                                                         \
+    ChromaShiftContext *s = ctx->priv;                                                    \
+    AVFrame *in = s->in;                                                                  \
+    AVFrame *out = arg;                                                                   \
+    const int sulinesize = in->linesize[1] / div;                                         \
+    const int svlinesize = in->linesize[2] / div;                                         \
+    const int ulinesize = out->linesize[1] / div;                                         \
+    const int vlinesize = out->linesize[2] / div;                                         \
+    const int cbh = s->cbh;                                                               \
+    const int cbv = s->cbv;                                                               \
+    const int crh = s->crh;                                                               \
+    const int crv = s->crv;                                                               \
+    const int h = s->height[1];                                                           \
+    const int w = s->width[1];                                                            \
+    const int slice_start = (h * jobnr) / nb_jobs;                                        \
+    const int slice_end = (h * (jobnr+1)) / nb_jobs;                                      \
+    const type *su = (const type *)in->data[1];                                           \
+    const type *sv = (const type *)in->data[2];                                           \
+    type *du = (type *)out->data[1] + slice_start * ulinesize;                            \
+    type *dv = (type *)out->data[2] + slice_start * vlinesize;                            \
+                                                                                          \
+    for (int y = slice_start; y < slice_end; y++) {                                       \
+        const int duy = av_clip(y - cbv, 0, h-1) * sulinesize;                            \
+        const int dvy = av_clip(y - crv, 0, h-1) * svlinesize;                            \
+                                                                                          \
+        for (int x = 0; x < w; x++) {                                                     \
+            du[x] = su[av_clip(x - cbh, 0, w - 1) + duy];                                 \
+            dv[x] = sv[av_clip(x - crh, 0, w - 1) + dvy];                                 \
+        }                                                                                 \
+                                                                                          \
+        du += ulinesize;                                                                  \
+        dv += vlinesize;                                                                  \
+    }                                                                                     \
+                                                                                          \
+    return 0;                                                                             \
+}
+
+DEFINE_SMEAR(8, uint8_t, 1)
+DEFINE_SMEAR(16, uint16_t, 2)
+
+#define DEFINE_WRAP(depth, type, div)                                                     \
+static int wrap_slice ## depth(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)   \
+{                                                                                         \
+    ChromaShiftContext *s = ctx->priv;                                                    \
+    AVFrame *in = s->in;                                                                  \
+    AVFrame *out = arg;                                                                   \
+    const int sulinesize = in->linesize[1] / div;                                         \
+    const int svlinesize = in->linesize[2] / div;                                         \
+    const int ulinesize = out->linesize[1] / div;                                         \
+    const int vlinesize = out->linesize[2] / div;                                         \
+    const int cbh = s->cbh;                                                               \
+    const int cbv = s->cbv;                                                               \
+    const int crh = s->crh;                                                               \
+    const int crv = s->crv;                                                               \
+    const int h = s->height[1];                                                           \
+    const int w = s->width[1];                                                            \
+    const int slice_start = (h * jobnr) / nb_jobs;                                        \
+    const int slice_end = (h * (jobnr+1)) / nb_jobs;                                      \
+    const type *su = (const type *)in->data[1];                                           \
+    const type *sv = (const type *)in->data[2];                                           \
+    type *du = (type *)out->data[1] + slice_start * ulinesize;                            \
+    type *dv = (type *)out->data[2] + slice_start * vlinesize;                            \
+                                                                                          \
+    for (int y = slice_start; y < slice_end; y++) {                                       \
+        int uy = (y - cbv) % h;                                                           \
+        int vy = (y - crv) % h;                                                           \
+                                                                                          \
+        if (uy < 0)                                                                       \
+            uy += h;                                                                      \
+        if (vy < 0)                                                                       \
+            vy += h;                                                                      \
+                                                                                          \
+        for (int x = 0; x < w; x++) {                                                     \
+            int ux = (x - cbh) % w;                                                       \
+            int vx = (x - crh) % w;                                                       \
+                                                                                          \
+            if (ux < 0)                                                                   \
+                ux += w;                                                                  \
+            if (vx < 0)                                                                   \
+                vx += w;                                                                  \
+                                                                                          \
+            du[x] = su[ux + uy * sulinesize];                                             \
+            dv[x] = sv[vx + vy * svlinesize];                                             \
+        }                                                                                 \
+                                                                                          \
+        du += ulinesize;                                                                  \
+        dv += vlinesize;                                                                  \
+    }                                                                                     \
+                                                                                          \
+    return 0;                                                                             \
+}
+
+DEFINE_WRAP(8, uint8_t, 1)
+DEFINE_WRAP(16, uint16_t, 2)
+
+#define DEFINE_RGBASMEAR(depth, type, div)                                                    \
+static int rgbasmear_slice ## depth(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)  \
+{                                                                                         \
+    ChromaShiftContext *s = ctx->priv;                                                    \
+    AVFrame *in = s->in;                                                                  \
+    AVFrame *out = arg;                                                                   \
+    const int srlinesize = in->linesize[2] / div;                                         \
+    const int sglinesize = in->linesize[0] / div;                                         \
+    const int sblinesize = in->linesize[1] / div;                                         \
+    const int salinesize = in->linesize[3] / div;                                         \
+    const int rlinesize = out->linesize[2] / div;                                         \
+    const int glinesize = out->linesize[0] / div;                                         \
+    const int blinesize = out->linesize[1] / div;                                         \
+    const int alinesize = out->linesize[3] / div;                                         \
+    const int rh = s->rh;                                                                 \
+    const int rv = s->rv;                                                                 \
+    const int gh = s->gh;                                                                 \
+    const int gv = s->gv;                                                                 \
+    const int bh = s->bh;                                                                 \
+    const int bv = s->bv;                                                                 \
+    const int ah = s->ah;                                                                 \
+    const int av = s->av;                                                                 \
+    const int h = s->height[1];                                                           \
+    const int w = s->width[1];                                                            \
+    const int slice_start = (h * jobnr) / nb_jobs;                                        \
+    const int slice_end = (h * (jobnr+1)) / nb_jobs;                                      \
+    const type *sr = (const type *)in->data[2];                                           \
+    const type *sg = (const type *)in->data[0];                                           \
+    const type *sb = (const type *)in->data[1];                                           \
+    const type *sa = (const type *)in->data[3];                                           \
+    type *dr = (type *)out->data[2] + slice_start * rlinesize;                            \
+    type *dg = (type *)out->data[0] + slice_start * glinesize;                            \
+    type *db = (type *)out->data[1] + slice_start * blinesize;                            \
+    type *da = (type *)out->data[3] + slice_start * alinesize;                            \
+                                                                                          \
+    for (int y = slice_start; y < slice_end; y++) {                                       \
+        const int ry = av_clip(y - rv, 0, h-1) * srlinesize;                              \
+        const int gy = av_clip(y - gv, 0, h-1) * sglinesize;                              \
+        const int by = av_clip(y - bv, 0, h-1) * sblinesize;                              \
+        int ay;                                                                           \
+                                                                                          \
+        for (int x = 0; x < w; x++) {                                                     \
+            dr[x] = sr[av_clip(x - rh, 0, w - 1) + ry];                                   \
+            dg[x] = sg[av_clip(x - gh, 0, w - 1) + gy];                                   \
+            db[x] = sb[av_clip(x - bh, 0, w - 1) + by];                                   \
+        }                                                                                 \
+                                                                                          \
+        dr += rlinesize;                                                                  \
+        dg += glinesize;                                                                  \
+        db += blinesize;                                                                  \
+                                                                                          \
+        if (s->nb_planes < 4)                                                             \
+            continue;                                                                     \
+        ay = av_clip(y - av, 0, h-1) * salinesize;                                        \
+        for (int x = 0; x < w; x++) {                                                     \
+            da[x] = sa[av_clip(x - ah, 0, w - 1) + ay];                                   \
+        }                                                                                 \
+                                                                                          \
+        da += alinesize;                                                                  \
+    }                                                                                     \
+                                                                                          \
+    return 0;                                                                             \
+}
+
+DEFINE_RGBASMEAR(8, uint8_t, 1)
+DEFINE_RGBASMEAR(16, uint16_t, 2)
+
+#define DEFINE_RGBAWRAP(depth, type, div)                                                     \
+static int rgbawrap_slice ## depth(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)   \
+{                                                                                         \
+    ChromaShiftContext *s = ctx->priv;                                                    \
+    AVFrame *in = s->in;                                                                  \
+    AVFrame *out = arg;                                                                   \
+    const int srlinesize = in->linesize[2] / div;                                         \
+    const int sglinesize = in->linesize[0] / div;                                         \
+    const int sblinesize = in->linesize[1] / div;                                         \
+    const int salinesize = in->linesize[3] / div;                                         \
+    const int rlinesize = out->linesize[2] / div;                                         \
+    const int glinesize = out->linesize[0] / div;                                         \
+    const int blinesize = out->linesize[1] / div;                                         \
+    const int alinesize = out->linesize[3] / div;                                         \
+    const int rh = s->rh;                                                                 \
+    const int rv = s->rv;                                                                 \
+    const int gh = s->gh;                                                                 \
+    const int gv = s->gv;                                                                 \
+    const int bh = s->bh;                                                                 \
+    const int bv = s->bv;                                                                 \
+    const int ah = s->ah;                                                                 \
+    const int av = s->av;                                                                 \
+    const int h = s->height[1];                                                           \
+    const int w = s->width[1];                                                            \
+    const int slice_start = (h * jobnr) / nb_jobs;                                        \
+    const int slice_end = (h * (jobnr+1)) / nb_jobs;                                      \
+    const type *sr = (const type *)in->data[2];                                           \
+    const type *sg = (const type *)in->data[0];                                           \
+    const type *sb = (const type *)in->data[1];                                           \
+    const type *sa = (const type *)in->data[3];                                           \
+    type *dr = (type *)out->data[2] + slice_start * rlinesize;                            \
+    type *dg = (type *)out->data[0] + slice_start * glinesize;                            \
+    type *db = (type *)out->data[1] + slice_start * blinesize;                            \
+    type *da = (type *)out->data[3] + slice_start * alinesize;                            \
+                                                                                          \
+    for (int y = slice_start; y < slice_end; y++) {                                       \
+        int ry = (y - rv) % h;                                                            \
+        int gy = (y - gv) % h;                                                            \
+        int by = (y - bv) % h;                                                            \
+                                                                                          \
+        if (ry < 0)                                                                       \
+            ry += h;                                                                      \
+        if (gy < 0)                                                                       \
+            gy += h;                                                                      \
+        if (by < 0)                                                                       \
+            by += h;                                                                      \
+                                                                                          \
+        for (int x = 0; x < w; x++) {                                                     \
+            int rx = (x - rh) % w;                                                        \
+            int gx = (x - gh) % w;                                                        \
+            int bx = (x - bh) % w;                                                        \
+                                                                                          \
+            if (rx < 0)                                                                   \
+                rx += w;                                                                  \
+            if (gx < 0)                                                                   \
+                gx += w;                                                                  \
+            if (bx < 0)                                                                   \
+                bx += w;                                                                  \
+            dr[x] = sr[rx + ry * srlinesize];                                             \
+            dg[x] = sg[gx + gy * sglinesize];                                             \
+            db[x] = sb[bx + by * sblinesize];                                             \
+        }                                                                                 \
+                                                                                          \
+        dr += rlinesize;                                                                  \
+        dg += glinesize;                                                                  \
+        db += blinesize;                                                                  \
+                                                                                          \
+        if (s->nb_planes < 4)                                                             \
+            continue;                                                                     \
+        for (int x = 0; x < w; x++) {                                                     \
+            int ax = (x - ah) % w;                                                        \
+            int ay = (x - av) % h;                                                        \
+                                                                                          \
+            if (ax < 0)                                                                   \
+                ax += w;                                                                  \
+            if (ay < 0)                                                                   \
+                ay += h;                                                                  \
+            da[x] = sa[ax + ay * salinesize];                                             \
+        }                                                                                 \
+                                                                                          \
+        da += alinesize;                                                                  \
+    }                                                                                     \
+                                                                                          \
+    return 0;                                                                             \
+}
+
+DEFINE_RGBAWRAP(8, uint8_t, 1)
+DEFINE_RGBAWRAP(16, uint16_t, 2)
+
+static int filter_frame(AVFilterLink *inlink, AVFrame *in)
+{
+    AVFilterContext *ctx = inlink->dst;
+    AVFilterLink *outlink = ctx->outputs[0];
+    ChromaShiftContext *s = ctx->priv;
+    AVFrame *out;
+
+    out = ff_get_video_buffer(outlink, outlink->w, outlink->h);
+    if (!out) {
+        av_frame_free(&in);
+        return AVERROR(ENOMEM);
+    }
+    av_frame_copy_props(out, in);
+
+    s->in = in;
+    if (!s->is_rgbashift) {
+        av_image_copy_plane(out->data[0],
+                            out->linesize[0],
+                            in->data[0], in->linesize[0],
+                            s->linesize[0], s->height[0]);
+    }
+    ctx->internal->execute(ctx, s->filter_slice, out, NULL,
+                           FFMIN3(s->height[1],
+                                  s->height[2],
+                                  ff_filter_get_nb_threads(ctx)));
+    s->in = NULL;
+    av_frame_free(&in);
+    return ff_filter_frame(outlink, out);
+}
+
+static int config_input(AVFilterLink *inlink)
+{
+    AVFilterContext *ctx = inlink->dst;
+    ChromaShiftContext *s = ctx->priv;
+    const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(inlink->format);
+
+    s->is_rgbashift = !strcmp(ctx->filter->name, "rgbashift");
+    s->depth = desc->comp[0].depth;
+    s->nb_planes = desc->nb_components;
+    if (s->is_rgbashift) {
+        if (s->edge)
+            s->filter_slice = s->depth > 8 ? rgbawrap_slice16 : rgbawrap_slice8;
+        else
+            s->filter_slice = s->depth > 8 ? rgbasmear_slice16 : rgbasmear_slice8;
+    } else {
+        if (s->edge)
+            s->filter_slice = s->depth > 8 ? wrap_slice16 : wrap_slice8;
+        else
+            s->filter_slice = s->depth > 8 ? smear_slice16 : smear_slice8;
+    }
+    s->height[1] = s->height[2] = AV_CEIL_RSHIFT(inlink->h, desc->log2_chroma_h);
+    s->height[0] = s->height[3] = inlink->h;
+    s->width[1] = s->width[2] = AV_CEIL_RSHIFT(inlink->w, desc->log2_chroma_w);
+    s->width[0] = s->width[3] = inlink->w;
+
+    return av_image_fill_linesizes(s->linesize, inlink->format, inlink->w);
+}
+
+static int process_command(AVFilterContext *ctx, const char *cmd, const char *args,
+                           char *res, int res_len, int flags)
+{
+    int ret;
+
+    ret = ff_filter_process_command(ctx, cmd, args, res, res_len, flags);
+    if (ret < 0)
+        return ret;
+
+    return config_input(ctx->inputs[0]);
+}
+
+#define OFFSET(x) offsetof(ChromaShiftContext, x)
+#define VFR AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_FILTERING_PARAM | AV_OPT_FLAG_RUNTIME_PARAM
+
+static const AVOption chromashift_options[] = {
+    { "cbh", "shift chroma-blue horizontally", OFFSET(cbh),  AV_OPT_TYPE_INT,   {.i64=0}, -255, 255, .flags = VFR },
+    { "cbv", "shift chroma-blue vertically",   OFFSET(cbv),  AV_OPT_TYPE_INT,   {.i64=0}, -255, 255, .flags = VFR },
+    { "crh", "shift chroma-red horizontally",  OFFSET(crh),  AV_OPT_TYPE_INT,   {.i64=0}, -255, 255, .flags = VFR },
+    { "crv", "shift chroma-red vertically",    OFFSET(crv),  AV_OPT_TYPE_INT,   {.i64=0}, -255, 255, .flags = VFR },
+    { "edge", "set edge operation",            OFFSET(edge), AV_OPT_TYPE_INT,   {.i64=0},    0,   1, .flags = VFR, "edge" },
+    { "smear",                              0,            0, AV_OPT_TYPE_CONST, {.i64=0},    0,   0, .flags = VFR, "edge" },
+    { "wrap",                               0,            0, AV_OPT_TYPE_CONST, {.i64=1},    0,   0, .flags = VFR, "edge" },
+    { NULL },
+};
+
+static const AVFilterPad inputs[] = {
+    {
+        .name         = "default",
+        .type         = AVMEDIA_TYPE_VIDEO,
+        .filter_frame = filter_frame,
+        .config_props = config_input,
+    },
+    { NULL }
+};
+
+static const AVFilterPad outputs[] = {
+    {
+        .name = "default",
+        .type = AVMEDIA_TYPE_VIDEO,
+    },
+    { NULL }
+};
+
+AVFILTER_DEFINE_CLASS(chromashift);
+
+AVFilter ff_vf_chromashift = {
+    .name          = "chromashift",
+    .description   = NULL_IF_CONFIG_SMALL("Shift chroma."),
+    .priv_size     = sizeof(ChromaShiftContext),
+    .priv_class    = &chromashift_class,
+    .query_formats = query_formats,
+    .outputs       = outputs,
+    .inputs        = inputs,
+    .flags         = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC | AVFILTER_FLAG_SLICE_THREADS,
+    .process_command = process_command,
+};
+
+static const AVOption rgbashift_options[] = {
+    { "rh", "shift red horizontally",   OFFSET(rh),   AV_OPT_TYPE_INT,   {.i64=0}, -255, 255, .flags = VFR },
+    { "rv", "shift red vertically",     OFFSET(rv),   AV_OPT_TYPE_INT,   {.i64=0}, -255, 255, .flags = VFR },
+    { "gh", "shift green horizontally", OFFSET(gh),   AV_OPT_TYPE_INT,   {.i64=0}, -255, 255, .flags = VFR },
+    { "gv", "shift green vertically",   OFFSET(gv),   AV_OPT_TYPE_INT,   {.i64=0}, -255, 255, .flags = VFR },
+    { "bh", "shift blue horizontally",  OFFSET(bh),   AV_OPT_TYPE_INT,   {.i64=0}, -255, 255, .flags = VFR },
+    { "bv", "shift blue vertically",    OFFSET(bv),   AV_OPT_TYPE_INT,   {.i64=0}, -255, 255, .flags = VFR },
+    { "ah", "shift alpha horizontally", OFFSET(ah),   AV_OPT_TYPE_INT,   {.i64=0}, -255, 255, .flags = VFR },
+    { "av", "shift alpha vertically",   OFFSET(av),   AV_OPT_TYPE_INT,   {.i64=0}, -255, 255, .flags = VFR },
+    { "edge", "set edge operation",     OFFSET(edge), AV_OPT_TYPE_INT,   {.i64=0},    0,   1, .flags = VFR, "edge" },
+    { "smear",                          0,         0, AV_OPT_TYPE_CONST, {.i64=0},    0,   0, .flags = VFR, "edge" },
+    { "wrap",                           0,         0, AV_OPT_TYPE_CONST, {.i64=1},    0,   0, .flags = VFR, "edge" },
+    { NULL },
+};
+
+AVFILTER_DEFINE_CLASS(rgbashift);
+
+AVFilter ff_vf_rgbashift = {
+    .name          = "rgbashift",
+    .description   = NULL_IF_CONFIG_SMALL("Shift RGBA."),
+    .priv_size     = sizeof(ChromaShiftContext),
+    .priv_class    = &rgbashift_class,
+    .query_formats = query_formats,
+    .outputs       = outputs,
+    .inputs        = inputs,
+    .flags         = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC | AVFILTER_FLAG_SLICE_THREADS,
+    .process_command = process_command,
+};
diff --git a/libavfilter/vf_ciescope.c b/libavfilter/vf_ciescope.c
index 7c0cfed..d5a2c8c 100644
--- a/libavfilter/vf_ciescope.c
+++ b/libavfilter/vf_ciescope.c
@@ -46,6 +46,7 @@
     CIE1931system,
     Rec709system,
     Rec2020system,
+    DCIP3,
     NB_CS
 };
 
@@ -87,6 +88,7 @@
     {   "rec709",     "ITU.BT-709 Y'CbCr",      0, AV_OPT_TYPE_CONST, {.i64=Rec709system},   0, 0, FLAGS, "system" },
     {   "uhdtv",      "ITU-R.BT-2020",          0, AV_OPT_TYPE_CONST, {.i64=Rec2020system},  0, 0, FLAGS, "system" },
     {   "rec2020",    "ITU-R.BT-2020",          0, AV_OPT_TYPE_CONST, {.i64=Rec2020system},  0, 0, FLAGS, "system" },
+    {   "dcip3",      "DCI-P3",                 0, AV_OPT_TYPE_CONST, {.i64=DCIP3},          0, 0, FLAGS, "system" },
     { "cie",        "set cie system", OFFSET(cie), AV_OPT_TYPE_INT,   {.i64=XYY}, 0, NB_CIE-1, FLAGS, "cie" },
     {   "xyy",      "CIE 1931 xyY", 0, AV_OPT_TYPE_CONST, {.i64=XYY}, 0, 0, FLAGS, "cie" },
     {   "ucs",      "CIE 1960 UCS", 0, AV_OPT_TYPE_CONST, {.i64=UCS}, 0, 0, FLAGS, "cie" },
@@ -105,6 +107,7 @@
     {   "rec709",   NULL, 0, AV_OPT_TYPE_CONST, {.i64=1<<Rec709system},    0, 0, FLAGS, "gamuts" },
     {   "uhdtv",    NULL, 0, AV_OPT_TYPE_CONST, {.i64=1<<Rec2020system},   0, 0, FLAGS, "gamuts" },
     {   "rec2020",  NULL, 0, AV_OPT_TYPE_CONST, {.i64=1<<Rec2020system},   0, 0, FLAGS, "gamuts" },
+    {   "dcip3",    NULL, 0, AV_OPT_TYPE_CONST, {.i64=1<<DCIP3},           0, 0, FLAGS, "gamuts" },
     { "size",       "set ciescope size", OFFSET(size), AV_OPT_TYPE_INT, {.i64=512}, 256, 8192, FLAGS },
     { "s",          "set ciescope size", OFFSET(size), AV_OPT_TYPE_INT, {.i64=512}, 256, 8192, FLAGS },
     { "intensity",  "set ciescope intensity", OFFSET(intensity), AV_OPT_TYPE_FLOAT, {.dbl=0.001}, 0, 1, FLAGS },
@@ -694,6 +697,10 @@
         0.708,  0.292,  0.170,  0.797,  0.131,  0.046,
         D65, GAMMA_REC709
     },
+    [DCIP3] = {
+        0.680,  0.320,  0.265,  0.690,  0.150,  0.060,
+        0.314,  0.351, GAMMA_REC709
+    },
 };
 
 /*
@@ -1183,15 +1190,11 @@
     if (cie == LUV) {
         double wup, wvp;
         xy_to_upvp(cs->xWhite, cs->yWhite, &wup, &wvp);
-        wx = wup;
-        wy = wvp;
         wx = (w - 1) * wup;
         wy = (h - 1) - ((int) ((h - 1) * wvp));
     } else if (cie == UCS) {
         double wu, wv;
         xy_to_uv(cs->xWhite, cs->yWhite, &wu, &wv);
-        wx = wu;
-        wy = wv;
         wx = (w - 1) * wu;
         wy = (h - 1) - ((int) ((h - 1) * wv));
     } else if (cie == XYY) {
diff --git a/libavfilter/vf_colorbalance.c b/libavfilter/vf_colorbalance.c
index fd003fd..cc90dc0 100644
--- a/libavfilter/vf_colorbalance.c
+++ b/libavfilter/vf_colorbalance.c
@@ -36,9 +36,9 @@
 } ThreadData;
 
 typedef struct Range {
-    double shadows;
-    double midtones;
-    double highlights;
+    float shadows;
+    float midtones;
+    float highlights;
 } Range;
 
 typedef struct ColorBalanceContext {
@@ -46,27 +46,29 @@
     Range cyan_red;
     Range magenta_green;
     Range yellow_blue;
-
-    uint16_t lut[3][65536];
+    int preserve_lightness;
 
     uint8_t rgba_map[4];
+    int depth;
+    int max;
     int step;
 
-    int (*apply_lut)(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs);
+    int (*color_balance)(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs);
 } ColorBalanceContext;
 
 #define OFFSET(x) offsetof(ColorBalanceContext, x)
-#define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM
+#define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_RUNTIME_PARAM
 static const AVOption colorbalance_options[] = {
-    { "rs", "set red shadows",      OFFSET(cyan_red.shadows),         AV_OPT_TYPE_DOUBLE, {.dbl=0}, -1, 1, FLAGS },
-    { "gs", "set green shadows",    OFFSET(magenta_green.shadows),    AV_OPT_TYPE_DOUBLE, {.dbl=0}, -1, 1, FLAGS },
-    { "bs", "set blue shadows",     OFFSET(yellow_blue.shadows),      AV_OPT_TYPE_DOUBLE, {.dbl=0}, -1, 1, FLAGS },
-    { "rm", "set red midtones",     OFFSET(cyan_red.midtones),        AV_OPT_TYPE_DOUBLE, {.dbl=0}, -1, 1, FLAGS },
-    { "gm", "set green midtones",   OFFSET(magenta_green.midtones),   AV_OPT_TYPE_DOUBLE, {.dbl=0}, -1, 1, FLAGS },
-    { "bm", "set blue midtones",    OFFSET(yellow_blue.midtones),     AV_OPT_TYPE_DOUBLE, {.dbl=0}, -1, 1, FLAGS },
-    { "rh", "set red highlights",   OFFSET(cyan_red.highlights),      AV_OPT_TYPE_DOUBLE, {.dbl=0}, -1, 1, FLAGS },
-    { "gh", "set green highlights", OFFSET(magenta_green.highlights), AV_OPT_TYPE_DOUBLE, {.dbl=0}, -1, 1, FLAGS },
-    { "bh", "set blue highlights",  OFFSET(yellow_blue.highlights),   AV_OPT_TYPE_DOUBLE, {.dbl=0}, -1, 1, FLAGS },
+    { "rs", "set red shadows",      OFFSET(cyan_red.shadows),         AV_OPT_TYPE_FLOAT, {.dbl=0}, -1, 1, FLAGS },
+    { "gs", "set green shadows",    OFFSET(magenta_green.shadows),    AV_OPT_TYPE_FLOAT, {.dbl=0}, -1, 1, FLAGS },
+    { "bs", "set blue shadows",     OFFSET(yellow_blue.shadows),      AV_OPT_TYPE_FLOAT, {.dbl=0}, -1, 1, FLAGS },
+    { "rm", "set red midtones",     OFFSET(cyan_red.midtones),        AV_OPT_TYPE_FLOAT, {.dbl=0}, -1, 1, FLAGS },
+    { "gm", "set green midtones",   OFFSET(magenta_green.midtones),   AV_OPT_TYPE_FLOAT, {.dbl=0}, -1, 1, FLAGS },
+    { "bm", "set blue midtones",    OFFSET(yellow_blue.midtones),     AV_OPT_TYPE_FLOAT, {.dbl=0}, -1, 1, FLAGS },
+    { "rh", "set red highlights",   OFFSET(cyan_red.highlights),      AV_OPT_TYPE_FLOAT, {.dbl=0}, -1, 1, FLAGS },
+    { "gh", "set green highlights", OFFSET(magenta_green.highlights), AV_OPT_TYPE_FLOAT, {.dbl=0}, -1, 1, FLAGS },
+    { "bh", "set blue highlights",  OFFSET(yellow_blue.highlights),   AV_OPT_TYPE_FLOAT, {.dbl=0}, -1, 1, FLAGS },
+    { "pl", "preserve lightness",   OFFSET(preserve_lightness),       AV_OPT_TYPE_BOOL,  {.i64=0},  0, 1, FLAGS },
     { NULL }
 };
 
@@ -96,7 +98,64 @@
     return ff_set_common_formats(ctx, fmts_list);
 }
 
-static int apply_lut8_p(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
+static float get_component(float v, float l,
+                           float s, float m, float h)
+{
+    const float a = 4.f, b = 0.333f, scale = 0.7f;
+
+    s *= av_clipf((b - l) * a + 0.5f, 0, 1) * scale;
+    m *= av_clipf((l - b) * a + 0.5f, 0, 1) * av_clipf((1.0 - l - b) * a + 0.5f, 0, 1) * scale;
+    h *= av_clipf((l + b - 1) * a + 0.5f, 0, 1) * scale;
+
+    v += s;
+    v += m;
+    v += h;
+
+    return av_clipf(v, 0, 1);
+}
+
+static float hfun(float n, float h, float s, float l)
+{
+    float a = s * FFMIN(l, 1. - l);
+    float k = fmodf(n + h / 30.f, 12.f);
+
+    return av_clipf(l - a * FFMAX(FFMIN3(k - 3.f, 9.f - k, 1), -1.f), 0, 1);
+}
+
+static void preservel(float *r, float *g, float *b, float l)
+{
+    float max = FFMAX3(*r, *g, *b);
+    float min = FFMIN3(*r, *g, *b);
+    float h, s;
+
+    l *= 0.5;
+
+    if (*r == *g && *g == *b) {
+        h = 0.;
+    } else if (max == *r) {
+        h = 60. * (0. + (*g - *b) / (max - min));
+    } else if (max == *g) {
+        h = 60. * (2. + (*b - *r) / (max - min));
+    } else if (max == *b) {
+        h = 60. * (4. + (*r - *g) / (max - min));
+    } else {
+        h = 0.;
+    }
+    if (h < 0.)
+        h += 360.;
+
+    if (max == 0. || min == 1.) {
+        s = 0.;
+    } else {
+        s = (max - min) / (1. - FFABS(2. * l - 1));
+    }
+
+    *r = hfun(0, h, s, l);
+    *g = hfun(8, h, s, l);
+    *b = hfun(4, h, s, l);
+}
+
+static int color_balance8_p(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
 {
     ColorBalanceContext *s = ctx->priv;
     ThreadData *td = arg;
@@ -112,13 +171,26 @@
     uint8_t *dstb = out->data[1] + slice_start * out->linesize[1];
     uint8_t *dstr = out->data[2] + slice_start * out->linesize[2];
     uint8_t *dsta = out->data[3] + slice_start * out->linesize[3];
+    const float max = s->max;
     int i, j;
 
     for (i = slice_start; i < slice_end; i++) {
         for (j = 0; j < out->width; j++) {
-            dstg[j] = s->lut[G][srcg[j]];
-            dstb[j] = s->lut[B][srcb[j]];
-            dstr[j] = s->lut[R][srcr[j]];
+            float r = srcr[j] / max;
+            float g = srcg[j] / max;
+            float b = srcb[j] / max;
+            const float l = FFMAX3(r, g, b) + FFMIN3(r, g, b);
+
+            r = get_component(r, l, s->cyan_red.shadows, s->cyan_red.midtones, s->cyan_red.highlights);
+            g = get_component(g, l, s->magenta_green.shadows, s->magenta_green.midtones, s->magenta_green.highlights);
+            b = get_component(b, l, s->yellow_blue.shadows, s->yellow_blue.midtones, s->yellow_blue.highlights);
+
+            if (s->preserve_lightness)
+                preservel(&r, &g, &b, l);
+
+            dstr[j] = av_clip_uint8(r * max);
+            dstg[j] = av_clip_uint8(g * max);
+            dstb[j] = av_clip_uint8(b * max);
             if (in != out && out->linesize[3])
                 dsta[j] = srca[j];
         }
@@ -136,7 +208,7 @@
     return 0;
 }
 
-static int apply_lut16_p(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
+static int color_balance16_p(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
 {
     ColorBalanceContext *s = ctx->priv;
     ThreadData *td = arg;
@@ -152,13 +224,27 @@
     uint16_t *dstb = (uint16_t *)out->data[1] + slice_start * out->linesize[1] / 2;
     uint16_t *dstr = (uint16_t *)out->data[2] + slice_start * out->linesize[2] / 2;
     uint16_t *dsta = (uint16_t *)out->data[3] + slice_start * out->linesize[3] / 2;
+    const int depth = s->depth;
+    const float max = s->max;
     int i, j;
 
     for (i = slice_start; i < slice_end; i++) {
         for (j = 0; j < out->width; j++) {
-            dstg[j] = s->lut[G][srcg[j]];
-            dstb[j] = s->lut[B][srcb[j]];
-            dstr[j] = s->lut[R][srcr[j]];
+            float r = srcr[j] / max;
+            float g = srcg[j] / max;
+            float b = srcb[j] / max;
+            const float l = (FFMAX3(r, g, b) + FFMIN3(r, g, b));
+
+            r = get_component(r, l, s->cyan_red.shadows, s->cyan_red.midtones, s->cyan_red.highlights);
+            g = get_component(g, l, s->magenta_green.shadows, s->magenta_green.midtones, s->magenta_green.highlights);
+            b = get_component(b, l, s->yellow_blue.shadows, s->yellow_blue.midtones, s->yellow_blue.highlights);
+
+            if (s->preserve_lightness)
+                preservel(&r, &g, &b, l);
+
+            dstr[j] = av_clip_uintp2_c(r * max, depth);
+            dstg[j] = av_clip_uintp2_c(g * max, depth);
+            dstb[j] = av_clip_uintp2_c(b * max, depth);
             if (in != out && out->linesize[3])
                 dsta[j] = srca[j];
         }
@@ -176,7 +262,7 @@
     return 0;
 }
 
-static int apply_lut8(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
+static int color_balance8(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
 {
     ColorBalanceContext *s = ctx->priv;
     ThreadData *td = arg;
@@ -190,6 +276,7 @@
     const uint8_t goffset = s->rgba_map[G];
     const uint8_t boffset = s->rgba_map[B];
     const uint8_t aoffset = s->rgba_map[A];
+    const float max = s->max;
     const int step = s->step;
     uint8_t *dstrow;
     int i, j;
@@ -200,9 +287,21 @@
         uint8_t *dst = dstrow;
 
         for (j = 0; j < outlink->w * step; j += step) {
-            dst[j + roffset] = s->lut[R][src[j + roffset]];
-            dst[j + goffset] = s->lut[G][src[j + goffset]];
-            dst[j + boffset] = s->lut[B][src[j + boffset]];
+            float r = src[j + roffset] / max;
+            float g = src[j + goffset] / max;
+            float b = src[j + boffset] / max;
+            const float l = (FFMAX3(r, g, b) + FFMIN3(r, g, b));
+
+            r = get_component(r, l, s->cyan_red.shadows, s->cyan_red.midtones, s->cyan_red.highlights);
+            g = get_component(g, l, s->magenta_green.shadows, s->magenta_green.midtones, s->magenta_green.highlights);
+            b = get_component(b, l, s->yellow_blue.shadows, s->yellow_blue.midtones, s->yellow_blue.highlights);
+
+            if (s->preserve_lightness)
+                preservel(&r, &g, &b, l);
+
+            dst[j + roffset] = av_clip_uint8(r * max);
+            dst[j + goffset] = av_clip_uint8(g * max);
+            dst[j + boffset] = av_clip_uint8(b * max);
             if (in != out && step == 4)
                 dst[j + aoffset] = src[j + aoffset];
         }
@@ -214,7 +313,7 @@
     return 0;
 }
 
-static int apply_lut16(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
+static int color_balance16(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
 {
     ColorBalanceContext *s = ctx->priv;
     ThreadData *td = arg;
@@ -229,6 +328,8 @@
     const uint8_t boffset = s->rgba_map[B];
     const uint8_t aoffset = s->rgba_map[A];
     const int step = s->step / 2;
+    const int depth = s->depth;
+    const float max = s->max;
     uint16_t *dstrow;
     int i, j;
 
@@ -238,9 +339,21 @@
         uint16_t *dst = dstrow;
 
         for (j = 0; j < outlink->w * step; j += step) {
-            dst[j + roffset] = s->lut[R][src[j + roffset]];
-            dst[j + goffset] = s->lut[G][src[j + goffset]];
-            dst[j + boffset] = s->lut[B][src[j + boffset]];
+            float r = src[j + roffset] / max;
+            float g = src[j + goffset] / max;
+            float b = src[j + boffset] / max;
+            const float l = (FFMAX3(r, g, b) + FFMIN3(r, g, b));
+
+            r = get_component(r, l, s->cyan_red.shadows, s->cyan_red.midtones, s->cyan_red.highlights);
+            g = get_component(g, l, s->magenta_green.shadows, s->magenta_green.midtones, s->magenta_green.highlights);
+            b = get_component(b, l, s->yellow_blue.shadows, s->yellow_blue.midtones, s->yellow_blue.highlights);
+
+            if (s->preserve_lightness)
+                preservel(&r, &g, &b, l);
+
+            dst[j + roffset] = av_clip_uintp2_c(r * max, depth);
+            dst[j + goffset] = av_clip_uintp2_c(g * max, depth);
+            dst[j + boffset] = av_clip_uintp2_c(b * max, depth);
             if (in != out && step == 4)
                 dst[j + aoffset] = src[j + aoffset];
         }
@@ -258,64 +371,22 @@
     ColorBalanceContext *s = ctx->priv;
     const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(outlink->format);
     const int depth = desc->comp[0].depth;
-    const int max = 1 << depth;
+    const int max = (1 << depth) - 1;
     const int planar = av_pix_fmt_count_planes(outlink->format) > 1;
-    double *shadows, *midtones, *highlights, *buffer;
-    int i, r, g, b;
 
-    if (max == 256 && planar) {
-        s->apply_lut = apply_lut8_p;
+    s->depth = depth;
+    s->max = max;
+
+    if (max == 255 && planar) {
+        s->color_balance = color_balance8_p;
     } else if (planar) {
-        s->apply_lut = apply_lut16_p;
-    } else if (max == 256) {
-        s->apply_lut = apply_lut8;
+        s->color_balance = color_balance16_p;
+    } else if (max == 255) {
+        s->color_balance = color_balance8;
     } else {
-        s->apply_lut = apply_lut16;
+        s->color_balance = color_balance16;
     }
 
-    buffer = av_malloc(max * 3 * sizeof(*buffer));
-    if (!buffer)
-        return AVERROR(ENOMEM);
-
-    shadows    = buffer + max * 0;
-    midtones   = buffer + max * 1;
-    highlights = buffer + max * 2;
-
-    for (i = 0; i < max; i++) {
-        const double L = 0.333 * (max - 1);
-        const double M = 0.7 * (max - 1);
-        const double H = 1 * (max - 1);
-        double low = av_clipd((i - L) / (-max * 0.25) + 0.5, 0, 1) * M;
-        double mid = av_clipd((i - L) / ( max * 0.25) + 0.5, 0, 1) *
-                     av_clipd((i + L - H) / (-max * 0.25) + 0.5, 0, 1) * M;
-
-        shadows[i] = low;
-        midtones[i] = mid;
-        highlights[max - i - 1] = low;
-    }
-
-    for (i = 0; i < max; i++) {
-        r = g = b = i;
-
-        r = av_clip_uintp2_c(r + s->cyan_red.shadows         * shadows[r],    depth);
-        r = av_clip_uintp2_c(r + s->cyan_red.midtones        * midtones[r],   depth);
-        r = av_clip_uintp2_c(r + s->cyan_red.highlights      * highlights[r], depth);
-
-        g = av_clip_uintp2_c(g + s->magenta_green.shadows    * shadows[g],    depth);
-        g = av_clip_uintp2_c(g + s->magenta_green.midtones   * midtones[g],   depth);
-        g = av_clip_uintp2_c(g + s->magenta_green.highlights * highlights[g], depth);
-
-        b = av_clip_uintp2_c(b + s->yellow_blue.shadows      * shadows[b],    depth);
-        b = av_clip_uintp2_c(b + s->yellow_blue.midtones     * midtones[b],   depth);
-        b = av_clip_uintp2_c(b + s->yellow_blue.highlights   * highlights[b], depth);
-
-        s->lut[R][i] = r;
-        s->lut[G][i] = g;
-        s->lut[B][i] = b;
-    }
-
-    av_free(buffer);
-
     ff_fill_rgba_map(s->rgba_map, outlink->format);
     s->step = av_get_padded_bits_per_pixel(desc) >> 3;
 
@@ -343,7 +414,7 @@
 
     td.in = in;
     td.out = out;
-    ctx->internal->execute(ctx, s->apply_lut, &td, NULL, FFMIN(outlink->h, ff_filter_get_nb_threads(ctx)));
+    ctx->internal->execute(ctx, s->color_balance, &td, NULL, FFMIN(outlink->h, ff_filter_get_nb_threads(ctx)));
 
     if (in != out)
         av_frame_free(&in);
@@ -377,4 +448,5 @@
     .inputs        = colorbalance_inputs,
     .outputs       = colorbalance_outputs,
     .flags         = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC | AVFILTER_FLAG_SLICE_THREADS,
+    .process_command = ff_filter_process_command,
 };
diff --git a/libavfilter/vf_colorchannelmixer.c b/libavfilter/vf_colorchannelmixer.c
index 3a9cd37..3bbe44d 100644
--- a/libavfilter/vf_colorchannelmixer.c
+++ b/libavfilter/vf_colorchannelmixer.c
@@ -52,7 +52,8 @@
 } ColorChannelMixerContext;
 
 #define OFFSET(x) offsetof(ColorChannelMixerContext, x)
-#define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM
+#define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_RUNTIME_PARAM
+
 static const AVOption colorchannelmixer_options[] = {
     { "rr", "set the red gain for the red channel",     OFFSET(rr), AV_OPT_TYPE_DOUBLE, {.dbl=1}, -2, 2, FLAGS },
     { "rg", "set the green gain for the red channel",   OFFSET(rg), AV_OPT_TYPE_DOUBLE, {.dbl=0}, -2, 2, FLAGS },
@@ -124,7 +125,7 @@
             const uint8_t rin = srcr[j];
             const uint8_t gin = srcg[j];
             const uint8_t bin = srcb[j];
-            const uint8_t ain = srca[j];
+            const uint8_t ain = have_alpha ? srca[j] : 0;
 
             dstr[j] = av_clip_uint8(s->lut[R][R][rin] +
                                     s->lut[R][G][gin] +
@@ -183,7 +184,7 @@
             const uint16_t rin = srcr[j];
             const uint16_t gin = srcg[j];
             const uint16_t bin = srcb[j];
-            const uint16_t ain = srca[j];
+            const uint16_t ain = have_alpha ? srca[j] : 0;
 
             dstr[j] = av_clip_uintp2(s->lut[R][R][rin] +
                                      s->lut[R][G][gin] +
@@ -408,18 +409,20 @@
     ColorChannelMixerContext *s = ctx->priv;
     const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(outlink->format);
     const int depth = desc->comp[0].depth;
-    int i, j, size, *buffer;
+    int i, j, size, *buffer = s->buffer;
 
     ff_fill_rgba_map(s->rgba_map, outlink->format);
 
     size = 1 << depth;
-    s->buffer = buffer = av_malloc(16 * size * sizeof(*s->buffer));
-    if (!s->buffer)
-        return AVERROR(ENOMEM);
+    if (!s->buffer) {
+        s->buffer = buffer = av_malloc(16 * size * sizeof(*s->buffer));
+        if (!s->buffer)
+            return AVERROR(ENOMEM);
 
-    for (i = 0; i < 4; i++)
-        for (j = 0; j < 4; j++, buffer += size)
-            s->lut[i][j] = buffer;
+        for (i = 0; i < 4; i++)
+            for (j = 0; j < 4; j++, buffer += size)
+                s->lut[i][j] = buffer;
+    }
 
     for (i = 0; i < size; i++) {
         s->lut[R][R][i] = lrint(i * s->rr);
@@ -531,6 +534,17 @@
     return ff_filter_frame(outlink, out);
 }
 
+static int process_command(AVFilterContext *ctx, const char *cmd, const char *args,
+                           char *res, int res_len, int flags)
+{
+    int ret = ff_filter_process_command(ctx, cmd, args, res, res_len, flags);
+
+    if (ret < 0)
+        return ret;
+
+    return config_output(ctx->outputs[0]);
+}
+
 static av_cold void uninit(AVFilterContext *ctx)
 {
     ColorChannelMixerContext *s = ctx->priv;
@@ -566,4 +580,5 @@
     .inputs        = colorchannelmixer_inputs,
     .outputs       = colorchannelmixer_outputs,
     .flags         = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC | AVFILTER_FLAG_SLICE_THREADS,
+    .process_command = process_command,
 };
diff --git a/libavfilter/vf_colorconstancy.c b/libavfilter/vf_colorconstancy.c
index e3bb39e..eae6220 100644
--- a/libavfilter/vf_colorconstancy.c
+++ b/libavfilter/vf_colorconstancy.c
@@ -121,7 +121,6 @@
             for (; i >= 0; --i) {
                 av_freep(&s->gauss[i]);
             }
-            av_log(ctx, AV_LOG_ERROR, "Out of memory while allocating gauss buffers.\n");
             return AVERROR(ENOMEM);
         }
     }
@@ -223,7 +222,6 @@
             td->data[b][p] = av_mallocz_array(s->planeheight[p] * s->planewidth[p], sizeof(*td->data[b][p]));
             if (!td->data[b][p]) {
                 cleanup_derivative_buffers(td, b + 1, p);
-                av_log(ctx, AV_LOG_ERROR, "Out of memory while allocating derivatives buffers.\n");
                 return AVERROR(ENOMEM);
             }
         }
@@ -280,7 +278,7 @@
                     dst[INDX2D(r, c, width)] = 0;
                     for (g = 0; g < filtersize; ++g) {
                         dst[INDX2D(r, c, width)] += GAUSS(src, r,                        c + GINDX(filtersize, g),
-                                                          in_linesize, height, width, gauss[GINDX(filtersize, g)]);
+                                                          in_linesize, height, width, gauss[g]);
                     }
                 }
             }
@@ -295,7 +293,7 @@
                     dst[INDX2D(r, c, width)] = 0;
                     for (g = 0; g < filtersize; ++g) {
                         dst[INDX2D(r, c, width)] += GAUSS(src, r + GINDX(filtersize, g), c,
-                                                          width, height, width, gauss[GINDX(filtersize, g)]);
+                                                          width, height, width, gauss[g]);
                     }
                 }
             }
@@ -682,24 +680,30 @@
     AVFilterLink *outlink = ctx->outputs[0];
     AVFrame *out;
     int ret;
+    int direct = 0;
 
     ret = illumination_estimation(ctx, in);
     if (ret) {
+        av_frame_free(&in);
         return ret;
     }
 
     if (av_frame_is_writable(in)) {
+        direct = 1;
         out = in;
     } else {
         out = ff_get_video_buffer(outlink, outlink->w, outlink->h);
         if (!out) {
-            av_log(ctx, AV_LOG_ERROR, "Out of memory while allocating output video buffer.\n");
+            av_frame_free(&in);
             return AVERROR(ENOMEM);
         }
         av_frame_copy_props(out, in);
     }
     chromatic_adaptation(ctx, in, out);
 
+    if (!direct)
+        av_frame_free(&in);
+
     return ff_filter_frame(outlink, out);
 }
 
diff --git a/libavfilter/vf_colorkey.c b/libavfilter/vf_colorkey.c
index 3d65e59..7af426a 100644
--- a/libavfilter/vf_colorkey.c
+++ b/libavfilter/vf_colorkey.c
@@ -34,6 +34,9 @@
     uint8_t colorkey_rgba[4];
     float similarity;
     float blend;
+
+    int (*do_slice)(AVFilterContext *ctx, void *arg,
+                    int jobnr, int nb_jobs);
 } ColorkeyContext;
 
 static uint8_t do_colorkey_pixel(ColorkeyContext *ctx, uint8_t r, uint8_t g, uint8_t b)
@@ -77,15 +80,65 @@
     return 0;
 }
 
+static int do_colorhold_slice(AVFilterContext *avctx, void *arg, int jobnr, int nb_jobs)
+{
+    AVFrame *frame = arg;
+
+    const int slice_start = (frame->height * jobnr) / nb_jobs;
+    const int slice_end = (frame->height * (jobnr + 1)) / nb_jobs;
+
+    ColorkeyContext *ctx = avctx->priv;
+
+    int x, y;
+
+    for (y = slice_start; y < slice_end; ++y) {
+        for (x = 0; x < frame->width; ++x) {
+            int o, t, r, g, b;
+
+            o = frame->linesize[0] * y + x * 4;
+            r = frame->data[0][o + ctx->co[0]];
+            g = frame->data[0][o + ctx->co[1]];
+            b = frame->data[0][o + ctx->co[2]];
+
+            t = do_colorkey_pixel(ctx, r, g, b);
+
+            if (t > 0) {
+                int a = (r + g + b) / 3;
+                int rt = 255 - t;
+
+                frame->data[0][o + ctx->co[0]] = (a * t + r * rt + 127) >> 8;
+                frame->data[0][o + ctx->co[1]] = (a * t + g * rt + 127) >> 8;
+                frame->data[0][o + ctx->co[2]] = (a * t + b * rt + 127) >> 8;
+            }
+        }
+    }
+
+    return 0;
+}
+
+static av_cold int init_filter(AVFilterContext *avctx)
+{
+    ColorkeyContext *ctx = avctx->priv;
+
+    if (!strcmp(avctx->filter->name, "colorkey")) {
+        ctx->do_slice = do_colorkey_slice;
+    } else {
+        ctx->do_slice = do_colorhold_slice;
+    }
+
+    return 0;
+}
+
 static int filter_frame(AVFilterLink *link, AVFrame *frame)
 {
     AVFilterContext *avctx = link->dst;
+    ColorkeyContext *ctx = avctx->priv;
     int res;
 
     if (res = av_frame_make_writable(frame))
         return res;
 
-    if (res = avctx->internal->execute(avctx, do_colorkey_slice, frame, NULL, FFMIN(frame->height, ff_filter_get_nb_threads(avctx))))
+    if (res = avctx->internal->execute(avctx, ctx->do_slice, frame, NULL, FFMIN(frame->height, ff_filter_get_nb_threads(avctx))))
         return res;
 
     return ff_filter_frame(avctx->outputs[0], frame);
@@ -146,10 +199,12 @@
 };
 
 #define OFFSET(x) offsetof(ColorkeyContext, x)
-#define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM
+#define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_RUNTIME_PARAM
+
+#if CONFIG_COLORKEY_FILTER
 
 static const AVOption colorkey_options[] = {
-    { "color", "set the colorkey key color", OFFSET(colorkey_rgba), AV_OPT_TYPE_COLOR, { .str = "black" }, CHAR_MIN, CHAR_MAX, FLAGS },
+    { "color", "set the colorkey key color", OFFSET(colorkey_rgba), AV_OPT_TYPE_COLOR, { .str = "black" }, 0, 0, FLAGS },
     { "similarity", "set the colorkey similarity value", OFFSET(similarity), AV_OPT_TYPE_FLOAT, { .dbl = 0.01 }, 0.01, 1.0, FLAGS },
     { "blend", "set the colorkey key blend value", OFFSET(blend), AV_OPT_TYPE_FLOAT, { .dbl = 0.0 }, 0.0, 1.0, FLAGS },
     { NULL }
@@ -163,7 +218,36 @@
     .priv_size     = sizeof(ColorkeyContext),
     .priv_class    = &colorkey_class,
     .query_formats = query_formats,
+    .init          = init_filter,
     .inputs        = colorkey_inputs,
     .outputs       = colorkey_outputs,
     .flags         = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC | AVFILTER_FLAG_SLICE_THREADS,
+    .process_command = ff_filter_process_command,
 };
+
+#endif /* CONFIG_COLORKEY_FILTER */
+#if CONFIG_COLORHOLD_FILTER
+
+static const AVOption colorhold_options[] = {
+    { "color", "set the colorhold key color", OFFSET(colorkey_rgba), AV_OPT_TYPE_COLOR, { .str = "black" }, 0, 0, FLAGS },
+    { "similarity", "set the colorhold similarity value", OFFSET(similarity), AV_OPT_TYPE_FLOAT, { .dbl = 0.01 }, 0.01, 1.0, FLAGS },
+    { "blend", "set the colorhold blend value", OFFSET(blend), AV_OPT_TYPE_FLOAT, { .dbl = 0.0 }, 0.0, 1.0, FLAGS },
+    { NULL }
+};
+
+AVFILTER_DEFINE_CLASS(colorhold);
+
+AVFilter ff_vf_colorhold = {
+    .name          = "colorhold",
+    .description   = NULL_IF_CONFIG_SMALL("Turns a certain color range into gray. Operates on RGB colors."),
+    .priv_size     = sizeof(ColorkeyContext),
+    .priv_class    = &colorhold_class,
+    .query_formats = query_formats,
+    .init          = init_filter,
+    .inputs        = colorkey_inputs,
+    .outputs       = colorkey_outputs,
+    .flags         = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC | AVFILTER_FLAG_SLICE_THREADS,
+    .process_command = ff_filter_process_command,
+};
+
+#endif /* CONFIG_COLORHOLD_FILTER */
diff --git a/libavfilter/vf_colorkey_opencl.c b/libavfilter/vf_colorkey_opencl.c
new file mode 100644
index 0000000..a76a1dc
--- /dev/null
+++ b/libavfilter/vf_colorkey_opencl.c
@@ -0,0 +1,244 @@
+/*
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "libavutil/opt.h"
+#include "libavutil/imgutils.h"
+#include "avfilter.h"
+#include "formats.h"
+#include "internal.h"
+#include "opencl.h"
+#include "opencl_source.h"
+#include "video.h"
+
+typedef struct ColorkeyOpenCLContext {
+    OpenCLFilterContext ocf;
+    // Whether or not the above `OpenCLFilterContext` has been initialized
+    int initialized;
+
+    cl_command_queue command_queue;
+    cl_kernel kernel_colorkey;
+
+    // The color we are supposed to replace with transparency
+    uint8_t colorkey_rgba[4];
+    // Stored as a normalized float for passing to the OpenCL kernel
+    cl_float4 colorkey_rgba_float;
+    // Similarity percentage compared to `colorkey_rgba`, ranging from `0.01` to `1.0`
+    // where `0.01` matches only the key color and `1.0` matches all colors
+    float similarity;
+    // Blending percentage where `0.0` results in fully transparent pixels, `1.0` results
+    // in fully opaque pixels, and numbers in between result in transparency that varies
+    // based on the similarity to the key color
+    float blend;
+} ColorkeyOpenCLContext;
+
+static int colorkey_opencl_init(AVFilterContext *avctx)
+{
+    ColorkeyOpenCLContext *ctx = avctx->priv;
+    cl_int cle;
+    int err;
+
+    err = ff_opencl_filter_load_program(avctx, &ff_opencl_source_colorkey, 1);
+    if (err < 0)
+        goto fail;
+
+    ctx->command_queue = clCreateCommandQueue(
+        ctx->ocf.hwctx->context,
+        ctx->ocf.hwctx->device_id,
+        0,
+        &cle
+    );
+
+    CL_FAIL_ON_ERROR(AVERROR(EIO), "Failed to create OpenCL command queue %d.\n", cle);
+
+    if (ctx->blend > 0.0001) {
+        ctx->kernel_colorkey = clCreateKernel(ctx->ocf.program, "colorkey_blend", &cle);
+        CL_FAIL_ON_ERROR(AVERROR(EIO), "Failed to create colorkey_blend kernel: %d.\n", cle);
+    } else {
+        ctx->kernel_colorkey = clCreateKernel(ctx->ocf.program, "colorkey", &cle);
+        CL_FAIL_ON_ERROR(AVERROR(EIO), "Failed to create colorkey kernel: %d.\n", cle);
+    }
+
+    for (int i = 0; i < 4; ++i) {
+        ctx->colorkey_rgba_float.s[i] = (float)ctx->colorkey_rgba[i] / 255.0;
+    }
+
+    ctx->initialized = 1;
+    return 0;
+
+fail:
+    if (ctx->command_queue)
+        clReleaseCommandQueue(ctx->command_queue);
+    if (ctx->kernel_colorkey)
+        clReleaseKernel(ctx->kernel_colorkey);
+    return err;
+}
+
+static int filter_frame(AVFilterLink *link, AVFrame *input_frame)
+{
+    AVFilterContext *avctx = link->dst;
+    AVFilterLink *outlink = avctx->outputs[0];
+    ColorkeyOpenCLContext *colorkey_ctx = avctx->priv;
+    AVFrame *output_frame = NULL;
+    int err;
+    cl_int cle;
+    size_t global_work[2];
+    cl_mem src, dst;
+
+    if (!input_frame->hw_frames_ctx)
+        return AVERROR(EINVAL);
+
+    if (!colorkey_ctx->initialized) {
+        AVHWFramesContext *input_frames_ctx =
+            (AVHWFramesContext*)input_frame->hw_frames_ctx->data;
+        int fmt = input_frames_ctx->sw_format;
+
+        // Make sure the input is a format we support
+        if (fmt != AV_PIX_FMT_ARGB &&
+            fmt != AV_PIX_FMT_RGBA &&
+            fmt != AV_PIX_FMT_ABGR &&
+            fmt != AV_PIX_FMT_BGRA
+        ) {
+            av_log(avctx, AV_LOG_ERROR, "unsupported (non-RGB) format in colorkey_opencl.\n");
+            err = AVERROR(ENOSYS);
+            goto fail;
+        }
+
+        err = colorkey_opencl_init(avctx);
+        if (err < 0)
+            goto fail;
+    }
+
+    // This filter only operates on RGB data and we know that will be on the first plane
+    src = (cl_mem)input_frame->data[0];
+    output_frame = ff_get_video_buffer(outlink, outlink->w, outlink->h);
+    if (!output_frame) {
+        err = AVERROR(ENOMEM);
+        goto fail;
+    }
+    dst = (cl_mem)output_frame->data[0];
+
+    CL_SET_KERNEL_ARG(colorkey_ctx->kernel_colorkey, 0, cl_mem, &src);
+    CL_SET_KERNEL_ARG(colorkey_ctx->kernel_colorkey, 1, cl_mem, &dst);
+    CL_SET_KERNEL_ARG(colorkey_ctx->kernel_colorkey, 2, cl_float4, &colorkey_ctx->colorkey_rgba_float);
+    CL_SET_KERNEL_ARG(colorkey_ctx->kernel_colorkey, 3, float, &colorkey_ctx->similarity);
+    if (colorkey_ctx->blend > 0.0001) {
+        CL_SET_KERNEL_ARG(colorkey_ctx->kernel_colorkey, 4, float, &colorkey_ctx->blend);
+    }
+
+    err = ff_opencl_filter_work_size_from_image(avctx, global_work, input_frame, 0, 0);
+    if (err < 0)
+        goto fail;
+
+    cle = clEnqueueNDRangeKernel(
+        colorkey_ctx->command_queue,
+        colorkey_ctx->kernel_colorkey,
+        2,
+        NULL,
+        global_work,
+        NULL,
+        0,
+        NULL,
+        NULL
+    );
+
+    CL_FAIL_ON_ERROR(AVERROR(EIO), "Failed to enqueue colorkey kernel: %d.\n", cle);
+
+    // Run queued kernel
+    cle = clFinish(colorkey_ctx->command_queue);
+    CL_FAIL_ON_ERROR(AVERROR(EIO), "Failed to finish command queue: %d.\n", cle);
+
+    err = av_frame_copy_props(output_frame, input_frame);
+    if (err < 0)
+        goto fail;
+
+    av_frame_free(&input_frame);
+
+    return ff_filter_frame(outlink, output_frame);
+
+fail:
+    clFinish(colorkey_ctx->command_queue);
+    av_frame_free(&input_frame);
+    av_frame_free(&output_frame);
+    return err;
+}
+
+static av_cold void colorkey_opencl_uninit(AVFilterContext *avctx)
+{
+    ColorkeyOpenCLContext *ctx = avctx->priv;
+    cl_int cle;
+
+    if (ctx->kernel_colorkey) {
+        cle = clReleaseKernel(ctx->kernel_colorkey);
+        if (cle != CL_SUCCESS)
+            av_log(avctx, AV_LOG_ERROR, "Failed to release "
+                   "kernel: %d.\n", cle);
+    }
+
+    if (ctx->command_queue) {
+        cle = clReleaseCommandQueue(ctx->command_queue);
+        if (cle != CL_SUCCESS)
+            av_log(avctx, AV_LOG_ERROR, "Failed to release "
+                   "command queue: %d.\n", cle);
+    }
+
+    ff_opencl_filter_uninit(avctx);
+}
+
+static const AVFilterPad colorkey_opencl_inputs[] = {
+    {
+        .name = "default",
+        .type = AVMEDIA_TYPE_VIDEO,
+        .filter_frame = filter_frame,
+        .config_props = &ff_opencl_filter_config_input,
+    },
+    { NULL }
+};
+
+static const AVFilterPad colorkey_opencl_outputs[] = {
+    {
+        .name = "default",
+        .type = AVMEDIA_TYPE_VIDEO,
+        .config_props = &ff_opencl_filter_config_output,
+    },
+    { NULL }
+};
+
+#define OFFSET(x) offsetof(ColorkeyOpenCLContext, x)
+#define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM
+
+static const AVOption colorkey_opencl_options[] = {
+    { "color", "set the colorkey key color", OFFSET(colorkey_rgba), AV_OPT_TYPE_COLOR, { .str = "black" }, 0, 0, FLAGS },
+    { "similarity", "set the colorkey similarity value", OFFSET(similarity), AV_OPT_TYPE_FLOAT, { .dbl = 0.01 }, 0.01, 1.0, FLAGS },
+    { "blend", "set the colorkey key blend value", OFFSET(blend), AV_OPT_TYPE_FLOAT, { .dbl = 0.0 }, 0.0, 1.0, FLAGS },
+    { NULL }
+};
+
+AVFILTER_DEFINE_CLASS(colorkey_opencl);
+
+AVFilter ff_vf_colorkey_opencl = {
+    .name           = "colorkey_opencl",
+    .description    = NULL_IF_CONFIG_SMALL("Turns a certain color into transparency. Operates on RGB colors."),
+    .priv_size      = sizeof(ColorkeyOpenCLContext),
+    .priv_class     = &colorkey_opencl_class,
+    .init           = &ff_opencl_filter_init,
+    .uninit         = &colorkey_opencl_uninit,
+    .query_formats  = &ff_opencl_filter_query_formats,
+    .inputs         = colorkey_opencl_inputs,
+    .outputs        = colorkey_opencl_outputs,
+    .flags_internal = FF_FILTER_FLAG_HWFRAME_AWARE
+};
diff --git a/libavfilter/vf_colorlevels.c b/libavfilter/vf_colorlevels.c
index 5385a5e..c03e288 100644
--- a/libavfilter/vf_colorlevels.c
+++ b/libavfilter/vf_colorlevels.c
@@ -48,7 +48,7 @@
 } ColorLevelsContext;
 
 #define OFFSET(x) offsetof(ColorLevelsContext, x)
-#define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM
+#define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_RUNTIME_PARAM
 static const AVOption colorlevels_options[] = {
     { "rimin", "set input red black point",    OFFSET(range[R].in_min),  AV_OPT_TYPE_DOUBLE, {.dbl=0}, -1, 1, FLAGS },
     { "gimin", "set input green black point",  OFFSET(range[G].in_min),  AV_OPT_TYPE_DOUBLE, {.dbl=0}, -1, 1, FLAGS },
@@ -105,6 +105,68 @@
     return 0;
 }
 
+struct thread_data {
+    const uint8_t *srcrow;
+    uint8_t *dstrow;
+    int dst_linesize;
+    int src_linesize;
+
+    double coeff;
+    uint8_t offset;
+
+    int h;
+
+    int imin;
+    int omin;
+};
+
+#define LOAD_COMMON\
+    ColorLevelsContext *s = ctx->priv;\
+    const struct thread_data *td = arg;\
+\
+    int process_h = td->h;\
+    const int slice_start = (process_h *  jobnr   ) / nb_jobs;\
+    const int slice_end   = (process_h * (jobnr+1)) / nb_jobs;\
+    int x, y;\
+    const uint8_t *srcrow = td->srcrow;\
+    uint8_t *dstrow = td->dstrow;\
+    const int step = s->step;\
+    const uint8_t offset = td->offset;\
+\
+    int imin = td->imin;\
+    int omin = td->omin;\
+    double coeff = td->coeff;\
+
+static int colorlevel_slice_8(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
+{
+    LOAD_COMMON
+
+    for (y = slice_start; y < slice_end; y++) {
+        const uint8_t *src = srcrow + y * td->src_linesize;
+        uint8_t *dst = dstrow + y * td->dst_linesize;
+
+        for (x = 0; x < s->linesize; x += step)
+            dst[x + offset] = av_clip_uint8((src[x + offset] - imin) * coeff + omin);
+    }
+
+    return 0;
+}
+
+static int colorlevel_slice_16(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
+{
+    LOAD_COMMON
+
+    for (y = slice_start; y < slice_end; y++) {
+        const uint16_t *src = (const uint16_t *)(srcrow + y * td->src_linesize);
+        uint16_t *dst = (uint16_t *)(dstrow + y * td->dst_linesize);
+
+        for (x = 0; x < s->linesize; x += step)
+            dst[x + offset] = av_clip_uint16((src[x + offset] - imin) * coeff + omin);
+    }
+
+    return 0;
+}
+
 static int filter_frame(AVFilterLink *inlink, AVFrame *in)
 {
     AVFilterContext *ctx = inlink->dst;
@@ -137,6 +199,7 @@
             int omin = lrint(r->out_min * UINT8_MAX);
             int omax = lrint(r->out_max * UINT8_MAX);
             double coeff;
+            struct thread_data td;
 
             if (imin < 0) {
                 imin = UINT8_MAX;
@@ -162,15 +225,19 @@
 
             srcrow = in->data[0];
             coeff = (omax - omin) / (double)(imax - imin);
-            for (y = 0; y < inlink->h; y++) {
-                const uint8_t *src = srcrow;
-                uint8_t *dst = dstrow;
 
-                for (x = 0; x < s->linesize; x += step)
-                    dst[x + offset] = av_clip_uint8((src[x + offset] - imin) * coeff + omin);
-                dstrow += out->linesize[0];
-                srcrow += in->linesize[0];
-            }
+            td.srcrow        = srcrow;
+            td.dstrow        = dstrow;
+            td.dst_linesize  = out->linesize[0];
+            td.src_linesize  = in->linesize[0];
+            td.coeff         = coeff;
+            td.offset        = offset;
+            td.h             = inlink->h;
+            td.imin          = imin;
+            td.omin          = omin;
+
+            ctx->internal->execute(ctx, colorlevel_slice_8, &td, NULL,
+                                   FFMIN(inlink->h, ff_filter_get_nb_threads(ctx)));
         }
         break;
     case 2:
@@ -184,6 +251,7 @@
             int omin = lrint(r->out_min * UINT16_MAX);
             int omax = lrint(r->out_max * UINT16_MAX);
             double coeff;
+            struct thread_data td;
 
             if (imin < 0) {
                 imin = UINT16_MAX;
@@ -209,15 +277,19 @@
 
             srcrow = in->data[0];
             coeff = (omax - omin) / (double)(imax - imin);
-            for (y = 0; y < inlink->h; y++) {
-                const uint16_t *src = (const uint16_t*)srcrow;
-                uint16_t *dst = (uint16_t *)dstrow;
 
-                for (x = 0; x < s->linesize; x += step)
-                    dst[x + offset] = av_clip_uint16((src[x + offset] - imin) * coeff + omin);
-                dstrow += out->linesize[0];
-                srcrow += in->linesize[0];
-            }
+            td.srcrow        = srcrow;
+            td.dstrow        = dstrow;
+            td.dst_linesize  = out->linesize[0];
+            td.src_linesize  = in->linesize[0];
+            td.coeff         = coeff;
+            td.offset        = offset;
+            td.h             = inlink->h;
+            td.imin          = imin;
+            td.omin          = omin;
+
+            ctx->internal->execute(ctx, colorlevel_slice_16, &td, NULL,
+                                   FFMIN(inlink->h, ff_filter_get_nb_threads(ctx)));
         }
     }
 
@@ -252,5 +324,6 @@
     .query_formats = query_formats,
     .inputs        = colorlevels_inputs,
     .outputs       = colorlevels_outputs,
-    .flags         = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC,
+    .flags         = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC | AVFILTER_FLAG_SLICE_THREADS,
+    .process_command = ff_filter_process_command,
 };
diff --git a/libavfilter/vf_colorspace.c b/libavfilter/vf_colorspace.c
index f8d1ecd..7098dd5 100644
--- a/libavfilter/vf_colorspace.c
+++ b/libavfilter/vf_colorspace.c
@@ -170,78 +170,6 @@
 // FIXME dithering if bitdepth goes down?
 // FIXME bitexact for fate integration?
 
-static const double ycgco_matrix[3][3] =
-{
-    {  0.25, 0.5,  0.25 },
-    { -0.25, 0.5, -0.25 },
-    {  0.5,  0,   -0.5  },
-};
-
-static const double gbr_matrix[3][3] =
-{
-    { 0,    1,   0   },
-    { 0,   -0.5, 0.5 },
-    { 0.5, -0.5, 0   },
-};
-
-/*
- * All constants explained in e.g. https://linuxtv.org/downloads/v4l-dvb-apis/ch02s06.html
- * The older ones (bt470bg/m) are also explained in their respective ITU docs
- * (e.g. https://www.itu.int/dms_pubrec/itu-r/rec/bt/R-REC-BT.470-5-199802-S!!PDF-E.pdf)
- * whereas the newer ones can typically be copied directly from wikipedia :)
- */
-static const struct LumaCoefficients luma_coefficients[AVCOL_SPC_NB] = {
-    [AVCOL_SPC_FCC]        = { 0.30,   0.59,   0.11   },
-    [AVCOL_SPC_BT470BG]    = { 0.299,  0.587,  0.114  },
-    [AVCOL_SPC_SMPTE170M]  = { 0.299,  0.587,  0.114  },
-    [AVCOL_SPC_BT709]      = { 0.2126, 0.7152, 0.0722 },
-    [AVCOL_SPC_SMPTE240M]  = { 0.212,  0.701,  0.087  },
-    [AVCOL_SPC_YCOCG]      = { 0.25,   0.5,    0.25   },
-    [AVCOL_SPC_RGB]        = { 1,      1,      1      },
-    [AVCOL_SPC_BT2020_NCL] = { 0.2627, 0.6780, 0.0593 },
-    [AVCOL_SPC_BT2020_CL]  = { 0.2627, 0.6780, 0.0593 },
-};
-
-static const struct LumaCoefficients *get_luma_coefficients(enum AVColorSpace csp)
-{
-    const struct LumaCoefficients *coeffs;
-
-    if (csp >= AVCOL_SPC_NB)
-        return NULL;
-    coeffs = &luma_coefficients[csp];
-    if (!coeffs->cr)
-        return NULL;
-
-    return coeffs;
-}
-
-static void fill_rgb2yuv_table(const struct LumaCoefficients *coeffs,
-                               double rgb2yuv[3][3])
-{
-    double bscale, rscale;
-
-    // special ycgco matrix
-    if (coeffs->cr == 0.25 && coeffs->cg == 0.5 && coeffs->cb == 0.25) {
-        memcpy(rgb2yuv, ycgco_matrix, sizeof(double) * 9);
-        return;
-    } else if (coeffs->cr == 1 && coeffs->cg == 1 && coeffs->cb == 1) {
-        memcpy(rgb2yuv, gbr_matrix, sizeof(double) * 9);
-        return;
-    }
-
-    rgb2yuv[0][0] = coeffs->cr;
-    rgb2yuv[0][1] = coeffs->cg;
-    rgb2yuv[0][2] = coeffs->cb;
-    bscale = 0.5 / (coeffs->cb - 1.0);
-    rscale = 0.5 / (coeffs->cr - 1.0);
-    rgb2yuv[1][0] = bscale * coeffs->cr;
-    rgb2yuv[1][1] = bscale * coeffs->cg;
-    rgb2yuv[1][2] = 0.5;
-    rgb2yuv[2][0] = 0.5;
-    rgb2yuv[2][1] = rscale * coeffs->cg;
-    rgb2yuv[2][2] = rscale * coeffs->cb;
-}
-
 // FIXME I'm pretty sure gamma22/28 also have a linear toe slope, but I can't
 // find any actual tables that document their real values...
 // See http://www.13thmonkey.org/~boris/gammacorrection/ first graph why it matters
@@ -332,9 +260,9 @@
         s->delin_lut[n] = av_clip_int16(lrint(d * 28672.0));
 
         // linearize
-        if (v <= -in_beta) {
+        if (v <= -in_beta * in_delta) {
             l = -pow((1.0 - in_alpha - v) * in_ialpha, in_igamma);
-        } else if (v < in_beta) {
+        } else if (v < in_beta * in_delta) {
             l = v * in_idelta;
         } else {
             l = pow((v + in_alpha - 1.0) * in_ialpha, in_igamma);
@@ -403,15 +331,15 @@
     }
 }
 
-struct ThreadData {
+typedef struct ThreadData {
     AVFrame *in, *out;
     ptrdiff_t in_linesize[3], out_linesize[3];
     int in_ss_h, out_ss_h;
-};
+} ThreadData;
 
 static int convert(AVFilterContext *ctx, void *data, int job_nr, int n_jobs)
 {
-    struct ThreadData *td = data;
+    const ThreadData *td = data;
     ColorSpaceContext *s = ctx->priv;
     uint8_t *in_data[3], *out_data[3];
     int16_t *rgb[3];
@@ -669,7 +597,7 @@
         s->in_rng = in->color_range;
         if (s->user_irng != AVCOL_RANGE_UNSPECIFIED)
             s->in_rng = s->user_irng;
-        s->in_lumacoef = get_luma_coefficients(s->in_csp);
+        s->in_lumacoef = ff_get_luma_coefficients(s->in_csp);
         if (!s->in_lumacoef) {
             av_log(ctx, AV_LOG_ERROR,
                    "Unsupported input colorspace %d (%s)\n",
@@ -682,7 +610,7 @@
     if (!s->out_lumacoef) {
         s->out_csp = out->colorspace;
         s->out_rng = out->color_range;
-        s->out_lumacoef = get_luma_coefficients(s->out_csp);
+        s->out_lumacoef = ff_get_luma_coefficients(s->out_csp);
         if (!s->out_lumacoef) {
             if (s->out_csp == AVCOL_SPC_UNSPECIFIED) {
                 if (s->user_all == CS_UNSPECIFIED) {
@@ -724,7 +652,7 @@
             }
             for (n = 0; n < 8; n++)
                 s->yuv_offset[0][n] = off;
-            fill_rgb2yuv_table(s->in_lumacoef, rgb2yuv);
+            ff_fill_rgb2yuv_table(s->in_lumacoef, rgb2yuv);
             ff_matrix_invert_3x3(rgb2yuv, yuv2rgb);
             bits = 1 << (in_desc->comp[0].depth - 1);
             for (n = 0; n < 3; n++) {
@@ -757,7 +685,7 @@
             }
             for (n = 0; n < 8; n++)
                 s->yuv_offset[1][n] = off;
-            fill_rgb2yuv_table(s->out_lumacoef, rgb2yuv);
+            ff_fill_rgb2yuv_table(s->out_lumacoef, rgb2yuv);
             bits = 1 << (29 - out_desc->comp[0].depth);
             for (out_rng = s->out_y_rng, n = 0; n < 3; n++, out_rng = s->out_uv_rng) {
                 for (m = 0; m < 3; m++) {
@@ -804,7 +732,7 @@
     return 0;
 }
 
-static int init(AVFilterContext *ctx)
+static av_cold int init(AVFilterContext *ctx)
 {
     ColorSpaceContext *s = ctx->priv;
 
@@ -843,7 +771,7 @@
     int res;
     ptrdiff_t rgb_stride = FFALIGN(in->width * sizeof(int16_t), 32);
     unsigned rgb_sz = rgb_stride * in->height;
-    struct ThreadData td;
+    ThreadData td;
 
     if (!out) {
         av_frame_free(&in);
@@ -852,6 +780,7 @@
     res = av_frame_copy_props(out, in);
     if (res < 0) {
         av_frame_free(&in);
+        av_frame_free(&out);
         return res;
     }
 
@@ -911,13 +840,18 @@
             !s->dither_scratch_base[1][0] || !s->dither_scratch_base[1][1] ||
             !s->dither_scratch_base[2][0] || !s->dither_scratch_base[2][1]) {
             uninit(ctx);
+            av_frame_free(&in);
+            av_frame_free(&out);
             return AVERROR(ENOMEM);
         }
         s->rgb_sz = rgb_sz;
     }
     res = create_filtergraph(ctx, in, out);
-    if (res < 0)
+    if (res < 0) {
+        av_frame_free(&in);
+        av_frame_free(&out);
         return res;
+    }
     s->rgb_stride = rgb_stride / sizeof(int16_t);
     td.in = in;
     td.out = out;
@@ -931,8 +865,11 @@
     td.out_ss_h = av_pix_fmt_desc_get(out->format)->log2_chroma_h;
     if (s->yuv2yuv_passthrough) {
         res = av_frame_copy(out, in);
-        if (res < 0)
+        if (res < 0) {
+            av_frame_free(&in);
+            av_frame_free(&out);
             return res;
+        }
     } else {
         ctx->internal->execute(ctx, convert, &td, NULL,
                                FFMIN((in->height + 1) >> 1, ff_filter_get_nb_threads(ctx)));
@@ -1041,6 +978,7 @@
     ENUM("smpte432",     AVCOL_PRI_SMPTE432,   "prm"),
     ENUM("bt2020",       AVCOL_PRI_BT2020,     "prm"),
     ENUM("jedec-p22",    AVCOL_PRI_JEDEC_P22,  "prm"),
+    ENUM("ebu3213",      AVCOL_PRI_EBU3213,    "prm"),
 
     { "trc",        "Output transfer characteristics",
       OFFSET(user_trc),   AV_OPT_TYPE_INT, { .i64 = AVCOL_TRC_UNSPECIFIED },
diff --git a/libavfilter/vf_convolution.c b/libavfilter/vf_convolution.c
index 421c169..5909fea 100644
--- a/libavfilter/vf_convolution.c
+++ b/libavfilter/vf_convolution.c
@@ -25,48 +25,11 @@
 #include "libavutil/opt.h"
 #include "libavutil/pixdesc.h"
 #include "avfilter.h"
+#include "convolution.h"
 #include "formats.h"
 #include "internal.h"
 #include "video.h"
 
-enum MatrixMode {
-    MATRIX_SQUARE,
-    MATRIX_ROW,
-    MATRIX_COLUMN,
-    MATRIX_NBMODES,
-};
-
-typedef struct ConvolutionContext {
-    const AVClass *class;
-
-    char *matrix_str[4];
-    float rdiv[4];
-    float bias[4];
-    int mode[4];
-    float scale;
-    float delta;
-    int planes;
-
-    int size[4];
-    int depth;
-    int max;
-    int bpc;
-    int nb_planes;
-    int nb_threads;
-    int planewidth[4];
-    int planeheight[4];
-    int matrix[4][49];
-    int matrix_length[4];
-    int copy[4];
-
-    void (*setup[4])(int radius, const uint8_t *c[], const uint8_t *src, int stride,
-                     int x, int width, int y, int height, int bpc);
-    void (*filter[4])(uint8_t *dst, int width,
-                      float rdiv, float bias, const int *const matrix,
-                      const uint8_t *c[], int peak, int radius,
-                      int dstride, int stride);
-} ConvolutionContext;
-
 #define OFFSET(x) offsetof(ConvolutionContext, x)
 #define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
 
@@ -128,6 +91,7 @@
         AV_PIX_FMT_YUV420P16, AV_PIX_FMT_YUV422P16, AV_PIX_FMT_YUV444P16,
         AV_PIX_FMT_YUVA420P9, AV_PIX_FMT_YUVA422P9, AV_PIX_FMT_YUVA444P9,
         AV_PIX_FMT_YUVA420P10, AV_PIX_FMT_YUVA422P10, AV_PIX_FMT_YUVA444P10,
+        AV_PIX_FMT_YUVA422P12, AV_PIX_FMT_YUVA444P12,
         AV_PIX_FMT_YUVA420P16, AV_PIX_FMT_YUVA422P16, AV_PIX_FMT_YUVA444P16,
         AV_PIX_FMT_GBRP, AV_PIX_FMT_GBRP9, AV_PIX_FMT_GBRP10,
         AV_PIX_FMT_GBRP12, AV_PIX_FMT_GBRP14, AV_PIX_FMT_GBRP16,
@@ -152,12 +116,12 @@
     int x;
 
     for (x = 0; x < width; x++) {
-        int suma = AV_RN16A(&c[0][2 * x]) * -1 + AV_RN16A(&c[1][2 * x]) * -1 + AV_RN16A(&c[2][2 * x]) * -1 +
-                   AV_RN16A(&c[6][2 * x]) *  1 + AV_RN16A(&c[7][2 * x]) *  1 + AV_RN16A(&c[8][2 * x]) *  1;
-        int sumb = AV_RN16A(&c[0][2 * x]) * -1 + AV_RN16A(&c[2][2 * x]) *  1 + AV_RN16A(&c[3][2 * x]) * -1 +
-                   AV_RN16A(&c[5][2 * x]) *  1 + AV_RN16A(&c[6][2 * x]) * -1 + AV_RN16A(&c[8][2 * x]) *  1;
+        float suma = AV_RN16A(&c[0][2 * x]) * -1 + AV_RN16A(&c[1][2 * x]) * -1 + AV_RN16A(&c[2][2 * x]) * -1 +
+                     AV_RN16A(&c[6][2 * x]) *  1 + AV_RN16A(&c[7][2 * x]) *  1 + AV_RN16A(&c[8][2 * x]) *  1;
+        float sumb = AV_RN16A(&c[0][2 * x]) * -1 + AV_RN16A(&c[2][2 * x]) *  1 + AV_RN16A(&c[3][2 * x]) * -1 +
+                     AV_RN16A(&c[5][2 * x]) *  1 + AV_RN16A(&c[6][2 * x]) * -1 + AV_RN16A(&c[8][2 * x]) *  1;
 
-        dst[x] = av_clip(sqrt(suma*suma + sumb*sumb) * scale + delta, 0, peak);
+        dst[x] = av_clip(sqrtf(suma*suma + sumb*sumb) * scale + delta, 0, peak);
     }
 }
 
@@ -170,10 +134,10 @@
     int x;
 
     for (x = 0; x < width; x++) {
-        int suma = AV_RN16A(&c[0][2 * x]) *  1 + AV_RN16A(&c[1][2 * x]) * -1;
-        int sumb = AV_RN16A(&c[4][2 * x]) *  1 + AV_RN16A(&c[3][2 * x]) * -1;
+        float suma = AV_RN16A(&c[0][2 * x]) *  1 + AV_RN16A(&c[1][2 * x]) * -1;
+        float sumb = AV_RN16A(&c[4][2 * x]) *  1 + AV_RN16A(&c[3][2 * x]) * -1;
 
-        dst[x] = av_clip(sqrt(suma*suma + sumb*sumb) * scale + delta, 0, peak);
+        dst[x] = av_clip(sqrtf(suma*suma + sumb*sumb) * scale + delta, 0, peak);
     }
 }
 
@@ -186,12 +150,12 @@
     int x;
 
     for (x = 0; x < width; x++) {
-        int suma = AV_RN16A(&c[0][2 * x]) * -1 + AV_RN16A(&c[1][2 * x]) * -2 + AV_RN16A(&c[2][2 * x]) * -1 +
-                   AV_RN16A(&c[6][2 * x]) *  1 + AV_RN16A(&c[7][2 * x]) *  2 + AV_RN16A(&c[8][2 * x]) *  1;
-        int sumb = AV_RN16A(&c[0][2 * x]) * -1 + AV_RN16A(&c[2][2 * x]) *  1 + AV_RN16A(&c[3][2 * x]) * -2 +
-                   AV_RN16A(&c[5][2 * x]) *  2 + AV_RN16A(&c[6][2 * x]) * -1 + AV_RN16A(&c[8][2 * x]) *  1;
+        float suma = AV_RN16A(&c[0][2 * x]) * -1 + AV_RN16A(&c[1][2 * x]) * -2 + AV_RN16A(&c[2][2 * x]) * -1 +
+                     AV_RN16A(&c[6][2 * x]) *  1 + AV_RN16A(&c[7][2 * x]) *  2 + AV_RN16A(&c[8][2 * x]) *  1;
+        float sumb = AV_RN16A(&c[0][2 * x]) * -1 + AV_RN16A(&c[2][2 * x]) *  1 + AV_RN16A(&c[3][2 * x]) * -2 +
+                     AV_RN16A(&c[5][2 * x]) *  2 + AV_RN16A(&c[6][2 * x]) * -1 + AV_RN16A(&c[8][2 * x]) *  1;
 
-        dst[x] = av_clip(sqrt(suma*suma + sumb*sumb) * scale + delta, 0, peak);
+        dst[x] = av_clip(sqrtf(suma*suma + sumb*sumb) * scale + delta, 0, peak);
     }
 }
 
@@ -206,12 +170,12 @@
     int x;
 
     for (x = 0; x < width; x++) {
-        int suma = c0[x] * -1 + c1[x] * -1 + c2[x] * -1 +
-                   c6[x] *  1 + c7[x] *  1 + c8[x] *  1;
-        int sumb = c0[x] * -1 + c2[x] *  1 + c3[x] * -1 +
-                   c5[x] *  1 + c6[x] * -1 + c8[x] *  1;
+        float suma = c0[x] * -1 + c1[x] * -1 + c2[x] * -1 +
+                     c6[x] *  1 + c7[x] *  1 + c8[x] *  1;
+        float sumb = c0[x] * -1 + c2[x] *  1 + c3[x] * -1 +
+                     c5[x] *  1 + c6[x] * -1 + c8[x] *  1;
 
-        dst[x] = av_clip_uint8(sqrt(suma*suma + sumb*sumb) * scale + delta);
+        dst[x] = av_clip_uint8(sqrtf(suma*suma + sumb*sumb) * scale + delta);
     }
 }
 
@@ -223,10 +187,10 @@
     int x;
 
     for (x = 0; x < width; x++) {
-        int suma = c[0][x] *  1 + c[1][x] * -1;
-        int sumb = c[4][x] *  1 + c[3][x] * -1;
+        float suma = c[0][x] *  1 + c[1][x] * -1;
+        float sumb = c[4][x] *  1 + c[3][x] * -1;
 
-        dst[x] = av_clip_uint8(sqrt(suma*suma + sumb*sumb) * scale + delta);
+        dst[x] = av_clip_uint8(sqrtf(suma*suma + sumb*sumb) * scale + delta);
     }
 }
 
@@ -241,12 +205,12 @@
     int x;
 
     for (x = 0; x < width; x++) {
-        int suma = c0[x] * -1 + c1[x] * -2 + c2[x] * -1 +
-                   c6[x] *  1 + c7[x] *  2 + c8[x] *  1;
-        int sumb = c0[x] * -1 + c2[x] *  1 + c3[x] * -2 +
-                   c5[x] *  2 + c6[x] * -1 + c8[x] *  1;
+        float suma = c0[x] * -1 + c1[x] * -2 + c2[x] * -1 +
+                     c6[x] *  1 + c7[x] *  2 + c8[x] *  1;
+        float sumb = c0[x] * -1 + c2[x] *  1 + c3[x] * -2 +
+                     c5[x] *  2 + c6[x] * -1 + c8[x] *  1;
 
-        dst[x] = av_clip_uint8(sqrt(suma*suma + sumb*sumb) * scale + delta);
+        dst[x] = av_clip_uint8(sqrtf(suma*suma + sumb*sumb) * scale + delta);
     }
 }
 
@@ -625,6 +589,9 @@
                     s->filter[p] = filter16_7x7;
             }
         }
+#if CONFIG_CONVOLUTION_FILTER && ARCH_X86_64
+        ff_convolution_init_x86(s);
+#endif
     } else if (!strcmp(ctx->filter->name, "prewitt")) {
         if (s->depth > 8)
             for (p = 0; p < s->nb_planes; p++)
diff --git a/libavfilter/vf_convolve.c b/libavfilter/vf_convolve.c
index 024eb68..90ec987 100644
--- a/libavfilter/vf_convolve.c
+++ b/libavfilter/vf_convolve.c
@@ -590,7 +590,9 @@
 
         for (j = 0; j < MAX_THREADS; j++) {
             av_fft_end(s->fft[i][j]);
+            s->fft[i][j] = NULL;
             av_fft_end(s->ifft[i][j]);
+            s->ifft[i][j] = NULL;
         }
     }
 
diff --git a/libavfilter/vf_copy.c b/libavfilter/vf_copy.c
index b0159cf..e82feb4 100644
--- a/libavfilter/vf_copy.c
+++ b/libavfilter/vf_copy.c
@@ -48,15 +48,25 @@
 {
     AVFilterLink *outlink = inlink->dst->outputs[0];
     AVFrame *out = ff_get_video_buffer(outlink, in->width, in->height);
+    int ret;
 
     if (!out) {
-        av_frame_free(&in);
-        return AVERROR(ENOMEM);
+        ret = AVERROR(ENOMEM);
+        goto fail;
     }
-    av_frame_copy_props(out, in);
-    av_frame_copy(out, in);
+
+    ret = av_frame_copy_props(out, in);
+    if (ret < 0)
+        goto fail;
+    ret = av_frame_copy(out, in);
+    if (ret < 0)
+        goto fail;
     av_frame_free(&in);
     return ff_filter_frame(outlink, out);
+fail:
+    av_frame_free(&in);
+    av_frame_free(&out);
+    return ret;
 }
 
 static const AVFilterPad avfilter_vf_copy_inputs[] = {
diff --git a/libavfilter/vf_coreimage.m b/libavfilter/vf_coreimage.m
index 323a28c..4ed5ba7 100644
--- a/libavfilter/vf_coreimage.m
+++ b/libavfilter/vf_coreimage.m
@@ -486,6 +486,7 @@
         av_log(ctx, AV_LOG_DEBUG, "Filter_string: %s\n", ctx->filter_string);
         ret = av_dict_parse_string(&filter_dict, ctx->filter_string, "@", "#", AV_DICT_MULTIKEY); // parse filter_name:all_filter_options
         if (ret) {
+            av_dict_free(&filter_dict);
             av_log(ctx, AV_LOG_ERROR, "Parsing of filters failed.\n");
             return AVERROR(EIO);
         }
@@ -507,6 +508,7 @@
             if (strncmp(f->value, "default", 7)) { // not default
                 ret = av_dict_parse_string(&filter_options, f->value, "=", "@", 0); // parse option_name:option_value
                 if (ret) {
+                    av_dict_free(&filter_options);
                     av_log(ctx, AV_LOG_ERROR, "Parsing of filter options for \"%s\" failed.\n", f->key);
                     return AVERROR(EIO);
                 }
diff --git a/libavfilter/vf_crop.c b/libavfilter/vf_crop.c
index 84be4c7..502defd 100644
--- a/libavfilter/vf_crop.c
+++ b/libavfilter/vf_crop.c
@@ -98,9 +98,17 @@
 
     for (fmt = 0; av_pix_fmt_desc_get(fmt); fmt++) {
         const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(fmt);
-        if (!(desc->flags & (AV_PIX_FMT_FLAG_HWACCEL | AV_PIX_FMT_FLAG_BITSTREAM)) &&
-            !((desc->log2_chroma_w || desc->log2_chroma_h) && !(desc->flags & AV_PIX_FMT_FLAG_PLANAR)) &&
-            (ret = ff_add_format(&formats, fmt)) < 0)
+        if (desc->flags & AV_PIX_FMT_FLAG_BITSTREAM)
+            continue;
+        if (!(desc->flags & AV_PIX_FMT_FLAG_HWACCEL)) {
+            // Not usable if there is any subsampling but the format is
+            // not planar (e.g. YUYV422).
+            if ((desc->log2_chroma_w || desc->log2_chroma_h) &&
+                !(desc->flags & AV_PIX_FMT_FLAG_PLANAR))
+                continue;
+        }
+        ret = ff_add_format(&formats, fmt);
+        if (ret < 0)
             return ret;
     }
 
@@ -157,13 +165,18 @@
     s->var_values[VAR_POS]   = NAN;
 
     av_image_fill_max_pixsteps(s->max_step, NULL, pix_desc);
-    s->hsub = pix_desc->log2_chroma_w;
-    s->vsub = pix_desc->log2_chroma_h;
 
-    if ((ret = av_expr_parse_and_eval(&res, (expr = s->w_expr),
-                                      var_names, s->var_values,
-                                      NULL, NULL, NULL, NULL, NULL, 0, ctx)) < 0)
-        goto fail_expr;
+    if (pix_desc->flags & AV_PIX_FMT_FLAG_HWACCEL) {
+        s->hsub = 1;
+        s->vsub = 1;
+    } else {
+        s->hsub = pix_desc->log2_chroma_w;
+        s->vsub = pix_desc->log2_chroma_h;
+    }
+
+    av_expr_parse_and_eval(&res, (expr = s->w_expr),
+                           var_names, s->var_values,
+                           NULL, NULL, NULL, NULL, NULL, 0, ctx);
     s->var_values[VAR_OUT_W] = s->var_values[VAR_OW] = res;
     if ((ret = av_expr_parse_and_eval(&res, (expr = s->h_expr),
                                       var_names, s->var_values,
@@ -230,16 +243,22 @@
     return 0;
 
 fail_expr:
-    av_log(NULL, AV_LOG_ERROR, "Error when evaluating the expression '%s'\n", expr);
+    av_log(ctx, AV_LOG_ERROR, "Error when evaluating the expression '%s'\n", expr);
     return ret;
 }
 
 static int config_output(AVFilterLink *link)
 {
     CropContext *s = link->src->priv;
+    const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(link->format);
 
-    link->w = s->w;
-    link->h = s->h;
+    if (desc->flags & AV_PIX_FMT_FLAG_HWACCEL) {
+        // Hardware frames adjust the cropping regions rather than
+        // changing the frame size.
+    } else {
+        link->w = s->w;
+        link->h = s->h;
+    }
     link->sample_aspect_ratio = s->out_sar;
 
     return 0;
@@ -252,9 +271,6 @@
     const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(link->format);
     int i;
 
-    frame->width  = s->w;
-    frame->height = s->h;
-
     s->var_values[VAR_N] = link->frame_count_out;
     s->var_values[VAR_T] = frame->pts == AV_NOPTS_VALUE ?
         NAN : frame->pts * av_q2d(link->time_base);
@@ -285,22 +301,32 @@
             (int)s->var_values[VAR_N], s->var_values[VAR_T], s->var_values[VAR_POS],
             s->x, s->y, s->x+s->w, s->y+s->h);
 
-    frame->data[0] += s->y * frame->linesize[0];
-    frame->data[0] += s->x * s->max_step[0];
+    if (desc->flags & AV_PIX_FMT_FLAG_HWACCEL) {
+        frame->crop_top   += s->y;
+        frame->crop_left  += s->x;
+        frame->crop_bottom = frame->height - frame->crop_top - frame->crop_bottom - s->h;
+        frame->crop_right  = frame->width  - frame->crop_left - frame->crop_right - s->w;
+    } else {
+        frame->width  = s->w;
+        frame->height = s->h;
 
-    if (!(desc->flags & AV_PIX_FMT_FLAG_PAL || desc->flags & FF_PSEUDOPAL)) {
-        for (i = 1; i < 3; i ++) {
-            if (frame->data[i]) {
-                frame->data[i] += (s->y >> s->vsub) * frame->linesize[i];
-                frame->data[i] += (s->x * s->max_step[i]) >> s->hsub;
+        frame->data[0] += s->y * frame->linesize[0];
+        frame->data[0] += s->x * s->max_step[0];
+
+        if (!(desc->flags & AV_PIX_FMT_FLAG_PAL || desc->flags & FF_PSEUDOPAL)) {
+            for (i = 1; i < 3; i ++) {
+                if (frame->data[i]) {
+                    frame->data[i] += (s->y >> s->vsub) * frame->linesize[i];
+                    frame->data[i] += (s->x * s->max_step[i]) >> s->hsub;
+                }
             }
         }
-    }
 
-    /* alpha plane */
-    if (frame->data[3]) {
-        frame->data[3] += s->y * frame->linesize[3];
-        frame->data[3] += s->x * s->max_step[3];
+        /* alpha plane */
+        if (frame->data[3]) {
+            frame->data[3] += s->y * frame->linesize[3];
+            frame->data[3] += s->x * s->max_step[3];
+        }
     }
 
     return ff_filter_frame(link->dst->outputs[0], frame);
@@ -344,14 +370,15 @@
 
 #define OFFSET(x) offsetof(CropContext, x)
 #define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM
+#define TFLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_RUNTIME_PARAM
 
 static const AVOption crop_options[] = {
-    { "out_w",       "set the width crop area expression",   OFFSET(w_expr), AV_OPT_TYPE_STRING, {.str = "iw"}, CHAR_MIN, CHAR_MAX, FLAGS },
-    { "w",           "set the width crop area expression",   OFFSET(w_expr), AV_OPT_TYPE_STRING, {.str = "iw"}, CHAR_MIN, CHAR_MAX, FLAGS },
-    { "out_h",       "set the height crop area expression",  OFFSET(h_expr), AV_OPT_TYPE_STRING, {.str = "ih"}, CHAR_MIN, CHAR_MAX, FLAGS },
-    { "h",           "set the height crop area expression",  OFFSET(h_expr), AV_OPT_TYPE_STRING, {.str = "ih"}, CHAR_MIN, CHAR_MAX, FLAGS },
-    { "x",           "set the x crop area expression",       OFFSET(x_expr), AV_OPT_TYPE_STRING, {.str = "(in_w-out_w)/2"}, CHAR_MIN, CHAR_MAX, FLAGS },
-    { "y",           "set the y crop area expression",       OFFSET(y_expr), AV_OPT_TYPE_STRING, {.str = "(in_h-out_h)/2"}, CHAR_MIN, CHAR_MAX, FLAGS },
+    { "out_w",       "set the width crop area expression",   OFFSET(w_expr), AV_OPT_TYPE_STRING, {.str = "iw"}, 0, 0, TFLAGS },
+    { "w",           "set the width crop area expression",   OFFSET(w_expr), AV_OPT_TYPE_STRING, {.str = "iw"}, 0, 0, TFLAGS },
+    { "out_h",       "set the height crop area expression",  OFFSET(h_expr), AV_OPT_TYPE_STRING, {.str = "ih"}, 0, 0, TFLAGS },
+    { "h",           "set the height crop area expression",  OFFSET(h_expr), AV_OPT_TYPE_STRING, {.str = "ih"}, 0, 0, TFLAGS },
+    { "x",           "set the x crop area expression",       OFFSET(x_expr), AV_OPT_TYPE_STRING, {.str = "(in_w-out_w)/2"}, 0, 0, TFLAGS },
+    { "y",           "set the y crop area expression",       OFFSET(y_expr), AV_OPT_TYPE_STRING, {.str = "(in_h-out_h)/2"}, 0, 0, TFLAGS },
     { "keep_aspect", "keep aspect ratio",                    OFFSET(keep_aspect), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS },
     { "exact",       "do exact cropping",                    OFFSET(exact),  AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS },
     { NULL }
diff --git a/libavfilter/vf_datascope.c b/libavfilter/vf_datascope.c
index 6bcc18e..e83f04c 100644
--- a/libavfilter/vf_datascope.c
+++ b/libavfilter/vf_datascope.c
@@ -35,6 +35,7 @@
     int ow, oh;
     int x, y;
     int mode;
+    int dformat;
     int axis;
     float opacity;
 
@@ -54,6 +55,7 @@
 
 #define OFFSET(x) offsetof(DatascopeContext, x)
 #define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM
+#define FLAGSR AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_RUNTIME_PARAM
 
 static const AVOption datascope_options[] = {
     { "size", "set output size", OFFSET(ow),   AV_OPT_TYPE_IMAGE_SIZE, {.str="hd720"}, 0, 0, FLAGS },
@@ -66,6 +68,9 @@
     {   "color2", NULL, 0, AV_OPT_TYPE_CONST, {.i64=2}, 0, 0, FLAGS, "mode" },
     { "axis",    "draw column/row numbers", OFFSET(axis), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS },
     { "opacity", "set background opacity", OFFSET(opacity), AV_OPT_TYPE_FLOAT, {.dbl=0.75}, 0, 1, FLAGS },
+    { "format", "set display number format", OFFSET(dformat), AV_OPT_TYPE_INT, {.i64=0}, 0, 1, FLAGS, "format" },
+    {   "hex",  NULL, 0, AV_OPT_TYPE_CONST, {.i64=0}, 0, 0, FLAGS, "format" },
+    {   "dec",  NULL, 0, AV_OPT_TYPE_CONST, {.i64=1}, 0, 0, FLAGS, "format" },
     { NULL }
 };
 
@@ -179,9 +184,10 @@
     const int yoff = td->yoff;
     const int P = FFMAX(s->nb_planes, s->nb_comps);
     const int C = s->chars;
+    const int D = ((s->chars - s->dformat) >> 2) + s->dformat * 2;
     const int W = (outlink->w - xoff) / (C * 10);
     const int H = (outlink->h - yoff) / (P * 12);
-    const char *format[2] = {"%02X\n", "%04X\n"};
+    const char *format[4] = {"%02X\n", "%04X\n", "%03d\n", "%05d\n"};
     const int slice_start = (W * jobnr) / nb_jobs;
     const int slice_end = (W * (jobnr+1)) / nb_jobs;
     int x, y, p;
@@ -200,7 +206,7 @@
             for (p = 0; p < P; p++) {
                 char text[256];
 
-                snprintf(text, sizeof(text), format[C>>2], value[p]);
+                snprintf(text, sizeof(text), format[D], value[p]);
                 draw_text(&s->draw, out, &reverse, xoff + x * C * 10 + 2, yoff + y * P * 12 + p * 10 + 2, text, 0);
             }
         }
@@ -221,9 +227,10 @@
     const int yoff = td->yoff;
     const int P = FFMAX(s->nb_planes, s->nb_comps);
     const int C = s->chars;
+    const int D = ((s->chars - s->dformat) >> 2) + s->dformat * 2;
     const int W = (outlink->w - xoff) / (C * 10);
     const int H = (outlink->h - yoff) / (P * 12);
-    const char *format[2] = {"%02X\n", "%04X\n"};
+    const char *format[4] = {"%02X\n", "%04X\n", "%03d\n", "%05d\n"};
     const int slice_start = (W * jobnr) / nb_jobs;
     const int slice_end = (W * (jobnr+1)) / nb_jobs;
     int x, y, p;
@@ -238,7 +245,7 @@
             for (p = 0; p < P; p++) {
                 char text[256];
 
-                snprintf(text, sizeof(text), format[C>>2], value[p]);
+                snprintf(text, sizeof(text), format[D], value[p]);
                 draw_text(&s->draw, out, &color, xoff + x * C * 10 + 2, yoff + y * P * 12 + p * 10 + 2, text, 0);
             }
         }
@@ -259,9 +266,10 @@
     const int yoff = td->yoff;
     const int P = FFMAX(s->nb_planes, s->nb_comps);
     const int C = s->chars;
+    const int D = ((s->chars - s->dformat) >> 2) + s->dformat * 2;
     const int W = (outlink->w - xoff) / (C * 10);
     const int H = (outlink->h - yoff) / (P * 12);
-    const char *format[2] = {"%02X\n", "%04X\n"};
+    const char *format[4] = {"%02X\n", "%04X\n", "%03d\n", "%05d\n"};
     const int slice_start = (W * jobnr) / nb_jobs;
     const int slice_end = (W * (jobnr+1)) / nb_jobs;
     int x, y, p;
@@ -275,7 +283,7 @@
             for (p = 0; p < P; p++) {
                 char text[256];
 
-                snprintf(text, sizeof(text), format[C>>2], value[p]);
+                snprintf(text, sizeof(text), format[D], value[p]);
                 draw_text(&s->draw, out, &s->white, xoff + x * C * 10 + 2, yoff + y * P * 12 + p * 10 + 2, text, 0);
             }
         }
@@ -359,7 +367,7 @@
     ff_draw_color(&s->draw, &s->black,  (uint8_t[]){ 0, 0, 0, alpha} );
     ff_draw_color(&s->draw, &s->yellow, (uint8_t[]){ 255, 255, 0, 255} );
     ff_draw_color(&s->draw, &s->gray,   (uint8_t[]){ 77, 77, 77, 255} );
-    s->chars = (s->draw.desc->comp[0].depth + 7) / 8 * 2;
+    s->chars = (s->draw.desc->comp[0].depth + 7) / 8 * 2 + s->dformat;
     s->nb_comps = s->draw.desc->nb_components;
 
     switch (s->mode) {
@@ -720,19 +728,19 @@
 #define OOFFSET(x) offsetof(OscilloscopeContext, x)
 
 static const AVOption oscilloscope_options[] = {
-    { "x",  "set scope x position",    OOFFSET(xpos),       AV_OPT_TYPE_FLOAT, {.dbl=0.5}, 0, 1,  FLAGS },
-    { "y",  "set scope y position",    OOFFSET(ypos),       AV_OPT_TYPE_FLOAT, {.dbl=0.5}, 0, 1,  FLAGS },
-    { "s",  "set scope size",          OOFFSET(size),       AV_OPT_TYPE_FLOAT, {.dbl=0.8}, 0, 1,  FLAGS },
-    { "t",  "set scope tilt",          OOFFSET(tilt),       AV_OPT_TYPE_FLOAT, {.dbl=0.5}, 0, 1,  FLAGS },
-    { "o",  "set trace opacity",       OOFFSET(o),          AV_OPT_TYPE_FLOAT, {.dbl=0.8}, 0, 1,  FLAGS },
-    { "tx", "set trace x position",    OOFFSET(tx),         AV_OPT_TYPE_FLOAT, {.dbl=0.5}, 0, 1,  FLAGS },
-    { "ty", "set trace y position",    OOFFSET(ty),         AV_OPT_TYPE_FLOAT, {.dbl=0.9}, 0, 1,  FLAGS },
-    { "tw", "set trace width",         OOFFSET(twidth),     AV_OPT_TYPE_FLOAT, {.dbl=0.8},.1, 1,  FLAGS },
-    { "th", "set trace height",        OOFFSET(theight),    AV_OPT_TYPE_FLOAT, {.dbl=0.3},.1, 1,  FLAGS },
-    { "c",  "set components to trace", OOFFSET(components), AV_OPT_TYPE_INT,   {.i64=7},   0, 15, FLAGS },
-    { "g",  "draw trace grid",         OOFFSET(grid),       AV_OPT_TYPE_BOOL,  {.i64=1},   0, 1,  FLAGS },
-    { "st", "draw statistics",         OOFFSET(statistics), AV_OPT_TYPE_BOOL,  {.i64=1},   0, 1,  FLAGS },
-    { "sc", "draw scope",              OOFFSET(scope),      AV_OPT_TYPE_BOOL,  {.i64=1},   0, 1,  FLAGS },
+    { "x",  "set scope x position",    OOFFSET(xpos),       AV_OPT_TYPE_FLOAT, {.dbl=0.5}, 0, 1,  FLAGSR },
+    { "y",  "set scope y position",    OOFFSET(ypos),       AV_OPT_TYPE_FLOAT, {.dbl=0.5}, 0, 1,  FLAGSR },
+    { "s",  "set scope size",          OOFFSET(size),       AV_OPT_TYPE_FLOAT, {.dbl=0.8}, 0, 1,  FLAGSR },
+    { "t",  "set scope tilt",          OOFFSET(tilt),       AV_OPT_TYPE_FLOAT, {.dbl=0.5}, 0, 1,  FLAGSR },
+    { "o",  "set trace opacity",       OOFFSET(o),          AV_OPT_TYPE_FLOAT, {.dbl=0.8}, 0, 1,  FLAGSR },
+    { "tx", "set trace x position",    OOFFSET(tx),         AV_OPT_TYPE_FLOAT, {.dbl=0.5}, 0, 1,  FLAGSR },
+    { "ty", "set trace y position",    OOFFSET(ty),         AV_OPT_TYPE_FLOAT, {.dbl=0.9}, 0, 1,  FLAGSR },
+    { "tw", "set trace width",         OOFFSET(twidth),     AV_OPT_TYPE_FLOAT, {.dbl=0.8},.1, 1,  FLAGSR },
+    { "th", "set trace height",        OOFFSET(theight),    AV_OPT_TYPE_FLOAT, {.dbl=0.3},.1, 1,  FLAGSR },
+    { "c",  "set components to trace", OOFFSET(components), AV_OPT_TYPE_INT,   {.i64=7},   0, 15, FLAGSR },
+    { "g",  "draw trace grid",         OOFFSET(grid),       AV_OPT_TYPE_BOOL,  {.i64=1},   0, 1,  FLAGSR },
+    { "st", "draw statistics",         OOFFSET(statistics), AV_OPT_TYPE_BOOL,  {.i64=1},   0, 1,  FLAGSR },
+    { "sc", "draw scope",              OOFFSET(scope),      AV_OPT_TYPE_BOOL,  {.i64=1},   0, 1,  FLAGSR },
     { NULL }
 };
 
@@ -802,8 +810,8 @@
             if ((1 << c) & s->components) {
                 int x = i * s->width / s->nb_values;
                 int px = (i - 1) * s->width / s->nb_values;
-                int py = s->height - s->values[i-1].p[c] * s->height / 256;
-                int y = s->height - s->values[i].p[c] * s->height / 256;
+                int py = s->height - s->values[i-1].p[s->rgba_map[c]] * s->height / 256;
+                int y = s->height - s->values[i].p[s->rgba_map[c]] * s->height / 256;
 
                 draw_line(&s->draw, s->ox + x, s->oy + y, s->ox + px, s->oy + py, frame, s->colors[c]);
             }
@@ -821,8 +829,8 @@
             if ((1 << c) & s->components) {
                 int x = i * s->width / s->nb_values;
                 int px = (i - 1) * s->width / s->nb_values;
-                int py = s->height - s->values[i-1].p[c] * s->height / s->max;
-                int y = s->height - s->values[i].p[c] * s->height / s->max;
+                int py = s->height - s->values[i-1].p[s->rgba_map[c]] * s->height / s->max;
+                int y = s->height - s->values[i].p[s->rgba_map[c]] * s->height / s->max;
 
                 draw_line(&s->draw, s->ox + x, s->oy + y, s->ox + px, s->oy + py, frame, s->colors[c]);
             }
@@ -830,15 +838,36 @@
     }
 }
 
-static int oscilloscope_config_input(AVFilterLink *inlink)
+static void update_oscilloscope(AVFilterContext *ctx)
 {
-    OscilloscopeContext *s = inlink->dst->priv;
+    OscilloscopeContext *s = ctx->priv;
+    AVFilterLink *inlink = ctx->inputs[0];
     int cx, cy, size;
     double tilt;
 
+    ff_draw_color(&s->draw, &s->dark,    (uint8_t[]){   0,   0,   0, s->o * 255} );
+    s->height = s->theight * inlink->h;
+    s->width = s->twidth * inlink->w;
+    size = hypot(inlink->w, inlink->h);
+    size *= s->size;
+    tilt  = (s->tilt - 0.5) * M_PI;
+    cx = s->xpos * (inlink->w - 1);
+    cy = s->ypos * (inlink->h - 1);
+    s->x1 = cx - size / 2.0 * cos(tilt);
+    s->x2 = cx + size / 2.0 * cos(tilt);
+    s->y1 = cy - size / 2.0 * sin(tilt);
+    s->y2 = cy + size / 2.0 * sin(tilt);
+    s->ox = (inlink->w - s->width) * s->tx;
+    s->oy = (inlink->h - s->height) * s->ty;
+}
+
+static int oscilloscope_config_input(AVFilterLink *inlink)
+{
+    OscilloscopeContext *s = inlink->dst->priv;
+    int size;
+
     s->nb_planes = av_pix_fmt_count_planes(inlink->format);
     ff_draw_init(&s->draw, inlink->format, 0);
-    ff_draw_color(&s->draw, &s->dark,    (uint8_t[]){   0,   0,   0, s->o * 255} );
     ff_draw_color(&s->draw, &s->black,   (uint8_t[]){   0,   0,   0, 255} );
     ff_draw_color(&s->draw, &s->white,   (uint8_t[]){ 255, 255, 255, 255} );
     ff_draw_color(&s->draw, &s->green,   (uint8_t[]){   0, 255,   0, 255} );
@@ -876,24 +905,13 @@
     }
 
     s->max = (1 << s->draw.desc->comp[0].depth);
-    cx = s->xpos * (inlink->w - 1);
-    cy = s->ypos * (inlink->h - 1);
-    s->height = s->theight * inlink->h;
-    s->width = s->twidth * inlink->w;
     size = hypot(inlink->w, inlink->h);
 
     s->values = av_calloc(size, sizeof(*s->values));
     if (!s->values)
         return AVERROR(ENOMEM);
 
-    size *= s->size;
-    tilt  = (s->tilt - 0.5) * M_PI;
-    s->x1 = cx - size / 2.0 * cos(tilt);
-    s->x2 = cx + size / 2.0 * cos(tilt);
-    s->y1 = cy - size / 2.0 * sin(tilt);
-    s->y2 = cy + size / 2.0 * sin(tilt);
-    s->ox = (inlink->w - s->width) * s->tx;
-    s->oy = (inlink->h - s->height) * s->ty;
+    update_oscilloscope(inlink->dst);
 
     return 0;
 }
@@ -973,7 +991,7 @@
                        frame->width, frame->height,
                        s->ox, s->oy, s->width, s->height + 20 * s->statistics);
 
-    if (s->grid) {
+    if (s->grid && outlink->h >= 10) {
         ff_fill_rectangle(&s->draw, &s->gray, frame->data, frame->linesize,
                           s->ox, s->oy, s->width - 1, 1);
 
@@ -996,9 +1014,9 @@
     for (i = 0; i < s->nb_values; i++) {
         for (c = 0; c < s->nb_comps; c++) {
             if ((1 << c) & s->components) {
-                max[c] = FFMAX(max[c], s->values[i].p[c]);
-                min[c] = FFMIN(min[c], s->values[i].p[c]);
-                average[c] += s->values[i].p[c];
+                max[c] = FFMAX(max[c], s->values[i].p[s->rgba_map[c]]);
+                min[c] = FFMIN(min[c], s->values[i].p[s->rgba_map[c]]);
+                average[c] += s->values[i].p[s->rgba_map[c]];
             }
         }
     }
@@ -1013,7 +1031,7 @@
                 const char yuva[4] = { 'Y', 'U', 'V', 'A' };
                 char text[128];
 
-                snprintf(text, sizeof(text), "%c avg:%.1f min:%d max:%d\n", s->is_rgb ? rgba[c] : yuva[c], average[s->rgba_map[c]], min[s->rgba_map[c]], max[s->rgba_map[c]]);
+                snprintf(text, sizeof(text), "%c avg:%.1f min:%d max:%d\n", s->is_rgb ? rgba[c] : yuva[c], average[c], min[c], max[c]);
                 draw_text(&s->draw, frame, &s->white, s->ox +  2 + 280 * i++, s->oy + s->height + 4, text, 0);
             }
         }
@@ -1022,6 +1040,20 @@
     return ff_filter_frame(outlink, frame);
 }
 
+static int oscilloscope_process_command(AVFilterContext *ctx, const char *cmd, const char *args,
+                                        char *res, int res_len, int flags)
+{
+    int ret;
+
+    ret = ff_filter_process_command(ctx, cmd, args, res, res_len, flags);
+    if (ret < 0)
+        return ret;
+
+    update_oscilloscope(ctx);
+
+    return 0;
+}
+
 static const AVFilterPad oscilloscope_inputs[] = {
     {
         .name           = "default",
@@ -1051,4 +1083,5 @@
     .inputs        = oscilloscope_inputs,
     .outputs       = oscilloscope_outputs,
     .flags         = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC,
+    .process_command = oscilloscope_process_command,
 };
diff --git a/libavfilter/vf_deband.c b/libavfilter/vf_deband.c
index 713e80b..330792f 100644
--- a/libavfilter/vf_deband.c
+++ b/libavfilter/vf_deband.c
@@ -74,7 +74,8 @@
     DebandContext *s = ctx->priv;
 
     static const enum AVPixelFormat pix_fmts[] = {
-        AV_PIX_FMT_GRAY8, AV_PIX_FMT_GRAY16,
+        AV_PIX_FMT_GRAY8, AV_PIX_FMT_GRAY9, AV_PIX_FMT_GRAY10,
+        AV_PIX_FMT_GRAY12, AV_PIX_FMT_GRAY14, AV_PIX_FMT_GRAY16,
         AV_PIX_FMT_YUV444P,  AV_PIX_FMT_YUV422P,  AV_PIX_FMT_YUV420P,
         AV_PIX_FMT_YUV411P,  AV_PIX_FMT_YUV410P,  AV_PIX_FMT_YUV440P,
         AV_PIX_FMT_YUVJ444P, AV_PIX_FMT_YUVJ422P, AV_PIX_FMT_YUVJ420P,
diff --git a/libavfilter/vf_deblock.c b/libavfilter/vf_deblock.c
index 62e3248d..77c681e 100644
--- a/libavfilter/vf_deblock.c
+++ b/libavfilter/vf_deblock.c
@@ -76,6 +76,7 @@
         AV_PIX_FMT_YUV420P16, AV_PIX_FMT_YUV422P16, AV_PIX_FMT_YUV444P16,
         AV_PIX_FMT_YUVA420P9, AV_PIX_FMT_YUVA422P9, AV_PIX_FMT_YUVA444P9,
         AV_PIX_FMT_YUVA420P10, AV_PIX_FMT_YUVA422P10, AV_PIX_FMT_YUVA444P10,
+        AV_PIX_FMT_YUVA422P12, AV_PIX_FMT_YUVA444P12,
         AV_PIX_FMT_YUVA420P16, AV_PIX_FMT_YUVA422P16, AV_PIX_FMT_YUVA444P16,
         AV_PIX_FMT_GBRP, AV_PIX_FMT_GBRP9, AV_PIX_FMT_GBRP10,
         AV_PIX_FMT_GBRP12, AV_PIX_FMT_GBRP14, AV_PIX_FMT_GBRP16,
diff --git a/libavfilter/vf_decimate.c b/libavfilter/vf_decimate.c
index 53347c7..88a8b38 100644
--- a/libavfilter/vf_decimate.c
+++ b/libavfilter/vf_decimate.c
@@ -217,11 +217,13 @@
             av_frame_free(&dm->queue[i].frame);
         } else {
             AVFrame *frame = dm->queue[i].frame;
+            dm->queue[i].frame = NULL;
             if (frame->pts != AV_NOPTS_VALUE && dm->start_pts == AV_NOPTS_VALUE)
                 dm->start_pts = frame->pts;
             if (dm->ppsrc) {
                 av_frame_free(&frame);
                 frame = dm->clean_src[i];
+                dm->clean_src[i] = NULL;
             }
             frame->pts = av_rescale_q(outlink->frame_count_in, dm->ts_unit, (AVRational){1,1}) +
                          (dm->start_pts == AV_NOPTS_VALUE ? 0 : dm->start_pts);
@@ -314,7 +316,15 @@
 
     av_frame_free(&dm->last);
     av_freep(&dm->bdiffs);
+    if (dm->queue) {
+        for (i = 0; i < dm->cycle; i++)
+            av_frame_free(&dm->queue[i].frame);
+    }
     av_freep(&dm->queue);
+    if (dm->clean_src) {
+        for (i = 0; i < dm->cycle; i++)
+            av_frame_free(&dm->clean_src[i]);
+    }
     av_freep(&dm->clean_src);
     for (i = 0; i < ctx->nb_inputs; i++)
         av_freep(&ctx->input_pads[i].name);
diff --git a/libavfilter/vf_dedot.c b/libavfilter/vf_dedot.c
new file mode 100644
index 0000000..993ac8f
--- /dev/null
+++ b/libavfilter/vf_dedot.c
@@ -0,0 +1,415 @@
+/*
+ * Copyright (c) 2018 Paul B Mahol
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "libavutil/imgutils.h"
+#include "libavutil/opt.h"
+#include "libavutil/pixdesc.h"
+
+#include "avfilter.h"
+#include "filters.h"
+#include "formats.h"
+#include "internal.h"
+#include "video.h"
+
+typedef struct DedotContext {
+    const AVClass *class;
+    int m;
+    float lt;
+    float tl;
+    float tc;
+    float ct;
+
+    const AVPixFmtDescriptor *desc;
+    int depth;
+    int max;
+    int luma2d;
+    int lumaT;
+    int chromaT1;
+    int chromaT2;
+
+    int eof;
+    int eof_frames;
+    int nb_planes;
+    int planewidth[4];
+    int planeheight[4];
+
+    AVFrame *frames[5];
+
+    int (*dedotcrawl)(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs);
+    int (*derainbow)(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs);
+} DedotContext;
+
+static int query_formats(AVFilterContext *ctx)
+{
+    static const enum AVPixelFormat pixel_fmts[] = {
+        AV_PIX_FMT_YUVA444P, AV_PIX_FMT_YUV444P, AV_PIX_FMT_YUV440P,
+        AV_PIX_FMT_YUVJ444P, AV_PIX_FMT_YUVJ440P,
+        AV_PIX_FMT_YUVA422P, AV_PIX_FMT_YUV422P, AV_PIX_FMT_YUVA420P, AV_PIX_FMT_YUV420P,
+        AV_PIX_FMT_YUVJ422P, AV_PIX_FMT_YUVJ420P,
+        AV_PIX_FMT_YUVJ411P, AV_PIX_FMT_YUV411P, AV_PIX_FMT_YUV410P,
+        AV_PIX_FMT_YUV420P9, AV_PIX_FMT_YUV422P9, AV_PIX_FMT_YUV444P9,
+        AV_PIX_FMT_YUV420P10, AV_PIX_FMT_YUV422P10, AV_PIX_FMT_YUV444P10,
+        AV_PIX_FMT_YUV420P12, AV_PIX_FMT_YUV422P12, AV_PIX_FMT_YUV444P12, AV_PIX_FMT_YUV440P12,
+        AV_PIX_FMT_YUV420P14, AV_PIX_FMT_YUV422P14, AV_PIX_FMT_YUV444P14,
+        AV_PIX_FMT_YUV420P16, AV_PIX_FMT_YUV422P16, AV_PIX_FMT_YUV444P16,
+        AV_PIX_FMT_YUVA420P9, AV_PIX_FMT_YUVA422P9, AV_PIX_FMT_YUVA444P9,
+        AV_PIX_FMT_YUVA420P10, AV_PIX_FMT_YUVA422P10, AV_PIX_FMT_YUVA444P10,
+        AV_PIX_FMT_YUVA422P12, AV_PIX_FMT_YUVA444P12,
+        AV_PIX_FMT_YUVA420P16, AV_PIX_FMT_YUVA422P16, AV_PIX_FMT_YUVA444P16,
+        AV_PIX_FMT_NONE
+    };
+    AVFilterFormats *formats = ff_make_format_list(pixel_fmts);
+    if (!formats)
+        return AVERROR(ENOMEM);
+    return ff_set_common_formats(ctx, formats);
+}
+
+#define DEFINE_DEDOTCRAWL(name, type, div)                       \
+static int dedotcrawl##name(AVFilterContext *ctx, void *arg,     \
+                            int jobnr, int nb_jobs)              \
+{                                                                \
+    DedotContext *s = ctx->priv;                                 \
+    AVFrame *out = arg;                                          \
+    int src_linesize = s->frames[2]->linesize[0] / div;          \
+    int dst_linesize = out->linesize[0] / div;                   \
+    int p0_linesize = s->frames[0]->linesize[0] / div;           \
+    int p1_linesize = s->frames[1]->linesize[0] / div;           \
+    int p3_linesize = s->frames[3]->linesize[0] / div;           \
+    int p4_linesize = s->frames[4]->linesize[0] / div;           \
+    const int h = s->planeheight[0];                             \
+    int slice_start = (h * jobnr) / nb_jobs;                     \
+    int slice_end = (h * (jobnr+1)) / nb_jobs;                   \
+    type *p0 = (type *)s->frames[0]->data[0];                    \
+    type *p1 = (type *)s->frames[1]->data[0];                    \
+    type *p3 = (type *)s->frames[3]->data[0];                    \
+    type *p4 = (type *)s->frames[4]->data[0];                    \
+    type *src = (type *)s->frames[2]->data[0];                   \
+    type *dst = (type *)out->data[0];                            \
+    const int luma2d = s->luma2d;                                \
+    const int lumaT = s->lumaT;                                  \
+                                                                 \
+    if (!slice_start) {                                          \
+        slice_start++;                                           \
+    }                                                            \
+    p0 += p0_linesize * slice_start;                             \
+    p1 += p1_linesize * slice_start;                             \
+    p3 += p3_linesize * slice_start;                             \
+    p4 += p4_linesize * slice_start;                             \
+    src += src_linesize * slice_start;                           \
+    dst += dst_linesize * slice_start;                           \
+    if (slice_end == h) {                                        \
+        slice_end--;                                             \
+    }                                                            \
+    for (int y = slice_start; y < slice_end; y++) {              \
+        for (int x = 1; x < s->planewidth[0] - 1; x++) {         \
+            int above = src[x - src_linesize];                   \
+            int bellow = src[x + src_linesize];                  \
+            int cur = src[x];                                    \
+            int left = src[x - 1];                               \
+            int right = src[x + 1];                              \
+                                                                 \
+            if (FFABS(above + bellow - 2 * cur) <= luma2d &&     \
+                FFABS(left + right - 2 * cur) <= luma2d)         \
+                continue;                                        \
+                                                                 \
+            if (FFABS(cur - p0[x]) <= lumaT &&                   \
+                FFABS(cur - p4[x]) <= lumaT &&                   \
+                FFABS(p1[x] - p3[x]) <= lumaT) {                 \
+                int diff1 = FFABS(cur - p1[x]);                  \
+                int diff2 = FFABS(cur - p3[x]);                  \
+                                                                 \
+                if (diff1 < diff2)                               \
+                    dst[x] = (src[x] + p1[x] + 1) >> 1;          \
+                else                                             \
+                    dst[x] = (src[x] + p3[x] + 1) >> 1;          \
+            }                                                    \
+        }                                                        \
+                                                                 \
+        dst += dst_linesize;                                     \
+        src += src_linesize;                                     \
+        p0 += p0_linesize;                                       \
+        p1 += p1_linesize;                                       \
+        p3 += p3_linesize;                                       \
+        p4 += p4_linesize;                                       \
+    }                                                            \
+    return 0;                                                    \
+}
+
+DEFINE_DEDOTCRAWL(8, uint8_t, 1)
+DEFINE_DEDOTCRAWL(16, uint16_t, 2)
+
+typedef struct ThreadData {
+    AVFrame *out;
+    int plane;
+} ThreadData;
+
+#define DEFINE_DERAINBOW(name, type, div)                    \
+static int derainbow##name(AVFilterContext *ctx, void *arg,  \
+                           int jobnr, int nb_jobs)           \
+{                                                            \
+    DedotContext *s = ctx->priv;                             \
+    ThreadData *td = arg;                                    \
+    AVFrame *out = td->out;                                  \
+    const int plane = td->plane;                             \
+    const int h = s->planeheight[plane];                     \
+    int slice_start = (h * jobnr) / nb_jobs;                 \
+    int slice_end = (h * (jobnr+1)) / nb_jobs;               \
+    int src_linesize = s->frames[2]->linesize[plane] / div;  \
+    int dst_linesize = out->linesize[plane] / div;           \
+    int p0_linesize = s->frames[0]->linesize[plane] / div;   \
+    int p1_linesize = s->frames[1]->linesize[plane] / div;   \
+    int p3_linesize = s->frames[3]->linesize[plane] / div;   \
+    int p4_linesize = s->frames[4]->linesize[plane] / div;   \
+    type *p0 = (type *)s->frames[0]->data[plane];            \
+    type *p1 = (type *)s->frames[1]->data[plane];            \
+    type *p3 = (type *)s->frames[3]->data[plane];            \
+    type *p4 = (type *)s->frames[4]->data[plane];            \
+    type *src = (type *)s->frames[2]->data[plane];           \
+    type *dst = (type *)out->data[plane];                    \
+    const int chromaT1 = s->chromaT1;                        \
+    const int chromaT2 = s->chromaT2;                        \
+                                                             \
+    p0 += slice_start * p0_linesize;                         \
+    p1 += slice_start * p1_linesize;                         \
+    p3 += slice_start * p3_linesize;                         \
+    p4 += slice_start * p4_linesize;                         \
+    src += slice_start * src_linesize;                       \
+    dst += slice_start * dst_linesize;                       \
+    for (int y = slice_start; y < slice_end; y++) {          \
+        for (int x = 0; x < s->planewidth[plane]; x++) {     \
+            int cur = src[x];                                \
+                                                             \
+            if (FFABS(cur - p0[x]) <= chromaT1 &&            \
+                FFABS(cur - p4[x]) <= chromaT1 &&            \
+                FFABS(p1[x] - p3[x]) <= chromaT1 &&          \
+                FFABS(cur - p1[x]) > chromaT2 &&             \
+                FFABS(cur - p3[x]) > chromaT2) {             \
+                int diff1 = FFABS(cur - p1[x]);              \
+                int diff2 = FFABS(cur - p3[x]);              \
+                                                             \
+                if (diff1 < diff2)                           \
+                    dst[x] = (src[x] + p1[x] + 1) >> 1;      \
+                else                                         \
+                    dst[x] = (src[x] + p3[x] + 1) >> 1;      \
+            }                                                \
+        }                                                    \
+                                                             \
+        dst += dst_linesize;                                 \
+        src += src_linesize;                                 \
+        p0 += p0_linesize;                                   \
+        p1 += p1_linesize;                                   \
+        p3 += p3_linesize;                                   \
+        p4 += p4_linesize;                                   \
+    }                                                        \
+    return 0;                                                \
+}
+
+DEFINE_DERAINBOW(8, uint8_t, 1)
+DEFINE_DERAINBOW(16, uint16_t, 2)
+
+static int config_output(AVFilterLink *outlink)
+{
+    AVFilterContext *ctx = outlink->src;
+    DedotContext *s = ctx->priv;
+    AVFilterLink *inlink = ctx->inputs[0];
+
+    s->desc = av_pix_fmt_desc_get(outlink->format);
+    if (!s->desc)
+        return AVERROR_BUG;
+    s->nb_planes = av_pix_fmt_count_planes(outlink->format);
+    s->depth = s->desc->comp[0].depth;
+    s->max = (1 << s->depth) - 1;
+    s->luma2d = s->lt * s->max;
+    s->lumaT = s->tl * s->max;
+    s->chromaT1 = s->tc * s->max;
+    s->chromaT2 = s->ct * s->max;
+
+    s->planewidth[1] = s->planewidth[2] = AV_CEIL_RSHIFT(inlink->w, s->desc->log2_chroma_w);
+    s->planewidth[0] = s->planewidth[3] = inlink->w;
+
+    s->planeheight[1] = s->planeheight[2] = AV_CEIL_RSHIFT(inlink->h, s->desc->log2_chroma_h);
+    s->planeheight[0] = s->planeheight[3] = inlink->h;
+
+    if (s->depth <= 8) {
+        s->dedotcrawl = dedotcrawl8;
+        s->derainbow = derainbow8;
+    } else {
+        s->dedotcrawl = dedotcrawl16;
+        s->derainbow = derainbow16;
+    }
+
+    return 0;
+}
+
+static int activate(AVFilterContext *ctx)
+{
+    AVFilterLink *inlink = ctx->inputs[0];
+    AVFilterLink *outlink = ctx->outputs[0];
+    DedotContext *s = ctx->priv;
+    AVFrame *frame = NULL;
+    int64_t pts;
+    int status;
+    int ret = 0;
+
+    FF_FILTER_FORWARD_STATUS_BACK(outlink, inlink);
+
+    if (s->eof == 0) {
+        ret = ff_inlink_consume_frame(inlink, &frame);
+        if (ret < 0)
+            return ret;
+    }
+    if (frame || s->eof_frames > 0) {
+        AVFrame *out = NULL;
+
+        if (frame) {
+            for (int i = 2; i < 5; i++) {
+                if (!s->frames[i])
+                    s->frames[i] = av_frame_clone(frame);
+            }
+            av_frame_free(&frame);
+        } else if (s->frames[3]) {
+            s->eof_frames--;
+            s->frames[4] = av_frame_clone(s->frames[3]);
+        }
+
+        if (s->frames[0] &&
+            s->frames[1] &&
+            s->frames[2] &&
+            s->frames[3] &&
+            s->frames[4]) {
+            out = av_frame_clone(s->frames[2]);
+            if (out && !ctx->is_disabled) {
+                ret = av_frame_make_writable(out);
+                if (ret >= 0) {
+                    if (s->m & 1)
+                        ctx->internal->execute(ctx, s->dedotcrawl, out, NULL,
+                                               FFMIN(s->planeheight[0],
+                                               ff_filter_get_nb_threads(ctx)));
+                    if (s->m & 2) {
+                        ThreadData td;
+                        td.out = out; td.plane = 1;
+                        ctx->internal->execute(ctx, s->derainbow, &td, NULL,
+                                               FFMIN(s->planeheight[1],
+                                               ff_filter_get_nb_threads(ctx)));
+                        td.plane = 2;
+                        ctx->internal->execute(ctx, s->derainbow, &td, NULL,
+                                               FFMIN(s->planeheight[2],
+                                               ff_filter_get_nb_threads(ctx)));
+                    }
+                } else
+                    av_frame_free(&out);
+            } else if (!out) {
+                ret = AVERROR(ENOMEM);
+            }
+        }
+
+        av_frame_free(&s->frames[0]);
+        s->frames[0] = s->frames[1];
+        s->frames[1] = s->frames[2];
+        s->frames[2] = s->frames[3];
+        s->frames[3] = s->frames[4];
+        s->frames[4] = NULL;
+
+        if (ret < 0)
+            return ret;
+        if (out)
+            return ff_filter_frame(outlink, out);
+    }
+
+    if (s->eof) {
+        if (s->eof_frames <= 0) {
+            ff_outlink_set_status(outlink, AVERROR_EOF, s->frames[2]->pts);
+        } else {
+            ff_filter_set_ready(ctx, 10);
+        }
+        return 0;
+    }
+
+    if (!s->eof && ff_inlink_acknowledge_status(inlink, &status, &pts)) {
+        if (status == AVERROR_EOF) {
+            s->eof = 1;
+            s->eof_frames = !!s->frames[0] + !!s->frames[1];
+            if (s->eof_frames <= 0) {
+                ff_outlink_set_status(outlink, AVERROR_EOF, pts);
+                return 0;
+            }
+            ff_filter_set_ready(ctx, 10);
+            return 0;
+        }
+    }
+
+    FF_FILTER_FORWARD_WANTED(outlink, inlink);
+
+    return FFERROR_NOT_READY;
+}
+
+static av_cold void uninit(AVFilterContext *ctx)
+{
+    DedotContext *s = ctx->priv;
+
+    for (int i = 0; i < 5; i++)
+        av_frame_free(&s->frames[i]);
+}
+
+#define OFFSET(x) offsetof(DedotContext, x)
+#define FLAGS AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_FILTERING_PARAM
+
+static const AVOption dedot_options[] = {
+    { "m",   "set filtering mode",                          OFFSET( m), AV_OPT_TYPE_FLAGS, {.i64=3},    0, 3, FLAGS, "m" },
+    { "dotcrawl",                                           0,       0, AV_OPT_TYPE_CONST, {.i64=1},    0, 0, FLAGS, "m" },
+    { "rainbows",                                           0,       0, AV_OPT_TYPE_CONST, {.i64=2},    0, 0, FLAGS, "m" },
+    { "lt",  "set spatial luma threshold",                  OFFSET(lt), AV_OPT_TYPE_FLOAT, {.dbl=.079}, 0, 1, FLAGS },
+    { "tl",  "set tolerance for temporal luma",             OFFSET(tl), AV_OPT_TYPE_FLOAT, {.dbl=.079}, 0, 1, FLAGS },
+    { "tc",  "set tolerance for chroma temporal variation", OFFSET(tc), AV_OPT_TYPE_FLOAT, {.dbl=.058}, 0, 1, FLAGS },
+    { "ct",  "set temporal chroma threshold",               OFFSET(ct), AV_OPT_TYPE_FLOAT, {.dbl=.019}, 0, 1, FLAGS },
+    { NULL },
+};
+
+static const AVFilterPad inputs[] = {
+    {
+        .name           = "default",
+        .type           = AVMEDIA_TYPE_VIDEO,
+    },
+    { NULL }
+};
+
+static const AVFilterPad outputs[] = {
+    {
+        .name          = "default",
+        .type          = AVMEDIA_TYPE_VIDEO,
+        .config_props  = config_output,
+    },
+    { NULL }
+};
+
+AVFILTER_DEFINE_CLASS(dedot);
+
+AVFilter ff_vf_dedot = {
+    .name          = "dedot",
+    .description   = NULL_IF_CONFIG_SMALL("Reduce cross-luminance and cross-color."),
+    .priv_size     = sizeof(DedotContext),
+    .priv_class    = &dedot_class,
+    .query_formats = query_formats,
+    .activate      = activate,
+    .uninit        = uninit,
+    .inputs        = inputs,
+    .outputs       = outputs,
+    .flags         = AVFILTER_FLAG_SUPPORT_TIMELINE_INTERNAL | AVFILTER_FLAG_SLICE_THREADS,
+};
diff --git a/libavfilter/vf_deflicker.c b/libavfilter/vf_deflicker.c
index b038b97..544672d 100644
--- a/libavfilter/vf_deflicker.c
+++ b/libavfilter/vf_deflicker.c
@@ -109,6 +109,10 @@
         AV_PIX_FMT_YUV440P12,
         AV_PIX_FMT_YUV444P14, AV_PIX_FMT_YUV422P14, AV_PIX_FMT_YUV420P14,
         AV_PIX_FMT_YUV420P16, AV_PIX_FMT_YUV422P16, AV_PIX_FMT_YUV444P16,
+        AV_PIX_FMT_YUVA420P,  AV_PIX_FMT_YUVA422P,   AV_PIX_FMT_YUVA444P,
+        AV_PIX_FMT_YUVA444P9, AV_PIX_FMT_YUVA444P10, AV_PIX_FMT_YUVA444P12, AV_PIX_FMT_YUVA444P16,
+        AV_PIX_FMT_YUVA422P9, AV_PIX_FMT_YUVA422P10, AV_PIX_FMT_YUVA422P12, AV_PIX_FMT_YUVA422P16,
+        AV_PIX_FMT_YUVA420P9, AV_PIX_FMT_YUVA420P10, AV_PIX_FMT_YUVA420P16,
         AV_PIX_FMT_NONE
     };
     AVFilterFormats *formats = ff_make_format_list(pixel_fmts);
@@ -420,7 +424,10 @@
 
     ret = ff_request_frame(ctx->inputs[0]);
     if (ret == AVERROR_EOF && s->available > 0) {
-        AVFrame *buf = av_frame_clone(ff_bufqueue_peek(&s->q, s->size - 1));
+        AVFrame *buf = ff_bufqueue_peek(&s->q, s->available - 1);
+        if (!buf)
+            return AVERROR(ENOMEM);
+        buf = av_frame_clone(buf);
         if (!buf)
             return AVERROR(ENOMEM);
 
diff --git a/libavfilter/vf_deinterlace_qsv.c b/libavfilter/vf_deinterlace_qsv.c
index d6b02e9..80217c8 100644
--- a/libavfilter/vf_deinterlace_qsv.c
+++ b/libavfilter/vf_deinterlace_qsv.c
@@ -83,7 +83,7 @@
     int mode;
 } QSVDeintContext;
 
-static void qsvdeint_uninit(AVFilterContext *ctx)
+static av_cold void qsvdeint_uninit(AVFilterContext *ctx)
 {
     QSVDeintContext *s = ctx->priv;
     QSVFrame *cur;
@@ -419,9 +419,11 @@
     qf->surface.Info.PicStruct = !qf->frame->interlaced_frame ? MFX_PICSTRUCT_PROGRESSIVE :
                                  (qf->frame->top_field_first ? MFX_PICSTRUCT_FIELD_TFF :
                                                            MFX_PICSTRUCT_FIELD_BFF);
-    if (qf->frame->repeat_pict == 1)
+    if (qf->frame->repeat_pict == 1) {
         qf->surface.Info.PicStruct |= MFX_PICSTRUCT_FIELD_REPEATED;
-    else if (qf->frame->repeat_pict == 2)
+        qf->surface.Info.PicStruct |= qf->frame->top_field_first ? MFX_PICSTRUCT_FIELD_TFF :
+                                                            MFX_PICSTRUCT_FIELD_BFF;
+    } else if (qf->frame->repeat_pict == 2)
         qf->surface.Info.PicStruct |= MFX_PICSTRUCT_FRAME_DOUBLING;
     else if (qf->frame->repeat_pict == 4)
         qf->surface.Info.PicStruct |= MFX_PICSTRUCT_FRAME_TRIPLING;
diff --git a/libavfilter/vf_deinterlace_vaapi.c b/libavfilter/vf_deinterlace_vaapi.c
index f7a262d..71809eb 100644
--- a/libavfilter/vf_deinterlace_vaapi.c
+++ b/libavfilter/vf_deinterlace_vaapi.c
@@ -113,6 +113,7 @@
             av_log(avctx, AV_LOG_ERROR, "Deinterlacing mode %d (%s) is "
                    "not supported.\n", ctx->mode,
                    deint_vaapi_mode_name(ctx->mode));
+            return AVERROR(EINVAL);
         }
     }
 
@@ -180,12 +181,11 @@
     VAAPIVPPContext *vpp_ctx = avctx->priv;
     DeintVAAPIContext *ctx   = avctx->priv;
     AVFrame *output_frame    = NULL;
-    VASurfaceID input_surface, output_surface;
+    VASurfaceID input_surface;
     VASurfaceID backward_references[MAX_REFERENCES];
     VASurfaceID forward_references[MAX_REFERENCES];
     VAProcPipelineParameterBuffer params;
     VAProcFilterParameterBufferDeinterlacing *filter_params;
-    VARectangle input_region;
     VAStatus vas;
     void *filter_params_addr = NULL;
     int err, i, field, current_frame_index;
@@ -237,30 +237,14 @@
             goto fail;
         }
 
-        output_surface = (VASurfaceID)(uintptr_t)output_frame->data[3];
-        av_log(avctx, AV_LOG_DEBUG, "Using surface %#x for "
-               "deinterlace output.\n", output_surface);
+        err = av_frame_copy_props(output_frame, input_frame);
+        if (err < 0)
+            goto fail;
 
-        memset(&params, 0, sizeof(params));
-
-        input_region = (VARectangle) {
-            .x      = 0,
-            .y      = 0,
-            .width  = input_frame->width,
-            .height = input_frame->height,
-        };
-
-        params.surface = input_surface;
-        params.surface_region = &input_region;
-        params.surface_color_standard =
-            ff_vaapi_vpp_colour_standard(input_frame->colorspace);
-
-        params.output_region = NULL;
-        params.output_background_color = 0xff000000;
-        params.output_color_standard = params.surface_color_standard;
-
-        params.pipeline_flags = 0;
-        params.filter_flags   = VA_FRAME_PICTURE;
+        err = ff_vaapi_vpp_init_params(avctx, &params,
+                                       input_frame, output_frame);
+        if (err < 0)
+            goto fail;
 
         if (!ctx->auto_enable || input_frame->interlaced_frame) {
             vas = vaMapBuffer(vpp_ctx->hwctx->display, vpp_ctx->filter_buffers[0],
@@ -300,11 +284,7 @@
             params.num_filters = 0;
         }
 
-        err = ff_vaapi_vpp_render_picture(avctx, &params, output_surface);
-        if (err < 0)
-            goto fail;
-
-        err = av_frame_copy_props(output_frame, input_frame);
+        err = ff_vaapi_vpp_render_picture(avctx, &params, output_frame);
         if (err < 0)
             goto fail;
 
diff --git a/libavfilter/vf_derain.c b/libavfilter/vf_derain.c
new file mode 100644
index 0000000..7432260
--- /dev/null
+++ b/libavfilter/vf_derain.c
@@ -0,0 +1,212 @@
+/*
+ * Copyright (c) 2019 Xuewei Meng
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file
+ * Filter implementing image derain filter using deep convolutional networks.
+ * http://openaccess.thecvf.com/content_ECCV_2018/html/Xia_Li_Recurrent_Squeeze-and-Excitation_Context_ECCV_2018_paper.html
+ */
+
+#include "libavformat/avio.h"
+#include "libavutil/opt.h"
+#include "avfilter.h"
+#include "dnn_interface.h"
+#include "formats.h"
+#include "internal.h"
+
+typedef struct DRContext {
+    const AVClass *class;
+
+    int                filter_type;
+    char              *model_filename;
+    DNNBackendType     backend_type;
+    DNNModule         *dnn_module;
+    DNNModel          *model;
+    DNNData            input;
+    DNNData            output;
+} DRContext;
+
+#define CLIP(x, min, max) (x < min ? min : (x > max ? max : x))
+#define OFFSET(x) offsetof(DRContext, x)
+#define FLAGS AV_OPT_FLAG_FILTERING_PARAM | AV_OPT_FLAG_VIDEO_PARAM
+static const AVOption derain_options[] = {
+    { "filter_type", "filter type(derain/dehaze)",  OFFSET(filter_type),    AV_OPT_TYPE_INT,    { .i64 = 0 },    0, 1, FLAGS, "type" },
+    { "derain",      "derain filter flag",          0,                      AV_OPT_TYPE_CONST,  { .i64 = 0 },    0, 0, FLAGS, "type" },
+    { "dehaze",      "dehaze filter flag",          0,                      AV_OPT_TYPE_CONST,  { .i64 = 1 },    0, 0, FLAGS, "type" },
+    { "dnn_backend", "DNN backend",                 OFFSET(backend_type),   AV_OPT_TYPE_INT,    { .i64 = 0 },    0, 1, FLAGS, "backend" },
+    { "native",      "native backend flag",         0,                      AV_OPT_TYPE_CONST,  { .i64 = 0 },    0, 0, FLAGS, "backend" },
+#if (CONFIG_LIBTENSORFLOW == 1)
+    { "tensorflow",  "tensorflow backend flag",     0,                      AV_OPT_TYPE_CONST,  { .i64 = 1 },    0, 0, FLAGS, "backend" },
+#endif
+    { "model",       "path to model file",          OFFSET(model_filename), AV_OPT_TYPE_STRING, { .str = NULL }, 0, 0, FLAGS },
+    { NULL }
+};
+
+AVFILTER_DEFINE_CLASS(derain);
+
+static int query_formats(AVFilterContext *ctx)
+{
+    AVFilterFormats *formats;
+    const enum AVPixelFormat pixel_fmts[] = {
+        AV_PIX_FMT_RGB24,
+        AV_PIX_FMT_NONE
+    };
+
+    formats = ff_make_format_list(pixel_fmts);
+
+    return ff_set_common_formats(ctx, formats);
+}
+
+static int config_inputs(AVFilterLink *inlink)
+{
+    AVFilterContext *ctx          = inlink->dst;
+    DRContext *dr_context         = ctx->priv;
+    const char *model_output_name = "y";
+    DNNReturnType result;
+
+    dr_context->input.width    = inlink->w;
+    dr_context->input.height   = inlink->h;
+    dr_context->input.channels = 3;
+
+    result = (dr_context->model->set_input_output)(dr_context->model->model, &dr_context->input, "x", &model_output_name, 1);
+    if (result != DNN_SUCCESS) {
+        av_log(ctx, AV_LOG_ERROR, "could not set input and output for the model\n");
+        return AVERROR(EIO);
+    }
+
+    return 0;
+}
+
+static int filter_frame(AVFilterLink *inlink, AVFrame *in)
+{
+    AVFilterContext *ctx  = inlink->dst;
+    AVFilterLink *outlink = ctx->outputs[0];
+    DRContext *dr_context = ctx->priv;
+    DNNReturnType dnn_result;
+
+    AVFrame *out = ff_get_video_buffer(outlink, outlink->w, outlink->h);
+    if (!out) {
+        av_log(ctx, AV_LOG_ERROR, "could not allocate memory for output frame\n");
+        av_frame_free(&in);
+        return AVERROR(ENOMEM);
+    }
+
+    av_frame_copy_props(out, in);
+
+    for (int i = 0; i < in->height; i++){
+        for(int j = 0; j < in->width * 3; j++){
+            int k = i * in->linesize[0] + j;
+            int t = i * in->width * 3 + j;
+            ((float *)dr_context->input.data)[t] = in->data[0][k] / 255.0;
+        }
+    }
+
+    dnn_result = (dr_context->dnn_module->execute_model)(dr_context->model, &dr_context->output, 1);
+    if (dnn_result != DNN_SUCCESS){
+        av_log(ctx, AV_LOG_ERROR, "failed to execute model\n");
+        return AVERROR(EIO);
+    }
+
+    out->height = dr_context->output.height;
+    out->width  = dr_context->output.width;
+    outlink->h  = dr_context->output.height;
+    outlink->w  = dr_context->output.width;
+
+    for (int i = 0; i < out->height; i++){
+        for(int j = 0; j < out->width * 3; j++){
+            int k = i * out->linesize[0] + j;
+            int t = i * out->width * 3 + j;
+            out->data[0][k] = CLIP((int)((((float *)dr_context->output.data)[t]) * 255), 0, 255);
+        }
+    }
+
+    av_frame_free(&in);
+
+    return ff_filter_frame(outlink, out);
+}
+
+static av_cold int init(AVFilterContext *ctx)
+{
+    DRContext *dr_context = ctx->priv;
+
+    dr_context->input.dt = DNN_FLOAT;
+    dr_context->dnn_module = ff_get_dnn_module(dr_context->backend_type);
+    if (!dr_context->dnn_module) {
+        av_log(ctx, AV_LOG_ERROR, "could not create DNN module for requested backend\n");
+        return AVERROR(ENOMEM);
+    }
+    if (!dr_context->model_filename) {
+        av_log(ctx, AV_LOG_ERROR, "model file for network is not specified\n");
+        return AVERROR(EINVAL);
+    }
+    if (!dr_context->dnn_module->load_model) {
+        av_log(ctx, AV_LOG_ERROR, "load_model for network is not specified\n");
+        return AVERROR(EINVAL);
+    }
+
+    dr_context->model = (dr_context->dnn_module->load_model)(dr_context->model_filename);
+    if (!dr_context->model) {
+        av_log(ctx, AV_LOG_ERROR, "could not load DNN model\n");
+        return AVERROR(EINVAL);
+    }
+
+    return 0;
+}
+
+static av_cold void uninit(AVFilterContext *ctx)
+{
+    DRContext *dr_context = ctx->priv;
+
+    if (dr_context->dnn_module) {
+        (dr_context->dnn_module->free_model)(&dr_context->model);
+        av_freep(&dr_context->dnn_module);
+    }
+}
+
+static const AVFilterPad derain_inputs[] = {
+    {
+        .name         = "default",
+        .type         = AVMEDIA_TYPE_VIDEO,
+        .config_props = config_inputs,
+        .filter_frame = filter_frame,
+    },
+    { NULL }
+};
+
+static const AVFilterPad derain_outputs[] = {
+    {
+        .name = "default",
+        .type = AVMEDIA_TYPE_VIDEO,
+    },
+    { NULL }
+};
+
+AVFilter ff_vf_derain = {
+    .name          = "derain",
+    .description   = NULL_IF_CONFIG_SMALL("Apply derain filter to the input."),
+    .priv_size     = sizeof(DRContext),
+    .init          = init,
+    .uninit        = uninit,
+    .query_formats = query_formats,
+    .inputs        = derain_inputs,
+    .outputs       = derain_outputs,
+    .priv_class    = &derain_class,
+    .flags         = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC,
+};
diff --git a/libavfilter/vf_deshake.c b/libavfilter/vf_deshake.c
index c8480e7..28a541b 100644
--- a/libavfilter/vf_deshake.c
+++ b/libavfilter/vf_deshake.c
@@ -354,7 +354,7 @@
     if (deshake->filename)
         deshake->fp = fopen(deshake->filename, "w");
     if (deshake->fp)
-        fwrite("Ori x, Avg x, Fin x, Ori y, Avg y, Fin y, Ori angle, Avg angle, Fin angle, Ori zoom, Avg zoom, Fin zoom\n", sizeof(char), 104, deshake->fp);
+        fwrite("Ori x, Avg x, Fin x, Ori y, Avg y, Fin y, Ori angle, Avg angle, Fin angle, Ori zoom, Avg zoom, Fin zoom\n", 1, 104, deshake->fp);
 
     // Quadword align left edge of box for MMX code, adjust width if necessary
     // to keep right margin
@@ -421,6 +421,7 @@
     const int chroma_width  = AV_CEIL_RSHIFT(link->w, desc->log2_chroma_w);
     const int chroma_height = AV_CEIL_RSHIFT(link->h, desc->log2_chroma_h);
     int aligned;
+    float transform_zoom;
 
     out = ff_get_video_buffer(outlink, outlink->w, outlink->h);
     if (!out) {
@@ -484,7 +485,7 @@
     // Write statistics to file
     if (deshake->fp) {
         snprintf(tmp, 256, "%f, %f, %f, %f, %f, %f, %f, %f, %f, %f, %f, %f\n", orig.vec.x, deshake->avg.vec.x, t.vec.x, orig.vec.y, deshake->avg.vec.y, t.vec.y, orig.angle, deshake->avg.angle, t.angle, orig.zoom, deshake->avg.zoom, t.zoom);
-        fwrite(tmp, sizeof(char), strlen(tmp), deshake->fp);
+        fwrite(tmp, 1, strlen(tmp), deshake->fp);
     }
 
     // Turn relative current frame motion into absolute by adding it to the
@@ -505,10 +506,12 @@
     deshake->last.angle = t.angle;
     deshake->last.zoom = t.zoom;
 
+    transform_zoom = 1.0 + t.zoom / 100.0;
+
     // Generate a luma transformation matrix
-    avfilter_get_matrix(t.vec.x, t.vec.y, t.angle, 1.0 + t.zoom / 100.0, matrix_y);
+    ff_get_matrix(t.vec.x, t.vec.y, t.angle, transform_zoom, transform_zoom, matrix_y);
     // Generate a chroma transformation matrix
-    avfilter_get_matrix(t.vec.x / (link->w / chroma_width), t.vec.y / (link->h / chroma_height), t.angle, 1.0 + t.zoom / 100.0, matrix_uv);
+    ff_get_matrix(t.vec.x / (link->w / chroma_width), t.vec.y / (link->h / chroma_height), t.angle, transform_zoom, transform_zoom, matrix_uv);
     // Transform the luma and chroma planes
     ret = deshake->transform(link->dst, link->w, link->h, chroma_width, chroma_height,
                              matrix_y, matrix_uv, INTERPOLATE_BILINEAR, deshake->edge, in, out);
diff --git a/libavfilter/vf_deshake_opencl.c b/libavfilter/vf_deshake_opencl.c
new file mode 100644
index 0000000..4f1bb09
--- /dev/null
+++ b/libavfilter/vf_deshake_opencl.c
@@ -0,0 +1,2202 @@
+/*
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Copyright (C) 2000-2008, Intel Corporation, all rights reserved.
+ * Copyright (C) 2009, Willow Garage Inc., all rights reserved.
+ * Copyright (C) 2013, OpenCV Foundation, all rights reserved.
+ * Third party copyrights are property of their respective owners.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ *   * Redistribution's of source code must retain the above copyright notice,
+ *     this list of conditions and the following disclaimer.
+ *
+ *   * Redistribution's in binary form must reproduce the above copyright notice,
+ *     this list of conditions and the following disclaimer in the documentation
+ *     and/or other materials provided with the distribution.
+ *
+ *   * The name of the copyright holders may not be used to endorse or promote products
+ *     derived from this software without specific prior written permission.
+ *
+ * This software is provided by the copyright holders and contributors "as is" and
+ * any express or implied warranties, including, but not limited to, the implied
+ * warranties of merchantability and fitness for a particular purpose are disclaimed.
+ * In no event shall the Intel Corporation or contributors be liable for any direct,
+ * indirect, incidental, special, exemplary, or consequential damages
+ * (including, but not limited to, procurement of substitute goods or services;
+ * loss of use, data, or profits; or business interruption) however caused
+ * and on any theory of liability, whether in contract, strict liability,
+ * or tort (including negligence or otherwise) arising in any way out of
+ * the use of this software, even if advised of the possibility of such damage.
+ */
+
+#include <float.h>
+#include <libavutil/lfg.h>
+#include "libavutil/opt.h"
+#include "libavutil/imgutils.h"
+#include "libavutil/mem.h"
+#include "libavutil/fifo.h"
+#include "libavutil/common.h"
+#include "libavutil/avassert.h"
+#include "libavutil/pixfmt.h"
+#include "avfilter.h"
+#include "framequeue.h"
+#include "filters.h"
+#include "transform.h"
+#include "formats.h"
+#include "internal.h"
+#include "opencl.h"
+#include "opencl_source.h"
+#include "video.h"
+
+/*
+This filter matches feature points between frames (dealing with outliers) and then
+uses the matches to estimate an affine transform between frames. This transform is
+decomposed into various values (translation, scale, rotation) and the values are
+summed relative to the start of the video to obtain on absolute camera position
+for each frame. This "camera path" is then smoothed via a gaussian filter, resulting
+in a new path that is turned back into an affine transform and applied to each
+frame to render it.
+
+High-level overview:
+
+All of the work to extract motion data from frames occurs in queue_frame. Motion data
+is buffered in a smoothing window, so queue_frame simply computes the absolute camera
+positions and places them in ringbuffers.
+
+filter_frame is responsible for looking at the absolute camera positions currently
+in the ringbuffers, applying the gaussian filter, and then transforming the frames.
+*/
+
+// Number of bits for BRIEF descriptors
+#define BREIFN 512
+// Size of the patch from which a BRIEF descriptor is extracted
+// This is the size used in OpenCV
+#define BRIEF_PATCH_SIZE 31
+#define BRIEF_PATCH_SIZE_HALF (BRIEF_PATCH_SIZE / 2)
+
+#define MATCHES_CONTIG_SIZE 2000
+
+#define ROUNDED_UP_DIV(a, b) ((a + (b - 1)) / b)
+
+typedef struct PointPair {
+    // Previous frame
+    cl_float2 p1;
+    // Current frame
+    cl_float2 p2;
+} PointPair;
+
+typedef struct MotionVector {
+    PointPair p;
+    // Used to mark vectors as potential outliers
+    cl_int should_consider;
+} MotionVector;
+
+// Denotes the indices for the different types of motion in the ringbuffers array
+enum RingbufferIndices {
+    RingbufX,
+    RingbufY,
+    RingbufRot,
+    RingbufScaleX,
+    RingbufScaleY,
+
+    // Should always be last
+    RingbufCount
+};
+
+// Struct that holds data for drawing point match debug data
+typedef struct DebugMatches {
+    MotionVector *matches;
+    // The points used to calculate the affine transform for a frame
+    MotionVector model_matches[3];
+
+    int num_matches;
+    // For cases where we couldn't calculate a model
+    int num_model_matches;
+} DebugMatches;
+
+// Groups together the ringbuffers that store absolute distortion / position values
+// for each frame
+typedef struct AbsoluteFrameMotion {
+    // Array with the various ringbuffers, indexed via the RingbufferIndices enum
+    AVFifoBuffer *ringbuffers[RingbufCount];
+
+    // Offset to get to the current frame being processed
+    // (not in bytes)
+    int curr_frame_offset;
+    // Keeps track of where the start and end of contiguous motion data is (to
+    // deal with cases where no motion data is found between two frames)
+    int data_start_offset;
+    int data_end_offset;
+
+    AVFifoBuffer *debug_matches;
+} AbsoluteFrameMotion;
+
+// Takes care of freeing the arrays within the DebugMatches inside of the
+// debug_matches ringbuffer and then freeing the buffer itself.
+static void free_debug_matches(AbsoluteFrameMotion *afm) {
+    DebugMatches dm;
+
+    if (!afm->debug_matches) {
+        return;
+    }
+
+    while (av_fifo_size(afm->debug_matches) > 0) {
+        av_fifo_generic_read(
+            afm->debug_matches,
+            &dm,
+            sizeof(DebugMatches),
+            NULL
+        );
+
+        av_freep(&dm.matches);
+    }
+
+    av_fifo_freep(&afm->debug_matches);
+}
+
+// Stores the translation, scale, rotation, and skew deltas between two frames
+typedef struct FrameDelta {
+    cl_float2 translation;
+    float rotation;
+    cl_float2 scale;
+    cl_float2 skew;
+} FrameDelta;
+
+typedef struct SimilarityMatrix {
+    // The 2x3 similarity matrix
+    double matrix[6];
+} SimilarityMatrix;
+
+typedef struct CropInfo {
+    // The top left corner of the bounding box for the crop
+    cl_float2 top_left;
+    // The bottom right corner of the bounding box for the crop
+    cl_float2 bottom_right;
+} CropInfo;
+
+// Returned from function that determines start and end values for iteration
+// around the current frame in a ringbuffer
+typedef struct IterIndices {
+    int start;
+    int end;
+} IterIndices;
+
+typedef struct DeshakeOpenCLContext {
+    OpenCLFilterContext ocf;
+    // Whether or not the above `OpenCLFilterContext` has been initialized
+    int initialized;
+
+    // These variables are used in the activate callback
+    int64_t duration;
+    int eof;
+
+    // State for random number generation
+    AVLFG alfg;
+
+    // FIFO frame queue used to buffer future frames for processing
+    FFFrameQueue fq;
+    // Ringbuffers for frame positions
+    AbsoluteFrameMotion abs_motion;
+
+    // The number of frames' motion to consider before and after the frame we are
+    // smoothing
+    int smooth_window;
+    // The number of the frame we are currently processing
+    int curr_frame;
+
+    // Stores a 1d array of normalised gaussian kernel values for convolution
+    float *gauss_kernel;
+
+    // Buffer for error values used in RANSAC code
+    float *ransac_err;
+
+    // Information regarding how to crop the smoothed luminance (or RGB) planes
+    CropInfo crop_y;
+    // Information regarding how to crop the smoothed chroma planes
+    CropInfo crop_uv;
+
+    // Whether or not we are processing YUV input (as oppposed to RGB)
+    int is_yuv;
+    // The underlying format of the hardware surfaces
+    int sw_format;
+
+    // Buffer to copy `matches` into for the CPU to work with
+    MotionVector *matches_host;
+    MotionVector *matches_contig_host;
+
+    MotionVector *inliers;
+
+    cl_command_queue command_queue;
+    cl_kernel kernel_grayscale;
+    cl_kernel kernel_harris_response;
+    cl_kernel kernel_refine_features;
+    cl_kernel kernel_brief_descriptors;
+    cl_kernel kernel_match_descriptors;
+    cl_kernel kernel_transform;
+    cl_kernel kernel_crop_upscale;
+
+    // Stores a frame converted to grayscale
+    cl_mem grayscale;
+    // Stores the harris response for a frame (measure of "cornerness" for each pixel)
+    cl_mem harris_buf;
+
+    // Detected features after non-maximum suppression and sub-pixel refinement
+    cl_mem refined_features;
+    // Saved from the previous frame
+    cl_mem prev_refined_features;
+
+    // BRIEF sampling pattern that is randomly initialized
+    cl_mem brief_pattern;
+    // Feature point descriptors for the current frame
+    cl_mem descriptors;
+    // Feature point descriptors for the previous frame
+    cl_mem prev_descriptors;
+    // Vectors between points in current and previous frame
+    cl_mem matches;
+    cl_mem matches_contig;
+    // Holds the matrix to transform luminance (or RGB) with
+    cl_mem transform_y;
+    // Holds the matrix to transform chroma with
+    cl_mem transform_uv;
+
+    // Configurable options
+
+    int tripod_mode;
+    int debug_on;
+    int should_crop;
+
+    // Whether or not feature points should be refined at a sub-pixel level
+    cl_int refine_features;
+    // If the user sets a value other than the default, 0, this percentage is
+    // translated into a sigma value ranging from 0.5 to 40.0
+    float smooth_percent;
+    // This number is multiplied by the video frame rate to determine the size
+    // of the smooth window
+    float smooth_window_multiplier;
+
+    // Debug stuff
+
+    cl_kernel kernel_draw_debug_info;
+    cl_mem debug_matches;
+    cl_mem debug_model_matches;
+
+    // These store the total time spent executing the different kernels in nanoseconds
+    unsigned long long grayscale_time;
+    unsigned long long harris_response_time;
+    unsigned long long refine_features_time;
+    unsigned long long brief_descriptors_time;
+    unsigned long long match_descriptors_time;
+    unsigned long long transform_time;
+    unsigned long long crop_upscale_time;
+
+    // Time spent copying matched features from the device to the host
+    unsigned long long read_buf_time;
+} DeshakeOpenCLContext;
+
+// Returns a random uniformly-distributed number in [low, high]
+static int rand_in(int low, int high, AVLFG *alfg) {
+    return (av_lfg_get(alfg) % (high - low)) + low;
+}
+
+// Returns the average execution time for an event given the total time and the
+// number of frames processed.
+static double averaged_event_time_ms(unsigned long long total_time, int num_frames) {
+    return (double)total_time / (double)num_frames / 1000000.0;
+}
+
+// The following code is loosely ported from OpenCV
+
+// Estimates affine transform from 3 point pairs
+// model is a 2x3 matrix:
+//      a b c
+//      d e f
+static void run_estimate_kernel(const MotionVector *point_pairs, double *model)
+{
+    // src points
+    double x1 = point_pairs[0].p.p1.s[0];
+    double y1 = point_pairs[0].p.p1.s[1];
+    double x2 = point_pairs[1].p.p1.s[0];
+    double y2 = point_pairs[1].p.p1.s[1];
+    double x3 = point_pairs[2].p.p1.s[0];
+    double y3 = point_pairs[2].p.p1.s[1];
+
+    // dest points
+    double X1 = point_pairs[0].p.p2.s[0];
+    double Y1 = point_pairs[0].p.p2.s[1];
+    double X2 = point_pairs[1].p.p2.s[0];
+    double Y2 = point_pairs[1].p.p2.s[1];
+    double X3 = point_pairs[2].p.p2.s[0];
+    double Y3 = point_pairs[2].p.p2.s[1];
+
+    double d = 1.0 / ( x1*(y2-y3) + x2*(y3-y1) + x3*(y1-y2) );
+
+    model[0] = d * ( X1*(y2-y3) + X2*(y3-y1) + X3*(y1-y2) );
+    model[1] = d * ( X1*(x3-x2) + X2*(x1-x3) + X3*(x2-x1) );
+    model[2] = d * ( X1*(x2*y3 - x3*y2) + X2*(x3*y1 - x1*y3) + X3*(x1*y2 - x2*y1) );
+
+    model[3] = d * ( Y1*(y2-y3) + Y2*(y3-y1) + Y3*(y1-y2) );
+    model[4] = d * ( Y1*(x3-x2) + Y2*(x1-x3) + Y3*(x2-x1) );
+    model[5] = d * ( Y1*(x2*y3 - x3*y2) + Y2*(x3*y1 - x1*y3) + Y3*(x1*y2 - x2*y1) );
+}
+
+// Checks that the 3 points in the given array are not collinear
+static int points_not_collinear(const cl_float2 **points)
+{
+    int j, k, i = 2;
+
+    for (j = 0; j < i; j++) {
+        double dx1 = points[j]->s[0] - points[i]->s[0];
+        double dy1 = points[j]->s[1] - points[i]->s[1];
+
+        for (k = 0; k < j; k++) {
+            double dx2 = points[k]->s[0] - points[i]->s[0];
+            double dy2 = points[k]->s[1] - points[i]->s[1];
+
+            // Assuming a 3840 x 2160 video with a point at (0, 0) and one at
+            // (3839, 2159), this prevents a third point from being within roughly
+            // 0.5 of a pixel of the line connecting the two on both axes
+            if (fabs(dx2*dy1 - dy2*dx1) <= 1.0) {
+                return 0;
+            }
+        }
+    }
+
+    return 1;
+}
+
+// Checks a subset of 3 point pairs to make sure that the points are not collinear
+// and not too close to each other
+static int check_subset(const MotionVector *pairs_subset)
+{
+    const cl_float2 *prev_points[] = {
+        &pairs_subset[0].p.p1,
+        &pairs_subset[1].p.p1,
+        &pairs_subset[2].p.p1
+    };
+
+    const cl_float2 *curr_points[] = {
+        &pairs_subset[0].p.p2,
+        &pairs_subset[1].p.p2,
+        &pairs_subset[2].p.p2
+    };
+
+    return points_not_collinear(prev_points) && points_not_collinear(curr_points);
+}
+
+// Selects a random subset of 3 points from point_pairs and places them in pairs_subset
+static int get_subset(
+    AVLFG *alfg,
+    const MotionVector *point_pairs,
+    const int num_point_pairs,
+    MotionVector *pairs_subset,
+    int max_attempts
+) {
+    int idx[3];
+    int i = 0, j, iters = 0;
+
+    for (; iters < max_attempts; iters++) {
+        for (i = 0; i < 3 && iters < max_attempts;) {
+            int idx_i = 0;
+
+            for (;;) {
+                idx_i = idx[i] = rand_in(0, num_point_pairs, alfg);
+
+                for (j = 0; j < i; j++) {
+                    if (idx_i == idx[j]) {
+                        break;
+                    }
+                }
+
+                if (j == i) {
+                    break;
+                }
+            }
+
+            pairs_subset[i] = point_pairs[idx[i]];
+            i++;
+        }
+
+        if (i == 3 && !check_subset(pairs_subset)) {
+            continue;
+        }
+        break;
+    }
+
+    return i == 3 && iters < max_attempts;
+}
+
+// Computes the error for each of the given points based on the given model.
+static void compute_error(
+    const MotionVector *point_pairs,
+    const int num_point_pairs,
+    const double *model,
+    float *err
+) {
+    double F0 = model[0], F1 = model[1], F2 = model[2];
+    double F3 = model[3], F4 = model[4], F5 = model[5];
+
+    for (int i = 0; i < num_point_pairs; i++) {
+        const cl_float2 *f = &point_pairs[i].p.p1;
+        const cl_float2 *t = &point_pairs[i].p.p2;
+
+        double a = F0*f->s[0] + F1*f->s[1] + F2 - t->s[0];
+        double b = F3*f->s[0] + F4*f->s[1] + F5 - t->s[1];
+
+        err[i] = a*a + b*b;
+    }
+}
+
+// Determines which of the given point matches are inliers for the given model
+// based on the specified threshold.
+//
+// err must be an array of num_point_pairs length
+static int find_inliers(
+    MotionVector *point_pairs,
+    const int num_point_pairs,
+    const double *model,
+    float *err,
+    double thresh
+) {
+    float t = (float)(thresh * thresh);
+    int i, n = num_point_pairs, num_inliers = 0;
+
+    compute_error(point_pairs, num_point_pairs, model, err);
+
+    for (i = 0; i < n; i++) {
+        if (err[i] <= t) {
+            // This is an inlier
+            point_pairs[i].should_consider = 1;
+            num_inliers += 1;
+        } else {
+            point_pairs[i].should_consider = 0;
+        }
+    }
+
+    return num_inliers;
+}
+
+// Determines the number of iterations required to achieve the desired confidence level.
+//
+// The equation used to determine the number of iterations to do is:
+// 1 - confidence = (1 - inlier_probability^num_points)^num_iters
+//
+// Solving for num_iters:
+//
+// num_iters = log(1 - confidence) / log(1 - inlier_probability^num_points)
+//
+// A more in-depth explanation can be found at https://en.wikipedia.org/wiki/Random_sample_consensus
+// under the 'Parameters' heading
+static int ransac_update_num_iters(double confidence, double num_outliers, int max_iters)
+{
+    double num, denom;
+
+    confidence   = av_clipd(confidence, 0.0, 1.0);
+    num_outliers = av_clipd(num_outliers, 0.0, 1.0);
+
+    // avoid inf's & nan's
+    num = FFMAX(1.0 - confidence, DBL_MIN);
+    denom = 1.0 - pow(1.0 - num_outliers, 3);
+    if (denom < DBL_MIN) {
+        return 0;
+    }
+
+    num = log(num);
+    denom = log(denom);
+
+    return denom >= 0 || -num >= max_iters * (-denom) ? max_iters : (int)round(num / denom);
+}
+
+// Estimates an affine transform between the given pairs of points using RANdom
+// SAmple Consensus
+static int estimate_affine_2d(
+    DeshakeOpenCLContext *deshake_ctx,
+    MotionVector *point_pairs,
+    DebugMatches *debug_matches,
+    const int num_point_pairs,
+    double *model_out,
+    const double threshold,
+    const int max_iters,
+    const double confidence
+) {
+    int result = 0;
+    double best_model[6], model[6];
+    MotionVector pairs_subset[3], best_pairs[3];
+
+    int iter, niters = FFMAX(max_iters, 1);
+    int good_count, max_good_count = 0;
+
+    // We need at least 3 points to build a model from
+    if (num_point_pairs < 3) {
+        return 0;
+    } else if (num_point_pairs == 3) {
+        // There are only 3 points, so RANSAC doesn't apply here
+        run_estimate_kernel(point_pairs, model_out);
+
+        for (int i = 0; i < 3; ++i) {
+            point_pairs[i].should_consider = 1;
+        }
+
+        return 1;
+    }
+
+    for (iter = 0; iter < niters; ++iter) {
+        int found = get_subset(&deshake_ctx->alfg, point_pairs, num_point_pairs, pairs_subset, 10000);
+
+        if (!found) {
+            if (iter == 0) {
+                return 0;
+            }
+
+            break;
+        }
+
+        run_estimate_kernel(pairs_subset, model);
+        good_count = find_inliers(point_pairs, num_point_pairs, model, deshake_ctx->ransac_err, threshold);
+
+        if (good_count > FFMAX(max_good_count, 2)) {
+            for (int mi = 0; mi < 6; ++mi) {
+                best_model[mi] = model[mi];
+            }
+
+            for (int pi = 0; pi < 3; pi++) {
+                best_pairs[pi] = pairs_subset[pi];
+            }
+
+            max_good_count = good_count;
+            niters = ransac_update_num_iters(
+                confidence,
+                (double)(num_point_pairs - good_count) / num_point_pairs,
+                niters
+            );
+        }
+    }
+
+    if (max_good_count > 0) {
+        for (int mi = 0; mi < 6; ++mi) {
+            model_out[mi] = best_model[mi];
+        }
+
+        for (int pi = 0; pi < 3; ++pi) {
+            debug_matches->model_matches[pi] = best_pairs[pi];
+        }
+        debug_matches->num_model_matches = 3;
+
+        // Find the inliers again for the best model for debugging
+        find_inliers(point_pairs, num_point_pairs, best_model, deshake_ctx->ransac_err, threshold);
+        result = 1;
+    }
+
+    return result;
+}
+
+// "Wiggles" the first point in best_pairs around a tiny bit in order to decrease the
+// total error
+static void optimize_model(
+    DeshakeOpenCLContext *deshake_ctx,
+    MotionVector *best_pairs,
+    MotionVector *inliers,
+    const int num_inliers,
+    float best_err,
+    double *model_out
+) {
+    float move_x_val = 0.01;
+    float move_y_val = 0.01;
+    int move_x = 1;
+    float old_move_x_val = 0;
+    double model[6];
+    int last_changed = 0;
+
+    for (int iters = 0; iters < 200; iters++) {
+        float total_err = 0;
+
+        if (move_x) {
+            best_pairs[0].p.p2.s[0] += move_x_val;
+        } else {
+            best_pairs[0].p.p2.s[0] += move_y_val;
+        }
+
+        run_estimate_kernel(best_pairs, model);
+        compute_error(inliers, num_inliers, model, deshake_ctx->ransac_err);
+
+        for (int j = 0; j < num_inliers; j++) {
+            total_err += deshake_ctx->ransac_err[j];
+        }
+
+        if (total_err < best_err) {
+            for (int mi = 0; mi < 6; ++mi) {
+                model_out[mi] = model[mi];
+            }
+
+            best_err = total_err;
+            last_changed = iters;
+        } else {
+            // Undo the change
+            if (move_x) {
+                best_pairs[0].p.p2.s[0] -= move_x_val;
+            } else {
+                best_pairs[0].p.p2.s[0] -= move_y_val;
+            }
+
+            if (iters - last_changed > 4) {
+                // We've already improved the model as much as we can
+                break;
+            }
+
+            old_move_x_val = move_x_val;
+
+            if (move_x) {
+                move_x_val *= -1;
+            } else {
+                move_y_val *= -1;
+            }
+
+            if (old_move_x_val < 0) {
+                move_x = 0;
+            } else {
+                move_x = 1;
+            }
+        }
+    }
+}
+
+// Uses a process similar to that of RANSAC to find a transform that minimizes
+// the total error for a set of point matches determined to be inliers
+//
+// (Pick random subsets, compute model, find total error, iterate until error
+// is minimized.)
+static int minimize_error(
+    DeshakeOpenCLContext *deshake_ctx,
+    MotionVector *inliers,
+    DebugMatches *debug_matches,
+    const int num_inliers,
+    double *model_out,
+    const int max_iters
+) {
+    int result = 0;
+    float best_err = FLT_MAX;
+    double best_model[6], model[6];
+    MotionVector pairs_subset[3], best_pairs[3];
+
+    for (int i = 0; i < max_iters; i++) {
+        float total_err = 0;
+        int found = get_subset(&deshake_ctx->alfg, inliers, num_inliers, pairs_subset, 10000);
+
+        if (!found) {
+            if (i == 0) {
+                return 0;
+            }
+
+            break;
+        }
+
+        run_estimate_kernel(pairs_subset, model);
+        compute_error(inliers, num_inliers, model, deshake_ctx->ransac_err);
+
+        for (int j = 0; j < num_inliers; j++) {
+            total_err += deshake_ctx->ransac_err[j];
+        }
+
+        if (total_err < best_err) {
+            for (int mi = 0; mi < 6; ++mi) {
+                best_model[mi] = model[mi];
+            }
+
+            for (int pi = 0; pi < 3; pi++) {
+                best_pairs[pi] = pairs_subset[pi];
+            }
+
+            best_err = total_err;
+        }
+    }
+
+    for (int mi = 0; mi < 6; ++mi) {
+        model_out[mi] = best_model[mi];
+    }
+
+    for (int pi = 0; pi < 3; ++pi) {
+        debug_matches->model_matches[pi] = best_pairs[pi];
+    }
+    debug_matches->num_model_matches = 3;
+    result = 1;
+
+    optimize_model(deshake_ctx, best_pairs, inliers, num_inliers, best_err, model_out);
+    return result;
+}
+
+// End code from OpenCV
+
+// Decomposes a similarity matrix into translation, rotation, scale, and skew
+//
+// See http://frederic-wang.fr/decomposition-of-2d-transform-matrices.html
+static FrameDelta decompose_transform(double *model)
+{
+    FrameDelta ret;
+
+    double a = model[0];
+    double c = model[1];
+    double e = model[2];
+    double b = model[3];
+    double d = model[4];
+    double f = model[5];
+    double delta = a * d - b * c;
+
+    memset(&ret, 0, sizeof(ret));
+
+    ret.translation.s[0] = e;
+    ret.translation.s[1] = f;
+
+    // This is the QR method
+    if (a != 0 || b != 0) {
+        double r = hypot(a, b);
+
+        ret.rotation = FFSIGN(b) * acos(a / r);
+        ret.scale.s[0] = r;
+        ret.scale.s[1] = delta / r;
+        ret.skew.s[0] = atan((a * c + b * d) / (r * r));
+        ret.skew.s[1] = 0;
+    } else if (c != 0 || d != 0) {
+        double s = sqrt(c * c + d * d);
+
+        ret.rotation = M_PI / 2 - FFSIGN(d) * acos(-c / s);
+        ret.scale.s[0] = delta / s;
+        ret.scale.s[1] = s;
+        ret.skew.s[0] = 0;
+        ret.skew.s[1] = atan((a * c + b * d) / (s * s));
+    } // otherwise there is only translation
+
+    return ret;
+}
+
+// Move valid vectors from the 2d buffer into a 1d buffer where they are contiguous
+static int make_vectors_contig(
+    DeshakeOpenCLContext *deshake_ctx,
+    int size_y,
+    int size_x
+) {
+    int num_vectors = 0;
+
+    for (int i = 0; i < size_y; ++i) {
+        for (int j = 0; j < size_x; ++j) {
+            MotionVector v = deshake_ctx->matches_host[j + i * size_x];
+
+            if (v.should_consider) {
+                deshake_ctx->matches_contig_host[num_vectors] = v;
+                ++num_vectors;
+            }
+
+            // Make sure we do not exceed the amount of space we allocated for these vectors
+            if (num_vectors == MATCHES_CONTIG_SIZE - 1) {
+                return num_vectors;
+            }
+        }
+    }
+    return num_vectors;
+}
+
+// Returns the gaussian kernel value for the given x coordinate and sigma value
+static float gaussian_for(int x, float sigma) {
+    return 1.0f / expf(((float)x * (float)x) / (2.0f * sigma * sigma));
+}
+
+// Makes a normalized gaussian kernel of the given length for the given sigma
+// and places it in gauss_kernel
+static void make_gauss_kernel(float *gauss_kernel, float length, float sigma)
+{
+    float gauss_sum = 0;
+    int window_half = length / 2;
+
+    for (int i = 0; i < length; ++i) {
+        float val = gaussian_for(i - window_half, sigma);
+
+        gauss_sum += val;
+        gauss_kernel[i] = val;
+    }
+
+    // Normalize the gaussian values
+    for (int i = 0; i < length; ++i) {
+        gauss_kernel[i] /= gauss_sum;
+    }
+}
+
+// Returns indices to start and end iteration at in order to iterate over a window
+// of length size centered at the current frame in a ringbuffer
+//
+// Always returns numbers that result in a window of length size, even if that
+// means specifying negative indices or indices past the end of the values in the
+// ringbuffers. Make sure you clip indices appropriately within your loop.
+static IterIndices start_end_for(DeshakeOpenCLContext *deshake_ctx, int length) {
+    IterIndices indices;
+
+    indices.start = deshake_ctx->abs_motion.curr_frame_offset - (length / 2);
+    indices.end = deshake_ctx->abs_motion.curr_frame_offset + (length / 2) + (length % 2);
+
+    return indices;
+}
+
+// Sets val to the value in the given ringbuffer at the given offset, taking care of
+// clipping the offset into the appropriate range
+static void ringbuf_float_at(
+    DeshakeOpenCLContext *deshake_ctx,
+    AVFifoBuffer *values,
+    float *val,
+    int offset
+) {
+    int clip_start, clip_end, offset_clipped;
+    if (deshake_ctx->abs_motion.data_end_offset != -1) {
+        clip_end = deshake_ctx->abs_motion.data_end_offset;
+    } else {
+        // This expression represents the last valid index in the buffer,
+        // which we use repeatedly at the end of the video.
+        clip_end = deshake_ctx->smooth_window - (av_fifo_space(values) / sizeof(float)) - 1;
+    }
+
+    if (deshake_ctx->abs_motion.data_start_offset != -1) {
+        clip_start = deshake_ctx->abs_motion.data_start_offset;
+    } else {
+        // Negative indices will occur at the start of the video, and we want
+        // them to be clipped to 0 in order to repeatedly use the position of
+        // the first frame.
+        clip_start = 0;
+    }
+
+    offset_clipped = av_clip(
+        offset,
+        clip_start,
+        clip_end
+    );
+
+    av_fifo_generic_peek_at(
+        values,
+        val,
+        offset_clipped * sizeof(float),
+        sizeof(float),
+        NULL
+    );
+}
+
+// Returns smoothed current frame value of the given buffer of floats based on the
+// given Gaussian kernel and its length (also the window length, centered around the
+// current frame) and the "maximum value" of the motion.
+//
+// This "maximum value" should be the width / height of the image in the case of
+// translation and an empirically chosen constant for rotation / scale.
+//
+// The sigma chosen to generate the final gaussian kernel with used to smooth the
+// camera path is either hardcoded (set by user, deshake_ctx->smooth_percent) or
+// adaptively chosen.
+static float smooth(
+    DeshakeOpenCLContext *deshake_ctx,
+    float *gauss_kernel,
+    int length,
+    float max_val,
+    AVFifoBuffer *values
+) {
+    float new_large_s = 0, new_small_s = 0, new_best = 0, old, diff_between,
+          percent_of_max, inverted_percent;
+    IterIndices indices = start_end_for(deshake_ctx, length);
+    float large_sigma = 40.0f;
+    float small_sigma = 2.0f;
+    float best_sigma;
+
+    if (deshake_ctx->smooth_percent) {
+        best_sigma = (large_sigma - 0.5f) * deshake_ctx->smooth_percent + 0.5f;
+    } else {
+        // Strategy to adaptively smooth trajectory:
+        //
+        // 1. Smooth path with large and small sigma values
+        // 2. Take the absolute value of the difference between them
+        // 3. Get a percentage by putting the difference over the "max value"
+        // 4, Invert the percentage
+        // 5. Calculate a new sigma value weighted towards the larger sigma value
+        // 6. Determine final smoothed trajectory value using that sigma
+
+        make_gauss_kernel(gauss_kernel, length, large_sigma);
+        for (int i = indices.start, j = 0; i < indices.end; ++i, ++j) {
+            ringbuf_float_at(deshake_ctx, values, &old, i);
+            new_large_s += old * gauss_kernel[j];
+        }
+
+        make_gauss_kernel(gauss_kernel, length, small_sigma);
+        for (int i = indices.start, j = 0; i < indices.end; ++i, ++j) {
+            ringbuf_float_at(deshake_ctx, values, &old, i);
+            new_small_s += old * gauss_kernel[j];
+        }
+
+        diff_between = fabsf(new_large_s - new_small_s);
+        percent_of_max = diff_between / max_val;
+        inverted_percent = 1 - percent_of_max;
+        best_sigma = large_sigma * powf(inverted_percent, 40);
+    }
+
+    make_gauss_kernel(gauss_kernel, length, best_sigma);
+    for (int i = indices.start, j = 0; i < indices.end; ++i, ++j) {
+        ringbuf_float_at(deshake_ctx, values, &old, i);
+        new_best += old * gauss_kernel[j];
+    }
+
+    return new_best;
+}
+
+// Returns the position of the given point after the transform is applied
+static cl_float2 transformed_point(float x, float y, float *transform) {
+    cl_float2 ret;
+
+    ret.s[0] = x * transform[0] + y * transform[1] + transform[2];
+    ret.s[1] = x * transform[3] + y * transform[4] + transform[5];
+
+    return ret;
+}
+
+// Creates an affine transform that scales from the center of a frame
+static void transform_center_scale(
+    float x_shift,
+    float y_shift,
+    float angle,
+    float scale_x,
+    float scale_y,
+    float center_w,
+    float center_h,
+    float *matrix
+) {
+    cl_float2 center_s;
+    float center_s_w, center_s_h;
+
+    ff_get_matrix(
+        0,
+        0,
+        0,
+        scale_x,
+        scale_y,
+        matrix
+    );
+
+    center_s = transformed_point(center_w, center_h, matrix);
+    center_s_w = center_w - center_s.s[0];
+    center_s_h = center_h - center_s.s[1];
+
+    ff_get_matrix(
+        x_shift + center_s_w,
+        y_shift + center_s_h,
+        angle,
+        scale_x,
+        scale_y,
+        matrix
+    );
+}
+
+// Determines the crop necessary to eliminate black borders from a smoothed frame
+// and updates target crop accordingly
+static void update_needed_crop(
+    CropInfo* crop,
+    float *transform,
+    float frame_width,
+    float frame_height
+) {
+    float new_width, new_height, adjusted_width, adjusted_height, adjusted_x, adjusted_y;
+
+    cl_float2 top_left = transformed_point(0, 0, transform);
+    cl_float2 top_right = transformed_point(frame_width, 0, transform);
+    cl_float2 bottom_left = transformed_point(0, frame_height, transform);
+    cl_float2 bottom_right = transformed_point(frame_width, frame_height, transform);
+    float ar_h = frame_height / frame_width;
+    float ar_w = frame_width / frame_height;
+
+    if (crop->bottom_right.s[0] == 0) {
+        // The crop hasn't been set to the original size of the plane
+        crop->bottom_right.s[0] = frame_width;
+        crop->bottom_right.s[1] = frame_height;
+    }
+
+    crop->top_left.s[0] = FFMAX3(
+        crop->top_left.s[0],
+        top_left.s[0],
+        bottom_left.s[0]
+    );
+
+    crop->top_left.s[1] = FFMAX3(
+        crop->top_left.s[1],
+        top_left.s[1],
+        top_right.s[1]
+    );
+
+    crop->bottom_right.s[0] = FFMIN3(
+        crop->bottom_right.s[0],
+        bottom_right.s[0],
+        top_right.s[0]
+    );
+
+    crop->bottom_right.s[1] = FFMIN3(
+        crop->bottom_right.s[1],
+        bottom_right.s[1],
+        bottom_left.s[1]
+    );
+
+    // Make sure our potentially new bounding box has the same aspect ratio
+    new_height = crop->bottom_right.s[1] - crop->top_left.s[1];
+    new_width = crop->bottom_right.s[0] - crop->top_left.s[0];
+
+    adjusted_width = new_height * ar_w;
+    adjusted_x = crop->bottom_right.s[0] - adjusted_width;
+
+    if (adjusted_x >= crop->top_left.s[0]) {
+        crop->top_left.s[0] = adjusted_x;
+    } else {
+        adjusted_height = new_width * ar_h;
+        adjusted_y = crop->bottom_right.s[1] - adjusted_height;
+        crop->top_left.s[1] = adjusted_y;
+    }
+}
+
+static av_cold void deshake_opencl_uninit(AVFilterContext *avctx)
+{
+    DeshakeOpenCLContext *ctx = avctx->priv;
+    cl_int cle;
+
+    for (int i = 0; i < RingbufCount; i++)
+        av_fifo_freep(&ctx->abs_motion.ringbuffers[i]);
+
+    if (ctx->debug_on)
+        free_debug_matches(&ctx->abs_motion);
+
+    if (ctx->gauss_kernel)
+        av_freep(&ctx->gauss_kernel);
+
+    if (ctx->ransac_err)
+        av_freep(&ctx->ransac_err);
+
+    if (ctx->matches_host)
+        av_freep(&ctx->matches_host);
+
+    if (ctx->matches_contig_host)
+        av_freep(&ctx->matches_contig_host);
+
+    if (ctx->inliers)
+        av_freep(&ctx->inliers);
+
+    ff_framequeue_free(&ctx->fq);
+
+    CL_RELEASE_KERNEL(ctx->kernel_grayscale);
+    CL_RELEASE_KERNEL(ctx->kernel_harris_response);
+    CL_RELEASE_KERNEL(ctx->kernel_refine_features);
+    CL_RELEASE_KERNEL(ctx->kernel_brief_descriptors);
+    CL_RELEASE_KERNEL(ctx->kernel_match_descriptors);
+    CL_RELEASE_KERNEL(ctx->kernel_crop_upscale);
+    if (ctx->debug_on)
+        CL_RELEASE_KERNEL(ctx->kernel_draw_debug_info);
+
+    CL_RELEASE_QUEUE(ctx->command_queue);
+
+    if (!ctx->is_yuv)
+        CL_RELEASE_MEMORY(ctx->grayscale);
+    CL_RELEASE_MEMORY(ctx->harris_buf);
+    CL_RELEASE_MEMORY(ctx->refined_features);
+    CL_RELEASE_MEMORY(ctx->prev_refined_features);
+    CL_RELEASE_MEMORY(ctx->brief_pattern);
+    CL_RELEASE_MEMORY(ctx->descriptors);
+    CL_RELEASE_MEMORY(ctx->prev_descriptors);
+    CL_RELEASE_MEMORY(ctx->matches);
+    CL_RELEASE_MEMORY(ctx->matches_contig);
+    CL_RELEASE_MEMORY(ctx->transform_y);
+    CL_RELEASE_MEMORY(ctx->transform_uv);
+    if (ctx->debug_on) {
+        CL_RELEASE_MEMORY(ctx->debug_matches);
+        CL_RELEASE_MEMORY(ctx->debug_model_matches);
+    }
+
+    ff_opencl_filter_uninit(avctx);
+}
+
+static int deshake_opencl_init(AVFilterContext *avctx)
+{
+    DeshakeOpenCLContext *ctx = avctx->priv;
+    AVFilterLink *outlink = avctx->outputs[0];
+    AVFilterLink *inlink = avctx->inputs[0];
+    // Pointer to the host-side pattern buffer to be initialized and then copied
+    // to the GPU
+    PointPair *pattern_host = NULL;
+    cl_int cle;
+    int err;
+    cl_ulong8 zeroed_ulong8;
+    FFFrameQueueGlobal fqg;
+    cl_image_format grayscale_format;
+    cl_image_desc grayscale_desc;
+    cl_command_queue_properties queue_props;
+
+    const enum AVPixelFormat disallowed_formats[14] = {
+        AV_PIX_FMT_GBRP,
+        AV_PIX_FMT_GBRP9BE,
+        AV_PIX_FMT_GBRP9LE,
+        AV_PIX_FMT_GBRP10BE,
+        AV_PIX_FMT_GBRP10LE,
+        AV_PIX_FMT_GBRP16BE,
+        AV_PIX_FMT_GBRP16LE,
+        AV_PIX_FMT_GBRAP,
+        AV_PIX_FMT_GBRAP16BE,
+        AV_PIX_FMT_GBRAP16LE,
+        AV_PIX_FMT_GBRAP12BE,
+        AV_PIX_FMT_GBRAP12LE,
+        AV_PIX_FMT_GBRAP10BE,
+        AV_PIX_FMT_GBRAP10LE
+    };
+
+    // Number of elements for an array
+    const int image_grid_32 = ROUNDED_UP_DIV(outlink->h, 32) * ROUNDED_UP_DIV(outlink->w, 32);
+
+    const int descriptor_buf_size = image_grid_32 * (BREIFN / 8);
+    const int features_buf_size = image_grid_32 * sizeof(cl_float2);
+
+    const AVHWFramesContext *hw_frames_ctx = (AVHWFramesContext*)inlink->hw_frames_ctx->data;
+    const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(hw_frames_ctx->sw_format);
+
+    av_assert0(hw_frames_ctx);
+    av_assert0(desc);
+
+    ff_framequeue_global_init(&fqg);
+    ff_framequeue_init(&ctx->fq, &fqg);
+    ctx->eof = 0;
+    ctx->smooth_window = (int)(av_q2d(avctx->inputs[0]->frame_rate) * ctx->smooth_window_multiplier);
+    ctx->curr_frame = 0;
+
+    memset(&zeroed_ulong8, 0, sizeof(cl_ulong8));
+
+    ctx->gauss_kernel = av_malloc_array(ctx->smooth_window, sizeof(float));
+    if (!ctx->gauss_kernel) {
+        err = AVERROR(ENOMEM);
+        goto fail;
+    }
+
+    ctx->ransac_err = av_malloc_array(MATCHES_CONTIG_SIZE, sizeof(float));
+    if (!ctx->ransac_err) {
+        err = AVERROR(ENOMEM);
+        goto fail;
+    }
+
+    for (int i = 0; i < RingbufCount; i++) {
+        ctx->abs_motion.ringbuffers[i] = av_fifo_alloc_array(
+            ctx->smooth_window,
+            sizeof(float)
+        );
+
+        if (!ctx->abs_motion.ringbuffers[i]) {
+            err = AVERROR(ENOMEM);
+            goto fail;
+        }
+    }
+
+    if (ctx->debug_on) {
+        ctx->abs_motion.debug_matches = av_fifo_alloc_array(
+            ctx->smooth_window / 2,
+            sizeof(DebugMatches)
+        );
+
+        if (!ctx->abs_motion.debug_matches) {
+            err = AVERROR(ENOMEM);
+            goto fail;
+        }
+    }
+
+    ctx->abs_motion.curr_frame_offset = 0;
+    ctx->abs_motion.data_start_offset = -1;
+    ctx->abs_motion.data_end_offset = -1;
+
+    pattern_host = av_malloc_array(BREIFN, sizeof(PointPair));
+    if (!pattern_host) {
+        err = AVERROR(ENOMEM);
+        goto fail;
+    }
+
+    ctx->matches_host = av_malloc_array(image_grid_32, sizeof(MotionVector));
+    if (!ctx->matches_host) {
+        err = AVERROR(ENOMEM);
+        goto fail;
+    }
+
+    ctx->matches_contig_host = av_malloc_array(MATCHES_CONTIG_SIZE, sizeof(MotionVector));
+    if (!ctx->matches_contig_host) {
+        err = AVERROR(ENOMEM);
+        goto fail;
+    }
+
+    ctx->inliers = av_malloc_array(MATCHES_CONTIG_SIZE, sizeof(MotionVector));
+    if (!ctx->inliers) {
+        err = AVERROR(ENOMEM);
+        goto fail;
+    }
+
+    // Initializing the patch pattern for building BREIF descriptors with
+    av_lfg_init(&ctx->alfg, 234342424);
+    for (int i = 0; i < BREIFN; ++i) {
+        PointPair pair;
+
+        for (int j = 0; j < 2; ++j) {
+            pair.p1.s[j] = rand_in(-BRIEF_PATCH_SIZE_HALF, BRIEF_PATCH_SIZE_HALF + 1, &ctx->alfg);
+            pair.p2.s[j] = rand_in(-BRIEF_PATCH_SIZE_HALF, BRIEF_PATCH_SIZE_HALF + 1, &ctx->alfg);
+        }
+
+        pattern_host[i] = pair;
+    }
+
+    for (int i = 0; i < 14; i++) {
+        if (ctx->sw_format == disallowed_formats[i]) {
+            av_log(avctx, AV_LOG_ERROR, "unsupported format in deshake_opencl.\n");
+            err = AVERROR(ENOSYS);
+            goto fail;
+        }
+    }
+
+    if (desc->flags & AV_PIX_FMT_FLAG_RGB) {
+        ctx->is_yuv = 0;
+    } else {
+        ctx->is_yuv = 1;
+    }
+    ctx->sw_format = hw_frames_ctx->sw_format;
+
+    err = ff_opencl_filter_load_program(avctx, &ff_opencl_source_deshake, 1);
+    if (err < 0)
+        goto fail;
+
+    if (ctx->debug_on) {
+        queue_props = CL_QUEUE_PROFILING_ENABLE;
+    } else {
+        queue_props = 0;
+    }
+    ctx->command_queue = clCreateCommandQueue(
+        ctx->ocf.hwctx->context,
+        ctx->ocf.hwctx->device_id,
+        queue_props,
+        &cle
+    );
+    CL_FAIL_ON_ERROR(AVERROR(EIO), "Failed to create OpenCL command queue %d.\n", cle);
+
+    CL_CREATE_KERNEL(ctx, grayscale);
+    CL_CREATE_KERNEL(ctx, harris_response);
+    CL_CREATE_KERNEL(ctx, refine_features);
+    CL_CREATE_KERNEL(ctx, brief_descriptors);
+    CL_CREATE_KERNEL(ctx, match_descriptors);
+    CL_CREATE_KERNEL(ctx, transform);
+    CL_CREATE_KERNEL(ctx, crop_upscale);
+    if (ctx->debug_on)
+        CL_CREATE_KERNEL(ctx, draw_debug_info);
+
+    if (!ctx->is_yuv) {
+        grayscale_format.image_channel_order = CL_R;
+        grayscale_format.image_channel_data_type = CL_FLOAT;
+
+        grayscale_desc = (cl_image_desc) {
+            .image_type = CL_MEM_OBJECT_IMAGE2D,
+            .image_width = outlink->w,
+            .image_height = outlink->h,
+            .image_depth = 0,
+            .image_array_size = 0,
+            .image_row_pitch = 0,
+            .image_slice_pitch = 0,
+            .num_mip_levels = 0,
+            .num_samples = 0,
+            .buffer = NULL,
+        };
+
+        ctx->grayscale = clCreateImage(
+            ctx->ocf.hwctx->context,
+            0,
+            &grayscale_format,
+            &grayscale_desc,
+            NULL,
+            &cle
+        );
+        CL_FAIL_ON_ERROR(AVERROR(EIO), "Failed to create grayscale image: %d.\n", cle);
+    }
+
+    CL_CREATE_BUFFER(ctx, harris_buf, outlink->h * outlink->w * sizeof(float));
+    CL_CREATE_BUFFER(ctx, refined_features, features_buf_size);
+    CL_CREATE_BUFFER(ctx, prev_refined_features, features_buf_size);
+    CL_CREATE_BUFFER_FLAGS(
+        ctx,
+        brief_pattern,
+        CL_MEM_READ_WRITE | CL_MEM_COPY_HOST_PTR,
+        BREIFN * sizeof(PointPair),
+        pattern_host
+    );
+    CL_CREATE_BUFFER(ctx, descriptors, descriptor_buf_size);
+    CL_CREATE_BUFFER(ctx, prev_descriptors, descriptor_buf_size);
+    CL_CREATE_BUFFER(ctx, matches, image_grid_32 * sizeof(MotionVector));
+    CL_CREATE_BUFFER(ctx, matches_contig, MATCHES_CONTIG_SIZE * sizeof(MotionVector));
+    CL_CREATE_BUFFER(ctx, transform_y, 9 * sizeof(float));
+    CL_CREATE_BUFFER(ctx, transform_uv, 9 * sizeof(float));
+    if (ctx->debug_on) {
+        CL_CREATE_BUFFER(ctx, debug_matches, MATCHES_CONTIG_SIZE * sizeof(MotionVector));
+        CL_CREATE_BUFFER(ctx, debug_model_matches, 3 * sizeof(MotionVector));
+    }
+
+    ctx->initialized = 1;
+    av_freep(&pattern_host);
+
+    return 0;
+
+fail:
+    av_freep(&pattern_host);
+    return err;
+}
+
+// Logs debug information about the transform data
+static void transform_debug(AVFilterContext *avctx, float *new_vals, float *old_vals, int curr_frame) {
+    av_log(avctx, AV_LOG_VERBOSE,
+        "Frame %d:\n"
+        "\tframe moved from: %f x, %f y\n"
+        "\t              to: %f x, %f y\n"
+        "\t    rotated from: %f degrees\n"
+        "\t              to: %f degrees\n"
+        "\t     scaled from: %f x, %f y\n"
+        "\t              to: %f x, %f y\n"
+        "\n"
+        "\tframe moved by: %f x, %f y\n"
+        "\t    rotated by: %f degrees\n"
+        "\t     scaled by: %f x, %f y\n",
+        curr_frame,
+        old_vals[RingbufX], old_vals[RingbufY],
+        new_vals[RingbufX], new_vals[RingbufY],
+        old_vals[RingbufRot] * (180.0 / M_PI),
+        new_vals[RingbufRot] * (180.0 / M_PI),
+        old_vals[RingbufScaleX], old_vals[RingbufScaleY],
+        new_vals[RingbufScaleX], new_vals[RingbufScaleY],
+        old_vals[RingbufX] - new_vals[RingbufX], old_vals[RingbufY] - new_vals[RingbufY],
+        old_vals[RingbufRot] * (180.0 / M_PI) - new_vals[RingbufRot] * (180.0 / M_PI),
+        new_vals[RingbufScaleX] / old_vals[RingbufScaleX], new_vals[RingbufScaleY] / old_vals[RingbufScaleY]
+    );
+}
+
+// Uses the buffered motion information to determine a transform that smooths the
+// given frame and applies it
+static int filter_frame(AVFilterLink *link, AVFrame *input_frame)
+{
+    AVFilterContext *avctx = link->dst;
+    AVFilterLink *outlink = avctx->outputs[0];
+    DeshakeOpenCLContext *deshake_ctx = avctx->priv;
+    AVFrame *cropped_frame = NULL, *transformed_frame = NULL;
+    int err;
+    cl_int cle;
+    float new_vals[RingbufCount];
+    float old_vals[RingbufCount];
+    // Luma (in the case of YUV) transform, or just the transform in the case of RGB
+    float transform_y[9];
+    // Chroma transform
+    float transform_uv[9];
+    // Luma crop transform (or RGB)
+    float transform_crop_y[9];
+    // Chroma crop transform
+    float transform_crop_uv[9];
+    float transform_debug_rgb[9];
+    size_t global_work[2];
+    int64_t duration;
+    cl_mem src, transformed, dst;
+    cl_mem transforms[3];
+    CropInfo crops[3];
+    cl_event transform_event, crop_upscale_event;
+    DebugMatches debug_matches;
+    cl_int num_model_matches;
+
+    const float center_w = (float)input_frame->width / 2;
+    const float center_h = (float)input_frame->height / 2;
+
+    const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(deshake_ctx->sw_format);
+    const int chroma_width  = AV_CEIL_RSHIFT(input_frame->width, desc->log2_chroma_w);
+    const int chroma_height = AV_CEIL_RSHIFT(input_frame->height, desc->log2_chroma_h);
+
+    const float center_w_chroma = (float)chroma_width / 2;
+    const float center_h_chroma = (float)chroma_height / 2;
+
+    const float luma_w_over_chroma_w = ((float)input_frame->width / (float)chroma_width);
+    const float luma_h_over_chroma_h = ((float)input_frame->height / (float)chroma_height);
+
+    if (deshake_ctx->debug_on) {
+        av_fifo_generic_read(
+            deshake_ctx->abs_motion.debug_matches,
+            &debug_matches,
+            sizeof(DebugMatches),
+            NULL
+        );
+    }
+
+    if (input_frame->pkt_duration) {
+        duration = input_frame->pkt_duration;
+    } else {
+        duration = av_rescale_q(1, av_inv_q(outlink->frame_rate), outlink->time_base);
+    }
+    deshake_ctx->duration = input_frame->pts + duration;
+
+    // Get the absolute transform data for this frame
+    for (int i = 0; i < RingbufCount; i++) {
+        av_fifo_generic_peek_at(
+            deshake_ctx->abs_motion.ringbuffers[i],
+            &old_vals[i],
+            deshake_ctx->abs_motion.curr_frame_offset * sizeof(float),
+            sizeof(float),
+            NULL
+        );
+    }
+
+    if (deshake_ctx->tripod_mode) {
+        // If tripod mode is turned on we simply undo all motion relative to the
+        // first frame
+
+        new_vals[RingbufX] = 0.0f;
+        new_vals[RingbufY] = 0.0f;
+        new_vals[RingbufRot] = 0.0f;
+        new_vals[RingbufScaleX] = 1.0f;
+        new_vals[RingbufScaleY] = 1.0f;
+    } else {
+        // Tripod mode is off and we need to smooth a moving camera
+
+        new_vals[RingbufX] = smooth(
+            deshake_ctx,
+            deshake_ctx->gauss_kernel,
+            deshake_ctx->smooth_window,
+            input_frame->width,
+            deshake_ctx->abs_motion.ringbuffers[RingbufX]
+        );
+        new_vals[RingbufY] = smooth(
+            deshake_ctx,
+            deshake_ctx->gauss_kernel,
+            deshake_ctx->smooth_window,
+            input_frame->height,
+            deshake_ctx->abs_motion.ringbuffers[RingbufY]
+        );
+        new_vals[RingbufRot] = smooth(
+            deshake_ctx,
+            deshake_ctx->gauss_kernel,
+            deshake_ctx->smooth_window,
+            M_PI / 4,
+            deshake_ctx->abs_motion.ringbuffers[RingbufRot]
+        );
+        new_vals[RingbufScaleX] = smooth(
+            deshake_ctx,
+            deshake_ctx->gauss_kernel,
+            deshake_ctx->smooth_window,
+            2.0f,
+            deshake_ctx->abs_motion.ringbuffers[RingbufScaleX]
+        );
+        new_vals[RingbufScaleY] = smooth(
+            deshake_ctx,
+            deshake_ctx->gauss_kernel,
+            deshake_ctx->smooth_window,
+            2.0f,
+            deshake_ctx->abs_motion.ringbuffers[RingbufScaleY]
+        );
+    }
+
+    transform_center_scale(
+        old_vals[RingbufX] - new_vals[RingbufX],
+        old_vals[RingbufY] - new_vals[RingbufY],
+        old_vals[RingbufRot] - new_vals[RingbufRot],
+        new_vals[RingbufScaleX] / old_vals[RingbufScaleX],
+        new_vals[RingbufScaleY] / old_vals[RingbufScaleY],
+        center_w,
+        center_h,
+        transform_y
+    );
+
+    transform_center_scale(
+        (old_vals[RingbufX] - new_vals[RingbufX]) / luma_w_over_chroma_w,
+        (old_vals[RingbufY] - new_vals[RingbufY]) / luma_h_over_chroma_h,
+        old_vals[RingbufRot] - new_vals[RingbufRot],
+        new_vals[RingbufScaleX] / old_vals[RingbufScaleX],
+        new_vals[RingbufScaleY] / old_vals[RingbufScaleY],
+        center_w_chroma,
+        center_h_chroma,
+        transform_uv
+    );
+
+    CL_BLOCKING_WRITE_BUFFER(deshake_ctx->command_queue, deshake_ctx->transform_y, 9 * sizeof(float), transform_y, NULL);
+    CL_BLOCKING_WRITE_BUFFER(deshake_ctx->command_queue, deshake_ctx->transform_uv, 9 * sizeof(float), transform_uv, NULL);
+
+    if (deshake_ctx->debug_on)
+        transform_debug(avctx, new_vals, old_vals, deshake_ctx->curr_frame);
+
+    cropped_frame = ff_get_video_buffer(outlink, outlink->w, outlink->h);
+    if (!cropped_frame) {
+        err = AVERROR(ENOMEM);
+        goto fail;
+    }
+
+    transformed_frame = ff_get_video_buffer(outlink, outlink->w, outlink->h);
+    if (!transformed_frame) {
+        err = AVERROR(ENOMEM);
+        goto fail;
+    }
+
+    transforms[0] = deshake_ctx->transform_y;
+    transforms[1] = transforms[2] = deshake_ctx->transform_uv;
+
+    for (int p = 0; p < FF_ARRAY_ELEMS(transformed_frame->data); p++) {
+        // Transform all of the planes appropriately
+        src = (cl_mem)input_frame->data[p];
+        transformed = (cl_mem)transformed_frame->data[p];
+
+        if (!transformed)
+            break;
+
+        err = ff_opencl_filter_work_size_from_image(avctx, global_work, input_frame, p, 0);
+        if (err < 0)
+            goto fail;
+
+        CL_RUN_KERNEL_WITH_ARGS(
+            deshake_ctx->command_queue,
+            deshake_ctx->kernel_transform,
+            global_work,
+            NULL,
+            &transform_event,
+            { sizeof(cl_mem), &src },
+            { sizeof(cl_mem), &transformed },
+            { sizeof(cl_mem), &transforms[p] },
+        );
+    }
+
+    if (deshake_ctx->debug_on && !deshake_ctx->is_yuv && debug_matches.num_matches > 0) {
+        CL_BLOCKING_WRITE_BUFFER(
+            deshake_ctx->command_queue,
+            deshake_ctx->debug_matches,
+            debug_matches.num_matches * sizeof(MotionVector),
+            debug_matches.matches,
+            NULL
+        );
+
+        CL_BLOCKING_WRITE_BUFFER(
+            deshake_ctx->command_queue,
+            deshake_ctx->debug_model_matches,
+            debug_matches.num_model_matches * sizeof(MotionVector),
+            debug_matches.model_matches,
+            NULL
+        );
+
+        num_model_matches = debug_matches.num_model_matches;
+
+        // Invert the transform
+        transform_center_scale(
+            new_vals[RingbufX] - old_vals[RingbufX],
+            new_vals[RingbufY] - old_vals[RingbufY],
+            new_vals[RingbufRot] - old_vals[RingbufRot],
+            old_vals[RingbufScaleX] / new_vals[RingbufScaleX],
+            old_vals[RingbufScaleY] / new_vals[RingbufScaleY],
+            center_w,
+            center_h,
+            transform_debug_rgb
+        );
+
+        CL_BLOCKING_WRITE_BUFFER(deshake_ctx->command_queue, deshake_ctx->transform_y, 9 * sizeof(float), transform_debug_rgb, NULL);
+
+        transformed = (cl_mem)transformed_frame->data[0];
+        CL_RUN_KERNEL_WITH_ARGS(
+            deshake_ctx->command_queue,
+            deshake_ctx->kernel_draw_debug_info,
+            (size_t[]){ debug_matches.num_matches },
+            NULL,
+            NULL,
+            { sizeof(cl_mem), &transformed },
+            { sizeof(cl_mem), &deshake_ctx->debug_matches },
+            { sizeof(cl_mem), &deshake_ctx->debug_model_matches },
+            { sizeof(cl_int), &num_model_matches },
+            { sizeof(cl_mem), &deshake_ctx->transform_y }
+        );
+    }
+
+    if (deshake_ctx->should_crop) {
+        // Generate transforms for cropping
+        transform_center_scale(
+            (old_vals[RingbufX] - new_vals[RingbufX]) / 5,
+            (old_vals[RingbufY] - new_vals[RingbufY]) / 5,
+            (old_vals[RingbufRot] - new_vals[RingbufRot]) / 5,
+            new_vals[RingbufScaleX] / old_vals[RingbufScaleX],
+            new_vals[RingbufScaleY] / old_vals[RingbufScaleY],
+            center_w,
+            center_h,
+            transform_crop_y
+        );
+        update_needed_crop(&deshake_ctx->crop_y, transform_crop_y, input_frame->width, input_frame->height);
+
+        transform_center_scale(
+            (old_vals[RingbufX] - new_vals[RingbufX]) / (5 * luma_w_over_chroma_w),
+            (old_vals[RingbufY] - new_vals[RingbufY]) / (5 * luma_h_over_chroma_h),
+            (old_vals[RingbufRot] - new_vals[RingbufRot]) / 5,
+            new_vals[RingbufScaleX] / old_vals[RingbufScaleX],
+            new_vals[RingbufScaleY] / old_vals[RingbufScaleY],
+            center_w_chroma,
+            center_h_chroma,
+            transform_crop_uv
+        );
+        update_needed_crop(&deshake_ctx->crop_uv, transform_crop_uv, chroma_width, chroma_height);
+
+        crops[0] = deshake_ctx->crop_y;
+        crops[1] = crops[2] = deshake_ctx->crop_uv;
+
+        for (int p = 0; p < FF_ARRAY_ELEMS(cropped_frame->data); p++) {
+            // Crop all of the planes appropriately
+            dst = (cl_mem)cropped_frame->data[p];
+            transformed = (cl_mem)transformed_frame->data[p];
+
+            if (!dst)
+                break;
+
+            err = ff_opencl_filter_work_size_from_image(avctx, global_work, input_frame, p, 0);
+            if (err < 0)
+                goto fail;
+
+            CL_RUN_KERNEL_WITH_ARGS(
+                deshake_ctx->command_queue,
+                deshake_ctx->kernel_crop_upscale,
+                global_work,
+                NULL,
+                &crop_upscale_event,
+                { sizeof(cl_mem), &transformed },
+                { sizeof(cl_mem), &dst },
+                { sizeof(cl_float2), &crops[p].top_left },
+                { sizeof(cl_float2), &crops[p].bottom_right },
+            );
+        }
+    }
+
+    if (deshake_ctx->curr_frame < deshake_ctx->smooth_window / 2) {
+        // This means we are somewhere at the start of the video. We need to
+        // increment the current frame offset until it reaches the center of
+        // the ringbuffers (as the current frame will be located there for
+        // the rest of the video).
+        //
+        // The end of the video is taken care of by draining motion data
+        // one-by-one out of the buffer, causing the (at that point fixed)
+        // offset to move towards later frames' data.
+        ++deshake_ctx->abs_motion.curr_frame_offset;
+    }
+
+    if (deshake_ctx->abs_motion.data_end_offset != -1) {
+        // Keep the end offset in sync with the frame it's supposed to be
+        // positioned at
+        --deshake_ctx->abs_motion.data_end_offset;
+
+        if (deshake_ctx->abs_motion.data_end_offset == deshake_ctx->abs_motion.curr_frame_offset - 1) {
+            // The end offset would be the start of the new video sequence; flip to
+            // start offset
+            deshake_ctx->abs_motion.data_end_offset = -1;
+            deshake_ctx->abs_motion.data_start_offset = deshake_ctx->abs_motion.curr_frame_offset;
+        }
+    } else if (deshake_ctx->abs_motion.data_start_offset != -1) {
+        // Keep the start offset in sync with the frame it's supposed to be
+        // positioned at
+        --deshake_ctx->abs_motion.data_start_offset;
+    }
+
+    if (deshake_ctx->debug_on) {
+        deshake_ctx->transform_time += ff_opencl_get_event_time(transform_event);
+        if (deshake_ctx->should_crop) {
+            deshake_ctx->crop_upscale_time += ff_opencl_get_event_time(crop_upscale_event);
+        }
+    }
+
+    ++deshake_ctx->curr_frame;
+
+    if (deshake_ctx->debug_on)
+        av_freep(&debug_matches.matches);
+
+    if (deshake_ctx->should_crop) {
+        err = av_frame_copy_props(cropped_frame, input_frame);
+        if (err < 0)
+            goto fail;
+
+        av_frame_free(&transformed_frame);
+        av_frame_free(&input_frame);
+        return ff_filter_frame(outlink, cropped_frame);
+
+    } else {
+        err = av_frame_copy_props(transformed_frame, input_frame);
+        if (err < 0)
+            goto fail;
+
+        av_frame_free(&cropped_frame);
+        av_frame_free(&input_frame);
+        return ff_filter_frame(outlink, transformed_frame);
+    }
+
+fail:
+    clFinish(deshake_ctx->command_queue);
+
+    if (deshake_ctx->debug_on)
+        if (debug_matches.matches)
+            av_freep(&debug_matches.matches);
+
+    av_frame_free(&input_frame);
+    av_frame_free(&transformed_frame);
+    av_frame_free(&cropped_frame);
+    return err;
+}
+
+// Add the given frame to the frame queue to eventually be processed.
+//
+// Also determines the motion from the previous frame and updates the stored
+// motion information accordingly.
+static int queue_frame(AVFilterLink *link, AVFrame *input_frame)
+{
+    AVFilterContext *avctx = link->dst;
+    DeshakeOpenCLContext *deshake_ctx = avctx->priv;
+    int err;
+    int num_vectors;
+    int num_inliers = 0;
+    cl_int cle;
+    FrameDelta relative;
+    SimilarityMatrix model;
+    size_t global_work[2];
+    size_t harris_global_work[2];
+    size_t grid_32_global_work[2];
+    int grid_32_h, grid_32_w;
+    size_t local_work[2];
+    cl_mem src, temp;
+    float prev_vals[5];
+    float new_vals[5];
+    cl_event grayscale_event, harris_response_event, refine_features_event,
+             brief_event, match_descriptors_event, read_buf_event;
+    DebugMatches debug_matches;
+
+    num_vectors = 0;
+
+    local_work[0] = 8;
+    local_work[1] = 8;
+
+    err = ff_opencl_filter_work_size_from_image(avctx, global_work, input_frame, 0, 0);
+    if (err < 0)
+        goto fail;
+
+    err = ff_opencl_filter_work_size_from_image(avctx, harris_global_work, input_frame, 0, 8);
+    if (err < 0)
+        goto fail;
+
+    err = ff_opencl_filter_work_size_from_image(avctx, grid_32_global_work, input_frame, 0, 32);
+    if (err < 0)
+        goto fail;
+
+    // We want a single work-item for each 32x32 block of pixels in the input frame
+    grid_32_global_work[0] /= 32;
+    grid_32_global_work[1] /= 32;
+
+    grid_32_h = ROUNDED_UP_DIV(input_frame->height, 32);
+    grid_32_w = ROUNDED_UP_DIV(input_frame->width, 32);
+
+    if (deshake_ctx->is_yuv) {
+        deshake_ctx->grayscale = (cl_mem)input_frame->data[0];
+    } else {
+        src = (cl_mem)input_frame->data[0];
+
+        CL_RUN_KERNEL_WITH_ARGS(
+            deshake_ctx->command_queue,
+            deshake_ctx->kernel_grayscale,
+            global_work,
+            NULL,
+            &grayscale_event,
+            { sizeof(cl_mem), &src },
+            { sizeof(cl_mem), &deshake_ctx->grayscale }
+        );
+    }
+
+    CL_RUN_KERNEL_WITH_ARGS(
+        deshake_ctx->command_queue,
+        deshake_ctx->kernel_harris_response,
+        harris_global_work,
+        local_work,
+        &harris_response_event,
+        { sizeof(cl_mem), &deshake_ctx->grayscale },
+        { sizeof(cl_mem), &deshake_ctx->harris_buf }
+    );
+
+    CL_RUN_KERNEL_WITH_ARGS(
+        deshake_ctx->command_queue,
+        deshake_ctx->kernel_refine_features,
+        grid_32_global_work,
+        NULL,
+        &refine_features_event,
+        { sizeof(cl_mem), &deshake_ctx->grayscale },
+        { sizeof(cl_mem), &deshake_ctx->harris_buf },
+        { sizeof(cl_mem), &deshake_ctx->refined_features },
+        { sizeof(cl_int), &deshake_ctx->refine_features }
+    );
+
+    CL_RUN_KERNEL_WITH_ARGS(
+        deshake_ctx->command_queue,
+        deshake_ctx->kernel_brief_descriptors,
+        grid_32_global_work,
+        NULL,
+        &brief_event,
+        { sizeof(cl_mem), &deshake_ctx->grayscale },
+        { sizeof(cl_mem), &deshake_ctx->refined_features },
+        { sizeof(cl_mem), &deshake_ctx->descriptors },
+        { sizeof(cl_mem), &deshake_ctx->brief_pattern}
+    );
+
+    if (av_fifo_size(deshake_ctx->abs_motion.ringbuffers[RingbufX]) == 0) {
+        // This is the first frame we've been given to queue, meaning there is
+        // no previous frame to match descriptors to
+
+        goto no_motion_data;
+    }
+
+    CL_RUN_KERNEL_WITH_ARGS(
+        deshake_ctx->command_queue,
+        deshake_ctx->kernel_match_descriptors,
+        grid_32_global_work,
+        NULL,
+        &match_descriptors_event,
+        { sizeof(cl_mem), &deshake_ctx->prev_refined_features },
+        { sizeof(cl_mem), &deshake_ctx->refined_features },
+        { sizeof(cl_mem), &deshake_ctx->descriptors },
+        { sizeof(cl_mem), &deshake_ctx->prev_descriptors },
+        { sizeof(cl_mem), &deshake_ctx->matches }
+    );
+
+    cle = clEnqueueReadBuffer(
+        deshake_ctx->command_queue,
+        deshake_ctx->matches,
+        CL_TRUE,
+        0,
+        grid_32_h * grid_32_w * sizeof(MotionVector),
+        deshake_ctx->matches_host,
+        0,
+        NULL,
+        &read_buf_event
+    );
+    CL_FAIL_ON_ERROR(AVERROR(EIO), "Failed to read matches to host: %d.\n", cle);
+
+    num_vectors = make_vectors_contig(deshake_ctx, grid_32_h, grid_32_w);
+
+    if (num_vectors < 10) {
+        // Not enough matches to get reliable motion data for this frame
+        //
+        // From this point on all data is relative to this frame rather than the
+        // original frame. We have to make sure that we don't mix values that were
+        // relative to the original frame with the new values relative to this
+        // frame when doing the gaussian smoothing. We keep track of where the old
+        // values end using this data_end_offset field in order to accomplish
+        // that goal.
+        //
+        // If no motion data is present for multiple frames in a short window of
+        // time, we leave the end where it was to avoid mixing 0s in with the
+        // old data (and just treat them all as part of the new values)
+        if (deshake_ctx->abs_motion.data_end_offset == -1) {
+            deshake_ctx->abs_motion.data_end_offset =
+                av_fifo_size(deshake_ctx->abs_motion.ringbuffers[RingbufX]) / sizeof(float) - 1;
+        }
+
+        goto no_motion_data;
+    }
+
+    if (!estimate_affine_2d(
+        deshake_ctx,
+        deshake_ctx->matches_contig_host,
+        &debug_matches,
+        num_vectors,
+        model.matrix,
+        10.0,
+        3000,
+        0.999999999999
+    )) {
+        goto no_motion_data;
+    }
+
+    for (int i = 0; i < num_vectors; i++) {
+        if (deshake_ctx->matches_contig_host[i].should_consider) {
+            deshake_ctx->inliers[num_inliers] = deshake_ctx->matches_contig_host[i];
+            num_inliers++;
+        }
+    }
+
+    if (!minimize_error(
+        deshake_ctx,
+        deshake_ctx->inliers,
+        &debug_matches,
+        num_inliers,
+        model.matrix,
+        400
+    )) {
+        goto no_motion_data;
+    }
+
+
+    relative = decompose_transform(model.matrix);
+
+    // Get the absolute transform data for the previous frame
+    for (int i = 0; i < RingbufCount; i++) {
+        av_fifo_generic_peek_at(
+            deshake_ctx->abs_motion.ringbuffers[i],
+            &prev_vals[i],
+            av_fifo_size(deshake_ctx->abs_motion.ringbuffers[i]) - sizeof(float),
+            sizeof(float),
+            NULL
+        );
+    }
+
+    new_vals[RingbufX]      = prev_vals[RingbufX] + relative.translation.s[0];
+    new_vals[RingbufY]      = prev_vals[RingbufY] + relative.translation.s[1];
+    new_vals[RingbufRot]    = prev_vals[RingbufRot] + relative.rotation;
+    new_vals[RingbufScaleX] = prev_vals[RingbufScaleX] / relative.scale.s[0];
+    new_vals[RingbufScaleY] = prev_vals[RingbufScaleY] / relative.scale.s[1];
+
+    if (deshake_ctx->debug_on) {
+        if (!deshake_ctx->is_yuv) {
+            deshake_ctx->grayscale_time     += ff_opencl_get_event_time(grayscale_event);
+        }
+        deshake_ctx->harris_response_time   += ff_opencl_get_event_time(harris_response_event);
+        deshake_ctx->refine_features_time   += ff_opencl_get_event_time(refine_features_event);
+        deshake_ctx->brief_descriptors_time += ff_opencl_get_event_time(brief_event);
+        deshake_ctx->match_descriptors_time += ff_opencl_get_event_time(match_descriptors_event);
+        deshake_ctx->read_buf_time          += ff_opencl_get_event_time(read_buf_event);
+    }
+
+    goto end;
+
+no_motion_data:
+    new_vals[RingbufX]      = 0.0f;
+    new_vals[RingbufY]      = 0.0f;
+    new_vals[RingbufRot]    = 0.0f;
+    new_vals[RingbufScaleX] = 1.0f;
+    new_vals[RingbufScaleY] = 1.0f;
+
+    for (int i = 0; i < num_vectors; i++) {
+        deshake_ctx->matches_contig_host[i].should_consider = 0;
+    }
+    debug_matches.num_model_matches = 0;
+
+    if (deshake_ctx->debug_on) {
+        av_log(avctx, AV_LOG_VERBOSE,
+            "\n[ALERT] No motion data found in queue_frame, motion reset to 0\n\n"
+        );
+    }
+
+    goto end;
+
+end:
+    // Swap the descriptor buffers (we don't need the previous frame's descriptors
+    // again so we will use that space for the next frame's descriptors)
+    temp = deshake_ctx->prev_descriptors;
+    deshake_ctx->prev_descriptors = deshake_ctx->descriptors;
+    deshake_ctx->descriptors = temp;
+
+    // Same for the refined features
+    temp = deshake_ctx->prev_refined_features;
+    deshake_ctx->prev_refined_features = deshake_ctx->refined_features;
+    deshake_ctx->refined_features = temp;
+
+    if (deshake_ctx->debug_on) {
+        if (num_vectors == 0) {
+            debug_matches.matches = NULL;
+        } else {
+            debug_matches.matches = av_malloc_array(num_vectors, sizeof(MotionVector));
+
+            if (!debug_matches.matches) {
+                err = AVERROR(ENOMEM);
+                goto fail;
+            }
+        }
+
+        for (int i = 0; i < num_vectors; i++) {
+            debug_matches.matches[i] = deshake_ctx->matches_contig_host[i];
+        }
+        debug_matches.num_matches = num_vectors;
+
+        av_fifo_generic_write(
+            deshake_ctx->abs_motion.debug_matches,
+            &debug_matches,
+            sizeof(DebugMatches),
+            NULL
+        );
+    }
+
+    for (int i = 0; i < RingbufCount; i++) {
+        av_fifo_generic_write(
+            deshake_ctx->abs_motion.ringbuffers[i],
+            &new_vals[i],
+            sizeof(float),
+            NULL
+        );
+    }
+
+    return ff_framequeue_add(&deshake_ctx->fq, input_frame);
+
+fail:
+    clFinish(deshake_ctx->command_queue);
+    av_frame_free(&input_frame);
+    return err;
+}
+
+static int activate(AVFilterContext *ctx)
+{
+    AVFilterLink *inlink = ctx->inputs[0];
+    AVFilterLink *outlink = ctx->outputs[0];
+    DeshakeOpenCLContext *deshake_ctx = ctx->priv;
+    AVFrame *frame = NULL;
+    int ret, status;
+    int64_t pts;
+
+    FF_FILTER_FORWARD_STATUS_BACK(outlink, inlink);
+
+    if (!deshake_ctx->eof) {
+        ret = ff_inlink_consume_frame(inlink, &frame);
+        if (ret < 0)
+            return ret;
+        if (ret > 0) {
+            if (!frame->hw_frames_ctx)
+                return AVERROR(EINVAL);
+
+            if (!deshake_ctx->initialized) {
+                ret = deshake_opencl_init(ctx);
+                if (ret < 0)
+                    return ret;
+            }
+
+            // If there is no more space in the ringbuffers, remove the oldest
+            // values to make room for the new ones
+            if (av_fifo_space(deshake_ctx->abs_motion.ringbuffers[RingbufX]) == 0) {
+                for (int i = 0; i < RingbufCount; i++) {
+                    av_fifo_drain(deshake_ctx->abs_motion.ringbuffers[i], sizeof(float));
+                }
+            }
+            ret = queue_frame(inlink, frame);
+            if (ret < 0)
+                return ret;
+            if (ret >= 0) {
+                // See if we have enough buffered frames to process one
+                //
+                // "enough" is half the smooth window of queued frames into the future
+                if (ff_framequeue_queued_frames(&deshake_ctx->fq) >= deshake_ctx->smooth_window / 2) {
+                    return filter_frame(inlink, ff_framequeue_take(&deshake_ctx->fq));
+                }
+            }
+        }
+    }
+
+    if (!deshake_ctx->eof && ff_inlink_acknowledge_status(inlink, &status, &pts)) {
+        if (status == AVERROR_EOF) {
+            deshake_ctx->eof = 1;
+        }
+    }
+
+    if (deshake_ctx->eof) {
+        // Finish processing the rest of the frames in the queue.
+        while(ff_framequeue_queued_frames(&deshake_ctx->fq) != 0) {
+            for (int i = 0; i < RingbufCount; i++) {
+                av_fifo_drain(deshake_ctx->abs_motion.ringbuffers[i], sizeof(float));
+            }
+
+            ret = filter_frame(inlink, ff_framequeue_take(&deshake_ctx->fq));
+            if (ret < 0) {
+                return ret;
+            }
+        }
+
+        if (deshake_ctx->debug_on) {
+            av_log(ctx, AV_LOG_VERBOSE,
+                "Average kernel execution times:\n"
+                "\t        grayscale: %0.3f ms\n"
+                "\t  harris_response: %0.3f ms\n"
+                "\t  refine_features: %0.3f ms\n"
+                "\tbrief_descriptors: %0.3f ms\n"
+                "\tmatch_descriptors: %0.3f ms\n"
+                "\t        transform: %0.3f ms\n"
+                "\t     crop_upscale: %0.3f ms\n"
+                "Average buffer read times:\n"
+                "\t     features buf: %0.3f ms\n",
+                averaged_event_time_ms(deshake_ctx->grayscale_time, deshake_ctx->curr_frame),
+                averaged_event_time_ms(deshake_ctx->harris_response_time, deshake_ctx->curr_frame),
+                averaged_event_time_ms(deshake_ctx->refine_features_time, deshake_ctx->curr_frame),
+                averaged_event_time_ms(deshake_ctx->brief_descriptors_time, deshake_ctx->curr_frame),
+                averaged_event_time_ms(deshake_ctx->match_descriptors_time, deshake_ctx->curr_frame),
+                averaged_event_time_ms(deshake_ctx->transform_time, deshake_ctx->curr_frame),
+                averaged_event_time_ms(deshake_ctx->crop_upscale_time, deshake_ctx->curr_frame),
+                averaged_event_time_ms(deshake_ctx->read_buf_time, deshake_ctx->curr_frame)
+            );
+        }
+
+        ff_outlink_set_status(outlink, AVERROR_EOF, deshake_ctx->duration);
+        return 0;
+    }
+
+    if (!deshake_ctx->eof) {
+        FF_FILTER_FORWARD_WANTED(outlink, inlink);
+    }
+
+    return FFERROR_NOT_READY;
+}
+
+static const AVFilterPad deshake_opencl_inputs[] = {
+    {
+        .name = "default",
+        .type = AVMEDIA_TYPE_VIDEO,
+        .config_props = &ff_opencl_filter_config_input,
+    },
+    { NULL }
+};
+
+static const AVFilterPad deshake_opencl_outputs[] = {
+    {
+        .name = "default",
+        .type = AVMEDIA_TYPE_VIDEO,
+        .config_props = &ff_opencl_filter_config_output,
+    },
+    { NULL }
+};
+
+#define OFFSET(x) offsetof(DeshakeOpenCLContext, x)
+#define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM
+
+static const AVOption deshake_opencl_options[] = {
+    {
+        "tripod", "simulates a tripod by preventing any camera movement whatsoever "
+        "from the original frame",
+        OFFSET(tripod_mode), AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, FLAGS
+    },
+    {
+        "debug", "turn on additional debugging information",
+        OFFSET(debug_on), AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, FLAGS
+    },
+    {
+        "adaptive_crop", "attempt to subtly crop borders to reduce mirrored content",
+        OFFSET(should_crop), AV_OPT_TYPE_BOOL, {.i64 = 1}, 0, 1, FLAGS
+    },
+    {
+        "refine_features", "refine feature point locations at a sub-pixel level",
+        OFFSET(refine_features), AV_OPT_TYPE_BOOL, {.i64 = 1}, 0, 1, FLAGS
+    },
+    {
+        "smooth_strength", "smoothing strength (0 attempts to adaptively determine optimal strength)",
+        OFFSET(smooth_percent), AV_OPT_TYPE_FLOAT, {.dbl = 0.0f}, 0.0f, 1.0f, FLAGS
+    },
+    {
+        "smooth_window_multiplier", "multiplier for number of frames to buffer for motion data",
+        OFFSET(smooth_window_multiplier), AV_OPT_TYPE_FLOAT, {.dbl = 2.0}, 0.1, 10.0, FLAGS
+    },
+    { NULL }
+};
+
+AVFILTER_DEFINE_CLASS(deshake_opencl);
+
+AVFilter ff_vf_deshake_opencl = {
+    .name           = "deshake_opencl",
+    .description    = NULL_IF_CONFIG_SMALL("Feature-point based video stabilization filter"),
+    .priv_size      = sizeof(DeshakeOpenCLContext),
+    .priv_class     = &deshake_opencl_class,
+    .init           = &ff_opencl_filter_init,
+    .uninit         = &deshake_opencl_uninit,
+    .query_formats  = &ff_opencl_filter_query_formats,
+    .activate       = activate,
+    .inputs         = deshake_opencl_inputs,
+    .outputs        = deshake_opencl_outputs,
+    .flags_internal = FF_FILTER_FLAG_HWFRAME_AWARE
+};
diff --git a/libavfilter/vf_detelecine.c b/libavfilter/vf_detelecine.c
index 0d1e2f2..0199214 100644
--- a/libavfilter/vf_detelecine.c
+++ b/libavfilter/vf_detelecine.c
@@ -206,6 +206,7 @@
 
     if (s->nskip_fields >= 2) {
         s->nskip_fields -= 2;
+        av_frame_free(&inpicref);
         return 0;
     } else if (s->nskip_fields >= 1) {
         for (i = 0; i < s->nb_planes; i++) {
@@ -216,6 +217,7 @@
         }
         s->occupied = 1;
         s->nskip_fields--;
+        av_frame_free(&inpicref);
         return 0;
     }
 
diff --git a/libavfilter/vf_displace.c b/libavfilter/vf_displace.c
index 768af6d..e4c0330 100644
--- a/libavfilter/vf_displace.c
+++ b/libavfilter/vf_displace.c
@@ -265,7 +265,7 @@
 
         s->displace(s, in, xpic, ypic, out);
     }
-    out->pts = av_rescale_q(in->pts, s->fs.time_base, outlink->time_base);
+    out->pts = av_rescale_q(s->fs.pts, s->fs.time_base, outlink->time_base);
 
     return ff_filter_frame(outlink, out);
 }
@@ -332,7 +332,6 @@
 
     outlink->w = srclink->w;
     outlink->h = srclink->h;
-    outlink->time_base = srclink->time_base;
     outlink->sample_aspect_ratio = srclink->sample_aspect_ratio;
     outlink->frame_rate = srclink->frame_rate;
 
@@ -356,7 +355,10 @@
     s->fs.opaque   = s;
     s->fs.on_event = process_frame;
 
-    return ff_framesync_configure(&s->fs);
+    ret = ff_framesync_configure(&s->fs);
+    outlink->time_base = s->fs.time_base;
+
+    return ret;
 }
 
 static int activate(AVFilterContext *ctx)
diff --git a/libavfilter/vf_dnn_processing.c b/libavfilter/vf_dnn_processing.c
new file mode 100644
index 0000000..cf589ac
--- /dev/null
+++ b/libavfilter/vf_dnn_processing.c
@@ -0,0 +1,520 @@
+/*
+ * Copyright (c) 2019 Guo Yejun
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file
+ * implementing a generic image processing filter using deep learning networks.
+ */
+
+#include "libavformat/avio.h"
+#include "libavutil/opt.h"
+#include "libavutil/pixdesc.h"
+#include "libavutil/avassert.h"
+#include "libavutil/imgutils.h"
+#include "avfilter.h"
+#include "dnn_interface.h"
+#include "formats.h"
+#include "internal.h"
+#include "libswscale/swscale.h"
+
+typedef struct DnnProcessingContext {
+    const AVClass *class;
+
+    char *model_filename;
+    DNNBackendType backend_type;
+    char *model_inputname;
+    char *model_outputname;
+
+    DNNModule *dnn_module;
+    DNNModel *model;
+
+    // input & output of the model at execution time
+    DNNData input;
+    DNNData output;
+
+    struct SwsContext *sws_gray8_to_grayf32;
+    struct SwsContext *sws_grayf32_to_gray8;
+    struct SwsContext *sws_uv_scale;
+    int sws_uv_height;
+} DnnProcessingContext;
+
+#define OFFSET(x) offsetof(DnnProcessingContext, x)
+#define FLAGS AV_OPT_FLAG_FILTERING_PARAM | AV_OPT_FLAG_VIDEO_PARAM
+static const AVOption dnn_processing_options[] = {
+    { "dnn_backend", "DNN backend",                OFFSET(backend_type),     AV_OPT_TYPE_INT,       { .i64 = 0 },    0, 1, FLAGS, "backend" },
+    { "native",      "native backend flag",        0,                        AV_OPT_TYPE_CONST,     { .i64 = 0 },    0, 0, FLAGS, "backend" },
+#if (CONFIG_LIBTENSORFLOW == 1)
+    { "tensorflow",  "tensorflow backend flag",    0,                        AV_OPT_TYPE_CONST,     { .i64 = 1 },    0, 0, FLAGS, "backend" },
+#endif
+    { "model",       "path to model file",         OFFSET(model_filename),   AV_OPT_TYPE_STRING,    { .str = NULL }, 0, 0, FLAGS },
+    { "input",       "input name of the model",    OFFSET(model_inputname),  AV_OPT_TYPE_STRING,    { .str = NULL }, 0, 0, FLAGS },
+    { "output",      "output name of the model",   OFFSET(model_outputname), AV_OPT_TYPE_STRING,    { .str = NULL }, 0, 0, FLAGS },
+    { NULL }
+};
+
+AVFILTER_DEFINE_CLASS(dnn_processing);
+
+static av_cold int init(AVFilterContext *context)
+{
+    DnnProcessingContext *ctx = context->priv;
+
+    if (!ctx->model_filename) {
+        av_log(ctx, AV_LOG_ERROR, "model file for network is not specified\n");
+        return AVERROR(EINVAL);
+    }
+    if (!ctx->model_inputname) {
+        av_log(ctx, AV_LOG_ERROR, "input name of the model network is not specified\n");
+        return AVERROR(EINVAL);
+    }
+    if (!ctx->model_outputname) {
+        av_log(ctx, AV_LOG_ERROR, "output name of the model network is not specified\n");
+        return AVERROR(EINVAL);
+    }
+
+    ctx->dnn_module = ff_get_dnn_module(ctx->backend_type);
+    if (!ctx->dnn_module) {
+        av_log(ctx, AV_LOG_ERROR, "could not create DNN module for requested backend\n");
+        return AVERROR(ENOMEM);
+    }
+    if (!ctx->dnn_module->load_model) {
+        av_log(ctx, AV_LOG_ERROR, "load_model for network is not specified\n");
+        return AVERROR(EINVAL);
+    }
+
+    ctx->model = (ctx->dnn_module->load_model)(ctx->model_filename);
+    if (!ctx->model) {
+        av_log(ctx, AV_LOG_ERROR, "could not load DNN model\n");
+        return AVERROR(EINVAL);
+    }
+
+    return 0;
+}
+
+static int query_formats(AVFilterContext *context)
+{
+    static const enum AVPixelFormat pix_fmts[] = {
+        AV_PIX_FMT_RGB24, AV_PIX_FMT_BGR24,
+        AV_PIX_FMT_GRAY8, AV_PIX_FMT_GRAYF32,
+        AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUV422P,
+        AV_PIX_FMT_YUV444P, AV_PIX_FMT_YUV410P, AV_PIX_FMT_YUV411P,
+        AV_PIX_FMT_NONE
+    };
+    AVFilterFormats *fmts_list = ff_make_format_list(pix_fmts);
+    return ff_set_common_formats(context, fmts_list);
+}
+
+#define LOG_FORMAT_CHANNEL_MISMATCH()                       \
+    av_log(ctx, AV_LOG_ERROR,                               \
+           "the frame's format %s does not match "          \
+           "the model input channel %d\n",                  \
+           av_get_pix_fmt_name(fmt),                        \
+           model_input->channels);
+
+static int check_modelinput_inlink(const DNNData *model_input, const AVFilterLink *inlink)
+{
+    AVFilterContext *ctx   = inlink->dst;
+    enum AVPixelFormat fmt = inlink->format;
+
+    // the design is to add explicit scale filter before this filter
+    if (model_input->height != -1 && model_input->height != inlink->h) {
+        av_log(ctx, AV_LOG_ERROR, "the model requires frame height %d but got %d\n",
+                                   model_input->height, inlink->h);
+        return AVERROR(EIO);
+    }
+    if (model_input->width != -1 && model_input->width != inlink->w) {
+        av_log(ctx, AV_LOG_ERROR, "the model requires frame width %d but got %d\n",
+                                   model_input->width, inlink->w);
+        return AVERROR(EIO);
+    }
+
+    switch (fmt) {
+    case AV_PIX_FMT_RGB24:
+    case AV_PIX_FMT_BGR24:
+        if (model_input->channels != 3) {
+            LOG_FORMAT_CHANNEL_MISMATCH();
+            return AVERROR(EIO);
+        }
+        if (model_input->dt != DNN_FLOAT && model_input->dt != DNN_UINT8) {
+            av_log(ctx, AV_LOG_ERROR, "only support dnn models with input data type as float32 and uint8.\n");
+            return AVERROR(EIO);
+        }
+        return 0;
+    case AV_PIX_FMT_GRAY8:
+        if (model_input->channels != 1) {
+            LOG_FORMAT_CHANNEL_MISMATCH();
+            return AVERROR(EIO);
+        }
+        if (model_input->dt != DNN_UINT8) {
+            av_log(ctx, AV_LOG_ERROR, "only support dnn models with input data type uint8.\n");
+            return AVERROR(EIO);
+        }
+        return 0;
+    case AV_PIX_FMT_GRAYF32:
+    case AV_PIX_FMT_YUV420P:
+    case AV_PIX_FMT_YUV422P:
+    case AV_PIX_FMT_YUV444P:
+    case AV_PIX_FMT_YUV410P:
+    case AV_PIX_FMT_YUV411P:
+        if (model_input->channels != 1) {
+            LOG_FORMAT_CHANNEL_MISMATCH();
+            return AVERROR(EIO);
+        }
+        if (model_input->dt != DNN_FLOAT) {
+            av_log(ctx, AV_LOG_ERROR, "only support dnn models with input data type float32.\n");
+            return AVERROR(EIO);
+        }
+        return 0;
+    default:
+        av_log(ctx, AV_LOG_ERROR, "%s not supported.\n", av_get_pix_fmt_name(fmt));
+        return AVERROR(EIO);
+    }
+
+    return 0;
+}
+
+static int config_input(AVFilterLink *inlink)
+{
+    AVFilterContext *context     = inlink->dst;
+    DnnProcessingContext *ctx = context->priv;
+    DNNReturnType result;
+    DNNData model_input;
+    int check;
+
+    result = ctx->model->get_input(ctx->model->model, &model_input, ctx->model_inputname);
+    if (result != DNN_SUCCESS) {
+        av_log(ctx, AV_LOG_ERROR, "could not get input from the model\n");
+        return AVERROR(EIO);
+    }
+
+    check = check_modelinput_inlink(&model_input, inlink);
+    if (check != 0) {
+        return check;
+    }
+
+    ctx->input.width    = inlink->w;
+    ctx->input.height   = inlink->h;
+    ctx->input.channels = model_input.channels;
+    ctx->input.dt = model_input.dt;
+
+    result = (ctx->model->set_input_output)(ctx->model->model,
+                                        &ctx->input, ctx->model_inputname,
+                                        (const char **)&ctx->model_outputname, 1);
+    if (result != DNN_SUCCESS) {
+        av_log(ctx, AV_LOG_ERROR, "could not set input and output for the model\n");
+        return AVERROR(EIO);
+    }
+
+    return 0;
+}
+
+static int prepare_sws_context(AVFilterLink *outlink)
+{
+    AVFilterContext *context = outlink->src;
+    DnnProcessingContext *ctx = context->priv;
+    AVFilterLink *inlink = context->inputs[0];
+    enum AVPixelFormat fmt = inlink->format;
+    DNNDataType input_dt  = ctx->input.dt;
+    DNNDataType output_dt = ctx->output.dt;
+
+    switch (fmt) {
+    case AV_PIX_FMT_RGB24:
+    case AV_PIX_FMT_BGR24:
+        if (input_dt == DNN_FLOAT) {
+            ctx->sws_gray8_to_grayf32 = sws_getContext(inlink->w * 3,
+                                                       inlink->h,
+                                                       AV_PIX_FMT_GRAY8,
+                                                       inlink->w * 3,
+                                                       inlink->h,
+                                                       AV_PIX_FMT_GRAYF32,
+                                                       0, NULL, NULL, NULL);
+        }
+        if (output_dt == DNN_FLOAT) {
+            ctx->sws_grayf32_to_gray8 = sws_getContext(outlink->w * 3,
+                                                       outlink->h,
+                                                       AV_PIX_FMT_GRAYF32,
+                                                       outlink->w * 3,
+                                                       outlink->h,
+                                                       AV_PIX_FMT_GRAY8,
+                                                       0, NULL, NULL, NULL);
+        }
+        return 0;
+    case AV_PIX_FMT_YUV420P:
+    case AV_PIX_FMT_YUV422P:
+    case AV_PIX_FMT_YUV444P:
+    case AV_PIX_FMT_YUV410P:
+    case AV_PIX_FMT_YUV411P:
+        av_assert0(input_dt == DNN_FLOAT);
+        av_assert0(output_dt == DNN_FLOAT);
+        ctx->sws_gray8_to_grayf32 = sws_getContext(inlink->w,
+                                                   inlink->h,
+                                                   AV_PIX_FMT_GRAY8,
+                                                   inlink->w,
+                                                   inlink->h,
+                                                   AV_PIX_FMT_GRAYF32,
+                                                   0, NULL, NULL, NULL);
+        ctx->sws_grayf32_to_gray8 = sws_getContext(outlink->w,
+                                                   outlink->h,
+                                                   AV_PIX_FMT_GRAYF32,
+                                                   outlink->w,
+                                                   outlink->h,
+                                                   AV_PIX_FMT_GRAY8,
+                                                   0, NULL, NULL, NULL);
+
+        if (inlink->w != outlink->w || inlink->h != outlink->h) {
+            const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(fmt);
+            int sws_src_h = AV_CEIL_RSHIFT(inlink->h, desc->log2_chroma_h);
+            int sws_src_w = AV_CEIL_RSHIFT(inlink->w, desc->log2_chroma_w);
+            int sws_dst_h = AV_CEIL_RSHIFT(outlink->h, desc->log2_chroma_h);
+            int sws_dst_w = AV_CEIL_RSHIFT(outlink->w, desc->log2_chroma_w);
+            ctx->sws_uv_scale = sws_getContext(sws_src_w, sws_src_h, AV_PIX_FMT_GRAY8,
+                                               sws_dst_w, sws_dst_h, AV_PIX_FMT_GRAY8,
+                                               SWS_BICUBIC, NULL, NULL, NULL);
+            ctx->sws_uv_height = sws_src_h;
+        }
+        return 0;
+    default:
+        //do nothing
+        break;
+    }
+
+    return 0;
+}
+
+static int config_output(AVFilterLink *outlink)
+{
+    AVFilterContext *context = outlink->src;
+    DnnProcessingContext *ctx = context->priv;
+    DNNReturnType result;
+
+    // have a try run in case that the dnn model resize the frame
+    result = (ctx->dnn_module->execute_model)(ctx->model, &ctx->output, 1);
+    if (result != DNN_SUCCESS){
+        av_log(ctx, AV_LOG_ERROR, "failed to execute model\n");
+        return AVERROR(EIO);
+    }
+
+    outlink->w = ctx->output.width;
+    outlink->h = ctx->output.height;
+
+    prepare_sws_context(outlink);
+
+    return 0;
+}
+
+static int copy_from_frame_to_dnn(DnnProcessingContext *ctx, const AVFrame *frame)
+{
+    int bytewidth = av_image_get_linesize(frame->format, frame->width, 0);
+    DNNData *dnn_input = &ctx->input;
+
+    switch (frame->format) {
+    case AV_PIX_FMT_RGB24:
+    case AV_PIX_FMT_BGR24:
+        if (dnn_input->dt == DNN_FLOAT) {
+            sws_scale(ctx->sws_gray8_to_grayf32, (const uint8_t **)frame->data, frame->linesize,
+                      0, frame->height, (uint8_t * const*)(&dnn_input->data),
+                      (const int [4]){frame->width * 3 * sizeof(float), 0, 0, 0});
+        } else {
+            av_assert0(dnn_input->dt == DNN_UINT8);
+            av_image_copy_plane(dnn_input->data, bytewidth,
+                                frame->data[0], frame->linesize[0],
+                                bytewidth, frame->height);
+        }
+        return 0;
+    case AV_PIX_FMT_GRAY8:
+    case AV_PIX_FMT_GRAYF32:
+        av_image_copy_plane(dnn_input->data, bytewidth,
+                            frame->data[0], frame->linesize[0],
+                            bytewidth, frame->height);
+        return 0;
+    case AV_PIX_FMT_YUV420P:
+    case AV_PIX_FMT_YUV422P:
+    case AV_PIX_FMT_YUV444P:
+    case AV_PIX_FMT_YUV410P:
+    case AV_PIX_FMT_YUV411P:
+        sws_scale(ctx->sws_gray8_to_grayf32, (const uint8_t **)frame->data, frame->linesize,
+                  0, frame->height, (uint8_t * const*)(&dnn_input->data),
+                  (const int [4]){frame->width * sizeof(float), 0, 0, 0});
+        return 0;
+    default:
+        return AVERROR(EIO);
+    }
+
+    return 0;
+}
+
+static int copy_from_dnn_to_frame(DnnProcessingContext *ctx, AVFrame *frame)
+{
+    int bytewidth = av_image_get_linesize(frame->format, frame->width, 0);
+    DNNData *dnn_output = &ctx->output;
+
+    switch (frame->format) {
+    case AV_PIX_FMT_RGB24:
+    case AV_PIX_FMT_BGR24:
+        if (dnn_output->dt == DNN_FLOAT) {
+            sws_scale(ctx->sws_grayf32_to_gray8, (const uint8_t *[4]){(const uint8_t *)dnn_output->data, 0, 0, 0},
+                      (const int[4]){frame->width * 3 * sizeof(float), 0, 0, 0},
+                      0, frame->height, (uint8_t * const*)frame->data, frame->linesize);
+
+        } else {
+            av_assert0(dnn_output->dt == DNN_UINT8);
+            av_image_copy_plane(frame->data[0], frame->linesize[0],
+                                dnn_output->data, bytewidth,
+                                bytewidth, frame->height);
+        }
+        return 0;
+    case AV_PIX_FMT_GRAY8:
+        // it is possible that data type of dnn output is float32,
+        // need to add support for such case when needed.
+        av_assert0(dnn_output->dt == DNN_UINT8);
+        av_image_copy_plane(frame->data[0], frame->linesize[0],
+                            dnn_output->data, bytewidth,
+                            bytewidth, frame->height);
+        return 0;
+    case AV_PIX_FMT_GRAYF32:
+        av_assert0(dnn_output->dt == DNN_FLOAT);
+        av_image_copy_plane(frame->data[0], frame->linesize[0],
+                            dnn_output->data, bytewidth,
+                            bytewidth, frame->height);
+        return 0;
+    case AV_PIX_FMT_YUV420P:
+    case AV_PIX_FMT_YUV422P:
+    case AV_PIX_FMT_YUV444P:
+    case AV_PIX_FMT_YUV410P:
+    case AV_PIX_FMT_YUV411P:
+        sws_scale(ctx->sws_grayf32_to_gray8, (const uint8_t *[4]){(const uint8_t *)dnn_output->data, 0, 0, 0},
+                  (const int[4]){frame->width * sizeof(float), 0, 0, 0},
+                  0, frame->height, (uint8_t * const*)frame->data, frame->linesize);
+        return 0;
+    default:
+        return AVERROR(EIO);
+    }
+
+    return 0;
+}
+
+static av_always_inline int isPlanarYUV(enum AVPixelFormat pix_fmt)
+{
+    const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
+    av_assert0(desc);
+    return !(desc->flags & AV_PIX_FMT_FLAG_RGB) && desc->nb_components == 3;
+}
+
+static int copy_uv_planes(DnnProcessingContext *ctx, AVFrame *out, const AVFrame *in)
+{
+    const AVPixFmtDescriptor *desc;
+    int uv_height;
+
+    if (!ctx->sws_uv_scale) {
+        av_assert0(in->height == out->height && in->width == out->width);
+        desc = av_pix_fmt_desc_get(in->format);
+        uv_height = AV_CEIL_RSHIFT(in->height, desc->log2_chroma_h);
+        for (int i = 1; i < 3; ++i) {
+            int bytewidth = av_image_get_linesize(in->format, in->width, i);
+            av_image_copy_plane(out->data[i], out->linesize[i],
+                                in->data[i], in->linesize[i],
+                                bytewidth, uv_height);
+        }
+    } else {
+        sws_scale(ctx->sws_uv_scale, (const uint8_t **)(in->data + 1), in->linesize + 1,
+                  0, ctx->sws_uv_height, out->data + 1, out->linesize + 1);
+        sws_scale(ctx->sws_uv_scale, (const uint8_t **)(in->data + 2), in->linesize + 2,
+                  0, ctx->sws_uv_height, out->data + 2, out->linesize + 2);
+    }
+
+    return 0;
+}
+
+static int filter_frame(AVFilterLink *inlink, AVFrame *in)
+{
+    AVFilterContext *context  = inlink->dst;
+    AVFilterLink *outlink = context->outputs[0];
+    DnnProcessingContext *ctx = context->priv;
+    DNNReturnType dnn_result;
+    AVFrame *out;
+
+    copy_from_frame_to_dnn(ctx, in);
+
+    dnn_result = (ctx->dnn_module->execute_model)(ctx->model, &ctx->output, 1);
+    if (dnn_result != DNN_SUCCESS){
+        av_log(ctx, AV_LOG_ERROR, "failed to execute model\n");
+        av_frame_free(&in);
+        return AVERROR(EIO);
+    }
+
+    out = ff_get_video_buffer(outlink, outlink->w, outlink->h);
+    if (!out) {
+        av_frame_free(&in);
+        return AVERROR(ENOMEM);
+    }
+
+    av_frame_copy_props(out, in);
+    copy_from_dnn_to_frame(ctx, out);
+
+    if (isPlanarYUV(in->format))
+        copy_uv_planes(ctx, out, in);
+
+    av_frame_free(&in);
+    return ff_filter_frame(outlink, out);
+}
+
+static av_cold void uninit(AVFilterContext *ctx)
+{
+    DnnProcessingContext *context = ctx->priv;
+
+    sws_freeContext(context->sws_gray8_to_grayf32);
+    sws_freeContext(context->sws_grayf32_to_gray8);
+    sws_freeContext(context->sws_uv_scale);
+
+    if (context->dnn_module)
+        (context->dnn_module->free_model)(&context->model);
+
+    av_freep(&context->dnn_module);
+}
+
+static const AVFilterPad dnn_processing_inputs[] = {
+    {
+        .name         = "default",
+        .type         = AVMEDIA_TYPE_VIDEO,
+        .config_props = config_input,
+        .filter_frame = filter_frame,
+    },
+    { NULL }
+};
+
+static const AVFilterPad dnn_processing_outputs[] = {
+    {
+        .name = "default",
+        .type = AVMEDIA_TYPE_VIDEO,
+        .config_props  = config_output,
+    },
+    { NULL }
+};
+
+AVFilter ff_vf_dnn_processing = {
+    .name          = "dnn_processing",
+    .description   = NULL_IF_CONFIG_SMALL("Apply DNN processing filter to the input."),
+    .priv_size     = sizeof(DnnProcessingContext),
+    .init          = init,
+    .uninit        = uninit,
+    .query_formats = query_formats,
+    .inputs        = dnn_processing_inputs,
+    .outputs       = dnn_processing_outputs,
+    .priv_class    = &dnn_processing_class,
+};
diff --git a/libavfilter/vf_drawbox.c b/libavfilter/vf_drawbox.c
index c9cb63d..21d520e 100644
--- a/libavfilter/vf_drawbox.c
+++ b/libavfilter/vf_drawbox.c
@@ -208,6 +208,12 @@
     return ret;
 }
 
+static av_pure av_always_inline int pixel_belongs_to_box(DrawBoxContext *s, int x, int y)
+{
+    return (y - s->y < s->thickness) || (s->y + s->h - 1 - y < s->thickness) ||
+           (x - s->x < s->thickness) || (s->x + s->w - 1 - x < s->thickness);
+}
+
 static int filter_frame(AVFilterLink *inlink, AVFrame *frame)
 {
     DrawBoxContext *s = inlink->dst->priv;
@@ -225,13 +231,11 @@
 
             if (s->invert_color) {
                 for (x = FFMAX(xb, 0); x < xb + s->w && x < frame->width; x++)
-                    if ((y - yb < s->thickness) || (yb + s->h - 1 - y < s->thickness) ||
-                        (x - xb < s->thickness) || (xb + s->w - 1 - x < s->thickness))
+                    if (pixel_belongs_to_box(s, x, y))
                         row[0][x] = 0xff - row[0][x];
             } else {
                 for (x = FFMAX(xb, 0); x < xb + s->w && x < frame->width; x++) {
-                    if ((y - yb < s->thickness) || (yb + s->h - 1 - y < s->thickness) ||
-                        (x - xb < s->thickness) || (xb + s->w - 1 - x < s->thickness)) {
+                    if (pixel_belongs_to_box(s, x, y)) {
                         row[0][x           ] = s->yuv_color[Y];
                         row[1][x >> s->hsub] = s->yuv_color[U];
                         row[2][x >> s->hsub] = s->yuv_color[V];
@@ -250,15 +254,13 @@
 
             if (s->invert_color) {
                 for (x = FFMAX(xb, 0); x < xb + s->w && x < frame->width; x++)
-                    if ((y - yb < s->thickness) || (yb + s->h - 1 - y < s->thickness) ||
-                        (x - xb < s->thickness) || (xb + s->w - 1 - x < s->thickness))
+                    if (pixel_belongs_to_box(s, x, y))
                         row[0][x] = 0xff - row[0][x];
             } else {
                 for (x = FFMAX(xb, 0); x < xb + s->w && x < frame->width; x++) {
                     double alpha = (double)s->yuv_color[A] / 255;
 
-                    if ((y - yb < s->thickness) || (yb + s->h - 1 - y < s->thickness) ||
-                        (x - xb < s->thickness) || (xb + s->w - 1 - x < s->thickness)) {
+                    if (pixel_belongs_to_box(s, x, y)) {
                         row[0][x                 ] = (1 - alpha) * row[0][x                 ] + alpha * s->yuv_color[Y];
                         row[1][x >> s->hsub] = (1 - alpha) * row[1][x >> s->hsub] + alpha * s->yuv_color[U];
                         row[2][x >> s->hsub] = (1 - alpha) * row[2][x >> s->hsub] + alpha * s->yuv_color[V];
@@ -271,22 +273,55 @@
     return ff_filter_frame(inlink->dst->outputs[0], frame);
 }
 
+static int process_command(AVFilterContext *ctx, const char *cmd, const char *args, char *res, int res_len, int flags)
+{
+    AVFilterLink *inlink = ctx->inputs[0];
+    DrawBoxContext *s = ctx->priv;
+    int old_x = s->x;
+    int old_y = s->y;
+    int old_w = s->w;
+    int old_h = s->h;
+    int old_t = s->thickness;
+    int old_r = s->replace;
+    int ret;
+
+    ret = ff_filter_process_command(ctx, cmd, args, res, res_len, flags);
+    if (ret < 0)
+        return ret;
+
+    ret = init(ctx);
+    if (ret < 0)
+        goto end;
+    ret = config_input(inlink);
+end:
+    if (ret < 0) {
+        s->x = old_x;
+        s->y = old_y;
+        s->w = old_w;
+        s->h = old_h;
+        s->thickness = old_t;
+        s->replace = old_r;
+    }
+
+    return ret;
+}
+
 #define OFFSET(x) offsetof(DrawBoxContext, x)
-#define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
+#define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_RUNTIME_PARAM
 
 #if CONFIG_DRAWBOX_FILTER
 
 static const AVOption drawbox_options[] = {
-    { "x",         "set horizontal position of the left box edge", OFFSET(x_expr),    AV_OPT_TYPE_STRING, { .str="0" },       CHAR_MIN, CHAR_MAX, FLAGS },
-    { "y",         "set vertical position of the top box edge",    OFFSET(y_expr),    AV_OPT_TYPE_STRING, { .str="0" },       CHAR_MIN, CHAR_MAX, FLAGS },
-    { "width",     "set width of the box",                         OFFSET(w_expr),    AV_OPT_TYPE_STRING, { .str="0" },       CHAR_MIN, CHAR_MAX, FLAGS },
-    { "w",         "set width of the box",                         OFFSET(w_expr),    AV_OPT_TYPE_STRING, { .str="0" },       CHAR_MIN, CHAR_MAX, FLAGS },
-    { "height",    "set height of the box",                        OFFSET(h_expr),    AV_OPT_TYPE_STRING, { .str="0" },       CHAR_MIN, CHAR_MAX, FLAGS },
-    { "h",         "set height of the box",                        OFFSET(h_expr),    AV_OPT_TYPE_STRING, { .str="0" },       CHAR_MIN, CHAR_MAX, FLAGS },
-    { "color",     "set color of the box",                         OFFSET(color_str), AV_OPT_TYPE_STRING, { .str = "black" }, CHAR_MIN, CHAR_MAX, FLAGS },
-    { "c",         "set color of the box",                         OFFSET(color_str), AV_OPT_TYPE_STRING, { .str = "black" }, CHAR_MIN, CHAR_MAX, FLAGS },
-    { "thickness", "set the box thickness",                        OFFSET(t_expr),    AV_OPT_TYPE_STRING, { .str="3" },       CHAR_MIN, CHAR_MAX, FLAGS },
-    { "t",         "set the box thickness",                        OFFSET(t_expr),    AV_OPT_TYPE_STRING, { .str="3" },       CHAR_MIN, CHAR_MAX, FLAGS },
+    { "x",         "set horizontal position of the left box edge", OFFSET(x_expr),    AV_OPT_TYPE_STRING, { .str="0" },       0, 0, FLAGS },
+    { "y",         "set vertical position of the top box edge",    OFFSET(y_expr),    AV_OPT_TYPE_STRING, { .str="0" },       0, 0, FLAGS },
+    { "width",     "set width of the box",                         OFFSET(w_expr),    AV_OPT_TYPE_STRING, { .str="0" },       0, 0, FLAGS },
+    { "w",         "set width of the box",                         OFFSET(w_expr),    AV_OPT_TYPE_STRING, { .str="0" },       0, 0, FLAGS },
+    { "height",    "set height of the box",                        OFFSET(h_expr),    AV_OPT_TYPE_STRING, { .str="0" },       0, 0, FLAGS },
+    { "h",         "set height of the box",                        OFFSET(h_expr),    AV_OPT_TYPE_STRING, { .str="0" },       0, 0, FLAGS },
+    { "color",     "set color of the box",                         OFFSET(color_str), AV_OPT_TYPE_STRING, { .str = "black" }, 0, 0, FLAGS },
+    { "c",         "set color of the box",                         OFFSET(color_str), AV_OPT_TYPE_STRING, { .str = "black" }, 0, 0, FLAGS },
+    { "thickness", "set the box thickness",                        OFFSET(t_expr),    AV_OPT_TYPE_STRING, { .str="3" },       0, 0, FLAGS },
+    { "t",         "set the box thickness",                        OFFSET(t_expr),    AV_OPT_TYPE_STRING, { .str="3" },       0, 0, FLAGS },
     { "replace",   "replace color & alpha",                        OFFSET(replace),   AV_OPT_TYPE_BOOL,   { .i64=0 },         0,        1,        FLAGS },
     { NULL }
 };
@@ -321,6 +356,7 @@
     .query_formats = query_formats,
     .inputs        = drawbox_inputs,
     .outputs       = drawbox_outputs,
+    .process_command = process_command,
     .flags         = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC,
 };
 #endif /* CONFIG_DRAWBOX_FILTER */
@@ -410,16 +446,16 @@
 }
 
 static const AVOption drawgrid_options[] = {
-    { "x",         "set horizontal offset",   OFFSET(x_expr),    AV_OPT_TYPE_STRING, { .str="0" },       CHAR_MIN, CHAR_MAX, FLAGS },
-    { "y",         "set vertical offset",     OFFSET(y_expr),    AV_OPT_TYPE_STRING, { .str="0" },       CHAR_MIN, CHAR_MAX, FLAGS },
-    { "width",     "set width of grid cell",  OFFSET(w_expr),    AV_OPT_TYPE_STRING, { .str="0" },       CHAR_MIN, CHAR_MAX, FLAGS },
-    { "w",         "set width of grid cell",  OFFSET(w_expr),    AV_OPT_TYPE_STRING, { .str="0" },       CHAR_MIN, CHAR_MAX, FLAGS },
-    { "height",    "set height of grid cell", OFFSET(h_expr),    AV_OPT_TYPE_STRING, { .str="0" },       CHAR_MIN, CHAR_MAX, FLAGS },
-    { "h",         "set height of grid cell", OFFSET(h_expr),    AV_OPT_TYPE_STRING, { .str="0" },       CHAR_MIN, CHAR_MAX, FLAGS },
-    { "color",     "set color of the grid",   OFFSET(color_str), AV_OPT_TYPE_STRING, { .str = "black" }, CHAR_MIN, CHAR_MAX, FLAGS },
-    { "c",         "set color of the grid",   OFFSET(color_str), AV_OPT_TYPE_STRING, { .str = "black" }, CHAR_MIN, CHAR_MAX, FLAGS },
-    { "thickness", "set grid line thickness", OFFSET(t_expr),    AV_OPT_TYPE_STRING, {.str="1"},         CHAR_MIN, CHAR_MAX, FLAGS },
-    { "t",         "set grid line thickness", OFFSET(t_expr),    AV_OPT_TYPE_STRING, {.str="1"},         CHAR_MIN, CHAR_MAX, FLAGS },
+    { "x",         "set horizontal offset",   OFFSET(x_expr),    AV_OPT_TYPE_STRING, { .str="0" },       0, 0, FLAGS },
+    { "y",         "set vertical offset",     OFFSET(y_expr),    AV_OPT_TYPE_STRING, { .str="0" },       0, 0, FLAGS },
+    { "width",     "set width of grid cell",  OFFSET(w_expr),    AV_OPT_TYPE_STRING, { .str="0" },       0, 0, FLAGS },
+    { "w",         "set width of grid cell",  OFFSET(w_expr),    AV_OPT_TYPE_STRING, { .str="0" },       0, 0, FLAGS },
+    { "height",    "set height of grid cell", OFFSET(h_expr),    AV_OPT_TYPE_STRING, { .str="0" },       0, 0, FLAGS },
+    { "h",         "set height of grid cell", OFFSET(h_expr),    AV_OPT_TYPE_STRING, { .str="0" },       0, 0, FLAGS },
+    { "color",     "set color of the grid",   OFFSET(color_str), AV_OPT_TYPE_STRING, { .str = "black" }, 0, 0, FLAGS },
+    { "c",         "set color of the grid",   OFFSET(color_str), AV_OPT_TYPE_STRING, { .str = "black" }, 0, 0, FLAGS },
+    { "thickness", "set grid line thickness", OFFSET(t_expr),    AV_OPT_TYPE_STRING, {.str="1"},         0, 0, FLAGS },
+    { "t",         "set grid line thickness", OFFSET(t_expr),    AV_OPT_TYPE_STRING, {.str="1"},         0, 0, FLAGS },
     { "replace",   "replace color & alpha",   OFFSET(replace),   AV_OPT_TYPE_BOOL,   { .i64=0 },         0,        1,        FLAGS },
     { NULL }
 };
@@ -455,6 +491,7 @@
     .inputs        = drawgrid_inputs,
     .outputs       = drawgrid_outputs,
     .flags         = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC,
+    .process_command = process_command,
 };
 
 #endif  /* CONFIG_DRAWGRID_FILTER */
diff --git a/libavfilter/vf_drawtext.c b/libavfilter/vf_drawtext.c
index cca2cbc..abe1ca6 100644
--- a/libavfilter/vf_drawtext.c
+++ b/libavfilter/vf_drawtext.c
@@ -88,6 +88,9 @@
     "x",
     "y",
     "pict_type",
+    "pkt_pos",
+    "pkt_duration",
+    "pkt_size",
     NULL
 };
 
@@ -125,6 +128,9 @@
     VAR_X,
     VAR_Y,
     VAR_PICT_TYPE,
+    VAR_PKT_POS,
+    VAR_PKT_DURATION,
+    VAR_PKT_SIZE,
     VAR_VARS_NB
 };
 
@@ -203,20 +209,20 @@
 #define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM
 
 static const AVOption drawtext_options[]= {
-    {"fontfile",    "set font file",        OFFSET(fontfile),           AV_OPT_TYPE_STRING, {.str=NULL},  CHAR_MIN, CHAR_MAX, FLAGS},
-    {"text",        "set text",             OFFSET(text),               AV_OPT_TYPE_STRING, {.str=NULL},  CHAR_MIN, CHAR_MAX, FLAGS},
-    {"textfile",    "set text file",        OFFSET(textfile),           AV_OPT_TYPE_STRING, {.str=NULL},  CHAR_MIN, CHAR_MAX, FLAGS},
-    {"fontcolor",   "set foreground color", OFFSET(fontcolor.rgba),     AV_OPT_TYPE_COLOR,  {.str="black"}, CHAR_MIN, CHAR_MAX, FLAGS},
-    {"fontcolor_expr", "set foreground color expression", OFFSET(fontcolor_expr), AV_OPT_TYPE_STRING, {.str=""}, CHAR_MIN, CHAR_MAX, FLAGS},
-    {"boxcolor",    "set box color",        OFFSET(boxcolor.rgba),      AV_OPT_TYPE_COLOR,  {.str="white"}, CHAR_MIN, CHAR_MAX, FLAGS},
-    {"bordercolor", "set border color",     OFFSET(bordercolor.rgba),   AV_OPT_TYPE_COLOR,  {.str="black"}, CHAR_MIN, CHAR_MAX, FLAGS},
-    {"shadowcolor", "set shadow color",     OFFSET(shadowcolor.rgba),   AV_OPT_TYPE_COLOR,  {.str="black"}, CHAR_MIN, CHAR_MAX, FLAGS},
+    {"fontfile",    "set font file",        OFFSET(fontfile),           AV_OPT_TYPE_STRING, {.str=NULL},  0, 0, FLAGS},
+    {"text",        "set text",             OFFSET(text),               AV_OPT_TYPE_STRING, {.str=NULL},  0, 0, FLAGS},
+    {"textfile",    "set text file",        OFFSET(textfile),           AV_OPT_TYPE_STRING, {.str=NULL},  0, 0, FLAGS},
+    {"fontcolor",   "set foreground color", OFFSET(fontcolor.rgba),     AV_OPT_TYPE_COLOR,  {.str="black"}, 0, 0, FLAGS},
+    {"fontcolor_expr", "set foreground color expression", OFFSET(fontcolor_expr), AV_OPT_TYPE_STRING, {.str=""}, 0, 0, FLAGS},
+    {"boxcolor",    "set box color",        OFFSET(boxcolor.rgba),      AV_OPT_TYPE_COLOR,  {.str="white"}, 0, 0, FLAGS},
+    {"bordercolor", "set border color",     OFFSET(bordercolor.rgba),   AV_OPT_TYPE_COLOR,  {.str="black"}, 0, 0, FLAGS},
+    {"shadowcolor", "set shadow color",     OFFSET(shadowcolor.rgba),   AV_OPT_TYPE_COLOR,  {.str="black"}, 0, 0, FLAGS},
     {"box",         "set box",              OFFSET(draw_box),           AV_OPT_TYPE_BOOL,   {.i64=0},     0,        1       , FLAGS},
     {"boxborderw",  "set box border width", OFFSET(boxborderw),         AV_OPT_TYPE_INT,    {.i64=0},     INT_MIN,  INT_MAX , FLAGS},
     {"line_spacing",  "set line spacing in pixels", OFFSET(line_spacing),   AV_OPT_TYPE_INT,    {.i64=0},     INT_MIN,  INT_MAX,FLAGS},
-    {"fontsize",    "set font size",        OFFSET(fontsize_expr),      AV_OPT_TYPE_STRING, {.str=NULL},  CHAR_MIN, CHAR_MAX , FLAGS},
-    {"x",           "set x expression",     OFFSET(x_expr),             AV_OPT_TYPE_STRING, {.str="0"},   CHAR_MIN, CHAR_MAX, FLAGS},
-    {"y",           "set y expression",     OFFSET(y_expr),             AV_OPT_TYPE_STRING, {.str="0"},   CHAR_MIN, CHAR_MAX, FLAGS},
+    {"fontsize",    "set font size",        OFFSET(fontsize_expr),      AV_OPT_TYPE_STRING, {.str=NULL},  0, 0 , FLAGS},
+    {"x",           "set x expression",     OFFSET(x_expr),             AV_OPT_TYPE_STRING, {.str="0"},   0, 0, FLAGS},
+    {"y",           "set y expression",     OFFSET(y_expr),             AV_OPT_TYPE_STRING, {.str="0"},   0, 0, FLAGS},
     {"shadowx",     "set shadow x offset",  OFFSET(shadowx),            AV_OPT_TYPE_INT,    {.i64=0},     INT_MIN,  INT_MAX , FLAGS},
     {"shadowy",     "set shadow y offset",  OFFSET(shadowy),            AV_OPT_TYPE_INT,    {.i64=0},     INT_MIN,  INT_MAX , FLAGS},
     {"borderw",     "set border width",     OFFSET(borderw),            AV_OPT_TYPE_INT,    {.i64=0},     INT_MIN,  INT_MAX , FLAGS},
@@ -231,7 +237,7 @@
         {"normal",   "set normal expansion",                OFFSET(exp_mode), AV_OPT_TYPE_CONST, {.i64=EXP_NORMAL},   0, 0, FLAGS, "expansion"},
         {"strftime", "set strftime expansion (deprecated)", OFFSET(exp_mode), AV_OPT_TYPE_CONST, {.i64=EXP_STRFTIME}, 0, 0, FLAGS, "expansion"},
 
-    {"timecode",        "set initial timecode",             OFFSET(tc_opt_string), AV_OPT_TYPE_STRING,   {.str=NULL}, CHAR_MIN, CHAR_MAX, FLAGS},
+    {"timecode",        "set initial timecode",             OFFSET(tc_opt_string), AV_OPT_TYPE_STRING,   {.str=NULL}, 0, 0, FLAGS},
     {"tc24hmax",        "set 24 hours max (timecode only)", OFFSET(tc24hmax),      AV_OPT_TYPE_BOOL,     {.i64=0},           0,        1, FLAGS},
     {"timecode_rate",   "set rate (timecode only)",         OFFSET(tc_rate),       AV_OPT_TYPE_RATIONAL, {.dbl=0},           0,  INT_MAX, FLAGS},
     {"r",               "set rate (timecode only)",         OFFSET(tc_rate),       AV_OPT_TYPE_RATIONAL, {.dbl=0},           0,  INT_MAX, FLAGS},
@@ -823,6 +829,7 @@
 {
     AVFilterContext *ctx = inlink->dst;
     DrawTextContext *s = ctx->priv;
+    char *expr;
     int ret;
 
     ff_draw_init(&s->dc, inlink->format, FF_DRAW_PROCESS_ALPHA);
@@ -848,34 +855,64 @@
     av_expr_free(s->a_pexpr);
     s->x_pexpr = s->y_pexpr = s->a_pexpr = NULL;
 
-    if ((ret = av_expr_parse(&s->x_pexpr, s->x_expr, var_names,
+    if ((ret = av_expr_parse(&s->x_pexpr, expr = s->x_expr, var_names,
                              NULL, NULL, fun2_names, fun2, 0, ctx)) < 0 ||
-        (ret = av_expr_parse(&s->y_pexpr, s->y_expr, var_names,
+        (ret = av_expr_parse(&s->y_pexpr, expr = s->y_expr, var_names,
                              NULL, NULL, fun2_names, fun2, 0, ctx)) < 0 ||
-        (ret = av_expr_parse(&s->a_pexpr, s->a_expr, var_names,
-                             NULL, NULL, fun2_names, fun2, 0, ctx)) < 0)
-
+        (ret = av_expr_parse(&s->a_pexpr, expr = s->a_expr, var_names,
+                             NULL, NULL, fun2_names, fun2, 0, ctx)) < 0) {
+        av_log(ctx, AV_LOG_ERROR, "Failed to parse expression: %s \n", expr);
         return AVERROR(EINVAL);
+    }
 
     return 0;
 }
 
 static int command(AVFilterContext *ctx, const char *cmd, const char *arg, char *res, int res_len, int flags)
 {
-    DrawTextContext *s = ctx->priv;
+    DrawTextContext *old = ctx->priv;
+    DrawTextContext *new = NULL;
+    int ret;
 
     if (!strcmp(cmd, "reinit")) {
-        int ret;
-        uninit(ctx);
-        s->reinit = 1;
-        if ((ret = av_set_options_string(ctx, arg, "=", ":")) < 0)
-            return ret;
-        if ((ret = init(ctx)) < 0)
-            return ret;
-        return config_input(ctx->inputs[0]);
-    }
+        new = av_mallocz(sizeof(DrawTextContext));
+        if (!new)
+            return AVERROR(ENOMEM);
 
-    return AVERROR(ENOSYS);
+        new->class = &drawtext_class;
+        ret = av_opt_copy(new, old);
+        if (ret < 0)
+            goto fail;
+
+        ctx->priv = new;
+        ret = av_set_options_string(ctx, arg, "=", ":");
+        if (ret < 0) {
+            ctx->priv = old;
+            goto fail;
+        }
+
+        ret = init(ctx);
+        if (ret < 0) {
+            uninit(ctx);
+            ctx->priv = old;
+            goto fail;
+        }
+
+        new->reinit = 1;
+
+        ctx->priv = old;
+        uninit(ctx);
+        av_freep(&old);
+
+        ctx->priv = new;
+        return config_input(ctx->inputs[0]);
+    } else
+        return AVERROR(ENOSYS);
+
+fail:
+    av_log(ctx, AV_LOG_ERROR, "Failed to process command. Continuing with existing parameters.\n");
+    av_freep(&new);
+    return ret;
 }
 
 static int func_pict_type(AVFilterContext *ctx, AVBPrint *bp,
@@ -1048,10 +1085,12 @@
 
     feclearexcept(FE_ALL_EXCEPT);
     intval = res;
+#if defined(FE_INVALID) && defined(FE_OVERFLOW) && defined(FE_UNDERFLOW)
     if ((ret = fetestexcept(FE_INVALID|FE_OVERFLOW|FE_UNDERFLOW))) {
         av_log(ctx, AV_LOG_ERROR, "Conversion of floating-point result to int failed. Control register: 0x%08x. Conversion result: %d\n", ret, intval);
         return AVERROR(EINVAL);
     }
+#endif
 
     if (argc == 3)
         av_strlcatf(fmt_str, sizeof(fmt_str), "0%u", positions);
@@ -1188,7 +1227,8 @@
     for (i = 0, p = text; *p; i++) {
         FT_Bitmap bitmap;
         Glyph dummy = { 0 };
-        GET_UTF8(code, *p++, continue;);
+        GET_UTF8(code, *p ? *p++ : 0, code = 0xfffd; goto continue_on_invalid;);
+continue_on_invalid:
 
         /* skip new line chars, just go to new line */
         if (code == '\n' || code == '\r' || code == '\t')
@@ -1326,7 +1366,8 @@
 
     /* load and cache glyphs */
     for (i = 0, p = text; *p; i++) {
-        GET_UTF8(code, *p++, continue;);
+        GET_UTF8(code, *p ? *p++ : 0, code = 0xfffd; goto continue_on_invalid;);
+continue_on_invalid:
 
         /* get glyph */
         dummy.code = code;
@@ -1349,7 +1390,8 @@
     /* compute and save position for each glyph */
     glyph = NULL;
     for (i = 0, p = text; *p; i++) {
-        GET_UTF8(code, *p++, continue;);
+        GET_UTF8(code, *p ? *p++ : 0, code = 0xfffd; goto continue_on_invalid2;);
+continue_on_invalid2:
 
         /* skip the \n in the sequence \r\n */
         if (prev_code == '\r' && code == '\n')
@@ -1487,6 +1529,9 @@
         NAN : frame->pts * av_q2d(inlink->time_base);
 
     s->var_values[VAR_PICT_TYPE] = frame->pict_type;
+    s->var_values[VAR_PKT_POS] = frame->pkt_pos;
+    s->var_values[VAR_PKT_DURATION] = frame->pkt_duration * av_q2d(inlink->time_base);
+    s->var_values[VAR_PKT_SIZE] = frame->pkt_size;
     s->metadata = frame->metadata;
 
     draw_text(ctx, frame, frame->width, frame->height);
diff --git a/libavfilter/vf_edgedetect.c b/libavfilter/vf_edgedetect.c
index a0ddcbb..a5614ea 100644
--- a/libavfilter/vf_edgedetect.c
+++ b/libavfilter/vf_edgedetect.c
@@ -150,10 +150,13 @@
     int i, j;
 
     memcpy(dst, src, w); dst += dst_linesize; src += src_linesize;
-    memcpy(dst, src, w); dst += dst_linesize; src += src_linesize;
+    if (h > 1) {
+        memcpy(dst, src, w); dst += dst_linesize; src += src_linesize;
+    }
     for (j = 2; j < h - 2; j++) {
         dst[0] = src[0];
-        dst[1] = src[1];
+        if (w > 1)
+            dst[1] = src[1];
         for (i = 2; i < w - 2; i++) {
             /* Gaussian mask of size 5x5 with sigma = 1.4 */
             dst[i] = ((src[-2*src_linesize + i-2] + src[2*src_linesize + i-2]) * 2
@@ -174,14 +177,19 @@
                     + src[i+1] * 12
                     + src[i+2] *  5) / 159;
         }
-        dst[i    ] = src[i    ];
-        dst[i + 1] = src[i + 1];
+        if (w > 2)
+            dst[i    ] = src[i    ];
+        if (w > 3)
+            dst[i + 1] = src[i + 1];
 
         dst += dst_linesize;
         src += src_linesize;
     }
-    memcpy(dst, src, w); dst += dst_linesize; src += src_linesize;
-    memcpy(dst, src, w);
+    if (h > 2) {
+        memcpy(dst, src, w); dst += dst_linesize; src += src_linesize;
+    }
+    if (h > 3)
+        memcpy(dst, src, w);
 }
 
 enum {
@@ -208,7 +216,7 @@
 
         if (gx < 0)
             gx = -gx, gy = -gy;
-        gy <<= 16;
+        gy *= (1 << 16);
         tanpi8gx  =  27146 * gx;
         tan3pi8gx = 158218 * gx;
         if (gy > -tan3pi8gx && gy < -tanpi8gx)  return DIRECTION_45UP;
diff --git a/libavfilter/vf_elbg.c b/libavfilter/vf_elbg.c
index 396af82..5bccb5f 100644
--- a/libavfilter/vf_elbg.c
+++ b/libavfilter/vf_elbg.c
@@ -36,7 +36,7 @@
 typedef struct ELBGContext {
     const AVClass *class;
     AVLFG lfg;
-    unsigned int lfg_seed;
+    int64_t lfg_seed;
     int max_steps_nb;
     int *codeword;
     int codeword_length;
@@ -56,8 +56,8 @@
     { "l",               "set codebook length", OFFSET(codebook_length), AV_OPT_TYPE_INT, { .i64 = 256 }, 1, INT_MAX, FLAGS },
     { "nb_steps", "set max number of steps used to compute the mapping", OFFSET(max_steps_nb), AV_OPT_TYPE_INT, { .i64 = 1 }, 1, INT_MAX, FLAGS },
     { "n",        "set max number of steps used to compute the mapping", OFFSET(max_steps_nb), AV_OPT_TYPE_INT, { .i64 = 1 }, 1, INT_MAX, FLAGS },
-    { "seed", "set the random seed", OFFSET(lfg_seed), AV_OPT_TYPE_INT, {.i64 = -1}, -1, UINT32_MAX, FLAGS },
-    { "s",    "set the random seed", OFFSET(lfg_seed), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, UINT32_MAX, FLAGS },
+    { "seed", "set the random seed", OFFSET(lfg_seed), AV_OPT_TYPE_INT64, {.i64 = -1}, -1, UINT32_MAX, FLAGS },
+    { "s",    "set the random seed", OFFSET(lfg_seed), AV_OPT_TYPE_INT64, { .i64 = -1 }, -1, UINT32_MAX, FLAGS },
     { "pal8", "set the pal8 output", OFFSET(pal8), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, FLAGS },
     { NULL }
 };
@@ -178,8 +178,10 @@
         AVFrame *out = ff_get_video_buffer(outlink, outlink->w, outlink->h);
         uint32_t *pal;
 
-        if (!out)
+        if (!out) {
+            av_frame_free(&frame);
             return AVERROR(ENOMEM);
+        }
         out->pts = frame->pts;
         av_frame_free(&frame);
         pal = (uint32_t *)out->data[1];
diff --git a/libavfilter/vf_extractplanes.c b/libavfilter/vf_extractplanes.c
index c1c8e69..739c242 100644
--- a/libavfilter/vf_extractplanes.c
+++ b/libavfilter/vf_extractplanes.c
@@ -23,11 +23,9 @@
 #include "libavutil/opt.h"
 #include "libavutil/pixdesc.h"
 
-#define FF_INTERNAL_FIELDS 1
-#include "libavfilter/framequeue.h"
-
 #include "avfilter.h"
 #include "drawutils.h"
+#include "filters.h"
 #include "internal.h"
 
 #define PLANE_R 0x01
@@ -101,6 +99,8 @@
         AV_PIX_FMT_YUV422P12##suf,                             \
         AV_PIX_FMT_YUV444P12##suf,                             \
         AV_PIX_FMT_YUV440P12##suf,                             \
+        AV_PIX_FMT_YUVA422P12##suf,                            \
+        AV_PIX_FMT_YUVA444P12##suf,                            \
         AV_PIX_FMT_GBRP10##suf, AV_PIX_FMT_GBRAP10##suf,       \
         AV_PIX_FMT_GBRP12##suf, AV_PIX_FMT_GBRAP12##suf,       \
         AV_PIX_FMT_YUV420P9##suf,                              \
@@ -282,7 +282,7 @@
         const int idx = s->map[i];
         AVFrame *out;
 
-        if (outlink->status_in)
+        if (ff_outlink_get_status(outlink))
             continue;
 
         out = ff_get_video_buffer(outlink, outlink->w, outlink->h);
diff --git a/libavfilter/vf_fade.c b/libavfilter/vf_fade.c
index c30c41d..58d7f8c 100644
--- a/libavfilter/vf_fade.c
+++ b/libavfilter/vf_fade.c
@@ -54,15 +54,20 @@
     int type;
     int factor, fade_per_frame;
     int start_frame, nb_frames;
-    int hsub, vsub, bpp;
+    int hsub, vsub, bpp, depth;
     unsigned int black_level, black_level_scaled;
+    uint8_t is_rgb;
     uint8_t is_packed_rgb;
     uint8_t rgba_map[4];
     int alpha;
+    int is_planar;
     uint64_t start_time, duration;
     enum {VF_FADE_WAITING=0, VF_FADE_FADING, VF_FADE_DONE} fade_state;
     uint8_t color_rgba[4];  ///< fade color
     int black_fade;         ///< if color_rgba is black
+    int (*filter_slice_luma)(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs);
+    int (*filter_slice_chroma)(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs);
+    int (*filter_slice_alpha)(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs);
 } FadeContext;
 
 static av_cold int init(AVFilterContext *ctx)
@@ -107,23 +112,40 @@
         AV_PIX_FMT_RGB24,    AV_PIX_FMT_BGR24,
         AV_PIX_FMT_ARGB,     AV_PIX_FMT_ABGR,
         AV_PIX_FMT_RGBA,     AV_PIX_FMT_BGRA,
+        AV_PIX_FMT_GBRP,     AV_PIX_FMT_GBRAP,
+        AV_PIX_FMT_YUV420P9, AV_PIX_FMT_YUV422P9, AV_PIX_FMT_YUV444P9,
+        AV_PIX_FMT_YUV420P10, AV_PIX_FMT_YUV422P10, AV_PIX_FMT_YUV444P10,
+        AV_PIX_FMT_YUV420P12, AV_PIX_FMT_YUV422P12, AV_PIX_FMT_YUV444P12, AV_PIX_FMT_YUV440P12,
+        AV_PIX_FMT_YUV420P14, AV_PIX_FMT_YUV422P14, AV_PIX_FMT_YUV444P14,
+        AV_PIX_FMT_YUV420P16, AV_PIX_FMT_YUV422P16, AV_PIX_FMT_YUV444P16,
+        AV_PIX_FMT_YUVA420P9, AV_PIX_FMT_YUVA422P9, AV_PIX_FMT_YUVA444P9,
+        AV_PIX_FMT_YUVA420P10, AV_PIX_FMT_YUVA422P10, AV_PIX_FMT_YUVA444P10,
+        AV_PIX_FMT_YUVA422P12, AV_PIX_FMT_YUVA444P12,
+        AV_PIX_FMT_YUVA420P16, AV_PIX_FMT_YUVA422P16, AV_PIX_FMT_YUVA444P16,
         AV_PIX_FMT_NONE
     };
     static const enum AVPixelFormat pix_fmts_rgb[] = {
         AV_PIX_FMT_RGB24,    AV_PIX_FMT_BGR24,
         AV_PIX_FMT_ARGB,     AV_PIX_FMT_ABGR,
         AV_PIX_FMT_RGBA,     AV_PIX_FMT_BGRA,
+        AV_PIX_FMT_GBRP,
         AV_PIX_FMT_NONE
     };
     static const enum AVPixelFormat pix_fmts_alpha[] = {
         AV_PIX_FMT_YUVA420P, AV_PIX_FMT_YUVA422P, AV_PIX_FMT_YUVA444P,
+        AV_PIX_FMT_YUVA420P9, AV_PIX_FMT_YUVA422P9, AV_PIX_FMT_YUVA444P9,
+        AV_PIX_FMT_YUVA420P10, AV_PIX_FMT_YUVA422P10, AV_PIX_FMT_YUVA444P10,
+        AV_PIX_FMT_YUVA422P12, AV_PIX_FMT_YUVA444P12,
+        AV_PIX_FMT_YUVA420P16, AV_PIX_FMT_YUVA422P16, AV_PIX_FMT_YUVA444P16,
         AV_PIX_FMT_ARGB,     AV_PIX_FMT_ABGR,
         AV_PIX_FMT_RGBA,     AV_PIX_FMT_BGRA,
+        AV_PIX_FMT_GBRAP,
         AV_PIX_FMT_NONE
     };
     static const enum AVPixelFormat pix_fmts_rgba[] = {
         AV_PIX_FMT_ARGB,     AV_PIX_FMT_ABGR,
         AV_PIX_FMT_RGBA,     AV_PIX_FMT_BGRA,
+        AV_PIX_FMT_GBRAP,
         AV_PIX_FMT_NONE
     };
     AVFilterFormats *fmts_list;
@@ -148,32 +170,18 @@
     AV_PIX_FMT_YUV444P,  AV_PIX_FMT_YUV422P,  AV_PIX_FMT_YUV420P,
     AV_PIX_FMT_YUV411P,  AV_PIX_FMT_YUV410P,
     AV_PIX_FMT_YUV440P,
+    AV_PIX_FMT_YUV420P9, AV_PIX_FMT_YUV422P9, AV_PIX_FMT_YUV444P9,
+    AV_PIX_FMT_YUV420P10, AV_PIX_FMT_YUV422P10, AV_PIX_FMT_YUV444P10,
+    AV_PIX_FMT_YUV420P12, AV_PIX_FMT_YUV422P12, AV_PIX_FMT_YUV444P12, AV_PIX_FMT_YUV440P12,
+    AV_PIX_FMT_YUV420P14, AV_PIX_FMT_YUV422P14, AV_PIX_FMT_YUV444P14,
+    AV_PIX_FMT_YUV420P16, AV_PIX_FMT_YUV422P16, AV_PIX_FMT_YUV444P16,
+    AV_PIX_FMT_YUVA420P9, AV_PIX_FMT_YUVA422P9, AV_PIX_FMT_YUVA444P9,
+    AV_PIX_FMT_YUVA420P10, AV_PIX_FMT_YUVA422P10, AV_PIX_FMT_YUVA444P10,
+    AV_PIX_FMT_YUVA422P12, AV_PIX_FMT_YUVA444P12,
+    AV_PIX_FMT_YUVA420P16, AV_PIX_FMT_YUVA422P16, AV_PIX_FMT_YUVA444P16,
     AV_PIX_FMT_NONE
 };
 
-static int config_props(AVFilterLink *inlink)
-{
-    FadeContext *s = inlink->dst->priv;
-    const AVPixFmtDescriptor *pixdesc = av_pix_fmt_desc_get(inlink->format);
-
-    s->hsub = pixdesc->log2_chroma_w;
-    s->vsub = pixdesc->log2_chroma_h;
-
-    s->bpp = pixdesc->flags & AV_PIX_FMT_FLAG_PLANAR ?
-             1 :
-             av_get_bits_per_pixel(pixdesc) >> 3;
-    s->alpha &= !!(pixdesc->flags & AV_PIX_FMT_FLAG_ALPHA);
-    s->is_packed_rgb = ff_fill_rgba_map(s->rgba_map, inlink->format) >= 0;
-
-    /* use CCIR601/709 black level for studio-level pixel non-alpha components */
-    s->black_level =
-            ff_fmt_is_in(inlink->format, studio_level_pix_fmts) && !s->alpha ? 16 : 0;
-    /* 32768 = 1 << 15, it is an integer representation
-     * of 0.5 and is for rounding. */
-    s->black_level_scaled = (s->black_level << 16) + 32768;
-    return 0;
-}
-
 static av_always_inline void filter_rgb(FadeContext *s, const AVFrame *frame,
                                         int slice_start, int slice_end,
                                         int do_alpha, int step)
@@ -199,6 +207,29 @@
     }
 }
 
+static av_always_inline void filter_rgb_planar(FadeContext *s, const AVFrame *frame,
+                                               int slice_start, int slice_end,
+                                               int do_alpha)
+{
+    int i, j;
+    const uint8_t *c = s->color_rgba;
+
+    for (i = slice_start; i < slice_end; i++) {
+        uint8_t *pg = frame->data[0] + i * frame->linesize[0];
+        uint8_t *pb = frame->data[1] + i * frame->linesize[1];
+        uint8_t *pr = frame->data[2] + i * frame->linesize[2];
+        uint8_t *pa = frame->data[3] + i * frame->linesize[3];
+        for (j = 0; j < frame->width; j++) {
+#define INTERPP(c_name, c_idx) av_clip_uint8(((c[c_idx]<<16) + ((int)c_name - (int)c[c_idx]) * s->factor + (1<<15)) >> 16)
+            pr[j] = INTERPP(pr[j], 0);
+            pg[j] = INTERPP(pg[j], 1);
+            pb[j] = INTERPP(pb[j], 2);
+            if (do_alpha)
+                pa[j] = INTERPP(pa[j], 3);
+        }
+    }
+}
+
 static int filter_slice_rgb(AVFilterContext *ctx, void *arg, int jobnr,
                             int nb_jobs)
 {
@@ -207,7 +238,11 @@
     int slice_start = (frame->height *  jobnr   ) / nb_jobs;
     int slice_end   = (frame->height * (jobnr+1)) / nb_jobs;
 
-    if      (s->alpha)    filter_rgb(s, frame, slice_start, slice_end, 1, 4);
+    if      (s->is_planar && s->alpha)
+                          filter_rgb_planar(s, frame, slice_start, slice_end, 1);
+    else if (s->is_planar)
+                          filter_rgb_planar(s, frame, slice_start, slice_end, 0);
+    else if (s->alpha)    filter_rgb(s, frame, slice_start, slice_end, 1, 4);
     else if (s->bpp == 3) filter_rgb(s, frame, slice_start, slice_end, 0, 3);
     else if (s->bpp == 4) filter_rgb(s, frame, slice_start, slice_end, 0, 4);
     else                  av_assert0(0);
@@ -224,14 +259,41 @@
     int slice_end   = (frame->height * (jobnr+1)) / nb_jobs;
     int i, j;
 
-    for (i = slice_start; i < slice_end; i++) {
-        uint8_t *p = frame->data[0] + i * frame->linesize[0];
-        for (j = 0; j < frame->width * s->bpp; j++) {
-            /* s->factor is using 16 lower-order bits for decimal
-             * places. 32768 = 1 << 15, it is an integer representation
-             * of 0.5 and is for rounding. */
-            *p = ((*p - s->black_level) * s->factor + s->black_level_scaled) >> 16;
-            p++;
+    for (int k = 0; k < 1 + 2 * (s->is_planar && s->is_rgb); k++) {
+        for (i = slice_start; i < slice_end; i++) {
+            uint8_t *p = frame->data[k] + i * frame->linesize[k];
+            for (j = 0; j < frame->width * s->bpp; j++) {
+                /* s->factor is using 16 lower-order bits for decimal
+                 * places. 32768 = 1 << 15, it is an integer representation
+                 * of 0.5 and is for rounding. */
+                *p = ((*p - s->black_level) * s->factor + s->black_level_scaled) >> 16;
+                p++;
+            }
+        }
+    }
+
+    return 0;
+}
+
+static int filter_slice_luma16(AVFilterContext *ctx, void *arg, int jobnr,
+                               int nb_jobs)
+{
+    FadeContext *s = ctx->priv;
+    AVFrame *frame = arg;
+    int slice_start = (frame->height *  jobnr   ) / nb_jobs;
+    int slice_end   = (frame->height * (jobnr+1)) / nb_jobs;
+    int i, j;
+
+    for (int k = 0; k < 1 + 2 * (s->is_planar && s->is_rgb); k++) {
+        for (i = slice_start; i < slice_end; i++) {
+            uint16_t *p = (uint16_t *)(frame->data[k] + i * frame->linesize[k]);
+            for (j = 0; j < frame->width * s->bpp; j++) {
+                /* s->factor is using 16 lower-order bits for decimal
+                 * places. 32768 = 1 << 15, it is an integer representation
+                 * of 0.5 and is for rounding. */
+                *p = ((*p - s->black_level) * s->factor + s->black_level_scaled) >> 16;
+                p++;
+            }
         }
     }
 
@@ -265,6 +327,32 @@
     return 0;
 }
 
+static int filter_slice_chroma16(AVFilterContext *ctx, void *arg, int jobnr,
+                                 int nb_jobs)
+{
+    FadeContext *s = ctx->priv;
+    AVFrame *frame = arg;
+    int i, j, plane;
+    const int width = AV_CEIL_RSHIFT(frame->width, s->hsub);
+    const int height= AV_CEIL_RSHIFT(frame->height, s->vsub);
+    const int mid = 1 << (s->depth - 1);
+    const int add = ((mid << 1) + 1) << 15;
+    int slice_start = (height *  jobnr   ) / nb_jobs;
+    int slice_end   = FFMIN(((height * (jobnr+1)) / nb_jobs), frame->height);
+
+    for (plane = 1; plane < 3; plane++) {
+        for (i = slice_start; i < slice_end; i++) {
+            uint16_t *p = (uint16_t *)(frame->data[plane] + i * frame->linesize[plane]);
+            for (j = 0; j < width; j++) {
+                *p = ((*p - mid) * s->factor + add) >> 16;
+                p++;
+            }
+        }
+    }
+
+    return 0;
+}
+
 static int filter_slice_alpha(AVFilterContext *ctx, void *arg, int jobnr,
                               int nb_jobs)
 {
@@ -290,6 +378,64 @@
     return 0;
 }
 
+static int filter_slice_alpha16(AVFilterContext *ctx, void *arg, int jobnr,
+                                int nb_jobs)
+{
+    FadeContext *s = ctx->priv;
+    AVFrame *frame = arg;
+    int plane = s->is_packed_rgb ? 0 : A;
+    int slice_start = (frame->height *  jobnr   ) / nb_jobs;
+    int slice_end   = (frame->height * (jobnr+1)) / nb_jobs;
+    int i, j;
+
+    for (i = slice_start; i < slice_end; i++) {
+        uint16_t *p = (uint16_t *)(frame->data[plane] + i * frame->linesize[plane]) + s->is_packed_rgb*s->rgba_map[A];
+        int step = s->is_packed_rgb ? 4 : 1;
+        for (j = 0; j < frame->width; j++) {
+            /* s->factor is using 16 lower-order bits for decimal
+             * places. 32768 = 1 << 15, it is an integer representation
+             * of 0.5 and is for rounding. */
+            *p = ((*p - s->black_level) * s->factor + s->black_level_scaled) >> 16;
+            p += step;
+        }
+    }
+
+    return 0;
+}
+
+static int config_props(AVFilterLink *inlink)
+{
+    FadeContext *s = inlink->dst->priv;
+    const AVPixFmtDescriptor *pixdesc = av_pix_fmt_desc_get(inlink->format);
+
+    s->hsub = pixdesc->log2_chroma_w;
+    s->vsub = pixdesc->log2_chroma_h;
+
+    ff_fill_rgba_map(s->rgba_map, inlink->format);
+
+    s->depth = pixdesc->comp[0].depth;
+    s->bpp = pixdesc->flags & AV_PIX_FMT_FLAG_PLANAR ?
+             1 :
+             av_get_bits_per_pixel(pixdesc) >> 3;
+    s->alpha &= !!(pixdesc->flags & AV_PIX_FMT_FLAG_ALPHA);
+    s->is_planar = pixdesc->flags & AV_PIX_FMT_FLAG_PLANAR;
+    s->is_rgb = pixdesc->flags & AV_PIX_FMT_FLAG_RGB;
+    s->is_packed_rgb = !s->is_planar && s->is_rgb;
+
+    /* use CCIR601/709 black level for studio-level pixel non-alpha components */
+    s->black_level =
+            ff_fmt_is_in(inlink->format, studio_level_pix_fmts) && !s->alpha ? 16 * (1 << (s->depth - 8)): 0;
+    /* 32768 = 1 << 15, it is an integer representation
+     * of 0.5 and is for rounding. */
+    s->black_level_scaled = (s->black_level << 16) + 32768;
+
+    s->filter_slice_luma   = s->depth <= 8 ? filter_slice_luma   : filter_slice_luma16;
+    s->filter_slice_chroma = s->depth <= 8 ? filter_slice_chroma : filter_slice_chroma16;
+    s->filter_slice_alpha  = s->depth <= 8 ? filter_slice_alpha  : filter_slice_alpha16;
+
+    return 0;
+}
+
 static int filter_frame(AVFilterLink *inlink, AVFrame *frame)
 {
     AVFilterContext *ctx = inlink->dst;
@@ -346,19 +492,19 @@
 
     if (s->factor < UINT16_MAX) {
         if (s->alpha) {
-            ctx->internal->execute(ctx, filter_slice_alpha, frame, NULL,
+            ctx->internal->execute(ctx, s->filter_slice_alpha, frame, NULL,
                                 FFMIN(frame->height, ff_filter_get_nb_threads(ctx)));
-        } else if (s->is_packed_rgb && !s->black_fade) {
+        } else if (s->is_rgb && !s->black_fade) {
             ctx->internal->execute(ctx, filter_slice_rgb, frame, NULL,
                                    FFMIN(frame->height, ff_filter_get_nb_threads(ctx)));
         } else {
             /* luma, or rgb plane in case of black */
-            ctx->internal->execute(ctx, filter_slice_luma, frame, NULL,
+            ctx->internal->execute(ctx, s->filter_slice_luma, frame, NULL,
                                 FFMIN(frame->height, ff_filter_get_nb_threads(ctx)));
 
-            if (frame->data[1] && frame->data[2]) {
+            if (frame->data[1] && frame->data[2] && !s->is_rgb) {
                 /* chroma planes */
-                ctx->internal->execute(ctx, filter_slice_chroma, frame, NULL,
+                ctx->internal->execute(ctx, s->filter_slice_chroma, frame, NULL,
                                     FFMIN(frame->height, ff_filter_get_nb_threads(ctx)));
             }
         }
@@ -372,29 +518,29 @@
 #define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
 
 static const AVOption fade_options[] = {
-    { "type", "'in' or 'out' for fade-in/fade-out", OFFSET(type), AV_OPT_TYPE_INT, { .i64 = FADE_IN }, FADE_IN, FADE_OUT, FLAGS, "type" },
-    { "t",    "'in' or 'out' for fade-in/fade-out", OFFSET(type), AV_OPT_TYPE_INT, { .i64 = FADE_IN }, FADE_IN, FADE_OUT, FLAGS, "type" },
-        { "in",  "fade-in",  0, AV_OPT_TYPE_CONST, { .i64 = FADE_IN },  .unit = "type" },
-        { "out", "fade-out", 0, AV_OPT_TYPE_CONST, { .i64 = FADE_OUT }, .unit = "type" },
+    { "type", "set the fade direction", OFFSET(type), AV_OPT_TYPE_INT, { .i64 = FADE_IN }, FADE_IN, FADE_OUT, FLAGS, "type" },
+    { "t",    "set the fade direction", OFFSET(type), AV_OPT_TYPE_INT, { .i64 = FADE_IN }, FADE_IN, FADE_OUT, FLAGS, "type" },
+        { "in",  "fade-in",  0, AV_OPT_TYPE_CONST, { .i64 = FADE_IN },  .flags = FLAGS, .unit = "type" },
+        { "out", "fade-out", 0, AV_OPT_TYPE_CONST, { .i64 = FADE_OUT }, .flags = FLAGS, .unit = "type" },
     { "start_frame", "Number of the first frame to which to apply the effect.",
                                                     OFFSET(start_frame), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, FLAGS },
     { "s",           "Number of the first frame to which to apply the effect.",
                                                     OFFSET(start_frame), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, FLAGS },
     { "nb_frames",   "Number of frames to which the effect should be applied.",
-                                                    OFFSET(nb_frames),   AV_OPT_TYPE_INT, { .i64 = 25 }, 0, INT_MAX, FLAGS },
+                                                    OFFSET(nb_frames),   AV_OPT_TYPE_INT, { .i64 = 25 }, 1, INT_MAX, FLAGS },
     { "n",           "Number of frames to which the effect should be applied.",
-                                                    OFFSET(nb_frames),   AV_OPT_TYPE_INT, { .i64 = 25 }, 0, INT_MAX, FLAGS },
+                                                    OFFSET(nb_frames),   AV_OPT_TYPE_INT, { .i64 = 25 }, 1, INT_MAX, FLAGS },
     { "alpha",       "fade alpha if it is available on the input", OFFSET(alpha),       AV_OPT_TYPE_BOOL, {.i64 = 0    }, 0,       1, FLAGS },
     { "start_time",  "Number of seconds of the beginning of the effect.",
-                                                    OFFSET(start_time),  AV_OPT_TYPE_DURATION, {.i64 = 0. }, 0, INT32_MAX, FLAGS },
+                                                    OFFSET(start_time),  AV_OPT_TYPE_DURATION, {.i64 = 0. }, 0, INT64_MAX, FLAGS },
     { "st",          "Number of seconds of the beginning of the effect.",
-                                                    OFFSET(start_time),  AV_OPT_TYPE_DURATION, {.i64 = 0. }, 0, INT32_MAX, FLAGS },
+                                                    OFFSET(start_time),  AV_OPT_TYPE_DURATION, {.i64 = 0. }, 0, INT64_MAX, FLAGS },
     { "duration",    "Duration of the effect in seconds.",
-                                                    OFFSET(duration),    AV_OPT_TYPE_DURATION, {.i64 = 0. }, 0, INT32_MAX, FLAGS },
+                                                    OFFSET(duration),    AV_OPT_TYPE_DURATION, {.i64 = 0. }, 0, INT64_MAX, FLAGS },
     { "d",           "Duration of the effect in seconds.",
-                                                    OFFSET(duration),    AV_OPT_TYPE_DURATION, {.i64 = 0. }, 0, INT32_MAX, FLAGS },
-    { "color",       "set color",                   OFFSET(color_rgba),  AV_OPT_TYPE_COLOR,    {.str = "black"}, CHAR_MIN, CHAR_MAX, FLAGS },
-    { "c",           "set color",                   OFFSET(color_rgba),  AV_OPT_TYPE_COLOR,    {.str = "black"}, CHAR_MIN, CHAR_MAX, FLAGS },
+                                                    OFFSET(duration),    AV_OPT_TYPE_DURATION, {.i64 = 0. }, 0, INT64_MAX, FLAGS },
+    { "color",       "set color",                   OFFSET(color_rgba),  AV_OPT_TYPE_COLOR,    {.str = "black"}, 0, 0, FLAGS },
+    { "c",           "set color",                   OFFSET(color_rgba),  AV_OPT_TYPE_COLOR,    {.str = "black"}, 0, 0, FLAGS },
     { NULL }
 };
 
diff --git a/libavfilter/vf_fftdnoiz.c b/libavfilter/vf_fftdnoiz.c
index 7ee7dbc..856d716 100644
--- a/libavfilter/vf_fftdnoiz.c
+++ b/libavfilter/vf_fftdnoiz.c
@@ -129,6 +129,11 @@
         AV_PIX_FMT_YUV420P16, AV_PIX_FMT_YUV422P16, AV_PIX_FMT_YUV444P16,
         AV_PIX_FMT_GBRP, AV_PIX_FMT_GBRP9, AV_PIX_FMT_GBRP10,
         AV_PIX_FMT_GBRP12, AV_PIX_FMT_GBRP14, AV_PIX_FMT_GBRP16,
+        AV_PIX_FMT_YUVA420P,  AV_PIX_FMT_YUVA422P,   AV_PIX_FMT_YUVA444P,
+        AV_PIX_FMT_YUVA444P9, AV_PIX_FMT_YUVA444P10, AV_PIX_FMT_YUVA444P12, AV_PIX_FMT_YUVA444P16,
+        AV_PIX_FMT_YUVA422P9, AV_PIX_FMT_YUVA422P10, AV_PIX_FMT_YUVA422P12, AV_PIX_FMT_YUVA422P16,
+        AV_PIX_FMT_YUVA420P9, AV_PIX_FMT_YUVA420P10, AV_PIX_FMT_YUVA420P16,
+        AV_PIX_FMT_GBRAP,     AV_PIX_FMT_GBRAP10,    AV_PIX_FMT_GBRAP12,    AV_PIX_FMT_GBRAP16,
         AV_PIX_FMT_NONE
     };
     AVFilterFormats *fmts_list = ff_make_format_list(pix_fmts);
@@ -156,7 +161,7 @@
     int j;
 
     for (j = 0; j < rw; j++)
-        dst[j] = av_clip_uint8(src[j].re * scale);
+        dst[j] = av_clip_uint8(src[j].re * scale + 0.5f);
 }
 
 static void import_row16(FFTComplex *dst, uint8_t *srcp, int rw)
@@ -176,7 +181,7 @@
     int j;
 
     for (j = 0; j < rw; j++)
-        dst[j] = av_clip_uintp2_c(src[j].re * scale, depth);
+        dst[j] = av_clip_uintp2_c(src[j].re * scale + 0.5f, depth);
 }
 
 static int config_input(AVFilterLink *inlink)
diff --git a/libavfilter/vf_fftfilt.c b/libavfilter/vf_fftfilt.c
index af44b1e..d091cd8 100644
--- a/libavfilter/vf_fftfilt.c
+++ b/libavfilter/vf_fftfilt.c
@@ -81,9 +81,9 @@
     { "dc_Y",  "adjust gain in Y plane",              OFFSET(dc[Y]),      AV_OPT_TYPE_INT,    {.i64 = 0},      0,     1000,     FLAGS },
     { "dc_U",  "adjust gain in U plane",              OFFSET(dc[U]),      AV_OPT_TYPE_INT,    {.i64 = 0},      0,     1000,     FLAGS },
     { "dc_V",  "adjust gain in V plane",              OFFSET(dc[V]),      AV_OPT_TYPE_INT,    {.i64 = 0},      0,     1000,     FLAGS },
-    { "weight_Y", "set luminance expression in Y plane",   OFFSET(weight_str[Y]), AV_OPT_TYPE_STRING, {.str = "1"}, CHAR_MIN, CHAR_MAX, FLAGS },
-    { "weight_U", "set chrominance expression in U plane", OFFSET(weight_str[U]), AV_OPT_TYPE_STRING, {.str = NULL}, CHAR_MIN, CHAR_MAX, FLAGS },
-    { "weight_V", "set chrominance expression in V plane", OFFSET(weight_str[V]), AV_OPT_TYPE_STRING, {.str = NULL}, CHAR_MIN, CHAR_MAX, FLAGS },
+    { "weight_Y", "set luminance expression in Y plane",   OFFSET(weight_str[Y]), AV_OPT_TYPE_STRING, {.str = "1"}, 0, 0, FLAGS },
+    { "weight_U", "set chrominance expression in U plane", OFFSET(weight_str[U]), AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, FLAGS },
+    { "weight_V", "set chrominance expression in V plane", OFFSET(weight_str[V]), AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, FLAGS },
     { "eval", "specify when to evaluate expressions", OFFSET(eval_mode), AV_OPT_TYPE_INT, {.i64 = EVAL_MODE_INIT}, 0, EVAL_MODE_NB-1, FLAGS, "eval" },
          { "init",  "eval expressions once during initialization", 0, AV_OPT_TYPE_CONST, {.i64=EVAL_MODE_INIT},  .flags = FLAGS, .unit = "eval" },
          { "frame", "eval expressions per-frame",                  0, AV_OPT_TYPE_CONST, {.i64=EVAL_MODE_FRAME}, .flags = FLAGS, .unit = "eval" },
diff --git a/libavfilter/vf_fieldhint.c b/libavfilter/vf_fieldhint.c
index 3cfeb20..c120bb0 100644
--- a/libavfilter/vf_fieldhint.c
+++ b/libavfilter/vf_fieldhint.c
@@ -65,7 +65,7 @@
         av_log(ctx, AV_LOG_ERROR, "Hint file must be set.\n");
         return AVERROR(EINVAL);
     }
-    s->hint = fopen(s->hint_file_str, "r");
+    s->hint = av_fopen_utf8(s->hint_file_str, "r");
     if (!s->hint) {
         ret = AVERROR(errno);
         av_log(ctx, AV_LOG_ERROR, "%s: %s\n", s->hint_file_str, av_err2str(ret));
@@ -117,7 +117,8 @@
     AVFrame *out, *top, *bottom;
     char buf[1024] = { 0 };
     int64_t tf, bf;
-    char hint = '=';
+    int tfactor = 0, bfactor = 1;
+    char hint = '=', field = '=';
     int p;
 
     av_frame_free(&s->frame[0]);
@@ -137,6 +138,8 @@
             s->line++;
             if (buf[0] == '#' || buf[0] == ';') {
                 continue;
+            } else if (sscanf(buf, "%"PRId64",%"PRId64" %c %c", &tf, &bf, &hint, &field) == 4) {
+                ;
             } else if (sscanf(buf, "%"PRId64",%"PRId64" %c", &tf, &bf, &hint) == 3) {
                 ;
             } else if (sscanf(buf, "%"PRId64",%"PRId64"", &tf, &bf) == 2) {
@@ -185,6 +188,23 @@
         av_assert0(0);
     }
 
+    switch (field) {
+    case 'b':
+        tfactor = 1;
+        top = bottom;
+        break;
+    case 't':
+        bfactor = 0;
+        bottom = top;
+        break;
+    case '=':
+        break;
+    default:
+        av_log(ctx, AV_LOG_ERROR, "Invalid field: %c.\n", field);
+        av_frame_free(&out);
+        return AVERROR(EINVAL);
+    }
+
     switch (hint) {
     case '+':
         out->interlaced_frame = 1;
@@ -194,6 +214,14 @@
         break;
     case '=':
         break;
+    case 'b':
+        tfactor = 1;
+        top = bottom;
+        break;
+    case 't':
+        bfactor = 0;
+        bottom = top;
+        break;
     default:
         av_log(ctx, AV_LOG_ERROR, "Invalid hint: %c.\n", hint);
         av_frame_free(&out);
@@ -203,13 +231,13 @@
     for (p = 0; p < s->nb_planes; p++) {
         av_image_copy_plane(out->data[p],
                             out->linesize[p] * 2,
-                            top->data[p],
+                            top->data[p] + tfactor * top->linesize[p],
                             top->linesize[p] * 2,
                             s->planewidth[p],
                             (s->planeheight[p] + 1) / 2);
         av_image_copy_plane(out->data[p] + out->linesize[p],
                             out->linesize[p] * 2,
-                            bottom->data[p] + bottom->linesize[p],
+                            bottom->data[p] + bfactor * bottom->linesize[p],
                             bottom->linesize[p] * 2,
                             s->planewidth[p],
                             (s->planeheight[p] + 1) / 2);
diff --git a/libavfilter/vf_fieldmatch.c b/libavfilter/vf_fieldmatch.c
index 5a73eb4..fa4aa82 100644
--- a/libavfilter/vf_fieldmatch.c
+++ b/libavfilter/vf_fieldmatch.c
@@ -679,7 +679,7 @@
     AVFilterLink *outlink = ctx->outputs[0];
     FieldMatchContext *fm = ctx->priv;
     int combs[] = { -1, -1, -1, -1, -1 };
-    int order, field, i, match, sc = 0;
+    int order, field, i, match, sc = 0, ret = 0;
     const int *fxo;
     AVFrame *gen_frames[] = { NULL, NULL, NULL, NULL, NULL };
     AVFrame *dst;
@@ -725,16 +725,20 @@
             if (i > mN && fm->combdbg == COMBDBG_PCN)
                 break;
             gen_frames[i] = create_weave_frame(ctx, i, field, fm->prv, fm->src, fm->nxt);
-            if (!gen_frames[i])
-                return AVERROR(ENOMEM);
+            if (!gen_frames[i]) {
+                ret = AVERROR(ENOMEM);
+                goto fail;
+            }
             combs[i] = calc_combed_score(fm, gen_frames[i]);
         }
         av_log(ctx, AV_LOG_INFO, "COMBS: %3d %3d %3d %3d %3d\n",
                combs[0], combs[1], combs[2], combs[3], combs[4]);
     } else {
         gen_frames[mC] = av_frame_clone(fm->src);
-        if (!gen_frames[mC])
-            return AVERROR(ENOMEM);
+        if (!gen_frames[mC]) {
+            ret = AVERROR(ENOMEM);
+            goto fail;
+        }
     }
 
     /* p/c selection and optional 3-way p/c/n matches */
@@ -801,10 +805,10 @@
             gen_frames[match] = NULL;
         }
     }
-    if (!dst)
-        return AVERROR(ENOMEM);
-    for (i = 0; i < FF_ARRAY_ELEMS(gen_frames); i++)
-        av_frame_free(&gen_frames[i]);
+    if (!dst) {
+        ret = AVERROR(ENOMEM);
+        goto fail;
+    }
 
     /* mark the frame we are unable to match properly as interlaced so a proper
      * de-interlacer can take the relay */
@@ -819,7 +823,13 @@
            " match=%d combed=%s\n", sc, combs[0], combs[1], combs[2], combs[3], combs[4],
            fm->combpel, match, dst->interlaced_frame ? "YES" : "NO");
 
-    return ff_filter_frame(outlink, dst);
+fail:
+    for (i = 0; i < FF_ARRAY_ELEMS(gen_frames); i++)
+        av_frame_free(&gen_frames[i]);
+
+    if (ret >= 0)
+        return ff_filter_frame(outlink, dst);
+    return ret;
 }
 
 static int activate(AVFilterContext *ctx)
@@ -829,6 +839,8 @@
     int ret = 0, status;
     int64_t pts;
 
+    FF_FILTER_FORWARD_STATUS_BACK_ALL(ctx->outputs[0], ctx);
+
     if ((fm->got_frame[INPUT_MAIN] == 0) &&
         (ret = ff_inlink_consume_frame(ctx->inputs[INPUT_MAIN], &frame)) > 0) {
         ret = filter_frame(ctx->inputs[INPUT_MAIN], frame);
@@ -938,7 +950,7 @@
     fm->tpitchy  = FFALIGN(w,      16);
     fm->tpitchuv = FFALIGN(w >> 1, 16);
 
-    fm->tbuffer = av_malloc(h/2 * fm->tpitchy);
+    fm->tbuffer = av_calloc((h/2 + 4) * fm->tpitchy, sizeof(*fm->tbuffer));
     fm->c_array = av_malloc((((w + fm->blockx/2)/fm->blockx)+1) *
                             (((h + fm->blocky/2)/fm->blocky)+1) *
                             4 * sizeof(*fm->c_array));
diff --git a/libavfilter/vf_fieldorder.c b/libavfilter/vf_fieldorder.c
index ca55ff1..5707151 100644
--- a/libavfilter/vf_fieldorder.c
+++ b/libavfilter/vf_fieldorder.c
@@ -108,8 +108,8 @@
             s->dst_tff ? "up" : "down");
     h = frame->height;
     for (plane = 0; plane < 4 && frame->data[plane] && frame->linesize[plane]; plane++) {
-        dst_line_step = out->linesize[plane];
-        src_line_step = frame->linesize[plane];
+        dst_line_step = out->linesize[plane] * (h > 2);
+        src_line_step = frame->linesize[plane] * (h > 2);
         line_size = s->line_size[plane];
         dst = out->data[plane];
         src = frame->data[plane];
diff --git a/libavfilter/vf_fillborders.c b/libavfilter/vf_fillborders.c
index 1344587..a5a0cb3 100644
--- a/libavfilter/vf_fillborders.c
+++ b/libavfilter/vf_fillborders.c
@@ -69,6 +69,7 @@
         AV_PIX_FMT_YUV420P16, AV_PIX_FMT_YUV422P16, AV_PIX_FMT_YUV444P16,
         AV_PIX_FMT_YUVA420P9, AV_PIX_FMT_YUVA422P9, AV_PIX_FMT_YUVA444P9,
         AV_PIX_FMT_YUVA420P10, AV_PIX_FMT_YUVA422P10, AV_PIX_FMT_YUVA444P10,
+        AV_PIX_FMT_YUVA422P12, AV_PIX_FMT_YUVA444P12,
         AV_PIX_FMT_YUVA420P16, AV_PIX_FMT_YUVA422P16, AV_PIX_FMT_YUVA444P16,
         AV_PIX_FMT_GBRP, AV_PIX_FMT_GBRP9, AV_PIX_FMT_GBRP10,
         AV_PIX_FMT_GBRP12, AV_PIX_FMT_GBRP14, AV_PIX_FMT_GBRP16,
@@ -291,6 +292,20 @@
     s->planewidth[1]  = s->planewidth[2]  = AV_CEIL_RSHIFT(inlink->w, desc->log2_chroma_w);
     s->planewidth[0]  = s->planewidth[3]  = inlink->w;
 
+    if (inlink->w < s->left + s->right ||
+        inlink->w <= s->left ||
+        inlink->w <= s->right ||
+        inlink->h < s->top + s->bottom ||
+        inlink->h <= s->top ||
+        inlink->h <= s->bottom ||
+        inlink->w < s->left * 2 ||
+        inlink->w < s->right * 2 ||
+        inlink->h < s->top * 2 ||
+        inlink->h < s->bottom * 2) {
+        av_log(ctx, AV_LOG_ERROR, "Borders are bigger than input frame size.\n");
+        return AVERROR(EINVAL);
+    }
+
     s->borders[0].left   = s->borders[3].left = s->left;
     s->borders[0].right  = s->borders[3].right = s->right;
     s->borders[0].top    = s->borders[3].top = s->top;
@@ -306,20 +321,6 @@
     s->borders[2].top    = s->top >> desc->log2_chroma_h;
     s->borders[2].bottom = s->bottom >> desc->log2_chroma_h;
 
-    if (inlink->w < s->left + s->right ||
-        inlink->w <= s->left ||
-        inlink->w <= s->right ||
-        inlink->h < s->top + s->bottom ||
-        inlink->h <= s->top ||
-        inlink->h <= s->bottom ||
-        inlink->w < s->left * 2 ||
-        inlink->w < s->right * 2 ||
-        inlink->h < s->top * 2 ||
-        inlink->h < s->bottom * 2) {
-        av_log(ctx, AV_LOG_ERROR, "Borders are bigger than input frame size.\n");
-        return AVERROR(EINVAL);
-    }
-
     switch (s->mode) {
     case FM_SMEAR:  s->fillborders = s->depth <= 8 ? smear_borders8  : smear_borders16;  break;
     case FM_MIRROR: s->fillborders = s->depth <= 8 ? mirror_borders8 : mirror_borders16; break;
@@ -345,8 +346,20 @@
     return 0;
 }
 
+static int process_command(AVFilterContext *ctx, const char *cmd, const char *args,
+                           char *res, int res_len, int flags)
+{
+    int ret;
+
+    ret = ff_filter_process_command(ctx, cmd, args, res, res_len, flags);
+    if (ret < 0)
+        return ret;
+
+    return config_input(ctx->inputs[0]);
+}
+
 #define OFFSET(x) offsetof(FillBordersContext, x)
-#define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
+#define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_RUNTIME_PARAM
 
 static const AVOption fillborders_options[] = {
     { "left",   "set the left fill border",   OFFSET(left),   AV_OPT_TYPE_INT, {.i64=0}, 0, INT_MAX,    FLAGS },
@@ -391,4 +404,5 @@
     .inputs        = fillborders_inputs,
     .outputs       = fillborders_outputs,
     .flags         = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC,
+    .process_command = process_command,
 };
diff --git a/libavfilter/vf_floodfill.c b/libavfilter/vf_floodfill.c
index 323dd0e..11c614a 100644
--- a/libavfilter/vf_floodfill.c
+++ b/libavfilter/vf_floodfill.c
@@ -34,9 +34,11 @@
     const AVClass *class;
 
     int x, y;
-    int s0, s1, s2, s3;
-    int d0, d1, d2, d3;
+    int s[4];
+    int S[4];
+    int d[4];
 
+    int nb_planes;
     int back, front;
     Points *points;
 
@@ -238,12 +240,12 @@
     const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(inlink->format);
     AVFilterContext *ctx = inlink->dst;
     FloodfillContext *s = ctx->priv;
-    int nb_planes = av_pix_fmt_count_planes(inlink->format);
     int depth;
 
+    s->nb_planes = av_pix_fmt_count_planes(inlink->format);
     depth = desc->comp[0].depth;
     if (depth == 8) {
-        switch (nb_planes) {
+        switch (s->nb_planes) {
         case 1: s->set_pixel  = set_pixel1;
                 s->is_same    = is_same1;
                 s->pick_pixel = pick_pixel1; break;
@@ -255,7 +257,7 @@
                 s->pick_pixel = pick_pixel4; break;
        }
     } else {
-        switch (nb_planes) {
+        switch (s->nb_planes) {
         case 1: s->set_pixel  = set_pixel1_16;
                 s->is_same    = is_same1_16;
                 s->pick_pixel = pick_pixel1_16; break;
@@ -280,30 +282,42 @@
 {
     AVFilterContext *ctx = link->dst;
     FloodfillContext *s = ctx->priv;
-    const unsigned d0 = s->d0;
-    const unsigned d1 = s->d1;
-    const unsigned d2 = s->d2;
-    const unsigned d3 = s->d3;
-    int s0 = s->s0;
-    int s1 = s->s1;
-    int s2 = s->s2;
-    int s3 = s->s3;
+    const unsigned d0 = s->d[0];
+    const unsigned d1 = s->d[1];
+    const unsigned d2 = s->d[2];
+    const unsigned d3 = s->d[3];
+    int s0 = s->s[0];
+    int s1 = s->s[1];
+    int s2 = s->s[2];
+    int s3 = s->s[3];
     const int w = frame->width;
     const int h = frame->height;
-    int ret;
-
-    if (ret = av_frame_make_writable(frame))
-        return ret;
+    int i, ret;
 
     if (is_inside(s->x, s->y, w, h)) {
         s->pick_pixel(frame, s->x, s->y, &s0, &s1, &s2, &s3);
 
+        s->S[0] = s0;
+        s->S[1] = s1;
+        s->S[2] = s2;
+        s->S[3] = s3;
+        for (i = 0; i < s->nb_planes; i++) {
+            if (s->S[i] != s->d[i])
+                break;
+        }
+
+        if (i == s->nb_planes)
+            goto end;
+
         if (s->is_same(frame, s->x, s->y, s0, s1, s2, s3)) {
             s->points[s->front].x = s->x;
             s->points[s->front].y = s->y;
             s->front++;
         }
 
+        if (ret = av_frame_make_writable(frame))
+            return ret;
+
         while (s->front > s->back) {
             int x, y;
 
@@ -337,34 +351,20 @@
         }
     }
 
+end:
     return ff_filter_frame(ctx->outputs[0], frame);
 }
 
 static av_cold int query_formats(AVFilterContext *ctx)
 {
     static const enum AVPixelFormat pixel_fmts[] = {
-        AV_PIX_FMT_GRAY8,
-        AV_PIX_FMT_YUV444P,
-        AV_PIX_FMT_YUVA444P,
-        AV_PIX_FMT_GBRP,
-        AV_PIX_FMT_GBRP9,
-        AV_PIX_FMT_GBRP10,
-        AV_PIX_FMT_GBRAP10,
-        AV_PIX_FMT_GBRP12,
-        AV_PIX_FMT_GBRAP12,
-        AV_PIX_FMT_GBRP14,
-        AV_PIX_FMT_GBRP16,
-        AV_PIX_FMT_GBRAP16,
-        AV_PIX_FMT_GBRAP,
-        AV_PIX_FMT_YUV444P9,
-        AV_PIX_FMT_YUVA444P9,
-        AV_PIX_FMT_YUV444P10,
-        AV_PIX_FMT_YUVA444P10,
-        AV_PIX_FMT_YUV444P12,
-        AV_PIX_FMT_YUV444P14,
-        AV_PIX_FMT_GRAY16,
-        AV_PIX_FMT_YUV444P16,
-        AV_PIX_FMT_YUVA444P16,
+        AV_PIX_FMT_GRAY8, AV_PIX_FMT_GRAY9, AV_PIX_FMT_GRAY10, AV_PIX_FMT_GRAY14, AV_PIX_FMT_GRAY16,
+        AV_PIX_FMT_YUV444P, AV_PIX_FMT_YUVA444P,
+        AV_PIX_FMT_GBRP, AV_PIX_FMT_GBRP9, AV_PIX_FMT_GBRP10, AV_PIX_FMT_GBRAP10,
+        AV_PIX_FMT_GBRP12, AV_PIX_FMT_GBRAP12, AV_PIX_FMT_GBRP14, AV_PIX_FMT_GBRP16,
+        AV_PIX_FMT_GBRAP16, AV_PIX_FMT_GBRAP,
+        AV_PIX_FMT_YUV444P9, AV_PIX_FMT_YUVA444P9, AV_PIX_FMT_YUV444P10, AV_PIX_FMT_YUVA444P10,
+        AV_PIX_FMT_YUV444P12, AV_PIX_FMT_YUV444P14, AV_PIX_FMT_YUV444P16, AV_PIX_FMT_YUVA444P16,
         AV_PIX_FMT_NONE
     };
     AVFilterFormats *formats;
@@ -405,16 +405,16 @@
 #define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM
 
 static const AVOption floodfill_options[] = {
-    { "x",  "set pixel x coordinate",             OFFSET(x),  AV_OPT_TYPE_INT, {.i64=0}, 0, UINT16_MAX, FLAGS },
-    { "y",  "set pixel y coordinate",             OFFSET(y),  AV_OPT_TYPE_INT, {.i64=0}, 0, UINT16_MAX, FLAGS },
-    { "s0", "set source #0 component value",      OFFSET(s0), AV_OPT_TYPE_INT, {.i64=0},-1, UINT16_MAX, FLAGS },
-    { "s1", "set source #1 component value",      OFFSET(s1), AV_OPT_TYPE_INT, {.i64=0},-1, UINT16_MAX, FLAGS },
-    { "s2", "set source #2 component value",      OFFSET(s2), AV_OPT_TYPE_INT, {.i64=0},-1, UINT16_MAX, FLAGS },
-    { "s3", "set source #3 component value",      OFFSET(s3), AV_OPT_TYPE_INT, {.i64=0},-1, UINT16_MAX, FLAGS },
-    { "d0", "set destination #0 component value", OFFSET(d0), AV_OPT_TYPE_INT, {.i64=0}, 0, UINT16_MAX, FLAGS },
-    { "d1", "set destination #1 component value", OFFSET(d1), AV_OPT_TYPE_INT, {.i64=0}, 0, UINT16_MAX, FLAGS },
-    { "d2", "set destination #2 component value", OFFSET(d2), AV_OPT_TYPE_INT, {.i64=0}, 0, UINT16_MAX, FLAGS },
-    { "d3", "set destination #3 component value", OFFSET(d3), AV_OPT_TYPE_INT, {.i64=0}, 0, UINT16_MAX, FLAGS },
+    { "x",  "set pixel x coordinate",             OFFSET(x),    AV_OPT_TYPE_INT, {.i64=0}, 0, UINT16_MAX, FLAGS },
+    { "y",  "set pixel y coordinate",             OFFSET(y),    AV_OPT_TYPE_INT, {.i64=0}, 0, UINT16_MAX, FLAGS },
+    { "s0", "set source #0 component value",      OFFSET(s[0]), AV_OPT_TYPE_INT, {.i64=0},-1, UINT16_MAX, FLAGS },
+    { "s1", "set source #1 component value",      OFFSET(s[1]), AV_OPT_TYPE_INT, {.i64=0},-1, UINT16_MAX, FLAGS },
+    { "s2", "set source #2 component value",      OFFSET(s[2]), AV_OPT_TYPE_INT, {.i64=0},-1, UINT16_MAX, FLAGS },
+    { "s3", "set source #3 component value",      OFFSET(s[3]), AV_OPT_TYPE_INT, {.i64=0},-1, UINT16_MAX, FLAGS },
+    { "d0", "set destination #0 component value", OFFSET(d[0]), AV_OPT_TYPE_INT, {.i64=0}, 0, UINT16_MAX, FLAGS },
+    { "d1", "set destination #1 component value", OFFSET(d[1]), AV_OPT_TYPE_INT, {.i64=0}, 0, UINT16_MAX, FLAGS },
+    { "d2", "set destination #2 component value", OFFSET(d[2]), AV_OPT_TYPE_INT, {.i64=0}, 0, UINT16_MAX, FLAGS },
+    { "d3", "set destination #3 component value", OFFSET(d[3]), AV_OPT_TYPE_INT, {.i64=0}, 0, UINT16_MAX, FLAGS },
     { NULL }
 };
 
diff --git a/libavfilter/vf_fps.c b/libavfilter/vf_fps.c
index 9167a00..cf1e367 100644
--- a/libavfilter/vf_fps.c
+++ b/libavfilter/vf_fps.c
@@ -249,12 +249,14 @@
         frame = av_frame_clone(s->frames[0]);
         if (!frame)
             return AVERROR(ENOMEM);
+        // Make sure Closed Captions will not be duplicated
+        av_frame_remove_side_data(s->frames[0], AV_FRAME_DATA_A53_CC);
         frame->pts = s->next_pts++;
 
         av_log(ctx, AV_LOG_DEBUG, "Writing frame with pts %"PRId64" to pts %"PRId64"\n",
                s->frames[0]->pts, frame->pts);
         s->cur_frame_out++;
-
+        *again = 1;
         return ff_filter_frame(outlink, frame);
     }
 }
diff --git a/libavfilter/vf_framepack.c b/libavfilter/vf_framepack.c
index 12a2996..b5d877c 100644
--- a/libavfilter/vf_framepack.c
+++ b/libavfilter/vf_framepack.c
@@ -33,6 +33,7 @@
 #include "libavutil/stereo3d.h"
 
 #include "avfilter.h"
+#include "filters.h"
 #include "formats.h"
 #include "internal.h"
 #include "video.h"
@@ -48,8 +49,6 @@
     enum AVStereo3DType format;         ///< frame pack type output
 
     AVFrame *input_views[2];            ///< input frames
-
-    int64_t double_pts;                 ///< new pts for frameseq mode
 } FramepackContext;
 
 static const enum AVPixelFormat formats_supported[] = {
@@ -120,8 +119,6 @@
     case AV_STEREO3D_FRAMESEQUENCE:
         time_base.den  *= 2;
         frame_rate.num *= 2;
-
-        s->double_pts = AV_NOPTS_VALUE;
         break;
     case AV_STEREO3D_COLUMNS:
     case AV_STEREO3D_SIDEBYSIDE:
@@ -269,39 +266,6 @@
     }
 }
 
-static int try_push_frame(AVFilterContext *ctx);
-
-static int filter_frame_left(AVFilterLink *inlink, AVFrame *frame)
-{
-    FramepackContext *s = inlink->dst->priv;
-    s->input_views[LEFT] = frame;
-    return try_push_frame(inlink->dst);
-}
-
-static int filter_frame_right(AVFilterLink *inlink, AVFrame *frame)
-{
-    FramepackContext *s = inlink->dst->priv;
-    s->input_views[RIGHT] = frame;
-    return try_push_frame(inlink->dst);
-}
-
-static int request_frame(AVFilterLink *outlink)
-{
-    AVFilterContext *ctx = outlink->src;
-    FramepackContext *s = ctx->priv;
-    int ret, i;
-
-    /* get a frame on the either input, stop as soon as a video ends */
-    for (i = 0; i < 2; i++) {
-        if (!s->input_views[i]) {
-            ret = ff_request_frame(ctx->inputs[i]);
-            if (ret < 0)
-                return ret;
-        }
-    }
-    return 0;
-}
-
 static int try_push_frame(AVFilterContext *ctx)
 {
     FramepackContext *s = ctx->priv;
@@ -312,12 +276,12 @@
     if (!(s->input_views[0] && s->input_views[1]))
         return 0;
     if (s->format == AV_STEREO3D_FRAMESEQUENCE) {
-        if (s->double_pts == AV_NOPTS_VALUE)
-            s->double_pts = s->input_views[LEFT]->pts;
+        int64_t pts = s->input_views[0]->pts;
 
         for (i = 0; i < 2; i++) {
             // set correct timestamps
-            s->input_views[i]->pts = s->double_pts++;
+            if (pts != AV_NOPTS_VALUE)
+                s->input_views[i]->pts = i == 0 ? pts * 2 : pts * 2 + av_rescale_q(1, av_inv_q(outlink->frame_rate), outlink->time_base);
 
             // set stereo3d side data
             stereo = av_stereo3d_create_side_data(s->input_views[i]);
@@ -363,21 +327,64 @@
     }
 }
 
+static int activate(AVFilterContext *ctx)
+{
+    AVFilterLink *outlink = ctx->outputs[0];
+    FramepackContext *s = ctx->priv;
+    int ret;
+
+    FF_FILTER_FORWARD_STATUS_BACK_ALL(outlink, ctx);
+
+    if (!s->input_views[0]) {
+        ret = ff_inlink_consume_frame(ctx->inputs[0], &s->input_views[0]);
+        if (ret < 0)
+            return ret;
+    }
+
+    if (!s->input_views[1]) {
+        ret = ff_inlink_consume_frame(ctx->inputs[1], &s->input_views[1]);
+        if (ret < 0)
+            return ret;
+    }
+
+    if (s->input_views[0] && s->input_views[1])
+        return try_push_frame(ctx);
+
+    FF_FILTER_FORWARD_STATUS(ctx->inputs[0], outlink);
+    FF_FILTER_FORWARD_STATUS(ctx->inputs[1], outlink);
+
+    if (ff_outlink_frame_wanted(ctx->outputs[0]) &&
+        !ff_outlink_get_status(ctx->inputs[0]) &&
+        !s->input_views[0]) {
+        ff_inlink_request_frame(ctx->inputs[0]);
+        return 0;
+    }
+
+    if (ff_outlink_frame_wanted(ctx->outputs[0]) &&
+        !ff_outlink_get_status(ctx->inputs[1]) &&
+        !s->input_views[1]) {
+        ff_inlink_request_frame(ctx->inputs[1]);
+        return 0;
+    }
+
+    return FFERROR_NOT_READY;
+}
+
 #define OFFSET(x) offsetof(FramepackContext, x)
-#define V AV_OPT_FLAG_VIDEO_PARAM
+#define VF AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_FILTERING_PARAM
 static const AVOption framepack_options[] = {
     { "format", "Frame pack output format", OFFSET(format), AV_OPT_TYPE_INT,
-        { .i64 = AV_STEREO3D_SIDEBYSIDE }, 0, INT_MAX, .flags = V, .unit = "format" },
+        { .i64 = AV_STEREO3D_SIDEBYSIDE }, 0, INT_MAX, .flags = VF, .unit = "format" },
     { "sbs", "Views are packed next to each other", 0, AV_OPT_TYPE_CONST,
-        { .i64 = AV_STEREO3D_SIDEBYSIDE }, INT_MIN, INT_MAX, .flags = V, .unit = "format" },
+        { .i64 = AV_STEREO3D_SIDEBYSIDE }, INT_MIN, INT_MAX, .flags = VF, .unit = "format" },
     { "tab", "Views are packed on top of each other", 0, AV_OPT_TYPE_CONST,
-        { .i64 = AV_STEREO3D_TOPBOTTOM }, INT_MIN, INT_MAX, .flags = V, .unit = "format" },
+        { .i64 = AV_STEREO3D_TOPBOTTOM }, INT_MIN, INT_MAX, .flags = VF, .unit = "format" },
     { "frameseq", "Views are one after the other", 0, AV_OPT_TYPE_CONST,
-        { .i64 = AV_STEREO3D_FRAMESEQUENCE }, INT_MIN, INT_MAX, .flags = V, .unit = "format" },
+        { .i64 = AV_STEREO3D_FRAMESEQUENCE }, INT_MIN, INT_MAX, .flags = VF, .unit = "format" },
     { "lines", "Views are interleaved by lines", 0, AV_OPT_TYPE_CONST,
-        { .i64 = AV_STEREO3D_LINES }, INT_MIN, INT_MAX, .flags = V, .unit = "format" },
+        { .i64 = AV_STEREO3D_LINES }, INT_MIN, INT_MAX, .flags = VF, .unit = "format" },
     { "columns", "Views are interleaved by columns", 0, AV_OPT_TYPE_CONST,
-        { .i64 = AV_STEREO3D_COLUMNS }, INT_MIN, INT_MAX, .flags = V, .unit = "format" },
+        { .i64 = AV_STEREO3D_COLUMNS }, INT_MIN, INT_MAX, .flags = VF, .unit = "format" },
     { NULL },
 };
 
@@ -387,14 +394,10 @@
     {
         .name         = "left",
         .type         = AVMEDIA_TYPE_VIDEO,
-        .filter_frame = filter_frame_left,
-        .needs_fifo   = 1,
     },
     {
         .name         = "right",
         .type         = AVMEDIA_TYPE_VIDEO,
-        .filter_frame = filter_frame_right,
-        .needs_fifo   = 1,
     },
     { NULL }
 };
@@ -404,7 +407,6 @@
         .name          = "packed",
         .type          = AVMEDIA_TYPE_VIDEO,
         .config_props  = config_output,
-        .request_frame = request_frame,
     },
     { NULL }
 };
@@ -417,5 +419,6 @@
     .query_formats = query_formats,
     .inputs        = framepack_inputs,
     .outputs       = framepack_outputs,
+    .activate      = activate,
     .uninit        = framepack_uninit,
 };
diff --git a/libavfilter/vf_framerate.c b/libavfilter/vf_framerate.c
index fb65381..6c8d01c 100644
--- a/libavfilter/vf_framerate.c
+++ b/libavfilter/vf_framerate.c
@@ -33,13 +33,13 @@
 #include "libavutil/internal.h"
 #include "libavutil/opt.h"
 #include "libavutil/pixdesc.h"
-#include "libavutil/pixelutils.h"
 
 #include "avfilter.h"
 #include "internal.h"
 #include "video.h"
 #include "filters.h"
 #include "framerate.h"
+#include "scene_sad.h"
 
 #define OFFSET(x) offsetof(FrameRateContext, x)
 #define V AV_OPT_FLAG_VIDEO_PARAM
@@ -51,7 +51,7 @@
 
     {"interp_start",        "point to start linear interpolation",    OFFSET(interp_start),    AV_OPT_TYPE_INT,      {.i64=15},                 0,       255,     V|F },
     {"interp_end",          "point to end linear interpolation",      OFFSET(interp_end),      AV_OPT_TYPE_INT,      {.i64=240},                0,       255,     V|F },
-    {"scene",               "scene change level",                     OFFSET(scene_score),     AV_OPT_TYPE_DOUBLE,   {.dbl=8.2},                0,       INT_MAX, V|F },
+    {"scene",               "scene change level",                     OFFSET(scene_score),     AV_OPT_TYPE_DOUBLE,   {.dbl=8.2},                0,       100., V|F },
 
     {"flags",               "set flags",                              OFFSET(flags),           AV_OPT_TYPE_FLAGS,    {.i64=1},                  0,       INT_MAX, V|F, "flags" },
     {"scene_change_detect", "enable scene change detection",          0,                       AV_OPT_TYPE_CONST,    {.i64=FRAMERATE_FLAG_SCD}, INT_MIN, INT_MAX, V|F, "flags" },
@@ -62,52 +62,6 @@
 
 AVFILTER_DEFINE_CLASS(framerate);
 
-static av_always_inline int64_t sad_8x8_16(const uint16_t *src1, ptrdiff_t stride1,
-                                           const uint16_t *src2, ptrdiff_t stride2)
-{
-    int sum = 0;
-    int x, y;
-
-    for (y = 0; y < 8; y++) {
-        for (x = 0; x < 8; x++)
-            sum += FFABS(src1[x] - src2[x]);
-        src1 += stride1;
-        src2 += stride2;
-    }
-    return sum;
-}
-
-static int64_t scene_sad16(FrameRateContext *s, const uint16_t *p1, int p1_linesize, const uint16_t* p2, int p2_linesize, const int width, const int height)
-{
-    int64_t sad;
-    int x, y;
-    for (sad = y = 0; y < height - 7; y += 8) {
-        for (x = 0; x < width - 7; x += 8) {
-            sad += sad_8x8_16(p1 + y * p1_linesize + x,
-                              p1_linesize,
-                              p2 + y * p2_linesize + x,
-                              p2_linesize);
-        }
-    }
-    return sad;
-}
-
-static int64_t scene_sad8(FrameRateContext *s, uint8_t *p1, int p1_linesize, uint8_t* p2, int p2_linesize, const int width, const int height)
-{
-    int64_t sad;
-    int x, y;
-    for (sad = y = 0; y < height - 7; y += 8) {
-        for (x = 0; x < width - 7; x += 8) {
-            sad += s->sad(p1 + y * p1_linesize + x,
-                          p1_linesize,
-                          p2 + y * p2_linesize + x,
-                          p2_linesize);
-        }
-    }
-    emms_c();
-    return sad;
-}
-
 static double get_scene_score(AVFilterContext *ctx, AVFrame *crnt, AVFrame *next)
 {
     FrameRateContext *s = ctx->priv;
@@ -117,16 +71,13 @@
 
     if (crnt->height == next->height &&
         crnt->width  == next->width) {
-        int64_t sad;
+        uint64_t sad;
         double mafd, diff;
 
         ff_dlog(ctx, "get_scene_score() process\n");
-        if (s->bitdepth == 8)
-            sad = scene_sad8(s, crnt->data[0], crnt->linesize[0], next->data[0], next->linesize[0], crnt->width, crnt->height);
-        else
-            sad = scene_sad16(s, (const uint16_t*)crnt->data[0], crnt->linesize[0] / 2, (const uint16_t*)next->data[0], next->linesize[0] / 2, crnt->width, crnt->height);
-
-        mafd = (double)sad * 100.0 / FFMAX(1, (crnt->height & ~7) * (crnt->width & ~7)) / (1 << s->bitdepth);
+        s->sad(crnt->data[0], crnt->linesize[0], next->data[0], next->linesize[0], crnt->width, crnt->height, &sad);
+        emms_c();
+        mafd = (double)sad * 100.0 / (crnt->width * crnt->height) / (1 << s->bitdepth);
         diff = fabs(mafd - s->prev_mafd);
         ret  = av_clipf(FFMIN(mafd, diff), 0, 100.0);
         s->prev_mafd = mafd;
@@ -144,29 +95,22 @@
 {
     FrameRateContext *s = ctx->priv;
     ThreadData *td = arg;
+    AVFrame *work = s->work;
+    AVFrame *src1 = td->copy_src1;
+    AVFrame *src2 = td->copy_src2;
     uint16_t src1_factor = td->src1_factor;
     uint16_t src2_factor = td->src2_factor;
     int plane;
 
-    for (plane = 0; plane < 4 && td->copy_src1->data[plane] && td->copy_src2->data[plane]; plane++) {
-        int cpy_line_width = s->line_size[plane];
-        uint8_t *cpy_src1_data = td->copy_src1->data[plane];
-        int cpy_src1_line_size = td->copy_src1->linesize[plane];
-        uint8_t *cpy_src2_data = td->copy_src2->data[plane];
-        int cpy_src2_line_size = td->copy_src2->linesize[plane];
-        int cpy_src_h = (plane > 0 && plane < 3) ? (td->copy_src1->height >> s->vsub) : (td->copy_src1->height);
-        uint8_t *cpy_dst_data = s->work->data[plane];
-        int cpy_dst_line_size = s->work->linesize[plane];
-        const int start = (cpy_src_h *  job   ) / nb_jobs;
-        const int end   = (cpy_src_h * (job+1)) / nb_jobs;
-        cpy_src1_data += start * cpy_src1_line_size;
-        cpy_src2_data += start * cpy_src2_line_size;
-        cpy_dst_data += start * cpy_dst_line_size;
+    for (plane = 0; plane < 4 && src1->data[plane] && src2->data[plane]; plane++) {
+        const int start = (s->height[plane] *  job   ) / nb_jobs;
+        const int end   = (s->height[plane] * (job+1)) / nb_jobs;
+        uint8_t *src1_data = src1->data[plane] + start * src1->linesize[plane];
+        uint8_t *src2_data = src2->data[plane] + start * src2->linesize[plane];
+        uint8_t *dst_data  = work->data[plane] + start * work->linesize[plane];
 
-        s->blend(cpy_src1_data, cpy_src1_line_size,
-                 cpy_src2_data, cpy_src2_line_size,
-                 cpy_dst_data,  cpy_dst_line_size,
-                 cpy_line_width, end - start,
+        s->blend(src1_data, src1->linesize[plane], src2_data, src2->linesize[plane],
+                 dst_data,  work->linesize[plane], s->line_size[plane], end - start,
                  src1_factor, src2_factor, s->blend_factor_max >> 1);
     }
 
@@ -291,44 +235,38 @@
     return ff_set_common_formats(ctx, fmts_list);
 }
 
-static void blend_frames_c(BLEND_FUNC_PARAMS)
-{
-    int line, pixel;
-    for (line = 0; line < height; line++) {
-        for (pixel = 0; pixel < width; pixel++)
-            dst[pixel] = ((src1[pixel] * factor1) + (src2[pixel] * factor2) + half) >> BLEND_FACTOR_DEPTH8;
-        src1 += src1_linesize;
-        src2 += src2_linesize;
-        dst  += dst_linesize;
-    }
+#define BLEND_FRAME_FUNC(nbits)                         \
+static void blend_frames##nbits##_c(BLEND_FUNC_PARAMS)  \
+{                                                       \
+    int line, pixel;                                    \
+    uint##nbits##_t *dstw  = (uint##nbits##_t *)dst;    \
+    uint##nbits##_t *src1w = (uint##nbits##_t *)src1;   \
+    uint##nbits##_t *src2w = (uint##nbits##_t *)src2;   \
+    int bytes = nbits / 8;                              \
+    width /= bytes;                                     \
+    src1_linesize /= bytes;                             \
+    src2_linesize /= bytes;                             \
+    dst_linesize /= bytes;                              \
+    for (line = 0; line < height; line++) {             \
+        for (pixel = 0; pixel < width; pixel++)         \
+            dstw[pixel] = ((src1w[pixel] * factor1) +   \
+                    (src2w[pixel] * factor2) + half)    \
+                    >> BLEND_FACTOR_DEPTH(nbits);       \
+        src1w += src1_linesize;                         \
+        src2w += src2_linesize;                         \
+        dstw  += dst_linesize;                          \
+    }                                                   \
 }
-
-static void blend_frames16_c(BLEND_FUNC_PARAMS)
-{
-    int line, pixel;
-    uint16_t *dstw = (uint16_t *)dst;
-    uint16_t *src1w = (uint16_t *)src1;
-    uint16_t *src2w = (uint16_t *)src2;
-    width /= 2;
-    src1_linesize /= 2;
-    src2_linesize /= 2;
-    dst_linesize /= 2;
-    for (line = 0; line < height; line++) {
-        for (pixel = 0; pixel < width; pixel++)
-            dstw[pixel] = ((src1w[pixel] * factor1) + (src2w[pixel] * factor2) + half) >> BLEND_FACTOR_DEPTH16;
-        src1w += src1_linesize;
-        src2w += src2_linesize;
-        dstw  += dst_linesize;
-    }
-}
+BLEND_FRAME_FUNC(8)
+BLEND_FRAME_FUNC(16)
 
 void ff_framerate_init(FrameRateContext *s)
 {
     if (s->bitdepth == 8) {
-        s->blend_factor_max = 1 << BLEND_FACTOR_DEPTH8;
-        s->blend = blend_frames_c;
+        s->blend_factor_max = 1 << BLEND_FACTOR_DEPTH(8);
+        s->blend = blend_frames8_c;
     } else {
-        s->blend_factor_max = 1 << BLEND_FACTOR_DEPTH16;
+        s->blend_factor_max = 1 << BLEND_FACTOR_DEPTH(16);
         s->blend = blend_frames16_c;
     }
     if (ARCH_X86)
@@ -342,15 +280,15 @@
     const AVPixFmtDescriptor *pix_desc = av_pix_fmt_desc_get(inlink->format);
     int plane;
 
+    s->vsub = pix_desc->log2_chroma_h;
     for (plane = 0; plane < 4; plane++) {
-        s->line_size[plane] = av_image_get_linesize(inlink->format, inlink->w,
-                                                    plane);
+        s->line_size[plane] = av_image_get_linesize(inlink->format, inlink->w, plane);
+        s->height[plane] = inlink->h >> ((plane == 1 || plane == 2) ? s->vsub : 0);
     }
 
     s->bitdepth = pix_desc->comp[0].depth;
-    s->vsub = pix_desc->log2_chroma_h;
 
-    s->sad = av_pixelutils_get_sad_fn(3, 3, 2, s); // 8x8 both sources aligned
+    s->sad = ff_scene_sad_get_fn(s->bitdepth == 8 ? 8 : 16);
     if (!s->sad)
         return AVERROR(EINVAL);
 
diff --git a/libavfilter/vf_freezedetect.c b/libavfilter/vf_freezedetect.c
new file mode 100644
index 0000000..cc086af
--- /dev/null
+++ b/libavfilter/vf_freezedetect.c
@@ -0,0 +1,235 @@
+/*
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file
+ * video freeze detection filter
+ */
+
+#include "libavutil/avassert.h"
+#include "libavutil/imgutils.h"
+#include "libavutil/opt.h"
+#include "libavutil/pixdesc.h"
+#include "libavutil/timestamp.h"
+
+#include "avfilter.h"
+#include "filters.h"
+#include "scene_sad.h"
+
+typedef struct FreezeDetectContext {
+    const AVClass *class;
+
+    ptrdiff_t width[4];
+    ptrdiff_t height[4];
+    ff_scene_sad_fn sad;
+    int bitdepth;
+    AVFrame *reference_frame;
+    int64_t n;
+    int64_t reference_n;
+    int frozen;
+
+    double noise;
+    int64_t duration;            ///< minimum duration of frozen frame until notification
+} FreezeDetectContext;
+
+#define OFFSET(x) offsetof(FreezeDetectContext, x)
+#define V AV_OPT_FLAG_VIDEO_PARAM
+#define F AV_OPT_FLAG_FILTERING_PARAM
+
+static const AVOption freezedetect_options[] = {
+    { "n",                   "set noise tolerance",                       OFFSET(noise),  AV_OPT_TYPE_DOUBLE,   {.dbl=0.001},     0,       1.0, V|F },
+    { "noise",               "set noise tolerance",                       OFFSET(noise),  AV_OPT_TYPE_DOUBLE,   {.dbl=0.001},     0,       1.0, V|F },
+    { "d",                   "set minimum duration in seconds",        OFFSET(duration),  AV_OPT_TYPE_DURATION, {.i64=2000000},   0, INT64_MAX, V|F },
+    { "duration",            "set minimum duration in seconds",        OFFSET(duration),  AV_OPT_TYPE_DURATION, {.i64=2000000},   0, INT64_MAX, V|F },
+
+    {NULL}
+};
+
+AVFILTER_DEFINE_CLASS(freezedetect);
+
+static int query_formats(AVFilterContext *ctx)
+{
+    static const enum AVPixelFormat pix_fmts[] = {
+        AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUYV422, AV_PIX_FMT_RGB24,
+        AV_PIX_FMT_BGR24, AV_PIX_FMT_YUV422P, AV_PIX_FMT_YUV444P,
+        AV_PIX_FMT_YUV410P, AV_PIX_FMT_YUV411P, AV_PIX_FMT_GRAY8,
+        AV_PIX_FMT_YUVJ420P, AV_PIX_FMT_YUVJ422P, AV_PIX_FMT_YUVJ444P,
+        AV_PIX_FMT_UYVY422, AV_PIX_FMT_NV12, AV_PIX_FMT_NV21, AV_PIX_FMT_ARGB,
+        AV_PIX_FMT_RGBA, AV_PIX_FMT_ABGR, AV_PIX_FMT_BGRA, AV_PIX_FMT_GRAY16,
+        AV_PIX_FMT_YUV440P, AV_PIX_FMT_YUVJ440P, AV_PIX_FMT_YUVA420P,
+        AV_PIX_FMT_YUV420P16, AV_PIX_FMT_YUV422P16, AV_PIX_FMT_YUV444P16,
+        AV_PIX_FMT_YA8, AV_PIX_FMT_YUV420P9, AV_PIX_FMT_YUV420P10,
+        AV_PIX_FMT_YUV422P10, AV_PIX_FMT_YUV444P9, AV_PIX_FMT_YUV444P10,
+        AV_PIX_FMT_YUV422P9, AV_PIX_FMT_GBRP, AV_PIX_FMT_GBRP9,
+        AV_PIX_FMT_GBRP10, AV_PIX_FMT_GBRP16, AV_PIX_FMT_YUVA422P,
+        AV_PIX_FMT_YUVA444P, AV_PIX_FMT_YUVA420P9, AV_PIX_FMT_YUVA422P9,
+        AV_PIX_FMT_YUVA444P9, AV_PIX_FMT_YUVA420P10, AV_PIX_FMT_YUVA422P10,
+        AV_PIX_FMT_YUVA444P10, AV_PIX_FMT_YUVA420P16, AV_PIX_FMT_YUVA422P16,
+        AV_PIX_FMT_YUVA444P16, AV_PIX_FMT_NV16, AV_PIX_FMT_YVYU422,
+        AV_PIX_FMT_GBRAP, AV_PIX_FMT_GBRAP16, AV_PIX_FMT_YUV420P12,
+        AV_PIX_FMT_YUV420P14, AV_PIX_FMT_YUV422P12, AV_PIX_FMT_YUV422P14,
+        AV_PIX_FMT_YUV444P12, AV_PIX_FMT_YUV444P14, AV_PIX_FMT_GBRP12,
+        AV_PIX_FMT_GBRP14, AV_PIX_FMT_YUVJ411P, AV_PIX_FMT_YUV440P10,
+        AV_PIX_FMT_YUV440P12, AV_PIX_FMT_GBRAP12, AV_PIX_FMT_GBRAP10,
+        AV_PIX_FMT_GRAY12, AV_PIX_FMT_GRAY10, AV_PIX_FMT_GRAY9,
+        AV_PIX_FMT_GRAY14,
+        AV_PIX_FMT_NONE
+    };
+
+    AVFilterFormats *fmts_list = ff_make_format_list(pix_fmts);
+    if (!fmts_list)
+        return AVERROR(ENOMEM);
+    return ff_set_common_formats(ctx, fmts_list);
+}
+
+static int config_input(AVFilterLink *inlink)
+{
+    AVFilterContext *ctx = inlink->dst;
+    FreezeDetectContext *s = ctx->priv;
+    const AVPixFmtDescriptor *pix_desc = av_pix_fmt_desc_get(inlink->format);
+
+    s->bitdepth = pix_desc->comp[0].depth;
+
+    for (int plane = 0; plane < 4; plane++) {
+        ptrdiff_t line_size = av_image_get_linesize(inlink->format, inlink->w, plane);
+        s->width[plane] = line_size >> (s->bitdepth > 8);
+        s->height[plane] = inlink->h >> ((plane == 1 || plane == 2) ? pix_desc->log2_chroma_h : 0);
+    }
+
+    s->sad = ff_scene_sad_get_fn(s->bitdepth == 8 ? 8 : 16);
+    if (!s->sad)
+        return AVERROR(EINVAL);
+
+    return 0;
+}
+
+static av_cold void uninit(AVFilterContext *ctx)
+{
+    FreezeDetectContext *s = ctx->priv;
+    av_frame_free(&s->reference_frame);
+}
+
+static int is_frozen(FreezeDetectContext *s, AVFrame *reference, AVFrame *frame)
+{
+    uint64_t sad = 0;
+    uint64_t count = 0;
+    double mafd;
+    for (int plane = 0; plane < 4; plane++) {
+        if (s->width[plane]) {
+            uint64_t plane_sad;
+            s->sad(frame->data[plane], frame->linesize[plane],
+                   reference->data[plane], reference->linesize[plane],
+                   s->width[plane], s->height[plane], &plane_sad);
+            sad += plane_sad;
+            count += s->width[plane] * s->height[plane];
+        }
+    }
+    emms_c();
+    mafd = (double)sad / count / (1ULL << s->bitdepth);
+    return (mafd <= s->noise);
+}
+
+static int set_meta(FreezeDetectContext *s, AVFrame *frame, const char *key, const char *value)
+{
+    av_log(s, AV_LOG_INFO, "%s: %s\n", key, value);
+    return av_dict_set(&frame->metadata, key, value, 0);
+}
+
+static int activate(AVFilterContext *ctx)
+{
+    int ret;
+    AVFilterLink *inlink = ctx->inputs[0];
+    AVFilterLink *outlink = ctx->outputs[0];
+    FreezeDetectContext *s = ctx->priv;
+    AVFrame *frame;
+
+    FF_FILTER_FORWARD_STATUS_BACK(outlink, inlink);
+
+    ret = ff_inlink_consume_frame(inlink, &frame);
+    if (ret < 0)
+        return ret;
+
+    if (frame) {
+        int frozen = 0;
+        s->n++;
+
+        if (s->reference_frame) {
+            int64_t duration;
+            if (s->reference_frame->pts == AV_NOPTS_VALUE || frame->pts == AV_NOPTS_VALUE || frame->pts < s->reference_frame->pts)     // Discontinuity?
+                duration = inlink->frame_rate.num > 0 ? av_rescale_q(s->n - s->reference_n, av_inv_q(inlink->frame_rate), AV_TIME_BASE_Q) : 0;
+            else
+                duration = av_rescale_q(frame->pts - s->reference_frame->pts, inlink->time_base, AV_TIME_BASE_Q);
+
+            frozen = is_frozen(s, s->reference_frame, frame);
+            if (duration >= s->duration) {
+                if (!s->frozen)
+                    set_meta(s, frame, "lavfi.freezedetect.freeze_start", av_ts2timestr(s->reference_frame->pts, &inlink->time_base));
+                if (!frozen) {
+                    set_meta(s, frame, "lavfi.freezedetect.freeze_duration", av_ts2timestr(duration, &AV_TIME_BASE_Q));
+                    set_meta(s, frame, "lavfi.freezedetect.freeze_end", av_ts2timestr(frame->pts, &inlink->time_base));
+                }
+                s->frozen = frozen;
+            }
+        }
+
+        if (!frozen) {
+            av_frame_free(&s->reference_frame);
+            s->reference_frame = av_frame_clone(frame);
+            s->reference_n = s->n;
+            if (!s->reference_frame) {
+                av_frame_free(&frame);
+                return AVERROR(ENOMEM);
+            }
+        }
+        return ff_filter_frame(outlink, frame);
+    }
+
+    FF_FILTER_FORWARD_STATUS(inlink, outlink);
+    FF_FILTER_FORWARD_WANTED(outlink, inlink);
+
+    return FFERROR_NOT_READY;
+}
+
+static const AVFilterPad freezedetect_inputs[] = {
+    {
+        .name         = "default",
+        .type         = AVMEDIA_TYPE_VIDEO,
+        .config_props = config_input,
+    },
+    { NULL }
+};
+
+static const AVFilterPad freezedetect_outputs[] = {
+    {
+        .name          = "default",
+        .type          = AVMEDIA_TYPE_VIDEO,
+    },
+    { NULL }
+};
+
+AVFilter ff_vf_freezedetect = {
+    .name          = "freezedetect",
+    .description   = NULL_IF_CONFIG_SMALL("Detects frozen video input."),
+    .priv_size     = sizeof(FreezeDetectContext),
+    .priv_class    = &freezedetect_class,
+    .uninit        = uninit,
+    .query_formats = query_formats,
+    .inputs        = freezedetect_inputs,
+    .outputs       = freezedetect_outputs,
+    .activate      = activate,
+};
diff --git a/libavfilter/vf_freezeframes.c b/libavfilter/vf_freezeframes.c
new file mode 100644
index 0000000..b6cd5db
--- /dev/null
+++ b/libavfilter/vf_freezeframes.c
@@ -0,0 +1,167 @@
+/*
+ * Copyright (c) 2019 Paul B Mahol
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "libavutil/avassert.h"
+#include "libavutil/avstring.h"
+#include "libavutil/common.h"
+#include "libavutil/internal.h"
+#include "libavutil/opt.h"
+
+#include "avfilter.h"
+#include "filters.h"
+#include "internal.h"
+#include "video.h"
+
+typedef struct FreezeFramesContext {
+    const AVClass *class;
+    int64_t first, last, replace;
+
+    AVFrame *replace_frame;
+} FreezeFramesContext;
+
+#define OFFSET(x) offsetof(FreezeFramesContext, x)
+#define FLAGS (AV_OPT_FLAG_FILTERING_PARAM | AV_OPT_FLAG_VIDEO_PARAM)
+
+static const AVOption freezeframes_options[] = {
+    { "first",   "set first frame to freeze", OFFSET(first),   AV_OPT_TYPE_INT64, {.i64=0}, 0, INT64_MAX, FLAGS },
+    { "last",    "set last frame to freeze",  OFFSET(last),    AV_OPT_TYPE_INT64, {.i64=0}, 0, INT64_MAX, FLAGS },
+    { "replace", "set frame to replace",      OFFSET(replace), AV_OPT_TYPE_INT64, {.i64=0}, 0, INT64_MAX, FLAGS },
+    { NULL },
+};
+
+AVFILTER_DEFINE_CLASS(freezeframes);
+
+static int config_output(AVFilterLink *outlink)
+{
+    AVFilterContext *ctx = outlink->src;
+    AVFilterLink *sourcelink = ctx->inputs[0];
+    AVFilterLink *replacelink = ctx->inputs[1];
+
+    if (sourcelink->w != replacelink->w || sourcelink->h != replacelink->h) {
+        av_log(ctx, AV_LOG_ERROR,
+               "Input frame sizes do not match (%dx%d vs %dx%d).\n",
+               sourcelink->w, sourcelink->h,
+               replacelink->w, replacelink->h);
+        return AVERROR(EINVAL);
+    }
+
+    outlink->w = sourcelink->w;
+    outlink->h = sourcelink->h;
+    outlink->time_base = sourcelink->time_base;
+    outlink->sample_aspect_ratio = sourcelink->sample_aspect_ratio;
+    outlink->frame_rate = sourcelink->frame_rate;
+
+    return 0;
+}
+
+static int activate(AVFilterContext *ctx)
+{
+    AVFilterLink *outlink = ctx->outputs[0];
+    FreezeFramesContext *s = ctx->priv;
+    AVFrame *frame = NULL;
+    int drop = ctx->inputs[0]->frame_count_out >= s->first &&
+               ctx->inputs[0]->frame_count_out <= s->last;
+    int replace = ctx->inputs[1]->frame_count_out == s->replace;
+    int ret;
+
+    FF_FILTER_FORWARD_STATUS_BACK_ALL(outlink, ctx);
+
+    if (drop && s->replace_frame) {
+        ret = ff_inlink_consume_frame(ctx->inputs[0], &frame);
+        if (ret < 0)
+            return ret;
+
+        if (frame) {
+            int64_t dropped_pts = frame->pts;
+
+            av_frame_free(&frame);
+            frame = av_frame_clone(s->replace_frame);
+            if (!frame)
+                return AVERROR(ENOMEM);
+            frame->pts = dropped_pts;
+            return ff_filter_frame(outlink, frame);
+        }
+    } else if (!drop) {
+        ret = ff_inlink_consume_frame(ctx->inputs[0], &frame);
+        if (ret < 0)
+            return ret;
+
+        if (frame)
+            return ff_filter_frame(outlink, frame);
+    }
+
+    ret = ff_inlink_consume_frame(ctx->inputs[1], &frame);
+    if (ret < 0)
+        return ret;
+    if (replace && frame) {
+        s->replace_frame = frame;
+    } else if (frame) {
+        av_frame_free(&frame);
+    }
+
+    FF_FILTER_FORWARD_STATUS(ctx->inputs[0], outlink);
+    FF_FILTER_FORWARD_STATUS(ctx->inputs[1], outlink);
+
+    if (!drop || (drop && s->replace_frame))
+        FF_FILTER_FORWARD_WANTED(outlink, ctx->inputs[0]);
+    if (!s->replace_frame)
+        FF_FILTER_FORWARD_WANTED(outlink, ctx->inputs[1]);
+
+    return FFERROR_NOT_READY;
+}
+
+static av_cold void uninit(AVFilterContext *ctx)
+{
+    FreezeFramesContext *s = ctx->priv;
+
+    av_frame_free(&s->replace_frame);
+}
+
+static const AVFilterPad freezeframes_inputs[] = {
+    {
+        .name = "source",
+        .type = AVMEDIA_TYPE_VIDEO,
+    },
+    {
+        .name = "replace",
+        .type = AVMEDIA_TYPE_VIDEO,
+    },
+    { NULL },
+};
+
+static const AVFilterPad freezeframes_outputs[] = {
+    {
+        .name         = "default",
+        .type         = AVMEDIA_TYPE_VIDEO,
+        .config_props = config_output,
+    },
+    { NULL },
+};
+
+AVFilter ff_vf_freezeframes = {
+    .name          = "freezeframes",
+    .description   = NULL_IF_CONFIG_SMALL("Freeze video frames."),
+    .priv_size     = sizeof(FreezeFramesContext),
+    .priv_class    = &freezeframes_class,
+    .inputs        = freezeframes_inputs,
+    .outputs       = freezeframes_outputs,
+    .activate      = activate,
+    .uninit        = uninit,
+};
diff --git a/libavfilter/vf_frei0r.c b/libavfilter/vf_frei0r.c
index c775ed1..5d38405 100644
--- a/libavfilter/vf_frei0r.c
+++ b/libavfilter/vf_frei0r.c
@@ -93,7 +93,7 @@
         double d;
         f0r_param_color_t col;
         f0r_param_position_t pos;
-        f0r_param_string *str;
+        f0r_param_string str;
     } val;
     char *tail;
     uint8_t rgba[4];
diff --git a/libavfilter/vf_gblur.c b/libavfilter/vf_gblur.c
index f77a3ff..2e587f6 100644
--- a/libavfilter/vf_gblur.c
+++ b/libavfilter/vf_gblur.c
@@ -30,32 +30,12 @@
 #include "libavutil/pixdesc.h"
 #include "avfilter.h"
 #include "formats.h"
+#include "gblur.h"
 #include "internal.h"
 #include "video.h"
 
-typedef struct GBlurContext {
-    const AVClass *class;
-
-    float sigma;
-    float sigmaV;
-    int steps;
-    int planes;
-
-    int depth;
-    int planewidth[4];
-    int planeheight[4];
-    float *buffer;
-    float boundaryscale;
-    float boundaryscaleV;
-    float postscale;
-    float postscaleV;
-    float nu;
-    float nuV;
-    int nb_planes;
-} GBlurContext;
-
 #define OFFSET(x) offsetof(GBlurContext, x)
-#define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
+#define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_RUNTIME_PARAM
 
 static const AVOption gblur_options[] = {
     { "sigma",  "set sigma",            OFFSET(sigma),  AV_OPT_TYPE_FLOAT, {.dbl=0.5}, 0.0, 1024, FLAGS },
@@ -72,6 +52,28 @@
     int width;
 } ThreadData;
 
+static void horiz_slice_c(float *buffer, int width, int height, int steps,
+                          float nu, float bscale)
+{
+    int step, x, y;
+    float *ptr;
+    for (y = 0; y < height; y++) {
+        for (step = 0; step < steps; step++) {
+            ptr = buffer + width * y;
+            ptr[0] *= bscale;
+
+            /* Filter rightwards */
+            for (x = 1; x < width; x++)
+                ptr[x] += nu * ptr[x - 1];
+            ptr[x = width - 1] *= bscale;
+
+            /* Filter leftwards */
+            for (; x > 0; x--)
+                ptr[x - 1] += nu * ptr[x];
+        }
+    }
+}
+
 static int filter_horizontally(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
 {
     GBlurContext *s = ctx->priv;
@@ -84,30 +86,47 @@
     const int steps = s->steps;
     const float nu = s->nu;
     float *buffer = s->buffer;
-    int y, x, step;
-    float *ptr;
 
-    /* Filter horizontally along each row */
-    for (y = slice_start; y < slice_end; y++) {
-        for (step = 0; step < steps; step++) {
-            ptr = buffer + width * y;
-            ptr[0] *= boundaryscale;
-
-            /* Filter rightwards */
-            for (x = 1; x < width; x++)
-                ptr[x] += nu * ptr[x - 1];
-
-            ptr[x = width - 1] *= boundaryscale;
-
-            /* Filter leftwards */
-            for (; x > 0; x--)
-                ptr[x - 1] += nu * ptr[x];
-        }
-    }
-
+    s->horiz_slice(buffer + width * slice_start, width, slice_end - slice_start,
+                   steps, nu, boundaryscale);
+    emms_c();
     return 0;
 }
 
+static void do_vertical_columns(float *buffer, int width, int height,
+                                int column_begin, int column_end, int steps,
+                                float nu, float boundaryscale, int column_step)
+{
+    const int numpixels = width * height;
+    int i, x, k, step;
+    float *ptr;
+    for (x = column_begin; x < column_end;) {
+        for (step = 0; step < steps; step++) {
+            ptr = buffer + x;
+            for (k = 0; k < column_step; k++) {
+                ptr[k] *= boundaryscale;
+            }
+            /* Filter downwards */
+            for (i = width; i < numpixels; i += width) {
+                for (k = 0; k < column_step; k++) {
+                    ptr[i + k] += nu * ptr[i - width + k];
+                }
+            }
+            i = numpixels - width;
+
+            for (k = 0; k < column_step; k++)
+                ptr[i + k] *= boundaryscale;
+
+            /* Filter upwards */
+            for (; i > 0; i -= width) {
+                for (k = 0; k < column_step; k++)
+                    ptr[i - width + k] += nu * ptr[i + k];
+            }
+        }
+        x += column_step;
+    }
+}
+
 static int filter_vertically(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
 {
     GBlurContext *s = ctx->priv;
@@ -117,31 +136,19 @@
     const int slice_start = (width *  jobnr   ) / nb_jobs;
     const int slice_end   = (width * (jobnr+1)) / nb_jobs;
     const float boundaryscale = s->boundaryscaleV;
-    const int numpixels = width * height;
     const int steps = s->steps;
     const float nu = s->nuV;
     float *buffer = s->buffer;
-    int i, x, step;
-    float *ptr;
+    int aligned_end;
 
-    /* Filter vertically along each column */
-    for (x = slice_start; x < slice_end; x++) {
-        for (step = 0; step < steps; step++) {
-            ptr = buffer + x;
-            ptr[0] *= boundaryscale;
+    aligned_end = slice_start + (((slice_end - slice_start) >> 3) << 3);
+    /* Filter vertically along columns (process 8 columns in each step) */
+    do_vertical_columns(buffer, width, height, slice_start, aligned_end,
+                        steps, nu, boundaryscale, 8);
 
-            /* Filter downwards */
-            for (i = width; i < numpixels; i += width)
-                ptr[i] += nu * ptr[i - width];
-
-            ptr[i = numpixels - width] *= boundaryscale;
-
-            /* Filter upwards */
-            for (; i > 0; i -= width)
-                ptr[i - width] += nu * ptr[i];
-        }
-    }
-
+    /* Filter un-aligned columns one by one */
+    do_vertical_columns(buffer, width, height, aligned_end, slice_end,
+                        steps, nu, boundaryscale, 1);
     return 0;
 }
 
@@ -150,6 +157,7 @@
 {
     GBlurContext *s = ctx->priv;
     ThreadData *td = arg;
+    const float max = (1 << s->depth) - 1;
     const int height = td->height;
     const int width = td->width;
     const int64_t numpixels = width * (int64_t)height;
@@ -159,8 +167,10 @@
     float *buffer = s->buffer;
     unsigned i;
 
-    for (i = slice_start; i < slice_end; i++)
+    for (i = slice_start; i < slice_end; i++) {
         buffer[i] *= postscale;
+        buffer[i] = av_clipf(buffer[i], 0.f, max);
+    }
 
     return 0;
 }
@@ -198,6 +208,7 @@
         AV_PIX_FMT_YUV420P16, AV_PIX_FMT_YUV422P16, AV_PIX_FMT_YUV444P16,
         AV_PIX_FMT_YUVA420P9, AV_PIX_FMT_YUVA422P9, AV_PIX_FMT_YUVA444P9,
         AV_PIX_FMT_YUVA420P10, AV_PIX_FMT_YUVA422P10, AV_PIX_FMT_YUVA444P10,
+        AV_PIX_FMT_YUVA422P12, AV_PIX_FMT_YUVA444P12,
         AV_PIX_FMT_YUVA420P16, AV_PIX_FMT_YUVA422P16, AV_PIX_FMT_YUVA444P16,
         AV_PIX_FMT_GBRP, AV_PIX_FMT_GBRP9, AV_PIX_FMT_GBRP10,
         AV_PIX_FMT_GBRP12, AV_PIX_FMT_GBRP14, AV_PIX_FMT_GBRP16,
@@ -209,6 +220,13 @@
     return ff_set_common_formats(ctx, ff_make_format_list(pix_fmts));
 }
 
+void ff_gblur_init(GBlurContext *s)
+{
+    s->horiz_slice = horiz_slice_c;
+    if (ARCH_X86_64)
+        ff_gblur_init_x86(s);
+}
+
 static int config_input(AVFilterLink *inlink)
 {
     const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(inlink->format);
@@ -222,13 +240,14 @@
 
     s->nb_planes = av_pix_fmt_count_planes(inlink->format);
 
-    s->buffer = av_malloc_array(inlink->w, inlink->h * sizeof(*s->buffer));
+    s->buffer = av_malloc_array(FFALIGN(inlink->w, 16), FFALIGN(inlink->h, 16) * sizeof(*s->buffer));
     if (!s->buffer)
         return AVERROR(ENOMEM);
 
     if (s->sigmaV < 0) {
         s->sigmaV = s->sigma;
     }
+    ff_gblur_init(s);
 
     return 0;
 }
@@ -364,4 +383,5 @@
     .inputs        = gblur_inputs,
     .outputs       = gblur_outputs,
     .flags         = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC | AVFILTER_FLAG_SLICE_THREADS,
+    .process_command = ff_filter_process_command,
 };
diff --git a/libavfilter/vf_histogram.c b/libavfilter/vf_histogram.c
index 5185992..db1962e 100644
--- a/libavfilter/vf_histogram.c
+++ b/libavfilter/vf_histogram.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012-2013 Paul B Mahol
+ * Copyright (c) 2012-2019 Paul B Mahol
  *
  * This file is part of FFmpeg.
  *
@@ -19,6 +19,7 @@
  */
 
 #include "libavutil/avassert.h"
+#include "libavutil/colorspace.h"
 #include "libavutil/opt.h"
 #include "libavutil/parseutils.h"
 #include "libavutil/pixdesc.h"
@@ -31,13 +32,19 @@
 
 typedef struct HistogramContext {
     const AVClass *class;               ///< AVClass context for log and options purpose
+    int            thistogram;
+    int            envelope;
     unsigned       histogram[256*256];
     int            histogram_size;
+    int            width;
+    int            x_pos;
     int            mult;
     int            ncomp;
     int            dncomp;
     uint8_t        bg_color[4];
     uint8_t        fg_color[4];
+    uint8_t        envelope_rgba[4];
+    uint8_t        envelope_color[4];
     int            level_height;
     int            scale_height;
     int            display_mode;
@@ -48,25 +55,30 @@
     float          bgopacity;
     int            planewidth[4];
     int            planeheight[4];
+    int            start[4];
+    AVFrame       *out;
 } HistogramContext;
 
 #define OFFSET(x) offsetof(HistogramContext, x)
 #define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM
 
+#define COMMON_OPTIONS \
+    { "display_mode", "set display mode", OFFSET(display_mode), AV_OPT_TYPE_INT, {.i64=2}, 0, 2, FLAGS, "display_mode"}, \
+    { "d",            "set display mode", OFFSET(display_mode), AV_OPT_TYPE_INT, {.i64=2}, 0, 2, FLAGS, "display_mode"}, \
+        { "overlay", NULL, 0, AV_OPT_TYPE_CONST, {.i64=0}, 0, 0, FLAGS, "display_mode" }, \
+        { "parade",  NULL, 0, AV_OPT_TYPE_CONST, {.i64=1}, 0, 0, FLAGS, "display_mode" }, \
+        { "stack",   NULL, 0, AV_OPT_TYPE_CONST, {.i64=2}, 0, 0, FLAGS, "display_mode" }, \
+    { "levels_mode", "set levels mode", OFFSET(levels_mode), AV_OPT_TYPE_INT, {.i64=0}, 0, 1, FLAGS, "levels_mode"}, \
+    { "m",           "set levels mode", OFFSET(levels_mode), AV_OPT_TYPE_INT, {.i64=0}, 0, 1, FLAGS, "levels_mode"}, \
+        { "linear",      NULL, 0, AV_OPT_TYPE_CONST, {.i64=0}, 0, 0, FLAGS, "levels_mode" }, \
+        { "logarithmic", NULL, 0, AV_OPT_TYPE_CONST, {.i64=1}, 0, 0, FLAGS, "levels_mode" }, \
+    { "components", "set color components to display", OFFSET(components), AV_OPT_TYPE_INT, {.i64=7}, 1, 15, FLAGS}, \
+    { "c",          "set color components to display", OFFSET(components), AV_OPT_TYPE_INT, {.i64=7}, 1, 15, FLAGS},
+
 static const AVOption histogram_options[] = {
     { "level_height", "set level height", OFFSET(level_height), AV_OPT_TYPE_INT, {.i64=200}, 50, 2048, FLAGS},
     { "scale_height", "set scale height", OFFSET(scale_height), AV_OPT_TYPE_INT, {.i64=12}, 0, 40, FLAGS},
-    { "display_mode", "set display mode", OFFSET(display_mode), AV_OPT_TYPE_INT, {.i64=2}, 0, 2, FLAGS, "display_mode"},
-    { "d",            "set display mode", OFFSET(display_mode), AV_OPT_TYPE_INT, {.i64=2}, 0, 2, FLAGS, "display_mode"},
-        { "overlay", NULL, 0, AV_OPT_TYPE_CONST, {.i64=0}, 0, 0, FLAGS, "display_mode" },
-        { "parade",  NULL, 0, AV_OPT_TYPE_CONST, {.i64=1}, 0, 0, FLAGS, "display_mode" },
-        { "stack",   NULL, 0, AV_OPT_TYPE_CONST, {.i64=2}, 0, 0, FLAGS, "display_mode" },
-    { "levels_mode", "set levels mode", OFFSET(levels_mode), AV_OPT_TYPE_INT, {.i64=0}, 0, 1, FLAGS, "levels_mode"},
-    { "m",           "set levels mode", OFFSET(levels_mode), AV_OPT_TYPE_INT, {.i64=0}, 0, 1, FLAGS, "levels_mode"},
-        { "linear",      NULL, 0, AV_OPT_TYPE_CONST, {.i64=0}, 0, 0, FLAGS, "levels_mode" },
-        { "logarithmic", NULL, 0, AV_OPT_TYPE_CONST, {.i64=1}, 0, 0, FLAGS, "levels_mode" },
-    { "components", "set color components to display", OFFSET(components), AV_OPT_TYPE_INT, {.i64=7}, 1, 15, FLAGS},
-    { "c",          "set color components to display", OFFSET(components), AV_OPT_TYPE_INT, {.i64=7}, 1, 15, FLAGS},
+    COMMON_OPTIONS
     { "fgopacity", "set foreground opacity", OFFSET(fgopacity), AV_OPT_TYPE_FLOAT, {.dbl=0.7}, 0, 1, FLAGS},
     { "f",         "set foreground opacity", OFFSET(fgopacity), AV_OPT_TYPE_FLOAT, {.dbl=0.7}, 0, 1, FLAGS},
     { "bgopacity", "set background opacity", OFFSET(bgopacity), AV_OPT_TYPE_FLOAT, {.dbl=0.5}, 0, 1, FLAGS},
@@ -87,6 +99,7 @@
     AV_PIX_FMT_YUV420P10, AV_PIX_FMT_YUV422P10, AV_PIX_FMT_YUV444P10,
     AV_PIX_FMT_YUVA420P10, AV_PIX_FMT_YUVA422P10, AV_PIX_FMT_YUVA444P10,
     AV_PIX_FMT_YUV420P12, AV_PIX_FMT_YUV422P12, AV_PIX_FMT_YUV444P12, AV_PIX_FMT_YUV440P12,
+    AV_PIX_FMT_YUVA422P12, AV_PIX_FMT_YUVA444P12,
     AV_PIX_FMT_GBRAP,    AV_PIX_FMT_GBRP,
     AV_PIX_FMT_GBRP9,    AV_PIX_FMT_GBRP10,  AV_PIX_FMT_GBRAP10,
     AV_PIX_FMT_GBRP12,   AV_PIX_FMT_GBRAP12,
@@ -110,7 +123,7 @@
 };
 
 static const enum AVPixelFormat levels_out_yuv12_pix_fmts[] = {
-    AV_PIX_FMT_YUV444P12,
+    AV_PIX_FMT_YUVA444P12, AV_PIX_FMT_YUV444P12,
     AV_PIX_FMT_NONE
 };
 
@@ -192,12 +205,12 @@
 
 static int config_input(AVFilterLink *inlink)
 {
-    HistogramContext *h = inlink->dst->priv;
+    HistogramContext *s = inlink->dst->priv;
 
-    h->desc  = av_pix_fmt_desc_get(inlink->format);
-    h->ncomp = h->desc->nb_components;
-    h->histogram_size = 1 << h->desc->comp[0].depth;
-    h->mult = h->histogram_size / 256;
+    s->desc  = av_pix_fmt_desc_get(inlink->format);
+    s->ncomp = s->desc->nb_components;
+    s->histogram_size = 1 << s->desc->comp[0].depth;
+    s->mult = s->histogram_size / 256;
 
     switch (inlink->format) {
     case AV_PIX_FMT_GBRAP12:
@@ -207,21 +220,29 @@
     case AV_PIX_FMT_GBRP9:
     case AV_PIX_FMT_GBRAP:
     case AV_PIX_FMT_GBRP:
-        memcpy(h->bg_color, black_gbrp_color, 4);
-        memcpy(h->fg_color, white_gbrp_color, 4);
+        memcpy(s->bg_color, black_gbrp_color, 4);
+        memcpy(s->fg_color, white_gbrp_color, 4);
+        s->start[0] = s->start[1] = s->start[2] = s->start[3] = 0;
+        memcpy(s->envelope_color, s->envelope_rgba, 4);
         break;
     default:
-        memcpy(h->bg_color, black_yuva_color, 4);
-        memcpy(h->fg_color, white_yuva_color, 4);
+        memcpy(s->bg_color, black_yuva_color, 4);
+        memcpy(s->fg_color, white_yuva_color, 4);
+        s->start[0] = s->start[3] = 0;
+        s->start[1] = s->start[2] = s->histogram_size / 2;
+        s->envelope_color[0] = RGB_TO_Y_BT709(s->envelope_rgba[0], s->envelope_rgba[1], s->envelope_rgba[2]);
+        s->envelope_color[1] = RGB_TO_U_BT709(s->envelope_rgba[0], s->envelope_rgba[1], s->envelope_rgba[2], 0);
+        s->envelope_color[2] = RGB_TO_V_BT709(s->envelope_rgba[0], s->envelope_rgba[1], s->envelope_rgba[2], 0);
+        s->envelope_color[3] = s->envelope_rgba[3];
     }
 
-    h->fg_color[3] = h->fgopacity * 255;
-    h->bg_color[3] = h->bgopacity * 255;
+    s->fg_color[3] = s->fgopacity * 255;
+    s->bg_color[3] = s->bgopacity * 255;
 
-    h->planeheight[1] = h->planeheight[2] = AV_CEIL_RSHIFT(inlink->h, h->desc->log2_chroma_h);
-    h->planeheight[0] = h->planeheight[3] = inlink->h;
-    h->planewidth[1]  = h->planewidth[2]  = AV_CEIL_RSHIFT(inlink->w, h->desc->log2_chroma_w);
-    h->planewidth[0]  = h->planewidth[3]  = inlink->w;
+    s->planeheight[1] = s->planeheight[2] = AV_CEIL_RSHIFT(inlink->h, s->desc->log2_chroma_h);
+    s->planeheight[0] = s->planeheight[3] = inlink->h;
+    s->planewidth[1]  = s->planewidth[2]  = AV_CEIL_RSHIFT(inlink->w, s->desc->log2_chroma_w);
+    s->planewidth[0]  = s->planewidth[3]  = inlink->w;
 
     return 0;
 }
@@ -229,18 +250,29 @@
 static int config_output(AVFilterLink *outlink)
 {
     AVFilterContext *ctx = outlink->src;
-    HistogramContext *h = ctx->priv;
+    HistogramContext *s = ctx->priv;
     int ncomp = 0, i;
 
-    for (i = 0; i < h->ncomp; i++) {
-        if ((1 << i) & h->components)
+    if (!strcmp(ctx->filter->name, "thistogram"))
+        s->thistogram = 1;
+
+    for (i = 0; i < s->ncomp; i++) {
+        if ((1 << i) & s->components)
             ncomp++;
     }
-    outlink->w = h->histogram_size * FFMAX(ncomp * (h->display_mode == 1), 1);
-    outlink->h = (h->level_height + h->scale_height) * FFMAX(ncomp * (h->display_mode == 2), 1);
 
-    h->odesc = av_pix_fmt_desc_get(outlink->format);
-    h->dncomp = h->odesc->nb_components;
+    if (s->thistogram) {
+        if (!s->width)
+            s->width = ctx->inputs[0]->w;
+        outlink->w = s->width * FFMAX(ncomp * (s->display_mode == 1), 1);
+        outlink->h = s->histogram_size * FFMAX(ncomp * (s->display_mode == 2), 1);
+    } else {
+        outlink->w = s->histogram_size * FFMAX(ncomp * (s->display_mode == 1), 1);
+        outlink->h = (s->level_height + s->scale_height) * FFMAX(ncomp * (s->display_mode == 2), 1);
+    }
+
+    s->odesc = av_pix_fmt_desc_get(outlink->format);
+    s->dncomp = s->odesc->nb_components;
     outlink->sample_aspect_ratio = (AVRational){1,1};
 
     return 0;
@@ -248,111 +280,179 @@
 
 static int filter_frame(AVFilterLink *inlink, AVFrame *in)
 {
-    HistogramContext *h   = inlink->dst->priv;
+    HistogramContext *s   = inlink->dst->priv;
     AVFilterContext *ctx  = inlink->dst;
     AVFilterLink *outlink = ctx->outputs[0];
-    AVFrame *out;
+    AVFrame *out = s->out;
     int i, j, k, l, m;
 
-    out = ff_get_video_buffer(outlink, outlink->w, outlink->h);
-    if (!out) {
-        av_frame_free(&in);
-        return AVERROR(ENOMEM);
-    }
+    if (!s->thistogram || !out) {
+        out = ff_get_video_buffer(outlink, outlink->w, outlink->h);
+        if (!out) {
+            av_frame_free(&in);
+            return AVERROR(ENOMEM);
+        }
+        s->out = out;
 
-    out->pts = in->pts;
+        for (k = 0; k < 4 && out->data[k]; k++) {
+            const int is_chroma = (k == 1 || k == 2);
+            const int dst_h = AV_CEIL_RSHIFT(outlink->h, (is_chroma ? s->odesc->log2_chroma_h : 0));
+            const int dst_w = AV_CEIL_RSHIFT(outlink->w, (is_chroma ? s->odesc->log2_chroma_w : 0));
 
-    for (k = 0; k < 4 && out->data[k]; k++) {
-        const int is_chroma = (k == 1 || k == 2);
-        const int dst_h = AV_CEIL_RSHIFT(outlink->h, (is_chroma ? h->odesc->log2_chroma_h : 0));
-        const int dst_w = AV_CEIL_RSHIFT(outlink->w, (is_chroma ? h->odesc->log2_chroma_w : 0));
+            if (s->histogram_size <= 256) {
+                for (i = 0; i < dst_h ; i++)
+                    memset(out->data[s->odesc->comp[k].plane] +
+                           i * out->linesize[s->odesc->comp[k].plane],
+                           s->bg_color[k], dst_w);
+            } else {
+                const int mult = s->mult;
 
-        if (h->histogram_size <= 256) {
-            for (i = 0; i < dst_h ; i++)
-                memset(out->data[h->odesc->comp[k].plane] +
-                       i * out->linesize[h->odesc->comp[k].plane],
-                       h->bg_color[k], dst_w);
-        } else {
-            const int mult = h->mult;
-
-            for (i = 0; i < dst_h ; i++)
-                for (j = 0; j < dst_w; j++)
-                    AV_WN16(out->data[h->odesc->comp[k].plane] +
-                        i * out->linesize[h->odesc->comp[k].plane] + j * 2,
-                        h->bg_color[k] * mult);
+                for (i = 0; i < dst_h ; i++)
+                    for (j = 0; j < dst_w; j++)
+                        AV_WN16(out->data[s->odesc->comp[k].plane] +
+                            i * out->linesize[s->odesc->comp[k].plane] + j * 2,
+                            s->bg_color[k] * mult);
+            }
         }
     }
 
-    for (m = 0, k = 0; k < h->ncomp; k++) {
-        const int p = h->desc->comp[k].plane;
-        const int height = h->planeheight[p];
-        const int width = h->planewidth[p];
+    for (m = 0, k = 0; k < s->ncomp; k++) {
+        const int p = s->desc->comp[k].plane;
+        const int max_value = s->histogram_size - 1 - s->start[p];
+        const int height = s->planeheight[p];
+        const int width = s->planewidth[p];
         double max_hval_log;
         unsigned max_hval = 0;
-        int start, startx;
+        int starty, startx;
 
-        if (!((1 << k) & h->components))
+        if (!((1 << k) & s->components))
             continue;
-        startx = m * h->histogram_size * (h->display_mode == 1);
-        start = m++ * (h->level_height + h->scale_height) * (h->display_mode == 2);
+        if (s->thistogram) {
+            starty = m * s->histogram_size * (s->display_mode == 2);
+            startx = m++ * s->width * (s->display_mode == 1);
+        } else {
+            startx = m * s->histogram_size * (s->display_mode == 1);
+            starty = m++ * (s->level_height + s->scale_height) * (s->display_mode == 2);
+        }
 
-        if (h->histogram_size <= 256) {
+        if (s->histogram_size <= 256) {
             for (i = 0; i < height; i++) {
                 const uint8_t *src = in->data[p] + i * in->linesize[p];
                 for (j = 0; j < width; j++)
-                    h->histogram[src[j]]++;
+                    s->histogram[src[j]]++;
             }
         } else {
             for (i = 0; i < height; i++) {
                 const uint16_t *src = (const uint16_t *)(in->data[p] + i * in->linesize[p]);
                 for (j = 0; j < width; j++)
-                    h->histogram[src[j]]++;
+                    s->histogram[src[j]]++;
             }
         }
 
-        for (i = 0; i < h->histogram_size; i++)
-            max_hval = FFMAX(max_hval, h->histogram[i]);
+        for (i = 0; i < s->histogram_size; i++)
+            max_hval = FFMAX(max_hval, s->histogram[i]);
         max_hval_log = log2(max_hval + 1);
 
-        for (i = 0; i < h->histogram_size; i++) {
-            int col_height;
+        if (s->thistogram) {
+            int minh = s->histogram_size - 1, maxh = 0;
 
-            if (h->levels_mode)
-                col_height = lrint(h->level_height * (1. - (log2(h->histogram[i] + 1) / max_hval_log)));
-            else
-                col_height = h->level_height - (h->histogram[i] * (int64_t)h->level_height + max_hval - 1) / max_hval;
+            for (int i = 0; i < s->histogram_size; i++) {
+                int idx = s->histogram_size - i - 1;
+                int value = s->start[p];
 
-            if (h->histogram_size <= 256) {
-                for (j = h->level_height - 1; j >= col_height; j--) {
-                    if (h->display_mode) {
-                        for (l = 0; l < h->dncomp; l++)
-                            out->data[l][(j + start) * out->linesize[l] + startx + i] = h->fg_color[l];
-                    } else {
-                        out->data[p][(j + start) * out->linesize[p] + startx + i] = 255;
+                if (s->envelope && s->histogram[idx]) {
+                    minh = FFMIN(minh, i);
+                    maxh = FFMAX(maxh, i);
+                }
+
+                if (s->levels_mode)
+                    value += lrint(max_value * (log2(s->histogram[idx] + 1) / max_hval_log));
+                else
+                    value += lrint(max_value * s->histogram[idx] / (float)max_hval);
+
+                if (s->histogram_size <= 256) {
+                    s->out->data[p][(i + starty) * s->out->linesize[p] + startx + s->x_pos] = value;
+                } else {
+                    AV_WN16(s->out->data[p] + (i + starty) * s->out->linesize[p] + startx * 2 + s->x_pos * 2, value);
+                }
+            }
+
+            if (s->envelope) {
+                if (s->histogram_size <= 256) {
+                    s->out->data[0][(minh + starty) * s->out->linesize[p] + startx + s->x_pos] = s->envelope_color[0];
+                    s->out->data[0][(maxh + starty) * s->out->linesize[p] + startx + s->x_pos] = s->envelope_color[0];
+                    if (s->dncomp >= 3) {
+                        s->out->data[1][(minh + starty) * s->out->linesize[p] + startx + s->x_pos] = s->envelope_color[1];
+                        s->out->data[2][(minh + starty) * s->out->linesize[p] + startx + s->x_pos] = s->envelope_color[2];
+                        s->out->data[1][(maxh + starty) * s->out->linesize[p] + startx + s->x_pos] = s->envelope_color[1];
+                        s->out->data[2][(maxh + starty) * s->out->linesize[p] + startx + s->x_pos] = s->envelope_color[2];
+                    }
+                } else {
+                    const int mult = s->mult;
+
+                    AV_WN16(s->out->data[0] + (minh + starty) * s->out->linesize[p] + startx * 2 + s->x_pos * 2, s->envelope_color[0] * mult);
+                    AV_WN16(s->out->data[0] + (maxh + starty) * s->out->linesize[p] + startx * 2 + s->x_pos * 2, s->envelope_color[0] * mult);
+                    if (s->dncomp >= 3) {
+                        AV_WN16(s->out->data[1] + (minh + starty) * s->out->linesize[p] + startx * 2 + s->x_pos * 2, s->envelope_color[1] * mult);
+                        AV_WN16(s->out->data[2] + (minh + starty) * s->out->linesize[p] + startx * 2 + s->x_pos * 2, s->envelope_color[2] * mult);
+                        AV_WN16(s->out->data[1] + (maxh + starty) * s->out->linesize[p] + startx * 2 + s->x_pos * 2, s->envelope_color[1] * mult);
+                        AV_WN16(s->out->data[2] + (maxh + starty) * s->out->linesize[p] + startx * 2 + s->x_pos * 2, s->envelope_color[2] * mult);
                     }
                 }
-                for (j = h->level_height + h->scale_height - 1; j >= h->level_height; j--)
-                    out->data[p][(j + start) * out->linesize[p] + startx + i] = i;
-            } else {
-                const int mult = h->mult;
+            }
+        } else {
+            for (i = 0; i < s->histogram_size; i++) {
+                int col_height;
 
-                for (j = h->level_height - 1; j >= col_height; j--) {
-                    if (h->display_mode) {
-                        for (l = 0; l < h->dncomp; l++)
-                            AV_WN16(out->data[l] + (j + start) * out->linesize[l] + startx * 2 + i * 2, h->fg_color[l] * mult);
-                    } else {
-                        AV_WN16(out->data[p] + (j + start) * out->linesize[p] + startx * 2 + i * 2, 255 * mult);
+                if (s->levels_mode)
+                    col_height = lrint(s->level_height * (1. - (log2(s->histogram[i] + 1) / max_hval_log)));
+                else
+                    col_height = s->level_height - (s->histogram[i] * (int64_t)s->level_height + max_hval - 1) / max_hval;
+
+                if (s->histogram_size <= 256) {
+                    for (j = s->level_height - 1; j >= col_height; j--) {
+                        if (s->display_mode) {
+                            for (l = 0; l < s->dncomp; l++)
+                                out->data[l][(j + starty) * out->linesize[l] + startx + i] = s->fg_color[l];
+                        } else {
+                            out->data[p][(j + starty) * out->linesize[p] + startx + i] = 255;
+                        }
                     }
+                    for (j = s->level_height + s->scale_height - 1; j >= s->level_height; j--)
+                        out->data[p][(j + starty) * out->linesize[p] + startx + i] = i;
+                } else {
+                    const int mult = s->mult;
+
+                    for (j = s->level_height - 1; j >= col_height; j--) {
+                        if (s->display_mode) {
+                            for (l = 0; l < s->dncomp; l++)
+                                AV_WN16(out->data[l] + (j + starty) * out->linesize[l] + startx * 2 + i * 2, s->fg_color[l] * mult);
+                        } else {
+                            AV_WN16(out->data[p] + (j + starty) * out->linesize[p] + startx * 2 + i * 2, 255 * mult);
+                        }
+                    }
+                    for (j = s->level_height + s->scale_height - 1; j >= s->level_height; j--)
+                        AV_WN16(out->data[p] + (j + starty) * out->linesize[p] + startx * 2 + i * 2, i);
                 }
-                for (j = h->level_height + h->scale_height - 1; j >= h->level_height; j--)
-                    AV_WN16(out->data[p] + (j + start) * out->linesize[p] + startx * 2 + i * 2, i);
             }
         }
 
-        memset(h->histogram, 0, h->histogram_size * sizeof(unsigned));
+        memset(s->histogram, 0, s->histogram_size * sizeof(unsigned));
     }
 
+    out->pts = in->pts;
     av_frame_free(&in);
+    s->x_pos++;
+    if (s->x_pos >= s->width)
+        s->x_pos = 0;
+
+    if (s->thistogram) {
+        AVFrame *clone = av_frame_clone(out);
+
+        if (!clone)
+            return AVERROR(ENOMEM);
+        return ff_filter_frame(outlink, clone);
+    }
     return ff_filter_frame(outlink, out);
 }
 
@@ -375,6 +475,8 @@
     { NULL }
 };
 
+#if CONFIG_HISTOGRAM_FILTER
+
 AVFilter ff_vf_histogram = {
     .name          = "histogram",
     .description   = NULL_IF_CONFIG_SMALL("Compute and draw a histogram."),
@@ -384,3 +486,34 @@
     .outputs       = outputs,
     .priv_class    = &histogram_class,
 };
+
+#endif /* CONFIG_HISTOGRAM_FILTER */
+
+#if CONFIG_THISTOGRAM_FILTER
+
+static const AVOption thistogram_options[] = {
+    { "width", "set width", OFFSET(width), AV_OPT_TYPE_INT, {.i64=0}, 0, 8192, FLAGS},
+    { "w",     "set width", OFFSET(width), AV_OPT_TYPE_INT, {.i64=0}, 0, 8192, FLAGS},
+    COMMON_OPTIONS
+    { "bgopacity", "set background opacity", OFFSET(bgopacity), AV_OPT_TYPE_FLOAT, {.dbl=0.9}, 0, 1, FLAGS},
+    { "b",         "set background opacity", OFFSET(bgopacity), AV_OPT_TYPE_FLOAT, {.dbl=0.9}, 0, 1, FLAGS},
+    { "envelope", "display envelope", OFFSET(envelope), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS },
+    { "e",        "display envelope", OFFSET(envelope), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS },
+    { "ecolor", "set envelope color", OFFSET(envelope_rgba), AV_OPT_TYPE_COLOR, {.str="gold"}, 0, 0, FLAGS },
+    { "ec",     "set envelope color", OFFSET(envelope_rgba), AV_OPT_TYPE_COLOR, {.str="gold"}, 0, 0, FLAGS },
+    { NULL }
+};
+
+AVFILTER_DEFINE_CLASS(thistogram);
+
+AVFilter ff_vf_thistogram = {
+    .name          = "thistogram",
+    .description   = NULL_IF_CONFIG_SMALL("Compute and draw a temporal histogram."),
+    .priv_size     = sizeof(HistogramContext),
+    .query_formats = query_formats,
+    .inputs        = inputs,
+    .outputs       = outputs,
+    .priv_class    = &thistogram_class,
+};
+
+#endif /* CONFIG_THISTOGRAM_FILTER */
diff --git a/libavfilter/vf_hqx.c b/libavfilter/vf_hqx.c
index 16a1be7..4f768c7 100644
--- a/libavfilter/vf_hqx.c
+++ b/libavfilter/vf_hqx.c
@@ -523,7 +523,7 @@
             int startg = FFMAX3(-bg, -rg, 0);
             int endg = FFMIN3(255-bg, 255-rg, 255);
             uint32_t y = (uint32_t)(( 299*rg + 1000*startg + 114*bg)/1000);
-            c = bg + (rg<<16) + 0x010101 * startg;
+            c = bg + rg * (1 << 16) + 0x010101 * startg;
             for (g = startg; g <= endg; g++) {
                 hqx->rgbtoyuv[c] = ((y++) << 16) + (u << 8) + v;
                 c+= 0x010101;
diff --git a/libavfilter/vf_hue.c b/libavfilter/vf_hue.c
index 323333b..b75ef21 100644
--- a/libavfilter/vf_hue.c
+++ b/libavfilter/vf_hue.c
@@ -86,7 +86,7 @@
 } HueContext;
 
 #define OFFSET(x) offsetof(HueContext, x)
-#define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
+#define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_RUNTIME_PARAM
 static const AVOption hue_options[] = {
     { "h", "set the hue angle degrees expression", OFFSET(hue_deg_expr), AV_OPT_TYPE_STRING,
       { .str = NULL }, .flags = FLAGS },
@@ -136,7 +136,7 @@
      */
     for (i = 0; i < 256; i++) {
         for (j = 0; j < 256; j++) {
-            /* Normalize the components from range [16;140] to [-112;112] */
+            /* Normalize the components from range [16;240] to [-112;112] */
             u = i - 128;
             v = j - 128;
             /*
diff --git a/libavfilter/vf_hwupload.c b/libavfilter/vf_hwupload.c
index 50bc7e1..7c5dd49 100644
--- a/libavfilter/vf_hwupload.c
+++ b/libavfilter/vf_hwupload.c
@@ -32,10 +32,11 @@
     const AVClass *class;
 
     AVBufferRef       *hwdevice_ref;
-    AVHWDeviceContext *hwdevice;
 
     AVBufferRef       *hwframes_ref;
     AVHWFramesContext *hwframes;
+
+    char *device_type;
 } HWUploadContext;
 
 static int hwupload_query_formats(AVFilterContext *avctx)
@@ -46,17 +47,27 @@
     AVFilterFormats *input_formats = NULL;
     int err, i;
 
-    if (!avctx->hw_device_ctx) {
+    if (ctx->hwdevice_ref) {
+        /* We already have a specified device. */
+    } else if (avctx->hw_device_ctx) {
+        if (ctx->device_type) {
+            err = av_hwdevice_ctx_create_derived(
+                &ctx->hwdevice_ref,
+                av_hwdevice_find_type_by_name(ctx->device_type),
+                avctx->hw_device_ctx, 0);
+            if (err < 0)
+                return err;
+        } else {
+            ctx->hwdevice_ref = av_buffer_ref(avctx->hw_device_ctx);
+            if (!ctx->hwdevice_ref)
+                return AVERROR(ENOMEM);
+        }
+    } else {
         av_log(ctx, AV_LOG_ERROR, "A hardware device reference is required "
                "to upload frames to.\n");
         return AVERROR(EINVAL);
     }
 
-    ctx->hwdevice_ref = av_buffer_ref(avctx->hw_device_ctx);
-    if (!ctx->hwdevice_ref)
-        return AVERROR(ENOMEM);
-    ctx->hwdevice = (AVHWDeviceContext*)ctx->hwdevice_ref->data;
-
     constraints = av_hwdevice_get_hwframe_constraints(ctx->hwdevice_ref, NULL);
     if (!constraints) {
         err = AVERROR(EINVAL);
@@ -127,7 +138,13 @@
            av_get_pix_fmt_name(inlink->format));
 
     ctx->hwframes->format    = outlink->format;
-    ctx->hwframes->sw_format = inlink->format;
+    if (inlink->hw_frames_ctx) {
+        AVHWFramesContext *in_hwframe_ctx =
+            (AVHWFramesContext*)inlink->hw_frames_ctx->data;
+        ctx->hwframes->sw_format = in_hwframe_ctx->sw_format;
+    } else {
+        ctx->hwframes->sw_format = inlink->format;
+    }
     ctx->hwframes->width     = inlink->w;
     ctx->hwframes->height    = inlink->h;
 
@@ -200,13 +217,21 @@
     av_buffer_unref(&ctx->hwdevice_ref);
 }
 
-static const AVClass hwupload_class = {
-    .class_name = "hwupload",
-    .item_name  = av_default_item_name,
-    .option     = NULL,
-    .version    = LIBAVUTIL_VERSION_INT,
+#define OFFSET(x) offsetof(HWUploadContext, x)
+#define FLAGS (AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM)
+static const AVOption hwupload_options[] = {
+    {
+        "derive_device", "Derive a new device of this type",
+        OFFSET(device_type), AV_OPT_TYPE_STRING,
+        { .str = NULL }, 0, 0, FLAGS
+    },
+    {
+        NULL
+    }
 };
 
+AVFILTER_DEFINE_CLASS(hwupload);
+
 static const AVFilterPad hwupload_inputs[] = {
     {
         .name         = "default",
diff --git a/libavfilter/vf_hwupload_cuda.c b/libavfilter/vf_hwupload_cuda.c
index 4d83e6c..8ee0825 100644
--- a/libavfilter/vf_hwupload_cuda.c
+++ b/libavfilter/vf_hwupload_cuda.c
@@ -60,6 +60,9 @@
         AV_PIX_FMT_NV12, AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUV444P,
         AV_PIX_FMT_P010, AV_PIX_FMT_P016, AV_PIX_FMT_YUV444P16,
         AV_PIX_FMT_0RGB32, AV_PIX_FMT_0BGR32,
+#if CONFIG_VULKAN
+        AV_PIX_FMT_VULKAN,
+#endif
         AV_PIX_FMT_NONE,
     };
     static const enum AVPixelFormat output_pix_fmts[] = {
@@ -97,7 +100,12 @@
 
     hwframe_ctx            = (AVHWFramesContext*)s->hwframe->data;
     hwframe_ctx->format    = AV_PIX_FMT_CUDA;
-    hwframe_ctx->sw_format = inlink->format;
+    if (inlink->hw_frames_ctx) {
+        AVHWFramesContext *in_hwframe_ctx = (AVHWFramesContext*)inlink->hw_frames_ctx->data;
+        hwframe_ctx->sw_format = in_hwframe_ctx->sw_format;
+    } else {
+        hwframe_ctx->sw_format = inlink->format;
+    }
     hwframe_ctx->width     = inlink->w;
     hwframe_ctx->height    = inlink->h;
 
diff --git a/libavfilter/vf_hysteresis.c b/libavfilter/vf_hysteresis.c
index ecb917f..48e9179 100644
--- a/libavfilter/vf_hysteresis.c
+++ b/libavfilter/vf_hysteresis.c
@@ -311,7 +311,6 @@
 
     outlink->w = base->w;
     outlink->h = base->h;
-    outlink->time_base = base->time_base;
     outlink->sample_aspect_ratio = base->sample_aspect_ratio;
     outlink->frame_rate = base->frame_rate;
 
@@ -330,7 +329,10 @@
     s->fs.opaque   = s;
     s->fs.on_event = process_frame;
 
-    return ff_framesync_configure(&s->fs);
+    ret = ff_framesync_configure(&s->fs);
+    outlink->time_base = s->fs.time_base;
+
+    return ret;
 }
 
 static int activate(AVFilterContext *ctx)
diff --git a/libavfilter/vf_il.c b/libavfilter/vf_il.c
index ae0cc19..6cd5f89 100644
--- a/libavfilter/vf_il.c
+++ b/libavfilter/vf_il.c
@@ -46,7 +46,7 @@
 } IlContext;
 
 #define OFFSET(x) offsetof(IlContext, x)
-#define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM
+#define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_RUNTIME_PARAM
 
 static const AVOption il_options[] = {
     {"luma_mode",   "select luma mode", OFFSET(luma_mode), AV_OPT_TYPE_INT, {.i64=MODE_NONE}, MODE_NONE, MODE_DEINTERLEAVE, FLAGS, "luma_mode"},
@@ -210,4 +210,5 @@
     .outputs       = outputs,
     .priv_class    = &il_class,
     .flags         = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC,
+    .process_command = ff_filter_process_command,
 };
diff --git a/libavfilter/vf_lagfun.c b/libavfilter/vf_lagfun.c
new file mode 100644
index 0000000..1fbc889
--- /dev/null
+++ b/libavfilter/vf_lagfun.c
@@ -0,0 +1,252 @@
+/*
+ * Copyright (c) 2019 Paul B Mahol
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "libavutil/imgutils.h"
+#include "libavutil/intreadwrite.h"
+#include "libavutil/opt.h"
+#include "libavutil/pixdesc.h"
+
+#include "avfilter.h"
+#include "formats.h"
+#include "internal.h"
+#include "video.h"
+
+typedef struct LagfunContext {
+    const AVClass *class;
+    const AVPixFmtDescriptor *desc;
+    float decay;
+    int planes;
+
+    int depth;
+    int nb_planes;
+    int linesize[4];
+    int height[4];
+
+    AVFrame *old;
+
+    int (*lagfun)(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs);
+} LagfunContext;
+
+static int query_formats(AVFilterContext *ctx)
+{
+    static const enum AVPixelFormat pixel_fmts[] = {
+        AV_PIX_FMT_GRAY8, AV_PIX_FMT_GRAY9,
+        AV_PIX_FMT_GRAY10, AV_PIX_FMT_GRAY12, AV_PIX_FMT_GRAY14,
+        AV_PIX_FMT_GRAY16,
+        AV_PIX_FMT_YUV410P, AV_PIX_FMT_YUV411P,
+        AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUV422P,
+        AV_PIX_FMT_YUV440P, AV_PIX_FMT_YUV444P,
+        AV_PIX_FMT_YUVJ420P, AV_PIX_FMT_YUVJ422P,
+        AV_PIX_FMT_YUVJ440P, AV_PIX_FMT_YUVJ444P,
+        AV_PIX_FMT_YUVJ411P,
+        AV_PIX_FMT_YUV420P9, AV_PIX_FMT_YUV422P9, AV_PIX_FMT_YUV444P9,
+        AV_PIX_FMT_YUV420P10, AV_PIX_FMT_YUV422P10, AV_PIX_FMT_YUV444P10,
+        AV_PIX_FMT_YUV440P10,
+        AV_PIX_FMT_YUV444P12, AV_PIX_FMT_YUV422P12, AV_PIX_FMT_YUV420P12,
+        AV_PIX_FMT_YUV440P12,
+        AV_PIX_FMT_YUV444P14, AV_PIX_FMT_YUV422P14, AV_PIX_FMT_YUV420P14,
+        AV_PIX_FMT_YUV420P16, AV_PIX_FMT_YUV422P16, AV_PIX_FMT_YUV444P16,
+        AV_PIX_FMT_GBRP, AV_PIX_FMT_GBRP9, AV_PIX_FMT_GBRP10,
+        AV_PIX_FMT_GBRP12, AV_PIX_FMT_GBRP14, AV_PIX_FMT_GBRP16,
+        AV_PIX_FMT_NONE
+    };
+    AVFilterFormats *formats = ff_make_format_list(pixel_fmts);
+    if (!formats)
+        return AVERROR(ENOMEM);
+    return ff_set_common_formats(ctx, formats);
+}
+
+typedef struct ThreadData {
+    AVFrame *in, *out, *old;
+} ThreadData;
+
+static int lagfun_frame8(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
+{
+    LagfunContext *s = ctx->priv;
+    const float decay = s->decay;
+    ThreadData *td = arg;
+    AVFrame *in = td->in;
+    AVFrame *out = td->out;
+    AVFrame *old = td->old;
+
+    for (int p = 0; p < s->nb_planes; p++) {
+        const int slice_start = (s->height[p] * jobnr) / nb_jobs;
+        const int slice_end = (s->height[p] * (jobnr+1)) / nb_jobs;
+        const uint8_t *src = in->data[p] + slice_start * in->linesize[p];
+        const uint8_t *osrc = old->data[p] + slice_start * old->linesize[p];
+        uint8_t *dst = out->data[p] + slice_start * out->linesize[p];
+
+        if (!((1 << p) & s->planes)) {
+            av_image_copy_plane(dst, out->linesize[p],
+                                src, in->linesize[p],
+                                s->linesize[p], slice_end - slice_start);
+            continue;
+        }
+
+        for (int y = slice_start; y < slice_end; y++) {
+            for (int x = 0; x < s->linesize[p]; x++)
+                dst[x] = FFMAX(src[x], osrc[x] * decay);
+
+            src += in->linesize[p];
+            osrc += old->linesize[p];
+            dst += out->linesize[p];
+        }
+    }
+
+    return 0;
+}
+
+static int lagfun_frame16(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
+{
+    LagfunContext *s = ctx->priv;
+    const float decay = s->decay;
+    ThreadData *td = arg;
+    AVFrame *in = td->in;
+    AVFrame *out = td->out;
+    AVFrame *old = td->old;
+
+    for (int p = 0; p < s->nb_planes; p++) {
+        const int slice_start = (s->height[p] * jobnr) / nb_jobs;
+        const int slice_end = (s->height[p] * (jobnr+1)) / nb_jobs;
+        const uint16_t *src = (const uint16_t *)in->data[p] + slice_start * in->linesize[p] / 2;
+        const uint16_t *osrc = (const uint16_t *)old->data[p] + slice_start * old->linesize[p] / 2;
+        uint16_t *dst = (uint16_t *)out->data[p] + slice_start * out->linesize[p] / 2;
+
+        if (!((1 << p) & s->planes)) {
+            av_image_copy_plane((uint8_t *)dst, out->linesize[p],
+                                (uint8_t *)src, in->linesize[p],
+                                s->linesize[p], slice_end - slice_start);
+            continue;
+        }
+
+        for (int y = slice_start; y < slice_end; y++) {
+            for (int x = 0; x < s->linesize[p] / 2; x++)
+                dst[x] = FFMAX(src[x], osrc[x] * decay);
+
+            src += in->linesize[p] / 2;
+            osrc += old->linesize[p] / 2;
+            dst += out->linesize[p] / 2;
+        }
+    }
+
+    return 0;
+}
+
+static int config_output(AVFilterLink *outlink)
+{
+    AVFilterContext *ctx = outlink->src;
+    LagfunContext *s = ctx->priv;
+    AVFilterLink *inlink = ctx->inputs[0];
+    int ret;
+
+    s->desc = av_pix_fmt_desc_get(outlink->format);
+    if (!s->desc)
+        return AVERROR_BUG;
+    s->nb_planes = av_pix_fmt_count_planes(outlink->format);
+    s->depth = s->desc->comp[0].depth;
+    s->lagfun = s->depth <= 8 ? lagfun_frame8 : lagfun_frame16;
+
+    if ((ret = av_image_fill_linesizes(s->linesize, inlink->format, inlink->w)) < 0)
+        return ret;
+
+    s->height[1] = s->height[2] = AV_CEIL_RSHIFT(inlink->h, s->desc->log2_chroma_h);
+    s->height[0] = s->height[3] = inlink->h;
+
+    return 0;
+}
+
+static int filter_frame(AVFilterLink *inlink, AVFrame *in)
+{
+    AVFilterContext *ctx = inlink->dst;
+    AVFilterLink *outlink = ctx->outputs[0];
+    LagfunContext *s = ctx->priv;
+    ThreadData td;
+    AVFrame *out;
+
+    if (!s->old) {
+        s->old = av_frame_clone(in);
+        return ff_filter_frame(outlink, in);
+    }
+
+    out = ff_get_video_buffer(outlink, outlink->w, outlink->h);
+    if (!out) {
+        av_frame_free(&in);
+        return AVERROR(ENOMEM);
+    }
+    out->pts = in->pts;
+
+    td.out = out;
+    td.in = in;
+    td.old = s->old;
+    ctx->internal->execute(ctx, s->lagfun, &td, NULL, FFMIN(s->height[1], ff_filter_get_nb_threads(ctx)));
+
+    av_frame_free(&s->old);
+    av_frame_free(&in);
+    s->old = av_frame_clone(out);
+    return ff_filter_frame(outlink, out);
+}
+
+static av_cold void uninit(AVFilterContext *ctx)
+{
+    LagfunContext *s = ctx->priv;
+
+    av_frame_free(&s->old);
+}
+
+#define OFFSET(x) offsetof(LagfunContext, x)
+#define FLAGS AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_FILTERING_PARAM
+
+static const AVOption lagfun_options[] = {
+    { "decay",  "set decay",                 OFFSET(decay),  AV_OPT_TYPE_FLOAT, {.dbl=.95},  0,  1,  FLAGS },
+    { "planes", "set what planes to filter", OFFSET(planes), AV_OPT_TYPE_FLAGS, {.i64=15},   0, 15,  FLAGS },
+    { NULL },
+};
+
+static const AVFilterPad inputs[] = {
+    {
+        .name          = "default",
+        .type          = AVMEDIA_TYPE_VIDEO,
+        .filter_frame  = filter_frame,
+    },
+    { NULL }
+};
+
+static const AVFilterPad outputs[] = {
+    {
+        .name          = "default",
+        .type          = AVMEDIA_TYPE_VIDEO,
+        .config_props  = config_output,
+    },
+    { NULL }
+};
+
+AVFILTER_DEFINE_CLASS(lagfun);
+
+AVFilter ff_vf_lagfun = {
+    .name          = "lagfun",
+    .description   = NULL_IF_CONFIG_SMALL("Slowly update darker pixels."),
+    .priv_size     = sizeof(LagfunContext),
+    .priv_class    = &lagfun_class,
+    .query_formats = query_formats,
+    .uninit        = uninit,
+    .outputs       = outputs,
+    .inputs        = inputs,
+    .flags         = AVFILTER_FLAG_SLICE_THREADS,
+};
diff --git a/libavfilter/vf_lenscorrection.c b/libavfilter/vf_lenscorrection.c
index 239fe19..bb8ea37 100644
--- a/libavfilter/vf_lenscorrection.c
+++ b/libavfilter/vf_lenscorrection.c
@@ -36,8 +36,8 @@
 
 typedef struct LenscorrectionCtx {
     const AVClass *av_class;
-    unsigned int width;
-    unsigned int height;
+    int width;
+    int height;
     int hsub, vsub;
     int nb_planes;
     double cx, cy, k1, k2;
@@ -65,7 +65,7 @@
 
 static int filter_slice(AVFilterContext *ctx, void *arg, int job, int nb_jobs)
 {
-    ThreadData *td = (ThreadData*)arg;
+    ThreadData *td = arg;
     AVFrame *in = td->in;
     AVFrame *out = td->out;
 
@@ -155,10 +155,8 @@
     for (plane = 0; plane < rect->nb_planes; ++plane) {
         int hsub = plane == 1 || plane == 2 ? rect->hsub : 0;
         int vsub = plane == 1 || plane == 2 ? rect->vsub : 0;
-        int hdiv = 1 << hsub;
-        int vdiv = 1 << vsub;
-        int w = rect->width / hdiv;
-        int h = rect->height / vdiv;
+        int w = AV_CEIL_RSHIFT(rect->width, hsub);
+        int h = AV_CEIL_RSHIFT(rect->height, vsub);
         int xcenter = rect->cx * w;
         int ycenter = rect->cy * h;
         int k1 = rect->k1 * (1<<24);
diff --git a/libavfilter/vf_lensfun.c b/libavfilter/vf_lensfun.c
index fd14210..089121e 100644
--- a/libavfilter/vf_lensfun.c
+++ b/libavfilter/vf_lensfun.c
@@ -79,6 +79,7 @@
     float focal_length;
     float aperture;
     float focus_distance;
+    float scale;
     int target_geometry;
     int reverse;
     int interpolation_type;
@@ -108,6 +109,7 @@
     { "focal_length", "focal length of video (zoom; constant for the duration of the use of this filter)", OFFSET(focal_length), AV_OPT_TYPE_FLOAT, {.dbl=18}, 0.0, DBL_MAX, FLAGS },
     { "aperture", "aperture (constant for the duration of the use of this filter)", OFFSET(aperture), AV_OPT_TYPE_FLOAT, {.dbl=3.5}, 0.0, DBL_MAX, FLAGS },
     { "focus_distance", "focus distance (constant for the duration of the use of this filter)", OFFSET(focus_distance), AV_OPT_TYPE_FLOAT, {.dbl=1000.0f}, 0.0, DBL_MAX, FLAGS },
+    { "scale", "scale factor applied after corrections (0.0 means automatic scaling)", OFFSET(scale), AV_OPT_TYPE_FLOAT, {.dbl=0.0}, 0.0, DBL_MAX, FLAGS },
     { "target_geometry", "target geometry of the lens correction (only when geometry correction is enabled)", OFFSET(target_geometry), AV_OPT_TYPE_INT, {.i64=LF_RECTILINEAR}, 0, INT_MAX, FLAGS, "lens_geometry" },
         { "rectilinear", "rectilinear lens (default)", 0, AV_OPT_TYPE_CONST, {.i64=LF_RECTILINEAR}, 0, 0, FLAGS, "lens_geometry" },
         { "fisheye", "fisheye lens", 0, AV_OPT_TYPE_CONST, {.i64=LF_FISHEYE}, 0, 0, FLAGS, "lens_geometry" },
@@ -228,7 +230,7 @@
                                    lensfun->focal_length,
                                    lensfun->aperture,
                                    lensfun->focus_distance,
-                                   0.0,
+                                   lensfun->scale,
                                    lensfun->target_geometry,
                                    lensfun_mode,
                                    lensfun->reverse);
@@ -240,7 +242,7 @@
 
     if (!lensfun->distortion_coords) {
         if (lensfun->mode & SUBPIXEL_DISTORTION) {
-            lensfun->distortion_coords = av_malloc(sizeof(float) * inlink->w * inlink->h * 2 * 3);
+            lensfun->distortion_coords = av_malloc_array(inlink->w * inlink->h, sizeof(float) * 2 * 3);
             if (!lensfun->distortion_coords)
                 return AVERROR(ENOMEM);
             if (lensfun->mode & GEOMETRY_DISTORTION) {
@@ -257,7 +259,7 @@
                                                       lensfun->distortion_coords);
             }
         } else if (lensfun->mode & GEOMETRY_DISTORTION) {
-            lensfun->distortion_coords = av_malloc(sizeof(float) * inlink->w * inlink->h * 2);
+            lensfun->distortion_coords = av_malloc_array(inlink->w * inlink->h, sizeof(float) * 2);
             if (!lensfun->distortion_coords)
                 return AVERROR(ENOMEM);
             // apply only geometry distortion
@@ -270,7 +272,7 @@
 
     if (!lensfun->interpolation)
         if (lensfun->interpolation_type == LANCZOS) {
-            lensfun->interpolation = av_malloc(sizeof(float) * 4 * LANCZOS_RESOLUTION);
+            lensfun->interpolation = av_malloc_array(LANCZOS_RESOLUTION, sizeof(float) * 4);
             if (!lensfun->interpolation)
                 return AVERROR(ENOMEM);
             for (index = 0; index < 4 * LANCZOS_RESOLUTION; ++index) {
@@ -463,7 +465,7 @@
                                vignetting_filter_slice,
                                &vignetting_thread_data,
                                NULL,
-                               FFMIN(outlink->h, ctx->graph->nb_threads));
+                               FFMIN(outlink->h, ff_filter_get_nb_threads(ctx)));
     }
 
     if (lensfun->mode & (GEOMETRY_DISTORTION | SUBPIXEL_DISTORTION)) {
@@ -491,7 +493,7 @@
                                distortion_correction_filter_slice,
                                &distortion_correction_thread_data,
                                NULL,
-                               FFMIN(outlink->h, ctx->graph->nb_threads));
+                               FFMIN(outlink->h, ff_filter_get_nb_threads(ctx)));
 
         av_frame_free(&in);
         return ff_filter_frame(outlink, out);
@@ -510,10 +512,8 @@
         lf_lens_destroy(lensfun->lens);
     if (lensfun->modifier)
         lf_modifier_destroy(lensfun->modifier);
-    if (lensfun->distortion_coords)
-        av_free(lensfun->distortion_coords);
-    if (lensfun->interpolation)
-        av_free(lensfun->interpolation);
+    av_freep(&lensfun->distortion_coords);
+    av_freep(&lensfun->interpolation);
 }
 
 static const AVFilterPad lensfun_inputs[] = {
diff --git a/libavfilter/vf_libvmaf.c b/libavfilter/vf_libvmaf.c
index 249e50c..14c3216 100644
--- a/libavfilter/vf_libvmaf.c
+++ b/libavfilter/vf_libvmaf.c
@@ -110,6 +110,7 @@
         const type *main_ptr = (const type *) s->gmain->data[0];                \
         \
         float *ptr = ref_data;                                                  \
+        float factor = 1.f / (1 << (bits - 8));                                 \
         \
         int h = s->height;                                                      \
         int w = s->width;                                                       \
@@ -118,7 +119,7 @@
         \
         for (i = 0; i < h; i++) {                                               \
             for ( j = 0; j < w; j++) {                                          \
-                ptr[j] = (float)ref_ptr[j];                                     \
+                ptr[j] = ref_ptr[j] * factor;                                   \
             }                                                                   \
             ref_ptr += ref_stride / sizeof(*ref_ptr);                           \
             ptr += stride / sizeof(*ptr);                                       \
@@ -128,7 +129,7 @@
         \
         for (i = 0; i < h; i++) {                                               \
             for (j = 0; j < w; j++) {                                           \
-                ptr[j] = (float)main_ptr[j];                                    \
+                ptr[j] = main_ptr[j] * factor;                                  \
             }                                                                   \
             main_ptr += main_stride / sizeof(*main_ptr);                        \
             ptr += stride / sizeof(*ptr);                                       \
@@ -234,6 +235,9 @@
 
     s->gref = av_frame_alloc();
     s->gmain = av_frame_alloc();
+    if (!s->gref || !s->gmain)
+        return AVERROR(ENOMEM);
+
     s->error = 0;
 
     s->vmaf_thread_created = 0;
diff --git a/libavfilter/vf_limiter.c b/libavfilter/vf_limiter.c
index bb7f1d3..8db28fe 100644
--- a/libavfilter/vf_limiter.c
+++ b/libavfilter/vf_limiter.c
@@ -18,7 +18,6 @@
 
 #include "libavutil/attributes.h"
 #include "libavutil/common.h"
-#include "libavutil/eval.h"
 #include "libavutil/imgutils.h"
 #include "libavutil/opt.h"
 #include "libavutil/pixdesc.h"
@@ -82,6 +81,7 @@
         AV_PIX_FMT_YUV420P16, AV_PIX_FMT_YUV422P16, AV_PIX_FMT_YUV444P16,
         AV_PIX_FMT_YUVA420P9, AV_PIX_FMT_YUVA422P9, AV_PIX_FMT_YUVA444P9,
         AV_PIX_FMT_YUVA420P10, AV_PIX_FMT_YUVA422P10, AV_PIX_FMT_YUVA444P10,
+        AV_PIX_FMT_YUVA422P12, AV_PIX_FMT_YUVA444P12,
         AV_PIX_FMT_YUVA420P16, AV_PIX_FMT_YUVA422P16, AV_PIX_FMT_YUVA444P16,
         AV_PIX_FMT_GBRP, AV_PIX_FMT_GBRP9, AV_PIX_FMT_GBRP10,
         AV_PIX_FMT_GBRP12, AV_PIX_FMT_GBRP14, AV_PIX_FMT_GBRP16,
@@ -138,13 +138,14 @@
     AVFilterContext *ctx = inlink->dst;
     LimiterContext *s = ctx->priv;
     const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(inlink->format);
-    int vsub, hsub, ret;
+    int depth, vsub, hsub, ret;
 
     s->nb_planes = av_pix_fmt_count_planes(inlink->format);
 
     if ((ret = av_image_fill_linesizes(s->linesize, inlink->format, inlink->w)) < 0)
         return ret;
 
+    depth = desc->comp[0].depth;
     hsub = desc->log2_chroma_w;
     vsub = desc->log2_chroma_h;
     s->height[1] = s->height[2] = AV_CEIL_RSHIFT(inlink->h, vsub);
@@ -152,10 +153,11 @@
     s->width[1]  = s->width[2]  = AV_CEIL_RSHIFT(inlink->w, hsub);
     s->width[0]  = s->width[3]  = inlink->w;
 
-    if (desc->comp[0].depth == 8) {
+    s->max = FFMIN(s->max, (1 << depth) - 1);
+    s->min = FFMIN(s->min, (1 << depth) - 1);
+
+    if (depth == 8) {
         s->dsp.limiter = limiter8;
-        s->max = FFMIN(s->max, 255);
-        s->min = FFMIN(s->min, 255);
     } else {
         s->dsp.limiter = limiter16;
     }
diff --git a/libavfilter/vf_lumakey.c b/libavfilter/vf_lumakey.c
index 418538f..c182e90 100644
--- a/libavfilter/vf_lumakey.c
+++ b/libavfilter/vf_lumakey.c
@@ -28,12 +28,13 @@
 typedef struct LumakeyContext {
     const AVClass *class;
 
-    int threshold;
-    int tolerance;
-    int softness;
+    double threshold;
+    double tolerance;
+    double softness;
 
     int white;
     int black;
+    int so;
     int max;
 
     int (*do_lumakey_slice)(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs);
@@ -47,7 +48,7 @@
     const int slice_end = (frame->height * (jobnr + 1)) / nb_jobs;
     uint8_t *alpha = frame->data[3] + slice_start * frame->linesize[3];
     const uint8_t *luma = frame->data[0] + slice_start * frame->linesize[0];
-    const int so = s->softness;
+    const int so = s->so;
     const int w = s->white;
     const int b = s->black;
     int x, y;
@@ -79,7 +80,7 @@
     const int slice_end = (frame->height * (jobnr + 1)) / nb_jobs;
     uint16_t *alpha = (uint16_t *)(frame->data[3] + slice_start * frame->linesize[3]);
     const uint16_t *luma = (const uint16_t *)(frame->data[0] + slice_start * frame->linesize[0]);
-    const int so = s->softness;
+    const int so = s->so;
     const int w = s->white;
     const int b = s->black;
     const int m = s->max;
@@ -113,14 +114,16 @@
 
     depth = desc->comp[0].depth;
     if (depth == 8) {
-        s->white = av_clip_uint8(s->threshold + s->tolerance);
-        s->black = av_clip_uint8(s->threshold - s->tolerance);
+        s->white = av_clip_uint8((s->threshold + s->tolerance) * 255);
+        s->black = av_clip_uint8((s->threshold - s->tolerance) * 255);
         s->do_lumakey_slice = do_lumakey_slice8;
+        s->so = s->softness * 255;
     } else {
         s->max = (1 << depth) - 1;
-        s->white = av_clip(s->threshold + s->tolerance, 0, s->max);
-        s->black = av_clip(s->threshold - s->tolerance, 0, s->max);
+        s->white = av_clip((s->threshold + s->tolerance) * s->max, 0, s->max);
+        s->black = av_clip((s->threshold - s->tolerance) * s->max, 0, s->max);
         s->do_lumakey_slice = do_lumakey_slice16;
+        s->so = s->softness * s->max;
     }
 
     return 0;
@@ -147,6 +150,7 @@
         AV_PIX_FMT_YUVA444P, AV_PIX_FMT_YUVA422P, AV_PIX_FMT_YUVA420P,
         AV_PIX_FMT_YUVA444P9, AV_PIX_FMT_YUVA422P9, AV_PIX_FMT_YUVA420P9,
         AV_PIX_FMT_YUVA444P10, AV_PIX_FMT_YUVA422P10, AV_PIX_FMT_YUVA420P10,
+        AV_PIX_FMT_YUVA444P12, AV_PIX_FMT_YUVA422P12,
         AV_PIX_FMT_YUVA444P16, AV_PIX_FMT_YUVA422P16, AV_PIX_FMT_YUVA420P16,
         AV_PIX_FMT_NONE
     };
@@ -159,6 +163,18 @@
     return ff_set_common_formats(ctx, formats);
 }
 
+static int process_command(AVFilterContext *ctx, const char *cmd, const char *args,
+                           char *res, int res_len, int flags)
+{
+    int ret;
+
+    ret = ff_filter_process_command(ctx, cmd, args, res, res_len, flags);
+    if (ret < 0)
+        return ret;
+
+    return config_input(ctx->inputs[0]);
+}
+
 static const AVFilterPad lumakey_inputs[] = {
     {
         .name         = "default",
@@ -178,12 +194,12 @@
 };
 
 #define OFFSET(x) offsetof(LumakeyContext, x)
-#define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM
+#define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_RUNTIME_PARAM
 
 static const AVOption lumakey_options[] = {
-    { "threshold", "set the threshold value", OFFSET(threshold), AV_OPT_TYPE_INT, {.i64=0}, 0, UINT16_MAX, FLAGS },
-    { "tolerance", "set the tolerance value", OFFSET(tolerance), AV_OPT_TYPE_INT, {.i64=1}, 0, UINT16_MAX, FLAGS },
-    { "softness",  "set the softness value",  OFFSET(softness),  AV_OPT_TYPE_INT, {.i64=0}, 0, UINT16_MAX, FLAGS },
+    { "threshold", "set the threshold value", OFFSET(threshold), AV_OPT_TYPE_DOUBLE, {.dbl=0},    0, 1, FLAGS },
+    { "tolerance", "set the tolerance value", OFFSET(tolerance), AV_OPT_TYPE_DOUBLE, {.dbl=0.01}, 0, 1, FLAGS },
+    { "softness",  "set the softness value",  OFFSET(softness),  AV_OPT_TYPE_DOUBLE, {.dbl=0},    0, 1, FLAGS },
     { NULL }
 };
 
@@ -198,4 +214,5 @@
     .inputs        = lumakey_inputs,
     .outputs       = lumakey_outputs,
     .flags         = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC | AVFILTER_FLAG_SLICE_THREADS,
+    .process_command = process_command,
 };
diff --git a/libavfilter/vf_lut.c b/libavfilter/vf_lut.c
index c815ddc..1fdc5e1 100644
--- a/libavfilter/vf_lut.c
+++ b/libavfilter/vf_lut.c
@@ -337,13 +337,194 @@
     return 0;
 }
 
+struct thread_data {
+    AVFrame *in;
+    AVFrame *out;
+
+    int w;
+    int h;
+};
+
+#define LOAD_PACKED_COMMON\
+    LutContext *s = ctx->priv;\
+    const struct thread_data *td = arg;\
+\
+    int i, j;\
+    const int w = td->w;\
+    const int h = td->h;\
+    AVFrame *in = td->in;\
+    AVFrame *out = td->out;\
+    const uint16_t (*tab)[256*256] = (const uint16_t (*)[256*256])s->lut;\
+    const int step = s->step;\
+\
+    const int slice_start = (h *  jobnr   ) / nb_jobs;\
+    const int slice_end   = (h * (jobnr+1)) / nb_jobs;\
+
+/* packed, 16-bit */
+static int lut_packed_16bits(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
+{
+    LOAD_PACKED_COMMON
+
+    uint16_t *inrow, *outrow, *inrow0, *outrow0;
+    const int in_linesize  =  in->linesize[0] / 2;
+    const int out_linesize = out->linesize[0] / 2;
+    inrow0  = (uint16_t *)in ->data[0];
+    outrow0 = (uint16_t *)out->data[0];
+
+    for (i = slice_start; i < slice_end; i++) {
+        inrow  = inrow0 + i * in_linesize;
+        outrow = outrow0 + i * out_linesize;
+        for (j = 0; j < w; j++) {
+
+            switch (step) {
+#if HAVE_BIGENDIAN
+            case 4:  outrow[3] = av_bswap16(tab[3][av_bswap16(inrow[3])]); // Fall-through
+            case 3:  outrow[2] = av_bswap16(tab[2][av_bswap16(inrow[2])]); // Fall-through
+            case 2:  outrow[1] = av_bswap16(tab[1][av_bswap16(inrow[1])]); // Fall-through
+            default: outrow[0] = av_bswap16(tab[0][av_bswap16(inrow[0])]);
+#else
+            case 4:  outrow[3] = tab[3][inrow[3]]; // Fall-through
+            case 3:  outrow[2] = tab[2][inrow[2]]; // Fall-through
+            case 2:  outrow[1] = tab[1][inrow[1]]; // Fall-through
+            default: outrow[0] = tab[0][inrow[0]];
+#endif
+            }
+            outrow += step;
+            inrow  += step;
+        }
+    }
+
+    return 0;
+}
+
+/* packed, 8-bit */
+static int lut_packed_8bits(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
+{
+    LOAD_PACKED_COMMON
+
+    uint8_t *inrow, *outrow, *inrow0, *outrow0;
+    const int in_linesize  =  in->linesize[0];
+    const int out_linesize = out->linesize[0];
+    inrow0  = in ->data[0];
+    outrow0 = out->data[0];
+
+    for (i = slice_start; i < slice_end; i++) {
+        inrow  = inrow0 + i * in_linesize;
+        outrow = outrow0 + i * out_linesize;
+        for (j = 0; j < w; j++) {
+            switch (step) {
+            case 4:  outrow[3] = tab[3][inrow[3]]; // Fall-through
+            case 3:  outrow[2] = tab[2][inrow[2]]; // Fall-through
+            case 2:  outrow[1] = tab[1][inrow[1]]; // Fall-through
+            default: outrow[0] = tab[0][inrow[0]];
+            }
+            outrow += step;
+            inrow  += step;
+        }
+    }
+
+    return 0;
+}
+
+#define LOAD_PLANAR_COMMON\
+    LutContext *s = ctx->priv;\
+    const struct thread_data *td = arg;\
+    int i, j, plane;\
+    AVFrame *in = td->in;\
+    AVFrame *out = td->out;\
+
+#define PLANAR_COMMON\
+        int vsub = plane == 1 || plane == 2 ? s->vsub : 0;\
+        int hsub = plane == 1 || plane == 2 ? s->hsub : 0;\
+        int h = AV_CEIL_RSHIFT(td->h, vsub);\
+        int w = AV_CEIL_RSHIFT(td->w, hsub);\
+        const uint16_t *tab = s->lut[plane];\
+\
+        const int slice_start = (h *  jobnr   ) / nb_jobs;\
+        const int slice_end   = (h * (jobnr+1)) / nb_jobs;\
+
+/* planar >8 bit depth */
+static int lut_planar_16bits(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
+{
+    LOAD_PLANAR_COMMON
+
+    uint16_t *inrow, *outrow;
+
+    for (plane = 0; plane < 4 && in->data[plane] && in->linesize[plane]; plane++) {
+        PLANAR_COMMON
+
+        const int in_linesize  =  in->linesize[plane] / 2;
+        const int out_linesize = out->linesize[plane] / 2;
+
+        inrow  = (uint16_t *)in ->data[plane] + slice_start * in_linesize;
+        outrow = (uint16_t *)out->data[plane] + slice_start * out_linesize;
+
+        for (i = slice_start; i < slice_end; i++) {
+            for (j = 0; j < w; j++) {
+#if HAVE_BIGENDIAN
+                outrow[j] = av_bswap16(tab[av_bswap16(inrow[j])]);
+#else
+                outrow[j] = tab[inrow[j]];
+#endif
+            }
+            inrow  += in_linesize;
+            outrow += out_linesize;
+        }
+    }
+
+    return 0;
+}
+
+/* planar 8bit depth */
+static int lut_planar_8bits(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
+{
+    LOAD_PLANAR_COMMON
+
+    uint8_t *inrow, *outrow;
+
+    for (plane = 0; plane < 4 && in->data[plane] && in->linesize[plane]; plane++) {
+        PLANAR_COMMON
+
+        const int in_linesize  =  in->linesize[plane];
+        const int out_linesize = out->linesize[plane];
+
+        inrow  = in ->data[plane] + slice_start * in_linesize;
+        outrow = out->data[plane] + slice_start * out_linesize;
+
+        for (i = slice_start; i < slice_end; i++) {
+            for (j = 0; j < w; j++)
+                outrow[j] = tab[inrow[j]];
+            inrow  += in_linesize;
+            outrow += out_linesize;
+        }
+    }
+
+    return 0;
+}
+
+#define PACKED_THREAD_DATA\
+ struct thread_data td = {\
+            .in  = in,\
+            .out = out,\
+            .w   = inlink->w,\
+            .h   = in->height,\
+        };\
+
+#define PLANAR_THREAD_DATA\
+ struct thread_data td = {\
+            .in  = in,\
+            .out = out,\
+            .w   = inlink->w,\
+            .h   = inlink->h,\
+        };\
+
 static int filter_frame(AVFilterLink *inlink, AVFrame *in)
 {
     AVFilterContext *ctx = inlink->dst;
     LutContext *s = ctx->priv;
     AVFilterLink *outlink = ctx->outputs[0];
     AVFrame *out;
-    int i, j, plane, direct = 0;
+    int direct = 0;
 
     if (av_frame_is_writable(in)) {
         direct = 1;
@@ -359,121 +540,24 @@
 
     if (s->is_rgb && s->is_16bit && !s->is_planar) {
         /* packed, 16-bit */
-        uint16_t *inrow, *outrow, *inrow0, *outrow0;
-        const int w = inlink->w;
-        const int h = in->height;
-        const uint16_t (*tab)[256*256] = (const uint16_t (*)[256*256])s->lut;
-        const int in_linesize  =  in->linesize[0] / 2;
-        const int out_linesize = out->linesize[0] / 2;
-        const int step = s->step;
-
-        inrow0  = (uint16_t*) in ->data[0];
-        outrow0 = (uint16_t*) out->data[0];
-
-        for (i = 0; i < h; i ++) {
-            inrow  = inrow0;
-            outrow = outrow0;
-            for (j = 0; j < w; j++) {
-
-                switch (step) {
-#if HAVE_BIGENDIAN
-                case 4:  outrow[3] = av_bswap16(tab[3][av_bswap16(inrow[3])]); // Fall-through
-                case 3:  outrow[2] = av_bswap16(tab[2][av_bswap16(inrow[2])]); // Fall-through
-                case 2:  outrow[1] = av_bswap16(tab[1][av_bswap16(inrow[1])]); // Fall-through
-                default: outrow[0] = av_bswap16(tab[0][av_bswap16(inrow[0])]);
-#else
-                case 4:  outrow[3] = tab[3][inrow[3]]; // Fall-through
-                case 3:  outrow[2] = tab[2][inrow[2]]; // Fall-through
-                case 2:  outrow[1] = tab[1][inrow[1]]; // Fall-through
-                default: outrow[0] = tab[0][inrow[0]];
-#endif
-                }
-                outrow += step;
-                inrow  += step;
-            }
-            inrow0  += in_linesize;
-            outrow0 += out_linesize;
-        }
+        PACKED_THREAD_DATA
+        ctx->internal->execute(ctx, lut_packed_16bits, &td, NULL,
+                               FFMIN(in->height, ff_filter_get_nb_threads(ctx)));
     } else if (s->is_rgb && !s->is_planar) {
-        /* packed */
-        uint8_t *inrow, *outrow, *inrow0, *outrow0;
-        const int w = inlink->w;
-        const int h = in->height;
-        const uint16_t (*tab)[256*256] = (const uint16_t (*)[256*256])s->lut;
-        const int in_linesize  =  in->linesize[0];
-        const int out_linesize = out->linesize[0];
-        const int step = s->step;
-
-        inrow0  = in ->data[0];
-        outrow0 = out->data[0];
-
-        for (i = 0; i < h; i ++) {
-            inrow  = inrow0;
-            outrow = outrow0;
-            for (j = 0; j < w; j++) {
-                switch (step) {
-                case 4:  outrow[3] = tab[3][inrow[3]]; // Fall-through
-                case 3:  outrow[2] = tab[2][inrow[2]]; // Fall-through
-                case 2:  outrow[1] = tab[1][inrow[1]]; // Fall-through
-                default: outrow[0] = tab[0][inrow[0]];
-                }
-                outrow += step;
-                inrow  += step;
-            }
-            inrow0  += in_linesize;
-            outrow0 += out_linesize;
-        }
+        /* packed 8 bits */
+        PACKED_THREAD_DATA
+        ctx->internal->execute(ctx, lut_packed_8bits, &td, NULL,
+                               FFMIN(in->height, ff_filter_get_nb_threads(ctx)));
     } else if (s->is_16bit) {
-        // planar >8 bit depth
-        uint16_t *inrow, *outrow;
-
-        for (plane = 0; plane < 4 && in->data[plane] && in->linesize[plane]; plane++) {
-            int vsub = plane == 1 || plane == 2 ? s->vsub : 0;
-            int hsub = plane == 1 || plane == 2 ? s->hsub : 0;
-            int h = AV_CEIL_RSHIFT(inlink->h, vsub);
-            int w = AV_CEIL_RSHIFT(inlink->w, hsub);
-            const uint16_t *tab = s->lut[plane];
-            const int in_linesize  =  in->linesize[plane] / 2;
-            const int out_linesize = out->linesize[plane] / 2;
-
-            inrow  = (uint16_t *)in ->data[plane];
-            outrow = (uint16_t *)out->data[plane];
-
-            for (i = 0; i < h; i++) {
-                for (j = 0; j < w; j++) {
-#if HAVE_BIGENDIAN
-                    outrow[j] = av_bswap16(tab[av_bswap16(inrow[j])]);
-#else
-                    outrow[j] = tab[inrow[j]];
-#endif
-                }
-                inrow  += in_linesize;
-                outrow += out_linesize;
-            }
-        }
+        /* planar >8 bit depth */
+        PLANAR_THREAD_DATA
+        ctx->internal->execute(ctx, lut_planar_16bits, &td, NULL,
+                               FFMIN(in->height, ff_filter_get_nb_threads(ctx)));
     } else {
         /* planar 8bit depth */
-        uint8_t *inrow, *outrow;
-
-        for (plane = 0; plane < 4 && in->data[plane] && in->linesize[plane]; plane++) {
-            int vsub = plane == 1 || plane == 2 ? s->vsub : 0;
-            int hsub = plane == 1 || plane == 2 ? s->hsub : 0;
-            int h = AV_CEIL_RSHIFT(inlink->h, vsub);
-            int w = AV_CEIL_RSHIFT(inlink->w, hsub);
-            const uint16_t *tab = s->lut[plane];
-            const int in_linesize  =  in->linesize[plane];
-            const int out_linesize = out->linesize[plane];
-
-            inrow  = in ->data[plane];
-            outrow = out->data[plane];
-
-            for (i = 0; i < h; i++) {
-                for (j = 0; j < w; j++)
-                    outrow[j] = tab[inrow[j]];
-                inrow  += in_linesize;
-                outrow += out_linesize;
-            }
-        }
+        PLANAR_THREAD_DATA
+        ctx->internal->execute(ctx, lut_planar_8bits, &td, NULL,
+                               FFMIN(in->height, ff_filter_get_nb_threads(ctx)));
     }
 
     if (!direct)
@@ -508,7 +592,7 @@
         .query_formats = query_formats,                                 \
         .inputs        = inputs,                                        \
         .outputs       = outputs,                                       \
-        .flags         = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC,        \
+        .flags         = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC | AVFILTER_FLAG_SLICE_THREADS,        \
     }
 
 #if CONFIG_LUT_FILTER
diff --git a/libavfilter/vf_lut2.c b/libavfilter/vf_lut2.c
index 66c481e..7a204f5 100644
--- a/libavfilter/vf_lut2.c
+++ b/libavfilter/vf_lut2.c
@@ -54,21 +54,29 @@
     const AVClass *class;
     FFFrameSync fs;
 
+    int odepth;
     char   *comp_expr_str[4];
 
     AVExpr *comp_expr[4];
     double var_values[VAR_VARS_NB];
     uint16_t *lut[4];  ///< lookup table for each component
     int width[4], height[4];
+    int widthx[4], heightx[4];
+    int widthy[4], heighty[4];
+    int nb_planesx;
+    int nb_planesy;
     int nb_planes;
     int depth, depthx, depthy;
     int tlut2;
     AVFrame *prev_frame;        /* only used with tlut2 */
 
-    void (*lut2)(struct LUT2Context *s, AVFrame *dst, AVFrame *srcx, AVFrame *srcy);
-
+    int (*lut2)(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs);
 } LUT2Context;
 
+typedef struct ThreadData {
+    AVFrame *out, *srcx, *srcy;
+} ThreadData;
+
 #define OFFSET(x) offsetof(LUT2Context, x)
 #define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM
 
@@ -77,6 +85,7 @@
     { "c1", "set component #1 expression", OFFSET(comp_expr_str[1]),  AV_OPT_TYPE_STRING, { .str = "x" }, .flags = FLAGS },
     { "c2", "set component #2 expression", OFFSET(comp_expr_str[2]),  AV_OPT_TYPE_STRING, { .str = "x" }, .flags = FLAGS },
     { "c3", "set component #3 expression", OFFSET(comp_expr_str[3]),  AV_OPT_TYPE_STRING, { .str = "x" }, .flags = FLAGS },
+    { "d",  "set output depth",            OFFSET(odepth),            AV_OPT_TYPE_INT,    { .i64 =  0  }, 0, 16, .flags = FLAGS },
     { NULL }
 };
 
@@ -96,27 +105,94 @@
     }
 }
 
+#define BIT8_FMTS \
+    AV_PIX_FMT_YUVA444P, AV_PIX_FMT_YUV444P, AV_PIX_FMT_YUV440P, \
+    AV_PIX_FMT_YUVJ444P, AV_PIX_FMT_YUVJ440P, \
+    AV_PIX_FMT_YUVA422P, AV_PIX_FMT_YUV422P, AV_PIX_FMT_YUVA420P, AV_PIX_FMT_YUV420P, \
+    AV_PIX_FMT_YUVJ422P, AV_PIX_FMT_YUVJ420P, \
+    AV_PIX_FMT_YUVJ411P, AV_PIX_FMT_YUV411P, AV_PIX_FMT_YUV410P, \
+    AV_PIX_FMT_GRAY8, AV_PIX_FMT_GBRP, AV_PIX_FMT_GBRAP,
+
+#define BIT9_FMTS \
+    AV_PIX_FMT_GBRP9, AV_PIX_FMT_GRAY9, \
+    AV_PIX_FMT_YUV420P9, AV_PIX_FMT_YUV422P9, AV_PIX_FMT_YUV444P9, \
+    AV_PIX_FMT_YUVA420P9, AV_PIX_FMT_YUVA422P9, AV_PIX_FMT_YUVA444P9,
+
+#define BIT10_FMTS \
+    AV_PIX_FMT_GRAY10, AV_PIX_FMT_GBRP10, AV_PIX_FMT_GBRAP10, \
+    AV_PIX_FMT_YUV420P10, AV_PIX_FMT_YUV422P10, AV_PIX_FMT_YUV444P10, \
+    AV_PIX_FMT_YUVA420P10, AV_PIX_FMT_YUVA422P10, AV_PIX_FMT_YUVA444P10,
+
+#define BIT12_FMTS \
+    AV_PIX_FMT_YUV420P12, AV_PIX_FMT_YUV422P12, AV_PIX_FMT_YUV444P12, AV_PIX_FMT_YUV440P12, \
+    AV_PIX_FMT_YUVA422P12, AV_PIX_FMT_YUVA444P12, \
+    AV_PIX_FMT_GRAY12, AV_PIX_FMT_GBRAP12, AV_PIX_FMT_GBRP12,
+
+#define BIT14_FMTS \
+    AV_PIX_FMT_YUV420P14, AV_PIX_FMT_YUV422P14, AV_PIX_FMT_YUV444P14, \
+    AV_PIX_FMT_GRAY14, AV_PIX_FMT_GBRP14,
+
+#define BIT16_FMTS \
+    AV_PIX_FMT_YUV420P16, AV_PIX_FMT_YUV422P16, AV_PIX_FMT_YUV444P16, \
+    AV_PIX_FMT_YUVA420P16, AV_PIX_FMT_YUVA422P16, AV_PIX_FMT_YUVA444P16, \
+    AV_PIX_FMT_GBRP16, AV_PIX_FMT_GBRAP16, AV_PIX_FMT_GRAY16,
+
 static int query_formats(AVFilterContext *ctx)
 {
-    static const enum AVPixelFormat pix_fmts[] = {
-        AV_PIX_FMT_YUVA444P, AV_PIX_FMT_YUV444P, AV_PIX_FMT_YUV440P,
-        AV_PIX_FMT_YUVJ444P, AV_PIX_FMT_YUVJ440P,
-        AV_PIX_FMT_YUVA422P, AV_PIX_FMT_YUV422P, AV_PIX_FMT_YUVA420P, AV_PIX_FMT_YUV420P,
-        AV_PIX_FMT_YUVJ422P, AV_PIX_FMT_YUVJ420P,
-        AV_PIX_FMT_YUVJ411P, AV_PIX_FMT_YUV411P, AV_PIX_FMT_YUV410P,
-        AV_PIX_FMT_YUV420P9, AV_PIX_FMT_YUV422P9, AV_PIX_FMT_YUV444P9,
-        AV_PIX_FMT_YUV420P10, AV_PIX_FMT_YUV422P10, AV_PIX_FMT_YUV444P10,
-        AV_PIX_FMT_YUV420P12, AV_PIX_FMT_YUV422P12, AV_PIX_FMT_YUV444P12, AV_PIX_FMT_YUV440P12,
-        AV_PIX_FMT_YUVA420P9, AV_PIX_FMT_YUVA422P9, AV_PIX_FMT_YUVA444P9,
-        AV_PIX_FMT_YUVA420P10, AV_PIX_FMT_YUVA422P10, AV_PIX_FMT_YUVA444P10,
-        AV_PIX_FMT_GBRP, AV_PIX_FMT_GBRP9, AV_PIX_FMT_GBRP10,
-        AV_PIX_FMT_GBRP12,
-        AV_PIX_FMT_GBRAP, AV_PIX_FMT_GBRAP10, AV_PIX_FMT_GBRAP12,
-        AV_PIX_FMT_GRAY8, AV_PIX_FMT_GRAY9, AV_PIX_FMT_GRAY10, AV_PIX_FMT_GRAY12,
+    LUT2Context *s = ctx->priv;
+    static const enum AVPixelFormat all_pix_fmts[] = {
+        BIT8_FMTS
+        BIT9_FMTS
+        BIT10_FMTS
+        BIT12_FMTS
         AV_PIX_FMT_NONE
     };
+    static const enum AVPixelFormat bit8_pix_fmts[] = {
+        BIT8_FMTS
+        AV_PIX_FMT_NONE
+    };
+    static const enum AVPixelFormat bit9_pix_fmts[] = {
+        BIT9_FMTS
+        AV_PIX_FMT_NONE
+    };
+    static const enum AVPixelFormat bit10_pix_fmts[] = {
+        BIT10_FMTS
+        AV_PIX_FMT_NONE
+    };
+    static const enum AVPixelFormat bit12_pix_fmts[] = {
+        BIT12_FMTS
+        AV_PIX_FMT_NONE
+    };
+    static const enum AVPixelFormat bit14_pix_fmts[] = {
+        BIT14_FMTS
+        AV_PIX_FMT_NONE
+    };
+    static const enum AVPixelFormat bit16_pix_fmts[] = {
+        BIT16_FMTS
+        AV_PIX_FMT_NONE
+    };
+    const enum AVPixelFormat *pix_fmts;
+    int ret;
 
-    return ff_set_common_formats(ctx, ff_make_format_list(pix_fmts));
+    if (s->tlut2 || !s->odepth)
+        return ff_set_common_formats(ctx, ff_make_format_list(all_pix_fmts));
+
+    ret = ff_formats_ref(ff_make_format_list(all_pix_fmts), &ctx->inputs[0]->out_formats);
+    if (ret < 0)
+        return ret;
+
+    switch (s->odepth) {
+    case 8:  pix_fmts = bit8_pix_fmts;  break;
+    case 9:  pix_fmts = bit9_pix_fmts;  break;
+    case 10: pix_fmts = bit10_pix_fmts; break;
+    case 12: pix_fmts = bit12_pix_fmts; break;
+    case 14: pix_fmts = bit14_pix_fmts; break;
+    case 16: pix_fmts = bit16_pix_fmts; break;
+    default: av_log(ctx, AV_LOG_ERROR, "Unsupported output bit depth %d.\n", s->odepth);
+             return AVERROR(EINVAL);
+    }
+
+    return ff_formats_ref(ff_make_format_list(pix_fmts), &ctx->outputs[0]->in_formats);
 }
 
 static int config_inputx(AVFilterLink *inlink)
@@ -127,11 +203,11 @@
     int hsub = desc->log2_chroma_w;
     int vsub = desc->log2_chroma_h;
 
-    s->nb_planes = av_pix_fmt_count_planes(inlink->format);
-    s->height[1] = s->height[2] = AV_CEIL_RSHIFT(inlink->h, vsub);
-    s->height[0] = s->height[3] = inlink->h;
-    s->width[1]  = s->width[2]  = AV_CEIL_RSHIFT(inlink->w, hsub);
-    s->width[0]  = s->width[3]  = inlink->w;
+    s->nb_planesx = av_pix_fmt_count_planes(inlink->format);
+    s->heightx[1] = s->heightx[2] = AV_CEIL_RSHIFT(inlink->h, vsub);
+    s->heightx[0] = s->heightx[3] = inlink->h;
+    s->widthx[1]  = s->widthx[2]  = AV_CEIL_RSHIFT(inlink->w, hsub);
+    s->widthx[0]  = s->widthx[3]  = inlink->w;
 
     s->var_values[VAR_W] = inlink->w;
     s->var_values[VAR_H] = inlink->h;
@@ -151,62 +227,66 @@
     AVFilterContext *ctx = inlink->dst;
     LUT2Context *s = ctx->priv;
     const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(inlink->format);
+    int hsub = desc->log2_chroma_w;
+    int vsub = desc->log2_chroma_h;
 
+    s->nb_planesy = av_pix_fmt_count_planes(inlink->format);
     s->depthy = desc->comp[0].depth;
     s->var_values[VAR_BITDEPTHY] = s->depthy;
+    s->heighty[1] = s->heighty[2] = AV_CEIL_RSHIFT(inlink->h, vsub);
+    s->heighty[0] = s->heighty[3] = inlink->h;
+    s->widthy[1]  = s->widthy[2]  = AV_CEIL_RSHIFT(inlink->w, hsub);
+    s->widthy[0]  = s->widthy[3]  = inlink->w;
 
     return 0;
 }
 
-static void lut2_8bit(struct LUT2Context *s, AVFrame *out, AVFrame *srcx, AVFrame *srcy)
-{
-    int p, y, x;
-
-    for (p = 0; p < s->nb_planes; p++) {
-        const uint16_t *lut = s->lut[p];
-        const uint8_t *srcxx, *srcyy;
-        uint8_t *dst;
-
-        dst   = out->data[p];
-        srcxx = srcx->data[p];
-        srcyy = srcy->data[p];
-
-        for (y = 0; y < s->height[p]; y++) {
-            for (x = 0; x < s->width[p]; x++) {
-                dst[x] = lut[(srcyy[x] << s->depthx) | srcxx[x]];
-            }
-
-            dst   += out->linesize[p];
-            srcxx += srcx->linesize[p];
-            srcyy += srcy->linesize[p];
-        }
-    }
+#define DEFINE_LUT2(zname, xname, yname, ztype, xtype, ytype, zdiv, xdiv, ydiv)  \
+static int lut2_##zname##_##xname##_##yname(AVFilterContext *ctx,                \
+                                             void *arg,                          \
+                                             int jobnr, int nb_jobs)             \
+{                                                                                \
+    LUT2Context *s = ctx->priv;                                                  \
+    ThreadData *td = arg;                                                        \
+    AVFrame *out = td->out;                                                      \
+    AVFrame *srcx = td->srcx;                                                    \
+    AVFrame *srcy = td->srcy;                                                    \
+    const int odepth = s->odepth;                                                \
+    int p, y, x;                                                                 \
+                                                                                 \
+    for (p = 0; p < s->nb_planes; p++) {                                         \
+        const int slice_start = (s->heightx[p] * jobnr) / nb_jobs;               \
+        const int slice_end = (s->heightx[p] * (jobnr+1)) / nb_jobs;             \
+        const uint16_t *lut = s->lut[p];                                         \
+        const xtype *srcxx;                                                      \
+        const ytype *srcyy;                                                      \
+        ztype *dst;                                                              \
+                                                                                 \
+        dst   = (ztype *)(out->data[p] + slice_start * out->linesize[p]);        \
+        srcxx = (const xtype *)(srcx->data[p] + slice_start * srcx->linesize[p]);\
+        srcyy = (const ytype *)(srcy->data[p] + slice_start * srcy->linesize[p]);\
+                                                                                 \
+        for (y = slice_start; y < slice_end; y++) {                              \
+            for (x = 0; x < s->widthx[p]; x++) {                                 \
+                dst[x] = av_clip_uintp2_c(lut[(srcyy[x] << s->depthx) | srcxx[x]], odepth); \
+            }                                                                    \
+                                                                                 \
+            dst   += out->linesize[p] / zdiv;                                    \
+            srcxx += srcx->linesize[p] / xdiv;                                   \
+            srcyy += srcy->linesize[p] / ydiv;                                   \
+        }                                                                        \
+    }                                                                            \
+    return 0;                                                                    \
 }
 
-static void lut2_16bit(struct LUT2Context *s, AVFrame *out, AVFrame *srcx, AVFrame *srcy)
-{
-    int p, y, x;
-
-    for (p = 0; p < s->nb_planes; p++) {
-        const uint16_t *lut = s->lut[p];
-        const uint16_t *srcxx, *srcyy;
-        uint16_t *dst;
-
-        dst   = (uint16_t *)out->data[p];
-        srcxx = (uint16_t *)srcx->data[p];
-        srcyy = (uint16_t *)srcy->data[p];
-
-        for (y = 0; y < s->height[p]; y++) {
-            for (x = 0; x < s->width[p]; x++) {
-                dst[x] = lut[(srcyy[x] << s->depthx) | srcxx[x]];
-            }
-
-            dst   += out->linesize[p]  / 2;
-            srcxx += srcx->linesize[p] / 2;
-            srcyy += srcy->linesize[p] / 2;
-        }
-    }
-}
+DEFINE_LUT2(8,   8,  8,  uint8_t,  uint8_t,  uint8_t, 1, 1, 1)
+DEFINE_LUT2(8,   8, 16,  uint8_t,  uint8_t, uint16_t, 1, 1, 2)
+DEFINE_LUT2(8,  16,  8,  uint8_t, uint16_t,  uint8_t, 1, 2, 1)
+DEFINE_LUT2(8,  16, 16,  uint8_t, uint16_t, uint16_t, 1, 2, 2)
+DEFINE_LUT2(16,  8,  8, uint16_t,  uint8_t,  uint8_t, 2, 1, 1)
+DEFINE_LUT2(16,  8, 16, uint16_t,  uint8_t, uint16_t, 2, 1, 2)
+DEFINE_LUT2(16, 16,  8, uint16_t, uint16_t,  uint8_t, 2, 2, 1)
+DEFINE_LUT2(16, 16, 16, uint16_t, uint16_t, uint16_t, 2, 2, 2)
 
 static int process_frame(FFFrameSync *fs)
 {
@@ -225,12 +305,17 @@
         if (!out)
             return AVERROR(ENOMEM);
     } else {
+        ThreadData td;
+
         out = ff_get_video_buffer(outlink, outlink->w, outlink->h);
         if (!out)
             return AVERROR(ENOMEM);
         av_frame_copy_props(out, srcx);
 
-        s->lut2(s, out, srcx, srcy);
+        td.out  = out;
+        td.srcx = srcx;
+        td.srcy = srcy;
+        ctx->internal->execute(ctx, s->lut2, &td, NULL, FFMIN(s->heightx[1], ff_filter_get_nb_threads(ctx)));
     }
 
     out->pts = av_rescale_q(s->fs.pts, s->fs.time_base, outlink->time_base);
@@ -245,8 +330,27 @@
     int p, ret;
 
     s->depth = s->depthx + s->depthy;
+    s->nb_planes = s->nb_planesx;
 
-    s->lut2 = s->depth > 16 ? lut2_16bit : lut2_8bit;
+    s->lut2 = s->depth > 16 ? lut2_16_16_16 : lut2_8_8_8;
+    if (s->odepth) {
+        if (s->depthx == 8 && s->depthy == 8 && s->odepth > 8)
+            s->lut2 = lut2_16_8_8;
+        if (s->depthx > 8 && s->depthy == 8 && s->odepth > 8)
+            s->lut2 = lut2_16_16_8;
+        if (s->depthx == 8 && s->depthy > 8 && s->odepth > 8)
+            s->lut2 = lut2_16_8_16;
+        if (s->depthx == 8 && s->depthy == 8 && s->odepth == 8)
+            s->lut2 = lut2_8_8_8;
+        if (s->depthx > 8 && s->depthy == 8 && s->odepth == 8)
+            s->lut2 = lut2_8_16_8;
+        if (s->depthx == 8 && s->depthy > 8 && s->odepth == 8)
+            s->lut2 = lut2_8_8_16;
+        if (s->depthx > 8 && s->depthy > 8 && s->odepth == 8)
+            s->lut2 = lut2_8_16_16;
+    } else {
+        s->odepth = s->depthx;
+    }
 
     for (p = 0; p < s->nb_planes; p++) {
         s->lut[p] = av_malloc_array(1 << s->depth, sizeof(uint16_t));
@@ -271,7 +375,7 @@
         }
 
         /* compute the lut */
-        for (y = 0; y < (1 << s->depthx); y++) {
+        for (y = 0; y < (1 << s->depthy); y++) {
             s->var_values[VAR_Y] = y;
             for (x = 0; x < (1 << s->depthx); x++) {
                 s->var_values[VAR_X] = x;
@@ -298,12 +402,28 @@
     AVFilterLink *srcx = ctx->inputs[0];
     AVFilterLink *srcy = ctx->inputs[1];
     FFFrameSyncIn *in;
+    const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(outlink->format);
+    int hsub = desc->log2_chroma_w;
+    int vsub = desc->log2_chroma_h;
     int ret;
 
-    if (srcx->format != srcy->format) {
+    outlink->w = srcx->w;
+    outlink->h = srcx->h;
+    outlink->time_base = srcx->time_base;
+    outlink->sample_aspect_ratio = srcx->sample_aspect_ratio;
+    outlink->frame_rate = srcx->frame_rate;
+
+    s->nb_planes = av_pix_fmt_count_planes(outlink->format);
+    s->height[1] = s->height[2] = AV_CEIL_RSHIFT(outlink->h, vsub);
+    s->height[0] = s->height[3] = outlink->h;
+    s->width[1]  = s->width[2]  = AV_CEIL_RSHIFT(outlink->w, hsub);
+    s->width[0]  = s->width[3]  = outlink->w;
+
+    if (!s->odepth && srcx->format != srcy->format) {
         av_log(ctx, AV_LOG_ERROR, "inputs must be of same pixel format\n");
         return AVERROR(EINVAL);
     }
+
     if (srcx->w != srcy->w || srcx->h != srcy->h) {
         av_log(ctx, AV_LOG_ERROR, "First input link %s parameters "
                "(size %dx%d) do not match the corresponding "
@@ -314,11 +434,61 @@
         return AVERROR(EINVAL);
     }
 
-    outlink->w = srcx->w;
-    outlink->h = srcx->h;
-    outlink->time_base = srcx->time_base;
-    outlink->sample_aspect_ratio = srcx->sample_aspect_ratio;
-    outlink->frame_rate = srcx->frame_rate;
+    if (s->nb_planesx != s->nb_planesy) {
+        av_log(ctx, AV_LOG_ERROR, "First input link %s number of planes "
+               "(%d) do not match the corresponding "
+               "second input link %s number of planes (%d)\n",
+               ctx->input_pads[0].name, s->nb_planesx,
+               ctx->input_pads[1].name, s->nb_planesy);
+        return AVERROR(EINVAL);
+    }
+
+    if (s->nb_planesx != s->nb_planes) {
+        av_log(ctx, AV_LOG_ERROR, "First input link %s number of planes "
+               "(%d) do not match the corresponding "
+               "output link %s number of planes (%d)\n",
+               ctx->input_pads[0].name, s->nb_planesx,
+               ctx->output_pads[0].name, s->nb_planes);
+        return AVERROR(EINVAL);
+    }
+
+    if (s->widthx[1] != s->widthy[1] || s->heightx[1] != s->heighty[1]) {
+        av_log(ctx, AV_LOG_ERROR, "First input link %s 2nd plane "
+               "(size %dx%d) do not match the corresponding "
+               "second input link %s 2nd plane (size %dx%d)\n",
+               ctx->input_pads[0].name, s->widthx[1], s->heightx[1],
+               ctx->input_pads[1].name,
+               s->widthy[1], s->heighty[1]);
+        return AVERROR(EINVAL);
+    }
+
+    if (s->widthx[2] != s->widthy[2] || s->heightx[2] != s->heighty[2]) {
+        av_log(ctx, AV_LOG_ERROR, "First input link %s 3rd plane "
+               "(size %dx%d) do not match the corresponding "
+               "second input link %s 3rd plane (size %dx%d)\n",
+               ctx->input_pads[0].name, s->widthx[2], s->heightx[2],
+               ctx->input_pads[1].name,
+               s->widthy[2], s->heighty[2]);
+        return AVERROR(EINVAL);
+    }
+
+    if (s->widthx[1] != s->width[1] || s->heightx[1] != s->height[1]) {
+        av_log(ctx, AV_LOG_ERROR, "First input link %s 2nd plane "
+               "(size %dx%d) do not match the corresponding "
+               "output link %s 2nd plane (size %dx%d)\n",
+               ctx->input_pads[0].name, s->widthx[1], s->heightx[1],
+               ctx->output_pads[0].name, s->width[1], s->height[1]);
+        return AVERROR(EINVAL);
+    }
+
+    if (s->widthx[2] != s->width[2] || s->heightx[2] != s->height[2]) {
+        av_log(ctx, AV_LOG_ERROR, "First input link %s 3rd plane "
+               "(size %dx%d) do not match the corresponding "
+               "output link %s 3rd plane (size %dx%d)\n",
+               ctx->input_pads[0].name, s->widthx[2], s->heightx[2],
+               ctx->output_pads[0].name, s->width[2], s->height[2]);
+        return AVERROR(EINVAL);
+    }
 
     if ((ret = ff_framesync_init(&s->fs, ctx, 2)) < 0)
         return ret;
@@ -338,7 +508,10 @@
     if ((ret = config_output(outlink)) < 0)
         return ret;
 
-    return ff_framesync_configure(&s->fs);
+    ret = ff_framesync_configure(&s->fs);
+    outlink->time_base = s->fs.time_base;
+
+    return ret;
 }
 
 static int activate(AVFilterContext *ctx)
@@ -385,7 +558,8 @@
     .activate      = activate,
     .inputs        = inputs,
     .outputs       = outputs,
-    .flags         = AVFILTER_FLAG_SUPPORT_TIMELINE_INTERNAL,
+    .flags         = AVFILTER_FLAG_SUPPORT_TIMELINE_INTERNAL |
+                     AVFILTER_FLAG_SLICE_THREADS,
 };
 
 #if CONFIG_TLUT2_FILTER
@@ -411,6 +585,8 @@
         if (ctx->is_disabled) {
             out = av_frame_clone(frame);
         } else {
+            ThreadData td;
+
             out = ff_get_video_buffer(outlink, outlink->w, outlink->h);
             if (!out) {
                 av_frame_free(&s->prev_frame);
@@ -419,7 +595,11 @@
             }
 
             av_frame_copy_props(out, frame);
-            s->lut2(s, out, frame, s->prev_frame);
+
+            td.out  = out;
+            td.srcx = frame;
+            td.srcy = s->prev_frame;
+            ctx->internal->execute(ctx, s->lut2, &td, NULL, FFMIN(s->heightx[1], ff_filter_get_nb_threads(ctx)));
         }
         av_frame_free(&s->prev_frame);
         s->prev_frame = frame;
@@ -429,7 +609,13 @@
     return 0;
 }
 
-#define tlut2_options options
+static const AVOption tlut2_options[] = {
+    { "c0", "set component #0 expression", OFFSET(comp_expr_str[0]),  AV_OPT_TYPE_STRING, { .str = "x" }, .flags = FLAGS },
+    { "c1", "set component #1 expression", OFFSET(comp_expr_str[1]),  AV_OPT_TYPE_STRING, { .str = "x" }, .flags = FLAGS },
+    { "c2", "set component #2 expression", OFFSET(comp_expr_str[2]),  AV_OPT_TYPE_STRING, { .str = "x" }, .flags = FLAGS },
+    { "c3", "set component #3 expression", OFFSET(comp_expr_str[3]),  AV_OPT_TYPE_STRING, { .str = "x" }, .flags = FLAGS },
+    { NULL }
+};
 
 AVFILTER_DEFINE_CLASS(tlut2);
 
@@ -462,7 +648,8 @@
     .uninit        = uninit,
     .inputs        = tlut2_inputs,
     .outputs       = tlut2_outputs,
-    .flags         = AVFILTER_FLAG_SUPPORT_TIMELINE_INTERNAL,
+    .flags         = AVFILTER_FLAG_SUPPORT_TIMELINE_INTERNAL |
+                     AVFILTER_FLAG_SLICE_THREADS,
 };
 
 #endif
diff --git a/libavfilter/vf_lut3d.c b/libavfilter/vf_lut3d.c
index 4d985c5..fda85b1 100644
--- a/libavfilter/vf_lut3d.c
+++ b/libavfilter/vf_lut3d.c
@@ -55,7 +55,7 @@
 
 /* 3D LUT don't often go up to level 32, but it is common to have a Hald CLUT
  * of 512x512 (64x64x64) */
-#define MAX_LEVEL 64
+#define MAX_LEVEL 256
 
 typedef struct LUT3DContext {
     const AVClass *class;
@@ -64,8 +64,10 @@
     uint8_t rgba_map[4];
     int step;
     avfilter_action_func *interp;
-    struct rgbvec lut[MAX_LEVEL][MAX_LEVEL][MAX_LEVEL];
+    struct rgbvec scale;
+    struct rgbvec *lut;
     int lutsize;
+    int lutsize2;
 #if CONFIG_HALDCLUT_FILTER
     uint8_t clut_rgba_map[4];
     int clut_step;
@@ -112,7 +114,7 @@
 static inline struct rgbvec interp_nearest(const LUT3DContext *lut3d,
                                            const struct rgbvec *s)
 {
-    return lut3d->lut[NEAR(s->r)][NEAR(s->g)][NEAR(s->b)];
+    return lut3d->lut[NEAR(s->r) * lut3d->lutsize2 + NEAR(s->g) * lut3d->lutsize + NEAR(s->b)];
 }
 
 /**
@@ -122,17 +124,19 @@
 static inline struct rgbvec interp_trilinear(const LUT3DContext *lut3d,
                                              const struct rgbvec *s)
 {
+    const int lutsize2 = lut3d->lutsize2;
+    const int lutsize  = lut3d->lutsize;
     const int prev[] = {PREV(s->r), PREV(s->g), PREV(s->b)};
     const int next[] = {NEXT(s->r), NEXT(s->g), NEXT(s->b)};
     const struct rgbvec d = {s->r - prev[0], s->g - prev[1], s->b - prev[2]};
-    const struct rgbvec c000 = lut3d->lut[prev[0]][prev[1]][prev[2]];
-    const struct rgbvec c001 = lut3d->lut[prev[0]][prev[1]][next[2]];
-    const struct rgbvec c010 = lut3d->lut[prev[0]][next[1]][prev[2]];
-    const struct rgbvec c011 = lut3d->lut[prev[0]][next[1]][next[2]];
-    const struct rgbvec c100 = lut3d->lut[next[0]][prev[1]][prev[2]];
-    const struct rgbvec c101 = lut3d->lut[next[0]][prev[1]][next[2]];
-    const struct rgbvec c110 = lut3d->lut[next[0]][next[1]][prev[2]];
-    const struct rgbvec c111 = lut3d->lut[next[0]][next[1]][next[2]];
+    const struct rgbvec c000 = lut3d->lut[prev[0] * lutsize2 + prev[1] * lutsize + prev[2]];
+    const struct rgbvec c001 = lut3d->lut[prev[0] * lutsize2 + prev[1] * lutsize + next[2]];
+    const struct rgbvec c010 = lut3d->lut[prev[0] * lutsize2 + next[1] * lutsize + prev[2]];
+    const struct rgbvec c011 = lut3d->lut[prev[0] * lutsize2 + next[1] * lutsize + next[2]];
+    const struct rgbvec c100 = lut3d->lut[next[0] * lutsize2 + prev[1] * lutsize + prev[2]];
+    const struct rgbvec c101 = lut3d->lut[next[0] * lutsize2 + prev[1] * lutsize + next[2]];
+    const struct rgbvec c110 = lut3d->lut[next[0] * lutsize2 + next[1] * lutsize + prev[2]];
+    const struct rgbvec c111 = lut3d->lut[next[0] * lutsize2 + next[1] * lutsize + next[2]];
     const struct rgbvec c00  = lerp(&c000, &c100, d.r);
     const struct rgbvec c10  = lerp(&c010, &c110, d.r);
     const struct rgbvec c01  = lerp(&c001, &c101, d.r);
@@ -150,48 +154,50 @@
 static inline struct rgbvec interp_tetrahedral(const LUT3DContext *lut3d,
                                                const struct rgbvec *s)
 {
+    const int lutsize2 = lut3d->lutsize2;
+    const int lutsize  = lut3d->lutsize;
     const int prev[] = {PREV(s->r), PREV(s->g), PREV(s->b)};
     const int next[] = {NEXT(s->r), NEXT(s->g), NEXT(s->b)};
     const struct rgbvec d = {s->r - prev[0], s->g - prev[1], s->b - prev[2]};
-    const struct rgbvec c000 = lut3d->lut[prev[0]][prev[1]][prev[2]];
-    const struct rgbvec c111 = lut3d->lut[next[0]][next[1]][next[2]];
+    const struct rgbvec c000 = lut3d->lut[prev[0] * lutsize2 + prev[1] * lutsize + prev[2]];
+    const struct rgbvec c111 = lut3d->lut[next[0] * lutsize2 + next[1] * lutsize + next[2]];
     struct rgbvec c;
     if (d.r > d.g) {
         if (d.g > d.b) {
-            const struct rgbvec c100 = lut3d->lut[next[0]][prev[1]][prev[2]];
-            const struct rgbvec c110 = lut3d->lut[next[0]][next[1]][prev[2]];
+            const struct rgbvec c100 = lut3d->lut[next[0] * lutsize2 + prev[1] * lutsize + prev[2]];
+            const struct rgbvec c110 = lut3d->lut[next[0] * lutsize2 + next[1] * lutsize + prev[2]];
             c.r = (1-d.r) * c000.r + (d.r-d.g) * c100.r + (d.g-d.b) * c110.r + (d.b) * c111.r;
             c.g = (1-d.r) * c000.g + (d.r-d.g) * c100.g + (d.g-d.b) * c110.g + (d.b) * c111.g;
             c.b = (1-d.r) * c000.b + (d.r-d.g) * c100.b + (d.g-d.b) * c110.b + (d.b) * c111.b;
         } else if (d.r > d.b) {
-            const struct rgbvec c100 = lut3d->lut[next[0]][prev[1]][prev[2]];
-            const struct rgbvec c101 = lut3d->lut[next[0]][prev[1]][next[2]];
+            const struct rgbvec c100 = lut3d->lut[next[0] * lutsize2 + prev[1] * lutsize + prev[2]];
+            const struct rgbvec c101 = lut3d->lut[next[0] * lutsize2 + prev[1] * lutsize + next[2]];
             c.r = (1-d.r) * c000.r + (d.r-d.b) * c100.r + (d.b-d.g) * c101.r + (d.g) * c111.r;
             c.g = (1-d.r) * c000.g + (d.r-d.b) * c100.g + (d.b-d.g) * c101.g + (d.g) * c111.g;
             c.b = (1-d.r) * c000.b + (d.r-d.b) * c100.b + (d.b-d.g) * c101.b + (d.g) * c111.b;
         } else {
-            const struct rgbvec c001 = lut3d->lut[prev[0]][prev[1]][next[2]];
-            const struct rgbvec c101 = lut3d->lut[next[0]][prev[1]][next[2]];
+            const struct rgbvec c001 = lut3d->lut[prev[0] * lutsize2 + prev[1] * lutsize + next[2]];
+            const struct rgbvec c101 = lut3d->lut[next[0] * lutsize2 + prev[1] * lutsize + next[2]];
             c.r = (1-d.b) * c000.r + (d.b-d.r) * c001.r + (d.r-d.g) * c101.r + (d.g) * c111.r;
             c.g = (1-d.b) * c000.g + (d.b-d.r) * c001.g + (d.r-d.g) * c101.g + (d.g) * c111.g;
             c.b = (1-d.b) * c000.b + (d.b-d.r) * c001.b + (d.r-d.g) * c101.b + (d.g) * c111.b;
         }
     } else {
         if (d.b > d.g) {
-            const struct rgbvec c001 = lut3d->lut[prev[0]][prev[1]][next[2]];
-            const struct rgbvec c011 = lut3d->lut[prev[0]][next[1]][next[2]];
+            const struct rgbvec c001 = lut3d->lut[prev[0] * lutsize2 + prev[1] * lutsize + next[2]];
+            const struct rgbvec c011 = lut3d->lut[prev[0] * lutsize2 + next[1] * lutsize + next[2]];
             c.r = (1-d.b) * c000.r + (d.b-d.g) * c001.r + (d.g-d.r) * c011.r + (d.r) * c111.r;
             c.g = (1-d.b) * c000.g + (d.b-d.g) * c001.g + (d.g-d.r) * c011.g + (d.r) * c111.g;
             c.b = (1-d.b) * c000.b + (d.b-d.g) * c001.b + (d.g-d.r) * c011.b + (d.r) * c111.b;
         } else if (d.b > d.r) {
-            const struct rgbvec c010 = lut3d->lut[prev[0]][next[1]][prev[2]];
-            const struct rgbvec c011 = lut3d->lut[prev[0]][next[1]][next[2]];
+            const struct rgbvec c010 = lut3d->lut[prev[0] * lutsize2 + next[1] * lutsize + prev[2]];
+            const struct rgbvec c011 = lut3d->lut[prev[0] * lutsize2 + next[1] * lutsize + next[2]];
             c.r = (1-d.g) * c000.r + (d.g-d.b) * c010.r + (d.b-d.r) * c011.r + (d.r) * c111.r;
             c.g = (1-d.g) * c000.g + (d.g-d.b) * c010.g + (d.b-d.r) * c011.g + (d.r) * c111.g;
             c.b = (1-d.g) * c000.b + (d.g-d.b) * c010.b + (d.b-d.r) * c011.b + (d.r) * c111.b;
         } else {
-            const struct rgbvec c010 = lut3d->lut[prev[0]][next[1]][prev[2]];
-            const struct rgbvec c110 = lut3d->lut[next[0]][next[1]][prev[2]];
+            const struct rgbvec c010 = lut3d->lut[prev[0] * lutsize2 + next[1] * lutsize + prev[2]];
+            const struct rgbvec c110 = lut3d->lut[next[0] * lutsize2 + next[1] * lutsize + prev[2]];
             c.r = (1-d.g) * c000.r + (d.g-d.r) * c010.r + (d.r-d.b) * c110.r + (d.b) * c111.r;
             c.g = (1-d.g) * c000.g + (d.g-d.r) * c010.g + (d.r-d.b) * c110.g + (d.b) * c111.g;
             c.b = (1-d.g) * c000.b + (d.g-d.r) * c010.b + (d.r-d.b) * c110.b + (d.b) * c111.b;
@@ -219,7 +225,9 @@
     const uint8_t *srcbrow = in->data[1] + slice_start * in->linesize[1];                              \
     const uint8_t *srcrrow = in->data[2] + slice_start * in->linesize[2];                              \
     const uint8_t *srcarow = in->data[3] + slice_start * in->linesize[3];                              \
-    const float scale = (1. / ((1<<depth) - 1)) * (lut3d->lutsize - 1);                                \
+    const float scale_r = (lut3d->scale.r / ((1<<depth) - 1)) * (lut3d->lutsize - 1);                  \
+    const float scale_g = (lut3d->scale.g / ((1<<depth) - 1)) * (lut3d->lutsize - 1);                  \
+    const float scale_b = (lut3d->scale.b / ((1<<depth) - 1)) * (lut3d->lutsize - 1);                  \
                                                                                                        \
     for (y = slice_start; y < slice_end; y++) {                                                        \
         uint##nbits##_t *dstg = (uint##nbits##_t *)grow;                                               \
@@ -231,9 +239,9 @@
         const uint##nbits##_t *srcr = (const uint##nbits##_t *)srcrrow;                                \
         const uint##nbits##_t *srca = (const uint##nbits##_t *)srcarow;                                \
         for (x = 0; x < in->width; x++) {                                                              \
-            const struct rgbvec scaled_rgb = {srcr[x] * scale,                                         \
-                                              srcg[x] * scale,                                         \
-                                              srcb[x] * scale};                                        \
+            const struct rgbvec scaled_rgb = {srcr[x] * scale_r,                                       \
+                                              srcg[x] * scale_g,                                       \
+                                              srcb[x] * scale_b};                                      \
             struct rgbvec vec = interp_##name(lut3d, &scaled_rgb);                                     \
             dstr[x] = av_clip_uintp2(vec.r * (float)((1<<depth) - 1), depth);                          \
             dstg[x] = av_clip_uintp2(vec.g * (float)((1<<depth) - 1), depth);                          \
@@ -295,15 +303,17 @@
     const int slice_end   = (in->height * (jobnr+1)) / nb_jobs;                                     \
     uint8_t       *dstrow = out->data[0] + slice_start * out->linesize[0];                          \
     const uint8_t *srcrow = in ->data[0] + slice_start * in ->linesize[0];                          \
-    const float scale = (1. / ((1<<nbits) - 1)) * (lut3d->lutsize - 1);                             \
+    const float scale_r = (lut3d->scale.r / ((1<<nbits) - 1)) * (lut3d->lutsize - 1);               \
+    const float scale_g = (lut3d->scale.g / ((1<<nbits) - 1)) * (lut3d->lutsize - 1);               \
+    const float scale_b = (lut3d->scale.b / ((1<<nbits) - 1)) * (lut3d->lutsize - 1);               \
                                                                                                     \
     for (y = slice_start; y < slice_end; y++) {                                                     \
         uint##nbits##_t *dst = (uint##nbits##_t *)dstrow;                                           \
         const uint##nbits##_t *src = (const uint##nbits##_t *)srcrow;                               \
         for (x = 0; x < in->width * step; x += step) {                                              \
-            const struct rgbvec scaled_rgb = {src[x + r] * scale,                                   \
-                                              src[x + g] * scale,                                   \
-                                              src[x + b] * scale};                                  \
+            const struct rgbvec scaled_rgb = {src[x + r] * scale_r,                                 \
+                                              src[x + g] * scale_g,                                 \
+                                              src[x + b] * scale_b};                                \
             struct rgbvec vec = interp_##name(lut3d, &scaled_rgb);                                  \
             dst[x + r] = av_clip_uint##nbits(vec.r * (float)((1<<nbits) - 1));                      \
             dst[x + g] = av_clip_uint##nbits(vec.g * (float)((1<<nbits) - 1));                      \
@@ -341,33 +351,53 @@
     }                                                       \
 } while (loop_cond)
 
+static int allocate_3dlut(AVFilterContext *ctx, int lutsize)
+{
+    LUT3DContext *lut3d = ctx->priv;
+
+    if (lutsize < 2 || lutsize > MAX_LEVEL) {
+        av_log(ctx, AV_LOG_ERROR, "Too large or invalid 3D LUT size\n");
+        return AVERROR(EINVAL);
+    }
+
+    av_freep(&lut3d->lut);
+    lut3d->lut = av_malloc_array(lutsize * lutsize * lutsize, sizeof(*lut3d->lut));
+    if (!lut3d->lut)
+        return AVERROR(ENOMEM);
+    lut3d->lutsize = lutsize;
+    lut3d->lutsize2 = lutsize * lutsize;
+    return 0;
+}
+
 /* Basically r g and b float values on each line, with a facultative 3DLUTSIZE
  * directive; seems to be generated by Davinci */
 static int parse_dat(AVFilterContext *ctx, FILE *f)
 {
     LUT3DContext *lut3d = ctx->priv;
     char line[MAX_LINE_SIZE];
-    int i, j, k, size;
+    int ret, i, j, k, size, size2;
 
     lut3d->lutsize = size = 33;
+    size2 = size * size;
 
     NEXT_LINE(skip_line(line));
     if (!strncmp(line, "3DLUTSIZE ", 10)) {
         size = strtol(line + 10, NULL, 0);
-        if (size < 2 || size > MAX_LEVEL) {
-            av_log(ctx, AV_LOG_ERROR, "Too large or invalid 3D LUT size\n");
-            return AVERROR(EINVAL);
-        }
-        lut3d->lutsize = size;
+
         NEXT_LINE(skip_line(line));
     }
+
+    ret = allocate_3dlut(ctx, size);
+    if (ret < 0)
+        return ret;
+
     for (k = 0; k < size; k++) {
         for (j = 0; j < size; j++) {
             for (i = 0; i < size; i++) {
-                struct rgbvec *vec = &lut3d->lut[k][j][i];
+                struct rgbvec *vec = &lut3d->lut[k * size2 + j * size + i];
                 if (k != 0 || j != 0 || i != 0)
                     NEXT_LINE(skip_line(line));
-                if (sscanf(line, "%f %f %f", &vec->r, &vec->g, &vec->b) != 3)
+                if (av_sscanf(line, "%f %f %f", &vec->r, &vec->g, &vec->b) != 3)
                     return AVERROR_INVALIDDATA;
             }
         }
@@ -384,19 +414,19 @@
     float max[3] = {1.0, 1.0, 1.0};
 
     while (fgets(line, sizeof(line), f)) {
-        if (!strncmp(line, "LUT_3D_SIZE ", 12)) {
-            int i, j, k;
+        if (!strncmp(line, "LUT_3D_SIZE", 11)) {
+            int ret, i, j, k;
             const int size = strtol(line + 12, NULL, 0);
+            const int size2 = size * size;
 
-            if (size < 2 || size > MAX_LEVEL) {
-                av_log(ctx, AV_LOG_ERROR, "Too large or invalid 3D LUT size\n");
-                return AVERROR(EINVAL);
-            }
-            lut3d->lutsize = size;
+            ret = allocate_3dlut(ctx, size);
+            if (ret < 0)
+                return ret;
+
             for (k = 0; k < size; k++) {
                 for (j = 0; j < size; j++) {
                     for (i = 0; i < size; i++) {
-                        struct rgbvec *vec = &lut3d->lut[i][j][k];
+                        struct rgbvec *vec = &lut3d->lut[i * size2 + j * size + k];
 
                         do {
 try_again:
@@ -407,23 +437,27 @@
                                 else if (!strncmp(line + 7, "MAX ", 4)) vals = max;
                                 if (!vals)
                                     return AVERROR_INVALIDDATA;
-                                sscanf(line + 11, "%f %f %f", vals, vals + 1, vals + 2);
+                                av_sscanf(line + 11, "%f %f %f", vals, vals + 1, vals + 2);
                                 av_log(ctx, AV_LOG_DEBUG, "min: %f %f %f | max: %f %f %f\n",
                                        min[0], min[1], min[2], max[0], max[1], max[2]);
                                 goto try_again;
+                            } else if (!strncmp(line, "TITLE", 5)) {
+                                goto try_again;
                             }
                         } while (skip_line(line));
-                        if (sscanf(line, "%f %f %f", &vec->r, &vec->g, &vec->b) != 3)
+                        if (av_sscanf(line, "%f %f %f", &vec->r, &vec->g, &vec->b) != 3)
                             return AVERROR_INVALIDDATA;
-                        vec->r *= max[0] - min[0];
-                        vec->g *= max[1] - min[1];
-                        vec->b *= max[2] - min[2];
                     }
                 }
             }
             break;
         }
     }
+
+    lut3d->scale.r = av_clipf(1. / (max[0] - min[0]), 0.f, 1.f);
+    lut3d->scale.g = av_clipf(1. / (max[1] - min[1]), 0.f, 1.f);
+    lut3d->scale.b = av_clipf(1. / (max[2] - min[2]), 0.f, 1.f);
+
     return 0;
 }
 
@@ -433,20 +467,26 @@
 {
     char line[MAX_LINE_SIZE];
     LUT3DContext *lut3d = ctx->priv;
-    int i, j, k;
+    int ret, i, j, k;
     const int size = 17;
+    const int size2 = 17 * 17;
     const float scale = 16*16*16;
 
     lut3d->lutsize = size;
+
+    ret = allocate_3dlut(ctx, size);
+    if (ret < 0)
+        return ret;
+
     NEXT_LINE(skip_line(line));
     for (k = 0; k < size; k++) {
         for (j = 0; j < size; j++) {
             for (i = 0; i < size; i++) {
                 int r, g, b;
-                struct rgbvec *vec = &lut3d->lut[k][j][i];
+                struct rgbvec *vec = &lut3d->lut[k * size2 + j * size + i];
 
                 NEXT_LINE(skip_line(line));
-                if (sscanf(line, "%d %d %d", &r, &g, &b) != 3)
+                if (av_sscanf(line, "%d %d %d", &r, &g, &b) != 3)
                     return AVERROR_INVALIDDATA;
                 vec->r = r / scale;
                 vec->g = g / scale;
@@ -462,7 +502,7 @@
 {
     LUT3DContext *lut3d = ctx->priv;
     float scale;
-    int i, j, k, size, in = -1, out = -1;
+    int ret, i, j, k, size, size2, in = -1, out = -1;
     char line[MAX_LINE_SIZE];
     uint8_t rgb_map[3] = {0, 1, 2};
 
@@ -501,16 +541,22 @@
     }
     for (size = 1; size*size*size < in; size++);
     lut3d->lutsize = size;
+    size2 = size * size;
+
+    ret = allocate_3dlut(ctx, size);
+    if (ret < 0)
+        return ret;
+
     scale = 1. / (out - 1);
 
     for (k = 0; k < size; k++) {
         for (j = 0; j < size; j++) {
             for (i = 0; i < size; i++) {
-                struct rgbvec *vec = &lut3d->lut[k][j][i];
+                struct rgbvec *vec = &lut3d->lut[k * size2 + j * size + i];
                 float val[3];
 
                 NEXT_LINE(0);
-                if (sscanf(line, "%f %f %f", val, val + 1, val + 2) != 3)
+                if (av_sscanf(line, "%f %f %f", val, val + 1, val + 2) != 3)
                     return AVERROR_INVALIDDATA;
                 vec->r = val[rgb_map[0]] * scale;
                 vec->g = val[rgb_map[1]] * scale;
@@ -521,22 +567,122 @@
     return 0;
 }
 
-static void set_identity_matrix(LUT3DContext *lut3d, int size)
+static int parse_cinespace(AVFilterContext *ctx, FILE *f)
 {
-    int i, j, k;
+    LUT3DContext *lut3d = ctx->priv;
+    char line[MAX_LINE_SIZE];
+    float in_min[3]  = {0.0, 0.0, 0.0};
+    float in_max[3]  = {1.0, 1.0, 1.0};
+    float out_min[3] = {0.0, 0.0, 0.0};
+    float out_max[3] = {1.0, 1.0, 1.0};
+    int ret, inside_metadata = 0, size, size2;
+
+    NEXT_LINE(skip_line(line));
+    if (strncmp(line, "CSPLUTV100", 10)) {
+        av_log(ctx, AV_LOG_ERROR, "Not cineSpace LUT format\n");
+        return AVERROR(EINVAL);
+    }
+
+    NEXT_LINE(skip_line(line));
+    if (strncmp(line, "3D", 2)) {
+        av_log(ctx, AV_LOG_ERROR, "Not 3D LUT format\n");
+        return AVERROR(EINVAL);
+    }
+
+    while (1) {
+        NEXT_LINE(skip_line(line));
+
+        if (!strncmp(line, "BEGIN METADATA", 14)) {
+            inside_metadata = 1;
+            continue;
+        }
+        if (!strncmp(line, "END METADATA", 12)) {
+            inside_metadata = 0;
+            continue;
+        }
+        if (inside_metadata == 0) {
+            int size_r, size_g, size_b;
+
+            for (int i = 0; i < 3; i++) {
+                int npoints = strtol(line, NULL, 0);
+
+                if (npoints != 2) {
+                    av_log(ctx, AV_LOG_ERROR, "Unsupported number of pre-lut points.\n");
+                    return AVERROR_PATCHWELCOME;
+                }
+
+                NEXT_LINE(skip_line(line));
+                if (av_sscanf(line, "%f %f", &in_min[i], &in_max[i]) != 2)
+                    return AVERROR_INVALIDDATA;
+                NEXT_LINE(skip_line(line));
+                if (av_sscanf(line, "%f %f", &out_min[i], &out_max[i]) != 2)
+                    return AVERROR_INVALIDDATA;
+                NEXT_LINE(skip_line(line));
+            }
+
+            if (av_sscanf(line, "%d %d %d", &size_r, &size_g, &size_b) != 3)
+                return AVERROR(EINVAL);
+            if (size_r != size_g || size_r != size_b) {
+                av_log(ctx, AV_LOG_ERROR, "Unsupported size combination: %dx%dx%d.\n", size_r, size_g, size_b);
+                return AVERROR_PATCHWELCOME;
+            }
+
+            size = size_r;
+            size2 = size * size;
+
+            ret = allocate_3dlut(ctx, size);
+            if (ret < 0)
+                return ret;
+
+            for (int k = 0; k < size; k++) {
+                for (int j = 0; j < size; j++) {
+                    for (int i = 0; i < size; i++) {
+                        struct rgbvec *vec = &lut3d->lut[i * size2 + j * size + k];
+                        if (k != 0 || j != 0 || i != 0)
+                            NEXT_LINE(skip_line(line));
+                        if (av_sscanf(line, "%f %f %f", &vec->r, &vec->g, &vec->b) != 3)
+                            return AVERROR_INVALIDDATA;
+                        vec->r *= out_max[0] - out_min[0];
+                        vec->g *= out_max[1] - out_min[1];
+                        vec->b *= out_max[2] - out_min[2];
+                    }
+                }
+            }
+
+            break;
+        }
+    }
+
+    lut3d->scale.r = av_clipf(1. / (in_max[0] - in_min[0]), 0.f, 1.f);
+    lut3d->scale.g = av_clipf(1. / (in_max[1] - in_min[1]), 0.f, 1.f);
+    lut3d->scale.b = av_clipf(1. / (in_max[2] - in_min[2]), 0.f, 1.f);
+
+    return 0;
+}
+
+static int set_identity_matrix(AVFilterContext *ctx, int size)
+{
+    LUT3DContext *lut3d = ctx->priv;
+    int ret, i, j, k;
+    const int size2 = size * size;
     const float c = 1. / (size - 1);
 
-    lut3d->lutsize = size;
+    ret = allocate_3dlut(ctx, size);
+    if (ret < 0)
+        return ret;
+
     for (k = 0; k < size; k++) {
         for (j = 0; j < size; j++) {
             for (i = 0; i < size; i++) {
-                struct rgbvec *vec = &lut3d->lut[k][j][i];
+                struct rgbvec *vec = &lut3d->lut[k * size2 + j * size + i];
                 vec->r = k * c;
                 vec->g = j * c;
                 vec->b = i * c;
             }
         }
     }
+
+    return 0;
 }
 
 static int query_formats(AVFilterContext *ctx)
@@ -565,34 +711,13 @@
 
 static int config_input(AVFilterLink *inlink)
 {
-    int depth, is16bit = 0, planar = 0;
+    int depth, is16bit, planar;
     LUT3DContext *lut3d = inlink->dst->priv;
     const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(inlink->format);
 
     depth = desc->comp[0].depth;
-
-    switch (inlink->format) {
-    case AV_PIX_FMT_RGB48:
-    case AV_PIX_FMT_BGR48:
-    case AV_PIX_FMT_RGBA64:
-    case AV_PIX_FMT_BGRA64:
-        is16bit = 1;
-        break;
-    case AV_PIX_FMT_GBRP9:
-    case AV_PIX_FMT_GBRP10:
-    case AV_PIX_FMT_GBRP12:
-    case AV_PIX_FMT_GBRP14:
-    case AV_PIX_FMT_GBRP16:
-    case AV_PIX_FMT_GBRAP10:
-    case AV_PIX_FMT_GBRAP12:
-    case AV_PIX_FMT_GBRAP16:
-        is16bit = 1;
-    case AV_PIX_FMT_GBRP:
-    case AV_PIX_FMT_GBRAP:
-        planar = 1;
-        break;
-    }
-
+    is16bit = desc->comp[0].depth > 8;
+    planar = desc->flags & AV_PIX_FMT_FLAG_PLANAR;
     ff_fill_rgba_map(lut3d->rgba_map, inlink->format);
     lut3d->step = av_get_padded_bits_per_pixel(desc) >> (3 + is16bit);
 
@@ -674,12 +799,13 @@
     const char *ext;
     LUT3DContext *lut3d = ctx->priv;
 
+    lut3d->scale.r = lut3d->scale.g = lut3d->scale.b = 1.f;
+
     if (!lut3d->file) {
-        set_identity_matrix(lut3d, 32);
-        return 0;
+        return set_identity_matrix(ctx, 32);
     }
 
-    f = fopen(lut3d->file, "r");
+    f = av_fopen_utf8(lut3d->file, "r");
     if (!f) {
         ret = AVERROR(errno);
         av_log(ctx, AV_LOG_ERROR, "%s: %s\n", lut3d->file, av_err2str(ret));
@@ -702,6 +828,8 @@
         ret = parse_cube(ctx, f);
     } else if (!av_strcasecmp(ext, "m3d")) {
         ret = parse_m3d(ctx, f);
+    } else if (!av_strcasecmp(ext, "csp")) {
+        ret = parse_cinespace(ctx, f);
     } else {
         av_log(ctx, AV_LOG_ERROR, "Unrecognized '.%s' file type\n", ext);
         ret = AVERROR(EINVAL);
@@ -717,6 +845,13 @@
     return ret;
 }
 
+static av_cold void lut3d_uninit(AVFilterContext *ctx)
+{
+    LUT3DContext *lut3d = ctx->priv;
+
+    av_freep(&lut3d->lut);
+}
+
 static const AVFilterPad lut3d_inputs[] = {
     {
         .name         = "default",
@@ -740,6 +875,7 @@
     .description   = NULL_IF_CONFIG_SMALL("Adjust colors using a 3D LUT."),
     .priv_size     = sizeof(LUT3DContext),
     .init          = lut3d_init,
+    .uninit        = lut3d_uninit,
     .query_formats = query_formats,
     .inputs        = lut3d_inputs,
     .outputs       = lut3d_outputs,
@@ -758,6 +894,7 @@
     const int step = lut3d->clut_step;
     const uint8_t *rgba_map = lut3d->clut_rgba_map;
     const int level = lut3d->lutsize;
+    const int level2 = lut3d->lutsize2;
 
 #define LOAD_CLUT(nbits) do {                                           \
     int i, j, k, x = 0, y = 0;                                          \
@@ -767,7 +904,7 @@
             for (i = 0; i < level; i++) {                               \
                 const uint##nbits##_t *src = (const uint##nbits##_t *)  \
                     (data + y*linesize + x*step);                       \
-                struct rgbvec *vec = &lut3d->lut[i][j][k];              \
+                struct rgbvec *vec = &lut3d->lut[i * level2 + j * level + k]; \
                 vec->r = src[rgba_map[0]] / (float)((1<<(nbits)) - 1);  \
                 vec->g = src[rgba_map[1]] / (float)((1<<(nbits)) - 1);  \
                 vec->b = src[rgba_map[2]] / (float)((1<<(nbits)) - 1);  \
@@ -796,6 +933,7 @@
     const int rlinesize  = frame->linesize[2];
     const int w = lut3d->clut_width;
     const int level = lut3d->lutsize;
+    const int level2 = lut3d->lutsize2;
 
 #define LOAD_CLUT_PLANAR(nbits, depth) do {                             \
     int i, j, k, x = 0, y = 0;                                          \
@@ -809,7 +947,7 @@
                     (datab + y*blinesize);                              \
                 const uint##nbits##_t *rsrc = (const uint##nbits##_t *) \
                     (datar + y*rlinesize);                              \
-                struct rgbvec *vec = &lut3d->lut[i][j][k];              \
+                struct rgbvec *vec = &lut3d->lut[i * level2 + j * level + k]; \
                 vec->r = gsrc[x] / (float)((1<<(depth)) - 1);           \
                 vec->g = bsrc[x] / (float)((1<<(depth)) - 1);           \
                 vec->b = rsrc[x] / (float)((1<<(depth)) - 1);           \
@@ -894,9 +1032,8 @@
                max_clut_level, max_clut_size, max_clut_size);
         return AVERROR(EINVAL);
     }
-    lut3d->lutsize = level;
 
-    return 0;
+    return allocate_3dlut(ctx, level);
 }
 
 static int update_apply_clut(FFFrameSync *fs)
@@ -923,6 +1060,7 @@
 static av_cold int haldclut_init(AVFilterContext *ctx)
 {
     LUT3DContext *lut3d = ctx->priv;
+    lut3d->scale.r = lut3d->scale.g = lut3d->scale.b = 1.f;
     lut3d->fs.on_event = update_apply_clut;
     return 0;
 }
@@ -931,6 +1069,7 @@
 {
     LUT3DContext *lut3d = ctx->priv;
     ff_framesync_uninit(&lut3d->fs);
+    av_freep(&lut3d->lut);
 }
 
 static const AVOption haldclut_options[] = {
@@ -983,6 +1122,8 @@
     INTERPOLATE_1D_NEAREST,
     INTERPOLATE_1D_LINEAR,
     INTERPOLATE_1D_CUBIC,
+    INTERPOLATE_1D_COSINE,
+    INTERPOLATE_1D_SPLINE,
     NB_INTERP_1D_MODE
 };
 
@@ -992,6 +1133,7 @@
     const AVClass *class;
     char *file;
     int interpolation;          ///<interp_1d_mode
+    struct rgbvec scale;
     uint8_t rgba_map[4];
     int step;
     float lut[3][MAX_1D_LEVEL];
@@ -1015,6 +1157,86 @@
     }
 }
 
+static int parse_cinespace_1d(AVFilterContext *ctx, FILE *f)
+{
+    LUT1DContext *lut1d = ctx->priv;
+    char line[MAX_LINE_SIZE];
+    float in_min[3]  = {0.0, 0.0, 0.0};
+    float in_max[3]  = {1.0, 1.0, 1.0};
+    float out_min[3] = {0.0, 0.0, 0.0};
+    float out_max[3] = {1.0, 1.0, 1.0};
+    int inside_metadata = 0, size;
+
+    NEXT_LINE(skip_line(line));
+    if (strncmp(line, "CSPLUTV100", 10)) {
+        av_log(ctx, AV_LOG_ERROR, "Not cineSpace LUT format\n");
+        return AVERROR(EINVAL);
+    }
+
+    NEXT_LINE(skip_line(line));
+    if (strncmp(line, "1D", 2)) {
+        av_log(ctx, AV_LOG_ERROR, "Not 1D LUT format\n");
+        return AVERROR(EINVAL);
+    }
+
+    while (1) {
+        NEXT_LINE(skip_line(line));
+
+        if (!strncmp(line, "BEGIN METADATA", 14)) {
+            inside_metadata = 1;
+            continue;
+        }
+        if (!strncmp(line, "END METADATA", 12)) {
+            inside_metadata = 0;
+            continue;
+        }
+        if (inside_metadata == 0) {
+            for (int i = 0; i < 3; i++) {
+                int npoints = strtol(line, NULL, 0);
+
+                if (npoints != 2) {
+                    av_log(ctx, AV_LOG_ERROR, "Unsupported number of pre-lut points.\n");
+                    return AVERROR_PATCHWELCOME;
+                }
+
+                NEXT_LINE(skip_line(line));
+                if (av_sscanf(line, "%f %f", &in_min[i], &in_max[i]) != 2)
+                    return AVERROR_INVALIDDATA;
+                NEXT_LINE(skip_line(line));
+                if (av_sscanf(line, "%f %f", &out_min[i], &out_max[i]) != 2)
+                    return AVERROR_INVALIDDATA;
+                NEXT_LINE(skip_line(line));
+            }
+
+            size = strtol(line, NULL, 0);
+
+            if (size < 2 || size > MAX_1D_LEVEL) {
+                av_log(ctx, AV_LOG_ERROR, "Too large or invalid 1D LUT size\n");
+                return AVERROR(EINVAL);
+            }
+
+            lut1d->lutsize = size;
+
+            for (int i = 0; i < size; i++) {
+                NEXT_LINE(skip_line(line));
+                if (av_sscanf(line, "%f %f %f", &lut1d->lut[0][i], &lut1d->lut[1][i], &lut1d->lut[2][i]) != 3)
+                    return AVERROR_INVALIDDATA;
+                lut1d->lut[0][i] *= out_max[0] - out_min[0];
+                lut1d->lut[1][i] *= out_max[1] - out_min[1];
+                lut1d->lut[2][i] *= out_max[2] - out_min[2];
+            }
+
+            break;
+        }
+    }
+
+    lut1d->scale.r = av_clipf(1. / (in_max[0] - in_min[0]), 0.f, 1.f);
+    lut1d->scale.g = av_clipf(1. / (in_max[1] - in_min[1]), 0.f, 1.f);
+    lut1d->scale.b = av_clipf(1. / (in_max[2] - in_min[2]), 0.f, 1.f);
+
+    return 0;
+}
+
 static int parse_cube_1d(AVFilterContext *ctx, FILE *f)
 {
     LUT1DContext *lut1d = ctx->priv;
@@ -1023,7 +1245,7 @@
     float max[3] = {1.0, 1.0, 1.0};
 
     while (fgets(line, sizeof(line), f)) {
-        if (!strncmp(line, "LUT_1D_SIZE ", 12)) {
+        if (!strncmp(line, "LUT_1D_SIZE", 11)) {
             const int size = strtol(line + 12, NULL, 0);
             int i;
 
@@ -1042,26 +1264,30 @@
                         else if (!strncmp(line + 7, "MAX ", 4)) vals = max;
                         if (!vals)
                             return AVERROR_INVALIDDATA;
-                        sscanf(line + 11, "%f %f %f", vals, vals + 1, vals + 2);
+                        av_sscanf(line + 11, "%f %f %f", vals, vals + 1, vals + 2);
                         av_log(ctx, AV_LOG_DEBUG, "min: %f %f %f | max: %f %f %f\n",
                                min[0], min[1], min[2], max[0], max[1], max[2]);
                         goto try_again;
                     } else if (!strncmp(line, "LUT_1D_INPUT_RANGE ", 19)) {
-                        sscanf(line + 19, "%f %f", min, max);
+                        av_sscanf(line + 19, "%f %f", min, max);
                         min[1] = min[2] = min[0];
                         max[1] = max[2] = max[0];
                         goto try_again;
+                    } else if (!strncmp(line, "TITLE", 5)) {
+                        goto try_again;
                     }
                 } while (skip_line(line));
-                if (sscanf(line, "%f %f %f", &lut1d->lut[0][i], &lut1d->lut[1][i], &lut1d->lut[2][i]) != 3)
+                if (av_sscanf(line, "%f %f %f", &lut1d->lut[0][i], &lut1d->lut[1][i], &lut1d->lut[2][i]) != 3)
                     return AVERROR_INVALIDDATA;
-                lut1d->lut[0][i] *= max[0] - min[0];
-                lut1d->lut[1][i] *= max[1] - min[1];
-                lut1d->lut[2][i] *= max[2] - min[2];
             }
             break;
         }
     }
+
+    lut1d->scale.r = av_clipf(1. / (max[0] - min[0]), 0.f, 1.f);
+    lut1d->scale.g = av_clipf(1. / (max[1] - min[1]), 0.f, 1.f);
+    lut1d->scale.b = av_clipf(1. / (max[2] - min[2]), 0.f, 1.f);
+
     return 0;
 }
 
@@ -1070,7 +1296,9 @@
     { "interp", "select interpolation mode", OFFSET(interpolation),    AV_OPT_TYPE_INT, {.i64=INTERPOLATE_1D_LINEAR}, 0, NB_INTERP_1D_MODE-1, FLAGS, "interp_mode" },
         { "nearest", "use values from the nearest defined points", 0, AV_OPT_TYPE_CONST, {.i64=INTERPOLATE_1D_NEAREST},   INT_MIN, INT_MAX, FLAGS, "interp_mode" },
         { "linear",  "use values from the linear interpolation",   0, AV_OPT_TYPE_CONST, {.i64=INTERPOLATE_1D_LINEAR},    INT_MIN, INT_MAX, FLAGS, "interp_mode" },
+        { "cosine",  "use values from the cosine interpolation",   0, AV_OPT_TYPE_CONST, {.i64=INTERPOLATE_1D_COSINE},    INT_MIN, INT_MAX, FLAGS, "interp_mode" },
         { "cubic",   "use values from the cubic interpolation",    0, AV_OPT_TYPE_CONST, {.i64=INTERPOLATE_1D_CUBIC},     INT_MIN, INT_MAX, FLAGS, "interp_mode" },
+        { "spline",  "use values from the spline interpolation",   0, AV_OPT_TYPE_CONST, {.i64=INTERPOLATE_1D_SPLINE},    INT_MIN, INT_MAX, FLAGS, "interp_mode" },
     { NULL }
 };
 
@@ -1096,6 +1324,19 @@
     return lerpf(p, n, d);
 }
 
+static inline float interp_1d_cosine(const LUT1DContext *lut1d,
+                                     int idx, const float s)
+{
+    const int prev = PREV(s);
+    const int next = NEXT1D(s);
+    const float d = s - prev;
+    const float p = lut1d->lut[idx][prev];
+    const float n = lut1d->lut[idx][next];
+    const float m = (1.f - cosf(d * M_PI)) * .5f;
+
+    return lerpf(p, n, m);
+}
+
 static inline float interp_1d_cubic(const LUT1DContext *lut1d,
                                     int idx, const float s)
 {
@@ -1119,6 +1360,27 @@
     return a0 * mu * mu2 + a1 * mu2 + a2 * mu + a3;
 }
 
+static inline float interp_1d_spline(const LUT1DContext *lut1d,
+                                     int idx, const float s)
+{
+    const int prev = PREV(s);
+    const int next = NEXT1D(s);
+    const float x = s - prev;
+    float c0, c1, c2, c3;
+
+    float y0 = lut1d->lut[idx][FFMAX(prev - 1, 0)];
+    float y1 = lut1d->lut[idx][prev];
+    float y2 = lut1d->lut[idx][next];
+    float y3 = lut1d->lut[idx][FFMIN(next + 1, lut1d->lutsize - 1)];
+
+    c0 = y1;
+    c1 = .5f * (y2 - y0);
+    c2 = y0 - 2.5f * y1 + 2.f * y2 - .5f * y3;
+    c3 = .5f * (y3 - y0) + 1.5f * (y1 - y2);
+
+    return ((c3 * x + c2) * x + c1) * x + c0;
+}
+
 #define DEFINE_INTERP_FUNC_PLANAR_1D(name, nbits, depth)                     \
 static int interp_1d_##nbits##_##name##_p##depth(AVFilterContext *ctx,       \
                                                  void *arg, int jobnr,       \
@@ -1141,7 +1403,9 @@
     const uint8_t *srcrrow = in->data[2] + slice_start * in->linesize[2];    \
     const uint8_t *srcarow = in->data[3] + slice_start * in->linesize[3];    \
     const float factor = (1 << depth) - 1;                                   \
-    const float scale = (1. / factor) * (lut1d->lutsize - 1);                \
+    const float scale_r = (lut1d->scale.r / factor) * (lut1d->lutsize - 1);  \
+    const float scale_g = (lut1d->scale.g / factor) * (lut1d->lutsize - 1);  \
+    const float scale_b = (lut1d->scale.b / factor) * (lut1d->lutsize - 1);  \
                                                                              \
     for (y = slice_start; y < slice_end; y++) {                              \
         uint##nbits##_t *dstg = (uint##nbits##_t *)grow;                     \
@@ -1153,9 +1417,9 @@
         const uint##nbits##_t *srcr = (const uint##nbits##_t *)srcrrow;      \
         const uint##nbits##_t *srca = (const uint##nbits##_t *)srcarow;      \
         for (x = 0; x < in->width; x++) {                                    \
-            float r = srcr[x] * scale;                                       \
-            float g = srcg[x] * scale;                                       \
-            float b = srcb[x] * scale;                                       \
+            float r = srcr[x] * scale_r;                                     \
+            float g = srcg[x] * scale_g;                                     \
+            float b = srcb[x] * scale_b;                                     \
             r = interp_1d_##name(lut1d, 0, r);                               \
             g = interp_1d_##name(lut1d, 1, g);                               \
             b = interp_1d_##name(lut1d, 2, b);                               \
@@ -1179,27 +1443,39 @@
 
 DEFINE_INTERP_FUNC_PLANAR_1D(nearest,     8, 8)
 DEFINE_INTERP_FUNC_PLANAR_1D(linear,      8, 8)
+DEFINE_INTERP_FUNC_PLANAR_1D(cosine,      8, 8)
 DEFINE_INTERP_FUNC_PLANAR_1D(cubic,       8, 8)
+DEFINE_INTERP_FUNC_PLANAR_1D(spline,      8, 8)
 
 DEFINE_INTERP_FUNC_PLANAR_1D(nearest,     16, 9)
 DEFINE_INTERP_FUNC_PLANAR_1D(linear,      16, 9)
+DEFINE_INTERP_FUNC_PLANAR_1D(cosine,      16, 9)
 DEFINE_INTERP_FUNC_PLANAR_1D(cubic,       16, 9)
+DEFINE_INTERP_FUNC_PLANAR_1D(spline,      16, 9)
 
 DEFINE_INTERP_FUNC_PLANAR_1D(nearest,     16, 10)
 DEFINE_INTERP_FUNC_PLANAR_1D(linear,      16, 10)
+DEFINE_INTERP_FUNC_PLANAR_1D(cosine,      16, 10)
 DEFINE_INTERP_FUNC_PLANAR_1D(cubic,       16, 10)
+DEFINE_INTERP_FUNC_PLANAR_1D(spline,      16, 10)
 
 DEFINE_INTERP_FUNC_PLANAR_1D(nearest,     16, 12)
 DEFINE_INTERP_FUNC_PLANAR_1D(linear,      16, 12)
+DEFINE_INTERP_FUNC_PLANAR_1D(cosine,      16, 12)
 DEFINE_INTERP_FUNC_PLANAR_1D(cubic,       16, 12)
+DEFINE_INTERP_FUNC_PLANAR_1D(spline,      16, 12)
 
 DEFINE_INTERP_FUNC_PLANAR_1D(nearest,     16, 14)
 DEFINE_INTERP_FUNC_PLANAR_1D(linear,      16, 14)
+DEFINE_INTERP_FUNC_PLANAR_1D(cosine,      16, 14)
 DEFINE_INTERP_FUNC_PLANAR_1D(cubic,       16, 14)
+DEFINE_INTERP_FUNC_PLANAR_1D(spline,      16, 14)
 
 DEFINE_INTERP_FUNC_PLANAR_1D(nearest,     16, 16)
 DEFINE_INTERP_FUNC_PLANAR_1D(linear,      16, 16)
+DEFINE_INTERP_FUNC_PLANAR_1D(cosine,      16, 16)
 DEFINE_INTERP_FUNC_PLANAR_1D(cubic,       16, 16)
+DEFINE_INTERP_FUNC_PLANAR_1D(spline,      16, 16)
 
 #define DEFINE_INTERP_FUNC_1D(name, nbits)                                   \
 static int interp_1d_##nbits##_##name(AVFilterContext *ctx, void *arg,       \
@@ -1221,15 +1497,17 @@
     uint8_t       *dstrow = out->data[0] + slice_start * out->linesize[0];   \
     const uint8_t *srcrow = in ->data[0] + slice_start * in ->linesize[0];   \
     const float factor = (1 << nbits) - 1;                                   \
-    const float scale = (1. / factor) * (lut1d->lutsize - 1);                \
+    const float scale_r = (lut1d->scale.r / factor) * (lut1d->lutsize - 1);  \
+    const float scale_g = (lut1d->scale.g / factor) * (lut1d->lutsize - 1);  \
+    const float scale_b = (lut1d->scale.b / factor) * (lut1d->lutsize - 1);  \
                                                                              \
     for (y = slice_start; y < slice_end; y++) {                              \
         uint##nbits##_t *dst = (uint##nbits##_t *)dstrow;                    \
         const uint##nbits##_t *src = (const uint##nbits##_t *)srcrow;        \
         for (x = 0; x < in->width * step; x += step) {                       \
-            float rr = src[x + r] * scale;                                   \
-            float gg = src[x + g] * scale;                                   \
-            float bb = src[x + b] * scale;                                   \
+            float rr = src[x + r] * scale_r;                                 \
+            float gg = src[x + g] * scale_g;                                 \
+            float bb = src[x + b] * scale_b;                                 \
             rr = interp_1d_##name(lut1d, 0, rr);                             \
             gg = interp_1d_##name(lut1d, 1, gg);                             \
             bb = interp_1d_##name(lut1d, 2, bb);                             \
@@ -1247,42 +1525,25 @@
 
 DEFINE_INTERP_FUNC_1D(nearest,     8)
 DEFINE_INTERP_FUNC_1D(linear,      8)
+DEFINE_INTERP_FUNC_1D(cosine,      8)
 DEFINE_INTERP_FUNC_1D(cubic,       8)
+DEFINE_INTERP_FUNC_1D(spline,      8)
 
 DEFINE_INTERP_FUNC_1D(nearest,     16)
 DEFINE_INTERP_FUNC_1D(linear,      16)
+DEFINE_INTERP_FUNC_1D(cosine,      16)
 DEFINE_INTERP_FUNC_1D(cubic,       16)
+DEFINE_INTERP_FUNC_1D(spline,      16)
 
 static int config_input_1d(AVFilterLink *inlink)
 {
-    int depth, is16bit = 0, planar = 0;
+    int depth, is16bit, planar;
     LUT1DContext *lut1d = inlink->dst->priv;
     const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(inlink->format);
 
     depth = desc->comp[0].depth;
-
-    switch (inlink->format) {
-    case AV_PIX_FMT_RGB48:
-    case AV_PIX_FMT_BGR48:
-    case AV_PIX_FMT_RGBA64:
-    case AV_PIX_FMT_BGRA64:
-        is16bit = 1;
-        break;
-    case AV_PIX_FMT_GBRP9:
-    case AV_PIX_FMT_GBRP10:
-    case AV_PIX_FMT_GBRP12:
-    case AV_PIX_FMT_GBRP14:
-    case AV_PIX_FMT_GBRP16:
-    case AV_PIX_FMT_GBRAP10:
-    case AV_PIX_FMT_GBRAP12:
-    case AV_PIX_FMT_GBRAP16:
-        is16bit = 1;
-    case AV_PIX_FMT_GBRP:
-    case AV_PIX_FMT_GBRAP:
-        planar = 1;
-        break;
-    }
-
+    is16bit = desc->comp[0].depth > 8;
+    planar = desc->flags & AV_PIX_FMT_FLAG_PLANAR;
     ff_fill_rgba_map(lut1d->rgba_map, inlink->format);
     lut1d->step = av_get_padded_bits_per_pixel(desc) >> (3 + is16bit);
 
@@ -1303,7 +1564,9 @@
     switch (lut1d->interpolation) {
     case INTERPOLATE_1D_NEAREST:     SET_FUNC_1D(nearest);  break;
     case INTERPOLATE_1D_LINEAR:      SET_FUNC_1D(linear);   break;
+    case INTERPOLATE_1D_COSINE:      SET_FUNC_1D(cosine);   break;
     case INTERPOLATE_1D_CUBIC:       SET_FUNC_1D(cubic);    break;
+    case INTERPOLATE_1D_SPLINE:      SET_FUNC_1D(spline);   break;
     default:
         av_assert0(0);
     }
@@ -1318,12 +1581,14 @@
     const char *ext;
     LUT1DContext *lut1d = ctx->priv;
 
+    lut1d->scale.r = lut1d->scale.g = lut1d->scale.b = 1.f;
+
     if (!lut1d->file) {
         set_identity_matrix_1d(lut1d, 32);
         return 0;
     }
 
-    f = fopen(lut1d->file, "r");
+    f = av_fopen_utf8(lut1d->file, "r");
     if (!f) {
         ret = AVERROR(errno);
         av_log(ctx, AV_LOG_ERROR, "%s: %s\n", lut1d->file, av_err2str(ret));
@@ -1340,6 +1605,8 @@
 
     if (!av_strcasecmp(ext, "cube") || !av_strcasecmp(ext, "1dlut")) {
         ret = parse_cube_1d(ctx, f);
+    } else if (!av_strcasecmp(ext, "csp")) {
+        ret = parse_cinespace_1d(ctx, f);
     } else {
         av_log(ctx, AV_LOG_ERROR, "Unrecognized '.%s' file type\n", ext);
         ret = AVERROR(EINVAL);
diff --git a/libavfilter/vf_maskedclamp.c b/libavfilter/vf_maskedclamp.c
index 8a06737..52392c4 100644
--- a/libavfilter/vf_maskedclamp.c
+++ b/libavfilter/vf_maskedclamp.c
@@ -26,6 +26,7 @@
 #include "internal.h"
 #include "video.h"
 #include "framesync.h"
+#include "maskedclamp.h"
 
 #define OFFSET(x) offsetof(MaskedClampContext, x)
 #define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM
@@ -47,7 +48,7 @@
     int depth;
     FFFrameSync fs;
 
-    int (*maskedclamp)(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs);
+    MaskedClampDSPContext dsp;
 } MaskedClampContext;
 
 static const AVOption maskedclamp_options[] = {
@@ -74,6 +75,7 @@
         AV_PIX_FMT_YUV420P16, AV_PIX_FMT_YUV422P16, AV_PIX_FMT_YUV444P16,
         AV_PIX_FMT_YUVA420P9, AV_PIX_FMT_YUVA422P9, AV_PIX_FMT_YUVA444P9,
         AV_PIX_FMT_YUVA420P10, AV_PIX_FMT_YUVA422P10, AV_PIX_FMT_YUVA444P10,
+        AV_PIX_FMT_YUVA422P12, AV_PIX_FMT_YUVA444P12,
         AV_PIX_FMT_YUVA420P16, AV_PIX_FMT_YUVA422P16, AV_PIX_FMT_YUVA444P16,
         AV_PIX_FMT_GBRP, AV_PIX_FMT_GBRP9, AV_PIX_FMT_GBRP10,
         AV_PIX_FMT_GBRP12, AV_PIX_FMT_GBRP14, AV_PIX_FMT_GBRP16,
@@ -85,6 +87,48 @@
     return ff_set_common_formats(ctx, ff_make_format_list(pix_fmts));
 }
 
+static int maskedclamp_slice(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
+{
+    MaskedClampContext *s = ctx->priv;
+    ThreadData *td = arg;
+    int p;
+
+    for (p = 0; p < s->nb_planes; p++) {
+        const ptrdiff_t blinesize = td->b->linesize[p];
+        const ptrdiff_t brightlinesize = td->m->linesize[p];
+        const ptrdiff_t darklinesize = td->o->linesize[p];
+        const ptrdiff_t dlinesize = td->d->linesize[p];
+        const int w = s->width[p];
+        const int h = s->height[p];
+        const int slice_start = (h * jobnr) / nb_jobs;
+        const int slice_end = (h * (jobnr+1)) / nb_jobs;
+        const uint8_t *bsrc = td->b->data[p] + slice_start * blinesize;
+        const uint8_t *darksrc = td->o->data[p] + slice_start * darklinesize;
+        const uint8_t *brightsrc = td->m->data[p] + slice_start * brightlinesize;
+        uint8_t *dst = td->d->data[p] + slice_start * dlinesize;
+        const int undershoot = s->undershoot;
+        const int overshoot = s->overshoot;
+        int y;
+
+        if (!((1 << p) & s->planes)) {
+            av_image_copy_plane(dst, dlinesize, bsrc, blinesize,
+                                s->linesize[p], slice_end - slice_start);
+            continue;
+        }
+
+        for (y = slice_start; y < slice_end; y++) {
+            s->dsp.maskedclamp(bsrc, dst, darksrc, brightsrc, w, undershoot, overshoot);
+
+            dst  += dlinesize;
+            bsrc += blinesize;
+            darksrc += darklinesize;
+            brightsrc += brightlinesize;
+        }
+    }
+
+    return 0;
+}
+
 static int process_frame(FFFrameSync *fs)
 {
     AVFilterContext *ctx = fs->parent;
@@ -115,111 +159,32 @@
         td.m = bright;
         td.d = out;
 
-        ctx->internal->execute(ctx, s->maskedclamp, &td, NULL, FFMIN(s->height[0],
-                                                                     ff_filter_get_nb_threads(ctx)));
+        ctx->internal->execute(ctx, maskedclamp_slice, &td, NULL, FFMIN(s->height[0],
+                                                                        ff_filter_get_nb_threads(ctx)));
     }
     out->pts = av_rescale_q(s->fs.pts, s->fs.time_base, outlink->time_base);
 
     return ff_filter_frame(outlink, out);
 }
 
-static int maskedclamp8(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
-{
-    MaskedClampContext *s = ctx->priv;
-    ThreadData *td = arg;
-    int p;
-
-    for (p = 0; p < s->nb_planes; p++) {
-        const ptrdiff_t blinesize = td->b->linesize[p];
-        const ptrdiff_t brightlinesize = td->m->linesize[p];
-        const ptrdiff_t darklinesize = td->o->linesize[p];
-        const ptrdiff_t dlinesize = td->d->linesize[p];
-        const int w = s->width[p];
-        const int h = s->height[p];
-        const int slice_start = (h * jobnr) / nb_jobs;
-        const int slice_end = (h * (jobnr+1)) / nb_jobs;
-        const uint8_t *bsrc = td->b->data[p] + slice_start * blinesize;
-        const uint8_t *darksrc = td->o->data[p] + slice_start * darklinesize;
-        const uint8_t *brightsrc = td->m->data[p] + slice_start * brightlinesize;
-        uint8_t *dst = td->d->data[p] + slice_start * dlinesize;
-        const int undershoot = s->undershoot;
-        const int overshoot = s->overshoot;
-        int x, y;
-
-        if (!((1 << p) & s->planes)) {
-            av_image_copy_plane(dst, dlinesize, bsrc, blinesize,
-                                s->linesize[p], slice_end - slice_start);
-            continue;
-        }
-
-        for (y = slice_start; y < slice_end; y++) {
-            for (x = 0; x < w; x++) {
-                if (bsrc[x] < darksrc[x] - undershoot)
-                    dst[x] = darksrc[x] - undershoot;
-                else if (bsrc[x] > brightsrc[x] + overshoot)
-                    dst[x] = brightsrc[x] + overshoot;
-                else
-                    dst[x] = bsrc[x];
-            }
-
-            dst  += dlinesize;
-            bsrc += blinesize;
-            darksrc += darklinesize;
-            brightsrc += brightlinesize;
-        }
-    }
-
-    return 0;
+#define MASKEDCLAMP(type, name)                                                   \
+static void maskedclamp##name(const uint8_t *bbsrc, uint8_t *ddst,                \
+                              const uint8_t *ddarksrc, const uint8_t *bbrightsrc, \
+                              int w, int undershoot, int overshoot)               \
+{                                                                                 \
+    const type *bsrc = (const type *)bbsrc;                                       \
+    const type *darksrc = (const type *)ddarksrc;                                 \
+    const type *brightsrc = (const type *)bbrightsrc;                             \
+    type *dst = (type *)ddst;                                                     \
+                                                                                  \
+    for (int x = 0; x < w; x++) {                                                 \
+        dst[x] = FFMAX(bsrc[x], darksrc[x] - undershoot);                         \
+        dst[x] = FFMIN(dst[x], brightsrc[x] + overshoot);                         \
+    }                                                                             \
 }
 
-static int maskedclamp16(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
-{
-    MaskedClampContext *s = ctx->priv;
-    ThreadData *td = arg;
-    int p;
-
-    for (p = 0; p < s->nb_planes; p++) {
-        const ptrdiff_t blinesize = td->b->linesize[p] / 2;
-        const ptrdiff_t brightlinesize = td->m->linesize[p] / 2;
-        const ptrdiff_t darklinesize = td->o->linesize[p] / 2;
-        const ptrdiff_t dlinesize = td->d->linesize[p] / 2;
-        const int w = s->width[p];
-        const int h = s->height[p];
-        const int slice_start = (h * jobnr) / nb_jobs;
-        const int slice_end = (h * (jobnr+1)) / nb_jobs;
-        const uint16_t *bsrc = (const uint16_t *)td->b->data[p] + slice_start * blinesize;
-        const uint16_t *darksrc = (const uint16_t *)td->o->data[p] + slice_start * darklinesize;
-        const uint16_t *brightsrc = (const uint16_t *)td->m->data[p] + slice_start * brightlinesize;
-        uint16_t *dst = (uint16_t *)td->d->data[p] + slice_start * dlinesize;
-        const int undershoot = s->undershoot;
-        const int overshoot = s->overshoot;
-        int x, y;
-
-        if (!((1 << p) & s->planes)) {
-            av_image_copy_plane((uint8_t *)dst, dlinesize, (const uint8_t *)bsrc, blinesize,
-                                s->linesize[p], slice_end - slice_start);
-            continue;
-        }
-
-        for (y = slice_start; y < slice_end; y++) {
-            for (x = 0; x < w; x++) {
-                if (bsrc[x] < darksrc[x] - undershoot)
-                    dst[x] = darksrc[x] - undershoot;
-                else if (bsrc[x] > brightsrc[x] + overshoot)
-                    dst[x] = brightsrc[x] + overshoot;
-                else
-                    dst[x] = bsrc[x];
-            }
-
-            dst  += dlinesize;
-            bsrc += blinesize;
-            darksrc += darklinesize;
-            brightsrc += brightlinesize;
-        }
-    }
-
-    return 0;
-}
+MASKEDCLAMP(uint8_t, 8)
+MASKEDCLAMP(uint16_t, 16)
 
 static int config_input(AVFilterLink *inlink)
 {
@@ -241,11 +206,16 @@
     s->width[0]  = s->width[3]  = inlink->w;
 
     s->depth = desc->comp[0].depth;
+    s->undershoot = FFMIN(s->undershoot, (1 << s->depth) - 1);
+    s->overshoot = FFMIN(s->overshoot, (1 << s->depth) - 1);
 
-    if (desc->comp[0].depth == 8)
-        s->maskedclamp = maskedclamp8;
+    if (s->depth <= 8)
+        s->dsp.maskedclamp = maskedclamp8;
     else
-        s->maskedclamp = maskedclamp16;
+        s->dsp.maskedclamp = maskedclamp16;
+
+    if (ARCH_X86)
+        ff_maskedclamp_init_x86(&s->dsp, s->depth);
 
     return 0;
 }
@@ -279,7 +249,6 @@
 
     outlink->w = base->w;
     outlink->h = base->h;
-    outlink->time_base = base->time_base;
     outlink->sample_aspect_ratio = base->sample_aspect_ratio;
     outlink->frame_rate = base->frame_rate;
 
@@ -302,7 +271,10 @@
     s->fs.opaque   = s;
     s->fs.on_event = process_frame;
 
-    return ff_framesync_configure(&s->fs);
+    ret = ff_framesync_configure(&s->fs);
+    outlink->time_base = s->fs.time_base;
+
+    return ret;
 }
 
 static int activate(AVFilterContext *ctx)
diff --git a/libavfilter/vf_maskedmerge.c b/libavfilter/vf_maskedmerge.c
index 1a02503..82f55e6 100644
--- a/libavfilter/vf_maskedmerge.c
+++ b/libavfilter/vf_maskedmerge.c
@@ -52,6 +52,7 @@
         AV_PIX_FMT_YUV420P16, AV_PIX_FMT_YUV422P16, AV_PIX_FMT_YUV444P16,
         AV_PIX_FMT_YUVA420P9, AV_PIX_FMT_YUVA422P9, AV_PIX_FMT_YUVA444P9,
         AV_PIX_FMT_YUVA420P10, AV_PIX_FMT_YUVA422P10, AV_PIX_FMT_YUVA444P10,
+        AV_PIX_FMT_YUVA422P12, AV_PIX_FMT_YUVA444P12,
         AV_PIX_FMT_YUVA420P16, AV_PIX_FMT_YUVA422P16, AV_PIX_FMT_YUVA444P16,
         AV_PIX_FMT_GBRP, AV_PIX_FMT_GBRP9, AV_PIX_FMT_GBRP10,
         AV_PIX_FMT_GBRP12, AV_PIX_FMT_GBRP14, AV_PIX_FMT_GBRP16,
@@ -136,7 +137,7 @@
         ctx->internal->execute(ctx, filter_slice, &td, NULL,
                                FFMIN(s->height[2], ff_filter_get_nb_threads(ctx)));
     }
-    out->pts = av_rescale_q(base->pts, s->fs.time_base, outlink->time_base);
+    out->pts = av_rescale_q(s->fs.pts, s->fs.time_base, outlink->time_base);
 
     return ff_filter_frame(outlink, out);
 }
@@ -246,7 +247,6 @@
 
     outlink->w = base->w;
     outlink->h = base->h;
-    outlink->time_base = base->time_base;
     outlink->sample_aspect_ratio = base->sample_aspect_ratio;
     outlink->frame_rate = base->frame_rate;
 
@@ -272,7 +272,10 @@
     s->fs.opaque   = s;
     s->fs.on_event = process_frame;
 
-    return ff_framesync_configure(&s->fs);
+    ret = ff_framesync_configure(&s->fs);
+    outlink->time_base = s->fs.time_base;
+
+    return ret;
 }
 
 static int activate(AVFilterContext *ctx)
diff --git a/libavfilter/vf_maskedminmax.c b/libavfilter/vf_maskedminmax.c
new file mode 100644
index 0000000..0685c8a
--- /dev/null
+++ b/libavfilter/vf_maskedminmax.c
@@ -0,0 +1,360 @@
+/*
+ * Copyright (c) 2019 Paul B Mahol
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "libavutil/imgutils.h"
+#include "libavutil/pixdesc.h"
+#include "libavutil/opt.h"
+#include "avfilter.h"
+#include "formats.h"
+#include "internal.h"
+#include "video.h"
+#include "framesync.h"
+
+#define OFFSET(x) offsetof(MaskedMinMaxContext, x)
+#define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM
+
+typedef struct ThreadData {
+    AVFrame *src, *f1, *f2, *dst;
+} ThreadData;
+
+typedef struct MaskedMinMaxContext {
+    const AVClass *class;
+
+    int planes;
+    int maskedmin;
+
+    int linesize[4];
+    int planewidth[4], planeheight[4];
+    int nb_planes;
+    int depth;
+    FFFrameSync fs;
+
+    void (*maskedminmax)(const uint8_t *src, uint8_t *dst, const uint8_t *f1, const uint8_t *f2, int w);
+} MaskedMinMaxContext;
+
+static const AVOption maskedminmax_options[] = {
+    { "planes",     "set planes",     OFFSET(planes),     AV_OPT_TYPE_INT, {.i64=0xF}, 0, 0xF,        FLAGS },
+    { NULL }
+};
+
+static av_cold int init(AVFilterContext *ctx)
+{
+    MaskedMinMaxContext *s = ctx->priv;
+
+    s->maskedmin = !strcmp(ctx->filter->name, "maskedmin");
+
+    return 0;
+}
+
+static int query_formats(AVFilterContext *ctx)
+{
+    static const enum AVPixelFormat pix_fmts[] = {
+        AV_PIX_FMT_YUVA444P, AV_PIX_FMT_YUV444P, AV_PIX_FMT_YUV440P,
+        AV_PIX_FMT_YUVJ444P, AV_PIX_FMT_YUVJ440P,
+        AV_PIX_FMT_YUVA422P, AV_PIX_FMT_YUV422P, AV_PIX_FMT_YUVA420P, AV_PIX_FMT_YUV420P,
+        AV_PIX_FMT_YUVJ422P, AV_PIX_FMT_YUVJ420P,
+        AV_PIX_FMT_YUVJ411P, AV_PIX_FMT_YUV411P, AV_PIX_FMT_YUV410P,
+        AV_PIX_FMT_YUV420P9, AV_PIX_FMT_YUV422P9, AV_PIX_FMT_YUV444P9,
+        AV_PIX_FMT_YUV420P10, AV_PIX_FMT_YUV422P10, AV_PIX_FMT_YUV444P10,
+        AV_PIX_FMT_YUV420P12, AV_PIX_FMT_YUV422P12, AV_PIX_FMT_YUV444P12, AV_PIX_FMT_YUV440P12,
+        AV_PIX_FMT_YUV420P14, AV_PIX_FMT_YUV422P14, AV_PIX_FMT_YUV444P14,
+        AV_PIX_FMT_YUV420P16, AV_PIX_FMT_YUV422P16, AV_PIX_FMT_YUV444P16,
+        AV_PIX_FMT_YUVA420P9, AV_PIX_FMT_YUVA422P9, AV_PIX_FMT_YUVA444P9,
+        AV_PIX_FMT_YUVA420P10, AV_PIX_FMT_YUVA422P10, AV_PIX_FMT_YUVA444P10,
+        AV_PIX_FMT_YUVA422P12, AV_PIX_FMT_YUVA444P12,
+        AV_PIX_FMT_YUVA420P16, AV_PIX_FMT_YUVA422P16, AV_PIX_FMT_YUVA444P16,
+        AV_PIX_FMT_GBRP, AV_PIX_FMT_GBRP9, AV_PIX_FMT_GBRP10,
+        AV_PIX_FMT_GBRP12, AV_PIX_FMT_GBRP14, AV_PIX_FMT_GBRP16,
+        AV_PIX_FMT_GBRAP, AV_PIX_FMT_GBRAP10, AV_PIX_FMT_GBRAP12, AV_PIX_FMT_GBRAP16,
+        AV_PIX_FMT_GRAY8, AV_PIX_FMT_GRAY9, AV_PIX_FMT_GRAY10, AV_PIX_FMT_GRAY12, AV_PIX_FMT_GRAY14, AV_PIX_FMT_GRAY16,
+        AV_PIX_FMT_NONE
+    };
+
+    return ff_set_common_formats(ctx, ff_make_format_list(pix_fmts));
+}
+
+static void maskedmin8(const uint8_t *src, uint8_t *dst, const uint8_t *f1, const uint8_t *f2, int w)
+{
+    for (int x = 0; x < w; x++)
+        dst[x] = FFABS(src[x] - f2[x]) < FFABS(src[x] - f1[x]) ? f2[x] : f1[x];
+}
+
+static void maskedmax8(const uint8_t *src, uint8_t *dst, const uint8_t *f1, const uint8_t *f2, int w)
+{
+    for (int x = 0; x < w; x++)
+        dst[x] = FFABS(src[x] - f2[x]) > FFABS(src[x] - f1[x]) ? f2[x] : f1[x];
+}
+
+static void maskedmin16(const uint8_t *ssrc, uint8_t *ddst, const uint8_t *ff1, const uint8_t *ff2, int w)
+{
+    const uint16_t *src = (const uint16_t *)ssrc;
+    const uint16_t *f1 = (const uint16_t *)ff1;
+    const uint16_t *f2 = (const uint16_t *)ff2;
+    uint16_t *dst = (uint16_t *)ddst;
+
+    for (int x = 0; x < w; x++)
+        dst[x] = FFABS(src[x] - f2[x]) < FFABS(src[x] - f1[x]) ? f2[x] : f1[x];
+}
+
+static void maskedmax16(const uint8_t *ssrc, uint8_t *ddst, const uint8_t *ff1, const uint8_t *ff2, int w)
+{
+    const uint16_t *src = (const uint16_t *)ssrc;
+    const uint16_t *f1 = (const uint16_t *)ff1;
+    const uint16_t *f2 = (const uint16_t *)ff2;
+    uint16_t *dst = (uint16_t *)ddst;
+
+    for (int x = 0; x < w; x++)
+        dst[x] = FFABS(src[x] - f2[x]) > FFABS(src[x] - f1[x]) ? f2[x] : f1[x];
+}
+
+static int config_input(AVFilterLink *inlink)
+{
+    AVFilterContext *ctx = inlink->dst;
+    MaskedMinMaxContext *s = ctx->priv;
+    const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(inlink->format);
+    int vsub, hsub, ret;
+
+    s->nb_planes = av_pix_fmt_count_planes(inlink->format);
+
+    if ((ret = av_image_fill_linesizes(s->linesize, inlink->format, inlink->w)) < 0)
+        return ret;
+
+    hsub = desc->log2_chroma_w;
+    vsub = desc->log2_chroma_h;
+    s->planeheight[1] = s->planeheight[2] = AV_CEIL_RSHIFT(inlink->h, vsub);
+    s->planeheight[0] = s->planeheight[3] = inlink->h;
+    s->planewidth[1]  = s->planewidth[2]  = AV_CEIL_RSHIFT(inlink->w, hsub);
+    s->planewidth[0]  = s->planewidth[3]  = inlink->w;
+
+    s->depth = desc->comp[0].depth;
+
+    if (desc->comp[0].depth == 8)
+        s->maskedminmax = s->maskedmin ? maskedmin8  : maskedmax8;
+    else
+        s->maskedminmax = s->maskedmin ? maskedmin16 : maskedmax16;
+
+    return 0;
+}
+
+static int maskedminmax_slice(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
+{
+    MaskedMinMaxContext *s = ctx->priv;
+    ThreadData *td = arg;
+
+    for (int p = 0; p < s->nb_planes; p++) {
+        const ptrdiff_t src_linesize = td->src->linesize[p];
+        const ptrdiff_t f1_linesize = td->f1->linesize[p];
+        const ptrdiff_t f2_linesize = td->f2->linesize[p];
+        const ptrdiff_t dst_linesize = td->dst->linesize[p];
+        const int w = s->planewidth[p];
+        const int h = s->planeheight[p];
+        const int slice_start = (h * jobnr) / nb_jobs;
+        const int slice_end = (h * (jobnr+1)) / nb_jobs;
+        const uint8_t *src = td->src->data[p] + slice_start * src_linesize;
+        const uint8_t *f1 = td->f1->data[p] + slice_start * f1_linesize;
+        const uint8_t *f2 = td->f2->data[p] + slice_start * f2_linesize;
+        uint8_t *dst = td->dst->data[p] + slice_start * dst_linesize;
+
+        if (!((1 << p) & s->planes)) {
+            av_image_copy_plane(dst, dst_linesize, src, src_linesize,
+                                s->linesize[p], slice_end - slice_start);
+            continue;
+        }
+
+        for (int y = slice_start; y < slice_end; y++) {
+            s->maskedminmax(src, dst, f1, f2, w);
+
+            dst += dst_linesize;
+            src += src_linesize;
+            f1  += f1_linesize;
+            f2  += f2_linesize;
+        }
+    }
+
+    return 0;
+}
+
+static int process_frame(FFFrameSync *fs)
+{
+    AVFilterContext *ctx = fs->parent;
+    MaskedMinMaxContext *s = fs->opaque;
+    AVFilterLink *outlink = ctx->outputs[0];
+    AVFrame *out, *src, *f1, *f2;
+    int ret;
+
+    if ((ret = ff_framesync_get_frame(&s->fs, 0, &src, 0)) < 0 ||
+        (ret = ff_framesync_get_frame(&s->fs, 1, &f1,  0)) < 0 ||
+        (ret = ff_framesync_get_frame(&s->fs, 2, &f2,  0)) < 0)
+        return ret;
+
+    if (ctx->is_disabled) {
+        out = av_frame_clone(src);
+        if (!out)
+            return AVERROR(ENOMEM);
+    } else {
+        ThreadData td;
+
+        out = ff_get_video_buffer(outlink, outlink->w, outlink->h);
+        if (!out)
+            return AVERROR(ENOMEM);
+        av_frame_copy_props(out, src);
+
+        td.src = src;
+        td.f1 = f1;
+        td.f2 = f2;
+        td.dst = out;
+
+        ctx->internal->execute(ctx, maskedminmax_slice, &td, NULL, FFMIN(s->planeheight[0],
+                                                                   ff_filter_get_nb_threads(ctx)));
+    }
+    out->pts = av_rescale_q(s->fs.pts, s->fs.time_base, outlink->time_base);
+
+    return ff_filter_frame(outlink, out);
+}
+
+static int config_output(AVFilterLink *outlink)
+{
+    AVFilterContext *ctx = outlink->src;
+    MaskedMinMaxContext *s = ctx->priv;
+    AVFilterLink *source = ctx->inputs[0];
+    AVFilterLink *f1 = ctx->inputs[1];
+    AVFilterLink *f2 = ctx->inputs[2];
+    FFFrameSyncIn *in;
+    int ret;
+
+    if (source->format != f1->format ||
+        source->format != f2->format) {
+        av_log(ctx, AV_LOG_ERROR, "inputs must be of same pixel format\n");
+        return AVERROR(EINVAL);
+    }
+    if (source->w != f1->w || source->h != f1->h ||
+        source->w != f2->w || source->h != f2->h) {
+        av_log(ctx, AV_LOG_ERROR, "First input link %s parameters "
+               "(size %dx%d) do not match the corresponding "
+               "second input link %s parameters (%dx%d) "
+               "and/or third input link %s parameters (size %dx%d)\n",
+               ctx->input_pads[0].name, source->w, source->h,
+               ctx->input_pads[1].name, f1->w, f1->h,
+               ctx->input_pads[2].name, f2->w, f2->h);
+        return AVERROR(EINVAL);
+    }
+
+    outlink->w = source->w;
+    outlink->h = source->h;
+    outlink->sample_aspect_ratio = source->sample_aspect_ratio;
+    outlink->frame_rate = source->frame_rate;
+
+    if ((ret = ff_framesync_init(&s->fs, ctx, 3)) < 0)
+        return ret;
+
+    in = s->fs.in;
+    in[0].time_base = source->time_base;
+    in[1].time_base = f1->time_base;
+    in[2].time_base = f2->time_base;
+    in[0].sync   = 1;
+    in[0].before = EXT_STOP;
+    in[0].after  = EXT_INFINITY;
+    in[1].sync   = 1;
+    in[1].before = EXT_STOP;
+    in[1].after  = EXT_INFINITY;
+    in[2].sync   = 1;
+    in[2].before = EXT_STOP;
+    in[2].after  = EXT_INFINITY;
+    s->fs.opaque   = s;
+    s->fs.on_event = process_frame;
+
+    ret = ff_framesync_configure(&s->fs);
+    outlink->time_base = s->fs.time_base;
+
+    return ret;
+}
+
+static int activate(AVFilterContext *ctx)
+{
+    MaskedMinMaxContext *s = ctx->priv;
+    return ff_framesync_activate(&s->fs);
+}
+
+static av_cold void uninit(AVFilterContext *ctx)
+{
+    MaskedMinMaxContext *s = ctx->priv;
+
+    ff_framesync_uninit(&s->fs);
+}
+
+static const AVFilterPad maskedminmax_inputs[] = {
+    {
+        .name         = "source",
+        .type         = AVMEDIA_TYPE_VIDEO,
+        .config_props = config_input,
+    },
+    {
+        .name         = "filter1",
+        .type         = AVMEDIA_TYPE_VIDEO,
+    },
+    {
+        .name         = "filter2",
+        .type         = AVMEDIA_TYPE_VIDEO,
+    },
+    { NULL }
+};
+
+static const AVFilterPad maskedminmax_outputs[] = {
+    {
+        .name          = "default",
+        .type          = AVMEDIA_TYPE_VIDEO,
+        .config_props  = config_output,
+    },
+    { NULL }
+};
+
+#define maskedmin_options maskedminmax_options
+AVFILTER_DEFINE_CLASS(maskedmin);
+
+AVFilter ff_vf_maskedmin = {
+    .name          = "maskedmin",
+    .description   = NULL_IF_CONFIG_SMALL("Apply filtering with minimum difference of two streams."),
+    .priv_class    = &maskedmin_class,
+    .priv_size     = sizeof(MaskedMinMaxContext),
+    .init          = init,
+    .uninit        = uninit,
+    .activate      = activate,
+    .query_formats = query_formats,
+    .inputs        = maskedminmax_inputs,
+    .outputs       = maskedminmax_outputs,
+    .flags         = AVFILTER_FLAG_SUPPORT_TIMELINE_INTERNAL | AVFILTER_FLAG_SLICE_THREADS,
+};
+
+#define maskedmax_options maskedminmax_options
+AVFILTER_DEFINE_CLASS(maskedmax);
+
+AVFilter ff_vf_maskedmax = {
+    .name          = "maskedmax",
+    .description   = NULL_IF_CONFIG_SMALL("Apply filtering with maximum difference of two streams."),
+    .priv_class    = &maskedmax_class,
+    .priv_size     = sizeof(MaskedMinMaxContext),
+    .init          = init,
+    .uninit        = uninit,
+    .activate      = activate,
+    .query_formats = query_formats,
+    .inputs        = maskedminmax_inputs,
+    .outputs       = maskedminmax_outputs,
+    .flags         = AVFILTER_FLAG_SUPPORT_TIMELINE_INTERNAL | AVFILTER_FLAG_SLICE_THREADS,
+};
diff --git a/libavfilter/vf_maskedthreshold.c b/libavfilter/vf_maskedthreshold.c
new file mode 100644
index 0000000..d925819
--- /dev/null
+++ b/libavfilter/vf_maskedthreshold.c
@@ -0,0 +1,298 @@
+/*
+ * Copyright (c) 2020 Paul B Mahol
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "libavutil/imgutils.h"
+#include "libavutil/pixdesc.h"
+#include "libavutil/opt.h"
+#include "avfilter.h"
+#include "formats.h"
+#include "internal.h"
+#include "video.h"
+#include "framesync.h"
+
+typedef struct MaskedThresholdContext {
+    const AVClass *class;
+
+    int threshold;
+    int planes;
+
+    int linesize[4];
+    int planewidth[4], planeheight[4];
+    int nb_planes;
+    int depth;
+    FFFrameSync fs;
+
+    void (*maskedthreshold)(const uint8_t *src, const uint8_t *ref, uint8_t *dst, int threshold, int w);
+} MaskedThresholdContext;
+
+#define OFFSET(x) offsetof(MaskedThresholdContext, x)
+#define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM
+
+typedef struct ThreadData {
+    AVFrame *src, *ref, *dst;
+} ThreadData;
+
+static const AVOption maskedthreshold_options[] = {
+    { "threshold", "set threshold", OFFSET(threshold), AV_OPT_TYPE_INT, {.i64=1},   0, UINT16_MAX, FLAGS },
+    { "planes",    "set planes",    OFFSET(planes),    AV_OPT_TYPE_INT, {.i64=0xF}, 0, 0xF,        FLAGS },
+    { NULL }
+};
+
+static int query_formats(AVFilterContext *ctx)
+{
+    static const enum AVPixelFormat pix_fmts[] = {
+        AV_PIX_FMT_YUVA444P, AV_PIX_FMT_YUV444P, AV_PIX_FMT_YUV440P,
+        AV_PIX_FMT_YUVJ444P, AV_PIX_FMT_YUVJ440P,
+        AV_PIX_FMT_YUVA422P, AV_PIX_FMT_YUV422P, AV_PIX_FMT_YUVA420P, AV_PIX_FMT_YUV420P,
+        AV_PIX_FMT_YUVJ422P, AV_PIX_FMT_YUVJ420P,
+        AV_PIX_FMT_YUVJ411P, AV_PIX_FMT_YUV411P, AV_PIX_FMT_YUV410P,
+        AV_PIX_FMT_YUV420P9, AV_PIX_FMT_YUV422P9, AV_PIX_FMT_YUV444P9,
+        AV_PIX_FMT_YUV420P10, AV_PIX_FMT_YUV422P10, AV_PIX_FMT_YUV444P10,
+        AV_PIX_FMT_YUV420P12, AV_PIX_FMT_YUV422P12, AV_PIX_FMT_YUV444P12, AV_PIX_FMT_YUV440P12,
+        AV_PIX_FMT_YUV420P14, AV_PIX_FMT_YUV422P14, AV_PIX_FMT_YUV444P14,
+        AV_PIX_FMT_YUV420P16, AV_PIX_FMT_YUV422P16, AV_PIX_FMT_YUV444P16,
+        AV_PIX_FMT_YUVA420P9, AV_PIX_FMT_YUVA422P9, AV_PIX_FMT_YUVA444P9,
+        AV_PIX_FMT_YUVA420P10, AV_PIX_FMT_YUVA422P10, AV_PIX_FMT_YUVA444P10,
+        AV_PIX_FMT_YUVA422P12, AV_PIX_FMT_YUVA444P12,
+        AV_PIX_FMT_YUVA420P16, AV_PIX_FMT_YUVA422P16, AV_PIX_FMT_YUVA444P16,
+        AV_PIX_FMT_GBRP, AV_PIX_FMT_GBRP9, AV_PIX_FMT_GBRP10,
+        AV_PIX_FMT_GBRP12, AV_PIX_FMT_GBRP14, AV_PIX_FMT_GBRP16,
+        AV_PIX_FMT_GBRAP, AV_PIX_FMT_GBRAP10, AV_PIX_FMT_GBRAP12, AV_PIX_FMT_GBRAP16,
+        AV_PIX_FMT_GRAY8, AV_PIX_FMT_GRAY9, AV_PIX_FMT_GRAY10, AV_PIX_FMT_GRAY12, AV_PIX_FMT_GRAY14, AV_PIX_FMT_GRAY16,
+        AV_PIX_FMT_NONE
+    };
+
+    return ff_set_common_formats(ctx, ff_make_format_list(pix_fmts));
+}
+
+static void threshold8(const uint8_t *src, const uint8_t *ref, uint8_t *dst, int threshold, int w)
+{
+    for (int x = 0; x < w; x++)
+        dst[x] = FFABS(src[x] - ref[x]) <= threshold ? src[x] : ref[x];
+}
+
+static void threshold16(const uint8_t *ssrc, const uint8_t *rref, uint8_t *ddst, int threshold, int w)
+{
+    const uint16_t *src = (const uint16_t *)ssrc;
+    const uint16_t *ref = (const uint16_t *)rref;
+    uint16_t *dst = (uint16_t *)ddst;
+
+    for (int x = 0; x < w; x++)
+        dst[x] = FFABS(src[x] - ref[x]) <= threshold ? src[x] : ref[x];
+}
+
+static int config_input(AVFilterLink *inlink)
+{
+    AVFilterContext *ctx = inlink->dst;
+    MaskedThresholdContext *s = ctx->priv;
+    const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(inlink->format);
+    int vsub, hsub, ret;
+
+    s->nb_planes = av_pix_fmt_count_planes(inlink->format);
+
+    if ((ret = av_image_fill_linesizes(s->linesize, inlink->format, inlink->w)) < 0)
+        return ret;
+
+    hsub = desc->log2_chroma_w;
+    vsub = desc->log2_chroma_h;
+    s->planeheight[1] = s->planeheight[2] = AV_CEIL_RSHIFT(inlink->h, vsub);
+    s->planeheight[0] = s->planeheight[3] = inlink->h;
+    s->planewidth[1]  = s->planewidth[2]  = AV_CEIL_RSHIFT(inlink->w, hsub);
+    s->planewidth[0]  = s->planewidth[3]  = inlink->w;
+
+    s->depth = desc->comp[0].depth;
+
+    if (desc->comp[0].depth == 8)
+        s->maskedthreshold = threshold8;
+    else
+        s->maskedthreshold = threshold16;
+
+    return 0;
+}
+
+static int threshold_slice(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
+{
+    MaskedThresholdContext *s = ctx->priv;
+    const int threshold = s->threshold;
+    ThreadData *td = arg;
+
+    for (int p = 0; p < s->nb_planes; p++) {
+        const ptrdiff_t src_linesize = td->src->linesize[p];
+        const ptrdiff_t ref_linesize = td->ref->linesize[p];
+        const ptrdiff_t dst_linesize = td->dst->linesize[p];
+        const int w = s->planewidth[p];
+        const int h = s->planeheight[p];
+        const int slice_start = (h * jobnr) / nb_jobs;
+        const int slice_end = (h * (jobnr+1)) / nb_jobs;
+        const uint8_t *src = td->src->data[p] + slice_start * src_linesize;
+        const uint8_t *ref = td->ref->data[p] + slice_start * ref_linesize;
+        uint8_t *dst = td->dst->data[p] + slice_start * dst_linesize;
+
+        if (!((1 << p) & s->planes)) {
+            av_image_copy_plane(dst, dst_linesize, ref, ref_linesize,
+                                s->linesize[p], slice_end - slice_start);
+            continue;
+        }
+
+        for (int y = slice_start; y < slice_end; y++) {
+            s->maskedthreshold(src, ref, dst, threshold, w);
+
+            dst += dst_linesize;
+            src += src_linesize;
+            ref += ref_linesize;
+        }
+    }
+
+    return 0;
+}
+
+static int process_frame(FFFrameSync *fs)
+{
+    AVFilterContext *ctx = fs->parent;
+    MaskedThresholdContext *s = fs->opaque;
+    AVFilterLink *outlink = ctx->outputs[0];
+    AVFrame *out, *src, *ref;
+    int ret;
+
+    if ((ret = ff_framesync_get_frame(&s->fs, 0, &src, 0)) < 0 ||
+        (ret = ff_framesync_get_frame(&s->fs, 1, &ref, 0)) < 0)
+        return ret;
+
+    if (ctx->is_disabled) {
+        out = av_frame_clone(src);
+        if (!out)
+            return AVERROR(ENOMEM);
+    } else {
+        ThreadData td;
+
+        out = ff_get_video_buffer(outlink, outlink->w, outlink->h);
+        if (!out)
+            return AVERROR(ENOMEM);
+        av_frame_copy_props(out, src);
+
+        td.src = src;
+        td.ref = ref;
+        td.dst = out;
+
+        ctx->internal->execute(ctx, threshold_slice, &td, NULL, FFMIN(s->planeheight[2],
+                                                                ff_filter_get_nb_threads(ctx)));
+    }
+    out->pts = av_rescale_q(s->fs.pts, s->fs.time_base, outlink->time_base);
+
+    return ff_filter_frame(outlink, out);
+}
+
+static int config_output(AVFilterLink *outlink)
+{
+    AVFilterContext *ctx = outlink->src;
+    MaskedThresholdContext *s = ctx->priv;
+    AVFilterLink *source = ctx->inputs[0];
+    AVFilterLink *ref = ctx->inputs[1];
+    FFFrameSyncIn *in;
+    int ret;
+
+    if (source->format != ref->format) {
+        av_log(ctx, AV_LOG_ERROR, "inputs must be of same pixel format\n");
+        return AVERROR(EINVAL);
+    }
+    if (source->w != ref->w || source->h != ref->h) {
+        av_log(ctx, AV_LOG_ERROR, "First input link %s parameters "
+               "(size %dx%d) do not match the corresponding "
+               "second input link %s parameters (%dx%d)\n",
+               ctx->input_pads[0].name, source->w, source->h,
+               ctx->input_pads[1].name, ref->w, ref->h);
+        return AVERROR(EINVAL);
+    }
+
+    outlink->w = source->w;
+    outlink->h = source->h;
+    outlink->sample_aspect_ratio = source->sample_aspect_ratio;
+    outlink->frame_rate = source->frame_rate;
+
+    if ((ret = ff_framesync_init(&s->fs, ctx, 2)) < 0)
+        return ret;
+
+    in = s->fs.in;
+    in[0].time_base = source->time_base;
+    in[1].time_base = ref->time_base;
+    in[0].sync   = 1;
+    in[0].before = EXT_STOP;
+    in[0].after  = EXT_INFINITY;
+    in[1].sync   = 1;
+    in[1].before = EXT_STOP;
+    in[1].after  = EXT_INFINITY;
+    s->fs.opaque   = s;
+    s->fs.on_event = process_frame;
+
+    ret = ff_framesync_configure(&s->fs);
+    outlink->time_base = s->fs.time_base;
+
+    return ret;
+}
+
+static int activate(AVFilterContext *ctx)
+{
+    MaskedThresholdContext *s = ctx->priv;
+    return ff_framesync_activate(&s->fs);
+}
+
+static av_cold void uninit(AVFilterContext *ctx)
+{
+    MaskedThresholdContext *s = ctx->priv;
+
+    ff_framesync_uninit(&s->fs);
+}
+
+static const AVFilterPad maskedthreshold_inputs[] = {
+    {
+        .name         = "source",
+        .type         = AVMEDIA_TYPE_VIDEO,
+        .config_props = config_input,
+    },
+    {
+        .name         = "reference",
+        .type         = AVMEDIA_TYPE_VIDEO,
+    },
+    { NULL }
+};
+
+static const AVFilterPad maskedthreshold_outputs[] = {
+    {
+        .name          = "default",
+        .type          = AVMEDIA_TYPE_VIDEO,
+        .config_props  = config_output,
+    },
+    { NULL }
+};
+
+AVFILTER_DEFINE_CLASS(maskedthreshold);
+
+AVFilter ff_vf_maskedthreshold = {
+    .name          = "maskedthreshold",
+    .description   = NULL_IF_CONFIG_SMALL("Pick pixels comparing absolute difference of two streams with threshold."),
+    .priv_class    = &maskedthreshold_class,
+    .priv_size     = sizeof(MaskedThresholdContext),
+    .uninit        = uninit,
+    .activate      = activate,
+    .query_formats = query_formats,
+    .inputs        = maskedthreshold_inputs,
+    .outputs       = maskedthreshold_outputs,
+    .flags         = AVFILTER_FLAG_SUPPORT_TIMELINE_INTERNAL | AVFILTER_FLAG_SLICE_THREADS,
+};
diff --git a/libavfilter/vf_maskfun.c b/libavfilter/vf_maskfun.c
new file mode 100644
index 0000000..4ceb21b
--- /dev/null
+++ b/libavfilter/vf_maskfun.c
@@ -0,0 +1,287 @@
+/*
+ * Copyright (c) 2018 Paul B Mahol
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "libavutil/imgutils.h"
+#include "libavutil/pixdesc.h"
+#include "libavutil/opt.h"
+#include "avfilter.h"
+#include "formats.h"
+#include "internal.h"
+#include "video.h"
+
+typedef struct MaskFunContext {
+    const AVClass *class;
+
+    int low, high;
+    int planes;
+    int fill;
+    int sum;
+
+    int linesize[4];
+    int width[4], height[4];
+    int nb_planes;
+    int depth;
+    int max;
+    uint64_t max_sum;
+
+    AVFrame *empty;
+    int (*getsum)(AVFilterContext *ctx, AVFrame *out);
+    int (*maskfun)(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs);
+} MaskFunContext;
+
+#define OFFSET(x) offsetof(MaskFunContext, x)
+#define VF AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM
+
+static const AVOption maskfun_options[] = {
+    { "low",    "set low threshold",  OFFSET(low),    AV_OPT_TYPE_INT, {.i64=10},  0, UINT16_MAX, VF },
+    { "high",   "set high threshold", OFFSET(high),   AV_OPT_TYPE_INT, {.i64=10},  0, UINT16_MAX, VF },
+    { "planes", "set planes",         OFFSET(planes), AV_OPT_TYPE_INT, {.i64=0xF}, 0, 0xF,        VF },
+    { "fill",   "set fill value",     OFFSET(fill),   AV_OPT_TYPE_INT, {.i64=0},   0, UINT16_MAX, VF },
+    { "sum",    "set sum value",      OFFSET(sum),    AV_OPT_TYPE_INT, {.i64=10},  0, UINT16_MAX, VF },
+    { NULL }
+};
+
+AVFILTER_DEFINE_CLASS(maskfun);
+
+static int query_formats(AVFilterContext *ctx)
+{
+    static const enum AVPixelFormat pix_fmts[] = {
+        AV_PIX_FMT_YUVA444P, AV_PIX_FMT_YUV444P, AV_PIX_FMT_YUV440P,
+        AV_PIX_FMT_YUVJ444P, AV_PIX_FMT_YUVJ440P,
+        AV_PIX_FMT_YUVA422P, AV_PIX_FMT_YUV422P, AV_PIX_FMT_YUVA420P, AV_PIX_FMT_YUV420P,
+        AV_PIX_FMT_YUVJ422P, AV_PIX_FMT_YUVJ420P,
+        AV_PIX_FMT_YUVJ411P, AV_PIX_FMT_YUV411P, AV_PIX_FMT_YUV410P,
+        AV_PIX_FMT_YUV420P9, AV_PIX_FMT_YUV422P9, AV_PIX_FMT_YUV444P9,
+        AV_PIX_FMT_YUV420P10, AV_PIX_FMT_YUV422P10, AV_PIX_FMT_YUV444P10,
+        AV_PIX_FMT_YUV420P12, AV_PIX_FMT_YUV422P12, AV_PIX_FMT_YUV444P12, AV_PIX_FMT_YUV440P12,
+        AV_PIX_FMT_YUV420P14, AV_PIX_FMT_YUV422P14, AV_PIX_FMT_YUV444P14,
+        AV_PIX_FMT_YUV420P16, AV_PIX_FMT_YUV422P16, AV_PIX_FMT_YUV444P16,
+        AV_PIX_FMT_YUVA420P9, AV_PIX_FMT_YUVA422P9, AV_PIX_FMT_YUVA444P9,
+        AV_PIX_FMT_YUVA420P10, AV_PIX_FMT_YUVA422P10, AV_PIX_FMT_YUVA444P10,
+        AV_PIX_FMT_YUVA420P16, AV_PIX_FMT_YUVA422P16, AV_PIX_FMT_YUVA444P16,
+        AV_PIX_FMT_GBRP, AV_PIX_FMT_GBRP9, AV_PIX_FMT_GBRP10,
+        AV_PIX_FMT_GBRP12, AV_PIX_FMT_GBRP14, AV_PIX_FMT_GBRP16,
+        AV_PIX_FMT_GBRAP, AV_PIX_FMT_GBRAP10, AV_PIX_FMT_GBRAP12, AV_PIX_FMT_GBRAP16,
+        AV_PIX_FMT_GRAY8, AV_PIX_FMT_GRAY9, AV_PIX_FMT_GRAY10, AV_PIX_FMT_GRAY12, AV_PIX_FMT_GRAY14, AV_PIX_FMT_GRAY16,
+        AV_PIX_FMT_NONE
+    };
+
+    return ff_set_common_formats(ctx, ff_make_format_list(pix_fmts));
+}
+
+static int filter_frame(AVFilterLink *inlink, AVFrame *frame)
+{
+    AVFilterContext *ctx = inlink->dst;
+    MaskFunContext *s = ctx->priv;
+    AVFilterLink *outlink = ctx->outputs[0];
+
+    if (s->getsum(ctx, frame)) {
+        AVFrame *out = av_frame_clone(s->empty);
+
+        if (!out) {
+            av_frame_free(&frame);
+            return AVERROR(ENOMEM);
+        }
+        out->pts = frame->pts;
+        av_frame_free(&frame);
+
+        return ff_filter_frame(outlink, out);
+    }
+
+    ctx->internal->execute(ctx, s->maskfun, frame, NULL,
+                           FFMIN(s->height[1], ff_filter_get_nb_threads(ctx)));
+
+    return ff_filter_frame(outlink, frame);
+}
+
+#define GETSUM(name, type, div)                              \
+static int getsum##name(AVFilterContext *ctx, AVFrame *out)  \
+{                                                            \
+    MaskFunContext *s = ctx->priv;                           \
+    uint64_t sum = 0;                                        \
+    int p;                                                   \
+                                                             \
+    for (p = 0; p < s->nb_planes; p++) {                     \
+        const int linesize = out->linesize[p] / div;         \
+        const int w = s->width[p];                           \
+        const int h = s->height[p];                          \
+        type *dst = (type *)out->data[p];                    \
+                                                             \
+        if (!((1 << p) & s->planes))                         \
+            continue;                                        \
+                                                             \
+        for (int y = 0; y < h; y++) {                        \
+            for (int x = 0; x < w; x++)                      \
+                sum += dst[x];                               \
+            if (sum >= s->max_sum)                           \
+                return 1;                                    \
+            dst += linesize;                                 \
+        }                                                    \
+    }                                                        \
+                                                             \
+    return 0;                                                \
+}
+
+GETSUM(8, uint8_t, 1)
+GETSUM(16, uint16_t, 2)
+
+#define MASKFUN(name, type, div)                             \
+static int maskfun##name(AVFilterContext *ctx, void *arg,    \
+                         int jobnr, int nb_jobs)             \
+{                                                            \
+    MaskFunContext *s = ctx->priv;                           \
+    AVFrame *out = arg;                                      \
+    const int low = s->low;                                  \
+    const int high = s->high;                                \
+    const int max = s->max;                                  \
+    int p;                                                   \
+                                                             \
+    for (p = 0; p < s->nb_planes; p++) {                     \
+        const int linesize = out->linesize[p] / div;         \
+        const int w = s->width[p];                           \
+        const int h = s->height[p];                          \
+        const int slice_start = (h * jobnr) / nb_jobs;       \
+        const int slice_end = (h * (jobnr+1)) / nb_jobs;     \
+        type *dst = (type *)out->data[p] + slice_start * linesize; \
+                                                             \
+        if (!((1 << p) & s->planes))                         \
+            continue;                                        \
+                                                             \
+        for (int y = slice_start; y < slice_end; y++) {      \
+            for (int x = 0; x < w; x++) {                    \
+                if (dst[x] <= low)                           \
+                    dst[x] = 0;                              \
+                else if (dst[x] > high)                      \
+                    dst[x] = max;                            \
+            }                                                \
+                                                             \
+            dst += linesize;                                 \
+        }                                                    \
+    }                                                        \
+                                                             \
+    return 0;                                                \
+}
+
+MASKFUN(8, uint8_t, 1)
+MASKFUN(16, uint16_t, 2)
+
+static int config_input(AVFilterLink *inlink)
+{
+    AVFilterContext *ctx = inlink->dst;
+    MaskFunContext *s = ctx->priv;
+    const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(inlink->format);
+    int vsub, hsub, ret;
+
+    s->nb_planes = av_pix_fmt_count_planes(inlink->format);
+
+    if ((ret = av_image_fill_linesizes(s->linesize, inlink->format, inlink->w)) < 0)
+        return ret;
+
+    hsub = desc->log2_chroma_w;
+    vsub = desc->log2_chroma_h;
+    s->height[1] = s->height[2] = AV_CEIL_RSHIFT(inlink->h, vsub);
+    s->height[0] = s->height[3] = inlink->h;
+    s->width[1]  = s->width[2]  = AV_CEIL_RSHIFT(inlink->w, hsub);
+    s->width[0]  = s->width[3]  = inlink->w;
+
+    s->depth = desc->comp[0].depth;
+    s->max = (1 << s->depth) - 1;
+    s->fill = FFMIN(s->fill, s->max);
+
+    if (s->depth == 8) {
+        s->maskfun = maskfun8;
+        s->getsum = getsum8;
+    } else {
+        s->maskfun = maskfun16;
+        s->getsum = getsum16;
+    }
+
+    s->empty = ff_get_video_buffer(inlink, inlink->w, inlink->h);
+    if (!s->empty)
+        return AVERROR(ENOMEM);
+
+    if (s->depth == 8) {
+        for (int p = 0; p < s->nb_planes; p++) {
+            uint8_t *dst = s->empty->data[p];
+
+            for (int y = 0; y < s->height[p]; y++) {
+                memset(dst, s->fill, s->width[p]);
+                dst += s->empty->linesize[p];
+            }
+        }
+    } else {
+        for (int p = 0; p < s->nb_planes; p++) {
+            uint16_t *dst = (uint16_t *)s->empty->data[p];
+
+            for (int y = 0; y < s->height[p]; y++) {
+                for (int x = 0; x < s->width[p]; x++)
+                    dst[x] = s->fill;
+                dst += s->empty->linesize[p] / 2;
+            }
+        }
+    }
+
+    s->max_sum = 0;
+    for (int p = 0; p < s->nb_planes; p++) {
+        if (!((1 << p) & s->planes))
+            continue;
+        s->max_sum += (uint64_t)s->sum * s->width[p] * s->height[p];
+    }
+
+    return 0;
+}
+
+static av_cold void uninit(AVFilterContext *ctx)
+{
+    MaskFunContext *s = ctx->priv;
+
+    av_frame_free(&s->empty);
+}
+
+static const AVFilterPad maskfun_inputs[] = {
+    {
+        .name           = "default",
+        .type           = AVMEDIA_TYPE_VIDEO,
+        .filter_frame   = filter_frame,
+        .config_props   = config_input,
+        .needs_writable = 1,
+    },
+    { NULL }
+};
+
+static const AVFilterPad maskfun_outputs[] = {
+    {
+        .name = "default",
+        .type = AVMEDIA_TYPE_VIDEO,
+    },
+    { NULL }
+};
+
+AVFilter ff_vf_maskfun = {
+    .name          = "maskfun",
+    .description   = NULL_IF_CONFIG_SMALL("Create Mask."),
+    .priv_size     = sizeof(MaskFunContext),
+    .query_formats = query_formats,
+    .uninit        = uninit,
+    .inputs        = maskfun_inputs,
+    .outputs       = maskfun_outputs,
+    .priv_class    = &maskfun_class,
+    .flags         = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC | AVFILTER_FLAG_SLICE_THREADS,
+};
diff --git a/libavfilter/vf_median.c b/libavfilter/vf_median.c
new file mode 100644
index 0000000..0189fab
--- /dev/null
+++ b/libavfilter/vf_median.c
@@ -0,0 +1,299 @@
+/*
+ * Copyright (c) 2019 Paul B Mahol
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ */
+
+#include "libavutil/avassert.h"
+#include "libavutil/imgutils.h"
+#include "libavutil/opt.h"
+#include "libavutil/pixdesc.h"
+#include "avfilter.h"
+#include "formats.h"
+#include "internal.h"
+#include "median.h"
+#include "video.h"
+
+#define DEPTH 8
+#include "median_template.c"
+
+#undef DEPTH
+#define DEPTH 9
+#include "median_template.c"
+
+#undef DEPTH
+#define DEPTH 10
+#include "median_template.c"
+
+#undef DEPTH
+#define DEPTH 12
+#include "median_template.c"
+
+#undef DEPTH
+#define DEPTH 14
+#include "median_template.c"
+
+#undef DEPTH
+#define DEPTH 16
+#include "median_template.c"
+
+#define OFFSET(x) offsetof(MedianContext, x)
+#define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_RUNTIME_PARAM
+
+static const AVOption median_options[] = {
+    { "radius", "set median radius",    OFFSET(radius), AV_OPT_TYPE_INT,   {.i64=1},     1,  127, FLAGS },
+    { "planes", "set planes to filter", OFFSET(planes), AV_OPT_TYPE_INT,   {.i64=0xF},   0,  0xF, FLAGS },
+    { "radiusV", "set median vertical radius", OFFSET(radiusV), AV_OPT_TYPE_INT, {.i64=0},0, 127, FLAGS },
+    { "percentile", "set median percentile", OFFSET(percentile), AV_OPT_TYPE_FLOAT, {.dbl=.5}, 0., 1., FLAGS },
+    { NULL }
+};
+
+AVFILTER_DEFINE_CLASS(median);
+
+static void hadd(htype *dst, const htype *src, int bins)
+{
+    for (int i = 0; i < bins; i++)
+        dst[i] += src[i];
+}
+
+static void hsub(htype *dst, const htype *src, int bins)
+{
+    for (int i = 0; i < bins; i++)
+        dst[i] -= src[i];
+}
+
+static void hmuladd(htype *dst, const htype *src, int f, int bins)
+{
+    for (int i = 0; i < bins; i++)
+        dst[i] += f * src[i];
+}
+
+static int query_formats(AVFilterContext *ctx)
+{
+    static const enum AVPixelFormat pix_fmts[] = {
+        AV_PIX_FMT_YUVA444P, AV_PIX_FMT_YUV444P, AV_PIX_FMT_YUV440P,
+        AV_PIX_FMT_YUVJ444P, AV_PIX_FMT_YUVJ440P,
+        AV_PIX_FMT_YUVA422P, AV_PIX_FMT_YUV422P, AV_PIX_FMT_YUVA420P, AV_PIX_FMT_YUV420P,
+        AV_PIX_FMT_YUVJ422P, AV_PIX_FMT_YUVJ420P,
+        AV_PIX_FMT_YUVJ411P, AV_PIX_FMT_YUV411P, AV_PIX_FMT_YUV410P,
+        AV_PIX_FMT_GBRP, AV_PIX_FMT_GBRAP, AV_PIX_FMT_GRAY8, AV_PIX_FMT_GRAY9,
+        AV_PIX_FMT_YUV420P9, AV_PIX_FMT_YUV422P9, AV_PIX_FMT_YUV444P9, AV_PIX_FMT_GBRP9,
+        AV_PIX_FMT_YUVA420P9, AV_PIX_FMT_YUVA422P9, AV_PIX_FMT_YUVA444P9,
+        AV_PIX_FMT_YUV420P10, AV_PIX_FMT_YUV422P10, AV_PIX_FMT_YUV444P10,
+        AV_PIX_FMT_YUV420P12, AV_PIX_FMT_YUV422P12, AV_PIX_FMT_YUV444P12, AV_PIX_FMT_YUV440P12,
+        AV_PIX_FMT_YUV420P14, AV_PIX_FMT_YUV422P14, AV_PIX_FMT_YUV444P14,
+        AV_PIX_FMT_YUV420P16, AV_PIX_FMT_YUV422P16, AV_PIX_FMT_YUV444P16,
+        AV_PIX_FMT_YUVA420P10, AV_PIX_FMT_YUVA422P10, AV_PIX_FMT_YUVA444P10,
+        AV_PIX_FMT_YUVA422P12, AV_PIX_FMT_YUVA444P12,
+        AV_PIX_FMT_YUVA420P16, AV_PIX_FMT_YUVA422P16, AV_PIX_FMT_YUVA444P16,
+        AV_PIX_FMT_GBRP10, AV_PIX_FMT_GBRP12, AV_PIX_FMT_GBRP14, AV_PIX_FMT_GBRP16,
+        AV_PIX_FMT_GBRAP10, AV_PIX_FMT_GBRAP12, AV_PIX_FMT_GBRAP16,
+        AV_PIX_FMT_GRAY10, AV_PIX_FMT_GRAY12, AV_PIX_FMT_GRAY14, AV_PIX_FMT_GRAY16,
+        AV_PIX_FMT_NONE
+    };
+
+    return ff_set_common_formats(ctx, ff_make_format_list(pix_fmts));
+}
+
+static void check_params(MedianContext *s, AVFilterLink *inlink)
+{
+    for (int i = 0; i < s->nb_planes; i++) {
+        if (!(s->planes & (1 << i)))
+            continue;
+
+        if (s->planewidth[i] < s->radius * 2 + 1) {
+            av_log(inlink->dst, AV_LOG_WARNING, "The %d plane width %d must be not less than %d, clipping radius.\n", i, s->planewidth[i], s->radius * 2 + 1);
+            s->radius = (s->planewidth[i] - 1) / 2;
+        }
+
+        if (s->planeheight[i] < s->radiusV * 2 + 1) {
+            av_log(inlink->dst, AV_LOG_WARNING, "The %d plane height %d must be not less than %d, clipping radiusV.\n", i, s->planeheight[i], s->radiusV * 2 + 1);
+            s->radiusV = (s->planeheight[i] - 1) / 2;
+        }
+    }
+
+    s->t = (2 * s->radius * s->radiusV + s->radiusV + s->radius) * 2.f * s->percentile;
+}
+
+static int config_input(AVFilterLink *inlink)
+{
+    const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(inlink->format);
+    MedianContext *s = inlink->dst->priv;
+
+    s->depth = desc->comp[0].depth;
+    s->planewidth[1] = s->planewidth[2] = AV_CEIL_RSHIFT(inlink->w, desc->log2_chroma_w);
+    s->planewidth[0] = s->planewidth[3] = inlink->w;
+    s->planeheight[1] = s->planeheight[2] = AV_CEIL_RSHIFT(inlink->h, desc->log2_chroma_h);
+    s->planeheight[0] = s->planeheight[3] = inlink->h;
+
+    s->radiusV = !s->radiusV ? s->radius : s->radiusV;
+    s->nb_planes = av_pix_fmt_count_planes(inlink->format);
+
+    check_params(s, inlink);
+
+    s->nb_threads = FFMAX(1, FFMIN(s->planeheight[1] / (s->radiusV + 1), ff_filter_get_nb_threads(inlink->dst)));
+    s->bins   = 1 << ((s->depth + 1) / 2);
+    s->fine_size = s->bins * s->bins * inlink->w;
+    s->coarse_size = s->bins * inlink->w;
+    s->coarse = av_calloc(s->nb_threads, sizeof(*s->coarse));
+    s->fine   = av_calloc(s->nb_threads, sizeof(*s->fine));
+    if (!s->coarse || !s->fine)
+        return AVERROR(ENOMEM);
+    for (int i = 0; i < s->nb_threads; i++) {
+        s->coarse[i] = av_malloc_array(s->coarse_size, sizeof(**s->coarse));
+        s->fine[i]   = av_malloc_array(s->fine_size, sizeof(**s->fine));
+        if (!s->coarse[i] || !s->fine[i])
+            return AVERROR(ENOMEM);
+    }
+
+    s->hadd = hadd;
+    s->hsub = hsub;
+    s->hmuladd = hmuladd;
+
+    switch (s->depth) {
+    case  8: s->filter_plane = filter_plane_8;  break;
+    case  9: s->filter_plane = filter_plane_9;  break;
+    case 10: s->filter_plane = filter_plane_10; break;
+    case 12: s->filter_plane = filter_plane_12; break;
+    case 14: s->filter_plane = filter_plane_14; break;
+    case 16: s->filter_plane = filter_plane_16; break;
+    }
+
+    return 0;
+}
+
+typedef struct ThreadData {
+    AVFrame *in, *out;
+} ThreadData;
+
+static int filter_slice(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
+{
+    MedianContext *s = ctx->priv;
+    ThreadData *td = arg;
+    AVFrame *in = td->in;
+    AVFrame *out = td->out;
+
+    for (int plane = 0; plane < s->nb_planes; plane++) {
+        const int h = s->planeheight[plane];
+        const int w = s->planewidth[plane];
+        const int slice_h_start = (h * jobnr) / nb_jobs;
+        const int slice_h_end = (h * (jobnr+1)) / nb_jobs;
+
+        if (!(s->planes & (1 << plane))) {
+            av_image_copy_plane(out->data[plane] + slice_h_start * out->linesize[plane],
+                                out->linesize[plane],
+                                in->data[plane] + slice_h_start * in->linesize[plane],
+                                in->linesize[plane],
+                                w * ((s->depth + 7) / 8),
+                                slice_h_end - slice_h_start);
+            continue;
+        }
+
+        s->filter_plane(ctx, in->data[plane],
+                        in->linesize[plane],
+                        out->data[plane] + slice_h_start * out->linesize[plane],
+                        out->linesize[plane], w, h,
+                        slice_h_start, slice_h_end, jobnr);
+    }
+
+    return 0;
+}
+
+static int filter_frame(AVFilterLink *inlink, AVFrame *in)
+{
+    AVFilterContext *ctx = inlink->dst;
+    MedianContext *s = ctx->priv;
+    AVFilterLink *outlink = ctx->outputs[0];
+    ThreadData td;
+    AVFrame *out;
+
+    out = ff_get_video_buffer(outlink, outlink->w, outlink->h);
+    if (!out) {
+        av_frame_free(&in);
+        return AVERROR(ENOMEM);
+    }
+    av_frame_copy_props(out, in);
+
+    td.in = in; td.out = out;
+    ctx->internal->execute(ctx, filter_slice, &td, NULL, s->nb_threads);
+
+    av_frame_free(&in);
+    return ff_filter_frame(outlink, out);
+}
+
+static av_cold void uninit(AVFilterContext *ctx)
+{
+    MedianContext *s = ctx->priv;
+
+    for (int i = 0; i < s->nb_threads && s->coarse && s->fine; i++) {
+        av_freep(&s->coarse[i]);
+        av_freep(&s->fine[i]);
+    }
+
+    av_freep(&s->coarse);
+    av_freep(&s->fine);
+}
+
+static int process_command(AVFilterContext *ctx, const char *cmd, const char *args,
+                           char *res, int res_len, int flags)
+{
+    MedianContext *s = ctx->priv;
+    int ret;
+
+    ret = ff_filter_process_command(ctx, cmd, args, res, res_len, flags);
+    if (ret < 0)
+        return ret;
+
+    if (!s->radiusV)
+        s->radiusV = s->radius;
+    check_params(s, ctx->inputs[0]);
+
+    return 0;
+}
+
+static const AVFilterPad median_inputs[] = {
+    {
+        .name         = "default",
+        .type         = AVMEDIA_TYPE_VIDEO,
+        .config_props = config_input,
+        .filter_frame = filter_frame,
+    },
+    { NULL }
+};
+
+static const AVFilterPad median_outputs[] = {
+    {
+        .name = "default",
+        .type = AVMEDIA_TYPE_VIDEO,
+    },
+    { NULL }
+};
+
+AVFilter ff_vf_median = {
+    .name          = "median",
+    .description   = NULL_IF_CONFIG_SMALL("Apply Median filter."),
+    .priv_size     = sizeof(MedianContext),
+    .priv_class    = &median_class,
+    .uninit        = uninit,
+    .query_formats = query_formats,
+    .inputs        = median_inputs,
+    .outputs       = median_outputs,
+    .flags         = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC | AVFILTER_FLAG_SLICE_THREADS,
+    .process_command = process_command,
+};
diff --git a/libavfilter/vf_midequalizer.c b/libavfilter/vf_midequalizer.c
index 87d1e7c..44c0bd7 100644
--- a/libavfilter/vf_midequalizer.c
+++ b/libavfilter/vf_midequalizer.c
@@ -74,7 +74,12 @@
         AV_PIX_FMT_GBRP9, AV_PIX_FMT_GBRP10, AV_PIX_FMT_GBRP12, AV_PIX_FMT_GBRP14,
         AV_PIX_FMT_YUVA420P9, AV_PIX_FMT_YUVA422P9, AV_PIX_FMT_YUVA444P9,
         AV_PIX_FMT_YUVA420P10, AV_PIX_FMT_YUVA422P10, AV_PIX_FMT_YUVA444P10,
+        AV_PIX_FMT_YUVA422P12, AV_PIX_FMT_YUVA444P12,
         AV_PIX_FMT_GBRAP10, AV_PIX_FMT_GBRAP12,
+        AV_PIX_FMT_YUV420P16,  AV_PIX_FMT_YUV422P16,  AV_PIX_FMT_YUV444P16,
+        AV_PIX_FMT_YUVA420P16, AV_PIX_FMT_YUVA422P16, AV_PIX_FMT_YUVA444P16,
+        AV_PIX_FMT_GBRP16, AV_PIX_FMT_GBRAP16,
+        AV_PIX_FMT_GRAY16,
         AV_PIX_FMT_NONE
     };
 
@@ -122,7 +127,7 @@
                             s->cchange, s->histogram_size);
         }
     }
-    out->pts = av_rescale_q(in0->pts, s->fs.time_base, outlink->time_base);
+    out->pts = av_rescale_q(s->fs.pts, s->fs.time_base, outlink->time_base);
 
     return ff_filter_frame(outlink, out);
 }
@@ -307,7 +312,6 @@
 
     outlink->w = in0->w;
     outlink->h = in0->h;
-    outlink->time_base = in0->time_base;
     outlink->sample_aspect_ratio = in0->sample_aspect_ratio;
     outlink->frame_rate = in0->frame_rate;
 
@@ -326,7 +330,10 @@
     s->fs.opaque   = s;
     s->fs.on_event = process_frame;
 
-    return ff_framesync_configure(&s->fs);
+    ret = ff_framesync_configure(&s->fs);
+    outlink->time_base = s->fs.time_base;
+
+    return ret;
 }
 
 static int activate(AVFilterContext *ctx)
diff --git a/libavfilter/vf_minterpolate.c b/libavfilter/vf_minterpolate.c
index c6a5e63..b0bb238 100644
--- a/libavfilter/vf_minterpolate.c
+++ b/libavfilter/vf_minterpolate.c
@@ -26,11 +26,11 @@
 #include "libavutil/motion_vector.h"
 #include "libavutil/opt.h"
 #include "libavutil/pixdesc.h"
-#include "libavutil/pixelutils.h"
 #include "avfilter.h"
 #include "formats.h"
 #include "internal.h"
 #include "video.h"
+#include "scene_sad.h"
 
 #define ME_MODE_BIDIR 0
 #define ME_MODE_BILAT 1
@@ -188,7 +188,7 @@
 
     int scd_method;
     int scene_changed;
-    av_pixelutils_sad_fn sad;
+    ff_scene_sad_fn sad;
     double prev_mafd;
     double scd_threshold;
 
@@ -383,7 +383,7 @@
     }
 
     if (mi_ctx->scd_method == SCD_METHOD_FDIFF) {
-        mi_ctx->sad = av_pixelutils_get_sad_fn(3, 3, 2, mi_ctx);
+        mi_ctx->sad = ff_scene_sad_get_fn(8);
         if (!mi_ctx->sad)
             return AVERROR(EINVAL);
     }
@@ -826,19 +826,15 @@
 static int detect_scene_change(MIContext *mi_ctx)
 {
     AVMotionEstContext *me_ctx = &mi_ctx->me_ctx;
-    int x, y;
-    int linesize = me_ctx->linesize;
     uint8_t *p1 = mi_ctx->frames[1].avf->data[0];
+    ptrdiff_t linesize1 = mi_ctx->frames[1].avf->linesize[0];
     uint8_t *p2 = mi_ctx->frames[2].avf->data[0];
+    ptrdiff_t linesize2 = mi_ctx->frames[2].avf->linesize[0];
 
     if (mi_ctx->scd_method == SCD_METHOD_FDIFF) {
         double ret = 0, mafd, diff;
-        int64_t sad;
-
-        for (sad = y = 0; y < me_ctx->height; y += 8)
-            for (x = 0; x < linesize; x += 8)
-                sad += mi_ctx->sad(p1 + x + y * linesize, linesize, p2 + x + y * linesize, linesize);
-
+        uint64_t sad;
+        mi_ctx->sad(p1, linesize1, p2, linesize2, me_ctx->width, me_ctx->height, &sad);
         emms_c();
         mafd = (double) sad / (me_ctx->height * me_ctx->width * 3);
         diff = fabs(mafd - mi_ctx->prev_mafd);
diff --git a/libavfilter/vf_misc_vaapi.c b/libavfilter/vf_misc_vaapi.c
index 30b808a..5814ff8 100644
--- a/libavfilter/vf_misc_vaapi.c
+++ b/libavfilter/vf_misc_vaapi.c
@@ -84,10 +84,9 @@
     denoise.value =  map(ctx->denoise, DENOISE_MIN, DENOISE_MAX,
                          caps.range.min_value,
                          caps.range.max_value);
-    ff_vaapi_vpp_make_param_buffers(avctx, VAProcFilterParameterBufferType,
-                                    &denoise, sizeof(denoise), 1);
-
-    return 0;
+    return ff_vaapi_vpp_make_param_buffers(avctx,
+                                           VAProcFilterParameterBufferType,
+                                           &denoise, sizeof(denoise), 1);
 }
 
 static int sharpness_vaapi_build_filter_params(AVFilterContext *avctx)
@@ -116,11 +115,9 @@
                           SHARPNESS_MIN, SHARPNESS_MAX,
                           caps.range.min_value,
                           caps.range.max_value);
-    ff_vaapi_vpp_make_param_buffers(avctx,
-                                    VAProcFilterParameterBufferType,
-                                    &sharpness, sizeof(sharpness), 1);
-
-    return 0;
+    return ff_vaapi_vpp_make_param_buffers(avctx,
+                                           VAProcFilterParameterBufferType,
+                                           &sharpness, sizeof(sharpness), 1);
 }
 
 static int misc_vaapi_filter_frame(AVFilterLink *inlink, AVFrame *input_frame)
@@ -129,9 +126,6 @@
     AVFilterLink *outlink    = avctx->outputs[0];
     VAAPIVPPContext *vpp_ctx = avctx->priv;
     AVFrame *output_frame    = NULL;
-    VASurfaceID input_surface, output_surface;
-    VARectangle input_region;
-
     VAProcPipelineParameterBuffer params;
     int err;
 
@@ -142,10 +136,6 @@
     if (vpp_ctx->va_context == VA_INVALID_ID)
         return AVERROR(EINVAL);
 
-    input_surface = (VASurfaceID)(uintptr_t)input_frame->data[3];
-    av_log(avctx, AV_LOG_DEBUG, "Using surface %#x for misc vpp input.\n",
-           input_surface);
-
     output_frame = ff_get_video_buffer(outlink, vpp_ctx->output_width,
                                        vpp_ctx->output_height);
     if (!output_frame) {
@@ -153,40 +143,24 @@
         goto fail;
     }
 
-    output_surface = (VASurfaceID)(uintptr_t)output_frame->data[3];
-    av_log(avctx, AV_LOG_DEBUG, "Using surface %#x for misc vpp output.\n",
-           output_surface);
-    memset(&params, 0, sizeof(params));
-    input_region = (VARectangle) {
-        .x      = 0,
-        .y      = 0,
-        .width  = input_frame->width,
-        .height = input_frame->height,
-    };
+    err = av_frame_copy_props(output_frame, input_frame);
+    if (err < 0)
+        goto fail;
+
+    err = ff_vaapi_vpp_init_params(avctx, &params,
+                                   input_frame, output_frame);
+    if (err < 0)
+        goto fail;
 
     if (vpp_ctx->nb_filter_buffers) {
         params.filters     = &vpp_ctx->filter_buffers[0];
         params.num_filters = vpp_ctx->nb_filter_buffers;
     }
-    params.surface = input_surface;
-    params.surface_region = &input_region;
-    params.surface_color_standard =
-        ff_vaapi_vpp_colour_standard(input_frame->colorspace);
 
-    params.output_region = NULL;
-    params.output_background_color = 0xff000000;
-    params.output_color_standard = params.surface_color_standard;
-
-    params.pipeline_flags = 0;
-    params.filter_flags = VA_FRAME_PICTURE;
-
-    err = ff_vaapi_vpp_render_picture(avctx, &params, output_surface);
+    err = ff_vaapi_vpp_render_picture(avctx, &params, output_frame);
     if (err < 0)
         goto fail;
 
-    err = av_frame_copy_props(output_frame, input_frame);
-    if (err < 0)
-        goto fail;
     av_frame_free(&input_frame);
 
     av_log(avctx, AV_LOG_DEBUG, "Filter output: %s, %ux%u (%"PRId64").\n",
diff --git a/libavfilter/vf_mix.c b/libavfilter/vf_mix.c
index d0cc7cb..f418c6f 100644
--- a/libavfilter/vf_mix.c
+++ b/libavfilter/vf_mix.c
@@ -108,7 +108,7 @@
             break;
 
         p = NULL;
-        sscanf(arg, "%f", &s->weights[i]);
+        av_sscanf(arg, "%f", &s->weights[i]);
         s->wfactor += s->weights[i];
         last = i;
     }
@@ -217,8 +217,8 @@
 {
     AVFilterContext *ctx = outlink->src;
     MixContext *s = ctx->priv;
-    AVRational time_base = ctx->inputs[0]->time_base;
     AVRational frame_rate = ctx->inputs[0]->frame_rate;
+    AVRational sar = ctx->inputs[0]->sample_aspect_ratio;
     AVFilterLink *inlink = ctx->inputs[0];
     int height = ctx->inputs[0]->h;
     int width = ctx->inputs[0]->w;
@@ -252,8 +252,8 @@
 
     outlink->w          = width;
     outlink->h          = height;
-    outlink->time_base  = time_base;
     outlink->frame_rate = frame_rate;
+    outlink->sample_aspect_ratio = sar;
 
     if ((ret = ff_framesync_init(&s->fs, ctx, s->nb_inputs)) < 0)
         return ret;
@@ -271,7 +271,10 @@
         in[i].after  = (s->duration == 1 || (s->duration == 2 && i == 0)) ? EXT_STOP : EXT_INFINITY;
     }
 
-    return ff_framesync_configure(&s->fs);
+    ret = ff_framesync_configure(&s->fs);
+    outlink->time_base = s->fs.time_base;
+
+    return ret;
 }
 
 static av_cold void uninit(AVFilterContext *ctx)
@@ -286,7 +289,7 @@
         for (i = 0; i < ctx->nb_inputs; i++)
             av_freep(&ctx->input_pads[i].name);
     } else {
-        for (i = 0; i < s->nb_frames; i++)
+        for (i = 0; i < s->nb_frames && s->frames; i++)
             av_frame_free(&s->frames[i]);
     }
     av_freep(&s->frames);
@@ -302,7 +305,7 @@
 #define FLAGS AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_FILTERING_PARAM
 
 static const AVOption mix_options[] = {
-    { "inputs", "set number of inputs", OFFSET(nb_inputs), AV_OPT_TYPE_INT, {.i64=2}, 2, INT_MAX, .flags = FLAGS },
+    { "inputs", "set number of inputs", OFFSET(nb_inputs), AV_OPT_TYPE_INT, {.i64=2}, 2, INT16_MAX, .flags = FLAGS },
     { "weights", "set weight for each input", OFFSET(weights_str), AV_OPT_TYPE_STRING, {.str="1 1"}, 0, 0, .flags = FLAGS },
     { "scale", "set scale", OFFSET(scale), AV_OPT_TYPE_FLOAT, {.dbl=0}, 0, INT16_MAX, .flags = FLAGS },
     { "duration", "how to determine end of stream", OFFSET(duration), AV_OPT_TYPE_INT, {.i64=0}, 0, 2, .flags = FLAGS, "duration" },
@@ -348,16 +351,27 @@
     ThreadData td;
     AVFrame *out;
 
+    if (s->nb_inputs == 1)
+        return ff_filter_frame(outlink, in);
+
     if (s->nb_frames < s->nb_inputs) {
         s->frames[s->nb_frames] = in;
         s->nb_frames++;
-        return 0;
+        if (s->nb_frames < s->nb_inputs)
+            return 0;
     } else {
         av_frame_free(&s->frames[0]);
         memmove(&s->frames[0], &s->frames[1], sizeof(*s->frames) * (s->nb_inputs - 1));
         s->frames[s->nb_inputs - 1] = in;
     }
 
+    if (ctx->is_disabled) {
+        out = av_frame_clone(s->frames[0]);
+        if (!out)
+            return AVERROR(ENOMEM);
+        return ff_filter_frame(outlink, out);
+    }
+
     out = ff_get_video_buffer(outlink, outlink->w, outlink->h);
     if (!out)
         return AVERROR(ENOMEM);
@@ -371,7 +385,7 @@
 }
 
 static const AVOption tmix_options[] = {
-    { "frames", "set number of successive frames to mix", OFFSET(nb_inputs), AV_OPT_TYPE_INT, {.i64=3}, 2, 128, .flags = FLAGS },
+    { "frames", "set number of successive frames to mix", OFFSET(nb_inputs), AV_OPT_TYPE_INT, {.i64=3}, 1, 128, .flags = FLAGS },
     { "weights", "set weight for each frame", OFFSET(weights_str), AV_OPT_TYPE_STRING, {.str="1 1 1"}, 0, 0, .flags = FLAGS },
     { "scale", "set scale", OFFSET(scale), AV_OPT_TYPE_FLOAT, {.dbl=0}, 0, INT16_MAX, .flags = FLAGS },
     { NULL },
@@ -398,7 +412,7 @@
     .inputs        = inputs,
     .init          = init,
     .uninit        = uninit,
-    .flags         = AVFILTER_FLAG_SLICE_THREADS,
+    .flags         = AVFILTER_FLAG_SUPPORT_TIMELINE_INTERNAL | AVFILTER_FLAG_SLICE_THREADS,
 };
 
 #endif /* CONFIG_TMIX_FILTER */
diff --git a/libavfilter/vf_neighbor.c b/libavfilter/vf_neighbor.c
index 2db1e5e..17a9b88 100644
--- a/libavfilter/vf_neighbor.c
+++ b/libavfilter/vf_neighbor.c
@@ -41,10 +41,12 @@
     int coordinates;
 
     int depth;
+    int max;
     int bpc;
 
     void (*filter)(uint8_t *dst, const uint8_t *p1, int width,
-                   int threshold, const uint8_t *coordinates[], int coord);
+                   int threshold, const uint8_t *coordinates[], int coord,
+                   int maxc);
 } NContext;
 
 static int query_formats(AVFilterContext *ctx)
@@ -62,6 +64,7 @@
         AV_PIX_FMT_YUV420P16, AV_PIX_FMT_YUV422P16, AV_PIX_FMT_YUV444P16,
         AV_PIX_FMT_YUVA420P9, AV_PIX_FMT_YUVA422P9, AV_PIX_FMT_YUVA444P9,
         AV_PIX_FMT_YUVA420P10, AV_PIX_FMT_YUVA422P10, AV_PIX_FMT_YUVA444P10,
+        AV_PIX_FMT_YUVA422P12, AV_PIX_FMT_YUVA444P12,
         AV_PIX_FMT_YUVA420P16, AV_PIX_FMT_YUVA422P16, AV_PIX_FMT_YUVA444P16,
         AV_PIX_FMT_GBRP, AV_PIX_FMT_GBRP9, AV_PIX_FMT_GBRP10,
         AV_PIX_FMT_GBRP12, AV_PIX_FMT_GBRP14, AV_PIX_FMT_GBRP16,
@@ -74,7 +77,8 @@
 }
 
 static void erosion(uint8_t *dst, const uint8_t *p1, int width,
-                    int threshold, const uint8_t *coordinates[], int coord)
+                    int threshold, const uint8_t *coordinates[], int coord,
+                    int maxc)
 {
     int x, i;
 
@@ -94,7 +98,8 @@
 }
 
 static void erosion16(uint8_t *dstp, const uint8_t *p1, int width,
-                      int threshold, const uint8_t *coordinates[], int coord)
+                      int threshold, const uint8_t *coordinates[], int coord,
+                      int maxc)
 {
     uint16_t *dst = (uint16_t *)dstp;
     int x, i;
@@ -115,7 +120,8 @@
 }
 
 static void dilation(uint8_t *dst, const uint8_t *p1, int width,
-                     int threshold, const uint8_t *coordinates[], int coord)
+                     int threshold, const uint8_t *coordinates[], int coord,
+                     int maxc)
 {
     int x, i;
 
@@ -135,14 +141,15 @@
 }
 
 static void dilation16(uint8_t *dstp, const uint8_t *p1, int width,
-                       int threshold, const uint8_t *coordinates[], int coord)
+                       int threshold, const uint8_t *coordinates[], int coord,
+                       int maxc)
 {
     uint16_t *dst = (uint16_t *)dstp;
     int x, i;
 
     for (x = 0; x < width; x++) {
         int max = AV_RN16A(&p1[x * 2]);
-        int limit = FFMIN(max + threshold, 255);
+        int limit = FFMIN(max + threshold, maxc);
 
         for (i = 0; i < 8; i++) {
             if (coord & (1 << i)) {
@@ -156,7 +163,8 @@
 }
 
 static void deflate(uint8_t *dst, const uint8_t *p1, int width,
-                    int threshold, const uint8_t *coordinates[], int coord)
+                    int threshold, const uint8_t *coordinates[], int coord,
+                    int maxc)
 {
     int x, i;
 
@@ -171,7 +179,8 @@
 }
 
 static void deflate16(uint8_t *dstp, const uint8_t *p1, int width,
-                      int threshold, const uint8_t *coordinates[], int coord)
+                      int threshold, const uint8_t *coordinates[], int coord,
+                      int maxc)
 {
     uint16_t *dst = (uint16_t *)dstp;
     int x, i;
@@ -182,12 +191,13 @@
 
         for (i = 0; i < 8; sum += AV_RN16A(coordinates[i++] + x * 2));
 
-        dst[x] = FFMAX(FFMIN(sum / 8, p1[x]), limit);
+        dst[x] = FFMAX(FFMIN(sum / 8, AV_RN16A(&p1[2 * x])), limit);
     }
 }
 
 static void inflate(uint8_t *dst, const uint8_t *p1, int width,
-                    int threshold, const uint8_t *coordinates[], int coord)
+                    int threshold, const uint8_t *coordinates[], int coord,
+                    int maxc)
 {
     int x, i;
 
@@ -202,18 +212,19 @@
 }
 
 static void inflate16(uint8_t *dstp, const uint8_t *p1, int width,
-                      int threshold, const uint8_t *coordinates[], int coord)
+                      int threshold, const uint8_t *coordinates[], int coord,
+                      int maxc)
 {
     uint16_t *dst = (uint16_t *)dstp;
     int x, i;
 
     for (x = 0; x < width; x++) {
         int sum = 0;
-        int limit = FFMIN(AV_RN16A(&p1[2 * x]) + threshold, 255);
+        int limit = FFMIN(AV_RN16A(&p1[2 * x]) + threshold, maxc);
 
         for (i = 0; i < 8; sum += AV_RN16A(coordinates[i++] + x * 2));
 
-        dst[x] = FFMIN(FFMAX(sum / 8, p1[x]), limit);
+        dst[x] = FFMIN(FFMAX(sum / 8, AV_RN16A(&p1[x * 2])), limit);
     }
 }
 
@@ -224,6 +235,7 @@
     const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(inlink->format);
 
     s->depth = desc->comp[0].depth;
+    s->max = (1 << s->depth) - 1;
     s->bpc = (s->depth + 7) / 8;
 
     s->planewidth[1] = s->planewidth[2] = AV_CEIL_RSHIFT(inlink->w, desc->log2_chroma_w);
@@ -285,9 +297,11 @@
                                                src + (width - 2) * bpc,                                                      src + (width - 2) * bpc,
                                                src + (width - 2) * bpc + ph * stride, src + (width - 1) * bpc + ph * stride, src + (width - 2) * bpc + ph * stride};
 
-            s->filter(dst,                     src,                     1,         threshold, coordinateslb, s->coordinates);
-            s->filter(dst          + 1  * bpc, src          + 1  * bpc, width - 2, threshold, coordinates,   s->coordinates);
-            s->filter(dst + (width - 1) * bpc, src + (width - 1) * bpc, 1,         threshold, coordinatesrb, s->coordinates);
+            s->filter(dst,                         src,                     1,         threshold, coordinateslb, s->coordinates, s->max);
+            if (width > 1) {
+                s->filter(dst          + 1  * bpc, src          + 1  * bpc, width - 2, threshold, coordinates,   s->coordinates, s->max);
+                s->filter(dst + (width - 1) * bpc, src + (width - 1) * bpc, 1,         threshold, coordinatesrb, s->coordinates, s->max);
+            }
 
             src += stride;
             dst += dstride;
@@ -339,7 +353,7 @@
 };
 
 #define OFFSET(x) offsetof(NContext, x)
-#define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM
+#define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_RUNTIME_PARAM
 
 #define DEFINE_NEIGHBOR_FILTER(name_, description_)          \
 AVFILTER_DEFINE_CLASS(name_);                                \
@@ -354,6 +368,7 @@
     .outputs       = neighbor_outputs,                       \
     .flags         = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC| \
                      AVFILTER_FLAG_SLICE_THREADS,            \
+    .process_command = ff_filter_process_command,            \
 }
 
 #if CONFIG_EROSION_FILTER
diff --git a/libavfilter/vf_nlmeans.c b/libavfilter/vf_nlmeans.c
index 82e779c..06233b0 100644
--- a/libavfilter/vf_nlmeans.c
+++ b/libavfilter/vf_nlmeans.c
@@ -43,9 +43,6 @@
     float sum;
 };
 
-#define WEIGHT_LUT_NBITS 9
-#define WEIGHT_LUT_SIZE  (1<<WEIGHT_LUT_NBITS)
-
 typedef struct NLMeansContext {
     const AVClass *class;
     int nb_planes;
@@ -62,8 +59,7 @@
     ptrdiff_t ii_lz_32;                         // linesize in 32-bit units of the integral image
     struct weighted_avg *wa;                    // weighted average of every pixel
     ptrdiff_t wa_linesize;                      // linesize for wa in struct size unit
-    float weight_lut[WEIGHT_LUT_SIZE];          // lookup table mapping (scaled) patch differences to their associated weights
-    float pdiff_lut_scale;                      // scale factor for patch differences before looking into the LUT
+    float *weight_lut;                          // lookup table mapping (scaled) patch differences to their associated weights
     uint32_t max_meaningful_diff;               // maximum difference considered (if the patch difference is too high we ignore the pixel)
     NLMeansDSPContext dsp;
 } NLMeansContext;
@@ -401,8 +397,7 @@
             const uint32_t patch_diff_sq = e - d - b + a;
 
             if (patch_diff_sq < s->max_meaningful_diff) {
-                const unsigned weight_lut_idx = patch_diff_sq * s->pdiff_lut_scale;
-                const float weight = s->weight_lut[weight_lut_idx]; // exp(-patch_diff_sq * s->pdiff_scale)
+                const float weight = s->weight_lut[patch_diff_sq]; // exp(-patch_diff_sq * s->pdiff_scale)
                 wa[x].total_weight += weight;
                 wa[x].sum += weight * src[x];
             }
@@ -424,7 +419,7 @@
             // Also weight the centered pixel
             wa[x].total_weight += 1.f;
             wa[x].sum += 1.f * src[x];
-            dst[x] = av_clip_uint8(wa[x].sum / wa[x].total_weight);
+            dst[x] = av_clip_uint8(wa[x].sum / wa[x].total_weight + 0.5f);
         }
         dst += dst_linesize;
         src += src_linesize;
@@ -526,11 +521,12 @@
     const double h = s->sigma * 10.;
 
     s->pdiff_scale = 1. / (h * h);
-    s->max_meaningful_diff = -log(1/255.) / s->pdiff_scale;
-    s->pdiff_lut_scale = 1./s->max_meaningful_diff * WEIGHT_LUT_SIZE;
-    av_assert0((s->max_meaningful_diff - 1) * s->pdiff_lut_scale < FF_ARRAY_ELEMS(s->weight_lut));
-    for (i = 0; i < WEIGHT_LUT_SIZE; i++)
-        s->weight_lut[i] = exp(-i / s->pdiff_lut_scale * s->pdiff_scale);
+    s->max_meaningful_diff = log(255.) / s->pdiff_scale;
+    s->weight_lut = av_calloc(s->max_meaningful_diff, sizeof(*s->weight_lut));
+    if (!s->weight_lut)
+        return AVERROR(ENOMEM);
+    for (i = 0; i < s->max_meaningful_diff; i++)
+        s->weight_lut[i] = exp(-i * s->pdiff_scale);
 
     CHECK_ODD_FIELD(research_size,   "Luma research window");
     CHECK_ODD_FIELD(patch_size,      "Luma patch");
@@ -558,6 +554,7 @@
 static av_cold void uninit(AVFilterContext *ctx)
 {
     NLMeansContext *s = ctx->priv;
+    av_freep(&s->weight_lut);
     av_freep(&s->ii_orig);
     av_freep(&s->wa);
 }
diff --git a/libavfilter/vf_nlmeans_opencl.c b/libavfilter/vf_nlmeans_opencl.c
new file mode 100644
index 0000000..e57b5e0
--- /dev/null
+++ b/libavfilter/vf_nlmeans_opencl.c
@@ -0,0 +1,443 @@
+/*
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+#include <float.h>
+
+#include "libavutil/avassert.h"
+#include "libavutil/common.h"
+#include "libavutil/imgutils.h"
+#include "libavutil/mem.h"
+#include "libavutil/opt.h"
+#include "libavutil/pixdesc.h"
+
+#include "avfilter.h"
+#include "internal.h"
+#include "opencl.h"
+#include "opencl_source.h"
+#include "video.h"
+
+// TODO:
+//      the integral image may overflow 32bit, consider using 64bit
+
+static const enum AVPixelFormat supported_formats[] = {
+    AV_PIX_FMT_YUV420P,
+    AV_PIX_FMT_YUV444P,
+    AV_PIX_FMT_GBRP,
+};
+
+static int is_format_supported(enum AVPixelFormat fmt)
+{
+    int i;
+
+    for (i = 0; i < FF_ARRAY_ELEMS(supported_formats); i++)
+        if (supported_formats[i] == fmt)
+            return 1;
+    return 0;
+}
+
+typedef struct NLMeansOpenCLContext {
+    OpenCLFilterContext   ocf;
+    int                   initialised;
+    cl_kernel             vert_kernel;
+    cl_kernel             horiz_kernel;
+    cl_kernel             accum_kernel;
+    cl_kernel             average_kernel;
+    cl_mem                integral_img;
+    cl_mem                weight;
+    cl_mem                sum;
+    cl_mem                overflow; // overflow in integral image?
+    double                sigma;
+    float                 h;
+    int                   chroma_w;
+    int                   chroma_h;
+    int                   patch_size;
+    int                   patch_size_uv;
+    int                   research_size;
+    int                   research_size_uv;
+    cl_command_queue      command_queue;
+} NLMeansOpenCLContext;
+
+static int nlmeans_opencl_init(AVFilterContext *avctx, int width, int height)
+{
+    NLMeansOpenCLContext *ctx = avctx->priv;
+    cl_int cle;
+    int err;
+    int weight_buf_size = width * height * sizeof(float);
+
+    ctx->h = ctx->sigma * 10;
+    if (!(ctx->research_size & 1)) {
+        ctx->research_size |= 1;
+        av_log(avctx, AV_LOG_WARNING,
+               "research_size should be odd, set to %d",
+               ctx->research_size);
+    }
+
+    if (!(ctx->patch_size & 1)) {
+        ctx->patch_size |= 1;
+        av_log(avctx, AV_LOG_WARNING,
+               "patch_size should be odd, set to %d",
+               ctx->patch_size);
+    }
+
+    if (!ctx->research_size_uv)
+        ctx->research_size_uv = ctx->research_size;
+    if (!ctx->patch_size_uv)
+        ctx->patch_size_uv = ctx->patch_size;
+
+    err = ff_opencl_filter_load_program(avctx, &ff_opencl_source_nlmeans, 1);
+    if (err < 0)
+        goto fail;
+
+    ctx->command_queue = clCreateCommandQueue(ctx->ocf.hwctx->context,
+                                              ctx->ocf.hwctx->device_id,
+                                              0, &cle);
+    CL_FAIL_ON_ERROR(AVERROR(EIO), "Failed to create OpenCL "
+                     "command queue %d.\n", cle);
+
+    ctx->vert_kernel = clCreateKernel(ctx->ocf.program,
+                                      "vert_sum", &cle);
+    CL_FAIL_ON_ERROR(AVERROR(EIO), "Failed to create "
+                     "vert_sum kernel %d.\n", cle);
+
+    ctx->horiz_kernel = clCreateKernel(ctx->ocf.program,
+                                       "horiz_sum", &cle);
+    CL_FAIL_ON_ERROR(AVERROR(EIO), "Failed to create "
+                     "horiz_sum kernel %d.\n", cle);
+
+    ctx->accum_kernel = clCreateKernel(ctx->ocf.program,
+                                       "weight_accum", &cle);
+    CL_FAIL_ON_ERROR(AVERROR(EIO), "Failed to create "
+                     "accum kernel %d.\n", cle);
+
+    ctx->average_kernel = clCreateKernel(ctx->ocf.program,
+                                         "average", &cle);
+    CL_FAIL_ON_ERROR(AVERROR(EIO), "Failed to create "
+                     "average kernel %d.\n", cle);
+
+    ctx->integral_img = clCreateBuffer(ctx->ocf.hwctx->context, 0,
+                                       4 * width * height * sizeof(cl_int),
+                                       NULL, &cle);
+    CL_FAIL_ON_ERROR(AVERROR(EIO), "Failed to create "
+                     "integral image %d.\n", cle);
+
+    ctx->weight = clCreateBuffer(ctx->ocf.hwctx->context, 0,
+                                 weight_buf_size, NULL, &cle);
+    CL_FAIL_ON_ERROR(AVERROR(EIO), "Failed to create "
+                     "weight buffer %d.\n", cle);
+
+    ctx->sum = clCreateBuffer(ctx->ocf.hwctx->context, 0,
+                              weight_buf_size, NULL, &cle);
+    CL_FAIL_ON_ERROR(AVERROR(EIO), "Failed to create "
+                     "sum buffer %d.\n", cle);
+
+    ctx->overflow = clCreateBuffer(ctx->ocf.hwctx->context, 0,
+                                   sizeof(cl_int), NULL, &cle);
+    CL_FAIL_ON_ERROR(AVERROR(EIO), "Failed to create "
+                     "overflow buffer %d.\n", cle);
+
+    ctx->initialised = 1;
+    return 0;
+
+fail:
+    CL_RELEASE_KERNEL(ctx->vert_kernel);
+    CL_RELEASE_KERNEL(ctx->horiz_kernel);
+    CL_RELEASE_KERNEL(ctx->accum_kernel);
+    CL_RELEASE_KERNEL(ctx->average_kernel);
+
+    CL_RELEASE_MEMORY(ctx->integral_img);
+    CL_RELEASE_MEMORY(ctx->weight);
+    CL_RELEASE_MEMORY(ctx->sum);
+    CL_RELEASE_MEMORY(ctx->overflow);
+
+    CL_RELEASE_QUEUE(ctx->command_queue);
+    return err;
+}
+
+static int nlmeans_plane(AVFilterContext *avctx, cl_mem dst, cl_mem src,
+                         cl_int width, cl_int height, cl_int p, cl_int r)
+{
+    NLMeansOpenCLContext *ctx = avctx->priv;
+    const float zero = 0.0f;
+    const size_t worksize1[] = {height};
+    const size_t worksize2[] = {width};
+    const size_t worksize3[2] = {width, height};
+    int i, dx, dy, err = 0, weight_buf_size;
+    cl_int cle;
+    int nb_pixel, *tmp = NULL, idx = 0;
+    cl_int *dxdy = NULL;
+
+    weight_buf_size = width * height * sizeof(float);
+    cle = clEnqueueFillBuffer(ctx->command_queue, ctx->weight,
+                              &zero, sizeof(float), 0, weight_buf_size,
+                              0, NULL, NULL);
+    CL_FAIL_ON_ERROR(AVERROR(EIO), "Failed to fill weight buffer: %d.\n",
+                     cle);
+    cle = clEnqueueFillBuffer(ctx->command_queue, ctx->sum,
+                              &zero, sizeof(float), 0, weight_buf_size,
+                              0, NULL, NULL);
+    CL_FAIL_ON_ERROR(AVERROR(EIO), "Failed to fill sum buffer: %d.\n",
+                     cle);
+
+    nb_pixel = (2 * r + 1) * (2 * r + 1) - 1;
+    dxdy = av_malloc(nb_pixel * 2 * sizeof(cl_int));
+    tmp = av_malloc(nb_pixel * 2 * sizeof(int));
+
+    if (!dxdy || !tmp)
+        goto fail;
+
+    for (dx = -r; dx <= r; dx++) {
+        for (dy = -r; dy <= r; dy++) {
+            if (dx || dy) {
+                tmp[idx++] = dx;
+                tmp[idx++] = dy;
+            }
+        }
+    }
+    // repack dx/dy seperately, as we want to do four pairs of dx/dy in a batch
+    for (i = 0; i < nb_pixel / 4; i++) {
+        dxdy[i * 8] = tmp[i * 8];         // dx0
+        dxdy[i * 8 + 1] = tmp[i * 8 + 2]; // dx1
+        dxdy[i * 8 + 2] = tmp[i * 8 + 4]; // dx2
+        dxdy[i * 8 + 3] = tmp[i * 8 + 6]; // dx3
+        dxdy[i * 8 + 4] = tmp[i * 8 + 1]; // dy0
+        dxdy[i * 8 + 5] = tmp[i * 8 + 3]; // dy1
+        dxdy[i * 8 + 6] = tmp[i * 8 + 5]; // dy2
+        dxdy[i * 8 + 7] = tmp[i * 8 + 7]; // dy3
+    }
+    av_freep(&tmp);
+
+    for (i = 0; i < nb_pixel / 4; i++) {
+        cl_int *dx_cur = dxdy + 8 * i;
+        cl_int *dy_cur = dxdy + 8 * i + 4;
+
+        // horizontal pass
+        // integral(x,y) = sum([u(v,y) - u(v+dx,y+dy)]^2) for v in [0, x]
+        CL_SET_KERNEL_ARG(ctx->horiz_kernel, 0, cl_mem, &ctx->integral_img);
+        CL_SET_KERNEL_ARG(ctx->horiz_kernel, 1, cl_mem, &src);
+        CL_SET_KERNEL_ARG(ctx->horiz_kernel, 2, cl_int, &width);
+        CL_SET_KERNEL_ARG(ctx->horiz_kernel, 3, cl_int, &height);
+        CL_SET_KERNEL_ARG(ctx->horiz_kernel, 4, cl_int4, dx_cur);
+        CL_SET_KERNEL_ARG(ctx->horiz_kernel, 5, cl_int4, dy_cur);
+        cle = clEnqueueNDRangeKernel(ctx->command_queue, ctx->horiz_kernel, 1,
+                               NULL, worksize1, NULL, 0, NULL, NULL);
+        CL_FAIL_ON_ERROR(AVERROR(EIO), "Failed to enqueue horiz_kernel: %d.\n",
+                         cle);
+        // vertical pass
+        // integral(x, y) = sum(integral(x, v)) for v in [0, y]
+        CL_SET_KERNEL_ARG(ctx->vert_kernel, 0, cl_mem, &ctx->integral_img);
+        CL_SET_KERNEL_ARG(ctx->vert_kernel, 1, cl_mem, &ctx->overflow);
+        CL_SET_KERNEL_ARG(ctx->vert_kernel, 2, cl_int, &width);
+        CL_SET_KERNEL_ARG(ctx->vert_kernel, 3, cl_int, &height);
+        cle = clEnqueueNDRangeKernel(ctx->command_queue, ctx->vert_kernel,
+                                     1, NULL, worksize2, NULL, 0, NULL, NULL);
+        CL_FAIL_ON_ERROR(AVERROR(EIO), "Failed to enqueue vert_kernel: %d.\n",
+                         cle);
+
+        // accumulate weights
+        CL_SET_KERNEL_ARG(ctx->accum_kernel, 0, cl_mem, &ctx->sum);
+        CL_SET_KERNEL_ARG(ctx->accum_kernel, 1, cl_mem, &ctx->weight);
+        CL_SET_KERNEL_ARG(ctx->accum_kernel, 2, cl_mem, &ctx->integral_img);
+        CL_SET_KERNEL_ARG(ctx->accum_kernel, 3, cl_mem, &src);
+        CL_SET_KERNEL_ARG(ctx->accum_kernel, 4, cl_int, &width);
+        CL_SET_KERNEL_ARG(ctx->accum_kernel, 5, cl_int, &height);
+        CL_SET_KERNEL_ARG(ctx->accum_kernel, 6, cl_int, &p);
+        CL_SET_KERNEL_ARG(ctx->accum_kernel, 7, cl_float, &ctx->h);
+        CL_SET_KERNEL_ARG(ctx->accum_kernel, 8, cl_int4, dx_cur);
+        CL_SET_KERNEL_ARG(ctx->accum_kernel, 9, cl_int4, dy_cur);
+        cle = clEnqueueNDRangeKernel(ctx->command_queue, ctx->accum_kernel,
+                                     2, NULL, worksize3, NULL, 0, NULL, NULL);
+        CL_FAIL_ON_ERROR(AVERROR(EIO), "Failed to enqueue kernel: %d.\n", cle);
+    }
+    av_freep(&dxdy);
+
+    // average
+    CL_SET_KERNEL_ARG(ctx->average_kernel, 0, cl_mem, &dst);
+    CL_SET_KERNEL_ARG(ctx->average_kernel, 1, cl_mem, &src);
+    CL_SET_KERNEL_ARG(ctx->average_kernel, 2, cl_mem, &ctx->sum);
+    CL_SET_KERNEL_ARG(ctx->average_kernel, 3, cl_mem, &ctx->weight);
+    cle = clEnqueueNDRangeKernel(ctx->command_queue, ctx->average_kernel, 2,
+                                 NULL, worksize3, NULL, 0, NULL, NULL);
+    CL_FAIL_ON_ERROR(AVERROR(EIO), "Failed to enqueue average kernel: %d.\n",
+                     cle);
+    cle = clFlush(ctx->command_queue);
+    CL_FAIL_ON_ERROR(AVERROR(EIO), "Failed to flush command queue: %d.\n", cle);
+fail:
+    if (tmp)
+        av_freep(&tmp);
+    if (dxdy)
+        av_freep(&dxdy);
+    return err;
+}
+
+static int nlmeans_opencl_filter_frame(AVFilterLink *inlink, AVFrame *input)
+{
+    AVFilterContext    *avctx = inlink->dst;
+    AVFilterLink     *outlink = avctx->outputs[0];
+    NLMeansOpenCLContext *ctx = avctx->priv;
+    AVFrame *output = NULL;
+    AVHWFramesContext *input_frames_ctx;
+    const AVPixFmtDescriptor *desc;
+    enum AVPixelFormat in_format;
+    cl_mem src, dst;
+    const cl_int zero = 0;
+    int w, h, err, cle, overflow, p, patch, research;
+
+    av_log(ctx, AV_LOG_DEBUG, "Filter input: %s, %ux%u (%"PRId64").\n",
+           av_get_pix_fmt_name(input->format),
+           input->width, input->height, input->pts);
+
+    if (!input->hw_frames_ctx)
+        return AVERROR(EINVAL);
+    input_frames_ctx = (AVHWFramesContext*)input->hw_frames_ctx->data;
+    in_format = input_frames_ctx->sw_format;
+
+    output = ff_get_video_buffer(outlink, outlink->w, outlink->h);
+    if (!output) {
+        err = AVERROR(ENOMEM);
+        goto fail;
+    }
+
+    err = av_frame_copy_props(output, input);
+    if (err < 0)
+        goto fail;
+
+    if (!ctx->initialised) {
+        desc = av_pix_fmt_desc_get(in_format);
+        if (!is_format_supported(in_format)) {
+            err = AVERROR(EINVAL);
+            av_log(avctx, AV_LOG_ERROR, "input format %s not supported\n",
+                   av_get_pix_fmt_name(in_format));
+            goto fail;
+        }
+        ctx->chroma_w = AV_CEIL_RSHIFT(inlink->w, desc->log2_chroma_w);
+        ctx->chroma_h = AV_CEIL_RSHIFT(inlink->h, desc->log2_chroma_h);
+
+        err = nlmeans_opencl_init(avctx, inlink->w, inlink->h);
+        if (err < 0)
+            goto fail;
+    }
+
+    cle = clEnqueueWriteBuffer(ctx->command_queue, ctx->overflow, CL_FALSE,
+                               0, sizeof(cl_int), &zero, 0, NULL, NULL);
+    CL_FAIL_ON_ERROR(AVERROR(EIO), "Failed to initialize overflow"
+                     "detection buffer %d.\n", cle);
+
+    for (p = 0; p < FF_ARRAY_ELEMS(output->data); p++) {
+        src = (cl_mem) input->data[p];
+        dst = (cl_mem) output->data[p];
+
+        if (!dst)
+            break;
+        av_assert0(src);
+        w = p ? ctx->chroma_w : inlink->w;
+        h = p ? ctx->chroma_h : inlink->h;
+        patch = (p ? ctx->patch_size_uv : ctx->patch_size) / 2;
+        research = (p ? ctx->research_size_uv : ctx->research_size) / 2;
+        err = nlmeans_plane(avctx, dst, src, w, h, patch, research);
+        if (err < 0)
+            goto fail;
+    }
+    // overflow occurred?
+    cle = clEnqueueReadBuffer(ctx->command_queue, ctx->overflow, CL_FALSE,
+                              0, sizeof(cl_int), &overflow, 0, NULL, NULL);
+    CL_FAIL_ON_ERROR(AVERROR(EIO), "Failed to read overflow: %d.\n", cle);
+
+    cle = clFinish(ctx->command_queue);
+    CL_FAIL_ON_ERROR(AVERROR(EIO), "Failed to finish kernel: %d.\n", cle);
+
+    if (overflow > 0)
+        av_log(avctx, AV_LOG_ERROR, "integral image overflow %d\n", overflow);
+
+    av_frame_free(&input);
+
+    av_log(ctx, AV_LOG_DEBUG, "Filter output: %s, %ux%u (%"PRId64").\n",
+           av_get_pix_fmt_name(output->format),
+           output->width, output->height, output->pts);
+
+    return ff_filter_frame(outlink, output);
+
+fail:
+    clFinish(ctx->command_queue);
+    av_frame_free(&input);
+    av_frame_free(&output);
+    return err;
+}
+
+static av_cold void nlmeans_opencl_uninit(AVFilterContext *avctx)
+{
+    NLMeansOpenCLContext *ctx = avctx->priv;
+    cl_int cle;
+
+    CL_RELEASE_KERNEL(ctx->vert_kernel);
+    CL_RELEASE_KERNEL(ctx->horiz_kernel);
+    CL_RELEASE_KERNEL(ctx->accum_kernel);
+    CL_RELEASE_KERNEL(ctx->average_kernel);
+
+    CL_RELEASE_MEMORY(ctx->integral_img);
+    CL_RELEASE_MEMORY(ctx->weight);
+    CL_RELEASE_MEMORY(ctx->sum);
+    CL_RELEASE_MEMORY(ctx->overflow);
+
+    CL_RELEASE_QUEUE(ctx->command_queue);
+
+    ff_opencl_filter_uninit(avctx);
+}
+
+#define OFFSET(x) offsetof(NLMeansOpenCLContext, x)
+#define FLAGS (AV_OPT_FLAG_FILTERING_PARAM | AV_OPT_FLAG_VIDEO_PARAM)
+static const AVOption nlmeans_opencl_options[] = {
+    { "s",  "denoising strength", OFFSET(sigma), AV_OPT_TYPE_DOUBLE, { .dbl = 1.0 }, 1.0, 30.0, FLAGS },
+    { "p",  "patch size",                   OFFSET(patch_size),    AV_OPT_TYPE_INT, { .i64 = 2*3+1 }, 0, 99, FLAGS },
+    { "pc", "patch size for chroma planes", OFFSET(patch_size_uv), AV_OPT_TYPE_INT, { .i64 = 0 },     0, 99, FLAGS },
+    { "r",  "research window",                   OFFSET(research_size),    AV_OPT_TYPE_INT, { .i64 = 7*2+1 }, 0, 99, FLAGS },
+    { "rc", "research window for chroma planes", OFFSET(research_size_uv), AV_OPT_TYPE_INT, { .i64 = 0 },     0, 99, FLAGS },
+    { NULL }
+};
+
+AVFILTER_DEFINE_CLASS(nlmeans_opencl);
+
+static const AVFilterPad nlmeans_opencl_inputs[] = {
+    {
+        .name         = "default",
+        .type         = AVMEDIA_TYPE_VIDEO,
+        .filter_frame = &nlmeans_opencl_filter_frame,
+        .config_props = &ff_opencl_filter_config_input,
+    },
+    { NULL }
+};
+
+static const AVFilterPad nlmeans_opencl_outputs[] = {
+    {
+        .name         = "default",
+        .type         = AVMEDIA_TYPE_VIDEO,
+        .config_props = &ff_opencl_filter_config_output,
+    },
+    { NULL }
+};
+
+AVFilter ff_vf_nlmeans_opencl = {
+    .name           = "nlmeans_opencl",
+    .description    = NULL_IF_CONFIG_SMALL("Non-local means denoiser through OpenCL"),
+    .priv_size      = sizeof(NLMeansOpenCLContext),
+    .priv_class     = &nlmeans_opencl_class,
+    .init           = &ff_opencl_filter_init,
+    .uninit         = &nlmeans_opencl_uninit,
+    .query_formats  = &ff_opencl_filter_query_formats,
+    .inputs         = nlmeans_opencl_inputs,
+    .outputs        = nlmeans_opencl_outputs,
+    .flags_internal = FF_FILTER_FLAG_HWFRAME_AWARE,
+};
diff --git a/libavfilter/vf_normalize.c b/libavfilter/vf_normalize.c
index 5c1fe98..e2e00b1 100644
--- a/libavfilter/vf_normalize.c
+++ b/libavfilter/vf_normalize.c
@@ -73,13 +73,26 @@
  */
 
 #include "libavutil/imgutils.h"
+#include "libavutil/intreadwrite.h"
 #include "libavutil/opt.h"
 #include "libavutil/pixdesc.h"
 #include "avfilter.h"
+#include "drawutils.h"
 #include "formats.h"
 #include "internal.h"
 #include "video.h"
 
+typedef struct NormalizeHistory {
+    uint16_t *history;      // History entries.
+    uint64_t history_sum;   // Sum of history entries.
+} NormalizeHistory;
+
+typedef struct NormalizeLocal {
+    uint16_t in;    // Original input byte value for this frame.
+    float smoothed; // Smoothed input value [0,255].
+    float out;      // Output value [0,255]
+} NormalizeLocal;
+
 typedef struct NormalizeContext {
     const AVClass *class;
 
@@ -90,67 +103,203 @@
     float independence;
     float strength;
 
-    int co[4];          // Offsets to R,G,B,A bytes respectively in each pixel
+    uint8_t co[4];      // Offsets to R,G,B,A bytes respectively in each pixel
+    int depth;
+    int sblackpt[4];
+    int swhitept[4];
     int num_components; // Number of components in the pixel format
+    int step;
     int history_len;    // Number of frames to average; based on smoothing factor
     int frame_num;      // Increments on each frame, starting from 0.
 
     // Per-extremum, per-channel history, for temporal smoothing.
-    struct {
-        uint8_t *history;       // History entries.
-        uint32_t history_sum;   // Sum of history entries.
-    } min[3], max[3];           // Min and max for each channel in {R,G,B}.
-    uint8_t *history_mem;       // Single allocation for above history entries
+    NormalizeHistory min[3], max[3];           // Min and max for each channel in {R,G,B}.
+    uint16_t *history_mem;       // Single allocation for above history entries
 
+    uint16_t lut[3][65536];    // Lookup table
+
+    void (*find_min_max)(struct NormalizeContext *s, AVFrame *in, NormalizeLocal min[3], NormalizeLocal max[3]);
+    void (*process)(struct NormalizeContext *s, AVFrame *in, AVFrame *out);
 } NormalizeContext;
 
 #define OFFSET(x) offsetof(NormalizeContext, x)
 #define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
+#define FLAGSR AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_RUNTIME_PARAM
 
 static const AVOption normalize_options[] = {
-    { "blackpt",  "output color to which darkest input color is mapped",  OFFSET(blackpt), AV_OPT_TYPE_COLOR, { .str = "black" }, CHAR_MIN, CHAR_MAX, FLAGS },
-    { "whitept",  "output color to which brightest input color is mapped",  OFFSET(whitept), AV_OPT_TYPE_COLOR, { .str = "white" }, CHAR_MIN, CHAR_MAX, FLAGS },
+    { "blackpt",  "output color to which darkest input color is mapped",  OFFSET(blackpt), AV_OPT_TYPE_COLOR, { .str = "black" }, 0, 0, FLAGSR },
+    { "whitept",  "output color to which brightest input color is mapped",  OFFSET(whitept), AV_OPT_TYPE_COLOR, { .str = "white" }, 0, 0, FLAGSR },
     { "smoothing",  "amount of temporal smoothing of the input range, to reduce flicker", OFFSET(smoothing), AV_OPT_TYPE_INT, {.i64=0}, 0, INT_MAX/8, FLAGS },
-    { "independence", "proportion of independent to linked channel normalization", OFFSET(independence), AV_OPT_TYPE_FLOAT, {.dbl=1.0}, 0.0, 1.0, FLAGS },
-    { "strength", "strength of filter, from no effect to full normalization", OFFSET(strength), AV_OPT_TYPE_FLOAT, {.dbl=1.0}, 0.0, 1.0, FLAGS },
+    { "independence", "proportion of independent to linked channel normalization", OFFSET(independence), AV_OPT_TYPE_FLOAT, {.dbl=1.0}, 0.0, 1.0, FLAGSR },
+    { "strength", "strength of filter, from no effect to full normalization", OFFSET(strength), AV_OPT_TYPE_FLOAT, {.dbl=1.0}, 0.0, 1.0, FLAGSR },
     { NULL }
 };
 
 AVFILTER_DEFINE_CLASS(normalize);
 
+static void find_min_max(NormalizeContext *s, AVFrame *in, NormalizeLocal min[3], NormalizeLocal max[3])
+{
+    for (int c = 0; c < 3; c++)
+        min[c].in = max[c].in = in->data[0][s->co[c]];
+    for (int y = 0; y < in->height; y++) {
+        uint8_t *inp = in->data[0] + y * in->linesize[0];
+        for (int x = 0; x < in->width; x++) {
+            for (int c = 0; c < 3; c++) {
+                min[c].in = FFMIN(min[c].in, inp[s->co[c]]);
+                max[c].in = FFMAX(max[c].in, inp[s->co[c]]);
+            }
+            inp += s->step;
+        }
+    }
+}
+
+static void process(NormalizeContext *s, AVFrame *in, AVFrame *out)
+{
+    for (int y = 0; y < in->height; y++) {
+        uint8_t *inp = in->data[0] + y * in->linesize[0];
+        uint8_t *outp = out->data[0] + y * out->linesize[0];
+        for (int x = 0; x < in->width; x++) {
+            for (int c = 0; c < 3; c++)
+                outp[s->co[c]] = s->lut[c][inp[s->co[c]]];
+            if (s->num_components == 4)
+                // Copy alpha as-is.
+                outp[s->co[3]] = inp[s->co[3]];
+            inp += s->step;
+            outp += s->step;
+        }
+    }
+}
+
+static void find_min_max_planar(NormalizeContext *s, AVFrame *in, NormalizeLocal min[3], NormalizeLocal max[3])
+{
+    min[0].in = max[0].in = in->data[2][0];
+    min[1].in = max[1].in = in->data[0][0];
+    min[2].in = max[2].in = in->data[1][0];
+    for (int y = 0; y < in->height; y++) {
+        uint8_t *inrp = in->data[2] + y * in->linesize[2];
+        uint8_t *ingp = in->data[0] + y * in->linesize[0];
+        uint8_t *inbp = in->data[1] + y * in->linesize[1];
+        for (int x = 0; x < in->width; x++) {
+            min[0].in = FFMIN(min[0].in, inrp[x]);
+            max[0].in = FFMAX(max[0].in, inrp[x]);
+            min[1].in = FFMIN(min[1].in, ingp[x]);
+            max[1].in = FFMAX(max[1].in, ingp[x]);
+            min[2].in = FFMIN(min[2].in, inbp[x]);
+            max[2].in = FFMAX(max[2].in, inbp[x]);
+        }
+    }
+}
+
+static void process_planar(NormalizeContext *s, AVFrame *in, AVFrame *out)
+{
+    for (int y = 0; y < in->height; y++) {
+        uint8_t *inrp = in->data[2] + y * in->linesize[2];
+        uint8_t *ingp = in->data[0] + y * in->linesize[0];
+        uint8_t *inbp = in->data[1] + y * in->linesize[1];
+        uint8_t *inap = in->data[3] + y * in->linesize[3];
+        uint8_t *outrp = out->data[2] + y * out->linesize[2];
+        uint8_t *outgp = out->data[0] + y * out->linesize[0];
+        uint8_t *outbp = out->data[1] + y * out->linesize[1];
+        uint8_t *outap = out->data[3] + y * out->linesize[3];
+        for (int x = 0; x < in->width; x++) {
+            outrp[x] = s->lut[0][inrp[x]];
+            outgp[x] = s->lut[1][ingp[x]];
+            outbp[x] = s->lut[2][inbp[x]];
+            if (s->num_components == 4)
+                outap[x] = inap[x];
+        }
+    }
+}
+
+static void find_min_max_16(NormalizeContext *s, AVFrame *in, NormalizeLocal min[3], NormalizeLocal max[3])
+{
+    for (int c = 0; c < 3; c++)
+        min[c].in = max[c].in = AV_RN16(in->data[0] + 2 * s->co[c]);
+    for (int y = 0; y < in->height; y++) {
+        uint16_t *inp = (uint16_t *)(in->data[0] + y * in->linesize[0]);
+        for (int x = 0; x < in->width; x++) {
+            for (int c = 0; c < 3; c++) {
+                min[c].in = FFMIN(min[c].in, inp[s->co[c]]);
+                max[c].in = FFMAX(max[c].in, inp[s->co[c]]);
+            }
+            inp += s->step;
+        }
+    }
+}
+
+static void process_16(NormalizeContext *s, AVFrame *in, AVFrame *out)
+{
+    for (int y = 0; y < in->height; y++) {
+        uint16_t *inp  = (uint16_t *)(in->data[0] + y * in->linesize[0]);
+        uint16_t *outp = (uint16_t *)(out->data[0] + y * out->linesize[0]);
+        for (int x = 0; x < in->width; x++) {
+            for (int c = 0; c < 3; c++)
+                outp[s->co[c]] = s->lut[c][inp[s->co[c]]];
+            if (s->num_components == 4)
+                // Copy alpha as-is.
+                outp[s->co[3]] = inp[s->co[3]];
+            inp += s->step;
+            outp += s->step;
+        }
+    }
+}
+
+static void find_min_max_planar_16(NormalizeContext *s, AVFrame *in, NormalizeLocal min[3], NormalizeLocal max[3])
+{
+    min[0].in = max[0].in = AV_RN16(in->data[2]);
+    min[1].in = max[1].in = AV_RN16(in->data[0]);
+    min[2].in = max[2].in = AV_RN16(in->data[1]);
+    for (int y = 0; y < in->height; y++) {
+        uint16_t *inrp = (uint16_t *)(in->data[2] + y * in->linesize[2]);
+        uint16_t *ingp = (uint16_t *)(in->data[0] + y * in->linesize[0]);
+        uint16_t *inbp = (uint16_t *)(in->data[1] + y * in->linesize[1]);
+        for (int x = 0; x < in->width; x++) {
+            min[0].in = FFMIN(min[0].in, inrp[x]);
+            max[0].in = FFMAX(max[0].in, inrp[x]);
+            min[1].in = FFMIN(min[1].in, ingp[x]);
+            max[1].in = FFMAX(max[1].in, ingp[x]);
+            min[2].in = FFMIN(min[2].in, inbp[x]);
+            max[2].in = FFMAX(max[2].in, inbp[x]);
+        }
+    }
+}
+
+static void process_planar_16(NormalizeContext *s, AVFrame *in, AVFrame *out)
+{
+    for (int y = 0; y < in->height; y++) {
+        uint16_t *inrp  = (uint16_t *)(in->data[2] + y * in->linesize[2]);
+        uint16_t *ingp  = (uint16_t *)(in->data[0] + y * in->linesize[0]);
+        uint16_t *inbp  = (uint16_t *)(in->data[1] + y * in->linesize[1]);
+        uint16_t *inap  = (uint16_t *)(in->data[3] + y * in->linesize[3]);
+        uint16_t *outrp = (uint16_t *)(out->data[2] + y * out->linesize[2]);
+        uint16_t *outgp = (uint16_t *)(out->data[0] + y * out->linesize[0]);
+        uint16_t *outbp = (uint16_t *)(out->data[1] + y * out->linesize[1]);
+        uint16_t *outap = (uint16_t *)(out->data[3] + y * out->linesize[3]);
+        for (int x = 0; x < in->width; x++) {
+            outrp[x] = s->lut[0][inrp[x]];
+            outgp[x] = s->lut[1][ingp[x]];
+            outbp[x] = s->lut[2][inbp[x]];
+            if (s->num_components == 4)
+                outap[x] = inap[x];
+        }
+    }
+}
+
 // This function is the main guts of the filter. Normalizes the input frame
 // into the output frame. The frames are known to have the same dimensions
 // and pixel format.
 static void normalize(NormalizeContext *s, AVFrame *in, AVFrame *out)
 {
     // Per-extremum, per-channel local variables.
-    struct {
-        uint8_t in;     // Original input byte value for this frame.
-        float smoothed; // Smoothed input value [0,255].
-        float out;      // Output value [0,255].
-    } min[3], max[3];   // Min and max for each channel in {R,G,B}.
+    NormalizeLocal min[3], max[3];   // Min and max for each channel in {R,G,B}.
 
     float rgb_min_smoothed; // Min input range for linked normalization
     float rgb_max_smoothed; // Max input range for linked normalization
-    uint8_t lut[3][256];    // Lookup table
-    int x, y, c;
+    int c;
 
     // First, scan the input frame to find, for each channel, the minimum
     // (min.in) and maximum (max.in) values present in the channel.
-    for (c = 0; c < 3; c++)
-        min[c].in = max[c].in = in->data[0][s->co[c]];
-    for (y = 0; y < in->height; y++) {
-        uint8_t *inp = in->data[0] + y * in->linesize[0];
-        uint8_t *outp = out->data[0] + y * out->linesize[0];
-        for (x = 0; x < in->width; x++) {
-            for (c = 0; c < 3; c++) {
-                min[c].in = FFMIN(min[c].in, inp[s->co[c]]);
-                max[c].in = FFMAX(max[c].in, inp[s->co[c]]);
-            }
-            inp += s->num_components;
-            outp += s->num_components;
-        }
-    }
+    s->find_min_max(s, in, min, max);
 
     // Next, for each channel, push min.in and max.in into their respective
     // histories, to determine the min.smoothed and max.smoothed for this frame.
@@ -198,9 +347,9 @@
         // Calculate the output range [min.out,max.out] as a ratio of the full-
         // strength output range [blackpt,whitept] and the original input range
         // [min.in,max.in], based on the user-specified filter strength.
-        min[c].out = (s->blackpt[c] *         s->strength)
+        min[c].out = (s->sblackpt[c] *        s->strength)
                    + (min[c].in     * (1.0f - s->strength));
-        max[c].out = (s->whitept[c] *         s->strength)
+        max[c].out = (s->swhitept[c] *        s->strength)
                    + (max[c].in     * (1.0f - s->strength));
 
         // Now, build a lookup table which linearly maps the adjusted input range
@@ -211,7 +360,7 @@
         if (min[c].smoothed == max[c].smoothed) {
             // There is no dynamic range to expand. No mapping for this channel.
             for (in_val = min[c].in; in_val <= max[c].in; in_val++)
-                lut[c][in_val] = min[c].out;
+                s->lut[c][in_val] = min[c].out;
         } else {
             // We must set lookup values for all values in the original input
             // range [min.in,max.in]. Since the original input range may be
@@ -220,27 +369,14 @@
             float scale = (max[c].out - min[c].out) / (max[c].smoothed - min[c].smoothed);
             for (in_val = min[c].in; in_val <= max[c].in; in_val++) {
                 int out_val = (in_val - min[c].smoothed) * scale + min[c].out + 0.5f;
-                out_val = FFMAX(out_val, 0);
-                out_val = FFMIN(out_val, 255);
-                lut[c][in_val] = out_val;
+                out_val = av_clip_uintp2_c(out_val, s->depth);
+                s->lut[c][in_val] = out_val;
             }
         }
     }
 
     // Finally, process the pixels of the input frame using the lookup tables.
-    for (y = 0; y < in->height; y++) {
-        uint8_t *inp = in->data[0] + y * in->linesize[0];
-        uint8_t *outp = out->data[0] + y * out->linesize[0];
-        for (x = 0; x < in->width; x++) {
-            for (c = 0; c < 3; c++)
-                outp[s->co[c]] = lut[c][inp[s->co[c]]];
-            if (s->num_components == 4)
-                // Copy alpha as-is.
-                outp[s->co[3]] = inp[s->co[3]];
-            inp += s->num_components;
-            outp += s->num_components;
-        }
-    }
+    s->process(s, in, out);
 
     s->frame_num++;
 }
@@ -265,6 +401,11 @@
         AV_PIX_FMT_RGB0,
         AV_PIX_FMT_0BGR,
         AV_PIX_FMT_BGR0,
+        AV_PIX_FMT_RGB48,  AV_PIX_FMT_BGR48,
+        AV_PIX_FMT_RGBA64, AV_PIX_FMT_BGRA64,
+        AV_PIX_FMT_GBRP, AV_PIX_FMT_GBRP9, AV_PIX_FMT_GBRP10,
+        AV_PIX_FMT_GBRP12, AV_PIX_FMT_GBRP14, AV_PIX_FMT_GBRP16,
+        AV_PIX_FMT_GBRAP, AV_PIX_FMT_GBRAP10, AV_PIX_FMT_GBRAP12, AV_PIX_FMT_GBRAP16,
         AV_PIX_FMT_NONE
     };
     // According to filter_design.txt, using ff_set_common_formats() this way
@@ -284,11 +425,13 @@
     NormalizeContext *s = inlink->dst->priv;
     // Store offsets to R,G,B,A bytes respectively in each pixel
     const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(inlink->format);
-    int c;
+    int c, planar, scale;
 
-    for (c = 0; c < 4; ++c)
-        s->co[c] = desc->comp[c].offset;
+    ff_fill_rgba_map(s->co, inlink->format);
+    s->depth = desc->comp[0].depth;
+    scale = 1 << (s->depth - 8);
     s->num_components = desc->nb_components;
+    s->step = av_get_padded_bits_per_pixel(desc) >> (3 + (s->depth > 8));
     // Convert smoothing value to history_len (a count of frames to average,
     // must be at least 1).  Currently this is a direct assignment, but the
     // smoothing value was originally envisaged as a number of seconds.  In
@@ -298,14 +441,27 @@
     // Allocate the history buffers -- there are 6 -- one for each extrema.
     // s->smoothing is limited to INT_MAX/8, so that (s->history_len * 6)
     // can't overflow on 32bit causing a too-small allocation.
-    s->history_mem = av_malloc(s->history_len * 6);
+    s->history_mem = av_malloc(s->history_len * 6 * sizeof(*s->history_mem));
     if (s->history_mem == NULL)
         return AVERROR(ENOMEM);
 
     for (c = 0; c < 3; c++) {
         s->min[c].history = s->history_mem + (c*2)   * s->history_len;
         s->max[c].history = s->history_mem + (c*2+1) * s->history_len;
+        s->sblackpt[c] = scale * s->blackpt[c] + (s->blackpt[c] >> (s->depth - 8));
+        s->swhitept[c] = scale * s->whitept[c] + (s->whitept[c] >> (s->depth - 8));
     }
+
+    planar = desc->flags & AV_PIX_FMT_FLAG_PLANAR;
+
+    if (s->depth <= 8) {
+        s->find_min_max = planar ? find_min_max_planar : find_min_max;
+        s->process = planar? process_planar : process;
+    } else {
+        s->find_min_max = planar ? find_min_max_planar_16 : find_min_max_16;
+        s->process = planar? process_planar_16 : process_16;
+    }
+
     return 0;
 }
 
@@ -383,4 +539,6 @@
     .query_formats = query_formats,
     .inputs        = inputs,
     .outputs       = outputs,
+    .flags         = AVFILTER_FLAG_SUPPORT_TIMELINE_INTERNAL,
+    .process_command = ff_filter_process_command,
 };
diff --git a/libavfilter/vf_ocr.c b/libavfilter/vf_ocr.c
index abfff49..d5f7605 100644
--- a/libavfilter/vf_ocr.c
+++ b/libavfilter/vf_ocr.c
@@ -100,11 +100,21 @@
     AVFilterLink *outlink = ctx->outputs[0];
     OCRContext *s = ctx->priv;
     char *result;
+    int *confs;
 
     result = TessBaseAPIRect(s->tess, in->data[0], 1,
                              in->linesize[0], 0, 0, in->width, in->height);
+    confs = TessBaseAPIAllWordConfidences(s->tess);
     av_dict_set(metadata, "lavfi.ocr.text", result, 0);
+    for (int i = 0; confs[i] != -1; i++) {
+        char number[256];
+
+        snprintf(number, sizeof(number), "%d ", confs[i]);
+        av_dict_set(metadata, "lavfi.ocr.confidence", number, AV_DICT_APPEND);
+    }
+
     TessDeleteText(result);
+    TessDeleteIntArray(confs);
 
     return ff_filter_frame(outlink, in);
 }
diff --git a/libavfilter/vf_overlay.c b/libavfilter/vf_overlay.c
index ba25893..b5ab5fb 100644
--- a/libavfilter/vf_overlay.c
+++ b/libavfilter/vf_overlay.c
@@ -380,15 +380,15 @@
     uint8_t *S, *sp, *d, *dp;
 
     i = FFMAX(-y, 0);
-    imax = FFMIN(-y + dst_h, src_h);
+    imax = FFMIN3(-y + dst_h, FFMIN(src_h, dst_h), y + src_h);
 
-    slice_start = (imax * jobnr) / nb_jobs;
-    slice_end = (imax * (jobnr+1)) / nb_jobs;
+    slice_start = i + (imax * jobnr) / nb_jobs;
+    slice_end = i + (imax * (jobnr+1)) / nb_jobs;
 
-    sp = src->data[0] + (i + slice_start)     * src->linesize[0];
-    dp = dst->data[0] + (y + i + slice_start) * dst->linesize[0];
+    sp = src->data[0] + (slice_start)     * src->linesize[0];
+    dp = dst->data[0] + (y + slice_start) * dst->linesize[0];
 
-    for (i = i + slice_start; i < slice_end; i++) {
+    for (i = slice_start; i < slice_end; i++) {
         j = FFMAX(-x, 0);
         S = sp + j     * sstep;
         d = dp + (x+j) * dstep;
@@ -468,19 +468,19 @@
     int slice_start, slice_end;
 
     j = FFMAX(-yp, 0);
-    jmax = FFMIN(-yp + dst_hp, src_hp);
+    jmax = FFMIN3(-yp + dst_hp, FFMIN(src_hp, dst_hp), yp + src_hp);
 
-    slice_start = (jmax * jobnr) / nb_jobs;
-    slice_end = (jmax * (jobnr+1)) / nb_jobs;
+    slice_start = j + (jmax * jobnr) / nb_jobs;
+    slice_end = j + (jmax * (jobnr+1)) / nb_jobs;
 
-    sp = src->data[i] + slice_start * src->linesize[i];
+    sp = src->data[i] + (slice_start) * src->linesize[i];
     dp = dst->data[dst_plane]
                       + (yp + slice_start) * dst->linesize[dst_plane]
                       + dst_offset;
     ap = src->data[3] + (slice_start << vsub) * src->linesize[3];
     dap = dst->data[3] + ((yp + slice_start) << vsub) * dst->linesize[3];
 
-    for (j = j + slice_start; j < slice_end; j++) {
+    for (j = slice_start; j < slice_end; j++) {
         k = FFMAX(-xp, 0);
         d = dp + (xp+k) * dst_step;
         s = sp + k;
@@ -961,13 +961,13 @@
                s->var_values[VAR_Y], s->y);
     }
 
-    if (s->x < mainpic->width  && s->x + second->width  >= 0 ||
+    if (s->x < mainpic->width  && s->x + second->width  >= 0 &&
         s->y < mainpic->height && s->y + second->height >= 0) {
         ThreadData td;
 
         td.dst = mainpic;
         td.src = second;
-        ctx->internal->execute(ctx, s->blend_slice, &td, NULL, FFMIN(FFMIN(mainpic->height - s->y, second->height),
+        ctx->internal->execute(ctx, s->blend_slice, &td, NULL, FFMIN(FFMAX(1, FFMIN3(s->y + second->height, FFMIN(second->height, mainpic->height), mainpic->height - s->y)),
                                                                      ff_filter_get_nb_threads(ctx)));
     }
     return ff_filter_frame(ctx->outputs[0], mainpic);
@@ -991,8 +991,8 @@
 #define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
 
 static const AVOption overlay_options[] = {
-    { "x", "set the x expression", OFFSET(x_expr), AV_OPT_TYPE_STRING, {.str = "0"}, CHAR_MIN, CHAR_MAX, FLAGS },
-    { "y", "set the y expression", OFFSET(y_expr), AV_OPT_TYPE_STRING, {.str = "0"}, CHAR_MIN, CHAR_MAX, FLAGS },
+    { "x", "set the x expression", OFFSET(x_expr), AV_OPT_TYPE_STRING, {.str = "0"}, 0, 0, FLAGS },
+    { "y", "set the y expression", OFFSET(y_expr), AV_OPT_TYPE_STRING, {.str = "0"}, 0, 0, FLAGS },
     { "eof_action", "Action to take when encountering EOF from secondary input ",
         OFFSET(fs.opt_eof_action), AV_OPT_TYPE_INT, { .i64 = EOF_ACTION_REPEAT },
         EOF_ACTION_REPEAT, EOF_ACTION_PASS, .flags = FLAGS, "eof_action" },
diff --git a/libavfilter/vf_overlay_cuda.c b/libavfilter/vf_overlay_cuda.c
new file mode 100644
index 0000000..2f0f860
--- /dev/null
+++ b/libavfilter/vf_overlay_cuda.c
@@ -0,0 +1,438 @@
+/*
+ * Copyright (c) 2020 Yaroslav Pogrebnyak <yyyaroslav@gmail.com>
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file
+ * Overlay one video on top of another using cuda hardware acceleration
+ */
+
+#include "libavutil/log.h"
+#include "libavutil/mem.h"
+#include "libavutil/opt.h"
+#include "libavutil/pixdesc.h"
+#include "libavutil/hwcontext.h"
+#include "libavutil/hwcontext_cuda_internal.h"
+#include "libavutil/cuda_check.h"
+
+#include "avfilter.h"
+#include "framesync.h"
+#include "internal.h"
+
+#define CHECK_CU(x) FF_CUDA_CHECK_DL(ctx, ctx->hwctx->internal->cuda_dl, x)
+#define DIV_UP(a, b) ( ((a) + (b) - 1) / (b) )
+
+#define BLOCK_X 32
+#define BLOCK_Y 16
+
+static const enum AVPixelFormat supported_main_formats[] = {
+    AV_PIX_FMT_NV12,
+    AV_PIX_FMT_YUV420P,
+    AV_PIX_FMT_NONE,
+};
+
+static const enum AVPixelFormat supported_overlay_formats[] = {
+    AV_PIX_FMT_NV12,
+    AV_PIX_FMT_YUV420P,
+    AV_PIX_FMT_YUVA420P,
+    AV_PIX_FMT_NONE,
+};
+
+/**
+ * OverlayCUDAContext
+ */
+typedef struct OverlayCUDAContext {
+    const AVClass      *class;
+
+    enum AVPixelFormat in_format_overlay;
+    enum AVPixelFormat in_format_main;
+
+    AVCUDADeviceContext *hwctx;
+
+    CUcontext cu_ctx;
+    CUmodule cu_module;
+    CUfunction cu_func;
+    CUstream cu_stream;
+
+    FFFrameSync fs;
+
+    int x_position;
+    int y_position;
+
+} OverlayCUDAContext;
+
+/**
+ * Helper to find out if provided format is supported by filter
+ */
+static int format_is_supported(const enum AVPixelFormat formats[], enum AVPixelFormat fmt)
+{
+    for (int i = 0; formats[i] != AV_PIX_FMT_NONE; i++)
+        if (formats[i] == fmt)
+            return 1;
+    return 0;
+}
+
+/**
+ * Helper checks if we can process main and overlay pixel formats
+ */
+static int formats_match(const enum AVPixelFormat format_main, const enum AVPixelFormat format_overlay) {
+    switch(format_main) {
+    case AV_PIX_FMT_NV12:
+        return format_overlay == AV_PIX_FMT_NV12;
+    case AV_PIX_FMT_YUV420P:
+        return format_overlay == AV_PIX_FMT_YUV420P ||
+               format_overlay == AV_PIX_FMT_YUVA420P;
+    default:
+        return 0;
+    }
+}
+
+/**
+ * Call overlay kernell for a plane
+ */
+static int overlay_cuda_call_kernel(
+    OverlayCUDAContext *ctx,
+    int x_position, int y_position,
+    uint8_t* main_data, int main_linesize,
+    int main_width, int main_height,
+    uint8_t* overlay_data, int overlay_linesize,
+    int overlay_width, int overlay_height,
+    uint8_t* alpha_data, int alpha_linesize,
+    int alpha_adj_x, int alpha_adj_y) {
+
+    CudaFunctions *cu = ctx->hwctx->internal->cuda_dl;
+
+    void* kernel_args[] = {
+        &x_position, &y_position,
+        &main_data, &main_linesize,
+        &overlay_data, &overlay_linesize,
+        &overlay_width, &overlay_height,
+        &alpha_data, &alpha_linesize,
+        &alpha_adj_x, &alpha_adj_y,
+    };
+
+    return CHECK_CU(cu->cuLaunchKernel(
+        ctx->cu_func,
+        DIV_UP(main_width, BLOCK_X), DIV_UP(main_height, BLOCK_Y), 1,
+        BLOCK_X, BLOCK_Y, 1,
+        0, ctx->cu_stream, kernel_args, NULL));
+}
+
+/**
+ * Perform blend overlay picture over main picture
+ */
+static int overlay_cuda_blend(FFFrameSync *fs)
+{
+    int ret;
+
+    AVFilterContext *avctx = fs->parent;
+    OverlayCUDAContext *ctx = avctx->priv;
+    AVFilterLink *outlink = avctx->outputs[0];
+
+    CudaFunctions *cu = ctx->hwctx->internal->cuda_dl;
+    CUcontext dummy, cuda_ctx = ctx->hwctx->cuda_ctx;
+
+    AVFrame *input_main, *input_overlay;
+
+    ctx->cu_ctx = cuda_ctx;
+
+    // read main and overlay frames from inputs
+    ret = ff_framesync_dualinput_get(fs, &input_main, &input_overlay);
+    if (ret < 0)
+        return ret;
+
+    if (!input_main || !input_overlay)
+        return AVERROR_BUG;
+
+    ret = av_frame_make_writable(input_main);
+    if (ret < 0) {
+        av_frame_free(&input_main);
+        return ret;
+    }
+
+    // push cuda context
+
+    ret = CHECK_CU(cu->cuCtxPushCurrent(cuda_ctx));
+    if (ret < 0) {
+        av_frame_free(&input_main);
+        return ret;
+    }
+
+    // overlay first plane
+
+    overlay_cuda_call_kernel(ctx,
+        ctx->x_position, ctx->y_position,
+        input_main->data[0], input_main->linesize[0],
+        input_main->width, input_main->height,
+        input_overlay->data[0], input_overlay->linesize[0],
+        input_overlay->width, input_overlay->height,
+        input_overlay->data[3], input_overlay->linesize[3], 1, 1);
+
+    // overlay rest planes depending on pixel format
+
+    switch(ctx->in_format_overlay) {
+    case AV_PIX_FMT_NV12:
+        overlay_cuda_call_kernel(ctx,
+            ctx->x_position, ctx->y_position / 2,
+            input_main->data[1], input_main->linesize[1],
+            input_main->width, input_main->height / 2,
+            input_overlay->data[1], input_overlay->linesize[1],
+            input_overlay->width, input_overlay->height / 2,
+            0, 0, 0, 0);
+        break;
+    case AV_PIX_FMT_YUV420P:
+    case AV_PIX_FMT_YUVA420P:
+        overlay_cuda_call_kernel(ctx,
+            ctx->x_position / 2 , ctx->y_position / 2,
+            input_main->data[1], input_main->linesize[1],
+            input_main->width / 2, input_main->height / 2,
+            input_overlay->data[1], input_overlay->linesize[1],
+            input_overlay->width / 2, input_overlay->height / 2,
+            input_overlay->data[3], input_overlay->linesize[3], 2, 2);
+
+        overlay_cuda_call_kernel(ctx,
+            ctx->x_position / 2 , ctx->y_position / 2,
+            input_main->data[2], input_main->linesize[2],
+            input_main->width / 2, input_main->height / 2,
+            input_overlay->data[2], input_overlay->linesize[2],
+            input_overlay->width / 2, input_overlay->height / 2,
+            input_overlay->data[3], input_overlay->linesize[3], 2, 2);
+        break;
+    default:
+        av_log(ctx, AV_LOG_ERROR, "Passed unsupported overlay pixel format\n");
+        av_frame_free(&input_main);
+        CHECK_CU(cu->cuCtxPopCurrent(&dummy));
+        return AVERROR_BUG;
+    }
+
+    CHECK_CU(cu->cuCtxPopCurrent(&dummy));
+
+    return ff_filter_frame(outlink, input_main);
+}
+
+/**
+ * Initialize overlay_cuda
+ */
+static av_cold int overlay_cuda_init(AVFilterContext *avctx)
+{
+    OverlayCUDAContext* ctx = avctx->priv;
+    ctx->fs.on_event = &overlay_cuda_blend;
+
+    return 0;
+}
+
+/**
+ * Uninitialize overlay_cuda
+ */
+static av_cold void overlay_cuda_uninit(AVFilterContext *avctx)
+{
+    OverlayCUDAContext* ctx = avctx->priv;
+
+    ff_framesync_uninit(&ctx->fs);
+
+    if (ctx->hwctx && ctx->cu_module) {
+        CUcontext dummy;
+        CudaFunctions *cu = ctx->hwctx->internal->cuda_dl;
+        CHECK_CU(cu->cuCtxPushCurrent(ctx->cu_ctx));
+        CHECK_CU(cu->cuModuleUnload(ctx->cu_module));
+        CHECK_CU(cu->cuCtxPopCurrent(&dummy));
+    }
+}
+
+/**
+ * Activate overlay_cuda
+ */
+static int overlay_cuda_activate(AVFilterContext *avctx)
+{
+    OverlayCUDAContext *ctx = avctx->priv;
+
+    return ff_framesync_activate(&ctx->fs);
+}
+
+/**
+ * Query formats
+ */
+static int overlay_cuda_query_formats(AVFilterContext *avctx)
+{
+    static const enum AVPixelFormat pixel_formats[] = {
+        AV_PIX_FMT_CUDA, AV_PIX_FMT_NONE,
+    };
+
+    AVFilterFormats *pix_fmts = ff_make_format_list(pixel_formats);
+
+    return ff_set_common_formats(avctx, pix_fmts);
+}
+
+/**
+ * Configure output
+ */
+static int overlay_cuda_config_output(AVFilterLink *outlink)
+{
+
+    extern char vf_overlay_cuda_ptx[];
+
+    int err;
+    AVFilterContext* avctx = outlink->src;
+    OverlayCUDAContext* ctx = avctx->priv;
+
+    AVFilterLink *inlink = avctx->inputs[0];
+    AVHWFramesContext  *frames_ctx = (AVHWFramesContext*)inlink->hw_frames_ctx->data;
+
+    AVFilterLink *inlink_overlay = avctx->inputs[1];
+    AVHWFramesContext  *frames_ctx_overlay = (AVHWFramesContext*)inlink_overlay->hw_frames_ctx->data;
+
+    CUcontext dummy, cuda_ctx;
+    CudaFunctions *cu;
+
+    // check main input formats
+
+    if (!frames_ctx) {
+        av_log(ctx, AV_LOG_ERROR, "No hw context provided on main input\n");
+        return AVERROR(EINVAL);
+    }
+
+    ctx->in_format_main = frames_ctx->sw_format;
+    if (!format_is_supported(supported_main_formats, ctx->in_format_main)) {
+        av_log(ctx, AV_LOG_ERROR, "Unsupported main input format: %s\n",
+               av_get_pix_fmt_name(ctx->in_format_main));
+        return AVERROR(ENOSYS);
+    }
+
+    // check overlay input formats
+
+    if (!frames_ctx_overlay) {
+        av_log(ctx, AV_LOG_ERROR, "No hw context provided on overlay input\n");
+        return AVERROR(EINVAL);
+    }
+
+    ctx->in_format_overlay = frames_ctx_overlay->sw_format;
+    if (!format_is_supported(supported_overlay_formats, ctx->in_format_overlay)) {
+        av_log(ctx, AV_LOG_ERROR, "Unsupported overlay input format: %s\n",
+            av_get_pix_fmt_name(ctx->in_format_overlay));
+        return AVERROR(ENOSYS);
+    }
+
+    // check we can overlay pictures with those pixel formats
+
+    if (!formats_match(ctx->in_format_main, ctx->in_format_overlay)) {
+        av_log(ctx, AV_LOG_ERROR, "Can't overlay %s on %s \n",
+            av_get_pix_fmt_name(ctx->in_format_overlay), av_get_pix_fmt_name(ctx->in_format_main));
+        return AVERROR(EINVAL);
+    }
+
+    // initialize
+
+    ctx->hwctx = frames_ctx->device_ctx->hwctx;
+    cuda_ctx = ctx->hwctx->cuda_ctx;
+    ctx->fs.time_base = inlink->time_base;
+
+    ctx->cu_stream = ctx->hwctx->stream;
+
+    outlink->hw_frames_ctx = av_buffer_ref(inlink->hw_frames_ctx);
+
+    // load functions
+
+    cu = ctx->hwctx->internal->cuda_dl;
+
+    err = CHECK_CU(cu->cuCtxPushCurrent(cuda_ctx));
+    if (err < 0) {
+        return err;
+    }
+
+    err = CHECK_CU(cu->cuModuleLoadData(&ctx->cu_module, vf_overlay_cuda_ptx));
+    if (err < 0) {
+        CHECK_CU(cu->cuCtxPopCurrent(&dummy));
+        return err;
+    }
+
+    err = CHECK_CU(cu->cuModuleGetFunction(&ctx->cu_func, ctx->cu_module, "Overlay_Cuda"));
+    if (err < 0) {
+        CHECK_CU(cu->cuCtxPopCurrent(&dummy));
+        return err;
+    }
+
+    CHECK_CU(cu->cuCtxPopCurrent(&dummy));
+
+    // init dual input
+
+    err = ff_framesync_init_dualinput(&ctx->fs, avctx);
+    if (err < 0) {
+        return err;
+    }
+
+    return ff_framesync_configure(&ctx->fs);
+}
+
+
+#define OFFSET(x) offsetof(OverlayCUDAContext, x)
+#define FLAGS (AV_OPT_FLAG_FILTERING_PARAM | AV_OPT_FLAG_VIDEO_PARAM)
+
+static const AVOption overlay_cuda_options[] = {
+    { "x", "Overlay x position",
+      OFFSET(x_position), AV_OPT_TYPE_INT, { .i64 = 0 }, INT_MIN, INT_MAX, .flags = FLAGS },
+    { "y", "Overlay y position",
+      OFFSET(y_position), AV_OPT_TYPE_INT, { .i64 = 0 }, INT_MIN, INT_MAX, .flags = FLAGS },
+    { "eof_action", "Action to take when encountering EOF from secondary input ",
+        OFFSET(fs.opt_eof_action), AV_OPT_TYPE_INT, { .i64 = EOF_ACTION_REPEAT },
+        EOF_ACTION_REPEAT, EOF_ACTION_PASS, .flags = FLAGS, "eof_action" },
+        { "repeat", "Repeat the previous frame.",   0, AV_OPT_TYPE_CONST, { .i64 = EOF_ACTION_REPEAT }, .flags = FLAGS, "eof_action" },
+        { "endall", "End both streams.",            0, AV_OPT_TYPE_CONST, { .i64 = EOF_ACTION_ENDALL }, .flags = FLAGS, "eof_action" },
+        { "pass",   "Pass through the main input.", 0, AV_OPT_TYPE_CONST, { .i64 = EOF_ACTION_PASS },   .flags = FLAGS, "eof_action" },
+    { "shortest", "force termination when the shortest input terminates", OFFSET(fs.opt_shortest), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, FLAGS },
+    { "repeatlast", "repeat overlay of the last overlay frame", OFFSET(fs.opt_repeatlast), AV_OPT_TYPE_BOOL, {.i64=1}, 0, 1, FLAGS },
+    { NULL },
+};
+
+FRAMESYNC_DEFINE_CLASS(overlay_cuda, OverlayCUDAContext, fs);
+
+static const AVFilterPad overlay_cuda_inputs[] = {
+    {
+        .name         = "main",
+        .type         = AVMEDIA_TYPE_VIDEO,
+    },
+    {
+        .name         = "overlay",
+        .type         = AVMEDIA_TYPE_VIDEO,
+    },
+    { NULL }
+};
+
+static const AVFilterPad overlay_cuda_outputs[] = {
+    {
+        .name          = "default",
+        .type          = AVMEDIA_TYPE_VIDEO,
+        .config_props  = &overlay_cuda_config_output,
+    },
+    { NULL }
+};
+
+AVFilter ff_vf_overlay_cuda = {
+    .name            = "overlay_cuda",
+    .description     = NULL_IF_CONFIG_SMALL("Overlay one video on top of another using CUDA"),
+    .priv_size       = sizeof(OverlayCUDAContext),
+    .priv_class      = &overlay_cuda_class,
+    .init            = &overlay_cuda_init,
+    .uninit          = &overlay_cuda_uninit,
+    .activate        = &overlay_cuda_activate,
+    .query_formats   = &overlay_cuda_query_formats,
+    .inputs          = overlay_cuda_inputs,
+    .outputs         = overlay_cuda_outputs,
+    .preinit         = overlay_cuda_framesync_preinit,
+    .flags_internal  = FF_FILTER_FLAG_HWFRAME_AWARE,
+};
diff --git a/libavfilter/vf_overlay_cuda.cu b/libavfilter/vf_overlay_cuda.cu
new file mode 100644
index 0000000..43ec36c
--- /dev/null
+++ b/libavfilter/vf_overlay_cuda.cu
@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 2020 Yaroslav Pogrebnyak <yyyaroslav@gmail.com>
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+extern "C" {
+
+__global__ void Overlay_Cuda(
+    int x_position, int y_position,
+    unsigned char* main, int main_linesize,
+    unsigned char* overlay, int overlay_linesize,
+    int overlay_w, int overlay_h,
+    unsigned char* overlay_alpha, int alpha_linesize,
+    int alpha_adj_x, int alpha_adj_y)
+{
+    int x = blockIdx.x * blockDim.x + threadIdx.x;
+    int y = blockIdx.y * blockDim.y + threadIdx.y;
+
+    if (x >= overlay_w + x_position ||
+        y >= overlay_h + y_position ||
+        x < x_position ||
+        y < y_position ) {
+
+        return;
+    }
+
+    int overlay_x = x - x_position;
+    int overlay_y = y - y_position;
+
+    float alpha = 1.0;
+    if (alpha_linesize) {
+        alpha = overlay_alpha[alpha_adj_x * overlay_x  + alpha_adj_y * overlay_y * alpha_linesize] / 255.0f;
+    }
+
+    main[x + y*main_linesize] = alpha * overlay[overlay_x + overlay_y * overlay_linesize] + (1.0f - alpha) * main[x + y*main_linesize];
+}
+
+}
+
diff --git a/libavfilter/vf_overlay_qsv.c b/libavfilter/vf_overlay_qsv.c
index 2087178..2a4dc5c 100644
--- a/libavfilter/vf_overlay_qsv.c
+++ b/libavfilter/vf_overlay_qsv.c
@@ -160,7 +160,7 @@
 
 static int have_alpha_planar(AVFilterLink *link)
 {
-    enum AVPixelFormat pix_fmt;
+    enum AVPixelFormat pix_fmt = link->format;
     const AVPixFmtDescriptor *desc;
     AVHWFramesContext *fctx;
 
@@ -345,7 +345,7 @@
     return 0;
 }
 
-static void overlay_qsv_uninit(AVFilterContext *ctx)
+static av_cold void overlay_qsv_uninit(AVFilterContext *ctx)
 {
     QSVOverlayContext *vpp = ctx->priv;
 
diff --git a/libavfilter/vf_overlay_vulkan.c b/libavfilter/vf_overlay_vulkan.c
new file mode 100644
index 0000000..83cfae4
--- /dev/null
+++ b/libavfilter/vf_overlay_vulkan.c
@@ -0,0 +1,484 @@
+/*
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "libavutil/opt.h"
+#include "vulkan.h"
+#include "internal.h"
+#include "framesync.h"
+
+#define CGROUPS (int [3]){ 32, 32, 1 }
+
+typedef struct OverlayVulkanContext {
+    VulkanFilterContext vkctx;
+
+    int initialized;
+    VulkanPipeline *pl;
+    FFVkExecContext *exec;
+    FFFrameSync fs;
+    FFVkBuffer params_buf;
+
+    /* Shader updators, must be in the main filter struct */
+    VkDescriptorImageInfo main_images[3];
+    VkDescriptorImageInfo overlay_images[3];
+    VkDescriptorImageInfo output_images[3];
+    VkDescriptorBufferInfo params_desc;
+
+    int overlay_x;
+    int overlay_y;
+    int overlay_w;
+    int overlay_h;
+} OverlayVulkanContext;
+
+static const char overlay_noalpha[] = {
+    C(0, void overlay_noalpha(int i, ivec2 pos)                                )
+    C(0, {                                                                     )
+    C(1,     if ((o_offset[i].x <= pos.x) && (o_offset[i].y <= pos.y) &&
+                 (pos.x < (o_offset[i].x + o_size[i].x)) &&
+                 (pos.y < (o_offset[i].y + o_size[i].y))) {                    )
+    C(2,         vec4 res = texture(overlay_img[i], pos - o_offset[i]);        )
+    C(2,         imageStore(output_img[i], pos, res);                          )
+    C(1,     } else {                                                          )
+    C(2,         vec4 res = texture(main_img[i], pos);                         )
+    C(2,         imageStore(output_img[i], pos, res);                          )
+    C(1,     }                                                                 )
+    C(0, }                                                                     )
+};
+
+static const char overlay_alpha[] = {
+    C(0, void overlay_alpha_opaque(int i, ivec2 pos)                           )
+    C(0, {                                                                     )
+    C(1,     vec4 res = texture(main_img[i], pos);                             )
+    C(1,     if ((o_offset[i].x <= pos.x) && (o_offset[i].y <= pos.y) &&
+                 (pos.x < (o_offset[i].x + o_size[i].x)) &&
+                 (pos.y < (o_offset[i].y + o_size[i].y))) {                    )
+    C(2,         vec4 ovr = texture(overlay_img[i], pos - o_offset[i]);        )
+    C(2,         res = ovr * ovr.a + res * (1.0f - ovr.a);                     )
+    C(2,         res.a = 1.0f;                                                 )
+    C(2,         imageStore(output_img[i], pos, res);                          )
+    C(1,     }                                                                 )
+    C(1,     imageStore(output_img[i], pos, res);                              )
+    C(0, }                                                                     )
+};
+
+static av_cold int init_filter(AVFilterContext *ctx)
+{
+    int err;
+    OverlayVulkanContext *s = ctx->priv;
+    VkSampler *sampler = ff_vk_init_sampler(ctx, 1, VK_FILTER_NEAREST);
+    if (!sampler)
+        return AVERROR_EXTERNAL;
+
+    s->pl = ff_vk_create_pipeline(ctx);
+    if (!s->pl)
+        return AVERROR(ENOMEM);
+
+    { /* Create the shader */
+        const int planes = av_pix_fmt_count_planes(s->vkctx.output_format);
+        const int ialpha = av_pix_fmt_desc_get(s->vkctx.input_format)->flags & AV_PIX_FMT_FLAG_ALPHA;
+
+        VulkanDescriptorSetBinding desc_i[3] = {
+            {
+                .name       = "main_img",
+                .type       = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
+                .dimensions = 2,
+                .elems      = planes,
+                .stages     = VK_SHADER_STAGE_COMPUTE_BIT,
+                .updater    = s->main_images,
+                .samplers   = DUP_SAMPLER_ARRAY4(*sampler),
+            },
+            {
+                .name       = "overlay_img",
+                .type       = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
+                .dimensions = 2,
+                .elems      = planes,
+                .stages     = VK_SHADER_STAGE_COMPUTE_BIT,
+                .updater    = s->overlay_images,
+                .samplers   = DUP_SAMPLER_ARRAY4(*sampler),
+            },
+            {
+                .name       = "output_img",
+                .type       = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
+                .mem_layout = ff_vk_shader_rep_fmt(s->vkctx.output_format),
+                .mem_quali  = "writeonly",
+                .dimensions = 2,
+                .elems      = planes,
+                .stages     = VK_SHADER_STAGE_COMPUTE_BIT,
+                .updater    = s->output_images,
+            },
+        };
+
+        VulkanDescriptorSetBinding desc_b = {
+            .name        = "params",
+            .type        = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
+            .mem_quali   = "readonly",
+            .mem_layout  = "std430",
+            .stages      = VK_SHADER_STAGE_COMPUTE_BIT,
+            .updater     = &s->params_desc,
+            .buf_content = "ivec2 o_offset[3], o_size[3];",
+        };
+
+        SPIRVShader *shd = ff_vk_init_shader(ctx, s->pl, "overlay_compute",
+                                             VK_SHADER_STAGE_COMPUTE_BIT);
+        if (!shd)
+            return AVERROR(ENOMEM);
+
+        ff_vk_set_compute_shader_sizes(ctx, shd, CGROUPS);
+
+        RET(ff_vk_add_descriptor_set(ctx, s->pl, shd,  desc_i, 3, 0)); /* set 0 */
+        RET(ff_vk_add_descriptor_set(ctx, s->pl, shd, &desc_b, 1, 0)); /* set 1 */
+
+        GLSLD(   overlay_noalpha                                              );
+        GLSLD(   overlay_alpha                                                );
+        GLSLC(0, void main()                                                  );
+        GLSLC(0, {                                                            );
+        GLSLC(1,     ivec2 pos = ivec2(gl_GlobalInvocationID.xy);             );
+        GLSLF(1,     int planes = %i;                                  ,planes);
+        GLSLC(1,     for (int i = 0; i < planes; i++) {                       );
+        if (ialpha)
+            GLSLC(2,         overlay_alpha_opaque(i, pos);                    );
+        else
+            GLSLC(2,         overlay_noalpha(i, pos);                         );
+        GLSLC(1,     }                                                        );
+        GLSLC(0, }                                                            );
+
+        RET(ff_vk_compile_shader(ctx, shd, "main"));
+    }
+
+    RET(ff_vk_init_pipeline_layout(ctx, s->pl));
+    RET(ff_vk_init_compute_pipeline(ctx, s->pl));
+
+    { /* Create and update buffer */
+        const AVPixFmtDescriptor *desc;
+
+        /* NOTE: std430 requires the same identical struct layout, padding and
+         * alignment as C, so we're allowed to do this, as this will map
+         * exactly to what the shader recieves */
+        struct {
+            int32_t o_offset[2*3];
+            int32_t o_size[2*3];
+        } *par;
+
+        err = ff_vk_create_buf(ctx, &s->params_buf,
+                               sizeof(*par),
+                               VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
+                               VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
+        if (err)
+            return err;
+
+        err = ff_vk_map_buffers(ctx, &s->params_buf, (uint8_t **)&par, 1, 0);
+        if (err)
+            return err;
+
+        desc = av_pix_fmt_desc_get(s->vkctx.output_format);
+
+        par->o_offset[0] = s->overlay_x;
+        par->o_offset[1] = s->overlay_y;
+        par->o_offset[2] = par->o_offset[0] >> desc->log2_chroma_w;
+        par->o_offset[3] = par->o_offset[1] >> desc->log2_chroma_h;
+        par->o_offset[4] = par->o_offset[0] >> desc->log2_chroma_w;
+        par->o_offset[5] = par->o_offset[1] >> desc->log2_chroma_h;
+
+        par->o_size[0] = s->overlay_w;
+        par->o_size[1] = s->overlay_h;
+        par->o_size[2] = par->o_size[0] >> desc->log2_chroma_w;
+        par->o_size[3] = par->o_size[1] >> desc->log2_chroma_h;
+        par->o_size[4] = par->o_size[0] >> desc->log2_chroma_w;
+        par->o_size[5] = par->o_size[1] >> desc->log2_chroma_h;
+
+        err = ff_vk_unmap_buffers(ctx, &s->params_buf, 1, 1);
+        if (err)
+            return err;
+
+        s->params_desc.buffer = s->params_buf.buf;
+        s->params_desc.range  = VK_WHOLE_SIZE;
+
+        ff_vk_update_descriptor_set(ctx, s->pl, 1);
+    }
+
+    /* Execution context */
+    RET(ff_vk_create_exec_ctx(ctx, &s->exec,
+                              s->vkctx.hwctx->queue_family_comp_index));
+
+    s->initialized = 1;
+
+    return 0;
+
+fail:
+    return err;
+}
+
+static int process_frames(AVFilterContext *avctx, AVFrame *out_f,
+                          AVFrame *main_f, AVFrame *overlay_f)
+{
+    int err;
+    OverlayVulkanContext *s = avctx->priv;
+    int planes = av_pix_fmt_count_planes(s->vkctx.output_format);
+
+    AVVkFrame *out     = (AVVkFrame *)out_f->data[0];
+    AVVkFrame *main    = (AVVkFrame *)main_f->data[0];
+    AVVkFrame *overlay = (AVVkFrame *)overlay_f->data[0];
+
+    AVHWFramesContext *main_fc = (AVHWFramesContext*)main_f->hw_frames_ctx->data;
+    AVHWFramesContext *overlay_fc = (AVHWFramesContext*)overlay_f->hw_frames_ctx->data;
+
+    for (int i = 0; i < planes; i++) {
+        RET(ff_vk_create_imageview(avctx, &s->main_images[i].imageView, main->img[i],
+                                   av_vkfmt_from_pixfmt(main_fc->sw_format)[i],
+                                   ff_comp_identity_map));
+
+        RET(ff_vk_create_imageview(avctx, &s->overlay_images[i].imageView, overlay->img[i],
+                                   av_vkfmt_from_pixfmt(overlay_fc->sw_format)[i],
+                                   ff_comp_identity_map));
+
+        RET(ff_vk_create_imageview(avctx, &s->output_images[i].imageView, out->img[i],
+                                   av_vkfmt_from_pixfmt(s->vkctx.output_format)[i],
+                                   ff_comp_identity_map));
+
+        s->main_images[i].imageLayout    = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
+        s->overlay_images[i].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
+        s->output_images[i].imageLayout  = VK_IMAGE_LAYOUT_GENERAL;
+    }
+
+    ff_vk_update_descriptor_set(avctx, s->pl, 0);
+
+    ff_vk_start_exec_recording(avctx, s->exec);
+
+    for (int i = 0; i < planes; i++) {
+        VkImageMemoryBarrier bar[3] = {
+            {
+                .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
+                .srcAccessMask = 0,
+                .dstAccessMask = VK_ACCESS_SHADER_READ_BIT,
+                .oldLayout = main->layout[i],
+                .newLayout = s->main_images[i].imageLayout,
+                .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
+                .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
+                .image = main->img[i],
+                .subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
+                .subresourceRange.levelCount = 1,
+                .subresourceRange.layerCount = 1,
+            },
+            {
+                .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
+                .srcAccessMask = 0,
+                .dstAccessMask = VK_ACCESS_SHADER_READ_BIT,
+                .oldLayout = overlay->layout[i],
+                .newLayout = s->overlay_images[i].imageLayout,
+                .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
+                .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
+                .image = overlay->img[i],
+                .subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
+                .subresourceRange.levelCount = 1,
+                .subresourceRange.layerCount = 1,
+            },
+            {
+                .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
+                .srcAccessMask = 0,
+                .dstAccessMask = VK_ACCESS_SHADER_WRITE_BIT,
+                .oldLayout = out->layout[i],
+                .newLayout = s->output_images[i].imageLayout,
+                .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
+                .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
+                .image = out->img[i],
+                .subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
+                .subresourceRange.levelCount = 1,
+                .subresourceRange.layerCount = 1,
+            },
+        };
+
+        vkCmdPipelineBarrier(s->exec->buf, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
+                             VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, 0,
+                             0, NULL, 0, NULL, FF_ARRAY_ELEMS(bar), bar);
+
+        main->layout[i]    = bar[0].newLayout;
+        main->access[i]    = bar[0].dstAccessMask;
+
+        overlay->layout[i] = bar[1].newLayout;
+        overlay->access[i] = bar[1].dstAccessMask;
+
+        out->layout[i]     = bar[2].newLayout;
+        out->access[i]     = bar[2].dstAccessMask;
+    }
+
+    ff_vk_bind_pipeline_exec(avctx, s->exec, s->pl);
+
+    vkCmdDispatch(s->exec->buf,
+                  FFALIGN(s->vkctx.output_width,  CGROUPS[0])/CGROUPS[0],
+                  FFALIGN(s->vkctx.output_height, CGROUPS[1])/CGROUPS[1], 1);
+
+    ff_vk_add_exec_dep(avctx, s->exec, main_f, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
+    ff_vk_add_exec_dep(avctx, s->exec, overlay_f, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
+    ff_vk_add_exec_dep(avctx, s->exec, out_f, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
+
+    err = ff_vk_submit_exec_queue(avctx, s->exec);
+    if (err)
+        return err;
+
+fail:
+
+    for (int i = 0; i < planes; i++) {
+        ff_vk_destroy_imageview(avctx, &s->main_images[i].imageView);
+        ff_vk_destroy_imageview(avctx, &s->overlay_images[i].imageView);
+        ff_vk_destroy_imageview(avctx, &s->output_images[i].imageView);
+    }
+
+    return err;
+}
+
+static int overlay_vulkan_blend(FFFrameSync *fs)
+{
+    int err;
+    AVFilterContext *ctx = fs->parent;
+    OverlayVulkanContext *s = ctx->priv;
+    AVFilterLink *outlink = ctx->outputs[0];
+    AVFrame *input_main, *input_overlay, *out;
+
+    err = ff_framesync_get_frame(fs, 0, &input_main, 0);
+    if (err < 0)
+        goto fail;
+    err = ff_framesync_get_frame(fs, 1, &input_overlay, 0);
+    if (err < 0)
+        goto fail;
+
+    if (!input_main || !input_overlay)
+        return 0;
+
+    if (!s->initialized) {
+        AVHWFramesContext *main_fc = (AVHWFramesContext*)input_main->hw_frames_ctx->data;
+        AVHWFramesContext *overlay_fc = (AVHWFramesContext*)input_overlay->hw_frames_ctx->data;
+        if (main_fc->sw_format != overlay_fc->sw_format) {
+            av_log(ctx, AV_LOG_ERROR, "Mismatching sw formats!\n");
+            return AVERROR(EINVAL);
+        }
+
+        s->overlay_w = input_overlay->width;
+        s->overlay_h = input_overlay->height;
+
+        RET(init_filter(ctx));
+    }
+
+    out = ff_get_video_buffer(outlink, outlink->w, outlink->h);
+    if (!out) {
+        err = AVERROR(ENOMEM);
+        goto fail;
+    }
+
+    RET(process_frames(ctx, out, input_main, input_overlay));
+
+    err = av_frame_copy_props(out, input_main);
+    if (err < 0)
+        goto fail;
+
+    return ff_filter_frame(outlink, out);
+
+fail:
+    av_frame_free(&out);
+    return err;
+}
+
+static int overlay_vulkan_config_output(AVFilterLink *outlink)
+{
+    int err;
+    AVFilterContext *avctx = outlink->src;
+    OverlayVulkanContext *s = avctx->priv;
+
+    err = ff_vk_filter_config_output(outlink);
+    if (err < 0)
+        return err;
+
+    err = ff_framesync_init_dualinput(&s->fs, avctx);
+    if (err < 0)
+        return err;
+
+    return ff_framesync_configure(&s->fs);
+}
+
+static int overlay_vulkan_activate(AVFilterContext *avctx)
+{
+    OverlayVulkanContext *s = avctx->priv;
+
+    return ff_framesync_activate(&s->fs);
+}
+
+static av_cold int overlay_vulkan_init(AVFilterContext *avctx)
+{
+    OverlayVulkanContext *s = avctx->priv;
+
+    s->fs.on_event = &overlay_vulkan_blend;
+
+    return ff_vk_filter_init(avctx);
+}
+
+static void overlay_vulkan_uninit(AVFilterContext *avctx)
+{
+    OverlayVulkanContext *s = avctx->priv;
+
+    ff_vk_filter_uninit(avctx);
+    ff_framesync_uninit(&s->fs);
+
+    ff_vk_free_buf(avctx, &s->params_buf);
+
+    s->initialized = 0;
+}
+
+#define OFFSET(x) offsetof(OverlayVulkanContext, x)
+#define FLAGS (AV_OPT_FLAG_FILTERING_PARAM | AV_OPT_FLAG_VIDEO_PARAM)
+static const AVOption overlay_vulkan_options[] = {
+    { "x", "Set horizontal offset", OFFSET(overlay_x), AV_OPT_TYPE_INT, {.i64 = 0}, 0, INT_MAX, .flags = FLAGS },
+    { "y", "Set vertical offset",   OFFSET(overlay_y), AV_OPT_TYPE_INT, {.i64 = 0}, 0, INT_MAX, .flags = FLAGS },
+    { NULL },
+};
+
+AVFILTER_DEFINE_CLASS(overlay_vulkan);
+
+static const AVFilterPad overlay_vulkan_inputs[] = {
+    {
+        .name         = "main",
+        .type         = AVMEDIA_TYPE_VIDEO,
+        .config_props = &ff_vk_filter_config_input,
+    },
+    {
+        .name         = "overlay",
+        .type         = AVMEDIA_TYPE_VIDEO,
+        .config_props = &ff_vk_filter_config_input,
+    },
+    { NULL }
+};
+
+static const AVFilterPad overlay_vulkan_outputs[] = {
+    {
+        .name = "default",
+        .type = AVMEDIA_TYPE_VIDEO,
+        .config_props = &overlay_vulkan_config_output,
+    },
+    { NULL }
+};
+
+AVFilter ff_vf_overlay_vulkan = {
+    .name           = "overlay_vulkan",
+    .description    = NULL_IF_CONFIG_SMALL("Overlay a source on top of another"),
+    .priv_size      = sizeof(OverlayVulkanContext),
+    .init           = &overlay_vulkan_init,
+    .uninit         = &overlay_vulkan_uninit,
+    .query_formats  = &ff_vk_filter_query_formats,
+    .activate       = &overlay_vulkan_activate,
+    .inputs         = overlay_vulkan_inputs,
+    .outputs        = overlay_vulkan_outputs,
+    .priv_class     = &overlay_vulkan_class,
+    .flags_internal = FF_FILTER_FLAG_HWFRAME_AWARE,
+};
diff --git a/libavfilter/vf_pad.c b/libavfilter/vf_pad.c
index ed15557..131f248 100644
--- a/libavfilter/vf_pad.c
+++ b/libavfilter/vf_pad.c
@@ -178,14 +178,14 @@
     if (s->y < 0 || s->y + inlink->h > s->h)
         s->y = var_values[VAR_Y] = (s->h - inlink->h) / 2;
 
+    s->w    = ff_draw_round_to_sub(&s->draw, 0, -1, s->w);
+    s->h    = ff_draw_round_to_sub(&s->draw, 1, -1, s->h);
     /* sanity check params */
-    if (s->w < 0 || s->h < 0) {
-        av_log(ctx, AV_LOG_ERROR, "Negative values are not acceptable.\n");
+    if (s->w < inlink->w || s->h < inlink->h) {
+        av_log(ctx, AV_LOG_ERROR, "Padded dimensions cannot be smaller than input dimensions.\n");
         return AVERROR(EINVAL);
     }
 
-    s->w    = ff_draw_round_to_sub(&s->draw, 0, -1, s->w);
-    s->h    = ff_draw_round_to_sub(&s->draw, 1, -1, s->h);
     s->x    = ff_draw_round_to_sub(&s->draw, 0, -1, s->x);
     s->y    = ff_draw_round_to_sub(&s->draw, 1, -1, s->y);
     s->in_w = ff_draw_round_to_sub(&s->draw, 0, -1, inlink->w);
@@ -210,7 +210,7 @@
     return 0;
 
 eval_fail:
-    av_log(NULL, AV_LOG_ERROR,
+    av_log(ctx, AV_LOG_ERROR,
            "Error when evaluating the expression '%s'\n", expr);
     return ret;
 
@@ -417,12 +417,12 @@
 #define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM
 
 static const AVOption pad_options[] = {
-    { "width",  "set the pad area width expression",       OFFSET(w_expr), AV_OPT_TYPE_STRING, {.str = "iw"}, CHAR_MIN, CHAR_MAX, FLAGS },
-    { "w",      "set the pad area width expression",       OFFSET(w_expr), AV_OPT_TYPE_STRING, {.str = "iw"}, CHAR_MIN, CHAR_MAX, FLAGS },
-    { "height", "set the pad area height expression",      OFFSET(h_expr), AV_OPT_TYPE_STRING, {.str = "ih"}, CHAR_MIN, CHAR_MAX, FLAGS },
-    { "h",      "set the pad area height expression",      OFFSET(h_expr), AV_OPT_TYPE_STRING, {.str = "ih"}, CHAR_MIN, CHAR_MAX, FLAGS },
-    { "x",      "set the x offset expression for the input image position", OFFSET(x_expr), AV_OPT_TYPE_STRING, {.str = "0"}, CHAR_MIN, CHAR_MAX, FLAGS },
-    { "y",      "set the y offset expression for the input image position", OFFSET(y_expr), AV_OPT_TYPE_STRING, {.str = "0"}, CHAR_MIN, CHAR_MAX, FLAGS },
+    { "width",  "set the pad area width expression",       OFFSET(w_expr), AV_OPT_TYPE_STRING, {.str = "iw"}, 0, 0, FLAGS },
+    { "w",      "set the pad area width expression",       OFFSET(w_expr), AV_OPT_TYPE_STRING, {.str = "iw"}, 0, 0, FLAGS },
+    { "height", "set the pad area height expression",      OFFSET(h_expr), AV_OPT_TYPE_STRING, {.str = "ih"}, 0, 0, FLAGS },
+    { "h",      "set the pad area height expression",      OFFSET(h_expr), AV_OPT_TYPE_STRING, {.str = "ih"}, 0, 0, FLAGS },
+    { "x",      "set the x offset expression for the input image position", OFFSET(x_expr), AV_OPT_TYPE_STRING, {.str = "0"}, 0, 0, FLAGS },
+    { "y",      "set the y offset expression for the input image position", OFFSET(y_expr), AV_OPT_TYPE_STRING, {.str = "0"}, 0, 0, FLAGS },
     { "color",  "set the color of the padded area border", OFFSET(rgba_color), AV_OPT_TYPE_COLOR, {.str = "black"}, .flags = FLAGS },
     { "eval",   "specify when to evaluate expressions",    OFFSET(eval_mode), AV_OPT_TYPE_INT, {.i64 = EVAL_MODE_INIT}, 0, EVAL_MODE_NB-1, FLAGS, "eval" },
          { "init",  "eval expressions once during initialization", 0, AV_OPT_TYPE_CONST, {.i64=EVAL_MODE_INIT},  .flags = FLAGS, .unit = "eval" },
diff --git a/libavfilter/vf_pad_opencl.c b/libavfilter/vf_pad_opencl.c
new file mode 100644
index 0000000..1129c40
--- /dev/null
+++ b/libavfilter/vf_pad_opencl.c
@@ -0,0 +1,397 @@
+/*
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "libavutil/colorspace.h"
+#include "libavutil/eval.h"
+#include "libavutil/opt.h"
+#include "libavutil/imgutils.h"
+#include "avfilter.h"
+#include "drawutils.h"
+#include "formats.h"
+#include "internal.h"
+#include "opencl.h"
+#include "opencl_source.h"
+#include "video.h"
+
+static const char *const var_names[] = {
+    "in_w",   "iw",
+    "in_h",   "ih",
+    "out_w",  "ow",
+    "out_h",  "oh",
+    "x",
+    "y",
+    "a",
+    "sar",
+    "dar",
+    NULL
+};
+
+enum var_name {
+    VAR_IN_W,   VAR_IW,
+    VAR_IN_H,   VAR_IH,
+    VAR_OUT_W,  VAR_OW,
+    VAR_OUT_H,  VAR_OH,
+    VAR_X,
+    VAR_Y,
+    VAR_A,
+    VAR_SAR,
+    VAR_DAR,
+    VARS_NB
+};
+
+typedef struct PadOpenCLContext {
+    OpenCLFilterContext ocf;
+    int initialized;
+    int is_rgb;
+    int is_packed;
+    int hsub, vsub;
+
+    char *w_expr;
+    char *h_expr;
+    char *x_expr;
+    char *y_expr;
+    AVRational aspect;
+
+    cl_command_queue command_queue;
+    cl_kernel kernel_pad;
+
+    int w, h;
+    int x, y;
+    uint8_t pad_rgba[4];
+    uint8_t pad_color[4];
+    cl_float4 pad_color_float;
+    cl_int2 pad_pos;
+} PadOpenCLContext;
+
+static int pad_opencl_init(AVFilterContext *avctx, AVFrame *input_frame)
+{
+    PadOpenCLContext *ctx = avctx->priv;
+    AVHWFramesContext *input_frames_ctx = (AVHWFramesContext *)input_frame->hw_frames_ctx->data;
+    const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(input_frames_ctx->sw_format);
+    uint8_t rgba_map[4];
+    cl_int cle;
+    int err;
+
+    ff_fill_rgba_map(rgba_map, input_frames_ctx->sw_format);
+    ctx->is_rgb = !!(desc->flags & AV_PIX_FMT_FLAG_RGB);
+    ctx->is_packed = !(desc->flags & AV_PIX_FMT_FLAG_PLANAR);
+    ctx->hsub = desc->log2_chroma_w;
+    ctx->vsub = desc->log2_chroma_h;
+
+    err = ff_opencl_filter_load_program(avctx, &ff_opencl_source_pad, 1);
+    if (err < 0)
+        goto fail;
+
+    ctx->command_queue = clCreateCommandQueue(
+        ctx->ocf.hwctx->context,
+        ctx->ocf.hwctx->device_id,
+        0,
+        &cle
+    );
+
+    if (ctx->is_rgb) {
+        ctx->pad_color[rgba_map[0]] = ctx->pad_rgba[0];
+        ctx->pad_color[rgba_map[1]] = ctx->pad_rgba[1];
+        ctx->pad_color[rgba_map[2]] = ctx->pad_rgba[2];
+        ctx->pad_color[rgba_map[3]] = ctx->pad_rgba[3];
+    } else {
+        ctx->pad_color[0] = RGB_TO_Y_BT709(ctx->pad_rgba[0], ctx->pad_rgba[1], ctx->pad_rgba[2]);
+        ctx->pad_color[1] = RGB_TO_U_BT709(ctx->pad_rgba[0], ctx->pad_rgba[1], ctx->pad_rgba[2], 0);
+        ctx->pad_color[2] = RGB_TO_V_BT709(ctx->pad_rgba[0], ctx->pad_rgba[1], ctx->pad_rgba[2], 0);
+        ctx->pad_color[3] = ctx->pad_rgba[3];
+    }
+
+    CL_FAIL_ON_ERROR(AVERROR(EIO), "Failed to create OpenCL command queue %d.\n", cle);
+
+    ctx->kernel_pad = clCreateKernel(ctx->ocf.program, "pad", &cle);
+    CL_FAIL_ON_ERROR(AVERROR(EIO), "Failed to create pad kernel: %d.\n", cle);
+
+    for (int i = 0; i < 4; ++i) {
+        ctx->pad_color_float.s[i] = (float)ctx->pad_color[i] / 255.0;
+    }
+
+    ctx->pad_pos.s[0] = ctx->x;
+    ctx->pad_pos.s[1] = ctx->y;
+
+    ctx->initialized = 1;
+    return 0;
+
+fail:
+    if (ctx->command_queue)
+        clReleaseCommandQueue(ctx->command_queue);
+    if (ctx->kernel_pad)
+        clReleaseKernel(ctx->kernel_pad);
+    return err;
+}
+
+static int filter_frame(AVFilterLink *link, AVFrame *input_frame)
+{
+    AVFilterContext *avctx = link->dst;
+    AVFilterLink *outlink = avctx->outputs[0];
+    PadOpenCLContext *pad_ctx = avctx->priv;
+    AVFrame *output_frame = NULL;
+    int err;
+    cl_int cle;
+    size_t global_work[2];
+    cl_mem src, dst;
+
+    if (!input_frame->hw_frames_ctx)
+        return AVERROR(EINVAL);
+
+    if (!pad_ctx->initialized) {
+        err = pad_opencl_init(avctx, input_frame);
+        if (err < 0)
+            goto fail;
+    }
+
+    output_frame = ff_get_video_buffer(outlink, outlink->w, outlink->h);
+    if (!output_frame) {
+        err = AVERROR(ENOMEM);
+        goto fail;
+    }
+
+    for (int p = 0; p < FF_ARRAY_ELEMS(output_frame->data); p++) {
+        cl_float4 pad_color_float;
+        cl_int2 pad_pos;
+
+        if (pad_ctx->is_packed) {
+            pad_color_float = pad_ctx->pad_color_float;
+        } else {
+            pad_color_float.s[0] = pad_ctx->pad_color_float.s[p];
+            pad_color_float.s[1] = pad_ctx->pad_color_float.s[2];
+        }
+
+        if (p > 0 && p < 3) {
+            pad_pos.s[0] = pad_ctx->pad_pos.s[0] >> pad_ctx->hsub;
+            pad_pos.s[1] = pad_ctx->pad_pos.s[1] >> pad_ctx->vsub;
+        } else {
+            pad_pos.s[0] = pad_ctx->pad_pos.s[0];
+            pad_pos.s[1] = pad_ctx->pad_pos.s[1];
+        }
+
+        src = (cl_mem)input_frame->data[p];
+        dst = (cl_mem)output_frame->data[p];
+
+        if (!dst)
+            break;
+
+        CL_SET_KERNEL_ARG(pad_ctx->kernel_pad, 0, cl_mem, &src);
+        CL_SET_KERNEL_ARG(pad_ctx->kernel_pad, 1, cl_mem, &dst);
+        CL_SET_KERNEL_ARG(pad_ctx->kernel_pad, 2, cl_float4, &pad_color_float);
+        CL_SET_KERNEL_ARG(pad_ctx->kernel_pad, 3, cl_int2, &pad_pos);
+
+        err = ff_opencl_filter_work_size_from_image(avctx, global_work, output_frame, p, 16);
+        if (err < 0)
+            goto fail;
+
+        cle = clEnqueueNDRangeKernel(pad_ctx->command_queue, pad_ctx->kernel_pad, 2, NULL,
+                                     global_work, NULL, 0, NULL, NULL);
+
+        CL_FAIL_ON_ERROR(AVERROR(EIO), "Failed to enqueue pad kernel: %d.\n", cle);
+    }
+
+    // Run queued kernel
+    cle = clFinish(pad_ctx->command_queue);
+    CL_FAIL_ON_ERROR(AVERROR(EIO), "Failed to finish command queue: %d.\n", cle);
+
+    err = av_frame_copy_props(output_frame, input_frame);
+    if (err < 0)
+        goto fail;
+
+    av_frame_free(&input_frame);
+
+    return ff_filter_frame(outlink, output_frame);
+
+fail:
+    clFinish(pad_ctx->command_queue);
+    av_frame_free(&input_frame);
+    av_frame_free(&output_frame);
+    return err;
+}
+
+static av_cold void pad_opencl_uninit(AVFilterContext *avctx)
+{
+    PadOpenCLContext *ctx = avctx->priv;
+    cl_int cle;
+
+    if (ctx->kernel_pad) {
+        cle = clReleaseKernel(ctx->kernel_pad);
+        if (cle != CL_SUCCESS)
+            av_log(avctx, AV_LOG_ERROR, "Failed to release "
+                   "kernel: %d.\n", cle);
+    }
+
+    if (ctx->command_queue) {
+        cle = clReleaseCommandQueue(ctx->command_queue);
+        if (cle != CL_SUCCESS)
+            av_log(avctx, AV_LOG_ERROR, "Failed to release "
+                   "command queue: %d.\n", cle);
+    }
+
+    ff_opencl_filter_uninit(avctx);
+}
+
+static int pad_opencl_config_output(AVFilterLink *outlink)
+{
+    AVFilterContext *avctx = outlink->src;
+    AVFilterLink *inlink = avctx->inputs[0];
+    PadOpenCLContext *ctx = avctx->priv;
+    AVRational adjusted_aspect = ctx->aspect;
+    double var_values[VARS_NB], res;
+    int err, ret;
+    char *expr;
+
+    var_values[VAR_IN_W]  = var_values[VAR_IW] = inlink->w;
+    var_values[VAR_IN_H]  = var_values[VAR_IH] = inlink->h;
+    var_values[VAR_OUT_W] = var_values[VAR_OW] = NAN;
+    var_values[VAR_OUT_H] = var_values[VAR_OH] = NAN;
+    var_values[VAR_A]     = (double) inlink->w / inlink->h;
+    var_values[VAR_SAR]   = inlink->sample_aspect_ratio.num ?
+        (double) inlink->sample_aspect_ratio.num / inlink->sample_aspect_ratio.den : 1;
+    var_values[VAR_DAR]   = var_values[VAR_A] * var_values[VAR_SAR];
+
+    av_expr_parse_and_eval(&res, (expr = ctx->w_expr),
+                           var_names, var_values,
+                           NULL, NULL, NULL, NULL, NULL, 0, ctx);
+    ctx->w = var_values[VAR_OUT_W] = var_values[VAR_OW] = res;
+    if ((ret = av_expr_parse_and_eval(&res, (expr = ctx->h_expr),
+                                      var_names, var_values,
+                                      NULL, NULL, NULL, NULL, NULL, 0, ctx)) < 0)
+        return ret;
+    ctx->h = var_values[VAR_OUT_H] = var_values[VAR_OH] = res;
+    if (!ctx->h)
+        var_values[VAR_OUT_H] = var_values[VAR_OH] = ctx->h = inlink->h;
+
+    /* evaluate the width again, as it may depend on the evaluated output height */
+    if ((ret = av_expr_parse_and_eval(&res, (expr = ctx->w_expr),
+                                      var_names, var_values,
+                                      NULL, NULL, NULL, NULL, NULL, 0, ctx)) < 0)
+        return ret;
+    ctx->w = var_values[VAR_OUT_W] = var_values[VAR_OW] = res;
+    if (!ctx->w)
+        var_values[VAR_OUT_W] = var_values[VAR_OW] = ctx->w = inlink->w;
+
+    if (adjusted_aspect.num && adjusted_aspect.den) {
+        adjusted_aspect = av_div_q(adjusted_aspect, inlink->sample_aspect_ratio);
+        if (ctx->h < av_rescale(ctx->w, adjusted_aspect.den, adjusted_aspect.num)) {
+            ctx->h = var_values[VAR_OUT_H] = var_values[VAR_OH] = av_rescale(ctx->w, adjusted_aspect.den, adjusted_aspect.num);
+        } else {
+            ctx->w = var_values[VAR_OUT_W] = var_values[VAR_OW] = av_rescale(ctx->h, adjusted_aspect.num, adjusted_aspect.den);
+        }
+    }
+
+    /* evaluate x and y */
+    av_expr_parse_and_eval(&res, (expr = ctx->x_expr),
+                           var_names, var_values,
+                           NULL, NULL, NULL, NULL, NULL, 0, ctx);
+    ctx->x = var_values[VAR_X] = res;
+    if ((ret = av_expr_parse_and_eval(&res, (expr = ctx->y_expr),
+                                      var_names, var_values,
+                                      NULL, NULL, NULL, NULL, NULL, 0, ctx)) < 0)
+        return ret;
+    ctx->y = var_values[VAR_Y] = res;
+    /* evaluate x again, as it may depend on the evaluated y value */
+    if ((ret = av_expr_parse_and_eval(&res, (expr = ctx->x_expr),
+                                      var_names, var_values,
+                                      NULL, NULL, NULL, NULL, NULL, 0, ctx)) < 0)
+        return ret;
+    ctx->x = var_values[VAR_X] = res;
+
+    if (ctx->x < 0 || ctx->x + inlink->w > ctx->w)
+        ctx->x = var_values[VAR_X] = (ctx->w - inlink->w) / 2;
+    if (ctx->y < 0 || ctx->y + inlink->h > ctx->h)
+        ctx->y = var_values[VAR_Y] = (ctx->h - inlink->h) / 2;
+
+    /* sanity check params */
+    if (ctx->w < inlink->w || ctx->h < inlink->h) {
+        av_log(ctx, AV_LOG_ERROR, "Padded dimensions cannot be smaller than input dimensions.\n");
+        return AVERROR(EINVAL);
+    }
+
+    if (ctx->w > avctx->inputs[0]->w) {
+        ctx->ocf.output_width  = ctx->w;
+    } else {
+        ctx->ocf.output_width  = avctx->inputs[0]->w;
+    }
+
+    if (ctx->h > avctx->inputs[0]->h) {
+        ctx->ocf.output_height = ctx->h;
+    } else {
+        ctx->ocf.output_height = avctx->inputs[0]->h;
+    }
+
+    if (ctx->x + avctx->inputs[0]->w > ctx->ocf.output_width ||
+        ctx->y + avctx->inputs[0]->h > ctx->ocf.output_height) {
+        return AVERROR(EINVAL);
+    }
+
+    err = ff_opencl_filter_config_output(outlink);
+    if (err < 0)
+        return err;
+
+    return 0;
+}
+
+static const AVFilterPad pad_opencl_inputs[] = {
+    {
+        .name = "default",
+        .type = AVMEDIA_TYPE_VIDEO,
+        .filter_frame = filter_frame,
+        .config_props = &ff_opencl_filter_config_input,
+    },
+    { NULL }
+};
+
+static const AVFilterPad pad_opencl_outputs[] = {
+    {
+        .name = "default",
+        .type = AVMEDIA_TYPE_VIDEO,
+        .config_props = &pad_opencl_config_output,
+    },
+    { NULL }
+};
+
+#define OFFSET(x) offsetof(PadOpenCLContext, x)
+#define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM
+
+static const AVOption pad_opencl_options[] = {
+    { "width",  "set the pad area width",       OFFSET(w_expr), AV_OPT_TYPE_STRING, {.str = "iw"}, 0, 0, FLAGS },
+    { "w",      "set the pad area width",       OFFSET(w_expr), AV_OPT_TYPE_STRING, {.str = "iw"}, 0, 0, FLAGS },
+    { "height", "set the pad area height",      OFFSET(h_expr), AV_OPT_TYPE_STRING, {.str = "ih"}, 0, 0, FLAGS },
+    { "h",      "set the pad area height",      OFFSET(h_expr), AV_OPT_TYPE_STRING, {.str = "ih"}, 0, 0, FLAGS },
+    { "x",      "set the x offset for the input image position", OFFSET(x_expr), AV_OPT_TYPE_STRING, {.str = "0"}, 0, INT16_MAX, FLAGS },
+    { "y",      "set the y offset for the input image position", OFFSET(y_expr), AV_OPT_TYPE_STRING, {.str = "0"}, 0, INT16_MAX, FLAGS },
+    { "color", "set the color of the padded area border", OFFSET(pad_rgba), AV_OPT_TYPE_COLOR, { .str = "black" }, 0, 0, FLAGS },
+    { "aspect",  "pad to fit an aspect instead of a resolution", OFFSET(aspect), AV_OPT_TYPE_RATIONAL, {.dbl = 0}, 0, INT16_MAX, FLAGS },
+    { NULL }
+};
+
+AVFILTER_DEFINE_CLASS(pad_opencl);
+
+AVFilter ff_vf_pad_opencl = {
+    .name           = "pad_opencl",
+    .description    = NULL_IF_CONFIG_SMALL("Pad the input video."),
+    .priv_size      = sizeof(PadOpenCLContext),
+    .priv_class     = &pad_opencl_class,
+    .init           = &ff_opencl_filter_init,
+    .uninit         = &pad_opencl_uninit,
+    .query_formats  = &ff_opencl_filter_query_formats,
+    .inputs         = pad_opencl_inputs,
+    .outputs        = pad_opencl_outputs,
+    .flags_internal = FF_FILTER_FLAG_HWFRAME_AWARE
+};
diff --git a/libavfilter/vf_palettegen.c b/libavfilter/vf_palettegen.c
index 5ff73e6..9b0a0e1 100644
--- a/libavfilter/vf_palettegen.c
+++ b/libavfilter/vf_palettegen.c
@@ -83,7 +83,7 @@
 static const AVOption palettegen_options[] = {
     { "max_colors", "set the maximum number of colors to use in the palette", OFFSET(max_colors), AV_OPT_TYPE_INT, {.i64=256}, 4, 256, FLAGS },
     { "reserve_transparent", "reserve a palette entry for transparency", OFFSET(reserve_transparent), AV_OPT_TYPE_BOOL, {.i64=1}, 0, 1, FLAGS },
-    { "transparency_color", "set a background color for transparency", OFFSET(transparency_color), AV_OPT_TYPE_COLOR, {.str="lime"}, CHAR_MIN, CHAR_MAX, FLAGS },
+    { "transparency_color", "set a background color for transparency", OFFSET(transparency_color), AV_OPT_TYPE_COLOR, {.str="lime"}, 0, 0, FLAGS },
     { "stats_mode", "set statistics mode", OFFSET(stats_mode), AV_OPT_TYPE_INT, {.i64=STATS_MODE_ALL_FRAMES}, 0, NB_STATS_MODE-1, FLAGS, "mode" },
         { "full", "compute full frame histograms", 0, AV_OPT_TYPE_CONST, {.i64=STATS_MODE_ALL_FRAMES}, INT_MIN, INT_MAX, FLAGS, "mode" },
         { "diff", "compute histograms only for the part that differs from previous frame", 0, AV_OPT_TYPE_CONST, {.i64=STATS_MODE_DIFF_FRAMES}, INT_MIN, INT_MAX, FLAGS, "mode" },
@@ -245,7 +245,7 @@
                     av_log(ctx, AV_LOG_WARNING, "Dupped color: %08"PRIX32"\n", pal[x]);
                 last_color = pal[x];
             } else {
-                pal[x] = 0xff000000; // pad with black
+                pal[x] = last_color; // pad with last color
             }
         }
         pal += pal_linesize;
diff --git a/libavfilter/vf_paletteuse.c b/libavfilter/vf_paletteuse.c
index 604a8af..b32ff81 100644
--- a/libavfilter/vf_paletteuse.c
+++ b/libavfilter/vf_paletteuse.c
@@ -119,10 +119,10 @@
     { "diff_mode",   "set frame difference mode",     OFFSET(diff_mode),   AV_OPT_TYPE_INT, {.i64=DIFF_MODE_NONE}, 0, NB_DIFF_MODE-1, FLAGS, "diff_mode" },
         { "rectangle", "process smallest different rectangle", 0, AV_OPT_TYPE_CONST, {.i64=DIFF_MODE_RECTANGLE}, INT_MIN, INT_MAX, FLAGS, "diff_mode" },
     { "new", "take new palette for each output frame", OFFSET(new), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS },
-    { "alpha_threshold", "set the alpha threshold for transparency", OFFSET(trans_thresh), AV_OPT_TYPE_INT, {.i64=128}, 0, 255 },
+    { "alpha_threshold", "set the alpha threshold for transparency", OFFSET(trans_thresh), AV_OPT_TYPE_INT, {.i64=128}, 0, 255, FLAGS },
 
     /* following are the debug options, not part of the official API */
-    { "debug_kdtree", "save Graphviz graph of the kdtree in specified file", OFFSET(dot_filename), AV_OPT_TYPE_STRING, {.str=NULL}, CHAR_MIN, CHAR_MAX, FLAGS },
+    { "debug_kdtree", "save Graphviz graph of the kdtree in specified file", OFFSET(dot_filename), AV_OPT_TYPE_STRING, {.str=NULL}, 0, 0, FLAGS },
     { "color_search", "set reverse colormap color search method", OFFSET(color_search_method), AV_OPT_TYPE_INT, {.i64=COLOR_SEARCH_NNS_ITERATIVE}, 0, NB_COLOR_SEARCHES-1, FLAGS, "search" },
         { "nns_iterative", "iterative search",             0, AV_OPT_TYPE_CONST, {.i64=COLOR_SEARCH_NNS_ITERATIVE}, INT_MIN, INT_MAX, FLAGS, "search" },
         { "nns_recursive", "recursive search",             0, AV_OPT_TYPE_CONST, {.i64=COLOR_SEARCH_NNS_RECURSIVE}, INT_MIN, INT_MAX, FLAGS, "search" },
@@ -814,7 +814,7 @@
     int width  = cur_src->width;
     int height = cur_src->height;
 
-    if (prv_src && diff_mode == DIFF_MODE_RECTANGLE) {
+    if (prv_src->data[0] && diff_mode == DIFF_MODE_RECTANGLE) {
         int y;
         int x_end = cur_src->width  - 1,
             y_end = cur_src->height - 1;
@@ -903,7 +903,6 @@
 
     AVFrame *out = ff_get_video_buffer(outlink, outlink->w, outlink->h);
     if (!out) {
-        av_frame_free(&in);
         *outf = NULL;
         return AVERROR(ENOMEM);
     }
@@ -911,16 +910,14 @@
 
     set_processing_window(s->diff_mode, s->last_in, in,
                           s->last_out, out, &x, &y, &w, &h);
-    av_frame_free(&s->last_in);
-    av_frame_free(&s->last_out);
-    s->last_in  = av_frame_clone(in);
-    s->last_out = av_frame_clone(out);
-    if (!s->last_in || !s->last_out ||
-        av_frame_make_writable(s->last_in) < 0) {
-        av_frame_free(&in);
+    av_frame_unref(s->last_in);
+    av_frame_unref(s->last_out);
+    if ((ret = av_frame_ref(s->last_in, in))       < 0 ||
+        (ret = av_frame_ref(s->last_out, out))     < 0 ||
+        (ret = av_frame_make_writable(s->last_in)) < 0) {
         av_frame_free(&out);
         *outf = NULL;
-        return AVERROR(ENOMEM);
+        return ret;
     }
 
     ff_dlog(ctx, "%dx%d rect: (%d;%d) -> (%d,%d) [area:%dx%d]\n",
@@ -935,7 +932,6 @@
     memcpy(out->data[1], s->palette, AVPALETTE_SIZE);
     if (s->calc_mean_err)
         debug_mean_error(s, in, out, inlink->frame_count_out);
-    av_frame_free(&in);
     *outf = out;
     return 0;
 }
@@ -1024,20 +1020,17 @@
     if (ret < 0)
         return ret;
     if (!master || !second) {
-        ret = AVERROR_BUG;
-        goto error;
+        av_frame_free(&master);
+        return AVERROR_BUG;
     }
     if (!s->palette_loaded) {
         load_palette(s, second);
     }
     ret = apply_palette(inlink, master, &out);
-    if (ret < 0)
-        goto error;
-    return ff_filter_frame(ctx->outputs[0], out);
-
-error:
     av_frame_free(&master);
-    return ret;
+    if (ret < 0)
+        return ret;
+    return ff_filter_frame(ctx->outputs[0], out);
 }
 
 #define DEFINE_SET_FRAME(color_search, name, value)                             \
@@ -1086,6 +1079,14 @@
 {
     PaletteUseContext *s = ctx->priv;
 
+    s->last_in  = av_frame_alloc();
+    s->last_out = av_frame_alloc();
+    if (!s->last_in || !s->last_out) {
+        av_frame_free(&s->last_in);
+        av_frame_free(&s->last_out);
+        return AVERROR(ENOMEM);
+    }
+
     s->set_frame = set_frame_lut[s->color_search_method][s->dither];
 
     if (s->dither == DITHERING_BAYER) {
diff --git a/libavfilter/vf_photosensitivity.c b/libavfilter/vf_photosensitivity.c
new file mode 100644
index 0000000..e05c187
--- /dev/null
+++ b/libavfilter/vf_photosensitivity.c
@@ -0,0 +1,341 @@
+/*
+ * Copyright (c) 2019 Vladimir Panteleev
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include <float.h>
+
+#include "libavutil/imgutils.h"
+#include "libavutil/opt.h"
+#include "libavutil/pixdesc.h"
+#include "avfilter.h"
+
+#include "formats.h"
+#include "internal.h"
+#include "video.h"
+
+#define MAX_FRAMES 240
+#define GRID_SIZE 8
+#define NUM_CHANNELS 3
+
+typedef struct PhotosensitivityFrame {
+    uint8_t grid[GRID_SIZE][GRID_SIZE][4];
+} PhotosensitivityFrame;
+
+typedef struct PhotosensitivityContext {
+    const AVClass *class;
+
+    int nb_frames;
+    int skip;
+    float threshold_multiplier;
+    int bypass;
+
+    int badness_threshold;
+
+    /* Circular buffer */
+    int history[MAX_FRAMES];
+    int history_pos;
+
+    PhotosensitivityFrame last_frame_e;
+    AVFrame *last_frame_av;
+} PhotosensitivityContext;
+
+#define OFFSET(x) offsetof(PhotosensitivityContext, x)
+#define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
+
+static const AVOption photosensitivity_options[] = {
+    { "frames",    "set how many frames to use",                          OFFSET(nb_frames),            AV_OPT_TYPE_INT,   {.i64=30}, 2, MAX_FRAMES, FLAGS },
+    { "f",         "set how many frames to use",                          OFFSET(nb_frames),            AV_OPT_TYPE_INT,   {.i64=30}, 2, MAX_FRAMES, FLAGS },
+    { "threshold", "set detection threshold factor (lower is stricter)",  OFFSET(threshold_multiplier), AV_OPT_TYPE_FLOAT, {.dbl=1},  0.1, FLT_MAX,  FLAGS },
+    { "t",         "set detection threshold factor (lower is stricter)",  OFFSET(threshold_multiplier), AV_OPT_TYPE_FLOAT, {.dbl=1},  0.1, FLT_MAX,  FLAGS },
+    { "skip",      "set pixels to skip when sampling frames",             OFFSET(skip),                 AV_OPT_TYPE_INT,   {.i64=1},  1, 1024,       FLAGS },
+    { "bypass",    "leave frames unchanged",                              OFFSET(bypass),               AV_OPT_TYPE_BOOL,  {.i64=0},  0, 1,          FLAGS },
+    { NULL }
+};
+
+AVFILTER_DEFINE_CLASS(photosensitivity);
+
+static int query_formats(AVFilterContext *ctx)
+{
+    static const enum AVPixelFormat pixel_fmts[] = {
+        AV_PIX_FMT_RGB24,
+        AV_PIX_FMT_BGR24,
+        AV_PIX_FMT_NONE
+    };
+    AVFilterFormats *formats = ff_make_format_list(pixel_fmts);
+    if (!formats)
+        return AVERROR(ENOMEM);
+    return ff_set_common_formats(ctx, formats);
+}
+
+typedef struct ThreadData_convert_frame
+{
+    AVFrame *in;
+    PhotosensitivityFrame *out;
+    int skip;
+} ThreadData_convert_frame;
+
+#define NUM_CELLS (GRID_SIZE * GRID_SIZE)
+
+static int convert_frame_partial(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
+{
+    int cell, gx, gy, x0, x1, y0, y1, x, y, c, area;
+    int sum[NUM_CHANNELS];
+    const uint8_t *p;
+
+    ThreadData_convert_frame *td = arg;
+
+    const int slice_start = (NUM_CELLS * jobnr) / nb_jobs;
+    const int slice_end = (NUM_CELLS * (jobnr+1)) / nb_jobs;
+
+    int width = td->in->width, height = td->in->height, linesize = td->in->linesize[0], skip = td->skip;
+    const uint8_t *data = td->in->data[0];
+
+    for (cell = slice_start; cell < slice_end; cell++) {
+        gx = cell % GRID_SIZE;
+        gy = cell / GRID_SIZE;
+
+        x0 = width  *  gx    / GRID_SIZE;
+        x1 = width  * (gx+1) / GRID_SIZE;
+        y0 = height *  gy    / GRID_SIZE;
+        y1 = height * (gy+1) / GRID_SIZE;
+
+        for (c = 0; c < NUM_CHANNELS; c++) {
+            sum[c] = 0;
+        }
+        for (y = y0; y < y1; y += skip) {
+            p = data + y * linesize + x0 * NUM_CHANNELS;
+            for (x = x0; x < x1; x += skip) {
+                //av_log(NULL, AV_LOG_VERBOSE, "%d %d %d : (%d,%d) (%d,%d) -> %d,%d | *%d\n", c, gx, gy, x0, y0, x1, y1, x, y, (int)row);
+                sum[0] += p[0];
+                sum[1] += p[1];
+                sum[2] += p[2];
+                p += NUM_CHANNELS * skip;
+                // TODO: variable size
+            }
+        }
+
+        area = ((x1 - x0 + skip - 1) / skip) * ((y1 - y0 + skip - 1) / skip);
+        for (c = 0; c < NUM_CHANNELS; c++) {
+            if (area)
+                sum[c] /= area;
+            td->out->grid[gy][gx][c] = sum[c];
+        }
+    }
+    return 0;
+}
+
+static void convert_frame(AVFilterContext *ctx, AVFrame *in, PhotosensitivityFrame *out, int skip)
+{
+    ThreadData_convert_frame td;
+    td.in = in;
+    td.out = out;
+    td.skip = skip;
+    ctx->internal->execute(ctx, convert_frame_partial, &td, NULL, FFMIN(NUM_CELLS, ff_filter_get_nb_threads(ctx)));
+}
+
+typedef struct ThreadData_blend_frame
+{
+    AVFrame *target;
+    AVFrame *source;
+    uint16_t s_mul;
+} ThreadData_blend_frame;
+
+static int blend_frame_partial(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
+{
+    int x, y;
+    uint8_t *t, *s;
+
+    ThreadData_blend_frame *td = arg;
+    const uint16_t s_mul = td->s_mul;
+    const uint16_t t_mul = 0x100 - s_mul;
+    const int slice_start = (td->target->height * jobnr) / nb_jobs;
+    const int slice_end = (td->target->height * (jobnr+1)) / nb_jobs;
+    const int linesize = td->target->linesize[0];
+
+    for (y = slice_start; y < slice_end; y++) {
+        t = td->target->data[0] + y * td->target->linesize[0];
+        s = td->source->data[0] + y * td->source->linesize[0];
+        for (x = 0; x < linesize; x++) {
+            *t = (*t * t_mul + *s * s_mul) >> 8;
+            t++; s++;
+        }
+    }
+    return 0;
+}
+
+static void blend_frame(AVFilterContext *ctx, AVFrame *target, AVFrame *source, float factor)
+{
+    ThreadData_blend_frame td;
+    td.target = target;
+    td.source = source;
+    td.s_mul = (uint16_t)(factor * 0x100);
+    ctx->internal->execute(ctx, blend_frame_partial, &td, NULL, FFMIN(ctx->outputs[0]->h, ff_filter_get_nb_threads(ctx)));
+}
+
+static int get_badness(PhotosensitivityFrame *a, PhotosensitivityFrame *b)
+{
+    int badness, x, y, c;
+    badness = 0;
+    for (c = 0; c < NUM_CHANNELS; c++) {
+        for (y = 0; y < GRID_SIZE; y++) {
+            for (x = 0; x < GRID_SIZE; x++) {
+                badness += abs((int)a->grid[y][x][c] - (int)b->grid[y][x][c]);
+                //av_log(NULL, AV_LOG_VERBOSE, "%d - %d -> %d \n", a->grid[y][x], b->grid[y][x], badness);
+                //av_log(NULL, AV_LOG_VERBOSE, "%d -> %d \n", abs((int)a->grid[y][x] - (int)b->grid[y][x]), badness);
+            }
+        }
+    }
+    return badness;
+}
+
+static int config_input(AVFilterLink *inlink)
+{
+    /* const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(inlink->format); */
+    AVFilterContext *ctx = inlink->dst;
+    PhotosensitivityContext *s = ctx->priv;
+
+    s->badness_threshold = (int)(GRID_SIZE * GRID_SIZE * 4 * 256 * s->nb_frames * s->threshold_multiplier / 128);
+
+    return 0;
+}
+
+static int filter_frame(AVFilterLink *inlink, AVFrame *in)
+{
+    int this_badness, current_badness, fixed_badness, new_badness, i, res;
+    PhotosensitivityFrame ef;
+    AVFrame *src, *out;
+    int free_in = 0;
+    float factor;
+    AVDictionary **metadata;
+
+    AVFilterContext *ctx = inlink->dst;
+    AVFilterLink *outlink = ctx->outputs[0];
+    PhotosensitivityContext *s = ctx->priv;
+
+    /* weighted moving average */
+    current_badness = 0;
+    for (i = 1; i < s->nb_frames; i++)
+        current_badness += i * s->history[(s->history_pos + i) % s->nb_frames];
+    current_badness /= s->nb_frames;
+
+    convert_frame(ctx, in, &ef, s->skip);
+    this_badness = get_badness(&ef, &s->last_frame_e);
+    new_badness = current_badness + this_badness;
+    av_log(s, AV_LOG_VERBOSE, "badness: %6d -> %6d / %6d (%3d%% - %s)\n",
+        current_badness, new_badness, s->badness_threshold,
+        100 * new_badness / s->badness_threshold, new_badness < s->badness_threshold ? "OK" : "EXCEEDED");
+
+    fixed_badness = new_badness;
+    if (new_badness < s->badness_threshold || !s->last_frame_av || s->bypass) {
+        factor = 1; /* for metadata */
+        av_frame_free(&s->last_frame_av);
+        s->last_frame_av = src = in;
+        s->last_frame_e = ef;
+        s->history[s->history_pos] = this_badness;
+    } else {
+        factor = (float)(s->badness_threshold - current_badness) / (new_badness - current_badness);
+        if (factor <= 0) {
+            /* just duplicate the frame */
+            s->history[s->history_pos] = 0; /* frame was duplicated, thus, delta is zero */
+        } else {
+            res = av_frame_make_writable(s->last_frame_av);
+            if (res) {
+                av_frame_free(&in);
+                return res;
+            }
+            blend_frame(ctx, s->last_frame_av, in, factor);
+
+            convert_frame(ctx, s->last_frame_av, &ef, s->skip);
+            this_badness = get_badness(&ef, &s->last_frame_e);
+            fixed_badness = current_badness + this_badness;
+            av_log(s, AV_LOG_VERBOSE, "  fixed: %6d -> %6d / %6d (%3d%%) factor=%5.3f\n",
+                current_badness, fixed_badness, s->badness_threshold,
+                100 * new_badness / s->badness_threshold, factor);
+            s->last_frame_e = ef;
+            s->history[s->history_pos] = this_badness;
+        }
+        src = s->last_frame_av;
+        free_in = 1;
+    }
+    s->history_pos = (s->history_pos + 1) % s->nb_frames;
+
+    out = ff_get_video_buffer(outlink, in->width, in->height);
+    if (!out) {
+        if (free_in == 1)
+            av_frame_free(&in);
+        return AVERROR(ENOMEM);
+    }
+    av_frame_copy_props(out, in);
+    metadata = &out->metadata;
+    if (metadata) {
+        char value[128];
+
+        snprintf(value, sizeof(value), "%f", (float)new_badness / s->badness_threshold);
+        av_dict_set(metadata, "lavfi.photosensitivity.badness", value, 0);
+
+        snprintf(value, sizeof(value), "%f", (float)fixed_badness / s->badness_threshold);
+        av_dict_set(metadata, "lavfi.photosensitivity.fixed-badness", value, 0);
+
+        snprintf(value, sizeof(value), "%f", (float)this_badness / s->badness_threshold);
+        av_dict_set(metadata, "lavfi.photosensitivity.frame-badness", value, 0);
+
+        snprintf(value, sizeof(value), "%f", factor);
+        av_dict_set(metadata, "lavfi.photosensitivity.factor", value, 0);
+    }
+    av_frame_copy(out, src);
+    if (free_in == 1)
+        av_frame_free(&in);
+    return ff_filter_frame(outlink, out);
+}
+
+static av_cold void uninit(AVFilterContext *ctx)
+{
+    PhotosensitivityContext *s = ctx->priv;
+
+    av_frame_free(&s->last_frame_av);
+}
+
+static const AVFilterPad inputs[] = {
+    {
+        .name         = "default",
+        .type         = AVMEDIA_TYPE_VIDEO,
+        .filter_frame = filter_frame,
+        .config_props = config_input,
+    },
+    { NULL }
+};
+
+static const AVFilterPad outputs[] = {
+    {
+        .name          = "default",
+        .type          = AVMEDIA_TYPE_VIDEO,
+    },
+    { NULL }
+};
+
+AVFilter ff_vf_photosensitivity = {
+    .name          = "photosensitivity",
+    .description   = NULL_IF_CONFIG_SMALL("Filter out photosensitive epilepsy seizure-inducing flashes."),
+    .priv_size     = sizeof(PhotosensitivityContext),
+    .priv_class    = &photosensitivity_class,
+    .uninit        = uninit,
+    .query_formats = query_formats,
+    .inputs        = inputs,
+    .outputs       = outputs,
+};
diff --git a/libavfilter/vf_pixdesctest.c b/libavfilter/vf_pixdesctest.c
index 2d0749e..680d1a7 100644
--- a/libavfilter/vf_pixdesctest.c
+++ b/libavfilter/vf_pixdesctest.c
@@ -31,7 +31,7 @@
 
 typedef struct PixdescTestContext {
     const AVPixFmtDescriptor *pix_desc;
-    uint16_t *line;
+    uint32_t *line;
 } PixdescTestContext;
 
 static av_cold void uninit(AVFilterContext *ctx)
@@ -89,17 +89,17 @@
         const int h1 = c == 1 || c == 2 ? ch : h;
 
         for (i = 0; i < h1; i++) {
-            av_read_image_line(priv->line,
+            av_read_image_line2(priv->line,
                                (void*)in->data,
                                in->linesize,
                                priv->pix_desc,
-                               0, i, c, w1, 0);
+                               0, i, c, w1, 0, 4);
 
-            av_write_image_line(priv->line,
+            av_write_image_line2(priv->line,
                                 out->data,
                                 out->linesize,
                                 priv->pix_desc,
-                                0, i, c, w1);
+                                0, i, c, w1, 4);
         }
     }
 
diff --git a/libavfilter/vf_premultiply.c b/libavfilter/vf_premultiply.c
index a9404b4..1fef477 100644
--- a/libavfilter/vf_premultiply.c
+++ b/libavfilter/vf_premultiply.c
@@ -80,7 +80,7 @@
 
     static const enum AVPixelFormat alpha_pix_fmts[] = {
         AV_PIX_FMT_YUVA444P,
-        AV_PIX_FMT_YUVA444P9, AV_PIX_FMT_YUVA444P10, AV_PIX_FMT_YUVA444P16,
+        AV_PIX_FMT_YUVA444P9, AV_PIX_FMT_YUVA444P10, AV_PIX_FMT_YUVA444P12, AV_PIX_FMT_YUVA444P16,
         AV_PIX_FMT_GBRAP,
         AV_PIX_FMT_GBRAP10, AV_PIX_FMT_GBRAP12, AV_PIX_FMT_GBRAP16,
         AV_PIX_FMT_NONE
@@ -186,7 +186,7 @@
 
     for (y = 0; y < h; y++) {
         for (x = 0; x < w; x++) {
-            dst[x] = ((((msrc[x] - half) * (((asrc[x] >> 1) & 1) + asrc[x]))) >> shift) + half;
+            dst[x] = ((((msrc[x] - half) * (int64_t)(((asrc[x] >> 1) & 1) + asrc[x]))) >> shift) + half;
         }
 
         dst  += dlinesize / 2;
@@ -209,7 +209,7 @@
 
     for (y = 0; y < h; y++) {
         for (x = 0; x < w; x++) {
-            dst[x] = ((((msrc[x] - offset) * (((asrc[x] >> 1) & 1) + asrc[x])) + half) >> shift) + offset;
+            dst[x] = ((((msrc[x] - offset) * (int64_t)(((asrc[x] >> 1) & 1) + asrc[x])) + half) >> shift) + offset;
         }
 
         dst  += dlinesize / 2;
@@ -639,6 +639,8 @@
         int ret, status;
         int64_t pts;
 
+        FF_FILTER_FORWARD_STATUS_BACK_ALL(ctx->outputs[0], ctx);
+
         if ((ret = ff_inlink_consume_frame(ctx->inputs[0], &frame)) > 0) {
             ret = filter_frame(ctx, &out, frame, frame);
             av_frame_free(&frame);
diff --git a/libavfilter/vf_procamp_vaapi.c b/libavfilter/vf_procamp_vaapi.c
index 10eccbe..7342048 100644
--- a/libavfilter/vf_procamp_vaapi.c
+++ b/libavfilter/vf_procamp_vaapi.c
@@ -131,9 +131,7 @@
     AVFilterLink *outlink    = avctx->outputs[0];
     VAAPIVPPContext *vpp_ctx = avctx->priv;
     AVFrame *output_frame = NULL;
-    VASurfaceID input_surface, output_surface;
     VAProcPipelineParameterBuffer params;
-    VARectangle input_region;
     int err;
 
     av_log(avctx, AV_LOG_DEBUG, "Filter input: %s, %ux%u (%"PRId64").\n",
@@ -143,10 +141,6 @@
     if (vpp_ctx->va_context == VA_INVALID_ID)
         return AVERROR(EINVAL);
 
-    input_surface = (VASurfaceID)(uintptr_t)input_frame->data[3];
-    av_log(avctx, AV_LOG_DEBUG, "Using surface %#x for procamp input.\n",
-           input_surface);
-
     output_frame = ff_get_video_buffer(outlink, vpp_ctx->output_width,
                                        vpp_ctx->output_height);
     if (!output_frame) {
@@ -154,39 +148,22 @@
         goto fail;
     }
 
-    output_surface = (VASurfaceID)(uintptr_t)output_frame->data[3];
-    av_log(avctx, AV_LOG_DEBUG, "Using surface %#x for procamp output.\n",
-           output_surface);
-    memset(&params, 0, sizeof(params));
-    input_region = (VARectangle) {
-        .x      = 0,
-        .y      = 0,
-        .width  = input_frame->width,
-        .height = input_frame->height,
-    };
+    err = av_frame_copy_props(output_frame, input_frame);
+    if (err < 0)
+        goto fail;
 
-    params.surface = input_surface;
-    params.surface_region = &input_region;
-    params.surface_color_standard =
-        ff_vaapi_vpp_colour_standard(input_frame->colorspace);
-
-    params.output_region = NULL;
-    params.output_background_color = 0xff000000;
-    params.output_color_standard = params.surface_color_standard;
-
-    params.pipeline_flags = 0;
-    params.filter_flags = VA_FRAME_PICTURE;
+    err = ff_vaapi_vpp_init_params(avctx, &params,
+                                   input_frame, output_frame);
+    if (err < 0)
+        goto fail;
 
     params.filters     = &vpp_ctx->filter_buffers[0];
     params.num_filters = 1;
 
-    err = ff_vaapi_vpp_render_picture(avctx, &params, output_surface);
+    err = ff_vaapi_vpp_render_picture(avctx, &params, output_frame);
     if (err < 0)
         goto fail;
 
-    err = av_frame_copy_props(output_frame, input_frame);
-    if (err < 0)
-        goto fail;
     av_frame_free(&input_frame);
 
     av_log(avctx, AV_LOG_DEBUG, "Filter output: %s, %ux%u (%"PRId64").\n",
diff --git a/libavfilter/vf_program_opencl.c b/libavfilter/vf_program_opencl.c
index dfb2565..ec25e93 100644
--- a/libavfilter/vf_program_opencl.c
+++ b/libavfilter/vf_program_opencl.c
@@ -144,7 +144,8 @@
             goto fail;
 
         av_log(avctx, AV_LOG_DEBUG, "Run kernel on plane %d "
-               "(%zux%zu).\n", plane, global_work[0], global_work[1]);
+               "(%"SIZE_SPECIFIER"x%"SIZE_SPECIFIER").\n",
+               plane, global_work[0], global_work[1]);
 
         cle = clEnqueueNDRangeKernel(ctx->command_queue, ctx->kernel, 2, NULL,
                                      global_work, NULL, 0, NULL, NULL);
diff --git a/libavfilter/vf_psnr.c b/libavfilter/vf_psnr.c
index 0675a17..c9a673d 100644
--- a/libavfilter/vf_psnr.c
+++ b/libavfilter/vf_psnr.c
@@ -350,6 +350,14 @@
     if ((ret = ff_framesync_configure(&s->fs)) < 0)
         return ret;
 
+    outlink->time_base = s->fs.time_base;
+
+    if (av_cmp_q(mainlink->time_base, outlink->time_base) ||
+        av_cmp_q(ctx->inputs[1]->time_base, outlink->time_base))
+        av_log(ctx, AV_LOG_WARNING, "not matching timebases found between first input: %d/%d and second input %d/%d, results may be incorrect!\n",
+               mainlink->time_base.num, mainlink->time_base.den,
+               ctx->inputs[1]->time_base.num, ctx->inputs[1]->time_base.den);
+
     return 0;
 }
 
diff --git a/libavfilter/vf_random.c b/libavfilter/vf_random.c
index 373a7db..e73a224 100644
--- a/libavfilter/vf_random.c
+++ b/libavfilter/vf_random.c
@@ -97,8 +97,13 @@
 
     ret = ff_request_frame(ctx->inputs[0]);
 
+next:
     if (ret == AVERROR_EOF && !ctx->is_disabled && s->nb_frames > 0) {
         AVFrame *out = s->frames[s->nb_frames - 1];
+        if (!out) {
+            s->nb_frames--;
+            goto next;
+        }
         out->pts = s->pts[s->flush_idx++];
         ret = ff_filter_frame(outlink, out);
         s->frames[s->nb_frames - 1] = NULL;
@@ -108,6 +113,14 @@
     return ret;
 }
 
+static av_cold void uninit(AVFilterContext *ctx)
+{
+    RandomContext *s = ctx->priv;
+
+    for (int i = 0; i < s->nb_frames; i++)
+        av_frame_free(&s->frames[i]);
+}
+
 static const AVFilterPad random_inputs[] = {
     {
         .name         = "default",
@@ -132,6 +145,7 @@
     .priv_size   = sizeof(RandomContext),
     .priv_class  = &random_class,
     .init        = init,
+    .uninit      = uninit,
     .inputs      = random_inputs,
     .outputs     = random_outputs,
 };
diff --git a/libavfilter/vf_readeia608.c b/libavfilter/vf_readeia608.c
index bc3abe7..2973847 100644
--- a/libavfilter/vf_readeia608.c
+++ b/libavfilter/vf_readeia608.c
@@ -36,38 +36,52 @@
 #include "internal.h"
 #include "video.h"
 
-#define FALL 0
-#define RISE 1
+#define LAG 25
+#define CLOCK_BITSIZE_MIN 0.2f
+#define CLOCK_BITSIZE_MAX 1.5f
+#define SYNC_BITSIZE_MIN 12.f
+#define SYNC_BITSIZE_MAX 15.f
+
+typedef struct LineItem {
+    int   input;
+    int   output;
+
+    float unfiltered;
+    float filtered;
+    float average;
+    float deviation;
+} LineItem;
+
+typedef struct CodeItem {
+    uint8_t bit;
+    int size;
+} CodeItem;
 
 typedef struct ReadEIA608Context {
     const AVClass *class;
     int start, end;
-    int min_range;
-    int max_peak_diff;
-    int max_period_diff;
-    int max_start_diff;
     int nb_found;
     int white;
     int black;
-    float mpd, mhd, msd, mac, spw, bhd, wth, bth;
+    float spw;
     int chp;
+    int lp;
+
+    uint64_t histogram[256];
+
+    CodeItem *code;
+    LineItem *line;
 } ReadEIA608Context;
 
 #define OFFSET(x) offsetof(ReadEIA608Context, x)
 #define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
 
 static const AVOption readeia608_options[] = {
-    { "scan_min", "set from which line to scan for codes",                            OFFSET(start), AV_OPT_TYPE_INT,   {.i64=0},       0, INT_MAX, FLAGS },
-    { "scan_max", "set to which line to scan for codes",                              OFFSET(end),   AV_OPT_TYPE_INT,   {.i64=29},      0, INT_MAX, FLAGS },
-    { "mac",      "set minimal acceptable amplitude change for sync codes detection", OFFSET(mac),   AV_OPT_TYPE_FLOAT, {.dbl=.2},  0.001,       1, FLAGS },
-    { "spw",      "set ratio of width reserved for sync code detection",              OFFSET(spw),   AV_OPT_TYPE_FLOAT, {.dbl=.27},   0.1,     0.7, FLAGS },
-    { "mhd",      "set max peaks height difference for sync code detection",          OFFSET(mhd),   AV_OPT_TYPE_FLOAT, {.dbl=.1},      0,     0.5, FLAGS },
-    { "mpd",      "set max peaks period difference for sync code detection",          OFFSET(mpd),   AV_OPT_TYPE_FLOAT, {.dbl=.1},      0,     0.5, FLAGS },
-    { "msd",      "set first two max start code bits differences",                    OFFSET(msd),   AV_OPT_TYPE_FLOAT, {.dbl=.02},     0,     0.5, FLAGS },
-    { "bhd",      "set min ratio of bits height compared to 3rd start code bit",      OFFSET(bhd),   AV_OPT_TYPE_FLOAT, {.dbl=.75},  0.01,       1, FLAGS },
-    { "th_w",     "set white color threshold",                                        OFFSET(wth),   AV_OPT_TYPE_FLOAT, {.dbl=.35},   0.1,       1, FLAGS },
-    { "th_b",     "set black color threshold",                                        OFFSET(bth),   AV_OPT_TYPE_FLOAT, {.dbl=.15},     0,     0.5, FLAGS },
-    { "chp",      "check and apply parity bit",                                       OFFSET(chp),   AV_OPT_TYPE_BOOL,  {.i64= 0},      0,       1, FLAGS },
+    { "scan_min", "set from which line to scan for codes",               OFFSET(start), AV_OPT_TYPE_INT,   {.i64=0},     0, INT_MAX, FLAGS },
+    { "scan_max", "set to which line to scan for codes",                 OFFSET(end),   AV_OPT_TYPE_INT,   {.i64=29},    0, INT_MAX, FLAGS },
+    { "spw",      "set ratio of width reserved for sync code detection", OFFSET(spw),   AV_OPT_TYPE_FLOAT, {.dbl=.27}, 0.1,     0.7, FLAGS },
+    { "chp",      "check and apply parity bit",                          OFFSET(chp),   AV_OPT_TYPE_BOOL,  {.i64= 0},    0,       1, FLAGS },
+    { "lp",       "lowpass line prior to processing",                    OFFSET(lp),    AV_OPT_TYPE_BOOL,  {.i64= 1},    0,       1, FLAGS },
     { NULL }
 };
 
@@ -93,10 +107,9 @@
 
 static int config_input(AVFilterLink *inlink)
 {
-    const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(inlink->format);
     AVFilterContext *ctx = inlink->dst;
     ReadEIA608Context *s = ctx->priv;
-    int depth = desc->comp[0].depth;
+    int size = inlink->w + LAG;
 
     if (s->end >= inlink->h) {
         av_log(ctx, AV_LOG_WARNING, "Last line to scan too large, clipping.\n");
@@ -108,94 +121,243 @@
         return AVERROR(EINVAL);
     }
 
-    s->min_range = s->mac * ((1 << depth) - 1);
-    s->max_peak_diff = s->mhd * ((1 << depth) - 1);
-    s->max_period_diff = s->mpd * ((1 << depth) - 1);
-    s->max_start_diff = s->msd * ((1 << depth) - 1);
-    s->white = s->wth * ((1 << depth) - 1);
-    s->black = s->bth * ((1 << depth) - 1);
+    s->line = av_calloc(size, sizeof(*s->line));
+    s->code = av_calloc(size, sizeof(*s->code));
+    if (!s->line || !s->code)
+        return AVERROR(ENOMEM);
 
     return 0;
 }
 
-static void extract_line(AVFilterContext *ctx, AVFilterLink *inlink, AVFrame *in, int line)
+static void build_histogram(ReadEIA608Context *s, const LineItem *line, int len)
+{
+    memset(s->histogram, 0, sizeof(s->histogram));
+
+    for (int i = LAG; i < len + LAG; i++)
+        s->histogram[line[i].input]++;
+}
+
+static void find_black_and_white(ReadEIA608Context *s)
+{
+    int start = 0, end = 0, middle;
+    int black = 0, white = 0;
+    int cnt;
+
+    for (int i = 0; i < 256; i++) {
+        if (s->histogram[i]) {
+            start = i;
+            break;
+        }
+    }
+
+    for (int i = 255; i >= 0; i--) {
+        if (s->histogram[i]) {
+            end = i;
+            break;
+        }
+    }
+
+    middle = start + (end - start) / 2;
+
+    cnt = 0;
+    for (int i = start; i <= middle; i++) {
+        if (s->histogram[i] > cnt) {
+            cnt = s->histogram[i];
+            black = i;
+        }
+    }
+
+    cnt = 0;
+    for (int i = end; i >= middle; i--) {
+        if (s->histogram[i] > cnt) {
+            cnt = s->histogram[i];
+            white = i;
+        }
+    }
+
+    s->black = black;
+    s->white = white;
+}
+
+static float meanf(const LineItem *line, int len)
+{
+    float sum = 0.0, mean = 0.0;
+
+    for (int i = 0; i < len; i++)
+        sum += line[i].filtered;
+
+    mean = sum / len;
+
+    return mean;
+}
+
+static float stddevf(const LineItem *line, int len)
+{
+    float m = meanf(line, len);
+    float standard_deviation = 0.f;
+
+    for (int i = 0; i < len; i++)
+        standard_deviation += (line[i].filtered - m) * (line[i].filtered - m);
+
+    return sqrtf(standard_deviation / (len - 1));
+}
+
+static void thresholding(ReadEIA608Context *s, LineItem *line,
+                         int lag, float threshold, float influence, int len)
+{
+    for (int i = lag; i < len + lag; i++) {
+        line[i].unfiltered = line[i].input / 255.f;
+        line[i].filtered = line[i].unfiltered;
+    }
+
+    for (int i = 0; i < lag; i++) {
+        line[i].unfiltered = meanf(line, len * s->spw);
+        line[i].filtered = line[i].unfiltered;
+    }
+
+    line[lag - 1].average   = meanf(line, lag);
+    line[lag - 1].deviation = stddevf(line, lag);
+
+    for (int i = lag; i < len + lag; i++) {
+        if (fabsf(line[i].unfiltered - line[i-1].average) > threshold * line[i-1].deviation) {
+            if (line[i].unfiltered > line[i-1].average) {
+                line[i].output = 255;
+            } else {
+                line[i].output = 0;
+            }
+
+            line[i].filtered = influence * line[i].unfiltered + (1.f - influence) * line[i-1].filtered;
+        } else {
+            int distance_from_black, distance_from_white;
+
+            distance_from_black = FFABS(line[i].input - s->black);
+            distance_from_white = FFABS(line[i].input - s->white);
+
+            line[i].output = distance_from_black <= distance_from_white ? 0 : 255;
+        }
+
+        line[i].average   = meanf(line + i - lag, lag);
+        line[i].deviation = stddevf(line + i - lag, lag);
+    }
+}
+
+static int periods(const LineItem *line, CodeItem *code, int len)
+{
+    int hold = line[LAG].output, cnt = 0;
+    int last = LAG;
+
+    memset(code, 0, len * sizeof(*code));
+
+    for (int i = LAG + 1; i < len + LAG; i++) {
+        if (line[i].output != hold) {
+            code[cnt].size = i - last;
+            code[cnt].bit = hold;
+            hold = line[i].output;
+            last = i;
+            cnt++;
+        }
+    }
+
+    code[cnt].size = LAG + len - last;
+    code[cnt].bit = hold;
+
+    return cnt + 1;
+}
+
+static void dump_code(AVFilterContext *ctx, int len, int item)
 {
     ReadEIA608Context *s = ctx->priv;
-    int max = 0, min = INT_MAX;
-    int i, ch, range = 0;
+
+    av_log(ctx, AV_LOG_DEBUG, "%d:", item);
+    for (int i = 0; i < len; i++) {
+        av_log(ctx, AV_LOG_DEBUG, " %03d", s->code[i].size);
+    }
+    av_log(ctx, AV_LOG_DEBUG, "\n");
+}
+
+static void extract_line(AVFilterContext *ctx, AVFrame *in, int w, int nb_line)
+{
+    ReadEIA608Context *s = ctx->priv;
+    LineItem *line = s->line;
+    int i, j, ch, len;
     const uint8_t *src;
-    uint16_t clock[8][2] = { { 0 } };
-    const int sync_width = s->spw * in->width;
-    int last = 0, peaks = 0, max_peak_diff = 0, dir = RISE;
-    const int width_per_bit = (in->width - sync_width) / 19;
     uint8_t byte[2] = { 0 };
-    int s1, s2, s3, parity;
+    uint8_t codes[19] = { 0 };
+    float bit_size = 0.f;
+    int parity;
 
-    src = &in->data[0][line * in->linesize[0]];
-    for (i = 0; i < sync_width; i++) {
-        max = FFMAX(max, src[i]);
-        min = FFMIN(min, src[i]);
-    }
+    memset(line, 0, (w + LAG) * sizeof(*line));
 
-    range = max - min;
-    if (range < s->min_range)
-        return;
+    src = &in->data[0][nb_line * in->linesize[0]];
+    if (s->lp) {
+        for (i = 0; i < w; i++) {
+            int a = FFMAX(i - 3, 0);
+            int b = FFMAX(i - 2, 0);
+            int c = FFMAX(i - 1, 0);
+            int d = FFMIN(i + 3, w-1);
+            int e = FFMIN(i + 2, w-1);
+            int f = FFMIN(i + 1, w-1);
 
-    for (i = 0; i < sync_width; i++) {
-        int Y = src[i];
-
-        if (dir == RISE) {
-            if (Y < last) {
-                dir = FALL;
-                if (last >= s->white) {
-                    clock[peaks][0] = last;
-                    clock[peaks][1] = i;
-                    peaks++;
-                    if (peaks > 7)
-                        break;
-                }
-            }
-        } else if (dir == FALL) {
-            if (Y > last && last <= s->black) {
-                dir = RISE;
-            }
+            line[LAG + i].input = (src[a] + src[b] + src[c] + src[i] + src[d] + src[e] + src[f] + 6) / 7;
         }
-        last = Y;
+    } else {
+        for (i = 0; i < w; i++) {
+            line[LAG + i].input = src[i];
+        }
     }
 
-    if (peaks != 7)
+    build_histogram(s, line, w);
+    find_black_and_white(s);
+    if (s->white - s->black < 5)
         return;
 
-    for (i = 1; i < 7; i++)
-        max_peak_diff = FFMAX(max_peak_diff, FFABS(clock[i][0] - clock[i-1][0]));
-
-    if (max_peak_diff > s->max_peak_diff)
+    thresholding(s, line, LAG, 1, 0, w);
+    len = periods(line, s->code, w);
+    dump_code(ctx, len, nb_line);
+    if (len < 15 ||
+        s->code[14].bit != 0 ||
+        w / (float)s->code[14].size < SYNC_BITSIZE_MIN ||
+        w / (float)s->code[14].size > SYNC_BITSIZE_MAX) {
         return;
-
-    max = 0; min = INT_MAX;
-    for (i = 1; i < 7; i++) {
-        max = FFMAX(max, FFABS(clock[i][1] - clock[i-1][1]));
-        min = FFMIN(min, FFABS(clock[i][1] - clock[i-1][1]));
     }
 
-    range = max - min;
-    if (range > s->max_period_diff)
-        return;
+    for (i = 14; i < len; i++) {
+        bit_size += s->code[i].size;
+    }
 
-    s1 = src[sync_width + width_per_bit * 0 + width_per_bit / 2];
-    s2 = src[sync_width + width_per_bit * 1 + width_per_bit / 2];
-    s3 = src[sync_width + width_per_bit * 2 + width_per_bit / 2];
+    bit_size /= 19.f;
+    for (i = 1; i < 14; i++) {
+        if (s->code[i].size / bit_size > CLOCK_BITSIZE_MAX ||
+            s->code[i].size / bit_size < CLOCK_BITSIZE_MIN) {
+            return;
+        }
+    }
 
-    if (FFABS(s1 - s2) > s->max_start_diff || s1 > s->black || s2 > s->black || s3 < s->white)
+    if (s->code[15].size / bit_size < 0.45f) {
         return;
+    }
+
+    for (j = 0, i = 14; i < len; i++) {
+        int run, bit;
+
+        run = lrintf(s->code[i].size / bit_size);
+        bit = s->code[i].bit;
+
+        for (int k = 0; j < 19 && k < run; k++) {
+            codes[j++] = bit;
+        }
+
+        if (j >= 19)
+            break;
+    }
 
     for (ch = 0; ch < 2; ch++) {
         for (parity = 0, i = 0; i < 8; i++) {
-            int b = src[sync_width + width_per_bit * (i + 3 + 8 * ch) + width_per_bit / 2];
+            int b = codes[3 + ch * 8 + i];
 
-            if (b - s1 > (s3 - s1) * s->bhd) {
-                b = 1;
+            if (b == 255) {
                 parity++;
+                b = 1;
             } else {
                 b = 0;
             }
@@ -204,7 +366,7 @@
 
         if (s->chp) {
             if (!(parity & 1)) {
-                byte[ch] = 0;
+                byte[ch] = 0x7F;
             }
         }
     }
@@ -212,12 +374,16 @@
     {
         uint8_t key[128], value[128];
 
+        //snprintf(key, sizeof(key), "lavfi.readeia608.%d.bits", s->nb_found);
+        //snprintf(value, sizeof(value), "0b%d%d%d%d%d%d%d%d 0b%d%d%d%d%d%d%d%d", codes[3]==255,codes[4]==255,codes[5]==255,codes[6]==255,codes[7]==255,codes[8]==255,codes[9]==255,codes[10]==255,codes[11]==255,codes[12]==255,codes[13]==255,codes[14]==255,codes[15]==255,codes[16]==255,codes[17]==255,codes[18]==255);
+        //av_dict_set(&in->metadata, key, value, 0);
+
         snprintf(key, sizeof(key), "lavfi.readeia608.%d.cc", s->nb_found);
         snprintf(value, sizeof(value), "0x%02X%02X", byte[0], byte[1]);
         av_dict_set(&in->metadata, key, value, 0);
 
         snprintf(key, sizeof(key), "lavfi.readeia608.%d.line", s->nb_found);
-        snprintf(value, sizeof(value), "%d", line);
+        snprintf(value, sizeof(value), "%d", nb_line);
         av_dict_set(&in->metadata, key, value, 0);
     }
 
@@ -233,11 +399,19 @@
 
     s->nb_found = 0;
     for (i = s->start; i <= s->end; i++)
-        extract_line(ctx, inlink, in, i);
+        extract_line(ctx, in, inlink->w, i);
 
     return ff_filter_frame(outlink, in);
 }
 
+static av_cold void uninit(AVFilterContext *ctx)
+{
+    ReadEIA608Context *s = ctx->priv;
+
+    av_freep(&s->code);
+    av_freep(&s->line);
+}
+
 static const AVFilterPad readeia608_inputs[] = {
     {
         .name         = "default",
@@ -264,5 +438,6 @@
     .query_formats = query_formats,
     .inputs        = readeia608_inputs,
     .outputs       = readeia608_outputs,
+    .uninit        = uninit,
     .flags         = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC,
 };
diff --git a/libavfilter/vf_remap.c b/libavfilter/vf_remap.c
index 48ec38a..6d5d752 100644
--- a/libavfilter/vf_remap.c
+++ b/libavfilter/vf_remap.c
@@ -36,10 +36,12 @@
  * Target_frame[y][x] = Source_frame[ ymap[y][x] ][ [xmap[y][x] ];
  */
 
+#include "libavutil/colorspace.h"
 #include "libavutil/imgutils.h"
 #include "libavutil/pixdesc.h"
 #include "libavutil/opt.h"
 #include "avfilter.h"
+#include "drawutils.h"
 #include "formats.h"
 #include "framesync.h"
 #include "internal.h"
@@ -47,9 +49,14 @@
 
 typedef struct RemapContext {
     const AVClass *class;
+    int format;
+
     int nb_planes;
     int nb_components;
     int step;
+    uint8_t fill_rgba[4];
+    int fill_color[4];
+
     FFFrameSync fs;
 
     int (*remap_slice)(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs);
@@ -59,6 +66,10 @@
 #define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM
 
 static const AVOption remap_options[] = {
+    { "format", "set output format", OFFSET(format), AV_OPT_TYPE_INT, {.i64=0}, 0, 1, FLAGS, "format" },
+        { "color",  "", 0, AV_OPT_TYPE_CONST, {.i64=0},   .flags = FLAGS, .unit = "format" },
+        { "gray",   "", 0, AV_OPT_TYPE_CONST, {.i64=1},   .flags = FLAGS, .unit = "format" },
+    { "fill", "set the color of the unmapped pixels", OFFSET(fill_rgba), AV_OPT_TYPE_COLOR, {.str="black"}, .flags = FLAGS },
     { NULL }
 };
 
@@ -73,6 +84,7 @@
 
 static int query_formats(AVFilterContext *ctx)
 {
+    RemapContext *s = ctx->priv;
     static const enum AVPixelFormat pix_fmts[] = {
         AV_PIX_FMT_YUVA444P,
         AV_PIX_FMT_YUV444P,
@@ -82,12 +94,15 @@
         AV_PIX_FMT_GBRP, AV_PIX_FMT_GBRAP,
         AV_PIX_FMT_YUV444P9, AV_PIX_FMT_YUV444P10, AV_PIX_FMT_YUV444P12,
         AV_PIX_FMT_YUV444P14, AV_PIX_FMT_YUV444P16,
-        AV_PIX_FMT_YUVA444P9, AV_PIX_FMT_YUVA444P10, AV_PIX_FMT_YUVA444P16,
+        AV_PIX_FMT_YUVA444P9, AV_PIX_FMT_YUVA444P10, AV_PIX_FMT_YUVA444P12, AV_PIX_FMT_YUVA444P16,
         AV_PIX_FMT_GBRP9, AV_PIX_FMT_GBRP10, AV_PIX_FMT_GBRP12,
         AV_PIX_FMT_GBRP14, AV_PIX_FMT_GBRP16,
         AV_PIX_FMT_GBRAP10, AV_PIX_FMT_GBRAP12, AV_PIX_FMT_GBRAP16,
         AV_PIX_FMT_RGB48, AV_PIX_FMT_BGR48,
         AV_PIX_FMT_RGBA64, AV_PIX_FMT_BGRA64,
+        AV_PIX_FMT_NONE
+    };
+    static const enum AVPixelFormat gray_pix_fmts[] = {
         AV_PIX_FMT_GRAY8, AV_PIX_FMT_GRAY9,
         AV_PIX_FMT_GRAY10, AV_PIX_FMT_GRAY12,
         AV_PIX_FMT_GRAY14, AV_PIX_FMT_GRAY16,
@@ -100,7 +115,7 @@
     AVFilterFormats *pix_formats = NULL, *map_formats = NULL;
     int ret;
 
-    if (!(pix_formats = ff_make_format_list(pix_fmts)) ||
+    if (!(pix_formats = ff_make_format_list(s->format ? gray_pix_fmts : pix_fmts)) ||
         !(map_formats = ff_make_format_list(map_fmts))) {
         ret = AVERROR(ENOMEM);
         goto fail;
@@ -130,7 +145,8 @@
 static int remap_planar##bits##_##name##_slice(AVFilterContext *ctx, void *arg,             \
                                                int jobnr, int nb_jobs)                      \
 {                                                                                           \
-    const ThreadData *td = (ThreadData*)arg;                                                \
+    RemapContext *s = ctx->priv;                                                            \
+    const ThreadData *td = arg;                                                             \
     const AVFrame *in  = td->in;                                                            \
     const AVFrame *xin = td->xin;                                                           \
     const AVFrame *yin = td->yin;                                                           \
@@ -148,13 +164,14 @@
         const int slinesize  = in->linesize[plane] / div;                                   \
         const uint16_t *xmap = (const uint16_t *)xin->data[0] + slice_start * xlinesize;    \
         const uint16_t *ymap = (const uint16_t *)yin->data[0] + slice_start * ylinesize;    \
+        const int color = s->fill_color[plane];                                             \
                                                                                             \
         for (y = slice_start; y < slice_end; y++) {                                         \
             for (x = 0; x < out->width; x++) {                                              \
                 if (ymap[x] < in->height && xmap[x] < in->width) {                          \
                     dst[x] = src[ymap[x] * slinesize + xmap[x]];                            \
                 } else {                                                                    \
-                    dst[x] = 0;                                                             \
+                    dst[x] = color;                                                         \
                 }                                                                           \
             }                                                                               \
             dst  += dlinesize;                                                              \
@@ -179,7 +196,8 @@
 static int remap_packed##bits##_##name##_slice(AVFilterContext *ctx, void *arg,             \
                                                int jobnr, int nb_jobs)                      \
 {                                                                                           \
-    const ThreadData *td = (ThreadData*)arg;                                                \
+    RemapContext *s = ctx->priv;                                                            \
+    const ThreadData *td = arg;                                                             \
     const AVFrame *in  = td->in;                                                            \
     const AVFrame *xin = td->xin;                                                           \
     const AVFrame *yin = td->yin;                                                           \
@@ -203,7 +221,7 @@
                 if (ymap[x] < in->height && xmap[x] < in->width) {                          \
                     dst[x * step + c] = src[ymap[x] * slinesize + xmap[x] * step + c];      \
                 } else {                                                                    \
-                    dst[x * step + c] = 0;                                                  \
+                    dst[x * step + c] = s->fill_color[c];                                   \
                 }                                                                           \
             }                                                                               \
         }                                                                                   \
@@ -223,11 +241,28 @@
     AVFilterContext *ctx = inlink->dst;
     RemapContext *s = ctx->priv;
     const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(inlink->format);
+    int depth = desc->comp[0].depth;
+    int is_rgb = !!(desc->flags & AV_PIX_FMT_FLAG_RGB);
+    int factor = 1 << (depth - 8);
+    uint8_t rgba_map[4];
 
+    ff_fill_rgba_map(rgba_map, inlink->format);
     s->nb_planes = av_pix_fmt_count_planes(inlink->format);
     s->nb_components = desc->nb_components;
 
-    if (desc->comp[0].depth == 8) {
+    if (is_rgb) {
+        s->fill_color[rgba_map[0]] = s->fill_rgba[0] * factor;
+        s->fill_color[rgba_map[1]] = s->fill_rgba[1] * factor;
+        s->fill_color[rgba_map[2]] = s->fill_rgba[2] * factor;
+        s->fill_color[rgba_map[3]] = s->fill_rgba[3] * factor;
+    } else {
+        s->fill_color[0] = RGB_TO_Y_BT709(s->fill_rgba[0], s->fill_rgba[1], s->fill_rgba[2]) * factor;
+        s->fill_color[1] = RGB_TO_U_BT709(s->fill_rgba[0], s->fill_rgba[1], s->fill_rgba[2], 0) * factor;
+        s->fill_color[2] = RGB_TO_V_BT709(s->fill_rgba[0], s->fill_rgba[1], s->fill_rgba[2], 0) * factor;
+        s->fill_color[3] = s->fill_rgba[3] * factor;
+    }
+
+    if (depth == 8) {
         if (s->nb_planes > 1 || s->nb_components == 1) {
             s->remap_slice = remap_planar8_nearest_slice;
         } else {
@@ -279,7 +314,7 @@
         td.step = s->step;
         ctx->internal->execute(ctx, s->remap_slice, &td, NULL, FFMIN(outlink->h, ff_filter_get_nb_threads(ctx)));
     }
-    out->pts = av_rescale_q(in->pts, s->fs.time_base, outlink->time_base);
+    out->pts = av_rescale_q(s->fs.pts, s->fs.time_base, outlink->time_base);
 
     return ff_filter_frame(outlink, out);
 }
@@ -305,7 +340,6 @@
 
     outlink->w = xlink->w;
     outlink->h = xlink->h;
-    outlink->time_base = srclink->time_base;
     outlink->sample_aspect_ratio = srclink->sample_aspect_ratio;
     outlink->frame_rate = srclink->frame_rate;
 
@@ -329,7 +363,10 @@
     s->fs.opaque   = s;
     s->fs.on_event = process_frame;
 
-    return ff_framesync_configure(&s->fs);
+    ret = ff_framesync_configure(&s->fs);
+    outlink->time_base = s->fs.time_base;
+
+    return ret;
 }
 
 static int activate(AVFilterContext *ctx)
diff --git a/libavfilter/vf_rotate.c b/libavfilter/vf_rotate.c
index 371ff7f..02f56c6 100644
--- a/libavfilter/vf_rotate.c
+++ b/libavfilter/vf_rotate.c
@@ -94,16 +94,17 @@
 
 #define OFFSET(x) offsetof(RotContext, x)
 #define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM
+#define TFLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_RUNTIME_PARAM
 
 static const AVOption rotate_options[] = {
-    { "angle",     "set angle (in radians)",       OFFSET(angle_expr_str), AV_OPT_TYPE_STRING, {.str="0"}, CHAR_MIN, CHAR_MAX, .flags=FLAGS },
-    { "a",         "set angle (in radians)",       OFFSET(angle_expr_str), AV_OPT_TYPE_STRING, {.str="0"}, CHAR_MIN, CHAR_MAX, .flags=FLAGS },
-    { "out_w",     "set output width expression",  OFFSET(outw_expr_str), AV_OPT_TYPE_STRING, {.str="iw"}, CHAR_MIN, CHAR_MAX, .flags=FLAGS },
-    { "ow",        "set output width expression",  OFFSET(outw_expr_str), AV_OPT_TYPE_STRING, {.str="iw"}, CHAR_MIN, CHAR_MAX, .flags=FLAGS },
-    { "out_h",     "set output height expression", OFFSET(outh_expr_str), AV_OPT_TYPE_STRING, {.str="ih"}, CHAR_MIN, CHAR_MAX, .flags=FLAGS },
-    { "oh",        "set output height expression", OFFSET(outh_expr_str), AV_OPT_TYPE_STRING, {.str="ih"}, CHAR_MIN, CHAR_MAX, .flags=FLAGS },
-    { "fillcolor", "set background fill color",    OFFSET(fillcolor_str), AV_OPT_TYPE_STRING, {.str="black"}, CHAR_MIN, CHAR_MAX, .flags=FLAGS },
-    { "c",         "set background fill color",    OFFSET(fillcolor_str), AV_OPT_TYPE_STRING, {.str="black"}, CHAR_MIN, CHAR_MAX, .flags=FLAGS },
+    { "angle",     "set angle (in radians)",       OFFSET(angle_expr_str), AV_OPT_TYPE_STRING, {.str="0"}, 0, 0, .flags=TFLAGS },
+    { "a",         "set angle (in radians)",       OFFSET(angle_expr_str), AV_OPT_TYPE_STRING, {.str="0"}, 0, 0, .flags=TFLAGS },
+    { "out_w",     "set output width expression",  OFFSET(outw_expr_str), AV_OPT_TYPE_STRING, {.str="iw"}, 0, 0, .flags=FLAGS },
+    { "ow",        "set output width expression",  OFFSET(outw_expr_str), AV_OPT_TYPE_STRING, {.str="iw"}, 0, 0, .flags=FLAGS },
+    { "out_h",     "set output height expression", OFFSET(outh_expr_str), AV_OPT_TYPE_STRING, {.str="ih"}, 0, 0, .flags=FLAGS },
+    { "oh",        "set output height expression", OFFSET(outh_expr_str), AV_OPT_TYPE_STRING, {.str="ih"}, 0, 0, .flags=FLAGS },
+    { "fillcolor", "set background fill color",    OFFSET(fillcolor_str), AV_OPT_TYPE_STRING, {.str="black"}, 0, 0, .flags=FLAGS },
+    { "c",         "set background fill color",    OFFSET(fillcolor_str), AV_OPT_TYPE_STRING, {.str="black"}, 0, 0, .flags=FLAGS },
     { "bilinear",  "use bilinear interpolation",   OFFSET(use_bilinear),  AV_OPT_TYPE_BOOL, {.i64=1}, 0, 1, .flags=FLAGS },
     { NULL }
 };
diff --git a/libavfilter/vf_scale.c b/libavfilter/vf_scale.c
index f741419..0348f19 100644
--- a/libavfilter/vf_scale.c
+++ b/libavfilter/vf_scale.c
@@ -29,9 +29,10 @@
 #include "avfilter.h"
 #include "formats.h"
 #include "internal.h"
-#include "scale.h"
+#include "scale_eval.h"
 #include "video.h"
 #include "libavutil/avstring.h"
+#include "libavutil/eval.h"
 #include "libavutil/internal.h"
 #include "libavutil/mathematics.h"
 #include "libavutil/opt.h"
@@ -41,6 +42,62 @@
 #include "libavutil/avassert.h"
 #include "libswscale/swscale.h"
 
+static const char *const var_names[] = {
+    "in_w",   "iw",
+    "in_h",   "ih",
+    "out_w",  "ow",
+    "out_h",  "oh",
+    "a",
+    "sar",
+    "dar",
+    "hsub",
+    "vsub",
+    "ohsub",
+    "ovsub",
+    "n",
+    "t",
+    "pos",
+    "main_w",
+    "main_h",
+    "main_a",
+    "main_sar",
+    "main_dar", "mdar",
+    "main_hsub",
+    "main_vsub",
+    "main_n",
+    "main_t",
+    "main_pos",
+    NULL
+};
+
+enum var_name {
+    VAR_IN_W,   VAR_IW,
+    VAR_IN_H,   VAR_IH,
+    VAR_OUT_W,  VAR_OW,
+    VAR_OUT_H,  VAR_OH,
+    VAR_A,
+    VAR_SAR,
+    VAR_DAR,
+    VAR_HSUB,
+    VAR_VSUB,
+    VAR_OHSUB,
+    VAR_OVSUB,
+    VAR_N,
+    VAR_T,
+    VAR_POS,
+    VAR_S2R_MAIN_W,
+    VAR_S2R_MAIN_H,
+    VAR_S2R_MAIN_A,
+    VAR_S2R_MAIN_SAR,
+    VAR_S2R_MAIN_DAR, VAR_S2R_MDAR,
+    VAR_S2R_MAIN_HSUB,
+    VAR_S2R_MAIN_VSUB,
+    VAR_S2R_MAIN_N,
+    VAR_S2R_MAIN_T,
+    VAR_S2R_MAIN_POS,
+    VARS_NB
+};
+
 enum EvalMode {
     EVAL_MODE_INIT,
     EVAL_MODE_FRAME,
@@ -72,6 +129,10 @@
 
     char *w_expr;               ///< width  expression string
     char *h_expr;               ///< height expression string
+    AVExpr *w_pexpr;
+    AVExpr *h_pexpr;
+    double var_values[VARS_NB];
+
     char *flags_str;
 
     char *in_color_matrix;
@@ -86,6 +147,7 @@
     int in_v_chr_pos;
 
     int force_original_aspect_ratio;
+    int force_divisible_by;
 
     int nb_slices;
 
@@ -95,6 +157,119 @@
 
 AVFilter ff_vf_scale2ref;
 
+static int config_props(AVFilterLink *outlink);
+
+static int check_exprs(AVFilterContext *ctx)
+{
+    ScaleContext *scale = ctx->priv;
+    unsigned vars_w[VARS_NB] = { 0 }, vars_h[VARS_NB] = { 0 };
+
+    if (!scale->w_pexpr && !scale->h_pexpr)
+        return AVERROR(EINVAL);
+
+    if (scale->w_pexpr)
+        av_expr_count_vars(scale->w_pexpr, vars_w, VARS_NB);
+    if (scale->h_pexpr)
+        av_expr_count_vars(scale->h_pexpr, vars_h, VARS_NB);
+
+    if (vars_w[VAR_OUT_W] || vars_w[VAR_OW]) {
+        av_log(ctx, AV_LOG_ERROR, "Width expression cannot be self-referencing: '%s'.\n", scale->w_expr);
+        return AVERROR(EINVAL);
+    }
+
+    if (vars_h[VAR_OUT_H] || vars_h[VAR_OH]) {
+        av_log(ctx, AV_LOG_ERROR, "Height expression cannot be self-referencing: '%s'.\n", scale->h_expr);
+        return AVERROR(EINVAL);
+    }
+
+    if ((vars_w[VAR_OUT_H] || vars_w[VAR_OH]) &&
+        (vars_h[VAR_OUT_W] || vars_h[VAR_OW])) {
+        av_log(ctx, AV_LOG_WARNING, "Circular references detected for width '%s' and height '%s' - possibly invalid.\n", scale->w_expr, scale->h_expr);
+    }
+
+    if (ctx->filter != &ff_vf_scale2ref &&
+        (vars_w[VAR_S2R_MAIN_W]    || vars_h[VAR_S2R_MAIN_W]    ||
+         vars_w[VAR_S2R_MAIN_H]    || vars_h[VAR_S2R_MAIN_H]    ||
+         vars_w[VAR_S2R_MAIN_A]    || vars_h[VAR_S2R_MAIN_A]    ||
+         vars_w[VAR_S2R_MAIN_SAR]  || vars_h[VAR_S2R_MAIN_SAR]  ||
+         vars_w[VAR_S2R_MAIN_DAR]  || vars_h[VAR_S2R_MAIN_DAR]  ||
+         vars_w[VAR_S2R_MDAR]      || vars_h[VAR_S2R_MDAR]      ||
+         vars_w[VAR_S2R_MAIN_HSUB] || vars_h[VAR_S2R_MAIN_HSUB] ||
+         vars_w[VAR_S2R_MAIN_VSUB] || vars_h[VAR_S2R_MAIN_VSUB] ||
+         vars_w[VAR_S2R_MAIN_N]    || vars_h[VAR_S2R_MAIN_N]    ||
+         vars_w[VAR_S2R_MAIN_T]    || vars_h[VAR_S2R_MAIN_T]    ||
+         vars_w[VAR_S2R_MAIN_POS]  || vars_h[VAR_S2R_MAIN_POS]) ) {
+        av_log(ctx, AV_LOG_ERROR, "Expressions with scale2ref variables are not valid in scale filter.\n");
+        return AVERROR(EINVAL);
+    }
+
+    if (scale->eval_mode == EVAL_MODE_INIT &&
+        (vars_w[VAR_N]            || vars_h[VAR_N]           ||
+         vars_w[VAR_T]            || vars_h[VAR_T]           ||
+         vars_w[VAR_POS]          || vars_h[VAR_POS]         ||
+         vars_w[VAR_S2R_MAIN_N]   || vars_h[VAR_S2R_MAIN_N]  ||
+         vars_w[VAR_S2R_MAIN_T]   || vars_h[VAR_S2R_MAIN_T]  ||
+         vars_w[VAR_S2R_MAIN_POS] || vars_h[VAR_S2R_MAIN_POS]) ) {
+        av_log(ctx, AV_LOG_ERROR, "Expressions with frame variables 'n', 't', 'pos' are not valid in init eval_mode.\n");
+        return AVERROR(EINVAL);
+    }
+
+    return 0;
+}
+
+static int scale_parse_expr(AVFilterContext *ctx, char *str_expr, AVExpr **pexpr_ptr, const char *var, const char *args)
+{
+    ScaleContext *scale = ctx->priv;
+    int ret, is_inited = 0;
+    char *old_str_expr = NULL;
+    AVExpr *old_pexpr = NULL;
+
+    if (str_expr) {
+        old_str_expr = av_strdup(str_expr);
+        if (!old_str_expr)
+            return AVERROR(ENOMEM);
+        av_opt_set(scale, var, args, 0);
+    }
+
+    if (*pexpr_ptr) {
+        old_pexpr = *pexpr_ptr;
+        *pexpr_ptr = NULL;
+        is_inited = 1;
+    }
+
+    ret = av_expr_parse(pexpr_ptr, args, var_names,
+                        NULL, NULL, NULL, NULL, 0, ctx);
+    if (ret < 0) {
+        av_log(ctx, AV_LOG_ERROR, "Cannot parse expression for %s: '%s'\n", var, args);
+        goto revert;
+    }
+
+    ret = check_exprs(ctx);
+    if (ret < 0)
+        goto revert;
+
+    if (is_inited && (ret = config_props(ctx->outputs[0])) < 0)
+        goto revert;
+
+    av_expr_free(old_pexpr);
+    old_pexpr = NULL;
+    av_freep(&old_str_expr);
+
+    return 0;
+
+revert:
+    av_expr_free(*pexpr_ptr);
+    *pexpr_ptr = NULL;
+    if (old_str_expr) {
+        av_opt_set(scale, var, old_str_expr, 0);
+        av_free(old_str_expr);
+    }
+    if (old_pexpr)
+        *pexpr_ptr = old_pexpr;
+
+    return ret;
+}
+
 static av_cold int init_dict(AVFilterContext *ctx, AVDictionary **opts)
 {
     ScaleContext *scale = ctx->priv;
@@ -126,6 +301,14 @@
     if (!scale->h_expr)
         av_opt_set(scale, "h", "ih", 0);
 
+    ret = scale_parse_expr(ctx, NULL, &scale->w_pexpr, "width", scale->w_expr);
+    if (ret < 0)
+        return ret;
+
+    ret = scale_parse_expr(ctx, NULL, &scale->h_pexpr, "height", scale->h_expr);
+    if (ret < 0)
+        return ret;
+
     av_log(ctx, AV_LOG_VERBOSE, "w:%s h:%s flags:'%s' interl:%d\n",
            scale->w_expr, scale->h_expr, (char *)av_x_if_null(scale->flags_str, ""), scale->interlaced);
 
@@ -148,6 +331,9 @@
 static av_cold void uninit(AVFilterContext *ctx)
 {
     ScaleContext *scale = ctx->priv;
+    av_expr_free(scale->w_pexpr);
+    av_expr_free(scale->h_pexpr);
+    scale->w_pexpr = scale->h_pexpr = NULL;
     sws_freeContext(scale->sws);
     sws_freeContext(scale->isws[0]);
     sws_freeContext(scale->isws[1]);
@@ -217,6 +403,81 @@
     return sws_getCoefficients(colorspace);
 }
 
+static int scale_eval_dimensions(AVFilterContext *ctx)
+{
+    ScaleContext *scale = ctx->priv;
+    const char scale2ref = ctx->filter == &ff_vf_scale2ref;
+    const AVFilterLink *inlink = scale2ref ? ctx->inputs[1] : ctx->inputs[0];
+    const AVFilterLink *outlink = ctx->outputs[0];
+    const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(inlink->format);
+    const AVPixFmtDescriptor *out_desc = av_pix_fmt_desc_get(outlink->format);
+    char *expr;
+    int eval_w, eval_h;
+    int ret;
+    double res;
+    const AVPixFmtDescriptor *main_desc;
+    const AVFilterLink *main_link;
+
+    if (scale2ref) {
+        main_link = ctx->inputs[0];
+        main_desc = av_pix_fmt_desc_get(main_link->format);
+    }
+
+    scale->var_values[VAR_IN_W]  = scale->var_values[VAR_IW] = inlink->w;
+    scale->var_values[VAR_IN_H]  = scale->var_values[VAR_IH] = inlink->h;
+    scale->var_values[VAR_OUT_W] = scale->var_values[VAR_OW] = NAN;
+    scale->var_values[VAR_OUT_H] = scale->var_values[VAR_OH] = NAN;
+    scale->var_values[VAR_A]     = (double) inlink->w / inlink->h;
+    scale->var_values[VAR_SAR]   = inlink->sample_aspect_ratio.num ?
+        (double) inlink->sample_aspect_ratio.num / inlink->sample_aspect_ratio.den : 1;
+    scale->var_values[VAR_DAR]   = scale->var_values[VAR_A] * scale->var_values[VAR_SAR];
+    scale->var_values[VAR_HSUB]  = 1 << desc->log2_chroma_w;
+    scale->var_values[VAR_VSUB]  = 1 << desc->log2_chroma_h;
+    scale->var_values[VAR_OHSUB] = 1 << out_desc->log2_chroma_w;
+    scale->var_values[VAR_OVSUB] = 1 << out_desc->log2_chroma_h;
+
+    if (scale2ref) {
+        scale->var_values[VAR_S2R_MAIN_W] = main_link->w;
+        scale->var_values[VAR_S2R_MAIN_H] = main_link->h;
+        scale->var_values[VAR_S2R_MAIN_A] = (double) main_link->w / main_link->h;
+        scale->var_values[VAR_S2R_MAIN_SAR] = main_link->sample_aspect_ratio.num ?
+            (double) main_link->sample_aspect_ratio.num / main_link->sample_aspect_ratio.den : 1;
+        scale->var_values[VAR_S2R_MAIN_DAR] = scale->var_values[VAR_S2R_MDAR] =
+            scale->var_values[VAR_S2R_MAIN_A] * scale->var_values[VAR_S2R_MAIN_SAR];
+        scale->var_values[VAR_S2R_MAIN_HSUB] = 1 << main_desc->log2_chroma_w;
+        scale->var_values[VAR_S2R_MAIN_VSUB] = 1 << main_desc->log2_chroma_h;
+    }
+
+    res = av_expr_eval(scale->w_pexpr, scale->var_values, NULL);
+    eval_w = scale->var_values[VAR_OUT_W] = scale->var_values[VAR_OW] = (int) res == 0 ? inlink->w : (int) res;
+
+    res = av_expr_eval(scale->h_pexpr, scale->var_values, NULL);
+    if (isnan(res)) {
+        expr = scale->h_expr;
+        ret = AVERROR(EINVAL);
+        goto fail;
+    }
+    eval_h = scale->var_values[VAR_OUT_H] = scale->var_values[VAR_OH] = (int) res == 0 ? inlink->h : (int) res;
+
+    res = av_expr_eval(scale->w_pexpr, scale->var_values, NULL);
+    if (isnan(res)) {
+        expr = scale->w_expr;
+        ret = AVERROR(EINVAL);
+        goto fail;
+    }
+    eval_w = scale->var_values[VAR_OUT_W] = scale->var_values[VAR_OW] = (int) res == 0 ? inlink->w : (int) res;
+
+    scale->w = eval_w;
+    scale->h = eval_h;
+
+    return 0;
+
+fail:
+    av_log(ctx, AV_LOG_ERROR,
+           "Error when evaluating the expression '%s'.\n", expr);
+    return ret;
+}
+
 static int config_props(AVFilterLink *outlink)
 {
     AVFilterContext *ctx = outlink->src;
@@ -227,37 +488,23 @@
     enum AVPixelFormat outfmt = outlink->format;
     const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(inlink->format);
     ScaleContext *scale = ctx->priv;
-    int w, h;
     int ret;
 
-    if ((ret = ff_scale_eval_dimensions(ctx,
-                                        scale->w_expr, scale->h_expr,
-                                        inlink, outlink,
-                                        &w, &h)) < 0)
+    if ((ret = scale_eval_dimensions(ctx)) < 0)
         goto fail;
 
-    /* Note that force_original_aspect_ratio may overwrite the previous set
-     * dimensions so that it is not divisible by the set factors anymore. */
-    if (scale->force_original_aspect_ratio) {
-        int tmp_w = av_rescale(h, inlink->w, inlink->h);
-        int tmp_h = av_rescale(w, inlink->h, inlink->w);
+    ff_scale_adjust_dimensions(inlink, &scale->w, &scale->h,
+                               scale->force_original_aspect_ratio,
+                               scale->force_divisible_by);
 
-        if (scale->force_original_aspect_ratio == 1) {
-             w = FFMIN(tmp_w, w);
-             h = FFMIN(tmp_h, h);
-        } else {
-             w = FFMAX(tmp_w, w);
-             h = FFMAX(tmp_h, h);
-        }
-    }
-
-    if (w > INT_MAX || h > INT_MAX ||
-        (h * inlink->w) > INT_MAX  ||
-        (w * inlink->h) > INT_MAX)
+    if (scale->w > INT_MAX ||
+        scale->h > INT_MAX ||
+        (scale->h * inlink->w) > INT_MAX ||
+        (scale->w * inlink->h) > INT_MAX)
         av_log(ctx, AV_LOG_ERROR, "Rescaled value for width or height is too big.\n");
 
-    outlink->w = w;
-    outlink->h = h;
+    outlink->w = scale->w;
+    outlink->h = scale->h;
 
     /* TODO: make algorithm configurable */
 
@@ -384,45 +631,83 @@
     int in_stride[4],out_stride[4];
     int i;
 
-    for(i=0; i<4; i++){
+    for (i=0; i<4; i++) {
         int vsub= ((i+1)&2) ? scale->vsub : 0;
          in_stride[i] = cur_pic->linesize[i] * mul;
         out_stride[i] = out_buf->linesize[i] * mul;
          in[i] = cur_pic->data[i] + ((y>>vsub)+field) * cur_pic->linesize[i];
         out[i] = out_buf->data[i] +            field  * out_buf->linesize[i];
     }
-    if(scale->input_is_pal)
+    if (scale->input_is_pal)
          in[1] = cur_pic->data[1];
-    if(scale->output_is_pal)
+    if (scale->output_is_pal)
         out[1] = out_buf->data[1];
 
     return sws_scale(sws, in, in_stride, y/mul, h,
                          out,out_stride);
 }
 
-static int filter_frame(AVFilterLink *link, AVFrame *in)
+#define TS2T(ts, tb) ((ts) == AV_NOPTS_VALUE ? NAN : (double)(ts) * av_q2d(tb))
+
+static int scale_frame(AVFilterLink *link, AVFrame *in, AVFrame **frame_out)
 {
-    ScaleContext *scale = link->dst->priv;
-    AVFilterLink *outlink = link->dst->outputs[0];
+    AVFilterContext *ctx = link->dst;
+    ScaleContext *scale = ctx->priv;
+    AVFilterLink *outlink = ctx->outputs[0];
     AVFrame *out;
     const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(link->format);
     char buf[32];
     int in_range;
+    int frame_changed;
 
+    *frame_out = NULL;
     if (in->colorspace == AVCOL_SPC_YCGCO)
         av_log(link->dst, AV_LOG_WARNING, "Detected unsupported YCgCo colorspace.\n");
 
-    if(   in->width  != link->w
-       || in->height != link->h
-       || in->format != link->format
-       || in->sample_aspect_ratio.den != link->sample_aspect_ratio.den || in->sample_aspect_ratio.num != link->sample_aspect_ratio.num) {
+    frame_changed = in->width  != link->w ||
+                    in->height != link->h ||
+                    in->format != link->format ||
+                    in->sample_aspect_ratio.den != link->sample_aspect_ratio.den ||
+                    in->sample_aspect_ratio.num != link->sample_aspect_ratio.num;
+
+    if (scale->eval_mode == EVAL_MODE_FRAME || frame_changed) {
         int ret;
+        unsigned vars_w[VARS_NB] = { 0 }, vars_h[VARS_NB] = { 0 };
+
+        av_expr_count_vars(scale->w_pexpr, vars_w, VARS_NB);
+        av_expr_count_vars(scale->h_pexpr, vars_h, VARS_NB);
+
+        if (scale->eval_mode == EVAL_MODE_FRAME &&
+            !frame_changed &&
+            ctx->filter != &ff_vf_scale2ref &&
+            !(vars_w[VAR_N] || vars_w[VAR_T] || vars_w[VAR_POS]) &&
+            !(vars_h[VAR_N] || vars_h[VAR_T] || vars_h[VAR_POS]) &&
+            scale->w && scale->h)
+            goto scale;
 
         if (scale->eval_mode == EVAL_MODE_INIT) {
             snprintf(buf, sizeof(buf)-1, "%d", outlink->w);
             av_opt_set(scale, "w", buf, 0);
             snprintf(buf, sizeof(buf)-1, "%d", outlink->h);
             av_opt_set(scale, "h", buf, 0);
+
+            ret = scale_parse_expr(ctx, NULL, &scale->w_pexpr, "width", scale->w_expr);
+            if (ret < 0)
+                return ret;
+
+            ret = scale_parse_expr(ctx, NULL, &scale->h_pexpr, "height", scale->h_expr);
+            if (ret < 0)
+                return ret;
+        }
+
+        if (ctx->filter == &ff_vf_scale2ref) {
+            scale->var_values[VAR_S2R_MAIN_N] = link->frame_count_out;
+            scale->var_values[VAR_S2R_MAIN_T] = TS2T(in->pts, link->time_base);
+            scale->var_values[VAR_S2R_MAIN_POS] = in->pkt_pos == -1 ? NAN : in->pkt_pos;
+        } else {
+            scale->var_values[VAR_N] = link->frame_count_out;
+            scale->var_values[VAR_T] = TS2T(in->pts, link->time_base);
+            scale->var_values[VAR_POS] = in->pkt_pos == -1 ? NAN : in->pkt_pos;
         }
 
         link->dst->inputs[0]->format = in->format;
@@ -432,13 +717,15 @@
         link->dst->inputs[0]->sample_aspect_ratio.den = in->sample_aspect_ratio.den;
         link->dst->inputs[0]->sample_aspect_ratio.num = in->sample_aspect_ratio.num;
 
-
         if ((ret = config_props(outlink)) < 0)
             return ret;
     }
 
-    if (!scale->sws)
-        return ff_filter_frame(outlink, in);
+scale:
+    if (!scale->sws) {
+        *frame_out = in;
+        return 0;
+    }
 
     scale->hsub = desc->log2_chroma_w;
     scale->vsub = desc->log2_chroma_h;
@@ -448,12 +735,13 @@
         av_frame_free(&in);
         return AVERROR(ENOMEM);
     }
+    *frame_out = out;
 
     av_frame_copy_props(out, in);
     out->width  = outlink->w;
     out->height = outlink->h;
 
-    if(scale->output_is_pal)
+    if (scale->output_is_pal)
         avpriv_set_systematic_pal2((uint32_t*)out->data[1], outlink->format == AV_PIX_FMT_PAL8 ? AV_PIX_FMT_BGR8 : outlink->format);
 
     in_range = in->color_range;
@@ -504,10 +792,10 @@
               (int64_t)in->sample_aspect_ratio.den * outlink->w * link->h,
               INT_MAX);
 
-    if(scale->interlaced>0 || (scale->interlaced<0 && in->interlaced_frame)){
+    if (scale->interlaced>0 || (scale->interlaced<0 && in->interlaced_frame)) {
         scale_slice(link, out, in, scale->isws[0], 0, (link->h+1)/2, 2, 0);
         scale_slice(link, out, in, scale->isws[1], 0,  link->h   /2, 2, 1);
-    }else if (scale->nb_slices) {
+    } else if (scale->nb_slices) {
         int i, slice_h, slice_start, slice_end = 0;
         const int nb_slices = FFMIN(scale->nb_slices, link->h);
         for (i = 0; i < nb_slices; i++) {
@@ -516,17 +804,55 @@
             slice_h     = slice_end - slice_start;
             scale_slice(link, out, in, scale->sws, slice_start, slice_h, 1, 0);
         }
-    }else{
+    } else {
         scale_slice(link, out, in, scale->sws, 0, link->h, 1, 0);
     }
 
     av_frame_free(&in);
-    return ff_filter_frame(outlink, out);
+    return 0;
+}
+
+static int filter_frame(AVFilterLink *link, AVFrame *in)
+{
+    AVFilterContext *ctx = link->dst;
+    AVFilterLink *outlink = ctx->outputs[0];
+    AVFrame *out;
+    int ret;
+
+    ret = scale_frame(link, in, &out);
+    if (out)
+        return ff_filter_frame(outlink, out);
+
+    return ret;
 }
 
 static int filter_frame_ref(AVFilterLink *link, AVFrame *in)
 {
+    ScaleContext *scale = link->dst->priv;
     AVFilterLink *outlink = link->dst->outputs[1];
+    int frame_changed;
+
+    frame_changed = in->width  != link->w ||
+                    in->height != link->h ||
+                    in->format != link->format ||
+                    in->sample_aspect_ratio.den != link->sample_aspect_ratio.den ||
+                    in->sample_aspect_ratio.num != link->sample_aspect_ratio.num;
+
+    if (frame_changed) {
+        link->format = in->format;
+        link->w = in->width;
+        link->h = in->height;
+        link->sample_aspect_ratio.num = in->sample_aspect_ratio.num;
+        link->sample_aspect_ratio.den = in->sample_aspect_ratio.den;
+
+        config_props_ref(outlink);
+    }
+
+    if (scale->eval_mode == EVAL_MODE_FRAME) {
+        scale->var_values[VAR_N] = link->frame_count_out;
+        scale->var_values[VAR_T] = TS2T(in->pts, link->time_base);
+        scale->var_values[VAR_POS] = in->pkt_pos == -1 ? NAN : in->pkt_pos;
+    }
 
     return ff_filter_frame(outlink, in);
 }
@@ -535,23 +861,24 @@
                            char *res, int res_len, int flags)
 {
     ScaleContext *scale = ctx->priv;
-    int ret;
+    char *str_expr;
+    AVExpr **pexpr_ptr;
+    int ret, w, h;
 
-    if (   !strcmp(cmd, "width")  || !strcmp(cmd, "w")
-        || !strcmp(cmd, "height") || !strcmp(cmd, "h")) {
+    w = !strcmp(cmd, "width")  || !strcmp(cmd, "w");
+    h = !strcmp(cmd, "height")  || !strcmp(cmd, "h");
 
-        int old_w = scale->w;
-        int old_h = scale->h;
-        AVFilterLink *outlink = ctx->outputs[0];
+    if (w || h) {
+        str_expr = w ? scale->w_expr : scale->h_expr;
+        pexpr_ptr = w ? &scale->w_pexpr : &scale->h_pexpr;
 
-        av_opt_set(scale, cmd, args, 0);
-        if ((ret = config_props(outlink)) < 0) {
-            scale->w = old_w;
-            scale->h = old_h;
-        }
+        ret = scale_parse_expr(ctx, str_expr, pexpr_ptr, cmd, args);
     } else
         ret = AVERROR(ENOSYS);
 
+    if (ret < 0)
+        av_log(ctx, AV_LOG_ERROR, "Failed to process command. Continuing with existing parameters.\n");
+
     return ret;
 }
 
@@ -562,18 +889,27 @@
 
 #define OFFSET(x) offsetof(ScaleContext, x)
 #define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
+#define TFLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_RUNTIME_PARAM
 
 static const AVOption scale_options[] = {
-    { "w",     "Output video width",          OFFSET(w_expr),    AV_OPT_TYPE_STRING,        .flags = FLAGS },
-    { "width", "Output video width",          OFFSET(w_expr),    AV_OPT_TYPE_STRING,        .flags = FLAGS },
-    { "h",     "Output video height",         OFFSET(h_expr),    AV_OPT_TYPE_STRING,        .flags = FLAGS },
-    { "height","Output video height",         OFFSET(h_expr),    AV_OPT_TYPE_STRING,        .flags = FLAGS },
+    { "w",     "Output video width",          OFFSET(w_expr),    AV_OPT_TYPE_STRING,        .flags = TFLAGS },
+    { "width", "Output video width",          OFFSET(w_expr),    AV_OPT_TYPE_STRING,        .flags = TFLAGS },
+    { "h",     "Output video height",         OFFSET(h_expr),    AV_OPT_TYPE_STRING,        .flags = TFLAGS },
+    { "height","Output video height",         OFFSET(h_expr),    AV_OPT_TYPE_STRING,        .flags = TFLAGS },
     { "flags", "Flags to pass to libswscale", OFFSET(flags_str), AV_OPT_TYPE_STRING, { .str = "bilinear" }, .flags = FLAGS },
     { "interl", "set interlacing", OFFSET(interlaced), AV_OPT_TYPE_BOOL, {.i64 = 0 }, -1, 1, FLAGS },
     { "size",   "set video size",          OFFSET(size_str), AV_OPT_TYPE_STRING, {.str = NULL}, 0, FLAGS },
     { "s",      "set video size",          OFFSET(size_str), AV_OPT_TYPE_STRING, {.str = NULL}, 0, FLAGS },
-    {  "in_color_matrix", "set input YCbCr type",   OFFSET(in_color_matrix),  AV_OPT_TYPE_STRING, { .str = "auto" }, .flags = FLAGS },
-    { "out_color_matrix", "set output YCbCr type",  OFFSET(out_color_matrix), AV_OPT_TYPE_STRING, { .str = NULL }, .flags = FLAGS },
+    {  "in_color_matrix", "set input YCbCr type",   OFFSET(in_color_matrix),  AV_OPT_TYPE_STRING, { .str = "auto" }, .flags = FLAGS, "color" },
+    { "out_color_matrix", "set output YCbCr type",  OFFSET(out_color_matrix), AV_OPT_TYPE_STRING, { .str = NULL }, .flags = FLAGS,  "color"},
+        { "auto",        NULL, 0, AV_OPT_TYPE_CONST, { .str = "auto" },      0, 0, FLAGS, "color" },
+        { "bt601",       NULL, 0, AV_OPT_TYPE_CONST, { .str = "bt601" },     0, 0, FLAGS, "color" },
+        { "bt470",       NULL, 0, AV_OPT_TYPE_CONST, { .str = "bt470" },     0, 0, FLAGS, "color" },
+        { "smpte170m",   NULL, 0, AV_OPT_TYPE_CONST, { .str = "smpte170m" }, 0, 0, FLAGS, "color" },
+        { "bt709",       NULL, 0, AV_OPT_TYPE_CONST, { .str = "bt709" },     0, 0, FLAGS, "color" },
+        { "fcc",         NULL, 0, AV_OPT_TYPE_CONST, { .str = "fcc" },       0, 0, FLAGS, "color" },
+        { "smpte240m",   NULL, 0, AV_OPT_TYPE_CONST, { .str = "smpte240m" }, 0, 0, FLAGS, "color" },
+        { "bt2020",      NULL, 0, AV_OPT_TYPE_CONST, { .str = "bt2020" },    0, 0, FLAGS, "color" },
     {  "in_range", "set input color range",  OFFSET( in_range), AV_OPT_TYPE_INT, {.i64 = AVCOL_RANGE_UNSPECIFIED }, 0, 2, FLAGS, "range" },
     { "out_range", "set output color range", OFFSET(out_range), AV_OPT_TYPE_INT, {.i64 = AVCOL_RANGE_UNSPECIFIED }, 0, 2, FLAGS, "range" },
     { "auto",   NULL, 0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_RANGE_UNSPECIFIED }, 0, 0, FLAGS, "range" },
@@ -592,6 +928,7 @@
     { "disable",  NULL, 0, AV_OPT_TYPE_CONST, {.i64 = 0 }, 0, 0, FLAGS, "force_oar" },
     { "decrease", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = 1 }, 0, 0, FLAGS, "force_oar" },
     { "increase", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = 2 }, 0, 0, FLAGS, "force_oar" },
+    { "force_divisible_by", "enforce that the output resolution is divisible by a defined integer when force_original_aspect_ratio is used", OFFSET(force_divisible_by), AV_OPT_TYPE_INT, { .i64 = 1}, 1, 256, FLAGS },
     { "param0", "Scaler param 0",             OFFSET(param[0]),  AV_OPT_TYPE_DOUBLE, { .dbl = SWS_PARAM_DEFAULT  }, INT_MIN, INT_MAX, FLAGS },
     { "param1", "Scaler param 1",             OFFSET(param[1]),  AV_OPT_TYPE_DOUBLE, { .dbl = SWS_PARAM_DEFAULT  }, INT_MIN, INT_MAX, FLAGS },
     { "nb_slices", "set the number of slices (debug purpose only)", OFFSET(nb_slices), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, FLAGS },
diff --git a/libavfilter/vf_scale_cuda.c b/libavfilter/vf_scale_cuda.c
index 23ac27a..1ffb73f 100644
--- a/libavfilter/vf_scale_cuda.c
+++ b/libavfilter/vf_scale_cuda.c
@@ -20,7 +20,6 @@
 * DEALINGS IN THE SOFTWARE.
 */
 
-#include <cuda.h>
 #include <stdio.h>
 #include <string.h>
 
@@ -28,6 +27,7 @@
 #include "libavutil/common.h"
 #include "libavutil/hwcontext.h"
 #include "libavutil/hwcontext_cuda_internal.h"
+#include "libavutil/cuda_check.h"
 #include "libavutil/internal.h"
 #include "libavutil/opt.h"
 #include "libavutil/pixdesc.h"
@@ -35,7 +35,7 @@
 #include "avfilter.h"
 #include "formats.h"
 #include "internal.h"
-#include "scale.h"
+#include "scale_eval.h"
 #include "video.h"
 
 static const enum AVPixelFormat supported_formats[] = {
@@ -43,7 +43,8 @@
     AV_PIX_FMT_NV12,
     AV_PIX_FMT_YUV444P,
     AV_PIX_FMT_P010,
-    AV_PIX_FMT_P016
+    AV_PIX_FMT_P016,
+    AV_PIX_FMT_YUV444P16,
 };
 
 #define DIV_UP(a, b) ( ((a) + (b) - 1) / (b) )
@@ -52,8 +53,13 @@
 #define BLOCKX 32
 #define BLOCKY 16
 
+#define CHECK_CU(x) FF_CUDA_CHECK_DL(ctx, s->hwctx->internal->cuda_dl, x)
+
 typedef struct CUDAScaleContext {
     const AVClass *class;
+
+    AVCUDADeviceContext *hwctx;
+
     enum AVPixelFormat in_fmt;
     enum AVPixelFormat out_fmt;
 
@@ -76,8 +82,10 @@
     char *w_expr;               ///< width  expression string
     char *h_expr;               ///< height expression string
 
+    int force_original_aspect_ratio;
+    int force_divisible_by;
+
     CUcontext   cu_ctx;
-    CUevent     cu_event;
     CUmodule    cu_module;
     CUfunction  cu_func_uchar;
     CUfunction  cu_func_uchar2;
@@ -85,12 +93,7 @@
     CUfunction  cu_func_ushort;
     CUfunction  cu_func_ushort2;
     CUfunction  cu_func_ushort4;
-    CUtexref    cu_tex_uchar;
-    CUtexref    cu_tex_uchar2;
-    CUtexref    cu_tex_uchar4;
-    CUtexref    cu_tex_ushort;
-    CUtexref    cu_tex_ushort2;
-    CUtexref    cu_tex_ushort4;
+    CUstream    cu_stream;
 
     CUdeviceptr srcBuffer;
     CUdeviceptr dstBuffer;
@@ -255,55 +258,49 @@
     AVHWFramesContext     *frames_ctx = (AVHWFramesContext*)inlink->hw_frames_ctx->data;
     AVCUDADeviceContext *device_hwctx = frames_ctx->device_ctx->hwctx;
     CUcontext dummy, cuda_ctx = device_hwctx->cuda_ctx;
-    CUresult err;
+    CudaFunctions *cu = device_hwctx->internal->cuda_dl;
     int w, h;
     int ret;
 
     extern char vf_scale_cuda_ptx[];
 
-    err = cuCtxPushCurrent(cuda_ctx);
-    if (err != CUDA_SUCCESS) {
-        av_log(ctx, AV_LOG_ERROR, "Error pushing cuda context\n");
-        ret = AVERROR_UNKNOWN;
+    s->hwctx = device_hwctx;
+    s->cu_stream = s->hwctx->stream;
+
+    ret = CHECK_CU(cu->cuCtxPushCurrent(cuda_ctx));
+    if (ret < 0)
         goto fail;
-    }
 
-    err = cuModuleLoadData(&s->cu_module, vf_scale_cuda_ptx);
-    if (err != CUDA_SUCCESS) {
-        av_log(ctx, AV_LOG_ERROR, "Error loading module data\n");
-        ret = AVERROR_UNKNOWN;
+    ret = CHECK_CU(cu->cuModuleLoadData(&s->cu_module, vf_scale_cuda_ptx));
+    if (ret < 0)
         goto fail;
-    }
 
-    cuModuleGetFunction(&s->cu_func_uchar, s->cu_module, "Subsample_Bilinear_uchar");
-    cuModuleGetFunction(&s->cu_func_uchar2, s->cu_module, "Subsample_Bilinear_uchar2");
-    cuModuleGetFunction(&s->cu_func_uchar4, s->cu_module, "Subsample_Bilinear_uchar4");
-    cuModuleGetFunction(&s->cu_func_ushort, s->cu_module, "Subsample_Bilinear_ushort");
-    cuModuleGetFunction(&s->cu_func_ushort2, s->cu_module, "Subsample_Bilinear_ushort2");
-    cuModuleGetFunction(&s->cu_func_ushort4, s->cu_module, "Subsample_Bilinear_ushort4");
+    CHECK_CU(cu->cuModuleGetFunction(&s->cu_func_uchar, s->cu_module, "Subsample_Bilinear_uchar"));
+    if (ret < 0)
+        goto fail;
 
-    cuModuleGetTexRef(&s->cu_tex_uchar, s->cu_module, "uchar_tex");
-    cuModuleGetTexRef(&s->cu_tex_uchar2, s->cu_module, "uchar2_tex");
-    cuModuleGetTexRef(&s->cu_tex_uchar4, s->cu_module, "uchar4_tex");
-    cuModuleGetTexRef(&s->cu_tex_ushort, s->cu_module, "ushort_tex");
-    cuModuleGetTexRef(&s->cu_tex_ushort2, s->cu_module, "ushort2_tex");
-    cuModuleGetTexRef(&s->cu_tex_ushort4, s->cu_module, "ushort4_tex");
+    CHECK_CU(cu->cuModuleGetFunction(&s->cu_func_uchar2, s->cu_module, "Subsample_Bilinear_uchar2"));
+    if (ret < 0)
+        goto fail;
 
-    cuTexRefSetFlags(s->cu_tex_uchar, CU_TRSF_READ_AS_INTEGER);
-    cuTexRefSetFlags(s->cu_tex_uchar2, CU_TRSF_READ_AS_INTEGER);
-    cuTexRefSetFlags(s->cu_tex_uchar4, CU_TRSF_READ_AS_INTEGER);
-    cuTexRefSetFlags(s->cu_tex_ushort, CU_TRSF_READ_AS_INTEGER);
-    cuTexRefSetFlags(s->cu_tex_ushort2, CU_TRSF_READ_AS_INTEGER);
-    cuTexRefSetFlags(s->cu_tex_ushort4, CU_TRSF_READ_AS_INTEGER);
+    CHECK_CU(cu->cuModuleGetFunction(&s->cu_func_uchar4, s->cu_module, "Subsample_Bilinear_uchar4"));
+    if (ret < 0)
+        goto fail;
 
-    cuTexRefSetFilterMode(s->cu_tex_uchar, CU_TR_FILTER_MODE_LINEAR);
-    cuTexRefSetFilterMode(s->cu_tex_uchar2, CU_TR_FILTER_MODE_LINEAR);
-    cuTexRefSetFilterMode(s->cu_tex_uchar4, CU_TR_FILTER_MODE_LINEAR);
-    cuTexRefSetFilterMode(s->cu_tex_ushort, CU_TR_FILTER_MODE_LINEAR);
-    cuTexRefSetFilterMode(s->cu_tex_ushort2, CU_TR_FILTER_MODE_LINEAR);
-    cuTexRefSetFilterMode(s->cu_tex_ushort4, CU_TR_FILTER_MODE_LINEAR);
+    CHECK_CU(cu->cuModuleGetFunction(&s->cu_func_ushort, s->cu_module, "Subsample_Bilinear_ushort"));
+    if (ret < 0)
+        goto fail;
 
-    cuCtxPopCurrent(&dummy);
+    CHECK_CU(cu->cuModuleGetFunction(&s->cu_func_ushort2, s->cu_module, "Subsample_Bilinear_ushort2"));
+    if (ret < 0)
+        goto fail;
+
+    CHECK_CU(cu->cuModuleGetFunction(&s->cu_func_ushort4, s->cu_module, "Subsample_Bilinear_ushort4"));
+    if (ret < 0)
+        goto fail;
+
+
+    CHECK_CU(cu->cuCtxPopCurrent(&dummy));
 
     if ((ret = ff_scale_eval_dimensions(s,
                                         s->w_expr, s->h_expr,
@@ -311,6 +308,9 @@
                                         &w, &h)) < 0)
         goto fail;
 
+    ff_scale_adjust_dimensions(inlink, &w, &h,
+                               s->force_original_aspect_ratio, s->force_divisible_by);
+
     if (((int64_t)h * inlink->w) > INT_MAX  ||
         ((int64_t)w * inlink->h) > INT_MAX)
         av_log(ctx, AV_LOG_ERROR, "Rescaled value for width or height is too big.\n");
@@ -339,29 +339,48 @@
     return ret;
 }
 
-static int call_resize_kernel(CUDAScaleContext *s, CUfunction func, CUtexref tex, int channels,
+static int call_resize_kernel(AVFilterContext *ctx, CUfunction func, int channels,
                               uint8_t *src_dptr, int src_width, int src_height, int src_pitch,
                               uint8_t *dst_dptr, int dst_width, int dst_height, int dst_pitch,
                               int pixel_size)
 {
-    CUdeviceptr src_devptr = (CUdeviceptr)src_dptr;
+    CUDAScaleContext *s = ctx->priv;
+    CudaFunctions *cu = s->hwctx->internal->cuda_dl;
     CUdeviceptr dst_devptr = (CUdeviceptr)dst_dptr;
-    void *args_uchar[] = { &dst_devptr, &dst_width, &dst_height, &dst_pitch, &src_width, &src_height };
-    CUDA_ARRAY_DESCRIPTOR desc;
+    CUtexObject tex = 0;
+    void *args_uchar[] = { &tex, &dst_devptr, &dst_width, &dst_height, &dst_pitch, &src_width, &src_height };
+    int ret;
 
-    desc.Width  = src_width;
-    desc.Height = src_height;
-    desc.NumChannels = channels;
-    if (pixel_size == 1) {
-        desc.Format = CU_AD_FORMAT_UNSIGNED_INT8;
-    } else {
-        desc.Format = CU_AD_FORMAT_UNSIGNED_INT16;
-    }
+    CUDA_TEXTURE_DESC tex_desc = {
+        .filterMode = CU_TR_FILTER_MODE_LINEAR,
+        .flags = CU_TRSF_READ_AS_INTEGER,
+    };
 
-    cuTexRefSetAddress2D_v3(tex, &desc, src_devptr, src_pitch * pixel_size);
-    cuLaunchKernel(func, DIV_UP(dst_width, BLOCKX), DIV_UP(dst_height, BLOCKY), 1, BLOCKX, BLOCKY, 1, 0, 0, args_uchar, NULL);
+    CUDA_RESOURCE_DESC res_desc = {
+        .resType = CU_RESOURCE_TYPE_PITCH2D,
+        .res.pitch2D.format = pixel_size == 1 ?
+                              CU_AD_FORMAT_UNSIGNED_INT8 :
+                              CU_AD_FORMAT_UNSIGNED_INT16,
+        .res.pitch2D.numChannels = channels,
+        .res.pitch2D.width = src_width,
+        .res.pitch2D.height = src_height,
+        .res.pitch2D.pitchInBytes = src_pitch * pixel_size,
+        .res.pitch2D.devPtr = (CUdeviceptr)src_dptr,
+    };
 
-    return 0;
+    ret = CHECK_CU(cu->cuTexObjectCreate(&tex, &res_desc, &tex_desc, NULL));
+    if (ret < 0)
+        goto exit;
+
+    ret = CHECK_CU(cu->cuLaunchKernel(func,
+                                      DIV_UP(dst_width, BLOCKX), DIV_UP(dst_height, BLOCKY), 1,
+                                      BLOCKX, BLOCKY, 1, 0, s->cu_stream, args_uchar, NULL));
+
+exit:
+    if (tex)
+        CHECK_CU(cu->cuTexObjectDestroy(tex));
+
+    return ret;
 }
 
 static int scalecuda_resize(AVFilterContext *ctx,
@@ -372,61 +391,75 @@
 
     switch (in_frames_ctx->sw_format) {
     case AV_PIX_FMT_YUV420P:
-        call_resize_kernel(s, s->cu_func_uchar, s->cu_tex_uchar, 1,
+        call_resize_kernel(ctx, s->cu_func_uchar, 1,
                            in->data[0], in->width, in->height, in->linesize[0],
                            out->data[0], out->width, out->height, out->linesize[0],
                            1);
-        call_resize_kernel(s, s->cu_func_uchar, s->cu_tex_uchar, 1,
-                           in->data[0]+in->linesize[0]*in->height, in->width/2, in->height/2, in->linesize[0]/2,
-                           out->data[0]+out->linesize[0]*out->height, out->width/2, out->height/2, out->linesize[0]/2,
+        call_resize_kernel(ctx, s->cu_func_uchar, 1,
+                           in->data[1], in->width/2, in->height/2, in->linesize[0]/2,
+                           out->data[1], out->width/2, out->height/2, out->linesize[0]/2,
                            1);
-        call_resize_kernel(s, s->cu_func_uchar, s->cu_tex_uchar, 1,
-                           in->data[0]+ ALIGN_UP((in->linesize[0]*in->height*5)/4, s->tex_alignment), in->width/2, in->height/2, in->linesize[0]/2,
-                           out->data[0]+(out->linesize[0]*out->height*5)/4, out->width/2, out->height/2, out->linesize[0]/2,
+        call_resize_kernel(ctx, s->cu_func_uchar, 1,
+                           in->data[2], in->width/2, in->height/2, in->linesize[0]/2,
+                           out->data[2], out->width/2, out->height/2, out->linesize[0]/2,
                            1);
         break;
     case AV_PIX_FMT_YUV444P:
-        call_resize_kernel(s, s->cu_func_uchar, s->cu_tex_uchar, 1,
+        call_resize_kernel(ctx, s->cu_func_uchar, 1,
                            in->data[0], in->width, in->height, in->linesize[0],
                            out->data[0], out->width, out->height, out->linesize[0],
                            1);
-        call_resize_kernel(s, s->cu_func_uchar, s->cu_tex_uchar, 1,
-                           in->data[0]+in->linesize[0]*in->height, in->width, in->height, in->linesize[0],
-                           out->data[0]+out->linesize[0]*out->height, out->width, out->height, out->linesize[0],
+        call_resize_kernel(ctx, s->cu_func_uchar, 1,
+                           in->data[1], in->width, in->height, in->linesize[0],
+                           out->data[1], out->width, out->height, out->linesize[0],
                            1);
-        call_resize_kernel(s, s->cu_func_uchar, s->cu_tex_uchar, 1,
-                           in->data[0]+in->linesize[0]*in->height*2, in->width, in->height, in->linesize[0],
-                           out->data[0]+out->linesize[0]*out->height*2, out->width, out->height, out->linesize[0],
+        call_resize_kernel(ctx, s->cu_func_uchar, 1,
+                           in->data[2], in->width, in->height, in->linesize[0],
+                           out->data[2], out->width, out->height, out->linesize[0],
                            1);
         break;
-    case AV_PIX_FMT_NV12:
-        call_resize_kernel(s, s->cu_func_uchar, s->cu_tex_uchar, 1,
-                           in->data[0], in->width, in->height, in->linesize[0],
-                           out->data[0], out->width, out->height, out->linesize[0],
-                           1);
-        call_resize_kernel(s, s->cu_func_uchar2, s->cu_tex_uchar2, 2,
-                           in->data[1], in->width/2, in->height/2, in->linesize[1],
-                           out->data[0] + out->linesize[0] * ((out->height + 31) & ~0x1f), out->width/2, out->height/2, out->linesize[1]/2,
-                           1);
-        break;
-    case AV_PIX_FMT_P010LE:
-        call_resize_kernel(s, s->cu_func_ushort, s->cu_tex_ushort, 1,
-                           in->data[0], in->width, in->height, in->linesize[0]/2,
-                           out->data[0], out->width, out->height, out->linesize[0]/2,
-                           2);
-        call_resize_kernel(s, s->cu_func_ushort2, s->cu_tex_ushort2, 2,
-                           in->data[1], in->width / 2, in->height / 2, in->linesize[1]/2,
-                           out->data[0] + out->linesize[0] * ((out->height + 31) & ~0x1f), out->width / 2, out->height / 2, out->linesize[1] / 4,
-                           2);
-        break;
-    case AV_PIX_FMT_P016LE:
-        call_resize_kernel(s, s->cu_func_ushort, s->cu_tex_ushort, 1,
+    case AV_PIX_FMT_YUV444P16:
+        call_resize_kernel(ctx, s->cu_func_ushort, 1,
                            in->data[0], in->width, in->height, in->linesize[0] / 2,
                            out->data[0], out->width, out->height, out->linesize[0] / 2,
                            2);
-        call_resize_kernel(s, s->cu_func_ushort2, s->cu_tex_ushort2, 2,
+        call_resize_kernel(ctx, s->cu_func_ushort, 1,
+                           in->data[1], in->width, in->height, in->linesize[1] / 2,
+                           out->data[1], out->width, out->height, out->linesize[1] / 2,
+                           2);
+        call_resize_kernel(ctx, s->cu_func_ushort, 1,
+                           in->data[2], in->width, in->height, in->linesize[2] / 2,
+                           out->data[2], out->width, out->height, out->linesize[2] / 2,
+                           2);
+        break;
+    case AV_PIX_FMT_NV12:
+        call_resize_kernel(ctx, s->cu_func_uchar, 1,
+                           in->data[0], in->width, in->height, in->linesize[0],
+                           out->data[0], out->width, out->height, out->linesize[0],
+                           1);
+        call_resize_kernel(ctx, s->cu_func_uchar2, 2,
+                           in->data[1], in->width/2, in->height/2, in->linesize[1],
+                           out->data[1], out->width/2, out->height/2, out->linesize[1]/2,
+                           1);
+        break;
+    case AV_PIX_FMT_P010LE:
+        call_resize_kernel(ctx, s->cu_func_ushort, 1,
+                           in->data[0], in->width, in->height, in->linesize[0]/2,
+                           out->data[0], out->width, out->height, out->linesize[0]/2,
+                           2);
+        call_resize_kernel(ctx, s->cu_func_ushort2, 2,
+                           in->data[1], in->width / 2, in->height / 2, in->linesize[1]/2,
+                           out->data[1], out->width / 2, out->height / 2, out->linesize[1] / 4,
+                           2);
+        break;
+    case AV_PIX_FMT_P016LE:
+        call_resize_kernel(ctx, s->cu_func_ushort, 1,
+                           in->data[0], in->width, in->height, in->linesize[0] / 2,
+                           out->data[0], out->width, out->height, out->linesize[0] / 2,
+                           2);
+        call_resize_kernel(ctx, s->cu_func_ushort2, 2,
                            in->data[1], in->width / 2, in->height / 2, in->linesize[1] / 2,
-                           out->data[0] + out->linesize[0] * ((out->height + 31) & ~0x1f), out->width / 2, out->height / 2, out->linesize[1] / 4,
+                           out->data[1], out->width / 2, out->height / 2, out->linesize[1] / 4,
                            2);
         break;
     default:
@@ -454,6 +487,9 @@
     av_frame_move_ref(out, s->frame);
     av_frame_move_ref(s->frame, s->tmp_frame);
 
+    s->frame->width  = s->planes_out[0].width;
+    s->frame->height = s->planes_out[0].height;
+
     ret = av_frame_copy_props(out, in);
     if (ret < 0)
         return ret;
@@ -463,14 +499,12 @@
 
 static int cudascale_filter_frame(AVFilterLink *link, AVFrame *in)
 {
-    AVFilterContext              *ctx = link->dst;
-    CUDAScaleContext               *s = ctx->priv;
-    AVFilterLink             *outlink = ctx->outputs[0];
-    AVHWFramesContext     *frames_ctx = (AVHWFramesContext*)s->frames_ctx->data;
-    AVCUDADeviceContext *device_hwctx = frames_ctx->device_ctx->hwctx;
+    AVFilterContext       *ctx = link->dst;
+    CUDAScaleContext        *s = ctx->priv;
+    AVFilterLink      *outlink = ctx->outputs[0];
+    CudaFunctions          *cu = s->hwctx->internal->cuda_dl;
 
     AVFrame *out = NULL;
-    CUresult err;
     CUcontext dummy;
     int ret = 0;
 
@@ -480,15 +514,13 @@
         goto fail;
     }
 
-    err = cuCtxPushCurrent(device_hwctx->cuda_ctx);
-    if (err != CUDA_SUCCESS) {
-        ret = AVERROR_UNKNOWN;
+    ret = CHECK_CU(cu->cuCtxPushCurrent(s->hwctx->cuda_ctx));
+    if (ret < 0)
         goto fail;
-    }
 
     ret = cudascale_scale(ctx, out, in);
 
-    cuCtxPopCurrent(&dummy);
+    CHECK_CU(cu->cuCtxPopCurrent(&dummy));
     if (ret < 0)
         goto fail;
 
@@ -510,6 +542,11 @@
 static const AVOption options[] = {
     { "w",      "Output video width",  OFFSET(w_expr),     AV_OPT_TYPE_STRING, { .str = "iw"   }, .flags = FLAGS },
     { "h",      "Output video height", OFFSET(h_expr),     AV_OPT_TYPE_STRING, { .str = "ih"   }, .flags = FLAGS },
+    { "force_original_aspect_ratio", "decrease or increase w/h if necessary to keep the original AR", OFFSET(force_original_aspect_ratio), AV_OPT_TYPE_INT, { .i64 = 0}, 0, 2, FLAGS, "force_oar" },
+    { "disable",  NULL, 0, AV_OPT_TYPE_CONST, {.i64 = 0 }, 0, 0, FLAGS, "force_oar" },
+    { "decrease", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = 1 }, 0, 0, FLAGS, "force_oar" },
+    { "increase", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = 2 }, 0, 0, FLAGS, "force_oar" },
+    { "force_divisible_by", "enforce that the output resolution is divisible by a defined integer when force_original_aspect_ratio is used", OFFSET(force_divisible_by), AV_OPT_TYPE_INT, { .i64 = 1}, 1, 256, FLAGS },
     { NULL },
 };
 
diff --git a/libavfilter/vf_scale_cuda.cu b/libavfilter/vf_scale_cuda.cu
index 5f5ec81..3f3f405 100644
--- a/libavfilter/vf_scale_cuda.cu
+++ b/libavfilter/vf_scale_cuda.cu
@@ -22,14 +22,8 @@
 
 extern "C" {
 
-texture<unsigned char, 2> uchar_tex;
-texture<uchar2, 2>  uchar2_tex;
-texture<uchar4, 2>  uchar4_tex;
-texture<unsigned short, 2> ushort_tex;
-texture<ushort2, 2>  ushort2_tex;
-texture<ushort4, 2>  ushort4_tex;
-
-__global__ void Subsample_Bilinear_uchar(unsigned char *dst,
+__global__ void Subsample_Bilinear_uchar(cudaTextureObject_t uchar_tex,
+                                    unsigned char *dst,
                                     int dst_width, int dst_height, int dst_pitch,
                                     int src_width, int src_height)
 {
@@ -48,15 +42,16 @@
         // Convert weights to two bilinear weights -> {wh,1.0,wh} -> {wh,0.5,0} + {0,0.5,wh}
         float dx = wh / (0.5f + wh);
         float dy = wv / (0.5f + wv);
-        int y0 = tex2D(uchar_tex, xi-dx, yi-dy);
-        int y1 = tex2D(uchar_tex, xi+dx, yi-dy);
-        int y2 = tex2D(uchar_tex, xi-dx, yi+dy);
-        int y3 = tex2D(uchar_tex, xi+dx, yi+dy);
+        int y0 = tex2D<unsigned char>(uchar_tex, xi-dx, yi-dy);
+        int y1 = tex2D<unsigned char>(uchar_tex, xi+dx, yi-dy);
+        int y2 = tex2D<unsigned char>(uchar_tex, xi-dx, yi+dy);
+        int y3 = tex2D<unsigned char>(uchar_tex, xi+dx, yi+dy);
         dst[yo*dst_pitch+xo] = (unsigned char)((y0+y1+y2+y3+2) >> 2);
     }
 }
 
-__global__ void Subsample_Bilinear_uchar2(uchar2 *dst,
+__global__ void Subsample_Bilinear_uchar2(cudaTextureObject_t uchar2_tex,
+                                    uchar2 *dst,
                                     int dst_width, int dst_height, int dst_pitch2,
                                     int src_width, int src_height)
 {
@@ -75,10 +70,10 @@
         // Convert weights to two bilinear weights -> {wh,1.0,wh} -> {wh,0.5,0} + {0,0.5,wh}
         float dx = wh / (0.5f + wh);
         float dy = wv / (0.5f + wv);
-        uchar2 c0 = tex2D(uchar2_tex, xi-dx, yi-dy);
-        uchar2 c1 = tex2D(uchar2_tex, xi+dx, yi-dy);
-        uchar2 c2 = tex2D(uchar2_tex, xi-dx, yi+dy);
-        uchar2 c3 = tex2D(uchar2_tex, xi+dx, yi+dy);
+        uchar2 c0 = tex2D<uchar2>(uchar2_tex, xi-dx, yi-dy);
+        uchar2 c1 = tex2D<uchar2>(uchar2_tex, xi+dx, yi-dy);
+        uchar2 c2 = tex2D<uchar2>(uchar2_tex, xi-dx, yi+dy);
+        uchar2 c3 = tex2D<uchar2>(uchar2_tex, xi+dx, yi+dy);
         int2 uv;
         uv.x = ((int)c0.x+(int)c1.x+(int)c2.x+(int)c3.x+2) >> 2;
         uv.y = ((int)c0.y+(int)c1.y+(int)c2.y+(int)c3.y+2) >> 2;
@@ -86,7 +81,8 @@
     }
 }
 
-__global__ void Subsample_Bilinear_uchar4(uchar4 *dst,
+__global__ void Subsample_Bilinear_uchar4(cudaTextureObject_t uchar4_tex,
+                                    uchar4 *dst,
                                     int dst_width, int dst_height, int dst_pitch,
                                     int src_width, int src_height)
 {
@@ -105,10 +101,10 @@
         // Convert weights to two bilinear weights -> {wh,1.0,wh} -> {wh,0.5,0} + {0,0.5,wh}
         float dx = wh / (0.5f + wh);
         float dy = wv / (0.5f + wv);
-        uchar4 c0 = tex2D(uchar4_tex, xi-dx, yi-dy);
-        uchar4 c1 = tex2D(uchar4_tex, xi+dx, yi-dy);
-        uchar4 c2 = tex2D(uchar4_tex, xi-dx, yi+dy);
-        uchar4 c3 = tex2D(uchar4_tex, xi+dx, yi+dy);
+        uchar4 c0 = tex2D<uchar4>(uchar4_tex, xi-dx, yi-dy);
+        uchar4 c1 = tex2D<uchar4>(uchar4_tex, xi+dx, yi-dy);
+        uchar4 c2 = tex2D<uchar4>(uchar4_tex, xi-dx, yi+dy);
+        uchar4 c3 = tex2D<uchar4>(uchar4_tex, xi+dx, yi+dy);
         int4 res;
         res.x =  ((int)c0.x+(int)c1.x+(int)c2.x+(int)c3.x+2) >> 2;
         res.y =  ((int)c0.y+(int)c1.y+(int)c2.y+(int)c3.y+2) >> 2;
@@ -119,7 +115,8 @@
     }
 }
 
-__global__ void Subsample_Bilinear_ushort(unsigned short *dst,
+__global__ void Subsample_Bilinear_ushort(cudaTextureObject_t ushort_tex,
+                                    unsigned short *dst,
                                     int dst_width, int dst_height, int dst_pitch,
                                     int src_width, int src_height)
 {
@@ -138,15 +135,16 @@
         // Convert weights to two bilinear weights -> {wh,1.0,wh} -> {wh,0.5,0} + {0,0.5,wh}
         float dx = wh / (0.5f + wh);
         float dy = wv / (0.5f + wv);
-        int y0 = tex2D(ushort_tex, xi-dx, yi-dy);
-        int y1 = tex2D(ushort_tex, xi+dx, yi-dy);
-        int y2 = tex2D(ushort_tex, xi-dx, yi+dy);
-        int y3 = tex2D(ushort_tex, xi+dx, yi+dy);
+        int y0 = tex2D<unsigned short>(ushort_tex, xi-dx, yi-dy);
+        int y1 = tex2D<unsigned short>(ushort_tex, xi+dx, yi-dy);
+        int y2 = tex2D<unsigned short>(ushort_tex, xi-dx, yi+dy);
+        int y3 = tex2D<unsigned short>(ushort_tex, xi+dx, yi+dy);
         dst[yo*dst_pitch+xo] = (unsigned short)((y0+y1+y2+y3+2) >> 2);
     }
 }
 
-__global__ void Subsample_Bilinear_ushort2(ushort2 *dst,
+__global__ void Subsample_Bilinear_ushort2(cudaTextureObject_t ushort2_tex,
+                                    ushort2 *dst,
                                     int dst_width, int dst_height, int dst_pitch2,
                                     int src_width, int src_height)
 {
@@ -165,10 +163,10 @@
         // Convert weights to two bilinear weights -> {wh,1.0,wh} -> {wh,0.5,0} + {0,0.5,wh}
         float dx = wh / (0.5f + wh);
         float dy = wv / (0.5f + wv);
-        ushort2 c0 = tex2D(ushort2_tex, xi-dx, yi-dy);
-        ushort2 c1 = tex2D(ushort2_tex, xi+dx, yi-dy);
-        ushort2 c2 = tex2D(ushort2_tex, xi-dx, yi+dy);
-        ushort2 c3 = tex2D(ushort2_tex, xi+dx, yi+dy);
+        ushort2 c0 = tex2D<ushort2>(ushort2_tex, xi-dx, yi-dy);
+        ushort2 c1 = tex2D<ushort2>(ushort2_tex, xi+dx, yi-dy);
+        ushort2 c2 = tex2D<ushort2>(ushort2_tex, xi-dx, yi+dy);
+        ushort2 c3 = tex2D<ushort2>(ushort2_tex, xi+dx, yi+dy);
         int2 uv;
         uv.x = ((int)c0.x+(int)c1.x+(int)c2.x+(int)c3.x+2) >> 2;
         uv.y = ((int)c0.y+(int)c1.y+(int)c2.y+(int)c3.y+2) >> 2;
@@ -176,7 +174,8 @@
     }
 }
 
-__global__ void Subsample_Bilinear_ushort4(ushort4 *dst,
+__global__ void Subsample_Bilinear_ushort4(cudaTextureObject_t ushort4_tex,
+                                    ushort4 *dst,
                                     int dst_width, int dst_height, int dst_pitch,
                                     int src_width, int src_height)
 {
@@ -195,10 +194,10 @@
         // Convert weights to two bilinear weights -> {wh,1.0,wh} -> {wh,0.5,0} + {0,0.5,wh}
         float dx = wh / (0.5f + wh);
         float dy = wv / (0.5f + wv);
-        ushort4 c0 = tex2D(ushort4_tex, xi-dx, yi-dy);
-        ushort4 c1 = tex2D(ushort4_tex, xi+dx, yi-dy);
-        ushort4 c2 = tex2D(ushort4_tex, xi-dx, yi+dy);
-        ushort4 c3 = tex2D(ushort4_tex, xi+dx, yi+dy);
+        ushort4 c0 = tex2D<ushort4>(ushort4_tex, xi-dx, yi-dy);
+        ushort4 c1 = tex2D<ushort4>(ushort4_tex, xi+dx, yi-dy);
+        ushort4 c2 = tex2D<ushort4>(ushort4_tex, xi-dx, yi+dy);
+        ushort4 c3 = tex2D<ushort4>(ushort4_tex, xi+dx, yi+dy);
         int4 res;
         res.x =  ((int)c0.x+(int)c1.x+(int)c2.x+(int)c3.x+2) >> 2;
         res.y =  ((int)c0.y+(int)c1.y+(int)c2.y+(int)c3.y+2) >> 2;
diff --git a/libavfilter/vf_scale_npp.c b/libavfilter/vf_scale_npp.c
index 8a277ce..502ecfd 100644
--- a/libavfilter/vf_scale_npp.c
+++ b/libavfilter/vf_scale_npp.c
@@ -29,6 +29,7 @@
 #include "libavutil/common.h"
 #include "libavutil/hwcontext.h"
 #include "libavutil/hwcontext_cuda_internal.h"
+#include "libavutil/cuda_check.h"
 #include "libavutil/internal.h"
 #include "libavutil/opt.h"
 #include "libavutil/pixdesc.h"
@@ -36,9 +37,11 @@
 #include "avfilter.h"
 #include "formats.h"
 #include "internal.h"
-#include "scale.h"
+#include "scale_eval.h"
 #include "video.h"
 
+#define CHECK_CU(x) FF_CUDA_CHECK_DL(ctx, device_hwctx->internal->cuda_dl, x)
+
 static const enum AVPixelFormat supported_formats[] = {
     AV_PIX_FMT_YUV420P,
     AV_PIX_FMT_NV12,
@@ -95,6 +98,9 @@
     char *h_expr;               ///< height expression string
     char *format_str;
 
+    int force_original_aspect_ratio;
+    int force_divisible_by;
+
     int interp_algo;
 } NPPScaleContext;
 
@@ -344,6 +350,9 @@
                                         &w, &h)) < 0)
         goto fail;
 
+    ff_scale_adjust_dimensions(inlink, &w, &h,
+                               s->force_original_aspect_ratio, s->force_divisible_by);
+
     if (((int64_t)h * inlink->w) > INT_MAX  ||
         ((int64_t)w * inlink->h) > INT_MAX)
         av_log(ctx, AV_LOG_ERROR, "Rescaled value for width or height is too big.\n");
@@ -498,7 +507,6 @@
     AVCUDADeviceContext *device_hwctx = frames_ctx->device_ctx->hwctx;
 
     AVFrame *out = NULL;
-    CUresult err;
     CUcontext dummy;
     int ret = 0;
 
@@ -511,15 +519,13 @@
         goto fail;
     }
 
-    err = device_hwctx->internal->cuda_dl->cuCtxPushCurrent(device_hwctx->cuda_ctx);
-    if (err != CUDA_SUCCESS) {
-        ret = AVERROR_UNKNOWN;
+    ret = CHECK_CU(device_hwctx->internal->cuda_dl->cuCtxPushCurrent(device_hwctx->cuda_ctx));
+    if (ret < 0)
         goto fail;
-    }
 
     ret = nppscale_scale(ctx, out, in);
 
-    device_hwctx->internal->cuda_dl->cuCtxPopCurrent(&dummy);
+    CHECK_CU(device_hwctx->internal->cuda_dl->cuCtxPopCurrent(&dummy));
     if (ret < 0)
         goto fail;
 
@@ -552,6 +558,11 @@
         { "cubic2p_b05c03",     "2-parameter cubic (B=1/2, C=3/10)", 0, AV_OPT_TYPE_CONST, { .i64 = NPPI_INTER_CUBIC2P_B05C03     }, 0, 0, FLAGS, "interp_algo" },
         { "super",              "supersampling",                     0, AV_OPT_TYPE_CONST, { .i64 = NPPI_INTER_SUPER              }, 0, 0, FLAGS, "interp_algo" },
         { "lanczos",            "Lanczos",                           0, AV_OPT_TYPE_CONST, { .i64 = NPPI_INTER_LANCZOS            }, 0, 0, FLAGS, "interp_algo" },
+    { "force_original_aspect_ratio", "decrease or increase w/h if necessary to keep the original AR", OFFSET(force_original_aspect_ratio), AV_OPT_TYPE_INT, { .i64 = 0}, 0, 2, FLAGS, "force_oar" },
+    { "disable",  NULL, 0, AV_OPT_TYPE_CONST, {.i64 = 0 }, 0, 0, FLAGS, "force_oar" },
+    { "decrease", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = 1 }, 0, 0, FLAGS, "force_oar" },
+    { "increase", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = 2 }, 0, 0, FLAGS, "force_oar" },
+    { "force_divisible_by", "enforce that the output resolution is divisible by a defined integer when force_original_aspect_ratio is used", OFFSET(force_divisible_by), AV_OPT_TYPE_INT, { .i64 = 1}, 1, 256, FLAGS },
     { NULL },
 };
 
diff --git a/libavfilter/vf_scale_qsv.c b/libavfilter/vf_scale_qsv.c
index 7d593b2..5064dcb 100644
--- a/libavfilter/vf_scale_qsv.c
+++ b/libavfilter/vf_scale_qsv.c
@@ -69,6 +69,8 @@
     VARS_NB
 };
 
+#define QSV_HAVE_SCALING_CONFIG  QSV_VERSION_ATLEAST(1, 19)
+
 typedef struct QSVScaleContext {
     const AVClass *class;
 
@@ -88,7 +90,14 @@
     int             nb_surface_ptrs_out;
 
     mfxExtOpaqueSurfaceAlloc opaque_alloc;
-    mfxExtBuffer            *ext_buffers[1];
+
+#if QSV_HAVE_SCALING_CONFIG
+    mfxExtVPPScaling         scale_conf;
+#endif
+    int                      mode;
+
+    mfxExtBuffer             *ext_buffers[1 + QSV_HAVE_SCALING_CONFIG];
+    int                      num_ext_buf;
 
     int shift_width, shift_height;
 
@@ -109,7 +118,7 @@
     char *format_str;
 } QSVScaleContext;
 
-static int qsvscale_init(AVFilterContext *ctx)
+static av_cold int qsvscale_init(AVFilterContext *ctx)
 {
     QSVScaleContext *s = ctx->priv;
 
@@ -126,7 +135,7 @@
     return 0;
 }
 
-static void qsvscale_uninit(AVFilterContext *ctx)
+static av_cold void qsvscale_uninit(AVFilterContext *ctx)
 {
     QSVScaleContext *s = ctx->priv;
 
@@ -192,8 +201,8 @@
     out_frames_hwctx = out_frames_ctx->hwctx;
 
     out_frames_ctx->format            = AV_PIX_FMT_QSV;
-    out_frames_ctx->width             = FFALIGN(out_width,  32);
-    out_frames_ctx->height            = FFALIGN(out_height, 32);
+    out_frames_ctx->width             = FFALIGN(out_width,  16);
+    out_frames_ctx->height            = FFALIGN(out_height, 16);
     out_frames_ctx->sw_format         = out_format;
     out_frames_ctx->initial_pool_size = 4;
 
@@ -285,6 +294,8 @@
     mfxStatus err;
     int i;
 
+    s->num_ext_buf = 0;
+
     /* extract the properties of the "master" session given to us */
     err = MFXQueryIMPL(device_hwctx->session, &impl);
     if (err == MFX_ERR_NONE)
@@ -357,10 +368,7 @@
         s->opaque_alloc.Header.BufferId = MFX_EXTBUFF_OPAQUE_SURFACE_ALLOCATION;
         s->opaque_alloc.Header.BufferSz = sizeof(s->opaque_alloc);
 
-        s->ext_buffers[0] = (mfxExtBuffer*)&s->opaque_alloc;
-
-        par.ExtParam    = s->ext_buffers;
-        par.NumExtParam = FF_ARRAY_ELEMS(s->ext_buffers);
+        s->ext_buffers[s->num_ext_buf++] = (mfxExtBuffer*)&s->opaque_alloc;
 
         par.IOPattern = MFX_IOPATTERN_IN_OPAQUE_MEMORY | MFX_IOPATTERN_OUT_OPAQUE_MEMORY;
     } else {
@@ -396,6 +404,18 @@
         par.IOPattern = MFX_IOPATTERN_IN_VIDEO_MEMORY | MFX_IOPATTERN_OUT_VIDEO_MEMORY;
     }
 
+#if QSV_HAVE_SCALING_CONFIG
+    memset(&s->scale_conf, 0, sizeof(mfxExtVPPScaling));
+    s->scale_conf.Header.BufferId     = MFX_EXTBUFF_VPP_SCALING;
+    s->scale_conf.Header.BufferSz     = sizeof(mfxExtVPPScaling);
+    s->scale_conf.ScalingMode         = s->mode;
+    s->ext_buffers[s->num_ext_buf++]  = (mfxExtBuffer*)&s->scale_conf;
+    av_log(ctx, AV_LOG_VERBOSE, "Scaling mode: %d\n", s->mode);
+#endif
+
+    par.ExtParam    = s->ext_buffers;
+    par.NumExtParam = s->num_ext_buf;
+
     par.AsyncDepth = 1;    // TODO async
 
     par.vpp.In  = in_frames_hwctx->surfaces[0].Info;
@@ -521,7 +541,7 @@
     return 0;
 
 fail:
-    av_log(NULL, AV_LOG_ERROR,
+    av_log(ctx, AV_LOG_ERROR,
            "Error when evaluating the expression '%s'\n", expr);
     return ret;
 }
@@ -595,11 +615,21 @@
     { "h",      "Output video height", OFFSET(h_expr),     AV_OPT_TYPE_STRING, { .str = "ih"   }, .flags = FLAGS },
     { "format", "Output pixel format", OFFSET(format_str), AV_OPT_TYPE_STRING, { .str = "same" }, .flags = FLAGS },
 
+#if QSV_HAVE_SCALING_CONFIG
+    { "mode",      "set scaling mode",    OFFSET(mode),    AV_OPT_TYPE_INT,    { .i64 = MFX_SCALING_MODE_DEFAULT}, MFX_SCALING_MODE_DEFAULT, MFX_SCALING_MODE_QUALITY, FLAGS, "mode"},
+    { "low_power", "low power mode",        0,             AV_OPT_TYPE_CONST,  { .i64 = MFX_SCALING_MODE_LOWPOWER}, INT_MIN, INT_MAX, FLAGS, "mode"},
+    { "hq",        "high quality mode",     0,             AV_OPT_TYPE_CONST,  { .i64 = MFX_SCALING_MODE_QUALITY},  INT_MIN, INT_MAX, FLAGS, "mode"},
+#else
+    { "mode",      "(not supported)",     OFFSET(mode),    AV_OPT_TYPE_INT,    { .i64 = 0}, 0, INT_MAX, FLAGS, "mode"},
+    { "low_power", "",                      0,             AV_OPT_TYPE_CONST,  { .i64 = 1}, 0,   0,     FLAGS, "mode"},
+    { "hq",        "",                      0,             AV_OPT_TYPE_CONST,  { .i64 = 2}, 0,   0,     FLAGS, "mode"},
+#endif
+
     { NULL },
 };
 
 static const AVClass qsvscale_class = {
-    .class_name = "qsvscale",
+    .class_name = "scale_qsv",
     .item_name  = av_default_item_name,
     .option     = options,
     .version    = LIBAVUTIL_VERSION_INT,
diff --git a/libavfilter/vf_scale_vaapi.c b/libavfilter/vf_scale_vaapi.c
index d6529d5..b9a5eef 100644
--- a/libavfilter/vf_scale_vaapi.c
+++ b/libavfilter/vf_scale_vaapi.c
@@ -26,7 +26,7 @@
 #include "avfilter.h"
 #include "formats.h"
 #include "internal.h"
-#include "scale.h"
+#include "scale_eval.h"
 #include "video.h"
 #include "vaapi_vpp.h"
 
@@ -35,10 +35,41 @@
 
     char *output_format_string;
 
+    int   mode;
+
     char *w_expr;      // width expression string
     char *h_expr;      // height expression string
+
+    int force_original_aspect_ratio;
+    int force_divisible_by;
+
+    char *colour_primaries_string;
+    char *colour_transfer_string;
+    char *colour_matrix_string;
+    int   colour_range;
+    char *chroma_location_string;
+
+    enum AVColorPrimaries colour_primaries;
+    enum AVColorTransferCharacteristic colour_transfer;
+    enum AVColorSpace colour_matrix;
+    enum AVChromaLocation chroma_location;
 } ScaleVAAPIContext;
 
+static const char *scale_vaapi_mode_name(int mode)
+{
+    switch (mode) {
+#define D(name) case VA_FILTER_SCALING_ ## name: return #name
+        D(DEFAULT);
+        D(FAST);
+        D(HQ);
+        D(NL_ANAMORPHIC);
+#undef D
+    default:
+        return "Invalid";
+    }
+}
+
+
 static int scale_vaapi_config_output(AVFilterLink *outlink)
 {
     AVFilterLink *inlink     = outlink->src->inputs[0];
@@ -53,6 +84,9 @@
                                         &vpp_ctx->output_width, &vpp_ctx->output_height)) < 0)
         return err;
 
+    ff_scale_adjust_dimensions(inlink, &vpp_ctx->output_width, &vpp_ctx->output_height,
+                               ctx->force_original_aspect_ratio, ctx->force_divisible_by);
+
     err = ff_vaapi_vpp_config_output(outlink);
     if (err < 0)
         return err;
@@ -70,10 +104,9 @@
     AVFilterContext *avctx   = inlink->dst;
     AVFilterLink *outlink    = avctx->outputs[0];
     VAAPIVPPContext *vpp_ctx = avctx->priv;
+    ScaleVAAPIContext *ctx   = avctx->priv;
     AVFrame *output_frame    = NULL;
-    VASurfaceID input_surface, output_surface;
     VAProcPipelineParameterBuffer params;
-    VARectangle input_region;
     int err;
 
     av_log(avctx, AV_LOG_DEBUG, "Filter input: %s, %ux%u (%"PRId64").\n",
@@ -83,10 +116,6 @@
     if (vpp_ctx->va_context == VA_INVALID_ID)
         return AVERROR(EINVAL);
 
-    input_surface = (VASurfaceID)(uintptr_t)input_frame->data[3];
-    av_log(avctx, AV_LOG_DEBUG, "Using surface %#x for scale input.\n",
-           input_surface);
-
     output_frame = ff_get_video_buffer(outlink, vpp_ctx->output_width,
                                        vpp_ctx->output_height);
     if (!output_frame) {
@@ -94,46 +123,38 @@
         goto fail;
     }
 
-    output_surface = (VASurfaceID)(uintptr_t)output_frame->data[3];
-    av_log(avctx, AV_LOG_DEBUG, "Using surface %#x for scale output.\n",
-           output_surface);
-
-    memset(&params, 0, sizeof(params));
-
-    input_region = (VARectangle) {
-        .x      = input_frame->crop_left,
-        .y      = input_frame->crop_top,
-        .width  = input_frame->width -
-                 (input_frame->crop_left + input_frame->crop_right),
-        .height = input_frame->height -
-                 (input_frame->crop_top + input_frame->crop_bottom),
-    };
-
-    params.surface = input_surface;
-    params.surface_region = &input_region;
-    params.surface_color_standard =
-        ff_vaapi_vpp_colour_standard(input_frame->colorspace);
-
-    params.output_region = 0;
-    params.output_background_color = 0xff000000;
-    params.output_color_standard = params.surface_color_standard;
-
-    params.pipeline_flags = 0;
-    params.filter_flags = VA_FILTER_SCALING_HQ;
-
-    err = ff_vaapi_vpp_render_picture(avctx, &params, output_surface);
+    err = av_frame_copy_props(output_frame, input_frame);
     if (err < 0)
         goto fail;
 
-    err = av_frame_copy_props(output_frame, input_frame);
+    if (ctx->colour_primaries != AVCOL_PRI_UNSPECIFIED)
+        output_frame->color_primaries = ctx->colour_primaries;
+    if (ctx->colour_transfer != AVCOL_TRC_UNSPECIFIED)
+        output_frame->color_trc = ctx->colour_transfer;
+    if (ctx->colour_matrix != AVCOL_SPC_UNSPECIFIED)
+        output_frame->colorspace = ctx->colour_matrix;
+    if (ctx->colour_range != AVCOL_RANGE_UNSPECIFIED)
+        output_frame->color_range = ctx->colour_range;
+    if (ctx->chroma_location != AVCHROMA_LOC_UNSPECIFIED)
+        output_frame->chroma_location = ctx->chroma_location;
+
+    err = ff_vaapi_vpp_init_params(avctx, &params,
+                                   input_frame, output_frame);
+    if (err < 0)
+        goto fail;
+
+    params.filter_flags |= ctx->mode;
+
+    err = ff_vaapi_vpp_render_picture(avctx, &params, output_frame);
     if (err < 0)
         goto fail;
 
     av_frame_free(&input_frame);
 
-    av_log(avctx, AV_LOG_DEBUG, "Filter output: %s, %ux%u (%"PRId64").\n",
+    av_log(avctx, AV_LOG_DEBUG, "Filter output: %s, %ux%u (%"PRId64"), mode: %s.\n",
            av_get_pix_fmt_name(output_frame->format),
-           output_frame->width, output_frame->height, output_frame->pts);
+           output_frame->width, output_frame->height, output_frame->pts,
+           scale_vaapi_mode_name(ctx->mode));
 
     return ff_filter_frame(outlink, output_frame);
 
@@ -162,6 +183,24 @@
         vpp_ctx->output_format = AV_PIX_FMT_NONE;
     }
 
+#define STRING_OPTION(var_name, func_name, default_value) do { \
+        if (ctx->var_name ## _string) { \
+            int var = av_ ## func_name ## _from_name(ctx->var_name ## _string); \
+            if (var < 0) { \
+                av_log(avctx, AV_LOG_ERROR, "Invalid %s.\n", #var_name); \
+                return AVERROR(EINVAL); \
+            } \
+            ctx->var_name = var; \
+        } else { \
+            ctx->var_name = default_value; \
+        } \
+    } while (0)
+
+    STRING_OPTION(colour_primaries, color_primaries, AVCOL_PRI_UNSPECIFIED);
+    STRING_OPTION(colour_transfer,  color_transfer,  AVCOL_TRC_UNSPECIFIED);
+    STRING_OPTION(colour_matrix,    color_space,     AVCOL_SPC_UNSPECIFIED);
+    STRING_OPTION(chroma_location,  chroma_location, AVCHROMA_LOC_UNSPECIFIED);
+
     return 0;
 }
 
@@ -174,6 +213,52 @@
       OFFSET(h_expr), AV_OPT_TYPE_STRING, {.str = "ih"}, .flags = FLAGS },
     { "format", "Output video format (software format of hardware frames)",
       OFFSET(output_format_string), AV_OPT_TYPE_STRING, .flags = FLAGS },
+    { "mode", "Scaling mode",
+      OFFSET(mode), AV_OPT_TYPE_INT, { .i64 = VA_FILTER_SCALING_HQ },
+      0, VA_FILTER_SCALING_NL_ANAMORPHIC, FLAGS, "mode" },
+        { "default", "Use the default (depend on the driver) scaling algorithm",
+          0, AV_OPT_TYPE_CONST, { .i64 = VA_FILTER_SCALING_DEFAULT }, 0, 0, FLAGS, "mode" },
+        { "fast", "Use fast scaling algorithm",
+          0, AV_OPT_TYPE_CONST, { .i64 = VA_FILTER_SCALING_FAST }, 0, 0, FLAGS, "mode" },
+        { "hq", "Use high quality scaling algorithm",
+          0, AV_OPT_TYPE_CONST, { .i64 = VA_FILTER_SCALING_HQ }, 0, 0, FLAGS,  "mode" },
+        { "nl_anamorphic", "Use nolinear anamorphic scaling algorithm",
+          0, AV_OPT_TYPE_CONST, { .i64 = VA_FILTER_SCALING_NL_ANAMORPHIC }, 0, 0, FLAGS,  "mode" },
+
+    // These colour properties match the ones of the same name in vf_scale.
+    { "out_color_matrix", "Output colour matrix coefficient set",
+      OFFSET(colour_matrix_string), AV_OPT_TYPE_STRING, { .str = NULL }, .flags = FLAGS },
+    { "out_range", "Output colour range",
+      OFFSET(colour_range), AV_OPT_TYPE_INT, { .i64 = AVCOL_RANGE_UNSPECIFIED },
+      AVCOL_RANGE_UNSPECIFIED, AVCOL_RANGE_JPEG, FLAGS, "range" },
+    { "full",    "Full range",
+      0, AV_OPT_TYPE_CONST, { .i64 = AVCOL_RANGE_JPEG }, 0, 0, FLAGS, "range" },
+    { "limited", "Limited range",
+      0, AV_OPT_TYPE_CONST, { .i64 = AVCOL_RANGE_MPEG }, 0, 0, FLAGS, "range" },
+    { "jpeg",    "Full range",
+      0, AV_OPT_TYPE_CONST, { .i64 = AVCOL_RANGE_JPEG }, 0, 0, FLAGS, "range" },
+    { "mpeg",    "Limited range",
+      0, AV_OPT_TYPE_CONST, { .i64 = AVCOL_RANGE_MPEG }, 0, 0, FLAGS, "range" },
+    { "tv",      "Limited range",
+      0, AV_OPT_TYPE_CONST, { .i64 = AVCOL_RANGE_MPEG }, 0, 0, FLAGS, "range" },
+    { "pc",      "Full range",
+      0, AV_OPT_TYPE_CONST, { .i64 = AVCOL_RANGE_JPEG }, 0, 0, FLAGS, "range" },
+    // These colour properties are new here.
+    { "out_color_primaries", "Output colour primaries",
+      OFFSET(colour_primaries_string), AV_OPT_TYPE_STRING,
+      { .str = NULL }, .flags = FLAGS },
+    { "out_color_transfer", "Output colour transfer characteristics",
+      OFFSET(colour_transfer_string),  AV_OPT_TYPE_STRING,
+      { .str = NULL }, .flags = FLAGS },
+    { "out_chroma_location", "Output chroma sample location",
+      OFFSET(chroma_location_string),  AV_OPT_TYPE_STRING,
+      { .str = NULL }, .flags = FLAGS },
+    { "force_original_aspect_ratio", "decrease or increase w/h if necessary to keep the original AR", OFFSET(force_original_aspect_ratio), AV_OPT_TYPE_INT, { .i64 = 0}, 0, 2, FLAGS, "force_oar" },
+    { "disable",  NULL, 0, AV_OPT_TYPE_CONST, {.i64 = 0 }, 0, 0, FLAGS, "force_oar" },
+    { "decrease", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = 1 }, 0, 0, FLAGS, "force_oar" },
+    { "increase", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = 2 }, 0, 0, FLAGS, "force_oar" },
+    { "force_divisible_by", "enforce that the output resolution is divisible by a defined integer when force_original_aspect_ratio is used", OFFSET(force_divisible_by), AV_OPT_TYPE_INT, { .i64 = 1}, 1, 256, FLAGS },
+
     { NULL },
 };
 
diff --git a/libavfilter/vf_scale_vulkan.c b/libavfilter/vf_scale_vulkan.c
new file mode 100644
index 0000000..328e6bc
--- /dev/null
+++ b/libavfilter/vf_scale_vulkan.c
@@ -0,0 +1,531 @@
+/*
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "libavutil/opt.h"
+#include "vulkan.h"
+#include "scale_eval.h"
+#include "internal.h"
+#include "colorspace.h"
+
+#define CGROUPS (int [3]){ 32, 32, 1 }
+
+enum ScalerFunc {
+    F_BILINEAR = 0,
+    F_NEAREST,
+
+    F_NB,
+};
+
+typedef struct ScaleVulkanContext {
+    VulkanFilterContext vkctx;
+
+    int initialized;
+    FFVkExecContext *exec;
+    VulkanPipeline *pl;
+    FFVkBuffer params_buf;
+
+    /* Shader updators, must be in the main filter struct */
+    VkDescriptorImageInfo input_images[3];
+    VkDescriptorImageInfo output_images[3];
+    VkDescriptorBufferInfo params_desc;
+
+    enum ScalerFunc scaler;
+    char *out_format_string;
+    enum AVColorRange out_range;
+    char *w_expr;
+    char *h_expr;
+} ScaleVulkanContext;
+
+static const char scale_bilinear[] = {
+    C(0, vec4 scale_bilinear(int idx, ivec2 pos, vec2 crop_range, vec2 crop_off))
+    C(0, {                                                                      )
+    C(1,     vec2 npos = (vec2(pos) + 0.5f) / imageSize(output_img[idx]);       )
+    C(1,     npos *= crop_range;    /* Reduce the range */                      )
+    C(1,     npos += crop_off;      /* Offset the start */                      )
+    C(1,     return texture(input_img[idx], npos);                              )
+    C(0, }                                                                      )
+};
+
+static const char rgb2yuv[] = {
+    C(0, vec4 rgb2yuv(vec4 src, int fullrange)                                  )
+    C(0, {                                                                      )
+    C(1,     src *= yuv_matrix;                                                 )
+    C(1,     if (fullrange == 1) {                                              )
+    C(2,         src += vec4(0.0, 0.5, 0.5, 0.0);                               )
+    C(1,     } else {                                                           )
+    C(2,         src *= vec4(219.0 / 255.0, 224.0 / 255.0, 224.0 / 255.0, 1.0); )
+    C(2,         src += vec4(16.0 / 255.0, 128.0 / 255.0, 128.0 / 255.0, 0.0);  )
+    C(1,     }                                                                  )
+    C(1,     return src;                                                        )
+    C(0, }                                                                      )
+};
+
+static const char write_nv12[] = {
+    C(0, void write_nv12(vec4 src, ivec2 pos)                                   )
+    C(0, {                                                                      )
+    C(1,     imageStore(output_img[0], pos, vec4(src.r, 0.0, 0.0, 0.0));        )
+    C(1,     pos /= ivec2(2);                                                   )
+    C(1,     imageStore(output_img[1], pos, vec4(src.g, src.b, 0.0, 0.0));      )
+    C(0, }                                                                      )
+};
+
+static const char write_420[] = {
+    C(0, void write_420(vec4 src, ivec2 pos)                                    )
+    C(0, {                                                                      )
+    C(1,     imageStore(output_img[0], pos, vec4(src.r, 0.0, 0.0, 0.0));        )
+    C(1,     pos /= ivec2(2);                                                   )
+    C(1,     imageStore(output_img[1], pos, vec4(src.g, 0.0, 0.0, 0.0));        )
+    C(1,     imageStore(output_img[2], pos, vec4(src.b, 0.0, 0.0, 0.0));        )
+    C(0, }                                                                      )
+};
+
+static const char write_444[] = {
+    C(0, void write_444(vec4 src, ivec2 pos)                                    )
+    C(0, {                                                                      )
+    C(1,     imageStore(output_img[0], pos, vec4(src.r, 0.0, 0.0, 0.0));        )
+    C(1,     imageStore(output_img[1], pos, vec4(src.g, 0.0, 0.0, 0.0));        )
+    C(1,     imageStore(output_img[2], pos, vec4(src.b, 0.0, 0.0, 0.0));        )
+    C(0, }                                                                      )
+};
+
+static av_cold int init_filter(AVFilterContext *ctx, AVFrame *in)
+{
+    int err;
+    VkSampler *sampler;
+    VkFilter sampler_mode;
+    ScaleVulkanContext *s = ctx->priv;
+
+    int crop_x = in->crop_left;
+    int crop_y = in->crop_top;
+    int crop_w = in->width - (in->crop_left + in->crop_right);
+    int crop_h = in->height - (in->crop_top + in->crop_bottom);
+
+    switch (s->scaler) {
+    case F_NEAREST:
+        sampler_mode = VK_FILTER_NEAREST;
+        break;
+    case F_BILINEAR:
+        sampler_mode = VK_FILTER_LINEAR;
+        break;
+    };
+
+    /* Create a sampler */
+    sampler = ff_vk_init_sampler(ctx, 0, sampler_mode);
+    if (!sampler)
+        return AVERROR_EXTERNAL;
+
+    s->pl = ff_vk_create_pipeline(ctx);
+    if (!s->pl)
+        return AVERROR(ENOMEM);
+
+    { /* Create the shader */
+        VulkanDescriptorSetBinding desc_i[2] = {
+            {
+                .name       = "input_img",
+                .type       = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
+                .dimensions = 2,
+                .elems      = av_pix_fmt_count_planes(s->vkctx.input_format),
+                .stages     = VK_SHADER_STAGE_COMPUTE_BIT,
+                .updater    = s->input_images,
+                .samplers   = DUP_SAMPLER_ARRAY4(*sampler),
+            },
+            {
+                .name       = "output_img",
+                .type       = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
+                .mem_layout = ff_vk_shader_rep_fmt(s->vkctx.output_format),
+                .mem_quali  = "writeonly",
+                .dimensions = 2,
+                .elems      = av_pix_fmt_count_planes(s->vkctx.output_format),
+                .stages     = VK_SHADER_STAGE_COMPUTE_BIT,
+                .updater    = s->output_images,
+            },
+        };
+
+        VulkanDescriptorSetBinding desc_b = {
+            .name        = "params",
+            .type        = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
+            .mem_quali   = "readonly",
+            .mem_layout  = "std430",
+            .stages      = VK_SHADER_STAGE_COMPUTE_BIT,
+            .updater     = &s->params_desc,
+            .buf_content = "mat4 yuv_matrix;",
+        };
+
+        SPIRVShader *shd = ff_vk_init_shader(ctx, s->pl, "scale_compute",
+                                             VK_SHADER_STAGE_COMPUTE_BIT);
+        if (!shd)
+            return AVERROR(ENOMEM);
+
+        ff_vk_set_compute_shader_sizes(ctx, shd, CGROUPS);
+
+        RET(ff_vk_add_descriptor_set(ctx, s->pl, shd,  desc_i, 2, 0)); /* set 0 */
+        RET(ff_vk_add_descriptor_set(ctx, s->pl, shd, &desc_b, 1, 0)); /* set 0 */
+
+        GLSLD(   scale_bilinear                                                  );
+
+        if (s->vkctx.output_format != s->vkctx.input_format) {
+            GLSLD(   rgb2yuv                                                     );
+        }
+
+        switch (s->vkctx.output_format) {
+        case AV_PIX_FMT_NV12:    GLSLD(write_nv12); break;
+        case AV_PIX_FMT_YUV420P: GLSLD( write_420); break;
+        case AV_PIX_FMT_YUV444P: GLSLD( write_444); break;
+        default: break;
+        }
+
+        GLSLC(0, void main()                                                     );
+        GLSLC(0, {                                                               );
+        GLSLC(1,     ivec2 size;                                                 );
+        GLSLC(1,     ivec2 pos = ivec2(gl_GlobalInvocationID.xy);                );
+        GLSLF(1,     vec2 in_d = vec2(%i, %i);             ,in->width, in->height);
+        GLSLF(1,     vec2 c_r = vec2(%i, %i) / in_d;              ,crop_w, crop_h);
+        GLSLF(1,     vec2 c_o = vec2(%i, %i) / in_d;               ,crop_x,crop_y);
+        GLSLC(0,                                                                 );
+
+        if (s->vkctx.output_format == s->vkctx.input_format) {
+            for (int i = 0; i < desc_i[1].elems; i++) {
+                GLSLF(1,  size = imageSize(output_img[%i]);                    ,i);
+                GLSLC(1,  if (IS_WITHIN(pos, size)) {                            );
+                switch (s->scaler) {
+                case F_NEAREST:
+                case F_BILINEAR:
+                    GLSLF(2, vec4 res = scale_bilinear(%i, pos, c_r, c_o);     ,i);
+                    GLSLF(2, imageStore(output_img[%i], pos, res);             ,i);
+                    break;
+                };
+                GLSLC(1, }                                                       );
+            }
+        } else {
+            GLSLC(1, vec4 res = scale_bilinear(0, pos, c_r, c_o);                );
+            GLSLF(1, res = rgb2yuv(res, %i);    ,s->out_range == AVCOL_RANGE_JPEG);
+            switch (s->vkctx.output_format) {
+            case AV_PIX_FMT_NV12:    GLSLC(1, write_nv12(res, pos); ); break;
+            case AV_PIX_FMT_YUV420P: GLSLC(1,  write_420(res, pos); ); break;
+            case AV_PIX_FMT_YUV444P: GLSLC(1,  write_444(res, pos); ); break;
+            default: return AVERROR(EINVAL);
+            }
+        }
+
+        GLSLC(0, }                                                               );
+
+        RET(ff_vk_compile_shader(ctx, shd, "main"));
+    }
+
+    RET(ff_vk_init_pipeline_layout(ctx, s->pl));
+    RET(ff_vk_init_compute_pipeline(ctx, s->pl));
+
+    if (s->vkctx.output_format != s->vkctx.input_format) {
+        const struct LumaCoefficients *lcoeffs;
+        double tmp_mat[3][3];
+
+        struct {
+            float yuv_matrix[4][4];
+        } *par;
+
+        lcoeffs = ff_get_luma_coefficients(in->colorspace);
+        if (!lcoeffs) {
+            av_log(ctx, AV_LOG_ERROR, "Unsupported colorspace\n");
+            return AVERROR(EINVAL);
+        }
+
+        err = ff_vk_create_buf(ctx, &s->params_buf,
+                               sizeof(*par),
+                               VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
+                               VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
+        if (err)
+            return err;
+
+        err = ff_vk_map_buffers(ctx, &s->params_buf, (uint8_t **)&par, 1, 0);
+        if (err)
+            return err;
+
+        ff_fill_rgb2yuv_table(lcoeffs, tmp_mat);
+
+        memset(par, 0, sizeof(*par));
+
+        for (int y = 0; y < 3; y++)
+            for (int x = 0; x < 3; x++)
+                par->yuv_matrix[x][y] = tmp_mat[x][y];
+
+        par->yuv_matrix[3][3] = 1.0;
+
+        err = ff_vk_unmap_buffers(ctx, &s->params_buf, 1, 1);
+        if (err)
+            return err;
+
+        s->params_desc.buffer = s->params_buf.buf;
+        s->params_desc.range  = VK_WHOLE_SIZE;
+
+        ff_vk_update_descriptor_set(ctx, s->pl, 1);
+    }
+
+    /* Execution context */
+    RET(ff_vk_create_exec_ctx(ctx, &s->exec,
+                              s->vkctx.hwctx->queue_family_comp_index));
+
+    s->initialized = 1;
+
+    return 0;
+
+fail:
+    return err;
+}
+
+static int process_frames(AVFilterContext *avctx, AVFrame *out_f, AVFrame *in_f)
+{
+    int err = 0;
+    ScaleVulkanContext *s = avctx->priv;
+    AVVkFrame *in = (AVVkFrame *)in_f->data[0];
+    AVVkFrame *out = (AVVkFrame *)out_f->data[0];
+    VkImageMemoryBarrier barriers[AV_NUM_DATA_POINTERS*2];
+    int barrier_count = 0;
+
+    for (int i = 0; i < av_pix_fmt_count_planes(s->vkctx.input_format); i++) {
+        RET(ff_vk_create_imageview(avctx, &s->input_images[i].imageView, in->img[i],
+                                   av_vkfmt_from_pixfmt(s->vkctx.input_format)[i],
+                                   ff_comp_identity_map));
+
+        s->input_images[i].imageLayout  = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
+    }
+
+    for (int i = 0; i < av_pix_fmt_count_planes(s->vkctx.output_format); i++) {
+        RET(ff_vk_create_imageview(avctx, &s->output_images[i].imageView, out->img[i],
+                                   av_vkfmt_from_pixfmt(s->vkctx.output_format)[i],
+                                   ff_comp_identity_map));
+
+        s->output_images[i].imageLayout = VK_IMAGE_LAYOUT_GENERAL;
+    }
+
+    ff_vk_update_descriptor_set(avctx, s->pl, 0);
+
+    ff_vk_start_exec_recording(avctx, s->exec);
+
+    for (int i = 0; i < av_pix_fmt_count_planes(s->vkctx.input_format); i++) {
+        VkImageMemoryBarrier bar = {
+            .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
+            .srcAccessMask = 0,
+            .dstAccessMask = VK_ACCESS_SHADER_READ_BIT,
+            .oldLayout = in->layout[i],
+            .newLayout = s->input_images[i].imageLayout,
+            .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
+            .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
+            .image = in->img[i],
+            .subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
+            .subresourceRange.levelCount = 1,
+            .subresourceRange.layerCount = 1,
+        };
+
+        memcpy(&barriers[barrier_count++], &bar, sizeof(VkImageMemoryBarrier));
+
+        in->layout[i]  = bar.newLayout;
+        in->access[i]  = bar.dstAccessMask;
+    }
+
+    for (int i = 0; i < av_pix_fmt_count_planes(s->vkctx.output_format); i++) {
+        VkImageMemoryBarrier bar = {
+            .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
+            .srcAccessMask = 0,
+            .dstAccessMask = VK_ACCESS_SHADER_WRITE_BIT,
+            .oldLayout = out->layout[i],
+            .newLayout = s->output_images[i].imageLayout,
+            .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
+            .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
+            .image = out->img[i],
+            .subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
+            .subresourceRange.levelCount = 1,
+            .subresourceRange.layerCount = 1,
+        };
+
+        memcpy(&barriers[barrier_count++], &bar, sizeof(VkImageMemoryBarrier));
+
+        out->layout[i] = bar.newLayout;
+        out->access[i] = bar.dstAccessMask;
+    }
+
+    vkCmdPipelineBarrier(s->exec->buf, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
+                         VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, 0,
+                         0, NULL, 0, NULL, barrier_count, barriers);
+
+    ff_vk_bind_pipeline_exec(avctx, s->exec, s->pl);
+
+    vkCmdDispatch(s->exec->buf,
+                  FFALIGN(s->vkctx.output_width,  CGROUPS[0])/CGROUPS[0],
+                  FFALIGN(s->vkctx.output_height, CGROUPS[1])/CGROUPS[1], 1);
+
+    ff_vk_add_exec_dep(avctx, s->exec, in_f, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
+    ff_vk_add_exec_dep(avctx, s->exec, out_f, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
+
+    err = ff_vk_submit_exec_queue(avctx, s->exec);
+    if (err)
+        return err;
+
+    for (int i = 0; i < av_pix_fmt_count_planes(s->vkctx.input_format); i++)
+        ff_vk_destroy_imageview(avctx, &s->input_images[i].imageView);
+    for (int i = 0; i < av_pix_fmt_count_planes(s->vkctx.output_format); i++)
+        ff_vk_destroy_imageview(avctx, &s->output_images[i].imageView);
+
+fail:
+    return err;
+}
+
+static int scale_vulkan_filter_frame(AVFilterLink *link, AVFrame *in)
+{
+    int err;
+    AVFilterContext *ctx = link->dst;
+    ScaleVulkanContext *s = ctx->priv;
+    AVFilterLink *outlink = ctx->outputs[0];
+
+    AVFrame *out = ff_get_video_buffer(outlink, outlink->w, outlink->h);
+    if (!out) {
+        err = AVERROR(ENOMEM);
+        goto fail;
+    }
+
+    if (!s->initialized)
+        RET(init_filter(ctx, in));
+
+    RET(process_frames(ctx, out, in));
+
+    err = av_frame_copy_props(out, in);
+    if (err < 0)
+        goto fail;
+
+    if (s->out_range != AVCOL_RANGE_UNSPECIFIED)
+        out->color_range = s->out_range;
+    if (s->vkctx.output_format != s->vkctx.input_format)
+        out->chroma_location = AVCHROMA_LOC_TOPLEFT;
+
+    av_frame_free(&in);
+
+    return ff_filter_frame(outlink, out);
+
+fail:
+    av_frame_free(&in);
+    av_frame_free(&out);
+    return err;
+}
+
+static int scale_vulkan_config_output(AVFilterLink *outlink)
+{
+    int err;
+    AVFilterContext *avctx = outlink->src;
+    ScaleVulkanContext *s  = avctx->priv;
+    AVFilterLink *inlink   = outlink->src->inputs[0];
+
+    err = ff_scale_eval_dimensions(s, s->w_expr, s->h_expr, inlink, outlink,
+                                   &s->vkctx.output_width,
+                                   &s->vkctx.output_height);
+    if (err < 0)
+        return err;
+
+    if (s->out_format_string) {
+        s->vkctx.output_format = av_get_pix_fmt(s->out_format_string);
+        if (s->vkctx.output_format == AV_PIX_FMT_NONE) {
+            av_log(avctx, AV_LOG_ERROR, "Invalid output format.\n");
+            return AVERROR(EINVAL);
+        }
+    } else {
+        s->vkctx.output_format = s->vkctx.input_format;
+    }
+
+    if (s->vkctx.output_format != s->vkctx.input_format) {
+        if (!ff_vk_mt_is_np_rgb(s->vkctx.input_format)) {
+            av_log(avctx, AV_LOG_ERROR, "Unsupported input format for conversion\n");
+            return AVERROR(EINVAL);
+        }
+        if (s->vkctx.output_format != AV_PIX_FMT_NV12 &&
+            s->vkctx.output_format != AV_PIX_FMT_YUV420P &&
+            s->vkctx.output_format != AV_PIX_FMT_YUV444P) {
+            av_log(avctx, AV_LOG_ERROR, "Unsupported output format\n");
+            return AVERROR(EINVAL);
+        }
+    } else if (s->out_range != AVCOL_RANGE_UNSPECIFIED) {
+        av_log(avctx, AV_LOG_ERROR, "Cannot change range without converting format\n");
+        return AVERROR(EINVAL);
+    }
+
+    err = ff_vk_filter_config_output(outlink);
+    if (err < 0)
+        return err;
+
+    return 0;
+}
+
+static void scale_vulkan_uninit(AVFilterContext *avctx)
+{
+    ScaleVulkanContext *s = avctx->priv;
+
+    ff_vk_filter_uninit(avctx);
+    ff_vk_free_buf(avctx, &s->params_buf);
+
+    s->initialized = 0;
+}
+
+#define OFFSET(x) offsetof(ScaleVulkanContext, x)
+#define FLAGS (AV_OPT_FLAG_FILTERING_PARAM | AV_OPT_FLAG_VIDEO_PARAM)
+static const AVOption scale_vulkan_options[] = {
+    { "w", "Output video width",  OFFSET(w_expr), AV_OPT_TYPE_STRING, {.str = "iw"}, .flags = FLAGS },
+    { "h", "Output video height", OFFSET(h_expr), AV_OPT_TYPE_STRING, {.str = "ih"}, .flags = FLAGS },
+    { "scaler", "Scaler function", OFFSET(scaler), AV_OPT_TYPE_INT, {.i64 = F_BILINEAR}, 0, F_NB, .flags = FLAGS, "scaler" },
+        { "bilinear", "Bilinear interpolation (fastest)", 0, AV_OPT_TYPE_CONST, {.i64 = F_BILINEAR}, 0, 0, .flags = FLAGS, "scaler" },
+        { "nearest", "Nearest (useful for pixel art)", 0, AV_OPT_TYPE_CONST, {.i64 = F_NEAREST}, 0, 0, .flags = FLAGS, "scaler" },
+    { "format", "Output video format (software format of hardware frames)", OFFSET(out_format_string), AV_OPT_TYPE_STRING, .flags = FLAGS },
+    { "out_range", "Output colour range (from 0 to 2) (default 0)", OFFSET(out_range), AV_OPT_TYPE_INT, {.i64 = AVCOL_RANGE_UNSPECIFIED}, AVCOL_RANGE_UNSPECIFIED, AVCOL_RANGE_JPEG, .flags = FLAGS, "range" },
+        { "full", "Full range", 0, AV_OPT_TYPE_CONST, { .i64 = AVCOL_RANGE_JPEG }, 0, 0, FLAGS, "range" },
+        { "limited", "Limited range", 0, AV_OPT_TYPE_CONST, { .i64 = AVCOL_RANGE_MPEG }, 0, 0, FLAGS, "range" },
+        { "jpeg", "Full range", 0, AV_OPT_TYPE_CONST, { .i64 = AVCOL_RANGE_JPEG }, 0, 0, FLAGS, "range" },
+        { "mpeg", "Limited range", 0, AV_OPT_TYPE_CONST, { .i64 = AVCOL_RANGE_MPEG }, 0, 0, FLAGS, "range" },
+        { "tv", "Limited range", 0, AV_OPT_TYPE_CONST, { .i64 = AVCOL_RANGE_MPEG }, 0, 0, FLAGS, "range" },
+        { "pc", "Full range", 0, AV_OPT_TYPE_CONST, { .i64 = AVCOL_RANGE_JPEG }, 0, 0, FLAGS, "range" },
+    { NULL },
+};
+
+AVFILTER_DEFINE_CLASS(scale_vulkan);
+
+static const AVFilterPad scale_vulkan_inputs[] = {
+    {
+        .name         = "default",
+        .type         = AVMEDIA_TYPE_VIDEO,
+        .filter_frame = &scale_vulkan_filter_frame,
+        .config_props = &ff_vk_filter_config_input,
+    },
+    { NULL }
+};
+
+static const AVFilterPad scale_vulkan_outputs[] = {
+    {
+        .name = "default",
+        .type = AVMEDIA_TYPE_VIDEO,
+        .config_props = &scale_vulkan_config_output,
+    },
+    { NULL }
+};
+
+AVFilter ff_vf_scale_vulkan = {
+    .name           = "scale_vulkan",
+    .description    = NULL_IF_CONFIG_SMALL("Scale Vulkan frames"),
+    .priv_size      = sizeof(ScaleVulkanContext),
+    .init           = &ff_vk_filter_init,
+    .uninit         = &scale_vulkan_uninit,
+    .query_formats  = &ff_vk_filter_query_formats,
+    .inputs         = scale_vulkan_inputs,
+    .outputs        = scale_vulkan_outputs,
+    .priv_class     = &scale_vulkan_class,
+    .flags_internal = FF_FILTER_FLAG_HWFRAME_AWARE,
+};
diff --git a/libavfilter/vf_scroll.c b/libavfilter/vf_scroll.c
new file mode 100644
index 0000000..bb5907b
--- /dev/null
+++ b/libavfilter/vf_scroll.c
@@ -0,0 +1,224 @@
+/*
+ * Copyright (c) 2019 Paul B Mahol
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "libavutil/common.h"
+#include "libavutil/opt.h"
+#include "libavutil/pixdesc.h"
+#include "avfilter.h"
+#include "formats.h"
+#include "internal.h"
+
+typedef struct ScrollContext {
+    const AVClass *class;
+
+    float h_speed, v_speed;
+    float h_pos, v_pos;
+    float h_ipos, v_ipos;
+
+    int pos_h[4], pos_v[4];
+
+    const AVPixFmtDescriptor *desc;
+    int nb_planes;
+    int bytes;
+
+    int planewidth[4];
+    int planeheight[4];
+} ScrollContext;
+
+static int query_formats(AVFilterContext *ctx)
+{
+    static const enum AVPixelFormat pix_fmts[] = {
+        AV_PIX_FMT_YUVA444P, AV_PIX_FMT_YUV444P, AV_PIX_FMT_YUV440P,
+        AV_PIX_FMT_YUVJ444P, AV_PIX_FMT_YUVJ440P,
+        AV_PIX_FMT_YUVA422P, AV_PIX_FMT_YUV422P, AV_PIX_FMT_YUVA420P, AV_PIX_FMT_YUV420P,
+        AV_PIX_FMT_YUVJ422P, AV_PIX_FMT_YUVJ420P,
+        AV_PIX_FMT_YUVJ411P, AV_PIX_FMT_YUV411P, AV_PIX_FMT_YUV410P,
+        AV_PIX_FMT_YUV420P9, AV_PIX_FMT_YUV422P9, AV_PIX_FMT_YUV444P9,
+        AV_PIX_FMT_YUV420P10, AV_PIX_FMT_YUV422P10, AV_PIX_FMT_YUV444P10,
+        AV_PIX_FMT_YUV420P12, AV_PIX_FMT_YUV422P12, AV_PIX_FMT_YUV444P12, AV_PIX_FMT_YUV440P12,
+        AV_PIX_FMT_YUV420P14, AV_PIX_FMT_YUV422P14, AV_PIX_FMT_YUV444P14,
+        AV_PIX_FMT_YUV420P16, AV_PIX_FMT_YUV422P16, AV_PIX_FMT_YUV444P16,
+        AV_PIX_FMT_YUVA420P9, AV_PIX_FMT_YUVA422P9, AV_PIX_FMT_YUVA444P9,
+        AV_PIX_FMT_YUVA422P12, AV_PIX_FMT_YUVA444P12,
+        AV_PIX_FMT_YUVA420P10, AV_PIX_FMT_YUVA422P10, AV_PIX_FMT_YUVA444P10,
+        AV_PIX_FMT_YUVA420P16, AV_PIX_FMT_YUVA422P16, AV_PIX_FMT_YUVA444P16,
+        AV_PIX_FMT_GBRP, AV_PIX_FMT_GBRP9, AV_PIX_FMT_GBRP10,
+        AV_PIX_FMT_GBRP12, AV_PIX_FMT_GBRP14, AV_PIX_FMT_GBRP16,
+        AV_PIX_FMT_GBRAP, AV_PIX_FMT_GBRAP10, AV_PIX_FMT_GBRAP12, AV_PIX_FMT_GBRAP16,
+        AV_PIX_FMT_GRAY8, AV_PIX_FMT_GRAY9, AV_PIX_FMT_GRAY10, AV_PIX_FMT_GRAY12, AV_PIX_FMT_GRAY14, AV_PIX_FMT_GRAY16,
+        AV_PIX_FMT_NONE
+    };
+
+    AVFilterFormats *fmts_list = ff_make_format_list(pix_fmts);
+    if (!fmts_list)
+        return AVERROR(ENOMEM);
+    return ff_set_common_formats(ctx, fmts_list);
+}
+
+typedef struct ThreadData {
+    AVFrame *in, *out;
+} ThreadData;
+
+static int scroll_slice(AVFilterContext *ctx, void *arg, int jobnr,
+                        int nb_jobs)
+{
+    ScrollContext *s = ctx->priv;
+    ThreadData *td = arg;
+    AVFrame *in = td->in;
+    AVFrame *out = td->out;
+
+    for (int p = 0; p < s->nb_planes; p++) {
+        const uint8_t *src = in->data[p];
+        const int h = s->planeheight[p];
+        const int w = s->planewidth[p] * s->bytes;
+        const int slice_start = (h * jobnr) / nb_jobs;
+        const int slice_end = (h * (jobnr+1)) / nb_jobs;
+        uint8_t *dst = out->data[p] + slice_start * out->linesize[p];
+
+        for (int y = slice_start; y < slice_end; y++) {
+            int yy = (y + s->pos_v[p]) % h;
+            const uint8_t *ssrc = src + yy * in->linesize[p];
+
+            if (s->pos_h[p] < w)
+                memcpy(dst, ssrc + s->pos_h[p], w - s->pos_h[p]);
+            if (s->pos_h[p] > 0)
+                memcpy(dst + w - s->pos_h[p], ssrc, s->pos_h[p]);
+
+            dst += out->linesize[p];
+        }
+    }
+
+    return 0;
+}
+
+static void scroll(AVFilterContext *ctx, AVFrame *in, AVFrame *out)
+{
+    ScrollContext *s = ctx->priv;
+    ThreadData td;
+    int h_pos, v_pos;
+
+    s->h_pos = fmodf(s->h_pos, in->width);
+    s->v_pos = fmodf(s->v_pos, in->height);
+
+    h_pos = s->h_pos;
+    v_pos = s->v_pos;
+
+    if (h_pos < 0)
+        h_pos += in->width;
+    if (v_pos < 0)
+        v_pos += in->height;
+
+    s->pos_v[1] = s->pos_v[2] = AV_CEIL_RSHIFT(v_pos, s->desc->log2_chroma_h);
+    s->pos_v[0] = s->pos_v[3] = v_pos;
+    s->pos_h[1] = s->pos_h[2] = AV_CEIL_RSHIFT(h_pos, s->desc->log2_chroma_w) * s->bytes;
+    s->pos_h[0] = s->pos_h[3] = h_pos * s->bytes;
+
+    td.in = in; td.out = out;
+    ctx->internal->execute(ctx, scroll_slice, &td, NULL,
+                           FFMIN(out->height, ff_filter_get_nb_threads(ctx)));
+
+    s->h_pos += s->h_speed * in->width;
+    s->v_pos += s->v_speed * in->height;
+}
+
+static int filter_frame(AVFilterLink *inlink, AVFrame *in)
+{
+    AVFilterContext *ctx = inlink->dst;
+    AVFilterLink *outlink = ctx->outputs[0];
+    AVFrame *out;
+
+    out = ff_get_video_buffer(outlink, outlink->w, outlink->h);
+    if (!out) {
+        av_frame_free(&in);
+        return AVERROR(ENOMEM);
+    }
+    av_frame_copy_props(out, in);
+
+    scroll(ctx, in, out);
+
+    av_frame_free(&in);
+    return ff_filter_frame(outlink, out);
+}
+
+static int config_input(AVFilterLink *inlink)
+{
+    AVFilterContext *ctx = inlink->dst;
+    ScrollContext *s = ctx->priv;
+
+    s->desc = av_pix_fmt_desc_get(inlink->format);
+    s->nb_planes = s->desc->nb_components;
+    s->bytes = (s->desc->comp[0].depth + 7) >> 3;
+
+    s->planeheight[1] = s->planeheight[2] = AV_CEIL_RSHIFT(inlink->h, s->desc->log2_chroma_h);
+    s->planeheight[0] = s->planeheight[3] = inlink->h;
+    s->planewidth[1]  = s->planewidth[2]  = AV_CEIL_RSHIFT(inlink->w, s->desc->log2_chroma_w);
+    s->planewidth[0]  = s->planewidth[3]  = inlink->w;
+
+    s->h_pos = (1.f - s->h_ipos) * inlink->w;
+    s->v_pos = (1.f - s->v_ipos) * inlink->h;
+
+    return 0;
+}
+
+#define OFFSET(x) offsetof(ScrollContext, x)
+#define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
+#define VFT AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_RUNTIME_PARAM
+
+static const AVOption scroll_options[] = {
+    { "horizontal", "set the horizontal scrolling speed", OFFSET(h_speed), AV_OPT_TYPE_FLOAT, {.dbl=0.}, -1., 1., VFT },
+    { "h",          "set the horizontal scrolling speed", OFFSET(h_speed), AV_OPT_TYPE_FLOAT, {.dbl=0.}, -1., 1., VFT },
+    { "vertical",   "set the vertical scrolling speed",   OFFSET(v_speed), AV_OPT_TYPE_FLOAT, {.dbl=0.}, -1., 1., VFT },
+    { "v",          "set the vertical scrolling speed",   OFFSET(v_speed), AV_OPT_TYPE_FLOAT, {.dbl=0.}, -1., 1., VFT },
+    { "hpos",       "set initial horizontal position",    OFFSET(h_ipos),  AV_OPT_TYPE_FLOAT, {.dbl=0.},   0, 1., FLAGS },
+    { "vpos",       "set initial vertical position",      OFFSET(v_ipos),  AV_OPT_TYPE_FLOAT, {.dbl=0.},   0, 1., FLAGS },
+    { NULL }
+};
+
+AVFILTER_DEFINE_CLASS(scroll);
+
+static const AVFilterPad scroll_inputs[] = {
+    {
+        .name           = "default",
+        .type           = AVMEDIA_TYPE_VIDEO,
+        .config_props   = config_input,
+        .filter_frame   = filter_frame,
+    },
+    { NULL }
+};
+
+static const AVFilterPad scroll_outputs[] = {
+    {
+        .name = "default",
+        .type = AVMEDIA_TYPE_VIDEO,
+    },
+    { NULL }
+};
+
+AVFilter ff_vf_scroll = {
+    .name          = "scroll",
+    .description   = NULL_IF_CONFIG_SMALL("Scroll input video."),
+    .priv_size     = sizeof(ScrollContext),
+    .priv_class    = &scroll_class,
+    .query_formats = query_formats,
+    .inputs        = scroll_inputs,
+    .outputs       = scroll_outputs,
+    .flags         = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC | AVFILTER_FLAG_SLICE_THREADS,
+    .process_command = ff_filter_process_command,
+};
diff --git a/libavfilter/vf_selectivecolor.c b/libavfilter/vf_selectivecolor.c
index b99f31b..d8f339d 100644
--- a/libavfilter/vf_selectivecolor.c
+++ b/libavfilter/vf_selectivecolor.c
@@ -93,7 +93,7 @@
 #define OFFSET(x) offsetof(SelectiveColorContext, x)
 #define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM
 #define RANGE_OPTION(color_name, range) \
-    { color_name"s", "adjust "color_name" regions", OFFSET(opt_cmyk_adjust[range]), AV_OPT_TYPE_STRING, {.str=NULL}, CHAR_MIN, CHAR_MAX, FLAGS }
+    { color_name"s", "adjust "color_name" regions", OFFSET(opt_cmyk_adjust[range]), AV_OPT_TYPE_STRING, {.str=NULL}, 0, 0, FLAGS }
 
 static const AVOption selectivecolor_options[] = {
     { "correction_method", "select correction method", OFFSET(correction_method), AV_OPT_TYPE_INT, {.i64 = CORRECTION_METHOD_ABSOLUTE}, 0, NB_CORRECTION_METHODS-1, FLAGS, "correction_method" },
diff --git a/libavfilter/vf_separatefields.c b/libavfilter/vf_separatefields.c
index 3ed222f..74ebd35 100644
--- a/libavfilter/vf_separatefields.c
+++ b/libavfilter/vf_separatefields.c
@@ -20,6 +20,7 @@
 
 #include "libavutil/pixdesc.h"
 #include "avfilter.h"
+#include "filters.h"
 #include "internal.h"
 
 typedef struct SeparateFieldsContext {
@@ -101,23 +102,53 @@
     return ff_filter_frame(outlink, inpicref);
 }
 
-static int request_frame(AVFilterLink *outlink)
+static int flush_frame(AVFilterLink *outlink, int64_t pts, int64_t *out_pts)
 {
     AVFilterContext *ctx = outlink->src;
     SeparateFieldsContext *s = ctx->priv;
-    int ret;
+    int ret = 0;
 
-    ret = ff_request_frame(ctx->inputs[0]);
-    if (ret == AVERROR_EOF && s->second) {
-        s->second->pts *= 2;
+    if (s->second) {
+        *out_pts = s->second->pts += pts;
         extract_field(s->second, s->nb_planes, s->second->top_field_first);
         ret = ff_filter_frame(outlink, s->second);
-        s->second = 0;
+        s->second = NULL;
     }
 
     return ret;
 }
 
+static int activate(AVFilterContext *ctx)
+{
+    AVFilterLink *inlink = ctx->inputs[0];
+    AVFilterLink *outlink = ctx->outputs[0];
+    AVFrame *in;
+    int64_t pts;
+    int ret, status;
+
+    FF_FILTER_FORWARD_STATUS_BACK(outlink, inlink);
+
+    ret = ff_inlink_consume_frame(inlink, &in);
+    if (ret < 0)
+        return ret;
+    if (ret > 0)
+        return filter_frame(inlink, in);
+
+    if (ff_inlink_acknowledge_status(inlink, &status, &pts)) {
+        if (status == AVERROR_EOF) {
+            int64_t out_pts = pts;
+
+            ret = flush_frame(outlink, pts, &out_pts);
+            ff_outlink_set_status(outlink, status, out_pts);
+            return ret;
+        }
+    }
+
+    FF_FILTER_FORWARD_WANTED(outlink, inlink);
+
+    return FFERROR_NOT_READY;
+}
+
 static av_cold void uninit(AVFilterContext *ctx)
 {
     SeparateFieldsContext *s = ctx->priv;
@@ -129,7 +160,6 @@
     {
         .name         = "default",
         .type         = AVMEDIA_TYPE_VIDEO,
-        .filter_frame = filter_frame,
     },
     { NULL }
 };
@@ -139,7 +169,6 @@
         .name          = "default",
         .type          = AVMEDIA_TYPE_VIDEO,
         .config_props  = config_props_output,
-        .request_frame = request_frame,
     },
     { NULL }
 };
@@ -148,6 +177,7 @@
     .name        = "separatefields",
     .description = NULL_IF_CONFIG_SMALL("Split input video frames into fields."),
     .priv_size   = sizeof(SeparateFieldsContext),
+    .activate    = activate,
     .uninit      = uninit,
     .inputs      = separatefields_inputs,
     .outputs     = separatefields_outputs,
diff --git a/libavfilter/vf_setfield.c b/libavfilter/vf_setfield.c
deleted file mode 100644
index f4dc33d..0000000
--- a/libavfilter/vf_setfield.c
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Copyright (c) 2012 Stefano Sabatini
- *
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * FFmpeg is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with FFmpeg; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-/**
- * @file
- * set field order
- */
-
-#include "libavutil/opt.h"
-#include "avfilter.h"
-#include "internal.h"
-#include "video.h"
-
-enum SetFieldMode {
-    MODE_AUTO = -1,
-    MODE_BFF,
-    MODE_TFF,
-    MODE_PROG,
-};
-
-typedef struct SetFieldContext {
-    const AVClass *class;
-    int mode;                   ///< SetFieldMode
-} SetFieldContext;
-
-#define OFFSET(x) offsetof(SetFieldContext, x)
-#define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM
-
-static const AVOption setfield_options[] = {
-    {"mode", "select interlace mode", OFFSET(mode), AV_OPT_TYPE_INT, {.i64=MODE_AUTO}, -1, MODE_PROG, FLAGS, "mode"},
-    {"auto", "keep the same input field",  0, AV_OPT_TYPE_CONST, {.i64=MODE_AUTO}, INT_MIN, INT_MAX, FLAGS, "mode"},
-    {"bff",  "mark as bottom-field-first", 0, AV_OPT_TYPE_CONST, {.i64=MODE_BFF},  INT_MIN, INT_MAX, FLAGS, "mode"},
-    {"tff",  "mark as top-field-first",    0, AV_OPT_TYPE_CONST, {.i64=MODE_TFF},  INT_MIN, INT_MAX, FLAGS, "mode"},
-    {"prog", "mark as progressive",        0, AV_OPT_TYPE_CONST, {.i64=MODE_PROG}, INT_MIN, INT_MAX, FLAGS, "mode"},
-    {NULL}
-};
-
-AVFILTER_DEFINE_CLASS(setfield);
-
-static int filter_frame(AVFilterLink *inlink, AVFrame *picref)
-{
-    SetFieldContext *setfield = inlink->dst->priv;
-
-    if (setfield->mode == MODE_PROG) {
-        picref->interlaced_frame = 0;
-    } else if (setfield->mode != MODE_AUTO) {
-        picref->interlaced_frame = 1;
-        picref->top_field_first = setfield->mode;
-    }
-    return ff_filter_frame(inlink->dst->outputs[0], picref);
-}
-
-static const AVFilterPad setfield_inputs[] = {
-    {
-        .name         = "default",
-        .type         = AVMEDIA_TYPE_VIDEO,
-        .filter_frame = filter_frame,
-    },
-    { NULL }
-};
-
-static const AVFilterPad setfield_outputs[] = {
-    {
-        .name = "default",
-        .type = AVMEDIA_TYPE_VIDEO,
-    },
-    { NULL }
-};
-
-AVFilter ff_vf_setfield = {
-    .name        = "setfield",
-    .description = NULL_IF_CONFIG_SMALL("Force field for the output video frame."),
-    .priv_size   = sizeof(SetFieldContext),
-    .priv_class  = &setfield_class,
-    .inputs      = setfield_inputs,
-    .outputs     = setfield_outputs,
-};
diff --git a/libavfilter/vf_setparams.c b/libavfilter/vf_setparams.c
index 8427f98..689097f 100644
--- a/libavfilter/vf_setparams.c
+++ b/libavfilter/vf_setparams.c
@@ -1,4 +1,6 @@
 /*
+ * Copyright (c) 2012 Stefano Sabatini
+ *
  * This file is part of FFmpeg.
  *
  * FFmpeg is free software; you can redistribute it and/or
@@ -22,15 +24,32 @@
 #include "internal.h"
 #include "video.h"
 
+enum SetFieldMode {
+    MODE_AUTO = -1,
+    MODE_BFF,
+    MODE_TFF,
+    MODE_PROG,
+};
+
 typedef struct SetParamsContext {
     const AVClass *class;
+    int field_mode;
     int color_range;
+    int color_primaries;
+    int color_trc;
+    int colorspace;
 } SetParamsContext;
 
 #define OFFSET(x) offsetof(SetParamsContext, x)
 #define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM
 
-static const AVOption setrange_options[] = {
+static const AVOption setparams_options[] = {
+    {"field_mode", "select interlace mode", OFFSET(field_mode), AV_OPT_TYPE_INT, {.i64=MODE_AUTO}, -1, MODE_PROG, FLAGS, "mode"},
+    {"auto", "keep the same input field",  0, AV_OPT_TYPE_CONST, {.i64=MODE_AUTO}, INT_MIN, INT_MAX, FLAGS, "mode"},
+    {"bff",  "mark as bottom-field-first", 0, AV_OPT_TYPE_CONST, {.i64=MODE_BFF},  INT_MIN, INT_MAX, FLAGS, "mode"},
+    {"tff",  "mark as top-field-first",    0, AV_OPT_TYPE_CONST, {.i64=MODE_TFF},  INT_MIN, INT_MAX, FLAGS, "mode"},
+    {"prog", "mark as progressive",        0, AV_OPT_TYPE_CONST, {.i64=MODE_PROG}, INT_MIN, INT_MAX, FLAGS, "mode"},
+
     {"range", "select color range", OFFSET(color_range), AV_OPT_TYPE_INT, {.i64=-1},-1, AVCOL_RANGE_NB-1, FLAGS, "range"},
     {"auto",  "keep the same color range",   0, AV_OPT_TYPE_CONST, {.i64=-1},                       0, 0, FLAGS, "range"},
     {"unspecified",                  NULL,   0, AV_OPT_TYPE_CONST, {.i64=AVCOL_RANGE_UNSPECIFIED},  0, 0, FLAGS, "range"},
@@ -41,18 +60,88 @@
     {"full",                         NULL,   0, AV_OPT_TYPE_CONST, {.i64=AVCOL_RANGE_JPEG},         0, 0, FLAGS, "range"},
     {"pc",                           NULL,   0, AV_OPT_TYPE_CONST, {.i64=AVCOL_RANGE_JPEG},         0, 0, FLAGS, "range"},
     {"jpeg",                         NULL,   0, AV_OPT_TYPE_CONST, {.i64=AVCOL_RANGE_JPEG},         0, 0, FLAGS, "range"},
+
+    {"color_primaries", "select color primaries", OFFSET(color_primaries), AV_OPT_TYPE_INT, {.i64=-1}, -1, AVCOL_PRI_NB-1, FLAGS, "color_primaries"},
+    {"auto", "keep the same color primaries",  0, AV_OPT_TYPE_CONST, {.i64=-1},                     INT_MIN, INT_MAX, FLAGS, "color_primaries"},
+    {"bt709",                           NULL,  0, AV_OPT_TYPE_CONST, {.i64=AVCOL_PRI_BT709},        INT_MIN, INT_MAX, FLAGS, "color_primaries"},
+    {"unknown",                         NULL,  0, AV_OPT_TYPE_CONST, {.i64=AVCOL_PRI_UNSPECIFIED},  INT_MIN, INT_MAX, FLAGS, "color_primaries"},
+    {"bt470m",                          NULL,  0, AV_OPT_TYPE_CONST, {.i64=AVCOL_PRI_BT470M},       INT_MIN, INT_MAX, FLAGS, "color_primaries"},
+    {"bt470bg",                         NULL,  0, AV_OPT_TYPE_CONST, {.i64=AVCOL_PRI_BT470BG},      INT_MIN, INT_MAX, FLAGS, "color_primaries"},
+    {"smpte170m",                       NULL,  0, AV_OPT_TYPE_CONST, {.i64=AVCOL_PRI_SMPTE170M},    INT_MIN, INT_MAX, FLAGS, "color_primaries"},
+    {"smpte240m",                       NULL,  0, AV_OPT_TYPE_CONST, {.i64=AVCOL_PRI_SMPTE240M},    INT_MIN, INT_MAX, FLAGS, "color_primaries"},
+    {"film",                            NULL,  0, AV_OPT_TYPE_CONST, {.i64=AVCOL_PRI_FILM},         INT_MIN, INT_MAX, FLAGS, "color_primaries"},
+    {"bt2020",                          NULL,  0, AV_OPT_TYPE_CONST, {.i64=AVCOL_PRI_BT2020},       INT_MIN, INT_MAX, FLAGS, "color_primaries"},
+    {"smpte428",                        NULL,  0, AV_OPT_TYPE_CONST, {.i64=AVCOL_PRI_SMPTE428},     INT_MIN, INT_MAX, FLAGS, "color_primaries"},
+    {"smpte431",                        NULL,  0, AV_OPT_TYPE_CONST, {.i64=AVCOL_PRI_SMPTE431},     INT_MIN, INT_MAX, FLAGS, "color_primaries"},
+    {"smpte432",                        NULL,  0, AV_OPT_TYPE_CONST, {.i64=AVCOL_PRI_SMPTE432},     INT_MIN, INT_MAX, FLAGS, "color_primaries"},
+    {"jedec-p22",                       NULL,  0, AV_OPT_TYPE_CONST, {.i64=AVCOL_PRI_JEDEC_P22},    INT_MIN, INT_MAX, FLAGS, "color_primaries"},
+    {"ebu3213",                         NULL,  0, AV_OPT_TYPE_CONST, {.i64=AVCOL_PRI_EBU3213},      INT_MIN, INT_MAX, FLAGS, "color_primaries"},
+
+    {"color_trc", "select color transfer", OFFSET(color_trc), AV_OPT_TYPE_INT, {.i64=-1}, -1, AVCOL_TRC_NB-1, FLAGS, "color_trc"},
+    {"auto", "keep the same color transfer",  0, AV_OPT_TYPE_CONST, {.i64=-1},                     INT_MIN, INT_MAX, FLAGS, "color_trc"},
+    {"bt709",                          NULL,  0, AV_OPT_TYPE_CONST, {.i64=AVCOL_TRC_BT709},        INT_MIN, INT_MAX, FLAGS, "color_trc"},
+    {"unknown",                        NULL,  0, AV_OPT_TYPE_CONST, {.i64=AVCOL_TRC_UNSPECIFIED},  INT_MIN, INT_MAX, FLAGS, "color_trc"},
+    {"bt470m",                         NULL,  0, AV_OPT_TYPE_CONST, {.i64=AVCOL_TRC_GAMMA22},      INT_MIN, INT_MAX, FLAGS, "color_trc"},
+    {"bt470bg",                        NULL,  0, AV_OPT_TYPE_CONST, {.i64=AVCOL_TRC_GAMMA28},      INT_MIN, INT_MAX, FLAGS, "color_trc"},
+    {"smpte170m",                      NULL,  0, AV_OPT_TYPE_CONST, {.i64=AVCOL_TRC_SMPTE170M},    INT_MIN, INT_MAX, FLAGS, "color_trc"},
+    {"smpte240m",                      NULL,  0, AV_OPT_TYPE_CONST, {.i64=AVCOL_TRC_SMPTE240M},    INT_MIN, INT_MAX, FLAGS, "color_trc"},
+    {"linear",                         NULL,  0, AV_OPT_TYPE_CONST, {.i64=AVCOL_TRC_LINEAR},       INT_MIN, INT_MAX, FLAGS, "color_trc"},
+    {"log100",                         NULL,  0, AV_OPT_TYPE_CONST, {.i64=AVCOL_TRC_LOG},          INT_MIN, INT_MAX, FLAGS, "color_trc"},
+    {"log316",                         NULL,  0, AV_OPT_TYPE_CONST, {.i64=AVCOL_TRC_LOG_SQRT},     INT_MIN, INT_MAX, FLAGS, "color_trc"},
+    {"iec61966-2-4",                   NULL,  0, AV_OPT_TYPE_CONST, {.i64=AVCOL_TRC_IEC61966_2_4}, INT_MIN, INT_MAX, FLAGS, "color_trc"},
+    {"bt1361e",                        NULL,  0, AV_OPT_TYPE_CONST, {.i64=AVCOL_TRC_BT1361_ECG},   INT_MIN, INT_MAX, FLAGS, "color_trc"},
+    {"iec61966-2-1",                   NULL,  0, AV_OPT_TYPE_CONST, {.i64=AVCOL_TRC_IEC61966_2_1}, INT_MIN, INT_MAX, FLAGS, "color_trc"},
+    {"bt2020-10",                      NULL,  0, AV_OPT_TYPE_CONST, {.i64=AVCOL_TRC_BT2020_10},    INT_MIN, INT_MAX, FLAGS, "color_trc"},
+    {"bt2020-12",                      NULL,  0, AV_OPT_TYPE_CONST, {.i64=AVCOL_TRC_BT2020_12},    INT_MIN, INT_MAX, FLAGS, "color_trc"},
+    {"smpte2084",                      NULL,  0, AV_OPT_TYPE_CONST, {.i64=AVCOL_TRC_SMPTE2084},    INT_MIN, INT_MAX, FLAGS, "color_trc"},
+    {"smpte428",                       NULL,  0, AV_OPT_TYPE_CONST, {.i64=AVCOL_TRC_SMPTE428},     INT_MIN, INT_MAX, FLAGS, "color_trc"},
+    {"arib-std-b67",                   NULL,  0, AV_OPT_TYPE_CONST, {.i64=AVCOL_TRC_ARIB_STD_B67}, INT_MIN, INT_MAX, FLAGS, "color_trc"},
+
+    {"colorspace", "select colorspace", OFFSET(colorspace), AV_OPT_TYPE_INT, {.i64=-1}, -1, AVCOL_SPC_NB-1, FLAGS, "colorspace"},
+    {"auto", "keep the same colorspace",  0, AV_OPT_TYPE_CONST, {.i64=-1},                          INT_MIN, INT_MAX, FLAGS, "colorspace"},
+    {"gbr",                        NULL,  0, AV_OPT_TYPE_CONST, {.i64=AVCOL_SPC_RGB},               INT_MIN, INT_MAX, FLAGS, "colorspace"},
+    {"bt709",                      NULL,  0, AV_OPT_TYPE_CONST, {.i64=AVCOL_SPC_BT709},             INT_MIN, INT_MAX, FLAGS, "colorspace"},
+    {"unknown",                    NULL,  0, AV_OPT_TYPE_CONST, {.i64=AVCOL_SPC_UNSPECIFIED},       INT_MIN, INT_MAX, FLAGS, "colorspace"},
+    {"fcc",                        NULL,  0, AV_OPT_TYPE_CONST, {.i64=AVCOL_SPC_FCC},               INT_MIN, INT_MAX, FLAGS, "colorspace"},
+    {"bt470bg",                    NULL,  0, AV_OPT_TYPE_CONST, {.i64=AVCOL_SPC_BT470BG},           INT_MIN, INT_MAX, FLAGS, "colorspace"},
+    {"smpte170m",                  NULL,  0, AV_OPT_TYPE_CONST, {.i64=AVCOL_SPC_SMPTE170M},         INT_MIN, INT_MAX, FLAGS, "colorspace"},
+    {"smpte240m",                  NULL,  0, AV_OPT_TYPE_CONST, {.i64=AVCOL_SPC_SMPTE240M},         INT_MIN, INT_MAX, FLAGS, "colorspace"},
+    {"ycgco",                      NULL,  0, AV_OPT_TYPE_CONST, {.i64=AVCOL_SPC_YCGCO},             INT_MIN, INT_MAX, FLAGS, "colorspace"},
+    {"bt2020nc",                   NULL,  0, AV_OPT_TYPE_CONST, {.i64=AVCOL_SPC_BT2020_NCL},        INT_MIN, INT_MAX, FLAGS, "colorspace"},
+    {"bt2020c",                    NULL,  0, AV_OPT_TYPE_CONST, {.i64=AVCOL_SPC_BT2020_CL},         INT_MIN, INT_MAX, FLAGS, "colorspace"},
+    {"smpte2085",                  NULL,  0, AV_OPT_TYPE_CONST, {.i64=AVCOL_SPC_SMPTE2085},         INT_MIN, INT_MAX, FLAGS, "colorspace"},
+    {"chroma-derived-nc",          NULL,  0, AV_OPT_TYPE_CONST, {.i64=AVCOL_SPC_CHROMA_DERIVED_NCL},INT_MIN, INT_MAX, FLAGS, "colorspace"},
+    {"chroma-derived-c",           NULL,  0, AV_OPT_TYPE_CONST, {.i64=AVCOL_SPC_CHROMA_DERIVED_CL}, INT_MIN, INT_MAX, FLAGS, "colorspace"},
+    {"ictcp",                      NULL,  0, AV_OPT_TYPE_CONST, {.i64=AVCOL_SPC_ICTCP},             INT_MIN, INT_MAX, FLAGS, "colorspace"},
     {NULL}
 };
 
-AVFILTER_DEFINE_CLASS(setrange);
+AVFILTER_DEFINE_CLASS(setparams);
 
 static int filter_frame(AVFilterLink *inlink, AVFrame *frame)
 {
     AVFilterContext *ctx = inlink->dst;
     SetParamsContext *s = ctx->priv;
 
+    /* set field */
+    if (s->field_mode == MODE_PROG) {
+        frame->interlaced_frame = 0;
+    } else if (s->field_mode != MODE_AUTO) {
+        frame->interlaced_frame = 1;
+        frame->top_field_first = s->field_mode;
+    }
+
+    /* set range */
     if (s->color_range >= 0)
         frame->color_range = s->color_range;
+
+    /* set color prim, trc, space */
+    if (s->color_primaries >= 0)
+        frame->color_primaries = s->color_primaries;
+    if (s->color_trc >= 0)
+        frame->color_trc = s->color_trc;
+    if (s->colorspace >= 0)
+        frame->colorspace = s->colorspace;
     return ff_filter_frame(ctx->outputs[0], frame);
 }
 
@@ -73,11 +162,85 @@
     { NULL }
 };
 
+AVFilter ff_vf_setparams = {
+    .name        = "setparams",
+    .description = NULL_IF_CONFIG_SMALL("Force field, or color property for the output video frame."),
+    .priv_size   = sizeof(SetParamsContext),
+    .priv_class  = &setparams_class,
+    .inputs      = inputs,
+    .outputs     = outputs,
+};
+
+#if CONFIG_SETRANGE_FILTER
+
+static const AVOption setrange_options[] = {
+    {"range", "select color range", OFFSET(color_range), AV_OPT_TYPE_INT, {.i64=-1},-1, AVCOL_RANGE_NB-1, FLAGS, "range"},
+    {"auto",  "keep the same color range",   0, AV_OPT_TYPE_CONST, {.i64=-1},                       0, 0, FLAGS, "range"},
+    {"unspecified",                  NULL,   0, AV_OPT_TYPE_CONST, {.i64=AVCOL_RANGE_UNSPECIFIED},  0, 0, FLAGS, "range"},
+    {"unknown",                      NULL,   0, AV_OPT_TYPE_CONST, {.i64=AVCOL_RANGE_UNSPECIFIED},  0, 0, FLAGS, "range"},
+    {"limited",                      NULL,   0, AV_OPT_TYPE_CONST, {.i64=AVCOL_RANGE_MPEG},         0, 0, FLAGS, "range"},
+    {"tv",                           NULL,   0, AV_OPT_TYPE_CONST, {.i64=AVCOL_RANGE_MPEG},         0, 0, FLAGS, "range"},
+    {"mpeg",                         NULL,   0, AV_OPT_TYPE_CONST, {.i64=AVCOL_RANGE_MPEG},         0, 0, FLAGS, "range"},
+    {"full",                         NULL,   0, AV_OPT_TYPE_CONST, {.i64=AVCOL_RANGE_JPEG},         0, 0, FLAGS, "range"},
+    {"pc",                           NULL,   0, AV_OPT_TYPE_CONST, {.i64=AVCOL_RANGE_JPEG},         0, 0, FLAGS, "range"},
+    {"jpeg",                         NULL,   0, AV_OPT_TYPE_CONST, {.i64=AVCOL_RANGE_JPEG},         0, 0, FLAGS, "range"},
+    {NULL}
+};
+
+AVFILTER_DEFINE_CLASS(setrange);
+
+static av_cold int init_setrange(AVFilterContext *ctx)
+{
+    SetParamsContext *s = ctx->priv;
+
+    s->field_mode = MODE_AUTO;/* set field mode to auto */
+    s->color_primaries = -1;
+    s->color_trc       = -1;
+    s->colorspace      = -1;
+    return 0;
+}
+
 AVFilter ff_vf_setrange = {
     .name        = "setrange",
     .description = NULL_IF_CONFIG_SMALL("Force color range for the output video frame."),
     .priv_size   = sizeof(SetParamsContext),
+    .init        = init_setrange,
     .priv_class  = &setrange_class,
     .inputs      = inputs,
     .outputs     = outputs,
 };
+#endif /* CONFIG_SETRANGE_FILTER */
+
+#if CONFIG_SETFIELD_FILTER
+static const AVOption setfield_options[] = {
+    {"mode", "select interlace mode", OFFSET(field_mode), AV_OPT_TYPE_INT, {.i64=MODE_AUTO}, -1, MODE_PROG, FLAGS, "mode"},
+    {"auto", "keep the same input field",  0, AV_OPT_TYPE_CONST, {.i64=MODE_AUTO}, INT_MIN, INT_MAX, FLAGS, "mode"},
+    {"bff",  "mark as bottom-field-first", 0, AV_OPT_TYPE_CONST, {.i64=MODE_BFF},  INT_MIN, INT_MAX, FLAGS, "mode"},
+    {"tff",  "mark as top-field-first",    0, AV_OPT_TYPE_CONST, {.i64=MODE_TFF},  INT_MIN, INT_MAX, FLAGS, "mode"},
+    {"prog", "mark as progressive",        0, AV_OPT_TYPE_CONST, {.i64=MODE_PROG}, INT_MIN, INT_MAX, FLAGS, "mode"},
+    {NULL}
+};
+
+AVFILTER_DEFINE_CLASS(setfield);
+
+static av_cold int init_setfield(AVFilterContext *ctx)
+{
+    SetParamsContext *s = ctx->priv;
+
+    s->color_range = -1;/* set range mode to auto */
+    s->color_primaries = -1;
+    s->color_trc       = -1;
+    s->colorspace      = -1;
+    return 0;
+}
+
+AVFilter ff_vf_setfield = {
+    .name        = "setfield",
+    .description = NULL_IF_CONFIG_SMALL("Force field for the output video frame."),
+    .priv_size   = sizeof(SetParamsContext),
+    .init        = init_setfield,
+    .priv_class  = &setfield_class,
+    .inputs      = inputs,
+    .outputs     = outputs,
+};
+#endif /* CONFIG_SETFIELD_FILTER */
diff --git a/libavfilter/vf_showinfo.c b/libavfilter/vf_showinfo.c
index d1d1415..b0b0051 100644
--- a/libavfilter/vf_showinfo.c
+++ b/libavfilter/vf_showinfo.c
@@ -24,19 +24,38 @@
 
 #include <inttypes.h>
 
+#include "libavutil/bswap.h"
 #include "libavutil/adler32.h"
 #include "libavutil/display.h"
 #include "libavutil/imgutils.h"
 #include "libavutil/internal.h"
+#include "libavutil/opt.h"
 #include "libavutil/pixdesc.h"
 #include "libavutil/spherical.h"
 #include "libavutil/stereo3d.h"
 #include "libavutil/timestamp.h"
+#include "libavutil/timecode.h"
+#include "libavutil/mastering_display_metadata.h"
 
 #include "avfilter.h"
 #include "internal.h"
 #include "video.h"
 
+typedef struct ShowInfoContext {
+    const AVClass *class;
+    int calculate_checksums;
+} ShowInfoContext;
+
+#define OFFSET(x) offsetof(ShowInfoContext, x)
+#define VF AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
+
+static const AVOption showinfo_options[] = {
+    { "checksum", "calculate checksums", OFFSET(calculate_checksums), AV_OPT_TYPE_BOOL, {.i64=1}, 0, 1, VF },
+    { NULL }
+};
+
+AVFILTER_DEFINE_CLASS(showinfo);
+
 static void dump_spherical(AVFilterContext *ctx, AVFrame *frame, AVFrameSideData *sd)
 {
     AVSphericalMapping *spherical = (AVSphericalMapping *)sd->data;
@@ -44,7 +63,7 @@
 
     av_log(ctx, AV_LOG_INFO, "spherical information: ");
     if (sd->size < sizeof(*spherical)) {
-        av_log(ctx, AV_LOG_INFO, "invalid data");
+        av_log(ctx, AV_LOG_ERROR, "invalid data");
         return;
     }
 
@@ -82,7 +101,7 @@
 
     av_log(ctx, AV_LOG_INFO, "stereoscopic information: ");
     if (sd->size < sizeof(*stereo)) {
-        av_log(ctx, AV_LOG_INFO, "invalid data");
+        av_log(ctx, AV_LOG_ERROR, "invalid data");
         return;
     }
 
@@ -94,7 +113,97 @@
         av_log(ctx, AV_LOG_INFO, " (inverted)");
 }
 
-static void update_sample_stats(const uint8_t *src, int len, int64_t *sum, int64_t *sum2)
+static void dump_roi(AVFilterContext *ctx, AVFrameSideData *sd)
+{
+    int nb_rois;
+    const AVRegionOfInterest *roi;
+    uint32_t roi_size;
+
+    roi = (const AVRegionOfInterest *)sd->data;
+    roi_size = roi->self_size;
+    if (!roi_size || sd->size % roi_size != 0) {
+        av_log(ctx, AV_LOG_ERROR, "Invalid AVRegionOfInterest.self_size.");
+        return;
+    }
+    nb_rois = sd->size / roi_size;
+
+    av_log(ctx, AV_LOG_INFO, "Regions Of Interest(RoI) information: ");
+    for (int i = 0; i < nb_rois; i++) {
+        roi = (const AVRegionOfInterest *)(sd->data + roi_size * i);
+        av_log(ctx, AV_LOG_INFO, "index: %d, region: (%d, %d)/(%d, %d), qp offset: %d/%d.\n",
+               i, roi->left, roi->top, roi->right, roi->bottom, roi->qoffset.num, roi->qoffset.den);
+    }
+}
+
+static void dump_mastering_display(AVFilterContext *ctx, AVFrameSideData *sd)
+{
+    AVMasteringDisplayMetadata *mastering_display;
+
+    av_log(ctx, AV_LOG_INFO, "mastering display: ");
+    if (sd->size < sizeof(*mastering_display)) {
+        av_log(ctx, AV_LOG_ERROR, "invalid data");
+        return;
+    }
+
+    mastering_display = (AVMasteringDisplayMetadata *)sd->data;
+
+    av_log(ctx, AV_LOG_INFO, "has_primaries:%d has_luminance:%d "
+           "r(%5.4f,%5.4f) g(%5.4f,%5.4f) b(%5.4f %5.4f) wp(%5.4f, %5.4f) "
+           "min_luminance=%f, max_luminance=%f",
+           mastering_display->has_primaries, mastering_display->has_luminance,
+           av_q2d(mastering_display->display_primaries[0][0]),
+           av_q2d(mastering_display->display_primaries[0][1]),
+           av_q2d(mastering_display->display_primaries[1][0]),
+           av_q2d(mastering_display->display_primaries[1][1]),
+           av_q2d(mastering_display->display_primaries[2][0]),
+           av_q2d(mastering_display->display_primaries[2][1]),
+           av_q2d(mastering_display->white_point[0]), av_q2d(mastering_display->white_point[1]),
+           av_q2d(mastering_display->min_luminance), av_q2d(mastering_display->max_luminance));
+}
+
+static void dump_content_light_metadata(AVFilterContext *ctx, AVFrameSideData *sd)
+{
+    AVContentLightMetadata* metadata = (AVContentLightMetadata*)sd->data;
+
+    av_log(ctx, AV_LOG_INFO, "Content Light Level information: "
+           "MaxCLL=%d, MaxFALL=%d",
+           metadata->MaxCLL, metadata->MaxFALL);
+}
+
+static void dump_color_property(AVFilterContext *ctx, AVFrame *frame)
+{
+    const char *color_range_str     = av_color_range_name(frame->color_range);
+    const char *colorspace_str      = av_color_space_name(frame->colorspace);
+    const char *color_primaries_str = av_color_primaries_name(frame->color_primaries);
+    const char *color_trc_str       = av_color_transfer_name(frame->color_trc);
+
+    if (!color_range_str || frame->color_range == AVCOL_RANGE_UNSPECIFIED) {
+        av_log(ctx, AV_LOG_INFO, "color_range:unknown");
+    } else {
+        av_log(ctx, AV_LOG_INFO, "color_range:%s", color_range_str);
+    }
+
+    if (!colorspace_str || frame->colorspace == AVCOL_SPC_UNSPECIFIED) {
+        av_log(ctx, AV_LOG_INFO, " color_space:unknown");
+    } else {
+        av_log(ctx, AV_LOG_INFO, " color_space:%s", colorspace_str);
+    }
+
+    if (!color_primaries_str || frame->color_primaries == AVCOL_PRI_UNSPECIFIED) {
+        av_log(ctx, AV_LOG_INFO, " color_primaries:unknown");
+    } else {
+        av_log(ctx, AV_LOG_INFO, " color_primaries:%s", color_primaries_str);
+    }
+
+    if (!color_trc_str || frame->color_trc == AVCOL_TRC_UNSPECIFIED) {
+        av_log(ctx, AV_LOG_INFO, " color_trc:unknown");
+    } else {
+        av_log(ctx, AV_LOG_INFO, " color_trc:%s", color_trc_str);
+    }
+    av_log(ctx, AV_LOG_INFO, "\n");
+}
+
+static void update_sample_stats_8(const uint8_t *src, int len, int64_t *sum, int64_t *sum2)
 {
     int i;
 
@@ -104,19 +213,47 @@
     }
 }
 
+static void update_sample_stats_16(int be, const uint8_t *src, int len, int64_t *sum, int64_t *sum2)
+{
+    const uint16_t *src1 = (const uint16_t *)src;
+    int i;
+
+    for (i = 0; i < len / 2; i++) {
+        if ((HAVE_BIGENDIAN && !be) || (!HAVE_BIGENDIAN && be)) {
+            *sum += av_bswap16(src1[i]);
+            *sum2 += (uint32_t)av_bswap16(src1[i]) * (uint32_t)av_bswap16(src1[i]);
+        } else {
+            *sum += src1[i];
+            *sum2 += (uint32_t)src1[i] * (uint32_t)src1[i];
+        }
+    }
+}
+
+static void update_sample_stats(int depth, int be, const uint8_t *src, int len, int64_t *sum, int64_t *sum2)
+{
+    if (depth <= 8)
+        update_sample_stats_8(src, len, sum, sum2);
+    else
+        update_sample_stats_16(be, src, len, sum, sum2);
+}
+
 static int filter_frame(AVFilterLink *inlink, AVFrame *frame)
 {
     AVFilterContext *ctx = inlink->dst;
+    ShowInfoContext *s = ctx->priv;
     const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(inlink->format);
     uint32_t plane_checksum[4] = {0}, checksum = 0;
     int64_t sum[4] = {0}, sum2[4] = {0};
     int32_t pixelcount[4] = {0};
+    int bitdepth = desc->comp[0].depth;
+    int be = desc->flags & AV_PIX_FMT_FLAG_BE;
     int i, plane, vsub = desc->log2_chroma_h;
 
-    for (plane = 0; plane < 4 && frame->data[plane] && frame->linesize[plane]; plane++) {
+    for (plane = 0; plane < 4 && s->calculate_checksums && frame->data[plane] && frame->linesize[plane]; plane++) {
         uint8_t *data = frame->data[plane];
         int h = plane == 1 || plane == 2 ? AV_CEIL_RSHIFT(inlink->h, vsub) : inlink->h;
         int linesize = av_image_get_linesize(frame->format, frame->width, plane);
+        int width = linesize >> (bitdepth > 8);
 
         if (linesize < 0)
             return linesize;
@@ -125,16 +262,15 @@
             plane_checksum[plane] = av_adler32_update(plane_checksum[plane], data, linesize);
             checksum = av_adler32_update(checksum, data, linesize);
 
-            update_sample_stats(data, linesize, sum+plane, sum2+plane);
-            pixelcount[plane] += linesize;
+            update_sample_stats(bitdepth, be, data, linesize, sum+plane, sum2+plane);
+            pixelcount[plane] += width;
             data += frame->linesize[plane];
         }
     }
 
     av_log(ctx, AV_LOG_INFO,
            "n:%4"PRId64" pts:%7s pts_time:%-7s pos:%9"PRId64" "
-           "fmt:%s sar:%d/%d s:%dx%d i:%c iskey:%d type:%c "
-           "checksum:%08"PRIX32" plane_checksum:[%08"PRIX32,
+           "fmt:%s sar:%d/%d s:%dx%d i:%c iskey:%d type:%c ",
            inlink->frame_count_out,
            av_ts2str(frame->pts), av_ts2timestr(frame->pts, &inlink->time_base), frame->pkt_pos,
            desc->name,
@@ -143,19 +279,25 @@
            !frame->interlaced_frame ? 'P' :         /* Progressive  */
            frame->top_field_first   ? 'T' : 'B',    /* Top / Bottom */
            frame->key_frame,
-           av_get_picture_type_char(frame->pict_type),
-           checksum, plane_checksum[0]);
+           av_get_picture_type_char(frame->pict_type));
 
-    for (plane = 1; plane < 4 && frame->data[plane] && frame->linesize[plane]; plane++)
-        av_log(ctx, AV_LOG_INFO, " %08"PRIX32, plane_checksum[plane]);
-    av_log(ctx, AV_LOG_INFO, "] mean:[");
-    for (plane = 0; plane < 4 && frame->data[plane] && frame->linesize[plane]; plane++)
-        av_log(ctx, AV_LOG_INFO, "%"PRId64" ", (sum[plane] + pixelcount[plane]/2) / pixelcount[plane]);
-    av_log(ctx, AV_LOG_INFO, "\b] stdev:[");
-    for (plane = 0; plane < 4 && frame->data[plane] && frame->linesize[plane]; plane++)
-        av_log(ctx, AV_LOG_INFO, "%3.1f ",
-               sqrt((sum2[plane] - sum[plane]*(double)sum[plane]/pixelcount[plane])/pixelcount[plane]));
-    av_log(ctx, AV_LOG_INFO, "\b]\n");
+    if (s->calculate_checksums) {
+        av_log(ctx, AV_LOG_INFO,
+               "checksum:%08"PRIX32" plane_checksum:[%08"PRIX32,
+               checksum, plane_checksum[0]);
+
+        for (plane = 1; plane < 4 && frame->data[plane] && frame->linesize[plane]; plane++)
+            av_log(ctx, AV_LOG_INFO, " %08"PRIX32, plane_checksum[plane]);
+        av_log(ctx, AV_LOG_INFO, "] mean:[");
+        for (plane = 0; plane < 4 && frame->data[plane] && frame->linesize[plane]; plane++)
+            av_log(ctx, AV_LOG_INFO, "%"PRId64" ", (sum[plane] + pixelcount[plane]/2) / pixelcount[plane]);
+        av_log(ctx, AV_LOG_INFO, "\b] stdev:[");
+        for (plane = 0; plane < 4 && frame->data[plane] && frame->linesize[plane]; plane++)
+            av_log(ctx, AV_LOG_INFO, "%3.1f ",
+                   sqrt((sum2[plane] - sum[plane]*(double)sum[plane]/pixelcount[plane])/pixelcount[plane]));
+        av_log(ctx, AV_LOG_INFO, "\b]");
+    }
+    av_log(ctx, AV_LOG_INFO, "\n");
 
     for (i = 0; i < frame->nb_side_data; i++) {
         AVFrameSideData *sd = frame->side_data[i];
@@ -174,6 +316,20 @@
         case AV_FRAME_DATA_STEREO3D:
             dump_stereo3d(ctx, sd);
             break;
+        case AV_FRAME_DATA_S12M_TIMECODE: {
+            uint32_t *tc = (uint32_t*)sd->data;
+            int m = FFMIN(tc[0],3);
+            if (sd->size != 16) {
+                av_log(ctx, AV_LOG_ERROR, "invalid data");
+                break;
+            }
+            for (int j = 1; j <= m; j++) {
+                char tcbuf[AV_TIMECODE_STR_SIZE];
+                av_timecode_make_smpte_tc_string(tcbuf, tc[j], 0);
+                av_log(ctx, AV_LOG_INFO, "timecode - %s%s", tcbuf, j != m ? ", " : "");
+            }
+            break;
+        }
         case AV_FRAME_DATA_DISPLAYMATRIX:
             av_log(ctx, AV_LOG_INFO, "displaymatrix: rotation of %.2f degrees",
                    av_display_rotation_get((int32_t *)sd->data));
@@ -181,6 +337,21 @@
         case AV_FRAME_DATA_AFD:
             av_log(ctx, AV_LOG_INFO, "afd: value of %"PRIu8, sd->data[0]);
             break;
+        case AV_FRAME_DATA_REGIONS_OF_INTEREST:
+            dump_roi(ctx, sd);
+            break;
+        case AV_FRAME_DATA_MASTERING_DISPLAY_METADATA:
+            dump_mastering_display(ctx, sd);
+            break;
+        case AV_FRAME_DATA_CONTENT_LIGHT_LEVEL:
+            dump_content_light_metadata(ctx, sd);
+            break;
+        case AV_FRAME_DATA_GOP_TIMECODE: {
+            char tcbuf[AV_TIMECODE_STR_SIZE];
+            av_timecode_make_mpeg_tc_string(tcbuf, *(int64_t *)(sd->data));
+            av_log(ctx, AV_LOG_INFO, "GOP timecode - %s", tcbuf);
+            break;
+        }
         default:
             av_log(ctx, AV_LOG_WARNING, "unknown side data type %d (%d bytes)",
                    sd->type, sd->size);
@@ -190,6 +361,8 @@
         av_log(ctx, AV_LOG_INFO, "\n");
     }
 
+    dump_color_property(ctx, frame);
+
     return ff_filter_frame(inlink->dst->outputs[0], frame);
 }
 
@@ -240,4 +413,6 @@
     .description = NULL_IF_CONFIG_SMALL("Show textual information for each video frame."),
     .inputs      = avfilter_vf_showinfo_inputs,
     .outputs     = avfilter_vf_showinfo_outputs,
+    .priv_size   = sizeof(ShowInfoContext),
+    .priv_class  = &showinfo_class,
 };
diff --git a/libavfilter/vf_showpalette.c b/libavfilter/vf_showpalette.c
index d886ab8..5b0772b 100644
--- a/libavfilter/vf_showpalette.c
+++ b/libavfilter/vf_showpalette.c
@@ -96,7 +96,7 @@
     int ret;
     AVFrame *out;
     AVFilterContext *ctx = inlink->dst;
-    const ShowPaletteContext *s= ctx->priv;
+    const ShowPaletteContext *s = ctx->priv;
     AVFilterLink *outlink = ctx->outputs[0];
 
     out = ff_get_video_buffer(outlink, outlink->w, outlink->h);
@@ -136,5 +136,4 @@
     .inputs        = showpalette_inputs,
     .outputs       = showpalette_outputs,
     .priv_class    = &showpalette_class,
-    .flags         = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC,
 };
diff --git a/libavfilter/vf_shuffleframes.c b/libavfilter/vf_shuffleframes.c
index 8e59511..1f780c7 100644
--- a/libavfilter/vf_shuffleframes.c
+++ b/libavfilter/vf_shuffleframes.c
@@ -69,7 +69,7 @@
         }
 
         if (s->map[n] < -1 || s->map[n] >= nb_items) {
-            av_log(ctx, AV_LOG_ERROR, "Index out of range.\n");
+            av_log(ctx, AV_LOG_ERROR, "Index %d out of range: [-1, %d].\n", s->map[n], nb_items - 1);
             av_free(mapping);
             return AVERROR(EINVAL);
         }
diff --git a/libavfilter/vf_shuffleplanes.c b/libavfilter/vf_shuffleplanes.c
index 5d1302d..6c71889 100644
--- a/libavfilter/vf_shuffleplanes.c
+++ b/libavfilter/vf_shuffleplanes.c
@@ -40,41 +40,50 @@
     int copy;
 } ShufflePlanesContext;
 
+static int query_formats(AVFilterContext *ctx)
+{
+    AVFilterFormats *formats = NULL;
+    ShufflePlanesContext *s = ctx->priv;
+    int fmt, ret, i;
+
+    for (fmt = 0; av_pix_fmt_desc_get(fmt); fmt++) {
+        const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(fmt);
+        int planes = av_pix_fmt_count_planes(fmt);
+
+        if (!(desc->flags & AV_PIX_FMT_FLAG_PAL) &&
+            !(desc->flags & AV_PIX_FMT_FLAG_HWACCEL)) {
+            for (i = 0; i < 4; i++) {
+                if (s->map[i] >= planes)
+                    break;
+
+                if ((desc->log2_chroma_h || desc->log2_chroma_w) &&
+                    (i == 1 || i == 2) != (s->map[i] == 1 || s->map[i] == 2))
+                    break;
+            }
+
+            if (i != 4)
+                continue;
+            if ((ret = ff_add_format(&formats, fmt)) < 0) {
+                ff_formats_unref(&formats);
+                return ret;
+            }
+        }
+    }
+
+    return ff_set_common_formats(ctx, formats);
+}
+
 static av_cold int shuffleplanes_config_input(AVFilterLink *inlink)
 {
     AVFilterContext    *ctx = inlink->dst;
     ShufflePlanesContext *s = ctx->priv;
-    const AVPixFmtDescriptor *desc;
     int used[4] = { 0 };
     int i;
 
     s->copy   = 0;
     s->planes = av_pix_fmt_count_planes(inlink->format);
-    desc      = av_pix_fmt_desc_get(inlink->format);
 
     for (i = 0; i < s->planes; i++) {
-        if (s->map[i] >= s->planes) {
-            av_log(ctx, AV_LOG_ERROR,
-                   "Non-existing input plane #%d mapped to output plane #%d.\n",
-                   s->map[i], i);
-            return AVERROR(EINVAL);
-        }
-
-        if ((desc->log2_chroma_h || desc->log2_chroma_w) &&
-            (i == 1 || i == 2) != (s->map[i] == 1 || s->map[i] == 2)) {
-            av_log(ctx, AV_LOG_ERROR,
-                   "Cannot map between a subsampled chroma plane and a luma "
-                   "or alpha plane.\n");
-            return AVERROR(EINVAL);
-        }
-
-        if ((desc->flags & AV_PIX_FMT_FLAG_PAL ||
-             desc->flags & FF_PSEUDOPAL) &&
-            (i == 1) != (s->map[i] == 1)) {
-            av_log(ctx, AV_LOG_ERROR,
-                   "Cannot map between a palette plane and a data plane.\n");
-            return AVERROR(EINVAL);
-        }
         if (used[s->map[i]])
             s->copy = 1;
         used[s->map[i]]++;
@@ -127,10 +136,10 @@
 #define OFFSET(x) offsetof(ShufflePlanesContext, x)
 #define FLAGS (AV_OPT_FLAG_FILTERING_PARAM | AV_OPT_FLAG_VIDEO_PARAM)
 static const AVOption shuffleplanes_options[] = {
-    { "map0", "Index of the input plane to be used as the first output plane ",  OFFSET(map[0]), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 4, FLAGS },
-    { "map1", "Index of the input plane to be used as the second output plane ", OFFSET(map[1]), AV_OPT_TYPE_INT, { .i64 = 1 }, 0, 4, FLAGS },
-    { "map2", "Index of the input plane to be used as the third output plane ",  OFFSET(map[2]), AV_OPT_TYPE_INT, { .i64 = 2 }, 0, 4, FLAGS },
-    { "map3", "Index of the input plane to be used as the fourth output plane ", OFFSET(map[3]), AV_OPT_TYPE_INT, { .i64 = 3 }, 0, 4, FLAGS },
+    { "map0", "Index of the input plane to be used as the first output plane ",  OFFSET(map[0]), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 3, FLAGS },
+    { "map1", "Index of the input plane to be used as the second output plane ", OFFSET(map[1]), AV_OPT_TYPE_INT, { .i64 = 1 }, 0, 3, FLAGS },
+    { "map2", "Index of the input plane to be used as the third output plane ",  OFFSET(map[2]), AV_OPT_TYPE_INT, { .i64 = 2 }, 0, 3, FLAGS },
+    { "map3", "Index of the input plane to be used as the fourth output plane ", OFFSET(map[3]), AV_OPT_TYPE_INT, { .i64 = 3 }, 0, 3, FLAGS },
     { NULL },
 };
 
@@ -142,7 +151,6 @@
         .type             = AVMEDIA_TYPE_VIDEO,
         .config_props     = shuffleplanes_config_input,
         .filter_frame     = shuffleplanes_filter_frame,
-        .get_video_buffer = ff_null_get_video_buffer,
     },
     { NULL },
 };
@@ -160,6 +168,7 @@
     .description  = NULL_IF_CONFIG_SMALL("Shuffle video planes."),
     .priv_size    = sizeof(ShufflePlanesContext),
     .priv_class   = &shuffleplanes_class,
+    .query_formats = query_formats,
     .inputs       = shuffleplanes_inputs,
     .outputs      = shuffleplanes_outputs,
     .flags        = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC,
diff --git a/libavfilter/vf_signalstats.c b/libavfilter/vf_signalstats.c
index 298881b..abe813d 100644
--- a/libavfilter/vf_signalstats.c
+++ b/libavfilter/vf_signalstats.c
@@ -491,7 +491,7 @@
             const int yuvu = p_u[i];
             const int yuvv = p_v[i];
             p_sat[i] = hypot(yuvu - 128, yuvv - 128); // int or round?
-            ((int16_t*)p_hue)[i] = floor((180 / M_PI) * atan2f(yuvu-128, yuvv-128) + 180);
+            ((int16_t*)p_hue)[i] = fmod(floor((180 / M_PI) * atan2f(yuvu-128, yuvv-128) + 180), 360.);
         }
         p_u   += lsz_u;
         p_v   += lsz_v;
@@ -530,7 +530,7 @@
             const int yuvu = p_u[i];
             const int yuvv = p_v[i];
             p_sat[i] = hypot(yuvu - mid, yuvv - mid); // int or round?
-            ((int16_t*)p_hue)[i] = floor((180 / M_PI) * atan2f(yuvu-mid, yuvv-mid) + 180);
+            ((int16_t*)p_hue)[i] = fmod(floor((180 / M_PI) * atan2f(yuvu-mid, yuvv-mid) + 180), 360.);
         }
         p_u   += lsz_u;
         p_v   += lsz_v;
@@ -830,7 +830,7 @@
 
             masky |= yuv;
             histy[yuv]++;
-            dify += abs(yuv - AV_RN16(prev->data[0] + pw + i * 2));
+            dify += abs(yuv - (int)AV_RN16(prev->data[0] + pw + i * 2));
         }
         w  += in->linesize[0];
         pw += prev->linesize[0];
@@ -848,9 +848,9 @@
             masku |= yuvu;
             maskv |= yuvv;
             histu[yuvu]++;
-            difu += abs(yuvu - AV_RN16(prev->data[1] + cpw + i * 2));
+            difu += abs(yuvu - (int)AV_RN16(prev->data[1] + cpw + i * 2));
             histv[yuvv]++;
-            difv += abs(yuvv - AV_RN16(prev->data[2] + cpw + i * 2));
+            difv += abs(yuvv - (int)AV_RN16(prev->data[2] + cpw + i * 2));
 
             histsat[p_sat[i]]++;
             histhue[((int16_t*)p_hue)[i]]++;
diff --git a/libavfilter/vf_sr.c b/libavfilter/vf_sr.c
index 6423d2e..f000eda 100644
--- a/libavfilter/vf_sr.c
+++ b/libavfilter/vf_sr.c
@@ -29,6 +29,7 @@
 #include "formats.h"
 #include "internal.h"
 #include "libavutil/opt.h"
+#include "libavutil/pixdesc.h"
 #include "libavformat/avio.h"
 #include "libswscale/swscale.h"
 #include "dnn_interface.h"
@@ -40,7 +41,8 @@
     DNNBackendType backend_type;
     DNNModule *dnn_module;
     DNNModel *model;
-    DNNData input, output;
+    DNNData input;
+    DNNData output;
     int scale_factor;
     struct SwsContext *sws_contexts[3];
     int sws_slice_h, sws_input_linesize, sws_output_linesize;
@@ -49,7 +51,7 @@
 #define OFFSET(x) offsetof(SRContext, x)
 #define FLAGS AV_OPT_FLAG_FILTERING_PARAM | AV_OPT_FLAG_VIDEO_PARAM
 static const AVOption sr_options[] = {
-    { "dnn_backend", "DNN backend used for model execution", OFFSET(backend_type), AV_OPT_TYPE_FLAGS, { .i64 = 0 }, 0, 1, FLAGS, "backend" },
+    { "dnn_backend", "DNN backend used for model execution", OFFSET(backend_type), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, FLAGS, "backend" },
     { "native", "native backend flag", 0, AV_OPT_TYPE_CONST, { .i64 = 0 }, 0, 0, FLAGS, "backend" },
 #if (CONFIG_LIBTENSORFLOW == 1)
     { "tensorflow", "tensorflow backend flag", 0, AV_OPT_TYPE_CONST, { .i64 = 1 }, 0, 0, FLAGS, "backend" },
@@ -70,23 +72,22 @@
         av_log(context, AV_LOG_ERROR, "could not create DNN module for requested backend\n");
         return AVERROR(ENOMEM);
     }
+
     if (!sr_context->model_filename){
         av_log(context, AV_LOG_ERROR, "model file for network was not specified\n");
         return AVERROR(EIO);
     }
-    else{
-        if (!sr_context->dnn_module->load_model) {
-            av_log(context, AV_LOG_ERROR, "load_model for network was not specified\n");
-            return AVERROR(EIO);
-        } else {
-            sr_context->model = (sr_context->dnn_module->load_model)(sr_context->model_filename);
-        }
+    if (!sr_context->dnn_module->load_model) {
+        av_log(context, AV_LOG_ERROR, "load_model for network was not specified\n");
+        return AVERROR(EIO);
     }
+    sr_context->model = (sr_context->dnn_module->load_model)(sr_context->model_filename);
     if (!sr_context->model){
         av_log(context, AV_LOG_ERROR, "could not load DNN model\n");
         return AVERROR(EIO);
     }
 
+    sr_context->input.dt = DNN_FLOAT;
     sr_context->sws_contexts[0] = NULL;
     sr_context->sws_contexts[1] = NULL;
     sr_context->sws_contexts[2] = NULL;
@@ -117,98 +118,82 @@
     AVFilterLink *outlink = context->outputs[0];
     DNNReturnType result;
     int sws_src_h, sws_src_w, sws_dst_h, sws_dst_w;
+    const char *model_output_name = "y";
 
     sr_context->input.width = inlink->w * sr_context->scale_factor;
     sr_context->input.height = inlink->h * sr_context->scale_factor;
     sr_context->input.channels = 1;
 
-    result = (sr_context->model->set_input_output)(sr_context->model->model, &sr_context->input, &sr_context->output);
+    result = (sr_context->model->set_input_output)(sr_context->model->model, &sr_context->input, "x", &model_output_name, 1);
     if (result != DNN_SUCCESS){
         av_log(context, AV_LOG_ERROR, "could not set input and output for the model\n");
         return AVERROR(EIO);
     }
-    else{
-        if (sr_context->input.height != sr_context->output.height || sr_context->input.width != sr_context->output.width){
-            sr_context->input.width = inlink->w;
-            sr_context->input.height = inlink->h;
-            result = (sr_context->model->set_input_output)(sr_context->model->model, &sr_context->input, &sr_context->output);
-            if (result != DNN_SUCCESS){
-                av_log(context, AV_LOG_ERROR, "could not set input and output for the model\n");
-                return AVERROR(EIO);
-            }
-            sr_context->scale_factor = 0;
+
+    result = (sr_context->dnn_module->execute_model)(sr_context->model, &sr_context->output, 1);
+    if (result != DNN_SUCCESS){
+        av_log(context, AV_LOG_ERROR, "failed to execute loaded model\n");
+        return AVERROR(EIO);
+    }
+
+    if (sr_context->input.height != sr_context->output.height || sr_context->input.width != sr_context->output.width){
+        sr_context->input.width = inlink->w;
+        sr_context->input.height = inlink->h;
+        result = (sr_context->model->set_input_output)(sr_context->model->model, &sr_context->input, "x", &model_output_name, 1);
+        if (result != DNN_SUCCESS){
+            av_log(context, AV_LOG_ERROR, "could not set input and output for the model\n");
+            return AVERROR(EIO);
         }
-        outlink->h = sr_context->output.height;
-        outlink->w = sr_context->output.width;
-        sr_context->sws_contexts[1] = sws_getContext(sr_context->input.width, sr_context->input.height, AV_PIX_FMT_GRAY8,
-                                                     sr_context->input.width, sr_context->input.height, AV_PIX_FMT_GRAYF32,
-                                                     0, NULL, NULL, NULL);
-        sr_context->sws_input_linesize = sr_context->input.width << 2;
-        sr_context->sws_contexts[2] = sws_getContext(sr_context->output.width, sr_context->output.height, AV_PIX_FMT_GRAYF32,
-                                                     sr_context->output.width, sr_context->output.height, AV_PIX_FMT_GRAY8,
-                                                     0, NULL, NULL, NULL);
-        sr_context->sws_output_linesize = sr_context->output.width << 2;
-        if (!sr_context->sws_contexts[1] || !sr_context->sws_contexts[2]){
-            av_log(context, AV_LOG_ERROR, "could not create SwsContext for conversions\n");
+        result = (sr_context->dnn_module->execute_model)(sr_context->model, &sr_context->output, 1);
+        if (result != DNN_SUCCESS){
+            av_log(context, AV_LOG_ERROR, "failed to execute loaded model\n");
+            return AVERROR(EIO);
+        }
+        sr_context->scale_factor = 0;
+    }
+    outlink->h = sr_context->output.height;
+    outlink->w = sr_context->output.width;
+    sr_context->sws_contexts[1] = sws_getContext(sr_context->input.width, sr_context->input.height, AV_PIX_FMT_GRAY8,
+                                                 sr_context->input.width, sr_context->input.height, AV_PIX_FMT_GRAYF32,
+                                                 0, NULL, NULL, NULL);
+    sr_context->sws_input_linesize = sr_context->input.width << 2;
+    sr_context->sws_contexts[2] = sws_getContext(sr_context->output.width, sr_context->output.height, AV_PIX_FMT_GRAYF32,
+                                                 sr_context->output.width, sr_context->output.height, AV_PIX_FMT_GRAY8,
+                                                 0, NULL, NULL, NULL);
+    sr_context->sws_output_linesize = sr_context->output.width << 2;
+    if (!sr_context->sws_contexts[1] || !sr_context->sws_contexts[2]){
+        av_log(context, AV_LOG_ERROR, "could not create SwsContext for conversions\n");
+        return AVERROR(ENOMEM);
+    }
+    if (sr_context->scale_factor){
+        sr_context->sws_contexts[0] = sws_getContext(inlink->w, inlink->h, inlink->format,
+                                                     outlink->w, outlink->h, outlink->format,
+                                                     SWS_BICUBIC, NULL, NULL, NULL);
+        if (!sr_context->sws_contexts[0]){
+            av_log(context, AV_LOG_ERROR, "could not create SwsContext for scaling\n");
             return AVERROR(ENOMEM);
         }
-        if (sr_context->scale_factor){
-            sr_context->sws_contexts[0] = sws_getContext(inlink->w, inlink->h, inlink->format,
-                                                         outlink->w, outlink->h, outlink->format,
+        sr_context->sws_slice_h = inlink->h;
+    } else {
+        if (inlink->format != AV_PIX_FMT_GRAY8){
+            const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(inlink->format);
+            sws_src_h = AV_CEIL_RSHIFT(sr_context->input.height, desc->log2_chroma_h);
+            sws_src_w = AV_CEIL_RSHIFT(sr_context->input.width, desc->log2_chroma_w);
+            sws_dst_h = AV_CEIL_RSHIFT(sr_context->output.height, desc->log2_chroma_h);
+            sws_dst_w = AV_CEIL_RSHIFT(sr_context->output.width, desc->log2_chroma_w);
+
+            sr_context->sws_contexts[0] = sws_getContext(sws_src_w, sws_src_h, AV_PIX_FMT_GRAY8,
+                                                         sws_dst_w, sws_dst_h, AV_PIX_FMT_GRAY8,
                                                          SWS_BICUBIC, NULL, NULL, NULL);
             if (!sr_context->sws_contexts[0]){
                 av_log(context, AV_LOG_ERROR, "could not create SwsContext for scaling\n");
                 return AVERROR(ENOMEM);
             }
-            sr_context->sws_slice_h = inlink->h;
+            sr_context->sws_slice_h = sws_src_h;
         }
-        else{
-            if (inlink->format != AV_PIX_FMT_GRAY8){
-                sws_src_h = sr_context->input.height;
-                sws_src_w = sr_context->input.width;
-                sws_dst_h = sr_context->output.height;
-                sws_dst_w = sr_context->output.width;
-
-                switch (inlink->format){
-                case AV_PIX_FMT_YUV420P:
-                    sws_src_h = AV_CEIL_RSHIFT(sws_src_h, 1);
-                    sws_src_w = AV_CEIL_RSHIFT(sws_src_w, 1);
-                    sws_dst_h = AV_CEIL_RSHIFT(sws_dst_h, 1);
-                    sws_dst_w = AV_CEIL_RSHIFT(sws_dst_w, 1);
-                    break;
-                case AV_PIX_FMT_YUV422P:
-                    sws_src_w = AV_CEIL_RSHIFT(sws_src_w, 1);
-                    sws_dst_w = AV_CEIL_RSHIFT(sws_dst_w, 1);
-                    break;
-                case AV_PIX_FMT_YUV444P:
-                    break;
-                case AV_PIX_FMT_YUV410P:
-                    sws_src_h = AV_CEIL_RSHIFT(sws_src_h, 2);
-                    sws_src_w = AV_CEIL_RSHIFT(sws_src_w, 2);
-                    sws_dst_h = AV_CEIL_RSHIFT(sws_dst_h, 2);
-                    sws_dst_w = AV_CEIL_RSHIFT(sws_dst_w, 2);
-                    break;
-                case AV_PIX_FMT_YUV411P:
-                    sws_src_w = AV_CEIL_RSHIFT(sws_src_w, 2);
-                    sws_dst_w = AV_CEIL_RSHIFT(sws_dst_w, 2);
-                    break;
-                default:
-                    av_log(context, AV_LOG_ERROR, "could not create SwsContext for scaling for given input pixel format");
-                    return AVERROR(EIO);
-                }
-                sr_context->sws_contexts[0] = sws_getContext(sws_src_w, sws_src_h, AV_PIX_FMT_GRAY8,
-                                                             sws_dst_w, sws_dst_h, AV_PIX_FMT_GRAY8,
-                                                             SWS_BICUBIC, NULL, NULL, NULL);
-                if (!sr_context->sws_contexts[0]){
-                    av_log(context, AV_LOG_ERROR, "could not create SwsContext for scaling\n");
-                    return AVERROR(ENOMEM);
-                }
-                sr_context->sws_slice_h = sws_src_h;
-            }
-        }
-
-        return 0;
     }
+
+    return 0;
 }
 
 static int filter_frame(AVFilterLink *inlink, AVFrame *in)
@@ -234,8 +219,7 @@
         sws_scale(sr_context->sws_contexts[1], (const uint8_t **)out->data, out->linesize,
                   0, out->height, (uint8_t * const*)(&sr_context->input.data),
                   (const int [4]){sr_context->sws_input_linesize, 0, 0, 0});
-    }
-    else{
+    } else {
         if (sr_context->sws_contexts[0]){
             sws_scale(sr_context->sws_contexts[0], (const uint8_t **)(in->data + 1), in->linesize + 1,
                       0, sr_context->sws_slice_h, out->data + 1, out->linesize + 1);
@@ -249,7 +233,7 @@
     }
     av_frame_free(&in);
 
-    dnn_result = (sr_context->dnn_module->execute_model)(sr_context->model);
+    dnn_result = (sr_context->dnn_module->execute_model)(sr_context->model, &sr_context->output, 1);
     if (dnn_result != DNN_SUCCESS){
         av_log(context, AV_LOG_ERROR, "failed to execute loaded model\n");
         return AVERROR(EIO);
@@ -273,9 +257,7 @@
     }
 
     for (i = 0; i < 3; ++i){
-        if (sr_context->sws_contexts[i]){
-            sws_freeContext(sr_context->sws_contexts[i]);
-        }
+        sws_freeContext(sr_context->sws_contexts[i]);
     }
 }
 
@@ -307,6 +289,4 @@
     .inputs        = sr_inputs,
     .outputs       = sr_outputs,
     .priv_class    = &sr_class,
-    .flags         = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC | AVFILTER_FLAG_SLICE_THREADS,
 };
-
diff --git a/libavfilter/vf_ssim.c b/libavfilter/vf_ssim.c
index 4c957f4..a32fada 100644
--- a/libavfilter/vf_ssim.c
+++ b/libavfilter/vf_ssim.c
@@ -55,13 +55,13 @@
     uint64_t nb_frames;
     double ssim[4], ssim_total;
     char comps[4];
-    float coefs[4];
+    double coefs[4];
     uint8_t rgba_map[4];
     int planewidth[4];
     int planeheight[4];
     int *temp;
     int is_rgb;
-    float (*ssim_plane)(SSIMDSPContext *dsp,
+    double (*ssim_plane)(SSIMDSPContext *dsp,
                         uint8_t *main, int main_stride,
                         uint8_t *ref, int ref_stride,
                         int width, int height, void *temp,
@@ -206,9 +206,9 @@
     return ssim;
 }
 
-static float ssim_endn_8bit(const int (*sum0)[4], const int (*sum1)[4], int width)
+static double ssim_endn_8bit(const int (*sum0)[4], const int (*sum1)[4], int width)
 {
-    float ssim = 0.0;
+    double ssim = 0.0;
     int i;
 
     for (i = 0; i < width; i++)
@@ -221,14 +221,14 @@
 
 #define SUM_LEN(w) (((w) >> 2) + 3)
 
-static float ssim_plane_16bit(SSIMDSPContext *dsp,
+static double ssim_plane_16bit(SSIMDSPContext *dsp,
                               uint8_t *main, int main_stride,
                               uint8_t *ref, int ref_stride,
                               int width, int height, void *temp,
                               int max)
 {
     int z = 0, y;
-    float ssim = 0.0;
+    double ssim = 0.0;
     int64_t (*sum0)[4] = temp;
     int64_t (*sum1)[4] = sum0 + SUM_LEN(width);
 
@@ -249,14 +249,14 @@
     return ssim / ((height - 1) * (width - 1));
 }
 
-static float ssim_plane(SSIMDSPContext *dsp,
+static double ssim_plane(SSIMDSPContext *dsp,
                         uint8_t *main, int main_stride,
                         uint8_t *ref, int ref_stride,
                         int width, int height, void *temp,
                         int max)
 {
     int z = 0, y;
-    float ssim = 0.0;
+    double ssim = 0.0;
     int (*sum0)[4] = temp;
     int (*sum1)[4] = sum0 + SUM_LEN(width);
 
@@ -279,7 +279,7 @@
 
 static double ssim_db(double ssim, double weight)
 {
-    return 10 * log10(weight / (weight - ssim));
+    return (fabs(weight - ssim) > 1e-9) ? 10.0 * log10(weight / (weight - ssim)) : INFINITY;
 }
 
 static int do_ssim(FFFrameSync *fs)
@@ -288,7 +288,7 @@
     SSIMContext *s = ctx->priv;
     AVFrame *master, *ref;
     AVDictionary **metadata;
-    float c[4], ssimv = 0.0;
+    double c[4] = { 0 }, ssimv = 0.0;
     int ret, i;
 
     ret = ff_framesync_dualinput_get(fs, &master, &ref);
@@ -443,6 +443,14 @@
     if ((ret = ff_framesync_configure(&s->fs)) < 0)
         return ret;
 
+    outlink->time_base = s->fs.time_base;
+
+    if (av_cmp_q(mainlink->time_base, outlink->time_base) ||
+        av_cmp_q(ctx->inputs[1]->time_base, outlink->time_base))
+        av_log(ctx, AV_LOG_WARNING, "not matching timebases found between first input: %d/%d and second input %d/%d, results may be incorrect!\n",
+               mainlink->time_base.num, mainlink->time_base.den,
+               ctx->inputs[1]->time_base.num, ctx->inputs[1]->time_base.den);
+
     return 0;
 }
 
diff --git a/libavfilter/vf_stack.c b/libavfilter/vf_stack.c
index b2b8c68..35b7177 100644
--- a/libavfilter/vf_stack.c
+++ b/libavfilter/vf_stack.c
@@ -21,22 +21,39 @@
 #include "libavutil/avstring.h"
 #include "libavutil/imgutils.h"
 #include "libavutil/opt.h"
+#include "libavutil/parseutils.h"
 #include "libavutil/pixdesc.h"
 
 #include "avfilter.h"
+#include "drawutils.h"
 #include "formats.h"
 #include "internal.h"
 #include "framesync.h"
 #include "video.h"
 
+typedef struct StackItem {
+    int x[4], y[4];
+    int linesize[4];
+    int height[4];
+} StackItem;
+
 typedef struct StackContext {
     const AVClass *class;
     const AVPixFmtDescriptor *desc;
     int nb_inputs;
+    char *layout;
     int shortest;
     int is_vertical;
+    int is_horizontal;
     int nb_planes;
+    uint8_t fillcolor[4];
+    char *fillcolor_str;
+    int fillcolor_enable;
 
+    FFDrawContext draw;
+    FFDrawColor color;
+
+    StackItem *items;
     AVFrame **frames;
     FFFrameSync fs;
 } StackContext;
@@ -44,8 +61,13 @@
 static int query_formats(AVFilterContext *ctx)
 {
     AVFilterFormats *pix_fmts = NULL;
+    StackContext *s = ctx->priv;
     int fmt, ret;
 
+    if (s->fillcolor_enable) {
+        return ff_set_common_formats(ctx, ff_draw_supported_pixel_formats(0));
+    }
+
     for (fmt = 0; av_pix_fmt_desc_get(fmt); fmt++) {
         const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(fmt);
         if (!(desc->flags & AV_PIX_FMT_FLAG_PAL ||
@@ -66,10 +88,36 @@
     if (!strcmp(ctx->filter->name, "vstack"))
         s->is_vertical = 1;
 
+    if (!strcmp(ctx->filter->name, "hstack"))
+        s->is_horizontal = 1;
+
     s->frames = av_calloc(s->nb_inputs, sizeof(*s->frames));
     if (!s->frames)
         return AVERROR(ENOMEM);
 
+    s->items = av_calloc(s->nb_inputs, sizeof(*s->items));
+    if (!s->items)
+        return AVERROR(ENOMEM);
+
+    if (!strcmp(ctx->filter->name, "xstack")) {
+        if (strcmp(s->fillcolor_str, "none") &&
+            av_parse_color(s->fillcolor, s->fillcolor_str, -1, ctx) >= 0) {
+            s->fillcolor_enable = 1;
+        } else {
+            s->fillcolor_enable = 0;
+        }
+        if (!s->layout) {
+            if (s->nb_inputs == 2) {
+                s->layout = av_strdup("0_0|w0_0");
+                if (!s->layout)
+                    return AVERROR(ENOMEM);
+            } else {
+                av_log(ctx, AV_LOG_ERROR, "No layout specified.\n");
+                return AVERROR(EINVAL);
+            }
+        }
+    }
+
     for (i = 0; i < s->nb_inputs; i++) {
         AVFilterPad pad = { 0 };
 
@@ -87,6 +135,29 @@
     return 0;
 }
 
+static int process_slice(AVFilterContext *ctx, void *arg, int job, int nb_jobs)
+{
+    StackContext *s = ctx->priv;
+    AVFrame *out = arg;
+    AVFrame **in = s->frames;
+    const int start = (s->nb_inputs *  job   ) / nb_jobs;
+    const int end   = (s->nb_inputs * (job+1)) / nb_jobs;
+
+    for (int i = start; i < end; i++) {
+        StackItem *item = &s->items[i];
+
+        for (int p = 0; p < s->nb_planes; p++) {
+            av_image_copy_plane(out->data[p] + out->linesize[p] * item->y[p] + item->x[p],
+                                out->linesize[p],
+                                in[i]->data[p],
+                                in[i]->linesize[p],
+                                item->linesize[p], item->height[p]);
+        }
+    }
+
+    return 0;
+}
+
 static int process_frame(FFFrameSync *fs)
 {
     AVFilterContext *ctx = fs->parent;
@@ -94,7 +165,7 @@
     StackContext *s = fs->opaque;
     AVFrame **in = s->frames;
     AVFrame *out;
-    int i, p, ret, offset[4] = { 0 };
+    int i, ret;
 
     for (i = 0; i < s->nb_inputs; i++) {
         if ((ret = ff_framesync_get_frame(&s->fs, i, &in[i], 0)) < 0)
@@ -107,37 +178,11 @@
     out->pts = av_rescale_q(s->fs.pts, s->fs.time_base, outlink->time_base);
     out->sample_aspect_ratio = outlink->sample_aspect_ratio;
 
-    for (i = 0; i < s->nb_inputs; i++) {
-        AVFilterLink *inlink = ctx->inputs[i];
-        int linesize[4];
-        int height[4];
+    if (s->fillcolor_enable)
+        ff_fill_rectangle(&s->draw, &s->color, out->data, out->linesize,
+                          0, 0, outlink->w, outlink->h);
 
-        if ((ret = av_image_fill_linesizes(linesize, inlink->format, inlink->w)) < 0) {
-            av_frame_free(&out);
-            return ret;
-        }
-
-        height[1] = height[2] = AV_CEIL_RSHIFT(inlink->h, s->desc->log2_chroma_h);
-        height[0] = height[3] = inlink->h;
-
-        for (p = 0; p < s->nb_planes; p++) {
-            if (s->is_vertical) {
-                av_image_copy_plane(out->data[p] + offset[p] * out->linesize[p],
-                                    out->linesize[p],
-                                    in[i]->data[p],
-                                    in[i]->linesize[p],
-                                    linesize[p], height[p]);
-                offset[p] += height[p];
-            } else {
-                av_image_copy_plane(out->data[p] + offset[p],
-                                    out->linesize[p],
-                                    in[i]->data[p],
-                                    in[i]->linesize[p],
-                                    linesize[p], height[p]);
-                offset[p] += linesize[p];
-            }
-        }
-    }
+    ctx->internal->execute(ctx, process_slice, out, NULL, FFMIN(s->nb_inputs, ff_filter_get_nb_threads(ctx)));
 
     return ff_filter_frame(outlink, out);
 }
@@ -146,7 +191,6 @@
 {
     AVFilterContext *ctx = outlink->src;
     StackContext *s = ctx->priv;
-    AVRational time_base = ctx->inputs[0]->time_base;
     AVRational frame_rate = ctx->inputs[0]->frame_rate;
     AVRational sar = ctx->inputs[0]->sample_aspect_ratio;
     int height = ctx->inputs[0]->h;
@@ -154,35 +198,157 @@
     FFFrameSyncIn *in;
     int i, ret;
 
+    s->desc = av_pix_fmt_desc_get(outlink->format);
+    if (!s->desc)
+        return AVERROR_BUG;
+
     if (s->is_vertical) {
-        for (i = 1; i < s->nb_inputs; i++) {
+        for (i = 0; i < s->nb_inputs; i++) {
+            AVFilterLink *inlink = ctx->inputs[i];
+            StackItem *item = &s->items[i];
+
             if (ctx->inputs[i]->w != width) {
                 av_log(ctx, AV_LOG_ERROR, "Input %d width %d does not match input %d width %d.\n", i, ctx->inputs[i]->w, 0, width);
                 return AVERROR(EINVAL);
             }
-            height += ctx->inputs[i]->h;
+
+            if ((ret = av_image_fill_linesizes(item->linesize, inlink->format, inlink->w)) < 0) {
+                return ret;
+            }
+
+            item->height[1] = item->height[2] = AV_CEIL_RSHIFT(inlink->h, s->desc->log2_chroma_h);
+            item->height[0] = item->height[3] = inlink->h;
+
+            if (i) {
+                item->y[1] = item->y[2] = AV_CEIL_RSHIFT(height, s->desc->log2_chroma_h);
+                item->y[0] = item->y[3] = height;
+
+                height += ctx->inputs[i]->h;
+            }
         }
-    } else {
-        for (i = 1; i < s->nb_inputs; i++) {
+    } else if (s->is_horizontal) {
+        for (i = 0; i < s->nb_inputs; i++) {
+            AVFilterLink *inlink = ctx->inputs[i];
+            StackItem *item = &s->items[i];
+
             if (ctx->inputs[i]->h != height) {
                 av_log(ctx, AV_LOG_ERROR, "Input %d height %d does not match input %d height %d.\n", i, ctx->inputs[i]->h, 0, height);
                 return AVERROR(EINVAL);
             }
-            width += ctx->inputs[i]->w;
+
+            if ((ret = av_image_fill_linesizes(item->linesize, inlink->format, inlink->w)) < 0) {
+                return ret;
+            }
+
+            item->height[1] = item->height[2] = AV_CEIL_RSHIFT(inlink->h, s->desc->log2_chroma_h);
+            item->height[0] = item->height[3] = inlink->h;
+
+            if (i) {
+                if ((ret = av_image_fill_linesizes(item->x, inlink->format, width)) < 0) {
+                    return ret;
+                }
+
+                width += ctx->inputs[i]->w;
+            }
+        }
+    } else {
+        char *arg, *p = s->layout, *saveptr = NULL;
+        char *arg2, *p2, *saveptr2 = NULL;
+        char *arg3, *p3, *saveptr3 = NULL;
+        int inw, inh, size;
+
+        if (s->fillcolor_enable) {
+            ff_draw_init(&s->draw, ctx->inputs[0]->format, 0);
+            ff_draw_color(&s->draw, &s->color, s->fillcolor);
+        }
+
+        for (i = 0; i < s->nb_inputs; i++) {
+            AVFilterLink *inlink = ctx->inputs[i];
+            StackItem *item = &s->items[i];
+
+            if (!(arg = av_strtok(p, "|", &saveptr)))
+                return AVERROR(EINVAL);
+
+            p = NULL;
+
+            if ((ret = av_image_fill_linesizes(item->linesize, inlink->format, inlink->w)) < 0) {
+                return ret;
+            }
+
+            item->height[1] = item->height[2] = AV_CEIL_RSHIFT(inlink->h, s->desc->log2_chroma_h);
+            item->height[0] = item->height[3] = inlink->h;
+
+            p2 = arg;
+            inw = inh = 0;
+
+            for (int j = 0; j < 2; j++) {
+                if (!(arg2 = av_strtok(p2, "_", &saveptr2)))
+                    return AVERROR(EINVAL);
+
+                p2 = NULL;
+                p3 = arg2;
+                while ((arg3 = av_strtok(p3, "+", &saveptr3))) {
+                    p3 = NULL;
+                    if (sscanf(arg3, "w%d", &size) == 1) {
+                        if (size == i || size < 0 || size >= s->nb_inputs)
+                            return AVERROR(EINVAL);
+
+                        if (!j)
+                            inw += ctx->inputs[size]->w;
+                        else
+                            inh += ctx->inputs[size]->w;
+                    } else if (sscanf(arg3, "h%d", &size) == 1) {
+                        if (size == i || size < 0 || size >= s->nb_inputs)
+                            return AVERROR(EINVAL);
+
+                        if (!j)
+                            inw += ctx->inputs[size]->h;
+                        else
+                            inh += ctx->inputs[size]->h;
+                    } else if (sscanf(arg3, "%d", &size) == 1) {
+                        if (size < 0)
+                            return AVERROR(EINVAL);
+
+                        if (!j)
+                            inw += size;
+                        else
+                            inh += size;
+                    } else {
+                        return AVERROR(EINVAL);
+                    }
+                }
+            }
+
+            if ((ret = av_image_fill_linesizes(item->x, inlink->format, inw)) < 0) {
+                return ret;
+            }
+
+            item->y[1] = item->y[2] = AV_CEIL_RSHIFT(inh, s->desc->log2_chroma_h);
+            item->y[0] = item->y[3] = inh;
+
+            width  = FFMAX(width,  inlink->w + inw);
+            height = FFMAX(height, inlink->h + inh);
         }
     }
 
-    s->desc = av_pix_fmt_desc_get(outlink->format);
-    if (!s->desc)
-        return AVERROR_BUG;
     s->nb_planes = av_pix_fmt_count_planes(outlink->format);
 
     outlink->w          = width;
     outlink->h          = height;
-    outlink->time_base  = time_base;
     outlink->frame_rate = frame_rate;
     outlink->sample_aspect_ratio = sar;
 
+    for (i = 1; i < s->nb_inputs; i++) {
+        AVFilterLink *inlink = ctx->inputs[i];
+        if (outlink->frame_rate.num != inlink->frame_rate.num ||
+            outlink->frame_rate.den != inlink->frame_rate.den) {
+            av_log(ctx, AV_LOG_VERBOSE,
+                    "Video inputs have different frame rates, output will be VFR\n");
+            outlink->frame_rate = av_make_q(1, 0);
+            break;
+        }
+    }
+
     if ((ret = ff_framesync_init(&s->fs, ctx, s->nb_inputs)) < 0)
         return ret;
 
@@ -199,7 +365,10 @@
         in[i].after  = s->shortest ? EXT_STOP : EXT_INFINITY;
     }
 
-    return ff_framesync_configure(&s->fs);
+    ret = ff_framesync_configure(&s->fs);
+    outlink->time_base = s->fs.time_base;
+
+    return ret;
 }
 
 static av_cold void uninit(AVFilterContext *ctx)
@@ -209,6 +378,7 @@
 
     ff_framesync_uninit(&s->fs);
     av_freep(&s->frames);
+    av_freep(&s->items);
 
     for (i = 0; i < ctx->nb_inputs; i++)
         av_freep(&ctx->input_pads[i].name);
@@ -252,7 +422,7 @@
     .init          = init,
     .uninit        = uninit,
     .activate      = activate,
-    .flags         = AVFILTER_FLAG_DYNAMIC_INPUTS,
+    .flags         = AVFILTER_FLAG_DYNAMIC_INPUTS | AVFILTER_FLAG_SLICE_THREADS,
 };
 
 #endif /* CONFIG_HSTACK_FILTER */
@@ -272,7 +442,34 @@
     .init          = init,
     .uninit        = uninit,
     .activate      = activate,
-    .flags         = AVFILTER_FLAG_DYNAMIC_INPUTS,
+    .flags         = AVFILTER_FLAG_DYNAMIC_INPUTS | AVFILTER_FLAG_SLICE_THREADS,
 };
 
 #endif /* CONFIG_VSTACK_FILTER */
+
+#if CONFIG_XSTACK_FILTER
+
+static const AVOption xstack_options[] = {
+    { "inputs", "set number of inputs", OFFSET(nb_inputs), AV_OPT_TYPE_INT, {.i64=2}, 2, INT_MAX, .flags = FLAGS },
+    { "layout", "set custom layout", OFFSET(layout), AV_OPT_TYPE_STRING, {.str=NULL}, 0, 0, .flags = FLAGS },
+    { "shortest", "force termination when the shortest input terminates", OFFSET(shortest), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, .flags = FLAGS },
+    { "fill",  "set the color for unused pixels", OFFSET(fillcolor_str), AV_OPT_TYPE_STRING, {.str = "none"}, .flags = FLAGS },
+    { NULL },
+};
+
+AVFILTER_DEFINE_CLASS(xstack);
+
+AVFilter ff_vf_xstack = {
+    .name          = "xstack",
+    .description   = NULL_IF_CONFIG_SMALL("Stack video inputs into custom layout."),
+    .priv_size     = sizeof(StackContext),
+    .priv_class    = &xstack_class,
+    .query_formats = query_formats,
+    .outputs       = outputs,
+    .init          = init,
+    .uninit        = uninit,
+    .activate      = activate,
+    .flags         = AVFILTER_FLAG_DYNAMIC_INPUTS | AVFILTER_FLAG_SLICE_THREADS,
+};
+
+#endif /* CONFIG_XSTACK_FILTER */
diff --git a/libavfilter/vf_subtitles.c b/libavfilter/vf_subtitles.c
index a7b0246..a3b4029 100644
--- a/libavfilter/vf_subtitles.c
+++ b/libavfilter/vf_subtitles.c
@@ -66,10 +66,10 @@
 #define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM
 
 #define COMMON_OPTIONS \
-    {"filename",       "set the filename of file to read",                         OFFSET(filename),   AV_OPT_TYPE_STRING,     {.str = NULL},  CHAR_MIN, CHAR_MAX, FLAGS }, \
-    {"f",              "set the filename of file to read",                         OFFSET(filename),   AV_OPT_TYPE_STRING,     {.str = NULL},  CHAR_MIN, CHAR_MAX, FLAGS }, \
-    {"original_size",  "set the size of the original video (used to scale fonts)", OFFSET(original_w), AV_OPT_TYPE_IMAGE_SIZE, {.str = NULL},  CHAR_MIN, CHAR_MAX, FLAGS }, \
-    {"fontsdir",       "set the directory containing the fonts to read",           OFFSET(fontsdir),   AV_OPT_TYPE_STRING,     {.str = NULL},  CHAR_MIN, CHAR_MAX, FLAGS }, \
+    {"filename",       "set the filename of file to read",                         OFFSET(filename),   AV_OPT_TYPE_STRING,     {.str = NULL},  0, 0, FLAGS }, \
+    {"f",              "set the filename of file to read",                         OFFSET(filename),   AV_OPT_TYPE_STRING,     {.str = NULL},  0, 0, FLAGS }, \
+    {"original_size",  "set the size of the original video (used to scale fonts)", OFFSET(original_w), AV_OPT_TYPE_IMAGE_SIZE, {.str = NULL},  0, 0, FLAGS }, \
+    {"fontsdir",       "set the directory containing the fonts to read",           OFFSET(fontsdir),   AV_OPT_TYPE_STRING,     {.str = NULL},  0, 0, FLAGS }, \
     {"alpha",          "enable processing of alpha channel",                       OFFSET(alpha),      AV_OPT_TYPE_BOOL,       {.i64 = 0   },         0,        1, FLAGS }, \
 
 /* libass supports a log level ranging from 0 to 7 */
@@ -263,10 +263,10 @@
 
 static const AVOption subtitles_options[] = {
     COMMON_OPTIONS
-    {"charenc",      "set input character encoding", OFFSET(charenc),      AV_OPT_TYPE_STRING, {.str = NULL}, CHAR_MIN, CHAR_MAX, FLAGS},
+    {"charenc",      "set input character encoding", OFFSET(charenc),      AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, FLAGS},
     {"stream_index", "set stream index",             OFFSET(stream_index), AV_OPT_TYPE_INT,    { .i64 = -1 }, -1,       INT_MAX,  FLAGS},
     {"si",           "set stream index",             OFFSET(stream_index), AV_OPT_TYPE_INT,    { .i64 = -1 }, -1,       INT_MAX,  FLAGS},
-    {"force_style",  "force subtitle style",         OFFSET(force_style),  AV_OPT_TYPE_STRING, {.str = NULL}, CHAR_MIN, CHAR_MAX, FLAGS},
+    {"force_style",  "force subtitle style",         OFFSET(force_style),  AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, FLAGS},
     {NULL},
 };
 
diff --git a/libavfilter/vf_swaprect.c b/libavfilter/vf_swaprect.c
index f1fab1e..cf9c298 100644
--- a/libavfilter/vf_swaprect.c
+++ b/libavfilter/vf_swaprect.c
@@ -99,7 +99,7 @@
     var_values[VAR_DAR] = var_values[VAR_A] * var_values[VAR_SAR];
     var_values[VAR_N]   = inlink->frame_count_out;
     var_values[VAR_T]   = in->pts == AV_NOPTS_VALUE ? NAN : in->pts * av_q2d(inlink->time_base);
-    var_values[VAR_POS] = in->pkt_pos ? NAN : in->pkt_pos;
+    var_values[VAR_POS] = in->pkt_pos == -1 ? NAN : in->pkt_pos;
 
     ret = av_expr_parse_and_eval(&dw, s->w,
                                  var_names, &var_values[0],
diff --git a/libavfilter/vf_telecine.c b/libavfilter/vf_telecine.c
index 62599a7..741b19a 100644
--- a/libavfilter/vf_telecine.c
+++ b/libavfilter/vf_telecine.c
@@ -207,6 +207,8 @@
                                 s->stride[i],
                                 (s->planeheight[i] - !s->first_field + 1) / 2);
         }
+        s->frame[nout]->interlaced_frame = 1;
+        s->frame[nout]->top_field_first  = !s->first_field;
         nout++;
         len--;
         s->occupied = 0;
@@ -220,6 +222,8 @@
                                 inpicref->data[i], inpicref->linesize[i],
                                 s->stride[i],
                                 s->planeheight[i]);
+        s->frame[nout]->interlaced_frame = inpicref->interlaced_frame;
+        s->frame[nout]->top_field_first  = inpicref->top_field_first;
         nout++;
         len -= 2;
     }
@@ -236,6 +240,8 @@
 
     for (i = 0; i < nout; i++) {
         AVFrame *frame = av_frame_clone(s->frame[i]);
+        int interlaced = frame ? frame->interlaced_frame : 0;
+        int tff        = frame ? frame->top_field_first  : 0;
 
         if (!frame) {
             av_frame_free(&inpicref);
@@ -243,6 +249,8 @@
         }
 
         av_frame_copy_props(frame, inpicref);
+        frame->interlaced_frame = interlaced;
+        frame->top_field_first  = tff;
         frame->pts = ((s->start_time == AV_NOPTS_VALUE) ? 0 : s->start_time) +
                      av_rescale(outlink->frame_count_in, s->ts_unit.num,
                                 s->ts_unit.den);
diff --git a/libavfilter/vf_threshold.c b/libavfilter/vf_threshold.c
index cf2535d..ee29c88 100644
--- a/libavfilter/vf_threshold.c
+++ b/libavfilter/vf_threshold.c
@@ -277,7 +277,6 @@
 
     outlink->w = base->w;
     outlink->h = base->h;
-    outlink->time_base = base->time_base;
     outlink->sample_aspect_ratio = base->sample_aspect_ratio;
     outlink->frame_rate = base->frame_rate;
 
@@ -304,7 +303,10 @@
     s->fs.opaque   = s;
     s->fs.on_event = process_frame;
 
-    return ff_framesync_configure(&s->fs);
+    ret = ff_framesync_configure(&s->fs);
+    outlink->time_base = s->fs.time_base;
+
+    return ret;
 }
 
 static int activate(AVFilterContext *ctx)
diff --git a/libavfilter/vf_thumbnail.c b/libavfilter/vf_thumbnail.c
index 0effdc9..ac04615 100644
--- a/libavfilter/vf_thumbnail.c
+++ b/libavfilter/vf_thumbnail.c
@@ -162,7 +162,7 @@
 {
     int i;
     ThumbContext *s = ctx->priv;
-    for (i = 0; i < s->n_frames && s->frames[i].buf; i++)
+    for (i = 0; i < s->n_frames && s->frames && s->frames[i].buf; i++)
         av_frame_free(&s->frames[i].buf);
     av_freep(&s->frames);
 }
@@ -234,4 +234,5 @@
     .inputs        = thumbnail_inputs,
     .outputs       = thumbnail_outputs,
     .priv_class    = &thumbnail_class,
+    .flags         = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC,
 };
diff --git a/libavfilter/vf_thumbnail_cuda.c b/libavfilter/vf_thumbnail_cuda.c
index 09377ca..0c06815 100644
--- a/libavfilter/vf_thumbnail_cuda.c
+++ b/libavfilter/vf_thumbnail_cuda.c
@@ -20,16 +20,17 @@
 * DEALINGS IN THE SOFTWARE.
 */
 
-#include <cuda.h>
-
 #include "libavutil/hwcontext.h"
 #include "libavutil/hwcontext_cuda_internal.h"
+#include "libavutil/cuda_check.h"
 #include "libavutil/opt.h"
 #include "libavutil/pixdesc.h"
 
 #include "avfilter.h"
 #include "internal.h"
 
+#define CHECK_CU(x) FF_CUDA_CHECK_DL(ctx, s->hwctx->internal->cuda_dl, x)
+
 #define HIST_SIZE (3*256)
 #define DIV_UP(a, b) ( ((a) + (b) - 1) / (b) )
 #define BLOCKX 32
@@ -57,6 +58,7 @@
     AVRational tb;              ///< copy of the input timebase to ease access
 
     AVBufferRef *hw_frames_ctx;
+    AVCUDADeviceContext *hwctx;
 
     CUmodule    cu_module;
 
@@ -64,12 +66,10 @@
     CUfunction  cu_func_uchar2;
     CUfunction  cu_func_ushort;
     CUfunction  cu_func_ushort2;
-    CUtexref    cu_tex_uchar;
-    CUtexref    cu_tex_uchar2;
-    CUtexref    cu_tex_ushort;
-    CUtexref    cu_tex_ushort2;
+    CUstream    cu_stream;
 
     CUdeviceptr data;
+
 } ThumbnailCudaContext;
 
 #define OFFSET(x) offsetof(ThumbnailCudaContext, x)
@@ -154,27 +154,44 @@
     return picref;
 }
 
-static int thumbnail_kernel(ThumbnailCudaContext *s, CUfunction func, CUtexref tex, int channels,
+static int thumbnail_kernel(AVFilterContext *ctx, CUfunction func, int channels,
     int *histogram, uint8_t *src_dptr, int src_width, int src_height, int src_pitch, int pixel_size)
 {
-    CUdeviceptr src_devptr = (CUdeviceptr)src_dptr;
-    void *args[] = { &histogram, &src_width, &src_height };
-    CUDA_ARRAY_DESCRIPTOR desc;
+    int ret;
+    ThumbnailCudaContext *s = ctx->priv;
+    CudaFunctions *cu = s->hwctx->internal->cuda_dl;
+    CUtexObject tex = 0;
+    void *args[] = { &tex, &histogram, &src_width, &src_height };
 
-    desc.Width = src_width;
-    desc.Height = src_height;
-    desc.NumChannels = channels;
-    if (pixel_size == 1) {
-        desc.Format = CU_AD_FORMAT_UNSIGNED_INT8;
-    }
-    else {
-        desc.Format = CU_AD_FORMAT_UNSIGNED_INT16;
-    }
+    CUDA_TEXTURE_DESC tex_desc = {
+        .filterMode = CU_TR_FILTER_MODE_LINEAR,
+        .flags = CU_TRSF_READ_AS_INTEGER,
+    };
 
-    cuTexRefSetAddress2D_v3(tex, &desc, src_devptr, src_pitch);
-    cuLaunchKernel(func, DIV_UP(src_width, BLOCKX), DIV_UP(src_height, BLOCKY), 1, BLOCKX, BLOCKY, 1, 0, 0, args, NULL);
+    CUDA_RESOURCE_DESC res_desc = {
+        .resType = CU_RESOURCE_TYPE_PITCH2D,
+        .res.pitch2D.format = pixel_size == 1 ?
+                              CU_AD_FORMAT_UNSIGNED_INT8 :
+                              CU_AD_FORMAT_UNSIGNED_INT16,
+        .res.pitch2D.numChannels = channels,
+        .res.pitch2D.width = src_width,
+        .res.pitch2D.height = src_height,
+        .res.pitch2D.pitchInBytes = src_pitch,
+        .res.pitch2D.devPtr = (CUdeviceptr)src_dptr,
+    };
 
-    return 0;
+    ret = CHECK_CU(cu->cuTexObjectCreate(&tex, &res_desc, &tex_desc, NULL));
+    if (ret < 0)
+        goto exit;
+
+    ret = CHECK_CU(cu->cuLaunchKernel(func,
+                                      DIV_UP(src_width, BLOCKX), DIV_UP(src_height, BLOCKY), 1,
+                                      BLOCKX, BLOCKY, 1, 0, s->cu_stream, args, NULL));
+exit:
+    if (tex)
+        CHECK_CU(cu->cuTexObjectDestroy(tex));
+
+    return ret;
 }
 
 static int thumbnail(AVFilterContext *ctx, int *histogram, AVFrame *in)
@@ -184,40 +201,40 @@
 
     switch (in_frames_ctx->sw_format) {
     case AV_PIX_FMT_NV12:
-        thumbnail_kernel(s, s->cu_func_uchar, s->cu_tex_uchar, 1,
+        thumbnail_kernel(ctx, s->cu_func_uchar, 1,
             histogram, in->data[0], in->width, in->height, in->linesize[0], 1);
-        thumbnail_kernel(s, s->cu_func_uchar2, s->cu_tex_uchar2, 2,
+        thumbnail_kernel(ctx, s->cu_func_uchar2, 2,
             histogram + 256, in->data[1], in->width / 2, in->height / 2, in->linesize[1], 1);
         break;
     case AV_PIX_FMT_YUV420P:
-        thumbnail_kernel(s, s->cu_func_uchar, s->cu_tex_uchar, 1,
+        thumbnail_kernel(ctx, s->cu_func_uchar, 1,
             histogram, in->data[0], in->width, in->height, in->linesize[0], 1);
-        thumbnail_kernel(s, s->cu_func_uchar, s->cu_tex_uchar, 1,
+        thumbnail_kernel(ctx, s->cu_func_uchar, 1,
             histogram + 256, in->data[1], in->width / 2, in->height / 2, in->linesize[1], 1);
-        thumbnail_kernel(s, s->cu_func_uchar, s->cu_tex_uchar, 1,
+        thumbnail_kernel(ctx, s->cu_func_uchar, 1,
             histogram + 512, in->data[2], in->width / 2, in->height / 2, in->linesize[2], 1);
         break;
     case AV_PIX_FMT_YUV444P:
-        thumbnail_kernel(s, s->cu_func_uchar, s->cu_tex_uchar, 1,
+        thumbnail_kernel(ctx, s->cu_func_uchar, 1,
             histogram, in->data[0], in->width, in->height, in->linesize[0], 1);
-        thumbnail_kernel(s, s->cu_func_uchar, s->cu_tex_uchar, 1,
+        thumbnail_kernel(ctx, s->cu_func_uchar, 1,
             histogram + 256, in->data[1], in->width, in->height, in->linesize[1], 1);
-        thumbnail_kernel(s, s->cu_func_uchar, s->cu_tex_uchar, 1,
+        thumbnail_kernel(ctx, s->cu_func_uchar, 1,
             histogram + 512, in->data[2], in->width, in->height, in->linesize[2], 1);
         break;
     case AV_PIX_FMT_P010LE:
     case AV_PIX_FMT_P016LE:
-        thumbnail_kernel(s, s->cu_func_ushort, s->cu_tex_ushort, 1,
+        thumbnail_kernel(ctx, s->cu_func_ushort, 1,
             histogram, in->data[0], in->width, in->height, in->linesize[0], 2);
-        thumbnail_kernel(s, s->cu_func_ushort2, s->cu_tex_ushort2, 2,
+        thumbnail_kernel(ctx, s->cu_func_ushort2, 2,
             histogram + 256, in->data[1], in->width / 2, in->height / 2, in->linesize[1], 2);
         break;
     case AV_PIX_FMT_YUV444P16:
-        thumbnail_kernel(s, s->cu_func_ushort2, s->cu_tex_uchar, 1,
+        thumbnail_kernel(ctx, s->cu_func_ushort2, 1,
             histogram, in->data[0], in->width, in->height, in->linesize[0], 2);
-        thumbnail_kernel(s, s->cu_func_ushort2, s->cu_tex_uchar, 1,
+        thumbnail_kernel(ctx, s->cu_func_ushort2, 1,
             histogram + 256, in->data[1], in->width, in->height, in->linesize[1], 2);
-        thumbnail_kernel(s, s->cu_func_ushort2, s->cu_tex_uchar, 1,
+        thumbnail_kernel(ctx, s->cu_func_ushort2, 1,
             histogram + 512, in->data[2], in->width, in->height, in->linesize[2], 2);
         break;
     default:
@@ -231,11 +248,10 @@
 {
     AVFilterContext *ctx  = inlink->dst;
     ThumbnailCudaContext *s   = ctx->priv;
+    CudaFunctions *cu = s->hwctx->internal->cuda_dl;
     AVFilterLink *outlink = ctx->outputs[0];
     int *hist = s->frames[s->n].histogram;
     AVHWFramesContext *hw_frames_ctx = (AVHWFramesContext*)s->hw_frames_ctx->data;
-    AVCUDADeviceContext *device_hwctx = hw_frames_ctx->device_ctx->hwctx;
-    CUresult err;
     CUcontext dummy;
     CUDA_MEMCPY2D cpy = { 0 };
     int ret = 0;
@@ -243,11 +259,11 @@
     // keep a reference of each frame
     s->frames[s->n].buf = frame;
 
-    err = cuCtxPushCurrent(device_hwctx->cuda_ctx);
-    if (err != CUDA_SUCCESS)
-        return AVERROR_UNKNOWN;
+    ret = CHECK_CU(cu->cuCtxPushCurrent(s->hwctx->cuda_ctx));
+    if (ret < 0)
+        return ret;
 
-    cuMemsetD8(s->data, 0, HIST_SIZE * sizeof(int));
+    CHECK_CU(cu->cuMemsetD8Async(s->data, 0, HIST_SIZE * sizeof(int), s->cu_stream));
 
     thumbnail(ctx, (int*)s->data, frame);
 
@@ -260,11 +276,9 @@
     cpy.WidthInBytes = HIST_SIZE * sizeof(int);
     cpy.Height = 1;
 
-    err = cuMemcpy2D(&cpy);
-    if (err != CUDA_SUCCESS) {
-        av_log(ctx, AV_LOG_ERROR, "Error transferring the data from the CUDA frame\n");
-        return AVERROR_UNKNOWN;
-    }
+    ret = CHECK_CU(cu->cuMemcpy2DAsync(&cpy, s->cu_stream));
+    if (ret < 0)
+        return ret;
 
     if (hw_frames_ctx->sw_format == AV_PIX_FMT_NV12 || hw_frames_ctx->sw_format == AV_PIX_FMT_YUV420P ||
         hw_frames_ctx->sw_format == AV_PIX_FMT_P010LE || hw_frames_ctx->sw_format == AV_PIX_FMT_P016LE)
@@ -274,7 +288,7 @@
             hist[i] = 4 * hist[i];
     }
 
-    cuCtxPopCurrent(&dummy);
+    CHECK_CU(cu->cuCtxPopCurrent(&dummy));
     if (ret < 0)
         return ret;
 
@@ -290,14 +304,15 @@
 {
     int i;
     ThumbnailCudaContext *s = ctx->priv;
+    CudaFunctions *cu = s->hwctx->internal->cuda_dl;
 
     if (s->data) {
-        cuMemFree(s->data);
+        CHECK_CU(cu->cuMemFree(s->data));
         s->data = 0;
     }
 
     if (s->cu_module) {
-        cuModuleUnload(s->cu_module);
+        CHECK_CU(cu->cuModuleUnload(s->cu_module));
         s->cu_module = NULL;
     }
 
@@ -340,49 +355,43 @@
     AVHWFramesContext     *hw_frames_ctx = (AVHWFramesContext*)inlink->hw_frames_ctx->data;
     AVCUDADeviceContext *device_hwctx = hw_frames_ctx->device_ctx->hwctx;
     CUcontext dummy, cuda_ctx = device_hwctx->cuda_ctx;
-    CUresult err;
+    CudaFunctions *cu = device_hwctx->internal->cuda_dl;
+    int ret;
 
     extern char vf_thumbnail_cuda_ptx[];
 
-    err = cuCtxPushCurrent(cuda_ctx);
-    if (err != CUDA_SUCCESS) {
-        av_log(ctx, AV_LOG_ERROR, "Error pushing cuda context\n");
-        return AVERROR_UNKNOWN;
-    }
+    s->hwctx = device_hwctx;
+    s->cu_stream = s->hwctx->stream;
 
-    err = cuModuleLoadData(&s->cu_module, vf_thumbnail_cuda_ptx);
-    if (err != CUDA_SUCCESS) {
-        av_log(ctx, AV_LOG_ERROR, "Error loading module data\n");
-        return AVERROR_UNKNOWN;
-    }
+    ret = CHECK_CU(cu->cuCtxPushCurrent(cuda_ctx));
+    if (ret < 0)
+        return ret;
 
-    cuModuleGetFunction(&s->cu_func_uchar, s->cu_module, "Thumbnail_uchar");
-    cuModuleGetFunction(&s->cu_func_uchar2, s->cu_module, "Thumbnail_uchar2");
-    cuModuleGetFunction(&s->cu_func_ushort, s->cu_module, "Thumbnail_ushort");
-    cuModuleGetFunction(&s->cu_func_ushort2, s->cu_module, "Thumbnail_ushort2");
+    ret = CHECK_CU(cu->cuModuleLoadData(&s->cu_module, vf_thumbnail_cuda_ptx));
+    if (ret < 0)
+        return ret;
 
-    cuModuleGetTexRef(&s->cu_tex_uchar, s->cu_module, "uchar_tex");
-    cuModuleGetTexRef(&s->cu_tex_uchar2, s->cu_module, "uchar2_tex");
-    cuModuleGetTexRef(&s->cu_tex_ushort, s->cu_module, "ushort_tex");
-    cuModuleGetTexRef(&s->cu_tex_ushort2, s->cu_module, "ushort2_tex");
+    ret = CHECK_CU(cu->cuModuleGetFunction(&s->cu_func_uchar, s->cu_module, "Thumbnail_uchar"));
+    if (ret < 0)
+        return ret;
 
-    cuTexRefSetFlags(s->cu_tex_uchar, CU_TRSF_READ_AS_INTEGER);
-    cuTexRefSetFlags(s->cu_tex_uchar2, CU_TRSF_READ_AS_INTEGER);
-    cuTexRefSetFlags(s->cu_tex_ushort, CU_TRSF_READ_AS_INTEGER);
-    cuTexRefSetFlags(s->cu_tex_ushort2, CU_TRSF_READ_AS_INTEGER);
+    ret = CHECK_CU(cu->cuModuleGetFunction(&s->cu_func_uchar2, s->cu_module, "Thumbnail_uchar2"));
+    if (ret < 0)
+        return ret;
 
-    cuTexRefSetFilterMode(s->cu_tex_uchar, CU_TR_FILTER_MODE_LINEAR);
-    cuTexRefSetFilterMode(s->cu_tex_uchar2, CU_TR_FILTER_MODE_LINEAR);
-    cuTexRefSetFilterMode(s->cu_tex_ushort, CU_TR_FILTER_MODE_LINEAR);
-    cuTexRefSetFilterMode(s->cu_tex_ushort2, CU_TR_FILTER_MODE_LINEAR);
+    ret = CHECK_CU(cu->cuModuleGetFunction(&s->cu_func_ushort, s->cu_module, "Thumbnail_ushort"));
+    if (ret < 0)
+        return ret;
 
-    err = cuMemAlloc(&s->data, HIST_SIZE * sizeof(int));
-    if (err != CUDA_SUCCESS) {
-        av_log(ctx, AV_LOG_ERROR, "Error allocating cuda memory\n");
-        return AVERROR_UNKNOWN;
-    }
+    ret = CHECK_CU(cu->cuModuleGetFunction(&s->cu_func_ushort2, s->cu_module, "Thumbnail_ushort2"));
+    if (ret < 0)
+        return ret;
 
-    cuCtxPopCurrent(&dummy);
+    ret = CHECK_CU(cu->cuMemAlloc(&s->data, HIST_SIZE * sizeof(int)));
+    if (ret < 0)
+        return ret;
+
+    CHECK_CU(cu->cuCtxPopCurrent(&dummy));
 
     s->hw_frames_ctx = ctx->inputs[0]->hw_frames_ctx;
 
diff --git a/libavfilter/vf_thumbnail_cuda.cu b/libavfilter/vf_thumbnail_cuda.cu
index 98fad43..d4d4d79 100644
--- a/libavfilter/vf_thumbnail_cuda.cu
+++ b/libavfilter/vf_thumbnail_cuda.cu
@@ -22,57 +22,56 @@
 
 extern "C" {
 
-texture<unsigned char, 2> uchar_tex;
-texture<uchar2, 2>  uchar2_tex;
-texture<unsigned short, 2> ushort_tex;
-texture<ushort2, 2>  ushort2_tex;
-
-__global__ void Thumbnail_uchar(int *histogram, int src_width, int src_height)
+__global__ void Thumbnail_uchar(cudaTextureObject_t uchar_tex,
+                                int *histogram, int src_width, int src_height)
 {
     int x = blockIdx.x * blockDim.x + threadIdx.x;
     int y = blockIdx.y * blockDim.y + threadIdx.y;
     if (y < src_height && x < src_width)
     {
-        unsigned char pixel = tex2D(uchar_tex, x, y);
+        unsigned char pixel = tex2D<unsigned char>(uchar_tex, x, y);
         atomicAdd(&histogram[pixel], 1);
     }
 }
 
-__global__ void Thumbnail_uchar2(int *histogram, int src_width, int src_height)
+__global__ void Thumbnail_uchar2(cudaTextureObject_t uchar2_tex,
+                                 int *histogram, int src_width, int src_height)
 {
     int x = blockIdx.x * blockDim.x + threadIdx.x;
     int y = blockIdx.y * blockDim.y + threadIdx.y;
 
     if (y < src_height && x < src_width)
     {
-        uchar2 pixel = tex2D(uchar2_tex, x, y);
+        uchar2 pixel = tex2D<uchar2>(uchar2_tex, x, y);
         atomicAdd(&histogram[pixel.x], 1);
         atomicAdd(&histogram[256 + pixel.y], 1);
     }
 }
 
-__global__ void Thumbnail_ushort(int *histogram, int src_width, int src_height)
+__global__ void Thumbnail_ushort(cudaTextureObject_t ushort_tex,
+                                 int *histogram, int src_width, int src_height)
 {
     int x = blockIdx.x * blockDim.x + threadIdx.x;
     int y = blockIdx.y * blockDim.y + threadIdx.y;
 
     if (y < src_height && x < src_width)
     {
-        unsigned short pixel = (tex2D(ushort_tex, x, y) + 128) >> 8;
+        unsigned short pixel = (tex2D<unsigned short>(ushort_tex, x, y) + 128) >> 8;
         atomicAdd(&histogram[pixel], 1);
     }
 }
 
-__global__ void Thumbnail_ushort2(int *histogram, int src_width, int src_height)
+__global__ void Thumbnail_ushort2(cudaTextureObject_t ushort2_tex,
+                                  int *histogram, int src_width, int src_height)
 {
     int x = blockIdx.x * blockDim.x + threadIdx.x;
     int y = blockIdx.y * blockDim.y + threadIdx.y;
 
     if (y < src_height && x < src_width)
     {
-        ushort2 pixel = tex2D(ushort2_tex, x, y);
+        ushort2 pixel = tex2D<ushort2>(ushort2_tex, x, y);
         atomicAdd(&histogram[(pixel.x + 128) >> 8], 1);
-        atomicAdd(&histogram[256 + (pixel.y + 128) >> 8], 1);
+        atomicAdd(&histogram[256 + ((pixel.y + 128) >> 8)], 1);
     }
 }
 
diff --git a/libavfilter/vf_tile.c b/libavfilter/vf_tile.c
index 439689a..6278f72 100644
--- a/libavfilter/vf_tile.c
+++ b/libavfilter/vf_tile.c
@@ -262,6 +262,7 @@
 {
     TileContext *tile = ctx->priv;
 
+    av_frame_free(&tile->out_ref);
     av_frame_free(&tile->prev_out_ref);
 }
 
diff --git a/libavfilter/vf_tonemap.c b/libavfilter/vf_tonemap.c
index 98a2c4b..d1728c8 100644
--- a/libavfilter/vf_tonemap.c
+++ b/libavfilter/vf_tonemap.c
@@ -191,10 +191,36 @@
     *b_out *= sig / sig_orig;
 }
 
+typedef struct ThreadData {
+    AVFrame *in, *out;
+    const AVPixFmtDescriptor *desc;
+    double peak;
+} ThreadData;
+
+static int tonemap_slice(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
+{
+    TonemapContext *s = ctx->priv;
+    ThreadData *td = arg;
+    AVFrame *in = td->in;
+    AVFrame *out = td->out;
+    const AVPixFmtDescriptor *desc = td->desc;
+    const int slice_start = (in->height * jobnr) / nb_jobs;
+    const int slice_end = (in->height * (jobnr+1)) / nb_jobs;
+    double peak = td->peak;
+
+    for (int y = slice_start; y < slice_end; y++)
+        for (int x = 0; x < out->width; x++)
+            tonemap(s, out, in, desc, x, y, peak);
+
+    return 0;
+}
+
 static int filter_frame(AVFilterLink *link, AVFrame *in)
 {
-    TonemapContext *s = link->dst->priv;
-    AVFilterLink *outlink = link->dst->outputs[0];
+    AVFilterContext *ctx = link->dst;
+    TonemapContext *s = ctx->priv;
+    AVFilterLink *outlink = ctx->outputs[0];
+    ThreadData td;
     AVFrame *out;
     const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(link->format);
     const AVPixFmtDescriptor *odesc = av_pix_fmt_desc_get(outlink->format);
@@ -245,9 +271,11 @@
     }
 
     /* do the tone map */
-    for (y = 0; y < out->height; y++)
-        for (x = 0; x < out->width; x++)
-            tonemap(s, out, in, desc, x, y, peak);
+    td.out = out;
+    td.in = in;
+    td.desc = desc;
+    td.peak = peak;
+    ctx->internal->execute(ctx, tonemap_slice, &td, NULL, FFMIN(in->height, ff_filter_get_nb_threads(ctx)));
 
     /* copy/generate alpha if needed */
     if (desc->flags & AV_PIX_FMT_FLAG_ALPHA && odesc->flags & AV_PIX_FMT_FLAG_ALPHA) {
@@ -287,13 +315,7 @@
     { NULL }
 };
 
-static const AVClass tonemap_class = {
-    .class_name       = "tonemap",
-    .item_name        = av_default_item_name,
-    .option           = tonemap_options,
-    .version          = LIBAVUTIL_VERSION_INT,
-    .category         = AV_CLASS_CATEGORY_FILTER,
-};
+AVFILTER_DEFINE_CLASS(tonemap);
 
 static const AVFilterPad tonemap_inputs[] = {
     {
@@ -321,4 +343,5 @@
     .priv_class      = &tonemap_class,
     .inputs          = tonemap_inputs,
     .outputs         = tonemap_outputs,
+    .flags           = AVFILTER_FLAG_SLICE_THREADS,
 };
diff --git a/libavfilter/vf_tonemap_opencl.c b/libavfilter/vf_tonemap_opencl.c
index cd293c2..b880228 100644
--- a/libavfilter/vf_tonemap_opencl.c
+++ b/libavfilter/vf_tonemap_opencl.c
@@ -18,7 +18,6 @@
 #include <float.h>
 
 #include "libavutil/avassert.h"
-#include "libavutil/bprint.h"
 #include "libavutil/common.h"
 #include "libavutil/imgutils.h"
 #include "libavutil/mem.h"
@@ -35,7 +34,6 @@
 // TODO:
 // - separate peak-detection from tone-mapping kernel to solve
 //    one-frame-delay issue.
-// - import colorspace matrix generation from vf_colorspace.c
 // - more format support
 
 #define DETECTION_FRAMES 63
@@ -73,16 +71,6 @@
     cl_mem                util_mem;
 } TonemapOpenCLContext;
 
-static const char *yuv_coff[AVCOL_SPC_NB] = {
-    [AVCOL_SPC_BT709] = "rgb2yuv_bt709",
-    [AVCOL_SPC_BT2020_NCL] = "rgb2yuv_bt2020",
-};
-
-static const char *rgb_coff[AVCOL_SPC_NB] = {
-    [AVCOL_SPC_BT709] = "yuv2rgb_bt709",
-    [AVCOL_SPC_BT2020_NCL] = "yuv2rgb_bt2020",
-};
-
 static const char *linearize_funcs[AVCOL_TRC_NB] = {
     [AVCOL_TRC_SMPTE2084] = "eotf_st2084",
     [AVCOL_TRC_ARIB_STD_B67] = "inverse_oetf_hlg",
@@ -93,17 +81,12 @@
     [AVCOL_TRC_BT2020_10] = "inverse_eotf_bt1886",
 };
 
-static const struct LumaCoefficients luma_coefficients[AVCOL_SPC_NB] = {
-    [AVCOL_SPC_BT709]      = { 0.2126, 0.7152, 0.0722 },
-    [AVCOL_SPC_BT2020_NCL] = { 0.2627, 0.6780, 0.0593 },
-};
-
-static struct PrimaryCoefficients primaries_table[AVCOL_PRI_NB] = {
+static const struct PrimaryCoefficients primaries_table[AVCOL_PRI_NB] = {
     [AVCOL_PRI_BT709]  = { 0.640, 0.330, 0.300, 0.600, 0.150, 0.060 },
     [AVCOL_PRI_BT2020] = { 0.708, 0.292, 0.170, 0.797, 0.131, 0.046 },
 };
 
-static struct WhitepointCoefficients whitepoint_table[AVCOL_PRI_NB] = {
+static const struct WhitepointCoefficients whitepoint_table[AVCOL_PRI_NB] = {
     [AVCOL_PRI_BT709]  = { 0.3127, 0.3290 },
     [AVCOL_PRI_BT2020] = { 0.3127, 0.3290 },
 };
@@ -137,8 +120,8 @@
 {
     TonemapOpenCLContext *ctx = avctx->priv;
     int rgb2rgb_passthrough = 1;
-    double rgb2rgb[3][3];
-    struct LumaCoefficients luma_src, luma_dst;
+    double rgb2rgb[3][3], rgb2yuv[3][3], yuv2rgb[3][3];
+    const struct LumaCoefficients *luma_src, *luma_dst;
     cl_int cle;
     int err;
     AVBPrint header;
@@ -215,27 +198,37 @@
 
     if (rgb2rgb_passthrough)
         av_bprintf(&header, "#define RGB2RGB_PASSTHROUGH\n");
-    else {
-        av_bprintf(&header, "__constant float rgb2rgb[9] = {\n");
-        av_bprintf(&header, "    %.4ff, %.4ff, %.4ff,\n",
-                   rgb2rgb[0][0], rgb2rgb[0][1], rgb2rgb[0][2]);
-        av_bprintf(&header, "    %.4ff, %.4ff, %.4ff,\n",
-                   rgb2rgb[1][0], rgb2rgb[1][1], rgb2rgb[1][2]);
-        av_bprintf(&header, "    %.4ff, %.4ff, %.4ff};\n",
-                   rgb2rgb[2][0], rgb2rgb[2][1], rgb2rgb[2][2]);
+    else
+        ff_opencl_print_const_matrix_3x3(&header, "rgb2rgb", rgb2rgb);
+
+
+    luma_src = ff_get_luma_coefficients(ctx->colorspace_in);
+    if (!luma_src) {
+        err = AVERROR(EINVAL);
+        av_log(avctx, AV_LOG_ERROR, "unsupported input colorspace %d (%s)\n",
+               ctx->colorspace_in, av_color_space_name(ctx->colorspace_in));
+        goto fail;
     }
 
-    av_bprintf(&header, "#define rgb_matrix %s\n",
-               rgb_coff[ctx->colorspace_in]);
-    av_bprintf(&header, "#define yuv_matrix %s\n",
-               yuv_coff[ctx->colorspace_out]);
+    luma_dst = ff_get_luma_coefficients(ctx->colorspace_out);
+    if (!luma_dst) {
+        err = AVERROR(EINVAL);
+        av_log(avctx, AV_LOG_ERROR, "unsupported output colorspace %d (%s)\n",
+               ctx->colorspace_out, av_color_space_name(ctx->colorspace_out));
+        goto fail;
+    }
 
-    luma_src = luma_coefficients[ctx->colorspace_in];
-    luma_dst = luma_coefficients[ctx->colorspace_out];
+    ff_fill_rgb2yuv_table(luma_dst, rgb2yuv);
+    ff_opencl_print_const_matrix_3x3(&header, "yuv_matrix", rgb2yuv);
+
+    ff_fill_rgb2yuv_table(luma_src, rgb2yuv);
+    ff_matrix_invert_3x3(rgb2yuv, yuv2rgb);
+    ff_opencl_print_const_matrix_3x3(&header, "rgb_matrix", yuv2rgb);
+
     av_bprintf(&header, "constant float3 luma_src = {%.4ff, %.4ff, %.4ff};\n",
-               luma_src.cr, luma_src.cg, luma_src.cb);
+               luma_src->cr, luma_src->cg, luma_src->cb);
     av_bprintf(&header, "constant float3 luma_dst = {%.4ff, %.4ff, %.4ff};\n",
-               luma_dst.cr, luma_dst.cg, luma_dst.cb);
+               luma_dst->cr, luma_dst->cg, luma_dst->cb);
 
     av_bprintf(&header, "#define linearize %s\n", linearize_funcs[ctx->trc_in]);
     av_bprintf(&header, "#define delinearize %s\n",
@@ -276,6 +269,7 @@
     return 0;
 
 fail:
+    av_bprint_finalize(&header, NULL);
     if (ctx->util_mem)
         clReleaseMemObject(ctx->util_mem);
     if (ctx->command_queue)
@@ -548,7 +542,7 @@
 
 AVFilter ff_vf_tonemap_opencl = {
     .name           = "tonemap_opencl",
-    .description    = NULL_IF_CONFIG_SMALL("perform HDR to SDR conversion with tonemapping"),
+    .description    = NULL_IF_CONFIG_SMALL("Perform HDR to SDR conversion with tonemapping."),
     .priv_size      = sizeof(TonemapOpenCLContext),
     .priv_class     = &tonemap_opencl_class,
     .init           = &ff_opencl_filter_init,
diff --git a/libavfilter/vf_tonemap_vaapi.c b/libavfilter/vf_tonemap_vaapi.c
new file mode 100644
index 0000000..2f41b90
--- /dev/null
+++ b/libavfilter/vf_tonemap_vaapi.c
@@ -0,0 +1,419 @@
+/*
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+#include <string.h>
+
+#include "libavutil/avassert.h"
+#include "libavutil/mem.h"
+#include "libavutil/opt.h"
+#include "libavutil/pixdesc.h"
+#include "libavutil/mastering_display_metadata.h"
+
+#include "avfilter.h"
+#include "formats.h"
+#include "internal.h"
+#include "vaapi_vpp.h"
+
+typedef struct HDRVAAPIContext {
+    VAAPIVPPContext vpp_ctx; // must be the first field
+
+    char *output_format_string;
+
+    char *color_primaries_string;
+    char *color_transfer_string;
+    char *color_matrix_string;
+
+    enum AVColorPrimaries color_primaries;
+    enum AVColorTransferCharacteristic color_transfer;
+    enum AVColorSpace color_matrix;
+
+    VAHdrMetaDataHDR10  in_metadata;
+
+    AVFrameSideData    *src_display;
+    AVFrameSideData    *src_light;
+} HDRVAAPIContext;
+
+static int tonemap_vaapi_save_metadata(AVFilterContext *avctx, AVFrame *input_frame)
+{
+    HDRVAAPIContext *ctx = avctx->priv;
+    AVMasteringDisplayMetadata *hdr_meta;
+    AVContentLightMetadata *light_meta;
+
+    if (input_frame->color_trc != AVCOL_TRC_SMPTE2084) {
+        av_log(avctx, AV_LOG_WARNING, "Only support HDR10 as input for vaapi tone-mapping\n");
+    }
+
+    ctx->src_display = av_frame_get_side_data(input_frame,
+                                              AV_FRAME_DATA_MASTERING_DISPLAY_METADATA);
+    if (ctx->src_display) {
+        hdr_meta = (AVMasteringDisplayMetadata *)ctx->src_display->data;
+        if (!hdr_meta) {
+            av_log(avctx, AV_LOG_ERROR, "No mastering display data\n");
+            return AVERROR(EINVAL);
+        }
+
+        if (hdr_meta->has_luminance) {
+            const int luma_den = 10000;
+            ctx->in_metadata.max_display_mastering_luminance =
+                lrint(luma_den * av_q2d(hdr_meta->max_luminance));
+            ctx->in_metadata.min_display_mastering_luminance =
+                FFMIN(lrint(luma_den * av_q2d(hdr_meta->min_luminance)),
+                      ctx->in_metadata.max_display_mastering_luminance);
+
+            av_log(avctx, AV_LOG_DEBUG,
+                   "Mastering Display Metadata(in luminance):\n");
+            av_log(avctx, AV_LOG_DEBUG,
+                   "min_luminance=%u, max_luminance=%u\n",
+                   ctx->in_metadata.min_display_mastering_luminance,
+                   ctx->in_metadata.max_display_mastering_luminance);
+        }
+
+        if (hdr_meta->has_primaries) {
+            int i;
+            const int mapping[3] = {1, 2, 0};  //green, blue, red
+            const int chroma_den = 50000;
+
+            for (i = 0; i < 3; i++) {
+                const int j = mapping[i];
+                ctx->in_metadata.display_primaries_x[i] =
+                    FFMIN(lrint(chroma_den *
+                                av_q2d(hdr_meta->display_primaries[j][0])),
+                          chroma_den);
+                ctx->in_metadata.display_primaries_y[i] =
+                    FFMIN(lrint(chroma_den *
+                                av_q2d(hdr_meta->display_primaries[j][1])),
+                          chroma_den);
+            }
+
+            ctx->in_metadata.white_point_x =
+                FFMIN(lrint(chroma_den * av_q2d(hdr_meta->white_point[0])),
+                      chroma_den);
+            ctx->in_metadata.white_point_y =
+                FFMIN(lrint(chroma_den * av_q2d(hdr_meta->white_point[1])),
+                      chroma_den);
+
+            av_log(avctx, AV_LOG_DEBUG,
+                   "Mastering Display Metadata(in primaries):\n");
+            av_log(avctx, AV_LOG_DEBUG,
+                   "G(%u,%u) B(%u,%u) R(%u,%u) WP(%u,%u)\n",
+                   ctx->in_metadata.display_primaries_x[0],
+                   ctx->in_metadata.display_primaries_y[0],
+                   ctx->in_metadata.display_primaries_x[1],
+                   ctx->in_metadata.display_primaries_y[1],
+                   ctx->in_metadata.display_primaries_x[2],
+                   ctx->in_metadata.display_primaries_y[2],
+                   ctx->in_metadata.white_point_x,
+                   ctx->in_metadata.white_point_y);
+        }
+    } else {
+        av_log(avctx, AV_LOG_ERROR, "No mastering display data from input\n");
+        return AVERROR(EINVAL);
+    }
+
+    ctx->src_light = av_frame_get_side_data(input_frame,
+                                            AV_FRAME_DATA_CONTENT_LIGHT_LEVEL);
+    if (ctx->src_light) {
+        light_meta = (AVContentLightMetadata *)ctx->src_light->data;
+        if (!light_meta) {
+            av_log(avctx, AV_LOG_ERROR, "No light metadata\n");
+            return AVERROR(EINVAL);
+        }
+
+        ctx->in_metadata.max_content_light_level = light_meta->MaxCLL;
+        ctx->in_metadata.max_pic_average_light_level = light_meta->MaxFALL;
+
+        av_log(avctx, AV_LOG_DEBUG,
+               "Mastering Content Light Level (in):\n");
+        av_log(avctx, AV_LOG_DEBUG,
+               "MaxCLL(%u) MaxFALL(%u)\n",
+               ctx->in_metadata.max_content_light_level,
+               ctx->in_metadata.max_pic_average_light_level);
+    } else {
+        av_log(avctx, AV_LOG_DEBUG, "No content light level from input\n");
+    }
+    return 0;
+}
+
+static int tonemap_vaapi_set_filter_params(AVFilterContext *avctx, AVFrame *input_frame)
+{
+    VAAPIVPPContext *vpp_ctx   = avctx->priv;
+    HDRVAAPIContext *ctx       = avctx->priv;
+    VAStatus vas;
+    VAProcFilterParameterBufferHDRToneMapping *hdrtm_param;
+
+    vas = vaMapBuffer(vpp_ctx->hwctx->display, vpp_ctx->filter_buffers[0],
+                      (void**)&hdrtm_param);
+    if (vas != VA_STATUS_SUCCESS) {
+        av_log(avctx, AV_LOG_ERROR, "Failed to map "
+               "buffer (%d): %d (%s).\n",
+               vpp_ctx->filter_buffers[0], vas, vaErrorStr(vas));
+        return AVERROR(EIO);
+    }
+
+    memcpy(hdrtm_param->data.metadata, &ctx->in_metadata, sizeof(VAHdrMetaDataHDR10));
+
+    vas = vaUnmapBuffer(vpp_ctx->hwctx->display, vpp_ctx->filter_buffers[0]);
+    if (vas != VA_STATUS_SUCCESS) {
+        av_log(avctx, AV_LOG_ERROR, "Failed to unmap output buffers: "
+               "%d (%s).\n", vas, vaErrorStr(vas));
+        return AVERROR(EIO);
+    }
+
+    return 0;
+}
+
+static int tonemap_vaapi_build_filter_params(AVFilterContext *avctx)
+{
+    VAAPIVPPContext *vpp_ctx   = avctx->priv;
+    HDRVAAPIContext *ctx       = avctx->priv;
+    VAStatus vas;
+    VAProcFilterParameterBufferHDRToneMapping hdrtm_param;
+    VAProcFilterCapHighDynamicRange hdr_cap[VAProcHighDynamicRangeMetadataTypeCount];
+    int num_query_caps;
+    int i;
+
+    memset(&hdrtm_param, 0, sizeof(hdrtm_param));
+    memset(&ctx->in_metadata, 0, sizeof(ctx->in_metadata));
+
+    num_query_caps = VAProcHighDynamicRangeMetadataTypeCount;
+    vas = vaQueryVideoProcFilterCaps(vpp_ctx->hwctx->display,
+                                     vpp_ctx->va_context,
+                                     VAProcFilterHighDynamicRangeToneMapping,
+                                     &hdr_cap, &num_query_caps);
+    if (vas != VA_STATUS_SUCCESS) {
+        av_log(avctx, AV_LOG_ERROR, "Failed to query HDR caps "
+               "context: %d (%s).\n", vas, vaErrorStr(vas));
+        return AVERROR(EIO);
+    }
+
+    for (i = 0; i < num_query_caps; i++) {
+        if (hdr_cap[i].metadata_type != VAProcHighDynamicRangeMetadataNone)
+            break;
+    }
+
+    if (i >= num_query_caps) {
+        av_log(avctx, AV_LOG_ERROR, "VAAPI driver doesn't support HDR\n");
+        return AVERROR(EINVAL);
+    }
+
+    for (i = 0; i < num_query_caps; i++) {
+        if (VA_TONE_MAPPING_HDR_TO_SDR & hdr_cap[i].caps_flag)
+            break;
+    }
+
+    if (i >= num_query_caps) {
+        av_log(avctx, AV_LOG_ERROR,
+               "VAAPI driver doesn't support HDR to SDR\n");
+        return AVERROR(EINVAL);
+    }
+
+    hdrtm_param.type = VAProcFilterHighDynamicRangeToneMapping;
+    hdrtm_param.data.metadata_type = VAProcHighDynamicRangeMetadataHDR10;
+    hdrtm_param.data.metadata      = &ctx->in_metadata;
+    hdrtm_param.data.metadata_size = sizeof(VAHdrMetaDataHDR10);
+
+    return ff_vaapi_vpp_make_param_buffers(avctx,
+                                           VAProcFilterParameterBufferType,
+                                           &hdrtm_param, sizeof(hdrtm_param), 1);
+}
+
+static int tonemap_vaapi_filter_frame(AVFilterLink *inlink, AVFrame *input_frame)
+{
+    AVFilterContext *avctx     = inlink->dst;
+    AVFilterLink *outlink      = avctx->outputs[0];
+    VAAPIVPPContext *vpp_ctx   = avctx->priv;
+    HDRVAAPIContext *ctx       = avctx->priv;
+    AVFrame *output_frame      = NULL;
+    VASurfaceID input_surface, output_surface;
+
+    VAProcPipelineParameterBuffer params;
+    int err;
+
+    av_log(avctx, AV_LOG_DEBUG, "Filter input: %s, %ux%u (%"PRId64").\n",
+           av_get_pix_fmt_name(input_frame->format),
+           input_frame->width, input_frame->height, input_frame->pts);
+
+    if (vpp_ctx->va_context == VA_INVALID_ID){
+        av_frame_free(&input_frame);
+        return AVERROR(EINVAL);
+    }
+
+    err = tonemap_vaapi_save_metadata(avctx, input_frame);
+    if (err < 0)
+        goto fail;
+
+    err = tonemap_vaapi_set_filter_params(avctx, input_frame);
+    if (err < 0)
+        goto fail;
+
+    input_surface = (VASurfaceID)(uintptr_t)input_frame->data[3];
+    av_log(avctx, AV_LOG_DEBUG, "Using surface %#x for tonemap vpp input.\n",
+           input_surface);
+
+    output_frame = ff_get_video_buffer(outlink, vpp_ctx->output_width,
+                                       vpp_ctx->output_height);
+    if (!output_frame) {
+        err = AVERROR(ENOMEM);
+        goto fail;
+    }
+
+    output_surface = (VASurfaceID)(uintptr_t)output_frame->data[3];
+    av_log(avctx, AV_LOG_DEBUG, "Using surface %#x for tonemap vpp output.\n",
+           output_surface);
+    memset(&params, 0, sizeof(params));
+
+    err = av_frame_copy_props(output_frame, input_frame);
+    if (err < 0)
+        goto fail;
+
+    if (ctx->color_primaries != AVCOL_PRI_UNSPECIFIED)
+        output_frame->color_primaries = ctx->color_primaries;
+
+    if (ctx->color_transfer != AVCOL_TRC_UNSPECIFIED)
+        output_frame->color_trc = ctx->color_transfer;
+    else
+        output_frame->color_trc = AVCOL_TRC_BT709;
+
+    if (ctx->color_matrix != AVCOL_SPC_UNSPECIFIED)
+        output_frame->colorspace = ctx->color_matrix;
+
+    err = ff_vaapi_vpp_init_params(avctx, &params,
+                                   input_frame, output_frame);
+    if (err < 0)
+        goto fail;
+
+    err = ff_vaapi_vpp_render_picture(avctx, &params, output_frame);
+    if (err < 0)
+        goto fail;
+
+    av_frame_free(&input_frame);
+
+    av_log(avctx, AV_LOG_DEBUG, "Filter output: %s, %ux%u (%"PRId64").\n",
+           av_get_pix_fmt_name(output_frame->format),
+           output_frame->width, output_frame->height, output_frame->pts);
+
+    return ff_filter_frame(outlink, output_frame);
+
+fail:
+    av_frame_free(&input_frame);
+    av_frame_free(&output_frame);
+    return err;
+}
+
+static av_cold int tonemap_vaapi_init(AVFilterContext *avctx)
+{
+    VAAPIVPPContext *vpp_ctx = avctx->priv;
+    HDRVAAPIContext *ctx     = avctx->priv;
+
+    ff_vaapi_vpp_ctx_init(avctx);
+    vpp_ctx->build_filter_params = tonemap_vaapi_build_filter_params;
+    vpp_ctx->pipeline_uninit = ff_vaapi_vpp_pipeline_uninit;
+
+    if (ctx->output_format_string) {
+        vpp_ctx->output_format = av_get_pix_fmt(ctx->output_format_string);
+        switch (vpp_ctx->output_format) {
+        case AV_PIX_FMT_NV12:
+        case AV_PIX_FMT_P010:
+            break;
+        default:
+            av_log(avctx, AV_LOG_ERROR, "Invalid output format.\n");
+            return AVERROR(EINVAL);
+        }
+    } else {
+        vpp_ctx->output_format = AV_PIX_FMT_NV12;
+        av_log(avctx, AV_LOG_WARNING, "Output format not set, use default format NV12\n");
+    }
+
+#define STRING_OPTION(var_name, func_name, default_value) do { \
+        if (ctx->var_name ## _string) { \
+            int var = av_ ## func_name ## _from_name(ctx->var_name ## _string); \
+            if (var < 0) { \
+                av_log(avctx, AV_LOG_ERROR, "Invalid %s.\n", #var_name); \
+                return AVERROR(EINVAL); \
+            } \
+            ctx->var_name = var; \
+        } else { \
+            ctx->var_name = default_value; \
+        } \
+    } while (0)
+
+    STRING_OPTION(color_primaries, color_primaries, AVCOL_PRI_UNSPECIFIED);
+    STRING_OPTION(color_transfer,  color_transfer,  AVCOL_TRC_UNSPECIFIED);
+    STRING_OPTION(color_matrix,    color_space,     AVCOL_SPC_UNSPECIFIED);
+
+    return 0;
+}
+
+#define OFFSET(x) offsetof(HDRVAAPIContext, x)
+#define FLAGS (AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_FILTERING_PARAM)
+static const AVOption tonemap_vaapi_options[] = {
+    { "format", "Output pixel format set", OFFSET(output_format_string), AV_OPT_TYPE_STRING, .flags = FLAGS, "format" },
+    { "matrix", "Output color matrix coefficient set",
+      OFFSET(color_matrix_string), AV_OPT_TYPE_STRING,
+      { .str = NULL }, .flags = FLAGS, "matrix" },
+    { "m",      "Output color matrix coefficient set",
+      OFFSET(color_matrix_string), AV_OPT_TYPE_STRING,
+      { .str = NULL }, .flags = FLAGS, "matrix" },
+    { "primaries", "Output color primaries set",
+      OFFSET(color_primaries_string), AV_OPT_TYPE_STRING,
+      { .str = NULL }, .flags = FLAGS, "primaries" },
+    { "p",         "Output color primaries set",
+      OFFSET(color_primaries_string), AV_OPT_TYPE_STRING,
+      { .str = NULL }, .flags = FLAGS, "primaries" },
+    { "transfer", "Output color transfer characteristics set",
+      OFFSET(color_transfer_string),  AV_OPT_TYPE_STRING,
+      { .str = NULL }, .flags = FLAGS, "transfer" },
+    { "t",        "Output color transfer characteristics set",
+      OFFSET(color_transfer_string),  AV_OPT_TYPE_STRING,
+      { .str = NULL }, .flags = FLAGS, "transfer" },
+    { NULL }
+};
+
+
+AVFILTER_DEFINE_CLASS(tonemap_vaapi);
+
+static const AVFilterPad tonemap_vaapi_inputs[] = {
+    {
+        .name         = "default",
+        .type         = AVMEDIA_TYPE_VIDEO,
+        .filter_frame = &tonemap_vaapi_filter_frame,
+        .config_props = &ff_vaapi_vpp_config_input,
+    },
+    { NULL }
+};
+
+static const AVFilterPad tonemap_vaapi_outputs[] = {
+    {
+        .name = "default",
+        .type = AVMEDIA_TYPE_VIDEO,
+        .config_props = &ff_vaapi_vpp_config_output,
+    },
+    { NULL }
+};
+
+AVFilter ff_vf_tonemap_vaapi = {
+    .name           = "tonemap_vaapi",
+    .description    = NULL_IF_CONFIG_SMALL("VAAPI VPP for tone-mapping"),
+    .priv_size      = sizeof(HDRVAAPIContext),
+    .init           = &tonemap_vaapi_init,
+    .uninit         = &ff_vaapi_vpp_ctx_uninit,
+    .query_formats  = &ff_vaapi_vpp_query_formats,
+    .inputs         = tonemap_vaapi_inputs,
+    .outputs        = tonemap_vaapi_outputs,
+    .priv_class     = &tonemap_vaapi_class,
+    .flags_internal = FF_FILTER_FLAG_HWFRAME_AWARE,
+};
diff --git a/libavfilter/vf_tpad.c b/libavfilter/vf_tpad.c
new file mode 100644
index 0000000..0cd65d3
--- /dev/null
+++ b/libavfilter/vf_tpad.c
@@ -0,0 +1,218 @@
+/*
+ * Copyright (c) 2018 Paul B Mahol
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "libavutil/avassert.h"
+#include "libavutil/channel_layout.h"
+#include "libavutil/opt.h"
+#include "avfilter.h"
+#include "audio.h"
+#include "filters.h"
+#include "internal.h"
+#include "formats.h"
+#include "drawutils.h"
+
+typedef struct TPadContext {
+    const AVClass *class;
+    int pad_start;
+    int pad_stop;
+    int start_mode;
+    int stop_mode;
+    int64_t start_duration;
+    int64_t stop_duration;
+    uint8_t rgba_color[4];  ///< color for the padding area
+
+    FFDrawContext draw;
+    FFDrawColor color;
+    int64_t pts;
+    int eof;
+    AVFrame *cache_start;
+    AVFrame *cache_stop;
+} TPadContext;
+
+#define OFFSET(x) offsetof(TPadContext, x)
+#define VF AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
+
+static const AVOption tpad_options[] = {
+    { "start", "set the number of frames to delay input",              OFFSET(pad_start),  AV_OPT_TYPE_INT,   {.i64=0},        0,   INT_MAX, VF },
+    { "stop",  "set the number of frames to add after input finished", OFFSET(pad_stop),   AV_OPT_TYPE_INT,   {.i64=0},       -1,   INT_MAX, VF },
+    { "start_mode", "set the mode of added frames to start",           OFFSET(start_mode), AV_OPT_TYPE_INT,   {.i64=0},        0,         1, VF, "mode" },
+    { "add",   "add solid-color frames",                               0,                  AV_OPT_TYPE_CONST, {.i64=0},        0,         0, VF, "mode" },
+    { "clone", "clone first/last frame",                               0,                  AV_OPT_TYPE_CONST, {.i64=1},        0,         0, VF, "mode" },
+    { "stop_mode",  "set the mode of added frames to end",             OFFSET(stop_mode),  AV_OPT_TYPE_INT,   {.i64=0},        0,         1, VF, "mode" },
+    { "start_duration", "set the duration to delay input",             OFFSET(start_duration), AV_OPT_TYPE_DURATION, {.i64=0}, 0, INT64_MAX, VF },
+    { "stop_duration",  "set the duration to pad input",               OFFSET(stop_duration),  AV_OPT_TYPE_DURATION, {.i64=0}, 0, INT64_MAX, VF },
+    { "color", "set the color of the added frames",                    OFFSET(rgba_color), AV_OPT_TYPE_COLOR, {.str="black"},  0,         0, VF },
+    { NULL }
+};
+
+AVFILTER_DEFINE_CLASS(tpad);
+
+static int query_formats(AVFilterContext *ctx)
+{
+    return ff_set_common_formats(ctx, ff_draw_supported_pixel_formats(0));
+}
+
+static int activate(AVFilterContext *ctx)
+{
+    AVFilterLink *inlink = ctx->inputs[0];
+    AVFilterLink *outlink = ctx->outputs[0];
+    TPadContext *s = ctx->priv;
+    AVFrame *frame = NULL;
+    int ret, status;
+    int64_t pts;
+
+    FF_FILTER_FORWARD_STATUS_BACK(outlink, inlink);
+
+    if (s->start_mode == 0 && s->pad_start > 0 && ff_outlink_frame_wanted(outlink)) {
+        frame = ff_get_video_buffer(outlink, outlink->w, outlink->h);
+        if (!frame)
+            return AVERROR(ENOMEM);
+        ff_fill_rectangle(&s->draw, &s->color,
+                          frame->data, frame->linesize,
+                          0, 0, frame->width, frame->height);
+        frame->pts = s->pts;
+        s->pts += av_rescale_q(1, av_inv_q(outlink->frame_rate), outlink->time_base);
+        s->pad_start--;
+        return ff_filter_frame(outlink, frame);
+    }
+
+    if (s->start_mode == 1 && s->pad_start > 0) {
+        if (!s->cache_start && ff_inlink_queued_frames(inlink)) {
+            s->cache_start = ff_inlink_peek_frame(inlink, 0);
+        } else if (!s->cache_start) {
+            FF_FILTER_FORWARD_WANTED(outlink, inlink);
+        }
+        frame = av_frame_clone(s->cache_start);
+        if (!frame)
+            return AVERROR(ENOMEM);
+        frame->pts = s->pts;
+        s->pts += av_rescale_q(1, av_inv_q(outlink->frame_rate), outlink->time_base);
+        s->pad_start--;
+        if (s->pad_start == 0)
+            s->cache_start = NULL;
+        return ff_filter_frame(outlink, frame);
+    }
+
+    if (!s->eof && !s->pad_start) {
+        ret = ff_inlink_consume_frame(inlink, &frame);
+        if (ret < 0)
+            return ret;
+        if (ret > 0) {
+            if (s->stop_mode == 1 && s->pad_stop != 0) {
+                av_frame_free(&s->cache_stop);
+                s->cache_stop = av_frame_clone(frame);
+            }
+            frame->pts += s->pts;
+            return ff_filter_frame(outlink, frame);
+        }
+    }
+
+    if (!s->eof && ff_inlink_acknowledge_status(inlink, &status, &pts)) {
+        if (status == AVERROR_EOF) {
+            if (!s->pad_stop) {
+                ff_outlink_set_status(outlink, status, pts);
+                return 0;
+            }
+            s->eof = 1;
+            s->pts += pts;
+        }
+    }
+
+    if (s->eof) {
+        if (!s->pad_stop) {
+            ff_outlink_set_status(outlink, AVERROR_EOF, s->pts);
+            return 0;
+        }
+        if (s->stop_mode == 0) {
+            frame = ff_get_video_buffer(outlink, outlink->w, outlink->h);
+            if (!frame)
+                return AVERROR(ENOMEM);
+            ff_fill_rectangle(&s->draw, &s->color,
+                              frame->data, frame->linesize,
+                              0, 0, frame->width, frame->height);
+        } else if (s->stop_mode == 1) {
+            frame = av_frame_clone(s->cache_stop);
+            if (!frame)
+                return AVERROR(ENOMEM);
+        }
+        frame->pts = s->pts;
+        s->pts += av_rescale_q(1, av_inv_q(outlink->frame_rate), outlink->time_base);
+        if (s->pad_stop > 0)
+            s->pad_stop--;
+        return ff_filter_frame(outlink, frame);
+    }
+
+    if (!s->pad_start)
+        FF_FILTER_FORWARD_WANTED(outlink, inlink);
+
+    return FFERROR_NOT_READY;
+}
+
+static int config_input(AVFilterLink *inlink)
+{
+    AVFilterContext *ctx = inlink->dst;
+    TPadContext *s = ctx->priv;
+
+    ff_draw_init(&s->draw, inlink->format, 0);
+    ff_draw_color(&s->draw, &s->color, s->rgba_color);
+
+    if (s->start_duration)
+        s->pad_start = av_rescale_q(s->start_duration, inlink->frame_rate, av_inv_q(AV_TIME_BASE_Q));
+    if (s->stop_duration)
+        s->pad_stop = av_rescale_q(s->stop_duration, inlink->frame_rate, av_inv_q(AV_TIME_BASE_Q));
+
+    return 0;
+}
+
+static av_cold void uninit(AVFilterContext *ctx)
+{
+    TPadContext *s = ctx->priv;
+
+    av_frame_free(&s->cache_stop);
+}
+
+static const AVFilterPad tpad_inputs[] = {
+    {
+        .name         = "default",
+        .type         = AVMEDIA_TYPE_VIDEO,
+        .config_props = config_input,
+    },
+    { NULL }
+};
+
+static const AVFilterPad tpad_outputs[] = {
+    {
+        .name = "default",
+        .type = AVMEDIA_TYPE_VIDEO,
+    },
+    { NULL }
+};
+
+AVFilter ff_vf_tpad = {
+    .name          = "tpad",
+    .description   = NULL_IF_CONFIG_SMALL("Temporarily pad video frames."),
+    .priv_size     = sizeof(TPadContext),
+    .priv_class    = &tpad_class,
+    .query_formats = query_formats,
+    .activate      = activate,
+    .uninit        = uninit,
+    .inputs        = tpad_inputs,
+    .outputs       = tpad_outputs,
+};
diff --git a/libavfilter/vf_transpose.c b/libavfilter/vf_transpose.c
index 74a4bbc..cb49c4a 100644
--- a/libavfilter/vf_transpose.c
+++ b/libavfilter/vf_transpose.c
@@ -38,27 +38,7 @@
 #include "formats.h"
 #include "internal.h"
 #include "video.h"
-
-typedef enum {
-    TRANSPOSE_PT_TYPE_NONE,
-    TRANSPOSE_PT_TYPE_LANDSCAPE,
-    TRANSPOSE_PT_TYPE_PORTRAIT,
-} PassthroughType;
-
-enum TransposeDir {
-    TRANSPOSE_CCLOCK_FLIP,
-    TRANSPOSE_CLOCK,
-    TRANSPOSE_CCLOCK,
-    TRANSPOSE_CLOCK_FLIP,
-};
-
-typedef struct TransVtable {
-    void (*transpose_8x8)(uint8_t *src, ptrdiff_t src_linesize,
-                          uint8_t *dst, ptrdiff_t dst_linesize);
-    void (*transpose_block)(uint8_t *src, ptrdiff_t src_linesize,
-                            uint8_t *dst, ptrdiff_t dst_linesize,
-                            int w, int h);
-} TransVtable;
+#include "transpose.h"
 
 typedef struct TransContext {
     const AVClass *class;
@@ -255,6 +235,14 @@
         }
     }
 
+    if (ARCH_X86) {
+        for (int i = 0; i < 4; i++) {
+            TransVtable *v = &s->vtables[i];
+
+            ff_transpose_init_x86(v, s->pixsteps[i]);
+        }
+    }
+
     av_log(ctx, AV_LOG_VERBOSE,
            "w:%d h:%d dir:%d -> w:%d h:%d rotation:%s vflip:%d\n",
            inlink->w, inlink->h, s->dir, outlink->w, outlink->h,
diff --git a/libavfilter/vf_transpose_npp.c b/libavfilter/vf_transpose_npp.c
index 1b3a5c0..3ea0316 100644
--- a/libavfilter/vf_transpose_npp.c
+++ b/libavfilter/vf_transpose_npp.c
@@ -23,6 +23,7 @@
 #include "libavutil/common.h"
 #include "libavutil/hwcontext.h"
 #include "libavutil/hwcontext_cuda_internal.h"
+#include "libavutil/cuda_check.h"
 #include "libavutil/internal.h"
 #include "libavutil/opt.h"
 #include "libavutil/pixdesc.h"
@@ -32,6 +33,8 @@
 #include "internal.h"
 #include "video.h"
 
+#define CHECK_CU(x) FF_CUDA_CHECK_DL(ctx, device_hwctx->internal->cuda_dl, x)
+
 static const enum AVPixelFormat supported_formats[] = {
     AV_PIX_FMT_YUV420P,
     AV_PIX_FMT_YUV444P
@@ -397,7 +400,6 @@
     AVHWFramesContext     *frames_ctx = (AVHWFramesContext*)outlink->hw_frames_ctx->data;
     AVCUDADeviceContext *device_hwctx = frames_ctx->device_ctx->hwctx;
     AVFrame *out = NULL;
-    CUresult err;
     CUcontext dummy;
     int ret = 0;
 
@@ -410,15 +412,13 @@
         goto fail;
     }
 
-    err = device_hwctx->internal->cuda_dl->cuCtxPushCurrent(device_hwctx->cuda_ctx);
-    if (err != CUDA_SUCCESS) {
-        ret = AVERROR_UNKNOWN;
+    ret = CHECK_CU(device_hwctx->internal->cuda_dl->cuCtxPushCurrent(device_hwctx->cuda_ctx));
+    if (ret < 0)
         goto fail;
-    }
 
     ret = npptranspose_filter(ctx, out, in);
 
-    device_hwctx->internal->cuda_dl->cuCtxPopCurrent(&dummy);
+    CHECK_CU(device_hwctx->internal->cuda_dl->cuCtxPopCurrent(&dummy));
     if (ret < 0)
         goto fail;
 
diff --git a/libavfilter/vf_transpose_opencl.c b/libavfilter/vf_transpose_opencl.c
new file mode 100644
index 0000000..dd678e9
--- /dev/null
+++ b/libavfilter/vf_transpose_opencl.c
@@ -0,0 +1,288 @@
+/*
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+#include <float.h>
+
+#include "libavutil/avassert.h"
+#include "libavutil/common.h"
+#include "libavutil/imgutils.h"
+#include "libavutil/mem.h"
+#include "libavutil/opt.h"
+#include "libavutil/pixdesc.h"
+
+#include "avfilter.h"
+#include "internal.h"
+#include "opencl.h"
+#include "opencl_source.h"
+#include "video.h"
+#include "transpose.h"
+
+typedef struct TransposeOpenCLContext {
+    OpenCLFilterContext ocf;
+    int                   initialised;
+    int passthrough;    ///< PassthroughType, landscape passthrough mode enabled
+    int dir;            ///< TransposeDir
+    cl_kernel             kernel;
+    cl_command_queue      command_queue;
+} TransposeOpenCLContext;
+
+static int transpose_opencl_init(AVFilterContext *avctx)
+{
+    TransposeOpenCLContext *ctx = avctx->priv;
+    cl_int cle;
+    int err;
+
+    err = ff_opencl_filter_load_program(avctx, &ff_opencl_source_transpose, 1);
+    if (err < 0)
+        goto fail;
+
+    ctx->command_queue = clCreateCommandQueue(ctx->ocf.hwctx->context,
+                                              ctx->ocf.hwctx->device_id,
+                                              0, &cle);
+    CL_FAIL_ON_ERROR(AVERROR(EIO), "Failed to create OpenCL "
+                     "command queue %d.\n", cle);
+
+    ctx->kernel = clCreateKernel(ctx->ocf.program, "transpose", &cle);
+    CL_FAIL_ON_ERROR(AVERROR(EIO), "Failed to create kernel %d.\n", cle);
+
+
+    ctx->initialised = 1;
+    return 0;
+
+fail:
+    if (ctx->command_queue)
+        clReleaseCommandQueue(ctx->command_queue);
+    if (ctx->kernel)
+        clReleaseKernel(ctx->kernel);
+    return err;
+}
+
+static int transpose_opencl_config_output(AVFilterLink *outlink)
+{
+    AVFilterContext *avctx = outlink->src;
+    TransposeOpenCLContext *s = avctx->priv;
+    AVFilterLink *inlink = avctx->inputs[0];
+    const AVPixFmtDescriptor *desc_in  = av_pix_fmt_desc_get(inlink->format);
+    int ret;
+
+    if ((inlink->w >= inlink->h &&
+         s->passthrough == TRANSPOSE_PT_TYPE_LANDSCAPE) ||
+        (inlink->w <= inlink->h &&
+         s->passthrough == TRANSPOSE_PT_TYPE_PORTRAIT)) {
+        if (inlink->hw_frames_ctx) {
+            outlink->hw_frames_ctx = av_buffer_ref(inlink->hw_frames_ctx);
+            if (!outlink->hw_frames_ctx)
+                return AVERROR(ENOMEM);
+        }
+        av_log(avctx, AV_LOG_VERBOSE,
+               "w:%d h:%d -> w:%d h:%d (passthrough mode)\n",
+               inlink->w, inlink->h, inlink->w, inlink->h);
+
+        return 0;
+    } else {
+        s->passthrough = TRANSPOSE_PT_TYPE_NONE;
+    }
+
+    if (desc_in->log2_chroma_w != desc_in->log2_chroma_h) {
+        av_log(avctx, AV_LOG_ERROR, "Input format %s not supported.\n",
+               desc_in->name);
+        return AVERROR(EINVAL);
+    }
+
+    s->ocf.output_width = inlink->h;
+    s->ocf.output_height = inlink->w;
+    ret = ff_opencl_filter_config_output(outlink);
+    if (ret < 0)
+        return ret;
+
+    if (inlink->sample_aspect_ratio.num)
+        outlink->sample_aspect_ratio = av_div_q((AVRational) { 1, 1 },
+                                                inlink->sample_aspect_ratio);
+    else
+        outlink->sample_aspect_ratio = inlink->sample_aspect_ratio;
+
+    av_log(avctx, AV_LOG_VERBOSE,
+           "w:%d h:%d dir:%d -> w:%d h:%d rotation:%s vflip:%d\n",
+           inlink->w, inlink->h, s->dir, outlink->w, outlink->h,
+           s->dir == 1 || s->dir == 3 ? "clockwise" : "counterclockwise",
+           s->dir == 0 || s->dir == 3);
+    return 0;
+}
+
+static AVFrame *get_video_buffer(AVFilterLink *inlink, int w, int h)
+{
+    TransposeOpenCLContext *s = inlink->dst->priv;
+
+    return s->passthrough ?
+        ff_null_get_video_buffer   (inlink, w, h) :
+        ff_default_get_video_buffer(inlink, w, h);
+}
+
+static int transpose_opencl_filter_frame(AVFilterLink *inlink, AVFrame *input)
+{
+    AVFilterContext    *avctx = inlink->dst;
+    AVFilterLink     *outlink = avctx->outputs[0];
+    TransposeOpenCLContext *ctx = avctx->priv;
+    AVFrame *output = NULL;
+    size_t global_work[2];
+    cl_mem src, dst;
+    cl_int cle;
+    int err, p;
+
+    av_log(ctx, AV_LOG_DEBUG, "Filter input: %s, %ux%u (%"PRId64").\n",
+           av_get_pix_fmt_name(input->format),
+           input->width, input->height, input->pts);
+
+    if (!input->hw_frames_ctx)
+        return AVERROR(EINVAL);
+
+    if (ctx->passthrough)
+        return ff_filter_frame(outlink, input);
+
+    output = ff_get_video_buffer(outlink, outlink->w, outlink->h);
+    if (!output) {
+        err = AVERROR(ENOMEM);
+        goto fail;
+    }
+
+    err = av_frame_copy_props(output, input);
+    if (err < 0)
+        goto fail;
+
+    if (input->sample_aspect_ratio.num == 0) {
+        output->sample_aspect_ratio = input->sample_aspect_ratio;
+    } else {
+        output->sample_aspect_ratio.num = input->sample_aspect_ratio.den;
+        output->sample_aspect_ratio.den = input->sample_aspect_ratio.num;
+    }
+
+    if (!ctx->initialised) {
+        err = transpose_opencl_init(avctx);
+        if (err < 0)
+            goto fail;
+    }
+
+    for (p = 0; p < FF_ARRAY_ELEMS(output->data); p++) {
+        src = (cl_mem) input->data[p];
+        dst = (cl_mem) output->data[p];
+
+        if (!dst)
+            break;
+        CL_SET_KERNEL_ARG(ctx->kernel, 0, cl_mem, &dst);
+        CL_SET_KERNEL_ARG(ctx->kernel, 1, cl_mem, &src);
+        CL_SET_KERNEL_ARG(ctx->kernel, 2, cl_int, &ctx->dir);
+
+        err = ff_opencl_filter_work_size_from_image(avctx, global_work, output,
+                                                    p, 16);
+
+        cle = clEnqueueNDRangeKernel(ctx->command_queue, ctx->kernel, 2, NULL,
+                                     global_work, NULL,
+                                     0, NULL, NULL);
+        CL_FAIL_ON_ERROR(AVERROR(EIO), "Failed to enqueue kernel: %d.\n", cle);
+    }
+    cle = clFinish(ctx->command_queue);
+    CL_FAIL_ON_ERROR(AVERROR(EIO), "Failed to finish command queue: %d.\n", cle);
+
+    av_frame_free(&input);
+
+    av_log(ctx, AV_LOG_DEBUG, "Filter output: %s, %ux%u (%"PRId64").\n",
+           av_get_pix_fmt_name(output->format),
+           output->width, output->height, output->pts);
+
+    return ff_filter_frame(outlink, output);
+
+fail:
+    clFinish(ctx->command_queue);
+    av_frame_free(&input);
+    av_frame_free(&output);
+    return err;
+}
+
+static av_cold void transpose_opencl_uninit(AVFilterContext *avctx)
+{
+    TransposeOpenCLContext *ctx = avctx->priv;
+    cl_int cle;
+
+    if (ctx->kernel) {
+        cle = clReleaseKernel(ctx->kernel);
+        if (cle != CL_SUCCESS)
+            av_log(avctx, AV_LOG_ERROR, "Failed to release "
+                   "kernel: %d.\n", cle);
+    }
+
+    if (ctx->command_queue) {
+        cle = clReleaseCommandQueue(ctx->command_queue);
+        if (cle != CL_SUCCESS)
+            av_log(avctx, AV_LOG_ERROR, "Failed to release "
+                   "command queue: %d.\n", cle);
+    }
+
+    ff_opencl_filter_uninit(avctx);
+}
+
+#define OFFSET(x) offsetof(TransposeOpenCLContext, x)
+#define FLAGS (AV_OPT_FLAG_FILTERING_PARAM | AV_OPT_FLAG_VIDEO_PARAM)
+static const AVOption transpose_opencl_options[] = {
+    { "dir", "set transpose direction", OFFSET(dir), AV_OPT_TYPE_INT, { .i64 = TRANSPOSE_CCLOCK_FLIP }, 0, 3, FLAGS, "dir" },
+        { "cclock_flip", "rotate counter-clockwise with vertical flip", 0, AV_OPT_TYPE_CONST, { .i64 = TRANSPOSE_CCLOCK_FLIP }, .flags=FLAGS, .unit = "dir" },
+        { "clock",       "rotate clockwise",                            0, AV_OPT_TYPE_CONST, { .i64 = TRANSPOSE_CLOCK       }, .flags=FLAGS, .unit = "dir" },
+        { "cclock",      "rotate counter-clockwise",                    0, AV_OPT_TYPE_CONST, { .i64 = TRANSPOSE_CCLOCK      }, .flags=FLAGS, .unit = "dir" },
+        { "clock_flip",  "rotate clockwise with vertical flip",         0, AV_OPT_TYPE_CONST, { .i64 = TRANSPOSE_CLOCK_FLIP  }, .flags=FLAGS, .unit = "dir" },
+
+    { "passthrough", "do not apply transposition if the input matches the specified geometry",
+      OFFSET(passthrough), AV_OPT_TYPE_INT, {.i64=TRANSPOSE_PT_TYPE_NONE},  0, INT_MAX, FLAGS, "passthrough" },
+        { "none",      "always apply transposition",   0, AV_OPT_TYPE_CONST, {.i64=TRANSPOSE_PT_TYPE_NONE},      INT_MIN, INT_MAX, FLAGS, "passthrough" },
+        { "portrait",  "preserve portrait geometry",   0, AV_OPT_TYPE_CONST, {.i64=TRANSPOSE_PT_TYPE_PORTRAIT},  INT_MIN, INT_MAX, FLAGS, "passthrough" },
+        { "landscape", "preserve landscape geometry",  0, AV_OPT_TYPE_CONST, {.i64=TRANSPOSE_PT_TYPE_LANDSCAPE}, INT_MIN, INT_MAX, FLAGS, "passthrough" },
+
+    { NULL }
+};
+
+AVFILTER_DEFINE_CLASS(transpose_opencl);
+
+static const AVFilterPad transpose_opencl_inputs[] = {
+    {
+        .name         = "default",
+        .type         = AVMEDIA_TYPE_VIDEO,
+        .get_video_buffer = get_video_buffer,
+        .filter_frame = &transpose_opencl_filter_frame,
+        .config_props = &ff_opencl_filter_config_input,
+    },
+    { NULL }
+};
+
+static const AVFilterPad transpose_opencl_outputs[] = {
+    {
+        .name         = "default",
+        .type         = AVMEDIA_TYPE_VIDEO,
+        .config_props = &transpose_opencl_config_output,
+    },
+    { NULL }
+};
+
+AVFilter ff_vf_transpose_opencl = {
+    .name           = "transpose_opencl",
+    .description    = NULL_IF_CONFIG_SMALL("Transpose input video"),
+    .priv_size      = sizeof(TransposeOpenCLContext),
+    .priv_class     = &transpose_opencl_class,
+    .init           = &ff_opencl_filter_init,
+    .uninit         = &transpose_opencl_uninit,
+    .query_formats  = &ff_opencl_filter_query_formats,
+    .inputs         = transpose_opencl_inputs,
+    .outputs        = transpose_opencl_outputs,
+    .flags_internal = FF_FILTER_FLAG_HWFRAME_AWARE,
+};
diff --git a/libavfilter/vf_transpose_vaapi.c b/libavfilter/vf_transpose_vaapi.c
new file mode 100644
index 0000000..a4c6542
--- /dev/null
+++ b/libavfilter/vf_transpose_vaapi.c
@@ -0,0 +1,288 @@
+/*
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+#include <string.h>
+
+#include "libavutil/avassert.h"
+#include "libavutil/mem.h"
+#include "libavutil/opt.h"
+#include "libavutil/pixdesc.h"
+
+#include "avfilter.h"
+#include "formats.h"
+#include "internal.h"
+#include "transpose.h"
+#include "vaapi_vpp.h"
+
+typedef struct TransposeVAAPIContext {
+    VAAPIVPPContext vpp_ctx; // must be the first field
+    int passthrough;         // PassthroughType, landscape passthrough mode enabled
+    int dir;                 // TransposeDir
+
+    int rotation_state;
+    int mirror_state;
+} TransposeVAAPIContext;
+
+static int transpose_vaapi_build_filter_params(AVFilterContext *avctx)
+{
+    VAAPIVPPContext *vpp_ctx   = avctx->priv;
+    TransposeVAAPIContext *ctx = avctx->priv;
+    VAStatus vas;
+    int support_flag;
+    VAProcPipelineCaps pipeline_caps;
+
+    memset(&pipeline_caps, 0, sizeof(pipeline_caps));
+    vas = vaQueryVideoProcPipelineCaps(vpp_ctx->hwctx->display,
+                                       vpp_ctx->va_context,
+                                       NULL, 0,
+                                       &pipeline_caps);
+    if (vas != VA_STATUS_SUCCESS) {
+        av_log(avctx, AV_LOG_ERROR, "Failed to query pipeline "
+               "caps: %d (%s).\n", vas, vaErrorStr(vas));
+        return AVERROR(EIO);
+    }
+
+    if (!pipeline_caps.rotation_flags) {
+        av_log(avctx, AV_LOG_ERROR, "VAAPI driver doesn't support transpose\n");
+        return AVERROR(EINVAL);
+    }
+
+    switch (ctx->dir) {
+    case TRANSPOSE_CCLOCK_FLIP:
+        ctx->rotation_state = VA_ROTATION_270;
+        ctx->mirror_state   = VA_MIRROR_VERTICAL;
+        break;
+    case TRANSPOSE_CLOCK:
+        ctx->rotation_state = VA_ROTATION_90;
+        ctx->mirror_state   = VA_MIRROR_NONE;
+        break;
+    case TRANSPOSE_CCLOCK:
+        ctx->rotation_state = VA_ROTATION_270;
+        ctx->mirror_state   = VA_MIRROR_NONE;
+        break;
+    case TRANSPOSE_CLOCK_FLIP:
+        ctx->rotation_state = VA_ROTATION_90;
+        ctx->mirror_state   = VA_MIRROR_VERTICAL;
+        break;
+    case TRANSPOSE_REVERSAL:
+        ctx->rotation_state = VA_ROTATION_180;
+        ctx->mirror_state   = VA_MIRROR_NONE;
+        break;
+    case TRANSPOSE_HFLIP:
+        ctx->rotation_state = VA_ROTATION_NONE;
+        ctx->mirror_state   = VA_MIRROR_HORIZONTAL;
+        break;
+    case TRANSPOSE_VFLIP:
+        ctx->rotation_state = VA_ROTATION_NONE;
+        ctx->mirror_state   = VA_MIRROR_VERTICAL;
+        break;
+    default:
+        av_log(avctx, AV_LOG_ERROR, "Failed to set direction to %d\n", ctx->dir);
+        return AVERROR(EINVAL);
+    }
+
+    if (VA_ROTATION_NONE != ctx->rotation_state) {
+        support_flag = pipeline_caps.rotation_flags & (1 << ctx->rotation_state);
+        if (!support_flag) {
+            av_log(avctx, AV_LOG_ERROR, "VAAPI driver doesn't support rotation %d\n",
+                   ctx->rotation_state);
+            return AVERROR(EINVAL);
+        }
+    }
+
+    if (VA_MIRROR_NONE != ctx->mirror_state) {
+        support_flag = pipeline_caps.mirror_flags & ctx->mirror_state;
+        if (!support_flag) {
+            av_log(avctx, AV_LOG_ERROR, "VAAPI driver doesn't support mirror %d\n",
+                   ctx->mirror_state);
+            return AVERROR(EINVAL);
+        }
+    }
+
+    return 0;
+}
+
+static int transpose_vaapi_filter_frame(AVFilterLink *inlink, AVFrame *input_frame)
+{
+    AVFilterContext *avctx     = inlink->dst;
+    AVFilterLink *outlink      = avctx->outputs[0];
+    VAAPIVPPContext *vpp_ctx   = avctx->priv;
+    TransposeVAAPIContext *ctx = avctx->priv;
+    AVFrame *output_frame      = NULL;
+    VAProcPipelineParameterBuffer params;
+    int err;
+
+    if (ctx->passthrough)
+        return ff_filter_frame(outlink, input_frame);
+
+    av_log(avctx, AV_LOG_DEBUG, "Filter input: %s, %ux%u (%"PRId64").\n",
+           av_get_pix_fmt_name(input_frame->format),
+           input_frame->width, input_frame->height, input_frame->pts);
+
+    if (vpp_ctx->va_context == VA_INVALID_ID)
+        return AVERROR(EINVAL);
+
+    output_frame = ff_get_video_buffer(outlink, vpp_ctx->output_width,
+                                       vpp_ctx->output_height);
+    if (!output_frame) {
+        err = AVERROR(ENOMEM);
+        goto fail;
+    }
+
+    err = av_frame_copy_props(output_frame, input_frame);
+    if (err < 0)
+        goto fail;
+
+    err = ff_vaapi_vpp_init_params(avctx, &params,
+                                   input_frame, output_frame);
+    if (err < 0)
+        goto fail;
+
+    params.rotation_state = ctx->rotation_state;
+    params.mirror_state   = ctx->mirror_state;
+
+    err = ff_vaapi_vpp_render_picture(avctx, &params, output_frame);
+    if (err < 0)
+        goto fail;
+
+    av_frame_free(&input_frame);
+
+    av_log(avctx, AV_LOG_DEBUG, "Filter output: %s, %ux%u (%"PRId64").\n",
+           av_get_pix_fmt_name(output_frame->format),
+           output_frame->width, output_frame->height, output_frame->pts);
+
+    return ff_filter_frame(outlink, output_frame);
+
+fail:
+    av_frame_free(&input_frame);
+    av_frame_free(&output_frame);
+    return err;
+}
+
+static av_cold int transpose_vaapi_init(AVFilterContext *avctx)
+{
+    VAAPIVPPContext *vpp_ctx = avctx->priv;
+
+    ff_vaapi_vpp_ctx_init(avctx);
+    vpp_ctx->pipeline_uninit     = ff_vaapi_vpp_pipeline_uninit;
+    vpp_ctx->build_filter_params = transpose_vaapi_build_filter_params;
+    vpp_ctx->output_format       = AV_PIX_FMT_NONE;
+
+    return 0;
+}
+
+static int transpose_vaapi_vpp_config_output(AVFilterLink *outlink)
+{
+    AVFilterContext *avctx     = outlink->src;
+    VAAPIVPPContext *vpp_ctx   = avctx->priv;
+    TransposeVAAPIContext *ctx = avctx->priv;
+    AVFilterLink *inlink       = avctx->inputs[0];
+
+    if ((inlink->w >= inlink->h && ctx->passthrough == TRANSPOSE_PT_TYPE_LANDSCAPE) ||
+        (inlink->w <= inlink->h && ctx->passthrough == TRANSPOSE_PT_TYPE_PORTRAIT)) {
+        outlink->hw_frames_ctx = av_buffer_ref(inlink->hw_frames_ctx);
+        if (!outlink->hw_frames_ctx)
+            return AVERROR(ENOMEM);
+        av_log(avctx, AV_LOG_VERBOSE,
+               "w:%d h:%d -> w:%d h:%d (passthrough mode)\n",
+               inlink->w, inlink->h, inlink->w, inlink->h);
+        return 0;
+    }
+
+    ctx->passthrough = TRANSPOSE_PT_TYPE_NONE;
+
+    switch (ctx->dir) {
+    case TRANSPOSE_CCLOCK_FLIP:
+    case TRANSPOSE_CCLOCK:
+    case TRANSPOSE_CLOCK:
+    case TRANSPOSE_CLOCK_FLIP:
+        vpp_ctx->output_width  = avctx->inputs[0]->h;
+        vpp_ctx->output_height = avctx->inputs[0]->w;
+        av_log(avctx, AV_LOG_DEBUG, "swap width and height for clock/cclock rotation\n");
+        break;
+    default:
+        break;
+    }
+
+    return ff_vaapi_vpp_config_output(outlink);
+}
+
+static AVFrame *get_video_buffer(AVFilterLink *inlink, int w, int h)
+{
+    TransposeVAAPIContext *ctx = inlink->dst->priv;
+
+    return ctx->passthrough ?
+        ff_null_get_video_buffer(inlink, w, h) :
+        ff_default_get_video_buffer(inlink, w, h);
+}
+
+#define OFFSET(x) offsetof(TransposeVAAPIContext, x)
+#define FLAGS (AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_FILTERING_PARAM)
+static const AVOption transpose_vaapi_options[] = {
+    { "dir", "set transpose direction", OFFSET(dir), AV_OPT_TYPE_INT, { .i64 = TRANSPOSE_CCLOCK_FLIP }, 0, 6, FLAGS, "dir" },
+        { "cclock_flip",   "rotate counter-clockwise with vertical flip", 0, AV_OPT_TYPE_CONST, { .i64 = TRANSPOSE_CCLOCK_FLIP }, .flags=FLAGS, .unit = "dir" },
+        { "clock",         "rotate clockwise",                            0, AV_OPT_TYPE_CONST, { .i64 = TRANSPOSE_CLOCK       }, .flags=FLAGS, .unit = "dir" },
+        { "cclock",        "rotate counter-clockwise",                    0, AV_OPT_TYPE_CONST, { .i64 = TRANSPOSE_CCLOCK      }, .flags=FLAGS, .unit = "dir" },
+        { "clock_flip",    "rotate clockwise with vertical flip",         0, AV_OPT_TYPE_CONST, { .i64 = TRANSPOSE_CLOCK_FLIP  }, .flags=FLAGS, .unit = "dir" },
+        { "reversal",      "rotate by half-turn",                         0, AV_OPT_TYPE_CONST, { .i64 = TRANSPOSE_REVERSAL    }, .flags=FLAGS, .unit = "dir" },
+        { "hflip",         "flip horizontally",                           0, AV_OPT_TYPE_CONST, { .i64 = TRANSPOSE_HFLIP       }, .flags=FLAGS, .unit = "dir" },
+        { "vflip",         "flip vertically",                             0, AV_OPT_TYPE_CONST, { .i64 = TRANSPOSE_VFLIP       }, .flags=FLAGS, .unit = "dir" },
+
+    { "passthrough", "do not apply transposition if the input matches the specified geometry",
+      OFFSET(passthrough), AV_OPT_TYPE_INT, {.i64=TRANSPOSE_PT_TYPE_NONE},  0, INT_MAX, FLAGS, "passthrough" },
+        { "none",      "always apply transposition",   0, AV_OPT_TYPE_CONST, {.i64=TRANSPOSE_PT_TYPE_NONE},      INT_MIN, INT_MAX, FLAGS, "passthrough" },
+        { "portrait",  "preserve portrait geometry",   0, AV_OPT_TYPE_CONST, {.i64=TRANSPOSE_PT_TYPE_PORTRAIT},  INT_MIN, INT_MAX, FLAGS, "passthrough" },
+        { "landscape", "preserve landscape geometry",  0, AV_OPT_TYPE_CONST, {.i64=TRANSPOSE_PT_TYPE_LANDSCAPE}, INT_MIN, INT_MAX, FLAGS, "passthrough" },
+
+    { NULL }
+};
+
+
+AVFILTER_DEFINE_CLASS(transpose_vaapi);
+
+static const AVFilterPad transpose_vaapi_inputs[] = {
+    {
+        .name         = "default",
+        .type         = AVMEDIA_TYPE_VIDEO,
+        .filter_frame = &transpose_vaapi_filter_frame,
+        .get_video_buffer = get_video_buffer,
+        .config_props = &ff_vaapi_vpp_config_input,
+    },
+    { NULL }
+};
+
+static const AVFilterPad transpose_vaapi_outputs[] = {
+    {
+        .name = "default",
+        .type = AVMEDIA_TYPE_VIDEO,
+        .config_props = &transpose_vaapi_vpp_config_output,
+    },
+    { NULL }
+};
+
+AVFilter ff_vf_transpose_vaapi = {
+    .name           = "transpose_vaapi",
+    .description    = NULL_IF_CONFIG_SMALL("VAAPI VPP for transpose"),
+    .priv_size      = sizeof(TransposeVAAPIContext),
+    .init           = &transpose_vaapi_init,
+    .uninit         = &ff_vaapi_vpp_ctx_uninit,
+    .query_formats  = &ff_vaapi_vpp_query_formats,
+    .inputs         = transpose_vaapi_inputs,
+    .outputs        = transpose_vaapi_outputs,
+    .priv_class     = &transpose_vaapi_class,
+    .flags_internal = FF_FILTER_FLAG_HWFRAME_AWARE,
+};
diff --git a/libavfilter/vf_unsharp.c b/libavfilter/vf_unsharp.c
index 41ccc56..7b430b6 100644
--- a/libavfilter/vf_unsharp.c
+++ b/libavfilter/vf_unsharp.c
@@ -47,15 +47,22 @@
 #include "libavutil/pixdesc.h"
 #include "unsharp.h"
 
-static void apply_unsharp(      uint8_t *dst, int dst_stride,
-                          const uint8_t *src, int src_stride,
-                          int width, int height, UnsharpFilterParam *fp)
-{
-    uint32_t **sc = fp->sc;
-    uint32_t sr[MAX_MATRIX_SIZE - 1], tmp1, tmp2;
+typedef struct TheadData {
+    UnsharpFilterParam *fp;
+    uint8_t       *dst;
+    const uint8_t *src;
+    int dst_stride;
+    int src_stride;
+    int width;
+    int height;
+} ThreadData;
 
-    int32_t res;
-    int x, y, z;
+static int unsharp_slice(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
+{
+    ThreadData *td = arg;
+    UnsharpFilterParam *fp = td->fp;
+    uint32_t **sc = fp->sc;
+    uint32_t *sr = fp->sr;
     const uint8_t *src2 = NULL;  //silence a warning
     const int amount = fp->amount;
     const int steps_x = fp->steps_x;
@@ -63,30 +70,54 @@
     const int scalebits = fp->scalebits;
     const int32_t halfscale = fp->halfscale;
 
+    uint8_t *dst = td->dst;
+    const uint8_t *src = td->src;
+    const int dst_stride = td->dst_stride;
+    const int src_stride = td->src_stride;
+    const int width = td->width;
+    const int height = td->height;
+    const int sc_offset = jobnr * 2 * steps_y;
+    const int sr_offset = jobnr * (MAX_MATRIX_SIZE - 1);
+    const int slice_start = (height * jobnr) / nb_jobs;
+    const int slice_end = (height * (jobnr+1)) / nb_jobs;
+
+    int32_t res;
+    int x, y, z;
+    uint32_t tmp1, tmp2;
+
     if (!amount) {
-        av_image_copy_plane(dst, dst_stride, src, src_stride, width, height);
-        return;
+        av_image_copy_plane(dst + slice_start * dst_stride, dst_stride,
+                            src + slice_start * src_stride, src_stride,
+                            width, slice_end - slice_start);
+        return 0;
     }
 
     for (y = 0; y < 2 * steps_y; y++)
-        memset(sc[y], 0, sizeof(sc[y][0]) * (width + 2 * steps_x));
+        memset(sc[sc_offset + y], 0, sizeof(sc[y][0]) * (width + 2 * steps_x));
 
-    for (y = -steps_y; y < height + steps_y; y++) {
+    // if this is not the first tile, we start from (slice_start - steps_y),
+    // so we can get smooth result at slice boundary
+    if (slice_start > steps_y) {
+        src += (slice_start - steps_y) * src_stride;
+        dst += (slice_start - steps_y) * dst_stride;
+    }
+
+    for (y = -steps_y + slice_start; y < steps_y + slice_end; y++) {
         if (y < height)
             src2 = src;
 
-        memset(sr, 0, sizeof(sr[0]) * (2 * steps_x - 1));
+        memset(sr + sr_offset, 0, sizeof(sr[0]) * (2 * steps_x - 1));
         for (x = -steps_x; x < width + steps_x; x++) {
             tmp1 = x <= 0 ? src2[0] : x >= width ? src2[width-1] : src2[x];
             for (z = 0; z < steps_x * 2; z += 2) {
-                tmp2 = sr[z + 0] + tmp1; sr[z + 0] = tmp1;
-                tmp1 = sr[z + 1] + tmp2; sr[z + 1] = tmp2;
+                tmp2 = sr[sr_offset + z + 0] + tmp1; sr[sr_offset + z + 0] = tmp1;
+                tmp1 = sr[sr_offset + z + 1] + tmp2; sr[sr_offset + z + 1] = tmp2;
             }
             for (z = 0; z < steps_y * 2; z += 2) {
-                tmp2 = sc[z + 0][x + steps_x] + tmp1; sc[z + 0][x + steps_x] = tmp1;
-                tmp1 = sc[z + 1][x + steps_x] + tmp2; sc[z + 1][x + steps_x] = tmp2;
+                tmp2 = sc[sc_offset + z + 0][x + steps_x] + tmp1; sc[sc_offset + z + 0][x + steps_x] = tmp1;
+                tmp1 = sc[sc_offset + z + 1][x + steps_x] + tmp2; sc[sc_offset + z + 1][x + steps_x] = tmp2;
             }
-            if (x >= steps_x && y >= steps_y) {
+            if (x >= steps_x && y >= (steps_y + slice_start)) {
                 const uint8_t *srx = src - steps_y * src_stride + x - steps_x;
                 uint8_t *dsx       = dst - steps_y * dst_stride + x - steps_x;
 
@@ -99,6 +130,7 @@
             src += src_stride;
         }
     }
+    return 0;
 }
 
 static int apply_unsharp_c(AVFilterContext *ctx, AVFrame *in, AVFrame *out)
@@ -107,6 +139,8 @@
     UnsharpContext *s = ctx->priv;
     int i, plane_w[3], plane_h[3];
     UnsharpFilterParam *fp[3];
+    ThreadData td;
+
     plane_w[0] = inlink->w;
     plane_w[1] = plane_w[2] = AV_CEIL_RSHIFT(inlink->w, s->hsub);
     plane_h[0] = inlink->h;
@@ -114,7 +148,14 @@
     fp[0] = &s->luma;
     fp[1] = fp[2] = &s->chroma;
     for (i = 0; i < 3; i++) {
-        apply_unsharp(out->data[i], out->linesize[i], in->data[i], in->linesize[i], plane_w[i], plane_h[i], fp[i]);
+        td.fp = fp[i];
+        td.dst = out->data[i];
+        td.src = in->data[i];
+        td.width = plane_w[i];
+        td.height = plane_h[i];
+        td.dst_stride = out->linesize[i];
+        td.src_stride = in->linesize[i];
+        ctx->internal->execute(ctx, unsharp_slice, &td, NULL, FFMIN(plane_h[i], s->nb_threads));
     }
     return 0;
 }
@@ -163,6 +204,7 @@
 static int init_filter_param(AVFilterContext *ctx, UnsharpFilterParam *fp, const char *effect_type, int width)
 {
     int z;
+    UnsharpContext *s = ctx->priv;
     const char *effect = fp->amount == 0 ? "none" : fp->amount < 0 ? "blur" : "sharpen";
 
     if  (!(fp->msize_x & fp->msize_y & 1)) {
@@ -175,7 +217,12 @@
     av_log(ctx, AV_LOG_VERBOSE, "effect:%s type:%s msize_x:%d msize_y:%d amount:%0.2f\n",
            effect, effect_type, fp->msize_x, fp->msize_y, fp->amount / 65535.0);
 
-    for (z = 0; z < 2 * fp->steps_y; z++)
+    fp->sr = av_malloc_array((MAX_MATRIX_SIZE - 1) * s->nb_threads, sizeof(uint32_t));
+    fp->sc = av_mallocz_array(2 * fp->steps_y * s->nb_threads, sizeof(uint32_t *));
+    if (!fp->sr || !fp->sc)
+        return AVERROR(ENOMEM);
+
+    for (z = 0; z < 2 * fp->steps_y * s->nb_threads; z++)
         if (!(fp->sc[z] = av_malloc_array(width + 2 * fp->steps_x,
                                           sizeof(*(fp->sc[z])))))
             return AVERROR(ENOMEM);
@@ -183,39 +230,48 @@
     return 0;
 }
 
-static int config_props(AVFilterLink *link)
+static int config_input(AVFilterLink *inlink)
 {
-    UnsharpContext *s = link->dst->priv;
-    const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(link->format);
+    UnsharpContext *s = inlink->dst->priv;
+    const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(inlink->format);
     int ret;
 
     s->hsub = desc->log2_chroma_w;
     s->vsub = desc->log2_chroma_h;
 
-    ret = init_filter_param(link->dst, &s->luma,   "luma",   link->w);
+    // ensure (height / nb_threads) > 4 * steps_y,
+    // so that we don't have too much overlap between two threads
+    s->nb_threads = FFMIN(ff_filter_get_nb_threads(inlink->dst),
+                          inlink->h / (4 * s->luma.steps_y));
+
+    ret = init_filter_param(inlink->dst, &s->luma,   "luma",   inlink->w);
     if (ret < 0)
         return ret;
-    ret = init_filter_param(link->dst, &s->chroma, "chroma", AV_CEIL_RSHIFT(link->w, s->hsub));
+    ret = init_filter_param(inlink->dst, &s->chroma, "chroma", AV_CEIL_RSHIFT(inlink->w, s->hsub));
     if (ret < 0)
         return ret;
 
     return 0;
 }
 
-static void free_filter_param(UnsharpFilterParam *fp)
+static void free_filter_param(UnsharpFilterParam *fp, int nb_threads)
 {
     int z;
 
-    for (z = 0; z < 2 * fp->steps_y; z++)
-        av_freep(&fp->sc[z]);
+    if (fp->sc) {
+        for (z = 0; z < 2 * fp->steps_y * nb_threads; z++)
+            av_freep(&fp->sc[z]);
+        av_freep(&fp->sc);
+    }
+    av_freep(&fp->sr);
 }
 
 static av_cold void uninit(AVFilterContext *ctx)
 {
     UnsharpContext *s = ctx->priv;
 
-    free_filter_param(&s->luma);
-    free_filter_param(&s->chroma);
+    free_filter_param(&s->luma, s->nb_threads);
+    free_filter_param(&s->chroma, s->nb_threads);
 }
 
 static int filter_frame(AVFilterLink *link, AVFrame *in)
@@ -271,7 +327,7 @@
         .name         = "default",
         .type         = AVMEDIA_TYPE_VIDEO,
         .filter_frame = filter_frame,
-        .config_props = config_props,
+        .config_props = config_input,
     },
     { NULL }
 };
@@ -294,5 +350,5 @@
     .query_formats = query_formats,
     .inputs        = avfilter_vf_unsharp_inputs,
     .outputs       = avfilter_vf_unsharp_outputs,
-    .flags         = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC,
+    .flags         = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC | AVFILTER_FLAG_SLICE_THREADS,
 };
diff --git a/libavfilter/vf_v360.c b/libavfilter/vf_v360.c
new file mode 100644
index 0000000..ebc281d
--- /dev/null
+++ b/libavfilter/vf_v360.c
@@ -0,0 +1,4318 @@
+/*
+ * Copyright (c) 2019 Eugene Lyapustin
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file
+ * 360 video conversion filter.
+ * Principle of operation:
+ *
+ * (for each pixel in output frame)
+ * 1) Calculate OpenGL-like coordinates (x, y, z) for pixel position (i, j)
+ * 2) Apply 360 operations (rotation, mirror) to (x, y, z)
+ * 3) Calculate pixel position (u, v) in input frame
+ * 4) Calculate interpolation window and weight for each pixel
+ *
+ * (for each frame)
+ * 5) Remap input frame to output frame using precalculated data
+ */
+
+#include <math.h>
+
+#include "libavutil/avassert.h"
+#include "libavutil/imgutils.h"
+#include "libavutil/pixdesc.h"
+#include "libavutil/opt.h"
+#include "avfilter.h"
+#include "formats.h"
+#include "internal.h"
+#include "video.h"
+#include "v360.h"
+
+typedef struct ThreadData {
+    AVFrame *in;
+    AVFrame *out;
+} ThreadData;
+
+#define OFFSET(x) offsetof(V360Context, x)
+#define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM
+#define TFLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_RUNTIME_PARAM
+
+static const AVOption v360_options[] = {
+    {     "input", "set input projection",              OFFSET(in), AV_OPT_TYPE_INT,    {.i64=EQUIRECTANGULAR}, 0,    NB_PROJECTIONS-1, FLAGS, "in" },
+    {         "e", "equirectangular",                            0, AV_OPT_TYPE_CONST,  {.i64=EQUIRECTANGULAR}, 0,                   0, FLAGS, "in" },
+    {  "equirect", "equirectangular",                            0, AV_OPT_TYPE_CONST,  {.i64=EQUIRECTANGULAR}, 0,                   0, FLAGS, "in" },
+    {      "c3x2", "cubemap 3x2",                                0, AV_OPT_TYPE_CONST,  {.i64=CUBEMAP_3_2},     0,                   0, FLAGS, "in" },
+    {      "c6x1", "cubemap 6x1",                                0, AV_OPT_TYPE_CONST,  {.i64=CUBEMAP_6_1},     0,                   0, FLAGS, "in" },
+    {       "eac", "equi-angular cubemap",                       0, AV_OPT_TYPE_CONST,  {.i64=EQUIANGULAR},     0,                   0, FLAGS, "in" },
+    {  "dfisheye", "dual fisheye",                               0, AV_OPT_TYPE_CONST,  {.i64=DUAL_FISHEYE},    0,                   0, FLAGS, "in" },
+    {      "flat", "regular video",                              0, AV_OPT_TYPE_CONST,  {.i64=FLAT},            0,                   0, FLAGS, "in" },
+    {"rectilinear", "regular video",                             0, AV_OPT_TYPE_CONST,  {.i64=FLAT},            0,                   0, FLAGS, "in" },
+    {  "gnomonic", "regular video",                              0, AV_OPT_TYPE_CONST,  {.i64=FLAT},            0,                   0, FLAGS, "in" },
+    {    "barrel", "barrel facebook's 360 format",               0, AV_OPT_TYPE_CONST,  {.i64=BARREL},          0,                   0, FLAGS, "in" },
+    {        "fb", "barrel facebook's 360 format",               0, AV_OPT_TYPE_CONST,  {.i64=BARREL},          0,                   0, FLAGS, "in" },
+    {      "c1x6", "cubemap 1x6",                                0, AV_OPT_TYPE_CONST,  {.i64=CUBEMAP_1_6},     0,                   0, FLAGS, "in" },
+    {        "sg", "stereographic",                              0, AV_OPT_TYPE_CONST,  {.i64=STEREOGRAPHIC},   0,                   0, FLAGS, "in" },
+    {  "mercator", "mercator",                                   0, AV_OPT_TYPE_CONST,  {.i64=MERCATOR},        0,                   0, FLAGS, "in" },
+    {      "ball", "ball",                                       0, AV_OPT_TYPE_CONST,  {.i64=BALL},            0,                   0, FLAGS, "in" },
+    {    "hammer", "hammer",                                     0, AV_OPT_TYPE_CONST,  {.i64=HAMMER},          0,                   0, FLAGS, "in" },
+    {"sinusoidal", "sinusoidal",                                 0, AV_OPT_TYPE_CONST,  {.i64=SINUSOIDAL},      0,                   0, FLAGS, "in" },
+    {   "fisheye", "fisheye",                                    0, AV_OPT_TYPE_CONST,  {.i64=FISHEYE},         0,                   0, FLAGS, "in" },
+    {   "pannini", "pannini",                                    0, AV_OPT_TYPE_CONST,  {.i64=PANNINI},         0,                   0, FLAGS, "in" },
+    {"cylindrical", "cylindrical",                               0, AV_OPT_TYPE_CONST,  {.i64=CYLINDRICAL},     0,                   0, FLAGS, "in" },
+    {"tetrahedron", "tetrahedron",                               0, AV_OPT_TYPE_CONST,  {.i64=TETRAHEDRON},     0,                   0, FLAGS, "in" },
+    {"barrelsplit", "barrel split facebook's 360 format",        0, AV_OPT_TYPE_CONST,  {.i64=BARREL_SPLIT},    0,                   0, FLAGS, "in" },
+    {       "tsp", "truncated square pyramid",                   0, AV_OPT_TYPE_CONST,  {.i64=TSPYRAMID},       0,                   0, FLAGS, "in" },
+    { "hequirect", "half equirectangular",                       0, AV_OPT_TYPE_CONST,  {.i64=HEQUIRECTANGULAR},0,                   0, FLAGS, "in" },
+    {        "he", "half equirectangular",                       0, AV_OPT_TYPE_CONST,  {.i64=HEQUIRECTANGULAR},0,                   0, FLAGS, "in" },
+    {    "output", "set output projection",            OFFSET(out), AV_OPT_TYPE_INT,    {.i64=CUBEMAP_3_2},     0,    NB_PROJECTIONS-1, FLAGS, "out" },
+    {         "e", "equirectangular",                            0, AV_OPT_TYPE_CONST,  {.i64=EQUIRECTANGULAR}, 0,                   0, FLAGS, "out" },
+    {  "equirect", "equirectangular",                            0, AV_OPT_TYPE_CONST,  {.i64=EQUIRECTANGULAR}, 0,                   0, FLAGS, "out" },
+    {      "c3x2", "cubemap 3x2",                                0, AV_OPT_TYPE_CONST,  {.i64=CUBEMAP_3_2},     0,                   0, FLAGS, "out" },
+    {      "c6x1", "cubemap 6x1",                                0, AV_OPT_TYPE_CONST,  {.i64=CUBEMAP_6_1},     0,                   0, FLAGS, "out" },
+    {       "eac", "equi-angular cubemap",                       0, AV_OPT_TYPE_CONST,  {.i64=EQUIANGULAR},     0,                   0, FLAGS, "out" },
+    {  "dfisheye", "dual fisheye",                               0, AV_OPT_TYPE_CONST,  {.i64=DUAL_FISHEYE},    0,                   0, FLAGS, "out" },
+    {      "flat", "regular video",                              0, AV_OPT_TYPE_CONST,  {.i64=FLAT},            0,                   0, FLAGS, "out" },
+    {"rectilinear", "regular video",                             0, AV_OPT_TYPE_CONST,  {.i64=FLAT},            0,                   0, FLAGS, "out" },
+    {  "gnomonic", "regular video",                              0, AV_OPT_TYPE_CONST,  {.i64=FLAT},            0,                   0, FLAGS, "out" },
+    {    "barrel", "barrel facebook's 360 format",               0, AV_OPT_TYPE_CONST,  {.i64=BARREL},          0,                   0, FLAGS, "out" },
+    {        "fb", "barrel facebook's 360 format",               0, AV_OPT_TYPE_CONST,  {.i64=BARREL},          0,                   0, FLAGS, "out" },
+    {      "c1x6", "cubemap 1x6",                                0, AV_OPT_TYPE_CONST,  {.i64=CUBEMAP_1_6},     0,                   0, FLAGS, "out" },
+    {        "sg", "stereographic",                              0, AV_OPT_TYPE_CONST,  {.i64=STEREOGRAPHIC},   0,                   0, FLAGS, "out" },
+    {  "mercator", "mercator",                                   0, AV_OPT_TYPE_CONST,  {.i64=MERCATOR},        0,                   0, FLAGS, "out" },
+    {      "ball", "ball",                                       0, AV_OPT_TYPE_CONST,  {.i64=BALL},            0,                   0, FLAGS, "out" },
+    {    "hammer", "hammer",                                     0, AV_OPT_TYPE_CONST,  {.i64=HAMMER},          0,                   0, FLAGS, "out" },
+    {"sinusoidal", "sinusoidal",                                 0, AV_OPT_TYPE_CONST,  {.i64=SINUSOIDAL},      0,                   0, FLAGS, "out" },
+    {   "fisheye", "fisheye",                                    0, AV_OPT_TYPE_CONST,  {.i64=FISHEYE},         0,                   0, FLAGS, "out" },
+    {   "pannini", "pannini",                                    0, AV_OPT_TYPE_CONST,  {.i64=PANNINI},         0,                   0, FLAGS, "out" },
+    {"cylindrical", "cylindrical",                               0, AV_OPT_TYPE_CONST,  {.i64=CYLINDRICAL},     0,                   0, FLAGS, "out" },
+    {"perspective", "perspective",                               0, AV_OPT_TYPE_CONST,  {.i64=PERSPECTIVE},     0,                   0, FLAGS, "out" },
+    {"tetrahedron", "tetrahedron",                               0, AV_OPT_TYPE_CONST,  {.i64=TETRAHEDRON},     0,                   0, FLAGS, "out" },
+    {"barrelsplit", "barrel split facebook's 360 format",        0, AV_OPT_TYPE_CONST,  {.i64=BARREL_SPLIT},    0,                   0, FLAGS, "out" },
+    {       "tsp", "truncated square pyramid",                   0, AV_OPT_TYPE_CONST,  {.i64=TSPYRAMID},       0,                   0, FLAGS, "out" },
+    { "hequirect", "half equirectangular",                       0, AV_OPT_TYPE_CONST,  {.i64=HEQUIRECTANGULAR},0,                   0, FLAGS, "out" },
+    {        "he", "half equirectangular",                       0, AV_OPT_TYPE_CONST,  {.i64=HEQUIRECTANGULAR},0,                   0, FLAGS, "out" },
+    {    "interp", "set interpolation method",      OFFSET(interp), AV_OPT_TYPE_INT,    {.i64=BILINEAR},        0, NB_INTERP_METHODS-1, FLAGS, "interp" },
+    {      "near", "nearest neighbour",                          0, AV_OPT_TYPE_CONST,  {.i64=NEAREST},         0,                   0, FLAGS, "interp" },
+    {   "nearest", "nearest neighbour",                          0, AV_OPT_TYPE_CONST,  {.i64=NEAREST},         0,                   0, FLAGS, "interp" },
+    {      "line", "bilinear interpolation",                     0, AV_OPT_TYPE_CONST,  {.i64=BILINEAR},        0,                   0, FLAGS, "interp" },
+    {    "linear", "bilinear interpolation",                     0, AV_OPT_TYPE_CONST,  {.i64=BILINEAR},        0,                   0, FLAGS, "interp" },
+    { "lagrange9", "lagrange9 interpolation",                    0, AV_OPT_TYPE_CONST,  {.i64=LAGRANGE9},       0,                   0, FLAGS, "interp" },
+    {      "cube", "bicubic interpolation",                      0, AV_OPT_TYPE_CONST,  {.i64=BICUBIC},         0,                   0, FLAGS, "interp" },
+    {     "cubic", "bicubic interpolation",                      0, AV_OPT_TYPE_CONST,  {.i64=BICUBIC},         0,                   0, FLAGS, "interp" },
+    {      "lanc", "lanczos interpolation",                      0, AV_OPT_TYPE_CONST,  {.i64=LANCZOS},         0,                   0, FLAGS, "interp" },
+    {   "lanczos", "lanczos interpolation",                      0, AV_OPT_TYPE_CONST,  {.i64=LANCZOS},         0,                   0, FLAGS, "interp" },
+    {      "sp16", "spline16 interpolation",                     0, AV_OPT_TYPE_CONST,  {.i64=SPLINE16},        0,                   0, FLAGS, "interp" },
+    {  "spline16", "spline16 interpolation",                     0, AV_OPT_TYPE_CONST,  {.i64=SPLINE16},        0,                   0, FLAGS, "interp" },
+    {     "gauss", "gaussian interpolation",                     0, AV_OPT_TYPE_CONST,  {.i64=GAUSSIAN},        0,                   0, FLAGS, "interp" },
+    {  "gaussian", "gaussian interpolation",                     0, AV_OPT_TYPE_CONST,  {.i64=GAUSSIAN},        0,                   0, FLAGS, "interp" },
+    {         "w", "output width",                   OFFSET(width), AV_OPT_TYPE_INT,    {.i64=0},               0,           INT16_MAX, FLAGS, "w"},
+    {         "h", "output height",                 OFFSET(height), AV_OPT_TYPE_INT,    {.i64=0},               0,           INT16_MAX, FLAGS, "h"},
+    { "in_stereo", "input stereo format",        OFFSET(in_stereo), AV_OPT_TYPE_INT,    {.i64=STEREO_2D},       0,    NB_STEREO_FMTS-1, FLAGS, "stereo" },
+    {"out_stereo", "output stereo format",      OFFSET(out_stereo), AV_OPT_TYPE_INT,    {.i64=STEREO_2D},       0,    NB_STEREO_FMTS-1, FLAGS, "stereo" },
+    {        "2d", "2d mono",                                    0, AV_OPT_TYPE_CONST,  {.i64=STEREO_2D},       0,                   0, FLAGS, "stereo" },
+    {       "sbs", "side by side",                               0, AV_OPT_TYPE_CONST,  {.i64=STEREO_SBS},      0,                   0, FLAGS, "stereo" },
+    {        "tb", "top bottom",                                 0, AV_OPT_TYPE_CONST,  {.i64=STEREO_TB},       0,                   0, FLAGS, "stereo" },
+    { "in_forder", "input cubemap face order",   OFFSET(in_forder), AV_OPT_TYPE_STRING, {.str="rludfb"},        0,     NB_DIRECTIONS-1, FLAGS, "in_forder"},
+    {"out_forder", "output cubemap face order", OFFSET(out_forder), AV_OPT_TYPE_STRING, {.str="rludfb"},        0,     NB_DIRECTIONS-1, FLAGS, "out_forder"},
+    {   "in_frot", "input cubemap face rotation",  OFFSET(in_frot), AV_OPT_TYPE_STRING, {.str="000000"},        0,     NB_DIRECTIONS-1, FLAGS, "in_frot"},
+    {  "out_frot", "output cubemap face rotation",OFFSET(out_frot), AV_OPT_TYPE_STRING, {.str="000000"},        0,     NB_DIRECTIONS-1, FLAGS, "out_frot"},
+    {    "in_pad", "percent input cubemap pads",    OFFSET(in_pad), AV_OPT_TYPE_FLOAT,  {.dbl=0.f},           0.f,                 1.f,TFLAGS, "in_pad"},
+    {   "out_pad", "percent output cubemap pads",  OFFSET(out_pad), AV_OPT_TYPE_FLOAT,  {.dbl=0.f},           0.f,                 1.f,TFLAGS, "out_pad"},
+    {   "fin_pad", "fixed input cubemap pads",     OFFSET(fin_pad), AV_OPT_TYPE_INT,    {.i64=0},               0,                 100,TFLAGS, "fin_pad"},
+    {  "fout_pad", "fixed output cubemap pads",   OFFSET(fout_pad), AV_OPT_TYPE_INT,    {.i64=0},               0,                 100,TFLAGS, "fout_pad"},
+    {       "yaw", "yaw rotation",                     OFFSET(yaw), AV_OPT_TYPE_FLOAT,  {.dbl=0.f},        -180.f,               180.f,TFLAGS, "yaw"},
+    {     "pitch", "pitch rotation",                 OFFSET(pitch), AV_OPT_TYPE_FLOAT,  {.dbl=0.f},        -180.f,               180.f,TFLAGS, "pitch"},
+    {      "roll", "roll rotation",                   OFFSET(roll), AV_OPT_TYPE_FLOAT,  {.dbl=0.f},        -180.f,               180.f,TFLAGS, "roll"},
+    {    "rorder", "rotation order",                OFFSET(rorder), AV_OPT_TYPE_STRING, {.str="ypr"},           0,                   0,TFLAGS, "rorder"},
+    {     "h_fov", "output horizontal field of view",OFFSET(h_fov), AV_OPT_TYPE_FLOAT,  {.dbl=90.f},     0.00001f,               360.f,TFLAGS, "h_fov"},
+    {     "v_fov", "output vertical field of view",  OFFSET(v_fov), AV_OPT_TYPE_FLOAT,  {.dbl=45.f},     0.00001f,               360.f,TFLAGS, "v_fov"},
+    {     "d_fov", "output diagonal field of view",  OFFSET(d_fov), AV_OPT_TYPE_FLOAT,  {.dbl=0.f},           0.f,               360.f,TFLAGS, "d_fov"},
+    {    "h_flip", "flip out video horizontally",   OFFSET(h_flip), AV_OPT_TYPE_BOOL,   {.i64=0},               0,                   1,TFLAGS, "h_flip"},
+    {    "v_flip", "flip out video vertically",     OFFSET(v_flip), AV_OPT_TYPE_BOOL,   {.i64=0},               0,                   1,TFLAGS, "v_flip"},
+    {    "d_flip", "flip out video indepth",        OFFSET(d_flip), AV_OPT_TYPE_BOOL,   {.i64=0},               0,                   1,TFLAGS, "d_flip"},
+    {   "ih_flip", "flip in video horizontally",   OFFSET(ih_flip), AV_OPT_TYPE_BOOL,   {.i64=0},               0,                   1,TFLAGS, "ih_flip"},
+    {   "iv_flip", "flip in video vertically",     OFFSET(iv_flip), AV_OPT_TYPE_BOOL,   {.i64=0},               0,                   1,TFLAGS, "iv_flip"},
+    {  "in_trans", "transpose video input",   OFFSET(in_transpose), AV_OPT_TYPE_BOOL,   {.i64=0},               0,                   1, FLAGS, "in_transpose"},
+    { "out_trans", "transpose video output", OFFSET(out_transpose), AV_OPT_TYPE_BOOL,   {.i64=0},               0,                   1, FLAGS, "out_transpose"},
+    {    "ih_fov", "input horizontal field of view",OFFSET(ih_fov), AV_OPT_TYPE_FLOAT,  {.dbl=90.f},     0.00001f,               360.f,TFLAGS, "ih_fov"},
+    {    "iv_fov", "input vertical field of view",  OFFSET(iv_fov), AV_OPT_TYPE_FLOAT,  {.dbl=45.f},     0.00001f,               360.f,TFLAGS, "iv_fov"},
+    {    "id_fov", "input diagonal field of view",  OFFSET(id_fov), AV_OPT_TYPE_FLOAT,  {.dbl=0.f},           0.f,               360.f,TFLAGS, "id_fov"},
+    {"alpha_mask", "build mask in alpha plane",      OFFSET(alpha), AV_OPT_TYPE_BOOL,   {.i64=0},               0,                   1, FLAGS, "alpha"},
+    { NULL }
+};
+
+AVFILTER_DEFINE_CLASS(v360);
+
+static int query_formats(AVFilterContext *ctx)
+{
+    V360Context *s = ctx->priv;
+    static const enum AVPixelFormat pix_fmts[] = {
+        // YUVA444
+        AV_PIX_FMT_YUVA444P,   AV_PIX_FMT_YUVA444P9,
+        AV_PIX_FMT_YUVA444P10, AV_PIX_FMT_YUVA444P12,
+        AV_PIX_FMT_YUVA444P16,
+
+        // YUVA422
+        AV_PIX_FMT_YUVA422P,   AV_PIX_FMT_YUVA422P9,
+        AV_PIX_FMT_YUVA422P10, AV_PIX_FMT_YUVA422P12,
+        AV_PIX_FMT_YUVA422P16,
+
+        // YUVA420
+        AV_PIX_FMT_YUVA420P,   AV_PIX_FMT_YUVA420P9,
+        AV_PIX_FMT_YUVA420P10, AV_PIX_FMT_YUVA420P16,
+
+        // YUVJ
+        AV_PIX_FMT_YUVJ444P, AV_PIX_FMT_YUVJ440P,
+        AV_PIX_FMT_YUVJ422P, AV_PIX_FMT_YUVJ420P,
+        AV_PIX_FMT_YUVJ411P,
+
+        // YUV444
+        AV_PIX_FMT_YUV444P,   AV_PIX_FMT_YUV444P9,
+        AV_PIX_FMT_YUV444P10, AV_PIX_FMT_YUV444P12,
+        AV_PIX_FMT_YUV444P14, AV_PIX_FMT_YUV444P16,
+
+        // YUV440
+        AV_PIX_FMT_YUV440P, AV_PIX_FMT_YUV440P10,
+        AV_PIX_FMT_YUV440P12,
+
+        // YUV422
+        AV_PIX_FMT_YUV422P,   AV_PIX_FMT_YUV422P9,
+        AV_PIX_FMT_YUV422P10, AV_PIX_FMT_YUV422P12,
+        AV_PIX_FMT_YUV422P14, AV_PIX_FMT_YUV422P16,
+
+        // YUV420
+        AV_PIX_FMT_YUV420P,   AV_PIX_FMT_YUV420P9,
+        AV_PIX_FMT_YUV420P10, AV_PIX_FMT_YUV420P12,
+        AV_PIX_FMT_YUV420P14, AV_PIX_FMT_YUV420P16,
+
+        // YUV411
+        AV_PIX_FMT_YUV411P,
+
+        // YUV410
+        AV_PIX_FMT_YUV410P,
+
+        // GBR
+        AV_PIX_FMT_GBRP,   AV_PIX_FMT_GBRP9,
+        AV_PIX_FMT_GBRP10, AV_PIX_FMT_GBRP12,
+        AV_PIX_FMT_GBRP14, AV_PIX_FMT_GBRP16,
+
+        // GBRA
+        AV_PIX_FMT_GBRAP,   AV_PIX_FMT_GBRAP10,
+        AV_PIX_FMT_GBRAP12, AV_PIX_FMT_GBRAP16,
+
+        // GRAY
+        AV_PIX_FMT_GRAY8,  AV_PIX_FMT_GRAY9,
+        AV_PIX_FMT_GRAY10, AV_PIX_FMT_GRAY12,
+        AV_PIX_FMT_GRAY14, AV_PIX_FMT_GRAY16,
+
+        AV_PIX_FMT_NONE
+    };
+    static const enum AVPixelFormat alpha_pix_fmts[] = {
+        AV_PIX_FMT_YUVA444P,   AV_PIX_FMT_YUVA444P9,
+        AV_PIX_FMT_YUVA444P10, AV_PIX_FMT_YUVA444P12,
+        AV_PIX_FMT_YUVA444P16,
+        AV_PIX_FMT_YUVA422P,   AV_PIX_FMT_YUVA422P9,
+        AV_PIX_FMT_YUVA422P10, AV_PIX_FMT_YUVA422P12,
+        AV_PIX_FMT_YUVA422P16,
+        AV_PIX_FMT_YUVA420P,   AV_PIX_FMT_YUVA420P9,
+        AV_PIX_FMT_YUVA420P10, AV_PIX_FMT_YUVA420P16,
+        AV_PIX_FMT_GBRAP,   AV_PIX_FMT_GBRAP10,
+        AV_PIX_FMT_GBRAP12, AV_PIX_FMT_GBRAP16,
+        AV_PIX_FMT_NONE
+    };
+
+    AVFilterFormats *fmts_list = ff_make_format_list(s->alpha ? alpha_pix_fmts : pix_fmts);
+    if (!fmts_list)
+        return AVERROR(ENOMEM);
+    return ff_set_common_formats(ctx, fmts_list);
+}
+
+#define DEFINE_REMAP1_LINE(bits, div)                                                    \
+static void remap1_##bits##bit_line_c(uint8_t *dst, int width, const uint8_t *const src, \
+                                      ptrdiff_t in_linesize,                             \
+                                      const int16_t *const u, const int16_t *const v,    \
+                                      const int16_t *const ker)                          \
+{                                                                                        \
+    const uint##bits##_t *const s = (const uint##bits##_t *const)src;                    \
+    uint##bits##_t *d = (uint##bits##_t *)dst;                                           \
+                                                                                         \
+    in_linesize /= div;                                                                  \
+                                                                                         \
+    for (int x = 0; x < width; x++)                                                      \
+        d[x] = s[v[x] * in_linesize + u[x]];                                             \
+}
+
+DEFINE_REMAP1_LINE( 8, 1)
+DEFINE_REMAP1_LINE(16, 2)
+
+/**
+ * Generate remapping function with a given window size and pixel depth.
+ *
+ * @param ws size of interpolation window
+ * @param bits number of bits per pixel
+ */
+#define DEFINE_REMAP(ws, bits)                                                                             \
+static int remap##ws##_##bits##bit_slice(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)          \
+{                                                                                                          \
+    ThreadData *td = arg;                                                                                  \
+    const V360Context *s = ctx->priv;                                                                      \
+    const AVFrame *in = td->in;                                                                            \
+    AVFrame *out = td->out;                                                                                \
+                                                                                                           \
+    for (int stereo = 0; stereo < 1 + s->out_stereo > STEREO_2D; stereo++) {                               \
+        for (int plane = 0; plane < s->nb_planes; plane++) {                                               \
+            const unsigned map = s->map[plane];                                                            \
+            const int in_linesize  = in->linesize[plane];                                                  \
+            const int out_linesize = out->linesize[plane];                                                 \
+            const int uv_linesize = s->uv_linesize[plane];                                                 \
+            const int in_offset_w = stereo ? s->in_offset_w[plane] : 0;                                    \
+            const int in_offset_h = stereo ? s->in_offset_h[plane] : 0;                                    \
+            const int out_offset_w = stereo ? s->out_offset_w[plane] : 0;                                  \
+            const int out_offset_h = stereo ? s->out_offset_h[plane] : 0;                                  \
+            const uint8_t *const src = in->data[plane] +                                                   \
+                                                   in_offset_h * in_linesize + in_offset_w * (bits >> 3);  \
+            uint8_t *dst = out->data[plane] + out_offset_h * out_linesize + out_offset_w * (bits >> 3);    \
+            const uint8_t *mask = plane == 3 ? s->mask : NULL;                                             \
+            const int width = s->pr_width[plane];                                                          \
+            const int height = s->pr_height[plane];                                                        \
+                                                                                                           \
+            const int slice_start = (height *  jobnr     ) / nb_jobs;                                      \
+            const int slice_end   = (height * (jobnr + 1)) / nb_jobs;                                      \
+                                                                                                           \
+            for (int y = slice_start; y < slice_end && !mask; y++) {                                       \
+                const int16_t *const u = s->u[map] + y * uv_linesize * ws * ws;                            \
+                const int16_t *const v = s->v[map] + y * uv_linesize * ws * ws;                            \
+                const int16_t *const ker = s->ker[map] + y * uv_linesize * ws * ws;                        \
+                                                                                                           \
+                s->remap_line(dst + y * out_linesize, width, src, in_linesize, u, v, ker);                 \
+            }                                                                                              \
+                                                                                                           \
+            for (int y = slice_start; y < slice_end && mask; y++) {                                        \
+                memcpy(dst + y * out_linesize, mask + y * width * (bits >> 3), width * (bits >> 3));       \
+            }                                                                                              \
+        }                                                                                                  \
+    }                                                                                                      \
+                                                                                                           \
+    return 0;                                                                                              \
+}
+
+DEFINE_REMAP(1,  8)
+DEFINE_REMAP(2,  8)
+DEFINE_REMAP(3,  8)
+DEFINE_REMAP(4,  8)
+DEFINE_REMAP(1, 16)
+DEFINE_REMAP(2, 16)
+DEFINE_REMAP(3, 16)
+DEFINE_REMAP(4, 16)
+
+#define DEFINE_REMAP_LINE(ws, bits, div)                                                      \
+static void remap##ws##_##bits##bit_line_c(uint8_t *dst, int width, const uint8_t *const src, \
+                                           ptrdiff_t in_linesize,                             \
+                                           const int16_t *const u, const int16_t *const v,    \
+                                           const int16_t *const ker)                          \
+{                                                                                             \
+    const uint##bits##_t *const s = (const uint##bits##_t *const)src;                         \
+    uint##bits##_t *d = (uint##bits##_t *)dst;                                                \
+                                                                                              \
+    in_linesize /= div;                                                                       \
+                                                                                              \
+    for (int x = 0; x < width; x++) {                                                         \
+        const int16_t *const uu = u + x * ws * ws;                                            \
+        const int16_t *const vv = v + x * ws * ws;                                            \
+        const int16_t *const kker = ker + x * ws * ws;                                        \
+        int tmp = 0;                                                                          \
+                                                                                              \
+        for (int i = 0; i < ws; i++) {                                                        \
+            for (int j = 0; j < ws; j++) {                                                    \
+                tmp += kker[i * ws + j] * s[vv[i * ws + j] * in_linesize + uu[i * ws + j]];   \
+            }                                                                                 \
+        }                                                                                     \
+                                                                                              \
+        d[x] = av_clip_uint##bits(tmp >> 14);                                                 \
+    }                                                                                         \
+}
+
+DEFINE_REMAP_LINE(2,  8, 1)
+DEFINE_REMAP_LINE(3,  8, 1)
+DEFINE_REMAP_LINE(4,  8, 1)
+DEFINE_REMAP_LINE(2, 16, 2)
+DEFINE_REMAP_LINE(3, 16, 2)
+DEFINE_REMAP_LINE(4, 16, 2)
+
+void ff_v360_init(V360Context *s, int depth)
+{
+    switch (s->interp) {
+    case NEAREST:
+        s->remap_line = depth <= 8 ? remap1_8bit_line_c : remap1_16bit_line_c;
+        break;
+    case BILINEAR:
+        s->remap_line = depth <= 8 ? remap2_8bit_line_c : remap2_16bit_line_c;
+        break;
+    case LAGRANGE9:
+        s->remap_line = depth <= 8 ? remap3_8bit_line_c : remap3_16bit_line_c;
+        break;
+    case BICUBIC:
+    case LANCZOS:
+    case SPLINE16:
+    case GAUSSIAN:
+        s->remap_line = depth <= 8 ? remap4_8bit_line_c : remap4_16bit_line_c;
+        break;
+    }
+
+    if (ARCH_X86)
+        ff_v360_init_x86(s, depth);
+}
+
+/**
+ * Save nearest pixel coordinates for remapping.
+ *
+ * @param du horizontal relative coordinate
+ * @param dv vertical relative coordinate
+ * @param rmap calculated 4x4 window
+ * @param u u remap data
+ * @param v v remap data
+ * @param ker ker remap data
+ */
+static void nearest_kernel(float du, float dv, const XYRemap *rmap,
+                           int16_t *u, int16_t *v, int16_t *ker)
+{
+    const int i = lrintf(dv) + 1;
+    const int j = lrintf(du) + 1;
+
+    u[0] = rmap->u[i][j];
+    v[0] = rmap->v[i][j];
+}
+
+/**
+ * Calculate kernel for bilinear interpolation.
+ *
+ * @param du horizontal relative coordinate
+ * @param dv vertical relative coordinate
+ * @param rmap calculated 4x4 window
+ * @param u u remap data
+ * @param v v remap data
+ * @param ker ker remap data
+ */
+static void bilinear_kernel(float du, float dv, const XYRemap *rmap,
+                            int16_t *u, int16_t *v, int16_t *ker)
+{
+    for (int i = 0; i < 2; i++) {
+        for (int j = 0; j < 2; j++) {
+            u[i * 2 + j] = rmap->u[i + 1][j + 1];
+            v[i * 2 + j] = rmap->v[i + 1][j + 1];
+        }
+    }
+
+    ker[0] = lrintf((1.f - du) * (1.f - dv) * 16385.f);
+    ker[1] = lrintf(       du  * (1.f - dv) * 16385.f);
+    ker[2] = lrintf((1.f - du) *        dv  * 16385.f);
+    ker[3] = lrintf(       du  *        dv  * 16385.f);
+}
+
+/**
+ * Calculate 1-dimensional lagrange coefficients.
+ *
+ * @param t relative coordinate
+ * @param coeffs coefficients
+ */
+static inline void calculate_lagrange_coeffs(float t, float *coeffs)
+{
+    coeffs[0] = (t - 1.f) * (t - 2.f) * 0.5f;
+    coeffs[1] = -t * (t - 2.f);
+    coeffs[2] =  t * (t - 1.f) * 0.5f;
+}
+
+/**
+ * Calculate kernel for lagrange interpolation.
+ *
+ * @param du horizontal relative coordinate
+ * @param dv vertical relative coordinate
+ * @param rmap calculated 4x4 window
+ * @param u u remap data
+ * @param v v remap data
+ * @param ker ker remap data
+ */
+static void lagrange_kernel(float du, float dv, const XYRemap *rmap,
+                            int16_t *u, int16_t *v, int16_t *ker)
+{
+    float du_coeffs[3];
+    float dv_coeffs[3];
+
+    calculate_lagrange_coeffs(du, du_coeffs);
+    calculate_lagrange_coeffs(dv, dv_coeffs);
+
+    for (int i = 0; i < 3; i++) {
+        for (int j = 0; j < 3; j++) {
+            u[i * 3 + j] = rmap->u[i + 1][j + 1];
+            v[i * 3 + j] = rmap->v[i + 1][j + 1];
+            ker[i * 3 + j] = lrintf(du_coeffs[j] * dv_coeffs[i] * 16385.f);
+        }
+    }
+}
+
+/**
+ * Calculate 1-dimensional cubic coefficients.
+ *
+ * @param t relative coordinate
+ * @param coeffs coefficients
+ */
+static inline void calculate_bicubic_coeffs(float t, float *coeffs)
+{
+    const float tt  = t * t;
+    const float ttt = t * t * t;
+
+    coeffs[0] =     - t / 3.f + tt / 2.f - ttt / 6.f;
+    coeffs[1] = 1.f - t / 2.f - tt       + ttt / 2.f;
+    coeffs[2] =       t       + tt / 2.f - ttt / 2.f;
+    coeffs[3] =     - t / 6.f            + ttt / 6.f;
+}
+
+/**
+ * Calculate kernel for bicubic interpolation.
+ *
+ * @param du horizontal relative coordinate
+ * @param dv vertical relative coordinate
+ * @param rmap calculated 4x4 window
+ * @param u u remap data
+ * @param v v remap data
+ * @param ker ker remap data
+ */
+static void bicubic_kernel(float du, float dv, const XYRemap *rmap,
+                           int16_t *u, int16_t *v, int16_t *ker)
+{
+    float du_coeffs[4];
+    float dv_coeffs[4];
+
+    calculate_bicubic_coeffs(du, du_coeffs);
+    calculate_bicubic_coeffs(dv, dv_coeffs);
+
+    for (int i = 0; i < 4; i++) {
+        for (int j = 0; j < 4; j++) {
+            u[i * 4 + j] = rmap->u[i][j];
+            v[i * 4 + j] = rmap->v[i][j];
+            ker[i * 4 + j] = lrintf(du_coeffs[j] * dv_coeffs[i] * 16385.f);
+        }
+    }
+}
+
+/**
+ * Calculate 1-dimensional lanczos coefficients.
+ *
+ * @param t relative coordinate
+ * @param coeffs coefficients
+ */
+static inline void calculate_lanczos_coeffs(float t, float *coeffs)
+{
+    float sum = 0.f;
+
+    for (int i = 0; i < 4; i++) {
+        const float x = M_PI * (t - i + 1);
+        if (x == 0.f) {
+            coeffs[i] = 1.f;
+        } else {
+            coeffs[i] = sinf(x) * sinf(x / 2.f) / (x * x / 2.f);
+        }
+        sum += coeffs[i];
+    }
+
+    for (int i = 0; i < 4; i++) {
+        coeffs[i] /= sum;
+    }
+}
+
+/**
+ * Calculate kernel for lanczos interpolation.
+ *
+ * @param du horizontal relative coordinate
+ * @param dv vertical relative coordinate
+ * @param rmap calculated 4x4 window
+ * @param u u remap data
+ * @param v v remap data
+ * @param ker ker remap data
+ */
+static void lanczos_kernel(float du, float dv, const XYRemap *rmap,
+                           int16_t *u, int16_t *v, int16_t *ker)
+{
+    float du_coeffs[4];
+    float dv_coeffs[4];
+
+    calculate_lanczos_coeffs(du, du_coeffs);
+    calculate_lanczos_coeffs(dv, dv_coeffs);
+
+    for (int i = 0; i < 4; i++) {
+        for (int j = 0; j < 4; j++) {
+            u[i * 4 + j] = rmap->u[i][j];
+            v[i * 4 + j] = rmap->v[i][j];
+            ker[i * 4 + j] = lrintf(du_coeffs[j] * dv_coeffs[i] * 16385.f);
+        }
+    }
+}
+
+/**
+ * Calculate 1-dimensional spline16 coefficients.
+ *
+ * @param t relative coordinate
+ * @param coeffs coefficients
+ */
+static void calculate_spline16_coeffs(float t, float *coeffs)
+{
+    coeffs[0] = ((-1.f / 3.f * t + 0.8f) * t - 7.f / 15.f) * t;
+    coeffs[1] = ((t - 9.f / 5.f) * t - 0.2f) * t + 1.f;
+    coeffs[2] = ((6.f / 5.f - t) * t + 0.8f) * t;
+    coeffs[3] = ((1.f / 3.f * t - 0.2f) * t - 2.f / 15.f) * t;
+}
+
+/**
+ * Calculate kernel for spline16 interpolation.
+ *
+ * @param du horizontal relative coordinate
+ * @param dv vertical relative coordinate
+ * @param rmap calculated 4x4 window
+ * @param u u remap data
+ * @param v v remap data
+ * @param ker ker remap data
+ */
+static void spline16_kernel(float du, float dv, const XYRemap *rmap,
+                            int16_t *u, int16_t *v, int16_t *ker)
+{
+    float du_coeffs[4];
+    float dv_coeffs[4];
+
+    calculate_spline16_coeffs(du, du_coeffs);
+    calculate_spline16_coeffs(dv, dv_coeffs);
+
+    for (int i = 0; i < 4; i++) {
+        for (int j = 0; j < 4; j++) {
+            u[i * 4 + j] = rmap->u[i][j];
+            v[i * 4 + j] = rmap->v[i][j];
+            ker[i * 4 + j] = lrintf(du_coeffs[j] * dv_coeffs[i] * 16385.f);
+        }
+    }
+}
+
+/**
+ * Calculate 1-dimensional gaussian coefficients.
+ *
+ * @param t relative coordinate
+ * @param coeffs coefficients
+ */
+static void calculate_gaussian_coeffs(float t, float *coeffs)
+{
+    float sum = 0.f;
+
+    for (int i = 0; i < 4; i++) {
+        const float x = t - (i - 1);
+        if (x == 0.f) {
+            coeffs[i] = 1.f;
+        } else {
+            coeffs[i] = expf(-2.f * x * x) * expf(-x * x / 2.f);
+        }
+        sum += coeffs[i];
+    }
+
+    for (int i = 0; i < 4; i++) {
+        coeffs[i] /= sum;
+    }
+}
+
+/**
+ * Calculate kernel for gaussian interpolation.
+ *
+ * @param du horizontal relative coordinate
+ * @param dv vertical relative coordinate
+ * @param rmap calculated 4x4 window
+ * @param u u remap data
+ * @param v v remap data
+ * @param ker ker remap data
+ */
+static void gaussian_kernel(float du, float dv, const XYRemap *rmap,
+                            int16_t *u, int16_t *v, int16_t *ker)
+{
+    float du_coeffs[4];
+    float dv_coeffs[4];
+
+    calculate_gaussian_coeffs(du, du_coeffs);
+    calculate_gaussian_coeffs(dv, dv_coeffs);
+
+    for (int i = 0; i < 4; i++) {
+        for (int j = 0; j < 4; j++) {
+            u[i * 4 + j] = rmap->u[i][j];
+            v[i * 4 + j] = rmap->v[i][j];
+            ker[i * 4 + j] = lrintf(du_coeffs[j] * dv_coeffs[i] * 16385.f);
+        }
+    }
+}
+
+/**
+ * Modulo operation with only positive remainders.
+ *
+ * @param a dividend
+ * @param b divisor
+ *
+ * @return positive remainder of (a / b)
+ */
+static inline int mod(int a, int b)
+{
+    const int res = a % b;
+    if (res < 0) {
+        return res + b;
+    } else {
+        return res;
+    }
+}
+
+/**
+ * Reflect y operation.
+ *
+ * @param y input vertical position
+ * @param h input height
+ */
+static inline int reflecty(int y, int h)
+{
+    if (y < 0) {
+        return -y;
+    } else if (y >= h) {
+        return 2 * h - 1 - y;
+    }
+
+    return y;
+}
+
+/**
+ * Reflect x operation for equirect.
+ *
+ * @param x input horizontal position
+ * @param y input vertical position
+ * @param w input width
+ * @param h input height
+ */
+static inline int ereflectx(int x, int y, int w, int h)
+{
+    if (y < 0 || y >= h)
+        x += w / 2;
+
+    return mod(x, w);
+}
+
+/**
+ * Reflect x operation.
+ *
+ * @param x input horizontal position
+ * @param y input vertical position
+ * @param w input width
+ * @param h input height
+ */
+static inline int reflectx(int x, int y, int w, int h)
+{
+    if (y < 0 || y >= h)
+        return w - 1 - x;
+
+    return mod(x, w);
+}
+
+/**
+ * Convert char to corresponding direction.
+ * Used for cubemap options.
+ */
+static int get_direction(char c)
+{
+    switch (c) {
+    case 'r':
+        return RIGHT;
+    case 'l':
+        return LEFT;
+    case 'u':
+        return UP;
+    case 'd':
+        return DOWN;
+    case 'f':
+        return FRONT;
+    case 'b':
+        return BACK;
+    default:
+        return -1;
+    }
+}
+
+/**
+ * Convert char to corresponding rotation angle.
+ * Used for cubemap options.
+ */
+static int get_rotation(char c)
+{
+    switch (c) {
+    case '0':
+        return ROT_0;
+    case '1':
+        return ROT_90;
+    case '2':
+        return ROT_180;
+    case '3':
+        return ROT_270;
+    default:
+        return -1;
+    }
+}
+
+/**
+ * Convert char to corresponding rotation order.
+ */
+static int get_rorder(char c)
+{
+    switch (c) {
+    case 'Y':
+    case 'y':
+        return YAW;
+    case 'P':
+    case 'p':
+        return PITCH;
+    case 'R':
+    case 'r':
+        return ROLL;
+    default:
+        return -1;
+    }
+}
+
+/**
+ * Prepare data for processing cubemap input format.
+ *
+ * @param ctx filter context
+ *
+ * @return error code
+ */
+static int prepare_cube_in(AVFilterContext *ctx)
+{
+    V360Context *s = ctx->priv;
+
+    for (int face = 0; face < NB_FACES; face++) {
+        const char c = s->in_forder[face];
+        int direction;
+
+        if (c == '\0') {
+            av_log(ctx, AV_LOG_ERROR,
+                   "Incomplete in_forder option. Direction for all 6 faces should be specified.\n");
+            return AVERROR(EINVAL);
+        }
+
+        direction = get_direction(c);
+        if (direction == -1) {
+            av_log(ctx, AV_LOG_ERROR,
+                   "Incorrect direction symbol '%c' in in_forder option.\n", c);
+            return AVERROR(EINVAL);
+        }
+
+        s->in_cubemap_face_order[direction] = face;
+    }
+
+    for (int face = 0; face < NB_FACES; face++) {
+        const char c = s->in_frot[face];
+        int rotation;
+
+        if (c == '\0') {
+            av_log(ctx, AV_LOG_ERROR,
+                   "Incomplete in_frot option. Rotation for all 6 faces should be specified.\n");
+            return AVERROR(EINVAL);
+        }
+
+        rotation = get_rotation(c);
+        if (rotation == -1) {
+            av_log(ctx, AV_LOG_ERROR,
+                   "Incorrect rotation symbol '%c' in in_frot option.\n", c);
+            return AVERROR(EINVAL);
+        }
+
+        s->in_cubemap_face_rotation[face] = rotation;
+    }
+
+    return 0;
+}
+
+/**
+ * Prepare data for processing cubemap output format.
+ *
+ * @param ctx filter context
+ *
+ * @return error code
+ */
+static int prepare_cube_out(AVFilterContext *ctx)
+{
+    V360Context *s = ctx->priv;
+
+    for (int face = 0; face < NB_FACES; face++) {
+        const char c = s->out_forder[face];
+        int direction;
+
+        if (c == '\0') {
+            av_log(ctx, AV_LOG_ERROR,
+                   "Incomplete out_forder option. Direction for all 6 faces should be specified.\n");
+            return AVERROR(EINVAL);
+        }
+
+        direction = get_direction(c);
+        if (direction == -1) {
+            av_log(ctx, AV_LOG_ERROR,
+                   "Incorrect direction symbol '%c' in out_forder option.\n", c);
+            return AVERROR(EINVAL);
+        }
+
+        s->out_cubemap_direction_order[face] = direction;
+    }
+
+    for (int face = 0; face < NB_FACES; face++) {
+        const char c = s->out_frot[face];
+        int rotation;
+
+        if (c == '\0') {
+            av_log(ctx, AV_LOG_ERROR,
+                   "Incomplete out_frot option. Rotation for all 6 faces should be specified.\n");
+            return AVERROR(EINVAL);
+        }
+
+        rotation = get_rotation(c);
+        if (rotation == -1) {
+            av_log(ctx, AV_LOG_ERROR,
+                   "Incorrect rotation symbol '%c' in out_frot option.\n", c);
+            return AVERROR(EINVAL);
+        }
+
+        s->out_cubemap_face_rotation[face] = rotation;
+    }
+
+    return 0;
+}
+
+static inline void rotate_cube_face(float *uf, float *vf, int rotation)
+{
+    float tmp;
+
+    switch (rotation) {
+    case ROT_0:
+        break;
+    case ROT_90:
+        tmp =  *uf;
+        *uf = -*vf;
+        *vf =  tmp;
+        break;
+    case ROT_180:
+        *uf = -*uf;
+        *vf = -*vf;
+        break;
+    case ROT_270:
+        tmp = -*uf;
+        *uf =  *vf;
+        *vf =  tmp;
+        break;
+    default:
+        av_assert0(0);
+    }
+}
+
+static inline void rotate_cube_face_inverse(float *uf, float *vf, int rotation)
+{
+    float tmp;
+
+    switch (rotation) {
+    case ROT_0:
+        break;
+    case ROT_90:
+        tmp = -*uf;
+        *uf =  *vf;
+        *vf =  tmp;
+        break;
+    case ROT_180:
+        *uf = -*uf;
+        *vf = -*vf;
+        break;
+    case ROT_270:
+        tmp =  *uf;
+        *uf = -*vf;
+        *vf =  tmp;
+        break;
+    default:
+        av_assert0(0);
+    }
+}
+
+/**
+ * Normalize vector.
+ *
+ * @param vec vector
+ */
+static void normalize_vector(float *vec)
+{
+    const float norm = sqrtf(vec[0] * vec[0] + vec[1] * vec[1] + vec[2] * vec[2]);
+
+    vec[0] /= norm;
+    vec[1] /= norm;
+    vec[2] /= norm;
+}
+
+/**
+ * Calculate 3D coordinates on sphere for corresponding cubemap position.
+ * Common operation for every cubemap.
+ *
+ * @param s filter private context
+ * @param uf horizontal cubemap coordinate [0, 1)
+ * @param vf vertical cubemap coordinate [0, 1)
+ * @param face face of cubemap
+ * @param vec coordinates on sphere
+ * @param scalew scale for uf
+ * @param scaleh scale for vf
+ */
+static void cube_to_xyz(const V360Context *s,
+                        float uf, float vf, int face,
+                        float *vec, float scalew, float scaleh)
+{
+    const int direction = s->out_cubemap_direction_order[face];
+    float l_x, l_y, l_z;
+
+    uf /= scalew;
+    vf /= scaleh;
+
+    rotate_cube_face_inverse(&uf, &vf, s->out_cubemap_face_rotation[face]);
+
+    switch (direction) {
+    case RIGHT:
+        l_x =  1.f;
+        l_y =  vf;
+        l_z = -uf;
+        break;
+    case LEFT:
+        l_x = -1.f;
+        l_y =  vf;
+        l_z =  uf;
+        break;
+    case UP:
+        l_x =  uf;
+        l_y = -1.f;
+        l_z =  vf;
+        break;
+    case DOWN:
+        l_x =  uf;
+        l_y =  1.f;
+        l_z = -vf;
+        break;
+    case FRONT:
+        l_x =  uf;
+        l_y =  vf;
+        l_z =  1.f;
+        break;
+    case BACK:
+        l_x = -uf;
+        l_y =  vf;
+        l_z = -1.f;
+        break;
+    default:
+        av_assert0(0);
+    }
+
+    vec[0] = l_x;
+    vec[1] = l_y;
+    vec[2] = l_z;
+
+    normalize_vector(vec);
+}
+
+/**
+ * Calculate cubemap position for corresponding 3D coordinates on sphere.
+ * Common operation for every cubemap.
+ *
+ * @param s filter private context
+ * @param vec coordinated on sphere
+ * @param uf horizontal cubemap coordinate [0, 1)
+ * @param vf vertical cubemap coordinate [0, 1)
+ * @param direction direction of view
+ */
+static void xyz_to_cube(const V360Context *s,
+                        const float *vec,
+                        float *uf, float *vf, int *direction)
+{
+    const float phi   = atan2f(vec[0], vec[2]);
+    const float theta = asinf(vec[1]);
+    float phi_norm, theta_threshold;
+    int face;
+
+    if (phi >= -M_PI_4 && phi < M_PI_4) {
+        *direction = FRONT;
+        phi_norm = phi;
+    } else if (phi >= -(M_PI_2 + M_PI_4) && phi < -M_PI_4) {
+        *direction = LEFT;
+        phi_norm = phi + M_PI_2;
+    } else if (phi >= M_PI_4 && phi < M_PI_2 + M_PI_4) {
+        *direction = RIGHT;
+        phi_norm = phi - M_PI_2;
+    } else {
+        *direction = BACK;
+        phi_norm = phi + ((phi > 0.f) ? -M_PI : M_PI);
+    }
+
+    theta_threshold = atanf(cosf(phi_norm));
+    if (theta > theta_threshold) {
+        *direction = DOWN;
+    } else if (theta < -theta_threshold) {
+        *direction = UP;
+    }
+
+    switch (*direction) {
+    case RIGHT:
+        *uf = -vec[2] / vec[0];
+        *vf =  vec[1] / vec[0];
+        break;
+    case LEFT:
+        *uf = -vec[2] / vec[0];
+        *vf = -vec[1] / vec[0];
+        break;
+    case UP:
+        *uf = -vec[0] / vec[1];
+        *vf = -vec[2] / vec[1];
+        break;
+    case DOWN:
+        *uf =  vec[0] / vec[1];
+        *vf = -vec[2] / vec[1];
+        break;
+    case FRONT:
+        *uf =  vec[0] / vec[2];
+        *vf =  vec[1] / vec[2];
+        break;
+    case BACK:
+        *uf =  vec[0] / vec[2];
+        *vf = -vec[1] / vec[2];
+        break;
+    default:
+        av_assert0(0);
+    }
+
+    face = s->in_cubemap_face_order[*direction];
+    rotate_cube_face(uf, vf, s->in_cubemap_face_rotation[face]);
+
+    (*uf) *= s->input_mirror_modifier[0];
+    (*vf) *= s->input_mirror_modifier[1];
+}
+
+/**
+ * Find position on another cube face in case of overflow/underflow.
+ * Used for calculation of interpolation window.
+ *
+ * @param s filter private context
+ * @param uf horizontal cubemap coordinate
+ * @param vf vertical cubemap coordinate
+ * @param direction direction of view
+ * @param new_uf new horizontal cubemap coordinate
+ * @param new_vf new vertical cubemap coordinate
+ * @param face face position on cubemap
+ */
+static void process_cube_coordinates(const V360Context *s,
+                                     float uf, float vf, int direction,
+                                     float *new_uf, float *new_vf, int *face)
+{
+    /*
+     *  Cubemap orientation
+     *
+     *           width
+     *         <------->
+     *         +-------+
+     *         |       |                              U
+     *         | up    |                   h       ------->
+     * +-------+-------+-------+-------+ ^ e      |
+     * |       |       |       |       | | i    V |
+     * | left  | front | right | back  | | g      |
+     * +-------+-------+-------+-------+ v h      v
+     *         |       |                   t
+     *         | down  |
+     *         +-------+
+     */
+
+    *face = s->in_cubemap_face_order[direction];
+    rotate_cube_face_inverse(&uf, &vf, s->in_cubemap_face_rotation[*face]);
+
+    if ((uf < -1.f || uf >= 1.f) && (vf < -1.f || vf >= 1.f)) {
+        // There are no pixels to use in this case
+        *new_uf = uf;
+        *new_vf = vf;
+    } else if (uf < -1.f) {
+        uf += 2.f;
+        switch (direction) {
+        case RIGHT:
+            direction = FRONT;
+            *new_uf =  uf;
+            *new_vf =  vf;
+            break;
+        case LEFT:
+            direction = BACK;
+            *new_uf =  uf;
+            *new_vf =  vf;
+            break;
+        case UP:
+            direction = LEFT;
+            *new_uf =  vf;
+            *new_vf = -uf;
+            break;
+        case DOWN:
+            direction = LEFT;
+            *new_uf = -vf;
+            *new_vf =  uf;
+            break;
+        case FRONT:
+            direction = LEFT;
+            *new_uf =  uf;
+            *new_vf =  vf;
+            break;
+        case BACK:
+            direction = RIGHT;
+            *new_uf =  uf;
+            *new_vf =  vf;
+            break;
+        default:
+            av_assert0(0);
+        }
+    } else if (uf >= 1.f) {
+        uf -= 2.f;
+        switch (direction) {
+        case RIGHT:
+            direction = BACK;
+            *new_uf =  uf;
+            *new_vf =  vf;
+            break;
+        case LEFT:
+            direction = FRONT;
+            *new_uf =  uf;
+            *new_vf =  vf;
+            break;
+        case UP:
+            direction = RIGHT;
+            *new_uf = -vf;
+            *new_vf =  uf;
+            break;
+        case DOWN:
+            direction = RIGHT;
+            *new_uf =  vf;
+            *new_vf = -uf;
+            break;
+        case FRONT:
+            direction = RIGHT;
+            *new_uf =  uf;
+            *new_vf =  vf;
+            break;
+        case BACK:
+            direction = LEFT;
+            *new_uf =  uf;
+            *new_vf =  vf;
+            break;
+        default:
+            av_assert0(0);
+        }
+    } else if (vf < -1.f) {
+        vf += 2.f;
+        switch (direction) {
+        case RIGHT:
+            direction = UP;
+            *new_uf =  vf;
+            *new_vf = -uf;
+            break;
+        case LEFT:
+            direction = UP;
+            *new_uf = -vf;
+            *new_vf =  uf;
+            break;
+        case UP:
+            direction = BACK;
+            *new_uf = -uf;
+            *new_vf = -vf;
+            break;
+        case DOWN:
+            direction = FRONT;
+            *new_uf =  uf;
+            *new_vf =  vf;
+            break;
+        case FRONT:
+            direction = UP;
+            *new_uf =  uf;
+            *new_vf =  vf;
+            break;
+        case BACK:
+            direction = UP;
+            *new_uf = -uf;
+            *new_vf = -vf;
+            break;
+        default:
+            av_assert0(0);
+        }
+    } else if (vf >= 1.f) {
+        vf -= 2.f;
+        switch (direction) {
+        case RIGHT:
+            direction = DOWN;
+            *new_uf = -vf;
+            *new_vf =  uf;
+            break;
+        case LEFT:
+            direction = DOWN;
+            *new_uf =  vf;
+            *new_vf = -uf;
+            break;
+        case UP:
+            direction = FRONT;
+            *new_uf =  uf;
+            *new_vf =  vf;
+            break;
+        case DOWN:
+            direction = BACK;
+            *new_uf = -uf;
+            *new_vf = -vf;
+            break;
+        case FRONT:
+            direction = DOWN;
+            *new_uf =  uf;
+            *new_vf =  vf;
+            break;
+        case BACK:
+            direction = DOWN;
+            *new_uf = -uf;
+            *new_vf = -vf;
+            break;
+        default:
+            av_assert0(0);
+        }
+    } else {
+        // Inside cube face
+        *new_uf = uf;
+        *new_vf = vf;
+    }
+
+    *face = s->in_cubemap_face_order[direction];
+    rotate_cube_face(new_uf, new_vf, s->in_cubemap_face_rotation[*face]);
+}
+
+/**
+ * Calculate 3D coordinates on sphere for corresponding frame position in cubemap3x2 format.
+ *
+ * @param s filter private context
+ * @param i horizontal position on frame [0, width)
+ * @param j vertical position on frame [0, height)
+ * @param width frame width
+ * @param height frame height
+ * @param vec coordinates on sphere
+ */
+static int cube3x2_to_xyz(const V360Context *s,
+                          int i, int j, int width, int height,
+                          float *vec)
+{
+    const float scalew = s->fout_pad > 0 ? 1.f - s->fout_pad / (width  / 3.f) : 1.f - s->out_pad;
+    const float scaleh = s->fout_pad > 0 ? 1.f - s->fout_pad / (height / 2.f) : 1.f - s->out_pad;
+
+    const float ew = width  / 3.f;
+    const float eh = height / 2.f;
+
+    const int u_face = floorf(i / ew);
+    const int v_face = floorf(j / eh);
+    const int face = u_face + 3 * v_face;
+
+    const int u_shift = ceilf(ew * u_face);
+    const int v_shift = ceilf(eh * v_face);
+    const int ewi = ceilf(ew * (u_face + 1)) - u_shift;
+    const int ehi = ceilf(eh * (v_face + 1)) - v_shift;
+
+    const float uf = 2.f * (i - u_shift + 0.5f) / ewi - 1.f;
+    const float vf = 2.f * (j - v_shift + 0.5f) / ehi - 1.f;
+
+    cube_to_xyz(s, uf, vf, face, vec, scalew, scaleh);
+
+    return 1;
+}
+
+/**
+ * Calculate frame position in cubemap3x2 format for corresponding 3D coordinates on sphere.
+ *
+ * @param s filter private context
+ * @param vec coordinates on sphere
+ * @param width frame width
+ * @param height frame height
+ * @param us horizontal coordinates for interpolation window
+ * @param vs vertical coordinates for interpolation window
+ * @param du horizontal relative coordinate
+ * @param dv vertical relative coordinate
+ */
+static int xyz_to_cube3x2(const V360Context *s,
+                          const float *vec, int width, int height,
+                          int16_t us[4][4], int16_t vs[4][4], float *du, float *dv)
+{
+    const float scalew = s->fin_pad > 0 ? 1.f - s->fin_pad / (width  / 3.f) : 1.f - s->in_pad;
+    const float scaleh = s->fin_pad > 0 ? 1.f - s->fin_pad / (height / 2.f) : 1.f - s->in_pad;
+    const float ew = width  / 3.f;
+    const float eh = height / 2.f;
+    float uf, vf;
+    int ui, vi;
+    int ewi, ehi;
+    int direction, face;
+    int u_face, v_face;
+
+    xyz_to_cube(s, vec, &uf, &vf, &direction);
+
+    uf *= scalew;
+    vf *= scaleh;
+
+    face = s->in_cubemap_face_order[direction];
+    u_face = face % 3;
+    v_face = face / 3;
+    ewi = ceilf(ew * (u_face + 1)) - ceilf(ew * u_face);
+    ehi = ceilf(eh * (v_face + 1)) - ceilf(eh * v_face);
+
+    uf = 0.5f * ewi * (uf + 1.f) - 0.5f;
+    vf = 0.5f * ehi * (vf + 1.f) - 0.5f;
+
+    ui = floorf(uf);
+    vi = floorf(vf);
+
+    *du = uf - ui;
+    *dv = vf - vi;
+
+    for (int i = 0; i < 4; i++) {
+        for (int j = 0; j < 4; j++) {
+            int new_ui = ui + j - 1;
+            int new_vi = vi + i - 1;
+            int u_shift, v_shift;
+            int new_ewi, new_ehi;
+
+            if (new_ui >= 0 && new_ui < ewi && new_vi >= 0 && new_vi < ehi) {
+                face = s->in_cubemap_face_order[direction];
+
+                u_face = face % 3;
+                v_face = face / 3;
+                u_shift = ceilf(ew * u_face);
+                v_shift = ceilf(eh * v_face);
+            } else {
+                uf = 2.f * new_ui / ewi - 1.f;
+                vf = 2.f * new_vi / ehi - 1.f;
+
+                uf /= scalew;
+                vf /= scaleh;
+
+                process_cube_coordinates(s, uf, vf, direction, &uf, &vf, &face);
+
+                uf *= scalew;
+                vf *= scaleh;
+
+                u_face = face % 3;
+                v_face = face / 3;
+                u_shift = ceilf(ew * u_face);
+                v_shift = ceilf(eh * v_face);
+                new_ewi = ceilf(ew * (u_face + 1)) - u_shift;
+                new_ehi = ceilf(eh * (v_face + 1)) - v_shift;
+
+                new_ui = av_clip(lrintf(0.5f * new_ewi * (uf + 1.f)), 0, new_ewi - 1);
+                new_vi = av_clip(lrintf(0.5f * new_ehi * (vf + 1.f)), 0, new_ehi - 1);
+            }
+
+            us[i][j] = u_shift + new_ui;
+            vs[i][j] = v_shift + new_vi;
+        }
+    }
+
+    return 1;
+}
+
+/**
+ * Calculate 3D coordinates on sphere for corresponding frame position in cubemap1x6 format.
+ *
+ * @param s filter private context
+ * @param i horizontal position on frame [0, width)
+ * @param j vertical position on frame [0, height)
+ * @param width frame width
+ * @param height frame height
+ * @param vec coordinates on sphere
+ */
+static int cube1x6_to_xyz(const V360Context *s,
+                          int i, int j, int width, int height,
+                          float *vec)
+{
+    const float scalew = s->fout_pad > 0 ? 1.f - (float)(s->fout_pad) / width : 1.f - s->out_pad;
+    const float scaleh = s->fout_pad > 0 ? 1.f - s->fout_pad / (height / 6.f) : 1.f - s->out_pad;
+
+    const float ew = width;
+    const float eh = height / 6.f;
+
+    const int face = floorf(j / eh);
+
+    const int v_shift = ceilf(eh * face);
+    const int ehi = ceilf(eh * (face + 1)) - v_shift;
+
+    const float uf = 2.f * (i           + 0.5f) / ew  - 1.f;
+    const float vf = 2.f * (j - v_shift + 0.5f) / ehi - 1.f;
+
+    cube_to_xyz(s, uf, vf, face, vec, scalew, scaleh);
+
+    return 1;
+}
+
+/**
+ * Calculate 3D coordinates on sphere for corresponding frame position in cubemap6x1 format.
+ *
+ * @param s filter private context
+ * @param i horizontal position on frame [0, width)
+ * @param j vertical position on frame [0, height)
+ * @param width frame width
+ * @param height frame height
+ * @param vec coordinates on sphere
+ */
+static int cube6x1_to_xyz(const V360Context *s,
+                          int i, int j, int width, int height,
+                          float *vec)
+{
+    const float scalew = s->fout_pad > 0 ? 1.f - s->fout_pad / (width / 6.f)   : 1.f - s->out_pad;
+    const float scaleh = s->fout_pad > 0 ? 1.f - (float)(s->fout_pad) / height : 1.f - s->out_pad;
+
+    const float ew = width / 6.f;
+    const float eh = height;
+
+    const int face = floorf(i / ew);
+
+    const int u_shift = ceilf(ew * face);
+    const int ewi = ceilf(ew * (face + 1)) - u_shift;
+
+    const float uf = 2.f * (i - u_shift + 0.5f) / ewi - 1.f;
+    const float vf = 2.f * (j           + 0.5f) / eh  - 1.f;
+
+    cube_to_xyz(s, uf, vf, face, vec, scalew, scaleh);
+
+    return 1;
+}
+
+/**
+ * Calculate frame position in cubemap1x6 format for corresponding 3D coordinates on sphere.
+ *
+ * @param s filter private context
+ * @param vec coordinates on sphere
+ * @param width frame width
+ * @param height frame height
+ * @param us horizontal coordinates for interpolation window
+ * @param vs vertical coordinates for interpolation window
+ * @param du horizontal relative coordinate
+ * @param dv vertical relative coordinate
+ */
+static int xyz_to_cube1x6(const V360Context *s,
+                          const float *vec, int width, int height,
+                          int16_t us[4][4], int16_t vs[4][4], float *du, float *dv)
+{
+    const float scalew = s->fin_pad > 0 ? 1.f - (float)(s->fin_pad) / width : 1.f - s->in_pad;
+    const float scaleh = s->fin_pad > 0 ? 1.f - s->fin_pad / (height / 6.f) : 1.f - s->in_pad;
+    const float eh = height / 6.f;
+    const int ewi = width;
+    float uf, vf;
+    int ui, vi;
+    int ehi;
+    int direction, face;
+
+    xyz_to_cube(s, vec, &uf, &vf, &direction);
+
+    uf *= scalew;
+    vf *= scaleh;
+
+    face = s->in_cubemap_face_order[direction];
+    ehi = ceilf(eh * (face + 1)) - ceilf(eh * face);
+
+    uf = 0.5f * ewi * (uf + 1.f) - 0.5f;
+    vf = 0.5f * ehi * (vf + 1.f) - 0.5f;
+
+    ui = floorf(uf);
+    vi = floorf(vf);
+
+    *du = uf - ui;
+    *dv = vf - vi;
+
+    for (int i = 0; i < 4; i++) {
+        for (int j = 0; j < 4; j++) {
+            int new_ui = ui + j - 1;
+            int new_vi = vi + i - 1;
+            int v_shift;
+            int new_ehi;
+
+            if (new_ui >= 0 && new_ui < ewi && new_vi >= 0 && new_vi < ehi) {
+                face = s->in_cubemap_face_order[direction];
+
+                v_shift = ceilf(eh * face);
+            } else {
+                uf = 2.f * new_ui / ewi - 1.f;
+                vf = 2.f * new_vi / ehi - 1.f;
+
+                uf /= scalew;
+                vf /= scaleh;
+
+                process_cube_coordinates(s, uf, vf, direction, &uf, &vf, &face);
+
+                uf *= scalew;
+                vf *= scaleh;
+
+                v_shift = ceilf(eh * face);
+                new_ehi = ceilf(eh * (face + 1)) - v_shift;
+
+                new_ui = av_clip(lrintf(0.5f *     ewi * (uf + 1.f)), 0,     ewi - 1);
+                new_vi = av_clip(lrintf(0.5f * new_ehi * (vf + 1.f)), 0, new_ehi - 1);
+            }
+
+            us[i][j] =           new_ui;
+            vs[i][j] = v_shift + new_vi;
+        }
+    }
+
+    return 1;
+}
+
+/**
+ * Calculate frame position in cubemap6x1 format for corresponding 3D coordinates on sphere.
+ *
+ * @param s filter private context
+ * @param vec coordinates on sphere
+ * @param width frame width
+ * @param height frame height
+ * @param us horizontal coordinates for interpolation window
+ * @param vs vertical coordinates for interpolation window
+ * @param du horizontal relative coordinate
+ * @param dv vertical relative coordinate
+ */
+static int xyz_to_cube6x1(const V360Context *s,
+                          const float *vec, int width, int height,
+                          int16_t us[4][4], int16_t vs[4][4], float *du, float *dv)
+{
+    const float scalew = s->fin_pad > 0 ? 1.f - s->fin_pad / (width / 6.f)   : 1.f - s->in_pad;
+    const float scaleh = s->fin_pad > 0 ? 1.f - (float)(s->fin_pad) / height : 1.f - s->in_pad;
+    const float ew = width / 6.f;
+    const int ehi = height;
+    float uf, vf;
+    int ui, vi;
+    int ewi;
+    int direction, face;
+
+    xyz_to_cube(s, vec, &uf, &vf, &direction);
+
+    uf *= scalew;
+    vf *= scaleh;
+
+    face = s->in_cubemap_face_order[direction];
+    ewi = ceilf(ew * (face + 1)) - ceilf(ew * face);
+
+    uf = 0.5f * ewi * (uf + 1.f) - 0.5f;
+    vf = 0.5f * ehi * (vf + 1.f) - 0.5f;
+
+    ui = floorf(uf);
+    vi = floorf(vf);
+
+    *du = uf - ui;
+    *dv = vf - vi;
+
+    for (int i = 0; i < 4; i++) {
+        for (int j = 0; j < 4; j++) {
+            int new_ui = ui + j - 1;
+            int new_vi = vi + i - 1;
+            int u_shift;
+            int new_ewi;
+
+            if (new_ui >= 0 && new_ui < ewi && new_vi >= 0 && new_vi < ehi) {
+                face = s->in_cubemap_face_order[direction];
+
+                u_shift = ceilf(ew * face);
+            } else {
+                uf = 2.f * new_ui / ewi - 1.f;
+                vf = 2.f * new_vi / ehi - 1.f;
+
+                uf /= scalew;
+                vf /= scaleh;
+
+                process_cube_coordinates(s, uf, vf, direction, &uf, &vf, &face);
+
+                uf *= scalew;
+                vf *= scaleh;
+
+                u_shift = ceilf(ew * face);
+                new_ewi = ceilf(ew * (face + 1)) - u_shift;
+
+                new_ui = av_clip(lrintf(0.5f * new_ewi * (uf + 1.f)), 0, new_ewi - 1);
+                new_vi = av_clip(lrintf(0.5f *     ehi * (vf + 1.f)), 0,     ehi - 1);
+            }
+
+            us[i][j] = u_shift + new_ui;
+            vs[i][j] =           new_vi;
+        }
+    }
+
+    return 1;
+}
+
+/**
+ * Calculate 3D coordinates on sphere for corresponding frame position in equirectangular format.
+ *
+ * @param s filter private context
+ * @param i horizontal position on frame [0, width)
+ * @param j vertical position on frame [0, height)
+ * @param width frame width
+ * @param height frame height
+ * @param vec coordinates on sphere
+ */
+static int equirect_to_xyz(const V360Context *s,
+                           int i, int j, int width, int height,
+                           float *vec)
+{
+    const float phi   = ((2.f * i + 0.5f) / width  - 1.f) * M_PI;
+    const float theta = ((2.f * j + 0.5f) / height - 1.f) * M_PI_2;
+
+    const float sin_phi   = sinf(phi);
+    const float cos_phi   = cosf(phi);
+    const float sin_theta = sinf(theta);
+    const float cos_theta = cosf(theta);
+
+    vec[0] = cos_theta * sin_phi;
+    vec[1] = sin_theta;
+    vec[2] = cos_theta * cos_phi;
+
+    return 1;
+}
+
+/**
+ * Calculate 3D coordinates on sphere for corresponding frame position in half equirectangular format.
+ *
+ * @param s filter private context
+ * @param i horizontal position on frame [0, width)
+ * @param j vertical position on frame [0, height)
+ * @param width frame width
+ * @param height frame height
+ * @param vec coordinates on sphere
+ */
+static int hequirect_to_xyz(const V360Context *s,
+                            int i, int j, int width, int height,
+                            float *vec)
+{
+    const float phi   = ((2.f * i + 0.5f) / width  - 1.f) * M_PI_2;
+    const float theta = ((2.f * j + 0.5f) / height - 1.f) * M_PI_2;
+
+    const float sin_phi   = sinf(phi);
+    const float cos_phi   = cosf(phi);
+    const float sin_theta = sinf(theta);
+    const float cos_theta = cosf(theta);
+
+    vec[0] = cos_theta * sin_phi;
+    vec[1] = sin_theta;
+    vec[2] = cos_theta * cos_phi;
+
+    return 1;
+}
+
+/**
+ * Prepare data for processing stereographic output format.
+ *
+ * @param ctx filter context
+ *
+ * @return error code
+ */
+static int prepare_stereographic_out(AVFilterContext *ctx)
+{
+    V360Context *s = ctx->priv;
+
+    s->flat_range[0] = tanf(FFMIN(s->h_fov, 359.f) * M_PI / 720.f);
+    s->flat_range[1] = tanf(FFMIN(s->v_fov, 359.f) * M_PI / 720.f);
+
+    return 0;
+}
+
+/**
+ * Calculate 3D coordinates on sphere for corresponding frame position in stereographic format.
+ *
+ * @param s filter private context
+ * @param i horizontal position on frame [0, width)
+ * @param j vertical position on frame [0, height)
+ * @param width frame width
+ * @param height frame height
+ * @param vec coordinates on sphere
+ */
+static int stereographic_to_xyz(const V360Context *s,
+                                int i, int j, int width, int height,
+                                float *vec)
+{
+    const float x = ((2.f * i + 1.f) / width  - 1.f) * s->flat_range[0];
+    const float y = ((2.f * j + 1.f) / height - 1.f) * s->flat_range[1];
+    const float r = hypotf(x, y);
+    const float theta = atanf(r) * 2.f;
+    const float sin_theta = sinf(theta);
+
+    vec[0] = x / r * sin_theta;
+    vec[1] = y / r * sin_theta;
+    vec[2] = cosf(theta);
+
+    normalize_vector(vec);
+
+    return 1;
+}
+
+/**
+ * Prepare data for processing stereographic input format.
+ *
+ * @param ctx filter context
+ *
+ * @return error code
+ */
+static int prepare_stereographic_in(AVFilterContext *ctx)
+{
+    V360Context *s = ctx->priv;
+
+    s->iflat_range[0] = tanf(FFMIN(s->ih_fov, 359.f) * M_PI / 720.f);
+    s->iflat_range[1] = tanf(FFMIN(s->iv_fov, 359.f) * M_PI / 720.f);
+
+    return 0;
+}
+
+/**
+ * Calculate frame position in stereographic format for corresponding 3D coordinates on sphere.
+ *
+ * @param s filter private context
+ * @param vec coordinates on sphere
+ * @param width frame width
+ * @param height frame height
+ * @param us horizontal coordinates for interpolation window
+ * @param vs vertical coordinates for interpolation window
+ * @param du horizontal relative coordinate
+ * @param dv vertical relative coordinate
+ */
+static int xyz_to_stereographic(const V360Context *s,
+                                const float *vec, int width, int height,
+                                int16_t us[4][4], int16_t vs[4][4], float *du, float *dv)
+{
+    const float theta = acosf(vec[2]);
+    const float r = tanf(theta * 0.5f);
+    const float c = r / hypotf(vec[0], vec[1]);
+    const float x = vec[0] * c / s->iflat_range[0] * s->input_mirror_modifier[0];
+    const float y = vec[1] * c / s->iflat_range[1] * s->input_mirror_modifier[1];
+
+    const float uf = (x + 1.f) * width  / 2.f;
+    const float vf = (y + 1.f) * height / 2.f;
+
+    const int ui = floorf(uf);
+    const int vi = floorf(vf);
+
+    const int visible = isfinite(x) && isfinite(y) && vi >= 0 && vi < height && ui >= 0 && ui < width;
+
+    *du = visible ? uf - ui : 0.f;
+    *dv = visible ? vf - vi : 0.f;
+
+    for (int i = 0; i < 4; i++) {
+        for (int j = 0; j < 4; j++) {
+            us[i][j] = visible ? av_clip(ui + j - 1, 0, width  - 1) : 0;
+            vs[i][j] = visible ? av_clip(vi + i - 1, 0, height - 1) : 0;
+        }
+    }
+
+    return visible;
+}
+
+/**
+ * Calculate frame position in equirectangular format for corresponding 3D coordinates on sphere.
+ *
+ * @param s filter private context
+ * @param vec coordinates on sphere
+ * @param width frame width
+ * @param height frame height
+ * @param us horizontal coordinates for interpolation window
+ * @param vs vertical coordinates for interpolation window
+ * @param du horizontal relative coordinate
+ * @param dv vertical relative coordinate
+ */
+static int xyz_to_equirect(const V360Context *s,
+                           const float *vec, int width, int height,
+                           int16_t us[4][4], int16_t vs[4][4], float *du, float *dv)
+{
+    const float phi   = atan2f(vec[0], vec[2]) * s->input_mirror_modifier[0];
+    const float theta = asinf(vec[1]) * s->input_mirror_modifier[1];
+
+    const float uf = (phi   / M_PI   + 1.f) * width  / 2.f;
+    const float vf = (theta / M_PI_2 + 1.f) * height / 2.f;
+
+    const int ui = floorf(uf);
+    const int vi = floorf(vf);
+
+    *du = uf - ui;
+    *dv = vf - vi;
+
+    for (int i = 0; i < 4; i++) {
+        for (int j = 0; j < 4; j++) {
+            us[i][j] = ereflectx(ui + j - 1, vi + i - 1, width, height);
+            vs[i][j] = reflecty(vi + i - 1, height);
+        }
+    }
+
+    return 1;
+}
+
+/**
+ * Calculate frame position in half equirectangular format for corresponding 3D coordinates on sphere.
+ *
+ * @param s filter private context
+ * @param vec coordinates on sphere
+ * @param width frame width
+ * @param height frame height
+ * @param us horizontal coordinates for interpolation window
+ * @param vs vertical coordinates for interpolation window
+ * @param du horizontal relative coordinate
+ * @param dv vertical relative coordinate
+ */
+static int xyz_to_hequirect(const V360Context *s,
+                            const float *vec, int width, int height,
+                            int16_t us[4][4], int16_t vs[4][4], float *du, float *dv)
+{
+    const float phi   = atan2f(vec[0], vec[2]) * s->input_mirror_modifier[0];
+    const float theta = asinf(vec[1]) * s->input_mirror_modifier[1];
+
+    const float uf = (phi   / M_PI_2 + 1.f) * width  / 2.f;
+    const float vf = (theta / M_PI_2 + 1.f) * height / 2.f;
+
+    const int ui = floorf(uf);
+    const int vi = floorf(vf);
+
+    const int visible = phi >= -M_PI_2 && phi <= M_PI_2;
+
+    *du = uf - ui;
+    *dv = vf - vi;
+
+    for (int i = 0; i < 4; i++) {
+        for (int j = 0; j < 4; j++) {
+            us[i][j] = av_clip(ui + j - 1, 0, width  - 1);
+            vs[i][j] = av_clip(vi + i - 1, 0, height - 1);
+        }
+    }
+
+    return visible;
+}
+
+/**
+ * Prepare data for processing flat input format.
+ *
+ * @param ctx filter context
+ *
+ * @return error code
+ */
+static int prepare_flat_in(AVFilterContext *ctx)
+{
+    V360Context *s = ctx->priv;
+
+    s->iflat_range[0] = tanf(0.5f * s->ih_fov * M_PI / 180.f);
+    s->iflat_range[1] = tanf(0.5f * s->iv_fov * M_PI / 180.f);
+
+    return 0;
+}
+
+/**
+ * Calculate frame position in flat format for corresponding 3D coordinates on sphere.
+ *
+ * @param s filter private context
+ * @param vec coordinates on sphere
+ * @param width frame width
+ * @param height frame height
+ * @param us horizontal coordinates for interpolation window
+ * @param vs vertical coordinates for interpolation window
+ * @param du horizontal relative coordinate
+ * @param dv vertical relative coordinate
+ */
+static int xyz_to_flat(const V360Context *s,
+                       const float *vec, int width, int height,
+                       int16_t us[4][4], int16_t vs[4][4], float *du, float *dv)
+{
+    const float theta = acosf(vec[2]);
+    const float r = tanf(theta);
+    const float rr = fabsf(r) < 1e+6f ? r : hypotf(width, height);
+    const float zf = vec[2];
+    const float h = hypotf(vec[0], vec[1]);
+    const float c = h <= 1e-6f ? 1.f : rr / h;
+    float uf = vec[0] * c / s->iflat_range[0] * s->input_mirror_modifier[0];
+    float vf = vec[1] * c / s->iflat_range[1] * s->input_mirror_modifier[1];
+    int visible, ui, vi;
+
+    uf = zf >= 0.f ? (uf + 1.f) * width  / 2.f : 0.f;
+    vf = zf >= 0.f ? (vf + 1.f) * height / 2.f : 0.f;
+
+    ui = floorf(uf);
+    vi = floorf(vf);
+
+    visible = vi >= 0 && vi < height && ui >= 0 && ui < width && zf >= 0.f;
+
+    *du = uf - ui;
+    *dv = vf - vi;
+
+    for (int i = 0; i < 4; i++) {
+        for (int j = 0; j < 4; j++) {
+            us[i][j] = visible ? av_clip(ui + j - 1, 0, width  - 1) : 0;
+            vs[i][j] = visible ? av_clip(vi + i - 1, 0, height - 1) : 0;
+        }
+    }
+
+    return visible;
+}
+
+/**
+ * Calculate frame position in mercator format for corresponding 3D coordinates on sphere.
+ *
+ * @param s filter private context
+ * @param vec coordinates on sphere
+ * @param width frame width
+ * @param height frame height
+ * @param us horizontal coordinates for interpolation window
+ * @param vs vertical coordinates for interpolation window
+ * @param du horizontal relative coordinate
+ * @param dv vertical relative coordinate
+ */
+static int xyz_to_mercator(const V360Context *s,
+                           const float *vec, int width, int height,
+                           int16_t us[4][4], int16_t vs[4][4], float *du, float *dv)
+{
+    const float phi   = atan2f(vec[0], vec[2]) * s->input_mirror_modifier[0];
+    const float theta = vec[1] * s->input_mirror_modifier[1];
+
+    const float uf = (phi / M_PI + 1.f) * width / 2.f;
+    const float vf = (av_clipf(logf((1.f + theta) / (1.f - theta)) / (2.f * M_PI), -1.f, 1.f) + 1.f) * height / 2.f;
+
+    const int ui = floorf(uf);
+    const int vi = floorf(vf);
+
+    *du = uf - ui;
+    *dv = vf - vi;
+
+    for (int i = 0; i < 4; i++) {
+        for (int j = 0; j < 4; j++) {
+            us[i][j] = av_clip(ui + j - 1, 0, width  - 1);
+            vs[i][j] = av_clip(vi + i - 1, 0, height - 1);
+        }
+    }
+
+    return 1;
+}
+
+/**
+ * Calculate 3D coordinates on sphere for corresponding frame position in mercator format.
+ *
+ * @param s filter private context
+ * @param i horizontal position on frame [0, width)
+ * @param j vertical position on frame [0, height)
+ * @param width frame width
+ * @param height frame height
+ * @param vec coordinates on sphere
+ */
+static int mercator_to_xyz(const V360Context *s,
+                           int i, int j, int width, int height,
+                           float *vec)
+{
+    const float phi = ((2.f * i + 1.f) / width  - 1.f) * M_PI + M_PI_2;
+    const float y   = ((2.f * j + 1.f) / height - 1.f) * M_PI;
+    const float div = expf(2.f * y) + 1.f;
+
+    const float sin_phi   = sinf(phi);
+    const float cos_phi   = cosf(phi);
+    const float sin_theta = 2.f * expf(y) / div;
+    const float cos_theta = (expf(2.f * y) - 1.f) / div;
+
+    vec[0] = -sin_theta * cos_phi;
+    vec[1] =  cos_theta;
+    vec[2] =  sin_theta * sin_phi;
+
+    return 1;
+}
+
+/**
+ * Calculate frame position in ball format for corresponding 3D coordinates on sphere.
+ *
+ * @param s filter private context
+ * @param vec coordinates on sphere
+ * @param width frame width
+ * @param height frame height
+ * @param us horizontal coordinates for interpolation window
+ * @param vs vertical coordinates for interpolation window
+ * @param du horizontal relative coordinate
+ * @param dv vertical relative coordinate
+ */
+static int xyz_to_ball(const V360Context *s,
+                       const float *vec, int width, int height,
+                       int16_t us[4][4], int16_t vs[4][4], float *du, float *dv)
+{
+    const float l = hypotf(vec[0], vec[1]);
+    const float r = sqrtf(1.f - vec[2]) / M_SQRT2;
+
+    const float uf = (1.f + r * vec[0] * s->input_mirror_modifier[0] / (l > 0.f ? l : 1.f)) * width  * 0.5f;
+    const float vf = (1.f + r * vec[1] * s->input_mirror_modifier[1] / (l > 0.f ? l : 1.f)) * height * 0.5f;
+
+    const int ui = floorf(uf);
+    const int vi = floorf(vf);
+
+    *du = uf - ui;
+    *dv = vf - vi;
+
+    for (int i = 0; i < 4; i++) {
+        for (int j = 0; j < 4; j++) {
+            us[i][j] = av_clip(ui + j - 1, 0, width  - 1);
+            vs[i][j] = av_clip(vi + i - 1, 0, height - 1);
+        }
+    }
+
+    return 1;
+}
+
+/**
+ * Calculate 3D coordinates on sphere for corresponding frame position in ball format.
+ *
+ * @param s filter private context
+ * @param i horizontal position on frame [0, width)
+ * @param j vertical position on frame [0, height)
+ * @param width frame width
+ * @param height frame height
+ * @param vec coordinates on sphere
+ */
+static int ball_to_xyz(const V360Context *s,
+                       int i, int j, int width, int height,
+                       float *vec)
+{
+    const float x = (2.f * i + 1.f) / width  - 1.f;
+    const float y = (2.f * j + 1.f) / height - 1.f;
+    const float l = hypotf(x, y);
+
+    if (l <= 1.f) {
+        const float z = 2.f * l * sqrtf(1.f - l * l);
+
+        vec[0] = z * x / (l > 0.f ? l : 1.f);
+        vec[1] = z * y / (l > 0.f ? l : 1.f);
+        vec[2] = 1.f - 2.f * l * l;
+    } else {
+        vec[0] = 0.f;
+        vec[1] = 1.f;
+        vec[2] = 0.f;
+        return 0;
+    }
+
+    return 1;
+}
+
+/**
+ * Calculate 3D coordinates on sphere for corresponding frame position in hammer format.
+ *
+ * @param s filter private context
+ * @param i horizontal position on frame [0, width)
+ * @param j vertical position on frame [0, height)
+ * @param width frame width
+ * @param height frame height
+ * @param vec coordinates on sphere
+ */
+static int hammer_to_xyz(const V360Context *s,
+                         int i, int j, int width, int height,
+                         float *vec)
+{
+    const float x = ((2.f * i + 1.f) / width  - 1.f);
+    const float y = ((2.f * j + 1.f) / height - 1.f);
+
+    const float xx = x * x;
+    const float yy = y * y;
+
+    const float z = sqrtf(1.f - xx * 0.5f - yy * 0.5f);
+
+    const float a = M_SQRT2 * x * z;
+    const float b = 2.f * z * z - 1.f;
+
+    const float aa = a * a;
+    const float bb = b * b;
+
+    const float w = sqrtf(1.f - 2.f * yy * z * z);
+
+    vec[0] = w * 2.f * a * b / (aa + bb);
+    vec[1] = M_SQRT2 * y * z;
+    vec[2] = w * (bb  - aa) / (aa + bb);
+
+    normalize_vector(vec);
+
+    return 1;
+}
+
+/**
+ * Calculate frame position in hammer format for corresponding 3D coordinates on sphere.
+ *
+ * @param s filter private context
+ * @param vec coordinates on sphere
+ * @param width frame width
+ * @param height frame height
+ * @param us horizontal coordinates for interpolation window
+ * @param vs vertical coordinates for interpolation window
+ * @param du horizontal relative coordinate
+ * @param dv vertical relative coordinate
+ */
+static int xyz_to_hammer(const V360Context *s,
+                         const float *vec, int width, int height,
+                         int16_t us[4][4], int16_t vs[4][4], float *du, float *dv)
+{
+    const float theta = atan2f(vec[0], vec[2]) * s->input_mirror_modifier[0];
+
+    const float z = sqrtf(1.f + sqrtf(1.f - vec[1] * vec[1]) * cosf(theta * 0.5f));
+    const float x = sqrtf(1.f - vec[1] * vec[1]) * sinf(theta * 0.5f) / z;
+    const float y = vec[1] / z * s->input_mirror_modifier[1];
+
+    const float uf = (x + 1.f) * width  / 2.f;
+    const float vf = (y + 1.f) * height / 2.f;
+
+    const int ui = floorf(uf);
+    const int vi = floorf(vf);
+
+    *du = uf - ui;
+    *dv = vf - vi;
+
+    for (int i = 0; i < 4; i++) {
+        for (int j = 0; j < 4; j++) {
+            us[i][j] = av_clip(ui + j - 1, 0, width  - 1);
+            vs[i][j] = av_clip(vi + i - 1, 0, height - 1);
+        }
+    }
+
+    return 1;
+}
+
+/**
+ * Calculate 3D coordinates on sphere for corresponding frame position in sinusoidal format.
+ *
+ * @param s filter private context
+ * @param i horizontal position on frame [0, width)
+ * @param j vertical position on frame [0, height)
+ * @param width frame width
+ * @param height frame height
+ * @param vec coordinates on sphere
+ */
+static int sinusoidal_to_xyz(const V360Context *s,
+                             int i, int j, int width, int height,
+                             float *vec)
+{
+    const float theta = ((2.f * j + 1.f) / height - 1.f) * M_PI_2;
+    const float phi   = ((2.f * i + 1.f) / width  - 1.f) * M_PI / cosf(theta);
+
+    const float sin_phi   = sinf(phi);
+    const float cos_phi   = cosf(phi);
+    const float sin_theta = sinf(theta);
+    const float cos_theta = cosf(theta);
+
+    vec[0] = cos_theta * sin_phi;
+    vec[1] = sin_theta;
+    vec[2] = cos_theta * cos_phi;
+
+    normalize_vector(vec);
+
+    return 1;
+}
+
+/**
+ * Calculate frame position in sinusoidal format for corresponding 3D coordinates on sphere.
+ *
+ * @param s filter private context
+ * @param vec coordinates on sphere
+ * @param width frame width
+ * @param height frame height
+ * @param us horizontal coordinates for interpolation window
+ * @param vs vertical coordinates for interpolation window
+ * @param du horizontal relative coordinate
+ * @param dv vertical relative coordinate
+ */
+static int xyz_to_sinusoidal(const V360Context *s,
+                             const float *vec, int width, int height,
+                             int16_t us[4][4], int16_t vs[4][4], float *du, float *dv)
+{
+    const float theta = asinf(vec[1]) * s->input_mirror_modifier[1];
+    const float phi   = atan2f(vec[0], vec[2]) * s->input_mirror_modifier[0] * cosf(theta);
+
+    const float uf = (phi   / M_PI   + 1.f) * width  / 2.f;
+    const float vf = (theta / M_PI_2 + 1.f) * height / 2.f;
+
+    const int ui = floorf(uf);
+    const int vi = floorf(vf);
+
+    *du = uf - ui;
+    *dv = vf - vi;
+
+    for (int i = 0; i < 4; i++) {
+        for (int j = 0; j < 4; j++) {
+            us[i][j] = av_clip(ui + j - 1, 0, width  - 1);
+            vs[i][j] = av_clip(vi + i - 1, 0, height - 1);
+        }
+    }
+
+    return 1;
+}
+
+/**
+ * Prepare data for processing equi-angular cubemap input format.
+ *
+ * @param ctx filter context
+ *
+ * @return error code
+ */
+static int prepare_eac_in(AVFilterContext *ctx)
+{
+    V360Context *s = ctx->priv;
+
+    if (s->ih_flip && s->iv_flip) {
+        s->in_cubemap_face_order[RIGHT] = BOTTOM_LEFT;
+        s->in_cubemap_face_order[LEFT]  = BOTTOM_RIGHT;
+        s->in_cubemap_face_order[UP]    = TOP_LEFT;
+        s->in_cubemap_face_order[DOWN]  = TOP_RIGHT;
+        s->in_cubemap_face_order[FRONT] = BOTTOM_MIDDLE;
+        s->in_cubemap_face_order[BACK]  = TOP_MIDDLE;
+    } else if (s->ih_flip) {
+        s->in_cubemap_face_order[RIGHT] = TOP_LEFT;
+        s->in_cubemap_face_order[LEFT]  = TOP_RIGHT;
+        s->in_cubemap_face_order[UP]    = BOTTOM_LEFT;
+        s->in_cubemap_face_order[DOWN]  = BOTTOM_RIGHT;
+        s->in_cubemap_face_order[FRONT] = TOP_MIDDLE;
+        s->in_cubemap_face_order[BACK]  = BOTTOM_MIDDLE;
+    } else if (s->iv_flip) {
+        s->in_cubemap_face_order[RIGHT] = BOTTOM_RIGHT;
+        s->in_cubemap_face_order[LEFT]  = BOTTOM_LEFT;
+        s->in_cubemap_face_order[UP]    = TOP_RIGHT;
+        s->in_cubemap_face_order[DOWN]  = TOP_LEFT;
+        s->in_cubemap_face_order[FRONT] = BOTTOM_MIDDLE;
+        s->in_cubemap_face_order[BACK]  = TOP_MIDDLE;
+    } else {
+        s->in_cubemap_face_order[RIGHT] = TOP_RIGHT;
+        s->in_cubemap_face_order[LEFT]  = TOP_LEFT;
+        s->in_cubemap_face_order[UP]    = BOTTOM_RIGHT;
+        s->in_cubemap_face_order[DOWN]  = BOTTOM_LEFT;
+        s->in_cubemap_face_order[FRONT] = TOP_MIDDLE;
+        s->in_cubemap_face_order[BACK]  = BOTTOM_MIDDLE;
+    }
+
+    if (s->iv_flip) {
+        s->in_cubemap_face_rotation[TOP_LEFT]      = ROT_270;
+        s->in_cubemap_face_rotation[TOP_MIDDLE]    = ROT_90;
+        s->in_cubemap_face_rotation[TOP_RIGHT]     = ROT_270;
+        s->in_cubemap_face_rotation[BOTTOM_LEFT]   = ROT_0;
+        s->in_cubemap_face_rotation[BOTTOM_MIDDLE] = ROT_0;
+        s->in_cubemap_face_rotation[BOTTOM_RIGHT]  = ROT_0;
+    } else {
+        s->in_cubemap_face_rotation[TOP_LEFT]      = ROT_0;
+        s->in_cubemap_face_rotation[TOP_MIDDLE]    = ROT_0;
+        s->in_cubemap_face_rotation[TOP_RIGHT]     = ROT_0;
+        s->in_cubemap_face_rotation[BOTTOM_LEFT]   = ROT_270;
+        s->in_cubemap_face_rotation[BOTTOM_MIDDLE] = ROT_90;
+        s->in_cubemap_face_rotation[BOTTOM_RIGHT]  = ROT_270;
+    }
+
+    return 0;
+}
+
+/**
+ * Prepare data for processing equi-angular cubemap output format.
+ *
+ * @param ctx filter context
+ *
+ * @return error code
+ */
+static int prepare_eac_out(AVFilterContext *ctx)
+{
+    V360Context *s = ctx->priv;
+
+    s->out_cubemap_direction_order[TOP_LEFT]      = LEFT;
+    s->out_cubemap_direction_order[TOP_MIDDLE]    = FRONT;
+    s->out_cubemap_direction_order[TOP_RIGHT]     = RIGHT;
+    s->out_cubemap_direction_order[BOTTOM_LEFT]   = DOWN;
+    s->out_cubemap_direction_order[BOTTOM_MIDDLE] = BACK;
+    s->out_cubemap_direction_order[BOTTOM_RIGHT]  = UP;
+
+    s->out_cubemap_face_rotation[TOP_LEFT]      = ROT_0;
+    s->out_cubemap_face_rotation[TOP_MIDDLE]    = ROT_0;
+    s->out_cubemap_face_rotation[TOP_RIGHT]     = ROT_0;
+    s->out_cubemap_face_rotation[BOTTOM_LEFT]   = ROT_270;
+    s->out_cubemap_face_rotation[BOTTOM_MIDDLE] = ROT_90;
+    s->out_cubemap_face_rotation[BOTTOM_RIGHT]  = ROT_270;
+
+    return 0;
+}
+
+/**
+ * Calculate 3D coordinates on sphere for corresponding frame position in equi-angular cubemap format.
+ *
+ * @param s filter private context
+ * @param i horizontal position on frame [0, width)
+ * @param j vertical position on frame [0, height)
+ * @param width frame width
+ * @param height frame height
+ * @param vec coordinates on sphere
+ */
+static int eac_to_xyz(const V360Context *s,
+                      int i, int j, int width, int height,
+                      float *vec)
+{
+    const float pixel_pad = 2;
+    const float u_pad = pixel_pad / width;
+    const float v_pad = pixel_pad / height;
+
+    int u_face, v_face, face;
+
+    float l_x, l_y, l_z;
+
+    float uf = (i + 0.5f) / width;
+    float vf = (j + 0.5f) / height;
+
+    // EAC has 2-pixel padding on faces except between faces on the same row
+    // Padding pixels seems not to be stretched with tangent as regular pixels
+    // Formulas below approximate original padding as close as I could get experimentally
+
+    // Horizontal padding
+    uf = 3.f * (uf - u_pad) / (1.f - 2.f * u_pad);
+    if (uf < 0.f) {
+        u_face = 0;
+        uf -= 0.5f;
+    } else if (uf >= 3.f) {
+        u_face = 2;
+        uf -= 2.5f;
+    } else {
+        u_face = floorf(uf);
+        uf = fmodf(uf, 1.f) - 0.5f;
+    }
+
+    // Vertical padding
+    v_face = floorf(vf * 2.f);
+    vf = (vf - v_pad - 0.5f * v_face) / (0.5f - 2.f * v_pad) - 0.5f;
+
+    if (uf >= -0.5f && uf < 0.5f) {
+        uf = tanf(M_PI_2 * uf);
+    } else {
+        uf = 2.f * uf;
+    }
+    if (vf >= -0.5f && vf < 0.5f) {
+        vf = tanf(M_PI_2 * vf);
+    } else {
+        vf = 2.f * vf;
+    }
+
+    face = u_face + 3 * v_face;
+
+    switch (face) {
+    case TOP_LEFT:
+        l_x = -1.f;
+        l_y =  vf;
+        l_z =  uf;
+        break;
+    case TOP_MIDDLE:
+        l_x =  uf;
+        l_y =  vf;
+        l_z =  1.f;
+        break;
+    case TOP_RIGHT:
+        l_x =  1.f;
+        l_y =  vf;
+        l_z = -uf;
+        break;
+    case BOTTOM_LEFT:
+        l_x = -vf;
+        l_y =  1.f;
+        l_z = -uf;
+        break;
+    case BOTTOM_MIDDLE:
+        l_x = -vf;
+        l_y = -uf;
+        l_z = -1.f;
+        break;
+    case BOTTOM_RIGHT:
+        l_x = -vf;
+        l_y = -1.f;
+        l_z =  uf;
+        break;
+    default:
+        av_assert0(0);
+    }
+
+    vec[0] = l_x;
+    vec[1] = l_y;
+    vec[2] = l_z;
+
+    normalize_vector(vec);
+
+    return 1;
+}
+
+/**
+ * Calculate frame position in equi-angular cubemap format for corresponding 3D coordinates on sphere.
+ *
+ * @param s filter private context
+ * @param vec coordinates on sphere
+ * @param width frame width
+ * @param height frame height
+ * @param us horizontal coordinates for interpolation window
+ * @param vs vertical coordinates for interpolation window
+ * @param du horizontal relative coordinate
+ * @param dv vertical relative coordinate
+ */
+static int xyz_to_eac(const V360Context *s,
+                      const float *vec, int width, int height,
+                      int16_t us[4][4], int16_t vs[4][4], float *du, float *dv)
+{
+    const float pixel_pad = 2;
+    const float u_pad = pixel_pad / width;
+    const float v_pad = pixel_pad / height;
+
+    float uf, vf;
+    int ui, vi;
+    int direction, face;
+    int u_face, v_face;
+
+    xyz_to_cube(s, vec, &uf, &vf, &direction);
+
+    face = s->in_cubemap_face_order[direction];
+    u_face = face % 3;
+    v_face = face / 3;
+
+    uf = M_2_PI * atanf(uf) + 0.5f;
+    vf = M_2_PI * atanf(vf) + 0.5f;
+
+    // These formulas are inversed from eac_to_xyz ones
+    uf = (uf + u_face) * (1.f - 2.f * u_pad) / 3.f + u_pad;
+    vf = vf * (0.5f - 2.f * v_pad) + v_pad + 0.5f * v_face;
+
+    uf *= width;
+    vf *= height;
+
+    uf -= 0.5f;
+    vf -= 0.5f;
+
+    ui = floorf(uf);
+    vi = floorf(vf);
+
+    *du = uf - ui;
+    *dv = vf - vi;
+
+    for (int i = 0; i < 4; i++) {
+        for (int j = 0; j < 4; j++) {
+            us[i][j] = av_clip(ui + j - 1, 0, width  - 1);
+            vs[i][j] = av_clip(vi + i - 1, 0, height - 1);
+        }
+    }
+
+    return 1;
+}
+
+/**
+ * Prepare data for processing flat output format.
+ *
+ * @param ctx filter context
+ *
+ * @return error code
+ */
+static int prepare_flat_out(AVFilterContext *ctx)
+{
+    V360Context *s = ctx->priv;
+
+    s->flat_range[0] = tanf(0.5f * s->h_fov * M_PI / 180.f);
+    s->flat_range[1] = tanf(0.5f * s->v_fov * M_PI / 180.f);
+
+    return 0;
+}
+
+/**
+ * Calculate 3D coordinates on sphere for corresponding frame position in flat format.
+ *
+ * @param s filter private context
+ * @param i horizontal position on frame [0, width)
+ * @param j vertical position on frame [0, height)
+ * @param width frame width
+ * @param height frame height
+ * @param vec coordinates on sphere
+ */
+static int flat_to_xyz(const V360Context *s,
+                       int i, int j, int width, int height,
+                       float *vec)
+{
+    const float l_x = s->flat_range[0] * ((2.f * i + 0.5f) / width  - 1.f);
+    const float l_y = s->flat_range[1] * ((2.f * j + 0.5f) / height - 1.f);
+
+    vec[0] = l_x;
+    vec[1] = l_y;
+    vec[2] = 1.f;
+
+    normalize_vector(vec);
+
+    return 1;
+}
+
+/**
+ * Prepare data for processing fisheye output format.
+ *
+ * @param ctx filter context
+ *
+ * @return error code
+ */
+static int prepare_fisheye_out(AVFilterContext *ctx)
+{
+    V360Context *s = ctx->priv;
+
+    s->flat_range[0] = s->h_fov / 180.f;
+    s->flat_range[1] = s->v_fov / 180.f;
+
+    return 0;
+}
+
+/**
+ * Calculate 3D coordinates on sphere for corresponding frame position in fisheye format.
+ *
+ * @param s filter private context
+ * @param i horizontal position on frame [0, width)
+ * @param j vertical position on frame [0, height)
+ * @param width frame width
+ * @param height frame height
+ * @param vec coordinates on sphere
+ */
+static int fisheye_to_xyz(const V360Context *s,
+                          int i, int j, int width, int height,
+                          float *vec)
+{
+    const float uf = s->flat_range[0] * ((2.f * i) / width  - 1.f);
+    const float vf = s->flat_range[1] * ((2.f * j + 1.f) / height - 1.f);
+
+    const float phi   = atan2f(vf, uf);
+    const float theta = M_PI_2 * (1.f - hypotf(uf, vf));
+
+    const float sin_phi   = sinf(phi);
+    const float cos_phi   = cosf(phi);
+    const float sin_theta = sinf(theta);
+    const float cos_theta = cosf(theta);
+
+    vec[0] = cos_theta * cos_phi;
+    vec[1] = cos_theta * sin_phi;
+    vec[2] = sin_theta;
+
+    normalize_vector(vec);
+
+    return 1;
+}
+
+/**
+ * Prepare data for processing fisheye input format.
+ *
+ * @param ctx filter context
+ *
+ * @return error code
+ */
+static int prepare_fisheye_in(AVFilterContext *ctx)
+{
+    V360Context *s = ctx->priv;
+
+    s->iflat_range[0] = s->ih_fov / 180.f;
+    s->iflat_range[1] = s->iv_fov / 180.f;
+
+    return 0;
+}
+
+/**
+ * Calculate frame position in fisheye format for corresponding 3D coordinates on sphere.
+ *
+ * @param s filter private context
+ * @param vec coordinates on sphere
+ * @param width frame width
+ * @param height frame height
+ * @param us horizontal coordinates for interpolation window
+ * @param vs vertical coordinates for interpolation window
+ * @param du horizontal relative coordinate
+ * @param dv vertical relative coordinate
+ */
+static int xyz_to_fisheye(const V360Context *s,
+                          const float *vec, int width, int height,
+                          int16_t us[4][4], int16_t vs[4][4], float *du, float *dv)
+{
+    const float h   = hypotf(vec[0], vec[1]);
+    const float lh  = h > 0.f ? h : 1.f;
+    const float phi = atan2f(h, vec[2]) / M_PI;
+
+    float uf = vec[0] / lh * phi * s->input_mirror_modifier[0] / s->iflat_range[0];
+    float vf = vec[1] / lh * phi * s->input_mirror_modifier[1] / s->iflat_range[1];
+
+    const int visible = hypotf(uf, vf) <= 0.5f;
+    int ui, vi;
+
+    uf = (uf + 0.5f) * width;
+    vf = (vf + 0.5f) * height;
+
+    ui = floorf(uf);
+    vi = floorf(vf);
+
+    *du = visible ? uf - ui : 0.f;
+    *dv = visible ? vf - vi : 0.f;
+
+    for (int i = 0; i < 4; i++) {
+        for (int j = 0; j < 4; j++) {
+            us[i][j] = visible ? av_clip(ui + j - 1, 0, width  - 1) : 0;
+            vs[i][j] = visible ? av_clip(vi + i - 1, 0, height - 1) : 0;
+        }
+    }
+
+    return visible;
+}
+
+/**
+ * Calculate 3D coordinates on sphere for corresponding frame position in pannini format.
+ *
+ * @param s filter private context
+ * @param i horizontal position on frame [0, width)
+ * @param j vertical position on frame [0, height)
+ * @param width frame width
+ * @param height frame height
+ * @param vec coordinates on sphere
+ */
+static int pannini_to_xyz(const V360Context *s,
+                          int i, int j, int width, int height,
+                          float *vec)
+{
+    const float uf = ((2.f * i + 1.f) / width  - 1.f);
+    const float vf = ((2.f * j + 1.f) / height - 1.f);
+
+    const float d = s->h_fov;
+    const float k = uf * uf / ((d + 1.f) * (d + 1.f));
+    const float dscr = k * k * d * d - (k + 1.f) * (k * d * d - 1.f);
+    const float clon = (-k * d + sqrtf(dscr)) / (k + 1.f);
+    const float S = (d + 1.f) / (d + clon);
+    const float lon = atan2f(uf, S * clon);
+    const float lat = atan2f(vf, S);
+
+    vec[0] = sinf(lon) * cosf(lat);
+    vec[1] = sinf(lat);
+    vec[2] = cosf(lon) * cosf(lat);
+
+    normalize_vector(vec);
+
+    return 1;
+}
+
+/**
+ * Calculate frame position in pannini format for corresponding 3D coordinates on sphere.
+ *
+ * @param s filter private context
+ * @param vec coordinates on sphere
+ * @param width frame width
+ * @param height frame height
+ * @param us horizontal coordinates for interpolation window
+ * @param vs vertical coordinates for interpolation window
+ * @param du horizontal relative coordinate
+ * @param dv vertical relative coordinate
+ */
+static int xyz_to_pannini(const V360Context *s,
+                          const float *vec, int width, int height,
+                          int16_t us[4][4], int16_t vs[4][4], float *du, float *dv)
+{
+    const float phi   = atan2f(vec[0], vec[2]) * s->input_mirror_modifier[0];
+    const float theta = asinf(vec[1]) * s->input_mirror_modifier[1];
+
+    const float d = s->ih_fov;
+    const float S = (d + 1.f) / (d + cosf(phi));
+
+    const float x = S * sinf(phi);
+    const float y = S * tanf(theta);
+
+    const float uf = (x + 1.f) * width  / 2.f;
+    const float vf = (y + 1.f) * height / 2.f;
+
+    const int ui = floorf(uf);
+    const int vi = floorf(vf);
+
+    const int visible = vi >= 0 && vi < height && ui >= 0 && ui < width && vec[2] >= 0.f;
+
+    *du = uf - ui;
+    *dv = vf - vi;
+
+    for (int i = 0; i < 4; i++) {
+        for (int j = 0; j < 4; j++) {
+            us[i][j] = visible ? av_clip(ui + j - 1, 0, width  - 1) : 0;
+            vs[i][j] = visible ? av_clip(vi + i - 1, 0, height - 1) : 0;
+        }
+    }
+
+    return visible;
+}
+
+/**
+ * Prepare data for processing cylindrical output format.
+ *
+ * @param ctx filter context
+ *
+ * @return error code
+ */
+static int prepare_cylindrical_out(AVFilterContext *ctx)
+{
+    V360Context *s = ctx->priv;
+
+    s->flat_range[0] = M_PI * s->h_fov / 360.f;
+    s->flat_range[1] = tanf(0.5f * s->v_fov * M_PI / 180.f);
+
+    return 0;
+}
+
+/**
+ * Calculate 3D coordinates on sphere for corresponding frame position in cylindrical format.
+ *
+ * @param s filter private context
+ * @param i horizontal position on frame [0, width)
+ * @param j vertical position on frame [0, height)
+ * @param width frame width
+ * @param height frame height
+ * @param vec coordinates on sphere
+ */
+static int cylindrical_to_xyz(const V360Context *s,
+                              int i, int j, int width, int height,
+                              float *vec)
+{
+    const float uf = s->flat_range[0] * ((2.f * i + 1.f) / width  - 1.f);
+    const float vf = s->flat_range[1] * ((2.f * j + 1.f) / height - 1.f);
+
+    const float phi   = uf;
+    const float theta = atanf(vf);
+
+    const float sin_phi   = sinf(phi);
+    const float cos_phi   = cosf(phi);
+    const float sin_theta = sinf(theta);
+    const float cos_theta = cosf(theta);
+
+    vec[0] = cos_theta * sin_phi;
+    vec[1] = sin_theta;
+    vec[2] = cos_theta * cos_phi;
+
+    normalize_vector(vec);
+
+    return 1;
+}
+
+/**
+ * Prepare data for processing cylindrical input format.
+ *
+ * @param ctx filter context
+ *
+ * @return error code
+ */
+static int prepare_cylindrical_in(AVFilterContext *ctx)
+{
+    V360Context *s = ctx->priv;
+
+    s->iflat_range[0] = M_PI * s->ih_fov / 360.f;
+    s->iflat_range[1] = tanf(0.5f * s->iv_fov * M_PI / 180.f);
+
+    return 0;
+}
+
+/**
+ * Calculate frame position in cylindrical format for corresponding 3D coordinates on sphere.
+ *
+ * @param s filter private context
+ * @param vec coordinates on sphere
+ * @param width frame width
+ * @param height frame height
+ * @param us horizontal coordinates for interpolation window
+ * @param vs vertical coordinates for interpolation window
+ * @param du horizontal relative coordinate
+ * @param dv vertical relative coordinate
+ */
+static int xyz_to_cylindrical(const V360Context *s,
+                              const float *vec, int width, int height,
+                              int16_t us[4][4], int16_t vs[4][4], float *du, float *dv)
+{
+    const float phi   = atan2f(vec[0], vec[2]) * s->input_mirror_modifier[0] / s->iflat_range[0];
+    const float theta = asinf(vec[1]) * s->input_mirror_modifier[1];
+
+    const float uf = (phi + 1.f) * (width - 1) / 2.f;
+    const float vf = (tanf(theta) / s->iflat_range[1] + 1.f) * height / 2.f;
+
+    const int ui = floorf(uf);
+    const int vi = floorf(vf);
+
+    const int visible = vi >= 0 && vi < height && ui >= 0 && ui < width &&
+                        theta <=  M_PI * s->iv_fov / 180.f &&
+                        theta >= -M_PI * s->iv_fov / 180.f;
+
+    *du = uf - ui;
+    *dv = vf - vi;
+
+    for (int i = 0; i < 4; i++) {
+        for (int j = 0; j < 4; j++) {
+            us[i][j] = visible ? av_clip(ui + j - 1, 0, width  - 1) : 0;
+            vs[i][j] = visible ? av_clip(vi + i - 1, 0, height - 1) : 0;
+        }
+    }
+
+    return visible;
+}
+
+/**
+ * Calculate 3D coordinates on sphere for corresponding frame position in perspective format.
+ *
+ * @param s filter private context
+ * @param i horizontal position on frame [0, width)
+ * @param j vertical position on frame [0, height)
+ * @param width frame width
+ * @param height frame height
+ * @param vec coordinates on sphere
+ */
+static int perspective_to_xyz(const V360Context *s,
+                              int i, int j, int width, int height,
+                              float *vec)
+{
+    const float uf = ((2.f * i + 1.f) / width  - 1.f);
+    const float vf = ((2.f * j + 1.f) / height - 1.f);
+    const float rh = hypotf(uf, vf);
+    const float sinzz = 1.f - rh * rh;
+    const float h = 1.f + s->v_fov;
+    const float sinz = (h - sqrtf(sinzz)) / (h / rh + rh / h);
+    const float sinz2 = sinz * sinz;
+
+    if (sinz2 <= 1.f) {
+        const float cosz = sqrtf(1.f - sinz2);
+
+        const float theta = asinf(cosz);
+        const float phi   = atan2f(uf, vf);
+
+        const float sin_phi   = sinf(phi);
+        const float cos_phi   = cosf(phi);
+        const float sin_theta = sinf(theta);
+        const float cos_theta = cosf(theta);
+
+        vec[0] = cos_theta * sin_phi;
+        vec[1] = sin_theta;
+        vec[2] = cos_theta * cos_phi;
+    } else {
+        vec[0] = 0.f;
+        vec[1] = 1.f;
+        vec[2] = 0.f;
+        return 0;
+    }
+
+    normalize_vector(vec);
+    return 1;
+}
+
+/**
+ * Calculate 3D coordinates on sphere for corresponding frame position in tetrahedron format.
+ *
+ * @param s filter private context
+ * @param i horizontal position on frame [0, width)
+ * @param j vertical position on frame [0, height)
+ * @param width frame width
+ * @param height frame height
+ * @param vec coordinates on sphere
+ */
+static int tetrahedron_to_xyz(const V360Context *s,
+                              int i, int j, int width, int height,
+                              float *vec)
+{
+    const float uf = (float)i / width;
+    const float vf = (float)j / height;
+
+    vec[0] = uf < 0.5f ? uf * 4.f - 1.f : 3.f - uf * 4.f;
+    vec[1] = 1.f - vf * 2.f;
+    vec[2] = 2.f * fabsf(1.f - fabsf(1.f - uf * 2.f + vf)) - 1.f;
+
+    normalize_vector(vec);
+
+    return 1;
+}
+
+/**
+ * Calculate frame position in tetrahedron format for corresponding 3D coordinates on sphere.
+ *
+ * @param s filter private context
+ * @param vec coordinates on sphere
+ * @param width frame width
+ * @param height frame height
+ * @param us horizontal coordinates for interpolation window
+ * @param vs vertical coordinates for interpolation window
+ * @param du horizontal relative coordinate
+ * @param dv vertical relative coordinate
+ */
+static int xyz_to_tetrahedron(const V360Context *s,
+                              const float *vec, int width, int height,
+                              int16_t us[4][4], int16_t vs[4][4], float *du, float *dv)
+{
+    const float d0 = vec[0] * 1.f + vec[1] * 1.f + vec[2] *-1.f;
+    const float d1 = vec[0] *-1.f + vec[1] *-1.f + vec[2] *-1.f;
+    const float d2 = vec[0] * 1.f + vec[1] *-1.f + vec[2] * 1.f;
+    const float d3 = vec[0] *-1.f + vec[1] * 1.f + vec[2] * 1.f;
+    const float d = FFMAX(d0, FFMAX3(d1, d2, d3));
+
+    float uf, vf, x, y, z;
+    int ui, vi;
+
+    x =  vec[0] / d;
+    y =  vec[1] / d;
+    z = -vec[2] / d;
+
+    vf = 0.5f - y * 0.5f * s->input_mirror_modifier[1];
+
+    if ((x + y >= 0.f &&  y + z >= 0.f && -z - x <= 0.f) ||
+        (x + y <= 0.f && -y + z >= 0.f &&  z - x >= 0.f)) {
+        uf = 0.25f * x * s->input_mirror_modifier[0] + 0.25f;
+    }  else {
+        uf = 0.75f - 0.25f * x * s->input_mirror_modifier[0];
+    }
+
+    uf *= width;
+    vf *= height;
+
+    ui = floorf(uf);
+    vi = floorf(vf);
+
+    *du = uf - ui;
+    *dv = vf - vi;
+
+    for (int i = 0; i < 4; i++) {
+        for (int j = 0; j < 4; j++) {
+            us[i][j] = reflectx(ui + j - 1, vi + i - 1, width, height);
+            vs[i][j] = reflecty(vi + i - 1, height);
+        }
+    }
+
+    return 1;
+}
+
+/**
+ * Calculate 3D coordinates on sphere for corresponding frame position in dual fisheye format.
+ *
+ * @param s filter private context
+ * @param i horizontal position on frame [0, width)
+ * @param j vertical position on frame [0, height)
+ * @param width frame width
+ * @param height frame height
+ * @param vec coordinates on sphere
+ */
+static int dfisheye_to_xyz(const V360Context *s,
+                           int i, int j, int width, int height,
+                           float *vec)
+{
+    const float scale = 1.f + s->out_pad;
+
+    const float ew = width / 2.f;
+    const float eh = height;
+
+    const int ei = i >= ew ? i - ew : i;
+    const float m = i >= ew ? 1.f : -1.f;
+
+    const float uf = ((2.f * ei) / ew - 1.f) * scale;
+    const float vf = ((2.f * j + 1.f) / eh - 1.f) * scale;
+
+    const float h     = hypotf(uf, vf);
+    const float lh    = h > 0.f ? h : 1.f;
+    const float theta = m * M_PI_2 * (1.f - h);
+
+    const float sin_theta = sinf(theta);
+    const float cos_theta = cosf(theta);
+
+    vec[0] = cos_theta * m * uf / lh;
+    vec[1] = cos_theta *     vf / lh;
+    vec[2] = sin_theta;
+
+    normalize_vector(vec);
+
+    return 1;
+}
+
+/**
+ * Calculate frame position in dual fisheye format for corresponding 3D coordinates on sphere.
+ *
+ * @param s filter private context
+ * @param vec coordinates on sphere
+ * @param width frame width
+ * @param height frame height
+ * @param us horizontal coordinates for interpolation window
+ * @param vs vertical coordinates for interpolation window
+ * @param du horizontal relative coordinate
+ * @param dv vertical relative coordinate
+ */
+static int xyz_to_dfisheye(const V360Context *s,
+                           const float *vec, int width, int height,
+                           int16_t us[4][4], int16_t vs[4][4], float *du, float *dv)
+{
+    const float scale = 1.f - s->in_pad;
+
+    const float ew = width / 2.f;
+    const float eh = height;
+
+    const float h     = hypotf(vec[0], vec[1]);
+    const float lh    = h > 0.f ? h : 1.f;
+    const float theta = acosf(fabsf(vec[2])) / M_PI;
+
+    float uf = (theta * (vec[0] / lh) * s->input_mirror_modifier[0] * scale + 0.5f) * ew;
+    float vf = (theta * (vec[1] / lh) * s->input_mirror_modifier[1] * scale + 0.5f) * eh;
+
+    int ui, vi;
+    int u_shift;
+
+    if (vec[2] >= 0.f) {
+        u_shift = ceilf(ew);
+    } else {
+        u_shift = 0;
+        uf = ew - uf;
+    }
+
+    ui = floorf(uf);
+    vi = floorf(vf);
+
+    *du = uf - ui;
+    *dv = vf - vi;
+
+    for (int i = 0; i < 4; i++) {
+        for (int j = 0; j < 4; j++) {
+            us[i][j] = av_clip(u_shift + ui + j - 1, 0, width  - 1);
+            vs[i][j] = av_clip(          vi + i - 1, 0, height - 1);
+        }
+    }
+
+    return 1;
+}
+
+/**
+ * Calculate 3D coordinates on sphere for corresponding frame position in barrel facebook's format.
+ *
+ * @param s filter private context
+ * @param i horizontal position on frame [0, width)
+ * @param j vertical position on frame [0, height)
+ * @param width frame width
+ * @param height frame height
+ * @param vec coordinates on sphere
+ */
+static int barrel_to_xyz(const V360Context *s,
+                         int i, int j, int width, int height,
+                         float *vec)
+{
+    const float scale = 0.99f;
+    float l_x, l_y, l_z;
+
+    if (i < 4 * width / 5) {
+        const float theta_range = M_PI_4;
+
+        const int ew = 4 * width / 5;
+        const int eh = height;
+
+        const float phi   = ((2.f * i) / ew - 1.f) * M_PI        / scale;
+        const float theta = ((2.f * j) / eh - 1.f) * theta_range / scale;
+
+        const float sin_phi   = sinf(phi);
+        const float cos_phi   = cosf(phi);
+        const float sin_theta = sinf(theta);
+        const float cos_theta = cosf(theta);
+
+        l_x = cos_theta * sin_phi;
+        l_y = sin_theta;
+        l_z = cos_theta * cos_phi;
+    } else {
+        const int ew = width  / 5;
+        const int eh = height / 2;
+
+        float uf, vf;
+
+        if (j < eh) {   // UP
+            uf = 2.f * (i - 4 * ew) / ew - 1.f;
+            vf = 2.f * (j         ) / eh - 1.f;
+
+            uf /= scale;
+            vf /= scale;
+
+            l_x =  uf;
+            l_y = -1.f;
+            l_z =  vf;
+        } else {            // DOWN
+            uf = 2.f * (i - 4 * ew) / ew - 1.f;
+            vf = 2.f * (j -     eh) / eh - 1.f;
+
+            uf /= scale;
+            vf /= scale;
+
+            l_x =  uf;
+            l_y =  1.f;
+            l_z = -vf;
+        }
+    }
+
+    vec[0] = l_x;
+    vec[1] = l_y;
+    vec[2] = l_z;
+
+    normalize_vector(vec);
+
+    return 1;
+}
+
+/**
+ * Calculate frame position in barrel facebook's format for corresponding 3D coordinates on sphere.
+ *
+ * @param s filter private context
+ * @param vec coordinates on sphere
+ * @param width frame width
+ * @param height frame height
+ * @param us horizontal coordinates for interpolation window
+ * @param vs vertical coordinates for interpolation window
+ * @param du horizontal relative coordinate
+ * @param dv vertical relative coordinate
+ */
+static int xyz_to_barrel(const V360Context *s,
+                         const float *vec, int width, int height,
+                         int16_t us[4][4], int16_t vs[4][4], float *du, float *dv)
+{
+    const float scale = 0.99f;
+
+    const float phi   = atan2f(vec[0], vec[2]) * s->input_mirror_modifier[0];
+    const float theta = asinf(vec[1]) * s->input_mirror_modifier[1];
+    const float theta_range = M_PI_4;
+
+    int ew, eh;
+    int u_shift, v_shift;
+    float uf, vf;
+    int ui, vi;
+
+    if (theta > -theta_range && theta < theta_range) {
+        ew = 4 * width / 5;
+        eh = height;
+
+        u_shift = s->ih_flip ? width / 5 : 0;
+        v_shift = 0;
+
+        uf = (phi   / M_PI        * scale + 1.f) * ew / 2.f;
+        vf = (theta / theta_range * scale + 1.f) * eh / 2.f;
+    } else {
+        ew = width  / 5;
+        eh = height / 2;
+
+        u_shift = s->ih_flip ? 0 : 4 * ew;
+
+        if (theta < 0.f) {  // UP
+            uf = -vec[0] / vec[1];
+            vf = -vec[2] / vec[1];
+            v_shift = 0;
+        } else {            // DOWN
+            uf =  vec[0] / vec[1];
+            vf = -vec[2] / vec[1];
+            v_shift = eh;
+        }
+
+        uf *= s->input_mirror_modifier[0] * s->input_mirror_modifier[1];
+        vf *= s->input_mirror_modifier[1];
+
+        uf = 0.5f * ew * (uf * scale + 1.f);
+        vf = 0.5f * eh * (vf * scale + 1.f);
+    }
+
+    ui = floorf(uf);
+    vi = floorf(vf);
+
+    *du = uf - ui;
+    *dv = vf - vi;
+
+    for (int i = 0; i < 4; i++) {
+        for (int j = 0; j < 4; j++) {
+            us[i][j] = u_shift + av_clip(ui + j - 1, 0, ew - 1);
+            vs[i][j] = v_shift + av_clip(vi + i - 1, 0, eh - 1);
+        }
+    }
+
+    return 1;
+}
+
+/**
+ * Calculate frame position in barrel split facebook's format for corresponding 3D coordinates on sphere.
+ *
+ * @param s filter private context
+ * @param vec coordinates on sphere
+ * @param width frame width
+ * @param height frame height
+ * @param us horizontal coordinates for interpolation window
+ * @param vs vertical coordinates for interpolation window
+ * @param du horizontal relative coordinate
+ * @param dv vertical relative coordinate
+ */
+static int xyz_to_barrelsplit(const V360Context *s,
+                              const float *vec, int width, int height,
+                              int16_t us[4][4], int16_t vs[4][4], float *du, float *dv)
+{
+    const float phi   = atan2f(vec[0], vec[2]) * s->input_mirror_modifier[0];
+    const float theta = asinf(vec[1]) * s->input_mirror_modifier[1];
+
+    const float theta_range = M_PI_4;
+
+    int ew, eh;
+    int u_shift, v_shift;
+    float uf, vf;
+    int ui, vi;
+
+    if (theta >= -theta_range && theta <= theta_range) {
+        const float scalew = s->fin_pad > 0 ? 1.f - s->fin_pad / (width * 2.f / 3.f) : 1.f - s->in_pad;
+        const float scaleh = s->fin_pad > 0 ? 1.f - s->fin_pad / (height / 2.f) : 1.f - s->in_pad;
+
+        ew = width / 3 * 2;
+        eh = height / 2;
+
+        u_shift = s->ih_flip ? width / 3 : 0;
+        v_shift = phi >= M_PI_2 || phi < -M_PI_2 ? eh : 0;
+
+        uf = fmodf(phi, M_PI_2) / M_PI_2;
+        vf = theta / M_PI_4;
+
+        if (v_shift)
+            uf = uf >= 0.f ? fmodf(uf - 1.f, 1.f) : fmodf(uf + 1.f, 1.f);
+
+        uf = (uf * scalew + 1.f) * width  / 3.f;
+        vf = (vf * scaleh + 1.f) * height / 4.f;
+    } else {
+        const float scalew = s->fin_pad > 0 ? 1.f - s->fin_pad / (width  / 3.f) : 1.f - s->in_pad;
+        const float scaleh = s->fin_pad > 0 ? 1.f - s->fin_pad / (height / 4.f) : 1.f - s->in_pad;
+        int v_offset = 0;
+
+        ew = width  / 3;
+        eh = height / 4;
+
+        u_shift = s->ih_flip ? 0 : 2 * ew;
+
+        if (theta <= 0.f && theta >= -M_PI_2 &&
+            phi <= M_PI_2 && phi >= -M_PI_2) {
+            uf = -vec[0] / vec[1];
+            vf = -vec[2] / vec[1];
+            v_shift = 0;
+            v_offset = -eh;
+        } else if (theta >= 0.f && theta <= M_PI_2 &&
+                   phi <= M_PI_2 && phi >= -M_PI_2) {
+            uf =  vec[0] / vec[1];
+            vf = -vec[2] / vec[1];
+            v_shift = height * 0.25f;
+        } else if (theta <= 0.f && theta >= -M_PI_2) {
+            uf =  vec[0] / vec[1];
+            vf =  vec[2] / vec[1];
+            v_shift = height * 0.5f;
+            v_offset = -eh;
+        } else {
+            uf = -vec[0] / vec[1];
+            vf =  vec[2] / vec[1];
+            v_shift = height * 0.75f;
+        }
+
+        uf *= s->input_mirror_modifier[0] * s->input_mirror_modifier[1];
+        vf *= s->input_mirror_modifier[1];
+
+        uf = 0.5f * width / 3.f * (uf * scalew + 1.f);
+        vf = height * 0.25f * (vf * scaleh + 1.f) + v_offset;
+    }
+
+    ui = floorf(uf);
+    vi = floorf(vf);
+
+    *du = uf - ui;
+    *dv = vf - vi;
+
+    for (int i = 0; i < 4; i++) {
+        for (int j = 0; j < 4; j++) {
+            us[i][j] = u_shift + av_clip(ui + j - 1, 0, ew - 1);
+            vs[i][j] = v_shift + av_clip(vi + i - 1, 0, eh - 1);
+        }
+    }
+
+    return 1;
+}
+
+/**
+ * Calculate 3D coordinates on sphere for corresponding frame position in barrel split facebook's format.
+ *
+ * @param s filter private context
+ * @param i horizontal position on frame [0, width)
+ * @param j vertical position on frame [0, height)
+ * @param width frame width
+ * @param height frame height
+ * @param vec coordinates on sphere
+ */
+static int barrelsplit_to_xyz(const V360Context *s,
+                              int i, int j, int width, int height,
+                              float *vec)
+{
+    const float x = (i + 0.5f) / width;
+    const float y = (j + 0.5f) / height;
+    float l_x, l_y, l_z;
+
+    if (x < 2.f / 3.f) {
+        const float scalew = s->fout_pad > 0 ? 1.f - s->fout_pad / (width * 2.f / 3.f) : 1.f - s->out_pad;
+        const float scaleh = s->fout_pad > 0 ? 1.f - s->fout_pad / (height / 2.f) : 1.f - s->out_pad;
+
+        const float back = floorf(y * 2.f);
+
+        const float phi   = ((3.f / 2.f * x - 0.5f) / scalew - back) * M_PI;
+        const float theta = (y - 0.25f - 0.5f * back) / scaleh * M_PI;
+
+        const float sin_phi   = sinf(phi);
+        const float cos_phi   = cosf(phi);
+        const float sin_theta = sinf(theta);
+        const float cos_theta = cosf(theta);
+
+        l_x = cos_theta * sin_phi;
+        l_y = sin_theta;
+        l_z = cos_theta * cos_phi;
+    } else {
+        const float scalew = s->fout_pad > 0 ? 1.f - s->fout_pad / (width  / 3.f) : 1.f - s->out_pad;
+        const float scaleh = s->fout_pad > 0 ? 1.f - s->fout_pad / (height / 4.f) : 1.f - s->out_pad;
+
+        const int face = floorf(y * 4.f);
+        float uf, vf;
+
+        uf = x * 3.f - 2.f;
+
+        switch (face) {
+        case 0:
+            vf = y * 2.f;
+            uf = 1.f - uf;
+            vf = 0.5f - vf;
+
+            l_x = (0.5f - uf) / scalew;
+            l_y = -0.5f;
+            l_z = (0.5f - vf) / scaleh;
+            break;
+        case 1:
+            vf = y * 2.f;
+            uf = 1.f - uf;
+            vf = 1.f - (vf - 0.5f);
+
+            l_x = (0.5f - uf) / scalew;
+            l_y =  0.5f;
+            l_z = (-0.5f + vf) / scaleh;
+            break;
+        case 2:
+            vf = y * 2.f - 0.5f;
+            vf = 1.f - (1.f - vf);
+
+            l_x = (0.5f - uf) / scalew;
+            l_y = -0.5f;
+            l_z = (0.5f - vf) / scaleh;
+            break;
+        case 3:
+            vf = y * 2.f - 1.5f;
+
+            l_x = (0.5f - uf) / scalew;
+            l_y =  0.5f;
+            l_z = (-0.5f + vf) / scaleh;
+            break;
+        }
+    }
+
+    vec[0] = l_x;
+    vec[1] = l_y;
+    vec[2] = l_z;
+
+    normalize_vector(vec);
+
+    return 1;
+}
+
+/**
+ * Calculate 3D coordinates on sphere for corresponding frame position in tspyramid format.
+ *
+ * @param s filter private context
+ * @param i horizontal position on frame [0, width)
+ * @param j vertical position on frame [0, height)
+ * @param width frame width
+ * @param height frame height
+ * @param vec coordinates on sphere
+ */
+static int tspyramid_to_xyz(const V360Context *s,
+                            int i, int j, int width, int height,
+                            float *vec)
+{
+    const float x = (i + 0.5f) / width;
+    const float y = (j + 0.5f) / height;
+
+    if (x < 0.5f) {
+        vec[0] =  x * 4.f - 1.f;
+        vec[1] = (y * 2.f - 1.f);
+        vec[2] = 1.f;
+    } else if (x >= 0.6875f && x < 0.8125f &&
+               y >= 0.375f  && y < 0.625f) {
+        vec[0] = -(x - 0.6875f) * 16.f + 1.f;
+        vec[1] = (y - 0.375f) * 8.f - 1.f;
+        vec[2] = -1.f;
+    } else if (0.5f <= x && x < 0.6875f &&
+               ((0.f <= y && y < 0.375f && y >= 2.f * (x - 0.5f)) ||
+                (0.375f <= y && y < 0.625f) ||
+                (0.625f <= y && y < 1.f && y <= 2.f * (1.f - x)))) {
+        vec[0] =  1.f;
+        vec[1] =  2.f * (y - 2.f * x + 1.f) / (3.f - 4.f * x) - 1.f;
+        vec[2] = -2.f * (x - 0.5f) / 0.1875f + 1.f;
+    } else if (0.8125f <= x && x < 1.f &&
+               ((0.f <= y && y < 0.375f && x >= (1.f - y / 2.f)) ||
+                (0.375f <= y && y < 0.625f) ||
+                (0.625f <= y && y < 1.f && y <= (2.f * x - 1.f)))) {
+        vec[0] = -1.f;
+        vec[1] =  2.f * (y + 2.f * x - 2.f) / (4.f * x - 3.f) - 1.f;
+        vec[2] =  2.f * (x - 0.8125f) / 0.1875f - 1.f;
+    } else if (0.f <= y && y < 0.375f &&
+               ((0.5f <= x && x < 0.8125f && y < 2.f * (x - 0.5f)) ||
+                (0.6875f <= x && x < 0.8125f) ||
+                (0.8125f <= x && x < 1.f && x < (1.f - y / 2.f)))) {
+        vec[0] =  2.f * (1.f - x - 0.5f * y) / (0.5f - y) - 1.f;
+        vec[1] = -1.f;
+        vec[2] =  2.f * (0.375f - y) / 0.375f - 1.f;
+    } else {
+        vec[0] =  2.f * (0.5f - x + 0.5f * y) / (y - 0.5f) - 1.f;
+        vec[1] =  1.f;
+        vec[2] = -2.f * (1.f - y) / 0.375f + 1.f;
+    }
+
+    normalize_vector(vec);
+
+    return 1;
+}
+
+/**
+ * Calculate frame position in tspyramid format for corresponding 3D coordinates on sphere.
+ *
+ * @param s filter private context
+ * @param vec coordinates on sphere
+ * @param width frame width
+ * @param height frame height
+ * @param us horizontal coordinates for interpolation window
+ * @param vs vertical coordinates for interpolation window
+ * @param du horizontal relative coordinate
+ * @param dv vertical relative coordinate
+ */
+static int xyz_to_tspyramid(const V360Context *s,
+                            const float *vec, int width, int height,
+                            int16_t us[4][4], int16_t vs[4][4], float *du, float *dv)
+{
+    float uf, vf;
+    int ui, vi;
+    int face;
+
+    xyz_to_cube(s, vec, &uf, &vf, &face);
+
+    uf = (uf + 1.f) * 0.5f;
+    vf = (vf + 1.f) * 0.5f;
+
+    switch (face) {
+    case UP:
+        uf = 0.1875f * vf - 0.375f * uf * vf - 0.125f * uf + 0.8125f;
+        vf = 0.375f - 0.375f * vf;
+        break;
+    case FRONT:
+        uf = 0.5f * uf;
+        break;
+    case DOWN:
+        uf = 1.f - 0.1875f * vf - 0.5f * uf + 0.375f * uf * vf;
+        vf = 1.f - 0.375f * vf;
+        break;
+    case LEFT:
+        vf = 0.25f * vf + 0.75f * uf * vf - 0.375f * uf + 0.375f;
+        uf = 0.1875f * uf + 0.8125f;
+        break;
+    case RIGHT:
+        vf = 0.375f * uf - 0.75f * uf * vf + vf;
+        uf = 0.1875f * uf + 0.5f;
+        break;
+    case BACK:
+        uf = 0.125f * uf + 0.6875f;
+        vf = 0.25f * vf + 0.375f;
+        break;
+    }
+
+    uf *= width;
+    vf *= height;
+
+    ui = floorf(uf);
+    vi = floorf(vf);
+
+    *du = uf - ui;
+    *dv = vf - vi;
+
+    for (int i = 0; i < 4; i++) {
+        for (int j = 0; j < 4; j++) {
+            us[i][j] = reflectx(ui + j - 1, vi + i - 1, width, height);
+            vs[i][j] = reflecty(vi + i - 1, height);
+        }
+    }
+
+    return 1;
+}
+
+static void multiply_matrix(float c[3][3], const float a[3][3], const float b[3][3])
+{
+    for (int i = 0; i < 3; i++) {
+        for (int j = 0; j < 3; j++) {
+            float sum = 0.f;
+
+            for (int k = 0; k < 3; k++)
+                sum += a[i][k] * b[k][j];
+
+            c[i][j] = sum;
+        }
+    }
+}
+
+/**
+ * Calculate rotation matrix for yaw/pitch/roll angles.
+ */
+static inline void calculate_rotation_matrix(float yaw, float pitch, float roll,
+                                             float rot_mat[3][3],
+                                             const int rotation_order[3])
+{
+    const float yaw_rad   = yaw   * M_PI / 180.f;
+    const float pitch_rad = pitch * M_PI / 180.f;
+    const float roll_rad  = roll  * M_PI / 180.f;
+
+    const float sin_yaw   = sinf(yaw_rad);
+    const float cos_yaw   = cosf(yaw_rad);
+    const float sin_pitch = sinf(pitch_rad);
+    const float cos_pitch = cosf(pitch_rad);
+    const float sin_roll  = sinf(roll_rad);
+    const float cos_roll  = cosf(roll_rad);
+
+    float m[3][3][3];
+    float temp[3][3];
+
+    m[0][0][0] =  cos_yaw;  m[0][0][1] = 0;          m[0][0][2] =  sin_yaw;
+    m[0][1][0] =  0;        m[0][1][1] = 1;          m[0][1][2] =  0;
+    m[0][2][0] = -sin_yaw;  m[0][2][1] = 0;          m[0][2][2] =  cos_yaw;
+
+    m[1][0][0] = 1;         m[1][0][1] = 0;          m[1][0][2] =  0;
+    m[1][1][0] = 0;         m[1][1][1] = cos_pitch;  m[1][1][2] = -sin_pitch;
+    m[1][2][0] = 0;         m[1][2][1] = sin_pitch;  m[1][2][2] =  cos_pitch;
+
+    m[2][0][0] = cos_roll;  m[2][0][1] = -sin_roll;  m[2][0][2] =  0;
+    m[2][1][0] = sin_roll;  m[2][1][1] =  cos_roll;  m[2][1][2] =  0;
+    m[2][2][0] = 0;         m[2][2][1] =  0;         m[2][2][2] =  1;
+
+    multiply_matrix(temp, m[rotation_order[0]], m[rotation_order[1]]);
+    multiply_matrix(rot_mat, temp, m[rotation_order[2]]);
+}
+
+/**
+ * Rotate vector with given rotation matrix.
+ *
+ * @param rot_mat rotation matrix
+ * @param vec vector
+ */
+static inline void rotate(const float rot_mat[3][3],
+                          float *vec)
+{
+    const float x_tmp = vec[0] * rot_mat[0][0] + vec[1] * rot_mat[0][1] + vec[2] * rot_mat[0][2];
+    const float y_tmp = vec[0] * rot_mat[1][0] + vec[1] * rot_mat[1][1] + vec[2] * rot_mat[1][2];
+    const float z_tmp = vec[0] * rot_mat[2][0] + vec[1] * rot_mat[2][1] + vec[2] * rot_mat[2][2];
+
+    vec[0] = x_tmp;
+    vec[1] = y_tmp;
+    vec[2] = z_tmp;
+}
+
+static inline void set_mirror_modifier(int h_flip, int v_flip, int d_flip,
+                                       float *modifier)
+{
+    modifier[0] = h_flip ? -1.f : 1.f;
+    modifier[1] = v_flip ? -1.f : 1.f;
+    modifier[2] = d_flip ? -1.f : 1.f;
+}
+
+static inline void mirror(const float *modifier, float *vec)
+{
+    vec[0] *= modifier[0];
+    vec[1] *= modifier[1];
+    vec[2] *= modifier[2];
+}
+
+static int allocate_plane(V360Context *s, int sizeof_uv, int sizeof_ker, int sizeof_mask, int p)
+{
+    if (!s->u[p])
+        s->u[p] = av_calloc(s->uv_linesize[p] * s->pr_height[p], sizeof_uv);
+    if (!s->v[p])
+        s->v[p] = av_calloc(s->uv_linesize[p] * s->pr_height[p], sizeof_uv);
+    if (!s->u[p] || !s->v[p])
+        return AVERROR(ENOMEM);
+    if (sizeof_ker) {
+        if (!s->ker[p])
+            s->ker[p] = av_calloc(s->uv_linesize[p] * s->pr_height[p], sizeof_ker);
+        if (!s->ker[p])
+            return AVERROR(ENOMEM);
+    }
+
+    if (sizeof_mask && !p) {
+        if (!s->mask)
+            s->mask = av_calloc(s->pr_width[p] * s->pr_height[p], sizeof_mask);
+        if (!s->mask)
+            return AVERROR(ENOMEM);
+    }
+
+    return 0;
+}
+
+static void fov_from_dfov(int format, float d_fov, float w, float h, float *h_fov, float *v_fov)
+{
+    switch (format) {
+    case STEREOGRAPHIC:
+        {
+            const float d = 0.5f * hypotf(w, h);
+            const float l = d / (tanf(d_fov * M_PI / 720.f));
+
+            *h_fov = 2.f * atan2f(w * 0.5f, l) * 360.f / M_PI;
+            *v_fov = 2.f * atan2f(h * 0.5f, l) * 360.f / M_PI;
+        }
+        break;
+    case FISHEYE:
+        {
+            const float d = 0.5f * hypotf(w, h);
+
+            *h_fov = d / w * d_fov;
+            *v_fov = d / h * d_fov;
+        }
+        break;
+    case FLAT:
+    default:
+        {
+            const float da = tanf(0.5f * FFMIN(d_fov, 359.f) * M_PI / 180.f);
+            const float d = hypotf(w, h);
+
+            *h_fov = atan2f(da * w, d) * 360.f / M_PI;
+            *v_fov = atan2f(da * h, d) * 360.f / M_PI;
+
+            if (*h_fov < 0.f)
+                *h_fov += 360.f;
+            if (*v_fov < 0.f)
+                *v_fov += 360.f;
+        }
+        break;
+    }
+}
+
+static void set_dimensions(int *outw, int *outh, int w, int h, const AVPixFmtDescriptor *desc)
+{
+    outw[1] = outw[2] = FF_CEIL_RSHIFT(w, desc->log2_chroma_w);
+    outw[0] = outw[3] = w;
+    outh[1] = outh[2] = FF_CEIL_RSHIFT(h, desc->log2_chroma_h);
+    outh[0] = outh[3] = h;
+}
+
+// Calculate remap data
+static av_always_inline int v360_slice(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
+{
+    V360Context *s = ctx->priv;
+
+    for (int p = 0; p < s->nb_allocated; p++) {
+        const int max_value = s->max_value;
+        const int width = s->pr_width[p];
+        const int uv_linesize = s->uv_linesize[p];
+        const int height = s->pr_height[p];
+        const int in_width = s->inplanewidth[p];
+        const int in_height = s->inplaneheight[p];
+        const int slice_start = (height *  jobnr     ) / nb_jobs;
+        const int slice_end   = (height * (jobnr + 1)) / nb_jobs;
+        float du, dv;
+        float vec[3];
+        XYRemap rmap;
+
+        for (int j = slice_start; j < slice_end; j++) {
+            for (int i = 0; i < width; i++) {
+                int16_t *u = s->u[p] + (j * uv_linesize + i) * s->elements;
+                int16_t *v = s->v[p] + (j * uv_linesize + i) * s->elements;
+                int16_t *ker = s->ker[p] + (j * uv_linesize + i) * s->elements;
+                uint8_t *mask8 = p ? NULL : s->mask + (j * s->pr_width[0] + i);
+                uint16_t *mask16 = p ? NULL : (uint16_t *)s->mask + (j * s->pr_width[0] + i);
+                int in_mask, out_mask;
+
+                if (s->out_transpose)
+                    out_mask = s->out_transform(s, j, i, height, width, vec);
+                else
+                    out_mask = s->out_transform(s, i, j, width, height, vec);
+                av_assert1(!isnan(vec[0]) && !isnan(vec[1]) && !isnan(vec[2]));
+                rotate(s->rot_mat, vec);
+                av_assert1(!isnan(vec[0]) && !isnan(vec[1]) && !isnan(vec[2]));
+                normalize_vector(vec);
+                mirror(s->output_mirror_modifier, vec);
+                if (s->in_transpose)
+                    in_mask = s->in_transform(s, vec, in_height, in_width, rmap.v, rmap.u, &du, &dv);
+                else
+                    in_mask = s->in_transform(s, vec, in_width, in_height, rmap.u, rmap.v, &du, &dv);
+                av_assert1(!isnan(du) && !isnan(dv));
+                s->calculate_kernel(du, dv, &rmap, u, v, ker);
+
+                if (!p && s->mask) {
+                    if (s->mask_size == 1) {
+                        mask8[0] = 255 * (out_mask & in_mask);
+                    } else {
+                        mask16[0] = max_value * (out_mask & in_mask);
+                    }
+                }
+            }
+        }
+    }
+
+    return 0;
+}
+
+static int config_output(AVFilterLink *outlink)
+{
+    AVFilterContext *ctx = outlink->src;
+    AVFilterLink *inlink = ctx->inputs[0];
+    V360Context *s = ctx->priv;
+    const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(inlink->format);
+    const int depth = desc->comp[0].depth;
+    const int sizeof_mask = s->mask_size = (depth + 7) >> 3;
+    int sizeof_uv;
+    int sizeof_ker;
+    int err;
+    int h, w;
+    int in_offset_h, in_offset_w;
+    int out_offset_h, out_offset_w;
+    float hf, wf;
+    int (*prepare_out)(AVFilterContext *ctx);
+    int have_alpha;
+
+    s->max_value = (1 << depth) - 1;
+    s->input_mirror_modifier[0] = s->ih_flip ? -1.f : 1.f;
+    s->input_mirror_modifier[1] = s->iv_flip ? -1.f : 1.f;
+
+    switch (s->interp) {
+    case NEAREST:
+        s->calculate_kernel = nearest_kernel;
+        s->remap_slice = depth <= 8 ? remap1_8bit_slice : remap1_16bit_slice;
+        s->elements = 1;
+        sizeof_uv = sizeof(int16_t) * s->elements;
+        sizeof_ker = 0;
+        break;
+    case BILINEAR:
+        s->calculate_kernel = bilinear_kernel;
+        s->remap_slice = depth <= 8 ? remap2_8bit_slice : remap2_16bit_slice;
+        s->elements = 2 * 2;
+        sizeof_uv = sizeof(int16_t) * s->elements;
+        sizeof_ker = sizeof(int16_t) * s->elements;
+        break;
+    case LAGRANGE9:
+        s->calculate_kernel = lagrange_kernel;
+        s->remap_slice = depth <= 8 ? remap3_8bit_slice : remap3_16bit_slice;
+        s->elements = 3 * 3;
+        sizeof_uv = sizeof(int16_t) * s->elements;
+        sizeof_ker = sizeof(int16_t) * s->elements;
+        break;
+    case BICUBIC:
+        s->calculate_kernel = bicubic_kernel;
+        s->remap_slice = depth <= 8 ? remap4_8bit_slice : remap4_16bit_slice;
+        s->elements = 4 * 4;
+        sizeof_uv = sizeof(int16_t) * s->elements;
+        sizeof_ker = sizeof(int16_t) * s->elements;
+        break;
+    case LANCZOS:
+        s->calculate_kernel = lanczos_kernel;
+        s->remap_slice = depth <= 8 ? remap4_8bit_slice : remap4_16bit_slice;
+        s->elements = 4 * 4;
+        sizeof_uv = sizeof(int16_t) * s->elements;
+        sizeof_ker = sizeof(int16_t) * s->elements;
+        break;
+    case SPLINE16:
+        s->calculate_kernel = spline16_kernel;
+        s->remap_slice = depth <= 8 ? remap4_8bit_slice : remap4_16bit_slice;
+        s->elements = 4 * 4;
+        sizeof_uv = sizeof(int16_t) * s->elements;
+        sizeof_ker = sizeof(int16_t) * s->elements;
+        break;
+    case GAUSSIAN:
+        s->calculate_kernel = gaussian_kernel;
+        s->remap_slice = depth <= 8 ? remap4_8bit_slice : remap4_16bit_slice;
+        s->elements = 4 * 4;
+        sizeof_uv = sizeof(int16_t) * s->elements;
+        sizeof_ker = sizeof(int16_t) * s->elements;
+        break;
+    default:
+        av_assert0(0);
+    }
+
+    ff_v360_init(s, depth);
+
+    for (int order = 0; order < NB_RORDERS; order++) {
+        const char c = s->rorder[order];
+        int rorder;
+
+        if (c == '\0') {
+            av_log(ctx, AV_LOG_WARNING,
+                   "Incomplete rorder option. Direction for all 3 rotation orders should be specified. Switching to default rorder.\n");
+            s->rotation_order[0] = YAW;
+            s->rotation_order[1] = PITCH;
+            s->rotation_order[2] = ROLL;
+            break;
+        }
+
+        rorder = get_rorder(c);
+        if (rorder == -1) {
+            av_log(ctx, AV_LOG_WARNING,
+                   "Incorrect rotation order symbol '%c' in rorder option. Switching to default rorder.\n", c);
+            s->rotation_order[0] = YAW;
+            s->rotation_order[1] = PITCH;
+            s->rotation_order[2] = ROLL;
+            break;
+        }
+
+        s->rotation_order[order] = rorder;
+    }
+
+    switch (s->in_stereo) {
+    case STEREO_2D:
+        w = inlink->w;
+        h = inlink->h;
+        in_offset_w = in_offset_h = 0;
+        break;
+    case STEREO_SBS:
+        w = inlink->w / 2;
+        h = inlink->h;
+        in_offset_w = w;
+        in_offset_h = 0;
+        break;
+    case STEREO_TB:
+        w = inlink->w;
+        h = inlink->h / 2;
+        in_offset_w = 0;
+        in_offset_h = h;
+        break;
+    default:
+        av_assert0(0);
+    }
+
+    set_dimensions(s->inplanewidth, s->inplaneheight, w, h, desc);
+    set_dimensions(s->in_offset_w, s->in_offset_h, in_offset_w, in_offset_h, desc);
+
+    s->in_width = s->inplanewidth[0];
+    s->in_height = s->inplaneheight[0];
+
+    if (s->id_fov > 0.f)
+        fov_from_dfov(s->in, s->id_fov, w, h, &s->ih_fov, &s->iv_fov);
+
+    if (s->in_transpose)
+        FFSWAP(int, s->in_width, s->in_height);
+
+    switch (s->in) {
+    case EQUIRECTANGULAR:
+        s->in_transform = xyz_to_equirect;
+        err = 0;
+        wf = w;
+        hf = h;
+        break;
+    case CUBEMAP_3_2:
+        s->in_transform = xyz_to_cube3x2;
+        err = prepare_cube_in(ctx);
+        wf = w / 3.f * 4.f;
+        hf = h;
+        break;
+    case CUBEMAP_1_6:
+        s->in_transform = xyz_to_cube1x6;
+        err = prepare_cube_in(ctx);
+        wf = w * 4.f;
+        hf = h / 3.f;
+        break;
+    case CUBEMAP_6_1:
+        s->in_transform = xyz_to_cube6x1;
+        err = prepare_cube_in(ctx);
+        wf = w / 3.f * 2.f;
+        hf = h * 2.f;
+        break;
+    case EQUIANGULAR:
+        s->in_transform = xyz_to_eac;
+        err = prepare_eac_in(ctx);
+        wf = w;
+        hf = h / 9.f * 8.f;
+        break;
+    case FLAT:
+        s->in_transform = xyz_to_flat;
+        err = prepare_flat_in(ctx);
+        wf = w;
+        hf = h;
+        break;
+    case PERSPECTIVE:
+        av_log(ctx, AV_LOG_ERROR, "Supplied format is not accepted as input.\n");
+        return AVERROR(EINVAL);
+    case DUAL_FISHEYE:
+        s->in_transform = xyz_to_dfisheye;
+        err = 0;
+        wf = w;
+        hf = h;
+        break;
+    case BARREL:
+        s->in_transform = xyz_to_barrel;
+        err = 0;
+        wf = w / 5.f * 4.f;
+        hf = h;
+        break;
+    case STEREOGRAPHIC:
+        s->in_transform = xyz_to_stereographic;
+        err = prepare_stereographic_in(ctx);
+        wf = w;
+        hf = h / 2.f;
+        break;
+    case MERCATOR:
+        s->in_transform = xyz_to_mercator;
+        err = 0;
+        wf = w;
+        hf = h / 2.f;
+        break;
+    case BALL:
+        s->in_transform = xyz_to_ball;
+        err = 0;
+        wf = w;
+        hf = h / 2.f;
+        break;
+    case HAMMER:
+        s->in_transform = xyz_to_hammer;
+        err = 0;
+        wf = w;
+        hf = h;
+        break;
+    case SINUSOIDAL:
+        s->in_transform = xyz_to_sinusoidal;
+        err = 0;
+        wf = w;
+        hf = h;
+        break;
+    case FISHEYE:
+        s->in_transform = xyz_to_fisheye;
+        err = prepare_fisheye_in(ctx);
+        wf = w * 2;
+        hf = h;
+        break;
+    case PANNINI:
+        s->in_transform = xyz_to_pannini;
+        err = 0;
+        wf = w;
+        hf = h;
+        break;
+    case CYLINDRICAL:
+        s->in_transform = xyz_to_cylindrical;
+        err = prepare_cylindrical_in(ctx);
+        wf = w;
+        hf = h * 2.f;
+        break;
+    case TETRAHEDRON:
+        s->in_transform = xyz_to_tetrahedron;
+        err = 0;
+        wf = w;
+        hf = h;
+        break;
+    case BARREL_SPLIT:
+        s->in_transform = xyz_to_barrelsplit;
+        err = 0;
+        wf = w * 4.f / 3.f;
+        hf = h;
+        break;
+    case TSPYRAMID:
+        s->in_transform = xyz_to_tspyramid;
+        err = 0;
+        wf = w;
+        hf = h;
+        break;
+    case HEQUIRECTANGULAR:
+        s->in_transform = xyz_to_hequirect;
+        err = 0;
+        wf = w * 2.f;
+        hf = h;
+        break;
+    default:
+        av_log(ctx, AV_LOG_ERROR, "Specified input format is not handled.\n");
+        return AVERROR_BUG;
+    }
+
+    if (err != 0) {
+        return err;
+    }
+
+    switch (s->out) {
+    case EQUIRECTANGULAR:
+        s->out_transform = equirect_to_xyz;
+        prepare_out = NULL;
+        w = lrintf(wf);
+        h = lrintf(hf);
+        break;
+    case CUBEMAP_3_2:
+        s->out_transform = cube3x2_to_xyz;
+        prepare_out = prepare_cube_out;
+        w = lrintf(wf / 4.f * 3.f);
+        h = lrintf(hf);
+        break;
+    case CUBEMAP_1_6:
+        s->out_transform = cube1x6_to_xyz;
+        prepare_out = prepare_cube_out;
+        w = lrintf(wf / 4.f);
+        h = lrintf(hf * 3.f);
+        break;
+    case CUBEMAP_6_1:
+        s->out_transform = cube6x1_to_xyz;
+        prepare_out = prepare_cube_out;
+        w = lrintf(wf / 2.f * 3.f);
+        h = lrintf(hf / 2.f);
+        break;
+    case EQUIANGULAR:
+        s->out_transform = eac_to_xyz;
+        prepare_out = prepare_eac_out;
+        w = lrintf(wf);
+        h = lrintf(hf / 8.f * 9.f);
+        break;
+    case FLAT:
+        s->out_transform = flat_to_xyz;
+        prepare_out = prepare_flat_out;
+        w = lrintf(wf);
+        h = lrintf(hf);
+        break;
+    case DUAL_FISHEYE:
+        s->out_transform = dfisheye_to_xyz;
+        prepare_out = NULL;
+        w = lrintf(wf);
+        h = lrintf(hf);
+        break;
+    case BARREL:
+        s->out_transform = barrel_to_xyz;
+        prepare_out = NULL;
+        w = lrintf(wf / 4.f * 5.f);
+        h = lrintf(hf);
+        break;
+    case STEREOGRAPHIC:
+        s->out_transform = stereographic_to_xyz;
+        prepare_out = prepare_stereographic_out;
+        w = lrintf(wf);
+        h = lrintf(hf * 2.f);
+        break;
+    case MERCATOR:
+        s->out_transform = mercator_to_xyz;
+        prepare_out = NULL;
+        w = lrintf(wf);
+        h = lrintf(hf * 2.f);
+        break;
+    case BALL:
+        s->out_transform = ball_to_xyz;
+        prepare_out = NULL;
+        w = lrintf(wf);
+        h = lrintf(hf * 2.f);
+        break;
+    case HAMMER:
+        s->out_transform = hammer_to_xyz;
+        prepare_out = NULL;
+        w = lrintf(wf);
+        h = lrintf(hf);
+        break;
+    case SINUSOIDAL:
+        s->out_transform = sinusoidal_to_xyz;
+        prepare_out = NULL;
+        w = lrintf(wf);
+        h = lrintf(hf);
+        break;
+    case FISHEYE:
+        s->out_transform = fisheye_to_xyz;
+        prepare_out = prepare_fisheye_out;
+        w = lrintf(wf * 0.5f);
+        h = lrintf(hf);
+        break;
+    case PANNINI:
+        s->out_transform = pannini_to_xyz;
+        prepare_out = NULL;
+        w = lrintf(wf);
+        h = lrintf(hf);
+        break;
+    case CYLINDRICAL:
+        s->out_transform = cylindrical_to_xyz;
+        prepare_out = prepare_cylindrical_out;
+        w = lrintf(wf);
+        h = lrintf(hf * 0.5f);
+        break;
+    case PERSPECTIVE:
+        s->out_transform = perspective_to_xyz;
+        prepare_out = NULL;
+        w = lrintf(wf / 2.f);
+        h = lrintf(hf);
+        break;
+    case TETRAHEDRON:
+        s->out_transform = tetrahedron_to_xyz;
+        prepare_out = NULL;
+        w = lrintf(wf);
+        h = lrintf(hf);
+        break;
+    case BARREL_SPLIT:
+        s->out_transform = barrelsplit_to_xyz;
+        prepare_out = NULL;
+        w = lrintf(wf / 4.f * 3.f);
+        h = lrintf(hf);
+        break;
+    case TSPYRAMID:
+        s->out_transform = tspyramid_to_xyz;
+        prepare_out = NULL;
+        w = lrintf(wf);
+        h = lrintf(hf);
+        break;
+    case HEQUIRECTANGULAR:
+        s->out_transform = hequirect_to_xyz;
+        prepare_out = NULL;
+        w = lrintf(wf / 2.f);
+        h = lrintf(hf);
+        break;
+    default:
+        av_log(ctx, AV_LOG_ERROR, "Specified output format is not handled.\n");
+        return AVERROR_BUG;
+    }
+
+    // Override resolution with user values if specified
+    if (s->width > 0 && s->height <= 0 && s->h_fov > 0.f && s->v_fov > 0.f &&
+        s->out == FLAT && s->d_fov == 0.f) {
+        w = s->width;
+        h = w / tanf(s->h_fov * M_PI / 360.f) * tanf(s->v_fov * M_PI / 360.f);
+    } else if (s->width <= 0 && s->height > 0 && s->h_fov > 0.f && s->v_fov > 0.f &&
+        s->out == FLAT && s->d_fov == 0.f) {
+        h = s->height;
+        w = h / tanf(s->v_fov * M_PI / 360.f) * tanf(s->h_fov * M_PI / 360.f);
+    } else if (s->width > 0 && s->height > 0) {
+        w = s->width;
+        h = s->height;
+    } else if (s->width > 0 || s->height > 0) {
+        av_log(ctx, AV_LOG_ERROR, "Both width and height values should be specified.\n");
+        return AVERROR(EINVAL);
+    } else {
+        if (s->out_transpose)
+            FFSWAP(int, w, h);
+
+        if (s->in_transpose)
+            FFSWAP(int, w, h);
+    }
+
+    s->width  = w;
+    s->height = h;
+
+    if (s->d_fov > 0.f)
+        fov_from_dfov(s->out, s->d_fov, w, h, &s->h_fov, &s->v_fov);
+
+    if (prepare_out) {
+        err = prepare_out(ctx);
+        if (err != 0)
+            return err;
+    }
+
+    set_dimensions(s->pr_width, s->pr_height, w, h, desc);
+
+    switch (s->out_stereo) {
+    case STEREO_2D:
+        out_offset_w = out_offset_h = 0;
+        break;
+    case STEREO_SBS:
+        out_offset_w = w;
+        out_offset_h = 0;
+        w *= 2;
+        break;
+    case STEREO_TB:
+        out_offset_w = 0;
+        out_offset_h = h;
+        h *= 2;
+        break;
+    default:
+        av_assert0(0);
+    }
+
+    set_dimensions(s->out_offset_w, s->out_offset_h, out_offset_w, out_offset_h, desc);
+    set_dimensions(s->planewidth, s->planeheight, w, h, desc);
+
+    for (int i = 0; i < 4; i++)
+        s->uv_linesize[i] = FFALIGN(s->pr_width[i], 8);
+
+    outlink->h = h;
+    outlink->w = w;
+
+    s->nb_planes = av_pix_fmt_count_planes(inlink->format);
+    have_alpha   = !!(desc->flags & AV_PIX_FMT_FLAG_ALPHA);
+
+    if (desc->log2_chroma_h == desc->log2_chroma_w && desc->log2_chroma_h == 0) {
+        s->nb_allocated = 1;
+        s->map[0] = s->map[1] = s->map[2] = s->map[3] = 0;
+    } else {
+        s->nb_allocated = 2;
+        s->map[0] = s->map[3] = 0;
+        s->map[1] = s->map[2] = 1;
+    }
+
+    for (int i = 0; i < s->nb_allocated; i++)
+        allocate_plane(s, sizeof_uv, sizeof_ker, sizeof_mask * have_alpha * s->alpha, i);
+
+    calculate_rotation_matrix(s->yaw, s->pitch, s->roll, s->rot_mat, s->rotation_order);
+    set_mirror_modifier(s->h_flip, s->v_flip, s->d_flip, s->output_mirror_modifier);
+
+    ctx->internal->execute(ctx, v360_slice, NULL, NULL, FFMIN(outlink->h, ff_filter_get_nb_threads(ctx)));
+
+    return 0;
+}
+
+static int filter_frame(AVFilterLink *inlink, AVFrame *in)
+{
+    AVFilterContext *ctx = inlink->dst;
+    AVFilterLink *outlink = ctx->outputs[0];
+    V360Context *s = ctx->priv;
+    AVFrame *out;
+    ThreadData td;
+
+    out = ff_get_video_buffer(outlink, outlink->w, outlink->h);
+    if (!out) {
+        av_frame_free(&in);
+        return AVERROR(ENOMEM);
+    }
+    av_frame_copy_props(out, in);
+
+    td.in = in;
+    td.out = out;
+
+    ctx->internal->execute(ctx, s->remap_slice, &td, NULL, FFMIN(outlink->h, ff_filter_get_nb_threads(ctx)));
+
+    av_frame_free(&in);
+    return ff_filter_frame(outlink, out);
+}
+
+static int process_command(AVFilterContext *ctx, const char *cmd, const char *args,
+                           char *res, int res_len, int flags)
+{
+    int ret;
+
+    ret = ff_filter_process_command(ctx, cmd, args, res, res_len, flags);
+    if (ret < 0)
+        return ret;
+
+    return config_output(ctx->outputs[0]);
+}
+
+static av_cold void uninit(AVFilterContext *ctx)
+{
+    V360Context *s = ctx->priv;
+
+    for (int p = 0; p < s->nb_allocated; p++) {
+        av_freep(&s->u[p]);
+        av_freep(&s->v[p]);
+        av_freep(&s->ker[p]);
+    }
+    av_freep(&s->mask);
+}
+
+static const AVFilterPad inputs[] = {
+    {
+        .name         = "default",
+        .type         = AVMEDIA_TYPE_VIDEO,
+        .filter_frame = filter_frame,
+    },
+    { NULL }
+};
+
+static const AVFilterPad outputs[] = {
+    {
+        .name         = "default",
+        .type         = AVMEDIA_TYPE_VIDEO,
+        .config_props = config_output,
+    },
+    { NULL }
+};
+
+AVFilter ff_vf_v360 = {
+    .name          = "v360",
+    .description   = NULL_IF_CONFIG_SMALL("Convert 360 projection of video."),
+    .priv_size     = sizeof(V360Context),
+    .uninit        = uninit,
+    .query_formats = query_formats,
+    .inputs        = inputs,
+    .outputs       = outputs,
+    .priv_class    = &v360_class,
+    .flags         = AVFILTER_FLAG_SLICE_THREADS,
+    .process_command = process_command,
+};
diff --git a/libavfilter/vf_vectorscope.c b/libavfilter/vf_vectorscope.c
index e3e0079..38af878 100644
--- a/libavfilter/vf_vectorscope.c
+++ b/libavfilter/vf_vectorscope.c
@@ -29,8 +29,16 @@
 #include "internal.h"
 #include "video.h"
 
+enum GraticuleType {
+    GRAT_NONE,
+    GRAT_GREEN,
+    GRAT_COLOR,
+    GRAT_INVERT,
+    NB_GRATICULES
+};
+
 enum VectorscopeMode {
-    GRAY,
+    TINT,
     COLOR,
     COLOR2,
     COLOR3,
@@ -45,6 +53,7 @@
     int intensity;
     float fintensity;
     uint16_t bg_color[4];
+    float ftint[2];
     int planewidth[4];
     int planeheight[4];
     int hsub, vsub;
@@ -59,6 +68,7 @@
     float bgopacity;
     float lthreshold;
     float hthreshold;
+    int tint[2];
     int tmin;
     int tmax;
     int flags;
@@ -79,7 +89,8 @@
 static const AVOption vectorscope_options[] = {
     { "mode", "set vectorscope mode", OFFSET(mode), AV_OPT_TYPE_INT, {.i64=0}, 0, MODE_NB-1, FLAGS, "mode"},
     { "m",    "set vectorscope mode", OFFSET(mode), AV_OPT_TYPE_INT, {.i64=0}, 0, MODE_NB-1, FLAGS, "mode"},
-    {   "gray",   0, 0, AV_OPT_TYPE_CONST, {.i64=GRAY},   0, 0, FLAGS, "mode" },
+    {   "gray",   0, 0, AV_OPT_TYPE_CONST, {.i64=TINT},   0, 0, FLAGS, "mode" },
+    {   "tint",   0, 0, AV_OPT_TYPE_CONST, {.i64=TINT},   0, 0, FLAGS, "mode" },
     {   "color",  0, 0, AV_OPT_TYPE_CONST, {.i64=COLOR},  0, 0, FLAGS, "mode" },
     {   "color2", 0, 0, AV_OPT_TYPE_CONST, {.i64=COLOR2}, 0, 0, FLAGS, "mode" },
     {   "color3", 0, 0, AV_OPT_TYPE_CONST, {.i64=COLOR3}, 0, 0, FLAGS, "mode" },
@@ -95,11 +106,12 @@
     {   "instant",      0, 0, AV_OPT_TYPE_CONST, {.i64=1}, 0, 0, FLAGS, "envelope" },
     {   "peak",         0, 0, AV_OPT_TYPE_CONST, {.i64=2}, 0, 0, FLAGS, "envelope" },
     {   "peak+instant", 0, 0, AV_OPT_TYPE_CONST, {.i64=3}, 0, 0, FLAGS, "envelope" },
-    { "graticule", "set graticule", OFFSET(graticule), AV_OPT_TYPE_INT, {.i64=0}, 0, 2, FLAGS, "graticule"},
-    { "g",         "set graticule", OFFSET(graticule), AV_OPT_TYPE_INT, {.i64=0}, 0, 2, FLAGS, "graticule"},
-    {   "none",         0, 0, AV_OPT_TYPE_CONST, {.i64=0}, 0, 0, FLAGS, "graticule" },
-    {   "green",        0, 0, AV_OPT_TYPE_CONST, {.i64=1}, 0, 0, FLAGS, "graticule" },
-    {   "color",        0, 0, AV_OPT_TYPE_CONST, {.i64=2}, 0, 0, FLAGS, "graticule" },
+    { "graticule", "set graticule", OFFSET(graticule), AV_OPT_TYPE_INT, {.i64=GRAT_NONE}, 0, NB_GRATICULES-1, FLAGS, "graticule"},
+    { "g",         "set graticule", OFFSET(graticule), AV_OPT_TYPE_INT, {.i64=GRAT_NONE}, 0, NB_GRATICULES-1, FLAGS, "graticule"},
+    {   "none",         0, 0, AV_OPT_TYPE_CONST, {.i64=GRAT_NONE},  0, 0, FLAGS, "graticule" },
+    {   "green",        0, 0, AV_OPT_TYPE_CONST, {.i64=GRAT_GREEN}, 0, 0, FLAGS, "graticule" },
+    {   "color",        0, 0, AV_OPT_TYPE_CONST, {.i64=GRAT_COLOR}, 0, 0, FLAGS, "graticule" },
+    {   "invert",       0, 0, AV_OPT_TYPE_CONST, {.i64=GRAT_INVERT},0, 0, FLAGS, "graticule" },
     { "opacity", "set graticule opacity", OFFSET(opacity), AV_OPT_TYPE_FLOAT, {.dbl=0.75}, 0, 1, FLAGS},
     { "o",       "set graticule opacity", OFFSET(opacity), AV_OPT_TYPE_FLOAT, {.dbl=0.75}, 0, 1, FLAGS},
     { "flags", "set graticule flags", OFFSET(flags), AV_OPT_TYPE_FLAGS, {.i64=4}, 0, 7, FLAGS, "flags"},
@@ -118,6 +130,10 @@
     {   "auto",       0, 0, AV_OPT_TYPE_CONST, {.i64=0}, 0, 0, FLAGS, "colorspace" },
     {   "601",        0, 0, AV_OPT_TYPE_CONST, {.i64=1}, 0, 0, FLAGS, "colorspace" },
     {   "709",        0, 0, AV_OPT_TYPE_CONST, {.i64=2}, 0, 0, FLAGS, "colorspace" },
+    { "tint0", "set 1st tint", OFFSET(ftint[0]), AV_OPT_TYPE_FLOAT, {.dbl=0}, -1, 1, FLAGS},
+    { "t0",    "set 1st tint", OFFSET(ftint[0]), AV_OPT_TYPE_FLOAT, {.dbl=0}, -1, 1, FLAGS},
+    { "tint1", "set 2nd tint", OFFSET(ftint[1]), AV_OPT_TYPE_FLOAT, {.dbl=0}, -1, 1, FLAGS},
+    { "t1",    "set 2nd tint", OFFSET(ftint[1]), AV_OPT_TYPE_FLOAT, {.dbl=0}, -1, 1, FLAGS},
     { NULL }
 };
 
@@ -139,7 +155,7 @@
 };
 
 static const enum AVPixelFormat out_yuv12_pix_fmts[] = {
-    AV_PIX_FMT_YUV444P12,
+    AV_PIX_FMT_YUVA444P12, AV_PIX_FMT_YUV444P12,
     AV_PIX_FMT_NONE
 };
 
@@ -167,7 +183,7 @@
     AV_PIX_FMT_YUVA444P, AV_PIX_FMT_YUV444P, AV_PIX_FMT_YUVJ444P,
     AV_PIX_FMT_YUV444P9, AV_PIX_FMT_YUV444P10,
     AV_PIX_FMT_YUVA444P9, AV_PIX_FMT_YUVA444P10,
-    AV_PIX_FMT_YUV444P12,
+    AV_PIX_FMT_YUVA444P12, AV_PIX_FMT_YUV444P12,
     AV_PIX_FMT_GBRAP, AV_PIX_FMT_GBRP,
     AV_PIX_FMT_GBRP9, AV_PIX_FMT_GBRP10, AV_PIX_FMT_GBRAP10,
     AV_PIX_FMT_GBRP12, AV_PIX_FMT_GBRAP12,
@@ -188,6 +204,7 @@
     AV_PIX_FMT_YUVA420P9, AV_PIX_FMT_YUVA422P9, AV_PIX_FMT_YUVA444P9,
     AV_PIX_FMT_YUVA420P10, AV_PIX_FMT_YUVA422P10, AV_PIX_FMT_YUVA444P10,
     AV_PIX_FMT_YUV420P12, AV_PIX_FMT_YUV422P12, AV_PIX_FMT_YUV444P12, AV_PIX_FMT_YUV440P12,
+    AV_PIX_FMT_YUVA422P12, AV_PIX_FMT_YUVA444P12,
     AV_PIX_FMT_NONE
 };
 
@@ -417,6 +434,8 @@
     uint16_t *dpx = dst[px];
     uint16_t *dpy = dst[py];
     uint16_t *dpd = dst[pd];
+    uint16_t *dp1 = dst[1];
+    uint16_t *dp2 = dst[2];
     const int max = s->size - 1;
     const int mid = s->size / 2;
     const int tmin = s->tmin;
@@ -433,42 +452,21 @@
     switch (s->mode) {
     case COLOR:
     case COLOR5:
-    case GRAY:
-        if (s->is_yuv) {
-            for (i = 0; i < h; i++) {
-                const int iwx = i * slinesizex;
-                const int iwy = i * slinesizey;
-                const int iwd = i * slinesized;
-                for (j = 0; j < w; j++) {
-                    const int x = FFMIN(spx[iwx + j], max);
-                    const int y = FFMIN(spy[iwy + j], max);
-                    const int z = spd[iwd + j];
-                    const int pos = y * dlinesize + x;
+    case TINT:
+        for (i = 0; i < h; i++) {
+            const int iwx = i * slinesizex;
+            const int iwy = i * slinesizey;
+            const int iwd = i * slinesized;
+            for (j = 0; j < w; j++) {
+                const int x = FFMIN(spx[iwx + j], max);
+                const int y = FFMIN(spy[iwy + j], max);
+                const int z = spd[iwd + j];
+                const int pos = y * dlinesize + x;
 
-                    if (z < tmin || z > tmax)
-                        continue;
+                if (z < tmin || z > tmax)
+                    continue;
 
-                    dpd[pos] = FFMIN(dpd[pos] + intensity, max);
-                }
-            }
-        } else {
-            for (i = 0; i < h; i++) {
-                const int iwx = i * slinesizex;
-                const int iwy = i * slinesizey;
-                const int iwd = i * slinesized;
-                for (j = 0; j < w; j++) {
-                    const int x = FFMIN(spx[iwx + j], max);
-                    const int y = FFMIN(spy[iwy + j], max);
-                    const int z = spd[iwd + j];
-                    const int pos = y * dlinesize + x;
-
-                    if (z < tmin || z > tmax)
-                        continue;
-
-                    dst[0][pos] = FFMIN(dst[0][pos] + intensity, max);
-                    dst[1][pos] = FFMIN(dst[1][pos] + intensity, max);
-                    dst[2][pos] = FFMIN(dst[2][pos] + intensity, max);
-                }
+                dpd[pos] = FFMIN(dpd[pos] + intensity, max);
             }
         }
         break;
@@ -572,7 +570,28 @@
         }
     }
 
-    if (s->mode == COLOR) {
+    if (s->mode == TINT && s->is_yuv &&
+        (s->tint[0] != mid || s->tint[1] != mid)) {
+        for (i = 0; i < out->height; i++) {
+            for (j = 0; j < out->width; j++) {
+                const int pos = i * dlinesize + j;
+                if (dpd[pos]) {
+                    dp1[pos] = s->tint[0];
+                    dp2[pos] = s->tint[1];
+                }
+            }
+        }
+    } else if (s->mode == TINT && !s->is_yuv) {
+        for (i = 0; i < out->height; i++) {
+            for (j = 0; j < out->width; j++) {
+                const int pos = i * dlinesize + j;
+                if (dpd[pos]) {
+                    dpx[pos] = av_clip(dpd[pos] + dpd[pos] * s->ftint[0], 0, max);
+                    dpy[pos] = av_clip(dpd[pos] + dpd[pos] * s->ftint[1], 0, max);
+                }
+            }
+        }
+    } else if (s->mode == COLOR) {
         for (i = 0; i < out->height; i++) {
             for (j = 0; j < out->width; j++) {
                 if (!dpd[i * dlinesize + j]) {
@@ -615,6 +634,8 @@
     uint8_t *dpx = dst[px];
     uint8_t *dpy = dst[py];
     uint8_t *dpd = dst[pd];
+    uint8_t *dp1 = dst[1];
+    uint8_t *dp2 = dst[2];
     const int tmin = s->tmin;
     const int tmax = s->tmax;
     int i, j, k;
@@ -627,42 +648,21 @@
     switch (s->mode) {
     case COLOR5:
     case COLOR:
-    case GRAY:
-        if (s->is_yuv) {
-            for (i = 0; i < h; i++) {
-                const int iwx = i * slinesizex;
-                const int iwy = i * slinesizey;
-                const int iwd = i * slinesized;
-                for (j = 0; j < w; j++) {
-                    const int x = spx[iwx + j];
-                    const int y = spy[iwy + j];
-                    const int z = spd[iwd + j];
-                    const int pos = y * dlinesize + x;
+    case TINT:
+        for (i = 0; i < h; i++) {
+            const int iwx = i * slinesizex;
+            const int iwy = i * slinesizey;
+            const int iwd = i * slinesized;
+            for (j = 0; j < w; j++) {
+                const int x = spx[iwx + j];
+                const int y = spy[iwy + j];
+                const int z = spd[iwd + j];
+                const int pos = y * dlinesize + x;
 
-                    if (z < tmin || z > tmax)
-                        continue;
+                if (z < tmin || z > tmax)
+                    continue;
 
-                    dpd[pos] = FFMIN(dpd[pos] + intensity, 255);
-                }
-            }
-        } else {
-            for (i = 0; i < h; i++) {
-                const int iwx = i * slinesizex;
-                const int iwy = i * slinesizey;
-                const int iwd = i * slinesized;
-                for (j = 0; j < w; j++) {
-                    const int x = spx[iwx + j];
-                    const int y = spy[iwy + j];
-                    const int z = spd[iwd + j];
-                    const int pos = y * dlinesize + x;
-
-                    if (z < tmin || z > tmax)
-                        continue;
-
-                    dst[0][pos] = FFMIN(dst[0][pos] + intensity, 255);
-                    dst[1][pos] = FFMIN(dst[1][pos] + intensity, 255);
-                    dst[2][pos] = FFMIN(dst[2][pos] + intensity, 255);
-                }
+                dpd[pos] = FFMIN(dpd[pos] + intensity, 255);
             }
         }
         break;
@@ -766,7 +766,28 @@
         }
     }
 
-    if (s->mode == COLOR) {
+    if (s->mode == TINT && s->is_yuv &&
+        (s->tint[0] != 128 || s->tint[1] != 128)) {
+        for (i = 0; i < out->height; i++) {
+            for (j = 0; j < out->width; j++) {
+                const int pos = i * dlinesize + j;
+                if (dpd[pos]) {
+                    dp1[pos] = s->tint[0];
+                    dp2[pos] = s->tint[1];
+                }
+            }
+        }
+    } else if (s->mode == TINT && !s->is_yuv) {
+        for (i = 0; i < out->height; i++) {
+            for (j = 0; j < out->width; j++) {
+                const int pos = i * dlinesize + j;
+                if (dpd[pos]) {
+                    dpx[pos] = av_clip_uint8(dpd[pos] + dpd[pos] * s->ftint[0]);
+                    dpy[pos] = av_clip_uint8(dpd[pos] + dpd[pos] * s->ftint[1]);
+                }
+            }
+        }
+    } else if (s->mode == COLOR) {
         for (i = 0; i < out->height; i++) {
             for (j = 0; j < out->width; j++) {
                 if (!dpd[i * out->linesize[pd] + j]) {
@@ -870,6 +891,28 @@
     dst[-l + 2] = dst[-l + 2] * f + V;
 }
 
+static void draw_idots(uint8_t *dst, int L, float o)
+{
+    const float f = 1. - o;
+    int l = L * 2;
+
+    dst[ l - 3] = dst[ l - 3] * f + (255 - dst[ l - 3]) * o;
+    dst[ l + 3] = dst[ l + 3] * f + (255 - dst[ l + 3]) * o;
+    dst[-l - 3] = dst[-l - 3] * f + (255 - dst[-l - 3]) * o;
+    dst[-l + 3] = dst[-l + 3] * f + (255 - dst[-l + 3]) * o;
+
+    l += L;
+
+    dst[ l - 3] = dst[ l - 3] * f + (255 - dst[ l - 3]) * o;
+    dst[ l + 3] = dst[ l + 3] * f + (255 - dst[ l + 3]) * o;
+    dst[ l - 2] = dst[ l - 2] * f + (255 - dst[ l - 2]) * o;
+    dst[ l + 2] = dst[ l + 2] * f + (255 - dst[ l + 2]) * o;
+    dst[-l - 3] = dst[-l - 3] * f + (255 - dst[-l - 3]) * o;
+    dst[-l + 3] = dst[-l + 3] * f + (255 - dst[-l + 3]) * o;
+    dst[-l - 2] = dst[-l - 2] * f + (255 - dst[-l - 2]) * o;
+    dst[-l + 2] = dst[-l + 2] * f + (255 - dst[-l + 2]) * o;
+}
+
 static void draw_dots16(uint16_t *dst, int L, int v, float o)
 {
     const float f = 1. - o;
@@ -893,10 +936,83 @@
     dst[-l + 2] = dst[-l + 2] * f + V;
 }
 
+static void draw_idots16(uint16_t *dst, int L, int v, float o)
+{
+    const float f = 1. - o;
+    int l = L * 2;
+
+    dst[ l - 3] = dst[ l - 3] * f + (v - dst[ l - 3]) * o;
+    dst[ l + 3] = dst[ l + 3] * f + (v - dst[ l + 3]) * o;
+    dst[-l - 3] = dst[-l - 3] * f + (v - dst[-l - 3]) * o;
+    dst[-l + 3] = dst[-l + 3] * f + (v - dst[-l + 3]) * o;
+
+    l += L;
+
+    dst[ l - 3] = dst[ l - 3] * f + (v - dst[ l - 3]) * o;
+    dst[ l + 3] = dst[ l + 3] * f + (v - dst[ l + 3]) * o;
+    dst[ l - 2] = dst[ l - 2] * f + (v - dst[ l - 2]) * o;
+    dst[ l + 2] = dst[ l + 2] * f + (v - dst[ l + 2]) * o;
+    dst[-l - 3] = dst[-l - 3] * f + (v - dst[-l - 3]) * o;
+    dst[-l + 3] = dst[-l + 3] * f + (v - dst[-l + 3]) * o;
+    dst[-l - 2] = dst[-l - 2] * f + (v - dst[-l - 2]) * o;
+    dst[-l + 2] = dst[-l + 2] * f + (v - dst[-l + 2]) * o;
+}
+
 static void none_graticule(VectorscopeContext *s, AVFrame *out, int X, int Y, int D, int P)
 {
 }
 
+static void draw_ihtext(AVFrame *out, int x, int y, float o1, float o2, const char *txt, const uint8_t color[4])
+{
+    const uint8_t *font;
+    int font_height;
+    int i, plane;
+
+    font = avpriv_cga_font,   font_height =  8;
+
+    for (plane = 0; plane < 4 && out->data[plane]; plane++) {
+        for (i = 0; txt[i]; i++) {
+            int char_y, mask;
+
+            uint8_t *p = out->data[plane] + y * out->linesize[plane] + (x + i * 8);
+            for (char_y = font_height - 1; char_y >= 0; char_y--) {
+                for (mask = 0x80; mask; mask >>= 1) {
+                    if (font[txt[i] * font_height + char_y] & mask)
+                        p[0] = p[0] * o2 + (255 - p[0]) * o1;
+                    p++;
+                }
+                p += out->linesize[plane] - 8;
+            }
+        }
+    }
+}
+
+static void draw_ihtext16(AVFrame *out, int x, int y, float o1, float o2, const char *txt, const uint16_t color[4])
+{
+    const uint8_t *font;
+    int font_height;
+    int i, plane;
+
+    font = avpriv_cga_font,   font_height =  8;
+
+    for (plane = 0; plane < 4 && out->data[plane]; plane++) {
+        for (i = 0; txt[i]; i++) {
+            int char_y, mask;
+            int v = color[plane];
+
+            uint16_t *p = (uint16_t *)(out->data[plane] + y * out->linesize[plane]) + (x + i * 8);
+            for (char_y = font_height - 1; char_y >= 0; char_y--) {
+                for (mask = 0x80; mask; mask >>= 1) {
+                    if (font[txt[i] * font_height + char_y] & mask)
+                        p[0] = p[0] * o2 + (v - p[0]) * o1;
+                    p++;
+                }
+                p += out->linesize[plane] / 2 - 8;
+            }
+        }
+    }
+}
+
 static void draw_htext(AVFrame *out, int x, int y, float o1, float o2, const char *txt, const uint8_t color[4])
 {
     const uint8_t *font;
@@ -1201,6 +1317,123 @@
     }
 }
 
+static void invert_graticule16(VectorscopeContext *s, AVFrame *out, int X, int Y, int D, int P)
+{
+    const int max = s->size - 1;
+    const float o = s->opacity;
+    int i;
+
+    for (i = 0; i < 12; i++) {
+        int x = positions[P][i][X];
+        int y = positions[P][i][Y];
+
+        draw_idots16((uint16_t *)(out->data[D] + y * out->linesize[D] + x * 2), out->linesize[D] / 2, max, o);
+        draw_idots16((uint16_t *)(out->data[X] + y * out->linesize[X] + x * 2), out->linesize[X] / 2, max, o);
+        draw_idots16((uint16_t *)(out->data[Y] + y * out->linesize[Y] + x * 2), out->linesize[Y] / 2, max, o);
+        if (out->data[3])
+            draw_dots16((uint16_t *)(out->data[3] + y * out->linesize[3] + x * 2), out->linesize[3] / 2, max, o);
+    }
+
+    if (s->flags & 1) {
+        int x = positions[P][12][X];
+        int y = positions[P][12][Y];
+
+        draw_idots16((uint16_t *)(out->data[D] + y * out->linesize[D] + x * 2), out->linesize[D] / 2, max, o);
+        draw_idots16((uint16_t *)(out->data[X] + y * out->linesize[X] + x * 2), out->linesize[X] / 2, max, o);
+        draw_idots16((uint16_t *)(out->data[Y] + y * out->linesize[Y] + x * 2), out->linesize[Y] / 2, max, o);
+        if (out->data[3])
+            draw_dots16((uint16_t *)(out->data[3] + y * out->linesize[3] + x * 2), out->linesize[3] / 2, max, o);
+    }
+
+    if (s->flags & 2) {
+        int x = positions[P][13][X];
+        int y = positions[P][13][Y];
+
+        draw_idots16((uint16_t *)(out->data[D] + y * out->linesize[D] + x * 2), out->linesize[D] / 2, max, o);
+        draw_idots16((uint16_t *)(out->data[X] + y * out->linesize[X] + x * 2), out->linesize[X] / 2, max, o);
+        draw_idots16((uint16_t *)(out->data[Y] + y * out->linesize[Y] + x * 2), out->linesize[Y] / 2, max, o);
+        if (out->data[3])
+            draw_dots16((uint16_t *)(out->data[3] + y * out->linesize[3] + x * 2), out->linesize[3] / 2, max, o);
+    }
+
+    for (i = 0; i < 6 && s->flags & 4; i++) {
+        uint16_t color[4] = { max, max, max, max };
+        int x = positions[P][i][X];
+        int y = positions[P][i][Y];
+
+        if (x > max / 2)
+            x += 8;
+        else
+            x -= 14;
+        if (y > max / 2)
+            y += 8;
+        else
+            y -= 14;
+
+        x = av_clip(x, 0, out->width - 9);
+        y = av_clip(y, 0, out->height - 9);
+        draw_ihtext16(out, x, y, o, 1. - o, positions_name[i], color);
+    }
+}
+
+static void invert_graticule(VectorscopeContext *s, AVFrame *out, int X, int Y, int D, int P)
+{
+    const float o = s->opacity;
+    int i;
+
+    for (i = 0; i < 12; i++) {
+        int x = positions[P][i][X];
+        int y = positions[P][i][Y];
+
+        draw_idots(out->data[D] + y * out->linesize[D] + x, out->linesize[D], o);
+        draw_idots(out->data[X] + y * out->linesize[X] + x, out->linesize[X], o);
+        draw_idots(out->data[Y] + y * out->linesize[Y] + x, out->linesize[Y], o);
+        if (out->data[3])
+            draw_idots(out->data[3] + y * out->linesize[3] + x, out->linesize[3], o);
+    }
+
+    if (s->flags & 1) {
+        int x = positions[P][12][X];
+        int y = positions[P][12][Y];
+
+        draw_idots(out->data[D] + y * out->linesize[D] + x, out->linesize[D], o);
+        draw_idots(out->data[X] + y * out->linesize[X] + x, out->linesize[X], o);
+        draw_idots(out->data[Y] + y * out->linesize[Y] + x, out->linesize[Y], o);
+        if (out->data[3])
+            draw_idots(out->data[3] + y * out->linesize[3] + x, out->linesize[3], o);
+    }
+
+    if (s->flags & 2) {
+        int x = positions[P][13][X];
+        int y = positions[P][13][Y];
+
+        draw_idots(out->data[D] + y * out->linesize[D] + x, out->linesize[D], o);
+        draw_idots(out->data[X] + y * out->linesize[X] + x, out->linesize[X], o);
+        draw_idots(out->data[Y] + y * out->linesize[Y] + x, out->linesize[Y], o);
+        if (out->data[3])
+            draw_idots(out->data[3] + y * out->linesize[3] + x, out->linesize[3], o);
+    }
+
+    for (i = 0; i < 6 && s->flags & 4; i++) {
+        uint8_t color[4] = { 255, 255, 255, 255 };
+        int x = positions[P][i][X];
+        int y = positions[P][i][Y];
+
+        if (x > 128)
+            x += 8;
+        else
+            x -= 14;
+        if (y > 128)
+            y += 8;
+        else
+            y -= 14;
+
+        x = av_clip(x, 0, out->width - 9);
+        y = av_clip(y, 0, out->height - 9);
+        draw_ihtext(out, x, y, o, 1. - o, positions_name[i], color);
+    }
+}
+
 static int filter_frame(AVFilterLink *inlink, AVFrame *in)
 {
     AVFilterContext *ctx  = inlink->dst;
@@ -1262,9 +1495,9 @@
         return AVERROR(EINVAL);
     }
 
-    if (s->mode == GRAY && s->is_yuv)
+    if (s->mode == TINT && s->is_yuv) {
         s->pd = 0;
-    else {
+    } else {
         if ((s->x == 1 && s->y == 2) || (s->x == 2 && s->y == 1))
             s->pd = 0;
         else if ((s->x == 0 && s->y == 2) || (s->x == 2 && s->y == 0))
@@ -1281,19 +1514,26 @@
     s->graticulef = none_graticule;
 
     if (s->is_yuv && s->size == 256) {
-        if (s->graticule == 1)
+        if (s->graticule == GRAT_GREEN)
             s->graticulef = green_graticule;
-        else if (s->graticule == 2)
+        else if (s->graticule == GRAT_COLOR)
             s->graticulef = color_graticule;
+        else if (s->graticule == GRAT_INVERT)
+            s->graticulef = invert_graticule;
     } else if (s->is_yuv) {
-        if (s->graticule == 1)
+        if (s->graticule == GRAT_GREEN)
             s->graticulef = green_graticule16;
-        else if (s->graticule == 2)
+        else if (s->graticule == GRAT_COLOR)
             s->graticulef = color_graticule16;
+        else if (s->graticule == GRAT_INVERT)
+            s->graticulef = invert_graticule16;
     }
 
     s->bg_color[3] = s->bgopacity * (s->size - 1);
 
+    s->tint[0] = .5f * (s->ftint[0] + 1.f) * (s->size - 1);
+    s->tint[1] = .5f * (s->ftint[1] + 1.f) * (s->size - 1);
+
     switch (inlink->format) {
     case AV_PIX_FMT_GBRP12:
     case AV_PIX_FMT_GBRP10:
@@ -1306,8 +1546,8 @@
         break;
     default:
         s->bg_color[0] = 0;
-        s->bg_color[1] = s->size / 2 - 1;
-        s->bg_color[2] = s->size / 2 - 1;
+        s->bg_color[1] = s->size / 2;
+        s->bg_color[2] = s->size / 2;
     }
 
     s->hsub = desc->log2_chroma_w;
diff --git a/libavfilter/vf_vfrdet.c b/libavfilter/vf_vfrdet.c
index cac96e2..abfa19c 100644
--- a/libavfilter/vf_vfrdet.c
+++ b/libavfilter/vf_vfrdet.c
@@ -29,6 +29,7 @@
     int64_t delta;
     int64_t min_delta;
     int64_t max_delta;
+    int64_t avg_delta;
 
     uint64_t vfr;
     uint64_t cfr;
@@ -44,6 +45,8 @@
 
         if (s->delta == AV_NOPTS_VALUE) {
             s->delta = delta;
+            s->min_delta = delta;
+            s->max_delta = delta;
         }
 
         if (s->delta != delta) {
@@ -51,6 +54,7 @@
             s->delta = delta;
             s->min_delta = FFMIN(delta, s->min_delta);
             s->max_delta = FFMAX(delta, s->max_delta);
+            s->avg_delta += delta;
         } else {
             s->cfr++;
         }
@@ -79,7 +83,7 @@
 
     av_log(ctx, AV_LOG_INFO, "VFR:%f (%"PRIu64"/%"PRIu64")", s->vfr / (float)(s->vfr + s->cfr), s->vfr, s->cfr);
     if (s->vfr)
-        av_log(ctx, AV_LOG_INFO, " min: %"PRId64" max: %"PRId64")", s->min_delta, s->max_delta);
+        av_log(ctx, AV_LOG_INFO, " min: %"PRId64" max: %"PRId64" avg: %"PRId64, s->min_delta, s->max_delta, s->avg_delta / s->vfr);
     av_log(ctx, AV_LOG_INFO, "\n");
 }
 
diff --git a/libavfilter/vf_vibrance.c b/libavfilter/vf_vibrance.c
new file mode 100644
index 0000000..8e1a55c
--- /dev/null
+++ b/libavfilter/vf_vibrance.c
@@ -0,0 +1,253 @@
+/*
+ * Copyright (c) 2018 Paul B Mahol
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "libavutil/opt.h"
+#include "libavutil/imgutils.h"
+#include "avfilter.h"
+#include "formats.h"
+#include "internal.h"
+#include "video.h"
+
+typedef struct VibranceContext {
+    const AVClass *class;
+
+    float intensity;
+    float balance[3];
+    float lcoeffs[3];
+    int alternate;
+
+    int depth;
+
+    int (*do_slice)(AVFilterContext *s, void *arg,
+                    int jobnr, int nb_jobs);
+} VibranceContext;
+
+static inline float lerpf(float v0, float v1, float f)
+{
+    return v0 + (v1 - v0) * f;
+}
+
+static int vibrance_slice8(AVFilterContext *avctx, void *arg, int jobnr, int nb_jobs)
+{
+    VibranceContext *s = avctx->priv;
+    AVFrame *frame = arg;
+    const int width = frame->width;
+    const int height = frame->height;
+    const float scale = 1.f / 255.f;
+    const float gc = s->lcoeffs[0];
+    const float bc = s->lcoeffs[1];
+    const float rc = s->lcoeffs[2];
+    const float intensity = s->intensity;
+    const float alternate = s->alternate ? 1.f : -1.f;
+    const float gintensity = intensity * s->balance[0];
+    const float bintensity = intensity * s->balance[1];
+    const float rintensity = intensity * s->balance[2];
+    const float sgintensity = alternate * FFSIGN(gintensity);
+    const float sbintensity = alternate * FFSIGN(bintensity);
+    const float srintensity = alternate * FFSIGN(rintensity);
+    const int slice_start = (height * jobnr) / nb_jobs;
+    const int slice_end = (height * (jobnr + 1)) / nb_jobs;
+    const int glinesize = frame->linesize[0];
+    const int blinesize = frame->linesize[1];
+    const int rlinesize = frame->linesize[2];
+    uint8_t *gptr = frame->data[0] + slice_start * glinesize;
+    uint8_t *bptr = frame->data[1] + slice_start * blinesize;
+    uint8_t *rptr = frame->data[2] + slice_start * rlinesize;
+
+    for (int y = slice_start; y < slice_end; y++) {
+        for (int x = 0; x < width; x++) {
+            float g = gptr[x] * scale;
+            float b = bptr[x] * scale;
+            float r = rptr[x] * scale;
+            float max_color = FFMAX3(r, g, b);
+            float min_color = FFMIN3(r, g, b);
+            float color_saturation = max_color - min_color;
+            float luma = g * gc + r * rc + b * bc;
+            const float cg = 1.f + gintensity * (1.f - sgintensity * color_saturation);
+            const float cb = 1.f + bintensity * (1.f - sbintensity * color_saturation);
+            const float cr = 1.f + rintensity * (1.f - srintensity * color_saturation);
+
+            g = lerpf(luma, g, cg);
+            b = lerpf(luma, b, cb);
+            r = lerpf(luma, r, cr);
+
+            gptr[x] = av_clip_uint8(g * 255.f);
+            bptr[x] = av_clip_uint8(b * 255.f);
+            rptr[x] = av_clip_uint8(r * 255.f);
+        }
+
+        gptr += glinesize;
+        bptr += blinesize;
+        rptr += rlinesize;
+    }
+
+    return 0;
+}
+
+static int vibrance_slice16(AVFilterContext *avctx, void *arg, int jobnr, int nb_jobs)
+{
+    VibranceContext *s = avctx->priv;
+    AVFrame *frame = arg;
+    const int depth = s->depth;
+    const float max = (1 << depth) - 1;
+    const float scale = 1.f / max;
+    const float gc = s->lcoeffs[0];
+    const float bc = s->lcoeffs[1];
+    const float rc = s->lcoeffs[2];
+    const int width = frame->width;
+    const int height = frame->height;
+    const float intensity = s->intensity;
+    const float alternate = s->alternate ? 1.f : -1.f;
+    const float gintensity = intensity * s->balance[0];
+    const float bintensity = intensity * s->balance[1];
+    const float rintensity = intensity * s->balance[2];
+    const float sgintensity = alternate * FFSIGN(gintensity);
+    const float sbintensity = alternate * FFSIGN(bintensity);
+    const float srintensity = alternate * FFSIGN(rintensity);
+    const int slice_start = (height * jobnr) / nb_jobs;
+    const int slice_end = (height * (jobnr + 1)) / nb_jobs;
+    const int glinesize = frame->linesize[0] / 2;
+    const int blinesize = frame->linesize[1] / 2;
+    const int rlinesize = frame->linesize[2] / 2;
+    uint16_t *gptr = (uint16_t *)frame->data[0] + slice_start * glinesize;
+    uint16_t *bptr = (uint16_t *)frame->data[1] + slice_start * blinesize;
+    uint16_t *rptr = (uint16_t *)frame->data[2] + slice_start * rlinesize;
+
+    for (int y = slice_start; y < slice_end; y++) {
+        for (int x = 0; x < width; x++) {
+            float g = gptr[x] * scale;
+            float b = bptr[x] * scale;
+            float r = rptr[x] * scale;
+            float max_color = FFMAX3(r, g, b);
+            float min_color = FFMIN3(r, g, b);
+            float color_saturation = max_color - min_color;
+            float luma = g * gc + r * rc + b * bc;
+            const float cg = 1.f + gintensity * (1.f - sgintensity * color_saturation);
+            const float cb = 1.f + bintensity * (1.f - sbintensity * color_saturation);
+            const float cr = 1.f + rintensity * (1.f - srintensity * color_saturation);
+
+            g = lerpf(luma, g, cg);
+            b = lerpf(luma, b, cb);
+            r = lerpf(luma, r, cr);
+
+            gptr[x] = av_clip_uintp2_c(g * max, depth);
+            bptr[x] = av_clip_uintp2_c(b * max, depth);
+            rptr[x] = av_clip_uintp2_c(r * max, depth);
+        }
+
+        gptr += glinesize;
+        bptr += blinesize;
+        rptr += rlinesize;
+    }
+
+    return 0;
+}
+
+static int filter_frame(AVFilterLink *link, AVFrame *frame)
+{
+    AVFilterContext *avctx = link->dst;
+    VibranceContext *s = avctx->priv;
+    int res;
+
+    if (res = avctx->internal->execute(avctx, s->do_slice, frame, NULL,
+                                       FFMIN(frame->height, ff_filter_get_nb_threads(avctx))))
+        return res;
+
+    return ff_filter_frame(avctx->outputs[0], frame);
+}
+
+static av_cold int query_formats(AVFilterContext *avctx)
+{
+    static const enum AVPixelFormat pixel_fmts[] = {
+        AV_PIX_FMT_GBRP, AV_PIX_FMT_GBRAP,
+        AV_PIX_FMT_GBRP9, AV_PIX_FMT_GBRP10, AV_PIX_FMT_GBRP12,
+        AV_PIX_FMT_GBRP14, AV_PIX_FMT_GBRP16,
+        AV_PIX_FMT_GBRAP10, AV_PIX_FMT_GBRAP12, AV_PIX_FMT_GBRAP16,
+        AV_PIX_FMT_NONE
+    };
+
+    AVFilterFormats *formats = NULL;
+
+    formats = ff_make_format_list(pixel_fmts);
+    if (!formats)
+        return AVERROR(ENOMEM);
+
+    return ff_set_common_formats(avctx, formats);
+}
+
+static av_cold int config_input(AVFilterLink *inlink)
+{
+    AVFilterContext *avctx = inlink->dst;
+    VibranceContext *s = avctx->priv;
+    const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(inlink->format);
+
+    s->depth = desc->comp[0].depth;
+    s->do_slice = s->depth <= 8 ? vibrance_slice8 : vibrance_slice16;
+
+    return 0;
+}
+
+static const AVFilterPad vibrance_inputs[] = {
+    {
+        .name           = "default",
+        .type           = AVMEDIA_TYPE_VIDEO,
+        .needs_writable = 1,
+        .filter_frame   = filter_frame,
+        .config_props   = config_input,
+    },
+    { NULL }
+};
+
+static const AVFilterPad vibrance_outputs[] = {
+    {
+        .name = "default",
+        .type = AVMEDIA_TYPE_VIDEO,
+    },
+    { NULL }
+};
+
+#define OFFSET(x) offsetof(VibranceContext, x)
+#define VF AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_RUNTIME_PARAM
+
+static const AVOption vibrance_options[] = {
+    { "intensity", "set the intensity value",   OFFSET(intensity),  AV_OPT_TYPE_FLOAT, {.dbl=0},       -2,  2, VF },
+    { "rbal", "set the red balance value",      OFFSET(balance[2]), AV_OPT_TYPE_FLOAT, {.dbl=1},      -10, 10, VF },
+    { "gbal", "set the green balance value",    OFFSET(balance[0]), AV_OPT_TYPE_FLOAT, {.dbl=1},      -10, 10, VF },
+    { "bbal", "set the blue balance value",     OFFSET(balance[1]), AV_OPT_TYPE_FLOAT, {.dbl=1},      -10, 10, VF },
+    { "rlum", "set the red luma coefficient",   OFFSET(lcoeffs[2]), AV_OPT_TYPE_FLOAT, {.dbl=0.072186}, 0,  1, VF },
+    { "glum", "set the green luma coefficient", OFFSET(lcoeffs[0]), AV_OPT_TYPE_FLOAT, {.dbl=0.715158}, 0,  1, VF },
+    { "blum", "set the blue luma coefficient",  OFFSET(lcoeffs[1]), AV_OPT_TYPE_FLOAT, {.dbl=0.212656}, 0,  1, VF },
+    { "alternate", "use alternate colors",      OFFSET(alternate),  AV_OPT_TYPE_BOOL,  {.i64=0},        0,  1, VF },
+    { NULL }
+};
+
+AVFILTER_DEFINE_CLASS(vibrance);
+
+AVFilter ff_vf_vibrance = {
+    .name          = "vibrance",
+    .description   = NULL_IF_CONFIG_SMALL("Boost or alter saturation."),
+    .priv_size     = sizeof(VibranceContext),
+    .priv_class    = &vibrance_class,
+    .query_formats = query_formats,
+    .inputs        = vibrance_inputs,
+    .outputs       = vibrance_outputs,
+    .flags         = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC | AVFILTER_FLAG_SLICE_THREADS,
+    .process_command = ff_filter_process_command,
+};
diff --git a/libavfilter/vf_vmafmotion.c b/libavfilter/vf_vmafmotion.c
index 9bcc4ff..88d0b35 100644
--- a/libavfilter/vf_vmafmotion.c
+++ b/libavfilter/vf_vmafmotion.c
@@ -27,7 +27,6 @@
 #include "libavutil/opt.h"
 #include "libavutil/pixdesc.h"
 #include "avfilter.h"
-#include "drawutils.h"
 #include "formats.h"
 #include "internal.h"
 #include "vmaf_motion.h"
@@ -177,8 +176,8 @@
     } \
 }
 
-conv_y_fn(uint8_t, 8);
-conv_y_fn(uint16_t, 10);
+conv_y_fn(uint8_t, 8)
+conv_y_fn(uint16_t, 10)
 
 static void vmafmotiondsp_init(VMAFMotionDSPContext *dsp, int bpp) {
     dsp->convolution_x = convolution_x;
diff --git a/libavfilter/vf_vpp_qsv.c b/libavfilter/vf_vpp_qsv.c
index 41a9f38..3194295 100644
--- a/libavfilter/vf_vpp_qsv.c
+++ b/libavfilter/vf_vpp_qsv.c
@@ -36,12 +36,15 @@
 #include "libavformat/avformat.h"
 
 #include "qsvvpp.h"
+#include "transpose.h"
 
 #define OFFSET(x) offsetof(VPPContext, x)
 #define FLAGS (AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_FILTERING_PARAM)
 
 /* number of video enhancement filters */
-#define ENH_FILTERS_COUNT (5)
+#define ENH_FILTERS_COUNT (7)
+#define QSV_HAVE_ROTATION  QSV_VERSION_ATLEAST(1, 17)
+#define QSV_HAVE_MIRRORING QSV_VERSION_ATLEAST(1, 19)
 
 typedef struct VPPContext{
     const AVClass *class;
@@ -54,9 +57,15 @@
     mfxExtVPPDenoise denoise_conf;
     mfxExtVPPDetail detail_conf;
     mfxExtVPPProcAmp procamp_conf;
+    mfxExtVPPRotation rotation_conf;
+    mfxExtVPPMirroring mirroring_conf;
 
     int out_width;
     int out_height;
+    /**
+     * Output sw format. AV_PIX_FMT_NONE for no conversion.
+     */
+    enum AVPixelFormat out_format;
 
     AVRational framerate;       /* target framerate */
     int use_frc;                /* use framerate conversion */
@@ -70,6 +79,10 @@
     int crop_x;
     int crop_y;
 
+    int transpose;
+    int rotate;                 /* rotate angle : [0, 90, 180, 270] */
+    int hflip;                  /* flip mode : 0 = off, 1 = HORIZONTAL flip */
+
     /* param for the procamp */
     int    procamp;            /* enable procamp */
     float  hue;
@@ -79,6 +92,7 @@
 
     char *cx, *cy, *cw, *ch;
     char *ow, *oh;
+    char *output_format_str;
 } VPPContext;
 
 static const AVOption options[] = {
@@ -95,15 +109,26 @@
     { "contrast",    "ProcAmp contrast",             OFFSET(contrast),    AV_OPT_TYPE_FLOAT,    { .dbl = 1.0 }, 0.0, 10.0, .flags = FLAGS},
     { "brightness",  "ProcAmp brightness",           OFFSET(brightness),  AV_OPT_TYPE_FLOAT,    { .dbl = 0.0 }, -100.0, 100.0, .flags = FLAGS},
 
-    { "cw",   "set the width crop area expression",   OFFSET(cw), AV_OPT_TYPE_STRING, { .str = "iw" }, CHAR_MIN, CHAR_MAX, FLAGS },
-    { "ch",   "set the height crop area expression",  OFFSET(ch), AV_OPT_TYPE_STRING, { .str = "ih" }, CHAR_MIN, CHAR_MAX, FLAGS },
-    { "cx",   "set the x crop area expression",       OFFSET(cx), AV_OPT_TYPE_STRING, { .str = "(in_w-out_w)/2" }, CHAR_MIN, CHAR_MAX, FLAGS },
-    { "cy",   "set the y crop area expression",       OFFSET(cy), AV_OPT_TYPE_STRING, { .str = "(in_h-out_h)/2" }, CHAR_MIN, CHAR_MAX, FLAGS },
+    { "transpose",  "set transpose direction",       OFFSET(transpose),   AV_OPT_TYPE_INT,      { .i64 = -1 }, -1, 6, FLAGS, "transpose"},
+        { "cclock_hflip",  "rotate counter-clockwise with horizontal flip",  0, AV_OPT_TYPE_CONST, { .i64 = TRANSPOSE_CCLOCK_FLIP }, .flags=FLAGS, .unit = "transpose" },
+        { "clock",         "rotate clockwise",                               0, AV_OPT_TYPE_CONST, { .i64 = TRANSPOSE_CLOCK       }, .flags=FLAGS, .unit = "transpose" },
+        { "cclock",        "rotate counter-clockwise",                       0, AV_OPT_TYPE_CONST, { .i64 = TRANSPOSE_CCLOCK      }, .flags=FLAGS, .unit = "transpose" },
+        { "clock_hflip",   "rotate clockwise with horizontal flip",          0, AV_OPT_TYPE_CONST, { .i64 = TRANSPOSE_CLOCK_FLIP  }, .flags=FLAGS, .unit = "transpose" },
+        { "reversal",      "rotate by half-turn",                            0, AV_OPT_TYPE_CONST, { .i64 = TRANSPOSE_REVERSAL    }, .flags=FLAGS, .unit = "transpose" },
+        { "hflip",         "flip horizontally",                              0, AV_OPT_TYPE_CONST, { .i64 = TRANSPOSE_HFLIP       }, .flags=FLAGS, .unit = "transpose" },
+        { "vflip",         "flip vertically",                                0, AV_OPT_TYPE_CONST, { .i64 = TRANSPOSE_VFLIP       }, .flags=FLAGS, .unit = "transpose" },
+
+    { "cw",   "set the width crop area expression",   OFFSET(cw), AV_OPT_TYPE_STRING, { .str = "iw" }, 0, 0, FLAGS },
+    { "ch",   "set the height crop area expression",  OFFSET(ch), AV_OPT_TYPE_STRING, { .str = "ih" }, 0, 0, FLAGS },
+    { "cx",   "set the x crop area expression",       OFFSET(cx), AV_OPT_TYPE_STRING, { .str = "(in_w-out_w)/2" }, 0, 0, FLAGS },
+    { "cy",   "set the y crop area expression",       OFFSET(cy), AV_OPT_TYPE_STRING, { .str = "(in_h-out_h)/2" }, 0, 0, FLAGS },
 
     { "w",      "Output video width",  OFFSET(ow), AV_OPT_TYPE_STRING, { .str="cw" }, 0, 255, .flags = FLAGS },
     { "width",  "Output video width",  OFFSET(ow), AV_OPT_TYPE_STRING, { .str="cw" }, 0, 255, .flags = FLAGS },
     { "h",      "Output video height", OFFSET(oh), AV_OPT_TYPE_STRING, { .str="w*ch/cw" }, 0, 255, .flags = FLAGS },
     { "height", "Output video height", OFFSET(oh), AV_OPT_TYPE_STRING, { .str="w*ch/cw" }, 0, 255, .flags = FLAGS },
+    { "format", "Output pixel format", OFFSET(output_format_str), AV_OPT_TYPE_STRING, { .str = "same" }, .flags = FLAGS },
+
     { NULL }
 };
 
@@ -207,6 +232,23 @@
     return ret;
 }
 
+static av_cold int vpp_init(AVFilterContext *ctx)
+{
+    VPPContext  *vpp  = ctx->priv;
+
+    if (!strcmp(vpp->output_format_str, "same")) {
+        vpp->out_format = AV_PIX_FMT_NONE;
+    } else {
+        vpp->out_format = av_get_pix_fmt(vpp->output_format_str);
+        if (vpp->out_format == AV_PIX_FMT_NONE) {
+            av_log(ctx, AV_LOG_ERROR, "Unrecognized output pixel format: %s\n", vpp->output_format_str);
+            return AVERROR(EINVAL);
+        }
+    }
+
+    return 0;
+}
+
 static int config_input(AVFilterLink *inlink)
 {
     AVFilterContext *ctx = inlink->dst;
@@ -251,6 +293,7 @@
     QSVVPPCrop      crop  = { 0 };
     mfxExtBuffer    *ext_buf[ENH_FILTERS_COUNT];
     AVFilterLink    *inlink = ctx->inputs[0];
+    enum AVPixelFormat in_format;
 
     outlink->w          = vpp->out_width;
     outlink->h          = vpp->out_height;
@@ -258,10 +301,21 @@
     outlink->time_base  = av_inv_q(vpp->framerate);
 
     param.filter_frame  = NULL;
-    param.out_sw_format = AV_PIX_FMT_NV12;
     param.num_ext_buf   = 0;
     param.ext_buf       = ext_buf;
 
+    if (inlink->format == AV_PIX_FMT_QSV) {
+         if (!inlink->hw_frames_ctx || !inlink->hw_frames_ctx->data)
+             return AVERROR(EINVAL);
+         else
+             in_format = ((AVHWFramesContext*)inlink->hw_frames_ctx->data)->sw_format;
+    } else
+        in_format = inlink->format;
+
+    if (vpp->out_format == AV_PIX_FMT_NONE)
+        vpp->out_format = in_format;
+    param.out_sw_format  = vpp->out_format;
+
     if (vpp->use_crop) {
         crop.in_idx = 0;
         crop.x = vpp->crop_x;
@@ -322,8 +376,87 @@
         param.ext_buf[param.num_ext_buf++] = (mfxExtBuffer*)&vpp->procamp_conf;
     }
 
+    if (vpp->transpose >= 0) {
+#ifdef QSV_HAVE_ROTATION
+        switch (vpp->transpose) {
+        case TRANSPOSE_CCLOCK_FLIP:
+            vpp->rotate = MFX_ANGLE_270;
+            vpp->hflip  = MFX_MIRRORING_HORIZONTAL;
+            break;
+        case TRANSPOSE_CLOCK:
+            vpp->rotate = MFX_ANGLE_90;
+            vpp->hflip  = MFX_MIRRORING_DISABLED;
+            break;
+        case TRANSPOSE_CCLOCK:
+            vpp->rotate = MFX_ANGLE_270;
+            vpp->hflip  = MFX_MIRRORING_DISABLED;
+            break;
+        case TRANSPOSE_CLOCK_FLIP:
+            vpp->rotate = MFX_ANGLE_90;
+            vpp->hflip  = MFX_MIRRORING_HORIZONTAL;
+            break;
+        case TRANSPOSE_REVERSAL:
+            vpp->rotate = MFX_ANGLE_180;
+            vpp->hflip  = MFX_MIRRORING_DISABLED;
+            break;
+        case TRANSPOSE_HFLIP:
+            vpp->rotate = MFX_ANGLE_0;
+            vpp->hflip  = MFX_MIRRORING_HORIZONTAL;
+            break;
+        case TRANSPOSE_VFLIP:
+            vpp->rotate = MFX_ANGLE_180;
+            vpp->hflip  = MFX_MIRRORING_HORIZONTAL;
+            break;
+        default:
+            av_log(ctx, AV_LOG_ERROR, "Failed to set transpose mode to %d.\n", vpp->transpose);
+            return AVERROR(EINVAL);
+        }
+#else
+        av_log(ctx, AV_LOG_WARNING, "The QSV VPP transpose option is "
+            "not supported with this MSDK version.\n");
+        vpp->transpose = 0;
+#endif
+    }
+
+    if (vpp->rotate) {
+#ifdef QSV_HAVE_ROTATION
+        memset(&vpp->rotation_conf, 0, sizeof(mfxExtVPPRotation));
+        vpp->rotation_conf.Header.BufferId  = MFX_EXTBUFF_VPP_ROTATION;
+        vpp->rotation_conf.Header.BufferSz  = sizeof(mfxExtVPPRotation);
+        vpp->rotation_conf.Angle = vpp->rotate;
+
+        if (MFX_ANGLE_90 == vpp->rotate || MFX_ANGLE_270 == vpp->rotate) {
+            FFSWAP(int, vpp->out_width, vpp->out_height);
+            FFSWAP(int, outlink->w, outlink->h);
+            av_log(ctx, AV_LOG_DEBUG, "Swap width and height for clock/cclock rotation.\n");
+        }
+
+        param.ext_buf[param.num_ext_buf++] = (mfxExtBuffer*)&vpp->rotation_conf;
+#else
+        av_log(ctx, AV_LOG_WARNING, "The QSV VPP rotate option is "
+            "not supported with this MSDK version.\n");
+        vpp->rotate = 0;
+#endif
+    }
+
+    if (vpp->hflip) {
+#ifdef QSV_HAVE_MIRRORING
+        memset(&vpp->mirroring_conf, 0, sizeof(mfxExtVPPMirroring));
+        vpp->mirroring_conf.Header.BufferId = MFX_EXTBUFF_VPP_MIRRORING;
+        vpp->mirroring_conf.Header.BufferSz = sizeof(mfxExtVPPMirroring);
+        vpp->mirroring_conf.Type = vpp->hflip;
+
+        param.ext_buf[param.num_ext_buf++] = (mfxExtBuffer*)&vpp->mirroring_conf;
+#else
+        av_log(ctx, AV_LOG_WARNING, "The QSV VPP hflip option is "
+            "not supported with this MSDK version.\n");
+        vpp->hflip = 0;
+#endif
+    }
+
     if (vpp->use_frc || vpp->use_crop || vpp->deinterlace || vpp->denoise ||
-        vpp->detail || vpp->procamp || inlink->w != outlink->w || inlink->h != outlink->h)
+        vpp->detail || vpp->procamp || vpp->rotate || vpp->hflip ||
+        inlink->w != outlink->w || inlink->h != outlink->h || in_format != vpp->out_format)
         return ff_qsvvpp_create(ctx, &vpp->qsv, &param);
     else {
         av_log(ctx, AV_LOG_VERBOSE, "qsv vpp pass through mode.\n");
@@ -367,6 +500,7 @@
     };
     static const enum AVPixelFormat out_pix_fmts[] = {
         AV_PIX_FMT_NV12,
+        AV_PIX_FMT_P010,
         AV_PIX_FMT_QSV,
         AV_PIX_FMT_NONE
     };
@@ -421,6 +555,7 @@
     .description   = NULL_IF_CONFIG_SMALL("Quick Sync Video VPP."),
     .priv_size     = sizeof(VPPContext),
     .query_formats = query_formats,
+    .init          = vpp_init,
     .uninit        = vpp_uninit,
     .inputs        = vpp_inputs,
     .outputs       = vpp_outputs,
diff --git a/libavfilter/vf_w3fdif.c b/libavfilter/vf_w3fdif.c
index c6a6550..5d64dbd 100644
--- a/libavfilter/vf_w3fdif.c
+++ b/libavfilter/vf_w3fdif.c
@@ -81,6 +81,10 @@
         AV_PIX_FMT_YUV420P12, AV_PIX_FMT_YUV422P12, AV_PIX_FMT_YUV444P12,
         AV_PIX_FMT_YUV420P14, AV_PIX_FMT_YUV422P14, AV_PIX_FMT_YUV444P14,
         AV_PIX_FMT_GBRP9, AV_PIX_FMT_GBRP10, AV_PIX_FMT_GBRP12, AV_PIX_FMT_GBRP14,
+        AV_PIX_FMT_YUVA444P9, AV_PIX_FMT_YUVA444P10, AV_PIX_FMT_YUVA444P12, AV_PIX_FMT_YUVA444P16,
+        AV_PIX_FMT_YUVA422P9, AV_PIX_FMT_YUVA422P10, AV_PIX_FMT_YUVA422P12, AV_PIX_FMT_YUVA422P16,
+        AV_PIX_FMT_YUVA420P9, AV_PIX_FMT_YUVA420P10, AV_PIX_FMT_YUVA420P16,
+        AV_PIX_FMT_GBRAP10,   AV_PIX_FMT_GBRAP12,    AV_PIX_FMT_GBRAP16,
         AV_PIX_FMT_NONE
     };
 
@@ -274,6 +278,11 @@
     s->planeheight[1] = s->planeheight[2] = AV_CEIL_RSHIFT(inlink->h, desc->log2_chroma_h);
     s->planeheight[0] = s->planeheight[3] = inlink->h;
 
+    if (inlink->h < 3) {
+        av_log(ctx, AV_LOG_ERROR, "Video of less than 3 lines is not supported\n");
+        return AVERROR(EINVAL);
+    }
+
     s->nb_planes = av_pix_fmt_count_planes(inlink->format);
     s->nb_threads = ff_filter_get_nb_threads(ctx);
     s->work_line = av_calloc(s->nb_threads, sizeof(*s->work_line));
diff --git a/libavfilter/vf_waveform.c b/libavfilter/vf_waveform.c
index bcee57c..b2c5b46 100644
--- a/libavfilter/vf_waveform.c
+++ b/libavfilter/vf_waveform.c
@@ -45,6 +45,7 @@
     COLOR,
     ACOLOR,
     XFLAT,
+    YFLAT,
     NB_FILTERS
 };
 
@@ -62,6 +63,14 @@
     NB_SCALES
 };
 
+enum GraticuleType {
+    GRAT_NONE,
+    GRAT_GREEN,
+    GRAT_ORANGE,
+    GRAT_INVERT,
+    NB_GRATICULES
+};
+
 typedef struct GraticuleLine {
     const char *name;
     uint16_t pos;
@@ -102,10 +111,18 @@
     int            shift_w[4], shift_h[4];
     GraticuleLines *glines;
     int            nb_glines;
+    int            rgb;
+    float          ftint[2];
+    int            tint[2];
 
     int (*waveform_slice)(AVFilterContext *ctx, void *arg,
                           int jobnr, int nb_jobs);
     void (*graticulef)(struct WaveformContext *s, AVFrame *out);
+    void (*blend_line)(uint8_t *dst, int size, int linesize, float o1, float o2,
+                       int v, int step);
+    void (*draw_text)(AVFrame *out, int x, int y, int mult,
+                      float o1, float o2, const char *txt,
+                      const uint8_t color[4]);
     const AVPixFmtDescriptor *desc;
     const AVPixFmtDescriptor *odesc;
 } WaveformContext;
@@ -144,11 +161,13 @@
         { "color",   NULL, 0, AV_OPT_TYPE_CONST, {.i64=COLOR},   0, 0, FLAGS, "filter" },
         { "acolor",  NULL, 0, AV_OPT_TYPE_CONST, {.i64=ACOLOR},  0, 0, FLAGS, "filter" },
         { "xflat",   NULL, 0, AV_OPT_TYPE_CONST, {.i64=XFLAT},   0, 0, FLAGS, "filter" },
-    { "graticule", "set graticule", OFFSET(graticule), AV_OPT_TYPE_INT, {.i64=0}, 0, 2, FLAGS, "graticule" },
-    { "g",         "set graticule", OFFSET(graticule), AV_OPT_TYPE_INT, {.i64=0}, 0, 2, FLAGS, "graticule" },
-        { "none",   NULL, 0, AV_OPT_TYPE_CONST, {.i64=0}, 0, 0, FLAGS, "graticule" },
-        { "green",  NULL, 0, AV_OPT_TYPE_CONST, {.i64=1}, 0, 0, FLAGS, "graticule" },
-        { "orange", NULL, 0, AV_OPT_TYPE_CONST, {.i64=2}, 0, 0, FLAGS, "graticule" },
+        { "yflat",   NULL, 0, AV_OPT_TYPE_CONST, {.i64=YFLAT},   0, 0, FLAGS, "filter" },
+    { "graticule", "set graticule", OFFSET(graticule), AV_OPT_TYPE_INT, {.i64=0}, 0, NB_GRATICULES-1, FLAGS, "graticule" },
+    { "g",         "set graticule", OFFSET(graticule), AV_OPT_TYPE_INT, {.i64=0}, 0, NB_GRATICULES-1, FLAGS, "graticule" },
+        { "none",   NULL, 0, AV_OPT_TYPE_CONST, {.i64=GRAT_NONE},   0, 0, FLAGS, "graticule" },
+        { "green",  NULL, 0, AV_OPT_TYPE_CONST, {.i64=GRAT_GREEN},  0, 0, FLAGS, "graticule" },
+        { "orange", NULL, 0, AV_OPT_TYPE_CONST, {.i64=GRAT_ORANGE}, 0, 0, FLAGS, "graticule" },
+        { "invert", NULL, 0, AV_OPT_TYPE_CONST, {.i64=GRAT_INVERT}, 0, 0, FLAGS, "graticule" },
     { "opacity", "set graticule opacity", OFFSET(opacity), AV_OPT_TYPE_FLOAT, {.dbl=0.75}, 0, 1, FLAGS },
     { "o",       "set graticule opacity", OFFSET(opacity), AV_OPT_TYPE_FLOAT, {.dbl=0.75}, 0, 1, FLAGS },
     { "flags", "set graticule flags", OFFSET(flags), AV_OPT_TYPE_FLAGS, {.i64=1}, 0, 3, FLAGS, "flags" },
@@ -162,6 +181,10 @@
         { "ire",        NULL, 0, AV_OPT_TYPE_CONST, {.i64=IRE},        0, 0, FLAGS, "scale" },
     { "bgopacity", "set background opacity", OFFSET(bgopacity), AV_OPT_TYPE_FLOAT, {.dbl=0.75}, 0, 1, FLAGS },
     { "b",         "set background opacity", OFFSET(bgopacity), AV_OPT_TYPE_FLOAT, {.dbl=0.75}, 0, 1, FLAGS },
+    { "tint0", "set 1st tint", OFFSET(ftint[0]), AV_OPT_TYPE_FLOAT, {.dbl=0}, -1, 1, FLAGS},
+    { "t0",    "set 1st tint", OFFSET(ftint[0]), AV_OPT_TYPE_FLOAT, {.dbl=0}, -1, 1, FLAGS},
+    { "tint1", "set 2nd tint", OFFSET(ftint[1]), AV_OPT_TYPE_FLOAT, {.dbl=0}, -1, 1, FLAGS},
+    { "t1",    "set 2nd tint", OFFSET(ftint[1]), AV_OPT_TYPE_FLOAT, {.dbl=0}, -1, 1, FLAGS},
     { NULL }
 };
 
@@ -182,6 +205,7 @@
     AV_PIX_FMT_YUV444P10, AV_PIX_FMT_YUV422P10, AV_PIX_FMT_YUV420P10,
     AV_PIX_FMT_YUVA444P10, AV_PIX_FMT_YUVA422P10, AV_PIX_FMT_YUVA420P10,
     AV_PIX_FMT_YUV444P12, AV_PIX_FMT_YUV422P12, AV_PIX_FMT_YUV420P12, AV_PIX_FMT_YUV440P12,
+    AV_PIX_FMT_YUVA444P12, AV_PIX_FMT_YUVA422P12,
     AV_PIX_FMT_NONE
 };
 
@@ -199,6 +223,7 @@
     AV_PIX_FMT_YUV444P10, AV_PIX_FMT_YUV422P10, AV_PIX_FMT_YUV420P10,
     AV_PIX_FMT_YUVA444P10, AV_PIX_FMT_YUVA422P10, AV_PIX_FMT_YUVA420P10,
     AV_PIX_FMT_YUV444P12, AV_PIX_FMT_YUV422P12, AV_PIX_FMT_YUV420P12, AV_PIX_FMT_YUV440P12,
+    AV_PIX_FMT_YUVA444P12, AV_PIX_FMT_YUVA422P12,
     AV_PIX_FMT_NONE
 };
 
@@ -214,6 +239,7 @@
     AV_PIX_FMT_YUV444P10, AV_PIX_FMT_YUV422P10, AV_PIX_FMT_YUV420P10,
     AV_PIX_FMT_YUVA444P10, AV_PIX_FMT_YUVA422P10, AV_PIX_FMT_YUVA420P10,
     AV_PIX_FMT_YUV444P12, AV_PIX_FMT_YUV422P12, AV_PIX_FMT_YUV420P12, AV_PIX_FMT_YUV440P12,
+    AV_PIX_FMT_YUVA444P12, AV_PIX_FMT_YUVA422P12,
     AV_PIX_FMT_NONE
 };
 
@@ -253,7 +279,7 @@
 };
 
 static const enum AVPixelFormat out_yuv12_lowpass_pix_fmts[] = {
-    AV_PIX_FMT_YUV444P12,
+    AV_PIX_FMT_YUV444P12, AV_PIX_FMT_YUVA444P12,
     AV_PIX_FMT_NONE
 };
 
@@ -289,9 +315,9 @@
     WaveformContext *s = ctx->priv;
     const enum AVPixelFormat *out_pix_fmts;
     const enum AVPixelFormat *in_pix_fmts;
-    const AVPixFmtDescriptor *desc;
-    AVFilterFormats *avff;
-    int depth, rgb, i, ret, ncomp;
+    const AVPixFmtDescriptor *desc, *desc2;
+    AVFilterFormats *avff, *avff2;
+    int depth, depth2, rgb, i, ret, ncomp, ncomp2;
 
     if (!ctx->inputs[0]->in_formats ||
         !ctx->inputs[0]->in_formats->nb_formats) {
@@ -302,6 +328,7 @@
     case LOWPASS: in_pix_fmts = in_lowpass_pix_fmts; break;
     case CHROMA:
     case XFLAT:
+    case YFLAT:
     case AFLAT:
     case FLAT:    in_pix_fmts = in_flat_pix_fmts;    break;
     case ACOLOR:
@@ -315,10 +342,16 @@
     }
 
     avff = ctx->inputs[0]->in_formats;
+    avff2 = ctx->inputs[0]->out_formats;
     desc = av_pix_fmt_desc_get(avff->formats[0]);
+    desc2 = av_pix_fmt_desc_get(avff2->formats[0]);
     ncomp = desc->nb_components;
+    ncomp2 = desc2->nb_components;
     rgb = desc->flags & AV_PIX_FMT_FLAG_RGB;
     depth = desc->comp[0].depth;
+    depth2 = desc2->comp[0].depth;
+    if (ncomp != ncomp2 || depth != depth2)
+        return AVERROR(EAGAIN);
     for (i = 1; i < avff->nb_formats; i++) {
         desc = av_pix_fmt_desc_get(avff->formats[i]);
         if (rgb != (desc->flags & AV_PIX_FMT_FLAG_RGB) ||
@@ -654,10 +687,11 @@
                                        int jobnr, int nb_jobs)
 {
     const int plane = s->desc->comp[component].plane;
+    const int dplane = (s->rgb || s->display == OVERLAY) ? plane : 0;
     const int shift_w = s->shift_w[component];
     const int shift_h = s->shift_h[component];
     const int src_linesize = in->linesize[plane] / 2;
-    const int dst_linesize = out->linesize[plane] / 2;
+    const int dst_linesize = out->linesize[dplane] / 2;
     const int dst_signed_linesize = dst_linesize * (mirror == 1 ? -1 : 1);
     const int limit = s->max - 1;
     const int max = limit - intensity;
@@ -669,7 +703,7 @@
     const int slicew_end = column ? (src_w * (jobnr+1)) / nb_jobs : src_w;
     const int step = column ? 1 << shift_w : 1 << shift_h;
     const uint16_t *src_data = (const uint16_t *)in->data[plane] + sliceh_start * src_linesize;
-    uint16_t *dst_data = (uint16_t *)out->data[plane] + (offset_y + sliceh_start * step) * dst_linesize + offset_x;
+    uint16_t *dst_data = (uint16_t *)out->data[dplane] + (offset_y + sliceh_start * step) * dst_linesize + offset_x;
     uint16_t * const dst_bottom_line = dst_data + dst_linesize * (s->size - 1);
     uint16_t * const dst_line = (mirror ? dst_bottom_line : dst_data);
     const uint16_t *p;
@@ -706,6 +740,56 @@
         src_data += src_linesize;
         dst_data += dst_linesize * step;
     }
+
+    if (s->display != OVERLAY && column && !s->rgb) {
+        const int mult = s->max / 256;
+        const int bg = s->bg_color[0] * mult;
+        const int t0 = s->tint[0];
+        const int t1 = s->tint[1];
+        uint16_t *dst0, *dst1;
+        const uint16_t *src;
+        int x;
+
+        src  = (const uint16_t *)(out->data[0]) + offset_y * dst_linesize + offset_x;
+        dst0 = (uint16_t *)(out->data[1]) + offset_y * dst_linesize + offset_x;
+        dst1 = (uint16_t *)(out->data[2]) + offset_y * dst_linesize + offset_x;
+        for (y = 0; y < s->max; y++) {
+            for (x = slicew_start * step; x < slicew_end * step; x++) {
+                if (src[x] != bg) {
+                    dst0[x] = t0;
+                    dst1[x] = t1;
+                }
+            }
+
+            src  += dst_linesize;
+            dst0 += dst_linesize;
+            dst1 += dst_linesize;
+        }
+    } else if (s->display != OVERLAY && !s->rgb) {
+        const int mult = s->max / 256;
+        const int bg = s->bg_color[0] * mult;
+        const int t0 = s->tint[0];
+        const int t1 = s->tint[1];
+        uint16_t *dst0, *dst1;
+        const uint16_t *src;
+        int x;
+
+        src  = (const uint16_t *)out->data[0] + (offset_y + sliceh_start * step) * dst_linesize + offset_x;
+        dst0 = (uint16_t *)(out->data[1]) + (offset_y + sliceh_start * step) * dst_linesize + offset_x;
+        dst1 = (uint16_t *)(out->data[2]) + (offset_y + sliceh_start * step) * dst_linesize + offset_x;
+        for (y = sliceh_start * step; y < sliceh_end * step; y++) {
+            for (x = 0; x < s->max; x++) {
+                if (src[x] != bg) {
+                    dst0[x] = t0;
+                    dst1[x] = t1;
+                }
+            }
+
+            src  += dst_linesize;
+            dst0 += dst_linesize;
+            dst1 += dst_linesize;
+        }
+    }
 }
 
 #define LOWPASS16_FUNC(name, column, mirror)        \
@@ -741,10 +825,11 @@
                                      int jobnr, int nb_jobs)
 {
     const int plane = s->desc->comp[component].plane;
+    const int dplane = (s->rgb || s->display == OVERLAY) ? plane : 0;
     const int shift_w = s->shift_w[component];
     const int shift_h = s->shift_h[component];
     const int src_linesize = in->linesize[plane];
-    const int dst_linesize = out->linesize[plane];
+    const int dst_linesize = out->linesize[dplane];
     const int dst_signed_linesize = dst_linesize * (mirror == 1 ? -1 : 1);
     const int max = 255 - intensity;
     const int src_h = AV_CEIL_RSHIFT(in->height, shift_h);
@@ -755,7 +840,7 @@
     const int slicew_end = column ? (src_w * (jobnr+1)) / nb_jobs : src_w;
     const int step = column ? 1 << shift_w : 1 << shift_h;
     const uint8_t *src_data = in->data[plane] + sliceh_start * src_linesize;
-    uint8_t *dst_data = out->data[plane] + (offset_y + sliceh_start * step) * dst_linesize + offset_x;
+    uint8_t *dst_data = out->data[dplane] + (offset_y + sliceh_start * step) * dst_linesize + offset_x;
     uint8_t * const dst_bottom_line = dst_data + dst_linesize * (s->size - 1);
     uint8_t * const dst_line = (mirror ? dst_bottom_line : dst_data);
     const uint8_t *p;
@@ -770,48 +855,76 @@
 
         for (p = src_data + slicew_start; p < src_data_end; p++) {
             uint8_t *target;
+            int i = 0;
+
             if (column) {
-                target = dst + dst_signed_linesize * *p;
-                dst += step;
-                update(target, max, intensity);
+                do {
+                    target = dst++ + dst_signed_linesize * *p;
+                    update(target, max, intensity);
+                } while (++i < step);
             } else {
                 uint8_t *row = dst_data;
-                if (mirror)
-                    target = row - *p - 1;
-                else
-                    target = row + *p;
-                update(target, max, intensity);
-                row += dst_linesize;
+                do {
+                    if (mirror)
+                        target = row - *p - 1;
+                    else
+                        target = row + *p;
+                    update(target, max, intensity);
+                    row += dst_linesize;
+                } while (++i < step);
             }
         }
         src_data += src_linesize;
         dst_data += dst_linesize * step;
     }
 
-    if (column && step > 1) {
+    if (s->display != OVERLAY && column && !s->rgb) {
+        const int bg = s->bg_color[0];
         const int dst_h = 256;
-        uint8_t *dst;
-        int x, z;
+        const int t0 = s->tint[0];
+        const int t1 = s->tint[1];
+        uint8_t *dst0, *dst1;
+        const uint8_t *src;
+        int x;
 
-        dst = out->data[plane] + offset_y * dst_linesize + offset_x;
+        src  = out->data[0] + offset_y * dst_linesize + offset_x;
+        dst0 = out->data[1] + offset_y * dst_linesize + offset_x;
+        dst1 = out->data[2] + offset_y * dst_linesize + offset_x;
         for (y = 0; y < dst_h; y++) {
-            for (x = slicew_start * step; x < slicew_end * step; x+=step) {
-                for (z = 1; z < step; z++) {
-                    dst[x + z] = dst[x];
+            for (x = slicew_start * step; x < slicew_end * step; x++) {
+                if (src[x] != bg) {
+                    dst0[x] = t0;
+                    dst1[x] = t1;
                 }
             }
-            dst += dst_linesize;
-        }
-    } else if (step > 1) {
-        const int dst_w = 256;
-        uint8_t *dst;
-        int z;
 
-        dst = out->data[plane] + (offset_y + sliceh_start * step) * dst_linesize + offset_x;
-        for (y = sliceh_start * step; y < sliceh_end * step; y+=step) {
-            for (z = 1; z < step; z++)
-                memcpy(dst + dst_linesize * z, dst, dst_w);
-            dst += dst_linesize * step;
+            src  += dst_linesize;
+            dst0 += dst_linesize;
+            dst1 += dst_linesize;
+        }
+    } else if (s->display != OVERLAY && !s->rgb) {
+        const int bg = s->bg_color[0];
+        const int dst_w = 256;
+        const int t0 = s->tint[0];
+        const int t1 = s->tint[1];
+        uint8_t *dst0, *dst1;
+        const uint8_t *src;
+        int x;
+
+        src  = out->data[0] + (offset_y + sliceh_start * step) * dst_linesize + offset_x;
+        dst0 = out->data[1] + (offset_y + sliceh_start * step) * dst_linesize + offset_x;
+        dst1 = out->data[2] + (offset_y + sliceh_start * step) * dst_linesize + offset_x;
+        for (y = sliceh_start * step; y < sliceh_end * step; y++) {
+            for (x = 0; x < dst_w; x++) {
+                if (src[x] != bg) {
+                    dst0[x] = t0;
+                    dst1[x] = t1;
+                }
+            }
+
+            src  += dst_linesize;
+            dst0 += dst_linesize;
+            dst1 += dst_linesize;
         }
     }
 }
@@ -1117,7 +1230,7 @@
 FLAT_FUNC(row_mirror,    0, 1)
 FLAT_FUNC(row,           0, 0)
 
-#define AFLAT16(name, update_cr, column, mirror)                                                                   \
+#define AFLAT16(name, update_cb, update_cr, column, mirror)                                                        \
 static int name(AVFilterContext *ctx,                                                                              \
                 void *arg, int jobnr,                                                                              \
                 int nb_jobs)                                                                                       \
@@ -1183,7 +1296,7 @@
                 update16(target, max, intensity, limit);                                                           \
                                                                                                                    \
                 target = d1 + x + d1_signed_linesize * (c0 + c1);                                                  \
-                update16(target, max, intensity, limit);                                                           \
+                update_cb(target, max, intensity, limit);                                                          \
                                                                                                                    \
                 target = d2 + x + d2_signed_linesize * (c0 + c2);                                                  \
                 update_cr(target, max, intensity, limit);                                                          \
@@ -1224,14 +1337,14 @@
                     target = d0_data - c0;                                                                         \
                     update16(target, max, intensity, limit);                                                       \
                     target = d1_data - (c0 + c1);                                                                  \
-                    update16(target, max, intensity, limit);                                                       \
+                    update_cb(target, max, intensity, limit);                                                      \
                     target = d2_data - (c0 + c2);                                                                  \
                     update_cr(target, max, intensity, limit);                                                      \
                 } else {                                                                                           \
                     target = d0_data + c0;                                                                         \
                     update16(target, max, intensity, limit);                                                       \
                     target = d1_data + (c0 + c1);                                                                  \
-                    update16(target, max, intensity, limit);                                                       \
+                    update_cb(target, max, intensity, limit);                                                      \
                     target = d2_data + (c0 + c2);                                                                  \
                     update_cr(target, max, intensity, limit);                                                      \
                 }                                                                                                  \
@@ -1251,7 +1364,7 @@
     return 0;                                                                                                      \
 }
 
-#define AFLAT(name, update_cr, column, mirror)                                                        \
+#define AFLAT(name, update_cb, update_cr, column, mirror)                                             \
 static int name(AVFilterContext *ctx,                                                                 \
                 void *arg, int jobnr,                                                                 \
                 int nb_jobs)                                                                          \
@@ -1315,7 +1428,7 @@
                 update(target, max, intensity);                                                       \
                                                                                                       \
                 target = d1 + x + d1_signed_linesize * (c0 + c1);                                     \
-                update(target, max, intensity);                                                       \
+                update_cb(target, max, intensity);                                                    \
                                                                                                       \
                 target = d2 + x + d2_signed_linesize * (c0 + c2);                                     \
                 update_cr(target, max, intensity);                                                    \
@@ -1324,8 +1437,8 @@
                     c0_data += c0_linesize;                                                           \
                 if (!c1_shift_h || (y & c1_shift_h))                                                  \
                     c1_data += c1_linesize;                                                           \
-                if (!c1_shift_h || (y & c1_shift_h))                                                  \
-                    c2_data += c1_linesize;                                                           \
+                if (!c2_shift_h || (y & c2_shift_h))                                                  \
+                    c2_data += c2_linesize;                                                           \
                 d0_data += d0_linesize;                                                               \
                 d1_data += d1_linesize;                                                               \
                 d2_data += d2_linesize;                                                               \
@@ -1356,14 +1469,14 @@
                     target = d0_data - c0;                                                            \
                     update(target, max, intensity);                                                   \
                     target = d1_data - (c0 + c1);                                                     \
-                    update(target, max, intensity);                                                   \
+                    update_cb(target, max, intensity);                                                \
                     target = d2_data - (c0 + c2);                                                     \
                     update_cr(target, max, intensity);                                                \
                 } else {                                                                              \
                     target = d0_data + c0;                                                            \
                     update(target, max, intensity);                                                   \
                     target = d1_data + (c0 + c1);                                                     \
-                    update(target, max, intensity);                                                   \
+                    update_cb(target, max, intensity);                                                \
                     target = d2_data + (c0 + c2);                                                     \
                     update_cr(target, max, intensity);                                                \
                 }                                                                                     \
@@ -1383,23 +1496,31 @@
     return 0;                                                                                         \
 }
 
-AFLAT16(aflat16_row,           update16,    0, 0)
-AFLAT16(aflat16_row_mirror,    update16,    0, 1)
-AFLAT16(aflat16_column,        update16,    1, 0)
-AFLAT16(aflat16_column_mirror, update16,    1, 1)
-AFLAT16(xflat16_row,           update16_cr, 0, 0)
-AFLAT16(xflat16_row_mirror,    update16_cr, 0, 1)
-AFLAT16(xflat16_column,        update16_cr, 1, 0)
-AFLAT16(xflat16_column_mirror, update16_cr, 1, 1)
+AFLAT16(aflat16_row,           update16, update16,    0, 0)
+AFLAT16(aflat16_row_mirror,    update16, update16,    0, 1)
+AFLAT16(aflat16_column,        update16, update16,    1, 0)
+AFLAT16(aflat16_column_mirror, update16, update16,    1, 1)
+AFLAT16(xflat16_row,           update16, update16_cr, 0, 0)
+AFLAT16(xflat16_row_mirror,    update16, update16_cr, 0, 1)
+AFLAT16(xflat16_column,        update16, update16_cr, 1, 0)
+AFLAT16(xflat16_column_mirror, update16, update16_cr, 1, 1)
+AFLAT16(yflat16_row,           update16_cr, update16_cr, 0, 0)
+AFLAT16(yflat16_row_mirror,    update16_cr, update16_cr, 0, 1)
+AFLAT16(yflat16_column,        update16_cr, update16_cr, 1, 0)
+AFLAT16(yflat16_column_mirror, update16_cr, update16_cr, 1, 1)
 
-AFLAT(aflat_row,           update,    0, 0)
-AFLAT(aflat_row_mirror,    update,    0, 1)
-AFLAT(aflat_column,        update,    1, 0)
-AFLAT(aflat_column_mirror, update,    1, 1)
-AFLAT(xflat_row,           update_cr, 0, 0)
-AFLAT(xflat_row_mirror,    update_cr, 0, 1)
-AFLAT(xflat_column,        update_cr, 1, 0)
-AFLAT(xflat_column_mirror, update_cr, 1, 1)
+AFLAT(aflat_row,           update, update,    0, 0)
+AFLAT(aflat_row_mirror,    update, update,    0, 1)
+AFLAT(aflat_column,        update, update,    1, 0)
+AFLAT(aflat_column_mirror, update, update,    1, 1)
+AFLAT(xflat_row,           update, update_cr, 0, 0)
+AFLAT(xflat_row_mirror,    update, update_cr, 0, 1)
+AFLAT(xflat_column,        update, update_cr, 1, 0)
+AFLAT(xflat_column_mirror, update, update_cr, 1, 1)
+AFLAT(yflat_row,           update_cr, update_cr, 0, 0)
+AFLAT(yflat_row_mirror,    update_cr, update_cr, 0, 1)
+AFLAT(yflat_column,        update_cr, update_cr, 1, 0)
+AFLAT(yflat_column_mirror, update_cr, update_cr, 1, 1)
 
 static av_always_inline void chroma16(WaveformContext *s,
                                       AVFrame *in, AVFrame *out,
@@ -2469,8 +2590,9 @@
     }
 }
 
-static void blend_vline16(uint16_t *dst, int height, int linesize, float o1, float o2, int v, int step)
+static void blend_vline16(uint8_t *ddst, int height, int linesize, float o1, float o2, int v, int step)
 {
+    uint16_t *dst = (uint16_t *)ddst;
     int y;
 
     for (y = 0; y < height; y += step) {
@@ -2480,7 +2602,7 @@
     }
 }
 
-static void blend_hline(uint8_t *dst, int width, float o1, float o2, int v, int step)
+static void blend_hline(uint8_t *dst, int width, int unused, float o1, float o2, int v, int step)
 {
     int x;
 
@@ -2489,8 +2611,9 @@
     }
 }
 
-static void blend_hline16(uint16_t *dst, int width, float o1, float o2, int v, int step)
+static void blend_hline16(uint8_t *ddst, int width, int unused, float o1, float o2, int v, int step)
 {
+    uint16_t *dst = (uint16_t *)ddst;
     int x;
 
     for (x = 0; x < width; x += step) {
@@ -2498,7 +2621,7 @@
     }
 }
 
-static void draw_htext(AVFrame *out, int x, int y, float o1, float o2, const char *txt, const uint8_t color[4])
+static void draw_htext(AVFrame *out, int x, int y, int mult, float o1, float o2, const char *txt, const uint8_t color[4])
 {
     const uint8_t *font;
     int font_height;
@@ -2550,7 +2673,7 @@
     }
 }
 
-static void draw_vtext(AVFrame *out, int x, int y, float o1, float o2, const char *txt, const uint8_t color[4])
+static void draw_vtext(AVFrame *out, int x, int y, int mult, float o1, float o2, const char *txt, const uint8_t color[4])
 {
     const uint8_t *font;
     int font_height;
@@ -2600,6 +2723,150 @@
     }
 }
 
+static void iblend_vline(uint8_t *dst, int height, int linesize, float o1, float o2, int v, int step)
+{
+    int y;
+
+    for (y = 0; y < height; y += step) {
+        dst[0] = (v - dst[0]) * o1 + dst[0] * o2;
+
+        dst += linesize * step;
+    }
+}
+
+static void iblend_vline16(uint8_t *ddst, int height, int linesize, float o1, float o2, int v, int step)
+{
+    uint16_t *dst = (uint16_t *)ddst;
+    int y;
+
+    for (y = 0; y < height; y += step) {
+        dst[0] = (v - dst[0]) * o1 + dst[0] * o2;
+
+        dst += (linesize / 2) * step;
+    }
+}
+
+static void iblend_hline(uint8_t *dst, int width, int unused, float o1, float o2, int v, int step)
+{
+    int x;
+
+    for (x = 0; x < width; x += step) {
+        dst[x] = (v - dst[x]) * o1 + dst[x] * o2;
+    }
+}
+
+static void iblend_hline16(uint8_t *ddst, int width, int unused, float o1, float o2, int v, int step)
+{
+    uint16_t *dst = (uint16_t *)ddst;
+    int x;
+
+    for (x = 0; x < width; x += step) {
+        dst[x] = (v - dst[x]) * o1 + dst[x] * o2;
+    }
+}
+
+static void idraw_htext(AVFrame *out, int x, int y, int mult, float o1, float o2, const char *txt, const uint8_t color[4])
+{
+    const uint8_t *font;
+    int font_height;
+    int i, plane;
+
+    font = avpriv_cga_font,   font_height =  8;
+
+    for (plane = 0; plane < 4 && out->data[plane]; plane++) {
+        for (i = 0; txt[i]; i++) {
+            int char_y, mask;
+            int v = color[plane];
+
+            uint8_t *p = out->data[plane] + y * out->linesize[plane] + (x + i * 8);
+            for (char_y = 0; char_y < font_height; char_y++) {
+                for (mask = 0x80; mask; mask >>= 1) {
+                    if (font[txt[i] * font_height + char_y] & mask)
+                        p[0] = p[0] * o2 + (v - p[0]) * o1;
+                    p++;
+                }
+                p += out->linesize[plane] - 8;
+            }
+        }
+    }
+}
+
+static void idraw_htext16(AVFrame *out, int x, int y, int mult, float o1, float o2, const char *txt, const uint8_t color[4])
+{
+    const uint8_t *font;
+    int font_height;
+    int i, plane;
+
+    font = avpriv_cga_font,   font_height =  8;
+
+    for (plane = 0; plane < 4 && out->data[plane]; plane++) {
+        for (i = 0; txt[i]; i++) {
+            int char_y, mask;
+            int v = color[plane] * mult;
+
+            uint16_t *p = (uint16_t *)(out->data[plane] + y * out->linesize[plane]) + (x + i * 8);
+            for (char_y = 0; char_y < font_height; char_y++) {
+                for (mask = 0x80; mask; mask >>= 1) {
+                    if (font[txt[i] * font_height + char_y] & mask)
+                        p[0] = p[0] * o2 + (v - p[0]) * o1;
+                    p++;
+                }
+                p += out->linesize[plane] / 2 - 8;
+            }
+        }
+    }
+}
+
+static void idraw_vtext(AVFrame *out, int x, int y, int mult, float o1, float o2, const char *txt, const uint8_t color[4])
+{
+    const uint8_t *font;
+    int font_height;
+    int i, plane;
+
+    font = avpriv_cga_font,   font_height =  8;
+
+    for (plane = 0; plane < 4 && out->data[plane]; plane++) {
+        for (i = 0; txt[i]; i++) {
+            int char_y, mask;
+            int v = color[plane];
+
+            for (char_y = font_height - 1; char_y >= 0; char_y--) {
+                uint8_t *p = out->data[plane] + (y + i * 10) * out->linesize[plane] + x;
+                for (mask = 0x80; mask; mask >>= 1) {
+                    if (font[txt[i] * font_height + font_height - 1 - char_y] & mask)
+                        p[char_y] = p[char_y] * o2 + (v - p[char_y]) * o1;
+                    p += out->linesize[plane];
+                }
+            }
+        }
+    }
+}
+
+static void idraw_vtext16(AVFrame *out, int x, int y, int mult, float o1, float o2, const char *txt, const uint8_t color[4])
+{
+    const uint8_t *font;
+    int font_height;
+    int i, plane;
+
+    font = avpriv_cga_font,   font_height =  8;
+
+    for (plane = 0; plane < 4 && out->data[plane]; plane++) {
+        for (i = 0; txt[i]; i++) {
+            int char_y, mask;
+            int v = color[plane] * mult;
+
+            for (char_y = 0; char_y < font_height; char_y++) {
+                uint16_t *p = (uint16_t *)(out->data[plane] + (y + i * 10) * out->linesize[plane]) + x;
+                for (mask = 0x80; mask; mask >>= 1) {
+                    if (font[txt[i] * font_height + font_height - 1 - char_y] & mask)
+                        p[char_y] = p[char_y] * o2 + (v - p[char_y]) * o1;
+                    p += out->linesize[plane] / 2;
+                }
+            }
+        }
+    }
+}
+
 static void graticule_none(WaveformContext *s, AVFrame *out)
 {
 }
@@ -2610,33 +2877,34 @@
     const float o1 = s->opacity;
     const float o2 = 1. - o1;
     const int height = s->display == PARADE ? out->height / s->acomp : out->height;
-    int k = 0, c, p, l, offset_x = 0, offset_y = 0;
+    int C, k = 0, c, p, l, offset_x = 0, offset_y = 0;
 
     for (c = 0; c < s->ncomp; c++) {
         if (!((1 << c) & s->pcomp) || (!s->display && k > 0))
             continue;
 
         k++;
+        C = s->rgb ? 0 : c;
         for (p = 0; p < s->ncomp; p++) {
             const int v = s->grat_yuva_color[p];
             for (l = 0; l < s->nb_glines; l++) {
-                const uint16_t pos = s->glines[l].line[c].pos;
+                const uint16_t pos = s->glines[l].line[C].pos;
                 int x = offset_x + (s->mirror ? s->size - 1 - pos : pos);
                 uint8_t *dst = out->data[p] + offset_y * out->linesize[p] + x;
 
-                blend_vline(dst, height, out->linesize[p], o1, o2, v, step);
+                s->blend_line(dst, height, out->linesize[p], o1, o2, v, step);
             }
         }
 
         for (l = 0; l < s->nb_glines && (s->flags & 1); l++) {
-            const char *name = s->glines[l].line[c].name;
-            const uint16_t pos = s->glines[l].line[c].pos;
+            const char *name = s->glines[l].line[C].name;
+            const uint16_t pos = s->glines[l].line[C].pos;
             int x = offset_x + (s->mirror ? s->size - 1 - pos : pos) - 10;
 
             if (x < 0)
                 x = 4;
 
-            draw_vtext(out, x, offset_y + 2, o1, o2, name, s->grat_yuva_color);
+            s->draw_text(out, x, offset_y + 2, 1, o1, o2, name, s->grat_yuva_color);
         }
 
         offset_x += s->size * (s->display == STACK);
@@ -2651,33 +2919,34 @@
     const float o2 = 1. - o1;
     const int mult = s->max / 256;
     const int height = s->display == PARADE ? out->height / s->acomp : out->height;
-    int k = 0, c, p, l, offset_x = 0, offset_y = 0;
+    int C, k = 0, c, p, l, offset_x = 0, offset_y = 0;
 
     for (c = 0; c < s->ncomp; c++) {
         if (!((1 << c) & s->pcomp) || (!s->display && k > 0))
             continue;
 
         k++;
+        C = s->rgb ? 0 : c;
         for (p = 0; p < s->ncomp; p++) {
             const int v = s->grat_yuva_color[p] * mult;
             for (l = 0; l < s->nb_glines ; l++) {
-                const uint16_t pos = s->glines[l].line[c].pos;
+                const uint16_t pos = s->glines[l].line[C].pos;
                 int x = offset_x + (s->mirror ? s->size - 1 - pos : pos);
-                uint16_t *dst = (uint16_t *)(out->data[p] + offset_y * out->linesize[p]) + x;
+                uint8_t *dst = (uint8_t *)(out->data[p] + offset_y * out->linesize[p]) + x * 2;
 
-                blend_vline16(dst, height, out->linesize[p], o1, o2, v, step);
+                s->blend_line(dst, height, out->linesize[p], o1, o2, v, step);
             }
         }
 
         for (l = 0; l < s->nb_glines && (s->flags & 1); l++) {
-            const char *name = s->glines[l].line[c].name;
-            const uint16_t pos = s->glines[l].line[c].pos;
+            const char *name = s->glines[l].line[C].name;
+            const uint16_t pos = s->glines[l].line[C].pos;
             int x = offset_x + (s->mirror ? s->size - 1 - pos : pos) - 10;
 
             if (x < 0)
                 x = 4;
 
-            draw_vtext16(out, x, offset_y + 2, mult, o1, o2, name, s->grat_yuva_color);
+            s->draw_text(out, x, offset_y + 2, mult, o1, o2, name, s->grat_yuva_color);
         }
 
         offset_x += s->size * (s->display == STACK);
@@ -2691,33 +2960,34 @@
     const float o1 = s->opacity;
     const float o2 = 1. - o1;
     const int width = s->display == PARADE ? out->width / s->acomp : out->width;
-    int k = 0, c, p, l, offset_y = 0, offset_x = 0;
+    int C, k = 0, c, p, l, offset_y = 0, offset_x = 0;
 
     for (c = 0; c < s->ncomp; c++) {
         if ((!((1 << c) & s->pcomp) || (!s->display && k > 0)))
             continue;
 
         k++;
+        C = s->rgb ? 0 : c;
         for (p = 0; p < s->ncomp; p++) {
             const int v = s->grat_yuva_color[p];
             for (l = 0; l < s->nb_glines ; l++) {
-                const uint16_t pos = s->glines[l].line[c].pos;
+                const uint16_t pos = s->glines[l].line[C].pos;
                 int y = offset_y + (s->mirror ? s->size - 1 - pos : pos);
                 uint8_t *dst = out->data[p] + y * out->linesize[p] + offset_x;
 
-                blend_hline(dst, width, o1, o2, v, step);
+                s->blend_line(dst, width, 1, o1, o2, v, step);
             }
         }
 
         for (l = 0; l < s->nb_glines && (s->flags & 1); l++) {
-            const char *name = s->glines[l].line[c].name;
-            const uint16_t pos = s->glines[l].line[c].pos;
+            const char *name = s->glines[l].line[C].name;
+            const uint16_t pos = s->glines[l].line[C].pos;
             int y = offset_y + (s->mirror ? s->size - 1 - pos : pos) - 10;
 
             if (y < 0)
                 y = 4;
 
-            draw_htext(out, 2 + offset_x, y, o1, o2, name, s->grat_yuva_color);
+            s->draw_text(out, 2 + offset_x, y, 1, o1, o2, name, s->grat_yuva_color);
         }
 
         offset_y += s->size * (s->display == STACK);
@@ -2732,33 +3002,34 @@
     const float o2 = 1. - o1;
     const int mult = s->max / 256;
     const int width = s->display == PARADE ? out->width / s->acomp : out->width;
-    int k = 0, c, p, l, offset_x = 0, offset_y = 0;
+    int C, k = 0, c, p, l, offset_x = 0, offset_y = 0;
 
     for (c = 0; c < s->ncomp; c++) {
         if ((!((1 << c) & s->pcomp) || (!s->display && k > 0)))
             continue;
 
         k++;
+        C = s->rgb ? 0 : c;
         for (p = 0; p < s->ncomp; p++) {
             const int v = s->grat_yuva_color[p] * mult;
             for (l = 0; l < s->nb_glines ; l++) {
-                const uint16_t pos = s->glines[l].line[c].pos;
+                const uint16_t pos = s->glines[l].line[C].pos;
                 int y = offset_y + (s->mirror ? s->size - 1 - pos : pos);
-                uint16_t *dst = (uint16_t *)(out->data[p] + y * out->linesize[p]) + offset_x;
+                uint8_t *dst = (uint8_t *)(out->data[p] + y * out->linesize[p]) + offset_x * 2;
 
-                blend_hline16(dst, width, o1, o2, v, step);
+                s->blend_line(dst, width, 1, o1, o2, v, step);
             }
         }
 
         for (l = 0; l < s->nb_glines && (s->flags & 1); l++) {
-            const char *name = s->glines[l].line[c].name;
-            const uint16_t pos = s->glines[l].line[c].pos;
+            const char *name = s->glines[l].line[C].name;
+            const uint16_t pos = s->glines[l].line[C].pos;
             int y = offset_y + (s->mirror ? s->size - 1 - pos: pos) - 10;
 
             if (y < 0)
                 y = 4;
 
-            draw_htext16(out, 2 + offset_x, y, mult, o1, o2, name, s->grat_yuva_color);
+            s->draw_text(out, 2 + offset_x, y, mult, o1, o2, name, s->grat_yuva_color);
         }
 
         offset_y += s->size * (s->display == STACK);
@@ -2786,6 +3057,7 @@
 
     switch (s->filter) {
     case XFLAT:
+    case YFLAT:
     case AFLAT: s->size = 256 * 2; break;
     case FLAT:  s->size = 256 * 3; break;
     default:    s->size = 256;     break;
@@ -2849,12 +3121,35 @@
     case 0x1016: s->waveform_slice = xflat16_row_mirror;    break;
     case 0x0116: s->waveform_slice = xflat16_column;        break;
     case 0x0016: s->waveform_slice = xflat16_row;           break;
+    case 0x1107: s->waveform_slice = yflat_column_mirror; break;
+    case 0x1007: s->waveform_slice = yflat_row_mirror;    break;
+    case 0x0107: s->waveform_slice = yflat_column;        break;
+    case 0x0007: s->waveform_slice = yflat_row;           break;
+    case 0x1117: s->waveform_slice = yflat16_column_mirror; break;
+    case 0x1017: s->waveform_slice = yflat16_row_mirror;    break;
+    case 0x0117: s->waveform_slice = yflat16_column;        break;
+    case 0x0017: s->waveform_slice = yflat16_row;           break;
     }
 
     s->grat_yuva_color[0] = 255;
-    s->grat_yuva_color[2] = s->graticule == 2 ? 255 : 0;
+    s->grat_yuva_color[1] = s->graticule == GRAT_INVERT ? 255 : 0;
+    s->grat_yuva_color[2] = s->graticule == GRAT_ORANGE || s->graticule == GRAT_INVERT ? 255 : 0;
     s->grat_yuva_color[3] = 255;
 
+    if (s->mode == 0 && s->graticule != GRAT_INVERT) {
+        s->blend_line = s->bits <= 8 ? blend_vline : blend_vline16;
+        s->draw_text  = s->bits <= 8 ? draw_vtext  : draw_vtext16;
+    } else if (s->graticule != GRAT_INVERT) {
+        s->blend_line = s->bits <= 8 ? blend_hline : blend_hline16;
+        s->draw_text  = s->bits <= 8 ? draw_htext  : draw_htext16;
+    } else if (s->mode == 0 && s->graticule == GRAT_INVERT) {
+        s->blend_line = s->bits <= 8 ? iblend_vline : iblend_vline16;
+        s->draw_text  = s->bits <= 8 ? idraw_vtext  : idraw_vtext16;
+    } else if (s->graticule == GRAT_INVERT) {
+        s->blend_line = s->bits <= 8 ? iblend_hline : iblend_hline16;
+        s->draw_text  = s->bits <= 8 ? idraw_htext  : idraw_htext16;
+    }
+
     switch (s->filter) {
     case LOWPASS:
     case COLOR:
@@ -2862,10 +3157,11 @@
     case CHROMA:
     case AFLAT:
     case XFLAT:
+    case YFLAT:
     case FLAT:
-        if (s->graticule && s->mode == 1)
+        if (s->graticule > GRAT_NONE && s->mode == 1)
             s->graticulef = s->bits > 8 ? graticule16_column : graticule_column;
-        else if (s->graticule && s->mode == 0)
+        else if (s->graticule > GRAT_NONE && s->mode == 0)
             s->graticulef = s->bits > 8 ? graticule16_row : graticule_row;
         break;
     }
@@ -2930,6 +3226,7 @@
         }
         break;
     case XFLAT:
+    case YFLAT:
     case AFLAT:
         switch (s->scale) {
         case DIGITAL:
@@ -2990,14 +3287,17 @@
 
     s->size = s->size << (s->bits - 8);
 
+    s->tint[0] = .5f * (s->ftint[0] + 1.f) * (s->size - 1);
+    s->tint[1] = .5f * (s->ftint[1] + 1.f) * (s->size - 1);
+
     switch (inlink->format) {
     case AV_PIX_FMT_GBRAP:
     case AV_PIX_FMT_GBRP:
     case AV_PIX_FMT_GBRP9:
     case AV_PIX_FMT_GBRP10:
     case AV_PIX_FMT_GBRP12:
+        s->rgb = 1;
         memcpy(s->bg_color, black_gbrp_color, sizeof(s->bg_color));
-        s->graticulef = graticule_none;
         break;
     default:
         memcpy(s->bg_color, black_yuva_color, sizeof(s->bg_color));
@@ -3020,6 +3320,9 @@
             comp++;
     }
     s->acomp = comp;
+    if (s->acomp == 0)
+        return AVERROR(EINVAL);
+
     s->odesc = av_pix_fmt_desc_get(outlink->format);
     s->dcomp = s->odesc->nb_components;
 
@@ -3123,10 +3426,15 @@
             td.offset_x = offset_x;
             ctx->internal->execute(ctx, s->waveform_slice, &td, NULL, ff_filter_get_nb_threads(ctx));
             switch (s->filter) {
+            case LOWPASS:
+                if (s->bits <= 8)
+                    envelope(s, out, plane, s->rgb || s->display == OVERLAY ? plane : 0, s->mode ? offset_x : offset_y);
+                else
+                    envelope16(s, out, plane, s->rgb || s->display == OVERLAY ? plane : 0, s->mode ? offset_x : offset_y);
+                break;
             case ACOLOR:
             case CHROMA:
             case COLOR:
-            case LOWPASS:
                 if (s->bits <= 8)
                     envelope(s, out, plane, plane, s->mode ? offset_x : offset_y);
                 else
@@ -3143,6 +3451,7 @@
                 break;
             case AFLAT:
             case XFLAT:
+            case YFLAT:
                 if (s->bits <= 8) {
                     envelope(s, out, plane, (plane + 0) % s->ncomp, s->mode ? offset_x : offset_y);
                     envelope(s, out, plane, (plane + 1) % s->ncomp, s->mode ? offset_x : offset_y);
diff --git a/libavfilter/vf_weave.c b/libavfilter/vf_weave.c
index 663d79f..8951b09 100644
--- a/libavfilter/vf_weave.c
+++ b/libavfilter/vf_weave.c
@@ -49,6 +49,26 @@
 
 AVFILTER_DEFINE_CLASS(weave);
 
+static int query_formats(AVFilterContext *ctx)
+{
+    AVFilterFormats *formats = NULL;
+    int ret;
+
+    for (int fmt = 0; av_pix_fmt_desc_get(fmt); fmt++) {
+        const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(fmt);
+
+        if (!(desc->flags & AV_PIX_FMT_FLAG_PAL) &&
+            !(desc->flags & AV_PIX_FMT_FLAG_HWACCEL)) {
+            if ((ret = ff_add_format(&formats, fmt)) < 0) {
+                ff_formats_unref(&formats);
+                return ret;
+            }
+        }
+    }
+
+    return ff_set_common_formats(ctx, formats);
+}
+
 static int config_props_output(AVFilterLink *outlink)
 {
     AVFilterContext *ctx = outlink->src;
@@ -156,6 +176,7 @@
     .description   = NULL_IF_CONFIG_SMALL("Weave input video fields into frames."),
     .priv_size     = sizeof(WeaveContext),
     .priv_class    = &weave_class,
+    .query_formats = query_formats,
     .uninit        = uninit,
     .inputs        = weave_inputs,
     .outputs       = weave_outputs,
@@ -179,6 +200,7 @@
     .description   = NULL_IF_CONFIG_SMALL("Weave input video fields into double number of frames."),
     .priv_size     = sizeof(WeaveContext),
     .priv_class    = &doubleweave_class,
+    .query_formats = query_formats,
     .init          = init,
     .uninit        = uninit,
     .inputs        = weave_inputs,
diff --git a/libavfilter/vf_xbr.c b/libavfilter/vf_xbr.c
index 2c71871..a381be4 100644
--- a/libavfilter/vf_xbr.c
+++ b/libavfilter/vf_xbr.c
@@ -380,7 +380,7 @@
     return ff_filter_frame(outlink, out);
 }
 
-static int init(AVFilterContext *ctx)
+static av_cold int init(AVFilterContext *ctx)
 {
     XBRContext *s = ctx->priv;
     static const xbrfunc_t xbrfuncs[] = {xbr2x, xbr3x, xbr4x};
@@ -395,7 +395,7 @@
             int startg = FFMAX3(-bg, -rg, 0);
             int endg = FFMIN3(255-bg, 255-rg, 255);
             uint32_t y = (uint32_t)(( 299*rg + 1000*startg + 114*bg)/1000);
-            c = bg + (rg<<16) + 0x010101 * startg;
+            c = bg + rg * (1 << 16) + 0x010101 * startg;
             for (g = startg; g <= endg; g++) {
                 s->rgbtoyuv[c] = ((y++) << 16) + (u << 8) + v;
                 c+= 0x010101;
diff --git a/libavfilter/vf_xfade.c b/libavfilter/vf_xfade.c
new file mode 100644
index 0000000..1b5ebef
--- /dev/null
+++ b/libavfilter/vf_xfade.c
@@ -0,0 +1,1606 @@
+/*
+ * Copyright (c) 2020 Paul B Mahol
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "libavutil/imgutils.h"
+#include "libavutil/eval.h"
+#include "libavutil/opt.h"
+#include "libavutil/pixfmt.h"
+#include "avfilter.h"
+#include "formats.h"
+#include "internal.h"
+#include "filters.h"
+#include "video.h"
+
+enum XFadeTransitions {
+    CUSTOM = -1,
+    FADE,
+    WIPELEFT,
+    WIPERIGHT,
+    WIPEUP,
+    WIPEDOWN,
+    SLIDELEFT,
+    SLIDERIGHT,
+    SLIDEUP,
+    SLIDEDOWN,
+    CIRCLECROP,
+    RECTCROP,
+    DISTANCE,
+    FADEBLACK,
+    FADEWHITE,
+    RADIAL,
+    SMOOTHLEFT,
+    SMOOTHRIGHT,
+    SMOOTHUP,
+    SMOOTHDOWN,
+    CIRCLEOPEN,
+    CIRCLECLOSE,
+    VERTOPEN,
+    VERTCLOSE,
+    HORZOPEN,
+    HORZCLOSE,
+    DISSOLVE,
+    PIXELIZE,
+    DIAGTL,
+    DIAGTR,
+    DIAGBL,
+    DIAGBR,
+    HLSLICE,
+    HRSLICE,
+    VUSLICE,
+    VDSLICE,
+    NB_TRANSITIONS,
+};
+
+typedef struct XFadeContext {
+    const AVClass *class;
+
+    int     transition;
+    int64_t duration;
+    int64_t offset;
+    char   *custom_str;
+
+    int nb_planes;
+    int depth;
+
+    int64_t duration_pts;
+    int64_t offset_pts;
+    int64_t first_pts;
+    int64_t last_pts;
+    int64_t pts;
+    int xfade_is_over;
+    int need_second;
+    int eof[2];
+    AVFrame *xf[2];
+    int max_value;
+    uint16_t black[4];
+    uint16_t white[4];
+
+    void (*transitionf)(AVFilterContext *ctx, const AVFrame *a, const AVFrame *b, AVFrame *out, float progress,
+                        int slice_start, int slice_end, int jobnr);
+
+    AVExpr *e;
+} XFadeContext;
+
+static const char *const var_names[] = {   "X",   "Y",   "W",   "H",   "A",   "B",   "PLANE",          "P",        NULL };
+enum                                   { VAR_X, VAR_Y, VAR_W, VAR_H, VAR_A, VAR_B, VAR_PLANE, VAR_PROGRESS, VAR_VARS_NB };
+
+typedef struct ThreadData {
+    const AVFrame *xf[2];
+    AVFrame *out;
+    float progress;
+} ThreadData;
+
+static int query_formats(AVFilterContext *ctx)
+{
+    static const enum AVPixelFormat pix_fmts[] = {
+        AV_PIX_FMT_YUVA444P,
+        AV_PIX_FMT_YUVJ444P,
+        AV_PIX_FMT_YUV444P,
+        AV_PIX_FMT_GBRP, AV_PIX_FMT_GBRAP, AV_PIX_FMT_GRAY8,
+        AV_PIX_FMT_YUVA444P9, AV_PIX_FMT_GBRP9,
+        AV_PIX_FMT_YUV444P10,
+        AV_PIX_FMT_YUVA444P10,
+        AV_PIX_FMT_GBRP10, AV_PIX_FMT_GBRAP10, AV_PIX_FMT_GRAY10,
+        AV_PIX_FMT_YUV444P12,
+        AV_PIX_FMT_YUVA444P12,
+        AV_PIX_FMT_GBRP12, AV_PIX_FMT_GBRAP12, AV_PIX_FMT_GRAY12,
+        AV_PIX_FMT_YUV444P14, AV_PIX_FMT_GBRP14,
+        AV_PIX_FMT_YUV444P16,
+        AV_PIX_FMT_YUVA444P16,
+        AV_PIX_FMT_GBRP16, AV_PIX_FMT_GBRAP16, AV_PIX_FMT_GRAY16,
+        AV_PIX_FMT_NONE
+    };
+
+    AVFilterFormats *fmts_list = ff_make_format_list(pix_fmts);
+    if (!fmts_list)
+        return AVERROR(ENOMEM);
+    return ff_set_common_formats(ctx, fmts_list);
+}
+
+static av_cold void uninit(AVFilterContext *ctx)
+{
+    XFadeContext *s = ctx->priv;
+
+    av_expr_free(s->e);
+}
+
+#define OFFSET(x) offsetof(XFadeContext, x)
+#define FLAGS (AV_OPT_FLAG_FILTERING_PARAM | AV_OPT_FLAG_VIDEO_PARAM)
+
+static const AVOption xfade_options[] = {
+    { "transition", "set cross fade transition", OFFSET(transition), AV_OPT_TYPE_INT, {.i64=FADE}, -1, NB_TRANSITIONS-1, FLAGS, "transition" },
+    {   "custom",    "custom transition",     0, AV_OPT_TYPE_CONST, {.i64=CUSTOM},    0, 0, FLAGS, "transition" },
+    {   "fade",      "fade transition",       0, AV_OPT_TYPE_CONST, {.i64=FADE},      0, 0, FLAGS, "transition" },
+    {   "wipeleft",  "wipe left transition",  0, AV_OPT_TYPE_CONST, {.i64=WIPELEFT},  0, 0, FLAGS, "transition" },
+    {   "wiperight", "wipe right transition", 0, AV_OPT_TYPE_CONST, {.i64=WIPERIGHT}, 0, 0, FLAGS, "transition" },
+    {   "wipeup",    "wipe up transition",    0, AV_OPT_TYPE_CONST, {.i64=WIPEUP},    0, 0, FLAGS, "transition" },
+    {   "wipedown",  "wipe down transition",  0, AV_OPT_TYPE_CONST, {.i64=WIPEDOWN},  0, 0, FLAGS, "transition" },
+    {   "slideleft",  "slide left transition",  0, AV_OPT_TYPE_CONST, {.i64=SLIDELEFT},  0, 0, FLAGS, "transition" },
+    {   "slideright", "slide right transition", 0, AV_OPT_TYPE_CONST, {.i64=SLIDERIGHT}, 0, 0, FLAGS, "transition" },
+    {   "slideup",    "slide up transition",    0, AV_OPT_TYPE_CONST, {.i64=SLIDEUP},    0, 0, FLAGS, "transition" },
+    {   "slidedown",  "slide down transition",  0, AV_OPT_TYPE_CONST, {.i64=SLIDEDOWN},  0, 0, FLAGS, "transition" },
+    {   "circlecrop", "circle crop transition", 0, AV_OPT_TYPE_CONST, {.i64=CIRCLECROP}, 0, 0, FLAGS, "transition" },
+    {   "rectcrop",   "rect crop transition",   0, AV_OPT_TYPE_CONST, {.i64=RECTCROP},   0, 0, FLAGS, "transition" },
+    {   "distance",   "distance transition",    0, AV_OPT_TYPE_CONST, {.i64=DISTANCE},   0, 0, FLAGS, "transition" },
+    {   "fadeblack",  "fadeblack transition",   0, AV_OPT_TYPE_CONST, {.i64=FADEBLACK},  0, 0, FLAGS, "transition" },
+    {   "fadewhite",  "fadewhite transition",   0, AV_OPT_TYPE_CONST, {.i64=FADEWHITE},  0, 0, FLAGS, "transition" },
+    {   "radial",     "radial transition",      0, AV_OPT_TYPE_CONST, {.i64=RADIAL},     0, 0, FLAGS, "transition" },
+    {   "smoothleft", "smoothleft transition",  0, AV_OPT_TYPE_CONST, {.i64=SMOOTHLEFT}, 0, 0, FLAGS, "transition" },
+    {   "smoothright","smoothright transition", 0, AV_OPT_TYPE_CONST, {.i64=SMOOTHRIGHT},0, 0, FLAGS, "transition" },
+    {   "smoothup",   "smoothup transition",    0, AV_OPT_TYPE_CONST, {.i64=SMOOTHUP},   0, 0, FLAGS, "transition" },
+    {   "smoothdown", "smoothdown transition",  0, AV_OPT_TYPE_CONST, {.i64=SMOOTHDOWN}, 0, 0, FLAGS, "transition" },
+    {   "circleopen", "circleopen transition",  0, AV_OPT_TYPE_CONST, {.i64=CIRCLEOPEN}, 0, 0, FLAGS, "transition" },
+    {   "circleclose","circleclose transition", 0, AV_OPT_TYPE_CONST, {.i64=CIRCLECLOSE},0, 0, FLAGS, "transition" },
+    {   "vertopen",   "vert open transition",   0, AV_OPT_TYPE_CONST, {.i64=VERTOPEN},   0, 0, FLAGS, "transition" },
+    {   "vertclose",  "vert close transition",  0, AV_OPT_TYPE_CONST, {.i64=VERTCLOSE},  0, 0, FLAGS, "transition" },
+    {   "horzopen",   "horz open transition",   0, AV_OPT_TYPE_CONST, {.i64=HORZOPEN},   0, 0, FLAGS, "transition" },
+    {   "horzclose",  "horz close transition",  0, AV_OPT_TYPE_CONST, {.i64=HORZCLOSE},  0, 0, FLAGS, "transition" },
+    {   "dissolve",   "dissolve transition",    0, AV_OPT_TYPE_CONST, {.i64=DISSOLVE},   0, 0, FLAGS, "transition" },
+    {   "pixelize",   "pixelize transition",    0, AV_OPT_TYPE_CONST, {.i64=PIXELIZE},   0, 0, FLAGS, "transition" },
+    {   "diagtl",     "diag tl transition",     0, AV_OPT_TYPE_CONST, {.i64=DIAGTL},     0, 0, FLAGS, "transition" },
+    {   "diagtr",     "diag tr transition",     0, AV_OPT_TYPE_CONST, {.i64=DIAGTR},     0, 0, FLAGS, "transition" },
+    {   "diagbl",     "diag bl transition",     0, AV_OPT_TYPE_CONST, {.i64=DIAGBL},     0, 0, FLAGS, "transition" },
+    {   "diagbr",     "diag br transition",     0, AV_OPT_TYPE_CONST, {.i64=DIAGBR},     0, 0, FLAGS, "transition" },
+    {   "hlslice",    "hl slice transition",    0, AV_OPT_TYPE_CONST, {.i64=HLSLICE},    0, 0, FLAGS, "transition" },
+    {   "hrslice",    "hr slice transition",    0, AV_OPT_TYPE_CONST, {.i64=HRSLICE},    0, 0, FLAGS, "transition" },
+    {   "vuslice",    "vu slice transition",    0, AV_OPT_TYPE_CONST, {.i64=VUSLICE},    0, 0, FLAGS, "transition" },
+    {   "vdslice",    "vd slice transition",    0, AV_OPT_TYPE_CONST, {.i64=VDSLICE},    0, 0, FLAGS, "transition" },
+    { "duration", "set cross fade duration", OFFSET(duration), AV_OPT_TYPE_DURATION, {.i64=1000000}, 0, 60000000, FLAGS },
+    { "offset",   "set cross fade start relative to first input stream", OFFSET(offset), AV_OPT_TYPE_DURATION, {.i64=0}, INT64_MIN, INT64_MAX, FLAGS },
+    { "expr",   "set expression for custom transition", OFFSET(custom_str), AV_OPT_TYPE_STRING, {.str=NULL}, 0, 0, FLAGS },
+    { NULL }
+};
+
+AVFILTER_DEFINE_CLASS(xfade);
+
+#define CUSTOM_TRANSITION(name, type, div)                                           \
+static void custom##name##_transition(AVFilterContext *ctx,                          \
+                            const AVFrame *a, const AVFrame *b, AVFrame *out,        \
+                            float progress,                                          \
+                            int slice_start, int slice_end, int jobnr)               \
+{                                                                                    \
+    XFadeContext *s = ctx->priv;                                                     \
+    const int height = slice_end - slice_start;                                      \
+                                                                                     \
+    double values[VAR_VARS_NB];                                                      \
+    values[VAR_W] = out->width;                                                      \
+    values[VAR_H] = out->height;                                                     \
+    values[VAR_PROGRESS] = progress;                                                 \
+                                                                                     \
+    for (int p = 0; p < s->nb_planes; p++) {                                         \
+        const type *xf0 = (const type *)(a->data[p] + slice_start * a->linesize[p]); \
+        const type *xf1 = (const type *)(b->data[p] + slice_start * b->linesize[p]); \
+        type *dst = (type *)(out->data[p] + slice_start * out->linesize[p]);         \
+                                                                                     \
+        values[VAR_PLANE] = p;                                                       \
+                                                                                     \
+        for (int y = 0; y < height; y++) {                                           \
+            values[VAR_Y] = slice_start + y;                                         \
+            for (int x = 0; x < out->width; x++) {                                   \
+                values[VAR_X] = x;                                                   \
+                values[VAR_A] = xf0[x];                                              \
+                values[VAR_B] = xf1[x];                                              \
+                dst[x] = av_expr_eval(s->e, values, s);                              \
+            }                                                                        \
+                                                                                     \
+            dst += out->linesize[p] / div;                                           \
+            xf0 += a->linesize[p] / div;                                             \
+            xf1 += b->linesize[p] / div;                                             \
+        }                                                                            \
+    }                                                                                \
+}
+
+CUSTOM_TRANSITION(8, uint8_t, 1)
+CUSTOM_TRANSITION(16, uint16_t, 2)
+
+static inline float mix(float a, float b, float mix)
+{
+    return a * mix + b * (1.f - mix);
+}
+
+static inline float fract(float a)
+{
+    return a - floorf(a);
+}
+
+static inline float smoothstep(float edge0, float edge1, float x)
+{
+    float t;
+
+    t = av_clipf((x - edge0) / (edge1 - edge0), 0.f, 1.f);
+
+    return t * t * (3.f - 2.f * t);
+}
+
+#define FADE_TRANSITION(name, type, div)                                             \
+static void fade##name##_transition(AVFilterContext *ctx,                            \
+                            const AVFrame *a, const AVFrame *b, AVFrame *out,        \
+                            float progress,                                          \
+                            int slice_start, int slice_end, int jobnr)               \
+{                                                                                    \
+    XFadeContext *s = ctx->priv;                                                     \
+    const int height = slice_end - slice_start;                                      \
+                                                                                     \
+    for (int p = 0; p < s->nb_planes; p++) {                                         \
+        const type *xf0 = (const type *)(a->data[p] + slice_start * a->linesize[p]); \
+        const type *xf1 = (const type *)(b->data[p] + slice_start * b->linesize[p]); \
+        type *dst = (type *)(out->data[p] + slice_start * out->linesize[p]);         \
+                                                                                     \
+        for (int y = 0; y < height; y++) {                                           \
+            for (int x = 0; x < out->width; x++) {                                   \
+                dst[x] = mix(xf0[x], xf1[x], progress);                              \
+            }                                                                        \
+                                                                                     \
+            dst += out->linesize[p] / div;                                           \
+            xf0 += a->linesize[p] / div;                                             \
+            xf1 += b->linesize[p] / div;                                             \
+        }                                                                            \
+    }                                                                                \
+}
+
+FADE_TRANSITION(8, uint8_t, 1)
+FADE_TRANSITION(16, uint16_t, 2)
+
+#define WIPELEFT_TRANSITION(name, type, div)                                         \
+static void wipeleft##name##_transition(AVFilterContext *ctx,                        \
+                                const AVFrame *a, const AVFrame *b, AVFrame *out,    \
+                                float progress,                                      \
+                                int slice_start, int slice_end, int jobnr)           \
+{                                                                                    \
+    XFadeContext *s = ctx->priv;                                                     \
+    const int height = slice_end - slice_start;                                      \
+    const int z = out->width * progress;                                             \
+                                                                                     \
+    for (int p = 0; p < s->nb_planes; p++) {                                         \
+        const type *xf0 = (const type *)(a->data[p] + slice_start * a->linesize[p]); \
+        const type *xf1 = (const type *)(b->data[p] + slice_start * b->linesize[p]); \
+        type *dst = (type *)(out->data[p] + slice_start * out->linesize[p]);         \
+                                                                                     \
+        for (int y = 0; y < height; y++) {                                           \
+            for (int x = 0; x < out->width; x++) {                                   \
+                dst[x] = x > z ? xf1[x] : xf0[x];                                    \
+            }                                                                        \
+                                                                                     \
+            dst += out->linesize[p] / div;                                           \
+            xf0 += a->linesize[p] / div;                                             \
+            xf1 += b->linesize[p] / div;                                             \
+        }                                                                            \
+    }                                                                                \
+}
+
+WIPELEFT_TRANSITION(8, uint8_t, 1)
+WIPELEFT_TRANSITION(16, uint16_t, 2)
+
+#define WIPERIGHT_TRANSITION(name, type, div)                                        \
+static void wiperight##name##_transition(AVFilterContext *ctx,                       \
+                                 const AVFrame *a, const AVFrame *b, AVFrame *out,   \
+                                 float progress,                                     \
+                                 int slice_start, int slice_end, int jobnr)          \
+{                                                                                    \
+    XFadeContext *s = ctx->priv;                                                     \
+    const int height = slice_end - slice_start;                                      \
+    const int z = out->width * (1.f - progress);                                     \
+                                                                                     \
+    for (int p = 0; p < s->nb_planes; p++) {                                         \
+        const type *xf0 = (const type *)(a->data[p] + slice_start * a->linesize[p]); \
+        const type *xf1 = (const type *)(b->data[p] + slice_start * b->linesize[p]); \
+        type *dst = (type *)(out->data[p] + slice_start * out->linesize[p]);         \
+                                                                                     \
+        for (int y = 0; y < height; y++) {                                           \
+            for (int x = 0; x < out->width; x++) {                                   \
+                dst[x] = x > z ? xf0[x] : xf1[x];                                    \
+            }                                                                        \
+                                                                                     \
+            dst += out->linesize[p] / div;                                           \
+            xf0 += a->linesize[p] / div;                                             \
+            xf1 += b->linesize[p] / div;                                             \
+        }                                                                            \
+    }                                                                                \
+}
+
+WIPERIGHT_TRANSITION(8, uint8_t, 1)
+WIPERIGHT_TRANSITION(16, uint16_t, 2)
+
+#define WIPEUP_TRANSITION(name, type, div)                                           \
+static void wipeup##name##_transition(AVFilterContext *ctx,                          \
+                              const AVFrame *a, const AVFrame *b, AVFrame *out,      \
+                              float progress,                                        \
+                              int slice_start, int slice_end, int jobnr)             \
+{                                                                                    \
+    XFadeContext *s = ctx->priv;                                                     \
+    const int height = slice_end - slice_start;                                      \
+    const int z = out->height * progress;                                            \
+                                                                                     \
+    for (int p = 0; p < s->nb_planes; p++) {                                         \
+        const type *xf0 = (const type *)(a->data[p] + slice_start * a->linesize[p]); \
+        const type *xf1 = (const type *)(b->data[p] + slice_start * b->linesize[p]); \
+        type *dst = (type *)(out->data[p] + slice_start * out->linesize[p]);         \
+                                                                                     \
+        for (int y = 0; y < height; y++) {                                           \
+            for (int x = 0; x < out->width; x++) {                                   \
+                dst[x] = slice_start + y > z ? xf1[x] : xf0[x];                      \
+            }                                                                        \
+                                                                                     \
+            dst += out->linesize[p] / div;                                           \
+            xf0 += a->linesize[p] / div;                                             \
+            xf1 += b->linesize[p] / div;                                             \
+        }                                                                            \
+    }                                                                                \
+}
+
+WIPEUP_TRANSITION(8, uint8_t, 1)
+WIPEUP_TRANSITION(16, uint16_t, 2)
+
+#define WIPEDOWN_TRANSITION(name, type, div)                                         \
+static void wipedown##name##_transition(AVFilterContext *ctx,                        \
+                                const AVFrame *a, const AVFrame *b, AVFrame *out,    \
+                                float progress,                                      \
+                                int slice_start, int slice_end, int jobnr)           \
+{                                                                                    \
+    XFadeContext *s = ctx->priv;                                                     \
+    const int height = slice_end - slice_start;                                      \
+    const int z = out->height * (1.f - progress);                                    \
+                                                                                     \
+    for (int p = 0; p < s->nb_planes; p++) {                                         \
+        const type *xf0 = (const type *)(a->data[p] + slice_start * a->linesize[p]); \
+        const type *xf1 = (const type *)(b->data[p] + slice_start * b->linesize[p]); \
+        type *dst = (type *)(out->data[p] + slice_start * out->linesize[p]);         \
+                                                                                     \
+        for (int y = 0; y < height; y++) {                                           \
+            for (int x = 0; x < out->width; x++) {                                   \
+                dst[x] = slice_start + y > z ? xf0[x] : xf1[x];                      \
+            }                                                                        \
+                                                                                     \
+            dst += out->linesize[p] / div;                                           \
+            xf0 += a->linesize[p] / div;                                             \
+            xf1 += b->linesize[p] / div;                                             \
+        }                                                                            \
+    }                                                                                \
+}
+
+WIPEDOWN_TRANSITION(8, uint8_t, 1)
+WIPEDOWN_TRANSITION(16, uint16_t, 2)
+
+#define SLIDELEFT_TRANSITION(name, type, div)                                        \
+static void slideleft##name##_transition(AVFilterContext *ctx,                       \
+                                 const AVFrame *a, const AVFrame *b, AVFrame *out,   \
+                                 float progress,                                     \
+                                 int slice_start, int slice_end, int jobnr)          \
+{                                                                                    \
+    XFadeContext *s = ctx->priv;                                                     \
+    const int height = slice_end - slice_start;                                      \
+    const int width = out->width;                                                    \
+    const int z = -progress * width;                                                 \
+                                                                                     \
+    for (int p = 0; p < s->nb_planes; p++) {                                         \
+        const type *xf0 = (const type *)(a->data[p] + slice_start * a->linesize[p]); \
+        const type *xf1 = (const type *)(b->data[p] + slice_start * b->linesize[p]); \
+        type *dst = (type *)(out->data[p] + slice_start * out->linesize[p]);         \
+                                                                                     \
+        for (int y = 0; y < height; y++) {                                           \
+            for (int x = 0; x < width; x++) {                                        \
+                const int zx = z + x;                                                \
+                const int zz = zx % width + width * (zx < 0);                        \
+                dst[x] = (zx > 0) && (zx < width) ? xf1[zz] : xf0[zz];               \
+            }                                                                        \
+                                                                                     \
+            dst += out->linesize[p] / div;                                           \
+            xf0 += a->linesize[p] / div;                                             \
+            xf1 += b->linesize[p] / div;                                             \
+        }                                                                            \
+    }                                                                                \
+}
+
+SLIDELEFT_TRANSITION(8, uint8_t, 1)
+SLIDELEFT_TRANSITION(16, uint16_t, 2)
+
+#define SLIDERIGHT_TRANSITION(name, type, div)                                       \
+static void slideright##name##_transition(AVFilterContext *ctx,                      \
+                                  const AVFrame *a, const AVFrame *b, AVFrame *out,  \
+                                  float progress,                                    \
+                                  int slice_start, int slice_end, int jobnr)         \
+{                                                                                    \
+    XFadeContext *s = ctx->priv;                                                     \
+    const int height = slice_end - slice_start;                                      \
+    const int width = out->width;                                                    \
+    const int z = progress * width;                                                  \
+                                                                                     \
+    for (int p = 0; p < s->nb_planes; p++) {                                         \
+        const type *xf0 = (const type *)(a->data[p] + slice_start * a->linesize[p]); \
+        const type *xf1 = (const type *)(b->data[p] + slice_start * b->linesize[p]); \
+        type *dst = (type *)(out->data[p] + slice_start * out->linesize[p]);         \
+                                                                                     \
+        for (int y = 0; y < height; y++) {                                           \
+            for (int x = 0; x < out->width; x++) {                                   \
+                const int zx = z + x;                                                \
+                const int zz = zx % width + width * (zx < 0);                        \
+                dst[x] = (zx > 0) && (zx < width) ? xf1[zz] : xf0[zz];               \
+            }                                                                        \
+                                                                                     \
+            dst += out->linesize[p] / div;                                           \
+            xf0 += a->linesize[p] / div;                                             \
+            xf1 += b->linesize[p] / div;                                             \
+        }                                                                            \
+    }                                                                                \
+}
+
+SLIDERIGHT_TRANSITION(8, uint8_t, 1)
+SLIDERIGHT_TRANSITION(16, uint16_t, 2)
+
+#define SLIDEUP_TRANSITION(name, type, div)                                         \
+static void slideup##name##_transition(AVFilterContext *ctx,                        \
+                               const AVFrame *a, const AVFrame *b, AVFrame *out,    \
+                               float progress,                                      \
+                               int slice_start, int slice_end, int jobnr)           \
+{                                                                                   \
+    XFadeContext *s = ctx->priv;                                                    \
+    const int height = out->height;                                                 \
+    const int z = -progress * height;                                               \
+                                                                                    \
+    for (int p = 0; p < s->nb_planes; p++) {                                        \
+        type *dst = (type *)(out->data[p] + slice_start * out->linesize[p]);        \
+                                                                                    \
+        for (int y = slice_start; y < slice_end; y++) {                             \
+            const int zy = z + y;                                                   \
+            const int zz = zy % height + height * (zy < 0);                         \
+            const type *xf0 = (const type *)(a->data[p] + zz * a->linesize[p]);     \
+            const type *xf1 = (const type *)(b->data[p] + zz * b->linesize[p]);     \
+                                                                                    \
+            for (int x = 0; x < out->width; x++) {                                  \
+                dst[x] = (zy > 0) && (zy < height) ? xf1[x] : xf0[x];               \
+            }                                                                       \
+                                                                                    \
+            dst += out->linesize[p] / div;                                          \
+        }                                                                           \
+    }                                                                               \
+}
+
+SLIDEUP_TRANSITION(8, uint8_t, 1)
+SLIDEUP_TRANSITION(16, uint16_t, 2)
+
+#define SLIDEDOWN_TRANSITION(name, type, div)                                       \
+static void slidedown##name##_transition(AVFilterContext *ctx,                      \
+                                 const AVFrame *a, const AVFrame *b, AVFrame *out,  \
+                                 float progress,                                    \
+                                 int slice_start, int slice_end, int jobnr)         \
+{                                                                                   \
+    XFadeContext *s = ctx->priv;                                                    \
+    const int height = out->height;                                                 \
+    const int z = progress * height;                                                \
+                                                                                    \
+    for (int p = 0; p < s->nb_planes; p++) {                                        \
+        type *dst = (type *)(out->data[p] + slice_start * out->linesize[p]);        \
+                                                                                    \
+        for (int y = slice_start; y < slice_end; y++) {                             \
+            const int zy = z + y;                                                   \
+            const int zz = zy % height + height * (zy < 0);                         \
+            const type *xf0 = (const type *)(a->data[p] + zz * a->linesize[p]);     \
+            const type *xf1 = (const type *)(b->data[p] + zz * b->linesize[p]);     \
+                                                                                    \
+            for (int x = 0; x < out->width; x++) {                                  \
+                dst[x] = (zy > 0) && (zy < height) ? xf1[x] : xf0[x];               \
+            }                                                                       \
+                                                                                    \
+            dst += out->linesize[p] / div;                                          \
+        }                                                                           \
+    }                                                                               \
+}
+
+SLIDEDOWN_TRANSITION(8, uint8_t, 1)
+SLIDEDOWN_TRANSITION(16, uint16_t, 2)
+
+#define CIRCLECROP_TRANSITION(name, type, div)                                      \
+static void circlecrop##name##_transition(AVFilterContext *ctx,                     \
+                                 const AVFrame *a, const AVFrame *b, AVFrame *out,  \
+                                 float progress,                                    \
+                                 int slice_start, int slice_end, int jobnr)         \
+{                                                                                   \
+    XFadeContext *s = ctx->priv;                                                    \
+    const int width = out->width;                                                   \
+    const int height = out->height;                                                 \
+    float z = powf(2.f * fabsf(progress - 0.5f), 3.f) * hypotf(width/2, height/2);  \
+                                                                                    \
+    for (int p = 0; p < s->nb_planes; p++) {                                        \
+        const int bg = s->black[p];                                                 \
+        type *dst = (type *)(out->data[p] + slice_start * out->linesize[p]);        \
+                                                                                    \
+        for (int y = slice_start; y < slice_end; y++) {                             \
+            const type *xf0 = (const type *)(a->data[p] + y * a->linesize[p]);      \
+            const type *xf1 = (const type *)(b->data[p] + y * b->linesize[p]);      \
+                                                                                    \
+            for (int x = 0; x < width; x++) {                                       \
+                float dist = hypotf(x - width / 2, y - height / 2);                 \
+                int val = progress < 0.5f ? xf1[x] : xf0[x];                        \
+                dst[x] = (z < dist) ? bg : val;                                     \
+            }                                                                       \
+                                                                                    \
+            dst += out->linesize[p] / div;                                          \
+        }                                                                           \
+    }                                                                               \
+}
+
+CIRCLECROP_TRANSITION(8, uint8_t, 1)
+CIRCLECROP_TRANSITION(16, uint16_t, 2)
+
+#define RECTCROP_TRANSITION(name, type, div)                                        \
+static void rectcrop##name##_transition(AVFilterContext *ctx,                       \
+                                 const AVFrame *a, const AVFrame *b, AVFrame *out,  \
+                                 float progress,                                    \
+                                 int slice_start, int slice_end, int jobnr)         \
+{                                                                                   \
+    XFadeContext *s = ctx->priv;                                                    \
+    const int width = out->width;                                                   \
+    const int height = out->height;                                                 \
+    int zh = fabsf(progress - 0.5f) * height;                                       \
+    int zw = fabsf(progress - 0.5f) * width;                                        \
+                                                                                    \
+    for (int p = 0; p < s->nb_planes; p++) {                                        \
+        const int bg = s->black[p];                                                 \
+        type *dst = (type *)(out->data[p] + slice_start * out->linesize[p]);        \
+                                                                                    \
+        for (int y = slice_start; y < slice_end; y++) {                             \
+            const type *xf0 = (const type *)(a->data[p] + y * a->linesize[p]);      \
+            const type *xf1 = (const type *)(b->data[p] + y * b->linesize[p]);      \
+                                                                                    \
+            for (int x = 0; x < width; x++) {                                       \
+                int dist = FFABS(x - width  / 2) < zw &&                            \
+                           FFABS(y - height / 2) < zh;                              \
+                int val = progress < 0.5f ? xf1[x] : xf0[x];                        \
+                dst[x] = !dist ? bg : val;                                          \
+            }                                                                       \
+                                                                                    \
+            dst += out->linesize[p] / div;                                          \
+        }                                                                           \
+    }                                                                               \
+}
+
+RECTCROP_TRANSITION(8, uint8_t, 1)
+RECTCROP_TRANSITION(16, uint16_t, 2)
+
+#define DISTANCE_TRANSITION(name, type, div)                                        \
+static void distance##name##_transition(AVFilterContext *ctx,                       \
+                                 const AVFrame *a, const AVFrame *b, AVFrame *out,  \
+                                 float progress,                                    \
+                                 int slice_start, int slice_end, int jobnr)         \
+{                                                                                   \
+    XFadeContext *s = ctx->priv;                                                    \
+    const int width = out->width;                                                   \
+    const float max = s->max_value;                                                 \
+                                                                                    \
+    for (int y = slice_start; y < slice_end; y++) {                                 \
+        for (int x = 0; x < width; x++) {                                           \
+            float dist = 0.f;                                                       \
+            for (int p = 0; p < s->nb_planes; p++) {                                \
+                const type *xf0 = (const type *)(a->data[p] + y * a->linesize[p]);  \
+                const type *xf1 = (const type *)(b->data[p] + y * b->linesize[p]);  \
+                                                                                    \
+                dist += (xf0[x] / max - xf1[x] / max) *                             \
+                        (xf0[x] / max - xf1[x] / max);                              \
+            }                                                                       \
+                                                                                    \
+            dist = sqrtf(dist) <= progress;                                         \
+            for (int p = 0; p < s->nb_planes; p++) {                                \
+                const type *xf0 = (const type *)(a->data[p] + y * a->linesize[p]);  \
+                const type *xf1 = (const type *)(b->data[p] + y * b->linesize[p]);  \
+                type *dst = (type *)(out->data[p] + y * out->linesize[p]);          \
+                dst[x] = mix(mix(xf0[x], xf1[x], dist), xf1[x], progress);          \
+            }                                                                       \
+        }                                                                           \
+    }                                                                               \
+}
+
+DISTANCE_TRANSITION(8, uint8_t, 1)
+DISTANCE_TRANSITION(16, uint16_t, 2)
+
+#define FADEBLACK_TRANSITION(name, type, div)                                        \
+static void fadeblack##name##_transition(AVFilterContext *ctx,                       \
+                            const AVFrame *a, const AVFrame *b, AVFrame *out,        \
+                            float progress,                                          \
+                            int slice_start, int slice_end, int jobnr)               \
+{                                                                                    \
+    XFadeContext *s = ctx->priv;                                                     \
+    const int height = slice_end - slice_start;                                      \
+    const float phase = 0.2f;                                                        \
+                                                                                     \
+    for (int p = 0; p < s->nb_planes; p++) {                                         \
+        const type *xf0 = (const type *)(a->data[p] + slice_start * a->linesize[p]); \
+        const type *xf1 = (const type *)(b->data[p] + slice_start * b->linesize[p]); \
+        type *dst = (type *)(out->data[p] + slice_start * out->linesize[p]);         \
+        const int bg = s->black[p];                                                  \
+                                                                                     \
+        for (int y = 0; y < height; y++) {                                           \
+            for (int x = 0; x < out->width; x++) {                                   \
+                dst[x] = mix(mix(xf0[x], bg, smoothstep(1.f-phase, 1.f, progress)),  \
+                         mix(bg, xf1[x], smoothstep(phase, 1.f, progress)),          \
+                             progress);                                              \
+            }                                                                        \
+                                                                                     \
+            dst += out->linesize[p] / div;                                           \
+            xf0 += a->linesize[p] / div;                                             \
+            xf1 += b->linesize[p] / div;                                             \
+        }                                                                            \
+    }                                                                                \
+}
+
+FADEBLACK_TRANSITION(8, uint8_t, 1)
+FADEBLACK_TRANSITION(16, uint16_t, 2)
+
+#define FADEWHITE_TRANSITION(name, type, div)                                        \
+static void fadewhite##name##_transition(AVFilterContext *ctx,                       \
+                            const AVFrame *a, const AVFrame *b, AVFrame *out,        \
+                            float progress,                                          \
+                            int slice_start, int slice_end, int jobnr)               \
+{                                                                                    \
+    XFadeContext *s = ctx->priv;                                                     \
+    const int height = slice_end - slice_start;                                      \
+    const float phase = 0.2f;                                                        \
+                                                                                     \
+    for (int p = 0; p < s->nb_planes; p++) {                                         \
+        const type *xf0 = (const type *)(a->data[p] + slice_start * a->linesize[p]); \
+        const type *xf1 = (const type *)(b->data[p] + slice_start * b->linesize[p]); \
+        type *dst = (type *)(out->data[p] + slice_start * out->linesize[p]);         \
+        const int bg = s->white[p];                                                  \
+                                                                                     \
+        for (int y = 0; y < height; y++) {                                           \
+            for (int x = 0; x < out->width; x++) {                                   \
+                dst[x] = mix(mix(xf0[x], bg, smoothstep(1.f-phase, 1.f, progress)),  \
+                         mix(bg, xf1[x], smoothstep(phase, 1.f, progress)),          \
+                             progress);                                              \
+            }                                                                        \
+                                                                                     \
+            dst += out->linesize[p] / div;                                           \
+            xf0 += a->linesize[p] / div;                                             \
+            xf1 += b->linesize[p] / div;                                             \
+        }                                                                            \
+    }                                                                                \
+}
+
+FADEWHITE_TRANSITION(8, uint8_t, 1)
+FADEWHITE_TRANSITION(16, uint16_t, 2)
+
+#define RADIAL_TRANSITION(name, type, div)                                           \
+static void radial##name##_transition(AVFilterContext *ctx,                          \
+                            const AVFrame *a, const AVFrame *b, AVFrame *out,        \
+                            float progress,                                          \
+                            int slice_start, int slice_end, int jobnr)               \
+{                                                                                    \
+    XFadeContext *s = ctx->priv;                                                     \
+    const int width = out->width;                                                    \
+    const int height = out->height;                                                  \
+                                                                                     \
+    for (int y = slice_start; y < slice_end; y++) {                                  \
+        for (int x = 0; x < width; x++) {                                            \
+            const float smooth = atan2f(x - width / 2, y - height / 2) -             \
+                                 (progress - 0.5f) * (M_PI * 2.5f);                  \
+            for (int p = 0; p < s->nb_planes; p++) {                                 \
+                const type *xf0 = (const type *)(a->data[p] + y * a->linesize[p]);   \
+                const type *xf1 = (const type *)(b->data[p] + y * b->linesize[p]);   \
+                type *dst = (type *)(out->data[p] + y * out->linesize[p]);           \
+                                                                                     \
+                dst[x] = mix(xf1[x], xf0[x], smoothstep(0.f, 1.f, smooth));          \
+            }                                                                        \
+        }                                                                            \
+    }                                                                                \
+}
+
+RADIAL_TRANSITION(8, uint8_t, 1)
+RADIAL_TRANSITION(16, uint16_t, 2)
+
+#define SMOOTHLEFT_TRANSITION(name, type, div)                                       \
+static void smoothleft##name##_transition(AVFilterContext *ctx,                      \
+                            const AVFrame *a, const AVFrame *b, AVFrame *out,        \
+                            float progress,                                          \
+                            int slice_start, int slice_end, int jobnr)               \
+{                                                                                    \
+    XFadeContext *s = ctx->priv;                                                     \
+    const int width = out->width;                                                    \
+    const float w = width;                                                           \
+                                                                                     \
+    for (int y = slice_start; y < slice_end; y++) {                                  \
+        for (int x = 0; x < width; x++) {                                            \
+            const float smooth = 1.f + x / w - progress * 2.f;                       \
+                                                                                     \
+            for (int p = 0; p < s->nb_planes; p++) {                                 \
+                const type *xf0 = (const type *)(a->data[p] + y * a->linesize[p]);   \
+                const type *xf1 = (const type *)(b->data[p] + y * b->linesize[p]);   \
+                type *dst = (type *)(out->data[p] + y * out->linesize[p]);           \
+                                                                                     \
+                dst[x] = mix(xf1[x], xf0[x], smoothstep(0.f, 1.f, smooth));          \
+            }                                                                        \
+        }                                                                            \
+    }                                                                                \
+}
+
+SMOOTHLEFT_TRANSITION(8, uint8_t, 1)
+SMOOTHLEFT_TRANSITION(16, uint16_t, 2)
+
+#define SMOOTHRIGHT_TRANSITION(name, type, div)                                      \
+static void smoothright##name##_transition(AVFilterContext *ctx,                     \
+                            const AVFrame *a, const AVFrame *b, AVFrame *out,        \
+                            float progress,                                          \
+                            int slice_start, int slice_end, int jobnr)               \
+{                                                                                    \
+    XFadeContext *s = ctx->priv;                                                     \
+    const int width = out->width;                                                    \
+    const float w = width;                                                           \
+                                                                                     \
+    for (int y = slice_start; y < slice_end; y++) {                                  \
+        for (int x = 0; x < width; x++) {                                            \
+            const float smooth = 1.f + (w - 1 - x) / w - progress * 2.f;             \
+                                                                                     \
+            for (int p = 0; p < s->nb_planes; p++) {                                 \
+                const type *xf0 = (const type *)(a->data[p] + y * a->linesize[p]);   \
+                const type *xf1 = (const type *)(b->data[p] + y * b->linesize[p]);   \
+                type *dst = (type *)(out->data[p] + y * out->linesize[p]);           \
+                                                                                     \
+                dst[x] = mix(xf1[x], xf0[x], smoothstep(0.f, 1.f, smooth));          \
+            }                                                                        \
+        }                                                                            \
+    }                                                                                \
+}
+
+SMOOTHRIGHT_TRANSITION(8, uint8_t, 1)
+SMOOTHRIGHT_TRANSITION(16, uint16_t, 2)
+
+#define SMOOTHUP_TRANSITION(name, type, div)                                         \
+static void smoothup##name##_transition(AVFilterContext *ctx,                        \
+                            const AVFrame *a, const AVFrame *b, AVFrame *out,        \
+                            float progress,                                          \
+                            int slice_start, int slice_end, int jobnr)               \
+{                                                                                    \
+    XFadeContext *s = ctx->priv;                                                     \
+    const int width = out->width;                                                    \
+    const float h = out->height;                                                     \
+                                                                                     \
+    for (int y = slice_start; y < slice_end; y++) {                                  \
+        const float smooth = 1.f + y / h - progress * 2.f;                           \
+        for (int x = 0; x < width; x++) {                                            \
+            for (int p = 0; p < s->nb_planes; p++) {                                 \
+                const type *xf0 = (const type *)(a->data[p] + y * a->linesize[p]);   \
+                const type *xf1 = (const type *)(b->data[p] + y * b->linesize[p]);   \
+                type *dst = (type *)(out->data[p] + y * out->linesize[p]);           \
+                                                                                     \
+                dst[x] = mix(xf1[x], xf0[x], smoothstep(0.f, 1.f, smooth));          \
+            }                                                                        \
+        }                                                                            \
+    }                                                                                \
+}
+
+SMOOTHUP_TRANSITION(8, uint8_t, 1)
+SMOOTHUP_TRANSITION(16, uint16_t, 2)
+
+#define SMOOTHDOWN_TRANSITION(name, type, div)                                       \
+static void smoothdown##name##_transition(AVFilterContext *ctx,                      \
+                            const AVFrame *a, const AVFrame *b, AVFrame *out,        \
+                            float progress,                                          \
+                            int slice_start, int slice_end, int jobnr)               \
+{                                                                                    \
+    XFadeContext *s = ctx->priv;                                                     \
+    const int width = out->width;                                                    \
+    const float h = out->height;                                                     \
+                                                                                     \
+    for (int y = slice_start; y < slice_end; y++) {                                  \
+        const float smooth = 1.f + (h - 1 - y) / h - progress * 2.f;                 \
+        for (int x = 0; x < width; x++) {                                            \
+            for (int p = 0; p < s->nb_planes; p++) {                                 \
+                const type *xf0 = (const type *)(a->data[p] + y * a->linesize[p]);   \
+                const type *xf1 = (const type *)(b->data[p] + y * b->linesize[p]);   \
+                type *dst = (type *)(out->data[p] + y * out->linesize[p]);           \
+                                                                                     \
+                dst[x] = mix(xf1[x], xf0[x], smoothstep(0.f, 1.f, smooth));          \
+            }                                                                        \
+        }                                                                            \
+    }                                                                                \
+}
+
+SMOOTHDOWN_TRANSITION(8, uint8_t, 1)
+SMOOTHDOWN_TRANSITION(16, uint16_t, 2)
+
+#define CIRCLEOPEN_TRANSITION(name, type, div)                                       \
+static void circleopen##name##_transition(AVFilterContext *ctx,                      \
+                            const AVFrame *a, const AVFrame *b, AVFrame *out,        \
+                            float progress,                                          \
+                            int slice_start, int slice_end, int jobnr)               \
+{                                                                                    \
+    XFadeContext *s = ctx->priv;                                                     \
+    const int width = out->width;                                                    \
+    const int height = out->height;                                                  \
+    const float z = hypotf(width / 2, height / 2);                                   \
+    const float p = (progress - 0.5f) * 3.f;                                         \
+                                                                                     \
+    for (int y = slice_start; y < slice_end; y++) {                                  \
+        for (int x = 0; x < width; x++) {                                            \
+            const float smooth = hypotf(x - width / 2, y - height / 2) / z + p;      \
+            for (int p = 0; p < s->nb_planes; p++) {                                 \
+                const type *xf0 = (const type *)(a->data[p] + y * a->linesize[p]);   \
+                const type *xf1 = (const type *)(b->data[p] + y * b->linesize[p]);   \
+                type *dst = (type *)(out->data[p] + y * out->linesize[p]);           \
+                                                                                     \
+                dst[x] = mix(xf0[x], xf1[x], smoothstep(0.f, 1.f, smooth));          \
+            }                                                                        \
+        }                                                                            \
+    }                                                                                \
+}
+
+CIRCLEOPEN_TRANSITION(8, uint8_t, 1)
+CIRCLEOPEN_TRANSITION(16, uint16_t, 2)
+
+#define CIRCLECLOSE_TRANSITION(name, type, div)                                      \
+static void circleclose##name##_transition(AVFilterContext *ctx,                     \
+                            const AVFrame *a, const AVFrame *b, AVFrame *out,        \
+                            float progress,                                          \
+                            int slice_start, int slice_end, int jobnr)               \
+{                                                                                    \
+    XFadeContext *s = ctx->priv;                                                     \
+    const int width = out->width;                                                    \
+    const int height = out->height;                                                  \
+    const float z = hypotf(width / 2, height / 2);                                   \
+    const float p = (1.f - progress - 0.5f) * 3.f;                                   \
+                                                                                     \
+    for (int y = slice_start; y < slice_end; y++) {                                  \
+        for (int x = 0; x < width; x++) {                                            \
+            const float smooth = hypotf(x - width / 2, y - height / 2) / z + p;      \
+            for (int p = 0; p < s->nb_planes; p++) {                                 \
+                const type *xf0 = (const type *)(a->data[p] + y * a->linesize[p]);   \
+                const type *xf1 = (const type *)(b->data[p] + y * b->linesize[p]);   \
+                type *dst = (type *)(out->data[p] + y * out->linesize[p]);           \
+                                                                                     \
+                dst[x] = mix(xf1[x], xf0[x], smoothstep(0.f, 1.f, smooth));          \
+            }                                                                        \
+        }                                                                            \
+    }                                                                                \
+}
+
+CIRCLECLOSE_TRANSITION(8, uint8_t, 1)
+CIRCLECLOSE_TRANSITION(16, uint16_t, 2)
+
+#define VERTOPEN_TRANSITION(name, type, div)                                         \
+static void vertopen##name##_transition(AVFilterContext *ctx,                        \
+                            const AVFrame *a, const AVFrame *b, AVFrame *out,        \
+                            float progress,                                          \
+                            int slice_start, int slice_end, int jobnr)               \
+{                                                                                    \
+    XFadeContext *s = ctx->priv;                                                     \
+    const int width = out->width;                                                    \
+    const float w2 = out->width / 2;                                                 \
+                                                                                     \
+    for (int y = slice_start; y < slice_end; y++) {                                  \
+        for (int x = 0; x < width; x++) {                                            \
+            const float smooth = 2.f - fabsf((x - w2) / w2) - progress * 2.f;        \
+            for (int p = 0; p < s->nb_planes; p++) {                                 \
+                const type *xf0 = (const type *)(a->data[p] + y * a->linesize[p]);   \
+                const type *xf1 = (const type *)(b->data[p] + y * b->linesize[p]);   \
+                type *dst = (type *)(out->data[p] + y * out->linesize[p]);           \
+                                                                                     \
+                dst[x] = mix(xf1[x], xf0[x], smoothstep(0.f, 1.f, smooth));          \
+            }                                                                        \
+        }                                                                            \
+    }                                                                                \
+}
+
+VERTOPEN_TRANSITION(8, uint8_t, 1)
+VERTOPEN_TRANSITION(16, uint16_t, 2)
+
+#define VERTCLOSE_TRANSITION(name, type, div)                                        \
+static void vertclose##name##_transition(AVFilterContext *ctx,                       \
+                            const AVFrame *a, const AVFrame *b, AVFrame *out,        \
+                            float progress,                                          \
+                            int slice_start, int slice_end, int jobnr)               \
+{                                                                                    \
+    XFadeContext *s = ctx->priv;                                                     \
+    const int width = out->width;                                                    \
+    const float w2 = out->width / 2;                                                 \
+                                                                                     \
+    for (int y = slice_start; y < slice_end; y++) {                                  \
+        for (int x = 0; x < width; x++) {                                            \
+            const float smooth = 1.f + fabsf((x - w2) / w2) - progress * 2.f;        \
+            for (int p = 0; p < s->nb_planes; p++) {                                 \
+                const type *xf0 = (const type *)(a->data[p] + y * a->linesize[p]);   \
+                const type *xf1 = (const type *)(b->data[p] + y * b->linesize[p]);   \
+                type *dst = (type *)(out->data[p] + y * out->linesize[p]);           \
+                                                                                     \
+                dst[x] = mix(xf1[x], xf0[x], smoothstep(0.f, 1.f, smooth));          \
+            }                                                                        \
+        }                                                                            \
+    }                                                                                \
+}
+
+VERTCLOSE_TRANSITION(8, uint8_t, 1)
+VERTCLOSE_TRANSITION(16, uint16_t, 2)
+
+#define HORZOPEN_TRANSITION(name, type, div)                                         \
+static void horzopen##name##_transition(AVFilterContext *ctx,                        \
+                            const AVFrame *a, const AVFrame *b, AVFrame *out,        \
+                            float progress,                                          \
+                            int slice_start, int slice_end, int jobnr)               \
+{                                                                                    \
+    XFadeContext *s = ctx->priv;                                                     \
+    const int width = out->width;                                                    \
+    const float h2 = out->height / 2;                                                \
+                                                                                     \
+    for (int y = slice_start; y < slice_end; y++) {                                  \
+        const float smooth = 2.f - fabsf((y - h2) / h2) - progress * 2.f;            \
+        for (int x = 0; x < width; x++) {                                            \
+            for (int p = 0; p < s->nb_planes; p++) {                                 \
+                const type *xf0 = (const type *)(a->data[p] + y * a->linesize[p]);   \
+                const type *xf1 = (const type *)(b->data[p] + y * b->linesize[p]);   \
+                type *dst = (type *)(out->data[p] + y * out->linesize[p]);           \
+                                                                                     \
+                dst[x] = mix(xf1[x], xf0[x], smoothstep(0.f, 1.f, smooth));          \
+            }                                                                        \
+        }                                                                            \
+    }                                                                                \
+}
+
+HORZOPEN_TRANSITION(8, uint8_t, 1)
+HORZOPEN_TRANSITION(16, uint16_t, 2)
+
+#define HORZCLOSE_TRANSITION(name, type, div)                                        \
+static void horzclose##name##_transition(AVFilterContext *ctx,                       \
+                            const AVFrame *a, const AVFrame *b, AVFrame *out,        \
+                            float progress,                                          \
+                            int slice_start, int slice_end, int jobnr)               \
+{                                                                                    \
+    XFadeContext *s = ctx->priv;                                                     \
+    const int width = out->width;                                                    \
+    const float h2 = out->height / 2;                                                \
+                                                                                     \
+    for (int y = slice_start; y < slice_end; y++) {                                  \
+        const float smooth = 1.f + fabsf((y - h2) / h2) - progress * 2.f;            \
+        for (int x = 0; x < width; x++) {                                            \
+            for (int p = 0; p < s->nb_planes; p++) {                                 \
+                const type *xf0 = (const type *)(a->data[p] + y * a->linesize[p]);   \
+                const type *xf1 = (const type *)(b->data[p] + y * b->linesize[p]);   \
+                type *dst = (type *)(out->data[p] + y * out->linesize[p]);           \
+                                                                                     \
+                dst[x] = mix(xf1[x], xf0[x], smoothstep(0.f, 1.f, smooth));          \
+            }                                                                        \
+        }                                                                            \
+    }                                                                                \
+}
+
+HORZCLOSE_TRANSITION(8, uint8_t, 1)
+HORZCLOSE_TRANSITION(16, uint16_t, 2)
+
+static float frand(int x, int y)
+{
+    const float r = sinf(x * 12.9898f + y * 78.233f) * 43758.545f;
+
+    return r - floorf(r);
+}
+
+#define DISSOLVE_TRANSITION(name, type, div)                                         \
+static void dissolve##name##_transition(AVFilterContext *ctx,                        \
+                            const AVFrame *a, const AVFrame *b, AVFrame *out,        \
+                            float progress,                                          \
+                            int slice_start, int slice_end, int jobnr)               \
+{                                                                                    \
+    XFadeContext *s = ctx->priv;                                                     \
+    const int width = out->width;                                                    \
+                                                                                     \
+    for (int y = slice_start; y < slice_end; y++) {                                  \
+        for (int x = 0; x < width; x++) {                                            \
+            const float smooth = frand(x, y) * 2.f + progress * 2.f - 1.5f;          \
+            for (int p = 0; p < s->nb_planes; p++) {                                 \
+                const type *xf0 = (const type *)(a->data[p] + y * a->linesize[p]);   \
+                const type *xf1 = (const type *)(b->data[p] + y * b->linesize[p]);   \
+                type *dst = (type *)(out->data[p] + y * out->linesize[p]);           \
+                                                                                     \
+                dst[x] = smooth >= 0.5f ? xf0[x] : xf1[x];                           \
+            }                                                                        \
+        }                                                                            \
+    }                                                                                \
+}
+
+DISSOLVE_TRANSITION(8, uint8_t, 1)
+DISSOLVE_TRANSITION(16, uint16_t, 2)
+
+#define PIXELIZE_TRANSITION(name, type, div)                                         \
+static void pixelize##name##_transition(AVFilterContext *ctx,                        \
+                            const AVFrame *a, const AVFrame *b, AVFrame *out,        \
+                            float progress,                                          \
+                            int slice_start, int slice_end, int jobnr)               \
+{                                                                                    \
+    XFadeContext *s = ctx->priv;                                                     \
+    const int w = out->width;                                                        \
+    const int h = out->height;                                                       \
+    const float d = fminf(progress, 1.f - progress);                                 \
+    const float dist = ceilf(d * 50.f) / 50.f;                                       \
+    const float sqx = 2.f * dist * FFMIN(w, h) / 20.f;                               \
+    const float sqy = 2.f * dist * FFMIN(w, h) / 20.f;                               \
+                                                                                     \
+    for (int y = slice_start; y < slice_end; y++) {                                  \
+        for (int x = 0; x < w; x++) {                                                \
+            int sx = dist > 0.f ? FFMIN((floorf(x / sqx) + .5f) * sqx, w - 1) : x;   \
+            int sy = dist > 0.f ? FFMIN((floorf(y / sqy) + .5f) * sqy, h - 1) : y;   \
+            for (int p = 0; p < s->nb_planes; p++) {                                 \
+                const type *xf0 = (const type *)(a->data[p] + sy * a->linesize[p]);  \
+                const type *xf1 = (const type *)(b->data[p] + sy * b->linesize[p]);  \
+                type *dst = (type *)(out->data[p] + y * out->linesize[p]);           \
+                                                                                     \
+                dst[x] = mix(xf0[sx], xf1[sx], progress);                            \
+            }                                                                        \
+        }                                                                            \
+    }                                                                                \
+}
+
+PIXELIZE_TRANSITION(8, uint8_t, 1)
+PIXELIZE_TRANSITION(16, uint16_t, 2)
+
+#define DIAGTL_TRANSITION(name, type, div)                                           \
+static void diagtl##name##_transition(AVFilterContext *ctx,                          \
+                            const AVFrame *a, const AVFrame *b, AVFrame *out,        \
+                            float progress,                                          \
+                            int slice_start, int slice_end, int jobnr)               \
+{                                                                                    \
+    XFadeContext *s = ctx->priv;                                                     \
+    const int width = out->width;                                                    \
+    const float w = width;                                                           \
+    const float h = out->height;                                                     \
+                                                                                     \
+    for (int y = slice_start; y < slice_end; y++) {                                  \
+        for (int x = 0; x < width; x++) {                                            \
+            const float smooth = 1.f + x / w * y / h - progress * 2.f;               \
+                                                                                     \
+            for (int p = 0; p < s->nb_planes; p++) {                                 \
+                const type *xf0 = (const type *)(a->data[p] + y * a->linesize[p]);   \
+                const type *xf1 = (const type *)(b->data[p] + y * b->linesize[p]);   \
+                type *dst = (type *)(out->data[p] + y * out->linesize[p]);           \
+                                                                                     \
+                dst[x] = mix(xf1[x], xf0[x], smoothstep(0.f, 1.f, smooth));          \
+            }                                                                        \
+        }                                                                            \
+    }                                                                                \
+}
+
+DIAGTL_TRANSITION(8, uint8_t, 1)
+DIAGTL_TRANSITION(16, uint16_t, 2)
+
+#define DIAGTR_TRANSITION(name, type, div)                                           \
+static void diagtr##name##_transition(AVFilterContext *ctx,                          \
+                            const AVFrame *a, const AVFrame *b, AVFrame *out,        \
+                            float progress,                                          \
+                            int slice_start, int slice_end, int jobnr)               \
+{                                                                                    \
+    XFadeContext *s = ctx->priv;                                                     \
+    const int width = out->width;                                                    \
+    const float w = width;                                                           \
+    const float h = out->height;                                                     \
+                                                                                     \
+    for (int y = slice_start; y < slice_end; y++) {                                  \
+        for (int x = 0; x < width; x++) {                                            \
+            const float smooth = 1.f + (w - 1 - x) / w * y / h - progress * 2.f;     \
+                                                                                     \
+            for (int p = 0; p < s->nb_planes; p++) {                                 \
+                const type *xf0 = (const type *)(a->data[p] + y * a->linesize[p]);   \
+                const type *xf1 = (const type *)(b->data[p] + y * b->linesize[p]);   \
+                type *dst = (type *)(out->data[p] + y * out->linesize[p]);           \
+                                                                                     \
+                dst[x] = mix(xf1[x], xf0[x], smoothstep(0.f, 1.f, smooth));          \
+            }                                                                        \
+        }                                                                            \
+    }                                                                                \
+}
+
+DIAGTR_TRANSITION(8, uint8_t, 1)
+DIAGTR_TRANSITION(16, uint16_t, 2)
+
+#define DIAGBL_TRANSITION(name, type, div)                                           \
+static void diagbl##name##_transition(AVFilterContext *ctx,                          \
+                            const AVFrame *a, const AVFrame *b, AVFrame *out,        \
+                            float progress,                                          \
+                            int slice_start, int slice_end, int jobnr)               \
+{                                                                                    \
+    XFadeContext *s = ctx->priv;                                                     \
+    const int width = out->width;                                                    \
+    const float w = width;                                                           \
+    const float h = out->height;                                                     \
+                                                                                     \
+    for (int y = slice_start; y < slice_end; y++) {                                  \
+        for (int x = 0; x < width; x++) {                                            \
+            const float smooth = 1.f + x / w * (h - 1 - y) / h - progress * 2.f;     \
+                                                                                     \
+            for (int p = 0; p < s->nb_planes; p++) {                                 \
+                const type *xf0 = (const type *)(a->data[p] + y * a->linesize[p]);   \
+                const type *xf1 = (const type *)(b->data[p] + y * b->linesize[p]);   \
+                type *dst = (type *)(out->data[p] + y * out->linesize[p]);           \
+                                                                                     \
+                dst[x] = mix(xf1[x], xf0[x], smoothstep(0.f, 1.f, smooth));          \
+            }                                                                        \
+        }                                                                            \
+    }                                                                                \
+}
+
+DIAGBL_TRANSITION(8, uint8_t, 1)
+DIAGBL_TRANSITION(16, uint16_t, 2)
+
+#define DIAGBR_TRANSITION(name, type, div)                                           \
+static void diagbr##name##_transition(AVFilterContext *ctx,                          \
+                            const AVFrame *a, const AVFrame *b, AVFrame *out,        \
+                            float progress,                                          \
+                            int slice_start, int slice_end, int jobnr)               \
+{                                                                                    \
+    XFadeContext *s = ctx->priv;                                                     \
+    const int width = out->width;                                                    \
+    const float w = width;                                                           \
+    const float h = out->height;                                                     \
+                                                                                     \
+    for (int y = slice_start; y < slice_end; y++) {                                  \
+        for (int x = 0; x < width; x++) {                                            \
+            const float smooth = 1.f + (w - 1 - x) / w * (h - 1 - y) / h -           \
+                                 progress * 2.f;                                     \
+                                                                                     \
+            for (int p = 0; p < s->nb_planes; p++) {                                 \
+                const type *xf0 = (const type *)(a->data[p] + y * a->linesize[p]);   \
+                const type *xf1 = (const type *)(b->data[p] + y * b->linesize[p]);   \
+                type *dst = (type *)(out->data[p] + y * out->linesize[p]);           \
+                                                                                     \
+                dst[x] = mix(xf1[x], xf0[x], smoothstep(0.f, 1.f, smooth));          \
+            }                                                                        \
+        }                                                                            \
+    }                                                                                \
+}
+
+DIAGBR_TRANSITION(8, uint8_t, 1)
+DIAGBR_TRANSITION(16, uint16_t, 2)
+
+#define HLSLICE_TRANSITION(name, type, div)                                          \
+static void hlslice##name##_transition(AVFilterContext *ctx,                         \
+                            const AVFrame *a, const AVFrame *b, AVFrame *out,        \
+                            float progress,                                          \
+                            int slice_start, int slice_end, int jobnr)               \
+{                                                                                    \
+    XFadeContext *s = ctx->priv;                                                     \
+    const int width = out->width;                                                    \
+    const float w = width;                                                           \
+                                                                                     \
+    for (int y = slice_start; y < slice_end; y++) {                                  \
+        for (int x = 0; x < width; x++) {                                            \
+            const float smooth = smoothstep(-0.5f, 0.f, x / w - progress * 1.5f);    \
+            const float ss = smooth <= fract(10.f * x / w) ? 0.f : 1.f;              \
+                                                                                     \
+            for (int p = 0; p < s->nb_planes; p++) {                                 \
+                const type *xf0 = (const type *)(a->data[p] + y * a->linesize[p]);   \
+                const type *xf1 = (const type *)(b->data[p] + y * b->linesize[p]);   \
+                type *dst = (type *)(out->data[p] + y * out->linesize[p]);           \
+                                                                                     \
+                dst[x] = mix(xf1[x], xf0[x], ss);                                    \
+            }                                                                        \
+        }                                                                            \
+    }                                                                                \
+}
+
+HLSLICE_TRANSITION(8, uint8_t, 1)
+HLSLICE_TRANSITION(16, uint16_t, 2)
+
+#define HRSLICE_TRANSITION(name, type, div)                                          \
+static void hrslice##name##_transition(AVFilterContext *ctx,                         \
+                            const AVFrame *a, const AVFrame *b, AVFrame *out,        \
+                            float progress,                                          \
+                            int slice_start, int slice_end, int jobnr)               \
+{                                                                                    \
+    XFadeContext *s = ctx->priv;                                                     \
+    const int width = out->width;                                                    \
+    const float w = width;                                                           \
+                                                                                     \
+    for (int y = slice_start; y < slice_end; y++) {                                  \
+        for (int x = 0; x < width; x++) {                                            \
+            const float xx = (w - 1 - x) / w;                                        \
+            const float smooth = smoothstep(-0.5f, 0.f, xx - progress * 1.5f);       \
+            const float ss = smooth <= fract(10.f * xx) ? 0.f : 1.f;                 \
+                                                                                     \
+            for (int p = 0; p < s->nb_planes; p++) {                                 \
+                const type *xf0 = (const type *)(a->data[p] + y * a->linesize[p]);   \
+                const type *xf1 = (const type *)(b->data[p] + y * b->linesize[p]);   \
+                type *dst = (type *)(out->data[p] + y * out->linesize[p]);           \
+                                                                                     \
+                dst[x] = mix(xf1[x], xf0[x], ss);                                    \
+            }                                                                        \
+        }                                                                            \
+    }                                                                                \
+}
+
+HRSLICE_TRANSITION(8, uint8_t, 1)
+HRSLICE_TRANSITION(16, uint16_t, 2)
+
+#define VUSLICE_TRANSITION(name, type, div)                                          \
+static void vuslice##name##_transition(AVFilterContext *ctx,                         \
+                            const AVFrame *a, const AVFrame *b, AVFrame *out,        \
+                            float progress,                                          \
+                            int slice_start, int slice_end, int jobnr)               \
+{                                                                                    \
+    XFadeContext *s = ctx->priv;                                                     \
+    const int width = out->width;                                                    \
+    const float h = out->height;                                                     \
+                                                                                     \
+    for (int y = slice_start; y < slice_end; y++) {                                  \
+         const float smooth = smoothstep(-0.5f, 0.f, y / h - progress * 1.5f);       \
+         const float ss = smooth <= fract(10.f * y / h) ? 0.f : 1.f;                 \
+                                                                                     \
+         for (int x = 0; x < width; x++) {                                           \
+            for (int p = 0; p < s->nb_planes; p++) {                                 \
+                const type *xf0 = (const type *)(a->data[p] + y * a->linesize[p]);   \
+                const type *xf1 = (const type *)(b->data[p] + y * b->linesize[p]);   \
+                type *dst = (type *)(out->data[p] + y * out->linesize[p]);           \
+                                                                                     \
+                dst[x] = mix(xf1[x], xf0[x], ss);                                    \
+            }                                                                        \
+        }                                                                            \
+    }                                                                                \
+}
+
+VUSLICE_TRANSITION(8, uint8_t, 1)
+VUSLICE_TRANSITION(16, uint16_t, 2)
+
+#define VDSLICE_TRANSITION(name, type, div)                                          \
+static void vdslice##name##_transition(AVFilterContext *ctx,                         \
+                            const AVFrame *a, const AVFrame *b, AVFrame *out,        \
+                            float progress,                                          \
+                            int slice_start, int slice_end, int jobnr)               \
+{                                                                                    \
+    XFadeContext *s = ctx->priv;                                                     \
+    const int width = out->width;                                                    \
+    const float h = out->height;                                                     \
+                                                                                     \
+    for (int y = slice_start; y < slice_end; y++) {                                  \
+         const float yy = (h - 1 - y) / h;                                           \
+         const float smooth = smoothstep(-0.5f, 0.f, yy - progress * 1.5f);          \
+         const float ss = smooth <= fract(10.f * yy) ? 0.f : 1.f;                    \
+                                                                                     \
+         for (int x = 0; x < width; x++) {                                           \
+            for (int p = 0; p < s->nb_planes; p++) {                                 \
+                const type *xf0 = (const type *)(a->data[p] + y * a->linesize[p]);   \
+                const type *xf1 = (const type *)(b->data[p] + y * b->linesize[p]);   \
+                type *dst = (type *)(out->data[p] + y * out->linesize[p]);           \
+                                                                                     \
+                dst[x] = mix(xf1[x], xf0[x], ss);                                    \
+            }                                                                        \
+        }                                                                            \
+    }                                                                                \
+}
+
+VDSLICE_TRANSITION(8, uint8_t, 1)
+VDSLICE_TRANSITION(16, uint16_t, 2)
+
+static inline double getpix(void *priv, double x, double y, int plane, int nb)
+{
+    XFadeContext *s = priv;
+    AVFrame *in = s->xf[nb];
+    const uint8_t *src = in->data[FFMIN(plane, s->nb_planes - 1)];
+    int linesize = in->linesize[FFMIN(plane, s->nb_planes - 1)];
+    const int w = in->width;
+    const int h = in->height;
+
+    int xi, yi;
+
+    xi = av_clipd(x, 0, w - 1);
+    yi = av_clipd(y, 0, h - 1);
+
+    if (s->depth > 8) {
+        const uint16_t *src16 = (const uint16_t*)src;
+
+        linesize /= 2;
+        return src16[xi + yi * linesize];
+    } else {
+        return src[xi + yi * linesize];
+    }
+}
+
+static double a0(void *priv, double x, double y) { return getpix(priv, x, y, 0, 0); }
+static double a1(void *priv, double x, double y) { return getpix(priv, x, y, 1, 0); }
+static double a2(void *priv, double x, double y) { return getpix(priv, x, y, 2, 0); }
+static double a3(void *priv, double x, double y) { return getpix(priv, x, y, 3, 0); }
+
+static double b0(void *priv, double x, double y) { return getpix(priv, x, y, 0, 1); }
+static double b1(void *priv, double x, double y) { return getpix(priv, x, y, 1, 1); }
+static double b2(void *priv, double x, double y) { return getpix(priv, x, y, 2, 1); }
+static double b3(void *priv, double x, double y) { return getpix(priv, x, y, 3, 1); }
+
+static int config_output(AVFilterLink *outlink)
+{
+    AVFilterContext *ctx = outlink->src;
+    AVFilterLink *inlink0 = ctx->inputs[0];
+    AVFilterLink *inlink1 = ctx->inputs[1];
+    XFadeContext *s = ctx->priv;
+    const AVPixFmtDescriptor *pix_desc = av_pix_fmt_desc_get(inlink0->format);
+    int is_rgb;
+
+    if (inlink0->format != inlink1->format) {
+        av_log(ctx, AV_LOG_ERROR, "inputs must be of same pixel format\n");
+        return AVERROR(EINVAL);
+    }
+    if (inlink0->w != inlink1->w || inlink0->h != inlink1->h) {
+        av_log(ctx, AV_LOG_ERROR, "First input link %s parameters "
+               "(size %dx%d) do not match the corresponding "
+               "second input link %s parameters (size %dx%d)\n",
+               ctx->input_pads[0].name, inlink0->w, inlink0->h,
+               ctx->input_pads[1].name, inlink1->w, inlink1->h);
+        return AVERROR(EINVAL);
+    }
+
+    if (inlink0->time_base.num != inlink1->time_base.num ||
+        inlink0->time_base.den != inlink1->time_base.den) {
+        av_log(ctx, AV_LOG_ERROR, "First input link %s timebase "
+               "(%d/%d) do not match the corresponding "
+               "second input link %s timebase (%d/%d)\n",
+               ctx->input_pads[0].name, inlink0->time_base.num, inlink0->time_base.den,
+               ctx->input_pads[1].name, inlink1->time_base.num, inlink1->time_base.den);
+        return AVERROR(EINVAL);
+    }
+
+    outlink->w = inlink0->w;
+    outlink->h = inlink0->h;
+    outlink->time_base = inlink0->time_base;
+    outlink->sample_aspect_ratio = inlink0->sample_aspect_ratio;
+    outlink->frame_rate = inlink0->frame_rate;
+
+    s->depth = pix_desc->comp[0].depth;
+    is_rgb = !!(pix_desc->flags & AV_PIX_FMT_FLAG_RGB);
+    s->nb_planes = av_pix_fmt_count_planes(inlink0->format);
+    s->max_value = (1 << s->depth) - 1;
+    s->black[0] = 0;
+    s->black[1] = s->black[2] = is_rgb ? 0 : s->max_value / 2;
+    s->black[3] = s->max_value;
+    s->white[0] = s->white[3] = s->max_value;
+    s->white[1] = s->white[2] = is_rgb ? s->max_value : s->max_value / 2;
+
+    s->first_pts = s->last_pts = s->pts = AV_NOPTS_VALUE;
+
+    if (s->duration)
+        s->duration_pts = av_rescale_q(s->duration, AV_TIME_BASE_Q, outlink->time_base);
+    if (s->offset)
+        s->offset_pts = av_rescale_q(s->offset, AV_TIME_BASE_Q, outlink->time_base);
+
+    switch (s->transition) {
+    case CUSTOM:     s->transitionf = s->depth <= 8 ? custom8_transition     : custom16_transition;     break;
+    case FADE:       s->transitionf = s->depth <= 8 ? fade8_transition       : fade16_transition;       break;
+    case WIPELEFT:   s->transitionf = s->depth <= 8 ? wipeleft8_transition   : wipeleft16_transition;   break;
+    case WIPERIGHT:  s->transitionf = s->depth <= 8 ? wiperight8_transition  : wiperight16_transition;  break;
+    case WIPEUP:     s->transitionf = s->depth <= 8 ? wipeup8_transition     : wipeup16_transition;     break;
+    case WIPEDOWN:   s->transitionf = s->depth <= 8 ? wipedown8_transition   : wipedown16_transition;   break;
+    case SLIDELEFT:  s->transitionf = s->depth <= 8 ? slideleft8_transition  : slideleft16_transition;  break;
+    case SLIDERIGHT: s->transitionf = s->depth <= 8 ? slideright8_transition : slideright16_transition; break;
+    case SLIDEUP:    s->transitionf = s->depth <= 8 ? slideup8_transition    : slideup16_transition;    break;
+    case SLIDEDOWN:  s->transitionf = s->depth <= 8 ? slidedown8_transition  : slidedown16_transition;  break;
+    case CIRCLECROP: s->transitionf = s->depth <= 8 ? circlecrop8_transition : circlecrop16_transition; break;
+    case RECTCROP:   s->transitionf = s->depth <= 8 ? rectcrop8_transition   : rectcrop16_transition;   break;
+    case DISTANCE:   s->transitionf = s->depth <= 8 ? distance8_transition   : distance16_transition;   break;
+    case FADEBLACK:  s->transitionf = s->depth <= 8 ? fadeblack8_transition  : fadeblack16_transition;  break;
+    case FADEWHITE:  s->transitionf = s->depth <= 8 ? fadewhite8_transition  : fadewhite16_transition;  break;
+    case RADIAL:     s->transitionf = s->depth <= 8 ? radial8_transition     : radial16_transition;     break;
+    case SMOOTHLEFT: s->transitionf = s->depth <= 8 ? smoothleft8_transition : smoothleft16_transition; break;
+    case SMOOTHRIGHT:s->transitionf = s->depth <= 8 ? smoothright8_transition: smoothright16_transition;break;
+    case SMOOTHUP:   s->transitionf = s->depth <= 8 ? smoothup8_transition   : smoothup16_transition;   break;
+    case SMOOTHDOWN: s->transitionf = s->depth <= 8 ? smoothdown8_transition : smoothdown16_transition; break;
+    case CIRCLEOPEN: s->transitionf = s->depth <= 8 ? circleopen8_transition : circleopen16_transition; break;
+    case CIRCLECLOSE:s->transitionf = s->depth <= 8 ? circleclose8_transition: circleclose16_transition;break;
+    case VERTOPEN:   s->transitionf = s->depth <= 8 ? vertopen8_transition   : vertopen16_transition;   break;
+    case VERTCLOSE:  s->transitionf = s->depth <= 8 ? vertclose8_transition  : vertclose16_transition;  break;
+    case HORZOPEN:   s->transitionf = s->depth <= 8 ? horzopen8_transition   : horzopen16_transition;   break;
+    case HORZCLOSE:  s->transitionf = s->depth <= 8 ? horzclose8_transition  : horzclose16_transition;  break;
+    case DISSOLVE:   s->transitionf = s->depth <= 8 ? dissolve8_transition   : dissolve16_transition;   break;
+    case PIXELIZE:   s->transitionf = s->depth <= 8 ? pixelize8_transition   : pixelize16_transition;   break;
+    case DIAGTL:     s->transitionf = s->depth <= 8 ? diagtl8_transition     : diagtl16_transition;     break;
+    case DIAGTR:     s->transitionf = s->depth <= 8 ? diagtr8_transition     : diagtr16_transition;     break;
+    case DIAGBL:     s->transitionf = s->depth <= 8 ? diagbl8_transition     : diagbl16_transition;     break;
+    case DIAGBR:     s->transitionf = s->depth <= 8 ? diagbr8_transition     : diagbr16_transition;     break;
+    case HLSLICE:    s->transitionf = s->depth <= 8 ? hlslice8_transition    : hlslice16_transition;    break;
+    case HRSLICE:    s->transitionf = s->depth <= 8 ? hrslice8_transition    : hrslice16_transition;    break;
+    case VUSLICE:    s->transitionf = s->depth <= 8 ? vuslice8_transition    : vuslice16_transition;    break;
+    case VDSLICE:    s->transitionf = s->depth <= 8 ? vdslice8_transition    : vdslice16_transition;    break;
+    }
+
+    if (s->transition == CUSTOM) {
+        static const char *const func2_names[]    = {
+            "a0", "a1", "a2", "a3",
+            "b0", "b1", "b2", "b3",
+            NULL
+        };
+        double (*func2[])(void *, double, double) = {
+            a0, a1, a2, a3,
+            b0, b1, b2, b3,
+            NULL };
+        int ret;
+
+        if (!s->custom_str)
+            return AVERROR(EINVAL);
+        ret = av_expr_parse(&s->e, s->custom_str, var_names,
+                            NULL, NULL, func2_names, func2, 0, ctx);
+        if (ret < 0)
+            return ret;
+    }
+
+    return 0;
+}
+
+static int xfade_slice(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
+{
+    XFadeContext *s = ctx->priv;
+    AVFilterLink *outlink = ctx->outputs[0];
+    ThreadData *td = arg;
+    int slice_start = (outlink->h *  jobnr   ) / nb_jobs;
+    int slice_end   = (outlink->h * (jobnr+1)) / nb_jobs;
+
+    s->transitionf(ctx, td->xf[0], td->xf[1], td->out, td->progress, slice_start, slice_end, jobnr);
+
+    return 0;
+}
+
+static int xfade_frame(AVFilterContext *ctx, AVFrame *a, AVFrame *b)
+{
+    XFadeContext *s = ctx->priv;
+    AVFilterLink *outlink = ctx->outputs[0];
+    float progress = av_clipf(1.f - ((float)(s->pts - s->first_pts - s->offset_pts) / s->duration_pts), 0.f, 1.f);
+    ThreadData td;
+    AVFrame *out;
+
+    out = ff_get_video_buffer(outlink, outlink->w, outlink->h);
+    if (!out)
+        return AVERROR(ENOMEM);
+
+    td.xf[0] = a, td.xf[1] = b, td.out = out, td.progress = progress;
+    ctx->internal->execute(ctx, xfade_slice, &td, NULL, FFMIN(outlink->h, ff_filter_get_nb_threads(ctx)));
+
+    out->pts = s->pts;
+
+    return ff_filter_frame(outlink, out);
+}
+
+static int xfade_activate(AVFilterContext *ctx)
+{
+    XFadeContext *s = ctx->priv;
+    AVFilterLink *outlink = ctx->outputs[0];
+    AVFrame *in = NULL;
+    int ret = 0, status;
+    int64_t pts;
+
+    FF_FILTER_FORWARD_STATUS_BACK_ALL(outlink, ctx);
+
+    if (s->xfade_is_over) {
+        ret = ff_inlink_consume_frame(ctx->inputs[1], &in);
+        if (ret < 0) {
+            return ret;
+        } else if (ret > 0) {
+            in->pts = (in->pts - s->last_pts) + s->pts;
+            return ff_filter_frame(outlink, in);
+        } else if (ff_inlink_acknowledge_status(ctx->inputs[1], &status, &pts)) {
+            ff_outlink_set_status(outlink, status, s->pts);
+            return 0;
+        } else if (!ret) {
+            if (ff_outlink_frame_wanted(outlink)) {
+                ff_inlink_request_frame(ctx->inputs[1]);
+                return 0;
+            }
+        }
+    }
+
+    if (ff_inlink_queued_frames(ctx->inputs[0]) > 0) {
+        s->xf[0] = ff_inlink_peek_frame(ctx->inputs[0], 0);
+        if (s->xf[0]) {
+            if (s->first_pts == AV_NOPTS_VALUE) {
+                s->first_pts = s->xf[0]->pts;
+            }
+            s->pts = s->xf[0]->pts;
+            if (s->first_pts + s->offset_pts > s->xf[0]->pts) {
+                s->xf[0] = NULL;
+                s->need_second = 0;
+                ff_inlink_consume_frame(ctx->inputs[0], &in);
+                return ff_filter_frame(outlink, in);
+            }
+
+            s->need_second = 1;
+        }
+    }
+
+    if (s->xf[0] && ff_inlink_queued_frames(ctx->inputs[1]) > 0) {
+        ff_inlink_consume_frame(ctx->inputs[0], &s->xf[0]);
+        ff_inlink_consume_frame(ctx->inputs[1], &s->xf[1]);
+
+        s->last_pts = s->xf[1]->pts;
+        s->pts = s->xf[0]->pts;
+        if (s->xf[0]->pts - (s->first_pts + s->offset_pts) > s->duration_pts)
+            s->xfade_is_over = 1;
+        ret = xfade_frame(ctx, s->xf[0], s->xf[1]);
+        av_frame_free(&s->xf[0]);
+        av_frame_free(&s->xf[1]);
+        return ret;
+    }
+
+    if (ff_inlink_queued_frames(ctx->inputs[0]) > 0 &&
+        ff_inlink_queued_frames(ctx->inputs[1]) > 0) {
+        ff_filter_set_ready(ctx, 100);
+        return 0;
+    }
+
+    if (ff_outlink_frame_wanted(outlink)) {
+        if (!s->eof[0] && ff_outlink_get_status(ctx->inputs[0])) {
+            s->eof[0] = 1;
+            s->xfade_is_over = 1;
+        }
+        if (!s->eof[1] && ff_outlink_get_status(ctx->inputs[1])) {
+            s->eof[1] = 1;
+        }
+        if (!s->eof[0] && !s->xf[0])
+            ff_inlink_request_frame(ctx->inputs[0]);
+        if (!s->eof[1] && (s->need_second || s->eof[0]))
+            ff_inlink_request_frame(ctx->inputs[1]);
+        if (s->eof[0] && s->eof[1] && (
+            ff_inlink_queued_frames(ctx->inputs[0]) <= 0 ||
+            ff_inlink_queued_frames(ctx->inputs[1]) <= 0))
+            ff_outlink_set_status(outlink, AVERROR_EOF, AV_NOPTS_VALUE);
+        return 0;
+    }
+
+    return FFERROR_NOT_READY;
+}
+
+static const AVFilterPad xfade_inputs[] = {
+    {
+        .name          = "main",
+        .type          = AVMEDIA_TYPE_VIDEO,
+    },
+    {
+        .name          = "xfade",
+        .type          = AVMEDIA_TYPE_VIDEO,
+    },
+    { NULL }
+};
+
+static const AVFilterPad xfade_outputs[] = {
+    {
+        .name          = "default",
+        .type          = AVMEDIA_TYPE_VIDEO,
+        .config_props  = config_output,
+    },
+    { NULL }
+};
+
+AVFilter ff_vf_xfade = {
+    .name          = "xfade",
+    .description   = NULL_IF_CONFIG_SMALL("Cross fade one video with another video."),
+    .priv_size     = sizeof(XFadeContext),
+    .priv_class    = &xfade_class,
+    .query_formats = query_formats,
+    .activate      = xfade_activate,
+    .uninit        = uninit,
+    .inputs        = xfade_inputs,
+    .outputs       = xfade_outputs,
+    .flags         = AVFILTER_FLAG_SLICE_THREADS,
+};
diff --git a/libavfilter/vf_xfade_opencl.c b/libavfilter/vf_xfade_opencl.c
new file mode 100644
index 0000000..4736043
--- /dev/null
+++ b/libavfilter/vf_xfade_opencl.c
@@ -0,0 +1,439 @@
+/*
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "libavutil/log.h"
+#include "libavutil/mem.h"
+#include "libavutil/opt.h"
+#include "libavutil/pixdesc.h"
+
+#include "avfilter.h"
+#include "filters.h"
+#include "internal.h"
+#include "opencl.h"
+#include "opencl_source.h"
+#include "video.h"
+
+enum XFadeTransitions {
+    CUSTOM,
+    FADE,
+    WIPELEFT,
+    WIPERIGHT,
+    WIPEUP,
+    WIPEDOWN,
+    SLIDELEFT,
+    SLIDERIGHT,
+    SLIDEUP,
+    SLIDEDOWN,
+    NB_TRANSITIONS,
+};
+
+typedef struct XFadeOpenCLContext {
+    OpenCLFilterContext ocf;
+
+    int              transition;
+    const char      *source_file;
+    const char      *kernel_name;
+    int64_t          duration;
+    int64_t          offset;
+
+    int              initialised;
+    cl_kernel        kernel;
+    cl_command_queue command_queue;
+
+    int              nb_planes;
+
+    int64_t          duration_pts;
+    int64_t          offset_pts;
+    int64_t          first_pts;
+    int64_t          last_pts;
+    int64_t          pts;
+    int              xfade_is_over;
+    int              need_second;
+    int              eof[2];
+    AVFrame         *xf[2];
+} XFadeOpenCLContext;
+
+static int xfade_opencl_load(AVFilterContext *avctx,
+                             enum AVPixelFormat main_format,
+                             enum AVPixelFormat xfade_format)
+{
+    XFadeOpenCLContext *ctx = avctx->priv;
+    cl_int cle;
+    const AVPixFmtDescriptor *main_desc;
+    int err, main_planes;
+    const char *kernel_name;
+
+    main_desc = av_pix_fmt_desc_get(main_format);
+    if (main_format != xfade_format) {
+        av_log(avctx, AV_LOG_ERROR, "Input formats are not same.\n");
+        return AVERROR(EINVAL);
+    }
+
+    main_planes = 0;
+    for (int i = 0; i < main_desc->nb_components; i++)
+        main_planes = FFMAX(main_planes,
+                            main_desc->comp[i].plane + 1);
+
+    ctx->nb_planes = main_planes;
+
+    if (ctx->transition == CUSTOM) {
+        err = ff_opencl_filter_load_program_from_file(avctx, ctx->source_file);
+    } else {
+        err = ff_opencl_filter_load_program(avctx, &ff_opencl_source_xfade, 1);
+    }
+    if (err < 0)
+        return err;
+
+    ctx->command_queue = clCreateCommandQueue(ctx->ocf.hwctx->context,
+                                              ctx->ocf.hwctx->device_id,
+                                              0, &cle);
+    CL_FAIL_ON_ERROR(AVERROR(EIO), "Failed to create OpenCL "
+                     "command queue %d.\n", cle);
+
+    switch (ctx->transition) {
+    case CUSTOM:     kernel_name = ctx->kernel_name; break;
+    case FADE:       kernel_name = "fade";           break;
+    case WIPELEFT:   kernel_name = "wipeleft";       break;
+    case WIPERIGHT:  kernel_name = "wiperight";      break;
+    case WIPEUP:     kernel_name = "wipeup";         break;
+    case WIPEDOWN:   kernel_name = "wipedown";       break;
+    case SLIDELEFT:  kernel_name = "slideleft";      break;
+    case SLIDERIGHT: kernel_name = "slideright";     break;
+    case SLIDEUP:    kernel_name = "slideup";        break;
+    case SLIDEDOWN:  kernel_name = "slidedown";      break;
+    default:
+        err = AVERROR_BUG;
+        goto fail;
+    }
+
+    ctx->kernel = clCreateKernel(ctx->ocf.program, kernel_name, &cle);
+    CL_FAIL_ON_ERROR(AVERROR(EIO), "Failed to create kernel %d.\n", cle);
+
+    ctx->initialised = 1;
+
+    return 0;
+
+fail:
+    if (ctx->command_queue)
+        clReleaseCommandQueue(ctx->command_queue);
+    if (ctx->kernel)
+        clReleaseKernel(ctx->kernel);
+    return err;
+}
+
+static int xfade_frame(AVFilterContext *avctx, AVFrame *a, AVFrame *b)
+{
+    AVFilterLink *outlink = avctx->outputs[0];
+    XFadeOpenCLContext *ctx = avctx->priv;
+    AVFrame *output;
+    cl_int cle;
+    cl_float progress = av_clipf(1.f - ((cl_float)(ctx->pts - ctx->first_pts - ctx->offset_pts) / ctx->duration_pts), 0.f, 1.f);
+    size_t global_work[2];
+    int kernel_arg = 0;
+    int err, plane;
+
+    if (!ctx->initialised) {
+        AVHWFramesContext *main_fc =
+            (AVHWFramesContext*)a->hw_frames_ctx->data;
+        AVHWFramesContext *xfade_fc =
+            (AVHWFramesContext*)b->hw_frames_ctx->data;
+
+        err = xfade_opencl_load(avctx, main_fc->sw_format,
+                                xfade_fc->sw_format);
+        if (err < 0)
+            return err;
+    }
+
+    output = ff_get_video_buffer(outlink, outlink->w, outlink->h);
+    if (!output) {
+        err = AVERROR(ENOMEM);
+        goto fail;
+    }
+
+    for (plane = 0; plane < ctx->nb_planes; plane++) {
+        cl_mem mem;
+        kernel_arg = 0;
+
+        mem = (cl_mem)output->data[plane];
+        CL_SET_KERNEL_ARG(ctx->kernel, kernel_arg, cl_mem, &mem);
+        kernel_arg++;
+
+        mem = (cl_mem)ctx->xf[0]->data[plane];
+        CL_SET_KERNEL_ARG(ctx->kernel, kernel_arg, cl_mem, &mem);
+        kernel_arg++;
+
+        mem = (cl_mem)ctx->xf[1]->data[plane];
+        CL_SET_KERNEL_ARG(ctx->kernel, kernel_arg, cl_mem, &mem);
+        kernel_arg++;
+
+        CL_SET_KERNEL_ARG(ctx->kernel, kernel_arg, cl_float, &progress);
+        kernel_arg++;
+
+        err = ff_opencl_filter_work_size_from_image(avctx, global_work,
+                                                    output, plane, 0);
+        if (err < 0)
+            goto fail;
+
+        cle = clEnqueueNDRangeKernel(ctx->command_queue, ctx->kernel, 2, NULL,
+                                     global_work, NULL, 0, NULL, NULL);
+        CL_FAIL_ON_ERROR(AVERROR(EIO), "Failed to enqueue xfade kernel "
+                         "for plane %d: %d.\n", plane, cle);
+    }
+
+    cle = clFinish(ctx->command_queue);
+    CL_FAIL_ON_ERROR(AVERROR(EIO), "Failed to finish command queue: %d.\n", cle);
+
+    err = av_frame_copy_props(output, ctx->xf[0]);
+    if (err < 0)
+        goto fail;
+
+    output->pts = ctx->pts;
+
+    return ff_filter_frame(outlink, output);
+
+fail:
+    av_frame_free(&output);
+    return err;
+}
+
+static int xfade_opencl_config_output(AVFilterLink *outlink)
+{
+    AVFilterContext *avctx = outlink->src;
+    XFadeOpenCLContext *ctx = avctx->priv;
+    AVFilterLink *inlink0 = avctx->inputs[0];
+    AVFilterLink *inlink1 = avctx->inputs[1];
+    int err;
+
+    err = ff_opencl_filter_config_output(outlink);
+    if (err < 0)
+        return err;
+
+    if (inlink0->w != inlink1->w || inlink0->h != inlink1->h) {
+        av_log(avctx, AV_LOG_ERROR, "First input link %s parameters "
+               "(size %dx%d) do not match the corresponding "
+               "second input link %s parameters (size %dx%d)\n",
+               avctx->input_pads[0].name, inlink0->w, inlink0->h,
+               avctx->input_pads[1].name, inlink1->w, inlink1->h);
+        return AVERROR(EINVAL);
+    }
+
+    if (inlink0->time_base.num != inlink1->time_base.num ||
+        inlink0->time_base.den != inlink1->time_base.den) {
+        av_log(avctx, AV_LOG_ERROR, "First input link %s timebase "
+               "(%d/%d) do not match the corresponding "
+               "second input link %s timebase (%d/%d)\n",
+               avctx->input_pads[0].name, inlink0->time_base.num, inlink0->time_base.den,
+               avctx->input_pads[1].name, inlink1->time_base.num, inlink1->time_base.den);
+        return AVERROR(EINVAL);
+    }
+
+    ctx->first_pts = ctx->last_pts = ctx->pts = AV_NOPTS_VALUE;
+
+    outlink->time_base = inlink0->time_base;
+    outlink->sample_aspect_ratio = inlink0->sample_aspect_ratio;
+    outlink->frame_rate = inlink0->frame_rate;
+
+    if (ctx->duration)
+        ctx->duration_pts = av_rescale_q(ctx->duration, AV_TIME_BASE_Q, outlink->time_base);
+    if (ctx->offset)
+        ctx->offset_pts = av_rescale_q(ctx->offset, AV_TIME_BASE_Q, outlink->time_base);
+
+    return 0;
+}
+
+static int xfade_opencl_activate(AVFilterContext *avctx)
+{
+    XFadeOpenCLContext *ctx = avctx->priv;
+    AVFilterLink *outlink = avctx->outputs[0];
+    AVFrame *in = NULL;
+    int ret = 0, status;
+    int64_t pts;
+
+    FF_FILTER_FORWARD_STATUS_BACK_ALL(outlink, avctx);
+
+    if (ctx->xfade_is_over) {
+        ret = ff_inlink_consume_frame(avctx->inputs[1], &in);
+        if (ret < 0) {
+            return ret;
+        } else if (ret > 0) {
+            in->pts = (in->pts - ctx->last_pts) + ctx->pts;
+            return ff_filter_frame(outlink, in);
+        } else if (ff_inlink_acknowledge_status(avctx->inputs[1], &status, &pts)) {
+            ff_outlink_set_status(outlink, status, ctx->pts);
+            return 0;
+        } else if (!ret) {
+            if (ff_outlink_frame_wanted(outlink)) {
+                ff_inlink_request_frame(avctx->inputs[1]);
+                return 0;
+            }
+        }
+    }
+
+    if (ff_inlink_queued_frames(avctx->inputs[0]) > 0) {
+        ctx->xf[0] = ff_inlink_peek_frame(avctx->inputs[0], 0);
+        if (ctx->xf[0]) {
+            if (ctx->first_pts == AV_NOPTS_VALUE) {
+                ctx->first_pts = ctx->xf[0]->pts;
+            }
+            ctx->pts = ctx->xf[0]->pts;
+            if (ctx->first_pts + ctx->offset_pts > ctx->xf[0]->pts) {
+                ctx->xf[0] = NULL;
+                ctx->need_second = 0;
+                ff_inlink_consume_frame(avctx->inputs[0], &in);
+                return ff_filter_frame(outlink, in);
+            }
+
+            ctx->need_second = 1;
+        }
+    }
+
+    if (ctx->xf[0] && ff_inlink_queued_frames(avctx->inputs[1]) > 0) {
+        ff_inlink_consume_frame(avctx->inputs[0], &ctx->xf[0]);
+        ff_inlink_consume_frame(avctx->inputs[1], &ctx->xf[1]);
+
+        ctx->last_pts = ctx->xf[1]->pts;
+        ctx->pts = ctx->xf[0]->pts;
+        if (ctx->xf[0]->pts - (ctx->first_pts + ctx->offset_pts) > ctx->duration_pts)
+            ctx->xfade_is_over = 1;
+        ret = xfade_frame(avctx, ctx->xf[0], ctx->xf[1]);
+        av_frame_free(&ctx->xf[0]);
+        av_frame_free(&ctx->xf[1]);
+        return ret;
+    }
+
+    if (ff_inlink_queued_frames(avctx->inputs[0]) > 0 &&
+        ff_inlink_queued_frames(avctx->inputs[1]) > 0) {
+        ff_filter_set_ready(avctx, 100);
+        return 0;
+    }
+
+    if (ff_outlink_frame_wanted(outlink)) {
+        if (!ctx->eof[0] && ff_outlink_get_status(avctx->inputs[0])) {
+            ctx->eof[0] = 1;
+            ctx->xfade_is_over = 1;
+        }
+        if (!ctx->eof[1] && ff_outlink_get_status(avctx->inputs[1])) {
+            ctx->eof[1] = 1;
+        }
+        if (!ctx->eof[0] && !ctx->xf[0])
+            ff_inlink_request_frame(avctx->inputs[0]);
+        if (!ctx->eof[1] && (ctx->need_second || ctx->eof[0]))
+            ff_inlink_request_frame(avctx->inputs[1]);
+        if (ctx->eof[0] && ctx->eof[1] && (
+            ff_inlink_queued_frames(avctx->inputs[0]) <= 0 ||
+            ff_inlink_queued_frames(avctx->inputs[1]) <= 0))
+            ff_outlink_set_status(outlink, AVERROR_EOF, AV_NOPTS_VALUE);
+        return 0;
+    }
+
+    return FFERROR_NOT_READY;
+}
+
+static av_cold void xfade_opencl_uninit(AVFilterContext *avctx)
+{
+    XFadeOpenCLContext *ctx = avctx->priv;
+    cl_int cle;
+
+    if (ctx->kernel) {
+        cle = clReleaseKernel(ctx->kernel);
+        if (cle != CL_SUCCESS)
+            av_log(avctx, AV_LOG_ERROR, "Failed to release "
+                   "kernel: %d.\n", cle);
+    }
+
+    if (ctx->command_queue) {
+        cle = clReleaseCommandQueue(ctx->command_queue);
+        if (cle != CL_SUCCESS)
+            av_log(avctx, AV_LOG_ERROR, "Failed to release "
+                   "command queue: %d.\n", cle);
+    }
+
+    ff_opencl_filter_uninit(avctx);
+}
+
+static AVFrame *get_video_buffer(AVFilterLink *inlink, int w, int h)
+{
+    XFadeOpenCLContext *s = inlink->dst->priv;
+
+    return s->xfade_is_over || !s->need_second ?
+        ff_null_get_video_buffer   (inlink, w, h) :
+        ff_default_get_video_buffer(inlink, w, h);
+}
+
+#define OFFSET(x) offsetof(XFadeOpenCLContext, x)
+#define FLAGS (AV_OPT_FLAG_FILTERING_PARAM | AV_OPT_FLAG_VIDEO_PARAM)
+
+static const AVOption xfade_opencl_options[] = {
+    { "transition", "set cross fade transition", OFFSET(transition), AV_OPT_TYPE_INT, {.i64=1}, 0, NB_TRANSITIONS-1, FLAGS, "transition" },
+    {   "custom",    "custom transition",     0, AV_OPT_TYPE_CONST, {.i64=CUSTOM},    0, 0, FLAGS, "transition" },
+    {   "fade",      "fade transition",       0, AV_OPT_TYPE_CONST, {.i64=FADE},      0, 0, FLAGS, "transition" },
+    {   "wipeleft",  "wipe left transition",  0, AV_OPT_TYPE_CONST, {.i64=WIPELEFT},  0, 0, FLAGS, "transition" },
+    {   "wiperight", "wipe right transition", 0, AV_OPT_TYPE_CONST, {.i64=WIPERIGHT}, 0, 0, FLAGS, "transition" },
+    {   "wipeup",    "wipe up transition",    0, AV_OPT_TYPE_CONST, {.i64=WIPEUP},    0, 0, FLAGS, "transition" },
+    {   "wipedown",  "wipe down transition",  0, AV_OPT_TYPE_CONST, {.i64=WIPEDOWN},  0, 0, FLAGS, "transition" },
+    {   "slideleft",  "slide left transition",  0, AV_OPT_TYPE_CONST, {.i64=SLIDELEFT},  0, 0, FLAGS, "transition" },
+    {   "slideright", "slide right transition", 0, AV_OPT_TYPE_CONST, {.i64=SLIDERIGHT}, 0, 0, FLAGS, "transition" },
+    {   "slideup",    "slide up transition",    0, AV_OPT_TYPE_CONST, {.i64=SLIDEUP},    0, 0, FLAGS, "transition" },
+    {   "slidedown",  "slide down transition",  0, AV_OPT_TYPE_CONST, {.i64=SLIDEDOWN},  0, 0, FLAGS, "transition" },
+    { "source", "set OpenCL program source file for custom transition", OFFSET(source_file), AV_OPT_TYPE_STRING, {.str = NULL}, .flags = FLAGS },
+    { "kernel", "set kernel name in program file for custom transition", OFFSET(kernel_name), AV_OPT_TYPE_STRING, {.str = NULL}, .flags = FLAGS },
+    { "duration", "set cross fade duration", OFFSET(duration), AV_OPT_TYPE_DURATION, {.i64=1000000}, 0, 60000000, FLAGS },
+    { "offset",   "set cross fade start relative to first input stream", OFFSET(offset), AV_OPT_TYPE_DURATION, {.i64=0}, INT64_MIN, INT64_MAX, FLAGS },
+    { NULL }
+};
+
+AVFILTER_DEFINE_CLASS(xfade_opencl);
+
+static const AVFilterPad xfade_opencl_inputs[] = {
+    {
+        .name             = "main",
+        .type             = AVMEDIA_TYPE_VIDEO,
+        .get_video_buffer = get_video_buffer,
+        .config_props     = &ff_opencl_filter_config_input,
+    },
+    {
+        .name             = "xfade",
+        .type             = AVMEDIA_TYPE_VIDEO,
+        .get_video_buffer = get_video_buffer,
+        .config_props     = &ff_opencl_filter_config_input,
+    },
+    { NULL }
+};
+
+static const AVFilterPad xfade_opencl_outputs[] = {
+    {
+        .name          = "default",
+        .type          = AVMEDIA_TYPE_VIDEO,
+        .config_props  = &xfade_opencl_config_output,
+    },
+    { NULL }
+};
+
+AVFilter ff_vf_xfade_opencl = {
+    .name            = "xfade_opencl",
+    .description     = NULL_IF_CONFIG_SMALL("Cross fade one video with another video."),
+    .priv_size       = sizeof(XFadeOpenCLContext),
+    .priv_class      = &xfade_opencl_class,
+    .init            = &ff_opencl_filter_init,
+    .uninit          = &xfade_opencl_uninit,
+    .query_formats   = &ff_opencl_filter_query_formats,
+    .activate        = &xfade_opencl_activate,
+    .inputs          = xfade_opencl_inputs,
+    .outputs         = xfade_opencl_outputs,
+    .flags_internal  = FF_FILTER_FLAG_HWFRAME_AWARE,
+};
diff --git a/libavfilter/vf_xmedian.c b/libavfilter/vf_xmedian.c
new file mode 100644
index 0000000..15857d6
--- /dev/null
+++ b/libavfilter/vf_xmedian.c
@@ -0,0 +1,463 @@
+/*
+ * Copyright (c) 2019 Paul B Mahol
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "libavutil/avstring.h"
+#include "libavutil/imgutils.h"
+#include "libavutil/intreadwrite.h"
+#include "libavutil/opt.h"
+#include "libavutil/pixdesc.h"
+#include "libavutil/qsort.h"
+
+#include "avfilter.h"
+#include "formats.h"
+#include "internal.h"
+#include "framesync.h"
+#include "video.h"
+
+typedef struct XMedianContext {
+    const AVClass *class;
+    const AVPixFmtDescriptor *desc;
+    int nb_inputs;
+    int nb_frames;
+    int planes;
+    float percentile;
+
+    int tmedian;
+    int radius;
+    int index;
+    int depth;
+    int max;
+    int nb_planes;
+    int linesize[4];
+    int width[4];
+    int height[4];
+
+    AVFrame **frames;
+    FFFrameSync fs;
+
+    int (*median_frames)(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs);
+} XMedianContext;
+
+static int query_formats(AVFilterContext *ctx)
+{
+    static const enum AVPixelFormat pixel_fmts[] = {
+        AV_PIX_FMT_GRAY8,
+        AV_PIX_FMT_GRAY9,
+        AV_PIX_FMT_GRAY10,
+        AV_PIX_FMT_GRAY12,
+        AV_PIX_FMT_GRAY14,
+        AV_PIX_FMT_GRAY16,
+        AV_PIX_FMT_YUV410P, AV_PIX_FMT_YUV411P,
+        AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUV422P,
+        AV_PIX_FMT_YUV440P, AV_PIX_FMT_YUV444P,
+        AV_PIX_FMT_YUVJ420P, AV_PIX_FMT_YUVJ422P,
+        AV_PIX_FMT_YUVJ440P, AV_PIX_FMT_YUVJ444P,
+        AV_PIX_FMT_YUVJ411P,
+        AV_PIX_FMT_YUV420P9, AV_PIX_FMT_YUV422P9, AV_PIX_FMT_YUV444P9,
+        AV_PIX_FMT_YUV420P10, AV_PIX_FMT_YUV422P10, AV_PIX_FMT_YUV444P10,
+        AV_PIX_FMT_YUV440P10,
+        AV_PIX_FMT_YUV444P12, AV_PIX_FMT_YUV422P12, AV_PIX_FMT_YUV420P12,
+        AV_PIX_FMT_YUV440P12,
+        AV_PIX_FMT_YUV444P14, AV_PIX_FMT_YUV422P14, AV_PIX_FMT_YUV420P14,
+        AV_PIX_FMT_YUV420P16, AV_PIX_FMT_YUV422P16, AV_PIX_FMT_YUV444P16,
+        AV_PIX_FMT_GBRP, AV_PIX_FMT_GBRP9, AV_PIX_FMT_GBRP10,
+        AV_PIX_FMT_GBRP12, AV_PIX_FMT_GBRP14, AV_PIX_FMT_GBRP16,
+        AV_PIX_FMT_YUVA420P,  AV_PIX_FMT_YUVA422P,   AV_PIX_FMT_YUVA444P,
+        AV_PIX_FMT_YUVA444P9, AV_PIX_FMT_YUVA444P10, AV_PIX_FMT_YUVA444P12, AV_PIX_FMT_YUVA444P16,
+        AV_PIX_FMT_YUVA422P9, AV_PIX_FMT_YUVA422P10, AV_PIX_FMT_YUVA422P12, AV_PIX_FMT_YUVA422P16,
+        AV_PIX_FMT_YUVA420P9, AV_PIX_FMT_YUVA420P10, AV_PIX_FMT_YUVA420P16,
+        AV_PIX_FMT_GBRAP,     AV_PIX_FMT_GBRAP10,    AV_PIX_FMT_GBRAP12,    AV_PIX_FMT_GBRAP16,
+        AV_PIX_FMT_NONE
+    };
+    AVFilterFormats *formats = ff_make_format_list(pixel_fmts);
+    if (!formats)
+        return AVERROR(ENOMEM);
+    return ff_set_common_formats(ctx, formats);
+}
+
+static av_cold int init(AVFilterContext *ctx)
+{
+    XMedianContext *s = ctx->priv;
+    int ret;
+
+    s->tmedian = !strcmp(ctx->filter->name, "tmedian");
+
+    if (!s->tmedian) {
+        s->radius = s->nb_inputs / 2;
+    } else {
+        s->nb_inputs = s->radius * 2 + 1;
+    }
+
+    if (s->nb_inputs & 1)
+        s->index = s->radius * 2.f * s->percentile;
+    else
+        s->index = av_clip(s->radius * 2.f * s->percentile, 1, s->nb_inputs - 1);
+    s->frames = av_calloc(s->nb_inputs, sizeof(*s->frames));
+    if (!s->frames)
+        return AVERROR(ENOMEM);
+
+    for (int i = 0; i < s->nb_inputs && !s->tmedian; i++) {
+        AVFilterPad pad = { 0 };
+
+        pad.type = AVMEDIA_TYPE_VIDEO;
+        pad.name = av_asprintf("input%d", i);
+        if (!pad.name)
+            return AVERROR(ENOMEM);
+
+        if ((ret = ff_insert_inpad(ctx, i, &pad)) < 0) {
+            av_freep(&pad.name);
+            return ret;
+        }
+    }
+
+    return 0;
+}
+
+typedef struct ThreadData {
+    AVFrame **in, *out;
+} ThreadData;
+
+static int comparei(const void *p1, const void *p2)
+{
+    int left  = *(const int *)p1;
+    int right = *(const int *)p2;
+    return FFDIFFSIGN(left, right);
+}
+
+static int median_frames16(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
+{
+    XMedianContext *s = ctx->priv;
+    ThreadData *td = arg;
+    AVFrame **in = td->in;
+    AVFrame *out = td->out;
+    const int nb_inputs = s->nb_inputs;
+    const int radius = s->radius;
+    const int index = s->index;
+    int values[256];
+
+    for (int p = 0; p < s->nb_planes; p++) {
+        const int slice_start = (s->height[p] * jobnr) / nb_jobs;
+        const int slice_end = (s->height[p] * (jobnr+1)) / nb_jobs;
+        uint16_t *dst = (uint16_t *)(out->data[p] + slice_start * out->linesize[p]);
+
+        if (!((1 << p) & s->planes)) {
+            av_image_copy_plane((uint8_t *)dst, out->linesize[p],
+                                in[radius]->data[p] + slice_start * in[radius]->linesize[p],
+                                in[radius]->linesize[p],
+                                s->linesize[p], slice_end - slice_start);
+            continue;
+        }
+
+        for (int y = slice_start; y < slice_end; y++) {
+            for (int x = 0; x < s->width[p]; x++) {
+                for (int i = 0; i < nb_inputs; i++) {
+                    const uint16_t *src = (const uint16_t *)(in[i]->data[p] + y * in[i]->linesize[p]);
+                    values[i] = src[x];
+                }
+
+                AV_QSORT(values, nb_inputs, int, comparei);
+                if (nb_inputs & 1)
+                    dst[x] = values[index];
+                else
+                    dst[x] = (values[index] + values[index - 1]) >> 1;
+            }
+
+            dst += out->linesize[p] / 2;
+        }
+    }
+
+    return 0;
+}
+
+static int median_frames8(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
+{
+    XMedianContext *s = ctx->priv;
+    ThreadData *td = arg;
+    AVFrame **in = td->in;
+    AVFrame *out = td->out;
+    const int nb_inputs = s->nb_inputs;
+    const int radius = s->radius;
+    const int index = s->index;
+    int values[256];
+
+    for (int p = 0; p < s->nb_planes; p++) {
+        const int slice_start = (s->height[p] * jobnr) / nb_jobs;
+        const int slice_end = (s->height[p] * (jobnr+1)) / nb_jobs;
+        uint8_t *dst = out->data[p] + slice_start * out->linesize[p];
+
+        if (!((1 << p) & s->planes)) {
+            av_image_copy_plane(dst, out->linesize[p],
+                                in[radius]->data[p] + slice_start * in[radius]->linesize[p],
+                                in[radius]->linesize[p],
+                                s->linesize[p], slice_end - slice_start);
+            continue;
+        }
+
+        for (int y = slice_start; y < slice_end; y++) {
+            for (int x = 0; x < s->width[p]; x++) {
+                for (int i = 0; i < nb_inputs; i++)
+                    values[i] = in[i]->data[p][y * in[i]->linesize[p] + x];
+
+                AV_QSORT(values, nb_inputs, int, comparei);
+                if (nb_inputs & 1)
+                    dst[x] = values[index];
+                else
+                    dst[x] = (values[index] + values[index - 1]) >> 1;
+            }
+
+            dst += out->linesize[p];
+        }
+    }
+
+    return 0;
+}
+
+static int process_frame(FFFrameSync *fs)
+{
+    AVFilterContext *ctx = fs->parent;
+    AVFilterLink *outlink = ctx->outputs[0];
+    XMedianContext *s = fs->opaque;
+    AVFrame **in = s->frames;
+    AVFrame *out;
+    ThreadData td;
+    int i, ret;
+
+    for (i = 0; i < s->nb_inputs; i++) {
+        if ((ret = ff_framesync_get_frame(&s->fs, i, &in[i], 0)) < 0)
+            return ret;
+    }
+
+    out = ff_get_video_buffer(outlink, outlink->w, outlink->h);
+    if (!out)
+        return AVERROR(ENOMEM);
+    out->pts = av_rescale_q(s->fs.pts, s->fs.time_base, outlink->time_base);
+
+    td.in = in;
+    td.out = out;
+    ctx->internal->execute(ctx, s->median_frames, &td, NULL, FFMIN(s->height[1], ff_filter_get_nb_threads(ctx)));
+
+    return ff_filter_frame(outlink, out);
+}
+
+static int config_output(AVFilterLink *outlink)
+{
+    AVFilterContext *ctx = outlink->src;
+    XMedianContext *s = ctx->priv;
+    AVRational frame_rate = ctx->inputs[0]->frame_rate;
+    AVRational sar = ctx->inputs[0]->sample_aspect_ratio;
+    AVFilterLink *inlink = ctx->inputs[0];
+    int height = ctx->inputs[0]->h;
+    int width = ctx->inputs[0]->w;
+    FFFrameSyncIn *in;
+    int i, ret;
+
+    for (int i = 1; i < s->nb_inputs && !s->tmedian; i++) {
+        if (ctx->inputs[i]->h != height || ctx->inputs[i]->w != width) {
+            av_log(ctx, AV_LOG_ERROR, "Input %d size (%dx%d) does not match input %d size (%dx%d).\n", i, ctx->inputs[i]->w, ctx->inputs[i]->h, 0, width, height);
+            return AVERROR(EINVAL);
+        }
+    }
+
+    s->desc = av_pix_fmt_desc_get(outlink->format);
+    if (!s->desc)
+        return AVERROR_BUG;
+    s->nb_planes = av_pix_fmt_count_planes(outlink->format);
+    s->depth = s->desc->comp[0].depth;
+    s->max = (1 << s->depth) - 1;
+
+    if (s->depth <= 8)
+        s->median_frames = median_frames8;
+    else
+        s->median_frames = median_frames16;
+
+    if ((ret = av_image_fill_linesizes(s->linesize, inlink->format, inlink->w)) < 0)
+        return ret;
+
+    s->width[1] = s->width[2] = AV_CEIL_RSHIFT(inlink->w, s->desc->log2_chroma_w);
+    s->width[0] = s->width[3] = inlink->w;
+    s->height[1] = s->height[2] = AV_CEIL_RSHIFT(inlink->h, s->desc->log2_chroma_h);
+    s->height[0] = s->height[3] = inlink->h;
+
+    if (s->tmedian)
+        return 0;
+
+    outlink->w          = width;
+    outlink->h          = height;
+    outlink->frame_rate = frame_rate;
+    outlink->sample_aspect_ratio = sar;
+
+    if ((ret = ff_framesync_init(&s->fs, ctx, s->nb_inputs)) < 0)
+        return ret;
+
+    in = s->fs.in;
+    s->fs.opaque = s;
+    s->fs.on_event = process_frame;
+
+    for (i = 0; i < s->nb_inputs; i++) {
+        AVFilterLink *inlink = ctx->inputs[i];
+
+        in[i].time_base = inlink->time_base;
+        in[i].sync   = 1;
+        in[i].before = EXT_STOP;
+        in[i].after  = EXT_STOP;
+    }
+
+    ret = ff_framesync_configure(&s->fs);
+    outlink->time_base = s->fs.time_base;
+
+    return ret;
+}
+
+static av_cold void uninit(AVFilterContext *ctx)
+{
+    XMedianContext *s = ctx->priv;
+
+    ff_framesync_uninit(&s->fs);
+
+    for (int i = 0; i < ctx->nb_inputs && !s->tmedian; i++)
+        av_freep(&ctx->input_pads[i].name);
+    for (int i = 0; i < s->nb_frames && s->frames && s->tmedian; i++)
+        av_frame_free(&s->frames[i]);
+    av_freep(&s->frames);
+}
+
+static int activate(AVFilterContext *ctx)
+{
+    XMedianContext *s = ctx->priv;
+    return ff_framesync_activate(&s->fs);
+}
+
+#define OFFSET(x) offsetof(XMedianContext, x)
+#define FLAGS AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_FILTERING_PARAM
+
+static const AVOption xmedian_options[] = {
+    { "inputs", "set number of inputs", OFFSET(nb_inputs), AV_OPT_TYPE_INT, {.i64=3},  3, 255, .flags = FLAGS },
+    { "planes", "set planes to filter", OFFSET(planes),    AV_OPT_TYPE_INT, {.i64=15}, 0,  15, .flags = FLAGS },
+    { "percentile", "set percentile",   OFFSET(percentile),AV_OPT_TYPE_FLOAT,{.dbl=0.5}, 0, 1, .flags = FLAGS },
+    { NULL },
+};
+
+static const AVFilterPad outputs[] = {
+    {
+        .name          = "default",
+        .type          = AVMEDIA_TYPE_VIDEO,
+        .config_props  = config_output,
+    },
+    { NULL }
+};
+
+#if CONFIG_XMEDIAN_FILTER
+AVFILTER_DEFINE_CLASS(xmedian);
+
+AVFilter ff_vf_xmedian = {
+    .name          = "xmedian",
+    .description   = NULL_IF_CONFIG_SMALL("Pick median pixels from several video inputs."),
+    .priv_size     = sizeof(XMedianContext),
+    .priv_class    = &xmedian_class,
+    .query_formats = query_formats,
+    .outputs       = outputs,
+    .init          = init,
+    .uninit        = uninit,
+    .activate      = activate,
+    .flags         = AVFILTER_FLAG_DYNAMIC_INPUTS | AVFILTER_FLAG_SLICE_THREADS,
+};
+
+#endif /* CONFIG_XMEDIAN_FILTER */
+
+#if CONFIG_TMEDIAN_FILTER
+static int tmedian_filter_frame(AVFilterLink *inlink, AVFrame *in)
+{
+    AVFilterContext *ctx = inlink->dst;
+    AVFilterLink *outlink = ctx->outputs[0];
+    XMedianContext *s = ctx->priv;
+    ThreadData td;
+    AVFrame *out;
+
+    if (s->nb_frames < s->nb_inputs) {
+        s->frames[s->nb_frames] = in;
+        s->nb_frames++;
+        if (s->nb_frames < s->nb_inputs)
+            return 0;
+    } else {
+        av_frame_free(&s->frames[0]);
+        memmove(&s->frames[0], &s->frames[1], sizeof(*s->frames) * (s->nb_inputs - 1));
+        s->frames[s->nb_inputs - 1] = in;
+    }
+
+    if (ctx->is_disabled) {
+        out = av_frame_clone(s->frames[0]);
+        if (!out)
+            return AVERROR(ENOMEM);
+        return ff_filter_frame(outlink, out);
+    }
+
+    out = ff_get_video_buffer(outlink, outlink->w, outlink->h);
+    if (!out)
+        return AVERROR(ENOMEM);
+    out->pts = s->frames[0]->pts;
+
+    td.out = out;
+    td.in = s->frames;
+    ctx->internal->execute(ctx, s->median_frames, &td, NULL, FFMIN(s->height[0], ff_filter_get_nb_threads(ctx)));
+
+    return ff_filter_frame(outlink, out);
+}
+
+static const AVOption tmedian_options[] = {
+    { "radius",     "set median filter radius", OFFSET(radius),     AV_OPT_TYPE_INT,   {.i64=1},   1, 127, .flags = FLAGS },
+    { "planes",     "set planes to filter",     OFFSET(planes),     AV_OPT_TYPE_INT,   {.i64=15},  0,  15, .flags = FLAGS },
+    { "percentile", "set percentile",           OFFSET(percentile), AV_OPT_TYPE_FLOAT, {.dbl=0.5}, 0,   1, .flags = FLAGS },
+    { NULL },
+};
+
+static const AVFilterPad tmedian_inputs[] = {
+    {
+        .name          = "default",
+        .type          = AVMEDIA_TYPE_VIDEO,
+        .filter_frame  = tmedian_filter_frame,
+    },
+    { NULL }
+};
+
+static const AVFilterPad tmedian_outputs[] = {
+    {
+        .name          = "default",
+        .type          = AVMEDIA_TYPE_VIDEO,
+        .config_props  = config_output,
+    },
+    { NULL }
+};
+
+AVFILTER_DEFINE_CLASS(tmedian);
+
+AVFilter ff_vf_tmedian = {
+    .name          = "tmedian",
+    .description   = NULL_IF_CONFIG_SMALL("Pick median pixels from successive frames."),
+    .priv_size     = sizeof(XMedianContext),
+    .priv_class    = &tmedian_class,
+    .query_formats = query_formats,
+    .inputs        = tmedian_inputs,
+    .outputs       = tmedian_outputs,
+    .init          = init,
+    .uninit        = uninit,
+    .flags         = AVFILTER_FLAG_SUPPORT_TIMELINE_INTERNAL | AVFILTER_FLAG_SLICE_THREADS,
+};
+
+#endif /* CONFIG_TMEDIAN_FILTER */
diff --git a/libavfilter/vf_yadif.c b/libavfilter/vf_yadif.c
index f58d8ac..43dea67 100644
--- a/libavfilter/vf_yadif.c
+++ b/libavfilter/vf_yadif.c
@@ -22,7 +22,6 @@
 #include "libavutil/avassert.h"
 #include "libavutil/cpu.h"
 #include "libavutil/common.h"
-#include "libavutil/opt.h"
 #include "libavutil/pixdesc.h"
 #include "libavutil/imgutils.h"
 #include "avfilter.h"
@@ -254,166 +253,6 @@
     emms_c();
 }
 
-static int return_frame(AVFilterContext *ctx, int is_second)
-{
-    YADIFContext *yadif = ctx->priv;
-    AVFilterLink *link  = ctx->outputs[0];
-    int tff, ret;
-
-    if (yadif->parity == -1) {
-        tff = yadif->cur->interlaced_frame ?
-              yadif->cur->top_field_first : 1;
-    } else {
-        tff = yadif->parity ^ 1;
-    }
-
-    if (is_second) {
-        yadif->out = ff_get_video_buffer(link, link->w, link->h);
-        if (!yadif->out)
-            return AVERROR(ENOMEM);
-
-        av_frame_copy_props(yadif->out, yadif->cur);
-        yadif->out->interlaced_frame = 0;
-    }
-
-    filter(ctx, yadif->out, tff ^ !is_second, tff);
-
-    if (is_second) {
-        int64_t cur_pts  = yadif->cur->pts;
-        int64_t next_pts = yadif->next->pts;
-
-        if (next_pts != AV_NOPTS_VALUE && cur_pts != AV_NOPTS_VALUE) {
-            yadif->out->pts = cur_pts + next_pts;
-        } else {
-            yadif->out->pts = AV_NOPTS_VALUE;
-        }
-    }
-    ret = ff_filter_frame(ctx->outputs[0], yadif->out);
-
-    yadif->frame_pending = (yadif->mode&1) && !is_second;
-    return ret;
-}
-
-static int checkstride(YADIFContext *yadif, const AVFrame *a, const AVFrame *b)
-{
-    int i;
-    for (i = 0; i < yadif->csp->nb_components; i++)
-        if (a->linesize[i] != b->linesize[i])
-            return 1;
-    return 0;
-}
-
-static void fixstride(AVFilterLink *link, AVFrame *f)
-{
-    AVFrame *dst = ff_default_get_video_buffer(link, f->width, f->height);
-    if(!dst)
-        return;
-    av_frame_copy_props(dst, f);
-    av_image_copy(dst->data, dst->linesize,
-                  (const uint8_t **)f->data, f->linesize,
-                  dst->format, dst->width, dst->height);
-    av_frame_unref(f);
-    av_frame_move_ref(f, dst);
-    av_frame_free(&dst);
-}
-
-static int filter_frame(AVFilterLink *link, AVFrame *frame)
-{
-    AVFilterContext *ctx = link->dst;
-    YADIFContext *yadif = ctx->priv;
-
-    av_assert0(frame);
-
-    if (yadif->frame_pending)
-        return_frame(ctx, 1);
-
-    if (yadif->prev)
-        av_frame_free(&yadif->prev);
-    yadif->prev = yadif->cur;
-    yadif->cur  = yadif->next;
-    yadif->next = frame;
-
-    if (!yadif->cur &&
-        !(yadif->cur = av_frame_clone(yadif->next)))
-        return AVERROR(ENOMEM);
-
-    if (checkstride(yadif, yadif->next, yadif->cur)) {
-        av_log(ctx, AV_LOG_VERBOSE, "Reallocating frame due to differing stride\n");
-        fixstride(link, yadif->next);
-    }
-    if (checkstride(yadif, yadif->next, yadif->cur))
-        fixstride(link, yadif->cur);
-    if (yadif->prev && checkstride(yadif, yadif->next, yadif->prev))
-        fixstride(link, yadif->prev);
-    if (checkstride(yadif, yadif->next, yadif->cur) || (yadif->prev && checkstride(yadif, yadif->next, yadif->prev))) {
-        av_log(ctx, AV_LOG_ERROR, "Failed to reallocate frame\n");
-        return -1;
-    }
-
-    if (!yadif->prev)
-        return 0;
-
-    if ((yadif->deint && !yadif->cur->interlaced_frame) ||
-        ctx->is_disabled ||
-        (yadif->deint && !yadif->prev->interlaced_frame && yadif->prev->repeat_pict) ||
-        (yadif->deint && !yadif->next->interlaced_frame && yadif->next->repeat_pict)
-    ) {
-        yadif->out  = av_frame_clone(yadif->cur);
-        if (!yadif->out)
-            return AVERROR(ENOMEM);
-
-        av_frame_free(&yadif->prev);
-        if (yadif->out->pts != AV_NOPTS_VALUE)
-            yadif->out->pts *= 2;
-        return ff_filter_frame(ctx->outputs[0], yadif->out);
-    }
-
-    yadif->out = ff_get_video_buffer(ctx->outputs[0], link->w, link->h);
-    if (!yadif->out)
-        return AVERROR(ENOMEM);
-
-    av_frame_copy_props(yadif->out, yadif->cur);
-    yadif->out->interlaced_frame = 0;
-
-    if (yadif->out->pts != AV_NOPTS_VALUE)
-        yadif->out->pts *= 2;
-
-    return return_frame(ctx, 0);
-}
-
-static int request_frame(AVFilterLink *link)
-{
-    AVFilterContext *ctx = link->src;
-    YADIFContext *yadif = ctx->priv;
-    int ret;
-
-    if (yadif->frame_pending) {
-        return_frame(ctx, 1);
-        return 0;
-    }
-
-    if (yadif->eof)
-        return AVERROR_EOF;
-
-    ret  = ff_request_frame(ctx->inputs[0]);
-
-    if (ret == AVERROR_EOF && yadif->cur) {
-        AVFrame *next = av_frame_clone(yadif->next);
-
-        if (!next)
-            return AVERROR(ENOMEM);
-
-        next->pts = yadif->next->pts * 2 - yadif->cur->pts;
-
-        filter_frame(ctx->inputs[0], next);
-        yadif->eof = 1;
-    } else if (ret < 0) {
-        return ret;
-    }
-
-    return 0;
-}
-
 static av_cold void uninit(AVFilterContext *ctx)
 {
     YADIFContext *yadif = ctx->priv;
@@ -426,42 +265,19 @@
 static int query_formats(AVFilterContext *ctx)
 {
     static const enum AVPixelFormat pix_fmts[] = {
-        AV_PIX_FMT_YUV420P,
-        AV_PIX_FMT_YUV422P,
-        AV_PIX_FMT_YUV444P,
-        AV_PIX_FMT_YUV410P,
-        AV_PIX_FMT_YUV411P,
-        AV_PIX_FMT_GRAY8,
-        AV_PIX_FMT_YUVJ420P,
-        AV_PIX_FMT_YUVJ422P,
-        AV_PIX_FMT_YUVJ444P,
-        AV_PIX_FMT_GRAY16,
-        AV_PIX_FMT_YUV440P,
+        AV_PIX_FMT_YUV420P,   AV_PIX_FMT_YUV422P,   AV_PIX_FMT_YUV444P,
+        AV_PIX_FMT_YUV410P,   AV_PIX_FMT_YUV411P,   AV_PIX_FMT_YUV440P,
+        AV_PIX_FMT_GRAY8,     AV_PIX_FMT_GRAY16,
+        AV_PIX_FMT_YUVJ420P,  AV_PIX_FMT_YUVJ422P,  AV_PIX_FMT_YUVJ444P,
         AV_PIX_FMT_YUVJ440P,
-        AV_PIX_FMT_YUV420P9,
-        AV_PIX_FMT_YUV422P9,
-        AV_PIX_FMT_YUV444P9,
-        AV_PIX_FMT_YUV420P10,
-        AV_PIX_FMT_YUV422P10,
-        AV_PIX_FMT_YUV444P10,
-        AV_PIX_FMT_YUV420P12,
-        AV_PIX_FMT_YUV422P12,
-        AV_PIX_FMT_YUV444P12,
-        AV_PIX_FMT_YUV420P14,
-        AV_PIX_FMT_YUV422P14,
-        AV_PIX_FMT_YUV444P14,
-        AV_PIX_FMT_YUV420P16,
-        AV_PIX_FMT_YUV422P16,
-        AV_PIX_FMT_YUV444P16,
-        AV_PIX_FMT_YUVA420P,
-        AV_PIX_FMT_YUVA422P,
-        AV_PIX_FMT_YUVA444P,
-        AV_PIX_FMT_GBRP,
-        AV_PIX_FMT_GBRP9,
-        AV_PIX_FMT_GBRP10,
-        AV_PIX_FMT_GBRP12,
-        AV_PIX_FMT_GBRP14,
-        AV_PIX_FMT_GBRP16,
+        AV_PIX_FMT_YUV420P9,  AV_PIX_FMT_YUV422P9,  AV_PIX_FMT_YUV444P9,
+        AV_PIX_FMT_YUV420P10, AV_PIX_FMT_YUV422P10, AV_PIX_FMT_YUV444P10,
+        AV_PIX_FMT_YUV420P12, AV_PIX_FMT_YUV422P12, AV_PIX_FMT_YUV444P12,
+        AV_PIX_FMT_YUV420P14, AV_PIX_FMT_YUV422P14, AV_PIX_FMT_YUV444P14,
+        AV_PIX_FMT_YUV420P16, AV_PIX_FMT_YUV422P16, AV_PIX_FMT_YUV444P16,
+        AV_PIX_FMT_YUVA420P,  AV_PIX_FMT_YUVA422P,  AV_PIX_FMT_YUVA444P,
+        AV_PIX_FMT_GBRP,      AV_PIX_FMT_GBRP9,     AV_PIX_FMT_GBRP10,
+        AV_PIX_FMT_GBRP12,    AV_PIX_FMT_GBRP14,    AV_PIX_FMT_GBRP16,
         AV_PIX_FMT_GBRAP,
         AV_PIX_FMT_NONE
     };
@@ -472,26 +288,27 @@
     return ff_set_common_formats(ctx, fmts_list);
 }
 
-static int config_props(AVFilterLink *link)
+static int config_output(AVFilterLink *outlink)
 {
-    AVFilterContext *ctx = link->src;
+    AVFilterContext *ctx = outlink->src;
     YADIFContext *s = ctx->priv;
 
-    link->time_base.num = ctx->inputs[0]->time_base.num;
-    link->time_base.den = ctx->inputs[0]->time_base.den * 2;
-    link->w             = ctx->inputs[0]->w;
-    link->h             = ctx->inputs[0]->h;
+    outlink->time_base.num = ctx->inputs[0]->time_base.num;
+    outlink->time_base.den = ctx->inputs[0]->time_base.den * 2;
+    outlink->w             = ctx->inputs[0]->w;
+    outlink->h             = ctx->inputs[0]->h;
 
     if(s->mode & 1)
-        link->frame_rate = av_mul_q(ctx->inputs[0]->frame_rate,
+        outlink->frame_rate = av_mul_q(ctx->inputs[0]->frame_rate,
                                     (AVRational){2, 1});
 
-    if (link->w < 3 || link->h < 3) {
+    if (outlink->w < 3 || outlink->h < 3) {
         av_log(ctx, AV_LOG_ERROR, "Video of less than 3 columns or lines is not supported\n");
         return AVERROR(EINVAL);
     }
 
-    s->csp = av_pix_fmt_desc_get(link->format);
+    s->csp = av_pix_fmt_desc_get(outlink->format);
+    s->filter = filter;
     if (s->csp->comp[0].depth > 8) {
         s->filter_line  = filter_line_c_16bit;
         s->filter_edges = filter_edges_16bit;
@@ -507,37 +324,19 @@
 }
 
 
-#define OFFSET(x) offsetof(YADIFContext, x)
-#define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
-
-#define CONST(name, help, val, unit) { name, help, 0, AV_OPT_TYPE_CONST, {.i64=val}, INT_MIN, INT_MAX, FLAGS, unit }
-
-static const AVOption yadif_options[] = {
-    { "mode",   "specify the interlacing mode", OFFSET(mode), AV_OPT_TYPE_INT, {.i64=YADIF_MODE_SEND_FRAME}, 0, 3, FLAGS, "mode"},
-    CONST("send_frame",           "send one frame for each frame",                                     YADIF_MODE_SEND_FRAME,           "mode"),
-    CONST("send_field",           "send one frame for each field",                                     YADIF_MODE_SEND_FIELD,           "mode"),
-    CONST("send_frame_nospatial", "send one frame for each frame, but skip spatial interlacing check", YADIF_MODE_SEND_FRAME_NOSPATIAL, "mode"),
-    CONST("send_field_nospatial", "send one frame for each field, but skip spatial interlacing check", YADIF_MODE_SEND_FIELD_NOSPATIAL, "mode"),
-
-    { "parity", "specify the assumed picture field parity", OFFSET(parity), AV_OPT_TYPE_INT, {.i64=YADIF_PARITY_AUTO}, -1, 1, FLAGS, "parity" },
-    CONST("tff",  "assume top field first",    YADIF_PARITY_TFF,  "parity"),
-    CONST("bff",  "assume bottom field first", YADIF_PARITY_BFF,  "parity"),
-    CONST("auto", "auto detect parity",        YADIF_PARITY_AUTO, "parity"),
-
-    { "deint", "specify which frames to deinterlace", OFFSET(deint), AV_OPT_TYPE_INT, {.i64=YADIF_DEINT_ALL}, 0, 1, FLAGS, "deint" },
-    CONST("all",        "deinterlace all frames",                       YADIF_DEINT_ALL,         "deint"),
-    CONST("interlaced", "only deinterlace frames marked as interlaced", YADIF_DEINT_INTERLACED,  "deint"),
-
-    { NULL }
+static const AVClass yadif_class = {
+    .class_name = "yadif",
+    .item_name  = av_default_item_name,
+    .option     = ff_yadif_options,
+    .version    = LIBAVUTIL_VERSION_INT,
+    .category   = AV_CLASS_CATEGORY_FILTER,
 };
 
-AVFILTER_DEFINE_CLASS(yadif);
-
 static const AVFilterPad avfilter_vf_yadif_inputs[] = {
     {
         .name          = "default",
         .type          = AVMEDIA_TYPE_VIDEO,
-        .filter_frame  = filter_frame,
+        .filter_frame  = ff_yadif_filter_frame,
     },
     { NULL }
 };
@@ -546,8 +345,8 @@
     {
         .name          = "default",
         .type          = AVMEDIA_TYPE_VIDEO,
-        .request_frame = request_frame,
-        .config_props  = config_props,
+        .request_frame = ff_yadif_request_frame,
+        .config_props  = config_output,
     },
     { NULL }
 };
diff --git a/libavfilter/vf_yadif_cuda.c b/libavfilter/vf_yadif_cuda.c
new file mode 100644
index 0000000..c9eb1a2
--- /dev/null
+++ b/libavfilter/vf_yadif_cuda.c
@@ -0,0 +1,387 @@
+/*
+ * Copyright (C) 2018 Philip Langdale <philipl@overt.org>
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "libavutil/avassert.h"
+#include "libavutil/hwcontext_cuda_internal.h"
+#include "libavutil/cuda_check.h"
+#include "internal.h"
+#include "yadif.h"
+
+extern char vf_yadif_cuda_ptx[];
+
+typedef struct DeintCUDAContext {
+    YADIFContext yadif;
+
+    AVCUDADeviceContext *hwctx;
+    AVBufferRef         *device_ref;
+    AVBufferRef         *input_frames_ref;
+    AVHWFramesContext   *input_frames;
+
+    CUcontext   cu_ctx;
+    CUstream    stream;
+    CUmodule    cu_module;
+    CUfunction  cu_func_uchar;
+    CUfunction  cu_func_uchar2;
+    CUfunction  cu_func_ushort;
+    CUfunction  cu_func_ushort2;
+} DeintCUDAContext;
+
+#define DIV_UP(a, b) ( ((a) + (b) - 1) / (b) )
+#define ALIGN_UP(a, b) (((a) + (b) - 1) & ~((b) - 1))
+#define BLOCKX 32
+#define BLOCKY 16
+
+#define CHECK_CU(x) FF_CUDA_CHECK_DL(ctx, s->hwctx->internal->cuda_dl, x)
+
+static CUresult call_kernel(AVFilterContext *ctx, CUfunction func,
+                            CUdeviceptr prev, CUdeviceptr cur, CUdeviceptr next,
+                            CUarray_format format, int channels,
+                            int src_width,  // Width is pixels per channel
+                            int src_height, // Height is pixels per channel
+                            int src_pitch,  // Pitch is bytes
+                            CUdeviceptr dst,
+                            int dst_width,  // Width is pixels per channel
+                            int dst_height, // Height is pixels per channel
+                            int dst_pitch,  // Pitch is pixels per channel
+                            int parity, int tff)
+{
+    DeintCUDAContext *s = ctx->priv;
+    CudaFunctions *cu = s->hwctx->internal->cuda_dl;
+    CUtexObject tex_prev = 0, tex_cur = 0, tex_next = 0;
+    int ret;
+    int skip_spatial_check = s->yadif.mode&2;
+
+    void *args[] = { &dst, &tex_prev, &tex_cur, &tex_next,
+                     &dst_width, &dst_height, &dst_pitch,
+                     &src_width, &src_height, &parity, &tff,
+                     &skip_spatial_check };
+
+    CUDA_TEXTURE_DESC tex_desc = {
+        .filterMode = CU_TR_FILTER_MODE_POINT,
+        .flags = CU_TRSF_READ_AS_INTEGER,
+    };
+
+    CUDA_RESOURCE_DESC res_desc = {
+        .resType = CU_RESOURCE_TYPE_PITCH2D,
+        .res.pitch2D.format = format,
+        .res.pitch2D.numChannels = channels,
+        .res.pitch2D.width = src_width,
+        .res.pitch2D.height = src_height,
+        .res.pitch2D.pitchInBytes = src_pitch,
+    };
+
+    res_desc.res.pitch2D.devPtr = (CUdeviceptr)prev;
+    ret = CHECK_CU(cu->cuTexObjectCreate(&tex_prev, &res_desc, &tex_desc, NULL));
+    if (ret < 0)
+        goto exit;
+
+    res_desc.res.pitch2D.devPtr = (CUdeviceptr)cur;
+    ret = CHECK_CU(cu->cuTexObjectCreate(&tex_cur, &res_desc, &tex_desc, NULL));
+    if (ret < 0)
+        goto exit;
+
+    res_desc.res.pitch2D.devPtr = (CUdeviceptr)next;
+    ret = CHECK_CU(cu->cuTexObjectCreate(&tex_next, &res_desc, &tex_desc, NULL));
+    if (ret < 0)
+        goto exit;
+
+    ret = CHECK_CU(cu->cuLaunchKernel(func,
+                                      DIV_UP(dst_width, BLOCKX), DIV_UP(dst_height, BLOCKY), 1,
+                                      BLOCKX, BLOCKY, 1,
+                                      0, s->stream, args, NULL));
+
+exit:
+    if (tex_prev)
+        CHECK_CU(cu->cuTexObjectDestroy(tex_prev));
+    if (tex_cur)
+        CHECK_CU(cu->cuTexObjectDestroy(tex_cur));
+    if (tex_next)
+        CHECK_CU(cu->cuTexObjectDestroy(tex_next));
+
+    return ret;
+}
+
+static void filter(AVFilterContext *ctx, AVFrame *dst,
+                   int parity, int tff)
+{
+    DeintCUDAContext *s = ctx->priv;
+    YADIFContext *y = &s->yadif;
+    CudaFunctions *cu = s->hwctx->internal->cuda_dl;
+    CUcontext dummy;
+    int i, ret;
+
+    ret = CHECK_CU(cu->cuCtxPushCurrent(s->cu_ctx));
+    if (ret < 0)
+        return;
+
+    for (i = 0; i < y->csp->nb_components; i++) {
+        CUfunction func;
+        CUarray_format format;
+        int pixel_size, channels;
+        const AVComponentDescriptor *comp = &y->csp->comp[i];
+
+        if (comp->plane < i) {
+            // We process planes as a whole, so don't reprocess
+            // them for additional components
+            continue;
+        }
+
+        pixel_size = (comp->depth + comp->shift) / 8;
+        channels = comp->step / pixel_size;
+        if (pixel_size > 2 || channels > 2) {
+            av_log(ctx, AV_LOG_ERROR, "Unsupported pixel format: %s\n", y->csp->name);
+            goto exit;
+        }
+        switch (pixel_size) {
+        case 1:
+            func = channels == 1 ? s->cu_func_uchar : s->cu_func_uchar2;
+            format = CU_AD_FORMAT_UNSIGNED_INT8;
+            break;
+        case 2:
+            func = channels == 1 ? s->cu_func_ushort : s->cu_func_ushort2;
+            format = CU_AD_FORMAT_UNSIGNED_INT16;
+            break;
+        default:
+            av_log(ctx, AV_LOG_ERROR, "Unsupported pixel format: %s\n", y->csp->name);
+            goto exit;
+        }
+        av_log(ctx, AV_LOG_TRACE,
+               "Deinterlacing plane %d: pixel_size: %d channels: %d\n",
+               comp->plane, pixel_size, channels);
+        call_kernel(ctx, func,
+                    (CUdeviceptr)y->prev->data[i],
+                    (CUdeviceptr)y->cur->data[i],
+                    (CUdeviceptr)y->next->data[i],
+                    format, channels,
+                    AV_CEIL_RSHIFT(y->cur->width, i ? y->csp->log2_chroma_w : 0),
+                    AV_CEIL_RSHIFT(y->cur->height, i ? y->csp->log2_chroma_h : 0),
+                    y->cur->linesize[i],
+                    (CUdeviceptr)dst->data[i],
+                    AV_CEIL_RSHIFT(dst->width, i ? y->csp->log2_chroma_w : 0),
+                    AV_CEIL_RSHIFT(dst->height, i ? y->csp->log2_chroma_h : 0),
+                    dst->linesize[i] / comp->step,
+                    parity, tff);
+    }
+
+exit:
+    CHECK_CU(cu->cuCtxPopCurrent(&dummy));
+    return;
+}
+
+static av_cold void deint_cuda_uninit(AVFilterContext *ctx)
+{
+    CUcontext dummy;
+    DeintCUDAContext *s = ctx->priv;
+    YADIFContext *y = &s->yadif;
+
+    if (s->hwctx && s->cu_module) {
+        CudaFunctions *cu = s->hwctx->internal->cuda_dl;
+        CHECK_CU(cu->cuCtxPushCurrent(s->cu_ctx));
+        CHECK_CU(cu->cuModuleUnload(s->cu_module));
+        CHECK_CU(cu->cuCtxPopCurrent(&dummy));
+    }
+
+    av_frame_free(&y->prev);
+    av_frame_free(&y->cur);
+    av_frame_free(&y->next);
+
+    av_buffer_unref(&s->device_ref);
+    s->hwctx = NULL;
+    av_buffer_unref(&s->input_frames_ref);
+    s->input_frames = NULL;
+}
+
+static int deint_cuda_query_formats(AVFilterContext *ctx)
+{
+    enum AVPixelFormat pix_fmts[] = {
+        AV_PIX_FMT_CUDA, AV_PIX_FMT_NONE,
+    };
+    int ret;
+
+    if ((ret = ff_formats_ref(ff_make_format_list(pix_fmts),
+                              &ctx->inputs[0]->out_formats)) < 0)
+        return ret;
+    if ((ret = ff_formats_ref(ff_make_format_list(pix_fmts),
+                              &ctx->outputs[0]->in_formats)) < 0)
+        return ret;
+
+    return 0;
+}
+
+static int config_input(AVFilterLink *inlink)
+{
+    AVFilterContext *ctx = inlink->dst;
+    DeintCUDAContext *s  = ctx->priv;
+
+    if (!inlink->hw_frames_ctx) {
+        av_log(ctx, AV_LOG_ERROR, "A hardware frames reference is "
+               "required to associate the processing device.\n");
+        return AVERROR(EINVAL);
+    }
+
+    s->input_frames_ref = av_buffer_ref(inlink->hw_frames_ctx);
+    if (!s->input_frames_ref) {
+        av_log(ctx, AV_LOG_ERROR, "A input frames reference create "
+               "failed.\n");
+        return AVERROR(ENOMEM);
+    }
+    s->input_frames = (AVHWFramesContext*)s->input_frames_ref->data;
+
+    return 0;
+}
+
+static int config_output(AVFilterLink *link)
+{
+    AVHWFramesContext *output_frames;
+    AVFilterContext *ctx = link->src;
+    DeintCUDAContext *s = ctx->priv;
+    YADIFContext *y = &s->yadif;
+    CudaFunctions *cu;
+    int ret = 0;
+    CUcontext dummy;
+
+    av_assert0(s->input_frames);
+    s->device_ref = av_buffer_ref(s->input_frames->device_ref);
+    if (!s->device_ref) {
+        av_log(ctx, AV_LOG_ERROR, "A device reference create "
+               "failed.\n");
+        return AVERROR(ENOMEM);
+    }
+    s->hwctx = ((AVHWDeviceContext*)s->device_ref->data)->hwctx;
+    s->cu_ctx = s->hwctx->cuda_ctx;
+    s->stream = s->hwctx->stream;
+    cu = s->hwctx->internal->cuda_dl;
+
+    link->hw_frames_ctx = av_hwframe_ctx_alloc(s->device_ref);
+    if (!link->hw_frames_ctx) {
+        av_log(ctx, AV_LOG_ERROR, "Failed to create HW frame context "
+               "for output.\n");
+        ret = AVERROR(ENOMEM);
+        goto exit;
+    }
+
+    output_frames = (AVHWFramesContext*)link->hw_frames_ctx->data;
+
+    output_frames->format    = AV_PIX_FMT_CUDA;
+    output_frames->sw_format = s->input_frames->sw_format;
+    output_frames->width     = ctx->inputs[0]->w;
+    output_frames->height    = ctx->inputs[0]->h;
+
+    output_frames->initial_pool_size = 4;
+
+    ret = ff_filter_init_hw_frames(ctx, link, 10);
+    if (ret < 0)
+        goto exit;
+
+    ret = av_hwframe_ctx_init(link->hw_frames_ctx);
+    if (ret < 0) {
+        av_log(ctx, AV_LOG_ERROR, "Failed to initialise CUDA frame "
+               "context for output: %d\n", ret);
+        goto exit;
+    }
+
+    link->time_base.num = ctx->inputs[0]->time_base.num;
+    link->time_base.den = ctx->inputs[0]->time_base.den * 2;
+    link->w             = ctx->inputs[0]->w;
+    link->h             = ctx->inputs[0]->h;
+
+    if(y->mode & 1)
+        link->frame_rate = av_mul_q(ctx->inputs[0]->frame_rate,
+                                    (AVRational){2, 1});
+
+    if (link->w < 3 || link->h < 3) {
+        av_log(ctx, AV_LOG_ERROR, "Video of less than 3 columns or lines is not supported\n");
+        ret = AVERROR(EINVAL);
+        goto exit;
+    }
+
+    y->csp = av_pix_fmt_desc_get(output_frames->sw_format);
+    y->filter = filter;
+
+    ret = CHECK_CU(cu->cuCtxPushCurrent(s->cu_ctx));
+    if (ret < 0)
+        goto exit;
+
+    ret = CHECK_CU(cu->cuModuleLoadData(&s->cu_module, vf_yadif_cuda_ptx));
+    if (ret < 0)
+        goto exit;
+
+    ret = CHECK_CU(cu->cuModuleGetFunction(&s->cu_func_uchar, s->cu_module, "yadif_uchar"));
+    if (ret < 0)
+        goto exit;
+
+    ret = CHECK_CU(cu->cuModuleGetFunction(&s->cu_func_uchar2, s->cu_module, "yadif_uchar2"));
+    if (ret < 0)
+        goto exit;
+
+    ret = CHECK_CU(cu->cuModuleGetFunction(&s->cu_func_ushort, s->cu_module, "yadif_ushort"));
+    if (ret < 0)
+        goto exit;
+
+    ret = CHECK_CU(cu->cuModuleGetFunction(&s->cu_func_ushort2, s->cu_module, "yadif_ushort2"));
+    if (ret < 0)
+        goto exit;
+
+exit:
+    CHECK_CU(cu->cuCtxPopCurrent(&dummy));
+
+    return ret;
+}
+
+static const AVClass yadif_cuda_class = {
+    .class_name = "yadif_cuda",
+    .item_name  = av_default_item_name,
+    .option     = ff_yadif_options,
+    .version    = LIBAVUTIL_VERSION_INT,
+    .category   = AV_CLASS_CATEGORY_FILTER,
+};
+
+static const AVFilterPad deint_cuda_inputs[] = {
+    {
+        .name          = "default",
+        .type          = AVMEDIA_TYPE_VIDEO,
+        .filter_frame  = ff_yadif_filter_frame,
+        .config_props  = config_input,
+    },
+    { NULL }
+};
+
+static const AVFilterPad deint_cuda_outputs[] = {
+    {
+        .name          = "default",
+        .type          = AVMEDIA_TYPE_VIDEO,
+        .request_frame = ff_yadif_request_frame,
+        .config_props  = config_output,
+    },
+    { NULL }
+};
+
+AVFilter ff_vf_yadif_cuda = {
+    .name           = "yadif_cuda",
+    .description    = NULL_IF_CONFIG_SMALL("Deinterlace CUDA frames"),
+    .priv_size      = sizeof(DeintCUDAContext),
+    .priv_class     = &yadif_cuda_class,
+    .uninit         = deint_cuda_uninit,
+    .query_formats  = deint_cuda_query_formats,
+    .inputs         = deint_cuda_inputs,
+    .outputs        = deint_cuda_outputs,
+    .flags          = AVFILTER_FLAG_SUPPORT_TIMELINE_INTERNAL,
+    .flags_internal = FF_FILTER_FLAG_HWFRAME_AWARE,
+};
diff --git a/libavfilter/vf_yadif_cuda.cu b/libavfilter/vf_yadif_cuda.cu
new file mode 100644
index 0000000..12e7e4a
--- /dev/null
+++ b/libavfilter/vf_yadif_cuda.cu
@@ -0,0 +1,299 @@
+/*
+ * Copyright (C) 2018 Philip Langdale <philipl@overt.org>
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+template<typename T>
+__inline__ __device__ T spatial_predictor(T a, T b, T c, T d, T e, T f, T g,
+                                          T h, T i, T j, T k, T l, T m, T n)
+{
+    int spatial_pred = (d + k)/2;
+    int spatial_score = abs(c - j) + abs(d - k) + abs(e - l);
+
+    int score = abs(b - k) + abs(c - l) + abs(d - m);
+    if (score < spatial_score) {
+        spatial_pred = (c + l)/2;
+        spatial_score = score;
+        score = abs(a - l) + abs(b - m) + abs(c - n);
+        if (score < spatial_score) {
+          spatial_pred = (b + m)/2;
+          spatial_score = score;
+        }
+    }
+    score = abs(d - i) + abs(e - j) + abs(f - k);
+    if (score < spatial_score) {
+        spatial_pred = (e + j)/2;
+        spatial_score = score;
+        score = abs(e - h) + abs(f - i) + abs(g - j);
+        if (score < spatial_score) {
+          spatial_pred = (f + i)/2;
+          spatial_score = score;
+        }
+    }
+    return spatial_pred;
+}
+
+__inline__ __device__ int max3(int a, int b, int c)
+{
+    int x = max(a, b);
+    return max(x, c);
+}
+
+__inline__ __device__ int min3(int a, int b, int c)
+{
+    int x = min(a, b);
+    return min(x, c);
+}
+
+template<typename T>
+__inline__ __device__ T temporal_predictor(T A, T B, T C, T D, T E, T F,
+                                           T G, T H, T I, T J, T K, T L,
+                                           T spatial_pred, bool skip_check)
+{
+    int p0 = (C + H) / 2;
+    int p1 = F;
+    int p2 = (D + I) / 2;
+    int p3 = G;
+    int p4 = (E + J) / 2;
+
+    int tdiff0 = abs(D - I);
+    int tdiff1 = (abs(A - F) + abs(B - G)) / 2;
+    int tdiff2 = (abs(K - F) + abs(G - L)) / 2;
+
+    int diff = max3(tdiff0, tdiff1, tdiff2);
+
+    if (!skip_check) {
+      int maxi = max3(p2 - p3, p2 - p1, min(p0 - p1, p4 - p3));
+      int mini = min3(p2 - p3, p2 - p1, max(p0 - p1, p4 - p3));
+      diff = max3(diff, mini, -maxi);
+    }
+
+    if (spatial_pred > p2 + diff) {
+      spatial_pred = p2 + diff;
+    }
+    if (spatial_pred < p2 - diff) {
+      spatial_pred = p2 - diff;
+    }
+
+    return spatial_pred;
+}
+
+template<typename T>
+__inline__ __device__ void yadif_single(T *dst,
+                                        cudaTextureObject_t prev,
+                                        cudaTextureObject_t cur,
+                                        cudaTextureObject_t next,
+                                        int dst_width, int dst_height, int dst_pitch,
+                                        int src_width, int src_height,
+                                        int parity, int tff, bool skip_spatial_check)
+{
+    // Identify location
+    int xo = blockIdx.x * blockDim.x + threadIdx.x;
+    int yo = blockIdx.y * blockDim.y + threadIdx.y;
+
+    if (xo >= dst_width || yo >= dst_height) {
+        return;
+    }
+
+    // Don't modify the primary field
+    if (yo % 2 == parity) {
+      dst[yo*dst_pitch+xo] = tex2D<T>(cur, xo, yo);
+      return;
+    }
+
+    // Calculate spatial prediction
+    T a = tex2D<T>(cur, xo - 3, yo - 1);
+    T b = tex2D<T>(cur, xo - 2, yo - 1);
+    T c = tex2D<T>(cur, xo - 1, yo - 1);
+    T d = tex2D<T>(cur, xo - 0, yo - 1);
+    T e = tex2D<T>(cur, xo + 1, yo - 1);
+    T f = tex2D<T>(cur, xo + 2, yo - 1);
+    T g = tex2D<T>(cur, xo + 3, yo - 1);
+
+    T h = tex2D<T>(cur, xo - 3, yo + 1);
+    T i = tex2D<T>(cur, xo - 2, yo + 1);
+    T j = tex2D<T>(cur, xo - 1, yo + 1);
+    T k = tex2D<T>(cur, xo - 0, yo + 1);
+    T l = tex2D<T>(cur, xo + 1, yo + 1);
+    T m = tex2D<T>(cur, xo + 2, yo + 1);
+    T n = tex2D<T>(cur, xo + 3, yo + 1);
+
+    T spatial_pred =
+        spatial_predictor(a, b, c, d, e, f, g, h, i, j, k, l, m, n);
+
+    // Calculate temporal prediction
+    int is_second_field = !(parity ^ tff);
+
+    cudaTextureObject_t prev2 = prev;
+    cudaTextureObject_t prev1 = is_second_field ? cur : prev;
+    cudaTextureObject_t next1 = is_second_field ? next : cur;
+    cudaTextureObject_t next2 = next;
+
+    T A = tex2D<T>(prev2, xo,  yo - 1);
+    T B = tex2D<T>(prev2, xo,  yo + 1);
+    T C = tex2D<T>(prev1, xo,  yo - 2);
+    T D = tex2D<T>(prev1, xo,  yo + 0);
+    T E = tex2D<T>(prev1, xo,  yo + 2);
+    T F = tex2D<T>(cur,   xo,  yo - 1);
+    T G = tex2D<T>(cur,   xo,  yo + 1);
+    T H = tex2D<T>(next1, xo,  yo - 2);
+    T I = tex2D<T>(next1, xo,  yo + 0);
+    T J = tex2D<T>(next1, xo,  yo + 2);
+    T K = tex2D<T>(next2, xo,  yo - 1);
+    T L = tex2D<T>(next2, xo,  yo + 1);
+
+    spatial_pred = temporal_predictor(A, B, C, D, E, F, G, H, I, J, K, L,
+                                      spatial_pred, skip_spatial_check);
+
+    dst[yo*dst_pitch+xo] = spatial_pred;
+}
+
+template <typename T>
+__inline__ __device__ void yadif_double(T *dst,
+                                        cudaTextureObject_t prev,
+                                        cudaTextureObject_t cur,
+                                        cudaTextureObject_t next,
+                                        int dst_width, int dst_height, int dst_pitch,
+                                        int src_width, int src_height,
+                                        int parity, int tff, bool skip_spatial_check)
+{
+    int xo = blockIdx.x * blockDim.x + threadIdx.x;
+    int yo = blockIdx.y * blockDim.y + threadIdx.y;
+
+    if (xo >= dst_width || yo >= dst_height) {
+        return;
+    }
+
+    if (yo % 2 == parity) {
+      // Don't modify the primary field
+      dst[yo*dst_pitch+xo] = tex2D<T>(cur, xo, yo);
+      return;
+    }
+
+    T a = tex2D<T>(cur, xo - 3, yo - 1);
+    T b = tex2D<T>(cur, xo - 2, yo - 1);
+    T c = tex2D<T>(cur, xo - 1, yo - 1);
+    T d = tex2D<T>(cur, xo - 0, yo - 1);
+    T e = tex2D<T>(cur, xo + 1, yo - 1);
+    T f = tex2D<T>(cur, xo + 2, yo - 1);
+    T g = tex2D<T>(cur, xo + 3, yo - 1);
+
+    T h = tex2D<T>(cur, xo - 3, yo + 1);
+    T i = tex2D<T>(cur, xo - 2, yo + 1);
+    T j = tex2D<T>(cur, xo - 1, yo + 1);
+    T k = tex2D<T>(cur, xo - 0, yo + 1);
+    T l = tex2D<T>(cur, xo + 1, yo + 1);
+    T m = tex2D<T>(cur, xo + 2, yo + 1);
+    T n = tex2D<T>(cur, xo + 3, yo + 1);
+
+    T spatial_pred;
+    spatial_pred.x =
+        spatial_predictor(a.x, b.x, c.x, d.x, e.x, f.x, g.x, h.x, i.x, j.x, k.x, l.x, m.x, n.x);
+    spatial_pred.y =
+        spatial_predictor(a.y, b.y, c.y, d.y, e.y, f.y, g.y, h.y, i.y, j.y, k.y, l.y, m.y, n.y);
+
+    // Calculate temporal prediction
+    int is_second_field = !(parity ^ tff);
+
+    cudaTextureObject_t prev2 = prev;
+    cudaTextureObject_t prev1 = is_second_field ? cur : prev;
+    cudaTextureObject_t next1 = is_second_field ? next : cur;
+    cudaTextureObject_t next2 = next;
+
+    T A = tex2D<T>(prev2, xo,  yo - 1);
+    T B = tex2D<T>(prev2, xo,  yo + 1);
+    T C = tex2D<T>(prev1, xo,  yo - 2);
+    T D = tex2D<T>(prev1, xo,  yo + 0);
+    T E = tex2D<T>(prev1, xo,  yo + 2);
+    T F = tex2D<T>(cur,   xo,  yo - 1);
+    T G = tex2D<T>(cur,   xo,  yo + 1);
+    T H = tex2D<T>(next1, xo,  yo - 2);
+    T I = tex2D<T>(next1, xo,  yo + 0);
+    T J = tex2D<T>(next1, xo,  yo + 2);
+    T K = tex2D<T>(next2, xo,  yo - 1);
+    T L = tex2D<T>(next2, xo,  yo + 1);
+
+    spatial_pred.x =
+        temporal_predictor(A.x, B.x, C.x, D.x, E.x, F.x, G.x, H.x, I.x, J.x, K.x, L.x,
+                           spatial_pred.x, skip_spatial_check);
+    spatial_pred.y =
+        temporal_predictor(A.y, B.y, C.y, D.y, E.y, F.y, G.y, H.y, I.y, J.y, K.y, L.y,
+                           spatial_pred.y, skip_spatial_check);
+
+    dst[yo*dst_pitch+xo] = spatial_pred;
+}
+
+extern "C" {
+
+__global__ void yadif_uchar(unsigned char *dst,
+                            cudaTextureObject_t prev,
+                            cudaTextureObject_t cur,
+                            cudaTextureObject_t next,
+                            int dst_width, int dst_height, int dst_pitch,
+                            int src_width, int src_height,
+                            int parity, int tff, bool skip_spatial_check)
+{
+    yadif_single(dst, prev, cur, next,
+                 dst_width, dst_height, dst_pitch,
+                 src_width, src_height,
+                 parity, tff, skip_spatial_check);
+}
+
+__global__ void yadif_ushort(unsigned short *dst,
+                            cudaTextureObject_t prev,
+                            cudaTextureObject_t cur,
+                            cudaTextureObject_t next,
+                            int dst_width, int dst_height, int dst_pitch,
+                            int src_width, int src_height,
+                            int parity, int tff, bool skip_spatial_check)
+{
+    yadif_single(dst, prev, cur, next,
+                 dst_width, dst_height, dst_pitch,
+                 src_width, src_height,
+                 parity, tff, skip_spatial_check);
+}
+
+__global__ void yadif_uchar2(uchar2 *dst,
+                            cudaTextureObject_t prev,
+                            cudaTextureObject_t cur,
+                            cudaTextureObject_t next,
+                            int dst_width, int dst_height, int dst_pitch,
+                            int src_width, int src_height,
+                            int parity, int tff, bool skip_spatial_check)
+{
+    yadif_double(dst, prev, cur, next,
+                 dst_width, dst_height, dst_pitch,
+                 src_width, src_height,
+                 parity, tff, skip_spatial_check);
+}
+
+__global__ void yadif_ushort2(ushort2 *dst,
+                            cudaTextureObject_t prev,
+                            cudaTextureObject_t cur,
+                            cudaTextureObject_t next,
+                            int dst_width, int dst_height, int dst_pitch,
+                            int src_width, int src_height,
+                            int parity, int tff, bool skip_spatial_check)
+{
+    yadif_double(dst, prev, cur, next,
+                 dst_width, dst_height, dst_pitch,
+                 src_width, src_height,
+                 parity, tff, skip_spatial_check);
+}
+
+} /* extern "C" */
diff --git a/libavfilter/vf_yaepblur.c b/libavfilter/vf_yaepblur.c
new file mode 100644
index 0000000..0fb7b84
--- /dev/null
+++ b/libavfilter/vf_yaepblur.c
@@ -0,0 +1,349 @@
+/*
+ * Copyright (C) 2019 Leo Zhang <leozhang@qiyi.com>
+
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file
+ * yaep(yet another edge preserving) blur filter
+ *
+ * This implementation is based on an algorithm described in
+ * "J. S. Lee, Digital image enhancement and noise filtering by use of local statistics, IEEE Trans. Pattern
+ * Anal. Mach. Intell. PAMI-2, 1980."
+ */
+
+#include "libavutil/opt.h"
+#include "libavutil/imgutils.h"
+#include "avfilter.h"
+#include "internal.h"
+
+typedef struct YAEPContext {
+    const AVClass *class;
+
+    int planes;
+    int radius;
+    int sigma;
+
+    int nb_planes;
+    int planewidth[4];
+    int planeheight[4];
+    int depth;
+
+    uint64_t *sat;        ///< summed area table
+    uint64_t *square_sat; ///< square summed area table
+    int sat_linesize;
+
+    int (*pre_calculate_row)(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs);
+    int (*filter_slice     )(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs);
+} YAEPContext;
+
+static av_cold void uninit(AVFilterContext *ctx)
+{
+    YAEPContext *s = ctx->priv;
+    av_freep(&s->sat);
+    av_freep(&s->square_sat);
+}
+
+static int query_formats(AVFilterContext *ctx)
+{
+    static const enum AVPixelFormat pix_fmts[] = {
+        AV_PIX_FMT_YUVA444P, AV_PIX_FMT_YUV444P, AV_PIX_FMT_YUV440P,
+        AV_PIX_FMT_YUVJ444P, AV_PIX_FMT_YUVJ440P,
+        AV_PIX_FMT_YUVA422P, AV_PIX_FMT_YUV422P, AV_PIX_FMT_YUVA420P, AV_PIX_FMT_YUV420P,
+        AV_PIX_FMT_YUVJ422P, AV_PIX_FMT_YUVJ420P,
+        AV_PIX_FMT_YUVJ411P, AV_PIX_FMT_YUV411P, AV_PIX_FMT_YUV410P,
+        AV_PIX_FMT_YUV420P9, AV_PIX_FMT_YUV422P9, AV_PIX_FMT_YUV444P9,
+        AV_PIX_FMT_YUV420P10, AV_PIX_FMT_YUV422P10, AV_PIX_FMT_YUV444P10,
+        AV_PIX_FMT_YUV420P12, AV_PIX_FMT_YUV422P12, AV_PIX_FMT_YUV444P12, AV_PIX_FMT_YUV440P12,
+        AV_PIX_FMT_YUV420P14, AV_PIX_FMT_YUV422P14, AV_PIX_FMT_YUV444P14,
+        AV_PIX_FMT_YUV420P16, AV_PIX_FMT_YUV422P16, AV_PIX_FMT_YUV444P16,
+        AV_PIX_FMT_YUVA420P9, AV_PIX_FMT_YUVA422P9, AV_PIX_FMT_YUVA444P9,
+        AV_PIX_FMT_YUVA420P10, AV_PIX_FMT_YUVA422P10, AV_PIX_FMT_YUVA444P10,
+        AV_PIX_FMT_YUVA422P12, AV_PIX_FMT_YUVA444P12,
+        AV_PIX_FMT_YUVA420P16, AV_PIX_FMT_YUVA422P16, AV_PIX_FMT_YUVA444P16,
+        AV_PIX_FMT_GBRP, AV_PIX_FMT_GBRP9, AV_PIX_FMT_GBRP10,
+        AV_PIX_FMT_GBRP12, AV_PIX_FMT_GBRP14, AV_PIX_FMT_GBRP16,
+        AV_PIX_FMT_GBRAP, AV_PIX_FMT_GBRAP10, AV_PIX_FMT_GBRAP12, AV_PIX_FMT_GBRAP16,
+        AV_PIX_FMT_GRAY8, AV_PIX_FMT_GRAY9, AV_PIX_FMT_GRAY10, AV_PIX_FMT_GRAY12, AV_PIX_FMT_GRAY14, AV_PIX_FMT_GRAY16,
+        AV_PIX_FMT_NONE
+    };
+
+    return ff_set_common_formats(ctx, ff_make_format_list(pix_fmts));
+}
+
+typedef struct ThreadData {
+    int width;
+    int height;
+    int src_linesize;
+    int dst_linesize;
+    uint8_t *src;
+    uint8_t *dst;
+} ThreadData;
+
+#define PRE_CALCULATE_ROW(type, name)                                    \
+static int pre_calculate_row_##name(AVFilterContext *ctx, void *arg,     \
+                                   int jobnr, int nb_jobs)               \
+{                                                                        \
+    ThreadData *td = arg;                                                \
+    YAEPContext *s = ctx->priv;                                          \
+                                                                         \
+    const int width        = td->width;                                  \
+    const int height       = td->height;                                 \
+    const int linesize     = td->src_linesize / sizeof(type);            \
+    const int sat_linesize = s->sat_linesize;                            \
+                                                                         \
+    const int starty = height * jobnr     / nb_jobs;                     \
+    const int endy   = height * (jobnr+1) / nb_jobs;                     \
+                                                                         \
+    uint64_t *sat        = s->sat + (starty + 1) * sat_linesize;         \
+    uint64_t *square_sat = s->square_sat + (starty + 1) * sat_linesize;  \
+    const type *src      = (const type *)td->src + starty * linesize;    \
+                                                                         \
+    int x, y;                                                            \
+                                                                         \
+    for (y = starty; y < endy; y++) {                                    \
+        for (x = 0; x < width; x++) {                                    \
+            sat[x+1]        = sat[x] + src[x];                           \
+            square_sat[x+1] = square_sat[x] + (uint64_t)src[x] * src[x]; \
+        }                                                                \
+        sat               += sat_linesize;                               \
+        square_sat        += sat_linesize;                               \
+        src               += linesize;                                   \
+    }                                                                    \
+                                                                         \
+    return 0;                                                            \
+}
+
+PRE_CALCULATE_ROW(uint8_t,  byte)
+PRE_CALCULATE_ROW(uint16_t, word)
+
+static int pre_calculate_col(AVFilterContext *ctx, void *arg,
+                             int jobnr, int nb_jobs)
+{
+    ThreadData *td = arg;
+    YAEPContext *s = ctx->priv;
+
+    const int width        = td->width;
+    const int height       = td->height;
+    const int sat_linesize = s->sat_linesize;
+
+    const int startx = width * jobnr       / nb_jobs;
+    const int endx   = width * (jobnr + 1) / nb_jobs;
+
+    uint64_t *sat, *square_sat;
+    int x, y;
+
+    for (x = startx; x < endx; x++) {
+        sat = s->sat + x + 1;
+        square_sat = s->square_sat + x + 1;
+        for (y = 0; y < height; y++) {
+            *(sat+sat_linesize)        += *sat;
+            *(square_sat+sat_linesize) += *square_sat;
+            sat         += sat_linesize;
+            square_sat  += sat_linesize;
+        }
+    }
+
+    return 0;
+}
+
+#define FILTER_SLICE(type, name)                                                                          \
+static int filter_slice_##name(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)                   \
+{                                                                                                         \
+    ThreadData *td = arg;                                                                                 \
+    YAEPContext *s = ctx->priv;                                                                           \
+                                                                                                          \
+    const int width = td->width;                                                                          \
+    const int height = td->height;                                                                        \
+    const int src_linesize = td->src_linesize / sizeof(type);                                             \
+    const int dst_linesize = td->dst_linesize / sizeof(type);                                             \
+    const int sat_linesize = s->sat_linesize;                                                             \
+    const int sigma = s->sigma;                                                                           \
+    const int radius = s->radius;                                                                         \
+                                                                                                          \
+    uint64_t *sat = s->sat;                                                                               \
+    uint64_t *square_sat = s->square_sat;                                                                 \
+    const type *src = (const type *)td->src;                                                              \
+    type *dst = (type *)td->dst;                                                                          \
+                                                                                                          \
+    const int starty = height * jobnr       / nb_jobs;                                                    \
+    const int endy   = height * (jobnr + 1) / nb_jobs;                                                    \
+                                                                                                          \
+    int x, y;                                                                                             \
+    int lower_x, higher_x;                                                                                \
+    int lower_y, higher_y;                                                                                \
+    int dist_y, count;                                                                                    \
+    uint64_t sum, square_sum, mean, var;                                                                  \
+                                                                                                          \
+    for (y = starty; y < endy; y++) {                                                                     \
+        lower_y  = y - radius     < 0      ? 0      : y - radius;                                         \
+        higher_y = y + radius + 1 > height ? height : y + radius + 1;                                     \
+        dist_y = higher_y - lower_y;                                                                      \
+        for (x = 0; x < width; x++) {                                                                     \
+            lower_x  = x - radius     < 0     ? 0     : x - radius;                                       \
+            higher_x = x + radius + 1 > width ? width : x + radius + 1;                                   \
+            count = dist_y * (higher_x - lower_x);                                                        \
+            sum = sat[higher_y * sat_linesize + higher_x]                                                 \
+                - sat[higher_y * sat_linesize + lower_x]                                                  \
+                - sat[lower_y  * sat_linesize + higher_x]                                                 \
+                + sat[lower_y  * sat_linesize + lower_x];                                                 \
+            square_sum = square_sat[higher_y * sat_linesize + higher_x]                                   \
+                       - square_sat[higher_y * sat_linesize + lower_x]                                    \
+                       - square_sat[lower_y  * sat_linesize + higher_x]                                   \
+                       + square_sat[lower_y  * sat_linesize + lower_x];                                   \
+            mean = sum / count;                                                                           \
+            var = (square_sum - sum * sum / count) / count;                                               \
+            dst[y * dst_linesize + x] = (sigma * mean + var * src[y * src_linesize + x]) / (sigma + var); \
+        }                                                                                                 \
+    }                                                                                                     \
+    return 0;                                                                                             \
+}
+
+FILTER_SLICE(uint8_t,  byte)
+FILTER_SLICE(uint16_t, word)
+
+static int filter_frame(AVFilterLink *inlink, AVFrame *in)
+{
+    AVFilterContext *ctx = inlink->dst;
+    YAEPContext *s = ctx->priv;
+    AVFilterLink *outlink = ctx->outputs[0];
+    AVFrame *out;
+    int plane;
+    const int nb_threads = ff_filter_get_nb_threads(ctx);
+    ThreadData td;
+
+    if (av_frame_is_writable(in)) {
+        out = in;
+    } else {
+        out = ff_get_video_buffer(outlink, outlink->w, outlink->h);
+        if (!out) {
+            av_frame_free(&in);
+            return AVERROR(ENOMEM);
+        }
+        av_frame_copy_props(out, in);
+    }
+
+    for (plane = 0; plane < s->nb_planes; plane++) {
+        if (!s->radius || !(s->planes & (1<<plane))) {
+            if (out != in) {
+                av_image_copy_plane(out->data[plane], out->linesize[plane],
+                                    in->data[plane], in->linesize[plane],
+                                    s->planewidth[plane] * ((s->depth + 7) / 8),
+                                    s->planeheight[plane]);
+            }
+            continue;
+        }
+
+        td.width        = s->planewidth[plane];
+        td.height       = s->planeheight[plane];
+        td.src          = in->data[plane];
+        td.src_linesize = in->linesize[plane];
+        ctx->internal->execute(ctx, s->pre_calculate_row, &td, NULL, FFMIN(td.height, nb_threads));
+        ctx->internal->execute(ctx, pre_calculate_col, &td, NULL, FFMIN(td.width,  nb_threads));
+
+        td.dst          = out->data[plane];
+        td.dst_linesize = out->linesize[plane];
+        ctx->internal->execute(ctx, s->filter_slice, &td, NULL, FFMIN(td.height, nb_threads));
+    }
+
+    if (out != in)
+        av_frame_free(&in);
+
+    return ff_filter_frame(outlink, out);
+}
+
+static int config_input(AVFilterLink *inlink)
+{
+    YAEPContext *s = inlink->dst->priv;
+    const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(inlink->format);
+
+    s->depth = desc->comp[0].depth;
+    s->planewidth[1] = s->planewidth[2] = AV_CEIL_RSHIFT(inlink->w, desc->log2_chroma_w);
+    s->planewidth[0] = s->planewidth[3] = inlink->w;
+    s->planeheight[1] = s->planeheight[2] = AV_CEIL_RSHIFT(inlink->h, desc->log2_chroma_h);
+    s->planeheight[0] = s->planeheight[3] = inlink->h;
+    s->nb_planes = av_pix_fmt_count_planes(inlink->format);
+
+    s->radius = FFMIN(s->radius, AV_CEIL_RSHIFT(FFMIN(inlink->w, inlink->h), 1));
+
+    if (s->depth <= 8) {
+        s->pre_calculate_row = pre_calculate_row_byte;
+        s->filter_slice      = filter_slice_byte;
+    } else {
+        s->pre_calculate_row = pre_calculate_row_word;
+        s->filter_slice      = filter_slice_word;
+    }
+
+    // padding one row on the top, and padding one col on the left, that is why + 1 below
+    s->sat_linesize = inlink->w + 1;
+    s->sat = av_mallocz_array(inlink->h + 1, s->sat_linesize*sizeof(*s->sat));
+    if (!s->sat)
+        return AVERROR(ENOMEM);
+
+    s->square_sat = av_mallocz_array(inlink->h + 1, s->sat_linesize*sizeof(*s->square_sat));
+    if (!s->square_sat)
+        return AVERROR(ENOMEM);
+
+    return 0;
+}
+
+static const AVFilterPad yaep_inputs[] = {
+    {
+        .name = "default",
+        .type = AVMEDIA_TYPE_VIDEO,
+        .config_props = config_input,
+        .filter_frame = filter_frame,
+    },
+    { NULL }
+};
+
+static const AVFilterPad yaep_outputs[] = {
+    {
+        .name = "default",
+        .type = AVMEDIA_TYPE_VIDEO,
+    },
+    { NULL }
+};
+
+#define OFFSET(x) offsetof(YAEPContext, x)
+#define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_RUNTIME_PARAM
+
+static const AVOption yaep_options[] = {
+    { "radius", "set window radius",    OFFSET(radius), AV_OPT_TYPE_INT, {.i64=3},   0, INT_MAX, .flags=FLAGS },
+    { "r"     , "set window radius",    OFFSET(radius), AV_OPT_TYPE_INT, {.i64=3},   0, INT_MAX, .flags=FLAGS },
+    { "planes", "set planes to filter", OFFSET(planes), AV_OPT_TYPE_INT, {.i64=1},   0,     0xF, .flags=FLAGS },
+    { "p",      "set planes to filter", OFFSET(planes), AV_OPT_TYPE_INT, {.i64=1},   0,     0xF, .flags=FLAGS },
+    { "sigma",  "set blur strength",    OFFSET(sigma),  AV_OPT_TYPE_INT, {.i64=128}, 1, INT_MAX, .flags=FLAGS },
+    { "s",      "set blur strength",    OFFSET(sigma),  AV_OPT_TYPE_INT, {.i64=128}, 1, INT_MAX, .flags=FLAGS },
+    { NULL }
+};
+
+AVFILTER_DEFINE_CLASS(yaep);
+
+AVFilter ff_vf_yaepblur = {
+    .name            = "yaepblur",
+    .description     = NULL_IF_CONFIG_SMALL("Yet another edge preserving blur filter."),
+    .priv_size       = sizeof(YAEPContext),
+    .priv_class      = &yaep_class,
+    .uninit          = uninit,
+    .query_formats   = query_formats,
+    .inputs          = yaep_inputs,
+    .outputs         = yaep_outputs,
+    .flags           = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC | AVFILTER_FLAG_SLICE_THREADS,
+    .process_command = ff_filter_process_command,
+};
diff --git a/libavfilter/vf_zoompan.c b/libavfilter/vf_zoompan.c
index dea10d5..59c9b19 100644
--- a/libavfilter/vf_zoompan.c
+++ b/libavfilter/vf_zoompan.c
@@ -245,6 +245,8 @@
     }
     return ret;
 error:
+    sws_freeContext(s->sws);
+    s->sws = NULL;
     av_frame_free(&out);
     return ret;
 }
@@ -257,6 +259,8 @@
     int status, ret = 0;
     int64_t pts;
 
+    FF_FILTER_FORWARD_STATUS_BACK(outlink, inlink);
+
     if (s->in && ff_outlink_frame_wanted(outlink)) {
         double zoom = -1, dx = -1, dy = -1;
 
@@ -344,6 +348,10 @@
 
     sws_freeContext(s->sws);
     s->sws = NULL;
+    av_expr_free(s->x_expr);
+    av_expr_free(s->y_expr);
+    av_expr_free(s->zoom_expr);
+    av_frame_free(&s->in);
 }
 
 static const AVFilterPad inputs[] = {
diff --git a/libavfilter/vf_zscale.c b/libavfilter/vf_zscale.c
index 6e1d36c..023a5d1 100644
--- a/libavfilter/vf_zscale.c
+++ b/libavfilter/vf_zscale.c
@@ -44,6 +44,8 @@
 #include "libavutil/imgutils.h"
 #include "libavutil/avassert.h"
 
+#define ZIMG_ALIGNMENT 32
+
 static const char *const var_names[] = {
     "in_w",   "iw",
     "in_h",   "ih",
@@ -502,6 +504,44 @@
     return 0;
 }
 
+static int realign_frame(const AVPixFmtDescriptor *desc, AVFrame **frame)
+{
+    AVFrame *aligned = NULL;
+    int ret = 0, plane;
+
+    /* Realign any unaligned input frame. */
+    for (plane = 0; plane < 3; plane++) {
+        int p = desc->comp[plane].plane;
+        if ((uintptr_t)(*frame)->data[p] % ZIMG_ALIGNMENT || (*frame)->linesize[p] % ZIMG_ALIGNMENT) {
+            if (!(aligned = av_frame_alloc())) {
+                ret = AVERROR(ENOMEM);
+                goto fail;
+            }
+
+            aligned->format = (*frame)->format;
+            aligned->width  = (*frame)->width;
+            aligned->height = (*frame)->height;
+
+            if ((ret = av_frame_get_buffer(aligned, ZIMG_ALIGNMENT)) < 0)
+                goto fail;
+
+            if ((ret = av_frame_copy(aligned, *frame)) < 0)
+                goto fail;
+
+            if ((ret = av_frame_copy_props(aligned, *frame)) < 0)
+                goto fail;
+
+            av_frame_free(frame);
+            *frame = aligned;
+            return 0;
+        }
+    }
+
+fail:
+    av_frame_free(&aligned);
+    return ret;
+}
+
 static int filter_frame(AVFilterLink *link, AVFrame *in)
 {
     ZScaleContext *s = link->dst->priv;
@@ -512,12 +552,14 @@
     zimg_image_buffer dst_buf = { ZIMG_API_VERSION };
     char buf[32];
     int ret = 0, plane;
-    AVFrame *out;
+    AVFrame *out = NULL;
 
-    out = ff_get_video_buffer(outlink, outlink->w, outlink->h);
-    if (!out) {
-        av_frame_free(&in);
-        return AVERROR(ENOMEM);
+    if ((ret = realign_frame(desc, &in)) < 0)
+        goto fail;
+
+    if (!(out = ff_get_video_buffer(outlink, outlink->w, outlink->h))) {
+        ret =  AVERROR(ENOMEM);
+        goto fail;
     }
 
     av_frame_copy_props(out, in);
@@ -546,11 +588,8 @@
         link->dst->inputs[0]->w      = in->width;
         link->dst->inputs[0]->h      = in->height;
 
-        if ((ret = config_props(outlink)) < 0) {
-            av_frame_free(&in);
-            av_frame_free(&out);
-            return ret;
-        }
+        if ((ret = config_props(outlink)) < 0)
+            goto fail;
 
         zimg_image_format_default(&s->src_format, ZIMG_API_VERSION);
         zimg_image_format_default(&s->dst_format, ZIMG_API_VERSION);
@@ -702,7 +741,7 @@
     return ff_filter_frame(outlink, out);
 }
 
-static void uninit(AVFilterContext *ctx)
+static av_cold void uninit(AVFilterContext *ctx)
 {
     ZScaleContext *s = ctx->priv;
 
@@ -738,12 +777,13 @@
 
 #define OFFSET(x) offsetof(ZScaleContext, x)
 #define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
+#define TFLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_RUNTIME_PARAM
 
 static const AVOption zscale_options[] = {
-    { "w",      "Output video width",  OFFSET(w_expr),    AV_OPT_TYPE_STRING, .flags = FLAGS },
-    { "width",  "Output video width",  OFFSET(w_expr),    AV_OPT_TYPE_STRING, .flags = FLAGS },
-    { "h",      "Output video height", OFFSET(h_expr),    AV_OPT_TYPE_STRING, .flags = FLAGS },
-    { "height", "Output video height", OFFSET(h_expr),    AV_OPT_TYPE_STRING, .flags = FLAGS },
+    { "w",      "Output video width",  OFFSET(w_expr),    AV_OPT_TYPE_STRING, .flags = TFLAGS },
+    { "width",  "Output video width",  OFFSET(w_expr),    AV_OPT_TYPE_STRING, .flags = TFLAGS },
+    { "h",      "Output video height", OFFSET(h_expr),    AV_OPT_TYPE_STRING, .flags = TFLAGS },
+    { "height", "Output video height", OFFSET(h_expr),    AV_OPT_TYPE_STRING, .flags = TFLAGS },
     { "size",   "set video size",      OFFSET(size_str),  AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, FLAGS },
     { "s",      "set video size",      OFFSET(size_str),  AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, FLAGS },
     { "dither", "set dither type",     OFFSET(dither),    AV_OPT_TYPE_INT, {.i64 = 0}, 0, ZIMG_DITHER_ERROR_DIFFUSION, FLAGS, "dither" },
@@ -789,6 +829,7 @@
     {     "smpte431",         0,       0,                 AV_OPT_TYPE_CONST, {.i64 = ZIMG_PRIMARIES_ST431_2},     0, 0, FLAGS, "primaries" },
     {     "smpte432",         0,       0,                 AV_OPT_TYPE_CONST, {.i64 = ZIMG_PRIMARIES_ST432_1},     0, 0, FLAGS, "primaries" },
     {     "jedec-p22",        0,       0,                 AV_OPT_TYPE_CONST, {.i64 = ZIMG_PRIMARIES_EBU3213_E},   0, 0, FLAGS, "primaries" },
+    {     "ebu3213",          0,       0,                 AV_OPT_TYPE_CONST, {.i64 = ZIMG_PRIMARIES_EBU3213_E},   0, 0, FLAGS, "primaries" },
     { "transfer", "set transfer characteristic", OFFSET(trc), AV_OPT_TYPE_INT, {.i64 = -1}, -1, INT_MAX, FLAGS, "transfer" },
     { "t",        "set transfer characteristic", OFFSET(trc), AV_OPT_TYPE_INT, {.i64 = -1}, -1, INT_MAX, FLAGS, "transfer" },
     {     "input",            0,       0,                 AV_OPT_TYPE_CONST, {.i64 = -1},                         0, 0, FLAGS, "transfer" },
@@ -859,13 +900,7 @@
     { NULL }
 };
 
-static const AVClass zscale_class = {
-    .class_name       = "zscale",
-    .item_name        = av_default_item_name,
-    .option           = zscale_options,
-    .version          = LIBAVUTIL_VERSION_INT,
-    .category         = AV_CLASS_CATEGORY_FILTER,
-};
+AVFILTER_DEFINE_CLASS(zscale);
 
 static const AVFilterPad avfilter_vf_zscale_inputs[] = {
     {
diff --git a/libavfilter/vsink_nullsink.c b/libavfilter/vsink_nullsink.c
index 281721b..060a5a3 100644
--- a/libavfilter/vsink_nullsink.c
+++ b/libavfilter/vsink_nullsink.c
@@ -38,9 +38,7 @@
 AVFilter ff_vsink_nullsink = {
     .name        = "nullsink",
     .description = NULL_IF_CONFIG_SMALL("Do absolutely nothing with the input video."),
-
-    .priv_size = 0,
-
-    .inputs    = avfilter_vsink_nullsink_inputs,
-    .outputs   = NULL,
+    .priv_size   = 0,
+    .inputs      = avfilter_vsink_nullsink_inputs,
+    .outputs     = NULL,
 };
diff --git a/libavfilter/vsrc_cellauto.c b/libavfilter/vsrc_cellauto.c
index 7a6d965..6fd812c 100644
--- a/libavfilter/vsrc_cellauto.c
+++ b/libavfilter/vsrc_cellauto.c
@@ -50,7 +50,7 @@
     uint64_t pts;
     AVRational frame_rate;
     double   random_fill_ratio;
-    uint32_t random_seed;
+    int64_t random_seed;
     int stitch, scroll, start_full;
     int64_t generation;         ///< the generation number, starting from 0
     AVLFG lfg;
@@ -72,8 +72,8 @@
     { "rule",     "set rule",       OFFSET(rule), AV_OPT_TYPE_INT,    {.i64 = 110},  0, 255, FLAGS },
     { "random_fill_ratio", "set fill ratio for filling initial grid randomly", OFFSET(random_fill_ratio), AV_OPT_TYPE_DOUBLE, {.dbl = 1/M_PHI}, 0, 1, FLAGS },
     { "ratio",             "set fill ratio for filling initial grid randomly", OFFSET(random_fill_ratio), AV_OPT_TYPE_DOUBLE, {.dbl = 1/M_PHI}, 0, 1, FLAGS },
-    { "random_seed", "set the seed for filling the initial grid randomly", OFFSET(random_seed), AV_OPT_TYPE_INT, {.i64 = -1}, -1, UINT32_MAX, FLAGS },
-    { "seed",        "set the seed for filling the initial grid randomly", OFFSET(random_seed), AV_OPT_TYPE_INT, {.i64 = -1}, -1, UINT32_MAX, FLAGS },
+    { "random_seed", "set the seed for filling the initial grid randomly", OFFSET(random_seed), AV_OPT_TYPE_INT64, {.i64 = -1}, -1, UINT32_MAX, FLAGS },
+    { "seed",        "set the seed for filling the initial grid randomly", OFFSET(random_seed), AV_OPT_TYPE_INT64, {.i64 = -1}, -1, UINT32_MAX, FLAGS },
     { "scroll",      "scroll pattern downward", OFFSET(scroll), AV_OPT_TYPE_BOOL, {.i64 = 1}, 0, 1, FLAGS },
     { "start_full",  "start filling the whole video", OFFSET(start_full), AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, FLAGS },
     { "full",        "start filling the whole video", OFFSET(start_full), AV_OPT_TYPE_BOOL, {.i64 = 1}, 0, 1, FLAGS },
@@ -199,7 +199,7 @@
     }
 
     av_log(ctx, AV_LOG_VERBOSE,
-           "s:%dx%d r:%d/%d rule:%d stitch:%d scroll:%d full:%d seed:%"PRIu32"\n",
+           "s:%dx%d r:%d/%d rule:%d stitch:%d scroll:%d full:%d seed:%"PRId64"\n",
            s->w, s->h, s->frame_rate.num, s->frame_rate.den,
            s->rule, s->stitch, s->scroll, s->start_full,
            s->random_seed);
diff --git a/libavfilter/vsrc_life.c b/libavfilter/vsrc_life.c
index a87ceef..6218eb1 100644
--- a/libavfilter/vsrc_life.c
+++ b/libavfilter/vsrc_life.c
@@ -63,7 +63,7 @@
     uint64_t pts;
     AVRational frame_rate;
     double   random_fill_ratio;
-    uint32_t random_seed;
+    int64_t random_seed;
     int stitch;
     int mold;
     uint8_t  life_color[4];
@@ -84,16 +84,16 @@
     { "s",        "set video size",   OFFSET(w),        AV_OPT_TYPE_IMAGE_SIZE, {.str = NULL}, 0, 0, FLAGS },
     { "rate",     "set video rate",   OFFSET(frame_rate), AV_OPT_TYPE_VIDEO_RATE, {.str = "25"}, 0, INT_MAX, FLAGS },
     { "r",        "set video rate",   OFFSET(frame_rate), AV_OPT_TYPE_VIDEO_RATE, {.str = "25"}, 0, INT_MAX, FLAGS },
-    { "rule",     "set rule",         OFFSET(rule_str), AV_OPT_TYPE_STRING, {.str = "B3/S23"}, CHAR_MIN, CHAR_MAX, FLAGS },
+    { "rule",     "set rule",         OFFSET(rule_str), AV_OPT_TYPE_STRING, {.str = "B3/S23"}, 0, 0, FLAGS },
     { "random_fill_ratio", "set fill ratio for filling initial grid randomly", OFFSET(random_fill_ratio), AV_OPT_TYPE_DOUBLE, {.dbl=1/M_PHI}, 0, 1, FLAGS },
     { "ratio",             "set fill ratio for filling initial grid randomly", OFFSET(random_fill_ratio), AV_OPT_TYPE_DOUBLE, {.dbl=1/M_PHI}, 0, 1, FLAGS },
-    { "random_seed", "set the seed for filling the initial grid randomly", OFFSET(random_seed), AV_OPT_TYPE_INT, {.i64=-1}, -1, UINT32_MAX, FLAGS },
-    { "seed",        "set the seed for filling the initial grid randomly", OFFSET(random_seed), AV_OPT_TYPE_INT, {.i64=-1}, -1, UINT32_MAX, FLAGS },
+    { "random_seed", "set the seed for filling the initial grid randomly", OFFSET(random_seed), AV_OPT_TYPE_INT64, {.i64=-1}, -1, UINT32_MAX, FLAGS },
+    { "seed",        "set the seed for filling the initial grid randomly", OFFSET(random_seed), AV_OPT_TYPE_INT64, {.i64=-1}, -1, UINT32_MAX, FLAGS },
     { "stitch",      "stitch boundaries", OFFSET(stitch), AV_OPT_TYPE_BOOL, {.i64=1}, 0, 1, FLAGS },
     { "mold",        "set mold speed for dead cells", OFFSET(mold), AV_OPT_TYPE_INT, {.i64=0}, 0, 0xFF, FLAGS },
-    { "life_color",  "set life color",  OFFSET( life_color), AV_OPT_TYPE_COLOR, {.str="white"}, CHAR_MIN, CHAR_MAX, FLAGS },
-    { "death_color", "set death color", OFFSET(death_color), AV_OPT_TYPE_COLOR, {.str="black"}, CHAR_MIN, CHAR_MAX, FLAGS },
-    { "mold_color",  "set mold color",  OFFSET( mold_color), AV_OPT_TYPE_COLOR, {.str="black"}, CHAR_MIN, CHAR_MAX, FLAGS },
+    { "life_color",  "set life color",  OFFSET( life_color), AV_OPT_TYPE_COLOR, {.str="white"}, 0, 0, FLAGS },
+    { "death_color", "set death color", OFFSET(death_color), AV_OPT_TYPE_COLOR, {.str="black"}, 0, 0, FLAGS },
+    { "mold_color",  "set mold color",  OFFSET( mold_color), AV_OPT_TYPE_COLOR, {.str="black"}, 0, 0, FLAGS },
     { NULL }
 };
 
@@ -260,7 +260,7 @@
     }
 
     av_log(ctx, AV_LOG_VERBOSE,
-           "s:%dx%d r:%d/%d rule:%s stay_rule:%d born_rule:%d stitch:%d seed:%"PRIu32"\n",
+           "s:%dx%d r:%d/%d rule:%s stay_rule:%d born_rule:%d stitch:%d seed:%"PRId64"\n",
            life->w, life->h, life->frame_rate.num, life->frame_rate.den,
            life->rule_str, life->stay_rule, life->born_rule, life->stitch,
            life->random_seed);
diff --git a/libavfilter/vsrc_mandelbrot.c b/libavfilter/vsrc_mandelbrot.c
index 6ad1081..1be05b6 100644
--- a/libavfilter/vsrc_mandelbrot.c
+++ b/libavfilter/vsrc_mandelbrot.c
@@ -87,10 +87,10 @@
 #define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
 
 static const AVOption mandelbrot_options[] = {
-    {"size",        "set frame size",                OFFSET(w),       AV_OPT_TYPE_IMAGE_SIZE, {.str="640x480"},  CHAR_MIN, CHAR_MAX, FLAGS },
-    {"s",           "set frame size",                OFFSET(w),       AV_OPT_TYPE_IMAGE_SIZE, {.str="640x480"},  CHAR_MIN, CHAR_MAX, FLAGS },
-    {"rate",        "set frame rate",                OFFSET(frame_rate), AV_OPT_TYPE_VIDEO_RATE, {.str="25"},  CHAR_MIN, CHAR_MAX, FLAGS },
-    {"r",           "set frame rate",                OFFSET(frame_rate), AV_OPT_TYPE_VIDEO_RATE, {.str="25"},  CHAR_MIN, CHAR_MAX, FLAGS },
+    {"size",        "set frame size",                OFFSET(w),       AV_OPT_TYPE_IMAGE_SIZE, {.str="640x480"},  0, 0, FLAGS },
+    {"s",           "set frame size",                OFFSET(w),       AV_OPT_TYPE_IMAGE_SIZE, {.str="640x480"},  0, 0, FLAGS },
+    {"rate",        "set frame rate",                OFFSET(frame_rate), AV_OPT_TYPE_VIDEO_RATE, {.str="25"},  0, 0, FLAGS },
+    {"r",           "set frame rate",                OFFSET(frame_rate), AV_OPT_TYPE_VIDEO_RATE, {.str="25"},  0, 0, FLAGS },
     {"maxiter",     "set max iterations number",     OFFSET(maxiter), AV_OPT_TYPE_INT,        {.i64=7189},  1,        INT_MAX, FLAGS },
     {"start_x",     "set the initial x position",    OFFSET(start_x), AV_OPT_TYPE_DOUBLE,     {.dbl=-0.743643887037158704752191506114774}, -100, 100, FLAGS },
     {"start_y",     "set the initial y position",    OFFSET(start_y), AV_OPT_TYPE_DOUBLE,     {.dbl=-0.131825904205311970493132056385139}, -100, 100, FLAGS },
diff --git a/libavfilter/vsrc_sierpinski.c b/libavfilter/vsrc_sierpinski.c
new file mode 100644
index 0000000..04e262a
--- /dev/null
+++ b/libavfilter/vsrc_sierpinski.c
@@ -0,0 +1,235 @@
+/*
+ * Copyright (c) 2019 Paul B Mahol
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file
+ * Sierpinski carpet fractal renderer
+ */
+
+#include "avfilter.h"
+#include "formats.h"
+#include "video.h"
+#include "internal.h"
+#include "libavutil/imgutils.h"
+#include "libavutil/intreadwrite.h"
+#include "libavutil/opt.h"
+#include "libavutil/parseutils.h"
+#include "libavutil/lfg.h"
+#include "libavutil/random_seed.h"
+#include <float.h>
+#include <math.h>
+
+typedef struct SierpinskiContext {
+    const AVClass *class;
+    int w, h;
+    int type;
+    AVRational frame_rate;
+    uint64_t pts;
+
+    int64_t seed;
+    int jump;
+
+    int pos_x, pos_y;
+    int dest_x, dest_y;
+
+    AVLFG lfg;
+    int (*draw_slice)(AVFilterContext *ctx, void *arg, int job, int nb_jobs);
+} SierpinskiContext;
+
+#define OFFSET(x) offsetof(SierpinskiContext, x)
+#define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
+
+static const AVOption sierpinski_options[] = {
+    {"size", "set frame size", OFFSET(w),          AV_OPT_TYPE_IMAGE_SIZE, {.str="640x480"}, 0,          0, FLAGS },
+    {"s",    "set frame size", OFFSET(w),          AV_OPT_TYPE_IMAGE_SIZE, {.str="640x480"}, 0,          0, FLAGS },
+    {"rate", "set frame rate", OFFSET(frame_rate), AV_OPT_TYPE_VIDEO_RATE, {.str="25"},      0,          0, FLAGS },
+    {"r",    "set frame rate", OFFSET(frame_rate), AV_OPT_TYPE_VIDEO_RATE, {.str="25"},      0,          0, FLAGS },
+    {"seed", "set the seed",   OFFSET(seed),       AV_OPT_TYPE_INT64,      {.i64=-1},       -1, UINT32_MAX, FLAGS },
+    {"jump", "set the jump",   OFFSET(jump),       AV_OPT_TYPE_INT,        {.i64=100},       1,      10000, FLAGS },
+    {"type","set fractal type",OFFSET(type),       AV_OPT_TYPE_INT,        {.i64=0},         0,          1, FLAGS, "type" },
+    {"carpet", "sierpinski carpet", 0,             AV_OPT_TYPE_CONST,      {.i64=0},         0,          0, FLAGS, "type" },
+    {"triangle", "sierpinski triangle", 0,         AV_OPT_TYPE_CONST,      {.i64=1},         0,          0, FLAGS, "type" },
+    {NULL},
+};
+
+AVFILTER_DEFINE_CLASS(sierpinski);
+
+static int query_formats(AVFilterContext *ctx)
+{
+    static const enum AVPixelFormat pix_fmts[] = {
+        AV_PIX_FMT_0BGR32,
+        AV_PIX_FMT_NONE
+    };
+
+    AVFilterFormats *fmts_list = ff_make_format_list(pix_fmts);
+    if (!fmts_list)
+        return AVERROR(ENOMEM);
+    return ff_set_common_formats(ctx, fmts_list);
+}
+
+static int fill_sierpinski(SierpinskiContext *s, int x, int y)
+{
+    int pos_x = x + s->pos_x;
+    int pos_y = y + s->pos_y;
+
+    while (pos_x != 0 && pos_y != 0) {
+        if (FFABS(pos_x % 3) == 1 && FFABS(pos_y % 3) == 1)
+            return 1;
+
+        pos_x /= 3;
+        pos_y /= 3;
+    }
+
+    return 0;
+}
+
+static int draw_triangle_slice(AVFilterContext *ctx, void *arg, int job, int nb_jobs)
+{
+    SierpinskiContext *s = ctx->priv;
+    AVFrame *frame = arg;
+    const int width  = frame->width;
+    const int height = frame->height;
+    const int start = (height *  job   ) / nb_jobs;
+    const int end   = (height * (job+1)) / nb_jobs;
+    uint8_t *dst = frame->data[0] + start * frame->linesize[0];
+
+    for (int y = start; y < end; y++) {
+        for (int x = 0; x < width; x++) {
+            if ((s->pos_x + x) & (s->pos_y + y)) {
+                AV_WL32(&dst[x*4], 0x00000000);
+            } else {
+                AV_WL32(&dst[x*4], 0xFFFFFFFF);
+            }
+        }
+
+        dst += frame->linesize[0];
+    }
+
+    return 0;
+}
+
+static int draw_carpet_slice(AVFilterContext *ctx, void *arg, int job, int nb_jobs)
+{
+    SierpinskiContext *s = ctx->priv;
+    AVFrame *frame = arg;
+    const int width  = frame->width;
+    const int height = frame->height;
+    const int start = (height *  job   ) / nb_jobs;
+    const int end   = (height * (job+1)) / nb_jobs;
+    uint8_t *dst = frame->data[0] + start * frame->linesize[0];
+
+    for (int y = start; y < end; y++) {
+        for (int x = 0; x < width; x++) {
+            if (fill_sierpinski(s, x, y)) {
+                AV_WL32(&dst[x*4], 0x00000000);
+            } else {
+                AV_WL32(&dst[x*4], 0xFFFFFFFF);
+            }
+        }
+
+        dst += frame->linesize[0];
+    }
+
+    return 0;
+}
+
+static int config_output(AVFilterLink *inlink)
+{
+    AVFilterContext *ctx = inlink->src;
+    SierpinskiContext *s = ctx->priv;
+
+    if (av_image_check_size(s->w, s->h, 0, ctx) < 0)
+        return AVERROR(EINVAL);
+
+    inlink->w = s->w;
+    inlink->h = s->h;
+    inlink->time_base = av_inv_q(s->frame_rate);
+    inlink->sample_aspect_ratio = (AVRational) {1, 1};
+    if (s->seed == -1)
+        s->seed = av_get_random_seed();
+    av_lfg_init(&s->lfg, s->seed);
+
+    s->draw_slice = s->type ? draw_triangle_slice : draw_carpet_slice;
+
+    return 0;
+}
+
+static void draw_sierpinski(AVFilterContext *ctx, AVFrame *frame)
+{
+    SierpinskiContext *s = ctx->priv;
+    AVFilterLink *outlink = ctx->outputs[0];
+
+    if (s->pos_x == s->dest_x && s->pos_y == s->dest_y) {
+        unsigned int rnd = av_lfg_get(&s->lfg);
+        int mod = 2 * s->jump + 1;
+
+        s->dest_x += (int)((rnd & 0xffff) % mod) - s->jump;
+        s->dest_y += (int)((rnd >>    16) % mod) - s->jump;
+    } else {
+        if (s->pos_x < s->dest_x)
+            s->pos_x++;
+        else if (s->pos_x > s->dest_x)
+            s->pos_x--;
+
+        if (s->pos_y < s->dest_y)
+            s->pos_y++;
+        else if (s->pos_y > s->dest_y)
+            s->pos_y--;
+    }
+
+    ctx->internal->execute(ctx, s->draw_slice, frame, NULL, FFMIN(outlink->h, ff_filter_get_nb_threads(ctx)));
+}
+
+static int sierpinski_request_frame(AVFilterLink *link)
+{
+    SierpinskiContext *s = link->src->priv;
+    AVFrame *frame = ff_get_video_buffer(link, s->w, s->h);
+
+    if (!frame)
+        return AVERROR(ENOMEM);
+
+    frame->sample_aspect_ratio = (AVRational) {1, 1};
+    frame->pts = s->pts++;
+
+    draw_sierpinski(link->src, frame);
+
+    return ff_filter_frame(link, frame);
+}
+
+static const AVFilterPad sierpinski_outputs[] = {
+    {
+        .name          = "default",
+        .type          = AVMEDIA_TYPE_VIDEO,
+        .request_frame = sierpinski_request_frame,
+        .config_props  = config_output,
+    },
+    { NULL }
+};
+
+AVFilter ff_vsrc_sierpinski = {
+    .name          = "sierpinski",
+    .description   = NULL_IF_CONFIG_SMALL("Render a Sierpinski fractal."),
+    .priv_size     = sizeof(SierpinskiContext),
+    .priv_class    = &sierpinski_class,
+    .query_formats = query_formats,
+    .inputs        = NULL,
+    .outputs       = sierpinski_outputs,
+    .flags         = AVFILTER_FLAG_SLICE_THREADS,
+};
diff --git a/libavfilter/vsrc_testsrc.c b/libavfilter/vsrc_testsrc.c
index f067148..e8c33b0 100644
--- a/libavfilter/vsrc_testsrc.c
+++ b/libavfilter/vsrc_testsrc.c
@@ -83,6 +83,7 @@
 
 #define OFFSET(x) offsetof(TestSourceContext, x)
 #define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
+#define FLAGSR AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_RUNTIME_PARAM
 
 #define SIZE_OPTIONS \
     { "size",     "set video size",     OFFSET(w),        AV_OPT_TYPE_IMAGE_SIZE, {.str = "320x240"}, 0, 0, FLAGS },\
@@ -181,8 +182,8 @@
 #if CONFIG_COLOR_FILTER
 
 static const AVOption color_options[] = {
-    { "color", "set color", OFFSET(color_rgba), AV_OPT_TYPE_COLOR, {.str = "black"}, CHAR_MIN, CHAR_MAX, FLAGS },
-    { "c",     "set color", OFFSET(color_rgba), AV_OPT_TYPE_COLOR, {.str = "black"}, CHAR_MIN, CHAR_MAX, FLAGS },
+    { "color", "set color", OFFSET(color_rgba), AV_OPT_TYPE_COLOR, {.str = "black"}, 0, 0, FLAGSR },
+    { "c",     "set color", OFFSET(color_rgba), AV_OPT_TYPE_COLOR, {.str = "black"}, 0, 0, FLAGSR },
     COMMON_OPTIONS
     { NULL }
 };
@@ -236,20 +237,13 @@
     TestSourceContext *test = ctx->priv;
     int ret;
 
-    if (!strcmp(cmd, "color") || !strcmp(cmd, "c")) {
-        uint8_t color_rgba[4];
+    ret = ff_filter_process_command(ctx, cmd, args, res, res_len, flags);
+    if (ret < 0)
+        return ret;
 
-        ret = av_parse_color(color_rgba, args, -1, ctx);
-        if (ret < 0)
-            return ret;
-
-        memcpy(test->color_rgba, color_rgba, sizeof(color_rgba));
-        ff_draw_color(&test->draw, &test->color, test->color_rgba);
-        test->draw_once_reset = 1;
-        return 0;
-    }
-
-    return AVERROR(ENOSYS);
+    ff_draw_color(&test->draw, &test->color, test->color_rgba);
+    test->draw_once_reset = 1;
+    return 0;
 }
 
 static const AVFilterPad color_outputs[] = {
@@ -280,7 +274,7 @@
 #if CONFIG_HALDCLUTSRC_FILTER
 
 static const AVOption haldclutsrc_options[] = {
-    { "level", "set level", OFFSET(level), AV_OPT_TYPE_INT, {.i64 = 6}, 2, 8, FLAGS },
+    { "level", "set level", OFFSET(level), AV_OPT_TYPE_INT, {.i64 = 6}, 2, 16, FLAGS },
     COMMON_OPTIONS_NOSIZE
     { NULL }
 };
@@ -968,10 +962,10 @@
 #define A 3
 
 static void rgbtest_put_pixel(uint8_t *dst, int dst_linesize,
-                              int x, int y, int r, int g, int b, enum AVPixelFormat fmt,
+                              int x, int y, unsigned r, unsigned g, unsigned b, enum AVPixelFormat fmt,
                               uint8_t rgba_map[4])
 {
-    int32_t v;
+    uint32_t v;
     uint8_t *p;
 
     switch (fmt) {
@@ -991,7 +985,7 @@
     case AV_PIX_FMT_BGRA:
     case AV_PIX_FMT_ARGB:
     case AV_PIX_FMT_ABGR:
-        v = (r << (rgba_map[R]*8)) + (g << (rgba_map[G]*8)) + (b << (rgba_map[B]*8)) + (255 << (rgba_map[A]*8));
+        v = (r << (rgba_map[R]*8)) + (g << (rgba_map[G]*8)) + (b << (rgba_map[B]*8)) + (255U << (rgba_map[A]*8));
         p = dst + 4*x + y*dst_linesize;
         AV_WL32(p, v);
         break;
diff --git a/libavfilter/vulkan.c b/libavfilter/vulkan.c
new file mode 100644
index 0000000..c103440
--- /dev/null
+++ b/libavfilter/vulkan.c
@@ -0,0 +1,1244 @@
+/*
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "formats.h"
+#include "vulkan.h"
+#include "glslang.h"
+
+/* Generic macro for creating contexts which need to keep their addresses
+ * if another context is created. */
+#define FN_CREATING(ctx, type, shortname, array, num)                          \
+static av_always_inline type *create_ ##shortname(ctx *dctx)                   \
+{                                                                              \
+    type **array, *sctx = av_mallocz(sizeof(*sctx));                           \
+    if (!sctx)                                                                 \
+        return NULL;                                                           \
+                                                                               \
+    array = av_realloc_array(dctx->array, sizeof(*dctx->array), dctx->num + 1);\
+    if (!array) {                                                              \
+        av_free(sctx);                                                         \
+        return NULL;                                                           \
+    }                                                                          \
+                                                                               \
+    dctx->array = array;                                                       \
+    dctx->array[dctx->num++] = sctx;                                           \
+                                                                               \
+    return sctx;                                                               \
+}
+
+const VkComponentMapping ff_comp_identity_map = {
+    .r = VK_COMPONENT_SWIZZLE_IDENTITY,
+    .g = VK_COMPONENT_SWIZZLE_IDENTITY,
+    .b = VK_COMPONENT_SWIZZLE_IDENTITY,
+    .a = VK_COMPONENT_SWIZZLE_IDENTITY,
+};
+
+/* Converts return values to strings */
+const char *ff_vk_ret2str(VkResult res)
+{
+#define CASE(VAL) case VAL: return #VAL
+    switch (res) {
+    CASE(VK_SUCCESS);
+    CASE(VK_NOT_READY);
+    CASE(VK_TIMEOUT);
+    CASE(VK_EVENT_SET);
+    CASE(VK_EVENT_RESET);
+    CASE(VK_INCOMPLETE);
+    CASE(VK_ERROR_OUT_OF_HOST_MEMORY);
+    CASE(VK_ERROR_OUT_OF_DEVICE_MEMORY);
+    CASE(VK_ERROR_INITIALIZATION_FAILED);
+    CASE(VK_ERROR_DEVICE_LOST);
+    CASE(VK_ERROR_MEMORY_MAP_FAILED);
+    CASE(VK_ERROR_LAYER_NOT_PRESENT);
+    CASE(VK_ERROR_EXTENSION_NOT_PRESENT);
+    CASE(VK_ERROR_FEATURE_NOT_PRESENT);
+    CASE(VK_ERROR_INCOMPATIBLE_DRIVER);
+    CASE(VK_ERROR_TOO_MANY_OBJECTS);
+    CASE(VK_ERROR_FORMAT_NOT_SUPPORTED);
+    CASE(VK_ERROR_FRAGMENTED_POOL);
+    CASE(VK_ERROR_SURFACE_LOST_KHR);
+    CASE(VK_ERROR_NATIVE_WINDOW_IN_USE_KHR);
+    CASE(VK_SUBOPTIMAL_KHR);
+    CASE(VK_ERROR_OUT_OF_DATE_KHR);
+    CASE(VK_ERROR_INCOMPATIBLE_DISPLAY_KHR);
+    CASE(VK_ERROR_VALIDATION_FAILED_EXT);
+    CASE(VK_ERROR_INVALID_SHADER_NV);
+    CASE(VK_ERROR_OUT_OF_POOL_MEMORY);
+    CASE(VK_ERROR_INVALID_EXTERNAL_HANDLE);
+    CASE(VK_ERROR_NOT_PERMITTED_EXT);
+    default: return "Unknown error";
+    }
+#undef CASE
+}
+
+static int vk_alloc_mem(AVFilterContext *avctx, VkMemoryRequirements *req,
+                        VkMemoryPropertyFlagBits req_flags, void *alloc_extension,
+                        VkMemoryPropertyFlagBits *mem_flags, VkDeviceMemory *mem)
+{
+    VkResult ret;
+    int index = -1;
+    VkPhysicalDeviceProperties props;
+    VkPhysicalDeviceMemoryProperties mprops;
+    VulkanFilterContext *s = avctx->priv;
+
+    VkMemoryAllocateInfo alloc_info = {
+        .sType           = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO,
+        .pNext           = alloc_extension,
+    };
+
+    vkGetPhysicalDeviceProperties(s->hwctx->phys_dev, &props);
+    vkGetPhysicalDeviceMemoryProperties(s->hwctx->phys_dev, &mprops);
+
+    /* Align if we need to */
+    if (req_flags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT)
+        req->size = FFALIGN(req->size, props.limits.minMemoryMapAlignment);
+
+    alloc_info.allocationSize = req->size;
+
+    /* The vulkan spec requires memory types to be sorted in the "optimal"
+     * order, so the first matching type we find will be the best/fastest one */
+    for (int i = 0; i < mprops.memoryTypeCount; i++) {
+        /* The memory type must be supported by the requirements (bitfield) */
+        if (!(req->memoryTypeBits & (1 << i)))
+            continue;
+
+        /* The memory type flags must include our properties */
+        if ((mprops.memoryTypes[i].propertyFlags & req_flags) != req_flags)
+            continue;
+
+        /* Found a suitable memory type */
+        index = i;
+        break;
+    }
+
+    if (index < 0) {
+        av_log(avctx, AV_LOG_ERROR, "No memory type found for flags 0x%x\n",
+               req_flags);
+        return AVERROR(EINVAL);
+    }
+
+    alloc_info.memoryTypeIndex = index;
+
+    ret = vkAllocateMemory(s->hwctx->act_dev, &alloc_info,
+                           s->hwctx->alloc, mem);
+    if (ret != VK_SUCCESS) {
+        av_log(avctx, AV_LOG_ERROR, "Failed to allocate memory: %s\n",
+               ff_vk_ret2str(ret));
+        return AVERROR(ENOMEM);
+    }
+
+    *mem_flags |= mprops.memoryTypes[index].propertyFlags;
+
+    return 0;
+}
+
+int ff_vk_create_buf(AVFilterContext *avctx, FFVkBuffer *buf, size_t size,
+                     VkBufferUsageFlags usage, VkMemoryPropertyFlagBits flags)
+{
+    int err;
+    VkResult ret;
+    VkMemoryRequirements req;
+    VulkanFilterContext *s = avctx->priv;
+
+    VkBufferCreateInfo buf_spawn = {
+        .sType       = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,
+        .pNext       = NULL,
+        .usage       = usage,
+        .sharingMode = VK_SHARING_MODE_EXCLUSIVE,
+        .size        = size, /* Gets FFALIGNED during alloc if host visible
+                                but should be ok */
+    };
+
+    ret = vkCreateBuffer(s->hwctx->act_dev, &buf_spawn, NULL, &buf->buf);
+    if (ret != VK_SUCCESS) {
+        av_log(avctx, AV_LOG_ERROR, "Failed to create buffer: %s\n",
+               ff_vk_ret2str(ret));
+        return AVERROR_EXTERNAL;
+    }
+
+    vkGetBufferMemoryRequirements(s->hwctx->act_dev, buf->buf, &req);
+
+    err = vk_alloc_mem(avctx, &req, flags, NULL, &buf->flags, &buf->mem);
+    if (err)
+        return err;
+
+    ret = vkBindBufferMemory(s->hwctx->act_dev, buf->buf, buf->mem, 0);
+    if (ret != VK_SUCCESS) {
+        av_log(avctx, AV_LOG_ERROR, "Failed to bind memory to buffer: %s\n",
+               ff_vk_ret2str(ret));
+        return AVERROR_EXTERNAL;
+    }
+
+    return 0;
+}
+
+int ff_vk_map_buffers(AVFilterContext *avctx, FFVkBuffer *buf, uint8_t *mem[],
+                      int nb_buffers, int invalidate)
+{
+    VkResult ret;
+    VulkanFilterContext *s = avctx->priv;
+    VkMappedMemoryRange *inval_list = NULL;
+    int inval_count = 0;
+
+    for (int i = 0; i < nb_buffers; i++) {
+        ret = vkMapMemory(s->hwctx->act_dev, buf[i].mem, 0,
+                          VK_WHOLE_SIZE, 0, (void **)&mem[i]);
+        if (ret != VK_SUCCESS) {
+            av_log(avctx, AV_LOG_ERROR, "Failed to map buffer memory: %s\n",
+                   ff_vk_ret2str(ret));
+            return AVERROR_EXTERNAL;
+        }
+    }
+
+    if (!invalidate)
+        return 0;
+
+    for (int i = 0; i < nb_buffers; i++) {
+        const VkMappedMemoryRange ival_buf = {
+            .sType  = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE,
+            .memory = buf[i].mem,
+            .size   = VK_WHOLE_SIZE,
+        };
+        if (buf[i].flags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT)
+            continue;
+        inval_list = av_fast_realloc(s->scratch, &s->scratch_size,
+                                     (++inval_count)*sizeof(*inval_list));
+        if (!inval_list)
+            return AVERROR(ENOMEM);
+        inval_list[inval_count - 1] = ival_buf;
+    }
+
+    if (inval_count) {
+        ret = vkInvalidateMappedMemoryRanges(s->hwctx->act_dev, inval_count,
+                                             inval_list);
+        if (ret != VK_SUCCESS) {
+            av_log(avctx, AV_LOG_ERROR, "Failed to invalidate memory: %s\n",
+                   ff_vk_ret2str(ret));
+            return AVERROR_EXTERNAL;
+        }
+    }
+
+    return 0;
+}
+
+int ff_vk_unmap_buffers(AVFilterContext *avctx, FFVkBuffer *buf, int nb_buffers,
+                        int flush)
+{
+    int err = 0;
+    VkResult ret;
+    VulkanFilterContext *s = avctx->priv;
+    VkMappedMemoryRange *flush_list = NULL;
+    int flush_count = 0;
+
+    if (flush) {
+        for (int i = 0; i < nb_buffers; i++) {
+            const VkMappedMemoryRange flush_buf = {
+                .sType  = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE,
+                .memory = buf[i].mem,
+                .size   = VK_WHOLE_SIZE,
+            };
+            if (buf[i].flags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT)
+                continue;
+            flush_list = av_fast_realloc(s->scratch, &s->scratch_size,
+                                         (++flush_count)*sizeof(*flush_list));
+            if (!flush_list)
+                return AVERROR(ENOMEM);
+            flush_list[flush_count - 1] = flush_buf;
+        }
+    }
+
+    if (flush_count) {
+        ret = vkFlushMappedMemoryRanges(s->hwctx->act_dev, flush_count,
+                                        flush_list);
+        if (ret != VK_SUCCESS) {
+            av_log(avctx, AV_LOG_ERROR, "Failed to flush memory: %s\n",
+                   ff_vk_ret2str(ret));
+            err = AVERROR_EXTERNAL; /* We still want to try to unmap them */
+        }
+    }
+
+    for (int i = 0; i < nb_buffers; i++)
+        vkUnmapMemory(s->hwctx->act_dev, buf[i].mem);
+
+    return err;
+}
+
+void ff_vk_free_buf(AVFilterContext *avctx, FFVkBuffer *buf)
+{
+    VulkanFilterContext *s = avctx->priv;
+    if (!buf)
+        return;
+
+    if (buf->buf != VK_NULL_HANDLE)
+        vkDestroyBuffer(s->hwctx->act_dev, buf->buf, s->hwctx->alloc);
+    if (buf->mem != VK_NULL_HANDLE)
+        vkFreeMemory(s->hwctx->act_dev, buf->mem, s->hwctx->alloc);
+}
+
+int ff_vk_add_push_constant(AVFilterContext *avctx, VulkanPipeline *pl,
+                            int offset, int size, VkShaderStageFlagBits stage)
+{
+    VkPushConstantRange *pc;
+
+    pl->push_consts = av_realloc_array(pl->push_consts, sizeof(*pl->push_consts),
+                                       pl->push_consts_num + 1);
+    if (!pl->push_consts)
+        return AVERROR(ENOMEM);
+
+    pc = &pl->push_consts[pl->push_consts_num++];
+    memset(pc, 0, sizeof(*pc));
+
+    pc->stageFlags = stage;
+    pc->offset = offset;
+    pc->size = size;
+
+    return 0;
+}
+
+FN_CREATING(VulkanFilterContext, FFVkExecContext, exec_ctx, exec_ctx, exec_ctx_num)
+int ff_vk_create_exec_ctx(AVFilterContext *avctx, FFVkExecContext **ctx, int queue)
+{
+    VkResult ret;
+    FFVkExecContext *e;
+    VulkanFilterContext *s = avctx->priv;
+
+    VkCommandPoolCreateInfo cqueue_create = {
+        .sType              = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,
+        .flags              = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT,
+        .queueFamilyIndex   = queue,
+    };
+    VkCommandBufferAllocateInfo cbuf_create = {
+        .sType              = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,
+        .level              = VK_COMMAND_BUFFER_LEVEL_PRIMARY,
+        .commandBufferCount = 1,
+    };
+    VkFenceCreateInfo fence_spawn = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO };
+
+    e = create_exec_ctx(s);
+    if (!e)
+        return AVERROR(ENOMEM);
+
+    ret = vkCreateCommandPool(s->hwctx->act_dev, &cqueue_create,
+                              s->hwctx->alloc, &e->pool);
+    if (ret != VK_SUCCESS) {
+        av_log(avctx, AV_LOG_ERROR, "Command pool creation failure: %s\n",
+               ff_vk_ret2str(ret));
+        return 1;
+    }
+
+    cbuf_create.commandPool = e->pool;
+
+    ret = vkAllocateCommandBuffers(s->hwctx->act_dev, &cbuf_create, &e->buf);
+    if (ret != VK_SUCCESS) {
+        av_log(avctx, AV_LOG_ERROR, "Command buffer alloc failure: %s\n",
+               ff_vk_ret2str(ret));
+        return 1;
+    }
+
+    ret = vkCreateFence(s->hwctx->act_dev, &fence_spawn,
+                        s->hwctx->alloc, &e->fence);
+    if (ret != VK_SUCCESS) {
+        av_log(avctx, AV_LOG_ERROR, "Failed to create frame fence: %s\n",
+               ff_vk_ret2str(ret));
+        return 1;
+    }
+
+    vkGetDeviceQueue(s->hwctx->act_dev, queue, 0, &e->queue);
+
+    *ctx = e;
+
+    return 0;
+}
+
+int ff_vk_start_exec_recording(AVFilterContext *avctx, FFVkExecContext *e)
+{
+    VkResult ret;
+    VkCommandBufferBeginInfo cmd_start = {
+        .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
+        .flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT,
+    };
+
+    e->sem_wait_cnt = 0;
+    e->sem_sig_cnt = 0;
+
+    ret = vkBeginCommandBuffer(e->buf, &cmd_start);
+    if (ret != VK_SUCCESS) {
+        av_log(avctx, AV_LOG_ERROR, "Failed to start command recoding: %s\n",
+               ff_vk_ret2str(ret));
+        return AVERROR_EXTERNAL;
+    }
+
+    return 0;
+}
+
+int ff_vk_add_exec_dep(AVFilterContext *avctx, FFVkExecContext *e,
+                       AVFrame *frame, VkPipelineStageFlagBits in_wait_dst_flag)
+{
+    AVVkFrame *f = (AVVkFrame *)frame->data[0];
+
+    e->sem_wait = av_fast_realloc(e->sem_wait, &e->sem_wait_alloc,
+                                  (e->sem_wait_cnt + 1)*sizeof(*e->sem_wait));
+    if (!e->sem_wait)
+        return AVERROR(ENOMEM);
+
+    e->sem_wait_dst = av_fast_realloc(e->sem_wait_dst, &e->sem_wait_dst_alloc,
+                                      (e->sem_wait_cnt + 1)*sizeof(*e->sem_wait_dst));
+    if (!e->sem_wait_dst)
+        return AVERROR(ENOMEM);
+
+    e->sem_sig = av_fast_realloc(e->sem_sig, &e->sem_sig_alloc,
+                                 (e->sem_sig_cnt + 1)*sizeof(*e->sem_sig));
+    if (!e->sem_sig)
+        return AVERROR(ENOMEM);
+
+    e->sem_wait[e->sem_wait_cnt] = f->sem;
+    e->sem_wait_dst[e->sem_wait_cnt] = in_wait_dst_flag;
+    e->sem_wait_cnt++;
+
+    e->sem_sig[e->sem_sig_cnt] = f->sem;
+    e->sem_sig_cnt++;
+
+    return 0;
+}
+
+int ff_vk_submit_exec_queue(AVFilterContext *avctx, FFVkExecContext *e)
+{
+    VkResult ret;
+    VulkanFilterContext *s = avctx->priv;
+
+    VkSubmitInfo s_info = {
+        .sType                = VK_STRUCTURE_TYPE_SUBMIT_INFO,
+        .commandBufferCount   = 1,
+        .pCommandBuffers      = &e->buf,
+
+        .pWaitSemaphores      = e->sem_wait,
+        .pWaitDstStageMask    = e->sem_wait_dst,
+        .waitSemaphoreCount   = e->sem_wait_cnt,
+
+        .pSignalSemaphores    = e->sem_sig,
+        .signalSemaphoreCount = e->sem_sig_cnt,
+    };
+
+    vkEndCommandBuffer(e->buf);
+
+    ret = vkQueueSubmit(e->queue, 1, &s_info, e->fence);
+    if (ret != VK_SUCCESS) {
+        av_log(avctx, AV_LOG_ERROR, "Unable to submit command buffer: %s\n",
+               ff_vk_ret2str(ret));
+        return AVERROR_EXTERNAL;
+    }
+
+    vkWaitForFences(s->hwctx->act_dev, 1, &e->fence, VK_TRUE, UINT64_MAX);
+    vkResetFences(s->hwctx->act_dev, 1, &e->fence);
+
+    return 0;
+}
+
+int ff_vk_filter_query_formats(AVFilterContext *avctx)
+{
+    static const enum AVPixelFormat pixel_formats[] = {
+        AV_PIX_FMT_VULKAN, AV_PIX_FMT_NONE,
+    };
+    AVFilterFormats *pix_fmts = ff_make_format_list(pixel_formats);
+    if (!pix_fmts)
+        return AVERROR(ENOMEM);
+
+    return ff_set_common_formats(avctx, pix_fmts);
+}
+
+static int vulkan_filter_set_device(AVFilterContext *avctx,
+                                    AVBufferRef *device)
+{
+    VulkanFilterContext *s = avctx->priv;
+
+    av_buffer_unref(&s->device_ref);
+
+    s->device_ref = av_buffer_ref(device);
+    if (!s->device_ref)
+        return AVERROR(ENOMEM);
+
+    s->device = (AVHWDeviceContext*)s->device_ref->data;
+    s->hwctx  = s->device->hwctx;
+
+    return 0;
+}
+
+static int vulkan_filter_set_frames(AVFilterContext *avctx,
+                                    AVBufferRef *frames)
+{
+    VulkanFilterContext *s = avctx->priv;
+
+    av_buffer_unref(&s->frames_ref);
+
+    s->frames_ref = av_buffer_ref(frames);
+    if (!s->frames_ref)
+        return AVERROR(ENOMEM);
+
+    return 0;
+}
+
+int ff_vk_filter_config_input(AVFilterLink *inlink)
+{
+    int err;
+    AVFilterContext *avctx = inlink->dst;
+    VulkanFilterContext *s = avctx->priv;
+    AVHWFramesContext *input_frames;
+
+    if (!inlink->hw_frames_ctx) {
+        av_log(avctx, AV_LOG_ERROR, "Vulkan filtering requires a "
+               "hardware frames context on the input.\n");
+        return AVERROR(EINVAL);
+    }
+
+    /* Extract the device and default output format from the first input. */
+    if (avctx->inputs[0] != inlink)
+        return 0;
+
+    input_frames = (AVHWFramesContext*)inlink->hw_frames_ctx->data;
+    if (input_frames->format != AV_PIX_FMT_VULKAN)
+        return AVERROR(EINVAL);
+
+    err = vulkan_filter_set_device(avctx, input_frames->device_ref);
+    if (err < 0)
+        return err;
+    err = vulkan_filter_set_frames(avctx, inlink->hw_frames_ctx);
+    if (err < 0)
+        return err;
+
+    /* Default output parameters match input parameters. */
+    s->input_format = input_frames->sw_format;
+    if (s->output_format == AV_PIX_FMT_NONE)
+        s->output_format = input_frames->sw_format;
+    if (!s->output_width)
+        s->output_width  = inlink->w;
+    if (!s->output_height)
+        s->output_height = inlink->h;
+
+    return 0;
+}
+
+int ff_vk_filter_config_output_inplace(AVFilterLink *outlink)
+{
+    int err;
+    AVFilterContext *avctx = outlink->src;
+    VulkanFilterContext *s = avctx->priv;
+
+    av_buffer_unref(&outlink->hw_frames_ctx);
+
+    if (!s->device_ref) {
+        if (!avctx->hw_device_ctx) {
+            av_log(avctx, AV_LOG_ERROR, "Vulkan filtering requires a "
+                   "Vulkan device.\n");
+            return AVERROR(EINVAL);
+        }
+
+        err = vulkan_filter_set_device(avctx, avctx->hw_device_ctx);
+        if (err < 0)
+            return err;
+    }
+
+    outlink->hw_frames_ctx = av_buffer_ref(s->frames_ref);
+    if (!outlink->hw_frames_ctx)
+        return AVERROR(ENOMEM);
+
+    outlink->w = s->output_width;
+    outlink->h = s->output_height;
+
+    return 0;
+}
+
+int ff_vk_filter_config_output(AVFilterLink *outlink)
+{
+    int err;
+    AVFilterContext *avctx = outlink->src;
+    VulkanFilterContext *s = avctx->priv;
+    AVBufferRef *output_frames_ref;
+    AVHWFramesContext *output_frames;
+
+    av_buffer_unref(&outlink->hw_frames_ctx);
+
+    if (!s->device_ref) {
+        if (!avctx->hw_device_ctx) {
+            av_log(avctx, AV_LOG_ERROR, "Vulkan filtering requires a "
+                   "Vulkan device.\n");
+            return AVERROR(EINVAL);
+        }
+
+        err = vulkan_filter_set_device(avctx, avctx->hw_device_ctx);
+        if (err < 0)
+            return err;
+    }
+
+    output_frames_ref = av_hwframe_ctx_alloc(s->device_ref);
+    if (!output_frames_ref) {
+        err = AVERROR(ENOMEM);
+        goto fail;
+    }
+    output_frames = (AVHWFramesContext*)output_frames_ref->data;
+
+    output_frames->format    = AV_PIX_FMT_VULKAN;
+    output_frames->sw_format = s->output_format;
+    output_frames->width     = s->output_width;
+    output_frames->height    = s->output_height;
+
+    err = av_hwframe_ctx_init(output_frames_ref);
+    if (err < 0) {
+        av_log(avctx, AV_LOG_ERROR, "Failed to initialise output "
+               "frames: %d.\n", err);
+        goto fail;
+    }
+
+    outlink->hw_frames_ctx = output_frames_ref;
+    outlink->w = s->output_width;
+    outlink->h = s->output_height;
+
+    return 0;
+fail:
+    av_buffer_unref(&output_frames_ref);
+    return err;
+}
+
+int ff_vk_filter_init(AVFilterContext *avctx)
+{
+    VulkanFilterContext *s = avctx->priv;
+
+    s->output_format = AV_PIX_FMT_NONE;
+
+    if (glslang_init())
+        return AVERROR_EXTERNAL;
+
+    return 0;
+}
+
+FN_CREATING(VulkanFilterContext, VkSampler, sampler, samplers, samplers_num)
+VkSampler *ff_vk_init_sampler(AVFilterContext *avctx, int unnorm_coords,
+                              VkFilter filt)
+{
+    VkResult ret;
+    VulkanFilterContext *s = avctx->priv;
+
+    VkSamplerCreateInfo sampler_info = {
+        .sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO,
+        .magFilter = filt,
+        .minFilter = sampler_info.magFilter,
+        .mipmapMode = unnorm_coords ? VK_SAMPLER_MIPMAP_MODE_NEAREST :
+                                      VK_SAMPLER_MIPMAP_MODE_LINEAR,
+        .addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE,
+        .addressModeV = sampler_info.addressModeU,
+        .addressModeW = sampler_info.addressModeU,
+        .anisotropyEnable = VK_FALSE,
+        .compareOp = VK_COMPARE_OP_NEVER,
+        .borderColor = VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK,
+        .unnormalizedCoordinates = unnorm_coords,
+    };
+
+    VkSampler *sampler = create_sampler(s);
+    if (!sampler)
+        return NULL;
+
+    ret = vkCreateSampler(s->hwctx->act_dev, &sampler_info,
+                          s->hwctx->alloc, sampler);
+    if (ret != VK_SUCCESS) {
+        av_log(avctx, AV_LOG_ERROR, "Unable to init sampler: %s\n",
+               ff_vk_ret2str(ret));
+        return NULL;
+    }
+
+    return sampler;
+}
+
+int ff_vk_mt_is_np_rgb(enum AVPixelFormat pix_fmt)
+{
+    if (pix_fmt == AV_PIX_FMT_ABGR   || pix_fmt == AV_PIX_FMT_BGRA   ||
+        pix_fmt == AV_PIX_FMT_RGBA   || pix_fmt == AV_PIX_FMT_RGB24  ||
+        pix_fmt == AV_PIX_FMT_BGR24  || pix_fmt == AV_PIX_FMT_RGB48  ||
+        pix_fmt == AV_PIX_FMT_RGBA64 || pix_fmt == AV_PIX_FMT_RGB565 ||
+        pix_fmt == AV_PIX_FMT_BGR565 || pix_fmt == AV_PIX_FMT_BGR0   ||
+        pix_fmt == AV_PIX_FMT_0BGR   || pix_fmt == AV_PIX_FMT_RGB0)
+        return 1;
+    return 0;
+}
+
+const char *ff_vk_shader_rep_fmt(enum AVPixelFormat pixfmt)
+{
+    const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pixfmt);
+    const int high = desc->comp[0].depth > 8;
+    return high ? "rgba16f" : "rgba8";
+}
+
+int ff_vk_create_imageview(AVFilterContext *avctx, VkImageView *v, VkImage img,
+                           VkFormat fmt, const VkComponentMapping map)
+{
+    VulkanFilterContext *s = avctx->priv;
+    VkImageViewCreateInfo imgview_spawn = {
+        .sType      = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
+        .pNext      = NULL,
+        .image      = img,
+        .viewType   = VK_IMAGE_VIEW_TYPE_2D,
+        .format     = fmt,
+        .components = map,
+        .subresourceRange = {
+            .aspectMask     = VK_IMAGE_ASPECT_COLOR_BIT,
+            .baseMipLevel   = 0,
+            .levelCount     = 1,
+            .baseArrayLayer = 0,
+            .layerCount     = 1,
+        },
+    };
+
+    VkResult ret = vkCreateImageView(s->hwctx->act_dev, &imgview_spawn,
+                                     s->hwctx->alloc, v);
+    if (ret != VK_SUCCESS) {
+        av_log(s, AV_LOG_ERROR, "Failed to create imageview: %s\n",
+               ff_vk_ret2str(ret));
+        return AVERROR_EXTERNAL;
+    }
+
+    return 0;
+}
+
+void ff_vk_destroy_imageview(AVFilterContext *avctx, VkImageView *v)
+{
+    VulkanFilterContext *s = avctx->priv;
+    if (v && *v) {
+        vkDestroyImageView(s->hwctx->act_dev, *v, s->hwctx->alloc);
+        *v = NULL;
+    }
+}
+
+FN_CREATING(VulkanPipeline, SPIRVShader, shader, shaders, shaders_num)
+SPIRVShader *ff_vk_init_shader(AVFilterContext *avctx, VulkanPipeline *pl,
+                               const char *name, VkShaderStageFlags stage)
+{
+    SPIRVShader *shd = create_shader(pl);
+    if (!shd)
+        return NULL;
+
+    av_bprint_init(&shd->src, 0, AV_BPRINT_SIZE_UNLIMITED);
+
+    shd->shader.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
+    shd->shader.stage = stage;
+
+    shd->name = name;
+
+    GLSLF(0, #version %i                                                  ,460);
+    GLSLC(0, #define IS_WITHIN(v1, v2) ((v1.x < v2.x) && (v1.y < v2.y))       );
+    GLSLC(0,                                                                  );
+
+    return shd;
+}
+
+void ff_vk_set_compute_shader_sizes(AVFilterContext *avctx, SPIRVShader *shd,
+                                        int local_size[3])
+{
+    shd->local_size[0] = local_size[0];
+    shd->local_size[1] = local_size[1];
+    shd->local_size[2] = local_size[2];
+
+    av_bprintf(&shd->src, "layout (local_size_x = %i, "
+               "local_size_y = %i, local_size_z = %i) in;\n\n",
+               shd->local_size[0], shd->local_size[1], shd->local_size[2]);
+}
+
+static void print_shader(AVFilterContext *avctx, SPIRVShader *shd, int prio)
+{
+    int line = 0;
+    const char *p = shd->src.str;
+    const char *start = p;
+
+    AVBPrint buf;
+    av_bprint_init(&buf, 0, AV_BPRINT_SIZE_UNLIMITED);
+
+    for (int i = 0; i < strlen(p); i++) {
+        if (p[i] == '\n') {
+            av_bprintf(&buf, "%i\t", ++line);
+            av_bprint_append_data(&buf, start, &p[i] - start + 1);
+            start = &p[i + 1];
+        }
+    }
+
+    av_log(avctx, prio, "Shader %s: \n%s", shd->name, buf.str);
+    av_bprint_finalize(&buf, NULL);
+}
+
+int ff_vk_compile_shader(AVFilterContext *avctx, SPIRVShader *shd,
+                         const char *entrypoint)
+{
+    VkResult ret;
+    VulkanFilterContext *s = avctx->priv;
+    VkShaderModuleCreateInfo shader_create;
+    GLSlangResult *res;
+
+    static const enum GLSlangStage emap[] = {
+        [VK_SHADER_STAGE_VERTEX_BIT]   = GLSLANG_VERTEX,
+        [VK_SHADER_STAGE_FRAGMENT_BIT] = GLSLANG_FRAGMENT,
+        [VK_SHADER_STAGE_COMPUTE_BIT]  = GLSLANG_COMPUTE,
+    };
+
+    shd->shader.pName = entrypoint;
+
+    res = glslang_compile(shd->src.str, emap[shd->shader.stage]);
+    if (!res)
+        return AVERROR(ENOMEM);
+
+    if (res->rval) {
+        av_log(avctx, AV_LOG_ERROR, "Error compiling shader %s: %s!\n",
+               shd->name, av_err2str(res->rval));
+        print_shader(avctx, shd, AV_LOG_ERROR);
+        if (res->error_msg)
+            av_log(avctx, AV_LOG_ERROR, "%s", res->error_msg);
+        av_free(res->error_msg);
+        return res->rval;
+    }
+
+    print_shader(avctx, shd, AV_LOG_VERBOSE);
+
+    shader_create.sType    = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
+    shader_create.pNext    = NULL;
+    shader_create.codeSize = res->size;
+    shader_create.flags    = 0;
+    shader_create.pCode    = res->data;
+
+    ret = vkCreateShaderModule(s->hwctx->act_dev, &shader_create, NULL,
+                               &shd->shader.module);
+
+    /* Free the GLSlangResult struct */
+    av_free(res);
+
+    if (ret != VK_SUCCESS) {
+        av_log(avctx, AV_LOG_ERROR, "Unable to create shader module: %s\n",
+               ff_vk_ret2str(ret));
+        return AVERROR_EXTERNAL;
+    }
+
+    av_log(avctx, AV_LOG_VERBOSE, "Shader %s linked! Size: %zu bytes\n",
+           shd->name, shader_create.codeSize);
+
+    return 0;
+}
+
+static const struct descriptor_props {
+    size_t struct_size; /* Size of the opaque which updates the descriptor */
+    const char *type;
+    int is_uniform;
+    int mem_quali;      /* Can use a memory qualifier */
+    int dim_needed;     /* Must indicate dimension */
+    int buf_content;    /* Must indicate buffer contents */
+} descriptor_props[] = {
+    [VK_DESCRIPTOR_TYPE_SAMPLER]                = { sizeof(VkDescriptorImageInfo),  "sampler",       1, 0, 0, 0, },
+    [VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE]          = { sizeof(VkDescriptorImageInfo),  "texture",       1, 0, 1, 0, },
+    [VK_DESCRIPTOR_TYPE_STORAGE_IMAGE]          = { sizeof(VkDescriptorImageInfo),  "image",         1, 1, 1, 0, },
+    [VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT]       = { sizeof(VkDescriptorImageInfo),  "subpassInput",  1, 0, 0, 0, },
+    [VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER] = { sizeof(VkDescriptorImageInfo),  "sampler",       1, 0, 1, 0, },
+    [VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER]         = { sizeof(VkDescriptorBufferInfo),  NULL,           1, 0, 0, 1, },
+    [VK_DESCRIPTOR_TYPE_STORAGE_BUFFER]         = { sizeof(VkDescriptorBufferInfo), "buffer",        0, 1, 0, 1, },
+    [VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC] = { sizeof(VkDescriptorBufferInfo),  NULL,           1, 0, 0, 1, },
+    [VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC] = { sizeof(VkDescriptorBufferInfo), "buffer",        0, 1, 0, 1, },
+    [VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER]   = { sizeof(VkBufferView),           "samplerBuffer", 1, 0, 0, 0, },
+    [VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER]   = { sizeof(VkBufferView),           "imageBuffer",   1, 0, 0, 0, },
+};
+
+int ff_vk_add_descriptor_set(AVFilterContext *avctx, VulkanPipeline *pl,
+                             SPIRVShader *shd, VulkanDescriptorSetBinding *desc,
+                             int num, int only_print_to_shader)
+{
+    VkResult ret;
+    VkDescriptorSetLayout *layout;
+    VulkanFilterContext *s = avctx->priv;
+
+    if (only_print_to_shader)
+        goto print;
+
+    pl->desc_layout = av_realloc_array(pl->desc_layout, sizeof(*pl->desc_layout),
+                                       pl->descriptor_sets_num + 1);
+    if (!pl->desc_layout)
+        return AVERROR(ENOMEM);
+
+    layout = &pl->desc_layout[pl->descriptor_sets_num];
+    memset(layout, 0, sizeof(*layout));
+
+    { /* Create descriptor set layout descriptions */
+        VkDescriptorSetLayoutCreateInfo desc_create_layout = { 0 };
+        VkDescriptorSetLayoutBinding *desc_binding;
+
+        desc_binding = av_mallocz(sizeof(*desc_binding)*num);
+        if (!desc_binding)
+            return AVERROR(ENOMEM);
+
+        for (int i = 0; i < num; i++) {
+            desc_binding[i].binding            = i;
+            desc_binding[i].descriptorType     = desc[i].type;
+            desc_binding[i].descriptorCount    = FFMAX(desc[i].elems, 1);
+            desc_binding[i].stageFlags         = desc[i].stages;
+            desc_binding[i].pImmutableSamplers = desc[i].samplers;
+        }
+
+        desc_create_layout.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
+        desc_create_layout.pBindings = desc_binding;
+        desc_create_layout.bindingCount = num;
+
+        ret = vkCreateDescriptorSetLayout(s->hwctx->act_dev, &desc_create_layout,
+                                          s->hwctx->alloc, layout);
+        av_free(desc_binding);
+        if (ret != VK_SUCCESS) {
+            av_log(avctx, AV_LOG_ERROR, "Unable to init descriptor set "
+                   "layout: %s\n", ff_vk_ret2str(ret));
+            return AVERROR_EXTERNAL;
+        }
+    }
+
+    { /* Pool each descriptor by type and update pool counts */
+        for (int i = 0; i < num; i++) {
+            int j;
+            for (j = 0; j < pl->pool_size_desc_num; j++)
+                if (pl->pool_size_desc[j].type == desc[i].type)
+                    break;
+            if (j >= pl->pool_size_desc_num) {
+                pl->pool_size_desc = av_realloc_array(pl->pool_size_desc,
+                                                      sizeof(*pl->pool_size_desc),
+                                                      ++pl->pool_size_desc_num);
+                if (!pl->pool_size_desc)
+                    return AVERROR(ENOMEM);
+                memset(&pl->pool_size_desc[j], 0, sizeof(VkDescriptorPoolSize));
+            }
+            pl->pool_size_desc[j].type             = desc[i].type;
+            pl->pool_size_desc[j].descriptorCount += FFMAX(desc[i].elems, 1);
+        }
+    }
+
+    { /* Create template creation struct */
+        VkDescriptorUpdateTemplateCreateInfo *dt;
+        VkDescriptorUpdateTemplateEntry *des_entries;
+
+        /* Freed after descriptor set initialization */
+        des_entries = av_mallocz(num*sizeof(VkDescriptorUpdateTemplateEntry));
+        if (!des_entries)
+            return AVERROR(ENOMEM);
+
+        for (int i = 0; i < num; i++) {
+            des_entries[i].dstBinding      = i;
+            des_entries[i].descriptorType  = desc[i].type;
+            des_entries[i].descriptorCount = FFMAX(desc[i].elems, 1);
+            des_entries[i].dstArrayElement = 0;
+            des_entries[i].offset          = ((uint8_t *)desc[i].updater) - (uint8_t *)s;
+            des_entries[i].stride          = descriptor_props[desc[i].type].struct_size;
+        }
+
+        pl->desc_template_info = av_realloc_array(pl->desc_template_info,
+                                                  sizeof(*pl->desc_template_info),
+                                                  pl->descriptor_sets_num + 1);
+        if (!pl->desc_template_info)
+            return AVERROR(ENOMEM);
+
+        dt = &pl->desc_template_info[pl->descriptor_sets_num];
+        memset(dt, 0, sizeof(*dt));
+
+        dt->sType = VK_STRUCTURE_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_CREATE_INFO;
+        dt->templateType = VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET;
+        dt->descriptorSetLayout = *layout;
+        dt->pDescriptorUpdateEntries = des_entries;
+        dt->descriptorUpdateEntryCount = num;
+    }
+
+    pl->descriptor_sets_num++;
+
+print:
+    /* Write shader info */
+    for (int i = 0; i < num; i++) {
+        const struct descriptor_props *prop = &descriptor_props[desc[i].type];
+        GLSLA("layout (set = %i, binding = %i", pl->descriptor_sets_num - 1, i);
+
+        if (desc[i].mem_layout)
+            GLSLA(", %s", desc[i].mem_layout);
+        GLSLA(")");
+
+        if (prop->is_uniform)
+            GLSLA(" uniform");
+
+        if (prop->mem_quali && desc[i].mem_quali)
+            GLSLA(" %s", desc[i].mem_quali);
+
+        if (prop->type)
+            GLSLA(" %s", prop->type);
+
+        if (prop->dim_needed)
+            GLSLA("%iD", desc[i].dimensions);
+
+        GLSLA(" %s", desc[i].name);
+
+        if (prop->buf_content)
+            GLSLA(" {\n    %s\n}", desc[i].buf_content);
+        else if (desc[i].elems > 0)
+            GLSLA("[%i]", desc[i].elems);
+
+        GLSLA(";\n");
+    }
+    GLSLA("\n");
+
+    return 0;
+}
+
+void ff_vk_update_descriptor_set(AVFilterContext *avctx, VulkanPipeline *pl,
+                                 int set_id)
+{
+    VulkanFilterContext *s = avctx->priv;
+
+    vkUpdateDescriptorSetWithTemplate(s->hwctx->act_dev,
+                                      pl->desc_set[set_id],
+                                      pl->desc_template[set_id], s);
+}
+
+void ff_vk_update_push_exec(AVFilterContext *avctx, FFVkExecContext *e,
+                            VkShaderStageFlagBits stage, int offset,
+                            size_t size, void *src)
+{
+    vkCmdPushConstants(e->buf, e->bound_pl->pipeline_layout,
+                       stage, offset, size, src);
+}
+
+int ff_vk_init_pipeline_layout(AVFilterContext *avctx, VulkanPipeline *pl)
+{
+    VkResult ret;
+    VulkanFilterContext *s = avctx->priv;
+
+    { /* Init descriptor set pool */
+        VkDescriptorPoolCreateInfo pool_create_info = {
+            .sType         = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
+            .poolSizeCount = pl->pool_size_desc_num,
+            .pPoolSizes    = pl->pool_size_desc,
+            .maxSets       = pl->descriptor_sets_num,
+        };
+
+        ret = vkCreateDescriptorPool(s->hwctx->act_dev, &pool_create_info,
+                                     s->hwctx->alloc, &pl->desc_pool);
+        av_freep(&pl->pool_size_desc);
+        if (ret != VK_SUCCESS) {
+            av_log(avctx, AV_LOG_ERROR, "Unable to init descriptor set "
+                   "pool: %s\n", ff_vk_ret2str(ret));
+            return AVERROR_EXTERNAL;
+        }
+    }
+
+    { /* Allocate descriptor sets */
+        VkDescriptorSetAllocateInfo alloc_info = {
+            .sType              = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO,
+            .descriptorPool     = pl->desc_pool,
+            .descriptorSetCount = pl->descriptor_sets_num,
+            .pSetLayouts        = pl->desc_layout,
+        };
+
+        pl->desc_set = av_malloc(pl->descriptor_sets_num*sizeof(*pl->desc_set));
+        if (!pl->desc_set)
+            return AVERROR(ENOMEM);
+
+        ret = vkAllocateDescriptorSets(s->hwctx->act_dev, &alloc_info,
+                                       pl->desc_set);
+        if (ret != VK_SUCCESS) {
+            av_log(avctx, AV_LOG_ERROR, "Unable to allocate descriptor set: %s\n",
+                   ff_vk_ret2str(ret));
+            return AVERROR_EXTERNAL;
+        }
+    }
+
+    { /* Finally create the pipeline layout */
+        VkPipelineLayoutCreateInfo spawn_pipeline_layout = {
+            .sType                  = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
+            .setLayoutCount         = pl->descriptor_sets_num,
+            .pSetLayouts            = pl->desc_layout,
+            .pushConstantRangeCount = pl->push_consts_num,
+            .pPushConstantRanges    = pl->push_consts,
+        };
+
+        ret = vkCreatePipelineLayout(s->hwctx->act_dev, &spawn_pipeline_layout,
+                                     s->hwctx->alloc, &pl->pipeline_layout);
+        av_freep(&pl->push_consts);
+        pl->push_consts_num = 0;
+        if (ret != VK_SUCCESS) {
+            av_log(avctx, AV_LOG_ERROR, "Unable to init pipeline layout: %s\n",
+                   ff_vk_ret2str(ret));
+            return AVERROR_EXTERNAL;
+        }
+    }
+
+    { /* Descriptor template (for tightly packed descriptors) */
+        VkDescriptorUpdateTemplateCreateInfo *desc_template_info;
+
+        pl->desc_template = av_malloc(pl->descriptor_sets_num*sizeof(*pl->desc_template));
+        if (!pl->desc_template)
+            return AVERROR(ENOMEM);
+
+        /* Create update templates for the descriptor sets */
+        for (int i = 0; i < pl->descriptor_sets_num; i++) {
+            desc_template_info = &pl->desc_template_info[i];
+            desc_template_info->pipelineLayout = pl->pipeline_layout;
+            ret = vkCreateDescriptorUpdateTemplate(s->hwctx->act_dev,
+                                                   desc_template_info,
+                                                   s->hwctx->alloc,
+                                                   &pl->desc_template[i]);
+            av_free((void *)desc_template_info->pDescriptorUpdateEntries);
+            if (ret != VK_SUCCESS) {
+                av_log(avctx, AV_LOG_ERROR, "Unable to init descriptor "
+                       "template: %s\n", ff_vk_ret2str(ret));
+                return AVERROR_EXTERNAL;
+            }
+        }
+
+        av_freep(&pl->desc_template_info);
+    }
+
+    return 0;
+}
+
+FN_CREATING(VulkanFilterContext, VulkanPipeline, pipeline, pipelines, pipelines_num)
+VulkanPipeline *ff_vk_create_pipeline(AVFilterContext *avctx)
+{
+    return create_pipeline(avctx->priv);
+}
+
+int ff_vk_init_compute_pipeline(AVFilterContext *avctx, VulkanPipeline *pl)
+{
+    int i;
+    VkResult ret;
+    VulkanFilterContext *s = avctx->priv;
+
+    VkComputePipelineCreateInfo pipe = {
+        .sType  = VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
+        .layout = pl->pipeline_layout,
+    };
+
+    for (i = 0; i < pl->shaders_num; i++) {
+        if (pl->shaders[i]->shader.stage & VK_SHADER_STAGE_COMPUTE_BIT) {
+            pipe.stage = pl->shaders[i]->shader;
+            break;
+        }
+    }
+    if (i == pl->shaders_num) {
+        av_log(avctx, AV_LOG_ERROR, "Can't init compute pipeline, no shader\n");
+        return AVERROR(EINVAL);
+    }
+
+    ret = vkCreateComputePipelines(s->hwctx->act_dev, VK_NULL_HANDLE, 1, &pipe,
+                                   s->hwctx->alloc, &pl->pipeline);
+    if (ret != VK_SUCCESS) {
+        av_log(avctx, AV_LOG_ERROR, "Unable to init compute pipeline: %s\n",
+               ff_vk_ret2str(ret));
+        return AVERROR_EXTERNAL;
+    }
+
+    pl->bind_point = VK_PIPELINE_BIND_POINT_COMPUTE;
+
+    return 0;
+}
+
+void ff_vk_bind_pipeline_exec(AVFilterContext *avctx, FFVkExecContext *e,
+                              VulkanPipeline *pl)
+{
+    vkCmdBindPipeline(e->buf, pl->bind_point, pl->pipeline);
+
+    vkCmdBindDescriptorSets(e->buf, pl->bind_point, pl->pipeline_layout, 0,
+                            pl->descriptor_sets_num, pl->desc_set, 0, 0);
+
+    e->bound_pl = pl;
+}
+
+static void free_exec_ctx(VulkanFilterContext *s, FFVkExecContext *e)
+{
+    vkDestroyFence(s->hwctx->act_dev, e->fence, s->hwctx->alloc);
+
+    if (e->buf   != VK_NULL_HANDLE)
+        vkFreeCommandBuffers(s->hwctx->act_dev, e->pool, 1, &e->buf);
+    if (e->pool  != VK_NULL_HANDLE)
+        vkDestroyCommandPool(s->hwctx->act_dev, e->pool, s->hwctx->alloc);
+
+    av_free(e->sem_wait);
+    av_free(e->sem_wait_dst);
+    av_free(e->sem_sig);
+
+    av_free(e);
+}
+
+static void free_pipeline(VulkanFilterContext *s, VulkanPipeline *pl)
+{
+    for (int i = 0; i < pl->shaders_num; i++) {
+        SPIRVShader *shd = pl->shaders[i];
+        av_bprint_finalize(&shd->src, NULL);
+        vkDestroyShaderModule(s->hwctx->act_dev, shd->shader.module,
+                              s->hwctx->alloc);
+        av_free(shd);
+    }
+
+    vkDestroyPipeline(s->hwctx->act_dev, pl->pipeline, s->hwctx->alloc);
+    vkDestroyPipelineLayout(s->hwctx->act_dev, pl->pipeline_layout,
+                            s->hwctx->alloc);
+
+    for (int i = 0; i < pl->descriptor_sets_num; i++) {
+        if (pl->desc_template && pl->desc_template[i])
+            vkDestroyDescriptorUpdateTemplate(s->hwctx->act_dev, pl->desc_template[i],
+                                              s->hwctx->alloc);
+        if (pl->desc_layout && pl->desc_layout[i])
+            vkDestroyDescriptorSetLayout(s->hwctx->act_dev, pl->desc_layout[i],
+                                         s->hwctx->alloc);
+    }
+
+    /* Also frees the descriptor sets */
+    if (pl->desc_pool)
+        vkDestroyDescriptorPool(s->hwctx->act_dev, pl->desc_pool,
+                                s->hwctx->alloc);
+
+    av_freep(&pl->desc_set);
+    av_freep(&pl->shaders);
+    av_freep(&pl->desc_layout);
+    av_freep(&pl->desc_template);
+    av_freep(&pl->push_consts);
+    pl->push_consts_num = 0;
+
+    /* Only freed in case of failure */
+    av_freep(&pl->pool_size_desc);
+    if (pl->desc_template_info) {
+        for (int i = 0; i < pl->descriptor_sets_num; i++)
+            av_free((void *)pl->desc_template_info[i].pDescriptorUpdateEntries);
+        av_freep(&pl->desc_template_info);
+    }
+
+    av_free(pl);
+}
+
+void ff_vk_filter_uninit(AVFilterContext *avctx)
+{
+    VulkanFilterContext *s = avctx->priv;
+
+    glslang_uninit();
+
+    for (int i = 0; i < s->samplers_num; i++)
+        vkDestroySampler(s->hwctx->act_dev, *s->samplers[i], s->hwctx->alloc);
+    av_freep(&s->samplers);
+
+    for (int i = 0; i < s->pipelines_num; i++)
+        free_pipeline(s, s->pipelines[i]);
+    av_freep(&s->pipelines);
+
+    for (int i = 0; i < s->exec_ctx_num; i++)
+        free_exec_ctx(s, s->exec_ctx[i]);
+    av_freep(&s->exec_ctx);
+
+    av_freep(&s->scratch);
+    s->scratch_size = 0;
+
+    av_buffer_unref(&s->device_ref);
+    av_buffer_unref(&s->frames_ref);
+}
diff --git a/libavfilter/vulkan.h b/libavfilter/vulkan.h
new file mode 100644
index 0000000..30a64ce
--- /dev/null
+++ b/libavfilter/vulkan.h
@@ -0,0 +1,328 @@
+/*
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVFILTER_VULKAN_H
+#define AVFILTER_VULKAN_H
+
+#include "avfilter.h"
+#include "libavutil/pixdesc.h"
+#include "libavutil/bprint.h"
+#include "libavutil/hwcontext.h"
+#include "libavutil/hwcontext_vulkan.h"
+
+/* GLSL management macros */
+#define INDENT(N) INDENT_##N
+#define INDENT_0
+#define INDENT_1 INDENT_0 "    "
+#define INDENT_2 INDENT_1 INDENT_1
+#define INDENT_3 INDENT_2 INDENT_1
+#define INDENT_4 INDENT_3 INDENT_1
+#define INDENT_5 INDENT_4 INDENT_1
+#define INDENT_6 INDENT_5 INDENT_1
+#define C(N, S)          INDENT(N) #S "\n"
+#define GLSLC(N, S)      av_bprintf(&shd->src, C(N, S))
+#define GLSLA(...)       av_bprintf(&shd->src, __VA_ARGS__)
+#define GLSLF(N, S, ...) av_bprintf(&shd->src, C(N, S), __VA_ARGS__)
+#define GLSLD(D)         GLSLC(0, );                                           \
+                         av_bprint_append_data(&shd->src, D, strlen(D));       \
+                         GLSLC(0, )
+
+/* Helper, pretty much every Vulkan return value needs to be checked */
+#define RET(x)                                                                 \
+    do {                                                                       \
+        if ((err = (x)) < 0)                                                   \
+            goto fail;                                                         \
+    } while (0)
+
+/* Useful for attaching immutable samplers to arrays */
+#define DUP_SAMPLER_ARRAY4(x) (VkSampler []){ x, x, x, x, }
+
+typedef struct SPIRVShader {
+    const char *name;                       /* Name for id/debugging purposes */
+    AVBPrint src;
+    int local_size[3];                      /* Compute shader workgroup sizes */
+    VkPipelineShaderStageCreateInfo shader;
+} SPIRVShader;
+
+typedef struct VulkanDescriptorSetBinding {
+    const char         *name;
+    VkDescriptorType    type;
+    const char         *mem_layout;  /* Storage images (rgba8, etc.) and buffers (std430, etc.) */
+    const char         *mem_quali;   /* readonly, writeonly, etc. */
+    const char         *buf_content; /* For buffers */
+    uint32_t            dimensions;  /* Needed for e.g. sampler%iD */
+    uint32_t            elems;       /* 0 - scalar, 1 or more - vector */
+    VkShaderStageFlags  stages;
+    const VkSampler    *samplers;    /* Immutable samplers, length - #elems */
+    void               *updater;     /* Pointer to VkDescriptor*Info */
+} VulkanDescriptorSetBinding;
+
+typedef struct FFVkBuffer {
+    VkBuffer buf;
+    VkDeviceMemory mem;
+    VkMemoryPropertyFlagBits flags;
+} FFVkBuffer;
+
+typedef struct VulkanPipeline {
+    VkPipelineBindPoint bind_point;
+
+    /* Contexts */
+    VkPipelineLayout pipeline_layout;
+    VkPipeline       pipeline;
+
+    /* Shaders */
+    SPIRVShader **shaders;
+    int shaders_num;
+
+    /* Push consts */
+    VkPushConstantRange *push_consts;
+    int push_consts_num;
+
+    /* Descriptors */
+    VkDescriptorSetLayout      *desc_layout;
+    VkDescriptorPool            desc_pool;
+    VkDescriptorSet            *desc_set;
+    VkDescriptorUpdateTemplate *desc_template;
+    int                         descriptor_sets_num;
+    int                         pool_size_desc_num;
+
+    /* Temporary, used to store data in between initialization stages */
+    VkDescriptorUpdateTemplateCreateInfo *desc_template_info;
+    VkDescriptorPoolSize *pool_size_desc;
+} VulkanPipeline;
+
+typedef struct FFVkExecContext {
+    VkCommandPool pool;
+    VkCommandBuffer buf;
+    VkQueue queue;
+    VkFence fence;
+
+    VulkanPipeline *bound_pl;
+
+    VkSemaphore *sem_wait;
+    int sem_wait_alloc; /* Allocated sem_wait */
+    int sem_wait_cnt;
+
+    VkPipelineStageFlagBits *sem_wait_dst;
+    int sem_wait_dst_alloc; /* Allocated sem_wait_dst */
+
+    VkSemaphore *sem_sig;
+    int sem_sig_alloc; /* Allocated sem_sig */
+    int sem_sig_cnt;
+} FFVkExecContext;
+
+typedef struct VulkanFilterContext {
+    const AVClass         *class;
+
+    AVBufferRef           *device_ref;
+    AVBufferRef           *frames_ref; /* For in-place filtering */
+    AVHWDeviceContext     *device;
+    AVVulkanDeviceContext *hwctx;
+
+    /* Properties */
+    int                 output_width;
+    int                output_height;
+    enum AVPixelFormat output_format;
+    enum AVPixelFormat  input_format;
+
+    /* Samplers */
+    VkSampler **samplers;
+    int samplers_num;
+
+    /* Exec contexts */
+    FFVkExecContext **exec_ctx;
+    int exec_ctx_num;
+
+    /* Pipelines (each can have 1 shader of each type) */
+    VulkanPipeline **pipelines;
+    int pipelines_num;
+
+    void *scratch; /* Scratch memory used only in functions */
+    unsigned int scratch_size;
+} VulkanFilterContext;
+
+/* Identity mapping - r = r, b = b, g = g, a = a */
+extern const VkComponentMapping ff_comp_identity_map;
+
+/**
+ * General lavfi IO functions
+ */
+int  ff_vk_filter_query_formats        (AVFilterContext *avctx);
+int  ff_vk_filter_init                 (AVFilterContext *avctx);
+int  ff_vk_filter_config_input         (AVFilterLink   *inlink);
+int  ff_vk_filter_config_output        (AVFilterLink  *outlink);
+int  ff_vk_filter_config_output_inplace(AVFilterLink  *outlink);
+void ff_vk_filter_uninit               (AVFilterContext *avctx);
+
+/**
+ * Converts Vulkan return values to strings
+ */
+const char *ff_vk_ret2str(VkResult res);
+
+/**
+ * Returns 1 if the image is any sort of supported RGB
+ */
+int ff_vk_mt_is_np_rgb(enum AVPixelFormat pix_fmt);
+
+/**
+ * Gets the glsl format string for a pixel format
+ */
+const char *ff_vk_shader_rep_fmt(enum AVPixelFormat pixfmt);
+
+/**
+ * Create a Vulkan sampler, will be auto-freed in ff_vk_filter_uninit()
+ */
+VkSampler *ff_vk_init_sampler(AVFilterContext *avctx, int unnorm_coords,
+                              VkFilter filt);
+
+/**
+ * Create an imageview.
+ */
+int ff_vk_create_imageview(AVFilterContext *avctx, VkImageView *v, VkImage img,
+                           VkFormat fmt, const VkComponentMapping map);
+
+/**
+ * Destroy an imageview. Command buffer must have completed executing, which
+ * ff_vk_submit_exec_queue() will ensure
+ */
+void ff_vk_destroy_imageview(AVFilterContext *avctx, VkImageView *v);
+
+/**
+ * Define a push constant for a given stage into a pipeline.
+ * Must be called before the pipeline layout has been initialized.
+ */
+int ff_vk_add_push_constant(AVFilterContext *avctx, VulkanPipeline *pl,
+                            int offset, int size, VkShaderStageFlagBits stage);
+
+/**
+ * Inits a pipeline. Everything in it will be auto-freed when calling
+ * ff_vk_filter_uninit().
+ */
+VulkanPipeline *ff_vk_create_pipeline(AVFilterContext *avctx);
+
+/**
+ * Inits a shader for a specific pipeline. Will be auto-freed on uninit.
+ */
+SPIRVShader *ff_vk_init_shader(AVFilterContext *avctx, VulkanPipeline *pl,
+                               const char *name, VkShaderStageFlags stage);
+
+/**
+ * Writes the workgroup size for a shader.
+ */
+void ff_vk_set_compute_shader_sizes(AVFilterContext *avctx, SPIRVShader *shd,
+                                    int local_size[3]);
+
+/**
+ * Adds a descriptor set to the shader and registers them in the pipeline.
+ */
+int ff_vk_add_descriptor_set(AVFilterContext *avctx, VulkanPipeline *pl,
+                             SPIRVShader *shd, VulkanDescriptorSetBinding *desc,
+                             int num, int only_print_to_shader);
+
+/**
+ * Compiles the shader, entrypoint must be set to "main".
+ */
+int ff_vk_compile_shader(AVFilterContext *avctx, SPIRVShader *shd,
+                         const char *entrypoint);
+
+/**
+ * Initializes the pipeline layout after all shaders and descriptor sets have
+ * been finished.
+ */
+int ff_vk_init_pipeline_layout(AVFilterContext *avctx, VulkanPipeline *pl);
+
+/**
+ * Initializes a compute pipeline. Will pick the first shader with the
+ * COMPUTE flag set.
+ */
+int ff_vk_init_compute_pipeline(AVFilterContext *avctx, VulkanPipeline *pl);
+
+/**
+ * Updates a descriptor set via the updaters defined.
+ * Can be called immediately after pipeline creation, but must be called
+ * at least once before queue submission.
+ */
+void ff_vk_update_descriptor_set(AVFilterContext *avctx, VulkanPipeline *pl,
+                                 int set_id);
+
+/**
+ * Init an execution context for command recording and queue submission.
+ * WIll be auto-freed on uninit.
+ */
+int ff_vk_create_exec_ctx(AVFilterContext *avctx, FFVkExecContext **ctx, int queue);
+
+/**
+ * Begin recording to the command buffer. Previous execution must have been
+ * completed, which ff_vk_submit_exec_queue() will ensure.
+ */
+int ff_vk_start_exec_recording(AVFilterContext *avctx, FFVkExecContext *e);
+
+/**
+ * Add a command to bind the completed pipeline and its descriptor sets.
+ * Must be called after ff_vk_start_exec_recording() and before submission.
+ */
+void ff_vk_bind_pipeline_exec(AVFilterContext *avctx, FFVkExecContext *e,
+                              VulkanPipeline *pl);
+
+/**
+ * Updates push constants.
+ * Must be called after binding a pipeline if any push constants were defined.
+ */
+void ff_vk_update_push_exec(AVFilterContext *avctx, FFVkExecContext *e,
+                            VkShaderStageFlagBits stage, int offset,
+                            size_t size, void *src);
+
+/**
+ * Adds a frame as a queue dependency. This manages semaphore signalling.
+ * Must be called before submission.
+ */
+int ff_vk_add_exec_dep(AVFilterContext *avctx, FFVkExecContext *e,
+                       AVFrame *frame, VkPipelineStageFlagBits in_wait_dst_flag);
+
+/**
+ * Submits a command buffer to the queue for execution.
+ * Will block until execution has finished in order to simplify resource
+ * management.
+ */
+int ff_vk_submit_exec_queue(AVFilterContext *avctx, FFVkExecContext *e);
+
+/**
+ * Create a VkBuffer with the specified parameters.
+ */
+int ff_vk_create_buf(AVFilterContext *avctx, FFVkBuffer *buf, size_t size,
+                     VkBufferUsageFlags usage, VkMemoryPropertyFlagBits flags);
+
+/**
+ * Maps the buffer to userspace. Set invalidate to 1 if reading the contents
+ * is necessary.
+ */
+int ff_vk_map_buffers(AVFilterContext *avctx, FFVkBuffer *buf, uint8_t *mem[],
+                      int nb_buffers, int invalidate);
+
+/**
+ * Unmaps the buffer from userspace. Set flush to 1 to write and sync.
+ */
+int ff_vk_unmap_buffers(AVFilterContext *avctx, FFVkBuffer *buf, int nb_buffers,
+                        int flush);
+
+/**
+ * Frees a buffer.
+ */
+void ff_vk_free_buf(AVFilterContext *avctx, FFVkBuffer *buf);
+
+#endif /* AVFILTER_VULKAN_H */
diff --git a/libavfilter/window_func.h b/libavfilter/window_func.h
index a94482c..494c5b1 100644
--- a/libavfilter/window_func.h
+++ b/libavfilter/window_func.h
@@ -30,6 +30,7 @@
                       WFUNC_BHARRIS, WFUNC_BNUTTALL, WFUNC_SINE, WFUNC_NUTTALL,
                       WFUNC_BHANN, WFUNC_LANCZOS, WFUNC_GAUSS, WFUNC_TUKEY,
                       WFUNC_DOLPH, WFUNC_CAUCHY, WFUNC_PARZEN, WFUNC_POISSON,
+                      WFUNC_BOHMAN,
                       NB_WFUNC };
 
 static inline void generate_window_func(float *lut, int N, int win_func,
@@ -132,7 +133,7 @@
         for (c = 1 - 1 / (b*b), n = (N-1) / 2; n >= 0; --n) {
             for (sum = !n, b = t = j = 1; j <= n && sum != t; b *= (n-j) * (1./j), ++j)
                 t = sum, sum += (b *= c * (N - n - j) * (1./j));
-            sum /= (N - 1 - n), sum /= (norm = norm ? norm : sum);
+            sum /= (N - 1 - n), norm = norm ? norm : sum, sum /= norm;
             lut[n] = sum;
             lut[N - 1 - n] = sum;
         }
@@ -182,6 +183,14 @@
         }
         *overlap = 0.75;
         break;
+    case WFUNC_BOHMAN:
+        for (n = 0; n < N; n++) {
+            double x = 2 * ((n / (double)(N - 1))) - 1.;
+
+            lut[n] = (1 - fabs(x)) * cos(M_PI*fabs(x)) + 1./M_PI*sin(M_PI*fabs(x));
+        }
+        *overlap = 0.75;
+        break;
     default:
         av_assert0(0);
     }
diff --git a/libavfilter/x86/Makefile b/libavfilter/x86/Makefile
index b484c8b..016a5b3 100644
--- a/libavfilter/x86/Makefile
+++ b/libavfilter/x86/Makefile
@@ -1,9 +1,15 @@
+OBJS-$(CONFIG_SCENE_SAD)                     += x86/scene_sad_init.o
+
 OBJS-$(CONFIG_AFIR_FILTER)                   += x86/af_afir_init.o
+OBJS-$(CONFIG_ANLMDN_FILTER)                 += x86/af_anlmdn_init.o
+OBJS-$(CONFIG_ATADENOISE_FILTER)             += x86/vf_atadenoise_init.o
 OBJS-$(CONFIG_BLEND_FILTER)                  += x86/vf_blend_init.o
 OBJS-$(CONFIG_BWDIF_FILTER)                  += x86/vf_bwdif_init.o
 OBJS-$(CONFIG_COLORSPACE_FILTER)             += x86/colorspacedsp_init.o
-OBJS-$(CONFIG_EQ_FILTER)                     += x86/vf_eq.o
+OBJS-$(CONFIG_CONVOLUTION_FILTER)            += x86/vf_convolution_init.o
+OBJS-$(CONFIG_EQ_FILTER)                     += x86/vf_eq_init.o
 OBJS-$(CONFIG_FSPP_FILTER)                   += x86/vf_fspp_init.o
+OBJS-$(CONFIG_GBLUR_FILTER)                  += x86/vf_gblur_init.o
 OBJS-$(CONFIG_GRADFUN_FILTER)                += x86/vf_gradfun_init.o
 OBJS-$(CONFIG_FRAMERATE_FILTER)              += x86/vf_framerate_init.o
 OBJS-$(CONFIG_HFLIP_FILTER)                  += x86/vf_hflip_init.o
@@ -11,6 +17,7 @@
 OBJS-$(CONFIG_IDET_FILTER)                   += x86/vf_idet_init.o
 OBJS-$(CONFIG_INTERLACE_FILTER)              += x86/vf_tinterlace_init.o
 OBJS-$(CONFIG_LIMITER_FILTER)                += x86/vf_limiter_init.o
+OBJS-$(CONFIG_MASKEDCLAMP_FILTER)            += x86/vf_maskedclamp_init.o
 OBJS-$(CONFIG_MASKEDMERGE_FILTER)            += x86/vf_maskedmerge_init.o
 OBJS-$(CONFIG_NOISE_FILTER)                  += x86/vf_noise.o
 OBJS-$(CONFIG_OVERLAY_FILTER)                += x86/vf_overlay_init.o
@@ -25,22 +32,32 @@
 OBJS-$(CONFIG_TBLEND_FILTER)                 += x86/vf_blend_init.o
 OBJS-$(CONFIG_THRESHOLD_FILTER)              += x86/vf_threshold_init.o
 OBJS-$(CONFIG_TINTERLACE_FILTER)             += x86/vf_tinterlace_init.o
+OBJS-$(CONFIG_TRANSPOSE_FILTER)              += x86/vf_transpose_init.o
 OBJS-$(CONFIG_VOLUME_FILTER)                 += x86/af_volume_init.o
+OBJS-$(CONFIG_V360_FILTER)                   += x86/vf_v360_init.o
 OBJS-$(CONFIG_W3FDIF_FILTER)                 += x86/vf_w3fdif_init.o
 OBJS-$(CONFIG_YADIF_FILTER)                  += x86/vf_yadif_init.o
 
+X86ASM-OBJS-$(CONFIG_SCENE_SAD)              += x86/scene_sad.o
+
 X86ASM-OBJS-$(CONFIG_AFIR_FILTER)            += x86/af_afir.o
+X86ASM-OBJS-$(CONFIG_ANLMDN_FILTER)          += x86/af_anlmdn.o
+X86ASM-OBJS-$(CONFIG_ATADENOISE_FILTER)      += x86/vf_atadenoise.o
 X86ASM-OBJS-$(CONFIG_BLEND_FILTER)           += x86/vf_blend.o
 X86ASM-OBJS-$(CONFIG_BWDIF_FILTER)           += x86/vf_bwdif.o
 X86ASM-OBJS-$(CONFIG_COLORSPACE_FILTER)      += x86/colorspacedsp.o
+X86ASM-OBJS-$(CONFIG_CONVOLUTION_FILTER)     += x86/vf_convolution.o
+X86ASM-OBJS-$(CONFIG_EQ_FILTER)              += x86/vf_eq.o
 X86ASM-OBJS-$(CONFIG_FRAMERATE_FILTER)       += x86/vf_framerate.o
 X86ASM-OBJS-$(CONFIG_FSPP_FILTER)            += x86/vf_fspp.o
+X86ASM-OBJS-$(CONFIG_GBLUR_FILTER)           += x86/vf_gblur.o
 X86ASM-OBJS-$(CONFIG_GRADFUN_FILTER)         += x86/vf_gradfun.o
 X86ASM-OBJS-$(CONFIG_HFLIP_FILTER)           += x86/vf_hflip.o
 X86ASM-OBJS-$(CONFIG_HQDN3D_FILTER)          += x86/vf_hqdn3d.o
 X86ASM-OBJS-$(CONFIG_IDET_FILTER)            += x86/vf_idet.o
 X86ASM-OBJS-$(CONFIG_INTERLACE_FILTER)       += x86/vf_interlace.o
 X86ASM-OBJS-$(CONFIG_LIMITER_FILTER)         += x86/vf_limiter.o
+X86ASM-OBJS-$(CONFIG_MASKEDCLAMP_FILTER)     += x86/vf_maskedclamp.o
 X86ASM-OBJS-$(CONFIG_MASKEDMERGE_FILTER)     += x86/vf_maskedmerge.o
 X86ASM-OBJS-$(CONFIG_OVERLAY_FILTER)         += x86/vf_overlay.o
 X86ASM-OBJS-$(CONFIG_PP7_FILTER)             += x86/vf_pp7.o
@@ -55,6 +72,8 @@
 X86ASM-OBJS-$(CONFIG_TBLEND_FILTER)          += x86/vf_blend.o
 X86ASM-OBJS-$(CONFIG_THRESHOLD_FILTER)       += x86/vf_threshold.o
 X86ASM-OBJS-$(CONFIG_TINTERLACE_FILTER)      += x86/vf_interlace.o
+X86ASM-OBJS-$(CONFIG_TRANSPOSE_FILTER)       += x86/vf_transpose.o
 X86ASM-OBJS-$(CONFIG_VOLUME_FILTER)          += x86/af_volume.o
+X86ASM-OBJS-$(CONFIG_V360_FILTER)            += x86/vf_v360.o
 X86ASM-OBJS-$(CONFIG_W3FDIF_FILTER)          += x86/vf_w3fdif.o
 X86ASM-OBJS-$(CONFIG_YADIF_FILTER)           += x86/vf_yadif.o x86/yadif-16.o x86/yadif-10.o
diff --git a/libavfilter/x86/af_afir.asm b/libavfilter/x86/af_afir.asm
index 849d85e..2cc0970 100644
--- a/libavfilter/x86/af_afir.asm
+++ b/libavfilter/x86/af_afir.asm
@@ -27,10 +27,9 @@
 ; void ff_fcmul_add(float *sum, const float *t, const float *c, int len)
 ;------------------------------------------------------------------------------
 
-INIT_XMM sse3
+%macro FCMUL_ADD 0
 cglobal fcmul_add, 4,4,6, sum, t, c, len
     shl       lend, 3
-    add       lend, mmsize*2
     add         tq, lenq
     add         cq, lenq
     add       sumq, lenq
@@ -41,20 +40,30 @@
     movsldup  m3, [tq + lenq+mmsize]
     movaps    m1, [cq + lenq]
     movaps    m4, [cq + lenq+mmsize]
-    mulps     m0, m1
-    mulps     m3, m4
-    shufps    m1, m1, 0xb1
-    shufps    m4, m4, 0xb1
+    mulps     m0, m0, m1
+    mulps     m3, m3, m4
+    shufps    m1, m1, m1, 0xb1
+    shufps    m4, m4, m4, 0xb1
     movshdup  m2, [tq + lenq]
     movshdup  m5, [tq + lenq+mmsize]
-    mulps     m2, m1
-    mulps     m5, m4
-    addsubps  m0, m2
-    addsubps  m3, m5
-    addps     m0, [sumq + lenq]
-    addps     m3, [sumq + lenq+mmsize]
+    mulps     m2, m2, m1
+    mulps     m5, m5, m4
+    addsubps  m0, m0, m2
+    addsubps  m3, m3, m5
+    addps     m0, m0, [sumq + lenq]
+    addps     m3, m3, [sumq + lenq+mmsize]
     movaps    [sumq + lenq], m0
     movaps    [sumq + lenq+mmsize], m3
     add       lenq, mmsize*2
     jl .loop
-    REP_RET
+    movss xm0, [tq + lenq]
+    mulss xm0, [cq + lenq]
+    addss xm0, [sumq + lenq]
+    movss [sumq + lenq], xm0
+    RET
+%endmacro
+
+INIT_XMM sse3
+FCMUL_ADD
+INIT_YMM avx
+FCMUL_ADD
diff --git a/libavfilter/x86/af_afir_init.c b/libavfilter/x86/af_afir_init.c
index 6a652b9..c37212c 100644
--- a/libavfilter/x86/af_afir_init.c
+++ b/libavfilter/x86/af_afir_init.c
@@ -24,12 +24,17 @@
 
 void ff_fcmul_add_sse3(float *sum, const float *t, const float *c,
                        ptrdiff_t len);
+void ff_fcmul_add_avx(float *sum, const float *t, const float *c,
+                      ptrdiff_t len);
 
-av_cold void ff_afir_init_x86(AudioFIRContext *s)
+av_cold void ff_afir_init_x86(AudioFIRDSPContext *s)
 {
     int cpu_flags = av_get_cpu_flags();
 
     if (EXTERNAL_SSE3(cpu_flags)) {
         s->fcmul_add = ff_fcmul_add_sse3;
     }
+    if (EXTERNAL_AVX_FAST(cpu_flags)) {
+        s->fcmul_add = ff_fcmul_add_avx;
+    }
 }
diff --git a/libavfilter/x86/af_anlmdn.asm b/libavfilter/x86/af_anlmdn.asm
new file mode 100644
index 0000000..7986cf4
--- /dev/null
+++ b/libavfilter/x86/af_anlmdn.asm
@@ -0,0 +1,80 @@
+;*****************************************************************************
+;* x86-optimized functions for anlmdn filter
+;* Copyright (c) 2017 Paul B Mahol
+;*
+;* This file is part of FFmpeg.
+;*
+;* FFmpeg is free software; you can redistribute it and/or
+;* modify it under the terms of the GNU Lesser General Public
+;* License as published by the Free Software Foundation; either
+;* version 2.1 of the License, or (at your option) any later version.
+;*
+;* FFmpeg is distributed in the hope that it will be useful,
+;* but WITHOUT ANY WARRANTY; without even the implied warranty of
+;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+;* Lesser General Public License for more details.
+;*
+;* You should have received a copy of the GNU Lesser General Public
+;* License along with FFmpeg; if not, write to the Free Software
+;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+;******************************************************************************
+
+%include "libavutil/x86/x86util.asm"
+
+SECTION .text
+
+;------------------------------------------------------------------------------
+; float ff_compute_distance_ssd(float *f1, const float *f2, ptrdiff_t len)
+;------------------------------------------------------------------------------
+
+INIT_XMM sse
+cglobal compute_distance_ssd, 3,5,3, f1, f2, len, r, x
+    mov       xq, lenq
+    shl       xq, 2
+    neg       xq
+    add       f1q, xq
+    add       f2q, xq
+    xor       xq, xq
+    shl       lenq, 1
+    add       lenq, 1
+    shl       lenq, 2
+    mov       rq, lenq
+    and       rq, mmsize - 1
+    xorps     m0, m0
+    cmp       lenq, mmsize
+    jl .loop1
+    sub       lenq, rq
+ALIGN 16
+    .loop0:
+        movups    m1, [f1q + xq]
+        movups    m2, [f2q + xq]
+        subps     m1, m2
+        mulps     m1, m1
+        addps     m0, m1
+        add       xq, mmsize
+        cmp       xq, lenq
+        jl .loop0
+
+    movhlps   xmm1, xmm0
+    addps     xmm0, xmm1
+    movss     xmm1, xmm0
+    shufps    xmm0, xmm0, 1
+    addss     xmm0, xmm1
+
+    cmp       rq, 0
+    je .end
+    add       lenq, rq
+    .loop1:
+        movss    xm1, [f1q + xq]
+        subss    xm1, [f2q + xq]
+        mulss    xm1, xm1
+        addss    xm0, xm1
+        add       xq, 4
+        cmp       xq, lenq
+        jl .loop1
+    .end:
+%if ARCH_X86_64 == 0
+    movss     r0m, xm0
+    fld dword r0m
+%endif
+    RET
diff --git a/libavdevice/libndi_newtek_common.h b/libavfilter/x86/af_anlmdn_init.c
similarity index 61%
copy from libavdevice/libndi_newtek_common.h
copy to libavfilter/x86/af_anlmdn_init.c
index 8990317..30eff6f 100644
--- a/libavdevice/libndi_newtek_common.h
+++ b/libavfilter/x86/af_anlmdn_init.c
@@ -1,7 +1,4 @@
 /*
- * NewTek NDI common code
- * Copyright (c) 2017 Maksym Veremeyenko
- *
  * This file is part of FFmpeg.
  *
  * FFmpeg is free software; you can redistribute it and/or
@@ -19,12 +16,20 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
-#ifndef AVDEVICE_LIBNDI_NEWTEK_COMMON_H
-#define AVDEVICE_LIBNDI_NEWTEK_COMMON_H
+#include "config.h"
+#include "libavutil/attributes.h"
+#include "libavutil/cpu.h"
+#include "libavutil/x86/cpu.h"
+#include "libavfilter/af_anlmdndsp.h"
 
-#include <Processing.NDI.Lib.h>
+float ff_compute_distance_ssd_sse(const float *f1, const float *f2,
+                                  ptrdiff_t len);
 
-#define NDI_TIME_BASE 10000000
-#define NDI_TIME_BASE_Q (AVRational){1, NDI_TIME_BASE}
+av_cold void ff_anlmdn_init_x86(AudioNLMDNDSPContext *s)
+{
+    int cpu_flags = av_get_cpu_flags();
 
-#endif
+    if (EXTERNAL_SSE(cpu_flags)) {
+        s->compute_distance_ssd = ff_compute_distance_ssd_sse;
+    }
+}
diff --git a/libavfilter/x86/scene_sad.asm b/libavfilter/x86/scene_sad.asm
new file mode 100644
index 0000000..d38d71c
--- /dev/null
+++ b/libavfilter/x86/scene_sad.asm
@@ -0,0 +1,74 @@
+;*****************************************************************************
+;* x86-optimized functions for scene SAD
+;*
+;* Copyright (C) 2018 Marton Balint
+;*
+;* Based on vf_blend.asm, Copyright (C) 2015 Paul B Mahol
+;*
+;* This file is part of FFmpeg.
+;*
+;* FFmpeg is free software; you can redistribute it and/or
+;* modify it under the terms of the GNU Lesser General Public
+;* License as published by the Free Software Foundation; either
+;* version 2.1 of the License, or (at your option) any later version.
+;*
+;* FFmpeg is distributed in the hope that it will be useful,
+;* but WITHOUT ANY WARRANTY; without even the implied warranty of
+;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+;* Lesser General Public License for more details.
+;*
+;* You should have received a copy of the GNU Lesser General Public
+;* License along with FFmpeg; if not, write to the Free Software
+;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+;******************************************************************************
+
+%include "libavutil/x86/x86util.asm"
+
+SECTION .text
+
+
+%macro SAD_INIT 0
+cglobal scene_sad, 6, 7, 2, src1, stride1, src2, stride2, width, end, x
+    add     src1q, widthq
+    add     src2q, widthq
+    neg    widthq
+    pxor       m1, m1
+%endmacro
+
+
+%macro SAD_LOOP 0
+.nextrow:
+    mov        xq, widthq
+
+    .loop:
+        movu            m0, [src1q + xq]
+        psadbw          m0, [src2q + xq]
+        paddq           m1, m0
+        add             xq, mmsize
+    jl .loop
+    add     src1q, stride1q
+    add     src2q, stride2q
+    sub      endd, 1
+    jg .nextrow
+
+    mov         r0q, r6mp
+    movu      [r0q], m1      ; sum
+REP_RET
+%endmacro
+
+
+%macro SAD_FRAMES 0
+    SAD_INIT
+    SAD_LOOP
+%endmacro
+
+
+INIT_XMM sse2
+SAD_FRAMES
+
+%if HAVE_AVX2_EXTERNAL
+
+INIT_YMM avx2
+SAD_FRAMES
+
+%endif
diff --git a/libavfilter/x86/scene_sad_init.c b/libavfilter/x86/scene_sad_init.c
new file mode 100644
index 0000000..2c3729c
--- /dev/null
+++ b/libavfilter/x86/scene_sad_init.c
@@ -0,0 +1,60 @@
+/*
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "libavutil/cpu.h"
+#include "libavutil/x86/cpu.h"
+#include "libavfilter/scene_sad.h"
+
+#define SCENE_SAD_FUNC(FUNC_NAME, ASM_FUNC_NAME, MMSIZE)                      \
+void ASM_FUNC_NAME(SCENE_SAD_PARAMS);                                         \
+                                                                              \
+static void FUNC_NAME(SCENE_SAD_PARAMS) {                                     \
+    uint64_t sad[MMSIZE / 8] = {0};                                           \
+    ptrdiff_t awidth = width & ~(MMSIZE - 1);                                 \
+    *sum = 0;                                                                 \
+    ASM_FUNC_NAME(src1, stride1, src2, stride2, awidth, height, sad);         \
+    for (int i = 0; i < MMSIZE / 8; i++)                                      \
+        *sum += sad[i];                                                       \
+    ff_scene_sad_c(src1 + awidth, stride1,                                    \
+                   src2 + awidth, stride2,                                    \
+                   width - awidth, height, sad);                              \
+    *sum += sad[0];                                                           \
+}
+
+#if HAVE_X86ASM
+SCENE_SAD_FUNC(scene_sad_sse2, ff_scene_sad_sse2, 16)
+#if HAVE_AVX2_EXTERNAL
+SCENE_SAD_FUNC(scene_sad_avx2, ff_scene_sad_avx2, 32)
+#endif
+#endif
+
+ff_scene_sad_fn ff_scene_sad_get_fn_x86(int depth)
+{
+#if HAVE_X86ASM
+    int cpu_flags = av_get_cpu_flags();
+    if (depth == 8) {
+#if HAVE_AVX2_EXTERNAL
+        if (EXTERNAL_AVX2_FAST(cpu_flags))
+            return scene_sad_avx2;
+#endif
+        if (EXTERNAL_SSE2(cpu_flags))
+            return scene_sad_sse2;
+    }
+#endif
+    return NULL;
+}
diff --git a/libavfilter/x86/vf_atadenoise.asm b/libavfilter/x86/vf_atadenoise.asm
new file mode 100644
index 0000000..4945ad3
--- /dev/null
+++ b/libavfilter/x86/vf_atadenoise.asm
@@ -0,0 +1,279 @@
+;*****************************************************************************
+;* x86-optimized functions for atadenoise filter
+;*
+;* Copyright (C) 2019 Paul B Mahol
+;*
+;* This file is part of FFmpeg.
+;*
+;* FFmpeg is free software; you can redistribute it and/or
+;* modify it under the terms of the GNU Lesser General Public
+;* License as published by the Free Software Foundation; either
+;* version 2.1 of the License, or (at your option) any later version.
+;*
+;* FFmpeg is distributed in the hope that it will be useful,
+;* but WITHOUT ANY WARRANTY; without even the implied warranty of
+;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+;* Lesser General Public License for more details.
+;*
+;* You should have received a copy of the GNU Lesser General Public
+;* License along with FFmpeg; if not, write to the Free Software
+;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+;******************************************************************************
+
+%if ARCH_X86_64
+
+%include "libavutil/x86/x86util.asm"
+
+SECTION_RODATA
+pw_one:  times 8 dw 1
+pw_ones: times 8 dw 65535
+
+SECTION .text
+
+;------------------------------------------------------------------------------
+; void ff_filter_row(const uint8_t *src, uint8_t *dst,
+;                    const uint8_t **srcf,
+;                    int w, int mid, int size,
+;                    int thra, int thrb)
+;------------------------------------------------------------------------------
+
+INIT_XMM sse4
+cglobal atadenoise_filter_row8, 8,10,13, src, dst, srcf, w, mid, size, i, j, srcfx, x
+    movsxdifnidn    wq, wd
+    movsxdifnidn  midq, midd
+    movsxdifnidn sizeq, sized
+    add           srcq, wq
+    add           dstq, wq
+    mov             xq, wq
+    dec          sizeq
+    neg             xq
+    movd            m4, r6m
+    SPLATW          m4, m4
+    movd            m5, r7m
+    SPLATW          m5, m5
+    pxor            m2, m2
+    mova           m10, [pw_ones]
+
+    .loop:
+        mov         iq, midq
+        mov         jq, midq
+        pxor        m3, m3
+        pxor       m11, m11
+        movu        m0, [srcq + xq]
+        punpcklbw   m0, m2
+        mova        m7, m0
+        mova        m8, [pw_one]
+        mova       m12, [pw_ones]
+
+        .loop0:
+            inc              iq
+            dec              jq
+
+            mov          srcfxq, [srcfq + jq * 8]
+            add          srcfxq, wq
+
+            movu             m1, [srcfxq + xq]
+            punpcklbw        m1, m2
+            mova             m9, m1
+            psubw            m1, m0
+            pabsw            m1, m1
+            paddw           m11, m1
+            pcmpgtw          m1, m4
+            mova             m6, m11
+            pcmpgtw          m6, m5
+            por              m6, m1
+            pxor             m6, m10
+            pand            m12, m6
+            pand             m9, m12
+            paddw            m7, m9
+            mova             m6, m12
+            psrlw            m6, 15
+            paddw            m8, m6
+
+            mov          srcfxq, [srcfq + iq * 8]
+            add          srcfxq, wq
+
+            movu             m1, [srcfxq + xq]
+            punpcklbw        m1, m2
+            mova             m9, m1
+            psubw            m1, m0
+            pabsw            m1, m1
+            paddw            m3, m1
+            pcmpgtw          m1, m4
+            mova             m6, m3
+            pcmpgtw          m6, m5
+            por              m6, m1
+            pxor             m6, m10
+            pand            m12, m6
+            pand             m9, m12
+            paddw            m7, m9
+            mova             m6, m12
+            psrlw            m6, 15
+            paddw            m8, m6
+
+            ptest           m12, m12
+            jz .finish
+
+            cmp              iq, sizeq
+            jl .loop0
+
+    .finish:
+        mova                 m9, m8
+        psrlw                m9, 1
+        paddw                m7, m9
+
+        mova                 m1, m7
+        mova                 m6, m8
+
+        punpcklwd            m7, m2
+        punpcklwd            m8, m2
+        cvtdq2ps             m7, m7
+        cvtdq2ps             m8, m8
+        divps                m7, m8
+        cvttps2dq            m7, m7
+        packssdw             m7, m7
+        packuswb             m7, m7
+
+        movd        [dstq + xq], m7
+
+        punpckhwd            m1, m2
+        punpckhwd            m6, m2
+        cvtdq2ps             m1, m1
+        cvtdq2ps             m6, m6
+        divps                m1, m6
+        cvttps2dq            m1, m1
+        packssdw             m1, m1
+        packuswb             m1, m1
+
+        movd    [dstq + xq + 4], m1
+
+        add                  xq, mmsize/2
+    jl .loop
+    RET
+
+INIT_XMM sse4
+cglobal atadenoise_filter_row8_serial, 8,10,13, src, dst, srcf, w, mid, size, i, j, srcfx, x
+    movsxdifnidn    wq, wd
+    movsxdifnidn  midq, midd
+    movsxdifnidn sizeq, sized
+    add           srcq, wq
+    add           dstq, wq
+    mov             xq, wq
+    dec          sizeq
+    neg             xq
+    movd            m4, r6m
+    SPLATW          m4, m4
+    movd            m5, r7m
+    SPLATW          m5, m5
+    pxor            m2, m2
+    mova           m10, [pw_ones]
+
+    .loop:
+        mov         iq, midq
+        mov         jq, midq
+        pxor        m3, m3
+        pxor       m11, m11
+        movu        m0, [srcq + xq]
+        punpcklbw   m0, m2
+        mova        m7, m0
+        mova        m8, [pw_one]
+        mova       m12, [pw_ones]
+
+        .loop0:
+            dec              jq
+
+            mov          srcfxq, [srcfq + jq * 8]
+            add          srcfxq, wq
+
+            movu             m1, [srcfxq + xq]
+            punpcklbw        m1, m2
+            mova             m9, m1
+            psubw            m1, m0
+            pabsw            m1, m1
+            paddw           m11, m1
+            pcmpgtw          m1, m4
+            mova             m6, m11
+            pcmpgtw          m6, m5
+            por              m6, m1
+            pxor             m6, m10
+            pand            m12, m6
+            pand             m9, m12
+            paddw            m7, m9
+            mova             m6, m12
+            psrlw            m6, 15
+            paddw            m8, m6
+
+            ptest           m12, m12
+            jz .end_loop0
+
+            cmp              jq, 0
+            jg .loop0
+
+        .end_loop0:
+            mova       m12, [pw_ones]
+
+        .loop1:
+            inc              iq
+
+            mov          srcfxq, [srcfq + iq * 8]
+            add          srcfxq, wq
+
+            movu             m1, [srcfxq + xq]
+            punpcklbw        m1, m2
+            mova             m9, m1
+            psubw            m1, m0
+            pabsw            m1, m1
+            paddw            m3, m1
+            pcmpgtw          m1, m4
+            mova             m6, m3
+            pcmpgtw          m6, m5
+            por              m6, m1
+            pxor             m6, m10
+            pand            m12, m6
+            pand             m9, m12
+            paddw            m7, m9
+            mova             m6, m12
+            psrlw            m6, 15
+            paddw            m8, m6
+
+            ptest           m12, m12
+            jz .finish
+
+            cmp              iq, sizeq
+            jl .loop1
+
+    .finish:
+        mova                 m9, m8
+        psrlw                m9, 1
+        paddw                m7, m9
+
+        mova                 m1, m7
+        mova                 m6, m8
+
+        punpcklwd            m7, m2
+        punpcklwd            m8, m2
+        cvtdq2ps             m7, m7
+        cvtdq2ps             m8, m8
+        divps                m7, m8
+        cvttps2dq            m7, m7
+        packssdw             m7, m7
+        packuswb             m7, m7
+
+        movd        [dstq + xq], m7
+
+        punpckhwd            m1, m2
+        punpckhwd            m6, m2
+        cvtdq2ps             m1, m1
+        cvtdq2ps             m6, m6
+        divps                m1, m6
+        cvttps2dq            m1, m1
+        packssdw             m1, m1
+        packuswb             m1, m1
+
+        movd    [dstq + xq + 4], m1
+
+        add                  xq, mmsize/2
+    jl .loop
+    RET
+
+%endif
diff --git a/libavfilter/x86/vf_atadenoise_init.c b/libavfilter/x86/vf_atadenoise_init.c
new file mode 100644
index 0000000..1f69b1a
--- /dev/null
+++ b/libavfilter/x86/vf_atadenoise_init.c
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2019 Paul B Mahol
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "libavutil/attributes.h"
+#include "libavutil/cpu.h"
+#include "libavutil/mem.h"
+#include "libavutil/x86/asm.h"
+#include "libavutil/x86/cpu.h"
+#include "libavfilter/atadenoise.h"
+
+void ff_atadenoise_filter_row8_sse4(const uint8_t *src, uint8_t *dst,
+                                    const uint8_t **srcf,
+                                    int w, int mid, int size,
+                                    int thra, int thrb);
+
+void ff_atadenoise_filter_row8_serial_sse4(const uint8_t *src, uint8_t *dst,
+                                           const uint8_t **srcf,
+                                           int w, int mid, int size,
+                                           int thra, int thrb);
+
+av_cold void ff_atadenoise_init_x86(ATADenoiseDSPContext *dsp, int depth, int algorithm)
+{
+    int cpu_flags = av_get_cpu_flags();
+
+    if (ARCH_X86_64 && EXTERNAL_SSE4(cpu_flags) && depth <= 8 && algorithm == PARALLEL) {
+        dsp->filter_row = ff_atadenoise_filter_row8_sse4;
+    }
+
+    if (ARCH_X86_64 && EXTERNAL_SSE4(cpu_flags) && depth <= 8 && algorithm == SERIAL) {
+        dsp->filter_row = ff_atadenoise_filter_row8_serial_sse4;
+    }
+}
diff --git a/libavfilter/x86/vf_blend_init.c b/libavfilter/x86/vf_blend_init.c
index acf2855..84bc55c 100644
--- a/libavfilter/x86/vf_blend_init.c
+++ b/libavfilter/x86/vf_blend_init.c
@@ -100,11 +100,11 @@
 BLEND_FUNC(xor_16, avx2)
 #endif /* ARCH_X86_64 */
 
-av_cold void ff_blend_init_x86(FilterParams *param, int is_16bit)
+av_cold void ff_blend_init_x86(FilterParams *param, int depth)
 {
     int cpu_flags = av_get_cpu_flags();
 
-    if (!is_16bit) {
+    if (depth == 8) {
         if (EXTERNAL_SSE2(cpu_flags) && param->opacity == 1) {
             switch (param->mode) {
             case BLEND_ADDITION:     param->blend = ff_blend_addition_sse2;     break;
@@ -156,7 +156,7 @@
             case BLEND_NEGATION:     param->blend = ff_blend_negation_avx2;     break;
             }
         }
-    } else { /* is_16_bit */
+    } else if (depth == 16) {
 #if ARCH_X86_64
         if (EXTERNAL_SSE2(cpu_flags) && param->opacity == 1) {
             switch (param->mode) {
diff --git a/libavfilter/x86/vf_bwdif_init.c b/libavfilter/x86/vf_bwdif_init.c
index 1cb8438..b1e70b3 100644
--- a/libavfilter/x86/vf_bwdif_init.c
+++ b/libavfilter/x86/vf_bwdif_init.c
@@ -53,8 +53,9 @@
 
 av_cold void ff_bwdif_init_x86(BWDIFContext *bwdif)
 {
+    YADIFContext *yadif = &bwdif->yadif;
     int cpu_flags = av_get_cpu_flags();
-    int bit_depth = (!bwdif->csp) ? 8 : bwdif->csp->comp[0].depth;
+    int bit_depth = (!yadif->csp) ? 8 : yadif->csp->comp[0].depth;
 
     if (bit_depth <= 8) {
 #if ARCH_X86_32
diff --git a/libavfilter/x86/vf_convolution.asm b/libavfilter/x86/vf_convolution.asm
new file mode 100644
index 0000000..754d4d1
--- /dev/null
+++ b/libavfilter/x86/vf_convolution.asm
@@ -0,0 +1,156 @@
+;*****************************************************************************
+;* x86-optimized functions for convolution filter
+;*
+;* This file is part of FFmpeg.
+;*
+;* FFmpeg is free software; you can redistribute it and/or
+;* modify it under the terms of the GNU Lesser General Public
+;* License as published by the Free Software Foundation; either
+;* version 2.1 of the License, or (at your option) any later version.
+;*
+;* FFmpeg is distributed in the hope that it will be useful,
+;* but WITHOUT ANY WARRANTY; without even the implied warranty of
+;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+;* Lesser General Public License for more details.
+;*
+;* You should have received a copy of the GNU Lesser General Public
+;* License along with FFmpeg; if not, write to the Free Software
+;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+;******************************************************************************
+
+%include "libavutil/x86/x86util.asm"
+
+SECTION_RODATA
+half:   dd 0.5
+
+SECTION .text
+
+; void filter_3x3_sse4(uint8_t *dst, int width,
+;                      float rdiv, float bias, const int *const matrix,
+;                      const uint8_t *c[], int peak, int radius,
+;                      int dstride, int stride)
+
+
+%macro PROCESS_V 1
+    movss m2, [matrixq + 4 * %1]
+    VBROADCASTSS m2, m2
+    movss m3, [c%1q + xq]
+    punpcklbw m3, m6
+    punpcklwd m3, m6
+    pmulld m2, m3
+    paddd m4, m2
+%endmacro
+
+%macro PROCESS_S 1
+    movzx ptrd, byte [c%1q + xq]
+    imul  ptrd, [matrixq + 4 * %1]
+    add   rd, ptrd
+%endmacro
+
+%macro FILTER_3X3 0
+%if UNIX64
+cglobal filter_3x3, 4, 15, 7, dst, width, matrix, ptr, c0, c1, c2, c3, c4, c5, c6, c7, c8, r, x
+%else
+cglobal filter_3x3, 4, 15, 7, dst, width, rdiv, bias, matrix, ptr, c0, c1, c2, c3, c4, c5, c6, c7, c8, r, x
+%endif
+
+%if WIN64
+    SWAP m0, m2
+    SWAP m1, m3
+    mov  r2q, matrixmp
+    mov  r3q, ptrmp
+    DEFINE_ARGS dst, width, matrix, ptr, c0, c1, c2, c3, c4, c5, c6, c7, c8, r, x
+%endif
+    movsxdifnidn widthq, widthd
+    VBROADCASTSS m0, m0
+    VBROADCASTSS m1, m1
+    pxor  m6, m6
+    movss m5, [half]
+    VBROADCASTSS m5, m5
+    mov   c0q, [ptrq + 0*gprsize]
+    mov   c1q, [ptrq + 1*gprsize]
+    mov   c2q, [ptrq + 2*gprsize]
+    mov   c3q, [ptrq + 3*gprsize]
+    mov   c4q, [ptrq + 4*gprsize]
+    mov   c5q, [ptrq + 5*gprsize]
+    mov   c6q, [ptrq + 6*gprsize]
+    mov   c7q, [ptrq + 7*gprsize]
+    mov   c8q, [ptrq + 8*gprsize]
+
+    xor   xq, xq
+    cmp   widthq, mmsize/4
+    jl .loop2
+
+    mov   rq, widthq
+    and   rq, mmsize/4-1
+    sub   widthq, rq
+
+.loop1:
+    pxor m4, m4         ; sum = 0;
+
+    PROCESS_V 0
+    PROCESS_V 1
+    PROCESS_V 2
+    PROCESS_V 3
+    PROCESS_V 4
+    PROCESS_V 5
+    PROCESS_V 6
+    PROCESS_V 7
+    PROCESS_V 8
+
+    cvtdq2ps  m4, m4
+    mulps     m4, m0     ; sum *= rdiv
+    addps     m4, m1     ; sum += bias
+    addps     m4, m5     ; sum += 0.5
+    cvttps2dq m4, m4
+    packssdw  m4, m4
+    packuswb  m4, m4
+    movss     [dstq + xq], m4
+
+    add xq, mmsize/4
+    cmp xq, widthq
+    jl .loop1
+
+    add widthq, rq
+    cmp xq, widthq
+    jge .end
+
+.loop2:
+    ; reuse r to hold sum, init with zero
+    xor rd, rd
+
+    PROCESS_S 0
+    PROCESS_S 1
+    PROCESS_S 2
+    PROCESS_S 3
+    PROCESS_S 4
+    PROCESS_S 5
+    PROCESS_S 6
+    PROCESS_S 7
+    PROCESS_S 8
+
+    pxor      m4, m4
+    cvtsi2ss  m4, rd
+    mulss     m4, m0     ; sum *= rdiv
+    addss     m4, m1     ; sum += bias
+    addss     m4, m5     ; sum += 0.5
+    ; we don't have simple scalar instructions to convert
+    ; from 32bit to 8bit with saturation, so here
+    ; just use packed version SSE instructions for simplicity.
+    cvttps2dq m4, m4     ; trunc to integer
+    packssdw  m4, m4
+    packuswb  m4, m4
+    movd      rd, m4
+    mov       [dstq + xq], rb
+
+    add xq, 1
+    cmp xq, widthq
+    jl .loop2
+.end:
+    RET
+%endmacro
+
+%if ARCH_X86_64
+INIT_XMM sse4
+FILTER_3X3
+%endif
diff --git a/libavfilter/x86/vf_convolution_init.c b/libavfilter/x86/vf_convolution_init.c
new file mode 100644
index 0000000..5143240
--- /dev/null
+++ b/libavfilter/x86/vf_convolution_init.c
@@ -0,0 +1,46 @@
+/*
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "config.h"
+
+#include "libavutil/attributes.h"
+#include "libavutil/cpu.h"
+#include "libavutil/x86/cpu.h"
+#include "libavfilter/convolution.h"
+
+void ff_filter_3x3_sse4(uint8_t *dst, int width,
+                        float rdiv, float bias, const int *const matrix,
+                        const uint8_t *c[], int peak, int radius,
+                        int dstride, int stride);
+
+av_cold void ff_convolution_init_x86(ConvolutionContext *s)
+{
+#if ARCH_X86_64
+    int i;
+    int cpu_flags = av_get_cpu_flags();
+    for (i = 0; i < 4; i++) {
+        if (s->mode[i] == MATRIX_SQUARE) {
+            if (s->matrix_length[i] == 9) {
+                if (EXTERNAL_SSE4(cpu_flags))
+                    s->filter[i] = ff_filter_3x3_sse4;
+            }
+        }
+    }
+#endif
+}
diff --git a/libavfilter/x86/vf_eq.asm b/libavfilter/x86/vf_eq.asm
new file mode 100644
index 0000000..a30a287
--- /dev/null
+++ b/libavfilter/x86/vf_eq.asm
@@ -0,0 +1,90 @@
+;*****************************************************************************
+;* x86-optimized functions for eq filter
+;*
+;* Original MPlayer filters by Richard Felker.
+;*
+;* This file is part of FFmpeg.
+;*
+;* FFmpeg is free software; you can redistribute it and/or modify
+;* it under the terms of the GNU General Public License as published by
+;* the Free Software Foundation; either version 2 of the License, or
+;* (at your option) any later version.
+;*
+;* FFmpeg is distributed in the hope that it will be useful,
+;* but WITHOUT ANY WARRANTY; without even the implied warranty of
+;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;* GNU General Public License for more details.
+;*
+;* You should have received a copy of the GNU General Public License along
+;* with FFmpeg; if not, write to the Free Software Foundation, Inc.,
+;* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+;*****************************************************************************
+
+%include "libavutil/x86/x86util.asm"
+
+SECTION .text
+
+%macro PROCESS_ONE_LINE 1
+cglobal process_one_line, 5, 7, 5, src, dst, contrast, brightness, w
+    movd m3, contrastd
+    movd m4, brightnessd
+    movsx r5d, contrastw
+    movsx r6d, brightnessw
+    SPLATW m3, m3, 0
+    SPLATW m4, m4, 0
+
+    DEFINE_ARGS src, dst, tmp, scalar, w
+    xor tmpd, tmpd
+    pxor m0, m0
+    pxor m1, m1
+    mov scalard, wd
+    and scalard, mmsize-1
+    sar wd, %1
+    cmp wd, 1
+    jl .loop1
+
+    .loop0:
+        movu m1, [srcq]
+        mova m2, m1
+        punpcklbw m1, m0
+        punpckhbw m2, m0
+        psllw m1, 4
+        psllw m2, 4
+        pmulhw m1, m3
+        pmulhw m2, m3
+        paddw m1, m4
+        paddw m2, m4
+        packuswb m1, m2
+        movu [dstq], m1
+        add srcq, mmsize
+        add dstq, mmsize
+        sub wd, 1
+        cmp wd, 0
+        jne .loop0
+
+    .loop1:
+        cmp scalard, 0
+        je .end
+        movzx tmpd, byte [srcq]
+        imul tmpd, r5d
+        sar tmpd, 12
+        add tmpd, r6d
+        movd m1, tmpd
+        packuswb m1, m0
+        movd tmpd, m1
+        mov [dstq], tmpb
+        inc srcq
+        inc dstq
+        dec scalard
+        jmp .loop1
+
+    .end:
+        RET
+
+%endmacro
+
+INIT_MMX mmxext
+PROCESS_ONE_LINE 3
+
+INIT_XMM sse2
+PROCESS_ONE_LINE 4
diff --git a/libavfilter/x86/vf_eq_init.c b/libavfilter/x86/vf_eq_init.c
new file mode 100644
index 0000000..2743250
--- /dev/null
+++ b/libavfilter/x86/vf_eq_init.c
@@ -0,0 +1,76 @@
+/*
+ *
+ * Original MPlayer filters by Richard Felker.
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with FFmpeg; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#include "libavutil/attributes.h"
+#include "libavutil/cpu.h"
+#include "libavutil/mem.h"
+#include "libavutil/x86/cpu.h"
+#include "libavutil/x86/asm.h"
+#include "libavfilter/vf_eq.h"
+
+extern void ff_process_one_line_mmxext(const uint8_t *src, uint8_t *dst, short contrast,
+                                       short brightness, int w);
+extern void ff_process_one_line_sse2(const uint8_t *src, uint8_t *dst, short contrast,
+                                     short brightness, int w);
+
+#if HAVE_X86ASM
+static void process_mmxext(EQParameters *param, uint8_t *dst, int dst_stride,
+                           const uint8_t *src, int src_stride, int w, int h)
+{
+    short contrast = (short) (param->contrast * 256 * 16);
+    short brightness = ((short) (100.0 * param->brightness + 100.0) * 511)
+                       / 200 - 128 - contrast / 32;
+
+    while (h--) {
+        ff_process_one_line_mmxext(src, dst, contrast, brightness, w);
+        src += src_stride;
+        dst += dst_stride;
+    }
+    emms_c();
+}
+
+static void process_sse2(EQParameters *param, uint8_t *dst, int dst_stride,
+                         const uint8_t *src, int src_stride, int w, int h)
+{
+    short contrast = (short) (param->contrast * 256 * 16);
+    short brightness = ((short) (100.0 * param->brightness + 100.0) * 511)
+                       / 200 - 128 - contrast / 32;
+
+    while (h--) {
+        ff_process_one_line_sse2(src, dst, contrast, brightness, w);
+        src += src_stride;
+        dst += dst_stride;
+    }
+}
+#endif
+
+av_cold void ff_eq_init_x86(EQContext *eq)
+{
+#if HAVE_X86ASM
+    int cpu_flags = av_get_cpu_flags();
+    if (EXTERNAL_MMXEXT(cpu_flags)) {
+        eq->process = process_mmxext;
+    }
+    if (EXTERNAL_SSE2(cpu_flags)) {
+        eq->process = process_sse2;
+    }
+#endif
+}
diff --git a/libavfilter/x86/vf_gblur.asm b/libavfilter/x86/vf_gblur.asm
new file mode 100644
index 0000000..a25b165
--- /dev/null
+++ b/libavfilter/x86/vf_gblur.asm
@@ -0,0 +1,185 @@
+;*****************************************************************************
+;* x86-optimized functions for gblur filter
+;*
+;* This file is part of FFmpeg.
+;*
+;* FFmpeg is free software; you can redistribute it and/or
+;* modify it under the terms of the GNU Lesser General Public
+;* License as published by the Free Software Foundation; either
+;* version 2.1 of the License, or (at your option) any later version.
+;*
+;* FFmpeg is distributed in the hope that it will be useful,
+;* but WITHOUT ANY WARRANTY; without even the implied warranty of
+;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+;* Lesser General Public License for more details.
+;*
+;* You should have received a copy of the GNU Lesser General Public
+;* License along with FFmpeg; if not, write to the Free Software
+;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+;******************************************************************************
+
+%include "libavutil/x86/x86util.asm"
+
+SECTION .text
+
+; void ff_horiz_slice_sse4(float *ptr, int width, int height, int steps,
+;                          float nu, float bscale)
+
+%macro HORIZ_SLICE 0
+%if UNIX64
+cglobal horiz_slice, 4, 9, 9, ptr, width, height, steps, x, y, step, stride, remain
+%else
+cglobal horiz_slice, 4, 9, 9, ptr, width, height, steps, nu, bscale, x, y, step, stride, remain
+%endif
+%if WIN64
+    movss m0, num
+    movss m1, bscalem
+    DEFINE_ARGS ptr, width, height, steps, x, y, step, stride, remain
+%endif
+    movsxdifnidn widthq, widthd
+
+    mulss m2, m0, m0 ; nu ^ 2
+    mulss m3, m2, m0 ; nu ^ 3
+    mulss m4, m3, m0 ; nu ^ 4
+    xor   xq, xq
+    xor   yd, yd
+    mov   strideq, widthq
+    ; stride = width * 4
+    shl   strideq, 2
+    ; w = w - ((w - 1) & 3)
+    mov   remainq, widthq
+    sub   remainq, 1
+    and   remainq, 3
+    sub   widthq, remainq
+
+    shufps m0, m0, 0
+    shufps m2, m2, 0
+    shufps m3, m3, 0
+    shufps m4, m4, 0
+
+.loop_y:
+    xor   stepd, stepd
+
+    .loop_step:
+        ; p0 *= bscale
+        mulss m5, m1, [ptrq + xq * 4]
+        movss [ptrq + xq * 4], m5
+        inc xq
+        ; filter rightwards
+        ; Here we are vectorizing the c version by 4
+        ;    for (x = 1; x < width; x++)
+        ;       ptr[x] += nu * ptr[x - 1];
+        ;   let p0 stands for ptr[x-1], the data from last loop
+        ;   and [p1,p2,p3,p4] be the vector data for this loop.
+        ; Unrolling the loop, we get:
+        ;   p1' = p1 + p0*nu
+        ;   p2' = p2 + p1*nu + p0*nu^2
+        ;   p3' = p3 + p2*nu + p1*nu^2 + p0*nu^3
+        ;   p4' = p4 + p3*nu + p2*nu^2 + p1*nu^3 + p0*nu^4
+        ; so we can do it in simd:
+        ; [p1',p2',p3',p4'] = [p1,p2,p3,p4] + [p0,p1,p2,p3]*nu +
+        ;                     [0,p0,p1,p2]*nu^2 + [0,0,p0,p1]*nu^3 +
+        ;                     [0,0,0,p0]*nu^4
+
+        .loop_x:
+            movu m6, [ptrq + xq * 4]         ; s  = [p1,p2,p3,p4]
+            pslldq m7, m6, 4                 ;      [0, p1,p2,p3]
+            movss  m7, m5                    ;      [p0,p1,p2,p3]
+            FMULADD_PS  m6, m7, m0, m6, m8   ; s += [p0,p1,p2,p3] * nu
+            pslldq m7, 4                     ;      [0,p0,p1,p2]
+            FMULADD_PS  m6, m7, m2, m6, m8   ; s += [0,p0,p1,p2]  * nu^2
+            pslldq m7, 4
+            FMULADD_PS  m6, m7, m3, m6, m8   ; s += [0,0,p0,p1]   * nu^3
+            pslldq m7, 4
+            FMULADD_PS  m6, m7, m4, m6, m8   ; s += [0,0,0,p0]    * nu^4
+            movu [ptrq + xq * 4], m6
+            shufps m5, m6, m6, q3333
+            add xq, 4
+            cmp xq, widthq
+            jl .loop_x
+
+        add widthq, remainq
+        cmp xq, widthq
+        jge .end_scalar
+
+        .loop_scalar:
+            ; ptr[x] += nu * ptr[x-1]
+            movss m5, [ptrq + 4*xq - 4]
+            mulss m5, m0
+            addss m5, [ptrq + 4*xq]
+            movss [ptrq + 4*xq], m5
+            inc xq
+            cmp xq, widthq
+            jl .loop_scalar
+        .end_scalar:
+            ; ptr[width - 1] *= bscale
+            dec xq
+            mulss m5, m1, [ptrq + 4*xq]
+            movss [ptrq + 4*xq], m5
+            shufps m5, m5, 0
+
+        ; filter leftwards
+        ;    for (; x > 0; x--)
+        ;        ptr[x - 1] += nu * ptr[x];
+        ; The idea here is basically the same as filter rightwards.
+        ; But we need to take care as the data layout is different.
+        ; Let p0 stands for the ptr[x], which is the data from last loop.
+        ; The way we do it in simd as below:
+        ; [p-4', p-3', p-2', p-1'] = [p-4, p-3, p-2, p-1]
+        ;                          + [p-3, p-2, p-1, p0] * nu
+        ;                          + [p-2, p-1, p0,  0]  * nu^2
+        ;                          + [p-1, p0,  0,   0]  * nu^3
+        ;                          + [p0,  0,   0,   0]  * nu^4
+        .loop_x_back:
+            sub xq, 4
+            movu m6, [ptrq + xq * 4]      ; s = [p-4, p-3, p-2, p-1]
+            psrldq m7, m6, 4              ;     [p-3, p-2, p-1, 0  ]
+            blendps m7, m5, 0x8           ;     [p-3, p-2, p-1, p0 ]
+            FMULADD_PS m6, m7, m0, m6, m8 ; s+= [p-3, p-2, p-1, p0 ] * nu
+            psrldq m7, 4                  ;
+            FMULADD_PS m6, m7, m2, m6, m8 ; s+= [p-2, p-1, p0,  0] * nu^2
+            psrldq m7, 4
+            FMULADD_PS m6, m7, m3, m6, m8 ; s+= [p-1, p0,   0,  0] * nu^3
+            psrldq m7, 4
+            FMULADD_PS m6, m7, m4, m6, m8 ; s+= [p0,  0,    0,  0] * nu^4
+            movu [ptrq + xq * 4], m6
+            shufps m5, m6, m6, 0          ; m5 = [p-4', p-4', p-4', p-4']
+            cmp xq, remainq
+            jg .loop_x_back
+
+        cmp xq, 0
+        jle .end_scalar_back
+
+        .loop_scalar_back:
+            ; ptr[x-1] += nu * ptr[x]
+            movss m5, [ptrq + 4*xq]
+            mulss m5, m0
+            addss m5, [ptrq + 4*xq - 4]
+            movss [ptrq + 4*xq - 4], m5
+            dec xq
+            cmp xq, 0
+            jg .loop_scalar_back
+        .end_scalar_back:
+
+        ; reset aligned width for next line
+        sub widthq, remainq
+
+        inc stepd
+        cmp stepd, stepsd
+        jl .loop_step
+
+    add ptrq, strideq
+    inc yd
+    cmp yd, heightd
+    jl .loop_y
+
+    RET
+%endmacro
+
+%if ARCH_X86_64
+INIT_XMM sse4
+HORIZ_SLICE
+
+INIT_XMM avx2
+HORIZ_SLICE
+%endif
diff --git a/libavfilter/x86/vf_gblur_init.c b/libavfilter/x86/vf_gblur_init.c
new file mode 100644
index 0000000..e63e59f
--- /dev/null
+++ b/libavfilter/x86/vf_gblur_init.c
@@ -0,0 +1,40 @@
+/*
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "config.h"
+
+#include "libavutil/attributes.h"
+#include "libavutil/cpu.h"
+#include "libavutil/x86/cpu.h"
+#include "libavfilter/gblur.h"
+
+void ff_horiz_slice_sse4(float *ptr, int width, int height, int steps, float nu, float bscale);
+void ff_horiz_slice_avx2(float *ptr, int width, int height, int steps, float nu, float bscale);
+
+av_cold void ff_gblur_init_x86(GBlurContext *s)
+{
+#if ARCH_X86_64
+    int cpu_flags = av_get_cpu_flags();
+
+    if (EXTERNAL_SSE4(cpu_flags))
+        s->horiz_slice = ff_horiz_slice_sse4;
+    if (EXTERNAL_AVX2(cpu_flags))
+        s->horiz_slice = ff_horiz_slice_avx2;
+#endif
+}
diff --git a/libavfilter/x86/vf_maskedclamp.asm b/libavfilter/x86/vf_maskedclamp.asm
new file mode 100644
index 0000000..d586610
--- /dev/null
+++ b/libavfilter/x86/vf_maskedclamp.asm
@@ -0,0 +1,95 @@
+;*****************************************************************************
+;* x86-optimized functions for maskedclamp filter
+;*
+;* Copyright (c) 2019 Paul B Mahol
+;*
+;* This file is part of FFmpeg.
+;*
+;* FFmpeg is free software; you can redistribute it and/or
+;* modify it under the terms of the GNU Lesser General Public
+;* License as published by the Free Software Foundation; either
+;* version 2.1 of the License, or (at your option) any later version.
+;*
+;* FFmpeg is distributed in the hope that it will be useful,
+;* but WITHOUT ANY WARRANTY; without even the implied warranty of
+;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+;* Lesser General Public License for more details.
+;*
+;* You should have received a copy of the GNU Lesser General Public
+;* License along with FFmpeg; if not, write to the Free Software
+;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+;******************************************************************************
+
+%include "libavutil/x86/x86util.asm"
+
+SECTION .text
+
+;------------------------------------------------------------------------------
+; void ff_maskedclamp(const uint8_t *src, uint8_t *dst,
+;                     const uint8_t *darksrc,
+;                     const uint8_t *brightsrc,
+;                     int w, int undershoot, int overshoot)
+;------------------------------------------------------------------------------
+
+INIT_XMM sse2
+cglobal maskedclamp8, 5,5,5, src, dst, dark, bright, w, undershoot, overshoot
+    movsxdifnidn wq, wd
+
+    add        srcq, wq
+    add       darkq, wq
+    add     brightq, wq
+    add        dstq, wq
+    neg          wq
+
+    movd         m3, r5m
+    punpcklbw    m3, m3
+    SPLATW       m3, m3
+
+    movd         m4, r6m
+    punpcklbw    m4, m4
+    SPLATW       m4, m4
+
+    .loop:
+        movu                  m0, [srcq + wq]
+        movu                  m1, [darkq + wq]
+        movu                  m2, [brightq + wq]
+
+        psubusb               m1, m3
+        paddusb               m2, m4
+        CLIPUB                m0, m1, m2
+        mova         [dstq + wq], m0
+
+        add                   wq, mmsize
+        jl .loop
+    RET
+
+INIT_XMM sse4
+cglobal maskedclamp16, 5,5,5, src, dst, dark, bright, w, undershoot, overshoot
+    shl          wd, 1
+
+    add        srcq, wq
+    add       darkq, wq
+    add     brightq, wq
+    add        dstq, wq
+    neg          wq
+
+    movd         m3, r5m
+    SPLATW       m3, m3
+
+    movd         m4, r6m
+    SPLATW       m4, m4
+
+    .loop:
+        movu                  m0, [srcq + wq]
+        movu                  m1, [darkq + wq]
+        movu                  m2, [brightq + wq]
+
+        psubusw               m1, m3
+        paddusw               m2, m4
+        pmaxuw                m0, m1
+        pminuw                m0, m2
+        mova         [dstq + wq], m0
+
+        add                   wq, mmsize
+        jl .loop
+    RET
diff --git a/libavfilter/x86/vf_maskedclamp_init.c b/libavfilter/x86/vf_maskedclamp_init.c
new file mode 100644
index 0000000..53153f8
--- /dev/null
+++ b/libavfilter/x86/vf_maskedclamp_init.c
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 2019 Paul B Mahol
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "libavutil/attributes.h"
+#include "libavutil/cpu.h"
+#include "libavutil/mem.h"
+#include "libavutil/x86/asm.h"
+#include "libavutil/x86/cpu.h"
+#include "libavfilter/maskedclamp.h"
+
+void ff_maskedclamp8_sse2(const uint8_t *bsrc, uint8_t *dst,
+                          const uint8_t *darksrc, const uint8_t *brightsrc,
+                          int w, int undershoot, int overshoot);
+
+void ff_maskedclamp16_sse4(const uint8_t *bsrc, uint8_t *dst,
+                           const uint8_t *darksrc, const uint8_t *brightsrc,
+                           int w, int undershoot, int overshoot);
+
+av_cold void ff_maskedclamp_init_x86(MaskedClampDSPContext *dsp, int depth)
+{
+    int cpu_flags = av_get_cpu_flags();
+
+    if (EXTERNAL_SSE2(cpu_flags) && depth <= 8) {
+        dsp->maskedclamp = ff_maskedclamp8_sse2;
+    }
+
+    if (EXTERNAL_SSE4(cpu_flags) && depth > 8) {
+        dsp->maskedclamp = ff_maskedclamp16_sse4;
+    }
+}
diff --git a/libavfilter/x86/vf_ssim.asm b/libavfilter/x86/vf_ssim.asm
index 3293e66..7880930 100644
--- a/libavfilter/x86/vf_ssim.asm
+++ b/libavfilter/x86/vf_ssim.asm
@@ -169,8 +169,9 @@
 %endif
 
 INIT_XMM sse4
-cglobal ssim_end_line, 3, 3, 6, sum0, sum1, w
+cglobal ssim_end_line, 3, 3, 7, sum0, sum1, w
     pxor              m0, m0
+    pxor              m6, m6
 .loop:
     mova              m1, [sum0q+mmsize*0]
     mova              m2, [sum0q+mmsize*1]
@@ -214,34 +215,46 @@
     mulps             m4, m5
     mulps             m3, m1
     divps             m4, m3                    ; ssim_endl
-    addps             m0, m4                    ; ssim
+    mova              m5, m4
+    cvtps2pd          m3, m5
+    movhlps           m5, m5
+    cvtps2pd          m5, m5
+    addpd             m0, m3                    ; ssim
+    addpd             m6, m5                    ; ssim
     add            sum0q, mmsize*4
     add            sum1q, mmsize*4
     sub               wd, 4
     jg .loop
 
-    ; subps the ones we added too much
+    ; subpd the ones we added too much
     test              wd, wd
     jz .end
     add               wd, 4
+    test              wd, 3
+    jz .skip3
     test              wd, 2
     jz .skip2
-    psrldq            m4, 8
-.skip2:
     test              wd, 1
     jz .skip1
-    psrldq            m4, 4
+.skip3:
+    psrldq            m5, 8
+    subpd             m6, m5
+    jmp .end
+.skip2:
+    psrldq            m5, 8
+    subpd             m6, m5
+    subpd             m0, m3
+    jmp .end
 .skip1:
-    subps             m0, m4
+    psrldq            m3, 16
+    subpd             m6, m5
 
 .end:
+    addpd             m0, m6
     movhlps           m4, m0
-    addps             m0, m4
-    movss             m4, m0
-    shufps            m0, m0, 1
-    addss             m0, m4
+    addpd             m0, m4
 %if ARCH_X86_32
-    movss            r0m, m0
-    fld             r0mp
+    movsd            r0m, m0
+    fld        qword r0m
 %endif
     RET
diff --git a/libavfilter/x86/vf_ssim_init.c b/libavfilter/x86/vf_ssim_init.c
index 599c928..cbaa20e 100644
--- a/libavfilter/x86/vf_ssim_init.c
+++ b/libavfilter/x86/vf_ssim_init.c
@@ -28,7 +28,7 @@
 void ff_ssim_4x4_line_xop  (const uint8_t *buf, ptrdiff_t buf_stride,
                             const uint8_t *ref, ptrdiff_t ref_stride,
                             int (*sums)[4], int w);
-float ff_ssim_end_line_sse4(const int (*sum0)[4], const int (*sum1)[4], int w);
+double ff_ssim_end_line_sse4(const int (*sum0)[4], const int (*sum1)[4], int w);
 
 void ff_ssim_init_x86(SSIMDSPContext *dsp)
 {
diff --git a/libavfilter/x86/vf_transpose.asm b/libavfilter/x86/vf_transpose.asm
new file mode 100644
index 0000000..c532c89
--- /dev/null
+++ b/libavfilter/x86/vf_transpose.asm
@@ -0,0 +1,87 @@
+;*****************************************************************************
+;* x86-optimized functions for transpose filter
+;*
+;* Copyright (C) 2019 Paul B Mahol
+;*
+;* This file is part of FFmpeg.
+;*
+;* FFmpeg is free software; you can redistribute it and/or
+;* modify it under the terms of the GNU Lesser General Public
+;* License as published by the Free Software Foundation; either
+;* version 2.1 of the License, or (at your option) any later version.
+;*
+;* FFmpeg is distributed in the hope that it will be useful,
+;* but WITHOUT ANY WARRANTY; without even the implied warranty of
+;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+;* Lesser General Public License for more details.
+;*
+;* You should have received a copy of the GNU Lesser General Public
+;* License along with FFmpeg; if not, write to the Free Software
+;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+;******************************************************************************
+
+%include "libavutil/x86/x86util.asm"
+
+SECTION .text
+
+;------------------------------------------------------------------------------
+; void ff_transpose_8x8(uint8_t *src, ptrdiff_t src_linesize,
+;                       uint8_t *dst, ptrdiff_t dst_linesize)
+;------------------------------------------------------------------------------
+
+INIT_XMM sse2
+cglobal transpose_8x8_8, 4,5,8, src, src_linesize, dst, dst_linesize, linesize3
+    lea     linesize3q, [src_linesizeq * 3]
+    movq    m0, [srcq + src_linesizeq * 0]
+    movq    m1, [srcq + src_linesizeq * 1]
+    movq    m2, [srcq + src_linesizeq * 2]
+    movq    m3, [srcq + linesize3q]
+    lea   srcq, [srcq + src_linesizeq * 4]
+    movq    m4, [srcq + src_linesizeq * 0]
+    movq    m5, [srcq + src_linesizeq * 1]
+    movq    m6, [srcq + src_linesizeq * 2]
+    movq    m7, [srcq + linesize3q]
+
+    TRANSPOSE_8X8B 0, 1, 2, 3, 4, 5, 6, 7
+
+    lea                  linesize3q, [dst_linesizeq * 3]
+    movq [dstq + dst_linesizeq * 0], m0
+    movq [dstq + dst_linesizeq * 1], m1
+    movq [dstq + dst_linesizeq * 2], m2
+    movq [dstq + linesize3q], m3
+    lea                        dstq, [dstq + dst_linesizeq * 4]
+    movq [dstq + dst_linesizeq * 0], m4
+    movq [dstq + dst_linesizeq * 1], m5
+    movq [dstq + dst_linesizeq * 2], m6
+    movq [dstq + linesize3q], m7
+    RET
+
+cglobal transpose_8x8_16, 4,5,9, ARCH_X86_32 * 32, src, src_linesize, dst, dst_linesize, linesize3
+    lea     linesize3q, [src_linesizeq * 3]
+    movu    m0, [srcq + src_linesizeq * 0]
+    movu    m1, [srcq + src_linesizeq * 1]
+    movu    m2, [srcq + src_linesizeq * 2]
+    movu    m3, [srcq + linesize3q]
+    lea   srcq, [srcq + src_linesizeq * 4]
+    movu    m4, [srcq + src_linesizeq * 0]
+    movu    m5, [srcq + src_linesizeq * 1]
+    movu    m6, [srcq + src_linesizeq * 2]
+    movu    m7, [srcq + linesize3q]
+
+%if ARCH_X86_64
+    TRANSPOSE8x8W 0, 1, 2, 3, 4, 5, 6, 7, 8
+%else
+    TRANSPOSE8x8W 0, 1, 2, 3, 4, 5, 6, 7, [rsp], [rsp + 16]
+%endif
+
+    lea                  linesize3q, [dst_linesizeq * 3]
+    movu [dstq + dst_linesizeq * 0], m0
+    movu [dstq + dst_linesizeq * 1], m1
+    movu [dstq + dst_linesizeq * 2], m2
+    movu [dstq + linesize3q], m3
+    lea                        dstq, [dstq + dst_linesizeq * 4]
+    movu [dstq + dst_linesizeq * 0], m4
+    movu [dstq + dst_linesizeq * 1], m5
+    movu [dstq + dst_linesizeq * 2], m6
+    movu [dstq + linesize3q], m7
+    RET
diff --git a/libavfilter/x86/vf_transpose_init.c b/libavfilter/x86/vf_transpose_init.c
new file mode 100644
index 0000000..6bb9908
--- /dev/null
+++ b/libavfilter/x86/vf_transpose_init.c
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2019 Paul B Mahol
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "libavutil/attributes.h"
+#include "libavutil/cpu.h"
+#include "libavutil/mem.h"
+#include "libavutil/x86/asm.h"
+#include "libavutil/x86/cpu.h"
+#include "libavfilter/transpose.h"
+
+void ff_transpose_8x8_8_sse2(uint8_t *src,
+                             ptrdiff_t src_linesize,
+                             uint8_t *dst,
+                             ptrdiff_t dst_linesize);
+
+void ff_transpose_8x8_16_sse2(uint8_t *src,
+                              ptrdiff_t src_linesize,
+                              uint8_t *dst,
+                              ptrdiff_t dst_linesize);
+
+av_cold void ff_transpose_init_x86(TransVtable *v, int pixstep)
+{
+    int cpu_flags = av_get_cpu_flags();
+
+    if (EXTERNAL_SSE2(cpu_flags) && pixstep == 1) {
+        v->transpose_8x8 = ff_transpose_8x8_8_sse2;
+    }
+
+    if (EXTERNAL_SSE2(cpu_flags) && pixstep == 2) {
+        v->transpose_8x8 = ff_transpose_8x8_16_sse2;
+    }
+}
diff --git a/libavfilter/x86/vf_v360.asm b/libavfilter/x86/vf_v360.asm
new file mode 100644
index 0000000..8e7e459
--- /dev/null
+++ b/libavfilter/x86/vf_v360.asm
@@ -0,0 +1,256 @@
+;*****************************************************************************
+;* x86-optimized functions for v360 filter
+;*
+;* This file is part of FFmpeg.
+;*
+;* FFmpeg is free software; you can redistribute it and/or
+;* modify it under the terms of the GNU Lesser General Public
+;* License as published by the Free Software Foundation; either
+;* version 2.1 of the License, or (at your option) any later version.
+;*
+;* FFmpeg is distributed in the hope that it will be useful,
+;* but WITHOUT ANY WARRANTY; without even the implied warranty of
+;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+;* Lesser General Public License for more details.
+;*
+;* You should have received a copy of the GNU Lesser General Public
+;* License along with FFmpeg; if not, write to the Free Software
+;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+;******************************************************************************
+
+
+%include "libavutil/x86/x86util.asm"
+
+%if HAVE_AVX2_EXTERNAL
+
+SECTION_RODATA
+
+pb_mask: db 0,4,8,12,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
+pw_mask: db 0,1,4, 5, 8, 9,12,13,-1,-1,-1,-1,-1,-1,-1,-1
+pd_255: times 4 dd 255
+pd_65535: times 4 dd 65535
+
+SECTION .text
+
+; void ff_remap2_8bit_line_avx2(uint8_t *dst, int width, const uint8_t *src, ptrdiff_t in_linesize,
+;                               const uint16_t *u, const uint16_t *v, const int16_t *ker);
+
+INIT_YMM avx2
+cglobal remap1_8bit_line, 6, 7, 6, dst, width, src, in_linesize, u, v, x
+    movsxdifnidn widthq, widthd
+    xor             xq, xq
+    movd           xm0, in_linesized
+    pcmpeqw         m4, m4
+    VBROADCASTI128  m3, [pb_mask]
+    vpbroadcastd    m0, xm0
+
+    .loop:
+        pmovsxwd   m1, [vq + xq * 2]
+        pmovsxwd   m2, [uq + xq * 2]
+
+        pmulld           m1, m0
+        paddd            m1, m2
+        mova             m2, m4
+        vpgatherdd       m5, [srcq + m1], m2
+        pshufb           m1, m5, m3
+        vextracti128    xm2, m1, 1
+        movd      [dstq+xq], xm1
+        movd    [dstq+xq+4], xm2
+
+        add   xq, mmsize / 4
+        cmp   xq, widthq
+        jl .loop
+    RET
+
+INIT_YMM avx2
+cglobal remap1_16bit_line, 6, 7, 6, dst, width, src, in_linesize, u, v, x
+    movsxdifnidn widthq, widthd
+    xor             xq, xq
+    movd           xm0, in_linesized
+    pcmpeqw         m4, m4
+    VBROADCASTI128  m3, [pw_mask]
+    vpbroadcastd    m0, xm0
+
+    .loop:
+        pmovsxwd   m1, [vq + xq * 2]
+        pmovsxwd   m2, [uq + xq * 2]
+
+        pslld            m2, 0x1
+        pmulld           m1, m0
+        paddd            m1, m2
+        mova             m2, m4
+        vpgatherdd       m5, [srcq + m1], m2
+        pshufb           m1, m5, m3
+        vextracti128    xm2, m1, 1
+        movq    [dstq+xq*2], xm1
+        movq  [dstq+xq*2+8], xm2
+
+        add   xq, mmsize / 4
+        cmp   xq, widthq
+        jl .loop
+    RET
+
+INIT_YMM avx2
+cglobal remap2_8bit_line, 7, 8, 8, dst, width, src, in_linesize, u, v, ker, x
+    movsxdifnidn widthq, widthd
+    movd           xm0, in_linesized
+%if ARCH_X86_32
+DEFINE_ARGS dst, width, src, x, u, v, ker
+%endif
+    xor             xq, xq
+    pcmpeqw         m7, m7
+    vpbroadcastd    m0, xm0
+    vpbroadcastd    m6, [pd_255]
+
+    .loop:
+        pmovsxwd   m1, [kerq + xq * 8]
+        pmovsxwd   m2, [vq + xq * 8]
+        pmovsxwd   m3, [uq + xq * 8]
+
+        pmulld          m4, m2, m0
+        paddd           m4, m3
+        mova            m3, m7
+        vpgatherdd      m2, [srcq + m4], m3
+        pand            m2, m6
+        pmulld          m2, m1
+        phaddd          m2, m2
+        phaddd          m1, m2, m2
+        psrld           m1, m1, 0xe
+        vextracti128   xm2, m1, 1
+
+        pextrb   [dstq+xq], xm1, 0
+        pextrb [dstq+xq+1], xm2, 0
+
+        add   xq, mmsize / 16
+        cmp   xq, widthq
+        jl .loop
+    RET
+
+INIT_YMM avx2
+cglobal remap2_16bit_line, 7, 8, 8, dst, width, src, in_linesize, u, v, ker, x
+    movsxdifnidn widthq, widthd
+    movd           xm0, in_linesized
+%if ARCH_X86_32
+DEFINE_ARGS dst, width, src, x, u, v, ker
+%endif
+    xor             xq, xq
+    pcmpeqw         m7, m7
+    vpbroadcastd    m0, xm0
+    vpbroadcastd    m6, [pd_65535]
+
+    .loop:
+        pmovsxwd   m1, [kerq + xq * 8]
+        pmovsxwd   m2, [vq + xq * 8]
+        pmovsxwd   m3, [uq + xq * 8]
+
+        pslld           m3, 0x1
+        pmulld          m4, m2, m0
+        paddd           m4, m3
+        mova            m3, m7
+        vpgatherdd      m2, [srcq + m4], m3
+        pand            m2, m6
+        pmulld          m2, m1
+        phaddd          m2, m2
+        phaddd          m1, m2, m2
+        psrld           m1, m1, 0xe
+        vextracti128   xm2, m1, 1
+
+        pextrw   [dstq+xq*2], xm1, 0
+        pextrw [dstq+xq*2+2], xm2, 0
+
+        add   xq, mmsize / 16
+        cmp   xq, widthq
+        jl .loop
+    RET
+
+%if ARCH_X86_64
+
+INIT_YMM avx2
+cglobal remap3_8bit_line, 7, 11, 8, dst, width, src, in_linesize, u, v, ker, x, y, tmp, z
+    movsxdifnidn widthq, widthd
+    xor             zq, zq
+    xor             yq, yq
+    xor             xq, xq
+    movd           xm0, in_linesized
+    pcmpeqw         m7, m7
+    vpbroadcastd    m0, xm0
+    vpbroadcastd    m6, [pd_255]
+
+    .loop:
+        pmovsxwd   m1, [kerq + yq]
+        pmovsxwd   m2, [vq + yq]
+        pmovsxwd   m3, [uq + yq]
+
+        pmulld          m4, m2, m0
+        paddd           m4, m3
+        mova            m3, m7
+        vpgatherdd      m2, [srcq + m4], m3
+        pand            m2, m6
+        pmulld          m2, m1
+        HADDD           m2, m1
+        movzx         tmpq, word [vq + yq + 16]
+        imul          tmpq, in_linesizeq
+        movzx           zq, word [uq + yq + 16]
+        add           tmpq, zq
+        movzx           zq, byte [srcq + tmpq]
+        movzx         tmpq, word [kerq + yq + 16]
+        imul            zd, tmpd
+        movd           xm1, zd
+        paddd           m2, m1
+        psrld           m2, m2, 0xe
+
+        packuswb        m2, m2
+        pextrb   [dstq+xq], xm2, 0
+
+        add   xq, 1
+        add   yq, 18
+        cmp   xq, widthq
+        jl .loop
+    RET
+
+INIT_YMM avx2
+cglobal remap4_8bit_line, 7, 9, 11, dst, width, src, in_linesize, u, v, ker, x, y
+    movsxdifnidn widthq, widthd
+    xor             yq, yq
+    xor             xq, xq
+    movd           xm0, in_linesized
+    pcmpeqw         m7, m7
+    vpbroadcastd    m0, xm0
+    vpbroadcastd    m6, [pd_255]
+
+    .loop:
+        pmovsxwd   m1, [kerq + yq]
+        pmovsxwd   m5, [kerq + yq + 16]
+        pmovsxwd   m2, [vq + yq]
+        pmovsxwd   m8, [vq + yq + 16]
+        pmovsxwd   m3, [uq + yq]
+        pmovsxwd   m9, [uq + yq + 16]
+
+        pmulld          m4, m2, m0
+        pmulld         m10, m8, m0
+        paddd           m4, m3
+        paddd           m10, m9
+        mova            m3, m7
+        vpgatherdd      m2, [srcq + m4], m3
+        mova            m3, m7
+        vpgatherdd      m4, [srcq + m10], m3
+        pand            m2, m6
+        pand            m4, m6
+        pmulld          m2, m1
+        pmulld          m4, m5
+
+        paddd           m2, m4
+        HADDD           m2, m1
+        psrld           m2, m2, 0xe
+        packuswb        m2, m2
+
+        pextrb   [dstq+xq], xm2, 0
+
+        add   xq, 1
+        add   yq, 32
+        cmp   xq, widthq
+        jl .loop
+    RET
+
+%endif
+%endif
diff --git a/libavfilter/x86/vf_v360_init.c b/libavfilter/x86/vf_v360_init.c
new file mode 100644
index 0000000..7d001a6
--- /dev/null
+++ b/libavfilter/x86/vf_v360_init.c
@@ -0,0 +1,70 @@
+/*
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "config.h"
+
+#include "libavutil/attributes.h"
+#include "libavutil/cpu.h"
+#include "libavutil/x86/cpu.h"
+#include "libavfilter/v360.h"
+
+void ff_remap1_8bit_line_avx2(uint8_t *dst, int width, const uint8_t *src, ptrdiff_t in_linesize,
+                              const int16_t *const u, const int16_t *const v, const int16_t *const ker);
+
+void ff_remap2_8bit_line_avx2(uint8_t *dst, int width, const uint8_t *src, ptrdiff_t in_linesize,
+                              const int16_t *const u, const int16_t *const v, const int16_t *const ker);
+
+void ff_remap3_8bit_line_avx2(uint8_t *dst, int width, const uint8_t *src, ptrdiff_t in_linesize,
+                              const int16_t *const u, const int16_t *const v, const int16_t *const ker);
+
+void ff_remap4_8bit_line_avx2(uint8_t *dst, int width, const uint8_t *src, ptrdiff_t in_linesize,
+                              const int16_t *const u, const int16_t *const v, const int16_t *const ker);
+
+void ff_remap1_16bit_line_avx2(uint8_t *dst, int width, const uint8_t *src, ptrdiff_t in_linesize,
+                               const int16_t *const u, const int16_t *const v, const int16_t *const ker);
+
+void ff_remap2_16bit_line_avx2(uint8_t *dst, int width, const uint8_t *src, ptrdiff_t in_linesize,
+                               const int16_t *const u, const int16_t *const v, const int16_t *const ker);
+
+av_cold void ff_v360_init_x86(V360Context *s, int depth)
+{
+    int cpu_flags = av_get_cpu_flags();
+
+    if (EXTERNAL_AVX2_FAST(cpu_flags) && s->interp == NEAREST && depth <= 8)
+        s->remap_line = ff_remap1_8bit_line_avx2;
+
+    if (EXTERNAL_AVX2_FAST(cpu_flags) && s->interp == BILINEAR && depth <= 8)
+        s->remap_line = ff_remap2_8bit_line_avx2;
+
+    if (EXTERNAL_AVX2_FAST(cpu_flags) && s->interp == NEAREST && depth > 8)
+        s->remap_line = ff_remap1_16bit_line_avx2;
+
+    if (EXTERNAL_AVX2_FAST(cpu_flags) && s->interp == BILINEAR && depth > 8)
+        s->remap_line = ff_remap2_16bit_line_avx2;
+
+#if ARCH_X86_64
+    if (EXTERNAL_AVX2_FAST(cpu_flags) && s->interp == LAGRANGE9 && depth <= 8)
+        s->remap_line = ff_remap3_8bit_line_avx2;
+
+    if (EXTERNAL_AVX2_FAST(cpu_flags) && (s->interp == BICUBIC ||
+                                          s->interp == LANCZOS ||
+                                          s->interp == SPLINE16 ||
+                                          s->interp == GAUSSIAN) && depth <= 8)
+        s->remap_line = ff_remap4_8bit_line_avx2;
+#endif
+}
diff --git a/libavfilter/yadif.h b/libavfilter/yadif.h
index d23d138..c928911 100644
--- a/libavfilter/yadif.h
+++ b/libavfilter/yadif.h
@@ -19,6 +19,7 @@
 #ifndef AVFILTER_YADIF_H
 #define AVFILTER_YADIF_H
 
+#include "libavutil/opt.h"
 #include "libavutil/pixdesc.h"
 #include "avfilter.h"
 
@@ -40,6 +41,12 @@
     YADIF_DEINT_INTERLACED = 1, ///< only deinterlace frames marked as interlaced
 };
 
+enum YADIFCurrentField {
+    YADIF_FIELD_BACK_END = -1, ///< The last frame in a sequence
+    YADIF_FIELD_END      =  0, ///< The first or last field in a sequence
+    YADIF_FIELD_NORMAL   =  1, ///< A normal field in the middle of a sequence
+};
+
 typedef struct YADIFContext {
     const AVClass *class;
 
@@ -54,6 +61,8 @@
     AVFrame *prev;
     AVFrame *out;
 
+    void (*filter)(AVFilterContext *ctx, AVFrame *dstpic, int parity, int tff);
+
     /**
      * Required alignment for filter_line
      */
@@ -67,8 +76,22 @@
     int eof;
     uint8_t *temp_line;
     int temp_line_size;
+
+    /*
+     * An algorithm that treats first and/or last fields in a sequence
+     * differently can use this to detect those cases. It is the algorithm's
+     * responsibility to set the value to YADIF_FIELD_NORMAL after processing
+     * the first field.
+     */
+    int current_field;  ///< YADIFCurrentField
 } YADIFContext;
 
 void ff_yadif_init_x86(YADIFContext *yadif);
 
+int ff_yadif_filter_frame(AVFilterLink *link, AVFrame *frame);
+
+int ff_yadif_request_frame(AVFilterLink *link);
+
+extern const AVOption ff_yadif_options[];
+
 #endif /* AVFILTER_YADIF_H */
diff --git a/libavfilter/yadif_common.c b/libavfilter/yadif_common.c
new file mode 100644
index 0000000..a10cf7a
--- /dev/null
+++ b/libavfilter/yadif_common.c
@@ -0,0 +1,215 @@
+/*
+ * Copyright (C) 2006-2011 Michael Niedermayer <michaelni@gmx.at>
+ *               2010      James Darnley <james.darnley@gmail.com>
+
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "libavutil/avassert.h"
+#include "libavutil/imgutils.h"
+#include "internal.h"
+#include "yadif.h"
+
+static int return_frame(AVFilterContext *ctx, int is_second)
+{
+    YADIFContext *yadif = ctx->priv;
+    AVFilterLink *link  = ctx->outputs[0];
+    int tff, ret;
+
+    if (yadif->parity == -1) {
+        tff = yadif->cur->interlaced_frame ?
+              yadif->cur->top_field_first : 1;
+    } else {
+        tff = yadif->parity ^ 1;
+    }
+
+    if (is_second) {
+        yadif->out = ff_get_video_buffer(link, link->w, link->h);
+        if (!yadif->out)
+            return AVERROR(ENOMEM);
+
+        av_frame_copy_props(yadif->out, yadif->cur);
+        yadif->out->interlaced_frame = 0;
+        if (yadif->current_field == YADIF_FIELD_BACK_END)
+            yadif->current_field = YADIF_FIELD_END;
+    }
+
+    yadif->filter(ctx, yadif->out, tff ^ !is_second, tff);
+
+    if (is_second) {
+        int64_t cur_pts  = yadif->cur->pts;
+        int64_t next_pts = yadif->next->pts;
+
+        if (next_pts != AV_NOPTS_VALUE && cur_pts != AV_NOPTS_VALUE) {
+            yadif->out->pts = cur_pts + next_pts;
+        } else {
+            yadif->out->pts = AV_NOPTS_VALUE;
+        }
+    }
+    ret = ff_filter_frame(ctx->outputs[0], yadif->out);
+
+    yadif->frame_pending = (yadif->mode&1) && !is_second;
+    return ret;
+}
+
+static int checkstride(YADIFContext *yadif, const AVFrame *a, const AVFrame *b)
+{
+    int i;
+    for (i = 0; i < yadif->csp->nb_components; i++)
+        if (a->linesize[i] != b->linesize[i])
+            return 1;
+    return 0;
+}
+
+static void fixstride(AVFilterLink *link, AVFrame *f)
+{
+    AVFrame *dst = ff_default_get_video_buffer(link, f->width, f->height);
+    if(!dst)
+        return;
+    av_frame_copy_props(dst, f);
+    av_image_copy(dst->data, dst->linesize,
+                  (const uint8_t **)f->data, f->linesize,
+                  dst->format, dst->width, dst->height);
+    av_frame_unref(f);
+    av_frame_move_ref(f, dst);
+    av_frame_free(&dst);
+}
+
+int ff_yadif_filter_frame(AVFilterLink *link, AVFrame *frame)
+{
+    AVFilterContext *ctx = link->dst;
+    YADIFContext *yadif = ctx->priv;
+
+    av_assert0(frame);
+
+    if (yadif->frame_pending)
+        return_frame(ctx, 1);
+
+    if (yadif->prev)
+        av_frame_free(&yadif->prev);
+    yadif->prev = yadif->cur;
+    yadif->cur  = yadif->next;
+    yadif->next = frame;
+
+    if (!yadif->cur) {
+        yadif->cur = av_frame_clone(yadif->next);
+        if (!yadif->cur)
+            return AVERROR(ENOMEM);
+        yadif->current_field = YADIF_FIELD_END;
+    }
+
+    if (checkstride(yadif, yadif->next, yadif->cur)) {
+        av_log(ctx, AV_LOG_VERBOSE, "Reallocating frame due to differing stride\n");
+        fixstride(link, yadif->next);
+    }
+    if (checkstride(yadif, yadif->next, yadif->cur))
+        fixstride(link, yadif->cur);
+    if (yadif->prev && checkstride(yadif, yadif->next, yadif->prev))
+        fixstride(link, yadif->prev);
+    if (checkstride(yadif, yadif->next, yadif->cur) || (yadif->prev && checkstride(yadif, yadif->next, yadif->prev))) {
+        av_log(ctx, AV_LOG_ERROR, "Failed to reallocate frame\n");
+        return -1;
+    }
+
+    if (!yadif->prev)
+        return 0;
+
+    if ((yadif->deint && !yadif->cur->interlaced_frame) ||
+        ctx->is_disabled ||
+        (yadif->deint && !yadif->prev->interlaced_frame && yadif->prev->repeat_pict) ||
+        (yadif->deint && !yadif->next->interlaced_frame && yadif->next->repeat_pict)
+    ) {
+        yadif->out  = av_frame_clone(yadif->cur);
+        if (!yadif->out)
+            return AVERROR(ENOMEM);
+
+        av_frame_free(&yadif->prev);
+        if (yadif->out->pts != AV_NOPTS_VALUE)
+            yadif->out->pts *= 2;
+        return ff_filter_frame(ctx->outputs[0], yadif->out);
+    }
+
+    yadif->out = ff_get_video_buffer(ctx->outputs[0], link->w, link->h);
+    if (!yadif->out)
+        return AVERROR(ENOMEM);
+
+    av_frame_copy_props(yadif->out, yadif->cur);
+    yadif->out->interlaced_frame = 0;
+
+    if (yadif->out->pts != AV_NOPTS_VALUE)
+        yadif->out->pts *= 2;
+
+    return return_frame(ctx, 0);
+}
+
+int ff_yadif_request_frame(AVFilterLink *link)
+{
+    AVFilterContext *ctx = link->src;
+    YADIFContext *yadif = ctx->priv;
+    int ret;
+
+    if (yadif->frame_pending) {
+        return_frame(ctx, 1);
+        return 0;
+    }
+
+    if (yadif->eof)
+        return AVERROR_EOF;
+
+    ret  = ff_request_frame(ctx->inputs[0]);
+
+    if (ret == AVERROR_EOF && yadif->cur) {
+        AVFrame *next = av_frame_clone(yadif->next);
+
+        if (!next)
+            return AVERROR(ENOMEM);
+
+        yadif->current_field = YADIF_FIELD_BACK_END;
+        next->pts = yadif->next->pts * 2 - yadif->cur->pts;
+
+        ff_yadif_filter_frame(ctx->inputs[0], next);
+        yadif->eof = 1;
+    } else if (ret < 0) {
+        return ret;
+    }
+
+    return 0;
+}
+
+#define OFFSET(x) offsetof(YADIFContext, x)
+#define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
+
+#define CONST(name, help, val, unit) { name, help, 0, AV_OPT_TYPE_CONST, {.i64=val}, INT_MIN, INT_MAX, FLAGS, unit }
+
+const AVOption ff_yadif_options[] = {
+    { "mode",   "specify the interlacing mode", OFFSET(mode), AV_OPT_TYPE_INT, {.i64=YADIF_MODE_SEND_FRAME}, 0, 3, FLAGS, "mode"},
+    CONST("send_frame",           "send one frame for each frame",                                     YADIF_MODE_SEND_FRAME,           "mode"),
+    CONST("send_field",           "send one frame for each field",                                     YADIF_MODE_SEND_FIELD,           "mode"),
+    CONST("send_frame_nospatial", "send one frame for each frame, but skip spatial interlacing check", YADIF_MODE_SEND_FRAME_NOSPATIAL, "mode"),
+    CONST("send_field_nospatial", "send one frame for each field, but skip spatial interlacing check", YADIF_MODE_SEND_FIELD_NOSPATIAL, "mode"),
+
+    { "parity", "specify the assumed picture field parity", OFFSET(parity), AV_OPT_TYPE_INT, {.i64=YADIF_PARITY_AUTO}, -1, 1, FLAGS, "parity" },
+    CONST("tff",  "assume top field first",    YADIF_PARITY_TFF,  "parity"),
+    CONST("bff",  "assume bottom field first", YADIF_PARITY_BFF,  "parity"),
+    CONST("auto", "auto detect parity",        YADIF_PARITY_AUTO, "parity"),
+
+    { "deint", "specify which frames to deinterlace", OFFSET(deint), AV_OPT_TYPE_INT, {.i64=YADIF_DEINT_ALL}, 0, 1, FLAGS, "deint" },
+    CONST("all",        "deinterlace all frames",                       YADIF_DEINT_ALL,         "deint"),
+    CONST("interlaced", "only deinterlace frames marked as interlaced", YADIF_DEINT_INTERLACED,  "deint"),
+
+    { NULL }
+};
diff --git a/libavformat/3dostr.c b/libavformat/3dostr.c
index 3668e5f..6c49f75 100644
--- a/libavformat/3dostr.c
+++ b/libavformat/3dostr.c
@@ -22,7 +22,7 @@
 #include "avformat.h"
 #include "internal.h"
 
-static int threedostr_probe(AVProbeData *p)
+static int threedostr_probe(const AVProbeData *p)
 {
     if (memcmp(p->buf, "CTRL", 4) &&
         memcmp(p->buf, "SHDR", 4) &&
diff --git a/libavformat/4xm.c b/libavformat/4xm.c
index ead6d2b..aea9226 100644
--- a/libavformat/4xm.c
+++ b/libavformat/4xm.c
@@ -81,7 +81,7 @@
     AVRational fps;
 } FourxmDemuxContext;
 
-static int fourxm_probe(AVProbeData *p)
+static int fourxm_probe(const AVProbeData *p)
 {
     if ((AV_RL32(&p->buf[0]) != RIFF_TAG) ||
         (AV_RL32(&p->buf[8]) != FOURXMV_TAG))
@@ -241,7 +241,8 @@
         size       = AV_RL32(&header[i + 4]);
         if (size > header_size - i - 8 && (fourcc_tag == vtrk_TAG || fourcc_tag == strk_TAG)) {
             av_log(s, AV_LOG_ERROR, "chunk larger than array %d>%d\n", size, header_size - i - 8);
-            return AVERROR_INVALIDDATA;
+            ret = AVERROR_INVALIDDATA;
+            goto fail;
         }
 
         if (fourcc_tag == std__TAG) {
@@ -321,8 +322,10 @@
         case cfr2_TAG:
             /* allocate 8 more bytes than 'size' to account for fourcc
              * and size */
-            if (size + 8 < size || av_new_packet(pkt, size + 8))
-                return AVERROR(EIO);
+            if (size > INT_MAX - AV_INPUT_BUFFER_PADDING_SIZE - 8)
+                return AVERROR_INVALIDDATA;
+            if ((ret = av_new_packet(pkt, size + 8)) < 0)
+                return ret;
             pkt->stream_index = fourxm->video_stream_index;
             pkt->pts          = fourxm->video_pts;
             pkt->pos          = avio_tell(s->pb);
@@ -346,7 +349,7 @@
                 fourxm->tracks[track_number].channels > 0) {
                 ret = av_get_packet(s->pb, pkt, size);
                 if (ret < 0)
-                    return AVERROR(EIO);
+                    return ret;
                 pkt->stream_index =
                     fourxm->tracks[track_number].stream_index;
                 pkt->pts    = fourxm->tracks[track_number].audio_pts;
diff --git a/libavformat/Makefile b/libavformat/Makefile
index e99e915..d4bed3c 100644
--- a/libavformat/Makefile
+++ b/libavformat/Makefile
@@ -82,16 +82,18 @@
 OBJS-$(CONFIG_AEA_DEMUXER)               += aea.o pcm.o
 OBJS-$(CONFIG_AFC_DEMUXER)               += afc.o
 OBJS-$(CONFIG_AIFF_DEMUXER)              += aiffdec.o pcm.o isom.o \
-                                            mov_chan.o
+                                            mov_chan.o replaygain.o
 OBJS-$(CONFIG_AIFF_MUXER)                += aiffenc.o id3v2enc.o
 OBJS-$(CONFIG_AIX_DEMUXER)               += aixdec.o
+OBJS-$(CONFIG_ALP_DEMUXER)               += alp.o
 OBJS-$(CONFIG_AMR_DEMUXER)               += amr.o
-OBJS-$(CONFIG_AMR_MUXER)                 += amr.o
+OBJS-$(CONFIG_AMR_MUXER)                 += amr.o rawenc.o
 OBJS-$(CONFIG_AMRNB_DEMUXER)             += amr.o
 OBJS-$(CONFIG_AMRWB_DEMUXER)             += amr.o
 OBJS-$(CONFIG_ANM_DEMUXER)               += anm.o
 OBJS-$(CONFIG_APC_DEMUXER)               += apc.o
 OBJS-$(CONFIG_APE_DEMUXER)               += ape.o apetag.o img2.o
+OBJS-$(CONFIG_APM_DEMUXER)               += apm.o
 OBJS-$(CONFIG_APNG_DEMUXER)              += apngdec.o
 OBJS-$(CONFIG_APNG_MUXER)                += apngenc.o
 OBJS-$(CONFIG_APTX_DEMUXER)              += aptxdec.o rawdec.o
@@ -99,6 +101,7 @@
 OBJS-$(CONFIG_APTX_HD_DEMUXER)           += aptxdec.o rawdec.o
 OBJS-$(CONFIG_APTX_HD_MUXER)             += rawenc.o
 OBJS-$(CONFIG_AQTITLE_DEMUXER)           += aqtitledec.o subtitles.o
+OBJS-$(CONFIG_ARGO_ASF_DEMUXER)          += argo_asf.o
 OBJS-$(CONFIG_ASF_DEMUXER)               += asfdec_f.o asf.o asfcrypt.o \
                                             avlanguage.o
 OBJS-$(CONFIG_ASF_O_DEMUXER)             += asfdec_o.o asf.o asfcrypt.o \
@@ -148,7 +151,9 @@
 OBJS-$(CONFIG_DAUD_DEMUXER)              += dauddec.o
 OBJS-$(CONFIG_DAUD_MUXER)                += daudenc.o
 OBJS-$(CONFIG_DCSTR_DEMUXER)             += dcstr.o
+OBJS-$(CONFIG_DERF_DEMUXER)              += derf.o pcm.o
 OBJS-$(CONFIG_DFA_DEMUXER)               += dfa.o
+OBJS-$(CONFIG_DHAV_DEMUXER)              += dhav.o
 OBJS-$(CONFIG_DIRAC_DEMUXER)             += diracdec.o rawdec.o
 OBJS-$(CONFIG_DIRAC_MUXER)               += rawenc.o
 OBJS-$(CONFIG_DNXHD_DEMUXER)             += dnxhddec.o rawdec.o
@@ -161,8 +166,8 @@
 OBJS-$(CONFIG_DTS_MUXER)                 += rawenc.o
 OBJS-$(CONFIG_DV_DEMUXER)                += dv.o
 OBJS-$(CONFIG_DV_MUXER)                  += dvenc.o
-OBJS-$(CONFIG_DVBSUB_DEMUXER)            += dvbsub.o
-OBJS-$(CONFIG_DVBTXT_DEMUXER)            += dvbtxt.o
+OBJS-$(CONFIG_DVBSUB_DEMUXER)            += dvbsub.o rawdec.o
+OBJS-$(CONFIG_DVBTXT_DEMUXER)            += dvbtxt.o rawdec.o
 OBJS-$(CONFIG_DXA_DEMUXER)               += dxa.o
 OBJS-$(CONFIG_EA_CDATA_DEMUXER)          += eacdata.o
 OBJS-$(CONFIG_EA_DEMUXER)                += electronicarts.o
@@ -174,7 +179,7 @@
 OBJS-$(CONFIG_FIFO_MUXER)                += fifo.o
 OBJS-$(CONFIG_FIFO_TEST_MUXER)           += fifo_test.o
 OBJS-$(CONFIG_FILMSTRIP_DEMUXER)         += filmstripdec.o
-OBJS-$(CONFIG_FILMSTRIP_MUXER)           += filmstripenc.o
+OBJS-$(CONFIG_FILMSTRIP_MUXER)           += filmstripenc.o rawenc.o
 OBJS-$(CONFIG_FITS_DEMUXER)              += fitsdec.o
 OBJS-$(CONFIG_FITS_MUXER)                += fitsenc.o
 OBJS-$(CONFIG_FLAC_DEMUXER)              += flacdec.o rawdec.o \
@@ -194,6 +199,7 @@
 OBJS-$(CONFIG_FRAMEMD5_MUXER)            += hashenc.o framehash.o
 OBJS-$(CONFIG_FRM_DEMUXER)               += frmdec.o
 OBJS-$(CONFIG_FSB_DEMUXER)               += fsb.o
+OBJS-$(CONFIG_FWSE_DEMUXER)              += fwse.o pcm.o
 OBJS-$(CONFIG_GIF_MUXER)                 += gif.o
 OBJS-$(CONFIG_GIF_DEMUXER)               += gifdec.o
 OBJS-$(CONFIG_GSM_DEMUXER)               += gsmdec.o
@@ -218,6 +224,8 @@
 OBJS-$(CONFIG_H264_DEMUXER)              += h264dec.o rawdec.o
 OBJS-$(CONFIG_H264_MUXER)                += rawenc.o
 OBJS-$(CONFIG_HASH_MUXER)                += hashenc.o
+OBJS-$(CONFIG_HCA_DEMUXER)               += hca.o
+OBJS-$(CONFIG_HCOM_DEMUXER)              += hcom.o pcm.o
 OBJS-$(CONFIG_HDS_MUXER)                 += hdsenc.o
 OBJS-$(CONFIG_HEVC_DEMUXER)              += hevcdec.o rawdec.o
 OBJS-$(CONFIG_HEVC_MUXER)                += rawenc.o
@@ -229,8 +237,9 @@
 OBJS-$(CONFIG_IDCIN_DEMUXER)             += idcin.o
 OBJS-$(CONFIG_IDF_DEMUXER)               += bintext.o sauce.o
 OBJS-$(CONFIG_IFF_DEMUXER)               += iff.o
+OBJS-$(CONFIG_IFV_DEMUXER)               += ifv.o
 OBJS-$(CONFIG_ILBC_DEMUXER)              += ilbc.o
-OBJS-$(CONFIG_ILBC_MUXER)                += ilbc.o
+OBJS-$(CONFIG_ILBC_MUXER)                += ilbc.o rawenc.o
 OBJS-$(CONFIG_IMAGE2_DEMUXER)            += img2dec.o img2.o
 OBJS-$(CONFIG_IMAGE2_MUXER)              += img2enc.o img2.o
 OBJS-$(CONFIG_IMAGE2PIPE_DEMUXER)        += img2dec.o img2.o
@@ -241,6 +250,7 @@
 OBJS-$(CONFIG_IMAGE_DDS_PIPE_DEMUXER)     += img2dec.o img2.o
 OBJS-$(CONFIG_IMAGE_DPX_PIPE_DEMUXER)     += img2dec.o img2.o
 OBJS-$(CONFIG_IMAGE_EXR_PIPE_DEMUXER)     += img2dec.o img2.o
+OBJS-$(CONFIG_IMAGE_GIF_PIPE_DEMUXER)     += img2dec.o img2.o
 OBJS-$(CONFIG_IMAGE_J2K_PIPE_DEMUXER)     += img2dec.o img2.o
 OBJS-$(CONFIG_IMAGE_JPEG_PIPE_DEMUXER)    += img2dec.o img2.o
 OBJS-$(CONFIG_IMAGE_JPEGLS_PIPE_DEMUXER)  += img2dec.o img2.o
@@ -273,6 +283,8 @@
 OBJS-$(CONFIG_JACOSUB_DEMUXER)           += jacosubdec.o subtitles.o
 OBJS-$(CONFIG_JACOSUB_MUXER)             += jacosubenc.o rawenc.o
 OBJS-$(CONFIG_JV_DEMUXER)                += jvdec.o
+OBJS-$(CONFIG_KUX_DEMUXER)               += flvdec.o
+OBJS-$(CONFIG_KVAG_DEMUXER)              += kvag.o
 OBJS-$(CONFIG_LATM_MUXER)                += latmenc.o rawenc.o
 OBJS-$(CONFIG_LMLM4_DEMUXER)             += lmlm4.o
 OBJS-$(CONFIG_LOAS_DEMUXER)              += loasdec.o rawdec.o
@@ -285,11 +297,11 @@
 OBJS-$(CONFIG_MATROSKA_DEMUXER)          += matroskadec.o matroska.o  \
                                             rmsipr.o flac_picture.o \
                                             oggparsevorbis.o vorbiscomment.o \
-                                            flac_picture.o replaygain.o
+                                            replaygain.o
 OBJS-$(CONFIG_MATROSKA_MUXER)            += matroskaenc.o matroska.o \
                                             av1.o avc.o hevc.o \
-                                            flacenc_header.o avlanguage.o vorbiscomment.o wv.o \
-                                            webmdashenc.o webm_chunk.o
+                                            flacenc_header.o avlanguage.o \
+                                            vorbiscomment.o wv.o
 OBJS-$(CONFIG_MD5_MUXER)                 += hashenc.o
 OBJS-$(CONFIG_MGSTS_DEMUXER)             += mgsts.o
 OBJS-$(CONFIG_MICRODVD_DEMUXER)          += microdvddec.o subtitles.o
@@ -335,16 +347,17 @@
 OBJS-$(CONFIG_MV_DEMUXER)                += mvdec.o
 OBJS-$(CONFIG_MVI_DEMUXER)               += mvi.o
 OBJS-$(CONFIG_MXF_DEMUXER)               += mxfdec.o mxf.o
-OBJS-$(CONFIG_MXF_MUXER)                 += mxfenc.o mxf.o audiointerleave.o
+OBJS-$(CONFIG_MXF_MUXER)                 += mxfenc.o mxf.o audiointerleave.o avc.o
 OBJS-$(CONFIG_MXG_DEMUXER)               += mxg.o
 OBJS-$(CONFIG_NC_DEMUXER)                += ncdec.o
 OBJS-$(CONFIG_NISTSPHERE_DEMUXER)        += nistspheredec.o pcm.o
-OBJS-$(CONFIG_NSP_DEMUXER)               += nspdec.o
+OBJS-$(CONFIG_NSP_DEMUXER)               += nspdec.o pcm.o
 OBJS-$(CONFIG_NSV_DEMUXER)               += nsvdec.o
 OBJS-$(CONFIG_NULL_MUXER)                += nullenc.o
 OBJS-$(CONFIG_NUT_DEMUXER)               += nutdec.o nut.o isom.o
 OBJS-$(CONFIG_NUT_MUXER)                 += nutenc.o nut.o
 OBJS-$(CONFIG_NUV_DEMUXER)               += nuv.o
+OBJS-$(CONFIG_AV1_DEMUXER)               += av1dec.o
 OBJS-$(CONFIG_OGG_DEMUXER)               += oggdec.o         \
                                             oggparsecelt.o   \
                                             oggparsedaala.o  \
@@ -411,6 +424,8 @@
 OBJS-$(CONFIG_PCM_U32LE_MUXER)           += pcmenc.o rawenc.o
 OBJS-$(CONFIG_PCM_U8_DEMUXER)            += pcmdec.o pcm.o
 OBJS-$(CONFIG_PCM_U8_MUXER)              += pcmenc.o rawenc.o
+OBJS-$(CONFIG_PCM_VIDC_DEMUXER)          += pcmdec.o pcm.o
+OBJS-$(CONFIG_PCM_VIDC_MUXER)            += pcmenc.o rawenc.o
 OBJS-$(CONFIG_PJS_DEMUXER)               += pjsdec.o subtitles.o
 OBJS-$(CONFIG_PMP_DEMUXER)               += pmpdec.o
 OBJS-$(CONFIG_PVA_DEMUXER)               += pva.o
@@ -429,7 +444,7 @@
 OBJS-$(CONFIG_RSD_DEMUXER)               += rsd.o
 OBJS-$(CONFIG_RPL_DEMUXER)               += rpl.o
 OBJS-$(CONFIG_RSO_DEMUXER)               += rsodec.o rso.o pcm.o
-OBJS-$(CONFIG_RSO_MUXER)                 += rsoenc.o rso.o
+OBJS-$(CONFIG_RSO_MUXER)                 += rsoenc.o rso.o rawenc.o
 OBJS-$(CONFIG_RTP_MPEGTS_MUXER)          += rtpenc_mpegts.o
 OBJS-$(CONFIG_RTP_MUXER)                 += rtp.o         \
                                             rtpenc_aac.o     \
@@ -463,7 +478,7 @@
 OBJS-$(CONFIG_SDP_DEMUXER)               += rtsp.o
 OBJS-$(CONFIG_SDR2_DEMUXER)              += sdr2.o
 OBJS-$(CONFIG_SDS_DEMUXER)               += sdsdec.o
-OBJS-$(CONFIG_SDX_DEMUXER)               += sdxdec.o
+OBJS-$(CONFIG_SDX_DEMUXER)               += sdxdec.o pcm.o
 OBJS-$(CONFIG_SEGAFILM_DEMUXER)          += segafilm.o
 OBJS-$(CONFIG_SEGAFILM_MUXER)            += segafilmenc.o
 OBJS-$(CONFIG_SEGMENT_MUXER)             += segment.o
@@ -471,6 +486,7 @@
 OBJS-$(CONFIG_SHORTEN_DEMUXER)           += shortendec.o rawdec.o
 OBJS-$(CONFIG_SIFF_DEMUXER)              += siff.o
 OBJS-$(CONFIG_SINGLEJPEG_MUXER)          += rawenc.o
+OBJS-$(CONFIG_SLN_DEMUXER)               += pcmdec.o pcm.o
 OBJS-$(CONFIG_SMACKER_DEMUXER)           += smacker.o
 OBJS-$(CONFIG_SMJPEG_DEMUXER)            += smjpegdec.o smjpeg.o
 OBJS-$(CONFIG_SMJPEG_MUXER)              += smjpegenc.o smjpeg.o
@@ -487,6 +503,7 @@
 OBJS-$(CONFIG_SRT_MUXER)                 += srtenc.o
 OBJS-$(CONFIG_STL_DEMUXER)               += stldec.o subtitles.o
 OBJS-$(CONFIG_STR_DEMUXER)               += psxstr.o
+OBJS-$(CONFIG_STREAMHASH_MUXER)          += hashenc.o
 OBJS-$(CONFIG_STREAM_SEGMENT_MUXER)      += segment.o
 OBJS-$(CONFIG_SUBVIEWER1_DEMUXER)        += subviewer1dec.o subtitles.o
 OBJS-$(CONFIG_SUBVIEWER_DEMUXER)         += subviewerdec.o subtitles.o
@@ -518,6 +535,7 @@
 OBJS-$(CONFIG_VC1_MUXER)                 += rawenc.o
 OBJS-$(CONFIG_VC1T_DEMUXER)              += vc1test.o
 OBJS-$(CONFIG_VC1T_MUXER)                += vc1testenc.o
+OBJS-$(CONFIG_VIVIDAS_DEMUXER)           += vividas.o
 OBJS-$(CONFIG_VIVO_DEMUXER)              += vivo.o
 OBJS-$(CONFIG_VMD_DEMUXER)               += sierravmd.o
 OBJS-$(CONFIG_VOBSUB_DEMUXER)            += subtitles.o # mpeg demuxer is in the dependencies
@@ -534,10 +552,9 @@
 OBJS-$(CONFIG_WEBM_MUXER)                += matroskaenc.o matroska.o \
                                             av1.o avc.o hevc.o \
                                             flacenc_header.o avlanguage.o \
-                                            wv.o vorbiscomment.o \
-                                            webmdashenc.o webm_chunk.o
-OBJS-$(CONFIG_WEBM_DASH_MANIFEST_MUXER)  += webmdashenc.o matroska.o
-OBJS-$(CONFIG_WEBM_CHUNK_MUXER)          += webm_chunk.o matroska.o
+                                            wv.o vorbiscomment.o
+OBJS-$(CONFIG_WEBM_DASH_MANIFEST_MUXER)  += webmdashenc.o
+OBJS-$(CONFIG_WEBM_CHUNK_MUXER)          += webm_chunk.o
 OBJS-$(CONFIG_WEBP_MUXER)                += webpenc.o
 OBJS-$(CONFIG_WEBVTT_DEMUXER)            += webvttdec.o subtitles.o
 OBJS-$(CONFIG_WEBVTT_MUXER)              += webvttenc.o
@@ -579,7 +596,7 @@
 OBJS-$(CONFIG_FFRTMPCRYPT_PROTOCOL)      += rtmpcrypt.o rtmpdigest.o rtmpdh.o
 OBJS-$(CONFIG_FFRTMPHTTP_PROTOCOL)       += rtmphttp.o
 OBJS-$(CONFIG_FILE_PROTOCOL)             += file.o
-OBJS-$(CONFIG_FTP_PROTOCOL)              += ftp.o
+OBJS-$(CONFIG_FTP_PROTOCOL)              += ftp.o urldecode.o
 OBJS-$(CONFIG_GOPHER_PROTOCOL)           += gopher.o
 OBJS-$(CONFIG_HLS_PROTOCOL)              += hlsproto.o
 OBJS-$(CONFIG_HTTP_PROTOCOL)             += http.o httpauth.o urldecode.o
@@ -615,6 +632,7 @@
 OBJS-$(CONFIG_UNIX_PROTOCOL)             += unix.o
 
 # external library protocols
+OBJS-$(CONFIG_LIBAMQP_PROTOCOL)          += libamqp.o
 OBJS-$(CONFIG_LIBRTMP_PROTOCOL)          += librtmp.o
 OBJS-$(CONFIG_LIBRTMPE_PROTOCOL)         += librtmp.o
 OBJS-$(CONFIG_LIBRTMPS_PROTOCOL)         += librtmp.o
@@ -623,6 +641,7 @@
 OBJS-$(CONFIG_LIBSMBCLIENT_PROTOCOL)     += libsmbclient.o
 OBJS-$(CONFIG_LIBSRT_PROTOCOL)           += libsrt.o
 OBJS-$(CONFIG_LIBSSH_PROTOCOL)           += libssh.o
+OBJS-$(CONFIG_LIBZMQ_PROTOCOL)           += libzmq.o
 
 # libavdevice dependencies
 OBJS-$(CONFIG_IEC61883_INDEV)            += dv.o
diff --git a/libavformat/aacdec.c b/libavformat/aacdec.c
index 685458b..ba3f5cc 100644
--- a/libavformat/aacdec.c
+++ b/libavformat/aacdec.c
@@ -20,6 +20,7 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
+#include "libavutil/avassert.h"
 #include "libavutil/intreadwrite.h"
 #include "avformat.h"
 #include "avio_internal.h"
@@ -30,7 +31,7 @@
 
 #define ADTS_HEADER_SIZE 7
 
-static int adts_aac_probe(AVProbeData *p)
+static int adts_aac_probe(const AVProbeData *p)
 {
     int max_frames = 0, first_frames = 0;
     int fsize, frames;
@@ -79,10 +80,31 @@
         return 0;
 }
 
+static int adts_aac_resync(AVFormatContext *s)
+{
+    uint16_t state;
+
+    // skip data until an ADTS frame is found
+    state = avio_r8(s->pb);
+    while (!avio_feof(s->pb) && avio_tell(s->pb) < s->probesize) {
+        state = (state << 8) | avio_r8(s->pb);
+        if ((state >> 4) != 0xFFF)
+            continue;
+        avio_seek(s->pb, -2, SEEK_CUR);
+        break;
+    }
+    if (s->pb->eof_reached)
+        return AVERROR_EOF;
+    if ((state >> 4) != 0xFFF)
+        return AVERROR_INVALIDDATA;
+
+    return 0;
+}
+
 static int adts_aac_read_header(AVFormatContext *s)
 {
     AVStream *st;
-    uint16_t state;
+    int ret;
 
     st = avformat_new_stream(s, NULL);
     if (!st)
@@ -100,17 +122,9 @@
         avio_seek(s->pb, cur, SEEK_SET);
     }
 
-    // skip data until the first ADTS frame is found
-    state = avio_r8(s->pb);
-    while (!avio_feof(s->pb) && avio_tell(s->pb) < s->probesize) {
-        state = (state << 8) | avio_r8(s->pb);
-        if ((state >> 4) != 0xFFF)
-            continue;
-        avio_seek(s->pb, -2, SEEK_CUR);
-        break;
-    }
-    if ((state >> 4) != 0xFFF)
-        return AVERROR_INVALIDDATA;
+    ret = adts_aac_resync(s);
+    if (ret < 0)
+        return ret;
 
     // LCM of all possible ADTS sample rates
     avpriv_set_pts_info(st, 64, 1, 28224000);
@@ -127,7 +141,6 @@
 
     ret = av_append_packet(s->pb, pkt, ff_id3v2_tag_len(pkt->data) - pkt->size);
     if (ret < 0) {
-        av_packet_unref(pkt);
         return ret;
     }
 
@@ -154,39 +167,41 @@
 {
     int ret, fsize;
 
-    // Parse all the ID3 headers between frames
-    while (1) {
-        ret = av_get_packet(s->pb, pkt, FFMAX(ID3v2_HEADER_SIZE, ADTS_HEADER_SIZE));
-        if (ret >= ID3v2_HEADER_SIZE && ff_id3v2_match(pkt->data, ID3v2_DEFAULT_MAGIC)) {
-            if ((ret = handle_id3(s, pkt)) >= 0) {
-                continue;
-            }
-        }
-        break;
-    }
-
+retry:
+    ret = av_get_packet(s->pb, pkt, ADTS_HEADER_SIZE);
     if (ret < 0)
         return ret;
 
     if (ret < ADTS_HEADER_SIZE) {
-        av_packet_unref(pkt);
         return AVERROR(EIO);
     }
 
     if ((AV_RB16(pkt->data) >> 4) != 0xfff) {
-        av_packet_unref(pkt);
-        return AVERROR_INVALIDDATA;
+        // Parse all the ID3 headers between frames
+        int append = ID3v2_HEADER_SIZE - ADTS_HEADER_SIZE;
+
+        av_assert2(append > 0);
+        ret = av_append_packet(s->pb, pkt, append);
+        if (ret != append) {
+            return AVERROR(EIO);
+        }
+        if (!ff_id3v2_match(pkt->data, ID3v2_DEFAULT_MAGIC)) {
+            av_packet_unref(pkt);
+            ret = adts_aac_resync(s);
+        } else
+            ret = handle_id3(s, pkt);
+        if (ret < 0)
+            return ret;
+
+        goto retry;
     }
 
     fsize = (AV_RB32(pkt->data + 3) >> 13) & 0x1FFF;
     if (fsize < ADTS_HEADER_SIZE) {
-        av_packet_unref(pkt);
         return AVERROR_INVALIDDATA;
     }
 
     ret = av_append_packet(s->pb, pkt, fsize - pkt->size);
-    if (ret < 0)
-        av_packet_unref(pkt);
 
     return ret;
 }
diff --git a/libavformat/aadec.c b/libavformat/aadec.c
index d83f283..b9dd51e 100644
--- a/libavformat/aadec.c
+++ b/libavformat/aadec.c
@@ -85,6 +85,7 @@
     AADemuxContext *c = s->priv_data;
     AVIOContext *pb = s->pb;
     AVStream *st;
+    int ret;
 
     /* parse .aa header */
     avio_skip(pb, 4); // file size
@@ -118,8 +119,12 @@
             header_seed = atoi(val);
         } else if (!strcmp(key, "HeaderKey")) { // this looks like "1234567890 1234567890 1234567890 1234567890"
             av_log(s, AV_LOG_DEBUG, "HeaderKey is <%s>\n", val);
-            sscanf(val, "%"SCNu32"%"SCNu32"%"SCNu32"%"SCNu32,
+
+            ret = sscanf(val, "%"SCNu32"%"SCNu32"%"SCNu32"%"SCNu32,
                    &header_key_part[0], &header_key_part[1], &header_key_part[2], &header_key_part[3]);
+            if (ret != 4)
+                return AVERROR_INVALIDDATA;
+
             for (idx = 0; idx < 4; idx++) {
                 AV_WB32(&header_key[idx * 4], header_key_part[idx]); // convert each part to BE!
             }
@@ -360,7 +365,7 @@
     return 1;
 }
 
-static int aa_probe(AVProbeData *p)
+static int aa_probe(const AVProbeData *p)
 {
     uint8_t *buf = p->buf;
 
diff --git a/libavformat/ac3dec.c b/libavformat/ac3dec.c
index 6f423ff..1f87939 100644
--- a/libavformat/ac3dec.c
+++ b/libavformat/ac3dec.c
@@ -25,7 +25,7 @@
 #include "avformat.h"
 #include "rawdec.h"
 
-static int ac3_eac3_probe(AVProbeData *p, enum AVCodecID expected_codec_id)
+static int ac3_eac3_probe(const AVProbeData *p, enum AVCodecID expected_codec_id)
 {
     int max_frames, first_frames = 0, frames;
     const uint8_t *buf, *buf2, *end;
@@ -47,7 +47,7 @@
             uint16_t frame_size;
             int i, ret;
 
-            if(!memcmp(buf2, "\x1\x10\0\0\0\0\0\0", 8)) {
+            if(!memcmp(buf2, "\x1\x10", 2)) {
                 if (buf2 + 16 > end)
                     break;
                 buf2+=16;
@@ -97,11 +97,12 @@
 }
 
 #if CONFIG_AC3_DEMUXER
-static int ac3_probe(AVProbeData *p)
+static int ac3_probe(const AVProbeData *p)
 {
     return ac3_eac3_probe(p, AV_CODEC_ID_AC3);
 }
 
+FF_RAW_DEMUXER_CLASS(ac3)
 AVInputFormat ff_ac3_demuxer = {
     .name           = "ac3",
     .long_name      = NULL_IF_CONFIG_SMALL("raw AC-3"),
@@ -111,15 +112,18 @@
     .flags= AVFMT_GENERIC_INDEX,
     .extensions = "ac3",
     .raw_codec_id   = AV_CODEC_ID_AC3,
+    .priv_data_size = sizeof(FFRawDemuxerContext),
+    .priv_class     = &ac3_demuxer_class,
 };
 #endif
 
 #if CONFIG_EAC3_DEMUXER
-static int eac3_probe(AVProbeData *p)
+static int eac3_probe(const AVProbeData *p)
 {
     return ac3_eac3_probe(p, AV_CODEC_ID_EAC3);
 }
 
+FF_RAW_DEMUXER_CLASS(eac3)
 AVInputFormat ff_eac3_demuxer = {
     .name           = "eac3",
     .long_name      = NULL_IF_CONFIG_SMALL("raw E-AC-3"),
@@ -129,5 +133,7 @@
     .flags          = AVFMT_GENERIC_INDEX,
     .extensions     = "eac3",
     .raw_codec_id   = AV_CODEC_ID_EAC3,
+    .priv_data_size = sizeof(FFRawDemuxerContext),
+    .priv_class     = &eac3_demuxer_class,
 };
 #endif
diff --git a/libavformat/acm.c b/libavformat/acm.c
index 08dd928..5e03cf8 100644
--- a/libavformat/acm.c
+++ b/libavformat/acm.c
@@ -24,7 +24,7 @@
 #include "rawdec.h"
 #include "internal.h"
 
-static int acm_probe(AVProbeData *p)
+static int acm_probe(const AVProbeData *p)
 {
     if (AV_RB32(p->buf) != 0x97280301)
         return 0;
@@ -44,12 +44,9 @@
     st->codecpar->codec_type = AVMEDIA_TYPE_AUDIO;
     st->codecpar->codec_id   = AV_CODEC_ID_INTERPLAY_ACM;
 
-    ff_alloc_extradata(st->codecpar, 14);
-    if (!st->codecpar->extradata)
-        return AVERROR(ENOMEM);
-    ret = avio_read(s->pb, st->codecpar->extradata, 14);
-    if (ret < 10)
-        return ret < 0 ? ret : AVERROR_EOF;
+    ret = ff_get_extradata(s, st->codecpar, s->pb, 14);
+    if (ret < 0)
+        return ret;
 
     st->codecpar->channels    = AV_RL16(st->codecpar->extradata +  8);
     st->codecpar->sample_rate = AV_RL16(st->codecpar->extradata + 10);
@@ -63,6 +60,7 @@
     return 0;
 }
 
+FF_RAW_DEMUXER_CLASS(acm)
 AVInputFormat ff_acm_demuxer = {
     .name           = "acm",
     .long_name      = NULL_IF_CONFIG_SMALL("Interplay ACM"),
@@ -72,4 +70,6 @@
     .flags          = AVFMT_NOBINSEARCH | AVFMT_NOGENSEARCH | AVFMT_NO_BYTE_SEEK | AVFMT_NOTIMESTAMPS,
     .extensions     = "acm",
     .raw_codec_id   = AV_CODEC_ID_INTERPLAY_ACM,
+    .priv_data_size = sizeof(FFRawDemuxerContext),
+    .priv_class     = &acm_demuxer_class,
 };
diff --git a/libavformat/act.c b/libavformat/act.c
index fe67411..26425ca 100644
--- a/libavformat/act.c
+++ b/libavformat/act.c
@@ -33,7 +33,7 @@
     char second_packet;      ///< 1 - if temporary buffer contains valid (second) G.729 packet
 } ACTContext;
 
-static int probe(AVProbeData *p)
+static int probe(const AVProbeData *p)
 {
     int i;
 
diff --git a/libavformat/adp.c b/libavformat/adp.c
index 3914857..8668c78 100644
--- a/libavformat/adp.c
+++ b/libavformat/adp.c
@@ -24,7 +24,7 @@
 #include "avformat.h"
 #include "internal.h"
 
-static int adp_probe(AVProbeData *p)
+static int adp_probe(const AVProbeData *p)
 {
     int i, changes = 0;
     uint8_t last = 0;
@@ -78,7 +78,6 @@
 
     if (ret != size) {
         if (ret < 0) {
-            av_packet_unref(pkt);
             return ret;
         }
         av_shrink_packet(pkt, ret);
diff --git a/libavformat/ads.c b/libavformat/ads.c
index 73ea7c7..f25141b 100644
--- a/libavformat/ads.c
+++ b/libavformat/ads.c
@@ -23,7 +23,7 @@
 #include "avformat.h"
 #include "internal.h"
 
-static int ads_probe(AVProbeData *p)
+static int ads_probe(const AVProbeData *p)
 {
     if (memcmp(p->buf, "SShd", 4) ||
         memcmp(p->buf+32, "SSbd", 4))
diff --git a/libavformat/adtsenc.c b/libavformat/adtsenc.c
index 3c2840c..d937e2b 100644
--- a/libavformat/adtsenc.c
+++ b/libavformat/adtsenc.c
@@ -53,7 +53,7 @@
     int off;
 
     init_get_bits(&gb, buf, size * 8);
-    off = avpriv_mpeg4audio_get_config(&m4ac, buf, size * 8, 1);
+    off = avpriv_mpeg4audio_get_config2(&m4ac, buf, size, 1, s);
     if (off < 0)
         return off;
     skip_bits_long(&gb, off);
diff --git a/libavformat/adxdec.c b/libavformat/adxdec.c
index a271e2a..ccd5049 100644
--- a/libavformat/adxdec.c
+++ b/libavformat/adxdec.c
@@ -34,7 +34,7 @@
     int header_size;
 } ADXDemuxerContext;
 
-static int adx_probe(AVProbeData *p)
+static int adx_probe(const AVProbeData *p)
 {
     int offset;
     if (AV_RB16(p->buf) != 0x8000)
@@ -65,11 +65,9 @@
 
     ret = av_get_packet(s->pb, pkt, size);
     if (ret != size) {
-        av_packet_unref(pkt);
         return ret < 0 ? ret : AVERROR(EIO);
     }
     if (AV_RB16(pkt->data) & 0x8000) {
-        av_packet_unref(pkt);
         return AVERROR_EOF;
     }
     pkt->size     = size;
@@ -83,7 +81,7 @@
 {
     ADXDemuxerContext *c = s->priv_data;
     AVCodecParameters *par;
-
+    int ret;
     AVStream *st = avformat_new_stream(s, NULL);
     if (!st)
         return AVERROR(ENOMEM);
@@ -94,8 +92,8 @@
     c->header_size = avio_rb16(s->pb) + 4;
     avio_seek(s->pb, -4, SEEK_CUR);
 
-    if (ff_get_extradata(s, par, s->pb, c->header_size) < 0)
-        return AVERROR(ENOMEM);
+    if ((ret = ff_get_extradata(s, par, s->pb, c->header_size)) < 0)
+        return ret;
 
     if (par->extradata_size < 12) {
         av_log(s, AV_LOG_ERROR, "Invalid extradata size.\n");
diff --git a/libavformat/aea.c b/libavformat/aea.c
index f795495..bdeed64 100644
--- a/libavformat/aea.c
+++ b/libavformat/aea.c
@@ -27,7 +27,7 @@
 
 #define AT1_SU_SIZE     212
 
-static int aea_read_probe(AVProbeData *p)
+static int aea_read_probe(const AVProbeData *p)
 {
     if (p->buf_size <= 2048+212)
         return 0;
diff --git a/libavformat/afc.c b/libavformat/afc.c
index 542cb16..2da04eb 100644
--- a/libavformat/afc.c
+++ b/libavformat/afc.c
@@ -31,6 +31,7 @@
 {
     AFCDemuxContext *c = s->priv_data;
     AVStream *st;
+    int ret;
 
     st = avformat_new_stream(s, NULL);
     if (!st)
@@ -40,8 +41,8 @@
     st->codecpar->channels   = 2;
     st->codecpar->channel_layout = AV_CH_LAYOUT_STEREO;
 
-    if (ff_alloc_extradata(st->codecpar, 1))
-        return AVERROR(ENOMEM);
+    if ((ret = ff_alloc_extradata(st->codecpar, 1)) < 0)
+        return ret;
     st->codecpar->extradata[0] = 8 * st->codecpar->channels;
 
     c->data_end = avio_rb32(s->pb) + 32LL;
diff --git a/libavformat/aiffdec.c b/libavformat/aiffdec.c
index 7c701e0..cb2f1b6 100644
--- a/libavformat/aiffdec.c
+++ b/libavformat/aiffdec.c
@@ -29,6 +29,7 @@
 #include "isom.h"
 #include "id3v2.h"
 #include "mov_chan.h"
+#include "replaygain.h"
 
 #define AIFF                    0
 #define AIFF_C_VERSION1         0xA2805140
@@ -189,7 +190,7 @@
     return num_frames;
 }
 
-static int aiff_probe(AVProbeData *p)
+static int aiff_probe(const AVProbeData *p)
 {
     /* check file header */
     if (p->buf[0] == 'F' && p->buf[1] == 'O' &&
@@ -242,7 +243,10 @@
         if (size < 0)
             return size;
 
-        filesize -= size + 8;
+        if (size >= 0x7fffffff - 8)
+            filesize = 0;
+        else
+            filesize -= size + 8;
 
         switch (tag) {
         case MKTAG('C', 'O', 'M', 'M'):     /* Common chunk */
@@ -297,8 +301,8 @@
         case MKTAG('w', 'a', 'v', 'e'):
             if ((uint64_t)size > (1<<30))
                 return -1;
-            if (ff_get_extradata(s, st->codecpar, pb, size) < 0)
-                return AVERROR(ENOMEM);
+            if ((ret = ff_get_extradata(s, st->codecpar, pb, size)) < 0)
+                return ret;
             if (   (st->codecpar->codec_id == AV_CODEC_ID_QDMC || st->codecpar->codec_id == AV_CODEC_ID_QDM2)
                 && size>=12*4 && !st->codecpar->block_align) {
                 st->codecpar->block_align = AV_RB32(st->codecpar->extradata+11*4);
@@ -321,8 +325,8 @@
             }
             break;
         case MKTAG('C','H','A','N'):
-            if(ff_mov_read_chan(s, pb, st, size) < 0)
-                return AVERROR_INVALIDDATA;
+            if ((ret = ff_mov_read_chan(s, pb, st, size)) < 0)
+                return ret;
             break;
         case MKTAG('A','P','C','M'): /* XA ADPCM compressed sound chunk */
             st->codecpar->codec_id = AV_CODEC_ID_ADPCM_XA;
@@ -348,6 +352,10 @@
         }
     }
 
+    ret = ff_replaygain_export(st, s->metadata);
+    if (ret < 0)
+        return ret;
+
 got_sound:
     if (!st->codecpar->block_align && st->codecpar->codec_id == AV_CODEC_ID_QCELP) {
         av_log(s, AV_LOG_WARNING, "qcelp without wave chunk, assuming full rate\n");
diff --git a/libavformat/aiffenc.c b/libavformat/aiffenc.c
index aab3741..0145596 100644
--- a/libavformat/aiffenc.c
+++ b/libavformat/aiffenc.c
@@ -36,7 +36,7 @@
     int64_t frames;
     int64_t ssnd;
     int audio_stream_idx;
-    AVPacketList *pict_list;
+    AVPacketList *pict_list, *pict_list_end;
     int write_id3v2;
     int id3v2_version;
 } AIFFOutputContext;
@@ -49,9 +49,6 @@
     AVIOContext *pb = s->pb;
     AVPacketList *pict_list = aiff->pict_list;
 
-    if (!pb->seekable & AVIO_SEEKABLE_NORMAL)
-        return 0;
-
     if (!s->metadata && !aiff->pict_list)
         return 0;
 
@@ -125,7 +122,7 @@
 
     /* First verify if format is ok */
     if (!par->codec_tag)
-        return -1;
+        return AVERROR(EINVAL);
     if (par->codec_tag != MKTAG('N','O','N','E'))
         aifc = 1;
 
@@ -138,7 +135,7 @@
     if (aifc) { // compressed audio
         if (!par->block_align) {
             av_log(s, AV_LOG_ERROR, "block align not set\n");
-            return -1;
+            return AVERROR(EINVAL);
         }
         /* Version chunk */
         ffio_wfourcc(pb, "FVER");
@@ -169,7 +166,7 @@
         par->bits_per_coded_sample = av_get_bits_per_sample(par->codec_id);
     if (!par->bits_per_coded_sample) {
         av_log(s, AV_LOG_ERROR, "could not compute bits per sample\n");
-        return -1;
+        return AVERROR(EINVAL);
     }
     if (!par->block_align)
         par->block_align = (par->bits_per_coded_sample * par->channels) >> 3;
@@ -202,9 +199,6 @@
     avpriv_set_pts_info(s->streams[aiff->audio_stream_idx], 64, 1,
                         s->streams[aiff->audio_stream_idx]->codecpar->sample_rate);
 
-    /* Data is starting here */
-    avio_flush(pb);
-
     return 0;
 }
 
@@ -215,9 +209,6 @@
     if (pkt->stream_index == aiff->audio_stream_idx)
         avio_write(pb, pkt->data, pkt->size);
     else {
-        int ret;
-        AVPacketList *pict_list, *last;
-
         if (s->streams[pkt->stream_index]->codecpar->codec_type != AVMEDIA_TYPE_VIDEO)
             return 0;
 
@@ -229,24 +220,8 @@
         if (s->streams[pkt->stream_index]->nb_frames >= 1)
             return 0;
 
-        pict_list = av_mallocz(sizeof(AVPacketList));
-        if (!pict_list)
-            return AVERROR(ENOMEM);
-
-        ret = av_packet_ref(&pict_list->pkt, pkt);
-        if (ret < 0) {
-            av_freep(&pict_list);
-            return ret;
-        }
-
-        if (!aiff->pict_list)
-            aiff->pict_list = pict_list;
-        else {
-            last = aiff->pict_list;
-            while (last->next)
-                last = last->next;
-            last->next = pict_list;
-        }
+        return ff_packet_list_put(&aiff->pict_list, &aiff->pict_list_end,
+                                  pkt, FF_PACKETLIST_FLAG_REF_PACKET);
     }
 
     return 0;
@@ -254,10 +229,9 @@
 
 static int aiff_write_trailer(AVFormatContext *s)
 {
-    int ret;
+    int ret = 0;
     AVIOContext *pb = s->pb;
     AIFFOutputContext *aiff = s->priv_data;
-    AVPacketList *pict_list = aiff->pict_list;
     AVCodecParameters *par = s->streams[aiff->audio_stream_idx]->codecpar;
 
     /* Chunks sizes must be even */
@@ -289,18 +263,16 @@
         file_size = avio_tell(pb);
         avio_seek(pb, aiff->form, SEEK_SET);
         avio_wb32(pb, file_size - aiff->form - 4);
-
-        avio_flush(pb);
     }
 
-    while (pict_list) {
-        AVPacketList *next = pict_list->next;
-        av_packet_unref(&pict_list->pkt);
-        av_freep(&pict_list);
-        pict_list = next;
-    }
+    return ret;
+}
 
-    return 0;
+static void aiff_deinit(AVFormatContext *s)
+{
+    AIFFOutputContext *aiff = s->priv_data;
+
+    ff_packet_list_free(&aiff->pict_list, &aiff->pict_list_end);
 }
 
 #define OFFSET(x) offsetof(AIFFOutputContext, x)
@@ -331,6 +303,7 @@
     .write_header      = aiff_write_header,
     .write_packet      = aiff_write_packet,
     .write_trailer     = aiff_write_trailer,
+    .deinit            = aiff_deinit,
     .codec_tag         = (const AVCodecTag* const []){ ff_codec_aiff_tags, 0 },
     .priv_class        = &aiff_muxer_class,
 };
diff --git a/libavformat/aixdec.c b/libavformat/aixdec.c
index cad8a1e..b536bc4 100644
--- a/libavformat/aixdec.c
+++ b/libavformat/aixdec.c
@@ -23,7 +23,7 @@
 #include "avformat.h"
 #include "internal.h"
 
-static int aix_probe(AVProbeData *p)
+static int aix_probe(const AVProbeData *p)
 {
     if (AV_RL32(p->buf) != MKTAG('A','I','X','F') ||
         AV_RB32(p->buf +  8) != 0x01000014 ||
diff --git a/libavformat/allformats.c b/libavformat/allformats.c
index 9e41718..39d2c35 100644
--- a/libavformat/allformats.c
+++ b/libavformat/allformats.c
@@ -46,6 +46,7 @@
 extern AVInputFormat  ff_aiff_demuxer;
 extern AVOutputFormat ff_aiff_muxer;
 extern AVInputFormat  ff_aix_demuxer;
+extern AVInputFormat  ff_alp_demuxer;
 extern AVInputFormat  ff_amr_demuxer;
 extern AVOutputFormat ff_amr_muxer;
 extern AVInputFormat  ff_amrnb_demuxer;
@@ -53,6 +54,7 @@
 extern AVInputFormat  ff_anm_demuxer;
 extern AVInputFormat  ff_apc_demuxer;
 extern AVInputFormat  ff_ape_demuxer;
+extern AVInputFormat  ff_apm_demuxer;
 extern AVInputFormat  ff_apng_demuxer;
 extern AVOutputFormat ff_apng_muxer;
 extern AVInputFormat  ff_aptx_demuxer;
@@ -60,6 +62,7 @@
 extern AVInputFormat  ff_aptx_hd_demuxer;
 extern AVOutputFormat ff_aptx_hd_muxer;
 extern AVInputFormat  ff_aqtitle_demuxer;
+extern AVInputFormat  ff_argo_asf_demuxer;
 extern AVInputFormat  ff_asf_demuxer;
 extern AVOutputFormat ff_asf_muxer;
 extern AVInputFormat  ff_asf_o_demuxer;
@@ -70,6 +73,7 @@
 extern AVOutputFormat ff_asf_stream_muxer;
 extern AVInputFormat  ff_au_demuxer;
 extern AVOutputFormat ff_au_muxer;
+extern AVInputFormat  ff_av1_demuxer;
 extern AVInputFormat  ff_avi_demuxer;
 extern AVOutputFormat ff_avi_muxer;
 extern AVInputFormat  ff_avisynth_demuxer;
@@ -109,7 +113,9 @@
 extern AVInputFormat  ff_daud_demuxer;
 extern AVOutputFormat ff_daud_muxer;
 extern AVInputFormat  ff_dcstr_demuxer;
+extern AVInputFormat  ff_derf_demuxer;
 extern AVInputFormat  ff_dfa_demuxer;
+extern AVInputFormat  ff_dhav_demuxer;
 extern AVInputFormat  ff_dirac_demuxer;
 extern AVOutputFormat ff_dirac_muxer;
 extern AVInputFormat  ff_dnxhd_demuxer;
@@ -151,6 +157,7 @@
 extern AVOutputFormat ff_framemd5_muxer;
 extern AVInputFormat  ff_frm_demuxer;
 extern AVInputFormat  ff_fsb_demuxer;
+extern AVInputFormat  ff_fwse_demuxer;
 extern AVInputFormat  ff_g722_demuxer;
 extern AVOutputFormat ff_g722_muxer;
 extern AVInputFormat  ff_g723_1_demuxer;
@@ -175,6 +182,8 @@
 extern AVInputFormat  ff_h264_demuxer;
 extern AVOutputFormat ff_h264_muxer;
 extern AVOutputFormat ff_hash_muxer;
+extern AVInputFormat  ff_hca_demuxer;
+extern AVInputFormat  ff_hcom_demuxer;
 extern AVOutputFormat ff_hds_muxer;
 extern AVInputFormat  ff_hevc_demuxer;
 extern AVOutputFormat ff_hevc_muxer;
@@ -186,6 +195,7 @@
 extern AVInputFormat  ff_idcin_demuxer;
 extern AVInputFormat  ff_idf_demuxer;
 extern AVInputFormat  ff_iff_demuxer;
+extern AVInputFormat  ff_ifv_demuxer;
 extern AVInputFormat  ff_ilbc_demuxer;
 extern AVOutputFormat ff_ilbc_muxer;
 extern AVInputFormat  ff_image2_demuxer;
@@ -208,6 +218,8 @@
 extern AVInputFormat  ff_jacosub_demuxer;
 extern AVOutputFormat ff_jacosub_muxer;
 extern AVInputFormat  ff_jv_demuxer;
+extern AVInputFormat  ff_kux_demuxer;
+extern AVInputFormat  ff_kvag_demuxer;
 extern AVOutputFormat ff_latm_muxer;
 extern AVInputFormat  ff_lmlm4_demuxer;
 extern AVInputFormat  ff_loas_demuxer;
@@ -289,6 +301,8 @@
 extern AVOutputFormat ff_pcm_alaw_muxer;
 extern AVInputFormat  ff_pcm_mulaw_demuxer;
 extern AVOutputFormat ff_pcm_mulaw_muxer;
+extern AVInputFormat  ff_pcm_vidc_demuxer;
+extern AVOutputFormat ff_pcm_vidc_muxer;
 extern AVInputFormat  ff_pcm_f64be_demuxer;
 extern AVOutputFormat ff_pcm_f64be_muxer;
 extern AVInputFormat  ff_pcm_f64le_demuxer;
@@ -387,6 +401,7 @@
 extern AVOutputFormat ff_srt_muxer;
 extern AVInputFormat  ff_str_demuxer;
 extern AVInputFormat  ff_stl_demuxer;
+extern AVOutputFormat ff_streamhash_muxer;
 extern AVInputFormat  ff_subviewer1_demuxer;
 extern AVInputFormat  ff_subviewer_demuxer;
 extern AVInputFormat  ff_sup_demuxer;
@@ -419,6 +434,7 @@
 extern AVOutputFormat ff_vc1_muxer;
 extern AVInputFormat  ff_vc1t_demuxer;
 extern AVOutputFormat ff_vc1t_muxer;
+extern AVInputFormat  ff_vividas_demuxer;
 extern AVInputFormat  ff_vivo_demuxer;
 extern AVInputFormat  ff_vmd_demuxer;
 extern AVInputFormat  ff_vobsub_demuxer;
@@ -460,6 +476,7 @@
 extern AVInputFormat  ff_image_dds_pipe_demuxer;
 extern AVInputFormat  ff_image_dpx_pipe_demuxer;
 extern AVInputFormat  ff_image_exr_pipe_demuxer;
+extern AVInputFormat  ff_image_gif_pipe_demuxer;
 extern AVInputFormat  ff_image_j2k_pipe_demuxer;
 extern AVInputFormat  ff_image_jpeg_pipe_demuxer;
 extern AVInputFormat  ff_image_jpegls_pipe_demuxer;
@@ -577,7 +594,11 @@
     ff_thread_once(&av_format_next_init, av_format_init_next);
 
     if (f)
+#if FF_API_AVIOFORMAT
         return f->next;
+#else
+        return (AVInputFormat *) f->next;
+#endif
     else {
         void *opaque = NULL;
         return (AVInputFormat *)av_demuxer_iterate(&opaque);
@@ -589,7 +610,11 @@
     ff_thread_once(&av_format_next_init, av_format_init_next);
 
     if (f)
+#if FF_API_AVIOFORMAT
         return f->next;
+#else
+        return (AVOutputFormat *) f->next;
+#endif
     else {
         void *opaque = NULL;
         return (AVOutputFormat *)av_muxer_iterate(&opaque);
diff --git a/libavformat/alp.c b/libavformat/alp.c
new file mode 100644
index 0000000..4c2e8f0
--- /dev/null
+++ b/libavformat/alp.c
@@ -0,0 +1,146 @@
+/*
+ * LEGO Racers ALP (.tun & .pcm) demuxer
+ *
+ * Copyright (C) 2020 Zane van Iperen (zane@zanevaniperen.com)
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+#include "avformat.h"
+#include "internal.h"
+#include "libavutil/intreadwrite.h"
+#include "libavutil/internal.h"
+
+#define ALP_TAG            MKTAG('A', 'L', 'P', ' ')
+#define ALP_MAX_READ_SIZE  4096
+
+typedef struct ALPHeader {
+    uint32_t    magic;          /*< Magic Number, {'A', 'L', 'P', ' '} */
+    uint32_t    header_size;    /*< Header size (after this). */
+    char        adpcm[6];       /*< "ADPCM" */
+    uint8_t     unk1;           /*< Unknown */
+    uint8_t     num_channels;   /*< Channel Count. */
+    uint32_t    sample_rate;    /*< Sample rate, only if header_size >= 12. */
+} ALPHeader;
+
+static int alp_probe(const AVProbeData *p)
+{
+    uint32_t i;
+
+    if (AV_RL32(p->buf) != ALP_TAG)
+        return 0;
+
+    /* Only allowed header sizes are 8 and 12. */
+    i = AV_RL32(p->buf + 4);
+    if (i != 8 && i != 12)
+        return 0;
+
+    if (strncmp("ADPCM", p->buf + 8, 6) != 0)
+        return 0;
+
+    return AVPROBE_SCORE_MAX - 1;
+}
+
+static int alp_read_header(AVFormatContext *s)
+{
+    int ret;
+    AVStream *st;
+    ALPHeader hdr;
+    AVCodecParameters *par;
+
+    if ((hdr.magic = avio_rl32(s->pb)) != ALP_TAG)
+        return AVERROR_INVALIDDATA;
+
+    hdr.header_size = avio_rl32(s->pb);
+
+    if (hdr.header_size != 8 && hdr.header_size != 12) {
+        return AVERROR_INVALIDDATA;
+    }
+
+    if ((ret = avio_read(s->pb, hdr.adpcm, sizeof(hdr.adpcm))) < 0)
+        return ret;
+    else if (ret != sizeof(hdr.adpcm))
+        return AVERROR(EIO);
+
+    if (strncmp("ADPCM", hdr.adpcm, sizeof(hdr.adpcm)) != 0)
+        return AVERROR_INVALIDDATA;
+
+    hdr.unk1                    = avio_r8(s->pb);
+    hdr.num_channels            = avio_r8(s->pb);
+
+    if (hdr.header_size == 8) {
+        /* .TUN music file */
+        hdr.sample_rate         = 11025 * hdr.num_channels;
+    } else {
+        /* .PCM sound file */
+        hdr.sample_rate         = avio_rl32(s->pb);
+    }
+
+    if (hdr.sample_rate > 44100) {
+        avpriv_request_sample(s, "Sample Rate > 44100");
+        return AVERROR_PATCHWELCOME;
+    }
+
+    if (!(st = avformat_new_stream(s, NULL)))
+        return AVERROR(ENOMEM);
+
+    par                         = st->codecpar;
+    par->codec_type             = AVMEDIA_TYPE_AUDIO;
+    par->codec_id               = AV_CODEC_ID_ADPCM_IMA_ALP;
+    par->format                 = AV_SAMPLE_FMT_S16;
+    par->sample_rate            = hdr.sample_rate;
+    par->channels               = hdr.num_channels;
+
+    if (hdr.num_channels == 1)
+        par->channel_layout     = AV_CH_LAYOUT_MONO;
+    else if (hdr.num_channels == 2)
+        par->channel_layout     = AV_CH_LAYOUT_STEREO;
+    else
+        return AVERROR_INVALIDDATA;
+
+    par->bits_per_coded_sample  = 4;
+    par->bits_per_raw_sample    = 16;
+    par->block_align            = 1;
+    par->bit_rate               = par->channels *
+                                  par->sample_rate *
+                                  par->bits_per_coded_sample;
+
+    avpriv_set_pts_info(st, 64, 1, par->sample_rate);
+    return 0;
+}
+
+static int alp_read_packet(AVFormatContext *s, AVPacket *pkt)
+{
+    int ret;
+    AVCodecParameters *par = s->streams[0]->codecpar;
+
+    if ((ret = av_get_packet(s->pb, pkt, ALP_MAX_READ_SIZE)) < 0)
+        return ret;
+
+    pkt->flags         &= ~AV_PKT_FLAG_CORRUPT;
+    pkt->stream_index   = 0;
+    pkt->duration       = ret * 2 / par->channels;
+
+    return 0;
+}
+
+AVInputFormat ff_alp_demuxer = {
+    .name           = "alp",
+    .long_name      = NULL_IF_CONFIG_SMALL("LEGO Racers ALP"),
+    .read_probe     = alp_probe,
+    .read_header    = alp_read_header,
+    .read_packet    = alp_read_packet
+};
diff --git a/libavformat/amr.c b/libavformat/amr.c
index de34705..e4f8e4d 100644
--- a/libavformat/amr.c
+++ b/libavformat/amr.c
@@ -29,6 +29,7 @@
 #include "libavutil/channel_layout.h"
 #include "avformat.h"
 #include "internal.h"
+#include "rawenc.h"
 
 typedef struct {
     uint64_t cumulated_size;
@@ -60,18 +61,11 @@
     } else {
         return -1;
     }
-    avio_flush(pb);
-    return 0;
-}
-
-static int amr_write_packet(AVFormatContext *s, AVPacket *pkt)
-{
-    avio_write(s->pb, pkt->data, pkt->size);
     return 0;
 }
 #endif /* CONFIG_AMR_MUXER */
 
-static int amr_probe(AVProbeData *p)
+static int amr_probe(const AVProbeData *p)
 {
     // Only check for "#!AMR" which could be amr-wb, amr-nb.
     // This will also trigger multichannel files: "#!AMR_MC1.0\n" and
@@ -90,13 +84,15 @@
     AVStream *st;
     uint8_t header[9];
 
-    avio_read(pb, header, 6);
+    if (avio_read(pb, header, 6) != 6)
+        return AVERROR_INVALIDDATA;
 
     st = avformat_new_stream(s, NULL);
     if (!st)
         return AVERROR(ENOMEM);
     if (memcmp(header, AMR_header, 6)) {
-        avio_read(pb, header + 6, 3);
+        if (avio_read(pb, header + 6, 3) != 3)
+            return AVERROR_INVALIDDATA;
         if (memcmp(header, AMRWB_header, 9)) {
             return -1;
         }
@@ -154,7 +150,6 @@
     read              = avio_read(s->pb, pkt->data + 1, size - 1);
 
     if (read != size - 1) {
-        av_packet_unref(pkt);
         if (read < 0)
             return read;
         return AVERROR(EIO);
@@ -176,7 +171,7 @@
 #endif
 
 #if CONFIG_AMRNB_DEMUXER
-static int amrnb_probe(AVProbeData *p)
+static int amrnb_probe(const AVProbeData *p)
 {
     int mode, i = 0, valid = 0, invalid = 0;
     const uint8_t *b = p->buf;
@@ -232,7 +227,7 @@
 #endif
 
 #if CONFIG_AMRWB_DEMUXER
-static int amrwb_probe(AVProbeData *p)
+static int amrwb_probe(const AVProbeData *p)
 {
     int mode, i = 0, valid = 0, invalid = 0;
     const uint8_t *b = p->buf;
@@ -296,7 +291,7 @@
     .audio_codec       = AV_CODEC_ID_AMR_NB,
     .video_codec       = AV_CODEC_ID_NONE,
     .write_header      = amr_write_header,
-    .write_packet      = amr_write_packet,
+    .write_packet      = ff_raw_write_packet,
     .flags             = AVFMT_NOTIMESTAMPS,
 };
 #endif
diff --git a/libavformat/anm.c b/libavformat/anm.c
index b31757a..9af3a41 100644
--- a/libavformat/anm.c
+++ b/libavformat/anm.c
@@ -47,7 +47,7 @@
 #define LPF_TAG  MKTAG('L','P','F',' ')
 #define ANIM_TAG MKTAG('A','N','I','M')
 
-static int probe(AVProbeData *p)
+static int probe(const AVProbeData *p)
 {
     /* verify tags and video dimensions */
     if (AV_RL32(&p->buf[0])  == LPF_TAG &&
@@ -132,12 +132,7 @@
     avio_skip(pb, 58);
 
     /* color cycling and palette data */
-    st->codecpar->extradata_size = 16*8 + 4*256;
-    st->codecpar->extradata      = av_mallocz(st->codecpar->extradata_size + AV_INPUT_BUFFER_PADDING_SIZE);
-    if (!st->codecpar->extradata) {
-        return AVERROR(ENOMEM);
-    }
-    ret = avio_read(pb, st->codecpar->extradata, st->codecpar->extradata_size);
+    ret = ff_get_extradata(s, st->codecpar, s->pb, 16*8 + 4*256);
     if (ret < 0)
         return ret;
 
diff --git a/libavformat/apc.c b/libavformat/apc.c
index b180a50..7210bfb 100644
--- a/libavformat/apc.c
+++ b/libavformat/apc.c
@@ -25,7 +25,7 @@
 #include "avformat.h"
 #include "internal.h"
 
-static int apc_probe(AVProbeData *p)
+static int apc_probe(const AVProbeData *p)
 {
     if (!strncmp(p->buf, "CRYO_APC", 8))
         return AVPROBE_SCORE_MAX;
@@ -37,6 +37,7 @@
 {
     AVIOContext *pb = s->pb;
     AVStream *st;
+    int ret;
 
     avio_rl32(pb); /* CRYO */
     avio_rl32(pb); /* _APC */
@@ -53,8 +54,8 @@
     st->codecpar->sample_rate = avio_rl32(pb);
 
     /* initial predictor values for adpcm decoder */
-    if (ff_get_extradata(s, st->codecpar, pb, 2 * 4) < 0)
-        return AVERROR(ENOMEM);
+    if ((ret = ff_get_extradata(s, st->codecpar, pb, 2 * 4)) < 0)
+        return ret;
 
     if (avio_rl32(pb)) {
         st->codecpar->channels       = 2;
@@ -78,7 +79,6 @@
 {
     if (av_get_packet(s->pb, pkt, MAX_READ_SIZE) <= 0)
         return AVERROR(EIO);
-    pkt->flags &= ~AV_PKT_FLAG_CORRUPT;
     pkt->stream_index = 0;
     return 0;
 }
diff --git a/libavformat/ape.c b/libavformat/ape.c
index c06db78..ed6752a 100644
--- a/libavformat/ape.c
+++ b/libavformat/ape.c
@@ -83,7 +83,7 @@
     uint8_t  *bittable;
 } APEContext;
 
-static int ape_probe(AVProbeData * p)
+static int ape_probe(const AVProbeData * p)
 {
     int version = AV_RL16(p->buf+4);
     if (AV_RL32(p->buf) != MKTAG('M', 'A', 'C', ' '))
@@ -163,7 +163,7 @@
     APEContext *ape = s->priv_data;
     AVStream *st;
     uint32_t tag;
-    int i;
+    int i, ret;
     int total_blocks, final_size = 0;
     int64_t pts, file_size;
 
@@ -358,8 +358,8 @@
     st->duration  = total_blocks;
     avpriv_set_pts_info(st, 64, 1, ape->samplerate);
 
-    if (ff_alloc_extradata(st->codecpar, APE_EXTRADATA_SIZE))
-        return AVERROR(ENOMEM);
+    if ((ret = ff_alloc_extradata(st->codecpar, APE_EXTRADATA_SIZE)) < 0)
+        return ret;
     AV_WL16(st->codecpar->extradata + 0, ape->fileversion);
     AV_WL16(st->codecpar->extradata + 2, ape->compressiontype);
     AV_WL16(st->codecpar->extradata + 4, ape->formatflags);
@@ -386,14 +386,16 @@
     int nblocks;
     APEContext *ape = s->priv_data;
     uint32_t extra_size = 8;
+    int64_t ret64;
 
     if (avio_feof(s->pb))
         return AVERROR_EOF;
     if (ape->currentframe >= ape->totalframes)
         return AVERROR_EOF;
 
-    if (avio_seek(s->pb, ape->frames[ape->currentframe].pos, SEEK_SET) < 0)
-        return AVERROR(EIO);
+    ret64 = avio_seek(s->pb, ape->frames[ape->currentframe].pos, SEEK_SET);
+    if (ret64 < 0)
+        return ret64;
 
     /* Calculate how many blocks there are in this frame */
     if (ape->currentframe == (ape->totalframes - 1))
@@ -409,14 +411,14 @@
         return AVERROR(EIO);
     }
 
-    if (av_new_packet(pkt,  ape->frames[ape->currentframe].size + extra_size) < 0)
-        return AVERROR(ENOMEM);
+    ret = av_new_packet(pkt, ape->frames[ape->currentframe].size + extra_size);
+    if (ret < 0)
+        return ret;
 
     AV_WL32(pkt->data    , nblocks);
     AV_WL32(pkt->data + 4, ape->frames[ape->currentframe].skip);
     ret = avio_read(s->pb, pkt->data + extra_size, ape->frames[ape->currentframe].size);
     if (ret < 0) {
-        av_packet_unref(pkt);
         return ret;
     }
 
@@ -447,12 +449,13 @@
     AVStream *st = s->streams[stream_index];
     APEContext *ape = s->priv_data;
     int index = av_index_search_timestamp(st, timestamp, flags);
+    int64_t ret;
 
     if (index < 0)
         return -1;
 
-    if (avio_seek(s->pb, st->index_entries[index].pos, SEEK_SET) < 0)
-        return -1;
+    if ((ret = avio_seek(s->pb, st->index_entries[index].pos, SEEK_SET)) < 0)
+        return ret;
     ape->currentframe = index;
     return 0;
 }
diff --git a/libavformat/apetag.c b/libavformat/apetag.c
index cdc602e..454c6c6 100644
--- a/libavformat/apetag.c
+++ b/libavformat/apetag.c
@@ -29,7 +29,7 @@
 #include "apetag.h"
 #include "internal.h"
 
-#define APE_TAG_FLAG_CONTAINS_HEADER  (1 << 31)
+#define APE_TAG_FLAG_CONTAINS_HEADER  (1U << 31)
 #define APE_TAG_FLAG_LACKS_FOOTER     (1 << 30)
 #define APE_TAG_FLAG_IS_HEADER        (1 << 29)
 #define APE_TAG_FLAG_IS_BINARY        (1 << 1)
@@ -96,8 +96,8 @@
             st->attached_pic.stream_index = st->index;
             st->attached_pic.flags       |= AV_PKT_FLAG_KEY;
         } else {
-            if (ff_get_extradata(s, st->codecpar, s->pb, size) < 0)
-                return AVERROR(ENOMEM);
+            if ((ret = ff_get_extradata(s, st->codecpar, s->pb, size)) < 0)
+                return ret;
             st->codecpar->codec_type = AVMEDIA_TYPE_ATTACHMENT;
         }
     } else {
@@ -186,11 +186,11 @@
 {
     AVDictionaryEntry *e = NULL;
     int size, ret, count = 0;
-    AVIOContext *dyn_bc = NULL;
-    uint8_t *dyn_buf = NULL;
+    AVIOContext *dyn_bc;
+    uint8_t *dyn_buf;
 
     if ((ret = avio_open_dyn_buf(&dyn_bc)) < 0)
-        goto end;
+        return ret;
 
     ff_standardize_creation_time(s);
     while ((e = av_dict_get(s->metadata, "", e, AV_DICT_IGNORE_SUFFIX))) {
@@ -211,7 +211,7 @@
     if (!count)
         goto end;
 
-    size = avio_close_dyn_buf(dyn_bc, &dyn_buf);
+    size = avio_get_dyn_buf(dyn_bc, &dyn_buf);
     if (size <= 0)
         goto end;
     size += APE_TAG_FOOTER_BYTES;
@@ -239,9 +239,7 @@
     ffio_fill(s->pb, 0, 8);             // reserved
 
 end:
-    if (dyn_bc && !dyn_buf)
-        avio_close_dyn_buf(dyn_bc, &dyn_buf);
-    av_freep(&dyn_buf);
+    ffio_free_dyn_buf(&dyn_bc);
 
     return ret;
 }
diff --git a/libavformat/apm.c b/libavformat/apm.c
new file mode 100644
index 0000000..9d2a856
--- /dev/null
+++ b/libavformat/apm.c
@@ -0,0 +1,188 @@
+/*
+ * Rayman 2 APM Demuxer
+ *
+ * Copyright (C) 2020 Zane van Iperen (zane@zanevaniperen.com)
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+#include "avformat.h"
+#include "internal.h"
+#include "riff.h"
+#include "libavutil/internal.h"
+#include "libavutil/intreadwrite.h"
+
+#define APM_FILE_HEADER_SIZE    20
+#define APM_VS12_CHUNK_SIZE     76
+#define APM_MAX_READ_SIZE       4096
+
+#define APM_TAG_VS12            MKTAG('v', 's', '1', '2')
+#define APM_TAG_DATA            MKTAG('D', 'A', 'T', 'A')
+
+typedef struct APMState {
+    int32_t     has_saved;
+    int32_t     predictor_r;
+    int32_t     step_index_r;
+    int32_t     saved_r;
+    int32_t     predictor_l;
+    int32_t     step_index_l;
+    int32_t     saved_l;
+} APMState;
+
+typedef struct APMVS12Chunk {
+    uint32_t    magic;
+    uint32_t    file_size;
+    uint32_t    data_size;
+    uint32_t    unk1;
+    uint32_t    unk2;
+    APMState    state;
+    uint32_t    pad[7];
+} APMVS12Chunk;
+
+static void apm_parse_vs12(APMVS12Chunk *vs12, const uint8_t *buf)
+{
+    vs12->magic                 = AV_RL32(buf + 0);
+    vs12->file_size             = AV_RL32(buf + 4);
+    vs12->data_size             = AV_RL32(buf + 8);
+    vs12->unk1                  = AV_RL32(buf + 12);
+    vs12->unk2                  = AV_RL32(buf + 16);
+
+    vs12->state.has_saved       = AV_RL32(buf + 20);
+    vs12->state.predictor_r     = AV_RL32(buf + 24);
+    vs12->state.step_index_r    = AV_RL32(buf + 28);
+    vs12->state.saved_r         = AV_RL32(buf + 32);
+    vs12->state.predictor_l     = AV_RL32(buf + 36);
+    vs12->state.step_index_l    = AV_RL32(buf + 40);
+    vs12->state.saved_l         = AV_RL32(buf + 44);
+
+    for (int i = 0; i < FF_ARRAY_ELEMS(vs12->pad); i++)
+        vs12->pad[i]            = AV_RL32(buf + 48 + (i * 4));
+}
+
+static int apm_probe(const AVProbeData *p)
+{
+    if (p->buf_size < 100)
+        return 0;
+
+    if (AV_RL32(p->buf + 20) != APM_TAG_VS12)
+        return 0;
+
+    if (AV_RL32(p->buf + 96) != APM_TAG_DATA)
+        return 0;
+
+    return AVPROBE_SCORE_MAX - 1;
+}
+
+static int apm_read_header(AVFormatContext *s)
+{
+    int64_t ret;
+    AVStream *st;
+    APMVS12Chunk vs12;
+    uint8_t buf[APM_VS12_CHUNK_SIZE];
+
+    if (!(st = avformat_new_stream(s, NULL)))
+        return AVERROR(ENOMEM);
+
+    /* The header starts with a WAVEFORMATEX */
+    if ((ret = ff_get_wav_header(s, s->pb, st->codecpar, APM_FILE_HEADER_SIZE, 0)) < 0)
+        return ret;
+
+    if (st->codecpar->bits_per_coded_sample != 4)
+        return AVERROR_INVALIDDATA;
+
+    if (st->codecpar->codec_tag != 0x2000)
+        return AVERROR_INVALIDDATA;
+
+    /* ff_get_wav_header() does most of the work, but we need to fix a few things. */
+    st->codecpar->codec_id              = AV_CODEC_ID_ADPCM_IMA_APM;
+    st->codecpar->codec_tag             = 0;
+
+    if (st->codecpar->channels == 2)
+        st->codecpar->channel_layout    = AV_CH_LAYOUT_STEREO;
+    else if (st->codecpar->channels == 1)
+        st->codecpar->channel_layout    = AV_CH_LAYOUT_MONO;
+    else
+        return AVERROR_INVALIDDATA;
+
+    st->codecpar->format                = AV_SAMPLE_FMT_S16;
+    st->codecpar->bits_per_raw_sample   = 16;
+    st->codecpar->bit_rate              = st->codecpar->channels *
+                                          st->codecpar->sample_rate *
+                                          st->codecpar->bits_per_coded_sample;
+
+    if ((ret = avio_read(s->pb, buf, APM_VS12_CHUNK_SIZE)) < 0)
+        return ret;
+    else if (ret != APM_VS12_CHUNK_SIZE)
+        return AVERROR(EIO);
+
+    apm_parse_vs12(&vs12, buf);
+
+    if (vs12.magic != APM_TAG_VS12) {
+        return AVERROR_INVALIDDATA;
+    }
+
+    if (vs12.state.has_saved) {
+        avpriv_request_sample(s, "Saved Samples");
+        return AVERROR_PATCHWELCOME;
+    }
+
+    if (avio_rl32(s->pb) != APM_TAG_DATA)
+        return AVERROR_INVALIDDATA;
+
+    if ((ret = ff_alloc_extradata(st->codecpar, 16)) < 0)
+        return ret;
+
+    AV_WL32(st->codecpar->extradata +  0, vs12.state.predictor_l);
+    AV_WL32(st->codecpar->extradata +  4, vs12.state.step_index_l);
+    AV_WL32(st->codecpar->extradata +  8, vs12.state.predictor_r);
+    AV_WL32(st->codecpar->extradata + 12, vs12.state.step_index_r);
+
+    avpriv_set_pts_info(st, 64, 1, st->codecpar->sample_rate);
+    st->start_time  = 0;
+    st->duration    = vs12.data_size *
+                      (8 / st->codecpar->bits_per_coded_sample) /
+                      st->codecpar->channels;
+    return 0;
+}
+
+static int apm_read_packet(AVFormatContext *s, AVPacket *pkt)
+{
+    int ret;
+    AVCodecParameters *par = s->streams[0]->codecpar;
+
+    /*
+     * For future reference: if files with the `has_saved` field set ever
+     * surface, `saved_l`, and `saved_r` will each contain 8 "saved" samples
+     * that should be sent to the decoder before the actual data.
+     */
+
+    if ((ret = av_get_packet(s->pb, pkt, APM_MAX_READ_SIZE)) < 0)
+        return ret;
+
+    pkt->flags          &= ~AV_PKT_FLAG_CORRUPT;
+    pkt->stream_index   = 0;
+    pkt->duration       = ret * (8 / par->bits_per_coded_sample) / par->channels;
+
+    return 0;
+}
+
+AVInputFormat ff_apm_demuxer = {
+    .name           = "apm",
+    .long_name      = NULL_IF_CONFIG_SMALL("Ubisoft Rayman 2 APM"),
+    .read_probe     = apm_probe,
+    .read_header    = apm_read_header,
+    .read_packet    = apm_read_packet
+};
diff --git a/libavformat/apngdec.c b/libavformat/apngdec.c
index f9a97e5..0f1d04a 100644
--- a/libavformat/apngdec.c
+++ b/libavformat/apngdec.c
@@ -66,7 +66,7 @@
  *     ...
  *     IDAT
  */
-static int apng_probe(AVProbeData *p)
+static int apng_probe(const AVProbeData *p)
 {
     GetByteContext gb;
     int state = 0;
@@ -127,13 +127,14 @@
     int new_size, ret;
     uint8_t *new_extradata;
 
-    if (previous_size > INT_MAX - len)
+    if (previous_size > INT_MAX - AV_INPUT_BUFFER_PADDING_SIZE - len)
         return AVERROR_INVALIDDATA;
 
     new_size = previous_size + len;
     new_extradata = av_realloc(par->extradata, new_size + AV_INPUT_BUFFER_PADDING_SIZE);
     if (!new_extradata)
         return AVERROR(ENOMEM);
+    memset(new_extradata + new_size, 0, AV_INPUT_BUFFER_PADDING_SIZE);
     par->extradata = new_extradata;
     par->extradata_size = new_size;
 
@@ -177,10 +178,9 @@
         return ret;
 
     /* extradata will contain every chunk up to the first fcTL (excluded) */
-    st->codecpar->extradata = av_malloc(len + 12 + AV_INPUT_BUFFER_PADDING_SIZE);
-    if (!st->codecpar->extradata)
-        return AVERROR(ENOMEM);
-    st->codecpar->extradata_size = len + 12;
+    ret = ff_alloc_extradata(st->codecpar, len + 12);
+    if (ret < 0)
+        return ret;
     AV_WB32(st->codecpar->extradata,    len);
     AV_WL32(st->codecpar->extradata+4,  tag);
     AV_WB32(st->codecpar->extradata+8,  st->codecpar->width);
@@ -241,10 +241,6 @@
     }
 
 fail:
-    if (st->codecpar->extradata_size) {
-        av_freep(&st->codecpar->extradata);
-        st->codecpar->extradata_size = 0;
-    }
     return ret;
 }
 
@@ -342,6 +338,10 @@
 
     len = avio_rb32(pb);
     tag = avio_rl32(pb);
+
+    if (avio_feof(pb))
+        return AVERROR_EOF;
+
     switch (tag) {
     case MKTAG('f', 'c', 'T', 'L'):
         if (len != 26)
diff --git a/libavformat/apngenc.c b/libavformat/apngenc.c
index 77c1c91..88cd805 100644
--- a/libavformat/apngenc.c
+++ b/libavformat/apngenc.c
@@ -251,7 +251,6 @@
 
     if (apng->prev_packet) {
         ret = flush_packet(format_context, NULL);
-        av_freep(&apng->prev_packet);
         if (ret < 0)
             return ret;
     }
@@ -266,12 +265,18 @@
         apng_write_chunk(io_context, MKBETAG('a', 'c', 'T', 'L'), buf, 8);
     }
 
-    av_freep(&apng->extra_data);
-    apng->extra_data = 0;
-
     return 0;
 }
 
+static void apng_deinit(AVFormatContext *s)
+{
+    APNGMuxContext *apng = s->priv_data;
+
+    av_packet_free(&apng->prev_packet);
+    av_freep(&apng->extra_data);
+    apng->extra_data_size = 0;
+}
+
 #define OFFSET(x) offsetof(APNGMuxContext, x)
 #define ENC AV_OPT_FLAG_ENCODING_PARAM
 static const AVOption options[] = {
@@ -300,6 +305,7 @@
     .write_header   = apng_write_header,
     .write_packet   = apng_write_packet,
     .write_trailer  = apng_write_trailer,
+    .deinit         = apng_deinit,
     .priv_class     = &apng_muxer_class,
     .flags          = AVFMT_VARIABLE_FPS,
 };
diff --git a/libavformat/aqtitledec.c b/libavformat/aqtitledec.c
index f0e840b..8cc82a8 100644
--- a/libavformat/aqtitledec.c
+++ b/libavformat/aqtitledec.c
@@ -37,7 +37,7 @@
     AVRational frame_rate;
 } AQTitleContext;
 
-static int aqt_probe(AVProbeData *p)
+static int aqt_probe(const AVProbeData *p)
 {
     int frame;
     const char *ptr = p->buf;
diff --git a/libavformat/argo_asf.c b/libavformat/argo_asf.c
new file mode 100644
index 0000000..3339425
--- /dev/null
+++ b/libavformat/argo_asf.c
@@ -0,0 +1,249 @@
+/*
+ * Argonaut Games ASF demuxer
+ *
+ * Copyright (C) 2020 Zane van Iperen (zane@zanevaniperen.com)
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+#include "avformat.h"
+#include "internal.h"
+#include "libavutil/intreadwrite.h"
+#include "libavutil/avassert.h"
+
+#define ASF_TAG                 MKTAG('A', 'S', 'F', '\0')
+#define ASF_FILE_HEADER_SIZE    24
+#define ASF_CHUNK_HEADER_SIZE   20
+
+typedef struct ArgoASFFileHeader {
+    uint32_t    magic;          /*< Magic Number, {'A', 'S', 'F', '\0'} */
+    uint16_t    version_major;  /*< File Major Version. */
+    uint16_t    version_minor;  /*< File Minor Version. */
+    uint32_t    num_chunks;     /*< No. chunks in the file. */
+    uint32_t    chunk_offset;   /*< Offset to the first chunk from the start of the file. */
+    int8_t      name[8];        /*< Name. */
+} ArgoASFFileHeader;
+
+typedef struct ArgoASFChunkHeader {
+    uint32_t    num_blocks;     /*< No. blocks in the chunk. */
+    uint32_t    num_samples;    /*< No. samples per channel in a block. */
+    uint32_t    unk1;           /*< Unknown */
+    uint16_t    sample_rate;    /*< Sample rate. */
+    uint16_t    unk2;           /*< Unknown. */
+    uint32_t    flags;          /*< Stream flags. */
+} ArgoASFChunkHeader;
+
+enum {
+    ASF_CF_BITS_PER_SAMPLE  = (1 << 0), /*< 16-bit if set, 8 otherwise.      */
+    ASF_CF_STEREO           = (1 << 1), /*< Stereo if set, mono otherwise.   */
+    ASF_CF_ALWAYS1_1        = (1 << 2), /*< Unknown, always seems to be set. */
+    ASF_CF_ALWAYS1_2        = (1 << 3), /*< Unknown, always seems to be set. */
+
+    ASF_CF_ALWAYS1          = ASF_CF_ALWAYS1_1 | ASF_CF_ALWAYS1_2,
+    ASF_CF_ALWAYS0          = ~(ASF_CF_BITS_PER_SAMPLE | ASF_CF_STEREO | ASF_CF_ALWAYS1)
+};
+
+typedef struct ArgoASFDemuxContext {
+    ArgoASFFileHeader   fhdr;
+    ArgoASFChunkHeader  ckhdr;
+    uint32_t            blocks_read;
+} ArgoASFDemuxContext;
+
+static void argo_asf_parse_file_header(ArgoASFFileHeader *hdr, const uint8_t *buf)
+{
+    hdr->magic          = AV_RL32(buf + 0);
+    hdr->version_major  = AV_RL16(buf + 4);
+    hdr->version_minor  = AV_RL16(buf + 6);
+    hdr->num_chunks     = AV_RL32(buf + 8);
+    hdr->chunk_offset   = AV_RL32(buf + 12);
+    for (int i = 0; i < FF_ARRAY_ELEMS(hdr->name); i++)
+        hdr->name[i]    = AV_RL8(buf + 16 + i);
+}
+
+static void argo_asf_parse_chunk_header(ArgoASFChunkHeader *hdr, const uint8_t *buf)
+{
+    hdr->num_blocks     = AV_RL32(buf + 0);
+    hdr->num_samples    = AV_RL32(buf + 4);
+    hdr->unk1           = AV_RL32(buf + 8);
+    hdr->sample_rate    = AV_RL16(buf + 12);
+    hdr->unk2           = AV_RL16(buf + 14);
+    hdr->flags          = AV_RL32(buf + 16);
+}
+
+/*
+ * Known versions:
+ * 1.1: The sample files in /game-formats/brender/part2.zip
+ * 1.2: Croc! Legend of the Gobbos
+ * 2.1: Croc 2
+ */
+static int argo_asf_is_known_version(const ArgoASFFileHeader *hdr)
+{
+    return (hdr->version_major == 1 && hdr->version_minor == 1) ||
+           (hdr->version_major == 1 && hdr->version_minor == 2) ||
+           (hdr->version_major == 2 && hdr->version_minor == 1);
+}
+
+static int argo_asf_probe(const AVProbeData *p)
+{
+    ArgoASFFileHeader hdr;
+
+    av_assert0(AVPROBE_PADDING_SIZE >= ASF_FILE_HEADER_SIZE);
+
+    argo_asf_parse_file_header(&hdr, p->buf);
+
+    if (hdr.magic != ASF_TAG)
+        return 0;
+
+    if (!argo_asf_is_known_version(&hdr))
+        return AVPROBE_SCORE_EXTENSION / 2;
+
+    return AVPROBE_SCORE_EXTENSION + 1;
+}
+
+static int argo_asf_read_header(AVFormatContext *s)
+{
+    int64_t ret;
+    AVIOContext *pb = s->pb;
+    AVStream *st;
+    ArgoASFDemuxContext *asf = s->priv_data;
+    uint8_t buf[FFMAX(ASF_FILE_HEADER_SIZE, ASF_CHUNK_HEADER_SIZE)];
+
+    if (!(st = avformat_new_stream(s, NULL)))
+        return AVERROR(ENOMEM);
+
+    if ((ret = avio_read(pb, buf, ASF_FILE_HEADER_SIZE)) < 0)
+        return ret;
+    else if (ret != ASF_FILE_HEADER_SIZE)
+        return AVERROR(EIO);
+
+    argo_asf_parse_file_header(&asf->fhdr, buf);
+
+    if (!argo_asf_is_known_version(&asf->fhdr)) {
+        avpriv_request_sample(s, "Version %hu.%hu",
+            asf->fhdr.version_major, asf->fhdr.version_minor
+        );
+        return AVERROR_PATCHWELCOME;
+    }
+
+    if (asf->fhdr.num_chunks == 0) {
+        return AVERROR_INVALIDDATA;
+    } else if (asf->fhdr.num_chunks > 1) {
+        avpriv_request_sample(s, ">1 chunk");
+        return AVERROR_PATCHWELCOME;
+    }
+
+    if (asf->fhdr.chunk_offset < ASF_FILE_HEADER_SIZE)
+        return AVERROR_INVALIDDATA;
+
+    if ((ret = avio_skip(pb, asf->fhdr.chunk_offset - ASF_FILE_HEADER_SIZE)) < 0)
+        return ret;
+
+    if ((ret = avio_read(pb, buf, ASF_CHUNK_HEADER_SIZE)) < 0)
+        return ret;
+    else if (ret != ASF_CHUNK_HEADER_SIZE)
+        return AVERROR(EIO);
+
+    argo_asf_parse_chunk_header(&asf->ckhdr, buf);
+
+    if ((asf->ckhdr.flags & ASF_CF_ALWAYS1) != ASF_CF_ALWAYS1 || (asf->ckhdr.flags & ASF_CF_ALWAYS0) != 0) {
+        avpriv_request_sample(s, "Nonstandard flags (0x%08X)", asf->ckhdr.flags);
+        return AVERROR_PATCHWELCOME;
+    }
+
+    st->codecpar->codec_type                = AVMEDIA_TYPE_AUDIO;
+    st->codecpar->codec_id                  = AV_CODEC_ID_ADPCM_ARGO;
+    st->codecpar->format                    = AV_SAMPLE_FMT_S16P;
+
+    if (asf->ckhdr.flags & ASF_CF_STEREO) {
+        st->codecpar->channel_layout        = AV_CH_LAYOUT_STEREO;
+        st->codecpar->channels              = 2;
+    } else {
+        st->codecpar->channel_layout        = AV_CH_LAYOUT_MONO;
+        st->codecpar->channels              = 1;
+    }
+
+    st->codecpar->sample_rate               = asf->ckhdr.sample_rate;
+
+    st->codecpar->bits_per_coded_sample     = 4;
+
+    if (asf->ckhdr.flags & ASF_CF_BITS_PER_SAMPLE)
+        st->codecpar->bits_per_raw_sample   = 16;
+    else
+        st->codecpar->bits_per_raw_sample   = 8;
+
+    if (st->codecpar->bits_per_raw_sample != 16) {
+        /* The header allows for these, but I've never seen any files with them. */
+        avpriv_request_sample(s, "Non 16-bit samples");
+        return AVERROR_PATCHWELCOME;
+    }
+
+    /*
+     * (nchannel control bytes) + ((bytes_per_channel) * nchannel)
+     * For mono, this is 17. For stereo, this is 34.
+     */
+    st->codecpar->frame_size            = st->codecpar->channels +
+                                          (asf->ckhdr.num_samples / 2) *
+                                          st->codecpar->channels;
+
+    st->codecpar->block_align           = st->codecpar->frame_size;
+
+    st->codecpar->bit_rate              = st->codecpar->channels *
+                                          st->codecpar->sample_rate *
+                                          st->codecpar->bits_per_coded_sample;
+
+    avpriv_set_pts_info(st, 64, 1, st->codecpar->sample_rate);
+    st->start_time      = 0;
+    st->duration        = asf->ckhdr.num_blocks * asf->ckhdr.num_samples;
+    st->nb_frames       = asf->ckhdr.num_blocks;
+    return 0;
+}
+
+static int argo_asf_read_packet(AVFormatContext *s, AVPacket *pkt)
+{
+    ArgoASFDemuxContext *asf = s->priv_data;
+
+    AVStream *st = s->streams[0];
+    AVIOContext *pb = s->pb;
+    int ret;
+
+    if (asf->blocks_read >= asf->ckhdr.num_blocks)
+        return AVERROR_EOF;
+
+    if ((ret = av_get_packet(pb, pkt, st->codecpar->frame_size)) < 0)
+        return ret;
+    else if (ret != st->codecpar->frame_size)
+        return AVERROR_INVALIDDATA;
+
+    pkt->stream_index   = st->index;
+    pkt->duration       = asf->ckhdr.num_samples;
+
+    ++asf->blocks_read;
+    return 0;
+}
+
+/*
+ * Not actually sure what ASF stands for.
+ * - Argonaut Sound File?
+ * - Audio Stream File?
+ */
+AVInputFormat ff_argo_asf_demuxer = {
+    .name           = "argo_asf",
+    .long_name      = NULL_IF_CONFIG_SMALL("Argonaut Games ASF"),
+    .priv_data_size = sizeof(ArgoASFDemuxContext),
+    .read_probe     = argo_asf_probe,
+    .read_header    = argo_asf_read_header,
+    .read_packet    = argo_asf_read_packet
+};
diff --git a/libavformat/asf.h b/libavformat/asf.h
index 1a5b338..a30d3bb 100644
--- a/libavformat/asf.h
+++ b/libavformat/asf.h
@@ -166,6 +166,4 @@
 
 #define ASF_PL_FLAG_KEY_FRAME 0x80 //1000 0000
 
-extern AVInputFormat ff_asf_demuxer;
-
 #endif /* AVFORMAT_ASF_H */
diff --git a/libavformat/asfdec_f.c b/libavformat/asfdec_f.c
index 64a0b9d..f0cb353 100644
--- a/libavformat/asfdec_f.c
+++ b/libavformat/asfdec_f.c
@@ -186,7 +186,7 @@
 #define print_guid(g) while(0)
 #endif
 
-static int asf_probe(AVProbeData *pd)
+static int asf_probe(const AVProbeData *pd)
 {
     /* check file header */
     if (!ff_guidcmp(pd->buf, &ff_asf_header))
@@ -321,8 +321,7 @@
     int64_t off = avio_tell(s->pb);
 #define LEN 22
 
-    if ((unsigned)len >= (UINT_MAX - LEN) / 2)
-        return;
+    av_assert0((unsigned)len < (INT_MAX - LEN) / 2);
 
     if (!asf->export_xmp && !strncmp(key, "xmp", 3))
         goto finish;
@@ -712,6 +711,9 @@
         value_type = avio_rl16(pb); /* value_type */
         value_len  = avio_rl32(pb);
 
+        if (value_len < 0 || value_len > UINT16_MAX)
+            return AVERROR_INVALIDDATA;
+
         name_len_utf8 = 2*name_len_utf16 + 1;
         name          = av_malloc(name_len_utf8);
         if (!name)
@@ -857,11 +859,20 @@
                         return ret;
                     av_hex_dump_log(s, AV_LOG_DEBUG, pkt.data, pkt.size);
                     av_packet_unref(&pkt);
+
                     len= avio_rl32(pb);
+                    if (len > UINT16_MAX)
+                        return AVERROR_INVALIDDATA;
                     get_tag(s, "ASF_Protection_Type", -1, len, 32);
+
                     len= avio_rl32(pb);
+                    if (len > UINT16_MAX)
+                        return AVERROR_INVALIDDATA;
                     get_tag(s, "ASF_Key_ID", -1, len, 32);
+
                     len= avio_rl32(pb);
+                    if (len > UINT16_MAX)
+                        return AVERROR_INVALIDDATA;
                     get_tag(s, "ASF_License_URL", -1, len, 32);
                 } else if (!ff_guidcmp(&g, &ff_asf_ext_content_encryption)) {
                     av_log(s, AV_LOG_WARNING,
diff --git a/libavformat/asfdec_o.c b/libavformat/asfdec_o.c
index b4b2698..7891b23 100644
--- a/libavformat/asfdec_o.c
+++ b/libavformat/asfdec_o.c
@@ -147,7 +147,7 @@
 static int detect_unknown_subobject(AVFormatContext *s, int64_t offset, int64_t size);
 static const GUIDParseTable *find_guid(ff_asf_guid guid);
 
-static int asf_probe(AVProbeData *pd)
+static int asf_probe(const AVProbeData *pd)
 {
     /* check file header */
     if (!ff_guidcmp(pd->buf, &ff_asf_header))
@@ -1165,7 +1165,7 @@
     } else
         avio_skip(pb, 4); // reading of media object size is already done
     asf_pkt->dts = avio_rl32(pb); // read presentation time
-    if (asf->rep_data_len && (asf->rep_data_len >= 8))
+    if (asf->rep_data_len >= 8)
         avio_skip(pb, asf->rep_data_len - 8); // skip replicated data
 
     return 0;
diff --git a/libavformat/asfenc.c b/libavformat/asfenc.c
index 3cfe75a..73afb13 100644
--- a/libavformat/asfenc.c
+++ b/libavformat/asfenc.c
@@ -22,7 +22,6 @@
 #include "libavutil/avassert.h"
 #include "libavutil/dict.h"
 #include "libavutil/mathematics.h"
-#include "libavutil/parseutils.h"
 #include "libavutil/opt.h"
 #include "avformat.h"
 #include "avlanguage.h"
@@ -358,12 +357,12 @@
         int64_t pres_time = av_rescale_q(c->start, c->time_base, scale);
         uint64_t offset;
         int32_t send_time = get_send_time(asf, pres_time, &offset);
-        int len = 0;
+        int len = 0, ret;
         uint8_t *buf;
         AVIOContext *dyn_buf;
         if (t) {
-            if (avio_open_dyn_buf(&dyn_buf) < 0)
-                return AVERROR(ENOMEM);
+            if ((ret = avio_open_dyn_buf(&dyn_buf)) < 0)
+                return ret;
             avio_put_str16le(dyn_buf, t->value);
             len = avio_close_dyn_buf(dyn_buf, &buf);
         }
@@ -580,12 +579,12 @@
 
     /* title and other info */
     if (has_title) {
-        int len;
+        int len, ret;
         uint8_t *buf;
         AVIOContext *dyn_buf;
 
-        if (avio_open_dyn_buf(&dyn_buf) < 0)
-            return AVERROR(ENOMEM);
+        if ((ret = avio_open_dyn_buf(&dyn_buf)) < 0)
+            return ret;
 
         hpos = put_header(pb, &ff_asf_comment_header);
 
@@ -715,10 +714,10 @@
         if (desc) {
             AVIOContext *dyn_buf;
             uint8_t *buf;
-            int len;
+            int len, ret;
 
-            if (avio_open_dyn_buf(&dyn_buf) < 0)
-                return AVERROR(ENOMEM);
+            if ((ret = avio_open_dyn_buf(&dyn_buf)) < 0)
+                return ret;
 
             avio_put_str16le(dyn_buf, desc);
             len = avio_close_dyn_buf(dyn_buf, &buf);
@@ -802,8 +801,6 @@
         return -1;
     }
 
-    avio_flush(s->pb);
-
     asf->packet_nb_payloads     = 0;
     asf->packet_timestamp_start = -1;
     asf->packet_timestamp_end   = -1;
@@ -895,7 +892,8 @@
 
     avio_write(s->pb, asf->packet_buf, s->packet_size - packet_hdr_size);
 
-    avio_flush(s->pb);
+    avio_write_marker(s->pb, AV_NOPTS_VALUE, AVIO_DATA_MARKER_FLUSH_POINT);
+
     asf->nb_packets++;
     asf->packet_nb_payloads     = 0;
     asf->packet_timestamp_start = -1;
@@ -1133,7 +1131,6 @@
             return ret;
         asf_write_index(s, asf->index_ptr, asf->maximum_packet, asf->next_start_sec);
     }
-    avio_flush(s->pb);
 
     if (asf->is_streamed || !(s->pb->seekable & AVIO_SEEKABLE_NORMAL)) {
         put_chunk(s, 0x4524, 0, 0); /* end of stream */
diff --git a/libavformat/assdec.c b/libavformat/assdec.c
index d89c14e..f66b296 100644
--- a/libavformat/assdec.c
+++ b/libavformat/assdec.c
@@ -33,7 +33,7 @@
     unsigned readorder;
 } ASSContext;
 
-static int ass_probe(AVProbeData *p)
+static int ass_probe(const AVProbeData *p)
 {
     char buf[13];
     FFTextReader tr;
diff --git a/libavformat/assenc.c b/libavformat/assenc.c
index d50f18f..68c3396 100644
--- a/libavformat/assenc.c
+++ b/libavformat/assenc.c
@@ -77,7 +77,6 @@
             avio_printf(s->pb, "[Events]\r\nFormat: %s, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text\r\n",
                         ass->ssa_mode ? "Marked" : "Layer");
     }
-    avio_flush(s->pb);
 
     return 0;
 }
@@ -95,7 +94,7 @@
                    ass->expected_readorder, dialogue->readorder);
             ass->expected_readorder = dialogue->readorder;
         }
-        avio_printf(s->pb, "Dialogue: %s\r\n", dialogue->line);
+        avio_print(s->pb, "Dialogue: ", dialogue->line, "\r\n");
         if (dialogue == ass->last_added_dialogue)
             ass->last_added_dialogue = next;
         av_freep(&dialogue->line);
diff --git a/libavformat/astdec.c b/libavformat/astdec.c
index 4ba08c2..9d2174f 100644
--- a/libavformat/astdec.c
+++ b/libavformat/astdec.c
@@ -25,7 +25,7 @@
 #include "internal.h"
 #include "ast.h"
 
-static int ast_probe(AVProbeData *p)
+static int ast_probe(const AVProbeData *p)
 {
     if (AV_RL32(p->buf) != MKTAG('S','T','R','M'))
         return 0;
diff --git a/libavformat/astenc.c b/libavformat/astenc.c
index 578e658..e0b94b8 100644
--- a/libavformat/astenc.c
+++ b/libavformat/astenc.c
@@ -101,8 +101,6 @@
     avio_wb64(pb, 0);
     avio_wb32(pb, 0);
 
-    avio_flush(pb);
-
     return 0;
 }
 
@@ -180,7 +178,6 @@
         }
 
         avio_seek(pb, file_size, SEEK_SET);
-        avio_flush(pb);
     }
     return 0;
 }
diff --git a/libavformat/async.c b/libavformat/async.c
index 54dbd23..4e295b5 100644
--- a/libavformat/async.c
+++ b/libavformat/async.c
@@ -142,7 +142,7 @@
 static int ring_drain(RingBuffer *ring, int offset)
 {
     av_assert2(offset >= -ring_size_of_read_back(ring));
-    av_assert2(offset <= -ring_size(ring));
+    av_assert2(offset <= ring_size(ring));
     ring->read_pos += offset;
     return 0;
 }
diff --git a/libavformat/au.c b/libavformat/au.c
index 520824f..4afee85 100644
--- a/libavformat/au.c
+++ b/libavformat/au.c
@@ -57,7 +57,7 @@
 
 #if CONFIG_AU_DEMUXER
 
-static int au_probe(AVProbeData *p)
+static int au_probe(const AVProbeData *p)
 {
     if (p->buf[0] == '.' && p->buf[1] == 's' &&
         p->buf[2] == 'n' && p->buf[3] == 'd')
@@ -140,7 +140,7 @@
     unsigned int tag;
     AVIOContext *pb = s->pb;
     unsigned int id, channels, rate;
-    int bps;
+    int bps, ba = 0;
     enum AVCodecID codec;
     AVStream *st;
 
@@ -178,6 +178,7 @@
         } else {
             const uint8_t bpcss[] = {4, 0, 3, 5};
             av_assert0(id >= 23 && id < 23 + 4);
+            ba = bpcss[id - 23];
             bps = bpcss[id - 23];
         }
     } else if (!bps) {
@@ -205,7 +206,7 @@
     st->codecpar->sample_rate = rate;
     st->codecpar->bits_per_coded_sample = bps;
     st->codecpar->bit_rate    = channels * rate * bps;
-    st->codecpar->block_align = FFMAX(bps * st->codecpar->channels / 8, 1);
+    st->codecpar->block_align = ba ? ba : FFMAX(bps * st->codecpar->channels / 8, 1);
     if (data_size != AU_UNKNOWN_SIZE)
         st->duration = (((int64_t)data_size)<<3) / (st->codecpar->channels * (int64_t)bps);
 
@@ -310,7 +311,6 @@
     } else {
         avio_wb64(pb, 0); /* annotation field */
     }
-    avio_flush(pb);
 
     return 0;
 }
@@ -326,7 +326,6 @@
         avio_seek(pb, 8, SEEK_SET);
         avio_wb32(pb, (uint32_t)(file_size - au->header_size));
         avio_seek(pb, file_size, SEEK_SET);
-        avio_flush(pb);
     }
 
     return 0;
diff --git a/libavformat/audiointerleave.c b/libavformat/audiointerleave.c
index dea5d99..36a3288 100644
--- a/libavformat/audiointerleave.c
+++ b/libavformat/audiointerleave.c
@@ -33,20 +33,17 @@
         AVStream *st = s->streams[i];
         AudioInterleaveContext *aic = st->priv_data;
 
-        if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO)
+        if (aic && st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO)
             av_fifo_freep(&aic->fifo);
     }
 }
 
 int ff_audio_interleave_init(AVFormatContext *s,
-                             const int *samples_per_frame,
+                             const int samples_per_frame,
                              AVRational time_base)
 {
     int i;
 
-    if (!samples_per_frame)
-        return AVERROR(EINVAL);
-
     if (!time_base.num) {
         av_log(s, AV_LOG_ERROR, "timebase not set for audio interleave\n");
         return AVERROR(EINVAL);
@@ -56,6 +53,8 @@
         AudioInterleaveContext *aic = st->priv_data;
 
         if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {
+            int max_samples = samples_per_frame ? samples_per_frame :
+                              av_rescale_rnd(st->codecpar->sample_rate, time_base.num, time_base.den, AV_ROUND_UP);
             aic->sample_size = (st->codecpar->channels *
                                 av_get_bits_per_sample(st->codecpar->codec_id)) / 8;
             if (!aic->sample_size) {
@@ -63,12 +62,11 @@
                 return AVERROR(EINVAL);
             }
             aic->samples_per_frame = samples_per_frame;
-            aic->samples = aic->samples_per_frame;
             aic->time_base = time_base;
 
-            aic->fifo_size = 100* *aic->samples;
-            if (!(aic->fifo= av_fifo_alloc_array(100, *aic->samples)))
+            if (!(aic->fifo = av_fifo_alloc_array(100, max_samples)))
                 return AVERROR(ENOMEM);
+            aic->fifo_size = 100 * max_samples;
         }
     }
 
@@ -81,7 +79,9 @@
     AVStream *st = s->streams[stream_index];
     AudioInterleaveContext *aic = st->priv_data;
     int ret;
-    int frame_size = *aic->samples * aic->sample_size;
+    int nb_samples = aic->samples_per_frame ? aic->samples_per_frame :
+                     (av_rescale_q(aic->n + 1, av_make_q(st->codecpar->sample_rate, 1), av_inv_q(aic->time_base)) - aic->nb_samples);
+    int frame_size = nb_samples * aic->sample_size;
     int size = FFMIN(av_fifo_size(aic->fifo), frame_size);
     if (!size || (!flush && size == av_fifo_size(aic->fifo)))
         return 0;
@@ -95,20 +95,18 @@
         memset(pkt->data + size, 0, pkt->size - size);
 
     pkt->dts = pkt->pts = aic->dts;
-    pkt->duration = av_rescale_q(*aic->samples, st->time_base, aic->time_base);
+    pkt->duration = av_rescale_q(nb_samples, st->time_base, aic->time_base);
     pkt->stream_index = stream_index;
     aic->dts += pkt->duration;
-
-    aic->samples++;
-    if (!*aic->samples)
-        aic->samples = aic->samples_per_frame;
+    aic->nb_samples += nb_samples;
+    aic->n++;
 
     return pkt->size;
 }
 
 int ff_audio_rechunk_interleave(AVFormatContext *s, AVPacket *out, AVPacket *pkt, int flush,
                         int (*get_packet)(AVFormatContext *, AVPacket *, AVPacket *, int),
-                        int (*compare_ts)(AVFormatContext *, AVPacket *, AVPacket *))
+                        int (*compare_ts)(AVFormatContext *, const AVPacket *, const AVPacket *))
 {
     int i, ret;
 
@@ -136,7 +134,7 @@
     for (i = 0; i < s->nb_streams; i++) {
         AVStream *st = s->streams[i];
         if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {
-            AVPacket new_pkt = { 0 };
+            AVPacket new_pkt;
             while ((ret = interleave_new_audio_packet(s, &new_pkt, i, flush)) > 0) {
                 if ((ret = ff_interleave_add_packet(s, &new_pkt, compare_ts)) < 0)
                     return ret;
diff --git a/libavformat/audiointerleave.h b/libavformat/audiointerleave.h
index 4d77832..0933310 100644
--- a/libavformat/audiointerleave.h
+++ b/libavformat/audiointerleave.h
@@ -29,14 +29,15 @@
 typedef struct AudioInterleaveContext {
     AVFifoBuffer *fifo;
     unsigned fifo_size;           ///< size of currently allocated FIFO
+    int64_t n;                    ///< number of generated packets
+    int64_t nb_samples;           ///< number of generated samples
     uint64_t dts;                 ///< current dts
     int sample_size;              ///< size of one sample all channels included
-    const int *samples_per_frame; ///< must be 0-terminated
-    const int *samples;           ///< current samples per frame, pointer to samples_per_frame
+    int samples_per_frame;        ///< samples per frame if fixed, 0 otherwise
     AVRational time_base;         ///< time base of output audio packets
 } AudioInterleaveContext;
 
-int ff_audio_interleave_init(AVFormatContext *s, const int *samples_per_frame, AVRational time_base);
+int ff_audio_interleave_init(AVFormatContext *s, const int samples_per_frame, AVRational time_base);
 void ff_audio_interleave_close(AVFormatContext *s);
 
 /**
@@ -50,6 +51,6 @@
  */
 int ff_audio_rechunk_interleave(AVFormatContext *s, AVPacket *out, AVPacket *pkt, int flush,
                         int (*get_packet)(AVFormatContext *, AVPacket *, AVPacket *, int),
-                        int (*compare_ts)(AVFormatContext *, AVPacket *, AVPacket *));
+                        int (*compare_ts)(AVFormatContext *, const AVPacket *, const AVPacket *));
 
 #endif /* AVFORMAT_AUDIOINTERLEAVE_H */
diff --git a/libavformat/av1.c b/libavformat/av1.c
index a0aad43..1e7a67d 100644
--- a/libavformat/av1.c
+++ b/libavformat/av1.c
@@ -19,6 +19,7 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
+#include "libavutil/avassert.h"
 #include "libavutil/mem.h"
 #include "libavcodec/av1.h"
 #include "libavcodec/av1_parse.h"
@@ -26,14 +27,22 @@
 #include "libavcodec/put_bits.h"
 #include "av1.h"
 #include "avio.h"
+#include "avio_internal.h"
 
-int ff_av1_filter_obus(AVIOContext *pb, const uint8_t *buf, int size)
+static int av1_filter_obus(AVIOContext *pb, const uint8_t *buf,
+                           int size, int *offset)
 {
-    const uint8_t *end = buf + size;
+    const uint8_t *start = buf, *end = buf + size;
     int64_t obu_size;
-    int start_pos, type, temporal_id, spatial_id;
+    int off, start_pos, type, temporal_id, spatial_id;
+    enum {
+        START_NOT_FOUND,
+        START_FOUND,
+        END_FOUND,
+        OFFSET_IMPOSSIBLE,
+    } state = START_NOT_FOUND;
 
-    size = 0;
+    off = size = 0;
     while (buf < end) {
         int len = parse_obu_header(buf, end - buf, &obu_size, &start_pos,
                                    &type, &temporal_id, &spatial_id);
@@ -45,48 +54,71 @@
         case AV1_OBU_REDUNDANT_FRAME_HEADER:
         case AV1_OBU_TILE_LIST:
         case AV1_OBU_PADDING:
+            if (state == START_FOUND)
+                state = END_FOUND;
             break;
         default:
-            avio_write(pb, buf, len);
+            if (state == START_NOT_FOUND) {
+                off   = buf - start;
+                state = START_FOUND;
+            } else if (state == END_FOUND) {
+                state = OFFSET_IMPOSSIBLE;
+            }
+            if (pb)
+                avio_write(pb, buf, len);
             size += len;
             break;
         }
         buf += len;
     }
 
+    if (offset)
+        *offset = state != OFFSET_IMPOSSIBLE ? off : -1;
+
     return size;
 }
 
-int ff_av1_filter_obus_buf(const uint8_t *buf, uint8_t **out, int *size)
+int ff_av1_filter_obus(AVIOContext *pb, const uint8_t *buf, int size)
 {
-    AVIOContext *pb;
-    int ret;
-
-    ret = avio_open_dyn_buf(&pb);
-    if (ret < 0)
-        return ret;
-
-    ret = ff_av1_filter_obus(pb, buf, *size);
-    if (ret < 0)
-        return ret;
-
-    av_freep(out);
-    *size = avio_close_dyn_buf(pb, out);
-
-    return ret;
+    return av1_filter_obus(pb, buf, size, NULL);
 }
 
-typedef struct AV1SequenceParameters {
-    uint8_t seq_profile;
-    uint8_t seq_level_idx_0;
-    uint8_t seq_tier_0;
-    uint8_t high_bitdepth;
-    uint8_t twelve_bit;
-    uint8_t monochrome;
-    uint8_t chroma_subsampling_x;
-    uint8_t chroma_subsampling_y;
-    uint8_t chroma_sample_position;
-} AV1SequenceParameters;
+int ff_av1_filter_obus_buf(const uint8_t *in, uint8_t **out,
+                           int *size, int *offset)
+{
+    AVIOContext pb;
+    uint8_t *buf;
+    int len, off, ret;
+
+    len = ret = av1_filter_obus(NULL, in, *size, &off);
+    if (ret < 0) {
+        return ret;
+    }
+    if (off >= 0) {
+        *out    = (uint8_t *)in;
+        *size   = len;
+        *offset = off;
+
+        return 0;
+    }
+
+    buf = av_malloc(len + AV_INPUT_BUFFER_PADDING_SIZE);
+    if (!buf)
+        return AVERROR(ENOMEM);
+
+    ffio_init_context(&pb, buf, len, 1, NULL, NULL, NULL, NULL);
+
+    ret = av1_filter_obus(&pb, in, *size, NULL);
+    av_assert1(ret == len);
+
+    memset(buf + len, 0, AV_INPUT_BUFFER_PADDING_SIZE);
+
+    *out  = buf;
+    *size = len;
+    *offset = 0;
+
+    return 0;
+}
 
 static inline void uvlc(GetBitContext *gb)
 {
@@ -106,49 +138,51 @@
 
 static int parse_color_config(AV1SequenceParameters *seq_params, GetBitContext *gb)
 {
-    int color_primaries, transfer_characteristics, matrix_coefficients;
+    int twelve_bit = 0;
+    int high_bitdepth = get_bits1(gb);
+    if (seq_params->profile == FF_PROFILE_AV1_PROFESSIONAL && high_bitdepth)
+        twelve_bit = get_bits1(gb);
 
-    seq_params->high_bitdepth = get_bits1(gb);
-    if (seq_params->seq_profile == FF_PROFILE_AV1_PROFESSIONAL && seq_params->high_bitdepth)
-        seq_params->twelve_bit = get_bits1(gb);
+    seq_params->bitdepth = 8 + (high_bitdepth * 2) + (twelve_bit * 2);
 
-    if (seq_params->seq_profile == FF_PROFILE_AV1_HIGH)
+    if (seq_params->profile == FF_PROFILE_AV1_HIGH)
         seq_params->monochrome = 0;
     else
         seq_params->monochrome = get_bits1(gb);
 
-    if (get_bits1(gb)) { // color_description_present_flag
-        color_primaries          = get_bits(gb, 8);
-        transfer_characteristics = get_bits(gb, 8);
-        matrix_coefficients      = get_bits(gb, 8);
+    seq_params->color_description_present_flag = get_bits1(gb);
+    if (seq_params->color_description_present_flag) {
+        seq_params->color_primaries          = get_bits(gb, 8);
+        seq_params->transfer_characteristics = get_bits(gb, 8);
+        seq_params->matrix_coefficients      = get_bits(gb, 8);
     } else {
-        color_primaries          = AVCOL_PRI_UNSPECIFIED;
-        transfer_characteristics = AVCOL_TRC_UNSPECIFIED;
-        matrix_coefficients      = AVCOL_SPC_UNSPECIFIED;
+        seq_params->color_primaries          = AVCOL_PRI_UNSPECIFIED;
+        seq_params->transfer_characteristics = AVCOL_TRC_UNSPECIFIED;
+        seq_params->matrix_coefficients      = AVCOL_SPC_UNSPECIFIED;
     }
 
     if (seq_params->monochrome) {
-        skip_bits1(gb); // color_range
+        seq_params->color_range = get_bits1(gb);
         seq_params->chroma_subsampling_x = 1;
         seq_params->chroma_subsampling_y = 1;
         seq_params->chroma_sample_position = 0;
         return 0;
-    } else if (color_primaries          == AVCOL_PRI_BT709 &&
-               transfer_characteristics == AVCOL_TRC_IEC61966_2_1 &&
-               matrix_coefficients      == AVCOL_SPC_RGB) {
+    } else if (seq_params->color_primaries          == AVCOL_PRI_BT709 &&
+               seq_params->transfer_characteristics == AVCOL_TRC_IEC61966_2_1 &&
+               seq_params->matrix_coefficients      == AVCOL_SPC_RGB) {
         seq_params->chroma_subsampling_x = 0;
         seq_params->chroma_subsampling_y = 0;
     } else {
-        skip_bits1(gb); // color_range
+        seq_params->color_range = get_bits1(gb);
 
-        if (seq_params->seq_profile == FF_PROFILE_AV1_MAIN) {
+        if (seq_params->profile == FF_PROFILE_AV1_MAIN) {
             seq_params->chroma_subsampling_x = 1;
             seq_params->chroma_subsampling_y = 1;
-        } else if (seq_params->seq_profile == FF_PROFILE_AV1_HIGH) {
+        } else if (seq_params->profile == FF_PROFILE_AV1_HIGH) {
             seq_params->chroma_subsampling_x = 0;
             seq_params->chroma_subsampling_y = 0;
         } else {
-            if (seq_params->twelve_bit) {
+            if (twelve_bit) {
                 seq_params->chroma_subsampling_x = get_bits1(gb);
                 if (seq_params->chroma_subsampling_x)
                     seq_params->chroma_subsampling_y = get_bits1(gb);
@@ -185,14 +219,14 @@
 
     memset(seq_params, 0, sizeof(*seq_params));
 
-    seq_params->seq_profile = get_bits(&gb, 3);
+    seq_params->profile = get_bits(&gb, 3);
 
     skip_bits1(&gb); // still_picture
     reduced_still_picture_header = get_bits1(&gb);
 
     if (reduced_still_picture_header) {
-        seq_params->seq_level_idx_0 = get_bits(&gb, 5);
-        seq_params->seq_tier_0 = 0;
+        seq_params->level = get_bits(&gb, 5);
+        seq_params->tier = 0;
     } else {
         int initial_display_delay_present_flag, operating_points_cnt_minus_1;
         int decoder_model_info_present_flag, buffer_delay_length_minus_1;
@@ -242,8 +276,8 @@
             }
 
             if (i == 0) {
-               seq_params->seq_level_idx_0 = seq_level_idx;
-               seq_params->seq_tier_0 = seq_tier;
+               seq_params->level = seq_level_idx;
+               seq_params->tier = seq_tier;
             }
         }
     }
@@ -264,7 +298,7 @@
     if (!reduced_still_picture_header) {
         int enable_order_hint, seq_force_screen_content_tools;
 
-        skip_bits(&gb, 4); // enable_intraintra_compound (1), enable_masked_compound (1)
+        skip_bits(&gb, 4); // enable_interintra_compound (1), enable_masked_compound (1)
                            // enable_warped_motion (1), enable_dual_filter (1)
 
         enable_order_hint = get_bits1(&gb);
@@ -297,13 +331,43 @@
     return 0;
 }
 
+int ff_av1_parse_seq_header(AV1SequenceParameters *seq, const uint8_t *buf, int size)
+{
+    int64_t obu_size;
+    int start_pos, type, temporal_id, spatial_id;
+
+    if (size <= 0)
+        return AVERROR_INVALIDDATA;
+
+    while (size > 0) {
+        int len = parse_obu_header(buf, size, &obu_size, &start_pos,
+                                   &type, &temporal_id, &spatial_id);
+        if (len < 0)
+            return len;
+
+        switch (type) {
+        case AV1_OBU_SEQUENCE_HEADER:
+            if (!obu_size)
+                return AVERROR_INVALIDDATA;
+
+            return parse_sequence_header(seq, buf + start_pos, obu_size);
+        default:
+            break;
+        }
+        size -= len;
+        buf  += len;
+    }
+
+    return AVERROR_INVALIDDATA;
+}
+
 int ff_isom_write_av1c(AVIOContext *pb, const uint8_t *buf, int size)
 {
     AVIOContext *seq_pb = NULL, *meta_pb = NULL;
     AV1SequenceParameters seq_params;
     PutBitContext pbc;
     uint8_t header[4];
-    uint8_t *seq = NULL, *meta = NULL;
+    uint8_t *seq, *meta;
     int64_t obu_size;
     int start_pos, type, temporal_id, spatial_id;
     int ret, nb_seq = 0, seq_size, meta_size;
@@ -353,7 +417,7 @@
         buf  += len;
     }
 
-    seq_size  = avio_close_dyn_buf(seq_pb, &seq);
+    seq_size  = avio_get_dyn_buf(seq_pb, &seq);
     if (!seq_size) {
         ret = AVERROR_INVALIDDATA;
         goto fail;
@@ -363,31 +427,28 @@
 
     put_bits(&pbc, 1, 1); // marker
     put_bits(&pbc, 7, 1); // version
-    put_bits(&pbc, 3, seq_params.seq_profile);
-    put_bits(&pbc, 5, seq_params.seq_level_idx_0);
-    put_bits(&pbc, 1, seq_params.seq_tier_0);
-    put_bits(&pbc, 1, seq_params.high_bitdepth);
-    put_bits(&pbc, 1, seq_params.twelve_bit);
+    put_bits(&pbc, 3, seq_params.profile);
+    put_bits(&pbc, 5, seq_params.level);
+    put_bits(&pbc, 1, seq_params.tier);
+    put_bits(&pbc, 1, seq_params.bitdepth > 8);
+    put_bits(&pbc, 1, seq_params.bitdepth == 12);
     put_bits(&pbc, 1, seq_params.monochrome);
     put_bits(&pbc, 1, seq_params.chroma_subsampling_x);
     put_bits(&pbc, 1, seq_params.chroma_subsampling_y);
     put_bits(&pbc, 2, seq_params.chroma_sample_position);
+    put_bits(&pbc, 8, 0); // padding
     flush_put_bits(&pbc);
 
     avio_write(pb, header, sizeof(header));
     avio_write(pb, seq, seq_size);
 
-    meta_size = avio_close_dyn_buf(meta_pb, &meta);
+    meta_size = avio_get_dyn_buf(meta_pb, &meta);
     if (meta_size)
         avio_write(pb, meta, meta_size);
 
 fail:
-    if (!seq)
-        avio_close_dyn_buf(seq_pb, &seq);
-    if (!meta)
-        avio_close_dyn_buf(meta_pb, &meta);
-    av_free(seq);
-    av_free(meta);
+    ffio_free_dyn_buf(&seq_pb);
+    ffio_free_dyn_buf(&meta_pb);
 
     return ret;
 }
diff --git a/libavformat/av1.h b/libavformat/av1.h
index 9f2a71f..dd5b47d 100644
--- a/libavformat/av1.h
+++ b/libavformat/av1.h
@@ -25,6 +25,22 @@
 
 #include "avio.h"
 
+typedef struct AV1SequenceParameters {
+    uint8_t profile;
+    uint8_t level;
+    uint8_t tier;
+    uint8_t bitdepth;
+    uint8_t monochrome;
+    uint8_t chroma_subsampling_x;
+    uint8_t chroma_subsampling_y;
+    uint8_t chroma_sample_position;
+    uint8_t color_description_present_flag;
+    uint8_t color_primaries;
+    uint8_t transfer_characteristics;
+    uint8_t matrix_coefficients;
+    uint8_t color_range;
+} AV1SequenceParameters;
+
 /**
  * Filter out AV1 OBUs not meant to be present in ISOBMFF sample data and write
  * the resulting bitstream to the provided AVIOContext.
@@ -40,26 +56,42 @@
 int ff_av1_filter_obus(AVIOContext *pb, const uint8_t *buf, int size);
 
 /**
- * Filter out AV1 OBUs not meant to be present in ISOBMFF sample data and write
- * the resulting bitstream to a newly allocated data buffer.
+ * Filter out AV1 OBUs not meant to be present in ISOBMFF sample data and return
+ * the result in a data buffer, avoiding allocations and copies if possible.
  *
- * @param pb pointer to the AVIOContext where the filtered bitstream shall be
- *           written
- * @param buf input data buffer
- * @param out pointer to pointer that will hold the allocated data buffer
+ * @param in input data buffer
+ * @param out pointer to pointer for the returned buffer. In case of success,
+ *            it is independently allocated if and only if `*out` differs from in.
  * @param size size of the input data buffer. The size of the resulting output
-               data buffer will be written here
+ *             data buffer will be written here
+ * @param offset offset of the returned data inside `*out`: It runs from
+ *               `*out + offset` (inclusive) to `*out + offset + size`
+ *               (exclusive); is zero if `*out` is independently allocated.
  *
- * @return the amount of bytes written in case of success, a negative AVERROR
- *         code in case of failure. On failure, out and size are unchanged
+ * @return 0 in case of success, a negative AVERROR code in case of failure.
+ *         On failure, *out and *size are unchanged
+ * @note *out will be treated as unintialized on input and will not be freed.
  */
-int ff_av1_filter_obus_buf(const uint8_t *buf, uint8_t **out, int *size);
+int ff_av1_filter_obus_buf(const uint8_t *in, uint8_t **out,
+                           int *size, int *offset);
+
+/**
+ * Parses a Sequence Header from the the provided buffer.
+ *
+ * @param seq pointer to the AV1SequenceParameters where the parsed values will
+ *            be written
+ * @param buf input data buffer
+ * @param size size in bytes of the input data buffer
+ *
+ * @return >= 0 in case of success, a negative AVERROR code in case of failure
+ */
+int ff_av1_parse_seq_header(AV1SequenceParameters *seq, const uint8_t *buf, int size);
 
 /**
  * Writes AV1 extradata (Sequence Header and Metadata OBUs) to the provided
  * AVIOContext.
  *
- * @param pb pointer to the AVIOContext where the hvcC shall be written
+ * @param pb pointer to the AVIOContext where the av1C box shall be written
  * @param buf input data buffer
  * @param size size in bytes of the input data buffer
  *
diff --git a/libavformat/av1dec.c b/libavformat/av1dec.c
new file mode 100644
index 0000000..1be2fac
--- /dev/null
+++ b/libavformat/av1dec.c
@@ -0,0 +1,279 @@
+/*
+ * AV1 Annex B demuxer
+ * Copyright (c) 2019 James Almer <jamrial@gmail.com>
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "config.h"
+
+#include "libavutil/common.h"
+#include "libavutil/opt.h"
+#include "libavcodec/av1_parse.h"
+#include "avformat.h"
+#include "avio_internal.h"
+#include "internal.h"
+
+typedef struct AnnexBContext {
+    const AVClass *class;
+    AVBSFContext *bsf;
+    uint32_t temporal_unit_size;
+    uint32_t frame_unit_size;
+    AVRational framerate;
+} AnnexBContext;
+
+static int leb(AVIOContext *pb, uint32_t *len) {
+    int more, i = 0;
+    uint8_t byte;
+    *len = 0;
+    do {
+        unsigned bits;
+        byte = avio_r8(pb);
+        more = byte & 0x80;
+        bits = byte & 0x7f;
+        if (i <= 3 || (i == 4 && bits < (1 << 4)))
+            *len |= bits << (i * 7);
+        else if (bits)
+            return AVERROR_INVALIDDATA;
+        if (++i == 8 && more)
+            return AVERROR_INVALIDDATA;
+        if (pb->eof_reached || pb->error)
+            return pb->error ? pb->error : AVERROR(EIO);
+    } while (more);
+    return i;
+}
+
+static int read_obu(const uint8_t *buf, int size, int64_t *obu_size, int *type)
+{
+    int start_pos, temporal_id, spatial_id;
+    int len;
+
+    len = parse_obu_header(buf, size, obu_size, &start_pos,
+                           type, &temporal_id, &spatial_id);
+    if (len < 0)
+        return len;
+
+    return 0;
+}
+
+static int annexb_probe(const AVProbeData *p)
+{
+    AVIOContext pb;
+    int64_t obu_size;
+    uint32_t temporal_unit_size, frame_unit_size, obu_unit_size;
+    int seq = 0;
+    int ret, type, cnt = 0;
+
+    ffio_init_context(&pb, p->buf, p->buf_size, 0,
+                      NULL, NULL, NULL, NULL);
+
+    ret = leb(&pb, &temporal_unit_size);
+    if (ret < 0)
+        return 0;
+    cnt += ret;
+    ret = leb(&pb, &frame_unit_size);
+    if (ret < 0 || ((int64_t)frame_unit_size + ret) > temporal_unit_size)
+        return 0;
+    cnt += ret;
+    temporal_unit_size -= ret;
+    ret = leb(&pb, &obu_unit_size);
+    if (ret < 0 || ((int64_t)obu_unit_size + ret) >= frame_unit_size)
+        return 0;
+    cnt += ret;
+
+    temporal_unit_size -= obu_unit_size + ret;
+    frame_unit_size -= obu_unit_size + ret;
+
+    avio_skip(&pb, obu_unit_size);
+    if (pb.eof_reached || pb.error)
+        return 0;
+
+    // Check that the first OBU is a Temporal Delimiter.
+    ret = read_obu(p->buf + cnt, FFMIN(p->buf_size - cnt, obu_unit_size), &obu_size, &type);
+    if (ret < 0 || type != AV1_OBU_TEMPORAL_DELIMITER || obu_size > 0)
+        return 0;
+    cnt += obu_unit_size;
+
+    do {
+        ret = leb(&pb, &obu_unit_size);
+        if (ret < 0 || ((int64_t)obu_unit_size + ret) > frame_unit_size)
+            return 0;
+        cnt += ret;
+
+        avio_skip(&pb, obu_unit_size);
+        if (pb.eof_reached || pb.error)
+            return 0;
+
+        ret = read_obu(p->buf + cnt, FFMIN(p->buf_size - cnt, obu_unit_size), &obu_size, &type);
+        if (ret < 0)
+            return 0;
+        cnt += obu_unit_size;
+
+        switch (type) {
+        case AV1_OBU_SEQUENCE_HEADER:
+            seq = 1;
+            break;
+        case AV1_OBU_FRAME:
+        case AV1_OBU_FRAME_HEADER:
+            return seq ? AVPROBE_SCORE_EXTENSION + 1 : 0;
+        case AV1_OBU_TILE_GROUP:
+        case AV1_OBU_TEMPORAL_DELIMITER:
+            return 0;
+        default:
+            break;
+        }
+
+        temporal_unit_size -= obu_unit_size + ret;
+        frame_unit_size -= obu_unit_size + ret;
+    } while (frame_unit_size);
+
+    return 0;
+}
+
+static int annexb_read_header(AVFormatContext *s)
+{
+    AnnexBContext *c = s->priv_data;
+    const AVBitStreamFilter *filter = av_bsf_get_by_name("av1_frame_merge");
+    AVStream *st;
+    int ret;
+
+    if (!filter) {
+        av_log(c, AV_LOG_ERROR, "av1_frame_merge bitstream filter "
+               "not found. This is a bug, please report it.\n");
+        return AVERROR_BUG;
+    }
+
+    st = avformat_new_stream(s, NULL);
+    if (!st)
+        return AVERROR(ENOMEM);
+
+    st->codecpar->codec_type = AVMEDIA_TYPE_VIDEO;
+    st->codecpar->codec_id = AV_CODEC_ID_AV1;
+    st->need_parsing = AVSTREAM_PARSE_HEADERS;
+
+    st->internal->avctx->framerate = c->framerate;
+    // taken from rawvideo demuxers
+    avpriv_set_pts_info(st, 64, 1, 1200000);
+
+    ret = av_bsf_alloc(filter, &c->bsf);
+    if (ret < 0)
+        return ret;
+
+    ret = avcodec_parameters_copy(c->bsf->par_in, st->codecpar);
+    if (ret < 0) {
+        av_bsf_free(&c->bsf);
+        return ret;
+    }
+
+    ret = av_bsf_init(c->bsf);
+    if (ret < 0)
+        av_bsf_free(&c->bsf);
+
+    return ret;
+}
+
+static int annexb_read_packet(AVFormatContext *s, AVPacket *pkt)
+{
+    AnnexBContext *c = s->priv_data;
+    uint32_t obu_unit_size;
+    int ret, len;
+
+retry:
+    if (avio_feof(s->pb)) {
+        if (c->temporal_unit_size || c->frame_unit_size)
+            return AVERROR(EIO);
+        goto end;
+    }
+
+    if (!c->temporal_unit_size) {
+        len = leb(s->pb, &c->temporal_unit_size);
+        if (len < 0) return AVERROR_INVALIDDATA;
+    }
+
+    if (!c->frame_unit_size) {
+        len = leb(s->pb, &c->frame_unit_size);
+        if (len < 0 || ((int64_t)c->frame_unit_size + len) > c->temporal_unit_size)
+            return AVERROR_INVALIDDATA;
+        c->temporal_unit_size -= len;
+    }
+
+    len = leb(s->pb, &obu_unit_size);
+    if (len < 0 || ((int64_t)obu_unit_size + len) > c->frame_unit_size)
+        return AVERROR_INVALIDDATA;
+
+    ret = av_get_packet(s->pb, pkt, obu_unit_size);
+    if (ret < 0)
+        return ret;
+    if (ret != obu_unit_size)
+        return AVERROR(EIO);
+
+    c->temporal_unit_size -= obu_unit_size + len;
+    c->frame_unit_size -= obu_unit_size + len;
+
+end:
+    ret = av_bsf_send_packet(c->bsf, pkt);
+    if (ret < 0) {
+        av_log(s, AV_LOG_ERROR, "Failed to send packet to "
+                                "av1_frame_merge filter\n");
+        return ret;
+    }
+
+    ret = av_bsf_receive_packet(c->bsf, pkt);
+    if (ret < 0 && ret != AVERROR(EAGAIN) && ret != AVERROR_EOF)
+        av_log(s, AV_LOG_ERROR, "av1_frame_merge filter failed to "
+                                "send output packet\n");
+
+    if (ret == AVERROR(EAGAIN))
+        goto retry;
+
+    return ret;
+}
+
+static int annexb_read_close(AVFormatContext *s)
+{
+    AnnexBContext *c = s->priv_data;
+
+    av_bsf_free(&c->bsf);
+    return 0;
+}
+
+#define OFFSET(x) offsetof(AnnexBContext, x)
+#define DEC AV_OPT_FLAG_DECODING_PARAM
+static const AVOption annexb_options[] = {
+    { "framerate", "", OFFSET(framerate), AV_OPT_TYPE_VIDEO_RATE, {.str = "25"}, 0, INT_MAX, DEC},
+    { NULL },
+};
+
+static const AVClass annexb_demuxer_class = {
+    .class_name = "AV1 Annex B demuxer",
+    .item_name  = av_default_item_name,
+    .option     = annexb_options,
+    .version    = LIBAVUTIL_VERSION_INT,
+};
+
+AVInputFormat ff_av1_demuxer = {
+    .name           = "av1",
+    .long_name      = NULL_IF_CONFIG_SMALL("AV1 Annex B"),
+    .priv_data_size = sizeof(AnnexBContext),
+    .read_probe     = annexb_probe,
+    .read_header    = annexb_read_header,
+    .read_packet    = annexb_read_packet,
+    .read_close     = annexb_read_close,
+    .extensions     = "obu",
+    .flags          = AVFMT_GENERIC_INDEX,
+    .priv_class     = &annexb_demuxer_class,
+};
diff --git a/libavformat/avc.c b/libavformat/avc.c
index ec50033..cd15ac3 100644
--- a/libavformat/avc.c
+++ b/libavformat/avc.c
@@ -21,9 +21,11 @@
 
 #include "libavutil/intreadwrite.h"
 #include "libavcodec/h264.h"
+#include "libavcodec/get_bits.h"
 #include "avformat.h"
 #include "avio.h"
 #include "avc.h"
+#include "avio_internal.h"
 
 static const uint8_t *ff_avc_find_startcode_internal(const uint8_t *p, const uint8_t *end)
 {
@@ -99,18 +101,17 @@
 
     ff_avc_parse_nal_units(pb, buf_in, *size);
 
-    av_freep(buf);
     *size = avio_close_dyn_buf(pb, buf);
     return 0;
 }
 
 int ff_isom_write_avcc(AVIOContext *pb, const uint8_t *data, int len)
 {
-    AVIOContext *sps_pb = NULL, *pps_pb = NULL;
-    uint8_t *buf = NULL, *end, *start = NULL;
-    uint8_t *sps = NULL, *pps = NULL;
-    uint32_t sps_size = 0, pps_size = 0;
-    int ret, nb_sps = 0, nb_pps = 0;
+    AVIOContext *sps_pb = NULL, *pps_pb = NULL, *sps_ext_pb = NULL;
+    uint8_t *buf, *end, *start;
+    uint8_t *sps, *pps, *sps_ext;
+    uint32_t sps_size = 0, pps_size = 0, sps_ext_size = 0;
+    int ret, nb_sps = 0, nb_pps = 0, nb_sps_ext = 0;
 
     if (len <= 6)
         return AVERROR_INVALIDDATA;
@@ -134,6 +135,9 @@
     ret = avio_open_dyn_buf(&pps_pb);
     if (ret < 0)
         goto fail;
+    ret = avio_open_dyn_buf(&sps_ext_pb);
+    if (ret < 0)
+        goto fail;
 
     /* look for sps and pps */
     while (end - buf > 4) {
@@ -159,12 +163,21 @@
             }
             avio_wb16(pps_pb, size);
             avio_write(pps_pb, buf, size);
+        } else if (nal_type == 13) { /* SPS_EXT */
+            nb_sps_ext++;
+            if (size > UINT16_MAX || nb_sps_ext >= 256) {
+                ret = AVERROR_INVALIDDATA;
+                goto fail;
+            }
+            avio_wb16(sps_ext_pb, size);
+            avio_write(sps_ext_pb, buf, size);
         }
 
         buf += size;
     }
-    sps_size = avio_close_dyn_buf(sps_pb, &sps);
-    pps_size = avio_close_dyn_buf(pps_pb, &pps);
+    sps_size = avio_get_dyn_buf(sps_pb, &sps);
+    pps_size = avio_get_dyn_buf(pps_pb, &pps);
+    sps_ext_size = avio_get_dyn_buf(sps_ext_pb, &sps_ext);
 
     if (sps_size < 6 || !pps_size) {
         ret = AVERROR_INVALIDDATA;
@@ -182,13 +195,25 @@
     avio_w8(pb, nb_pps); /* number of pps */
     avio_write(pb, pps, pps_size);
 
+    if (sps[3] != 66 && sps[3] != 77 && sps[3] != 88) {
+        H264SequenceParameterSet *seq = ff_avc_decode_sps(sps + 3, sps_size - 3);
+        if (!seq) {
+            ret = AVERROR(ENOMEM);
+            goto fail;
+        }
+        avio_w8(pb, 0xfc | seq->chroma_format_idc); /* 6 bits reserved (111111) + chroma_format_idc */
+        avio_w8(pb, 0xf8 | (seq->bit_depth_luma - 8)); /* 5 bits reserved (11111) + bit_depth_luma_minus8 */
+        avio_w8(pb, 0xf8 | (seq->bit_depth_chroma - 8)); /* 5 bits reserved (11111) + bit_depth_chroma_minus8 */
+        avio_w8(pb, nb_sps_ext); /* number of sps ext */
+        if (nb_sps_ext)
+            avio_write(pb, sps_ext, sps_ext_size);
+        av_free(seq);
+    }
+
 fail:
-    if (!sps)
-        avio_close_dyn_buf(sps_pb, &sps);
-    if (!pps)
-        avio_close_dyn_buf(pps_pb, &pps);
-    av_free(sps);
-    av_free(pps);
+    ffio_free_dyn_buf(&sps_pb);
+    ffio_free_dyn_buf(&pps_pb);
+    ffio_free_dyn_buf(&sps_ext_pb);
     av_free(start);
 
     return ret;
@@ -241,3 +266,189 @@
 
     return start + res;
 }
+
+uint8_t *ff_nal_unit_extract_rbsp(const uint8_t *src, uint32_t src_len,
+                                  uint32_t *dst_len, int header_len)
+{
+    uint8_t *dst;
+    uint32_t i, len;
+
+    dst = av_malloc(src_len + AV_INPUT_BUFFER_PADDING_SIZE);
+    if (!dst)
+        return NULL;
+
+    /* NAL unit header */
+    i = len = 0;
+    while (i < header_len && i < src_len)
+        dst[len++] = src[i++];
+
+    while (i + 2 < src_len)
+        if (!src[i] && !src[i + 1] && src[i + 2] == 3) {
+            dst[len++] = src[i++];
+            dst[len++] = src[i++];
+            i++; // remove emulation_prevention_three_byte
+        } else
+            dst[len++] = src[i++];
+
+    while (i < src_len)
+        dst[len++] = src[i++];
+
+    memset(dst + len, 0, AV_INPUT_BUFFER_PADDING_SIZE);
+
+    *dst_len = len;
+    return dst;
+}
+
+static const AVRational avc_sample_aspect_ratio[17] = {
+    {   0,  1 },
+    {   1,  1 },
+    {  12, 11 },
+    {  10, 11 },
+    {  16, 11 },
+    {  40, 33 },
+    {  24, 11 },
+    {  20, 11 },
+    {  32, 11 },
+    {  80, 33 },
+    {  18, 11 },
+    {  15, 11 },
+    {  64, 33 },
+    { 160, 99 },
+    {   4,  3 },
+    {   3,  2 },
+    {   2,  1 },
+};
+
+static inline int get_ue_golomb(GetBitContext *gb) {
+    int i;
+    for (i = 0; i < 32 && !get_bits1(gb); i++)
+        ;
+    return get_bitsz(gb, i) + (1 << i) - 1;
+}
+
+static inline int get_se_golomb(GetBitContext *gb) {
+    int v = get_ue_golomb(gb) + 1;
+    int sign = -(v & 1);
+    return ((v >> 1) ^ sign) - sign;
+}
+
+H264SequenceParameterSet *ff_avc_decode_sps(const uint8_t *buf, int buf_size)
+{
+    int i, j, ret, rbsp_size, aspect_ratio_idc, pic_order_cnt_type;
+    int num_ref_frames_in_pic_order_cnt_cycle;
+    int delta_scale, lastScale = 8, nextScale = 8;
+    int sizeOfScalingList;
+    H264SequenceParameterSet *sps = NULL;
+    GetBitContext gb;
+    uint8_t *rbsp_buf;
+
+    rbsp_buf = ff_nal_unit_extract_rbsp(buf, buf_size, &rbsp_size, 0);
+    if (!rbsp_buf)
+        return NULL;
+
+    ret = init_get_bits8(&gb, rbsp_buf, rbsp_size);
+    if (ret < 0)
+        goto end;
+
+    sps = av_mallocz(sizeof(*sps));
+    if (!sps)
+        goto end;
+
+    sps->profile_idc = get_bits(&gb, 8);
+    sps->constraint_set_flags |= get_bits1(&gb) << 0; // constraint_set0_flag
+    sps->constraint_set_flags |= get_bits1(&gb) << 1; // constraint_set1_flag
+    sps->constraint_set_flags |= get_bits1(&gb) << 2; // constraint_set2_flag
+    sps->constraint_set_flags |= get_bits1(&gb) << 3; // constraint_set3_flag
+    sps->constraint_set_flags |= get_bits1(&gb) << 4; // constraint_set4_flag
+    sps->constraint_set_flags |= get_bits1(&gb) << 5; // constraint_set5_flag
+    skip_bits(&gb, 2); // reserved_zero_2bits
+    sps->level_idc = get_bits(&gb, 8);
+    sps->id = get_ue_golomb(&gb);
+
+    if (sps->profile_idc == 100 || sps->profile_idc == 110 ||
+        sps->profile_idc == 122 || sps->profile_idc == 244 || sps->profile_idc ==  44 ||
+        sps->profile_idc ==  83 || sps->profile_idc ==  86 || sps->profile_idc == 118 ||
+        sps->profile_idc == 128 || sps->profile_idc == 138 || sps->profile_idc == 139 ||
+        sps->profile_idc == 134) {
+        sps->chroma_format_idc = get_ue_golomb(&gb); // chroma_format_idc
+        if (sps->chroma_format_idc == 3) {
+            skip_bits1(&gb); // separate_colour_plane_flag
+        }
+        sps->bit_depth_luma = get_ue_golomb(&gb) + 8;
+        sps->bit_depth_chroma = get_ue_golomb(&gb) + 8;
+        skip_bits1(&gb); // qpprime_y_zero_transform_bypass_flag
+        if (get_bits1(&gb)) { // seq_scaling_matrix_present_flag
+            for (i = 0; i < ((sps->chroma_format_idc != 3) ? 8 : 12); i++) {
+                if (!get_bits1(&gb)) // seq_scaling_list_present_flag
+                    continue;
+                lastScale = 8;
+                nextScale = 8;
+                sizeOfScalingList = i < 6 ? 16 : 64;
+                for (j = 0; j < sizeOfScalingList; j++) {
+                    if (nextScale != 0) {
+                        delta_scale = get_se_golomb(&gb);
+                        nextScale = (lastScale + delta_scale) & 0xff;
+                    }
+                    lastScale = nextScale == 0 ? lastScale : nextScale;
+                }
+            }
+        }
+    } else {
+        sps->chroma_format_idc = 1;
+        sps->bit_depth_luma = 8;
+        sps->bit_depth_chroma = 8;
+    }
+
+    get_ue_golomb(&gb); // log2_max_frame_num_minus4
+    pic_order_cnt_type = get_ue_golomb(&gb);
+
+    if (pic_order_cnt_type == 0) {
+        get_ue_golomb(&gb); // log2_max_pic_order_cnt_lsb_minus4
+    } else if (pic_order_cnt_type == 1) {
+        skip_bits1(&gb);    // delta_pic_order_always_zero
+        get_se_golomb(&gb); // offset_for_non_ref_pic
+        get_se_golomb(&gb); // offset_for_top_to_bottom_field
+        num_ref_frames_in_pic_order_cnt_cycle = get_ue_golomb(&gb);
+        for (i = 0; i < num_ref_frames_in_pic_order_cnt_cycle; i++)
+            get_se_golomb(&gb); // offset_for_ref_frame
+    }
+
+    get_ue_golomb(&gb); // max_num_ref_frames
+    skip_bits1(&gb); // gaps_in_frame_num_value_allowed_flag
+    get_ue_golomb(&gb); // pic_width_in_mbs_minus1
+    get_ue_golomb(&gb); // pic_height_in_map_units_minus1
+
+    sps->frame_mbs_only_flag = get_bits1(&gb);
+    if (!sps->frame_mbs_only_flag)
+        skip_bits1(&gb); // mb_adaptive_frame_field_flag
+
+    skip_bits1(&gb); // direct_8x8_inference_flag
+
+    if (get_bits1(&gb)) { // frame_cropping_flag
+        get_ue_golomb(&gb); // frame_crop_left_offset
+        get_ue_golomb(&gb); // frame_crop_right_offset
+        get_ue_golomb(&gb); // frame_crop_top_offset
+        get_ue_golomb(&gb); // frame_crop_bottom_offset
+    }
+
+    if (get_bits1(&gb)) { // vui_parameters_present_flag
+        if (get_bits1(&gb)) { // aspect_ratio_info_present_flag
+            aspect_ratio_idc = get_bits(&gb, 8);
+            if (aspect_ratio_idc == 0xff) {
+                sps->sar.num = get_bits(&gb, 16);
+                sps->sar.den = get_bits(&gb, 16);
+            } else if (aspect_ratio_idc < FF_ARRAY_ELEMS(avc_sample_aspect_ratio)) {
+                sps->sar = avc_sample_aspect_ratio[aspect_ratio_idc];
+            }
+        }
+    }
+
+    if (!sps->sar.den) {
+        sps->sar.num = 1;
+        sps->sar.den = 1;
+    }
+
+ end:
+    av_free(rbsp_buf);
+    return sps;
+}
diff --git a/libavformat/avc.h b/libavformat/avc.h
index c5e80ff..5286d19 100644
--- a/libavformat/avc.h
+++ b/libavformat/avc.h
@@ -33,5 +33,21 @@
 const uint8_t *ff_avc_mp4_find_startcode(const uint8_t *start,
                                          const uint8_t *end,
                                          int nal_length_size);
+uint8_t *ff_nal_unit_extract_rbsp(const uint8_t *src, uint32_t src_len,
+                                  uint32_t *dst_len, int header_len);
+
+typedef struct {
+    uint8_t id;
+    uint8_t profile_idc;
+    uint8_t level_idc;
+    uint8_t constraint_set_flags;
+    uint8_t chroma_format_idc;
+    uint8_t bit_depth_luma;
+    uint8_t bit_depth_chroma;
+    uint8_t frame_mbs_only_flag;
+    AVRational sar;
+} H264SequenceParameterSet;
+
+H264SequenceParameterSet *ff_avc_decode_sps(const uint8_t *src, int src_len);
 
 #endif /* AVFORMAT_AVC_H */
diff --git a/libavformat/avformat.h b/libavformat/avformat.h
index 259443e..81a0bd0 100644
--- a/libavformat/avformat.h
+++ b/libavformat/avformat.h
@@ -36,17 +36,15 @@
  * into component streams, and the reverse process of muxing - writing supplied
  * data in a specified container format. It also has an @ref lavf_io
  * "I/O module" which supports a number of protocols for accessing the data (e.g.
- * file, tcp, http and others). Before using lavf, you need to call
- * av_register_all() to register all compiled muxers, demuxers and protocols.
+ * file, tcp, http and others).
  * Unless you are absolutely sure you won't use libavformat's network
  * capabilities, you should also call avformat_network_init().
  *
  * A supported input format is described by an AVInputFormat struct, conversely
  * an output format is described by AVOutputFormat. You can iterate over all
- * registered input/output formats using the av_iformat_next() /
- * av_oformat_next() functions. The protocols layer is not part of the public
- * API, so you can only get the names of supported protocols with the
- * avio_enum_protocols() function.
+ * input/output formats using the  av_demuxer_iterate / av_muxer_iterate() functions.
+ * The protocols layer is not part of the public API, so you can only get the names
+ * of supported protocols with the avio_enum_protocols() function.
  *
  * Main lavf structure used for both muxing and demuxing is AVFormatContext,
  * which exports all information about the file being read or written. As with
@@ -172,14 +170,9 @@
  * information will be in AVStream.time_base units, i.e. it has to be
  * multiplied by the timebase to convert them to seconds.
  *
- * If AVPacket.buf is set on the returned packet, then the packet is
- * allocated dynamically and the user may keep it indefinitely.
- * Otherwise, if AVPacket.buf is NULL, the packet data is backed by a
- * static storage somewhere inside the demuxer and the packet is only valid
- * until the next av_read_frame() call or closing the file. If the caller
- * requires a longer lifetime, av_dup_packet() will make an av_malloc()ed copy
- * of it.
- * In both cases, the packet must be freed with av_packet_unref() when it is no
+ * A packet returned by av_read_frame() is always reference-counted,
+ * i.e. AVPacket.buf is set and the user may keep it indefinitely.
+ * The packet must be freed with av_packet_unref() when it is no
  * longer needed.
  *
  * @section lavf_decoding_seek Seeking
@@ -537,7 +530,16 @@
      * New public fields should be added right above.
      *****************************************************************
      */
-    struct AVOutputFormat *next;
+    /**
+     * The ff_const59 define is not part of the public API and will
+     * be removed without further warning.
+     */
+#if FF_API_AVIOFORMAT
+#define ff_const59
+#else
+#define ff_const59 const
+#endif
+    ff_const59 struct AVOutputFormat *next;
     /**
      * size of private data so that it can be allocated in the wrapper
      */
@@ -554,7 +556,8 @@
     int (*write_packet)(struct AVFormatContext *, AVPacket *pkt);
     int (*write_trailer)(struct AVFormatContext *);
     /**
-     * Currently only used to set pixel format if not YUV420P.
+     * A format-specific function for interleavement.
+     * If unset, packets will be interleaved by dts.
      */
     int (*interleave_packet)(struct AVFormatContext *, AVPacket *out,
                              AVPacket *in, int flush);
@@ -651,7 +654,7 @@
 
     /**
      * Can use flags: AVFMT_NOFILE, AVFMT_NEEDNUMBER, AVFMT_SHOW_IDS,
-     * AVFMT_GENERIC_INDEX, AVFMT_TS_DISCONT, AVFMT_NOBINSEARCH,
+     * AVFMT_NOTIMESTAMPS, AVFMT_GENERIC_INDEX, AVFMT_TS_DISCONT, AVFMT_NOBINSEARCH,
      * AVFMT_NOGENSEARCH, AVFMT_NO_BYTE_SEEK, AVFMT_SEEK_TO_PTS.
      */
     int flags;
@@ -681,7 +684,7 @@
      * New public fields should be added right above.
      *****************************************************************
      */
-    struct AVInputFormat *next;
+    ff_const59 struct AVInputFormat *next;
 
     /**
      * Raw demuxers store their codec ID here.
@@ -698,7 +701,7 @@
      * The buffer provided is guaranteed to be AVPROBE_PADDING_SIZE bytes
      * big so you do not have to check for that unless you need more.
      */
-    int (*read_probe)(AVProbeData *);
+    int (*read_probe)(const AVProbeData *);
 
     /**
      * Read the format header and initialize the AVFormatContext
@@ -713,8 +716,7 @@
      * AVFMTCTX_NOHEADER is used and only in the calling thread (not in a
      * background thread).
      * @return 0 on success, < 0 on error.
-     *         When returning an error, pkt must not have been allocated
-     *         or must be freed before returning
+     *         Upon returning an error, pkt must be unreferenced by the caller.
      */
     int (*read_packet)(struct AVFormatContext *, AVPacket *pkt);
 
@@ -1351,14 +1353,14 @@
      *
      * Demuxing only, set by avformat_open_input().
      */
-    struct AVInputFormat *iformat;
+    ff_const59 struct AVInputFormat *iformat;
 
     /**
      * The output container format.
      *
      * Muxing only, must be set by the caller before avformat_write_header().
      */
-    struct AVOutputFormat *oformat;
+    ff_const59 struct AVOutputFormat *oformat;
 
     /**
      * Format private data. This is an AVOptions-enabled struct
@@ -1949,6 +1951,13 @@
      * - decoding: set by user
      */
     int skip_estimate_duration_from_pts;
+
+    /**
+     * Maximum number of packets that can be probed
+     * - encoding: unused
+     * - decoding: set by user
+     */
+    int max_probe_packets;
 } AVFormatContext;
 
 #if FF_API_FORMAT_GET_SET
@@ -2216,7 +2225,7 @@
  * @return >= 0 in case of success, a negative AVERROR code in case of
  * failure
  */
-int avformat_alloc_output_context2(AVFormatContext **ctx, AVOutputFormat *oformat,
+int avformat_alloc_output_context2(AVFormatContext **ctx, ff_const59 AVOutputFormat *oformat,
                                    const char *format_name, const char *filename);
 
 /**
@@ -2227,7 +2236,7 @@
 /**
  * Find AVInputFormat based on the short name of the input format.
  */
-AVInputFormat *av_find_input_format(const char *short_name);
+ff_const59 AVInputFormat *av_find_input_format(const char *short_name);
 
 /**
  * Guess the file format.
@@ -2236,7 +2245,7 @@
  * @param is_opened Whether the file is already opened; determines whether
  *                  demuxers with or without AVFMT_NOFILE are probed.
  */
-AVInputFormat *av_probe_input_format(AVProbeData *pd, int is_opened);
+ff_const59 AVInputFormat *av_probe_input_format(ff_const59 AVProbeData *pd, int is_opened);
 
 /**
  * Guess the file format.
@@ -2250,7 +2259,7 @@
  *                  If the score is <= AVPROBE_SCORE_MAX / 4 it is recommended
  *                  to retry with a larger probe buffer.
  */
-AVInputFormat *av_probe_input_format2(AVProbeData *pd, int is_opened, int *score_max);
+ff_const59 AVInputFormat *av_probe_input_format2(ff_const59 AVProbeData *pd, int is_opened, int *score_max);
 
 /**
  * Guess the file format.
@@ -2259,7 +2268,7 @@
  *                  demuxers with or without AVFMT_NOFILE are probed.
  * @param score_ret The score of the best detection.
  */
-AVInputFormat *av_probe_input_format3(AVProbeData *pd, int is_opened, int *score_ret);
+ff_const59 AVInputFormat *av_probe_input_format3(ff_const59 AVProbeData *pd, int is_opened, int *score_ret);
 
 /**
  * Probe a bytestream to determine the input format. Each time a probe returns
@@ -2277,14 +2286,14 @@
  *         the maximal score is AVPROBE_SCORE_MAX
  * AVERROR code otherwise
  */
-int av_probe_input_buffer2(AVIOContext *pb, AVInputFormat **fmt,
+int av_probe_input_buffer2(AVIOContext *pb, ff_const59 AVInputFormat **fmt,
                            const char *url, void *logctx,
                            unsigned int offset, unsigned int max_probe_size);
 
 /**
  * Like av_probe_input_buffer2() but returns 0 on success
  */
-int av_probe_input_buffer(AVIOContext *pb, AVInputFormat **fmt,
+int av_probe_input_buffer(AVIOContext *pb, ff_const59 AVInputFormat **fmt,
                           const char *url, void *logctx,
                           unsigned int offset, unsigned int max_probe_size);
 
@@ -2307,7 +2316,7 @@
  *
  * @note If you want to use custom IO, preallocate the format context and set its pb field.
  */
-int avformat_open_input(AVFormatContext **ps, const char *url, AVInputFormat *fmt, AVDictionary **options);
+int avformat_open_input(AVFormatContext **ps, const char *url, ff_const59 AVInputFormat *fmt, AVDictionary **options);
 
 attribute_deprecated
 int av_demuxer_open(AVFormatContext *ic);
@@ -2388,13 +2397,12 @@
  * omit invalid data between valid frames so as to give the decoder the maximum
  * information possible for decoding.
  *
- * If pkt->buf is NULL, then the packet is valid until the next
- * av_read_frame() or until avformat_close_input(). Otherwise the packet
- * is valid indefinitely. In both cases the packet must be freed with
- * av_packet_unref when it is no longer needed. For video, the packet contains
- * exactly one frame. For audio, it contains an integer number of frames if each
- * frame has a known fixed size (e.g. PCM or ADPCM data). If the audio frames
- * have a variable size (e.g. MPEG audio), then it contains one frame.
+ * On success, the returned packet is reference-counted (pkt->buf is set) and
+ * valid indefinitely. The packet must be freed with av_packet_unref() when
+ * it is no longer needed. For video, the packet contains exactly one frame.
+ * For audio, it contains an integer number of frames if each frame has
+ * a known fixed size (e.g. PCM or ADPCM data). If the audio frames have
+ * a variable size (e.g. MPEG audio), then it contains one frame.
  *
  * pkt->pts, pkt->dts and pkt->duration are always set to correct
  * values in AVStream.time_base units (and guessed if the format cannot
@@ -2402,7 +2410,11 @@
  * has B-frames, so it is better to rely on pkt->dts if you do not
  * decompress the payload.
  *
- * @return 0 if OK, < 0 on error or end of file
+ * @return 0 if OK, < 0 on error or end of file. On error, pkt will be blank
+ *         (as if it came from av_packet_alloc()).
+ *
+ * @note pkt will be initialized, so it may be uninitialized, but it must not
+ *       contain data that needs to be freed.
  */
 int av_read_frame(AVFormatContext *s, AVPacket *pkt);
 
@@ -2447,8 +2459,6 @@
  * @return >=0 on success, error code otherwise
  *
  * @note This is part of the new seek API which is still under construction.
- *       Thus do not use this yet. It may change at any time, do not expect
- *       ABI compatibility yet!
  */
 int avformat_seek_file(AVFormatContext *s, int stream_index, int64_t min_ts, int64_t ts, int64_t max_ts, int flags);
 
@@ -2635,9 +2645,9 @@
  * Write an uncoded frame to an output media file.
  *
  * The frame must be correctly interleaved according to the container
- * specification; if not, then av_interleaved_write_frame() must be used.
+ * specification; if not, av_interleaved_write_uncoded_frame() must be used.
  *
- * See av_interleaved_write_frame() for details.
+ * See av_interleaved_write_uncoded_frame() for details.
  */
 int av_write_uncoded_frame(AVFormatContext *s, int stream_index,
                            AVFrame *frame);
@@ -2692,14 +2702,14 @@
  * @param mime_type if non-NULL checks if mime_type matches with the
  * MIME type of the registered formats
  */
-AVOutputFormat *av_guess_format(const char *short_name,
+ff_const59 AVOutputFormat *av_guess_format(const char *short_name,
                                 const char *filename,
                                 const char *mime_type);
 
 /**
  * Guess the codec ID based upon muxer and filename.
  */
-enum AVCodecID av_guess_codec(AVOutputFormat *fmt, const char *short_name,
+enum AVCodecID av_guess_codec(ff_const59 AVOutputFormat *fmt, const char *short_name,
                             const char *filename, const char *mime_type,
                             enum AVMediaType type);
 
diff --git a/libavformat/avidec.c b/libavformat/avidec.c
index 3f07479..5fc3e01 100644
--- a/libavformat/avidec.c
+++ b/libavformat/avidec.c
@@ -23,7 +23,6 @@
 
 #include "libavutil/avassert.h"
 #include "libavutil/avstring.h"
-#include "libavutil/bswap.h"
 #include "libavutil/opt.h"
 #include "libavutil/dict.h"
 #include "libavutil/internal.h"
@@ -61,7 +60,7 @@
 
     AVFormatContext *sub_ctx;
     AVPacket sub_pkt;
-    uint8_t *sub_buffer;
+    AVBufferRef *sub_buffer;
 
     int64_t seek_pos;
 } AVIStream;
@@ -117,8 +116,8 @@
 static int avi_load_index(AVFormatContext *s);
 static int guess_ni_flag(AVFormatContext *s);
 
-#define print_tag(str, tag, size)                                      \
-    av_log(NULL, AV_LOG_TRACE, "pos:%"PRIX64" %s: tag=%s size=0x%x\n", \
+#define print_tag(s, str, tag, size)                                      \
+    av_log(s, AV_LOG_TRACE, "pos:%"PRIX64" %s: tag=%s size=0x%x\n", \
            avio_tell(pb), str, av_fourcc2str(tag), size)                  \
 
 static inline int get_duration(AVIStream *ast, int len)
@@ -306,8 +305,10 @@
     value = av_malloc(size + 1);
     if (!value)
         return AVERROR(ENOMEM);
-    if (avio_read(pb, value, size) != size)
+    if (avio_read(pb, value, size) != size) {
+        av_freep(&value);
         return AVERROR_INVALIDDATA;
+    }
     value[size] = 0;
 
     AV_WL32(key, tag);
@@ -456,7 +457,7 @@
             continue;
         duration = st->index_entries[j-1].timestamp - st->index_entries[0].timestamp;
         bitrate = av_rescale(8*len, st->time_base.den, duration * st->time_base.num);
-        if (bitrate <= INT_MAX && bitrate > 0) {
+        if (bitrate > 0) {
             st->codecpar->bit_rate = bitrate;
         }
     }
@@ -502,7 +503,7 @@
         tag  = avio_rl32(pb);
         size = avio_rl32(pb);
 
-        print_tag("tag", tag, size);
+        print_tag(s, "tag", tag, size);
 
         switch (tag) {
         case MKTAG('L', 'I', 'S', 'T'):
@@ -510,7 +511,7 @@
             /* Ignored, except at start of video packets. */
             tag1 = avio_rl32(pb);
 
-            print_tag("list", tag1, 0);
+            print_tag(s, "list", tag1, 0);
 
             if (tag1 == MKTAG('m', 'o', 'v', 'i')) {
                 avi->movi_list = avio_tell(pb) - 4;
@@ -518,7 +519,7 @@
                     avi->movi_end = avi->movi_list + size + (size & 1);
                 else
                     avi->movi_end = avi->fsize;
-                av_log(NULL, AV_LOG_TRACE, "movi end=%"PRIx64"\n", avi->movi_end);
+                av_log(s, AV_LOG_TRACE, "movi end=%"PRIx64"\n", avi->movi_end);
                 goto end_of_header;
             } else if (tag1 == MKTAG('I', 'N', 'F', 'O'))
                 ff_read_riff_info(s, size - 4);
@@ -582,7 +583,7 @@
                 tag1 = stream_index ? MKTAG('a', 'u', 'd', 's')
                                     : MKTAG('v', 'i', 'd', 's');
 
-            print_tag("strh", tag1, -1);
+            print_tag(s, "strh", tag1, -1);
 
             if (tag1 == MKTAG('i', 'a', 'v', 's') ||
                 tag1 == MKTAG('i', 'v', 'a', 's')) {
@@ -598,28 +599,19 @@
                     handler != MKTAG('d', 'v', 's', 'l'))
                     goto fail;
 
+                if (!CONFIG_DV_DEMUXER)
+                    return AVERROR_DEMUXER_NOT_FOUND;
+
                 ast = s->streams[0]->priv_data;
-                av_freep(&s->streams[0]->codecpar->extradata);
-                av_freep(&s->streams[0]->codecpar);
-#if FF_API_LAVF_AVCTX
-FF_DISABLE_DEPRECATION_WARNINGS
-                av_freep(&s->streams[0]->codec);
-FF_ENABLE_DEPRECATION_WARNINGS
-#endif
-                if (s->streams[0]->info)
-                    av_freep(&s->streams[0]->info->duration_error);
-                av_freep(&s->streams[0]->info);
-                if (s->streams[0]->internal)
-                    av_freep(&s->streams[0]->internal->avctx);
-                av_freep(&s->streams[0]->internal);
-                av_freep(&s->streams[0]);
-                s->nb_streams = 0;
-                if (CONFIG_DV_DEMUXER) {
-                    avi->dv_demux = avpriv_dv_init_demux(s);
-                    if (!avi->dv_demux)
-                        goto fail;
-                } else
-                    goto fail;
+                st->priv_data = NULL;
+                ff_free_stream(s, st);
+
+                avi->dv_demux = avpriv_dv_init_demux(s);
+                if (!avi->dv_demux) {
+                    av_free(ast);
+                    return AVERROR(ENOMEM);
+                }
+
                 s->streams[0]->priv_data = ast;
                 avio_skip(pb, 3 * 4);
                 ast->scale = avio_rl32(pb);
@@ -769,10 +761,11 @@
                             st->codecpar->extradata_size =  size - 10 * 4;
                         if (st->codecpar->extradata) {
                             av_log(s, AV_LOG_WARNING, "New extradata in strf chunk, freeing previous one.\n");
-                            av_freep(&st->codecpar->extradata);
                         }
-                        if (ff_get_extradata(s, st->codecpar, pb, st->codecpar->extradata_size) < 0)
-                            return AVERROR(ENOMEM);
+                        ret = ff_get_extradata(s, st->codecpar, pb,
+                                               st->codecpar->extradata_size);
+                        if (ret < 0)
+                            return ret;
                     }
 
                     // FIXME: check if the encoder really did this correctly
@@ -800,7 +793,7 @@
                         ast->has_pal = 1;
                     }
 
-                    print_tag("video", tag1, 0);
+                    print_tag(s, "video", tag1, 0);
 
                     st->codecpar->codec_type = AVMEDIA_TYPE_VIDEO;
                     st->codecpar->codec_tag  = tag1;
@@ -815,6 +808,9 @@
                                   "mov tag found in avi (fourcc %s)\n",
                                   av_fourcc2str(tag1));
                     }
+                    if (!st->codecpar->codec_id)
+                        st->codecpar->codec_id = ff_codec_get_id(ff_codec_bmp_tags_unofficial, tag1);
+
                     /* This is needed to get the pict type which is necessary
                      * for generating correct pts. */
                     st->need_parsing = AVSTREAM_PARSE_HEADERS;
@@ -827,6 +823,9 @@
                         st->need_parsing = AVSTREAM_PARSE_FULL;
                     if (st->codecpar->codec_id == AV_CODEC_ID_RV40)
                         st->need_parsing = AVSTREAM_PARSE_NONE;
+                    if (st->codecpar->codec_id == AV_CODEC_ID_HEVC &&
+                        st->codecpar->codec_tag == MKTAG('H', '2', '6', '5'))
+                        st->need_parsing = AVSTREAM_PARSE_FULL;
 
                     if (st->codecpar->codec_tag == 0 && st->codecpar->height > 0 &&
                         st->codecpar->extradata_size < 1U << 30) {
@@ -926,10 +925,9 @@
                 if (size<(1<<30)) {
                     if (st->codecpar->extradata) {
                         av_log(s, AV_LOG_WARNING, "New extradata in strd chunk, freeing previous one.\n");
-                        av_freep(&st->codecpar->extradata);
                     }
-                    if (ff_get_extradata(s, st->codecpar, pb, size) < 0)
-                        return AVERROR(ENOMEM);
+                    if ((ret = ff_get_extradata(s, st->codecpar, pb, size)) < 0)
+                        return ret;
                 }
 
                 if (st->codecpar->extradata_size & 1) //FIXME check if the encoder really did this correctly
@@ -1068,7 +1066,7 @@
         uint8_t desc[256];
         int score      = AVPROBE_SCORE_EXTENSION, ret;
         AVIStream *ast = st->priv_data;
-        AVInputFormat *sub_demuxer;
+        ff_const59 AVInputFormat *sub_demuxer;
         AVRational time_base;
         int size;
         AVIOContext *pb = avio_alloc_context(pkt->data + 7,
@@ -1118,8 +1116,9 @@
             time_base = ast->sub_ctx->streams[0]->time_base;
             avpriv_set_pts_info(st, 64, time_base.num, time_base.den);
         }
-        ast->sub_buffer = pkt->data;
-        memset(pkt, 0, sizeof(*pkt));
+        ast->sub_buffer = pkt->buf;
+        pkt->buf = NULL;
+        av_packet_unref(pkt);
         return 1;
 
 error:
@@ -1528,11 +1527,12 @@
         if (!avi->non_interleaved && st->nb_index_entries>1 && avi->index_loaded>1) {
             int64_t dts= av_rescale_q(pkt->dts, st->time_base, AV_TIME_BASE_Q);
 
-            if (avi->dts_max - dts > 2*AV_TIME_BASE) {
+            if (avi->dts_max < dts) {
+                avi->dts_max = dts;
+            } else if (avi->dts_max - (uint64_t)dts > 2*AV_TIME_BASE) {
                 avi->non_interleaved= 1;
                 av_log(s, AV_LOG_INFO, "Switching to NI mode, due to poor interleaving\n");
-            }else if (avi->dts_max < dts)
-                avi->dts_max = dts;
+            }
         }
 
         return 0;
@@ -1910,7 +1910,7 @@
                 av_freep(&ast->sub_ctx->pb);
                 avformat_close_input(&ast->sub_ctx);
             }
-            av_freep(&ast->sub_buffer);
+            av_buffer_unref(&ast->sub_buffer);
             av_packet_unref(&ast->sub_pkt);
         }
     }
@@ -1920,7 +1920,7 @@
     return 0;
 }
 
-static int avi_probe(AVProbeData *p)
+static int avi_probe(const AVProbeData *p)
 {
     int i;
 
diff --git a/libavformat/avienc.c b/libavformat/avienc.c
index ac0f04c..297d5b8 100644
--- a/libavformat/avienc.c
+++ b/libavformat/avienc.c
@@ -31,7 +31,6 @@
 #include "libavutil/avstring.h"
 #include "libavutil/avutil.h"
 #include "libavutil/internal.h"
-#include "libavutil/intreadwrite.h"
 #include "libavutil/dict.h"
 #include "libavutil/avassert.h"
 #include "libavutil/timestamp.h"
@@ -269,8 +268,8 @@
     int padding;
 
     if (s->nb_streams > AVI_MAX_STREAM_COUNT) {
-        av_log(s, AV_LOG_ERROR, "AVI does not support >%d streams\n",
-               AVI_MAX_STREAM_COUNT);
+        av_log(s, AV_LOG_ERROR, "AVI does not support "
+               ">"AV_STRINGIFY(AVI_MAX_STREAM_COUNT)" streams\n");
         return AVERROR(EINVAL);
     }
 
@@ -459,6 +458,14 @@
                     && par->format != AV_PIX_FMT_NONE)
                     av_log(s, AV_LOG_ERROR, "%s rawvideo cannot be written to avi, output file will be unreadable\n",
                           av_get_pix_fmt_name(par->format));
+
+                if (par->format == AV_PIX_FMT_PAL8) {
+                    if (par->bits_per_coded_sample < 0 || par->bits_per_coded_sample > 8) {
+                        av_log(s, AV_LOG_ERROR, "PAL8 with %d bps is not allowed\n", par->bits_per_coded_sample);
+                        return AVERROR(EINVAL);
+                    }
+                }
+
                 break;
             case AVMEDIA_TYPE_AUDIO:
                 flags = (avi->write_channel_mask == 0) ? FF_PUT_WAV_HEADER_SKIP_CHANNELMASK : 0;
@@ -581,8 +588,6 @@
     avi->movi_list = ff_start_tag(pb, "LIST");
     ffio_wfourcc(pb, "movi");
 
-    avio_flush(pb);
-
     return 0;
 }
 
@@ -594,7 +599,6 @@
     int64_t pos;
     int au_byterate, au_ssize, au_scale;
 
-    avio_flush(pb);
     pos = avio_tell(pb);
 
     /* Updating one entry in the AVI OpenDML master index */
@@ -909,7 +913,7 @@
     AVIContext *avi = s->priv_data;
     AVIOContext *pb = s->pb;
     int res = 0;
-    int i, j, n, nb_frames;
+    int i, n, nb_frames;
     int64_t file_size;
 
     for (i = 0; i < s->nb_streams; i++) {
@@ -962,10 +966,6 @@
 
     for (i = 0; i < s->nb_streams; i++) {
         AVIStream *avist = s->streams[i]->priv_data;
-        for (j = 0; j < avist->indexes.ents_allocated / AVI_INDEX_CLUSTER_SIZE; j++)
-            av_freep(&avist->indexes.cluster[j]);
-        av_freep(&avist->indexes.cluster);
-        avist->indexes.ents_allocated = avist->indexes.entry = 0;
         if (pb->seekable & AVIO_SEEKABLE_NORMAL) {
             avio_seek(pb, avist->frames_hdr_strm + 4, SEEK_SET);
             avio_wl32(pb, avist->max_size);
@@ -975,6 +975,19 @@
     return res;
 }
 
+static void avi_deinit(AVFormatContext *s)
+{
+    for (int i = 0; i < s->nb_streams; i++) {
+        AVIStream *avist = s->streams[i]->priv_data;
+        if (!avist)
+            continue;
+        for (int j = 0; j < avist->indexes.ents_allocated / AVI_INDEX_CLUSTER_SIZE; j++)
+            av_freep(&avist->indexes.cluster[j]);
+        av_freep(&avist->indexes.cluster);
+        avist->indexes.ents_allocated = avist->indexes.entry = 0;
+    }
+}
+
 #define OFFSET(x) offsetof(AVIContext, x)
 #define ENC AV_OPT_FLAG_ENCODING_PARAM
 static const AVOption options[] = {
@@ -999,6 +1012,7 @@
     .audio_codec    = CONFIG_LIBMP3LAME ? AV_CODEC_ID_MP3 : AV_CODEC_ID_AC3,
     .video_codec    = AV_CODEC_ID_MPEG4,
     .init           = avi_init,
+    .deinit         = avi_deinit,
     .write_header   = avi_write_header,
     .write_packet   = avi_write_packet,
     .write_trailer  = avi_write_trailer,
diff --git a/libavformat/avio.c b/libavformat/avio.c
index 663789e..237966c 100644
--- a/libavformat/avio.c
+++ b/libavformat/avio.c
@@ -26,6 +26,7 @@
 #include "libavutil/avassert.h"
 #include "os_support.h"
 #include "avformat.h"
+#include "internal.h"
 #if CONFIG_NETWORK
 #include "network.h"
 #endif
@@ -54,8 +55,8 @@
 #define E AV_OPT_FLAG_ENCODING_PARAM
 #define D AV_OPT_FLAG_DECODING_PARAM
 static const AVOption options[] = {
-    {"protocol_whitelist", "List of protocols that are allowed to be used", OFFSET(protocol_whitelist), AV_OPT_TYPE_STRING, { .str = NULL },  CHAR_MIN, CHAR_MAX, D },
-    {"protocol_blacklist", "List of protocols that are not allowed to be used", OFFSET(protocol_blacklist), AV_OPT_TYPE_STRING, { .str = NULL },  CHAR_MIN, CHAR_MAX, D },
+    {"protocol_whitelist", "List of protocols that are allowed to be used", OFFSET(protocol_whitelist), AV_OPT_TYPE_STRING, { .str = NULL },  0, 0, D },
+    {"protocol_blacklist", "List of protocols that are not allowed to be used", OFFSET(protocol_blacklist), AV_OPT_TYPE_STRING, { .str = NULL },  0, 0, D },
     {"rw_timeout", "Timeout for IO operations (in microseconds)", offsetof(URLContext, rw_timeout), AV_OPT_TYPE_INT64, { .i64 = 0 }, 0, INT64_MAX, AV_OPT_FLAG_ENCODING_PARAM | AV_OPT_FLAG_DECODING_PARAM },
     { NULL }
 };
@@ -283,6 +284,9 @@
         }
     }
     av_freep(&protocols);
+    if (av_strstart(filename, "https:", NULL) || av_strstart(filename, "tls:", NULL))
+        av_log(NULL, AV_LOG_WARNING, "https protocol not found, recompile FFmpeg with "
+                                     "openssl, gnutls or securetransport enabled.\n");
 
     return NULL;
 }
@@ -297,10 +301,6 @@
        return url_alloc_for_protocol(puc, p, filename, flags, int_cb);
 
     *puc = NULL;
-    if (av_strstart(filename, "https:", NULL) || av_strstart(filename, "tls:", NULL))
-        av_log(NULL, AV_LOG_WARNING, "https protocol not found, recompile FFmpeg with "
-                                     "openssl, gnutls "
-                                     "or securetransport enabled.\n");
     return AVERROR_PROTOCOL_NOT_FOUND;
 }
 
@@ -347,8 +347,7 @@
     if (!ret)
         return 0;
 fail:
-    ffurl_close(*puc);
-    *puc = NULL;
+    ffurl_closep(puc);
     return ret;
 }
 
@@ -667,3 +666,11 @@
         return cb->callback(cb->opaque);
     return 0;
 }
+
+int ff_rename(const char *url_src, const char *url_dst, void *logctx)
+{
+    int ret = avpriv_io_move(url_src, url_dst);
+    if (ret < 0)
+        av_log(logctx, AV_LOG_ERROR, "failed to rename file %s to %s: %s\n", url_src, url_dst, av_err2str(ret));
+    return ret;
+}
diff --git a/libavformat/avio.h b/libavformat/avio.h
index 75912ce..d022820 100644
--- a/libavformat/avio.h
+++ b/libavformat/avio.h
@@ -236,7 +236,7 @@
     int (*write_packet)(void *opaque, uint8_t *buf, int buf_size);
     int64_t (*seek)(void *opaque, int64_t offset, int whence);
     int64_t pos;            /**< position in the file of the current buffer */
-    int eof_reached;        /**< true if eof reached */
+    int eof_reached;        /**< true if was unable to read due to error or eof */
     int write_flag;         /**< true if open for writing */
     int max_packet_size;
     unsigned long checksum;
@@ -566,15 +566,35 @@
 int64_t avio_size(AVIOContext *s);
 
 /**
- * feof() equivalent for AVIOContext.
- * @return non zero if and only if end of file
+ * Similar to feof() but also returns nonzero on read errors.
+ * @return non zero if and only if at end of file or a read error happened when reading.
  */
 int avio_feof(AVIOContext *s);
 
-/** @warning Writes up to 4 KiB per call */
+/**
+ * Writes a formatted string to the context.
+ * @return number of bytes written, < 0 on error.
+ */
 int avio_printf(AVIOContext *s, const char *fmt, ...) av_printf_format(2, 3);
 
 /**
+ * Write a NULL terminated array of strings to the context.
+ * Usually you don't need to use this function directly but its macro wrapper,
+ * avio_print.
+ */
+void avio_print_string_array(AVIOContext *s, const char *strings[]);
+
+/**
+ * Write strings (const char *) to the context.
+ * This is a convenience macro around avio_print_string_array and it
+ * automatically creates the string array from the variable argument list.
+ * For simple string concatenations this function is more performant than using
+ * avio_printf since it does not need a temporary buffer.
+ */
+#define avio_print(s, ...) \
+    avio_print_string_array(s, (const char*[]){__VA_ARGS__, NULL})
+
+/**
  * Force flushing of buffered data.
  *
  * For write streams, force the buffered data to be immediately written to the output,
@@ -788,6 +808,13 @@
 const char *avio_enum_protocols(void **opaque, int output);
 
 /**
+ * Get AVClass by names of available protocols.
+ *
+ * @return A AVClass of input protocol name or NULL
+ */
+const AVClass *avio_protocol_get_class(const char *name);
+
+/**
  * Pause and resume playing - only meaningful if using a network streaming
  * protocol (e.g. MMS).
  *
diff --git a/libavformat/avio_internal.h b/libavformat/avio_internal.h
index 04c1ad5..c575df8 100644
--- a/libavformat/avio_internal.h
+++ b/libavformat/avio_internal.h
@@ -87,6 +87,15 @@
 int ffio_set_buf_size(AVIOContext *s, int buf_size);
 
 /**
+ * Reallocate a given buffer for AVIOContext.
+ *
+ * @param s the AVIOContext to realloc.
+ * @param buf_size required new buffer size.
+ * @return 0 on success, a negative AVERROR on failure.
+ */
+int ffio_realloc_buf(AVIOContext *s, int buf_size);
+
+/**
  * Ensures that the requested seekback buffer size will be available
  *
  * Will ensure that when reading sequentially up to buf_size, seeking
@@ -163,6 +172,13 @@
 int ffio_close_null_buf(AVIOContext *s);
 
 /**
+ * Reset a dynamic buffer.
+ *
+ * Resets everything, but keeps the allocated buffer for later use.
+ */
+void ffio_reset_dyn_buf(AVIOContext *s);
+
+/**
  * Free a dynamic buffer.
  *
  * @param s a pointer to an IO context opened by avio_open_dyn_buf()
diff --git a/libavformat/aviobuf.c b/libavformat/aviobuf.c
index 5a33f82..85c01c9 100644
--- a/libavformat/aviobuf.c
+++ b/libavformat/aviobuf.c
@@ -42,15 +42,10 @@
  */
 #define SHORT_SEEK_THRESHOLD 4096
 
-typedef struct AVIOInternal {
-    URLContext *h;
-} AVIOInternal;
-
 static void *ff_avio_child_next(void *obj, void *prev)
 {
     AVIOContext *s = obj;
-    AVIOInternal *internal = s->opaque;
-    return prev ? NULL : internal->h;
+    return prev ? NULL : s->opaque;
 }
 
 static const AVClass *ff_avio_child_class_next(const AVClass *prev)
@@ -62,7 +57,7 @@
 #define E AV_OPT_FLAG_ENCODING_PARAM
 #define D AV_OPT_FLAG_DECODING_PARAM
 static const AVOption ff_avio_options[] = {
-    {"protocol_whitelist", "List of protocols that are allowed to be used", OFFSET(protocol_whitelist), AV_OPT_TYPE_STRING, { .str = NULL },  CHAR_MIN, CHAR_MAX, D },
+    {"protocol_whitelist", "List of protocols that are allowed to be used", OFFSET(protocol_whitelist), AV_OPT_TYPE_STRING, { .str = NULL },  0, 0, D },
     { NULL },
 };
 
@@ -255,6 +250,9 @@
     if(!s)
         return AVERROR(EINVAL);
 
+    if ((whence & AVSEEK_SIZE))
+        return s->seek ? s->seek(s->opaque, offset, AVSEEK_SIZE) : AVERROR(ENOSYS);
+
     buffer_size = s->buf_end - s->buffer;
     // pos is the absolute position that the beginning of s->buffer corresponds to in the file
     pos = s->pos - (s->write_flag ? 0 : buffer_size);
@@ -570,7 +568,7 @@
     }
 
     /* make buffer smaller in case it ended up large after probing */
-    if (s->read_packet && s->orig_buffer_size && s->buffer_size > s->orig_buffer_size) {
+    if (s->read_packet && s->orig_buffer_size && s->buffer_size > s->orig_buffer_size && len >= s->orig_buffer_size) {
         if (dst == s->buffer && s->buf_ptr != dst) {
             int ret = ffio_set_buf_size(s, s->orig_buffer_size);
             if (ret < 0)
@@ -578,7 +576,6 @@
 
             s->checksum_ptr = dst = s->buffer;
         }
-        av_assert0(len >= s->orig_buffer_size);
         len = s->orig_buffer_size;
     }
 
@@ -938,49 +935,8 @@
     return val;
 }
 
-static int io_read_packet(void *opaque, uint8_t *buf, int buf_size)
-{
-    AVIOInternal *internal = opaque;
-    return ffurl_read(internal->h, buf, buf_size);
-}
-
-static int io_write_packet(void *opaque, uint8_t *buf, int buf_size)
-{
-    AVIOInternal *internal = opaque;
-    return ffurl_write(internal->h, buf, buf_size);
-}
-
-static int64_t io_seek(void *opaque, int64_t offset, int whence)
-{
-    AVIOInternal *internal = opaque;
-    return ffurl_seek(internal->h, offset, whence);
-}
-
-static int io_short_seek(void *opaque)
-{
-    AVIOInternal *internal = opaque;
-    return ffurl_get_short_seek(internal->h);
-}
-
-static int io_read_pause(void *opaque, int pause)
-{
-    AVIOInternal *internal = opaque;
-    if (!internal->h->prot->url_read_pause)
-        return AVERROR(ENOSYS);
-    return internal->h->prot->url_read_pause(internal->h, pause);
-}
-
-static int64_t io_read_seek(void *opaque, int stream_index, int64_t timestamp, int flags)
-{
-    AVIOInternal *internal = opaque;
-    if (!internal->h->prot->url_read_seek)
-        return AVERROR(ENOSYS);
-    return internal->h->prot->url_read_seek(internal->h, stream_index, timestamp, flags);
-}
-
 int ffio_fdopen(AVIOContext **s, URLContext *h)
 {
-    AVIOInternal *internal = NULL;
     uint8_t *buffer = NULL;
     int buffer_size, max_packet_size;
 
@@ -994,14 +950,10 @@
     if (!buffer)
         return AVERROR(ENOMEM);
 
-    internal = av_mallocz(sizeof(*internal));
-    if (!internal)
-        goto fail;
-
-    internal->h = h;
-
-    *s = avio_alloc_context(buffer, buffer_size, h->flags & AVIO_FLAG_WRITE,
-                            internal, io_read_packet, io_write_packet, io_seek);
+    *s = avio_alloc_context(buffer, buffer_size, h->flags & AVIO_FLAG_WRITE, h,
+                            (int (*)(void *, uint8_t *, int))  ffurl_read,
+                            (int (*)(void *, uint8_t *, int))  ffurl_write,
+                            (int64_t (*)(void *, int64_t, int))ffurl_seek);
     if (!*s)
         goto fail;
 
@@ -1021,30 +973,28 @@
     (*s)->max_packet_size = max_packet_size;
     (*s)->min_packet_size = h->min_packet_size;
     if(h->prot) {
-        (*s)->read_pause = io_read_pause;
-        (*s)->read_seek  = io_read_seek;
+        (*s)->read_pause = (int (*)(void *, int))h->prot->url_read_pause;
+        (*s)->read_seek  =
+            (int64_t (*)(void *, int, int64_t, int))h->prot->url_read_seek;
 
         if (h->prot->url_read_seek)
             (*s)->seekable |= AVIO_SEEKABLE_TIME;
     }
-    (*s)->short_seek_get = io_short_seek;
+    (*s)->short_seek_get = (int (*)(void *))ffurl_get_short_seek;
     (*s)->av_class = &ff_avio_class;
     return 0;
 fail:
-    av_freep(&internal);
     av_freep(&buffer);
     return AVERROR(ENOMEM);
 }
 
 URLContext* ffio_geturlcontext(AVIOContext *s)
 {
-    AVIOInternal *internal;
     if (!s)
         return NULL;
 
-    internal = s->opaque;
-    if (internal && s->read_packet == io_read_packet)
-        return internal->h;
+    if (s->opaque && s->read_packet == (int (*)(void *, uint8_t *, int))ffurl_read)
+        return s->opaque;
     else
         return NULL;
 }
@@ -1094,6 +1044,37 @@
     return 0;
 }
 
+int ffio_realloc_buf(AVIOContext *s, int buf_size)
+{
+    uint8_t *buffer;
+    int data_size;
+
+    if (!s->buffer_size)
+        return ffio_set_buf_size(s, buf_size);
+
+    if (buf_size <= s->buffer_size)
+        return 0;
+
+    buffer = av_malloc(buf_size);
+    if (!buffer)
+        return AVERROR(ENOMEM);
+
+    data_size = s->write_flag ? (s->buf_ptr - s->buffer) : (s->buf_end - s->buf_ptr);
+    if (data_size > 0)
+        memcpy(buffer, s->write_flag ? s->buffer : s->buf_ptr, data_size);
+    av_free(s->buffer);
+    s->buffer = buffer;
+    s->orig_buffer_size = buf_size;
+    s->buffer_size = buf_size;
+    s->buf_ptr = s->write_flag ? (s->buffer + data_size) : s->buffer;
+    if (s->write_flag)
+        s->buf_ptr_max = s->buffer + data_size;
+
+    s->buf_end = s->write_flag ? (s->buffer + s->buffer_size) : (s->buf_ptr + data_size);
+
+    return 0;
+}
+
 static int url_resetbuf(AVIOContext *s, int flags)
 {
     av_assert1(flags == AVIO_FLAG_WRITE || flags == AVIO_FLAG_READ);
@@ -1164,6 +1145,8 @@
     URLContext *h;
     int err;
 
+    *s = NULL;
+
     err = ffurl_open_whitelist(&h, filename, flags, int_cb, options, whitelist, blacklist, NULL);
     if (err < 0)
         return err;
@@ -1181,25 +1164,17 @@
     return ffio_open_whitelist(s, filename, flags, int_cb, options, NULL, NULL);
 }
 
-int ffio_open2_wrapper(struct AVFormatContext *s, AVIOContext **pb, const char *url, int flags,
-                       const AVIOInterruptCB *int_cb, AVDictionary **options)
-{
-    return ffio_open_whitelist(pb, url, flags, int_cb, options, s->protocol_whitelist, s->protocol_blacklist);
-}
-
 int avio_close(AVIOContext *s)
 {
-    AVIOInternal *internal;
     URLContext *h;
 
     if (!s)
         return 0;
 
     avio_flush(s);
-    internal = s->opaque;
-    h        = internal->h;
+    h         = s->opaque;
+    s->opaque = NULL;
 
-    av_freep(&s->opaque);
     av_freep(&s->buffer);
     if (s->write_flag)
         av_log(s, AV_LOG_VERBOSE, "Statistics: %d seeks, %d writeouts\n", s->seek_count, s->writeout_count);
@@ -1222,14 +1197,26 @@
 int avio_printf(AVIOContext *s, const char *fmt, ...)
 {
     va_list ap;
-    char buf[4096]; /* update doc entry in avio.h if changed */
-    int ret;
+    AVBPrint bp;
 
+    av_bprint_init(&bp, 0, INT_MAX);
     va_start(ap, fmt);
-    ret = vsnprintf(buf, sizeof(buf), fmt, ap);
+    av_vbprintf(&bp, fmt, ap);
     va_end(ap);
-    avio_write(s, buf, strlen(buf));
-    return ret;
+    if (!av_bprint_is_complete(&bp)) {
+        av_bprint_finalize(&bp, NULL);
+        s->error = AVERROR(ENOMEM);
+        return AVERROR(ENOMEM);
+    }
+    avio_write(s, bp.str, bp.len);
+    av_bprint_finalize(&bp, NULL);
+    return bp.len;
+}
+
+void avio_print_string_array(AVIOContext *s, const char *strings[])
+{
+    for(; *strings; strings++)
+        avio_write(s, (const unsigned char *)*strings, strlen(*strings));
 }
 
 int avio_pause(AVIOContext *s, int pause)
@@ -1279,8 +1266,7 @@
 int avio_accept(AVIOContext *s, AVIOContext **c)
 {
     int ret;
-    AVIOInternal *internal = s->opaque;
-    URLContext *sc = internal->h;
+    URLContext *sc = s->opaque;
     URLContext *cc = NULL;
     ret = ffurl_accept(sc, &cc);
     if (ret < 0)
@@ -1290,8 +1276,7 @@
 
 int avio_handshake(AVIOContext *c)
 {
-    AVIOInternal *internal = c->opaque;
-    URLContext *cc = internal->h;
+    URLContext *cc = c->opaque;
     return ffurl_handshake(cc);
 }
 
@@ -1404,19 +1389,35 @@
 {
     DynBuffer *d;
 
-    if (!s) {
+    if (!s || s->error) {
         *pbuffer = NULL;
         return 0;
     }
+    d = s->opaque;
+
+    if (!d->size) {
+        *pbuffer = d->io_buffer;
+        return FFMAX(s->buf_ptr, s->buf_ptr_max) - s->buffer;
+    }
 
     avio_flush(s);
 
-    d = s->opaque;
     *pbuffer = d->buffer;
 
     return d->size;
 }
 
+void ffio_reset_dyn_buf(AVIOContext *s)
+{
+    DynBuffer *d = s->opaque;
+    int max_packet_size = s->max_packet_size;
+
+    ffio_init_context(s, d->io_buffer, d->io_buffer_size, 1, d, NULL,
+                      s->write_packet, s->seek);
+    s->max_packet_size = max_packet_size;
+    d->pos = d->size = 0;
+}
+
 int avio_close_dyn_buf(AVIOContext *s, uint8_t **pbuffer)
 {
     DynBuffer *d;
@@ -1449,12 +1450,15 @@
 
 void ffio_free_dyn_buf(AVIOContext **s)
 {
-    uint8_t *tmp;
+    DynBuffer *d;
+
     if (!*s)
         return;
-    avio_close_dyn_buf(*s, &tmp);
-    av_free(tmp);
-    *s = NULL;
+
+    d = (*s)->opaque;
+    av_free(d->buffer);
+    av_free(d);
+    avio_context_free(s);
 }
 
 static int null_buf_write(void *opaque, uint8_t *buf, int buf_size)
diff --git a/libavformat/avisynth.c b/libavformat/avisynth.c
index 250a489..2c08ace 100644
--- a/libavformat/avisynth.c
+++ b/libavformat/avisynth.c
@@ -1,5 +1,5 @@
 /*
- * AviSynth/AvxSynth support
+ * AviSynth(+) support
  * Copyright (c) 2012 AvxSynth Team
  *
  * This file is part of FFmpeg
@@ -31,20 +31,19 @@
 /* Enable function pointer definitions for runtime loading. */
 #define AVSC_NO_DECLSPEC
 
-/* Platform-specific directives for AviSynth vs AvxSynth. */
+/* Platform-specific directives. */
 #ifdef _WIN32
   #include "compat/w32dlfcn.h"
   #undef EXTERN_C
-  #include "compat/avisynth/avisynth_c.h"
   #define AVISYNTH_LIB "avisynth"
-  #define USING_AVISYNTH
 #else
   #include <dlfcn.h>
-  #include "compat/avisynth/avxsynth_c.h"
-  #define AVISYNTH_NAME "libavxsynth"
+  #define AVISYNTH_NAME "libavisynth"
   #define AVISYNTH_LIB AVISYNTH_NAME SLIBSUF
 #endif
 
+#include <avisynth/avisynth_c.h>
+
 typedef struct AviSynthLibrary {
     void *library;
 #define AVSC_DECLARE_FUNC(name) name ## _func name
@@ -62,7 +61,6 @@
     AVSC_DECLARE_FUNC(avs_release_value);
     AVSC_DECLARE_FUNC(avs_release_video_frame);
     AVSC_DECLARE_FUNC(avs_take_clip);
-#ifdef USING_AVISYNTH
     AVSC_DECLARE_FUNC(avs_bits_per_pixel);
     AVSC_DECLARE_FUNC(avs_get_height_p);
     AVSC_DECLARE_FUNC(avs_get_pitch_p);
@@ -70,7 +68,6 @@
     AVSC_DECLARE_FUNC(avs_get_row_size_p);
     AVSC_DECLARE_FUNC(avs_is_planar_rgb);
     AVSC_DECLARE_FUNC(avs_is_planar_rgba);
-#endif
 #undef AVSC_DECLARE_FUNC
 } AviSynthLibrary;
 
@@ -97,14 +94,12 @@
 static const int avs_planes_grey[1]   = { AVS_PLANAR_Y };
 static const int avs_planes_yuv[3]    = { AVS_PLANAR_Y, AVS_PLANAR_U,
                                           AVS_PLANAR_V };
-#ifdef USING_AVISYNTH
 static const int avs_planes_rgb[3]    = { AVS_PLANAR_G, AVS_PLANAR_B,
                                           AVS_PLANAR_R };
 static const int avs_planes_yuva[4]   = { AVS_PLANAR_Y, AVS_PLANAR_U,
                                           AVS_PLANAR_V, AVS_PLANAR_A };
 static const int avs_planes_rgba[4]   = { AVS_PLANAR_G, AVS_PLANAR_B,
                                           AVS_PLANAR_R, AVS_PLANAR_A };
-#endif
 
 /* A conflict between C++ global objects, atexit, and dynamic loading requires
  * us to register our own atexit handler to prevent double freeing. */
@@ -123,7 +118,8 @@
         return AVERROR_UNKNOWN;
 
 #define LOAD_AVS_FUNC(name, continue_on_fail)                          \
-        avs_library.name = dlsym(avs_library.library, #name);          \
+        avs_library.name = (name ## _func)                             \
+                           dlsym(avs_library.library, #name);          \
         if (!continue_on_fail && !avs_library.name)                    \
             goto fail;
 
@@ -141,7 +137,6 @@
     LOAD_AVS_FUNC(avs_release_value, 0);
     LOAD_AVS_FUNC(avs_release_video_frame, 0);
     LOAD_AVS_FUNC(avs_take_clip, 0);
-#ifdef USING_AVISYNTH
     LOAD_AVS_FUNC(avs_bits_per_pixel, 1);
     LOAD_AVS_FUNC(avs_get_height_p, 1);
     LOAD_AVS_FUNC(avs_get_pitch_p, 1);
@@ -149,7 +144,6 @@
     LOAD_AVS_FUNC(avs_get_row_size_p, 1);
     LOAD_AVS_FUNC(avs_is_planar_rgb, 1);
     LOAD_AVS_FUNC(avs_is_planar_rgba, 1);
-#endif
 #undef LOAD_AVS_FUNC
 
     atexit(avisynth_atexit_handler);
@@ -248,7 +242,6 @@
     avpriv_set_pts_info(st, 32, avs->vi->fps_denominator, avs->vi->fps_numerator);
 
     switch (avs->vi->pixel_type) {
-#ifdef USING_AVISYNTH
     /* 10~16-bit YUV pix_fmts (AviSynth+) */
     case AVS_CS_YUV444P10:
         st->codecpar->format = AV_PIX_FMT_YUV444P10;
@@ -323,6 +316,10 @@
         st->codecpar->format = AV_PIX_FMT_YUVA420P10;
         planar               = 4;
         break;
+    case AVS_CS_YUVA422P12:
+        st->codecpar->format = AV_PIX_FMT_YUVA422P12;
+        planar               = 4;
+        break;
     case AVS_CS_YUVA444P16:
         st->codecpar->format = AV_PIX_FMT_YUVA444P16;
         planar               = 4;
@@ -356,6 +353,11 @@
         st->codecpar->format = AV_PIX_FMT_GBRP16;
         planar               = 3;
         break;
+    /* Single precision floating point Planar RGB (AviSynth+) */
+    case AVS_CS_RGBPS:
+        st->codecpar->format = AV_PIX_FMT_GBRPF32;
+        planar               = 3;
+        break;
     /* Planar RGB pix_fmts with Alpha (AviSynth+) */
     case AVS_CS_RGBAP:
         st->codecpar->format = AV_PIX_FMT_GBRAP;
@@ -373,11 +375,33 @@
         st->codecpar->format = AV_PIX_FMT_GBRAP16;
         planar               = 5;
         break;
-    /* GRAY16 (AviSynth+) */
+    /* Single precision floating point Planar RGB with Alpha (AviSynth+) */
+    case AVS_CS_RGBAPS:
+        st->codecpar->format = AV_PIX_FMT_GBRAPF32;
+        planar               = 5;
+        break;
+    /* 10~16-bit gray pix_fmts (AviSynth+) */
+    case AVS_CS_Y10:
+        st->codecpar->format = AV_PIX_FMT_GRAY10;
+        planar               = 2;
+        break;
+    case AVS_CS_Y12:
+        st->codecpar->format = AV_PIX_FMT_GRAY12;
+        planar               = 2;
+        break;
+    case AVS_CS_Y14:
+        st->codecpar->format = AV_PIX_FMT_GRAY14;
+        planar               = 2;
+        break;
     case AVS_CS_Y16:
         st->codecpar->format = AV_PIX_FMT_GRAY16;
         planar               = 2;
         break;
+    /* Single precision floating point gray (AviSynth+) */
+    case AVS_CS_Y32:
+        st->codecpar->format = AV_PIX_FMT_GRAYF32;
+        planar               = 2;
+        break;
     /* pix_fmts added in AviSynth 2.6 */
     case AVS_CS_YV24:
         st->codecpar->format = AV_PIX_FMT_YUV444P;
@@ -402,8 +426,7 @@
     case AVS_CS_BGR64:
         st->codecpar->format = AV_PIX_FMT_BGRA64;
         break;
-#endif
-    /* AviSynth 2.5 and AvxSynth pix_fmts */
+    /* AviSynth 2.5 pix_fmts */
     case AVS_CS_BGR24:
         st->codecpar->format = AV_PIX_FMT_BGR24;
         break;
@@ -429,7 +452,6 @@
     }
 
     switch (planar) {
-#ifdef USING_AVISYNTH
     case 5: // Planar RGB + Alpha
         avs->n_planes = 4;
         avs->planes   = avs_planes_rgba;
@@ -442,7 +464,6 @@
         avs->n_planes = 3;
         avs->planes   = avs_planes_rgb;
         break;
-#endif
     case 2: // Y8
         avs->n_planes = 1;
         avs->planes   = avs_planes_grey;
@@ -524,7 +545,7 @@
     AviSynthContext *avs = s->priv_data;
     AVS_Value arg, val;
     int ret;
-#ifdef USING_AVISYNTH
+#ifdef _WIN32
     char filename_ansi[MAX_PATH * 4];
     wchar_t filename_wc[MAX_PATH * 4];
 #endif
@@ -532,14 +553,14 @@
     if (ret = avisynth_context_create(s))
         return ret;
 
-#ifdef USING_AVISYNTH
+#ifdef _WIN32
     /* Convert UTF-8 to ANSI code page */
-    MultiByteToWideChar(CP_UTF8, 0, s->filename, -1, filename_wc, MAX_PATH * 4);
+    MultiByteToWideChar(CP_UTF8, 0, s->url, -1, filename_wc, MAX_PATH * 4);
     WideCharToMultiByte(CP_THREAD_ACP, 0, filename_wc, -1, filename_ansi,
                         MAX_PATH * 4, NULL, NULL);
     arg = avs_new_value_string(filename_ansi);
 #else
-    arg = avs_new_value_string(s->filename);
+    arg = avs_new_value_string(s->url);
 #endif
     val = avs_library.avs_invoke(avs->env, "Import", arg, 0);
     if (avs_is_error(val)) {
@@ -556,11 +577,9 @@
     avs->clip = avs_library.avs_take_clip(val, avs->env);
     avs->vi   = avs_library.avs_get_video_info(avs->clip);
 
-#ifdef USING_AVISYNTH
     /* On Windows, FFmpeg supports AviSynth interface version 6 or higher.
      * This includes AviSynth 2.6 RC1 or higher, and AviSynth+ r1718 or higher,
-     * and excludes 2.5 and the 2.6 alphas. Since AvxSynth identifies itself
-     * as interface version 3 like 2.5.8, this needs to be special-cased. */
+     * and excludes 2.5 and the 2.6 alphas. */
 
     if (avs_library.avs_get_version(avs->clip) < 6) {
         av_log(s, AV_LOG_ERROR,
@@ -568,7 +587,6 @@
         ret = AVERROR_UNKNOWN;
         goto fail;
     }
-#endif
 
     /* Release the AVS_Value as it will go out of scope. */
     avs_library.avs_release_value(val);
@@ -608,7 +626,7 @@
     AVS_VideoFrame *frame;
     unsigned char *dst_p;
     const unsigned char *src_p;
-    int n, i, plane, rowsize, planeheight, pitch, bits;
+    int n, i, plane, rowsize, planeheight, pitch, bits, ret;
     const char *error;
     int avsplus av_unused;
 
@@ -620,22 +638,20 @@
     if (discard)
         return 0;
 
-#ifdef USING_AVISYNTH
+#ifdef _WIN32
     /* Detect whether we're using AviSynth 2.6 or AviSynth+ by
      * looking for whether avs_is_planar_rgb exists. */
     if (GetProcAddress(avs_library.library, "avs_is_planar_rgb") == NULL)
         avsplus = 0;
     else
         avsplus = 1;
-
-    /* avs_bits_per_pixel changed to AVSC_API with AviSynth 2.6, which
-     * requires going through avs_library, while AvxSynth has it under
-     * the older AVSC_INLINE type, so special-case this. */
+#else
+    /* AviSynth+ is now the only variant of AviSynth we support
+     * on Linux and macOS. */
+    avsplus = 1;
+#endif
 
     bits = avs_library.avs_bits_per_pixel(avs->vi);
-#else
-    bits = avs_bits_per_pixel(avs->vi);
-#endif
 
     /* Without the cast to int64_t, calculation overflows at about 9k x 9k
      * resolution. */
@@ -644,8 +660,8 @@
     if (!pkt->size)
         return AVERROR_UNKNOWN;
 
-    if (av_new_packet(pkt, pkt->size) < 0)
-        return AVERROR(ENOMEM);
+    if ((ret = av_new_packet(pkt, pkt->size)) < 0)
+        return ret;
 
     pkt->pts      = n;
     pkt->dts      = n;
@@ -664,19 +680,11 @@
     dst_p = pkt->data;
     for (i = 0; i < avs->n_planes; i++) {
         plane = avs->planes[i];
-#ifdef USING_AVISYNTH
         src_p = avs_library.avs_get_read_ptr_p(frame, plane);
         pitch = avs_library.avs_get_pitch_p(frame, plane);
 
         rowsize     = avs_library.avs_get_row_size_p(frame, plane);
         planeheight = avs_library.avs_get_height_p(frame, plane);
-#else
-        src_p = avs_get_read_ptr_p(frame, plane);
-        pitch = avs_get_pitch_p(frame, plane);
-
-        rowsize     = avs_get_row_size_p(frame, plane);
-        planeheight = avs_get_height_p(frame, plane);
-#endif
 
         /* Flip RGB video. */
         if (avs_is_rgb24(avs->vi) || avs_is_rgb(avs->vi)) {
@@ -684,14 +692,12 @@
             pitch = -pitch;
         }
 
-#ifdef USING_AVISYNTH
         /* Flip Planar RGB video */
         if (avsplus && (avs_library.avs_is_planar_rgb(avs->vi) ||
                         avs_library.avs_is_planar_rgba(avs->vi))) {
             src_p = src_p + (planeheight - 1) * pitch;
             pitch = -pitch;
         }
-#endif
 
         avs_library.avs_bit_blt(avs->env, dst_p, rowsize, src_p, pitch,
                                  rowsize, planeheight);
@@ -707,7 +713,7 @@
 {
     AviSynthContext *avs = s->priv_data;
     AVRational fps, samplerate;
-    int samples;
+    int samples, ret;
     int64_t n;
     const char *error;
 
@@ -750,8 +756,8 @@
     if (!pkt->size)
         return AVERROR_UNKNOWN;
 
-    if (av_new_packet(pkt, pkt->size) < 0)
-        return AVERROR(ENOMEM);
+    if ((ret = av_new_packet(pkt, pkt->size)) < 0)
+        return ret;
 
     pkt->pts      = n;
     pkt->dts      = n;
diff --git a/libavformat/avr.c b/libavformat/avr.c
index 294160e..c4ce701 100644
--- a/libavformat/avr.c
+++ b/libavformat/avr.c
@@ -24,7 +24,7 @@
 #include "internal.h"
 #include "pcm.h"
 
-static int avr_probe(AVProbeData *p)
+static int avr_probe(const AVProbeData *p)
 {
     if (AV_RL32(p->buf) != MKTAG('2', 'B', 'I', 'T'))
         return 0;
diff --git a/libavformat/avs.c b/libavformat/avs.c
index 62f5a42..54b2c3f 100644
--- a/libavformat/avs.c
+++ b/libavformat/avs.c
@@ -50,7 +50,7 @@
     AVS_GAME_DATA = 0x04,
 } AvsBlockType;
 
-static int avs_probe(AVProbeData * p)
+static int avs_probe(const AVProbeData * p)
 {
     const uint8_t *d;
 
@@ -114,7 +114,6 @@
     pkt->data[palette_size + 3] = (size >> 8) & 0xFF;
     ret = avio_read(s->pb, pkt->data + palette_size + 4, size - 4) + 4;
     if (ret < size) {
-        av_packet_unref(pkt);
         return AVERROR(EIO);
     }
 
@@ -224,11 +223,6 @@
     }
 }
 
-static int avs_read_close(AVFormatContext * s)
-{
-    return 0;
-}
-
 AVInputFormat ff_avs_demuxer = {
     .name           = "avs",
     .long_name      = NULL_IF_CONFIG_SMALL("Argonaut Games Creature Shock"),
@@ -236,5 +230,4 @@
     .read_probe     = avs_probe,
     .read_header    = avs_read_header,
     .read_packet    = avs_read_packet,
-    .read_close     = avs_read_close,
 };
diff --git a/libavformat/bethsoftvid.c b/libavformat/bethsoftvid.c
index f516806..47a9a69 100644
--- a/libavformat/bethsoftvid.c
+++ b/libavformat/bethsoftvid.c
@@ -49,13 +49,14 @@
     int bethsoft_global_delay;
     int video_index;        /**< video stream index */
     int audio_index;        /**< audio stream index */
-    uint8_t *palette;
+    int has_palette;
+    uint8_t palette[BVID_PALETTE_SIZE];
 
     int is_finished;
 
 } BVID_DemuxContext;
 
-static int vid_probe(AVProbeData *p)
+static int vid_probe(const AVProbeData *p)
 {
     // little-endian VID tag, file starts with "VID\0"
     if (AV_RL32(p->buf) != MKTAG('V', 'I', 'D', 0))
@@ -146,9 +147,13 @@
     }
 
     do{
-        vidbuf_start = av_fast_realloc(vidbuf_start, &vidbuf_capacity, vidbuf_nbytes + BUFFER_PADDING_SIZE);
-        if(!vidbuf_start)
-            return AVERROR(ENOMEM);
+        uint8_t *tmp = av_fast_realloc(vidbuf_start, &vidbuf_capacity,
+                                       vidbuf_nbytes + BUFFER_PADDING_SIZE);
+        if (!tmp) {
+            ret = AVERROR(ENOMEM);
+            goto fail;
+        }
+        vidbuf_start = tmp;
 
         code = avio_r8(pb);
         vidbuf_start[vidbuf_nbytes++] = code;
@@ -188,7 +193,7 @@
         pkt->flags |= AV_PKT_FLAG_KEY;
 
     /* if there is a new palette available, add it to packet side data */
-    if (vid->palette) {
+    if (vid->has_palette) {
         uint8_t *pdata = av_packet_new_side_data(pkt, AV_PKT_DATA_PALETTE,
                                                  BVID_PALETTE_SIZE);
         if (!pdata) {
@@ -197,8 +202,7 @@
             goto fail;
         }
         memcpy(pdata, vid->palette, BVID_PALETTE_SIZE);
-
-        av_freep(&vid->palette);
+        vid->has_palette = 0;
     }
 
     vid->nframes--;  // used to check if all the frames were read
@@ -222,17 +226,14 @@
     block_type = avio_r8(pb);
     switch(block_type){
         case PALETTE_BLOCK:
-            if (vid->palette) {
+            if (vid->has_palette) {
                 av_log(s, AV_LOG_WARNING, "discarding unused palette\n");
-                av_freep(&vid->palette);
+                vid->has_palette = 0;
             }
-            vid->palette = av_malloc(BVID_PALETTE_SIZE);
-            if (!vid->palette)
-                return AVERROR(ENOMEM);
             if (avio_read(pb, vid->palette, BVID_PALETTE_SIZE) != BVID_PALETTE_SIZE) {
-                av_freep(&vid->palette);
                 return AVERROR(EIO);
             }
+            vid->has_palette = 1;
             return vid_read_packet(s, pkt);
 
         case FIRST_AUDIO_BLOCK:
@@ -284,13 +285,6 @@
     }
 }
 
-static int vid_read_close(AVFormatContext *s)
-{
-    BVID_DemuxContext *vid = s->priv_data;
-    av_freep(&vid->palette);
-    return 0;
-}
-
 AVInputFormat ff_bethsoftvid_demuxer = {
     .name           = "bethsoftvid",
     .long_name      = NULL_IF_CONFIG_SMALL("Bethesda Softworks VID"),
@@ -298,5 +292,4 @@
     .read_probe     = vid_probe,
     .read_header    = vid_read_header,
     .read_packet    = vid_read_packet,
-    .read_close     = vid_read_close,
 };
diff --git a/libavformat/bfi.c b/libavformat/bfi.c
index 6c98e33..29e2cf8 100644
--- a/libavformat/bfi.c
+++ b/libavformat/bfi.c
@@ -39,7 +39,7 @@
     int avflag;
 } BFIContext;
 
-static int bfi_probe(AVProbeData * p)
+static int bfi_probe(const AVProbeData * p)
 {
     /* Check file header */
     if (AV_RL32(p->buf) == MKTAG('B', 'F', '&', 'I'))
@@ -54,7 +54,7 @@
     AVIOContext *pb = s->pb;
     AVStream *vstream;
     AVStream *astream;
-    int fps, chunk_header;
+    int ret, fps, chunk_header;
 
     /* Initialize the video codec... */
     vstream = avformat_new_stream(s, NULL);
@@ -80,12 +80,9 @@
 
     /*Load the palette to extradata */
     avio_skip(pb, 8);
-    vstream->codecpar->extradata      = av_malloc(768);
-    if (!vstream->codecpar->extradata)
-        return AVERROR(ENOMEM);
-    vstream->codecpar->extradata_size = 768;
-    avio_read(pb, vstream->codecpar->extradata,
-               vstream->codecpar->extradata_size);
+    ret = ff_get_extradata(s, vstream->codecpar, pb, 768);
+    if (ret < 0)
+        return ret;
 
     astream->codecpar->sample_rate = avio_rl32(pb);
     if (astream->codecpar->sample_rate <= 0) {
diff --git a/libavformat/bink.c b/libavformat/bink.c
index 567a38c..08125ba 100644
--- a/libavformat/bink.c
+++ b/libavformat/bink.c
@@ -56,10 +56,11 @@
     int64_t audio_pts[BINK_MAX_AUDIO_TRACKS];
 
     uint32_t remain_packet_size;
+    int flags;
     int smush_size;
 } BinkDemuxContext;
 
-static int probe(AVProbeData *p)
+static int probe(const AVProbeData *p)
 {
     const uint8_t *b = p->buf;
     int smush = AV_RN32(p->buf) == AV_RN32("SMUS");
@@ -90,6 +91,7 @@
     unsigned int i;
     uint32_t pos, next_pos;
     uint16_t flags;
+    int next_keyframe = 1;
     int keyframe;
     int ret;
     uint32_t signature;
@@ -150,8 +152,8 @@
         vst->codecpar->codec_id = AV_CODEC_ID_NONE;
     }
 
-    if (ff_get_extradata(s, vst->codecpar, pb, 4) < 0)
-        return AVERROR(ENOMEM);
+    if ((ret = ff_get_extradata(s, vst->codecpar, pb, 4)) < 0)
+        return ret;
 
     bink->num_audio_tracks = avio_rl32(pb);
 
@@ -190,8 +192,8 @@
                 ast->codecpar->channels       = 1;
                 ast->codecpar->channel_layout = AV_CH_LAYOUT_MONO;
             }
-            if (ff_alloc_extradata(ast->codecpar, 4))
-                return AVERROR(ENOMEM);
+            if ((ret = ff_alloc_extradata(ast->codecpar, 4)) < 0)
+                return ret;
             AV_WL32(ast->codecpar->extradata, vst->codecpar->codec_tag);
         }
 
@@ -203,12 +205,13 @@
     next_pos = avio_rl32(pb);
     for (i = 0; i < vst->duration; i++) {
         pos = next_pos;
+        keyframe = next_keyframe;
         if (i == vst->duration - 1) {
             next_pos = bink->file_size;
-            keyframe = 0;
+            next_keyframe = 0;
         } else {
             next_pos = avio_rl32(pb);
-            keyframe = pos & 1;
+            next_keyframe = next_pos & 1;
         }
         pos &= ~1;
         next_pos &= ~1;
@@ -254,6 +257,7 @@
         }
 
         bink->remain_packet_size = st->index_entries[index_entry].size;
+        bink->flags = st->index_entries[index_entry].flags;
         bink->current_track = 0;
     }
 
@@ -290,7 +294,8 @@
         return ret;
     pkt->stream_index = 0;
     pkt->pts = bink->video_pts++;
-    pkt->flags |= AV_PKT_FLAG_KEY;
+    if (bink->flags & AVINDEX_KEYFRAME)
+        pkt->flags |= AV_PKT_FLAG_KEY;
 
     /* -1 instructs the next call to read_packet() to read the next frame */
     bink->current_track = -1;
@@ -302,13 +307,15 @@
 {
     BinkDemuxContext *bink = s->priv_data;
     AVStream *vst = s->streams[0];
+    int64_t ret;
 
     if (!(s->pb->seekable & AVIO_SEEKABLE_NORMAL))
         return -1;
 
     /* seek to the first frame */
-    if (avio_seek(s->pb, vst->index_entries[0].pos + bink->smush_size, SEEK_SET) < 0)
-        return -1;
+    ret = avio_seek(s->pb, vst->index_entries[0].pos + bink->smush_size, SEEK_SET);
+    if (ret < 0)
+        return ret;
 
     bink->video_pts = 0;
     memset(bink->audio_pts, 0, sizeof(bink->audio_pts));
diff --git a/libavformat/bintext.c b/libavformat/bintext.c
index 0b499d9..7dab5f3 100644
--- a/libavformat/bintext.c
+++ b/libavformat/bintext.c
@@ -126,7 +126,7 @@
         par->width = fsize > 4000 ? (160<<3) : (80<<3);
 }
 
-static int bin_probe(AVProbeData *p)
+static int bin_probe(const AVProbeData *p)
 {
     const uint8_t *d = p->buf;
     int magic = 0, sauce = 0;
@@ -149,7 +149,7 @@
             return AVPROBE_SCORE_EXTENSION + 1;
 
         predict_width(&par, p->buf_size, got_width);
-        if (par.width <= 0)
+        if (par.width < 8)
             return 0;
         calculate_height(&par, p->buf_size);
         if (par.height <= 0)
@@ -177,14 +177,14 @@
 {
     BinDemuxContext *bin = s->priv_data;
     AVIOContext *pb = s->pb;
-
+    int ret;
     AVStream *st = init_stream(s);
     if (!st)
         return AVERROR(ENOMEM);
     st->codecpar->codec_id    = AV_CODEC_ID_BINTEXT;
 
-    if (ff_alloc_extradata(st->codecpar, 2))
-        return AVERROR(ENOMEM);
+    if ((ret = ff_alloc_extradata(st->codecpar, 2)) < 0)
+        return ret;
     st->codecpar->extradata[0] = 16;
     st->codecpar->extradata[1] = 0;
 
@@ -195,6 +195,8 @@
             next_tag_read(s, &bin->fsize);
         if (!bin->width) {
             predict_width(st->codecpar, bin->fsize, got_width);
+            if (st->codecpar->width < 8)
+                return AVERROR_INVALIDDATA;
             calculate_height(st->codecpar, bin->fsize);
         }
         avio_seek(pb, 0, SEEK_SET);
@@ -204,7 +206,7 @@
 #endif /* CONFIG_BINTEXT_DEMUXER */
 
 #if CONFIG_XBIN_DEMUXER
-static int xbin_probe(AVProbeData *p)
+static int xbin_probe(const AVProbeData *p)
 {
     const uint8_t *d = p->buf;
 
@@ -220,7 +222,7 @@
     BinDemuxContext *bin = s->priv_data;
     AVIOContext *pb = s->pb;
     char fontheight, flags;
-
+    int ret;
     AVStream *st = init_stream(s);
     if (!st)
         return AVERROR(ENOMEM);
@@ -239,8 +241,9 @@
         st->codecpar->extradata_size += fontheight * (flags & 0x10 ? 512 : 256);
     st->codecpar->codec_id    = flags & 4 ? AV_CODEC_ID_XBIN : AV_CODEC_ID_BINTEXT;
 
-    if (ff_alloc_extradata(st->codecpar, st->codecpar->extradata_size))
-        return AVERROR(ENOMEM);
+    ret = ff_alloc_extradata(st->codecpar, st->codecpar->extradata_size);
+    if (ret < 0)
+        return ret;
     st->codecpar->extradata[0] = fontheight;
     st->codecpar->extradata[1] = flags;
     if (avio_read(pb, st->codecpar->extradata + 2, st->codecpar->extradata_size - 2) < 0)
@@ -262,6 +265,7 @@
     BinDemuxContext *bin = s->priv_data;
     AVIOContext *pb = s->pb;
     AVStream *st;
+    int ret;
 
     if (avio_r8(pb) != 1)
         return AVERROR_INVALIDDATA;
@@ -271,8 +275,8 @@
         return AVERROR(ENOMEM);
     st->codecpar->codec_id    = AV_CODEC_ID_BINTEXT;
 
-    if (ff_alloc_extradata(st->codecpar, 2 + 48 + 4096))
-        return AVERROR(ENOMEM);
+    if ((ret = ff_alloc_extradata(st->codecpar, 2 + 48 + 4096)) < 0)
+        return ret;
     st->codecpar->extradata[0] = 16;
     st->codecpar->extradata[1] = BINTEXT_PALETTE|BINTEXT_FONT;
 
@@ -302,7 +306,7 @@
     0x04, 0x31, 0x2e, 0x34, 0x00, 0x00, 0x00, 0x00, 0x4f, 0x00, 0x15, 0x00
 };
 
-static int idf_probe(AVProbeData *p)
+static int idf_probe(const AVProbeData *p)
 {
     if (p->buf_size < sizeof(idf_magic))
         return 0;
@@ -316,7 +320,7 @@
     BinDemuxContext *bin = s->priv_data;
     AVIOContext *pb = s->pb;
     AVStream *st;
-    int got_width = 0;
+    int got_width = 0, ret;
 
     if (!(pb->seekable & AVIO_SEEKABLE_NORMAL))
         return AVERROR(EIO);
@@ -326,8 +330,8 @@
         return AVERROR(ENOMEM);
     st->codecpar->codec_id    = AV_CODEC_ID_IDF;
 
-    if (ff_alloc_extradata(st->codecpar, 2 + 48 + 4096))
-        return AVERROR(ENOMEM);
+    if ((ret = ff_alloc_extradata(st->codecpar, 2 + 48 + 4096)) < 0)
+        return ret;
     st->codecpar->extradata[0] = 16;
     st->codecpar->extradata[1] = BINTEXT_PALETTE|BINTEXT_FONT;
 
diff --git a/libavformat/bit.c b/libavformat/bit.c
index 76aae2d..2dc7d4f 100644
--- a/libavformat/bit.c
+++ b/libavformat/bit.c
@@ -30,7 +30,7 @@
 #define BIT_1      0x81
 
 #if CONFIG_BIT_DEMUXER
-static int probe(AVProbeData *p)
+static int probe(const AVProbeData *p)
 {
     int i = 0, j, valid = 0;
 
@@ -94,8 +94,8 @@
     if(ret != 8 * packet_size * sizeof(uint16_t))
         return AVERROR(EIO);
 
-    if (av_new_packet(pkt, packet_size) < 0)
-        return AVERROR(ENOMEM);
+    if ((ret = av_new_packet(pkt, packet_size)) < 0)
+        return ret;
 
     init_put_bits(&pbo, pkt->data, packet_size);
     for(j=0; j < packet_size; j++)
diff --git a/libavformat/bmv.c b/libavformat/bmv.c
index ac567c2..9f03fba 100644
--- a/libavformat/bmv.c
+++ b/libavformat/bmv.c
@@ -96,8 +96,8 @@
                        audio_size, c->size);
                 return AVERROR_INVALIDDATA;
             }
-            if (av_new_packet(pkt, audio_size) < 0)
-                return AVERROR(ENOMEM);
+            if ((err = av_new_packet(pkt, audio_size)) < 0)
+                return err;
             memcpy(pkt->data, c->packet + 1, pkt->size);
             pkt->stream_index = 1;
             pkt->pts          = c->audio_pos;
@@ -108,8 +108,8 @@
         } else
             break;
     }
-    if (av_new_packet(pkt, c->size + 1) < 0)
-        return AVERROR(ENOMEM);
+    if ((err = av_new_packet(pkt, c->size + 1)) < 0)
+        return err;
     pkt->stream_index = 0;
     c->get_next = 1;
     memcpy(pkt->data, c->packet, pkt->size);
diff --git a/libavformat/boadec.c b/libavformat/boadec.c
index 730e957..495090c 100644
--- a/libavformat/boadec.c
+++ b/libavformat/boadec.c
@@ -24,7 +24,7 @@
 #include "avformat.h"
 #include "internal.h"
 
-static int probe(AVProbeData *p)
+static int probe(const AVProbeData *p)
 {
     if (p->buf_size < 2096)
         return 0;
diff --git a/libavformat/brstm.c b/libavformat/brstm.c
index 87690e3..ca965ed 100644
--- a/libavformat/brstm.c
+++ b/libavformat/brstm.c
@@ -38,7 +38,7 @@
     int         little_endian;
 } BRSTMDemuxContext;
 
-static int probe(AVProbeData *p)
+static int probe(const AVProbeData *p)
 {
     if (AV_RL32(p->buf) == MKTAG('R','S','T','M') &&
         (AV_RL16(p->buf + 4) == 0xFFFE ||
@@ -47,7 +47,7 @@
     return 0;
 }
 
-static int probe_bfstm(AVProbeData *p)
+static int probe_bfstm(const AVProbeData *p)
 {
     if ((AV_RL32(p->buf) == MKTAG('F','S','T','M') ||
          AV_RL32(p->buf) == MKTAG('C','S','T','M')) &&
@@ -403,8 +403,8 @@
             (32 + 4 + size) > (INT_MAX / par->channels) ||
             (32 + 4 + size) * par->channels > INT_MAX - 8)
             return AVERROR_INVALIDDATA;
-        if (av_new_packet(pkt, 8 + (32 + 4 + size) * par->channels) < 0)
-            return AVERROR(ENOMEM);
+        if ((ret = av_new_packet(pkt, 8 + (32 + 4 + size) * par->channels)) < 0)
+            return ret;
         dst = pkt->data;
         if (par->codec_id == AV_CODEC_ID_ADPCM_THP_LE) {
             bytestream_put_le32(&dst, size * par->channels);
@@ -422,8 +422,7 @@
             dst += size;
             avio_skip(s->pb, skip);
             if (ret != size) {
-                av_packet_unref(pkt);
-                break;
+                return AVERROR(EIO);
             }
         }
         pkt->duration = samples;
diff --git a/libavformat/c93.c b/libavformat/c93.c
index b1a245a..256b980 100644
--- a/libavformat/c93.c
+++ b/libavformat/c93.c
@@ -43,7 +43,7 @@
     AVStream *audio;
 } C93DemuxContext;
 
-static int probe(AVProbeData *p)
+static int probe(const AVProbeData *p)
 {
     int i;
     int index = 1;
@@ -158,22 +158,19 @@
 
     ret = avio_read(pb, pkt->data + 1, datasize);
     if (ret < datasize) {
-        ret = AVERROR(EIO);
-        goto fail;
+        return AVERROR(EIO);
     }
 
     datasize = avio_rl16(pb); /* palette size */
     if (datasize) {
         if (datasize != 768) {
             av_log(s, AV_LOG_ERROR, "invalid palette size %u\n", datasize);
-            ret = AVERROR_INVALIDDATA;
-            goto fail;
+            return AVERROR_INVALIDDATA;
         }
         pkt->data[0] |= C93_HAS_PALETTE;
         ret = avio_read(pb, pkt->data + pkt->size, datasize);
         if (ret < datasize) {
-            ret = AVERROR(EIO);
-            goto fail;
+            return AVERROR(EIO);
         }
         pkt->size += 768;
     }
@@ -186,10 +183,6 @@
         pkt->data[0] |= C93_FIRST_FRAME;
     }
     return 0;
-
-    fail:
-    av_packet_unref(pkt);
-    return ret;
 }
 
 AVInputFormat ff_c93_demuxer = {
diff --git a/libavformat/cache.c b/libavformat/cache.c
index 66bbbf5..09e5d5f 100644
--- a/libavformat/cache.c
+++ b/libavformat/cache.c
@@ -54,6 +54,7 @@
 typedef struct Context {
     AVClass *class;
     int fd;
+    char *filename;
     struct AVTreeNode *root;
     int64_t logical_pos;
     int64_t cache_pos;
@@ -72,6 +73,7 @@
 
 static int cache_open(URLContext *h, const char *arg, int flags, AVDictionary **options)
 {
+    int ret;
     char *buffername;
     Context *c= h->priv_data;
 
@@ -83,8 +85,12 @@
         return c->fd;
     }
 
-    unlink(buffername);
-    av_freep(&buffername);
+    ret = unlink(buffername);
+
+    if (ret >= 0)
+        av_freep(&buffername);
+    else
+        c->filename = buffername;
 
     return ffurl_open_whitelist(&c->inner, arg, flags, &h->interrupt_callback,
                                 options, h->protocol_whitelist, h->protocol_blacklist, h);
@@ -292,11 +298,18 @@
 static int cache_close(URLContext *h)
 {
     Context *c= h->priv_data;
+    int ret;
 
     av_log(h, AV_LOG_INFO, "Statistics, cache hits:%"PRId64" cache misses:%"PRId64"\n",
            c->cache_hit, c->cache_miss);
 
     close(c->fd);
+    if (c->filename) {
+        ret = unlink(c->filename);
+        if (ret < 0)
+            av_log(h, AV_LOG_ERROR, "Could not delete %s.\n", c->filename);
+        av_freep(&c->filename);
+    }
     ffurl_close(c->inner);
     av_tree_enumerate(c->root, NULL, NULL, enu_free);
     av_tree_destroy(c->root);
@@ -313,7 +326,7 @@
 };
 
 static const AVClass cache_context_class = {
-    .class_name = "Cache",
+    .class_name = "cache",
     .item_name  = av_default_item_name,
     .option     = options,
     .version    = LIBAVUTIL_VERSION_INT,
diff --git a/libavformat/cafdec.c b/libavformat/cafdec.c
index 7652d9e..d0f942f 100644
--- a/libavformat/cafdec.c
+++ b/libavformat/cafdec.c
@@ -48,7 +48,7 @@
     int64_t data_size;              ///< raw data size, in bytes
 } CafContext;
 
-static int probe(AVProbeData *p)
+static int probe(const AVProbeData *p)
 {
     if (AV_RB32(p->buf) == MKBETAG('c','a','f','f') && AV_RB16(&p->buf[4]) == 1)
         return AVPROBE_SCORE_MAX;
@@ -100,6 +100,7 @@
 {
     AVIOContext *pb = s->pb;
     AVStream *st      = s->streams[0];
+    int ret;
 
     if (size < 0 || size > INT_MAX - AV_INPUT_BUFFER_PADDING_SIZE)
         return -1;
@@ -134,9 +135,8 @@
             return AVERROR_INVALIDDATA;
         }
 
-        av_freep(&st->codecpar->extradata);
-        if (ff_alloc_extradata(st->codecpar, ALAC_HEADER))
-            return AVERROR(ENOMEM);
+        if ((ret = ff_alloc_extradata(st->codecpar, ALAC_HEADER)) < 0)
+            return ret;
 
         /* For the old style cookie, we skip 12 bytes, then read 36 bytes.
          * The new style cookie only contains the last 24 bytes of what was
@@ -174,10 +174,8 @@
             return AVERROR_PATCHWELCOME;
         }
         avio_skip(pb, size);
-    } else {
-        av_freep(&st->codecpar->extradata);
-        if (ff_get_extradata(s, st->codecpar, pb, size) < 0)
-            return AVERROR(ENOMEM);
+    } else if ((ret = ff_get_extradata(s, st->codecpar, pb, size)) < 0) {
+        return ret;
     }
 
     return 0;
@@ -310,6 +308,8 @@
                    "skipping CAF chunk: %08"PRIX32" (%s), size %"PRId64"\n",
                    tag, av_fourcc2str(av_bswap32(tag)), size);
         case MKBETAG('f','r','e','e'):
+            if (size < 0 && found_data)
+                goto found_data;
             if (size < 0)
                 return AVERROR_INVALIDDATA;
             break;
@@ -325,6 +325,7 @@
     if (!found_data)
         return AVERROR_INVALIDDATA;
 
+found_data:
     if (caf->bytes_per_packet > 0 && caf->frames_per_packet > 0) {
         if (caf->data_size > 0)
             st->nb_frames = (caf->data_size / caf->bytes_per_packet) * caf->frames_per_packet;
diff --git a/libavformat/cafenc.c b/libavformat/cafenc.c
index 0f7c4eb..98d4d92 100644
--- a/libavformat/cafenc.c
+++ b/libavformat/cafenc.c
@@ -203,7 +203,6 @@
     avio_wb64(pb, -1);        //< mChunkSize
     avio_wb32(pb, 0);         //< mEditCount
 
-    avio_flush(pb);
     return 0;
 }
 
@@ -259,7 +258,6 @@
             avio_write(pb, caf->pkt_sizes, caf->size_entries_used);
             caf->size_buffer_size = 0;
         }
-        avio_flush(pb);
     }
     av_freep(&caf->pkt_sizes);
     return 0;
diff --git a/libavformat/cavsvideodec.c b/libavformat/cavsvideodec.c
index b4da58e..8900b97 100644
--- a/libavformat/cavsvideodec.c
+++ b/libavformat/cavsvideodec.c
@@ -30,7 +30,7 @@
 #define CAVS_VIDEO_EDIT_CODE      0x000001b7
 #define CAVS_PROFILE_JIZHUN       0x20
 
-static int cavsvideo_probe(AVProbeData *p)
+static int cavsvideo_probe(const AVProbeData *p)
 {
     uint32_t code= -1;
     int pic=0, seq=0, slice_pos = 0;
diff --git a/libavformat/cdxl.c b/libavformat/cdxl.c
index 94a063c..5718fc3 100644
--- a/libavformat/cdxl.c
+++ b/libavformat/cdxl.c
@@ -40,7 +40,7 @@
     int64_t     filesize;
 } CDXLDemuxContext;
 
-static int cdxl_read_probe(AVProbeData *p)
+static int cdxl_read_probe(const AVProbeData *p)
 {
     int score = AVPROBE_SCORE_EXTENSION + 10;
 
@@ -131,7 +131,8 @@
     height       = AV_RB16(&cdxl->header[16]);
     palette_size = AV_RB16(&cdxl->header[20]);
     audio_size   = AV_RB16(&cdxl->header[22]);
-    if (FFALIGN(width, 16) * (uint64_t)height * cdxl->header[19] > INT_MAX)
+    if (cdxl->header[19] == 0 ||
+        FFALIGN(width, 16) * (uint64_t)height * cdxl->header[19] > INT_MAX)
         return AVERROR_INVALIDDATA;
     if (format == 0x20)
         image_size = width * height * cdxl->header[19] / 8;
@@ -201,12 +202,11 @@
                 avpriv_set_pts_info(st, 64, 1, cdxl->sample_rate);
         }
 
-        if (av_new_packet(pkt, video_size + CDXL_HEADER_SIZE) < 0)
-            return AVERROR(ENOMEM);
+        if ((ret = av_new_packet(pkt, video_size + CDXL_HEADER_SIZE)) < 0)
+            return ret;
         memcpy(pkt->data, cdxl->header, CDXL_HEADER_SIZE);
         ret = avio_read(pb, pkt->data + CDXL_HEADER_SIZE, video_size);
         if (ret < 0) {
-            av_packet_unref(pkt);
             return ret;
         }
         av_shrink_packet(pkt, CDXL_HEADER_SIZE + ret);
diff --git a/libavformat/chromaprint.c b/libavformat/chromaprint.c
index f39c09d..0cd7cde 100644
--- a/libavformat/chromaprint.c
+++ b/libavformat/chromaprint.c
@@ -73,7 +73,7 @@
     if (cpr->silence_threshold != -1) {
 #if CPR_VERSION_INT >= AV_VERSION_INT(0, 7, 0)
         if (!chromaprint_set_option(cpr->ctx, "silence_threshold", cpr->silence_threshold)) {
-            av_log(s, AV_LOG_ERROR, "Failed to set silence threshold.\n");
+            av_log(s, AV_LOG_ERROR, "Failed to set silence threshold. Setting silence_threshold requires -algorithm 3 option.\n");
             goto fail;
         }
 #else
@@ -114,14 +114,15 @@
 static int write_packet(AVFormatContext *s, AVPacket *pkt)
 {
     ChromaprintMuxContext *cpr = s->priv_data;
-    return chromaprint_feed(cpr->ctx, pkt->data, pkt->size / 2) ? 0 : AVERROR(EINVAL);
+    return chromaprint_feed(cpr->ctx, (const int16_t *)pkt->data, pkt->size / 2) ? 0 : AVERROR(EINVAL);
 }
 
 static int write_trailer(AVFormatContext *s)
 {
     ChromaprintMuxContext *cpr = s->priv_data;
     AVIOContext *pb = s->pb;
-    void *fp = NULL, *enc_fp = NULL;
+    void *fp = NULL;
+    char *enc_fp = NULL;
     int size, enc_size, ret = AVERROR(EINVAL);
 
     if (!chromaprint_finish(cpr->ctx)) {
@@ -129,14 +130,14 @@
         goto fail;
     }
 
-    if (!chromaprint_get_raw_fingerprint(cpr->ctx, &fp, &size)) {
+    if (!chromaprint_get_raw_fingerprint(cpr->ctx, (uint32_t **)&fp, &size)) {
         av_log(s, AV_LOG_ERROR, "Failed to retrieve fingerprint\n");
         goto fail;
     }
 
     switch (cpr->fp_format) {
     case FINGERPRINT_RAW:
-        avio_write(pb, fp, size);
+        avio_write(pb, fp, size * 4); //fp points to array of uint32_t
         break;
     case FINGERPRINT_COMPRESSED:
     case FINGERPRINT_BASE64:
@@ -164,7 +165,7 @@
 static const AVOption options[] = {
     { "silence_threshold", "threshold for detecting silence", OFFSET(silence_threshold), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 32767, FLAGS },
     { "algorithm", "version of the fingerprint algorithm", OFFSET(algorithm), AV_OPT_TYPE_INT, { .i64 = CHROMAPRINT_ALGORITHM_DEFAULT }, CHROMAPRINT_ALGORITHM_TEST1, INT_MAX, FLAGS },
-    { "fp_format", "fingerprint format to write", OFFSET(fp_format), AV_OPT_TYPE_INT, { .i64 = FINGERPRINT_BASE64 }, FINGERPRINT_RAW, FINGERPRINT_BASE64, FLAGS },
+    { "fp_format", "fingerprint format to write", OFFSET(fp_format), AV_OPT_TYPE_INT, { .i64 = FINGERPRINT_BASE64 }, FINGERPRINT_RAW, FINGERPRINT_BASE64, FLAGS, "fp_format" },
     { "raw", "binary raw fingerprint", 0, AV_OPT_TYPE_CONST, {.i64 = FINGERPRINT_RAW }, INT_MIN, INT_MAX, FLAGS, "fp_format"},
     { "compressed", "binary compressed fingerprint", 0, AV_OPT_TYPE_CONST, {.i64 = FINGERPRINT_COMPRESSED }, INT_MIN, INT_MAX, FLAGS, "fp_format"},
     { "base64", "Base64 compressed fingerprint", 0, AV_OPT_TYPE_CONST, {.i64 = FINGERPRINT_BASE64 }, INT_MIN, INT_MAX, FLAGS, "fp_format"},
diff --git a/libavformat/cinedec.c b/libavformat/cinedec.c
index de34fb9..0f2453c 100644
--- a/libavformat/cinedec.c
+++ b/libavformat/cinedec.c
@@ -56,7 +56,7 @@
 #define CFA_BLGRAY  0x20000000U
 #define CFA_BRGRAY  0x10000000U
 
-static int cine_read_probe(AVProbeData *p)
+static int cine_read_probe(const AVProbeData *p)
 {
     int HeaderSize;
     if (p->buf[0] == 'C' && p->buf[1] == 'I' &&  // Type
@@ -168,6 +168,10 @@
     avio_skip(pb, 616); // Binning .. bFlipH
     if (!avio_rl32(pb) ^ vflip) {
         st->codecpar->extradata  = av_strdup("BottomUp");
+        if (!st->codecpar->extradata) {
+            st->codecpar->extradata_size = 0;
+            return AVERROR(ENOMEM);
+        }
         st->codecpar->extradata_size  = 9;
     }
 
diff --git a/libavformat/codec2.c b/libavformat/codec2.c
index 28dbbd8..0d7c488 100644
--- a/libavformat/codec2.c
+++ b/libavformat/codec2.c
@@ -43,7 +43,7 @@
     int frames_per_packet;
 } Codec2Context;
 
-static int codec2_probe(AVProbeData *p)
+static int codec2_probe(const AVProbeData *p)
 {
     //must start wih C0 DE C2
     if (AV_RB24(p->buf) != AVPRIV_CODEC2_MAGIC) {
diff --git a/libavformat/concat.c b/libavformat/concat.c
index 19c83c3..ea3bc1d 100644
--- a/libavformat/concat.c
+++ b/libavformat/concat.c
@@ -38,6 +38,7 @@
     struct concat_nodes *nodes;    ///< list of nodes to concat
     size_t               length;   ///< number of cat'ed nodes
     size_t               current;  ///< index of currently read node
+    uint64_t total_size;
 };
 
 static av_cold int concat_close(URLContext *h)
@@ -59,7 +60,7 @@
 {
     char *node_uri = NULL;
     int err = 0;
-    int64_t size;
+    int64_t size, total_size = 0;
     size_t len, i;
     URLContext *uc;
     struct concat_data  *data = h->priv_data;
@@ -112,6 +113,7 @@
         /* assembling */
         nodes[i].uc   = uc;
         nodes[i].size = size;
+        total_size += size;
     }
     av_free(node_uri);
     data->length = i;
@@ -123,6 +125,7 @@
         err = AVERROR(ENOMEM);
     } else
         data->nodes = nodes;
+    data->total_size = total_size;
     return err;
 }
 
@@ -158,6 +161,8 @@
     struct concat_nodes *nodes = data->nodes;
     size_t i;
 
+    if ((whence & AVSEEK_SIZE))
+        return data->total_size;
     switch (whence) {
     case SEEK_END:
         for (i = data->length - 1; i && pos < -nodes[i].size; i--)
diff --git a/libavformat/concatdec.c b/libavformat/concatdec.c
index bbe1313..2173911 100644
--- a/libavformat/concatdec.c
+++ b/libavformat/concatdec.c
@@ -45,6 +45,7 @@
     int64_t file_start_time;
     int64_t file_inpoint;
     int64_t duration;
+    int64_t user_duration;
     int64_t next_dts;
     ConcatStream *streams;
     int64_t inpoint;
@@ -67,7 +68,7 @@
     int segment_time_metadata;
 } ConcatContext;
 
-static int concat_probe(AVProbeData *probe)
+static int concat_probe(const AVProbeData *probe)
 {
     return memcmp(probe->buf, "ffconcat version 1.0", 20) ?
            0 : AVPROBE_SCORE_MAX;
@@ -154,6 +155,7 @@
     file->next_dts   = AV_NOPTS_VALUE;
     file->inpoint    = AV_NOPTS_VALUE;
     file->outpoint   = AV_NOPTS_VALUE;
+    file->user_duration = AV_NOPTS_VALUE;
 
     return 0;
 
@@ -169,10 +171,6 @@
 
     if (st->codecpar->codec_id || !source_st->codecpar->codec_id) {
         if (st->codecpar->extradata_size < source_st->codecpar->extradata_size) {
-            if (st->codecpar->extradata) {
-                av_freep(&st->codecpar->extradata);
-                st->codecpar->extradata_size = 0;
-            }
             ret = ff_alloc_extradata(st->codecpar,
                                      source_st->codecpar->extradata_size);
             if (ret < 0)
@@ -314,6 +312,19 @@
     return 0;
 }
 
+static int64_t get_best_effort_duration(ConcatFile *file, AVFormatContext *avf)
+{
+    if (file->user_duration != AV_NOPTS_VALUE)
+        return file->user_duration;
+    if (file->outpoint != AV_NOPTS_VALUE)
+        return file->outpoint - file->file_inpoint;
+    if (avf->duration > 0)
+        return avf->duration - (file->file_inpoint - file->file_start_time);
+    if (file->next_dts != AV_NOPTS_VALUE)
+        return file->next_dts - file->file_inpoint;
+    return AV_NOPTS_VALUE;
+}
+
 static int open_file(AVFormatContext *avf, unsigned fileno)
 {
     ConcatContext *cat = avf->priv_data;
@@ -340,14 +351,12 @@
         return ret;
     }
     cat->cur_file = file;
-    if (file->start_time == AV_NOPTS_VALUE)
-        file->start_time = !fileno ? 0 :
-                           cat->files[fileno - 1].start_time +
-                           cat->files[fileno - 1].duration;
+    file->start_time = !fileno ? 0 :
+                       cat->files[fileno - 1].start_time +
+                       cat->files[fileno - 1].duration;
     file->file_start_time = (cat->avf->start_time == AV_NOPTS_VALUE) ? 0 : cat->avf->start_time;
     file->file_inpoint = (file->inpoint == AV_NOPTS_VALUE) ? file->file_start_time : file->inpoint;
-    if (file->duration == AV_NOPTS_VALUE && file->outpoint != AV_NOPTS_VALUE)
-        file->duration = file->outpoint - file->file_inpoint;
+    file->duration = get_best_effort_duration(file, cat->avf);
 
     if (cat->segment_time_metadata) {
         av_dict_set_int(&file->metadata, "lavf.concatdec.start_time", file->start_time, 0);
@@ -425,7 +434,7 @@
                 goto fail;
             }
             if (!strcmp(keyword, "duration"))
-                file->duration = dur;
+                file->user_duration = dur;
             else if (!strcmp(keyword, "inpoint"))
                 file->inpoint = dur;
             else if (!strcmp(keyword, "outpoint"))
@@ -484,12 +493,13 @@
             cat->files[i].start_time = time;
         else
             time = cat->files[i].start_time;
-        if (cat->files[i].duration == AV_NOPTS_VALUE) {
+        if (cat->files[i].user_duration == AV_NOPTS_VALUE) {
             if (cat->files[i].inpoint == AV_NOPTS_VALUE || cat->files[i].outpoint == AV_NOPTS_VALUE)
                 break;
-            cat->files[i].duration = cat->files[i].outpoint - cat->files[i].inpoint;
+            cat->files[i].user_duration = cat->files[i].outpoint - cat->files[i].inpoint;
         }
-        time += cat->files[i].duration;
+        cat->files[i].duration = cat->files[i].user_duration;
+        time += cat->files[i].user_duration;
     }
     if (i == cat->nb_files) {
         avf->duration = time;
@@ -514,14 +524,7 @@
     ConcatContext *cat = avf->priv_data;
     unsigned fileno = cat->cur_file - cat->files;
 
-    if (cat->cur_file->duration == AV_NOPTS_VALUE) {
-        if (cat->avf->duration > 0 || cat->cur_file->next_dts == AV_NOPTS_VALUE) {
-            cat->cur_file->duration = cat->avf->duration;
-        } else {
-            cat->cur_file->duration = cat->cur_file->next_dts;
-        }
-        cat->cur_file->duration -= (cat->cur_file->file_inpoint - cat->cur_file->file_start_time);
-    }
+    cat->cur_file->duration = get_best_effort_duration(cat->cur_file, cat->avf);
 
     if (++fileno >= cat->nb_files) {
         cat->eof = 1;
@@ -539,7 +542,6 @@
         if (ret < 0) {
             av_log(avf, AV_LOG_ERROR, "h264_mp4toannexb filter "
                    "failed to send input packet\n");
-            av_packet_unref(pkt);
             return ret;
         }
 
@@ -589,7 +591,6 @@
         if (ret < 0)
             return ret;
         if ((ret = match_streams(avf)) < 0) {
-            av_packet_unref(pkt);
             return ret;
         }
         if (packet_after_outpoint(cat, pkt)) {
@@ -605,7 +606,7 @@
         }
         break;
     }
-    if ((ret = filter_packet(avf, cs, pkt)))
+    if ((ret = filter_packet(avf, cs, pkt)) < 0)
         return ret;
 
     st = cat->avf->streams[pkt->stream_index];
@@ -692,6 +693,13 @@
 
     left  = 0;
     right = cat->nb_files;
+
+    /* Always support seek to start */
+    if (ts <= 0)
+        right = 1;
+    else if (!cat->seekable)
+        return AVERROR(ESPIPE); /* XXX: can we use it? */
+
     while (right - left > 1) {
         int mid = (left + right) / 2;
         if (ts < cat->files[mid].start_time)
@@ -728,8 +736,6 @@
     AVFormatContext *cur_avf_saved = cat->avf;
     int ret;
 
-    if (!cat->seekable)
-        return AVERROR(ESPIPE); /* XXX: can we use it? */
     if (flags & (AVSEEK_FLAG_BYTE | AVSEEK_FLAG_FRAME))
         return AVERROR(ENOSYS);
     cat->avf = NULL;
diff --git a/libavformat/dashdec.c b/libavformat/dashdec.c
index 497e7e4..5ba7feb 100644
--- a/libavformat/dashdec.c
+++ b/libavformat/dashdec.c
@@ -85,6 +85,7 @@
 
     enum AVMediaType type;
     char id[20];
+    char *lang;
     int bandwidth;
     AVRational framerate;
     AVStream *assoc_stream; /* demuxer stream associated with this representation */
@@ -122,24 +123,13 @@
 typedef struct DASHContext {
     const AVClass *class;
     char *base_url;
-    char *adaptionset_contenttype_val;
-    char *adaptionset_par_val;
-    char *adaptionset_lang_val;
-    char *adaptionset_minbw_val;
-    char *adaptionset_maxbw_val;
-    char *adaptionset_minwidth_val;
-    char *adaptionset_maxwidth_val;
-    char *adaptionset_minheight_val;
-    char *adaptionset_maxheight_val;
-    char *adaptionset_minframerate_val;
-    char *adaptionset_maxframerate_val;
-    char *adaptionset_segmentalignment_val;
-    char *adaptionset_bitstreamswitching_val;
 
     int n_videos;
     struct representation **videos;
     int n_audios;
     struct representation **audios;
+    int n_subtitles;
+    struct representation **subtitles;
 
     /* MediaPresentationDescription Attribute */
     uint64_t media_presentation_duration;
@@ -155,6 +145,9 @@
     uint64_t period_duration;
     uint64_t period_start;
 
+    /* AdaptationSet Attribute */
+    char *adaptionset_lang;
+
     int is_live;
     AVIOInterruptCB *interrupt_callback;
     char *allowed_extensions;
@@ -361,8 +354,7 @@
     free_fragment(&pls->init_section);
     av_freep(&pls->init_sec_buf);
     av_freep(&pls->pb.buffer);
-    if (pls->input)
-        ff_format_io_close(pls->parent, &pls->input);
+    ff_format_io_close(pls->parent, &pls->input);
     if (pls->ctx) {
         pls->ctx->pb = NULL;
         avformat_close_input(&pls->ctx);
@@ -394,6 +386,17 @@
     c->n_audios = 0;
 }
 
+static void free_subtitle_list(DASHContext *c)
+{
+    int i;
+    for (i = 0; i < c->n_subtitles; i++) {
+        struct representation *pls = c->subtitles[i];
+        free_representation(pls);
+    }
+    av_freep(&c->subtitles);
+    c->n_subtitles = 0;
+}
+
 static int open_url(AVFormatContext *s, AVIOContext **pb, const char *url,
                     AVDictionary *opts, AVDictionary *opts2, int *is_http)
 {
@@ -493,7 +496,7 @@
     }
 
     if (val)
-        av_strlcat(tmp_str, (const char*)val, max_url_size);
+        ff_make_absolute_url(tmp_str, max_url_size, tmp_str, val);
 
     if (rep_id_val) {
         url = av_strireplace(tmp_str, "$RepresentationID$", (const char*)rep_id_val);
@@ -565,6 +568,8 @@
                     type = AVMEDIA_TYPE_VIDEO;
                 } else if (av_stristr((const char *)val, "audio")) {
                     type = AVMEDIA_TYPE_AUDIO;
+                } else if (av_stristr((const char *)val, "text")) {
+                    type = AVMEDIA_TYPE_SUBTITLE;
                 }
                 xmlFree(val);
             }
@@ -694,8 +699,8 @@
     return 0;
 }
 
-static int resolve_content_path(AVFormatContext *s, const char *url, int *max_url_size, xmlNodePtr *baseurl_nodes, int n_baseurl_nodes) {
-
+static int resolve_content_path(AVFormatContext *s, const char *url, int *max_url_size, xmlNodePtr *baseurl_nodes, int n_baseurl_nodes)
+{
     char *tmp_str = NULL;
     char *path = NULL;
     char *mpdName = NULL;
@@ -704,7 +709,6 @@
     char *root_url = NULL;
     char *text = NULL;
     char *tmp = NULL;
-
     int isRootHttp = 0;
     char token ='/';
     int start =  0;
@@ -780,12 +784,22 @@
             continue;
         }
         text = xmlNodeGetContent(baseurl_nodes[i]);
-        if (text) {
+        if (text && !av_strstart(text, "/", NULL)) {
             memset(tmp_str, 0, strlen(tmp_str));
             if (!ishttp(text) && isRootHttp) {
                 av_strlcpy(tmp_str, root_url, size + 1);
             }
             start = (text[0] == token);
+            if (start && av_stristr(tmp_str, text)) {
+                char *p = tmp_str;
+                if (!av_strncasecmp(tmp_str, "http://", 7)) {
+                    p += 7;
+                } else if (!av_strncasecmp(tmp_str, "https://", 8)) {
+                    p += 8;
+                }
+                p = strchr(p, '/');
+                memset(p + 1, 0, strlen(p));
+            }
             av_strlcat(tmp_str, text + start, tmp_max_url_size);
             xmlNodeSetContent(baseurl_nodes[i], tmp_str);
             updated = 1;
@@ -818,6 +832,7 @@
                                          xmlNodePtr adaptionset_supplementalproperty_node)
 {
     int32_t ret = 0;
+    int32_t subtitle_rep_idx = 0;
     int32_t audio_rep_idx = 0;
     int32_t video_rep_idx = 0;
     DASHContext *c = s->priv_data;
@@ -826,7 +841,7 @@
     xmlNodePtr representation_segmenttemplate_node = NULL;
     xmlNodePtr representation_baseurl_node = NULL;
     xmlNodePtr representation_segmentlist_node = NULL;
-    xmlNodePtr segmentlists_tab[2];
+    xmlNodePtr segmentlists_tab[3];
     xmlNodePtr fragment_timeline_node = NULL;
     xmlNodePtr fragment_templates_tab[5];
     char *duration_val = NULL;
@@ -854,13 +869,23 @@
         type = get_content_type(adaptionset_node);
     if (type == AVMEDIA_TYPE_UNKNOWN) {
         av_log(s, AV_LOG_VERBOSE, "Parsing '%s' - skipp not supported representation type\n", url);
-    } else if (type == AVMEDIA_TYPE_VIDEO || type == AVMEDIA_TYPE_AUDIO) {
+    } else if (type == AVMEDIA_TYPE_VIDEO || type == AVMEDIA_TYPE_AUDIO || type == AVMEDIA_TYPE_SUBTITLE) {
         // convert selected representation to our internal struct
         rep = av_mallocz(sizeof(struct representation));
         if (!rep) {
             ret = AVERROR(ENOMEM);
             goto end;
         }
+        if (c->adaptionset_lang) {
+            rep->lang = av_strdup(c->adaptionset_lang);
+            if (!rep->lang) {
+                av_log(s, AV_LOG_ERROR, "alloc language memory failure\n");
+                av_freep(&rep);
+                ret = AVERROR(ENOMEM);
+                goto end;
+            }
+        }
+        rep->parent = s;
         representation_segmenttemplate_node = find_child_node_by_name(representation_node, "SegmentTemplate");
         representation_baseurl_node = find_child_node_by_name(representation_node, "BaseURL");
         representation_segmentlist_node = find_child_node_by_name(representation_node, "SegmentList");
@@ -933,7 +958,7 @@
                 xmlFree(timescale_val);
             }
             if (startnumber_val) {
-                rep->first_seq_no = (int64_t) strtoll(startnumber_val, NULL, 10);
+                rep->start_number = rep->first_seq_no = (int64_t) strtoll(startnumber_val, NULL, 10);
                 av_log(s, AV_LOG_TRACE, "rep->first_seq_no = [%"PRId64"]\n", rep->first_seq_no);
                 xmlFree(startnumber_val);
             }
@@ -987,9 +1012,11 @@
             xmlNodePtr fragmenturl_node = NULL;
             segmentlists_tab[0] = representation_segmentlist_node;
             segmentlists_tab[1] = adaptionset_segmentlist_node;
+            segmentlists_tab[2] = period_segmentlist_node;
 
-            duration_val = get_val_from_nodes_tab(segmentlists_tab, 2, "duration");
-            timescale_val = get_val_from_nodes_tab(segmentlists_tab, 2, "timescale");
+            duration_val = get_val_from_nodes_tab(segmentlists_tab, 3, "duration");
+            timescale_val = get_val_from_nodes_tab(segmentlists_tab, 3, "timescale");
+            startnumber_val = get_val_from_nodes_tab(segmentlists_tab, 3, "startNumber");
             if (duration_val) {
                 rep->fragment_duration = (int64_t) strtoll(duration_val, NULL, 10);
                 av_log(s, AV_LOG_TRACE, "rep->fragment_duration = [%"PRId64"]\n", rep->fragment_duration);
@@ -1000,6 +1027,12 @@
                 av_log(s, AV_LOG_TRACE, "rep->fragment_timescale = [%"PRId64"]\n", rep->fragment_timescale);
                 xmlFree(timescale_val);
             }
+            if (startnumber_val) {
+                rep->start_number = rep->first_seq_no = (int64_t) strtoll(startnumber_val, NULL, 10);
+                av_log(s, AV_LOG_TRACE, "rep->first_seq_no = [%"PRId64"]\n", rep->first_seq_no);
+                xmlFree(startnumber_val);
+            }
+
             fragmenturl_node = xmlFirstElementChild(representation_segmentlist_node);
             while (fragmenturl_node) {
                 ret = parse_manifest_segmenturlnode(s, rep, fragmenturl_node,
@@ -1048,18 +1081,29 @@
                     av_log(s, AV_LOG_VERBOSE, "Ignoring invalid frame rate '%s'\n", rep_framerate_val);
             }
 
-            if (type == AVMEDIA_TYPE_VIDEO) {
-                rep->rep_idx = video_rep_idx;
-                dynarray_add(&c->videos, &c->n_videos, rep);
-            } else {
-                rep->rep_idx = audio_rep_idx;
-                dynarray_add(&c->audios, &c->n_audios, rep);
+            switch (type) {
+                case AVMEDIA_TYPE_VIDEO:
+                    rep->rep_idx = video_rep_idx;
+                    dynarray_add(&c->videos, &c->n_videos, rep);
+                    break;
+                case AVMEDIA_TYPE_AUDIO:
+                    rep->rep_idx = audio_rep_idx;
+                    dynarray_add(&c->audios, &c->n_audios, rep);
+                    break;
+                case AVMEDIA_TYPE_SUBTITLE:
+                    rep->rep_idx = subtitle_rep_idx;
+                    dynarray_add(&c->subtitles, &c->n_subtitles, rep);
+                    break;
+                default:
+                    av_log(s, AV_LOG_WARNING, "Unsupported the stream type %d\n", type);
+                    break;
             }
         }
     }
 
     video_rep_idx += type == AVMEDIA_TYPE_VIDEO;
     audio_rep_idx += type == AVMEDIA_TYPE_AUDIO;
+    subtitle_rep_idx += type == AVMEDIA_TYPE_SUBTITLE;
 
 end:
     if (rep_id_val)
@@ -1072,6 +1116,19 @@
     return ret;
 }
 
+static int parse_manifest_adaptationset_attr(AVFormatContext *s, xmlNodePtr adaptionset_node)
+{
+    DASHContext *c = s->priv_data;
+
+    if (!adaptionset_node) {
+        av_log(s, AV_LOG_WARNING, "Cannot get AdaptionSet\n");
+        return AVERROR(EINVAL);
+    }
+    c->adaptionset_lang = xmlGetProp(adaptionset_node, "lang");
+
+    return 0;
+}
+
 static int parse_manifest_adaptationset(AVFormatContext *s, const char *url,
                                         xmlNodePtr adaptionset_node,
                                         xmlNodePtr mpd_baseurl_node,
@@ -1087,19 +1144,10 @@
     xmlNodePtr adaptionset_segmentlist_node = NULL;
     xmlNodePtr adaptionset_supplementalproperty_node = NULL;
     xmlNodePtr node = NULL;
-    c->adaptionset_contenttype_val = xmlGetProp(adaptionset_node, "contentType");
-    c->adaptionset_par_val = xmlGetProp(adaptionset_node, "par");
-    c->adaptionset_lang_val = xmlGetProp(adaptionset_node, "lang");
-    c->adaptionset_minbw_val = xmlGetProp(adaptionset_node, "minBandwidth");
-    c->adaptionset_maxbw_val = xmlGetProp(adaptionset_node, "maxBandwidth");
-    c->adaptionset_minwidth_val = xmlGetProp(adaptionset_node, "minWidth");
-    c->adaptionset_maxwidth_val = xmlGetProp(adaptionset_node, "maxWidth");
-    c->adaptionset_minheight_val = xmlGetProp(adaptionset_node, "minHeight");
-    c->adaptionset_maxheight_val = xmlGetProp(adaptionset_node, "maxHeight");
-    c->adaptionset_minframerate_val = xmlGetProp(adaptionset_node, "minFrameRate");
-    c->adaptionset_maxframerate_val = xmlGetProp(adaptionset_node, "maxFrameRate");
-    c->adaptionset_segmentalignment_val = xmlGetProp(adaptionset_node, "segmentAlignment");
-    c->adaptionset_bitstreamswitching_val = xmlGetProp(adaptionset_node, "bitstreamSwitching");
+
+    ret = parse_manifest_adaptationset_attr(s, adaptionset_node);
+    if (ret < 0)
+        return ret;
 
     node = xmlFirstElementChild(adaptionset_node);
     while (node) {
@@ -1125,11 +1173,42 @@
                                                 adaptionset_baseurl_node,
                                                 adaptionset_segmentlist_node,
                                                 adaptionset_supplementalproperty_node);
-            if (ret < 0) {
-                return ret;
+            if (ret < 0)
+                goto err;
+        }
+        node = xmlNextElementSibling(node);
+    }
+
+err:
+    av_freep(&c->adaptionset_lang);
+    return ret;
+}
+
+static int parse_programinformation(AVFormatContext *s, xmlNodePtr node)
+{
+    xmlChar *val = NULL;
+
+    node = xmlFirstElementChild(node);
+    while (node) {
+        if (!av_strcasecmp(node->name, "Title")) {
+            val = xmlNodeGetContent(node);
+            if (val) {
+                av_dict_set(&s->metadata, "Title", val, 0);
+            }
+        } else if (!av_strcasecmp(node->name, "Source")) {
+            val = xmlNodeGetContent(node);
+            if (val) {
+                av_dict_set(&s->metadata, "Source", val, 0);
+            }
+        } else if (!av_strcasecmp(node->name, "Copyright")) {
+            val = xmlNodeGetContent(node);
+            if (val) {
+                av_dict_set(&s->metadata, "Copyright", val, 0);
             }
         }
         node = xmlNextElementSibling(node);
+        xmlFree(val);
+        val = NULL;
     }
     return 0;
 }
@@ -1192,7 +1271,7 @@
     } else {
         LIBXML_TEST_VERSION
 
-            doc = xmlReadMemory(buffer, filesize, c->base_url, NULL, 0);
+        doc = xmlReadMemory(buffer, filesize, c->base_url, NULL, 0);
         root_element = xmlDocGetRootElement(doc);
         node = root_element;
 
@@ -1283,6 +1362,8 @@
                     if (c->period_start > 0)
                         c->media_presentation_duration = c->period_duration;
                 }
+            } else if (!av_strcasecmp(node->name, "ProgramInformation")) {
+                parse_programinformation(s, node);
             }
             node = xmlNextElementSibling(node);
         }
@@ -1432,15 +1513,15 @@
 
 static int refresh_manifest(AVFormatContext *s)
 {
-
     int ret = 0, i;
     DASHContext *c = s->priv_data;
-
     // save current context
     int n_videos = c->n_videos;
     struct representation **videos = c->videos;
     int n_audios = c->n_audios;
     struct representation **audios = c->audios;
+    int n_subtitles = c->n_subtitles;
+    struct representation **subtitles = c->subtitles;
     char *base_url = c->base_url;
 
     c->base_url = NULL;
@@ -1448,6 +1529,8 @@
     c->videos = NULL;
     c->n_audios = 0;
     c->audios = NULL;
+    c->n_subtitles = 0;
+    c->subtitles = NULL;
     ret = parse_manifest(s, s->url, NULL);
     if (ret)
         goto finish;
@@ -1464,6 +1547,12 @@
                n_audios, c->n_audios);
         return AVERROR_INVALIDDATA;
     }
+    if (c->n_subtitles != n_subtitles) {
+        av_log(c, AV_LOG_ERROR,
+               "new manifest has mismatched no. of subtitles representations, %d -> %d\n",
+               n_subtitles, c->n_subtitles);
+        return AVERROR_INVALIDDATA;
+    }
 
     for (i = 0; i < n_videos; i++) {
         struct representation *cur_video = videos[i];
@@ -1504,10 +1593,16 @@
         av_free(base_url);
     else
         c->base_url  = base_url;
+
+    if (c->subtitles)
+        free_subtitle_list(c);
     if (c->audios)
         free_audio_list(c);
     if (c->videos)
         free_video_list(c);
+
+    c->n_subtitles = n_subtitles;
+    c->subtitles = subtitles;
     c->n_audios = n_audios;
     c->audios = audios;
     c->n_videos = n_videos;
@@ -1614,6 +1709,7 @@
 
     url = av_mallocz(c->max_url_size);
     if (!url) {
+        ret = AVERROR(ENOMEM);
         goto cleanup;
     }
 
@@ -1628,9 +1724,6 @@
     av_log(pls->parent, AV_LOG_VERBOSE, "DASH request for url '%s', offset %"PRId64", playlist %d\n",
            url, seg->url_offset, pls->rep_idx);
     ret = open_url(pls->parent, &pls->input, url, c->avio_opts, opts, NULL);
-    if (ret < 0) {
-        goto cleanup;
-    }
 
 cleanup:
     av_free(url);
@@ -1720,8 +1813,8 @@
         ret = open_input(c, v, v->cur_seg);
         if (ret < 0) {
             if (ff_check_interrupt(c->interrupt_callback)) {
-                goto end;
                 ret = AVERROR_EXIT;
+                goto end;
             }
             av_log(v->parent, AV_LOG_WARNING, "Failed to open fragment of playlist %d\n", v->rep_idx);
             v->cur_seq_no++;
@@ -1763,7 +1856,9 @@
 static int save_avio_options(AVFormatContext *s)
 {
     DASHContext *c = s->priv_data;
-    const char *opts[] = { "headers", "user_agent", "cookies", NULL }, **opt = opts;
+    const char *opts[] = {
+        "headers", "user_agent", "cookies", "http_proxy", "referer", "rw_timeout", "icy", NULL };
+    const char **opt = opts;
     uint8_t *buf = NULL;
     int ret = 0;
 
@@ -1808,7 +1903,7 @@
 static int reopen_demux_for_component(AVFormatContext *s, struct representation *pls)
 {
     DASHContext *c = s->priv_data;
-    AVInputFormat *in_fmt = NULL;
+    ff_const59 AVInputFormat *in_fmt = NULL;
     AVDictionary  *in_fmt_opts = NULL;
     uint8_t *avio_ctx_buffer  = NULL;
     int ret = 0, i;
@@ -1845,8 +1940,8 @@
         goto fail;
 
     pls->ctx->flags = AVFMT_FLAG_CUSTOM_IO;
-    pls->ctx->probesize = 1024 * 4;
-    pls->ctx->max_analyze_duration = 4 * AV_TIME_BASE;
+    pls->ctx->probesize = s->probesize > 0 ? s->probesize : 1024 * 4;
+    pls->ctx->max_analyze_duration = s->max_analyze_duration > 0 ? s->max_analyze_duration : 4 * AV_TIME_BASE;
     ret = av_probe_input_buffer(&pls->pb, &in_fmt, "", NULL, 0, 0);
     if (ret < 0) {
         av_log(s, AV_LOG_ERROR, "Error when loading first fragment, playlist %d\n", (int)pls->rep_idx);
@@ -1870,7 +1965,6 @@
                 pls->ctx->streams[i]->r_frame_rate = pls->framerate;
         }
 #endif
-
         ret = avformat_find_stream_info(pls->ctx, NULL);
         if (ret < 0)
             goto fail;
@@ -1904,7 +1998,7 @@
             goto fail;
         }
         st->id = i;
-        avcodec_parameters_copy(st->codecpar, pls->ctx->streams[i]->codecpar);
+        avcodec_parameters_copy(st->codecpar, ist->codecpar);
         avpriv_set_pts_info(st, ist->pts_wrap_bits, ist->time_base.num, ist->time_base.den);
     }
 
@@ -1935,19 +2029,26 @@
     return 1;
 }
 
-static void copy_init_section(struct representation *rep_dest, struct representation *rep_src)
+static int copy_init_section(struct representation *rep_dest, struct representation *rep_src)
 {
     rep_dest->init_sec_buf = av_mallocz(rep_src->init_sec_buf_size);
+    if (!rep_dest->init_sec_buf) {
+        av_log(rep_dest->ctx, AV_LOG_WARNING, "Cannot alloc memory for init_sec_buf\n");
+        return AVERROR(ENOMEM);
+    }
     memcpy(rep_dest->init_sec_buf, rep_src->init_sec_buf, rep_src->init_sec_data_len);
     rep_dest->init_sec_buf_size = rep_src->init_sec_buf_size;
     rep_dest->init_sec_data_len = rep_src->init_sec_data_len;
     rep_dest->cur_timestamp = rep_src->cur_timestamp;
+
+    return 0;
 }
 
 
 static int dash_read_header(AVFormatContext *s)
 {
     DASHContext *c = s->priv_data;
+    struct representation *rep;
     int ret = 0;
     int stream_index = 0;
     int i;
@@ -1957,8 +2058,6 @@
     if ((ret = save_avio_options(s)) < 0)
         goto fail;
 
-    av_dict_set(&c->avio_opts, "seekable", "0", 0);
-
     if ((ret = parse_manifest(s, s->url, s->pb)) < 0)
         goto fail;
 
@@ -1966,6 +2065,8 @@
      * stream. */
     if (!c->is_live) {
         s->duration = (int64_t) c->media_presentation_duration * AV_TIME_BASE;
+    } else {
+        av_dict_set(&c->avio_opts, "seekable", "0", 0);
     }
 
     if(c->n_videos)
@@ -1973,15 +2074,17 @@
 
     /* Open the demuxer for video and audio components if available */
     for (i = 0; i < c->n_videos; i++) {
-        struct representation *cur_video = c->videos[i];
+        rep = c->videos[i];
         if (i > 0 && c->is_init_section_common_video) {
-            copy_init_section(cur_video,c->videos[0]);
+            ret = copy_init_section(rep, c->videos[0]);
+            if (ret < 0)
+                goto fail;
         }
-        ret = open_demux_for_component(s, cur_video);
+        ret = open_demux_for_component(s, rep);
 
         if (ret)
             goto fail;
-        cur_video->stream_index = stream_index;
+        rep->stream_index = stream_index;
         ++stream_index;
     }
 
@@ -1989,15 +2092,35 @@
         c->is_init_section_common_audio = is_common_init_section_exist(c->audios, c->n_audios);
 
     for (i = 0; i < c->n_audios; i++) {
-        struct representation *cur_audio = c->audios[i];
+        rep = c->audios[i];
         if (i > 0 && c->is_init_section_common_audio) {
-            copy_init_section(cur_audio,c->audios[0]);
+            ret = copy_init_section(rep, c->audios[0]);
+            if (ret < 0)
+                goto fail;
         }
-        ret = open_demux_for_component(s, cur_audio);
+        ret = open_demux_for_component(s, rep);
 
         if (ret)
             goto fail;
-        cur_audio->stream_index = stream_index;
+        rep->stream_index = stream_index;
+        ++stream_index;
+    }
+
+    if (c->n_subtitles)
+        c->is_init_section_common_audio = is_common_init_section_exist(c->subtitles, c->n_subtitles);
+
+    for (i = 0; i < c->n_subtitles; i++) {
+        rep = c->subtitles[i];
+        if (i > 0 && c->is_init_section_common_audio) {
+            ret = copy_init_section(rep, c->subtitles[0]);
+            if (ret < 0)
+                goto fail;
+        }
+        ret = open_demux_for_component(s, rep);
+
+        if (ret)
+            goto fail;
+        rep->stream_index = stream_index;
         ++stream_index;
     }
 
@@ -2015,24 +2138,37 @@
         }
 
         for (i = 0; i < c->n_videos; i++) {
-            struct representation *pls = c->videos[i];
-
-            av_program_add_stream_index(s, 0, pls->stream_index);
-            pls->assoc_stream = s->streams[pls->stream_index];
-            if (pls->bandwidth > 0)
-                av_dict_set_int(&pls->assoc_stream->metadata, "variant_bitrate", pls->bandwidth, 0);
-            if (pls->id[0])
-                av_dict_set(&pls->assoc_stream->metadata, "id", pls->id, 0);
+            rep = c->videos[i];
+            av_program_add_stream_index(s, 0, rep->stream_index);
+            rep->assoc_stream = s->streams[rep->stream_index];
+            if (rep->bandwidth > 0)
+                av_dict_set_int(&rep->assoc_stream->metadata, "variant_bitrate", rep->bandwidth, 0);
+            if (rep->id[0])
+                av_dict_set(&rep->assoc_stream->metadata, "id", rep->id, 0);
         }
         for (i = 0; i < c->n_audios; i++) {
-            struct representation *pls = c->audios[i];
-
-            av_program_add_stream_index(s, 0, pls->stream_index);
-            pls->assoc_stream = s->streams[pls->stream_index];
-            if (pls->bandwidth > 0)
-                av_dict_set_int(&pls->assoc_stream->metadata, "variant_bitrate", pls->bandwidth, 0);
-            if (pls->id[0])
-                av_dict_set(&pls->assoc_stream->metadata, "id", pls->id, 0);
+            rep = c->audios[i];
+            av_program_add_stream_index(s, 0, rep->stream_index);
+            rep->assoc_stream = s->streams[rep->stream_index];
+            if (rep->bandwidth > 0)
+                av_dict_set_int(&rep->assoc_stream->metadata, "variant_bitrate", rep->bandwidth, 0);
+            if (rep->id[0])
+                av_dict_set(&rep->assoc_stream->metadata, "id", rep->id, 0);
+            if (rep->lang) {
+                av_dict_set(&rep->assoc_stream->metadata, "language", rep->lang, 0);
+                av_freep(&rep->lang);
+            }
+        }
+        for (i = 0; i < c->n_subtitles; i++) {
+            rep = c->subtitles[i];
+            av_program_add_stream_index(s, 0, rep->stream_index);
+            rep->assoc_stream = s->streams[rep->stream_index];
+            if (rep->id[0])
+                av_dict_set(&rep->assoc_stream->metadata, "id", rep->id, 0);
+            if (rep->lang) {
+                av_dict_set(&rep->assoc_stream->metadata, "language", rep->lang, 0);
+                av_freep(&rep->lang);
+            }
         }
     }
 
@@ -2047,8 +2183,8 @@
 
     for (i = 0; i < n; i++) {
         struct representation *pls = p[i];
-
         int needed = !pls->assoc_stream || pls->assoc_stream->discard < AVDISCARD_ALL;
+
         if (needed && !pls->ctx) {
             pls->cur_seg_offset = 0;
             pls->init_sec_buf_read_offset = 0;
@@ -2060,8 +2196,7 @@
             av_log(s, AV_LOG_INFO, "Now receiving stream_index %d\n", pls->stream_index);
         } else if (!needed && pls->ctx) {
             close_demux_for_component(pls);
-            if (pls->input)
-                ff_format_io_close(pls->parent, &pls->input);
+            ff_format_io_close(pls->parent, &pls->input);
             av_log(s, AV_LOG_INFO, "No longer receiving stream_index %d\n", pls->stream_index);
         }
     }
@@ -2073,26 +2208,38 @@
     int ret = 0, i;
     int64_t mints = 0;
     struct representation *cur = NULL;
+    struct representation *rep = NULL;
 
     recheck_discard_flags(s, c->videos, c->n_videos);
     recheck_discard_flags(s, c->audios, c->n_audios);
+    recheck_discard_flags(s, c->subtitles, c->n_subtitles);
 
     for (i = 0; i < c->n_videos; i++) {
-        struct representation *pls = c->videos[i];
-        if (!pls->ctx)
+        rep = c->videos[i];
+        if (!rep->ctx)
             continue;
-        if (!cur || pls->cur_timestamp < mints) {
-            cur = pls;
-            mints = pls->cur_timestamp;
+        if (!cur || rep->cur_timestamp < mints) {
+            cur = rep;
+            mints = rep->cur_timestamp;
         }
     }
     for (i = 0; i < c->n_audios; i++) {
-        struct representation *pls = c->audios[i];
-        if (!pls->ctx)
+        rep = c->audios[i];
+        if (!rep->ctx)
             continue;
-        if (!cur || pls->cur_timestamp < mints) {
-            cur = pls;
-            mints = pls->cur_timestamp;
+        if (!cur || rep->cur_timestamp < mints) {
+            cur = rep;
+            mints = rep->cur_timestamp;
+        }
+    }
+
+    for (i = 0; i < c->n_subtitles; i++) {
+        rep = c->subtitles[i];
+        if (!rep->ctx)
+            continue;
+        if (!cur || rep->cur_timestamp < mints) {
+            cur = rep;
+            mints = rep->cur_timestamp;
         }
     }
 
@@ -2110,8 +2257,7 @@
         if (cur->is_restart_needed) {
             cur->cur_seg_offset = 0;
             cur->init_sec_buf_read_offset = 0;
-            if (cur->input)
-                ff_format_io_close(cur->parent, &cur->input);
+            ff_format_io_close(cur->parent, &cur->input);
             ret = reopen_demux_for_component(s, cur);
             cur->is_restart_needed = 0;
         }
@@ -2124,7 +2270,6 @@
     DASHContext *c = s->priv_data;
     free_audio_list(c);
     free_video_list(c);
-
     av_dict_free(&c->avio_opts);
     av_freep(&c->base_url);
     return 0;
@@ -2150,8 +2295,7 @@
         return av_seek_frame(pls->ctx, -1, seek_pos_msec * 1000, flags);
     }
 
-    if (pls->input)
-        ff_format_io_close(pls->parent, &pls->input);
+    ff_format_io_close(pls->parent, &pls->input);
 
     // find the nearest fragment
     if (pls->n_timelines > 0 && pls->fragment_timescale > 0) {
@@ -2215,11 +2359,15 @@
         if (!ret)
             ret = dash_seek(s, c->audios[i], seek_pos_msec, flags, !c->audios[i]->ctx);
     }
+    for (i = 0; i < c->n_subtitles; i++) {
+        if (!ret)
+            ret = dash_seek(s, c->subtitles[i], seek_pos_msec, flags, !c->subtitles[i]->ctx);
+    }
 
     return ret;
 }
 
-static int dash_probe(AVProbeData *p)
+static int dash_probe(const AVProbeData *p)
 {
     if (!av_stristr(p->buf, "<MPD"))
         return 0;
@@ -2227,7 +2375,8 @@
     if (av_stristr(p->buf, "dash:profile:isoff-on-demand:2011") ||
         av_stristr(p->buf, "dash:profile:isoff-live:2011") ||
         av_stristr(p->buf, "dash:profile:isoff-live:2012") ||
-        av_stristr(p->buf, "dash:profile:isoff-main:2011")) {
+        av_stristr(p->buf, "dash:profile:isoff-main:2011") ||
+        av_stristr(p->buf, "3GPP:PSS:profile:DASH1")) {
         return AVPROBE_SCORE_MAX;
     }
     if (av_stristr(p->buf, "dash:profile")) {
@@ -2242,7 +2391,7 @@
 static const AVOption dash_options[] = {
     {"allowed_extensions", "List of file extensions that dash is allowed to access",
         OFFSET(allowed_extensions), AV_OPT_TYPE_STRING,
-        {.str = "aac,m4a,m4s,m4v,mov,mp4"},
+        {.str = "aac,m4a,m4s,m4v,mov,mp4,webm,ts"},
         INT_MIN, INT_MAX, FLAGS},
     {NULL}
 };
diff --git a/libavformat/dashenc.c b/libavformat/dashenc.c
index 26a4dce..b082536 100644
--- a/libavformat/dashenc.c
+++ b/libavformat/dashenc.c
@@ -31,9 +31,12 @@
 #include "libavutil/intreadwrite.h"
 #include "libavutil/mathematics.h"
 #include "libavutil/opt.h"
+#include "libavutil/parseutils.h"
 #include "libavutil/rational.h"
+#include "libavutil/time.h"
 #include "libavutil/time_internal.h"
 
+#include "av1.h"
 #include "avc.h"
 #include "avformat.h"
 #include "avio_internal.h"
@@ -49,41 +52,75 @@
 #include "dash.h"
 
 typedef enum {
-    SEGMENT_TYPE_MP4 = 0,
+    SEGMENT_TYPE_AUTO = 0,
+    SEGMENT_TYPE_MP4,
     SEGMENT_TYPE_WEBM,
     SEGMENT_TYPE_NB
 } SegmentType;
 
+enum {
+    FRAG_TYPE_NONE = 0,
+    FRAG_TYPE_EVERY_FRAME,
+    FRAG_TYPE_DURATION,
+    FRAG_TYPE_PFRAMES,
+    FRAG_TYPE_NB
+};
+
+#define MPD_PROFILE_DASH 1
+#define MPD_PROFILE_DVB  2
+
 typedef struct Segment {
     char file[1024];
     int64_t start_pos;
     int range_length, index_length;
     int64_t time;
-    int duration;
+    double prog_date_time;
+    int64_t duration;
     int n;
 } Segment;
 
 typedef struct AdaptationSet {
-    char id[10];
+    int id;
+    char *descriptor;
+    int64_t seg_duration;
+    int64_t frag_duration;
+    int frag_type;
     enum AVMediaType media_type;
     AVDictionary *metadata;
     AVRational min_frame_rate, max_frame_rate;
     int ambiguous_frame_rate;
+    int64_t max_frag_duration;
+    int max_width, max_height;
+    int nb_streams;
+    AVRational par;
+    int trick_idx;
 } AdaptationSet;
 
 typedef struct OutputStream {
     AVFormatContext *ctx;
     int ctx_inited, as_idx;
     AVIOContext *out;
+    AVCodecParserContext *parser;
+    AVCodecContext *parser_avctx;
     int packets_written;
     char initfile[1024];
     int64_t init_start_pos, pos;
     int init_range_length;
     int nb_segments, segments_size, segment_index;
+    int64_t seg_duration;
+    int64_t frag_duration;
+    int64_t last_duration;
     Segment **segments;
     int64_t first_pts, start_pts, max_pts;
     int64_t last_dts, last_pts;
+    int last_flags;
     int bit_rate;
+    SegmentType segment_type;  /* segment type selected for this particular stream */
+    const char *format_name;
+    const char *extension_name;
+    const char *single_file_name;  /* file names selected for this particular stream */
+    const char *init_seg_name;
+    const char *media_seg_name;
 
     char codec_str[100];
     int written_len;
@@ -91,8 +128,15 @@
     char full_path[1024];
     char temp_path[1024];
     double availability_time_offset;
+    AVProducerReferenceTime producer_reference_time;
+    char producer_reference_time_str[100];
     int total_pkt_size;
+    int64_t total_pkt_duration;
     int muxer_overhead;
+    int frag_type;
+    int64_t gop_size;
+    AVRational sar;
+    int coding_dependency;
 } OutputStream;
 
 typedef struct DASHContext {
@@ -106,6 +150,7 @@
     int min_seg_duration;
 #endif
     int64_t seg_duration;
+    int64_t frag_duration;
     int remove_at_exit;
     int use_template;
     int use_timeline;
@@ -115,13 +160,16 @@
     int64_t last_duration;
     int64_t total_duration;
     char availability_start_time[100];
+    time_t start_time_s;
+    int64_t presentation_time_offset;
     char dirname[1024];
-    const char *single_file_name;
+    const char *single_file_name;  /* file names as specified in options */
     const char *init_seg_name;
     const char *media_seg_name;
     const char *utc_timing_url;
     const char *method;
     const char *user_agent;
+    AVDictionary *http_opts;
     int hls_playlist;
     int http_persistent;
     int master_playlist_created;
@@ -130,9 +178,24 @@
     int streaming;
     int64_t timeout;
     int index_correction;
-    char *format_options_str;
-    SegmentType segment_type;
-    const char *format_name;
+    AVDictionary *format_options;
+    int global_sidx;
+    SegmentType segment_type_option;  /* segment type as specified in options */
+    int ignore_io_errors;
+    int lhls;
+    int ldash;
+    int master_publish_rate;
+    int nr_of_streams_to_flush;
+    int nr_of_streams_flushed;
+    int frag_type;
+    int write_prft;
+    int64_t max_gop_size;
+    int64_t max_segment_duration;
+    int profile;
+    int64_t target_latency;
+    int target_latency_refid;
+    AVRational min_playback_rate;
+    AVRational max_playback_rate;
 } DASHContext;
 
 static struct codec_string {
@@ -143,6 +206,7 @@
     { AV_CODEC_ID_VP9, "vp9" },
     { AV_CODEC_ID_VORBIS, "vorbis" },
     { AV_CODEC_ID_OPUS, "opus" },
+    { AV_CODEC_ID_FLAC, "flac" },
     { 0, NULL }
 };
 
@@ -150,6 +214,7 @@
     SegmentType segment_type;
     const char *str;
 } formats[] = {
+    { SEGMENT_TYPE_AUTO, "auto" },
     { SEGMENT_TYPE_MP4, "mp4" },
     { SEGMENT_TYPE_WEBM, "webm" },
     { 0, NULL }
@@ -167,6 +232,8 @@
         URLContext *http_url_context = ffio_geturlcontext(*pb);
         av_assert0(http_url_context);
         err = ff_http_do_new_request(http_url_context, filename);
+        if (err < 0)
+            ff_format_io_close(s, pb);
 #endif
     }
     return err;
@@ -176,6 +243,9 @@
     DASHContext *c = s->priv_data;
     int http_base_proto = filename ? ff_is_http_proto(filename) : 0;
 
+    if (!*pb)
+        return;
+
     if (!http_base_proto || !c->http_persistent) {
         ff_format_io_close(s, pb);
 #if CONFIG_HTTP_PROTOCOL
@@ -196,6 +266,70 @@
     return NULL;
 }
 
+static const char *get_extension_str(SegmentType type, int single_file)
+{
+    switch (type) {
+
+    case SEGMENT_TYPE_MP4:  return single_file ? "mp4" : "m4s";
+    case SEGMENT_TYPE_WEBM: return "webm";
+    default: return NULL;
+    }
+}
+
+static int handle_io_open_error(AVFormatContext *s, int err, char *url) {
+    DASHContext *c = s->priv_data;
+    char errbuf[AV_ERROR_MAX_STRING_SIZE];
+    av_strerror(err, errbuf, sizeof(errbuf));
+    av_log(s, c->ignore_io_errors ? AV_LOG_WARNING : AV_LOG_ERROR,
+           "Unable to open %s for writing: %s\n", url, errbuf);
+    return c->ignore_io_errors ? 0 : err;
+}
+
+static inline SegmentType select_segment_type(SegmentType segment_type, enum AVCodecID codec_id)
+{
+    if (segment_type == SEGMENT_TYPE_AUTO) {
+        if (codec_id == AV_CODEC_ID_OPUS || codec_id == AV_CODEC_ID_VORBIS ||
+            codec_id == AV_CODEC_ID_VP8 || codec_id == AV_CODEC_ID_VP9) {
+            segment_type = SEGMENT_TYPE_WEBM;
+        } else {
+            segment_type = SEGMENT_TYPE_MP4;
+        }
+    }
+
+    return segment_type;
+}
+
+static int init_segment_types(AVFormatContext *s)
+{
+    DASHContext *c = s->priv_data;
+    int has_mp4_streams = 0;
+    for (int i = 0; i < s->nb_streams; ++i) {
+        OutputStream *os = &c->streams[i];
+        SegmentType segment_type = select_segment_type(
+            c->segment_type_option, s->streams[i]->codecpar->codec_id);
+        os->segment_type = segment_type;
+        os->format_name = get_format_str(segment_type);
+        if (!os->format_name) {
+            av_log(s, AV_LOG_ERROR, "Could not select DASH segment type for stream %d\n", i);
+            return AVERROR_MUXER_NOT_FOUND;
+        }
+        os->extension_name = get_extension_str(segment_type, c->single_file);
+        if (!os->extension_name) {
+            av_log(s, AV_LOG_ERROR, "Could not get extension type for stream %d\n", i);
+            return AVERROR_MUXER_NOT_FOUND;
+        }
+
+        has_mp4_streams |= segment_type == SEGMENT_TYPE_MP4;
+    }
+
+    if (c->hls_playlist && !has_mp4_streams) {
+         av_log(s, AV_LOG_WARNING, "No mp4 streams, disabling HLS manifest generation\n");
+         c->hls_playlist = 0;
+    }
+
+    return 0;
+}
+
 static int check_file_extension(const char *filename, const char *extension) {
     char *dot;
     if (!filename || !extension)
@@ -247,7 +381,9 @@
     else
         return;
 
-    tag = av_codec_get_tag(tags, par->codec_id);
+    tag = par->codec_tag;
+    if (!tag)
+        tag = av_codec_get_tag(tags, par->codec_id);
     if (!tag)
         return;
     if (size < 5)
@@ -297,10 +433,25 @@
             av_strlcatf(str, size, ".%02x%02x%02x",
                         extradata[1], extradata[2], extradata[3]);
         av_free(tmpbuf);
+    } else if (!strcmp(str, "av01")) {
+        AV1SequenceParameters seq;
+        if (!par->extradata_size)
+            return;
+        if (ff_av1_parse_seq_header(&seq, par->extradata, par->extradata_size) < 0)
+            return;
+
+        av_strlcatf(str, size, ".%01u.%02u%s.%02u",
+                    seq.profile, seq.level, seq.tier ? "H" : "M", seq.bitdepth);
+        if (seq.color_description_present_flag)
+            av_strlcatf(str, size, ".%01u.%01u%01u%01u.%02u.%02u.%02u.%01u",
+                        seq.monochrome,
+                        seq.chroma_subsampling_x, seq.chroma_subsampling_y, seq.chroma_sample_position,
+                        seq.color_primaries, seq.transfer_characteristics, seq.matrix_coefficients,
+                        seq.color_range);
     }
 }
 
-static int flush_dynbuf(OutputStream *os, int *range_length)
+static int flush_dynbuf(DASHContext *c, OutputStream *os, int *range_length)
 {
     uint8_t *buffer;
 
@@ -312,21 +463,28 @@
     av_write_frame(os->ctx, NULL);
     avio_flush(os->ctx->pb);
 
-    // write out to file
-    *range_length = avio_close_dyn_buf(os->ctx->pb, &buffer);
-    os->ctx->pb = NULL;
-    avio_write(os->out, buffer + os->written_len, *range_length - os->written_len);
-    os->written_len = 0;
-    av_free(buffer);
+    if (!c->single_file) {
+        // write out to file
+        *range_length = avio_close_dyn_buf(os->ctx->pb, &buffer);
+        os->ctx->pb = NULL;
+        if (os->out)
+            avio_write(os->out, buffer + os->written_len, *range_length - os->written_len);
+        os->written_len = 0;
+        av_free(buffer);
 
-    // re-open buffer
-    return avio_open_dyn_buf(&os->ctx->pb);
+        // re-open buffer
+        return avio_open_dyn_buf(&os->ctx->pb);
+    } else {
+        *range_length = avio_tell(os->ctx->pb) - os->pos;
+        return 0;
+    }
 }
 
 static void set_http_options(AVDictionary **options, DASHContext *c)
 {
     if (c->method)
         av_dict_set(options, "method", c->method, 0);
+    av_dict_copy(options, c->http_opts, 0);
     if (c->user_agent)
         av_dict_set(options, "user_agent", c->user_agent, 0);
     if (c->http_persistent)
@@ -343,18 +501,110 @@
         snprintf(playlist_name, string_size, "media_%d.m3u8", id);
 }
 
+static void get_start_index_number(OutputStream *os, DASHContext *c,
+                                   int *start_index, int *start_number) {
+    *start_index = 0;
+    *start_number = 1;
+    if (c->window_size) {
+        *start_index  = FFMAX(os->nb_segments   - c->window_size, 0);
+        *start_number = FFMAX(os->segment_index - c->window_size, 1);
+    }
+}
+
+static void write_hls_media_playlist(OutputStream *os, AVFormatContext *s,
+                                     int representation_id, int final,
+                                     char *prefetch_url) {
+    DASHContext *c = s->priv_data;
+    int timescale = os->ctx->streams[0]->time_base.den;
+    char temp_filename_hls[1024];
+    char filename_hls[1024];
+    AVDictionary *http_opts = NULL;
+    int target_duration = 0;
+    int ret = 0;
+    const char *proto = avio_find_protocol_name(c->dirname);
+    int use_rename = proto && !strcmp(proto, "file");
+    int i, start_index, start_number;
+    double prog_date_time = 0;
+
+    get_start_index_number(os, c, &start_index, &start_number);
+
+    if (!c->hls_playlist || start_index >= os->nb_segments ||
+        os->segment_type != SEGMENT_TYPE_MP4)
+        return;
+
+    get_hls_playlist_name(filename_hls, sizeof(filename_hls),
+                          c->dirname, representation_id);
+
+    snprintf(temp_filename_hls, sizeof(temp_filename_hls), use_rename ? "%s.tmp" : "%s", filename_hls);
+
+    set_http_options(&http_opts, c);
+    ret = dashenc_io_open(s, &c->m3u8_out, temp_filename_hls, &http_opts);
+    av_dict_free(&http_opts);
+    if (ret < 0) {
+        handle_io_open_error(s, ret, temp_filename_hls);
+        return;
+    }
+    for (i = start_index; i < os->nb_segments; i++) {
+        Segment *seg = os->segments[i];
+        double duration = (double) seg->duration / timescale;
+        if (target_duration <= duration)
+            target_duration = lrint(duration);
+    }
+
+    ff_hls_write_playlist_header(c->m3u8_out, 6, -1, target_duration,
+                                 start_number, PLAYLIST_TYPE_NONE, 0);
+
+    ff_hls_write_init_file(c->m3u8_out, os->initfile, c->single_file,
+                           os->init_range_length, os->init_start_pos);
+
+    for (i = start_index; i < os->nb_segments; i++) {
+        Segment *seg = os->segments[i];
+
+        if (prog_date_time == 0) {
+            if (os->nb_segments == 1)
+                prog_date_time = c->start_time_s;
+            else
+                prog_date_time = seg->prog_date_time;
+        }
+        seg->prog_date_time = prog_date_time;
+
+        ret = ff_hls_write_file_entry(c->m3u8_out, 0, c->single_file,
+                                (double) seg->duration / timescale, 0,
+                                seg->range_length, seg->start_pos, NULL,
+                                c->single_file ? os->initfile : seg->file,
+                                &prog_date_time, 0, 0, 0);
+        if (ret < 0) {
+            av_log(os->ctx, AV_LOG_WARNING, "ff_hls_write_file_entry get error\n");
+        }
+    }
+
+    if (prefetch_url)
+        avio_printf(c->m3u8_out, "#EXT-X-PREFETCH:%s\n", prefetch_url);
+
+    if (final)
+        ff_hls_write_end_list(c->m3u8_out);
+
+    dashenc_io_close(s, &c->m3u8_out, temp_filename_hls);
+
+    if (use_rename)
+        ff_rename(temp_filename_hls, filename_hls, os->ctx);
+}
+
 static int flush_init_segment(AVFormatContext *s, OutputStream *os)
 {
     DASHContext *c = s->priv_data;
     int ret, range_length;
 
-    ret = flush_dynbuf(os, &range_length);
+    ret = flush_dynbuf(c, os, &range_length);
     if (ret < 0)
         return ret;
 
     os->pos = os->init_range_length = range_length;
-    if (!c->single_file)
-        ff_format_io_close(s, &os->out);
+    if (!c->single_file) {
+        char filename[1024];
+        snprintf(filename, sizeof(filename), "%s%s", c->dirname, os->initfile);
+        dashenc_io_close(s, &os->out, filename);
+    }
     return 0;
 }
 
@@ -364,8 +614,10 @@
     int i, j;
 
     if (c->as) {
-        for (i = 0; i < c->nb_as; i++)
+        for (i = 0; i < c->nb_as; i++) {
             av_dict_free(&c->as[i].metadata);
+            av_freep(&c->as[i].descriptor);
+        }
         av_freep(&c->as);
         c->nb_as = 0;
     }
@@ -374,16 +626,22 @@
         return;
     for (i = 0; i < s->nb_streams; i++) {
         OutputStream *os = &c->streams[i];
-        if (os->ctx && os->ctx_inited)
-            av_write_trailer(os->ctx);
-        if (os->ctx && os->ctx->pb)
-            ffio_free_dyn_buf(&os->ctx->pb);
+        if (os->ctx && os->ctx->pb) {
+            if (!c->single_file)
+                ffio_free_dyn_buf(&os->ctx->pb);
+            else
+                avio_close(os->ctx->pb);
+        }
         ff_format_io_close(s, &os->out);
-        if (os->ctx)
-            avformat_free_context(os->ctx);
+        avformat_free_context(os->ctx);
+        avcodec_free_context(&os->parser_avctx);
+        av_parser_close(os->parser);
         for (j = 0; j < os->nb_segments; j++)
             av_free(os->segments[j]);
         av_free(os->segments);
+        av_freep(&os->single_file_name);
+        av_freep(&os->init_seg_name);
+        av_freep(&os->media_seg_name);
     }
     av_freep(&c->streams);
 
@@ -395,22 +653,25 @@
                                 int representation_id, int final)
 {
     DASHContext *c = s->priv_data;
-    int i, start_index = 0, start_number = 1;
-    if (c->window_size) {
-        start_index  = FFMAX(os->nb_segments   - c->window_size, 0);
-        start_number = FFMAX(os->segment_index - c->window_size, 1);
-    }
+    int i, start_index, start_number;
+    get_start_index_number(os, c, &start_index, &start_number);
 
     if (c->use_template) {
         int timescale = c->use_timeline ? os->ctx->streams[0]->time_base.den : AV_TIME_BASE;
         avio_printf(out, "\t\t\t\t<SegmentTemplate timescale=\"%d\" ", timescale);
         if (!c->use_timeline) {
-            avio_printf(out, "duration=\"%"PRId64"\" ", c->seg_duration);
+            avio_printf(out, "duration=\"%"PRId64"\" ", os->seg_duration);
             if (c->streaming && os->availability_time_offset)
                 avio_printf(out, "availabilityTimeOffset=\"%.3f\" ",
                             os->availability_time_offset);
         }
-        avio_printf(out, "initialization=\"%s\" media=\"%s\" startNumber=\"%d\">\n", c->init_seg_name, c->media_seg_name, c->use_timeline ? start_number : 1);
+        if (c->streaming && os->availability_time_offset && !final)
+            avio_printf(out, "availabilityTimeComplete=\"false\" ");
+
+        avio_printf(out, "initialization=\"%s\" media=\"%s\" startNumber=\"%d\"", os->init_seg_name, os->media_seg_name, c->use_timeline ? start_number : 1);
+        if (c->presentation_time_offset)
+            avio_printf(out, " presentationTimeOffset=\"%"PRId64"\"", c->presentation_time_offset);
+        avio_printf(out, ">\n");
         if (c->use_timeline) {
             int64_t cur_time = 0;
             avio_printf(out, "\t\t\t\t\t<SegmentTimeline>\n");
@@ -422,7 +683,7 @@
                     cur_time = seg->time;
                     avio_printf(out, "t=\"%"PRId64"\" ", seg->time);
                 }
-                avio_printf(out, "d=\"%d\" ", seg->duration);
+                avio_printf(out, "d=\"%"PRId64"\" ", seg->duration);
                 while (i + repeat + 1 < os->nb_segments &&
                        os->segments[i + repeat + 1]->duration == seg->duration &&
                        os->segments[i + repeat + 1]->time == os->segments[i + repeat]->time + os->segments[i + repeat]->duration)
@@ -438,7 +699,7 @@
         avio_printf(out, "\t\t\t\t</SegmentTemplate>\n");
     } else if (c->single_file) {
         avio_printf(out, "\t\t\t\t<BaseURL>%s</BaseURL>\n", os->initfile);
-        avio_printf(out, "\t\t\t\t<SegmentList timescale=\"%d\" duration=\"%"PRId64"\" startNumber=\"%d\">\n", AV_TIME_BASE, c->last_duration, start_number);
+        avio_printf(out, "\t\t\t\t<SegmentList timescale=\"%d\" duration=\"%"PRId64"\" startNumber=\"%d\">\n", AV_TIME_BASE, FFMIN(os->seg_duration, os->last_duration), start_number);
         avio_printf(out, "\t\t\t\t\t<Initialization range=\"%"PRId64"-%"PRId64"\" />\n", os->init_start_pos, os->init_start_pos + os->init_range_length - 1);
         for (i = start_index; i < os->nb_segments; i++) {
             Segment *seg = os->segments[i];
@@ -449,7 +710,7 @@
         }
         avio_printf(out, "\t\t\t\t</SegmentList>\n");
     } else {
-        avio_printf(out, "\t\t\t\t<SegmentList timescale=\"%d\" duration=\"%"PRId64"\" startNumber=\"%d\">\n", AV_TIME_BASE, c->last_duration, start_number);
+        avio_printf(out, "\t\t\t\t<SegmentList timescale=\"%d\" duration=\"%"PRId64"\" startNumber=\"%d\">\n", AV_TIME_BASE, FFMIN(os->seg_duration, os->last_duration), start_number);
         avio_printf(out, "\t\t\t\t\t<Initialization sourceURL=\"%s\" />\n", os->initfile);
         for (i = start_index; i < os->nb_segments; i++) {
             Segment *seg = os->segments[i];
@@ -457,59 +718,8 @@
         }
         avio_printf(out, "\t\t\t\t</SegmentList>\n");
     }
-    if (c->hls_playlist && start_index < os->nb_segments)
-    {
-        int timescale = os->ctx->streams[0]->time_base.den;
-        char temp_filename_hls[1024];
-        char filename_hls[1024];
-        AVDictionary *http_opts = NULL;
-        int target_duration = 0;
-        int ret = 0;
-        const char *proto = avio_find_protocol_name(c->dirname);
-        int use_rename = proto && !strcmp(proto, "file");
-
-        get_hls_playlist_name(filename_hls, sizeof(filename_hls),
-                              c->dirname, representation_id);
-
-        snprintf(temp_filename_hls, sizeof(temp_filename_hls), use_rename ? "%s.tmp" : "%s", filename_hls);
-
-        set_http_options(&http_opts, c);
-        dashenc_io_open(s, &c->m3u8_out, temp_filename_hls, &http_opts);
-        av_dict_free(&http_opts);
-        for (i = start_index; i < os->nb_segments; i++) {
-            Segment *seg = os->segments[i];
-            double duration = (double) seg->duration / timescale;
-            if (target_duration <= duration)
-                target_duration = lrint(duration);
-        }
-
-        ff_hls_write_playlist_header(c->m3u8_out, 6, -1, target_duration,
-                                     start_number, PLAYLIST_TYPE_NONE);
-
-        ff_hls_write_init_file(c->m3u8_out, os->initfile, c->single_file,
-                               os->init_range_length, os->init_start_pos);
-
-        for (i = start_index; i < os->nb_segments; i++) {
-            Segment *seg = os->segments[i];
-            ret = ff_hls_write_file_entry(c->m3u8_out, 0, c->single_file,
-                                    (double) seg->duration / timescale, 0,
-                                    seg->range_length, seg->start_pos, NULL,
-                                    c->single_file ? os->initfile : seg->file,
-                                    NULL);
-            if (ret < 0) {
-                av_log(os->ctx, AV_LOG_WARNING, "ff_hls_write_file_entry get error\n");
-            }
-        }
-
-        if (final)
-            ff_hls_write_end_list(c->m3u8_out);
-
-        dashenc_io_close(s, &c->m3u8_out, temp_filename_hls);
-
-        if (use_rename)
-            if (avpriv_io_move(temp_filename_hls, filename_hls) < 0) {
-                av_log(os->ctx, AV_LOG_WARNING, "renaming file %s to %s failed\n\n", temp_filename_hls, filename_hls);
-            }
+    if (!c->lhls || final) {
+        write_hls_media_playlist(os, s, representation_id, final, NULL);
     }
 
 }
@@ -570,14 +780,21 @@
     avio_printf(out, "%d.%dS", seconds, fractions / (AV_TIME_BASE / 10));
 }
 
-static void format_date_now(char *buf, int size)
+static void format_date(char *buf, int size, int64_t time_us)
 {
-    time_t t = time(NULL);
     struct tm *ptm, tmbuf;
-    ptm = gmtime_r(&t, &tmbuf);
+    int64_t time_ms = time_us / 1000;
+    const time_t time_s = time_ms / 1000;
+    int millisec = time_ms - (time_s * 1000);
+    ptm = gmtime_r(&time_s, &tmbuf);
     if (ptm) {
-        if (!strftime(buf, size, "%Y-%m-%dT%H:%M:%SZ", ptm))
+        int len;
+        if (!strftime(buf, size, "%Y-%m-%dT%H:%M:%S", ptm)) {
             buf[0] = '\0';
+            return;
+        }
+        len = strlen(buf);
+        snprintf(buf + len, size - len, ".%03dZ", millisec);
     }
 }
 
@@ -589,20 +806,32 @@
     AVDictionaryEntry *lang, *role;
     int i;
 
-    avio_printf(out, "\t\t<AdaptationSet id=\"%s\" contentType=\"%s\" segmentAlignment=\"true\" bitstreamSwitching=\"true\"",
+    avio_printf(out, "\t\t<AdaptationSet id=\"%d\" contentType=\"%s\" startWithSAP=\"1\" segmentAlignment=\"true\" bitstreamSwitching=\"true\"",
                 as->id, as->media_type == AVMEDIA_TYPE_VIDEO ? "video" : "audio");
     if (as->media_type == AVMEDIA_TYPE_VIDEO && as->max_frame_rate.num && !as->ambiguous_frame_rate && av_cmp_q(as->min_frame_rate, as->max_frame_rate) < 0)
         avio_printf(out, " maxFrameRate=\"%d/%d\"", as->max_frame_rate.num, as->max_frame_rate.den);
+    else if (as->media_type == AVMEDIA_TYPE_VIDEO && as->max_frame_rate.num && !as->ambiguous_frame_rate && !av_cmp_q(as->min_frame_rate, as->max_frame_rate))
+        avio_printf(out, " frameRate=\"%d/%d\"", as->max_frame_rate.num, as->max_frame_rate.den);
+    if (as->media_type == AVMEDIA_TYPE_VIDEO) {
+        avio_printf(out, " maxWidth=\"%d\" maxHeight=\"%d\"", as->max_width, as->max_height);
+        avio_printf(out, " par=\"%d:%d\"", as->par.num, as->par.den);
+    }
     lang = av_dict_get(as->metadata, "language", NULL, 0);
     if (lang)
         avio_printf(out, " lang=\"%s\"", lang->value);
     avio_printf(out, ">\n");
 
+    if (!final && c->ldash && as->max_frag_duration && !(c->profile & MPD_PROFILE_DVB))
+        avio_printf(out, "\t\t\t<Resync dT=\"%"PRId64"\" type=\"0\"/>\n", as->max_frag_duration);
+    if (as->trick_idx >= 0)
+        avio_printf(out, "\t\t\t<EssentialProperty id=\"%d\" schemeIdUri=\"http://dashif.org/guidelines/trickmode\" value=\"%d\"/>\n", as->id, as->trick_idx);
     role = av_dict_get(as->metadata, "role", NULL, 0);
     if (role)
         avio_printf(out, "\t\t\t<Role schemeIdUri=\"urn:mpeg:dash:role:2011\" value=\"%s\"/>\n", role->value);
-
+    if (as->descriptor)
+        avio_printf(out, "\t\t\t%s\n", as->descriptor);
     for (i = 0; i < s->nb_streams; i++) {
+        AVStream *st = s->streams[i];
         OutputStream *os = &c->streams[i];
         char bandwidth_str[64] = {'\0'};
 
@@ -614,18 +843,38 @@
                      os->bit_rate);
 
         if (as->media_type == AVMEDIA_TYPE_VIDEO) {
-            AVStream *st = s->streams[i];
             avio_printf(out, "\t\t\t<Representation id=\"%d\" mimeType=\"video/%s\" codecs=\"%s\"%s width=\"%d\" height=\"%d\"",
-                i, c->format_name, os->codec_str, bandwidth_str, s->streams[i]->codecpar->width, s->streams[i]->codecpar->height);
-            if (st->avg_frame_rate.num)
+                i, os->format_name, os->codec_str, bandwidth_str, s->streams[i]->codecpar->width, s->streams[i]->codecpar->height);
+            if (st->codecpar->field_order == AV_FIELD_UNKNOWN)
+                avio_printf(out, " scanType=\"unknown\"");
+            else if (st->codecpar->field_order != AV_FIELD_PROGRESSIVE)
+                avio_printf(out, " scanType=\"interlaced\"");
+            avio_printf(out, " sar=\"%d:%d\"", os->sar.num, os->sar.den);
+            if (st->avg_frame_rate.num && av_cmp_q(as->min_frame_rate, as->max_frame_rate) < 0)
                 avio_printf(out, " frameRate=\"%d/%d\"", st->avg_frame_rate.num, st->avg_frame_rate.den);
+            if (as->trick_idx >= 0) {
+                AdaptationSet *tas = &c->as[as->trick_idx];
+                if (!as->ambiguous_frame_rate && !tas->ambiguous_frame_rate)
+                    avio_printf(out, " maxPlayoutRate=\"%d\"", FFMAX((int)av_q2d(av_div_q(tas->min_frame_rate, as->min_frame_rate)), 1));
+            }
+            if (!os->coding_dependency)
+                avio_printf(out, " codingDependency=\"false\"");
             avio_printf(out, ">\n");
         } else {
             avio_printf(out, "\t\t\t<Representation id=\"%d\" mimeType=\"audio/%s\" codecs=\"%s\"%s audioSamplingRate=\"%d\">\n",
-                i, c->format_name, os->codec_str, bandwidth_str, s->streams[i]->codecpar->sample_rate);
+                i, os->format_name, os->codec_str, bandwidth_str, s->streams[i]->codecpar->sample_rate);
             avio_printf(out, "\t\t\t\t<AudioChannelConfiguration schemeIdUri=\"urn:mpeg:dash:23003:3:audio_channel_configuration:2011\" value=\"%d\" />\n",
                 s->streams[i]->codecpar->channels);
         }
+        if (!final && c->write_prft && os->producer_reference_time_str[0]) {
+            avio_printf(out, "\t\t\t\t<ProducerReferenceTime id=\"%d\" inband=\"true\" type=\"%s\" wallClockTime=\"%s\" presentationTime=\"%"PRId64"\">\n",
+                        i, os->producer_reference_time.flags ? "captured" : "encoder", os->producer_reference_time_str, c->presentation_time_offset);
+            avio_printf(out, "\t\t\t\t\t<UTCTiming schemeIdUri=\"urn:mpeg:dash:utc:http-xsdate:2014\" value=\"%s\"/>\n", c->utc_timing_url);
+            avio_printf(out, "\t\t\t\t</ProducerReferenceTime>\n");
+        }
+        if (!final && c->ldash && os->gop_size && os->frag_type != FRAG_TYPE_NONE && !(c->profile & MPD_PROFILE_DVB) &&
+            (os->frag_type != FRAG_TYPE_DURATION || os->frag_duration != os->seg_duration))
+            avio_printf(out, "\t\t\t\t<Resync dT=\"%"PRId64"\" type=\"1\"/>\n", os->gop_size);
         output_segment_list(os, out, s, i, final);
         avio_printf(out, "\t\t\t</Representation>\n");
     }
@@ -637,8 +886,13 @@
 static int add_adaptation_set(AVFormatContext *s, AdaptationSet **as, enum AVMediaType type)
 {
     DASHContext *c = s->priv_data;
+    void *mem;
 
-    void *mem = av_realloc(c->as, sizeof(*c->as) * (c->nb_as + 1));
+    if (c->profile & MPD_PROFILE_DVB && (c->nb_as + 1) > 16) {
+        av_log(s, AV_LOG_ERROR, "DVB-DASH profile allows a max of 16 Adaptation Sets\n");
+        return AVERROR(EINVAL);
+    }
+    mem = av_realloc(c->as, sizeof(*c->as) * (c->nb_as + 1));
     if (!mem)
         return AVERROR(ENOMEM);
     c->as = mem;
@@ -647,6 +901,8 @@
     *as = &c->as[c->nb_as - 1];
     memset(*as, 0, sizeof(**as));
     (*as)->media_type = type;
+    (*as)->frag_type = -1;
+    (*as)->trick_idx = -1;
 
     return 0;
 }
@@ -664,7 +920,12 @@
         av_log(s, AV_LOG_ERROR, "Stream %d is already assigned to an AdaptationSet\n", i);
         return AVERROR(EINVAL);
     }
+    if (c->profile & MPD_PROFILE_DVB && (as->nb_streams + 1) > 16) {
+        av_log(s, AV_LOG_ERROR, "DVB-DASH profile allows a max of 16 Representations per Adaptation Set\n");
+        return AVERROR(EINVAL);
+    }
     os->as_idx = as_idx;
+    ++as->nb_streams;
 
     return 0;
 }
@@ -673,7 +934,7 @@
 {
     DASHContext *c = s->priv_data;
     const char *p = c->adaptation_sets;
-    enum { new_set, parse_id, parsing_streams } state;
+    enum { new_set, parse_default, parsing_streams, parse_seg_duration, parse_frag_duration } state;
     AdaptationSet *as;
     int i, n, ret;
 
@@ -682,32 +943,121 @@
         for (i = 0; i < s->nb_streams; i++) {
             if ((ret = add_adaptation_set(s, &as, s->streams[i]->codecpar->codec_type)) < 0)
                 return ret;
-            snprintf(as->id, sizeof(as->id), "%d", i);
+            as->id = i;
 
             c->streams[i].as_idx = c->nb_as;
+            ++as->nb_streams;
         }
         goto end;
     }
 
     // syntax id=0,streams=0,1,2 id=1,streams=3,4 and so on
+    // option id=0,descriptor=descriptor_str,streams=0,1,2 and so on
+    // option id=0,seg_duration=2.5,frag_duration=0.5,streams=0,1,2
+    //        id=1,trick_id=0,seg_duration=10,frag_type=none,streams=3 and so on
+    // descriptor is useful to the scheme defined by ISO/IEC 23009-1:2014/Amd.2:2015
+    // descriptor_str should be a self-closing xml tag.
+    // seg_duration and frag_duration have the same syntax as the global options of
+    // the same name, and the former have precedence over them if set.
     state = new_set;
     while (*p) {
         if (*p == ' ') {
             p++;
             continue;
         } else if (state == new_set && av_strstart(p, "id=", &p)) {
+            char id_str[10], *end_str;
+
+            n = strcspn(p, ",");
+            snprintf(id_str, sizeof(id_str), "%.*s", n, p);
+
+            i = strtol(id_str, &end_str, 10);
+            if (id_str == end_str || i < 0 || i > c->nb_as) {
+                av_log(s, AV_LOG_ERROR, "\"%s\" is not a valid value for an AdaptationSet id\n", id_str);
+                return AVERROR(EINVAL);
+            }
 
             if ((ret = add_adaptation_set(s, &as, AVMEDIA_TYPE_UNKNOWN)) < 0)
                 return ret;
-
-            n = strcspn(p, ",");
-            snprintf(as->id, sizeof(as->id), "%.*s", n, p);
+            as->id = i;
 
             p += n;
             if (*p)
                 p++;
-            state = parse_id;
-        } else if (state == parse_id && av_strstart(p, "streams=", &p)) {
+            state = parse_default;
+        } else if (state != new_set && av_strstart(p, "seg_duration=", &p)) {
+            state = parse_seg_duration;
+        } else if (state != new_set && av_strstart(p, "frag_duration=", &p)) {
+            state = parse_frag_duration;
+        } else if (state == parse_seg_duration || state == parse_frag_duration) {
+            char str[32];
+            int64_t usecs = 0;
+
+            n = strcspn(p, ",");
+            snprintf(str, sizeof(str), "%.*s", n, p);
+            p += n;
+            if (*p)
+                p++;
+
+            ret = av_parse_time(&usecs, str, 1);
+            if (ret < 0) {
+                av_log(s, AV_LOG_ERROR, "Unable to parse option value \"%s\" as duration\n", str);
+                return ret;
+            }
+
+            if (state == parse_seg_duration)
+                as->seg_duration = usecs;
+            else
+                as->frag_duration = usecs;
+            state = parse_default;
+        } else if (state != new_set && av_strstart(p, "frag_type=", &p)) {
+            char type_str[16];
+
+            n = strcspn(p, ",");
+            snprintf(type_str, sizeof(type_str), "%.*s", n, p);
+            p += n;
+            if (*p)
+                p++;
+
+            if (!strcmp(type_str, "duration"))
+                as->frag_type = FRAG_TYPE_DURATION;
+            else if (!strcmp(type_str, "pframes"))
+                as->frag_type = FRAG_TYPE_PFRAMES;
+            else if (!strcmp(type_str, "every_frame"))
+                as->frag_type = FRAG_TYPE_EVERY_FRAME;
+            else if (!strcmp(type_str, "none"))
+                as->frag_type = FRAG_TYPE_NONE;
+            else {
+                av_log(s, AV_LOG_ERROR, "Unable to parse option value \"%s\" as fragment type\n", type_str);
+                return ret;
+            }
+            state = parse_default;
+        } else if (state != new_set && av_strstart(p, "descriptor=", &p)) {
+            n = strcspn(p, ">") + 1; //followed by one comma, so plus 1
+            if (n < strlen(p)) {
+                as->descriptor = av_strndup(p, n);
+            } else {
+                av_log(s, AV_LOG_ERROR, "Parse error, descriptor string should be a self-closing xml tag\n");
+                return AVERROR(EINVAL);
+            }
+            p += n;
+            if (*p)
+                p++;
+            state = parse_default;
+        } else if ((state != new_set) && av_strstart(p, "trick_id=", &p)) {
+            char trick_id_str[10], *end_str;
+
+            n = strcspn(p, ",");
+            snprintf(trick_id_str, sizeof(trick_id_str), "%.*s", n, p);
+            p += n;
+
+            as->trick_idx = strtol(trick_id_str, &end_str, 10);
+            if (trick_id_str == end_str || as->trick_idx < 0)
+                return AVERROR(EINVAL);
+
+            if (*p)
+                p++;
+            state = parse_default;
+        } else if ((state != new_set) && av_strstart(p, "streams=", &p)) { //descriptor and durations are optional
             state = parsing_streams;
         } else if (state == parsing_streams) {
             AdaptationSet *as = &c->as[c->nb_as - 1];
@@ -765,6 +1115,22 @@
             return AVERROR(EINVAL);
         }
     }
+
+    // check references for trick mode AdaptationSet
+    for (i = 0; i < c->nb_as; i++) {
+        as = &c->as[i];
+        if (as->trick_idx < 0)
+            continue;
+        for (n = 0; n < c->nb_as; n++) {
+            if (c->as[n].id == as->trick_idx)
+                break;
+        }
+        if (n >= c->nb_as) {
+            av_log(s, AV_LOG_ERROR, "reference AdaptationSet id \"%d\" not found for trick mode AdaptationSet id \"%d\"\n", as->trick_idx, as->id);
+            return AVERROR(EINVAL);
+        }
+    }
+
     return 0;
 }
 
@@ -786,19 +1152,23 @@
     snprintf(temp_filename, sizeof(temp_filename), use_rename ? "%s.tmp" : "%s", s->url);
     set_http_options(&opts, c);
     ret = dashenc_io_open(s, &c->mpd_out, temp_filename, &opts);
+    av_dict_free(&opts);
     if (ret < 0) {
-        av_log(s, AV_LOG_ERROR, "Unable to open %s for writing\n", temp_filename);
-        return ret;
+        return handle_io_open_error(s, ret, temp_filename);
     }
     out = c->mpd_out;
-    av_dict_free(&opts);
     avio_printf(out, "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n");
     avio_printf(out, "<MPD xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n"
                 "\txmlns=\"urn:mpeg:dash:schema:mpd:2011\"\n"
                 "\txmlns:xlink=\"http://www.w3.org/1999/xlink\"\n"
                 "\txsi:schemaLocation=\"urn:mpeg:DASH:schema:MPD:2011 http://standards.iso.org/ittf/PubliclyAvailableStandards/MPEG-DASH_schema_files/DASH-MPD.xsd\"\n"
-                "\tprofiles=\"urn:mpeg:dash:profile:isoff-live:2011\"\n"
-                "\ttype=\"%s\"\n", final ? "static" : "dynamic");
+                "\tprofiles=\"");
+    if (c->profile & MPD_PROFILE_DASH)
+         avio_printf(out, "%s%s", "urn:mpeg:dash:profile:isoff-live:2011", c->profile & MPD_PROFILE_DVB ? "," : "\"\n");
+    if (c->profile & MPD_PROFILE_DVB)
+         avio_printf(out, "%s", "urn:dvb:dash:profile:dvb-dash:2014\"\n");
+    avio_printf(out, "\ttype=\"%s\"\n",
+                final ? "static" : "dynamic");
     if (final) {
         avio_printf(out, "\tmediaPresentationDuration=\"");
         write_time(out, c->total_duration);
@@ -809,10 +1179,11 @@
         if (c->use_template && !c->use_timeline)
             update_period = 500;
         avio_printf(out, "\tminimumUpdatePeriod=\"PT%"PRId64"S\"\n", update_period);
-        avio_printf(out, "\tsuggestedPresentationDelay=\"PT%"PRId64"S\"\n", c->last_duration / AV_TIME_BASE);
+        if (!c->ldash)
+            avio_printf(out, "\tsuggestedPresentationDelay=\"PT%"PRId64"S\"\n", c->last_duration / AV_TIME_BASE);
         if (c->availability_start_time[0])
             avio_printf(out, "\tavailabilityStartTime=\"%s\"\n", c->availability_start_time);
-        format_date_now(now_str, sizeof(now_str));
+        format_date(now_str, sizeof(now_str), av_gettime());
         if (now_str[0])
             avio_printf(out, "\tpublishTime=\"%s\"\n", now_str);
         if (c->window_size && c->use_template) {
@@ -821,8 +1192,11 @@
             avio_printf(out, "\"\n");
         }
     }
+    avio_printf(out, "\tmaxSegmentDuration=\"");
+    write_time(out, c->max_segment_duration);
+    avio_printf(out, "\"\n");
     avio_printf(out, "\tminBufferTime=\"");
-    write_time(out, c->last_duration * 2);
+    write_time(out, c->ldash && c->max_gop_size ? c->max_gop_size : c->last_duration * 2);
     avio_printf(out, "\">\n");
     avio_printf(out, "\t<ProgramInformation>\n");
     if (title) {
@@ -832,6 +1206,19 @@
     }
     avio_printf(out, "\t</ProgramInformation>\n");
 
+    avio_printf(out, "\t<ServiceDescription id=\"0\">\n");
+    if (!final && c->target_latency && c->target_latency_refid >= 0) {
+        avio_printf(out, "\t\t<Latency target=\"%"PRId64"\"", c->target_latency / 1000);
+        if (s->nb_streams > 1)
+            avio_printf(out, " referenceId=\"%d\"", c->target_latency_refid);
+        avio_printf(out, "/>\n");
+    }
+    if (av_cmp_q(c->min_playback_rate, (AVRational) {1, 1}) ||
+        av_cmp_q(c->max_playback_rate, (AVRational) {1, 1}))
+        avio_printf(out, "\t\t<PlaybackRate min=\"%.2f\" max=\"%.2f\"/>\n",
+                    av_q2d(c->min_playback_rate), av_q2d(c->max_playback_rate));
+    avio_printf(out, "\t</ServiceDescription>\n");
+
     if (c->window_size && s->nb_streams > 0 && c->streams[0].nb_segments > 0 && !c->use_template) {
         OutputStream *os = &c->streams[0];
         int start_index = FFMAX(os->nb_segments - c->window_size, 0);
@@ -857,17 +1244,22 @@
     dashenc_io_close(s, &c->mpd_out, temp_filename);
 
     if (use_rename) {
-        if ((ret = avpriv_io_move(temp_filename, s->url)) < 0)
+        if ((ret = ff_rename(temp_filename, s->url, s)) < 0)
             return ret;
     }
 
-    if (c->hls_playlist && !c->master_playlist_created) {
+    if (c->hls_playlist) {
         char filename_hls[1024];
         const char *audio_group = "A1";
         char audio_codec_str[128] = "\0";
         int is_default = 1;
         int max_audio_bitrate = 0;
 
+        // Publish master playlist only the configured rate
+        if (c->master_playlist_created && (!c->master_publish_rate ||
+             c->streams[0].segment_index % c->master_publish_rate))
+            return 0;
+
         if (*c->dirname)
             snprintf(filename_hls, sizeof(filename_hls), "%smaster.m3u8", c->dirname);
         else
@@ -876,14 +1268,13 @@
         snprintf(temp_filename, sizeof(temp_filename), use_rename ? "%s.tmp" : "%s", filename_hls);
 
         set_http_options(&opts, c);
-        ret = avio_open2(&out, temp_filename, AVIO_FLAG_WRITE, NULL, &opts);
-        if (ret < 0) {
-            av_log(s, AV_LOG_ERROR, "Unable to open %s for writing\n", temp_filename);
-            return ret;
-        }
+        ret = dashenc_io_open(s, &c->m3u8_out, temp_filename, &opts);
         av_dict_free(&opts);
+        if (ret < 0) {
+            return handle_io_open_error(s, ret, temp_filename);
+        }
 
-        ff_hls_write_playlist_version(out, 7);
+        ff_hls_write_playlist_version(c->m3u8_out, 7);
 
         for (i = 0; i < s->nb_streams; i++) {
             char playlist_file[64];
@@ -891,9 +1282,11 @@
             OutputStream *os = &c->streams[i];
             if (st->codecpar->codec_type != AVMEDIA_TYPE_AUDIO)
                 continue;
+            if (os->segment_type != SEGMENT_TYPE_MP4)
+                continue;
             get_hls_playlist_name(playlist_file, sizeof(playlist_file), NULL, i);
-            ff_hls_write_audio_rendition(out, (char *)audio_group,
-                                         playlist_file, i, is_default);
+            ff_hls_write_audio_rendition(c->m3u8_out, (char *)audio_group,
+                                         playlist_file, NULL, i, is_default);
             max_audio_bitrate = FFMAX(st->codecpar->bit_rate +
                                       os->muxer_overhead, max_audio_bitrate);
             if (!av_strnstr(audio_codec_str, os->codec_str, sizeof(audio_codec_str))) {
@@ -910,9 +1303,12 @@
             AVStream *st = s->streams[i];
             OutputStream *os = &c->streams[i];
             char *agroup = NULL;
+            char *codec_str_ptr = NULL;
             int stream_bitrate = st->codecpar->bit_rate + os->muxer_overhead;
             if (st->codecpar->codec_type != AVMEDIA_TYPE_VIDEO)
                 continue;
+            if (os->segment_type != SEGMENT_TYPE_MP4)
+                continue;
             av_strlcpy(codec_str, os->codec_str, sizeof(codec_str));
             if (max_audio_bitrate) {
                 agroup = (char *)audio_group;
@@ -920,13 +1316,17 @@
                 av_strlcat(codec_str, ",", sizeof(codec_str));
                 av_strlcat(codec_str, audio_codec_str, sizeof(codec_str));
             }
+            if (st->codecpar->codec_id != AV_CODEC_ID_HEVC) {
+                codec_str_ptr = codec_str;
+            }
             get_hls_playlist_name(playlist_file, sizeof(playlist_file), NULL, i);
-            ff_hls_write_stream_info(st, out, stream_bitrate, playlist_file, agroup,
-                                     codec_str, NULL);
+            ff_hls_write_stream_info(st, c->m3u8_out, stream_bitrate,
+                                     playlist_file, agroup,
+                                     codec_str_ptr, NULL, NULL);
         }
-        avio_close(out);
+        dashenc_io_close(s, &c->m3u8_out, temp_filename);
         if (use_rename)
-            if ((ret = avpriv_io_move(temp_filename, filename_hls)) < 0)
+            if ((ret = ff_rename(temp_filename, filename_hls, s)) < 0)
                 return ret;
         c->master_playlist_created = 1;
     }
@@ -949,17 +1349,91 @@
     char *ptr;
     char basename[1024];
 
+    c->nr_of_streams_to_flush = 0;
     if (c->single_file_name)
         c->single_file = 1;
     if (c->single_file)
         c->use_template = 0;
 
+    if (!c->profile) {
+        av_log(s, AV_LOG_ERROR, "At least one profile must be enabled.\n");
+        return AVERROR(EINVAL);
+    }
 #if FF_API_DASH_MIN_SEG_DURATION
     if (c->min_seg_duration != 5000000) {
         av_log(s, AV_LOG_WARNING, "The min_seg_duration option is deprecated and will be removed. Please use the -seg_duration\n");
         c->seg_duration = c->min_seg_duration;
     }
 #endif
+    if (c->lhls && s->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
+        av_log(s, AV_LOG_ERROR,
+               "LHLS is experimental, Please set -strict experimental in order to enable it.\n");
+        return AVERROR_EXPERIMENTAL;
+    }
+
+    if (c->lhls && !c->streaming) {
+        av_log(s, AV_LOG_WARNING, "LHLS option will be ignored as streaming is not enabled\n");
+        c->lhls = 0;
+    }
+
+    if (c->lhls && !c->hls_playlist) {
+        av_log(s, AV_LOG_WARNING, "LHLS option will be ignored as hls_playlist is not enabled\n");
+        c->lhls = 0;
+    }
+
+    if (c->ldash && !c->streaming) {
+        av_log(s, AV_LOG_WARNING, "LDash option will be ignored as streaming is not enabled\n");
+        c->ldash = 0;
+    }
+
+    if (c->target_latency && !c->streaming) {
+        av_log(s, AV_LOG_WARNING, "Target latency option will be ignored as streaming is not enabled\n");
+        c->target_latency = 0;
+    }
+
+    if (c->global_sidx && !c->single_file) {
+        av_log(s, AV_LOG_WARNING, "Global SIDX option will be ignored as single_file is not enabled\n");
+        c->global_sidx = 0;
+    }
+
+    if (c->global_sidx && c->streaming) {
+        av_log(s, AV_LOG_WARNING, "Global SIDX option will be ignored as streaming is enabled\n");
+        c->global_sidx = 0;
+    }
+    if (c->frag_type == FRAG_TYPE_NONE && c->streaming) {
+        av_log(s, AV_LOG_VERBOSE, "Changing frag_type from none to every_frame as streaming is enabled\n");
+        c->frag_type = FRAG_TYPE_EVERY_FRAME;
+    }
+
+    if (c->write_prft < 0) {
+        c->write_prft = c->ldash;
+        if (c->ldash)
+            av_log(s, AV_LOG_VERBOSE, "Enabling Producer Reference Time element for Low Latency mode\n");
+    }
+
+    if (c->write_prft && !c->utc_timing_url) {
+        av_log(s, AV_LOG_WARNING, "Producer Reference Time element option will be ignored as utc_timing_url is not set\n");
+        c->write_prft = 0;
+    }
+
+    if (c->write_prft && !c->streaming) {
+        av_log(s, AV_LOG_WARNING, "Producer Reference Time element option will be ignored as streaming is not enabled\n");
+        c->write_prft = 0;
+    }
+
+    if (c->ldash && !c->write_prft) {
+        av_log(s, AV_LOG_WARNING, "Low Latency mode enabled without Producer Reference Time element option! Resulting manifest may not be complaint\n");
+    }
+
+    if (c->target_latency && !c->write_prft) {
+        av_log(s, AV_LOG_WARNING, "Target latency option will be ignored as Producer Reference Time element will not be written\n");
+        c->target_latency = 0;
+    }
+
+    if (av_cmp_q(c->max_playback_rate, c->min_playback_rate) < 0) {
+        av_log(s, AV_LOG_WARNING, "Minimum playback rate value is higer than the Maximum. Both will be ignored\n");
+        c->min_playback_rate = c->max_playback_rate = (AVRational) {1, 1};
+    }
 
     av_strlcpy(c->dirname, s->url, sizeof(c->dirname));
     ptr = strrchr(c->dirname, '/');
@@ -982,6 +1456,9 @@
     if ((ret = parse_adaptation_sets(s)) < 0)
         return ret;
 
+    if ((ret = init_segment_types(s)) < 0)
+        return ret;
+
     for (i = 0; i < s->nb_streams; i++) {
         OutputStream *os = &c->streams[i];
         AdaptationSet *as = &c->as[os->as_idx - 1];
@@ -1003,28 +1480,45 @@
         dict_copy_entry(&as->metadata, s->streams[i]->metadata, "language");
         dict_copy_entry(&as->metadata, s->streams[i]->metadata, "role");
 
-        ctx = avformat_alloc_context();
-        if (!ctx)
-            return AVERROR(ENOMEM);
+        if (c->init_seg_name) {
+            os->init_seg_name = av_strireplace(c->init_seg_name, "$ext$", os->extension_name);
+            if (!os->init_seg_name)
+                return AVERROR(ENOMEM);
+        }
+        if (c->media_seg_name) {
+            os->media_seg_name = av_strireplace(c->media_seg_name, "$ext$", os->extension_name);
+            if (!os->media_seg_name)
+                return AVERROR(ENOMEM);
+        }
+        if (c->single_file_name) {
+            os->single_file_name = av_strireplace(c->single_file_name, "$ext$", os->extension_name);
+            if (!os->single_file_name)
+                return AVERROR(ENOMEM);
+        }
 
-        c->format_name = get_format_str(c->segment_type);
-        if (!c->format_name)
-            return AVERROR_MUXER_NOT_FOUND;
-        if (c->segment_type == SEGMENT_TYPE_WEBM) {
-            if ((!c->single_file && check_file_extension(c->init_seg_name, c->format_name) != 0) ||
-                (!c->single_file && check_file_extension(c->media_seg_name, c->format_name) != 0) ||
-                (c->single_file && check_file_extension(c->single_file_name, c->format_name) != 0)) {
+        if (os->segment_type == SEGMENT_TYPE_WEBM) {
+            if ((!c->single_file && check_file_extension(os->init_seg_name, os->format_name) != 0) ||
+                (!c->single_file && check_file_extension(os->media_seg_name, os->format_name) != 0) ||
+                (c->single_file && check_file_extension(os->single_file_name, os->format_name) != 0)) {
                 av_log(s, AV_LOG_WARNING,
                        "One or many segment file names doesn't end with .webm. "
                        "Override -init_seg_name and/or -media_seg_name and/or "
                        "-single_file_name to end with the extension .webm\n");
             }
+            if (c->streaming) {
+                // Streaming not supported as matroskaenc buffers internally before writing the output
+                av_log(s, AV_LOG_WARNING, "One or more streams in WebM output format. Streaming option will be ignored\n");
+                c->streaming = 0;
+            }
         }
 
-        ctx->oformat = av_guess_format(c->format_name, NULL, NULL);
+        os->ctx = ctx = avformat_alloc_context();
+        if (!ctx)
+            return AVERROR(ENOMEM);
+
+        ctx->oformat = av_guess_format(os->format_name, NULL, NULL);
         if (!ctx->oformat)
             return AVERROR_MUXER_NOT_FOUND;
-        os->ctx = ctx;
         ctx->interrupt_callback    = s->interrupt_callback;
         ctx->opaque                = s->opaque;
         ctx->io_close              = s->io_close;
@@ -1040,36 +1534,95 @@
         ctx->avoid_negative_ts = s->avoid_negative_ts;
         ctx->flags = s->flags;
 
-        if ((ret = avio_open_dyn_buf(&ctx->pb)) < 0)
-            return ret;
+        os->parser = av_parser_init(st->codecpar->codec_id);
+        if (os->parser) {
+            os->parser_avctx = avcodec_alloc_context3(NULL);
+            if (!os->parser_avctx)
+                return AVERROR(ENOMEM);
+            ret = avcodec_parameters_to_context(os->parser_avctx, st->codecpar);
+            if (ret < 0)
+                return ret;
+            // We only want to parse frame headers
+            os->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
+        }
 
         if (c->single_file) {
-            if (c->single_file_name)
-                ff_dash_fill_tmpl_params(os->initfile, sizeof(os->initfile), c->single_file_name, i, 0, os->bit_rate, 0);
+            if (os->single_file_name)
+                ff_dash_fill_tmpl_params(os->initfile, sizeof(os->initfile), os->single_file_name, i, 0, os->bit_rate, 0);
             else
-                snprintf(os->initfile, sizeof(os->initfile), "%s-stream%d.m4s", basename, i);
+                snprintf(os->initfile, sizeof(os->initfile), "%s-stream%d.%s", basename, i, os->format_name);
         } else {
-            ff_dash_fill_tmpl_params(os->initfile, sizeof(os->initfile), c->init_seg_name, i, 0, os->bit_rate, 0);
+            ff_dash_fill_tmpl_params(os->initfile, sizeof(os->initfile), os->init_seg_name, i, 0, os->bit_rate, 0);
         }
         snprintf(filename, sizeof(filename), "%s%s", c->dirname, os->initfile);
         set_http_options(&opts, c);
-        ret = s->io_open(s, &os->out, filename, AVIO_FLAG_WRITE, &opts);
+        if (!c->single_file) {
+            if ((ret = avio_open_dyn_buf(&ctx->pb)) < 0)
+                return ret;
+            ret = s->io_open(s, &os->out, filename, AVIO_FLAG_WRITE, &opts);
+        } else {
+            ctx->url = av_strdup(filename);
+            ret = avio_open2(&ctx->pb, filename, AVIO_FLAG_WRITE, NULL, &opts);
+        }
+        av_dict_free(&opts);
         if (ret < 0)
             return ret;
-        av_dict_free(&opts);
         os->init_start_pos = 0;
 
-        if (c->format_options_str) {
-            ret = av_dict_parse_string(&opts, c->format_options_str, "=", ":", 0);
-            if (ret < 0)
-                return ret;
+        av_dict_copy(&opts, c->format_options, 0);
+        if (!as->seg_duration)
+            as->seg_duration = c->seg_duration;
+        if (!as->frag_duration)
+            as->frag_duration = c->frag_duration;
+        if (as->frag_type < 0)
+            as->frag_type = c->frag_type;
+        os->seg_duration = as->seg_duration;
+        os->frag_duration = as->frag_duration;
+        os->frag_type = as->frag_type;
+
+        c->max_segment_duration = FFMAX(c->max_segment_duration, as->seg_duration);
+
+        if (c->profile & MPD_PROFILE_DVB && (os->seg_duration > 15000000 || os->seg_duration < 960000)) {
+            av_log(s, AV_LOG_ERROR, "Segment duration %"PRId64" is outside the allowed range for DVB-DASH profile\n", os->seg_duration);
+            return AVERROR(EINVAL);
         }
 
-        if (c->segment_type == SEGMENT_TYPE_MP4) {
+        if (os->frag_type == FRAG_TYPE_DURATION && !os->frag_duration) {
+            av_log(s, AV_LOG_WARNING, "frag_type set to duration for stream %d but no frag_duration set\n", i);
+            os->frag_type = c->streaming ? FRAG_TYPE_EVERY_FRAME : FRAG_TYPE_NONE;
+        }
+        if (os->frag_type == FRAG_TYPE_DURATION && os->frag_duration > os->seg_duration) {
+            av_log(s, AV_LOG_ERROR, "Fragment duration %"PRId64" is longer than Segment duration %"PRId64"\n", os->frag_duration, os->seg_duration);
+            return AVERROR(EINVAL);
+        }
+        if (os->frag_type == FRAG_TYPE_PFRAMES && (st->codecpar->codec_type != AVMEDIA_TYPE_VIDEO || !os->parser)) {
+            if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO && !os->parser)
+                av_log(s, AV_LOG_WARNING, "frag_type set to P-Frame reordering, but no parser found for stream %d\n", i);
+            os->frag_type = c->streaming ? FRAG_TYPE_EVERY_FRAME : FRAG_TYPE_NONE;
+        }
+        if (os->frag_type != FRAG_TYPE_PFRAMES && as->trick_idx < 0)
+            // Set this now if a parser isn't used
+            os->coding_dependency = 1;
+
+        if (os->segment_type == SEGMENT_TYPE_MP4) {
             if (c->streaming)
-                av_dict_set(&opts, "movflags", "frag_every_frame+dash+delay_moov+global_sidx", 0);
+                // skip_sidx : Reduce bitrate overhead
+                // skip_trailer : Avoids growing memory usage with time
+                av_dict_set(&opts, "movflags", "+dash+delay_moov+skip_sidx+skip_trailer", AV_DICT_APPEND);
+            else {
+                if (c->global_sidx)
+                    av_dict_set(&opts, "movflags", "+dash+delay_moov+global_sidx+skip_trailer", AV_DICT_APPEND);
+                else
+                    av_dict_set(&opts, "movflags", "+dash+delay_moov+skip_trailer", AV_DICT_APPEND);
+            }
+            if (os->frag_type == FRAG_TYPE_EVERY_FRAME)
+                av_dict_set(&opts, "movflags", "+frag_every_frame", AV_DICT_APPEND);
             else
-                av_dict_set(&opts, "movflags", "frag_custom+dash+delay_moov", 0);
+                av_dict_set(&opts, "movflags", "+frag_custom", AV_DICT_APPEND);
+            if (os->frag_type == FRAG_TYPE_DURATION)
+                av_dict_set_int(&opts, "frag_duration", os->frag_duration, 0);
+            if (c->write_prft)
+                av_dict_set(&opts, "write_prft", "wallclock", 0);
         } else {
             av_dict_set_int(&opts, "cluster_time_limit", c->seg_duration / 1000, 0);
             av_dict_set_int(&opts, "cluster_size_limit", 5 * 1024 * 1024, 0); // set a large cluster size limit
@@ -1077,11 +1630,12 @@
             av_dict_set_int(&opts, "dash_track_number", i + 1, 0);
             av_dict_set_int(&opts, "live", 1, 0);
         }
-        if ((ret = avformat_init_output(ctx, &opts)) < 0)
+        ret = avformat_init_output(ctx, &opts);
+        av_dict_free(&opts);
+        if (ret < 0)
             return ret;
         os->ctx_inited = 1;
         avio_flush(ctx->pb);
-        av_dict_free(&opts);
 
         av_log(s, AV_LOG_VERBOSE, "Representation %d init segment will be written to: %s\n", i, filename);
 
@@ -1092,6 +1646,7 @@
         s->avoid_negative_ts = ctx->avoid_negative_ts;
         if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
             AVRational avg_frame_rate = s->streams[i]->avg_frame_rate;
+            AVRational par;
             if (avg_frame_rate.num > 0) {
                 if (av_cmp_q(avg_frame_rate, as->min_frame_rate) < 0)
                     as->min_frame_rate = avg_frame_rate;
@@ -1100,6 +1655,27 @@
             } else {
                 as->ambiguous_frame_rate = 1;
             }
+
+            if (st->codecpar->width > as->max_width)
+                as->max_width = st->codecpar->width;
+            if (st->codecpar->height > as->max_height)
+                as->max_height = st->codecpar->height;
+
+            if (st->sample_aspect_ratio.num)
+                os->sar = st->sample_aspect_ratio;
+            else
+                os->sar = (AVRational){1,1};
+            av_reduce(&par.num, &par.den,
+                      st->codecpar->width * (int64_t)os->sar.num,
+                      st->codecpar->height * (int64_t)os->sar.den,
+                      1024 * 1024);
+
+            if (as->par.num && av_cmp_q(par, as->par)) {
+                av_log(s, AV_LOG_ERROR, "Conflicting stream par values in Adaptation Set %d\n", os->as_idx);
+                return AVERROR(EINVAL);
+            }
+            as->par = par;
+
             c->has_video = 1;
         }
 
@@ -1109,12 +1685,21 @@
         os->max_pts = AV_NOPTS_VALUE;
         os->last_dts = AV_NOPTS_VALUE;
         os->segment_index = 1;
+
+        if (s->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO)
+            c->nr_of_streams_to_flush++;
     }
 
     if (!c->has_video && c->seg_duration <= 0) {
         av_log(s, AV_LOG_WARNING, "no video stream and no seg duration set\n");
         return AVERROR(EINVAL);
     }
+    if (!c->has_video && c->frag_type == FRAG_TYPE_PFRAMES)
+        av_log(s, AV_LOG_WARNING, "no video stream and P-frame fragmentation set\n");
+
+    c->nr_of_streams_flushed = 0;
+    c->target_latency_refid = -1;
+
     return 0;
 }
 
@@ -1130,7 +1715,7 @@
         // Flush init segment
         // Only for WebM segment, since for mp4 delay_moov is set and
         // the init segment is thus flushed after the first packets.
-        if (c->segment_type == SEGMENT_TYPE_WEBM &&
+        if (os->segment_type == SEGMENT_TYPE_WEBM &&
             (ret = flush_init_segment(s, os)) < 0)
             return ret;
     }
@@ -1138,7 +1723,7 @@
 }
 
 static int add_segment(OutputStream *os, const char *file,
-                       int64_t time, int duration,
+                       int64_t time, int64_t duration,
                        int64_t start_pos, int64_t range_length,
                        int64_t index_length, int next_exp_index)
 {
@@ -1211,23 +1796,24 @@
 }
 
 static int update_stream_extradata(AVFormatContext *s, OutputStream *os,
-                                   AVCodecParameters *par,
-                                   AVRational *frame_rate)
+                                   AVPacket *pkt, AVRational *frame_rate)
 {
+    AVCodecParameters *par = os->ctx->streams[0]->codecpar;
     uint8_t *extradata;
+    int ret, extradata_size;
 
-    if (os->ctx->streams[0]->codecpar->extradata_size || !par->extradata_size)
+    if (par->extradata_size)
         return 0;
 
-    extradata = av_malloc(par->extradata_size);
+    extradata = av_packet_get_side_data(pkt, AV_PKT_DATA_NEW_EXTRADATA, &extradata_size);
+    if (!extradata_size)
+        return 0;
 
-    if (!extradata)
-        return AVERROR(ENOMEM);
+    ret = ff_alloc_extradata(par, extradata_size);
+    if (ret < 0)
+        return ret;
 
-    memcpy(extradata, par->extradata, par->extradata_size);
-
-    os->ctx->streams[0]->codecpar->extradata = extradata;
-    os->ctx->streams[0]->codecpar->extradata_size = par->extradata_size;
+    memcpy(par->extradata, extradata, extradata_size);
 
     set_codec_str(s, par, frame_rate, os->codec_str, sizeof(os->codec_str));
 
@@ -1250,12 +1836,58 @@
         }
 
         av_dict_free(&http_opts);
-        dashenc_io_close(s, &out, filename);
-    } else if (unlink(filename) < 0) {
-        av_log(s, AV_LOG_ERROR, "failed to delete %s: %s\n", filename, strerror(errno));
+        ff_format_io_close(s, &out);
+    } else {
+        int res = avpriv_io_delete(filename);
+        if (res < 0) {
+            char errbuf[AV_ERROR_MAX_STRING_SIZE];
+            av_strerror(res, errbuf, sizeof(errbuf));
+            av_log(s, (res == AVERROR(ENOENT) ? AV_LOG_WARNING : AV_LOG_ERROR), "failed to delete %s: %s\n", filename, errbuf);
+        }
     }
 }
 
+static int dashenc_delete_segment_file(AVFormatContext *s, const char* file)
+{
+    DASHContext *c = s->priv_data;
+    size_t dirname_len, file_len;
+    char filename[1024];
+
+    dirname_len = strlen(c->dirname);
+    if (dirname_len >= sizeof(filename)) {
+        av_log(s, AV_LOG_WARNING, "Cannot delete segments as the directory path is too long: %"PRIu64" characters: %s\n",
+            (uint64_t)dirname_len, c->dirname);
+        return AVERROR(ENAMETOOLONG);
+    }
+
+    memcpy(filename, c->dirname, dirname_len);
+
+    file_len = strlen(file);
+    if ((dirname_len + file_len) >= sizeof(filename)) {
+        av_log(s, AV_LOG_WARNING, "Cannot delete segments as the path is too long: %"PRIu64" characters: %s%s\n",
+            (uint64_t)(dirname_len + file_len), c->dirname, file);
+        return AVERROR(ENAMETOOLONG);
+    }
+
+    memcpy(filename + dirname_len, file, file_len + 1); // include the terminating zero
+    dashenc_delete_file(s, filename);
+
+    return 0;
+}
+
+static inline void dashenc_delete_media_segments(AVFormatContext *s, OutputStream *os, int remove_count)
+{
+    for (int i = 0; i < remove_count; ++i) {
+        dashenc_delete_segment_file(s, os->segments[i]->file);
+
+        // Delete the segment regardless of whether the file was successfully deleted
+        av_free(os->segments[i]);
+    }
+
+    os->nb_segments -= remove_count;
+    memmove(os->segments, os->segments + remove_count, os->nb_segments * sizeof(*os->segments));
+}
+
 static int dash_flush(AVFormatContext *s, int final, int stream)
 {
     DASHContext *c = s->priv_data;
@@ -1276,7 +1908,7 @@
                                             c->streams[stream].first_pts,
                                             s->streams[stream]->time_base,
                                             AV_TIME_BASE_Q);
-            next_exp_index = (pts_diff / c->seg_duration) + 1;
+            next_exp_index = (pts_diff / c->streams[stream].seg_duration) + 1;
         }
     }
 
@@ -1292,6 +1924,9 @@
         // Flush all audio streams as well, in sync with video keyframes,
         // but not the other video streams.
         if (stream >= 0 && i != stream) {
+            if (s->streams[stream]->codecpar->codec_type != AVMEDIA_TYPE_VIDEO &&
+                s->streams[i]->codecpar->codec_type != AVMEDIA_TYPE_VIDEO)
+                continue;
             if (s->streams[i]->codecpar->codec_type != AVMEDIA_TYPE_AUDIO)
                 continue;
             // Make sure we don't flush audio streams multiple times, when
@@ -1300,14 +1935,10 @@
                 continue;
         }
 
-        if (!c->single_file) {
-            if (c->segment_type == SEGMENT_TYPE_MP4 && !os->written_len)
-                write_styp(os->ctx->pb);
-        } else {
+        if (c->single_file)
             snprintf(os->full_path, sizeof(os->full_path), "%s%s", c->dirname, os->initfile);
-        }
 
-        ret = flush_dynbuf(os, &range_length);
+        ret = flush_dynbuf(c, os, &range_length);
         if (ret < 0)
             break;
         os->packets_written = 0;
@@ -1318,18 +1949,23 @@
             dashenc_io_close(s, &os->out, os->temp_path);
 
             if (use_rename) {
-                ret = avpriv_io_move(os->temp_path, os->full_path);
+                ret = ff_rename(os->temp_path, os->full_path, os->ctx);
                 if (ret < 0)
                     break;
             }
         }
 
-        if (!os->muxer_overhead)
+        os->last_duration = FFMAX(os->last_duration, av_rescale_q(os->max_pts - os->start_pts,
+                                                                  st->time_base,
+                                                                  AV_TIME_BASE_Q));
+
+        if (!os->muxer_overhead && os->max_pts > os->start_pts)
             os->muxer_overhead = ((int64_t) (range_length - os->total_pkt_size) *
                                   8 * AV_TIME_BASE) /
                                  av_rescale_q(os->max_pts - os->start_pts,
                                               st->time_base, AV_TIME_BASE_Q);
         os->total_pkt_size = 0;
+        os->total_pkt_duration = 0;
 
         if (!os->bit_rate) {
             // calculate average bitrate of first segment
@@ -1345,40 +1981,87 @@
         os->pos += range_length;
     }
 
-    if (c->window_size || (final && c->remove_at_exit)) {
+    if (c->window_size) {
         for (i = 0; i < s->nb_streams; i++) {
             OutputStream *os = &c->streams[i];
-            int j;
-            int remove = os->nb_segments - c->window_size - c->extra_window_size;
-            if (final && c->remove_at_exit)
-                remove = os->nb_segments;
-            if (remove > 0) {
-                for (j = 0; j < remove; j++) {
-                    char filename[1024];
-                    snprintf(filename, sizeof(filename), "%s%s", c->dirname, os->segments[j]->file);
-                    dashenc_delete_file(s, filename);
-                    av_free(os->segments[j]);
-                }
-                os->nb_segments -= remove;
-                memmove(os->segments, os->segments + remove, os->nb_segments * sizeof(*os->segments));
-            }
+            int remove_count = os->nb_segments - c->window_size - c->extra_window_size;
+            if (remove_count > 0)
+                dashenc_delete_media_segments(s, os, remove_count);
         }
     }
 
-    if (ret >= 0)
+    if (final) {
+        for (i = 0; i < s->nb_streams; i++) {
+            OutputStream *os = &c->streams[i];
+            if (os->ctx && os->ctx_inited) {
+                int64_t file_size = avio_tell(os->ctx->pb);
+                av_write_trailer(os->ctx);
+                if (c->global_sidx) {
+                    int j, start_index, start_number;
+                    int64_t sidx_size = avio_tell(os->ctx->pb) - file_size;
+                    get_start_index_number(os, c, &start_index, &start_number);
+                    if (start_index >= os->nb_segments ||
+                        os->segment_type != SEGMENT_TYPE_MP4)
+                        continue;
+                    os->init_range_length += sidx_size;
+                    for (j = start_index; j < os->nb_segments; j++) {
+                        Segment *seg = os->segments[j];
+                        seg->start_pos += sidx_size;
+                    }
+                }
+
+            }
+        }
+    }
+    if (ret >= 0) {
+        if (c->has_video && !final) {
+            c->nr_of_streams_flushed++;
+            if (c->nr_of_streams_flushed != c->nr_of_streams_to_flush)
+                return ret;
+
+            c->nr_of_streams_flushed = 0;
+        }
         ret = write_manifest(s, final);
+    }
     return ret;
 }
 
+static int dash_parse_prft(DASHContext *c, AVPacket *pkt)
+{
+    OutputStream *os = &c->streams[pkt->stream_index];
+    AVProducerReferenceTime *prft;
+    int side_data_size;
+
+    prft = (AVProducerReferenceTime *)av_packet_get_side_data(pkt, AV_PKT_DATA_PRFT, &side_data_size);
+    if (!prft || side_data_size != sizeof(AVProducerReferenceTime) || (prft->flags && prft->flags != 24)) {
+        // No encoder generated or user provided capture time AVProducerReferenceTime side data. Instead
+        // of letting the mov muxer generate one, do it here so we can also use it for the manifest.
+        prft = (AVProducerReferenceTime *)av_packet_new_side_data(pkt, AV_PKT_DATA_PRFT,
+                                                                  sizeof(AVProducerReferenceTime));
+        if (!prft)
+            return AVERROR(ENOMEM);
+        prft->wallclock = av_gettime();
+        prft->flags = 24;
+    }
+    if (os->first_pts == AV_NOPTS_VALUE) {
+        os->producer_reference_time = *prft;
+        if (c->target_latency_refid < 0)
+            c->target_latency_refid = pkt->stream_index;
+    }
+
+    return 0;
+}
+
 static int dash_write_packet(AVFormatContext *s, AVPacket *pkt)
 {
     DASHContext *c = s->priv_data;
     AVStream *st = s->streams[pkt->stream_index];
     OutputStream *os = &c->streams[pkt->stream_index];
+    AdaptationSet *as = &c->as[os->as_idx - 1];
     int64_t seg_end_duration, elapsed_duration;
     int ret;
 
-    ret = update_stream_extradata(s, os, st->codecpar, &st->avg_frame_rate);
+    ret = update_stream_extradata(s, os, pkt, &st->avg_frame_rate);
     if (ret < 0)
         return ret;
 
@@ -1400,35 +2083,72 @@
         pkt->dts  = 0;
     }
 
-    if (os->first_pts == AV_NOPTS_VALUE)
+    if (c->write_prft) {
+        ret = dash_parse_prft(c, pkt);
+        if (ret < 0)
+            return ret;
+    }
+
+    if (os->first_pts == AV_NOPTS_VALUE) {
         os->first_pts = pkt->pts;
+    }
     os->last_pts = pkt->pts;
 
-    if (!c->availability_start_time[0])
-        format_date_now(c->availability_start_time,
-                        sizeof(c->availability_start_time));
+    if (!c->availability_start_time[0]) {
+        int64_t start_time_us = av_gettime();
+        c->start_time_s = start_time_us / 1000000;
+        format_date(c->availability_start_time,
+                    sizeof(c->availability_start_time), start_time_us);
+    }
 
-    if (!os->availability_time_offset && pkt->duration) {
-        int64_t frame_duration = av_rescale_q(pkt->duration, st->time_base,
-                                              AV_TIME_BASE_Q);
-         os->availability_time_offset = ((double) c->seg_duration -
+    if (!os->packets_written)
+        os->availability_time_offset = 0;
+
+    if (!os->availability_time_offset &&
+        ((os->frag_type == FRAG_TYPE_DURATION && os->seg_duration != os->frag_duration) ||
+         (os->frag_type == FRAG_TYPE_EVERY_FRAME && pkt->duration))) {
+        AdaptationSet *as = &c->as[os->as_idx - 1];
+        int64_t frame_duration = 0;
+
+        switch (os->frag_type) {
+        case FRAG_TYPE_DURATION:
+            frame_duration = os->frag_duration;
+            break;
+        case FRAG_TYPE_EVERY_FRAME:
+            frame_duration = av_rescale_q(pkt->duration, st->time_base, AV_TIME_BASE_Q);
+            break;
+        }
+
+         os->availability_time_offset = ((double) os->seg_duration -
                                          frame_duration) / AV_TIME_BASE;
+        as->max_frag_duration = FFMAX(frame_duration, as->max_frag_duration);
     }
 
     if (c->use_template && !c->use_timeline) {
         elapsed_duration = pkt->pts - os->first_pts;
-        seg_end_duration = (int64_t) os->segment_index * c->seg_duration;
+        seg_end_duration = (int64_t) os->segment_index * os->seg_duration;
     } else {
         elapsed_duration = pkt->pts - os->start_pts;
-        seg_end_duration = c->seg_duration;
+        seg_end_duration = os->seg_duration;
     }
 
-    if ((!c->has_video || st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) &&
-        pkt->flags & AV_PKT_FLAG_KEY && os->packets_written &&
+    if (os->parser &&
+        (os->frag_type == FRAG_TYPE_PFRAMES ||
+         as->trick_idx >= 0)) {
+        // Parse the packets only in scenarios where it's needed
+        uint8_t *data;
+        int size;
+        av_parser_parse2(os->parser, os->parser_avctx,
+                         &data, &size, pkt->data, pkt->size,
+                         pkt->pts, pkt->dts, pkt->pos);
+
+        os->coding_dependency |= os->parser->pict_type != AV_PICTURE_TYPE_I;
+    }
+
+    if (pkt->flags & AV_PKT_FLAG_KEY && os->packets_written &&
         av_compare_ts(elapsed_duration, st->time_base,
                       seg_end_duration, AV_TIME_BASE_Q) >= 0) {
-        int64_t prev_duration = c->last_duration;
-
+        if (!c->has_video || st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
         c->last_duration = av_rescale_q(pkt->pts - os->start_pts,
                                         st->time_base,
                                         AV_TIME_BASE_Q);
@@ -1436,14 +2156,20 @@
                                          st->time_base,
                                          AV_TIME_BASE_Q);
 
-        if ((!c->use_timeline || !c->use_template) && prev_duration) {
-            if (c->last_duration < prev_duration*9/10 ||
-                c->last_duration > prev_duration*11/10) {
+        if ((!c->use_timeline || !c->use_template) && os->last_duration) {
+            if (c->last_duration < os->last_duration*9/10 ||
+                c->last_duration > os->last_duration*11/10) {
                 av_log(s, AV_LOG_WARNING,
                        "Segment durations differ too much, enable use_timeline "
                        "and use_template, or keep a stricter keyframe interval\n");
             }
         }
+        }
+
+        if (c->write_prft && os->producer_reference_time.wallclock && !os->producer_reference_time_str[0])
+            format_date(os->producer_reference_time_str,
+                        sizeof(os->producer_reference_time_str),
+                        os->producer_reference_time.wallclock);
 
         if ((ret = dash_flush(s, 0, pkt->stream_index)) < 0)
             return ret;
@@ -1462,11 +2188,42 @@
         os->max_pts = pkt->pts + pkt->duration;
     else
         os->max_pts = FFMAX(os->max_pts, pkt->pts + pkt->duration);
-    os->packets_written++;
-    os->total_pkt_size += pkt->size;
+
+    if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO &&
+        os->frag_type == FRAG_TYPE_PFRAMES &&
+        os->packets_written) {
+        av_assert0(os->parser);
+        if ((os->parser->pict_type == AV_PICTURE_TYPE_P &&
+             st->codecpar->video_delay &&
+             !(os->last_flags & AV_PKT_FLAG_KEY)) ||
+            pkt->flags & AV_PKT_FLAG_KEY) {
+            ret = av_write_frame(os->ctx, NULL);
+            if (ret < 0)
+                return ret;
+
+            if (!os->availability_time_offset) {
+                int64_t frag_duration = av_rescale_q(os->total_pkt_duration, st->time_base,
+                                                     AV_TIME_BASE_Q);
+                os->availability_time_offset = ((double) os->seg_duration -
+                                                 frag_duration) / AV_TIME_BASE;
+               as->max_frag_duration = FFMAX(frag_duration, as->max_frag_duration);
+            }
+        }
+    }
+
+    if (pkt->flags & AV_PKT_FLAG_KEY && (os->packets_written || os->nb_segments) && !os->gop_size && as->trick_idx < 0) {
+        os->gop_size = os->last_duration + av_rescale_q(os->total_pkt_duration, st->time_base, AV_TIME_BASE_Q);
+        c->max_gop_size = FFMAX(c->max_gop_size, os->gop_size);
+    }
+
     if ((ret = ff_write_chained(os->ctx, 0, pkt, s, 0)) < 0)
         return ret;
 
+    os->packets_written++;
+    os->total_pkt_size += pkt->size;
+    os->total_pkt_duration += pkt->duration;
+    os->last_flags = pkt->flags;
+
     if (!os->init_range_length)
         flush_init_segment(s, os);
 
@@ -1475,9 +2232,11 @@
         AVDictionary *opts = NULL;
         const char *proto = avio_find_protocol_name(s->url);
         int use_rename = proto && !strcmp(proto, "file");
+        if (os->segment_type == SEGMENT_TYPE_MP4)
+            write_styp(os->ctx->pb);
         os->filename[0] = os->full_path[0] = os->temp_path[0] = '\0';
         ff_dash_fill_tmpl_params(os->filename, sizeof(os->filename),
-                                 c->media_seg_name, pkt->stream_index,
+                                 os->media_seg_name, pkt->stream_index,
                                  os->segment_index, os->bit_rate, os->start_pts);
         snprintf(os->full_path, sizeof(os->full_path), "%s%s", c->dirname,
                  os->filename);
@@ -1485,22 +2244,27 @@
                  use_rename ? "%s.tmp" : "%s", os->full_path);
         set_http_options(&opts, c);
         ret = dashenc_io_open(s, &os->out, os->temp_path, &opts);
-        if (ret < 0)
-            return ret;
         av_dict_free(&opts);
+        if (ret < 0) {
+            return handle_io_open_error(s, ret, os->temp_path);
+        }
+        if (c->lhls) {
+            char *prefetch_url = use_rename ? NULL : os->filename;
+            write_hls_media_playlist(os, s, pkt->stream_index, 0, prefetch_url);
+        }
     }
 
     //write out the data immediately in streaming mode
-    if (c->streaming && c->segment_type == SEGMENT_TYPE_MP4) {
+    if (c->streaming && os->segment_type == SEGMENT_TYPE_MP4) {
         int len = 0;
         uint8_t *buf = NULL;
-        if (!os->written_len)
-            write_styp(os->ctx->pb);
         avio_flush(os->ctx->pb);
         len = avio_get_dyn_buf (os->ctx->pb, &buf);
-        avio_write(os->out, buf + os->written_len, len - os->written_len);
+        if (os->out) {
+            avio_write(os->out, buf + os->written_len, len - os->written_len);
+            avio_flush(os->out);
+        }
         os->written_len = len;
-        avio_flush(os->out);
     }
 
     return ret;
@@ -1509,6 +2273,7 @@
 static int dash_write_trailer(AVFormatContext *s)
 {
     DASHContext *c = s->priv_data;
+    int i;
 
     if (s->nb_streams > 0) {
         OutputStream *os = &c->streams[0];
@@ -1525,14 +2290,23 @@
     dash_flush(s, 1, -1);
 
     if (c->remove_at_exit) {
-        char filename[1024];
-        int i;
-        for (i = 0; i < s->nb_streams; i++) {
+        for (i = 0; i < s->nb_streams; ++i) {
             OutputStream *os = &c->streams[i];
-            snprintf(filename, sizeof(filename), "%s%s", c->dirname, os->initfile);
-            dashenc_delete_file(s, filename);
+            dashenc_delete_media_segments(s, os, os->nb_segments);
+            dashenc_delete_segment_file(s, os->initfile);
+            if (c->hls_playlist && os->segment_type == SEGMENT_TYPE_MP4) {
+                char filename[1024];
+                get_hls_playlist_name(filename, sizeof(filename), c->dirname, i);
+                dashenc_delete_file(s, filename);
+            }
         }
         dashenc_delete_file(s, s->url);
+
+        if (c->hls_playlist && c->master_playlist_created) {
+            char filename[1024];
+            snprintf(filename, sizeof(filename), "%smaster.m3u8", c->dirname);
+            dashenc_delete_file(s, filename);
+        }
     }
 
     return 0;
@@ -1571,13 +2345,19 @@
     { "min_seg_duration", "minimum segment duration (in microseconds) (will be deprecated)", OFFSET(min_seg_duration), AV_OPT_TYPE_INT, { .i64 = 5000000 }, 0, INT_MAX, E },
 #endif
     { "seg_duration", "segment duration (in seconds, fractional value can be set)", OFFSET(seg_duration), AV_OPT_TYPE_DURATION, { .i64 = 5000000 }, 0, INT_MAX, E },
+    { "frag_duration", "fragment duration (in seconds, fractional value can be set)", OFFSET(frag_duration), AV_OPT_TYPE_DURATION, { .i64 = 0 }, 0, INT_MAX, E },
+    { "frag_type", "set type of interval for fragments", OFFSET(frag_type), AV_OPT_TYPE_INT, {.i64 = FRAG_TYPE_NONE }, 0, FRAG_TYPE_NB - 1, E, "frag_type"},
+    { "none", "one fragment per segment", 0, AV_OPT_TYPE_CONST, {.i64 = FRAG_TYPE_NONE }, 0, UINT_MAX, E, "frag_type"},
+    { "every_frame", "fragment at every frame", 0, AV_OPT_TYPE_CONST, {.i64 = FRAG_TYPE_EVERY_FRAME }, 0, UINT_MAX, E, "frag_type"},
+    { "duration", "fragment at specific time intervals", 0, AV_OPT_TYPE_CONST, {.i64 = FRAG_TYPE_DURATION }, 0, UINT_MAX, E, "frag_type"},
+    { "pframes", "fragment at keyframes and following P-Frame reordering (Video only, experimental)", 0, AV_OPT_TYPE_CONST, {.i64 = FRAG_TYPE_PFRAMES }, 0, UINT_MAX, E, "frag_type"},
     { "remove_at_exit", "remove all segments when finished", OFFSET(remove_at_exit), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, E },
     { "use_template", "Use SegmentTemplate instead of SegmentList", OFFSET(use_template), AV_OPT_TYPE_BOOL, { .i64 = 1 }, 0, 1, E },
     { "use_timeline", "Use SegmentTimeline in SegmentTemplate", OFFSET(use_timeline), AV_OPT_TYPE_BOOL, { .i64 = 1 }, 0, 1, E },
     { "single_file", "Store all segments in one file, accessed using byte ranges", OFFSET(single_file), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, E },
     { "single_file_name", "DASH-templated name to be used for baseURL. Implies storing all segments in one file, accessed using byte ranges", OFFSET(single_file_name), AV_OPT_TYPE_STRING, { .str = NULL }, 0, 0, E },
-    { "init_seg_name", "DASH-templated name to used for the initialization segment", OFFSET(init_seg_name), AV_OPT_TYPE_STRING, {.str = "init-stream$RepresentationID$.m4s"}, 0, 0, E },
-    { "media_seg_name", "DASH-templated name to used for the media segments", OFFSET(media_seg_name), AV_OPT_TYPE_STRING, {.str = "chunk-stream$RepresentationID$-$Number%05d$.m4s"}, 0, 0, E },
+    { "init_seg_name", "DASH-templated name to used for the initialization segment", OFFSET(init_seg_name), AV_OPT_TYPE_STRING, {.str = "init-stream$RepresentationID$.$ext$"}, 0, 0, E },
+    { "media_seg_name", "DASH-templated name to used for the media segments", OFFSET(media_seg_name), AV_OPT_TYPE_STRING, {.str = "chunk-stream$RepresentationID$-$Number%05d$.$ext$"}, 0, 0, E },
     { "utc_timing_url", "URL of the page that will return the UTC timestamp in ISO format", OFFSET(utc_timing_url), AV_OPT_TYPE_STRING, { 0 }, 0, 0, E },
     { "method", "set the HTTP method", OFFSET(method), AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, E },
     { "http_user_agent", "override User-Agent field in HTTP header", OFFSET(user_agent), AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, E},
@@ -1586,10 +2366,24 @@
     { "streaming", "Enable/Disable streaming mode of output. Each frame will be moof fragment", OFFSET(streaming), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, E },
     { "timeout", "set timeout for socket I/O operations", OFFSET(timeout), AV_OPT_TYPE_DURATION, { .i64 = -1 }, -1, INT_MAX, .flags = E },
     { "index_correction", "Enable/Disable segment index correction logic", OFFSET(index_correction), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, E },
-    { "format_options","set list of options for the container format (mp4/webm) used for dash", OFFSET(format_options_str), AV_OPT_TYPE_STRING, {.str = NULL},  0, 0, E},
-    { "dash_segment_type", "set dash segment files type", OFFSET(segment_type), AV_OPT_TYPE_INT, {.i64 = SEGMENT_TYPE_MP4 }, 0, SEGMENT_TYPE_NB - 1, E, "segment_type"},
+    { "format_options","set list of options for the container format (mp4/webm) used for dash", OFFSET(format_options), AV_OPT_TYPE_DICT, {.str = NULL},  0, 0, E},
+    { "global_sidx", "Write global SIDX atom. Applicable only for single file, mp4 output, non-streaming mode", OFFSET(global_sidx), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, E },
+    { "dash_segment_type", "set dash segment files type", OFFSET(segment_type_option), AV_OPT_TYPE_INT, {.i64 = SEGMENT_TYPE_AUTO }, 0, SEGMENT_TYPE_NB - 1, E, "segment_type"},
+    { "auto", "select segment file format based on codec", 0, AV_OPT_TYPE_CONST, {.i64 = SEGMENT_TYPE_AUTO }, 0, UINT_MAX,   E, "segment_type"},
     { "mp4", "make segment file in ISOBMFF format", 0, AV_OPT_TYPE_CONST, {.i64 = SEGMENT_TYPE_MP4 }, 0, UINT_MAX,   E, "segment_type"},
     { "webm", "make segment file in WebM format", 0, AV_OPT_TYPE_CONST, {.i64 = SEGMENT_TYPE_WEBM }, 0, UINT_MAX,   E, "segment_type"},
+    { "ignore_io_errors", "Ignore IO errors during open and write. Useful for long-duration runs with network output", OFFSET(ignore_io_errors), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, E },
+    { "lhls", "Enable Low-latency HLS(Experimental). Adds #EXT-X-PREFETCH tag with current segment's URI", OFFSET(lhls), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, E },
+    { "ldash", "Enable Low-latency dash. Constrains the value of a few elements", OFFSET(ldash), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, E },
+    { "master_m3u8_publish_rate", "Publish master playlist every after this many segment intervals", OFFSET(master_publish_rate), AV_OPT_TYPE_INT, {.i64 = 0}, 0, UINT_MAX, E},
+    { "write_prft", "Write producer reference time element", OFFSET(write_prft), AV_OPT_TYPE_BOOL, {.i64 = -1}, -1, 1, E},
+    { "mpd_profile", "Set profiles. Elements and values used in the manifest may be constrained by them", OFFSET(profile), AV_OPT_TYPE_FLAGS, {.i64 = MPD_PROFILE_DASH }, 0, UINT_MAX, E, "mpd_profile"},
+    { "dash", "MPEG-DASH ISO Base media file format live profile", 0, AV_OPT_TYPE_CONST, {.i64 = MPD_PROFILE_DASH }, 0, UINT_MAX, E, "mpd_profile"},
+    { "dvb_dash", "DVB-DASH profile", 0, AV_OPT_TYPE_CONST, {.i64 = MPD_PROFILE_DVB }, 0, UINT_MAX, E, "mpd_profile"},
+    { "http_opts", "HTTP protocol options", OFFSET(http_opts), AV_OPT_TYPE_DICT, { .str = NULL }, 0, 0, E },
+    { "target_latency", "Set desired target latency for Low-latency dash", OFFSET(target_latency), AV_OPT_TYPE_DURATION, { .i64 = 0 }, 0, INT_MAX, E },
+    { "min_playback_rate", "Set desired minimum playback rate", OFFSET(min_playback_rate), AV_OPT_TYPE_RATIONAL, { .dbl = 1.0 }, 0.5, 1.5, E },
+    { "max_playback_rate", "Set desired maximum playback rate", OFFSET(max_playback_rate), AV_OPT_TYPE_RATIONAL, { .dbl = 1.0 }, 0.5, 1.5, E },
     { NULL },
 };
 
diff --git a/libavformat/davs2.c b/libavformat/davs2.c
index df2667f..59f41fd 100644
--- a/libavformat/davs2.c
+++ b/libavformat/davs2.c
@@ -31,7 +31,7 @@
 #define ISUNIT(x) ( ISSQH(x) || ISEND(x) || (x) == 0xB2 || ISPIC(x) || (x) == 0xB5 || (x) == 0xB7 )
 #define ISAVS2(x) ((x) == 0x20 || (x) == 0x22 || (x) == 0x30 || (x) == 0x32 )
 
-static int avs2_probe(AVProbeData *p)
+static int avs2_probe(const AVProbeData *p)
 {
     uint32_t code= -1, hds=0, pic=0, seq=0;
     uint8_t state=0;
diff --git a/libavformat/dcstr.c b/libavformat/dcstr.c
index 6035dd4..9041a86 100644
--- a/libavformat/dcstr.c
+++ b/libavformat/dcstr.c
@@ -22,7 +22,7 @@
 #include "avformat.h"
 #include "internal.h"
 
-static int dcstr_probe(AVProbeData *p)
+static int dcstr_probe(const AVProbeData *p)
 {
     if (p->buf_size < 224 || memcmp(p->buf + 213, "Sega Stream", 11))
         return 0;
diff --git a/libavformat/derf.c b/libavformat/derf.c
new file mode 100644
index 0000000..58bbf5b
--- /dev/null
+++ b/libavformat/derf.c
@@ -0,0 +1,79 @@
+/*
+ * DERF demuxer
+ * Copyright (c) 2020 Paul B Mahol
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "libavutil/intreadwrite.h"
+#include "avformat.h"
+#include "internal.h"
+#include "pcm.h"
+
+static int derf_probe(const AVProbeData *p)
+{
+    if (AV_RL32(p->buf) != MKTAG('D','E','R','F'))
+        return 0;
+    if (AV_RL32(p->buf+4) != 1 && AV_RL32(p->buf+4) != 2)
+        return 0;
+
+    return AVPROBE_SCORE_MAX / 3 * 2;
+}
+
+static int derf_read_header(AVFormatContext *s)
+{
+    unsigned data_size;
+    AVIOContext *pb = s->pb;
+    AVCodecParameters *par;
+    AVStream *st;
+
+    avio_skip(pb, 4);
+
+    st = avformat_new_stream(s, NULL);
+    if (!st)
+        return AVERROR(ENOMEM);
+
+    par              = st->codecpar;
+    par->codec_type  = AVMEDIA_TYPE_AUDIO;
+    par->codec_id    = AV_CODEC_ID_DERF_DPCM;
+    par->format      = AV_SAMPLE_FMT_S16;
+    par->channels    = avio_rl32(pb);
+    if (par->channels != 1 && par->channels != 2)
+        return AVERROR_INVALIDDATA;
+    if (par->channels == 1)
+        par->channel_layout = AV_CH_LAYOUT_MONO;
+    else if (par->channels == 2)
+        par->channel_layout = AV_CH_LAYOUT_STEREO;
+    data_size = avio_rl32(pb);
+    st->duration = data_size / par->channels;
+    par->sample_rate = 22050;
+    par->block_align = 1;
+
+    avpriv_set_pts_info(st, 64, 1, par->sample_rate);
+
+    return 0;
+}
+
+AVInputFormat ff_derf_demuxer = {
+    .name           = "derf",
+    .long_name      = NULL_IF_CONFIG_SMALL("Xilam DERF"),
+    .read_probe     = derf_probe,
+    .read_header    = derf_read_header,
+    .read_packet    = ff_pcm_read_packet,
+    .read_seek      = ff_pcm_read_seek,
+    .extensions     = "adp",
+};
diff --git a/libavformat/dfa.c b/libavformat/dfa.c
index 9858ee7..bd4ef2d 100644
--- a/libavformat/dfa.c
+++ b/libavformat/dfa.c
@@ -25,7 +25,7 @@
 #include "avformat.h"
 #include "internal.h"
 
-static int dfa_probe(AVProbeData *p)
+static int dfa_probe(const AVProbeData *p)
 {
     if (p->buf_size < 4 || AV_RL32(p->buf) != MKTAG('D', 'F', 'I', 'A'))
         return 0;
@@ -40,7 +40,7 @@
 {
     AVIOContext *pb = s->pb;
     AVStream *st;
-    int frames;
+    int frames, ret;
     int version;
     uint32_t mspf;
 
@@ -69,8 +69,8 @@
     avio_skip(pb, 128 - 16); // padding
     st->duration = frames;
 
-    if (ff_alloc_extradata(st->codecpar, 2))
-        return AVERROR(ENOMEM);
+    if ((ret = ff_alloc_extradata(st->codecpar, 2)) < 0)
+        return ret;
     AV_WL16(st->codecpar->extradata, version);
     if (version == 0x100)
         st->sample_aspect_ratio = (AVRational){2, 1};
@@ -93,7 +93,6 @@
         if (!first) {
             ret = av_append_packet(pb, pkt, 12);
             if (ret < 0) {
-                av_packet_unref(pkt);
                 return ret;
             }
         } else
@@ -101,7 +100,6 @@
         frame_size = AV_RL32(pkt->data + pkt->size - 8);
         if (frame_size > INT_MAX - 4) {
             av_log(s, AV_LOG_ERROR, "Too large chunk size: %"PRIu32"\n", frame_size);
-            av_packet_unref(pkt);
             return AVERROR(EIO);
         }
         if (AV_RL32(pkt->data + pkt->size - 12) == MKTAG('E', 'O', 'F', 'R')) {
@@ -115,7 +113,6 @@
         }
         ret = av_append_packet(pb, pkt, frame_size);
         if (ret < 0) {
-            av_packet_unref(pkt);
             return ret;
         }
     }
diff --git a/libavformat/dhav.c b/libavformat/dhav.c
new file mode 100644
index 0000000..5e9abdb
--- /dev/null
+++ b/libavformat/dhav.c
@@ -0,0 +1,471 @@
+/*
+ * DHAV demuxer
+ *
+ * Copyright (c) 2018 Paul B Mahol
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "libavutil/parseutils.h"
+#include "avio_internal.h"
+#include "avformat.h"
+#include "internal.h"
+
+typedef struct DHAVContext {
+    unsigned type;
+    unsigned subtype;
+    unsigned channel;
+    unsigned frame_subnumber;
+    unsigned frame_number;
+    unsigned date;
+    unsigned timestamp;
+    int width, height;
+    int video_codec;
+    int frame_rate;
+    int audio_channels;
+    int audio_codec;
+    int sample_rate;
+    int64_t last_good_pos;
+    int64_t duration;
+
+    int video_stream_index;
+    int audio_stream_index;
+} DHAVContext;
+
+typedef struct DHAVStream {
+    int64_t last_timestamp;
+    int64_t last_time;
+    int64_t pts;
+} DHAVStream;
+
+static int dhav_probe(const AVProbeData *p)
+{
+    if (!memcmp(p->buf, "DAHUA", 5))
+        return AVPROBE_SCORE_MAX;
+
+    if (memcmp(p->buf, "DHAV", 4))
+        return 0;
+
+    if (p->buf[4] == 0xf0 ||
+        p->buf[4] == 0xf1 ||
+        p->buf[4] == 0xfc ||
+        p->buf[4] == 0xfd)
+        return AVPROBE_SCORE_MAX;
+    return 0;
+}
+
+static const uint32_t sample_rates[] = {
+    8000, 4000, 8000, 11025, 16000,
+    20000, 22050, 32000, 44100, 48000,
+    96000, 192000, 64000,
+};
+
+static int parse_ext(AVFormatContext *s, int length)
+{
+    DHAVContext *dhav = s->priv_data;
+    int index, ret = 0;
+
+    while (length > 0) {
+        int type = avio_r8(s->pb);
+
+        switch (type) {
+        case 0x80:
+            ret = avio_skip(s->pb, 1);
+            dhav->width  = 8 * avio_r8(s->pb);
+            dhav->height = 8 * avio_r8(s->pb);
+            length -= 4;
+            break;
+        case 0x81:
+            ret = avio_skip(s->pb, 1);
+            dhav->video_codec = avio_r8(s->pb);
+            dhav->frame_rate = avio_r8(s->pb);
+            length -= 4;
+            break;
+        case 0x82:
+            ret = avio_skip(s->pb, 3);
+            dhav->width  = avio_rl16(s->pb);
+            dhav->height = avio_rl16(s->pb);
+            length -= 8;
+            break;
+        case 0x83:
+            dhav->audio_channels = avio_r8(s->pb);
+            dhav->audio_codec = avio_r8(s->pb);
+            index = avio_r8(s->pb);
+            if (index < FF_ARRAY_ELEMS(sample_rates)) {
+                dhav->sample_rate = sample_rates[index];
+            } else {
+                dhav->sample_rate = 8000;
+            }
+            length -= 4;
+            break;
+        case 0x88:
+            ret = avio_skip(s->pb, 7);
+            length -= 8;
+            break;
+        case 0x8c:
+            ret = avio_skip(s->pb, 1);
+            dhav->audio_channels = avio_r8(s->pb);
+            dhav->audio_codec = avio_r8(s->pb);
+            index = avio_r8(s->pb);
+            if (index < FF_ARRAY_ELEMS(sample_rates)) {
+                dhav->sample_rate = sample_rates[index];
+            } else {
+                dhav->sample_rate = 8000;
+            }
+            ret = avio_skip(s->pb, 3);
+            length -= 8;
+            break;
+        case 0x91:
+        case 0x92:
+        case 0x93:
+        case 0x95:
+        case 0x9a:
+        case 0x9b: // sample aspect ratio
+        case 0xb3:
+            ret = avio_skip(s->pb, 7);
+            length -= 8;
+            break;
+        case 0x84:
+        case 0x85:
+        case 0x8b:
+        case 0x94:
+        case 0x96:
+        case 0xa0:
+        case 0xb2:
+        case 0xb4:
+            ret = avio_skip(s->pb, 3);
+            length -= 4;
+            break;
+        default:
+            av_log(s, AV_LOG_INFO, "Unknown type: %X, skipping rest of header.\n", type);
+            ret = avio_skip(s->pb, length - 1);
+            length = 0;
+        }
+
+        if (ret < 0)
+            return ret;
+    }
+
+    return 0;
+}
+
+static int read_chunk(AVFormatContext *s)
+{
+    DHAVContext *dhav = s->priv_data;
+    int frame_length, ext_length;
+    int64_t start, end;
+    int ret;
+
+    if (avio_feof(s->pb))
+        return AVERROR_EOF;
+
+    if (avio_rl32(s->pb) != MKTAG('D','H','A','V')) {
+        dhav->last_good_pos += 0x8000;
+        avio_seek(s->pb, dhav->last_good_pos, SEEK_SET);
+
+        while (avio_rl32(s->pb) != MKTAG('D','H','A','V')) {
+            if (avio_feof(s->pb))
+                return AVERROR_EOF;
+            dhav->last_good_pos += 0x8000;
+            ret = avio_skip(s->pb, 0x8000 - 4);
+            if (ret < 0)
+                return ret;
+        }
+    }
+
+    start = avio_tell(s->pb) - 4;
+    dhav->last_good_pos = start;
+    dhav->type = avio_r8(s->pb);
+    dhav->subtype = avio_r8(s->pb);
+    dhav->channel = avio_r8(s->pb);
+    dhav->frame_subnumber = avio_r8(s->pb);
+    dhav->frame_number = avio_rl32(s->pb);
+    frame_length = avio_rl32(s->pb);
+    dhav->date = avio_rl32(s->pb);
+
+    if (frame_length < 24)
+        return AVERROR_INVALIDDATA;
+    if (dhav->type == 0xf1) {
+        ret = avio_skip(s->pb, frame_length - 20);
+        return ret < 0 ? ret : 0;
+    }
+
+    dhav->timestamp = avio_rl16(s->pb);
+    ext_length = avio_r8(s->pb);
+    avio_skip(s->pb, 1); // checksum
+
+    ret = parse_ext(s, ext_length);
+    if (ret < 0)
+        return ret;
+
+    end = avio_tell(s->pb);
+
+    return frame_length - 8 - (end - start);
+}
+
+static void get_timeinfo(unsigned date, struct tm *timeinfo)
+{
+    int year, month, day, hour, min, sec;
+
+    sec   =   date        & 0x3F;
+    min   =  (date >>  6) & 0x3F;
+    hour  =  (date >> 12) & 0x1F;
+    day   =  (date >> 17) & 0x1F;
+    month =  (date >> 22) & 0x0F;
+    year  = ((date >> 26) & 0x3F) + 2000;
+
+    timeinfo->tm_year = year - 1900;
+    timeinfo->tm_mon  = month - 1;
+    timeinfo->tm_mday = day;
+    timeinfo->tm_hour = hour;
+    timeinfo->tm_min  = min;
+    timeinfo->tm_sec  = sec;
+}
+
+static int64_t get_duration(AVFormatContext *s)
+{
+    DHAVContext *dhav = s->priv_data;
+    int64_t start_pos = avio_tell(s->pb);
+    int64_t start = 0, end = 0;
+    struct tm timeinfo;
+
+    if (!s->pb->seekable)
+        return 0;
+
+    avio_seek(s->pb, avio_size(s->pb) - 8, SEEK_SET);
+    if (avio_rl32(s->pb) == MKTAG('d','h','a','v')) {
+        int seek_back = avio_rl32(s->pb);
+
+        avio_seek(s->pb, -seek_back, SEEK_CUR);
+        read_chunk(s);
+        get_timeinfo(dhav->date, &timeinfo);
+        end = av_timegm(&timeinfo) * 1000LL;
+    } else {
+        avio_seek(s->pb, start_pos, SEEK_SET);
+        return 0;
+    }
+
+    avio_seek(s->pb, start_pos, SEEK_SET);
+
+    read_chunk(s);
+    get_timeinfo(dhav->date, &timeinfo);
+    start = av_timegm(&timeinfo) * 1000LL;
+
+    avio_seek(s->pb, start_pos, SEEK_SET);
+
+    return end - start;
+}
+
+static int dhav_read_header(AVFormatContext *s)
+{
+    DHAVContext *dhav = s->priv_data;
+    uint8_t signature[5];
+
+    ffio_ensure_seekback(s->pb, 5);
+    avio_read(s->pb, signature, sizeof(signature));
+    if (!memcmp(signature, "DAHUA", 5)) {
+        avio_skip(s->pb, 0x400 - 5);
+        dhav->last_good_pos = avio_tell(s->pb);
+    } else {
+        if (!memcmp(signature, "DHAV", 4)) {
+            avio_seek(s->pb, -5, SEEK_CUR);
+            dhav->last_good_pos = avio_tell(s->pb);
+        } else if (s->pb->seekable) {
+            avio_seek(s->pb, avio_size(s->pb) - 8, SEEK_SET);
+            while (avio_rl32(s->pb) == MKTAG('d','h','a','v')) {
+                int seek_back;
+
+                seek_back = avio_rl32(s->pb) + 8;
+                dhav->last_good_pos = avio_tell(s->pb);
+                avio_seek(s->pb, -seek_back, SEEK_CUR);
+            }
+            avio_seek(s->pb, dhav->last_good_pos, SEEK_SET);
+        }
+    }
+
+    dhav->duration = get_duration(s);
+    dhav->last_good_pos = avio_tell(s->pb);
+    s->ctx_flags |= AVFMTCTX_NOHEADER;
+    dhav->video_stream_index = -1;
+    dhav->audio_stream_index = -1;
+
+    return 0;
+}
+
+static int64_t get_pts(AVFormatContext *s, int stream_index)
+{
+    DHAVStream *dst = s->streams[stream_index]->priv_data;
+    DHAVContext *dhav = s->priv_data;
+    struct tm timeinfo;
+    time_t t;
+
+    get_timeinfo(dhav->date, &timeinfo);
+
+    t = av_timegm(&timeinfo);
+    if (dst->last_time == t) {
+        int64_t diff = dhav->timestamp - dst->last_timestamp;
+
+        if (diff < 0)
+            diff += 65535;
+        dst->pts += diff;
+    } else {
+        dst->pts = t * 1000LL;
+    }
+
+    dst->last_time = t;
+    dst->last_timestamp = dhav->timestamp;
+
+    return dst->pts;
+}
+
+static int dhav_read_packet(AVFormatContext *s, AVPacket *pkt)
+{
+    DHAVContext *dhav = s->priv_data;
+    int size, ret, stream_index;
+
+retry:
+    while ((ret = read_chunk(s)) == 0)
+        ;
+
+    if (ret < 0)
+        return ret;
+
+    if (dhav->type == 0xfd && dhav->video_stream_index == -1) {
+        AVStream *st = avformat_new_stream(s, NULL);
+        DHAVStream *dst;
+
+        if (!st)
+            return AVERROR(ENOMEM);
+
+        st->codecpar->codec_type = AVMEDIA_TYPE_VIDEO;
+        switch (dhav->video_codec) {
+        case 0x1: st->codecpar->codec_id = AV_CODEC_ID_MPEG4; break;
+        case 0x3: st->codecpar->codec_id = AV_CODEC_ID_MJPEG; break;
+        case 0x2:
+        case 0x4:
+        case 0x8: st->codecpar->codec_id = AV_CODEC_ID_H264;  break;
+        case 0xc: st->codecpar->codec_id = AV_CODEC_ID_HEVC;  break;
+        default: avpriv_request_sample(s, "Unknown video codec %X\n", dhav->video_codec);
+        }
+        st->duration             = dhav->duration;
+        st->codecpar->width      = dhav->width;
+        st->codecpar->height     = dhav->height;
+        st->avg_frame_rate.num   = dhav->frame_rate;
+        st->avg_frame_rate.den   = 1;
+        st->priv_data = dst = av_mallocz(sizeof(DHAVStream));
+        if (!st->priv_data)
+            return AVERROR(ENOMEM);
+        dst->last_time = AV_NOPTS_VALUE;
+        dhav->video_stream_index = st->index;
+
+        avpriv_set_pts_info(st, 64, 1, 1000);
+    } else if (dhav->type == 0xf0 && dhav->audio_stream_index == -1) {
+        AVStream *st = avformat_new_stream(s, NULL);
+        DHAVStream *dst;
+
+        if (!st)
+            return AVERROR(ENOMEM);
+
+        st->codecpar->codec_type  = AVMEDIA_TYPE_AUDIO;
+        switch (dhav->audio_codec) {
+        case 0x07: st->codecpar->codec_id = AV_CODEC_ID_PCM_S8;    break;
+        case 0x0c: st->codecpar->codec_id = AV_CODEC_ID_PCM_S16LE; break;
+        case 0x10: st->codecpar->codec_id = AV_CODEC_ID_PCM_S16LE; break;
+        case 0x0a: st->codecpar->codec_id = AV_CODEC_ID_PCM_MULAW; break;
+        case 0x16: st->codecpar->codec_id = AV_CODEC_ID_PCM_MULAW; break;
+        case 0x0e: st->codecpar->codec_id = AV_CODEC_ID_PCM_ALAW;  break;
+        case 0x1a: st->codecpar->codec_id = AV_CODEC_ID_AAC;       break;
+        case 0x1f: st->codecpar->codec_id = AV_CODEC_ID_MP2;       break;
+        case 0x21: st->codecpar->codec_id = AV_CODEC_ID_MP3;       break;
+        case 0x0d: st->codecpar->codec_id = AV_CODEC_ID_ADPCM_MS;  break;
+        default: avpriv_request_sample(s, "Unknown audio codec %X\n", dhav->audio_codec);
+        }
+        st->duration              = dhav->duration;
+        st->codecpar->channels    = dhav->audio_channels;
+        st->codecpar->sample_rate = dhav->sample_rate;
+        st->priv_data = dst = av_mallocz(sizeof(DHAVStream));
+        if (!st->priv_data)
+            return AVERROR(ENOMEM);
+        dst->last_time = AV_NOPTS_VALUE;
+        dhav->audio_stream_index  = st->index;
+
+        avpriv_set_pts_info(st, 64, 1, 1000);
+    }
+
+    stream_index = dhav->type == 0xf0 ? dhav->audio_stream_index : dhav->video_stream_index;
+    if (stream_index < 0) {
+        avio_skip(s->pb, ret);
+        if (avio_rl32(s->pb) == MKTAG('d','h','a','v'))
+            avio_skip(s->pb, 4);
+        goto retry;
+    }
+
+    size = ret;
+    ret = av_get_packet(s->pb, pkt, size);
+    if (ret < 0)
+        return ret;
+    pkt->stream_index = stream_index;
+    if (dhav->type != 0xfc)
+        pkt->flags   |= AV_PKT_FLAG_KEY;
+    pkt->duration = 1;
+    if (pkt->stream_index >= 0)
+        pkt->pts = get_pts(s, pkt->stream_index);
+    pkt->pos = dhav->last_good_pos;
+    if (avio_rl32(s->pb) == MKTAG('d','h','a','v'))
+        avio_skip(s->pb, 4);
+
+    return ret;
+}
+
+static int dhav_read_seek(AVFormatContext *s, int stream_index,
+                          int64_t timestamp, int flags)
+{
+    DHAVContext *dhav = s->priv_data;
+    AVStream *st = s->streams[stream_index];
+    int index = av_index_search_timestamp(st, timestamp, flags);
+    int64_t pts;
+
+    if (index < 0)
+        return -1;
+    if (avio_seek(s->pb, st->index_entries[index].pos, SEEK_SET) < 0)
+        return -1;
+
+    pts = st->index_entries[index].timestamp;
+
+    for (int n = 0; n < s->nb_streams; n++) {
+        AVStream *st = s->streams[n];
+        DHAVStream *dst = st->priv_data;
+
+        dst->pts = pts;
+        dst->last_time = AV_NOPTS_VALUE;
+    }
+    dhav->last_good_pos = avio_tell(s->pb);
+
+    return 0;
+}
+
+AVInputFormat ff_dhav_demuxer = {
+    .name           = "dhav",
+    .long_name      = NULL_IF_CONFIG_SMALL("Video DAV"),
+    .priv_data_size = sizeof(DHAVContext),
+    .read_probe     = dhav_probe,
+    .read_header    = dhav_read_header,
+    .read_packet    = dhav_read_packet,
+    .read_seek      = dhav_read_seek,
+    .extensions     = "dav",
+    .flags          = AVFMT_GENERIC_INDEX | AVFMT_NO_BYTE_SEEK | AVFMT_TS_DISCONT | AVFMT_TS_NONSTRICT,
+};
diff --git a/libavformat/diracdec.c b/libavformat/diracdec.c
index e061ba5..d9294a1 100644
--- a/libavformat/diracdec.c
+++ b/libavformat/diracdec.c
@@ -23,7 +23,7 @@
 #include "avformat.h"
 #include "rawdec.h"
 
-static int dirac_probe(AVProbeData *p)
+static int dirac_probe(const AVProbeData *p)
 {
     unsigned size;
     if (AV_RL32(p->buf) != MKTAG('B', 'B', 'C', 'D'))
diff --git a/libavformat/dnxhddec.c b/libavformat/dnxhddec.c
index 0ad51b5..2d1d9fb 100644
--- a/libavformat/dnxhddec.c
+++ b/libavformat/dnxhddec.c
@@ -25,7 +25,7 @@
 #include "rawdec.h"
 #include "libavcodec/dnxhddata.h"
 
-static int dnxhd_probe(AVProbeData *p)
+static int dnxhd_probe(const AVProbeData *p)
 {
     int w, h, compression_id;
     if (p->buf_size < 0x2c)
diff --git a/libavformat/dsfdec.c b/libavformat/dsfdec.c
index 5e06fd6..52cddab 100644
--- a/libavformat/dsfdec.c
+++ b/libavformat/dsfdec.c
@@ -30,7 +30,7 @@
     uint64_t data_size;
 } DSFContext;
 
-static int dsf_probe(AVProbeData *p)
+static int dsf_probe(const AVProbeData *p)
 {
     if (p->buf_size < 12 || memcmp(p->buf, "DSD ", 4) || AV_RL64(p->buf + 4) != 28)
         return 0;
@@ -130,6 +130,7 @@
     }
     st->codecpar->block_align *= st->codecpar->channels;
     st->codecpar->bit_rate = st->codecpar->channels * st->codecpar->sample_rate * 8LL;
+    avpriv_set_pts_info(st, 64, 1, st->codecpar->sample_rate);
     avio_skip(pb, 4);
 
     /* data chunk */
@@ -150,11 +151,11 @@
     AVIOContext *pb = s->pb;
     AVStream *st = s->streams[0];
     int64_t pos = avio_tell(pb);
+    int ret;
 
     if (pos >= dsf->data_end)
         return AVERROR_EOF;
 
-    pkt->stream_index = 0;
     if (dsf->data_size > dsf->audio_size) {
         int last_packet = pos == (dsf->data_end - st->codecpar->block_align);
 
@@ -168,8 +169,8 @@
             if (packet_size <= 0 || skip_size <= 0)
                 return AVERROR_INVALIDDATA;
 
-            if (av_new_packet(pkt, packet_size) < 0)
-                return AVERROR(ENOMEM);
+            if ((ret = av_new_packet(pkt, packet_size)) < 0)
+                return ret;
             dst = pkt->data;
             for (ch = 0; ch < st->codecpar->channels; ch++) {
                 ret = avio_read(pb, dst,  packet_size / st->codecpar->channels);
@@ -180,10 +181,22 @@
                 avio_skip(pb, skip_size / st->codecpar->channels);
             }
 
+            pkt->pos = pos;
+            pkt->stream_index = 0;
+            pkt->pts = (pos - s->internal->data_offset) / st->codecpar->channels;
+            pkt->duration = packet_size / st->codecpar->channels;
             return 0;
         }
     }
-    return av_get_packet(pb, pkt, FFMIN(dsf->data_end - pos, st->codecpar->block_align));
+    ret = av_get_packet(pb, pkt, FFMIN(dsf->data_end - pos, st->codecpar->block_align));
+    if (ret < 0)
+        return ret;
+
+    pkt->stream_index = 0;
+    pkt->pts = (pos - s->internal->data_offset) / st->codecpar->channels;
+    pkt->duration = st->codecpar->block_align / st->codecpar->channels;
+
+    return 0;
 }
 
 AVInputFormat ff_dsf_demuxer = {
diff --git a/libavformat/dsicin.c b/libavformat/dsicin.c
index bd4f3ad..b18f43b 100644
--- a/libavformat/dsicin.c
+++ b/libavformat/dsicin.c
@@ -60,7 +60,7 @@
 } CinDemuxContext;
 
 
-static int cin_probe(AVProbeData *p)
+static int cin_probe(const AVProbeData *p)
 {
     /* header starts with this special marker */
     if (AV_RL32(&p->buf[0]) != 0x55AA0000)
@@ -200,7 +200,6 @@
 
         ret = avio_read(pb, &pkt->data[4], pkt_size);
         if (ret < 0) {
-            av_packet_unref(pkt);
             return ret;
         }
         if (ret < pkt_size)
diff --git a/libavformat/dss.c b/libavformat/dss.c
index 083eb4a..0585049 100644
--- a/libavformat/dss.c
+++ b/libavformat/dss.c
@@ -19,8 +19,6 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
-#include "libavutil/attributes.h"
-#include "libavutil/bswap.h"
 #include "libavutil/channel_layout.h"
 #include "libavutil/intreadwrite.h"
 
@@ -52,13 +50,13 @@
     int counter;
     int swap;
     int dss_sp_swap_byte;
-    int8_t *dss_sp_buf;
+    int8_t dss_sp_buf[DSS_FRAME_SIZE + 1];
 
     int packet_size;
     int dss_header_size;
 } DSSDemuxContext;
 
-static int dss_probe(AVProbeData *p)
+static int dss_probe(const AVProbeData *p)
 {
     if (   AV_RL32(p->buf) != MKTAG(0x2, 'd', 's', 's')
         && AV_RL32(p->buf) != MKTAG(0x3, 'd', 's', 's'))
@@ -105,15 +103,11 @@
 
     ret = avio_read(s->pb, value, size);
     if (ret < size) {
-        ret = ret < 0 ? ret : AVERROR_EOF;
-        goto exit;
+        av_free(value);
+        return ret < 0 ? ret : AVERROR_EOF;
     }
 
-    ret = av_dict_set(&s->metadata, key, value, 0);
-
-exit:
-    av_free(value);
-    return ret;
+    return av_dict_set(&s->metadata, key, value, AV_DICT_DONT_STRDUP_VAL);
 }
 
 static int dss_read_header(AVFormatContext *s)
@@ -174,10 +168,6 @@
     ctx->counter = 0;
     ctx->swap    = 0;
 
-    ctx->dss_sp_buf = av_malloc(DSS_FRAME_SIZE + 1);
-    if (!ctx->dss_sp_buf)
-        return AVERROR(ENOMEM);
-
     return 0;
 }
 
@@ -261,14 +251,12 @@
     dss_sp_byte_swap(ctx, pkt->data, ctx->dss_sp_buf);
 
     if (ctx->dss_sp_swap_byte < 0) {
-        ret = AVERROR(EAGAIN);
-        goto error_eof;
+        return AVERROR(EAGAIN);
     }
 
     return pkt->size;
 
 error_eof:
-    av_packet_unref(pkt);
     return ret < 0 ? ret : AVERROR_EOF;
 }
 
@@ -310,7 +298,6 @@
         ret = avio_read(s->pb, pkt->data + offset,
                         size2 - offset);
         if (ret < size2 - offset) {
-            av_packet_unref(pkt);
             return ret < 0 ? ret : AVERROR_EOF;
         }
 
@@ -320,7 +307,6 @@
 
     ret = avio_read(s->pb, pkt->data + offset, size - offset);
     if (ret < size - offset) {
-        av_packet_unref(pkt);
         return ret < 0 ? ret : AVERROR_EOF;
     }
 
@@ -337,15 +323,6 @@
         return dss_723_1_read_packet(s, pkt);
 }
 
-static int dss_read_close(AVFormatContext *s)
-{
-    DSSDemuxContext *ctx = s->priv_data;
-
-    av_freep(&ctx->dss_sp_buf);
-
-    return 0;
-}
-
 static int dss_read_seek(AVFormatContext *s, int stream_index,
                          int64_t timestamp, int flags)
 {
@@ -392,7 +369,6 @@
     .read_probe     = dss_probe,
     .read_header    = dss_read_header,
     .read_packet    = dss_read_packet,
-    .read_close     = dss_read_close,
     .read_seek      = dss_read_seek,
     .extensions     = "dss"
 };
diff --git a/libavformat/dtsdec.c b/libavformat/dtsdec.c
index a3e52cd..0215ee1 100644
--- a/libavformat/dtsdec.c
+++ b/libavformat/dtsdec.c
@@ -29,7 +29,7 @@
 #include "avformat.h"
 #include "rawdec.h"
 
-static int dts_probe(AVProbeData *p)
+static int dts_probe(const AVProbeData *p)
 {
     const uint8_t *buf, *bufp;
     uint32_t state = -1;
@@ -37,6 +37,7 @@
     int exss_markers = 0, exss_nextpos = 0;
     int sum, max, pos, ret, i;
     int64_t diff = 0;
+    int diffcount = 1;
     uint8_t hdr[DCA_CORE_FRAME_HEADER_SIZE + AV_INPUT_BUFFER_PADDING_SIZE] = { 0 };
 
     for (pos = FFMIN(4096, p->buf_size); pos < p->buf_size - 2; pos += 2) {
@@ -47,8 +48,12 @@
         bufp = buf = p->buf + pos;
         state = (state << 16) | bytestream_get_be16(&bufp);
 
-        if (pos >= 4)
-            diff += FFABS(((int16_t)AV_RL16(buf)) - (int16_t)AV_RL16(buf-4));
+        if (pos >= 4) {
+            if (AV_RL16(buf) || AV_RL16(buf-4)) {
+                diff += FFABS(((int16_t)AV_RL16(buf)) - (int16_t)AV_RL16(buf-4));
+                diffcount ++;
+            }
+        }
 
         /* extension substream (EXSS) */
         if (state == DCA_SYNCWORD_SUBSTREAM) {
@@ -121,12 +126,13 @@
 
     if (markers[max] > 3 && p->buf_size / markers[max] < 32*1024 &&
         markers[max] * 4 > sum * 3 &&
-        diff / p->buf_size > 200)
+        diff / diffcount > 600)
         return AVPROBE_SCORE_EXTENSION + 1;
 
     return 0;
 }
 
+FF_RAW_DEMUXER_CLASS(dts)
 AVInputFormat ff_dts_demuxer = {
     .name           = "dts",
     .long_name      = NULL_IF_CONFIG_SMALL("raw DTS"),
@@ -136,4 +142,5 @@
     .flags          = AVFMT_GENERIC_INDEX,
     .extensions     = "dts",
     .raw_codec_id   = AV_CODEC_ID_DTS,
-};
+    .priv_data_size = sizeof(FFRawDemuxerContext),
+    .priv_class     = &dts_demuxer_class,};
diff --git a/libavformat/dtshddec.c b/libavformat/dtshddec.c
index 1bd403c..b1eb7ff 100644
--- a/libavformat/dtshddec.c
+++ b/libavformat/dtshddec.c
@@ -43,7 +43,7 @@
     uint64_t    data_end;
 } DTSHDDemuxContext;
 
-static int dtshd_probe(AVProbeData *p)
+static int dtshd_probe(const AVProbeData *p)
 {
     if (AV_RB64(p->buf) == DTSHDHDR)
         return AVPROBE_SCORE_MAX;
diff --git a/libavformat/dump.c b/libavformat/dump.c
index bc0f401..5e9a031 100644
--- a/libavformat/dump.c
+++ b/libavformat/dump.c
@@ -27,6 +27,7 @@
 #include "libavutil/intreadwrite.h"
 #include "libavutil/log.h"
 #include "libavutil/mastering_display_metadata.h"
+#include "libavutil/dovi_meta.h"
 #include "libavutil/mathematics.h"
 #include "libavutil/opt.h"
 #include "libavutil/avstring.h"
@@ -210,7 +211,7 @@
 
     return;
 fail:
-    av_log(ctx, AV_LOG_INFO, "unknown param");
+    av_log(ctx, AV_LOG_ERROR, "unknown param");
 }
 
 /* replaygain side data*/
@@ -239,7 +240,7 @@
     AVReplayGain *rg;
 
     if (sd->size < sizeof(*rg)) {
-        av_log(ctx, AV_LOG_INFO, "invalid data");
+        av_log(ctx, AV_LOG_ERROR, "invalid data");
         return;
     }
     rg = (AVReplayGain*)sd->data;
@@ -255,7 +256,7 @@
     AVStereo3D *stereo;
 
     if (sd->size < sizeof(*stereo)) {
-        av_log(ctx, AV_LOG_INFO, "invalid data");
+        av_log(ctx, AV_LOG_ERROR, "invalid data");
         return;
     }
 
@@ -272,7 +273,7 @@
     enum AVAudioServiceType *ast = (enum AVAudioServiceType *)sd->data;
 
     if (sd->size < sizeof(*ast)) {
-        av_log(ctx, AV_LOG_INFO, "invalid data");
+        av_log(ctx, AV_LOG_ERROR, "invalid data");
         return;
     }
 
@@ -293,7 +294,7 @@
         av_log(ctx, AV_LOG_INFO, "dialogue");
         break;
     case AV_AUDIO_SERVICE_TYPE_COMMENTARY:
-        av_log(ctx, AV_LOG_INFO, "comentary");
+        av_log(ctx, AV_LOG_INFO, "commentary");
         break;
     case AV_AUDIO_SERVICE_TYPE_EMERGENCY:
         av_log(ctx, AV_LOG_INFO, "emergency");
@@ -315,15 +316,22 @@
     AVCPBProperties *cpb = (AVCPBProperties *)sd->data;
 
     if (sd->size < sizeof(*cpb)) {
-        av_log(ctx, AV_LOG_INFO, "invalid data");
+        av_log(ctx, AV_LOG_ERROR, "invalid data");
         return;
     }
 
     av_log(ctx, AV_LOG_INFO,
-           "bitrate max/min/avg: %d/%d/%d buffer size: %d vbv_delay: %"PRId64,
+#if FF_API_UNSANITIZED_BITRATES
+           "bitrate max/min/avg: %d/%d/%d buffer size: %d ",
+#else
+           "bitrate max/min/avg: %"PRId64"/%"PRId64"/%"PRId64" buffer size: %d ",
+#endif
            cpb->max_bitrate, cpb->min_bitrate, cpb->avg_bitrate,
-           cpb->buffer_size,
-           cpb->vbv_delay);
+           cpb->buffer_size);
+    if (cpb->vbv_delay == UINT64_MAX)
+        av_log(ctx, AV_LOG_INFO, "vbv_delay: N/A");
+    else
+        av_log(ctx, AV_LOG_INFO, "vbv_delay: %"PRIu64"", cpb->vbv_delay);
 }
 
 static void dump_mastering_display_metadata(void *ctx, AVPacketSideData* sd) {
@@ -357,7 +365,7 @@
     double yaw, pitch, roll;
 
     if (sd->size < sizeof(*spherical)) {
-        av_log(ctx, AV_LOG_INFO, "invalid data");
+        av_log(ctx, AV_LOG_ERROR, "invalid data");
         return;
     }
 
@@ -380,6 +388,20 @@
     }
 }
 
+static void dump_dovi_conf(void *ctx, AVPacketSideData* sd)
+{
+    AVDOVIDecoderConfigurationRecord *dovi = (AVDOVIDecoderConfigurationRecord *)sd->data;
+
+    av_log(ctx, AV_LOG_INFO, "version: %d.%d, profile: %d, level: %d, "
+           "rpu flag: %d, el flag: %d, bl flag: %d, compatibility id: %d",
+           dovi->dv_version_major, dovi->dv_version_minor,
+           dovi->dv_profile, dovi->dv_level,
+           dovi->rpu_present_flag,
+           dovi->el_present_flag,
+           dovi->bl_present_flag,
+           dovi->dv_bl_signal_compatibility_id);
+}
+
 static void dump_sidedata(void *ctx, AVStream *st, const char *indent)
 {
     int i;
@@ -439,6 +461,13 @@
         case AV_PKT_DATA_CONTENT_LIGHT_LEVEL:
             dump_content_light_metadata(ctx, &sd);
             break;
+        case AV_PKT_DATA_ICC_PROFILE:
+            av_log(ctx, AV_LOG_INFO, "ICC Profile");
+            break;
+        case AV_PKT_DATA_DOVI_CONF:
+            av_log(ctx, AV_LOG_INFO, "DOVI configuration record: ");
+            dump_dovi_conf(ctx, &sd);
+            break;
         default:
             av_log(ctx, AV_LOG_INFO,
                    "unknown side data type %d (%d bytes)", sd.type, sd.size);
@@ -547,8 +576,16 @@
         av_log(NULL, AV_LOG_INFO, " (visual impaired)");
     if (st->disposition & AV_DISPOSITION_CLEAN_EFFECTS)
         av_log(NULL, AV_LOG_INFO, " (clean effects)");
+    if (st->disposition & AV_DISPOSITION_ATTACHED_PIC)
+        av_log(NULL, AV_LOG_INFO, " (attached pic)");
+    if (st->disposition & AV_DISPOSITION_TIMED_THUMBNAILS)
+        av_log(NULL, AV_LOG_INFO, " (timed thumbnails)");
+    if (st->disposition & AV_DISPOSITION_CAPTIONS)
+        av_log(NULL, AV_LOG_INFO, " (captions)");
     if (st->disposition & AV_DISPOSITION_DESCRIPTIONS)
         av_log(NULL, AV_LOG_INFO, " (descriptions)");
+    if (st->disposition & AV_DISPOSITION_METADATA)
+        av_log(NULL, AV_LOG_INFO, " (metadata)");
     if (st->disposition & AV_DISPOSITION_DEPENDENT)
         av_log(NULL, AV_LOG_INFO, " (dependent)");
     if (st->disposition & AV_DISPOSITION_STILL_IMAGE)
diff --git a/libavformat/dv.c b/libavformat/dv.c
index 06de044..e99422d 100644
--- a/libavformat/dv.c
+++ b/libavformat/dv.c
@@ -495,16 +495,18 @@
 {
     unsigned state, marker_pos = 0;
     RawDVContext *c = s->priv_data;
+    int ret;
 
     c->dv_demux = avpriv_dv_init_demux(s);
     if (!c->dv_demux)
-        return -1;
+        return AVERROR(ENOMEM);
 
     state = avio_rb32(s->pb);
     while ((state & 0xffffff7f) != 0x1f07003f) {
         if (avio_feof(s->pb)) {
             av_log(s, AV_LOG_ERROR, "Cannot find DV header.\n");
-            return -1;
+            ret = AVERROR_INVALIDDATA;
+            goto fail;
         }
         if (state == 0x003f0700 || state == 0xff3f0700)
             marker_pos = avio_tell(s->pb);
@@ -518,8 +520,10 @@
     AV_WB32(c->buf, state);
 
     if (avio_read(s->pb, c->buf + 4, DV_PROFILE_BYTES - 4) != DV_PROFILE_BYTES - 4 ||
-        avio_seek(s->pb, -DV_PROFILE_BYTES, SEEK_CUR) < 0)
-        return AVERROR(EIO);
+        avio_seek(s->pb, -DV_PROFILE_BYTES, SEEK_CUR) < 0) {
+        ret = AVERROR(EIO);
+        goto fail;
+    }
 
     c->dv_demux->sys = av_dv_frame_profile(c->dv_demux->sys,
                                            c->buf,
@@ -527,7 +531,8 @@
     if (!c->dv_demux->sys) {
         av_log(s, AV_LOG_ERROR,
                "Can't determine profile of DV input stream.\n");
-        return -1;
+        ret = AVERROR_INVALIDDATA;
+        goto fail;
     }
 
     s->bit_rate = av_rescale_q(c->dv_demux->sys->frame_size,
@@ -538,6 +543,11 @@
         dv_read_timecode(s);
 
     return 0;
+
+fail:
+    av_freep(&c->dv_demux);
+
+    return ret;
 }
 
 static int dv_read_packet(AVFormatContext *s, AVPacket *pkt)
@@ -587,7 +597,7 @@
     return 0;
 }
 
-static int dv_probe(AVProbeData *p)
+static int dv_probe(const AVProbeData *p)
 {
     unsigned marker_pos = 0;
     int i;
diff --git a/libavformat/dvbsub.c b/libavformat/dvbsub.c
index 3d2f704..ba5d56a 100644
--- a/libavformat/dvbsub.c
+++ b/libavformat/dvbsub.c
@@ -25,7 +25,7 @@
 #include "rawdec.h"
 
 
-static int dvbsub_probe(AVProbeData *p)
+static int dvbsub_probe(const AVProbeData *p)
 {
     int i, j, k;
     const uint8_t *end = p->buf + p->buf_size;
diff --git a/libavformat/dvbtxt.c b/libavformat/dvbtxt.c
index 6828738..354d094 100644
--- a/libavformat/dvbtxt.c
+++ b/libavformat/dvbtxt.c
@@ -24,7 +24,7 @@
 #include "avformat.h"
 #include "rawdec.h"
 
-static int dvbtxt_probe(AVProbeData *p)
+static int dvbtxt_probe(const AVProbeData *p)
 {
     const uint8_t *end = p->buf + p->buf_size;
     const uint8_t *buf;
diff --git a/libavformat/dvenc.c b/libavformat/dvenc.c
index 93c103b..c71e532 100644
--- a/libavformat/dvenc.c
+++ b/libavformat/dvenc.c
@@ -28,7 +28,6 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 #include <time.h>
-#include <stdarg.h>
 
 #include "avformat.h"
 #include "internal.h"
@@ -48,8 +47,8 @@
     AVClass          *av_class;
     const AVDVProfile*  sys;           /* current DV profile, e.g.: 525/60, 625/50 */
     int               n_ast;         /* number of stereo audio streams (up to 2) */
-    AVStream         *ast[2];        /* stereo audio streams */
-    AVFifoBuffer     *audio_data[2]; /* FIFO for storing excessive amounts of PCM */
+    AVStream         *ast[4];        /* stereo audio streams */
+    AVFifoBuffer     *audio_data[4]; /* FIFO for storing excessive amounts of PCM */
     int               frames;        /* current frame number */
     int64_t           start_time;    /* recording start time */
     int               has_audio;     /* frame under construction has audio */
@@ -87,14 +86,12 @@
                                             sizeof(sys->audio_samples_dist[0]))];
 }
 
-static int dv_write_pack(enum dv_pack_type pack_id, DVMuxContext *c, uint8_t* buf, ...)
+static int dv_write_pack(enum dv_pack_type pack_id, DVMuxContext *c, uint8_t* buf, int channel, int seq)
 {
     struct tm tc;
     time_t ct;
     uint32_t timecode;
-    va_list ap;
     int audio_type = 0;
-    int channel;
 
     buf[0] = (uint8_t)pack_id;
     switch (pack_id) {
@@ -104,8 +101,6 @@
         AV_WB32(buf + 1, timecode);
         break;
     case dv_audio_source:  /* AAUX source pack */
-        va_start(ap, buf);
-        channel = va_arg(ap, int);
         if (c->ast[channel]->codecpar->sample_rate == 44100) {
             audio_type = 1;
         } else if (c->ast[channel]->codecpar->sample_rate == 32000)
@@ -118,17 +113,16 @@
         buf[2] = (0 << 7) | /* multi-stereo      */
                  (0 << 5) | /* #of audio channels per block: 0 -- 1 channel */
                  (0 << 4) | /* pair bit: 0 -- one pair of channels */
-                 !!va_arg(ap, int); /* audio mode        */
+                 (seq >= c->sys->difseg_size/2); /* audio mode (1st or 2nd channel) */
         buf[3] = (1 << 7) | /* res               */
                  (1 << 6) | /* multi-language flag */
                  (c->sys->dsf << 5) | /*  system: 60fields/50fields */
-                 (c->sys->n_difchan & 2); /* definition: 0 -- 25Mbps, 2 -- 50Mbps */
+                 (DV_PROFILE_IS_HD(c->sys) ? 0x3 : c->sys->video_stype ? 2 : 0); /* stype */
         buf[4] = (1 << 7) | /* emphasis: 1 -- off */
                  (0 << 6) | /* emphasis time constant: 0 -- reserved */
                  (audio_type << 3) | /* frequency: 0 -- 48kHz, 1 -- 44,1kHz, 2 -- 32kHz */
                   0;        /* quantization: 0 -- 16-bit linear, 1 -- 12-bit nonlinear */
 
-        va_end(ap);
         break;
     case dv_audio_control:
         buf[1] = (0 << 6) | /* copy protection: 0 -- unrestricted */
@@ -192,7 +186,7 @@
     for (i = 0; i < c->sys->difseg_size; i++) {
         frame_ptr += 6 * 80; /* skip DIF segment header */
         for (j = 0; j < 9; j++) {
-            dv_write_pack(dv_aaux_packs_dist[i][j], c, &frame_ptr[3], channel, i >= c->sys->difseg_size/2);
+            dv_write_pack(dv_aaux_packs_dist[i][j], c, &frame_ptr[3], channel, i);
             for (d = 8; d < 80; d+=2) {
                 of = c->sys->audio_shuffle[i][j] + (d - 8)/2 * c->sys->audio_stride;
                 if (of*2 >= size)
@@ -210,27 +204,28 @@
 {
     int j, k;
     uint8_t* buf;
+    int seq = 0;
 
-    for (buf = frame; buf < frame + c->sys->frame_size; buf += 150 * 80) {
+    for (buf = frame; buf < frame + c->sys->frame_size; buf += 150 * 80, seq++) {
         /* DV subcode: 2nd and 3d DIFs */
         for (j = 80; j < 80 * 3; j += 80) {
             for (k = 6; k < 6 * 8; k += 8)
-                dv_write_pack(dv_timecode, c, &buf[j+k]);
+                dv_write_pack(dv_timecode, c, &buf[j+k], 0, seq);
 
             if (((long)(buf-frame)/(c->sys->frame_size/(c->sys->difseg_size*c->sys->n_difchan))%c->sys->difseg_size) > 5) { /* FIXME: is this really needed ? */
-                dv_write_pack(dv_video_recdate, c, &buf[j+14]);
-                dv_write_pack(dv_video_rectime, c, &buf[j+22]);
-                dv_write_pack(dv_video_recdate, c, &buf[j+38]);
-                dv_write_pack(dv_video_rectime, c, &buf[j+46]);
+                dv_write_pack(dv_video_recdate, c, &buf[j+14], 0, seq);
+                dv_write_pack(dv_video_rectime, c, &buf[j+22], 0, seq);
+                dv_write_pack(dv_video_recdate, c, &buf[j+38], 0, seq);
+                dv_write_pack(dv_video_rectime, c, &buf[j+46], 0, seq);
             }
         }
 
         /* DV VAUX: 4th, 5th and 6th 3DIFs */
         for (j = 80*3 + 3; j < 80*6; j += 80) {
-            dv_write_pack(dv_video_recdate, c, &buf[j+5*2]);
-            dv_write_pack(dv_video_rectime, c, &buf[j+5*3]);
-            dv_write_pack(dv_video_recdate, c, &buf[j+5*11]);
-            dv_write_pack(dv_video_rectime, c, &buf[j+5*12]);
+            dv_write_pack(dv_video_recdate, c, &buf[j+5* 2], 0, seq);
+            dv_write_pack(dv_video_rectime, c, &buf[j+5* 3], 0, seq);
+            dv_write_pack(dv_video_recdate, c, &buf[j+5*11], 0, seq);
+            dv_write_pack(dv_video_rectime, c, &buf[j+5*12], 0, seq);
         }
     }
 }
@@ -307,12 +302,9 @@
     int i;
 
     /* we support at most 1 video and 2 audio streams */
-    if (s->nb_streams > 3)
+    if (s->nb_streams > 5)
         return NULL;
 
-    c->n_ast  = 0;
-    c->ast[0] = c->ast[1] = NULL;
-
     /* We have to sort out where audio and where video stream is */
     for (i=0; i<s->nb_streams; i++) {
         switch (s->streams[i]->codecpar->codec_type) {
@@ -355,8 +347,9 @@
             goto bail_out;
     }
 
-    if ((c->n_ast > 1) && (c->sys->n_difchan < 2)) {
-        /* only 1 stereo pair is allowed in 25Mbps mode */
+    if (((c->n_ast > 1) && (c->sys->n_difchan < 2)) ||
+        ((c->n_ast > 2) && (c->sys->n_difchan < 4))) {
+        /* only 2 stereo pairs allowed in 50Mbps mode */
         goto bail_out;
     }
 
@@ -368,10 +361,6 @@
 
     for (i=0; i < c->n_ast; i++) {
         if (c->ast[i] && !(c->audio_data[i]=av_fifo_alloc_array(100, MAX_AUDIO_FRAME_SIZE))) {
-            while (i > 0) {
-                i--;
-                av_fifo_freep(&c->audio_data[i]);
-            }
             goto bail_out;
         }
     }
@@ -382,13 +371,6 @@
     return NULL;
 }
 
-static void dv_delete_mux(DVMuxContext *c)
-{
-    int i;
-    for (i=0; i < c->n_ast; i++)
-        av_fifo_freep(&c->audio_data[i]);
-}
-
 static int dv_write_header(AVFormatContext *s)
 {
     AVRational rate;
@@ -436,10 +418,12 @@
  * Currently we simply drop the last frame. I don't know whether this
  * is the best strategy of all
  */
-static int dv_write_trailer(struct AVFormatContext *s)
+static void dv_deinit(AVFormatContext *s)
 {
-    dv_delete_mux(s->priv_data);
-    return 0;
+    DVMuxContext *c = s->priv_data;
+
+    for (int i = 0; i < c->n_ast; i++)
+        av_fifo_freep(&c->audio_data[i]);
 }
 
 AVOutputFormat ff_dv_muxer = {
@@ -451,5 +435,5 @@
     .video_codec       = AV_CODEC_ID_DVVIDEO,
     .write_header      = dv_write_header,
     .write_packet      = dv_write_packet,
-    .write_trailer     = dv_write_trailer,
+    .deinit            = dv_deinit,
 };
diff --git a/libavformat/dxa.c b/libavformat/dxa.c
index 5019390..27fa6af 100644
--- a/libavformat/dxa.c
+++ b/libavformat/dxa.c
@@ -37,7 +37,7 @@
     int readvid;
 }DXAContext;
 
-static int dxa_probe(AVProbeData *p)
+static int dxa_probe(const AVProbeData *p)
 {
     int w, h;
     if (p->buf_size < 15)
@@ -179,8 +179,8 @@
         tag = AV_RL32(buf);
         switch (tag) {
         case MKTAG('N', 'U', 'L', 'L'):
-            if(av_new_packet(pkt, 4 + pal_size) < 0)
-                return AVERROR(ENOMEM);
+            if ((ret = av_new_packet(pkt, 4 + pal_size)) < 0)
+                return ret;
             pkt->stream_index = 0;
             if(pal_size) memcpy(pkt->data, pal, pal_size);
             memcpy(pkt->data + pal_size, buf, 4);
@@ -204,12 +204,12 @@
                        size);
                 return AVERROR_INVALIDDATA;
             }
-            if(av_new_packet(pkt, size + DXA_EXTRA_SIZE + pal_size) < 0)
-                return AVERROR(ENOMEM);
+            ret = av_new_packet(pkt, size + DXA_EXTRA_SIZE + pal_size);
+            if (ret < 0)
+                return ret;
             memcpy(pkt->data + pal_size, buf, DXA_EXTRA_SIZE);
             ret = avio_read(s->pb, pkt->data + DXA_EXTRA_SIZE + pal_size, size);
             if(ret != size){
-                av_packet_unref(pkt);
                 return AVERROR(EIO);
             }
             if(pal_size) memcpy(pkt->data, pal, pal_size);
diff --git a/libavformat/eacdata.c b/libavformat/eacdata.c
index 97eb66e..b05d5c8 100644
--- a/libavformat/eacdata.c
+++ b/libavformat/eacdata.c
@@ -36,7 +36,7 @@
   unsigned int audio_pts;
 } CdataDemuxContext;
 
-static int cdata_probe(AVProbeData *p)
+static int cdata_probe(const AVProbeData *p)
 {
     const uint8_t *b = p->buf;
 
diff --git a/libavformat/electronicarts.c b/libavformat/electronicarts.c
index bfd3fed..2ee5e1b 100644
--- a/libavformat/electronicarts.c
+++ b/libavformat/electronicarts.c
@@ -458,7 +458,7 @@
     return 1;
 }
 
-static int ea_probe(AVProbeData *p)
+static int ea_probe(const AVProbeData *p)
 {
     unsigned big_endian, size;
 
@@ -574,11 +574,12 @@
     EaDemuxContext *ea = s->priv_data;
     AVIOContext *pb    = s->pb;
     int partial_packet = 0;
+    int hit_end = 0;
     unsigned int chunk_type, chunk_size;
     int ret = 0, packet_read = 0, key = 0;
     int av_uninit(num_samples);
 
-    while (!packet_read || partial_packet) {
+    while ((!packet_read && !hit_end) || partial_packet) {
         chunk_type = avio_rl32(pb);
         chunk_size = ea->big_endian ? avio_rb32(pb) : avio_rl32(pb);
         if (chunk_size < 8)
@@ -632,7 +633,6 @@
             case AV_CODEC_ID_ADPCM_EA_R3:
                 if (pkt->size < 4) {
                     av_log(s, AV_LOG_ERROR, "Packet is too short\n");
-                    av_packet_unref(pkt);
                     return AVERROR_INVALIDDATA;
                 }
                 if (ea->audio_codec == AV_CODEC_ID_ADPCM_EA_R3)
@@ -676,7 +676,7 @@
             }
             if (avio_feof(pb))
                 ret = AVERROR_EOF;
-            packet_read = 1;
+            hit_end = 1;
             break;
 
         case MVIh_TAG:
@@ -735,8 +735,9 @@
         }
     }
 
-    if (ret < 0 && partial_packet)
-        av_packet_unref(pkt);
+    if (ret >= 0 && hit_end && !packet_read)
+        return AVERROR(EAGAIN);
+
     return ret;
 }
 
diff --git a/libavformat/epafdec.c b/libavformat/epafdec.c
index 0cd9627..16239ee 100644
--- a/libavformat/epafdec.c
+++ b/libavformat/epafdec.c
@@ -25,7 +25,7 @@
 #include "internal.h"
 #include "pcm.h"
 
-static int epaf_probe(AVProbeData *p)
+static int epaf_probe(const AVProbeData *p)
 {
     if (((AV_RL32(p->buf) == MKTAG('f','a','p',' ') &&
           AV_RL32(p->buf + 8) == 1) ||
diff --git a/libavformat/ffmetadec.c b/libavformat/ffmetadec.c
index 3290b3b..45c92f1 100644
--- a/libavformat/ffmetadec.c
+++ b/libavformat/ffmetadec.c
@@ -19,19 +19,62 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
+#include "libavutil/bprint.h"
 #include "libavutil/mathematics.h"
 #include "avformat.h"
 #include "ffmeta.h"
 #include "internal.h"
 #include "libavutil/dict.h"
 
-static int probe(AVProbeData *p)
+static int probe(const AVProbeData *p)
 {
     if(!memcmp(p->buf, ID_STRING, strlen(ID_STRING)))
         return AVPROBE_SCORE_MAX;
     return 0;
 }
 
+static int64_t read_line_to_bprint_escaped(AVIOContext *s, AVBPrint *bp)
+{
+    int len, end;
+    int64_t read = 0;
+    char tmp[1024];
+    char c;
+    char prev = ' ';
+
+    do {
+        len = 0;
+        do {
+            c = avio_r8(s);
+            end = prev != '\\' && (c == '\r' || c == '\n' || c == '\0');
+            if (!end)
+                tmp[len++] = c;
+            prev = c;
+        } while (!end && len < sizeof(tmp));
+        av_bprint_append_data(bp, tmp, len);
+        read += len;
+    } while (!end);
+
+    if (c == '\r' && avio_r8(s) != '\n' && !avio_feof(s))
+        avio_skip(s, -1);
+
+    if (!c && s->error)
+        return s->error;
+
+    if (!c && !read && avio_feof(s))
+        return AVERROR_EOF;
+
+    return read;
+}
+
+static void get_bprint_line(AVIOContext *s, AVBPrint *bp)
+{
+
+    do {
+        av_bprint_clear(bp);
+        read_line_to_bprint_escaped(s, bp);
+    } while (!avio_feof(s) && (bp->str[0] == ';' || bp->str[0] == '#' || bp->str[0] == 0));
+}
+
 static void get_line(AVIOContext *s, uint8_t *buf, int size)
 {
     do {
@@ -128,12 +171,14 @@
 static int read_header(AVFormatContext *s)
 {
     AVDictionary **m = &s->metadata;
-    uint8_t line[1024];
+    AVBPrint bp;
+
+    av_bprint_init(&bp, 0, AV_BPRINT_SIZE_UNLIMITED);
 
     while(!avio_feof(s->pb)) {
-        get_line(s->pb, line, sizeof(line));
+        get_bprint_line(s->pb, &bp);
 
-        if (!memcmp(line, ID_STREAM, strlen(ID_STREAM))) {
+        if (!memcmp(bp.str, ID_STREAM, strlen(ID_STREAM))) {
             AVStream *st = avformat_new_stream(s, NULL);
 
             if (!st)
@@ -143,7 +188,7 @@
             st->codecpar->codec_id   = AV_CODEC_ID_FFMETADATA;
 
             m = &st->metadata;
-        } else if (!memcmp(line, ID_CHAPTER, strlen(ID_CHAPTER))) {
+        } else if (!memcmp(bp.str, ID_CHAPTER, strlen(ID_CHAPTER))) {
             AVChapter *ch = read_chapter(s);
 
             if (!ch)
@@ -151,9 +196,11 @@
 
             m = &ch->metadata;
         } else
-            read_tag(line, m);
+            read_tag(bp.str, m);
     }
 
+    av_bprint_finalize(&bp, NULL);
+
     s->start_time = 0;
     if (s->nb_chapters)
         s->duration = av_rescale_q(s->chapters[s->nb_chapters - 1]->end,
diff --git a/libavformat/ffmetaenc.c b/libavformat/ffmetaenc.c
index a9adbb1..800fb18 100644
--- a/libavformat/ffmetaenc.c
+++ b/libavformat/ffmetaenc.c
@@ -54,7 +54,6 @@
     avio_write(s->pb, ID_STRING, sizeof(ID_STRING) - 1);
     avio_w8(s->pb, '1');          // version
     avio_w8(s->pb, '\n');
-    avio_flush(s->pb);
     return 0;
 }
 
diff --git a/libavformat/fifo.c b/libavformat/fifo.c
index 145e2e2..d11dc66 100644
--- a/libavformat/fifo.c
+++ b/libavformat/fifo.c
@@ -36,7 +36,6 @@
     AVFormatContext *avf;
 
     char *format;
-    char *format_options_str;
     AVDictionary *format_options;
 
     int queue_size;
@@ -442,7 +441,7 @@
     return NULL;
 }
 
-static int fifo_mux_init(AVFormatContext *avf, AVOutputFormat *oformat,
+static int fifo_mux_init(AVFormatContext *avf, ff_const59 AVOutputFormat *oformat,
                          const char *filename)
 {
     FifoContext *fifo = avf->priv_data;
@@ -481,7 +480,7 @@
 static int fifo_init(AVFormatContext *avf)
 {
     FifoContext *fifo = avf->priv_data;
-    AVOutputFormat *oformat;
+    ff_const59 AVOutputFormat *oformat;
     int ret = 0;
 
     if (fifo->recovery_wait_streamtime && !fifo->drop_pkts_on_overflow) {
@@ -490,16 +489,6 @@
         return AVERROR(EINVAL);
     }
 
-    if (fifo->format_options_str) {
-        ret = av_dict_parse_string(&fifo->format_options, fifo->format_options_str,
-                                   "=", ":", 0);
-        if (ret < 0) {
-            av_log(avf, AV_LOG_ERROR, "Could not parse format options list '%s'\n",
-                   fifo->format_options_str);
-            return ret;
-        }
-    }
-
     oformat = av_guess_format(fifo->format, avf->url, NULL);
     if (!oformat) {
         ret = AVERROR_MUXER_NOT_FOUND;
@@ -547,7 +536,6 @@
     int ret;
 
     if (pkt) {
-        av_init_packet(&msg.pkt);
         ret = av_packet_ref(&msg.pkt,pkt);
         if (ret < 0)
             return ret;
@@ -604,7 +592,6 @@
 {
     FifoContext *fifo = avf->priv_data;
 
-    av_dict_free(&fifo->format_options);
     avformat_free_context(fifo->avf);
     av_thread_message_queue_free(&fifo->queue);
     if (fifo->overflow_flag_lock_initialized)
@@ -619,8 +606,8 @@
         {"queue_size", "Size of fifo queue", OFFSET(queue_size),
          AV_OPT_TYPE_INT, {.i64 = FIFO_DEFAULT_QUEUE_SIZE}, 1, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM},
 
-        {"format_opts", "Options to be passed to underlying muxer", OFFSET(format_options_str),
-         AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, AV_OPT_FLAG_ENCODING_PARAM},
+        {"format_opts", "Options to be passed to underlying muxer", OFFSET(format_options),
+         AV_OPT_TYPE_DICT, {.str = NULL}, 0, 0, AV_OPT_FLAG_ENCODING_PARAM},
 
         {"drop_pkts_on_overflow", "Drop packets on fifo queue overflow not to block encoder", OFFSET(drop_pkts_on_overflow),
          AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, AV_OPT_FLAG_ENCODING_PARAM},
diff --git a/libavformat/file.c b/libavformat/file.c
index 1d321c4..8303436 100644
--- a/libavformat/file.c
+++ b/libavformat/file.c
@@ -73,6 +73,7 @@
     int trunc;
     int blocksize;
     int follow;
+    int seekable;
 #if HAVE_DIRENT_H
     DIR *dir;
 #endif
@@ -82,6 +83,7 @@
     { "truncate", "truncate existing files on write", offsetof(FileContext, trunc), AV_OPT_TYPE_BOOL, { .i64 = 1 }, 0, 1, AV_OPT_FLAG_ENCODING_PARAM },
     { "blocksize", "set I/O operation maximum block size", offsetof(FileContext, blocksize), AV_OPT_TYPE_INT, { .i64 = INT_MAX }, 1, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM },
     { "follow", "Follow a file as it is being written", offsetof(FileContext, follow), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, AV_OPT_FLAG_DECODING_PARAM },
+    { "seekable", "Sets if the file is seekable", offsetof(FileContext, seekable), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 0, AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_ENCODING_PARAM },
     { NULL }
 };
 
@@ -173,7 +175,11 @@
     av_strstart(filename, "file:", &filename);
 
     ret = rmdir(filename);
-    if (ret < 0 && errno == ENOTDIR)
+    if (ret < 0 && (errno == ENOTDIR
+#   ifdef _WIN32
+        || errno == EINVAL
+#   endif
+        ))
         ret = unlink(filename);
     if (ret < 0)
         return AVERROR(errno);
@@ -234,6 +240,9 @@
     if (!h->is_streamed && flags & AVIO_FLAG_WRITE)
         h->min_packet_size = h->max_packet_size = 262144;
 
+    if (c->seekable >= 0)
+        h->is_streamed = !c->seekable;
+
     return 0;
 }
 
@@ -360,7 +369,7 @@
     .url_open_dir        = file_open_dir,
     .url_read_dir        = file_read_dir,
     .url_close_dir       = file_close_dir,
-    .default_whitelist   = "file,crypto"
+    .default_whitelist   = "file,crypto,data"
 };
 
 #endif /* CONFIG_FILE_PROTOCOL */
@@ -399,7 +408,7 @@
     .url_check           = file_check,
     .priv_data_size      = sizeof(FileContext),
     .priv_data_class     = &pipe_class,
-    .default_whitelist   = "crypto"
+    .default_whitelist   = "crypto,data"
 };
 
 #endif /* CONFIG_PIPE_PROTOCOL */
diff --git a/libavformat/filmstripenc.c b/libavformat/filmstripenc.c
index 8ead696..83faf29 100644
--- a/libavformat/filmstripenc.c
+++ b/libavformat/filmstripenc.c
@@ -26,13 +26,10 @@
 
 #include "libavutil/intreadwrite.h"
 #include "avformat.h"
+#include "rawenc.h"
 
 #define RAND_TAG MKBETAG('R','a','n','d')
 
-typedef struct FilmstripMuxContext {
-    int nb_frames;
-} FilmstripMuxContext;
-
 static int write_header(AVFormatContext *s)
 {
     if (s->streams[0]->codecpar->format != AV_PIX_FMT_RGBA) {
@@ -42,23 +39,14 @@
     return 0;
 }
 
-static int write_packet(AVFormatContext *s, AVPacket *pkt)
-{
-    FilmstripMuxContext *film = s->priv_data;
-    avio_write(s->pb, pkt->data, pkt->size);
-    film->nb_frames++;
-    return 0;
-}
-
 static int write_trailer(AVFormatContext *s)
 {
-    FilmstripMuxContext *film = s->priv_data;
     AVIOContext *pb = s->pb;
     AVStream *st = s->streams[0];
     int i;
 
     avio_wb32(pb, RAND_TAG);
-    avio_wb32(pb, film->nb_frames);
+    avio_wb32(pb, st->nb_frames);
     avio_wb16(pb, 0);  // packing method
     avio_wb16(pb, 0);  // reserved
     avio_wb16(pb, st->codecpar->width);
@@ -76,10 +64,9 @@
     .name              = "filmstrip",
     .long_name         = NULL_IF_CONFIG_SMALL("Adobe Filmstrip"),
     .extensions        = "flm",
-    .priv_data_size    = sizeof(FilmstripMuxContext),
     .audio_codec       = AV_CODEC_ID_NONE,
     .video_codec       = AV_CODEC_ID_RAWVIDEO,
     .write_header      = write_header,
-    .write_packet      = write_packet,
+    .write_packet      = ff_raw_write_packet,
     .write_trailer     = write_trailer,
 };
diff --git a/libavformat/fitsdec.c b/libavformat/fitsdec.c
index 4b288b3..e52ddc7 100644
--- a/libavformat/fitsdec.c
+++ b/libavformat/fitsdec.c
@@ -39,7 +39,7 @@
     int64_t pts;
 } FITSContext;
 
-static int fits_probe(AVProbeData *p)
+static int fits_probe(const AVProbeData *p)
 {
     const uint8_t *b = p->buf;
     if (!memcmp(b, "SIMPLE  =                    T", 30))
@@ -157,11 +157,11 @@
 
     av_bprint_init(&avbuf, FITS_BLOCK_SIZE, AV_BPRINT_SIZE_UNLIMITED);
     while ((ret = is_image(s, fits, &header, &avbuf, &size)) == 0) {
+        av_bprint_finalize(&avbuf, NULL);
         pos = avio_skip(s->pb, size);
         if (pos < 0)
             return pos;
 
-        av_bprint_finalize(&avbuf, NULL);
         av_bprint_init(&avbuf, FITS_BLOCK_SIZE, AV_BPRINT_SIZE_UNLIMITED);
         avpriv_fits_header_init(&header, STATE_XTENSION);
     }
@@ -183,7 +183,6 @@
 
     ret = av_bprint_finalize(&avbuf, &buf);
     if (ret < 0) {
-        av_packet_unref(pkt);
         return ret;
     }
 
@@ -192,7 +191,6 @@
     av_freep(&buf);
     ret = avio_read(s->pb, pkt->data + pkt->size, size);
     if (ret < 0) {
-        av_packet_unref(pkt);
         return ret;
     }
 
diff --git a/libavformat/flac_picture.c b/libavformat/flac_picture.c
index 38982b9..81ddf80 100644
--- a/libavformat/flac_picture.c
+++ b/libavformat/flac_picture.c
@@ -19,7 +19,9 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
-#include "libavutil/avassert.h"
+#include "libavutil/intreadwrite.h"
+#include "libavcodec/bytestream.h"
+#include "libavcodec/png.h"
 #include "avformat.h"
 #include "flac_picture.h"
 #include "id3v2.h"
@@ -31,37 +33,46 @@
     enum AVCodecID id = AV_CODEC_ID_NONE;
     AVBufferRef *data = NULL;
     uint8_t mimetype[64], *desc = NULL;
-    AVIOContext *pb = NULL;
+    GetByteContext g;
     AVStream *st;
     int width, height, ret = 0;
-    int len;
-    unsigned int type;
+    unsigned int len, type;
 
-    pb = avio_alloc_context(buf, buf_size, 0, NULL, NULL, NULL, NULL);
-    if (!pb)
-        return AVERROR(ENOMEM);
+    if (buf_size < 34) {
+        av_log(s, AV_LOG_ERROR, "Attached picture metadata block too short\n");
+        if (s->error_recognition & AV_EF_EXPLODE)
+            return AVERROR_INVALIDDATA;
+        return 0;
+    }
+
+    bytestream2_init(&g, buf, buf_size);
 
     /* read the picture type */
-    type = avio_rb32(pb);
+    type = bytestream2_get_be32u(&g);
     if (type >= FF_ARRAY_ELEMS(ff_id3v2_picture_types)) {
         av_log(s, AV_LOG_ERROR, "Invalid picture type: %d.\n", type);
         if (s->error_recognition & AV_EF_EXPLODE) {
-            RETURN_ERROR(AVERROR_INVALIDDATA);
+            return AVERROR_INVALIDDATA;
         }
         type = 0;
     }
 
     /* picture mimetype */
-    len = avio_rb32(pb);
-    if (len <= 0 || len >= 64 ||
-        avio_read(pb, mimetype, FFMIN(len, sizeof(mimetype) - 1)) != len) {
+    len = bytestream2_get_be32u(&g);
+    if (len <= 0 || len >= sizeof(mimetype)) {
         av_log(s, AV_LOG_ERROR, "Could not read mimetype from an attached "
                "picture.\n");
         if (s->error_recognition & AV_EF_EXPLODE)
-            ret = AVERROR_INVALIDDATA;
-        goto fail;
+            return AVERROR_INVALIDDATA;
+        return 0;
     }
-    av_assert0(len < sizeof(mimetype));
+    if (len + 24 > bytestream2_get_bytes_left(&g)) {
+        av_log(s, AV_LOG_ERROR, "Attached picture metadata block too short\n");
+        if (s->error_recognition & AV_EF_EXPLODE)
+            return AVERROR_INVALIDDATA;
+        return 0;
+    }
+    bytestream2_get_bufferu(&g, mimetype, len);
     mimetype[len] = 0;
 
     while (mime->id != AV_CODEC_ID_NONE) {
@@ -75,35 +86,36 @@
         av_log(s, AV_LOG_ERROR, "Unknown attached picture mimetype: %s.\n",
                mimetype);
         if (s->error_recognition & AV_EF_EXPLODE)
-            ret = AVERROR_INVALIDDATA;
-        goto fail;
+            return AVERROR_INVALIDDATA;
+        return 0;
     }
 
     /* picture description */
-    len = avio_rb32(pb);
+    len = bytestream2_get_be32u(&g);
+    if (len > bytestream2_get_bytes_left(&g) - 20) {
+        av_log(s, AV_LOG_ERROR, "Attached picture metadata block too short\n");
+        if (s->error_recognition & AV_EF_EXPLODE)
+            return AVERROR_INVALIDDATA;
+        return 0;
+    }
     if (len > 0) {
         if (!(desc = av_malloc(len + 1))) {
-            RETURN_ERROR(AVERROR(ENOMEM));
+            return AVERROR(ENOMEM);
         }
 
-        if (avio_read(pb, desc, len) != len) {
-            av_log(s, AV_LOG_ERROR, "Error reading attached picture description.\n");
-            if (s->error_recognition & AV_EF_EXPLODE)
-                ret = AVERROR(EIO);
-            goto fail;
-        }
+        bytestream2_get_bufferu(&g, desc, len);
         desc[len] = 0;
     }
 
     /* picture metadata */
-    width  = avio_rb32(pb);
-    height = avio_rb32(pb);
-    avio_skip(pb, 8);
+    width  = bytestream2_get_be32u(&g);
+    height = bytestream2_get_be32u(&g);
+    bytestream2_skipu(&g, 8);
 
     /* picture data */
-    len = avio_rb32(pb);
-    if (len <= 0) {
-        av_log(s, AV_LOG_ERROR, "Invalid attached picture size: %d.\n", len);
+    len = bytestream2_get_be32u(&g);
+    if (len <= 0 || len > bytestream2_get_bytes_left(&g)) {
+        av_log(s, AV_LOG_ERROR, "Attached picture metadata block too short\n");
         if (s->error_recognition & AV_EF_EXPLODE)
             ret = AVERROR_INVALIDDATA;
         goto fail;
@@ -111,13 +123,11 @@
     if (!(data = av_buffer_alloc(len + AV_INPUT_BUFFER_PADDING_SIZE))) {
         RETURN_ERROR(AVERROR(ENOMEM));
     }
+    bytestream2_get_bufferu(&g, data->data, len);
     memset(data->data + len, 0, AV_INPUT_BUFFER_PADDING_SIZE);
-    if (avio_read(pb, data->data, len) != len) {
-        av_log(s, AV_LOG_ERROR, "Error reading attached picture data.\n");
-        if (s->error_recognition & AV_EF_EXPLODE)
-            ret = AVERROR(EIO);
-        goto fail;
-    }
+
+    if (AV_RB64(data->data) == PNGSIG)
+        id = AV_CODEC_ID_PNG;
 
     st = avformat_new_stream(s, NULL);
     if (!st) {
@@ -140,14 +150,11 @@
     if (desc)
         av_dict_set(&st->metadata, "title", desc, AV_DICT_DONT_STRDUP_VAL);
 
-    avio_context_free(&pb);
-
     return 0;
 
 fail:
     av_buffer_unref(&data);
     av_freep(&desc);
-    avio_context_free(&pb);
 
     return ret;
 }
diff --git a/libavformat/flacdec.c b/libavformat/flacdec.c
index a032378..cb516fb 100644
--- a/libavformat/flacdec.c
+++ b/libavformat/flacdec.c
@@ -31,6 +31,8 @@
 #define SEEKPOINT_SIZE 18
 
 typedef struct FLACDecContext {
+    AVClass *class;
+    int raw_packet_size;
     int found_seektable;
 } FLACDecContext;
 
@@ -211,7 +213,7 @@
     return ret;
 }
 
-static int raw_flac_probe(AVProbeData *p)
+static int raw_flac_probe(const AVProbeData *p)
 {
     if ((p->buf[2] & 0xF0) == 0)    // blocksize code invalid
         return 0;
@@ -227,7 +229,7 @@
     return AVPROBE_SCORE_EXTENSION / 4 + 1;
 }
 
-static int flac_probe(AVProbeData *p)
+static int flac_probe(const AVProbeData *p)
 {
     if ((AV_RB16(p->buf) & 0xFFFE) == 0xFFF8)
         return raw_flac_probe(p);
@@ -257,7 +259,7 @@
 static av_unused int64_t flac_read_timestamp(AVFormatContext *s, int stream_index,
                                              int64_t *ppos, int64_t pos_limit)
 {
-    AVPacket pkt, out_pkt;
+    AVPacket pkt;
     AVStream *st = s->streams[stream_index];
     AVCodecParserContext *parser;
     int ret;
@@ -274,6 +276,9 @@
     parser->flags |= PARSER_FLAG_USE_CODEC_TS;
 
     for (;;){
+        uint8_t *data;
+        int size;
+
         ret = ff_raw_read_partial_packet(s, &pkt);
         if (ret < 0){
             if (ret == AVERROR(EAGAIN))
@@ -283,14 +288,12 @@
                 av_assert1(!pkt.size);
             }
         }
-        av_init_packet(&out_pkt);
         av_parser_parse2(parser, st->internal->avctx,
-                         &out_pkt.data, &out_pkt.size, pkt.data, pkt.size,
+                         &data, &size, pkt.data, pkt.size,
                          pkt.pts, pkt.dts, *ppos);
 
         av_packet_unref(&pkt);
-        if (out_pkt.size){
-            int size = out_pkt.size;
+        if (size) {
             if (parser->pts != AV_NOPTS_VALUE){
                 // seeking may not have started from beginning of a frame
                 // calculate frame start position from next frame backwards
@@ -327,6 +330,7 @@
     return -1;
 }
 
+FF_RAW_DEMUXER_CLASS(flac)
 AVInputFormat ff_flac_demuxer = {
     .name           = "flac",
     .long_name      = NULL_IF_CONFIG_SMALL("raw FLAC"),
@@ -339,4 +343,5 @@
     .extensions     = "flac",
     .raw_codec_id   = AV_CODEC_ID_FLAC,
     .priv_data_size = sizeof(FLACDecContext),
+    .priv_class     = &flac_demuxer_class,
 };
diff --git a/libavformat/flacenc.c b/libavformat/flacenc.c
index 617bccd..a043274 100644
--- a/libavformat/flacenc.c
+++ b/libavformat/flacenc.c
@@ -42,7 +42,8 @@
     AVPacketList *queue, *queue_end;
 
     /* updated streaminfo sent by the encoder at the end */
-    uint8_t *streaminfo;
+    uint8_t streaminfo[FLAC_STREAMINFO_SIZE];
+    int updated_streaminfo;
 
     unsigned attached_types;
 } FlacMuxerContext;
@@ -65,7 +66,7 @@
 
     ff_metadata_conv(m, ff_vorbiscomment_metadata_conv, NULL);
 
-    len = ff_vorbiscomment_length(*m, vendor);
+    len = ff_vorbiscomment_length(*m, vendor, NULL, 0);
     if (len >= ((1<<24) - 4))
         return AVERROR(EINVAL);
     p0 = av_malloc(len+4);
@@ -75,7 +76,7 @@
 
     bytestream_put_byte(&p, last_block ? 0x84 : 0x04);
     bytestream_put_be24(&p, len);
-    ff_vorbiscomment_write(&p, m, vendor);
+    ff_vorbiscomment_write(&p, m, vendor, NULL, 0);
 
     avio_write(pb, p0, len+4);
     av_freep(&p0);
@@ -93,7 +94,7 @@
     AVDictionaryEntry *e;
     const char *mimetype = NULL, *desc = "";
     const AVStream *st = s->streams[pkt->stream_index];
-    int i, mimelen, desclen, type = 0;
+    int i, mimelen, desclen, type = 0, blocklen;
 
     if (!pkt->data)
         return 0;
@@ -140,8 +141,14 @@
         desc = e->value;
     desclen = strlen(desc);
 
+    blocklen = 4 + 4 + mimelen + 4 + desclen + 4 + 4 + 4 + 4 + 4 + pkt->size;
+    if (blocklen >= 1<<24) {
+        av_log(s, AV_LOG_ERROR, "Picture block too big %d >= %d\n", blocklen, 1<<24);
+        return AVERROR(EINVAL);
+    }
+
     avio_w8(pb, 0x06);
-    avio_wb24(pb, 4 + 4 + mimelen + 4 + desclen + 4 + 4 + 4 + 4 + 4 + pkt->size);
+    avio_wb24(pb, blocklen);
 
     avio_wb32(pb, type);
 
@@ -288,12 +295,8 @@
     streaminfo = av_packet_get_side_data(pkt, AV_PKT_DATA_NEW_EXTRADATA,
                                          &streaminfo_size);
     if (streaminfo && streaminfo_size == FLAC_STREAMINFO_SIZE) {
-        av_freep(&c->streaminfo);
-
-        c->streaminfo = av_malloc(FLAC_STREAMINFO_SIZE);
-        if (!c->streaminfo)
-            return AVERROR(ENOMEM);
         memcpy(c->streaminfo, streaminfo, FLAC_STREAMINFO_SIZE);
+        c->updated_streaminfo = 1;
     }
 
     if (pkt->size)
@@ -325,8 +328,6 @@
     AVIOContext *pb = s->pb;
     int64_t file_size;
     FlacMuxerContext *c = s->priv_data;
-    uint8_t *streaminfo = c->streaminfo ? c->streaminfo :
-                                          s->streams[c->audio_stream_idx]->codecpar->extradata;
 
     if (c->waiting_pics) {
         av_log(s, AV_LOG_WARNING, "No packets were sent for some of the "
@@ -334,25 +335,29 @@
         flac_queue_flush(s);
     }
 
-    if (!c->write_header || !streaminfo)
+    if (!c->write_header || !c->updated_streaminfo)
         return 0;
 
     if (pb->seekable & AVIO_SEEKABLE_NORMAL) {
         /* rewrite the STREAMINFO header block data */
         file_size = avio_tell(pb);
         avio_seek(pb, 8, SEEK_SET);
-        avio_write(pb, streaminfo, FLAC_STREAMINFO_SIZE);
+        avio_write(pb, c->streaminfo, FLAC_STREAMINFO_SIZE);
         avio_seek(pb, file_size, SEEK_SET);
-        avio_flush(pb);
     } else {
         av_log(s, AV_LOG_WARNING, "unable to rewrite FLAC header.\n");
     }
 
-    av_freep(&c->streaminfo);
-
     return 0;
 }
 
+static void flac_deinit(struct AVFormatContext *s)
+{
+    FlacMuxerContext *c = s->priv_data;
+
+    ff_packet_list_free(&c->queue, &c->queue_end);
+}
+
 static int flac_write_packet(struct AVFormatContext *s, AVPacket *pkt)
 {
     FlacMuxerContext *c = s->priv_data;
@@ -425,6 +430,7 @@
     .write_header      = flac_write_header,
     .write_packet      = flac_write_packet,
     .write_trailer     = flac_write_trailer,
+    .deinit            = flac_deinit,
     .flags             = AVFMT_NOTIMESTAMPS,
     .priv_class        = &flac_muxer_class,
 };
diff --git a/libavformat/flacenc.h b/libavformat/flacenc.h
index d5d53a5..b308d0d 100644
--- a/libavformat/flacenc.h
+++ b/libavformat/flacenc.h
@@ -26,7 +26,7 @@
 #include "libavcodec/bytestream.h"
 #include "avformat.h"
 
-int ff_flac_write_header(AVIOContext *pb, uint8_t *extradata,
+int ff_flac_write_header(AVIOContext *pb, const uint8_t *extradata,
                          int extradata_size, int last_block);
 
 int ff_flac_is_native_layout(uint64_t channel_layout);
diff --git a/libavformat/flacenc_header.c b/libavformat/flacenc_header.c
index 61833cc..aba22a5 100644
--- a/libavformat/flacenc_header.c
+++ b/libavformat/flacenc_header.c
@@ -26,7 +26,7 @@
 #include "avformat.h"
 #include "flacenc.h"
 
-int ff_flac_write_header(AVIOContext *pb, uint8_t *extradata,
+int ff_flac_write_header(AVIOContext *pb, const uint8_t *extradata,
                          int extradata_size, int last_block)
 {
     uint8_t header[8] = {
diff --git a/libavformat/flic.c b/libavformat/flic.c
index 7c62cb4..e65c157 100644
--- a/libavformat/flic.c
+++ b/libavformat/flic.c
@@ -57,7 +57,7 @@
     int frame_number;
 } FlicDemuxContext;
 
-static int flic_probe(AVProbeData *p)
+static int flic_probe(const AVProbeData *p)
 {
     int magic_number;
 
@@ -89,7 +89,7 @@
     AVIOContext *pb = s->pb;
     unsigned char header[FLIC_HEADER_SIZE];
     AVStream *st, *ast;
-    int speed;
+    int speed, ret;
     int magic_number;
     unsigned char preamble[FLIC_PREAMBLE_SIZE];
 
@@ -125,8 +125,8 @@
     }
 
     /* send over the whole 128-byte FLIC header */
-    if (ff_alloc_extradata(st->codecpar, FLIC_HEADER_SIZE))
-        return AVERROR(ENOMEM);
+    if ((ret = ff_alloc_extradata(st->codecpar, FLIC_HEADER_SIZE)) < 0)
+        return ret;
     memcpy(st->codecpar->extradata, header, FLIC_HEADER_SIZE);
 
     /* peek at the preamble to detect TFTD videos - they seem to always start with an audio chunk */
@@ -175,9 +175,8 @@
         avio_seek(pb, 12, SEEK_SET);
 
         /* send over abbreviated FLIC header chunk */
-        av_freep(&st->codecpar->extradata);
-        if (ff_alloc_extradata(st->codecpar, 12))
-            return AVERROR(ENOMEM);
+        if ((ret = ff_alloc_extradata(st->codecpar, 12)) < 0)
+            return ret;
         memcpy(st->codecpar->extradata, header, 12);
 
     } else if (magic_number == FLIC_FILE_MAGIC_1) {
@@ -216,10 +215,9 @@
         magic = AV_RL16(&preamble[4]);
 
         if (((magic == FLIC_CHUNK_MAGIC_1) || (magic == FLIC_CHUNK_MAGIC_2)) && size > FLIC_PREAMBLE_SIZE) {
-            if (av_new_packet(pkt, size)) {
-                ret = AVERROR(EIO);
-                break;
-            }
+            if ((ret = av_new_packet(pkt, size)) < 0)
+                return ret;
+
             pkt->stream_index = flic->video_stream_index;
             pkt->pts = flic->frame_number++;
             pkt->pos = avio_tell(pb);
@@ -227,15 +225,12 @@
             ret = avio_read(pb, pkt->data + FLIC_PREAMBLE_SIZE,
                 size - FLIC_PREAMBLE_SIZE);
             if (ret != size - FLIC_PREAMBLE_SIZE) {
-                av_packet_unref(pkt);
                 ret = AVERROR(EIO);
             }
             packet_read = 1;
         } else if (magic == FLIC_TFTD_CHUNK_AUDIO) {
-            if (av_new_packet(pkt, size)) {
-                ret = AVERROR(EIO);
-                break;
-            }
+            if ((ret = av_new_packet(pkt, size)) < 0)
+                return ret;
 
             /* skip useless 10B sub-header (yes, it's not accounted for in the chunk header) */
             avio_skip(pb, 10);
@@ -245,8 +240,8 @@
             ret = avio_read(pb, pkt->data, size);
 
             if (ret != size) {
-                av_packet_unref(pkt);
                 ret = AVERROR(EIO);
+                break;
             }
 
             packet_read = 1;
diff --git a/libavformat/flv.h b/libavformat/flv.h
index df5ce3d..3571b90 100644
--- a/libavformat/flv.h
+++ b/libavformat/flv.h
@@ -65,6 +65,7 @@
 enum {
     FLV_STREAM_TYPE_VIDEO,
     FLV_STREAM_TYPE_AUDIO,
+    FLV_STREAM_TYPE_SUBTITLE,
     FLV_STREAM_TYPE_DATA,
     FLV_STREAM_TYPE_NB,
 };
diff --git a/libavformat/flvdec.c b/libavformat/flvdec.c
index a2dea46..7c3e5b0 100644
--- a/libavformat/flvdec.c
+++ b/libavformat/flvdec.c
@@ -30,8 +30,8 @@
 #include "libavutil/opt.h"
 #include "libavutil/intfloat.h"
 #include "libavutil/mathematics.h"
+#include "libavutil/time_internal.h"
 #include "libavcodec/bytestream.h"
-#include "libavcodec/mpeg4audio.h"
 #include "avformat.h"
 #include "internal.h"
 #include "avio_internal.h"
@@ -72,9 +72,18 @@
     int64_t *keyframe_filepositions;
     int missing_streams;
     AVRational framerate;
+    int64_t last_ts;
+    int64_t time_offset;
+    int64_t time_pos;
 } FLVContext;
 
-static int probe(AVProbeData *p, int live)
+/* AMF date type */
+typedef struct amf_date {
+    double   milliseconds;
+    int16_t  timezone;
+} amf_date;
+
+static int probe(const AVProbeData *p, int live)
 {
     const uint8_t *d = p->buf;
     unsigned offset = AV_RB32(d + 5);
@@ -93,16 +102,30 @@
     return 0;
 }
 
-static int flv_probe(AVProbeData *p)
+static int flv_probe(const AVProbeData *p)
 {
     return probe(p, 0);
 }
 
-static int live_flv_probe(AVProbeData *p)
+static int live_flv_probe(const AVProbeData *p)
 {
     return probe(p, 1);
 }
 
+static int kux_probe(const AVProbeData *p)
+{
+    const uint8_t *d = p->buf;
+
+    if (d[0] == 'K' &&
+        d[1] == 'D' &&
+        d[2] == 'K' &&
+        d[3] == 0 &&
+        d[4] == 0) {
+        return AVPROBE_SCORE_EXTENSION + 1;
+    }
+    return 0;
+}
+
 static void add_keyframes_index(AVFormatContext *s)
 {
     FLVContext *flv   = s->priv_data;
@@ -143,7 +166,9 @@
     st->codecpar->codec_type = codec_type;
     if (s->nb_streams>=3 ||(   s->nb_streams==2
                            && s->streams[0]->codecpar->codec_type != AVMEDIA_TYPE_SUBTITLE
-                           && s->streams[1]->codecpar->codec_type != AVMEDIA_TYPE_SUBTITLE))
+                           && s->streams[1]->codecpar->codec_type != AVMEDIA_TYPE_SUBTITLE
+                           && s->streams[0]->codecpar->codec_type != AVMEDIA_TYPE_DATA
+                           && s->streams[1]->codecpar->codec_type != AVMEDIA_TYPE_DATA))
         s->ctx_flags &= ~AVFMTCTX_NOHEADER;
     if (codec_type == AVMEDIA_TYPE_AUDIO) {
         st->codecpar->bit_rate = flv->audio_bit_rate;
@@ -381,7 +406,7 @@
     int64_t initial_pos    = avio_tell(ioc);
 
     if (flv->keyframe_count > 0) {
-        av_log(s, AV_LOG_DEBUG, "keyframes have been paresed\n");
+        av_log(s, AV_LOG_DEBUG, "keyframes have been parsed\n");
         return 0;
     }
     av_assert0(!flv->keyframe_times);
@@ -466,6 +491,7 @@
     AMFDataType amf_type;
     char str_val[1024];
     double num_val;
+    amf_date date;
 
     num_val  = 0;
     ioc      = s->pb;
@@ -537,7 +563,9 @@
     }
     break;
     case AMF_DATA_TYPE_DATE:
-        avio_skip(ioc, 8 + 2);  // timestamp (double) and UTC offset (int16)
+        // timestamp (double) and UTC offset (int16)
+        date.milliseconds = av_int2double(avio_rb64(ioc));
+        date.timezone = avio_rb16(ioc);
         break;
     default:                    // unsupported type, we couldn't skip
         av_log(s, AV_LOG_ERROR, "unsupported amf type %d\n", amf_type);
@@ -636,8 +664,18 @@
         } else if (amf_type == AMF_DATA_TYPE_NUMBER) {
             snprintf(str_val, sizeof(str_val), "%.f", num_val);
             av_dict_set(&s->metadata, key, str_val, 0);
-        } else if (amf_type == AMF_DATA_TYPE_STRING)
+        } else if (amf_type == AMF_DATA_TYPE_STRING) {
             av_dict_set(&s->metadata, key, str_val, 0);
+        } else if (amf_type == AMF_DATA_TYPE_DATE) {
+            time_t time;
+            struct tm t;
+            char datestr[128];
+            time =  date.milliseconds / 1000; // to seconds
+            localtime_r(&time, &t);
+            strftime(datestr, sizeof(datestr), "%a, %d %b %Y %H:%M:%S %z", &t);
+
+            av_dict_set(&s->metadata, key, datestr, 0);
+        }
     }
 
     return 0;
@@ -713,6 +751,10 @@
     int offset;
     int pre_tag_size = 0;
 
+    /* Actual FLV data at 0xe40000 in KUX file */
+    if(!strcmp(s->iformat->name, "kux"))
+        avio_skip(s->pb, 0xe40000);
+
     avio_skip(s->pb, 4);
     flags = avio_r8(s->pb);
 
@@ -753,12 +795,12 @@
 
 static int flv_get_extradata(AVFormatContext *s, AVStream *st, int size)
 {
+    int ret;
     if (!size)
         return 0;
 
-    av_freep(&st->codecpar->extradata);
-    if (ff_get_extradata(s, st->codecpar, s->pb, size) < 0)
-        return AVERROR(ENOMEM);
+    if ((ret = ff_get_extradata(s, st->codecpar, s->pb, size)) < 0)
+        return ret;
     st->internal->need_context_update = 1;
     return 0;
 }
@@ -915,6 +957,18 @@
         flv->resync_buffer[j ] =
         flv->resync_buffer[j1] = avio_r8(s->pb);
 
+        if (i >= 8 && pos) {
+            uint8_t *d = flv->resync_buffer + j1 - 8;
+            if (d[0] == 'F' &&
+                d[1] == 'L' &&
+                d[2] == 'V' &&
+                d[3] < 5 && d[5] == 0) {
+                av_log(s, AV_LOG_WARNING, "Concatenated FLV detected, might fail to demux, decode and seek %"PRId64"\n", flv->last_ts);
+                flv->time_offset = flv->last_ts + 1;
+                flv->time_pos    = avio_tell(s->pb);
+            }
+        }
+
         if (i > 22) {
             unsigned lsize2 = AV_RB32(flv->resync_buffer + j1 - 4);
             if (lsize2 >= 11 && lsize2 + 8LL < FFMIN(i, RESYNC_BUFFER_SIZE)) {
@@ -949,135 +1003,144 @@
 
 retry:
     /* pkt size is repeated at end. skip it */
-        pos  = avio_tell(s->pb);
-        type = (avio_r8(s->pb) & 0x1F);
-        orig_size =
-        size = avio_rb24(s->pb);
-        flv->sum_flv_tag_size += size + 11;
-        dts  = avio_rb24(s->pb);
-        dts |= (unsigned)avio_r8(s->pb) << 24;
-        av_log(s, AV_LOG_TRACE, "type:%d, size:%d, last:%d, dts:%"PRId64" pos:%"PRId64"\n", type, size, last, dts, avio_tell(s->pb));
-        if (avio_feof(s->pb))
-            return AVERROR_EOF;
-        avio_skip(s->pb, 3); /* stream id, always 0 */
-        flags = 0;
+    pos  = avio_tell(s->pb);
+    type = (avio_r8(s->pb) & 0x1F);
+    orig_size =
+    size = avio_rb24(s->pb);
+    flv->sum_flv_tag_size += size + 11;
+    dts  = avio_rb24(s->pb);
+    dts |= (unsigned)avio_r8(s->pb) << 24;
+    av_log(s, AV_LOG_TRACE, "type:%d, size:%d, last:%d, dts:%"PRId64" pos:%"PRId64"\n", type, size, last, dts, avio_tell(s->pb));
+    if (avio_feof(s->pb))
+        return AVERROR_EOF;
+    avio_skip(s->pb, 3); /* stream id, always 0 */
+    flags = 0;
 
-        if (flv->validate_next < flv->validate_count) {
-            int64_t validate_pos = flv->validate_index[flv->validate_next].pos;
-            if (pos == validate_pos) {
-                if (FFABS(dts - flv->validate_index[flv->validate_next].dts) <=
-                    VALIDATE_INDEX_TS_THRESH) {
-                    flv->validate_next++;
-                } else {
-                    clear_index_entries(s, validate_pos);
-                    flv->validate_count = 0;
-                }
-            } else if (pos > validate_pos) {
+    if (flv->validate_next < flv->validate_count) {
+        int64_t validate_pos = flv->validate_index[flv->validate_next].pos;
+        if (pos == validate_pos) {
+            if (FFABS(dts - flv->validate_index[flv->validate_next].dts) <=
+                VALIDATE_INDEX_TS_THRESH) {
+                flv->validate_next++;
+            } else {
                 clear_index_entries(s, validate_pos);
                 flv->validate_count = 0;
             }
+        } else if (pos > validate_pos) {
+            clear_index_entries(s, validate_pos);
+            flv->validate_count = 0;
         }
+    }
 
-        if (size == 0) {
-            ret = FFERROR_REDO;
-            goto leave;
-        }
+    if (size == 0) {
+        ret = FFERROR_REDO;
+        goto leave;
+    }
 
-        next = size + avio_tell(s->pb);
+    next = size + avio_tell(s->pb);
 
-        if (type == FLV_TAG_TYPE_AUDIO) {
-            stream_type = FLV_STREAM_TYPE_AUDIO;
-            flags    = avio_r8(s->pb);
-            size--;
-        } else if (type == FLV_TAG_TYPE_VIDEO) {
-            stream_type = FLV_STREAM_TYPE_VIDEO;
-            flags    = avio_r8(s->pb);
-            size--;
-            if ((flags & FLV_VIDEO_FRAMETYPE_MASK) == FLV_FRAME_VIDEO_INFO_CMD)
-                goto skip;
-        } else if (type == FLV_TAG_TYPE_META) {
-            stream_type=FLV_STREAM_TYPE_DATA;
-            if (size > 13 + 1 + 4) { // Header-type metadata stuff
-                int type;
-                meta_pos = avio_tell(s->pb);
-                type = flv_read_metabody(s, next);
-                if (type == 0 && dts == 0 || type < 0 || type == TYPE_UNKNOWN) {
-                    if (type < 0 && flv->validate_count &&
-                        flv->validate_index[0].pos     > next &&
-                        flv->validate_index[0].pos - 4 < next
-                    ) {
-                        av_log(s, AV_LOG_WARNING, "Adjusting next position due to index mismatch\n");
-                        next = flv->validate_index[0].pos - 4;
-                    }
-                    goto skip;
-                } else if (type == TYPE_ONTEXTDATA) {
-                    avpriv_request_sample(s, "OnTextData packet");
-                    return flv_data_packet(s, pkt, dts, next);
-                } else if (type == TYPE_ONCAPTION) {
-                    return flv_data_packet(s, pkt, dts, next);
+    if (type == FLV_TAG_TYPE_AUDIO) {
+        stream_type = FLV_STREAM_TYPE_AUDIO;
+        flags    = avio_r8(s->pb);
+        size--;
+    } else if (type == FLV_TAG_TYPE_VIDEO) {
+        stream_type = FLV_STREAM_TYPE_VIDEO;
+        flags    = avio_r8(s->pb);
+        size--;
+        if ((flags & FLV_VIDEO_FRAMETYPE_MASK) == FLV_FRAME_VIDEO_INFO_CMD)
+            goto skip;
+    } else if (type == FLV_TAG_TYPE_META) {
+        stream_type=FLV_STREAM_TYPE_SUBTITLE;
+        if (size > 13 + 1 + 4) { // Header-type metadata stuff
+            int type;
+            meta_pos = avio_tell(s->pb);
+            type = flv_read_metabody(s, next);
+            if (type == 0 && dts == 0 || type < 0) {
+                if (type < 0 && flv->validate_count &&
+                    flv->validate_index[0].pos     > next &&
+                    flv->validate_index[0].pos - 4 < next
+                ) {
+                    av_log(s, AV_LOG_WARNING, "Adjusting next position due to index mismatch\n");
+                    next = flv->validate_index[0].pos - 4;
                 }
-                avio_seek(s->pb, meta_pos, SEEK_SET);
+                goto skip;
+            } else if (type == TYPE_ONTEXTDATA) {
+                avpriv_request_sample(s, "OnTextData packet");
+                return flv_data_packet(s, pkt, dts, next);
+            } else if (type == TYPE_ONCAPTION) {
+                return flv_data_packet(s, pkt, dts, next);
+            } else if (type == TYPE_UNKNOWN) {
+                stream_type = FLV_STREAM_TYPE_DATA;
             }
-        } else {
-            av_log(s, AV_LOG_DEBUG,
-                   "Skipping flv packet: type %d, size %d, flags %d.\n",
-                   type, size, flags);
+            avio_seek(s->pb, meta_pos, SEEK_SET);
+        }
+    } else {
+        av_log(s, AV_LOG_DEBUG,
+               "Skipping flv packet: type %d, size %d, flags %d.\n",
+               type, size, flags);
 skip:
-            if (avio_seek(s->pb, next, SEEK_SET) != next) {
-                 // This can happen if flv_read_metabody above read past
-                 // next, on a non-seekable input, and the preceding data has
-                 // been flushed out from the IO buffer.
-                 av_log(s, AV_LOG_ERROR, "Unable to seek to the next packet\n");
-                 return AVERROR_INVALIDDATA;
-            }
-            ret = FFERROR_REDO;
-            goto leave;
+        if (avio_seek(s->pb, next, SEEK_SET) != next) {
+            // This can happen if flv_read_metabody above read past
+            // next, on a non-seekable input, and the preceding data has
+            // been flushed out from the IO buffer.
+            av_log(s, AV_LOG_ERROR, "Unable to seek to the next packet\n");
+            return AVERROR_INVALIDDATA;
         }
+        ret = FFERROR_REDO;
+        goto leave;
+    }
 
-        /* skip empty data packets */
-        if (!size) {
-            ret = FFERROR_REDO;
-            goto leave;
+    /* skip empty data packets */
+    if (!size) {
+        ret = FFERROR_REDO;
+        goto leave;
+    }
+
+    /* now find stream */
+    for (i = 0; i < s->nb_streams; i++) {
+        st = s->streams[i];
+        if (stream_type == FLV_STREAM_TYPE_AUDIO) {
+            if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO &&
+                (s->audio_codec_id || flv_same_audio_codec(st->codecpar, flags)))
+                break;
+        } else if (stream_type == FLV_STREAM_TYPE_VIDEO) {
+            if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO &&
+                (s->video_codec_id || flv_same_video_codec(st->codecpar, flags)))
+                break;
+        } else if (stream_type == FLV_STREAM_TYPE_SUBTITLE) {
+            if (st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE)
+                break;
+        } else if (stream_type == FLV_STREAM_TYPE_DATA) {
+            if (st->codecpar->codec_type == AVMEDIA_TYPE_DATA)
+                break;
         }
+    }
+    if (i == s->nb_streams) {
+        static const enum AVMediaType stream_types[] = {AVMEDIA_TYPE_VIDEO, AVMEDIA_TYPE_AUDIO, AVMEDIA_TYPE_SUBTITLE, AVMEDIA_TYPE_DATA};
+        st = create_stream(s, stream_types[stream_type]);
+        if (!st)
+            return AVERROR(ENOMEM);
 
-        /* now find stream */
-        for (i = 0; i < s->nb_streams; i++) {
-            st = s->streams[i];
-            if (stream_type == FLV_STREAM_TYPE_AUDIO) {
-                if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO &&
-                    (s->audio_codec_id || flv_same_audio_codec(st->codecpar, flags)))
-                    break;
-            } else if (stream_type == FLV_STREAM_TYPE_VIDEO) {
-                if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO &&
-                    (s->video_codec_id || flv_same_video_codec(st->codecpar, flags)))
-                    break;
-            } else if (stream_type == FLV_STREAM_TYPE_DATA) {
-                if (st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE)
-                    break;
-            }
-        }
-        if (i == s->nb_streams) {
-            static const enum AVMediaType stream_types[] = {AVMEDIA_TYPE_VIDEO, AVMEDIA_TYPE_AUDIO, AVMEDIA_TYPE_SUBTITLE};
-            st = create_stream(s, stream_types[stream_type]);
-            if (!st)
-                return AVERROR(ENOMEM);
+    }
+    av_log(s, AV_LOG_TRACE, "%d %X %d \n", stream_type, flags, st->discard);
 
-        }
-        av_log(s, AV_LOG_TRACE, "%d %X %d \n", stream_type, flags, st->discard);
+    if (flv->time_pos <= pos) {
+        dts += flv->time_offset;
+    }
 
-        if ((s->pb->seekable & AVIO_SEEKABLE_NORMAL) &&
-            ((flags & FLV_VIDEO_FRAMETYPE_MASK) == FLV_FRAME_KEY ||
-              stream_type == FLV_STREAM_TYPE_AUDIO))
-            av_add_index_entry(st, pos, dts, size, 0, AVINDEX_KEYFRAME);
+    if ((s->pb->seekable & AVIO_SEEKABLE_NORMAL) &&
+        ((flags & FLV_VIDEO_FRAMETYPE_MASK) == FLV_FRAME_KEY ||
+         stream_type == FLV_STREAM_TYPE_AUDIO))
+        av_add_index_entry(st, pos, dts, size, 0, AVINDEX_KEYFRAME);
 
-        if (  (st->discard >= AVDISCARD_NONKEY && !((flags & FLV_VIDEO_FRAMETYPE_MASK) == FLV_FRAME_KEY || (stream_type == FLV_STREAM_TYPE_AUDIO)))
-            ||(st->discard >= AVDISCARD_BIDIR  &&  ((flags & FLV_VIDEO_FRAMETYPE_MASK) == FLV_FRAME_DISP_INTER && (stream_type == FLV_STREAM_TYPE_VIDEO)))
-            || st->discard >= AVDISCARD_ALL
-        ) {
-            avio_seek(s->pb, next, SEEK_SET);
-            ret = FFERROR_REDO;
-            goto leave;
-        }
+    if (  (st->discard >= AVDISCARD_NONKEY && !((flags & FLV_VIDEO_FRAMETYPE_MASK) == FLV_FRAME_KEY || (stream_type == FLV_STREAM_TYPE_AUDIO)))
+          ||(st->discard >= AVDISCARD_BIDIR  &&  ((flags & FLV_VIDEO_FRAMETYPE_MASK) == FLV_FRAME_DISP_INTER && (stream_type == FLV_STREAM_TYPE_VIDEO)))
+          || st->discard >= AVDISCARD_ALL
+    ) {
+        avio_seek(s->pb, next, SEEK_SET);
+        ret = FFERROR_REDO;
+        goto leave;
+    }
 
     // if not streamed and no duration from metadata then seek to end to find
     // the duration from the timestamps
@@ -1151,8 +1214,10 @@
         if (ret < 0)
             return ret;
         size -= ret;
-    } else if (stream_type == FLV_STREAM_TYPE_DATA) {
+    } else if (stream_type == FLV_STREAM_TYPE_SUBTITLE) {
         st->codecpar->codec_id = AV_CODEC_ID_TEXT;
+    } else if (stream_type == FLV_STREAM_TYPE_DATA) {
+        st->codecpar->codec_id = AV_CODEC_ID_NONE; // Opaque AMF data
     }
 
     if (st->codecpar->codec_id == AV_CODEC_ID_AAC ||
@@ -1199,22 +1264,6 @@
             if (st->codecpar->codec_id == AV_CODEC_ID_AAC && t && !strcmp(t->value, "Omnia A/XE"))
                 st->codecpar->extradata_size = 2;
 
-            if (st->codecpar->codec_id == AV_CODEC_ID_AAC && 0) {
-                MPEG4AudioConfig cfg;
-
-                if (avpriv_mpeg4audio_get_config(&cfg, st->codecpar->extradata,
-                                                 st->codecpar->extradata_size * 8, 1) >= 0) {
-                st->codecpar->channels       = cfg.channels;
-                st->codecpar->channel_layout = 0;
-                if (cfg.ext_sample_rate)
-                    st->codecpar->sample_rate = cfg.ext_sample_rate;
-                else
-                    st->codecpar->sample_rate = cfg.sample_rate;
-                av_log(s, AV_LOG_TRACE, "mp4a config channels %d sample rate %d\n",
-                        st->codecpar->channels, st->codecpar->sample_rate);
-                }
-            }
-
             ret = FFERROR_REDO;
             goto leave;
         }
@@ -1253,6 +1302,7 @@
 
     if (    stream_type == FLV_STREAM_TYPE_AUDIO ||
             ((flags & FLV_VIDEO_FRAMETYPE_MASK) == FLV_FRAME_KEY) ||
+            stream_type == FLV_STREAM_TYPE_SUBTITLE ||
             stream_type == FLV_STREAM_TYPE_DATA)
         pkt->flags |= AV_PKT_FLAG_KEY;
 
@@ -1272,6 +1322,10 @@
             }
         }
     }
+
+    if (ret >= 0)
+        flv->last_ts = pkt->dts;
+
     return ret;
 }
 
@@ -1333,3 +1387,23 @@
     .priv_class     = &live_flv_class,
     .flags          = AVFMT_TS_DISCONT
 };
+
+static const AVClass kux_class = {
+    .class_name = "kuxdec",
+    .item_name  = av_default_item_name,
+    .option     = options,
+    .version    = LIBAVUTIL_VERSION_INT,
+};
+
+AVInputFormat ff_kux_demuxer = {
+    .name           = "kux",
+    .long_name      = NULL_IF_CONFIG_SMALL("KUX (YouKu)"),
+    .priv_data_size = sizeof(FLVContext),
+    .read_probe     = kux_probe,
+    .read_header    = flv_read_header,
+    .read_packet    = flv_read_packet,
+    .read_seek      = flv_read_seek,
+    .read_close     = flv_read_close,
+    .extensions     = "kux",
+    .priv_class     = &kux_class,
+};
diff --git a/libavformat/flvenc.c b/libavformat/flvenc.c
index e4863f1..5cf3ce8 100644
--- a/libavformat/flvenc.c
+++ b/libavformat/flvenc.c
@@ -580,7 +580,7 @@
     int n = 0;
     int64_t metadata_size = 0;
     FLVContext *flv = s->priv_data;
-    int64_t pos, pos_end = avio_tell(s->pb);
+    int64_t pos, pos_end = avio_tell(s->pb); /* Save the pre-shift size. */
     uint8_t *buf, *read_buf[2];
     int read_buf_id = 0;
     int read_size[2];
@@ -608,7 +608,6 @@
 
     avio_seek(s->pb, flv->metadata_totalsize_pos, SEEK_SET);
     avio_wb32(s->pb, flv->metadata_totalsize + 11 + metadata_size);
-    avio_seek(s->pb, pos_end, SEEK_SET);
 
     /* Shift the data: the AVIO context of the output can only be used for
      * writing, so we re-open the same output, but for reading. It also avoids
@@ -621,9 +620,7 @@
         goto end;
     }
 
-    /* mark the end of the shift to up to the last data we wrote, and get ready
-     * for writing */
-    pos_end = avio_tell(s->pb);
+    /* Get ready for writing. */
     avio_seek(s->pb, flv->keyframes_info_offset + metadata_size, SEEK_SET);
 
     /* start reading at where the keyframe index information will be placed */
@@ -653,11 +650,9 @@
     return ret;
 }
 
-
-static int flv_write_header(AVFormatContext *s)
+static int flv_init(struct AVFormatContext *s)
 {
     int i;
-    AVIOContext *pb = s->pb;
     FLVContext *flv = s->priv_data;
 
     for (i = 0; i < s->nb_streams; i++) {
@@ -736,6 +731,15 @@
 
     flv->delay = AV_NOPTS_VALUE;
 
+    return 0;
+}
+
+static int flv_write_header(AVFormatContext *s)
+{
+    int i;
+    AVIOContext *pb = s->pb;
+    FLVContext *flv = s->priv_data;
+
     avio_write(pb, "FLV", 3);
     avio_w8(pb, 1);
     avio_w8(pb, FLV_HEADER_FLAG_HASAUDIO * !!flv->audio_par +
@@ -880,7 +884,7 @@
     unsigned ts;
     int size = pkt->size;
     uint8_t *data = NULL;
-    int flags = -1, flags_size, ret;
+    int flags = -1, flags_size, ret = 0;
     int64_t cur_offset = avio_tell(pb);
 
     if (par->codec_type == AVMEDIA_TYPE_AUDIO && !pkt->size) {
@@ -901,14 +905,10 @@
         int side_size = 0;
         uint8_t *side = av_packet_get_side_data(pkt, AV_PKT_DATA_NEW_EXTRADATA, &side_size);
         if (side && side_size > 0 && (side_size != par->extradata_size || memcmp(side, par->extradata, side_size))) {
-            av_free(par->extradata);
-            par->extradata = av_mallocz(side_size + AV_INPUT_BUFFER_PADDING_SIZE);
-            if (!par->extradata) {
-                par->extradata_size = 0;
-                return AVERROR(ENOMEM);
-            }
+            ret = ff_alloc_extradata(par, side_size);
+            if (ret < 0)
+                return ret;
             memcpy(par->extradata, side, side_size);
-            par->extradata_size = side_size;
             flv_write_codec_header(s, par, pkt->dts);
         }
     }
@@ -921,6 +921,12 @@
                "Packets are not in the proper order with respect to DTS\n");
         return AVERROR(EINVAL);
     }
+    if (par->codec_id == AV_CODEC_ID_H264 || par->codec_id == AV_CODEC_ID_MPEG4) {
+        if (pkt->pts == AV_NOPTS_VALUE) {
+            av_log(s, AV_LOG_ERROR, "Packet is missing PTS\n");
+            return AVERROR(EINVAL);
+        }
+    }
 
     ts = pkt->dts;
 
@@ -963,10 +969,10 @@
     } else if (par->codec_id == AV_CODEC_ID_AAC && pkt->size > 2 &&
                (AV_RB16(pkt->data) & 0xfff0) == 0xfff0) {
         if (!s->streams[pkt->stream_index]->nb_frames) {
-        av_log(s, AV_LOG_ERROR, "Malformed AAC bitstream detected: "
-               "use the audio bitstream filter 'aac_adtstoasc' to fix it "
-               "('-bsf:a aac_adtstoasc' option with ffmpeg)\n");
-        return AVERROR_INVALIDDATA;
+            av_log(s, AV_LOG_ERROR, "Malformed AAC bitstream detected: "
+                   "use the audio bitstream filter 'aac_adtstoasc' to fix it "
+                   "('-bsf:a aac_adtstoasc' option with ffmpeg)\n");
+            return AVERROR_INVALIDDATA;
         }
         av_log(s, AV_LOG_WARNING, "aac bitstream error\n");
     }
@@ -983,7 +989,8 @@
     if (size + flags_size >= 1<<24) {
         av_log(s, AV_LOG_ERROR, "Too large packet with size %u >= %u\n",
                size + flags_size, 1<<24);
-        return AVERROR(EINVAL);
+        ret = AVERROR(EINVAL);
+        goto fail;
     }
 
     avio_wb24(pb, size + flags_size);
@@ -1048,15 +1055,17 @@
             case AVMEDIA_TYPE_VIDEO:
                 flv->videosize += (avio_tell(pb) - cur_offset);
                 flv->lasttimestamp = flv->acurframeindex / flv->framerate;
+                flv->acurframeindex++;
                 if (pkt->flags & AV_PKT_FLAG_KEY) {
-                    double ts = flv->acurframeindex / flv->framerate;
+                    double ts = flv->lasttimestamp;
                     int64_t pos = cur_offset;
 
-                    flv->lastkeyframetimestamp = flv->acurframeindex / flv->framerate;
+                    flv->lastkeyframetimestamp = ts;
                     flv->lastkeyframelocation = pos;
-                    flv_append_keyframe_info(s, flv, ts, pos);
+                    ret = flv_append_keyframe_info(s, flv, ts, pos);
+                    if (ret < 0)
+                        goto fail;
                 }
-                flv->acurframeindex++;
                 break;
 
             case AVMEDIA_TYPE_AUDIO:
@@ -1068,10 +1077,22 @@
                 break;
         }
     }
-
+fail:
     av_free(data);
 
-    return pb->error;
+    return ret;
+}
+
+static int flv_check_bitstream(struct AVFormatContext *s, const AVPacket *pkt)
+{
+    int ret = 1;
+    AVStream *st = s->streams[pkt->stream_index];
+
+    if (st->codecpar->codec_id == AV_CODEC_ID_AAC) {
+        if (pkt->size > 2 && (AV_RB16(pkt->data) & 0xfff0) == 0xfff0)
+            ret = ff_stream_add_bitstream_filter(st, "aac_adtstoasc", NULL);
+    }
+    return ret;
 }
 
 static const AVOption options[] = {
@@ -1099,9 +1120,11 @@
     .priv_data_size = sizeof(FLVContext),
     .audio_codec    = CONFIG_LIBMP3LAME ? AV_CODEC_ID_MP3 : AV_CODEC_ID_ADPCM_SWF,
     .video_codec    = AV_CODEC_ID_FLV1,
+    .init           = flv_init,
     .write_header   = flv_write_header,
     .write_packet   = flv_write_packet,
     .write_trailer  = flv_write_trailer,
+    .check_bitstream= flv_check_bitstream,
     .codec_tag      = (const AVCodecTag* const []) {
                           flv_video_codec_ids, flv_audio_codec_ids, 0
                       },
diff --git a/libavformat/format.c b/libavformat/format.c
index 2c4c895..c47490c 100644
--- a/libavformat/format.c
+++ b/libavformat/format.c
@@ -48,7 +48,7 @@
     return 0;
 }
 
-AVOutputFormat *av_guess_format(const char *short_name, const char *filename,
+ff_const59 AVOutputFormat *av_guess_format(const char *short_name, const char *filename,
                                 const char *mime_type)
 {
     const AVOutputFormat *fmt = NULL;
@@ -84,12 +84,12 @@
     return fmt_found;
 }
 
-enum AVCodecID av_guess_codec(AVOutputFormat *fmt, const char *short_name,
+enum AVCodecID av_guess_codec(ff_const59 AVOutputFormat *fmt, const char *short_name,
                               const char *filename, const char *mime_type,
                               enum AVMediaType type)
 {
     if (av_match_name("segment", fmt->name) || av_match_name("ssegment", fmt->name)) {
-        AVOutputFormat *fmt2 = av_guess_format(NULL, filename, NULL);
+        ff_const59 AVOutputFormat *fmt2 = av_guess_format(NULL, filename, NULL);
         if (fmt2)
             fmt = fmt2;
     }
@@ -115,7 +115,7 @@
         return AV_CODEC_ID_NONE;
 }
 
-AVInputFormat *av_find_input_format(const char *short_name)
+ff_const59 AVInputFormat *av_find_input_format(const char *short_name)
 {
     const AVInputFormat *fmt = NULL;
     void *i = 0;
@@ -125,12 +125,12 @@
     return NULL;
 }
 
-AVInputFormat *av_probe_input_format3(AVProbeData *pd, int is_opened,
+ff_const59 AVInputFormat *av_probe_input_format3(ff_const59 AVProbeData *pd, int is_opened,
                                       int *score_ret)
 {
     AVProbeData lpd = *pd;
     const AVInputFormat *fmt1 = NULL;
-    AVInputFormat *fmt = NULL;
+    ff_const59 AVInputFormat *fmt = NULL;
     int score, score_max = 0;
     void *i = 0;
     const static uint8_t zerobuffer[AVPROBE_PADDING_SIZE];
@@ -202,10 +202,10 @@
     return fmt;
 }
 
-AVInputFormat *av_probe_input_format2(AVProbeData *pd, int is_opened, int *score_max)
+ff_const59 AVInputFormat *av_probe_input_format2(ff_const59 AVProbeData *pd, int is_opened, int *score_max)
 {
     int score_ret;
-    AVInputFormat *fmt = av_probe_input_format3(pd, is_opened, &score_ret);
+    ff_const59 AVInputFormat *fmt = av_probe_input_format3(pd, is_opened, &score_ret);
     if (score_ret > *score_max) {
         *score_max = score_ret;
         return fmt;
@@ -213,13 +213,13 @@
         return NULL;
 }
 
-AVInputFormat *av_probe_input_format(AVProbeData *pd, int is_opened)
+ff_const59 AVInputFormat *av_probe_input_format(ff_const59 AVProbeData *pd, int is_opened)
 {
     int score = 0;
     return av_probe_input_format2(pd, is_opened, &score);
 }
 
-int av_probe_input_buffer2(AVIOContext *pb, AVInputFormat **fmt,
+int av_probe_input_buffer2(AVIOContext *pb, ff_const59 AVInputFormat **fmt,
                           const char *filename, void *logctx,
                           unsigned int offset, unsigned int max_probe_size)
 {
@@ -309,7 +309,7 @@
     return ret < 0 ? ret : score;
 }
 
-int av_probe_input_buffer(AVIOContext *pb, AVInputFormat **fmt,
+int av_probe_input_buffer(AVIOContext *pb, ff_const59 AVInputFormat **fmt,
                           const char *filename, void *logctx,
                           unsigned int offset, unsigned int max_probe_size)
 {
diff --git a/libavformat/framehash.c b/libavformat/framehash.c
index 3ae9092..8d90793 100644
--- a/libavformat/framehash.c
+++ b/libavformat/framehash.c
@@ -45,7 +45,6 @@
             avio_printf(s->pb, "#sar %d: %d/%d\n", i, st->sample_aspect_ratio.num, st->sample_aspect_ratio.den);
             break;
         }
-        avio_flush(s->pb);
     }
     return 0;
 }
diff --git a/libavformat/frmdec.c b/libavformat/frmdec.c
index 2f6b726..9a962f37 100644
--- a/libavformat/frmdec.c
+++ b/libavformat/frmdec.c
@@ -42,7 +42,7 @@
     int count;
 } FrmContext;
 
-static int frm_read_probe(AVProbeData *p)
+static int frm_read_probe(const AVProbeData *p)
 {
     if (p->buf_size > 8 &&
         p->buf[0] == 'F' && p->buf[1] == 'R' && p->buf[2] == 'M' &&
diff --git a/libavformat/fsb.c b/libavformat/fsb.c
index 4f59576..fd3e484 100644
--- a/libavformat/fsb.c
+++ b/libavformat/fsb.c
@@ -25,7 +25,7 @@
 #include "avio.h"
 #include "internal.h"
 
-static int fsb_probe(AVProbeData *p)
+static int fsb_probe(const AVProbeData *p)
 {
     if (memcmp(p->buf, "FSB", 3) || p->buf[3] - '0' < 1 || p->buf[3] - '0' > 5)
         return 0;
@@ -41,6 +41,7 @@
     int64_t offset;
     AVCodecParameters *par;
     AVStream *st = avformat_new_stream(s, NULL);
+    int ret;
 
     avio_skip(pb, 3); // "FSB"
     version = avio_r8(pb) - '0';
@@ -86,9 +87,9 @@
             par->block_align = 8 * par->channels;
             if (par->channels > INT_MAX / 32)
                 return AVERROR_INVALIDDATA;
-            ff_alloc_extradata(par, 32 * par->channels);
-            if (!par->extradata)
-                return AVERROR(ENOMEM);
+            ret = ff_alloc_extradata(par, 32 * par->channels);
+            if (ret < 0)
+                return ret;
             avio_seek(pb, 0x68, SEEK_SET);
             for (c = 0; c < par->channels; c++) {
                 avio_read(pb, par->extradata + 32 * c, 32);
@@ -130,18 +131,18 @@
 
         switch (par->codec_id) {
         case AV_CODEC_ID_XMA2:
-            ff_alloc_extradata(par, 34);
-            if (!par->extradata)
-                return AVERROR(ENOMEM);
+            ret = ff_alloc_extradata(par, 34);
+            if (ret < 0)
+                return ret;
             memset(par->extradata, 0, 34);
             par->block_align = 2048;
             break;
         case AV_CODEC_ID_ADPCM_THP:
             if (par->channels > INT_MAX / 32)
                 return AVERROR_INVALIDDATA;
-            ff_alloc_extradata(par, 32 * par->channels);
-            if (!par->extradata)
-                return AVERROR(ENOMEM);
+            ret = ff_alloc_extradata(par, 32 * par->channels);
+            if (ret < 0)
+                return ret;
             avio_seek(pb, 0x80, SEEK_SET);
             for (c = 0; c < par->channels; c++) {
                 avio_read(pb, par->extradata + 32 * c, 32);
diff --git a/libavformat/ftp.c b/libavformat/ftp.c
index 676f1c6..e3d194d 100644
--- a/libavformat/ftp.c
+++ b/libavformat/ftp.c
@@ -18,12 +18,15 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
+#include <string.h>
+
 #include "libavutil/avstring.h"
 #include "libavutil/internal.h"
 #include "libavutil/parseutils.h"
 #include "avformat.h"
 #include "internal.h"
 #include "url.h"
+#include "urldecode.h"
 #include "libavutil/opt.h"
 #include "libavutil/bprint.h"
 
@@ -36,7 +39,8 @@
     DOWNLOADING,
     UPLOADING,
     LISTING_DIR,
-    DISCONNECTED
+    DISCONNECTED,
+    ENDOFFILE,
 } FTPState;
 
 typedef enum {
@@ -69,6 +73,8 @@
     size_t dir_buffer_size;
     size_t dir_buffer_offset;
     int utf8;
+    const char *option_user;                     /**< User to be used if none given in the URL */
+    const char *option_password;                 /**< Password to be used if none given in the URL */
 } FTPContext;
 
 #define OFFSET(x) offsetof(FTPContext, x)
@@ -78,6 +84,8 @@
     {"timeout", "set timeout of socket I/O operations", OFFSET(rw_timeout), AV_OPT_TYPE_INT, {.i64 = -1}, -1, INT_MAX, D|E },
     {"ftp-write-seekable", "control seekability of connection during encoding", OFFSET(write_seekable), AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, E },
     {"ftp-anonymous-password", "password for anonymous login. E-mail address should be used.", OFFSET(anonymous_password), AV_OPT_TYPE_STRING, { 0 }, 0, 0, D|E },
+    {"ftp-user", "user for FTP login. Overridden by whatever is in the URL.", OFFSET(option_user), AV_OPT_TYPE_STRING, { 0 }, 0, 0, D|E },
+    {"ftp-password", "password for FTP login. Overridden by whatever is in the URL.", OFFSET(option_password), AV_OPT_TYPE_STRING, { 0 }, 0, 0, D|E },
     {NULL}
 };
 
@@ -224,7 +232,6 @@
 static void ftp_close_data_connection(FTPContext *s)
 {
     ffurl_closep(&s->conn_data);
-    s->position = 0;
     s->state = DISCONNECTED;
 }
 
@@ -241,10 +248,14 @@
     static const int user_codes[] = {331, 230, 0};
     static const int pass_codes[] = {230, 0};
 
+    if (strpbrk(s->user, "\r\n"))
+        return AVERROR(EINVAL);
     snprintf(buf, sizeof(buf), "USER %s\r\n", s->user);
     err = ftp_send_command(s, buf, user_codes, NULL);
     if (err == 331) {
         if (s->password) {
+            if (strpbrk(s->password, "\r\n"))
+                return AVERROR(EINVAL);
             snprintf(buf, sizeof(buf), "PASS %s\r\n", s->password);
             err = ftp_send_command(s, buf, pass_codes, NULL);
         } else
@@ -389,7 +400,7 @@
     static const int size_codes[] = {213, 0};
 
     snprintf(command, sizeof(command), "SIZE %s\r\n", s->path);
-    if (ftp_send_command(s, command, size_codes, &res) == 213 && res) {
+    if (ftp_send_command(s, command, size_codes, &res) == 213 && res && strlen(res) > 4) {
         s->filesize = strtoll(&res[4], NULL, 10);
     } else {
         s->filesize = -1;
@@ -513,7 +524,7 @@
     static const char *feat_command        = "FEAT\r\n";
     static const char *enable_utf8_command = "OPTS UTF8 ON\r\n";
     static const int feat_codes[] = {211, 0};
-    static const int opts_codes[] = {200, 451, 0};
+    static const int opts_codes[] = {200, 202, 451, 0};
 
     av_freep(&s->features);
     if (ftp_send_command(s, feat_command, feat_codes, &s->features) != 211) {
@@ -521,7 +532,8 @@
     }
 
     if (ftp_has_feature(s, "UTF8")) {
-        if (ftp_send_command(s, enable_utf8_command, opts_codes, NULL) == 200)
+        int ret = ftp_send_command(s, enable_utf8_command, opts_codes, NULL);
+        if (ret == 200 || ret == 202)
             s->utf8 = 1;
     }
 
@@ -651,9 +663,9 @@
 
 static int ftp_connect(URLContext *h, const char *url)
 {
-    char proto[10], path[MAX_URL_SIZE], credencials[MAX_URL_SIZE], hostname[MAX_URL_SIZE];
+    char proto[10], path[MAX_URL_SIZE], credentials[MAX_URL_SIZE], hostname[MAX_URL_SIZE];
     const char *tok_user = NULL, *tok_pass = NULL;
-    char *end = NULL, *newpath = NULL;
+    char *newpath = NULL;
     int err;
     FTPContext *s = h->priv_data;
 
@@ -664,20 +676,34 @@
     s->features = NULL;
 
     av_url_split(proto, sizeof(proto),
-                 credencials, sizeof(credencials),
+                 credentials, sizeof(credentials),
                  hostname, sizeof(hostname),
                  &s->server_control_port,
                  path, sizeof(path),
                  url);
 
-    tok_user = av_strtok(credencials, ":", &end);
-    tok_pass = av_strtok(end, ":", &end);
-    if (!tok_user) {
-        tok_user = "anonymous";
-        tok_pass = av_x_if_null(s->anonymous_password, "nopassword");
+    if (!*credentials) {
+        if (!s->option_user) {
+            tok_user = "anonymous";
+            tok_pass = av_x_if_null(s->anonymous_password, "nopassword");
+        } else {
+            tok_user = s->option_user;
+            tok_pass = s->option_password;
+        }
+        s->user = av_strdup(tok_user);
+        s->password = av_strdup(tok_pass);
+    } else {
+        char *pass = strchr(credentials, ':');
+        if (pass) {
+            *pass++ = '\0';
+            tok_pass = pass;
+            s->password = ff_urldecode(pass, 0);
+        } else {
+            tok_pass = s->option_password;
+            s->password = av_strdup(tok_pass);
+        }
+        s->user = ff_urldecode(credentials, 0);
     }
-    s->user = av_strdup(tok_user);
-    s->password = av_strdup(tok_pass);
     s->hostname = av_strdup(hostname);
     if (!s->hostname || !s->user || (tok_pass && !s->password)) {
         return AVERROR(ENOMEM);
@@ -714,8 +740,7 @@
     if (ftp_restart(s, 0) < 0) {
         h->is_streamed = 1;
     } else {
-        if (ftp_file_size(s) < 0 && flags & AVIO_FLAG_READ)
-            h->is_streamed = 1;
+        ftp_file_size(s);
         if (s->write_seekable != 1 && flags & AVIO_FLAG_WRITE)
             h->is_streamed = 1;
     }
@@ -732,7 +757,7 @@
 {
     FTPContext *s = h->priv_data;
     int err;
-    int64_t new_pos, fake_pos;
+    int64_t new_pos;
 
     ff_dlog(h, "ftp protocol seek %"PRId64" %d\n", pos, whence);
 
@@ -762,11 +787,10 @@
         return AVERROR(EINVAL);
     }
 
-    fake_pos = s->filesize != -1 ? FFMIN(new_pos, s->filesize) : new_pos;
-    if (fake_pos != s->position) {
+    if (new_pos != s->position) {
         if ((err = ftp_abort(h)) < 0)
             return err;
-        s->position = fake_pos;
+        s->position = new_pos;
     }
     return new_pos;
 }
@@ -778,16 +802,13 @@
 
     ff_dlog(h, "ftp protocol read %d bytes\n", size);
   retry:
+    if (s->state == ENDOFFILE)
+        return AVERROR_EOF;
     if (s->state == DISCONNECTED) {
-        /* optimization */
-        if (s->position >= s->filesize)
-            return 0;
         if ((err = ftp_connect_data_connection(h)) < 0)
             return err;
     }
     if (s->state == READY) {
-        if (s->position >= s->filesize)
-            return 0;
         if ((err = ftp_retrieve(s)) < 0)
             return err;
     }
@@ -795,27 +816,28 @@
         read = ffurl_read(s->conn_data, buf, size);
         if (read >= 0) {
             s->position += read;
-            if (s->position >= s->filesize) {
-                /* server will terminate, but keep current position to avoid madness */
-                /* save position to restart from it */
-                int64_t pos = s->position;
-                if (ftp_abort(h) < 0) {
-                    s->position = pos;
-                    return AVERROR(EIO);
-                }
-                s->position = pos;
-            }
+            s->filesize = FFMAX(s->filesize, s->position);
         }
-        if (read <= 0 && s->position < s->filesize && !h->is_streamed) {
+        if (read == AVERROR_EOF) {
+           static const int retr_codes[] = {226, 250, 425, 426, 451, 0};
+           char *response = NULL;
+           err = ftp_status(s, &response, retr_codes);
+           if (err == 226) {
+               ftp_close_data_connection(s);
+               av_freep(&response);
+               s->state = ENDOFFILE;
+               return AVERROR_EOF;
+           }
+           /* 250 is not allowed, any other status means some kind of error */
+           av_log(h, AV_LOG_ERROR, "FTP transfer failed: %s\n", response ? response : (err < 0 ? av_err2str(err) : "?"));
+           av_freep(&response);
+           read = AVERROR(EIO);
+        }
+        if (read <= 0 && !h->is_streamed) {
             /* Server closed connection. Probably due to inactivity */
-            int64_t pos = s->position;
             av_log(h, AV_LOG_INFO, "Reconnect to FTP server.\n");
             if ((err = ftp_abort(h)) < 0)
                 return err;
-            if ((err = ftp_seek(h, pos, SEEK_SET)) < 0) {
-                av_log(h, AV_LOG_ERROR, "Position cannot be restored.\n");
-                return err;
-            }
             if (!retry_done) {
                 retry_done = 1;
                 goto retry;
diff --git a/libavformat/fwse.c b/libavformat/fwse.c
new file mode 100644
index 0000000..00e2e13
--- /dev/null
+++ b/libavformat/fwse.c
@@ -0,0 +1,88 @@
+/*
+ * FWSE demuxer
+ * Copyright (c) 2020 Paul B Mahol
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "libavutil/intreadwrite.h"
+#include "avformat.h"
+#include "internal.h"
+#include "pcm.h"
+
+static int fwse_probe(const AVProbeData *p)
+{
+    if (AV_RL32(p->buf) != MKTAG('F','W','S','E'))
+        return 0;
+    if (AV_RL32(p->buf+4) != 2 && AV_RL32(p->buf+4) != 3)
+        return 0;
+    if (AV_RL32(p->buf+16) != 1 && AV_RL32(p->buf+16) != 2)
+        return 0;
+
+    return AVPROBE_SCORE_MAX / 4 * 3;
+}
+
+static int fwse_read_header(AVFormatContext *s)
+{
+    unsigned start_offset, version;
+    AVIOContext *pb = s->pb;
+    AVCodecParameters *par;
+    AVStream *st;
+
+    avio_skip(pb, 4);
+    version = avio_rl32(pb);
+    if (version != 2 && version != 3)
+        return AVERROR_INVALIDDATA;
+    avio_skip(pb, 4);
+    start_offset = avio_rl32(pb);
+
+    st = avformat_new_stream(s, NULL);
+    if (!st)
+        return AVERROR(ENOMEM);
+
+    par              = st->codecpar;
+    par->codec_type  = AVMEDIA_TYPE_AUDIO;
+    par->codec_id    = AV_CODEC_ID_ADPCM_IMA_MTF;
+    par->format      = AV_SAMPLE_FMT_S16;
+    par->channels    = avio_rl32(pb);
+    if (par->channels != 1 && par->channels != 2)
+        return AVERROR_INVALIDDATA;
+    if (par->channels == 1)
+        par->channel_layout = AV_CH_LAYOUT_MONO;
+    else if (par->channels == 2)
+        par->channel_layout = AV_CH_LAYOUT_STEREO;
+    st->duration = avio_rl32(pb);
+    par->sample_rate = avio_rl32(pb);
+    if (par->sample_rate <= 0 || par->sample_rate > INT_MAX)
+        return AVERROR_INVALIDDATA;
+
+    par->block_align = 1;
+    avio_skip(pb, start_offset - avio_tell(pb));
+
+    avpriv_set_pts_info(st, 64, 1, par->sample_rate);
+
+    return 0;
+}
+
+AVInputFormat ff_fwse_demuxer = {
+    .name           = "fwse",
+    .long_name      = NULL_IF_CONFIG_SMALL("Capcom's MT Framework sound"),
+    .read_probe     = fwse_probe,
+    .read_header    = fwse_read_header,
+    .read_packet    = ff_pcm_read_packet,
+    .extensions     = "fwse",
+};
diff --git a/libavformat/g722.c b/libavformat/g722.c
index 2feec01..fe8c4ae 100644
--- a/libavformat/g722.c
+++ b/libavformat/g722.c
@@ -46,6 +46,7 @@
     return 0;
 }
 
+FF_RAW_DEMUXER_CLASS(g722)
 AVInputFormat ff_g722_demuxer = {
     .name           = "g722",
     .long_name      = NULL_IF_CONFIG_SMALL("raw G.722"),
@@ -54,4 +55,5 @@
     .flags          = AVFMT_GENERIC_INDEX,
     .extensions     = "g722,722",
     .raw_codec_id   = AV_CODEC_ID_ADPCM_G722,
-};
+    .priv_data_size = sizeof(FFRawDemuxerContext),
+    .priv_class     = &g722_demuxer_class,};
diff --git a/libavformat/g723_1.c b/libavformat/g723_1.c
index 27c8c39..3af4809 100644
--- a/libavformat/g723_1.c
+++ b/libavformat/g723_1.c
@@ -69,7 +69,6 @@
 
     ret = avio_read(s->pb, pkt->data + 1, size - 1);
     if (ret < size - 1) {
-        av_packet_unref(pkt);
         return ret < 0 ? ret : AVERROR_EOF;
     }
 
diff --git a/libavformat/g729dec.c b/libavformat/g729dec.c
index 7b67fc4..c58855c 100644
--- a/libavformat/g729dec.c
+++ b/libavformat/g729dec.c
@@ -61,8 +61,7 @@
         return AVERROR(EINVAL);
     }
 
-    avpriv_set_pts_info(st, st->codecpar->block_align << 3, 1,
-                        st->codecpar->sample_rate);
+    avpriv_set_pts_info(st, 64, 80, st->codecpar->sample_rate);
 
     return 0;
 }
@@ -76,6 +75,7 @@
 
     pkt->stream_index = 0;
     pkt->dts = pkt->pts = pkt->pos / st->codecpar->block_align;
+    pkt->duration = 1;
 
     return 0;
 }
diff --git a/libavformat/gdv.c b/libavformat/gdv.c
index a69c349..2ecbb53 100644
--- a/libavformat/gdv.c
+++ b/libavformat/gdv.c
@@ -34,7 +34,7 @@
     unsigned pal[256];
 } GDVContext;
 
-static int gdv_read_probe(AVProbeData *p)
+static int gdv_read_probe(const AVProbeData *p)
 {
     if (AV_RL32(p->buf) == 0x29111994)
         return AVPROBE_SCORE_MAX;
@@ -86,6 +86,9 @@
     vst->nb_frames         = avio_rl16(pb);
 
     fps = avio_rl16(pb);
+    if (!fps)
+        return AVERROR_INVALIDDATA;
+
     snd_flags = avio_rl16(pb);
     if (snd_flags & 1) {
         ast = avformat_new_stream(ctx, 0);
@@ -179,7 +182,6 @@
             pal = av_packet_new_side_data(pkt, AV_PKT_DATA_PALETTE,
                                           AVPALETTE_SIZE);
             if (!pal) {
-                av_packet_unref(pkt);
                 return AVERROR(ENOMEM);
             }
             memcpy(pal, gdv->pal, AVPALETTE_SIZE);
diff --git a/libavformat/genh.c b/libavformat/genh.c
index dd4e76d..61adf49 100644
--- a/libavformat/genh.c
+++ b/libavformat/genh.c
@@ -29,7 +29,7 @@
     unsigned interleave_size;
 } GENHDemuxContext;
 
-static int genh_probe(AVProbeData *p)
+static int genh_probe(const AVProbeData *p)
 {
     if (AV_RL32(p->buf) != MKTAG('G','E','N','H'))
         return 0;
diff --git a/libavformat/gif.c b/libavformat/gif.c
index 01d98a2..e125d38 100644
--- a/libavformat/gif.c
+++ b/libavformat/gif.c
@@ -27,94 +27,21 @@
 #include "libavutil/imgutils.h"
 #include "libavutil/log.h"
 #include "libavutil/opt.h"
-
-/* XXX: random value that shouldn't be taken into effect if there is no
- * transparent color in the palette (the transparency bit will be set to 0) */
-#define DEFAULT_TRANSPARENCY_INDEX 0x1f
-
-static int get_palette_transparency_index(const uint32_t *palette)
-{
-    int transparent_color_index = -1;
-    unsigned i, smallest_alpha = 0xff;
-
-    if (!palette)
-        return -1;
-
-    for (i = 0; i < AVPALETTE_COUNT; i++) {
-        const uint32_t v = palette[i];
-        if (v >> 24 < smallest_alpha) {
-            smallest_alpha = v >> 24;
-            transparent_color_index = i;
-        }
-    }
-    return smallest_alpha < 128 ? transparent_color_index : -1;
-}
-
-static int gif_image_write_header(AVIOContext *pb, AVStream *st,
-                                  int loop_count, uint32_t *palette)
-{
-    int i;
-    int64_t aspect = 0;
-    const AVRational sar = st->sample_aspect_ratio;
-
-    if (sar.num > 0 && sar.den > 0) {
-        aspect = sar.num * 64LL / sar.den - 15;
-        if (aspect < 0 || aspect > 255)
-            aspect = 0;
-    }
-
-    avio_write(pb, "GIF", 3);
-    avio_write(pb, "89a", 3);
-    avio_wl16(pb, st->codecpar->width);
-    avio_wl16(pb, st->codecpar->height);
-
-    if (palette) {
-        const int bcid = get_palette_transparency_index(palette);
-
-        avio_w8(pb, 0xf7); /* flags: global clut, 256 entries */
-        avio_w8(pb, bcid < 0 ? DEFAULT_TRANSPARENCY_INDEX : bcid); /* background color index */
-        avio_w8(pb, aspect);
-        for (i = 0; i < 256; i++) {
-            const uint32_t v = palette[i] & 0xffffff;
-            avio_wb24(pb, v);
-        }
-    } else {
-        avio_w8(pb, 0); /* flags */
-        avio_w8(pb, 0); /* background color index */
-        avio_w8(pb, aspect);
-    }
-
-
-    if (loop_count >= 0 ) {
-        /* "NETSCAPE EXTENSION" for looped animation GIF */
-        avio_w8(pb, 0x21); /* GIF Extension code */
-        avio_w8(pb, 0xff); /* Application Extension Label */
-        avio_w8(pb, 0x0b); /* Length of Application Block */
-        avio_write(pb, "NETSCAPE2.0", sizeof("NETSCAPE2.0") - 1);
-        avio_w8(pb, 0x03); /* Length of Data Sub-Block */
-        avio_w8(pb, 0x01);
-        avio_wl16(pb, (uint16_t)loop_count);
-        avio_w8(pb, 0x00); /* Data Sub-block Terminator */
-    }
-
-    avio_flush(pb);
-    return 0;
-}
+#include "libavcodec/bytestream.h"
+#include "libavcodec/gif.h"
 
 typedef struct GIFContext {
     AVClass *class;
     int loop;
     int last_delay;
-    AVPacket *prev_pkt;
     int duration;
+    int64_t last_pos;
+    int have_end;
+    AVPacket *prev_pkt;
 } GIFContext;
 
 static int gif_write_header(AVFormatContext *s)
 {
-    GIFContext *gif = s->priv_data;
-    AVCodecParameters *video_par;
-    uint32_t palette[AVPALETTE_COUNT];
-
     if (s->nb_streams != 1 ||
         s->streams[0]->codecpar->codec_type != AVMEDIA_TYPE_VIDEO ||
         s->streams[0]->codecpar->codec_id   != AV_CODEC_ID_GIF) {
@@ -123,92 +50,123 @@
         return AVERROR(EINVAL);
     }
 
-    video_par = s->streams[0]->codecpar;
-
     avpriv_set_pts_info(s->streams[0], 64, 1, 100);
-    if (avpriv_set_systematic_pal2(palette, video_par->format) < 0) {
-        av_assert0(video_par->format == AV_PIX_FMT_PAL8);
-        /* delay header writing: we wait for the first palette to put it
-         * globally */
-    } else {
-        gif_image_write_header(s->pb, s->streams[0], gif->loop, palette);
+
+    return 0;
+}
+
+static int gif_parse_packet(AVFormatContext *s, uint8_t *data, int size)
+{
+    GetByteContext gb;
+    int x;
+
+    bytestream2_init(&gb, data, size);
+
+    while (bytestream2_get_bytes_left(&gb) > 0) {
+        x = bytestream2_get_byte(&gb);
+        if (x != GIF_EXTENSION_INTRODUCER)
+            return 0;
+
+        x = bytestream2_get_byte(&gb);
+        while (x != GIF_GCE_EXT_LABEL && bytestream2_get_bytes_left(&gb) > 0) {
+            int block_size = bytestream2_get_byte(&gb);
+            if (!block_size)
+                break;
+            bytestream2_skip(&gb, block_size);
+        }
+
+        if (x == GIF_GCE_EXT_LABEL)
+            return bytestream2_tell(&gb) + 2;
     }
 
     return 0;
 }
 
-static int flush_packet(AVFormatContext *s, AVPacket *new)
+static int gif_get_delay(GIFContext *gif, AVPacket *prev, AVPacket *new)
 {
-    GIFContext *gif = s->priv_data;
-    int size, bcid;
-    AVIOContext *pb = s->pb;
-    const uint32_t *palette;
-    AVPacket *pkt = gif->prev_pkt;
-
-    if (!pkt)
-        return 0;
-
-    /* Mark one colour as transparent if the input palette contains at least
-     * one colour that is more than 50% transparent. */
-    palette = (uint32_t*)av_packet_get_side_data(pkt, AV_PKT_DATA_PALETTE, &size);
-    if (palette && size != AVPALETTE_SIZE) {
-        av_log(s, AV_LOG_ERROR, "Invalid palette extradata\n");
-        return AVERROR_INVALIDDATA;
-    }
-    bcid = get_palette_transparency_index(palette);
-
     if (new && new->pts != AV_NOPTS_VALUE)
-        gif->duration = av_clip_uint16(new->pts - gif->prev_pkt->pts);
+        gif->duration = av_clip_uint16(new->pts - prev->pts);
     else if (!new && gif->last_delay >= 0)
         gif->duration = gif->last_delay;
 
-    /* graphic control extension block */
-    avio_w8(pb, 0x21);
-    avio_w8(pb, 0xf9);
-    avio_w8(pb, 0x04); /* block size */
-    avio_w8(pb, 1<<2 | (bcid >= 0));
-    avio_wl16(pb, gif->duration);
-    avio_w8(pb, bcid < 0 ? DEFAULT_TRANSPARENCY_INDEX : bcid);
-    avio_w8(pb, 0x00);
-
-    avio_write(pb, pkt->data, pkt->size);
-
-    av_packet_unref(gif->prev_pkt);
-    if (new)
-        av_packet_ref(gif->prev_pkt, new);
-
-    return 0;
+    return gif->duration;
 }
 
-static int gif_write_packet(AVFormatContext *s, AVPacket *pkt)
+static int gif_write_packet(AVFormatContext *s, AVPacket *new_pkt)
 {
     GIFContext *gif = s->priv_data;
-    AVStream *video_st = s->streams[0];
+    AVIOContext *pb = s->pb;
+    AVPacket *pkt = gif->prev_pkt;
 
     if (!gif->prev_pkt) {
         gif->prev_pkt = av_packet_alloc();
         if (!gif->prev_pkt)
             return AVERROR(ENOMEM);
+        return av_packet_ref(gif->prev_pkt, new_pkt);
+    }
 
-        /* Write the first palette as global palette */
-        if (video_st->codecpar->format == AV_PIX_FMT_PAL8) {
-            int size;
-            void *palette = av_packet_get_side_data(pkt, AV_PKT_DATA_PALETTE, &size);
+    gif->last_pos = avio_tell(pb);
+    if (pkt->size > 0)
+        gif->have_end = pkt->data[pkt->size - 1] == GIF_TRAILER;
 
-            if (!palette) {
-                av_log(s, AV_LOG_ERROR, "PAL8 packet is missing palette in extradata\n");
-                return AVERROR_INVALIDDATA;
-            }
-            if (size != AVPALETTE_SIZE) {
-                av_log(s, AV_LOG_ERROR, "Invalid palette extradata\n");
-                return AVERROR_INVALIDDATA;
-            }
-            gif_image_write_header(s->pb, video_st, gif->loop, palette);
+    if (!gif->last_pos) {
+        int delay_pos;
+        int off = 13;
+
+        if (pkt->size < 13)
+            return AVERROR(EINVAL);
+
+        if (pkt->data[10] & 0x80)
+            off += 3 * (1 << ((pkt->data[10] & 0x07) + 1));
+
+        if (pkt->size < off + 2)
+            return AVERROR(EINVAL);
+
+        avio_write(pb, pkt->data, off);
+
+        if (pkt->data[off] == GIF_EXTENSION_INTRODUCER && pkt->data[off + 1] == 0xff)
+            off += 19;
+
+        if (pkt->size <= off)
+            return AVERROR(EINVAL);
+
+        /* "NETSCAPE EXTENSION" for looped animation GIF */
+        if (gif->loop >= 0) {
+            avio_w8(pb, GIF_EXTENSION_INTRODUCER); /* GIF Extension code */
+            avio_w8(pb, GIF_APP_EXT_LABEL); /* Application Extension Label */
+            avio_w8(pb, 0x0b); /* Length of Application Block */
+            avio_write(pb, "NETSCAPE2.0", sizeof("NETSCAPE2.0") - 1);
+            avio_w8(pb, 0x03); /* Length of Data Sub-Block */
+            avio_w8(pb, 0x01);
+            avio_wl16(pb, (uint16_t)gif->loop);
+            avio_w8(pb, 0x00); /* Data Sub-block Terminator */
         }
 
-        return av_packet_ref(gif->prev_pkt, pkt);
+        delay_pos = gif_parse_packet(s, pkt->data + off, pkt->size - off);
+        if (delay_pos > 0 && delay_pos < pkt->size - off - 2) {
+            avio_write(pb, pkt->data + off, delay_pos);
+            avio_wl16(pb, gif_get_delay(gif, pkt, new_pkt));
+            avio_write(pb, pkt->data + off + delay_pos + 2, pkt->size - off - delay_pos - 2);
+        } else {
+            avio_write(pb, pkt->data + off, pkt->size - off);
+        }
+    } else {
+        int delay_pos = gif_parse_packet(s, pkt->data, pkt->size);
+
+        if (delay_pos > 0 && delay_pos < pkt->size - 2) {
+            avio_write(pb, pkt->data, delay_pos);
+            avio_wl16(pb, gif_get_delay(gif, pkt, new_pkt));
+            avio_write(pb, pkt->data + delay_pos + 2, pkt->size - delay_pos - 2);
+        } else {
+            avio_write(pb, pkt->data, pkt->size);
+        }
     }
-    return flush_packet(s, pkt);
+
+    av_packet_unref(gif->prev_pkt);
+    if (new_pkt)
+        return av_packet_ref(gif->prev_pkt, new_pkt);
+
+    return 0;
 }
 
 static int gif_write_trailer(AVFormatContext *s)
@@ -216,9 +174,14 @@
     GIFContext *gif = s->priv_data;
     AVIOContext *pb = s->pb;
 
-    flush_packet(s, NULL);
-    av_freep(&gif->prev_pkt);
-    avio_w8(pb, 0x3b);
+    if (!gif->prev_pkt)
+        return AVERROR(EINVAL);
+
+    gif_write_packet(s, NULL);
+
+    if (!gif->have_end)
+        avio_w8(pb, GIF_TRAILER);
+    av_packet_free(&gif->prev_pkt);
 
     return 0;
 }
@@ -242,7 +205,7 @@
 
 AVOutputFormat ff_gif_muxer = {
     .name           = "gif",
-    .long_name      = NULL_IF_CONFIG_SMALL("GIF Animation"),
+    .long_name      = NULL_IF_CONFIG_SMALL("CompuServe Graphics Interchange Format (GIF)"),
     .mime_type      = "image/gif",
     .extensions     = "gif",
     .priv_data_size = sizeof(GIFContext),
diff --git a/libavformat/gifdec.c b/libavformat/gifdec.c
index 8993ca6..a31644c 100644
--- a/libavformat/gifdec.c
+++ b/libavformat/gifdec.c
@@ -25,6 +25,7 @@
  */
 
 #include "avformat.h"
+#include "libavutil/bprint.h"
 #include "libavutil/intreadwrite.h"
 #include "libavutil/opt.h"
 #include "internal.h"
@@ -68,7 +69,7 @@
  */
 #define GIF_MIN_DELAY       2
 
-static int gif_probe(AVProbeData *p)
+static int gif_probe(const AVProbeData *p)
 {
     /* check magick */
     if (memcmp(p->buf, gif87a_sig, 6) && memcmp(p->buf, gif89a_sig, 6))
@@ -94,42 +95,6 @@
     return 0;
 }
 
-static int gif_read_header(AVFormatContext *s)
-{
-    GIFDemuxContext *gdc = s->priv_data;
-    AVIOContext     *pb  = s->pb;
-    AVStream        *st;
-    int width, height, ret;
-
-    if ((ret = resync(pb)) < 0)
-        return ret;
-
-    gdc->delay  = gdc->default_delay;
-    width  = avio_rl16(pb);
-    height = avio_rl16(pb);
-
-    if (width == 0 || height == 0)
-        return AVERROR_INVALIDDATA;
-
-    st = avformat_new_stream(s, NULL);
-    if (!st)
-        return AVERROR(ENOMEM);
-
-    /* GIF format operates with time in "hundredths of second",
-     * therefore timebase is 1/100 */
-    avpriv_set_pts_info(st, 64, 1, 100);
-    st->codecpar->codec_type = AVMEDIA_TYPE_VIDEO;
-    st->codecpar->codec_id   = AV_CODEC_ID_GIF;
-    st->codecpar->width      = width;
-    st->codecpar->height     = height;
-
-    /* jump to start because gif decoder needs header data too */
-    if (avio_seek(pb, 0, SEEK_SET) != 0)
-        return AVERROR(EIO);
-
-    return 0;
-}
-
 static int gif_skip_subblocks(AVIOContext *pb)
 {
     int sb_size, ret = 0;
@@ -142,6 +107,104 @@
     return ret;
 }
 
+static int gif_read_header(AVFormatContext *s)
+{
+    GIFDemuxContext *gdc = s->priv_data;
+    AVIOContext     *pb  = s->pb;
+    AVStream        *st;
+    int type, width, height, ret, n, flags;
+    int64_t nb_frames = 0, duration = 0;
+
+    if ((ret = resync(pb)) < 0)
+        return ret;
+
+    gdc->delay  = gdc->default_delay;
+    width  = avio_rl16(pb);
+    height = avio_rl16(pb);
+    flags = avio_r8(pb);
+    avio_skip(pb, 1);
+    n      = avio_r8(pb);
+
+    if (width == 0 || height == 0)
+        return AVERROR_INVALIDDATA;
+
+    st = avformat_new_stream(s, NULL);
+    if (!st)
+        return AVERROR(ENOMEM);
+
+    if (flags & 0x80)
+        avio_skip(pb, 3 * (1 << ((flags & 0x07) + 1)));
+
+    while ((type = avio_r8(pb)) != GIF_TRAILER) {
+        if (avio_feof(pb))
+            break;
+        if (type == GIF_EXTENSION_INTRODUCER) {
+            int subtype = avio_r8(pb);
+            if (subtype == GIF_COM_EXT_LABEL) {
+                AVBPrint bp;
+                int block_size;
+
+                av_bprint_init(&bp, 0, -1);
+                while ((block_size = avio_r8(pb)) != 0) {
+                    avio_read_to_bprint(pb, &bp, block_size);
+                }
+                av_dict_set(&s->metadata, "comment", bp.str, 0);
+                av_bprint_finalize(&bp, NULL);
+            } else if (subtype == GIF_GCE_EXT_LABEL) {
+                int block_size = avio_r8(pb);
+
+                if (block_size == 4) {
+                    int delay;
+
+                    avio_skip(pb, 1);
+                    delay = avio_rl16(pb);
+                    if (delay < gdc->min_delay)
+                        delay = gdc->default_delay;
+                    delay = FFMIN(delay, gdc->max_delay);
+                    duration += delay;
+                    avio_skip(pb, 1);
+                } else {
+                    avio_skip(pb, block_size);
+                }
+                gif_skip_subblocks(pb);
+            } else {
+                gif_skip_subblocks(pb);
+            }
+        } else if (type == GIF_IMAGE_SEPARATOR) {
+            avio_skip(pb, 8);
+            flags = avio_r8(pb);
+            if (flags & 0x80)
+                avio_skip(pb, 3 * (1 << ((flags & 0x07) + 1)));
+            avio_skip(pb, 1);
+            gif_skip_subblocks(pb);
+            nb_frames++;
+        } else {
+            break;
+        }
+    }
+
+    /* GIF format operates with time in "hundredths of second",
+     * therefore timebase is 1/100 */
+    avpriv_set_pts_info(st, 64, 1, 100);
+    st->codecpar->codec_type = AVMEDIA_TYPE_VIDEO;
+    st->codecpar->codec_id   = AV_CODEC_ID_GIF;
+    st->codecpar->width      = width;
+    st->codecpar->height     = height;
+    st->start_time           = 0;
+    st->duration             = duration;
+    st->nb_frames            = nb_frames;
+    if (n) {
+        st->codecpar->sample_aspect_ratio.num = n + 15;
+        st->codecpar->sample_aspect_ratio.den = 64;
+    }
+
+    /* jump to start because gif decoder needs header data too */
+    if (avio_seek(pb, 0, SEEK_SET) != 0)
+        return AVERROR(EIO);
+
+    return 0;
+}
+
 static int gif_read_ext(AVFormatContext *s)
 {
     GIFDemuxContext *gdc = s->priv_data;
diff --git a/libavformat/gsmdec.c b/libavformat/gsmdec.c
index 1627106..ec6b2e9 100644
--- a/libavformat/gsmdec.c
+++ b/libavformat/gsmdec.c
@@ -34,7 +34,7 @@
     int sample_rate;
 } GSMDemuxerContext;
 
-static int gsm_probe(AVProbeData *p)
+static int gsm_probe(const AVProbeData *p)
 {
     int valid = 0, invalid = 0;
     uint8_t *b = p->buf;
@@ -62,7 +62,6 @@
 
     ret = av_get_packet(s->pb, pkt, size);
     if (ret < GSM_BLOCK_SIZE) {
-        av_packet_unref(pkt);
         return ret < 0 ? ret : AVERROR(EIO);
     }
     pkt->duration = 1;
diff --git a/libavformat/gxf.c b/libavformat/gxf.c
index 399f745..49364b7 100644
--- a/libavformat/gxf.c
+++ b/libavformat/gxf.c
@@ -86,7 +86,7 @@
 /**
  * @brief check if file starts with a PKT_MAP header
  */
-static int gxf_probe(AVProbeData *p) {
+static int gxf_probe(const AVProbeData *p) {
     static const uint8_t startcode[] = {0, 0, 0, 0, 1, 0xbc}; // start with map packet
     static const uint8_t endcode[] = {0, 0, 0, 0, 0xe1, 0xe2};
     if (!memcmp(p->buf, startcode, sizeof(startcode)) &&
diff --git a/libavformat/gxfenc.c b/libavformat/gxfenc.c
index 3507c00..e7536a6 100644
--- a/libavformat/gxfenc.c
+++ b/libavformat/gxfenc.c
@@ -663,7 +663,7 @@
     return updatePacketSize(pb, pos);
 }
 
-static const int GXF_samples_per_frame[] = { 32768, 0 };
+static const int GXF_samples_per_frame = 32768;
 
 static void gxf_init_timecode_track(GXFStreamContext *sc, GXFStreamContext *vsc)
 {
@@ -834,7 +834,6 @@
 
     gxf->packet_count = 3;
 
-    avio_flush(pb);
     return 0;
 }
 
@@ -854,8 +853,6 @@
     int i;
     int ret;
 
-    ff_audio_interleave_close(s);
-
     gxf_write_eos_packet(pb);
     end = avio_tell(pb);
     avio_seek(pb, 0, SEEK_SET);
@@ -864,21 +861,26 @@
         return ret;
     gxf_write_flt_packet(s);
     gxf_write_umf_packet(s);
-    avio_flush(pb);
     /* update duration in all map packets */
     for (i = 1; i < gxf->map_offsets_nb; i++) {
         avio_seek(pb, gxf->map_offsets[i], SEEK_SET);
         if ((ret = gxf_write_map_packet(s, 1)) < 0)
             return ret;
-        avio_flush(pb);
     }
 
     avio_seek(pb, end, SEEK_SET);
 
+    return 0;
+}
+
+static void gxf_deinit(AVFormatContext *s)
+{
+    GXFContext *gxf = s->priv_data;
+
+    ff_audio_interleave_close(s);
+
     av_freep(&gxf->flt_entries);
     av_freep(&gxf->map_offsets);
-
-    return 0;
 }
 
 static int gxf_parse_mpeg_frame(GXFStreamContext *sc, const uint8_t *buf, int size)
@@ -987,10 +989,11 @@
     return 0;
 }
 
-static int gxf_compare_field_nb(AVFormatContext *s, AVPacket *next, AVPacket *cur)
+static int gxf_compare_field_nb(AVFormatContext *s, const AVPacket *next,
+                                                    const AVPacket *cur)
 {
     GXFContext *gxf = s->priv_data;
-    AVPacket *pkt[2] = { cur, next };
+    const AVPacket *pkt[2] = { cur, next };
     int i, field_nb[2];
     GXFStreamContext *sc[2];
 
@@ -1027,5 +1030,6 @@
     .write_header      = gxf_write_header,
     .write_packet      = gxf_write_packet,
     .write_trailer     = gxf_write_trailer,
+    .deinit            = gxf_deinit,
     .interleave_packet = gxf_interleave_packet,
 };
diff --git a/libavformat/h261dec.c b/libavformat/h261dec.c
index a1d6821..b5161ff 100644
--- a/libavformat/h261dec.c
+++ b/libavformat/h261dec.c
@@ -23,7 +23,7 @@
 #include "avformat.h"
 #include "rawdec.h"
 
-static int h261_probe(AVProbeData *p)
+static int h261_probe(const AVProbeData *p)
 {
     int i;
     int valid_psc=0;
diff --git a/libavformat/h263dec.c b/libavformat/h263dec.c
index 145fb85..0736158 100644
--- a/libavformat/h263dec.c
+++ b/libavformat/h263dec.c
@@ -22,7 +22,7 @@
 #include "avformat.h"
 #include "rawdec.h"
 
-static int h263_probe(AVProbeData *p)
+static int h263_probe(const AVProbeData *p)
 {
     uint64_t code= -1;
     int i;
diff --git a/libavformat/h264dec.c b/libavformat/h264dec.c
index 85d7163..199e87f 100644
--- a/libavformat/h264dec.c
+++ b/libavformat/h264dec.c
@@ -28,7 +28,7 @@
 #define MAX_SPS_COUNT          32
 #define MAX_PPS_COUNT         256
 
-static int h264_probe(AVProbeData *p)
+static int h264_probe(const AVProbeData *p)
 {
     uint32_t code = -1;
     int sps = 0, pps = 0, idr = 0, res = 0, sli = 0;
diff --git a/libavformat/hashenc.c b/libavformat/hashenc.c
index a66db4a..ce609f6 100644
--- a/libavformat/hashenc.c
+++ b/libavformat/hashenc.c
@@ -29,66 +29,150 @@
 
 struct HashContext {
     const AVClass *avclass;
-    struct AVHashContext *hash;
+    struct AVHashContext **hashes;
     char *hash_name;
+    int per_stream;
     int format_version;
 };
 
 #define OFFSET(x) offsetof(struct HashContext, x)
 #define ENC AV_OPT_FLAG_ENCODING_PARAM
-#if CONFIG_HASH_MUXER || CONFIG_FRAMEHASH_MUXER
+#define HASH_OPT(defaulttype) \
+    { "hash", "set hash to use", OFFSET(hash_name), AV_OPT_TYPE_STRING, {.str = defaulttype}, 0, 0, ENC }
+#define FORMAT_VERSION_OPT \
+    { "format_version", "file format version", OFFSET(format_version), AV_OPT_TYPE_INT, {.i64 = 2}, 1, 2, ENC }
+
+#if CONFIG_HASH_MUXER
 static const AVOption hash_options[] = {
-    { "hash", "set hash to use", OFFSET(hash_name), AV_OPT_TYPE_STRING, {.str = "sha256"}, 0, 0, ENC },
-    { "format_version", "file format version", OFFSET(format_version), AV_OPT_TYPE_INT, {.i64 = 2}, 1, 2, ENC },
+    HASH_OPT("sha256"),
     { NULL },
 };
 #endif
 
-#if CONFIG_MD5_MUXER || CONFIG_FRAMEMD5_MUXER
+#if CONFIG_FRAMEHASH_MUXER
+static const AVOption framehash_options[] = {
+    HASH_OPT("sha256"),
+    FORMAT_VERSION_OPT,
+    { NULL },
+};
+#endif
+
+#if CONFIG_STREAMHASH_MUXER
+static const AVOption streamhash_options[] = {
+    HASH_OPT("sha256"),
+    { NULL },
+};
+#endif
+
+#if CONFIG_MD5_MUXER
 static const AVOption md5_options[] = {
-    { "hash", "set hash to use", OFFSET(hash_name), AV_OPT_TYPE_STRING, {.str = "md5"}, 0, 0, ENC },
-    { "format_version", "file format version", OFFSET(format_version), AV_OPT_TYPE_INT, {.i64 = 2}, 1, 2, ENC },
+    HASH_OPT("md5"),
+    { NULL },
+};
+#endif
+
+#if CONFIG_FRAMEMD5_MUXER
+static const AVOption framemd5_options[] = {
+    HASH_OPT("md5"),
+    FORMAT_VERSION_OPT,
     { NULL },
 };
 #endif
 
 #if CONFIG_HASH_MUXER || CONFIG_MD5_MUXER
-static int hash_write_header(struct AVFormatContext *s)
+static int hash_init(struct AVFormatContext *s)
 {
+    int res;
     struct HashContext *c = s->priv_data;
-    int res = av_hash_alloc(&c->hash, c->hash_name);
+    c->per_stream = 0;
+    c->hashes = av_mallocz_array(1, sizeof(*c->hashes));
+    if (!c->hashes)
+        return AVERROR(ENOMEM);
+    res = av_hash_alloc(&c->hashes[0], c->hash_name);
     if (res < 0)
         return res;
-    av_hash_init(c->hash);
+    av_hash_init(c->hashes[0]);
     return 0;
 }
+#endif
+
+#if CONFIG_STREAMHASH_MUXER
+static int streamhash_init(struct AVFormatContext *s)
+{
+    int res, i;
+    struct HashContext *c = s->priv_data;
+    c->per_stream = 1;
+    c->hashes = av_mallocz_array(s->nb_streams, sizeof(*c->hashes));
+    if (!c->hashes)
+        return AVERROR(ENOMEM);
+    for (i = 0; i < s->nb_streams; i++) {
+        res = av_hash_alloc(&c->hashes[i], c->hash_name);
+        if (res < 0) {
+            return res;
+        }
+        av_hash_init(c->hashes[i]);
+    }
+    return 0;
+}
+#endif
+
+#if CONFIG_HASH_MUXER || CONFIG_MD5_MUXER || CONFIG_STREAMHASH_MUXER
+static char get_media_type_char(enum AVMediaType type)
+{
+    switch (type) {
+    case AVMEDIA_TYPE_VIDEO:      return 'v';
+    case AVMEDIA_TYPE_AUDIO:      return 'a';
+    case AVMEDIA_TYPE_DATA:       return 'd';
+    case AVMEDIA_TYPE_SUBTITLE:   return 's';
+    case AVMEDIA_TYPE_ATTACHMENT: return 't';
+    default:                      return '?';
+    }
+}
 
 static int hash_write_packet(struct AVFormatContext *s, AVPacket *pkt)
 {
     struct HashContext *c = s->priv_data;
-    av_hash_update(c->hash, pkt->data, pkt->size);
+    av_hash_update(c->hashes[c->per_stream ? pkt->stream_index : 0], pkt->data, pkt->size);
     return 0;
 }
 
 static int hash_write_trailer(struct AVFormatContext *s)
 {
     struct HashContext *c = s->priv_data;
-    char buf[AV_HASH_MAX_SIZE*2+128];
-    snprintf(buf, sizeof(buf) - 200, "%s=", av_hash_get_name(c->hash));
+    int num_hashes = c->per_stream ? s->nb_streams : 1;
+    for (int i = 0; i < num_hashes; i++) {
+        char buf[AV_HASH_MAX_SIZE*2+128];
+        if (c->per_stream) {
+            AVStream *st = s->streams[i];
+            snprintf(buf, sizeof(buf) - 200, "%d,%c,%s=", i, get_media_type_char(st->codecpar->codec_type),
+                     av_hash_get_name(c->hashes[i]));
+        } else {
+            snprintf(buf, sizeof(buf) - 200, "%s=", av_hash_get_name(c->hashes[i]));
+        }
+        av_hash_final_hex(c->hashes[i], buf + strlen(buf), sizeof(buf) - strlen(buf));
+        av_strlcatf(buf, sizeof(buf), "\n");
+        avio_write(s->pb, buf, strlen(buf));
+    }
 
-    av_hash_final_hex(c->hash, buf + strlen(buf), sizeof(buf) - strlen(buf));
-    av_strlcatf(buf, sizeof(buf), "\n");
-    avio_write(s->pb, buf, strlen(buf));
-    avio_flush(s->pb);
-
-    av_hash_freep(&c->hash);
     return 0;
 }
+
+static void hash_free(struct AVFormatContext *s)
+{
+    struct HashContext *c = s->priv_data;
+    if (c->hashes) {
+        int num_hashes = c->per_stream ? s->nb_streams : 1;
+        for (int i = 0; i < num_hashes; i++) {
+            av_hash_freep(&c->hashes[i]);
+        }
+    }
+    av_freep(&c->hashes);
+}
 #endif
 
 #if CONFIG_HASH_MUXER
 static const AVClass hashenc_class = {
-    .class_name = "hash encoder class",
+    .class_name = "hash muxer",
     .item_name  = av_default_item_name,
     .option     = hash_options,
     .version    = LIBAVUTIL_VERSION_INT,
@@ -100,9 +184,10 @@
     .priv_data_size    = sizeof(struct HashContext),
     .audio_codec       = AV_CODEC_ID_PCM_S16LE,
     .video_codec       = AV_CODEC_ID_RAWVIDEO,
-    .write_header      = hash_write_header,
+    .init              = hash_init,
     .write_packet      = hash_write_packet,
     .write_trailer     = hash_write_trailer,
+    .deinit            = hash_free,
     .flags             = AVFMT_VARIABLE_FPS | AVFMT_TS_NONSTRICT |
                          AVFMT_TS_NEGATIVE,
     .priv_class        = &hashenc_class,
@@ -111,7 +196,7 @@
 
 #if CONFIG_MD5_MUXER
 static const AVClass md5enc_class = {
-    .class_name = "MD5 encoder class",
+    .class_name = "MD5 muxer",
     .item_name  = av_default_item_name,
     .option     = md5_options,
     .version    = LIBAVUTIL_VERSION_INT,
@@ -123,15 +208,40 @@
     .priv_data_size    = sizeof(struct HashContext),
     .audio_codec       = AV_CODEC_ID_PCM_S16LE,
     .video_codec       = AV_CODEC_ID_RAWVIDEO,
-    .write_header      = hash_write_header,
+    .init              = hash_init,
     .write_packet      = hash_write_packet,
     .write_trailer     = hash_write_trailer,
+    .deinit            = hash_free,
     .flags             = AVFMT_VARIABLE_FPS | AVFMT_TS_NONSTRICT |
                          AVFMT_TS_NEGATIVE,
     .priv_class        = &md5enc_class,
 };
 #endif
 
+#if CONFIG_STREAMHASH_MUXER
+static const AVClass streamhashenc_class = {
+    .class_name = "stream hash muxer",
+    .item_name  = av_default_item_name,
+    .option     = streamhash_options,
+    .version    = LIBAVUTIL_VERSION_INT,
+};
+
+AVOutputFormat ff_streamhash_muxer = {
+    .name              = "streamhash",
+    .long_name         = NULL_IF_CONFIG_SMALL("Per-stream hash testing"),
+    .priv_data_size    = sizeof(struct HashContext),
+    .audio_codec       = AV_CODEC_ID_PCM_S16LE,
+    .video_codec       = AV_CODEC_ID_RAWVIDEO,
+    .init              = streamhash_init,
+    .write_packet      = hash_write_packet,
+    .write_trailer     = hash_write_trailer,
+    .deinit            = hash_free,
+    .flags             = AVFMT_VARIABLE_FPS | AVFMT_TS_NONSTRICT |
+                         AVFMT_TS_NEGATIVE,
+    .priv_class        = &streamhashenc_class,
+};
+#endif
+
 #if CONFIG_FRAMEHASH_MUXER || CONFIG_FRAMEMD5_MUXER
 static void framehash_print_extradata(struct AVFormatContext *s)
 {
@@ -145,24 +255,35 @@
             char buf[AV_HASH_MAX_SIZE*2+1];
 
             avio_printf(s->pb, "#extradata %d, %31d, ", i, par->extradata_size);
-            av_hash_init(c->hash);
-            av_hash_update(c->hash, par->extradata, par->extradata_size);
-            av_hash_final_hex(c->hash, buf, sizeof(buf));
+            av_hash_init(c->hashes[0]);
+            av_hash_update(c->hashes[0], par->extradata, par->extradata_size);
+            av_hash_final_hex(c->hashes[0], buf, sizeof(buf));
             avio_write(s->pb, buf, strlen(buf));
             avio_printf(s->pb, "\n");
         }
     }
 }
 
+static int framehash_init(struct AVFormatContext *s)
+{
+    int res;
+    struct HashContext *c = s->priv_data;
+    c->per_stream = 0;
+    c->hashes = av_mallocz_array(1, sizeof(*c->hashes));
+    if (!c->hashes)
+        return AVERROR(ENOMEM);
+    res = av_hash_alloc(&c->hashes[0], c->hash_name);
+    if (res < 0)
+        return res;
+    return 0;
+}
+
 static int framehash_write_header(struct AVFormatContext *s)
 {
     struct HashContext *c = s->priv_data;
-    int res = av_hash_alloc(&c->hash, c->hash_name);
-    if (res < 0)
-        return res;
     avio_printf(s->pb, "#format: frame checksums\n");
     avio_printf(s->pb, "#version: %d\n", c->format_version);
-    avio_printf(s->pb, "#hash: %s\n", av_hash_get_name(c->hash));
+    avio_printf(s->pb, "#hash: %s\n", av_hash_get_name(c->hashes[0]));
     framehash_print_extradata(s);
     ff_framehash_write_header(s);
     avio_printf(s->pb, "#stream#, dts,        pts, duration,     size, hash\n");
@@ -174,52 +295,52 @@
     struct HashContext *c = s->priv_data;
     char buf[AV_HASH_MAX_SIZE*2+128];
     int len;
-    av_hash_init(c->hash);
-    av_hash_update(c->hash, pkt->data, pkt->size);
+    av_hash_init(c->hashes[0]);
+    av_hash_update(c->hashes[0], pkt->data, pkt->size);
 
     snprintf(buf, sizeof(buf) - (AV_HASH_MAX_SIZE * 2 + 1), "%d, %10"PRId64", %10"PRId64", %8"PRId64", %8d, ",
              pkt->stream_index, pkt->dts, pkt->pts, pkt->duration, pkt->size);
     len = strlen(buf);
-    av_hash_final_hex(c->hash, buf + len, sizeof(buf) - len);
+    av_hash_final_hex(c->hashes[0], buf + len, sizeof(buf) - len);
     avio_write(s->pb, buf, strlen(buf));
 
     if (c->format_version > 1 && pkt->side_data_elems) {
         int i, j;
         avio_printf(s->pb, ", S=%d", pkt->side_data_elems);
         for (i = 0; i < pkt->side_data_elems; i++) {
-            av_hash_init(c->hash);
+            av_hash_init(c->hashes[0]);
             if (HAVE_BIGENDIAN && pkt->side_data[i].type == AV_PKT_DATA_PALETTE) {
                 for (j = 0; j < pkt->side_data[i].size; j += sizeof(uint32_t)) {
                     uint32_t data = AV_RL32(pkt->side_data[i].data + j);
-                    av_hash_update(c->hash, (uint8_t *)&data, sizeof(uint32_t));
+                    av_hash_update(c->hashes[0], (uint8_t *)&data, sizeof(uint32_t));
                 }
             } else
-                av_hash_update(c->hash, pkt->side_data[i].data, pkt->side_data[i].size);
+                av_hash_update(c->hashes[0], pkt->side_data[i].data, pkt->side_data[i].size);
             snprintf(buf, sizeof(buf) - (AV_HASH_MAX_SIZE * 2 + 1), ", %8d, ", pkt->side_data[i].size);
             len = strlen(buf);
-            av_hash_final_hex(c->hash, buf + len, sizeof(buf) - len);
+            av_hash_final_hex(c->hashes[0], buf + len, sizeof(buf) - len);
             avio_write(s->pb, buf, strlen(buf));
         }
     }
 
     avio_printf(s->pb, "\n");
-    avio_flush(s->pb);
     return 0;
 }
 
-static int framehash_write_trailer(struct AVFormatContext *s)
+static void framehash_free(struct AVFormatContext *s)
 {
     struct HashContext *c = s->priv_data;
-    av_hash_freep(&c->hash);
-    return 0;
+    if (c->hashes)
+        av_hash_freep(&c->hashes[0]);
+    av_freep(&c->hashes);
 }
 #endif
 
 #if CONFIG_FRAMEHASH_MUXER
 static const AVClass framehash_class = {
-    .class_name = "frame hash encoder class",
+    .class_name = "frame hash muxer",
     .item_name  = av_default_item_name,
-    .option     = hash_options,
+    .option     = framehash_options,
     .version    = LIBAVUTIL_VERSION_INT,
 };
 
@@ -229,9 +350,10 @@
     .priv_data_size    = sizeof(struct HashContext),
     .audio_codec       = AV_CODEC_ID_PCM_S16LE,
     .video_codec       = AV_CODEC_ID_RAWVIDEO,
+    .init              = framehash_init,
     .write_header      = framehash_write_header,
     .write_packet      = framehash_write_packet,
-    .write_trailer     = framehash_write_trailer,
+    .deinit            = framehash_free,
     .flags             = AVFMT_VARIABLE_FPS | AVFMT_TS_NONSTRICT |
                          AVFMT_TS_NEGATIVE,
     .priv_class        = &framehash_class,
@@ -240,9 +362,9 @@
 
 #if CONFIG_FRAMEMD5_MUXER
 static const AVClass framemd5_class = {
-    .class_name = "frame hash encoder class",
+    .class_name = "frame MD5 muxer",
     .item_name  = av_default_item_name,
-    .option     = md5_options,
+    .option     = framemd5_options,
     .version    = LIBAVUTIL_VERSION_INT,
 };
 
@@ -252,9 +374,10 @@
     .priv_data_size    = sizeof(struct HashContext),
     .audio_codec       = AV_CODEC_ID_PCM_S16LE,
     .video_codec       = AV_CODEC_ID_RAWVIDEO,
+    .init              = framehash_init,
     .write_header      = framehash_write_header,
     .write_packet      = framehash_write_packet,
-    .write_trailer     = framehash_write_trailer,
+    .deinit            = framehash_free,
     .flags             = AVFMT_VARIABLE_FPS | AVFMT_TS_NONSTRICT |
                          AVFMT_TS_NEGATIVE,
     .priv_class        = &framemd5_class,
diff --git a/libavformat/hca.c b/libavformat/hca.c
new file mode 100644
index 0000000..8f55e07
--- /dev/null
+++ b/libavformat/hca.c
@@ -0,0 +1,124 @@
+/*
+ * HCA demuxer
+ * Copyright (c) 2020 Paul B Mahol
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "libavutil/intreadwrite.h"
+#include "libavcodec/bytestream.h"
+
+#include "avformat.h"
+#include "internal.h"
+
+static int hca_probe(const AVProbeData *p)
+{
+    if (AV_RL32(p->buf) != MKTAG('H', 'C', 'A', 0))
+        return 0;
+
+    if (AV_RL32(p->buf + 8) != MKTAG('f', 'm', 't', 0))
+        return 0;
+
+    return AVPROBE_SCORE_MAX / 3;
+}
+
+static int hca_read_header(AVFormatContext *s)
+{
+    AVCodecParameters *par;
+    GetByteContext gb;
+    AVIOContext *pb = s->pb;
+    AVStream *st;
+    uint32_t chunk;
+    uint16_t version;
+    uint32_t block_count;
+    uint16_t block_size;
+    int ret;
+
+    avio_skip(pb, 4);
+    version = avio_rb16(pb);
+
+    s->internal->data_offset = avio_rb16(pb);
+    if (s->internal->data_offset <= 8)
+        return AVERROR_INVALIDDATA;
+
+    st = avformat_new_stream(s, NULL);
+    if (!st)
+        return AVERROR(ENOMEM);
+
+    par = st->codecpar;
+    ret = ff_alloc_extradata(par, s->internal->data_offset);
+    if (ret < 0)
+        return ret;
+
+    ret = avio_read(pb, par->extradata + 8, par->extradata_size - 8);
+    if (ret < par->extradata_size - 8)
+        return AVERROR(EIO);
+    AV_WL32(par->extradata, MKTAG('H', 'C', 'A', 0));
+    AV_WB16(par->extradata + 4, version);
+    AV_WB16(par->extradata + 6, s->internal->data_offset);
+
+    bytestream2_init(&gb, par->extradata + 8, par->extradata_size - 8);
+
+    if (bytestream2_get_le32(&gb) != MKTAG('f', 'm', 't', 0))
+        return AVERROR_INVALIDDATA;
+
+    par->codec_type  = AVMEDIA_TYPE_AUDIO;
+    par->codec_id    = AV_CODEC_ID_HCA;
+    par->codec_tag   = 0;
+    par->channels    = bytestream2_get_byte(&gb);
+    par->sample_rate = bytestream2_get_be24(&gb);
+    block_count      = bytestream2_get_be32(&gb);
+    bytestream2_skip(&gb, 4);
+    chunk = bytestream2_get_le32(&gb);
+    if (chunk == MKTAG('c', 'o', 'm', 'p')) {
+        block_size = bytestream2_get_be16(&gb);
+    } else if (chunk == MKTAG('d', 'e', 'c', 0)) {
+        block_size = bytestream2_get_be16(&gb);
+    } else {
+        return AVERROR_INVALIDDATA;
+    }
+
+    if (block_size < 8)
+        return AVERROR_INVALIDDATA;
+    par->block_align = block_size;
+    st->duration = 1024 * block_count;
+
+    avio_seek(pb, s->internal->data_offset, SEEK_SET);
+    avpriv_set_pts_info(st, 64, 1, par->sample_rate);
+
+    return 0;
+}
+
+static int hca_read_packet(AVFormatContext *s, AVPacket *pkt)
+{
+    AVCodecParameters *par = s->streams[0]->codecpar;
+    int ret;
+
+    ret = av_get_packet(s->pb, pkt, par->block_align);
+    pkt->duration = 1024;
+    return ret;
+}
+
+AVInputFormat ff_hca_demuxer = {
+    .name           = "hca",
+    .long_name      = NULL_IF_CONFIG_SMALL("CRI HCA"),
+    .read_probe     = hca_probe,
+    .read_header    = hca_read_header,
+    .read_packet    = hca_read_packet,
+    .extensions     = "hca",
+    .flags          = AVFMT_GENERIC_INDEX,
+};
diff --git a/libavformat/hcom.c b/libavformat/hcom.c
new file mode 100644
index 0000000..3e1e8da
--- /dev/null
+++ b/libavformat/hcom.c
@@ -0,0 +1,91 @@
+/*
+ * HCOM demuxer
+ * Copyright (c) 2019 Paul B Mahol
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "libavutil/intreadwrite.h"
+#include "libavcodec/internal.h"
+#include "avformat.h"
+#include "internal.h"
+#include "pcm.h"
+
+static int hcom_probe(const AVProbeData *p)
+{
+    if (p->buf_size < 132)
+        return 0;
+    if (!memcmp(p->buf+65, "FSSD", 4) &&
+        !memcmp(p->buf+128, "HCOM", 4))
+        return AVPROBE_SCORE_MAX;
+    return 0;
+}
+
+static int hcom_read_header(AVFormatContext *s)
+{
+    AVStream *st;
+    av_unused unsigned data_size, rsrc_size, huffcount;
+    unsigned compresstype, divisor;
+    unsigned dict_entries;
+    int ret;
+
+    avio_skip(s->pb, 83);
+    data_size = avio_rb32(s->pb);
+    rsrc_size = avio_rb32(s->pb);
+    avio_skip(s->pb, 128-91+4);
+    huffcount = avio_rb32(s->pb);
+    avio_skip(s->pb, 4);
+    compresstype = avio_rb32(s->pb);
+    if (compresstype > 1)
+        return AVERROR_INVALIDDATA;
+    divisor = avio_rb32(s->pb);
+    if (divisor == 0 || divisor > 4)
+        return AVERROR_INVALIDDATA;
+    dict_entries = avio_rb16(s->pb);
+
+    st = avformat_new_stream(s, NULL);
+    if (!st)
+        return AVERROR(ENOMEM);
+
+    st->codecpar->codec_type  = AVMEDIA_TYPE_AUDIO;
+    st->codecpar->channels    = 1;
+    st->codecpar->sample_rate = 22050 / divisor;
+    st->codecpar->codec_id    = AV_CODEC_ID_HCOM;
+    st->codecpar->bits_per_coded_sample = 8;
+    st->codecpar->block_align = 4;
+
+    ret = ff_alloc_extradata(st->codecpar, dict_entries * 4 + 7);
+    if (ret < 0)
+        return ret;
+    AV_WB16(st->codecpar->extradata, dict_entries);
+    AV_WB32(st->codecpar->extradata + 2, compresstype);
+    avio_read(s->pb, st->codecpar->extradata + 6, dict_entries * 4);
+    avio_skip(s->pb, 1);
+    st->codecpar->extradata[dict_entries * 4 + 6] = avio_r8(s->pb);
+
+    avpriv_set_pts_info(st, 64, 1, st->codecpar->sample_rate);
+
+    return 0;
+}
+
+AVInputFormat ff_hcom_demuxer = {
+    .name           = "hcom",
+    .long_name      = NULL_IF_CONFIG_SMALL("Macintosh HCOM"),
+    .read_probe     = hcom_probe,
+    .read_header    = hcom_read_header,
+    .read_packet    = ff_pcm_read_packet,
+};
diff --git a/libavformat/hdsenc.c b/libavformat/hdsenc.c
index d82aee1..46f0026 100644
--- a/libavformat/hdsenc.c
+++ b/libavformat/hdsenc.c
@@ -146,8 +146,7 @@
             av_write_trailer(os->ctx);
         if (os->ctx)
             avio_context_free(&os->ctx->pb);
-        if (os->ctx)
-            avformat_free_context(os->ctx);
+        avformat_free_context(os->ctx);
         av_freep(&os->metadata);
         for (j = 0; j < os->nb_extra_packets; j++)
             av_freep(&os->extra_packets[j]);
@@ -315,7 +314,7 @@
 {
     HDSContext *c = s->priv_data;
     int ret = 0, i;
-    AVOutputFormat *oformat;
+    ff_const59 AVOutputFormat *oformat;
 
     if (mkdir(s->url, 0777) == -1 && errno != EEXIST) {
         ret = AVERROR(errno);
diff --git a/libavformat/hevc.c b/libavformat/hevc.c
index 3628d5a..f621cb2 100644
--- a/libavformat/hevc.c
+++ b/libavformat/hevc.c
@@ -25,6 +25,7 @@
 #include "libavutil/intreadwrite.h"
 #include "avc.h"
 #include "avio.h"
+#include "avio_internal.h"
 #include "hevc.h"
 
 #define MAX_SPATIAL_SEGMENTATION 4096 // max. value of u(12) field
@@ -643,40 +644,6 @@
     return 0;
 }
 
-static uint8_t *nal_unit_extract_rbsp(const uint8_t *src, uint32_t src_len,
-                                      uint32_t *dst_len)
-{
-    uint8_t *dst;
-    uint32_t i, len;
-
-    dst = av_malloc(src_len + AV_INPUT_BUFFER_PADDING_SIZE);
-    if (!dst)
-        return NULL;
-
-    /* NAL unit header (2 bytes) */
-    i = len = 0;
-    while (i < 2 && i < src_len)
-        dst[len++] = src[i++];
-
-    while (i + 2 < src_len)
-        if (!src[i] && !src[i + 1] && src[i + 2] == 3) {
-            dst[len++] = src[i++];
-            dst[len++] = src[i++];
-            i++; // remove emulation_prevention_three_byte
-        } else
-            dst[len++] = src[i++];
-
-    while (i < src_len)
-        dst[len++] = src[i++];
-
-    memset(dst + len, 0, AV_INPUT_BUFFER_PADDING_SIZE);
-
-    *dst_len = len;
-    return dst;
-}
-
-
-
 static void nal_unit_parse_header(GetBitContext *gb, uint8_t *nal_type)
 {
     skip_bits1(gb); // forbidden_zero_bit
@@ -753,7 +720,7 @@
     uint8_t *rbsp_buf;
     uint32_t rbsp_size;
 
-    rbsp_buf = nal_unit_extract_rbsp(nal_buf, nal_size, &rbsp_size);
+    rbsp_buf = ff_nal_unit_extract_rbsp(nal_buf, nal_size, &rbsp_size, 2);
     if (!rbsp_buf) {
         ret = AVERROR(ENOMEM);
         goto end;
@@ -1088,9 +1055,14 @@
         return ret;
 
     ret   = ff_hevc_annexb2mp4(pb, buf_in, *size, filter_ps, ps_count);
+    if (ret < 0) {
+        ffio_free_dyn_buf(&pb);
+        return ret;
+    }
+
     *size = avio_close_dyn_buf(pb, buf_out);
 
-    return ret;
+    return 0;
 }
 
 int ff_isom_write_hvcc(AVIOContext *pb, const uint8_t *data,
diff --git a/libavformat/hevc.h b/libavformat/hevc.h
index 796eaf4..0f56325 100644
--- a/libavformat/hevc.h
+++ b/libavformat/hevc.h
@@ -60,19 +60,20 @@
  * If filter_ps is non-zero, any HEVC parameter sets found in the input will be
  * discarded, and *ps_count will be set to the number of discarded PS NAL units.
  *
- * On output, *size holds the size (in bytes) of the output data buffer.
+ * On success, *size holds the size (in bytes) of the output data buffer.
  *
  * @param buf_in address of the buffer holding the input data
  * @param size address of the variable holding the size (in bytes) of the input
- *        buffer (on input) and of the output buffer (on output)
- * @param buf_out address of the variable holding the address of the output
- *        buffer
+ *        buffer (on input) and of the output buffer (on success)
+ * @param buf_out on success, address of the variable holding the address of
+ *        the output buffer
  * @param filter_ps whether to write parameter set NAL units to the output (0)
  *        or to discard them (non-zero)
  * @param ps_count address of the variable where the number of discarded
  *        parameter set NAL units shall be written, may be NULL
- * @return the amount (in bytes) of data written in case of success, a negative
- *         value corresponding to an AVERROR code in case of failure
+ * @return 0 in case of success, a negative value corresponding to an AVERROR
+ *         code in case of failure
+ * @note *buf_out will be treated as uninitialized on input and won't be freed.
  */
 int ff_hevc_annexb2mp4_buf(const uint8_t *buf_in, uint8_t **buf_out,
                            int *size, int filter_ps, int *ps_count);
diff --git a/libavformat/hevcdec.c b/libavformat/hevcdec.c
index aaab0ff..255f03b 100644
--- a/libavformat/hevcdec.c
+++ b/libavformat/hevcdec.c
@@ -24,7 +24,7 @@
 #include "avformat.h"
 #include "rawdec.h"
 
-static int hevc_probe(AVProbeData *p)
+static int hevc_probe(const AVProbeData *p)
 {
     uint32_t code = -1;
     int vps = 0, sps = 0, pps = 0, irap = 0;
diff --git a/libavformat/hls.c b/libavformat/hls.c
index 8ad08ba..fc45719 100644
--- a/libavformat/hls.c
+++ b/libavformat/hls.c
@@ -116,7 +116,10 @@
     int n_segments;
     struct segment **segments;
     int needed;
+    int broken;
     int cur_seq_no;
+    int last_seq_no;
+    int m3u8_hold_counters;
     int64_t cur_seg_offset;
     int64_t last_load_time;
 
@@ -197,17 +200,18 @@
     struct rendition **renditions;
 
     int cur_seq_no;
+    int m3u8_hold_counters;
     int live_start_index;
     int first_packet;
     int64_t first_timestamp;
     int64_t cur_timestamp;
     AVIOInterruptCB *interrupt_callback;
     AVDictionary *avio_opts;
-    int strict_std_compliance;
     char *allowed_extensions;
     int max_reload;
     int http_persistent;
     int http_multiple;
+    int http_seekable;
     AVIOContext *playlist_pb;
 } HLSContext;
 
@@ -223,9 +227,9 @@
 
 static void free_segment_list(struct playlist *pls)
 {
-        free_segment_dynarray(pls->segments, pls->n_segments);
-        av_freep(&pls->segments);
-        pls->n_segments = 0;
+    free_segment_dynarray(pls->segments, pls->n_segments);
+    av_freep(&pls->segments);
+    pls->n_segments = 0;
 }
 
 static void free_init_section_list(struct playlist *pls)
@@ -254,11 +258,9 @@
         av_freep(&pls->init_sec_buf);
         av_packet_unref(&pls->pkt);
         av_freep(&pls->pb.buffer);
-        if (pls->input)
-            ff_format_io_close(c->ctx, &pls->input);
+        ff_format_io_close(c->ctx, &pls->input);
         pls->input_read_done = 0;
-        if (pls->input_next)
-            ff_format_io_close(c->ctx, &pls->input_next);
+        ff_format_io_close(c->ctx, &pls->input_next);
         pls->input_next_requested = 0;
         if (pls->ctx) {
             pls->ctx->pb = NULL;
@@ -292,7 +294,7 @@
 }
 
 /*
- * Used to reset a statically allocated AVPacket to a clean slate,
+ * Used to reset a statically allocated AVPacket to a clean state,
  * containing no data.
  */
 static void reset_packet(AVPacket *pkt)
@@ -401,8 +403,7 @@
                                         const char *url_base)
 {
     struct segment *sec;
-    char *ptr;
-    char tmp_str[MAX_URL_SIZE];
+    char tmp_str[MAX_URL_SIZE], *ptr = tmp_str;
 
     if (!info->uri[0])
         return NULL;
@@ -411,8 +412,12 @@
     if (!sec)
         return NULL;
 
-    ff_make_absolute_url(tmp_str, sizeof(tmp_str), url_base, info->uri);
-    sec->url = av_strdup(tmp_str);
+    if (!av_strncasecmp(info->uri, "data:", 5)) {
+        ptr = info->uri;
+    } else {
+        ff_make_absolute_url(tmp_str, sizeof(tmp_str), url_base, info->uri);
+    }
+    sec->url = av_strdup(ptr);
     if (!sec->url) {
         av_free(sec);
         return NULL;
@@ -477,17 +482,23 @@
          * AVC SEI RBSP anyway */
         return NULL;
 
-    if (type == AVMEDIA_TYPE_UNKNOWN)
+    if (type == AVMEDIA_TYPE_UNKNOWN) {
+        av_log(c->ctx, AV_LOG_WARNING, "Can't support the type: %s\n", info->type);
         return NULL;
+    }
 
     /* URI is mandatory for subtitles as per spec */
-    if (type == AVMEDIA_TYPE_SUBTITLE && !info->uri[0])
+    if (type == AVMEDIA_TYPE_SUBTITLE && !info->uri[0]) {
+        av_log(c->ctx, AV_LOG_ERROR, "The URI tag is REQUIRED for subtitle.\n");
         return NULL;
+    }
 
     /* TODO: handle subtitles (each segment has to parsed separately) */
-    if (c->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL)
-        if (type == AVMEDIA_TYPE_SUBTITLE)
+    if (c->ctx->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL)
+        if (type == AVMEDIA_TYPE_SUBTITLE) {
+            av_log(c->ctx, AV_LOG_WARNING, "Can't support the subtitle(uri: %s)\n", info->uri);
             return NULL;
+        }
 
     rend = av_mallocz(sizeof(struct rendition));
     if (!rend)
@@ -590,7 +601,7 @@
 }
 
 static int open_url_keepalive(AVFormatContext *s, AVIOContext **pb,
-                              const char *url)
+                              const char *url, AVDictionary **options)
 {
 #if !CONFIG_HTTP_PROTOCOL
     return AVERROR_PROTOCOL_NOT_FOUND;
@@ -599,7 +610,7 @@
     URLContext *uc = ffio_geturlcontext(*pb);
     av_assert0(uc);
     (*pb)->eof_reached = 0;
-    ret = ff_http_do_new_request(uc, url);
+    ret = ff_http_do_new_request2(uc, url, options);
     if (ret < 0) {
         ff_format_io_close(s, pb);
     }
@@ -616,12 +627,12 @@
     int ret;
     int is_http = 0;
 
-    av_dict_copy(&tmp, opts, 0);
-    av_dict_copy(&tmp, opts2, 0);
-
     if (av_strstart(url, "crypto", NULL)) {
         if (url[6] == '+' || url[6] == ':')
             proto_name = avio_find_protocol_name(url + 7);
+    } else if (av_strstart(url, "data", NULL)) {
+        if (url[4] == '+' || url[4] == ':')
+            proto_name = avio_find_protocol_name(url + 5);
     }
 
     if (!proto_name)
@@ -641,6 +652,8 @@
         }
     } else if (av_strstart(proto_name, "http", NULL)) {
         is_http = 1;
+    } else if (av_strstart(proto_name, "data", NULL)) {
+        ;
     } else
         return AVERROR_INVALIDDATA;
 
@@ -648,17 +661,23 @@
         ;
     else if (av_strstart(url, "crypto", NULL) && !strncmp(proto_name, url + 7, strlen(proto_name)) && url[7 + strlen(proto_name)] == ':')
         ;
+    else if (av_strstart(url, "data", NULL) && !strncmp(proto_name, url + 5, strlen(proto_name)) && url[5 + strlen(proto_name)] == ':')
+        ;
     else if (strcmp(proto_name, "file") || !strncmp(url, "file,", 5))
         return AVERROR_INVALIDDATA;
 
+    av_dict_copy(&tmp, opts, 0);
+    av_dict_copy(&tmp, opts2, 0);
+
     if (is_http && c->http_persistent && *pb) {
-        ret = open_url_keepalive(c->ctx, pb, url);
+        ret = open_url_keepalive(c->ctx, pb, url, &tmp);
         if (ret == AVERROR_EXIT) {
+            av_dict_free(&tmp);
             return ret;
         } else if (ret < 0) {
             if (ret != AVERROR_EOF)
                 av_log(s, AV_LOG_WARNING,
-                    "keepalive request failed for '%s', retrying with new connection: %s\n",
+                    "keepalive request failed for '%s' with error: '%s' when opening url, retrying with new connection\n",
                     url, av_err2str(ret));
             ret = s->io_open(s, pb, url, AVIO_FLAG_READ, &tmp);
         }
@@ -709,13 +728,13 @@
 
     if (is_http && !in && c->http_persistent && c->playlist_pb) {
         in = c->playlist_pb;
-        ret = open_url_keepalive(c->ctx, &c->playlist_pb, url);
+        ret = open_url_keepalive(c->ctx, &c->playlist_pb, url, NULL);
         if (ret == AVERROR_EXIT) {
             return ret;
         } else if (ret < 0) {
             if (ret != AVERROR_EOF)
                 av_log(c->ctx, AV_LOG_WARNING,
-                    "keepalive request failed for '%s', retrying with new connection: %s\n",
+                    "keepalive request failed for '%s' with error: '%s' when parsing playlist\n",
                     url, av_err2str(ret));
             in = NULL;
         }
@@ -844,6 +863,7 @@
             if (ptr)
                 seg_offset = strtoll(ptr+1, NULL, 10);
         } else if (av_strstart(line, "#", NULL)) {
+            av_log(c->ctx, AV_LOG_INFO, "Skip ('%s')\n", line);
             continue;
         } else if (line[0]) {
             if (is_variant) {
@@ -855,13 +875,9 @@
             }
             if (is_segment) {
                 struct segment *seg;
-                if (!pls) {
-                    if (!new_variant(c, 0, url, NULL)) {
-                        ret = AVERROR(ENOMEM);
-                        goto fail;
-                    }
-                    pls = c->playlists[c->n_playlists - 1];
-                }
+                ret = ensure_playlist(c, &pls, url);
+                if (ret < 0)
+                    goto fail;
                 seg = av_malloc(sizeof(struct segment));
                 if (!seg) {
                     ret = AVERROR(ENOMEM);
@@ -931,6 +947,7 @@
                    prev_start_seq_no, pls->start_seq_no);
         }
         free_segment_dynarray(prev_segments, prev_n_segments);
+        av_freep(&prev_segments);
     }
     if (pls)
         pls->last_load_time = av_gettime_relative();
@@ -1064,7 +1081,7 @@
 
     } else {
         if (!pls->id3_changed && id3_has_changed_values(pls, metadata, apic)) {
-            avpriv_report_missing_feature(pls->ctx, "Changing ID3 metadata in HLS audio elementary stream");
+            avpriv_report_missing_feature(pls->parent, "Changing ID3 metadata in HLS audio elementary stream");
             pls->id3_changed = 1;
         }
         av_dict_free(&metadata);
@@ -1115,7 +1132,7 @@
             int remaining = taglen - tag_got_bytes;
 
             if (taglen > maxsize) {
-                av_log(pls->ctx, AV_LOG_ERROR, "Too large HLS ID3 tag (%d > %"PRId64" bytes)\n",
+                av_log(pls->parent, AV_LOG_ERROR, "Too large HLS ID3 tag (%d > %"PRId64" bytes)\n",
                        taglen, maxsize);
                 break;
             }
@@ -1136,14 +1153,14 @@
             /* strip the intercepted bytes */
             *len -= tag_got_bytes;
             memmove(buf, buf + tag_got_bytes, *len);
-            av_log(pls->ctx, AV_LOG_DEBUG, "Stripped %d HLS ID3 bytes\n", tag_got_bytes);
+            av_log(pls->parent, AV_LOG_DEBUG, "Stripped %d HLS ID3 bytes\n", tag_got_bytes);
 
             if (remaining > 0) {
                 /* read the rest of the tag in */
                 if (read_from_url(pls, seg, pls->id3_buf + id3_buf_pos, remaining) != remaining)
                     break;
                 id3_buf_pos += remaining;
-                av_log(pls->ctx, AV_LOG_DEBUG, "Stripped additional %d HLS ID3 bytes\n", remaining);
+                av_log(pls->parent, AV_LOG_DEBUG, "Stripped additional %d HLS ID3 bytes\n", remaining);
             }
 
         } else {
@@ -1202,12 +1219,12 @@
             if (open_url(pls->parent, &pb, seg->key, c->avio_opts, opts, NULL) == 0) {
                 ret = avio_read(pb, pls->key, sizeof(pls->key));
                 if (ret != sizeof(pls->key)) {
-                    av_log(NULL, AV_LOG_ERROR, "Unable to read key file %s\n",
+                    av_log(pls->parent, AV_LOG_ERROR, "Unable to read key file %s\n",
                            seg->key);
                 }
                 ff_format_io_close(pls->parent, &pb);
             } else {
-                av_log(NULL, AV_LOG_ERROR, "Unable to open key file %s\n",
+                av_log(pls->parent, AV_LOG_ERROR, "Unable to open key file %s\n",
                        seg->key);
             }
             av_strlcpy(pls->key_url, seg->key, sizeof(pls->key_url));
@@ -1392,8 +1409,8 @@
         v->needed = playlist_needed(v);
 
         if (!v->needed) {
-            av_log(v->parent, AV_LOG_INFO, "No longer receiving playlist %d\n",
-                v->index);
+            av_log(v->parent, AV_LOG_INFO, "No longer receiving playlist %d ('%s')\n",
+                   v->index, v->url);
             return AVERROR_EOF;
         }
 
@@ -1419,11 +1436,22 @@
             reload_interval = v->target_duration / 2;
         }
         if (v->cur_seq_no < v->start_seq_no) {
-            av_log(NULL, AV_LOG_WARNING,
+            av_log(v->parent, AV_LOG_WARNING,
                    "skipping %d segments ahead, expired from playlists\n",
                    v->start_seq_no - v->cur_seq_no);
             v->cur_seq_no = v->start_seq_no;
         }
+        if (v->cur_seq_no > v->last_seq_no) {
+            v->last_seq_no = v->cur_seq_no;
+            v->m3u8_hold_counters = 0;
+        } else if (v->last_seq_no == v->cur_seq_no) {
+            v->m3u8_hold_counters++;
+            if (v->m3u8_hold_counters >= c->m3u8_hold_counters) {
+                return AVERROR_EOF;
+            }
+        } else {
+            av_log(v->parent, AV_LOG_WARNING, "maybe the m3u8 list sequence have been wraped.\n");
+        }
         if (v->cur_seq_no >= v->start_seq_no + v->n_segments) {
             if (v->finished)
                 return AVERROR_EOF;
@@ -1446,6 +1474,7 @@
 
         if (c->http_multiple == 1 && v->input_next_requested) {
             FFSWAP(AVIOContext *, v->input, v->input_next);
+            v->cur_seg_offset = 0;
             v->input_next_requested = 0;
             ret = 0;
         } else {
@@ -1467,7 +1496,7 @@
         uint8_t *http_version_opt = NULL;
         int r = av_opt_get(v->input, "http_version", AV_OPT_SEARCH_CHILDREN, &http_version_opt);
         if (r >= 0) {
-            c->http_multiple = strncmp((const char *)http_version_opt, "1.1", 3) == 0;
+            c->http_multiple = (!strncmp((const char *)http_version_opt, "1.1", 3) || !strncmp((const char *)http_version_opt, "2.0", 3));
             av_freep(&http_version_opt);
         }
     }
@@ -1479,7 +1508,7 @@
         if (ret < 0) {
             if (ff_check_interrupt(c->interrupt_callback))
                 return AVERROR_EXIT;
-            av_log(v->parent, AV_LOG_WARNING, "Failed to open segment %d of playlist %d\n",
+            av_log(v->parent, AV_LOG_WARNING, "Failed to open next segment %d of playlist %d\n",
                    v->cur_seq_no + 1,
                    v->index);
         } else {
@@ -1644,7 +1673,7 @@
 {
     HLSContext *c = s->priv_data;
     static const char * const opts[] = {
-        "headers", "http_proxy", "user_agent", "cookies", "referer", "rw_timeout", NULL };
+        "headers", "http_proxy", "user_agent", "cookies", "referer", "rw_timeout", "icy", NULL };
     const char * const * opt = opts;
     uint8_t *buf;
     int ret = 0;
@@ -1785,7 +1814,6 @@
 
     c->ctx                = s;
     c->interrupt_callback = &s->interrupt_callback;
-    c->strict_std_compliance = s->strict_std_compliance;
 
     c->first_packet = 1;
     c->first_timestamp = AV_NOPTS_VALUE;
@@ -1794,14 +1822,16 @@
     if ((ret = save_avio_options(s)) < 0)
         goto fail;
 
-    /* Some HLS servers don't like being sent the range header */
-    av_dict_set(&c->avio_opts, "seekable", "0", 0);
+    /* XXX: Some HLS servers don't like being sent the range header,
+       in this case, need to  setting http_seekable = 0 to disable
+       the range header */
+    av_dict_set_int(&c->avio_opts, "seekable", c->http_seekable, 0);
 
     if ((ret = parse_playlist(c, s->url, NULL, s->pb)) < 0)
         goto fail;
 
     if (c->n_variants == 0) {
-        av_log(NULL, AV_LOG_WARNING, "Empty playlist\n");
+        av_log(s, AV_LOG_WARNING, "Empty playlist\n");
         ret = AVERROR_EOF;
         goto fail;
     }
@@ -1810,15 +1840,22 @@
     if (c->n_playlists > 1 || c->playlists[0]->n_segments == 0) {
         for (i = 0; i < c->n_playlists; i++) {
             struct playlist *pls = c->playlists[i];
-            if ((ret = parse_playlist(c, pls->url, pls, NULL)) < 0)
+            pls->m3u8_hold_counters = 0;
+            if ((ret = parse_playlist(c, pls->url, pls, NULL)) < 0) {
+                av_log(s, AV_LOG_WARNING, "parse_playlist error %s [%s]\n", av_err2str(ret), pls->url);
+                pls->broken = 1;
+                if (c->n_playlists > 1)
+                    continue;
                 goto fail;
+            }
         }
     }
 
-    if (c->variants[0]->playlists[0]->n_segments == 0) {
-        av_log(NULL, AV_LOG_WARNING, "Empty playlist\n");
-        ret = AVERROR_EOF;
-        goto fail;
+    for (i = 0; i < c->n_variants; i++) {
+        if (c->variants[i]->playlists[0]->n_segments == 0) {
+            av_log(s, AV_LOG_WARNING, "Empty segment [%s]\n", c->variants[i]->playlists[0]->url);
+            c->variants[i]->playlists[0]->broken = 1;
+        }
     }
 
     /* If this isn't a live stream, calculate the total duration of the
@@ -1867,7 +1904,7 @@
     /* Open the demuxer for each playlist */
     for (i = 0; i < c->n_playlists; i++) {
         struct playlist *pls = c->playlists[i];
-        AVInputFormat *in_fmt = NULL;
+        ff_const59 AVInputFormat *in_fmt = NULL;
 
         if (!(pls->ctx = avformat_alloc_context())) {
             ret = AVERROR(ENOMEM);
@@ -1902,7 +1939,8 @@
         }
         ffio_init_context(&pls->pb, pls->read_buffer, INITIAL_BUFFER_SIZE, 0, pls,
                           read_data, NULL, NULL);
-        pls->pb.seekable = 0;
+        pls->ctx->probesize = s->probesize > 0 ? s->probesize : 1024 * 4;
+        pls->ctx->max_analyze_duration = s->max_analyze_duration > 0 ? s->max_analyze_duration : 4 * AV_TIME_BASE;
         ret = av_probe_input_buffer(&pls->pb, &in_fmt, pls->segments[0]->url,
                                     NULL, 0, 0);
         if (ret < 0) {
@@ -1943,7 +1981,7 @@
          * but for other streams we can rely on our user calling avformat_find_stream_info()
          * on us if they want to.
          */
-        if (pls->is_id3_timestamped) {
+        if (pls->is_id3_timestamped || (pls->n_renditions > 0 && pls->renditions[0]->type == AVMEDIA_TYPE_AUDIO)) {
             ret = avformat_find_stream_info(pls->ctx, NULL);
             if (ret < 0)
                 goto fail;
@@ -1988,6 +2026,9 @@
 
         cur_needed = playlist_needed(c->playlists[i]);
 
+        if (pls->broken) {
+            continue;
+        }
         if (cur_needed && !pls->needed) {
             pls->needed = 1;
             changed = 1;
@@ -2001,11 +2042,9 @@
             }
             av_log(s, AV_LOG_INFO, "Now receiving playlist %d, segment %d\n", i, pls->cur_seq_no);
         } else if (first && !cur_needed && pls->needed) {
-            if (pls->input)
-                ff_format_io_close(pls->parent, &pls->input);
+            ff_format_io_close(pls->parent, &pls->input);
             pls->input_read_done = 0;
-            if (pls->input_next)
-                ff_format_io_close(pls->parent, &pls->input_next);
+            ff_format_io_close(pls->parent, &pls->input_next);
             pls->input_next_requested = 0;
             pls->needed = 0;
             changed = 1;
@@ -2114,7 +2153,6 @@
                     }
                 }
                 av_packet_unref(&pls->pkt);
-                reset_packet(&pls->pkt);
             }
         }
         /* Check if this stream has the packet with the lowest dts */
@@ -2143,7 +2181,6 @@
         ret = update_streams_from_subdemuxer(s, pls);
         if (ret < 0) {
             av_packet_unref(&pls->pkt);
-            reset_packet(&pls->pkt);
             return ret;
         }
 
@@ -2168,16 +2205,14 @@
             av_log(s, AV_LOG_ERROR, "stream index inconsistency: index %d, %d main streams, %d subdemuxer streams\n",
                    pls->pkt.stream_index, pls->n_main_streams, pls->ctx->nb_streams);
             av_packet_unref(&pls->pkt);
-            reset_packet(&pls->pkt);
             return AVERROR_BUG;
         }
 
         ist = pls->ctx->streams[pls->pkt.stream_index];
         st = pls->main_streams[pls->pkt.stream_index];
 
-        *pkt = pls->pkt;
+        av_packet_move_ref(pkt, &pls->pkt);
         pkt->stream_index = st->index;
-        reset_packet(&c->playlists[minplaylist]->pkt);
 
         if (pkt->dts != AV_NOPTS_VALUE)
             c->cur_timestamp = av_rescale_q(pkt->dts,
@@ -2189,7 +2224,6 @@
         if (ist->codecpar->codec_id != st->codecpar->codec_id) {
             ret = set_stream_info_from_input_stream(st, pls, ist);
             if (ret < 0) {
-                av_packet_unref(pkt);
                 return ret;
             }
         }
@@ -2249,14 +2283,11 @@
     for (i = 0; i < c->n_playlists; i++) {
         /* Reset reading */
         struct playlist *pls = c->playlists[i];
-        if (pls->input)
-            ff_format_io_close(pls->parent, &pls->input);
+        ff_format_io_close(pls->parent, &pls->input);
         pls->input_read_done = 0;
-        if (pls->input_next)
-            ff_format_io_close(pls->parent, &pls->input_next);
+        ff_format_io_close(pls->parent, &pls->input_next);
         pls->input_next_requested = 0;
         av_packet_unref(&pls->pkt);
-        reset_packet(&pls->pkt);
         pls->pb.eof_reached = 0;
         /* Clear any buffered data */
         pls->pb.buf_end = pls->pb.buf_ptr = pls->pb.buffer;
@@ -2284,7 +2315,7 @@
     return 0;
 }
 
-static int hls_probe(AVProbeData *p)
+static int hls_probe(const AVProbeData *p)
 {
     /* Require #EXTM3U at the start, and either one of the ones below
      * somewhere for a proper match. */
@@ -2309,26 +2340,30 @@
         INT_MIN, INT_MAX, FLAGS},
     {"max_reload", "Maximum number of times a insufficient list is attempted to be reloaded",
         OFFSET(max_reload), AV_OPT_TYPE_INT, {.i64 = 1000}, 0, INT_MAX, FLAGS},
+    {"m3u8_hold_counters", "The maximum number of times to load m3u8 when it refreshes without new segments",
+        OFFSET(m3u8_hold_counters), AV_OPT_TYPE_INT, {.i64 = 1000}, 0, INT_MAX, FLAGS},
     {"http_persistent", "Use persistent HTTP connections",
         OFFSET(http_persistent), AV_OPT_TYPE_BOOL, {.i64 = 1}, 0, 1, FLAGS },
     {"http_multiple", "Use multiple HTTP connections for fetching segments",
         OFFSET(http_multiple), AV_OPT_TYPE_BOOL, {.i64 = -1}, -1, 1, FLAGS},
+    {"http_seekable", "Use HTTP partial requests, 0 = disable, 1 = enable, -1 = auto",
+        OFFSET(http_seekable), AV_OPT_TYPE_BOOL, { .i64 = -1}, -1, 1, FLAGS},
     {NULL}
 };
 
 static const AVClass hls_class = {
-    .class_name = "hls,applehttp",
+    .class_name = "hls demuxer",
     .item_name  = av_default_item_name,
     .option     = hls_options,
     .version    = LIBAVUTIL_VERSION_INT,
 };
 
 AVInputFormat ff_hls_demuxer = {
-    .name           = "hls,applehttp",
+    .name           = "hls",
     .long_name      = NULL_IF_CONFIG_SMALL("Apple HTTP Live Streaming"),
     .priv_class     = &hls_class,
     .priv_data_size = sizeof(HLSContext),
-    .flags          = AVFMT_NOGENSEARCH,
+    .flags          = AVFMT_NOGENSEARCH | AVFMT_TS_DISCONT,
     .read_probe     = hls_probe,
     .read_header    = hls_read_header,
     .read_packet    = hls_read_packet,
diff --git a/libavformat/hlsenc.c b/libavformat/hlsenc.c
index 28c2dd6..d756847 100644
--- a/libavformat/hlsenc.c
+++ b/libavformat/hlsenc.c
@@ -53,9 +53,9 @@
 #include "os_support.h"
 
 typedef enum {
-  HLS_START_SEQUENCE_AS_START_NUMBER = 0,
-  HLS_START_SEQUENCE_AS_SECONDS_SINCE_EPOCH = 1,
-  HLS_START_SEQUENCE_AS_FORMATTED_DATETIME = 2,  // YYYYMMDDhhmmss
+    HLS_START_SEQUENCE_AS_START_NUMBER = 0,
+    HLS_START_SEQUENCE_AS_SECONDS_SINCE_EPOCH = 1,
+    HLS_START_SEQUENCE_AS_FORMATTED_DATETIME = 2,  // YYYYMMDDhhmmss
 } StartSequenceSourceType;
 
 typedef enum {
@@ -64,17 +64,19 @@
 } CodecAttributeStatus;
 
 #define KEYSIZE 16
-#define LINE_BUFFER_SIZE 1024
+#define LINE_BUFFER_SIZE MAX_URL_SIZE
 #define HLS_MICROSECOND_UNIT   1000000
 #define POSTFIX_PATTERN "_%d"
 
 typedef struct HLSSegment {
-    char filename[1024];
-    char sub_filename[1024];
+    char filename[MAX_URL_SIZE];
+    char sub_filename[MAX_URL_SIZE];
     double duration; /* in seconds */
     int discont;
     int64_t pos;
     int64_t size;
+    int64_t keyframe_pos;
+    int64_t keyframe_size;
     unsigned var_stream_idx;
 
     char key_uri[LINE_BUFFER_SIZE + 1];
@@ -99,6 +101,7 @@
     HLS_TEMP_FILE = (1 << 11),
     HLS_PERIODIC_REKEY = (1 << 12),
     HLS_INDEPENDENT_SEGMENTS = (1 << 13),
+    HLS_I_FRAMES_ONLY = (1 << 14),
 } HLSFlags;
 
 typedef enum {
@@ -110,11 +113,13 @@
     unsigned var_stream_idx;
     unsigned number;
     int64_t sequence;
-    AVOutputFormat *oformat;
-    AVOutputFormat *vtt_oformat;
+    ff_const59 AVOutputFormat *oformat;
+    ff_const59 AVOutputFormat *vtt_oformat;
     AVIOContext *out;
     int packets_written;
     int init_range_length;
+    uint8_t *temp_buffer;
+    uint8_t *init_buffer;
 
     AVFormatContext *avf;
     AVFormatContext *vtt_avf;
@@ -122,9 +127,13 @@
     int has_video;
     int has_subtitle;
     int new_start;
+    int start_pts_from_audio;
     double dpp;           // duration per packet
     int64_t start_pts;
     int64_t end_pts;
+    int64_t video_lastpos;
+    int64_t video_keyframe_pos;
+    int64_t video_keyframe_size;
     double duration;      // last segment duration computed so far, in seconds
     int64_t start_pos;    // last segment starting position
     int64_t size;         // last segment size
@@ -143,20 +152,23 @@
     char *m3u8_name;
 
     double initial_prog_date_time;
-    char current_segment_final_filename_fmt[1024]; // when renaming segments
+    char current_segment_final_filename_fmt[MAX_URL_SIZE]; // when renaming segments
 
     char *fmp4_init_filename;
     char *base_output_dirname;
-    int fmp4_init_mode;
 
     AVStream **streams;
     char codec_attr[128];
     CodecAttributeStatus attr_status;
     unsigned int nb_streams;
     int m3u8_created; /* status of media play-list creation */
+    int is_default; /* default status of audio group */
+    char *language; /* audio lauguage name */
     char *agroup; /* audio group name */
+    char *sgroup; /* subtitle group name */
     char *ccgroup; /* closed caption group name */
     char *baseurl;
+    char *varname; // variant name
 } VariantStream;
 
 typedef struct ClosedCaptionsStream {
@@ -182,6 +194,7 @@
     char *segment_filename;
     char *fmp4_init_filename;
     int segment_type;
+    int resend_init_file;  ///< resend init file into disk after refresh m3u8
 
     int use_localtime;      ///< flag to expand filename with localtime
     int use_localtime_mkdir;///< flag to mkdir dirname in timebased filename
@@ -190,7 +203,6 @@
     int64_t max_seg_size; // every segment file max size
 
     char *baseurl;
-    char *format_options_str;
     char *vtt_format_options_str;
     char *subtitle_filename;
     AVDictionary *format_options;
@@ -228,10 +240,15 @@
     AVIOContext *m3u8_out;
     AVIOContext *sub_m3u8_out;
     int64_t timeout;
+    int ignore_io_errors;
+    char *headers;
+    int has_default_key; /* has DEFAULT field of var_stream_map */
+    int has_video_m3u8; /* has video stream m3u8 list */
 } HLSContext;
 
 static int hlsenc_io_open(AVFormatContext *s, AVIOContext **pb, char *filename,
-                          AVDictionary **options) {
+                          AVDictionary **options)
+{
     HLSContext *hls = s->priv_data;
     int http_base_proto = filename ? ff_is_http_proto(filename) : 0;
     int err = AVERROR_MUXER_NOT_FOUND;
@@ -242,14 +259,21 @@
         URLContext *http_url_context = ffio_geturlcontext(*pb);
         av_assert0(http_url_context);
         err = ff_http_do_new_request(http_url_context, filename);
+        if (err < 0)
+            ff_format_io_close(s, pb);
+
 #endif
     }
     return err;
 }
 
-static void hlsenc_io_close(AVFormatContext *s, AVIOContext **pb, char *filename) {
+static int hlsenc_io_close(AVFormatContext *s, AVIOContext **pb, char *filename)
+{
     HLSContext *hls = s->priv_data;
     int http_base_proto = filename ? ff_is_http_proto(filename) : 0;
+    int ret = 0;
+    if (!*pb)
+        return ret;
     if (!http_base_proto || !hls->http_persistent || hls->key_info_file || hls->encrypt) {
         ff_format_io_close(s, pb);
 #if CONFIG_HTTP_PROTOCOL
@@ -258,8 +282,10 @@
         av_assert0(http_url_context);
         avio_flush(*pb);
         ffurl_shutdown(http_url_context, AVIO_FLAG_WRITE);
+        ret = ff_http_get_shutdown_status(http_url_context);
 #endif
     }
+    return ret;
 }
 
 static void set_http_options(AVFormatContext *s, AVDictionary **options, HLSContext *c)
@@ -269,7 +295,6 @@
     if (c->method) {
         av_dict_set(options, "method", c->method, 0);
     } else if (http_base_proto) {
-        av_log(c, AV_LOG_WARNING, "No HTTP method set, hls muxer defaulting to method PUT.\n");
         av_dict_set(options, "method", "PUT", 0);
     }
     if (c->user_agent)
@@ -278,9 +303,12 @@
         av_dict_set_int(options, "multiple_requests", 1, 0);
     if (c->timeout >= 0)
         av_dict_set_int(options, "timeout", c->timeout, 0);
+    if (c->headers)
+        av_dict_set(options, "headers", c->headers, 0);
 }
 
-static void write_codec_attr(AVStream *st, VariantStream *vs) {
+static void write_codec_attr(AVStream *st, VariantStream *vs)
+{
     int codec_strlen = strlen(vs->codec_attr);
     char attr[32];
 
@@ -325,6 +353,47 @@
     return;
 }
 
+static int replace_str_data_in_filename(char **s, const char *filename, char placeholder, const char *datastring)
+{
+    const char *p;
+    char *new_filename;
+    char c;
+    int addchar_count;
+    int found_count = 0;
+    AVBPrint buf;
+
+    av_bprint_init(&buf, 0, AV_BPRINT_SIZE_UNLIMITED);
+
+    p = filename;
+    for (;;) {
+        c = *p;
+        if (c == '\0')
+            break;
+        if (c == '%' && *(p+1) == '%')  // %%
+            addchar_count = 2;
+        else if (c == '%' && *(p+1) == placeholder) {
+            av_bprintf(&buf, "%s", datastring);
+            p += 2;
+            addchar_count = 0;
+            found_count ++;
+        } else
+            addchar_count = 1;
+
+        if (addchar_count > 0) {
+            av_bprint_append_data(&buf, p, addchar_count);
+            p += addchar_count;
+        }
+    }
+    if (!av_bprint_is_complete(&buf)) {
+        av_bprint_finalize(&buf, NULL);
+        return -1;
+    }
+    if (av_bprint_finalize(&buf, &new_filename) < 0 || !new_filename)
+        return -1;
+    *s = new_filename;
+    return found_count;
+}
+
 static int replace_int_data_in_filename(char **s, const char *filename, char placeholder, int64_t number)
 {
     const char *p;
@@ -387,7 +456,6 @@
 static int flush_dynbuf(VariantStream *vs, int *range_length)
 {
     AVFormatContext *ctx = vs->avf;
-    uint8_t *buffer;
 
     if (!ctx->pb) {
         return AVERROR(EINVAL);
@@ -395,31 +463,67 @@
 
     // flush
     av_write_frame(ctx, NULL);
-    avio_flush(ctx->pb);
 
     // write out to file
-    *range_length = avio_close_dyn_buf(ctx->pb, &buffer);
+    *range_length = avio_close_dyn_buf(ctx->pb, &vs->temp_buffer);
     ctx->pb = NULL;
-    avio_write(vs->out, buffer, *range_length);
-    av_free(buffer);
+    avio_write(vs->out, vs->temp_buffer, *range_length);
+    avio_flush(vs->out);
 
     // re-open buffer
     return avio_open_dyn_buf(&ctx->pb);
 }
 
+static void reflush_dynbuf(VariantStream *vs, int *range_length)
+{
+    // re-open buffer
+    avio_write(vs->out, vs->temp_buffer, *range_length);
+}
+
+#if HAVE_DOS_PATHS
+#define SEPARATOR '\\'
+#else
+#define SEPARATOR '/'
+#endif
+
+static int hls_delete_file(HLSContext *hls, AVFormatContext *avf,
+                           const char *path, const char *proto)
+{
+    if (hls->method || (proto && !av_strcasecmp(proto, "http"))) {
+        AVDictionary *opt = NULL;
+        AVIOContext  *out = NULL;
+        int ret;
+        av_dict_set(&opt, "method", "DELETE", 0);
+        ret = avf->io_open(avf, &out, path, AVIO_FLAG_WRITE, &opt);
+        av_dict_free(&opt);
+        if (ret < 0)
+            return hls->ignore_io_errors ? 1 : ret;
+        ff_format_io_close(avf, &out);
+    } else if (unlink(path) < 0) {
+        av_log(hls, AV_LOG_ERROR, "failed to delete old segment %s: %s\n",
+               path, strerror(errno));
+    }
+    return 0;
+}
+
 static int hls_delete_old_segments(AVFormatContext *s, HLSContext *hls,
-                                   VariantStream *vs) {
+                                   VariantStream *vs)
+{
 
     HLSSegment *segment, *previous_segment = NULL;
     float playlist_duration = 0.0f;
-    int ret = 0, path_size, sub_path_size;
+    int ret = 0;
     int segment_cnt = 0;
-    char *dirname = NULL, *p, *sub_path;
-    char *path = NULL;
-    AVDictionary *options = NULL;
-    AVIOContext *out = NULL;
+    AVBPrint path;
+    char *dirname = NULL;
+    char *dirname_r = NULL;
+    char *dirname_repl = NULL;
+    char *vtt_dirname = NULL;
+    char *vtt_dirname_r = NULL;
     const char *proto = NULL;
 
+    av_bprint_init(&path, 0, AV_BPRINT_SIZE_UNLIMITED);
+
     segment = vs->segments;
     while (segment) {
         playlist_duration += segment->duration;
@@ -444,94 +548,71 @@
     }
 
     if (segment && !hls->use_localtime_mkdir) {
-        if (hls->segment_filename) {
-            dirname = av_strdup(hls->segment_filename);
-        } else {
-            dirname = av_strdup(vs->avf->url);
-        }
-        if (!dirname) {
-            ret = AVERROR(ENOMEM);
-            goto fail;
-        }
-        p = (char *)av_basename(dirname);
-        *p = '\0';
-
+        dirname_r = hls->segment_filename ? av_strdup(hls->segment_filename): av_strdup(vs->avf->url);
+        dirname = (char*)av_dirname(dirname_r);
     }
 
-    while (segment) {
-        char * r_dirname = dirname;
-
-        /* if %v is present in the file's directory */
-        if (av_stristr(dirname, "%v")) {
-
-            if (replace_int_data_in_filename(&r_dirname, dirname, 'v', segment->var_stream_idx) < 1) {
+    /* if %v is present in the file's directory
+     * all segment belongs to the same variant, so do it only once before the loop*/
+    if (dirname && av_stristr(dirname, "%v")) {
+        if (!vs->varname) {
+            if (replace_int_data_in_filename(&dirname_repl, dirname, 'v', segment->var_stream_idx) < 1) {
                 ret = AVERROR(EINVAL);
                 goto fail;
             }
-            av_free(dirname);
-            dirname = r_dirname;
+        } else {
+            if (replace_str_data_in_filename(&dirname_repl, dirname, 'v', vs->varname) < 1) {
+                ret = AVERROR(EINVAL);
+                goto fail;
+            }
         }
 
+        dirname = dirname_repl;
+    }
+
+    while (segment) {
         av_log(hls, AV_LOG_DEBUG, "deleting old segment %s\n",
-                                  segment->filename);
-        path_size =  (hls->use_localtime_mkdir ? 0 : strlen(dirname)) + strlen(segment->filename) + 1;
-        path = av_malloc(path_size);
-        if (!path) {
+               segment->filename);
+        if (!hls->use_localtime_mkdir) // segment->filename contains basename only
+            av_bprintf(&path, "%s%c", dirname, SEPARATOR);
+        av_bprintf(&path, "%s", segment->filename);
+
+        if (!av_bprint_is_complete(&path)) {
             ret = AVERROR(ENOMEM);
             goto fail;
         }
 
-        if (hls->use_localtime_mkdir)
-            av_strlcpy(path, segment->filename, path_size);
-        else { // segment->filename contains basename only
-            av_strlcpy(path, dirname, path_size);
-            av_strlcat(path, segment->filename, path_size);
-        }
-
         proto = avio_find_protocol_name(s->url);
-        if (hls->method || (proto && !av_strcasecmp(proto, "http"))) {
-            av_dict_set(&options, "method", "DELETE", 0);
-            if ((ret = vs->avf->io_open(vs->avf, &out, path, AVIO_FLAG_WRITE, &options)) < 0)
-                goto fail;
-            ff_format_io_close(vs->avf, &out);
-        } else if (unlink(path) < 0) {
-            av_log(hls, AV_LOG_ERROR, "failed to delete old segment %s: %s\n",
-                                     path, strerror(errno));
-        }
+        if (ret = hls_delete_file(hls, vs->avf, path.str, proto))
+            goto fail;
 
         if ((segment->sub_filename[0] != '\0')) {
-            sub_path_size = strlen(segment->sub_filename) + 1 + (dirname ? strlen(dirname) : 0);
-            sub_path = av_malloc(sub_path_size);
-            if (!sub_path) {
+            vtt_dirname_r = av_strdup(vs->vtt_avf->url);
+            vtt_dirname = (char*)av_dirname(vtt_dirname_r);
+
+            av_bprint_clear(&path);
+            av_bprintf(&path, "%s%c%s", vtt_dirname, SEPARATOR,
+                                         segment->sub_filename);
+            av_freep(&vtt_dirname_r);
+
+            if (!av_bprint_is_complete(&path)) {
                 ret = AVERROR(ENOMEM);
                 goto fail;
             }
 
-            av_strlcpy(sub_path, dirname, sub_path_size);
-            av_strlcat(sub_path, segment->sub_filename, sub_path_size);
-
-            if (hls->method || (proto && !av_strcasecmp(proto, "http"))) {
-                av_dict_set(&options, "method", "DELETE", 0);
-                if ((ret = vs->avf->io_open(vs->avf, &out, sub_path, AVIO_FLAG_WRITE, &options)) < 0) {
-                    av_free(sub_path);
-                    goto fail;
-                }
-                ff_format_io_close(vs->avf, &out);
-            } else if (unlink(sub_path) < 0) {
-                av_log(hls, AV_LOG_ERROR, "failed to delete old segment %s: %s\n",
-                                         sub_path, strerror(errno));
-            }
-            av_free(sub_path);
+            if (ret = hls_delete_file(hls, vs->vtt_avf, path.str, proto))
+                goto fail;
         }
-        av_freep(&path);
+        av_bprint_clear(&path);
         previous_segment = segment;
         segment = previous_segment->next;
-        av_free(previous_segment);
+        av_freep(&previous_segment);
     }
 
 fail:
-    av_free(path);
-    av_free(dirname);
+    av_bprint_finalize(&path, NULL);
+    av_freep(&dirname_r);
+    av_freep(&dirname_repl);
 
     return ret;
 }
@@ -557,13 +638,14 @@
     int len;
     AVIOContext *pb;
     uint8_t key[KEYSIZE];
+    char * key_basename_source = (hls->master_m3u8_url) ? hls->master_m3u8_url : s->url;
 
-    len = strlen(s->url) + 4 + 1;
+    len = strlen(key_basename_source) + 4 + 1;
     hls->key_basename = av_mallocz(len);
     if (!hls->key_basename)
         return AVERROR(ENOMEM);
 
-    av_strlcpy(hls->key_basename, s->url, len);
+    av_strlcpy(hls->key_basename, key_basename_source, len);
     av_strlcat(hls->key_basename, ".key", len);
 
     if (hls->key_url) {
@@ -599,6 +681,7 @@
     }
 
     if (!*hls->key_string) {
+        AVDictionary *options = NULL;
         if (!hls->key) {
             if ((ret = randomize(key, sizeof(key))) < 0) {
                 av_log(s, AV_LOG_ERROR, "Cannot generate a strong random key\n");
@@ -609,7 +692,10 @@
         }
 
         ff_data_to_hex(hls->key_string, key, sizeof(key), 0);
-        if ((ret = s->io_open(s, &pb, hls->key_file, AVIO_FLAG_WRITE, NULL)) < 0)
+        set_http_options(s, &options, hls);
+        ret = s->io_open(s, &pb, hls->key_file, AVIO_FLAG_WRITE, &options);
+        av_dict_free(&options);
+        if (ret < 0)
             return ret;
         avio_seek(pb, 0, SEEK_CUR);
         avio_write(pb, key, KEYSIZE);
@@ -625,10 +711,14 @@
     int ret;
     AVIOContext *pb;
     uint8_t key[KEYSIZE];
+    AVDictionary *options = NULL;
 
-    if ((ret = s->io_open(s, &pb, hls->key_info_file, AVIO_FLAG_READ, NULL)) < 0) {
+    set_http_options(s, &options, hls);
+    ret = s->io_open(s, &pb, hls->key_info_file, AVIO_FLAG_READ, &options);
+    av_dict_free(&options);
+    if (ret < 0) {
         av_log(hls, AV_LOG_ERROR,
-                "error opening key info file %s\n", hls->key_info_file);
+               "error opening key info file %s\n", hls->key_info_file);
         return ret;
     }
 
@@ -653,7 +743,10 @@
         return AVERROR(EINVAL);
     }
 
-    if ((ret = s->io_open(s, &pb, hls->key_file, AVIO_FLAG_READ, NULL)) < 0) {
+    set_http_options(s, &options, hls);
+    ret = s->io_open(s, &pb, hls->key_file, AVIO_FLAG_READ, &options);
+    av_dict_free(&options);
+    if (ret < 0) {
         av_log(hls, AV_LOG_ERROR, "error opening key file %s\n", hls->key_file);
         return ret;
     }
@@ -678,6 +771,7 @@
     AVFormatContext *oc;
     AVFormatContext *vtt_oc = NULL;
     int byterange_mode = (hls->flags & HLS_SINGLE_FILE) || (hls->max_seg_size > 0);
+    int remaining_options;
     int i, ret;
 
     ret = avformat_alloc_output_context2(&vs->avf, vs->oformat, NULL, NULL);
@@ -689,15 +783,16 @@
     if (!oc->url)
         return AVERROR(ENOMEM);
 
-    oc->oformat            = vs->oformat;
-    oc->interrupt_callback = s->interrupt_callback;
-    oc->max_delay          = s->max_delay;
-    oc->opaque             = s->opaque;
-    oc->io_open            = s->io_open;
-    oc->io_close           = s->io_close;
+    oc->oformat                  = vs->oformat;
+    oc->interrupt_callback       = s->interrupt_callback;
+    oc->max_delay                = s->max_delay;
+    oc->opaque                   = s->opaque;
+    oc->io_open                  = s->io_open;
+    oc->io_close                 = s->io_close;
+    oc->strict_std_compliance    = s->strict_std_compliance;
     av_dict_copy(&oc->metadata, s->metadata, 0);
 
-    if(vs->vtt_oformat) {
+    if (vs->vtt_oformat) {
         ret = avformat_alloc_output_context2(&vs->vtt_avf, vs->vtt_oformat, NULL, NULL);
         if (ret < 0)
             return ret;
@@ -733,55 +828,59 @@
     vs->packets_written = 1;
     vs->start_pos = 0;
     vs->new_start = 1;
-    vs->fmp4_init_mode = 0;
 
-    if (hls->segment_type == SEGMENT_TYPE_FMP4) {
+    if (hls->segment_type == SEGMENT_TYPE_FMP4 && hls->max_seg_size > 0) {
+        if (hls->http_persistent > 0) {
+            //TODO: Support fragment fmp4 for http persistent in HLS muxer.
+            av_log(s, AV_LOG_WARNING, "http persistent mode is currently unsupported for fragment mp4 in the HLS muxer.\n");
+        }
         if (hls->max_seg_size > 0) {
             av_log(s, AV_LOG_WARNING, "Multi-file byterange mode is currently unsupported in the HLS muxer.\n");
             return AVERROR_PATCHWELCOME;
         }
+    }
 
-        vs->packets_written = 0;
-        vs->init_range_length = 0;
-        vs->fmp4_init_mode = !byterange_mode;
+    vs->packets_written = 0;
+    vs->init_range_length = 0;
+
+    if ((ret = avio_open_dyn_buf(&oc->pb)) < 0)
+        return ret;
+
+    if (hls->segment_type == SEGMENT_TYPE_FMP4) {
         set_http_options(s, &options, hls);
-        if ((ret = avio_open_dyn_buf(&oc->pb)) < 0)
-            return ret;
-
         if (byterange_mode) {
             ret = hlsenc_io_open(s, &vs->out, vs->basename, &options);
         } else {
             ret = hlsenc_io_open(s, &vs->out, vs->base_output_dirname, &options);
         }
         av_dict_free(&options);
-        if (ret < 0) {
-            av_log(s, AV_LOG_ERROR, "Failed to open segment '%s'\n", vs->fmp4_init_filename);
-            return ret;
-        }
-
-        if (hls->format_options_str) {
-            ret = av_dict_parse_string(&hls->format_options, hls->format_options_str, "=", ":", 0);
-            if (ret < 0) {
-                av_log(s, AV_LOG_ERROR, "Could not parse format options list '%s'\n",
-                       hls->format_options_str);
-                return ret;
-            }
-        }
-
-        av_dict_copy(&options, hls->format_options, 0);
-        av_dict_set(&options, "fflags", "-autobsf", 0);
-        av_dict_set(&options, "movflags", "frag_custom+dash+delay_moov", 0);
-        ret = avformat_init_output(oc, &options);
-        if (ret < 0)
-            return ret;
-        if (av_dict_count(options)) {
-            av_log(s, AV_LOG_ERROR, "Some of the provided format options in '%s' are not recognized\n", hls->format_options_str);
-            av_dict_free(&options);
-            return AVERROR(EINVAL);
-        }
-        avio_flush(oc->pb);
-        av_dict_free(&options);
     }
+    if (ret < 0) {
+        av_log(s, AV_LOG_ERROR, "Failed to open segment '%s'\n", vs->fmp4_init_filename);
+        return ret;
+    }
+
+    av_dict_copy(&options, hls->format_options, 0);
+    if (hls->segment_type == SEGMENT_TYPE_FMP4) {
+        av_dict_set(&options, "fflags", "-autobsf", 0);
+        av_dict_set(&options, "movflags", "+frag_custom+dash+delay_moov", AV_DICT_APPEND);
+    } else {
+        /* We only require one PAT/PMT per segment. */
+        char period[21];
+        snprintf(period, sizeof(period), "%d", (INT_MAX / 2) - 1);
+        av_dict_set(&options, "sdt_period", period, AV_DICT_DONT_OVERWRITE);
+        av_dict_set(&options, "pat_period", period, AV_DICT_DONT_OVERWRITE);
+    }
+    ret = avformat_init_output(oc, &options);
+    remaining_options = av_dict_count(options);
+    av_dict_free(&options);
+    if (ret < 0)
+        return ret;
+    if (remaining_options) {
+        av_log(s, AV_LOG_ERROR, "Some of the provided format options are not recognized\n");
+        return AVERROR(EINVAL);
+    }
+    avio_flush(oc->pb);
     return 0;
 }
 
@@ -803,7 +902,6 @@
         strlen(vs->current_segment_final_filename_fmt)) {
         char * new_url = av_strdup(vs->current_segment_final_filename_fmt);
         if (!new_url) {
-            av_free(en);
             return AVERROR(ENOMEM);
         }
         ff_format_set_url(vs->avf, new_url);
@@ -812,10 +910,9 @@
             if (replace_int_data_in_filename(&filename, vs->avf->url, 's', pos + size) < 1) {
                 av_log(hls, AV_LOG_ERROR,
                        "Invalid second level segment filename template '%s', "
-                        "you can try to remove second_level_segment_size flag\n",
+                       "you can try to remove second_level_segment_size flag\n",
                        vs->avf->url);
-                av_free(filename);
-                av_free(en);
+                av_freep(&filename);
                 return AVERROR(EINVAL);
             }
             ff_format_set_url(vs->avf, filename);
@@ -823,13 +920,12 @@
         if (hls->flags & HLS_SECOND_LEVEL_SEGMENT_DURATION) {
             char *filename = NULL;
             if (replace_int_data_in_filename(&filename, vs->avf->url,
-                't',  (int64_t)round(duration * HLS_MICROSECOND_UNIT)) < 1) {
+                                             't',  (int64_t)round(duration * HLS_MICROSECOND_UNIT)) < 1) {
                 av_log(hls, AV_LOG_ERROR,
                        "Invalid second level segment filename template '%s', "
-                        "you can try to remove second_level_segment_time flag\n",
+                       "you can try to remove second_level_segment_time flag\n",
                        vs->avf->url);
-                av_free(filename);
-                av_free(en);
+                av_freep(&filename);
                 return AVERROR(EINVAL);
             }
             ff_format_set_url(vs->avf, filename);
@@ -843,14 +939,14 @@
     int ret = 0;
 
     if (hls->flags & HLS_SECOND_LEVEL_SEGMENT_DURATION) {
-         av_log(hls, AV_LOG_ERROR,
-                "second_level_segment_duration hls_flag requires strftime to be true\n");
-         ret = AVERROR(EINVAL);
+        av_log(hls, AV_LOG_ERROR,
+               "second_level_segment_duration hls_flag requires strftime to be true\n");
+        ret = AVERROR(EINVAL);
     }
     if (hls->flags & HLS_SECOND_LEVEL_SEGMENT_SIZE) {
-         av_log(hls, AV_LOG_ERROR,
-                "second_level_segment_size hls_flag requires strfime to be true\n");
-         ret = AVERROR(EINVAL);
+        av_log(hls, AV_LOG_ERROR,
+               "second_level_segment_size hls_flag requires strfime to be true\n");
+        ret = AVERROR(EINVAL);
     }
     if (hls->flags & HLS_SECOND_LEVEL_SEGMENT_INDEX) {
         av_log(hls, AV_LOG_ERROR,
@@ -868,14 +964,14 @@
     int ret = 0;
 
     if ((hls->flags & HLS_SECOND_LEVEL_SEGMENT_DURATION) && !segment_renaming_ok) {
-         av_log(hls, AV_LOG_ERROR,
-                "second_level_segment_duration hls_flag works only with file protocol segment names\n");
-         ret = AVERROR(EINVAL);
+        av_log(hls, AV_LOG_ERROR,
+               "second_level_segment_duration hls_flag works only with file protocol segment names\n");
+        ret = AVERROR(EINVAL);
     }
     if ((hls->flags & HLS_SECOND_LEVEL_SEGMENT_SIZE) && !segment_renaming_ok) {
-         av_log(hls, AV_LOG_ERROR,
-                "second_level_segment_size hls_flag works only with file protocol segment names\n");
-         ret = AVERROR(EINVAL);
+        av_log(hls, AV_LOG_ERROR,
+               "second_level_segment_size hls_flag works only with file protocol segment names\n");
+        ret = AVERROR(EINVAL);
     }
 
     return ret;
@@ -901,7 +997,7 @@
             av_log(c, AV_LOG_ERROR, "Invalid second level segment filename template '%s', "
                     "you can try to remove second_level_segment_index flag\n",
                    oc->url);
-            av_free(filename);
+            av_freep(&filename);
             return AVERROR(EINVAL);
         }
         ff_format_set_url(oc, filename);
@@ -915,7 +1011,7 @@
                 av_log(c, AV_LOG_ERROR, "Invalid second level segment filename template '%s', "
                         "you can try to remove second_level_segment_size flag\n",
                        oc->url);
-                av_free(filename);
+                av_freep(&filename);
                 return AVERROR(EINVAL);
             }
             ff_format_set_url(oc, filename);
@@ -926,7 +1022,7 @@
                 av_log(c, AV_LOG_ERROR, "Invalid second level segment filename template '%s', "
                         "you can try to remove second_level_segment_time flag\n",
                        oc->url);
-                av_free(filename);
+                av_freep(&filename);
                 return AVERROR(EINVAL);
             }
             ff_format_set_url(oc, filename);
@@ -951,6 +1047,7 @@
     en->var_stream_idx = vs->var_stream_idx;
     ret = sls_flags_filename_process(s, hls, vs, en, duration, pos, size);
     if (ret < 0) {
+        av_freep(&en);
         return ret;
     }
 
@@ -965,7 +1062,7 @@
     }
     av_strlcpy(en->filename, filename, sizeof(en->filename));
 
-    if(vs->has_subtitle)
+    if (vs->has_subtitle)
         av_strlcpy(en->sub_filename, av_basename(vs->vtt_avf->url), sizeof(en->sub_filename));
     else
         en->sub_filename[0] = '\0';
@@ -973,6 +1070,8 @@
     en->duration = duration;
     en->pos      = pos;
     en->size     = size;
+    en->keyframe_pos      = vs->video_keyframe_pos;
+    en->keyframe_size     = vs->video_keyframe_size;
     en->next     = NULL;
     en->discont  = 0;
 
@@ -1012,7 +1111,7 @@
             if ((ret = hls_delete_old_segments(s, hls, vs)) < 0)
                 return ret;
         } else
-            av_free(en);
+            av_freep(&en);
     } else
         vs->nb_entries++;
 
@@ -1030,7 +1129,7 @@
     AVIOContext *in;
     int ret = 0, is_segment = 0;
     int64_t new_start_pos;
-    char line[1024];
+    char line[MAX_URL_SIZE];
     const char *ptr;
     const char *end;
 
@@ -1101,6 +1200,7 @@
                 is_segment = 0;
                 new_start_pos = avio_tell(vs->avf->pb);
                 vs->size = new_start_pos - vs->start_pos;
+                vs->initial_prog_date_time -= vs->duration; // this is a previously existing segment
                 ret = hls_append_segment(s, hls, vs, vs->duration, vs->start_pos, vs->size);
                 if (ret < 0)
                     goto fail;
@@ -1118,10 +1218,10 @@
 {
     HLSSegment *en;
 
-    while(p) {
+    while (p) {
         en = p;
         p = p->next;
-        av_free(en);
+        av_freep(&en);
     }
 }
 
@@ -1140,25 +1240,28 @@
     return ret;
 }
 
-static int get_relative_url(const char *master_url, const char *media_url,
-                            char *rel_url, int rel_url_buf_size)
+static const char* get_relative_url(const char *master_url, const char *media_url)
 {
-    char *p = NULL;
-    int base_len = -1;
-    p = strrchr(master_url, '/') ? strrchr(master_url, '/') :\
-            strrchr(master_url, '\\');
+    const char *p = strrchr(master_url, '/');
+    size_t base_len = 0;
+
+    if (!p) p = strrchr(master_url, '\\');
+
     if (p) {
-        base_len = FFABS(p - master_url);
+        base_len = p - master_url;
         if (av_strncasecmp(master_url, media_url, base_len)) {
             av_log(NULL, AV_LOG_WARNING, "Unable to find relative url\n");
-            return AVERROR(EINVAL);
+            return NULL;
         }
+    } else {
+        return media_url;
     }
-    av_strlcpy(rel_url, &(media_url[base_len + 1]), rel_url_buf_size);
-    return 0;
+
+    return media_url + base_len + 1;
 }
 
-static int64_t get_stream_bit_rate(AVStream *stream) {
+static int64_t get_stream_bit_rate(AVStream *stream)
+{
     AVCPBProperties *props = (AVCPBProperties*)av_stream_get_side_data(
         stream,
         AV_PKT_DATA_CPB_PROPERTIES,
@@ -1181,9 +1284,16 @@
     AVStream *vid_st, *aud_st;
     AVDictionary *options = NULL;
     unsigned int i, j;
-    int m3u8_name_size, ret, bandwidth;
-    char *m3u8_rel_name, *ccgroup;
+    int ret, bandwidth;
+    const char *m3u8_rel_name = NULL;
+    const char *vtt_m3u8_rel_name = NULL;
+    char *ccgroup;
+    char *sgroup = NULL;
     ClosedCaptionsStream *ccs;
+    const char *proto = avio_find_protocol_name(hls->master_m3u8_url);
+    int is_file_proto = proto && !strcmp(proto, "file");
+    int use_temp_file = is_file_proto && ((hls->flags & HLS_TEMP_FILE) || hls->master_publish_rate);
+    char temp_filename[MAX_URL_SIZE];
 
     input_vs->m3u8_created = 1;
     if (!hls->master_m3u8_created) {
@@ -1199,12 +1309,12 @@
     }
 
     set_http_options(s, &options, hls);
-
-    ret = hlsenc_io_open(s, &hls->m3u8_out, hls->master_m3u8_url, &options);
+    snprintf(temp_filename, sizeof(temp_filename), use_temp_file ? "%s.tmp" : "%s", hls->master_m3u8_url);
+    ret = hlsenc_io_open(s, &hls->m3u8_out, temp_filename, &options);
     av_dict_free(&options);
     if (ret < 0) {
-        av_log(NULL, AV_LOG_ERROR, "Failed to open master play list file '%s'\n",
-                hls->master_m3u8_url);
+        av_log(s, AV_LOG_ERROR, "Failed to open master play list file '%s'\n",
+                temp_filename);
         goto fail;
     }
 
@@ -1227,40 +1337,22 @@
         if (vs->has_video || vs->has_subtitle || !vs->agroup)
             continue;
 
-        m3u8_name_size = strlen(vs->m3u8_name) + 1;
-        m3u8_rel_name = av_malloc(m3u8_name_size);
+        m3u8_rel_name = get_relative_url(hls->master_m3u8_url, vs->m3u8_name);
         if (!m3u8_rel_name) {
-            ret = AVERROR(ENOMEM);
-            goto fail;
-        }
-        av_strlcpy(m3u8_rel_name, vs->m3u8_name, m3u8_name_size);
-        ret = get_relative_url(hls->master_m3u8_url, vs->m3u8_name,
-                               m3u8_rel_name, m3u8_name_size);
-        if (ret < 0) {
             av_log(s, AV_LOG_ERROR, "Unable to find relative URL\n");
             goto fail;
         }
 
-        ff_hls_write_audio_rendition(hls->m3u8_out, vs->agroup, m3u8_rel_name, 0, 1);
-
-        av_freep(&m3u8_rel_name);
+        ff_hls_write_audio_rendition(hls->m3u8_out, vs->agroup, m3u8_rel_name, vs->language, i, hls->has_default_key ? vs->is_default : 1);
     }
 
     /* For variant streams with video add #EXT-X-STREAM-INF tag with attributes*/
     for (i = 0; i < hls->nb_varstreams; i++) {
         vs = &(hls->var_streams[i]);
 
-        m3u8_name_size = strlen(vs->m3u8_name) + 1;
-        m3u8_rel_name = av_malloc(m3u8_name_size);
+        m3u8_rel_name = get_relative_url(hls->master_m3u8_url, vs->m3u8_name);
         if (!m3u8_rel_name) {
-            ret = AVERROR(ENOMEM);
-            goto fail;
-        }
-        av_strlcpy(m3u8_rel_name, vs->m3u8_name, m3u8_name_size);
-        ret = get_relative_url(hls->master_m3u8_url, vs->m3u8_name,
-                               m3u8_rel_name, m3u8_name_size);
-        if (ret < 0) {
-            av_log(NULL, AV_LOG_ERROR, "Unable to find relative URL\n");
+            av_log(s, AV_LOG_ERROR, "Unable to find relative URL\n");
             goto fail;
         }
 
@@ -1274,7 +1366,7 @@
         }
 
         if (!vid_st && !aud_st) {
-            av_log(NULL, AV_LOG_WARNING, "Media stream not found\n");
+            av_log(s, AV_LOG_WARNING, "Media stream not found\n");
             continue;
         }
 
@@ -1315,20 +1407,38 @@
                 }
             }
             if (j == hls->nb_ccstreams)
-                av_log(NULL, AV_LOG_WARNING, "mapping ccgroup %s not found\n",
+                av_log(s, AV_LOG_WARNING, "mapping ccgroup %s not found\n",
                         vs->ccgroup);
         }
 
-        ff_hls_write_stream_info(vid_st, hls->m3u8_out, bandwidth, m3u8_rel_name,
-                aud_st ? vs->agroup : NULL, vs->codec_attr, ccgroup);
+        if (vid_st && vs->sgroup) {
+            sgroup = vs->sgroup;
+            vtt_m3u8_rel_name = get_relative_url(hls->master_m3u8_url, vs->vtt_m3u8_name);
+            if (!vtt_m3u8_rel_name) {
+                av_log(s, AV_LOG_WARNING, "Unable to find relative subtitle URL\n");
+                break;
+            }
 
-        av_freep(&m3u8_rel_name);
+            ff_hls_write_subtitle_rendition(hls->m3u8_out, sgroup, vtt_m3u8_rel_name, vs->language, i, hls->has_default_key ? vs->is_default : 1);
+        }
+
+        if (!hls->has_default_key || !hls->has_video_m3u8) {
+            ff_hls_write_stream_info(vid_st, hls->m3u8_out, bandwidth, m3u8_rel_name,
+                    aud_st ? vs->agroup : NULL, vs->codec_attr, ccgroup, sgroup);
+        } else {
+            if (vid_st) {
+                ff_hls_write_stream_info(vid_st, hls->m3u8_out, bandwidth, m3u8_rel_name,
+                                         aud_st ? vs->agroup : NULL, vs->codec_attr, ccgroup, sgroup);
+            }
+        }
     }
 fail:
-    if(ret >=0)
+    if (ret >=0)
         hls->master_m3u8_created = 1;
-    av_freep(&m3u8_rel_name);
-    hlsenc_io_close(s, &hls->m3u8_out, hls->master_m3u8_url);
+    hlsenc_io_close(s, &hls->m3u8_out, temp_filename);
+    if (use_temp_file)
+        ff_rename(temp_filename, hls->master_m3u8_url, s);
+
     return ret;
 }
 
@@ -1338,10 +1448,12 @@
     HLSSegment *en;
     int target_duration = 0;
     int ret = 0;
-    char temp_filename[1024];
+    char temp_filename[MAX_URL_SIZE];
+    char temp_vtt_filename[MAX_URL_SIZE];
     int64_t sequence = FFMAX(hls->start_sequence, vs->sequence - vs->nb_entries);
-    const char *proto = avio_find_protocol_name(s->url);
-    int use_temp_file = proto && !strcmp(proto, "file") && (s->flags & HLS_TEMP_FILE);
+    const char *proto = avio_find_protocol_name(vs->m3u8_name);
+    int is_file_proto = proto && !strcmp(proto, "file");
+    int use_temp_file = is_file_proto && ((hls->flags & HLS_TEMP_FILE) || !(hls->pl_type == PLAYLIST_TYPE_VOD));
     static unsigned warned_non_file;
     char *key_uri = NULL;
     char *iv_string = NULL;
@@ -1364,13 +1476,16 @@
         hls->version = 7;
     }
 
-    if (!use_temp_file && !warned_non_file++)
+    if (!is_file_proto && (hls->flags & HLS_TEMP_FILE) && !warned_non_file++)
         av_log(s, AV_LOG_ERROR, "Cannot use rename on non file protocol, this may lead to races and temporary partial files\n");
 
     set_http_options(s, &options, hls);
     snprintf(temp_filename, sizeof(temp_filename), use_temp_file ? "%s.tmp" : "%s", vs->m3u8_name);
-    if ((ret = hlsenc_io_open(s, &hls->m3u8_out, temp_filename, &options)) < 0)
+    if ((ret = hlsenc_io_open(s, byterange_mode ? &hls->m3u8_out : &vs->out, temp_filename, &options)) < 0) {
+        if (hls->ignore_io_errors)
+            ret = 0;
         goto fail;
+    }
 
     for (en = vs->segments; en; en = en->next) {
         if (target_duration <= en->duration)
@@ -1378,53 +1493,57 @@
     }
 
     vs->discontinuity_set = 0;
-    ff_hls_write_playlist_header(hls->m3u8_out, hls->version, hls->allowcache,
-                                 target_duration, sequence, hls->pl_type);
+    ff_hls_write_playlist_header(byterange_mode ? hls->m3u8_out : vs->out, hls->version, hls->allowcache,
+                                 target_duration, sequence, hls->pl_type, hls->flags & HLS_I_FRAMES_ONLY);
 
-    if((hls->flags & HLS_DISCONT_START) && sequence==hls->start_sequence && vs->discontinuity_set==0 ){
-        avio_printf(hls->m3u8_out, "#EXT-X-DISCONTINUITY\n");
+    if ((hls->flags & HLS_DISCONT_START) && sequence==hls->start_sequence && vs->discontinuity_set==0 ) {
+        avio_printf(byterange_mode ? hls->m3u8_out : vs->out, "#EXT-X-DISCONTINUITY\n");
         vs->discontinuity_set = 1;
     }
     if (vs->has_video && (hls->flags & HLS_INDEPENDENT_SEGMENTS)) {
-        avio_printf(hls->m3u8_out, "#EXT-X-INDEPENDENT-SEGMENTS\n");
+        avio_printf(byterange_mode ? hls->m3u8_out : vs->out, "#EXT-X-INDEPENDENT-SEGMENTS\n");
     }
     for (en = vs->segments; en; en = en->next) {
         if ((hls->encrypt || hls->key_info_file) && (!key_uri || strcmp(en->key_uri, key_uri) ||
                                     av_strcasecmp(en->iv_string, iv_string))) {
-            avio_printf(hls->m3u8_out, "#EXT-X-KEY:METHOD=AES-128,URI=\"%s\"", en->key_uri);
+            avio_printf(byterange_mode ? hls->m3u8_out : vs->out, "#EXT-X-KEY:METHOD=AES-128,URI=\"%s\"", en->key_uri);
             if (*en->iv_string)
-                avio_printf(hls->m3u8_out, ",IV=0x%s", en->iv_string);
-            avio_printf(hls->m3u8_out, "\n");
+                avio_printf(byterange_mode ? hls->m3u8_out : vs->out, ",IV=0x%s", en->iv_string);
+            avio_printf(byterange_mode ? hls->m3u8_out : vs->out, "\n");
             key_uri = en->key_uri;
             iv_string = en->iv_string;
         }
 
         if ((hls->segment_type == SEGMENT_TYPE_FMP4) && (en == vs->segments)) {
-            ff_hls_write_init_file(hls->m3u8_out, (hls->flags & HLS_SINGLE_FILE) ? en->filename : vs->fmp4_init_filename,
+            ff_hls_write_init_file(byterange_mode ? hls->m3u8_out : vs->out, (hls->flags & HLS_SINGLE_FILE) ? en->filename : vs->fmp4_init_filename,
                                    hls->flags & HLS_SINGLE_FILE, vs->init_range_length, 0);
         }
 
-        ret = ff_hls_write_file_entry(hls->m3u8_out, en->discont, byterange_mode,
+        ret = ff_hls_write_file_entry(byterange_mode ? hls->m3u8_out : vs->out, en->discont, byterange_mode,
                                       en->duration, hls->flags & HLS_ROUND_DURATIONS,
                                       en->size, en->pos, vs->baseurl,
-                                      en->filename, prog_date_time_p);
+                                      en->filename, prog_date_time_p, en->keyframe_size, en->keyframe_pos, hls->flags & HLS_I_FRAMES_ONLY);
         if (ret < 0) {
             av_log(s, AV_LOG_WARNING, "ff_hls_write_file_entry get error\n");
         }
     }
 
     if (last && (hls->flags & HLS_OMIT_ENDLIST)==0)
-        ff_hls_write_end_list(hls->m3u8_out);
+        ff_hls_write_end_list(byterange_mode ? hls->m3u8_out : vs->out);
 
-    if( vs->vtt_m3u8_name ) {
-        if ((ret = hlsenc_io_open(s, &hls->sub_m3u8_out, vs->vtt_m3u8_name, &options)) < 0)
+    if (vs->vtt_m3u8_name) {
+        snprintf(temp_vtt_filename, sizeof(temp_vtt_filename), use_temp_file ? "%s.tmp" : "%s", vs->vtt_m3u8_name);
+        if ((ret = hlsenc_io_open(s, &hls->sub_m3u8_out, temp_vtt_filename, &options)) < 0) {
+            if (hls->ignore_io_errors)
+                ret = 0;
             goto fail;
+        }
         ff_hls_write_playlist_header(hls->sub_m3u8_out, hls->version, hls->allowcache,
-                                     target_duration, sequence, PLAYLIST_TYPE_NONE);
+                                     target_duration, sequence, PLAYLIST_TYPE_NONE, 0);
         for (en = vs->segments; en; en = en->next) {
             ret = ff_hls_write_file_entry(hls->sub_m3u8_out, 0, byterange_mode,
                                           en->duration, 0, en->size, en->pos,
-                                          vs->baseurl, en->sub_filename, NULL);
+                                          vs->baseurl, en->sub_filename, NULL, 0, 0, 0);
             if (ret < 0) {
                 av_log(s, AV_LOG_WARNING, "ff_hls_write_file_entry get error\n");
             }
@@ -1437,11 +1556,16 @@
 
 fail:
     av_dict_free(&options);
-    hlsenc_io_close(s, &hls->m3u8_out, temp_filename);
+    ret = hlsenc_io_close(s, byterange_mode ? &hls->m3u8_out : &vs->out, temp_filename);
+    if (ret < 0) {
+        return ret;
+    }
     hlsenc_io_close(s, &hls->sub_m3u8_out, vs->vtt_m3u8_name);
-    if (use_temp_file)
+    if (use_temp_file) {
         ff_rename(temp_filename, vs->m3u8_name, s);
-
+        if (vs->vtt_m3u8_name)
+            ff_rename(temp_vtt_filename, vs->vtt_m3u8_name, s);
+    }
     if (ret >= 0 && hls->master_pl_name)
         if (create_master_playlist(s, vs) < 0)
             av_log(s, AV_LOG_WARNING, "Master playlist creation failed\n");
@@ -1455,9 +1579,9 @@
     AVFormatContext *oc = vs->avf;
     AVFormatContext *vtt_oc = vs->vtt_avf;
     AVDictionary *options = NULL;
-    const char *proto = avio_find_protocol_name(s->url);
-    int use_temp_file = proto && !strcmp(proto, "file") && (s->flags & HLS_TEMP_FILE);
-    char *filename, iv_string[KEYSIZE*2 + 1];
+    const char *proto = NULL;
+    int use_temp_file = 0;
+    char iv_string[KEYSIZE*2 + 1];
     int err = 0;
 
     if (c->flags & HLS_SINGLE_FILE) {
@@ -1479,7 +1603,7 @@
 #else
             vs->basename, 'd', vs->sequence) < 1) {
 #endif
-                av_free(filename);
+                av_freep(&filename);
                 av_log(oc, AV_LOG_ERROR, "Invalid segment filename template '%s', you can try to use -strftime 1 with it\n", vs->basename);
                 return AVERROR(EINVAL);
         }
@@ -1488,7 +1612,7 @@
         if (c->use_localtime) {
             time_t now0;
             struct tm *tm, tmpbuf;
-            int bufsize = strlen(vs->basename) + 1024;
+            int bufsize = strlen(vs->basename) + MAX_URL_SIZE;
             char *buf = av_mallocz(bufsize);
             if (!buf)
                 return AVERROR(ENOMEM);
@@ -1508,16 +1632,13 @@
             if (c->use_localtime_mkdir) {
                 const char *dir;
                 char *fn_copy = av_strdup(oc->url);
-                if (!fn_copy) {
-                    return AVERROR(ENOMEM);
-                }
                 dir = av_dirname(fn_copy);
                 if (ff_mkdir_p(dir) == -1 && errno != EEXIST) {
                     av_log(oc, AV_LOG_ERROR, "Could not create directory %s with use_localtime_mkdir\n", dir);
-                    av_free(fn_copy);
+                    av_freep(&fn_copy);
                     return AVERROR(errno);
                 }
-                av_free(fn_copy);
+                av_freep(&fn_copy);
             }
         } else {
             char *filename = NULL;
@@ -1527,13 +1648,13 @@
 #else
                    vs->basename, 'd', vs->sequence) < 1) {
 #endif
-                av_free(filename);
+                av_freep(&filename);
                 av_log(oc, AV_LOG_ERROR, "Invalid segment filename template '%s' you can try to use -strftime 1 with it\n", vs->basename);
                 return AVERROR(EINVAL);
             }
             ff_format_set_url(oc, filename);
         }
-        if( vs->vtt_basename) {
+        if ( vs->vtt_basename) {
             char *filename = NULL;
             if (replace_int_data_in_filename(&filename,
 #if FF_API_HLS_WRAP
@@ -1541,7 +1662,7 @@
 #else
                 vs->vtt_basename, 'd', vs->sequence) < 1) {
 #endif
-                av_free(filename);
+                av_freep(&filename);
                 av_log(vtt_oc, AV_LOG_ERROR, "Invalid segment filename template '%s'\n", vs->vtt_basename);
                 return AVERROR(EINVAL);
             }
@@ -1550,7 +1671,8 @@
     }
     vs->number++;
 
-    set_http_options(s, &options, c);
+    proto = avio_find_protocol_name(oc->url);
+    use_temp_file = proto && !strcmp(proto, "file") && (c->flags & HLS_TEMP_FILE);
 
     if (use_temp_file) {
         char *new_name = av_asprintf("%s.tmp", oc->url);
@@ -1580,48 +1702,35 @@
             }
             c->encrypt_started = 1;
         }
-        if ((err = av_dict_set(&options, "encryption_key", c->key_string, 0))
-                < 0)
-            goto fail;
         err = av_strlcpy(iv_string, c->iv_string, sizeof(iv_string));
-        if (!err)
+        if (!err) {
             snprintf(iv_string, sizeof(iv_string), "%032"PRIx64, vs->sequence);
-        if ((err = av_dict_set(&options, "encryption_iv", iv_string, 0)) < 0)
-           goto fail;
-
-        filename = av_asprintf("crypto:%s", oc->url);
-        if (!filename) {
-            err = AVERROR(ENOMEM);
-            goto fail;
+            memset(c->iv_string, 0, sizeof(c->iv_string));
+            memcpy(c->iv_string, iv_string, sizeof(iv_string));
         }
-        err = hlsenc_io_open(s, &oc->pb, filename, &options);
-        av_free(filename);
-        av_dict_free(&options);
-        if (err < 0)
-            return err;
-    } else if (c->segment_type != SEGMENT_TYPE_FMP4) {
-        if ((err = hlsenc_io_open(s, &oc->pb, oc->url, &options)) < 0)
-            goto fail;
+    }
+    if (c->segment_type != SEGMENT_TYPE_FMP4) {
+        if (oc->oformat->priv_class && oc->priv_data) {
+            av_opt_set(oc->priv_data, "mpegts_flags", "resend_headers", 0);
+        }
+        if (c->flags & HLS_SINGLE_FILE) {
+            set_http_options(s, &options, c);
+            if ((err = hlsenc_io_open(s, &vs->out, oc->url, &options)) < 0) {
+                if (c->ignore_io_errors)
+                    err = 0;
+                goto fail;
+            }
+        }
     }
     if (vs->vtt_basename) {
         set_http_options(s, &options, c);
-        if ((err = hlsenc_io_open(s, &vtt_oc->pb, vtt_oc->url, &options)) < 0)
+        if ((err = hlsenc_io_open(s, &vtt_oc->pb, vtt_oc->url, &options)) < 0) {
+            if (c->ignore_io_errors)
+                err = 0;
             goto fail;
-    }
-    av_dict_free(&options);
-
-    if (c->segment_type != SEGMENT_TYPE_FMP4) {
-        /* We only require one PAT/PMT per segment. */
-        if (oc->oformat->priv_class && oc->priv_data) {
-            char period[21];
-
-            snprintf(period, sizeof(period), "%d", (INT_MAX / 2) - 1);
-
-            av_opt_set(oc->priv_data, "mpegts_flags", "resend_headers", 0);
-            av_opt_set(oc->priv_data, "sdt_period", period, 0);
-            av_opt_set(oc->priv_data, "pat_period", period, 0);
         }
     }
+    av_dict_free(&options);
 
     if (vs->vtt_basename) {
         err = avformat_write_header(vtt_oc,NULL);
@@ -1683,24 +1792,19 @@
     }
 
     fn_dup = av_strdup(fn);
-    if (!fn_dup) {
-        ret = AVERROR(ENOMEM);
-        goto fail;
-    }
-
     filename = av_basename(fn);
     subdir_name = av_dirname(fn_dup);
 
     if (nb_vs > 1 && !av_stristr(filename, "%v") && !av_stristr(subdir_name, "%v")) {
-        av_log(NULL, AV_LOG_ERROR, "More than 1 variant streams are present, %%v is expected in the filename %s\n",
-                fn);
+        av_log(NULL, AV_LOG_ERROR, "More than 1 variant streams are present, %%v is expected "
+               "either in the filename or in the sub-directory name of file %s\n", fn);
         ret = AVERROR(EINVAL);
         goto fail;
     }
 
     if (av_stristr(filename, "%v") && av_stristr(subdir_name, "%v")) {
-        av_log(NULL, AV_LOG_ERROR, "%%v is expected either in filename or in the sub-directory name of file %s\n",
-                fn);
+        av_log(NULL, AV_LOG_ERROR, "%%v is expected either in the filename or "
+               "in the sub-directory name of file %s, but only in one of them\n", fn);
         ret = AVERROR(EINVAL);
         goto fail;
     }
@@ -1710,38 +1814,41 @@
     return ret;
 }
 
-static int format_name(char *buf, int buf_len, int index)
+static int format_name(const char *buf, char **s, int index, const char *varname)
 {
     const char *proto, *dir;
-    char *orig_buf_dup = NULL, *mod_buf = NULL, *mod_buf_dup = NULL;
+    char *orig_buf_dup = NULL, *mod_buf_dup = NULL;
     int ret = 0;
 
-    if (!av_stristr(buf, "%v"))
-        return ret;
-
     orig_buf_dup = av_strdup(buf);
     if (!orig_buf_dup) {
         ret = AVERROR(ENOMEM);
         goto fail;
     }
 
-    if (replace_int_data_in_filename(&mod_buf, orig_buf_dup, 'v', index) < 1) {
-        ret = AVERROR(EINVAL);
-        goto fail;
+    if (!av_stristr(buf, "%v")) {
+        *s = orig_buf_dup;
+        return ret;
     }
-    av_strlcpy(buf, mod_buf, buf_len);
+
+    if (!varname) {
+        if (replace_int_data_in_filename(s, orig_buf_dup, 'v', index) < 1) {
+            ret = AVERROR(EINVAL);
+            goto fail;
+        }
+    } else {
+        if (replace_str_data_in_filename(s, orig_buf_dup, 'v', varname) < 1) {
+            ret = AVERROR(EINVAL);
+            goto fail;
+        }
+    }
 
     proto = avio_find_protocol_name(orig_buf_dup);
     dir = av_dirname(orig_buf_dup);
 
     /* if %v is present in the file's directory, create sub-directory */
     if (av_stristr(dir, "%v") && proto && !strcmp(proto, "file")) {
-        mod_buf_dup = av_strdup(buf);
-        if (!mod_buf_dup) {
-            ret = AVERROR(ENOMEM);
-            goto fail;
-        }
-
+        mod_buf_dup = av_strdup(*s);
         dir = av_dirname(mod_buf_dup);
         if (ff_mkdir_p(dir) == -1 && errno != EEXIST) {
             ret = AVERROR(errno);
@@ -1752,7 +1859,6 @@
 fail:
     av_freep(&orig_buf_dup);
     av_freep(&mod_buf_dup);
-    av_freep(&mod_buf);
     return ret;
 }
 
@@ -1778,16 +1884,16 @@
 {
     HLSContext *hls = s->priv_data;
     VariantStream *vs;
-    int stream_index;
+    int stream_index, i, j;
     enum AVMediaType codec_type;
-    int nb_varstreams, nb_streams;
+    int nb_varstreams = 0, nb_streams;
     char *p, *q, *saveptr1, *saveptr2, *varstr, *keyval;
     const char *val;
 
     /**
      * Expected format for var_stream_map string is as below:
      * "a:0,v:0 a:1,v:1"
-     * "a:0,agroup:a0 a:1,agroup:a1 v:0,agroup:a0  v:1,agroup:a1"
+     * "a:0,agroup:a0,default:1,language:ENG a:1,agroup:a1,default:0 v:0,agroup:a0  v:1,agroup:a1"
      * This string specifies how to group the audio, video and subtitle streams
      * into different variant streams. The variant stream groups are separated
      * by space.
@@ -1797,18 +1903,23 @@
      * practical usage)
      *
      * agroup: is key to specify audio group. A string can be given as value.
+     * sgroup: is key to specify subtitle group. A string can be given as value.
      */
     p = av_strdup(hls->var_stream_map);
+    if (!p)
+        return AVERROR(ENOMEM);
+
     q = p;
-    while(av_strtok(q, " \t", &saveptr1)) {
+    while (av_strtok(q, " \t", &saveptr1)) {
         q = NULL;
-        hls->nb_varstreams++;
+        nb_varstreams++;
     }
     av_freep(&p);
 
-    hls->var_streams = av_mallocz(sizeof(*hls->var_streams) * hls->nb_varstreams);
+    hls->var_streams = av_mallocz(sizeof(*hls->var_streams) * nb_varstreams);
     if (!hls->var_streams)
         return AVERROR(ENOMEM);
+    hls->nb_varstreams = nb_varstreams;
 
     p = hls->var_stream_map;
     nb_varstreams = 0;
@@ -1818,6 +1929,7 @@
         if (nb_varstreams < hls->nb_varstreams) {
             vs = &(hls->var_streams[nb_varstreams]);
             vs->var_stream_idx = nb_varstreams;
+            vs->is_default = 0;
             nb_varstreams++;
         } else
             return AVERROR(EINVAL);
@@ -1836,19 +1948,44 @@
         nb_streams = 0;
         while (keyval = av_strtok(varstr, ",", &saveptr2)) {
             varstr = NULL;
-
-            if (av_strstart(keyval, "agroup:", &val)) {
+            if (av_strstart(keyval, "language:", &val)) {
+                av_free(vs->language);
+                vs->language = av_strdup(val);
+                if (!vs->language)
+                    return AVERROR(ENOMEM);
+                continue;
+            } else if (av_strstart(keyval, "default:", &val)) {
+                vs->is_default = (!av_strncasecmp(val, "YES", strlen("YES")) ||
+                                  (!av_strncasecmp(val, "1", strlen("1"))));
+                hls->has_default_key = 1;
+                continue;
+            } else if (av_strstart(keyval, "name:", &val)) {
+                av_free(vs->varname);
+                vs->varname = av_strdup(val);
+                if (!vs->varname)
+                    return AVERROR(ENOMEM);
+                continue;
+            } else if (av_strstart(keyval, "agroup:", &val)) {
+                av_free(vs->agroup);
                 vs->agroup = av_strdup(val);
                 if (!vs->agroup)
                     return AVERROR(ENOMEM);
                 continue;
+            } else if (av_strstart(keyval, "sgroup:", &val)) {
+                av_free(vs->sgroup);
+                vs->sgroup = av_strdup(val);
+                if (!vs->sgroup)
+                    return AVERROR(ENOMEM);
+                continue;
             } else if (av_strstart(keyval, "ccgroup:", &val)) {
+                av_free(vs->ccgroup);
                 vs->ccgroup = av_strdup(val);
                 if (!vs->ccgroup)
                     return AVERROR(ENOMEM);
                 continue;
             } else if (av_strstart(keyval, "v:", &val)) {
                 codec_type = AVMEDIA_TYPE_VIDEO;
+                hls->has_video_m3u8 = 1;
             } else if (av_strstart(keyval, "a:", &val)) {
                 codec_type = AVMEDIA_TYPE_AUDIO;
             } else if (av_strstart(keyval, "s:", &val)) {
@@ -1864,6 +2001,23 @@
                                                            atoi(val));
 
             if (stream_index >= 0 && nb_streams < vs->nb_streams) {
+                for (i = 0; nb_streams > 0 && i < nb_streams; i++) {
+                    if (vs->streams[i] == s->streams[stream_index]) {
+                        av_log(s, AV_LOG_ERROR, "Same elementary stream found more than once inside "
+                               "variant definition #%d\n", nb_varstreams - 1);
+                        return AVERROR(EINVAL);
+                    }
+                }
+                for (j = 0; nb_varstreams > 1 && j < nb_varstreams - 1; j++) {
+                    for (i = 0; i < hls->var_streams[j].nb_streams; i++) {
+                        if (hls->var_streams[j].streams[i] == s->streams[stream_index]) {
+                            av_log(s, AV_LOG_ERROR, "Same elementary stream found more than once "
+                                   "in two different variant definitions #%d and #%d\n",
+                                   j, nb_varstreams - 1);
+                            return AVERROR(EINVAL);
+                        }
+                    }
+                }
                 vs->streams[nb_streams++] = s->streams[stream_index];
             } else {
                 av_log(s, AV_LOG_ERROR, "Unable to map stream at %s\n", keyval);
@@ -1880,23 +2034,27 @@
 static int parse_cc_stream_mapstring(AVFormatContext *s)
 {
     HLSContext *hls = s->priv_data;
-    int nb_ccstreams;
+    int nb_ccstreams = 0;
     char *p, *q, *ccstr, *keyval;
     char *saveptr1 = NULL, *saveptr2 = NULL;
     const char *val;
     ClosedCaptionsStream *ccs;
 
     p = av_strdup(hls->cc_stream_map);
+    if(!p)
+        return AVERROR(ENOMEM);
+
     q = p;
-    while(av_strtok(q, " \t", &saveptr1)) {
+    while (av_strtok(q, " \t", &saveptr1)) {
         q = NULL;
-        hls->nb_ccstreams++;
+        nb_ccstreams++;
     }
     av_freep(&p);
 
-    hls->cc_streams = av_mallocz(sizeof(*hls->cc_streams) * hls->nb_ccstreams);
+    hls->cc_streams = av_mallocz(sizeof(*hls->cc_streams) * nb_ccstreams);
     if (!hls->cc_streams)
         return AVERROR(ENOMEM);
+    hls->nb_ccstreams = nb_ccstreams;
 
     p = hls->cc_stream_map;
     nb_ccstreams = 0;
@@ -1912,14 +2070,17 @@
             ccstr = NULL;
 
             if (av_strstart(keyval, "ccgroup:", &val)) {
+                av_free(ccs->ccgroup);
                 ccs->ccgroup = av_strdup(val);
                 if (!ccs->ccgroup)
                     return AVERROR(ENOMEM);
             } else if (av_strstart(keyval, "instreamid:", &val)) {
+                av_free(ccs->instreamid);
                 ccs->instreamid = av_strdup(val);
                 if (!ccs->instreamid)
                     return AVERROR(ENOMEM);
             } else if (av_strstart(keyval, "language:", &val)) {
+                av_free(ccs->language);
                 ccs->language = av_strdup(val);
                 if (!ccs->language)
                     return AVERROR(ENOMEM);
@@ -1935,19 +2096,19 @@
         }
 
         if (av_strstart(ccs->instreamid, "CC", &val)) {
-            if(atoi(val) < 1 || atoi(val) > 4) {
+            if (atoi(val) < 1 || atoi(val) > 4) {
                 av_log(s, AV_LOG_ERROR, "Invalid instream ID CC index %d in %s, range 1-4\n",
                        atoi(val), ccs->instreamid);
                 return AVERROR(EINVAL);
             }
         } else if (av_strstart(ccs->instreamid, "SERVICE", &val)) {
-            if(atoi(val) < 1 || atoi(val) > 63) {
+            if (atoi(val) < 1 || atoi(val) > 63) {
                 av_log(s, AV_LOG_ERROR, "Invalid instream ID SERVICE index %d in %s, range 1-63 \n",
                        atoi(val), ccs->instreamid);
                 return AVERROR(EINVAL);
             }
         } else {
-            av_log(s, AV_LOG_ERROR, "Invalid instream ID %s, supported are CCn or SERIVICEn\n",
+            av_log(s, AV_LOG_ERROR, "Invalid instream ID %s, supported are CCn or SERVICEn\n",
                    ccs->instreamid);
             return AVERROR(EINVAL);
         }
@@ -1956,7 +2117,8 @@
     return 0;
 }
 
-static int update_variant_stream_info(AVFormatContext *s) {
+static int update_variant_stream_info(AVFormatContext *s)
+{
     HLSContext *hls = s->priv_data;
     unsigned int i;
     int ret = 0;
@@ -1971,24 +2133,25 @@
         return parse_variant_stream_mapstring(s);
     } else {
         //By default, a single variant stream with all the codec streams is created
-        hls->nb_varstreams = 1;
-        hls->var_streams = av_mallocz(sizeof(*hls->var_streams) *
-                                             hls->nb_varstreams);
+        hls->var_streams = av_mallocz(sizeof(*hls->var_streams));
         if (!hls->var_streams)
             return AVERROR(ENOMEM);
+        hls->nb_varstreams = 1;
 
         hls->var_streams[0].var_stream_idx = 0;
         hls->var_streams[0].nb_streams = s->nb_streams;
         hls->var_streams[0].streams = av_mallocz(sizeof(AVStream *) *
                                             hls->var_streams[0].nb_streams);
-        if (!hls->var_streams[0].streams)
+        if (!hls->var_streams[0].streams) {
             return AVERROR(ENOMEM);
+        }
 
         //by default, the first available ccgroup is mapped to the variant stream
         if (hls->nb_ccstreams) {
             hls->var_streams[0].ccgroup = av_strdup(hls->cc_streams[0].ccgroup);
-            if (!hls->var_streams[0].ccgroup)
+            if (!hls->var_streams[0].ccgroup) {
                 return AVERROR(ENOMEM);
+            }
         }
 
         for (i = 0; i < s->nb_streams; i++)
@@ -1997,18 +2160,14 @@
     return 0;
 }
 
-static int update_master_pl_info(AVFormatContext *s) {
+static int update_master_pl_info(AVFormatContext *s)
+{
     HLSContext *hls = s->priv_data;
     const char *dir;
     char *fn1= NULL, *fn2 = NULL;
     int ret = 0;
 
     fn1 = av_strdup(s->url);
-    if (!fn1) {
-        ret = AVERROR(ENOMEM);
-        goto fail;
-    }
-
     dir = av_dirname(fn1);
 
     /**
@@ -2017,10 +2176,6 @@
      */
     if (dir && av_stristr(av_basename(dir), "%v")) {
         fn2 = av_strdup(dir);
-        if (!fn2) {
-            ret = AVERROR(ENOMEM);
-            goto fail;
-        }
         dir = av_dirname(fn2);
     }
 
@@ -2045,21 +2200,14 @@
 {
     HLSContext *hls = s->priv_data;
     int ret, i, j;
-    AVDictionary *options = NULL;
     VariantStream *vs = NULL;
 
     for (i = 0; i < hls->nb_varstreams; i++) {
         vs = &hls->var_streams[i];
 
-        av_dict_copy(&options, hls->format_options, 0);
-        ret = avformat_write_header(vs->avf, &options);
-        if (av_dict_count(options)) {
-            av_log(s, AV_LOG_ERROR, "Some of provided format options in '%s' are not recognized\n", hls->format_options_str);
-            ret = AVERROR(EINVAL);
-            av_dict_free(&options);
-            goto fail;
-        }
-        av_dict_free(&options);
+        ret = avformat_write_header(vs->avf, NULL);
+        if (ret < 0)
+            return ret;
         //av_assert0(s->nb_streams == hls->avf->nb_streams);
         for (j = 0; j < vs->nb_streams; j++) {
             AVStream *inner_st;
@@ -2099,7 +2247,23 @@
             }
         }
     }
-fail:
+
+    return ret;
+}
+
+static int hls_init_file_resend(AVFormatContext *s, VariantStream *vs)
+{
+    HLSContext *hls = s->priv_data;
+    AVDictionary *options = NULL;
+    int ret = 0;
+
+    set_http_options(s, &options, hls);
+    ret = hlsenc_io_open(s, &vs->out, hls->fmp4_init_filename, &options);
+    av_dict_free(&options);
+    if (ret < 0)
+        return ret;
+    avio_write(vs->out, vs->init_buffer, vs->init_range_length);
+    hlsenc_io_close(s, &vs->out, hls->fmp4_init_filename);
 
     return ret;
 }
@@ -2114,18 +2278,16 @@
     int ret = 0, can_split = 1, i, j;
     int stream_index = 0;
     int range_length = 0;
-    const char *proto = avio_find_protocol_name(s->url);
-    int use_temp_file = proto && !strcmp(proto, "file") && (s->flags & HLS_TEMP_FILE);
-    uint8_t *buffer = NULL;
+    const char *proto = NULL;
+    int use_temp_file = 0;
     VariantStream *vs = NULL;
-    AVDictionary *options = NULL;
     char *old_filename = NULL;
 
     for (i = 0; i < hls->nb_varstreams; i++) {
         vs = &hls->var_streams[i];
         for (j = 0; j < vs->nb_streams; j++) {
             if (vs->streams[j] == st) {
-                if( st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE ) {
+                if ( st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE ) {
                     oc = vs->vtt_avf;
                     stream_index = 0;
                 } else {
@@ -2149,17 +2311,23 @@
 
     if (vs->sequence - vs->nb_entries > hls->start_sequence && hls->init_time > 0) {
         /* reset end_pts, hls->recording_time at end of the init hls list */
-        int init_list_dur = hls->init_time * vs->nb_entries * AV_TIME_BASE;
-        int after_init_list_dur = (vs->sequence - hls->start_sequence - vs->nb_entries ) * (hls->time * AV_TIME_BASE);
+        int64_t init_list_dur = hls->init_time * vs->nb_entries * AV_TIME_BASE;
+        int64_t after_init_list_dur = (vs->sequence - hls->start_sequence - vs->nb_entries ) * (hls->time * AV_TIME_BASE);
         hls->recording_time = hls->time * AV_TIME_BASE;
         end_pts = init_list_dur + after_init_list_dur ;
     }
 
     if (vs->start_pts == AV_NOPTS_VALUE) {
         vs->start_pts = pkt->pts;
+        if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO)
+            vs->start_pts_from_audio = 1;
+    }
+    if (vs->start_pts_from_audio && st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO && vs->start_pts > pkt->pts) {
+        vs->start_pts = pkt->pts;
+        vs->start_pts_from_audio = 0;
     }
 
-    if (vs->has_video) {
+   if (vs->has_video) {
         can_split = st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO &&
                     ((pkt->flags & AV_PKT_FLAG_KEY) || (hls->flags & HLS_SPLIT_BY_TIME));
         is_ref_pkt = (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) && (pkt->stream_index == vs->reference_stream_index);
@@ -2191,33 +2359,26 @@
         int64_t new_start_pos;
         int byterange_mode = (hls->flags & HLS_SINGLE_FILE) || (hls->max_seg_size > 0);
 
-        av_write_frame(vs->avf, NULL); /* Flush any buffered data */
-
-        new_start_pos = avio_tell(vs->avf->pb);
-        if (hls->segment_type != SEGMENT_TYPE_FMP4) {
-            vs->size = new_start_pos - vs->start_pos;
-        } else {
-            vs->size = new_start_pos;
-        }
-
+        av_write_frame(oc, NULL); /* Flush any buffered data */
+        new_start_pos = avio_tell(oc->pb);
+        vs->size = new_start_pos - vs->start_pos;
+        avio_flush(oc->pb);
         if (hls->segment_type == SEGMENT_TYPE_FMP4) {
             if (!vs->init_range_length) {
-                avio_flush(oc->pb);
-                range_length = avio_close_dyn_buf(oc->pb, &buffer);
-                avio_write(vs->out, buffer, range_length);
+                range_length = avio_close_dyn_buf(oc->pb, &vs->init_buffer);
+                if (range_length <= 0)
+                    return AVERROR(EINVAL);
+                avio_write(vs->out, vs->init_buffer, range_length);
+                if (!hls->resend_init_file)
+                    av_freep(&vs->init_buffer);
                 vs->init_range_length = range_length;
                 avio_open_dyn_buf(&oc->pb);
                 vs->packets_written = 0;
                 vs->start_pos = range_length;
                 if (!byterange_mode) {
-                    ff_format_io_close(s, &vs->out);
                     hlsenc_io_close(s, &vs->out, vs->base_output_dirname);
                 }
             }
-        } else {
-            if (!byterange_mode) {
-                hlsenc_io_close(s, &oc->pb, oc->url);
-            }
         }
         if (!byterange_mode) {
             if (vs->vtt_avf) {
@@ -2225,55 +2386,75 @@
             }
         }
 
-        // look to rename the asset name
-        if (use_temp_file && oc->url[0]) {
-            if (!(hls->flags & HLS_SINGLE_FILE) || (hls->max_seg_size <= 0))
-                if ((vs->avf->oformat->priv_class && vs->avf->priv_data) && hls->segment_type != SEGMENT_TYPE_FMP4) {
-                    av_opt_set(vs->avf->priv_data, "mpegts_flags", "resend_headers", 0);
-                }
+        if (oc->url[0]) {
+            proto = avio_find_protocol_name(oc->url);
+            use_temp_file = proto && !strcmp(proto, "file") && (hls->flags & HLS_TEMP_FILE);
         }
 
-        if (vs->fmp4_init_mode) {
-            vs->number--;
-        }
-
-        if (hls->segment_type == SEGMENT_TYPE_FMP4) {
-            if (hls->flags & HLS_SINGLE_FILE) {
-                ret = flush_dynbuf(vs, &range_length);
-                if (ret < 0) {
-                    av_free(old_filename);
-                    return ret;
+        if (hls->flags & HLS_SINGLE_FILE) {
+            ret = flush_dynbuf(vs, &range_length);
+            av_freep(&vs->temp_buffer);
+            if (ret < 0) {
+                return ret;
+            }
+            vs->size = range_length;
+        } else {
+            if ((hls->max_seg_size > 0 && (vs->size >= hls->max_seg_size)) || !byterange_mode) {
+                AVDictionary *options = NULL;
+                char *filename = NULL;
+                if (hls->key_info_file || hls->encrypt) {
+                    av_dict_set(&options, "encryption_key", hls->key_string, 0);
+                    av_dict_set(&options, "encryption_iv", hls->iv_string, 0);
+                    filename = av_asprintf("crypto:%s", oc->url);
+                } else {
+                    filename = av_asprintf("%s", oc->url);
                 }
-                vs->size = range_length;
-            } else {
+                if (!filename) {
+                    av_dict_free(&options);
+                    return AVERROR(ENOMEM);
+                }
+
+                // look to rename the asset name
+                if (use_temp_file)
+                    av_dict_set(&options, "mpegts_flags", "resend_headers", 0);
+
                 set_http_options(s, &options, hls);
-                ret = hlsenc_io_open(s, &vs->out, vs->avf->url, &options);
+
+                ret = hlsenc_io_open(s, &vs->out, filename, &options);
                 if (ret < 0) {
-                    av_log(s, AV_LOG_ERROR, "Failed to open file '%s'\n",
-                           vs->avf->url);
-                    return ret;
+                    av_log(s, hls->ignore_io_errors ? AV_LOG_WARNING : AV_LOG_ERROR,
+                           "Failed to open file '%s'\n", filename);
+                    av_dict_free(&options);
+                    return hls->ignore_io_errors ? 0 : ret;
                 }
-                write_styp(vs->out);
+                if (hls->segment_type == SEGMENT_TYPE_FMP4) {
+                    write_styp(vs->out);
+                }
                 ret = flush_dynbuf(vs, &range_length);
                 if (ret < 0) {
+                    av_dict_free(&options);
                     return ret;
                 }
-                ff_format_io_close(s, &vs->out);
-
-                // rename that segment from .tmp to the real one
-                if (use_temp_file && oc->url[0]) {
-                    hls_rename_temp_file(s, oc);
-                    av_free(old_filename);
-                    old_filename = av_strdup(vs->avf->url);
-
-                    if (!old_filename) {
-                        return AVERROR(ENOMEM);
-                    }
+                ret = hlsenc_io_close(s, &vs->out, filename);
+                if (ret < 0) {
+                    av_log(s, AV_LOG_WARNING, "upload segment failed,"
+                           " will retry with a new http session.\n");
+                    ff_format_io_close(s, &vs->out);
+                    ret = hlsenc_io_open(s, &vs->out, filename, &options);
+                    reflush_dynbuf(vs, &range_length);
+                    ret = hlsenc_io_close(s, &vs->out, filename);
                 }
+                av_dict_free(&options);
+                av_freep(&vs->temp_buffer);
+                av_freep(&filename);
             }
         }
 
-        old_filename = av_strdup(vs->avf->url);
+        if (use_temp_file && !(hls->flags & HLS_SINGLE_FILE)) {
+            hls_rename_temp_file(s, oc);
+        }
+
+        old_filename = av_strdup(oc->url);
         if (!old_filename) {
             return AVERROR(ENOMEM);
         }
@@ -2283,22 +2464,38 @@
             vs->end_pts = pkt->pts;
             vs->duration = 0;
             if (ret < 0) {
-                av_free(old_filename);
+                av_freep(&old_filename);
                 return ret;
             }
         }
 
-        if (hls->segment_type != SEGMENT_TYPE_FMP4) {
-            vs->start_pos = new_start_pos;
-        } else {
-            vs->start_pos += vs->size;
+        // if we're building a VOD playlist, skip writing the manifest multiple times, and just wait until the end
+        if (hls->pl_type != PLAYLIST_TYPE_VOD) {
+            if ((ret = hls_window(s, 0, vs)) < 0) {
+                av_log(s, AV_LOG_WARNING, "upload playlist failed, will retry with a new http session.\n");
+                ff_format_io_close(s, &vs->out);
+                vs->out = NULL;
+                if ((ret = hls_window(s, 0, vs)) < 0) {
+                    av_freep(&old_filename);
+                    return ret;
+                }
+            }
         }
 
-        vs->fmp4_init_mode = 0;
+        if (hls->resend_init_file && hls->segment_type == SEGMENT_TYPE_FMP4) {
+            ret = hls_init_file_resend(s, vs);
+            if (ret < 0) {
+                av_freep(&old_filename);
+                return ret;
+            }
+        }
+
         if (hls->flags & HLS_SINGLE_FILE) {
             vs->number++;
+            vs->start_pos += vs->size;
         } else if (hls->max_seg_size > 0) {
-            if (vs->start_pos >= hls->max_seg_size) {
+            vs->start_pos = new_start_pos;
+            if (vs->size >= hls->max_seg_size) {
                 vs->sequence++;
                 sls_flag_file_rename(hls, vs, old_filename);
                 ret = hls_start(s, vs);
@@ -2309,94 +2506,180 @@
             }
             vs->number++;
         } else {
+            vs->start_pos = new_start_pos;
             sls_flag_file_rename(hls, vs, old_filename);
             ret = hls_start(s, vs);
         }
-        av_free(old_filename);
+        av_freep(&old_filename);
 
         if (ret < 0) {
             return ret;
         }
 
-        // if we're building a VOD playlist, skip writing the manifest multiple times, and just wait until the end
-        if (hls->pl_type != PLAYLIST_TYPE_VOD) {
-            if ((ret = hls_window(s, 0, vs)) < 0) {
-                return ret;
-            }
-        }
     }
 
     vs->packets_written++;
-    ret = ff_write_chained(oc, stream_index, pkt, s, 0);
+    if (oc->pb) {
+        ret = ff_write_chained(oc, stream_index, pkt, s, 0);
+        vs->video_keyframe_size += pkt->size;
+        if ((st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) && (pkt->flags & AV_PKT_FLAG_KEY)) {
+            vs->video_keyframe_size = avio_tell(oc->pb);
+        } else {
+            vs->video_keyframe_pos = avio_tell(vs->out);
+        }
+        if (hls->ignore_io_errors)
+            ret = 0;
+    }
 
     return ret;
 }
 
+static void hls_free_variant_streams(struct HLSContext *hls)
+{
+    int i = 0;
+    AVFormatContext *vtt_oc = NULL;
+    VariantStream *vs = NULL;
+
+    for (i = 0; i < hls->nb_varstreams; i++) {
+        vs = &hls->var_streams[i];
+        vtt_oc = vs->vtt_avf;
+
+        av_freep(&vs->basename);
+        av_freep(&vs->base_output_dirname);
+        av_freep(&vs->fmp4_init_filename);
+        if (vtt_oc) {
+            av_freep(&vs->vtt_basename);
+            av_freep(&vs->vtt_m3u8_name);
+            avformat_free_context(vtt_oc);
+        }
+
+        avformat_free_context(vs->avf);
+        if (hls->resend_init_file)
+            av_freep(&vs->init_buffer);
+        hls_free_segments(vs->segments);
+        hls_free_segments(vs->old_segments);
+        av_freep(&vs->m3u8_name);
+        av_freep(&vs->streams);
+        av_freep(&vs->agroup);
+        av_freep(&vs->sgroup);
+        av_freep(&vs->language);
+        av_freep(&vs->ccgroup);
+        av_freep(&vs->baseurl);
+        av_freep(&vs->varname);
+    }
+}
+
 static int hls_write_trailer(struct AVFormatContext *s)
 {
     HLSContext *hls = s->priv_data;
     AVFormatContext *oc = NULL;
     AVFormatContext *vtt_oc = NULL;
     char *old_filename = NULL;
-    const char *proto = avio_find_protocol_name(s->url);
-    int use_temp_file = proto && !strcmp(proto, "file") && (s->flags & HLS_TEMP_FILE);
+    const char *proto = NULL;
+    int use_temp_file = 0;
     int i;
     int ret = 0;
     VariantStream *vs = NULL;
+    AVDictionary *options = NULL;
+    int range_length, byterange_mode;
 
     for (i = 0; i < hls->nb_varstreams; i++) {
+        char *filename = NULL;
         vs = &hls->var_streams[i];
-
         oc = vs->avf;
         vtt_oc = vs->vtt_avf;
-        old_filename = av_strdup(vs->avf->url);
+        old_filename = av_strdup(oc->url);
+        use_temp_file = 0;
 
         if (!old_filename) {
             return AVERROR(ENOMEM);
         }
+        if (hls->key_info_file || hls->encrypt) {
+            av_dict_set(&options, "encryption_key", hls->key_string, 0);
+            av_dict_set(&options, "encryption_iv", hls->iv_string, 0);
+            filename = av_asprintf("crypto:%s", oc->url);
+        } else {
+            filename = av_asprintf("%s", oc->url);
+        }
+        if (!filename) {
+            av_freep(&old_filename);
+            return AVERROR(ENOMEM);
+        }
+
         if ( hls->segment_type == SEGMENT_TYPE_FMP4) {
             int range_length = 0;
-            if (!(hls->flags & HLS_SINGLE_FILE)) {
-                ret = hlsenc_io_open(s, &vs->out, vs->avf->url, NULL);
-                if (ret < 0) {
-                    av_log(s, AV_LOG_ERROR, "Failed to open file '%s'\n", vs->avf->url);
-                    goto failed;
+            if (!vs->init_range_length) {
+                uint8_t *buffer = NULL;
+                av_write_frame(oc, NULL); /* Flush any buffered data */
+
+                range_length = avio_close_dyn_buf(oc->pb, &buffer);
+                avio_write(vs->out, buffer, range_length);
+                av_freep(&buffer);
+                vs->init_range_length = range_length;
+                avio_open_dyn_buf(&oc->pb);
+                vs->packets_written = 0;
+                vs->start_pos = range_length;
+                byterange_mode = (hls->flags & HLS_SINGLE_FILE) || (hls->max_seg_size > 0);
+                if (!byterange_mode) {
+                    ff_format_io_close(s, &vs->out);
+                    hlsenc_io_close(s, &vs->out, vs->base_output_dirname);
                 }
-                write_styp(vs->out);
             }
-            ret = flush_dynbuf(vs, &range_length);
+        }
+        if (!(hls->flags & HLS_SINGLE_FILE)) {
+            set_http_options(s, &options, hls);
+            ret = hlsenc_io_open(s, &vs->out, filename, &options);
             if (ret < 0) {
+                av_log(s, AV_LOG_ERROR, "Failed to open file '%s'\n", oc->url);
                 goto failed;
             }
-            ff_format_io_close(s, &vs->out);
+            if (hls->segment_type == SEGMENT_TYPE_FMP4)
+                write_styp(vs->out);
         }
+        ret = flush_dynbuf(vs, &range_length);
+        if (ret < 0)
+            goto failed;
+
+        vs->size = range_length;
+        hlsenc_io_close(s, &vs->out, filename);
+        ret = hlsenc_io_close(s, &vs->out, filename);
+        if (ret < 0) {
+            av_log(s, AV_LOG_WARNING, "upload segment failed, will retry with a new http session.\n");
+            ff_format_io_close(s, &vs->out);
+            ret = hlsenc_io_open(s, &vs->out, filename, &options);
+            if (ret < 0) {
+                av_log(s, AV_LOG_ERROR, "Failed to open file '%s'\n", oc->url);
+                goto failed;
+            }
+            reflush_dynbuf(vs, &range_length);
+            ret = hlsenc_io_close(s, &vs->out, filename);
+            if (ret < 0)
+                av_log(s, AV_LOG_WARNING, "Failed to upload file '%s' at the end.\n", oc->url);
+        }
+        av_freep(&vs->temp_buffer);
 
 failed:
+        av_freep(&filename);
         av_write_trailer(oc);
-        if (oc->pb) {
-            if (hls->segment_type != SEGMENT_TYPE_FMP4) {
-                vs->size = avio_tell(vs->avf->pb) - vs->start_pos;
-            } else {
-                vs->size = avio_tell(vs->avf->pb);
-            }
-            if (hls->segment_type != SEGMENT_TYPE_FMP4)
-                ff_format_io_close(s, &oc->pb);
-
-            // rename that segment from .tmp to the real one
-            if (use_temp_file && oc->url[0] && !(hls->flags & HLS_SINGLE_FILE)) {
-                hls_rename_temp_file(s, oc);
-                av_free(old_filename);
-                old_filename = av_strdup(vs->avf->url);
-
-                if (!old_filename) {
-                    return AVERROR(ENOMEM);
-                }
-            }
-
-            /* after av_write_trailer, then duration + 1 duration per packet */
-            hls_append_segment(s, hls, vs, vs->duration + vs->dpp, vs->start_pos, vs->size);
+        if (oc->url[0]) {
+            proto = avio_find_protocol_name(oc->url);
+            use_temp_file = proto && !strcmp(proto, "file") && (hls->flags & HLS_TEMP_FILE);
         }
 
+        // rename that segment from .tmp to the real one
+        if (use_temp_file && !(hls->flags & HLS_SINGLE_FILE)) {
+            hls_rename_temp_file(s, oc);
+            av_freep(&old_filename);
+            old_filename = av_strdup(oc->url);
+
+            if (!old_filename) {
+                return AVERROR(ENOMEM);
+            }
+        }
+
+        /* after av_write_trailer, then duration + 1 duration per packet */
+        hls_append_segment(s, hls, vs, vs->duration + vs->dpp, vs->start_pos, vs->size);
+
         sls_flag_file_rename(hls, vs, old_filename);
 
         if (vtt_oc) {
@@ -2405,30 +2688,19 @@
             vs->size = avio_tell(vs->vtt_avf->pb) - vs->start_pos;
             ff_format_io_close(s, &vtt_oc->pb);
         }
-        av_freep(&vs->basename);
-        av_freep(&vs->base_output_dirname);
-        avformat_free_context(oc);
-
-        vs->avf = NULL;
-        hls_window(s, 1, vs);
-
-        av_freep(&vs->fmp4_init_filename);
-        if (vtt_oc) {
-            av_freep(&vs->vtt_basename);
-            av_freep(&vs->vtt_m3u8_name);
-            avformat_free_context(vtt_oc);
+        ret = hls_window(s, 1, vs);
+        if (ret < 0) {
+            av_log(s, AV_LOG_WARNING, "upload playlist failed, will retry with a new http session.\n");
+            ff_format_io_close(s, &vs->out);
+            hls_window(s, 1, vs);
         }
+        ffio_free_dyn_buf(&oc->pb);
 
-        hls_free_segments(vs->segments);
-        hls_free_segments(vs->old_segments);
         av_free(old_filename);
-        av_freep(&vs->m3u8_name);
-        av_freep(&vs->streams);
-        av_freep(&vs->agroup);
-        av_freep(&vs->ccgroup);
-        av_freep(&vs->baseurl);
     }
 
+    hls_free_variant_streams(hls);
+
     for (i = 0; i < hls->nb_ccstreams; i++) {
         ClosedCaptionsStream *ccs = &hls->cc_streams[i];
         av_freep(&ccs->ccgroup);
@@ -2459,8 +2731,11 @@
     const char *vtt_pattern = "%d.vtt";
     char *p = NULL;
     int vtt_basename_size = 0;
+    int http_base_proto = ff_is_http_proto(s->url);
     int fmp4_init_filename_len = strlen(hls->fmp4_init_filename) + 1;
 
+    hls->has_default_key = 0;
+    hls->has_video_m3u8 = 0;
     ret = update_variant_stream_info(s);
     if (ret < 0) {
         av_log(s, AV_LOG_ERROR, "Variant stream info update failed with status %x\n",
@@ -2474,6 +2749,10 @@
         goto fail;
     }
 
+    if (!hls->method && http_base_proto) {
+        av_log(hls, AV_LOG_WARNING, "No HTTP method set, hls muxer defaulting to method PUT.\n");
+    }
+
     ret = validate_name(hls->nb_varstreams, s->url);
     if (ret < 0)
         goto fail;
@@ -2517,7 +2796,7 @@
             char b[15];
             struct tm *p, tmbuf;
             if (!(p = localtime_r(&t, &tmbuf)))
-                return AVERROR(ENOMEM);
+                return AVERROR(errno);
             if (!strftime(b, sizeof(b), "%Y%m%d%H%M%S", p))
                 return AVERROR(ENOMEM);
             hls->start_sequence = strtoll(b, NULL, 10);
@@ -2529,12 +2808,7 @@
     for (i = 0; i < hls->nb_varstreams; i++) {
         vs = &hls->var_streams[i];
 
-        vs->m3u8_name = av_strdup(s->url);
-        if (!vs->m3u8_name ) {
-            ret = AVERROR(ENOMEM);
-            goto fail;
-        }
-        ret = format_name(vs->m3u8_name, strlen(s->url) + 1, i);
+        ret = format_name(s->url, &vs->m3u8_name, i, vs->varname);
         if (ret < 0)
             goto fail;
 
@@ -2556,13 +2830,6 @@
             time(&now0);
             vs->initial_prog_date_time = now0;
         }
-        if (hls->format_options_str) {
-            ret = av_dict_parse_string(&hls->format_options, hls->format_options_str, "=", ":", 0);
-            if (ret < 0) {
-                av_log(s, AV_LOG_ERROR, "Could not parse format options list '%s'\n", hls->format_options_str);
-                goto fail;
-            }
-        }
 
         for (j = 0; j < vs->nb_streams; j++) {
             vs->has_video += vs->streams[j]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO;
@@ -2589,21 +2856,13 @@
 
         if (vs->has_subtitle) {
             vs->vtt_oformat = av_guess_format("webvtt", NULL, NULL);
-            if (!vs->oformat) {
+            if (!vs->vtt_oformat) {
                 ret = AVERROR_MUXER_NOT_FOUND;
                 goto fail;
             }
         }
         if (hls->segment_filename) {
-            basename_size = strlen(hls->segment_filename) + 1;
-            vs->basename = av_malloc(basename_size);
-            if (!vs->basename) {
-                ret = AVERROR(ENOMEM);
-                goto fail;
-            }
-
-            av_strlcpy(vs->basename, hls->segment_filename, basename_size);
-            ret = format_name(vs->basename, basename_size, i);
+            ret = format_name(hls->segment_filename, &vs->basename, i, vs->varname);
             if (ret < 0)
                 goto fail;
         } else {
@@ -2657,7 +2916,12 @@
                 av_strlcpy(vs->fmp4_init_filename, hls->fmp4_init_filename,
                            fmp4_init_filename_len);
                 if (hls->nb_varstreams > 1) {
-                    ret = append_postfix(vs->fmp4_init_filename, fmp4_init_filename_len, i);
+                    if (av_stristr(vs->fmp4_init_filename, "%v")) {
+                        av_freep(&vs->fmp4_init_filename);
+                        format_name(hls->fmp4_init_filename, &vs->fmp4_init_filename, i, vs->varname);
+                    } else {
+                        ret = append_postfix(vs->fmp4_init_filename, fmp4_init_filename_len, i);
+                    }
                     if (ret < 0)
                         goto fail;
                 }
@@ -2685,17 +2949,10 @@
             }
         }
 
-        if (!hls->use_localtime) {
-            ret = sls_flag_check_duration_size_index(hls);
-            if (ret < 0) {
-                goto fail;
-            }
-        } else {
-            ret = sls_flag_check_duration_size(hls, vs);
-            if (ret < 0) {
-                goto fail;
-            }
-        }
+        ret = hls->use_localtime ? sls_flag_check_duration_size(hls, vs) : sls_flag_check_duration_size_index(hls);
+        if (ret < 0)
+            goto fail;
+
         if (vs->has_subtitle) {
 
             if (hls->flags & HLS_SINGLE_FILE)
@@ -2707,24 +2964,21 @@
                 ret = AVERROR(ENOMEM);
                 goto fail;
             }
-            vs->vtt_m3u8_name = av_malloc(vtt_basename_size);
-            if (!vs->vtt_m3u8_name ) {
-                ret = AVERROR(ENOMEM);
-                goto fail;
-            }
             av_strlcpy(vs->vtt_basename, vs->m3u8_name, vtt_basename_size);
             p = strrchr(vs->vtt_basename, '.');
             if (p)
                 *p = '\0';
 
             if ( hls->subtitle_filename ) {
-                strcpy(vs->vtt_m3u8_name, hls->subtitle_filename);
-                ret = format_name(vs->vtt_m3u8_name, vtt_basename_size, i);
+                ret = format_name(hls->subtitle_filename, &vs->vtt_m3u8_name, i, vs->varname);
                 if (ret < 0)
                     goto fail;
             } else {
-                strcpy(vs->vtt_m3u8_name, vs->vtt_basename);
-                av_strlcat(vs->vtt_m3u8_name, "_vtt.m3u8", vtt_basename_size);
+                vs->vtt_m3u8_name = av_asprintf("%s_vtt.m3u8", vs->vtt_basename);
+                if (!vs->vtt_m3u8_name) {
+                    ret = AVERROR(ENOMEM);
+                    goto fail;
+                }
             }
             av_strlcat(vs->vtt_basename, vtt_pattern, vtt_basename_size);
         }
@@ -2757,29 +3011,14 @@
 
 fail:
     if (ret < 0) {
-        av_freep(&hls->key_basename);
-        for (i = 0; i < hls->nb_varstreams && hls->var_streams; i++) {
-            vs = &hls->var_streams[i];
-            av_freep(&vs->basename);
-            av_freep(&vs->vtt_basename);
-            av_freep(&vs->fmp4_init_filename);
-            av_freep(&vs->m3u8_name);
-            av_freep(&vs->vtt_m3u8_name);
-            av_freep(&vs->streams);
-            av_freep(&vs->agroup);
-            av_freep(&vs->ccgroup);
-            av_freep(&vs->baseurl);
-            if (vs->avf)
-                avformat_free_context(vs->avf);
-            if (vs->vtt_avf)
-                avformat_free_context(vs->vtt_avf);
-        }
+        hls_free_variant_streams(hls);
         for (i = 0; i < hls->nb_ccstreams; i++) {
             ClosedCaptionsStream *ccs = &hls->cc_streams[i];
             av_freep(&ccs->ccgroup);
             av_freep(&ccs->instreamid);
             av_freep(&ccs->language);
         }
+        av_freep(&hls->key_basename);
         av_freep(&hls->var_streams);
         av_freep(&hls->cc_streams);
         av_freep(&hls->master_m3u8_url);
@@ -2796,7 +3035,7 @@
     {"hls_init_time", "set segment length in seconds at init list",           OFFSET(init_time),    AV_OPT_TYPE_FLOAT,  {.dbl = 0},     0, FLT_MAX, E},
     {"hls_list_size", "set maximum number of playlist entries",  OFFSET(max_nb_segments),    AV_OPT_TYPE_INT,    {.i64 = 5},     0, INT_MAX, E},
     {"hls_delete_threshold", "set number of unreferenced segments to keep before deleting",  OFFSET(hls_delete_threshold),    AV_OPT_TYPE_INT,    {.i64 = 1},     1, INT_MAX, E},
-    {"hls_ts_options","set hls mpegts list of options for the container format used for hls", OFFSET(format_options_str), AV_OPT_TYPE_STRING, {.str = NULL},  0, 0,    E},
+    {"hls_ts_options","set hls mpegts list of options for the container format used for hls", OFFSET(format_options), AV_OPT_TYPE_DICT, {.str = NULL},  0, 0,    E},
     {"hls_vtt_options","set hls vtt list of options for the container format used for hls", OFFSET(vtt_format_options_str), AV_OPT_TYPE_STRING, {.str = NULL},  0, 0,    E},
 #if FF_API_HLS_WRAP
     {"hls_wrap",      "set number after which the index wraps (will be deprecated)",  OFFSET(wrap),    AV_OPT_TYPE_INT,    {.i64 = 0},     0, INT_MAX, E},
@@ -2815,9 +3054,10 @@
     {"mpegts",   "make segment file to mpegts files in m3u8", 0, AV_OPT_TYPE_CONST, {.i64 = SEGMENT_TYPE_MPEGTS }, 0, UINT_MAX,   E, "segment_type"},
     {"fmp4",   "make segment file to fragment mp4 files in m3u8", 0, AV_OPT_TYPE_CONST, {.i64 = SEGMENT_TYPE_FMP4 }, 0, UINT_MAX,   E, "segment_type"},
     {"hls_fmp4_init_filename", "set fragment mp4 file init filename", OFFSET(fmp4_init_filename),   AV_OPT_TYPE_STRING, {.str = "init.mp4"},            0,       0,         E},
+    {"hls_fmp4_init_resend", "resend fragment mp4 init file after refresh m3u8 every time", OFFSET(resend_init_file), AV_OPT_TYPE_BOOL, {.i64 = 0 }, 0, 1, E },
     {"hls_flags",     "set flags affecting HLS playlist and media file generation", OFFSET(flags), AV_OPT_TYPE_FLAGS, {.i64 = 0 }, 0, UINT_MAX, E, "flags"},
     {"single_file",   "generate a single media file indexed with byte ranges", 0, AV_OPT_TYPE_CONST, {.i64 = HLS_SINGLE_FILE }, 0, UINT_MAX,   E, "flags"},
-    {"temp_file", "write segment to temporary file and rename when complete", 0, AV_OPT_TYPE_CONST, {.i64 = HLS_TEMP_FILE }, 0, UINT_MAX,   E, "flags"},
+    {"temp_file", "write segment and playlist to temporary file and rename when complete", 0, AV_OPT_TYPE_CONST, {.i64 = HLS_TEMP_FILE }, 0, UINT_MAX,   E, "flags"},
     {"delete_segments", "delete segment files that are no longer part of the playlist", 0, AV_OPT_TYPE_CONST, {.i64 = HLS_DELETE_SEGMENTS }, 0, UINT_MAX,   E, "flags"},
     {"round_durations", "round durations in m3u8 to whole numbers", 0, AV_OPT_TYPE_CONST, {.i64 = HLS_ROUND_DURATIONS }, 0, UINT_MAX,   E, "flags"},
     {"discont_start", "start the playlist with a discontinuity tag", 0, AV_OPT_TYPE_CONST, {.i64 = HLS_DISCONT_START }, 0, UINT_MAX,   E, "flags"},
@@ -2830,6 +3070,7 @@
     {"second_level_segment_size", "include segment size in segment filenames when use_localtime", 0, AV_OPT_TYPE_CONST, {.i64 = HLS_SECOND_LEVEL_SEGMENT_SIZE }, 0, UINT_MAX,   E, "flags"},
     {"periodic_rekey", "reload keyinfo file periodically for re-keying", 0, AV_OPT_TYPE_CONST, {.i64 = HLS_PERIODIC_REKEY }, 0, UINT_MAX,   E, "flags"},
     {"independent_segments", "add EXT-X-INDEPENDENT-SEGMENTS, whenever applicable", 0, AV_OPT_TYPE_CONST, { .i64 = HLS_INDEPENDENT_SEGMENTS }, 0, UINT_MAX, E, "flags"},
+    {"iframes_only", "add EXT-X-I-FRAMES-ONLY, whenever applicable", 0, AV_OPT_TYPE_CONST, { .i64 = HLS_I_FRAMES_ONLY }, 0, UINT_MAX, E, "flags"},
 #if FF_API_HLS_USE_LOCALTIME
     {"use_localtime", "set filename expansion with strftime at segment creation(will be deprecated )", OFFSET(use_localtime), AV_OPT_TYPE_BOOL, {.i64 = 0 }, 0, 1, E },
 #endif
@@ -2853,6 +3094,8 @@
     {"master_pl_publish_rate", "Publish master play list every after this many segment intervals", OFFSET(master_publish_rate), AV_OPT_TYPE_INT, {.i64 = 0}, 0, UINT_MAX, E},
     {"http_persistent", "Use persistent HTTP connections", OFFSET(http_persistent), AV_OPT_TYPE_BOOL, {.i64 = 0 }, 0, 1, E },
     {"timeout", "set timeout for socket I/O operations", OFFSET(timeout), AV_OPT_TYPE_DURATION, { .i64 = -1 }, -1, INT_MAX, .flags = E },
+    {"ignore_io_errors", "Ignore IO errors for stable long-duration runs with network output", OFFSET(ignore_io_errors), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, E },
+    {"headers", "set custom HTTP headers, can override built in default headers", OFFSET(headers), AV_OPT_TYPE_STRING, { .str = NULL }, 0, 0, E },
     { NULL },
 };
 
diff --git a/libavformat/hlsplaylist.c b/libavformat/hlsplaylist.c
index efcbff0..43f9d28 100644
--- a/libavformat/hlsplaylist.c
+++ b/libavformat/hlsplaylist.c
@@ -36,18 +36,34 @@
 }
 
 void ff_hls_write_audio_rendition(AVIOContext *out, char *agroup,
-                                  char *filename, int name_id, int is_default) {
+                                  const char *filename, char *language, int name_id, int is_default) {
     if (!out || !agroup || !filename)
         return;
 
     avio_printf(out, "#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID=\"group_%s\"", agroup);
-    avio_printf(out, ",NAME=\"audio_%d\",DEFAULT=%s,URI=\"%s\"\n", name_id,
-                     is_default ? "YES" : "NO", filename);
+    avio_printf(out, ",NAME=\"audio_%d\",DEFAULT=%s,", name_id, is_default ? "YES" : "NO");
+    if (language) {
+        avio_printf(out, "LANGUAGE=\"%s\",", language);
+    }
+    avio_printf(out, "URI=\"%s\"\n", filename);
+}
+
+void ff_hls_write_subtitle_rendition(AVIOContext *out, char *sgroup,
+                                  const char *filename, char *language, int name_id, int is_default) {
+    if (!out || !filename)
+        return;
+
+    avio_printf(out, "#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID=\"%s\"", sgroup);
+    avio_printf(out, ",NAME=\"subtitle_%d\",DEFAULT=%s,", name_id, is_default ? "YES" : "NO");
+    if (language) {
+        avio_printf(out, "LANGUAGE=\"%s\",", language);
+    }
+    avio_printf(out, "URI=\"%s\"\n", filename);
 }
 
 void ff_hls_write_stream_info(AVStream *st, AVIOContext *out,
-                              int bandwidth, char *filename, char *agroup,
-                              char *codecs, char *ccgroup) {
+                              int bandwidth, const char *filename, char *agroup,
+                              char *codecs, char *ccgroup, char *sgroup) {
 
     if (!out || !filename)
         return;
@@ -62,18 +78,20 @@
     if (st && st->codecpar->width > 0 && st->codecpar->height > 0)
         avio_printf(out, ",RESOLUTION=%dx%d", st->codecpar->width,
                 st->codecpar->height);
-    if (codecs && strlen(codecs) > 0)
+    if (codecs && codecs[0])
         avio_printf(out, ",CODECS=\"%s\"", codecs);
-    if (agroup && strlen(agroup) > 0)
+    if (agroup && agroup[0])
         avio_printf(out, ",AUDIO=\"group_%s\"", agroup);
-    if (ccgroup && strlen(ccgroup) > 0)
+    if (ccgroup && ccgroup[0])
         avio_printf(out, ",CLOSED-CAPTIONS=\"%s\"", ccgroup);
+    if (sgroup && sgroup[0])
+        avio_printf(out, ",SUBTITLES=\"%s\"", sgroup);
     avio_printf(out, "\n%s\n\n", filename);
 }
 
 void ff_hls_write_playlist_header(AVIOContext *out, int version, int allowcache,
                                   int target_duration, int64_t sequence,
-                                  uint32_t playlist_type) {
+                                  uint32_t playlist_type, int iframe_mode) {
     if (!out)
         return;
     ff_hls_write_playlist_version(out, version);
@@ -89,6 +107,9 @@
     } else if (playlist_type == PLAYLIST_TYPE_VOD) {
         avio_printf(out, "#EXT-X-PLAYLIST-TYPE:VOD\n");
     }
+    if (iframe_mode) {
+        avio_printf(out, "#EXT-X-I-FRAMES-ONLY\n");
+    }
 }
 
 void ff_hls_write_init_file(AVIOContext *out, char *filename,
@@ -105,7 +126,8 @@
                              double duration, int round_duration,
                              int64_t size, int64_t pos, //Used only if HLS_SINGLE_FILE flag is set
                              char *baseurl, //Ignored if NULL
-                             char *filename, double *prog_date_time) {
+                             char *filename, double *prog_date_time,
+                             int64_t video_keyframe_size, int64_t video_keyframe_pos, int iframe_mode) {
     if (!out || !filename)
         return AVERROR(EINVAL);
 
@@ -117,7 +139,8 @@
     else
         avio_printf(out, "#EXTINF:%f,\n", duration);
     if (byterange_mode)
-        avio_printf(out, "#EXT-X-BYTERANGE:%"PRId64"@%"PRId64"\n", size, pos);
+        avio_printf(out, "#EXT-X-BYTERANGE:%"PRId64"@%"PRId64"\n", iframe_mode ? video_keyframe_size : size,
+                    iframe_mode ? video_keyframe_pos : pos);
 
     if (prog_date_time) {
         time_t tt, wrongsecs;
diff --git a/libavformat/hlsplaylist.h b/libavformat/hlsplaylist.h
index 5054b01..a124bdc 100644
--- a/libavformat/hlsplaylist.h
+++ b/libavformat/hlsplaylist.h
@@ -38,13 +38,15 @@
 
 void ff_hls_write_playlist_version(AVIOContext *out, int version);
 void ff_hls_write_audio_rendition(AVIOContext *out, char *agroup,
-                                  char *filename, int name_id, int is_default);
+                                  const char *filename, char *language, int name_id, int is_default);
+void ff_hls_write_subtitle_rendition(AVIOContext *out, char *sgroup,
+                                  const char *filename, char *language, int name_id, int is_default);
 void ff_hls_write_stream_info(AVStream *st, AVIOContext *out,
-                              int bandwidth, char *filename, char *agroup,
-                              char *codecs, char *ccgroup);
+                              int bandwidth, const char *filename, char *agroup,
+                              char *codecs, char *ccgroup, char *sgroup);
 void ff_hls_write_playlist_header(AVIOContext *out, int version, int allowcache,
                                   int target_duration, int64_t sequence,
-                                  uint32_t playlist_type);
+                                  uint32_t playlist_type, int iframe_mode);
 void ff_hls_write_init_file(AVIOContext *out, char *filename,
                             int byterange_mode, int64_t size, int64_t pos);
 int ff_hls_write_file_entry(AVIOContext *out, int insert_discont,
@@ -52,7 +54,8 @@
                              double duration, int round_duration,
                              int64_t size, int64_t pos, //Used only if HLS_SINGLE_FILE flag is set
                              char *baseurl, //Ignored if NULL
-                             char *filename, double *prog_date_time);
+                             char *filename, double *prog_date_time,
+                             int64_t video_keyframe_size, int64_t video_keyframe_pos, int iframe_mode);
 void ff_hls_write_end_list (AVIOContext *out);
 
 #endif /* AVFORMAT_HLSPLAYLIST_H_ */
diff --git a/libavformat/hlsproto.c b/libavformat/hlsproto.c
index e7ef2d8..e5673e5 100644
--- a/libavformat/hlsproto.c
+++ b/libavformat/hlsproto.c
@@ -295,7 +295,7 @@
         }
         goto retry;
     }
-    url = s->segments[s->cur_seq_no - s->start_seq_no]->url,
+    url = s->segments[s->cur_seq_no - s->start_seq_no]->url;
     av_log(h, AV_LOG_DEBUG, "opening %s\n", url);
     ret = ffurl_open_whitelist(&s->seg_hd, url, AVIO_FLAG_READ,
                                &h->interrupt_callback, NULL,
diff --git a/libavformat/hnm.c b/libavformat/hnm.c
index 24d4e80..f06add5 100644
--- a/libavformat/hnm.c
+++ b/libavformat/hnm.c
@@ -37,22 +37,12 @@
 #define HNM4_CHUNK_ID_SD 17491
 
 typedef struct Hnm4DemuxContext {
-    uint8_t version;
-    uint16_t width;
-    uint16_t height;
-    uint32_t filesize;
     uint32_t frames;
-    uint32_t taboffset;
-    uint16_t bits;
-    uint16_t channels;
-    uint32_t framesize;
     uint32_t currentframe;
-    int64_t pts;
     uint32_t superchunk_remaining;
-    AVPacket vpkt;
 } Hnm4DemuxContext;
 
-static int hnm_probe(AVProbeData *p)
+static int hnm_probe(const AVProbeData *p)
 {
     if (p->buf_size < 4)
         return 0;
@@ -69,54 +59,37 @@
 {
     Hnm4DemuxContext *hnm = s->priv_data;
     AVIOContext *pb = s->pb;
+    unsigned width, height;
     AVStream *vst;
-
-    /* default context members */
-    hnm->pts = 0;
-    av_init_packet(&hnm->vpkt);
-    hnm->vpkt.data = NULL;
-    hnm->vpkt.size = 0;
-
-    hnm->superchunk_remaining = 0;
+    int ret;
 
     avio_skip(pb, 8);
-    hnm->width     = avio_rl16(pb);
-    hnm->height    = avio_rl16(pb);
-    hnm->filesize  = avio_rl32(pb);
+    width          = avio_rl16(pb);
+    height         = avio_rl16(pb);
+    avio_rl32(pb); // filesize
     hnm->frames    = avio_rl32(pb);
-    hnm->taboffset = avio_rl32(pb);
-    hnm->bits      = avio_rl16(pb);
-    hnm->channels  = avio_rl16(pb);
-    hnm->framesize = avio_rl32(pb);
-    avio_skip(pb, 32);
+    avio_skip(pb, 44);
 
-    hnm->currentframe = 0;
-
-    if (hnm->width  < 256 || hnm->width  > 640 ||
-        hnm->height < 150 || hnm->height > 480) {
+    if (width  < 256 || width  > 640 ||
+        height < 150 || height > 480) {
         av_log(s, AV_LOG_ERROR,
-               "invalid resolution: %ux%u\n", hnm->width, hnm->height);
+               "invalid resolution: %ux%u\n", width, height);
         return AVERROR_INVALIDDATA;
     }
 
-    // TODO: find a better way to detect HNM4A
-    if (hnm->width == 640)
-        hnm->version = 0x4a;
-    else
-        hnm->version = 0x40;
-
     if (!(vst = avformat_new_stream(s, NULL)))
         return AVERROR(ENOMEM);
 
     vst->codecpar->codec_type = AVMEDIA_TYPE_VIDEO;
     vst->codecpar->codec_id   = AV_CODEC_ID_HNM4_VIDEO;
     vst->codecpar->codec_tag  = 0;
-    vst->codecpar->width      = hnm->width;
-    vst->codecpar->height     = hnm->height;
-    vst->codecpar->extradata  = av_mallocz(1);
+    vst->codecpar->width      = width;
+    vst->codecpar->height     = height;
+    if ((ret = ff_alloc_extradata(vst->codecpar, 1)) < 0)
+        return ret;
 
-    vst->codecpar->extradata_size = 1;
-    memcpy(vst->codecpar->extradata, &hnm->version, 1);
+    // TODO: find a better way to detect HNM4A
+    vst->codecpar->extradata[0] = width == 640 ? 0x4a : 0x40;
 
     vst->start_time = 0;
 
@@ -185,16 +158,6 @@
     return ret;
 }
 
-static int hnm_read_close(AVFormatContext *s)
-{
-    Hnm4DemuxContext *hnm = s->priv_data;
-
-    if (hnm->vpkt.size > 0)
-        av_packet_unref(&hnm->vpkt);
-
-    return 0;
-}
-
 AVInputFormat ff_hnm_demuxer = {
     .name           = "hnm",
     .long_name      = NULL_IF_CONFIG_SMALL("Cryo HNM v4"),
@@ -202,6 +165,5 @@
     .read_probe     = hnm_probe,
     .read_header    = hnm_read_header,
     .read_packet    = hnm_read_packet,
-    .read_close     = hnm_read_close,
     .flags          = AVFMT_NO_BYTE_SEEK | AVFMT_NOGENSEARCH | AVFMT_NOBINSEARCH
 };
diff --git a/libavformat/http.c b/libavformat/http.c
index 3a35bc7..c941557 100644
--- a/libavformat/http.c
+++ b/libavformat/http.c
@@ -27,6 +27,7 @@
 
 #include "libavutil/avassert.h"
 #include "libavutil/avstring.h"
+#include "libavutil/bprint.h"
 #include "libavutil/opt.h"
 #include "libavutil/time.h"
 #include "libavutil/parseutils.h"
@@ -113,6 +114,7 @@
     uint8_t *inflate_buffer;
 #endif /* CONFIG_ZLIB */
     AVDictionary *chained_options;
+    /* -1 = try to send if applicable, 0 = always disabled, 1 = always enabled */
     int send_expect_100;
     char *method;
     int reconnect;
@@ -155,7 +157,7 @@
     { "auth_type", "HTTP authentication type", OFFSET(auth_state.auth_type), AV_OPT_TYPE_INT, { .i64 = HTTP_AUTH_NONE }, HTTP_AUTH_NONE, HTTP_AUTH_BASIC, D | E, "auth_type"},
     { "none", "No auth method set, autodetect", 0, AV_OPT_TYPE_CONST, { .i64 = HTTP_AUTH_NONE }, 0, 0, D | E, "auth_type"},
     { "basic", "HTTP basic authentication", 0, AV_OPT_TYPE_CONST, { .i64 = HTTP_AUTH_BASIC }, 0, 0, D | E, "auth_type"},
-    { "send_expect_100", "Force sending an Expect: 100-continue header for POST", OFFSET(send_expect_100), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, E },
+    { "send_expect_100", "Force sending an Expect: 100-continue header for POST", OFFSET(send_expect_100), AV_OPT_TYPE_BOOL, { .i64 = -1 }, -1, 1, E },
     { "location", "The actual location of the data received", OFFSET(location), AV_OPT_TYPE_STRING, { .str = NULL }, 0, 0, D | E },
     { "offset", "initial byte offset", OFFSET(off), AV_OPT_TYPE_INT64, { .i64 = 0 }, 0, INT64_MAX, D },
     { "end_offset", "try to limit the request to bytes preceding this offset", OFFSET(end_off), AV_OPT_TYPE_INT64, { .i64 = 0 }, 0, INT64_MAX, D },
@@ -189,9 +191,10 @@
 static int http_open_cnx_internal(URLContext *h, AVDictionary **options)
 {
     const char *path, *proxy_path, *lower_proto = "tcp", *local_path;
+    char *hashmark;
     char hostname[1024], hoststr[1024], proto[10];
     char auth[1024], proxyauth[1024] = "";
-    char path1[MAX_URL_SIZE];
+    char path1[MAX_URL_SIZE], sanitized_path[MAX_URL_SIZE];
     char buf[1024], urlbuf[MAX_URL_SIZE];
     int port, use_proxy, err, location_changed = 0;
     HTTPContext *s = h->priv_data;
@@ -214,10 +217,18 @@
     if (port < 0)
         port = 80;
 
-    if (path1[0] == '\0')
+    hashmark = strchr(path1, '#');
+    if (hashmark)
+        *hashmark = '\0';
+
+    if (path1[0] == '\0') {
         path = "/";
-    else
+    } else if (path1[0] == '?') {
+        snprintf(sanitized_path, sizeof(sanitized_path), "/%s", path1);
+        path = sanitized_path;
+    } else {
         path = path1;
+    }
     local_path = path;
     if (use_proxy) {
         /* Reassemble the request URL without auth string - we don't
@@ -303,8 +314,27 @@
         return location_changed;
     return ff_http_averror(s->http_code, AVERROR(EIO));
 }
+int ff_http_get_shutdown_status(URLContext *h)
+{
+    int ret = 0;
+    HTTPContext *s = h->priv_data;
 
-int ff_http_do_new_request(URLContext *h, const char *uri)
+    /* flush the receive buffer when it is write only mode */
+    char buf[1024];
+    int read_ret;
+    read_ret = ffurl_read(s->hd, buf, sizeof(buf));
+    if (read_ret < 0) {
+        ret = read_ret;
+    }
+
+    return ret;
+}
+
+int ff_http_do_new_request(URLContext *h, const char *uri) {
+    return ff_http_do_new_request2(h, uri, NULL);
+}
+
+int ff_http_do_new_request2(URLContext *h, const char *uri, AVDictionary **opts)
 {
     HTTPContext *s = h->priv_data;
     AVDictionary *options = NULL;
@@ -349,6 +379,9 @@
     if (!s->location)
         return AVERROR(ENOMEM);
 
+    if ((ret = av_opt_set_dict(s, opts)) < 0)
+        return ret;
+
     av_log(s, AV_LOG_INFO, "Opening \'%s\' for %s\n", uri, h->flags & AVIO_FLAG_WRITE ? "writing" : "reading");
     ret = http_open_cnx(h, &options);
     av_dict_free(&options);
@@ -541,7 +574,7 @@
         int len = strlen(s->headers);
         if (len < 2 || strcmp("\r\n", s->headers + len - 2)) {
             av_log(h, AV_LOG_WARNING,
-                   "No trailing CRLF found in HTTP header.\n");
+                   "No trailing CRLF found in HTTP header. Adding it.\n");
             ret = av_reallocp(&s->headers, len + 3);
             if (ret < 0)
                 return ret;
@@ -915,7 +948,7 @@
             while (av_isspace(*p))
                 p++;
             resource = p;
-            while (!av_isspace(*p))
+            while (*p && !av_isspace(*p))
                 p++;
             *(p++) = '\0';
             av_log(h, AV_LOG_TRACE, "Requested resource: %s\n", resource);
@@ -1146,19 +1179,50 @@
     return err;
 }
 
+/**
+ * Escape unsafe characters in path in order to pass them safely to the HTTP
+ * request. Insipred by the algorithm in GNU wget:
+ * - escape "%" characters not followed by two hex digits
+ * - escape all "unsafe" characters except which are also "reserved"
+ * - pass through everything else
+ */
+static void bprint_escaped_path(AVBPrint *bp, const char *path)
+{
+#define NEEDS_ESCAPE(ch) \
+    ((ch) <= ' ' || (ch) >= '\x7f' || \
+     (ch) == '"' || (ch) == '%' || (ch) == '<' || (ch) == '>' || (ch) == '\\' || \
+     (ch) == '^' || (ch) == '`' || (ch) == '{' || (ch) == '}' || (ch) == '|')
+    while (*path) {
+        char buf[1024];
+        char *q = buf;
+        while (*path && q - buf < sizeof(buf) - 4) {
+            if (path[0] == '%' && av_isxdigit(path[1]) && av_isxdigit(path[2])) {
+                *q++ = *path++;
+                *q++ = *path++;
+                *q++ = *path++;
+            } else if (NEEDS_ESCAPE(*path)) {
+                q += snprintf(q, 4, "%%%02X", (uint8_t)*path++);
+            } else {
+                *q++ = *path++;
+            }
+        }
+        av_bprint_append_data(bp, buf, q - buf);
+    }
+}
+
 static int http_connect(URLContext *h, const char *path, const char *local_path,
                         const char *hoststr, const char *auth,
                         const char *proxyauth, int *new_location)
 {
     HTTPContext *s = h->priv_data;
     int post, err;
-    char headers[HTTP_HEADERS_SIZE] = "";
+    AVBPrint request;
     char *authstr = NULL, *proxyauthstr = NULL;
     uint64_t off = s->off;
-    int len = 0;
     const char *method;
     int send_expect_100 = 0;
-    int ret;
+
+    av_bprint_init_for_buffer(&request, s->buffer, sizeof(s->buffer));
 
     /* send http header */
     post = h->flags & AVIO_FLAG_WRITE;
@@ -1179,16 +1243,21 @@
                                                 local_path, method);
     proxyauthstr = ff_http_auth_create_response(&s->proxy_auth_state, proxyauth,
                                                 local_path, method);
-    if (post && !s->post_data) {
-        send_expect_100 = s->send_expect_100;
-        /* The user has supplied authentication but we don't know the auth type,
-         * send Expect: 100-continue to get the 401 response including the
-         * WWW-Authenticate header, or an 100 continue if no auth actually
-         * is needed. */
-        if (auth && *auth &&
-            s->auth_state.auth_type == HTTP_AUTH_NONE &&
-            s->http_code != 401)
-            send_expect_100 = 1;
+
+     if (post && !s->post_data) {
+        if (s->send_expect_100 != -1) {
+            send_expect_100 = s->send_expect_100;
+        } else {
+            send_expect_100 = 0;
+            /* The user has supplied authentication but we don't know the auth type,
+             * send Expect: 100-continue to get the 401 response including the
+             * WWW-Authenticate header, or an 100 continue if no auth actually
+             * is needed. */
+            if (auth && *auth &&
+                s->auth_state.auth_type == HTTP_AUTH_NONE &&
+                s->http_code != 401)
+                send_expect_100 = 1;
+        }
     }
 
 #if FF_API_HTTP_USER_AGENT
@@ -1196,95 +1265,74 @@
         s->user_agent = av_strdup(s->user_agent_deprecated);
     }
 #endif
+
+    av_bprintf(&request, "%s ", method);
+    bprint_escaped_path(&request, path);
+    av_bprintf(&request, " HTTP/1.1\r\n");
+
+    if (post && s->chunked_post)
+        av_bprintf(&request, "Transfer-Encoding: chunked\r\n");
     /* set default headers if needed */
     if (!has_header(s->headers, "\r\nUser-Agent: "))
-        len += av_strlcatf(headers + len, sizeof(headers) - len,
-                           "User-Agent: %s\r\n", s->user_agent);
+        av_bprintf(&request, "User-Agent: %s\r\n", s->user_agent);
     if (s->referer) {
         /* set default headers if needed */
         if (!has_header(s->headers, "\r\nReferer: "))
-            len += av_strlcatf(headers + len, sizeof(headers) - len,
-                               "Referer: %s\r\n", s->referer);
+            av_bprintf(&request, "Referer: %s\r\n", s->referer);
     }
     if (!has_header(s->headers, "\r\nAccept: "))
-        len += av_strlcpy(headers + len, "Accept: */*\r\n",
-                          sizeof(headers) - len);
+        av_bprintf(&request, "Accept: */*\r\n");
     // Note: we send this on purpose even when s->off is 0 when we're probing,
     // since it allows us to detect more reliably if a (non-conforming)
     // server supports seeking by analysing the reply headers.
     if (!has_header(s->headers, "\r\nRange: ") && !post && (s->off > 0 || s->end_off || s->seekable == -1)) {
-        len += av_strlcatf(headers + len, sizeof(headers) - len,
-                           "Range: bytes=%"PRIu64"-", s->off);
+        av_bprintf(&request, "Range: bytes=%"PRIu64"-", s->off);
         if (s->end_off)
-            len += av_strlcatf(headers + len, sizeof(headers) - len,
-                               "%"PRId64, s->end_off - 1);
-        len += av_strlcpy(headers + len, "\r\n",
-                          sizeof(headers) - len);
+            av_bprintf(&request, "%"PRId64, s->end_off - 1);
+        av_bprintf(&request, "\r\n");
     }
     if (send_expect_100 && !has_header(s->headers, "\r\nExpect: "))
-        len += av_strlcatf(headers + len, sizeof(headers) - len,
-                           "Expect: 100-continue\r\n");
+        av_bprintf(&request, "Expect: 100-continue\r\n");
 
-    if (!has_header(s->headers, "\r\nConnection: ")) {
-        if (s->multiple_requests)
-            len += av_strlcpy(headers + len, "Connection: keep-alive\r\n",
-                              sizeof(headers) - len);
-        else
-            len += av_strlcpy(headers + len, "Connection: close\r\n",
-                              sizeof(headers) - len);
-    }
+    if (!has_header(s->headers, "\r\nConnection: "))
+        av_bprintf(&request, "Connection: %s\r\n", s->multiple_requests ? "keep-alive" : "close");
 
     if (!has_header(s->headers, "\r\nHost: "))
-        len += av_strlcatf(headers + len, sizeof(headers) - len,
-                           "Host: %s\r\n", hoststr);
+        av_bprintf(&request, "Host: %s\r\n", hoststr);
     if (!has_header(s->headers, "\r\nContent-Length: ") && s->post_data)
-        len += av_strlcatf(headers + len, sizeof(headers) - len,
-                           "Content-Length: %d\r\n", s->post_datalen);
+        av_bprintf(&request, "Content-Length: %d\r\n", s->post_datalen);
 
     if (!has_header(s->headers, "\r\nContent-Type: ") && s->content_type)
-        len += av_strlcatf(headers + len, sizeof(headers) - len,
-                           "Content-Type: %s\r\n", s->content_type);
+        av_bprintf(&request, "Content-Type: %s\r\n", s->content_type);
     if (!has_header(s->headers, "\r\nCookie: ") && s->cookies) {
         char *cookies = NULL;
         if (!get_cookies(s, &cookies, path, hoststr) && cookies) {
-            len += av_strlcatf(headers + len, sizeof(headers) - len,
-                               "Cookie: %s\r\n", cookies);
+            av_bprintf(&request, "Cookie: %s\r\n", cookies);
             av_free(cookies);
         }
     }
     if (!has_header(s->headers, "\r\nIcy-MetaData: ") && s->icy)
-        len += av_strlcatf(headers + len, sizeof(headers) - len,
-                           "Icy-MetaData: %d\r\n", 1);
+        av_bprintf(&request, "Icy-MetaData: 1\r\n");
 
     /* now add in custom headers */
     if (s->headers)
-        av_strlcpy(headers + len, s->headers, sizeof(headers) - len);
+        av_bprintf(&request, "%s", s->headers);
 
-    ret = snprintf(s->buffer, sizeof(s->buffer),
-             "%s %s HTTP/1.1\r\n"
-             "%s"
-             "%s"
-             "%s"
-             "%s%s"
-             "\r\n",
-             method,
-             path,
-             post && s->chunked_post ? "Transfer-Encoding: chunked\r\n" : "",
-             headers,
-             authstr ? authstr : "",
-             proxyauthstr ? "Proxy-" : "", proxyauthstr ? proxyauthstr : "");
+    if (authstr)
+        av_bprintf(&request, "%s", authstr);
+    if (proxyauthstr)
+        av_bprintf(&request, "Proxy-%s", proxyauthstr);
+    av_bprintf(&request, "\r\n");
 
-    av_log(h, AV_LOG_DEBUG, "request: %s\n", s->buffer);
+    av_log(h, AV_LOG_DEBUG, "request: %s\n", request.str);
 
-    if (strlen(headers) + 1 == sizeof(headers) ||
-        ret >= sizeof(s->buffer)) {
+    if (!av_bprint_is_complete(&request)) {
         av_log(h, AV_LOG_ERROR, "overlong headers\n");
         err = AVERROR(EINVAL);
         goto done;
     }
 
-
-    if ((err = ffurl_write(s->hd, s->buffer, strlen(s->buffer))) < 0)
+    if ((err = ffurl_write(s->hd, request.str, request.len)) < 0)
         goto done;
 
     if (s->post_data)
@@ -1504,12 +1552,13 @@
     return pos;
 }
 
-static void update_metadata(HTTPContext *s, char *data)
+static void update_metadata(URLContext *h, char *data)
 {
     char *key;
     char *val;
     char *end;
     char *next = data;
+    HTTPContext *s = h->priv_data;
 
     while (*next) {
         key = next;
@@ -1525,6 +1574,7 @@
         val += 2;
 
         av_dict_set(&s->metadata, key, val, 0);
+        av_log(h, AV_LOG_VERBOSE, "Metadata update for %s: %s\n", key, val);
 
         next = end + 2;
     }
@@ -1559,7 +1609,7 @@
             data[len + 1] = 0;
             if ((ret = av_opt_set(s, "icy_metadata_packet", data, 0)) < 0)
                 return ret;
-            update_metadata(s, data);
+            update_metadata(h, data);
         }
         s->icy_data_read = 0;
         remaining        = s->icy_metaint;
@@ -1630,7 +1680,7 @@
             read_ret = ffurl_read(s->hd, buf, sizeof(buf));
             s->hd->flags &= ~AVIO_FLAG_NONBLOCK;
             if (read_ret < 0 && read_ret != AVERROR(EAGAIN)) {
-                av_log(h, AV_LOG_ERROR, "URL read error:  %d\n", read_ret);
+                av_log(h, AV_LOG_ERROR, "URL read error: %s\n", av_err2str(read_ret));
                 ret = read_ret;
             }
         }
@@ -1650,7 +1700,7 @@
     av_freep(&s->inflate_buffer);
 #endif /* CONFIG_ZLIB */
 
-    if (!s->end_chunked_post)
+    if (s->hd && !s->end_chunked_post)
         /* Close the write direction by sending the end of chunked encoding. */
         ret = http_shutdown(h, h->flags);
 
@@ -1691,6 +1741,13 @@
     if (s->off && h->is_streamed)
         return AVERROR(ENOSYS);
 
+    /* do not try to make a new connection if seeking past the end of the file */
+    if (s->end_off || s->filesize != UINT64_MAX) {
+        uint64_t end_pos = s->end_off ? s->end_off : s->filesize;
+        if (s->off >= end_pos)
+            return s->off;
+    }
+
     /* we save the old context in case the seek fails */
     old_buf_size = s->buf_end - s->buf_ptr;
     memcpy(old_buf, s->buf_ptr, old_buf_size);
@@ -1754,7 +1811,7 @@
     .priv_data_size      = sizeof(HTTPContext),
     .priv_data_class     = &http_context_class,
     .flags               = URL_PROTOCOL_FLAG_NETWORK,
-    .default_whitelist   = "http,https,tls,rtp,tcp,udp,crypto,httpproxy"
+    .default_whitelist   = "http,https,tls,rtp,tcp,udp,crypto,httpproxy,data"
 };
 #endif /* CONFIG_HTTP_PROTOCOL */
 
diff --git a/libavformat/http.h b/libavformat/http.h
index 7d02713..5557ce9 100644
--- a/libavformat/http.h
+++ b/libavformat/http.h
@@ -38,6 +38,15 @@
 void ff_http_init_auth_state(URLContext *dest, const URLContext *src);
 
 /**
+ * Get the HTTP shutdown response status, be used after http_shutdown.
+ *
+ * @param h pointer to the resource
+ * @return a negative value if an error condition occurred, 0
+ * otherwise
+ */
+int ff_http_get_shutdown_status(URLContext *h);
+
+/**
  * Send a new HTTP request, reusing the old connection.
  *
  * @param h pointer to the resource
@@ -47,6 +56,19 @@
  */
 int ff_http_do_new_request(URLContext *h, const char *uri);
 
+/**
+ * Send a new HTTP request, reusing the old connection.
+ *
+ * @param h pointer to the resource
+ * @param uri uri used to perform the request
+ * @param options  A dictionary filled with HTTP options. On return
+ * this parameter will be destroyed and replaced with a dict containing options
+ * that were not found. May be NULL.
+ * @return a negative value if an error condition occurred, 0
+ * otherwise
+ */
+int ff_http_do_new_request2(URLContext *h, const char *uri, AVDictionary **options);
+
 int ff_http_averror(int status_code, int default_averror);
 
 #endif /* AVFORMAT_HTTP_H */
diff --git a/libavformat/httpauth.c b/libavformat/httpauth.c
index 2d42ab2..4f79c78 100644
--- a/libavformat/httpauth.c
+++ b/libavformat/httpauth.c
@@ -255,7 +255,7 @@
 
     if (state->auth_type == HTTP_AUTH_BASIC) {
         int auth_b64_len, len;
-        char *ptr, *decoded_auth = ff_urldecode(auth);
+        char *ptr, *decoded_auth = ff_urldecode(auth, 0);
 
         if (!decoded_auth)
             return NULL;
@@ -275,7 +275,7 @@
         av_strlcat(ptr, "\r\n", len - (ptr - authstr));
         av_free(decoded_auth);
     } else if (state->auth_type == HTTP_AUTH_DIGEST) {
-        char *username = ff_urldecode(auth), *password;
+        char *username = ff_urldecode(auth, 0), *password;
 
         if (!username)
             return NULL;
diff --git a/libavformat/icecast.c b/libavformat/icecast.c
index c93b06b..7d8f92f 100644
--- a/libavformat/icecast.c
+++ b/libavformat/icecast.c
@@ -89,7 +89,7 @@
 
     // URI part variables
     char h_url[1024], host[1024], auth[1024], path[1024];
-    char *headers = NULL, *user = NULL;
+    char *headers, *user = NULL;
     int port, ret;
     AVBPrint bp;
 
@@ -105,17 +105,18 @@
     cat_header(&bp, "Ice-Genre", s->genre);
     cat_header(&bp, "Ice-Public", s->public ? "1" : "0");
     if (!av_bprint_is_complete(&bp)) {
-        ret = AVERROR(ENOMEM);
-        goto cleanup;
+        av_bprint_finalize(&bp, NULL);
+        return AVERROR(ENOMEM);
     }
-    av_bprint_finalize(&bp, &headers);
+    if ((ret = av_bprint_finalize(&bp, &headers)) < 0)
+        return ret;
 
     // Set options
     av_dict_set(&opt_dict, "method", s->legacy_icecast ? "SOURCE" : "PUT", 0);
     av_dict_set(&opt_dict, "auth_type", "basic", 0);
-    av_dict_set(&opt_dict, "headers", headers, 0);
+    av_dict_set(&opt_dict, "headers", headers, AV_DICT_DONT_STRDUP_VAL);
     av_dict_set(&opt_dict, "chunked_post", "0", 0);
-    av_dict_set(&opt_dict, "send_expect_100", s->legacy_icecast ? "0" : "1", 0);
+    av_dict_set(&opt_dict, "send_expect_100", s->legacy_icecast ? "-1" : "1", 0);
     if (NOT_EMPTY(s->content_type))
         av_dict_set(&opt_dict, "content_type", s->content_type, 0);
     else
@@ -169,7 +170,6 @@
 
 cleanup:
     av_freep(&user);
-    av_freep(&headers);
     av_dict_free(&opt_dict);
 
     return ret;
diff --git a/libavformat/icodec.c b/libavformat/icodec.c
index f33fa11..b47fa98 100644
--- a/libavformat/icodec.c
+++ b/libavformat/icodec.c
@@ -43,7 +43,7 @@
     IcoImage * images;
 } IcoDemuxContext;
 
-static int probe(AVProbeData *p)
+static int probe(const AVProbeData *p)
 {
     unsigned i, frames, checked = 0;
 
@@ -96,8 +96,10 @@
             break;
 
         st = avformat_new_stream(s, NULL);
-        if (!st)
+        if (!st) {
+            av_freep(&ico->images);
             return AVERROR(ENOMEM);
+        }
 
         st->codecpar->codec_type = AVMEDIA_TYPE_VIDEO;
         st->codecpar->width      = avio_r8(pb);
@@ -111,6 +113,7 @@
         ico->images[i].size   = avio_rl32(pb);
         if (ico->images[i].size <= 0) {
             av_log(s, AV_LOG_ERROR, "Invalid image size %d\n", ico->images[i].size);
+            av_freep(&ico->images);
             return AVERROR_INVALIDDATA;
         }
         ico->images[i].offset = avio_rl32(pb);
@@ -126,8 +129,10 @@
             st->codecpar->height   = 0;
             break;
         case 40:
-            if (ico->images[i].size < 40)
+            if (ico->images[i].size < 40) {
+                av_freep(&ico->images);
                 return AVERROR_INVALIDDATA;
+            }
             st->codecpar->codec_id = AV_CODEC_ID_BMP;
             tmp = avio_rl32(pb);
             if (tmp)
@@ -138,6 +143,7 @@
             break;
         default:
             avpriv_request_sample(s, "codec %d", codec);
+            av_freep(&ico->images);
             return AVERROR_INVALIDDATA;
         }
     }
@@ -179,7 +185,6 @@
         bytestream_put_le32(&buf, 0);
 
         if ((ret = avio_read(pb, buf, image->size)) != image->size) {
-            av_packet_unref(pkt);
             return ret < 0 ? ret : AVERROR_INVALIDDATA;
         }
 
diff --git a/libavformat/icoenc.c b/libavformat/icoenc.c
index e641f7b..a7df8b7 100644
--- a/libavformat/icoenc.c
+++ b/libavformat/icoenc.c
@@ -106,8 +106,6 @@
     if (!ico->images)
         return AVERROR(ENOMEM);
 
-    avio_flush(pb);
-
     return 0;
 }
 
@@ -183,11 +181,16 @@
         avio_wl32(pb, ico->images[i].offset);
     }
 
-    av_freep(&ico->images);
-
     return 0;
 }
 
+static void ico_deinit(AVFormatContext *s)
+{
+    IcoMuxContext *ico = s->priv_data;
+
+    av_freep(&ico->images);
+}
+
 AVOutputFormat ff_ico_muxer = {
     .name           = "ico",
     .long_name      = NULL_IF_CONFIG_SMALL("Microsoft Windows ICO"),
@@ -199,5 +202,6 @@
     .write_header   = ico_write_header,
     .write_packet   = ico_write_packet,
     .write_trailer  = ico_write_trailer,
+    .deinit         = ico_deinit,
     .flags          = AVFMT_NOTIMESTAMPS,
 };
diff --git a/libavformat/id3v1.c b/libavformat/id3v1.c
index 19be421..eb66098 100644
--- a/libavformat/id3v1.c
+++ b/libavformat/id3v1.c
@@ -92,7 +92,7 @@
      [64] = "Native American",
      [65] = "Cabaret",
      [66] = "New Wave",
-     [67] = "Psychadelic", /* sic, the misspelling is used in the specification */
+     [67] = "Psychedelic",
      [68] = "Rave",
      [69] = "Showtunes",
      [70] = "Trailer",
@@ -110,7 +110,7 @@
      [82] = "National Folk",
      [83] = "Swing",
      [84] = "Fast Fusion",
-     [85] = "Bebob",
+     [85] = "Bebop",
      [86] = "Latin",
      [87] = "Revival",
      [88] = "Celtic",
@@ -148,20 +148,20 @@
     [120] = "Duet",
     [121] = "Punk Rock",
     [122] = "Drum Solo",
-    [123] = "A capella",
+    [123] = "A Cappella",
     [124] = "Euro-House",
     [125] = "Dance Hall",
     [126] = "Goa",
     [127] = "Drum & Bass",
     [128] = "Club-House",
-    [129] = "Hardcore",
+    [129] = "Hardcore Techno",
     [130] = "Terror",
     [131] = "Indie",
     [132] = "BritPop",
     [133] = "Negerpunk",
     [134] = "Polsk Punk",
     [135] = "Beat",
-    [136] = "Christian Gangsta",
+    [136] = "Christian Gangsta Rap",
     [137] = "Heavy Metal",
     [138] = "Black Metal",
     [139] = "Crossover",
@@ -171,8 +171,52 @@
     [143] = "Salsa",
     [144] = "Thrash Metal",
     [145] = "Anime",
-    [146] = "JPop",
-    [147] = "SynthPop",
+    [146] = "Jpop",
+    [147] = "Synthpop",
+    [148] = "Abstract",
+    [149] = "Art Rock",
+    [150] = "Baroque",
+    [151] = "Bhangra",
+    [152] = "Big Beat",
+    [153] = "Breakbeat",
+    [154] = "Chillout",
+    [155] = "Downtempo",
+    [156] = "Dub",
+    [157] = "EBM",
+    [158] = "Eclectic",
+    [159] = "Electro",
+    [160] = "Electroclash",
+    [161] = "Emo",
+    [162] = "Experimental",
+    [163] = "Garage",
+    [164] = "Global",
+    [165] = "IDM",
+    [166] = "Illbient",
+    [167] = "Industro-Goth",
+    [168] = "Jam Band",
+    [169] = "Krautrock",
+    [170] = "Leftfield",
+    [171] = "Lounge",
+    [172] = "Math Rock",
+    [173] = "New Romantic",
+    [174] = "Nu-Breakz",
+    [175] = "Post-Punk",
+    [176] = "Post-Rock",
+    [177] = "Psytrance",
+    [178] = "Shoegaze",
+    [179] = "Space Rock",
+    [180] = "Trop Rock",
+    [181] = "World Music",
+    [182] = "Neoclassical",
+    [183] = "Audiobook",
+    [184] = "Audio Theatre",
+    [185] = "Neue Deutsche Welle",
+    [186] = "Podcast",
+    [187] = "Indie Rock",
+    [188] = "G-Funk",
+    [189] = "Dubstep",
+    [190] = "Garage Rock",
+    [191] = "Psybient"
 };
 
 static void get_string(AVFormatContext *s, const char *key,
diff --git a/libavformat/id3v1.h b/libavformat/id3v1.h
index d5dca35..b3ad16d 100644
--- a/libavformat/id3v1.h
+++ b/libavformat/id3v1.h
@@ -26,7 +26,7 @@
 
 #define ID3v1_TAG_SIZE 128
 
-#define ID3v1_GENRE_MAX 147
+#define ID3v1_GENRE_MAX 191
 
 /**
  * ID3v1 genres
diff --git a/libavformat/id3v2.c b/libavformat/id3v2.c
index f7de26a..abe073d 100644
--- a/libavformat/id3v2.c
+++ b/libavformat/id3v2.c
@@ -36,6 +36,7 @@
 #include "libavutil/bprint.h"
 #include "libavutil/dict.h"
 #include "libavutil/intreadwrite.h"
+#include "libavcodec/png.h"
 #include "avio_internal.h"
 #include "internal.h"
 #include "id3v1.h"
@@ -360,8 +361,8 @@
 {
     uint8_t lang[4];
     uint8_t *descriptor = NULL; // 'Content descriptor'
-    uint8_t *text = NULL;
-    char *key = NULL;
+    uint8_t *text;
+    char *key;
     int encoding;
     int ok = 0;
 
@@ -386,18 +387,19 @@
     key = av_asprintf("lyrics-%s%s%s", descriptor[0] ? (char *)descriptor : "",
                                        descriptor[0] ? "-" : "",
                                        lang);
-    if (!key)
+    if (!key) {
+        av_free(text);
         goto error;
+    }
 
-    av_dict_set(metadata, key, text, 0);
+    av_dict_set(metadata, key, text,
+                AV_DICT_DONT_STRDUP_KEY | AV_DICT_DONT_STRDUP_VAL);
 
     ok = 1;
 error:
     if (!ok)
         av_log(s, AV_LOG_ERROR, "Error reading lyrics, skipped\n");
     av_free(descriptor);
-    av_free(text);
-    av_free(key);
 }
 
 /**
@@ -590,7 +592,7 @@
                       int isv34)
 {
     int enc, pic_type;
-    char mimetype[64];
+    char mimetype[64] = {0};
     const CodecMime *mime     = ff_id3v2_mime_tags;
     enum AVCodecID id         = AV_CODEC_ID_NONE;
     ID3v2ExtraMetaAPIC *apic  = NULL;
@@ -612,7 +614,9 @@
     if (isv34) {
         taglen -= avio_get_str(pb, taglen, mimetype, sizeof(mimetype));
     } else {
-        avio_read(pb, mimetype, 3);
+        if (avio_read(pb, mimetype, 3) < 0)
+            goto fail;
+
         mimetype[3] = 0;
         taglen    -= 3;
     }
@@ -1156,7 +1160,7 @@
         st->codecpar->codec_type = AVMEDIA_TYPE_VIDEO;
         st->codecpar->codec_id   = apic->id;
 
-        if (AV_RB64(apic->buf->data) == 0x89504e470d0a1a0a)
+        if (AV_RB64(apic->buf->data) == PNGSIG)
             st->codecpar->codec_id = AV_CODEC_ID_PNG;
 
         if (apic->description[0])
@@ -1260,8 +1264,6 @@
             }
 
             if ((ret = av_dict_set(metadata, key, escaped, dict_flags)) < 0) {
-                av_free(key);
-                av_free(escaped);
                 return ret;
             }
         }
diff --git a/libavformat/id3v2enc.c b/libavformat/id3v2enc.c
index ffe358f..5d821ea 100644
--- a/libavformat/id3v2enc.c
+++ b/libavformat/id3v2enc.c
@@ -65,11 +65,11 @@
 static int id3v2_put_ttag(ID3v2EncContext *id3, AVIOContext *avioc, const char *str1, const char *str2,
                           uint32_t tag, enum ID3v2Encoding enc)
 {
-    int len;
+    int len, ret;
     uint8_t *pb;
     AVIOContext *dyn_buf;
-    if (avio_open_dyn_buf(&dyn_buf) < 0)
-        return AVERROR(ENOMEM);
+    if ((ret = avio_open_dyn_buf(&dyn_buf)) < 0)
+        return ret;
 
     /* check if the strings are ASCII-only and use UTF16 only if
      * they're not */
@@ -81,7 +81,7 @@
     id3v2_encode_string(dyn_buf, str1, enc);
     if (str2)
         id3v2_encode_string(dyn_buf, str2, enc);
-    len = avio_close_dyn_buf(dyn_buf, &pb);
+    len = avio_get_dyn_buf(dyn_buf, &pb);
 
     avio_wb32(avioc, tag);
     /* ID3v2.3 frame size is not sync-safe */
@@ -92,7 +92,7 @@
     avio_wb16(avioc, 0);
     avio_write(avioc, pb, len);
 
-    av_freep(&pb);
+    ffio_free_dyn_buf(&dyn_buf);
     return len + ID3v2_HEADER_SIZE;
 }
 
@@ -103,7 +103,7 @@
  */
 static int id3v2_put_priv(ID3v2EncContext *id3, AVIOContext *avioc, const char *key, const char *data)
 {
-    int len;
+    int len, ret;
     uint8_t *pb;
     AVIOContext *dyn_buf;
 
@@ -111,8 +111,8 @@
         return 0;
     }
 
-    if (avio_open_dyn_buf(&dyn_buf) < 0)
-        return AVERROR(ENOMEM);
+    if ((ret = avio_open_dyn_buf(&dyn_buf)) < 0)
+        return ret;
 
     // owner + null byte.
     avio_write(dyn_buf, key, strlen(key) + 1);
@@ -134,7 +134,7 @@
         }
     }
 
-    len = avio_close_dyn_buf(dyn_buf, &pb);
+    len = avio_get_dyn_buf(dyn_buf, &pb);
 
     avio_wb32(avioc, MKBETAG('P', 'R', 'I', 'V'));
     if (id3->version == 3)
@@ -144,7 +144,7 @@
     avio_wb16(avioc, 0);
     avio_write(avioc, pb, len);
 
-    av_free(pb);
+    ffio_free_dyn_buf(&dyn_buf);
 
     return len + ID3v2_HEADER_SIZE;
 }
@@ -255,17 +255,50 @@
     return 0;
 }
 
+static int write_ctoc(AVFormatContext *s, ID3v2EncContext *id3, int enc)
+{
+    uint8_t *dyn_buf;
+    AVIOContext *dyn_bc;
+    char name[123];
+    int len, ret;
+
+    if (s->nb_chapters == 0)
+        return 0;
+
+    if ((ret = avio_open_dyn_buf(&dyn_bc)) < 0)
+        return ret;
+
+    avio_put_str(dyn_bc, "toc");
+    avio_w8(dyn_bc, 0x03);
+    avio_w8(dyn_bc, s->nb_chapters);
+    for (int i = 0; i < s->nb_chapters; i++) {
+        snprintf(name, 122, "ch%d", i);
+        avio_put_str(dyn_bc, name);
+    }
+    len = avio_get_dyn_buf(dyn_bc, &dyn_buf);
+    id3->len += len + ID3v2_HEADER_SIZE;
+
+    avio_wb32(s->pb, MKBETAG('C', 'T', 'O', 'C'));
+    avio_wb32(s->pb, len);
+    avio_wb16(s->pb, 0);
+    avio_write(s->pb, dyn_buf, len);
+
+    ffio_free_dyn_buf(&dyn_bc);
+
+    return ret;
+}
+
 static int write_chapter(AVFormatContext *s, ID3v2EncContext *id3, int id, int enc)
 {
     const AVRational time_base = {1, 1000};
     AVChapter *ch = s->chapters[id];
-    uint8_t *dyn_buf = NULL;
-    AVIOContext *dyn_bc = NULL;
+    uint8_t *dyn_buf;
+    AVIOContext *dyn_bc;
     char name[123];
     int len, start, end, ret;
 
     if ((ret = avio_open_dyn_buf(&dyn_bc)) < 0)
-        goto fail;
+        return ret;
 
     start = av_rescale_q(ch->start, ch->time_base, time_base);
     end   = av_rescale_q(ch->end,   ch->time_base, time_base);
@@ -280,7 +313,7 @@
     if ((ret = write_metadata(dyn_bc, &ch->metadata, id3, enc)) < 0)
         goto fail;
 
-    len = avio_close_dyn_buf(dyn_bc, &dyn_buf);
+    len = avio_get_dyn_buf(dyn_bc, &dyn_buf);
     id3->len += 16 + ID3v2_HEADER_SIZE;
 
     avio_wb32(s->pb, MKBETAG('C', 'H', 'A', 'P'));
@@ -289,9 +322,7 @@
     avio_write(s->pb, dyn_buf, len);
 
 fail:
-    if (dyn_bc && !dyn_buf)
-        avio_close_dyn_buf(dyn_bc, &dyn_buf);
-    av_freep(&dyn_buf);
+    ffio_free_dyn_buf(&dyn_bc);
 
     return ret;
 }
@@ -306,6 +337,9 @@
     if ((ret = write_metadata(s->pb, &s->metadata, id3, enc)) < 0)
         return ret;
 
+    if ((ret = write_ctoc(s, id3, enc)) < 0)
+        return ret;
+
     for (i = 0; i < s->nb_chapters; i++) {
         if ((ret = write_chapter(s, id3, i, enc)) < 0)
             return ret;
@@ -325,7 +359,7 @@
     const char  *mimetype = NULL, *desc = "";
     int enc = id3->version == 3 ? ID3v2_ENCODING_UTF16BOM :
                                   ID3v2_ENCODING_UTF8;
-    int i, len, type = 0;
+    int i, len, type = 0, ret;
 
     /* get the mimetype*/
     while (mime->id != AV_CODEC_ID_NONE) {
@@ -359,15 +393,15 @@
         enc = ID3v2_ENCODING_ISO8859;
 
     /* start writing */
-    if (avio_open_dyn_buf(&dyn_buf) < 0)
-        return AVERROR(ENOMEM);
+    if ((ret = avio_open_dyn_buf(&dyn_buf)) < 0)
+        return ret;
 
     avio_w8(dyn_buf, enc);
     avio_put_str(dyn_buf, mimetype);
     avio_w8(dyn_buf, type);
     id3v2_encode_string(dyn_buf, desc, enc);
     avio_write(dyn_buf, pkt->data, pkt->size);
-    len = avio_close_dyn_buf(dyn_buf, &buf);
+    len = avio_get_dyn_buf(dyn_buf, &buf);
 
     avio_wb32(s->pb, MKBETAG('A', 'P', 'I', 'C'));
     if (id3->version == 3)
@@ -376,7 +410,7 @@
         id3v2_put_size(s->pb, len);
     avio_wb16(s->pb, 0);
     avio_write(s->pb, buf, len);
-    av_freep(&buf);
+    ffio_free_dyn_buf(&dyn_buf);
 
     id3->len += len + ID3v2_HEADER_SIZE;
 
diff --git a/libavformat/idcin.c b/libavformat/idcin.c
index cf69102..5a6a15a 100644
--- a/libavformat/idcin.c
+++ b/libavformat/idcin.c
@@ -91,7 +91,7 @@
     int64_t first_pkt_pos;
 } IdcinDemuxContext;
 
-static int idcin_probe(AVProbeData *p)
+static int idcin_probe(const AVProbeData *p)
 {
     unsigned int number, sample_rate;
     unsigned int w, h;
@@ -313,7 +313,6 @@
             return ret;
         else if (ret != chunk_size) {
             av_log(s, AV_LOG_ERROR, "incomplete packet\n");
-            av_packet_unref(pkt);
             return AVERROR(EIO);
         }
         if (command == 1) {
@@ -322,7 +321,6 @@
             pal = av_packet_new_side_data(pkt, AV_PKT_DATA_PALETTE,
                                           AVPALETTE_SIZE);
             if (!pal) {
-                av_packet_unref(pkt);
                 return AVERROR(ENOMEM);
             }
             memcpy(pal, palette, AVPALETTE_SIZE);
diff --git a/libavformat/idroqdec.c b/libavformat/idroqdec.c
index 8fd67a6..519f31d 100644
--- a/libavformat/idroqdec.c
+++ b/libavformat/idroqdec.c
@@ -59,7 +59,7 @@
 
 } RoqDemuxContext;
 
-static int roq_probe(AVProbeData *p)
+static int roq_probe(const AVProbeData *p)
 {
     if ((AV_RL16(&p->buf[0]) != RoQ_MAGIC_NUMBER) ||
         (AV_RL32(&p->buf[2]) != 0xFFFFFFFF))
@@ -205,8 +205,9 @@
             }
 
             /* load up the packet */
-            if (av_new_packet(pkt, chunk_size + RoQ_CHUNK_PREAMBLE_SIZE))
-                return AVERROR(EIO);
+            ret = av_new_packet(pkt, chunk_size + RoQ_CHUNK_PREAMBLE_SIZE);
+            if (ret < 0)
+                return ret;
             /* copy over preamble */
             memcpy(pkt->data, preamble, RoQ_CHUNK_PREAMBLE_SIZE);
 
@@ -223,8 +224,7 @@
             ret = avio_read(pb, pkt->data + RoQ_CHUNK_PREAMBLE_SIZE,
                 chunk_size);
             if (ret != chunk_size) {
-                av_packet_unref(pkt);
-                ret = AVERROR(EIO);
+                return AVERROR(EIO);
             }
 
             packet_read = 1;
diff --git a/libavformat/idroqenc.c b/libavformat/idroqenc.c
index 8122efe..261f219 100644
--- a/libavformat/idroqenc.c
+++ b/libavformat/idroqenc.c
@@ -55,7 +55,6 @@
     }
 
     avio_write(s->pb, header, 8);
-    avio_flush(s->pb);
 
     return 0;
 }
diff --git a/libavformat/iff.c b/libavformat/iff.c
index 4cf17f6..9cee31a 100644
--- a/libavformat/iff.c
+++ b/libavformat/iff.c
@@ -142,7 +142,7 @@
     return 0;
 }
 
-static int iff_probe(AVProbeData *p)
+static int iff_probe(const AVProbeData *p)
 {
     const uint8_t *d = p->buf;
 
@@ -525,12 +525,15 @@
                         data_size);
                  return AVERROR_INVALIDDATA;
             }
-            st->codecpar->extradata_size = data_size + IFF_EXTRA_VIDEO_SIZE;
-            st->codecpar->extradata      = av_malloc(data_size + IFF_EXTRA_VIDEO_SIZE + AV_INPUT_BUFFER_PADDING_SIZE);
-            if (!st->codecpar->extradata)
-                return AVERROR(ENOMEM);
-            if (avio_read(pb, st->codecpar->extradata + IFF_EXTRA_VIDEO_SIZE, data_size) < 0)
+            res = ff_alloc_extradata(st->codecpar,
+                                     data_size + IFF_EXTRA_VIDEO_SIZE);
+            if (res < 0)
+                return res;
+            if (avio_read(pb, st->codecpar->extradata + IFF_EXTRA_VIDEO_SIZE, data_size) < 0) {
+                av_freep(&st->codecpar->extradata);
+                st->codecpar->extradata_size = 0;
                 return AVERROR(EIO);
+            }
             break;
 
         case ID_BMHD:
@@ -768,10 +771,9 @@
         iff->transparency = transparency;
 
         if (!st->codecpar->extradata) {
-            st->codecpar->extradata_size = IFF_EXTRA_VIDEO_SIZE;
-            st->codecpar->extradata      = av_malloc(IFF_EXTRA_VIDEO_SIZE + AV_INPUT_BUFFER_PADDING_SIZE);
-            if (!st->codecpar->extradata)
-                return AVERROR(ENOMEM);
+            int ret = ff_alloc_extradata(st->codecpar, IFF_EXTRA_VIDEO_SIZE);
+            if (ret < 0)
+                return ret;
         }
         av_assert0(st->codecpar->extradata_size >= IFF_EXTRA_VIDEO_SIZE);
         buf = st->codecpar->extradata;
diff --git a/libavformat/ifv.c b/libavformat/ifv.c
new file mode 100644
index 0000000..f95e9b0
--- /dev/null
+++ b/libavformat/ifv.c
@@ -0,0 +1,309 @@
+/*
+ * IFV demuxer
+ *
+ * Copyright (c) 2019 Swaraj Hota
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "avformat.h"
+#include "internal.h"
+#include "avio_internal.h"
+
+typedef struct IFVContext {
+    uint32_t next_video_index;
+    uint32_t next_audio_index;
+    uint32_t total_vframes;
+    uint32_t total_aframes;
+
+    int width, height;
+    int is_audio_present;
+    int sample_rate;
+
+    int video_stream_index;
+    int audio_stream_index;
+} IFVContext;
+
+static int ifv_probe(const AVProbeData *p)
+{
+    static const uint8_t ifv_magic[] = {0x11, 0xd2, 0xd3, 0xab, 0xba, 0xa9,
+        0xcf, 0x11, 0x8e, 0xe6, 0x00, 0xc0, 0x0c, 0x20, 0x53, 0x65, 0x44};
+
+    if (!memcmp(p->buf, ifv_magic, sizeof(ifv_magic)))
+        return AVPROBE_SCORE_MAX;
+
+    return 0;
+}
+
+static int read_index(AVFormatContext *s,
+                      enum AVMediaType frame_type,
+                      uint32_t start_index)
+{
+    IFVContext *ifv = s->priv_data;
+    AVStream *st;
+    int64_t pos, size, timestamp;
+    uint32_t end_index, i;
+    int ret;
+
+    if (frame_type == AVMEDIA_TYPE_VIDEO) {
+        end_index = ifv->total_vframes;
+        st = s->streams[ifv->video_stream_index];
+    } else {
+        end_index = ifv->total_aframes;
+        st = s->streams[ifv->audio_stream_index];
+    }
+
+    for (i = start_index; i < end_index; i++) {
+        if (avio_feof(s->pb))
+            return AVERROR_EOF;
+        pos = avio_rl32(s->pb);
+        size = avio_rl32(s->pb);
+
+        avio_skip(s->pb, 8);
+        timestamp = avio_rl32(s->pb);
+
+        ret = av_add_index_entry(st, pos, timestamp, size, 0, 0);
+        if (ret < 0)
+            return ret;
+
+        avio_skip(s->pb, frame_type == AVMEDIA_TYPE_VIDEO ? 8: 4);
+    }
+
+    return 0;
+}
+
+static int parse_header(AVFormatContext *s)
+{
+    IFVContext *ifv = s->priv_data;
+    uint32_t aud_magic;
+    uint32_t vid_magic;
+
+    avio_skip(s->pb, 0x34);
+    avpriv_dict_set_timestamp(&s->metadata, "creation_time", avio_rl32(s->pb) * 1000000LL);
+    avio_skip(s->pb, 0x24);
+
+    ifv->width = avio_rl16(s->pb);
+    ifv->height = avio_rl16(s->pb);
+
+    avio_skip(s->pb, 0x8);
+    vid_magic = avio_rl32(s->pb);
+
+    if (vid_magic != MKTAG('H','2','6','4'))
+        avpriv_request_sample(s, "Unknown video codec %x", vid_magic);
+
+    avio_skip(s->pb, 0x2c);
+    ifv->sample_rate = avio_rl32(s->pb);
+    aud_magic = avio_rl32(s->pb);
+
+    if (aud_magic == MKTAG('G','R','A','W')) {
+        ifv->is_audio_present = 1;
+    } else if (aud_magic == MKTAG('P','C','M','U')) {
+        ifv->is_audio_present = 0;
+    } else {
+        avpriv_request_sample(s, "Unknown audio codec %x", aud_magic);
+    }
+
+    avio_skip(s->pb, 0x44);
+    ifv->total_vframes = avio_rl32(s->pb);
+    ifv->total_aframes = avio_rl32(s->pb);
+
+    return 0;
+}
+
+static int ifv_read_header(AVFormatContext *s)
+{
+    IFVContext *ifv = s->priv_data;
+    AVStream *st;
+    int ret;
+
+    ret = parse_header(s);
+    if (ret < 0)
+        return ret;
+
+    st = avformat_new_stream(s, NULL);
+    if (!st)
+        return AVERROR(ENOMEM);
+
+    st->codecpar->codec_type = AVMEDIA_TYPE_VIDEO;
+    st->codecpar->codec_id = AV_CODEC_ID_H264;
+    st->codecpar->width = ifv->width;
+    st->codecpar->height = ifv->height;
+    st->start_time = 0;
+    ifv->video_stream_index = st->index;
+
+    avpriv_set_pts_info(st, 32, 1, 1000);
+
+    if (ifv->is_audio_present) {
+        st = avformat_new_stream(s, NULL);
+        if (!st)
+            return AVERROR(ENOMEM);
+
+        st->codecpar->codec_type = AVMEDIA_TYPE_AUDIO;
+        st->codecpar->codec_id = AV_CODEC_ID_PCM_S16LE;
+        st->codecpar->channels = 1;
+        st->codecpar->channel_layout = AV_CH_LAYOUT_MONO;
+        st->codecpar->sample_rate = ifv->sample_rate;
+        ifv->audio_stream_index = st->index;
+
+        avpriv_set_pts_info(st, 32, 1, 1000);
+    }
+
+    /*read video index*/
+    avio_seek(s->pb, 0xf8, SEEK_SET);
+
+    ret = read_index(s, AVMEDIA_TYPE_VIDEO, 0);
+    if (ret < 0)
+        return ret;
+
+    if (ifv->is_audio_present) {
+        /*read audio index*/
+        avio_seek(s->pb, 0x14918, SEEK_SET);
+
+        ret = read_index(s, AVMEDIA_TYPE_AUDIO, 0);
+        if (ret < 0)
+            return ret;
+    }
+
+    ifv->next_video_index = 0;
+    ifv->next_audio_index = 0;
+
+    return 0;
+}
+
+static int ifv_read_packet(AVFormatContext *s, AVPacket *pkt)
+{
+    IFVContext *ifv = s->priv_data;
+    AVStream *st;
+    AVIndexEntry *ev, *ea, *e_next;
+    int ret;
+
+    ev = ea = e_next = NULL;
+
+    if (ifv->next_video_index < ifv->total_vframes) {
+        st = s->streams[ifv->video_stream_index];
+        if (ifv->next_video_index < st->nb_index_entries)
+            e_next = ev = &st->index_entries[ifv->next_video_index];
+    }
+
+    if (ifv->is_audio_present &&
+        ifv->next_audio_index < ifv->total_aframes) {
+        st = s->streams[ifv->audio_stream_index];
+        if (ifv->next_audio_index < st->nb_index_entries) {
+            ea = &st->index_entries[ifv->next_audio_index];
+            if (!ev || ea->timestamp < ev->timestamp)
+                e_next = ea;
+        }
+    }
+
+    if (!ev) {
+        if (ifv->is_audio_present && !ea) {
+            /*read new video and audio indexes*/
+
+            ifv->next_video_index = ifv->total_vframes;
+            ifv->next_audio_index = ifv->total_aframes;
+
+            avio_skip(s->pb, 0x1c);
+            ifv->total_vframes += avio_rl32(s->pb);
+            ifv->total_aframes += avio_rl32(s->pb);
+            avio_skip(s->pb, 0xc);
+
+            if (avio_feof(s->pb))
+                return AVERROR_EOF;
+
+            ret = read_index(s, AVMEDIA_TYPE_VIDEO, ifv->next_video_index);
+            if (ret < 0)
+                return ret;
+
+            ret = read_index(s, AVMEDIA_TYPE_AUDIO, ifv->next_audio_index);
+            if (ret < 0)
+                return ret;
+
+            return 0;
+
+        } else if (!ifv->is_audio_present) {
+            /*read new video index*/
+
+            ifv->next_video_index = ifv->total_vframes;
+
+            avio_skip(s->pb, 0x1c);
+            ifv->total_vframes += avio_rl32(s->pb);
+            avio_skip(s->pb, 0x10);
+
+            if (avio_feof(s->pb))
+                return AVERROR_EOF;
+
+            ret = read_index(s, AVMEDIA_TYPE_VIDEO, ifv->next_video_index);
+            if (ret < 0)
+                return ret;
+
+            return 0;
+        }
+    }
+
+    if (!e_next) return AVERROR_EOF;
+
+    avio_seek(s->pb, e_next->pos, SEEK_SET);
+    ret = av_get_packet(s->pb, pkt, e_next->size);
+    if (ret < 0)
+        return ret;
+
+    if (e_next == ev) {
+        ifv->next_video_index++;
+        pkt->stream_index = ifv->video_stream_index;
+    } else {
+        ifv->next_audio_index++;
+        pkt->stream_index = ifv->audio_stream_index;
+    }
+
+    pkt->pts = e_next->timestamp;
+    pkt->pos = e_next->pos;
+
+    return 0;
+}
+
+static int ifv_read_seek(AVFormatContext *s, int stream_index, int64_t ts, int flags)
+{
+    IFVContext *ifv = s->priv_data;
+
+    for (unsigned i = 0; i < s->nb_streams; i++) {
+        int index = av_index_search_timestamp(s->streams[i], ts, AVSEEK_FLAG_ANY);
+        if (index < 0) {
+            ifv->next_video_index = ifv->total_vframes - 1;
+            ifv->next_audio_index = ifv->total_aframes - 1;
+            return 0;
+        }
+
+        if (i == ifv->video_stream_index) {
+            ifv->next_video_index = index;
+        } else {
+            ifv->next_audio_index = index;
+        }
+    }
+
+    return 0;
+}
+
+AVInputFormat ff_ifv_demuxer = {
+    .name           = "ifv",
+    .long_name      = NULL_IF_CONFIG_SMALL("IFV CCTV DVR"),
+    .priv_data_size = sizeof(IFVContext),
+    .extensions     = "ifv",
+    .read_probe     = ifv_probe,
+    .read_header    = ifv_read_header,
+    .read_packet    = ifv_read_packet,
+    .read_seek      = ifv_read_seek,
+};
diff --git a/libavformat/ilbc.c b/libavformat/ilbc.c
index 50e3c3c..188c0f0 100644
--- a/libavformat/ilbc.c
+++ b/libavformat/ilbc.c
@@ -21,6 +21,7 @@
 
 #include "avformat.h"
 #include "internal.h"
+#include "rawenc.h"
 
 static const char mode20_header[] = "#!iLBC20\n";
 static const char mode30_header[] = "#!iLBC30\n";
@@ -49,17 +50,10 @@
         av_log(s, AV_LOG_ERROR, "Unsupported mode\n");
         return AVERROR(EINVAL);
     }
-    avio_flush(pb);
     return 0;
 }
 
-static int ilbc_write_packet(AVFormatContext *s, AVPacket *pkt)
-{
-    avio_write(s->pb, pkt->data, pkt->size);
-    return 0;
-}
-
-static int ilbc_probe(AVProbeData *p)
+static int ilbc_probe(const AVProbeData *p)
 {
     // Only check for "#!iLBC" which matches both formats
     if (!memcmp(p->buf, mode20_header, 6))
@@ -112,7 +106,6 @@
     pkt->pos = avio_tell(s->pb);
     pkt->duration = par->block_align == 38 ? 160 : 240;
     if ((ret = avio_read(s->pb, pkt->data, par->block_align)) != par->block_align) {
-        av_packet_unref(pkt);
         return ret < 0 ? ret : AVERROR(EIO);
     }
 
@@ -128,6 +121,7 @@
     .flags        = AVFMT_GENERIC_INDEX,
 };
 
+#if CONFIG_ILBC_MUXER
 AVOutputFormat ff_ilbc_muxer = {
     .name         = "ilbc",
     .long_name    = NULL_IF_CONFIG_SMALL("iLBC storage"),
@@ -135,6 +129,7 @@
     .extensions   = "lbc",
     .audio_codec  = AV_CODEC_ID_ILBC,
     .write_header = ilbc_write_header,
-    .write_packet = ilbc_write_packet,
+    .write_packet = ff_raw_write_packet,
     .flags        = AVFMT_NOTIMESTAMPS,
 };
+#endif
diff --git a/libavformat/img2.c b/libavformat/img2.c
index 8432cc0..16bc9d2 100644
--- a/libavformat/img2.c
+++ b/libavformat/img2.c
@@ -51,6 +51,7 @@
     { AV_CODEC_ID_TARGA,      "tga"      },
     { AV_CODEC_ID_TIFF,       "tiff"     },
     { AV_CODEC_ID_TIFF,       "tif"      },
+    { AV_CODEC_ID_TIFF,       "dng"      },
     { AV_CODEC_ID_SGI,        "sgi"      },
     { AV_CODEC_ID_PTX,        "ptx"      },
     { AV_CODEC_ID_PCX,        "pcx"      },
diff --git a/libavformat/img2.h b/libavformat/img2.h
index 0e5b374..5fd8ff7 100644
--- a/libavformat/img2.h
+++ b/libavformat/img2.h
@@ -61,6 +61,7 @@
     int start_number_range;
     int frame_size;
     int ts_from_file;
+    int export_path_metadata; /**< enabled when set to 1. */
 } VideoDemuxData;
 
 typedef struct IdStrMap {
diff --git a/libavformat/img2_alias_pix.c b/libavformat/img2_alias_pix.c
index c2650ad..2fa3b28 100644
--- a/libavformat/img2_alias_pix.c
+++ b/libavformat/img2_alias_pix.c
@@ -22,7 +22,7 @@
 #include "img2.h"
 #include "libavcodec/bytestream.h"
 
-static int alias_pix_read_probe(AVProbeData *p)
+static int alias_pix_read_probe(const AVProbeData *p)
 {
     const uint8_t *b = p->buf;
     const uint8_t *end = b + p->buf_size;
diff --git a/libavformat/img2_brender_pix.c b/libavformat/img2_brender_pix.c
index ae6b3dd..b8ac3d2 100644
--- a/libavformat/img2_brender_pix.c
+++ b/libavformat/img2_brender_pix.c
@@ -22,7 +22,7 @@
 #include "img2.h"
 #include "libavutil/intreadwrite.h"
 
-static int brender_read_probe(AVProbeData *p)
+static int brender_read_probe(const AVProbeData *p)
 {
     static const uint8_t brender_magic[16] = {
         0,0,0,0x12,0,0,0,8,0,0,0,2,0,0,0,2
diff --git a/libavformat/img2dec.c b/libavformat/img2dec.c
index ff4757e..40f3e3d 100644
--- a/libavformat/img2dec.c
+++ b/libavformat/img2dec.c
@@ -29,6 +29,7 @@
 #include "libavutil/pixdesc.h"
 #include "libavutil/parseutils.h"
 #include "libavutil/intreadwrite.h"
+#include "libavcodec/gif.h"
 #include "avformat.h"
 #include "avio_internal.h"
 #include "internal.h"
@@ -159,7 +160,7 @@
     return -1;
 }
 
-static int img_read_probe(AVProbeData *p)
+static int img_read_probe(const AVProbeData *p)
 {
     if (p->filename && ff_guess_image2_codec(p->filename)) {
         if (av_filename_number_test(p->filename))
@@ -355,6 +356,7 @@
             }
             if (s1->flags & AVFMT_FLAG_CUSTOM_IO) {
                 avio_seek(s1->pb, 0, SEEK_SET);
+                av_freep(&probe_buffer);
             } else
                 ffio_rewind_with_probe_data(s1->pb, &probe_buffer, probe_buffer_size);
         }
@@ -372,6 +374,33 @@
     return 0;
 }
 
+/**
+ * Add this frame's source path and basename to packet's sidedata
+ * as a dictionary, so it can be used by filters like 'drawtext'.
+ */
+static int add_filename_as_pkt_side_data(char *filename, AVPacket *pkt) {
+    uint8_t* metadata;
+    int metadata_len;
+    AVDictionary *d = NULL;
+    char *packed_metadata = NULL;
+
+    av_dict_set(&d, "lavf.image2dec.source_path", filename, 0);
+    av_dict_set(&d, "lavf.image2dec.source_basename", av_basename(filename), 0);
+
+    packed_metadata = av_packet_pack_dictionary(d, &metadata_len);
+    av_dict_free(&d);
+    if (!packed_metadata)
+        return AVERROR(ENOMEM);
+    if (!(metadata = av_packet_new_side_data(pkt, AV_PKT_DATA_STRINGS_METADATA, metadata_len))) {
+        av_freep(&packed_metadata);
+        return AVERROR(ENOMEM);
+    }
+    memcpy(metadata, packed_metadata, metadata_len);
+    av_freep(&packed_metadata);
+
+    return 0;
+}
+
 int ff_img_read_packet(AVFormatContext *s1, AVPacket *pkt)
 {
     VideoDemuxData *s = s1->priv_data;
@@ -423,7 +452,7 @@
 
         if (par->codec_id == AV_CODEC_ID_NONE) {
             AVProbeData pd = { 0 };
-            AVInputFormat *ifmt;
+            const AVInputFormat *ifmt;
             uint8_t header[PROBE_BUF_MIN + AVPROBE_PADDING_SIZE];
             int ret;
             int score = 0;
@@ -484,6 +513,17 @@
     if (s->is_pipe)
         pkt->pos = avio_tell(f[0]);
 
+    /*
+     * export_path_metadata must be explicitly enabled via
+     * command line options for path metadata to be exported
+     * as packet side_data.
+     */
+    if (!s->is_pipe && s->export_path_metadata == 1) {
+        res = add_filename_as_pkt_side_data(filename, pkt);
+        if (res < 0)
+            goto fail;
+    }
+
     pkt->size = 0;
     for (i = 0; i < 3; i++) {
         if (f[i]) {
@@ -502,7 +542,6 @@
     }
 
     if (ret[0] <= 0 || ret[1] < 0 || ret[2] < 0) {
-        av_packet_unref(pkt);
         if (ret[0] < 0) {
             res = ret[0];
         } else if (ret[1] < 0) {
@@ -563,29 +602,30 @@
 
 #define OFFSET(x) offsetof(VideoDemuxData, x)
 #define DEC AV_OPT_FLAG_DECODING_PARAM
-const AVOption ff_img_options[] = {
-    { "framerate",    "set the video framerate",             OFFSET(framerate),    AV_OPT_TYPE_VIDEO_RATE, {.str = "25"}, 0, INT_MAX,   DEC },
-    { "loop",         "force loop over input file sequence", OFFSET(loop),         AV_OPT_TYPE_BOOL,   {.i64 = 0   }, 0, 1,       DEC },
+#define COMMON_OPTIONS \
+    { "framerate",    "set the video framerate", OFFSET(framerate),    AV_OPT_TYPE_VIDEO_RATE, {.str = "25"}, 0, INT_MAX, DEC }, \
+    { "pixel_format", "set video pixel format",  OFFSET(pixel_format), AV_OPT_TYPE_STRING,     {.str = NULL}, 0, 0,       DEC }, \
+    { "video_size",   "set video size",          OFFSET(width),        AV_OPT_TYPE_IMAGE_SIZE, {.str = NULL}, 0, 0,       DEC }, \
+    { "loop",         "force loop over input file sequence", OFFSET(loop), AV_OPT_TYPE_BOOL,   {.i64 = 0   }, 0, 1,       DEC }, \
+    { NULL },
 
+#if CONFIG_IMAGE2_DEMUXER
+const AVOption ff_img_options[] = {
     { "pattern_type", "set pattern type",                    OFFSET(pattern_type), AV_OPT_TYPE_INT,    {.i64=PT_DEFAULT}, 0,       INT_MAX, DEC, "pattern_type"},
     { "glob_sequence","select glob/sequence pattern type",   0, AV_OPT_TYPE_CONST,  {.i64=PT_GLOB_SEQUENCE}, INT_MIN, INT_MAX, DEC, "pattern_type" },
     { "glob",         "select glob pattern type",            0, AV_OPT_TYPE_CONST,  {.i64=PT_GLOB         }, INT_MIN, INT_MAX, DEC, "pattern_type" },
     { "sequence",     "select sequence pattern type",        0, AV_OPT_TYPE_CONST,  {.i64=PT_SEQUENCE     }, INT_MIN, INT_MAX, DEC, "pattern_type" },
     { "none",         "disable pattern matching",            0, AV_OPT_TYPE_CONST,  {.i64=PT_NONE         }, INT_MIN, INT_MAX, DEC, "pattern_type" },
-
-    { "pixel_format", "set video pixel format",              OFFSET(pixel_format), AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0,       DEC },
     { "start_number", "set first number in the sequence",    OFFSET(start_number), AV_OPT_TYPE_INT,    {.i64 = 0   }, INT_MIN, INT_MAX, DEC },
     { "start_number_range", "set range for looking at the first sequence number", OFFSET(start_number_range), AV_OPT_TYPE_INT, {.i64 = 5}, 1, INT_MAX, DEC },
-    { "video_size",   "set video size",                      OFFSET(width),        AV_OPT_TYPE_IMAGE_SIZE, {.str = NULL}, 0, 0,   DEC },
-    { "frame_size",   "force frame size in bytes",           OFFSET(frame_size),   AV_OPT_TYPE_INT,    {.i64 = 0   }, 0, INT_MAX, DEC },
     { "ts_from_file", "set frame timestamp from file's one", OFFSET(ts_from_file), AV_OPT_TYPE_INT,    {.i64 = 0   }, 0, 2,       DEC, "ts_type" },
     { "none", "none",                   0, AV_OPT_TYPE_CONST,    {.i64 = 0   }, 0, 2,       DEC, "ts_type" },
     { "sec",  "second precision",       0, AV_OPT_TYPE_CONST,    {.i64 = 1   }, 0, 2,       DEC, "ts_type" },
     { "ns",   "nano second precision",  0, AV_OPT_TYPE_CONST,    {.i64 = 2   }, 0, 2,       DEC, "ts_type" },
-    { NULL },
+    { "export_path_metadata", "enable metadata containing input path information", OFFSET(export_path_metadata), AV_OPT_TYPE_BOOL,   {.i64 = 0   }, 0, 1,       DEC }, \
+    COMMON_OPTIONS
 };
 
-#if CONFIG_IMAGE2_DEMUXER
 static const AVClass img2_class = {
     .class_name = "image2 demuxer",
     .item_name  = av_default_item_name,
@@ -605,11 +645,17 @@
     .priv_class     = &img2_class,
 };
 #endif
+
+const AVOption ff_img2pipe_options[] = {
+    { "frame_size", "force frame size in bytes", OFFSET(frame_size), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, INT_MAX, DEC },
+    COMMON_OPTIONS
+};
+
 #if CONFIG_IMAGE2PIPE_DEMUXER
 static const AVClass img2pipe_class = {
     .class_name = "image2pipe demuxer",
     .item_name  = av_default_item_name,
-    .option     = ff_img_options,
+    .option     = ff_img2pipe_options,
     .version    = LIBAVUTIL_VERSION_INT,
 };
 AVInputFormat ff_image2pipe_demuxer = {
@@ -622,7 +668,7 @@
 };
 #endif
 
-static int bmp_probe(AVProbeData *p)
+static int bmp_probe(const AVProbeData *p)
 {
     const uint8_t *b = p->buf;
     int ihsize;
@@ -640,7 +686,7 @@
     return AVPROBE_SCORE_EXTENSION / 4;
 }
 
-static int dds_probe(AVProbeData *p)
+static int dds_probe(const AVProbeData *p)
 {
     const uint8_t *b = p->buf;
 
@@ -651,7 +697,7 @@
     return 0;
 }
 
-static int dpx_probe(AVProbeData *p)
+static int dpx_probe(const AVProbeData *p)
 {
     const uint8_t *b = p->buf;
     int w, h;
@@ -669,7 +715,7 @@
     return 0;
 }
 
-static int exr_probe(AVProbeData *p)
+static int exr_probe(const AVProbeData *p)
 {
     const uint8_t *b = p->buf;
 
@@ -678,7 +724,7 @@
     return 0;
 }
 
-static int j2k_probe(AVProbeData *p)
+static int j2k_probe(const AVProbeData *p)
 {
     const uint8_t *b = p->buf;
 
@@ -688,7 +734,7 @@
     return 0;
 }
 
-static int jpeg_probe(AVProbeData *p)
+static int jpeg_probe(const AVProbeData *p)
 {
     const uint8_t *b = p->buf;
     int i, state = SOI;
@@ -763,7 +809,7 @@
     return AVPROBE_SCORE_EXTENSION / 8;
 }
 
-static int jpegls_probe(AVProbeData *p)
+static int jpegls_probe(const AVProbeData *p)
 {
     const uint8_t *b = p->buf;
 
@@ -772,7 +818,7 @@
     return 0;
 }
 
-static int pcx_probe(AVProbeData *p)
+static int pcx_probe(const AVProbeData *p)
 {
     const uint8_t *b = p->buf;
 
@@ -793,7 +839,7 @@
     return AVPROBE_SCORE_EXTENSION + 1;
 }
 
-static int qdraw_probe(AVProbeData *p)
+static int qdraw_probe(const AVProbeData *p)
 {
     const uint8_t *b = p->buf;
 
@@ -809,7 +855,7 @@
     return 0;
 }
 
-static int pictor_probe(AVProbeData *p)
+static int pictor_probe(const AVProbeData *p)
 {
     const uint8_t *b = p->buf;
 
@@ -818,7 +864,7 @@
     return 0;
 }
 
-static int png_probe(AVProbeData *p)
+static int png_probe(const AVProbeData *p)
 {
     const uint8_t *b = p->buf;
 
@@ -827,7 +873,7 @@
     return 0;
 }
 
-static int psd_probe(AVProbeData *p)
+static int psd_probe(const AVProbeData *p)
 {
     const uint8_t *b = p->buf;
     int ret = 0;
@@ -855,7 +901,7 @@
     return AVPROBE_SCORE_EXTENSION + ret;
 }
 
-static int sgi_probe(AVProbeData *p)
+static int sgi_probe(const AVProbeData *p)
 {
     const uint8_t *b = p->buf;
 
@@ -867,7 +913,7 @@
     return 0;
 }
 
-static int sunrast_probe(AVProbeData *p)
+static int sunrast_probe(const AVProbeData *p)
 {
     const uint8_t *b = p->buf;
 
@@ -876,7 +922,7 @@
     return 0;
 }
 
-static int svg_probe(AVProbeData *p)
+static int svg_probe(const AVProbeData *p)
 {
     const uint8_t *b = p->buf;
     const uint8_t *end = p->buf + p->buf_size;
@@ -896,7 +942,7 @@
     return 0;
 }
 
-static int tiff_probe(AVProbeData *p)
+static int tiff_probe(const AVProbeData *p)
 {
     const uint8_t *b = p->buf;
 
@@ -906,7 +952,7 @@
     return 0;
 }
 
-static int webp_probe(AVProbeData *p)
+static int webp_probe(const AVProbeData *p)
 {
     const uint8_t *b = p->buf;
 
@@ -934,39 +980,39 @@
     return 0;
 }
 
-static int pbm_probe(AVProbeData *p)
+static int pbm_probe(const AVProbeData *p)
 {
     return pnm_magic_check(p, 1) || pnm_magic_check(p, 4) ? pnm_probe(p) : 0;
 }
 
-static inline int pgmx_probe(AVProbeData *p)
+static inline int pgmx_probe(const AVProbeData *p)
 {
     return pnm_magic_check(p, 2) || pnm_magic_check(p, 5) ? pnm_probe(p) : 0;
 }
 
-static int pgm_probe(AVProbeData *p)
+static int pgm_probe(const AVProbeData *p)
 {
     int ret = pgmx_probe(p);
     return ret && !av_match_ext(p->filename, "pgmyuv") ? ret : 0;
 }
 
-static int pgmyuv_probe(AVProbeData *p) // custom FFmpeg format recognized by file extension
+static int pgmyuv_probe(const AVProbeData *p) // custom FFmpeg format recognized by file extension
 {
     int ret = pgmx_probe(p);
     return ret && av_match_ext(p->filename, "pgmyuv") ? ret : 0;
 }
 
-static int ppm_probe(AVProbeData *p)
+static int ppm_probe(const AVProbeData *p)
 {
     return pnm_magic_check(p, 3) || pnm_magic_check(p, 6) ? pnm_probe(p) : 0;
 }
 
-static int pam_probe(AVProbeData *p)
+static int pam_probe(const AVProbeData *p)
 {
     return pnm_magic_check(p, 7) ? pnm_probe(p) : 0;
 }
 
-static int xpm_probe(AVProbeData *p)
+static int xpm_probe(const AVProbeData *p)
 {
     const uint8_t *b = p->buf;
 
@@ -975,7 +1021,7 @@
     return 0;
 }
 
-static int xwd_probe(AVProbeData *p)
+static int xwd_probe(const AVProbeData *p)
 {
     const uint8_t *b = p->buf;
     unsigned width, bpp, bpad, lsize;
@@ -1005,11 +1051,24 @@
     return AVPROBE_SCORE_MAX / 2 + 1;
 }
 
+static int gif_probe(const AVProbeData *p)
+{
+    /* check magick */
+    if (memcmp(p->buf, gif87a_sig, 6) && memcmp(p->buf, gif89a_sig, 6))
+        return 0;
+
+    /* width or height contains zero? */
+    if (!AV_RL16(&p->buf[6]) || !AV_RL16(&p->buf[8]))
+        return 0;
+
+    return AVPROBE_SCORE_MAX - 1;
+}
+
 #define IMAGEAUTO_DEMUXER(imgname, codecid)\
 static const AVClass imgname ## _class = {\
     .class_name = AV_STRINGIFY(imgname) " demuxer",\
     .item_name  = av_default_item_name,\
-    .option     = ff_img_options,\
+    .option     = ff_img2pipe_options,\
     .version    = LIBAVUTIL_VERSION_INT,\
 };\
 AVInputFormat ff_image_ ## imgname ## _pipe_demuxer = {\
@@ -1028,6 +1087,7 @@
 IMAGEAUTO_DEMUXER(dds,     AV_CODEC_ID_DDS)
 IMAGEAUTO_DEMUXER(dpx,     AV_CODEC_ID_DPX)
 IMAGEAUTO_DEMUXER(exr,     AV_CODEC_ID_EXR)
+IMAGEAUTO_DEMUXER(gif,     AV_CODEC_ID_GIF)
 IMAGEAUTO_DEMUXER(j2k,     AV_CODEC_ID_JPEG2000)
 IMAGEAUTO_DEMUXER(jpeg,    AV_CODEC_ID_MJPEG)
 IMAGEAUTO_DEMUXER(jpegls,  AV_CODEC_ID_JPEGLS)
diff --git a/libavformat/img2enc.c b/libavformat/img2enc.c
index a09cc8e..b303d38 100644
--- a/libavformat/img2enc.c
+++ b/libavformat/img2enc.c
@@ -23,6 +23,7 @@
 #include "libavutil/intreadwrite.h"
 #include "libavutil/avassert.h"
 #include "libavutil/avstring.h"
+#include "libavutil/dict.h"
 #include "libavutil/log.h"
 #include "libavutil/opt.h"
 #include "libavutil/pixdesc.h"
@@ -35,7 +36,6 @@
 typedef struct VideoMuxData {
     const AVClass *class;  /**< Class for private options. */
     int img_number;
-    int is_pipe;
     int split_planes;       /**< use independent file for each Y, U, V plane */
     char path[1024];
     char tmp[4][1024];
@@ -45,6 +45,7 @@
     int frame_pts;
     const char *muxer;
     int use_rename;
+    AVDictionary *protocol_opts;
 } VideoMuxData;
 
 static int write_header(AVFormatContext *s)
@@ -55,12 +56,6 @@
 
     av_strlcpy(img->path, s->url, sizeof(img->path));
 
-    /* find format */
-    if (s->oformat->flags & AVFMT_NOFILE)
-        img->is_pipe = 0;
-    else
-        img->is_pipe = 1;
-
     if (st->codecpar->codec_id == AV_CODEC_ID_GIF) {
         img->muxer = "gif";
     } else if (st->codecpar->codec_id == AV_CODEC_ID_FITS) {
@@ -78,59 +73,116 @@
     return 0;
 }
 
+static int write_muxed_file(AVFormatContext *s, AVIOContext *pb, AVPacket *pkt)
+{
+    VideoMuxData *img = s->priv_data;
+    AVCodecParameters *par = s->streams[pkt->stream_index]->codecpar;
+    AVStream *st;
+    AVPacket pkt2;
+    AVFormatContext *fmt = NULL;
+    int ret;
+
+    /* URL is not used directly as we are overriding the IO context later. */
+    ret = avformat_alloc_output_context2(&fmt, NULL, img->muxer, s->url);
+    if (ret < 0)
+        return ret;
+    st = avformat_new_stream(fmt, NULL);
+    if (!st) {
+        ret = AVERROR(ENOMEM);
+        goto out;
+    }
+    st->id = pkt->stream_index;
+
+    fmt->pb = pb;
+
+    ret = av_packet_ref(&pkt2, pkt);
+    if (ret < 0)
+        goto out;
+    pkt2.stream_index = 0;
+
+    if ((ret = avcodec_parameters_copy(st->codecpar, par))     < 0 ||
+        (ret = avformat_write_header(fmt, NULL))               < 0 ||
+        (ret = av_interleaved_write_frame(fmt, &pkt2))         < 0 ||
+        (ret = av_write_trailer(fmt))) {}
+
+    av_packet_unref(&pkt2);
+out:
+    avformat_free_context(fmt);
+    return ret;
+}
+
+static int write_packet_pipe(AVFormatContext *s, AVPacket *pkt)
+{
+    VideoMuxData *img = s->priv_data;
+    if (img->muxer) {
+        int ret = write_muxed_file(s, s->pb, pkt);
+        if (ret < 0)
+            return ret;
+    } else {
+        avio_write(s->pb, pkt->data, pkt->size);
+    }
+    img->img_number++;
+    return 0;
+}
+
 static int write_packet(AVFormatContext *s, AVPacket *pkt)
 {
     VideoMuxData *img = s->priv_data;
-    AVIOContext *pb[4];
+    AVIOContext *pb[4] = {0};
     char filename[1024];
     AVCodecParameters *par = s->streams[pkt->stream_index]->codecpar;
     const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(par->format);
-    int i;
+    int ret, i;
     int nb_renames = 0;
+    AVDictionary *options = NULL;
 
-    if (!img->is_pipe) {
-        if (img->update) {
-            av_strlcpy(filename, img->path, sizeof(filename));
-        } else if (img->use_strftime) {
-            time_t now0;
-            struct tm *tm, tmpbuf;
-            time(&now0);
-            tm = localtime_r(&now0, &tmpbuf);
-            if (!strftime(filename, sizeof(filename), img->path, tm)) {
-                av_log(s, AV_LOG_ERROR, "Could not get frame filename with strftime\n");
-                return AVERROR(EINVAL);
-            }
-        } else if (img->frame_pts) {
-            if (av_get_frame_filename2(filename, sizeof(filename), img->path, pkt->pts, AV_FRAME_FILENAME_FLAGS_MULTIPLE) < 0) {
-                av_log(s, AV_LOG_ERROR, "Cannot write filename by pts of the frames.");
-                return AVERROR(EINVAL);
-            }
-        } else if (av_get_frame_filename2(filename, sizeof(filename), img->path,
-                                          img->img_number,
-                                          AV_FRAME_FILENAME_FLAGS_MULTIPLE) < 0 &&
-                   img->img_number > 1) {
-            av_log(s, AV_LOG_ERROR,
-                   "Could not get frame filename number %d from pattern '%s' (either set update or use a pattern like %%03d within the filename pattern)\n",
-                   img->img_number, img->path);
+    if (img->update) {
+        av_strlcpy(filename, img->path, sizeof(filename));
+    } else if (img->use_strftime) {
+        time_t now0;
+        struct tm *tm, tmpbuf;
+        time(&now0);
+        tm = localtime_r(&now0, &tmpbuf);
+        if (!strftime(filename, sizeof(filename), img->path, tm)) {
+            av_log(s, AV_LOG_ERROR, "Could not get frame filename with strftime\n");
             return AVERROR(EINVAL);
         }
-        for (i = 0; i < 4; i++) {
-            snprintf(img->tmp[i], sizeof(img->tmp[i]), "%s.tmp", filename);
-            av_strlcpy(img->target[i], filename, sizeof(img->target[i]));
-            if (s->io_open(s, &pb[i], img->use_rename ? img->tmp[i] : filename, AVIO_FLAG_WRITE, NULL) < 0) {
-                av_log(s, AV_LOG_ERROR, "Could not open file : %s\n", img->use_rename ? img->tmp[i] : filename);
-                return AVERROR(EIO);
-            }
-
-            if (!img->split_planes || i+1 >= desc->nb_components)
-                break;
-            filename[strlen(filename) - 1] = "UVAx"[i];
+    } else if (img->frame_pts) {
+        if (av_get_frame_filename2(filename, sizeof(filename), img->path, pkt->pts, AV_FRAME_FILENAME_FLAGS_MULTIPLE) < 0) {
+            av_log(s, AV_LOG_ERROR, "Cannot write filename by pts of the frames.");
+            return AVERROR(EINVAL);
         }
-        if (img->use_rename)
-            nb_renames = i + 1;
-    } else {
-        pb[0] = s->pb;
+    } else if (av_get_frame_filename2(filename, sizeof(filename), img->path,
+                                      img->img_number,
+                                      AV_FRAME_FILENAME_FLAGS_MULTIPLE) < 0 &&
+               img->img_number > 1) {
+        av_log(s, AV_LOG_ERROR,
+               "Could not get frame filename number %d from pattern '%s'. "
+               "Use '-frames:v 1' for a single image, or '-update' option, or use a pattern such as %%03d within the filename.\n",
+               img->img_number, img->path);
+        return AVERROR(EINVAL);
     }
+    for (i = 0; i < 4; i++) {
+        av_dict_copy(&options, img->protocol_opts, 0);
+        snprintf(img->tmp[i], sizeof(img->tmp[i]), "%s.tmp", filename);
+        av_strlcpy(img->target[i], filename, sizeof(img->target[i]));
+        if (s->io_open(s, &pb[i], img->use_rename ? img->tmp[i] : filename, AVIO_FLAG_WRITE, &options) < 0) {
+            av_log(s, AV_LOG_ERROR, "Could not open file : %s\n", img->use_rename ? img->tmp[i] : filename);
+            ret = AVERROR(EIO);
+            goto fail;
+        }
+        if (options) {
+            av_log(s, AV_LOG_ERROR, "Could not recognize some protocol options\n");
+            ret = AVERROR(EINVAL);
+            goto fail;
+        }
+
+        if (!img->split_planes || i+1 >= desc->nb_components)
+            break;
+        filename[strlen(filename) - 1] = "UVAx"[i];
+    }
+    if (img->use_rename)
+        nb_renames = i + 1;
 
     if (img->split_planes) {
         int ysize = par->width * par->height;
@@ -149,50 +201,29 @@
             ff_format_io_close(s, &pb[3]);
         }
     } else if (img->muxer) {
-        int ret;
-        AVStream *st;
-        AVPacket pkt2 = {0};
-        AVFormatContext *fmt = NULL;
-
-        av_assert0(!img->split_planes);
-
-        ret = avformat_alloc_output_context2(&fmt, NULL, img->muxer, s->url);
+        ret = write_muxed_file(s, pb[0], pkt);
         if (ret < 0)
-            return ret;
-        st = avformat_new_stream(fmt, NULL);
-        if (!st) {
-            avformat_free_context(fmt);
-            return AVERROR(ENOMEM);
-        }
-        st->id = pkt->stream_index;
-
-        fmt->pb = pb[0];
-        if ((ret = av_packet_ref(&pkt2, pkt))                             < 0 ||
-            (ret = avcodec_parameters_copy(st->codecpar, s->streams[0]->codecpar)) < 0 ||
-            (ret = avformat_write_header(fmt, NULL))                      < 0 ||
-            (ret = av_interleaved_write_frame(fmt, &pkt2))                < 0 ||
-            (ret = av_write_trailer(fmt))                                 < 0) {
-            av_packet_unref(&pkt2);
-            avformat_free_context(fmt);
-            return ret;
-        }
-        av_packet_unref(&pkt2);
-        avformat_free_context(fmt);
+            goto fail;
     } else {
         avio_write(pb[0], pkt->data, pkt->size);
     }
     avio_flush(pb[0]);
-    if (!img->is_pipe) {
-        ff_format_io_close(s, &pb[0]);
-        for (i = 0; i < nb_renames; i++) {
-            int ret = ff_rename(img->tmp[i], img->target[i], s);
-            if (ret < 0)
-                return ret;
-        }
+    ff_format_io_close(s, &pb[0]);
+    for (i = 0; i < nb_renames; i++) {
+        int ret = ff_rename(img->tmp[i], img->target[i], s);
+        if (ret < 0)
+            return ret;
     }
 
     img->img_number++;
     return 0;
+
+fail:
+    av_dict_free(&options);
+    for (i = 0; i < FF_ARRAY_ELEMS(pb); i++)
+        if (pb[i])
+            ff_format_io_close(s, &pb[i]);
+    return ret;
 }
 
 static int query_codec(enum AVCodecID id, int std_compliance)
@@ -214,6 +245,7 @@
     { "strftime",     "use strftime for filename", OFFSET(use_strftime),  AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, ENC },
     { "frame_pts",    "use current frame pts for filename", OFFSET(frame_pts),  AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, ENC },
     { "atomic_writing", "write files atomically (using temporary files and renames)", OFFSET(use_rename), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, ENC },
+    { "protocol_opts", "specify protocol options for the opened files", OFFSET(protocol_opts), AV_OPT_TYPE_DICT, {0}, 0, 0, ENC },
     { NULL },
 };
 
@@ -247,7 +279,7 @@
     .priv_data_size = sizeof(VideoMuxData),
     .video_codec    = AV_CODEC_ID_MJPEG,
     .write_header   = write_header,
-    .write_packet   = write_packet,
+    .write_packet   = write_packet_pipe,
     .query_codec    = query_codec,
     .flags          = AVFMT_NOTIMESTAMPS | AVFMT_NODIMENSIONS
 };
diff --git a/libavformat/ingenientdec.c b/libavformat/ingenientdec.c
index c0ba61e..1b437b4 100644
--- a/libavformat/ingenientdec.c
+++ b/libavformat/ingenientdec.c
@@ -24,7 +24,7 @@
 #include "libavutil/intreadwrite.h"
 
 // http://multimedia.cx/ingenient.txt
-static int ingenient_probe(AVProbeData *p)
+static int ingenient_probe(const AVProbeData *p)
 {
     if (   AV_RN32(p->buf) != AV_RN32("MJPG")
         || p->buf_size < 50
diff --git a/libavformat/internal.h b/libavformat/internal.h
index 399d0a6..329b2e9 100644
--- a/libavformat/internal.h
+++ b/libavformat/internal.h
@@ -33,8 +33,6 @@
 #define PROBE_BUF_MIN 2048
 #define PROBE_BUF_MAX (1 << 20)
 
-#define MAX_PROBE_PACKETS 2500
-
 #ifdef DEBUG
 #    define hex_dump_debug(class, buf, size) av_hex_dump_log(class, AV_LOG_DEBUG, buf, size)
 #else
@@ -232,12 +230,12 @@
 int ff_hex_to_data(uint8_t *data, const char *p);
 
 /**
- * Add packet to AVFormatContext->packet_buffer list, determining its
+ * Add packet to an AVFormatContext's packet_buffer list, determining its
  * interleaved position using compare() function argument.
- * @return 0, or < 0 on error
+ * @return 0 on success, < 0 on error. pkt will always be blank on return.
  */
 int ff_interleave_add_packet(AVFormatContext *s, AVPacket *pkt,
-                             int (*compare)(AVFormatContext *, AVPacket *, AVPacket *));
+                             int (*compare)(AVFormatContext *, const AVPacket *, const AVPacket *));
 
 void ff_read_frame_flush(AVFormatContext *s);
 
@@ -497,19 +495,16 @@
 int ff_read_packet(AVFormatContext *s, AVPacket *pkt);
 
 /**
- * Interleave a packet per dts in an output media file.
+ * Interleave an AVPacket per dts so it can be muxed.
  *
- * Packets with pkt->destruct == av_destruct_packet will be freed inside this
- * function, so they cannot be used after it. Note that calling av_packet_unref()
- * on them is still safe.
- *
- * @param s media file handle
+ * @param s   an AVFormatContext for output. pkt resp. out will be added to
+ *            resp. taken from its packet buffer.
  * @param out the interleaved packet will be output here
- * @param pkt the input packet
+ * @param pkt the input packet; will be blank on return if not NULL
  * @param flush 1 if no further packets are available as input and all
  *              remaining packets should be output
- * @return 1 if a packet was output, 0 if no packet could be output,
- *         < 0 if an error occurred
+ * @return 1 if a packet was output, 0 if no packet could be output
+ *         (in which case out may be uninitialized), < 0 if an error occurred
  */
 int ff_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out,
                                  AVPacket *pkt, int flush);
@@ -582,25 +577,13 @@
 int ff_stream_encode_params_copy(AVStream *dst, const AVStream *src);
 
 /**
- * Wrap errno on rename() error.
+ * Wrap avpriv_io_move and log if error happens.
  *
- * @param oldpath source path
- * @param newpath destination path
+ * @param url_src source path
+ * @param url_dst destination path
  * @return        0 or AVERROR on failure
  */
-static inline int ff_rename(const char *oldpath, const char *newpath, void *logctx)
-{
-    int ret = 0;
-    if (rename(oldpath, newpath) == -1) {
-        ret = AVERROR(errno);
-        if (logctx) {
-            char err[AV_ERROR_MAX_STRING_SIZE] = {0};
-            av_make_error_string(err, AV_ERROR_MAX_STRING_SIZE, ret);
-            av_log(logctx, AV_LOG_ERROR, "failed to rename file %s to %s: %s\n", oldpath, newpath, err);
-        }
-    }
-    return ret;
-}
+int ff_rename(const char *url_src, const char *url_dst, void *logctx);
 
 /**
  * Allocate extradata with additional AV_INPUT_BUFFER_PADDING_SIZE at end
@@ -650,9 +633,6 @@
  */
 int ff_copy_whiteblacklists(AVFormatContext *dst, const AVFormatContext *src);
 
-int ffio_open2_wrapper(struct AVFormatContext *s, AVIOContext **pb, const char *url, int flags,
-                       const AVIOInterruptCB *int_cb, AVDictionary **options);
-
 /**
  * Returned by demuxers to indicate that data was consumed but discarded
  * (ignored streams or junk data). The framework will re-call the demuxer.
@@ -766,7 +746,8 @@
  *
  * @param head  List head element
  * @param tail  List tail element
- * @param pkt   The packet being appended
+ * @param pkt   The packet being appended. The data described in it will
+ *              be made reference counted if it isn't already.
  * @param flags Any combination of FF_PACKETLIST_FLAG_* flags
  * @return 0 on success, negative AVERROR value on failure. On failure,
            the list is unchanged
@@ -776,13 +757,16 @@
 
 /**
  * Remove the oldest AVPacket in the list and return it.
+ * The behaviour is undefined if the packet list is empty.
  *
  * @note The pkt will be overwritten completely. The caller owns the
  *       packet and must unref it by itself.
  *
  * @param head List head element
  * @param tail List tail element
- * @param pkt  Pointer to an initialized AVPacket struct
+ * @param pkt  Pointer to an AVPacket struct
+ * @return 0 on success. Success is guaranteed
+ *         if the packet list is not empty.
  */
 int ff_packet_list_get(AVPacketList **head, AVPacketList **tail,
                        AVPacket *pkt);
diff --git a/libavformat/ipmovie.c b/libavformat/ipmovie.c
index 7f5a8c6..137c857 100644
--- a/libavformat/ipmovie.c
+++ b/libavformat/ipmovie.c
@@ -614,7 +614,7 @@
 
 static const char signature[] = "Interplay MVE File\x1A\0\x1A";
 
-static int ipmovie_probe(AVProbeData *p)
+static int ipmovie_probe(const AVProbeData *p)
 {
     const uint8_t *b = p->buf;
     const uint8_t *b_end = p->buf + p->buf_size - sizeof(signature);
diff --git a/libavformat/ircamdec.c b/libavformat/ircamdec.c
index d376ffe..17bfb4e 100644
--- a/libavformat/ircamdec.c
+++ b/libavformat/ircamdec.c
@@ -26,7 +26,7 @@
 #include "pcm.h"
 #include "ircam.h"
 
-static int ircam_probe(AVProbeData *p)
+static int ircam_probe(const AVProbeData *p)
 {
     if ((p->buf[0] == 0x64 && p->buf[1] == 0xA3 && p->buf[3] == 0x00 &&
          p->buf[2] >=    1 && p->buf[2] <= 4) ||
diff --git a/libavformat/isom.c b/libavformat/isom.c
index ca9d22e..eefe927 100644
--- a/libavformat/isom.c
+++ b/libavformat/isom.c
@@ -158,11 +158,14 @@
     { AV_CODEC_ID_SGIRLE,  MKTAG('r', 'l', 'e', '1') }, /* SGI RLE 8-bit */
     { AV_CODEC_ID_MSRLE,   MKTAG('W', 'R', 'L', 'E') },
     { AV_CODEC_ID_QDRAW,   MKTAG('q', 'd', 'r', 'w') }, /* QuickDraw */
+    { AV_CODEC_ID_CDTOONS, MKTAG('Q', 'k', 'B', 'k') }, /* CDToons */
 
     { AV_CODEC_ID_RAWVIDEO, MKTAG('W', 'R', 'A', 'W') },
 
     { AV_CODEC_ID_HEVC, MKTAG('h', 'e', 'v', '1') }, /* HEVC/H.265 which indicates parameter sets may be in ES */
     { AV_CODEC_ID_HEVC, MKTAG('h', 'v', 'c', '1') }, /* HEVC/H.265 which indicates parameter sets shall not be in ES */
+    { AV_CODEC_ID_HEVC, MKTAG('d', 'v', 'h', 'e') }, /* HEVC-based Dolby Vision derived from hev1 */
+                                                     /* dvh1 is handled within mov.c */
 
     { AV_CODEC_ID_H264, MKTAG('a', 'v', 'c', '1') }, /* AVC-1/H.264 */
     { AV_CODEC_ID_H264, MKTAG('a', 'v', 'c', '2') },
@@ -185,6 +188,8 @@
     { AV_CODEC_ID_H264, MKTAG('r', 'v', '6', '4') }, /* X-Com Radvision */
     { AV_CODEC_ID_H264, MKTAG('x', 'a', 'l', 'g') }, /* XAVC-L HD422 produced by FCP */
     { AV_CODEC_ID_H264, MKTAG('a', 'v', 'l', 'g') }, /* Panasonic P2 AVC-LongG */
+    { AV_CODEC_ID_H264, MKTAG('d', 'v', 'a', '1') }, /* AVC-based Dolby Vision derived from avc1 */
+    { AV_CODEC_ID_H264, MKTAG('d', 'v', 'a', 'v') }, /* AVC-based Dolby Vision derived from avc3 */
 
     { AV_CODEC_ID_VP8,  MKTAG('v', 'p', '0', '8') }, /* VP8 */
     { AV_CODEC_ID_VP9,  MKTAG('v', 'p', '0', '9') }, /* VP9 */
@@ -286,6 +291,7 @@
     { AV_CODEC_ID_MAGICYUV, MKTAG('M', '0', 'R', 'A') },
     { AV_CODEC_ID_MAGICYUV, MKTAG('M', '0', 'R', 'G') },
     { AV_CODEC_ID_MAGICYUV, MKTAG('M', '0', 'Y', '2') },
+    { AV_CODEC_ID_MAGICYUV, MKTAG('M', '0', 'Y', '4') },
     { AV_CODEC_ID_MAGICYUV, MKTAG('M', '8', 'R', 'G') },
     { AV_CODEC_ID_MAGICYUV, MKTAG('M', '8', 'R', 'A') },
     { AV_CODEC_ID_MAGICYUV, MKTAG('M', '8', 'G', '0') },
@@ -333,6 +339,7 @@
     { AV_CODEC_ID_MP1,             MKTAG('.', 'm', 'p', '1') },
     { AV_CODEC_ID_MP2,             MKTAG('.', 'm', 'p', '2') },
     { AV_CODEC_ID_MP3,             MKTAG('.', 'm', 'p', '3') },
+    { AV_CODEC_ID_MP3,             MKTAG('m', 'p', '3', ' ') }, /* vlc */
     { AV_CODEC_ID_MP3,             0x6D730055                },
     { AV_CODEC_ID_NELLYMOSER,      MKTAG('n', 'm', 'o', 's') }, /* Flash Media Server */
     { AV_CODEC_ID_NELLYMOSER,      MKTAG('N', 'E', 'L', 'L') }, /* Perian */
@@ -363,7 +370,9 @@
     { AV_CODEC_ID_EVRC,            MKTAG('s', 'e', 'v', 'c') }, /* 3GPP2 */
     { AV_CODEC_ID_SMV,             MKTAG('s', 's', 'm', 'v') }, /* 3GPP2 */
     { AV_CODEC_ID_FLAC,            MKTAG('f', 'L', 'a', 'C') }, /* nonstandard */
+    { AV_CODEC_ID_TRUEHD,          MKTAG('m', 'l', 'p', 'a') }, /* mp4ra.org */
     { AV_CODEC_ID_OPUS,            MKTAG('O', 'p', 'u', 's') }, /* mp4ra.org */
+    { AV_CODEC_ID_MPEGH_3D_AUDIO,  MKTAG('m', 'h', 'm', '1') }, /* MPEG-H 3D Audio bitstream */
     { AV_CODEC_ID_NONE, 0 },
 };
 
@@ -530,14 +539,18 @@
     len = ff_mp4_read_descr(fc, pb, &tag);
     if (tag == MP4DecSpecificDescrTag) {
         av_log(fc, AV_LOG_TRACE, "Specific MPEG-4 header len=%d\n", len);
+        /* As per 14496-3:2009 9.D.2.2, No decSpecificInfo is defined
+           for MPEG-1 Audio or MPEG-2 Audio; MPEG-2 AAC excluded. */
+        if (object_type_id == 0x69 || object_type_id == 0x6b)
+            return 0;
         if (!len || (uint64_t)len > (1<<30))
             return AVERROR_INVALIDDATA;
         if ((ret = ff_get_extradata(fc, st->codecpar, pb, len)) < 0)
             return ret;
         if (st->codecpar->codec_id == AV_CODEC_ID_AAC) {
             MPEG4AudioConfig cfg = {0};
-            ret = avpriv_mpeg4audio_get_config(&cfg, st->codecpar->extradata,
-                                               st->codecpar->extradata_size * 8, 1);
+            ret = avpriv_mpeg4audio_get_config2(&cfg, st->codecpar->extradata,
+                                                st->codecpar->extradata_size, 1, fc);
             if (ret < 0)
                 return ret;
             st->codecpar->channels = cfg.channels;
diff --git a/libavformat/isom.h b/libavformat/isom.h
index e629663..41a9c64 100644
--- a/libavformat/isom.h
+++ b/libavformat/isom.h
@@ -87,6 +87,7 @@
 struct MOVParseTableEntry;
 
 typedef struct MOVFragment {
+    int found_tfhd;
     unsigned track_id;
     uint64_t base_data_offset;
     uint64_t moof_offset;
@@ -128,6 +129,7 @@
     int64_t sidx_pts;
     int64_t first_tfra_pts;
     int64_t tfdt_dts;
+    int64_t next_trun_dts;
     int index_entry;
     MOVEncryptionIndex *encryption_index;
 } MOVFragmentStreamInfo;
@@ -162,6 +164,8 @@
     int64_t *chunk_offsets;
     unsigned int stts_count;
     MOVStts *stts_data;
+    unsigned int sdtp_count;
+    uint8_t *sdtp_data;
     unsigned int ctts_count;
     unsigned int ctts_allocated_size;
     MOVStts *ctts_data;
diff --git a/libavformat/iss.c b/libavformat/iss.c
index 95b35dc..6d6aec2 100644
--- a/libavformat/iss.c
+++ b/libavformat/iss.c
@@ -58,7 +58,7 @@
     buf[i] = 0; /* Ensure null terminated, but may be truncated */
 }
 
-static int iss_probe(AVProbeData *p)
+static int iss_probe(const AVProbeData *p)
 {
     if (strncmp(p->buf, ISS_SIG, ISS_SIG_LEN))
         return 0;
diff --git a/libavformat/iv8.c b/libavformat/iv8.c
index 077d905..e25f24e 100644
--- a/libavformat/iv8.c
+++ b/libavformat/iv8.c
@@ -22,7 +22,7 @@
 #include "internal.h"
 
 
-static int probe(AVProbeData *p)
+static int probe(const AVProbeData *p)
 {
     // the single file I have starts with that, I do not know if others do, too
     if(   p->buf[0] == 1
@@ -92,7 +92,6 @@
             ret = av_append_packet(s->pb, pkt, size);
             if (ret < 0) {
                 av_log(s, AV_LOG_ERROR, "failed to grow packet\n");
-                av_packet_unref(pkt);
                 return ret;
             }
         }
diff --git a/libavformat/ivfdec.c b/libavformat/ivfdec.c
index 197c099..4a80257 100644
--- a/libavformat/ivfdec.c
+++ b/libavformat/ivfdec.c
@@ -23,7 +23,7 @@
 #include "riff.h"
 #include "libavutil/intreadwrite.h"
 
-static int probe(AVProbeData *p)
+static int probe(const AVProbeData *p)
 {
     if (AV_RL32(p->buf) == MKTAG('D','K','I','F')
         && !AV_RL16(p->buf+4) && AV_RL16(p->buf+6) == 32)
@@ -53,7 +53,8 @@
     st->codecpar->height     = avio_rl16(s->pb);
     time_base.den         = avio_rl32(s->pb);
     time_base.num         = avio_rl32(s->pb);
-    st->duration          = avio_rl64(s->pb);
+    st->duration          = avio_rl32(s->pb);
+    avio_skip(s->pb, 4); // unused
 
     st->need_parsing      = AVSTREAM_PARSE_HEADERS;
 
diff --git a/libavformat/ivfenc.c b/libavformat/ivfenc.c
index 66441a2..45e5b23 100644
--- a/libavformat/ivfenc.c
+++ b/libavformat/ivfenc.c
@@ -53,7 +53,7 @@
     avio_wl16(pb, par->height);
     avio_wl32(pb, s->streams[0]->time_base.den);
     avio_wl32(pb, s->streams[0]->time_base.num);
-    avio_wl64(pb, 0xFFFFFFFFFFFFFFFFULL);
+    avio_wl64(pb, 0xFFFFFFFFFFFFFFFFULL); // length is overwritten at the end of muxing
 
     return 0;
 }
@@ -80,10 +80,12 @@
     IVFEncContext *ctx = s->priv_data;
 
     if ((pb->seekable & AVIO_SEEKABLE_NORMAL) && ctx->frame_cnt > 1) {
-        size_t end = avio_tell(pb);
+        int64_t end = avio_tell(pb);
 
         avio_seek(pb, 24, SEEK_SET);
-        avio_wl64(pb, ctx->frame_cnt * ctx->sum_delta_pts / (ctx->frame_cnt - 1));
+        // overwrite the "length" field (duration)
+        avio_wl32(pb, ctx->frame_cnt * ctx->sum_delta_pts / (ctx->frame_cnt - 1));
+        avio_wl32(pb, 0); // zero out unused bytes
         avio_seek(pb, end, SEEK_SET);
     }
 
@@ -97,6 +99,8 @@
 
     if (st->codecpar->codec_id == AV_CODEC_ID_VP9)
         ret = ff_stream_add_bitstream_filter(st, "vp9_superframe", NULL);
+    else if (st->codecpar->codec_id == AV_CODEC_ID_AV1)
+        ret = ff_stream_add_bitstream_filter(st, "av1_metadata", "td=insert");
 
     return ret;
 }
diff --git a/libavformat/jacosubdec.c b/libavformat/jacosubdec.c
index 520c435..121c86d 100644
--- a/libavformat/jacosubdec.c
+++ b/libavformat/jacosubdec.c
@@ -48,7 +48,7 @@
             (sscanf(ptr, "@%u @%u %c", &fs, &fe, &c) == 3 && fs < fe));
 }
 
-static int jacosub_probe(AVProbeData *p)
+static int jacosub_probe(const AVProbeData *p)
 {
     const char *ptr     = p->buf;
     const char *ptr_end = p->buf + p->buf_size;
@@ -107,6 +107,7 @@
     unsigned hs, ms, ss, fs; // hours, minutes, seconds, frame start
     unsigned he, me, se, fe; // hours, minutes, seconds, frame end
     int ts_start, ts_end;
+    int64_t ts_start64, ts_end64;
 
     /* timed format */
     if (sscanf(buf, "%u:%u:%u.%u %u:%u:%u.%u %n",
@@ -124,10 +125,10 @@
     return NULL;
 
 shift_and_ret:
-    ts_start  = (ts_start + jacosub->shift) * 100 / jacosub->timeres;
-    ts_end    = (ts_end   + jacosub->shift) * 100 / jacosub->timeres;
-    *start    = ts_start;
-    *duration = ts_start + ts_end;
+    ts_start64  = (ts_start + jacosub->shift) * 100LL / jacosub->timeres;
+    ts_end64    = (ts_end   + jacosub->shift) * 100LL / jacosub->timeres;
+    *start    = ts_start64;
+    *duration = ts_end64 - ts_start64;
     return buf + len;
 }
 
diff --git a/libavformat/jacosubenc.c b/libavformat/jacosubenc.c
index 0954f5f..77575c6 100644
--- a/libavformat/jacosubenc.c
+++ b/libavformat/jacosubenc.c
@@ -25,7 +25,6 @@
 
     if (par->extradata_size) {
         avio_write(s->pb, par->extradata, par->extradata_size - 1);
-        avio_flush(s->pb);
     }
     return 0;
 }
diff --git a/libavformat/jvdec.c b/libavformat/jvdec.c
index b2c067f..551f806 100644
--- a/libavformat/jvdec.c
+++ b/libavformat/jvdec.c
@@ -52,7 +52,7 @@
 
 #define MAGIC " Compression by John M Phillips Copyright (C) 1995 The Bitmap Brothers Ltd."
 
-static int read_probe(AVProbeData *pd)
+static int read_probe(const AVProbeData *pd)
 {
     if (pd->buf[0] == 'J' && pd->buf[1] == 'V' && strlen(MAGIC) + 4 <= pd->buf_size &&
         !memcmp(pd->buf + 4, MAGIC, strlen(MAGIC)))
@@ -113,9 +113,10 @@
         return AVERROR(ENOMEM);
 
     jv->frames = av_malloc(ast->nb_index_entries * sizeof(JVFrame));
-    if (!jv->frames)
+    if (!jv->frames) {
+        av_freep(&ast->index_entries);
         return AVERROR(ENOMEM);
-
+    }
     offset = 0x68 + ast->nb_index_entries * 16;
     for (i = 0; i < ast->nb_index_entries; i++) {
         AVIndexEntry *e   = ast->index_entries + i;
@@ -137,6 +138,8 @@
                     - jvf->palette_size < 0) {
             if (s->error_recognition & AV_EF_EXPLODE) {
                 read_close(s);
+                av_freep(&jv->frames);
+                av_freep(&ast->index_entries);
                 return AVERROR_INVALIDDATA;
             }
             jvf->audio_size   =
@@ -165,6 +168,7 @@
     JVDemuxContext *jv = s->priv_data;
     AVIOContext *pb = s->pb;
     AVStream *ast = s->streams[0];
+    int ret;
 
     while (!avio_feof(s->pb) && jv->pts < ast->nb_index_entries) {
         const AVIndexEntry *e   = ast->index_entries + jv->pts;
@@ -174,8 +178,8 @@
         case JV_AUDIO:
             jv->state++;
             if (jvf->audio_size) {
-                if (av_get_packet(s->pb, pkt, jvf->audio_size) < 0)
-                    return AVERROR(ENOMEM);
+                if ((ret = av_get_packet(s->pb, pkt, jvf->audio_size)) < 0)
+                    return ret;
                 pkt->stream_index = 0;
                 pkt->pts          = e->timestamp;
                 pkt->flags       |= AV_PKT_FLAG_KEY;
@@ -184,10 +188,9 @@
         case JV_VIDEO:
             jv->state++;
             if (jvf->video_size || jvf->palette_size) {
-                int ret;
                 int size = jvf->video_size + jvf->palette_size;
-                if (av_new_packet(pkt, size + JV_PREAMBLE_SIZE))
-                    return AVERROR(ENOMEM);
+                if ((ret = av_new_packet(pkt, size + JV_PREAMBLE_SIZE)) < 0)
+                    return ret;
 
                 AV_WL32(pkt->data, jvf->video_size);
                 pkt->data[4] = jvf->video_type;
diff --git a/libavformat/kvag.c b/libavformat/kvag.c
new file mode 100644
index 0000000..71b0eb4
--- /dev/null
+++ b/libavformat/kvag.c
@@ -0,0 +1,117 @@
+/*
+ * Simon & Schuster Interactive VAG demuxer
+ *
+ * Copyright (C) 2020 Zane van Iperen (zane@zanevaniperen.com)
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+#include "avformat.h"
+#include "internal.h"
+#include "libavutil/intreadwrite.h"
+
+#define KVAG_TAG            MKTAG('K', 'V', 'A', 'G')
+#define KVAG_HEADER_SIZE    14
+#define KVAG_MAX_READ_SIZE  4096
+
+typedef struct KVAGHeader {
+    uint32_t    magic;
+    uint32_t    data_size;
+    uint32_t    sample_rate;
+    uint16_t    stereo;
+} KVAGHeader;
+
+static int kvag_probe(const AVProbeData *p)
+{
+    if (AV_RL32(p->buf) != KVAG_TAG)
+        return 0;
+
+    return AVPROBE_SCORE_EXTENSION + 1;
+}
+
+static int kvag_read_header(AVFormatContext *s)
+{
+    int ret;
+    AVStream *st;
+    KVAGHeader hdr;
+    AVCodecParameters *par;
+    uint8_t buf[KVAG_HEADER_SIZE];
+
+    if (!(st = avformat_new_stream(s, NULL)))
+        return AVERROR(ENOMEM);
+
+    if ((ret = avio_read(s->pb, buf, KVAG_HEADER_SIZE)) < 0)
+        return ret;
+    else if (ret != KVAG_HEADER_SIZE)
+        return AVERROR(EIO);
+
+    hdr.magic                   = AV_RL32(buf +  0);
+    hdr.data_size               = AV_RL32(buf +  4);
+    hdr.sample_rate             = AV_RL32(buf +  8);
+    hdr.stereo                  = AV_RL16(buf + 12);
+
+    par                         = st->codecpar;
+    par->codec_type             = AVMEDIA_TYPE_AUDIO;
+    par->codec_id               = AV_CODEC_ID_ADPCM_IMA_SSI;
+    par->format                 = AV_SAMPLE_FMT_S16;
+
+    if (hdr.stereo) {
+        par->channel_layout     = AV_CH_LAYOUT_STEREO;
+        par->channels           = 2;
+    } else {
+        par->channel_layout     = AV_CH_LAYOUT_MONO;
+        par->channels           = 1;
+    }
+
+    par->sample_rate            = hdr.sample_rate;
+    par->bits_per_coded_sample  = 4;
+    par->bits_per_raw_sample    = 16;
+    par->block_align            = 1;
+    par->bit_rate               = par->channels *
+                                  par->sample_rate *
+                                  par->bits_per_coded_sample;
+
+    avpriv_set_pts_info(st, 64, 1, par->sample_rate);
+    st->start_time              = 0;
+    st->duration                = hdr.data_size *
+                                  (8 / par->bits_per_coded_sample) /
+                                  par->channels;
+
+    return 0;
+}
+
+static int kvag_read_packet(AVFormatContext *s, AVPacket *pkt)
+{
+    int ret;
+    AVCodecParameters *par = s->streams[0]->codecpar;
+
+    if ((ret = av_get_packet(s->pb, pkt, KVAG_MAX_READ_SIZE)) < 0)
+        return ret;
+
+    pkt->flags          &= ~AV_PKT_FLAG_CORRUPT;
+    pkt->stream_index   = 0;
+    pkt->duration       = ret * (8 / par->bits_per_coded_sample) / par->channels;
+
+    return 0;
+}
+
+AVInputFormat ff_kvag_demuxer = {
+    .name           = "kvag",
+    .long_name      = NULL_IF_CONFIG_SMALL("Simon & Schuster Interactive VAG"),
+    .read_probe     = kvag_probe,
+    .read_header    = kvag_read_header,
+    .read_packet    = kvag_read_packet
+};
diff --git a/libavformat/latmenc.c b/libavformat/latmenc.c
index 273197b..5ae677f 100644
--- a/libavformat/latmenc.c
+++ b/libavformat/latmenc.c
@@ -53,27 +53,28 @@
     .version    = LIBAVUTIL_VERSION_INT,
 };
 
-static int latm_decode_extradata(LATMContext *ctx, uint8_t *buf, int size)
+static int latm_decode_extradata(AVFormatContext *s, uint8_t *buf, int size)
 {
+    LATMContext *ctx = s->priv_data;
     MPEG4AudioConfig m4ac;
 
     if (size > MAX_EXTRADATA_SIZE) {
-        av_log(ctx, AV_LOG_ERROR, "Extradata is larger than currently supported.\n");
+        av_log(s, AV_LOG_ERROR, "Extradata is larger than currently supported.\n");
         return AVERROR_INVALIDDATA;
     }
-    ctx->off = avpriv_mpeg4audio_get_config(&m4ac, buf, size * 8, 1);
+    ctx->off = avpriv_mpeg4audio_get_config2(&m4ac, buf, size, 1, s);
     if (ctx->off < 0)
         return ctx->off;
 
     if (ctx->object_type == AOT_ALS && (ctx->off & 7)) {
         // as long as avpriv_mpeg4audio_get_config works correctly this is impossible
-        av_log(ctx, AV_LOG_ERROR, "BUG: ALS offset is not byte-aligned\n");
+        av_log(s, AV_LOG_ERROR, "BUG: ALS offset is not byte-aligned\n");
         return AVERROR_INVALIDDATA;
     }
     /* FIXME: are any formats not allowed in LATM? */
 
     if (m4ac.object_type > AOT_SBR && m4ac.object_type != AOT_ALS) {
-        av_log(ctx, AV_LOG_ERROR, "Muxing MPEG-4 AOT %d in LATM is not supported\n", m4ac.object_type);
+        av_log(s, AV_LOG_ERROR, "Muxing MPEG-4 AOT %d in LATM is not supported\n", m4ac.object_type);
         return AVERROR_INVALIDDATA;
     }
     ctx->channel_conf = m4ac.chan_config;
@@ -84,14 +85,17 @@
 
 static int latm_write_header(AVFormatContext *s)
 {
-    LATMContext *ctx = s->priv_data;
     AVCodecParameters *par = s->streams[0]->codecpar;
 
     if (par->codec_id == AV_CODEC_ID_AAC_LATM)
         return 0;
+    if (par->codec_id != AV_CODEC_ID_AAC && par->codec_id != AV_CODEC_ID_MP4ALS) {
+        av_log(s, AV_LOG_ERROR, "Only AAC, LATM and ALS are supported\n");
+        return AVERROR(EINVAL);
+    }
 
     if (par->extradata_size > 0 &&
-        latm_decode_extradata(ctx, par->extradata, par->extradata_size) < 0)
+        latm_decode_extradata(s, par->extradata, par->extradata_size) < 0)
         return AVERROR_INVALIDDATA;
 
     return 0;
@@ -166,13 +170,14 @@
             side_data = av_packet_get_side_data(pkt, AV_PKT_DATA_NEW_EXTRADATA,
                                                 &side_data_size);
             if (side_data_size) {
-                if (latm_decode_extradata(ctx, side_data, side_data_size) < 0)
+                if (latm_decode_extradata(s, side_data, side_data_size) < 0)
                     return AVERROR_INVALIDDATA;
                 ret = ff_alloc_extradata(par, side_data_size);
                 if (ret < 0)
                     return ret;
                 memcpy(par->extradata, side_data, side_data_size);
-            }
+            } else
+                return AVERROR_INVALIDDATA;
         }
     }
 
diff --git a/libavformat/libamqp.c b/libavformat/libamqp.c
new file mode 100644
index 0000000..aaf0e51
--- /dev/null
+++ b/libavformat/libamqp.c
@@ -0,0 +1,298 @@
+/*
+ * Advanced Message Queuing Protocol (AMQP) 0-9-1
+ * Copyright (c) 2020 Andriy Gelman
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include <amqp.h>
+#include <amqp_tcp_socket.h>
+#include <sys/time.h>
+#include "avformat.h"
+#include "libavutil/avstring.h"
+#include "libavutil/opt.h"
+#include "libavutil/time.h"
+#include "network.h"
+#include "url.h"
+#include "urldecode.h"
+
+typedef struct AMQPContext {
+    const AVClass *class;
+    amqp_connection_state_t conn;
+    amqp_socket_t *socket;
+    const char *exchange;
+    const char *routing_key;
+    int pkt_size;
+    int64_t connection_timeout;
+    int pkt_size_overflow;
+} AMQPContext;
+
+#define STR_LEN           1024
+#define DEFAULT_CHANNEL   1
+
+#define OFFSET(x) offsetof(AMQPContext, x)
+#define D AV_OPT_FLAG_DECODING_PARAM
+#define E AV_OPT_FLAG_ENCODING_PARAM
+static const AVOption options[] = {
+    { "pkt_size", "Maximum send/read packet size", OFFSET(pkt_size), AV_OPT_TYPE_INT, { .i64 = 131072 }, 4096, INT_MAX, .flags = D | E },
+    { "exchange", "Exchange to send/read packets", OFFSET(exchange), AV_OPT_TYPE_STRING, { .str = "amq.direct" }, 0, 0, .flags = D | E },
+    { "routing_key", "Key to filter streams", OFFSET(routing_key), AV_OPT_TYPE_STRING, { .str = "amqp" }, 0, 0, .flags = D | E },
+    { "connection_timeout", "Initial connection timeout", OFFSET(connection_timeout), AV_OPT_TYPE_DURATION, { .i64 = -1 }, -1, INT64_MAX, .flags = D | E},
+    { NULL }
+};
+
+static int amqp_proto_open(URLContext *h, const char *uri, int flags)
+{
+    int ret, server_msg;
+    char hostname[STR_LEN], credentials[STR_LEN];
+    int port;
+    const char *user, *password = NULL;
+    const char *user_decoded, *password_decoded;
+    char *p;
+    amqp_rpc_reply_t broker_reply;
+    struct timeval tval = { 0 };
+
+    AMQPContext *s = h->priv_data;
+
+    h->is_streamed     = 1;
+    h->max_packet_size = s->pkt_size;
+
+    av_url_split(NULL, 0, credentials, sizeof(credentials),
+                 hostname, sizeof(hostname), &port, NULL, 0, uri);
+
+    if (port < 0)
+        port = 5672;
+
+    if (hostname[0] == '\0' || port <= 0 || port > 65535 ) {
+        av_log(h, AV_LOG_ERROR, "Invalid hostname/port\n");
+        return AVERROR(EINVAL);
+    }
+
+    p = strchr(credentials, ':');
+    if (p) {
+        *p = '\0';
+        password = p + 1;
+    }
+
+    if (!password || *password == '\0')
+        password = "guest";
+
+    password_decoded = ff_urldecode(password, 0);
+    if (!password_decoded)
+        return AVERROR(ENOMEM);
+
+    user = credentials;
+    if (*user == '\0')
+        user = "guest";
+
+    user_decoded = ff_urldecode(user, 0);
+    if (!user_decoded) {
+        av_freep(&password_decoded);
+        return AVERROR(ENOMEM);
+    }
+
+    s->conn = amqp_new_connection();
+    if (!s->conn) {
+        av_freep(&user_decoded);
+        av_freep(&password_decoded);
+        av_log(h, AV_LOG_ERROR, "Error creating connection\n");
+        return AVERROR_EXTERNAL;
+    }
+
+    s->socket = amqp_tcp_socket_new(s->conn);
+    if (!s->socket) {
+        av_log(h, AV_LOG_ERROR, "Error creating socket\n");
+        goto destroy_connection;
+    }
+
+    if (s->connection_timeout < 0)
+        s->connection_timeout = (h->rw_timeout > 0 ? h->rw_timeout : 5000000);
+
+    tval.tv_sec  = s->connection_timeout / 1000000;
+    tval.tv_usec = s->connection_timeout % 1000000;
+    ret = amqp_socket_open_noblock(s->socket, hostname, port, &tval);
+
+    if (ret) {
+        av_log(h, AV_LOG_ERROR, "Error connecting to server: %s\n",
+                                 amqp_error_string2(ret));
+        goto destroy_connection;
+    }
+
+    broker_reply = amqp_login(s->conn, "/", 0, s->pkt_size, 0,
+                              AMQP_SASL_METHOD_PLAIN, user_decoded, password_decoded);
+
+    if (broker_reply.reply_type != AMQP_RESPONSE_NORMAL) {
+        av_log(h, AV_LOG_ERROR, "Error login\n");
+        server_msg = AMQP_ACCESS_REFUSED;
+        goto close_connection;
+    }
+
+    amqp_channel_open(s->conn, DEFAULT_CHANNEL);
+    broker_reply = amqp_get_rpc_reply(s->conn);
+
+    if (broker_reply.reply_type != AMQP_RESPONSE_NORMAL) {
+        av_log(h, AV_LOG_ERROR, "Error set channel\n");
+        server_msg = AMQP_CHANNEL_ERROR;
+        goto close_connection;
+    }
+
+    if (h->flags & AVIO_FLAG_READ) {
+        amqp_bytes_t queuename;
+        char queuename_buff[STR_LEN];
+        amqp_queue_declare_ok_t *r;
+
+        r = amqp_queue_declare(s->conn, DEFAULT_CHANNEL, amqp_empty_bytes,
+                               0, 0, 0, 1, amqp_empty_table);
+        broker_reply = amqp_get_rpc_reply(s->conn);
+        if (!r || broker_reply.reply_type != AMQP_RESPONSE_NORMAL) {
+            av_log(h, AV_LOG_ERROR, "Error declare queue\n");
+            server_msg = AMQP_RESOURCE_ERROR;
+            goto close_channel;
+        }
+
+        /* store queuename */
+        queuename.bytes = queuename_buff;
+        queuename.len = FFMIN(r->queue.len, STR_LEN);
+        memcpy(queuename.bytes, r->queue.bytes, queuename.len);
+
+        amqp_queue_bind(s->conn, DEFAULT_CHANNEL, queuename,
+                        amqp_cstring_bytes(s->exchange),
+                        amqp_cstring_bytes(s->routing_key), amqp_empty_table);
+
+        broker_reply = amqp_get_rpc_reply(s->conn);
+        if (broker_reply.reply_type != AMQP_RESPONSE_NORMAL) {
+            av_log(h, AV_LOG_ERROR, "Queue bind error\n");
+            server_msg = AMQP_INTERNAL_ERROR;
+            goto close_channel;
+        }
+
+        amqp_basic_consume(s->conn, DEFAULT_CHANNEL, queuename, amqp_empty_bytes,
+                           0, 1, 0, amqp_empty_table);
+
+        broker_reply = amqp_get_rpc_reply(s->conn);
+        if (broker_reply.reply_type != AMQP_RESPONSE_NORMAL) {
+            av_log(h, AV_LOG_ERROR, "Set consume error\n");
+            server_msg = AMQP_INTERNAL_ERROR;
+            goto close_channel;
+        }
+    }
+
+    av_freep(&user_decoded);
+    av_freep(&password_decoded);
+    return 0;
+
+close_channel:
+    amqp_channel_close(s->conn, DEFAULT_CHANNEL, server_msg);
+close_connection:
+    amqp_connection_close(s->conn, server_msg);
+destroy_connection:
+    amqp_destroy_connection(s->conn);
+
+    av_freep(&user_decoded);
+    av_freep(&password_decoded);
+    return AVERROR_EXTERNAL;
+}
+
+static int amqp_proto_write(URLContext *h, const unsigned char *buf, int size)
+{
+    int ret;
+    AMQPContext *s = h->priv_data;
+    int fd = amqp_socket_get_sockfd(s->socket);
+
+    amqp_bytes_t message = { size, (void *)buf };
+    amqp_basic_properties_t props;
+
+    ret = ff_network_wait_fd_timeout(fd, 1, h->rw_timeout, &h->interrupt_callback);
+    if (ret)
+        return ret;
+
+    props._flags = AMQP_BASIC_CONTENT_TYPE_FLAG | AMQP_BASIC_DELIVERY_MODE_FLAG;
+    props.content_type = amqp_cstring_bytes("octet/stream");
+    props.delivery_mode = 2; /* persistent delivery mode */
+
+    ret = amqp_basic_publish(s->conn, DEFAULT_CHANNEL, amqp_cstring_bytes(s->exchange),
+                             amqp_cstring_bytes(s->routing_key), 0, 0,
+                             &props, message);
+
+    if (ret) {
+        av_log(h, AV_LOG_ERROR, "Error publish: %s\n", amqp_error_string2(ret));
+        return AVERROR_EXTERNAL;
+    }
+
+    return size;
+}
+
+static int amqp_proto_read(URLContext *h, unsigned char *buf, int size)
+{
+    AMQPContext *s = h->priv_data;
+    int fd = amqp_socket_get_sockfd(s->socket);
+    int ret;
+
+    amqp_rpc_reply_t broker_reply;
+    amqp_envelope_t envelope;
+
+    ret = ff_network_wait_fd_timeout(fd, 0, h->rw_timeout, &h->interrupt_callback);
+    if (ret)
+        return ret;
+
+    amqp_maybe_release_buffers(s->conn);
+    broker_reply = amqp_consume_message(s->conn, &envelope, NULL, 0);
+
+    if (broker_reply.reply_type != AMQP_RESPONSE_NORMAL)
+        return AVERROR_EXTERNAL;
+
+    if (envelope.message.body.len > size) {
+        s->pkt_size_overflow = FFMAX(s->pkt_size_overflow, envelope.message.body.len);
+        av_log(h, AV_LOG_WARNING, "Message exceeds space in the buffer. "
+                                  "Message will be truncated. Setting -pkt_size %d "
+                                  "may resolve this issue.\n", s->pkt_size_overflow);
+    }
+    size = FFMIN(size, envelope.message.body.len);
+
+    memcpy(buf, envelope.message.body.bytes, size);
+    amqp_destroy_envelope(&envelope);
+
+    return size;
+}
+
+static int amqp_proto_close(URLContext *h)
+{
+    AMQPContext *s = h->priv_data;
+    amqp_channel_close(s->conn, DEFAULT_CHANNEL, AMQP_REPLY_SUCCESS);
+    amqp_connection_close(s->conn, AMQP_REPLY_SUCCESS);
+    amqp_destroy_connection(s->conn);
+
+    return 0;
+}
+
+static const AVClass amqp_context_class = {
+    .class_name = "amqp",
+    .item_name  = av_default_item_name,
+    .option     = options,
+    .version    = LIBAVUTIL_VERSION_INT,
+};
+
+const URLProtocol ff_libamqp_protocol = {
+    .name            = "amqp",
+    .url_close       = amqp_proto_close,
+    .url_open        = amqp_proto_open,
+    .url_read        = amqp_proto_read,
+    .url_write       = amqp_proto_write,
+    .priv_data_size  = sizeof(AMQPContext),
+    .priv_data_class = &amqp_context_class,
+    .flags           = URL_PROTOCOL_FLAG_NETWORK,
+};
diff --git a/libavformat/libgme.c b/libavformat/libgme.c
index 228273d..e6c56c4 100644
--- a/libavformat/libgme.c
+++ b/libavformat/libgme.c
@@ -169,7 +169,7 @@
     return 0;
 }
 
-static int probe_gme(AVProbeData *p)
+static int probe_gme(const AVProbeData *p)
 {
     // Reads 4 bytes - returns "" if unknown format.
     if (gme_identify_header(p->buf)[0]) {
diff --git a/libavformat/libmodplug.c b/libavformat/libmodplug.c
index f18c610..6e567f5 100644
--- a/libavformat/libmodplug.c
+++ b/libavformat/libmodplug.c
@@ -216,9 +216,10 @@
     ModPlug_SetSettings(&settings);
 
     modplug->f = ModPlug_Load(modplug->buf, sz);
-    if (!modplug->f)
+    if (!modplug->f) {
+        av_freep(&modplug->buf);
         return AVERROR_INVALIDDATA;
-
+    }
     st = avformat_new_stream(s, NULL);
     if (!st)
         return AVERROR(ENOMEM);
@@ -269,6 +270,7 @@
 static int modplug_read_packet(AVFormatContext *s, AVPacket *pkt)
 {
     ModPlugContext *modplug = s->priv_data;
+    int ret;
 
     if (modplug->video_stream) {
         modplug->video_switch ^= 1; // one video packet for one audio packet
@@ -284,8 +286,8 @@
             var_values[VAR_PATTERN] = ModPlug_GetCurrentPattern(modplug->f);
             var_values[VAR_ROW    ] = ModPlug_GetCurrentRow    (modplug->f);
 
-            if (av_new_packet(pkt, modplug->fsize) < 0)
-                return AVERROR(ENOMEM);
+            if ((ret = av_new_packet(pkt, modplug->fsize)) < 0)
+                return ret;
             pkt->stream_index = 1;
             memset(pkt->data, 0, modplug->fsize);
 
@@ -317,15 +319,14 @@
         }
     }
 
-    if (av_new_packet(pkt, AUDIO_PKT_SIZE) < 0)
-        return AVERROR(ENOMEM);
+    if ((ret = av_new_packet(pkt, AUDIO_PKT_SIZE)) < 0)
+        return ret;
 
     if (modplug->video_stream)
         pkt->pts = pkt->dts = modplug->packet_count++ * modplug->ts_per_packet;
 
     pkt->size = ModPlug_Read(modplug->f, pkt->data, AUDIO_PKT_SIZE);
     if (pkt->size <= 0) {
-        av_packet_unref(pkt);
         return pkt->size == 0 ? AVERROR_EOF : AVERROR(EIO);
     }
     return 0;
@@ -350,7 +351,7 @@
 
 static const char modplug_extensions[] = "669,abc,amf,ams,dbm,dmf,dsm,far,it,mdl,med,mid,mod,mt2,mtm,okt,psm,ptm,s3m,stm,ult,umx,xm,itgz,itr,itz,mdgz,mdr,mdz,s3gz,s3r,s3z,xmgz,xmr,xmz";
 
-static int modplug_probe(AVProbeData *p)
+static int modplug_probe(const AVProbeData *p)
 {
     if (av_match_ext(p->filename, modplug_extensions)) {
         if (p->buf_size < 16384)
diff --git a/libavformat/libopenmpt.c b/libavformat/libopenmpt.c
index 0fff702..52511ab 100644
--- a/libavformat/libopenmpt.c
+++ b/libavformat/libopenmpt.c
@@ -232,7 +232,7 @@
     return 0;
 }
 
-static int read_probe_openmpt(AVProbeData *p)
+static int read_probe_openmpt(const AVProbeData *p)
 {
 #if OPENMPT_API_VERSION_AT_LEAST(0,3,0)
     int probe_result;
@@ -259,7 +259,7 @@
                 } else {
                     /* The file extension is unknown and we have very few data
                      * bytes available. libopenmpt cannot decide anything here,
-                     * and returning any score > 0 would result in successfull
+                     * and returning any score > 0 would result in successful
                      * probing of random data.
                      */
                     return 0;
diff --git a/libavformat/libsrt.c b/libavformat/libsrt.c
index fbfd6ac..2d6fc4b 100644
--- a/libavformat/libsrt.c
+++ b/libavformat/libsrt.c
@@ -62,6 +62,11 @@
     int64_t maxbw;
     int pbkeylen;
     char *passphrase;
+#if SRT_VERSION_VALUE >= 0x010302
+    int enforced_encryption;
+    int kmrefreshrate;
+    int kmpreannounce;
+#endif
     int mss;
     int ffs;
     int ipttl;
@@ -76,13 +81,22 @@
     int64_t rcvlatency;
     int64_t peerlatency;
     enum SRTMode mode;
+    int sndbuf;
+    int rcvbuf;
+    int lossmaxttl;
+    int minversion;
+    char *streamid;
+    char *smoother;
+    int messageapi;
+    SRT_TRANSTYPE transtype;
+    int linger;
 } SRTContext;
 
 #define D AV_OPT_FLAG_DECODING_PARAM
 #define E AV_OPT_FLAG_ENCODING_PARAM
 #define OFFSET(x) offsetof(SRTContext, x)
 static const AVOption libsrt_options[] = {
-    { "rw_timeout",     "Timeout of socket I/O operations",                                     OFFSET(rw_timeout),       AV_OPT_TYPE_INT64, { .i64 = -1 }, -1, INT64_MAX, .flags = D|E },
+    { "timeout",        "Timeout of socket I/O operations",                                     OFFSET(rw_timeout),       AV_OPT_TYPE_INT64, { .i64 = -1 }, -1, INT64_MAX, .flags = D|E },
     { "listen_timeout", "Connection awaiting timeout",                                          OFFSET(listen_timeout),   AV_OPT_TYPE_INT64, { .i64 = -1 }, -1, INT64_MAX, .flags = D|E },
     { "send_buffer_size", "Socket send buffer size (in bytes)",                                 OFFSET(send_buffer_size), AV_OPT_TYPE_INT,      { .i64 = -1 }, -1, INT_MAX,   .flags = D|E },
     { "recv_buffer_size", "Socket receive buffer size (in bytes)",                              OFFSET(recv_buffer_size), AV_OPT_TYPE_INT,      { .i64 = -1 }, -1, INT_MAX,   .flags = D|E },
@@ -93,6 +107,11 @@
     { "maxbw",          "Maximum bandwidth (bytes per second) that the connection can use",     OFFSET(maxbw),            AV_OPT_TYPE_INT64,    { .i64 = -1 }, -1, INT64_MAX, .flags = D|E },
     { "pbkeylen",       "Crypto key len in bytes {16,24,32} Default: 16 (128-bit)",             OFFSET(pbkeylen),         AV_OPT_TYPE_INT,      { .i64 = -1 }, -1, 32,        .flags = D|E },
     { "passphrase",     "Crypto PBKDF2 Passphrase size[0,10..64] 0:disable crypto",             OFFSET(passphrase),       AV_OPT_TYPE_STRING,   { .str = NULL },              .flags = D|E },
+#if SRT_VERSION_VALUE >= 0x010302
+    { "enforced_encryption", "Enforces that both connection parties have the same passphrase set",                              OFFSET(enforced_encryption), AV_OPT_TYPE_BOOL,  { .i64 = -1 }, -1, 1,         .flags = D|E },
+    { "kmrefreshrate",       "The number of packets to be transmitted after which the encryption key is switched to a new key", OFFSET(kmrefreshrate),       AV_OPT_TYPE_INT,   { .i64 = -1 }, -1, INT_MAX,   .flags = D|E },
+    { "kmpreannounce",       "The interval between when a new encryption key is sent and when switchover occurs",               OFFSET(kmpreannounce),       AV_OPT_TYPE_INT,   { .i64 = -1 }, -1, INT_MAX,   .flags = D|E },
+#endif
     { "mss",            "The Maximum Segment Size",                                             OFFSET(mss),              AV_OPT_TYPE_INT,      { .i64 = -1 }, -1, 1500,      .flags = D|E },
     { "ffs",            "Flight flag size (window size) (in bytes)",                            OFFSET(ffs),              AV_OPT_TYPE_INT,      { .i64 = -1 }, -1, INT_MAX,   .flags = D|E },
     { "ipttl",          "IP Time To Live",                                                      OFFSET(ipttl),            AV_OPT_TYPE_INT,      { .i64 = -1 }, -1, 255,       .flags = D|E },
@@ -103,45 +122,60 @@
     { "tsbpddelay",     "deprecated, same effect as latency option",                            OFFSET(latency),          AV_OPT_TYPE_INT64, { .i64 = -1 }, -1, INT64_MAX, .flags = D|E },
     { "rcvlatency",     "receive latency",                                                      OFFSET(rcvlatency),       AV_OPT_TYPE_INT64, { .i64 = -1 }, -1, INT64_MAX, .flags = D|E },
     { "peerlatency",    "peer latency",                                                         OFFSET(peerlatency),      AV_OPT_TYPE_INT64, { .i64 = -1 }, -1, INT64_MAX, .flags = D|E },
-    { "tlpktdrop",      "Enable receiver pkt drop",                                             OFFSET(tlpktdrop),        AV_OPT_TYPE_INT,      { .i64 = -1 }, -1, 1,         .flags = D|E },
-    { "nakreport",      "Enable receiver to send periodic NAK reports",                         OFFSET(nakreport),        AV_OPT_TYPE_INT,      { .i64 = -1 }, -1, 1,         .flags = D|E },
+    { "tlpktdrop",      "Enable receiver pkt drop",                                             OFFSET(tlpktdrop),        AV_OPT_TYPE_BOOL,     { .i64 = -1 }, -1, 1,         .flags = D|E },
+    { "nakreport",      "Enable receiver to send periodic NAK reports",                         OFFSET(nakreport),        AV_OPT_TYPE_BOOL,     { .i64 = -1 }, -1, 1,         .flags = D|E },
     { "connect_timeout", "Connect timeout. Caller default: 3000, rendezvous (x 10)",            OFFSET(connect_timeout),  AV_OPT_TYPE_INT64, { .i64 = -1 }, -1, INT64_MAX, .flags = D|E },
     { "mode",           "Connection mode (caller, listener, rendezvous)",                       OFFSET(mode),             AV_OPT_TYPE_INT,      { .i64 = SRT_MODE_CALLER }, SRT_MODE_CALLER, SRT_MODE_RENDEZVOUS, .flags = D|E, "mode" },
     { "caller",         NULL, 0, AV_OPT_TYPE_CONST,  { .i64 = SRT_MODE_CALLER },     INT_MIN, INT_MAX, .flags = D|E, "mode" },
     { "listener",       NULL, 0, AV_OPT_TYPE_CONST,  { .i64 = SRT_MODE_LISTENER },   INT_MIN, INT_MAX, .flags = D|E, "mode" },
     { "rendezvous",     NULL, 0, AV_OPT_TYPE_CONST,  { .i64 = SRT_MODE_RENDEZVOUS }, INT_MIN, INT_MAX, .flags = D|E, "mode" },
+    { "sndbuf",         "Send buffer size (in bytes)",                                          OFFSET(sndbuf),           AV_OPT_TYPE_INT,      { .i64 = -1 }, -1, INT_MAX,   .flags = D|E },
+    { "rcvbuf",         "Receive buffer size (in bytes)",                                       OFFSET(rcvbuf),           AV_OPT_TYPE_INT,      { .i64 = -1 }, -1, INT_MAX,   .flags = D|E },
+    { "lossmaxttl",     "Maximum possible packet reorder tolerance",                            OFFSET(lossmaxttl),       AV_OPT_TYPE_INT,      { .i64 = -1 }, -1, INT_MAX,   .flags = D|E },
+    { "minversion",     "The minimum SRT version that is required from the peer",               OFFSET(minversion),       AV_OPT_TYPE_INT,      { .i64 = -1 }, -1, INT_MAX,   .flags = D|E },
+    { "streamid",       "A string of up to 512 characters that an Initiator can pass to a Responder",  OFFSET(streamid),  AV_OPT_TYPE_STRING,   { .str = NULL },              .flags = D|E },
+    { "smoother",       "The type of Smoother used for the transmission for that socket",       OFFSET(smoother),         AV_OPT_TYPE_STRING,   { .str = NULL },              .flags = D|E },
+    { "messageapi",     "Enable message API",                                                   OFFSET(messageapi),       AV_OPT_TYPE_BOOL,     { .i64 = -1 }, -1, 1,         .flags = D|E },
+    { "transtype",      "The transmission type for the socket",                                 OFFSET(transtype),        AV_OPT_TYPE_INT,      { .i64 = SRTT_INVALID }, SRTT_LIVE, SRTT_INVALID, .flags = D|E, "transtype" },
+    { "live",           NULL, 0, AV_OPT_TYPE_CONST,  { .i64 = SRTT_LIVE }, INT_MIN, INT_MAX, .flags = D|E, "transtype" },
+    { "file",           NULL, 0, AV_OPT_TYPE_CONST,  { .i64 = SRTT_FILE }, INT_MIN, INT_MAX, .flags = D|E, "transtype" },
+    { "linger",         "Number of seconds that the socket waits for unsent data when closing", OFFSET(linger),           AV_OPT_TYPE_INT,      { .i64 = -1 }, -1, INT_MAX,   .flags = D|E },
     { NULL }
 };
 
 static int libsrt_neterrno(URLContext *h)
 {
-    int err = srt_getlasterror(NULL);
-    av_log(h, AV_LOG_ERROR, "%s\n", srt_getlasterror_str());
-    if (err == SRT_EASYNCRCV)
+    int os_errno;
+    int err = srt_getlasterror(&os_errno);
+    if (err == SRT_EASYNCRCV || err == SRT_EASYNCSND)
         return AVERROR(EAGAIN);
-    return AVERROR_UNKNOWN;
+    av_log(h, AV_LOG_ERROR, "%s\n", srt_getlasterror_str());
+    return os_errno ? AVERROR(os_errno) : AVERROR_UNKNOWN;
 }
 
 static int libsrt_socket_nonblock(int socket, int enable)
 {
-    int ret = srt_setsockopt(socket, 0, SRTO_SNDSYN, &enable, sizeof(enable));
+    int ret, blocking = enable ? 0 : 1;
+    /* Setting SRTO_{SND,RCV}SYN options to 1 enable blocking mode, setting them to 0 enable non-blocking mode. */
+    ret = srt_setsockopt(socket, 0, SRTO_SNDSYN, &blocking, sizeof(blocking));
     if (ret < 0)
         return ret;
-    return srt_setsockopt(socket, 0, SRTO_RCVSYN, &enable, sizeof(enable));
+    return srt_setsockopt(socket, 0, SRTO_RCVSYN, &blocking, sizeof(blocking));
 }
 
 static int libsrt_network_wait_fd(URLContext *h, int eid, int fd, int write)
 {
-    int ret, len = 1;
-    int modes = write ? SRT_EPOLL_OUT : SRT_EPOLL_IN;
+    int ret, len = 1, errlen = 1;
+    int modes = SRT_EPOLL_ERR | (write ? SRT_EPOLL_OUT : SRT_EPOLL_IN);
     SRTSOCKET ready[1];
+    SRTSOCKET error[1];
 
     if (srt_epoll_add_usock(eid, fd, &modes) < 0)
         return libsrt_neterrno(h);
     if (write) {
-        ret = srt_epoll_wait(eid, 0, 0, ready, &len, POLLING_TIME, 0, 0, 0, 0);
+        ret = srt_epoll_wait(eid, error, &errlen, ready, &len, POLLING_TIME, 0, 0, 0, 0);
     } else {
-        ret = srt_epoll_wait(eid, ready, &len, 0, 0, POLLING_TIME, 0, 0, 0, 0);
+        ret = srt_epoll_wait(eid, ready, &len, error, &errlen, POLLING_TIME, 0, 0, 0, 0);
     }
     if (ret < 0) {
         if (srt_getlasterror(NULL) == SRT_ETIMEOUT)
@@ -149,7 +183,7 @@
         else
             ret = libsrt_neterrno(h);
     } else {
-        ret = 0;
+        ret = errlen ? AVERROR(EIO) : 0;
     }
     if (srt_epoll_remove_usock(eid, fd) < 0)
         return libsrt_neterrno(h);
@@ -178,7 +212,7 @@
     }
 }
 
-static int libsrt_listen(int eid, int fd, const struct sockaddr *addr, socklen_t addrlen, URLContext *h, int timeout)
+static int libsrt_listen(int eid, int fd, const struct sockaddr *addr, socklen_t addrlen, URLContext *h, int64_t timeout)
 {
     int ret;
     int reuse = 1;
@@ -193,14 +227,9 @@
     if (ret)
         return libsrt_neterrno(h);
 
-    while ((ret = libsrt_network_wait_fd_timeout(h, eid, fd, 1, timeout, &h->interrupt_callback))) {
-        switch (ret) {
-        case AVERROR(ETIMEDOUT):
-            continue;
-        default:
-            return ret;
-        }
-    }
+    ret = libsrt_network_wait_fd_timeout(h, eid, fd, 1, timeout, &h->interrupt_callback);
+    if (ret < 0)
+        return ret;
 
     ret = srt_accept(fd, NULL, NULL);
     if (ret < 0)
@@ -211,41 +240,23 @@
     return ret;
 }
 
-static int libsrt_listen_connect(int eid, int fd, const struct sockaddr *addr, socklen_t addrlen, int timeout, URLContext *h, int will_try_next)
+static int libsrt_listen_connect(int eid, int fd, const struct sockaddr *addr, socklen_t addrlen, int64_t timeout, URLContext *h, int will_try_next)
 {
     int ret;
 
-    if (libsrt_socket_nonblock(fd, 1) < 0)
-        av_log(h, AV_LOG_DEBUG, "ff_socket_nonblock failed\n");
+    ret = srt_connect(fd, addr, addrlen);
+    if (ret < 0)
+        return libsrt_neterrno(h);
 
-    while ((ret = srt_connect(fd, addr, addrlen))) {
-        ret = libsrt_neterrno(h);
-        switch (ret) {
-        case AVERROR(EINTR):
-            if (ff_check_interrupt(&h->interrupt_callback))
-                return AVERROR_EXIT;
-            continue;
-        case AVERROR(EINPROGRESS):
-        case AVERROR(EAGAIN):
-            ret = libsrt_network_wait_fd_timeout(h, eid, fd, 1, timeout, &h->interrupt_callback);
-            if (ret < 0)
-                return ret;
-            ret = srt_getlasterror(NULL);
-            srt_clearlasterror();
-            if (ret != 0) {
-                char buf[128];
-                ret = AVERROR(ret);
-                av_strerror(ret, buf, sizeof(buf));
-                if (will_try_next)
-                    av_log(h, AV_LOG_WARNING,
-                           "Connection to %s failed (%s), trying next address\n",
-                           h->filename, buf);
-                else
-                    av_log(h, AV_LOG_ERROR, "Connection to %s failed: %s\n",
-                           h->filename, buf);
-            }
-        default:
-            return ret;
+    ret = libsrt_network_wait_fd_timeout(h, eid, fd, 1, timeout, &h->interrupt_callback);
+    if (ret < 0) {
+        if (will_try_next) {
+            av_log(h, AV_LOG_WARNING,
+                   "Connection to %s failed (%s), trying next address\n",
+                   h->filename, av_err2str(ret));
+        } else {
+            av_log(h, AV_LOG_ERROR, "Connection to %s failed: %s\n",
+                   h->filename, av_err2str(ret));
         }
     }
     return ret;
@@ -297,12 +308,19 @@
     int connect_timeout = s->connect_timeout;
 
     if ((s->mode == SRT_MODE_RENDEZVOUS && libsrt_setsockopt(h, fd, SRTO_RENDEZVOUS, "SRTO_RENDEZVOUS", &yes, sizeof(yes)) < 0) ||
+        (s->transtype != SRTT_INVALID && libsrt_setsockopt(h, fd, SRTO_TRANSTYPE, "SRTO_TRANSTYPE", &s->transtype, sizeof(s->transtype)) < 0) ||
         (s->maxbw >= 0 && libsrt_setsockopt(h, fd, SRTO_MAXBW, "SRTO_MAXBW", &s->maxbw, sizeof(s->maxbw)) < 0) ||
         (s->pbkeylen >= 0 && libsrt_setsockopt(h, fd, SRTO_PBKEYLEN, "SRTO_PBKEYLEN", &s->pbkeylen, sizeof(s->pbkeylen)) < 0) ||
         (s->passphrase && libsrt_setsockopt(h, fd, SRTO_PASSPHRASE, "SRTO_PASSPHRASE", s->passphrase, strlen(s->passphrase)) < 0) ||
-        (s->mss >= 0 && libsrt_setsockopt(h, fd, SRTO_MSS, "SRTO_MMS", &s->mss, sizeof(s->mss)) < 0) ||
+#if SRT_VERSION_VALUE >= 0x010302
+        /* SRTO_STRICTENC == SRTO_ENFORCEDENCRYPTION (53), but for compatibility, we used SRTO_STRICTENC */
+        (s->enforced_encryption >= 0 && libsrt_setsockopt(h, fd, SRTO_STRICTENC, "SRTO_STRICTENC", &s->enforced_encryption, sizeof(s->enforced_encryption)) < 0) ||
+        (s->kmrefreshrate >= 0 && libsrt_setsockopt(h, fd, SRTO_KMREFRESHRATE, "SRTO_KMREFRESHRATE", &s->kmrefreshrate, sizeof(s->kmrefreshrate)) < 0) ||
+        (s->kmpreannounce >= 0 && libsrt_setsockopt(h, fd, SRTO_KMPREANNOUNCE, "SRTO_KMPREANNOUNCE", &s->kmpreannounce, sizeof(s->kmpreannounce)) < 0) ||
+#endif
+        (s->mss >= 0 && libsrt_setsockopt(h, fd, SRTO_MSS, "SRTO_MSS", &s->mss, sizeof(s->mss)) < 0) ||
         (s->ffs >= 0 && libsrt_setsockopt(h, fd, SRTO_FC, "SRTO_FC", &s->ffs, sizeof(s->ffs)) < 0) ||
-        (s->ipttl >= 0 && libsrt_setsockopt(h, fd, SRTO_IPTTL, "SRTO_UPTTL", &s->ipttl, sizeof(s->ipttl)) < 0) ||
+        (s->ipttl >= 0 && libsrt_setsockopt(h, fd, SRTO_IPTTL, "SRTO_IPTTL", &s->ipttl, sizeof(s->ipttl)) < 0) ||
         (s->iptos >= 0 && libsrt_setsockopt(h, fd, SRTO_IPTOS, "SRTO_IPTOS", &s->iptos, sizeof(s->iptos)) < 0) ||
         (s->latency >= 0 && libsrt_setsockopt(h, fd, SRTO_LATENCY, "SRTO_LATENCY", &latency, sizeof(latency)) < 0) ||
         (s->rcvlatency >= 0 && libsrt_setsockopt(h, fd, SRTO_RCVLATENCY, "SRTO_RCVLATENCY", &rcvlatency, sizeof(rcvlatency)) < 0) ||
@@ -310,9 +328,25 @@
         (s->tlpktdrop >= 0 && libsrt_setsockopt(h, fd, SRTO_TLPKTDROP, "SRTO_TLPKDROP", &s->tlpktdrop, sizeof(s->tlpktdrop)) < 0) ||
         (s->nakreport >= 0 && libsrt_setsockopt(h, fd, SRTO_NAKREPORT, "SRTO_NAKREPORT", &s->nakreport, sizeof(s->nakreport)) < 0) ||
         (connect_timeout >= 0 && libsrt_setsockopt(h, fd, SRTO_CONNTIMEO, "SRTO_CONNTIMEO", &connect_timeout, sizeof(connect_timeout)) <0 ) ||
-        (s->payload_size >= 0 && libsrt_setsockopt(h, fd, SRTO_PAYLOADSIZE, "SRTO_PAYLOADSIZE", &s->payload_size, sizeof(s->payload_size)) < 0)) {
+        (s->sndbuf >= 0 && libsrt_setsockopt(h, fd, SRTO_SNDBUF, "SRTO_SNDBUF", &s->sndbuf, sizeof(s->sndbuf)) < 0) ||
+        (s->rcvbuf >= 0 && libsrt_setsockopt(h, fd, SRTO_RCVBUF, "SRTO_RCVBUF", &s->rcvbuf, sizeof(s->rcvbuf)) < 0) ||
+        (s->lossmaxttl >= 0 && libsrt_setsockopt(h, fd, SRTO_LOSSMAXTTL, "SRTO_LOSSMAXTTL", &s->lossmaxttl, sizeof(s->lossmaxttl)) < 0) ||
+        (s->minversion >= 0 && libsrt_setsockopt(h, fd, SRTO_MINVERSION, "SRTO_MINVERSION", &s->minversion, sizeof(s->minversion)) < 0) ||
+        (s->streamid && libsrt_setsockopt(h, fd, SRTO_STREAMID, "SRTO_STREAMID", s->streamid, strlen(s->streamid)) < 0) ||
+        (s->smoother && libsrt_setsockopt(h, fd, SRTO_SMOOTHER, "SRTO_SMOOTHER", s->smoother, strlen(s->smoother)) < 0) ||
+        (s->messageapi >= 0 && libsrt_setsockopt(h, fd, SRTO_MESSAGEAPI, "SRTO_MESSAGEAPI", &s->messageapi, sizeof(s->messageapi)) < 0) ||
+        (s->payload_size >= 0 && libsrt_setsockopt(h, fd, SRTO_PAYLOADSIZE, "SRTO_PAYLOADSIZE", &s->payload_size, sizeof(s->payload_size)) < 0) ||
+        ((h->flags & AVIO_FLAG_WRITE) && libsrt_setsockopt(h, fd, SRTO_SENDER, "SRTO_SENDER", &yes, sizeof(yes)) < 0)) {
         return AVERROR(EIO);
     }
+
+    if (s->linger >= 0) {
+        struct linger lin;
+        lin.l_linger = s->linger;
+        lin.l_onoff  = lin.l_linger > 0 ? 1 : 0;
+        if (libsrt_setsockopt(h, fd, SRTO_LINGER, "SRTO_LINGER", &lin, sizeof(lin)) < 0)
+            return AVERROR(EIO);
+    }
     return 0;
 }
 
@@ -327,7 +361,7 @@
     int ret;
     char hostname[1024],proto[1024],path[1024];
     char portstr[10];
-    int open_timeout = 5000000;
+    int open_timeout = 0;
     int eid;
 
     eid = srt_epoll_create();
@@ -390,9 +424,12 @@
     if (s->send_buffer_size > 0) {
         srt_setsockopt(fd, SOL_SOCKET, SRTO_UDP_SNDBUF, &s->send_buffer_size, sizeof (s->send_buffer_size));
     }
+    if (libsrt_socket_nonblock(fd, 1) < 0)
+        av_log(h, AV_LOG_DEBUG, "libsrt_socket_nonblock failed\n");
+
     if (s->mode == SRT_MODE_LISTENER) {
         // multi-client
-        if ((ret = libsrt_listen(s->eid, fd, cur_ai->ai_addr, cur_ai->ai_addrlen, h, open_timeout / 1000)) < 0)
+        if ((ret = libsrt_listen(s->eid, fd, cur_ai->ai_addr, cur_ai->ai_addrlen, h, s->listen_timeout)) < 0)
             goto fail1;
         fd = ret;
     } else {
@@ -403,7 +440,7 @@
         }
 
         if ((ret = libsrt_listen_connect(s->eid, fd, cur_ai->ai_addr, cur_ai->ai_addrlen,
-                                          open_timeout / 1000, h, !!cur_ai->ai_next)) < 0) {
+                                          open_timeout, h, !!cur_ai->ai_next)) < 0) {
             if (ret == AVERROR_EXIT)
                 goto fail1;
             else
@@ -451,6 +488,7 @@
     SRTContext *s = h->priv_data;
     const char * p;
     char buf[256];
+    int ret = 0;
 
     if (srt_startup() < 0) {
         return AVERROR_UNKNOWN;
@@ -466,8 +504,20 @@
             s->pbkeylen = strtol(buf, NULL, 10);
         }
         if (av_find_info_tag(buf, sizeof(buf), "passphrase", p)) {
+            av_freep(&s->passphrase);
             s->passphrase = av_strndup(buf, strlen(buf));
         }
+#if SRT_VERSION_VALUE >= 0x010302
+        if (av_find_info_tag(buf, sizeof(buf), "enforced_encryption", p)) {
+            s->enforced_encryption = strtol(buf, NULL, 10);
+        }
+        if (av_find_info_tag(buf, sizeof(buf), "kmrefreshrate", p)) {
+            s->kmrefreshrate = strtol(buf, NULL, 10);
+        }
+        if (av_find_info_tag(buf, sizeof(buf), "kmpreannounce", p)) {
+            s->kmpreannounce = strtol(buf, NULL, 10);
+        }
+#endif
         if (av_find_info_tag(buf, sizeof(buf), "mss", p)) {
             s->mss = strtol(buf, NULL, 10);
         }
@@ -522,8 +572,56 @@
                 return AVERROR(EIO);
             }
         }
+        if (av_find_info_tag(buf, sizeof(buf), "sndbuf", p)) {
+            s->sndbuf = strtol(buf, NULL, 10);
+        }
+        if (av_find_info_tag(buf, sizeof(buf), "rcvbuf", p)) {
+            s->rcvbuf = strtol(buf, NULL, 10);
+        }
+        if (av_find_info_tag(buf, sizeof(buf), "lossmaxttl", p)) {
+            s->lossmaxttl = strtol(buf, NULL, 10);
+        }
+        if (av_find_info_tag(buf, sizeof(buf), "minversion", p)) {
+            s->minversion = strtol(buf, NULL, 0);
+        }
+        if (av_find_info_tag(buf, sizeof(buf), "streamid", p)) {
+            av_freep(&s->streamid);
+            s->streamid = av_strdup(buf);
+            if (!s->streamid) {
+                ret = AVERROR(ENOMEM);
+                goto err;
+            }
+        }
+        if (av_find_info_tag(buf, sizeof(buf), "smoother", p)) {
+            av_freep(&s->smoother);
+            s->smoother = av_strdup(buf);
+            if(!s->smoother) {
+                ret = AVERROR(ENOMEM);
+                goto err;
+            }
+        }
+        if (av_find_info_tag(buf, sizeof(buf), "messageapi", p)) {
+            s->messageapi = strtol(buf, NULL, 10);
+        }
+        if (av_find_info_tag(buf, sizeof(buf), "transtype", p)) {
+            if (!strcmp(buf, "live")) {
+                s->transtype = SRTT_LIVE;
+            } else if (!strcmp(buf, "file")) {
+                s->transtype = SRTT_FILE;
+            } else {
+                ret = AVERROR(EINVAL);
+                goto err;
+            }
+        }
+        if (av_find_info_tag(buf, sizeof(buf), "linger", p)) {
+            s->linger = strtol(buf, NULL, 10);
+        }
     }
     return libsrt_setup(h, uri, flags);
+err:
+    av_freep(&s->smoother);
+    av_freep(&s->streamid);
+    return ret;
 }
 
 static int libsrt_read(URLContext *h, uint8_t *buf, int size)
diff --git a/libavformat/libzmq.c b/libavformat/libzmq.c
new file mode 100644
index 0000000..1b0d863
--- /dev/null
+++ b/libavformat/libzmq.c
@@ -0,0 +1,204 @@
+/*
+ * ZeroMQ Protocol
+ * Copyright (c) 2019 Andriy Gelman
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include <zmq.h>
+#include "url.h"
+#include "network.h"
+#include "libavutil/avstring.h"
+#include "libavutil/opt.h"
+#include "libavutil/time.h"
+
+#define ZMQ_STRERROR zmq_strerror(zmq_errno())
+
+typedef struct ZMQContext {
+    const AVClass *class;
+    void *context;
+    void *socket;
+    int   pkt_size;
+    int   pkt_size_overflow; /*keep track of the largest packet during overflow*/
+} ZMQContext;
+
+#define OFFSET(x) offsetof(ZMQContext, x)
+#define D AV_OPT_FLAG_DECODING_PARAM
+#define E AV_OPT_FLAG_ENCODING_PARAM
+static const AVOption options[] = {
+    { "pkt_size", "Maximum send/read packet size", OFFSET(pkt_size), AV_OPT_TYPE_INT, { .i64 = 131072 }, -1, INT_MAX, .flags = D | E },
+    { NULL }
+};
+
+static int zmq_proto_wait(URLContext *h, void *socket, int write)
+{
+    int ret;
+    int ev = write ? ZMQ_POLLOUT : ZMQ_POLLIN;
+    zmq_pollitem_t items = { .socket = socket, .fd = 0, .events = ev, .revents = 0 };
+    ret = zmq_poll(&items, 1, POLLING_TIME);
+    if (ret == -1) {
+        av_log(h, AV_LOG_ERROR, "Error occured during zmq_poll(): %s\n", ZMQ_STRERROR);
+        return AVERROR_EXTERNAL;
+    }
+    return items.revents & ev ? 0 : AVERROR(EAGAIN);
+}
+
+static int zmq_proto_wait_timeout(URLContext *h, void *socket, int write, int64_t timeout, AVIOInterruptCB *int_cb)
+{
+    int ret;
+    int64_t wait_start = 0;
+
+    while (1) {
+        if (ff_check_interrupt(int_cb))
+            return AVERROR_EXIT;
+        ret = zmq_proto_wait(h, socket, write);
+        if (ret != AVERROR(EAGAIN))
+            return ret;
+        if (timeout > 0) {
+            if (!wait_start)
+                wait_start = av_gettime_relative();
+            else if (av_gettime_relative() - wait_start > timeout)
+                return AVERROR(ETIMEDOUT);
+        }
+    }
+}
+
+static int zmq_proto_open(URLContext *h, const char *uri, int flags)
+{
+    int ret;
+    ZMQContext *s        = h->priv_data;
+    s->pkt_size_overflow = 0;
+    h->is_streamed       = 1;
+
+    if (s->pkt_size > 0)
+        h->max_packet_size = s->pkt_size;
+
+    s->context = zmq_ctx_new();
+    if (!s->context) {
+        /*errno not set on failure during zmq_ctx_new()*/
+        av_log(h, AV_LOG_ERROR, "Error occured during zmq_ctx_new()\n");
+        return AVERROR_EXTERNAL;
+    }
+
+    av_strstart(uri, "zmq:", &uri);
+
+    /*publish during write*/
+    if (h->flags & AVIO_FLAG_WRITE) {
+        s->socket = zmq_socket(s->context, ZMQ_PUB);
+        if (!s->socket) {
+            av_log(h, AV_LOG_ERROR, "Error occured during zmq_socket(): %s\n", ZMQ_STRERROR);
+            goto fail_term;
+        }
+
+        ret = zmq_bind(s->socket, uri);
+        if (ret == -1) {
+            av_log(h, AV_LOG_ERROR, "Error occured during zmq_bind(): %s\n", ZMQ_STRERROR);
+            goto fail_close;
+        }
+    }
+
+    /*subscribe for read*/
+    if (h->flags & AVIO_FLAG_READ) {
+        s->socket = zmq_socket(s->context, ZMQ_SUB);
+        if (!s->socket) {
+            av_log(h, AV_LOG_ERROR, "Error occured during zmq_socket(): %s\n", ZMQ_STRERROR);
+            goto fail_term;
+        }
+
+        ret = zmq_setsockopt(s->socket, ZMQ_SUBSCRIBE, "", 0);
+        if (ret == -1) {
+            av_log(h, AV_LOG_ERROR, "Error occured during zmq_setsockopt(): %s\n", ZMQ_STRERROR);
+            goto fail_close;
+        }
+
+        ret = zmq_connect(s->socket, uri);
+        if (ret == -1) {
+            av_log(h, AV_LOG_ERROR, "Error occured during zmq_connect(): %s\n", ZMQ_STRERROR);
+            goto fail_close;
+        }
+    }
+    return 0;
+
+fail_close:
+    zmq_close(s->socket);
+fail_term:
+    zmq_ctx_term(s->context);
+    return AVERROR_EXTERNAL;
+}
+
+static int zmq_proto_write(URLContext *h, const unsigned char *buf, int size)
+{
+    int ret;
+    ZMQContext *s = h->priv_data;
+
+    ret = zmq_proto_wait_timeout(h, s->socket, 1, h->rw_timeout, &h->interrupt_callback);
+    if (ret)
+        return ret;
+    ret = zmq_send(s->socket, buf, size, 0);
+    if (ret == -1) {
+        av_log(h, AV_LOG_ERROR, "Error occured during zmq_send(): %s\n", ZMQ_STRERROR);
+        return AVERROR_EXTERNAL;
+    }
+    return ret; /*number of bytes sent*/
+}
+
+static int zmq_proto_read(URLContext *h, unsigned char *buf, int size)
+{
+    int ret;
+    ZMQContext *s = h->priv_data;
+
+    ret = zmq_proto_wait_timeout(h, s->socket, 0, h->rw_timeout, &h->interrupt_callback);
+    if (ret)
+        return ret;
+    ret = zmq_recv(s->socket, buf, size, 0);
+    if (ret == -1) {
+        av_log(h, AV_LOG_ERROR, "Error occured during zmq_recv(): %s\n", ZMQ_STRERROR);
+        return AVERROR_EXTERNAL;
+    }
+    if (ret > size) {
+        s->pkt_size_overflow = FFMAX(s->pkt_size_overflow, ret);
+        av_log(h, AV_LOG_WARNING, "Message exceeds available space in the buffer. Message will be truncated. Setting -pkt_size %d may resolve the issue.\n", s->pkt_size_overflow);
+        ret = size;
+    }
+    return ret; /*number of bytes read*/
+}
+
+static int zmq_proto_close(URLContext *h)
+{
+    ZMQContext *s = h->priv_data;
+    zmq_close(s->socket);
+    zmq_ctx_term(s->context);
+    return 0;
+}
+
+static const AVClass zmq_context_class = {
+    .class_name = "zmq",
+    .item_name  = av_default_item_name,
+    .option     = options,
+    .version    = LIBAVUTIL_VERSION_INT,
+};
+
+const URLProtocol ff_libzmq_protocol = {
+    .name            = "zmq",
+    .url_close       = zmq_proto_close,
+    .url_open        = zmq_proto_open,
+    .url_read        = zmq_proto_read,
+    .url_write       = zmq_proto_write,
+    .priv_data_size  = sizeof(ZMQContext),
+    .priv_data_class = &zmq_context_class,
+    .flags           = URL_PROTOCOL_FLAG_NETWORK,
+};
diff --git a/libavformat/lmlm4.c b/libavformat/lmlm4.c
index d0cf8fe..79d703a 100644
--- a/libavformat/lmlm4.c
+++ b/libavformat/lmlm4.c
@@ -35,7 +35,7 @@
 
 #define LMLM4_MAX_PACKET_SIZE   1024 * 1024
 
-static int lmlm4_probe(AVProbeData *pd)
+static int lmlm4_probe(const AVProbeData *pd)
 {
     const unsigned char *buf = pd->buf;
     unsigned int frame_type, packet_size;
diff --git a/libavformat/loasdec.c b/libavformat/loasdec.c
index 7044055..e166a59 100644
--- a/libavformat/loasdec.c
+++ b/libavformat/loasdec.c
@@ -27,7 +27,7 @@
 
 #define LOAS_SYNC_WORD 0x2b7
 
-static int loas_probe(AVProbeData *p)
+static int loas_probe(const AVProbeData *p)
 {
     int max_frames = 0, first_frames = 0;
     int fsize, frames;
@@ -83,6 +83,7 @@
     return 0;
 }
 
+FF_RAW_DEMUXER_CLASS(loas)
 AVInputFormat ff_loas_demuxer = {
     .name           = "loas",
     .long_name      = NULL_IF_CONFIG_SMALL("LOAS AudioSyncStream"),
@@ -91,4 +92,6 @@
     .read_packet    = ff_raw_read_partial_packet,
     .flags= AVFMT_GENERIC_INDEX,
     .raw_codec_id = AV_CODEC_ID_AAC_LATM,
+    .priv_data_size = sizeof(FFRawDemuxerContext),
+    .priv_class     = &loas_demuxer_class,
 };
diff --git a/libavformat/lrcdec.c b/libavformat/lrcdec.c
index f4e9a4e..a9a1176 100644
--- a/libavformat/lrcdec.c
+++ b/libavformat/lrcdec.c
@@ -116,7 +116,7 @@
     return pos;
 }
 
-static int lrc_probe(AVProbeData *p)
+static int lrc_probe(const AVProbeData *p)
 {
     int64_t offset = 0;
     int64_t mm;
diff --git a/libavformat/lvfdec.c b/libavformat/lvfdec.c
index b8af256..8b8d6f0 100644
--- a/libavformat/lvfdec.c
+++ b/libavformat/lvfdec.c
@@ -23,7 +23,7 @@
 #include "avformat.h"
 #include "riff.h"
 
-static int lvf_probe(AVProbeData *p)
+static int lvf_probe(const AVProbeData *p)
 {
     if (AV_RL32(p->buf) != MKTAG('L', 'V', 'F', 'F'))
         return 0;
diff --git a/libavformat/lxfdec.c b/libavformat/lxfdec.c
index 9b3eb6a..fa84cee 100644
--- a/libavformat/lxfdec.c
+++ b/libavformat/lxfdec.c
@@ -52,7 +52,7 @@
     uint32_t video_format, packet_type, extended_size;
 } LXFDemuxContext;
 
-static int lxf_probe(AVProbeData *p)
+static int lxf_probe(const AVProbeData *p)
 {
     if (!memcmp(p->buf, LXF_IDENT, LXF_IDENT_LENGTH))
         return AVPROBE_SCORE_MAX;
@@ -316,7 +316,6 @@
         return ret2;
 
     if ((ret2 = avio_read(pb, pkt->data, ret)) != ret) {
-        av_packet_unref(pkt);
         return ret2 < 0 ? ret2 : AVERROR_EOF;
     }
 
diff --git a/libavformat/m4vdec.c b/libavformat/m4vdec.c
index 220daeb..befe4d7 100644
--- a/libavformat/m4vdec.c
+++ b/libavformat/m4vdec.c
@@ -30,7 +30,7 @@
 #define SLICE_STARTCODE      0x1B7
 #define EXT_STARTCODE        0x1B8
 
-static int mpeg4video_probe(AVProbeData *probe_packet)
+static int mpeg4video_probe(const AVProbeData *probe_packet)
 {
     uint32_t temp_buffer = -1;
     int VO = 0, VOL = 0, VOP = 0, VISO = 0, res = 0;
diff --git a/libavformat/matroska.c b/libavformat/matroska.c
index 4d18d14..7c56aba 100644
--- a/libavformat/matroska.c
+++ b/libavformat/matroska.c
@@ -119,25 +119,6 @@
     {""                 , AV_CODEC_ID_NONE}
 };
 
-const CodecMime ff_mkv_image_mime_tags[] = {
-    {"image/gif"                  , AV_CODEC_ID_GIF},
-    {"image/jpeg"                 , AV_CODEC_ID_MJPEG},
-    {"image/png"                  , AV_CODEC_ID_PNG},
-    {"image/tiff"                 , AV_CODEC_ID_TIFF},
-
-    {""                           , AV_CODEC_ID_NONE}
-};
-
-const CodecMime ff_mkv_mime_tags[] = {
-    {"text/plain"                 , AV_CODEC_ID_TEXT},
-    {"application/x-truetype-font", AV_CODEC_ID_TTF},
-    {"application/x-font"         , AV_CODEC_ID_TTF},
-    {"application/vnd.ms-opentype", AV_CODEC_ID_OTF},
-    {"binary"                     , AV_CODEC_ID_BIN_DATA},
-
-    {""                           , AV_CODEC_ID_NONE}
-};
-
 const AVMetadataConv ff_mkv_metadata_conv[] = {
     { "LEAD_PERFORMER", "performer" },
     { "PART_NUMBER"   , "track"  },
diff --git a/libavformat/matroska.h b/libavformat/matroska.h
index 86968a8..6f198f0 100644
--- a/libavformat/matroska.h
+++ b/libavformat/matroska.h
@@ -271,6 +271,7 @@
   MATROSKA_TRACK_TYPE_COMPLEX  = 0x3,
   MATROSKA_TRACK_TYPE_LOGO     = 0x10,
   MATROSKA_TRACK_TYPE_SUBTITLE = 0x11,
+  MATROSKA_TRACK_TYPE_BUTTONS  = 0x12,
   MATROSKA_TRACK_TYPE_CONTROL  = 0x20,
   MATROSKA_TRACK_TYPE_METADATA = 0x21,
 } MatroskaTrackType;
@@ -285,13 +286,13 @@
 typedef enum {
     MATROSKA_VIDEO_INTERLACE_FLAG_UNDETERMINED = 0,
     MATROSKA_VIDEO_INTERLACE_FLAG_INTERLACED   = 1,
-    MATROSKA_VIDEO_INTERLACE_FLAG_PROGRESSIVE  = 2
+    MATROSKA_VIDEO_INTERLACE_FLAG_PROGRESSIVE  = 2,
 } MatroskaVideoInterlaceFlag;
 
 typedef enum {
     MATROSKA_VIDEO_FIELDORDER_PROGRESSIVE  = 0,
-    MATROSKA_VIDEO_FIELDORDER_UNDETERMINED = 2,
     MATROSKA_VIDEO_FIELDORDER_TT           = 1,
+    MATROSKA_VIDEO_FIELDORDER_UNDETERMINED = 2,
     MATROSKA_VIDEO_FIELDORDER_BB           = 6,
     MATROSKA_VIDEO_FIELDORDER_TB           = 9,
     MATROSKA_VIDEO_FIELDORDER_BT           = 14,
@@ -361,8 +362,6 @@
 
 extern const CodecTags ff_mkv_codec_tags[];
 extern const CodecTags ff_webm_codec_tags[];
-extern const CodecMime ff_mkv_mime_tags[];
-extern const CodecMime ff_mkv_image_mime_tags[];
 extern const AVMetadataConv ff_mkv_metadata_conv[];
 extern const char * const ff_matroska_video_stereo_mode[MATROSKA_VIDEO_STEREOMODE_TYPE_NB];
 extern const char * const ff_matroska_video_stereo_plane[MATROSKA_VIDEO_STEREO_PLANE_COUNT];
diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
index e679398..8e1326a 100644
--- a/libavformat/matroskadec.c
+++ b/libavformat/matroskadec.c
@@ -68,26 +68,37 @@
 
 #include "qtpalette.h"
 
+#define EBML_UNKNOWN_LENGTH  UINT64_MAX /* EBML unknown length, in uint64_t */
+#define NEEDS_CHECKING                2 /* Indicates that some error checks
+                                         * still need to be performed */
+#define LEVEL_ENDED                   3 /* return value of ebml_parse when the
+                                         * syntax level used for parsing ended. */
+#define SKIP_THRESHOLD      1024 * 1024 /* In non-seekable mode, if more than SKIP_THRESHOLD
+                                         * of unkown, potentially damaged data is encountered,
+                                         * it is considered an error. */
+#define UNKNOWN_EQUIV         50 * 1024 /* An unknown element is considered equivalent
+                                         * to this many bytes of unknown data for the
+                                         * SKIP_THRESHOLD check. */
+
 typedef enum {
     EBML_NONE,
     EBML_UINT,
+    EBML_SINT,
     EBML_FLOAT,
     EBML_STR,
     EBML_UTF8,
     EBML_BIN,
     EBML_NEST,
     EBML_LEVEL1,
-    EBML_PASS,
     EBML_STOP,
-    EBML_SINT,
     EBML_TYPE_COUNT
 } EbmlType;
 
 typedef const struct EbmlSyntax {
     uint32_t id;
     EbmlType type;
-    int list_elem_size;
-    int data_offset;
+    size_t list_elem_size;
+    size_t data_offset;
     union {
         int64_t     i;
         uint64_t    u;
@@ -99,6 +110,7 @@
 
 typedef struct EbmlList {
     int nb_elem;
+    unsigned int alloc_elem_size;
     void *elem;
 } EbmlList;
 
@@ -178,7 +190,7 @@
     uint64_t display_height;
     uint64_t pixel_width;
     uint64_t pixel_height;
-    EbmlBin color_space;
+    EbmlBin  color_space;
     uint64_t display_unit;
     uint64_t interlaced;
     uint64_t field_order;
@@ -302,14 +314,25 @@
     uint64_t length;
 } MatroskaLevel;
 
+typedef struct MatroskaBlock {
+    uint64_t duration;
+    int64_t  reference;
+    uint64_t non_simple;
+    EbmlBin  bin;
+    uint64_t additional_id;
+    EbmlBin  additional;
+    int64_t  discard_padding;
+} MatroskaBlock;
+
 typedef struct MatroskaCluster {
+    MatroskaBlock block;
     uint64_t timecode;
-    EbmlList blocks;
+    int64_t pos;
 } MatroskaCluster;
 
 typedef struct MatroskaLevel1Element {
-    uint64_t id;
-    uint64_t pos;
+    int64_t  pos;
+    uint32_t id;
     int parsed;
 } MatroskaLevel1Element;
 
@@ -318,16 +341,17 @@
     AVFormatContext *ctx;
 
     /* EBML stuff */
-    int num_levels;
     MatroskaLevel levels[EBML_MAX_DEPTH];
-    int level_up;
+    int      num_levels;
     uint32_t current_id;
+    int64_t  resync_pos;
+    int      unknown_count;
 
     uint64_t time_scale;
     double   duration;
     char    *title;
     char    *muxingapp;
-    EbmlBin date_utc;
+    EbmlBin  date_utc;
     EbmlList tracks;
     EbmlList attachments;
     EbmlList chapters;
@@ -355,13 +379,8 @@
     MatroskaLevel1Element level1_elems[64];
     int num_level1_elems;
 
-    int current_cluster_num_blocks;
-    int64_t current_cluster_pos;
     MatroskaCluster current_cluster;
 
-    /* File has SSA subtitles which prevent incremental cluster parsing. */
-    int contains_ssa;
-
     /* WebM DASH Manifest live flag */
     int is_live;
 
@@ -369,17 +388,20 @@
     int bandwidth;
 } MatroskaDemuxContext;
 
-typedef struct MatroskaBlock {
-    uint64_t duration;
-    int64_t  reference;
-    uint64_t non_simple;
-    EbmlBin  bin;
-    uint64_t additional_id;
-    EbmlBin  additional;
-    int64_t discard_padding;
-} MatroskaBlock;
+#define CHILD_OF(parent) { .def = { .n = parent } }
 
-static const EbmlSyntax ebml_header[] = {
+// The following forward declarations need their size because
+// a tentative definition with internal linkage must not be an
+// incomplete type (6.7.2 in C90, 6.9.2 in C99).
+// Removing the sizes breaks MSVC.
+static EbmlSyntax ebml_syntax[3], matroska_segment[9], matroska_track_video_color[15], matroska_track_video[19],
+                  matroska_track[27], matroska_track_encoding[6], matroska_track_encodings[2],
+                  matroska_track_combine_planes[2], matroska_track_operation[2], matroska_tracks[2],
+                  matroska_attachments[2], matroska_chapter_entry[9], matroska_chapter[6], matroska_chapters[2],
+                  matroska_index_entry[3], matroska_index[2], matroska_tag[3], matroska_tags[2], matroska_seekhead[2],
+                  matroska_blockadditions[2], matroska_blockgroup[8], matroska_cluster_parsing[8];
+
+static EbmlSyntax ebml_header[] = {
     { EBML_ID_EBMLREADVERSION,    EBML_UINT, 0, offsetof(Ebml, version),         { .u = EBML_VERSION } },
     { EBML_ID_EBMLMAXSIZELENGTH,  EBML_UINT, 0, offsetof(Ebml, max_size),        { .u = 8 } },
     { EBML_ID_EBMLMAXIDLENGTH,    EBML_UINT, 0, offsetof(Ebml, id_length),       { .u = 4 } },
@@ -387,15 +409,16 @@
     { EBML_ID_DOCTYPEREADVERSION, EBML_UINT, 0, offsetof(Ebml, doctype_version), { .u = 1 } },
     { EBML_ID_EBMLVERSION,        EBML_NONE },
     { EBML_ID_DOCTYPEVERSION,     EBML_NONE },
+    CHILD_OF(ebml_syntax)
+};
+
+static EbmlSyntax ebml_syntax[] = {
+    { EBML_ID_HEADER,      EBML_NEST, 0, 0, { .n = ebml_header } },
+    { MATROSKA_ID_SEGMENT, EBML_STOP },
     { 0 }
 };
 
-static const EbmlSyntax ebml_syntax[] = {
-    { EBML_ID_HEADER, EBML_NEST, 0, 0, { .n = ebml_header } },
-    { 0 }
-};
-
-static const EbmlSyntax matroska_info[] = {
+static EbmlSyntax matroska_info[] = {
     { MATROSKA_ID_TIMECODESCALE, EBML_UINT,  0, offsetof(MatroskaDemuxContext, time_scale), { .u = 1000000 } },
     { MATROSKA_ID_DURATION,      EBML_FLOAT, 0, offsetof(MatroskaDemuxContext, duration) },
     { MATROSKA_ID_TITLE,         EBML_UTF8,  0, offsetof(MatroskaDemuxContext, title) },
@@ -403,10 +426,10 @@
     { MATROSKA_ID_MUXINGAPP,     EBML_UTF8, 0, offsetof(MatroskaDemuxContext, muxingapp) },
     { MATROSKA_ID_DATEUTC,       EBML_BIN,  0, offsetof(MatroskaDemuxContext, date_utc) },
     { MATROSKA_ID_SEGMENTUID,    EBML_NONE },
-    { 0 }
+    CHILD_OF(matroska_segment)
 };
 
-static const EbmlSyntax matroska_mastering_meta[] = {
+static EbmlSyntax matroska_mastering_meta[] = {
     { MATROSKA_ID_VIDEOCOLOR_RX, EBML_FLOAT, 0, offsetof(MatroskaMasteringMeta, r_x), { .f=-1 } },
     { MATROSKA_ID_VIDEOCOLOR_RY, EBML_FLOAT, 0, offsetof(MatroskaMasteringMeta, r_y), { .f=-1 } },
     { MATROSKA_ID_VIDEOCOLOR_GX, EBML_FLOAT, 0, offsetof(MatroskaMasteringMeta, g_x), { .f=-1 } },
@@ -417,10 +440,10 @@
     { MATROSKA_ID_VIDEOCOLOR_WHITEY, EBML_FLOAT, 0, offsetof(MatroskaMasteringMeta, white_y), { .f=-1 } },
     { MATROSKA_ID_VIDEOCOLOR_LUMINANCEMIN, EBML_FLOAT, 0, offsetof(MatroskaMasteringMeta, min_luminance), { .f=-1 } },
     { MATROSKA_ID_VIDEOCOLOR_LUMINANCEMAX, EBML_FLOAT, 0, offsetof(MatroskaMasteringMeta, max_luminance), { .f=-1 } },
-    { 0 }
+    CHILD_OF(matroska_track_video_color)
 };
 
-static const EbmlSyntax matroska_track_video_color[] = {
+static EbmlSyntax matroska_track_video_color[] = {
     { MATROSKA_ID_VIDEOCOLORMATRIXCOEFF,      EBML_UINT, 0, offsetof(MatroskaTrackVideoColor, matrix_coefficients), { .u = AVCOL_SPC_UNSPECIFIED } },
     { MATROSKA_ID_VIDEOCOLORBITSPERCHANNEL,   EBML_UINT, 0, offsetof(MatroskaTrackVideoColor, bits_per_channel), { .u=0 } },
     { MATROSKA_ID_VIDEOCOLORCHROMASUBHORZ,    EBML_UINT, 0, offsetof(MatroskaTrackVideoColor, chroma_sub_horz), { .u=0 } },
@@ -435,19 +458,19 @@
     { MATROSKA_ID_VIDEOCOLORMAXCLL,           EBML_UINT, 0, offsetof(MatroskaTrackVideoColor, max_cll), { .u=0 } },
     { MATROSKA_ID_VIDEOCOLORMAXFALL,          EBML_UINT, 0, offsetof(MatroskaTrackVideoColor, max_fall), { .u=0 } },
     { MATROSKA_ID_VIDEOCOLORMASTERINGMETA,    EBML_NEST, 0, offsetof(MatroskaTrackVideoColor, mastering_meta), { .n = matroska_mastering_meta } },
-    { 0 }
+    CHILD_OF(matroska_track_video)
 };
 
-static const EbmlSyntax matroska_track_video_projection[] = {
+static EbmlSyntax matroska_track_video_projection[] = {
     { MATROSKA_ID_VIDEOPROJECTIONTYPE,        EBML_UINT,  0, offsetof(MatroskaTrackVideoProjection, type), { .u = MATROSKA_VIDEO_PROJECTION_TYPE_RECTANGULAR } },
     { MATROSKA_ID_VIDEOPROJECTIONPRIVATE,     EBML_BIN,   0, offsetof(MatroskaTrackVideoProjection, private) },
     { MATROSKA_ID_VIDEOPROJECTIONPOSEYAW,     EBML_FLOAT, 0, offsetof(MatroskaTrackVideoProjection, yaw), { .f=0.0 } },
     { MATROSKA_ID_VIDEOPROJECTIONPOSEPITCH,   EBML_FLOAT, 0, offsetof(MatroskaTrackVideoProjection, pitch), { .f=0.0 } },
     { MATROSKA_ID_VIDEOPROJECTIONPOSEROLL,    EBML_FLOAT, 0, offsetof(MatroskaTrackVideoProjection, roll), { .f=0.0 } },
-    { 0 }
+    CHILD_OF(matroska_track_video)
 };
 
-static const EbmlSyntax matroska_track_video[] = {
+static EbmlSyntax matroska_track_video[] = {
     { MATROSKA_ID_VIDEOFRAMERATE,      EBML_FLOAT, 0, offsetof(MatroskaTrackVideo, frame_rate) },
     { MATROSKA_ID_VIDEODISPLAYWIDTH,   EBML_UINT,  0, offsetof(MatroskaTrackVideo, display_width), { .u=-1 } },
     { MATROSKA_ID_VIDEODISPLAYHEIGHT,  EBML_UINT,  0, offsetof(MatroskaTrackVideo, display_height), { .u=-1 } },
@@ -466,24 +489,24 @@
     { MATROSKA_ID_VIDEOFIELDORDER,     EBML_UINT,  0, offsetof(MatroskaTrackVideo, field_order), { .u = MATROSKA_VIDEO_FIELDORDER_UNDETERMINED } },
     { MATROSKA_ID_VIDEOSTEREOMODE,     EBML_UINT,  0, offsetof(MatroskaTrackVideo, stereo_mode), { .u = MATROSKA_VIDEO_STEREOMODE_TYPE_NB } },
     { MATROSKA_ID_VIDEOASPECTRATIO,    EBML_NONE },
-    { 0 }
+    CHILD_OF(matroska_track)
 };
 
-static const EbmlSyntax matroska_track_audio[] = {
+static EbmlSyntax matroska_track_audio[] = {
     { MATROSKA_ID_AUDIOSAMPLINGFREQ,    EBML_FLOAT, 0, offsetof(MatroskaTrackAudio, samplerate), { .f = 8000.0 } },
     { MATROSKA_ID_AUDIOOUTSAMPLINGFREQ, EBML_FLOAT, 0, offsetof(MatroskaTrackAudio, out_samplerate) },
     { MATROSKA_ID_AUDIOBITDEPTH,        EBML_UINT,  0, offsetof(MatroskaTrackAudio, bitdepth) },
     { MATROSKA_ID_AUDIOCHANNELS,        EBML_UINT,  0, offsetof(MatroskaTrackAudio, channels),   { .u = 1 } },
-    { 0 }
+    CHILD_OF(matroska_track)
 };
 
-static const EbmlSyntax matroska_track_encoding_compression[] = {
+static EbmlSyntax matroska_track_encoding_compression[] = {
     { MATROSKA_ID_ENCODINGCOMPALGO,     EBML_UINT, 0, offsetof(MatroskaTrackCompression, algo), { .u = 0 } },
     { MATROSKA_ID_ENCODINGCOMPSETTINGS, EBML_BIN,  0, offsetof(MatroskaTrackCompression, settings) },
-    { 0 }
+    CHILD_OF(matroska_track_encoding)
 };
 
-static const EbmlSyntax matroska_track_encoding_encryption[] = {
+static EbmlSyntax matroska_track_encoding_encryption[] = {
     { MATROSKA_ID_ENCODINGENCALGO,        EBML_UINT, 0, offsetof(MatroskaTrackEncryption,algo), {.u = 0} },
     { MATROSKA_ID_ENCODINGENCKEYID,       EBML_BIN, 0, offsetof(MatroskaTrackEncryption,key_id) },
     { MATROSKA_ID_ENCODINGENCAESSETTINGS, EBML_NONE },
@@ -491,39 +514,39 @@
     { MATROSKA_ID_ENCODINGSIGHASHALGO,    EBML_NONE },
     { MATROSKA_ID_ENCODINGSIGKEYID,       EBML_NONE },
     { MATROSKA_ID_ENCODINGSIGNATURE,      EBML_NONE },
-    { 0 }
+    CHILD_OF(matroska_track_encoding)
 };
-static const EbmlSyntax matroska_track_encoding[] = {
+static EbmlSyntax matroska_track_encoding[] = {
     { MATROSKA_ID_ENCODINGSCOPE,       EBML_UINT, 0, offsetof(MatroskaTrackEncoding, scope),       { .u = 1 } },
     { MATROSKA_ID_ENCODINGTYPE,        EBML_UINT, 0, offsetof(MatroskaTrackEncoding, type),        { .u = 0 } },
     { MATROSKA_ID_ENCODINGCOMPRESSION, EBML_NEST, 0, offsetof(MatroskaTrackEncoding, compression), { .n = matroska_track_encoding_compression } },
     { MATROSKA_ID_ENCODINGENCRYPTION,  EBML_NEST, 0, offsetof(MatroskaTrackEncoding, encryption),  { .n = matroska_track_encoding_encryption } },
     { MATROSKA_ID_ENCODINGORDER,       EBML_NONE },
-    { 0 }
+    CHILD_OF(matroska_track_encodings)
 };
 
-static const EbmlSyntax matroska_track_encodings[] = {
+static EbmlSyntax matroska_track_encodings[] = {
     { MATROSKA_ID_TRACKCONTENTENCODING, EBML_NEST, sizeof(MatroskaTrackEncoding), offsetof(MatroskaTrack, encodings), { .n = matroska_track_encoding } },
-    { 0 }
+    CHILD_OF(matroska_track)
 };
 
-static const EbmlSyntax matroska_track_plane[] = {
+static EbmlSyntax matroska_track_plane[] = {
     { MATROSKA_ID_TRACKPLANEUID,  EBML_UINT, 0, offsetof(MatroskaTrackPlane,uid) },
     { MATROSKA_ID_TRACKPLANETYPE, EBML_UINT, 0, offsetof(MatroskaTrackPlane,type) },
-    { 0 }
+    CHILD_OF(matroska_track_combine_planes)
 };
 
-static const EbmlSyntax matroska_track_combine_planes[] = {
+static EbmlSyntax matroska_track_combine_planes[] = {
     { MATROSKA_ID_TRACKPLANE, EBML_NEST, sizeof(MatroskaTrackPlane), offsetof(MatroskaTrackOperation,combine_planes), {.n = matroska_track_plane} },
-    { 0 }
+    CHILD_OF(matroska_track_operation)
 };
 
-static const EbmlSyntax matroska_track_operation[] = {
+static EbmlSyntax matroska_track_operation[] = {
     { MATROSKA_ID_TRACKCOMBINEPLANES, EBML_NEST, 0, 0, {.n = matroska_track_combine_planes} },
-    { 0 }
+    CHILD_OF(matroska_track)
 };
 
-static const EbmlSyntax matroska_track[] = {
+static EbmlSyntax matroska_track[] = {
     { MATROSKA_ID_TRACKNUMBER,           EBML_UINT,  0, offsetof(MatroskaTrack, num) },
     { MATROSKA_ID_TRACKNAME,             EBML_UTF8,  0, offsetof(MatroskaTrack, name) },
     { MATROSKA_ID_TRACKUID,              EBML_UINT,  0, offsetof(MatroskaTrack, uid) },
@@ -531,7 +554,7 @@
     { MATROSKA_ID_CODECID,               EBML_STR,   0, offsetof(MatroskaTrack, codec_id) },
     { MATROSKA_ID_CODECPRIVATE,          EBML_BIN,   0, offsetof(MatroskaTrack, codec_priv) },
     { MATROSKA_ID_CODECDELAY,            EBML_UINT,  0, offsetof(MatroskaTrack, codec_delay) },
-    { MATROSKA_ID_TRACKLANGUAGE,         EBML_UTF8,  0, offsetof(MatroskaTrack, language),     { .s = "eng" } },
+    { MATROSKA_ID_TRACKLANGUAGE,         EBML_STR,   0, offsetof(MatroskaTrack, language),     { .s = "eng" } },
     { MATROSKA_ID_TRACKDEFAULTDURATION,  EBML_UINT,  0, offsetof(MatroskaTrack, default_duration) },
     { MATROSKA_ID_TRACKTIMECODESCALE,    EBML_FLOAT, 0, offsetof(MatroskaTrack, time_scale),   { .f = 1.0 } },
     { MATROSKA_ID_TRACKFLAGDEFAULT,      EBML_UINT,  0, offsetof(MatroskaTrack, flag_default), { .u = 1 } },
@@ -550,36 +573,36 @@
     { MATROSKA_ID_CODECDOWNLOADURL,      EBML_NONE },
     { MATROSKA_ID_TRACKMINCACHE,         EBML_NONE },
     { MATROSKA_ID_TRACKMAXCACHE,         EBML_NONE },
-    { 0 }
+    CHILD_OF(matroska_tracks)
 };
 
-static const EbmlSyntax matroska_tracks[] = {
+static EbmlSyntax matroska_tracks[] = {
     { MATROSKA_ID_TRACKENTRY, EBML_NEST, sizeof(MatroskaTrack), offsetof(MatroskaDemuxContext, tracks), { .n = matroska_track } },
-    { 0 }
+    CHILD_OF(matroska_segment)
 };
 
-static const EbmlSyntax matroska_attachment[] = {
+static EbmlSyntax matroska_attachment[] = {
     { MATROSKA_ID_FILEUID,      EBML_UINT, 0, offsetof(MatroskaAttachment, uid) },
     { MATROSKA_ID_FILENAME,     EBML_UTF8, 0, offsetof(MatroskaAttachment, filename) },
     { MATROSKA_ID_FILEMIMETYPE, EBML_STR,  0, offsetof(MatroskaAttachment, mime) },
     { MATROSKA_ID_FILEDATA,     EBML_BIN,  0, offsetof(MatroskaAttachment, bin) },
     { MATROSKA_ID_FILEDESC,     EBML_NONE },
-    { 0 }
+    CHILD_OF(matroska_attachments)
 };
 
-static const EbmlSyntax matroska_attachments[] = {
+static EbmlSyntax matroska_attachments[] = {
     { MATROSKA_ID_ATTACHEDFILE, EBML_NEST, sizeof(MatroskaAttachment), offsetof(MatroskaDemuxContext, attachments), { .n = matroska_attachment } },
-    { 0 }
+    CHILD_OF(matroska_segment)
 };
 
-static const EbmlSyntax matroska_chapter_display[] = {
+static EbmlSyntax matroska_chapter_display[] = {
     { MATROSKA_ID_CHAPSTRING,  EBML_UTF8, 0, offsetof(MatroskaChapter, title) },
     { MATROSKA_ID_CHAPLANG,    EBML_NONE },
     { MATROSKA_ID_CHAPCOUNTRY, EBML_NONE },
-    { 0 }
+    CHILD_OF(matroska_chapter_entry)
 };
 
-static const EbmlSyntax matroska_chapter_entry[] = {
+static EbmlSyntax matroska_chapter_entry[] = {
     { MATROSKA_ID_CHAPTERTIMESTART,   EBML_UINT, 0, offsetof(MatroskaChapter, start), { .u = AV_NOPTS_VALUE } },
     { MATROSKA_ID_CHAPTERTIMEEND,     EBML_UINT, 0, offsetof(MatroskaChapter, end),   { .u = AV_NOPTS_VALUE } },
     { MATROSKA_ID_CHAPTERUID,         EBML_UINT, 0, offsetof(MatroskaChapter, uid) },
@@ -588,85 +611,86 @@
     { MATROSKA_ID_CHAPTERFLAGENABLED, EBML_NONE },
     { MATROSKA_ID_CHAPTERPHYSEQUIV,   EBML_NONE },
     { MATROSKA_ID_CHAPTERATOM,        EBML_NONE },
-    { 0 }
+    CHILD_OF(matroska_chapter)
 };
 
-static const EbmlSyntax matroska_chapter[] = {
+static EbmlSyntax matroska_chapter[] = {
     { MATROSKA_ID_CHAPTERATOM,        EBML_NEST, sizeof(MatroskaChapter), offsetof(MatroskaDemuxContext, chapters), { .n = matroska_chapter_entry } },
     { MATROSKA_ID_EDITIONUID,         EBML_NONE },
     { MATROSKA_ID_EDITIONFLAGHIDDEN,  EBML_NONE },
     { MATROSKA_ID_EDITIONFLAGDEFAULT, EBML_NONE },
     { MATROSKA_ID_EDITIONFLAGORDERED, EBML_NONE },
-    { 0 }
+    CHILD_OF(matroska_chapters)
 };
 
-static const EbmlSyntax matroska_chapters[] = {
+static EbmlSyntax matroska_chapters[] = {
     { MATROSKA_ID_EDITIONENTRY, EBML_NEST, 0, 0, { .n = matroska_chapter } },
-    { 0 }
+    CHILD_OF(matroska_segment)
 };
 
-static const EbmlSyntax matroska_index_pos[] = {
+static EbmlSyntax matroska_index_pos[] = {
     { MATROSKA_ID_CUETRACK,           EBML_UINT, 0, offsetof(MatroskaIndexPos, track) },
     { MATROSKA_ID_CUECLUSTERPOSITION, EBML_UINT, 0, offsetof(MatroskaIndexPos, pos) },
     { MATROSKA_ID_CUERELATIVEPOSITION,EBML_NONE },
     { MATROSKA_ID_CUEDURATION,        EBML_NONE },
     { MATROSKA_ID_CUEBLOCKNUMBER,     EBML_NONE },
-    { 0 }
+    CHILD_OF(matroska_index_entry)
 };
 
-static const EbmlSyntax matroska_index_entry[] = {
+static EbmlSyntax matroska_index_entry[] = {
     { MATROSKA_ID_CUETIME,          EBML_UINT, 0,                        offsetof(MatroskaIndex, time) },
     { MATROSKA_ID_CUETRACKPOSITION, EBML_NEST, sizeof(MatroskaIndexPos), offsetof(MatroskaIndex, pos), { .n = matroska_index_pos } },
-    { 0 }
+    CHILD_OF(matroska_index)
 };
 
-static const EbmlSyntax matroska_index[] = {
+static EbmlSyntax matroska_index[] = {
     { MATROSKA_ID_POINTENTRY, EBML_NEST, sizeof(MatroskaIndex), offsetof(MatroskaDemuxContext, index), { .n = matroska_index_entry } },
-    { 0 }
+    CHILD_OF(matroska_segment)
 };
 
-static const EbmlSyntax matroska_simpletag[] = {
+static EbmlSyntax matroska_simpletag[] = {
     { MATROSKA_ID_TAGNAME,        EBML_UTF8, 0,                   offsetof(MatroskaTag, name) },
     { MATROSKA_ID_TAGSTRING,      EBML_UTF8, 0,                   offsetof(MatroskaTag, string) },
     { MATROSKA_ID_TAGLANG,        EBML_STR,  0,                   offsetof(MatroskaTag, lang), { .s = "und" } },
     { MATROSKA_ID_TAGDEFAULT,     EBML_UINT, 0,                   offsetof(MatroskaTag, def) },
     { MATROSKA_ID_TAGDEFAULT_BUG, EBML_UINT, 0,                   offsetof(MatroskaTag, def) },
     { MATROSKA_ID_SIMPLETAG,      EBML_NEST, sizeof(MatroskaTag), offsetof(MatroskaTag, sub),  { .n = matroska_simpletag } },
-    { 0 }
+    CHILD_OF(matroska_tag)
 };
 
-static const EbmlSyntax matroska_tagtargets[] = {
+static EbmlSyntax matroska_tagtargets[] = {
     { MATROSKA_ID_TAGTARGETS_TYPE,       EBML_STR,  0, offsetof(MatroskaTagTarget, type) },
     { MATROSKA_ID_TAGTARGETS_TYPEVALUE,  EBML_UINT, 0, offsetof(MatroskaTagTarget, typevalue), { .u = 50 } },
     { MATROSKA_ID_TAGTARGETS_TRACKUID,   EBML_UINT, 0, offsetof(MatroskaTagTarget, trackuid) },
     { MATROSKA_ID_TAGTARGETS_CHAPTERUID, EBML_UINT, 0, offsetof(MatroskaTagTarget, chapteruid) },
     { MATROSKA_ID_TAGTARGETS_ATTACHUID,  EBML_UINT, 0, offsetof(MatroskaTagTarget, attachuid) },
-    { 0 }
+    CHILD_OF(matroska_tag)
 };
 
-static const EbmlSyntax matroska_tag[] = {
+static EbmlSyntax matroska_tag[] = {
     { MATROSKA_ID_SIMPLETAG,  EBML_NEST, sizeof(MatroskaTag), offsetof(MatroskaTags, tag),    { .n = matroska_simpletag } },
     { MATROSKA_ID_TAGTARGETS, EBML_NEST, 0,                   offsetof(MatroskaTags, target), { .n = matroska_tagtargets } },
-    { 0 }
+    CHILD_OF(matroska_tags)
 };
 
-static const EbmlSyntax matroska_tags[] = {
+static EbmlSyntax matroska_tags[] = {
     { MATROSKA_ID_TAG, EBML_NEST, sizeof(MatroskaTags), offsetof(MatroskaDemuxContext, tags), { .n = matroska_tag } },
-    { 0 }
+    CHILD_OF(matroska_segment)
 };
 
-static const EbmlSyntax matroska_seekhead_entry[] = {
+static EbmlSyntax matroska_seekhead_entry[] = {
     { MATROSKA_ID_SEEKID,       EBML_UINT, 0, offsetof(MatroskaSeekhead, id) },
     { MATROSKA_ID_SEEKPOSITION, EBML_UINT, 0, offsetof(MatroskaSeekhead, pos), { .u = -1 } },
-    { 0 }
+    CHILD_OF(matroska_seekhead)
 };
 
-static const EbmlSyntax matroska_seekhead[] = {
+static EbmlSyntax matroska_seekhead[] = {
     { MATROSKA_ID_SEEKENTRY, EBML_NEST, sizeof(MatroskaSeekhead), offsetof(MatroskaDemuxContext, seekhead), { .n = matroska_seekhead_entry } },
-    { 0 }
+    CHILD_OF(matroska_segment)
 };
 
-static const EbmlSyntax matroska_segment[] = {
+static EbmlSyntax matroska_segment[] = {
+    { MATROSKA_ID_CLUSTER,     EBML_STOP },
     { MATROSKA_ID_INFO,        EBML_LEVEL1, 0, 0, { .n = matroska_info } },
     { MATROSKA_ID_TRACKS,      EBML_LEVEL1, 0, 0, { .n = matroska_tracks } },
     { MATROSKA_ID_ATTACHMENTS, EBML_LEVEL1, 0, 0, { .n = matroska_attachments } },
@@ -674,104 +698,113 @@
     { MATROSKA_ID_CUES,        EBML_LEVEL1, 0, 0, { .n = matroska_index } },
     { MATROSKA_ID_TAGS,        EBML_LEVEL1, 0, 0, { .n = matroska_tags } },
     { MATROSKA_ID_SEEKHEAD,    EBML_LEVEL1, 0, 0, { .n = matroska_seekhead } },
-    { MATROSKA_ID_CLUSTER,     EBML_STOP },
-    { 0 }
+    { 0 }   /* We don't want to go back to level 0, so don't add the parent. */
 };
 
-static const EbmlSyntax matroska_segments[] = {
+static EbmlSyntax matroska_segments[] = {
     { MATROSKA_ID_SEGMENT, EBML_NEST, 0, 0, { .n = matroska_segment } },
     { 0 }
 };
 
-static const EbmlSyntax matroska_blockmore[] = {
-    { MATROSKA_ID_BLOCKADDID,      EBML_UINT, 0, offsetof(MatroskaBlock,additional_id) },
+static EbmlSyntax matroska_blockmore[] = {
+    { MATROSKA_ID_BLOCKADDID,      EBML_UINT, 0, offsetof(MatroskaBlock,additional_id), { .u = 1 } },
     { MATROSKA_ID_BLOCKADDITIONAL, EBML_BIN,  0, offsetof(MatroskaBlock,additional) },
-    { 0 }
+    CHILD_OF(matroska_blockadditions)
 };
 
-static const EbmlSyntax matroska_blockadditions[] = {
+static EbmlSyntax matroska_blockadditions[] = {
     { MATROSKA_ID_BLOCKMORE, EBML_NEST, 0, 0, {.n = matroska_blockmore} },
-    { 0 }
+    CHILD_OF(matroska_blockgroup)
 };
 
-static const EbmlSyntax matroska_blockgroup[] = {
+static EbmlSyntax matroska_blockgroup[] = {
     { MATROSKA_ID_BLOCK,          EBML_BIN,  0, offsetof(MatroskaBlock, bin) },
     { MATROSKA_ID_BLOCKADDITIONS, EBML_NEST, 0, 0, { .n = matroska_blockadditions} },
-    { MATROSKA_ID_SIMPLEBLOCK,    EBML_BIN,  0, offsetof(MatroskaBlock, bin) },
     { MATROSKA_ID_BLOCKDURATION,  EBML_UINT, 0, offsetof(MatroskaBlock, duration) },
     { MATROSKA_ID_DISCARDPADDING, EBML_SINT, 0, offsetof(MatroskaBlock, discard_padding) },
     { MATROSKA_ID_BLOCKREFERENCE, EBML_SINT, 0, offsetof(MatroskaBlock, reference), { .i = INT64_MIN } },
     { MATROSKA_ID_CODECSTATE,     EBML_NONE },
     {                          1, EBML_UINT, 0, offsetof(MatroskaBlock, non_simple), { .u = 1 } },
-    { 0 }
+    CHILD_OF(matroska_cluster_parsing)
 };
 
-static const EbmlSyntax matroska_cluster[] = {
-    { MATROSKA_ID_CLUSTERTIMECODE, EBML_UINT, 0,                     offsetof(MatroskaCluster, timecode) },
-    { MATROSKA_ID_BLOCKGROUP,      EBML_NEST, sizeof(MatroskaBlock), offsetof(MatroskaCluster, blocks), { .n = matroska_blockgroup } },
-    { MATROSKA_ID_SIMPLEBLOCK,     EBML_PASS, sizeof(MatroskaBlock), offsetof(MatroskaCluster, blocks), { .n = matroska_blockgroup } },
-    { MATROSKA_ID_CLUSTERPOSITION, EBML_NONE },
-    { MATROSKA_ID_CLUSTERPREVSIZE, EBML_NONE },
-    { 0 }
-};
-
-static const EbmlSyntax matroska_clusters[] = {
-    { MATROSKA_ID_CLUSTER,  EBML_NEST, 0, 0, { .n = matroska_cluster } },
-    { MATROSKA_ID_INFO,     EBML_NONE },
-    { MATROSKA_ID_CUES,     EBML_NONE },
-    { MATROSKA_ID_TAGS,     EBML_NONE },
-    { MATROSKA_ID_SEEKHEAD, EBML_NONE },
-    { 0 }
-};
-
-static const EbmlSyntax matroska_cluster_incremental_parsing[] = {
-    { MATROSKA_ID_CLUSTERTIMECODE, EBML_UINT, 0,                     offsetof(MatroskaCluster, timecode) },
-    { MATROSKA_ID_BLOCKGROUP,      EBML_NEST, sizeof(MatroskaBlock), offsetof(MatroskaCluster, blocks), { .n = matroska_blockgroup } },
-    { MATROSKA_ID_SIMPLEBLOCK,     EBML_PASS, sizeof(MatroskaBlock), offsetof(MatroskaCluster, blocks), { .n = matroska_blockgroup } },
-    { MATROSKA_ID_CLUSTERPOSITION, EBML_NONE },
-    { MATROSKA_ID_CLUSTERPREVSIZE, EBML_NONE },
-    { MATROSKA_ID_INFO,            EBML_NONE },
-    { MATROSKA_ID_CUES,            EBML_NONE },
-    { MATROSKA_ID_TAGS,            EBML_NONE },
-    { MATROSKA_ID_SEEKHEAD,        EBML_NONE },
-    { MATROSKA_ID_CLUSTER,         EBML_STOP },
-    { 0 }
-};
-
-static const EbmlSyntax matroska_cluster_incremental[] = {
+// The following array contains SimpleBlock and BlockGroup twice
+// in order to reuse the other values for matroska_cluster_enter.
+static EbmlSyntax matroska_cluster_parsing[] = {
+    { MATROSKA_ID_SIMPLEBLOCK,     EBML_BIN,  0, offsetof(MatroskaBlock, bin) },
+    { MATROSKA_ID_BLOCKGROUP,      EBML_NEST, 0, 0, { .n = matroska_blockgroup } },
     { MATROSKA_ID_CLUSTERTIMECODE, EBML_UINT, 0, offsetof(MatroskaCluster, timecode) },
-    { MATROSKA_ID_BLOCKGROUP,      EBML_STOP },
     { MATROSKA_ID_SIMPLEBLOCK,     EBML_STOP },
+    { MATROSKA_ID_BLOCKGROUP,      EBML_STOP },
     { MATROSKA_ID_CLUSTERPOSITION, EBML_NONE },
     { MATROSKA_ID_CLUSTERPREVSIZE, EBML_NONE },
-    { 0 }
+    CHILD_OF(matroska_segment)
 };
 
-static const EbmlSyntax matroska_clusters_incremental[] = {
-    { MATROSKA_ID_CLUSTER,  EBML_NEST, 0, 0, { .n = matroska_cluster_incremental } },
-    { MATROSKA_ID_INFO,     EBML_NONE },
-    { MATROSKA_ID_CUES,     EBML_NONE },
-    { MATROSKA_ID_TAGS,     EBML_NONE },
-    { MATROSKA_ID_SEEKHEAD, EBML_NONE },
+static EbmlSyntax matroska_cluster_enter[] = {
+    { MATROSKA_ID_CLUSTER,     EBML_NEST, 0, 0, { .n = &matroska_cluster_parsing[2] } },
     { 0 }
 };
+#undef CHILD_OF
+
+static const CodecMime mkv_image_mime_tags[] = {
+    {"image/gif"                  , AV_CODEC_ID_GIF},
+    {"image/jpeg"                 , AV_CODEC_ID_MJPEG},
+    {"image/png"                  , AV_CODEC_ID_PNG},
+    {"image/tiff"                 , AV_CODEC_ID_TIFF},
+
+    {""                           , AV_CODEC_ID_NONE}
+};
+
+static const CodecMime mkv_mime_tags[] = {
+    {"text/plain"                 , AV_CODEC_ID_TEXT},
+    {"application/x-truetype-font", AV_CODEC_ID_TTF},
+    {"application/x-font"         , AV_CODEC_ID_TTF},
+    {"application/vnd.ms-opentype", AV_CODEC_ID_OTF},
+    {"binary"                     , AV_CODEC_ID_BIN_DATA},
+
+    {""                           , AV_CODEC_ID_NONE}
+};
 
 static const char *const matroska_doctypes[] = { "matroska", "webm" };
 
 static int matroska_read_close(AVFormatContext *s);
 
+/*
+ * This function prepares the status for parsing of level 1 elements.
+ */
+static int matroska_reset_status(MatroskaDemuxContext *matroska,
+                                 uint32_t id, int64_t position)
+{
+    if (position >= 0) {
+        int64_t err = avio_seek(matroska->ctx->pb, position, SEEK_SET);
+        if (err < 0)
+            return err;
+    }
+
+    matroska->current_id    = id;
+    matroska->num_levels    = 1;
+    matroska->unknown_count = 0;
+    matroska->resync_pos = avio_tell(matroska->ctx->pb);
+    if (id)
+        matroska->resync_pos -= (av_log2(id) + 7) / 8;
+
+    return 0;
+}
+
 static int matroska_resync(MatroskaDemuxContext *matroska, int64_t last_pos)
 {
     AVIOContext *pb = matroska->ctx->pb;
-    int64_t ret;
     uint32_t id;
-    matroska->current_id = 0;
-    matroska->num_levels = 0;
 
-    /* seek to next position to resync from */
-    if ((ret = avio_seek(pb, last_pos + 1, SEEK_SET)) < 0) {
-        matroska->done = 1;
-        return ret;
+    /* Try to seek to the last position to resync from. If this doesn't work,
+     * we resync from the earliest position available: The start of the buffer. */
+    if (last_pos < avio_tell(pb) && avio_seek(pb, last_pos + 1, SEEK_SET) < 0) {
+        av_log(matroska->ctx, AV_LOG_WARNING,
+               "Seek to desired resync point failed. Seeking to "
+               "earliest point available instead.\n");
+        avio_seek(pb, FFMAX(avio_tell(pb) + (pb->buffer - pb->buf_ptr),
+                            last_pos + 1), SEEK_SET);
     }
 
     id = avio_rb32(pb);
@@ -782,32 +815,20 @@
             id == MATROSKA_ID_CUES     || id == MATROSKA_ID_TAGS        ||
             id == MATROSKA_ID_SEEKHEAD || id == MATROSKA_ID_ATTACHMENTS ||
             id == MATROSKA_ID_CLUSTER  || id == MATROSKA_ID_CHAPTERS) {
-            matroska->current_id = id;
+            /* Prepare the context for parsing of a level 1 element. */
+            matroska_reset_status(matroska, id, -1);
+            /* Given that we are here means that an error has occurred,
+             * so treat the segment as unknown length in order not to
+             * discard valid data that happens to be beyond the designated
+             * end of the segment. */
+            matroska->levels[0].length = EBML_UNKNOWN_LENGTH;
             return 0;
         }
         id = (id << 8) | avio_r8(pb);
     }
 
     matroska->done = 1;
-    return AVERROR_EOF;
-}
-
-/*
- * Return: Whether we reached the end of a level in the hierarchy or not.
- */
-static int ebml_level_end(MatroskaDemuxContext *matroska)
-{
-    AVIOContext *pb = matroska->ctx->pb;
-    int64_t pos = avio_tell(pb);
-
-    if (matroska->num_levels > 0) {
-        MatroskaLevel *level = &matroska->levels[matroska->num_levels - 1];
-        if (pos - level->start >= level->length || matroska->current_id) {
-            matroska->num_levels--;
-            return 1;
-        }
-    }
-    return (matroska->is_live && matroska->ctx->pb->eof_reached) ? 1 : 0;
+    return pb->error ? pb->error : AVERROR_EOF;
 }
 
 /*
@@ -819,33 +840,32 @@
  * Returns: number of bytes read, < 0 on error
  */
 static int ebml_read_num(MatroskaDemuxContext *matroska, AVIOContext *pb,
-                         int max_size, uint64_t *number)
+                         int max_size, uint64_t *number, int eof_forbidden)
 {
-    int read = 1, n = 1;
-    uint64_t total = 0;
+    int read, n = 1;
+    uint64_t total;
+    int64_t pos;
 
-    /* The first byte tells us the length in bytes - avio_r8() can normally
-     * return 0, but since that's not a valid first ebmlID byte, we can
-     * use it safely here to catch EOS. */
-    if (!(total = avio_r8(pb))) {
-        /* we might encounter EOS here */
-        if (!avio_feof(pb)) {
-            int64_t pos = avio_tell(pb);
-            av_log(matroska->ctx, AV_LOG_ERROR,
-                   "Read error at pos. %"PRIu64" (0x%"PRIx64")\n",
-                   pos, pos);
-            return pb->error ? pb->error : AVERROR(EIO);
-        }
-        return AVERROR_EOF;
-    }
+    /* The first byte tells us the length in bytes - except when it is zero. */
+    total = avio_r8(pb);
+    if (pb->eof_reached)
+        goto err;
 
     /* get the length of the EBML number */
     read = 8 - ff_log2_tab[total];
-    if (read > max_size) {
-        int64_t pos = avio_tell(pb) - 1;
-        av_log(matroska->ctx, AV_LOG_ERROR,
-               "Invalid EBML number size tag 0x%02x at pos %"PRIu64" (0x%"PRIx64")\n",
-               (uint8_t) total, pos, pos);
+
+    if (!total || read > max_size) {
+        pos = avio_tell(pb) - 1;
+        if (!total) {
+            av_log(matroska->ctx, AV_LOG_ERROR,
+                   "0x00 at pos %"PRId64" (0x%"PRIx64") invalid as first byte "
+                   "of an EBML number\n", pos, pos);
+        } else {
+            av_log(matroska->ctx, AV_LOG_ERROR,
+                   "Length %d indicated by an EBML number's first byte 0x%02x "
+                   "at pos %"PRId64" (0x%"PRIx64") exceeds max length %d.\n",
+                   read, (uint8_t) total, pos, pos, max_size);
+        }
         return AVERROR_INVALIDDATA;
     }
 
@@ -854,9 +874,29 @@
     while (n++ < read)
         total = (total << 8) | avio_r8(pb);
 
+    if (pb->eof_reached) {
+        eof_forbidden = 1;
+        goto err;
+    }
+
     *number = total;
 
     return read;
+
+err:
+    pos = avio_tell(pb);
+    if (pb->error) {
+        av_log(matroska->ctx, AV_LOG_ERROR,
+               "Read error at pos. %"PRIu64" (0x%"PRIx64")\n",
+               pos, pos);
+        return pb->error;
+    }
+    if (eof_forbidden) {
+        av_log(matroska->ctx, AV_LOG_ERROR, "File ended prematurely "
+               "at pos. %"PRIu64" (0x%"PRIx64")\n", pos, pos);
+        return AVERROR(EIO);
+    }
+    return AVERROR_EOF;
 }
 
 /**
@@ -867,42 +907,36 @@
 static int ebml_read_length(MatroskaDemuxContext *matroska, AVIOContext *pb,
                             uint64_t *number)
 {
-    int res = ebml_read_num(matroska, pb, 8, number);
+    int res = ebml_read_num(matroska, pb, 8, number, 1);
     if (res > 0 && *number + 1 == 1ULL << (7 * res))
-        *number = 0xffffffffffffffULL;
+        *number = EBML_UNKNOWN_LENGTH;
     return res;
 }
 
 /*
  * Read the next element as an unsigned int.
- * 0 is success, < 0 is failure.
+ * Returns NEEDS_CHECKING.
  */
 static int ebml_read_uint(AVIOContext *pb, int size, uint64_t *num)
 {
     int n = 0;
 
-    if (size > 8)
-        return AVERROR_INVALIDDATA;
-
     /* big-endian ordering; build up number */
     *num = 0;
     while (n++ < size)
         *num = (*num << 8) | avio_r8(pb);
 
-    return 0;
+    return NEEDS_CHECKING;
 }
 
 /*
  * Read the next element as a signed int.
- * 0 is success, < 0 is failure.
+ * Returns NEEDS_CHECKING.
  */
 static int ebml_read_sint(AVIOContext *pb, int size, int64_t *num)
 {
     int n = 1;
 
-    if (size > 8)
-        return AVERROR_INVALIDDATA;
-
     if (size == 0) {
         *num = 0;
     } else {
@@ -913,12 +947,12 @@
             *num = ((uint64_t)*num << 8) | avio_r8(pb);
     }
 
-    return 0;
+    return NEEDS_CHECKING;
 }
 
 /*
  * Read the next element as a float.
- * 0 is success, < 0 is failure.
+ * Returns NEEDS_CHECKING or < 0 on obvious failure.
  */
 static int ebml_read_float(AVIOContext *pb, int size, double *num)
 {
@@ -931,24 +965,25 @@
     else
         return AVERROR_INVALIDDATA;
 
-    return 0;
+    return NEEDS_CHECKING;
 }
 
 /*
  * Read the next element as an ASCII string.
- * 0 is success, < 0 is failure.
+ * 0 is success, < 0 or NEEDS_CHECKING is failure.
  */
 static int ebml_read_ascii(AVIOContext *pb, int size, char **str)
 {
     char *res;
+    int ret;
 
     /* EBML strings are usually not 0-terminated, so we allocate one
      * byte more, read the string and NULL-terminate it ourselves. */
     if (!(res = av_malloc(size + 1)))
         return AVERROR(ENOMEM);
-    if (avio_read(pb, (uint8_t *) res, size) != size) {
+    if ((ret = avio_read(pb, (uint8_t *) res, size)) != size) {
         av_free(res);
-        return AVERROR(EIO);
+        return ret < 0 ? ret : NEEDS_CHECKING;
     }
     (res)[size] = '\0';
     av_free(*str);
@@ -959,9 +994,10 @@
 
 /*
  * Read the next element as binary data.
- * 0 is success, < 0 is failure.
+ * 0 is success, < 0 or NEEDS_CHECKING is failure.
  */
-static int ebml_read_binary(AVIOContext *pb, int length, EbmlBin *bin)
+static int ebml_read_binary(AVIOContext *pb, int length,
+                            int64_t pos, EbmlBin *bin)
 {
     int ret;
 
@@ -972,12 +1008,12 @@
 
     bin->data = bin->buf->data;
     bin->size = length;
-    bin->pos  = avio_tell(pb);
-    if (avio_read(pb, bin->data, length) != length) {
+    bin->pos  = pos;
+    if ((ret = avio_read(pb, bin->data, length)) != length) {
         av_buffer_unref(&bin->buf);
         bin->data = NULL;
         bin->size = 0;
-        return AVERROR(EIO);
+        return ret < 0 ? ret : NEEDS_CHECKING;
     }
 
     return 0;
@@ -988,9 +1024,9 @@
  * are supposed to be sub-elements which can be read separately.
  * 0 is success, < 0 is failure.
  */
-static int ebml_read_master(MatroskaDemuxContext *matroska, uint64_t length)
+static int ebml_read_master(MatroskaDemuxContext *matroska,
+                            uint64_t length, int64_t pos)
 {
-    AVIOContext *pb = matroska->ctx->pb;
     MatroskaLevel *level;
 
     if (matroska->num_levels >= EBML_MAX_DEPTH) {
@@ -1000,35 +1036,24 @@
     }
 
     level         = &matroska->levels[matroska->num_levels++];
-    level->start  = avio_tell(pb);
+    level->start  = pos;
     level->length = length;
 
     return 0;
 }
 
 /*
- * Read signed/unsigned "EBML" numbers.
+ * Read a signed "EBML number"
  * Return: number of bytes processed, < 0 on error
  */
-static int matroska_ebmlnum_uint(MatroskaDemuxContext *matroska,
-                                 uint8_t *data, uint32_t size, uint64_t *num)
-{
-    AVIOContext pb;
-    ffio_init_context(&pb, data, size, 0, NULL, NULL, NULL, NULL);
-    return ebml_read_num(matroska, &pb, FFMIN(size, 8), num);
-}
-
-/*
- * Same as above, but signed.
- */
 static int matroska_ebmlnum_sint(MatroskaDemuxContext *matroska,
-                                 uint8_t *data, uint32_t size, int64_t *num)
+                                 AVIOContext *pb, int64_t *num)
 {
     uint64_t unum;
     int res;
 
     /* read as unsigned number first */
-    if ((res = matroska_ebmlnum_uint(matroska, data, size, &unum)) < 0)
+    if ((res = ebml_read_num(matroska, pb, 8, &unum, 1)) < 0)
         return res;
 
     /* make signed (weird way) */
@@ -1037,74 +1062,62 @@
     return res;
 }
 
-static int ebml_parse_elem(MatroskaDemuxContext *matroska,
-                           EbmlSyntax *syntax, void *data);
+static int ebml_parse(MatroskaDemuxContext *matroska,
+                      EbmlSyntax *syntax, void *data);
 
-static int ebml_parse_id(MatroskaDemuxContext *matroska, EbmlSyntax *syntax,
-                         uint32_t id, void *data)
+static EbmlSyntax *ebml_parse_id(EbmlSyntax *syntax, uint32_t id)
 {
     int i;
+
+    // Whoever touches this should be aware of the duplication
+    // existing in matroska_cluster_parsing.
     for (i = 0; syntax[i].id; i++)
         if (id == syntax[i].id)
             break;
-    if (!syntax[i].id && id == MATROSKA_ID_CLUSTER &&
-        matroska->num_levels > 0                   &&
-        matroska->levels[matroska->num_levels - 1].length == 0xffffffffffffff)
-        return 0;  // we reached the end of an unknown size cluster
-    if (!syntax[i].id && id != EBML_ID_VOID && id != EBML_ID_CRC32) {
-        av_log(matroska->ctx, AV_LOG_DEBUG, "Unknown entry 0x%"PRIX32"\n", id);
-    }
-    return ebml_parse_elem(matroska, &syntax[i], data);
-}
 
-static int ebml_parse(MatroskaDemuxContext *matroska, EbmlSyntax *syntax,
-                      void *data)
-{
-    if (!matroska->current_id) {
-        uint64_t id;
-        int res = ebml_read_num(matroska, matroska->ctx->pb, 4, &id);
-        if (res < 0) {
-            // in live mode, finish parsing if EOF is reached.
-            return (matroska->is_live && matroska->ctx->pb->eof_reached &&
-                    res == AVERROR_EOF) ? 1 : res;
-        }
-        matroska->current_id = id | 1 << 7 * res;
-    }
-    return ebml_parse_id(matroska, syntax, matroska->current_id, data);
+    return &syntax[i];
 }
 
 static int ebml_parse_nest(MatroskaDemuxContext *matroska, EbmlSyntax *syntax,
                            void *data)
 {
-    int i, res = 0;
+    int res;
 
-    for (i = 0; syntax[i].id; i++)
-        switch (syntax[i].type) {
-        case EBML_SINT:
-            *(int64_t *) ((char *) data + syntax[i].data_offset) = syntax[i].def.i;
-            break;
-        case EBML_UINT:
-            *(uint64_t *) ((char *) data + syntax[i].data_offset) = syntax[i].def.u;
-            break;
-        case EBML_FLOAT:
-            *(double *) ((char *) data + syntax[i].data_offset) = syntax[i].def.f;
-            break;
-        case EBML_STR:
-        case EBML_UTF8:
-            // the default may be NULL
-            if (syntax[i].def.s) {
-                uint8_t **dst = (uint8_t **) ((uint8_t *) data + syntax[i].data_offset);
-                *dst = av_strdup(syntax[i].def.s);
-                if (!*dst)
-                    return AVERROR(ENOMEM);
+    if (data) {
+        for (int i = 0; syntax[i].id; i++)
+            switch (syntax[i].type) {
+            case EBML_UINT:
+                *(uint64_t *) ((char *) data + syntax[i].data_offset) = syntax[i].def.u;
+                break;
+            case EBML_SINT:
+                *(int64_t *) ((char *) data + syntax[i].data_offset) = syntax[i].def.i;
+                break;
+            case EBML_FLOAT:
+                *(double *) ((char *) data + syntax[i].data_offset) = syntax[i].def.f;
+                break;
+            case EBML_STR:
+            case EBML_UTF8:
+                // the default may be NULL
+                if (syntax[i].def.s) {
+                    uint8_t **dst = (uint8_t **) ((uint8_t *) data + syntax[i].data_offset);
+                    *dst = av_strdup(syntax[i].def.s);
+                    if (!*dst)
+                        return AVERROR(ENOMEM);
+                }
+                break;
             }
-            break;
+
+        if (!matroska->levels[matroska->num_levels - 1].length) {
+            matroska->num_levels--;
+            return 0;
         }
+    }
 
-    while (!res && !ebml_level_end(matroska))
+    do {
         res = ebml_parse(matroska, syntax, data);
+    } while (!res);
 
-    return res;
+    return res == LEVEL_ENDED ? 0 : res;
 }
 
 static int is_ebml_id_valid(uint32_t id)
@@ -1155,11 +1168,14 @@
     return elem;
 }
 
-static int ebml_parse_elem(MatroskaDemuxContext *matroska,
-                           EbmlSyntax *syntax, void *data)
+static int ebml_parse(MatroskaDemuxContext *matroska,
+                      EbmlSyntax *syntax, void *data)
 {
     static const uint64_t max_lengths[EBML_TYPE_COUNT] = {
+        // Forbid unknown-length EBML_NONE elements.
+        [EBML_NONE]  = EBML_UNKNOWN_LENGTH - 1,
         [EBML_UINT]  = 8,
+        [EBML_SINT]  = 8,
         [EBML_FLOAT] = 8,
         // max. 16 MB for strings
         [EBML_STR]   = 0x1000000,
@@ -1169,34 +1185,200 @@
         // no limits for anything else
     };
     AVIOContext *pb = matroska->ctx->pb;
-    uint32_t id = syntax->id;
+    uint32_t id;
     uint64_t length;
-    int res;
-    void *newelem;
+    int64_t pos = avio_tell(pb), pos_alt;
+    int res, update_pos = 1, level_check;
     MatroskaLevel1Element *level1_elem;
+    MatroskaLevel *level = matroska->num_levels ? &matroska->levels[matroska->num_levels - 1] : NULL;
 
-    data = (char *) data + syntax->data_offset;
-    if (syntax->list_elem_size) {
-        EbmlList *list = data;
-        newelem = av_realloc_array(list->elem, list->nb_elem + 1, syntax->list_elem_size);
-        if (!newelem)
-            return AVERROR(ENOMEM);
-        list->elem = newelem;
-        data = (char *) list->elem + list->nb_elem * syntax->list_elem_size;
-        memset(data, 0, syntax->list_elem_size);
-        list->nb_elem++;
+    if (!matroska->current_id) {
+        uint64_t id;
+        res = ebml_read_num(matroska, pb, 4, &id, 0);
+        if (res < 0) {
+            if (pb->eof_reached && res == AVERROR_EOF) {
+                if (matroska->is_live)
+                    // in live mode, finish parsing if EOF is reached.
+                    return 1;
+                if (level && pos == avio_tell(pb)) {
+                    if (level->length == EBML_UNKNOWN_LENGTH) {
+                        // Unknown-length levels automatically end at EOF.
+                        matroska->num_levels--;
+                        return LEVEL_ENDED;
+                    } else {
+                        av_log(matroska->ctx, AV_LOG_ERROR, "File ended prematurely "
+                               "at pos. %"PRIu64" (0x%"PRIx64")\n", pos, pos);
+                    }
+                }
+            }
+            return res;
+        }
+        matroska->current_id = id | 1 << 7 * res;
+        pos_alt = pos + res;
+    } else {
+        pos_alt = pos;
+        pos    -= (av_log2(matroska->current_id) + 7) / 8;
     }
 
-    if (syntax->type != EBML_PASS && syntax->type != EBML_STOP) {
+    id = matroska->current_id;
+
+    syntax = ebml_parse_id(syntax, id);
+    if (!syntax->id && id != EBML_ID_VOID && id != EBML_ID_CRC32) {
+        if (level && level->length == EBML_UNKNOWN_LENGTH) {
+            // Unknown-length levels end when an element from an upper level
+            // in the hierarchy is encountered.
+            while (syntax->def.n) {
+                syntax = ebml_parse_id(syntax->def.n, id);
+                if (syntax->id) {
+                    matroska->num_levels--;
+                    return LEVEL_ENDED;
+                }
+            };
+        }
+
+        av_log(matroska->ctx, AV_LOG_DEBUG, "Unknown entry 0x%"PRIX32" at pos. "
+                                            "%"PRId64"\n", id, pos);
+        update_pos = 0; /* Don't update resync_pos as an error might have happened. */
+    }
+
+    if (data) {
+        data = (char *) data + syntax->data_offset;
+        if (syntax->list_elem_size) {
+            EbmlList *list = data;
+            void *newelem;
+
+            if ((unsigned)list->nb_elem + 1 >= UINT_MAX / syntax->list_elem_size)
+                return AVERROR(ENOMEM);
+            newelem = av_fast_realloc(list->elem,
+                                      &list->alloc_elem_size,
+                                      (list->nb_elem + 1) * syntax->list_elem_size);
+            if (!newelem)
+                return AVERROR(ENOMEM);
+            list->elem = newelem;
+            data = (char *) list->elem + list->nb_elem * syntax->list_elem_size;
+            memset(data, 0, syntax->list_elem_size);
+            list->nb_elem++;
+        }
+    }
+
+    if (syntax->type != EBML_STOP) {
         matroska->current_id = 0;
         if ((res = ebml_read_length(matroska, pb, &length)) < 0)
             return res;
+
+        pos_alt += res;
+
+        if (matroska->num_levels > 0) {
+            if (length != EBML_UNKNOWN_LENGTH &&
+                level->length != EBML_UNKNOWN_LENGTH) {
+                uint64_t elem_end = pos_alt + length,
+                        level_end = level->start + level->length;
+
+                if (elem_end < level_end) {
+                    level_check = 0;
+                } else if (elem_end == level_end) {
+                    level_check = LEVEL_ENDED;
+                } else {
+                    av_log(matroska->ctx, AV_LOG_ERROR,
+                           "Element at 0x%"PRIx64" ending at 0x%"PRIx64" exceeds "
+                           "containing master element ending at 0x%"PRIx64"\n",
+                           pos, elem_end, level_end);
+                    return AVERROR_INVALIDDATA;
+                }
+            } else if (length != EBML_UNKNOWN_LENGTH) {
+                level_check = 0;
+            } else if (level->length != EBML_UNKNOWN_LENGTH) {
+                av_log(matroska->ctx, AV_LOG_ERROR, "Unknown-sized element "
+                       "at 0x%"PRIx64" inside parent with finite size\n", pos);
+                return AVERROR_INVALIDDATA;
+            } else {
+                level_check = 0;
+                if (id != MATROSKA_ID_CLUSTER && (syntax->type == EBML_LEVEL1
+                                              ||  syntax->type == EBML_NEST)) {
+                    // According to the current specifications only clusters and
+                    // segments are allowed to be unknown-length. We also accept
+                    // other unknown-length master elements.
+                    av_log(matroska->ctx, AV_LOG_WARNING,
+                           "Found unknown-length element 0x%"PRIX32" other than "
+                           "a cluster at 0x%"PRIx64". Spec-incompliant, but "
+                           "parsing will nevertheless be attempted.\n", id, pos);
+                    update_pos = -1;
+                }
+            }
+        } else
+            level_check = 0;
+
         if (max_lengths[syntax->type] && length > max_lengths[syntax->type]) {
-            av_log(matroska->ctx, AV_LOG_ERROR,
-                   "Invalid length 0x%"PRIx64" > 0x%"PRIx64" for syntax element %i\n",
-                   length, max_lengths[syntax->type], syntax->type);
+            if (length != EBML_UNKNOWN_LENGTH) {
+                av_log(matroska->ctx, AV_LOG_ERROR,
+                       "Invalid length 0x%"PRIx64" > 0x%"PRIx64" for element "
+                       "with ID 0x%"PRIX32" at 0x%"PRIx64"\n",
+                       length, max_lengths[syntax->type], id, pos);
+            } else if (syntax->type != EBML_NONE) {
+                av_log(matroska->ctx, AV_LOG_ERROR,
+                       "Element with ID 0x%"PRIX32" at pos. 0x%"PRIx64" has "
+                       "unknown length, yet the length of an element of its "
+                       "type must be known.\n", id, pos);
+            } else {
+                av_log(matroska->ctx, AV_LOG_ERROR,
+                       "Found unknown-length element with ID 0x%"PRIX32" at "
+                       "pos. 0x%"PRIx64" for which no syntax for parsing is "
+                       "available.\n", id, pos);
+            }
             return AVERROR_INVALIDDATA;
         }
+
+        if (!(pb->seekable & AVIO_SEEKABLE_NORMAL)) {
+            // Loosing sync will likely manifest itself as encountering unknown
+            // elements which are not reliably distinguishable from elements
+            // belonging to future extensions of the format.
+            // We use a heuristic to detect such situations: If the current
+            // element is not expected at the current syntax level and there
+            // were only a few unknown elements in a row, then the element is
+            // skipped or considered defective based upon the length of the
+            // current element (i.e. how much would be skipped); if there were
+            // more than a few skipped elements in a row and skipping the current
+            // element would lead us more than SKIP_THRESHOLD away from the last
+            // known good position, then it is inferred that an error occurred.
+            // The dependency on the number of unknown elements in a row exists
+            // because the distance to the last known good position is
+            // automatically big if the last parsed element was big.
+            // In both cases, each unknown element is considered equivalent to
+            // UNKNOWN_EQUIV of skipped bytes for the check.
+            // The whole check is only done for non-seekable output, because
+            // in this situation skipped data can't simply be rechecked later.
+            // This is especially important when using unkown length elements
+            // as the check for whether a child exceeds its containing master
+            // element is not effective in this situation.
+            if (update_pos) {
+                matroska->unknown_count = 0;
+            } else {
+                int64_t dist = length + UNKNOWN_EQUIV * matroska->unknown_count++;
+
+                if (matroska->unknown_count > 3)
+                    dist += pos_alt - matroska->resync_pos;
+
+                if (dist > SKIP_THRESHOLD) {
+                    av_log(matroska->ctx, AV_LOG_ERROR,
+                           "Unknown element %"PRIX32" at pos. 0x%"PRIx64" with "
+                           "length 0x%"PRIx64" considered as invalid data. Last "
+                           "known good position 0x%"PRIx64", %d unknown elements"
+                           " in a row\n", id, pos, length, matroska->resync_pos,
+                           matroska->unknown_count);
+                    return AVERROR_INVALIDDATA;
+                }
+            }
+        }
+
+        if (update_pos > 0) {
+            // We have found an element that is allowed at this place
+            // in the hierarchy and it passed all checks, so treat the beginning
+            // of the element as the "last known good" position.
+            matroska->resync_pos = pos;
+        }
+
+        if (!data && length != EBML_UNKNOWN_LENGTH)
+            goto skip;
     }
 
     switch (syntax->type) {
@@ -1214,37 +1396,89 @@
         res = ebml_read_ascii(pb, length, data);
         break;
     case EBML_BIN:
-        res = ebml_read_binary(pb, length, data);
+        res = ebml_read_binary(pb, length, pos_alt, data);
         break;
     case EBML_LEVEL1:
     case EBML_NEST:
-        if ((res = ebml_read_master(matroska, length)) < 0)
+        if ((res = ebml_read_master(matroska, length, pos_alt)) < 0)
             return res;
         if (id == MATROSKA_ID_SEGMENT)
-            matroska->segment_start = avio_tell(matroska->ctx->pb);
+            matroska->segment_start = pos_alt;
         if (id == MATROSKA_ID_CUES)
             matroska->cues_parsing_deferred = 0;
         if (syntax->type == EBML_LEVEL1 &&
             (level1_elem = matroska_find_level1_elem(matroska, syntax->id))) {
-            if (level1_elem->parsed)
+            if (!level1_elem->pos) {
+                // Zero is not a valid position for a level 1 element.
+                level1_elem->pos = pos;
+            } else if (level1_elem->pos != pos)
                 av_log(matroska->ctx, AV_LOG_ERROR, "Duplicate element\n");
             level1_elem->parsed = 1;
         }
-        return ebml_parse_nest(matroska, syntax->def.n, data);
-    case EBML_PASS:
-        return ebml_parse_id(matroska, syntax->def.n, id, data);
+        if (res = ebml_parse_nest(matroska, syntax->def.n, data))
+            return res;
+        break;
     case EBML_STOP:
         return 1;
+    skip:
     default:
-        if (ffio_limit(pb, length) != length)
-            return AVERROR(EIO);
-        return avio_skip(pb, length) < 0 ? AVERROR(EIO) : 0;
+        if (length) {
+            int64_t res2;
+            if (ffio_limit(pb, length) != length) {
+                // ffio_limit emits its own error message,
+                // so we don't have to.
+                return AVERROR(EIO);
+            }
+            if ((res2 = avio_skip(pb, length - 1)) >= 0) {
+                // avio_skip might take us past EOF. We check for this
+                // by skipping only length - 1 bytes, reading a byte and
+                // checking the error flags. This is done in order to check
+                // that the element has been properly skipped even when
+                // no filesize (that ffio_limit relies on) is available.
+                avio_r8(pb);
+                res = NEEDS_CHECKING;
+            } else
+                res = res2;
+        } else
+            res = 0;
     }
-    if (res == AVERROR_INVALIDDATA)
-        av_log(matroska->ctx, AV_LOG_ERROR, "Invalid element\n");
-    else if (res == AVERROR(EIO))
-        av_log(matroska->ctx, AV_LOG_ERROR, "Read error\n");
-    return res;
+    if (res) {
+        if (res == NEEDS_CHECKING) {
+            if (pb->eof_reached) {
+                if (pb->error)
+                    res = pb->error;
+                else
+                    res = AVERROR_EOF;
+            } else
+                goto level_check;
+        }
+
+        if (res == AVERROR_INVALIDDATA)
+            av_log(matroska->ctx, AV_LOG_ERROR, "Invalid element\n");
+        else if (res == AVERROR(EIO))
+            av_log(matroska->ctx, AV_LOG_ERROR, "Read error\n");
+        else if (res == AVERROR_EOF) {
+            av_log(matroska->ctx, AV_LOG_ERROR, "File ended prematurely\n");
+            res = AVERROR(EIO);
+        }
+
+        return res;
+    }
+
+level_check:
+    if (level_check == LEVEL_ENDED && matroska->num_levels) {
+        level = &matroska->levels[matroska->num_levels - 1];
+        pos   = avio_tell(pb);
+
+        // Given that pos >= level->start no check for
+        // level->length != EBML_UNKNOWN_LENGTH is necessary.
+        while (matroska->num_levels && pos == level->start + level->length) {
+            matroska->num_levels--;
+            level--;
+        }
+    }
+
+    return level_check;
 }
 
 static void ebml_free(EbmlSyntax *syntax, void *data)
@@ -1270,6 +1504,7 @@
                     ebml_free(syntax[i].def.n, ptr);
                 av_freep(&list->elem);
                 list->nb_elem = 0;
+                list->alloc_elem_size = 0;
             } else
                 ebml_free(syntax[i].def.n, data_off);
         default:
@@ -1281,7 +1516,7 @@
 /*
  * Autodetecting...
  */
-static int matroska_probe(AVProbeData *p)
+static int matroska_probe(const AVProbeData *p)
 {
     uint64_t total = 0;
     int len_mask = 0x80, size = 1, n = 1, i;
@@ -1302,9 +1537,14 @@
     while (n < size)
         total = (total << 8) | p->buf[4 + n++];
 
-    /* Does the probe data contain the whole header? */
-    if (p->buf_size < 4 + size + total)
-        return 0;
+    if (total + 1 == 1ULL << (7 * size)){
+        /* Unknown-length header - simply parse the whole buffer. */
+        total = p->buf_size - 4 - size;
+    } else {
+        /* Does the probe data contain the whole header? */
+        if (p->buf_size < 4 + size + total)
+            return 0;
+    }
 
     /* The header should contain a known document type. For now,
      * we don't parse the whole header but simply check for the
@@ -1324,7 +1564,7 @@
 }
 
 static MatroskaTrack *matroska_find_track_by_num(MatroskaDemuxContext *matroska,
-                                                 int num)
+                                                 uint64_t num)
 {
     MatroskaTrack *tracks = matroska->tracks.elem;
     int i;
@@ -1333,7 +1573,7 @@
         if (tracks[i].num == num)
             return &tracks[i];
 
-    av_log(matroska->ctx, AV_LOG_ERROR, "Invalid track number %d\n", num);
+    av_log(matroska->ctx, AV_LOG_ERROR, "Invalid track number %"PRIu64"\n", num);
     return NULL;
 }
 
@@ -1378,6 +1618,7 @@
 #if CONFIG_LZO
     case MATROSKA_TRACK_ENCODING_COMP_LZO:
         do {
+            int insize = isize;
             olen       = pkt_size *= 3;
             newpktdata = av_realloc(pkt_data, pkt_size + AV_LZO_OUTPUT_PADDING
                                                        + AV_INPUT_BUFFER_PADDING_SIZE);
@@ -1386,7 +1627,7 @@
                 goto failed;
             }
             pkt_data = newpktdata;
-            result   = av_lzo1x_decode(pkt_data, &olen, data, &isize);
+            result   = av_lzo1x_decode(pkt_data, &olen, data, &insize);
         } while (result == AV_LZO_OUTPUT_FULL && pkt_size < 10000000);
         if (result) {
             result = AVERROR_INVALIDDATA;
@@ -1577,18 +1818,14 @@
 }
 
 static int matroska_parse_seekhead_entry(MatroskaDemuxContext *matroska,
-                                         uint64_t pos)
+                                         int64_t pos)
 {
-    uint32_t level_up       = matroska->level_up;
-    uint32_t saved_id       = matroska->current_id;
+    uint32_t saved_id  = matroska->current_id;
     int64_t before_pos = avio_tell(matroska->ctx->pb);
-    MatroskaLevel level;
-    int64_t offset;
     int ret = 0;
 
     /* seek */
-    offset = pos + matroska->segment_start;
-    if (avio_seek(matroska->ctx->pb, offset, SEEK_SET) == offset) {
+    if (avio_seek(matroska->ctx->pb, pos, SEEK_SET) == pos) {
         /* We don't want to lose our seekhead level, so we add
          * a dummy. This is a crude hack. */
         if (matroska->num_levels == EBML_MAX_DEPTH) {
@@ -1597,26 +1834,20 @@
                    "cannot parse further.\n", EBML_MAX_DEPTH);
             ret = AVERROR_INVALIDDATA;
         } else {
-            level.start  = 0;
-            level.length = (uint64_t) -1;
-            matroska->levels[matroska->num_levels] = level;
+            matroska->levels[matroska->num_levels] = (MatroskaLevel) { 0, EBML_UNKNOWN_LENGTH };
             matroska->num_levels++;
             matroska->current_id                   = 0;
 
             ret = ebml_parse(matroska, matroska_segment, matroska);
-
-            /* remove dummy level */
-            while (matroska->num_levels) {
-                uint64_t length = matroska->levels[--matroska->num_levels].length;
-                if (length == (uint64_t) -1)
-                    break;
+            if (ret == LEVEL_ENDED) {
+                /* This can only happen if the seek brought us beyond EOF. */
+                ret = AVERROR_EOF;
             }
         }
     }
-    /* seek back */
-    avio_seek(matroska->ctx->pb, before_pos, SEEK_SET);
-    matroska->level_up   = level_up;
-    matroska->current_id = saved_id;
+    /* Seek back - notice that in all instances where this is used
+     * it is safe to set the level to 1. */
+    matroska_reset_status(matroska, saved_id, before_pos);
 
     return ret;
 }
@@ -1632,8 +1863,8 @@
 
     for (i = 0; i < seekhead_list->nb_elem; i++) {
         MatroskaSeekhead *seekheads = seekhead_list->elem;
-        uint32_t id  = seekheads[i].id;
-        uint64_t pos = seekheads[i].pos;
+        uint32_t id = seekheads[i].id;
+        int64_t pos = seekheads[i].pos + matroska->segment_start;
 
         MatroskaLevel1Element *elem = matroska_find_level1_elem(matroska, id);
         if (!elem || elem->parsed)
@@ -1894,9 +2125,6 @@
     }
 
     if (has_mastering_primaries || has_mastering_luminance) {
-        // Use similar rationals as other standards.
-        const int chroma_den = 50000;
-        const int luma_den = 10000;
         AVMasteringDisplayMetadata *metadata =
             (AVMasteringDisplayMetadata*) av_stream_new_side_data(
                 st, AV_PKT_DATA_MASTERING_DISPLAY_METADATA,
@@ -1906,29 +2134,19 @@
         }
         memset(metadata, 0, sizeof(AVMasteringDisplayMetadata));
         if (has_mastering_primaries) {
-            metadata->display_primaries[0][0] = av_make_q(
-                round(mastering_meta->r_x * chroma_den), chroma_den);
-            metadata->display_primaries[0][1] = av_make_q(
-                round(mastering_meta->r_y * chroma_den), chroma_den);
-            metadata->display_primaries[1][0] = av_make_q(
-                round(mastering_meta->g_x * chroma_den), chroma_den);
-            metadata->display_primaries[1][1] = av_make_q(
-                round(mastering_meta->g_y * chroma_den), chroma_den);
-            metadata->display_primaries[2][0] = av_make_q(
-                round(mastering_meta->b_x * chroma_den), chroma_den);
-            metadata->display_primaries[2][1] = av_make_q(
-                round(mastering_meta->b_y * chroma_den), chroma_den);
-            metadata->white_point[0] = av_make_q(
-                round(mastering_meta->white_x * chroma_den), chroma_den);
-            metadata->white_point[1] = av_make_q(
-                round(mastering_meta->white_y * chroma_den), chroma_den);
+            metadata->display_primaries[0][0] = av_d2q(mastering_meta->r_x, INT_MAX);
+            metadata->display_primaries[0][1] = av_d2q(mastering_meta->r_y, INT_MAX);
+            metadata->display_primaries[1][0] = av_d2q(mastering_meta->g_x, INT_MAX);
+            metadata->display_primaries[1][1] = av_d2q(mastering_meta->g_y, INT_MAX);
+            metadata->display_primaries[2][0] = av_d2q(mastering_meta->b_x, INT_MAX);
+            metadata->display_primaries[2][1] = av_d2q(mastering_meta->b_y, INT_MAX);
+            metadata->white_point[0] = av_d2q(mastering_meta->white_x, INT_MAX);
+            metadata->white_point[1] = av_d2q(mastering_meta->white_y, INT_MAX);
             metadata->has_primaries = 1;
         }
         if (has_mastering_luminance) {
-            metadata->max_luminance = av_make_q(
-                round(mastering_meta->max_luminance * luma_den), luma_den);
-            metadata->min_luminance = av_make_q(
-                round(mastering_meta->min_luminance * luma_den), luma_den);
+            metadata->max_luminance = av_d2q(mastering_meta->max_luminance, INT_MAX);
+            metadata->min_luminance = av_d2q(mastering_meta->min_luminance, INT_MAX);
             metadata->has_luminance = 1;
         }
     }
@@ -2204,8 +2422,8 @@
 
         if (key_id_base64) {
             /* export encryption key id as base64 metadata tag */
-            av_dict_set(&st->metadata, "enc_key_id", key_id_base64, 0);
-            av_freep(&key_id_base64);
+            av_dict_set(&st->metadata, "enc_key_id", key_id_base64,
+                        AV_DICT_DONT_STRDUP_VAL);
         }
 
         if (!strcmp(track->codec_id, "V_MS/VFW/FOURCC") &&
@@ -2336,34 +2554,33 @@
             memcpy(&extradata[12], track->codec_priv.data,
                    track->codec_priv.size);
         } else if (codec_id == AV_CODEC_ID_TTA) {
-            extradata_size = 30;
-            extradata      = av_mallocz(extradata_size + AV_INPUT_BUFFER_PADDING_SIZE);
-            if (!extradata)
-                return AVERROR(ENOMEM);
-            ffio_init_context(&b, extradata, extradata_size, 1,
-                              NULL, NULL, NULL, NULL);
-            avio_write(&b, "TTA1", 4);
-            avio_wl16(&b, 1);
+            uint8_t *ptr;
             if (track->audio.channels > UINT16_MAX ||
                 track->audio.bitdepth > UINT16_MAX) {
                 av_log(matroska->ctx, AV_LOG_WARNING,
                        "Too large audio channel number %"PRIu64
                        " or bitdepth %"PRIu64". Skipping track.\n",
                        track->audio.channels, track->audio.bitdepth);
-                av_freep(&extradata);
                 if (matroska->ctx->error_recognition & AV_EF_EXPLODE)
                     return AVERROR_INVALIDDATA;
                 else
                     continue;
             }
-            avio_wl16(&b, track->audio.channels);
-            avio_wl16(&b, track->audio.bitdepth);
             if (track->audio.out_samplerate < 0 || track->audio.out_samplerate > INT_MAX)
                 return AVERROR_INVALIDDATA;
-            avio_wl32(&b, track->audio.out_samplerate);
-            avio_wl32(&b, av_rescale((matroska->duration * matroska->time_scale),
-                                     track->audio.out_samplerate,
-                                     AV_TIME_BASE * 1000));
+            extradata_size = 22;
+            extradata      = av_mallocz(extradata_size + AV_INPUT_BUFFER_PADDING_SIZE);
+            if (!extradata)
+                return AVERROR(ENOMEM);
+            ptr = extradata;
+            bytestream_put_be32(&ptr, AV_RB32("TTA1"));
+            bytestream_put_le16(&ptr, 1);
+            bytestream_put_le16(&ptr, track->audio.channels);
+            bytestream_put_le16(&ptr, track->audio.bitdepth);
+            bytestream_put_le32(&ptr, track->audio.out_samplerate);
+            bytestream_put_le32(&ptr, av_rescale(matroska->duration * matroska->time_scale,
+                                                 track->audio.out_samplerate,
+                                                 AV_TIME_BASE * 1000));
         } else if (codec_id == AV_CODEC_ID_RV10 ||
                    codec_id == AV_CODEC_ID_RV20 ||
                    codec_id == AV_CODEC_ID_RV30 ||
@@ -2415,6 +2632,14 @@
             ret = matroska_parse_flac(s, track, &extradata_offset);
             if (ret < 0)
                 return ret;
+        } else if (codec_id == AV_CODEC_ID_WAVPACK && track->codec_priv.size < 2) {
+            av_log(matroska->ctx, AV_LOG_INFO, "Assuming WavPack version 4.10 "
+                   "in absence of valid CodecPrivate.\n");
+            extradata_size = 2;
+            extradata = av_mallocz(2 + AV_INPUT_BUFFER_PADDING_SIZE);
+            if (!extradata)
+                return AVERROR(ENOMEM);
+            AV_WL16(extradata, 0x410);
         } else if (codec_id == AV_CODEC_ID_PRORES && track->codec_priv.size == 4) {
             fourcc = AV_RL32(track->codec_priv.data);
         } else if (codec_id == AV_CODEC_ID_VP9 && track->codec_priv.size) {
@@ -2578,8 +2803,6 @@
             }
         } else if (track->type == MATROSKA_TRACK_TYPE_SUBTITLE) {
             st->codecpar->codec_type = AVMEDIA_TYPE_SUBTITLE;
-            if (st->codecpar->codec_id == AV_CODEC_ID_ASS)
-                matroska->contains_ssa = 1;
         }
     }
 
@@ -2637,7 +2860,7 @@
     /* The next thing is a segment. */
     pos = avio_tell(matroska->ctx->pb);
     res = ebml_parse(matroska, matroska_segments, matroska);
-    // try resyncing until we find a EBML_STOP type element.
+    // Try resyncing until we find an EBML_STOP type element.
     while (res != 1) {
         res = matroska_resync(matroska, pos);
         if (res < 0)
@@ -2645,6 +2868,9 @@
         pos = avio_tell(matroska->ctx->pb);
         res = ebml_parse(matroska, matroska_segment, matroska);
     }
+    /* Set data_offset as it might be needed later by seek_frame_generic. */
+    if (matroska->current_id == MATROSKA_ID_CLUSTER)
+        s->internal->data_offset = avio_tell(matroska->ctx->pb) - 4;
     matroska_execute_seekhead(matroska);
 
     if (!matroska->time_scale)
@@ -2675,10 +2901,10 @@
             av_dict_set(&st->metadata, "mimetype", attachments[j].mime, 0);
             st->codecpar->codec_id   = AV_CODEC_ID_NONE;
 
-            for (i = 0; ff_mkv_image_mime_tags[i].id != AV_CODEC_ID_NONE; i++) {
-                if (!strncmp(ff_mkv_image_mime_tags[i].str, attachments[j].mime,
-                             strlen(ff_mkv_image_mime_tags[i].str))) {
-                    st->codecpar->codec_id = ff_mkv_image_mime_tags[i].id;
+            for (i = 0; mkv_image_mime_tags[i].id != AV_CODEC_ID_NONE; i++) {
+                if (!strncmp(mkv_image_mime_tags[i].str, attachments[j].mime,
+                             strlen(mkv_image_mime_tags[i].str))) {
+                    st->codecpar->codec_id = mkv_image_mime_tags[i].id;
                     break;
                 }
             }
@@ -2686,15 +2912,19 @@
             attachments[j].stream = st;
 
             if (st->codecpar->codec_id != AV_CODEC_ID_NONE) {
+                AVPacket *pkt = &st->attached_pic;
+
                 st->disposition         |= AV_DISPOSITION_ATTACHED_PIC;
                 st->codecpar->codec_type = AVMEDIA_TYPE_VIDEO;
 
-                av_init_packet(&st->attached_pic);
-                if ((res = av_new_packet(&st->attached_pic, attachments[j].bin.size)) < 0)
-                    return res;
-                memcpy(st->attached_pic.data, attachments[j].bin.data, attachments[j].bin.size);
-                st->attached_pic.stream_index = st->index;
-                st->attached_pic.flags       |= AV_PKT_FLAG_KEY;
+                av_init_packet(pkt);
+                pkt->buf = av_buffer_ref(attachments[j].bin.buf);
+                if (!pkt->buf)
+                    return AVERROR(ENOMEM);
+                pkt->data         = attachments[j].bin.data;
+                pkt->size         = attachments[j].bin.size;
+                pkt->stream_index = st->index;
+                pkt->flags       |= AV_PKT_FLAG_KEY;
             } else {
                 st->codecpar->codec_type = AVMEDIA_TYPE_ATTACHMENT;
                 if (ff_alloc_extradata(st->codecpar, attachments[j].bin.size))
@@ -2702,10 +2932,10 @@
                 memcpy(st->codecpar->extradata, attachments[j].bin.data,
                        attachments[j].bin.size);
 
-                for (i = 0; ff_mkv_mime_tags[i].id != AV_CODEC_ID_NONE; i++) {
-                    if (!strncmp(ff_mkv_mime_tags[i].str, attachments[j].mime,
-                                strlen(ff_mkv_mime_tags[i].str))) {
-                        st->codecpar->codec_id = ff_mkv_mime_tags[i].id;
+                for (i = 0; mkv_mime_tags[i].id != AV_CODEC_ID_NONE; i++) {
+                    if (!strncmp(mkv_mime_tags[i].str, attachments[j].mime,
+                                strlen(mkv_mime_tags[i].str))) {
+                        st->codecpar->codec_id = mkv_mime_tags[i].id;
                         break;
                     }
                 }
@@ -2722,10 +2952,6 @@
                                    (AVRational) { 1, 1000000000 },
                                    chapters[i].start, chapters[i].end,
                                    chapters[i].title);
-            if (chapters[i].chapter) {
-                av_dict_set(&chapters[i].chapter->metadata,
-                            "title", chapters[i].title, 0);
-            }
             max_start = chapters[i].start;
         }
 
@@ -2776,20 +3002,15 @@
 }
 
 static int matroska_parse_laces(MatroskaDemuxContext *matroska, uint8_t **buf,
-                                int *buf_size, int type,
-                                uint32_t **lace_buf, int *laces)
+                                int size, int type, AVIOContext *pb,
+                                uint32_t lace_size[256], int *laces)
 {
-    int res = 0, n, size = *buf_size;
+    int n;
     uint8_t *data = *buf;
-    uint32_t *lace_size;
 
     if (!type) {
         *laces    = 1;
-        *lace_buf = av_mallocz(sizeof(int));
-        if (!*lace_buf)
-            return AVERROR(ENOMEM);
-
-        *lace_buf[0] = size;
+        lace_size[0] = size;
         return 0;
     }
 
@@ -2797,20 +3018,18 @@
     *laces    = *data + 1;
     data     += 1;
     size     -= 1;
-    lace_size = av_mallocz(*laces * sizeof(int));
-    if (!lace_size)
-        return AVERROR(ENOMEM);
 
     switch (type) {
     case 0x1: /* Xiph lacing */
     {
         uint8_t temp;
         uint32_t total = 0;
-        for (n = 0; res == 0 && n < *laces - 1; n++) {
+        for (n = 0; n < *laces - 1; n++) {
+            lace_size[n] = 0;
+
             while (1) {
                 if (size <= total) {
-                    res = AVERROR_INVALIDDATA;
-                    break;
+                    return AVERROR_INVALIDDATA;
                 }
                 temp          = *data;
                 total        += temp;
@@ -2822,8 +3041,7 @@
             }
         }
         if (size <= total) {
-            res = AVERROR_INVALIDDATA;
-            break;
+            return AVERROR_INVALIDDATA;
         }
 
         lace_size[n] = size - total;
@@ -2832,8 +3050,7 @@
 
     case 0x2: /* fixed-size lacing */
         if (size % (*laces)) {
-            res = AVERROR_INVALIDDATA;
-            break;
+            return AVERROR_INVALIDDATA;
         }
         for (n = 0; n < *laces; n++)
             lace_size[n] = size / *laces;
@@ -2843,34 +3060,35 @@
     {
         uint64_t num;
         uint64_t total;
-        n = matroska_ebmlnum_uint(matroska, data, size, &num);
-        if (n < 0 || num > INT_MAX) {
-            av_log(matroska->ctx, AV_LOG_INFO,
-                   "EBML block data error\n");
-            res = n<0 ? n : AVERROR_INVALIDDATA;
-            break;
-        }
-        data += n;
-        size -= n;
+        int offset;
+
+        avio_skip(pb, 4);
+
+        n = ebml_read_num(matroska, pb, 8, &num, 1);
+        if (n < 0)
+            return n;
+        if (num > INT_MAX)
+            return AVERROR_INVALIDDATA;
+
         total = lace_size[0] = num;
-        for (n = 1; res == 0 && n < *laces - 1; n++) {
+        offset = n;
+        for (n = 1; n < *laces - 1; n++) {
             int64_t snum;
             int r;
-            r = matroska_ebmlnum_sint(matroska, data, size, &snum);
-            if (r < 0 || lace_size[n - 1] + snum > (uint64_t)INT_MAX) {
-                av_log(matroska->ctx, AV_LOG_INFO,
-                       "EBML block data error\n");
-                res = r<0 ? r : AVERROR_INVALIDDATA;
-                break;
-            }
-            data        += r;
-            size        -= r;
+            r = matroska_ebmlnum_sint(matroska, pb, &snum);
+            if (r < 0)
+                return r;
+            if (lace_size[n - 1] + snum > (uint64_t)INT_MAX)
+                return AVERROR_INVALIDDATA;
+
             lace_size[n] = lace_size[n - 1] + snum;
             total       += lace_size[n];
+            offset      += r;
         }
+        data += offset;
+        size -= offset;
         if (size <= total) {
-            res = AVERROR_INVALIDDATA;
-            break;
+            return AVERROR_INVALIDDATA;
         }
         lace_size[*laces - 1] = size - total;
         break;
@@ -2878,10 +3096,8 @@
     }
 
     *buf      = data;
-    *lace_buf = lace_size;
-    *buf_size = size;
 
-    return res;
+    return 0;
 }
 
 static int matroska_parse_rm_audio(MatroskaDemuxContext *matroska,
@@ -2972,9 +3188,10 @@
     uint16_t ver;
     int ret, offset = 0;
 
-    if (srclen < 12 || track->stream->codecpar->extradata_size < 2)
+    if (srclen < 12)
         return AVERROR_INVALIDDATA;
 
+    av_assert1(track->stream->codecpar->extradata_size >= 2);
     ver = AV_RL16(track->stream->codecpar->extradata);
 
     samples = AV_RL32(src);
@@ -3047,20 +3264,17 @@
 static int matroska_parse_prores(MatroskaTrack *track, uint8_t *src,
                                  uint8_t **pdst, int *size)
 {
-    uint8_t *dst = src;
-    int dstlen = *size;
+    uint8_t *dst;
+    int dstlen = *size + 8;
 
-    if (AV_RB32(&src[4]) != MKBETAG('i', 'c', 'p', 'f')) {
-        dst = av_malloc(dstlen + 8 + AV_INPUT_BUFFER_PADDING_SIZE);
+        dst = av_malloc(dstlen + AV_INPUT_BUFFER_PADDING_SIZE);
         if (!dst)
             return AVERROR(ENOMEM);
 
         AV_WB32(dst, dstlen);
         AV_WB32(dst + 4, MKBETAG('i', 'c', 'p', 'f'));
-        memcpy(dst + 8, src, dstlen);
-        memset(dst + 8 + dstlen, 0, AV_INPUT_BUFFER_PADDING_SIZE);
-        dstlen += 8;
-    }
+        memcpy(dst + 8, src, dstlen - 8);
+        memset(dst + dstlen, 0, AV_INPUT_BUFFER_PADDING_SIZE);
 
     *pdst = dst;
     *size = dstlen;
@@ -3215,7 +3429,8 @@
         pkt_data = wv_data;
     }
 
-    if (st->codecpar->codec_id == AV_CODEC_ID_PRORES) {
+    if (st->codecpar->codec_id == AV_CODEC_ID_PRORES &&
+        AV_RB32(pkt_data + 4)  != MKBETAG('i', 'c', 'p', 'f')) {
         uint8_t *pr_data;
         res = matroska_parse_prores(track, pkt_data, &pr_data, &pkt_size);
         if (res < 0) {
@@ -3312,25 +3527,26 @@
 {
     uint64_t timecode = AV_NOPTS_VALUE;
     MatroskaTrack *track;
+    AVIOContext pb;
     int res = 0;
     AVStream *st;
     int16_t block_time;
-    uint32_t *lace_size = NULL;
+    uint32_t lace_size[256];
     int n, flags, laces = 0;
     uint64_t num;
     int trust_default_duration = 1;
 
-    if ((n = matroska_ebmlnum_uint(matroska, data, size, &num)) < 0) {
-        av_log(matroska->ctx, AV_LOG_ERROR, "EBML block data error\n");
+    ffio_init_context(&pb, data, size, 0, NULL, NULL, NULL, NULL);
+
+    if ((n = ebml_read_num(matroska, &pb, 8, &num, 1)) < 0)
         return n;
-    }
     data += n;
     size -= n;
 
     track = matroska_find_track_by_num(matroska, num);
     if (!track || !track->stream) {
         av_log(matroska->ctx, AV_LOG_INFO,
-               "Invalid stream %"PRIu64" or size %u\n", num, size);
+               "Invalid stream %"PRIu64"\n", num);
         return AVERROR_INVALIDDATA;
     } else if (size <= 3)
         return 0;
@@ -3374,11 +3590,12 @@
         }
     }
 
-    res = matroska_parse_laces(matroska, &data, &size, (flags & 0x06) >> 1,
-                               &lace_size, &laces);
-
-    if (res)
-        goto end;
+    res = matroska_parse_laces(matroska, &data, size, (flags & 0x06) >> 1,
+                               &pb, lace_size, &laces);
+    if (res < 0) {
+        av_log(matroska->ctx, AV_LOG_ERROR, "Error parsing frame sizes.\n");
+        return res;
+    }
 
     if (track->audio.samplerate == 8000) {
         // If this is needed for more codecs, then add them here
@@ -3398,11 +3615,6 @@
     for (n = 0; n < laces; n++) {
         int64_t lace_duration = block_duration*(n+1) / laces - block_duration*n / laces;
 
-        if (lace_size[n] > size) {
-            av_log(matroska->ctx, AV_LOG_ERROR, "Invalid packet size\n");
-            break;
-        }
-
         if ((st->codecpar->codec_id == AV_CODEC_ID_RA_288 ||
              st->codecpar->codec_id == AV_CODEC_ID_COOK   ||
              st->codecpar->codec_id == AV_CODEC_ID_SIPR   ||
@@ -3412,7 +3624,7 @@
                                           lace_size[n],
                                           timecode, pos);
             if (res)
-                goto end;
+                return res;
 
         } else if (st->codecpar->codec_id == AV_CODEC_ID_WEBVTT) {
             res = matroska_parse_webvtt(matroska, track, st,
@@ -3420,7 +3632,7 @@
                                         timecode, lace_duration,
                                         pos);
             if (res)
-                goto end;
+                return res;
         } else {
             res = matroska_parse_frame(matroska, track, st, buf, data, lace_size[n],
                                        timecode, lace_duration, pos,
@@ -3428,103 +3640,70 @@
                                        additional, additional_id, additional_size,
                                        discard_padding);
             if (res)
-                goto end;
+                return res;
         }
 
         if (timecode != AV_NOPTS_VALUE)
             timecode = lace_duration ? timecode + lace_duration : AV_NOPTS_VALUE;
         data += lace_size[n];
-        size -= lace_size[n];
     }
 
-end:
-    av_free(lace_size);
-    return res;
-}
-
-static int matroska_parse_cluster_incremental(MatroskaDemuxContext *matroska)
-{
-    EbmlList *blocks_list;
-    MatroskaBlock *blocks;
-    int i, res;
-    res = ebml_parse(matroska,
-                     matroska_cluster_incremental_parsing,
-                     &matroska->current_cluster);
-    if (res == 1) {
-        /* New Cluster */
-        if (matroska->current_cluster_pos)
-            ebml_level_end(matroska);
-        ebml_free(matroska_cluster, &matroska->current_cluster);
-        memset(&matroska->current_cluster, 0, sizeof(MatroskaCluster));
-        matroska->current_cluster_num_blocks = 0;
-        matroska->current_cluster_pos        = avio_tell(matroska->ctx->pb);
-        /* sizeof the ID which was already read */
-        if (matroska->current_id)
-            matroska->current_cluster_pos -= 4;
-        res = ebml_parse(matroska,
-                         matroska_clusters_incremental,
-                         &matroska->current_cluster);
-        /* Try parsing the block again. */
-        if (res == 1)
-            res = ebml_parse(matroska,
-                             matroska_cluster_incremental_parsing,
-                             &matroska->current_cluster);
-    }
-
-    if (!res &&
-        matroska->current_cluster_num_blocks <
-        matroska->current_cluster.blocks.nb_elem) {
-        blocks_list = &matroska->current_cluster.blocks;
-        blocks      = blocks_list->elem;
-
-        matroska->current_cluster_num_blocks = blocks_list->nb_elem;
-        i                                    = blocks_list->nb_elem - 1;
-        if (blocks[i].bin.size > 0 && blocks[i].bin.data) {
-            int is_keyframe = blocks[i].non_simple ? blocks[i].reference == INT64_MIN : -1;
-            uint8_t* additional = blocks[i].additional.size > 0 ?
-                                    blocks[i].additional.data : NULL;
-            if (!blocks[i].non_simple)
-                blocks[i].duration = 0;
-            res = matroska_parse_block(matroska, blocks[i].bin.buf, blocks[i].bin.data,
-                                       blocks[i].bin.size, blocks[i].bin.pos,
-                                       matroska->current_cluster.timecode,
-                                       blocks[i].duration, is_keyframe,
-                                       additional, blocks[i].additional_id,
-                                       blocks[i].additional.size,
-                                       matroska->current_cluster_pos,
-                                       blocks[i].discard_padding);
-        }
-    }
-
-    return res;
+    return 0;
 }
 
 static int matroska_parse_cluster(MatroskaDemuxContext *matroska)
 {
-    MatroskaCluster cluster = { 0 };
-    EbmlList *blocks_list;
-    MatroskaBlock *blocks;
-    int i, res;
-    int64_t pos;
+    MatroskaCluster *cluster = &matroska->current_cluster;
+    MatroskaBlock     *block = &cluster->block;
+    int res;
 
-    if (!matroska->contains_ssa)
-        return matroska_parse_cluster_incremental(matroska);
-    pos = avio_tell(matroska->ctx->pb);
-    if (matroska->current_id)
-        pos -= 4;  /* sizeof the ID which was already read */
-    res         = ebml_parse(matroska, matroska_clusters, &cluster);
-    blocks_list = &cluster.blocks;
-    blocks      = blocks_list->elem;
-    for (i = 0; i < blocks_list->nb_elem; i++)
-        if (blocks[i].bin.size > 0 && blocks[i].bin.data) {
-            int is_keyframe = blocks[i].non_simple ? blocks[i].reference == INT64_MIN : -1;
-            res = matroska_parse_block(matroska, blocks[i].bin.buf, blocks[i].bin.data,
-                                       blocks[i].bin.size, blocks[i].bin.pos,
-                                       cluster.timecode, blocks[i].duration,
-                                       is_keyframe, NULL, 0, 0, pos,
-                                       blocks[i].discard_padding);
+    av_assert0(matroska->num_levels <= 2);
+
+    if (matroska->num_levels == 1) {
+        res = ebml_parse(matroska, matroska_segment, NULL);
+
+        if (res == 1) {
+            /* Found a cluster: subtract the size of the ID already read. */
+            cluster->pos = avio_tell(matroska->ctx->pb) - 4;
+
+            res = ebml_parse(matroska, matroska_cluster_enter, cluster);
+            if (res < 0)
+                return res;
         }
-    ebml_free(matroska_cluster, &cluster);
+    }
+
+    if (matroska->num_levels == 2) {
+        /* We are inside a cluster. */
+        res = ebml_parse(matroska, matroska_cluster_parsing, cluster);
+
+        if (res >= 0 && block->bin.size > 0) {
+            int is_keyframe = block->non_simple ? block->reference == INT64_MIN : -1;
+            uint8_t* additional = block->additional.size > 0 ?
+                                    block->additional.data : NULL;
+
+            res = matroska_parse_block(matroska, block->bin.buf, block->bin.data,
+                                       block->bin.size, block->bin.pos,
+                                       cluster->timecode, block->duration,
+                                       is_keyframe, additional, block->additional_id,
+                                       block->additional.size, cluster->pos,
+                                       block->discard_padding);
+        }
+
+        ebml_free(matroska_blockgroup, block);
+        memset(block, 0, sizeof(*block));
+    } else if (!matroska->num_levels) {
+        if (!avio_feof(matroska->ctx->pb)) {
+            avio_r8(matroska->ctx->pb);
+            if (!avio_feof(matroska->ctx->pb)) {
+                av_log(matroska->ctx, AV_LOG_WARNING, "File extends beyond "
+                       "end of segment.\n");
+                return AVERROR_INVALIDDATA;
+            }
+        }
+        matroska->done = 1;
+        return AVERROR_EOF;
+    }
+
     return res;
 }
 
@@ -3533,15 +3712,19 @@
     MatroskaDemuxContext *matroska = s->priv_data;
     int ret = 0;
 
-    while (matroska_deliver_packet(matroska, pkt)) {
-        int64_t pos = avio_tell(matroska->ctx->pb);
-        if (matroska->done)
-            return (ret < 0) ? ret : AVERROR_EOF;
-        if (matroska_parse_cluster(matroska) < 0)
-            ret = matroska_resync(matroska, pos);
+    if (matroska->resync_pos == -1) {
+        // This can only happen if generic seeking has been used.
+        matroska->resync_pos = avio_tell(s->pb);
     }
 
-    return ret;
+    while (matroska_deliver_packet(matroska, pkt)) {
+        if (matroska->done)
+            return (ret < 0) ? ret : AVERROR_EOF;
+        if (matroska_parse_cluster(matroska) < 0 && !matroska->done)
+            ret = matroska_resync(matroska, matroska->resync_pos);
+    }
+
+    return 0;
 }
 
 static int matroska_read_seek(AVFormatContext *s, int stream_index,
@@ -3550,7 +3733,7 @@
     MatroskaDemuxContext *matroska = s->priv_data;
     MatroskaTrack *tracks = NULL;
     AVStream *st = s->streams[stream_index];
-    int i, index, index_min;
+    int i, index;
 
     /* Parse the CUES now since we need the index data to seek. */
     if (matroska->cues_parsing_deferred > 0) {
@@ -3563,9 +3746,7 @@
     timestamp = FFMAX(timestamp, st->index_entries[0].timestamp);
 
     if ((index = av_index_search_timestamp(st, timestamp, flags)) < 0 || index == st->nb_index_entries - 1) {
-        avio_seek(s->pb, st->index_entries[st->nb_index_entries - 1].pos,
-                  SEEK_SET);
-        matroska->current_id = 0;
+        matroska_reset_status(matroska, 0, st->index_entries[st->nb_index_entries - 1].pos);
         while ((index = av_index_search_timestamp(st, timestamp, flags)) < 0 || index == st->nb_index_entries - 1) {
             matroska_clear_queue(matroska);
             if (matroska_parse_cluster(matroska) < 0)
@@ -3577,7 +3758,6 @@
     if (index < 0 || (matroska->cues_parsing_deferred < 0 && index == st->nb_index_entries - 1))
         goto err;
 
-    index_min = index;
     tracks = matroska->tracks.elem;
     for (i = 0; i < matroska->tracks.nb_elem; i++) {
         tracks[i].audio.pkt_cnt        = 0;
@@ -3586,8 +3766,8 @@
         tracks[i].end_timecode         = 0;
     }
 
-    avio_seek(s->pb, st->index_entries[index_min].pos, SEEK_SET);
-    matroska->current_id       = 0;
+    /* We seek to a level 1 element, so set the appropriate status. */
+    matroska_reset_status(matroska, 0, st->index_entries[index].pos);
     if (flags & AVSEEK_FLAG_ANY) {
         st->skip_to_keyframe = 0;
         matroska->skip_to_timecode = timestamp;
@@ -3597,18 +3777,17 @@
     }
     matroska->skip_to_keyframe = 1;
     matroska->done             = 0;
-    matroska->num_levels       = 0;
     ff_update_cur_dts(s, st, st->index_entries[index].timestamp);
     return 0;
 err:
     // slightly hackish but allows proper fallback to
     // the generic seeking code.
+    matroska_reset_status(matroska, 0, -1);
+    matroska->resync_pos = -1;
     matroska_clear_queue(matroska);
-    matroska->current_id = 0;
     st->skip_to_keyframe =
     matroska->skip_to_keyframe = 0;
     matroska->done = 0;
-    matroska->num_levels = 0;
     return -1;
 }
 
@@ -3623,7 +3802,6 @@
     for (n = 0; n < matroska->tracks.nb_elem; n++)
         if (tracks[n].type == MATROSKA_TRACK_TYPE_AUDIO)
             av_freep(&tracks[n].audio.buf);
-    ebml_free(matroska_cluster, &matroska->current_cluster);
     ebml_free(matroska_segment, matroska);
 
     return 0;
@@ -3672,6 +3850,7 @@
 static int webm_clusters_start_with_keyframe(AVFormatContext *s)
 {
     MatroskaDemuxContext *matroska = s->priv_data;
+    uint32_t id = matroska->current_id;
     int64_t cluster_pos, before_pos;
     int index, rv = 1;
     if (s->streams[0]->nb_index_entries <= 0) return 0;
@@ -3681,30 +3860,36 @@
     cluster_pos = s->streams[0]->index_entries[index].pos;
     before_pos = avio_tell(s->pb);
     while (1) {
-        int64_t cluster_id = 0, cluster_length = 0;
+        uint64_t cluster_id, cluster_length;
+        int read;
         AVPacket *pkt;
         avio_seek(s->pb, cluster_pos, SEEK_SET);
         // read cluster id and length
-        ebml_read_num(matroska, matroska->ctx->pb, 4, &cluster_id);
-        ebml_read_length(matroska, matroska->ctx->pb, &cluster_length);
-        if (cluster_id != 0xF43B675) { // done with all clusters
+        read = ebml_read_num(matroska, matroska->ctx->pb, 4, &cluster_id, 1);
+        if (read < 0 || cluster_id != 0xF43B675) // done with all clusters
             break;
-        }
-        avio_seek(s->pb, cluster_pos, SEEK_SET);
-        matroska->current_id = 0;
+        read = ebml_read_length(matroska, matroska->ctx->pb, &cluster_length);
+        if (read < 0)
+            break;
+
+        matroska_reset_status(matroska, 0, cluster_pos);
         matroska_clear_queue(matroska);
         if (matroska_parse_cluster(matroska) < 0 ||
             !matroska->queue) {
             break;
         }
         pkt = &matroska->queue->pkt;
-        cluster_pos += cluster_length + 12; // 12 is the offset of the cluster id and length.
+        // 4 + read is the length of the cluster id and the cluster length field.
+        cluster_pos += 4 + read + cluster_length;
         if (!(pkt->flags & AV_PKT_FLAG_KEY)) {
             rv = 0;
             break;
         }
     }
-    avio_seek(s->pb, before_pos, SEEK_SET);
+
+    /* Restore the status after matroska_read_header: */
+    matroska_reset_status(matroska, id, before_pos);
+
     return rv;
 }
 
@@ -3897,12 +4082,17 @@
     cues_start = seekhead[i].pos + matroska->segment_start;
     if (avio_seek(matroska->ctx->pb, cues_start, SEEK_SET) == cues_start) {
         // cues_end is computed as cues_start + cues_length + length of the
-        // Cues element ID + EBML length of the Cues element. cues_end is
-        // inclusive and the above sum is reduced by 1.
-        uint64_t cues_length = 0, cues_id = 0, bytes_read = 0;
-        bytes_read += ebml_read_num(matroska, matroska->ctx->pb, 4, &cues_id);
-        bytes_read += ebml_read_length(matroska, matroska->ctx->pb, &cues_length);
-        cues_end = cues_start + cues_length + bytes_read - 1;
+        // Cues element ID (i.e. 4) + EBML length of the Cues element.
+        // cues_end is inclusive and the above sum is reduced by 1.
+        uint64_t cues_length, cues_id;
+        int bytes_read;
+        bytes_read = ebml_read_num   (matroska, matroska->ctx->pb, 4, &cues_id, 1);
+        if (bytes_read < 0 || cues_id != (MATROSKA_ID_CUES & 0xfffffff))
+            return bytes_read < 0 ? bytes_read : AVERROR_INVALIDDATA;
+        bytes_read = ebml_read_length(matroska, matroska->ctx->pb, &cues_length);
+        if (bytes_read < 0)
+            return bytes_read;
+        cues_end = cues_start + 4 + bytes_read + cues_length - 1;
     }
     avio_seek(matroska->ctx->pb, before_pos, SEEK_SET);
     if (cues_start == -1 || cues_end == -1) return -1;
@@ -3916,7 +4106,7 @@
     // cues end
     av_dict_set_int(&s->streams[0]->metadata, CUES_END, cues_end, 0);
 
-    // if the file has cues at the start, fix up the init range so tht
+    // if the file has cues at the start, fix up the init range so that
     // it does not include it
     if (cues_start <= init_range)
         av_dict_set_int(&s->streams[0]->metadata, INITIALIZATION_RANGE, cues_start - 1, 0);
@@ -3931,25 +4121,22 @@
 
     // store cue point timestamps as a comma separated list for checking subsegment alignment in
     // the muxer. assumes that each timestamp cannot be more than 20 characters long.
-    buf = av_malloc_array(s->streams[0]->nb_index_entries, 20 * sizeof(char));
+    buf = av_malloc_array(s->streams[0]->nb_index_entries, 20);
     if (!buf) return -1;
     strcpy(buf, "");
     for (i = 0; i < s->streams[0]->nb_index_entries; i++) {
-        int ret = snprintf(buf + end, 20 * sizeof(char),
-                           "%" PRId64, s->streams[0]->index_entries[i].timestamp);
+        int ret = snprintf(buf + end, 20,
+                           "%" PRId64"%s", s->streams[0]->index_entries[i].timestamp,
+                           i != s->streams[0]->nb_index_entries - 1 ? "," : "");
         if (ret <= 0 || (ret == 20 && i ==  s->streams[0]->nb_index_entries - 1)) {
             av_log(s, AV_LOG_ERROR, "timestamp too long.\n");
             av_free(buf);
             return AVERROR_INVALIDDATA;
         }
         end += ret;
-        if (i != s->streams[0]->nb_index_entries - 1) {
-            strncat(buf, ",", sizeof(char));
-            end++;
-        }
     }
-    av_dict_set(&s->streams[0]->metadata, CUE_TIMESTAMPS, buf, 0);
-    av_free(buf);
+    av_dict_set(&s->streams[0]->metadata, CUE_TIMESTAMPS,
+                buf, AV_DICT_DONT_STRDUP_VAL);
 
     return 0;
 }
@@ -3974,8 +4161,8 @@
     if (!matroska->is_live) {
         buf = av_asprintf("%g", matroska->duration);
         if (!buf) return AVERROR(ENOMEM);
-        av_dict_set(&s->streams[0]->metadata, DURATION, buf, 0);
-        av_free(buf);
+        av_dict_set(&s->streams[0]->metadata, DURATION,
+                    buf, AV_DICT_DONT_STRDUP_VAL);
 
         // initialization range
         // 5 is the offset of Cluster ID.
diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c
index 22d73d7..76ead7d 100644
--- a/libavformat/matroskaenc.c
+++ b/libavformat/matroskaenc.c
@@ -32,7 +32,6 @@
 #include "isom.h"
 #include "matroska.h"
 #include "riff.h"
-#include "subtitles.h"
 #include "vorbiscomment.h"
 #include "wv.h"
 
@@ -50,43 +49,47 @@
 #include "libavutil/random_seed.h"
 #include "libavutil/rational.h"
 #include "libavutil/samplefmt.h"
-#include "libavutil/sha.h"
 #include "libavutil/stereo3d.h"
 
 #include "libavcodec/xiph.h"
 #include "libavcodec/mpeg4audio.h"
-#include "libavcodec/internal.h"
+
+/* Level 1 elements we create a SeekHead entry for:
+ * Info, Tracks, Chapters, Attachments, Tags and Cues */
+#define MAX_SEEKHEAD_ENTRIES 6
+
+enum {
+    DEFAULT_MODE_INFER,
+    DEFAULT_MODE_INFER_NO_SUBS,
+    DEFAULT_MODE_PASSTHROUGH,
+};
 
 typedef struct ebml_master {
-    int64_t         pos;                ///< absolute offset in the file where the master's elements start
+    int64_t         pos;                ///< absolute offset in the containing AVIOContext where the master's elements start
     int             sizebytes;          ///< how many bytes were reserved for the size
 } ebml_master;
 
 typedef struct mkv_seekhead_entry {
-    unsigned int    elementid;
+    uint32_t        elementid;
     uint64_t        segmentpos;
 } mkv_seekhead_entry;
 
 typedef struct mkv_seekhead {
     int64_t                 filepos;
-    int64_t                 segment_offset;     ///< the file offset to the beginning of the segment
-    int                     reserved_size;      ///< -1 if appending to file
-    int                     max_entries;
-    mkv_seekhead_entry      *entries;
+    mkv_seekhead_entry      entries[MAX_SEEKHEAD_ENTRIES];
     int                     num_entries;
+    int                     reserved_size;
 } mkv_seekhead;
 
 typedef struct mkv_cuepoint {
     uint64_t        pts;
     int             stream_idx;
-    int             tracknum;
-    int64_t         cluster_pos;        ///< file offset of the cluster containing the block
+    int64_t         cluster_pos;        ///< offset of the cluster containing the block relative to the segment
     int64_t         relative_pos;       ///< relative offset from the position of the cluster containing the block
     int64_t         duration;           ///< duration of the block according to time base
 } mkv_cuepoint;
 
 typedef struct mkv_cues {
-    int64_t         segment_offset;
     mkv_cuepoint    *entries;
     int             num_entries;
 } mkv_cues;
@@ -94,54 +97,44 @@
 typedef struct mkv_track {
     int             write_dts;
     int             has_cue;
+    uint64_t        uid;
+    unsigned        track_num;
+    int             track_num_size;
     int             sample_rate;
     int64_t         sample_rate_offset;
+    int64_t         last_timestamp;
+    int64_t         duration;
+    int64_t         duration_offset;
     int64_t         codecpriv_offset;
     int64_t         ts_offset;
 } mkv_track;
 
-typedef struct mkv_attachment {
-    int             stream_idx;
-    uint32_t        fileuid;
-} mkv_attachment;
-
-typedef struct mkv_attachments {
-    mkv_attachment  *entries;
-    int             num_entries;
-} mkv_attachments;
-
 #define MODE_MATROSKAv2 0x01
 #define MODE_WEBM       0x02
 
-/** Maximum number of tracks allowed in a Matroska file (with track numbers in
- * range 1 to 126 (inclusive) */
-#define MAX_TRACKS 126
-
 typedef struct MatroskaMuxContext {
-    const AVClass  *class;
+    const AVClass   *class;
     int             mode;
-    AVIOContext   *dyn_bc;
     AVIOContext     *tags_bc;
-    ebml_master     tags;
+    int64_t         tags_pos;
     AVIOContext     *info_bc;
-    ebml_master     info;
+    int64_t         info_pos;
     AVIOContext     *tracks_bc;
-    ebml_master     tracks_master;
+    int64_t         tracks_pos;
     ebml_master     segment;
     int64_t         segment_offset;
-    ebml_master     cluster;
+    AVIOContext     *cluster_bc;
     int64_t         cluster_pos;        ///< file offset of the current cluster
     int64_t         cluster_pts;
     int64_t         duration_offset;
     int64_t         duration;
-    mkv_seekhead    *main_seekhead;
-    mkv_cues        *cues;
+    mkv_seekhead    seekhead;
+    mkv_cues        cues;
     mkv_track       *tracks;
-    mkv_attachments *attachments;
 
     AVPacket        cur_audio_pkt;
 
-    int have_attachments;
+    unsigned nb_attachments;
     int have_video;
 
     int reserve_cues_space;
@@ -156,35 +149,32 @@
     uint32_t chapter_id_offset;
     int wrote_chapters;
 
-    int64_t last_track_timestamp[MAX_TRACKS];
-
-    int64_t* stream_durations;
-    int64_t* stream_duration_offsets;
-
     int allow_raw_vfw;
+    int default_mode;
+
+    uint32_t segment_uid[4];
 } MatroskaMuxContext;
 
+/** 2 bytes * 7 for EBML IDs, 7 1-byte EBML lengths, 6 1-byte uint,
+ * 8 byte for "matroska" doctype string */
+#define MAX_EBML_HEADER_SIZE 35
 
 /** 2 bytes * 3 for EBML IDs, 3 1-byte EBML lengths, 8 bytes for 64 bit
  * offset, 4 bytes for target EBML ID */
 #define MAX_SEEKENTRY_SIZE 21
 
-/** per-cuepoint-track - 5 1-byte EBML IDs, 5 1-byte EBML sizes, 4
- * 8-byte uint max */
-#define MAX_CUETRACKPOS_SIZE 42
-
-/** per-cuepoint - 2 1-byte EBML IDs, 2 1-byte EBML sizes, 8-byte uint max */
-#define MAX_CUEPOINT_SIZE(num_tracks) 12 + MAX_CUETRACKPOS_SIZE * num_tracks
+/** 4 * (1-byte EBML ID, 1-byte EBML size, 8-byte uint max) */
+#define MAX_CUETRACKPOS_SIZE 40
 
 /** Seek preroll value for opus */
 #define OPUS_SEEK_PREROLL 80000000
 
-static int ebml_id_size(unsigned int id)
+static int ebml_id_size(uint32_t id)
 {
-    return (av_log2(id + 1) - 1) / 7 + 1;
+    return (av_log2(id) + 7U) / 8;
 }
 
-static void put_ebml_id(AVIOContext *pb, unsigned int id)
+static void put_ebml_id(AVIOContext *pb, uint32_t id)
 {
     int i = ebml_id_size(id);
     while (i--)
@@ -204,42 +194,70 @@
 }
 
 /**
- * Calculate how many bytes are needed to represent a given number in EBML.
+ * Returns how many bytes are needed to represent a number
+ * as EBML variable length integer.
  */
 static int ebml_num_size(uint64_t num)
 {
-    int bytes = 1;
-    while ((num + 1) >> bytes * 7)
+    int bytes = 0;
+    do {
         bytes++;
+    } while (num >>= 7);
     return bytes;
 }
 
 /**
- * Write a number in EBML variable length format.
- *
- * @param bytes The number of bytes that need to be used to write the number.
- *              If zero, any number of bytes can be used.
+ * Calculate how many bytes are needed to represent the length field
+ * of an EBML element whose payload has a given length.
+ */
+static int ebml_length_size(uint64_t length)
+{
+    return ebml_num_size(length + 1);
+}
+
+/**
+ * Write a number as EBML variable length integer on `bytes` bytes.
+ * `bytes` is taken literally without checking.
  */
 static void put_ebml_num(AVIOContext *pb, uint64_t num, int bytes)
 {
-    int i, needed_bytes = ebml_num_size(num);
-
-    // sizes larger than this are currently undefined in EBML
-    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.
-    av_assert0(bytes >= needed_bytes);
-
     num |= 1ULL << bytes * 7;
-    for (i = bytes - 1; i >= 0; i--)
+    for (int i = bytes - 1; i >= 0; i--)
         avio_w8(pb, (uint8_t)(num >> i * 8));
 }
 
-static void put_ebml_uint(AVIOContext *pb, unsigned int elementid, uint64_t val)
+/**
+ * Write a length as EBML variable length integer.
+ *
+ * @param bytes The number of bytes that need to be used to write the number.
+ *              If zero, the minimal number of bytes will be used.
+ */
+static void put_ebml_length(AVIOContext *pb, uint64_t length, int bytes)
+{
+    int needed_bytes = ebml_length_size(length);
+
+    // sizes larger than this are currently undefined in EBML
+    av_assert0(length < (1ULL << 56) - 1);
+
+    if (bytes == 0)
+        bytes = needed_bytes;
+    // The bytes needed to write the given size must not exceed
+    // the bytes that we ought to use.
+    av_assert0(bytes >= needed_bytes);
+    put_ebml_num(pb, length, bytes);
+}
+
+/**
+ * Write a (random) UID with fixed size to make the output more deterministic
+ */
+static void put_ebml_uid(AVIOContext *pb, uint32_t elementid, uint64_t uid)
+{
+    put_ebml_id(pb, elementid);
+    put_ebml_length(pb, 8, 0);
+    avio_wb64(pb, uid);
+}
+
+static void put_ebml_uint(AVIOContext *pb, uint32_t elementid, uint64_t val)
 {
     int i, bytes = 1;
     uint64_t tmp = val;
@@ -247,40 +265,41 @@
         bytes++;
 
     put_ebml_id(pb, elementid);
-    put_ebml_num(pb, bytes, 0);
+    put_ebml_length(pb, bytes, 0);
     for (i = bytes - 1; i >= 0; i--)
         avio_w8(pb, (uint8_t)(val >> i * 8));
 }
 
-static void put_ebml_sint(AVIOContext *pb, unsigned int elementid, int64_t val)
+static void put_ebml_sint(AVIOContext *pb, uint32_t elementid, int64_t val)
 {
     int i, bytes = 1;
     uint64_t tmp = 2*(val < 0 ? val^-1 : val);
 
-    while (tmp>>=8) bytes++;
+    while (tmp >>= 8)
+        bytes++;
 
     put_ebml_id(pb, elementid);
-    put_ebml_num(pb, bytes, 0);
+    put_ebml_length(pb, bytes, 0);
     for (i = bytes - 1; i >= 0; i--)
         avio_w8(pb, (uint8_t)(val >> i * 8));
 }
 
-static void put_ebml_float(AVIOContext *pb, unsigned int elementid, double val)
+static void put_ebml_float(AVIOContext *pb, uint32_t elementid, double val)
 {
     put_ebml_id(pb, elementid);
-    put_ebml_num(pb, 8, 0);
+    put_ebml_length(pb, 8, 0);
     avio_wb64(pb, av_double2int(val));
 }
 
-static void put_ebml_binary(AVIOContext *pb, unsigned int elementid,
+static void put_ebml_binary(AVIOContext *pb, uint32_t elementid,
                             const void *buf, int size)
 {
     put_ebml_id(pb, elementid);
-    put_ebml_num(pb, size, 0);
+    put_ebml_length(pb, size, 0);
     avio_write(pb, buf, size);
 }
 
-static void put_ebml_string(AVIOContext *pb, unsigned int elementid,
+static void put_ebml_string(AVIOContext *pb, uint32_t elementid,
                             const char *str)
 {
     put_ebml_binary(pb, elementid, str, strlen(str));
@@ -292,30 +311,32 @@
  *
  * @param size The number of bytes to reserve, which must be at least 2.
  */
-static void put_ebml_void(AVIOContext *pb, uint64_t size)
+static void put_ebml_void(AVIOContext *pb, int size)
 {
-    int64_t currentpos = avio_tell(pb);
-
     av_assert0(size >= 2);
 
     put_ebml_id(pb, EBML_ID_VOID);
     // we need to subtract the length needed to store the size from the
     // size we need to reserve so 2 cases, we use 8 bytes to store the
     // size if possible, 1 byte otherwise
-    if (size < 10)
-        put_ebml_num(pb, size - 2, 0);
-    else
-        put_ebml_num(pb, size - 9, 8);
-    ffio_fill(pb, 0, currentpos + size - avio_tell(pb));
+    if (size < 10) {
+        size -= 2;
+        put_ebml_length(pb, size, 0);
+    } else {
+        size -= 9;
+        put_ebml_length(pb, size, 8);
+    }
+    ffio_fill(pb, 0, size);
 }
 
-static ebml_master start_ebml_master(AVIOContext *pb, unsigned int elementid,
+static ebml_master start_ebml_master(AVIOContext *pb, uint32_t elementid,
                                      uint64_t expectedsize)
 {
-    int bytes = expectedsize ? ebml_num_size(expectedsize) : 8;
+    int bytes = expectedsize ? ebml_length_size(expectedsize) : 8;
+
     put_ebml_id(pb, elementid);
     put_ebml_size_unknown(pb, bytes);
-    return (ebml_master) {avio_tell(pb), bytes };
+    return (ebml_master) { avio_tell(pb), bytes };
 }
 
 static void end_ebml_master(AVIOContext *pb, ebml_master master)
@@ -324,66 +345,61 @@
 
     if (avio_seek(pb, master.pos - master.sizebytes, SEEK_SET) < 0)
         return;
-    put_ebml_num(pb, pos - master.pos, master.sizebytes);
+    put_ebml_length(pb, pos - master.pos, master.sizebytes);
     avio_seek(pb, pos, SEEK_SET);
 }
 
-static int start_ebml_master_crc32(AVIOContext *pb, AVIOContext **dyn_cp, MatroskaMuxContext *mkv,
-                                   ebml_master *master, unsigned int elementid, uint64_t expectedsize)
+static int start_ebml_master_crc32(AVIOContext **dyn_cp, MatroskaMuxContext *mkv)
 {
     int ret;
 
-    if ((ret = avio_open_dyn_buf(dyn_cp)) < 0)
+    if (!*dyn_cp && (ret = avio_open_dyn_buf(dyn_cp)) < 0)
         return ret;
 
-    if (pb->seekable & AVIO_SEEKABLE_NORMAL) {
-        *master = start_ebml_master(pb, elementid, expectedsize);
-        if (mkv->write_crc && mkv->mode != MODE_WEBM)
-            put_ebml_void(*dyn_cp, 6); /* Reserve space for CRC32 so position/size calculations using avio_tell() take it into account */
-    } else
-        *master = start_ebml_master(*dyn_cp, elementid, expectedsize);
+    if (mkv->write_crc)
+        put_ebml_void(*dyn_cp, 6); /* Reserve space for CRC32 so position/size calculations using avio_tell() take it into account */
 
     return 0;
 }
 
-static void end_ebml_master_crc32(AVIOContext *pb, AVIOContext **dyn_cp, MatroskaMuxContext *mkv,
-                                  ebml_master master)
+static void end_ebml_master_crc32(AVIOContext *pb, AVIOContext **dyn_cp,
+                                  MatroskaMuxContext *mkv, uint32_t id,
+                                  int length_size, int keep_buffer)
 {
     uint8_t *buf, crc[4];
     int size, skip = 0;
 
-    if (pb->seekable & AVIO_SEEKABLE_NORMAL) {
-        size = avio_close_dyn_buf(*dyn_cp, &buf);
-        if (mkv->write_crc && mkv->mode != MODE_WEBM) {
-            skip = 6; /* Skip reserved 6-byte long void element from the dynamic buffer. */
-            AV_WL32(crc, av_crc(av_crc_get_table(AV_CRC_32_IEEE_LE), UINT32_MAX, buf + skip, size - skip) ^ UINT32_MAX);
-            put_ebml_binary(pb, EBML_ID_CRC32, crc, sizeof(crc));
-        }
-        avio_write(pb, buf + skip, size - skip);
-        end_ebml_master(pb, master);
-    } else {
-        end_ebml_master(*dyn_cp, master);
-        size = avio_close_dyn_buf(*dyn_cp, &buf);
-        avio_write(pb, buf, size);
+    put_ebml_id(pb, id);
+    size = avio_get_dyn_buf(*dyn_cp, &buf);
+    put_ebml_length(pb, size, length_size);
+    if (mkv->write_crc) {
+        skip = 6; /* Skip reserved 6-byte long void element from the dynamic buffer. */
+        AV_WL32(crc, av_crc(av_crc_get_table(AV_CRC_32_IEEE_LE), UINT32_MAX, buf + skip, size - skip) ^ UINT32_MAX);
+        put_ebml_binary(pb, EBML_ID_CRC32, crc, sizeof(crc));
     }
-    av_free(buf);
-    *dyn_cp = NULL;
+    avio_write(pb, buf + skip, size - skip);
+
+    if (keep_buffer) {
+        ffio_reset_dyn_buf(*dyn_cp);
+    } else {
+        ffio_free_dyn_buf(dyn_cp);
+    }
 }
 
 /**
-* Complete ebml master whithout destroying the buffer, allowing for later updates
+* Complete ebml master without destroying the buffer, allowing for later updates
 */
-static void end_ebml_master_crc32_preliminary(AVIOContext *pb, AVIOContext **dyn_cp, MatroskaMuxContext *mkv,
-    ebml_master master)
+static void end_ebml_master_crc32_preliminary(AVIOContext *pb, AVIOContext *dyn_cp,
+                                              uint32_t id, int64_t *pos)
 {
-    if (pb->seekable & AVIO_SEEKABLE_NORMAL) {
+    uint8_t *buf;
+    int size = avio_get_dyn_buf(dyn_cp, &buf);
 
-        uint8_t *buf;
-        int size = avio_get_dyn_buf(*dyn_cp, &buf);
+    *pos = avio_tell(pb);
 
-        avio_write(pb, buf, size);
-        end_ebml_master(pb, master);
-    }
+    put_ebml_id(pb, id);
+    put_ebml_length(pb, size, 0);
+    avio_write(pb, buf, size);
 }
 
 static void put_xiph_size(AVIOContext *pb, int size)
@@ -395,165 +411,99 @@
 /**
  * Free the members allocated in the mux context.
  */
-static void mkv_free(MatroskaMuxContext *mkv) {
-    uint8_t* buf;
-    if (mkv->dyn_bc) {
-        avio_close_dyn_buf(mkv->dyn_bc, &buf);
-        av_free(buf);
-    }
-    if (mkv->info_bc) {
-        avio_close_dyn_buf(mkv->info_bc, &buf);
-        av_free(buf);
-    }
-    if (mkv->tracks_bc) {
-        avio_close_dyn_buf(mkv->tracks_bc, &buf);
-        av_free(buf);
-    }
-    if (mkv->tags_bc) {
-        avio_close_dyn_buf(mkv->tags_bc, &buf);
-        av_free(buf);
-    }
-    if (mkv->main_seekhead) {
-        av_freep(&mkv->main_seekhead->entries);
-        av_freep(&mkv->main_seekhead);
-    }
-    if (mkv->cues) {
-        av_freep(&mkv->cues->entries);
-        av_freep(&mkv->cues);
-    }
-    if (mkv->attachments) {
-        av_freep(&mkv->attachments->entries);
-        av_freep(&mkv->attachments);
-    }
+static void mkv_deinit(AVFormatContext *s)
+{
+    MatroskaMuxContext *mkv = s->priv_data;
+
+    av_packet_unref(&mkv->cur_audio_pkt);
+
+    ffio_free_dyn_buf(&mkv->cluster_bc);
+    ffio_free_dyn_buf(&mkv->info_bc);
+    ffio_free_dyn_buf(&mkv->tracks_bc);
+    ffio_free_dyn_buf(&mkv->tags_bc);
+
+    av_freep(&mkv->cues.entries);
     av_freep(&mkv->tracks);
-    av_freep(&mkv->stream_durations);
-    av_freep(&mkv->stream_duration_offsets);
 }
 
 /**
- * Initialize a mkv_seekhead element to be ready to index level 1 Matroska
- * elements. If a maximum number of elements is specified, enough space
- * will be reserved at the current file location to write a seek head of
- * that size.
- *
- * @param segment_offset The absolute offset to the position in the file
- *                       where the segment begins.
- * @param numelements The maximum number of elements that will be indexed
- *                    by this seek head, 0 if unlimited.
+ * Initialize the SeekHead element to be ready to index level 1 Matroska
+ * elements. Enough space to write MAX_SEEKHEAD_ENTRIES SeekHead entries
+ * will be reserved at the current file location.
  */
-static mkv_seekhead *mkv_start_seekhead(AVIOContext *pb, int64_t segment_offset,
-                                        int numelements)
+static void mkv_start_seekhead(MatroskaMuxContext *mkv, AVIOContext *pb)
 {
-    mkv_seekhead *new_seekhead = av_mallocz(sizeof(mkv_seekhead));
-    if (!new_seekhead)
-        return NULL;
-
-    new_seekhead->segment_offset = segment_offset;
-
-    if (numelements > 0) {
-        new_seekhead->filepos = avio_tell(pb);
-        // 21 bytes max for a seek entry, 10 bytes max for the SeekHead ID
-        // and size, 6 bytes for a CRC32 element, and 3 bytes to guarantee
-        // that an EBML void element will fit afterwards
-        new_seekhead->reserved_size = numelements * MAX_SEEKENTRY_SIZE + 19;
-        new_seekhead->max_entries   = numelements;
-        put_ebml_void(pb, new_seekhead->reserved_size);
-    }
-    return new_seekhead;
+    mkv->seekhead.filepos = avio_tell(pb);
+    // 21 bytes max for a Seek entry, 6 bytes max for the SeekHead ID
+    // and size, 6 bytes for a CRC32 element, and 2 bytes to guarantee
+    // that an EBML void element will fit afterwards
+    mkv->seekhead.reserved_size = MAX_SEEKHEAD_ENTRIES * MAX_SEEKENTRY_SIZE + 14;
+    put_ebml_void(pb, mkv->seekhead.reserved_size);
 }
 
-static int mkv_add_seekhead_entry(mkv_seekhead *seekhead, unsigned int elementid, uint64_t filepos)
+static void mkv_add_seekhead_entry(MatroskaMuxContext *mkv, uint32_t elementid,
+                                   uint64_t filepos)
 {
-    mkv_seekhead_entry *entries = seekhead->entries;
+    mkv_seekhead *seekhead = &mkv->seekhead;
 
-    // don't store more elements than we reserved space for
-    if (seekhead->max_entries > 0 && seekhead->max_entries <= seekhead->num_entries)
-        return -1;
-
-    entries = av_realloc_array(entries, seekhead->num_entries + 1, sizeof(mkv_seekhead_entry));
-    if (!entries)
-        return AVERROR(ENOMEM);
-    seekhead->entries = entries;
+    av_assert1(seekhead->num_entries < MAX_SEEKHEAD_ENTRIES);
 
     seekhead->entries[seekhead->num_entries].elementid    = elementid;
-    seekhead->entries[seekhead->num_entries++].segmentpos = filepos - seekhead->segment_offset;
-
-    return 0;
+    seekhead->entries[seekhead->num_entries++].segmentpos = filepos - mkv->segment_offset;
 }
 
 /**
- * Write the seek head to the file and free it. If a maximum number of
- * elements was specified to mkv_start_seekhead(), the seek head will
- * be written at the location reserved for it. Otherwise, it is written
- * at the current location in the file.
+ * Write the SeekHead to the file at the location reserved for it
+ * and seek to destpos afterwards. When error_on_seek_failure
+ * is not set, failure to seek to the position designated for the
+ * SeekHead is not considered an error and it is presumed that
+ * destpos is the current position; failure to seek to destpos
+ * afterwards is always an error.
  *
- * @return The file offset where the seekhead was written,
- * -1 if an error occurred.
+ * @return 0 on success, < 0 on error.
  */
-static int64_t mkv_write_seekhead(AVIOContext *pb, MatroskaMuxContext *mkv)
+static int mkv_write_seekhead(AVIOContext *pb, MatroskaMuxContext *mkv,
+                              int error_on_seek_failure, int64_t destpos)
 {
-    AVIOContext *dyn_cp;
-    mkv_seekhead *seekhead = mkv->main_seekhead;
-    ebml_master metaseek, seekentry;
-    int64_t currentpos;
-    int i;
+    AVIOContext *dyn_cp = NULL;
+    mkv_seekhead *seekhead = &mkv->seekhead;
+    int64_t remaining, ret64;
+    int i, ret;
 
-    currentpos = avio_tell(pb);
+    if ((ret64 = avio_seek(pb, seekhead->filepos, SEEK_SET)) < 0)
+        return error_on_seek_failure ? ret64 : 0;
 
-    if (seekhead->reserved_size > 0) {
-        if (avio_seek(pb, seekhead->filepos, SEEK_SET) < 0) {
-            currentpos = -1;
-            goto fail;
-        }
-    }
-
-    if (start_ebml_master_crc32(pb, &dyn_cp, mkv, &metaseek, MATROSKA_ID_SEEKHEAD,
-                                seekhead->reserved_size) < 0) {
-        currentpos = -1;
-        goto fail;
-    }
+    ret = start_ebml_master_crc32(&dyn_cp, mkv);
+    if (ret < 0)
+        return ret;
 
     for (i = 0; i < seekhead->num_entries; i++) {
         mkv_seekhead_entry *entry = &seekhead->entries[i];
-
-        seekentry = start_ebml_master(dyn_cp, MATROSKA_ID_SEEKENTRY, MAX_SEEKENTRY_SIZE);
+        ebml_master seekentry = start_ebml_master(dyn_cp, MATROSKA_ID_SEEKENTRY,
+                                                  MAX_SEEKENTRY_SIZE);
 
         put_ebml_id(dyn_cp, MATROSKA_ID_SEEKID);
-        put_ebml_num(dyn_cp, ebml_id_size(entry->elementid), 0);
+        put_ebml_length(dyn_cp, ebml_id_size(entry->elementid), 0);
         put_ebml_id(dyn_cp, entry->elementid);
 
         put_ebml_uint(dyn_cp, MATROSKA_ID_SEEKPOSITION, entry->segmentpos);
         end_ebml_master(dyn_cp, seekentry);
     }
-    end_ebml_master_crc32(pb, &dyn_cp, mkv, metaseek);
+    end_ebml_master_crc32(pb, &dyn_cp, mkv, MATROSKA_ID_SEEKHEAD, 0, 0);
 
-    if (seekhead->reserved_size > 0) {
-        uint64_t remaining = seekhead->filepos + seekhead->reserved_size - avio_tell(pb);
-        put_ebml_void(pb, remaining);
-        avio_seek(pb, currentpos, SEEK_SET);
+    remaining = seekhead->filepos + seekhead->reserved_size - avio_tell(pb);
+    put_ebml_void(pb, remaining);
 
-        currentpos = seekhead->filepos;
-    }
-fail:
-    av_freep(&mkv->main_seekhead->entries);
-    av_freep(&mkv->main_seekhead);
+    if ((ret64 = avio_seek(pb, destpos, SEEK_SET)) < 0)
+        return ret64;
 
-    return currentpos;
+    return 0;
 }
 
-static mkv_cues *mkv_start_cues(int64_t segment_offset)
-{
-    mkv_cues *cues = av_mallocz(sizeof(mkv_cues));
-    if (!cues)
-        return NULL;
-
-    cues->segment_offset = segment_offset;
-    return cues;
-}
-
-static int mkv_add_cuepoint(mkv_cues *cues, int stream, int tracknum, int64_t ts,
+static int mkv_add_cuepoint(MatroskaMuxContext *mkv, int stream, int64_t ts,
                             int64_t cluster_pos, int64_t relative_pos, int64_t duration)
 {
+    mkv_cues *cues = &mkv->cues;
     mkv_cuepoint *entries = cues->entries;
 
     if (ts < 0)
@@ -566,75 +516,62 @@
 
     cues->entries[cues->num_entries].pts           = ts;
     cues->entries[cues->num_entries].stream_idx    = stream;
-    cues->entries[cues->num_entries].tracknum      = tracknum;
-    cues->entries[cues->num_entries].cluster_pos   = cluster_pos - cues->segment_offset;
+    cues->entries[cues->num_entries].cluster_pos   = cluster_pos - mkv->segment_offset;
     cues->entries[cues->num_entries].relative_pos  = relative_pos;
     cues->entries[cues->num_entries++].duration    = duration;
 
     return 0;
 }
 
-static int64_t mkv_write_cues(AVFormatContext *s, mkv_cues *cues, mkv_track *tracks, int num_tracks)
+static int mkv_assemble_cues(AVStream **streams, AVIOContext *dyn_cp,
+                             mkv_cues *cues, mkv_track *tracks, int num_tracks)
 {
-    MatroskaMuxContext *mkv = s->priv_data;
-    AVIOContext *dyn_cp, *pb = s->pb;
-    ebml_master cues_element;
-    int64_t currentpos;
-    int i, j, ret;
+    AVIOContext *cuepoint;
+    int ret;
 
-    currentpos = avio_tell(pb);
-    ret = start_ebml_master_crc32(pb, &dyn_cp, mkv, &cues_element, MATROSKA_ID_CUES, 0);
+    ret = avio_open_dyn_buf(&cuepoint);
     if (ret < 0)
         return ret;
 
-    for (i = 0; i < cues->num_entries; i++) {
-        ebml_master cuepoint, track_positions;
-        mkv_cuepoint *entry = &cues->entries[i];
+    for (mkv_cuepoint *entry = cues->entries, *end = entry + cues->num_entries;
+         entry < end;) {
         uint64_t pts = entry->pts;
-        int ctp_nb = 0;
+        uint8_t *buf;
+        int size;
 
-        // Calculate the number of entries, so we know the element size
-        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].stream_idx;
-            av_assert0(tracknum>=0 && tracknum<num_tracks);
-            if (tracks[tracknum].has_cue && s->streams[tracknum]->codecpar->codec_type != AVMEDIA_TYPE_SUBTITLE)
-                continue;
-            tracks[tracknum].has_cue = 1;
-            ctp_nb ++;
-        }
-
-        cuepoint = start_ebml_master(dyn_cp, MATROSKA_ID_POINTENTRY, MAX_CUEPOINT_SIZE(ctp_nb));
-        put_ebml_uint(dyn_cp, MATROSKA_ID_CUETIME, pts);
+        put_ebml_uint(cuepoint, MATROSKA_ID_CUETIME, pts);
 
         // put all the entries from different tracks that have the exact same
         // timestamp into the same CuePoint
-        for (j = 0; j < num_tracks; j++)
+        for (int 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].stream_idx;
-            av_assert0(tracknum>=0 && tracknum<num_tracks);
-            if (tracks[tracknum].has_cue && s->streams[tracknum]->codecpar->codec_type != AVMEDIA_TYPE_SUBTITLE)
-                continue;
-            tracks[tracknum].has_cue = 1;
-            track_positions = start_ebml_master(dyn_cp, MATROSKA_ID_CUETRACKPOSITION, MAX_CUETRACKPOS_SIZE);
-            put_ebml_uint(dyn_cp, MATROSKA_ID_CUETRACK           , entry[j].tracknum   );
-            put_ebml_uint(dyn_cp, MATROSKA_ID_CUECLUSTERPOSITION , entry[j].cluster_pos);
-            put_ebml_uint(dyn_cp, MATROSKA_ID_CUERELATIVEPOSITION, entry[j].relative_pos);
-            if (entry[j].duration != -1)
-                put_ebml_uint(dyn_cp, MATROSKA_ID_CUEDURATION    , entry[j].duration);
-            end_ebml_master(dyn_cp, track_positions);
-        }
-        i += j - 1;
-        end_ebml_master(dyn_cp, cuepoint);
-    }
-    end_ebml_master_crc32(pb, &dyn_cp, mkv, cues_element);
+        do {
+            ebml_master track_positions;
+            int idx = entry->stream_idx;
 
-    return currentpos;
+            av_assert0(idx >= 0 && idx < num_tracks);
+            if (tracks[idx].has_cue && streams[idx]->codecpar->codec_type != AVMEDIA_TYPE_SUBTITLE)
+                continue;
+            tracks[idx].has_cue = 1;
+            track_positions = start_ebml_master(cuepoint, MATROSKA_ID_CUETRACKPOSITION, MAX_CUETRACKPOS_SIZE);
+            put_ebml_uint(cuepoint, MATROSKA_ID_CUETRACK           , tracks[idx].track_num);
+            put_ebml_uint(cuepoint, MATROSKA_ID_CUECLUSTERPOSITION , entry->cluster_pos);
+            put_ebml_uint(cuepoint, MATROSKA_ID_CUERELATIVEPOSITION, entry->relative_pos);
+            if (entry->duration != -1)
+                put_ebml_uint(cuepoint, MATROSKA_ID_CUEDURATION    , entry->duration);
+            end_ebml_master(cuepoint, track_positions);
+        } while (++entry < end && entry->pts == pts);
+        size = avio_get_dyn_buf(cuepoint, &buf);
+        put_ebml_binary(dyn_cp, MATROSKA_ID_POINTENTRY, buf, size);
+        ffio_reset_dyn_buf(cuepoint);
+    }
+    ffio_free_dyn_buf(&cuepoint);
+
+    return 0;
 }
 
-static int put_xiph_codecpriv(AVFormatContext *s, AVIOContext *pb, AVCodecParameters *par)
+static int put_xiph_codecpriv(AVFormatContext *s, AVIOContext *pb,
+                              const AVCodecParameters *par)
 {
     const uint8_t *header_start[3];
     int header_len[3];
@@ -662,17 +599,17 @@
     return 0;
 }
 
-static int put_wv_codecpriv(AVIOContext *pb, AVCodecParameters *par)
+static int put_wv_codecpriv(AVIOContext *pb, const AVCodecParameters *par)
 {
     if (par->extradata && par->extradata_size == 2)
         avio_write(pb, par->extradata, 2);
     else
-        avio_wl16(pb, 0x403); // fallback to the version mentioned in matroska specs
+        avio_wl16(pb, 0x410); // fallback to the most recent version
     return 0;
 }
 
-static int put_flac_codecpriv(AVFormatContext *s,
-                              AVIOContext *pb, AVCodecParameters *par)
+static int put_flac_codecpriv(AVFormatContext *s, AVIOContext *pb,
+                              const AVCodecParameters *par)
 {
     int write_comment = (par->channel_layout &&
                          !(par->channel_layout & ~0x3ffffULL) &&
@@ -693,9 +630,11 @@
         snprintf(buf, sizeof(buf), "0x%"PRIx64, par->channel_layout);
         av_dict_set(&dict, "WAVEFORMATEXTENSIBLE_CHANNEL_MASK", buf, 0);
 
-        len = ff_vorbiscomment_length(dict, vendor);
-        if (len >= ((1<<24) - 4))
+        len = ff_vorbiscomment_length(dict, vendor, NULL, 0);
+        if (len >= (1 << 24) - 4) {
+            av_dict_free(&dict);
             return AVERROR(EINVAL);
+        }
 
         data = av_malloc(len + 4);
         if (!data) {
@@ -707,7 +646,7 @@
         AV_WB24(data + 1, len);
 
         p = data + 4;
-        ff_vorbiscomment_write(&p, &dict, vendor);
+        ff_vorbiscomment_write(&p, &dict, vendor, NULL, 0);
 
         avio_write(pb, data, len + 4);
 
@@ -718,14 +657,14 @@
     return 0;
 }
 
-static int get_aac_sample_rates(AVFormatContext *s, uint8_t *extradata, int extradata_size,
-                                int *sample_rate, int *output_sample_rate)
+static int get_aac_sample_rates(AVFormatContext *s, const uint8_t *extradata,
+                                int extradata_size, int *sample_rate,
+                                int *output_sample_rate)
 {
     MPEG4AudioConfig mp4ac;
     int ret;
 
-    ret = avpriv_mpeg4audio_get_config(&mp4ac, extradata,
-                                       extradata_size * 8, 1);
+    ret = avpriv_mpeg4audio_get_config2(&mp4ac, extradata, extradata_size, 1, s);
     /* Don't abort if the failure is because of missing extradata. Assume in that
      * case a bitstream filter will provide the muxer with the extradata in the
      * first packet.
@@ -752,7 +691,7 @@
 }
 
 static int mkv_write_native_codecprivate(AVFormatContext *s, AVIOContext *pb,
-                                         AVCodecParameters *par,
+                                         const AVCodecParameters *par,
                                          AVIOContext *dyn_cp)
 {
     switch (par->codec_id) {
@@ -767,9 +706,8 @@
         return ff_isom_write_avcc(dyn_cp, par->extradata,
                                   par->extradata_size);
     case AV_CODEC_ID_HEVC:
-        ff_isom_write_hvcc(dyn_cp, par->extradata,
-                           par->extradata_size, 0);
-        return 0;
+        return ff_isom_write_hvcc(dyn_cp, par->extradata,
+                                  par->extradata_size, 0);
     case AV_CODEC_ID_AV1:
         if (par->extradata_size)
             return ff_isom_write_av1c(dyn_cp, par->extradata,
@@ -863,15 +801,17 @@
         ff_put_wav_header(s, dyn_cp, par, FF_PUT_WAV_HEADER_FORCE_WAVEFORMATEX);
     }
 
-    codecpriv_size = avio_close_dyn_buf(dyn_cp, &codecpriv);
+    codecpriv_size = avio_get_dyn_buf(dyn_cp, &codecpriv);
     if (codecpriv_size)
         put_ebml_binary(pb, MATROSKA_ID_CODECPRIVATE, codecpriv,
                         codecpriv_size);
-    av_free(codecpriv);
+    ffio_free_dyn_buf(&dyn_cp);
     return ret;
 }
 
-static int mkv_write_video_color(AVIOContext *pb, AVCodecParameters *par, AVStream *st) {
+static int mkv_write_video_color(AVIOContext *pb, const AVCodecParameters *par,
+                                 const AVStream *st)
+{
     AVIOContext *dyn_cp;
     uint8_t *colorinfo_ptr;
     int side_data_size = 0;
@@ -921,7 +861,7 @@
                                         &side_data_size);
     if (side_data_size == sizeof(AVMasteringDisplayMetadata)) {
         ebml_master meta_element = start_ebml_master(
-            dyn_cp, MATROSKA_ID_VIDEOCOLORMASTERINGMETA, 0);
+            dyn_cp, MATROSKA_ID_VIDEOCOLORMASTERINGMETA, 10 * (2 + 1 + 8));
         const AVMasteringDisplayMetadata *metadata =
             (const AVMasteringDisplayMetadata*)side_data;
         if (metadata->has_primaries) {
@@ -951,24 +891,21 @@
         end_ebml_master(dyn_cp, meta_element);
     }
 
-    colorinfo_size = avio_close_dyn_buf(dyn_cp, &colorinfo_ptr);
+    colorinfo_size = avio_get_dyn_buf(dyn_cp, &colorinfo_ptr);
     if (colorinfo_size) {
         ebml_master colorinfo = start_ebml_master(pb, MATROSKA_ID_VIDEOCOLOR, colorinfo_size);
         avio_write(pb, colorinfo_ptr, colorinfo_size);
         end_ebml_master(pb, colorinfo);
     }
-    av_free(colorinfo_ptr);
+    ffio_free_dyn_buf(&dyn_cp);
     return 0;
 }
 
 static int mkv_write_video_projection(AVFormatContext *s, AVIOContext *pb,
-                                      AVStream *st)
+                                      const AVStream *st)
 {
-    AVIOContext b;
-    AVIOContext *dyn_cp;
+    ebml_master projection;
     int side_data_size = 0;
-    int ret, projection_size;
-    uint8_t *projection_ptr;
     uint8_t private[20];
 
     const AVSphericalMapping *spherical =
@@ -978,62 +915,58 @@
     if (!side_data_size)
         return 0;
 
-    ret = avio_open_dyn_buf(&dyn_cp);
-    if (ret < 0)
-        return ret;
+    if (spherical->projection != AV_SPHERICAL_EQUIRECTANGULAR      &&
+        spherical->projection != AV_SPHERICAL_EQUIRECTANGULAR_TILE &&
+        spherical->projection != AV_SPHERICAL_CUBEMAP) {
+        av_log(s, AV_LOG_WARNING, "Unknown projection type\n");
+        return 0;
+    }
+
+    // Maximally 4 8-byte elements with id-length 2 + 1 byte length field
+    // and the private data of the AV_SPHERICAL_EQUIRECTANGULAR_TILE case
+    projection = start_ebml_master(pb, MATROSKA_ID_VIDEOPROJECTION,
+                                   4 * (2 + 1 + 8) + (2 + 1 + 20));
 
     switch (spherical->projection) {
     case AV_SPHERICAL_EQUIRECTANGULAR:
-        put_ebml_uint(dyn_cp, MATROSKA_ID_VIDEOPROJECTIONTYPE,
+        put_ebml_uint(pb, MATROSKA_ID_VIDEOPROJECTIONTYPE,
                       MATROSKA_VIDEO_PROJECTION_TYPE_EQUIRECTANGULAR);
         break;
     case AV_SPHERICAL_EQUIRECTANGULAR_TILE:
-        ffio_init_context(&b, private, 20, 1, NULL, NULL, NULL, NULL);
-        put_ebml_uint(dyn_cp, MATROSKA_ID_VIDEOPROJECTIONTYPE,
+        put_ebml_uint(pb, MATROSKA_ID_VIDEOPROJECTIONTYPE,
                       MATROSKA_VIDEO_PROJECTION_TYPE_EQUIRECTANGULAR);
-        avio_wb32(&b, 0); // version + flags
-        avio_wb32(&b, spherical->bound_top);
-        avio_wb32(&b, spherical->bound_bottom);
-        avio_wb32(&b, spherical->bound_left);
-        avio_wb32(&b, spherical->bound_right);
-        put_ebml_binary(dyn_cp, MATROSKA_ID_VIDEOPROJECTIONPRIVATE,
-                        private, avio_tell(&b));
+        AV_WB32(private,      0); // version + flags
+        AV_WB32(private +  4, spherical->bound_top);
+        AV_WB32(private +  8, spherical->bound_bottom);
+        AV_WB32(private + 12, spherical->bound_left);
+        AV_WB32(private + 16, spherical->bound_right);
+        put_ebml_binary(pb, MATROSKA_ID_VIDEOPROJECTIONPRIVATE,
+                        private, 20);
         break;
     case AV_SPHERICAL_CUBEMAP:
-        ffio_init_context(&b, private, 12, 1, NULL, NULL, NULL, NULL);
-        put_ebml_uint(dyn_cp, MATROSKA_ID_VIDEOPROJECTIONTYPE,
+        put_ebml_uint(pb, MATROSKA_ID_VIDEOPROJECTIONTYPE,
                       MATROSKA_VIDEO_PROJECTION_TYPE_CUBEMAP);
-        avio_wb32(&b, 0); // version + flags
-        avio_wb32(&b, 0); // layout
-        avio_wb32(&b, spherical->padding);
-        put_ebml_binary(dyn_cp, MATROSKA_ID_VIDEOPROJECTIONPRIVATE,
-                        private, avio_tell(&b));
+        AV_WB32(private,     0); // version + flags
+        AV_WB32(private + 4, 0); // layout
+        AV_WB32(private + 8, spherical->padding);
+        put_ebml_binary(pb, MATROSKA_ID_VIDEOPROJECTIONPRIVATE,
+                        private, 12);
         break;
     default:
-        av_log(s, AV_LOG_WARNING, "Unknown projection type\n");
-        goto end;
+        av_assert0(0);
     }
 
     if (spherical->yaw)
-        put_ebml_float(dyn_cp, MATROSKA_ID_VIDEOPROJECTIONPOSEYAW,
+        put_ebml_float(pb, MATROSKA_ID_VIDEOPROJECTIONPOSEYAW,
                        (double) spherical->yaw   / (1 << 16));
     if (spherical->pitch)
-        put_ebml_float(dyn_cp, MATROSKA_ID_VIDEOPROJECTIONPOSEPITCH,
+        put_ebml_float(pb, MATROSKA_ID_VIDEOPROJECTIONPOSEPITCH,
                        (double) spherical->pitch / (1 << 16));
     if (spherical->roll)
-        put_ebml_float(dyn_cp, MATROSKA_ID_VIDEOPROJECTIONPOSEROLL,
+        put_ebml_float(pb, MATROSKA_ID_VIDEOPROJECTIONPOSEROLL,
                        (double) spherical->roll  / (1 << 16));
 
-end:
-    projection_size = avio_close_dyn_buf(dyn_cp, &projection_ptr);
-    if (projection_size) {
-        ebml_master projection = start_ebml_master(pb,
-                                                   MATROSKA_ID_VIDEOPROJECTION,
-                                                   projection_size);
-        avio_write(pb, projection_ptr, projection_size);
-        end_ebml_master(pb, projection);
-    }
-    av_freep(&projection_ptr);
+    end_ebml_master(pb, projection);
 
     return 0;
 }
@@ -1082,7 +1015,7 @@
 {
     int i;
     int ret = 0;
-    AVDictionaryEntry *tag;
+    const AVDictionaryEntry *tag;
     MatroskaVideoStereoModeType format = MATROSKA_VIDEO_STEREOMODE_TYPE_NB;
 
     *h_width = 1;
@@ -1176,36 +1109,23 @@
 }
 
 static int mkv_write_track(AVFormatContext *s, MatroskaMuxContext *mkv,
-                           int i, AVIOContext *pb, int default_stream_exists)
+                           AVStream *st, mkv_track *track, AVIOContext *pb,
+                           int is_default)
 {
-    AVStream *st = s->streams[i];
     AVCodecParameters *par = st->codecpar;
-    ebml_master subinfo, track;
+    ebml_master subinfo, track_master;
     int native_id = 0;
     int qt_id = 0;
-    int bit_depth = av_get_bits_per_sample(par->codec_id);
+    int bit_depth;
     int sample_rate = par->sample_rate;
     int output_sample_rate = 0;
     int display_width_div = 1;
     int display_height_div = 1;
     int j, ret;
-    AVDictionaryEntry *tag;
+    const AVDictionaryEntry *tag;
 
-    if (par->codec_type == AVMEDIA_TYPE_ATTACHMENT) {
-        mkv->have_attachments = 1;
+    if (par->codec_type == AVMEDIA_TYPE_ATTACHMENT)
         return 0;
-    }
-
-    if (par->codec_type == AVMEDIA_TYPE_AUDIO) {
-        if (!bit_depth && par->codec_id != AV_CODEC_ID_ADPCM_G726) {
-            if (par->bits_per_raw_sample)
-                bit_depth = par->bits_per_raw_sample;
-            else
-                bit_depth = av_get_bytes_per_sample(par->format) << 3;
-        }
-        if (!bit_depth)
-            bit_depth = par->bits_per_coded_sample;
-    }
 
     if (par->codec_id == AV_CODEC_ID_AAC) {
         ret = get_aac_sample_rates(s, par->extradata, par->extradata_size, &sample_rate,
@@ -1214,26 +1134,21 @@
             return ret;
     }
 
-    track = start_ebml_master(pb, MATROSKA_ID_TRACKENTRY, 0);
-    put_ebml_uint (pb, MATROSKA_ID_TRACKNUMBER,
-                   mkv->is_dash ? mkv->dash_track_number : i + 1);
-    put_ebml_uint (pb, MATROSKA_ID_TRACKUID,
-                   mkv->is_dash ? mkv->dash_track_number : i + 1);
-    put_ebml_uint (pb, MATROSKA_ID_TRACKFLAGLACING , 0);    // no lacing (yet)
+    track_master = start_ebml_master(pb, MATROSKA_ID_TRACKENTRY, 0);
+    put_ebml_uint(pb, MATROSKA_ID_TRACKNUMBER, track->track_num);
+    put_ebml_uid (pb, MATROSKA_ID_TRACKUID,    track->uid);
+    put_ebml_uint(pb, MATROSKA_ID_TRACKFLAGLACING, 0);    // no lacing (yet)
 
     if ((tag = av_dict_get(st->metadata, "title", NULL, 0)))
         put_ebml_string(pb, MATROSKA_ID_TRACKNAME, tag->value);
     tag = av_dict_get(st->metadata, "language", NULL, 0);
-    if (mkv->mode != MODE_WEBM || par->codec_id != AV_CODEC_ID_WEBVTT) {
-        put_ebml_string(pb, MATROSKA_ID_TRACKLANGUAGE, tag && tag->value ? tag->value:"und");
-    } else if (tag && tag->value) {
-        put_ebml_string(pb, MATROSKA_ID_TRACKLANGUAGE, tag->value);
-    }
+    put_ebml_string(pb, MATROSKA_ID_TRACKLANGUAGE,
+                    tag && tag->value ? tag->value : "und");
 
     // The default value for TRACKFLAGDEFAULT is 1, so add element
     // if we need to clear it.
-    if (default_stream_exists && !(st->disposition & AV_DISPOSITION_DEFAULT))
-        put_ebml_uint(pb, MATROSKA_ID_TRACKFLAGDEFAULT, !!(st->disposition & AV_DISPOSITION_DEFAULT));
+    if (!is_default)
+        put_ebml_uint(pb, MATROSKA_ID_TRACKFLAGDEFAULT, 0);
 
     if (st->disposition & AV_DISPOSITION_FORCED)
         put_ebml_uint(pb, MATROSKA_ID_TRACKFLAGFORCED, 1);
@@ -1293,24 +1208,6 @@
         }
     }
 
-    if (par->codec_type == AVMEDIA_TYPE_AUDIO && par->initial_padding && par->codec_id == AV_CODEC_ID_OPUS) {
-        int64_t codecdelay = av_rescale_q(par->initial_padding,
-                                          (AVRational){ 1, 48000 },
-                                          (AVRational){ 1, 1000000000 });
-        if (codecdelay < 0) {
-            av_log(s, AV_LOG_ERROR, "Initial padding is invalid\n");
-            return AVERROR(EINVAL);
-        }
-//         mkv->tracks[i].ts_offset = av_rescale_q(par->initial_padding,
-//                                                 (AVRational){ 1, par->sample_rate },
-//                                                 st->time_base);
-
-        put_ebml_uint(pb, MATROSKA_ID_CODECDELAY, codecdelay);
-    }
-    if (par->codec_id == AV_CODEC_ID_OPUS) {
-        put_ebml_uint(pb, MATROSKA_ID_SEEKPREROLL, OPUS_SEEK_PREROLL);
-    }
-
     switch (par->codec_type) {
     case AVMEDIA_TYPE_VIDEO:
         mkv->have_video = 1;
@@ -1319,6 +1216,9 @@
         if(   st->avg_frame_rate.num > 0 && st->avg_frame_rate.den > 0
            && av_cmp_q(av_inv_q(st->avg_frame_rate), st->time_base) > 0)
             put_ebml_uint(pb, MATROSKA_ID_TRACKDEFAULTDURATION, 1000000000LL * st->avg_frame_rate.den / st->avg_frame_rate.num);
+        else if(   st->r_frame_rate.num > 0 && st->r_frame_rate.den > 0
+                && av_cmp_q(av_inv_q(st->r_frame_rate), st->time_base) > 0)
+            put_ebml_uint(pb, MATROSKA_ID_TRACKDEFAULTDURATION, 1000000000LL * st->r_frame_rate.den / st->r_frame_rate.num);
 
         if (!native_id &&
             ff_codec_get_tag(ff_codec_movvideo_tags, par->codec_id) &&
@@ -1333,7 +1233,7 @@
         else if (!native_id) {
             // if there is no mkv-specific codec ID, use VFW mode
             put_ebml_string(pb, MATROSKA_ID_CODECID, "V_MS/VFW/FOURCC");
-            mkv->tracks[i].write_dts = 1;
+            track->write_dts = 1;
             s->internal->avoid_negative_ts_use_pts = 0;
         }
 
@@ -1401,19 +1301,46 @@
         break;
 
     case AVMEDIA_TYPE_AUDIO:
+        if (par->initial_padding && par->codec_id == AV_CODEC_ID_OPUS) {
+            int64_t codecdelay = av_rescale_q(par->initial_padding,
+                                              (AVRational){ 1, 48000 },
+                                              (AVRational){ 1, 1000000000 });
+            if (codecdelay < 0) {
+                av_log(s, AV_LOG_ERROR, "Initial padding is invalid\n");
+                return AVERROR(EINVAL);
+            }
+//            track->ts_offset = av_rescale_q(par->initial_padding,
+//                                            (AVRational){ 1, par->sample_rate },
+//                                            st->time_base);
+
+            put_ebml_uint(pb, MATROSKA_ID_CODECDELAY, codecdelay);
+        }
+        if (par->codec_id == AV_CODEC_ID_OPUS)
+            put_ebml_uint(pb, MATROSKA_ID_SEEKPREROLL, OPUS_SEEK_PREROLL);
+
         put_ebml_uint(pb, MATROSKA_ID_TRACKTYPE, MATROSKA_TRACK_TYPE_AUDIO);
 
         if (!native_id)
             // no mkv-specific ID, use ACM mode
             put_ebml_string(pb, MATROSKA_ID_CODECID, "A_MS/ACM");
 
-        subinfo = start_ebml_master(pb, MATROSKA_ID_TRACKAUDIO, 0);
+        subinfo = start_ebml_master(pb, MATROSKA_ID_TRACKAUDIO, 6 + 4 * 9);
         put_ebml_uint  (pb, MATROSKA_ID_AUDIOCHANNELS    , par->channels);
 
-        mkv->tracks[i].sample_rate_offset = avio_tell(pb);
+        track->sample_rate_offset = avio_tell(pb);
         put_ebml_float (pb, MATROSKA_ID_AUDIOSAMPLINGFREQ, sample_rate);
         if (output_sample_rate)
             put_ebml_float(pb, MATROSKA_ID_AUDIOOUTSAMPLINGFREQ, output_sample_rate);
+
+        bit_depth = av_get_bits_per_sample(par->codec_id);
+        if (!bit_depth && par->codec_id != AV_CODEC_ID_ADPCM_G726) {
+            if (par->bits_per_raw_sample)
+                bit_depth = par->bits_per_raw_sample;
+            else
+                bit_depth = av_get_bytes_per_sample(par->format) << 3;
+        }
+        if (!bit_depth)
+            bit_depth = par->bits_per_coded_sample;
         if (bit_depth)
             put_ebml_uint(pb, MATROSKA_ID_AUDIOBITDEPTH, bit_depth);
         end_ebml_master(pb, subinfo);
@@ -1436,13 +1363,13 @@
     }
 
     if (mkv->mode != MODE_WEBM || par->codec_id != AV_CODEC_ID_WEBVTT) {
-        mkv->tracks[i].codecpriv_offset = avio_tell(pb);
+        track->codecpriv_offset = avio_tell(pb);
         ret = mkv_write_codecprivate(s, pb, par, native_id, qt_id);
         if (ret < 0)
             return ret;
     }
 
-    end_ebml_master(pb, track);
+    end_ebml_master(pb, track_master);
 
     return 0;
 }
@@ -1451,30 +1378,63 @@
 {
     MatroskaMuxContext *mkv = s->priv_data;
     AVIOContext *pb = s->pb;
-    int i, ret, default_stream_exists = 0;
+    int i, ret, video_default_idx, audio_default_idx, subtitle_default_idx;
 
-    ret = mkv_add_seekhead_entry(mkv->main_seekhead, MATROSKA_ID_TRACKS, avio_tell(pb));
+    if (mkv->nb_attachments == s->nb_streams)
+        return 0;
+
+    mkv_add_seekhead_entry(mkv, MATROSKA_ID_TRACKS, avio_tell(pb));
+
+    ret = start_ebml_master_crc32(&mkv->tracks_bc, mkv);
     if (ret < 0)
         return ret;
 
-    ret = start_ebml_master_crc32(pb, &mkv->tracks_bc, mkv, &mkv->tracks_master, MATROSKA_ID_TRACKS, 0);
-    if (ret < 0)
-        return ret;
+    if (mkv->default_mode != DEFAULT_MODE_PASSTHROUGH) {
+        int video_idx, audio_idx, subtitle_idx;
 
-    for (i = 0; i < s->nb_streams; i++) {
-        AVStream *st = s->streams[i];
-        default_stream_exists |= st->disposition & AV_DISPOSITION_DEFAULT;
+        video_idx    = video_default_idx    =
+        audio_idx    = audio_default_idx    =
+        subtitle_idx = subtitle_default_idx = -1;
+
+        for (i = s->nb_streams - 1; i >= 0; i--) {
+            AVStream *st = s->streams[i];
+
+            switch (st->codecpar->codec_type) {
+#define CASE(type, variable)                                  \
+            case AVMEDIA_TYPE_ ## type:                       \
+                variable ## _idx = i;                         \
+                if (st->disposition & AV_DISPOSITION_DEFAULT) \
+                    variable ## _default_idx = i;             \
+                break;
+            CASE(VIDEO,    video)
+            CASE(AUDIO,    audio)
+            CASE(SUBTITLE, subtitle)
+#undef CASE
+            }
+        }
+
+        video_default_idx = FFMAX(video_default_idx, video_idx);
+        audio_default_idx = FFMAX(audio_default_idx, audio_idx);
+        if (mkv->default_mode != DEFAULT_MODE_INFER_NO_SUBS)
+            subtitle_default_idx = FFMAX(subtitle_default_idx, subtitle_idx);
     }
     for (i = 0; i < s->nb_streams; i++) {
-        ret = mkv_write_track(s, mkv, i, mkv->tracks_bc, default_stream_exists);
+        AVStream *st = s->streams[i];
+        int is_default = mkv->default_mode == DEFAULT_MODE_PASSTHROUGH ?
+                             st->disposition & AV_DISPOSITION_DEFAULT  :
+                             i == video_default_idx || i == audio_default_idx ||
+                             i == subtitle_default_idx;
+        ret = mkv_write_track(s, mkv, st, &mkv->tracks[i],
+                              mkv->tracks_bc, is_default);
         if (ret < 0)
             return ret;
     }
 
     if ((pb->seekable & AVIO_SEEKABLE_NORMAL) && !mkv->is_live)
-        end_ebml_master_crc32_preliminary(pb, &mkv->tracks_bc, mkv, mkv->tracks_master);
+        end_ebml_master_crc32_preliminary(pb, mkv->tracks_bc,
+                                          MATROSKA_ID_TRACKS, &mkv->tracks_pos);
     else
-        end_ebml_master_crc32(pb, &mkv->tracks_bc, mkv, mkv->tracks_master);
+        end_ebml_master_crc32(pb, &mkv->tracks_bc, mkv, MATROSKA_ID_TRACKS, 0, 0);
 
     return 0;
 }
@@ -1482,31 +1442,30 @@
 static int mkv_write_chapters(AVFormatContext *s)
 {
     MatroskaMuxContext *mkv = s->priv_data;
-    AVIOContext *dyn_cp, *pb = s->pb;
-    ebml_master chapters, editionentry;
+    AVIOContext *dyn_cp = NULL, *pb = s->pb;
+    ebml_master editionentry;
     AVRational scale = {1, 1E9};
     int i, ret;
 
     if (!s->nb_chapters || mkv->wrote_chapters)
         return 0;
 
-    ret = mkv_add_seekhead_entry(mkv->main_seekhead, MATROSKA_ID_CHAPTERS, avio_tell(pb));
-    if (ret < 0) return ret;
+    mkv_add_seekhead_entry(mkv, MATROSKA_ID_CHAPTERS, avio_tell(pb));
 
-    ret = start_ebml_master_crc32(pb, &dyn_cp, mkv, &chapters, MATROSKA_ID_CHAPTERS, 0);
-    if (ret < 0) return ret;
+    ret = start_ebml_master_crc32(&dyn_cp, mkv);
+    if (ret < 0)
+        return ret;
 
     editionentry = start_ebml_master(dyn_cp, MATROSKA_ID_EDITIONENTRY, 0);
-    if (mkv->mode != MODE_WEBM) {
+    if (mkv->mode != MODE_WEBM)
         put_ebml_uint(dyn_cp, MATROSKA_ID_EDITIONFLAGDEFAULT, 1);
-        put_ebml_uint(dyn_cp, MATROSKA_ID_EDITIONFLAGHIDDEN , 0);
-    }
+
     for (i = 0; i < s->nb_chapters; i++) {
         ebml_master chapteratom, chapterdisplay;
-        AVChapter *c     = s->chapters[i];
+        const AVChapter *c   = s->chapters[i];
         int64_t chapterstart = av_rescale_q(c->start, c->time_base, scale);
         int64_t chapterend   = av_rescale_q(c->end,   c->time_base, scale);
-        AVDictionaryEntry *t = NULL;
+        const AVDictionaryEntry *t;
         if (chapterstart < 0 || chapterstart > chapterend || chapterend < 0) {
             av_log(s, AV_LOG_ERROR,
                    "Invalid chapter start (%"PRId64") or end (%"PRId64").\n",
@@ -1515,13 +1474,10 @@
         }
 
         chapteratom = start_ebml_master(dyn_cp, MATROSKA_ID_CHAPTERATOM, 0);
-        put_ebml_uint(dyn_cp, MATROSKA_ID_CHAPTERUID, c->id + mkv->chapter_id_offset);
+        put_ebml_uint(dyn_cp, MATROSKA_ID_CHAPTERUID,
+                      (uint32_t)c->id + (uint64_t)mkv->chapter_id_offset);
         put_ebml_uint(dyn_cp, MATROSKA_ID_CHAPTERTIMESTART, chapterstart);
         put_ebml_uint(dyn_cp, MATROSKA_ID_CHAPTERTIMEEND, chapterend);
-        if (mkv->mode != MODE_WEBM) {
-            put_ebml_uint(dyn_cp, MATROSKA_ID_CHAPTERFLAGHIDDEN , 0);
-            put_ebml_uint(dyn_cp, MATROSKA_ID_CHAPTERFLAGENABLED, 1);
-        }
         if ((t = av_dict_get(c->metadata, "title", NULL, 0))) {
             chapterdisplay = start_ebml_master(dyn_cp, MATROSKA_ID_CHAPTERDISPLAY, 0);
             put_ebml_string(dyn_cp, MATROSKA_ID_CHAPSTRING, t->value);
@@ -1531,13 +1487,13 @@
         end_ebml_master(dyn_cp, chapteratom);
     }
     end_ebml_master(dyn_cp, editionentry);
-    end_ebml_master_crc32(pb, &dyn_cp, mkv, chapters);
+    end_ebml_master_crc32(pb, &dyn_cp, mkv, MATROSKA_ID_CHAPTERS, 0, 0);
 
     mkv->wrote_chapters = 1;
     return 0;
 }
 
-static int mkv_write_simpletag(AVIOContext *pb, AVDictionaryEntry *t)
+static int mkv_write_simpletag(AVIOContext *pb, const AVDictionaryEntry *t)
 {
     uint8_t *key = av_strdup(t->key);
     uint8_t *p   = key;
@@ -1571,32 +1527,32 @@
     return 0;
 }
 
-static int mkv_write_tag_targets(AVFormatContext *s,
-                                 unsigned int elementid, unsigned int uid,
-                                 ebml_master *tags, ebml_master* tag)
+static int mkv_write_tag_targets(AVFormatContext *s, uint32_t elementid,
+                                 uint64_t uid, ebml_master *tag)
 {
     AVIOContext *pb;
     MatroskaMuxContext *mkv = s->priv_data;
     ebml_master targets;
     int ret;
 
-    if (!tags->pos) {
-        ret = mkv_add_seekhead_entry(mkv->main_seekhead, MATROSKA_ID_TAGS, avio_tell(s->pb));
-        if (ret < 0) return ret;
+    if (!mkv->tags_bc) {
+        mkv_add_seekhead_entry(mkv, MATROSKA_ID_TAGS, avio_tell(s->pb));
 
-        start_ebml_master_crc32(s->pb, &mkv->tags_bc, mkv, tags, MATROSKA_ID_TAGS, 0);
+        ret = start_ebml_master_crc32(&mkv->tags_bc, mkv);
+        if (ret < 0)
+            return ret;
     }
     pb = mkv->tags_bc;
 
-    *tag     = start_ebml_master(pb, MATROSKA_ID_TAG,       0);
-    targets = start_ebml_master(pb, MATROSKA_ID_TAGTARGETS, 0);
+    *tag    = start_ebml_master(pb, MATROSKA_ID_TAG,        0);
+    targets = start_ebml_master(pb, MATROSKA_ID_TAGTARGETS, 4 + 1 + 8);
     if (elementid)
-        put_ebml_uint(pb, elementid, uid);
+        put_ebml_uid(pb, elementid, uid);
     end_ebml_master(pb, targets);
     return 0;
 }
 
-static int mkv_check_tag_name(const char *name, unsigned int elementid)
+static int mkv_check_tag_name(const char *name, uint32_t elementid)
 {
     return av_strcasecmp(name, "title") &&
            av_strcasecmp(name, "stereo_mode") &&
@@ -1610,15 +1566,15 @@
              av_strcasecmp(name, "mimetype")));
 }
 
-static int mkv_write_tag(AVFormatContext *s, AVDictionary *m, unsigned int elementid,
-                         unsigned int uid, ebml_master *tags)
+static int mkv_write_tag(AVFormatContext *s, const AVDictionary *m,
+                         uint32_t elementid, uint64_t uid, ebml_master *tag)
 {
     MatroskaMuxContext *mkv = s->priv_data;
-    ebml_master tag;
+    const AVDictionaryEntry *t = NULL;
+    ebml_master tag2;
     int ret;
-    AVDictionaryEntry *t = NULL;
 
-    ret = mkv_write_tag_targets(s, elementid, uid, tags, &tag);
+    ret = mkv_write_tag_targets(s, elementid, uid, tag ? tag : &tag2);
     if (ret < 0)
         return ret;
 
@@ -1630,13 +1586,15 @@
         }
     }
 
-    end_ebml_master(mkv->tags_bc, tag);
+    if (!tag)
+        end_ebml_master(mkv->tags_bc, tag2);
+
     return 0;
 }
 
-static int mkv_check_tag(AVDictionary *m, unsigned int elementid)
+static int mkv_check_tag(const AVDictionary *m, uint32_t elementid)
 {
-    AVDictionaryEntry *t = NULL;
+    const AVDictionaryEntry *t = NULL;
 
     while ((t = av_dict_get(m, "", t, AV_DICT_IGNORE_SUFFIX)))
         if (mkv_check_tag_name(t->key, elementid))
@@ -1648,50 +1606,47 @@
 static int mkv_write_tags(AVFormatContext *s)
 {
     MatroskaMuxContext *mkv = s->priv_data;
+    ebml_master tag, *tagp;
     int i, ret;
 
     ff_metadata_conv_ctx(s, ff_mkv_metadata_conv, NULL);
 
     if (mkv_check_tag(s->metadata, 0)) {
-        ret = mkv_write_tag(s, s->metadata, 0, 0, &mkv->tags);
-        if (ret < 0) return ret;
+        ret = mkv_write_tag(s, s->metadata, 0, 0, NULL);
+        if (ret < 0)
+            return ret;
     }
 
+    tagp = (s->pb->seekable & AVIO_SEEKABLE_NORMAL) && !mkv->is_live ? &tag : NULL;
     for (i = 0; i < s->nb_streams; i++) {
-        AVStream *st = s->streams[i];
+        const AVStream *st = s->streams[i];
+        mkv_track *track = &mkv->tracks[i];
 
         if (st->codecpar->codec_type == AVMEDIA_TYPE_ATTACHMENT)
             continue;
 
-        if (!mkv_check_tag(st->metadata, MATROSKA_ID_TAGTARGETS_TRACKUID))
+        if (!tagp && !mkv_check_tag(st->metadata, MATROSKA_ID_TAGTARGETS_TRACKUID))
             continue;
 
-        ret = mkv_write_tag(s, st->metadata, MATROSKA_ID_TAGTARGETS_TRACKUID, i + 1, &mkv->tags);
-        if (ret < 0) return ret;
-    }
+        ret = mkv_write_tag(s, st->metadata, MATROSKA_ID_TAGTARGETS_TRACKUID,
+                            track->uid, tagp);
+        if (ret < 0)
+            return ret;
 
-    if ((s->pb->seekable & AVIO_SEEKABLE_NORMAL) && !mkv->is_live) {
-        for (i = 0; i < s->nb_streams; i++) {
-            AVIOContext *pb;
-            AVStream *st = s->streams[i];
-            ebml_master tag_target;
-            ebml_master tag;
+        if (tagp) {
+            AVIOContext *pb = mkv->tags_bc;
+            ebml_master simpletag;
 
-            if (st->codecpar->codec_type == AVMEDIA_TYPE_ATTACHMENT)
-                continue;
-
-            mkv_write_tag_targets(s, MATROSKA_ID_TAGTARGETS_TRACKUID, i + 1, &mkv->tags, &tag_target);
-            pb = mkv->tags_bc;
-
-            tag = start_ebml_master(pb, MATROSKA_ID_SIMPLETAG, 0);
+            simpletag = start_ebml_master(pb, MATROSKA_ID_SIMPLETAG,
+                                          2 + 1 + 8 + 23);
             put_ebml_string(pb, MATROSKA_ID_TAGNAME, "DURATION");
-            mkv->stream_duration_offsets[i] = avio_tell(pb);
+            track->duration_offset = avio_tell(pb);
 
             // Reserve space to write duration as a 20-byte string.
             // 2 (ebml id) + 1 (data size) + 20 (data)
             put_ebml_void(pb, 23);
+            end_ebml_master(pb, simpletag);
             end_ebml_master(pb, tag);
-            end_ebml_master(pb, tag_target);
         }
     }
 
@@ -1702,31 +1657,38 @@
             if (!mkv_check_tag(ch->metadata, MATROSKA_ID_TAGTARGETS_CHAPTERUID))
                 continue;
 
-            ret = mkv_write_tag(s, ch->metadata, MATROSKA_ID_TAGTARGETS_CHAPTERUID, ch->id + mkv->chapter_id_offset, &mkv->tags);
+            ret = mkv_write_tag(s, ch->metadata, MATROSKA_ID_TAGTARGETS_CHAPTERUID,
+                                (uint32_t)ch->id + (uint64_t)mkv->chapter_id_offset,
+                                NULL);
             if (ret < 0)
                 return ret;
         }
     }
 
-    if (mkv->have_attachments && mkv->mode != MODE_WEBM) {
-        for (i = 0; i < mkv->attachments->num_entries; i++) {
-            mkv_attachment *attachment = &mkv->attachments->entries[i];
-            AVStream *st = s->streams[attachment->stream_idx];
+    if (mkv->nb_attachments && mkv->mode != MODE_WEBM) {
+        for (i = 0; i < s->nb_streams; i++) {
+            const mkv_track *track = &mkv->tracks[i];
+            const AVStream     *st = s->streams[i];
+
+            if (st->codecpar->codec_type != AVMEDIA_TYPE_ATTACHMENT)
+                continue;
 
             if (!mkv_check_tag(st->metadata, MATROSKA_ID_TAGTARGETS_ATTACHUID))
                 continue;
 
-            ret = mkv_write_tag(s, st->metadata, MATROSKA_ID_TAGTARGETS_ATTACHUID, attachment->fileuid, &mkv->tags);
+            ret = mkv_write_tag(s, st->metadata, MATROSKA_ID_TAGTARGETS_ATTACHUID,
+                                track->uid, NULL);
             if (ret < 0)
                 return ret;
         }
     }
 
-    if (mkv->tags.pos) {
+    if (mkv->tags_bc) {
         if ((s->pb->seekable & AVIO_SEEKABLE_NORMAL) && !mkv->is_live)
-            end_ebml_master_crc32_preliminary(s->pb, &mkv->tags_bc, mkv, mkv->tags);
+            end_ebml_master_crc32_preliminary(s->pb, mkv->tags_bc,
+                                              MATROSKA_ID_TAGS, &mkv->tags_pos);
         else
-            end_ebml_master_crc32(s->pb, &mkv->tags_bc, mkv, mkv->tags);
+            end_ebml_master_crc32(s->pb, &mkv->tags_bc, mkv, MATROSKA_ID_TAGS, 0, 0);
     }
     return 0;
 }
@@ -1734,42 +1696,28 @@
 static int mkv_write_attachments(AVFormatContext *s)
 {
     MatroskaMuxContext *mkv = s->priv_data;
-    AVIOContext *dyn_cp, *pb = s->pb;
-    ebml_master attachments;
-    AVLFG c;
+    AVIOContext *dyn_cp = NULL, *pb = s->pb;
     int i, ret;
 
-    if (!mkv->have_attachments)
+    if (!mkv->nb_attachments)
         return 0;
 
-    mkv->attachments = av_mallocz(sizeof(*mkv->attachments));
-    if (!mkv->attachments)
-        return AVERROR(ENOMEM);
+    mkv_add_seekhead_entry(mkv, MATROSKA_ID_ATTACHMENTS, avio_tell(pb));
 
-    av_lfg_init(&c, av_get_random_seed());
-
-    ret = mkv_add_seekhead_entry(mkv->main_seekhead, MATROSKA_ID_ATTACHMENTS, avio_tell(pb));
-    if (ret < 0) return ret;
-
-    ret = start_ebml_master_crc32(pb, &dyn_cp, mkv, &attachments, MATROSKA_ID_ATTACHMENTS, 0);
-    if (ret < 0) return ret;
+    ret = start_ebml_master_crc32(&dyn_cp, mkv);
+    if (ret < 0)
+        return ret;
 
     for (i = 0; i < s->nb_streams; i++) {
-        AVStream *st = s->streams[i];
+        const AVStream *st = s->streams[i];
+        mkv_track *track = &mkv->tracks[i];
         ebml_master attached_file;
-        mkv_attachment *attachment = mkv->attachments->entries;
-        AVDictionaryEntry *t;
+        const AVDictionaryEntry *t;
         const char *mimetype = NULL;
-        uint32_t fileuid;
 
         if (st->codecpar->codec_type != AVMEDIA_TYPE_ATTACHMENT)
             continue;
 
-        attachment = av_realloc_array(attachment, mkv->attachments->num_entries + 1, sizeof(mkv_attachment));
-        if (!attachment)
-            return AVERROR(ENOMEM);
-        mkv->attachments->entries = attachment;
-
         attached_file = start_ebml_master(dyn_cp, MATROSKA_ID_ATTACHEDFILE, 0);
 
         if (t = av_dict_get(st->metadata, "title", NULL, 0))
@@ -1782,17 +1730,11 @@
         if (t = av_dict_get(st->metadata, "mimetype", NULL, 0))
             mimetype = t->value;
         else if (st->codecpar->codec_id != AV_CODEC_ID_NONE ) {
-            int i;
-            for (i = 0; ff_mkv_mime_tags[i].id != AV_CODEC_ID_NONE; i++)
-                if (ff_mkv_mime_tags[i].id == st->codecpar->codec_id) {
-                    mimetype = ff_mkv_mime_tags[i].str;
-                    break;
-                }
-            for (i = 0; ff_mkv_image_mime_tags[i].id != AV_CODEC_ID_NONE; i++)
-                if (ff_mkv_image_mime_tags[i].id == st->codecpar->codec_id) {
-                    mimetype = ff_mkv_image_mime_tags[i].str;
-                    break;
-                }
+            const AVCodecDescriptor *desc = avcodec_descriptor_get(st->codecpar->codec_id);
+            if (desc && desc->mime_types) {
+                mimetype = desc->mime_types[0];
+            } else if (st->codecpar->codec_id == AV_CODEC_ID_TEXT)
+                mimetype = "text/plain";
         }
         if (!mimetype) {
             av_log(s, AV_LOG_ERROR, "Attachment stream %d has no mimetype tag and "
@@ -1800,50 +1742,31 @@
             return AVERROR(EINVAL);
         }
 
-        if (s->flags & AVFMT_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->codecpar->extradata, st->codecpar->extradata_size);
-            av_sha_final(sha, digest);
-            av_free(sha);
-            fileuid = AV_RL32(digest);
-        } else {
-            fileuid = av_lfg_get(&c);
-        }
-        av_log(s, AV_LOG_VERBOSE, "Using %.8"PRIx32" for attachment %d\n",
-               fileuid, mkv->attachments->num_entries);
-
         put_ebml_string(dyn_cp, MATROSKA_ID_FILEMIMETYPE, mimetype);
         put_ebml_binary(dyn_cp, MATROSKA_ID_FILEDATA, st->codecpar->extradata, st->codecpar->extradata_size);
-        put_ebml_uint(dyn_cp, MATROSKA_ID_FILEUID, fileuid);
+        put_ebml_uid(dyn_cp, MATROSKA_ID_FILEUID, track->uid);
         end_ebml_master(dyn_cp, attached_file);
-
-        mkv->attachments->entries[mkv->attachments->num_entries].stream_idx = i;
-        mkv->attachments->entries[mkv->attachments->num_entries++].fileuid  = fileuid;
     }
-    end_ebml_master_crc32(pb, &dyn_cp, mkv, attachments);
+    end_ebml_master_crc32(pb, &dyn_cp, mkv, MATROSKA_ID_ATTACHMENTS, 0, 0);
 
     return 0;
 }
 
 static int64_t get_metadata_duration(AVFormatContext *s)
 {
-    int i = 0;
+    const AVDictionaryEntry *duration = av_dict_get(s->metadata, "DURATION",
+                                                    NULL, 0);
     int64_t max = 0;
     int64_t us;
 
-    AVDictionaryEntry *explicitDuration = av_dict_get(s->metadata, "DURATION", NULL, 0);
-    if (explicitDuration && (av_parse_time(&us, explicitDuration->value, 1) == 0) && us > 0) {
+    if (duration && (av_parse_time(&us, duration->value, 1) == 0) && us > 0) {
         av_log(s, AV_LOG_DEBUG, "get_metadata_duration found duration in context metadata: %" PRId64 "\n", us);
         return us;
     }
 
-    for (i = 0; i < s->nb_streams; i++) {
+    for (unsigned i = 0; i < s->nb_streams; i++) {
         int64_t us;
-        AVDictionaryEntry *duration = av_dict_get(s->streams[i]->metadata, "DURATION", NULL, 0);
+        duration = av_dict_get(s->streams[i]->metadata, "DURATION", NULL, 0);
 
         if (duration && (av_parse_time(&us, duration->value, 1) == 0))
             max = FFMAX(max, us);
@@ -1858,15 +1781,10 @@
     MatroskaMuxContext *mkv = s->priv_data;
     AVIOContext *pb = s->pb;
     ebml_master ebml_header;
-    AVDictionaryEntry *tag;
+    const AVDictionaryEntry *tag;
     int ret, i, version = 2;
     int64_t creation_time;
 
-    if (!strcmp(s->oformat->name, "webm"))
-        mkv->mode = MODE_WEBM;
-    else
-        mkv->mode = MODE_MATROSKAv2;
-
     if (mkv->mode != MODE_WEBM ||
         av_dict_get(s->metadata, "stereo_mode", NULL, 0) ||
         av_dict_get(s->metadata, "alpha_mode", NULL, 0))
@@ -1886,39 +1804,26 @@
             version = 4;
     }
 
-    mkv->tracks = av_mallocz_array(s->nb_streams, sizeof(*mkv->tracks));
-    if (!mkv->tracks) {
-        ret = AVERROR(ENOMEM);
-        goto fail;
-    }
-    ebml_header = start_ebml_master(pb, EBML_ID_HEADER, 0);
-    put_ebml_uint   (pb, EBML_ID_EBMLVERSION        ,           1);
-    put_ebml_uint   (pb, EBML_ID_EBMLREADVERSION    ,           1);
-    put_ebml_uint   (pb, EBML_ID_EBMLMAXIDLENGTH    ,           4);
-    put_ebml_uint   (pb, EBML_ID_EBMLMAXSIZELENGTH  ,           8);
-    put_ebml_string (pb, EBML_ID_DOCTYPE            , s->oformat->name);
-    put_ebml_uint   (pb, EBML_ID_DOCTYPEVERSION     ,     version);
-    put_ebml_uint   (pb, EBML_ID_DOCTYPEREADVERSION ,           2);
+    ebml_header = start_ebml_master(pb, EBML_ID_HEADER, MAX_EBML_HEADER_SIZE);
+    put_ebml_uint  (pb, EBML_ID_EBMLVERSION       ,           1);
+    put_ebml_uint  (pb, EBML_ID_EBMLREADVERSION   ,           1);
+    put_ebml_uint  (pb, EBML_ID_EBMLMAXIDLENGTH   ,           4);
+    put_ebml_uint  (pb, EBML_ID_EBMLMAXSIZELENGTH ,           8);
+    put_ebml_string(pb, EBML_ID_DOCTYPE           , s->oformat->name);
+    put_ebml_uint  (pb, EBML_ID_DOCTYPEVERSION    ,     version);
+    put_ebml_uint  (pb, EBML_ID_DOCTYPEREADVERSION,           2);
     end_ebml_master(pb, ebml_header);
 
     mkv->segment = start_ebml_master(pb, MATROSKA_ID_SEGMENT, 0);
     mkv->segment_offset = avio_tell(pb);
 
-    // we write 2 seek heads - one at the end of the file to point to each
-    // cluster, and one at the beginning to point to all other level one
-    // elements (including the seek head at the end of the file), which
-    // isn't more than 10 elements if we only write one of each other
-    // currently defined level 1 element
-    mkv->main_seekhead    = mkv_start_seekhead(pb, mkv->segment_offset, 10);
-    if (!mkv->main_seekhead) {
-        ret = AVERROR(ENOMEM);
-        goto fail;
-    }
+    // we write a seek head at the beginning to point to all other level
+    // one elements (except Clusters).
+    mkv_start_seekhead(mkv, pb);
 
-    ret = mkv_add_seekhead_entry(mkv->main_seekhead, MATROSKA_ID_INFO, avio_tell(pb));
-    if (ret < 0) goto fail;
+    mkv_add_seekhead_entry(mkv, MATROSKA_ID_INFO, avio_tell(pb));
 
-    ret = start_ebml_master_crc32(pb, &mkv->info_bc, mkv, &mkv->info, MATROSKA_ID_INFO, 0);
+    ret = start_ebml_master_crc32(&mkv->info_bc, mkv);
     if (ret < 0)
         return ret;
     pb = mkv->info_bc;
@@ -1933,17 +1838,8 @@
         else
             put_ebml_string(pb, MATROSKA_ID_WRITINGAPP, LIBAVFORMAT_IDENT);
 
-        if (mkv->mode != MODE_WEBM) {
-            uint32_t segment_uid[4];
-            AVLFG lfg;
-
-            av_lfg_init(&lfg, av_get_random_seed());
-
-            for (i = 0; i < 4; i++)
-                segment_uid[i] = av_lfg_get(&lfg);
-
-            put_ebml_binary(pb, MATROSKA_ID_SEGMENTUID, segment_uid, 16);
-        }
+        if (mkv->mode != MODE_WEBM)
+            put_ebml_binary(pb, MATROSKA_ID_SEGMENTUID, mkv->segment_uid, 16);
     } else {
         const char *ident = "Lavf";
         put_ebml_string(pb, MATROSKA_ID_MUXINGAPP , ident);
@@ -1977,47 +1873,40 @@
         }
     }
     if ((s->pb->seekable & AVIO_SEEKABLE_NORMAL) && !mkv->is_live)
-        end_ebml_master_crc32_preliminary(s->pb, &mkv->info_bc, mkv, mkv->info);
+        end_ebml_master_crc32_preliminary(s->pb, mkv->info_bc,
+                                          MATROSKA_ID_INFO, &mkv->info_pos);
     else
-        end_ebml_master_crc32(s->pb, &mkv->info_bc, mkv, mkv->info);
+        end_ebml_master_crc32(s->pb, &mkv->info_bc, mkv, MATROSKA_ID_INFO, 0, 0);
     pb = s->pb;
 
-    // initialize stream_duration fields
-    mkv->stream_durations = av_mallocz(s->nb_streams * sizeof(int64_t));
-    mkv->stream_duration_offsets = av_mallocz(s->nb_streams * sizeof(int64_t));
-    if (!mkv->stream_durations || !mkv->stream_duration_offsets) {
-        ret = AVERROR(ENOMEM);
-        goto fail;
-    }
-
     ret = mkv_write_tracks(s);
     if (ret < 0)
-        goto fail;
+        return ret;
 
     for (i = 0; i < s->nb_chapters; i++)
-        mkv->chapter_id_offset = FFMAX(mkv->chapter_id_offset, 1LL - s->chapters[i]->id);
+        if (!s->chapters[i]->id) {
+            mkv->chapter_id_offset = 1;
+            break;
+        }
 
     ret = mkv_write_chapters(s);
     if (ret < 0)
-        goto fail;
+        return ret;
 
     if (mkv->mode != MODE_WEBM) {
         ret = mkv_write_attachments(s);
         if (ret < 0)
-            goto fail;
+            return ret;
     }
 
     ret = mkv_write_tags(s);
     if (ret < 0)
-        goto fail;
+        return ret;
 
-    if (!(s->pb->seekable & AVIO_SEEKABLE_NORMAL) && !mkv->is_live)
-        mkv_write_seekhead(pb, mkv);
-
-    mkv->cues = mkv_start_cues(mkv->segment_offset);
-    if (!mkv->cues) {
-        ret = AVERROR(ENOMEM);
-        goto fail;
+    if (!(s->pb->seekable & AVIO_SEEKABLE_NORMAL) && !mkv->is_live) {
+        ret = mkv_write_seekhead(pb, mkv, 0, avio_tell(pb));
+        if (ret < 0)
+            return ret;
     }
 
     if (s->metadata_header_padding > 0) {
@@ -2037,8 +1926,6 @@
     mkv->cur_audio_pkt.size = 0;
     mkv->cluster_pos = -1;
 
-    avio_flush(pb);
-
     // start a new cluster every 5 MB or 5 sec, or 32k / 1 sec for streaming or
     // after 4k and on a keyframe
     if (pb->seekable & AVIO_SEEKABLE_NORMAL) {
@@ -2054,19 +1941,14 @@
     }
 
     return 0;
-fail:
-    mkv_free(mkv);
-    return ret;
 }
 
-static int mkv_blockgroup_size(int pkt_size)
+static int mkv_blockgroup_size(int pkt_size, int track_num_size)
 {
-    int size = pkt_size + 4;
-    size += ebml_num_size(size);
+    int size = pkt_size + track_num_size + 3;
+    size += ebml_length_size(size);
     size += 2;              // EBML ID for block and block duration
-    size += 8;              // max size of block duration
-    size += ebml_num_size(size);
-    size += 1;              // blockgroup EBML ID
+    size += 9;              // max size of block duration incl. length field
     return size;
 }
 
@@ -2123,43 +2005,51 @@
     return ret;
 }
 
-static void mkv_write_block(AVFormatContext *s, AVIOContext *pb,
-                            unsigned int blockid, AVPacket *pkt, int keyframe)
+static int mkv_write_block(AVFormatContext *s, AVIOContext *pb,
+                           uint32_t blockid, const AVPacket *pkt, int keyframe)
 {
     MatroskaMuxContext *mkv = s->priv_data;
     AVCodecParameters *par = s->streams[pkt->stream_index]->codecpar;
+    mkv_track *track = &mkv->tracks[pkt->stream_index];
     uint8_t *data = NULL, *side_data = NULL;
-    int offset = 0, size = pkt->size, side_data_size = 0;
-    int64_t ts = mkv->tracks[pkt->stream_index].write_dts ? pkt->dts : pkt->pts;
-    uint64_t additional_id = 0;
+    int err = 0, offset = 0, size = pkt->size, side_data_size = 0;
+    int64_t ts = track->write_dts ? pkt->dts : pkt->pts;
+    uint64_t additional_id;
     int64_t discard_padding = 0;
-    uint8_t track_number = (mkv->is_dash ? mkv->dash_track_number : (pkt->stream_index + 1));
+    unsigned track_number = track->track_num;
     ebml_master block_group, block_additions, block_more;
 
-    ts += mkv->tracks[pkt->stream_index].ts_offset;
+    ts += track->ts_offset;
 
-    av_log(s, AV_LOG_DEBUG, "Writing block at offset %" PRIu64 ", size %d, "
-           "pts %" PRId64 ", dts %" PRId64 ", duration %" PRId64 ", keyframe %d\n",
-           avio_tell(pb), pkt->size, pkt->pts, pkt->dts, pkt->duration,
-           keyframe != 0);
+    /* The following string is identical to the one in mkv_write_vtt_blocks
+     * so that only one copy needs to exist in binaries. */
+    av_log(s, AV_LOG_DEBUG,
+           "Writing block of size %d with pts %" PRId64 ", dts %" PRId64 ", "
+           "duration %" PRId64 " at relative offset %" PRId64 " in cluster "
+           "at offset %" PRId64 ". TrackNumber %u, keyframe %d\n",
+           pkt->size, pkt->pts, pkt->dts, pkt->duration, avio_tell(pb),
+           mkv->cluster_pos, track_number, keyframe != 0);
+
     if (par->codec_id == AV_CODEC_ID_H264 && par->extradata_size > 0 &&
-        (AV_RB24(par->extradata) == 1 || AV_RB32(par->extradata) == 1))
-        ff_avc_parse_nal_units_buf(pkt->data, &data, &size);
-    else if (par->codec_id == AV_CODEC_ID_HEVC && par->extradata_size > 6 &&
-             (AV_RB24(par->extradata) == 1 || AV_RB32(par->extradata) == 1))
+        (AV_RB24(par->extradata) == 1 || AV_RB32(par->extradata) == 1)) {
+        err = ff_avc_parse_nal_units_buf(pkt->data, &data, &size);
+    } else if (par->codec_id == AV_CODEC_ID_HEVC && par->extradata_size > 6 &&
+               (AV_RB24(par->extradata) == 1 || AV_RB32(par->extradata) == 1)) {
         /* extradata is Annex B, assume the bitstream is too and convert it */
-        ff_hevc_annexb2mp4_buf(pkt->data, &data, &size, 0, NULL);
-    else if (par->codec_id == AV_CODEC_ID_AV1)
-        ff_av1_filter_obus_buf(pkt->data, &data, &size);
-    else if (par->codec_id == AV_CODEC_ID_WAVPACK) {
-        int ret = mkv_strip_wavpack(pkt->data, &data, &size);
-        if (ret < 0) {
-            av_log(s, AV_LOG_ERROR, "Error stripping a WavPack packet.\n");
-            return;
-        }
+        err = ff_hevc_annexb2mp4_buf(pkt->data, &data, &size, 0, NULL);
+    } else if (par->codec_id == AV_CODEC_ID_AV1) {
+        err = ff_av1_filter_obus_buf(pkt->data, &data, &size, &offset);
+    } else if (par->codec_id == AV_CODEC_ID_WAVPACK) {
+        err = mkv_strip_wavpack(pkt->data, &data, &size);
     } else
         data = pkt->data;
 
+    if (err < 0) {
+        av_log(s, AV_LOG_ERROR, "Error when reformatting data of "
+               "a packet from stream %d.\n", pkt->stream_index);
+        return err;
+    }
+
     if (par->codec_id == AV_CODEC_ID_PRORES && size >= 8) {
         /* Matroska specification requires to remove the first QuickTime atom
          */
@@ -2170,7 +2060,6 @@
     side_data = av_packet_get_side_data(pkt,
                                         AV_PKT_DATA_SKIP_SAMPLES,
                                         &side_data_size);
-
     if (side_data && side_data_size >= 10) {
         discard_padding = av_rescale_q(AV_RL32(side_data + 4),
                                        (AVRational){1, par->sample_rate},
@@ -2181,58 +2070,61 @@
                                         AV_PKT_DATA_MATROSKA_BLOCKADDITIONAL,
                                         &side_data_size);
     if (side_data) {
-        additional_id = AV_RB64(side_data);
-        side_data += 8;
-        side_data_size -= 8;
+        // Only the Codec-specific BlockMore (id == 1) is currently supported.
+        if (side_data_size < 8 || (additional_id = AV_RB64(side_data)) != 1) {
+            side_data_size = 0;
+        } else {
+            side_data      += 8;
+            side_data_size -= 8;
+        }
     }
 
-    if ((side_data_size && additional_id == 1) || discard_padding) {
+    if (side_data_size || discard_padding) {
         block_group = start_ebml_master(pb, MATROSKA_ID_BLOCKGROUP, 0);
         blockid = MATROSKA_ID_BLOCK;
     }
 
     put_ebml_id(pb, blockid);
-    put_ebml_num(pb, size + 4, 0);
-    // this assumes stream_index is less than 126
-    avio_w8(pb, 0x80 | track_number);
+    put_ebml_length(pb, size + track->track_num_size + 3, 0);
+    put_ebml_num(pb, track_number, track->track_num_size);
     avio_wb16(pb, ts - mkv->cluster_pts);
     avio_w8(pb, (blockid == MATROSKA_ID_SIMPLEBLOCK && keyframe) ? (1 << 7) : 0);
     avio_write(pb, data + offset, size);
     if (data != pkt->data)
         av_free(data);
 
-    if (blockid == MATROSKA_ID_BLOCK && !keyframe) {
-        put_ebml_sint(pb, MATROSKA_ID_BLOCKREFERENCE,
-                      mkv->last_track_timestamp[track_number - 1]);
-    }
-    mkv->last_track_timestamp[track_number - 1] = ts - mkv->cluster_pts;
+    if (blockid == MATROSKA_ID_BLOCK && !keyframe)
+        put_ebml_sint(pb, MATROSKA_ID_BLOCKREFERENCE, track->last_timestamp - ts);
+    track->last_timestamp = ts;
 
-    if (discard_padding) {
+    if (discard_padding)
         put_ebml_sint(pb, MATROSKA_ID_DISCARDPADDING, discard_padding);
-    }
 
-    if (side_data_size && additional_id == 1) {
+    if (side_data_size) {
         block_additions = start_ebml_master(pb, MATROSKA_ID_BLOCKADDITIONS, 0);
         block_more = start_ebml_master(pb, MATROSKA_ID_BLOCKMORE, 0);
-        put_ebml_uint(pb, MATROSKA_ID_BLOCKADDID, 1);
-        put_ebml_id(pb, MATROSKA_ID_BLOCKADDITIONAL);
-        put_ebml_num(pb, side_data_size, 0);
-        avio_write(pb, side_data, side_data_size);
+        /* Until dbc50f8a our demuxer used a wrong default value
+         * of BlockAddID, so we write it unconditionally. */
+        put_ebml_uint  (pb, MATROSKA_ID_BLOCKADDID, additional_id);
+        put_ebml_binary(pb, MATROSKA_ID_BLOCKADDITIONAL,
+                        side_data, side_data_size);
         end_ebml_master(pb, block_more);
         end_ebml_master(pb, block_additions);
     }
-    if ((side_data_size && additional_id == 1) || discard_padding) {
+    if (side_data_size || discard_padding)
         end_ebml_master(pb, block_group);
-    }
+
+    return 0;
 }
 
-static int mkv_write_vtt_blocks(AVFormatContext *s, AVIOContext *pb, AVPacket *pkt)
+static int mkv_write_vtt_blocks(AVFormatContext *s, AVIOContext *pb, const AVPacket *pkt)
 {
     MatroskaMuxContext *mkv = s->priv_data;
+    mkv_track *track = &mkv->tracks[pkt->stream_index];
     ebml_master blockgroup;
     int id_size, settings_size, size;
     uint8_t *id, *settings;
-    int64_t ts = mkv->tracks[pkt->stream_index].write_dts ? pkt->dts : pkt->pts;
+    int64_t ts = track->write_dts ? pkt->dts : pkt->pts;
     const int flags = 0;
 
     id_size = 0;
@@ -2245,15 +2137,21 @@
 
     size = id_size + 1 + settings_size + 1 + pkt->size;
 
-    av_log(s, AV_LOG_DEBUG, "Writing block at offset %" PRIu64 ", size %d, "
-           "pts %" PRId64 ", dts %" PRId64 ", duration %" PRId64 ", flags %d\n",
-           avio_tell(pb), size, pkt->pts, pkt->dts, pkt->duration, flags);
+    /* The following string is identical to the one in mkv_write_block so that
+     * only one copy needs to exist in binaries. */
+    av_log(s, AV_LOG_DEBUG,
+           "Writing block of size %d with pts %" PRId64 ", dts %" PRId64 ", "
+           "duration %" PRId64 " at relative offset %" PRId64 " in cluster "
+           "at offset %" PRId64 ". TrackNumber %u, keyframe %d\n",
+           size, pkt->pts, pkt->dts, pkt->duration, avio_tell(pb),
+           mkv->cluster_pos, track->track_num, 1);
 
-    blockgroup = start_ebml_master(pb, MATROSKA_ID_BLOCKGROUP, mkv_blockgroup_size(size));
+    blockgroup = start_ebml_master(pb, MATROSKA_ID_BLOCKGROUP,
+                                   mkv_blockgroup_size(size, track->track_num_size));
 
     put_ebml_id(pb, MATROSKA_ID_BLOCK);
-    put_ebml_num(pb, size + 4, 0);
-    avio_w8(pb, 0x80 | (pkt->stream_index + 1));     // this assumes stream_index is less than 126
+    put_ebml_length(pb, size + track->track_num_size + 3, 0);
+    put_ebml_num(pb, track->track_num, track->track_num_size);
     avio_wb16(pb, ts - mkv->cluster_pts);
     avio_w8(pb, flags);
     avio_printf(pb, "%.*s\n%.*s\n%.*s", id_size, id, settings_size, settings, pkt->size, pkt->data);
@@ -2264,25 +2162,20 @@
     return pkt->duration;
 }
 
-static void mkv_start_new_cluster(AVFormatContext *s, AVPacket *pkt)
+static void mkv_end_cluster(AVFormatContext *s)
 {
     MatroskaMuxContext *mkv = s->priv_data;
 
-    end_ebml_master_crc32(s->pb, &mkv->dyn_bc, mkv, mkv->cluster);
+    end_ebml_master_crc32(s->pb, &mkv->cluster_bc, mkv, MATROSKA_ID_CLUSTER, 0, 1);
+    if (!mkv->have_video) {
+        for (unsigned i = 0; i < s->nb_streams; i++)
+            mkv->tracks[i].has_cue = 0;
+    }
     mkv->cluster_pos = -1;
-    if (s->pb->seekable & AVIO_SEEKABLE_NORMAL)
-        av_log(s, AV_LOG_DEBUG,
-               "Starting new cluster at offset %" PRIu64 " bytes, "
-               "pts %" PRIu64 "dts %" PRIu64 "\n",
-               avio_tell(s->pb), pkt->pts, pkt->dts);
-    else
-        av_log(s, AV_LOG_DEBUG, "Starting new cluster, "
-               "pts %" PRIu64 "dts %" PRIu64 "\n",
-               pkt->pts, pkt->dts);
-    avio_flush(s->pb);
+    avio_write_marker(s->pb, AV_NOPTS_VALUE, AVIO_DATA_MARKER_FLUSH_POINT);
 }
 
-static int mkv_check_new_extra_data(AVFormatContext *s, AVPacket *pkt)
+static int mkv_check_new_extra_data(AVFormatContext *s, const AVPacket *pkt)
 {
     MatroskaMuxContext *mkv = s->priv_data;
     mkv_track *track        = &mkv->tracks[pkt->stream_index];
@@ -2297,19 +2190,16 @@
     case AV_CODEC_ID_AAC:
         if (side_data_size && (s->pb->seekable & AVIO_SEEKABLE_NORMAL) && !mkv->is_live) {
             int filler, output_sample_rate = 0;
-            int64_t curpos;
             ret = get_aac_sample_rates(s, side_data, side_data_size, &track->sample_rate,
                                        &output_sample_rate);
             if (ret < 0)
                 return ret;
             if (!output_sample_rate)
                 output_sample_rate = track->sample_rate; // Space is already reserved, so it's this or a void element.
-            av_freep(&par->extradata);
             ret = ff_alloc_extradata(par, side_data_size);
             if (ret < 0)
                 return ret;
             memcpy(par->extradata, side_data, side_data_size);
-            curpos = avio_tell(mkv->tracks_bc);
             avio_seek(mkv->tracks_bc, track->codecpriv_offset, SEEK_SET);
             mkv_write_codecprivate(s, mkv->tracks_bc, par, 1, 0);
             filler = MAX_PCE_SIZE + 2 + 4 - (avio_tell(mkv->tracks_bc) - track->codecpriv_offset);
@@ -2318,7 +2208,6 @@
             avio_seek(mkv->tracks_bc, track->sample_rate_offset, SEEK_SET);
             put_ebml_float(mkv->tracks_bc, MATROSKA_ID_AUDIOSAMPLINGFREQ, track->sample_rate);
             put_ebml_float(mkv->tracks_bc, MATROSKA_ID_AUDIOOUTSAMPLINGFREQ, output_sample_rate);
-            avio_seek(mkv->tracks_bc, curpos, SEEK_SET);
         } else if (!par->extradata_size && !track->sample_rate) {
             // No extradata (codecpar or packet side data).
             av_log(s, AV_LOG_ERROR, "Error parsing AAC extradata, unable to determine samplerate.\n");
@@ -2327,27 +2216,16 @@
         break;
     case AV_CODEC_ID_FLAC:
         if (side_data_size && (s->pb->seekable & AVIO_SEEKABLE_NORMAL) && !mkv->is_live) {
-            AVCodecParameters *codecpriv_par;
-            int64_t curpos;
+            uint8_t *old_extradata = par->extradata;
             if (side_data_size != par->extradata_size) {
                 av_log(s, AV_LOG_ERROR, "Invalid FLAC STREAMINFO metadata for output stream %d\n",
                        pkt->stream_index);
                 return AVERROR(EINVAL);
             }
-            codecpriv_par = avcodec_parameters_alloc();
-            if (!codecpriv_par)
-                return AVERROR(ENOMEM);
-            ret = avcodec_parameters_copy(codecpriv_par, par);
-            if (ret < 0) {
-                avcodec_parameters_free(&codecpriv_par);
-                return ret;
-            }
-            memcpy(codecpriv_par->extradata, side_data, side_data_size);
-            curpos = avio_tell(mkv->tracks_bc);
+            par->extradata = side_data;
             avio_seek(mkv->tracks_bc, track->codecpriv_offset, SEEK_SET);
-            mkv_write_codecprivate(s, mkv->tracks_bc, codecpriv_par, 1, 0);
-            avio_seek(mkv->tracks_bc, curpos, SEEK_SET);
-            avcodec_parameters_free(&codecpriv_par);
+            mkv_write_codecprivate(s, mkv->tracks_bc, par, 1, 0);
+            par->extradata = old_extradata;
         }
         break;
     // FIXME: Remove the following once libaom starts propagating extradata during init()
@@ -2358,7 +2236,6 @@
             AVIOContext *dyn_cp;
             uint8_t *codecpriv;
             int codecpriv_size;
-            int64_t curpos;
             ret = avio_open_dyn_buf(&dyn_cp);
             if (ret < 0)
                 return ret;
@@ -2368,12 +2245,10 @@
                 av_free(codecpriv);
                 return AVERROR_INVALIDDATA;
             }
-            curpos = avio_tell(mkv->tracks_bc);
             avio_seek(mkv->tracks_bc, track->codecpriv_offset, SEEK_SET);
             // Do not write the OBUs as we don't have space saved for them
             put_ebml_binary(mkv->tracks_bc, MATROSKA_ID_CODECPRIVATE, codecpriv, 4);
             av_free(codecpriv);
-            avio_seek(mkv->tracks_bc, curpos, SEEK_SET);
             ret = ff_alloc_extradata(par, side_data_size);
             if (ret < 0)
                 return ret;
@@ -2390,56 +2265,67 @@
     return 0;
 }
 
-static int mkv_write_packet_internal(AVFormatContext *s, AVPacket *pkt, int add_cue)
+static int mkv_write_packet_internal(AVFormatContext *s, const AVPacket *pkt)
 {
     MatroskaMuxContext *mkv = s->priv_data;
-    AVIOContext *pb         = s->pb;
+    AVIOContext *pb;
     AVCodecParameters *par  = s->streams[pkt->stream_index]->codecpar;
+    mkv_track *track        = &mkv->tracks[pkt->stream_index];
     int keyframe            = !!(pkt->flags & AV_PKT_FLAG_KEY);
     int duration            = pkt->duration;
     int ret;
-    int64_t ts = mkv->tracks[pkt->stream_index].write_dts ? pkt->dts : pkt->pts;
+    int64_t ts = track->write_dts ? pkt->dts : pkt->pts;
     int64_t relative_packet_pos;
-    int dash_tracknum = mkv->is_dash ? mkv->dash_track_number : pkt->stream_index + 1;
 
     if (ts == AV_NOPTS_VALUE) {
         av_log(s, AV_LOG_ERROR, "Can't write packet with unknown timestamp\n");
         return AVERROR(EINVAL);
     }
-    ts += mkv->tracks[pkt->stream_index].ts_offset;
+    ts += track->ts_offset;
 
     if (mkv->cluster_pos != -1) {
-        int64_t cluster_time = ts - mkv->cluster_pts + mkv->tracks[pkt->stream_index].ts_offset;
+        int64_t cluster_time = ts - mkv->cluster_pts;
         if ((int16_t)cluster_time != cluster_time) {
+            mkv_end_cluster(s);
             av_log(s, AV_LOG_WARNING, "Starting new cluster due to timestamp\n");
-            mkv_start_new_cluster(s, pkt);
         }
     }
 
     if (mkv->cluster_pos == -1) {
-        mkv->cluster_pos = avio_tell(s->pb);
-        ret = start_ebml_master_crc32(s->pb, &mkv->dyn_bc, mkv, &mkv->cluster, MATROSKA_ID_CLUSTER, 0);
+        ret = start_ebml_master_crc32(&mkv->cluster_bc, mkv);
         if (ret < 0)
             return ret;
-        put_ebml_uint(mkv->dyn_bc, MATROSKA_ID_CLUSTERTIMECODE, FFMAX(0, ts));
+        mkv->cluster_pos = avio_tell(s->pb);
+        put_ebml_uint(mkv->cluster_bc, MATROSKA_ID_CLUSTERTIMECODE, FFMAX(0, ts));
         mkv->cluster_pts = FFMAX(0, ts);
+        av_log(s, AV_LOG_DEBUG,
+               "Starting new cluster with timestamp "
+               "%" PRId64 " at offset %" PRId64 " bytes\n",
+               mkv->cluster_pts, mkv->cluster_pos);
     }
-    pb = mkv->dyn_bc;
+    pb = mkv->cluster_bc;
 
     relative_packet_pos = avio_tell(pb);
 
     if (par->codec_type != AVMEDIA_TYPE_SUBTITLE) {
-        mkv_write_block(s, pb, MATROSKA_ID_SIMPLEBLOCK, pkt, keyframe);
-        if ((s->pb->seekable & AVIO_SEEKABLE_NORMAL) && (par->codec_type == AVMEDIA_TYPE_VIDEO && keyframe || add_cue)) {
-            ret = mkv_add_cuepoint(mkv->cues, pkt->stream_index, dash_tracknum, ts, mkv->cluster_pos, relative_packet_pos, -1);
-            if (ret < 0) return ret;
+        ret = mkv_write_block(s, pb, MATROSKA_ID_SIMPLEBLOCK, pkt, keyframe);
+        if (ret < 0)
+            return ret;
+        if ((s->pb->seekable & AVIO_SEEKABLE_NORMAL) && keyframe &&
+            (par->codec_type == AVMEDIA_TYPE_VIDEO || !mkv->have_video && !track->has_cue)) {
+            ret = mkv_add_cuepoint(mkv, pkt->stream_index, ts,
+                                   mkv->cluster_pos, relative_packet_pos, -1);
+            if (ret < 0)
+                return ret;
+            track->has_cue = 1;
         }
     } else {
         if (par->codec_id == AV_CODEC_ID_WEBVTT) {
             duration = mkv_write_vtt_blocks(s, pb, pkt);
         } else {
             ebml_master blockgroup = start_ebml_master(pb, MATROSKA_ID_BLOCKGROUP,
-                                                       mkv_blockgroup_size(pkt->size));
+                                                       mkv_blockgroup_size(pkt->size,
+                                                                           track->track_num_size));
 
 #if FF_API_CONVERGENCE_DURATION
 FF_DISABLE_DEPRECATION_WARNINGS
@@ -2456,23 +2342,20 @@
         }
 
         if (s->pb->seekable & AVIO_SEEKABLE_NORMAL) {
-            ret = mkv_add_cuepoint(mkv->cues, pkt->stream_index, dash_tracknum, ts,
+            ret = mkv_add_cuepoint(mkv, pkt->stream_index, ts,
                                    mkv->cluster_pos, relative_packet_pos, duration);
             if (ret < 0)
                 return ret;
         }
     }
 
-    mkv->duration = FFMAX(mkv->duration, ts + duration);
-
-    if (mkv->stream_durations)
-        mkv->stream_durations[pkt->stream_index] =
-            FFMAX(mkv->stream_durations[pkt->stream_index], ts + duration);
+    mkv->duration   = FFMAX(mkv->duration,   ts + duration);
+    track->duration = FFMAX(track->duration, ts + duration);
 
     return 0;
 }
 
-static int mkv_write_packet(AVFormatContext *s, AVPacket *pkt)
+static int mkv_write_packet(AVFormatContext *s, const AVPacket *pkt)
 {
     MatroskaMuxContext *mkv = s->priv_data;
     int codec_type          = s->streams[pkt->stream_index]->codecpar->codec_type;
@@ -2486,38 +2369,35 @@
     if (ret < 0)
         return ret;
 
-    if (mkv->tracks[pkt->stream_index].write_dts)
-        cluster_time = pkt->dts - mkv->cluster_pts;
-    else
-        cluster_time = pkt->pts - mkv->cluster_pts;
-    cluster_time += mkv->tracks[pkt->stream_index].ts_offset;
+    if (mkv->cluster_pos != -1) {
+        if (mkv->tracks[pkt->stream_index].write_dts)
+            cluster_time = pkt->dts - mkv->cluster_pts;
+        else
+            cluster_time = pkt->pts - mkv->cluster_pts;
+        cluster_time += mkv->tracks[pkt->stream_index].ts_offset;
 
-    // start a new cluster every 5 MB or 5 sec, or 32k / 1 sec for streaming or
-    // after 4k and on a keyframe
-    cluster_size = avio_tell(mkv->dyn_bc);
+        cluster_size  = avio_tell(mkv->cluster_bc);
 
-    if (mkv->is_dash && codec_type == AVMEDIA_TYPE_VIDEO) {
-        // WebM DASH specification states that the first block of every cluster
-        // has to be a key frame. So for DASH video, we only create a cluster
-        // on seeing key frames.
-        start_new_cluster = keyframe;
-    } else if (mkv->is_dash && codec_type == AVMEDIA_TYPE_AUDIO &&
-               (mkv->cluster_pos == -1 ||
-                cluster_time > mkv->cluster_time_limit)) {
-        // For DASH audio, we create a Cluster based on cluster_time_limit
-        start_new_cluster = 1;
-    } else if (!mkv->is_dash &&
-               (cluster_size > mkv->cluster_size_limit ||
-                cluster_time > mkv->cluster_time_limit ||
-                (codec_type == AVMEDIA_TYPE_VIDEO && keyframe &&
-                 cluster_size > 4 * 1024))) {
-        start_new_cluster = 1;
-    } else {
-        start_new_cluster = 0;
-    }
+        if (mkv->is_dash && codec_type == AVMEDIA_TYPE_VIDEO) {
+            // WebM DASH specification states that the first block of
+            // every Cluster has to be a key frame. So for DASH video,
+            // we only create a Cluster on seeing key frames.
+            start_new_cluster = keyframe;
+        } else if (mkv->is_dash && codec_type == AVMEDIA_TYPE_AUDIO &&
+                   cluster_time > mkv->cluster_time_limit) {
+            // For DASH audio, we create a Cluster based on cluster_time_limit.
+            start_new_cluster = 1;
+        } else if (!mkv->is_dash &&
+                   (cluster_size > mkv->cluster_size_limit ||
+                    cluster_time > mkv->cluster_time_limit ||
+                    (codec_type == AVMEDIA_TYPE_VIDEO && keyframe &&
+                     cluster_size > 4 * 1024))) {
+            start_new_cluster = 1;
+        } else
+            start_new_cluster = 0;
 
-    if (mkv->cluster_pos != -1 && start_new_cluster) {
-        mkv_start_new_cluster(s, pkt);
+        if (start_new_cluster)
+            mkv_end_cluster(s);
     }
 
     if (!mkv->cluster_pos)
@@ -2527,9 +2407,7 @@
 
     // check if we have an audio packet cached
     if (mkv->cur_audio_pkt.size > 0) {
-        // for DASH audio, a CuePoint has to be added when there is a new cluster.
-        ret = mkv_write_packet_internal(s, &mkv->cur_audio_pkt,
-                                        mkv->is_dash ? start_new_cluster : 0);
+        ret = mkv_write_packet_internal(s, &mkv->cur_audio_pkt);
         av_packet_unref(&mkv->cur_audio_pkt);
         if (ret < 0) {
             av_log(s, AV_LOG_ERROR,
@@ -2541,9 +2419,10 @@
     // buffer an audio packet to ensure the packet containing the video
     // keyframe's timecode is contained in the same cluster for WebM
     if (codec_type == AVMEDIA_TYPE_AUDIO) {
-        ret = av_packet_ref(&mkv->cur_audio_pkt, pkt);
+        if (pkt->size > 0)
+            ret = av_packet_ref(&mkv->cur_audio_pkt, pkt);
     } else
-        ret = mkv_write_packet_internal(s, pkt, 0);
+        ret = mkv_write_packet_internal(s, pkt);
     return ret;
 }
 
@@ -2553,15 +2432,10 @@
 
     if (!pkt) {
         if (mkv->cluster_pos != -1) {
-            end_ebml_master_crc32(s->pb, &mkv->dyn_bc, mkv, mkv->cluster);
-            mkv->cluster_pos = -1;
-            if (s->pb->seekable & AVIO_SEEKABLE_NORMAL)
-                av_log(s, AV_LOG_DEBUG,
-                       "Flushing cluster at offset %" PRIu64 " bytes\n",
-                       avio_tell(s->pb));
-            else
-                av_log(s, AV_LOG_DEBUG, "Flushing cluster\n");
-            avio_flush(s->pb);
+            mkv_end_cluster(s);
+            av_log(s, AV_LOG_DEBUG,
+                   "Flushing cluster at offset %" PRIu64 " bytes\n",
+                   avio_tell(s->pb));
         }
         return 1;
     }
@@ -2572,13 +2446,11 @@
 {
     MatroskaMuxContext *mkv = s->priv_data;
     AVIOContext *pb = s->pb;
-    int64_t currentpos, cuespos;
     int ret;
 
     // check if we have an audio packet cached
     if (mkv->cur_audio_pkt.size > 0) {
-        ret = mkv_write_packet_internal(s, &mkv->cur_audio_pkt, 0);
-        av_packet_unref(&mkv->cur_audio_pkt);
+        ret = mkv_write_packet_internal(s, &mkv->cur_audio_pkt);
         if (ret < 0) {
             av_log(s, AV_LOG_ERROR,
                    "Could not write cached audio packet ret:%d\n", ret);
@@ -2586,8 +2458,9 @@
         }
     }
 
-    if (mkv->dyn_bc) {
-        end_ebml_master_crc32(pb, &mkv->dyn_bc, mkv, mkv->cluster);
+    if (mkv->cluster_bc) {
+        end_ebml_master_crc32(pb, &mkv->cluster_bc, mkv,
+                              MATROSKA_ID_CLUSTER, 0, 0);
     }
 
     ret = mkv_write_chapters(s);
@@ -2596,67 +2469,99 @@
 
 
     if ((pb->seekable & AVIO_SEEKABLE_NORMAL) && !mkv->is_live) {
-        if (mkv->cues->num_entries) {
-            if (mkv->reserve_cues_space) {
-                int64_t cues_end;
+        int64_t endpos, ret64;
 
-                currentpos = avio_tell(pb);
-                avio_seek(pb, mkv->cues_pos, SEEK_SET);
+        endpos = avio_tell(pb);
 
-                cuespos  = mkv_write_cues(s, 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 (mkv->cues.num_entries) {
+            AVIOContext *cues = NULL;
+            uint64_t size;
+            int64_t cuespos = endpos;
+            int length_size = 0;
 
-                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(s, mkv->cues, mkv->tracks, s->nb_streams);
-            }
-
-            ret = mkv_add_seekhead_entry(mkv->main_seekhead, MATROSKA_ID_CUES,
-                                         cuespos);
+            ret = start_ebml_master_crc32(&cues, mkv);
             if (ret < 0)
                 return ret;
+
+            ret = mkv_assemble_cues(s->streams, cues, &mkv->cues,
+                                    mkv->tracks, s->nb_streams);
+            if (ret < 0) {
+                ffio_free_dyn_buf(&cues);
+                return ret;
+            }
+
+            if (mkv->reserve_cues_space) {
+                size  = avio_tell(cues);
+                length_size = ebml_length_size(size);
+                size += 4 + length_size;
+                if (mkv->reserve_cues_space < size) {
+                    av_log(s, AV_LOG_WARNING,
+                           "Insufficient space reserved for Cues: "
+                           "%d < %"PRIu64". No Cues will be output.\n",
+                           mkv->reserve_cues_space, size);
+                    mkv->reserve_cues_space = -1;
+                    ffio_free_dyn_buf(&cues);
+                    goto after_cues;
+                } else {
+                    cuespos = mkv->cues_pos;
+                    if ((ret64 = avio_seek(pb, mkv->cues_pos, SEEK_SET)) < 0) {
+                        ffio_free_dyn_buf(&cues);
+                        return ret64;
+                    }
+                    if (mkv->reserve_cues_space == size + 1) {
+                        /* There is no way to reserve a single byte because
+                         * the minimal size of an EBML Void element is 2
+                         * (1 byte ID, 1 byte length field). This problem
+                         * is solved by writing the Cues' length field on
+                         * one byte more than necessary. */
+                        length_size++;
+                        size++;
+                    }
+                }
+            }
+            mkv_add_seekhead_entry(mkv, MATROSKA_ID_CUES, cuespos);
+            end_ebml_master_crc32(pb, &cues, mkv, MATROSKA_ID_CUES,
+                                  length_size, 0);
+            if (mkv->reserve_cues_space) {
+                if (size < mkv->reserve_cues_space)
+                    put_ebml_void(pb, mkv->reserve_cues_space - size);
+            } else
+                endpos = avio_tell(pb);
         }
 
-        mkv_write_seekhead(pb, mkv);
+    after_cues:
+        ret = mkv_write_seekhead(pb, mkv, 1, mkv->info_pos);
+        if (ret < 0)
+            return ret;
 
         // update the duration
         av_log(s, AV_LOG_DEBUG, "end duration = %" PRIu64 "\n", mkv->duration);
-        currentpos = avio_tell(pb);
         avio_seek(mkv->info_bc, mkv->duration_offset, SEEK_SET);
         put_ebml_float(mkv->info_bc, MATROSKA_ID_DURATION, mkv->duration);
-        avio_seek(pb, mkv->info.pos, SEEK_SET);
-        end_ebml_master_crc32(pb, &mkv->info_bc, mkv, mkv->info);
+        end_ebml_master_crc32(pb, &mkv->info_bc, mkv, MATROSKA_ID_INFO, 0, 0);
 
-        // write tracks master
-        avio_seek(pb, mkv->tracks_master.pos, SEEK_SET);
-        end_ebml_master_crc32(pb, &mkv->tracks_bc, mkv, mkv->tracks_master);
+        if (mkv->tracks_bc) {
+            // write Tracks master
+            avio_seek(pb, mkv->tracks_pos, SEEK_SET);
+            end_ebml_master_crc32(pb, &mkv->tracks_bc, mkv,
+                                  MATROSKA_ID_TRACKS, 0, 0);
+        }
 
         // update stream durations
-        if (!mkv->is_live && mkv->stream_durations) {
+        if (mkv->tags_bc) {
             int i;
-            int64_t curr = avio_tell(mkv->tags_bc);
             for (i = 0; i < s->nb_streams; ++i) {
-                AVStream *st = s->streams[i];
+                const AVStream     *st = s->streams[i];
+                const mkv_track *track = &mkv->tracks[i];
 
-                if (mkv->stream_duration_offsets[i] > 0) {
-                    double duration_sec = mkv->stream_durations[i] * av_q2d(st->time_base);
+                if (track->duration_offset > 0) {
+                    double duration_sec = track->duration * av_q2d(st->time_base);
                     char duration_string[20] = "";
 
                     av_log(s, AV_LOG_DEBUG, "stream %d end duration = %" PRIu64 "\n", i,
-                           mkv->stream_durations[i]);
+                           track->duration);
 
-                    avio_seek(mkv->tags_bc, mkv->stream_duration_offsets[i], SEEK_SET);
+                    avio_seek(mkv->tags_bc, track->duration_offset, SEEK_SET);
 
                     snprintf(duration_string, 20, "%02d:%02d:%012.9f",
                              (int) duration_sec / 3600, ((int) duration_sec / 60) % 60,
@@ -2665,22 +2570,18 @@
                     put_ebml_binary(mkv->tags_bc, MATROSKA_ID_TAGSTRING, duration_string, 20);
                 }
             }
-            avio_seek(mkv->tags_bc, curr, SEEK_SET);
-        }
-        if (mkv->tags.pos && !mkv->is_live) {
-            avio_seek(pb, mkv->tags.pos, SEEK_SET);
-            end_ebml_master_crc32(pb, &mkv->tags_bc, mkv, mkv->tags);
+
+            avio_seek(pb, mkv->tags_pos, SEEK_SET);
+            end_ebml_master_crc32(pb, &mkv->tags_bc, mkv, MATROSKA_ID_TAGS, 0, 0);
         }
 
-        avio_seek(pb, currentpos, SEEK_SET);
+        avio_seek(pb, endpos, SEEK_SET);
     }
 
-    if (!mkv->is_live) {
+    if (!mkv->is_live)
         end_ebml_master(pb, mkv->segment);
-    }
 
-    mkv_free(mkv);
-    return 0;
+    return mkv->reserve_cues_space < 0 ? AVERROR(EINVAL) : 0;
 }
 
 static int mkv_query_codec(enum AVCodecID codec_id, int std_compliance)
@@ -2710,17 +2611,31 @@
     return 0;
 }
 
+static uint64_t mkv_get_uid(const mkv_track *tracks, int i, AVLFG *c)
+{
+    while (1) {
+        uint64_t uid;
+        int k;
+        uid  = (uint64_t)av_lfg_get(c) << 32;
+        uid |= av_lfg_get(c);
+        if (!uid)
+            continue;
+        for (k = 0; k < i; k++) {
+            if (tracks[k].uid == uid)
+                break;
+        }
+        if (k == i)
+            return uid;
+    }
+}
+
 static int mkv_init(struct AVFormatContext *s)
 {
+    MatroskaMuxContext *mkv = s->priv_data;
+    AVLFG c;
+    unsigned nb_tracks = 0;
     int i;
 
-    if (s->nb_streams > MAX_TRACKS) {
-        av_log(s, AV_LOG_ERROR,
-               "At most %d streams are supported for muxing in Matroska\n",
-               MAX_TRACKS);
-        return AVERROR(EINVAL);
-    }
-
     for (i = 0; i < s->nb_streams; i++) {
         if (s->streams[i]->codecpar->codec_id == AV_CODEC_ID_ATRAC3 ||
             s->streams[i]->codecpar->codec_id == AV_CODEC_ID_COOK ||
@@ -2740,11 +2655,54 @@
         s->internal->avoid_negative_ts_use_pts = 1;
     }
 
-    for (i = 0; i < s->nb_streams; i++) {
-        // ms precision is the de-facto standard timescale for mkv files
-        avpriv_set_pts_info(s->streams[i], 64, 1, 1000);
+    if (!strcmp(s->oformat->name, "webm")) {
+        mkv->mode      = MODE_WEBM;
+        mkv->write_crc = 0;
+    } else
+        mkv->mode = MODE_MATROSKAv2;
+
+    mkv->tracks = av_mallocz_array(s->nb_streams, sizeof(*mkv->tracks));
+    if (!mkv->tracks)
+        return AVERROR(ENOMEM);
+
+    if (!(s->flags & AVFMT_FLAG_BITEXACT)) {
+        av_lfg_init(&c, av_get_random_seed());
+
+        // Calculate the SegmentUID now in order not to waste our random seed.
+        for (i = 0; i < 4; i++)
+            mkv->segment_uid[i] = av_lfg_get(&c);
     }
 
+    for (i = 0; i < s->nb_streams; i++) {
+        AVStream *st = s->streams[i];
+        mkv_track *track = &mkv->tracks[i];
+
+        if (s->flags & AVFMT_FLAG_BITEXACT) {
+            track->uid = i + 1;
+        } else {
+            track->uid = mkv_get_uid(mkv->tracks, i, &c);
+        }
+
+        // ms precision is the de-facto standard timescale for mkv files
+        avpriv_set_pts_info(st, 64, 1, 1000);
+
+        if (st->codecpar->codec_type == AVMEDIA_TYPE_ATTACHMENT) {
+            if (mkv->mode == MODE_WEBM) {
+                av_log(s, AV_LOG_WARNING, "Stream %d will be ignored "
+                       "as WebM doesn't support attachments.\n", i);
+            }
+            mkv->nb_attachments++;
+            continue;
+        }
+
+        nb_tracks++;
+        track->track_num = mkv->is_dash ? mkv->dash_track_number : nb_tracks;
+        track->track_num_size = ebml_num_size(track->track_num);
+    }
+
+    if (mkv->is_dash && nb_tracks != 1)
+        return AVERROR(EINVAL);
+
     return 0;
 }
 
@@ -2788,6 +2746,7 @@
 
 static const AVCodecTag additional_subtitle_tags[] = {
     { AV_CODEC_ID_DVB_SUBTITLE,      0xFFFFFFFF },
+    { AV_CODEC_ID_DVD_SUBTITLE,      0xFFFFFFFF },
     { AV_CODEC_ID_HDMV_PGS_SUBTITLE, 0xFFFFFFFF },
     { AV_CODEC_ID_NONE,              0xFFFFFFFF }
 };
@@ -2799,10 +2758,14 @@
     { "cluster_size_limit",  "Store at most the provided amount of bytes in a cluster. ",                                     OFFSET(cluster_size_limit), AV_OPT_TYPE_INT  , { .i64 = -1 }, -1, INT_MAX,   FLAGS },
     { "cluster_time_limit",  "Store at most the provided number of milliseconds in a cluster.",                               OFFSET(cluster_time_limit), AV_OPT_TYPE_INT64, { .i64 = -1 }, -1, INT64_MAX, FLAGS },
     { "dash", "Create a WebM file conforming to WebM DASH specification", OFFSET(is_dash), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, FLAGS },
-    { "dash_track_number", "Track number for the DASH stream", OFFSET(dash_track_number), AV_OPT_TYPE_INT, { .i64 = 1 }, 0, 127, FLAGS },
+    { "dash_track_number", "Track number for the DASH stream", OFFSET(dash_track_number), AV_OPT_TYPE_INT, { .i64 = 1 }, 1, INT_MAX, FLAGS },
     { "live", "Write files assuming it is a live stream.", OFFSET(is_live), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, FLAGS },
     { "allow_raw_vfw", "allow RAW VFW mode", OFFSET(allow_raw_vfw), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, FLAGS },
     { "write_crc32", "write a CRC32 element inside every Level 1 element", OFFSET(write_crc), AV_OPT_TYPE_BOOL, { .i64 = 1 }, 0, 1, FLAGS },
+    { "default_mode", "Controls how a track's FlagDefault is inferred", OFFSET(default_mode), AV_OPT_TYPE_INT, { .i64 = DEFAULT_MODE_INFER }, DEFAULT_MODE_INFER, DEFAULT_MODE_PASSTHROUGH, FLAGS, "default_mode" },
+    { "infer", "For each track type, mark the first track of disposition default as default; if none exists, mark the first track as default.", 0, AV_OPT_TYPE_CONST, { .i64 = DEFAULT_MODE_INFER }, 0, 0, FLAGS, "default_mode" },
+    { "infer_no_subs", "For each track type, mark the first track of disposition default as default; for audio and video: if none exists, mark the first track as default.", 0, AV_OPT_TYPE_CONST, { .i64 = DEFAULT_MODE_INFER_NO_SUBS }, 0, 0, FLAGS, "default_mode" },
+    { "passthrough", "Use the disposition flag as-is", 0, AV_OPT_TYPE_CONST, { .i64 = DEFAULT_MODE_PASSTHROUGH }, 0, 0, FLAGS, "default_mode" },
     { NULL },
 };
 
@@ -2825,6 +2788,7 @@
     .video_codec       = CONFIG_LIBX264_ENCODER ?
                          AV_CODEC_ID_H264 : AV_CODEC_ID_MPEG4,
     .init              = mkv_init,
+    .deinit            = mkv_deinit,
     .write_header      = mkv_write_header,
     .write_packet      = mkv_write_flush_packet,
     .write_trailer     = mkv_write_trailer,
@@ -2859,6 +2823,7 @@
     .video_codec       = CONFIG_LIBVPX_VP9_ENCODER? AV_CODEC_ID_VP9 : AV_CODEC_ID_VP8,
     .subtitle_codec    = AV_CODEC_ID_WEBVTT,
     .init              = mkv_init,
+    .deinit            = mkv_deinit,
     .write_header      = mkv_write_header,
     .write_packet      = mkv_write_flush_packet,
     .write_trailer     = mkv_write_trailer,
@@ -2887,6 +2852,7 @@
                          AV_CODEC_ID_VORBIS : AV_CODEC_ID_AC3,
     .video_codec       = AV_CODEC_ID_NONE,
     .init              = mkv_init,
+    .deinit            = mkv_deinit,
     .write_header      = mkv_write_header,
     .write_packet      = mkv_write_flush_packet,
     .write_trailer     = mkv_write_trailer,
diff --git a/libavformat/mgsts.c b/libavformat/mgsts.c
index 0720de8..415e052 100644
--- a/libavformat/mgsts.c
+++ b/libavformat/mgsts.c
@@ -24,7 +24,7 @@
 #include "avformat.h"
 #include "riff.h"
 
-static int read_probe(AVProbeData *p)
+static int read_probe(const AVProbeData *p)
 {
     if (AV_RB32(p->buf     ) != 0x000E ||
         AV_RB32(p->buf +  4) != 0x0050 ||
diff --git a/libavformat/microdvddec.c b/libavformat/microdvddec.c
index c2f1ac4..08e6fca 100644
--- a/libavformat/microdvddec.c
+++ b/libavformat/microdvddec.c
@@ -36,7 +36,7 @@
 } MicroDVDContext;
 
 
-static int microdvd_probe(AVProbeData *p)
+static int microdvd_probe(const AVProbeData *p)
 {
     unsigned char c;
     const uint8_t *ptr = p->buf;
@@ -102,6 +102,8 @@
         if (!len)
             break;
         line[strcspn(line, "\r\n")] = 0;
+        if (!*p)
+            continue;
         if (i++ < 3) {
             int frame;
             double fps;
@@ -115,10 +117,11 @@
                 continue;
             }
             if (!st->codecpar->extradata && sscanf(line, "{DEFAULT}{}%c", &c) == 1) {
-                st->codecpar->extradata = av_strdup(line + 11);
-                if (!st->codecpar->extradata)
-                    return AVERROR(ENOMEM);
-                st->codecpar->extradata_size = strlen(st->codecpar->extradata) + 1;
+                int ret, size = strlen(line + 11);
+                ret = ff_alloc_extradata(st->codecpar, size);
+                if (ret < 0)
+                    return ret;
+                memcpy(st->codecpar->extradata, line + 11, size);
                 continue;
             }
         }
diff --git a/libavformat/microdvdenc.c b/libavformat/microdvdenc.c
index 04f475b..1cd215d 100644
--- a/libavformat/microdvdenc.c
+++ b/libavformat/microdvdenc.c
@@ -36,7 +36,7 @@
     if (par->extradata && par->extradata_size > 0) {
         avio_write(s->pb, "{DEFAULT}{}", 11);
         avio_write(s->pb, par->extradata, par->extradata_size);
-        avio_flush(s->pb);
+        avio_w8(s->pb, '\n');
     }
 
     avpriv_set_pts_info(s->streams[0], 64, framerate.num, framerate.den);
@@ -51,7 +51,7 @@
     else
         avio_printf(avf->pb, "{%"PRId64"}", pkt->pts + pkt->duration);
     avio_write(avf->pb, pkt->data, pkt->size);
-    avio_write(avf->pb, "\n", 1);
+    avio_w8(avf->pb, '\n');
     return 0;
 }
 
diff --git a/libavformat/mj2kdec.c b/libavformat/mj2kdec.c
index 1fb9409..703ff91 100644
--- a/libavformat/mj2kdec.c
+++ b/libavformat/mj2kdec.c
@@ -24,7 +24,7 @@
 #include "rawdec.h"
 
 #if CONFIG_MJPEG_2000_DEMUXER
-static int mjpeg2000_probe(AVProbeData *p)
+static int mjpeg2000_probe(const AVProbeData *p)
 {
     const uint8_t *b = p->buf;
     int i, marker, marker_size;
diff --git a/libavformat/mlpdec.c b/libavformat/mlpdec.c
index d82df21..40b1833 100644
--- a/libavformat/mlpdec.c
+++ b/libavformat/mlpdec.c
@@ -25,7 +25,7 @@
 #include "rawdec.h"
 #include "libavutil/intreadwrite.h"
 
-static int av_always_inline mlp_thd_probe(AVProbeData *p, uint32_t sync)
+static int av_always_inline mlp_thd_probe(const AVProbeData *p, uint32_t sync)
 {
     const uint8_t *buf, *last_buf = p->buf, *end = p->buf + p->buf_size;
     int frames = 0, valid = 0, size = 0;
@@ -51,11 +51,12 @@
 }
 
 #if CONFIG_MLP_DEMUXER
-static int mlp_probe(AVProbeData *p)
+static int mlp_probe(const AVProbeData *p)
 {
     return mlp_thd_probe(p, 0xf8726fbb);
 }
 
+FF_RAW_DEMUXER_CLASS(mlp)
 AVInputFormat ff_mlp_demuxer = {
     .name           = "mlp",
     .long_name      = NULL_IF_CONFIG_SMALL("raw MLP"),
@@ -65,15 +66,18 @@
     .flags          = AVFMT_GENERIC_INDEX | AVFMT_NOTIMESTAMPS,
     .extensions     = "mlp",
     .raw_codec_id   = AV_CODEC_ID_MLP,
+    .priv_data_size = sizeof(FFRawDemuxerContext),
+    .priv_class     = &mlp_demuxer_class,
 };
 #endif
 
 #if CONFIG_TRUEHD_DEMUXER
-static int thd_probe(AVProbeData *p)
+static int thd_probe(const AVProbeData *p)
 {
     return mlp_thd_probe(p, 0xf8726fba);
 }
 
+FF_RAW_DEMUXER_CLASS(truehd)
 AVInputFormat ff_truehd_demuxer = {
     .name           = "truehd",
     .long_name      = NULL_IF_CONFIG_SMALL("raw TrueHD"),
@@ -83,6 +87,8 @@
     .flags          = AVFMT_GENERIC_INDEX | AVFMT_NOTIMESTAMPS,
     .extensions     = "thd",
     .raw_codec_id   = AV_CODEC_ID_TRUEHD,
+    .priv_data_size = sizeof(FFRawDemuxerContext),
+    .priv_class     = &truehd_demuxer_class,
 };
 #endif
 
diff --git a/libavformat/mlvdec.c b/libavformat/mlvdec.c
index ded8196..dae13ca 100644
--- a/libavformat/mlvdec.c
+++ b/libavformat/mlvdec.c
@@ -52,7 +52,7 @@
     uint64_t pts;
 } MlvContext;
 
-static int probe(AVProbeData *p)
+static int probe(const AVProbeData *p)
 {
     if (AV_RL32(p->buf) == MKTAG('M','L','V','I') &&
         AV_RL32(p->buf + 4) >= 52 &&
@@ -462,8 +462,7 @@
     MlvContext *mlv = s->priv_data;
     int i;
     for (i = 0; i < 100; i++)
-        if (mlv->pb[i])
-            ff_format_io_close(s, &mlv->pb[i]);
+        ff_format_io_close(s, &mlv->pb[i]);
     return 0;
 }
 
diff --git a/libavformat/mm.c b/libavformat/mm.c
index 8a1382e..d40fd12 100644
--- a/libavformat/mm.c
+++ b/libavformat/mm.c
@@ -58,7 +58,7 @@
   unsigned int audio_pts, video_pts;
 } MmDemuxContext;
 
-static int probe(AVProbeData *p)
+static int probe(const AVProbeData *p)
 {
     int len, type, fps, w, h;
     if (p->buf_size < MM_HEADER_LEN_AV + MM_PREAMBLE_SIZE)
@@ -142,6 +142,7 @@
     AVIOContext *pb = s->pb;
     unsigned char preamble[MM_PREAMBLE_SIZE];
     unsigned int type, length;
+    int ret;
 
     while(1) {
 
@@ -161,8 +162,8 @@
         case MM_TYPE_INTRA_HHV :
         case MM_TYPE_INTER_HHV :
             /* output preamble + data */
-            if (av_new_packet(pkt, length + MM_PREAMBLE_SIZE))
-                return AVERROR(ENOMEM);
+            if ((ret = av_new_packet(pkt, length + MM_PREAMBLE_SIZE)) < 0)
+                return ret;
             memcpy(pkt->data, preamble, MM_PREAMBLE_SIZE);
             if (avio_read(pb, pkt->data + MM_PREAMBLE_SIZE, length) != length)
                 return AVERROR(EIO);
@@ -174,8 +175,8 @@
             return 0;
 
         case MM_TYPE_AUDIO :
-            if (av_get_packet(s->pb, pkt, length)<0)
-                return AVERROR(ENOMEM);
+            if ((ret = av_get_packet(s->pb, pkt, length)) < 0)
+                return ret;
             pkt->stream_index = 1;
             pkt->pts = mm->audio_pts++;
             return 0;
diff --git a/libavformat/mmf.c b/libavformat/mmf.c
index 1393627..e4768db 100644
--- a/libavformat/mmf.c
+++ b/libavformat/mmf.c
@@ -123,8 +123,6 @@
 
     avpriv_set_pts_info(s->streams[0], 64, 1, s->streams[0]->codecpar->sample_rate);
 
-    avio_flush(pb);
-
     return 0;
 }
 
@@ -173,14 +171,12 @@
         avio_write(pb, "\x00\x00\x00\x00", 4);
 
         avio_seek(pb, pos, SEEK_SET);
-
-        avio_flush(pb);
     }
     return 0;
 }
 #endif /* CONFIG_MMF_MUXER */
 
-static int mmf_probe(AVProbeData *p)
+static int mmf_probe(const AVProbeData *p)
 {
     /* check file header */
     if (p->buf[0] == 'M' && p->buf[1] == 'M' &&
diff --git a/libavformat/mms.c b/libavformat/mms.c
index 768fda6..16babc0 100644
--- a/libavformat/mms.c
+++ b/libavformat/mms.c
@@ -60,7 +60,7 @@
 
     if (mms->asf_header_size < sizeof(ff_asf_guid) * 2 + 22 ||
         memcmp(p, ff_asf_header, sizeof(ff_asf_guid))) {
-        av_log(NULL, AV_LOG_ERROR,
+        av_log(mms->mms_hd, AV_LOG_ERROR,
                "Corrupt stream (invalid ASF header, size=%d)\n",
                mms->asf_header_size);
         return AVERROR_INVALIDDATA;
@@ -77,7 +77,7 @@
             chunksize = AV_RL64(p + sizeof(ff_asf_guid));
         }
         if (!chunksize || chunksize > end - p) {
-            av_log(NULL, AV_LOG_ERROR,
+            av_log(mms->mms_hd, AV_LOG_ERROR,
                    "Corrupt stream (header chunksize %"PRId64" is invalid)\n",
                    chunksize);
             return AVERROR_INVALIDDATA;
@@ -87,7 +87,7 @@
             if (end - p > sizeof(ff_asf_guid) * 2 + 68) {
                 mms->asf_packet_len = AV_RL32(p + sizeof(ff_asf_guid) * 2 + 64);
                 if (mms->asf_packet_len <= 0 || mms->asf_packet_len > sizeof(mms->in_buffer)) {
-                    av_log(NULL, AV_LOG_ERROR,
+                    av_log(mms->mms_hd, AV_LOG_ERROR,
                            "Corrupt stream (too large pkt_len %d)\n",
                            mms->asf_packet_len);
                     return AVERROR_INVALIDDATA;
@@ -110,7 +110,7 @@
                     mms->streams[mms->stream_num].id = stream_id;
                     mms->stream_num++;
                 } else {
-                    av_log(NULL, AV_LOG_ERROR,
+                    av_log(mms->mms_hd, AV_LOG_ERROR,
                            "Corrupt stream (too many A/V streams)\n");
                     return AVERROR_INVALIDDATA;
                 }
@@ -121,7 +121,7 @@
                 uint64_t skip_bytes = 88;
                 while (stream_count--) {
                     if (end - p < skip_bytes + 4) {
-                        av_log(NULL, AV_LOG_ERROR,
+                        av_log(mms->mms_hd, AV_LOG_ERROR,
                                "Corrupt stream (next stream name length is not in the buffer)\n");
                         return AVERROR_INVALIDDATA;
                     }
@@ -129,14 +129,14 @@
                 }
                 while (ext_len_count--) {
                     if (end - p < skip_bytes + 22) {
-                        av_log(NULL, AV_LOG_ERROR,
+                        av_log(mms->mms_hd, AV_LOG_ERROR,
                                "Corrupt stream (next extension system info length is not in the buffer)\n");
                         return AVERROR_INVALIDDATA;
                     }
                     skip_bytes += 22 + AV_RL32(p + skip_bytes + 18);
                 }
                 if (end - p < skip_bytes) {
-                    av_log(NULL, AV_LOG_ERROR,
+                    av_log(mms->mms_hd, AV_LOG_ERROR,
                            "Corrupt stream (the last extension system info length is invalid)\n");
                     return AVERROR_INVALIDDATA;
                 }
@@ -146,7 +146,7 @@
         } else if (!memcmp(p, ff_asf_head1_guid, sizeof(ff_asf_guid))) {
             chunksize = 46; // see references [2] section 3.4. This should be set 46.
             if (chunksize > end - p) {
-                av_log(NULL, AV_LOG_ERROR,
+                av_log(mms->mms_hd, AV_LOG_ERROR,
                     "Corrupt stream (header chunksize %"PRId64" is invalid)\n",
                     chunksize);
                 return AVERROR_INVALIDDATA;
diff --git a/libavformat/mmst.c b/libavformat/mmst.c
index a97c2e0..533cbe7 100644
--- a/libavformat/mmst.c
+++ b/libavformat/mmst.c
@@ -141,7 +141,7 @@
     // write it out.
     write_result= ffurl_write(mms->mms_hd, mms->out_buffer, exact_length);
     if(write_result != exact_length) {
-        av_log(NULL, AV_LOG_ERROR,
+        av_log(mms->mms_hd, AV_LOG_ERROR,
                "Failed to write data of length %d: %d (%s)\n",
                exact_length, write_result,
                write_result < 0 ? strerror(AVUNERROR(write_result)) :
@@ -215,11 +215,11 @@
 static void handle_packet_stream_changing_type(MMSTContext *mmst)
 {
     MMSContext *mms = &mmst->mms;
-    av_log(NULL, AV_LOG_TRACE, "Stream changing!\n");
+    av_log(mms->mms_hd, AV_LOG_TRACE, "Stream changing!\n");
 
     // 40 is the packet header size, 7 is the prefix size.
     mmst->header_packet_id= AV_RL32(mms->in_buffer + 40 + 7);
-    av_log(NULL, AV_LOG_TRACE, "Changed header prefix to 0x%x", mmst->header_packet_id);
+    av_log(mms->mms_hd, AV_LOG_TRACE, "Changed header prefix to 0x%x", mmst->header_packet_id);
 }
 
 static int send_keepalive_packet(MMSTContext *mmst)
@@ -251,12 +251,12 @@
         read_result = ffurl_read_complete(mms->mms_hd, mms->in_buffer, 8);
         if (read_result != 8) {
             if(read_result < 0) {
-                av_log(NULL, AV_LOG_ERROR,
+                av_log(mms->mms_hd, AV_LOG_ERROR,
                        "Error reading packet header: %d (%s)\n",
                        read_result, strerror(AVUNERROR(read_result)));
                 packet_type = SC_PKT_CANCEL;
             } else {
-                av_log(NULL, AV_LOG_ERROR,
+                av_log(mms->mms_hd, AV_LOG_ERROR,
                        "The server closed the connection\n");
                 packet_type = SC_PKT_NO_DATA;
             }
@@ -270,7 +270,7 @@
             mmst->incoming_flags= mms->in_buffer[3];
             read_result= ffurl_read_complete(mms->mms_hd, mms->in_buffer+8, 4);
             if(read_result != 4) {
-                av_log(NULL, AV_LOG_ERROR,
+                av_log(mms->mms_hd, AV_LOG_ERROR,
                        "Reading command packet length failed: %d (%s)\n",
                        read_result,
                        read_result < 0 ? strerror(AVUNERROR(read_result)) :
@@ -279,11 +279,11 @@
             }
 
             length_remaining= AV_RL32(mms->in_buffer+8) + 4;
-            av_log(NULL, AV_LOG_TRACE, "Length remaining is %d\n", length_remaining);
+            av_log(mms->mms_hd, AV_LOG_TRACE, "Length remaining is %d\n", length_remaining);
             // read the rest of the packet.
             if (length_remaining < 0
                 || length_remaining > sizeof(mms->in_buffer) - 12) {
-                av_log(NULL, AV_LOG_ERROR,
+                av_log(mms->mms_hd, AV_LOG_ERROR,
                        "Incoming packet length %d exceeds bufsize %"SIZE_SPECIFIER"\n",
                        length_remaining, sizeof(mms->in_buffer) - 12);
                 return AVERROR_INVALIDDATA;
@@ -291,7 +291,7 @@
             read_result = ffurl_read_complete(mms->mms_hd, mms->in_buffer + 12,
                                             length_remaining) ;
             if (read_result != length_remaining) {
-                av_log(NULL, AV_LOG_ERROR,
+                av_log(mms->mms_hd, AV_LOG_ERROR,
                        "Reading pkt data (length=%d) failed: %d (%s)\n",
                        length_remaining, read_result,
                        read_result < 0 ? strerror(AVUNERROR(read_result)) :
@@ -300,7 +300,7 @@
             }
             packet_type= AV_RL16(mms->in_buffer+36);
             if (read_result >= 44 && (hr = AV_RL32(mms->in_buffer + 40))) {
-                av_log(NULL, AV_LOG_ERROR,
+                av_log(mms->mms_hd, AV_LOG_ERROR,
                        "Server sent a message with packet type 0x%x and error status code 0x%08x\n", packet_type, hr);
                 return AVERROR(EINVAL);
             }
@@ -319,7 +319,7 @@
 
             if (length_remaining < 0
                 || length_remaining > sizeof(mms->in_buffer) - 8) {
-                av_log(NULL, AV_LOG_ERROR,
+                av_log(mms->mms_hd, AV_LOG_ERROR,
                        "Data length %d is invalid or too large (max=%"SIZE_SPECIFIER")\n",
                        length_remaining, sizeof(mms->in_buffer));
                 return AVERROR_INVALIDDATA;
@@ -328,7 +328,7 @@
             mms->read_in_ptr         = mms->in_buffer;
             read_result= ffurl_read_complete(mms->mms_hd, mms->in_buffer, length_remaining);
             if(read_result != length_remaining) {
-                av_log(NULL, AV_LOG_ERROR,
+                av_log(mms->mms_hd, AV_LOG_ERROR,
                        "Failed to read packet data of size %d: %d (%s)\n",
                        length_remaining, read_result,
                        read_result < 0 ? strerror(AVUNERROR(read_result)) :
@@ -358,7 +358,7 @@
             } else if(packet_id_type == mmst->packet_id) {
                 packet_type = SC_PKT_ASF_MEDIA;
             } else {
-                av_log(NULL, AV_LOG_TRACE, "packet id type %d is old.", packet_id_type);
+                av_log(mms->mms_hd, AV_LOG_TRACE, "packet id type %d is old.", packet_id_type);
                 continue;
             }
         }
@@ -555,14 +555,14 @@
     if (err)
         goto fail;
     if((mmst->incoming_flags != 0X08) && (mmst->incoming_flags != 0X0C)) {
-        av_log(NULL, AV_LOG_ERROR,
+        av_log(h, AV_LOG_ERROR,
                "The server does not support MMST (try MMSH or RTSP)\n");
         err = AVERROR(EINVAL);
         goto fail;
     }
     err = ff_mms_asf_header_parser(mms);
     if (err) {
-        av_log(NULL, AV_LOG_TRACE, "asf header parsed failed!\n");
+        av_log(h, AV_LOG_TRACE, "asf header parsed failed!\n");
         goto fail;
     }
     mms->header_parsed = 1;
@@ -579,11 +579,11 @@
     if (err) {
         goto fail;
     }
-    av_log(NULL, AV_LOG_TRACE, "Leaving open (success)\n");
+    av_log(h, AV_LOG_TRACE, "Leaving open (success)\n");
     return 0;
 fail:
     mms_close(h);
-    av_log(NULL, AV_LOG_TRACE, "Leaving open (failure: %d)\n", err);
+    av_log(mms->mms_hd, AV_LOG_TRACE, "Leaving open (failure: %d)\n", err);
     return err;
 }
 
@@ -608,7 +608,7 @@
             int err = mms_safe_send_recv(mmst, NULL, SC_PKT_ASF_MEDIA);
             if (err == 0) {
                 if(mms->remaining_in_len>mms->asf_packet_len) {
-                    av_log(NULL, AV_LOG_ERROR,
+                    av_log(h, AV_LOG_ERROR,
                            "Incoming pktlen %d is larger than ASF pktsize %d\n",
                            mms->remaining_in_len, mms->asf_packet_len);
                     result= AVERROR(EIO);
@@ -616,12 +616,12 @@
                     // copy the data to the packet buffer.
                     result = ff_mms_read_data(mms, buf, size);
                     if (result == 0) {
-                        av_log(NULL, AV_LOG_TRACE, "Read ASF media packet size is zero!\n");
+                        av_log(h, AV_LOG_TRACE, "Read ASF media packet size is zero!\n");
                         break;
                     }
                 }
             } else {
-                av_log(NULL, AV_LOG_TRACE, "read packet error!\n");
+                av_log(h, AV_LOG_TRACE, "read packet error!\n");
                 break;
             }
         }
diff --git a/libavformat/mov.c b/libavformat/mov.c
index ec57a05..3d6fef6 100644
--- a/libavformat/mov.c
+++ b/libavformat/mov.c
@@ -46,9 +46,11 @@
 #include "libavutil/spherical.h"
 #include "libavutil/stereo3d.h"
 #include "libavutil/timecode.h"
+#include "libavutil/dovi_meta.h"
 #include "libavcodec/ac3tab.h"
 #include "libavcodec/flac.h"
 #include "libavcodec/mpegaudiodecheader.h"
+#include "libavcodec/mlp_parse.h"
 #include "avformat.h"
 #include "internal.h"
 #include "avio_internal.h"
@@ -1004,6 +1006,7 @@
     sha = av_sha_alloc();
     if (!sha)
         return AVERROR(ENOMEM);
+    av_free(c->aes_decrypt);
     c->aes_decrypt = av_aes_alloc();
     if (!c->aes_decrypt) {
         ret = AVERROR(ENOMEM);
@@ -1128,8 +1131,8 @@
         return ret;
     }
     comp_brands_str[comp_brand_size] = 0;
-    av_dict_set(&c->fc->metadata, "compatible_brands", comp_brands_str, 0);
-    av_freep(&comp_brands_str);
+    av_dict_set(&c->fc->metadata, "compatible_brands",
+                comp_brands_str, AV_DICT_DONT_STRDUP_VAL);
 
     return 0;
 }
@@ -1234,16 +1237,12 @@
 
 static int64_t get_stream_info_time(MOVFragmentStreamInfo * frag_stream_info)
 {
-
-    if (frag_stream_info) {
-        if (frag_stream_info->sidx_pts != AV_NOPTS_VALUE)
-            return frag_stream_info->sidx_pts;
-        if (frag_stream_info->first_tfra_pts != AV_NOPTS_VALUE)
-            return frag_stream_info->first_tfra_pts;
-        if (frag_stream_info->tfdt_dts != AV_NOPTS_VALUE)
-            return frag_stream_info->tfdt_dts;
-    }
-    return AV_NOPTS_VALUE;
+    av_assert0(frag_stream_info);
+    if (frag_stream_info->sidx_pts != AV_NOPTS_VALUE)
+        return frag_stream_info->sidx_pts;
+    if (frag_stream_info->first_tfra_pts != AV_NOPTS_VALUE)
+        return frag_stream_info->first_tfra_pts;
+    return frag_stream_info->tfdt_dts;
 }
 
 static int64_t get_frag_time(MOVFragmentIndex *frag_index,
@@ -1270,7 +1269,7 @@
 static int search_frag_timestamp(MOVFragmentIndex *frag_index,
                                  AVStream *st, int64_t timestamp)
 {
-    int a, b, m;
+    int a, b, m, m0;
     int64_t frag_time;
     int id = -1;
 
@@ -1286,15 +1285,18 @@
     b = frag_index->nb_items;
 
     while (b - a > 1) {
-        m = (a + b) >> 1;
-        frag_time = get_frag_time(frag_index, m, id);
-        if (frag_time != AV_NOPTS_VALUE) {
-            if (frag_time >= timestamp)
-                b = m;
-            if (frag_time <= timestamp)
-                a = m;
-        }
+        m0 = m = (a + b) >> 1;
+
+        while (m < b &&
+               (frag_time = get_frag_time(frag_index, m, id)) == AV_NOPTS_VALUE)
+            m++;
+
+        if (m < b && frag_time <= timestamp)
+            a = m;
+        else
+            b = m0;
     }
+
     return a;
 }
 
@@ -1326,9 +1328,16 @@
         return -1;
 
     for (i = 0; i < c->fc->nb_streams; i++) {
+        // Avoid building frag index if streams lack track id.
+        if (c->fc->streams[i]->id < 0) {
+            av_free(frag_stream_info);
+            return AVERROR_INVALIDDATA;
+        }
+
         frag_stream_info[i].id = c->fc->streams[i]->id;
         frag_stream_info[i].sidx_pts = AV_NOPTS_VALUE;
         frag_stream_info[i].tfdt_dts = AV_NOPTS_VALUE;
+        frag_stream_info[i].next_trun_dts = AV_NOPTS_VALUE;
         frag_stream_info[i].first_tfra_pts = AV_NOPTS_VALUE;
         frag_stream_info[i].index_entry = -1;
         frag_stream_info[i].encryption_index = NULL;
@@ -1366,6 +1375,9 @@
 
 static int mov_read_moof(MOVContext *c, AVIOContext *pb, MOVAtom atom)
 {
+    // Set by mov_read_tfhd(). mov_read_trun() will reject files missing tfhd.
+    c->fragment.found_tfhd = 0;
+
     if (!c->has_looked_for_mfra && c->use_mfra_for > 0) {
         c->has_looked_for_mfra = 1;
         if (pb->seekable & AVIO_SEEKABLE_NORMAL) {
@@ -1387,14 +1399,14 @@
     return mov_read_default(c, pb, atom);
 }
 
-static void mov_metadata_creation_time(AVDictionary **metadata, int64_t time)
+static void mov_metadata_creation_time(AVDictionary **metadata, int64_t time, void *logctx)
 {
     if (time) {
         if(time >= 2082844800)
             time -= 2082844800;  /* seconds between 1904-01-01 and Epoch */
 
         if ((int64_t)(time * 1000000ULL) / 1000000 != time) {
-            av_log(NULL, AV_LOG_DEBUG, "creation_time is not representable\n");
+            av_log(logctx, AV_LOG_DEBUG, "creation_time is not representable\n");
             return;
         }
 
@@ -1434,7 +1446,7 @@
         creation_time = avio_rb32(pb);
         avio_rb32(pb); /* modification time */
     }
-    mov_metadata_creation_time(&st->metadata, creation_time);
+    mov_metadata_creation_time(&st->metadata, creation_time, c->fc);
 
     sc->time_scale = avio_rb32(pb);
     if (sc->time_scale <= 0) {
@@ -1465,7 +1477,7 @@
         creation_time = avio_rb32(pb);
         avio_rb32(pb); /* modification time */
     }
-    mov_metadata_creation_time(&c->fc->metadata, creation_time);
+    mov_metadata_creation_time(&c->fc->metadata, creation_time, c->fc);
     c->time_scale = avio_rb32(pb); /* time scale */
     if (c->time_scale <= 0) {
         av_log(c->fc, AV_LOG_ERROR, "Invalid mvhd time scale %d, defaulting to 1\n", c->time_scale);
@@ -1537,6 +1549,7 @@
 static int mov_read_colr(MOVContext *c, AVIOContext *pb, MOVAtom atom)
 {
     AVStream *st;
+    uint8_t *icc_profile;
     char color_parameter_type[5] = { 0 };
     uint16_t color_primaries, color_trc, color_matrix;
     int ret;
@@ -1549,41 +1562,51 @@
     if (ret < 0)
         return ret;
     if (strncmp(color_parameter_type, "nclx", 4) &&
-        strncmp(color_parameter_type, "nclc", 4)) {
+        strncmp(color_parameter_type, "nclc", 4) &&
+        strncmp(color_parameter_type, "prof", 4)) {
         av_log(c->fc, AV_LOG_WARNING, "unsupported color_parameter_type %s\n",
                color_parameter_type);
         return 0;
     }
 
-    color_primaries = avio_rb16(pb);
-    color_trc = avio_rb16(pb);
-    color_matrix = avio_rb16(pb);
-
-    av_log(c->fc, AV_LOG_TRACE,
-           "%s: pri %d trc %d matrix %d",
-           color_parameter_type, color_primaries, color_trc, color_matrix);
-
-    if (!strncmp(color_parameter_type, "nclx", 4)) {
-        uint8_t color_range = avio_r8(pb) >> 7;
-        av_log(c->fc, AV_LOG_TRACE, " full %"PRIu8"", color_range);
-        if (color_range)
-            st->codecpar->color_range = AVCOL_RANGE_JPEG;
-        else
-            st->codecpar->color_range = AVCOL_RANGE_MPEG;
+    if (!strncmp(color_parameter_type, "prof", 4)) {
+        icc_profile = av_stream_new_side_data(st, AV_PKT_DATA_ICC_PROFILE, atom.size - 4);
+        if (!icc_profile)
+            return AVERROR(ENOMEM);
+        ret = ffio_read_size(pb, icc_profile, atom.size - 4);
+        if (ret < 0)
+            return ret;
     }
+    else {
+        color_primaries = avio_rb16(pb);
+        color_trc = avio_rb16(pb);
+        color_matrix = avio_rb16(pb);
 
-    if (!av_color_primaries_name(color_primaries))
-        color_primaries = AVCOL_PRI_UNSPECIFIED;
-    if (!av_color_transfer_name(color_trc))
-        color_trc = AVCOL_TRC_UNSPECIFIED;
-    if (!av_color_space_name(color_matrix))
-        color_matrix = AVCOL_SPC_UNSPECIFIED;
+        av_log(c->fc, AV_LOG_TRACE,
+               "%s: pri %d trc %d matrix %d",
+               color_parameter_type, color_primaries, color_trc, color_matrix);
 
-    st->codecpar->color_primaries = color_primaries;
-    st->codecpar->color_trc       = color_trc;
-    st->codecpar->color_space     = color_matrix;
-    av_log(c->fc, AV_LOG_TRACE, "\n");
+        if (!strncmp(color_parameter_type, "nclx", 4)) {
+            uint8_t color_range = avio_r8(pb) >> 7;
+            av_log(c->fc, AV_LOG_TRACE, " full %"PRIu8"", color_range);
+            if (color_range)
+                st->codecpar->color_range = AVCOL_RANGE_JPEG;
+            else
+                st->codecpar->color_range = AVCOL_RANGE_MPEG;
+        }
 
+        if (!av_color_primaries_name(color_primaries))
+            color_primaries = AVCOL_PRI_UNSPECIFIED;
+        if (!av_color_transfer_name(color_trc))
+            color_trc = AVCOL_TRC_UNSPECIFIED;
+        if (!av_color_space_name(color_matrix))
+            color_matrix = AVCOL_SPC_UNSPECIFIED;
+
+        st->codecpar->color_primaries = color_primaries;
+        st->codecpar->color_trc       = color_trc;
+        st->codecpar->color_space     = color_matrix;
+        av_log(c->fc, AV_LOG_TRACE, "\n");
+    }
     return 0;
 }
 
@@ -1614,7 +1637,7 @@
         }
     }
     if (decoded_field_order == AV_FIELD_UNKNOWN && mov_field_order) {
-        av_log(NULL, AV_LOG_ERROR, "Unknown MOV field order 0x%04x\n", mov_field_order);
+        av_log(c->fc, AV_LOG_ERROR, "Unknown MOV field order 0x%04x\n", mov_field_order);
     }
     st->codecpar->field_order = decoded_field_order;
 
@@ -1791,19 +1814,19 @@
                         par->color_range = AVCOL_RANGE_JPEG;
                         break;
                     default:
-                        av_log(c, AV_LOG_WARNING, "ignored unknown aclr value (%d)\n", range_value);
+                        av_log(c->fc, AV_LOG_WARNING, "ignored unknown aclr value (%d)\n", range_value);
                         break;
                     }
-                    ff_dlog(c, "color_range: %d\n", par->color_range);
+                    ff_dlog(c->fc, "color_range: %d\n", par->color_range);
                 } else {
                   /* For some reason the whole atom was not added to the extradata */
-                  av_log(c, AV_LOG_ERROR, "aclr not decoded - incomplete atom\n");
+                  av_log(c->fc, AV_LOG_ERROR, "aclr not decoded - incomplete atom\n");
                 }
             } else {
-                av_log(c, AV_LOG_ERROR, "aclr not decoded - unable to add atom to extradata\n");
+                av_log(c->fc, AV_LOG_ERROR, "aclr not decoded - unable to add atom to extradata\n");
             }
         } else {
-            av_log(c, AV_LOG_WARNING, "aclr not decoded - unexpected size %"PRId64"\n", atom.size);
+            av_log(c->fc, AV_LOG_WARNING, "aclr not decoded - unexpected size %"PRId64"\n", atom.size);
         }
     }
 
@@ -1831,7 +1854,6 @@
         st->codecpar->codec_id == AV_CODEC_ID_QDMC ||
         st->codecpar->codec_id == AV_CODEC_ID_SPEEX) {
         // pass all frma atom to codec, needed at least for QDMC and QDM2
-        av_freep(&st->codecpar->extradata);
         ret = ff_get_extradata(c->fc, st->codecpar, pb, atom.size);
         if (ret < 0)
             return ret;
@@ -1895,14 +1917,18 @@
             return mov_read_default(c, pb, atom);
     }
     if (st->codecpar->extradata_size > 1 && st->codecpar->extradata) {
-        av_log(c, AV_LOG_WARNING, "ignoring multiple glbl\n");
+        av_log(c->fc, AV_LOG_WARNING, "ignoring multiple glbl\n");
         return 0;
     }
-    av_freep(&st->codecpar->extradata);
     ret = ff_get_extradata(c->fc, st->codecpar, pb, atom.size);
     if (ret < 0)
         return ret;
     if (atom.type == MKTAG('h','v','c','C') && st->codecpar->codec_tag == MKTAG('d','v','h','1'))
+        /* HEVC-based Dolby Vision derived from hvc1.
+           Happens to match with an identifier
+           previously utilized for DV. Thus, if we have
+           the hvcC extradata box available as specified,
+           set codec to HEVC */
         st->codecpar->codec_id = AV_CODEC_ID_HEVC;
 
     return 0;
@@ -1926,7 +1952,6 @@
         return 0;
 
     avio_seek(pb, 6, SEEK_CUR);
-    av_freep(&st->codecpar->extradata);
     ret = ff_get_extradata(c->fc, st->codecpar, pb, atom.size - 7);
     if (ret < 0)
         return ret;
@@ -1954,7 +1979,6 @@
         return AVERROR_INVALIDDATA;
 
     avio_skip(pb, 40);
-    av_freep(&st->codecpar->extradata);
     ret = ff_get_extradata(c->fc, st->codecpar, pb, atom.size - 40);
     if (ret < 0)
         return ret;
@@ -1968,6 +1992,10 @@
     MOVStreamContext *sc;
     unsigned int i, entries;
 
+    if (c->trak_index < 0) {
+        av_log(c->fc, AV_LOG_WARNING, "STCO outside TRAK\n");
+        return 0;
+    }
     if (c->fc->nb_streams < 1)
         return 0;
     st = c->fc->streams[c->fc->nb_streams-1];
@@ -2243,7 +2271,7 @@
 {
     char buf[256] = {0};
     uint8_t *src = st->codecpar->extradata;
-    int i;
+    int i, ret;
 
     if (st->codecpar->extradata_size != 64)
         return 0;
@@ -2263,12 +2291,9 @@
     if (av_strlcat(buf, "\n", sizeof(buf)) >= sizeof(buf))
         return 0;
 
-    av_freep(&st->codecpar->extradata);
-    st->codecpar->extradata_size = 0;
-    st->codecpar->extradata = av_mallocz(strlen(buf) + AV_INPUT_BUFFER_PADDING_SIZE);
-    if (!st->codecpar->extradata)
-        return AVERROR(ENOMEM);
-    st->codecpar->extradata_size = strlen(buf);
+    ret = ff_alloc_extradata(st->codecpar, strlen(buf));
+    if (ret < 0)
+        return ret;
     memcpy(st->codecpar->extradata, buf, st->codecpar->extradata_size);
 
     return 0;
@@ -2292,8 +2317,8 @@
             int val;
             val = AV_RB32(st->codecpar->extradata + 4);
             tmcd_ctx->tmcd_flags = val;
-            st->avg_frame_rate.num = st->codecpar->extradata[16]; /* number of frame */
-            st->avg_frame_rate.den = 1;
+            st->avg_frame_rate.num = AV_RB32(st->codecpar->extradata + 8); /* timescale */
+            st->avg_frame_rate.den = AV_RB32(st->codecpar->extradata + 12); /* frameDuration */
 #if FF_API_LAVF_AVCTX
 FF_DISABLE_DEPRECATION_WARNINGS
             st->codec->time_base = av_inv_q(st->avg_frame_rate);
@@ -2654,6 +2679,10 @@
             sc->stsc_data[i].id < 1) {
             av_log(c->fc, AV_LOG_WARNING, "STSC entry %d is invalid (first=%d count=%d id=%d)\n", i, sc->stsc_data[i].first, sc->stsc_data[i].count, sc->stsc_data[i].id);
             if (i+1 >= sc->stsc_count) {
+                if (sc->stsc_data[i].count == 0 && i > 0) {
+                    sc->stsc_count --;
+                    continue;
+                }
                 sc->stsc_data[i].first = FFMAX(sc->stsc_data[i].first, first_min);
                 if (i > 0 && sc->stsc_data[i].first <= sc->stsc_data[i-1].first)
                     sc->stsc_data[i].first = FFMIN(sc->stsc_data[i-1].first + 1LL, INT_MAX);
@@ -2689,8 +2718,11 @@
 
     if (mov_stsc_index_valid(index, sc->stsc_count))
         chunk_count = sc->stsc_data[index + 1].first - sc->stsc_data[index].first;
-    else
+    else {
+        // Validation for stsc / stco  happens earlier in mov_read_stsc + mov_read_trak.
+        av_assert0(sc->stsc_data[index].first <= sc->chunk_count);
         chunk_count = sc->chunk_count - (sc->stsc_data[index].first - 1);
+    }
 
     return sc->stsc_data[index].count * (int64_t)chunk_count;
 }
@@ -2918,12 +2950,6 @@
         av_log(c->fc, AV_LOG_TRACE, "sample_count=%d, sample_duration=%d\n",
                 sample_count, sample_duration);
 
-        if (   i+1 == entries
-            && i
-            && sample_count == 1
-            && total_sample_count > 100
-            && sample_duration/10 > duration / total_sample_count)
-            sample_duration = duration / total_sample_count;
         duration+=(int64_t)sample_duration*(uint64_t)sample_count;
         total_sample_count+=sample_count;
     }
@@ -2932,7 +2958,7 @@
 
     if (duration > 0 &&
         duration <= INT64_MAX - sc->duration_for_fps &&
-        total_sample_count <= INT64_MAX - sc->nb_frames_for_fps
+        total_sample_count <= INT_MAX - sc->nb_frames_for_fps
     ) {
         sc->duration_for_fps  += duration;
         sc->nb_frames_for_fps += total_sample_count;
@@ -2950,11 +2976,45 @@
     return 0;
 }
 
-static void mov_update_dts_shift(MOVStreamContext *sc, int duration)
+static int mov_read_sdtp(MOVContext *c, AVIOContext *pb, MOVAtom atom)
+{
+    AVStream *st;
+    MOVStreamContext *sc;
+    int64_t i, entries;
+
+    if (c->fc->nb_streams < 1)
+        return 0;
+    st = c->fc->streams[c->fc->nb_streams - 1];
+    sc = st->priv_data;
+
+    avio_r8(pb); /* version */
+    avio_rb24(pb); /* flags */
+    entries = atom.size - 4;
+
+    av_log(c->fc, AV_LOG_TRACE, "track[%u].sdtp.entries = %" PRId64 "\n",
+           c->fc->nb_streams - 1, entries);
+
+    if (sc->sdtp_data)
+        av_log(c->fc, AV_LOG_WARNING, "Duplicated SDTP atom\n");
+    av_freep(&sc->sdtp_data);
+    sc->sdtp_count = 0;
+
+    sc->sdtp_data = av_mallocz(entries);
+    if (!sc->sdtp_data)
+        return AVERROR(ENOMEM);
+
+    for (i = 0; i < entries && !pb->eof_reached; i++)
+        sc->sdtp_data[i] = avio_r8(pb);
+    sc->sdtp_count = i;
+
+    return 0;
+}
+
+static void mov_update_dts_shift(MOVStreamContext *sc, int duration, void *logctx)
 {
     if (duration < 0) {
         if (duration == INT_MIN) {
-            av_log(NULL, AV_LOG_WARNING, "mov_update_dts_shift(): dts_shift set to %d\n", INT_MAX);
+            av_log(logctx, AV_LOG_WARNING, "mov_update_dts_shift(): dts_shift set to %d\n", INT_MAX);
             duration++;
         }
         sc->dts_shift = FFMAX(sc->dts_shift, -duration);
@@ -3012,7 +3072,7 @@
         }
 
         if (i+2<entries)
-            mov_update_dts_shift(sc, duration);
+            mov_update_dts_shift(sc, duration, c->fc);
     }
 
     sc->ctts_count = ctts_count;
@@ -3438,6 +3498,7 @@
     MOVIndexRange *current_index_range;
     int i;
     int found_keyframe_after_edit = 0;
+    int found_non_empty_edit = 0;
 
     if (!msc->elst_data || msc->elst_count <= 0 || nb_old <= 0) {
         return;
@@ -3484,10 +3545,11 @@
         edit_list_dts_counter = edit_list_dts_entry_end;
         edit_list_dts_entry_end += edit_list_duration;
         num_discarded_begin = 0;
-        if (edit_list_media_time == -1) {
+        if (!found_non_empty_edit && edit_list_media_time == -1) {
             empty_edits_sum_duration += edit_list_duration;
             continue;
         }
+        found_non_empty_edit = 1;
 
         // If we encounter a non-negative edit list reset the skip_samples/start_pad fields and set them
         // according to the edit list below.
@@ -4154,7 +4216,7 @@
 
     st = avformat_new_stream(c->fc, NULL);
     if (!st) return AVERROR(ENOMEM);
-    st->id = c->fc->nb_streams;
+    st->id = -1;
     sc = av_mallocz(sizeof(MOVStreamContext));
     if (!sc) return AVERROR(ENOMEM);
 
@@ -4168,6 +4230,13 @@
 
     c->trak_index = -1;
 
+    // Here stsc refers to a chunk not described in stco. This is technically invalid,
+    // but we can overlook it (clearing stsc) whenever stts_count == 0 (indicating no samples).
+    if (!sc->chunk_count && !sc->stts_count && sc->stsc_count) {
+        sc->stsc_count = 0;
+        av_freep(&sc->stsc_data);
+    }
+
     /* sanity checks */
     if ((sc->chunk_count && (!sc->stts_count || !sc->stsc_count ||
                             (!sc->sample_size && !sc->sample_count))) ||
@@ -4176,7 +4245,7 @@
                st->index);
         return 0;
     }
-    if (sc->chunk_count && sc->stsc_count && sc->stsc_data[ sc->stsc_count - 1 ].first > sc->chunk_count) {
+    if (sc->stsc_count && sc->stsc_data[ sc->stsc_count - 1 ].first > sc->chunk_count) {
         av_log(c->fc, AV_LOG_ERROR, "stream %d, contradictionary STSC and STCO\n",
                st->index);
         return AVERROR_INVALIDDATA;
@@ -4401,7 +4470,10 @@
 static int mov_read_meta(MOVContext *c, AVIOContext *pb, MOVAtom atom)
 {
     while (atom.size > 8) {
-        uint32_t tag = avio_rl32(pb);
+        uint32_t tag;
+        if (avio_feof(pb))
+            return AVERROR_EOF;
+        tag = avio_rl32(pb);
         atom.size -= 4;
         if (tag == MKTAG('h','d','l','r')) {
             avio_seek(pb, -8, SEEK_CUR);
@@ -4438,6 +4510,11 @@
     st = c->fc->streams[c->fc->nb_streams-1];
     sc = st->priv_data;
 
+    // Each stream (trak) should have exactly 1 tkhd. This catches bad files and
+    // avoids corrupting AVStreams mapped to an earlier tkhd.
+    if (st->id != -1)
+        return AVERROR_INVALIDDATA;
+
     version = avio_r8(pb);
     flags = avio_rb24(pb);
     st->disposition |= (flags & MOV_TKHD_FLAG_ENABLED) ? AV_DISPOSITION_DEFAULT : 0;
@@ -4539,6 +4616,7 @@
     MOVFragment *frag = &c->fragment;
     MOVTrackExt *trex = NULL;
     int flags, track_id, i;
+    MOVFragmentStreamInfo * frag_stream_info;
 
     avio_r8(pb); /* version */
     flags = avio_rb24(pb);
@@ -4546,17 +4624,18 @@
     track_id = avio_rb32(pb);
     if (!track_id)
         return AVERROR_INVALIDDATA;
-    frag->track_id = track_id;
-    set_frag_stream(&c->frag_index, track_id);
     for (i = 0; i < c->trex_count; i++)
-        if (c->trex_data[i].track_id == frag->track_id) {
+        if (c->trex_data[i].track_id == track_id) {
             trex = &c->trex_data[i];
             break;
         }
     if (!trex) {
-        av_log(c->fc, AV_LOG_ERROR, "could not find corresponding trex\n");
-        return AVERROR_INVALIDDATA;
+        av_log(c->fc, AV_LOG_WARNING, "could not find corresponding trex (id %u)\n", track_id);
+        return 0;
     }
+    c->fragment.found_tfhd = 1;
+    frag->track_id = track_id;
+    set_frag_stream(&c->frag_index, track_id);
 
     frag->base_data_offset = flags & MOV_TFHD_BASE_DATA_OFFSET ?
                              avio_rb64(pb) : flags & MOV_TFHD_DEFAULT_BASE_IS_MOOF ?
@@ -4571,6 +4650,10 @@
                      avio_rb32(pb) : trex->flags;
     av_log(c->fc, AV_LOG_TRACE, "frag flags 0x%x\n", frag->flags);
 
+    frag_stream_info = get_current_frag_stream_info(&c->frag_index);
+    if (frag_stream_info)
+        frag_stream_info->next_trun_dts = AV_NOPTS_VALUE;
+
     return 0;
 }
 
@@ -4635,8 +4718,8 @@
         }
     }
     if (!st) {
-        av_log(c->fc, AV_LOG_ERROR, "could not find corresponding track id %u\n", frag->track_id);
-        return AVERROR_INVALIDDATA;
+        av_log(c->fc, AV_LOG_WARNING, "could not find corresponding track id %u\n", frag->track_id);
+        return 0;
     }
     sc = st->priv_data;
     if (sc->pseudo_stream_id + 1 != frag->stsd_id && sc->pseudo_stream_id != -1)
@@ -4675,6 +4758,11 @@
     AVIndexEntry *new_entries;
     MOVFragmentStreamInfo * frag_stream_info;
 
+    if (!frag->found_tfhd) {
+        av_log(c->fc, AV_LOG_ERROR, "trun track id unknown, no tfhd was found\n");
+        return AVERROR_INVALIDDATA;
+    }
+
     for (i = 0; i < c->fc->nb_streams; i++) {
         if (c->fc->streams[i]->id == frag->track_id) {
             st = c->fc->streams[i];
@@ -4682,8 +4770,8 @@
         }
     }
     if (!st) {
-        av_log(c->fc, AV_LOG_ERROR, "could not find corresponding track id %u\n", frag->track_id);
-        return AVERROR_INVALIDDATA;
+        av_log(c->fc, AV_LOG_WARNING, "could not find corresponding track id %u\n", frag->track_id);
+        return 0;
     }
     sc = st->priv_data;
     if (sc->pseudo_stream_id+1 != frag->stsd_id && sc->pseudo_stream_id != -1)
@@ -4704,6 +4792,7 @@
             break;
         }
     }
+    av_assert0(index_entry_pos <= st->nb_index_entries);
 
     avio_r8(pb); /* version */
     flags = avio_rb24(pb);
@@ -4718,11 +4807,18 @@
     frag_stream_info = get_current_frag_stream_info(&c->frag_index);
     if (frag_stream_info)
     {
-        if (frag_stream_info->first_tfra_pts != AV_NOPTS_VALUE &&
+        if (frag_stream_info->next_trun_dts != AV_NOPTS_VALUE) {
+            dts = frag_stream_info->next_trun_dts - sc->time_offset;
+        } else if (frag_stream_info->first_tfra_pts != AV_NOPTS_VALUE &&
             c->use_mfra_for == FF_MOV_FLAG_MFRA_PTS) {
             pts = frag_stream_info->first_tfra_pts;
             av_log(c->fc, AV_LOG_DEBUG, "found mfra time %"PRId64
                     ", using it for pts\n", pts);
+        } else if (frag_stream_info->first_tfra_pts != AV_NOPTS_VALUE &&
+            c->use_mfra_for == FF_MOV_FLAG_MFRA_DTS) {
+            dts = frag_stream_info->first_tfra_pts;
+            av_log(c->fc, AV_LOG_DEBUG, "found mfra time %"PRId64
+                    ", using it for dts\n", pts);
         } else if (frag_stream_info->sidx_pts != AV_NOPTS_VALUE) {
             // FIXME: sidx earliest_presentation_time is *PTS*, s.b.
             // pts = frag_stream_info->sidx_pts;
@@ -4748,12 +4844,12 @@
     av_log(c->fc, AV_LOG_TRACE, "first sample flags 0x%x\n", first_sample_flags);
 
     // realloc space for new index entries
-    if((unsigned)st->nb_index_entries + entries >= UINT_MAX / sizeof(AVIndexEntry)) {
+    if((uint64_t)st->nb_index_entries + entries >= UINT_MAX / sizeof(AVIndexEntry)) {
         entries = UINT_MAX / sizeof(AVIndexEntry) - st->nb_index_entries;
         av_log(c->fc, AV_LOG_ERROR, "Failed to add index entry\n");
     }
-    if (entries <= 0)
-        return -1;
+    if (entries == 0)
+        return 0;
 
     requested_size = (st->nb_index_entries + entries) * sizeof(AVIndexEntry);
     new_entries = av_fast_realloc(st->index_entries,
@@ -4814,7 +4910,7 @@
         if (flags & MOV_TRUN_SAMPLE_FLAGS)    sample_flags    = avio_rb32(pb);
         if (flags & MOV_TRUN_SAMPLE_CTS)      ctts_duration   = avio_rb32(pb);
 
-        mov_update_dts_shift(sc, ctts_duration);
+        mov_update_dts_shift(sc, ctts_duration, c->fc);
         if (pts != AV_NOPTS_VALUE) {
             dts = pts - sc->dts_shift;
             if (flags & MOV_TRUN_SAMPLE_CTS) {
@@ -4867,12 +4963,14 @@
         sc->data_size += sample_size;
 
         if (sample_duration <= INT64_MAX - sc->duration_for_fps &&
-            1 <= INT64_MAX - sc->nb_frames_for_fps
+            1 <= INT_MAX - sc->nb_frames_for_fps
         ) {
             sc->duration_for_fps += sample_duration;
             sc->nb_frames_for_fps ++;
         }
     }
+    if (frag_stream_info)
+        frag_stream_info->next_trun_dts = dts + sc->time_offset;
     if (i < entries) {
         // EOF found before reading all entries.  Fix the hole this would
         // leave in index_entries and ctts_data
@@ -4987,7 +5085,7 @@
             return AVERROR_PATCHWELCOME;
         }
         avio_rb32(pb); // sap_flags
-        timestamp = av_rescale_q(pts, st->time_base, timescale);
+        timestamp = av_rescale_q(pts, timescale, st->time_base);
 
         index = update_frag_index(c, offset);
         frag_stream_info = get_frag_stream_info(&c->frag_index, index, track_id);
@@ -5017,7 +5115,7 @@
                 }
             }
         }
-        for (i = 0; i < c->fc->nb_streams; i++) {
+        if (ref_st) for (i = 0; i < c->fc->nb_streams; i++) {
             st = c->fc->streams[i];
             sc = st->priv_data;
             if (!sc->has_sidx) {
@@ -5263,9 +5361,7 @@
 static int mov_read_smdm(MOVContext *c, AVIOContext *pb, MOVAtom atom)
 {
     MOVStreamContext *sc;
-    const int chroma_den = 50000;
-    const int luma_den = 10000;
-    int i, j, version;
+    int i, version;
 
     if (c->fc->nb_streams < 1)
         return AVERROR_INVALIDDATA;
@@ -5288,17 +5384,15 @@
     if (!sc->mastering)
         return AVERROR(ENOMEM);
 
-    for (i = 0; i < 3; i++)
-        for (j = 0; j < 2; j++)
-            sc->mastering->display_primaries[i][j] =
-                av_make_q(lrint(((double)avio_rb16(pb) / (1 << 16)) * chroma_den), chroma_den);
-    for (i = 0; i < 2; i++)
-        sc->mastering->white_point[i] =
-            av_make_q(lrint(((double)avio_rb16(pb) / (1 << 16)) * chroma_den), chroma_den);
-    sc->mastering->max_luminance =
-        av_make_q(lrint(((double)avio_rb32(pb) / (1 <<  8)) * luma_den), luma_den);
-    sc->mastering->min_luminance =
-        av_make_q(lrint(((double)avio_rb32(pb) / (1 << 14)) * luma_den), luma_den);
+    for (i = 0; i < 3; i++) {
+        sc->mastering->display_primaries[i][0] = av_make_q(avio_rb16(pb), 1 << 16);
+        sc->mastering->display_primaries[i][1] = av_make_q(avio_rb16(pb), 1 << 16);
+    }
+    sc->mastering->white_point[0] = av_make_q(avio_rb16(pb), 1 << 16);
+    sc->mastering->white_point[1] = av_make_q(avio_rb16(pb), 1 << 16);
+
+    sc->mastering->max_luminance = av_make_q(avio_rb32(pb), 1 << 8);
+    sc->mastering->min_luminance = av_make_q(avio_rb32(pb), 1 << 14);
 
     sc->mastering->has_primaries = 1;
     sc->mastering->has_luminance = 1;
@@ -5738,8 +5832,8 @@
                 return AVERROR_INVALIDDATA;
             }
             buffer[len] = '\0';
-            av_dict_set(&c->fc->metadata, "xmp", buffer, 0);
-            av_free(buffer);
+            av_dict_set(&c->fc->metadata, "xmp",
+                        buffer, AV_DICT_DONT_STRDUP_VAL);
         } else {
             // skip all uuid atom, which makes it fast for long uuid-xmp file
             ret = avio_skip(pb, len);
@@ -6273,8 +6367,10 @@
 
     if (version > 0) {
         kid_count = avio_rb32(pb);
-        if (kid_count >= INT_MAX / sizeof(*key_ids))
-            return AVERROR(ENOMEM);
+        if (kid_count >= INT_MAX / sizeof(*key_ids)) {
+            ret = AVERROR(ENOMEM);
+            goto finish;
+        }
 
         for (unsigned int i = 0; i < kid_count && !pb->eof_reached; i++) {
             unsigned int min_kid_count = FFMIN(FFMAX(i + 1, 1024), kid_count);
@@ -6546,14 +6642,14 @@
     return 0;
 }
 
-static int cenc_filter(MOVContext *mov, MOVStreamContext *sc, AVPacket *pkt, int current_index)
+static int cenc_filter(MOVContext *mov, AVStream* st, MOVStreamContext *sc, AVPacket *pkt, int current_index)
 {
     MOVFragmentStreamInfo *frag_stream_info;
     MOVEncryptionIndex *encryption_index;
     AVEncryptionInfo *encrypted_sample;
     int encrypted_index, ret;
 
-    frag_stream_info = get_current_frag_stream_info(&mov->frag_index);
+    frag_stream_info = get_frag_stream_info(&mov->frag_index, mov->frag_index.current, st->id);
     encrypted_index = current_index;
     encryption_index = NULL;
     if (frag_stream_info) {
@@ -6613,6 +6709,7 @@
 static int mov_read_dops(MOVContext *c, AVIOContext *pb, MOVAtom atom)
 {
     const int OPUS_SEEK_PREROLL_MS = 80;
+    int ret;
     AVStream *st;
     size_t size;
     uint16_t pre_skip;
@@ -6633,8 +6730,8 @@
     /* OpusSpecificBox size plus magic for Ogg OpusHead header. */
     size = atom.size + 8;
 
-    if (ff_alloc_extradata(st->codecpar, size))
-        return AVERROR(ENOMEM);
+    if ((ret = ff_alloc_extradata(st->codecpar, size)) < 0)
+        return ret;
 
     AV_WL32(st->codecpar->extradata, MKTAG('O','p','u','s'));
     AV_WL32(st->codecpar->extradata + 4, MKTAG('H','e','a','d'));
@@ -6658,6 +6755,95 @@
     return 0;
 }
 
+static int mov_read_dmlp(MOVContext *c, AVIOContext *pb, MOVAtom atom)
+{
+    AVStream *st;
+    unsigned format_info;
+    int channel_assignment, channel_assignment1, channel_assignment2;
+    int ratebits;
+
+    if (c->fc->nb_streams < 1)
+        return 0;
+    st = c->fc->streams[c->fc->nb_streams-1];
+
+    if (atom.size < 10)
+        return AVERROR_INVALIDDATA;
+
+    format_info = avio_rb32(pb);
+
+    ratebits            = (format_info >> 28) & 0xF;
+    channel_assignment1 = (format_info >> 15) & 0x1F;
+    channel_assignment2 = format_info & 0x1FFF;
+    if (channel_assignment2)
+        channel_assignment = channel_assignment2;
+    else
+        channel_assignment = channel_assignment1;
+
+    st->codecpar->frame_size = 40 << (ratebits & 0x7);
+    st->codecpar->sample_rate = mlp_samplerate(ratebits);
+    st->codecpar->channels = truehd_channels(channel_assignment);
+    st->codecpar->channel_layout = truehd_layout(channel_assignment);
+
+    return 0;
+}
+
+static int mov_read_dvcc_dvvc(MOVContext *c, AVIOContext *pb, MOVAtom atom)
+{
+    AVStream *st;
+    uint32_t buf;
+    AVDOVIDecoderConfigurationRecord *dovi;
+    size_t dovi_size;
+    int ret;
+
+    if (c->fc->nb_streams < 1)
+        return 0;
+    st = c->fc->streams[c->fc->nb_streams-1];
+
+    if ((uint64_t)atom.size > (1<<30) || atom.size < 4)
+        return AVERROR_INVALIDDATA;
+
+    dovi = av_dovi_alloc(&dovi_size);
+    if (!dovi)
+        return AVERROR(ENOMEM);
+
+    dovi->dv_version_major = avio_r8(pb);
+    dovi->dv_version_minor = avio_r8(pb);
+
+    buf = avio_rb16(pb);
+    dovi->dv_profile        = (buf >> 9) & 0x7f;    // 7 bits
+    dovi->dv_level          = (buf >> 3) & 0x3f;    // 6 bits
+    dovi->rpu_present_flag  = (buf >> 2) & 0x01;    // 1 bit
+    dovi->el_present_flag   = (buf >> 1) & 0x01;    // 1 bit
+    dovi->bl_present_flag   =  buf       & 0x01;    // 1 bit
+    if (atom.size >= 24) {  // 4 + 4 + 4 * 4
+        buf = avio_r8(pb);
+        dovi->dv_bl_signal_compatibility_id = (buf >> 4) & 0x0f; // 4 bits
+    } else {
+        // 0 stands for None
+        // Dolby Vision V1.2.93 profiles and levels
+        dovi->dv_bl_signal_compatibility_id = 0;
+    }
+
+    ret = av_stream_add_side_data(st, AV_PKT_DATA_DOVI_CONF,
+                                  (uint8_t *)dovi, dovi_size);
+    if (ret < 0) {
+        av_freep(dovi);
+        return ret;
+    }
+
+    av_log(c, AV_LOG_TRACE, "DOVI in dvcC/dvvC box, version: %d.%d, profile: %d, level: %d, "
+           "rpu flag: %d, el flag: %d, bl flag: %d, compatibility id: %d\n",
+           dovi->dv_version_major, dovi->dv_version_minor,
+           dovi->dv_profile, dovi->dv_level,
+           dovi->rpu_present_flag,
+           dovi->el_present_flag,
+           dovi->bl_present_flag,
+           dovi->dv_bl_signal_compatibility_id
+        );
+
+    return 0;
+}
+
 static const MOVParseTableEntry mov_default_parse_table[] = {
 { MKTAG('A','C','L','R'), mov_read_aclr },
 { MKTAG('A','P','R','G'), mov_read_avid },
@@ -6706,6 +6892,7 @@
 { MKTAG('s','t','s','z'), mov_read_stsz }, /* sample size */
 { MKTAG('s','t','t','s'), mov_read_stts },
 { MKTAG('s','t','z','2'), mov_read_stsz }, /* compact sample size */
+{ MKTAG('s','d','t','p'), mov_read_sdtp }, /* independent and disposable samples */
 { MKTAG('t','k','h','d'), mov_read_tkhd }, /* track header */
 { MKTAG('t','f','d','t'), mov_read_tfdt },
 { MKTAG('t','f','h','d'), mov_read_tfhd }, /* track fragment header */
@@ -6746,11 +6933,14 @@
 { MKTAG('s','t','3','d'), mov_read_st3d }, /* stereoscopic 3D video box */
 { MKTAG('s','v','3','d'), mov_read_sv3d }, /* spherical video box */
 { MKTAG('d','O','p','s'), mov_read_dops },
+{ MKTAG('d','m','l','p'), mov_read_dmlp },
 { MKTAG('S','m','D','m'), mov_read_smdm },
 { MKTAG('C','o','L','L'), mov_read_coll },
 { MKTAG('v','p','c','C'), mov_read_vpcc },
 { MKTAG('m','d','c','v'), mov_read_mdcv },
 { MKTAG('c','l','l','i'), mov_read_clli },
+{ MKTAG('d','v','c','C'), mov_read_dvcc_dvvc },
+{ MKTAG('d','v','v','C'), mov_read_dvcc_dvvc },
 { 0, NULL }
 };
 
@@ -6775,10 +6965,10 @@
         if (atom.size >= 8) {
             a.size = avio_rb32(pb);
             a.type = avio_rl32(pb);
-            if (a.type == MKTAG('f','r','e','e') &&
+            if (((a.type == MKTAG('f','r','e','e') && c->moov_retry) ||
+                  a.type == MKTAG('h','o','o','v')) &&
                 a.size >= 8 &&
-                c->fc->strict_std_compliance < FF_COMPLIANCE_STRICT &&
-                c->moov_retry) {
+                c->fc->strict_std_compliance < FF_COMPLIANCE_STRICT) {
                 uint8_t buf[8];
                 uint32_t *type = (uint32_t *)buf + 1;
                 if (avio_read(pb, buf, 8) != 8)
@@ -6786,7 +6976,7 @@
                 avio_seek(pb, -8, SEEK_CUR);
                 if (*type == MKTAG('m','v','h','d') ||
                     *type == MKTAG('c','m','o','v')) {
-                    av_log(c->fc, AV_LOG_ERROR, "Detected moov in a free atom.\n");
+                    av_log(c->fc, AV_LOG_ERROR, "Detected moov in a free or hoov atom.\n");
                     a.type = MKTAG('m','o','o','v');
                 }
             }
@@ -6875,7 +7065,7 @@
     return 0;
 }
 
-static int mov_probe(AVProbeData *p)
+static int mov_probe(const AVProbeData *p)
 {
     int64_t offset;
     uint32_t tag;
@@ -7169,6 +7359,7 @@
         av_freep(&sc->sample_sizes);
         av_freep(&sc->keyframes);
         av_freep(&sc->stts_data);
+        av_freep(&sc->sdtp_data);
         av_freep(&sc->stps_data);
         av_freep(&sc->elst_data);
         av_freep(&sc->rap_group);
@@ -7613,7 +7804,8 @@
     mov->next_root_atom = 0;
     if (index < 0 || index >= mov->frag_index.nb_items)
         index = search_frag_moof_offset(&mov->frag_index, target);
-    if (index < mov->frag_index.nb_items) {
+    if (index < mov->frag_index.nb_items &&
+        mov->frag_index.item[index].moof_offset == target) {
         if (index + 1 < mov->frag_index.nb_items)
             mov->next_root_atom = mov->frag_index.item[index + 1].moof_offset;
         if (mov->frag_index.item[index].headers_read)
@@ -7758,6 +7950,11 @@
     }
     if (st->discard == AVDISCARD_ALL)
         goto retry;
+    if (sc->sdtp_data && sc->current_sample <= sc->sdtp_count) {
+        uint8_t sample_flags = sc->sdtp_data[sc->current_sample - 1];
+        uint8_t sample_is_depended_on = (sample_flags >> 2) & 0x3;
+        pkt->flags |= sample_is_depended_on == MOV_SAMPLE_DEPENDENCY_NO ? AV_PKT_FLAG_DISPOSABLE : 0;
+    }
     pkt->flags |= sample->flags & AVINDEX_KEYFRAME ? AV_PKT_FLAG_KEY : 0;
     pkt->pos = sample->pos;
 
@@ -7783,9 +7980,10 @@
     if (mov->aax_mode)
         aax_filter(pkt->data, pkt->size, mov);
 
-    ret = cenc_filter(mov, sc, pkt, current_index);
-    if (ret < 0)
+    ret = cenc_filter(mov, st, sc, pkt, current_index);
+    if (ret < 0) {
         return ret;
+    }
 
     return 0;
 }
@@ -7846,6 +8044,7 @@
     }
 
     /* adjust stsd index */
+    if (sc->chunk_count) {
     time_sample = 0;
     for (i = 0; i < sc->stsc_count; i++) {
         int64_t next = time_sample + mov_get_stsc_samples(sc, i);
@@ -7857,6 +8056,7 @@
         av_assert0(next == (int)next);
         time_sample = next;
     }
+    }
 
     return sample;
 }
@@ -7921,7 +8121,7 @@
         OFFSET(use_absolute_path), AV_OPT_TYPE_BOOL, {.i64 = 0},
         0, 1, FLAGS},
     {"seek_streams_individually",
-        "Seek each stream individually to the to the closest point",
+        "Seek each stream individually to the closest point",
         OFFSET(seek_individually), AV_OPT_TYPE_BOOL, { .i64 = 1 },
         0, 1, FLAGS},
     {"ignore_editlist", "Ignore the edit list atom.", OFFSET(ignore_editlist), AV_OPT_TYPE_BOOL, {.i64 = 0},
@@ -7972,11 +8172,11 @@
     .long_name      = NULL_IF_CONFIG_SMALL("QuickTime / MOV"),
     .priv_class     = &mov_class,
     .priv_data_size = sizeof(MOVContext),
-    .extensions     = "mov,mp4,m4a,3gp,3g2,mj2",
+    .extensions     = "mov,mp4,m4a,3gp,3g2,mj2,psp,m4b,ism,ismv,isma,f4v",
     .read_probe     = mov_probe,
     .read_header    = mov_read_header,
     .read_packet    = mov_read_packet,
     .read_close     = mov_read_close,
     .read_seek      = mov_read_seek,
-    .flags          = AVFMT_NO_BYTE_SEEK,
+    .flags          = AVFMT_NO_BYTE_SEEK | AVFMT_SEEK_TO_PTS,
 };
diff --git a/libavformat/movenc.c b/libavformat/movenc.c
index 33978ee..556dd06 100644
--- a/libavformat/movenc.c
+++ b/libavformat/movenc.c
@@ -51,6 +51,7 @@
 #include "libavutil/pixdesc.h"
 #include "libavutil/stereo3d.h"
 #include "libavutil/timecode.h"
+#include "libavutil/dovi_meta.h"
 #include "libavutil/color_utils.h"
 #include "hevc.h"
 #include "rtpenc.h"
@@ -72,10 +73,13 @@
     { "disable_chpl", "Disable Nero chapter atom", 0, AV_OPT_TYPE_CONST, {.i64 = FF_MOV_FLAG_DISABLE_CHPL}, INT_MIN, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM, "movflags" },
     { "default_base_moof", "Set the default-base-is-moof flag in tfhd atoms", 0, AV_OPT_TYPE_CONST, {.i64 = FF_MOV_FLAG_DEFAULT_BASE_MOOF}, INT_MIN, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM, "movflags" },
     { "dash", "Write DASH compatible fragmented MP4", 0, AV_OPT_TYPE_CONST, {.i64 = FF_MOV_FLAG_DASH}, INT_MIN, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM, "movflags" },
+    { "cmaf", "Write CMAF compatible fragmented MP4", 0, AV_OPT_TYPE_CONST, {.i64 = FF_MOV_FLAG_CMAF}, INT_MIN, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM, "movflags" },
     { "frag_discont", "Signal that the next fragment is discontinuous from earlier ones", 0, AV_OPT_TYPE_CONST, {.i64 = FF_MOV_FLAG_FRAG_DISCONT}, INT_MIN, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM, "movflags" },
     { "delay_moov", "Delay writing the initial moov until the first fragment is cut, or until the first fragment flush", 0, AV_OPT_TYPE_CONST, {.i64 = FF_MOV_FLAG_DELAY_MOOV}, INT_MIN, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM, "movflags" },
     { "global_sidx", "Write a global sidx index at the start of the file", 0, AV_OPT_TYPE_CONST, {.i64 = FF_MOV_FLAG_GLOBAL_SIDX}, INT_MIN, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM, "movflags" },
+    { "skip_sidx", "Skip writing of sidx atom", 0, AV_OPT_TYPE_CONST, {.i64 = FF_MOV_FLAG_SKIP_SIDX}, INT_MIN, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM, "movflags" },
     { "write_colr", "Write colr atom (Experimental, may be renamed or changed, do not use from scripts)", 0, AV_OPT_TYPE_CONST, {.i64 = FF_MOV_FLAG_WRITE_COLR}, INT_MIN, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM, "movflags" },
+    { "prefer_icc", "If writing colr atom prioritise usage of ICC profile if it exists in stream packet side data", 0, AV_OPT_TYPE_CONST, {.i64 = FF_MOV_FLAG_PREFER_ICC}, INT_MIN, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM, "movflags" },
     { "write_gama", "Write deprecated gama atom", 0, AV_OPT_TYPE_CONST, {.i64 = FF_MOV_FLAG_WRITE_GAMA}, INT_MIN, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM, "movflags" },
     { "use_metadata_tags", "Use mdta atom for metadata.", 0, AV_OPT_TYPE_CONST, {.i64 = FF_MOV_FLAG_USE_MDTA}, INT_MIN, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM, "movflags" },
     { "skip_trailer", "Skip writing the mfra/tfra/mfro trailer for fragmented files", 0, AV_OPT_TYPE_CONST, {.i64 = FF_MOV_FLAG_SKIP_TRAILER}, INT_MIN, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM, "movflags" },
@@ -312,15 +316,19 @@
     return 0x11;
 }
 
-static int mov_write_ac3_tag(AVIOContext *pb, MOVTrack *track)
+static int mov_write_ac3_tag(AVFormatContext *s, AVIOContext *pb, MOVTrack *track)
 {
     GetBitContext gbc;
     PutBitContext pbc;
     uint8_t buf[3];
     int fscod, bsid, bsmod, acmod, lfeon, frmsizecod;
 
-    if (track->vos_len < 7)
-        return -1;
+    if (track->vos_len < 7) {
+        av_log(s, AV_LOG_ERROR,
+               "Cannot write moov atom before AC3 packets."
+               " Set the delay_moov flag to fix this.\n");
+        return AVERROR(EINVAL);
+    }
 
     avio_wb32(pb, 11);
     ffio_wfourcc(pb, "dac3");
@@ -513,8 +521,6 @@
         memcpy(info->pkt.data + info->pkt.size - pkt->size, pkt->data, pkt->size);
         info->num_blocks += num_blocks;
         info->pkt.duration += pkt->duration;
-        if ((ret = av_copy_packet_side_data(&info->pkt, pkt)) < 0)
-            goto end;
         if (info->num_blocks != 6)
             goto end;
         av_packet_unref(pkt);
@@ -530,22 +536,24 @@
 }
 #endif
 
-static int mov_write_eac3_tag(AVIOContext *pb, MOVTrack *track)
+static int mov_write_eac3_tag(AVFormatContext *s, AVIOContext *pb, MOVTrack *track)
 {
     PutBitContext pbc;
     uint8_t *buf;
     struct eac3_info *info;
     int size, i;
 
-    if (!track->eac3_priv)
+    if (!track->eac3_priv) {
+        av_log(s, AV_LOG_ERROR,
+               "Cannot write moov atom before EAC3 packets parsed.\n");
         return AVERROR(EINVAL);
+    }
 
     info = track->eac3_priv;
-    size = 2 + 4 * (info->num_ind_sub + 1);
+    size = 2 + ((34 * (info->num_ind_sub + 1) + 7) >> 3);
     buf = av_malloc(size);
     if (!buf) {
-        size = AVERROR(ENOMEM);
-        goto end;
+        return AVERROR(ENOMEM);
     }
 
     init_put_bits(&pbc, buf, size);
@@ -563,12 +571,12 @@
         put_bits(&pbc, 4, info->substream[i].num_dep_sub);
         if (!info->substream[i].num_dep_sub) {
             put_bits(&pbc, 1, 0); /* reserved */
-            size--;
         } else {
             put_bits(&pbc, 9, info->substream[i].chan_loc);
         }
     }
     flush_put_bits(&pbc);
+    size = put_bits_count(&pbc) >> 3;
 
     avio_wb32(pb, size + 8);
     ffio_wfourcc(pb, "dec3");
@@ -576,10 +584,6 @@
 
     av_free(buf);
 
-end:
-    av_packet_unref(&info->pkt);
-    av_freep(&track->eac3_priv);
-
     return size;
 }
 
@@ -745,14 +749,14 @@
     return update_size(pb, pos);
 }
 
-static int mov_write_dops_tag(AVIOContext *pb, MOVTrack *track)
+static int mov_write_dops_tag(AVFormatContext *s, AVIOContext *pb, MOVTrack *track)
 {
     int64_t pos = avio_tell(pb);
     avio_wb32(pb, 0);
     ffio_wfourcc(pb, "dOps");
     avio_w8(pb, 0); /* Version */
     if (track->par->extradata_size < 19) {
-        av_log(pb, AV_LOG_ERROR, "invalid extradata size\n");
+        av_log(s, AV_LOG_ERROR, "invalid extradata size\n");
         return AVERROR_INVALIDDATA;
     }
     /* extradata contains an Ogg OpusHead, other than byte-ordering and
@@ -768,6 +772,35 @@
     return update_size(pb, pos);
 }
 
+static int mov_write_dmlp_tag(AVFormatContext *s, AVIOContext *pb, MOVTrack *track)
+{
+    int64_t pos = avio_tell(pb);
+    int length;
+    avio_wb32(pb, 0);
+    ffio_wfourcc(pb, "dmlp");
+
+    if (track->vos_len < 20) {
+        av_log(s, AV_LOG_ERROR,
+               "Cannot write moov atom before TrueHD packets."
+               " Set the delay_moov flag to fix this.\n");
+        return AVERROR(EINVAL);
+    }
+
+    length = (AV_RB16(track->vos_data) & 0xFFF) * 2;
+    if (length < 20 || length > track->vos_len)
+        return AVERROR_INVALIDDATA;
+
+    // Only TrueHD is supported
+    if (AV_RB32(track->vos_data + 4) != 0xF8726FBA)
+        return AVERROR_INVALIDDATA;
+
+    avio_wb32(pb, AV_RB32(track->vos_data + 8)); /* format_info */
+    avio_wb16(pb, AV_RB16(track->vos_data + 18) << 1); /* peak_data_rate */
+    avio_wb32(pb, 0); /* reserved */
+
+    return update_size(pb, pos);
+}
+
 static int mov_write_chan_tag(AVFormatContext *s, AVIOContext *pb, MOVTrack *track)
 {
     uint32_t layout_tag, bitmap;
@@ -822,9 +855,9 @@
     } else if (track->par->codec_id == AV_CODEC_ID_AMR_NB) {
         mov_write_amr_tag(pb, track);
     } else if (track->par->codec_id == AV_CODEC_ID_AC3) {
-        mov_write_ac3_tag(pb, track);
+        mov_write_ac3_tag(s, pb, track);
     } else if (track->par->codec_id == AV_CODEC_ID_EAC3) {
-        mov_write_eac3_tag(pb, track);
+        mov_write_eac3_tag(s, pb, track);
     } else if (track->par->codec_id == AV_CODEC_ID_ALAC ||
                track->par->codec_id == AV_CODEC_ID_QDM2) {
         mov_write_extradata_tag(pb, track);
@@ -1021,6 +1054,7 @@
     int64_t pos = avio_tell(pb);
     int version = 0;
     uint32_t tag = track->tag;
+    int ret = 0;
 
     if (track->mode == MODE_MOV) {
         if (track->timescale > UINT16_MAX || !track->par->channels) {
@@ -1078,12 +1112,14 @@
             avio_wb16(pb, track->audio_vbr ? -2 : 0); /* compression ID */
         } else { /* reserved for mp4/3gp */
             if (track->par->codec_id == AV_CODEC_ID_FLAC ||
+                track->par->codec_id == AV_CODEC_ID_ALAC ||
                 track->par->codec_id == AV_CODEC_ID_OPUS) {
                 avio_wb16(pb, track->par->channels);
             } else {
                 avio_wb16(pb, 2);
             }
-            if (track->par->codec_id == AV_CODEC_ID_FLAC) {
+            if (track->par->codec_id == AV_CODEC_ID_FLAC ||
+                track->par->codec_id == AV_CODEC_ID_ALAC) {
                 avio_wb16(pb, track->par->bits_per_raw_sample);
             } else {
                 avio_wb16(pb, 16);
@@ -1094,10 +1130,14 @@
         avio_wb16(pb, 0); /* packet size (= 0) */
         if (track->par->codec_id == AV_CODEC_ID_OPUS)
             avio_wb16(pb, 48000);
+        else if (track->par->codec_id == AV_CODEC_ID_TRUEHD)
+            avio_wb32(pb, track->par->sample_rate);
         else
             avio_wb16(pb, track->par->sample_rate <= UINT16_MAX ?
                           track->par->sample_rate : 0);
-        avio_wb16(pb, 0); /* Reserved */
+
+        if (track->par->codec_id != AV_CODEC_ID_TRUEHD)
+            avio_wb16(pb, 0); /* Reserved */
     }
 
     if (version == 1) { /* SoundDescription V1 extended info */
@@ -1122,34 +1162,43 @@
          track->par->codec_id == AV_CODEC_ID_QDM2          ||
          (mov_pcm_le_gt16(track->par->codec_id) && version==1) ||
          (mov_pcm_be_gt16(track->par->codec_id) && version==1)))
-        mov_write_wave_tag(s, pb, track);
+        ret = mov_write_wave_tag(s, pb, track);
     else if (track->tag == MKTAG('m','p','4','a'))
-        mov_write_esds_tag(pb, track);
+        ret = mov_write_esds_tag(pb, track);
     else if (track->par->codec_id == AV_CODEC_ID_AMR_NB)
-        mov_write_amr_tag(pb, track);
+        ret = mov_write_amr_tag(pb, track);
     else if (track->par->codec_id == AV_CODEC_ID_AC3)
-        mov_write_ac3_tag(pb, track);
+        ret = mov_write_ac3_tag(s, pb, track);
     else if (track->par->codec_id == AV_CODEC_ID_EAC3)
-        mov_write_eac3_tag(pb, track);
+        ret = mov_write_eac3_tag(s, pb, track);
     else if (track->par->codec_id == AV_CODEC_ID_ALAC)
-        mov_write_extradata_tag(pb, track);
+        ret = mov_write_extradata_tag(pb, track);
     else if (track->par->codec_id == AV_CODEC_ID_WMAPRO)
-        mov_write_wfex_tag(s, pb, track);
+        ret = mov_write_wfex_tag(s, pb, track);
     else if (track->par->codec_id == AV_CODEC_ID_FLAC)
-        mov_write_dfla_tag(pb, track);
+        ret = mov_write_dfla_tag(pb, track);
     else if (track->par->codec_id == AV_CODEC_ID_OPUS)
-        mov_write_dops_tag(pb, track);
+        ret = mov_write_dops_tag(s, pb, track);
+    else if (track->par->codec_id == AV_CODEC_ID_TRUEHD)
+        ret = mov_write_dmlp_tag(s, pb, track);
     else if (track->vos_len > 0)
-        mov_write_glbl_tag(pb, track);
+        ret = mov_write_glbl_tag(pb, track);
 
-    if (track->mode == MODE_MOV && track->par->codec_type == AVMEDIA_TYPE_AUDIO)
-        mov_write_chan_tag(s, pb, track);
+    if (ret < 0)
+        return ret;
 
-    if (mov->encryption_scheme != MOV_ENC_NONE) {
-        ff_mov_cenc_write_sinf_tag(track, pb, mov->encryption_kid);
+    if (track->mode == MODE_MOV && track->par->codec_type == AVMEDIA_TYPE_AUDIO
+            && ((ret = mov_write_chan_tag(s, pb, track)) < 0)) {
+        return ret;
     }
 
-    return update_size(pb, pos);
+    if (mov->encryption_scheme != MOV_ENC_NONE
+            && ((ret = ff_mov_cenc_write_sinf_tag(track, pb, mov->encryption_kid)) < 0)) {
+        return ret;
+    }
+
+    ret = update_size(pb, pos);
+    return ret;
 }
 
 static int mov_write_d263_tag(AVIOContext *pb)
@@ -1678,12 +1727,12 @@
     return update_size(pb, pos);
 }
 
-static int mov_write_st3d_tag(AVIOContext *pb, AVStereo3D *stereo_3d)
+static int mov_write_st3d_tag(AVFormatContext *s, AVIOContext *pb, AVStereo3D *stereo_3d)
 {
     int8_t stereo_mode;
 
     if (stereo_3d->flags != 0) {
-        av_log(pb, AV_LOG_WARNING, "Unsupported stereo_3d flags %x. st3d not written.\n", stereo_3d->flags);
+        av_log(s, AV_LOG_WARNING, "Unsupported stereo_3d flags %x. st3d not written.\n", stereo_3d->flags);
         return 0;
     }
 
@@ -1698,7 +1747,7 @@
         stereo_mode = 2;
         break;
     default:
-        av_log(pb, AV_LOG_WARNING, "Unsupported stereo_3d type %s. st3d not written.\n", av_stereo3d_type_name(stereo_3d->type));
+        av_log(s, AV_LOG_WARNING, "Unsupported stereo_3d type %s. st3d not written.\n", av_stereo3d_type_name(stereo_3d->type));
         return 0;
     }
     avio_wb32(pb, 13); /* size */
@@ -1716,7 +1765,7 @@
     if (spherical_mapping->projection != AV_SPHERICAL_EQUIRECTANGULAR &&
         spherical_mapping->projection != AV_SPHERICAL_EQUIRECTANGULAR_TILE &&
         spherical_mapping->projection != AV_SPHERICAL_CUBEMAP) {
-        av_log(pb, AV_LOG_WARNING, "Unsupported projection %d. sv3d not written.\n", spherical_mapping->projection);
+        av_log(s, AV_LOG_WARNING, "Unsupported projection %d. sv3d not written.\n", spherical_mapping->projection);
         return 0;
     }
 
@@ -1766,6 +1815,36 @@
     return update_size(pb, sv3d_pos);
 }
 
+static int mov_write_dvcc_dvvc_tag(AVFormatContext *s, AVIOContext *pb, AVDOVIDecoderConfigurationRecord *dovi)
+{
+    avio_wb32(pb, 32); /* size = 8 + 24 */
+    if (dovi->dv_profile > 7)
+        ffio_wfourcc(pb, "dvvC");
+    else
+        ffio_wfourcc(pb, "dvcC");
+    avio_w8(pb, dovi->dv_version_major);
+    avio_w8(pb, dovi->dv_version_minor);
+    avio_wb16(pb, (dovi->dv_profile << 9) | (dovi->dv_level << 3) |
+              (dovi->rpu_present_flag << 2) | (dovi->el_present_flag << 1) |
+              dovi->bl_present_flag);
+    avio_wb32(pb, (dovi->dv_bl_signal_compatibility_id << 28) | 0);
+
+    avio_wb32(pb, 0); /* reserved */
+    avio_wb32(pb, 0); /* reserved */
+    avio_wb32(pb, 0); /* reserved */
+    avio_wb32(pb, 0); /* reserved */
+    av_log(s, AV_LOG_DEBUG, "DOVI in %s box, version: %d.%d, profile: %d, level: %d, "
+           "rpu flag: %d, el flag: %d, bl flag: %d, compatibility id: %d\n",
+           dovi->dv_profile > 7 ? "dvvC" : "dvcC",
+           dovi->dv_version_major, dovi->dv_version_minor,
+           dovi->dv_profile, dovi->dv_level,
+           dovi->rpu_present_flag,
+           dovi->el_present_flag,
+           dovi->bl_present_flag,
+           dovi->dv_bl_signal_compatibility_id);
+    return 32; /* 8 + 24 */
+}
+
 static int mov_write_clap_tag(AVIOContext *pb, MOVTrack *track)
 {
     avio_wb32(pb, 40);
@@ -1794,110 +1873,128 @@
     return 16;
 }
 
-static int mov_write_gama_tag(AVIOContext *pb, MOVTrack *track, double gamma)
+static int mov_write_gama_tag(AVFormatContext *s, AVIOContext *pb, MOVTrack *track, double gamma)
 {
     uint32_t gama = 0;
-    if (gamma <= 0.0)
-    {
+    if (gamma <= 0.0) {
         gamma = avpriv_get_gamma_from_trc(track->par->color_trc);
     }
-    av_log(pb, AV_LOG_DEBUG, "gamma value %g\n", gamma);
+    av_log(s, AV_LOG_DEBUG, "gamma value %g\n", gamma);
 
     if (gamma > 1e-6) {
         gama = (uint32_t)lrint((double)(1<<16) * gamma);
-        av_log(pb, AV_LOG_DEBUG, "writing gama value %"PRId32"\n", gama);
+        av_log(s, AV_LOG_DEBUG, "writing gama value %"PRId32"\n", gama);
 
         av_assert0(track->mode == MODE_MOV);
         avio_wb32(pb, 12);
         ffio_wfourcc(pb, "gama");
         avio_wb32(pb, gama);
         return 12;
-    }
-    else {
-        av_log(pb, AV_LOG_WARNING, "gamma value unknown, unable to write gama atom\n");
+    } else {
+        av_log(s, AV_LOG_WARNING, "gamma value unknown, unable to write gama atom\n");
     }
     return 0;
 }
 
-static int mov_write_colr_tag(AVIOContext *pb, MOVTrack *track)
+static int mov_write_colr_tag(AVIOContext *pb, MOVTrack *track, int prefer_icc)
 {
+    int64_t pos = avio_tell(pb);
+
     // Ref (MOV): https://developer.apple.com/library/mac/technotes/tn2162/_index.html#//apple_ref/doc/uid/DTS40013070-CH1-TNTAG9
     // Ref (MP4): ISO/IEC 14496-12:2012
 
-    if (track->par->color_primaries == AVCOL_PRI_UNSPECIFIED &&
-        track->par->color_trc == AVCOL_TRC_UNSPECIFIED &&
-        track->par->color_space == AVCOL_SPC_UNSPECIFIED) {
-        if ((track->par->width >= 1920 && track->par->height >= 1080)
-          || (track->par->width == 1280 && track->par->height == 720)) {
-            av_log(NULL, AV_LOG_WARNING, "color primaries unspecified, assuming bt709\n");
-            track->par->color_primaries = AVCOL_PRI_BT709;
-        } else if (track->par->width == 720 && track->height == 576) {
-            av_log(NULL, AV_LOG_WARNING, "color primaries unspecified, assuming bt470bg\n");
-            track->par->color_primaries = AVCOL_PRI_BT470BG;
-        } else if (track->par->width == 720 &&
-                   (track->height == 486 || track->height == 480)) {
-            av_log(NULL, AV_LOG_WARNING, "color primaries unspecified, assuming smpte170\n");
-            track->par->color_primaries = AVCOL_PRI_SMPTE170M;
-        } else {
-            av_log(NULL, AV_LOG_WARNING, "color primaries unspecified, unable to assume anything\n");
+    const uint8_t *icc_profile;
+    int icc_profile_size;
+
+    if (prefer_icc) {
+        icc_profile = av_stream_get_side_data(track->st, AV_PKT_DATA_ICC_PROFILE, &icc_profile_size);
+
+        if (icc_profile) {
+            avio_wb32(pb, 12 + icc_profile_size);
+            ffio_wfourcc(pb, "colr");
+            ffio_wfourcc(pb, "prof");
+            avio_write(pb, icc_profile, icc_profile_size);
+            return 12 + icc_profile_size;
         }
-        switch (track->par->color_primaries) {
-        case AVCOL_PRI_BT709:
-            track->par->color_trc = AVCOL_TRC_BT709;
-            track->par->color_space = AVCOL_SPC_BT709;
-            break;
-        case AVCOL_PRI_SMPTE170M:
-        case AVCOL_PRI_BT470BG:
-            track->par->color_trc = AVCOL_TRC_BT709;
-            track->par->color_space = AVCOL_SPC_SMPTE170M;
-            break;
+        else {
+            av_log(NULL, AV_LOG_INFO, "no ICC profile found, will write nclx/nclc colour info instead\n");
         }
     }
 
     /* We should only ever be called by MOV or MP4. */
     av_assert0(track->mode == MODE_MOV || track->mode == MODE_MP4);
 
-    avio_wb32(pb, 18 + (track->mode == MODE_MP4));
+    avio_wb32(pb, 0); /* size */
     ffio_wfourcc(pb, "colr");
     if (track->mode == MODE_MP4)
         ffio_wfourcc(pb, "nclx");
     else
         ffio_wfourcc(pb, "nclc");
-    switch (track->par->color_primaries) {
-    case AVCOL_PRI_BT709:     avio_wb16(pb, 1); break;
-    case AVCOL_PRI_BT470BG:   avio_wb16(pb, 5); break;
-    case AVCOL_PRI_SMPTE170M:
-    case AVCOL_PRI_SMPTE240M: avio_wb16(pb, 6); break;
-    case AVCOL_PRI_BT2020:    avio_wb16(pb, 9); break;
-    case AVCOL_PRI_SMPTE431:  avio_wb16(pb, 11); break;
-    case AVCOL_PRI_SMPTE432:  avio_wb16(pb, 12); break;
-    default:                  avio_wb16(pb, 2);
-    }
-    switch (track->par->color_trc) {
-    case AVCOL_TRC_BT709:        avio_wb16(pb, 1); break;
-    case AVCOL_TRC_SMPTE170M:    avio_wb16(pb, 1); break; // remapped
-    case AVCOL_TRC_SMPTE240M:    avio_wb16(pb, 7); break;
-    case AVCOL_TRC_SMPTEST2084:  avio_wb16(pb, 16); break;
-    case AVCOL_TRC_SMPTE428:     avio_wb16(pb, 17); break;
-    case AVCOL_TRC_ARIB_STD_B67: avio_wb16(pb, 18); break;
-    default:                     avio_wb16(pb, 2);
-    }
-    switch (track->par->color_space) {
-    case AVCOL_SPC_BT709:      avio_wb16(pb, 1); break;
-    case AVCOL_SPC_BT470BG:
-    case AVCOL_SPC_SMPTE170M:  avio_wb16(pb, 6); break;
-    case AVCOL_SPC_SMPTE240M:  avio_wb16(pb, 7); break;
-    case AVCOL_SPC_BT2020_NCL: avio_wb16(pb, 9); break;
-    default:                   avio_wb16(pb, 2);
-    }
-
+    // Do not try to guess the color info if it is AVCOL_PRI_UNSPECIFIED.
+    // e.g., Dolby Vision for Apple devices should be set to AVCOL_PRI_UNSPECIFIED. See
+    // https://developer.apple.com/av-foundation/High-Dynamic-Range-Metadata-for-Apple-Devices.pdf
+    avio_wb16(pb, track->par->color_primaries);
+    avio_wb16(pb, track->par->color_trc);
+    avio_wb16(pb, track->par->color_space);
     if (track->mode == MODE_MP4) {
         int full_range = track->par->color_range == AVCOL_RANGE_JPEG;
         avio_w8(pb, full_range << 7);
-        return 19;
-    } else {
-        return 18;
     }
+
+    return update_size(pb, pos);
+}
+
+static int mov_write_clli_tag(AVIOContext *pb, MOVTrack *track)
+{
+    const uint8_t *side_data;
+    const AVContentLightMetadata *content_light_metadata;
+
+    side_data = av_stream_get_side_data(track->st, AV_PKT_DATA_CONTENT_LIGHT_LEVEL, NULL);
+    if (!side_data) {
+        av_log(NULL, AV_LOG_VERBOSE, "Not writing 'clli' atom. No content light level info.\n");
+        return 0;
+    }
+    content_light_metadata = (const AVContentLightMetadata*)side_data;
+
+    avio_wb32(pb, 12); // size
+    ffio_wfourcc(pb, "clli");
+    avio_wb16(pb, content_light_metadata->MaxCLL);
+    avio_wb16(pb, content_light_metadata->MaxFALL);
+    return 12;
+}
+
+static inline int64_t rescale_mdcv(AVRational q, int b)
+{
+    return av_rescale(q.num, b, q.den);
+}
+
+static int mov_write_mdcv_tag(AVIOContext *pb, MOVTrack *track)
+{
+    const int chroma_den = 50000;
+    const int luma_den = 10000;
+    const uint8_t *side_data;
+    const AVMasteringDisplayMetadata *metadata;
+
+    side_data = av_stream_get_side_data(track->st, AV_PKT_DATA_MASTERING_DISPLAY_METADATA, NULL);
+    metadata = (const AVMasteringDisplayMetadata*)side_data;
+    if (!metadata || !metadata->has_primaries || !metadata->has_luminance) {
+        av_log(NULL, AV_LOG_VERBOSE, "Not writing 'mdcv' atom. Missing mastering metadata.\n");
+        return 0;
+    }
+
+    avio_wb32(pb, 32); // size
+    ffio_wfourcc(pb, "mdcv");
+    avio_wb16(pb, rescale_mdcv(metadata->display_primaries[1][0], chroma_den));
+    avio_wb16(pb, rescale_mdcv(metadata->display_primaries[1][1], chroma_den));
+    avio_wb16(pb, rescale_mdcv(metadata->display_primaries[2][0], chroma_den));
+    avio_wb16(pb, rescale_mdcv(metadata->display_primaries[2][1], chroma_den));
+    avio_wb16(pb, rescale_mdcv(metadata->display_primaries[0][0], chroma_den));
+    avio_wb16(pb, rescale_mdcv(metadata->display_primaries[0][1], chroma_den));
+    avio_wb16(pb, rescale_mdcv(metadata->white_point[0], chroma_den));
+    avio_wb16(pb, rescale_mdcv(metadata->white_point[1], chroma_den));
+    avio_wb32(pb, rescale_mdcv(metadata->max_luminance, luma_den));
+    avio_wb32(pb, rescale_mdcv(metadata->min_luminance, luma_den));
+    return 32;
 }
 
 static void find_compressor(char * compressor_name, int len, MOVTrack *track)
@@ -1928,7 +2025,7 @@
     }
 }
 
-static int mov_write_video_tag(AVIOContext *pb, MOVMuxContext *mov, MOVTrack *track)
+static int mov_write_video_tag(AVFormatContext *s, AVIOContext *pb, MOVMuxContext *mov, MOVTrack *track)
 {
     int64_t pos = avio_tell(pb);
     char compressor_name[32] = { 0 };
@@ -2063,25 +2160,33 @@
 
     if (mov->flags & FF_MOV_FLAG_WRITE_GAMA) {
         if (track->mode == MODE_MOV)
-            mov_write_gama_tag(pb, track, mov->gamma);
+            mov_write_gama_tag(s, pb, track, mov->gamma);
         else
             av_log(mov->fc, AV_LOG_WARNING, "Not writing 'gama' atom. Format is not MOV.\n");
     }
     if (mov->flags & FF_MOV_FLAG_WRITE_COLR) {
         if (track->mode == MODE_MOV || track->mode == MODE_MP4)
-            mov_write_colr_tag(pb, track);
+            mov_write_colr_tag(pb, track, mov->flags & FF_MOV_FLAG_PREFER_ICC);
         else
             av_log(mov->fc, AV_LOG_WARNING, "Not writing 'colr' atom. Format is not MOV or MP4.\n");
     }
+    if (track->mode == MODE_MOV || track->mode == MODE_MP4) {
+        mov_write_clli_tag(pb, track);
+        mov_write_mdcv_tag(pb, track);
+    }
 
     if (track->mode == MODE_MP4 && mov->fc->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL) {
         AVStereo3D* stereo_3d = (AVStereo3D*) av_stream_get_side_data(track->st, AV_PKT_DATA_STEREO3D, NULL);
         AVSphericalMapping* spherical_mapping = (AVSphericalMapping*)av_stream_get_side_data(track->st, AV_PKT_DATA_SPHERICAL, NULL);
+        AVDOVIDecoderConfigurationRecord *dovi = (AVDOVIDecoderConfigurationRecord *)
+                                                 av_stream_get_side_data(track->st, AV_PKT_DATA_DOVI_CONF, NULL);;
 
         if (stereo_3d)
-            mov_write_st3d_tag(pb, stereo_3d);
+            mov_write_st3d_tag(s, pb, stereo_3d);
         if (spherical_mapping)
             mov_write_sv3d_tag(mov->fc, pb, spherical_mapping);
+        if (dovi)
+            mov_write_dvcc_dvvc_tag(s, pb, dovi);
     }
 
     if (track->par->sample_aspect_ratio.den && track->par->sample_aspect_ratio.num) {
@@ -2214,22 +2319,27 @@
 static int mov_write_stsd_tag(AVFormatContext *s, AVIOContext *pb, MOVMuxContext *mov, MOVTrack *track)
 {
     int64_t pos = avio_tell(pb);
+    int ret = 0;
     avio_wb32(pb, 0); /* size */
     ffio_wfourcc(pb, "stsd");
     avio_wb32(pb, 0); /* version & flags */
     avio_wb32(pb, 1); /* entry count */
     if (track->par->codec_type == AVMEDIA_TYPE_VIDEO)
-        mov_write_video_tag(pb, mov, track);
+        ret = mov_write_video_tag(s, pb, mov, track);
     else if (track->par->codec_type == AVMEDIA_TYPE_AUDIO)
-        mov_write_audio_tag(s, pb, mov, track);
+        ret = mov_write_audio_tag(s, pb, mov, track);
     else if (track->par->codec_type == AVMEDIA_TYPE_SUBTITLE)
-        mov_write_subtitle_tag(pb, track);
+        ret = mov_write_subtitle_tag(pb, track);
     else if (track->par->codec_tag == MKTAG('r','t','p',' '))
-        mov_write_rtp_tag(pb, track);
+        ret = mov_write_rtp_tag(pb, track);
     else if (track->par->codec_tag == MKTAG('t','m','c','d'))
-        mov_write_tmcd_tag(pb, track);
+        ret = mov_write_tmcd_tag(pb, track);
     else if (track->par->codec_tag == MKTAG('g','p','m','d'))
-        mov_write_gpmd_tag(pb, track);
+        ret = mov_write_gpmd_tag(pb, track);
+
+    if (ret < 0)
+        return ret;
+
     return update_size(pb, pos);
 }
 
@@ -2432,13 +2542,16 @@
 static int mov_write_stbl_tag(AVFormatContext *s, AVIOContext *pb, MOVMuxContext *mov, MOVTrack *track)
 {
     int64_t pos = avio_tell(pb);
-    int ret;
+    int ret = 0;
 
     avio_wb32(pb, 0); /* size */
     ffio_wfourcc(pb, "stbl");
-    mov_write_stsd_tag(s, pb, mov, track);
+    if ((ret = mov_write_stsd_tag(s, pb, mov, track)) < 0)
+        return ret;
     mov_write_stts_tag(pb, track);
     if ((track->par->codec_type == AVMEDIA_TYPE_VIDEO ||
+         track->par->codec_id == AV_CODEC_ID_TRUEHD ||
+         track->par->codec_id == AV_CODEC_ID_MPEGH_3D_AUDIO ||
          track->par->codec_tag == MKTAG('r','t','p',' ')) &&
         track->has_keyframes && track->has_keyframes < track->entry)
         mov_write_stss_tag(pb, track, MOV_SYNC_SAMPLE);
@@ -2610,7 +2723,7 @@
                 } else {
                     hdlr_type = "text";
                 }
-            descr = "SubtitleHandler";
+                descr = "SubtitleHandler";
             }
         } else if (track->par->codec_tag == MKTAG('r','t','p',' ')) {
             hdlr_type = "hint";
@@ -2706,10 +2819,28 @@
     return update_size(pb, pos);
 }
 
+static int64_t calc_pts_duration(MOVMuxContext *mov, MOVTrack *track)
+{
+    if (track->tag == MKTAG('t','m','c','d')) {
+        // tmcd tracks gets track_duration set in mov_write_moov_tag from
+        // another track's duration, while the end_pts may be left at zero.
+        // Calculate the pts duration for that track instead.
+        return av_rescale(calc_pts_duration(mov, &mov->tracks[track->src_track]),
+                          track->timescale, mov->tracks[track->src_track].timescale);
+    }
+    if (track->end_pts != AV_NOPTS_VALUE &&
+        track->start_dts != AV_NOPTS_VALUE &&
+        track->start_cts != AV_NOPTS_VALUE) {
+        return track->end_pts - (track->start_dts + track->start_cts);
+    }
+    return track->track_duration;
+}
+
 static int mov_write_mdhd_tag(AVIOContext *pb, MOVMuxContext *mov,
                               MOVTrack *track)
 {
-    int version = track->track_duration < INT32_MAX ? 0 : 1;
+    int64_t duration = calc_pts_duration(mov, track);
+    int version = duration < INT32_MAX ? 0 : 1;
 
     if (track->mode == MODE_ISM)
         version = 1;
@@ -2731,15 +2862,15 @@
     else if (!track->entry)
         (version == 1) ? avio_wb64(pb, 0) : avio_wb32(pb, 0);
     else
-        (version == 1) ? avio_wb64(pb, track->track_duration) : avio_wb32(pb, track->track_duration); /* duration */
+        (version == 1) ? avio_wb64(pb, duration) : avio_wb32(pb, duration); /* duration */
     avio_wb16(pb, track->language); /* language */
     avio_wb16(pb, 0); /* reserved (quality) */
 
     if (version != 0 && track->mode == MODE_MOV) {
         av_log(NULL, AV_LOG_ERROR,
                "FATAL error, file duration too long for timebase, this file will not be\n"
-               "playable with quicktime. Choose a different timebase or a different\n"
-               "container format\n");
+               "playable with QuickTime. Choose a different timebase with "
+               "-video_track_timescale or a different container format\n");
     }
 
     return 32;
@@ -2781,8 +2912,9 @@
 static int mov_write_tkhd_tag(AVIOContext *pb, MOVMuxContext *mov,
                               MOVTrack *track, AVStream *st)
 {
-    int64_t duration = av_rescale_rnd(track->track_duration, MOV_TIMESCALE,
-                                      track->timescale, AV_ROUND_UP);
+    int64_t duration = av_rescale_rnd(calc_pts_duration(mov, track),
+                                      MOV_TIMESCALE, track->timescale,
+                                      AV_ROUND_UP);
     int version = duration < INT32_MAX ? 0 : 1;
     int flags   = MOV_TKHD_FLAG_IN_MOVIE;
     int rotation = 0;
@@ -2928,8 +3060,9 @@
 static int mov_write_edts_tag(AVIOContext *pb, MOVMuxContext *mov,
                               MOVTrack *track)
 {
-    int64_t duration = av_rescale_rnd(track->track_duration, MOV_TIMESCALE,
-                                      track->timescale, AV_ROUND_UP);
+    int64_t duration = av_rescale_rnd(calc_pts_duration(mov, track),
+                                      MOV_TIMESCALE, track->timescale,
+                                      AV_ROUND_UP);
     int version = duration < INT32_MAX ? 0 : 1;
     int entry_size, entry_count, size;
     int64_t delay, start_ct = track->start_cts;
@@ -3091,12 +3224,12 @@
     if (mov->mode & (MODE_MP4|MODE_MOV))
         mov_write_track_metadata(pb_buf, st, "name", "title");
 
-    if ((size = avio_close_dyn_buf(pb_buf, &buf)) > 0) {
+    if ((size = avio_get_dyn_buf(pb_buf, &buf)) > 0) {
         avio_wb32(pb, size + 8);
         ffio_wfourcc(pb, "udta");
         avio_write(pb, buf, size);
     }
-    av_free(buf);
+    ffio_free_dyn_buf(&pb_buf);
 
     return 0;
 }
@@ -3215,7 +3348,8 @@
 
     for (i = 0; i < mov->nb_streams; i++) {
         if (mov->tracks[i].entry > 0 && mov->tracks[i].timescale) {
-            int64_t max_track_len_temp = av_rescale_rnd(mov->tracks[i].track_duration,
+            int64_t max_track_len_temp = av_rescale_rnd(
+                                                calc_pts_duration(mov, &mov->tracks[i]),
                                                 MOV_TIMESCALE,
                                                 mov->tracks[i].timescale,
                                                 AV_ROUND_UP);
@@ -3766,12 +3900,12 @@
     if (s->nb_chapters && !(mov->flags & FF_MOV_FLAG_DISABLE_CHPL))
         mov_write_chpl_tag(pb_buf, s);
 
-    if ((size = avio_close_dyn_buf(pb_buf, &buf)) > 0) {
+    if ((size = avio_get_dyn_buf(pb_buf, &buf)) > 0) {
         avio_wb32(pb, size + 8);
         ffio_wfourcc(pb, "udta");
         avio_write(pb, buf, size);
     }
-    av_free(buf);
+    ffio_free_dyn_buf(&pb_buf);
 
     return 0;
 }
@@ -4155,6 +4289,9 @@
         flags &= ~MOV_TFHD_BASE_DATA_OFFSET;
         flags |= MOV_TFHD_DEFAULT_BASE_IS_MOOF;
     }
+    /* CMAF requires all values to be explicit in tfhd atoms */
+    if (mov->flags & FF_MOV_FLAG_CMAF)
+        flags |= MOV_TFHD_STSD_ID;
 
     /* Don't set a default sample size, the silverlight player refuses
      * to play files with that set. Don't set a default sample duration,
@@ -4162,7 +4299,7 @@
      * file format says it MUST NOT be set. */
     if (track->mode == MODE_ISM)
         flags &= ~(MOV_TFHD_DEFAULT_SIZE | MOV_TFHD_DEFAULT_DURATION |
-                   MOV_TFHD_BASE_DATA_OFFSET);
+                   MOV_TFHD_BASE_DATA_OFFSET | MOV_TFHD_STSD_ID);
 
     avio_wb32(pb, 0); /* size placeholder */
     ffio_wfourcc(pb, "tfhd");
@@ -4172,6 +4309,9 @@
     avio_wb32(pb, track->track_id); /* track-id */
     if (flags & MOV_TFHD_BASE_DATA_OFFSET)
         avio_wb64(pb, moof_offset);
+    if (flags & MOV_TFHD_STSD_ID) {
+        avio_wb32(pb, 1);
+    }
     if (flags & MOV_TFHD_DEFAULT_DURATION) {
         track->default_duration = get_cluster_duration(track, 0);
         avio_wb32(pb, track->default_duration);
@@ -4458,7 +4598,8 @@
 {
     int64_t pos = avio_tell(pb), offset_pos, end_pos;
     int64_t presentation_time, duration, offset;
-    int starts_with_SAP, i, entries;
+    unsigned starts_with_SAP;
+    int i, entries;
 
     if (track->entry) {
         entries = 1;
@@ -4553,6 +4694,7 @@
 {
     int64_t pos = avio_tell(pb), pts_us, ntp_ts;
     MOVTrack *first_track;
+    int flags = 24;
 
     /* PRFT should be associated with at most one track. So, choosing only the
      * first track. */
@@ -4571,7 +4713,13 @@
     }
 
     if (mov->write_prft == MOV_PRFT_SRC_WALLCLOCK) {
-        ntp_ts = ff_get_formatted_ntp_time(ff_ntp_time());
+        if (first_track->cluster[0].prft.wallclock) {
+            /* Round the NTP time to whole milliseconds. */
+            ntp_ts = ff_get_formatted_ntp_time((first_track->cluster[0].prft.wallclock / 1000) * 1000 +
+                                               NTP_OFFSET_US);
+            flags = first_track->cluster[0].prft.flags;
+        } else
+            ntp_ts = ff_get_formatted_ntp_time(ff_ntp_time());
     } else if (mov->write_prft == MOV_PRFT_SRC_PTS) {
         pts_us = av_rescale_q(first_track->cluster[0].pts,
                               first_track->st->time_base, AV_TIME_BASE_Q);
@@ -4585,7 +4733,7 @@
     avio_wb32(pb, 0);                           // Size place holder
     ffio_wfourcc(pb, "prft");                   // Type
     avio_w8(pb, 1);                             // Version
-    avio_wb24(pb, 0);                           // Flags
+    avio_wb24(pb, flags);                       // Flags
     avio_wb32(pb, first_track->track_id);       // reference track ID
     avio_wb64(pb, ntp_ts);                      // NTP time stamp
     avio_wb64(pb, first_track->cluster[0].pts); //media time
@@ -4603,7 +4751,8 @@
     mov_write_moof_tag_internal(avio_buf, mov, tracks, 0);
     moof_size = ffio_close_null_buf(avio_buf);
 
-    if (mov->flags & FF_MOV_FLAG_DASH && !(mov->flags & FF_MOV_FLAG_GLOBAL_SIDX))
+    if (mov->flags & FF_MOV_FLAG_DASH &&
+        !(mov->flags & (FF_MOV_FLAG_GLOBAL_SIDX | FF_MOV_FLAG_SKIP_SIDX)))
         mov_write_sidx_tags(pb, mov, tracks, moof_size + 8 + mdat_size);
 
     if (mov->write_prft > MOV_PRFT_NONE && mov->write_prft < MOV_PRFT_NB)
@@ -4684,27 +4833,11 @@
     return 0;
 }
 
-/* TODO: This needs to be more general */
-static int mov_write_ftyp_tag(AVIOContext *pb, AVFormatContext *s)
+static void mov_write_ftyp_tag_internal(AVIOContext *pb, AVFormatContext *s,
+                                        int has_h264, int has_video, int write_minor)
 {
     MOVMuxContext *mov = s->priv_data;
-    int64_t pos = avio_tell(pb);
-    int has_h264 = 0, has_video = 0;
     int minor = 0x200;
-    int i;
-
-    for (i = 0; i < s->nb_streams; i++) {
-        AVStream *st = s->streams[i];
-        if (is_cover_image(st))
-            continue;
-        if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO)
-            has_video = 1;
-        if (st->codecpar->codec_id == AV_CODEC_ID_H264)
-            has_h264 = 1;
-    }
-
-    avio_wb32(pb, 0); /* size */
-    ffio_wfourcc(pb, "ftyp");
 
     if (mov->major_brand && strlen(mov->major_brand) >= 4)
         ffio_wfourcc(pb, mov->major_brand);
@@ -4716,6 +4849,9 @@
         minor =     has_h264 ? 0x20000 : 0x10000;
     } else if (mov->mode == MODE_PSP)
         ffio_wfourcc(pb, "MSNV");
+    else if (mov->mode == MODE_MP4 && mov->flags & FF_MOV_FLAG_FRAGMENT &&
+                                      mov->flags & FF_MOV_FLAG_NEGATIVE_CTS_OFFSETS)
+        ffio_wfourcc(pb, "iso6"); // Required when using signed CTS offsets in trun boxes
     else if (mov->mode == MODE_MP4 && mov->flags & FF_MOV_FLAG_DEFAULT_BASE_MOOF)
         ffio_wfourcc(pb, "iso5"); // Required when using default-base-is-moof
     else if (mov->mode == MODE_MP4 && mov->flags & FF_MOV_FLAG_NEGATIVE_CTS_OFFSETS)
@@ -4731,31 +4867,68 @@
     else
         ffio_wfourcc(pb, "qt  ");
 
-    avio_wb32(pb, minor);
+    if (write_minor)
+        avio_wb32(pb, minor);
+}
 
-    if (mov->mode == MODE_MOV)
-        ffio_wfourcc(pb, "qt  ");
-    else if (mov->mode == MODE_ISM) {
-        ffio_wfourcc(pb, "piff");
-    } else if (!(mov->flags & FF_MOV_FLAG_DEFAULT_BASE_MOOF)) {
-        ffio_wfourcc(pb, "isom");
-        ffio_wfourcc(pb, "iso2");
-        if (has_h264)
-            ffio_wfourcc(pb, "avc1");
+static int mov_write_ftyp_tag(AVIOContext *pb, AVFormatContext *s)
+{
+    MOVMuxContext *mov = s->priv_data;
+    int64_t pos = avio_tell(pb);
+    int has_h264 = 0, has_video = 0;
+    int i;
+
+    for (i = 0; i < s->nb_streams; i++) {
+        AVStream *st = s->streams[i];
+        if (is_cover_image(st))
+            continue;
+        if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO)
+            has_video = 1;
+        if (st->codecpar->codec_id == AV_CODEC_ID_H264)
+            has_h264 = 1;
     }
 
-    // We add tfdt atoms when fragmenting, signal this with the iso6 compatible
-    // brand. This is compatible with users that don't understand tfdt.
-    if (mov->flags & FF_MOV_FLAG_FRAGMENT && mov->mode != MODE_ISM)
-        ffio_wfourcc(pb, "iso6");
+    avio_wb32(pb, 0); /* size */
+    ffio_wfourcc(pb, "ftyp");
 
-    if (mov->mode == MODE_3GP)
-        ffio_wfourcc(pb, has_h264 ? "3gp6":"3gp4");
-    else if (mov->mode & MODE_3G2)
-        ffio_wfourcc(pb, has_h264 ? "3g2b":"3g2a");
-    else if (mov->mode == MODE_PSP)
-        ffio_wfourcc(pb, "MSNV");
-    else if (mov->mode == MODE_MP4)
+    // Write major brand
+    mov_write_ftyp_tag_internal(pb, s, has_h264, has_video, 1);
+    // Write the major brand as the first compatible brand as well
+    mov_write_ftyp_tag_internal(pb, s, has_h264, has_video, 0);
+
+    // Write compatible brands, ensuring that we don't write the major brand as a
+    // compatible brand a second time.
+    if (mov->mode == MODE_ISM) {
+        ffio_wfourcc(pb, "piff");
+    } else if (mov->mode != MODE_MOV) {
+        // We add tfdt atoms when fragmenting, signal this with the iso6 compatible
+        // brand, if not already the major brand. This is compatible with users that
+        // don't understand tfdt.
+        if (mov->mode == MODE_MP4) {
+            if (mov->flags & FF_MOV_FLAG_CMAF)
+                ffio_wfourcc(pb, "cmfc");
+            if (mov->flags & FF_MOV_FLAG_FRAGMENT && !(mov->flags & FF_MOV_FLAG_NEGATIVE_CTS_OFFSETS))
+                ffio_wfourcc(pb, "iso6");
+        } else {
+            if (mov->flags & FF_MOV_FLAG_FRAGMENT)
+                ffio_wfourcc(pb, "iso6");
+            if (mov->flags & FF_MOV_FLAG_DEFAULT_BASE_MOOF)
+                ffio_wfourcc(pb, "iso5");
+            else if (mov->flags & FF_MOV_FLAG_NEGATIVE_CTS_OFFSETS)
+                ffio_wfourcc(pb, "iso4");
+        }
+        // Brands prior to iso5 can't be signaled when using default-base-is-moof
+        if (!(mov->flags & FF_MOV_FLAG_DEFAULT_BASE_MOOF)) {
+            // write isom for mp4 only if it it's not the major brand already.
+            if (mov->mode != MODE_MP4 || mov->flags & FF_MOV_FLAG_NEGATIVE_CTS_OFFSETS)
+                ffio_wfourcc(pb, "isom");
+            ffio_wfourcc(pb, "iso2");
+            if (has_h264)
+                ffio_wfourcc(pb, "avc1");
+        }
+    }
+
+    if (mov->mode == MODE_MP4)
         ffio_wfourcc(pb, "mp41");
 
     if (mov->flags & FF_MOV_FLAG_DASH && mov->flags & FF_MOV_FLAG_GLOBAL_SIDX)
@@ -4945,6 +5118,25 @@
     }
 }
 
+static void mov_parse_truehd_frame(AVPacket *pkt, MOVTrack *trk)
+{
+    int length;
+
+    if (pkt->size < 8)
+        return;
+
+    length = (AV_RB16(pkt->data) & 0xFFF) * 2;
+    if (length < 8 || length > pkt->size)
+        return;
+
+    if (AV_RB32(pkt->data + 4) == 0xF8726FBA) {
+        trk->cluster[trk->entry].flags |= MOV_SYNC_SAMPLE;
+        trk->has_keyframes++;
+    }
+
+    return;
+}
+
 static int mov_flush_fragment_interleaving(AVFormatContext *s, MOVTrack *track)
 {
     MOVMuxContext *mov = s->priv_data;
@@ -4958,12 +5150,11 @@
         if ((ret = avio_open_dyn_buf(&mov->mdat_buf)) < 0)
             return ret;
     }
-    buf_size = avio_close_dyn_buf(track->mdat_buf, &buf);
-    track->mdat_buf = NULL;
+    buf_size = avio_get_dyn_buf(track->mdat_buf, &buf);
 
     offset = avio_tell(mov->mdat_buf);
     avio_write(mov->mdat_buf, buf, buf_size);
-    av_free(buf);
+    ffio_free_dyn_buf(&track->mdat_buf);
 
     for (i = track->entries_flushed; i < track->entry; i++)
         track->cluster[i].pos += offset;
@@ -5055,17 +5246,16 @@
         if (mov->flags & FF_MOV_FLAG_DELAY_MOOV) {
             if (mov->flags & FF_MOV_FLAG_GLOBAL_SIDX)
                 mov->reserved_header_pos = avio_tell(s->pb);
-            avio_flush(s->pb);
+            avio_write_marker(s->pb, AV_NOPTS_VALUE, AVIO_DATA_MARKER_FLUSH_POINT);
             mov->moov_written = 1;
             return 0;
         }
 
-        buf_size = avio_close_dyn_buf(mov->mdat_buf, &buf);
-        mov->mdat_buf = NULL;
+        buf_size = avio_get_dyn_buf(mov->mdat_buf, &buf);
         avio_wb32(s->pb, buf_size + 8);
         ffio_wfourcc(s->pb, "mdat");
         avio_write(s->pb, buf, buf_size);
-        av_free(buf);
+        ffio_free_dyn_buf(&mov->mdat_buf);
 
         if (mov->flags & FF_MOV_FLAG_GLOBAL_SIDX)
             mov->reserved_header_pos = avio_tell(s->pb);
@@ -5080,7 +5270,7 @@
             mov->tracks[i].entry = 0;
             mov->tracks[i].end_reliable = 0;
         }
-        avio_flush(s->pb);
+        avio_write_marker(s->pb, AV_NOPTS_VALUE, AVIO_DATA_MARKER_FLUSH_POINT);
         return 0;
     }
 
@@ -5145,7 +5335,7 @@
         }
 
         if (write_moof) {
-            avio_flush(s->pb);
+            avio_write_marker(s->pb, AV_NOPTS_VALUE, AVIO_DATA_MARKER_FLUSH_POINT);
 
             mov_write_moof_tag(s->pb, mov, moof_tracks, mdat_size);
             mov->fragments++;
@@ -5177,7 +5367,7 @@
 
     mov->mdat_size = 0;
 
-    avio_flush(s->pb);
+    avio_write_marker(s->pb, AV_NOPTS_VALUE, AVIO_DATA_MARKER_FLUSH_POINT);
     return 0;
 }
 
@@ -5239,8 +5429,10 @@
     AVIOContext *pb = s->pb;
     MOVTrack *trk = &mov->tracks[pkt->stream_index];
     AVCodecParameters *par = trk->par;
+    AVProducerReferenceTime *prft;
     unsigned int samples_in_chunk = 0;
-    int size = pkt->size, ret = 0;
+    int size = pkt->size, ret = 0, offset = 0;
+    int prft_size;
     uint8_t *reformatted_data = NULL;
 
     ret = check_pkt(s, pkt);
@@ -5303,12 +5495,13 @@
         !TAG_IS_AVCI(trk->tag) &&
         (par->codec_id != AV_CODEC_ID_DNXHD)) {
         trk->vos_len  = par->extradata_size;
-        trk->vos_data = av_malloc(trk->vos_len);
+        trk->vos_data = av_malloc(trk->vos_len + AV_INPUT_BUFFER_PADDING_SIZE);
         if (!trk->vos_data) {
             ret = AVERROR(ENOMEM);
             goto err;
         }
         memcpy(trk->vos_data, par->extradata, trk->vos_len);
+        memset(trk->vos_data + trk->vos_len, 0, AV_INPUT_BUFFER_PADDING_SIZE);
     }
 
     if (par->codec_id == AV_CODEC_ID_AAC && pkt->size > 2 &&
@@ -5325,8 +5518,10 @@
         /* from x264 or from bytestream H.264 */
         /* NAL reformatting needed */
         if (trk->hint_track >= 0 && trk->hint_track < mov->nb_streams) {
-            ff_avc_parse_nal_units_buf(pkt->data, &reformatted_data,
-                                       &size);
+            ret = ff_avc_parse_nal_units_buf(pkt->data, &reformatted_data,
+                                             &size);
+            if (ret < 0)
+                return ret;
             avio_write(pb, reformatted_data, size);
         } else {
             if (trk->cenc.aes_ctr) {
@@ -5343,14 +5538,20 @@
                (AV_RB24(trk->vos_data) == 1 || AV_RB32(trk->vos_data) == 1)) {
         /* extradata is Annex B, assume the bitstream is too and convert it */
         if (trk->hint_track >= 0 && trk->hint_track < mov->nb_streams) {
-            ff_hevc_annexb2mp4_buf(pkt->data, &reformatted_data, &size, 0, NULL);
+            ret = ff_hevc_annexb2mp4_buf(pkt->data, &reformatted_data,
+                                         &size, 0, NULL);
+            if (ret < 0)
+                return ret;
             avio_write(pb, reformatted_data, size);
         } else {
             size = ff_hevc_annexb2mp4(pb, pkt->data, pkt->size, 0, NULL);
         }
     } else if (par->codec_id == AV_CODEC_ID_AV1) {
         if (trk->hint_track >= 0 && trk->hint_track < mov->nb_streams) {
-            ff_av1_filter_obus_buf(pkt->data, &reformatted_data, &size);
+            ret = ff_av1_filter_obus_buf(pkt->data, &reformatted_data,
+                                         &size, &offset);
+            if (ret < 0)
+                return ret;
             avio_write(pb, reformatted_data, size);
         } else {
             size = ff_av1_filter_obus(pb, pkt->data, pkt->size);
@@ -5382,19 +5583,21 @@
     }
 
     if ((par->codec_id == AV_CODEC_ID_DNXHD ||
+         par->codec_id == AV_CODEC_ID_TRUEHD ||
          par->codec_id == AV_CODEC_ID_AC3) && !trk->vos_len) {
         /* copy frame to create needed atoms */
         trk->vos_len  = size;
-        trk->vos_data = av_malloc(size);
+        trk->vos_data = av_malloc(size + AV_INPUT_BUFFER_PADDING_SIZE);
         if (!trk->vos_data) {
             ret = AVERROR(ENOMEM);
             goto err;
         }
         memcpy(trk->vos_data, pkt->data, size);
+        memset(trk->vos_data + size, 0, AV_INPUT_BUFFER_PADDING_SIZE);
     }
 
     if (trk->entry >= trk->cluster_capacity) {
-        unsigned new_capacity = 2 * (trk->entry + MOV_INDEX_CLUSTER_SIZE);
+        unsigned new_capacity = trk->entry + MOV_INDEX_CLUSTER_SIZE;
         if (av_reallocp_array(&trk->cluster, new_capacity,
                               sizeof(*trk->cluster))) {
             ret = AVERROR(ENOMEM);
@@ -5422,7 +5625,8 @@
              * the next fragment. This means the cts of the first sample must
              * be the same in all fragments, unless end_pts was updated by
              * the packet causing the fragment to be written. */
-            if ((mov->flags & FF_MOV_FLAG_DASH && !(mov->flags & FF_MOV_FLAG_GLOBAL_SIDX)) ||
+            if ((mov->flags & FF_MOV_FLAG_DASH &&
+                !(mov->flags & (FF_MOV_FLAG_GLOBAL_SIDX | FF_MOV_FLAG_SKIP_SIDX))) ||
                 mov->mode == MODE_ISM)
                 pkt->pts = pkt->dts + trk->end_pts - trk->cluster[trk->entry].dts;
         } else {
@@ -5490,6 +5694,8 @@
 
     if (par->codec_id == AV_CODEC_ID_VC1) {
         mov_parse_vc1_frame(pkt, trk);
+    } else if (par->codec_id == AV_CODEC_ID_TRUEHD) {
+        mov_parse_truehd_frame(pkt, trk);
     } else if (pkt->flags & AV_PKT_FLAG_KEY) {
         if (mov->mode == MODE_MOV && par->codec_id == AV_CODEC_ID_MPEG2VIDEO &&
             trk->entry > 0) { // force sync sample for the first key frame
@@ -5506,18 +5712,27 @@
         trk->cluster[trk->entry].flags |= MOV_DISPOSABLE_SAMPLE;
         trk->has_disposable++;
     }
+
+    prft = (AVProducerReferenceTime *)av_packet_get_side_data(pkt, AV_PKT_DATA_PRFT, &prft_size);
+    if (prft && prft_size == sizeof(AVProducerReferenceTime))
+        memcpy(&trk->cluster[trk->entry].prft, prft, prft_size);
+    else
+        memset(&trk->cluster[trk->entry].prft, 0, sizeof(AVProducerReferenceTime));
+
     trk->entry++;
     trk->sample_count += samples_in_chunk;
     mov->mdat_size    += size;
 
     if (trk->hint_track >= 0 && trk->hint_track < mov->nb_streams)
         ff_mov_add_hinted_packet(s, pkt, trk->hint_track, trk->entry,
-                                 reformatted_data, size);
+                                 reformatted_data ? reformatted_data + offset
+                                                  : NULL, size);
 
 end:
 err:
 
-    av_free(reformatted_data);
+    if (pkt->data != reformatted_data)
+        av_free(reformatted_data);
     return ret;
 }
 
@@ -5947,6 +6162,11 @@
         av_freep(&mov->tracks[i].frag_info);
         av_packet_unref(&mov->tracks[i].cover_image);
 
+        if (mov->tracks[i].eac3_priv) {
+            struct eac3_info *info = mov->tracks[i].eac3_priv;
+            av_packet_unref(&info->pkt);
+            av_freep(&mov->tracks[i].eac3_priv);
+        }
         if (mov->tracks[i].vos_len)
             av_freep(&mov->tracks[i].vos_data);
 
@@ -6007,12 +6227,13 @@
         cur += strspn(cur, "\n\r");
     }
     if (have_palette) {
-        track->vos_data = av_malloc(16*4);
+        track->vos_data = av_malloc(16*4 + AV_INPUT_BUFFER_PADDING_SIZE);
         if (!track->vos_data)
             return AVERROR(ENOMEM);
         for (i = 0; i < 16; i++) {
             AV_WB32(track->vos_data + i * 4, palette[i]);
         }
+        memset(track->vos_data + 16*4, 0, AV_INPUT_BUFFER_PADDING_SIZE);
         track->vos_len = 16 * 4;
     }
     st->codecpar->width = width;
@@ -6061,12 +6282,20 @@
     if (mov->flags & FF_MOV_FLAG_DASH)
         mov->flags |= FF_MOV_FLAG_FRAGMENT | FF_MOV_FLAG_EMPTY_MOOV |
                       FF_MOV_FLAG_DEFAULT_BASE_MOOF;
+    if (mov->flags & FF_MOV_FLAG_CMAF)
+        mov->flags |= FF_MOV_FLAG_FRAGMENT | FF_MOV_FLAG_EMPTY_MOOV |
+                      FF_MOV_FLAG_DEFAULT_BASE_MOOF | FF_MOV_FLAG_NEGATIVE_CTS_OFFSETS;
 
     if (mov->flags & FF_MOV_FLAG_EMPTY_MOOV && s->flags & AVFMT_FLAG_AUTO_BSF) {
         av_log(s, AV_LOG_VERBOSE, "Empty MOOV enabled; disabling automatic bitstream filtering\n");
         s->flags &= ~AVFMT_FLAG_AUTO_BSF;
     }
 
+    if (mov->flags & FF_MOV_FLAG_GLOBAL_SIDX && mov->flags & FF_MOV_FLAG_SKIP_SIDX) {
+        av_log(s, AV_LOG_WARNING, "Global SIDX enabled; Ignoring skip_sidx option\n");
+        mov->flags &= ~FF_MOV_FLAG_SKIP_SIDX;
+    }
+
     if (mov->flags & FF_MOV_FLAG_FASTSTART) {
         mov->reserved_moov_size = -1;
     }
@@ -6082,12 +6311,21 @@
                 s->avoid_negative_ts == AVFMT_AVOID_NEG_TS_MAKE_ZERO)
                 mov->use_editlist = 0;
         }
+        if (mov->flags & FF_MOV_FLAG_CMAF) {
+            // CMAF Track requires negative cts offsets without edit lists
+            mov->use_editlist = 0;
+        }
     }
     if (mov->flags & FF_MOV_FLAG_EMPTY_MOOV &&
         !(mov->flags & FF_MOV_FLAG_DELAY_MOOV) && mov->use_editlist)
         av_log(s, AV_LOG_WARNING, "No meaningful edit list will be written when using empty_moov without delay_moov\n");
 
-    if (!mov->use_editlist && s->avoid_negative_ts == AVFMT_AVOID_NEG_TS_AUTO)
+    if (mov->flags & FF_MOV_FLAG_CMAF && mov->use_editlist) {
+        av_log(s, AV_LOG_WARNING, "Edit list enabled; Assuming writing CMAF Track File\n");
+        mov->flags &= ~FF_MOV_FLAG_NEGATIVE_CTS_OFFSETS;
+    }
+    if (!mov->use_editlist && s->avoid_negative_ts == AVFMT_AVOID_NEG_TS_AUTO &&
+        !(mov->flags & FF_MOV_FLAG_NEGATIVE_CTS_OFFSETS))
         s->avoid_negative_ts = AVFMT_AVOID_NEG_TS_MAKE_ZERO;
 
     /* Clear the omit_tfhd_offset flag if default_base_moof is set;
@@ -6190,7 +6428,7 @@
         track->par = st->codecpar;
         track->language = ff_mov_iso639_to_lang(lang?lang->value:"und", mov->mode!=MODE_MOV);
         if (track->language < 0)
-            track->language = 0;
+            track->language = 32767;  // Unspecified Macintosh language code
         track->mode = mov->mode;
         track->tag  = mov_find_codec_tag(s, track);
         if (!track->tag) {
@@ -6218,6 +6456,8 @@
             }
             if (mov->video_track_timescale) {
                 track->timescale = mov->video_track_timescale;
+                if (mov->mode == MODE_ISM && mov->video_track_timescale != 10000000)
+                    av_log(s, AV_LOG_WARNING, "Warning: some tools, like mp4split, assume a timescale of 10000000 for ISMV.\n");
             } else {
                 track->timescale = st->time_base.den;
                 while(track->timescale < 10000)
@@ -6292,12 +6532,14 @@
                 }
             }
             if (track->par->codec_id == AV_CODEC_ID_FLAC ||
+                track->par->codec_id == AV_CODEC_ID_TRUEHD ||
                 track->par->codec_id == AV_CODEC_ID_OPUS) {
                 if (track->mode != MODE_MP4) {
                     av_log(s, AV_LOG_ERROR, "%s only supported in MP4.\n", avcodec_get_name(track->par->codec_id));
                     return AVERROR(EINVAL);
                 }
-                if (s->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
+                if (track->par->codec_id != AV_CODEC_ID_OPUS &&
+                    s->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
                     av_log(s, AV_LOG_ERROR,
                            "%s in MP4 support is experimental, add "
                            "'-strict %d' if you want to use it.\n",
@@ -6314,10 +6556,14 @@
         }
         if (!track->height)
             track->height = st->codecpar->height;
-        /* The ism specific timescale isn't mandatory, but is assumed by
-         * some tools, such as mp4split. */
-        if (mov->mode == MODE_ISM)
-            track->timescale = 10000000;
+        /* The Protected Interoperable File Format (PIFF) standard, used by ISMV recommends but
+           doesn't mandate a track timescale of 10,000,000. The muxer allows a custom timescale
+           for video tracks, so if user-set, it isn't overwritten */
+        if (mov->mode == MODE_ISM &&
+            (st->codecpar->codec_type != AVMEDIA_TYPE_VIDEO ||
+            (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO && !mov->video_track_timescale))) {
+             track->timescale = 10000000;
+        }
 
         avpriv_set_pts_info(st, 64, 1, track->timescale);
 
@@ -6350,7 +6596,7 @@
                 nb_tracks++;
     }
 
-    if (mov->mode == MODE_MOV || mov->mode == MODE_MP4)
+    if (mov->nb_meta_tmcd)
         tmcd_track = nb_tracks;
 
     for (i = 0; i < s->nb_streams; i++) {
@@ -6364,11 +6610,12 @@
                 mov_create_dvd_sub_decoder_specific_info(track, st);
             else if (!TAG_IS_AVCI(track->tag) && st->codecpar->codec_id != AV_CODEC_ID_DNXHD) {
                 track->vos_len  = st->codecpar->extradata_size;
-                track->vos_data = av_malloc(track->vos_len);
+                track->vos_data = av_malloc(track->vos_len + AV_INPUT_BUFFER_PADDING_SIZE);
                 if (!track->vos_data) {
                     return AVERROR(ENOMEM);
                 }
                 memcpy(track->vos_data, st->codecpar->extradata, track->vos_len);
+                memset(track->vos_data + track->vos_len, 0, AV_INPUT_BUFFER_PADDING_SIZE);
             }
         }
 
@@ -6464,7 +6711,6 @@
         !(mov->flags & FF_MOV_FLAG_DELAY_MOOV)) {
         if ((ret = mov_write_moov_tag(pb, mov, s)) < 0)
             return ret;
-        avio_flush(pb);
         mov->moov_written = 1;
         if (mov->flags & FF_MOV_FLAG_GLOBAL_SIDX)
             mov->reserved_header_pos = avio_tell(pb);
@@ -6548,7 +6794,7 @@
 {
     int ret = 0, moov_size;
     MOVMuxContext *mov = s->priv_data;
-    int64_t pos, pos_end = avio_tell(s->pb);
+    int64_t pos, pos_end;
     uint8_t *buf, *read_buf[2];
     int read_buf_id = 0;
     int read_size[2];
@@ -6624,10 +6870,11 @@
             AVCodecParameters *par = track->par;
 
             track->vos_len  = par->extradata_size;
-            track->vos_data = av_malloc(track->vos_len);
+            track->vos_data = av_malloc(track->vos_len + AV_INPUT_BUFFER_PADDING_SIZE);
             if (!track->vos_data)
                 return AVERROR(ENOMEM);
             memcpy(track->vos_data, par->extradata, track->vos_len);
+            memset(track->vos_data + track->vos_len, 0, AV_INPUT_BUFFER_PADDING_SIZE);
         }
         mov->need_rewrite_extradata = 0;
     }
@@ -6714,9 +6961,8 @@
             avio_seek(pb, mov->reserved_header_pos, SEEK_SET);
             mov_write_sidx_tags(pb, mov, -1, 0);
             avio_seek(pb, end, SEEK_SET);
-            avio_write_marker(s->pb, AV_NOPTS_VALUE, AVIO_DATA_MARKER_TRAILER);
-            mov_write_mfra_tag(pb, mov);
-        } else if (!(mov->flags & FF_MOV_FLAG_SKIP_TRAILER)) {
+        }
+        if (!(mov->flags & FF_MOV_FLAG_SKIP_TRAILER)) {
             avio_write_marker(s->pb, AV_NOPTS_VALUE, AVIO_DATA_MARKER_TRAILER);
             mov_write_mfra_tag(pb, mov);
         }
@@ -6752,37 +6998,39 @@
 };
 
 const AVCodecTag codec_mp4_tags[] = {
-    { AV_CODEC_ID_MPEG4       , MKTAG('m', 'p', '4', 'v') },
-    { AV_CODEC_ID_H264        , MKTAG('a', 'v', 'c', '1') },
-    { AV_CODEC_ID_H264        , MKTAG('a', 'v', 'c', '3') },
-    { AV_CODEC_ID_HEVC        , MKTAG('h', 'e', 'v', '1') },
-    { AV_CODEC_ID_HEVC        , MKTAG('h', 'v', 'c', '1') },
-    { AV_CODEC_ID_MPEG2VIDEO  , MKTAG('m', 'p', '4', 'v') },
-    { AV_CODEC_ID_MPEG1VIDEO  , MKTAG('m', 'p', '4', 'v') },
-    { AV_CODEC_ID_MJPEG       , MKTAG('m', 'p', '4', 'v') },
-    { AV_CODEC_ID_PNG         , MKTAG('m', 'p', '4', 'v') },
-    { AV_CODEC_ID_JPEG2000    , MKTAG('m', 'p', '4', 'v') },
-    { AV_CODEC_ID_VC1         , MKTAG('v', 'c', '-', '1') },
-    { AV_CODEC_ID_DIRAC       , MKTAG('d', 'r', 'a', 'c') },
-    { AV_CODEC_ID_TSCC2       , MKTAG('m', 'p', '4', 'v') },
-    { AV_CODEC_ID_VP9         , MKTAG('v', 'p', '0', '9') },
-    { AV_CODEC_ID_AV1         , MKTAG('a', 'v', '0', '1') },
-    { AV_CODEC_ID_AAC         , MKTAG('m', 'p', '4', 'a') },
-    { AV_CODEC_ID_MP4ALS      , MKTAG('m', 'p', '4', 'a') },
-    { AV_CODEC_ID_MP3         , MKTAG('m', 'p', '4', 'a') },
-    { AV_CODEC_ID_MP2         , MKTAG('m', 'p', '4', 'a') },
-    { AV_CODEC_ID_AC3         , MKTAG('a', 'c', '-', '3') },
-    { AV_CODEC_ID_EAC3        , MKTAG('e', 'c', '-', '3') },
-    { AV_CODEC_ID_DTS         , MKTAG('m', 'p', '4', 'a') },
-    { AV_CODEC_ID_FLAC        , MKTAG('f', 'L', 'a', 'C') },
-    { AV_CODEC_ID_OPUS        , MKTAG('O', 'p', 'u', 's') },
-    { AV_CODEC_ID_VORBIS      , MKTAG('m', 'p', '4', 'a') },
-    { AV_CODEC_ID_QCELP       , MKTAG('m', 'p', '4', 'a') },
-    { AV_CODEC_ID_EVRC        , MKTAG('m', 'p', '4', 'a') },
-    { AV_CODEC_ID_DVD_SUBTITLE, MKTAG('m', 'p', '4', 's') },
-    { AV_CODEC_ID_MOV_TEXT    , MKTAG('t', 'x', '3', 'g') },
-    { AV_CODEC_ID_BIN_DATA    , MKTAG('g', 'p', 'm', 'd') },
-    { AV_CODEC_ID_NONE        ,    0 },
+    { AV_CODEC_ID_MPEG4,           MKTAG('m', 'p', '4', 'v') },
+    { AV_CODEC_ID_H264,            MKTAG('a', 'v', 'c', '1') },
+    { AV_CODEC_ID_H264,            MKTAG('a', 'v', 'c', '3') },
+    { AV_CODEC_ID_HEVC,            MKTAG('h', 'e', 'v', '1') },
+    { AV_CODEC_ID_HEVC,            MKTAG('h', 'v', 'c', '1') },
+    { AV_CODEC_ID_MPEG2VIDEO,      MKTAG('m', 'p', '4', 'v') },
+    { AV_CODEC_ID_MPEG1VIDEO,      MKTAG('m', 'p', '4', 'v') },
+    { AV_CODEC_ID_MJPEG,           MKTAG('m', 'p', '4', 'v') },
+    { AV_CODEC_ID_PNG,             MKTAG('m', 'p', '4', 'v') },
+    { AV_CODEC_ID_JPEG2000,        MKTAG('m', 'p', '4', 'v') },
+    { AV_CODEC_ID_VC1,             MKTAG('v', 'c', '-', '1') },
+    { AV_CODEC_ID_DIRAC,           MKTAG('d', 'r', 'a', 'c') },
+    { AV_CODEC_ID_TSCC2,           MKTAG('m', 'p', '4', 'v') },
+    { AV_CODEC_ID_VP9,             MKTAG('v', 'p', '0', '9') },
+    { AV_CODEC_ID_AV1,             MKTAG('a', 'v', '0', '1') },
+    { AV_CODEC_ID_AAC,             MKTAG('m', 'p', '4', 'a') },
+    { AV_CODEC_ID_MP4ALS,          MKTAG('m', 'p', '4', 'a') },
+    { AV_CODEC_ID_MP3,             MKTAG('m', 'p', '4', 'a') },
+    { AV_CODEC_ID_MP2,             MKTAG('m', 'p', '4', 'a') },
+    { AV_CODEC_ID_AC3,             MKTAG('a', 'c', '-', '3') },
+    { AV_CODEC_ID_EAC3,            MKTAG('e', 'c', '-', '3') },
+    { AV_CODEC_ID_DTS,             MKTAG('m', 'p', '4', 'a') },
+    { AV_CODEC_ID_TRUEHD,          MKTAG('m', 'l', 'p', 'a') },
+    { AV_CODEC_ID_FLAC,            MKTAG('f', 'L', 'a', 'C') },
+    { AV_CODEC_ID_OPUS,            MKTAG('O', 'p', 'u', 's') },
+    { AV_CODEC_ID_VORBIS,          MKTAG('m', 'p', '4', 'a') },
+    { AV_CODEC_ID_QCELP,           MKTAG('m', 'p', '4', 'a') },
+    { AV_CODEC_ID_EVRC,            MKTAG('m', 'p', '4', 'a') },
+    { AV_CODEC_ID_DVD_SUBTITLE,    MKTAG('m', 'p', '4', 's') },
+    { AV_CODEC_ID_MOV_TEXT,        MKTAG('t', 'x', '3', 'g') },
+    { AV_CODEC_ID_BIN_DATA,        MKTAG('g', 'p', 'm', 'd') },
+    { AV_CODEC_ID_MPEGH_3D_AUDIO,  MKTAG('m', 'h', 'm', '1') },
+    { AV_CODEC_ID_NONE,               0 },
 };
 
 const AVCodecTag codec_ism_tags[] = {
@@ -6827,7 +7075,7 @@
     .deinit            = mov_free,
     .flags             = AVFMT_GLOBALHEADER | AVFMT_ALLOW_FLUSH | AVFMT_TS_NEGATIVE,
     .codec_tag         = (const AVCodecTag* const []){
-        ff_codec_movvideo_tags, ff_codec_movaudio_tags, 0
+        ff_codec_movvideo_tags, ff_codec_movaudio_tags, ff_codec_movsubtitle_tags, 0
     },
     .check_bitstream   = mov_check_bitstream,
     .priv_class        = &mov_muxer_class,
diff --git a/libavformat/movenc.h b/libavformat/movenc.h
index fe605d1..997b2d6 100644
--- a/libavformat/movenc.h
+++ b/libavformat/movenc.h
@@ -56,6 +56,7 @@
 #define MOV_PARTIAL_SYNC_SAMPLE 0x0002
 #define MOV_DISPOSABLE_SAMPLE   0x0004
     uint32_t     flags;
+    AVProducerReferenceTime prft;
 } MOVIentry;
 
 typedef struct HintSample {
@@ -257,6 +258,9 @@
 #define FF_MOV_FLAG_SKIP_TRAILER          (1 << 18)
 #define FF_MOV_FLAG_NEGATIVE_CTS_OFFSETS  (1 << 19)
 #define FF_MOV_FLAG_FRAG_EVERY_FRAME      (1 << 20)
+#define FF_MOV_FLAG_SKIP_SIDX             (1 << 21)
+#define FF_MOV_FLAG_CMAF                  (1 << 22)
+#define FF_MOV_FLAG_PREFER_ICC            (1 << 23)
 
 int ff_mov_write_packet(AVFormatContext *s, AVPacket *pkt);
 
diff --git a/libavformat/mp3dec.c b/libavformat/mp3dec.c
index ef88493..b044679 100644
--- a/libavformat/mp3dec.c
+++ b/libavformat/mp3dec.c
@@ -42,8 +42,6 @@
 
 #define XING_TOC_COUNT 100
 
-#define SAME_HEADER_MASK \
-   (0xffe00000 | (3 << 17) | (3 << 10) | (3 << 19))
 
 typedef struct {
     AVClass *class;
@@ -66,39 +64,53 @@
 
 /* mp3 read */
 
-static int mp3_read_probe(AVProbeData *p)
+static int mp3_read_probe(const AVProbeData *p)
 {
     int max_frames, first_frames = 0;
     int whole_used = 0;
     int frames, ret;
     int framesizes, max_framesizes;
     uint32_t header;
-    const uint8_t *buf, *buf0, *buf2, *end;
+    const uint8_t *buf, *buf0, *buf2, *buf3, *end;
 
     buf0 = p->buf;
     end = p->buf + p->buf_size - sizeof(uint32_t);
-    while(buf0 < end && !*buf0)
+    while (buf0 < end && !*buf0)
         buf0++;
 
     max_frames = 0;
     max_framesizes = 0;
     buf = buf0;
 
-    for(; buf < end; buf= buf2+1) {
+    for (; buf < end; buf = buf2+1) {
         buf2 = buf;
-        for(framesizes = frames = 0; buf2 < end; frames++) {
+        for (framesizes = frames = 0; buf2 < end; frames++) {
             MPADecodeHeader h;
+            int header_emu = 0;
+            int available;
 
             header = AV_RB32(buf2);
             ret = avpriv_mpegaudio_decode_header(&h, header);
             if (ret != 0)
                 break;
-            buf2 += h.frame_size;
+
+            available = FFMIN(h.frame_size, end - buf2);
+            for (buf3 = buf2 + 4; buf3 < buf2 + available; buf3++) {
+                uint32_t next_sync = AV_RB32(buf3);
+                header_emu += (next_sync & MP3_MASK) == (header & MP3_MASK);
+            }
+            if (header_emu > 2)
+                break;
             framesizes += h.frame_size;
+            if (available < h.frame_size) {
+                frames++;
+                break;
+            }
+            buf2 += h.frame_size;
         }
         max_frames = FFMAX(max_frames, frames);
         max_framesizes = FFMAX(max_framesizes, framesizes);
-        if(buf == buf0) {
+        if (buf == buf0) {
             first_frames= frames;
             if (buf2 == end + sizeof(uint32_t))
                 whole_used = 1;
@@ -107,14 +119,14 @@
     // keep this in sync with ac3 probe, both need to avoid
     // issues with MPEG-files!
     if   (first_frames>=7) return AVPROBE_SCORE_EXTENSION + 1;
-    else if(max_frames>200 && p->buf_size < 2*max_framesizes)return AVPROBE_SCORE_EXTENSION;
-    else if(max_frames>=4 && p->buf_size < 2*max_framesizes) return AVPROBE_SCORE_EXTENSION / 2;
-    else if(ff_id3v2_match(buf0, ID3v2_DEFAULT_MAGIC) && 2*ff_id3v2_tag_len(buf0) >= p->buf_size)
+    else if (max_frames>200 && p->buf_size < 2*max_framesizes)return AVPROBE_SCORE_EXTENSION;
+    else if (max_frames>=4 && p->buf_size < 2*max_framesizes) return AVPROBE_SCORE_EXTENSION / 2;
+    else if (ff_id3v2_match(buf0, ID3v2_DEFAULT_MAGIC) && 2*ff_id3v2_tag_len(buf0) >= p->buf_size)
                            return p->buf_size < PROBE_BUF_MAX ? AVPROBE_SCORE_EXTENSION / 4 : AVPROBE_SCORE_EXTENSION - 2;
-    else if(first_frames > 1 && whole_used) return 5;
-    else if(max_frames>=1 && p->buf_size < 10*max_framesizes) return 1;
+    else if (first_frames > 1 && whole_used) return 5;
+    else if (max_frames>=1 && p->buf_size < 10*max_framesizes) return 1;
     else                   return 0;
-//mpegps_mp3_unrecognized_format.mpg has max_frames=3
+    //mpegps_mp3_unrecognized_format.mpg has max_frames=3
 }
 
 static void read_xing_toc(AVFormatContext *s, int64_t filesize, int64_t duration)
@@ -235,8 +247,8 @@
     avio_r8(s->pb);
 
     /* Encoder delays */
-    v= avio_rb24(s->pb);
-    if(AV_RB32(version) == MKBETAG('L', 'A', 'M', 'E')
+    v = avio_rb24(s->pb);
+    if (AV_RB32(version) == MKBETAG('L', 'A', 'M', 'E')
         || AV_RB32(version) == MKBETAG('L', 'a', 'v', 'f')
         || AV_RB32(version) == MKBETAG('L', 'a', 'v', 'c')
     ) {
@@ -319,7 +331,7 @@
         return ret;
     else if (ret == 0)
         vbrtag_size = c.frame_size;
-    if(c.layer != 3)
+    if (c.layer != 3)
         return -1;
 
     spf = c.lsf ? 576 : 1152; /* Samples per frame, layer 3 */
@@ -374,7 +386,7 @@
     if (!av_dict_get(s->metadata, "", NULL, AV_DICT_IGNORE_SUFFIX))
         ff_id3v1_read(s);
 
-    if(s->pb->seekable & AVIO_SEEKABLE_NORMAL)
+    if (s->pb->seekable & AVIO_SEEKABLE_NORMAL)
         mp3->filesize = avio_size(s->pb);
 
     if (mp3_parse_vbr_tags(s, st, off) < 0)
@@ -398,7 +410,7 @@
             ffio_ensure_seekback(s->pb, i + 1024 + frame_size + 4);
             ret = check(s->pb, off + i + frame_size, &header2);
             if (ret >= 0 &&
-                (header & SAME_HEADER_MASK) == (header2 & SAME_HEADER_MASK))
+                (header & MP3_MASK) == (header2 & MP3_MASK))
             {
                 av_log(s, i > 0 ? AV_LOG_INFO : AV_LOG_VERBOSE, "Skipping %d bytes of junk at %"PRId64".\n", i, off);
                 ret = avio_seek(s->pb, off + i, SEEK_SET);
@@ -434,12 +446,12 @@
     int ret, size;
     int64_t pos;
 
-    size= MP3_PACKET_SIZE;
+    size = MP3_PACKET_SIZE;
     pos = avio_tell(s->pb);
-    if(mp3->filesize > ID3v1_TAG_SIZE && pos < mp3->filesize)
+    if (mp3->filesize > ID3v1_TAG_SIZE && pos < mp3->filesize)
         size= FFMIN(size, mp3->filesize - pos);
 
-    ret= av_get_packet(s->pb, pkt, size);
+    ret = av_get_packet(s->pb, pkt, size);
     if (ret <= 0) {
         if(ret<0)
             return ret;
@@ -494,7 +506,7 @@
 #define MIN_VALID 3
     best_pos = target_pos;
     best_score = 999;
-    for(i=0; i<SEEK_WINDOW; i++) {
+    for (i = 0; i < SEEK_WINDOW; i++) {
         int64_t pos = target_pos + (dir > 0 ? i - SEEK_WINDOW/4 : -i);
         int64_t candidate = -1;
         int score = 999;
@@ -502,9 +514,9 @@
         if (pos < 0)
             continue;
 
-        for(j=0; j<MIN_VALID; j++) {
+        for (j = 0; j < MIN_VALID; j++) {
             ret = check(s->pb, pos, NULL);
-            if(ret < 0) {
+            if (ret < 0) {
                 if (ret == CHECK_WRONG_HEADER) {
                     break;
                 } else if (ret == CHECK_SEEK_FAILED) {
diff --git a/libavformat/mp3enc.c b/libavformat/mp3enc.c
index dd662f5..34b753f 100644
--- a/libavformat/mp3enc.c
+++ b/libavformat/mp3enc.c
@@ -391,6 +391,7 @@
     uint16_t tag_crc;
     uint8_t *toc;
     int i, rg_size;
+    int64_t old_pos = avio_tell(s->pb);
 
     /* replace "Xing" identification string with "Info" for CBR files. */
     if (!mp3->has_variable_bitrate)
@@ -450,7 +451,7 @@
 
     avio_seek(s->pb,  mp3->xing_frame_offset, SEEK_SET);
     avio_write(s->pb, mp3->xing_frame, mp3->xing_frame_size);
-    avio_seek(s->pb, 0, SEEK_END);
+    avio_seek(s->pb, old_pos, SEEK_SET);
 }
 
 static int mp3_write_trailer(struct AVFormatContext *s)
@@ -472,8 +473,6 @@
     if (mp3->xing_offset)
         mp3_update_xing(s);
 
-    av_freep(&mp3->xing_frame);
-
     return 0;
 }
 
@@ -550,10 +549,10 @@
  * Write an ID3v2 header at beginning of stream
  */
 
-static int mp3_write_header(struct AVFormatContext *s)
+static int mp3_init(struct AVFormatContext *s)
 {
     MP3Context  *mp3 = s->priv_data;
-    int ret, i;
+    int i;
 
     if (mp3->id3v2_version      &&
         mp3->id3v2_version != 3 &&
@@ -592,6 +591,14 @@
         return AVERROR(EINVAL);
     }
 
+    return 0;
+}
+
+static int mp3_write_header(struct AVFormatContext *s)
+{
+    MP3Context  *mp3 = s->priv_data;
+    int ret;
+
     if (mp3->id3v2_version) {
         ff_id3v2_start(&mp3->id3, s->pb, mp3->id3v2_version, ID3v2_DEFAULT_MAGIC);
         ret = ff_id3v2_write_metadata(s, &mp3->id3);
@@ -608,6 +615,14 @@
     return 0;
 }
 
+static void mp3_deinit(struct AVFormatContext *s)
+{
+    MP3Context *mp3 = s->priv_data;
+
+    ff_packet_list_free(&mp3->queue, &mp3->queue_end);
+    av_freep(&mp3->xing_frame);
+}
+
 AVOutputFormat ff_mp3_muxer = {
     .name              = "mp3",
     .long_name         = NULL_IF_CONFIG_SMALL("MP3 (MPEG audio layer 3)"),
@@ -616,9 +631,11 @@
     .priv_data_size    = sizeof(MP3Context),
     .audio_codec       = AV_CODEC_ID_MP3,
     .video_codec       = AV_CODEC_ID_PNG,
+    .init              = mp3_init,
     .write_header      = mp3_write_header,
     .write_packet      = mp3_write_packet,
     .write_trailer     = mp3_write_trailer,
+    .deinit            = mp3_deinit,
     .query_codec       = query_codec,
     .flags             = AVFMT_NOTIMESTAMPS,
     .priv_class        = &mp3_muxer_class,
diff --git a/libavformat/mpc.c b/libavformat/mpc.c
index af33374..6a94b5d 100644
--- a/libavformat/mpc.c
+++ b/libavformat/mpc.c
@@ -45,7 +45,7 @@
     int frames_noted;
 } MPCContext;
 
-static int mpc_probe(AVProbeData *p)
+static int mpc_probe(const AVProbeData *p)
 {
     const uint8_t *d = p->buf;
     if (d[0] == 'M' && d[1] == 'P' && d[2] == '+' && (d[3] == 0x17 || d[3] == 0x7))
@@ -57,6 +57,7 @@
 {
     MPCContext *c = s->priv_data;
     AVStream *st;
+    int ret;
 
     if(avio_rl24(s->pb) != MKTAG('M', 'P', '+', 0)){
         av_log(s, AV_LOG_ERROR, "Not a Musepack file\n");
@@ -72,15 +73,6 @@
         av_log(s, AV_LOG_ERROR, "Too many frames, seeking is not possible\n");
         return AVERROR_INVALIDDATA;
     }
-    if(c->fcount){
-        c->frames = av_malloc(c->fcount * sizeof(MPCFrame));
-        if(!c->frames){
-            av_log(s, AV_LOG_ERROR, "Cannot allocate seektable\n");
-            return AVERROR(ENOMEM);
-        }
-    }else{
-        av_log(s, AV_LOG_WARNING, "Container reports no frames\n");
-    }
     c->curframe = 0;
     c->lastframe = -1;
     c->curbits = 8;
@@ -89,14 +81,26 @@
     st = avformat_new_stream(s, NULL);
     if (!st)
         return AVERROR(ENOMEM);
+
+    if (c->fcount) {
+        c->frames = av_malloc(c->fcount * sizeof(MPCFrame));
+        if (!c->frames) {
+            av_log(s, AV_LOG_ERROR, "Cannot allocate seektable\n");
+            return AVERROR(ENOMEM);
+        }
+        st->priv_data = c->frames;
+    } else {
+        av_log(s, AV_LOG_WARNING, "Container reports no frames\n");
+    }
+
     st->codecpar->codec_type = AVMEDIA_TYPE_AUDIO;
     st->codecpar->codec_id = AV_CODEC_ID_MUSEPACK7;
     st->codecpar->channels = 2;
     st->codecpar->channel_layout = AV_CH_LAYOUT_STEREO;
     st->codecpar->bits_per_coded_sample = 16;
 
-    if (ff_get_extradata(s, st->codecpar, s->pb, 16) < 0)
-        return AVERROR(ENOMEM);
+    if ((ret = ff_get_extradata(s, st->codecpar, s->pb, 16)) < 0)
+        return ret;
     st->codecpar->sample_rate = mpc_rate[st->codecpar->extradata[2] & 3];
     avpriv_set_pts_info(st, 32, MPC_FRAMESIZE, st->codecpar->sample_rate);
     /* scan for seekpoints */
@@ -166,7 +170,6 @@
     if(c->curbits)
         avio_seek(s->pb, -4, SEEK_CUR);
     if(ret < size){
-        av_packet_unref(pkt);
         return ret < 0 ? ret : AVERROR(EIO);
     }
     pkt->size = ret + 4;
@@ -174,14 +177,6 @@
     return 0;
 }
 
-static int mpc_read_close(AVFormatContext *s)
-{
-    MPCContext *c = s->priv_data;
-
-    av_freep(&c->frames);
-    return 0;
-}
-
 /**
  * Seek to the given position
  * If position is unknown but is within the limits of file
@@ -230,7 +225,6 @@
     .read_probe     = mpc_probe,
     .read_header    = mpc_read_header,
     .read_packet    = mpc_read_packet,
-    .read_close     = mpc_read_close,
     .read_seek      = mpc_read_seek,
     .extensions     = "mpc",
 };
diff --git a/libavformat/mpc8.c b/libavformat/mpc8.c
index 79e5f6a..dd13bbd 100644
--- a/libavformat/mpc8.c
+++ b/libavformat/mpc8.c
@@ -73,7 +73,7 @@
     return v - br;
 }
 
-static int mpc8_probe(AVProbeData *p)
+static int mpc8_probe(const AVProbeData *p)
 {
     const uint8_t *bs = p->buf + 4;
     const uint8_t *bs_end = bs + p->buf_size;
@@ -168,6 +168,7 @@
     size = gb_get_v(&gb);
     if(size > UINT_MAX/4 || size > c->samples/1152){
         av_log(s, AV_LOG_ERROR, "Seek table is too big\n");
+        av_free(buf);
         return;
     }
     seekd = get_bits(&gb, 4);
@@ -211,7 +212,7 @@
     MPCContext *c = s->priv_data;
     AVIOContext *pb = s->pb;
     AVStream *st;
-    int tag = 0;
+    int tag = 0, ret;
     int64_t size, pos;
 
     c->header_pos = avio_tell(pb);
@@ -252,8 +253,8 @@
     st->codecpar->codec_id = AV_CODEC_ID_MUSEPACK8;
     st->codecpar->bits_per_coded_sample = 16;
 
-    if (ff_get_extradata(s, st->codecpar, pb, 2) < 0)
-        return AVERROR(ENOMEM);
+    if ((ret = ff_get_extradata(s, st->codecpar, pb, 2)) < 0)
+        return ret;
 
     st->codecpar->channels = (st->codecpar->extradata[1] >> 4) + 1;
     st->codecpar->sample_rate = mpc8_rate[st->codecpar->extradata[0] >> 5];
@@ -276,7 +277,7 @@
 static int mpc8_read_packet(AVFormatContext *s, AVPacket *pkt)
 {
     MPCContext *c = s->priv_data;
-    int tag;
+    int tag, ret;
     int64_t pos, size;
 
     while(!avio_feof(s->pb)){
@@ -290,8 +291,8 @@
         if (size < 0)
             return -1;
         if(tag == TAG_AUDIOPACKET){
-            if(av_get_packet(s->pb, pkt, size) < 0)
-                return AVERROR(ENOMEM);
+            if ((ret = av_get_packet(s->pb, pkt, size)) < 0)
+                return ret;
             pkt->stream_index = 0;
             pkt->duration     = 1;
             return 0;
diff --git a/libavformat/mpeg.c b/libavformat/mpeg.c
index d4369b4..33c0398 100644
--- a/libavformat/mpeg.c
+++ b/libavformat/mpeg.c
@@ -24,14 +24,6 @@
 #include "internal.h"
 #include "mpeg.h"
 
-#if CONFIG_VOBSUB_DEMUXER
-# include "subtitles.h"
-# include "libavutil/bprint.h"
-# include "libavutil/opt.h"
-#endif
-
-#include "libavutil/avassert.h"
-
 /*********************************************/
 /* demux code */
 
@@ -64,7 +56,7 @@
     return (buf[1] & 0xC0) == 0x40 || (buf[1] & 0xF0) == 0x20;
 }
 
-static int mpegps_probe(AVProbeData *p)
+static int mpegps_probe(const AVProbeData *p)
 {
     uint32_t code = -1;
     int i;
@@ -123,18 +115,12 @@
 }
 
 typedef struct MpegDemuxContext {
-    AVClass *class;
     int32_t header_state;
     unsigned char psm_es_type[256];
     int sofdec;
     int dvd;
     int imkh_cctv;
     int raw_ac3;
-#if CONFIG_VOBSUB_DEMUXER
-    AVFormatContext *sub_ctx;
-    FFDemuxSubtitlesQueue q[32];
-    char *sub_name;
-#endif
 } MpegDemuxContext;
 
 static int mpegps_read_header(AVFormatContext *s)
@@ -489,7 +475,7 @@
     MpegDemuxContext *m = s->priv_data;
     AVStream *st;
     int len, startcode, i, es_type, ret;
-    int lpcm_header_len = -1; //Init to suppress warning
+    int pcm_dvd = 0;
     int request_probe= 0;
     enum AVCodecID codec_id = AV_CODEC_ID_NONE;
     enum AVMediaType type;
@@ -506,13 +492,18 @@
 
         if (!m->raw_ac3) {
             /* audio: skip header */
-            avio_r8(s->pb);
-            lpcm_header_len = avio_rb16(s->pb);
+            avio_skip(s->pb, 3);
             len -= 3;
             if (startcode >= 0xb0 && startcode <= 0xbf) {
                 /* MLP/TrueHD audio has a 4-byte header */
                 avio_r8(s->pb);
                 len--;
+            } else if (startcode >= 0xa0 && startcode <= 0xaf) {
+                ret = ffio_ensure_seekback(s->pb, 3);
+                if (ret < 0)
+                    return ret;
+                pcm_dvd = (avio_rb24(s->pb) & 0xFF) == 0x80;
+                avio_skip(s->pb, -3);
             }
         }
     }
@@ -525,34 +516,34 @@
     }
 
     es_type = m->psm_es_type[startcode & 0xff];
-        if (es_type == STREAM_TYPE_VIDEO_MPEG1) {
-            codec_id = AV_CODEC_ID_MPEG2VIDEO;
-            type     = AVMEDIA_TYPE_VIDEO;
-        } else if (es_type == STREAM_TYPE_VIDEO_MPEG2) {
-            codec_id = AV_CODEC_ID_MPEG2VIDEO;
-            type     = AVMEDIA_TYPE_VIDEO;
-        } else if (es_type == STREAM_TYPE_AUDIO_MPEG1 ||
-                   es_type == STREAM_TYPE_AUDIO_MPEG2) {
-            codec_id = AV_CODEC_ID_MP3;
-            type     = AVMEDIA_TYPE_AUDIO;
-        } else if (es_type == STREAM_TYPE_AUDIO_AAC) {
-            codec_id = AV_CODEC_ID_AAC;
-            type     = AVMEDIA_TYPE_AUDIO;
-        } else if (es_type == STREAM_TYPE_VIDEO_MPEG4) {
-            codec_id = AV_CODEC_ID_MPEG4;
-            type     = AVMEDIA_TYPE_VIDEO;
-        } else if (es_type == STREAM_TYPE_VIDEO_H264) {
-            codec_id = AV_CODEC_ID_H264;
-            type     = AVMEDIA_TYPE_VIDEO;
-        } else if (es_type == STREAM_TYPE_VIDEO_HEVC) {
-            codec_id = AV_CODEC_ID_HEVC;
-            type     = AVMEDIA_TYPE_VIDEO;
-        } else if (es_type == STREAM_TYPE_AUDIO_AC3) {
-            codec_id = AV_CODEC_ID_AC3;
-            type     = AVMEDIA_TYPE_AUDIO;
-        } else if (m->imkh_cctv && es_type == 0x91) {
-            codec_id = AV_CODEC_ID_PCM_MULAW;
-            type     = AVMEDIA_TYPE_AUDIO;
+    if (es_type == STREAM_TYPE_VIDEO_MPEG1) {
+        codec_id = AV_CODEC_ID_MPEG2VIDEO;
+        type     = AVMEDIA_TYPE_VIDEO;
+    } else if (es_type == STREAM_TYPE_VIDEO_MPEG2) {
+        codec_id = AV_CODEC_ID_MPEG2VIDEO;
+        type     = AVMEDIA_TYPE_VIDEO;
+    } else if (es_type == STREAM_TYPE_AUDIO_MPEG1 ||
+               es_type == STREAM_TYPE_AUDIO_MPEG2) {
+        codec_id = AV_CODEC_ID_MP3;
+        type     = AVMEDIA_TYPE_AUDIO;
+    } else if (es_type == STREAM_TYPE_AUDIO_AAC) {
+        codec_id = AV_CODEC_ID_AAC;
+        type     = AVMEDIA_TYPE_AUDIO;
+    } else if (es_type == STREAM_TYPE_VIDEO_MPEG4) {
+        codec_id = AV_CODEC_ID_MPEG4;
+        type     = AVMEDIA_TYPE_VIDEO;
+    } else if (es_type == STREAM_TYPE_VIDEO_H264) {
+        codec_id = AV_CODEC_ID_H264;
+        type     = AVMEDIA_TYPE_VIDEO;
+    } else if (es_type == STREAM_TYPE_VIDEO_HEVC) {
+        codec_id = AV_CODEC_ID_HEVC;
+        type     = AVMEDIA_TYPE_VIDEO;
+    } else if (es_type == STREAM_TYPE_AUDIO_AC3) {
+        codec_id = AV_CODEC_ID_AC3;
+        type     = AVMEDIA_TYPE_AUDIO;
+    } else if (m->imkh_cctv && es_type == 0x91) {
+        codec_id = AV_CODEC_ID_PCM_MULAW;
+        type     = AVMEDIA_TYPE_AUDIO;
     } else if (startcode >= 0x1e0 && startcode <= 0x1ef) {
         static const unsigned char avs_seqh[4] = { 0, 0, 1, 0xb0 };
         unsigned char buf[8];
@@ -591,7 +582,7 @@
         codec_id = AV_CODEC_ID_DTS;
     } else if (startcode >= 0xa0 && startcode <= 0xaf) {
         type     = AVMEDIA_TYPE_AUDIO;
-        if (lpcm_header_len >= 6 && startcode == 0xa1) {
+        if (!pcm_dvd) {
             codec_id = AV_CODEC_ID_MLP;
         } else {
             codec_id = AV_CODEC_ID_PCM_DVD;
@@ -700,36 +691,58 @@
 
 #if CONFIG_VOBSUB_DEMUXER
 
+#include "subtitles.h"
+#include "libavutil/avassert.h"
+#include "libavutil/bprint.h"
+#include "libavutil/opt.h"
+
 #define REF_STRING "# VobSub index file,"
 #define MAX_LINE_SIZE 2048
 
-static int vobsub_probe(AVProbeData *p)
+typedef struct VobSubDemuxContext {
+    const AVClass *class;
+    AVFormatContext *sub_ctx;
+    FFDemuxSubtitlesQueue q[32];
+    char *sub_name;
+} VobSubDemuxContext;
+
+static int vobsub_probe(const AVProbeData *p)
 {
     if (!strncmp(p->buf, REF_STRING, sizeof(REF_STRING) - 1))
         return AVPROBE_SCORE_MAX;
     return 0;
 }
 
+static int vobsub_read_close(AVFormatContext *s)
+{
+    VobSubDemuxContext *vobsub = s->priv_data;
+    int i;
+
+    for (i = 0; i < s->nb_streams; i++)
+        ff_subtitles_queue_clean(&vobsub->q[i]);
+    if (vobsub->sub_ctx)
+        avformat_close_input(&vobsub->sub_ctx);
+    return 0;
+}
+
 static int vobsub_read_header(AVFormatContext *s)
 {
     int i, ret = 0, header_parsed = 0, langidx = 0;
-    MpegDemuxContext *vobsub = s->priv_data;
+    VobSubDemuxContext *vobsub = s->priv_data;
     size_t fname_len;
-    char *header_str;
     AVBPrint header;
     int64_t delay = 0;
     AVStream *st = NULL;
     int stream_id = -1;
     char id[64] = {0};
     char alt[MAX_LINE_SIZE] = {0};
-    AVInputFormat *iformat;
+    ff_const59 AVInputFormat *iformat;
 
     if (!vobsub->sub_name) {
         char *ext;
         vobsub->sub_name = av_strdup(s->url);
         if (!vobsub->sub_name) {
-            ret = AVERROR(ENOMEM);
-            goto end;
+            return AVERROR(ENOMEM);
         }
 
         fname_len = strlen(vobsub->sub_name);
@@ -737,24 +750,23 @@
         if (fname_len < 4 || *(ext - 1) != '.') {
             av_log(s, AV_LOG_ERROR, "The input index filename is too short "
                    "to guess the associated .SUB file\n");
-            ret = AVERROR_INVALIDDATA;
-            goto end;
+            return AVERROR_INVALIDDATA;
         }
         memcpy(ext, !strncmp(ext, "IDX", 3) ? "SUB" : "sub", 3);
         av_log(s, AV_LOG_VERBOSE, "IDX/SUB: %s -> %s\n", s->url, vobsub->sub_name);
     }
 
     if (!(iformat = av_find_input_format("mpeg"))) {
-        ret = AVERROR_DEMUXER_NOT_FOUND;
-        goto end;
+        return AVERROR_DEMUXER_NOT_FOUND;
     }
 
     vobsub->sub_ctx = avformat_alloc_context();
     if (!vobsub->sub_ctx) {
-        ret = AVERROR(ENOMEM);
-        goto end;
+        return AVERROR(ENOMEM);
     }
 
+    av_bprint_init(&header, 0, INT_MAX - AV_INPUT_BUFFER_PADDING_SIZE);
+
     if ((ret = ff_copy_whiteblacklists(vobsub->sub_ctx, s)) < 0)
         goto end;
 
@@ -764,7 +776,6 @@
         goto end;
     }
 
-    av_bprint_init(&header, 0, AV_BPRINT_SIZE_UNLIMITED);
     while (!avio_feof(s->pb)) {
         char line[MAX_LINE_SIZE];
         int len = ff_get_line(s->pb, line, sizeof(line));
@@ -885,29 +896,30 @@
     }
 
     if (!av_bprint_is_complete(&header)) {
-        av_bprint_finalize(&header, NULL);
         ret = AVERROR(ENOMEM);
         goto end;
     }
-    av_bprint_finalize(&header, &header_str);
     for (i = 0; i < s->nb_streams; i++) {
-        AVStream *sub_st = s->streams[i];
-        sub_st->codecpar->extradata      = av_strdup(header_str);
-        sub_st->codecpar->extradata_size = header.len;
+        AVCodecParameters *par = s->streams[i]->codecpar;
+        ret = ff_alloc_extradata(par, header.len);
+        if (ret < 0) {
+            goto end;
+        }
+        memcpy(par->extradata, header.str, header.len);
     }
-    av_free(header_str);
-
 end:
+    if (ret < 0)
+        vobsub_read_close(s);
+    av_bprint_finalize(&header, NULL);
     return ret;
 }
 
 static int vobsub_read_packet(AVFormatContext *s, AVPacket *pkt)
 {
-    MpegDemuxContext *vobsub = s->priv_data;
+    VobSubDemuxContext *vobsub = s->priv_data;
     FFDemuxSubtitlesQueue *q;
     AVIOContext *pb = vobsub->sub_ctx->pb;
     int ret, psize, total_read = 0, i;
-    AVPacket idx_pkt = { 0 };
 
     int64_t min_ts = INT64_MAX;
     int sid = 0;
@@ -915,6 +927,10 @@
         FFDemuxSubtitlesQueue *tmpq = &vobsub->q[i];
         int64_t ts;
         av_assert0(tmpq->nb_subs);
+
+        if (tmpq->current_sub_idx >= tmpq->nb_subs)
+            continue;
+
         ts = tmpq->subs[tmpq->current_sub_idx].pts;
         if (ts < min_ts) {
             min_ts = ts;
@@ -922,24 +938,22 @@
         }
     }
     q = &vobsub->q[sid];
-    ret = ff_subtitles_queue_read_packet(q, &idx_pkt);
+    /* The returned packet will have size zero,
+     * so that it can be directly used with av_grow_packet. */
+    ret = ff_subtitles_queue_read_packet(q, pkt);
     if (ret < 0)
         return ret;
 
     /* compute maximum packet size using the next packet position. This is
      * useful when the len in the header is non-sense */
     if (q->current_sub_idx < q->nb_subs) {
-        psize = q->subs[q->current_sub_idx].pos - idx_pkt.pos;
+        psize = q->subs[q->current_sub_idx].pos - pkt->pos;
     } else {
         int64_t fsize = avio_size(pb);
-        psize = fsize < 0 ? 0xffff : fsize - idx_pkt.pos;
+        psize = fsize < 0 ? 0xffff : fsize - pkt->pos;
     }
 
-    avio_seek(pb, idx_pkt.pos, SEEK_SET);
-
-    av_init_packet(pkt);
-    pkt->size = 0;
-    pkt->data = NULL;
+    avio_seek(pb, pkt->pos, SEEK_SET);
 
     do {
         int n, to_read, startcode;
@@ -951,7 +965,7 @@
         if (ret < 0) {
             if (pkt->size) // raise packet even if incomplete
                 break;
-            goto fail;
+            return ret;
         }
         to_read = ret & 0xffff;
         new_pos = avio_tell(pb);
@@ -963,35 +977,25 @@
         total_read += pkt_size;
 
         /* the current chunk doesn't match the stream index (unlikely) */
-        if ((startcode & 0x1f) != s->streams[idx_pkt.stream_index]->id)
+        if ((startcode & 0x1f) != s->streams[pkt->stream_index]->id)
             break;
 
         ret = av_grow_packet(pkt, to_read);
         if (ret < 0)
-            goto fail;
+            return ret;
 
         n = avio_read(pb, pkt->data + (pkt->size - to_read), to_read);
         if (n < to_read)
             pkt->size -= to_read - n;
     } while (total_read < psize);
 
-    pkt->pts = pkt->dts = idx_pkt.pts;
-    pkt->pos = idx_pkt.pos;
-    pkt->stream_index = idx_pkt.stream_index;
-
-    av_packet_unref(&idx_pkt);
     return 0;
-
-fail:
-    av_packet_unref(pkt);
-    av_packet_unref(&idx_pkt);
-    return ret;
 }
 
 static int vobsub_read_seek(AVFormatContext *s, int stream_index,
                             int64_t min_ts, int64_t ts, int64_t max_ts, int flags)
 {
-    MpegDemuxContext *vobsub = s->priv_data;
+    VobSubDemuxContext *vobsub = s->priv_data;
 
     /* Rescale requested timestamps based on the first stream (timebase is the
      * same for all subtitles stream within a .idx/.sub). Rescaling is done just
@@ -1021,20 +1025,8 @@
                                    min_ts, ts, max_ts, flags);
 }
 
-static int vobsub_read_close(AVFormatContext *s)
-{
-    int i;
-    MpegDemuxContext *vobsub = s->priv_data;
-
-    for (i = 0; i < s->nb_streams; i++)
-        ff_subtitles_queue_clean(&vobsub->q[i]);
-    if (vobsub->sub_ctx)
-        avformat_close_input(&vobsub->sub_ctx);
-    return 0;
-}
-
 static const AVOption options[] = {
-    { "sub_name", "URI for .sub file", offsetof(MpegDemuxContext, sub_name), AV_OPT_TYPE_STRING, { .str = NULL }, 0, 0, AV_OPT_FLAG_DECODING_PARAM },
+    { "sub_name", "URI for .sub file", offsetof(VobSubDemuxContext, sub_name), AV_OPT_TYPE_STRING, { .str = NULL }, 0, 0, AV_OPT_FLAG_DECODING_PARAM },
     { NULL }
 };
 
@@ -1048,7 +1040,7 @@
 AVInputFormat ff_vobsub_demuxer = {
     .name           = "vobsub",
     .long_name      = NULL_IF_CONFIG_SMALL("VobSub subtitle format"),
-    .priv_data_size = sizeof(MpegDemuxContext),
+    .priv_data_size = sizeof(VobSubDemuxContext),
     .read_probe     = vobsub_probe,
     .read_header    = vobsub_read_header,
     .read_packet    = vobsub_read_packet,
diff --git a/libavformat/mpegenc.c b/libavformat/mpegenc.c
index 4c6fa67..669ff9d 100644
--- a/libavformat/mpegenc.c
+++ b/libavformat/mpegenc.c
@@ -315,7 +315,7 @@
         if (ctx->packet_size < 20 || ctx->packet_size > (1 << 23) + 10) {
             av_log(ctx, AV_LOG_ERROR, "Invalid packet size %d\n",
                    ctx->packet_size);
-            goto fail;
+            return AVERROR(EINVAL);
         }
         s->packet_size = ctx->packet_size;
     } else
@@ -343,7 +343,7 @@
         st     = ctx->streams[i];
         stream = av_mallocz(sizeof(StreamInfo));
         if (!stream)
-            goto fail;
+            return AVERROR(ENOMEM);
         st->priv_data = stream;
 
         avpriv_set_pts_info(st, 64, 1, 90000);
@@ -364,12 +364,7 @@
                 stream->id = ac3_id++;
             } else if (st->codecpar->codec_id == AV_CODEC_ID_DTS) {
                 stream->id = dts_id++;
-            } else if (st->codecpar->codec_id == AV_CODEC_ID_PCM_S16BE ||
-                       st->codecpar->codec_id == AV_CODEC_ID_PCM_DVD) {
-                if (st->codecpar->bits_per_coded_sample != 16) {
-                    av_log(ctx, AV_LOG_ERROR, "Only 16 bit LPCM streams can be muxed.\n");
-                    goto fail;
-                }
+            } else if (st->codecpar->codec_id == AV_CODEC_ID_PCM_S16BE) {
                 stream->id = lpcm_id++;
                 for (j = 0; j < 4; j++) {
                     if (lpcm_freq_tab[j] == st->codecpar->sample_rate)
@@ -382,16 +377,46 @@
                     for (sr = 0; sr < 4; sr++)
                          av_log(ctx, AV_LOG_INFO, " %d", lpcm_freq_tab[sr]);
                     av_log(ctx, AV_LOG_INFO, "\n");
-                    goto fail;
+                    return AVERROR(EINVAL);
                 }
                 if (st->codecpar->channels > 8) {
                     av_log(ctx, AV_LOG_ERROR, "At most 8 channels allowed for LPCM streams.\n");
-                    goto fail;
+                    return AVERROR(EINVAL);
                 }
                 stream->lpcm_header[0] = 0x0c;
                 stream->lpcm_header[1] = (st->codecpar->channels - 1) | (j << 4);
                 stream->lpcm_header[2] = 0x80;
                 stream->lpcm_align     = st->codecpar->channels * 2;
+            } else if (st->codecpar->codec_id == AV_CODEC_ID_PCM_DVD) {
+                int freq;
+
+                switch (st->codecpar->sample_rate) {
+                case 48000: freq = 0; break;
+                case 96000: freq = 1; break;
+                case 44100: freq = 2; break;
+                case 32000: freq = 3; break;
+                default:
+                    av_log(ctx, AV_LOG_ERROR, "Unsupported sample rate.\n");
+                    return AVERROR(EINVAL);
+                }
+
+                stream->lpcm_header[0] = 0x0c;
+                stream->lpcm_header[1] = (freq << 4) |
+                                         (((st->codecpar->bits_per_coded_sample - 16) / 4) << 6) |
+                                         st->codecpar->channels - 1;
+                stream->lpcm_header[2] = 0x80;
+                stream->id = lpcm_id++;
+                stream->lpcm_align = st->codecpar->channels * st->codecpar->bits_per_coded_sample / 8;
+            } else if (st->codecpar->codec_id == AV_CODEC_ID_MLP ||
+                       st->codecpar->codec_id == AV_CODEC_ID_TRUEHD) {
+                       av_log(ctx, AV_LOG_ERROR, "Support for muxing audio codec %s not implemented.\n",
+                              avcodec_get_name(st->codecpar->codec_id));
+                       return AVERROR_PATCHWELCOME;
+            } else if (st->codecpar->codec_id != AV_CODEC_ID_MP1 &&
+                       st->codecpar->codec_id != AV_CODEC_ID_MP2 &&
+                       st->codecpar->codec_id != AV_CODEC_ID_MP3) {
+                       av_log(ctx, AV_LOG_ERROR, "Unsupported audio codec. Must be one of mp1, mp2, mp3, 16-bit pcm_dvd, pcm_s16be, ac3 or dts.\n");
+                       return AVERROR(EINVAL);
             } else {
                 stream->id = mpa_id++;
             }
@@ -435,7 +460,7 @@
         }
         stream->fifo = av_fifo_alloc(16);
         if (!stream->fifo)
-            goto fail;
+            return AVERROR(ENOMEM);
     }
     bitrate       = 0;
     audio_bitrate = 0;
@@ -535,11 +560,6 @@
     s->system_header_size = get_system_header_size(ctx);
     s->last_scr           = AV_NOPTS_VALUE;
     return 0;
-
-fail:
-    for (i = 0; i < ctx->nb_streams; i++)
-        av_freep(&ctx->streams[i]->priv_data);
-    return AVERROR(ENOMEM);
 }
 
 static inline void put_timestamp(AVIOContext *pb, int id, int64_t timestamp)
@@ -908,7 +928,7 @@
     for (i = 0; i < zero_trail_bytes; i++)
         avio_w8(ctx->pb, 0x00);
 
-    avio_flush(ctx->pb);
+    avio_write_marker(ctx->pb, AV_NOPTS_VALUE, AVIO_DATA_MARKER_FLUSH_POINT);
 
     s->packet_number++;
 
@@ -937,7 +957,7 @@
 
     s->vcd_padding_bytes_written += s->packet_size;
 
-    avio_flush(ctx->pb);
+    avio_write_marker(ctx->pb, AV_NOPTS_VALUE, AVIO_DATA_MARKER_FLUSH_POINT);
 
     /* increasing the packet number is correct. The SCR of the following packs
      * is calculated from the packet_number and it has to include the padding
@@ -1224,17 +1244,25 @@
      * it as it is usually not needed by decoders and because it
      * complicates MPEG stream concatenation. */
     // avio_wb32(ctx->pb, ISO_11172_END_CODE);
-    // avio_flush(ctx->pb);
 
     for (i = 0; i < ctx->nb_streams; i++) {
         stream = ctx->streams[i]->priv_data;
 
         av_assert0(av_fifo_size(stream->fifo) == 0);
-        av_fifo_freep(&stream->fifo);
     }
     return 0;
 }
 
+static void mpeg_mux_deinit(AVFormatContext *ctx)
+{
+    for (int i = 0; i < ctx->nb_streams; i++) {
+        StreamInfo *stream = ctx->streams[i]->priv_data;
+        if (!stream)
+            continue;
+        av_fifo_freep(&stream->fifo);
+    }
+}
+
 #define OFFSET(x) offsetof(MpegMuxContext, x)
 #define E AV_OPT_FLAG_ENCODING_PARAM
 static const AVOption options[] = {
@@ -1264,6 +1292,7 @@
     .write_header      = mpeg_mux_init,
     .write_packet      = mpeg_mux_write_packet,
     .write_trailer     = mpeg_mux_end,
+    .deinit            = mpeg_mux_deinit,
     .priv_class        = &mpeg_class,
 };
 #endif
@@ -1280,6 +1309,7 @@
     .write_header      = mpeg_mux_init,
     .write_packet      = mpeg_mux_write_packet,
     .write_trailer     = mpeg_mux_end,
+    .deinit            = mpeg_mux_deinit,
     .priv_class        = &vcd_class,
 };
 #endif
@@ -1297,6 +1327,7 @@
     .write_header      = mpeg_mux_init,
     .write_packet      = mpeg_mux_write_packet,
     .write_trailer     = mpeg_mux_end,
+    .deinit            = mpeg_mux_deinit,
     .priv_class        = &vob_class,
 };
 #endif
@@ -1315,6 +1346,7 @@
     .write_header      = mpeg_mux_init,
     .write_packet      = mpeg_mux_write_packet,
     .write_trailer     = mpeg_mux_end,
+    .deinit            = mpeg_mux_deinit,
     .priv_class        = &svcd_class,
 };
 #endif
@@ -1333,6 +1365,7 @@
     .write_header      = mpeg_mux_init,
     .write_packet      = mpeg_mux_write_packet,
     .write_trailer     = mpeg_mux_end,
+    .deinit            = mpeg_mux_deinit,
     .priv_class        = &dvd_class,
 };
 #endif
diff --git a/libavformat/mpegts.c b/libavformat/mpegts.c
index edf6b57..ff3898c 100644
--- a/libavformat/mpegts.c
+++ b/libavformat/mpegts.c
@@ -28,6 +28,7 @@
 #include "libavutil/mathematics.h"
 #include "libavutil/opt.h"
 #include "libavutil/avassert.h"
+#include "libavutil/dovi_meta.h"
 #include "libavcodec/bytestream.h"
 #include "libavcodec/get_bits.h"
 #include "libavcodec/opus.h"
@@ -37,6 +38,9 @@
 #include "avio_internal.h"
 #include "mpeg.h"
 #include "isom.h"
+#if CONFIG_ICONV
+#include <iconv.h>
+#endif
 
 /* maximum size in which we look for synchronization if
  * synchronization is lost */
@@ -53,6 +57,9 @@
         (prev_dividend) = (dividend);                                          \
     } while (0)
 
+#define PROBE_PACKET_MAX_BUF 8192
+#define PROBE_PACKET_MARGIN 5
+
 enum MpegTSFilterType {
     MPEGTS_PES,
     MPEGTS_SECTION,
@@ -91,6 +98,7 @@
     int es_id;
     int last_cc; /* last cc code (-1 if first packet) */
     int64_t last_pcr;
+    int discard;
     enum MpegTSFilterType type;
     union {
         MpegTSPESFilter pes_filter;
@@ -161,6 +169,9 @@
     /** filters for various streams specified by PMT + for the PAT and PMT */
     MpegTSFilter *pids[NB_PID_MAX];
     int current_pid;
+
+    AVStream *epg_stream;
+    AVBufferPool* pools[32];
 };
 
 #define MPEGTS_OPTIONS \
@@ -590,28 +601,42 @@
     return best_score - FFMAX(stat_all - 10*best_score, 0)/10;
 }
 
-/* autodetect fec presence. Must have at least 1024 bytes  */
-static int get_packet_size(const uint8_t *buf, int size)
+/* autodetect fec presence */
+static int get_packet_size(AVFormatContext* s)
 {
     int score, fec_score, dvhs_score;
+    int margin;
+    int ret;
 
-    if (size < (TS_FEC_PACKET_SIZE * 5 + 1))
-        return AVERROR_INVALIDDATA;
+    /*init buffer to store stream for probing */
+    uint8_t buf[PROBE_PACKET_MAX_BUF] = {0};
+    int buf_size = 0;
 
-    score      = analyze(buf, size, TS_PACKET_SIZE,      0);
-    dvhs_score = analyze(buf, size, TS_DVHS_PACKET_SIZE, 0);
-    fec_score  = analyze(buf, size, TS_FEC_PACKET_SIZE,  0);
-    av_log(NULL, AV_LOG_TRACE, "score: %d, dvhs_score: %d, fec_score: %d \n",
-            score, dvhs_score, fec_score);
+    while (buf_size < PROBE_PACKET_MAX_BUF) {
+        ret = avio_read_partial(s->pb, buf + buf_size, PROBE_PACKET_MAX_BUF - buf_size);
+        if (ret < 0)
+            return AVERROR_INVALIDDATA;
+        buf_size += ret;
 
-    if (score > fec_score && score > dvhs_score)
-        return TS_PACKET_SIZE;
-    else if (dvhs_score > score && dvhs_score > fec_score)
-        return TS_DVHS_PACKET_SIZE;
-    else if (score < fec_score && dvhs_score < fec_score)
-        return TS_FEC_PACKET_SIZE;
-    else
-        return AVERROR_INVALIDDATA;
+        score      = analyze(buf, buf_size, TS_PACKET_SIZE,      0);
+        dvhs_score = analyze(buf, buf_size, TS_DVHS_PACKET_SIZE, 0);
+        fec_score  = analyze(buf, buf_size, TS_FEC_PACKET_SIZE,  0);
+        av_log(s, AV_LOG_TRACE, "Probe: %d, score: %d, dvhs_score: %d, fec_score: %d \n",
+            buf_size, score, dvhs_score, fec_score);
+
+        margin = mid_pred(score, fec_score, dvhs_score);
+
+        if (buf_size < PROBE_PACKET_MAX_BUF)
+            margin += PROBE_PACKET_MARGIN; /*if buffer not filled */
+
+        if (score > margin)
+            return TS_PACKET_SIZE;
+        else if (dvhs_score > margin)
+            return TS_DVHS_PACKET_SIZE;
+        else if (fec_score > margin)
+            return TS_FEC_PACKET_SIZE;
+    }
+    return AVERROR_INVALIDDATA;
 }
 
 typedef struct SectionHeader {
@@ -673,6 +698,51 @@
         return NULL;
     if (len > p_end - p)
         return NULL;
+#if CONFIG_ICONV
+    if (len) {
+        const char *encodings[] = {
+            "ISO6937", "ISO-8859-5", "ISO-8859-6", "ISO-8859-7",
+            "ISO-8859-8", "ISO-8859-9", "ISO-8859-10", "ISO-8859-11",
+            "", "ISO-8859-13", "ISO-8859-14", "ISO-8859-15", "", "", "", "",
+            "", "UCS-2BE", "KSC_5601", "GB2312", "UCS-2BE", "UTF-8", "", "",
+            "", "", "", "", "", "", "", ""
+        };
+        iconv_t cd;
+        char *in, *out;
+        size_t inlen = len, outlen = inlen * 6 + 1;
+        if (len >= 3 && p[0] == 0x10 && !p[1] && p[2] && p[2] <= 0xf && p[2] != 0xc) {
+            char iso8859[12];
+            snprintf(iso8859, sizeof(iso8859), "ISO-8859-%d", p[2]);
+            inlen -= 3;
+            in = (char *)p + 3;
+            cd = iconv_open("UTF-8", iso8859);
+        } else if (p[0] < 0x20) {
+            inlen -= 1;
+            in = (char *)p + 1;
+            cd = iconv_open("UTF-8", encodings[*p]);
+        } else {
+            in = (char *)p;
+            cd = iconv_open("UTF-8", encodings[0]);
+        }
+        if (cd == (iconv_t)-1)
+            goto no_iconv;
+        str = out = av_malloc(outlen);
+        if (!str) {
+            iconv_close(cd);
+            return NULL;
+        }
+        if (iconv(cd, &in, &inlen, &out, &outlen) == -1) {
+            iconv_close(cd);
+            av_freep(&str);
+            goto no_iconv;
+        }
+        iconv_close(cd);
+        *out = 0;
+        *pp = p + len;
+        return str;
+    }
+no_iconv:
+#endif
     str = av_malloc(len + 1);
     if (!str)
         return NULL;
@@ -737,6 +807,7 @@
     { 0x24, AVMEDIA_TYPE_VIDEO, AV_CODEC_ID_HEVC       },
     { 0x42, AVMEDIA_TYPE_VIDEO, AV_CODEC_ID_CAVS       },
     { 0xd1, AVMEDIA_TYPE_VIDEO, AV_CODEC_ID_DIRAC      },
+    { 0xd2, AVMEDIA_TYPE_VIDEO, AV_CODEC_ID_AVS2       },
     { 0xea, AVMEDIA_TYPE_VIDEO, AV_CODEC_ID_VC1        },
     { 0 },
 };
@@ -918,7 +989,7 @@
 
 static int new_pes_packet(PESContext *pes, AVPacket *pkt)
 {
-    char *sd;
+    uint8_t *sd;
 
     av_init_packet(pkt);
 
@@ -1034,6 +1105,18 @@
     return (get_bits_count(&gb) + 7) >> 3;
 }
 
+static AVBufferRef *buffer_pool_get(MpegTSContext *ts, int size)
+{
+    int index = av_log2(size + AV_INPUT_BUFFER_PADDING_SIZE);
+    if (!ts->pools[index]) {
+        int pool_size = FFMIN(MAX_PES_PAYLOAD + AV_INPUT_BUFFER_PADDING_SIZE, 2 << index);
+        ts->pools[index] = av_buffer_pool_init(pool_size, NULL);
+        if (!ts->pools[index])
+            return NULL;
+    }
+    return av_buffer_pool_get(ts->pools[index]);
+}
+
 /* return non zero if a packet could be constructed */
 static int mpegts_push_data(MpegTSFilter *filter,
                             const uint8_t *buf, int buf_size, int is_start,
@@ -1108,8 +1191,7 @@
                         pes->total_size = MAX_PES_PAYLOAD;
 
                     /* allocate pes buffer */
-                    pes->buffer = av_buffer_alloc(pes->total_size +
-                                                  AV_INPUT_BUFFER_PADDING_SIZE);
+                    pes->buffer = buffer_pool_get(ts, pes->total_size);
                     if (!pes->buffer)
                         return AVERROR(ENOMEM);
 
@@ -1219,6 +1301,7 @@
                         || pes->st->codecpar->codec_id == AV_CODEC_ID_DVB_SUBTITLE)
                     ) {
                     AVProgram *p = NULL;
+                    int pcr_found = 0;
                     while ((p = av_find_program_from_stream(pes->stream, p, pes->st->index))) {
                         if (p->pcr_pid != -1 && p->discard != AVDISCARD_ALL) {
                             MpegTSFilter *f = pes->ts->pids[p->pcr_pid];
@@ -1236,14 +1319,17 @@
                                             st = pst;
                                     }
                                 }
-                                if (f->last_pcr != -1 && st && st->discard != AVDISCARD_ALL) {
+                                if (f->last_pcr != -1 && !f->discard) {
                                     // teletext packets do not always have correct timestamps,
                                     // the standard says they should be handled after 40.6 ms at most,
                                     // and the pcr error to this packet should be no more than 100 ms.
                                     // TODO: we should interpolate the PCR, not just use the last one
                                     int64_t pcr = f->last_pcr / 300;
-                                    pes->st->pts_wrap_reference = st->pts_wrap_reference;
-                                    pes->st->pts_wrap_behavior = st->pts_wrap_behavior;
+                                    pcr_found = 1;
+                                    if (st) {
+                                        pes->st->pts_wrap_reference = st->pts_wrap_reference;
+                                        pes->st->pts_wrap_behavior = st->pts_wrap_behavior;
+                                    }
                                     if (pes->dts == AV_NOPTS_VALUE || pes->dts < pcr) {
                                         pes->pts = pes->dts = pcr;
                                     } else if (pes->st->codecpar->codec_id == AV_CODEC_ID_DVB_TELETEXT &&
@@ -1258,6 +1344,15 @@
                             }
                         }
                     }
+
+                    if (!pcr_found) {
+                        av_log(pes->stream, AV_LOG_VERBOSE,
+                               "Forcing DTS/PTS to be unset for a "
+                               "non-trustworthy PES packet for PID %d as "
+                               "PCR hasn't been received yet.\n",
+                               pes->pid);
+                        pes->dts = pes->pts = AV_NOPTS_VALUE;
+                    }
                 }
             }
             break;
@@ -1269,8 +1364,7 @@
                     if (ret < 0)
                         return ret;
                     pes->total_size = MAX_PES_PAYLOAD;
-                    pes->buffer = av_buffer_alloc(pes->total_size +
-                                                  AV_INPUT_BUFFER_PADDING_SIZE);
+                    pes->buffer = buffer_pool_get(ts, pes->total_size);
                     if (!pes->buffer)
                         return AVERROR(ENOMEM);
                     ts->stop_parse = 1;
@@ -1646,6 +1740,13 @@
     if (idx < 0)
         return;
 
+    /**
+     * In case we receive an SCTE-35 packet before mpegts context is fully
+     * initialized.
+     */
+    if (!ts->pkt)
+        return;
+
     new_data_packet(section, section_len, ts->pkt);
     ts->pkt->stream_index = idx;
     prg = av_find_program_from_stream(ts->stream, NULL, idx);
@@ -1756,7 +1857,7 @@
     case 0x56: /* DVB teletext descriptor */
         {
             uint8_t *extradata = NULL;
-            int language_count = desc_len / 5;
+            int language_count = desc_len / 5, ret;
 
             if (desc_len > 0 && desc_len % 5 != 0)
                 return AVERROR_INVALIDDATA;
@@ -1766,9 +1867,9 @@
                 av_assert0(language_count <= sizeof(language) / 4);
 
                 if (st->codecpar->extradata == NULL) {
-                    if (ff_alloc_extradata(st->codecpar, language_count * 2)) {
-                        return AVERROR(ENOMEM);
-                    }
+                    ret = ff_alloc_extradata(st->codecpar, language_count * 2);
+                    if (ret < 0)
+                        return ret;
                 }
 
                 if (st->codecpar->extradata_size < language_count * 2)
@@ -1801,7 +1902,7 @@
              * subtitling_type (1 byte),
              * composition_page_id (2 bytes),
              * ancillary_page_id (2 bytes) */
-            int language_count = desc_len / 8;
+            int language_count = desc_len / 8, ret;
 
             if (desc_len > 0 && desc_len % 8 != 0)
                 return AVERROR_INVALIDDATA;
@@ -1817,9 +1918,9 @@
                 av_assert0(language_count <= sizeof(language) / 4);
 
                 if (st->codecpar->extradata == NULL) {
-                    if (ff_alloc_extradata(st->codecpar, language_count * 5)) {
-                        return AVERROR(ENOMEM);
-                    }
+                    ret = ff_alloc_extradata(st->codecpar, language_count * 5);
+                    if (ret < 0)
+                        return ret;
                 }
 
                 if (st->codecpar->extradata_size < language_count * 5)
@@ -2002,6 +2103,97 @@
             }
         }
         break;
+    case 0xfd: /* ARIB data coding type descriptor */
+        // STD-B24, fascicle 3, chapter 4 defines private_stream_1
+        // for captions
+        if (stream_type == STREAM_TYPE_PRIVATE_DATA) {
+            // This structure is defined in STD-B10, part 1, listing 5.4 and
+            // part 2, 6.2.20).
+            // Listing of data_component_ids is in STD-B10, part 2, Annex J.
+            // Component tag limits are documented in TR-B14, fascicle 2,
+            // Vol. 3, Section 2, 4.2.8.1
+            int actual_component_tag = st->stream_identifier - 1;
+            int picked_profile = FF_PROFILE_UNKNOWN;
+            int data_component_id = get16(pp, desc_end);
+            if (data_component_id < 0)
+                return AVERROR_INVALIDDATA;
+
+            switch (data_component_id) {
+            case 0x0008:
+                // [0x30..0x37] are component tags utilized for
+                // non-mobile captioning service ("profile A").
+                if (actual_component_tag >= 0x30 &&
+                    actual_component_tag <= 0x37) {
+                    picked_profile = FF_PROFILE_ARIB_PROFILE_A;
+                }
+                break;
+            case 0x0012:
+                // component tag 0x87 signifies a mobile/partial reception
+                // (1seg) captioning service ("profile C").
+                if (actual_component_tag == 0x87) {
+                    picked_profile = FF_PROFILE_ARIB_PROFILE_C;
+                }
+                break;
+            default:
+                break;
+            }
+
+            if (picked_profile == FF_PROFILE_UNKNOWN)
+                break;
+
+            st->codecpar->codec_type = AVMEDIA_TYPE_SUBTITLE;
+            st->codecpar->codec_id   = AV_CODEC_ID_ARIB_CAPTION;
+            st->codecpar->profile    = picked_profile;
+            st->request_probe        = 0;
+        }
+        break;
+    case 0xb0: /* DOVI video stream descriptor */
+        {
+            uint32_t buf;
+            AVDOVIDecoderConfigurationRecord *dovi;
+            size_t dovi_size;
+            int ret;
+            if (desc_end - *pp < 4) // (8 + 8 + 7 + 6 + 1 + 1 + 1) / 8
+                return AVERROR_INVALIDDATA;
+
+            dovi = av_dovi_alloc(&dovi_size);
+            if (!dovi)
+                return AVERROR(ENOMEM);
+
+            dovi->dv_version_major = get8(pp, desc_end);
+            dovi->dv_version_minor = get8(pp, desc_end);
+            buf = get16(pp, desc_end);
+            dovi->dv_profile        = (buf >> 9) & 0x7f;    // 7 bits
+            dovi->dv_level          = (buf >> 3) & 0x3f;    // 6 bits
+            dovi->rpu_present_flag  = (buf >> 2) & 0x01;    // 1 bit
+            dovi->el_present_flag   = (buf >> 1) & 0x01;    // 1 bit
+            dovi->bl_present_flag   =  buf       & 0x01;    // 1 bit
+            if (desc_end - *pp >= 20) {  // 4 + 4 * 4
+                buf = get8(pp, desc_end);
+                dovi->dv_bl_signal_compatibility_id = (buf >> 4) & 0x0f; // 4 bits
+            } else {
+                // 0 stands for None
+                // Dolby Vision V1.2.93 profiles and levels
+                dovi->dv_bl_signal_compatibility_id = 0;
+            }
+
+            ret = av_stream_add_side_data(st, AV_PKT_DATA_DOVI_CONF,
+                                          (uint8_t *)dovi, dovi_size);
+            if (ret < 0) {
+                av_freep(dovi);
+                return ret;
+            }
+
+            av_log(fc, AV_LOG_TRACE, "DOVI, version: %d.%d, profile: %d, level: %d, "
+                   "rpu flag: %d, el flag: %d, bl flag: %d, compatibility id: %d\n",
+                   dovi->dv_version_major, dovi->dv_version_minor,
+                   dovi->dv_profile, dovi->dv_level,
+                   dovi->rpu_present_flag,
+                   dovi->el_present_flag,
+                   dovi->bl_present_flag,
+                   dovi->dv_bl_signal_compatibility_id);
+        }
+        break;
     default:
         break;
     }
@@ -2009,7 +2201,7 @@
     return 0;
 }
 
-static AVStream *find_matching_stream(MpegTSContext *ts, int pid,
+static AVStream *find_matching_stream(MpegTSContext *ts, int pid, unsigned int programid,
                                       int stream_identifier, int pmt_stream_idx)
 {
     AVFormatContext *s = ts->stream;
@@ -2018,6 +2210,8 @@
 
     for (i = 0; i < s->nb_streams; i++) {
         AVStream *st = s->streams[i];
+        if (st->program_num != programid)
+            continue;
         if (stream_identifier != -1) { /* match based on "stream identifier descriptor" if present */
             if (st->stream_identifier == stream_identifier+1) {
                 found = st;
@@ -2188,7 +2382,7 @@
         if (ts->pids[pid] && ts->pids[pid]->type == MPEGTS_PES) {
             pes = ts->pids[pid]->u.pes_filter.opaque;
             if (ts->merge_pmt_versions && !pes->st) {
-                st = find_matching_stream(ts, pid, stream_identifier, i);
+                st = find_matching_stream(ts, pid, h->id, stream_identifier, i);
                 if (st) {
                     pes->st = st;
                     pes->stream_type = stream_type;
@@ -2210,7 +2404,7 @@
                 mpegts_close_filter(ts, ts->pids[pid]); // wrongly added sdt filter probably
             pes = add_pes_stream(ts, pid, pcr_pid);
             if (ts->merge_pmt_versions && pes && !pes->st) {
-                st = find_matching_stream(ts, pid, stream_identifier, i);
+                st = find_matching_stream(ts, pid, h->id, stream_identifier, i);
                 if (st) {
                     pes->st = st;
                     pes->stream_type = stream_type;
@@ -2232,7 +2426,7 @@
                 st = ts->stream->streams[idx];
             }
             if (ts->merge_pmt_versions && !st) {
-                st = find_matching_stream(ts, pid, stream_identifier, i);
+                st = find_matching_stream(ts, pid, h->id, stream_identifier, i);
             }
             if (!st) {
                 st = avformat_new_stream(ts->stream, NULL);
@@ -2366,6 +2560,60 @@
     }
 }
 
+static void eit_cb(MpegTSFilter *filter, const uint8_t *section, int section_len)
+{
+    MpegTSContext *ts = filter->u.section_filter.opaque;
+    const uint8_t *p, *p_end;
+    SectionHeader h1, *h = &h1;
+
+    /*
+     * Sometimes we receive EPG packets but SDT table do not have
+     * eit_pres_following or eit_sched turned on, so we open EPG
+     * stream directly here.
+     */
+    if (!ts->epg_stream) {
+        ts->epg_stream = avformat_new_stream(ts->stream, NULL);
+        if (!ts->epg_stream)
+            return;
+        ts->epg_stream->id = EIT_PID;
+        ts->epg_stream->codecpar->codec_type = AVMEDIA_TYPE_DATA;
+        ts->epg_stream->codecpar->codec_id = AV_CODEC_ID_EPG;
+    }
+
+    if (ts->epg_stream->discard == AVDISCARD_ALL)
+        return;
+
+    p_end = section + section_len - 4;
+    p     = section;
+
+    if (parse_section_header(h, &p, p_end) < 0)
+        return;
+    if (h->tid < EIT_TID || h->tid > OEITS_END_TID)
+        return;
+
+    av_log(ts->stream, AV_LOG_TRACE, "EIT: tid received = %.02x\n", h->tid);
+
+    /**
+     * Service_id 0xFFFF is reserved, it indicates that the current EIT table
+     * is scrambled.
+     */
+    if (h->id == 0xFFFF) {
+        av_log(ts->stream, AV_LOG_TRACE, "Scrambled EIT table received.\n");
+        return;
+    }
+
+    /**
+     * In case we receive an EPG packet before mpegts context is fully
+     * initialized.
+     */
+    if (!ts->pkt)
+        return;
+
+    new_data_packet(section, section_len, ts->pkt);
+    ts->pkt->stream_index = ts->epg_stream->index;
+    ts->stop_parse = 1;
+}
+
 static void sdt_cb(MpegTSFilter *filter, const uint8_t *section, int section_len)
 {
     MpegTSContext *ts = filter->u.section_filter.opaque;
@@ -2454,17 +2702,14 @@
                      const uint8_t *packet);
 
 /* handle one TS packet */
-static int handle_packet(MpegTSContext *ts, const uint8_t *packet)
+static int handle_packet(MpegTSContext *ts, const uint8_t *packet, int64_t pos)
 {
     MpegTSFilter *tss;
     int len, pid, cc, expected_cc, cc_ok, afc, is_start, is_discontinuity,
         has_adaptation, has_payload;
     const uint8_t *p, *p_end;
-    int64_t pos;
 
     pid = AV_RB16(packet + 1) & 0x1fff;
-    if (pid && discard_pid(ts, pid))
-        return 0;
     is_start = packet[1] & 0x40;
     tss = ts->pids[pid];
     if (ts->auto_guess && !tss && is_start) {
@@ -2473,6 +2718,10 @@
     }
     if (!tss)
         return 0;
+    if (is_start)
+        tss->discard = discard_pid(ts, pid);
+    if (tss->discard)
+        return 0;
     ts->current_pid = pid;
 
     afc = (packet[3] >> 4) & 3;
@@ -2525,7 +2774,6 @@
     if (p >= p_end || !has_payload)
         return 0;
 
-    pos = avio_tell(ts->stream->pb);
     if (pos >= 0) {
         av_assert0(pos >= TS_PACKET_SIZE);
         ts->pos47_full = pos - TS_PACKET_SIZE;
@@ -2736,7 +2984,7 @@
         ret = read_packet(s, packet, ts->raw_packet_size, &data);
         if (ret != 0)
             break;
-        ret = handle_packet(ts, data);
+        ret = handle_packet(ts, data, avio_tell(s->pb));
         finished_reading_packet(s, ts->raw_packet_size);
         if (ret != 0)
             break;
@@ -2745,7 +2993,7 @@
     return ret;
 }
 
-static int mpegts_probe(AVProbeData *p)
+static int mpegts_probe(const AVProbeData *p)
 {
     const int size = p->buf_size;
     int maxscore = 0;
@@ -2827,8 +3075,6 @@
 {
     MpegTSContext *ts = s->priv_data;
     AVIOContext *pb   = s->pb;
-    uint8_t buf[8 * 1024] = {0};
-    int len;
     int64_t pos, probesize = s->probesize;
 
     s->internal->prefer_codec_framerate = 1;
@@ -2836,10 +3082,8 @@
     if (ffio_ensure_seekback(pb, probesize) < 0)
         av_log(s, AV_LOG_WARNING, "Failed to allocate buffers for seekback\n");
 
-    /* read the first 8192 bytes to get packet size */
     pos = avio_tell(pb);
-    len = avio_read(pb, buf, sizeof(buf));
-    ts->raw_packet_size = get_packet_size(buf, len);
+    ts->raw_packet_size = get_packet_size(s);
     if (ts->raw_packet_size <= 0) {
         av_log(s, AV_LOG_WARNING, "Could not detect TS packet size, defaulting to non-FEC/DVHS\n");
         ts->raw_packet_size = TS_PACKET_SIZE;
@@ -2854,8 +3098,8 @@
         seek_back(s, pb, pos);
 
         mpegts_open_section_filter(ts, SDT_PID, sdt_cb, ts, 1);
-
         mpegts_open_section_filter(ts, PAT_PID, pat_cb, ts, 1);
+        mpegts_open_section_filter(ts, EIT_PID, eit_cb, ts, 1);
 
         handle_packets(ts, probesize / ts->raw_packet_size);
         /* if could not find service, enable auto_guess */
@@ -2941,12 +3185,11 @@
     uint8_t pcr_buf[12];
     const uint8_t *data;
 
-    if (av_new_packet(pkt, TS_PACKET_SIZE) < 0)
-        return AVERROR(ENOMEM);
+    if ((ret = av_new_packet(pkt, TS_PACKET_SIZE)) < 0)
+        return ret;
     ret = read_packet(s, pkt->data, ts->raw_packet_size, &data);
     pkt->pos = avio_tell(s->pb);
     if (ret < 0) {
-        av_packet_unref(pkt);
         return ret;
     }
     if (data != pkt->data)
@@ -3016,6 +3259,9 @@
 
     clear_programs(ts);
 
+    for (i = 0; i < FF_ARRAY_ELEMS(ts->pools); i++)
+        av_buffer_pool_uninit(&ts->pools[i]);
+
     for (i = 0; i < NB_PID_MAX; i++)
         if (ts->pids[i])
             mpegts_close_filter(ts, ts->pids[i]);
@@ -3110,8 +3356,10 @@
     ts->raw_packet_size = TS_PACKET_SIZE;
     ts->stream = s;
     ts->auto_guess = 1;
+
     mpegts_open_section_filter(ts, SDT_PID, sdt_cb, ts, 1);
     mpegts_open_section_filter(ts, PAT_PID, pat_cb, ts, 1);
+    mpegts_open_section_filter(ts, EIT_PID, eit_cb, ts, 1);
 
     return ts;
 }
@@ -3133,7 +3381,7 @@
             buf++;
             len--;
         } else {
-            handle_packet(ts, buf);
+            handle_packet(ts, buf, len1 - len + TS_PACKET_SIZE);
             buf += TS_PACKET_SIZE;
             len -= TS_PACKET_SIZE;
             if (ts->stop_parse == 1)
diff --git a/libavformat/mpegts.h b/libavformat/mpegts.h
index 272e2be..059b693 100644
--- a/libavformat/mpegts.h
+++ b/libavformat/mpegts.h
@@ -30,17 +30,91 @@
 #define TS_MAX_PACKET_SIZE 204
 
 #define NB_PID_MAX 8192
+#define USUAL_SECTION_SIZE 1024 /* except EIT which is limited to 4096 */
 #define MAX_SECTION_SIZE 4096
 
 /* pids */
-#define PAT_PID                 0x0000
-#define SDT_PID                 0x0011
+#define PAT_PID         0x0000 /* Program Association Table */
+#define CAT_PID         0x0001 /* Conditional Access Table */
+#define TSDT_PID        0x0002 /* Transport Stream Description Table */
+#define IPMP_PID        0x0003
+/* PID from 0x0004 to 0x000F are reserved */
+#define NIT_PID         0x0010 /* Network Information Table */
+#define SDT_PID         0x0011 /* Service Description Table */
+#define BAT_PID         0x0011 /* Bouquet Association Table */
+#define EIT_PID         0x0012 /* Event Information Table */
+#define RST_PID         0x0013 /* Running Status Table */
+#define TDT_PID         0x0014 /* Time and Date Table */
+#define TOT_PID         0x0014
+#define NET_SYNC_PID    0x0015
+#define RNT_PID         0x0016 /* RAR Notification Table */
+/* PID from 0x0017 to 0x001B are reserved for future use */
+/* PID value 0x001C allocated to link-local inband signalling shall not be
+ * used on any broadcast signals. It shall only be used between devices in a
+ * controlled environment. */
+#define LINK_LOCAL_PID  0x001C
+#define MEASUREMENT_PID 0x001D
+#define DIT_PID         0x001E /* Discontinuity Information Table */
+#define SIT_PID         0x001F /* Selection Information Table */
+/* PID from 0x0020 to 0x1FFA may be assigned as needed to PMT, elementary
+ * streams and other data tables */
+#define FIRST_OTHER_PID 0x0020
+#define  LAST_OTHER_PID 0x1FFA
+/* PID 0x1FFB is used by DigiCipher 2/ATSC MGT metadata */
+/* PID from 0x1FFC to 0x1FFE may be assigned as needed to PMT, elementary
+ * streams and other data tables */
+#define NULL_PID        0x1FFF /* Null packet (used for fixed bandwidth padding) */
+
+/* m2ts pids */
+#define M2TS_PMT_PID                      0x0100
+#define M2TS_PCR_PID                      0x1001
+#define M2TS_VIDEO_PID                    0x1011
+#define M2TS_AUDIO_START_PID              0x1100
+#define M2TS_PGSSUB_START_PID             0x1200
+#define M2TS_TEXTSUB_PID                  0x1800
+#define M2TS_SECONDARY_AUDIO_START_PID    0x1A00
+#define M2TS_SECONDARY_VIDEO_START_PID    0x1B00
 
 /* table ids */
-#define PAT_TID   0x00
-#define PMT_TID   0x02
-#define M4OD_TID  0x05
-#define SDT_TID   0x42
+#define PAT_TID         0x00 /* Program Association section */
+#define CAT_TID         0x01 /* Conditional Access section */
+#define PMT_TID         0x02 /* Program Map section */
+#define TSDT_TID        0x03 /* Transport Stream Description section */
+/* TID from 0x04 to 0x3F are reserved */
+#define M4OD_TID        0x05
+#define NIT_TID         0x40 /* Network Information section - actual network */
+#define ONIT_TID        0x41 /* Network Information section - other network */
+#define SDT_TID         0x42 /* Service Description section - actual TS */
+/* TID from 0x43 to 0x45 are reserved for future use */
+#define OSDT_TID        0x46 /* Service Descrition section - other TS */
+/* TID from 0x47 to 0x49 are reserved for future use */
+#define BAT_TID         0x4A /* Bouquet Association section */
+#define UNT_TID         0x4B /* Update Notification Table section */
+#define DFI_TID         0x4C /* Downloadable Font Info section */
+/* TID 0x4D is reserved for future use */
+#define EIT_TID         0x4E /* Event Information section - actual TS */
+#define OEIT_TID        0x4F /* Event Information section - other TS */
+#define EITS_START_TID  0x50 /* Event Information section schedule - actual TS */
+#define EITS_END_TID    0x5F /* Event Information section schedule - actual TS */
+#define OEITS_START_TID 0x60 /* Event Information section schedule - other TS */
+#define OEITS_END_TID   0x6F /* Event Information section schedule - other TS */
+#define TDT_TID         0x70 /* Time Date section */
+#define RST_TID         0x71 /* Running Status section */
+#define ST_TID          0x72 /* Stuffing section */
+#define TOT_TID         0x73 /* Time Offset section */
+#define AIT_TID         0x74 /* Application Inforamtion section */
+#define CT_TID          0x75 /* Container section */
+#define RCT_TID         0x76 /* Related Content section */
+#define CIT_TID         0x77 /* Content Identifier section */
+#define MPE_FEC_TID     0x78 /* MPE-FEC section */
+#define RPNT_TID        0x79 /* Resolution Provider Notification section */
+#define MPE_IFEC_TID    0x7A /* MPE-IFEC section */
+#define PROTMT_TID      0x7B /* Protection Message section */
+/* TID from 0x7C to 0x7D are reserved for future use */
+#define DIT_TID         0x7E /* Discontinuity Information section */
+#define SIT_TID         0x7F /* Selection Information section */
+/* TID from 0x80 to 0xFE are user defined */
+/* TID 0xFF is reserved */
 
 #define STREAM_TYPE_VIDEO_MPEG1     0x01
 #define STREAM_TYPE_VIDEO_MPEG2     0x02
diff --git a/libavformat/mpegtsenc.c b/libavformat/mpegtsenc.c
index 3339e26..f2be6c6 100644
--- a/libavformat/mpegtsenc.c
+++ b/libavformat/mpegtsenc.c
@@ -54,11 +54,9 @@
 typedef struct MpegTSService {
     MpegTSSection pmt; /* MPEG-2 PMT table context */
     int sid;           /* service ID */
-    char *name;
-    char *provider_name;
+    uint8_t name[256];
+    uint8_t provider_name[256];
     int pcr_pid;
-    int pcr_packet_count;
-    int pcr_packet_period;
     AVProgram *program;
 } MpegTSService;
 
@@ -78,14 +76,13 @@
     MpegTSSection pat; /* MPEG-2 PAT table */
     MpegTSSection sdt; /* MPEG-2 SDT table context */
     MpegTSService **services;
-    int sdt_packet_count;
-    int sdt_packet_period;
-    int pat_packet_count;
-    int pat_packet_period;
+    int64_t sdt_period; /* SDT period in PCR time base */
+    int64_t pat_period; /* PAT/PMT period in PCR time base */
     int nb_services;
     int onid;
     int tsid;
     int64_t first_pcr;
+    int64_t next_pcr;
     int mux_rate; ///< set to 1 when VBR
     int pes_payload_size;
 
@@ -97,10 +94,12 @@
     int pmt_start_pid;
     int start_pid;
     int m2ts_mode;
+    int m2ts_video_pid;
+    int m2ts_audio_pid;
+    int m2ts_pgssub_pid;
+    int m2ts_textsub_pid;
 
-    int reemit_pat_pmt; // backward compatibility
-
-    int pcr_period;
+    int pcr_period_ms;
 #define MPEGTS_FLAG_REEMIT_PAT_PMT  0x01
 #define MPEGTS_FLAG_AAC_LATM        0x02
 #define MPEGTS_FLAG_PAT_PMT_AT_FRAMES           0x04
@@ -109,8 +108,8 @@
     int flags;
     int copyts;
     int tables_version;
-    double pat_period;
-    double sdt_period;
+    int64_t pat_period_us;
+    int64_t sdt_period_us;
     int64_t last_pat_ts;
     int64_t last_sdt_ts;
 
@@ -220,7 +219,7 @@
 /* mpegts writer */
 
 #define DEFAULT_PROVIDER_NAME   "FFmpeg"
-#define DEFAULT_SERVICE_NAME    "Service01"
+#define DEFAULT_SERVICE_NAME    "Service"
 
 /* we retransmit the SI info at this rate */
 #define SDT_RETRANS_TIME 500
@@ -228,7 +227,6 @@
 #define PCR_RETRANS_TIME 20
 
 typedef struct MpegTSWriteStream {
-    struct MpegTSService *service;
     int pid; /* stream associated pid */
     int cc;
     int discontinuity;
@@ -240,7 +238,10 @@
     int payload_flags;
     uint8_t *payload;
     AVFormatContext *amux;
-    AVRational user_tb;
+    int data_st_warning;
+
+    int64_t pcr_period; /* PCR period in PCR time base */
+    int64_t last_pcr;
 
     /* For Opus */
     int opus_queued_samples;
@@ -264,28 +265,159 @@
                           data, q - data);
 }
 
-/* NOTE: !str is accepted for an empty string */
-static void putstr8(uint8_t **q_ptr, const char *str, int write_len)
+static void putbuf(uint8_t **q_ptr, const uint8_t *buf, size_t len)
 {
-    uint8_t *q;
-    int len;
+    memcpy(*q_ptr, buf, len);
+    *q_ptr += len;
+}
 
-    q = *q_ptr;
-    if (!str)
-        len = 0;
-    else
-        len = strlen(str);
-    if (write_len)
-        *q++ = len;
-    if (!str) {
-        *q_ptr = q;
-        return;
-    }
-    memcpy(q, str, len);
-    q     += len;
+static void put_registration_descriptor(uint8_t **q_ptr, uint32_t tag)
+{
+    uint8_t *q = *q_ptr;
+    *q++ = 0x05; /* MPEG-2 registration descriptor*/
+    *q++ = 4;
+    *q++ = tag;
+    *q++ = tag >> 8;
+    *q++ = tag >> 16;
+    *q++ = tag >> 24;
     *q_ptr = q;
 }
 
+static int get_dvb_stream_type(AVFormatContext *s, AVStream *st)
+{
+    MpegTSWrite *ts = s->priv_data;
+    MpegTSWriteStream *ts_st = st->priv_data;
+    int stream_type;
+
+    switch (st->codecpar->codec_id) {
+    case AV_CODEC_ID_MPEG1VIDEO:
+    case AV_CODEC_ID_MPEG2VIDEO:
+        stream_type = STREAM_TYPE_VIDEO_MPEG2;
+        break;
+    case AV_CODEC_ID_MPEG4:
+        stream_type = STREAM_TYPE_VIDEO_MPEG4;
+        break;
+    case AV_CODEC_ID_H264:
+        stream_type = STREAM_TYPE_VIDEO_H264;
+        break;
+    case AV_CODEC_ID_HEVC:
+        stream_type = STREAM_TYPE_VIDEO_HEVC;
+        break;
+    case AV_CODEC_ID_CAVS:
+        stream_type = STREAM_TYPE_VIDEO_CAVS;
+        break;
+    case AV_CODEC_ID_DIRAC:
+        stream_type = STREAM_TYPE_VIDEO_DIRAC;
+        break;
+    case AV_CODEC_ID_VC1:
+        stream_type = STREAM_TYPE_VIDEO_VC1;
+        break;
+    case AV_CODEC_ID_MP2:
+    case AV_CODEC_ID_MP3:
+        if (   st->codecpar->sample_rate > 0
+            && st->codecpar->sample_rate < 32000) {
+            stream_type = STREAM_TYPE_AUDIO_MPEG2;
+        } else {
+            stream_type = STREAM_TYPE_AUDIO_MPEG1;
+        }
+        break;
+    case AV_CODEC_ID_AAC:
+        stream_type = (ts->flags & MPEGTS_FLAG_AAC_LATM)
+                      ? STREAM_TYPE_AUDIO_AAC_LATM
+                      : STREAM_TYPE_AUDIO_AAC;
+        break;
+    case AV_CODEC_ID_AAC_LATM:
+        stream_type = STREAM_TYPE_AUDIO_AAC_LATM;
+        break;
+    case AV_CODEC_ID_AC3:
+        stream_type = (ts->flags & MPEGTS_FLAG_SYSTEM_B)
+                      ? STREAM_TYPE_PRIVATE_DATA
+                      : STREAM_TYPE_AUDIO_AC3;
+        break;
+    case AV_CODEC_ID_EAC3:
+        stream_type = (ts->flags & MPEGTS_FLAG_SYSTEM_B)
+                      ? STREAM_TYPE_PRIVATE_DATA
+                      : STREAM_TYPE_AUDIO_EAC3;
+        break;
+    case AV_CODEC_ID_DTS:
+        stream_type = STREAM_TYPE_AUDIO_DTS;
+        break;
+    case AV_CODEC_ID_TRUEHD:
+        stream_type = STREAM_TYPE_AUDIO_TRUEHD;
+        break;
+    case AV_CODEC_ID_OPUS:
+        stream_type = STREAM_TYPE_PRIVATE_DATA;
+        break;
+    case AV_CODEC_ID_TIMED_ID3:
+        stream_type = STREAM_TYPE_METADATA;
+        break;
+    case AV_CODEC_ID_DVB_SUBTITLE:
+    case AV_CODEC_ID_DVB_TELETEXT:
+        stream_type = STREAM_TYPE_PRIVATE_DATA;
+        break;
+    default:
+        av_log_once(s, AV_LOG_WARNING, AV_LOG_DEBUG, &ts_st->data_st_warning,
+                    "Stream %d, codec %s, is muxed as a private data stream "
+                    "and may not be recognized upon reading.\n", st->index,
+                    avcodec_get_name(st->codecpar->codec_id));
+        stream_type = STREAM_TYPE_PRIVATE_DATA;
+        break;
+    }
+
+    return stream_type;
+}
+
+static int get_m2ts_stream_type(AVFormatContext *s, AVStream *st)
+{
+    int stream_type;
+    MpegTSWriteStream *ts_st = st->priv_data;
+
+    switch (st->codecpar->codec_id) {
+    case AV_CODEC_ID_MPEG2VIDEO:
+        stream_type = STREAM_TYPE_VIDEO_MPEG2;
+        break;
+    case AV_CODEC_ID_H264:
+        stream_type = STREAM_TYPE_VIDEO_H264;
+        break;
+    case AV_CODEC_ID_VC1:
+        stream_type = STREAM_TYPE_VIDEO_VC1;
+        break;
+    case AV_CODEC_ID_HEVC:
+        stream_type = STREAM_TYPE_VIDEO_HEVC;
+        break;
+    case AV_CODEC_ID_PCM_BLURAY:
+        stream_type = 0x80;
+        break;
+    case AV_CODEC_ID_AC3:
+        stream_type = 0x81;
+        break;
+    case AV_CODEC_ID_DTS:
+        stream_type = (st->codecpar->channels > 6) ? 0x85 : 0x82;
+        break;
+    case AV_CODEC_ID_TRUEHD:
+        stream_type = 0x83;
+        break;
+    case AV_CODEC_ID_EAC3:
+        stream_type = 0x84;
+        break;
+    case AV_CODEC_ID_HDMV_PGS_SUBTITLE:
+        stream_type = 0x90;
+        break;
+    case AV_CODEC_ID_HDMV_TEXT_SUBTITLE:
+        stream_type = 0x92;
+        break;
+    default:
+        av_log_once(s, AV_LOG_WARNING, AV_LOG_DEBUG, &ts_st->data_st_warning,
+                    "Stream %d, codec %s, is muxed as a private data stream "
+                    "and may not be recognized upon reading.\n", st->index,
+                    avcodec_get_name(st->codecpar->codec_id));
+        stream_type = STREAM_TYPE_PRIVATE_DATA;
+        break;
+    }
+
+    return stream_type;
+}
+
 static int mpegts_write_pmt(AVFormatContext *s, MpegTSService *service)
 {
     MpegTSWrite *ts = s->priv_data;
@@ -299,6 +431,14 @@
     q += 2; /* patched after */
 
     /* put program info here */
+    if (ts->m2ts_mode) {
+        put_registration_descriptor(&q, MKTAG('H', 'D', 'M', 'V'));
+        *q++ = 0x88;        // descriptor_tag - hdmv_copy_control_descriptor
+        *q++ = 0x04;        // descriptor_length
+        put16(&q, 0x0fff);  // CA_System_ID
+        *q++ = 0xfc;        // private_data_byte
+        *q++ = 0xfc;        // private_data_byte
+    }
 
     val = 0xf000 | (q - program_info_length_ptr - 2);
     program_info_length_ptr[0] = val >> 8;
@@ -327,72 +467,8 @@
             err = 1;
             break;
         }
-        switch (st->codecpar->codec_id) {
-        case AV_CODEC_ID_MPEG1VIDEO:
-        case AV_CODEC_ID_MPEG2VIDEO:
-            stream_type = STREAM_TYPE_VIDEO_MPEG2;
-            break;
-        case AV_CODEC_ID_MPEG4:
-            stream_type = STREAM_TYPE_VIDEO_MPEG4;
-            break;
-        case AV_CODEC_ID_H264:
-            stream_type = STREAM_TYPE_VIDEO_H264;
-            break;
-        case AV_CODEC_ID_HEVC:
-            stream_type = STREAM_TYPE_VIDEO_HEVC;
-            break;
-        case AV_CODEC_ID_CAVS:
-            stream_type = STREAM_TYPE_VIDEO_CAVS;
-            break;
-        case AV_CODEC_ID_DIRAC:
-            stream_type = STREAM_TYPE_VIDEO_DIRAC;
-            break;
-        case AV_CODEC_ID_VC1:
-            stream_type = STREAM_TYPE_VIDEO_VC1;
-            break;
-        case AV_CODEC_ID_MP2:
-        case AV_CODEC_ID_MP3:
-            if (   st->codecpar->sample_rate > 0
-                && st->codecpar->sample_rate < 32000) {
-                stream_type = STREAM_TYPE_AUDIO_MPEG2;
-            } else {
-                stream_type = STREAM_TYPE_AUDIO_MPEG1;
-            }
-            break;
-        case AV_CODEC_ID_AAC:
-            stream_type = (ts->flags & MPEGTS_FLAG_AAC_LATM)
-                          ? STREAM_TYPE_AUDIO_AAC_LATM
-                          : STREAM_TYPE_AUDIO_AAC;
-            break;
-        case AV_CODEC_ID_AAC_LATM:
-            stream_type = STREAM_TYPE_AUDIO_AAC_LATM;
-            break;
-        case AV_CODEC_ID_AC3:
-            stream_type = (ts->flags & MPEGTS_FLAG_SYSTEM_B)
-                          ? STREAM_TYPE_PRIVATE_DATA
-                          : STREAM_TYPE_AUDIO_AC3;
-            break;
-        case AV_CODEC_ID_EAC3:
-            stream_type = (ts->flags & MPEGTS_FLAG_SYSTEM_B)
-                          ? STREAM_TYPE_PRIVATE_DATA
-                          : STREAM_TYPE_AUDIO_EAC3;
-            break;
-        case AV_CODEC_ID_DTS:
-            stream_type = STREAM_TYPE_AUDIO_DTS;
-            break;
-        case AV_CODEC_ID_TRUEHD:
-            stream_type = STREAM_TYPE_AUDIO_TRUEHD;
-            break;
-        case AV_CODEC_ID_OPUS:
-            stream_type = STREAM_TYPE_PRIVATE_DATA;
-            break;
-        case AV_CODEC_ID_TIMED_ID3:
-            stream_type = STREAM_TYPE_METADATA;
-            break;
-        default:
-            stream_type = STREAM_TYPE_PRIVATE_DATA;
-            break;
-        }
+
+        stream_type = ts->m2ts_mode ? get_m2ts_stream_type(s, st) : get_dvb_stream_type(s, st);
 
         *q++ = stream_type;
         put16(&q, 0xe000 | ts_st->pid);
@@ -412,14 +488,8 @@
                 *q++=1; // 1 byte, all flags sets to 0
                 *q++=0; // omit all fields...
             }
-            if (st->codecpar->codec_id==AV_CODEC_ID_S302M) {
-                *q++ = 0x05; /* MPEG-2 registration descriptor*/
-                *q++ = 4;
-                *q++ = 'B';
-                *q++ = 'S';
-                *q++ = 'S';
-                *q++ = 'D';
-            }
+            if (st->codecpar->codec_id==AV_CODEC_ID_S302M)
+                put_registration_descriptor(&q, MKTAG('B', 'S', 'S', 'D'));
             if (st->codecpar->codec_id==AV_CODEC_ID_OPUS) {
                 /* 6 bytes registration descriptor, 4 bytes Opus audio descriptor */
                 if (q - data > SECTION_LENGTH - 6 - 4) {
@@ -427,12 +497,7 @@
                     break;
                 }
 
-                *q++ = 0x05; /* MPEG-2 registration descriptor*/
-                *q++ = 4;
-                *q++ = 'O';
-                *q++ = 'p';
-                *q++ = 'u';
-                *q++ = 's';
+                put_registration_descriptor(&q, MKTAG('O', 'p', 'u', 's'));
 
                 *q++ = 0x7f; /* DVB extension descriptor */
                 *q++ = 2;
@@ -618,37 +683,24 @@
         break;
         case AVMEDIA_TYPE_VIDEO:
             if (stream_type == STREAM_TYPE_VIDEO_DIRAC) {
-                *q++ = 0x05; /*MPEG-2 registration descriptor*/
-                *q++ = 4;
-                *q++ = 'd';
-                *q++ = 'r';
-                *q++ = 'a';
-                *q++ = 'c';
+                put_registration_descriptor(&q, MKTAG('d', 'r', 'a', 'c'));
             } else if (stream_type == STREAM_TYPE_VIDEO_VC1) {
-                *q++ = 0x05; /*MPEG-2 registration descriptor*/
-                *q++ = 4;
-                *q++ = 'V';
-                *q++ = 'C';
-                *q++ = '-';
-                *q++ = '1';
+                put_registration_descriptor(&q, MKTAG('V', 'C', '-', '1'));
+            } else if (stream_type == STREAM_TYPE_VIDEO_HEVC && s->strict_std_compliance <= FF_COMPLIANCE_NORMAL) {
+                put_registration_descriptor(&q, MKTAG('H', 'E', 'V', 'C'));
             }
             break;
         case AVMEDIA_TYPE_DATA:
             if (st->codecpar->codec_id == AV_CODEC_ID_SMPTE_KLV) {
-                *q++ = 0x05; /* MPEG-2 registration descriptor */
-                *q++ = 4;
-                *q++ = 'K';
-                *q++ = 'L';
-                *q++ = 'V';
-                *q++ = 'A';
+                put_registration_descriptor(&q, MKTAG('K', 'L', 'V', 'A'));
             } else if (st->codecpar->codec_id == AV_CODEC_ID_TIMED_ID3) {
                 const char *tag = "ID3 ";
                 *q++ = 0x26; /* metadata descriptor */
                 *q++ = 13;
                 put16(&q, 0xffff);    /* metadata application format */
-                putstr8(&q, tag, 0);
+                putbuf(&q, tag, strlen(tag));
                 *q++ = 0xff;        /* metadata format */
-                putstr8(&q, tag, 0);
+                putbuf(&q, tag, strlen(tag));
                 *q++ = 0;            /* metadata service ID */
                 *q++ = 0xF;          /* metadata_locator_record_flag|MPEG_carriage_flags|reserved */
             }
@@ -695,8 +747,8 @@
         desc_len_ptr = q;
         q++;
         *q++         = ts->service_type;
-        putstr8(&q, service->provider_name, 1);
-        putstr8(&q, service->name, 1);
+        putbuf(&q, service->provider_name, service->provider_name[0] + 1);
+        putbuf(&q, service->name, service->name[0] + 1);
         desc_len_ptr[0] = q - desc_len_ptr - 1;
 
         /* fill descriptor length */
@@ -709,31 +761,40 @@
                           data, q - data);
 }
 
-static MpegTSService *mpegts_add_service(MpegTSWrite *ts, int sid,
-                                         const char *provider_name,
-                                         const char *name)
+/* This stores a string in buf with the correct encoding and also sets the
+ * first byte as the length. !str is accepted for an empty string.
+ * If the string is already encoded, invalid UTF-8 or has no multibyte sequence
+ * then we keep it as is, otherwise we signal UTF-8 encoding. */
+static int encode_str8(uint8_t *buf, const char *str)
 {
-    MpegTSService *service;
-
-    service = av_mallocz(sizeof(MpegTSService));
-    if (!service)
-        return NULL;
-    service->pmt.pid       = ts->pmt_start_pid + ts->nb_services;
-    service->sid           = sid;
-    service->pcr_pid       = 0x1fff;
-    service->provider_name = av_strdup(provider_name);
-    service->name          = av_strdup(name);
-    if (!service->provider_name || !service->name)
-        goto fail;
-    if (av_dynarray_add_nofree(&ts->services, &ts->nb_services, service) < 0)
-        goto fail;
-
-    return service;
-fail:
-    av_freep(&service->provider_name);
-    av_freep(&service->name);
-    av_free(service);
-    return NULL;
+    size_t str_len;
+    if (!str)
+        str = "";
+    str_len = strlen(str);
+    if (str[0] && (unsigned)str[0] >= 0x20) {   /* Make sure the string is not already encoded. */
+        const uint8_t *q = str;
+        int has_multibyte = 0;
+        while (*q) {
+            uint32_t code;
+            GET_UTF8(code, *q++, goto invalid;) /* Is it valid UTF-8? */
+            has_multibyte |= (code > 127);      /* Does it have multibyte UTF-8 chars in it? */
+        }
+        if (has_multibyte) {                    /* If we have multibyte chars and valid UTF-8, then encode as such! */
+            if (str_len > 254)
+                return AVERROR(EINVAL);
+            buf[0] = str_len + 1;
+            buf[1] = 0x15;
+            memcpy(&buf[2], str, str_len);
+            return 0;
+        }
+    }
+invalid:
+    /* Otherwise let's just encode the string as is! */
+    if (str_len > 255)
+        return AVERROR(EINVAL);
+    buf[0] = str_len;
+    memcpy(&buf[1], str, str_len);
+    return 0;
 }
 
 static int64_t get_pcr(const MpegTSWrite *ts, AVIOContext *pb)
@@ -742,7 +803,7 @@
            ts->first_pcr;
 }
 
-static void mpegts_prefix_m2ts_header(AVFormatContext *s)
+static void write_packet(AVFormatContext *s, const uint8_t *packet)
 {
     MpegTSWrite *ts = s->priv_data;
     if (ts->m2ts_mode) {
@@ -752,28 +813,148 @@
         avio_write(s->pb, (unsigned char *) &tp_extra_header,
                    sizeof(tp_extra_header));
     }
+    avio_write(s->pb, packet, TS_PACKET_SIZE);
 }
 
 static void section_write_packet(MpegTSSection *s, const uint8_t *packet)
 {
     AVFormatContext *ctx = s->opaque;
-    mpegts_prefix_m2ts_header(ctx);
-    avio_write(ctx->pb, packet, TS_PACKET_SIZE);
+    write_packet(ctx, packet);
+}
+
+static MpegTSService *mpegts_add_service(AVFormatContext *s, int sid,
+                                         const AVDictionary *metadata,
+                                         AVProgram *program)
+{
+    MpegTSWrite *ts = s->priv_data;
+    MpegTSService *service;
+    AVDictionaryEntry *title, *provider;
+    char default_service_name[32];
+    const char *service_name;
+    const char *provider_name;
+
+    title = av_dict_get(metadata, "service_name", NULL, 0);
+    if (!title)
+        title = av_dict_get(metadata, "title", NULL, 0);
+    snprintf(default_service_name, sizeof(default_service_name), "%s%02d", DEFAULT_SERVICE_NAME, ts->nb_services + 1);
+    service_name  = title ? title->value : default_service_name;
+    provider      = av_dict_get(metadata, "service_provider", NULL, 0);
+    provider_name = provider ? provider->value : DEFAULT_PROVIDER_NAME;
+
+    service = av_mallocz(sizeof(MpegTSService));
+    if (!service)
+        return NULL;
+    service->pmt.pid       = ts->pmt_start_pid + ts->nb_services;
+    service->sid           = sid;
+    service->pcr_pid       = 0x1fff;
+    if (encode_str8(service->provider_name, provider_name) < 0 ||
+        encode_str8(service->name, service_name) < 0) {
+        av_log(s, AV_LOG_ERROR, "Too long service or provider name\n");
+        goto fail;
+    }
+    if (av_dynarray_add_nofree(&ts->services, &ts->nb_services, service) < 0)
+        goto fail;
+
+    service->pmt.write_packet = section_write_packet;
+    service->pmt.opaque       = s;
+    service->pmt.cc           = 15;
+    service->pmt.discontinuity= ts->flags & MPEGTS_FLAG_DISCONT;
+    service->program          = program;
+
+    return service;
+fail:
+    av_free(service);
+    return NULL;
+}
+
+static void enable_pcr_generation_for_stream(AVFormatContext *s, AVStream *pcr_st)
+{
+    MpegTSWrite *ts = s->priv_data;
+    MpegTSWriteStream *ts_st = pcr_st->priv_data;
+
+    if (ts->mux_rate > 1 || ts->pcr_period_ms >= 0) {
+        int pcr_period_ms = ts->pcr_period_ms == -1 ? PCR_RETRANS_TIME : ts->pcr_period_ms;
+        ts_st->pcr_period = av_rescale(pcr_period_ms, PCR_TIME_BASE, 1000);
+    } else {
+        /* By default, for VBR we select the highest multiple of frame duration which is less than 100 ms. */
+        int64_t frame_period = 0;
+        if (pcr_st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {
+            int frame_size = av_get_audio_frame_duration2(pcr_st->codecpar, 0);
+            if (!frame_size) {
+               av_log(s, AV_LOG_WARNING, "frame size not set\n");
+               frame_size = 512;
+            }
+            frame_period = av_rescale_rnd(frame_size, PCR_TIME_BASE, pcr_st->codecpar->sample_rate, AV_ROUND_UP);
+        } else if (pcr_st->avg_frame_rate.num) {
+            frame_period = av_rescale_rnd(pcr_st->avg_frame_rate.den, PCR_TIME_BASE, pcr_st->avg_frame_rate.num, AV_ROUND_UP);
+        }
+        if (frame_period > 0 && frame_period <= PCR_TIME_BASE / 10)
+            ts_st->pcr_period = frame_period * (PCR_TIME_BASE / 10 / frame_period);
+        else
+            ts_st->pcr_period = 1;
+    }
+
+    // output a PCR as soon as possible
+    ts_st->last_pcr   = ts->first_pcr - ts_st->pcr_period;
+}
+
+static void select_pcr_streams(AVFormatContext *s)
+{
+    MpegTSWrite *ts = s->priv_data;
+
+    for (int i = 0; i < ts->nb_services; i++) {
+        MpegTSService *service = ts->services[i];
+        AVStream *pcr_st = NULL;
+        AVProgram *program = service->program;
+        int nb_streams = program ? program->nb_stream_indexes : s->nb_streams;
+
+        for (int j = 0; j < nb_streams; j++) {
+            AVStream *st = s->streams[program ? program->stream_index[j] : j];
+            if (!pcr_st ||
+                pcr_st->codecpar->codec_type != AVMEDIA_TYPE_VIDEO && st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO)
+            {
+                pcr_st = st;
+            }
+        }
+
+        if (pcr_st) {
+            MpegTSWriteStream *ts_st = pcr_st->priv_data;
+            service->pcr_pid = ts_st->pid;
+            enable_pcr_generation_for_stream(s, pcr_st);
+            av_log(s, AV_LOG_VERBOSE, "service %i using PCR in pid=%i, pcr_period=%"PRId64"ms\n",
+                service->sid, service->pcr_pid, av_rescale(ts_st->pcr_period, 1000, PCR_TIME_BASE));
+        }
+    }
 }
 
 static int mpegts_init(AVFormatContext *s)
 {
     MpegTSWrite *ts = s->priv_data;
-    MpegTSWriteStream *ts_st;
-    MpegTSService *service;
-    AVStream *st, *pcr_st = NULL;
-    AVDictionaryEntry *title, *provider;
     int i, j;
-    const char *service_name;
-    const char *provider_name;
     int *pids;
     int ret;
 
+    if (ts->m2ts_mode == -1) {
+        if (av_match_ext(s->url, "m2ts")) {
+            ts->m2ts_mode = 1;
+        } else {
+            ts->m2ts_mode = 0;
+        }
+    }
+
+    ts->m2ts_video_pid   = M2TS_VIDEO_PID;
+    ts->m2ts_audio_pid   = M2TS_AUDIO_START_PID;
+    ts->m2ts_pgssub_pid  = M2TS_PGSSUB_START_PID;
+    ts->m2ts_textsub_pid = M2TS_TEXTSUB_PID;
+
+    if (ts->m2ts_mode) {
+        ts->pmt_start_pid = M2TS_PMT_PID;
+        if (s->nb_programs > 1) {
+            av_log(s, AV_LOG_ERROR, "Only one program is allowed in m2ts mode!\n");
+            return AVERROR(EINVAL);
+        }
+    }
+
     if (s->max_delay < 0) /* Not set by the caller */
         s->max_delay = 0;
 
@@ -784,42 +965,13 @@
     ts->onid = ts->original_network_id;
     if (!s->nb_programs) {
         /* allocate a single DVB service */
-        title = av_dict_get(s->metadata, "service_name", NULL, 0);
-        if (!title)
-            title = av_dict_get(s->metadata, "title", NULL, 0);
-        service_name  = title ? title->value : DEFAULT_SERVICE_NAME;
-        provider      = av_dict_get(s->metadata, "service_provider", NULL, 0);
-        provider_name = provider ? provider->value : DEFAULT_PROVIDER_NAME;
-        service       = mpegts_add_service(ts, ts->service_id,
-                                           provider_name, service_name);
-
-        if (!service)
+        if (!mpegts_add_service(s, ts->service_id, s->metadata, NULL))
             return AVERROR(ENOMEM);
-
-        service->pmt.write_packet = section_write_packet;
-        service->pmt.opaque       = s;
-        service->pmt.cc           = 15;
-        service->pmt.discontinuity= ts->flags & MPEGTS_FLAG_DISCONT;
     } else {
         for (i = 0; i < s->nb_programs; i++) {
             AVProgram *program = s->programs[i];
-            title = av_dict_get(program->metadata, "service_name", NULL, 0);
-            if (!title)
-                title = av_dict_get(program->metadata, "title", NULL, 0);
-            service_name  = title ? title->value : DEFAULT_SERVICE_NAME;
-            provider      = av_dict_get(program->metadata, "service_provider", NULL, 0);
-            provider_name = provider ? provider->value : DEFAULT_PROVIDER_NAME;
-            service       = mpegts_add_service(ts, program->id,
-                                               provider_name, service_name);
-
-            if (!service)
+            if (!mpegts_add_service(s, program->id, program->metadata, program))
                 return AVERROR(ENOMEM);
-
-            service->pmt.write_packet = section_write_packet;
-            service->pmt.opaque       = s;
-            service->pmt.cc           = 15;
-            service->pmt.discontinuity= ts->flags & MPEGTS_FLAG_DISCONT;
-            service->program          = program;
         }
     }
 
@@ -845,8 +997,8 @@
 
     /* assign pids to each stream */
     for (i = 0; i < s->nb_streams; i++) {
-        AVProgram *program;
-        st = s->streams[i];
+        AVStream *st = s->streams[i];
+        MpegTSWriteStream *ts_st;
 
         ts_st = av_mallocz(sizeof(MpegTSWriteStream));
         if (!ts_st) {
@@ -855,7 +1007,6 @@
         }
         st->priv_data = ts_st;
 
-        ts_st->user_tb = st->time_base;
         avpriv_set_pts_info(st, 33, 1, 90000);
 
         ts_st->payload = av_mallocz(ts->pes_payload_size);
@@ -864,33 +1015,61 @@
             goto fail;
         }
 
-        program = av_find_program_from_stream(s, NULL, i);
-        if (program) {
-            for (j = 0; j < ts->nb_services; j++) {
-                if (ts->services[j]->program == program) {
-                    service = ts->services[j];
-                    break;
-                }
-            }
-        }
-
-        ts_st->service = service;
         /* MPEG pid values < 16 are reserved. Applications which set st->id in
          * this range are assigned a calculated pid. */
         if (st->id < 16) {
-            ts_st->pid = ts->start_pid + i;
-        } else if (st->id < 0x1FFF) {
-            ts_st->pid = st->id;
+            if (ts->m2ts_mode) {
+                switch (st->codecpar->codec_type) {
+                case AVMEDIA_TYPE_VIDEO:
+                    ts_st->pid = ts->m2ts_video_pid++;
+                    break;
+                case AVMEDIA_TYPE_AUDIO:
+                    ts_st->pid = ts->m2ts_audio_pid++;
+                    break;
+                case AVMEDIA_TYPE_SUBTITLE:
+                    switch (st->codecpar->codec_id) {
+                    case AV_CODEC_ID_HDMV_PGS_SUBTITLE:
+                        ts_st->pid = ts->m2ts_pgssub_pid++;
+                        break;
+                    case AV_CODEC_ID_HDMV_TEXT_SUBTITLE:
+                        ts_st->pid = ts->m2ts_textsub_pid++;
+                        break;
+                    }
+                    break;
+                }
+                if (ts->m2ts_video_pid   > M2TS_VIDEO_PID + 1          ||
+                    ts->m2ts_audio_pid   > M2TS_AUDIO_START_PID + 32   ||
+                    ts->m2ts_pgssub_pid  > M2TS_PGSSUB_START_PID + 32  ||
+                    ts->m2ts_textsub_pid > M2TS_TEXTSUB_PID + 1        ||
+                    ts_st->pid < 16) {
+                    av_log(s, AV_LOG_ERROR, "Cannot automatically assign PID for stream %d\n", st->index);
+                    ret = AVERROR(EINVAL);
+                    goto fail;
+                }
+            } else {
+                ts_st->pid = ts->start_pid + i;
+            }
         } else {
+            ts_st->pid = st->id;
+        }
+        if (ts_st->pid >= 0x1FFF) {
             av_log(s, AV_LOG_ERROR,
                    "Invalid stream id %d, must be less than 8191\n", st->id);
             ret = AVERROR(EINVAL);
             goto fail;
         }
-        if (ts_st->pid == service->pmt.pid) {
-            av_log(s, AV_LOG_ERROR, "Duplicate stream id %d\n", ts_st->pid);
-            ret = AVERROR(EINVAL);
-            goto fail;
+        for (j = 0; j < ts->nb_services; j++) {
+            if (ts->services[j]->pmt.pid > LAST_OTHER_PID) {
+                av_log(s, AV_LOG_ERROR,
+                       "Invalid PMT PID %d, must be less than %d\n", ts->services[j]->pmt.pid, LAST_OTHER_PID + 1);
+                ret = AVERROR(EINVAL);
+                goto fail;
+            }
+            if (ts_st->pid == ts->services[j]->pmt.pid) {
+                av_log(s, AV_LOG_ERROR, "PID %d cannot be both elementary and PMT PID\n", ts_st->pid);
+                ret = AVERROR(EINVAL);
+                goto fail;
+            }
         }
         for (j = 0; j < i; j++) {
             if (pids[j] == ts_st->pid) {
@@ -905,12 +1084,6 @@
         ts_st->first_pts_check = 1;
         ts_st->cc              = 15;
         ts_st->discontinuity   = ts->flags & MPEGTS_FLAG_DISCONT;
-        /* update PCR pid by using the first video stream */
-        if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO &&
-            service->pcr_pid == 0x1fff) {
-            service->pcr_pid = ts_st->pid;
-            pcr_st           = st;
-        }
         if (st->codecpar->codec_id == AV_CODEC_ID_AAC &&
             st->codecpar->extradata_size > 0) {
             AVStream *ast;
@@ -945,79 +1118,24 @@
 
     av_freep(&pids);
 
-    /* if no video stream, use the first stream as PCR */
-    if (service->pcr_pid == 0x1fff && s->nb_streams > 0) {
-        pcr_st           = s->streams[0];
-        ts_st            = pcr_st->priv_data;
-        service->pcr_pid = ts_st->pid;
-    } else
-        ts_st = pcr_st->priv_data;
+    if (ts->copyts < 1)
+        ts->first_pcr = av_rescale(s->max_delay, PCR_TIME_BASE, AV_TIME_BASE);
 
-    if (ts->mux_rate > 1) {
-        service->pcr_packet_period = (int64_t)ts->mux_rate * ts->pcr_period /
-                                     (TS_PACKET_SIZE * 8 * 1000);
-        ts->sdt_packet_period      = (int64_t)ts->mux_rate * SDT_RETRANS_TIME /
-                                     (TS_PACKET_SIZE * 8 * 1000);
-        ts->pat_packet_period      = (int64_t)ts->mux_rate * PAT_RETRANS_TIME /
-                                     (TS_PACKET_SIZE * 8 * 1000);
-
-        if (ts->copyts < 1)
-            ts->first_pcr = av_rescale(s->max_delay, PCR_TIME_BASE, AV_TIME_BASE);
-    } else {
-        /* Arbitrary values, PAT/PMT will also be written on video key frames */
-        ts->sdt_packet_period = 200;
-        ts->pat_packet_period = 40;
-        if (pcr_st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {
-            int frame_size = av_get_audio_frame_duration2(pcr_st->codecpar, 0);
-            if (!frame_size) {
-                av_log(s, AV_LOG_WARNING, "frame size not set\n");
-                service->pcr_packet_period =
-                    pcr_st->codecpar->sample_rate / (10 * 512);
-            } else {
-                service->pcr_packet_period =
-                    pcr_st->codecpar->sample_rate / (10 * frame_size);
-            }
-        } else {
-            // max delta PCR 0.1s
-            // TODO: should be avg_frame_rate
-            service->pcr_packet_period =
-                ts_st->user_tb.den / (10 * ts_st->user_tb.num);
-        }
-        if (!service->pcr_packet_period)
-            service->pcr_packet_period = 1;
-    }
+    select_pcr_streams(s);
 
     ts->last_pat_ts = AV_NOPTS_VALUE;
     ts->last_sdt_ts = AV_NOPTS_VALUE;
-    // The user specified a period, use only it
-    if (ts->pat_period < INT_MAX/2) {
-        ts->pat_packet_period = INT_MAX;
-    }
-    if (ts->sdt_period < INT_MAX/2) {
-        ts->sdt_packet_period = INT_MAX;
-    }
-
-    // output a PCR as soon as possible
-    service->pcr_packet_count = service->pcr_packet_period;
-    ts->pat_packet_count      = ts->pat_packet_period - 1;
-    ts->sdt_packet_count      = ts->sdt_packet_period - 1;
+    ts->pat_period = av_rescale(ts->pat_period_us, PCR_TIME_BASE, AV_TIME_BASE);
+    ts->sdt_period = av_rescale(ts->sdt_period_us, PCR_TIME_BASE, AV_TIME_BASE);
 
     if (ts->mux_rate == 1)
         av_log(s, AV_LOG_VERBOSE, "muxrate VBR, ");
     else
         av_log(s, AV_LOG_VERBOSE, "muxrate %d, ", ts->mux_rate);
     av_log(s, AV_LOG_VERBOSE,
-           "pcr every %d pkts, sdt every %d, pat/pmt every %d pkts\n",
-           service->pcr_packet_period,
-           ts->sdt_packet_period, ts->pat_packet_period);
-
-    if (ts->m2ts_mode == -1) {
-        if (av_match_ext(s->url, "m2ts")) {
-            ts->m2ts_mode = 1;
-        } else {
-            ts->m2ts_mode = 0;
-        }
-    }
+           "sdt every %"PRId64" ms, pat/pmt every %"PRId64" ms\n",
+           av_rescale(ts->sdt_period, 1000, PCR_TIME_BASE),
+           av_rescale(ts->pat_period, 1000, PCR_TIME_BASE));
 
     return 0;
 
@@ -1027,27 +1145,24 @@
 }
 
 /* send SDT, PAT and PMT tables regularly */
-static void retransmit_si_info(AVFormatContext *s, int force_pat, int64_t dts)
+static void retransmit_si_info(AVFormatContext *s, int force_pat, int force_sdt, int64_t pcr)
 {
     MpegTSWrite *ts = s->priv_data;
     int i;
 
-    if (++ts->sdt_packet_count == ts->sdt_packet_period ||
-        (dts != AV_NOPTS_VALUE && ts->last_sdt_ts == AV_NOPTS_VALUE) ||
-        (dts != AV_NOPTS_VALUE && dts - ts->last_sdt_ts >= ts->sdt_period*90000.0)
+    if ((pcr != AV_NOPTS_VALUE && ts->last_sdt_ts == AV_NOPTS_VALUE) ||
+        (pcr != AV_NOPTS_VALUE && pcr - ts->last_sdt_ts >= ts->sdt_period) ||
+        force_sdt
     ) {
-        ts->sdt_packet_count = 0;
-        if (dts != AV_NOPTS_VALUE)
-            ts->last_sdt_ts = FFMAX(dts, ts->last_sdt_ts);
+        if (pcr != AV_NOPTS_VALUE)
+            ts->last_sdt_ts = FFMAX(pcr, ts->last_sdt_ts);
         mpegts_write_sdt(s);
     }
-    if (++ts->pat_packet_count == ts->pat_packet_period ||
-        (dts != AV_NOPTS_VALUE && ts->last_pat_ts == AV_NOPTS_VALUE) ||
-        (dts != AV_NOPTS_VALUE && dts - ts->last_pat_ts >= ts->pat_period*90000.0) ||
+    if ((pcr != AV_NOPTS_VALUE && ts->last_pat_ts == AV_NOPTS_VALUE) ||
+        (pcr != AV_NOPTS_VALUE && pcr - ts->last_pat_ts >= ts->pat_period) ||
         force_pat) {
-        ts->pat_packet_count = 0;
-        if (dts != AV_NOPTS_VALUE)
-            ts->last_pat_ts = FFMAX(dts, ts->last_pat_ts);
+        if (pcr != AV_NOPTS_VALUE)
+            ts->last_pat_ts = FFMAX(pcr, ts->last_pat_ts);
         mpegts_write_pat(s);
         for (i = 0; i < ts->nb_services; i++)
             mpegts_write_pmt(s, ts->services[i]);
@@ -1080,8 +1195,7 @@
     *q++ = 0xff;
     *q++ = 0x10;
     memset(q, 0x0FF, TS_PACKET_SIZE - (q - buf));
-    mpegts_prefix_m2ts_header(s);
-    avio_write(s->pb, buf, TS_PACKET_SIZE);
+    write_packet(s, buf);
 }
 
 /* Write a single transport stream packet with a PCR and no payload */
@@ -1110,8 +1224,7 @@
 
     /* stuffing bytes */
     memset(q, 0xFF, TS_PACKET_SIZE - (q - buf));
-    mpegts_prefix_m2ts_header(s);
-    avio_write(s->pb, buf, TS_PACKET_SIZE);
+    write_packet(s, buf);
 }
 
 static void write_pts(uint8_t *q, int fourbits, int64_t pts)
@@ -1175,46 +1288,82 @@
     uint8_t *q;
     int val, is_start, len, header_len, write_pcr, is_dvb_subtitle, is_dvb_teletext, flags;
     int afc_len, stuffing_len;
-    int64_t pcr = -1; /* avoid warning */
     int64_t delay = av_rescale(s->max_delay, 90000, AV_TIME_BASE);
     int force_pat = st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO && key && !ts_st->prev_payload_key;
+    int force_sdt = 0;
 
     av_assert0(ts_st->payload != buf || st->codecpar->codec_type != AVMEDIA_TYPE_VIDEO);
     if (ts->flags & MPEGTS_FLAG_PAT_PMT_AT_FRAMES && st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
         force_pat = 1;
     }
 
+    if (ts->flags & MPEGTS_FLAG_REEMIT_PAT_PMT) {
+        force_pat = 1;
+        force_sdt = 1;
+        ts->flags &= ~MPEGTS_FLAG_REEMIT_PAT_PMT;
+    }
+
     is_start = 1;
     while (payload_size > 0) {
-        retransmit_si_info(s, force_pat, dts);
+        int64_t pcr = AV_NOPTS_VALUE;
+        if (ts->mux_rate > 1)
+            pcr = get_pcr(ts, s->pb);
+        else if (dts != AV_NOPTS_VALUE)
+            pcr = (dts - delay) * 300;
+
+        retransmit_si_info(s, force_pat, force_sdt, pcr);
         force_pat = 0;
+        force_sdt = 0;
 
         write_pcr = 0;
-        if (ts_st->pid == ts_st->service->pcr_pid) {
-            if (ts->mux_rate > 1 || is_start) // VBR pcr period is based on frames
-                ts_st->service->pcr_packet_count++;
-            if (ts_st->service->pcr_packet_count >=
-                ts_st->service->pcr_packet_period) {
-                ts_st->service->pcr_packet_count = 0;
+        if (ts->mux_rate > 1) {
+            /* Send PCR packets for all PCR streams if needed */
+            pcr = get_pcr(ts, s->pb);
+            if (pcr >= ts->next_pcr) {
+                int64_t next_pcr = INT64_MAX;
+                for (int i = 0; i < s->nb_streams; i++) {
+                    /* Make the current stream the last, because for that we
+                     * can insert the pcr into the payload later */
+                    int st2_index = i < st->index ? i : (i + 1 == s->nb_streams ? st->index : i + 1);
+                    AVStream *st2 = s->streams[st2_index];
+                    MpegTSWriteStream *ts_st2 = st2->priv_data;
+                    if (ts_st2->pcr_period) {
+                        if (pcr - ts_st2->last_pcr >= ts_st2->pcr_period) {
+                            ts_st2->last_pcr = FFMAX(pcr - ts_st2->pcr_period, ts_st2->last_pcr + ts_st2->pcr_period);
+                            if (st2 != st) {
+                                mpegts_insert_pcr_only(s, st2);
+                                pcr = get_pcr(ts, s->pb);
+                            } else {
+                                write_pcr = 1;
+                            }
+                        }
+                        next_pcr = FFMIN(next_pcr, ts_st2->last_pcr + ts_st2->pcr_period);
+                    }
+                }
+                ts->next_pcr = next_pcr;
+            }
+            if (dts != AV_NOPTS_VALUE && (dts - pcr / 300) > delay) {
+                /* pcr insert gets priority over null packet insert */
+                if (write_pcr)
+                    mpegts_insert_pcr_only(s, st);
+                else
+                    mpegts_insert_null_packet(s);
+                /* recalculate write_pcr and possibly retransmit si_info */
+                continue;
+            }
+        } else if (ts_st->pcr_period && pcr != AV_NOPTS_VALUE) {
+            if (pcr - ts_st->last_pcr >= ts_st->pcr_period && is_start) {
+                ts_st->last_pcr = FFMAX(pcr - ts_st->pcr_period, ts_st->last_pcr + ts_st->pcr_period);
                 write_pcr = 1;
             }
         }
 
-        if (ts->mux_rate > 1 && dts != AV_NOPTS_VALUE &&
-            (dts - get_pcr(ts, s->pb) / 300) > delay) {
-            /* pcr insert gets priority over null packet insert */
-            if (write_pcr)
-                mpegts_insert_pcr_only(s, st);
-            else
-                mpegts_insert_null_packet(s);
-            /* recalculate write_pcr and possibly retransmit si_info */
-            continue;
-        }
-
         /* prepare packet header */
         q    = buf;
         *q++ = 0x47;
         val  = ts_st->pid >> 8;
+        if (ts->m2ts_mode && st->codecpar->codec_id == AV_CODEC_ID_AC3)
+            val |= 0x20;
         if (is_start)
             val |= 0x40;
         *q++      = val;
@@ -1228,7 +1377,7 @@
         }
         if (key && is_start && pts != AV_NOPTS_VALUE) {
             // set Random Access for key frames
-            if (ts_st->pid == ts_st->service->pcr_pid)
+            if (ts_st->pcr_period)
                 write_pcr = 1;
             set_af_flag(buf, 0x40);
             q = get_ts_payload_start(buf);
@@ -1237,10 +1386,6 @@
             set_af_flag(buf, 0x10);
             q = get_ts_payload_start(buf);
             // add 11, pcr references the last byte of program clock reference base
-            if (ts->mux_rate > 1)
-                pcr = get_pcr(ts, s->pb);
-            else
-                pcr = (dts - delay) * 300;
             if (dts != AV_NOPTS_VALUE && dts < pcr / 300)
                 av_log(s, AV_LOG_WARNING, "dts < pcr, TS is invalid\n");
             extend_af(buf, write_pcr_bits(q, pcr));
@@ -1421,8 +1566,7 @@
 
         payload      += len;
         payload_size -= len;
-        mpegts_prefix_m2ts_header(s);
-        avio_write(s->pb, buf, TS_PACKET_SIZE);
+        write_packet(s, buf);
     }
     ts_st->prev_payload_key = key;
 }
@@ -1520,10 +1664,11 @@
     MpegTSWrite *ts = s->priv_data;
     MpegTSWriteStream *ts_st = st->priv_data;
     const int64_t delay = av_rescale(s->max_delay, 90000, AV_TIME_BASE) * 2;
+    const int64_t max_audio_delay = av_rescale(s->max_delay, 90000, AV_TIME_BASE) / 2;
     int64_t dts = pkt->dts, pts = pkt->pts;
     int opus_samples = 0;
     int side_data_size;
-    char *side_data = NULL;
+    uint8_t *side_data = NULL;
     int stream_id = -1;
 
     side_data = av_packet_get_side_data(pkt,
@@ -1532,19 +1677,6 @@
     if (side_data)
         stream_id = side_data[0];
 
-    if (ts->reemit_pat_pmt) {
-        av_log(s, AV_LOG_WARNING,
-               "resend_headers option is deprecated, use -mpegts_flags resend_headers\n");
-        ts->reemit_pat_pmt = 0;
-        ts->flags         |= MPEGTS_FLAG_REEMIT_PAT_PMT;
-    }
-
-    if (ts->flags & MPEGTS_FLAG_REEMIT_PAT_PMT) {
-        ts->pat_packet_count = ts->pat_packet_period - 1;
-        ts->sdt_packet_count = ts->sdt_packet_period - 1;
-        ts->flags           &= ~MPEGTS_FLAG_REEMIT_PAT_PMT;
-    }
-
     if (ts->copyts < 1) {
         if (pts != AV_NOPTS_VALUE)
             pts += delay;
@@ -1612,7 +1744,7 @@
 
             ret = avio_open_dyn_buf(&ts_st->amux->pb);
             if (ret < 0)
-                return AVERROR(ENOMEM);
+                return ret;
 
             ret = av_write_frame(ts_st->amux, &pkt2);
             if (ret < 0) {
@@ -1643,7 +1775,7 @@
         } while (p < buf_end && (state & 0x7e) != 2*35 &&
                  (state & 0x7e) >= 2*32);
 
-        if ((state & 0x7e) < 2*16 && (state & 0x7e) >= 2*24)
+        if ((state & 0x7e) < 2*16 || (state & 0x7e) >= 2*24)
             extradd = 0;
         if ((state & 0x7e) != 2*35) { // AUD NAL
             data = av_malloc(pkt->size + 7 + extradd);
@@ -1731,25 +1863,9 @@
         }
     }
 
-    if (pkt->dts != AV_NOPTS_VALUE) {
-        int i;
-        for(i=0; i<s->nb_streams; i++) {
-            AVStream *st2 = s->streams[i];
-            MpegTSWriteStream *ts_st2 = st2->priv_data;
-            if (   ts_st2->payload_size
-               && (ts_st2->payload_dts == AV_NOPTS_VALUE || dts - ts_st2->payload_dts > delay/2)) {
-                mpegts_write_pes(s, st2, ts_st2->payload, ts_st2->payload_size,
-                                 ts_st2->payload_pts, ts_st2->payload_dts,
-                                 ts_st2->payload_flags & AV_PKT_FLAG_KEY, stream_id);
-                ts_st2->payload_size = 0;
-            }
-        }
-    }
-
     if (ts_st->payload_size && (ts_st->payload_size + size > ts->pes_payload_size ||
         (dts != AV_NOPTS_VALUE && ts_st->payload_dts != AV_NOPTS_VALUE &&
-         av_compare_ts(dts - ts_st->payload_dts, st->time_base,
-                       s->max_delay, AV_TIME_BASE_Q) >= 0) ||
+         dts - ts_st->payload_dts >= max_audio_delay) ||
         ts_st->opus_queued_samples + opus_samples >= 5760 /* 120ms */)) {
         mpegts_write_pes(s, st, ts_st->payload, ts_st->payload_size,
                          ts_st->payload_pts, ts_st->payload_dts,
@@ -1785,6 +1901,7 @@
 
 static void mpegts_write_flush(AVFormatContext *s)
 {
+    MpegTSWrite *ts = s->priv_data;
     int i;
 
     /* flush current packets */
@@ -1799,6 +1916,12 @@
             ts_st->opus_queued_samples = 0;
         }
     }
+
+    if (ts->m2ts_mode) {
+        int packets = (avio_tell(s->pb) / (TS_PACKET_SIZE + 4)) % 32;
+        while (packets++ < 32)
+            mpegts_insert_null_packet(s);
+    }
 }
 
 static int mpegts_write_packet(AVFormatContext *s, AVPacket *pkt)
@@ -1839,8 +1962,6 @@
 
     for (i = 0; i < ts->nb_services; i++) {
         service = ts->services[i];
-        av_freep(&service->provider_name);
-        av_freep(&service->name);
         av_freep(&service);
     }
     av_freep(&ts->services);
@@ -1907,10 +2028,10 @@
       AV_OPT_FLAG_ENCODING_PARAM, "mpegts_service_type" },
     { "mpegts_pmt_start_pid", "Set the first pid of the PMT.",
       offsetof(MpegTSWrite, pmt_start_pid), AV_OPT_TYPE_INT,
-      { .i64 = 0x1000 }, 0x0010, 0x1f00, AV_OPT_FLAG_ENCODING_PARAM },
+      { .i64 = 0x1000 }, FIRST_OTHER_PID, LAST_OTHER_PID, AV_OPT_FLAG_ENCODING_PARAM },
     { "mpegts_start_pid", "Set the first pid.",
       offsetof(MpegTSWrite, start_pid), AV_OPT_TYPE_INT,
-      { .i64 = 0x0100 }, 0x0010, 0x0f00, AV_OPT_FLAG_ENCODING_PARAM },
+      { .i64 = 0x0100 }, FIRST_OTHER_PID, LAST_OTHER_PID, AV_OPT_FLAG_ENCODING_PARAM },
     { "mpegts_m2ts_mode", "Enable m2ts mode.",
       offsetof(MpegTSWrite, m2ts_mode), AV_OPT_TYPE_BOOL,
       { .i64 = -1 }, -1, 1, AV_OPT_FLAG_ENCODING_PARAM },
@@ -1938,10 +2059,6 @@
     { "initial_discontinuity", "Mark initial packets as discontinuous",
       0, AV_OPT_TYPE_CONST, { .i64 = MPEGTS_FLAG_DISCONT }, 0, INT_MAX,
       AV_OPT_FLAG_ENCODING_PARAM, "mpegts_flags" },
-    // backward compatibility
-    { "resend_headers", "Reemit PAT/PMT before writing the next packet",
-      offsetof(MpegTSWrite, reemit_pat_pmt), AV_OPT_TYPE_INT,
-      { .i64 = 0 }, 0, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM },
     { "mpegts_copyts", "don't offset dts/pts",
       offsetof(MpegTSWrite, copyts), AV_OPT_TYPE_BOOL,
       { .i64 = -1 }, -1, 1, AV_OPT_FLAG_ENCODING_PARAM },
@@ -1952,14 +2069,14 @@
       offsetof(MpegTSWrite, omit_video_pes_length), AV_OPT_TYPE_BOOL,
       { .i64 = 1 }, 0, 1, AV_OPT_FLAG_ENCODING_PARAM },
     { "pcr_period", "PCR retransmission time in milliseconds",
-      offsetof(MpegTSWrite, pcr_period), AV_OPT_TYPE_INT,
-      { .i64 = PCR_RETRANS_TIME }, 0, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM },
+      offsetof(MpegTSWrite, pcr_period_ms), AV_OPT_TYPE_INT,
+      { .i64 = -1 }, -1, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM },
     { "pat_period", "PAT/PMT retransmission time limit in seconds",
-      offsetof(MpegTSWrite, pat_period), AV_OPT_TYPE_DOUBLE,
-      { .dbl = INT_MAX }, 0, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM },
+      offsetof(MpegTSWrite, pat_period_us), AV_OPT_TYPE_DURATION,
+      { .i64 = PAT_RETRANS_TIME * 1000LL }, 0, INT64_MAX, AV_OPT_FLAG_ENCODING_PARAM },
     { "sdt_period", "SDT retransmission time limit in seconds",
-      offsetof(MpegTSWrite, sdt_period), AV_OPT_TYPE_DOUBLE,
-      { .dbl = INT_MAX }, 0, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM },
+      offsetof(MpegTSWrite, sdt_period_us), AV_OPT_TYPE_DURATION,
+      { .i64 = SDT_RETRANS_TIME * 1000LL }, 0, INT64_MAX, AV_OPT_FLAG_ENCODING_PARAM },
     { NULL },
 };
 
diff --git a/libavformat/mpegvideodec.c b/libavformat/mpegvideodec.c
index aca9621..2d6f81a 100644
--- a/libavformat/mpegvideodec.c
+++ b/libavformat/mpegvideodec.c
@@ -34,7 +34,7 @@
 #define VIDEO_ID                0x000001e0
 #define AUDIO_ID                0x000001c0
 
-static int mpegvideo_probe(AVProbeData *p)
+static int mpegvideo_probe(const AVProbeData *p)
 {
     uint32_t code= -1;
     int pic=0, seq=0, slice=0, pspack=0, vpes=0, apes=0, res=0, sicle=0;
diff --git a/libavformat/mpjpeg.c b/libavformat/mpjpeg.c
index 80f83c5..0404e86 100644
--- a/libavformat/mpjpeg.c
+++ b/libavformat/mpjpeg.c
@@ -34,7 +34,6 @@
 {
     MPJPEGContext *mpj = s->priv_data;
     avio_printf(s->pb, "--%s\r\n", mpj->boundary_tag);
-    avio_flush(s->pb);
     return 0;
 }
 
@@ -50,11 +49,6 @@
     return 0;
 }
 
-static int mpjpeg_write_trailer(AVFormatContext *s)
-{
-    return 0;
-}
-
 static const AVOption options[] = {
     { "boundary_tag",    "Boundary tag", offsetof(MPJPEGContext, boundary_tag),   AV_OPT_TYPE_STRING, {.str = BOUNDARY_TAG}, .flags = AV_OPT_FLAG_ENCODING_PARAM },
     { NULL },
@@ -77,7 +71,6 @@
     .video_codec       = AV_CODEC_ID_MJPEG,
     .write_header      = mpjpeg_write_header,
     .write_packet      = mpjpeg_write_packet,
-    .write_trailer     = mpjpeg_write_trailer,
     .flags             = AVFMT_NOTIMESTAMPS,
     .priv_class        = &mpjpeg_muxer_class,
 };
diff --git a/libavformat/mpjpegdec.c b/libavformat/mpjpegdec.c
index 64d880a..df28804 100644
--- a/libavformat/mpjpegdec.c
+++ b/libavformat/mpjpegdec.c
@@ -111,22 +111,18 @@
     return 0;
 }
 
-static int mpjpeg_read_probe(AVProbeData *p)
+static int mpjpeg_read_probe(const AVProbeData *p)
 {
-    AVIOContext *pb;
+    AVIOContext pb;
     int ret = 0;
     int size = 0;
 
     if (p->buf_size < 2 || p->buf[0] != '-' || p->buf[1] != '-')
         return 0;
 
-    pb = avio_alloc_context(p->buf, p->buf_size, 0, NULL, NULL, NULL, NULL);
-    if (!pb)
-        return 0;
+    ffio_init_context(&pb, p->buf, p->buf_size, 0, NULL, NULL, NULL, NULL);
 
-    ret = (parse_multipart_header(pb, &size, "--", NULL) >= 0) ? AVPROBE_SCORE_MAX : 0;
-
-    avio_context_free(&pb);
+    ret = (parse_multipart_header(&pb, &size, "--", NULL) >= 0) ? AVPROBE_SCORE_MAX : 0;
 
     return ret;
 }
@@ -271,7 +267,7 @@
         while (av_isspace(*start))
             start++;
 
-        if (!av_stristart(start, "boundary=", &start)) {
+        if (av_stristart(start, "boundary=", &start)) {
             end = strchr(start, ';');
             if (end)
                 len = end - start - 1;
@@ -306,8 +302,9 @@
             boundary = mpjpeg_get_boundary(s->pb);
         }
         if (boundary != NULL) {
-            mpjpeg->boundary = boundary;
-            mpjpeg->searchstr = av_asprintf( "\r\n%s\r\n", boundary );
+            mpjpeg->boundary = av_asprintf("--%s", boundary);
+            mpjpeg->searchstr = av_asprintf("\r\n--%s\r\n", boundary);
+            av_freep(&boundary);
         } else {
             mpjpeg->boundary = av_strdup("--");
             mpjpeg->searchstr = av_strdup("\r\n--");
@@ -334,15 +331,11 @@
         int remaining = 0, len;
 
         const int read_chunk = 2048;
-        av_init_packet(pkt);
-        pkt->data = NULL;
-        pkt->size = 0;
+
         pkt->pos  = avio_tell(s->pb);
 
-        /* we may need to return as much as all we've read back to the buffer */
-        ffio_ensure_seekback(s->pb, read_chunk);
-
-        while ((ret = av_append_packet(s->pb, pkt, read_chunk - remaining)) >= 0) {
+        while ((ret = ffio_ensure_seekback(s->pb, read_chunk - remaining)) >= 0 && /* we may need to return as much as all we've read back to the buffer */
+               (ret = av_append_packet(s->pb, pkt, read_chunk - remaining)) >= 0) {
             /* scan the new data */
             char *start;
 
@@ -364,8 +357,6 @@
         /* error or EOF occurred */
         if (ret == AVERROR_EOF) {
             ret = pkt->size > 0 ? pkt->size : AVERROR_EOF;
-        } else {
-            av_packet_unref(pkt);
         }
     }
 
diff --git a/libavformat/mpl2dec.c b/libavformat/mpl2dec.c
index dfcdf5a..4ae1839 100644
--- a/libavformat/mpl2dec.c
+++ b/libavformat/mpl2dec.c
@@ -33,7 +33,7 @@
     FFDemuxSubtitlesQueue q;
 } MPL2Context;
 
-static int mpl2_probe(AVProbeData *p)
+static int mpl2_probe(const AVProbeData *p)
 {
     int i;
     char c;
diff --git a/libavformat/mpsubdec.c b/libavformat/mpsubdec.c
index 1236efa..82c7345 100644
--- a/libavformat/mpsubdec.c
+++ b/libavformat/mpsubdec.c
@@ -27,11 +27,13 @@
 #include "internal.h"
 #include "subtitles.h"
 
+#define TSBASE 10000000
+
 typedef struct {
     FFDemuxSubtitlesQueue q;
 } MPSubContext;
 
-static int mpsub_probe(AVProbeData *p)
+static int mpsub_probe(const AVProbeData *p)
 {
     const char *ptr     = p->buf;
     const char *ptr_end = p->buf + p->buf_size;
@@ -51,21 +53,55 @@
     return 0;
 }
 
+static int parse_line(const char *line, int64_t *value, int64_t *value2)
+{
+    int vi, p1, p2;
+
+    for (vi = 0; vi < 2; vi++) {
+        long long intval, fracval;
+        int n = av_sscanf(line, "%lld%n.%lld%n", &intval, &p1, &fracval, &p2);
+        if (n <= 0 || intval < INT64_MIN / TSBASE || intval > INT64_MAX / TSBASE)
+            return AVERROR_INVALIDDATA;
+
+        intval *= TSBASE;
+
+        if (n == 2) {
+            if (fracval < 0)
+                return AVERROR_INVALIDDATA;
+            for (;p2 - p1 < 7 + 1; p1--)
+                fracval *= 10;
+            for (;p2 - p1 > 7 + 1; p1++)
+                fracval /= 10;
+            if (intval > 0) intval += fracval;
+            else            intval -= fracval;
+            line += p2;
+        } else
+            line += p1;
+
+        *value = intval;
+
+        value = value2;
+    }
+
+    return 0;
+}
+
 static int mpsub_read_header(AVFormatContext *s)
 {
     MPSubContext *mpsub = s->priv_data;
     AVStream *st;
     AVBPrint buf;
-    AVRational pts_info = (AVRational){ 100, 1 }; // ts based by default
+    AVRational pts_info = (AVRational){ TSBASE, 1 }; // ts based by default
     int res = 0;
-    int multiplier = 100;
-    double current_pts = 0;
+    int64_t current_pts = 0;
+    int i;
+    int common_factor = 0;
 
     av_bprint_init(&buf, 0, AV_BPRINT_SIZE_UNLIMITED);
 
     while (!avio_feof(s->pb)) {
         char line[1024];
-        double start, duration;
+        int64_t start, duration;
         int fps, len = ff_get_line(s->pb, line, sizeof(line));
 
         if (!len)
@@ -75,9 +111,8 @@
 
         if (sscanf(line, "FORMAT=%d", &fps) == 1 && fps > 3 && fps < 100) {
             /* frame based timing */
-            pts_info = (AVRational){ fps, 1 };
-            multiplier = 1;
-        } else if (sscanf(line, "%lf %lf", &start, &duration) == 2) {
+            pts_info = (AVRational){ TSBASE * fps, 1 };
+        } else if (parse_line(line, &start, &duration) >= 0) {
             AVPacket *sub;
             const int64_t pos = avio_tell(s->pb);
 
@@ -88,14 +123,36 @@
                     res = AVERROR(ENOMEM);
                     goto end;
                 }
-                sub->pts = (int64_t)(current_pts + start*multiplier);
-                sub->duration = (int)(duration * multiplier);
-                current_pts += (start + duration) * multiplier;
+                if (   current_pts < 0 && start < INT64_MIN - current_pts
+                    || current_pts > 0 && start > INT64_MAX - current_pts) {
+                    res = AVERROR_INVALIDDATA;
+                    goto end;
+                }
+                sub->pts = current_pts + start;
+                if (duration < 0 || sub->pts > INT64_MAX - duration) {
+                    res = AVERROR_INVALIDDATA;
+                    goto end;
+                }
+                sub->duration = duration;
+
+                common_factor = av_gcd(duration, common_factor);
+                common_factor = av_gcd(sub->pts, common_factor);
+
+                current_pts = sub->pts + duration;
                 sub->pos = pos;
             }
         }
     }
 
+    if (common_factor > 1) {
+        common_factor = av_gcd(pts_info.num, common_factor);
+        for (i = 0; i < mpsub->q.nb_subs; i++) {
+            mpsub->q.subs[i].pts      /= common_factor;
+            mpsub->q.subs[i].duration /= common_factor;
+        }
+        pts_info.num /= common_factor;
+    }
+
     st = avformat_new_stream(s, NULL);
     if (!st)
         return AVERROR(ENOMEM);
@@ -106,6 +163,9 @@
     ff_subtitles_queue_finalize(s, &mpsub->q);
 
 end:
+    if (res < 0)
+        ff_subtitles_queue_clean(&mpsub->q);
+
     av_bprint_finalize(&buf, NULL);
     return res;
 }
diff --git a/libavformat/msf.c b/libavformat/msf.c
index 6bd18f2..155f488 100644
--- a/libavformat/msf.c
+++ b/libavformat/msf.c
@@ -23,7 +23,7 @@
 #include "avformat.h"
 #include "internal.h"
 
-static int msf_probe(AVProbeData *p)
+static int msf_probe(const AVProbeData *p)
 {
     if (memcmp(p->buf, "MSF", 3))
         return 0;
diff --git a/libavformat/msnwc_tcp.c b/libavformat/msnwc_tcp.c
index 3c73ac7..650f0d2 100644
--- a/libavformat/msnwc_tcp.c
+++ b/libavformat/msnwc_tcp.c
@@ -36,7 +36,7 @@
  *  uint32_t    ts;     // time
  */
 
-static int msnwc_tcp_probe(AVProbeData *p)
+static int msnwc_tcp_probe(const AVProbeData *p)
 {
     int i;
 
diff --git a/libavformat/mtaf.c b/libavformat/mtaf.c
index b25c2aa..8764a43 100644
--- a/libavformat/mtaf.c
+++ b/libavformat/mtaf.c
@@ -24,7 +24,7 @@
 #include "avformat.h"
 #include "internal.h"
 
-static int mtaf_probe(AVProbeData *p)
+static int mtaf_probe(const AVProbeData *p)
 {
     if (p->buf_size < 0x44)
         return 0;
diff --git a/libavformat/mtv.c b/libavformat/mtv.c
index dcf4aa4..e731d91 100644
--- a/libavformat/mtv.c
+++ b/libavformat/mtv.c
@@ -51,7 +51,7 @@
 
 } MTVDemuxContext;
 
-static int mtv_probe(AVProbeData *p)
+static int mtv_probe(const AVProbeData *p)
 {
     /* we need at least 57 bytes from the header
      * to try parsing all required fields
@@ -171,6 +171,8 @@
     st->codecpar->width           = mtv->img_width;
     st->codecpar->height          = mtv->img_height;
     st->codecpar->extradata       = av_strdup("BottomUp");
+    if (!st->codecpar->extradata)
+        return AVERROR(ENOMEM);
     st->codecpar->extradata_size  = 9;
 
     // audio - mp3
diff --git a/libavformat/musx.c b/libavformat/musx.c
index aff6c31..8537eb7 100644
--- a/libavformat/musx.c
+++ b/libavformat/musx.c
@@ -23,7 +23,7 @@
 #include "avformat.h"
 #include "internal.h"
 
-static int musx_probe(AVProbeData *p)
+static int musx_probe(const AVProbeData *p)
 {
     if (memcmp(p->buf, "MUSX", 4))
         return 0;
diff --git a/libavformat/mux.c b/libavformat/mux.c
index 2847a02..c348b8f 100644
--- a/libavformat/mux.c
+++ b/libavformat/mux.c
@@ -20,29 +20,16 @@
  */
 
 #include "avformat.h"
-#include "avio_internal.h"
 #include "internal.h"
 #include "libavcodec/internal.h"
-#include "libavcodec/bytestream.h"
 #include "libavutil/opt.h"
 #include "libavutil/dict.h"
 #include "libavutil/pixdesc.h"
 #include "libavutil/timestamp.h"
-#include "metadata.h"
-#include "id3v2.h"
 #include "libavutil/avassert.h"
 #include "libavutil/avstring.h"
 #include "libavutil/internal.h"
 #include "libavutil/mathematics.h"
-#include "libavutil/parseutils.h"
-#include "libavutil/time.h"
-#include "riff.h"
-#include "audiointerleave.h"
-#include "url.h"
-#include <stdarg.h>
-#if CONFIG_NETWORK
-#include "network.h"
-#endif
 
 /**
  * @file
@@ -145,7 +132,7 @@
 
 }
 
-int avformat_alloc_output_context2(AVFormatContext **avctx, AVOutputFormat *oformat,
+int avformat_alloc_output_context2(AVFormatContext **avctx, ff_const59 AVOutputFormat *oformat,
                                    const char *format, const char *filename)
 {
     AVFormatContext *s = avformat_alloc_context();
@@ -246,7 +233,7 @@
     AVStream *st;
     AVDictionary *tmp = NULL;
     AVCodecParameters *par = NULL;
-    AVOutputFormat *of = s->oformat;
+    const AVOutputFormat *of = s->oformat;
     const AVCodecDescriptor *desc;
     AVDictionaryEntry *e;
 
@@ -485,6 +472,14 @@
     }
 }
 
+static void deinit_muxer(AVFormatContext *s)
+{
+    if (s->oformat && s->oformat->deinit && s->internal->initialized)
+        s->oformat->deinit(s);
+    s->internal->initialized =
+    s->internal->streams_initialized = 0;
+}
+
 int avformat_init_output(AVFormatContext *s, AVDictionary **options)
 {
     int ret = 0;
@@ -536,19 +531,12 @@
     return streams_already_initialized;
 
 fail:
-    if (s->oformat->deinit)
-        s->oformat->deinit(s);
+    deinit_muxer(s);
     return ret;
 }
 
 #define AV_PKT_FLAG_UNCODED_FRAME 0x2000
 
-/* Note: using sizeof(AVFrame) from outside lavu is unsafe in general, but
-   it is only being used internally to this file as a consistency check.
-   The value is chosen to be very unlikely to appear on its own and to cause
-   immediate failure if used anywhere as a real size. */
-#define UNCODED_FRAME_PACKET_SIZE (INT_MIN / 3 * 2 + (int)sizeof(AVFrame))
-
 
 #if FF_API_COMPUTE_PKT_FIELDS2 && FF_API_LAVF_AVCTX
 FF_DISABLE_DEPRECATION_WARNINGS
@@ -643,7 +631,7 @@
     switch (st->codecpar->codec_type) {
     case AVMEDIA_TYPE_AUDIO:
         frame_size = (pkt->flags & AV_PKT_FLAG_UNCODED_FRAME) ?
-                     ((AVFrame *)pkt->data)->nb_samples :
+                     (*(AVFrame **)pkt->data)->nb_samples :
                      av_get_audio_frame_duration(st->codec, pkt->size);
 
         /* HACK/FIXME, we skip the initial 0 size packets as they are most
@@ -663,8 +651,7 @@
 #endif
 
 /**
- * Make timestamps non negative, move side data from payload to internal struct, call muxer, and restore
- * sidedata.
+ * Shift timestamps and call muxer; the original pts/dts are not kept.
  *
  * FIXME: this function should NEVER get undefined pts/dts beside when the
  * AVFMT_NOTIMESTAMPS is set.
@@ -674,10 +661,6 @@
 static int write_packet(AVFormatContext *s, AVPacket *pkt)
 {
     int ret;
-    int64_t pts_backup, dts_backup;
-
-    pts_backup = pkt->pts;
-    dts_backup = pkt->dts;
 
     // If the timestamp offsetting below is adjusted, adjust
     // ff_interleaved_peek similarly.
@@ -739,10 +722,9 @@
     }
 
     if ((pkt->flags & AV_PKT_FLAG_UNCODED_FRAME)) {
-        AVFrame *frame = (AVFrame *)pkt->data;
-        av_assert0(pkt->size == UNCODED_FRAME_PACKET_SIZE);
-        ret = s->oformat->write_uncoded_frame(s, pkt->stream_index, &frame, 0);
-        av_frame_free(&frame);
+        AVFrame **frame = (AVFrame **)pkt->data;
+        av_assert0(pkt->size == sizeof(*frame));
+        ret = s->oformat->write_uncoded_frame(s, pkt->stream_index, frame, 0);
     } else {
         ret = s->oformat->write_packet(s, pkt);
     }
@@ -753,19 +735,14 @@
             ret = s->pb->error;
     }
 
-    if (ret < 0) {
-        pkt->pts = pts_backup;
-        pkt->dts = dts_backup;
-    }
+    if (ret >= 0)
+        s->streams[pkt->stream_index]->nb_frames++;
 
     return ret;
 }
 
 static int check_packet(AVFormatContext *s, AVPacket *pkt)
 {
-    if (!pkt)
-        return 0;
-
     if (pkt->stream_index < 0 || pkt->stream_index >= s->nb_streams) {
         av_log(s, AV_LOG_ERROR, "Invalid packet stream index: %d\n",
                pkt->stream_index);
@@ -865,7 +842,7 @@
             if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF)
                 return 0;
             av_log(ctx, AV_LOG_ERROR,
-                    "Failed to send packet to filter %s for stream %d\n",
+                    "Failed to receive packet from filter %s for stream %d\n",
                     ctx->filter->name, pkt->stream_index);
             if (s->error_recognition & AV_EF_EXPLODE)
                 return ret;
@@ -875,15 +852,12 @@
     return 1;
 }
 
-int av_write_frame(AVFormatContext *s, AVPacket *pkt)
+int av_write_frame(AVFormatContext *s, AVPacket *in)
 {
+    AVPacket local_pkt, *pkt = &local_pkt;
     int ret;
 
-    ret = prepare_input_packet(s, pkt);
-    if (ret < 0)
-        return ret;
-
-    if (!pkt) {
+    if (!in) {
         if (s->oformat->flags & AVFMT_ALLOW_FLUSH) {
             ret = s->oformat->write_packet(s, NULL);
             flush_if_needed(s);
@@ -894,54 +868,76 @@
         return 1;
     }
 
+    if (in->flags & AV_PKT_FLAG_UNCODED_FRAME) {
+        pkt = in;
+    } else {
+        /* We don't own in, so we have to make sure not to modify it.
+         * The following avoids copying in's data unnecessarily.
+         * Copying side data is unavoidable as a bitstream filter
+         * may change it, e.g. free it on errors. */
+        pkt->buf  = NULL;
+        pkt->data = in->data;
+        pkt->size = in->size;
+        ret = av_packet_copy_props(pkt, in);
+        if (ret < 0)
+            return ret;
+        if (in->buf) {
+            pkt->buf = av_buffer_ref(in->buf);
+            if (!pkt->buf) {
+                ret = AVERROR(ENOMEM);
+                goto fail;
+            }
+        }
+    }
+
+    ret = prepare_input_packet(s, pkt);
+    if (ret < 0)
+        goto fail;
+
     ret = do_packet_auto_bsf(s, pkt);
     if (ret <= 0)
-        return ret;
+        goto fail;
 
 #if FF_API_COMPUTE_PKT_FIELDS2 && FF_API_LAVF_AVCTX
     ret = compute_muxer_pkt_fields(s, s->streams[pkt->stream_index], pkt);
 
     if (ret < 0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
-        return ret;
+        goto fail;
 #endif
 
     ret = write_packet(s, pkt);
-    if (ret >= 0 && s->pb && s->pb->error < 0)
-        ret = s->pb->error;
 
-    if (ret >= 0)
-        s->streams[pkt->stream_index]->nb_frames++;
+fail:
+    // Uncoded frames using the noninterleaved codepath are also freed here
+    av_packet_unref(pkt);
     return ret;
 }
 
 #define CHUNK_START 0x1000
 
 int ff_interleave_add_packet(AVFormatContext *s, AVPacket *pkt,
-                             int (*compare)(AVFormatContext *, AVPacket *, AVPacket *))
+                             int (*compare)(AVFormatContext *, const AVPacket *, const AVPacket *))
 {
     int ret;
     AVPacketList **next_point, *this_pktl;
-    AVStream *st   = s->streams[pkt->stream_index];
-    int chunked    = s->max_chunk_size || s->max_chunk_duration;
+    AVStream *st = s->streams[pkt->stream_index];
+    int chunked  = s->max_chunk_size || s->max_chunk_duration;
 
-    this_pktl      = av_mallocz(sizeof(AVPacketList));
-    if (!this_pktl)
+    this_pktl    = av_malloc(sizeof(AVPacketList));
+    if (!this_pktl) {
+        av_packet_unref(pkt);
         return AVERROR(ENOMEM);
-    if ((pkt->flags & AV_PKT_FLAG_UNCODED_FRAME)) {
-        av_assert0(pkt->size == UNCODED_FRAME_PACKET_SIZE);
-        av_assert0(((AVFrame *)pkt->data)->buf);
-        this_pktl->pkt = *pkt;
-        pkt->buf = NULL;
-        pkt->side_data = NULL;
-        pkt->side_data_elems = 0;
-    } else {
-        if ((ret = av_packet_ref(&this_pktl->pkt, pkt)) < 0) {
-            av_free(this_pktl);
-            return ret;
-        }
+    }
+    if ((ret = av_packet_make_refcounted(pkt)) < 0) {
+        av_free(this_pktl);
+        av_packet_unref(pkt);
+        return ret;
     }
 
-    if (s->streams[pkt->stream_index]->last_in_packet_buffer) {
+    av_packet_move_ref(&this_pktl->pkt, pkt);
+    pkt = &this_pktl->pkt;
+
+    if (st->last_in_packet_buffer) {
         next_point = &(st->last_in_packet_buffer->next);
     } else {
         next_point = &s->internal->packet_buffer;
@@ -953,8 +949,8 @@
         st->interleaver_chunk_duration += pkt->duration;
         if (   (s->max_chunk_size && st->interleaver_chunk_size > s->max_chunk_size)
             || (max && st->interleaver_chunk_duration           > max)) {
-            st->interleaver_chunk_size      = 0;
-            this_pktl->pkt.flags |= CHUNK_START;
+            st->interleaver_chunk_size = 0;
+            pkt->flags |= CHUNK_START;
             if (max && st->interleaver_chunk_duration > max) {
                 int64_t syncoffset = (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO)*max/2;
                 int64_t syncto = av_rescale(pkt->dts + syncoffset, 1, max)*max - syncoffset;
@@ -965,7 +961,7 @@
         }
     }
     if (*next_point) {
-        if (chunked && !(this_pktl->pkt.flags & CHUNK_START))
+        if (chunked && !(pkt->flags & CHUNK_START))
             goto next_non_null;
 
         if (compare(s, &s->internal->packet_buffer_end->pkt, pkt)) {
@@ -986,30 +982,34 @@
 
     this_pktl->next = *next_point;
 
-    s->streams[pkt->stream_index]->last_in_packet_buffer =
-        *next_point                                      = this_pktl;
-
-    av_packet_unref(pkt);
+    st->last_in_packet_buffer = *next_point = this_pktl;
 
     return 0;
 }
 
-static int interleave_compare_dts(AVFormatContext *s, AVPacket *next,
-                                  AVPacket *pkt)
+static int interleave_compare_dts(AVFormatContext *s, const AVPacket *next,
+                                                      const AVPacket *pkt)
 {
     AVStream *st  = s->streams[pkt->stream_index];
     AVStream *st2 = s->streams[next->stream_index];
     int comp      = av_compare_ts(next->dts, st2->time_base, pkt->dts,
                                   st->time_base);
-    if (s->audio_preload && ((st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) != (st2->codecpar->codec_type == AVMEDIA_TYPE_AUDIO))) {
-        int64_t ts = av_rescale_q(pkt ->dts, st ->time_base, AV_TIME_BASE_Q) - s->audio_preload*(st ->codecpar->codec_type == AVMEDIA_TYPE_AUDIO);
-        int64_t ts2= av_rescale_q(next->dts, st2->time_base, AV_TIME_BASE_Q) - s->audio_preload*(st2->codecpar->codec_type == AVMEDIA_TYPE_AUDIO);
-        if (ts == ts2) {
-            ts= ( pkt ->dts* st->time_base.num*AV_TIME_BASE - s->audio_preload*(int64_t)(st ->codecpar->codec_type == AVMEDIA_TYPE_AUDIO)* st->time_base.den)*st2->time_base.den
-               -( next->dts*st2->time_base.num*AV_TIME_BASE - s->audio_preload*(int64_t)(st2->codecpar->codec_type == AVMEDIA_TYPE_AUDIO)*st2->time_base.den)* st->time_base.den;
-            ts2=0;
+    if (s->audio_preload) {
+        int preload  = st ->codecpar->codec_type == AVMEDIA_TYPE_AUDIO;
+        int preload2 = st2->codecpar->codec_type == AVMEDIA_TYPE_AUDIO;
+        if (preload != preload2) {
+            int64_t ts, ts2;
+            preload  *= s->audio_preload;
+            preload2 *= s->audio_preload;
+            ts = av_rescale_q(pkt ->dts, st ->time_base, AV_TIME_BASE_Q) - preload;
+            ts2= av_rescale_q(next->dts, st2->time_base, AV_TIME_BASE_Q) - preload2;
+            if (ts == ts2) {
+                ts  = ((uint64_t)pkt ->dts*st ->time_base.num*AV_TIME_BASE - (uint64_t)preload *st ->time_base.den)*st2->time_base.den
+                    - ((uint64_t)next->dts*st2->time_base.num*AV_TIME_BASE - (uint64_t)preload2*st2->time_base.den)*st ->time_base.den;
+                ts2 = 0;
+            }
+            comp = (ts2 > ts) - (ts2 < ts);
         }
-        comp= (ts>ts2) - (ts<ts2);
     }
 
     if (comp == 0)
@@ -1131,7 +1131,6 @@
 
         return 1;
     } else {
-        av_init_packet(out);
         return 0;
     }
 }
@@ -1165,7 +1164,7 @@
 /**
  * Interleave an AVPacket correctly so it can be muxed.
  * @param out the interleaved packet will be output here
- * @param in the input packet
+ * @param in the input packet; will always be blank on return if not NULL
  * @param flush 1 if no further packets are available as input and all
  *              remaining packets should be output
  * @return 1 if a packet was output, 0 if no packet could be output,
@@ -1186,13 +1185,13 @@
 {
     int ret, flush = 0;
 
-    ret = prepare_input_packet(s, pkt);
-    if (ret < 0)
-        goto fail;
-
     if (pkt) {
         AVStream *st = s->streams[pkt->stream_index];
 
+        ret = prepare_input_packet(s, pkt);
+        if (ret < 0)
+            goto fail;
+
         ret = do_packet_auto_bsf(s, pkt);
         if (ret == 0)
             return 0;
@@ -1220,24 +1219,17 @@
     for (;; ) {
         AVPacket opkt;
         int ret = interleave_packet(s, &opkt, pkt, flush);
-        if (pkt) {
-            memset(pkt, 0, sizeof(*pkt));
-            av_init_packet(pkt);
-            pkt = NULL;
-        }
-        if (ret <= 0) //FIXME cleanup needed for ret<0 ?
+        if (ret <= 0)
             return ret;
 
+        pkt = NULL;
+
         ret = write_packet(s, &opkt);
-        if (ret >= 0)
-            s->streams[opkt.stream_index]->nb_frames++;
 
         av_packet_unref(&opkt);
 
         if (ret < 0)
             return ret;
-        if(s->pb && s->pb->error)
-            return s->pb->error;
     }
 fail:
     av_packet_unref(pkt);
@@ -1257,15 +1249,11 @@
             break;
 
         ret = write_packet(s, &pkt);
-        if (ret >= 0)
-            s->streams[pkt.stream_index]->nb_frames++;
 
         av_packet_unref(&pkt);
 
         if (ret < 0)
             goto fail;
-        if(s->pb && s->pb->error)
-            goto fail;
     }
 
 fail:
@@ -1279,11 +1267,7 @@
         }
     }
 
-    if (s->oformat->deinit)
-        s->oformat->deinit(s);
-
-    s->internal->initialized =
-    s->internal->streams_initialized = 0;
+    deinit_muxer(s);
 
     if (s->pb)
        avio_flush(s->pb);
@@ -1316,18 +1300,10 @@
 
     local_pkt = *pkt;
     local_pkt.stream_index = dst_stream;
-    if (pkt->pts != AV_NOPTS_VALUE)
-        local_pkt.pts = av_rescale_q(pkt->pts,
-                                     src->streams[pkt->stream_index]->time_base,
-                                     dst->streams[dst_stream]->time_base);
-    if (pkt->dts != AV_NOPTS_VALUE)
-        local_pkt.dts = av_rescale_q(pkt->dts,
-                                     src->streams[pkt->stream_index]->time_base,
-                                     dst->streams[dst_stream]->time_base);
-    if (pkt->duration)
-        local_pkt.duration = av_rescale_q(pkt->duration,
-                                          src->streams[pkt->stream_index]->time_base,
-                                          dst->streams[dst_stream]->time_base);
+
+    av_packet_rescale_ts(&local_pkt,
+                         src->streams[pkt->stream_index]->time_base,
+                         dst->streams[dst_stream]->time_base);
 
     if (interleave) ret = av_interleaved_write_frame(dst, &local_pkt);
     else            ret = av_write_frame(dst, &local_pkt);
@@ -1337,22 +1313,45 @@
     return ret;
 }
 
-static int av_write_uncoded_frame_internal(AVFormatContext *s, int stream_index,
-                                           AVFrame *frame, int interleaved)
+static void uncoded_frame_free(void *unused, uint8_t *data)
+{
+    av_frame_free((AVFrame **)data);
+    av_free(data);
+}
+
+static int write_uncoded_frame_internal(AVFormatContext *s, int stream_index,
+                                        AVFrame *frame, int interleaved)
 {
     AVPacket pkt, *pktp;
 
     av_assert0(s->oformat);
-    if (!s->oformat->write_uncoded_frame)
+    if (!s->oformat->write_uncoded_frame) {
+        av_frame_free(&frame);
         return AVERROR(ENOSYS);
+    }
 
     if (!frame) {
         pktp = NULL;
     } else {
+        size_t   bufsize = sizeof(frame) + AV_INPUT_BUFFER_PADDING_SIZE;
+        AVFrame **framep = av_mallocz(bufsize);
+
+        if (!framep)
+            goto fail;
         pktp = &pkt;
         av_init_packet(&pkt);
-        pkt.data = (void *)frame;
-        pkt.size         = UNCODED_FRAME_PACKET_SIZE;
+        pkt.buf = av_buffer_create((void *)framep, bufsize,
+                                   uncoded_frame_free, NULL, 0);
+        if (!pkt.buf) {
+            av_free(framep);
+    fail:
+            av_frame_free(&frame);
+            return AVERROR(ENOMEM);
+        }
+        *framep = frame;
+
+        pkt.data         = (void *)framep;
+        pkt.size         = sizeof(frame);
         pkt.pts          =
         pkt.dts          = frame->pts;
         pkt.duration     = frame->pkt_duration;
@@ -1367,13 +1366,13 @@
 int av_write_uncoded_frame(AVFormatContext *s, int stream_index,
                            AVFrame *frame)
 {
-    return av_write_uncoded_frame_internal(s, stream_index, frame, 0);
+    return write_uncoded_frame_internal(s, stream_index, frame, 0);
 }
 
 int av_interleaved_write_uncoded_frame(AVFormatContext *s, int stream_index,
                                        AVFrame *frame)
 {
-    return av_write_uncoded_frame_internal(s, stream_index, frame, 1);
+    return write_uncoded_frame_internal(s, stream_index, frame, 1);
 }
 
 int av_write_uncoded_frame_query(AVFormatContext *s, int stream_index)
diff --git a/libavformat/mvdec.c b/libavformat/mvdec.c
index fa59617..64166a8 100644
--- a/libavformat/mvdec.c
+++ b/libavformat/mvdec.c
@@ -46,7 +46,7 @@
 
 #define AUDIO_FORMAT_SIGNED 401
 
-static int mv_probe(AVProbeData *p)
+static int mv_probe(const AVProbeData *p)
 {
     if (AV_RB32(p->buf) == MKBETAG('M', 'O', 'V', 'I') &&
         AV_RB16(p->buf + 4) < 3)
@@ -211,6 +211,8 @@
     } else if (!strcmp(name, "ORIENTATION")) {
         if (var_read_int(pb, size) == 1101) {
             st->codecpar->extradata      = av_strdup("BottomUp");
+            if (!st->codecpar->extradata)
+                return AVERROR(ENOMEM);
             st->codecpar->extradata_size = 9;
         }
     } else if (!strcmp(name, "Q_SPATIAL") || !strcmp(name, "Q_TEMPORAL")) {
@@ -361,6 +363,12 @@
         if ((ret = read_table(avctx, NULL, parse_global_var)) < 0)
             return ret;
 
+        if (mv->nb_audio_tracks < 0  || mv->nb_video_tracks < 0 ||
+           (mv->nb_audio_tracks == 0 && mv->nb_video_tracks == 0)) {
+            av_log(avctx, AV_LOG_ERROR, "Stream count is invalid.\n");
+            return AVERROR_INVALIDDATA;
+        }
+
         if (mv->nb_audio_tracks > 1) {
             avpriv_request_sample(avctx, "Multiple audio streams support");
             return AVERROR_PATCHWELCOME;
diff --git a/libavformat/mvi.c b/libavformat/mvi.c
index 9f90faf..ff5c08b 100644
--- a/libavformat/mvi.c
+++ b/libavformat/mvi.c
@@ -45,6 +45,7 @@
     AVIOContext *pb = s->pb;
     AVStream *ast, *vst;
     unsigned int version, frames_count, msecs_per_frame, player_version;
+    int ret;
 
     ast = avformat_new_stream(s, NULL);
     if (!ast)
@@ -54,8 +55,8 @@
     if (!vst)
         return AVERROR(ENOMEM);
 
-    if (ff_alloc_extradata(vst->codecpar, 2))
-        return AVERROR(ENOMEM);
+    if ((ret = ff_alloc_extradata(vst->codecpar, 2)) < 0)
+        return ret;
 
     version                  = avio_r8(pb);
     vst->codecpar->extradata[0] = avio_r8(pb);
diff --git a/libavformat/mxf.c b/libavformat/mxf.c
index 451cbcf..7d154ca 100644
--- a/libavformat/mxf.c
+++ b/libavformat/mxf.c
@@ -131,61 +131,38 @@
     return -1;
 }
 
-static const MXFSamplesPerFrame mxf_spf[] = {
-    { { 1001, 24000 }, { 2002, 0,    0,    0,    0,    0 } }, // FILM 23.976
-    { { 1, 24},        { 2000, 0,    0,    0,    0,    0 } }, // FILM 24
-    { { 1001, 30000 }, { 1602, 1601, 1602, 1601, 1602, 0 } }, // NTSC 29.97
-    { { 1001, 60000 }, { 801,  801,  800,  801,  801,  0 } }, // NTSC 59.94
-    { { 1, 25 },       { 1920, 0,    0,    0,    0,    0 } }, // PAL 25
-    { { 1, 50 },       { 960,  0,    0,    0,    0,    0 } }, // PAL 50
-    { { 1, 60 },       { 800,  0,    0,    0,    0,    0 } },
-};
-
-static const AVRational mxf_time_base[] = {
-    { 1001, 24000 },
-    { 1, 24},
-    { 1001, 30000 },
-    { 1001, 60000 },
-    { 1, 25 },
-    { 1, 50 },
-    { 1, 60 },
-    { 0, 0}
-};
-
-const MXFSamplesPerFrame *ff_mxf_get_samples_per_frame(AVFormatContext *s,
-                                                       AVRational time_base)
-{
-    int idx = av_find_nearest_q_idx(time_base, mxf_time_base);
-    AVRational diff = av_sub_q(time_base, mxf_time_base[idx]);
-
-    diff.num = FFABS(diff.num);
-
-    if (av_cmp_q(diff, (AVRational){1, 1000}) >= 0)
-        return NULL;
-
-    if (av_cmp_q(time_base, mxf_time_base[idx]))
-        av_log(s, AV_LOG_WARNING,
-               "%d/%d input time base matched %d/%d container time base\n",
-               time_base.num, time_base.den,
-               mxf_spf[idx].time_base.num,
-               mxf_spf[idx].time_base.den);
-
-    return &mxf_spf[idx];
-}
-
-static const int mxf_content_package_rates[] = {
-    3, 2, 7, 13, 4, 10, 12,
+/**
+ * See SMPTE 326M-2000 Section 7.2 Content package rate
+ * MXFContentPackageRate->rate is bits b5..b0.
+ */
+static const MXFContentPackageRate mxf_content_package_rates[] = {
+    {  2, { 1,    24    } },
+    {  3, { 1001, 24000 } },
+    {  4, { 1,    25    } },
+    {  6, { 1,    30    } },
+    {  7, { 1001, 30000 } },
+    {  8, { 1   , 48    } },
+    {  9, { 1001, 48000 } },
+    { 10, { 1,    50    } },
+    { 12, { 1,    60    } },
+    { 13, { 1001, 60000 } },
+    { 14, { 1,    72    } },
+    { 15, { 1001, 72000 } },
+    { 16, { 1,    75    } },
+    { 18, { 1,    90    } },
+    { 19, { 1001, 90000 } },
+    { 20, { 1,    96    } },
+    { 21, { 1001, 96000 } },
+    { 22, { 1,    100   } },
+    { 24, { 1,    120   } },
+    { 25, { 1001, 120000} },
+    {0}
 };
 
 int ff_mxf_get_content_package_rate(AVRational time_base)
 {
-    int idx = av_find_nearest_q_idx(time_base, mxf_time_base);
-    AVRational diff = av_sub_q(time_base, mxf_time_base[idx]);
-
-    diff.num = FFABS(diff.num);
-
-    if (av_cmp_q(diff, (AVRational){1, 1000}) >= 0)
-        return -1;
-
-    return mxf_content_package_rates[idx];
+    for (int i = 0; mxf_content_package_rates[i].rate; i++)
+        if (!av_cmp_q(time_base, mxf_content_package_rates[i].tb))
+            return mxf_content_package_rates[i].rate;
+    return 0;
 }
diff --git a/libavformat/mxf.h b/libavformat/mxf.h
index 4394450..f2fff27 100644
--- a/libavformat/mxf.h
+++ b/libavformat/mxf.h
@@ -48,6 +48,7 @@
     EssenceGroup,
     TaggedValue,
     TapeDescriptor,
+    AVCSubDescriptor,
 };
 
 enum MXFFrameLayout {
@@ -58,6 +59,11 @@
     SegmentedFrame,
 };
 
+typedef struct MXFContentPackageRate {
+    int rate;
+    AVRational tb;
+} MXFContentPackageRate;
+
 typedef struct KLVPacket {
     UID key;
     int64_t offset;
@@ -81,18 +87,12 @@
     MXFWrappingIndicatorType wrapping_indicator_type;
 } MXFCodecUL;
 
-typedef struct {
-    struct AVRational time_base;
-    int samples_per_frame[6];
-} MXFSamplesPerFrame;
-
 extern const MXFCodecUL ff_mxf_data_definition_uls[];
 extern const MXFCodecUL ff_mxf_codec_uls[];
 extern const MXFCodecUL ff_mxf_pixel_format_uls[];
 extern const MXFCodecUL ff_mxf_codec_tag_uls[];
 
 int ff_mxf_decode_pixel_layout(const char pixel_layout[16], enum AVPixelFormat *pix_fmt);
-const MXFSamplesPerFrame *ff_mxf_get_samples_per_frame(AVFormatContext *s, AVRational time_base);
 int ff_mxf_get_content_package_rate(AVRational time_base);
 
 
diff --git a/libavformat/mxfdec.c b/libavformat/mxfdec.c
index f49890e..fdd0dd2 100644
--- a/libavformat/mxfdec.c
+++ b/libavformat/mxfdec.c
@@ -131,7 +131,7 @@
     uint8_t origin;
 } MXFSequence;
 
-typedef struct MXFTrack {
+typedef struct MXFTimecodeComponent {
     UID uid;
     enum MXFMetadataSetType type;
     int drop_frame;
@@ -429,19 +429,19 @@
     return s->nb_streams == 1 && s->streams[0]->priv_data ? 0 : -1;
 }
 
-static int find_body_sid_by_offset(MXFContext *mxf, int64_t offset)
+static int find_body_sid_by_absolute_offset(MXFContext *mxf, int64_t offset)
 {
     // we look for partition where the offset is placed
     int a, b, m;
-    int64_t this_partition;
+    int64_t pack_ofs;
 
     a = -1;
     b = mxf->partitions_count;
 
     while (b - a > 1) {
-        m         = (a + b) >> 1;
-        this_partition = mxf->partitions[m].this_partition;
-        if (this_partition <= offset)
+        m = (a + b) >> 1;
+        pack_ofs = mxf->partitions[m].pack_ofs;
+        if (pack_ofs <= offset)
             a = m;
         else
             b = m;
@@ -590,7 +590,7 @@
     if (!IS_KLV_KEY(klv, mxf_essence_element_key))
         return AVERROR_INVALIDDATA;
 
-    body_sid = find_body_sid_by_offset(mxf, klv->offset);
+    body_sid = find_body_sid_by_absolute_offset(mxf, klv->offset);
     index = mxf_get_stream_index(s, klv, body_sid);
     if (index < 0)
         return AVERROR_INVALIDDATA;
@@ -654,6 +654,7 @@
 static int mxf_read_partition_pack(void *arg, AVIOContext *pb, int tag, int size, UID uid, int64_t klv_offset)
 {
     MXFContext *mxf = arg;
+    AVFormatContext *s = mxf->fc;
     MXFPartition *partition, *tmp_part;
     UID op;
     uint64_t footer_partition;
@@ -718,6 +719,12 @@
     }
     nb_essence_containers = avio_rb32(pb);
 
+    if (partition->type == Header) {
+        char str[36];
+        snprintf(str, sizeof(str), "%08x.%08x.%08x.%08x", AV_RB32(&op[0]), AV_RB32(&op[4]), AV_RB32(&op[8]), AV_RB32(&op[12]));
+        av_dict_set(&s->metadata, "operational_pattern_ul", str, 0);
+    }
+
     if (partition->this_partition &&
         partition->previous_partition == partition->this_partition) {
         av_log(mxf->fc, AV_LOG_ERROR,
@@ -1328,6 +1335,7 @@
     { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x01,0x0d,0x01,0x03,0x01,0x02,0x05,0x00,0x00 }, 14,   AV_CODEC_ID_RAWVIDEO, NULL, 15, RawVWrap }, /* uncompressed picture */
     { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x0a,0x0e,0x0f,0x03,0x01,0x02,0x20,0x01,0x01 }, 15,     AV_CODEC_ID_HQ_HQA },
     { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x0a,0x0e,0x0f,0x03,0x01,0x02,0x20,0x02,0x01 }, 15,        AV_CODEC_ID_HQX },
+    { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x0a,0x0e,0x15,0x00,0x04,0x02,0x10,0x00,0x01 }, 16,       AV_CODEC_ID_HEVC, NULL, 15 }, /* Canon XF-HEVC */
     { { 0x06,0x0e,0x2b,0x34,0x01,0x01,0x01,0xff,0x4b,0x46,0x41,0x41,0x00,0x0d,0x4d,0x4f }, 14,   AV_CODEC_ID_RAWVIDEO }, /* Legacy ?? Uncompressed Picture */
     { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },  0,      AV_CODEC_ID_NONE },
 };
@@ -1537,10 +1545,7 @@
  */
 static int64_t mxf_essence_container_end(MXFContext *mxf, int body_sid)
 {
-    int x;
-    int64_t ret = 0;
-
-    for (x = 0; x < mxf->partitions_count; x++) {
+    for (int x = mxf->partitions_count - 1; x >= 0; x--) {
         MXFPartition *p = &mxf->partitions[x];
 
         if (p->body_sid != body_sid)
@@ -1549,10 +1554,10 @@
         if (!p->essence_length)
             return 0;
 
-        ret = p->essence_offset + p->essence_length;
+        return p->essence_offset + p->essence_length;
     }
 
-    return ret;
+    return 0;
 }
 
 /* EditUnit -> absolute offset */
@@ -2012,7 +2017,7 @@
 static int mxf_parse_package_comments(MXFContext *mxf, AVDictionary **pm, MXFPackage *package)
 {
     MXFTaggedValue *tag;
-    int size, i;
+    int i;
     char *key = NULL;
 
     for (i = 0; i < package->comment_count; i++) {
@@ -2020,12 +2025,10 @@
         if (!tag || !tag->name || !tag->value)
             continue;
 
-        size = strlen(tag->name) + 8 + 1;
-        key = av_mallocz(size);
+        key = av_asprintf("comment_%s", tag->name);
         if (!key)
             return AVERROR(ENOMEM);
 
-        snprintf(key, size, "comment_%s", tag->name);
         av_dict_set(pm, key, tag->value, AV_DICT_DONT_STRDUP_KEY);
     }
     return 0;
@@ -2070,15 +2073,15 @@
                 continue;
             }
 
-        if (physical_track->edit_rate.num <= 0 ||
-            physical_track->edit_rate.den <= 0) {
-            av_log(mxf->fc, AV_LOG_WARNING,
-                   "Invalid edit rate (%d/%d) found on structural"
-                   " component #%d, defaulting to 25/1\n",
-                   physical_track->edit_rate.num,
-                   physical_track->edit_rate.den, i);
-            physical_track->edit_rate = (AVRational){25, 1};
-        }
+            if (physical_track->edit_rate.num <= 0 ||
+                physical_track->edit_rate.den <= 0) {
+                av_log(mxf->fc, AV_LOG_WARNING,
+                       "Invalid edit rate (%d/%d) found on structural"
+                       " component #%d, defaulting to 25/1\n",
+                       physical_track->edit_rate.num,
+                       physical_track->edit_rate.den, i);
+                physical_track->edit_rate = (AVRational){25, 1};
+            }
 
             for (k = 0; k < physical_track->sequence->structural_components_count; k++) {
                 if (!(mxf_tc = mxf_resolve_timecode_component(mxf, &physical_track->sequence->structural_components_refs[k])))
@@ -2432,6 +2435,18 @@
                 default:
                     av_log(mxf->fc, AV_LOG_INFO, "Unknown frame layout type: %d\n", descriptor->frame_layout);
             }
+
+            if (st->codecpar->codec_id == AV_CODEC_ID_PRORES) {
+                switch (descriptor->essence_codec_ul[14]) {
+                case 1: st->codecpar->codec_tag = MKTAG('a','p','c','o'); break;
+                case 2: st->codecpar->codec_tag = MKTAG('a','p','c','s'); break;
+                case 3: st->codecpar->codec_tag = MKTAG('a','p','c','n'); break;
+                case 4: st->codecpar->codec_tag = MKTAG('a','p','c','h'); break;
+                case 5: st->codecpar->codec_tag = MKTAG('a','p','4','h'); break;
+                case 6: st->codecpar->codec_tag = MKTAG('a','p','4','x'); break;
+                }
+            }
+
             if (st->codecpar->codec_id == AV_CODEC_ID_RAWVIDEO) {
                 st->codecpar->format = descriptor->pix_fmt;
                 if (st->codecpar->format == AV_PIX_FMT_NONE) {
@@ -2536,6 +2551,24 @@
         }
     }
 
+    for (int i = 0; i < mxf->fc->nb_streams; i++) {
+        MXFTrack *track1 = mxf->fc->streams[i]->priv_data;
+        if (track1 && track1->body_sid) {
+            for (int j = i + 1; j < mxf->fc->nb_streams; j++) {
+                MXFTrack *track2 = mxf->fc->streams[j]->priv_data;
+                if (track2 && track1->body_sid == track2->body_sid && track1->wrapping != track2->wrapping) {
+                    if (track1->wrapping == UnknownWrapped)
+                        track1->wrapping = track2->wrapping;
+                    else if (track2->wrapping == UnknownWrapped)
+                        track2->wrapping = track1->wrapping;
+                    else
+                        av_log(mxf->fc, AV_LOG_ERROR, "stream %d and stream %d have the same BodySID (%d) "
+                                                      "with different wrapping\n", i, j, track1->body_sid);
+                }
+            }
+        }
+    }
+
     ret = 0;
 fail_and_free:
     return ret;
@@ -2544,23 +2577,24 @@
 static int64_t mxf_timestamp_to_int64(uint64_t timestamp)
 {
     struct tm time = { 0 };
+    int msecs;
     time.tm_year = (timestamp >> 48) - 1900;
     time.tm_mon  = (timestamp >> 40 & 0xFF) - 1;
     time.tm_mday = (timestamp >> 32 & 0xFF);
     time.tm_hour = (timestamp >> 24 & 0xFF);
     time.tm_min  = (timestamp >> 16 & 0xFF);
     time.tm_sec  = (timestamp >> 8  & 0xFF);
+    msecs        = (timestamp & 0xFF) * 4;
 
-    /* msvcrt versions of strftime calls the invalid parameter handler
-     * (aborting the process if one isn't set) if the parameters are out
-     * of range. */
+    /* Clip values for legacy reasons. Maybe we should return error instead? */
     time.tm_mon  = av_clip(time.tm_mon,  0, 11);
     time.tm_mday = av_clip(time.tm_mday, 1, 31);
     time.tm_hour = av_clip(time.tm_hour, 0, 23);
     time.tm_min  = av_clip(time.tm_min,  0, 59);
     time.tm_sec  = av_clip(time.tm_sec,  0, 59);
+    msecs        = av_clip(msecs, 0, 999);
 
-    return (int64_t)av_timegm(&time) * 1000000;
+    return (int64_t)av_timegm(&time) * 1000000 + msecs * 1000;
 }
 
 #define SET_STR_METADATA(pb, name, str) do { \
@@ -2578,7 +2612,7 @@
 
 #define SET_TS_METADATA(pb, name, var, str) do { \
     var = avio_rb64(pb); \
-    if ((ret = avpriv_dict_set_timestamp(&s->metadata, name, mxf_timestamp_to_int64(var)) < 0)) \
+    if (var && (ret = avpriv_dict_set_timestamp(&s->metadata, name, mxf_timestamp_to_int64(var))) < 0) \
         return ret; \
 } while (0)
 
@@ -3102,9 +3136,12 @@
         goto end;
     avio_seek(s->pb, file_size - length, SEEK_SET);
     if (klv_read_packet(&klv, s->pb) < 0 ||
-        !IS_KLV_KEY(klv.key, mxf_random_index_pack_key) ||
-        klv.length != length - 20)
+        !IS_KLV_KEY(klv.key, mxf_random_index_pack_key))
         goto end;
+    if (klv.next_klv != file_size || klv.length <= 4 || (klv.length - 4) % 12) {
+        av_log(s, AV_LOG_WARNING, "Invalid RIP KLV length\n");
+        goto end;
+    }
 
     avio_skip(s->pb, klv.length - 12);
     mxf->footer_partition = avio_rb64(s->pb);
@@ -3130,6 +3167,7 @@
 
     if (!mxf_read_sync(s->pb, mxf_header_partition_pack_key, 14)) {
         av_log(s, AV_LOG_ERROR, "could not find header partition pack key\n");
+        //goto fail should not be needed as no metadata sets will have been parsed yet
         return AVERROR_INVALIDDATA;
     }
     avio_seek(s->pb, -14, SEEK_CUR);
@@ -3160,7 +3198,8 @@
 
             if (!mxf->current_partition) {
                 av_log(mxf->fc, AV_LOG_ERROR, "found essence prior to first PartitionPack\n");
-                return AVERROR_INVALIDDATA;
+                ret = AVERROR_INVALIDDATA;
+                goto fail;
             }
 
             if (!mxf->current_partition->first_essence_klv.offset)
@@ -3266,20 +3305,17 @@
 static int64_t mxf_compute_sample_count(MXFContext *mxf, AVStream *st,
                                         int64_t edit_unit)
 {
-    int i, total = 0, size = 0;
     MXFTrack *track = st->priv_data;
     AVRational time_base = av_inv_q(track->edit_rate);
     AVRational sample_rate = av_inv_q(st->time_base);
-    const MXFSamplesPerFrame *spf = NULL;
-    int64_t sample_count;
 
     // For non-audio sample_count equals current edit unit
     if (st->codecpar->codec_type != AVMEDIA_TYPE_AUDIO)
         return edit_unit;
 
-    if ((sample_rate.num / sample_rate.den) == 48000)
-        spf = ff_mxf_get_samples_per_frame(mxf->fc, time_base);
-    if (!spf) {
+    if ((sample_rate.num / sample_rate.den) == 48000) {
+        return av_rescale_q(edit_unit, sample_rate, track->edit_rate);
+    } else {
         int remainder = (sample_rate.num * time_base.num) %
                         (time_base.den * sample_rate.den);
         if (remainder)
@@ -3290,20 +3326,6 @@
                    sample_rate.num, sample_rate.den);
         return av_rescale_q(edit_unit, sample_rate, track->edit_rate);
     }
-
-    while (spf->samples_per_frame[size]) {
-        total += spf->samples_per_frame[size];
-        size++;
-    }
-
-    av_assert2(size);
-
-    sample_count = (edit_unit / size) * (uint64_t)total;
-    for (i = 0; i < edit_unit % size; i++) {
-        sample_count += spf->samples_per_frame[i];
-    }
-
-    return sample_count;
 }
 
 /**
@@ -3435,7 +3457,7 @@
         if (IS_KLV_KEY(klv.key, mxf_essence_element_key) ||
             IS_KLV_KEY(klv.key, mxf_canopus_essence_element_key) ||
             IS_KLV_KEY(klv.key, mxf_avid_essence_element_key)) {
-            int body_sid = find_body_sid_by_offset(mxf, klv.offset);
+            int body_sid = find_body_sid_by_absolute_offset(mxf, klv.offset);
             int index = mxf_get_stream_index(s, &klv, body_sid);
             int64_t next_ofs;
             AVStream *st;
@@ -3469,8 +3491,8 @@
                 } else {
                     if ((size = next_ofs - pos) <= 0) {
                         av_log(s, AV_LOG_ERROR, "bad size: %"PRId64"\n", size);
-                        ret = AVERROR_INVALIDDATA;
-                        goto skip;
+                        mxf->current_klv_data = (KLVPacket){{0}};
+                        return AVERROR_INVALIDDATA;
                     }
                     // We must not overread, because the next edit unit might be in another KLV
                     if (size > max_data_size)
@@ -3542,6 +3564,7 @@
     for (i = 0; i < mxf->metadata_sets_count; i++) {
         mxf_free_metadataset(mxf->metadata_sets + i, 1);
     }
+    mxf->metadata_sets_count = 0;
     av_freep(&mxf->partitions);
     av_freep(&mxf->metadata_sets);
     av_freep(&mxf->aesc);
@@ -3560,7 +3583,7 @@
     return 0;
 }
 
-static int mxf_probe(AVProbeData *p) {
+static int mxf_probe(const AVProbeData *p) {
     const uint8_t *bufp = p->buf;
     const uint8_t *end = p->buf + p->buf_size;
 
diff --git a/libavformat/mxfenc.c b/libavformat/mxfenc.c
index f6acf80..23147e9 100644
--- a/libavformat/mxfenc.c
+++ b/libavformat/mxfenc.c
@@ -49,12 +49,14 @@
 #include "libavcodec/bytestream.h"
 #include "libavcodec/dnxhddata.h"
 #include "libavcodec/dv_profile.h"
-#include "libavcodec/h264.h"
+#include "libavcodec/h264_ps.h"
+#include "libavcodec/golomb.h"
 #include "libavcodec/internal.h"
 #include "audiointerleave.h"
 #include "avformat.h"
 #include "avio_internal.h"
 #include "internal.h"
+#include "avc.h"
 #include "mxf.h"
 #include "config.h"
 
@@ -70,10 +72,10 @@
 } MXFLocalTagPair;
 
 typedef struct MXFIndexEntry {
-    uint8_t flags;
     uint64_t offset;
     unsigned slice_offset; ///< offset of audio slice
     uint16_t temporal_ref;
+    uint8_t flags;
 } MXFIndexEntry;
 
 typedef struct MXFStreamContext {
@@ -81,6 +83,7 @@
     UID track_essence_element_key;
     int index;               ///< index in mxf_essence_container_uls table
     const UID *codec_ul;
+    const UID *container_ul;
     int order;               ///< interleaving order if dts are equal
     int interlaced;          ///< whether picture is interlaced
     int field_dominance;     ///< tff=1, bff=2
@@ -99,6 +102,7 @@
     int max_gop;             ///< maximum gop size, used by mpeg-2 descriptor
     int b_picture_count;     ///< maximum number of consecutive b pictures, used in mpeg-2 descriptor
     int low_delay;           ///< low delay, used in mpeg-2 descriptor
+    int avc_intra;
 } MXFStreamContext;
 
 typedef struct MXFContainerEssenceEntry {
@@ -119,46 +123,14 @@
     INDEX_MPEG2 = 0,
     INDEX_AES3,
     INDEX_WAV,
-    INDEX_D10_625_50_50_VIDEO,
-    INDEX_D10_625_50_50_AUDIO,
-    INDEX_D10_525_60_50_VIDEO,
-    INDEX_D10_525_60_50_AUDIO,
-    INDEX_D10_625_50_40_VIDEO,
-    INDEX_D10_625_50_40_AUDIO,
-    INDEX_D10_525_60_40_VIDEO,
-    INDEX_D10_525_60_40_AUDIO,
-    INDEX_D10_625_50_30_VIDEO,
-    INDEX_D10_625_50_30_AUDIO,
-    INDEX_D10_525_60_30_VIDEO,
-    INDEX_D10_525_60_30_AUDIO,
+    INDEX_D10_VIDEO,
+    INDEX_D10_AUDIO,
     INDEX_DV,
-    INDEX_DV25_525_60,
-    INDEX_DV25_625_50,
-    INDEX_DV25_525_60_IEC,
-    INDEX_DV25_625_50_IEC,
-    INDEX_DV50_525_60,
-    INDEX_DV50_625_50,
-    INDEX_DV100_1080_60,
-    INDEX_DV100_1080_50,
-    INDEX_DV100_720_60,
-    INDEX_DV100_720_50,
-    INDEX_DNXHD_1080p_10bit_HIGH,
-    INDEX_DNXHD_1080p_8bit_MEDIUM,
-    INDEX_DNXHD_1080p_8bit_HIGH,
-    INDEX_DNXHD_1080i_10bit_HIGH,
-    INDEX_DNXHD_1080i_8bit_MEDIUM,
-    INDEX_DNXHD_1080i_8bit_HIGH,
-    INDEX_DNXHD_720p_10bit,
-    INDEX_DNXHD_720p_8bit_HIGH,
-    INDEX_DNXHD_720p_8bit_MEDIUM,
-    INDEX_DNXHD_720p_8bit_LOW,
-    INDEX_DNXHR_LB,
-    INDEX_DNXHR_SQ,
-    INDEX_DNXHR_HQ,
-    INDEX_DNXHR_HQX,
-    INDEX_DNXHR_444,
+    INDEX_DNXHD,
     INDEX_JPEG2000,
     INDEX_H264,
+    INDEX_S436M,
+    INDEX_PRORES,
 };
 
 static const struct {
@@ -169,15 +141,17 @@
     { AV_CODEC_ID_PCM_S24LE,  INDEX_AES3 },
     { AV_CODEC_ID_PCM_S16LE,  INDEX_AES3 },
     { AV_CODEC_ID_DVVIDEO,    INDEX_DV },
-    { AV_CODEC_ID_DNXHD,      INDEX_DNXHD_1080p_10bit_HIGH },
+    { AV_CODEC_ID_DNXHD,      INDEX_DNXHD },
     { AV_CODEC_ID_JPEG2000,   INDEX_JPEG2000 },
     { AV_CODEC_ID_H264,       INDEX_H264 },
+    { AV_CODEC_ID_PRORES,     INDEX_PRORES },
     { AV_CODEC_ID_NONE }
 };
 
 static void mxf_write_wav_desc(AVFormatContext *s, AVStream *st);
 static void mxf_write_aes3_desc(AVFormatContext *s, AVStream *st);
 static void mxf_write_mpegvideo_desc(AVFormatContext *s, AVStream *st);
+static void mxf_write_h264_desc(AVFormatContext *s, AVStream *st);
 static void mxf_write_cdci_desc(AVFormatContext *s, AVStream *st);
 static void mxf_write_generic_sound_desc(AVFormatContext *s, AVStream *st);
 static void mxf_write_s436m_anc_desc(AVFormatContext *s, AVStream *st);
@@ -195,193 +169,26 @@
       { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x16,0x01,0x01,0x00 },
       { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x02,0x02,0x01,0x00,0x00,0x00,0x00 },
       mxf_write_wav_desc },
-    // D-10 625/50 PAL 50mb/s
+    // D-10 Video
     { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x01,0x01 },
       { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x05,0x01,0x01,0x00 },
       { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x01,0x02,0x01,0x01 },
       mxf_write_cdci_desc },
+    // D-10 Audio
     { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x01,0x01 },
       { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x06,0x01,0x10,0x00 },
       { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x02,0x02,0x01,0x00,0x00,0x00,0x00 },
       mxf_write_generic_sound_desc },
-    // D-10 525/60 NTSC 50mb/s
-    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x02,0x01 },
-      { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x05,0x01,0x01,0x00 },
-      { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x01,0x02,0x01,0x02 },
-      mxf_write_cdci_desc },
-    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x02,0x01 },
-      { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x06,0x01,0x10,0x00 },
-      { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x02,0x02,0x01,0x00,0x00,0x00,0x00 },
-      mxf_write_generic_sound_desc },
-    // D-10 625/50 PAL 40mb/s
-    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x03,0x01 },
-      { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x05,0x01,0x01,0x00 },
-      { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x01,0x02,0x01,0x03 },
-      mxf_write_cdci_desc },
-    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x03,0x01 },
-      { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x06,0x01,0x10,0x00 },
-      { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x02,0x02,0x01,0x00,0x00,0x00,0x00 },
-      mxf_write_generic_sound_desc },
-    // D-10 525/60 NTSC 40mb/s
-    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x04,0x01 },
-      { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x05,0x01,0x01,0x00 },
-      { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x01,0x02,0x01,0x04 },
-      mxf_write_cdci_desc },
-    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x04,0x01 },
-      { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x06,0x01,0x10,0x00 },
-      { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x02,0x02,0x01,0x00,0x00,0x00,0x00 },
-      mxf_write_generic_sound_desc },
-    // D-10 625/50 PAL 30mb/s
-    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x05,0x01 },
-      { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x05,0x01,0x01,0x00 },
-      { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x01,0x02,0x01,0x05 },
-      mxf_write_cdci_desc },
-    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x05,0x01 },
-      { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x06,0x01,0x10,0x00 },
-      { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x02,0x02,0x01,0x00,0x00,0x00,0x00 },
-      mxf_write_generic_sound_desc },
-    // D-10 525/60 NTSC 30mb/s
-    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x06,0x01 },
-      { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x05,0x01,0x01,0x00 },
-      { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x01,0x02,0x01,0x06 },
-      mxf_write_cdci_desc },
-    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x06,0x01 },
-      { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x06,0x01,0x10,0x00 },
-      { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x02,0x02,0x01,0x00,0x00,0x00,0x00 },
-      mxf_write_generic_sound_desc },
-    // DV Unknown
+    // DV
     { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x02,0x7F,0x01 },
       { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x18,0x01,0x01,0x00 },
       { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x02,0x00,0x00,0x00 },
       mxf_write_cdci_desc },
-
-    // DV25 525/60
-    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x02,0x40,0x01 },
-      { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x18,0x01,0x01,0x00 },
-      { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x02,0x02,0x01,0x00 },
-      mxf_write_cdci_desc },
-    // DV25 625/50
-    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x02,0x41,0x01 },
-      { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x18,0x01,0x01,0x00 },
-      { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x02,0x02,0x02,0x00 },
-      mxf_write_cdci_desc },
-
-    // IEC DV25 525/60
-    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x02,0x01,0x01 },
-      { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x18,0x01,0x01,0x00 },
-      { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x02,0x02,0x01,0x00 },
-      mxf_write_cdci_desc },
-    // IEC DV25 625/50
-    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x02,0x02,0x01 },
-      { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x18,0x01,0x01,0x00 },
-      { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x02,0x01,0x02,0x00 },
-      mxf_write_cdci_desc },
-
-      // DV50 525/60
-    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x02,0x50,0x01 },
-      { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x18,0x01,0x01,0x00 },
-      { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x02,0x02,0x03,0x00 },
-      mxf_write_cdci_desc },
-    // DV50 625/50
-    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x02,0x51,0x01 },
-      { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x18,0x01,0x01,0x00 },
-      { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x02,0x02,0x04,0x00 },
-      mxf_write_cdci_desc },
-    // DV100 1080/60
-    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x02,0x60,0x01 },
-      { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x18,0x01,0x01,0x00 },
-      { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x02,0x02,0x05,0x00 },
-      mxf_write_cdci_desc },
-    // DV100 1080/50
-    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x02,0x61,0x01 },
-      { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x18,0x01,0x01,0x00 },
-      { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x02,0x02,0x06,0x00 },
-      mxf_write_cdci_desc },
-    // DV100 720/60
-    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x02,0x62,0x01 },
-      { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x18,0x01,0x01,0x00 },
-      { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x02,0x02,0x07,0x00 },
-      mxf_write_cdci_desc },
-    // DV100 720/50
-    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x02,0x63,0x01 },
-      { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x18,0x01,0x01,0x00 },
-      { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x02,0x02,0x08,0x00 },
-      mxf_write_cdci_desc },
-    // DNxHD 1080p 10bit high
+    // DNxHD
     { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x11,0x01,0x00 },
       { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x15,0x01,0x05,0x00 },
       { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0A,0x04,0x01,0x02,0x02,0x71,0x01,0x00,0x00 },
       mxf_write_cdci_desc },
-    // DNxHD 1080p 8bit medium
-    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x11,0x01,0x00 },
-      { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x15,0x01,0x05,0x00 },
-      { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0A,0x04,0x01,0x02,0x02,0x71,0x03,0x00,0x00 },
-      mxf_write_cdci_desc },
-    // DNxHD 1080p 8bit high
-    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x11,0x01,0x00 },
-      { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x15,0x01,0x05,0x00 },
-      { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0A,0x04,0x01,0x02,0x02,0x71,0x04,0x00,0x00 },
-      mxf_write_cdci_desc },
-    // DNxHD 1080i 10bit high
-    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x11,0x01,0x00 },
-      { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x15,0x01,0x05,0x00 },
-      { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0A,0x04,0x01,0x02,0x02,0x71,0x07,0x00,0x00 },
-      mxf_write_cdci_desc },
-    // DNxHD 1080i 8bit medium
-    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x11,0x01,0x00 },
-      { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x15,0x01,0x05,0x00 },
-      { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0A,0x04,0x01,0x02,0x02,0x71,0x08,0x00,0x00 },
-      mxf_write_cdci_desc },
-    // DNxHD 1080i 8bit high
-    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x11,0x01,0x00 },
-      { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x15,0x01,0x05,0x00 },
-      { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0A,0x04,0x01,0x02,0x02,0x71,0x09,0x00,0x00 },
-      mxf_write_cdci_desc },
-    // DNxHD 720p 10bit
-    { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x01,0x0d,0x01,0x03,0x01,0x02,0x11,0x01,0x00 },
-      { 0x06,0x0e,0x2b,0x34,0x01,0x02,0x01,0x01,0x0d,0x01,0x03,0x01,0x15,0x01,0x05,0x00 },
-      { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x0A,0x04,0x01,0x02,0x02,0x71,0x10,0x00,0x00 },
-      mxf_write_cdci_desc },
-    // DNxHD 720p 8bit high
-    { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x01,0x0d,0x01,0x03,0x01,0x02,0x11,0x01,0x00 },
-      { 0x06,0x0e,0x2b,0x34,0x01,0x02,0x01,0x01,0x0d,0x01,0x03,0x01,0x15,0x01,0x05,0x00 },
-      { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x0A,0x04,0x01,0x02,0x02,0x71,0x11,0x00,0x00 },
-      mxf_write_cdci_desc },
-    // DNxHD 720p 8bit medium
-    { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x01,0x0d,0x01,0x03,0x01,0x02,0x11,0x01,0x00 },
-      { 0x06,0x0e,0x2b,0x34,0x01,0x02,0x01,0x01,0x0d,0x01,0x03,0x01,0x15,0x01,0x05,0x00 },
-      { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x0A,0x04,0x01,0x02,0x02,0x71,0x12,0x00,0x00 },
-      mxf_write_cdci_desc },
-    // DNxHD 720p 8bit low
-    { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x01,0x0d,0x01,0x03,0x01,0x02,0x11,0x01,0x00 },
-      { 0x06,0x0e,0x2b,0x34,0x01,0x02,0x01,0x01,0x0d,0x01,0x03,0x01,0x15,0x01,0x05,0x00 },
-      { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x0A,0x04,0x01,0x02,0x02,0x71,0x13,0x00,0x00 },
-      mxf_write_cdci_desc },
-    // DNxHR LB - CID 1274
-    { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x01,0x0d,0x01,0x03,0x01,0x02,0x11,0x01,0x00 },
-      { 0x06,0x0e,0x2b,0x34,0x01,0x02,0x01,0x01,0x0d,0x01,0x03,0x01,0x15,0x01,0x05,0x00 },
-      { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x0D,0x04,0x01,0x02,0x02,0x71,0x28,0x00,0x00 },
-      mxf_write_cdci_desc },
-    // DNxHR SQ - CID 1273
-    { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x01,0x0d,0x01,0x03,0x01,0x02,0x11,0x01,0x00 },
-      { 0x06,0x0e,0x2b,0x34,0x01,0x02,0x01,0x01,0x0d,0x01,0x03,0x01,0x15,0x01,0x05,0x00 },
-      { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x0D,0x04,0x01,0x02,0x02,0x71,0x27,0x00,0x00 },
-      mxf_write_cdci_desc },
-    // DNxHR HQ - CID 1272
-    { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x01,0x0d,0x01,0x03,0x01,0x02,0x11,0x01,0x00 },
-      { 0x06,0x0e,0x2b,0x34,0x01,0x02,0x01,0x01,0x0d,0x01,0x03,0x01,0x15,0x01,0x05,0x00 },
-      { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x0D,0x04,0x01,0x02,0x02,0x71,0x26,0x00,0x00 },
-      mxf_write_cdci_desc },
-    // DNxHR HQX - CID 1271
-    { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x01,0x0d,0x01,0x03,0x01,0x02,0x11,0x01,0x00 },
-      { 0x06,0x0e,0x2b,0x34,0x01,0x02,0x01,0x01,0x0d,0x01,0x03,0x01,0x15,0x01,0x05,0x00 },
-      { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x0D,0x04,0x01,0x02,0x02,0x71,0x25,0x00,0x00 },
-      mxf_write_cdci_desc },
-    // DNxHR 444 - CID 1270
-    { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x01,0x0d,0x01,0x03,0x01,0x02,0x11,0x01,0x00 },
-      { 0x06,0x0e,0x2b,0x34,0x01,0x02,0x01,0x01,0x0d,0x01,0x03,0x01,0x15,0x01,0x05,0x00 },
-      { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x0D,0x04,0x01,0x02,0x02,0x71,0x24,0x00,0x00 },
-      mxf_write_cdci_desc },
     // JPEG2000
     { { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x07,0x0d,0x01,0x03,0x01,0x02,0x0c,0x01,0x00 },
       { 0x06,0x0e,0x2b,0x34,0x01,0x02,0x01,0x01,0x0d,0x01,0x03,0x01,0x15,0x01,0x08,0x00 },
@@ -391,18 +198,41 @@
     { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x0D,0x01,0x03,0x01,0x02,0x10,0x60,0x01 },
       { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x15,0x01,0x05,0x00 },
       { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x01,0x00,0x00,0x00 },
-      mxf_write_mpegvideo_desc },
+      mxf_write_h264_desc },
     // S436M ANC
     { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x0D,0x01,0x03,0x01,0x02,0x0e,0x00,0x00 },
       { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0D,0x01,0x03,0x01,0x17,0x01,0x02,0x00 },
       { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x01,0x01,0x5C,0x00 },
       mxf_write_s436m_anc_desc },
+    // ProRes
+    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0d,0x0d,0x01,0x03,0x01,0x02,0x1c,0x01,0x00 },
+      { 0x06,0x0E,0x2B,0x34,0x01,0x02,0x01,0x01,0x0d,0x01,0x03,0x01,0x15,0x01,0x17,0x00 },
+      { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0d,0x04,0x01,0x02,0x02,0x03,0x06,0x03,0x00 },
+      mxf_write_cdci_desc },
     { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },
       { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },
       { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },
       NULL },
 };
 
+static const UID mxf_d10_codec_uls[] = {
+    { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x01,0x02,0x01,0x01 }, // D-10 625/50 PAL 50mb/s
+    { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x01,0x02,0x01,0x02 }, // D-10 525/50 NTSC 50mb/s
+    { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x01,0x02,0x01,0x03 }, // D-10 625/50 PAL 40mb/s
+    { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x01,0x02,0x01,0x04 }, // D-10 525/50 NTSC 40mb/s
+    { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x01,0x02,0x01,0x05 }, // D-10 625/50 PAL 30mb/s
+    { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x01,0x02,0x01,0x06 }, // D-10 525/50 NTSC 30mb/s
+};
+
+static const UID mxf_d10_container_uls[] = {
+    { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x01,0x01 }, // D-10 625/50 PAL 50mb/s
+    { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x02,0x01 }, // D-10 525/50 NTSC 50mb/s
+    { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x03,0x01 }, // D-10 625/50 PAL 40mb/s
+    { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x04,0x01 }, // D-10 525/50 NTSC 40mb/s
+    { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x05,0x01 }, // D-10 625/50 PAL 30mb/s
+    { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x06,0x01 }, // D-10 525/50 NTSC 30mb/s
+};
+
 typedef struct MXFContext {
     AVClass *av_class;
     int64_t footer_partition_offset;
@@ -579,6 +409,13 @@
     { 0x3D0A, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x05,0x04,0x02,0x03,0x02,0x01,0x00,0x00,0x00}}, /* Block Align */
 };
 
+static const MXFLocalTagPair mxf_avc_subdescriptor_local_tags[] = {
+    { 0x8100, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x09,0x06,0x01,0x01,0x04,0x06,0x10,0x00,0x00}}, /* SubDescriptors */
+    { 0x8200, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x0E,0x04,0x01,0x06,0x06,0x01,0x0E,0x00,0x00}}, /* AVC Decoding Delay */
+    { 0x8201, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x0E,0x04,0x01,0x06,0x06,0x01,0x0A,0x00,0x00}}, /* AVC Profile */
+    { 0x8202, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x0E,0x04,0x01,0x06,0x06,0x01,0x0D,0x00,0x00}}, /* AVC Level */
+};
+
 static const MXFLocalTagPair mxf_user_comments_local_tag[] = {
     { 0x4406, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x03,0x02,0x01,0x02,0x0C,0x00,0x00,0x00}}, /* User Comments */
     { 0x5001, {0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x02,0x03,0x02,0x01,0x02,0x09,0x01,0x00,0x00}}, /* Name */
@@ -618,15 +455,14 @@
 static int klv_encode_ber_length(AVIOContext *pb, uint64_t len)
 {
     // Determine the best BER size
-    int size;
-    if (len < 128) {
+    int size = klv_ber_length(len);
+    if (size == 1) {
         //short form
         avio_w8(pb, len);
         return 1;
     }
 
-    size = (av_log2(len) >> 3) + 1;
-
+    size --;
     // long form
     avio_w8(pb, 0x80 + size);
     while(size) {
@@ -660,15 +496,33 @@
     return -1;
 }
 
+static void mxf_write_local_tags(AVIOContext *pb, const MXFLocalTagPair *local_tags, int count)
+{
+    int i;
+    for (i = 0; i < count; i++) {
+        avio_wb16(pb, local_tags[i].local_tag);
+        avio_write(pb, local_tags[i].uid, 16);
+    }
+}
+
 static void mxf_write_primer_pack(AVFormatContext *s)
 {
     MXFContext *mxf = s->priv_data;
     AVIOContext *pb = s->pb;
     int local_tag_number, i = 0;
+    int avc_tags_count = 0;
 
     local_tag_number = FF_ARRAY_ELEMS(mxf_local_tag_batch);
     local_tag_number += mxf->store_user_comments * FF_ARRAY_ELEMS(mxf_user_comments_local_tag);
 
+    for (i = 0; i < s->nb_streams; i++) {
+        MXFStreamContext *sc = s->streams[i]->priv_data;
+        if (s->streams[i]->codecpar->codec_id == AV_CODEC_ID_H264 && !sc->avc_intra) {
+            avc_tags_count = FF_ARRAY_ELEMS(mxf_avc_subdescriptor_local_tags);
+            local_tag_number += avc_tags_count;
+        }
+    }
+
     avio_write(pb, primer_pack_key, 16);
     klv_encode_ber_length(pb, local_tag_number * 18 + 8);
 
@@ -684,6 +538,8 @@
             avio_wb16(pb, mxf_user_comments_local_tag[i].local_tag);
             avio_write(pb, mxf_user_comments_local_tag[i].uid, 16);
         }
+    if (avc_tags_count > 0)
+        mxf_write_local_tags(pb, mxf_avc_subdescriptor_local_tags, avc_tags_count);
 }
 
 static void mxf_write_local_tag(AVIOContext *pb, int size, int tag)
@@ -698,16 +554,6 @@
     avio_wb24(pb, value);
 }
 
-static void mxf_free(AVFormatContext *s)
-{
-    int i;
-
-    for (i = 0; i < s->nb_streams; i++) {
-        AVStream *st = s->streams[i];
-        av_freep(&st->priv_data);
-    }
-}
-
 static const MXFCodecUL *mxf_get_data_definition_ul(int type)
 {
     const MXFCodecUL *uls = ff_mxf_data_definition_uls;
@@ -736,7 +582,7 @@
         // check first track of essence container type and only write it once
         if (sc->track_essence_element_key[15] != 0)
             continue;
-        avio_write(pb, mxf_essence_container_uls[sc->index].container_ul, 16);
+        avio_write(pb, *sc->container_ul, 16);
         if (c->essence_container_count == 1)
             break;
     }
@@ -1146,7 +992,7 @@
         ul = multiple_desc_ul;
     else {
         MXFStreamContext *sc = s->streams[0]->priv_data;
-        ul = mxf_essence_container_uls[sc->index].container_ul;
+        ul = *sc->container_ul;
     }
     avio_write(pb, ul, 16);
 
@@ -1190,7 +1036,7 @@
     }
 
     mxf_write_local_tag(pb, 16, 0x3004);
-    avio_write(pb, mxf_essence_container_uls[sc->index].container_ul, 16);
+    avio_write(pb, *sc->container_ul, 16);
 
     return pos;
 }
@@ -1202,6 +1048,8 @@
 static const UID mxf_cdci_descriptor_key      = { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0D,0x01,0x01,0x01,0x01,0x01,0x28,0x00 };
 static const UID mxf_generic_sound_descriptor_key = { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0D,0x01,0x01,0x01,0x01,0x01,0x42,0x00 };
 
+static const UID mxf_avc_subdescriptor_key = { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x6E,0x00 };
+
 static int get_trc(UID ul, enum AVColorTransferCharacteristic trc)
 {
     switch (trc){
@@ -1234,7 +1082,7 @@
 {
     MXFStreamContext *sc = st->priv_data;
     AVIOContext *pb = s->pb;
-    int stored_width  = (st->codecpar->width +15)/16*16;
+    int stored_width = 0;
     int stored_height = (st->codecpar->height+15)/16*16;
     int display_height;
     int f1, f2;
@@ -1243,6 +1091,15 @@
 
     get_trc(transfer_ul, st->codecpar->color_trc);
 
+    if (st->codecpar->codec_id == AV_CODEC_ID_DVVIDEO) {
+        if (st->codecpar->height == 1080)
+            stored_width = 1920;
+        else if (st->codecpar->height == 720)
+            stored_width = 1280;
+    }
+    if (!stored_width)
+        stored_width = (st->codecpar->width+15)/16*16;
+
     mxf_write_local_tag(pb, 4, 0x3203);
     avio_wb32(pb, stored_width);
 
@@ -1265,7 +1122,7 @@
 
     //Sampled width
     mxf_write_local_tag(pb, 4, 0x3205);
-    avio_wb32(pb, st->codecpar->width);
+    avio_wb32(pb, stored_width);
 
     //Samples height
     mxf_write_local_tag(pb, 4, 0x3204);
@@ -1280,7 +1137,7 @@
     avio_wb32(pb, 0);
 
     mxf_write_local_tag(pb, 4, 0x3209);
-    avio_wb32(pb, st->codecpar->width);
+    avio_wb32(pb, stored_width);
 
     if (st->codecpar->height == 608) // PAL + VBI
         display_height = 576;
@@ -1363,7 +1220,7 @@
     default:   f1 =  0; f2 =   0; break;
     }
 
-    if (!sc->interlaced) {
+    if (!sc->interlaced && f2) {
         f2  = 0;
         f1 *= 2;
     }
@@ -1393,6 +1250,13 @@
         avio_w8(pb, sc->field_dominance);
     }
 
+    if (st->codecpar->codec_id == AV_CODEC_ID_H264 && !sc->avc_intra) {
+        // write avc sub descriptor ref
+        mxf_write_local_tag(pb, 8 + 16, 0x8100);
+        mxf_write_refs_count(pb, 1);
+        mxf_write_uuid(pb, AVCSubDescriptor, 0);
+    }
+
     return pos;
 }
 
@@ -1405,10 +1269,50 @@
     avio_seek(pb, cur_pos, SEEK_SET);
 }
 
+static void mxf_write_avc_subdesc(AVFormatContext *s, AVStream *st)
+{
+    AVIOContext *pb = s->pb;
+    int64_t pos;
+
+    avio_write(pb, mxf_avc_subdescriptor_key, 16);
+    klv_encode_ber4_length(pb, 0);
+    pos = avio_tell(pb);
+
+    mxf_write_local_tag(pb, 16, 0x3C0A);
+    mxf_write_uuid(pb, AVCSubDescriptor, 0);
+
+    mxf_write_local_tag(pb, 1, 0x8200);
+    avio_w8(pb, 0xFF); // AVC Decoding Delay, unknown
+
+    mxf_write_local_tag(pb, 1, 0x8201);
+    avio_w8(pb, st->codecpar->profile); // AVC Profile
+
+    mxf_write_local_tag(pb, 1, 0x8202);
+    avio_w8(pb, st->codecpar->level); // AVC Level
+
+    mxf_update_klv_size(s->pb, pos);
+}
+
 static void mxf_write_cdci_desc(AVFormatContext *s, AVStream *st)
 {
     int64_t pos = mxf_write_cdci_common(s, st, mxf_cdci_descriptor_key);
     mxf_update_klv_size(s->pb, pos);
+
+    if (st->codecpar->codec_id == AV_CODEC_ID_H264) {
+        mxf_write_avc_subdesc(s, st);
+    }
+}
+
+static void mxf_write_h264_desc(AVFormatContext *s, AVStream *st)
+{
+    MXFStreamContext *sc = st->priv_data;
+    if (sc->avc_intra) {
+        mxf_write_mpegvideo_desc(s, st);
+    } else {
+        int64_t pos = mxf_write_cdci_common(s, st, mxf_cdci_descriptor_key);
+        mxf_update_klv_size(s->pb, pos);
+        mxf_write_avc_subdesc(s, st);
+    }
 }
 
 static void mxf_write_s436m_anc_desc(AVFormatContext *s, AVStream *st)
@@ -1843,7 +1747,7 @@
             avio_wb32(pb, KAG_SIZE); // system item size including klv fill
         } else { // audio or data track
             if (!audio_frame_size) {
-                audio_frame_size = sc->aic.samples[0]*sc->aic.sample_size;
+                audio_frame_size = sc->frame_size;
                 audio_frame_size += klv_fill_size(audio_frame_size);
             }
             avio_w8(pb, 1);
@@ -1940,8 +1844,7 @@
         index_byte_count = 80;
 
     if (index_byte_count) {
-        // add encoded ber length
-        index_byte_count += 16 + klv_ber_length(index_byte_count);
+        index_byte_count += 16 + 4; // add encoded ber4 length
         index_byte_count += klv_fill_size(index_byte_count);
     }
 
@@ -2023,107 +1926,160 @@
     }
 
     if(key)
-        avio_flush(pb);
+        avio_write_marker(pb, AV_NOPTS_VALUE, AVIO_DATA_MARKER_FLUSH_POINT);
 
     return 0;
 }
 
-static int mxf_parse_dnxhd_frame(AVFormatContext *s, AVStream *st,
-AVPacket *pkt)
+static const struct {
+    int profile;
+    UID codec_ul;
+} mxf_prores_codec_uls[] = {
+    { FF_PROFILE_PRORES_PROXY,    { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0d,0x04,0x01,0x02,0x02,0x03,0x06,0x01,0x00 } },
+    { FF_PROFILE_PRORES_LT,       { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0d,0x04,0x01,0x02,0x02,0x03,0x06,0x02,0x00 } },
+    { FF_PROFILE_PRORES_STANDARD, { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0d,0x04,0x01,0x02,0x02,0x03,0x06,0x03,0x00 } },
+    { FF_PROFILE_PRORES_HQ,       { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0d,0x04,0x01,0x02,0x02,0x03,0x06,0x04,0x00 } },
+    { FF_PROFILE_PRORES_4444,     { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0d,0x04,0x01,0x02,0x02,0x03,0x06,0x05,0x00 } },
+    { FF_PROFILE_PRORES_XQ,       { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0d,0x04,0x01,0x02,0x02,0x03,0x06,0x06,0x00 } },
+};
+
+static int mxf_parse_prores_frame(AVFormatContext *s, AVStream *st, AVPacket *pkt)
 {
     MXFContext *mxf = s->priv_data;
     MXFStreamContext *sc = st->priv_data;
+    int i, profile;
+
+    if (mxf->header_written)
+        return 1;
+
+    sc->codec_ul = NULL;
+    profile = st->codecpar->profile;
+    for (i = 0; i < FF_ARRAY_ELEMS(mxf_prores_codec_uls); i++) {
+        if (profile == mxf_prores_codec_uls[i].profile) {
+            sc->codec_ul = &mxf_prores_codec_uls[i].codec_ul;
+            break;
+        }
+    }
+    if (!sc->codec_ul)
+        return 0;
+
+    sc->frame_size = pkt->size;
+
+    return 1;
+}
+
+static const struct {
     int cid;
-    uint8_t* header_cid;
-    int frame_size = 0;
+    UID codec_ul;
+} mxf_dnxhd_codec_uls[] = {
+    { 1235, { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x71,0x01,0x00,0x00 } }, // 1080p 10bit HIGH
+    { 1237, { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x71,0x03,0x00,0x00 } }, // 1080p 8bit MED
+    { 1238, { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x71,0x04,0x00,0x00 } }, // 1080p 8bit HIGH
+    { 1241, { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x71,0x07,0x00,0x00 } }, // 1080i 10bit HIGH
+    { 1242, { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x71,0x08,0x00,0x00 } }, // 1080i 8bit MED
+    { 1243, { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x71,0x09,0x00,0x00 } }, // 1080i 8bit HIGH
+    { 1244, { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x71,0x0a,0x00,0x00 } }, // 1080i 8bit TR
+    { 1250, { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x71,0x10,0x00,0x00 } }, // 720p 10bit
+    { 1251, { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x71,0x11,0x00,0x00 } }, // 720p 8bit HIGH
+    { 1252, { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x71,0x12,0x00,0x00 } }, // 720p 8bit MED
+    { 1253, { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x71,0x13,0x00,0x00 } }, // 720p 8bit LOW
+    { 1256, { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x71,0x16,0x00,0x00 } }, // 1080p 10bit 444
+    { 1258, { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x71,0x18,0x00,0x00 } }, // 720p 8bit TR
+    { 1259, { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x71,0x19,0x00,0x00 } }, // 1080p 8bit TR
+    { 1260, { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x71,0x1a,0x00,0x00 } }, // 1080i 8bit TR MBAFF
+    { 1270, { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x71,0x24,0x00,0x00 } }, // DNXHR 444
+    { 1271, { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x71,0x25,0x00,0x00 } }, // DNXHR HQX
+    { 1272, { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x71,0x26,0x00,0x00 } }, // DNXHR HQ
+    { 1273, { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x71,0x27,0x00,0x00 } }, // DNXHR SQ
+    { 1274, { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x71,0x28,0x00,0x00 } }, // DNXHR LB
+};
+
+static int mxf_parse_dnxhd_frame(AVFormatContext *s, AVStream *st, AVPacket *pkt)
+{
+    MXFContext *mxf = s->priv_data;
+    MXFStreamContext *sc = st->priv_data;
+    int i, cid, frame_size = 0;
 
     if (mxf->header_written)
         return 1;
 
     if (pkt->size < 43)
-        return -1;
+        return 0;
 
-    header_cid = pkt->data + 0x28;
-    cid = header_cid[0] << 24 | header_cid[1] << 16 | header_cid[2] << 8 | header_cid[3];
+    sc->codec_ul = NULL;
+    cid = AV_RB32(pkt->data + 0x28);
+    for (i = 0; i < FF_ARRAY_ELEMS(mxf_dnxhd_codec_uls); i++) {
+        if (cid == mxf_dnxhd_codec_uls[i].cid) {
+            sc->codec_ul = &mxf_dnxhd_codec_uls[i].codec_ul;
+            break;
+        }
+    }
+    if (!sc->codec_ul)
+        return 0;
+
+    sc->component_depth = 0;
+    switch (pkt->data[0x21] >> 5) {
+    case 1: sc->component_depth = 8; break;
+    case 2: sc->component_depth = 10; break;
+    case 3: sc->component_depth = 12; break;
+    }
+    if (!sc->component_depth)
+        return 0;
 
     if ((frame_size = avpriv_dnxhd_get_frame_size(cid)) == DNXHD_VARIABLE) {
         frame_size = avpriv_dnxhd_get_hr_frame_size(cid, st->codecpar->width, st->codecpar->height);
     }
-
     if (frame_size < 0)
-        return -1;
-    if ((sc->interlaced = avpriv_dnxhd_get_interlaced(cid)) < 0)
-        return AVERROR_INVALIDDATA;
+        return 0;
 
-    switch (cid) {
-    case 1235:
-        sc->index = INDEX_DNXHD_1080p_10bit_HIGH;
-        sc->component_depth = 10;
-        break;
-    case 1237:
-        sc->index = INDEX_DNXHD_1080p_8bit_MEDIUM;
-        break;
-    case 1238:
-        sc->index = INDEX_DNXHD_1080p_8bit_HIGH;
-        break;
-    case 1241:
-        sc->index = INDEX_DNXHD_1080i_10bit_HIGH;
-        sc->component_depth = 10;
-        break;
-    case 1242:
-        sc->index = INDEX_DNXHD_1080i_8bit_MEDIUM;
-        break;
-    case 1243:
-        sc->index = INDEX_DNXHD_1080i_8bit_HIGH;
-        break;
-    case 1250:
-        sc->index = INDEX_DNXHD_720p_10bit;
-        sc->component_depth = 10;
-        break;
-    case 1251:
-        sc->index = INDEX_DNXHD_720p_8bit_HIGH;
-        break;
-    case 1252:
-        sc->index = INDEX_DNXHD_720p_8bit_MEDIUM;
-        break;
-    case 1253:
-        sc->index = INDEX_DNXHD_720p_8bit_LOW;
-        break;
-    case 1274:
-        sc->index = INDEX_DNXHR_LB;
-        break;
-    case 1273:
-        sc->index = INDEX_DNXHR_SQ;
-        break;
-    case 1272:
-        sc->index = INDEX_DNXHR_HQ;
-        break;
-    case 1271:
-        sc->index = INDEX_DNXHR_HQX;
-        sc->component_depth = st->codecpar->bits_per_raw_sample;
-        break;
-    case 1270:
-        sc->index = INDEX_DNXHR_444;
-        sc->component_depth = st->codecpar->bits_per_raw_sample;
-        break;
-    default:
-        return -1;
+    if ((sc->interlaced = avpriv_dnxhd_get_interlaced(cid)) < 0)
+        return 0;
+
+    if (cid >= 1270) { // RI raster
+        av_reduce(&sc->aspect_ratio.num, &sc->aspect_ratio.den,
+                  st->codecpar->width, st->codecpar->height,
+                  INT_MAX);
+    } else {
+        sc->aspect_ratio = (AVRational){ 16, 9 };
     }
 
-    sc->codec_ul = &mxf_essence_container_uls[sc->index].codec_ul;
-    sc->aspect_ratio = (AVRational){ 16, 9 };
     sc->frame_size = pkt->size;
 
     return 1;
 }
 
+static const struct {
+    const UID container_ul;
+    const UID codec_ul;
+} mxf_dv_uls[] = {
+    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x02,0x01,0x01 }, // IEC DV25 525/60
+      { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x02,0x01,0x01,0x00 } },
+    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x02,0x02,0x01 }, // IEC DV25 626/50
+      { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x02,0x01,0x02,0x00 } },
+    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x02,0x40,0x01 }, // DV25 525/60
+      { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x02,0x02,0x01,0x00 }, },
+    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x02,0x41,0x01 }, // DV25 625/50
+      { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x02,0x02,0x02,0x00 }, },
+    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x02,0x50,0x01 }, // DV50 525/60
+      { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x02,0x02,0x03,0x00 }, },
+    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x02,0x51,0x01 }, // DV50 625/50
+      { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x02,0x02,0x04,0x00 }, },
+    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x02,0x60,0x01 }, // DV100 1080/60
+      { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x02,0x02,0x05,0x00 }, },
+    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x02,0x61,0x01 }, // DV100 1080/50
+      { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x02,0x02,0x06,0x00 }, },
+    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x02,0x62,0x01 }, // DV100 720/60
+      { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x02,0x02,0x07,0x00 }, },
+    { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x02,0x63,0x01 }, // DV100 720/50
+      { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x02,0x02,0x08,0x00 }, },
+};
+
 static int mxf_parse_dv_frame(AVFormatContext *s, AVStream *st, AVPacket *pkt)
 {
     MXFContext *mxf = s->priv_data;
     MXFStreamContext *sc = st->priv_data;
     uint8_t *vs_pack, *vsc_pack;
-    int ul_index, frame_size, stype, pal;
-    const AVDVProfile *profile;
+    int apt, ul_index, stype, pal;
 
     if (mxf->header_written)
         return 1;
@@ -2132,8 +2088,7 @@
     if (pkt->size < 120000)
         return -1;
 
-    profile = av_dv_frame_profile(NULL, pkt->data, pkt->size);
-
+    apt      = pkt->data[4] & 0x7;
     vs_pack  = pkt->data + 80*5 + 48;
     vsc_pack = pkt->data + 80*5 + 53;
     stype    = vs_pack[3] & 0x1f;
@@ -2152,33 +2107,29 @@
 
     switch (stype) {
     case 0x18: // DV100 720p
-        ul_index = INDEX_DV100_720_50 + pal;
-        frame_size = pal ? 288000 : 240000;
+        ul_index = 8+pal;
         if (sc->interlaced) {
             av_log(s, AV_LOG_ERROR, "source marked as interlaced but codec profile is progressive\n");
             sc->interlaced = 0;
         }
         break;
     case 0x14: // DV100 1080i
-        ul_index = INDEX_DV100_1080_50 + pal;
-        frame_size = pal ? 576000 : 480000;
+        ul_index = 6+pal;
         break;
     case 0x04: // DV50
-        ul_index = INDEX_DV50_525_60 + pal;
-        frame_size = pal ? 288000 : 240000;
+        ul_index = 4+pal;
         break;
     default: // DV25
-        if (profile && profile->pix_fmt == AV_PIX_FMT_YUV420P && pal) {
-            ul_index = INDEX_DV25_525_60_IEC + pal;
-            frame_size = pal ? 144000 : 120000;
-            break;
+        if (!apt) { // IEC
+            ul_index = 0+pal;
+        } else {
+            ul_index = 2+pal;
         }
-        ul_index = INDEX_DV25_525_60 + pal;
-        frame_size = pal ? 144000 : 120000;
     }
 
-    sc->index = ul_index;
-    sc->codec_ul =  &mxf_essence_container_uls[sc->index].codec_ul;
+    sc->container_ul = &mxf_dv_uls[ul_index].container_ul;
+    sc->codec_ul = &mxf_dv_uls[ul_index].codec_ul;
+
     sc->frame_size = pkt->size;
 
     return 1;
@@ -2189,30 +2140,30 @@
     int frame_size;
     int profile;
     uint8_t interlaced;
-    int long_gop; // 1 or 0 when there are separate UIDs for Long GOP and Intra, -1 when Intra/LGOP detection can be ignored
+    int intra_only; // 1 or 0 when there are separate UIDs for Long GOP and Intra, -1 when Intra/LGOP detection can be ignored
 } mxf_h264_codec_uls[] = {
-    {{ 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x01,0x31,0x11,0x01 },      0,  66, 0, -1 }, // AVC Baseline, Unconstrained Coding
+    {{ 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x01,0x31,0x11,0x01 },      0,  66, 0, -1 }, // AVC Baseline
     {{ 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x01,0x31,0x20,0x01 },      0,  77, 0, -1 }, // AVC Main
     {{ 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x01,0x31,0x30,0x01 },      0,  88, 0, -1 }, // AVC Extended
     {{ 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x01,0x31,0x40,0x01 },      0, 100, 0, -1 }, // AVC High
-    {{ 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x01,0x31,0x50,0x01 },      0, 110, 0,  1 }, // AVC High 10
-    {{ 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x01,0x31,0x60,0x01 },      0, 122, 0,  1 }, // AVC High 422
-    {{ 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x01,0x31,0x70,0x01 },      0, 244, 0,  1 }, // AVC High 444
-    {{ 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x01,0x32,0x20,0x01 },      0, 110, 0,  0 }, // AVC High 10 Intra
-    {{ 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x01,0x32,0x21,0x01 }, 232960,   0, 1,  0 }, // AVC Intra 50 1080i60
-    {{ 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x01,0x32,0x21,0x02 }, 281088,   0, 1,  0 }, // AVC Intra 50 1080i50
-    {{ 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x01,0x32,0x21,0x03 }, 232960,   0, 0,  0 }, // AVC Intra 50 1080p30
-    {{ 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x01,0x32,0x21,0x04 }, 281088,   0, 0,  0 }, // AVC Intra 50 1080p25
-    {{ 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x01,0x32,0x21,0x08 }, 116736,   0, 0,  0 }, // AVC Intra 50 720p60
-    {{ 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x01,0x32,0x21,0x09 }, 140800,   0, 0,  0 }, // AVC Intra 50 720p50
-    {{ 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x01,0x32,0x30,0x01 },      0, 122, 0,  0 }, // AVC High 422 Intra
-    {{ 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x01,0x32,0x31,0x01 }, 472576,   0, 1,  0 }, // AVC Intra 100 1080i60
-    {{ 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x01,0x32,0x31,0x02 }, 568832,   0, 1,  0 }, // AVC Intra 100 1080i50
-    {{ 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x01,0x32,0x31,0x03 }, 472576,   0, 0,  0 }, // AVC Intra 100 1080p30
-    {{ 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x01,0x32,0x31,0x04 }, 568832,   0, 0,  0 }, // AVC Intra 100 1080p25
-    {{ 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x01,0x32,0x31,0x08 }, 236544,   0, 0,  0 }, // AVC Intra 100 720p60
-    {{ 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x01,0x32,0x31,0x09 }, 284672,   0, 0,  0 }, // AVC Intra 100 720p50
-    {{ 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0d,0x04,0x01,0x02,0x02,0x01,0x32,0x40,0x01 },      0, 244, 0,  0 }, // AVC High 444 Intra
+    {{ 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x01,0x31,0x50,0x01 },      0, 110, 0,  0 }, // AVC High 10
+    {{ 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x01,0x31,0x60,0x01 },      0, 122, 0,  0 }, // AVC High 422
+    {{ 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x01,0x31,0x70,0x01 },      0, 244, 0,  0 }, // AVC High 444
+    {{ 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x01,0x32,0x20,0x01 },      0, 110, 0,  1 }, // AVC High 10 Intra
+    {{ 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x01,0x32,0x21,0x01 }, 232960, 110, 1,  1 }, // AVC High 10 Intra RP2027 Class 50 1080/59.94i
+    {{ 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x01,0x32,0x21,0x02 }, 281088, 110, 1,  1 }, // AVC High 10 Intra RP2027 Class 50 1080/50i
+    {{ 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x01,0x32,0x21,0x03 }, 232960, 110, 0,  1 }, // AVC High 10 Intra RP2027 Class 50 1080/29.97p
+    {{ 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x01,0x32,0x21,0x04 }, 281088, 110, 0,  1 }, // AVC High 10 Intra RP2027 Class 50 1080/25p
+    {{ 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x01,0x32,0x21,0x08 }, 116736, 110, 0,  1 }, // AVC High 10 Intra RP2027 Class 50 720/59.94p
+    {{ 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x01,0x32,0x21,0x09 }, 140800, 110, 0,  1 }, // AVC High 10 Intra RP2027 Class 50 720/50p
+    {{ 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x01,0x32,0x30,0x01 },      0, 122, 0,  1 }, // AVC High 422 Intra
+    {{ 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x01,0x32,0x31,0x01 }, 472576, 122, 1,  1 }, // AVC High 422 Intra RP2027 Class 100 1080/59.94i
+    {{ 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x01,0x32,0x31,0x02 }, 568832, 122, 1,  1 }, // AVC High 422 Intra RP2027 Class 100 1080/50i
+    {{ 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x01,0x32,0x31,0x03 }, 472576, 122, 0,  1 }, // AVC High 422 Intra RP2027 Class 100 1080/29.97p
+    {{ 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x01,0x32,0x31,0x04 }, 568832, 122, 0,  1 }, // AVC High 422 Intra RP2027 Class 100 1080/25p
+    {{ 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x01,0x32,0x31,0x08 }, 236544, 122, 0,  1 }, // AVC High 422 Intra RP2027 Class 100 720/59.94p
+    {{ 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0a,0x04,0x01,0x02,0x02,0x01,0x32,0x31,0x09 }, 284672, 122, 0,  1 }, // AVC High 422 Intra RP2027 Class 100 720/50p
+    {{ 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0d,0x04,0x01,0x02,0x02,0x01,0x32,0x40,0x01 },      0, 244, 0,  1 }, // AVC High 444 Intra
     {{ 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0d,0x04,0x01,0x02,0x02,0x01,0x32,0x50,0x01 },      0,  44, 0, -1 }, // AVC CAVLC 444
 };
 
@@ -2221,37 +2172,70 @@
 {
     MXFContext *mxf = s->priv_data;
     MXFStreamContext *sc = st->priv_data;
-    AVCodecParameters *par = st->codecpar;
-    static const int mxf_h264_num_codec_uls = sizeof(mxf_h264_codec_uls) / sizeof(mxf_h264_codec_uls[0]);
+    H264SequenceParameterSet *sps = NULL;
+    GetBitContext gb;
     const uint8_t *buf = pkt->data;
     const uint8_t *buf_end = pkt->data + pkt->size;
+    const uint8_t *nal_end;
     uint32_t state = -1;
-    int long_gop = 0; // assume intra when there is no SPS header
     int extra_size = 512; // support AVC Intra files without SPS/PPS header
-    int i, frame_size;
-    uint8_t uid_found;
-
-    if (pkt->size > extra_size)
-        buf_end -= pkt->size - extra_size; // no need to parse beyond SPS/PPS header
+    int i, frame_size, slice_type, intra_only = 0;
 
     for (;;) {
         buf = avpriv_find_start_code(buf, buf_end, &state);
         if (buf >= buf_end)
             break;
-        --buf;
+
         switch (state & 0x1f) {
         case H264_NAL_SPS:
-            par->profile = buf[1];
-            long_gop = buf[2] & 0x10 ? 0 : 1; // constraint_set3_flag signals intra
             e->flags |= 0x40;
+
+            if (mxf->header_written)
+                break;
+
+            nal_end = ff_avc_find_startcode(buf, buf_end);
+            sps = ff_avc_decode_sps(buf, nal_end - buf);
+            if (!sps) {
+                av_log(s, AV_LOG_ERROR, "error parsing sps\n");
+                return 0;
+            }
+
+            sc->aspect_ratio.num = st->codecpar->width * sps->sar.num;
+            sc->aspect_ratio.den = st->codecpar->height * sps->sar.den;
+            av_reduce(&sc->aspect_ratio.num, &sc->aspect_ratio.den,
+                      sc->aspect_ratio.num, sc->aspect_ratio.den, 1024*1024);
+            intra_only = (sps->constraint_set_flags >> 3) & 1;
+            sc->interlaced = !sps->frame_mbs_only_flag;
+            sc->component_depth = sps->bit_depth_luma;
+
+            buf = nal_end;
             break;
         case H264_NAL_PPS:
             if (e->flags & 0x40) { // sequence header present
                 e->flags |= 0x80; // random access
                 extra_size = 0;
-                buf = buf_end;
             }
             break;
+        case H264_NAL_IDR_SLICE:
+            e->flags |= 0x04; // IDR Picture
+            buf = buf_end;
+            break;
+        case H264_NAL_SLICE:
+            init_get_bits8(&gb, buf, buf_end - buf);
+            get_ue_golomb_long(&gb); // skip first_mb_in_slice
+            slice_type = get_ue_golomb_31(&gb);
+            switch (slice_type % 5) {
+            case 0:
+                e->flags |= 0x20; // P Picture
+                e->flags |= 0x06; // P Picture
+                break;
+            case 1:
+                e->flags |= 0x30; // B Picture
+                e->flags |= 0x03; // non-referenced B Picture
+                break;
+            }
+            buf = buf_end;
+            break;
         default:
             break;
         }
@@ -2260,27 +2244,37 @@
     if (mxf->header_written)
         return 1;
 
-    sc->aspect_ratio = (AVRational){ 16, 9 }; // 16:9 is mandatory for broadcast HD
-    sc->interlaced = par->field_order != AV_FIELD_PROGRESSIVE ? 1 : 0;
-
-    uid_found = 0;
+    if (!sps)
+        sc->interlaced = st->codecpar->field_order != AV_FIELD_PROGRESSIVE ? 1 : 0;
+    sc->codec_ul = NULL;
     frame_size = pkt->size + extra_size;
-    for (i = 0; i < mxf_h264_num_codec_uls; i++) {
+
+    for (i = 0; i < FF_ARRAY_ELEMS(mxf_h264_codec_uls); i++) {
         if (frame_size == mxf_h264_codec_uls[i].frame_size && sc->interlaced == mxf_h264_codec_uls[i].interlaced) {
             sc->codec_ul = &mxf_h264_codec_uls[i].uid;
             sc->component_depth = 10; // AVC Intra is always 10 Bit
+            sc->aspect_ratio = (AVRational){ 16, 9 }; // 16:9 is mandatory for broadcast HD
+            st->codecpar->profile = mxf_h264_codec_uls[i].profile;
+            sc->avc_intra = 1;
+            mxf->cbr_index = 1;
+            sc->frame_size = pkt->size;
             if (sc->interlaced)
                 sc->field_dominance = 1; // top field first is mandatory for AVC Intra
-            return 1;
-        } else if ((mxf_h264_codec_uls[i].profile == par->profile) &&
-                   ((mxf_h264_codec_uls[i].long_gop < 0) ||
-                   (mxf_h264_codec_uls[i].long_gop == long_gop))) {
+            break;
+        } else if (sps && mxf_h264_codec_uls[i].frame_size == 0 &&
+                   mxf_h264_codec_uls[i].profile == sps->profile_idc &&
+                   (mxf_h264_codec_uls[i].intra_only < 0 ||
+                    mxf_h264_codec_uls[i].intra_only == intra_only)) {
             sc->codec_ul = &mxf_h264_codec_uls[i].uid;
-            uid_found = 1;
+            st->codecpar->profile = sps->profile_idc;
+            st->codecpar->level = sps->level_idc;
+            // continue to check for avc intra
         }
     }
 
-    if (!uid_found) {
+    av_free(sps);
+
+    if (!sc->codec_ul) {
         av_log(s, AV_LOG_ERROR, "h264 profile not supported\n");
         return 0;
     }
@@ -2385,8 +2379,9 @@
     return !!sc->codec_ul;
 }
 
-static uint64_t mxf_parse_timestamp(time_t timestamp)
+static uint64_t mxf_parse_timestamp(int64_t timestamp64)
 {
+    time_t timestamp = timestamp64 / 1000000;
     struct tm tmbuf;
     struct tm *time = gmtime_r(&timestamp, &tmbuf);
     if (!time)
@@ -2396,7 +2391,8 @@
            (uint64_t) time->tm_mday       << 32 |
                       time->tm_hour       << 24 |
                       time->tm_min        << 16 |
-                      time->tm_sec        << 8;
+                      time->tm_sec        << 8  |
+                      (timestamp64 % 1000000) / 4000;
 }
 
 static void mxf_gen_umid(AVFormatContext *s)
@@ -2411,17 +2407,28 @@
     mxf->instance_number = seed & 0xFFFFFF;
 }
 
-static int mxf_init_timecode(AVFormatContext *s, AVStream *st, AVRational rate)
+static int mxf_init_timecode(AVFormatContext *s, AVStream *st, AVRational tbc)
 {
     MXFContext *mxf = s->priv_data;
     AVDictionaryEntry *tcr = av_dict_get(s->metadata, "timecode", NULL, 0);
+
+    if (!ff_mxf_get_content_package_rate(tbc)) {
+        if (s->strict_std_compliance > FF_COMPLIANCE_UNOFFICIAL) {
+            av_log(s, AV_LOG_ERROR, "Unsupported frame rate %d/%d. Set -strict option to 'unofficial' or lower in order to allow it!\n", tbc.den, tbc.num);
+            return AVERROR(EINVAL);
+        } else {
+            av_log(s, AV_LOG_WARNING, "Unofficial frame rate %d/%d.\n", tbc.den, tbc.num);
+        }
+    }
+
+    mxf->timecode_base = (tbc.den + tbc.num/2) / tbc.num;
     if (!tcr)
         tcr = av_dict_get(st->metadata, "timecode", NULL, 0);
 
     if (tcr)
-        return av_timecode_init_from_string(&mxf->tc, rate, tcr->value, s);
+        return av_timecode_init_from_string(&mxf->tc, av_inv_q(tbc), tcr->value, s);
     else
-        return av_timecode_init(&mxf->tc, rate, 0, 0, s);
+        return av_timecode_init(&mxf->tc, av_inv_q(tbc), 0, 0, s);
 }
 
 static int mxf_write_header(AVFormatContext *s)
@@ -2429,7 +2436,6 @@
     MXFContext *mxf = s->priv_data;
     int i, ret;
     uint8_t present[FF_ARRAY_ELEMS(mxf_essence_container_uls)] = {0};
-    const MXFSamplesPerFrame *spf = NULL;
     int64_t timestamp = 0;
 
     if (!s->nb_streams)
@@ -2449,6 +2455,7 @@
         if (!sc)
             return AVERROR(ENOMEM);
         st->priv_data = sc;
+        sc->index = -1;
 
         if (((i == 0) ^ (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO)) && s->oformat != &ff_mxf_opatom_muxer) {
             av_log(s, AV_LOG_ERROR, "there must be exactly one video stream and it must be the first one\n");
@@ -2458,13 +2465,18 @@
         if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
             const AVPixFmtDescriptor *pix_desc = av_pix_fmt_desc_get(st->codecpar->format);
             // TODO: should be avg_frame_rate
-            AVRational rate, tbc = st->time_base;
+            AVRational tbc = st->time_base;
             // Default component depth to 8
             sc->component_depth = 8;
             sc->h_chroma_sub_sample = 2;
             sc->v_chroma_sub_sample = 2;
             sc->color_siting = 0xFF;
 
+            if (st->codecpar->sample_aspect_ratio.num && st->codecpar->sample_aspect_ratio.den) {
+                sc->aspect_ratio = av_mul_q(st->codecpar->sample_aspect_ratio,
+                                            av_make_q(st->codecpar->width, st->codecpar->height));
+            }
+
             if (pix_desc) {
                 sc->component_depth     = pix_desc->comp[0].depth;
                 sc->h_chroma_sub_sample = 1 << pix_desc->log2_chroma_w;
@@ -2477,18 +2489,10 @@
             case AVCHROMA_LOC_CENTER:  sc->color_siting = 3; break;
             }
 
-            mxf->timecode_base = (tbc.den + tbc.num/2) / tbc.num;
-            spf = ff_mxf_get_samples_per_frame(s, tbc);
-            if (!spf) {
-                av_log(s, AV_LOG_ERROR, "Unsupported video frame rate %d/%d\n",
-                       tbc.den, tbc.num);
-                return AVERROR(EINVAL);
-            }
             mxf->content_package_rate = ff_mxf_get_content_package_rate(tbc);
-            mxf->time_base = spf->time_base;
-            rate = av_inv_q(mxf->time_base);
+            mxf->time_base = tbc;
             avpriv_set_pts_info(st, 64, mxf->time_base.num, mxf->time_base.den);
-            if((ret = mxf_init_timecode(s, st, rate)) < 0)
+            if((ret = mxf_init_timecode(s, st, tbc)) < 0)
                 return ret;
 
             if (st->codecpar->codec_id == AV_CODEC_ID_MPEG2VIDEO) {
@@ -2503,25 +2507,29 @@
                 mxf->cbr_index = 1;
 
             if (s->oformat == &ff_mxf_d10_muxer) {
+                int ntsc = mxf->time_base.den != 25;
+                int ul_index;
+
                 if (st->codecpar->codec_id != AV_CODEC_ID_MPEG2VIDEO) {
                     av_log(s, AV_LOG_ERROR, "error MXF D-10 only support MPEG-2 Video\n");
                     return AVERROR(EINVAL);
                 }
                 if ((sc->video_bit_rate == 50000000) && (mxf->time_base.den == 25)) {
-                    sc->index = INDEX_D10_625_50_50_VIDEO;
-                } else if ((sc->video_bit_rate == 49999840 || sc->video_bit_rate == 50000000) && (mxf->time_base.den != 25)) {
-                    sc->index = INDEX_D10_525_60_50_VIDEO;
+                    ul_index = 0;
+                } else if ((sc->video_bit_rate == 49999840 || sc->video_bit_rate == 50000000) && ntsc) {
+                    ul_index = 1;
                 } else if (sc->video_bit_rate == 40000000) {
-                    if (mxf->time_base.den == 25) sc->index = INDEX_D10_625_50_40_VIDEO;
-                    else                          sc->index = INDEX_D10_525_60_40_VIDEO;
+                    ul_index = 2+ntsc;
                 } else if (sc->video_bit_rate == 30000000) {
-                    if (mxf->time_base.den == 25) sc->index = INDEX_D10_625_50_30_VIDEO;
-                    else                          sc->index = INDEX_D10_525_60_30_VIDEO;
+                    ul_index = 4+ntsc;
                 } else {
                     av_log(s, AV_LOG_ERROR, "error MXF D-10 only support 30/40/50 mbit/s\n");
                     return -1;
                 }
 
+                sc->codec_ul = &mxf_d10_codec_uls[ul_index];
+                sc->container_ul = &mxf_d10_container_uls[ul_index];
+                sc->index = INDEX_D10_VIDEO;
                 sc->signal_standard = 1;
                 sc->color_siting = 0;
                 sc->frame_size = (int64_t)sc->video_bit_rate *
@@ -2544,8 +2552,9 @@
                     st->codecpar->codec_id != AV_CODEC_ID_PCM_S24LE) {
                     av_log(s, AV_LOG_ERROR, "MXF D-10 only support 16 or 24 bits le audio\n");
                 }
-                sc->index = ((MXFStreamContext*)s->streams[0]->priv_data)->index + 1;
-                sc->frame_size = 4 + 8 * spf[0].samples_per_frame[0] * 4;
+                sc->index = INDEX_D10_AUDIO;
+                sc->container_ul = ((MXFStreamContext*)s->streams[0]->priv_data)->container_ul;
+                sc->frame_size = 4 + 8 * av_rescale_rnd(st->codecpar->sample_rate, mxf->time_base.num, mxf->time_base.den, AV_ROUND_UP) * 4;
             } else if (s->oformat == &ff_mxf_opatom_muxer) {
                 AVRational tbc = av_inv_q(mxf->audio_edit_rate);
 
@@ -2559,28 +2568,22 @@
                     return AVERROR(EINVAL);
                 }
 
-                spf = ff_mxf_get_samples_per_frame(s, tbc);
-                if (!spf) {
-                    av_log(s, AV_LOG_ERROR, "Unsupported timecode frame rate %d/%d\n", tbc.den, tbc.num);
-                    return AVERROR(EINVAL);
-                }
-
                 mxf->time_base = st->time_base;
-                if((ret = mxf_init_timecode(s, st, av_inv_q(spf->time_base))) < 0)
+                if((ret = mxf_init_timecode(s, st, tbc)) < 0)
                     return ret;
 
-                mxf->timecode_base = (tbc.den + tbc.num/2) / tbc.num;
                 mxf->edit_unit_byte_count = (av_get_bits_per_sample(st->codecpar->codec_id) * st->codecpar->channels) >> 3;
                 sc->index = INDEX_WAV;
             } else {
                 mxf->slice_count = 1;
-                sc->frame_size = (st->codecpar->channels * spf[0].samples_per_frame[0] *
-                                  av_get_bits_per_sample(st->codecpar->codec_id)) / 8;
+                sc->frame_size = st->codecpar->channels *
+                                 av_rescale_rnd(st->codecpar->sample_rate, mxf->time_base.num, mxf->time_base.den, AV_ROUND_UP) *
+                                 av_get_bits_per_sample(st->codecpar->codec_id) / 8;
             }
         } else if (st->codecpar->codec_type == AVMEDIA_TYPE_DATA) {
             AVDictionaryEntry *e = av_dict_get(st->metadata, "data_type", NULL, 0);
             if (e && !strcmp(e->value, "vbi_vanc_smpte_436M")) {
-                sc->index = 38;
+                sc->index = INDEX_S436M;
             } else {
                 av_log(s, AV_LOG_ERROR, "track %d: unsupported data type\n", i);
                 return -1;
@@ -2591,7 +2594,7 @@
             }
         }
 
-        if (!sc->index) {
+        if (sc->index == -1) {
             sc->index = mxf_get_essence_container_ul_index(st->codecpar->codec_id);
             if (sc->index == -1) {
                 av_log(s, AV_LOG_ERROR, "track %d: could not find essence container ul, "
@@ -2600,7 +2603,10 @@
             }
         }
 
-        sc->codec_ul = &mxf_essence_container_uls[sc->index].codec_ul;
+        if (!sc->codec_ul)
+            sc->codec_ul = &mxf_essence_container_uls[sc->index].codec_ul;
+        if (!sc->container_ul)
+            sc->container_ul = &mxf_essence_container_uls[sc->index].container_ul;
 
         memcpy(sc->track_essence_element_key, mxf_essence_container_uls[sc->index].element_ul, 15);
         sc->track_essence_element_key[15] = present[sc->index];
@@ -2622,13 +2628,13 @@
         MXFStreamContext *sc = s->streams[i]->priv_data;
         // update element count
         sc->track_essence_element_key[13] = present[sc->index];
-        if (!memcmp(sc->track_essence_element_key, mxf_essence_container_uls[15].element_ul, 13)) // DV
+        if (!memcmp(sc->track_essence_element_key, mxf_essence_container_uls[INDEX_DV].element_ul, 13)) // DV
             sc->order = (0x15 << 24) | AV_RB32(sc->track_essence_element_key+13);
         else
             sc->order = AV_RB32(sc->track_essence_element_key+12);
     }
 
-    if (ff_parse_creation_time_metadata(s, &timestamp, 1) > 0)
+    if (ff_parse_creation_time_metadata(s, &timestamp, 0) > 0)
         mxf->timestamp = mxf_parse_timestamp(timestamp);
     mxf->duration = -1;
 
@@ -2640,10 +2646,7 @@
         return AVERROR(ENOMEM);
     mxf->timecode_track->index = -1;
 
-    if (!spf)
-        spf = ff_mxf_get_samples_per_frame(s, (AVRational){ 1, 25 });
-
-    if (ff_audio_interleave_init(s, spf->samples_per_frame, mxf->time_base) < 0)
+    if (ff_audio_interleave_init(s, 0, av_inv_q(mxf->tc.rate)) < 0)
         return -1;
 
     return 0;
@@ -2676,12 +2679,12 @@
     avio_w8(pb, mxf->content_package_rate); // content package rate
     avio_w8(pb, 0x00); // content package type
     avio_wb16(pb, 0x00); // channel handle
-    avio_wb16(pb, (mxf->tc.start + frame) & 0xFFFF); // continuity count, supposed to overflow
+    avio_wb16(pb, frame & 0xFFFF); // continuity count, supposed to overflow
     if (mxf->essence_container_count > 1)
         avio_write(pb, multiple_desc_ul, 16);
     else {
         MXFStreamContext *sc = s->streams[0]->priv_data;
-        avio_write(pb, mxf_essence_container_uls[sc->index].container_ul, 16);
+        avio_write(pb, *sc->container_ul, 16);
     }
     avio_w8(pb, 0);
     avio_wb64(pb, 0);
@@ -2779,7 +2782,6 @@
     mxf->edit_units_count++;
     avio_write(pb, pkt->data, pkt->size);
     mxf->body_offset += pkt->size;
-    avio_flush(pb);
 
     return 0;
 }
@@ -2833,6 +2835,11 @@
             av_log(s, AV_LOG_ERROR, "could not get dnxhd profile\n");
             return -1;
         }
+    } else if (st->codecpar->codec_id == AV_CODEC_ID_PRORES) {
+        if (!mxf_parse_prores_frame(s, st, pkt)) {
+            av_log(s, AV_LOG_ERROR, "could not get prores profile\n");
+            return -1;
+        }
     } else if (st->codecpar->codec_id == AV_CODEC_ID_DVVIDEO) {
         if (!mxf_parse_dv_frame(s, st, pkt)) {
             av_log(s, AV_LOG_ERROR, "could not get dv profile\n");
@@ -2912,8 +2919,6 @@
         mxf->body_offset += 16+4+pkt->size + klv_fill_size(16+4+pkt->size);
     }
 
-    avio_flush(pb);
-
     return 0;
 }
 
@@ -2948,13 +2953,12 @@
 {
     MXFContext *mxf = s->priv_data;
     AVIOContext *pb = s->pb;
-    int i, err = 0;
+    int i, err;
 
     if (!mxf->header_written ||
         (s->oformat == &ff_mxf_opatom_muxer && !mxf->body_partition_offset)) {
         /* reason could be invalid options/not supported codec/out of memory */
-        err = AVERROR_UNKNOWN;
-        goto end;
+        return AVERROR_UNKNOWN;
     }
 
     mxf->duration = mxf->last_indexed_edit_unit + mxf->edit_units_count;
@@ -2963,10 +2967,10 @@
     mxf->footer_partition_offset = avio_tell(pb);
     if (mxf->edit_unit_byte_count && s->oformat != &ff_mxf_opatom_muxer) { // no need to repeat index
         if ((err = mxf_write_partition(s, 0, 0, footer_partition_key, 0)) < 0)
-            goto end;
+            return err;
     } else {
         if ((err = mxf_write_partition(s, 0, 2, footer_partition_key, 0)) < 0)
-            goto end;
+            return err;
         mxf_write_klv_fill(s);
         mxf_write_index_table_segment(s);
     }
@@ -2979,18 +2983,18 @@
             /* rewrite body partition to update lengths */
             avio_seek(pb, mxf->body_partition_offset[0], SEEK_SET);
             if ((err = mxf_write_opatom_body_partition(s)) < 0)
-                goto end;
+                return err;
         }
 
         avio_seek(pb, 0, SEEK_SET);
         if (mxf->edit_unit_byte_count && s->oformat != &ff_mxf_opatom_muxer) {
             if ((err = mxf_write_partition(s, 1, 2, header_closed_partition_key, 1)) < 0)
-                goto end;
+                return err;
             mxf_write_klv_fill(s);
             mxf_write_index_table_segment(s);
         } else {
             if ((err = mxf_write_partition(s, 0, 0, header_closed_partition_key, 1)) < 0)
-                goto end;
+                return err;
         }
         // update footer partition offset
         for (i = 0; i < mxf->body_partitions_count; i++) {
@@ -2999,17 +3003,21 @@
         }
     }
 
-end:
+    return 0;
+}
+
+static void mxf_deinit(AVFormatContext *s)
+{
+    MXFContext *mxf = s->priv_data;
+
     ff_audio_interleave_close(s);
 
     av_freep(&mxf->index_entries);
     av_freep(&mxf->body_partition_offset);
-    av_freep(&mxf->timecode_track->priv_data);
-    av_freep(&mxf->timecode_track);
-
-    mxf_free(s);
-
-    return err < 0 ? err : 0;
+    if (mxf->timecode_track) {
+        av_freep(&mxf->timecode_track->priv_data);
+        av_freep(&mxf->timecode_track);
+    }
 }
 
 static int mxf_interleave_get_packet(AVFormatContext *s, AVPacket *out, AVPacket *pkt, int flush)
@@ -3062,12 +3070,12 @@
         return 1;
     } else {
     out:
-        av_init_packet(out);
         return 0;
     }
 }
 
-static int mxf_compare_timestamps(AVFormatContext *s, AVPacket *next, AVPacket *pkt)
+static int mxf_compare_timestamps(AVFormatContext *s, const AVPacket *next,
+                                                      const AVPacket *pkt)
 {
     MXFStreamContext *sc  = s->streams[pkt ->stream_index]->priv_data;
     MXFStreamContext *sc2 = s->streams[next->stream_index]->priv_data;
@@ -3083,7 +3091,7 @@
 }
 
 #define MXF_COMMON_OPTIONS \
-    { "signal_standard", "Force/set Sigal Standard",\
+    { "signal_standard", "Force/set Signal Standard",\
       offsetof(MXFContext, signal_standard), AV_OPT_TYPE_INT, {.i64 = -1}, -1, 7, AV_OPT_FLAG_ENCODING_PARAM, "signal_standard"},\
     { "bt601", "ITU-R BT.601 and BT.656, also SMPTE 125M (525 and 625 line interlaced)",\
       0, AV_OPT_TYPE_CONST, {.i64 = 1}, -1, 7, AV_OPT_FLAG_ENCODING_PARAM, "signal_standard"},\
@@ -3136,6 +3144,8 @@
     { "mxf_audio_edit_rate", "Audio edit rate for timecode",
         offsetof(MXFContext, audio_edit_rate), AV_OPT_TYPE_RATIONAL, {.dbl=25}, 0, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM },
     MXF_COMMON_OPTIONS
+    { "store_user_comments", "",
+      offsetof(MXFContext, store_user_comments), AV_OPT_TYPE_BOOL, {.i64 = 1}, 0, 1, AV_OPT_FLAG_ENCODING_PARAM},
     { NULL },
 };
 
@@ -3157,6 +3167,7 @@
     .write_header      = mxf_write_header,
     .write_packet      = mxf_write_packet,
     .write_trailer     = mxf_write_footer,
+    .deinit            = mxf_deinit,
     .flags             = AVFMT_NOTIMESTAMPS,
     .interleave_packet = mxf_interleave,
     .priv_class        = &mxf_muxer_class,
@@ -3172,6 +3183,7 @@
     .write_header      = mxf_write_header,
     .write_packet      = mxf_write_packet,
     .write_trailer     = mxf_write_footer,
+    .deinit            = mxf_deinit,
     .flags             = AVFMT_NOTIMESTAMPS,
     .interleave_packet = mxf_interleave,
     .priv_class        = &mxf_d10_muxer_class,
@@ -3188,6 +3200,7 @@
     .write_header      = mxf_write_header,
     .write_packet      = mxf_write_packet,
     .write_trailer     = mxf_write_footer,
+    .deinit            = mxf_deinit,
     .flags             = AVFMT_NOTIMESTAMPS,
     .interleave_packet = mxf_interleave,
     .priv_class        = &mxf_opatom_muxer_class,
diff --git a/libavformat/ncdec.c b/libavformat/ncdec.c
index 8cadcc7..f2066b4 100644
--- a/libavformat/ncdec.c
+++ b/libavformat/ncdec.c
@@ -26,7 +26,7 @@
 
 #define NC_VIDEO_FLAG 0x1A5
 
-static int nc_probe(AVProbeData *probe_packet)
+static int nc_probe(const AVProbeData *probe_packet)
 {
     int size;
 
@@ -83,7 +83,6 @@
 
     ret = av_get_packet(s->pb, pkt, size);
     if (ret != size) {
-        if (ret > 0) av_packet_unref(pkt);
         return AVERROR(EIO);
     }
 
diff --git a/libavformat/network.c b/libavformat/network.c
index 5664455..0f5a575 100644
--- a/libavformat/network.c
+++ b/libavformat/network.c
@@ -238,7 +238,7 @@
     if (ret < 0)
         return ff_neterrno();
     if (ff_socket_nonblock(ret, 1) < 0)
-        av_log(NULL, AV_LOG_DEBUG, "ff_socket_nonblock failed\n");
+        av_log(h, AV_LOG_DEBUG, "ff_socket_nonblock failed\n");
 
     return ret;
 }
@@ -264,7 +264,7 @@
     socklen_t optlen;
 
     if (ff_socket_nonblock(fd, 1) < 0)
-        av_log(NULL, AV_LOG_DEBUG, "ff_socket_nonblock failed\n");
+        av_log(h, AV_LOG_DEBUG, "ff_socket_nonblock failed\n");
 
     while ((ret = connect(fd, addr, addrlen))) {
         ret = ff_neterrno();
diff --git a/libavformat/network.h b/libavformat/network.h
index 7f46730..71347e8 100644
--- a/libavformat/network.h
+++ b/libavformat/network.h
@@ -50,6 +50,9 @@
 #ifndef EINPROGRESS
 #define EINPROGRESS     WSAEINPROGRESS
 #endif
+#ifndef ENOTCONN
+#define ENOTCONN        WSAENOTCONN
+#endif
 
 #define getsockopt(a, b, c, d, e) getsockopt(a, b, c, (char*) d, e)
 #define setsockopt(a, b, c, d, e) setsockopt(a, b, c, (const char*) d, e)
diff --git a/libavformat/nistspheredec.c b/libavformat/nistspheredec.c
index 55f22eb..3ef3843 100644
--- a/libavformat/nistspheredec.c
+++ b/libavformat/nistspheredec.c
@@ -25,7 +25,7 @@
 #include "internal.h"
 #include "pcm.h"
 
-static int nist_probe(AVProbeData *p)
+static int nist_probe(const AVProbeData *p)
 {
     if (AV_RL64(p->buf) == AV_RL64("NIST_1A\x0a"))
         return AVPROBE_SCORE_MAX;
diff --git a/libavformat/nspdec.c b/libavformat/nspdec.c
index 34c747b..68f8f99 100644
--- a/libavformat/nspdec.c
+++ b/libavformat/nspdec.c
@@ -25,7 +25,7 @@
 #include "internal.h"
 #include "pcm.h"
 
-static int nsp_probe(AVProbeData *p)
+static int nsp_probe(const AVProbeData *p)
 {
     if (AV_RB32(p->buf) == AV_RB32("FORM") &&
         AV_RB32(p->buf + 4) == AV_RB32("DS16"))
diff --git a/libavformat/nsvdec.c b/libavformat/nsvdec.c
index 92f7d17..eb26b29 100644
--- a/libavformat/nsvdec.c
+++ b/libavformat/nsvdec.c
@@ -211,6 +211,7 @@
 
 //static int nsv_load_index(AVFormatContext *s);
 static int nsv_read_chunk(AVFormatContext *s, int fill_header);
+static int nsv_read_close(AVFormatContext *s);
 
 /* try to find something we recognize, and set the state accordingly */
 static int nsv_resync(AVFormatContext *s)
@@ -492,25 +493,32 @@
     nsv->ahead[0].data = nsv->ahead[1].data = NULL;
 
     for (i = 0; i < NSV_MAX_RESYNC_TRIES; i++) {
-        if (nsv_resync(s) < 0)
-            return -1;
+        err = nsv_resync(s);
+        if (err < 0)
+            goto fail;
         if (nsv->state == NSV_FOUND_NSVF) {
             err = nsv_parse_NSVf_header(s);
             if (err < 0)
-                return err;
+                goto fail;
         }
             /* we need the first NSVs also... */
         if (nsv->state == NSV_FOUND_NSVS) {
             err = nsv_parse_NSVs_header(s);
             if (err < 0)
-                return err;
+                goto fail;
             break; /* we just want the first one */
         }
     }
-    if (s->nb_streams < 1) /* no luck so far */
-        return -1;
+    if (s->nb_streams < 1) { /* no luck so far */
+        err = AVERROR_INVALIDDATA;
+        goto fail;
+    }
+
     /* now read the first chunk, so we can attempt to decode more info */
     err = nsv_read_chunk(s, 1);
+fail:
+    if (err < 0)
+        nsv_read_close(s);
 
     av_log(s, AV_LOG_TRACE, "parsed header\n");
     return err;
@@ -654,10 +662,8 @@
     /* now pick one of the plates */
     for (i = 0; i < 2; i++) {
         if (nsv->ahead[i].data) {
-            /* avoid the cost of new_packet + memcpy(->data) */
-            memcpy(pkt, &nsv->ahead[i], sizeof(AVPacket));
-            nsv->ahead[i].data = NULL; /* we ate that one */
-            return pkt->size;
+            av_packet_move_ref(pkt, &nsv->ahead[i]);
+            return 0;
         }
     }
 
@@ -697,7 +703,7 @@
     return 0;
 }
 
-static int nsv_probe(AVProbeData *p)
+static int nsv_probe(const AVProbeData *p)
 {
     int i, score = 0;
 
diff --git a/libavformat/nut.c b/libavformat/nut.c
index e65f424..d699323 100644
--- a/libavformat/nut.c
+++ b/libavformat/nut.c
@@ -43,6 +43,7 @@
     { AV_CODEC_ID_XFACE,            MKTAG('X', 'F', 'A', 'C') },
     { AV_CODEC_ID_VP9,              MKTAG('V', 'P', '9', '0') },
     { AV_CODEC_ID_HEVC,             MKTAG('H', 'E', 'V', 'C') },
+    { AV_CODEC_ID_CPIA,             MKTAG('C', 'P', 'i', 'A') },
     { AV_CODEC_ID_RAWVIDEO,         MKTAG('R', 'G', 'B', 15 ) },
     { AV_CODEC_ID_RAWVIDEO,         MKTAG('B', 'G', 'R', 15 ) },
     { AV_CODEC_ID_RAWVIDEO,         MKTAG('R', 'G', 'B', 16 ) },
@@ -143,6 +144,11 @@
     { AV_CODEC_ID_RAWVIDEO,         MKTAG('Y', '4',   0,  10) },
     { AV_CODEC_ID_RAWVIDEO,         MKTAG(10,    0, '4', 'Y') },
 
+    { AV_CODEC_ID_RAWVIDEO,         MKTAG('Y', '4',   0,  12) },
+    { AV_CODEC_ID_RAWVIDEO,         MKTAG(12,    0, '4', 'Y') },
+    { AV_CODEC_ID_RAWVIDEO,         MKTAG('Y', '4',  10,  12) },
+    { AV_CODEC_ID_RAWVIDEO,         MKTAG(12,   10, '4', 'Y') },
+
     { AV_CODEC_ID_RAWVIDEO,         MKTAG('Y', '1',   0,  12) },
     { AV_CODEC_ID_RAWVIDEO,         MKTAG(12,    0, '1', 'Y') },
     { AV_CODEC_ID_RAWVIDEO,         MKTAG('Y', '1',   0,  16) },
@@ -221,6 +227,8 @@
     { AV_CODEC_ID_PCM_S24LE,        MKTAG('P', 'S', 'D', 24 ) },
     { AV_CODEC_ID_PCM_S32BE,        MKTAG(32 , 'D', 'S', 'P') },
     { AV_CODEC_ID_PCM_S32LE,        MKTAG('P', 'S', 'D', 32 ) },
+    { AV_CODEC_ID_PCM_S64BE,        MKTAG(64 , 'D', 'S', 'P') },
+    { AV_CODEC_ID_PCM_S64LE,        MKTAG('P', 'S', 'D', 64 ) },
     { AV_CODEC_ID_PCM_S8,           MKTAG('P', 'S', 'D',  8 ) },
     { AV_CODEC_ID_PCM_U16BE,        MKTAG(16 , 'D', 'U', 'P') },
     { AV_CODEC_ID_PCM_U16LE,        MKTAG('P', 'U', 'D', 16 ) },
diff --git a/libavformat/nutdec.c b/libavformat/nutdec.c
index 27440c8..3779dce 100644
--- a/libavformat/nutdec.c
+++ b/libavformat/nutdec.c
@@ -149,7 +149,7 @@
     }
 }
 
-static int nut_probe(AVProbeData *p)
+static int nut_probe(const AVProbeData *p)
 {
     int i;
 
@@ -427,8 +427,10 @@
 
     GET_V(st->codecpar->extradata_size, tmp < (1 << 30));
     if (st->codecpar->extradata_size) {
-        if (ff_get_extradata(s, st->codecpar, bc, st->codecpar->extradata_size) < 0)
-            return AVERROR(ENOMEM);
+        ret = ff_get_extradata(s, st->codecpar, bc,
+                               st->codecpar->extradata_size);
+        if (ret < 0)
+            return ret;
     }
 
     if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
@@ -582,7 +584,7 @@
             if (stream_id_plus1 && !strcmp(name, "r_frame_rate")) {
                 sscanf(str_value, "%d/%d", &st->r_frame_rate.num, &st->r_frame_rate.den);
                 if (st->r_frame_rate.num >= 1000LL*st->r_frame_rate.den ||
-                    st->r_frame_rate.num < 0 || st->r_frame_rate.num < 0)
+                    st->r_frame_rate.num < 0 || st->r_frame_rate.den < 0)
                     st->r_frame_rate.num = st->r_frame_rate.den = 0;
                 continue;
             }
@@ -1016,9 +1018,9 @@
     }
     stc = &nut->stream[*stream_id];
     if (flags & FLAG_CODED_PTS) {
-        int coded_pts = ffio_read_varlen(bc);
+        int64_t coded_pts = ffio_read_varlen(bc);
         // FIXME check last_pts validity?
-        if (coded_pts < (1 << stc->msb_pts_shift)) {
+        if (coded_pts < (1LL << stc->msb_pts_shift)) {
             *pts = ff_lsb2full(stc, coded_pts);
         } else
             *pts = coded_pts - (1LL << stc->msb_pts_shift);
@@ -1275,13 +1277,13 @@
         av_assert0(sp);
         pos2 = sp->back_ptr - 15;
     }
-    av_log(NULL, AV_LOG_DEBUG, "SEEKTO: %"PRId64"\n", pos2);
+    av_log(s, AV_LOG_DEBUG, "SEEKTO: %"PRId64"\n", pos2);
     pos = find_startcode(s->pb, SYNCPOINT_STARTCODE, pos2);
     avio_seek(s->pb, pos, SEEK_SET);
     nut->last_syncpoint_pos = pos;
-    av_log(NULL, AV_LOG_DEBUG, "SP: %"PRId64"\n", pos);
+    av_log(s, AV_LOG_DEBUG, "SP: %"PRId64"\n", pos);
     if (pos2 > pos || pos2 + 15 < pos)
-        av_log(NULL, AV_LOG_ERROR, "no syncpoint at backptr pos\n");
+        av_log(s, AV_LOG_ERROR, "no syncpoint at backptr pos\n");
     for (i = 0; i < s->nb_streams; i++)
         nut->stream[i].skip_until_key_frame = 1;
 
diff --git a/libavformat/nutenc.c b/libavformat/nutenc.c
index a92ff55..1d48625 100644
--- a/libavformat/nutenc.c
+++ b/libavformat/nutenc.c
@@ -637,8 +637,10 @@
         if (ret < 0)
             return ret;
         ret = write_streamheader(avctx, dyn_bc, nut->avf->streams[i], i);
-        if (ret < 0)
+        if (ret < 0) {
+            ffio_free_dyn_buf(&dyn_bc);
             return ret;
+        }
         put_packet(nut, bc, dyn_bc, 1, STREAM_STARTCODE);
     }
 
@@ -653,12 +655,13 @@
         if (ret < 0)
             return ret;
         ret = write_streaminfo(nut, dyn_bc, i);
-        if (ret < 0)
-            return ret;
         if (ret > 0)
             put_packet(nut, bc, dyn_bc, 1, INFO_STARTCODE);
-        else
+        else {
             ffio_free_dyn_buf(&dyn_bc);
+            if (ret < 0)
+                return ret;
+        }
     }
 
     for (i = 0; i < nut->avf->nb_chapters; i++) {
@@ -700,12 +703,8 @@
     nut->chapter  = av_calloc(s->nb_chapters, sizeof(*nut->chapter));
     nut->time_base= av_calloc(s->nb_streams +
                               s->nb_chapters, sizeof(*nut->time_base));
-    if (!nut->stream || !nut->chapter || !nut->time_base) {
-        av_freep(&nut->stream);
-        av_freep(&nut->chapter);
-        av_freep(&nut->time_base);
+    if (!nut->stream || !nut->chapter || !nut->time_base)
         return AVERROR(ENOMEM);
-    }
 
     for (i = 0; i < s->nb_streams; i++) {
         AVStream *st = s->streams[i];
@@ -765,8 +764,6 @@
     if (s->avoid_negative_ts < 0)
         s->avoid_negative_ts = 1;
 
-    avio_flush(bc);
-
     return 0;
 }
 
@@ -789,11 +786,12 @@
         flags |= FLAG_CHECKSUM;
     if (FFABS(pkt->pts - nus->last_pts) > nus->max_pts_distance)
         flags |= FLAG_CHECKSUM;
-    if (pkt->size < nut->header_len[fc->header_idx] ||
-        (pkt->size > 4096 && fc->header_idx)        ||
-        memcmp(pkt->data, nut->header[fc->header_idx],
-               nut->header_len[fc->header_idx]))
-        flags |= FLAG_HEADER_IDX;
+    if (fc->header_idx)
+        if (pkt->size < nut->header_len[fc->header_idx] ||
+            pkt->size > 4096                            ||
+            memcmp(pkt->data, nut->header    [fc->header_idx],
+                              nut->header_len[fc->header_idx]))
+            flags |= FLAG_HEADER_IDX;
 
     return flags | (fc->flags & FLAG_CODED);
 }
@@ -1170,9 +1168,12 @@
     while (nut->header_count < 3)
         write_headers(s, bc);
 
+    if (!nut->sp_count)
+        return 0;
+
     ret = avio_open_dyn_buf(&dyn_bc);
-    if (ret >= 0 && nut->sp_count) {
-        av_assert1(nut->write_index);
+    if (ret >= 0) {
+        av_assert1(nut->write_index); // sp_count should be 0 if no index is going to be written
         write_index(nut, dyn_bc);
         put_packet(nut, bc, dyn_bc, 1, INDEX_STARTCODE);
     }
diff --git a/libavformat/nuv.c b/libavformat/nuv.c
index 9bdea4a..d99770d 100644
--- a/libavformat/nuv.c
+++ b/libavformat/nuv.c
@@ -47,7 +47,7 @@
     NUV_MYTHEXT   = 'X'
 } nuv_frametype;
 
-static int nuv_probe(AVProbeData *p)
+static int nuv_probe(const AVProbeData *p)
 {
     if (!memcmp(p->buf, "NuppelVideo", 12))
         return AVPROBE_SCORE_MAX;
@@ -74,7 +74,7 @@
     if (!vst && !myth)
         return 1; // no codec data needed
     while (!avio_feof(pb)) {
-        int size, subtype;
+        int size, subtype, ret;
 
         frametype = avio_r8(pb);
         switch (frametype) {
@@ -83,12 +83,8 @@
             avio_skip(pb, 6);
             size = PKTSIZE(avio_rl32(pb));
             if (vst && subtype == 'R') {
-                if (vst->codecpar->extradata) {
-                    av_freep(&vst->codecpar->extradata);
-                    vst->codecpar->extradata_size = 0;
-                }
-                if (ff_get_extradata(NULL, vst->codecpar, pb, size) < 0)
-                    return AVERROR(ENOMEM);
+                if ((ret = ff_get_extradata(NULL, vst->codecpar, pb, size)) < 0)
+                    return ret;
                 size = 0;
                 if (!myth)
                     return 0;
@@ -288,7 +284,6 @@
             memcpy(pkt->data, hdr, copyhdrsize);
             ret = avio_read(pb, pkt->data + copyhdrsize, size);
             if (ret < 0) {
-                av_packet_unref(pkt);
                 return ret;
             }
             if (ret < size)
diff --git a/libavformat/oggdec.c b/libavformat/oggdec.c
index 27d16a3..9519058 100644
--- a/libavformat/oggdec.c
+++ b/libavformat/oggdec.c
@@ -216,7 +216,8 @@
         uint8_t magic[8];
         int64_t pos = avio_tell(s->pb);
         avio_skip(s->pb, nsegs);
-        avio_read(s->pb, magic, sizeof(magic));
+        if (avio_read(s->pb, magic, sizeof(magic)) != sizeof(magic))
+            return AVERROR_INVALIDDATA;
         avio_seek(s->pb, pos, SEEK_SET);
         codec = ogg_find_codec(magic, sizeof(magic));
         if (!codec) {
@@ -388,6 +389,9 @@
     avio_skip(bc, 8); /* seq, crc */
     nsegs  = avio_r8(bc);
 
+    if (avio_feof(bc))
+        return AVERROR_EOF;
+
     idx = ogg_find_stream(ogg, serial);
     if (idx < 0) {
         if (data_packets_seen(ogg))
@@ -851,7 +855,7 @@
                                                      AV_PKT_DATA_SKIP_SAMPLES,
                                                      10);
         if(!side_data)
-            goto fail;
+            return AVERROR(ENOMEM);
         AV_WL32(side_data + 4, os->end_trimming);
         os->end_trimming = 0;
     }
@@ -861,7 +865,7 @@
                                                      AV_PKT_DATA_METADATA_UPDATE,
                                                      os->new_metadata_size);
         if(!side_data)
-            goto fail;
+            return AVERROR(ENOMEM);
 
         memcpy(side_data, os->new_metadata, os->new_metadata_size);
         av_freep(&os->new_metadata);
@@ -869,9 +873,6 @@
     }
 
     return psize;
-fail:
-    av_packet_unref(pkt);
-    return AVERROR(ENOMEM);
 }
 
 static int64_t ogg_read_timestamp(AVFormatContext *s, int stream_index,
@@ -941,7 +942,7 @@
     return ret;
 }
 
-static int ogg_probe(AVProbeData *p)
+static int ogg_probe(const AVProbeData *p)
 {
     if (!memcmp("OggS", p->buf, 5) && p->buf[5] <= 0x7)
         return AVPROBE_SCORE_MAX;
diff --git a/libavformat/oggenc.c b/libavformat/oggenc.c
index 10c4eda..fbd14fe 100644
--- a/libavformat/oggenc.c
+++ b/libavformat/oggenc.c
@@ -133,14 +133,13 @@
     avio_write(pb, page->data, page->size);
 
     ogg_update_checksum(s, pb, crc_offset);
-    avio_flush(pb);
 
     size = avio_close_dyn_buf(pb, &buf);
     if (size < 0)
         return size;
 
     avio_write(s->pb, buf, size);
-    avio_flush(s->pb);
+    avio_write_marker(s->pb, AV_NOPTS_VALUE, AVIO_DATA_MARKER_FLUSH_POINT);
     av_free(buf);
     oggstream->page_count--;
     return 0;
@@ -291,7 +290,8 @@
 }
 
 static uint8_t *ogg_write_vorbiscomment(int64_t offset, int bitexact,
-                                        int *header_len, AVDictionary **m, int framing_bit)
+                                        int *header_len, AVDictionary **m, int framing_bit,
+                                        AVChapter **chapters, unsigned int nb_chapters)
 {
     const char *vendor = bitexact ? "ffmpeg" : LIBAVFORMAT_IDENT;
     int64_t size;
@@ -299,7 +299,7 @@
 
     ff_metadata_conv(m, ff_vorbiscomment_metadata_conv, NULL);
 
-    size = offset + ff_vorbiscomment_length(*m, vendor) + framing_bit;
+    size = offset + ff_vorbiscomment_length(*m, vendor, chapters, nb_chapters) + framing_bit;
     if (size > INT_MAX)
         return NULL;
     p = av_mallocz(size);
@@ -308,7 +308,7 @@
     p0 = p;
 
     p += offset;
-    ff_vorbiscomment_write(&p, m, vendor);
+    ff_vorbiscomment_write(&p, m, vendor, chapters, nb_chapters);
     if (framing_bit)
         bytestream_put_byte(&p, 1);
 
@@ -342,7 +342,7 @@
     bytestream_put_buffer(&p, par->extradata, FLAC_STREAMINFO_SIZE);
 
     // second packet: VorbisComment
-    p = ogg_write_vorbiscomment(4, bitexact, &oggstream->header_len[1], m, 0);
+    p = ogg_write_vorbiscomment(4, bitexact, &oggstream->header_len[1], m, 0, NULL, 0);
     if (!p)
         return AVERROR(ENOMEM);
     oggstream->header[1] = p;
@@ -373,7 +373,7 @@
     AV_WL32(&oggstream->header[0][68], 0);  // set extra_headers to 0
 
     // second packet: VorbisComment
-    p = ogg_write_vorbiscomment(0, bitexact, &oggstream->header_len[1], m, 0);
+    p = ogg_write_vorbiscomment(0, bitexact, &oggstream->header_len[1], m, 0, NULL, 0);
     if (!p)
         return AVERROR(ENOMEM);
     oggstream->header[1] = p;
@@ -385,7 +385,8 @@
 
 static int ogg_build_opus_headers(AVCodecParameters *par,
                                   OGGStreamContext *oggstream, int bitexact,
-                                  AVDictionary **m)
+                                  AVDictionary **m, AVChapter **chapters,
+                                  unsigned int nb_chapters)
 {
     uint8_t *p;
 
@@ -401,7 +402,7 @@
     bytestream_put_buffer(&p, par->extradata, par->extradata_size);
 
     /* second packet: VorbisComment */
-    p = ogg_write_vorbiscomment(8, bitexact, &oggstream->header_len[1], m, 0);
+    p = ogg_write_vorbiscomment(8, bitexact, &oggstream->header_len[1], m, 0, chapters, nb_chapters);
     if (!p)
         return AVERROR(ENOMEM);
     oggstream->header[1] = p;
@@ -446,7 +447,7 @@
 
     /* optional second packet: VorbisComment */
     if (av_dict_get(st->metadata, "", NULL, AV_DICT_IGNORE_SUFFIX)) {
-        p = ogg_write_vorbiscomment(7, bitexact, &oggstream->header_len[1], &st->metadata, 0);
+        p = ogg_write_vorbiscomment(7, bitexact, &oggstream->header_len[1], &st->metadata, 0, NULL, 0);
         if (!p)
             return AVERROR(ENOMEM);
         oggstream->header[1] = p;
@@ -545,7 +546,6 @@
                                              &st->metadata);
             if (err) {
                 av_log(s, AV_LOG_ERROR, "Error writing FLAC headers\n");
-                av_freep(&st->priv_data);
                 return err;
             }
         } else if (st->codecpar->codec_id == AV_CODEC_ID_SPEEX) {
@@ -554,16 +554,14 @@
                                               &st->metadata);
             if (err) {
                 av_log(s, AV_LOG_ERROR, "Error writing Speex headers\n");
-                av_freep(&st->priv_data);
                 return err;
             }
         } else if (st->codecpar->codec_id == AV_CODEC_ID_OPUS) {
             int err = ogg_build_opus_headers(st->codecpar, oggstream,
                                              s->flags & AVFMT_FLAG_BITEXACT,
-                                             &st->metadata);
+                                             &st->metadata, s->chapters, s->nb_chapters);
             if (err) {
                 av_log(s, AV_LOG_ERROR, "Error writing Opus headers\n");
-                av_freep(&st->priv_data);
                 return err;
             }
         } else if (st->codecpar->codec_id == AV_CODEC_ID_VP8) {
@@ -571,7 +569,6 @@
                                             s->flags & AVFMT_FLAG_BITEXACT);
             if (err) {
                 av_log(s, AV_LOG_ERROR, "Error writing VP8 headers\n");
-                av_freep(&st->priv_data);
                 return err;
             }
         } else {
@@ -584,13 +581,13 @@
                                       st->codecpar->codec_id == AV_CODEC_ID_VORBIS ? 30 : 42,
                                       (const uint8_t**)oggstream->header, oggstream->header_len) < 0) {
                 av_log(s, AV_LOG_ERROR, "Extradata corrupted\n");
-                av_freep(&st->priv_data);
+                oggstream->header[1] = NULL;
                 return AVERROR_INVALIDDATA;
             }
 
             p = ogg_write_vorbiscomment(7, s->flags & AVFMT_FLAG_BITEXACT,
                                         &oggstream->header_len[1], &st->metadata,
-                                        framing_bit);
+                                        framing_bit, NULL, 0);
             oggstream->header[1] = p;
             if (!p)
                 return AVERROR(ENOMEM);
@@ -738,6 +735,8 @@
 
 static void ogg_free(AVFormatContext *s)
 {
+    OGGContext *ogg = s->priv_data;
+    OGGPageList *p = ogg->page_list;
     int i;
 
     for (i = 0; i < s->nb_streams; i++) {
@@ -752,8 +751,14 @@
             av_freep(&oggstream->header[0]);
         }
         av_freep(&oggstream->header[1]);
-        av_freep(&st->priv_data);
     }
+
+    while (p) {
+        OGGPageList *next = p->next;
+        av_free(p);
+        p = next;
+    }
+    ogg->page_list = NULL;
 }
 
 #if CONFIG_OGG_MUXER
diff --git a/libavformat/oggparsecelt.c b/libavformat/oggparsecelt.c
index 9c438a0..f7a88af 100644
--- a/libavformat/oggparsecelt.c
+++ b/libavformat/oggparsecelt.c
@@ -37,6 +37,7 @@
     AVStream *st = s->streams[idx];
     struct oggcelt_private *priv = os->private;
     uint8_t *p = os->buf + os->pstart;
+    int ret;
 
     if (os->psize == 60 &&
         !memcmp(p, ff_celt_codec.magic, ff_celt_codec.magicsize)) {
@@ -48,9 +49,10 @@
         priv = av_malloc(sizeof(struct oggcelt_private));
         if (!priv)
             return AVERROR(ENOMEM);
-        if (ff_alloc_extradata(st->codecpar, 2 * sizeof(uint32_t)) < 0) {
+        ret = ff_alloc_extradata(st->codecpar, 2 * sizeof(uint32_t));
+        if (ret < 0) {
             av_free(priv);
-            return AVERROR(ENOMEM);
+            return ret;
         }
         version          = AV_RL32(p + 28);
         /* unused header size field skipped */
diff --git a/libavformat/oggparseflac.c b/libavformat/oggparseflac.c
index b5f1416..4e85b05 100644
--- a/libavformat/oggparseflac.c
+++ b/libavformat/oggparseflac.c
@@ -34,7 +34,7 @@
     struct ogg_stream *os = ogg->streams + idx;
     AVStream *st = s->streams[idx];
     GetBitContext gb;
-    int mdt;
+    int mdt, ret;
 
     if (os->buf[os->pstart] == 0xff)
         return 0;
@@ -50,7 +50,7 @@
         skip_bits_long(&gb, 4*8); /* "FLAC" */
         if(get_bits(&gb, 8) != 1) /* unsupported major version */
             return -1;
-        skip_bits_long(&gb, 8 + 16); /* minor version + header count */
+        skip_bits(&gb, 8 + 16);   /* minor version + header count */
         skip_bits_long(&gb, 4*8); /* "fLaC" */
 
         /* METADATA_BLOCK_HEADER */
@@ -61,8 +61,8 @@
         st->codecpar->codec_id = AV_CODEC_ID_FLAC;
         st->need_parsing = AVSTREAM_PARSE_HEADERS;
 
-        if (ff_alloc_extradata(st->codecpar, FLAC_STREAMINFO_SIZE) < 0)
-            return AVERROR(ENOMEM);
+        if ((ret = ff_alloc_extradata(st->codecpar, FLAC_STREAMINFO_SIZE)) < 0)
+            return ret;
         memcpy(st->codecpar->extradata, streaminfo_start, st->codecpar->extradata_size);
 
         samplerate = AV_RB24(st->codecpar->extradata + 10) >> 4;
diff --git a/libavformat/oggparseogm.c b/libavformat/oggparseogm.c
index a074537..469b229 100644
--- a/libavformat/oggparseogm.c
+++ b/libavformat/oggparseogm.c
@@ -43,6 +43,7 @@
     uint64_t time_unit;
     uint64_t spu;
     uint32_t size;
+    int ret;
 
     bytestream2_init(&p, os->buf + os->pstart, os->psize);
     if (!(bytestream2_peek_byte(&p) & 1))
@@ -108,12 +109,14 @@
                 size -= 52;
                 if (bytestream2_get_bytes_left(&p) < size)
                     return AVERROR_INVALIDDATA;
-                av_freep(&st->codecpar->extradata);
-                if (ff_alloc_extradata(st->codecpar, size) < 0)
-                    return AVERROR(ENOMEM);
+                if ((ret = ff_alloc_extradata(st->codecpar, size)) < 0)
+                    return ret;
                 bytestream2_get_buffer(&p, st->codecpar->extradata, st->codecpar->extradata_size);
             }
         }
+
+        // Update internal avctx with changes to codecpar above.
+        st->internal->need_context_update = 1;
     } else if (bytestream2_peek_byte(&p) == 3) {
         bytestream2_skip(&p, 7);
         if (bytestream2_get_bytes_left(&p) > 1)
diff --git a/libavformat/oggparseopus.c b/libavformat/oggparseopus.c
index cd34cf2..56b53e7 100644
--- a/libavformat/oggparseopus.c
+++ b/libavformat/oggparseopus.c
@@ -42,6 +42,7 @@
     AVStream *st                 = avf->streams[idx];
     struct oggopus_private *priv = os->private;
     uint8_t *packet              = os->buf + os->pstart;
+    int ret;
 
     if (!priv) {
         priv = os->private = av_mallocz(sizeof(*priv));
@@ -62,9 +63,8 @@
         /*gain                = AV_RL16(packet + 16);*/
         /*channel_map         = AV_RL8 (packet + 18);*/
 
-        av_freep(&st->codecpar->extradata);
-        if (ff_alloc_extradata(st->codecpar, os->psize))
-            return AVERROR(ENOMEM);
+        if ((ret = ff_alloc_extradata(st->codecpar, os->psize)) < 0)
+            return ret;
 
         memcpy(st->codecpar->extradata, packet, os->psize);
 
diff --git a/libavformat/oggparsespeex.c b/libavformat/oggparsespeex.c
index 27fc992..c4fee7e 100644
--- a/libavformat/oggparsespeex.c
+++ b/libavformat/oggparsespeex.c
@@ -46,6 +46,7 @@
     struct speex_params *spxp = os->private;
     AVStream *st = s->streams[idx];
     uint8_t *p = os->buf + os->pstart;
+    int ret;
 
     if (!spxp) {
         spxp = av_mallocz(sizeof(*spxp));
@@ -92,8 +93,8 @@
         if (frames_per_packet)
             spxp->packet_size *= frames_per_packet;
 
-        if (ff_alloc_extradata(st->codecpar, os->psize) < 0)
-            return AVERROR(ENOMEM);
+        if ((ret = ff_alloc_extradata(st->codecpar, os->psize)) < 0)
+            return ret;
         memcpy(st->codecpar->extradata, p, st->codecpar->extradata_size);
 
         avpriv_set_pts_info(st, 64, 1, st->codecpar->sample_rate);
diff --git a/libavformat/oggparsetheora.c b/libavformat/oggparsetheora.c
index b0c0edc..87a676f 100644
--- a/libavformat/oggparsetheora.c
+++ b/libavformat/oggparsetheora.c
@@ -65,7 +65,7 @@
         /* 0x80"theora" */
         skip_bits_long(&gb, 7 * 8);
 
-        thp->version = get_bits_long(&gb, 24);
+        thp->version = get_bits(&gb, 24);
         if (thp->version < 0x030100) {
             av_log(s, AV_LOG_ERROR,
                    "Too old or unsupported Theora (%x)\n", thp->version);
@@ -79,8 +79,8 @@
             skip_bits(&gb, 100);
 
         if (thp->version >= 0x030200) {
-            int width  = get_bits_long(&gb, 24);
-            int height = get_bits_long(&gb, 24);
+            int width  = get_bits(&gb, 24);
+            int height = get_bits(&gb, 24);
             if (width  <= st->codecpar->width  && width  > st->codecpar->width  - 16 &&
                 height <= st->codecpar->height && height > st->codecpar->height - 16) {
                 st->codecpar->width  = width;
@@ -99,8 +99,8 @@
         }
         avpriv_set_pts_info(st, 64, timebase.num, timebase.den);
 
-        st->sample_aspect_ratio.num = get_bits_long(&gb, 24);
-        st->sample_aspect_ratio.den = get_bits_long(&gb, 24);
+        st->sample_aspect_ratio.num = get_bits(&gb, 24);
+        st->sample_aspect_ratio.den = get_bits(&gb, 24);
 
         if (thp->version >= 0x030200)
             skip_bits_long(&gb, 38);
diff --git a/libavformat/oggparsevorbis.c b/libavformat/oggparsevorbis.c
index bcfd246..27d2c68 100644
--- a/libavformat/oggparsevorbis.c
+++ b/libavformat/oggparsevorbis.c
@@ -44,7 +44,7 @@
     int i, cnum, h, m, s, ms, keylen = strlen(key);
     AVChapter *chapter = NULL;
 
-    if (keylen < 9 || sscanf(key, "CHAPTER%03d", &cnum) != 1)
+    if (keylen < 9 || av_strncasecmp(key, "CHAPTER", 7) || sscanf(key+7, "%03d", &cnum) != 1)
         return 0;
 
     if (keylen <= 10) {
@@ -55,7 +55,7 @@
                            ms + 1000 * (s + 60 * (m + 60 * h)),
                            AV_NOPTS_VALUE, NULL);
         av_free(val);
-    } else if (!strcmp(key + keylen - 4, "NAME")) {
+    } else if (!av_strcasecmp(key + keylen - 4, "NAME")) {
         for (i = 0; i < as->nb_chapters; i++)
             if (as->chapters[i]->id == cnum) {
                 chapter = as->chapters[i];
@@ -91,7 +91,7 @@
     const uint8_t *p   = buf;
     const uint8_t *end = buf + size;
     int updates        = 0;
-    unsigned n, j;
+    unsigned n;
     int s;
 
     /* must have vendor_length and user_comment_list_length */
@@ -139,8 +139,7 @@
                 return AVERROR(ENOMEM);
             }
 
-            for (j = 0; j < tl; j++)
-                tt[j] = av_toupper(t[j]);
+            memcpy(tt, t, tl);
             tt[tl] = 0;
 
             memcpy(ct, v, vl);
@@ -152,7 +151,7 @@
              * 'METADATA_BLOCK_PICTURE'. This is the preferred and
              * recommended way of embedding cover art within VorbisComments."
              */
-            if (!strcmp(tt, "METADATA_BLOCK_PICTURE") && parse_picture) {
+            if (!av_strcasecmp(tt, "METADATA_BLOCK_PICTURE") && parse_picture) {
                 int ret, len = AV_BASE64_DECODE_SIZE(vl);
                 char *pict = av_malloc(len);
 
@@ -178,9 +177,8 @@
                     av_dict_set(m, tt, ";", AV_DICT_APPEND);
                 }
                 av_dict_set(m, tt, ct,
-                            AV_DICT_DONT_STRDUP_KEY |
+                            AV_DICT_DONT_STRDUP_KEY | AV_DICT_DONT_STRDUP_VAL |
                             AV_DICT_APPEND);
-                av_freep(&ct);
             }
         }
     }
diff --git a/libavformat/omadec.c b/libavformat/omadec.c
index 423d52b..9521b6d 100644
--- a/libavformat/omadec.c
+++ b/libavformat/omadec.c
@@ -459,8 +459,8 @@
 
         /* fake the ATRAC3 extradata
          * (wav format, makes stream copy to wav work) */
-        if (ff_alloc_extradata(st->codecpar, 14))
-            return AVERROR(ENOMEM);
+        if ((ret = ff_alloc_extradata(st->codecpar, 14)) < 0)
+            return ret;
 
         edata = st->codecpar->extradata;
         AV_WL16(&edata[0],  1);             // always 1
@@ -539,7 +539,7 @@
     return oc->read_packet(s, pkt);
 }
 
-static int oma_read_probe(AVProbeData *p)
+static int oma_read_probe(const AVProbeData *p)
 {
     const uint8_t *buf = p->buf;
     unsigned tag_len = 0;
diff --git a/libavformat/options.c b/libavformat/options.c
index c188c23..e145105 100644
--- a/libavformat/options.c
+++ b/libavformat/options.c
@@ -144,15 +144,17 @@
 AVFormatContext *avformat_alloc_context(void)
 {
     AVFormatContext *ic;
+    AVFormatInternal *internal;
     ic = av_malloc(sizeof(AVFormatContext));
     if (!ic) return ic;
-    avformat_get_context_defaults(ic);
 
-    ic->internal = av_mallocz(sizeof(*ic->internal));
-    if (!ic->internal) {
-        avformat_free_context(ic);
+    internal = av_mallocz(sizeof(*internal));
+    if (!internal) {
+        av_free(ic);
         return NULL;
     }
+    avformat_get_context_defaults(ic);
+    ic->internal = internal;
     ic->internal->offset = AV_NOPTS_VALUE;
     ic->internal->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
     ic->internal->shortest_end = AV_NOPTS_VALUE;
diff --git a/libavformat/options_table.h b/libavformat/options_table.h
index f2f077b..b414156 100644
--- a/libavformat/options_table.h
+++ b/libavformat/options_table.h
@@ -82,8 +82,8 @@
 {"explode", "abort decoding on minor error detection", 0, AV_OPT_TYPE_CONST, {.i64 = AV_EF_EXPLODE }, INT_MIN, INT_MAX, D, "err_detect"},
 {"ignore_err", "ignore errors", 0, AV_OPT_TYPE_CONST, {.i64 = AV_EF_IGNORE_ERR }, INT_MIN, INT_MAX, D, "err_detect"},
 {"careful",    "consider things that violate the spec, are fast to check and have not been seen in the wild as errors", 0, AV_OPT_TYPE_CONST, {.i64 = AV_EF_CAREFUL }, INT_MIN, INT_MAX, D, "err_detect"},
-{"compliant",  "consider all spec non compliancies as errors", 0, AV_OPT_TYPE_CONST, {.i64 = AV_EF_COMPLIANT }, INT_MIN, INT_MAX, D, "err_detect"},
-{"aggressive", "consider things that a sane encoder shouldn't do as an error", 0, AV_OPT_TYPE_CONST, {.i64 = AV_EF_AGGRESSIVE }, INT_MIN, INT_MAX, D, "err_detect"},
+{"compliant",  "consider all spec non compliancies as errors", 0, AV_OPT_TYPE_CONST, {.i64 = AV_EF_COMPLIANT | AV_EF_CAREFUL }, INT_MIN, INT_MAX, D, "err_detect"},
+{"aggressive", "consider things that a sane encoder shouldn't do as an error", 0, AV_OPT_TYPE_CONST, {.i64 = AV_EF_AGGRESSIVE | AV_EF_COMPLIANT | AV_EF_CAREFUL}, INT_MIN, INT_MAX, D, "err_detect"},
 {"use_wallclock_as_timestamps", "use wallclock as timestamps", OFFSET(use_wallclock_as_timestamps), AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, D},
 {"skip_initial_bytes", "set number of bytes to skip before reading header and frames", OFFSET(skip_initial_bytes), AV_OPT_TYPE_INT64, {.i64 = 0}, 0, INT64_MAX-1, D},
 {"correct_ts_overflow", "correct single timestamp overflows", OFFSET(correct_ts_overflow), AV_OPT_TYPE_BOOL, {.i64 = 1}, 0, 1, D},
@@ -104,13 +104,14 @@
 {"disabled",          "do not change timestamps",                  0, AV_OPT_TYPE_CONST, {.i64 = 0 },                                    INT_MIN, INT_MAX, E, "avoid_negative_ts"},
 {"make_non_negative", "shift timestamps so they are non negative", 0, AV_OPT_TYPE_CONST, {.i64 = AVFMT_AVOID_NEG_TS_MAKE_NON_NEGATIVE }, INT_MIN, INT_MAX, E, "avoid_negative_ts"},
 {"make_zero",         "shift timestamps so they start at 0",       0, AV_OPT_TYPE_CONST, {.i64 = AVFMT_AVOID_NEG_TS_MAKE_ZERO },         INT_MIN, INT_MAX, E, "avoid_negative_ts"},
-{"dump_separator", "set information dump field separator", OFFSET(dump_separator), AV_OPT_TYPE_STRING, {.str = ", "}, CHAR_MIN, CHAR_MAX, D|E},
-{"codec_whitelist", "List of decoders that are allowed to be used", OFFSET(codec_whitelist), AV_OPT_TYPE_STRING, { .str = NULL },  CHAR_MIN, CHAR_MAX, D },
-{"format_whitelist", "List of demuxers that are allowed to be used", OFFSET(format_whitelist), AV_OPT_TYPE_STRING, { .str = NULL },  CHAR_MIN, CHAR_MAX, D },
-{"protocol_whitelist", "List of protocols that are allowed to be used", OFFSET(protocol_whitelist), AV_OPT_TYPE_STRING, { .str = NULL },  CHAR_MIN, CHAR_MAX, D },
-{"protocol_blacklist", "List of protocols that are not allowed to be used", OFFSET(protocol_blacklist), AV_OPT_TYPE_STRING, { .str = NULL },  CHAR_MIN, CHAR_MAX, D },
+{"dump_separator", "set information dump field separator", OFFSET(dump_separator), AV_OPT_TYPE_STRING, {.str = ", "}, 0, 0, D|E},
+{"codec_whitelist", "List of decoders that are allowed to be used", OFFSET(codec_whitelist), AV_OPT_TYPE_STRING, { .str = NULL },  0, 0, D },
+{"format_whitelist", "List of demuxers that are allowed to be used", OFFSET(format_whitelist), AV_OPT_TYPE_STRING, { .str = NULL },  0, 0, D },
+{"protocol_whitelist", "List of protocols that are allowed to be used", OFFSET(protocol_whitelist), AV_OPT_TYPE_STRING, { .str = NULL },  0, 0, D },
+{"protocol_blacklist", "List of protocols that are not allowed to be used", OFFSET(protocol_blacklist), AV_OPT_TYPE_STRING, { .str = NULL },  0, 0, D },
 {"max_streams", "maximum number of streams", OFFSET(max_streams), AV_OPT_TYPE_INT, { .i64 = 1000 }, 0, INT_MAX, D },
 {"skip_estimate_duration_from_pts", "skip duration calculation in estimate_timings_from_pts", OFFSET(skip_estimate_duration_from_pts), AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, D},
+{"max_probe_packets", "Maximum number of packets to probe a codec", OFFSET(max_probe_packets), AV_OPT_TYPE_INT, { .i64 = 2500 }, 0, INT_MAX, D },
 {NULL},
 };
 
diff --git a/libavformat/os_support.h b/libavformat/os_support.h
index 7a56dc9..5e6b32d 100644
--- a/libavformat/os_support.h
+++ b/libavformat/os_support.h
@@ -76,17 +76,7 @@
     return 0;
 }
 
-#if defined(__OS2__)
-#define SHUT_RD 0
-#define SHUT_WR 1
-#define SHUT_RDWR 2
-#endif
-
 #if defined(_WIN32)
-#define SHUT_RD SD_RECEIVE
-#define SHUT_WR SD_SEND
-#define SHUT_RDWR SD_BOTH
-
 #ifndef S_IRUSR
 #define S_IRUSR S_IREAD
 #endif
@@ -96,6 +86,19 @@
 #endif
 
 #if CONFIG_NETWORK
+#if defined(_WIN32)
+#define SHUT_RD SD_RECEIVE
+#define SHUT_WR SD_SEND
+#define SHUT_RDWR SD_BOTH
+#else
+#include <sys/socket.h>
+#if !defined(SHUT_RD) /* OS/2, DJGPP */
+#define SHUT_RD 0
+#define SHUT_WR 1
+#define SHUT_RDWR 2
+#endif
+#endif
+
 #if !HAVE_SOCKLEN_T
 typedef int socklen_t;
 #endif
diff --git a/libavformat/paf.c b/libavformat/paf.c
index fa30cdd..a31d015 100644
--- a/libavformat/paf.c
+++ b/libavformat/paf.c
@@ -53,7 +53,7 @@
     int got_audio;
 } PAFDemuxContext;
 
-static int read_probe(AVProbeData *p)
+static int read_probe(const AVProbeData *p)
 {
     if ((p->buf_size >= strlen(MAGIC)) &&
         !memcmp(p->buf, MAGIC, strlen(MAGIC)))
@@ -194,7 +194,7 @@
     PAFDemuxContext *p  = s->priv_data;
     AVIOContext     *pb = s->pb;
     uint32_t        count, offset;
-    int             size, i;
+    int             size, i, ret;
 
     if (p->current_frame >= p->nb_frames)
         return AVERROR_EOF;
@@ -203,8 +203,8 @@
         return AVERROR_EOF;
 
     if (p->got_audio) {
-        if (av_new_packet(pkt, p->audio_size) < 0)
-            return AVERROR(ENOMEM);
+        if ((ret = av_new_packet(pkt, p->audio_size)) < 0)
+            return ret;
 
         memcpy(pkt->data, p->temp_audio_frame, p->audio_size);
         pkt->duration     = PAF_SOUND_SAMPLES * (p->audio_size / PAF_SOUND_FRAME_SIZE);
@@ -244,8 +244,8 @@
 
     size = p->video_size - p->frames_offset_table[p->current_frame];
 
-    if (av_new_packet(pkt, size) < 0)
-        return AVERROR(ENOMEM);
+    if ((ret = av_new_packet(pkt, size)) < 0)
+        return ret;
 
     pkt->stream_index = 0;
     pkt->duration     = 1;
diff --git a/libavformat/pcmdec.c b/libavformat/pcmdec.c
index d0ceea6..9895af0 100644
--- a/libavformat/pcmdec.c
+++ b/libavformat/pcmdec.c
@@ -50,9 +50,9 @@
 
     av_opt_get(s->pb, "mime_type", AV_OPT_SEARCH_CHILDREN, &mime_type);
     if (mime_type && s->iformat->mime_type) {
-        int rate = 0, channels = 0;
+        int rate = 0, channels = 0, little_endian = 0;
         size_t len = strlen(s->iformat->mime_type);
-        if (!strncmp(s->iformat->mime_type, mime_type, len)) {
+        if (!av_strncasecmp(s->iformat->mime_type, mime_type, len)) { /* audio/L16 */
             uint8_t *options = mime_type + len;
             len = strlen(mime_type);
             while (options < mime_type + len) {
@@ -63,6 +63,12 @@
                     sscanf(options, " rate=%d",     &rate);
                 if (!channels)
                     sscanf(options, " channels=%d", &channels);
+                if (!little_endian) {
+                     char val[14]; /* sizeof("little-endian") == 14 */
+                     if (sscanf(options, " endianness=%13s", val) == 1) {
+                         little_endian = strcmp(val, "little-endian") == 0;
+                     }
+                }
             }
             if (rate <= 0) {
                 av_log(s, AV_LOG_ERROR,
@@ -74,6 +80,8 @@
             st->codecpar->sample_rate = rate;
             if (channels > 0)
                 st->codecpar->channels = channels;
+            if (little_endian)
+                st->codecpar->codec_id = AV_CODEC_ID_PCM_S16LE;
         }
     }
     av_freep(&mime_type);
@@ -142,10 +150,10 @@
        NULL, AV_CODEC_ID_PCM_S24LE)
 
 PCMDEF(s16be, "PCM signed 16-bit big-endian",
-       AV_NE("sw", NULL), AV_CODEC_ID_PCM_S16BE)
+       AV_NE("sw", NULL), AV_CODEC_ID_PCM_S16BE, .mime_type = "audio/L16")
 
 PCMDEF(s16le, "PCM signed 16-bit little-endian",
-       AV_NE(NULL, "sw"), AV_CODEC_ID_PCM_S16LE, .mime_type = "audio/L16",)
+       AV_NE(NULL, "sw"), AV_CODEC_ID_PCM_S16LE)
 
 PCMDEF(s8, "PCM signed 8-bit",
        "sb", AV_CODEC_ID_PCM_S8)
@@ -177,6 +185,9 @@
 PCMDEF(mulaw, "PCM mu-law",
        "ul", AV_CODEC_ID_PCM_MULAW)
 
+PCMDEF(vidc, "PCM Archimedes VIDC",
+       NULL, AV_CODEC_ID_PCM_VIDC)
+
 static const AVOption sln_options[] = {
     { "sample_rate", "", offsetof(PCMAudioDemuxerContext, sample_rate), AV_OPT_TYPE_INT, {.i64 = 8000}, 0, INT_MAX, AV_OPT_FLAG_DECODING_PARAM },
     { "channels",    "", offsetof(PCMAudioDemuxerContext, channels),    AV_OPT_TYPE_INT, {.i64 = 1}, 0, INT_MAX, AV_OPT_FLAG_DECODING_PARAM },
diff --git a/libavformat/pcmenc.c b/libavformat/pcmenc.c
index 3e4f308..1760b3b 100644
--- a/libavformat/pcmenc.c
+++ b/libavformat/pcmenc.c
@@ -92,3 +92,6 @@
 
 PCMDEF(mulaw, "PCM mu-law",
        "ul", AV_CODEC_ID_PCM_MULAW)
+
+PCMDEF(vidc, "PCM Archimedes VIDC",
+       NULL, AV_CODEC_ID_PCM_VIDC)
diff --git a/libavformat/pjsdec.c b/libavformat/pjsdec.c
index bb587b5..8a5cc04 100644
--- a/libavformat/pjsdec.c
+++ b/libavformat/pjsdec.c
@@ -33,7 +33,7 @@
     FFDemuxSubtitlesQueue q;
 } PJSContext;
 
-static int pjs_probe(AVProbeData *p)
+static int pjs_probe(const AVProbeData *p)
 {
     char c;
     int64_t start, end;
@@ -55,6 +55,8 @@
     if (sscanf(*line, "%"SCNd64",%"SCNd64, &start, &end) == 2) {
         *line += strcspn(*line, "\"");
         *line += !!**line;
+        if (end < start || end - (uint64_t)start > INT_MAX)
+            return AV_NOPTS_VALUE;
         *duration = end - start;
         return start;
     }
diff --git a/libavformat/pmpdec.c b/libavformat/pmpdec.c
index 0e80a09..0c2b6f5 100644
--- a/libavformat/pmpdec.c
+++ b/libavformat/pmpdec.c
@@ -32,7 +32,7 @@
     int packet_sizes_alloc;
 } PMPContext;
 
-static int pmp_probe(AVProbeData *p) {
+static int pmp_probe(const AVProbeData *p) {
     if (AV_RN32(p->buf) == AV_RN32("pmpm") &&
         AV_RL32(p->buf + 4) == 1)
         return AVPROBE_SCORE_MAX;
diff --git a/libavformat/protocols.c b/libavformat/protocols.c
index ad95659..f1b8eab 100644
--- a/libavformat/protocols.c
+++ b/libavformat/protocols.c
@@ -60,6 +60,7 @@
 extern const URLProtocol ff_udp_protocol;
 extern const URLProtocol ff_udplite_protocol;
 extern const URLProtocol ff_unix_protocol;
+extern const URLProtocol ff_libamqp_protocol;
 extern const URLProtocol ff_librtmp_protocol;
 extern const URLProtocol ff_librtmpe_protocol;
 extern const URLProtocol ff_librtmps_protocol;
@@ -68,6 +69,7 @@
 extern const URLProtocol ff_libsrt_protocol;
 extern const URLProtocol ff_libssh_protocol;
 extern const URLProtocol ff_libsmbclient_protocol;
+extern const URLProtocol ff_libzmq_protocol;
 
 #include "libavformat/protocol_list.c"
 
@@ -106,6 +108,16 @@
     return avio_enum_protocols(opaque, output);
 }
 
+const AVClass *avio_protocol_get_class(const char *name)
+{
+    int i = 0;
+    for (i = 0; url_protocols[i]; i++) {
+        if (!strcmp(url_protocols[i]->name, name))
+            return url_protocols[i]->priv_data_class;
+    }
+    return NULL;
+}
+
 const URLProtocol **ffurl_get_protocols(const char *whitelist,
                                         const char *blacklist)
 {
diff --git a/libavformat/psxstr.c b/libavformat/psxstr.c
index f7b9495..678b9f9 100644
--- a/libavformat/psxstr.c
+++ b/libavformat/psxstr.c
@@ -68,7 +68,7 @@
 
 static const uint8_t sync_header[12] = {0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00};
 
-static int str_probe(AVProbeData *p)
+static int str_probe(const AVProbeData *p)
 {
     const uint8_t *sector= p->buf;
     const uint8_t *end= sector + p->buf_size;
@@ -160,7 +160,7 @@
     AVIOContext *pb = s->pb;
     StrDemuxContext *str = s->priv_data;
     unsigned char sector[RAW_CD_SECTOR_SIZE];
-    int channel;
+    int channel, ret;
     AVPacket *pkt;
     AVStream *st;
 
@@ -213,8 +213,9 @@
                     if(pkt->data)
                         av_log(s, AV_LOG_ERROR, "mismatching sector_count\n");
                     av_packet_unref(pkt);
-                    if (av_new_packet(pkt, sector_count*VIDEO_DATA_CHUNK_SIZE))
-                        return AVERROR(EIO);
+                    ret = av_new_packet(pkt, sector_count * VIDEO_DATA_CHUNK_SIZE);
+                    if (ret < 0)
+                        return ret;
                     memset(pkt->data, 0, sector_count*VIDEO_DATA_CHUNK_SIZE);
 
                     pkt->pos= avio_tell(pb) - RAW_CD_SECTOR_SIZE;
@@ -267,8 +268,8 @@
                 st->start_time = 0;
             }
             pkt = ret_pkt;
-            if (av_new_packet(pkt, 2304))
-                return AVERROR(EIO);
+            if ((ret = av_new_packet(pkt, 2304)) < 0)
+                return ret;
             memcpy(pkt->data,sector+24,2304);
 
             pkt->stream_index =
diff --git a/libavformat/pva.c b/libavformat/pva.c
index 04ae8e2..58ec787 100644
--- a/libavformat/pva.c
+++ b/libavformat/pva.c
@@ -40,7 +40,7 @@
     return length + 8;
 }
 
-static int pva_probe(AVProbeData * pd) {
+static int pva_probe(const AVProbeData * pd) {
     const unsigned char *buf = pd->buf;
     int len = pva_check(buf);
 
diff --git a/libavformat/pvfdec.c b/libavformat/pvfdec.c
index c6652b9..4c91994 100644
--- a/libavformat/pvfdec.c
+++ b/libavformat/pvfdec.c
@@ -24,7 +24,7 @@
 #include "internal.h"
 #include "pcm.h"
 
-static int pvf_probe(AVProbeData *p)
+static int pvf_probe(const AVProbeData *p)
 {
     if (!memcmp(p->buf, "PVF1\n", 5))
         return AVPROBE_SCORE_MAX;
diff --git a/libavformat/qcp.c b/libavformat/qcp.c
index b842e26..168030d 100644
--- a/libavformat/qcp.c
+++ b/libavformat/qcp.c
@@ -79,7 +79,7 @@
         && !memcmp(guid+1, guid_qcelp_13k_part, sizeof(guid_qcelp_13k_part));
 }
 
-static int qcp_probe(AVProbeData *pd)
+static int qcp_probe(const AVProbeData *pd)
 {
     if (AV_RL32(pd->buf  ) == AV_RL32("RIFF") &&
         AV_RL64(pd->buf+8) == AV_RL64("QLCMfmt "))
diff --git a/libavformat/r3d.c b/libavformat/r3d.c
index 1f53d84..7aa0c5a 100644
--- a/libavformat/r3d.c
+++ b/libavformat/r3d.c
@@ -27,7 +27,6 @@
 
 typedef struct R3DContext {
     unsigned video_offsets_count;
-    unsigned *video_offsets;
     unsigned rdvo_offset;
 
     int audio_channels;
@@ -118,17 +117,14 @@
     int i;
 
     r3d->video_offsets_count = (atom->size - 8) / 4;
-    r3d->video_offsets = av_malloc(atom->size);
-    if (!r3d->video_offsets)
-        return AVERROR(ENOMEM);
 
     for (i = 0; i < r3d->video_offsets_count; i++) {
-        r3d->video_offsets[i] = avio_rb32(s->pb);
-        if (!r3d->video_offsets[i]) {
+        unsigned video_offset = avio_rb32(s->pb);
+        if (!video_offset) {
             r3d->video_offsets_count = i;
             break;
         }
-        av_log(s, AV_LOG_TRACE, "video offset %d: %#x\n", i, r3d->video_offsets[i]);
+        av_log(s, AV_LOG_TRACE, "video offset %d: %#x\n", i, video_offset);
     }
 
     if (st->avg_frame_rate.num)
@@ -368,7 +364,7 @@
     return err;
 }
 
-static int r3d_probe(AVProbeData *p)
+static int r3d_probe(const AVProbeData *p)
 {
     if (AV_RL32(p->buf + 4) == MKTAG('R','E','D','1'))
         return AVPROBE_SCORE_MAX;
@@ -400,15 +396,6 @@
     return 0;
 }
 
-static int r3d_close(AVFormatContext *s)
-{
-    R3DContext *r3d = s->priv_data;
-
-    av_freep(&r3d->video_offsets);
-
-    return 0;
-}
-
 AVInputFormat ff_r3d_demuxer = {
     .name           = "r3d",
     .long_name      = NULL_IF_CONFIG_SMALL("REDCODE R3D"),
@@ -416,6 +403,5 @@
     .read_probe     = r3d_probe,
     .read_header    = r3d_read_header,
     .read_packet    = r3d_read_packet,
-    .read_close     = r3d_close,
     .read_seek      = r3d_seek,
 };
diff --git a/libavformat/rawdec.c b/libavformat/rawdec.c
index b38a4b5..fee016c 100644
--- a/libavformat/rawdec.c
+++ b/libavformat/rawdec.c
@@ -34,12 +34,13 @@
 
 int ff_raw_read_partial_packet(AVFormatContext *s, AVPacket *pkt)
 {
+    FFRawDemuxerContext *raw = s->priv_data;
     int ret, size;
 
-    size = RAW_PACKET_SIZE;
+    size = raw->raw_packet_size;
 
-    if (av_new_packet(pkt, size) < 0)
-        return AVERROR(ENOMEM);
+    if ((ret = av_new_packet(pkt, size)) < 0)
+        return ret;
 
     pkt->pos= avio_tell(s->pb);
     pkt->stream_index = 0;
@@ -91,6 +92,17 @@
     return ret;
 }
 
+int ff_raw_subtitle_read_header(AVFormatContext *s)
+{
+    AVStream *st = avformat_new_stream(s, NULL);
+    if (!st)
+        return AVERROR(ENOMEM);
+    st->codecpar->codec_type = AVMEDIA_TYPE_SUBTITLE;
+    st->codecpar->codec_id = s->iformat->raw_codec_id;
+    st->start_time = 0;
+    return 0;
+}
+
 int ff_raw_data_read_header(AVFormatContext *s)
 {
     AVStream *st = avformat_new_stream(s, NULL);
@@ -108,10 +120,17 @@
 #define DEC AV_OPT_FLAG_DECODING_PARAM
 const AVOption ff_rawvideo_options[] = {
     { "framerate", "", OFFSET(framerate), AV_OPT_TYPE_VIDEO_RATE, {.str = "25"}, 0, INT_MAX, DEC},
+    { "raw_packet_size", "", OFFSET(raw_packet_size), AV_OPT_TYPE_INT, {.i64 = RAW_PACKET_SIZE }, 1, INT_MAX, DEC},
+    { NULL },
+};
+const AVOption ff_raw_options[] = {
+    { "raw_packet_size", "", OFFSET(raw_packet_size), AV_OPT_TYPE_INT, {.i64 = RAW_PACKET_SIZE }, 1, INT_MAX, DEC},
     { NULL },
 };
 
 #if CONFIG_DATA_DEMUXER
+FF_RAW_DEMUXER_CLASS(raw_data)
+
 AVInputFormat ff_data_demuxer = {
     .name           = "data",
     .long_name      = NULL_IF_CONFIG_SMALL("raw data"),
@@ -119,11 +138,13 @@
     .read_packet    = ff_raw_read_partial_packet,
     .raw_codec_id   = AV_CODEC_ID_NONE,
     .flags          = AVFMT_NOTIMESTAMPS,
+    .priv_data_size = sizeof(FFRawDemuxerContext),\
+    .priv_class     = &raw_data_demuxer_class,\
 };
 #endif
 
 #if CONFIG_MJPEG_DEMUXER
-static int mjpeg_probe(AVProbeData *p)
+static int mjpeg_probe(const AVProbeData *p)
 {
     int i;
     int state = -1;
diff --git a/libavformat/rawdec.h b/libavformat/rawdec.h
index a464bbb..85e0790 100644
--- a/libavformat/rawdec.h
+++ b/libavformat/rawdec.h
@@ -28,12 +28,19 @@
 
 typedef struct FFRawVideoDemuxerContext {
     const AVClass *class;     /**< Class for private options. */
+    int raw_packet_size;
     char *video_size;         /**< String describing video size, set by a private option. */
     char *pixel_format;       /**< Set by a private option. */
     AVRational framerate;     /**< AVRational describing framerate, set by a private option. */
 } FFRawVideoDemuxerContext;
 
+typedef struct FFRawDemuxerContext {
+    const AVClass *class;     /**< Class for private options. */
+    int raw_packet_size;
+} FFRawDemuxerContext;
+
 extern const AVOption ff_rawvideo_options[];
+extern const AVOption ff_raw_options[];
 
 int ff_raw_read_partial_packet(AVFormatContext *s, AVPacket *pkt);
 
@@ -41,8 +48,18 @@
 
 int ff_raw_video_read_header(AVFormatContext *s);
 
+int ff_raw_subtitle_read_header(AVFormatContext *s);
+
 int ff_raw_data_read_header(AVFormatContext *s);
 
+#define FF_RAW_DEMUXER_CLASS(name)\
+static const AVClass name ## _demuxer_class = {\
+    .class_name = #name " demuxer",\
+    .item_name  = av_default_item_name,\
+    .option     = ff_raw_options,\
+    .version    = LIBAVUTIL_VERSION_INT,\
+};
+
 #define FF_RAWVIDEO_DEMUXER_CLASS(name)\
 static const AVClass name ## _demuxer_class = {\
     .class_name = #name " demuxer",\
@@ -73,7 +90,7 @@
 static const AVClass name ## _demuxer_class = {\
     .class_name = #name " demuxer",\
     .item_name  = av_default_item_name,\
-    .option     = NULL,\
+    .option     = ff_raw_options,\
     .version    = LIBAVUTIL_VERSION_INT,\
 };
 
@@ -83,12 +100,12 @@
     .name           = #shortname,\
     .long_name      = NULL_IF_CONFIG_SMALL(longname),\
     .read_probe     = probe,\
-    .read_header    = ff_raw_data_read_header,\
+    .read_header    = ff_raw_subtitle_read_header,\
     .read_packet    = ff_raw_read_partial_packet,\
     .extensions     = ext,\
     .flags          = flag,\
     .raw_codec_id   = id,\
-    .priv_data_size = 0,\
+    .priv_data_size = sizeof(FFRawDemuxerContext),\
     .priv_class     = &shortname ## _demuxer_class,\
 };
 
diff --git a/libavformat/rawenc.c b/libavformat/rawenc.c
index 993d232..32704f9 100644
--- a/libavformat/rawenc.c
+++ b/libavformat/rawenc.c
@@ -39,6 +39,18 @@
                s->oformat->name);
         return AVERROR(EINVAL);
     }
+    if (   s->oformat->audio_codec != AV_CODEC_ID_NONE
+        && s->streams[0]->codecpar->codec_type != AVMEDIA_TYPE_AUDIO) {
+        av_log(s, AV_LOG_ERROR, "%s files have exactly one audio stream\n",
+               s->oformat->name);
+        return AVERROR(EINVAL);
+    }
+    if (   s->oformat->video_codec != AV_CODEC_ID_NONE
+        && s->streams[0]->codecpar->codec_type != AVMEDIA_TYPE_VIDEO) {
+        av_log(s, AV_LOG_ERROR, "%s files have exactly one video stream\n",
+               s->oformat->name);
+        return AVERROR(EINVAL);
+    }
     return 0;
 }
 
diff --git a/libavformat/realtextdec.c b/libavformat/realtextdec.c
index 618d4f7..c2316da 100644
--- a/libavformat/realtextdec.c
+++ b/libavformat/realtextdec.c
@@ -35,7 +35,7 @@
     FFDemuxSubtitlesQueue q;
 } RealTextContext;
 
-static int realtext_probe(AVProbeData *p)
+static int realtext_probe(const AVProbeData *p)
 {
     char buf[7];
     FFTextReader tr;
@@ -87,6 +87,10 @@
             /* save header to extradata */
             const char *p = ff_smil_get_attr_ptr(buf.str, "duration");
 
+            if (st->codecpar->extradata) {
+                res = AVERROR_INVALIDDATA;
+                goto end;
+            }
             if (p)
                 duration = read_ts(p);
             st->codecpar->extradata = av_strdup(buf.str);
@@ -119,6 +123,8 @@
 
 end:
     av_bprint_finalize(&buf, NULL);
+    if (res < 0)
+        ff_subtitles_queue_clean(&rt->q);
     return res;
 }
 
diff --git a/libavformat/redspark.c b/libavformat/redspark.c
index c247046..0ce8915 100644
--- a/libavformat/redspark.c
+++ b/libavformat/redspark.c
@@ -32,7 +32,7 @@
     int         samples_count;
 } RedSparkContext;
 
-static int redspark_probe(AVProbeData *p)
+static int redspark_probe(const AVProbeData *p)
 {
     uint32_t key, data;
     uint8_t header[8];
@@ -140,7 +140,6 @@
 
     ret = av_get_packet(s->pb, pkt, size);
     if (ret != size) {
-        av_packet_unref(pkt);
         return AVERROR(EIO);
     }
 
diff --git a/libavformat/riff.c b/libavformat/riff.c
index 3907e1a..bf6a8f4 100644
--- a/libavformat/riff.c
+++ b/libavformat/riff.c
@@ -307,6 +307,7 @@
     { AV_CODEC_ID_INDEO5,       MKTAG('I', 'V', '5', '0') },
     { AV_CODEC_ID_VP3,          MKTAG('V', 'P', '3', '1') },
     { AV_CODEC_ID_VP3,          MKTAG('V', 'P', '3', '0') },
+    { AV_CODEC_ID_VP4,          MKTAG('V', 'P', '4', '0') },
     { AV_CODEC_ID_VP5,          MKTAG('V', 'P', '5', '0') },
     { AV_CODEC_ID_VP6,          MKTAG('V', 'P', '6', '0') },
     { AV_CODEC_ID_VP6,          MKTAG('V', 'P', '6', '1') },
@@ -402,6 +403,7 @@
     { AV_CODEC_ID_UTVIDEO,      MKTAG('U', 'L', 'H', '0') },
     { AV_CODEC_ID_UTVIDEO,      MKTAG('U', 'L', 'H', '2') },
     { AV_CODEC_ID_UTVIDEO,      MKTAG('U', 'L', 'H', '4') },
+    { AV_CODEC_ID_UTVIDEO,      MKTAG('U', 'Q', 'Y', '0') },
     { AV_CODEC_ID_UTVIDEO,      MKTAG('U', 'Q', 'Y', '2') },
     { AV_CODEC_ID_UTVIDEO,      MKTAG('U', 'Q', 'R', 'A') },
     { AV_CODEC_ID_UTVIDEO,      MKTAG('U', 'Q', 'R', 'G') },
@@ -453,6 +455,7 @@
     { AV_CODEC_ID_MAGICYUV,     MKTAG('M', '0', 'R', 'G') },
     { AV_CODEC_ID_MAGICYUV,     MKTAG('M', '0', 'G', '0') },
     { AV_CODEC_ID_MAGICYUV,     MKTAG('M', '0', 'Y', '2') },
+    { AV_CODEC_ID_MAGICYUV,     MKTAG('M', '0', 'Y', '4') },
     { AV_CODEC_ID_MAGICYUV,     MKTAG('M', '2', 'R', 'A') },
     { AV_CODEC_ID_MAGICYUV,     MKTAG('M', '2', 'R', 'G') },
     { AV_CODEC_ID_YLC,          MKTAG('Y', 'L', 'C', '0') },
@@ -475,6 +478,27 @@
     { AV_CODEC_ID_MWSC,         MKTAG('M', 'W', 'S', 'C') },
     { AV_CODEC_ID_WCMV,         MKTAG('W', 'C', 'M', 'V') },
     { AV_CODEC_ID_RASC,         MKTAG('R', 'A', 'S', 'C') },
+    { AV_CODEC_ID_HYMT,         MKTAG('H', 'Y', 'M', 'T') },
+    { AV_CODEC_ID_ARBC,         MKTAG('A', 'R', 'B', 'C') },
+    { AV_CODEC_ID_AGM,          MKTAG('A', 'G', 'M', '0') },
+    { AV_CODEC_ID_AGM,          MKTAG('A', 'G', 'M', '1') },
+    { AV_CODEC_ID_AGM,          MKTAG('A', 'G', 'M', '2') },
+    { AV_CODEC_ID_AGM,          MKTAG('A', 'G', 'M', '3') },
+    { AV_CODEC_ID_AGM,          MKTAG('A', 'G', 'M', '4') },
+    { AV_CODEC_ID_AGM,          MKTAG('A', 'G', 'M', '5') },
+    { AV_CODEC_ID_AGM,          MKTAG('A', 'G', 'M', '6') },
+    { AV_CODEC_ID_AGM,          MKTAG('A', 'G', 'M', '7') },
+    { AV_CODEC_ID_LSCR,         MKTAG('L', 'S', 'C', 'R') },
+    { AV_CODEC_ID_IMM5,         MKTAG('I', 'M', 'M', '5') },
+    { AV_CODEC_ID_MVDV,         MKTAG('M', 'V', 'D', 'V') },
+    { AV_CODEC_ID_MVHA,         MKTAG('M', 'V', 'H', 'A') },
+    { AV_CODEC_ID_MV30,         MKTAG('M', 'V', '3', '0') },
+    { AV_CODEC_ID_NONE,         0 }
+};
+
+const AVCodecTag ff_codec_bmp_tags_unofficial[] = {
+    { AV_CODEC_ID_HEVC,         MKTAG('H', 'E', 'V', 'C') },
+    { AV_CODEC_ID_HEVC,         MKTAG('H', '2', '6', '5') },
     { AV_CODEC_ID_NONE,         0 }
 };
 
@@ -495,7 +519,7 @@
     { AV_CODEC_ID_ADPCM_IMA_OKI,   0x0010 },
     { AV_CODEC_ID_ADPCM_IMA_WAV,   0x0011 },
     /* must come after adpcm_ima_wav in this list */
-    { AV_CODEC_ID_PCM_ZORK,        0x0011 },
+    { AV_CODEC_ID_ADPCM_ZORK,      0x0011 },
     { AV_CODEC_ID_ADPCM_IMA_OKI,   0x0017 },
     { AV_CODEC_ID_ADPCM_YAMAHA,    0x0020 },
     { AV_CODEC_ID_TRUESPEECH,      0x0022 },
@@ -521,6 +545,7 @@
     { AV_CODEC_ID_AAC,             0x00ff },
     { AV_CODEC_ID_G723_1,          0x0111 },
     { AV_CODEC_ID_SIPR,            0x0130 },
+    { AV_CODEC_ID_ACELP_KELVIN,    0x0135 },
     { AV_CODEC_ID_WMAV1,           0x0160 },
     { AV_CODEC_ID_WMAV2,           0x0161 },
     { AV_CODEC_ID_WMAPRO,          0x0162 },
@@ -595,5 +620,6 @@
     { AV_CODEC_ID_ATRAC9,   { 0xD2, 0x42, 0xE1, 0x47, 0xBA, 0x36, 0x8D, 0x4D, 0x88, 0xFC, 0x61, 0x65, 0x4F, 0x8C, 0x83, 0x6C } },
     { AV_CODEC_ID_EAC3,     { 0xAF, 0x87, 0xFB, 0xA7, 0x02, 0x2D, 0xFB, 0x42, 0xA4, 0xD4, 0x05, 0xCD, 0x93, 0x84, 0x3B, 0xDD } },
     { AV_CODEC_ID_MP2,      { 0x2B, 0x80, 0x6D, 0xE0, 0x46, 0xDB, 0xCF, 0x11, 0xB4, 0xD1, 0x00, 0x80, 0x5F, 0x6C, 0xBB, 0xEA } },
+    { AV_CODEC_ID_ADPCM_AGM,{ 0x82, 0xEC, 0x1F, 0x6A, 0xCA, 0xDB, 0x19, 0x45, 0xBD, 0xE7, 0x56, 0xD3, 0xB3, 0xEF, 0x98, 0x1D } },
     { AV_CODEC_ID_NONE }
 };
diff --git a/libavformat/riff.h b/libavformat/riff.h
index 323aa38..21078b7 100644
--- a/libavformat/riff.h
+++ b/libavformat/riff.h
@@ -73,6 +73,8 @@
 extern const AVCodecTag ff_codec_bmp_tags[]; // exposed through avformat_get_riff_video_tags()
 extern const AVCodecTag ff_codec_wav_tags[];
 
+extern const AVCodecTag ff_codec_bmp_tags_unofficial[];
+
 void ff_parse_specific_params(AVStream *st, int *au_rate, int *au_ssize, int *au_scale);
 
 int ff_read_riff_info(AVFormatContext *s, int64_t size);
diff --git a/libavformat/riffdec.c b/libavformat/riffdec.c
index b448f91..533bb5a 100644
--- a/libavformat/riffdec.c
+++ b/libavformat/riffdec.c
@@ -58,7 +58,7 @@
  * an openended structure.
  */
 
-static void parse_waveformatex(AVIOContext *pb, AVCodecParameters *par)
+static void parse_waveformatex(AVFormatContext *s, AVIOContext *pb, AVCodecParameters *par)
 {
     ff_asf_guid subformat;
     int bps;
@@ -81,7 +81,7 @@
     } else {
         par->codec_id = ff_codec_guid_get_id(ff_codec_wav_guids, subformat);
         if (!par->codec_id)
-            av_log(pb, AV_LOG_WARNING,
+            av_log(s, AV_LOG_WARNING,
                    "unknown subformat:"FF_PRI_GUID"\n",
                    FF_ARG_GUID(subformat));
     }
@@ -140,12 +140,11 @@
         size  -= 18;
         cbSize = FFMIN(size, cbSize);
         if (cbSize >= 22 && id == 0xfffe) { /* WAVEFORMATEXTENSIBLE */
-            parse_waveformatex(pb, par);
+            parse_waveformatex(s, pb, par);
             cbSize -= 22;
             size   -= 22;
         }
         if (cbSize > 0) {
-            av_freep(&par->extradata);
             if (ff_get_extradata(s, par, pb, cbSize) < 0)
                 return AVERROR(ENOMEM);
             size -= cbSize;
@@ -158,7 +157,6 @@
         int nb_streams, i;
 
         size -= 4;
-        av_freep(&par->extradata);
         if (ff_get_extradata(s, par, pb, size) < 0)
             return AVERROR(ENOMEM);
         nb_streams         = AV_RL16(par->extradata + 4);
@@ -204,7 +202,7 @@
         id = ff_get_pcm_codec_id(bps, 1, 0,  0);
 
     if (id == AV_CODEC_ID_ADPCM_IMA_WAV && bps == 8)
-        id = AV_CODEC_ID_PCM_ZORK;
+        id = AV_CODEC_ID_ADPCM_ZORK;
     return id;
 }
 
diff --git a/libavformat/rl2.c b/libavformat/rl2.c
index eb1682d..cfde23a 100644
--- a/libavformat/rl2.c
+++ b/libavformat/rl2.c
@@ -55,7 +55,7 @@
  * @param p probe buffer
  * @return 0 when the probe buffer does not contain rl2 data, > 0 otherwise
  */
-static int rl2_probe(AVProbeData *p)
+static int rl2_probe(const AVProbeData *p)
 {
 
     if(AV_RB32(&p->buf[0]) != FORM_TAG)
@@ -127,8 +127,9 @@
     if(signature == RLV3_TAG && back_size > 0)
         st->codecpar->extradata_size += back_size;
 
-    if(ff_get_extradata(s, st->codecpar, pb, st->codecpar->extradata_size) < 0)
-        return AVERROR(ENOMEM);
+    ret = ff_get_extradata(s, st->codecpar, pb, st->codecpar->extradata_size);
+    if (ret < 0)
+        return ret;
 
     /** setup audio stream if present */
     if(sound_rate){
@@ -171,18 +172,24 @@
 
     /** read offset and size tables */
     for(i=0; i < frame_count;i++) {
-        if (avio_feof(pb))
-            return AVERROR_INVALIDDATA;
+        if (avio_feof(pb)) {
+            ret = AVERROR_INVALIDDATA;
+            goto end;
+        }
         chunk_size[i] = avio_rl32(pb);
     }
     for(i=0; i < frame_count;i++) {
-        if (avio_feof(pb))
-            return AVERROR_INVALIDDATA;
+        if (avio_feof(pb)) {
+            ret = AVERROR_INVALIDDATA;
+            goto end;
+        }
         chunk_offset[i] = avio_rl32(pb);
     }
     for(i=0; i < frame_count;i++) {
-        if (avio_feof(pb))
-            return AVERROR_INVALIDDATA;
+        if (avio_feof(pb)) {
+            ret = AVERROR_INVALIDDATA;
+            goto end;
+        }
         audio_size[i] = avio_rl32(pb) & 0xFFFF;
     }
 
@@ -203,7 +210,7 @@
         ++video_frame_counter;
     }
 
-
+end:
     av_free(chunk_size);
     av_free(audio_size);
     av_free(chunk_offset);
@@ -249,7 +256,6 @@
     /** fill the packet */
     ret = av_get_packet(pb, pkt, sample->size);
     if(ret != sample->size){
-        av_packet_unref(pkt);
         return AVERROR(EIO);
     }
 
diff --git a/libavformat/rmdec.c b/libavformat/rmdec.c
index f26c5b4..a36e693 100644
--- a/libavformat/rmdec.c
+++ b/libavformat/rmdec.c
@@ -87,9 +87,7 @@
         av_log(s, AV_LOG_ERROR, "extradata size %u too large\n", size);
         return -1;
     }
-    if (ff_get_extradata(s, par, pb, size) < 0)
-        return AVERROR(ENOMEM);
-    return 0;
+    return ff_get_extradata(s, par, pb, size);
 }
 
 static void rm_read_metadata(AVFormatContext *s, AVIOContext *pb, int wide)
@@ -724,8 +722,8 @@
 
             num = avio_rb16(pb);
             *timestamp = avio_rb32(pb);
-            mlti_id = (avio_r8(pb)>>1)-1<<16;
-            mlti_id = FFMAX(mlti_id, 0);
+            mlti_id = (avio_r8(pb) >> 1) - 1;
+            mlti_id = FFMAX(mlti_id, 0) << 16;
             *flags = avio_r8(pb); /* flags */
         }
         for(i=0;i<s->nb_streams;i++) {
@@ -783,8 +781,8 @@
             return -1;
         }
         rm->remaining_len -= len;
-        if(av_new_packet(pkt, len + 9) < 0)
-            return AVERROR(EIO);
+        if ((ret = av_new_packet(pkt, len + 9)) < 0)
+            return ret;
         pkt->data[0] = 0;
         AV_WL32(pkt->data + 1, 1);
         AV_WL32(pkt->data + 5, 0);
@@ -806,8 +804,8 @@
         vst->slices = ((hdr & 0x3F) << 1) + 1;
         vst->videobufsize = len2 + 8*vst->slices + 1;
         av_packet_unref(&vst->pkt); //FIXME this should be output.
-        if(av_new_packet(&vst->pkt, vst->videobufsize) < 0)
-            return AVERROR(ENOMEM);
+        if ((ret = av_new_packet(&vst->pkt, vst->videobufsize)) < 0)
+            return ret;
         memset(vst->pkt.data, 0, vst->pkt.size);
         vst->videobufpos = 8*vst->slices + 1;
         vst->cur_slice = 0;
@@ -836,10 +834,7 @@
 
     if (type == 2 || vst->videobufpos == vst->videobufsize) {
         vst->pkt.data[0] = vst->cur_slice-1;
-        *pkt= vst->pkt;
-        vst->pkt.data= NULL;
-        vst->pkt.size= 0;
-        vst->pkt.buf = NULL;
+        av_packet_move_ref(pkt, &vst->pkt);
         if(vst->slices != vst->cur_slice) //FIXME find out how to set slices correct from the begin
             memmove(pkt->data + 1 + 8*vst->cur_slice, pkt->data + 1 + 8*vst->slices,
                 vst->videobufpos - 1 - 8*vst->slices);
@@ -1067,7 +1062,7 @@
     return 0;
 }
 
-static int rm_probe(AVProbeData *p)
+static int rm_probe(const AVProbeData *p)
 {
     /* check file header */
     if ((p->buf[0] == '.' && p->buf[1] == 'R' &&
@@ -1158,7 +1153,7 @@
     .flags          = AVFMT_NOFILE,
 };
 
-static int ivr_probe(AVProbeData *p)
+static int ivr_probe(const AVProbeData *p)
 {
     if (memcmp(p->buf, ".R1M\x0\x1\x1", 7) &&
         memcmp(p->buf, ".REC", 4))
@@ -1174,7 +1169,7 @@
     uint8_t key[256], val[256];
     AVIOContext *pb = s->pb;
     AVStream *st;
-    int64_t pos, offset, temp;
+    int64_t pos, offset=0, temp;
 
     pos = avio_tell(pb);
     tag = avio_rl32(pb);
@@ -1191,6 +1186,8 @@
             offset = temp;
             temp = avio_rb64(pb);
         }
+        if (offset <= 0)
+            return AVERROR_INVALIDDATA;
         avio_skip(pb, offset - avio_tell(pb));
         if (avio_r8(pb) != 1)
             return AVERROR_INVALIDDATA;
diff --git a/libavformat/rmenc.c b/libavformat/rmenc.c
index 3bff4da..e137dbc 100644
--- a/libavformat/rmenc.c
+++ b/libavformat/rmenc.c
@@ -360,7 +360,6 @@
 
     if (rv10_write_header(s, 0, 0))
         return AVERROR_INVALIDDATA;
-    avio_flush(s->pb);
     return 0;
 }
 
diff --git a/libavformat/rpl.c b/libavformat/rpl.c
index d373600..208c50f 100644
--- a/libavformat/rpl.c
+++ b/libavformat/rpl.c
@@ -33,7 +33,7 @@
 /** 256 is arbitrary, but should be big enough for any reasonable file. */
 #define RPL_LINE_LENGTH 256
 
-static int rpl_probe(AVProbeData *p)
+static int rpl_probe(const AVProbeData *p)
 {
     if (memcmp(p->buf, RPL_SIGNATURE, RPL_SIGNATURE_SIZE))
         return 0;
@@ -119,10 +119,12 @@
     AVStream *vst = NULL, *ast = NULL;
     int total_audio_size;
     int error = 0;
+    const char *endptr;
+    char audio_type[RPL_LINE_LENGTH];
 
     uint32_t i;
 
-    int32_t audio_format, chunk_catalog_offset, number_of_chunks;
+    int32_t video_format, audio_format, chunk_catalog_offset, number_of_chunks;
     AVRational fps;
 
     char line[RPL_LINE_LENGTH];
@@ -142,38 +144,46 @@
     av_dict_set(&s->metadata, "author"   , line, 0);
 
     // video headers
-    vst = avformat_new_stream(s, NULL);
-    if (!vst)
-        return AVERROR(ENOMEM);
-    vst->codecpar->codec_type      = AVMEDIA_TYPE_VIDEO;
-    vst->codecpar->codec_tag       = read_line_and_int(pb, &error);  // video format
-    vst->codecpar->width           = read_line_and_int(pb, &error);  // video width
-    vst->codecpar->height          = read_line_and_int(pb, &error);  // video height
-    vst->codecpar->bits_per_coded_sample = read_line_and_int(pb, &error);  // video bits per sample
+    video_format = read_line_and_int(pb, &error);
+    if (video_format) {
+        vst = avformat_new_stream(s, NULL);
+        if (!vst)
+            return AVERROR(ENOMEM);
+        vst->codecpar->codec_type      = AVMEDIA_TYPE_VIDEO;
+        vst->codecpar->codec_tag       = video_format;
+        vst->codecpar->width           = read_line_and_int(pb, &error);  // video width
+        vst->codecpar->height          = read_line_and_int(pb, &error);  // video height
+        vst->codecpar->bits_per_coded_sample = read_line_and_int(pb, &error);  // video bits per sample
+
+        // Figure out the video codec
+        switch (vst->codecpar->codec_tag) {
+#if 0
+            case 122:
+                vst->codecpar->codec_id = AV_CODEC_ID_ESCAPE122;
+                break;
+#endif
+            case 124:
+                vst->codecpar->codec_id = AV_CODEC_ID_ESCAPE124;
+                // The header is wrong here, at least sometimes
+                vst->codecpar->bits_per_coded_sample = 16;
+                break;
+            case 130:
+                vst->codecpar->codec_id = AV_CODEC_ID_ESCAPE130;
+                break;
+            default:
+                avpriv_report_missing_feature(s, "Video format %s",
+                                              av_fourcc2str(vst->codecpar->codec_tag));
+                vst->codecpar->codec_id = AV_CODEC_ID_NONE;
+        }
+    } else {
+        for (i = 0; i < 3; i++)
+            error |= read_line(pb, line, sizeof(line));
+    }
+
     error |= read_line(pb, line, sizeof(line));                   // video frames per second
     fps = read_fps(line, &error);
-    avpriv_set_pts_info(vst, 32, fps.den, fps.num);
-
-    // Figure out the video codec
-    switch (vst->codecpar->codec_tag) {
-#if 0
-        case 122:
-            vst->codecpar->codec_id = AV_CODEC_ID_ESCAPE122;
-            break;
-#endif
-        case 124:
-            vst->codecpar->codec_id = AV_CODEC_ID_ESCAPE124;
-            // The header is wrong here, at least sometimes
-            vst->codecpar->bits_per_coded_sample = 16;
-            break;
-        case 130:
-            vst->codecpar->codec_id = AV_CODEC_ID_ESCAPE130;
-            break;
-        default:
-            avpriv_report_missing_feature(s, "Video format %s",
-                                          av_fourcc2str(vst->codecpar->codec_tag));
-            vst->codecpar->codec_id = AV_CODEC_ID_NONE;
-    }
+    if (vst)
+        avpriv_set_pts_info(vst, 32, fps.den, fps.num);
 
     // Audio headers
 
@@ -188,7 +198,9 @@
         ast->codecpar->codec_tag       = audio_format;
         ast->codecpar->sample_rate     = read_line_and_int(pb, &error);  // audio bitrate
         ast->codecpar->channels        = read_line_and_int(pb, &error);  // number of audio channels
-        ast->codecpar->bits_per_coded_sample = read_line_and_int(pb, &error);  // audio bits per sample
+        error |= read_line(pb, line, sizeof(line));
+        ast->codecpar->bits_per_coded_sample = read_int(line, &endptr, &error);  // audio bits per sample
+        av_strlcpy(audio_type, endptr, RPL_LINE_LENGTH);
         // At least one sample uses 0 for ADPCM, which is really 4 bits
         // per sample.
         if (ast->codecpar->bits_per_coded_sample == 0)
@@ -205,6 +217,17 @@
                     // 16-bit audio is always signed
                     ast->codecpar->codec_id = AV_CODEC_ID_PCM_S16LE;
                     break;
+                } else if (ast->codecpar->bits_per_coded_sample == 8) {
+                    if(av_stristr(audio_type, "unsigned") != NULL) {
+                        ast->codecpar->codec_id = AV_CODEC_ID_PCM_U8;
+                        break;
+                    } else if(av_stristr(audio_type, "linear") != NULL) {
+                        ast->codecpar->codec_id = AV_CODEC_ID_PCM_S8;
+                        break;
+                    } else {
+                        ast->codecpar->codec_id = AV_CODEC_ID_PCM_VIDC;
+                        break;
+                    }
                 }
                 // There are some other formats listed as legal per the spec;
                 // samples needed.
@@ -231,7 +254,7 @@
     }
 
     rpl->frames_per_chunk = read_line_and_int(pb, &error);  // video frames per chunk
-    if (rpl->frames_per_chunk > 1 && vst->codecpar->codec_tag != 124)
+    if (vst && rpl->frames_per_chunk > 1 && vst->codecpar->codec_tag != 124)
         av_log(s, AV_LOG_WARNING,
                "Don't know how to split frames for video format %s. "
                "Video stream will be broken!\n", av_fourcc2str(vst->codecpar->codec_tag));
@@ -246,7 +269,10 @@
         read_line_and_int(pb, &error);           //   (file index)
     error |= read_line(pb, line, sizeof(line));  // offset to "helpful" sprite
     error |= read_line(pb, line, sizeof(line));  // size of "helpful" sprite
-    error |= read_line(pb, line, sizeof(line));  // offset to key frame list
+    if (vst) {
+        error |= read_line(pb, line, sizeof(line));  // offset to key frame list
+        vst->duration = number_of_chunks * rpl->frames_per_chunk;
+    }
 
     // Read the index
     avio_seek(pb, chunk_catalog_offset, SEEK_SET);
@@ -259,8 +285,9 @@
             error = -1;
             continue;
         }
-        av_add_index_entry(vst, offset, i * rpl->frames_per_chunk,
-                           video_size, rpl->frames_per_chunk, 0);
+        if (vst)
+            av_add_index_entry(vst, offset, i * rpl->frames_per_chunk,
+                               video_size, rpl->frames_per_chunk, 0);
         if (ast)
             av_add_index_entry(ast, offset + video_size, total_audio_size,
                                audio_size, audio_size * 8, 0);
@@ -311,7 +338,6 @@
         if (ret < 0)
             return ret;
         if (ret != frame_size) {
-            av_packet_unref(pkt);
             return AVERROR(EIO);
         }
         pkt->duration = 1;
@@ -328,7 +354,6 @@
         if (ret < 0)
             return ret;
         if (ret != index_entry->size) {
-            av_packet_unref(pkt);
             return AVERROR(EIO);
         }
 
diff --git a/libavformat/rsd.c b/libavformat/rsd.c
index 1c99f8c..e23c8ab 100644
--- a/libavformat/rsd.c
+++ b/libavformat/rsd.c
@@ -41,7 +41,7 @@
     MKTAG('O','G','G',' '),
 };
 
-static int rsd_probe(AVProbeData *p)
+static int rsd_probe(const AVProbeData *p)
 {
     if (memcmp(p->buf, "RSD", 3) || p->buf[3] - '0' < 2 || p->buf[3] - '0' > 6)
         return 0;
@@ -97,9 +97,8 @@
     switch (par->codec_id) {
     case AV_CODEC_ID_XMA2:
         par->block_align = 2048;
-        ff_alloc_extradata(par, 34);
-        if (!par->extradata)
-            return AVERROR(ENOMEM);
+        if ((ret = ff_alloc_extradata(par, 34)) < 0)
+            return ret;
         memset(par->extradata, 0, 34);
         break;
     case AV_CODEC_ID_ADPCM_PSX:
diff --git a/libavformat/rsoenc.c b/libavformat/rsoenc.c
index e34e2c6..beba94b 100644
--- a/libavformat/rsoenc.c
+++ b/libavformat/rsoenc.c
@@ -22,6 +22,7 @@
 
 #include "avformat.h"
 #include "internal.h"
+#include "rawenc.h"
 #include "riff.h"
 #include "rso.h"
 
@@ -60,14 +61,6 @@
     avio_wb16(pb, par->sample_rate);
     avio_wb16(pb, 0x0000);           /* play mode ? (0x0000 = don't loop) */
 
-    avio_flush(pb);
-
-    return 0;
-}
-
-static int rso_write_packet(AVFormatContext *s, AVPacket *pkt)
-{
-    avio_write(s->pb, pkt->data, pkt->size);
     return 0;
 }
 
@@ -105,7 +98,7 @@
     .audio_codec    =   AV_CODEC_ID_PCM_U8,
     .video_codec    =   AV_CODEC_ID_NONE,
     .write_header   =   rso_write_header,
-    .write_packet   =   rso_write_packet,
+    .write_packet   =   ff_raw_write_packet,
     .write_trailer  =   rso_write_trailer,
     .codec_tag      =   (const AVCodecTag* const []){ff_codec_rso_tags, 0},
     .flags          =   AVFMT_NOTIMESTAMPS,
diff --git a/libavformat/rtmpproto.c b/libavformat/rtmpproto.c
index b741e42..42aacbd 100644
--- a/libavformat/rtmpproto.c
+++ b/libavformat/rtmpproto.c
@@ -48,7 +48,6 @@
 #endif
 
 #define APP_MAX_LENGTH 1024
-#define PLAYPATH_MAX_LENGTH 512
 #define TCURL_MAX_LENGTH 1024
 #define FLASHVER_MAX_LENGTH 64
 #define RTMP_PKTDATA_DEFAULT_SIZE 4096
@@ -1112,7 +1111,7 @@
     RTMPContext *rt = s->priv_data;
     uint8_t *in_data = NULL, *out_data = NULL, *swfdata;
     int64_t in_size;
-    URLContext *stream;
+    URLContext *stream = NULL;
     char swfhash[32];
     int swfsize;
     int ret = 0;
@@ -2386,7 +2385,7 @@
         next += size + 3 + 4;
     }
     if (p != rt->flv_data + rt->flv_size) {
-        av_log(NULL, AV_LOG_WARNING, "Incomplete flv packets in "
+        av_log(rt, AV_LOG_WARNING, "Incomplete flv packets in "
                                      "RTMP_PT_METADATA packet\n");
         rt->flv_size = p - rt->flv_data;
     }
@@ -2746,7 +2745,10 @@
     }
 
     if (!rt->playpath) {
-        rt->playpath = av_malloc(PLAYPATH_MAX_LENGTH);
+        int max_len = 1;
+        if (fname)
+            max_len = strlen(fname) + 5; // add prefix "mp4:"
+        rt->playpath = av_malloc(max_len);
         if (!rt->playpath) {
             ret = AVERROR(ENOMEM);
             goto fail;
@@ -2763,7 +2765,7 @@
                     fname[len - 4] = '\0';
                 rt->playpath[0] = 0;
             }
-            av_strlcat(rt->playpath, fname, PLAYPATH_MAX_LENGTH);
+            av_strlcat(rt->playpath, fname, max_len);
         } else {
             rt->playpath[0] = '\0';
         }
@@ -2880,6 +2882,9 @@
     return 0;
 
 fail:
+    av_freep(&rt->playpath);
+    av_freep(&rt->tcurl);
+    av_freep(&rt->flashver);
     av_dict_free(opts);
     rtmp_close(s);
     return ret;
diff --git a/libavformat/rtp.c b/libavformat/rtp.c
index 4745e54..38e2343 100644
--- a/libavformat/rtp.c
+++ b/libavformat/rtp.c
@@ -91,7 +91,7 @@
                             AVCodecParameters *par, int idx)
 {
     int i;
-    AVOutputFormat *ofmt = fmt ? fmt->oformat : NULL;
+    const AVOutputFormat *ofmt = fmt ? fmt->oformat : NULL;
 
     /* Was the payload type already specified for the RTP muxer? */
     if (ofmt && ofmt->priv_class && fmt->priv_data) {
diff --git a/libavformat/rtpdec.c b/libavformat/rtpdec.c
index e75a34c..3d5b200 100644
--- a/libavformat/rtpdec.c
+++ b/libavformat/rtpdec.c
@@ -415,7 +415,6 @@
     avio_wb32(pb, 0); /* Timestamp */
     avio_wb32(pb, 0); /* SSRC */
 
-    avio_flush(pb);
     len = avio_close_dyn_buf(pb, &buf);
     if ((len > 0) && buf)
         ffurl_write(rtp_handle, buf, len);
@@ -430,7 +429,6 @@
     avio_wb16(pb, 1); /* length in words - 1 */
     avio_wb32(pb, 0); /* our own SSRC */
 
-    avio_flush(pb);
     len = avio_close_dyn_buf(pb, &buf);
     if ((len > 0) && buf)
         ffurl_write(rtp_handle, buf, len);
diff --git a/libavformat/rtpdec.h b/libavformat/rtpdec.h
index 5a47d6f..9144edb 100644
--- a/libavformat/rtpdec.h
+++ b/libavformat/rtpdec.h
@@ -154,7 +154,6 @@
     uint16_t seq;
     uint32_t timestamp;
     uint32_t base_timestamp;
-    uint32_t cur_timestamp;
     int64_t  unwrapped_timestamp;
     int64_t  range_start_offset;
     int max_payload_size;
diff --git a/libavformat/rtpdec_ac3.c b/libavformat/rtpdec_ac3.c
index 56a379f..dd4a4e1 100644
--- a/libavformat/rtpdec_ac3.c
+++ b/libavformat/rtpdec_ac3.c
@@ -62,9 +62,9 @@
             av_log(ctx, AV_LOG_ERROR, "Invalid AC3 packet data\n");
             return AVERROR_INVALIDDATA;
         }
-        if (av_new_packet(pkt, len)) {
+        if ((err = av_new_packet(pkt, len)) < 0) {
             av_log(ctx, AV_LOG_ERROR, "Out of memory.\n");
-            return AVERROR(ENOMEM);
+            return err;
         }
 
         pkt->stream_index = st->index;
diff --git a/libavformat/rtpdec_amr.c b/libavformat/rtpdec_amr.c
index 35d3222..988b7bd 100644
--- a/libavformat/rtpdec_amr.c
+++ b/libavformat/rtpdec_amr.c
@@ -51,7 +51,7 @@
 {
     const uint8_t *frame_sizes = NULL;
     int frames;
-    int i;
+    int i, ret;
     const uint8_t *speech_data;
     uint8_t *ptr;
 
@@ -93,9 +93,9 @@
     speech_data = buf + 1 + frames;
 
     /* Everything except the codec mode request byte should be output. */
-    if (av_new_packet(pkt, len - 1)) {
+    if ((ret = av_new_packet(pkt, len - 1)) < 0) {
         av_log(ctx, AV_LOG_ERROR, "Out of memory\n");
-        return AVERROR(ENOMEM);
+        return ret;
     }
     pkt->stream_index = st->index;
     ptr = pkt->data;
diff --git a/libavformat/rtpdec_asf.c b/libavformat/rtpdec_asf.c
index 54ffef6..e58f026 100644
--- a/libavformat/rtpdec_asf.c
+++ b/libavformat/rtpdec_asf.c
@@ -106,7 +106,7 @@
         AVDictionary *opts = NULL;
         int len = strlen(p) * 6 / 8;
         char *buf = av_mallocz(len);
-        AVInputFormat *iformat;
+        ff_const59 AVInputFormat *iformat;
 
         if (!buf)
             return AVERROR(ENOMEM);
diff --git a/libavformat/rtpdec_h263.c b/libavformat/rtpdec_h263.c
index 9b71ed7..1905b43 100644
--- a/libavformat/rtpdec_h263.c
+++ b/libavformat/rtpdec_h263.c
@@ -30,7 +30,7 @@
 {
     uint8_t *ptr;
     uint16_t header;
-    int startcode, vrc, picture_header;
+    int startcode, vrc, picture_header, ret;
 
     if (len < 2) {
         av_log(ctx, AV_LOG_ERROR, "Too short H.263 RTP packet\n");
@@ -73,9 +73,9 @@
         return AVERROR_INVALIDDATA;
     }
 
-    if (av_new_packet(pkt, len + startcode)) {
+    if ((ret = av_new_packet(pkt, len + startcode)) < 0) {
         av_log(ctx, AV_LOG_ERROR, "Out of memory\n");
-        return AVERROR(ENOMEM);
+        return ret;
     }
     pkt->stream_index = st->index;
     ptr = pkt->data;
diff --git a/libavformat/rtpdec_hevc.c b/libavformat/rtpdec_hevc.c
index 5a06b23..f467104 100644
--- a/libavformat/rtpdec_hevc.c
+++ b/libavformat/rtpdec_hevc.c
@@ -25,6 +25,7 @@
 #include "libavcodec/get_bits.h"
 
 #include "avformat.h"
+#include "internal.h"
 #include "rtpdec.h"
 #include "rtpdec_formats.h"
 
@@ -147,15 +148,9 @@
                                 hevc_sdp_parse_fmtp_config);
         if (hevc_data->vps_size || hevc_data->sps_size ||
             hevc_data->pps_size || hevc_data->sei_size) {
-            av_freep(&par->extradata);
             par->extradata_size = hevc_data->vps_size + hevc_data->sps_size +
                                   hevc_data->pps_size + hevc_data->sei_size;
-            par->extradata = av_malloc(par->extradata_size +
-                                       AV_INPUT_BUFFER_PADDING_SIZE);
-            if (!par->extradata) {
-                ret = AVERROR(ENOMEM);
-                par->extradata_size = 0;
-            } else {
+            if ((ret = ff_alloc_extradata(par, par->extradata_size)) >= 0) {
                 int pos = 0;
                 memcpy(par->extradata + pos, hevc_data->vps, hevc_data->vps_size);
                 pos += hevc_data->vps_size;
@@ -164,8 +159,6 @@
                 memcpy(par->extradata + pos, hevc_data->pps, hevc_data->pps_size);
                 pos += hevc_data->pps_size;
                 memcpy(par->extradata + pos, hevc_data->sei, hevc_data->sei_size);
-                pos += hevc_data->sei_size;
-                memset(par->extradata + pos, 0, AV_INPUT_BUFFER_PADDING_SIZE);
             }
 
             av_freep(&hevc_data->vps);
diff --git a/libavformat/rtpdec_latm.c b/libavformat/rtpdec_latm.c
index 9087d6b..104a00a 100644
--- a/libavformat/rtpdec_latm.c
+++ b/libavformat/rtpdec_latm.c
@@ -115,9 +115,8 @@
         ret = AVERROR_PATCHWELCOME;
         goto end;
     }
-    av_freep(&st->codecpar->extradata);
-    if (ff_alloc_extradata(st->codecpar, (get_bits_left(&gb) + 7)/8)) {
-        ret = AVERROR(ENOMEM);
+    ret = ff_alloc_extradata(st->codecpar, (get_bits_left(&gb) + 7)/8);
+    if (ret < 0) {
         goto end;
     }
     for (i = 0; i < st->codecpar->extradata_size; i++)
diff --git a/libavformat/rtpdec_mpa_robust.c b/libavformat/rtpdec_mpa_robust.c
index f4716edf..c0355ed 100644
--- a/libavformat/rtpdec_mpa_robust.c
+++ b/libavformat/rtpdec_mpa_robust.c
@@ -90,9 +90,9 @@
             return AVERROR_INVALIDDATA;
         }
 
-        if (av_new_packet(pkt, adu_size)) {
+        if ((err = av_new_packet(pkt, adu_size)) < 0) {
             av_log(ctx, AV_LOG_ERROR, "Out of memory.\n");
-            return AVERROR(ENOMEM);
+            return err;
         }
 
         pkt->stream_index = st->index;
@@ -120,9 +120,9 @@
     if (!continuation && adu_size <= len) {
         /* One or more complete frames */
 
-        if (av_new_packet(pkt, adu_size)) {
+        if ((err = av_new_packet(pkt, adu_size)) < 0) {
             av_log(ctx, AV_LOG_ERROR, "Out of memory.\n");
-            return AVERROR(ENOMEM);
+            return err;
         }
 
         pkt->stream_index = st->index;
diff --git a/libavformat/rtpdec_mpeg12.c b/libavformat/rtpdec_mpeg12.c
index 43d9d58..e640220 100644
--- a/libavformat/rtpdec_mpeg12.c
+++ b/libavformat/rtpdec_mpeg12.c
@@ -29,6 +29,7 @@
                              int flags)
 {
     unsigned int h;
+    int ret;
     if (len <= 4)
         return AVERROR_INVALIDDATA;
     h    = AV_RB32(buf);
@@ -41,8 +42,8 @@
         buf += 4;
         len -= 4;
     }
-    if (av_new_packet(pkt, len) < 0)
-        return AVERROR(ENOMEM);
+    if ((ret = av_new_packet(pkt, len)) < 0)
+        return ret;
     memcpy(pkt->data, buf, len);
     pkt->stream_index = st->index;
     return 0;
diff --git a/libavformat/rtpdec_mpeg4.c b/libavformat/rtpdec_mpeg4.c
index 4f70599..34c7950 100644
--- a/libavformat/rtpdec_mpeg4.c
+++ b/libavformat/rtpdec_mpeg4.c
@@ -70,6 +70,12 @@
     const char *str;
     uint16_t    type;
     uint32_t    offset;
+
+    /** Range for integer values */
+    struct Range {
+        int min;
+        int max;
+    } range;
 } AttrNameMap;
 
 /* All known fmtp parameters and the corresponding RTPAttrTypeEnum */
@@ -77,18 +83,24 @@
 #define ATTR_NAME_TYPE_STR 1
 static const AttrNameMap attr_names[] = {
     { "SizeLength",       ATTR_NAME_TYPE_INT,
-      offsetof(PayloadContext, sizelength) },
+      offsetof(PayloadContext, sizelength),
+      {0, 32} }, // SizeLength number of bits used to encode AU-size integer value
     { "IndexLength",      ATTR_NAME_TYPE_INT,
-      offsetof(PayloadContext, indexlength) },
+      offsetof(PayloadContext, indexlength),
+      {0, 32} }, // IndexLength number of bits used to encode AU-Index integer value
     { "IndexDeltaLength", ATTR_NAME_TYPE_INT,
-      offsetof(PayloadContext, indexdeltalength) },
+      offsetof(PayloadContext, indexdeltalength),
+      {0, 32} }, // IndexDeltaLength number of bits to encode AU-Index-delta integer value
     { "profile-level-id", ATTR_NAME_TYPE_INT,
-      offsetof(PayloadContext, profile_level_id) },
+      offsetof(PayloadContext, profile_level_id),
+      {INT32_MIN, INT32_MAX} }, // It differs depending on StreamType
     { "StreamType",       ATTR_NAME_TYPE_INT,
-      offsetof(PayloadContext, streamtype) },
+      offsetof(PayloadContext, streamtype),
+      {0x00, 0x3F} }, // Values from ISO/IEC 14496-1, 'StreamType Values' table
     { "mode",             ATTR_NAME_TYPE_STR,
-      offsetof(PayloadContext, mode) },
-    { NULL, -1, -1 },
+      offsetof(PayloadContext, mode),
+       {0} },
+    { NULL, -1, -1, {0} },
 };
 
 static void close_context(PayloadContext *data)
@@ -100,10 +112,10 @@
 static int parse_fmtp_config(AVCodecParameters *par, const char *value)
 {
     /* decode the hexa encoded parameter */
-    int len = ff_hex_to_data(NULL, value);
-    av_freep(&par->extradata);
-    if (ff_alloc_extradata(par, len))
-        return AVERROR(ENOMEM);
+    int len = ff_hex_to_data(NULL, value), ret;
+
+    if ((ret = ff_alloc_extradata(par, len)) < 0)
+        return ret;
     ff_hex_to_data(par->extradata, value);
     return 0;
 }
@@ -289,15 +301,24 @@
         for (i = 0; attr_names[i].str; ++i) {
             if (!av_strcasecmp(attr, attr_names[i].str)) {
                 if (attr_names[i].type == ATTR_NAME_TYPE_INT) {
-                    int val = atoi(value);
-                    if (val > 32) {
+                    char *end_ptr = NULL;
+                    long long int val = strtoll(value, &end_ptr, 10);
+                    if (end_ptr == value || end_ptr[0] != '\0') {
                         av_log(s, AV_LOG_ERROR,
-                               "The %s field size is invalid (%d)\n",
-                               attr, val);
+                               "The %s field value is not a valid number: %s\n",
+                               attr, value);
                         return AVERROR_INVALIDDATA;
                     }
+                    if (val < attr_names[i].range.min ||
+                        val > attr_names[i].range.max) {
+                        av_log(s, AV_LOG_ERROR,
+                            "fmtp field %s should be in range [%d,%d] (provided value: %lld)",
+                            attr, attr_names[i].range.min, attr_names[i].range.max, val);
+                        return  AVERROR_INVALIDDATA;
+                    }
+
                     *(int *)((char *)data+
-                        attr_names[i].offset) = val;
+                        attr_names[i].offset) = (int) val;
                 } else if (attr_names[i].type == ATTR_NAME_TYPE_STR) {
                     char *val = av_strdup(value);
                     if (!val)
diff --git a/libavformat/rtpdec_qdm2.c b/libavformat/rtpdec_qdm2.c
index fa2b1b9..1eec2da 100644
--- a/libavformat/rtpdec_qdm2.c
+++ b/libavformat/rtpdec_qdm2.c
@@ -78,6 +78,7 @@
                              const uint8_t *buf, const uint8_t *end)
 {
     const uint8_t *p = buf;
+    int ret;
 
     while (end - p >= 2) {
         unsigned int item_len = p[0], config_item = p[1];
@@ -104,9 +105,10 @@
             case 4: /* stream with extradata */
                 if (item_len < 30)
                     return AVERROR_INVALIDDATA;
-                av_freep(&st->codecpar->extradata);
-                if (ff_alloc_extradata(st->codecpar, 26 + item_len)) {
-                    return AVERROR(ENOMEM);
+
+                ret = ff_alloc_extradata(st->codecpar, 26 + item_len);
+                if (ret < 0) {
+                    return ret;
                 }
                 AV_WB32(st->codecpar->extradata, 12);
                 memcpy(st->codecpar->extradata + 4, "frma", 4);
diff --git a/libavformat/rtpdec_qt.c b/libavformat/rtpdec_qt.c
index 77a3ce4..740c382 100644
--- a/libavformat/rtpdec_qt.c
+++ b/libavformat/rtpdec_qt.c
@@ -48,13 +48,13 @@
     GetBitContext gb;
     int packing_scheme, has_payload_desc, has_packet_info, alen,
         has_marker_bit = flags & RTP_FLAG_MARKER,
-        keyframe;
+        keyframe, ret;
 
     if (qt->remaining) {
         int num = qt->pkt.size / qt->bytes_per_frame;
 
-        if (av_new_packet(pkt, qt->bytes_per_frame))
-            return AVERROR(ENOMEM);
+        if ((ret = av_new_packet(pkt, qt->bytes_per_frame)) < 0)
+            return ret;
         pkt->stream_index = st->index;
         pkt->flags        = qt->pkt.flags;
         memcpy(pkt->data,
@@ -208,8 +208,8 @@
             alen % qt->bytes_per_frame != 0)
             return AVERROR_INVALIDDATA; /* wrongly padded */
         qt->remaining = (alen / qt->bytes_per_frame) - 1;
-        if (av_new_packet(pkt, qt->bytes_per_frame))
-            return AVERROR(ENOMEM);
+        if ((ret = av_new_packet(pkt, qt->bytes_per_frame)) < 0)
+            return ret;
         memcpy(pkt->data, buf + avio_tell(&pb), qt->bytes_per_frame);
         pkt->flags = keyframe ? AV_PKT_FLAG_KEY : 0;
         pkt->stream_index = st->index;
diff --git a/libavformat/rtpdec_svq3.c b/libavformat/rtpdec_svq3.c
index 77164dd..ffe21ac 100644
--- a/libavformat/rtpdec_svq3.c
+++ b/libavformat/rtpdec_svq3.c
@@ -58,10 +58,6 @@
     len -= 2;
 
     if (config_packet) {
-
-        av_freep(&st->codecpar->extradata);
-        st->codecpar->extradata_size = 0;
-
         if (len < 2 || ff_alloc_extradata(st->codecpar, len + 8))
             return AVERROR_INVALIDDATA;
 
diff --git a/libavformat/rtpdec_xiph.c b/libavformat/rtpdec_xiph.c
index 574508a..c2db10d 100644
--- a/libavformat/rtpdec_xiph.c
+++ b/libavformat/rtpdec_xiph.c
@@ -63,7 +63,7 @@
                               int flags)
 {
 
-    int ident, fragmented, tdt, num_pkts, pkt_len;
+    int ident, fragmented, tdt, num_pkts, pkt_len, ret;
 
     if (!buf) {
         if (!data->split_buf || data->split_pos + 2 > data->split_buf_len ||
@@ -77,9 +77,9 @@
             av_log(ctx, AV_LOG_ERROR, "Not enough data to return\n");
             return AVERROR_INVALIDDATA;
         }
-        if (av_new_packet(pkt, pkt_len)) {
+        if ((ret = av_new_packet(pkt, pkt_len)) < 0) {
             av_log(ctx, AV_LOG_ERROR, "Out of memory.\n");
-            return AVERROR(ENOMEM);
+            return ret;
         }
         pkt->stream_index = st->index;
         memcpy(pkt->data, data->split_buf + data->split_pos, pkt_len);
@@ -123,9 +123,9 @@
     len -= 6;
 
     if (fragmented == 0) {
-        if (av_new_packet(pkt, pkt_len)) {
+        if ((ret = av_new_packet(pkt, pkt_len)) < 0) {
             av_log(ctx, AV_LOG_ERROR, "Out of memory.\n");
-            return AVERROR(ENOMEM);
+            return ret;
         }
         pkt->stream_index = st->index;
         memcpy(pkt->data, buf, pkt_len);
@@ -228,6 +228,7 @@
 {
 
     unsigned num_packed, num_headers, length, length1, length2, extradata_alloc;
+    int ret;
     uint8_t *ptr;
 
     if (packed_headers_end - packed_headers < 9) {
@@ -264,9 +265,9 @@
      * -- AV_INPUT_BUFFER_PADDING_SIZE required */
     extradata_alloc = length + length/255 + 3 + AV_INPUT_BUFFER_PADDING_SIZE;
 
-    if (ff_alloc_extradata(par, extradata_alloc)) {
+    if ((ret = ff_alloc_extradata(par, extradata_alloc)) < 0) {
         av_log(s, AV_LOG_ERROR, "Out of memory\n");
-        return AVERROR(ENOMEM);
+        return ret;
     }
     ptr = par->extradata;
     *ptr++ = 2;
diff --git a/libavformat/rtpenc_chain.c b/libavformat/rtpenc_chain.c
index d3c1bc9..e6b603d 100644
--- a/libavformat/rtpenc_chain.c
+++ b/libavformat/rtpenc_chain.c
@@ -31,7 +31,7 @@
 {
     AVFormatContext *rtpctx = NULL;
     int ret;
-    AVOutputFormat *rtp_format = av_guess_format("rtp", NULL, NULL);
+    ff_const59 AVOutputFormat *rtp_format = av_guess_format("rtp", NULL, NULL);
     uint8_t *rtpflags;
     AVDictionary *opts = NULL;
 
@@ -59,6 +59,7 @@
     /* Copy other stream parameters. */
     rtpctx->streams[0]->sample_aspect_ratio = st->sample_aspect_ratio;
     rtpctx->flags |= s->flags & AVFMT_FLAG_BITEXACT;
+    rtpctx->strict_std_compliance = s->strict_std_compliance;
 
     /* Get the payload type from the codec */
     if (st->id < RTP_PT_PRIVATE)
diff --git a/libavformat/rtpenc_mpegts.c b/libavformat/rtpenc_mpegts.c
index 5f81e1a..7d7377d 100644
--- a/libavformat/rtpenc_mpegts.c
+++ b/libavformat/rtpenc_mpegts.c
@@ -48,8 +48,8 @@
 {
     struct MuxChain *chain = s->priv_data;
     AVFormatContext *mpegts_ctx = NULL, *rtp_ctx = NULL;
-    AVOutputFormat *mpegts_format = av_guess_format("mpegts", NULL, NULL);
-    AVOutputFormat *rtp_format    = av_guess_format("rtp", NULL, NULL);
+    ff_const59 AVOutputFormat *mpegts_format = av_guess_format("mpegts", NULL, NULL);
+    ff_const59 AVOutputFormat *rtp_format    = av_guess_format("rtp", NULL, NULL);
     int i, ret = AVERROR(ENOMEM);
     AVStream *st;
 
@@ -60,6 +60,7 @@
         return AVERROR(ENOMEM);
     mpegts_ctx->oformat   = mpegts_format;
     mpegts_ctx->max_delay = s->max_delay;
+    av_dict_copy(&mpegts_ctx->metadata, s->metadata, 0);
     for (i = 0; i < s->nb_streams; i++) {
         AVStream* st = avformat_new_stream(mpegts_ctx, NULL);
         if (!st)
@@ -102,10 +103,10 @@
 fail:
     if (mpegts_ctx) {
         ffio_free_dyn_buf(&mpegts_ctx->pb);
+        av_dict_free(&mpegts_ctx->metadata);
         avformat_free_context(mpegts_ctx);
     }
-    if (rtp_ctx)
-        avformat_free_context(rtp_ctx);
+    avformat_free_context(rtp_ctx);
     rtp_mpegts_write_close(s);
     return ret;
 }
diff --git a/libavformat/rtpproto.c b/libavformat/rtpproto.c
index e706300..1f0a82a 100644
--- a/libavformat/rtpproto.c
+++ b/libavformat/rtpproto.c
@@ -40,7 +40,7 @@
 #include "os_support.h"
 #include <fcntl.h>
 #if HAVE_POLL_H
-#include <sys/poll.h>
+#include <poll.h>
 #endif
 
 typedef struct RTPContext {
diff --git a/libavformat/rtsp.c b/libavformat/rtsp.c
index ceb770a..b2b3f32 100644
--- a/libavformat/rtsp.c
+++ b/libavformat/rtsp.c
@@ -21,6 +21,7 @@
 
 #include "libavutil/avassert.h"
 #include "libavutil/base64.h"
+#include "libavutil/bprint.h"
 #include "libavutil/avstring.h"
 #include "libavutil/intreadwrite.h"
 #include "libavutil/mathematics.h"
@@ -76,7 +77,8 @@
 
 #define COMMON_OPTS() \
     { "reorder_queue_size", "set number of packets to buffer for handling of reordered packets", OFFSET(reordering_queue_size), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, INT_MAX, DEC }, \
-    { "buffer_size",        "Underlying protocol send/receive buffer size",                  OFFSET(buffer_size),           AV_OPT_TYPE_INT, { .i64 = -1 }, -1, INT_MAX, DEC|ENC } \
+    { "buffer_size",        "Underlying protocol send/receive buffer size",                  OFFSET(buffer_size),           AV_OPT_TYPE_INT, { .i64 = -1 }, -1, INT_MAX, DEC|ENC }, \
+    { "pkt_size",           "Underlying protocol send packet size",                          OFFSET(pkt_size),              AV_OPT_TYPE_INT, { .i64 = -1 }, -1, INT_MAX, ENC } \
 
 
 const AVOption ff_rtsp_options[] = {
@@ -87,6 +89,7 @@
     { "tcp", "TCP", 0, AV_OPT_TYPE_CONST, {.i64 = 1 << RTSP_LOWER_TRANSPORT_TCP}, 0, 0, DEC|ENC, "rtsp_transport" }, \
     { "udp_multicast", "UDP multicast", 0, AV_OPT_TYPE_CONST, {.i64 = 1 << RTSP_LOWER_TRANSPORT_UDP_MULTICAST}, 0, 0, DEC, "rtsp_transport" },
     { "http", "HTTP tunneling", 0, AV_OPT_TYPE_CONST, {.i64 = (1 << RTSP_LOWER_TRANSPORT_HTTP)}, 0, 0, DEC, "rtsp_transport" },
+    { "https", "HTTPS tunneling", 0, AV_OPT_TYPE_CONST, {.i64 = (1 << RTSP_LOWER_TRANSPORT_HTTPS )}, 0, 0, DEC, "rtsp_transport" },
     RTSP_FLAG_OPTS("rtsp_flags", "set RTSP flags"),
     { "listen", "wait for incoming connections", 0, AV_OPT_TYPE_CONST, {.i64 = RTSP_FLAG_LISTEN}, 0, 0, DEC, "rtsp_flags" },
     { "prefer_tcp", "try RTP via TCP first, if available", 0, AV_OPT_TYPE_CONST, {.i64 = RTSP_FLAG_PREFER_TCP}, 0, 0, DEC|ENC, "rtsp_flags" },
@@ -131,6 +134,8 @@
 
     snprintf(buf, sizeof(buf), "%d", rt->buffer_size);
     av_dict_set(&opts, "buffer_size", buf, 0);
+    snprintf(buf, sizeof(buf), "%d", rt->pkt_size);
+    av_dict_set(&opts, "pkt_size", buf, 0);
 
     return opts;
 }
@@ -454,7 +459,10 @@
         } else if (!strcmp(st_type, "text")) {
             codec_type = AVMEDIA_TYPE_SUBTITLE;
         }
-        if (codec_type == AVMEDIA_TYPE_UNKNOWN || !(rt->media_type_mask & (1 << codec_type))) {
+        if (codec_type == AVMEDIA_TYPE_UNKNOWN ||
+            !(rt->media_type_mask & (1 << codec_type)) ||
+            rt->nb_rtsp_streams >= s->max_streams
+        ) {
             s1->skip_media = 1;
             return;
         }
@@ -1311,6 +1319,9 @@
     char buf[4096], *out_buf;
     char base64buf[AV_BASE64_SIZE(sizeof(buf))];
 
+    if (!rt->rtsp_hd_out)
+        return AVERROR(ENOTCONN);
+
     /* Add in RTSP headers */
     out_buf = buf;
     rt->seq++;
@@ -1606,6 +1617,7 @@
             char url[1024], namebuf[50], optbuf[20] = "";
             struct sockaddr_storage addr;
             int port, ttl;
+            AVDictionary *opts = map_to_opts(rt);
 
             if (reply->transports[0].destination.ss_family) {
                 addr      = reply->transports[0].destination;
@@ -1622,8 +1634,11 @@
                         namebuf, sizeof(namebuf), NULL, 0, NI_NUMERICHOST);
             ff_url_join(url, sizeof(url), "rtp", NULL, namebuf,
                         port, "%s", optbuf);
-            if (ffurl_open_whitelist(&rtsp_st->rtp_handle, url, AVIO_FLAG_READ_WRITE,
-                           &s->interrupt_callback, NULL, s->protocol_whitelist, s->protocol_blacklist, NULL) < 0) {
+            err = ffurl_open_whitelist(&rtsp_st->rtp_handle, url, AVIO_FLAG_READ_WRITE,
+                           &s->interrupt_callback, &opts, s->protocol_whitelist, s->protocol_blacklist, NULL);
+            av_dict_free(&opts);
+
+            if (err < 0) {
                 err = AVERROR_INVALIDDATA;
                 goto fail;
             }
@@ -1663,9 +1678,10 @@
     char tcpname[1024], cmd[2048], auth[128];
     const char *lower_rtsp_proto = "tcp";
     int port, err, tcp_fd;
-    RTSPMessageHeader reply1 = {0}, *reply = &reply1;
+    RTSPMessageHeader reply1, *reply = &reply1;
     int lower_transport_mask = 0;
     int default_port = RTSP_DEFAULT_PORT;
+    int https_tunnel = 0;
     char real_challenge[64] = "";
     struct sockaddr_storage peer;
     socklen_t peer_len = sizeof(peer);
@@ -1684,7 +1700,9 @@
         s->max_delay = s->iformat ? DEFAULT_REORDERING_DELAY : 0;
 
     rt->control_transport = RTSP_MODE_PLAIN;
-    if (rt->lower_transport_mask & (1 << RTSP_LOWER_TRANSPORT_HTTP)) {
+    if (rt->lower_transport_mask & ((1 << RTSP_LOWER_TRANSPORT_HTTP) |
+                                    (1 << RTSP_LOWER_TRANSPORT_HTTPS))) {
+        https_tunnel = !!(rt->lower_transport_mask & (1 << RTSP_LOWER_TRANSPORT_HTTPS));
         rt->lower_transport_mask = 1 << RTSP_LOWER_TRANSPORT_TCP;
         rt->control_transport = RTSP_MODE_TUNNEL;
     }
@@ -1692,6 +1710,7 @@
     rt->lower_transport_mask &= (1 << RTSP_LOWER_TRANSPORT_NB) - 1;
 
 redirect:
+    memset(&reply1, 0, sizeof(reply1));
     /* extract hostname and port */
     av_url_split(proto, sizeof(proto), auth, sizeof(auth),
                  host, sizeof(host), &port, path, sizeof(path), s->url);
@@ -1736,8 +1755,11 @@
         char httpname[1024];
         char sessioncookie[17];
         char headers[1024];
+        AVDictionary *options = NULL;
 
-        ff_url_join(httpname, sizeof(httpname), "http", auth, host, port, "%s", path);
+        av_dict_set_int(&options, "timeout", rt->stimeout, 0);
+
+        ff_url_join(httpname, sizeof(httpname), https_tunnel ? "https" : "http", auth, host, port, "%s", path);
         snprintf(sessioncookie, sizeof(sessioncookie), "%08x%08x",
                  av_get_random_seed(), av_get_random_seed());
 
@@ -1766,7 +1788,8 @@
         }
 
         /* complete the connection */
-        if (ffurl_connect(rt->rtsp_hd, NULL)) {
+        if (ffurl_connect(rt->rtsp_hd, &options)) {
+            av_dict_free(&options);
             err = AVERROR(EIO);
             goto fail;
         }
@@ -1789,6 +1812,7 @@
                  sessioncookie);
         av_opt_set(rt->rtsp_hd_out->priv_data, "headers", headers, 0);
         av_opt_set(rt->rtsp_hd_out->priv_data, "chunked_post", "0", 0);
+        av_opt_set(rt->rtsp_hd_out->priv_data, "send_expect_100", "0", 0);
 
         /* Initialize the authentication state for the POST session. The HTTP
          * protocol implementation doesn't properly handle multi-pass
@@ -1809,10 +1833,12 @@
         ff_http_init_auth_state(rt->rtsp_hd_out, rt->rtsp_hd);
 
         /* complete the connection */
-        if (ffurl_connect(rt->rtsp_hd_out, NULL)) {
+        if (ffurl_connect(rt->rtsp_hd_out, &options)) {
+            av_dict_free(&options);
             err = AVERROR(EIO);
             goto fail;
         }
+        av_dict_free(&options);
     } else {
         int ret;
         /* open the tcp connection */
@@ -2277,7 +2303,7 @@
 #endif /* CONFIG_RTPDEC */
 
 #if CONFIG_SDP_DEMUXER
-static int sdp_probe(AVProbeData *p1)
+static int sdp_probe(const AVProbeData *p1)
 {
     const char *p = p1->buf, *p_end = p1->buf + p1->buf_size;
 
@@ -2416,7 +2442,7 @@
 #endif /* CONFIG_SDP_DEMUXER */
 
 #if CONFIG_RTP_DEMUXER
-static int rtp_probe(AVProbeData *p)
+static int rtp_probe(const AVProbeData *p)
 {
     if (av_strstart(p->filename, "rtp:", NULL))
         return AVPROBE_SCORE_MAX;
@@ -2426,7 +2452,7 @@
 static int rtp_read_header(AVFormatContext *s)
 {
     uint8_t recvbuf[RTP_MAX_PACKET_LENGTH];
-    char host[500], sdp[500];
+    char host[500], filters_buf[1000];
     int ret, port;
     URLContext* in = NULL;
     int payload_type;
@@ -2435,6 +2461,8 @@
     AVIOContext pb;
     socklen_t addrlen = sizeof(addr);
     RTSPState *rt = s->priv_data;
+    const char *p;
+    AVBPrint sdp;
 
     if (!ff_network_init())
         return AVERROR(EIO);
@@ -2492,16 +2520,39 @@
     av_url_split(NULL, 0, NULL, 0, host, sizeof(host), &port,
                  NULL, 0, s->url);
 
-    snprintf(sdp, sizeof(sdp),
-             "v=0\r\nc=IN IP%d %s\r\nm=%s %d RTP/AVP %d\r\n",
-             addr.ss_family == AF_INET ? 4 : 6, host,
-             par->codec_type == AVMEDIA_TYPE_DATA  ? "application" :
-             par->codec_type == AVMEDIA_TYPE_VIDEO ? "video" : "audio",
-             port, payload_type);
-    av_log(s, AV_LOG_VERBOSE, "SDP:\n%s\n", sdp);
+    av_bprint_init(&sdp, 0, AV_BPRINT_SIZE_UNLIMITED);
+    av_bprintf(&sdp, "v=0\r\nc=IN IP%d %s\r\n",
+               addr.ss_family == AF_INET ? 4 : 6, host);
+
+    p = strchr(s->url, '?');
+    if (p) {
+        static const char filters[][2][8] = { { "sources", "incl" },
+                                              { "block",   "excl" } };
+        int i;
+        char *q;
+        for (i = 0; i < FF_ARRAY_ELEMS(filters); i++) {
+            if (av_find_info_tag(filters_buf, sizeof(filters_buf), filters[i][0], p)) {
+                q = filters_buf;
+                while ((q = strchr(q, ',')) != NULL)
+                    *q = ' ';
+                av_bprintf(&sdp, "a=source-filter:%s IN IP%d %s %s\r\n",
+                           filters[i][1],
+                           addr.ss_family == AF_INET ? 4 : 6, host,
+                           filters_buf);
+            }
+        }
+    }
+
+    av_bprintf(&sdp, "m=%s %d RTP/AVP %d\r\n",
+               par->codec_type == AVMEDIA_TYPE_DATA  ? "application" :
+               par->codec_type == AVMEDIA_TYPE_VIDEO ? "video" : "audio",
+               port, payload_type);
+    av_log(s, AV_LOG_VERBOSE, "SDP:\n%s\n", sdp.str);
+    if (!av_bprint_is_complete(&sdp))
+        goto fail_nobuf;
     avcodec_parameters_free(&par);
 
-    ffio_init_context(&pb, sdp, strlen(sdp), 0, NULL, NULL, NULL, NULL);
+    ffio_init_context(&pb, sdp.str, sdp.len, 0, NULL, NULL, NULL, NULL);
     s->pb = &pb;
 
     /* sdp_read_header initializes this again */
@@ -2511,8 +2562,13 @@
 
     ret = sdp_read_header(s);
     s->pb = NULL;
+    av_bprint_finalize(&sdp, NULL);
     return ret;
 
+fail_nobuf:
+    ret = AVERROR(ENOMEM);
+    av_log(s, AV_LOG_ERROR, "rtp_read_header(): not enough buffer space for sdp-headers\n");
+    av_bprint_finalize(&sdp, NULL);
 fail:
     avcodec_parameters_free(&par);
     if (in)
diff --git a/libavformat/rtsp.h b/libavformat/rtsp.h
index 9a7f366..54a9a30 100644
--- a/libavformat/rtsp.h
+++ b/libavformat/rtsp.h
@@ -42,6 +42,7 @@
     RTSP_LOWER_TRANSPORT_HTTP = 8,          /**< HTTP tunneled - not a proper
                                                  transport mode as such,
                                                  only for use via AVOptions */
+    RTSP_LOWER_TRANSPORT_HTTPS,             /**< HTTPS tunneled */
     RTSP_LOWER_TRANSPORT_CUSTOM = 16,       /**< Custom IO - not a public
                                                  option for lower_transport_mask,
                                                  but set in the SDP demuxer based
@@ -409,6 +410,7 @@
 
     char default_lang[4];
     int buffer_size;
+    int pkt_size;
 } RTSPState;
 
 #define RTSP_FLAG_FILTER_SRC  0x1    /**< Filter incoming UDP packets -
diff --git a/libavformat/rtspdec.c b/libavformat/rtspdec.c
index 32dff23..bd2e8f4 100644
--- a/libavformat/rtspdec.c
+++ b/libavformat/rtspdec.c
@@ -699,7 +699,7 @@
     }
 }
 
-static int rtsp_probe(AVProbeData *p)
+static int rtsp_probe(const AVProbeData *p)
 {
     if (
 #if CONFIG_TLS_PROTOCOL
diff --git a/libavformat/s337m.c b/libavformat/s337m.c
index 2e85d48..36e1047 100644
--- a/libavformat/s337m.c
+++ b/libavformat/s337m.c
@@ -31,7 +31,7 @@
 #define IS_24LE_MARKER(state)   ((state & 0xFFFFFFFFFFFF) == MARKER_24LE)
 #define IS_LE_MARKER(state)     (IS_16LE_MARKER(state) || IS_20LE_MARKER(state) || IS_24LE_MARKER(state))
 
-static int s337m_get_offset_and_codec(AVFormatContext *s,
+static int s337m_get_offset_and_codec(void *avc,
                                       uint64_t state,
                                       int data_type, int data_size,
                                       int *offset, enum AVCodecID *codec)
@@ -50,8 +50,8 @@
     }
 
     if ((data_type & 0x1F) != 0x1C) {
-        if (s)
-            avpriv_report_missing_feature(s, "Data type %#x in SMPTE 337M", data_type & 0x1F);
+        if (avc)
+            avpriv_report_missing_feature(avc, "Data type %#x in SMPTE 337M", data_type & 0x1F);
         return AVERROR_PATCHWELCOME;
     }
 
@@ -72,8 +72,8 @@
         *offset = 1601;
         break;
     default:
-        if (s)
-            avpriv_report_missing_feature(s, "Dolby E data size %d in SMPTE 337M", data_size);
+        if (avc)
+            avpriv_report_missing_feature(avc, "Dolby E data size %d in SMPTE 337M", data_size);
         return AVERROR_PATCHWELCOME;
     }
 
@@ -82,7 +82,7 @@
     return 0;
 }
 
-static int s337m_probe(AVProbeData *p)
+static int s337m_probe(const AVProbeData *p)
 {
     uint64_t state = 0;
     int markers[3] = { 0 };
@@ -174,7 +174,6 @@
     pkt->pos = pos;
 
     if (avio_read(pb, pkt->data, pkt->size) < pkt->size) {
-        av_packet_unref(pkt);
         return AVERROR_EOF;
     }
 
@@ -186,7 +185,6 @@
     if (!s->nb_streams) {
         AVStream *st = avformat_new_stream(s, NULL);
         if (!st) {
-            av_packet_unref(pkt);
             return AVERROR(ENOMEM);
         }
         st->codecpar->codec_type = AVMEDIA_TYPE_AUDIO;
diff --git a/libavformat/samidec.c b/libavformat/samidec.c
index 7ea1bdf..fd98393 100644
--- a/libavformat/samidec.c
+++ b/libavformat/samidec.c
@@ -36,7 +36,7 @@
     FFDemuxSubtitlesQueue q;
 } SAMIContext;
 
-static int sami_probe(AVProbeData *p)
+static int sami_probe(const AVProbeData *p)
 {
     char buf[6];
     FFTextReader tr;
diff --git a/libavformat/sapdec.c b/libavformat/sapdec.c
index 7a6c8bf..b3644b4 100644
--- a/libavformat/sapdec.c
+++ b/libavformat/sapdec.c
@@ -42,7 +42,7 @@
     int eof;
 };
 
-static int sap_probe(AVProbeData *p)
+static int sap_probe(const AVProbeData *p)
 {
     if (av_strstart(p->filename, "sap:", NULL))
         return AVPROBE_SCORE_MAX;
@@ -68,7 +68,7 @@
     uint8_t recvbuf[RTP_MAX_PACKET_LENGTH];
     int port;
     int ret, i;
-    AVInputFormat* infmt;
+    ff_const59 AVInputFormat* infmt;
 
     if (!ff_network_init())
         return AVERROR(EIO);
@@ -142,6 +142,10 @@
         }
 
         sap->sdp = av_strdup(&recvbuf[pos]);
+        if (!sap->sdp) {
+            ret = AVERROR(ENOMEM);
+            goto fail;
+        }
         break;
     }
 
@@ -221,7 +225,6 @@
             int i = s->nb_streams;
             AVStream *st = avformat_new_stream(s, NULL);
             if (!st) {
-                av_packet_unref(pkt);
                 return AVERROR(ENOMEM);
             }
             st->id = i;
diff --git a/libavformat/sbcdec.c b/libavformat/sbcdec.c
index ae74a22..7a455ce 100644
--- a/libavformat/sbcdec.c
+++ b/libavformat/sbcdec.c
@@ -22,6 +22,7 @@
 #include "avformat.h"
 #include "rawdec.h"
 
+FF_RAW_DEMUXER_CLASS(sbc)
 AVInputFormat ff_sbc_demuxer = {
     .name           = "sbc",
     .long_name      = NULL_IF_CONFIG_SMALL("raw SBC (low-complexity subband codec)"),
@@ -30,4 +31,6 @@
     .read_header    = ff_raw_audio_read_header,
     .read_packet    = ff_raw_read_partial_packet,
     .flags          = AVFMT_GENERIC_INDEX,
+    .priv_data_size = sizeof(FFRawDemuxerContext),
+    .priv_class     = &sbc_demuxer_class,
 };
diff --git a/libavformat/sbgdec.c b/libavformat/sbgdec.c
index cbedd12..de1de27 100644
--- a/libavformat/sbgdec.c
+++ b/libavformat/sbgdec.c
@@ -197,7 +197,7 @@
         if (end > cur + 1)
             cur = end;
     }
-    *rtime = (hours * 3600 + minutes * 60 + seconds) * AV_TIME_BASE;
+    *rtime = (hours * 3600LL + minutes * 60LL + seconds) * AV_TIME_BASE;
     return cur - str;
 }
 
@@ -1327,7 +1327,7 @@
 static int encode_intervals(struct sbg_script *s, AVCodecParameters *par,
                             struct ws_intervals *inter)
 {
-    int i, edata_size = 4;
+    int i, edata_size = 4, ret;
     uint8_t *edata;
 
     for (i = 0; i < inter->nb_inter; i++) {
@@ -1336,8 +1336,8 @@
         if (edata_size < 0)
             return AVERROR(ENOMEM);
     }
-    if (ff_alloc_extradata(par, edata_size))
-        return AVERROR(ENOMEM);
+    if ((ret = ff_alloc_extradata(par, edata_size)) < 0)
+        return ret;
     edata = par->extradata;
 
 #define ADD_EDATA32(v) do { AV_WL32(edata, (v)); edata += 4; } while(0)
@@ -1367,7 +1367,7 @@
     return 0;
 }
 
-static av_cold int sbg_read_probe(AVProbeData *p)
+static av_cold int sbg_read_probe(const AVProbeData *p)
 {
     int r, score;
     struct sbg_script script = { 0 };
@@ -1446,6 +1446,7 @@
 static int sbg_read_packet(AVFormatContext *avf, AVPacket *packet)
 {
     int64_t ts, end_ts;
+    int ret;
 
     ts = avf->streams[0]->cur_dts;
     end_ts = ts + avf->streams[0]->codecpar->frame_size;
@@ -1454,8 +1455,8 @@
                        end_ts);
     if (end_ts <= ts)
         return AVERROR_EOF;
-    if (av_new_packet(packet, 12) < 0)
-        return AVERROR(ENOMEM);
+    if ((ret = av_new_packet(packet, 12)) < 0)
+        return ret;
     packet->dts = packet->pts = ts;
     packet->duration = end_ts - ts;
     AV_WL64(packet->data + 0, ts);
diff --git a/libavformat/sccdec.c b/libavformat/sccdec.c
index 89d21b9..b9042b3 100644
--- a/libavformat/sccdec.c
+++ b/libavformat/sccdec.c
@@ -22,6 +22,7 @@
 #include "avformat.h"
 #include "internal.h"
 #include "subtitles.h"
+#include "libavutil/avstring.h"
 #include "libavutil/bprint.h"
 #include "libavutil/intreadwrite.h"
 
@@ -29,7 +30,7 @@
     FFDemuxSubtitlesQueue q;
 } SCCContext;
 
-static int scc_probe(AVProbeData *p)
+static int scc_probe(const AVProbeData *p)
 {
     char buf[18];
     FFTextReader tr;
@@ -63,6 +64,7 @@
     SCCContext *scc = s->priv_data;
     AVStream *st = avformat_new_stream(s, NULL);
     char line[4096], line2[4096];
+    int64_t ts_start, ts_end;
     int count = 0, ret = 0;
     ptrdiff_t len2, len;
     uint8_t out[4096];
@@ -77,14 +79,14 @@
     st->codecpar->codec_id   = AV_CODEC_ID_EIA_608;
 
     while (!ff_text_eof(&tr)) {
-        const int64_t pos = ff_text_pos(&tr);
+        int64_t current_pos, next_pos;
         char *saveptr = NULL, *lline;
         int hh1, mm1, ss1, fs1, i;
         int hh2, mm2, ss2, fs2;
-        int64_t ts_start, ts_end;
         AVPacket *sub;
 
         if (count == 0) {
+            current_pos = ff_text_pos(&tr);
             while (!ff_text_eof(&tr)) {
                 len = ff_subtitles_read_line(&tr, line, sizeof(line));
                 if (len > 13)
@@ -94,22 +96,24 @@
 
         if (!strncmp(line, "Scenarist_SCC V1.0", 18))
             continue;
-        if (sscanf(line, "%d:%d:%d%*[:;]%d", &hh1, &mm1, &ss1, &fs1) != 4)
+        if (av_sscanf(line, "%d:%d:%d%*[:;]%d", &hh1, &mm1, &ss1, &fs1) != 4)
             continue;
 
         ts_start = (hh1 * 3600LL + mm1 * 60LL + ss1) * 1000LL + fs1 * 33;
 
+        next_pos = ff_text_pos(&tr);
         while (!ff_text_eof(&tr)) {
             len2 = ff_subtitles_read_line(&tr, line2, sizeof(line2));
             if (len2 > 13)
                 break;
         }
-        if (sscanf(line2, "%d:%d:%d%*[:;]%d", &hh2, &mm2, &ss2, &fs2) != 4)
+        if (av_sscanf(line2, "%d:%d:%d%*[:;]%d", &hh2, &mm2, &ss2, &fs2) != 4)
             continue;
 
         ts_end = (hh2 * 3600LL + mm2 * 60LL + ss2) * 1000LL + fs2 * 33;
         count++;
 
+try_again:
         lline = (char *)&line;
         lline += 12;
 
@@ -120,7 +124,7 @@
             if (!ptr)
                 break;
 
-            if (sscanf(ptr, "%c%c%c%c", &c1, &c2, &c3, &c4) != 4)
+            if (av_sscanf(ptr, "%c%c%c%c", &c1, &c2, &c3, &c4) != 4)
                 break;
 
             lline = NULL;
@@ -134,11 +138,18 @@
         if (!sub)
             return AVERROR(ENOMEM);
 
-        sub->pos = pos;
+        sub->pos = current_pos;
         sub->pts = ts_start;
-        sub->duration = FFMAX(1200, ts_end - ts_start);
+        sub->duration = ts_end - ts_start;
         memmove(line, line2, sizeof(line));
-        FFSWAP(ptrdiff_t, len, len2);
+        current_pos = next_pos;
+        line2[0] = 0;
+    }
+
+    if (line[0]) {
+        ts_start = ts_end;
+        ts_end += 1200;
+        goto try_again;
     }
 
     ff_subtitles_queue_finalize(s, &scc->q);
diff --git a/libavformat/sdp.c b/libavformat/sdp.c
index a5d202e..34e9839 100644
--- a/libavformat/sdp.c
+++ b/libavformat/sdp.c
@@ -347,7 +347,8 @@
 
 static char *xiph_extradata2config(AVFormatContext *s, AVCodecParameters *par)
 {
-    char *config, *encoded_config;
+    uint8_t *config;
+    char *encoded_config;
     const uint8_t *header_start[3];
     int headers_len, header_len[3], config_len;
     int first_header_size;
diff --git a/libavformat/sdr2.c b/libavformat/sdr2.c
index c995333..3743d59 100644
--- a/libavformat/sdr2.c
+++ b/libavformat/sdr2.c
@@ -23,7 +23,7 @@
 #include "avformat.h"
 #include "internal.h"
 
-static int sdr2_probe(AVProbeData *p)
+static int sdr2_probe(const AVProbeData *p)
 {
     if (AV_RL32(p->buf) != MKTAG('S', 'R', 'A', 1))
         return 0;
@@ -90,12 +90,11 @@
     avio_skip(s->pb, 30);
 
     if (pos == FIRST) {
-        if (av_new_packet(pkt, next - 52 + 24) < 0)
-            return AVERROR(ENOMEM);
+        if ((ret = av_new_packet(pkt, next - 52 + 24)) < 0)
+            return ret;
         memcpy(pkt->data, header, 24);
         ret = avio_read(s->pb, pkt->data + 24, next - 52);
         if (ret < 0) {
-            av_packet_unref(pkt);
             return ret;
         }
         av_shrink_packet(pkt, ret + 24);
diff --git a/libavformat/sdsdec.c b/libavformat/sdsdec.c
index 081bb4c..c70f5af 100644
--- a/libavformat/sdsdec.c
+++ b/libavformat/sdsdec.c
@@ -30,7 +30,7 @@
     void (*read_block)(const uint8_t *src, uint32_t *dst);
 } SDSContext;
 
-static int sds_probe(AVProbeData *p)
+static int sds_probe(const AVProbeData *p)
 {
     if (AV_RB32(p->buf) == 0xF07E0001 && p->buf[20] == 0xF7 &&
         p->buf[6] >= 8 && p->buf[6] <= 28)
@@ -43,7 +43,7 @@
     int i;
 
     for (i = 0; i < 120; i += 2) {
-        unsigned sample = (src[i + 0] << 25) + (src[i + 1] << 18);
+        unsigned sample = ((unsigned)src[i + 0] << 25) + ((unsigned)src[i + 1] << 18);
 
         dst[i / 2] = sample;
     }
@@ -56,7 +56,7 @@
     for (i = 0; i < 120; i += 3) {
         unsigned sample;
 
-        sample = (src[i + 0] << 25) | (src[i + 1] << 18) | (src[i + 2] << 11);
+        sample = ((unsigned)src[i + 0] << 25) | ((unsigned)src[i + 1] << 18) | ((unsigned)src[i + 2] << 11);
         dst[i / 3] = sample;
     }
 }
@@ -68,7 +68,7 @@
     for (i = 0; i < 120; i += 4) {
         unsigned sample;
 
-        sample = (src[i + 0] << 25) | (src[i + 1] << 18) | (src[i + 2] << 11) | (src[i + 3] << 4);
+        sample = ((unsigned)src[i + 0] << 25) | ((unsigned)src[i + 1] << 18) | ((unsigned)src[i + 2] << 11) | ((unsigned)src[i + 3] << 4);
         dst[i / 4] = sample;
     }
 }
diff --git a/libavformat/sdxdec.c b/libavformat/sdxdec.c
index e8e7a4f..1965104 100644
--- a/libavformat/sdxdec.c
+++ b/libavformat/sdxdec.c
@@ -25,7 +25,7 @@
 #include "internal.h"
 #include "pcm.h"
 
-static int sdx_probe(AVProbeData *p)
+static int sdx_probe(const AVProbeData *p)
 {
     if (AV_RB32(p->buf) == AV_RB32("SDX:"))
         return AVPROBE_SCORE_EXTENSION;
diff --git a/libavformat/segafilm.c b/libavformat/segafilm.c
index b0c6c41..777606b 100644
--- a/libavformat/segafilm.c
+++ b/libavformat/segafilm.c
@@ -64,7 +64,7 @@
     unsigned int version;
 } FilmDemuxContext;
 
-static int film_probe(AVProbeData *p)
+static int film_probe(const AVProbeData *p)
 {
     if (AV_RB32(&p->buf[0]) != FILM_TAG)
         return 0;
diff --git a/libavformat/segafilmenc.c b/libavformat/segafilmenc.c
index 524230e..93c482e 100644
--- a/libavformat/segafilmenc.c
+++ b/libavformat/segafilmenc.c
@@ -45,7 +45,6 @@
 } FILMPacket;
 
 typedef struct FILMOutputContext {
-    const AVClass *class;
     int audio_index;
     int video_index;
     int64_t stab_pos;
@@ -70,7 +69,7 @@
         info2 = pkt->duration;
         /* The top bit being set indicates a key frame */
         if (!pkt->keyframe)
-            info1 |= (1 << 31);
+            info1 |= 1U << 31;
     }
 
     /* Write the 16-byte sample info packet to the STAB chunk in the header */
@@ -147,10 +146,8 @@
     case AV_CODEC_ID_PCM_S8_PLANAR:
     case AV_CODEC_ID_PCM_S16BE_PLANAR:
         return 0;
-        break;
     case AV_CODEC_ID_ADPCM_ADX:
         return 2;
-        break;
     default:
         return -1;
     }
@@ -158,7 +155,6 @@
 
 static int film_init(AVFormatContext *format_context)
 {
-    AVStream *audio = NULL;
     FILMOutputContext *film = format_context->priv_data;
     film->audio_index = -1;
     film->video_index = -1;
@@ -174,8 +170,12 @@
                 av_log(format_context, AV_LOG_ERROR, "Sega FILM allows a maximum of one audio stream.\n");
                 return AVERROR(EINVAL);
             }
+            if (get_audio_codec_id(st->codecpar->codec_id) < 0) {
+                av_log(format_context, AV_LOG_ERROR,
+                       "Incompatible audio stream format.\n");
+                return AVERROR(EINVAL);
+            }
             film->audio_index = i;
-            audio = st;
         }
 
         if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
@@ -183,17 +183,23 @@
                 av_log(format_context, AV_LOG_ERROR, "Sega FILM allows a maximum of one video stream.\n");
                 return AVERROR(EINVAL);
             }
+            if (st->codecpar->codec_id != AV_CODEC_ID_CINEPAK &&
+                st->codecpar->codec_id != AV_CODEC_ID_RAWVIDEO) {
+                av_log(format_context, AV_LOG_ERROR,
+                       "Incompatible video stream format.\n");
+                return AVERROR(EINVAL);
+            }
+            if (st->codecpar->format != AV_PIX_FMT_RGB24) {
+                av_log(format_context, AV_LOG_ERROR,
+                       "Pixel format must be rgb24.\n");
+                return AVERROR(EINVAL);
+            }
             film->video_index = i;
         }
-
-        if (film->video_index == -1) {
-            av_log(format_context, AV_LOG_ERROR, "No video stream present.\n");
-            return AVERROR(EINVAL);
-        }
     }
 
-    if (audio != NULL && get_audio_codec_id(audio->codecpar->codec_id) < 0) {
-        av_log(format_context, AV_LOG_ERROR, "Incompatible audio stream format.\n");
+    if (film->video_index == -1) {
+        av_log(format_context, AV_LOG_ERROR, "No video stream present.\n");
         return AVERROR(EINVAL);
     }
 
@@ -203,7 +209,7 @@
 static int shift_data(AVFormatContext *format_context, int64_t shift_size)
 {
     int ret = 0;
-    int64_t pos, pos_end = avio_tell(format_context->pb);
+    int64_t pos, pos_end;
     uint8_t *buf, *read_buf[2];
     int read_buf_id = 0;
     int read_size[2];
@@ -261,11 +267,9 @@
 {
     int ret = 0;
     int64_t sample_table_size, stabsize, headersize;
-    int8_t audio_codec;
     AVIOContext *pb = format_context->pb;
     FILMOutputContext *film = format_context->priv_data;
     FILMPacket *prev, *packet;
-    AVStream *audio = NULL;
     AVStream *video = NULL;
 
     /* Calculate how much we need to reserve for the header;
@@ -282,24 +286,6 @@
     /* Seek back to the beginning to start writing the header now */
     avio_seek(pb, 0, SEEK_SET);
 
-    if (film->audio_index > -1)
-        audio = format_context->streams[film->audio_index];
-    if (film->video_index > -1)
-        video = format_context->streams[film->video_index];
-
-    if (audio != NULL) {
-        audio_codec = get_audio_codec_id(audio->codecpar->codec_id);
-        if (audio_codec < 0) {
-            av_log(format_context, AV_LOG_ERROR, "Incompatible audio stream format.\n");
-            return AVERROR(EINVAL);
-        }
-    }
-
-    if (video->codecpar->format != AV_PIX_FMT_RGB24) {
-        av_log(format_context, AV_LOG_ERROR, "Pixel format must be rgb24.\n");
-        return AVERROR(EINVAL);
-    }
-
     /* First, write the FILM header; this is very simple */
 
     ffio_wfourcc(pb, "FILM");
@@ -314,6 +300,8 @@
     ffio_wfourcc(pb, "FDSC");
     avio_wb32(pb, 0x20); /* Size of FDSC chunk */
 
+    video = format_context->streams[film->video_index];
+
     /* The only two supported codecs; raw video is rare */
     switch (video->codecpar->codec_id) {
     case AV_CODEC_ID_CINEPAK:
@@ -322,16 +310,16 @@
     case AV_CODEC_ID_RAWVIDEO:
         ffio_wfourcc(pb, "raw ");
         break;
-    default:
-        av_log(format_context, AV_LOG_ERROR, "Incompatible video stream format.\n");
-        return AVERROR(EINVAL);
     }
 
     avio_wb32(pb, video->codecpar->height);
     avio_wb32(pb, video->codecpar->width);
     avio_w8(pb, 24); /* Bits per pixel - observed to always be 24 */
 
-    if (audio != NULL) {
+    if (film->audio_index > -1) {
+        AVStream *audio = format_context->streams[film->audio_index];
+        int audio_codec = get_audio_codec_id(audio->codecpar->codec_id);
+
         avio_w8(pb, audio->codecpar->channels); /* Audio channels */
         avio_w8(pb, audio->codecpar->bits_per_coded_sample); /* Audio bit depth */
         avio_w8(pb, audio_codec); /* Compression - 0 is PCM, 2 is ADX */
@@ -364,8 +352,6 @@
 
     avio_wb32(pb, film->packet_count);
 
-    avio_flush(pb);
-
     /* Finally, write out each packet's data to the header */
     packet = film->start;
     while (packet != NULL) {
@@ -374,15 +360,22 @@
         packet = packet->next;
         av_freep(&prev);
     }
+    film->start = film->last = NULL;
 
     return 0;
 }
 
-static const AVClass film_muxer_class = {
-    .class_name     = "Sega FILM muxer",
-    .item_name      = av_default_item_name,
-    .version        = LIBAVUTIL_VERSION_INT,
-};
+static void film_deinit(AVFormatContext *format_context)
+{
+    FILMOutputContext *film = format_context->priv_data;
+    FILMPacket *packet = film->start;
+    while (packet != NULL) {
+        FILMPacket *next = packet->next;
+        av_free(packet);
+        packet = next;
+    }
+    film->start = film->last = NULL;
+}
 
 AVOutputFormat ff_segafilm_muxer = {
     .name           = "film_cpk",
@@ -394,5 +387,5 @@
     .init           = film_init,
     .write_trailer  = film_write_header,
     .write_packet   = film_write_packet,
-    .priv_class     = &film_muxer_class,
+    .deinit         = film_deinit,
 };
diff --git a/libavformat/segment.c b/libavformat/segment.c
index e2ac2c3..60b72b7 100644
--- a/libavformat/segment.c
+++ b/libavformat/segment.c
@@ -72,10 +72,9 @@
     int segment_idx_wrap;  ///< number after which the index wraps
     int segment_idx_wrap_nb;  ///< number of time the index has wraped
     int segment_count;     ///< number of segment files already written
-    AVOutputFormat *oformat;
+    ff_const59 AVOutputFormat *oformat;
     AVFormatContext *avf;
     char *format;              ///< format to use for output segment files
-    char *format_options_str;  ///< format options to use for output segment files
     AVDictionary *format_options;
     char *list;            ///< filename for the segment list file
     int   list_flags;      ///< flags affecting list generation
@@ -180,6 +179,13 @@
         }
         st->sample_aspect_ratio = s->streams[i]->sample_aspect_ratio;
         st->time_base = s->streams[i]->time_base;
+        st->avg_frame_rate = s->streams[i]->avg_frame_rate;
+#if FF_API_LAVF_AVCTX
+FF_DISABLE_DEPRECATION_WARNINGS
+        if (s->streams[i]->codecpar->codec_tag == MKTAG('t','m','c','d'))
+            st->codec->time_base = s->streams[i]->codec->time_base;
+FF_ENABLE_DEPRECATION_WARNINGS
+#endif
         av_dict_copy(&st->metadata, s->streams[i]->metadata, 0);
     }
 
@@ -421,7 +427,7 @@
                     rate = s->streams[i]->avg_frame_rate;/* Get fps from the video stream */
                     err = av_timecode_init_from_string(&tc, rate, tcr->value, s);
                     if (err < 0) {
-                        av_log(s, AV_LOG_WARNING, "Could not increment timecode, error occurred during timecode creation.");
+                        av_log(s, AV_LOG_WARNING, "Could not increment global timecode, error occurred during timecode creation.\n");
                         break;
                     }
                     tc.start += (int)((seg->cur_entry.end_time - seg->cur_entry.start_time) * av_q2d(rate));/* increment timecode */
@@ -431,7 +437,23 @@
                 }
             }
         } else {
-            av_log(s, AV_LOG_WARNING, "Could not increment timecode, no timecode metadata found");
+            av_log(s, AV_LOG_WARNING, "Could not increment global timecode, no global timecode metadata found.\n");
+        }
+        for (i = 0; i < s->nb_streams; i++) {
+            if (s->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
+                char st_buf[AV_TIMECODE_STR_SIZE];
+                AVTimecode st_tc;
+                AVRational st_rate = s->streams[i]->avg_frame_rate;
+                AVDictionaryEntry *st_tcr = av_dict_get(s->streams[i]->metadata, "timecode", NULL, 0);
+                if (st_tcr) {
+                    if ((av_timecode_init_from_string(&st_tc, st_rate, st_tcr->value, s) < 0)) {
+                        av_log(s, AV_LOG_WARNING, "Could not increment stream %d timecode, error occurred during timecode creation.\n", i);
+                        continue;
+                    }
+                st_tc.start += (int)((seg->cur_entry.end_time - seg->cur_entry.start_time) * av_q2d(st_rate));    // increment timecode
+                av_dict_set(&s->streams[i]->metadata, "timecode", av_timecode_make_string(&st_tc, st_buf, 0), 0);
+                }
+            }
         }
     }
 
@@ -697,15 +719,6 @@
         }
     }
 
-    if (seg->format_options_str) {
-        ret = av_dict_parse_string(&seg->format_options, seg->format_options_str, "=", ":", 0);
-        if (ret < 0) {
-            av_log(s, AV_LOG_ERROR, "Could not parse format options list '%s'\n",
-                   seg->format_options_str);
-            return ret;
-        }
-    }
-
     if (seg->list) {
         if (seg->list_type == LIST_TYPE_UNDEFINED) {
             if      (av_match_ext(seg->list, "csv" )) seg->list_type = LIST_TYPE_CSV;
@@ -768,7 +781,7 @@
     ret = avformat_init_output(oc, &options);
     if (av_dict_count(options)) {
         av_log(s, AV_LOG_ERROR,
-               "Some of the provided format options in '%s' are not recognized\n", seg->format_options_str);
+               "Some of the provided format options are not recognized\n");
         av_dict_free(&options);
         return AVERROR(EINVAL);
     }
@@ -859,6 +872,19 @@
     if (!seg->avf || !seg->avf->pb)
         return AVERROR(EINVAL);
 
+    if (!st->codecpar->extradata_size) {
+        int pkt_extradata_size = 0;
+        uint8_t *pkt_extradata = av_packet_get_side_data(pkt, AV_PKT_DATA_NEW_EXTRADATA, &pkt_extradata_size);
+        if (pkt_extradata && pkt_extradata_size > 0) {
+            ret = ff_alloc_extradata(st->codecpar, pkt_extradata_size);
+            if (ret < 0) {
+                av_log(s, AV_LOG_WARNING, "Unable to add extradata to stream. Output segments may be invalid.\n");
+                goto calc_times;
+            }
+            memcpy(st->codecpar->extradata, pkt_extradata, pkt_extradata_size);
+        }
+    }
+
 calc_times:
     if (seg->times) {
         end_pts = seg->segment_count < seg->nb_times ?
@@ -945,7 +971,8 @@
            av_ts2str(pkt->pts), av_ts2timestr(pkt->pts, &st->time_base),
            av_ts2str(pkt->dts), av_ts2timestr(pkt->dts, &st->time_base));
 
-    ret = ff_write_chained(seg->avf, pkt->stream_index, pkt, s, seg->initial_offset || seg->reset_timestamps);
+    ret = ff_write_chained(seg->avf, pkt->stream_index, pkt, s,
+                           seg->initial_offset || seg->reset_timestamps || seg->avf->oformat->interleave_packet);
 
 fail:
     if (pkt->stream_index == seg->reference_stream_index) {
@@ -980,7 +1007,6 @@
     if (seg->list)
         ff_format_io_close(s, &seg->list_pb);
 
-    av_dict_free(&seg->format_options);
     av_opt_free(seg);
     av_freep(&seg->times);
     av_freep(&seg->frames);
@@ -1021,9 +1047,9 @@
 #define OFFSET(x) offsetof(SegmentContext, x)
 #define E AV_OPT_FLAG_ENCODING_PARAM
 static const AVOption options[] = {
-    { "reference_stream",  "set reference stream", OFFSET(reference_stream_specifier), AV_OPT_TYPE_STRING, {.str = "auto"}, CHAR_MIN, CHAR_MAX, E },
+    { "reference_stream",  "set reference stream", OFFSET(reference_stream_specifier), AV_OPT_TYPE_STRING, {.str = "auto"}, 0, 0, E },
     { "segment_format",    "set container format used for the segments", OFFSET(format),  AV_OPT_TYPE_STRING, {.str = NULL},  0, 0,       E },
-    { "segment_format_options", "set list of options for the container format used for the segments", OFFSET(format_options_str), AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, E },
+    { "segment_format_options", "set list of options for the container format used for the segments", OFFSET(format_options), AV_OPT_TYPE_DICT, {.str = NULL}, 0, 0, E },
     { "segment_list",      "set the segment list filename",              OFFSET(list),    AV_OPT_TYPE_STRING, {.str = NULL},  0, 0,       E },
     { "segment_header_filename", "write a single file containing the header", OFFSET(header_filename), AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, E },
 
diff --git a/libavformat/serdec.c b/libavformat/serdec.c
index 25e6f63..5745ae1 100644
--- a/libavformat/serdec.c
+++ b/libavformat/serdec.c
@@ -35,7 +35,7 @@
     int64_t end;
 } SERDemuxerContext;
 
-static int ser_probe(AVProbeData *pd)
+static int ser_probe(const AVProbeData *pd)
 {
     if (memcmp(pd->buf, SER_MAGIC, 14) == 0)
         return AVPROBE_SCORE_MAX;
diff --git a/libavformat/shortendec.c b/libavformat/shortendec.c
index 42fcdf7..f7390b2 100644
--- a/libavformat/shortendec.c
+++ b/libavformat/shortendec.c
@@ -25,7 +25,7 @@
 #include "rawdec.h"
 #include "libavcodec/golomb.h"
 
-static int shn_probe(AVProbeData *p)
+static int shn_probe(const AVProbeData *p)
 {
     GetBitContext gb;
     int version, internal_ftype, channels, blocksize;
@@ -40,12 +40,18 @@
         channels = get_ur_golomb_shorten(&gb, 0);
         blocksize = 256;
     } else {
-        int k;
+        unsigned k;
         k = get_ur_golomb_shorten(&gb, 2);
+        if (k > 31)
+            return 0;
         internal_ftype = get_ur_golomb_shorten(&gb, k);
         k = get_ur_golomb_shorten(&gb, 2);
+        if (k > 31)
+            return 0;
         channels = get_ur_golomb_shorten(&gb, k);
         k = get_ur_golomb_shorten(&gb, 2);
+        if (k > 31)
+            return 0;
         blocksize = get_ur_golomb_shorten(&gb, k);
     }
 
@@ -59,6 +65,7 @@
     return AVPROBE_SCORE_EXTENSION + 1;
 }
 
+FF_RAW_DEMUXER_CLASS(shorten)
 AVInputFormat ff_shorten_demuxer = {
     .name           = "shn",
     .long_name      = NULL_IF_CONFIG_SMALL("raw Shorten"),
@@ -68,4 +75,6 @@
     .flags          = AVFMT_NOBINSEARCH | AVFMT_NOGENSEARCH | AVFMT_NO_BYTE_SEEK | AVFMT_NOTIMESTAMPS,
     .extensions     = "shn",
     .raw_codec_id   = AV_CODEC_ID_SHORTEN,
+    .priv_data_size = sizeof(FFRawDemuxerContext),
+    .priv_class     = &shorten_demuxer_class,
 };
diff --git a/libavformat/sierravmd.c b/libavformat/sierravmd.c
index 6960c28..531fc41 100644
--- a/libavformat/sierravmd.c
+++ b/libavformat/sierravmd.c
@@ -62,7 +62,7 @@
     unsigned char vmd_header[VMD_HEADER_SIZE];
 } VmdDemuxContext;
 
-static int vmd_probe(AVProbeData *p)
+static int vmd_probe(const AVProbeData *p)
 {
     int w, h, sample_rate;
     if (p->buf_size < 806)
@@ -127,8 +127,8 @@
             vst->codecpar->width >>= 1;
             vst->codecpar->height >>= 1;
         }
-        if (ff_alloc_extradata(vst->codecpar, VMD_HEADER_SIZE))
-            return AVERROR(ENOMEM);
+        if ((ret = ff_alloc_extradata(vst->codecpar, VMD_HEADER_SIZE)) < 0)
+            return ret;
         memcpy(vst->codecpar->extradata, vmd->vmd_header, VMD_HEADER_SIZE);
     }
 
@@ -283,8 +283,9 @@
 
     if(ffio_limit(pb, frame->frame_size) != frame->frame_size)
         return AVERROR(EIO);
-    if (av_new_packet(pkt, frame->frame_size + BYTES_PER_FRAME_RECORD))
-        return AVERROR(ENOMEM);
+    ret = av_new_packet(pkt, frame->frame_size + BYTES_PER_FRAME_RECORD);
+    if (ret < 0)
+        return ret;
     pkt->pos= avio_tell(pb);
     memcpy(pkt->data, frame->frame_record, BYTES_PER_FRAME_RECORD);
     if(vmd->is_indeo3 && frame->frame_record[0] == 0x02)
@@ -294,7 +295,6 @@
             frame->frame_size);
 
     if (ret != frame->frame_size) {
-        av_packet_unref(pkt);
         ret = AVERROR(EIO);
     }
     pkt->stream_index = frame->stream_index;
diff --git a/libavformat/siff.c b/libavformat/siff.c
index ddd1715..f6815b2 100644
--- a/libavformat/siff.c
+++ b/libavformat/siff.c
@@ -62,7 +62,7 @@
     uint8_t gmc[4];
 } SIFFContext;
 
-static int siff_probe(AVProbeData *p)
+static int siff_probe(const AVProbeData *p)
 {
     uint32_t tag = AV_RL32(p->buf + 8);
     /* check file header */
@@ -192,6 +192,7 @@
 static int siff_read_packet(AVFormatContext *s, AVPacket *pkt)
 {
     SIFFContext *c = s->priv_data;
+    int ret;
 
     if (c->has_video) {
         unsigned int size;
@@ -213,13 +214,12 @@
 
             size = c->pktsize - c->sndsize - c->gmcsize - 2;
             size = ffio_limit(s->pb, size);
-            if (av_new_packet(pkt, size + c->gmcsize + 2) < 0)
-                return AVERROR(ENOMEM);
+            if ((ret = av_new_packet(pkt, size + c->gmcsize + 2)) < 0)
+                return ret;
             AV_WL16(pkt->data, c->flags);
             if (c->gmcsize)
                 memcpy(pkt->data + 2, c->gmc, c->gmcsize);
             if (avio_read(s->pb, pkt->data + 2 + c->gmcsize, size) != size) {
-                av_packet_unref(pkt);
                 return AVERROR_INVALIDDATA;
             }
             pkt->stream_index = 0;
diff --git a/libavformat/smacker.c b/libavformat/smacker.c
index 8a21cc0..8b1e185 100644
--- a/libavformat/smacker.c
+++ b/libavformat/smacker.c
@@ -25,10 +25,10 @@
 
 #include <inttypes.h>
 
-#include "libavutil/bswap.h"
 #include "libavutil/channel_layout.h"
 #include "libavutil/intreadwrite.h"
 #include "avformat.h"
+#include "avio_internal.h"
 #include "internal.h"
 
 #define SMACKER_PAL 0x01
@@ -43,25 +43,12 @@
 };
 
 typedef struct SmackerContext {
-    /* Smacker file header */
-    uint32_t magic;
-    uint32_t width, height;
     uint32_t frames;
-    int      pts_inc;
-    uint32_t flags;
-    uint32_t audio[7];
-    uint32_t treesize;
-    uint32_t mmap_size, mclr_size, full_size, type_size;
-    uint8_t  aflags[7];
-    uint32_t rates[7];
-    uint32_t pad;
     /* frame info */
     uint32_t *frm_size;
     uint8_t  *frm_flags;
     /* internal variables */
     int cur_frame;
-    int is_ver4;
-    int64_t cur_pts;
     /* current frame for demuxing */
     uint8_t pal[768];
     int indexes[7];
@@ -74,11 +61,6 @@
     int64_t aud_pts[7];
 } SmackerContext;
 
-typedef struct SmackerFrame {
-    int64_t pts;
-    int stream;
-} SmackerFrame;
-
 /* palette used in Smacker */
 static const uint8_t smk_pal[64] = {
     0x00, 0x04, 0x08, 0x0C, 0x10, 0x14, 0x18, 0x1C,
@@ -92,7 +74,7 @@
 };
 
 
-static int smacker_probe(AVProbeData *p)
+static int smacker_probe(const AVProbeData *p)
 {
     if (   AV_RL32(p->buf) != MKTAG('S', 'M', 'K', '2')
         && AV_RL32(p->buf) != MKTAG('S', 'M', 'K', '4'))
@@ -108,51 +90,122 @@
 {
     AVIOContext *pb = s->pb;
     SmackerContext *smk = s->priv_data;
-    AVStream *st, *ast[7];
-    int i, ret;
+    AVStream *st;
+    AVCodecParameters *par;
+    uint32_t magic, width, height, flags, treesize;
+    int i, ret, pts_inc;
     int tbase;
 
     /* read and check header */
-    smk->magic = avio_rl32(pb);
-    if (smk->magic != MKTAG('S', 'M', 'K', '2') && smk->magic != MKTAG('S', 'M', 'K', '4'))
+    magic  = avio_rl32(pb);
+    if (magic != MKTAG('S', 'M', 'K', '2') && magic != MKTAG('S', 'M', 'K', '4'))
         return AVERROR_INVALIDDATA;
-    smk->width = avio_rl32(pb);
-    smk->height = avio_rl32(pb);
+    width  = avio_rl32(pb);
+    height = avio_rl32(pb);
     smk->frames = avio_rl32(pb);
-    smk->pts_inc = (int32_t)avio_rl32(pb);
-    if (smk->pts_inc > INT_MAX / 100) {
-        av_log(s, AV_LOG_ERROR, "pts_inc %d is too large\n", smk->pts_inc);
+    pts_inc = avio_rl32(pb);
+    if (pts_inc > INT_MAX / 100) {
+        av_log(s, AV_LOG_ERROR, "pts_inc %d is too large\n", pts_inc);
         return AVERROR_INVALIDDATA;
     }
 
-    smk->flags = avio_rl32(pb);
-    if(smk->flags & SMACKER_FLAG_RING_FRAME)
+    flags = avio_rl32(pb);
+    if (flags & SMACKER_FLAG_RING_FRAME)
         smk->frames++;
-    for(i = 0; i < 7; i++)
-        smk->audio[i] = avio_rl32(pb);
-    smk->treesize = avio_rl32(pb);
+    if (smk->frames > 0xFFFFFF) {
+        av_log(s, AV_LOG_ERROR, "Too many frames: %"PRIu32"\n", smk->frames);
+        return AVERROR_INVALIDDATA;
+    }
 
-    if(smk->treesize >= UINT_MAX/4){ // smk->treesize + 16 must not overflow (this check is probably redundant)
+    avio_skip(pb, 28); /* Unused audio related data */
+
+    treesize = avio_rl32(pb);
+    if (treesize >= UINT_MAX/4) {
+        // treesize + 16 must not overflow (this check is probably redundant)
         av_log(s, AV_LOG_ERROR, "treesize too large\n");
         return AVERROR_INVALIDDATA;
     }
 
-//FIXME remove extradata "rebuilding"
-    smk->mmap_size = avio_rl32(pb);
-    smk->mclr_size = avio_rl32(pb);
-    smk->full_size = avio_rl32(pb);
-    smk->type_size = avio_rl32(pb);
-    for(i = 0; i < 7; i++) {
-        smk->rates[i]  = avio_rl24(pb);
-        smk->aflags[i] = avio_r8(pb);
+    st = avformat_new_stream(s, NULL);
+    if (!st)
+        return AVERROR(ENOMEM);
+
+    smk->videoindex = st->index;
+    /* Smacker uses 100000 as internal timebase */
+    if (pts_inc < 0)
+        pts_inc = -pts_inc;
+    else
+        pts_inc *= 100;
+    tbase = 100000;
+    av_reduce(&tbase, &pts_inc, tbase, pts_inc, (1UL << 31) - 1);
+    avpriv_set_pts_info(st, 33, pts_inc, tbase);
+    st->duration = smk->frames;
+
+    /* init video codec */
+    par = st->codecpar;
+    par->width      = width;
+    par->height     = height;
+    par->format     = AV_PIX_FMT_PAL8;
+    par->codec_type = AVMEDIA_TYPE_VIDEO;
+    par->codec_id   = AV_CODEC_ID_SMACKVIDEO;
+    par->codec_tag  = magic;
+
+    if ((ret = ff_alloc_extradata(par, treesize + 16)) < 0) {
+        av_log(s, AV_LOG_ERROR,
+               "Cannot allocate %"PRIu32" bytes of extradata\n",
+               treesize + 16);
+        return ret;
     }
-    smk->pad = avio_rl32(pb);
+    if ((ret = ffio_read_size(pb, par->extradata, 16)) < 0)
+        return ret;
+
+    /* handle possible audio streams */
+    for (i = 0; i < 7; i++) {
+        uint32_t rate = avio_rl24(pb);
+        uint8_t aflag = avio_r8(pb);
+
+        smk->indexes[i] = -1;
+
+        if (rate) {
+            AVStream *ast = avformat_new_stream(s, NULL);
+            AVCodecParameters *par;
+            if (!ast)
+                return AVERROR(ENOMEM);
+
+            smk->indexes[i] = ast->index;
+            par = ast->codecpar;
+            par->codec_type = AVMEDIA_TYPE_AUDIO;
+            if (aflag & SMK_AUD_BINKAUD) {
+                par->codec_id  = AV_CODEC_ID_BINKAUDIO_RDFT;
+            } else if (aflag & SMK_AUD_USEDCT) {
+                par->codec_id  = AV_CODEC_ID_BINKAUDIO_DCT;
+            } else if (aflag & SMK_AUD_PACKED) {
+                par->codec_id  = AV_CODEC_ID_SMACKAUDIO;
+                par->codec_tag = MKTAG('S', 'M', 'K', 'A');
+            } else {
+                par->codec_id  = AV_CODEC_ID_PCM_U8;
+            }
+            if (aflag & SMK_AUD_STEREO) {
+                par->channels       = 2;
+                par->channel_layout = AV_CH_LAYOUT_STEREO;
+            } else {
+                par->channels       = 1;
+                par->channel_layout = AV_CH_LAYOUT_MONO;
+            }
+            par->sample_rate = rate;
+            par->bits_per_coded_sample = (aflag & SMK_AUD_16BITS) ? 16 : 8;
+            if (par->bits_per_coded_sample == 16 &&
+                par->codec_id == AV_CODEC_ID_PCM_U8)
+                par->codec_id = AV_CODEC_ID_PCM_S16LE;
+            avpriv_set_pts_info(ast, 64, 1, par->sample_rate * par->channels
+                                            * par->bits_per_coded_sample / 8);
+        }
+    }
+
+    avio_rl32(pb); /* padding */
+
     /* setup data */
-    if(smk->frames > 0xFFFFFF) {
-        av_log(s, AV_LOG_ERROR, "Too many frames: %"PRIu32"\n", smk->frames);
-        return AVERROR_INVALIDDATA;
-    }
-    smk->frm_size = av_malloc_array(smk->frames, sizeof(*smk->frm_size));
+    smk->frm_size  = av_malloc_array(smk->frames, sizeof(*smk->frm_size));
     smk->frm_flags = av_malloc(smk->frames);
     if (!smk->frm_size || !smk->frm_flags) {
         av_freep(&smk->frm_size);
@@ -160,91 +213,21 @@
         return AVERROR(ENOMEM);
     }
 
-    smk->is_ver4 = (smk->magic != MKTAG('S', 'M', 'K', '2'));
-
     /* read frame info */
-    for(i = 0; i < smk->frames; i++) {
+    for (i = 0; i < smk->frames; i++) {
         smk->frm_size[i] = avio_rl32(pb);
     }
-    for(i = 0; i < smk->frames; i++) {
+    for (i = 0; i < smk->frames; i++) {
         smk->frm_flags[i] = avio_r8(pb);
     }
 
-    /* init video codec */
-    st = avformat_new_stream(s, NULL);
-    if (!st)
-        return AVERROR(ENOMEM);
-    smk->videoindex = st->index;
-    st->codecpar->width = smk->width;
-    st->codecpar->height = smk->height;
-    st->codecpar->format = AV_PIX_FMT_PAL8;
-    st->codecpar->codec_type = AVMEDIA_TYPE_VIDEO;
-    st->codecpar->codec_id = AV_CODEC_ID_SMACKVIDEO;
-    st->codecpar->codec_tag = smk->magic;
-    /* Smacker uses 100000 as internal timebase */
-    if(smk->pts_inc < 0)
-        smk->pts_inc = -smk->pts_inc;
-    else
-        smk->pts_inc *= 100;
-    tbase = 100000;
-    av_reduce(&tbase, &smk->pts_inc, tbase, smk->pts_inc, (1UL<<31)-1);
-    avpriv_set_pts_info(st, 33, smk->pts_inc, tbase);
-    st->duration = smk->frames;
-    /* handle possible audio streams */
-    for(i = 0; i < 7; i++) {
-        smk->indexes[i] = -1;
-        if (smk->rates[i]) {
-            ast[i] = avformat_new_stream(s, NULL);
-            if (!ast[i])
-                return AVERROR(ENOMEM);
-            smk->indexes[i] = ast[i]->index;
-            ast[i]->codecpar->codec_type = AVMEDIA_TYPE_AUDIO;
-            if (smk->aflags[i] & SMK_AUD_BINKAUD) {
-                ast[i]->codecpar->codec_id = AV_CODEC_ID_BINKAUDIO_RDFT;
-            } else if (smk->aflags[i] & SMK_AUD_USEDCT) {
-                ast[i]->codecpar->codec_id = AV_CODEC_ID_BINKAUDIO_DCT;
-            } else if (smk->aflags[i] & SMK_AUD_PACKED){
-                ast[i]->codecpar->codec_id = AV_CODEC_ID_SMACKAUDIO;
-                ast[i]->codecpar->codec_tag = MKTAG('S', 'M', 'K', 'A');
-            } else {
-                ast[i]->codecpar->codec_id = AV_CODEC_ID_PCM_U8;
-            }
-            if (smk->aflags[i] & SMK_AUD_STEREO) {
-                ast[i]->codecpar->channels       = 2;
-                ast[i]->codecpar->channel_layout = AV_CH_LAYOUT_STEREO;
-            } else {
-                ast[i]->codecpar->channels       = 1;
-                ast[i]->codecpar->channel_layout = AV_CH_LAYOUT_MONO;
-            }
-            ast[i]->codecpar->sample_rate = smk->rates[i];
-            ast[i]->codecpar->bits_per_coded_sample = (smk->aflags[i] & SMK_AUD_16BITS) ? 16 : 8;
-            if(ast[i]->codecpar->bits_per_coded_sample == 16 && ast[i]->codecpar->codec_id == AV_CODEC_ID_PCM_U8)
-                ast[i]->codecpar->codec_id = AV_CODEC_ID_PCM_S16LE;
-            avpriv_set_pts_info(ast[i], 64, 1, ast[i]->codecpar->sample_rate
-                    * ast[i]->codecpar->channels * ast[i]->codecpar->bits_per_coded_sample / 8);
-        }
-    }
-
-
     /* load trees to extradata, they will be unpacked by decoder */
-    if(ff_alloc_extradata(st->codecpar, smk->treesize + 16)){
-        av_log(s, AV_LOG_ERROR,
-               "Cannot allocate %"PRIu32" bytes of extradata\n",
-               smk->treesize + 16);
-        av_freep(&smk->frm_size);
-        av_freep(&smk->frm_flags);
-        return AVERROR(ENOMEM);
-    }
-    ret = avio_read(pb, st->codecpar->extradata + 16, st->codecpar->extradata_size - 16);
-    if(ret != st->codecpar->extradata_size - 16){
+    ret = avio_read(pb, par->extradata + 16, par->extradata_size - 16);
+    if (ret != par->extradata_size - 16) {
         av_freep(&smk->frm_size);
         av_freep(&smk->frm_flags);
         return AVERROR(EIO);
     }
-    ((int32_t*)st->codecpar->extradata)[0] = av_le2ne32(smk->mmap_size);
-    ((int32_t*)st->codecpar->extradata)[1] = av_le2ne32(smk->mclr_size);
-    ((int32_t*)st->codecpar->extradata)[2] = av_le2ne32(smk->full_size);
-    ((int32_t*)st->codecpar->extradata)[3] = av_le2ne32(smk->type_size);
 
     smk->curstream = -1;
     smk->nextpos = avio_tell(pb);
@@ -347,8 +330,8 @@
         }
         if (frame_size < 0 || frame_size >= INT_MAX/2)
             return AVERROR_INVALIDDATA;
-        if (av_new_packet(pkt, frame_size + 769))
-            return AVERROR(ENOMEM);
+        if ((ret = av_new_packet(pkt, frame_size + 769)) < 0)
+            return ret;
         if(smk->frm_size[smk->cur_frame] & 1)
             palchange |= 2;
         pkt->data[0] = palchange;
@@ -364,8 +347,8 @@
     } else {
         if (smk->stream_id[smk->curstream] < 0 || !smk->bufs[smk->curstream])
             return AVERROR_INVALIDDATA;
-        if (av_new_packet(pkt, smk->buf_sizes[smk->curstream]))
-            return AVERROR(ENOMEM);
+        if ((ret = av_new_packet(pkt, smk->buf_sizes[smk->curstream])) < 0)
+            return ret;
         memcpy(pkt->data, smk->bufs[smk->curstream], smk->buf_sizes[smk->curstream]);
         pkt->size = smk->buf_sizes[smk->curstream];
         pkt->stream_index = smk->stream_id[smk->curstream];
diff --git a/libavformat/smjpegdec.c b/libavformat/smjpegdec.c
index c184c0d..5bc0492 100644
--- a/libavformat/smjpegdec.c
+++ b/libavformat/smjpegdec.c
@@ -36,7 +36,7 @@
     int video_stream_index;
 } SMJPEGContext;
 
-static int smjpeg_probe(AVProbeData *p)
+static int smjpeg_probe(const AVProbeData *p)
 {
     if (!memcmp(p->buf, SMJPEG_MAGIC, 8))
         return AVPROBE_SCORE_MAX;
diff --git a/libavformat/smjpegenc.c b/libavformat/smjpegenc.c
index 68a1286..c3c1a63 100644
--- a/libavformat/smjpegenc.c
+++ b/libavformat/smjpegenc.c
@@ -88,7 +88,6 @@
     }
 
     avio_wl32(pb, SMJPEG_HEND);
-    avio_flush(pb);
 
     return 0;
 }
diff --git a/libavformat/smoothstreamingenc.c b/libavformat/smoothstreamingenc.c
index 094712a..0e4f531 100644
--- a/libavformat/smoothstreamingenc.c
+++ b/libavformat/smoothstreamingenc.c
@@ -183,8 +183,7 @@
             av_write_trailer(os->ctx);
         if (os->ctx && os->ctx->pb)
             avio_context_free(&os->ctx->pb);
-        if (os->ctx)
-            avformat_free_context(os->ctx);
+        avformat_free_context(os->ctx);
         av_freep(&os->private_str);
         for (j = 0; j < os->nb_fragments; j++)
             av_freep(&os->fragments[j]);
@@ -293,7 +292,7 @@
 {
     SmoothStreamingContext *c = s->priv_data;
     int ret = 0, i;
-    AVOutputFormat *oformat;
+    ff_const59 AVOutputFormat *oformat;
 
     if (mkdir(s->url, 0777) == -1 && errno != EEXIST) {
         ret = AVERROR(errno);
@@ -320,23 +319,24 @@
         AVDictionary *opts = NULL;
 
         if (!s->streams[i]->codecpar->bit_rate) {
-            av_log(s, AV_LOG_ERROR, "No bit rate set for stream %d\n", i);
-            ret = AVERROR(EINVAL);
-            goto fail;
+            av_log(s, AV_LOG_WARNING, "No bit rate set for stream %d\n", i);
+            // create a tmp name for the directory of fragments
+            snprintf(os->dirname, sizeof(os->dirname), "%s/QualityLevels(Tmp_%d)", s->url, i);
+        } else {
+            snprintf(os->dirname, sizeof(os->dirname), "%s/QualityLevels(%"PRId64")", s->url, s->streams[i]->codecpar->bit_rate);
         }
-        snprintf(os->dirname, sizeof(os->dirname), "%s/QualityLevels(%"PRId64")", s->url, s->streams[i]->codecpar->bit_rate);
+
         if (mkdir(os->dirname, 0777) == -1 && errno != EEXIST) {
             ret = AVERROR(errno);
             av_log(s, AV_LOG_ERROR, "mkdir failed\n");
             goto fail;
         }
 
-        ctx = avformat_alloc_context();
+        os->ctx = ctx = avformat_alloc_context();
         if (!ctx || ff_copy_whiteblacklists(ctx, s) < 0) {
             ret = AVERROR(ENOMEM);
             goto fail;
         }
-        os->ctx = ctx;
         ctx->oformat = oformat;
         ctx->interrupt_callback = s->interrupt_callback;
 
@@ -356,12 +356,13 @@
 
         av_dict_set_int(&opts, "ism_lookahead", c->lookahead_count, 0);
         av_dict_set(&opts, "movflags", "frag_custom", 0);
-        if ((ret = avformat_write_header(ctx, &opts)) < 0) {
+        ret = avformat_write_header(ctx, &opts);
+        av_dict_free(&opts);
+        if (ret < 0) {
              goto fail;
         }
         os->ctx_inited = 1;
         avio_flush(ctx->pb);
-        av_dict_free(&opts);
         s->streams[i]->time_base = st->time_base;
         if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
             c->has_video = 1;
@@ -519,7 +520,7 @@
 
     for (i = 0; i < s->nb_streams; i++) {
         OutputStream *os = &c->streams[i];
-        char filename[1024], target_filename[1024], header_filename[1024];
+        char filename[1024], target_filename[1024], header_filename[1024], curr_dirname[1024];
         int64_t size;
         int64_t start_ts, duration, moof_size;
         if (!os->packets_written)
@@ -541,6 +542,26 @@
         size = os->tail_pos - os->cur_start_pos;
         if ((ret = parse_fragment(s, filename, &start_ts, &duration, &moof_size, size)) < 0)
             break;
+
+        if (!s->streams[i]->codecpar->bit_rate) {
+            int64_t bitrate = (int64_t) size * 8 * AV_TIME_BASE / av_rescale_q(duration, s->streams[i]->time_base, AV_TIME_BASE_Q);
+            if (!bitrate) {
+                av_log(s, AV_LOG_ERROR, "calculating bitrate got zero.\n");
+                ret = AVERROR(EINVAL);
+                return ret;
+            }
+
+            av_log(s, AV_LOG_DEBUG, "calculated bitrate: %"PRId64"\n", bitrate);
+            s->streams[i]->codecpar->bit_rate = bitrate;
+            memcpy(curr_dirname, os->dirname, sizeof(os->dirname));
+            snprintf(os->dirname, sizeof(os->dirname), "%s/QualityLevels(%"PRId64")", s->url, s->streams[i]->codecpar->bit_rate);
+            snprintf(filename, sizeof(filename), "%s/temp", os->dirname);
+
+            // rename the tmp folder back to the correct name since we now have the bitrate
+            if ((ret = ff_rename((const char*)curr_dirname,  os->dirname, s)) < 0)
+                return ret;
+        }
+
         snprintf(header_filename, sizeof(header_filename), "%s/FragmentInfo(%s=%"PRIu64")", os->dirname, os->stream_type_tag, start_ts);
         snprintf(target_filename, sizeof(target_filename), "%s/Fragments(%s=%"PRIu64")", os->dirname, os->stream_type_tag, start_ts);
         copy_moof(s, filename, header_filename, moof_size);
diff --git a/libavformat/smush.c b/libavformat/smush.c
index fe544d8..962eb57 100644
--- a/libavformat/smush.c
+++ b/libavformat/smush.c
@@ -31,7 +31,7 @@
     int video_stream_index;
 } SMUSHContext;
 
-static int smush_read_probe(AVProbeData *p)
+static int smush_read_probe(const AVProbeData *p)
 {
     if (((AV_RL32(p->buf)     == MKTAG('S', 'A', 'N', 'M') &&
           AV_RL32(p->buf + 8) == MKTAG('S', 'H', 'D', 'R')) ||
@@ -51,6 +51,7 @@
     uint32_t magic, nframes, size, subversion, i;
     uint32_t width = 0, height = 0, got_audio = 0, read = 0;
     uint32_t sample_rate, channels, palette[256];
+    int ret;
 
     magic = avio_rb32(pb);
     avio_skip(pb, 4); // skip movie size
@@ -157,8 +158,8 @@
     vst->codecpar->height     = height;
 
     if (!smush->version) {
-        if (ff_alloc_extradata(vst->codecpar, 1024 + 2))
-            return AVERROR(ENOMEM);
+        if ((ret = ff_alloc_extradata(vst->codecpar, 1024 + 2)) < 0)
+            return ret;
 
         AV_WL16(vst->codecpar->extradata, subversion);
         for (i = 0; i < 256; i++)
diff --git a/libavformat/sol.c b/libavformat/sol.c
index 5796f8d2..19905e8 100644
--- a/libavformat/sol.c
+++ b/libavformat/sol.c
@@ -32,7 +32,7 @@
 /* if we don't know the size in advance */
 #define AU_UNKNOWN_SIZE ((uint32_t)(~0))
 
-static int sol_probe(AVProbeData *p)
+static int sol_probe(const AVProbeData *p)
 {
     /* check file header */
     uint16_t magic = AV_RL32(p->buf);
diff --git a/libavformat/soxdec.c b/libavformat/soxdec.c
index 12a94c8..d3f709f 100644
--- a/libavformat/soxdec.c
+++ b/libavformat/soxdec.c
@@ -37,7 +37,7 @@
 #include "pcm.h"
 #include "sox.h"
 
-static int sox_probe(AVProbeData *p)
+static int sox_probe(const AVProbeData *p)
 {
     if (AV_RL32(p->buf) == SOX_TAG || AV_RB32(p->buf) == SOX_TAG)
         return AVPROBE_SCORE_MAX;
diff --git a/libavformat/soxenc.c b/libavformat/soxenc.c
index 7b37bd4..ce276f8 100644
--- a/libavformat/soxenc.c
+++ b/libavformat/soxenc.c
@@ -80,8 +80,6 @@
 
     ffio_fill(pb, 0, comment_size - comment_len);
 
-    avio_flush(pb);
-
     return 0;
 }
 
@@ -101,8 +99,6 @@
         } else
             avio_wb64(pb, num_samples);
         avio_seek(pb, file_size, SEEK_SET);
-
-        avio_flush(pb);
     }
 
     return 0;
diff --git a/libavformat/spdifdec.c b/libavformat/spdifdec.c
index 21bfce4..1808fa9 100644
--- a/libavformat/spdifdec.c
+++ b/libavformat/spdifdec.c
@@ -107,7 +107,7 @@
    samples = 4096 */
 #define SPDIF_MAX_OFFSET 16384
 
-static int spdif_probe(AVProbeData *p)
+static int spdif_probe(const AVProbeData *p)
 {
     enum AVCodecID codec;
     return ff_spdif_probe (p->buf, p->buf_size, &codec);
@@ -197,15 +197,13 @@
     pkt->pos = avio_tell(pb) - BURST_HEADER_SIZE;
 
     if (avio_read(pb, pkt->data, pkt->size) < pkt->size) {
-        av_packet_unref(pkt);
         return AVERROR_EOF;
     }
     ff_spdif_bswap_buf16((uint16_t *)pkt->data, (uint16_t *)pkt->data, pkt->size >> 1);
 
     ret = spdif_get_offset_and_codec(s, data_type, pkt->data,
                                      &offset, &codec_id);
-    if (ret) {
-        av_packet_unref(pkt);
+    if (ret < 0) {
         return ret;
     }
 
@@ -216,7 +214,6 @@
         /* first packet, create a stream */
         AVStream *st = avformat_new_stream(s, NULL);
         if (!st) {
-            av_packet_unref(pkt);
             return AVERROR(ENOMEM);
         }
         st->codecpar->codec_type = AVMEDIA_TYPE_AUDIO;
diff --git a/libavformat/spdifenc.c b/libavformat/spdifenc.c
index 9514ff8..0288872 100644
--- a/libavformat/spdifenc.c
+++ b/libavformat/spdifenc.c
@@ -1,7 +1,7 @@
 /*
  * IEC 61937 muxer
  * Copyright (c) 2009 Bartlomiej Wolowiec
- * Copyright (c) 2010 Anssi Hannula
+ * Copyright (c) 2010, 2020 Anssi Hannula
  * Copyright (c) 2010 Carl Eugen Hoyos
  *
  * This file is part of FFmpeg.
@@ -69,13 +69,18 @@
     int use_preamble;               ///< preamble enabled (disabled for exactly pre-padded DTS)
     int extra_bswap;                ///< extra bswap for payload (for LE DTS => standard BE DTS)
 
-    uint8_t *hd_buf;                ///< allocated buffer to concatenate hd audio frames
-    int hd_buf_size;                ///< size of the hd audio buffer
-    int hd_buf_count;               ///< number of frames in the hd audio buffer
-    int hd_buf_filled;              ///< amount of bytes in the hd audio buffer
+    uint8_t *hd_buf[2];             ///< allocated buffers to concatenate hd audio frames
+    int hd_buf_size;                ///< size of the hd audio buffer (eac3, dts4)
+    int hd_buf_count;               ///< number of frames in the hd audio buffer (eac3)
+    int hd_buf_filled;              ///< amount of bytes in the hd audio buffer (eac3, truehd)
+    int hd_buf_idx;                 ///< active hd buffer index (truehd)
 
     int dtshd_skip;                 ///< counter used for skipping DTS-HD frames
 
+    uint16_t truehd_prev_time;      ///< input_timing from the last frame
+    int truehd_prev_size;           ///< previous frame size in bytes, including any MAT codes
+    int truehd_samples_per_frame;   ///< samples per frame for padding calculation
+
     /* AVOptions: */
     int dtshd_rate;
     int dtshd_fallback;
@@ -122,11 +127,11 @@
     if (bsid > 10 && (pkt->data[4] & 0xc0) != 0xc0) /* fscod */
         repeat = eac3_repeat[(pkt->data[4] & 0x30) >> 4]; /* numblkscod */
 
-    ctx->hd_buf = av_fast_realloc(ctx->hd_buf, &ctx->hd_buf_size, ctx->hd_buf_filled + pkt->size);
-    if (!ctx->hd_buf)
+    ctx->hd_buf[0] = av_fast_realloc(ctx->hd_buf[0], &ctx->hd_buf_size, ctx->hd_buf_filled + pkt->size);
+    if (!ctx->hd_buf[0])
         return AVERROR(ENOMEM);
 
-    memcpy(&ctx->hd_buf[ctx->hd_buf_filled], pkt->data, pkt->size);
+    memcpy(&ctx->hd_buf[0][ctx->hd_buf_filled], pkt->data, pkt->size);
 
     ctx->hd_buf_filled += pkt->size;
     if (++ctx->hd_buf_count < repeat){
@@ -135,7 +140,7 @@
     }
     ctx->data_type   = IEC61937_EAC3;
     ctx->pkt_offset  = 24576;
-    ctx->out_buf     = ctx->hd_buf;
+    ctx->out_buf     = ctx->hd_buf[0];
     ctx->out_bytes   = ctx->hd_buf_filled;
     ctx->length_code = ctx->hd_buf_filled;
 
@@ -228,15 +233,15 @@
      * with some receivers, but the exact requirement is unconfirmed. */
     ctx->length_code = FFALIGN(ctx->out_bytes + 0x8, 0x10) - 0x8;
 
-    av_fast_malloc(&ctx->hd_buf, &ctx->hd_buf_size, ctx->out_bytes);
-    if (!ctx->hd_buf)
+    av_fast_malloc(&ctx->hd_buf[0], &ctx->hd_buf_size, ctx->out_bytes);
+    if (!ctx->hd_buf[0])
         return AVERROR(ENOMEM);
 
-    ctx->out_buf = ctx->hd_buf;
+    ctx->out_buf = ctx->hd_buf[0];
 
-    memcpy(ctx->hd_buf, dtshd_start_code, sizeof(dtshd_start_code));
-    AV_WB16(ctx->hd_buf + sizeof(dtshd_start_code), pkt_size);
-    memcpy(ctx->hd_buf + sizeof(dtshd_start_code) + 2, pkt->data, pkt_size);
+    memcpy(ctx->hd_buf[0], dtshd_start_code, sizeof(dtshd_start_code));
+    AV_WB16(ctx->hd_buf[0] + sizeof(dtshd_start_code), pkt_size);
+    memcpy(ctx->hd_buf[0] + sizeof(dtshd_start_code) + 2, pkt->data, pkt_size);
 
     return 0;
 }
@@ -384,57 +389,175 @@
 /*
  * It seems Dolby TrueHD frames have to be encapsulated in MAT frames before
  * they can be encapsulated in IEC 61937.
- * Here we encapsulate 24 TrueHD frames in a single MAT frame, padding them
- * to achieve constant rate.
- * The actual format of a MAT frame is unknown, but the below seems to work.
- * However, it seems it is not actually necessary for the 24 TrueHD frames to
- * be in an exact alignment with the MAT frame.
  */
+#define MAT_PKT_OFFSET          61440
 #define MAT_FRAME_SIZE          61424
-#define TRUEHD_FRAME_OFFSET     2560
-#define MAT_MIDDLE_CODE_OFFSET  -4
+
+static const uint8_t mat_start_code[20] = {
+    0x07, 0x9E, 0x00, 0x03, 0x84, 0x01, 0x01, 0x01, 0x80, 0x00, 0x56, 0xA5, 0x3B, 0xF4, 0x81, 0x83,
+    0x49, 0x80, 0x77, 0xE0,
+};
+static const uint8_t mat_middle_code[12] = {
+    0xC3, 0xC1, 0x42, 0x49, 0x3B, 0xFA, 0x82, 0x83, 0x49, 0x80, 0x77, 0xE0,
+};
+static const uint8_t mat_end_code[16] = {
+    0xC3, 0xC2, 0xC0, 0xC4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x97, 0x11,
+};
+
+#define MAT_CODE(position, data) { .pos = position, .code = data, .len = sizeof(data) }
+
+static const struct {
+    unsigned int pos;
+    const uint8_t *code;
+    unsigned int len;
+} mat_codes[] = {
+    MAT_CODE(0, mat_start_code),
+    MAT_CODE(30708, mat_middle_code),
+    MAT_CODE(MAT_FRAME_SIZE - sizeof(mat_end_code), mat_end_code),
+};
 
 static int spdif_header_truehd(AVFormatContext *s, AVPacket *pkt)
 {
     IEC61937Context *ctx = s->priv_data;
-    int mat_code_length = 0;
-    static const char mat_end_code[16] = { 0xC3, 0xC2, 0xC0, 0xC4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x97, 0x11 };
+    uint8_t *hd_buf = ctx->hd_buf[ctx->hd_buf_idx];
+    int ratebits;
+    int padding_remaining = 0;
+    uint16_t input_timing;
+    int total_frame_size = pkt->size;
+    const uint8_t *dataptr = pkt->data;
+    int data_remaining = pkt->size;
+    int have_pkt = 0;
+    int next_code_idx;
 
-    if (!ctx->hd_buf_count) {
-        static const char mat_start_code[20] = { 0x07, 0x9E, 0x00, 0x03, 0x84, 0x01, 0x01, 0x01, 0x80, 0x00, 0x56, 0xA5, 0x3B, 0xF4, 0x81, 0x83, 0x49, 0x80, 0x77, 0xE0 };
-        mat_code_length = sizeof(mat_start_code) + BURST_HEADER_SIZE;
-        memcpy(ctx->hd_buf, mat_start_code, sizeof(mat_start_code));
+    if (pkt->size < 10)
+        return AVERROR_INVALIDDATA;
 
-    } else if (ctx->hd_buf_count == 12) {
-        static const char mat_middle_code[12] = { 0xC3, 0xC1, 0x42, 0x49, 0x3B, 0xFA, 0x82, 0x83, 0x49, 0x80, 0x77, 0xE0 };
-        mat_code_length = sizeof(mat_middle_code) + MAT_MIDDLE_CODE_OFFSET;
-        memcpy(&ctx->hd_buf[12 * TRUEHD_FRAME_OFFSET - BURST_HEADER_SIZE + MAT_MIDDLE_CODE_OFFSET],
-               mat_middle_code, sizeof(mat_middle_code));
+    if (AV_RB24(pkt->data + 4) == 0xf8726f) {
+        /* major sync unit, fetch sample rate */
+        if (pkt->data[7] == 0xba)
+            ratebits = pkt->data[8] >> 4;
+        else if (pkt->data[7] == 0xbb)
+            ratebits = pkt->data[9] >> 4;
+        else
+            return AVERROR_INVALIDDATA;
+
+        ctx->truehd_samples_per_frame = 40 << (ratebits & 3);
+        av_log(s, AV_LOG_TRACE, "TrueHD samples per frame: %d\n",
+               ctx->truehd_samples_per_frame);
     }
 
-    if (pkt->size > TRUEHD_FRAME_OFFSET - mat_code_length) {
-        /* if such frames exist, we'd need some more complex logic to
-         * distribute the TrueHD frames in the MAT frame */
-        avpriv_request_sample(s, "Too large TrueHD frame of %d bytes",
-                              pkt->size);
-        return AVERROR_PATCHWELCOME;
+    if (!ctx->truehd_samples_per_frame)
+        return AVERROR_INVALIDDATA;
+
+    input_timing = AV_RB16(pkt->data + 2);
+    if (ctx->truehd_prev_size) {
+        uint16_t delta_samples = input_timing - ctx->truehd_prev_time;
+        /*
+         * One multiple-of-48kHz frame is 1/1200 sec and the IEC 61937 rate
+         * is 768kHz = 768000*4 bytes/sec.
+         * The nominal space per frame is therefore
+         * (768000*4 bytes/sec) * (1/1200 sec) = 2560 bytes.
+         * For multiple-of-44.1kHz frames: 1/1102.5 sec, 705.6kHz, 2560 bytes.
+         *
+         * 2560 is divisible by truehd_samples_per_frame.
+         */
+        int delta_bytes = delta_samples * 2560 / ctx->truehd_samples_per_frame;
+
+        /* padding needed before this frame */
+        padding_remaining = delta_bytes - ctx->truehd_prev_size;
+
+        av_log(s, AV_LOG_TRACE, "delta_samples: %"PRIu16", delta_bytes: %d\n",
+               delta_samples, delta_bytes);
+
+        /* sanity check */
+        if (padding_remaining < 0 || padding_remaining >= MAT_FRAME_SIZE / 2) {
+            avpriv_request_sample(s, "Unusual frame timing: %"PRIu16" => %"PRIu16", %d samples/frame",
+                                  ctx->truehd_prev_time, input_timing, ctx->truehd_samples_per_frame);
+            padding_remaining = 0;
+        }
     }
 
-    memcpy(&ctx->hd_buf[ctx->hd_buf_count * TRUEHD_FRAME_OFFSET - BURST_HEADER_SIZE + mat_code_length],
-           pkt->data, pkt->size);
-    memset(&ctx->hd_buf[ctx->hd_buf_count * TRUEHD_FRAME_OFFSET - BURST_HEADER_SIZE + mat_code_length + pkt->size],
-           0, TRUEHD_FRAME_OFFSET - pkt->size - mat_code_length);
+    for (next_code_idx = 0; next_code_idx < FF_ARRAY_ELEMS(mat_codes); next_code_idx++)
+        if (ctx->hd_buf_filled <= mat_codes[next_code_idx].pos)
+            break;
 
-    if (++ctx->hd_buf_count < 24){
+    if (next_code_idx >= FF_ARRAY_ELEMS(mat_codes))
+        return AVERROR_BUG;
+
+    while (padding_remaining || data_remaining ||
+           mat_codes[next_code_idx].pos == ctx->hd_buf_filled) {
+
+        if (mat_codes[next_code_idx].pos == ctx->hd_buf_filled) {
+            /* time to insert MAT code */
+            int code_len = mat_codes[next_code_idx].len;
+            int code_len_remaining = code_len;
+            memcpy(hd_buf + mat_codes[next_code_idx].pos,
+                   mat_codes[next_code_idx].code, code_len);
+            ctx->hd_buf_filled += code_len;
+
+            next_code_idx++;
+            if (next_code_idx == FF_ARRAY_ELEMS(mat_codes)) {
+                next_code_idx = 0;
+
+                /* this was the last code, move to the next MAT frame */
+                have_pkt = 1;
+                ctx->out_buf = hd_buf;
+                ctx->hd_buf_idx ^= 1;
+                hd_buf = ctx->hd_buf[ctx->hd_buf_idx];
+                ctx->hd_buf_filled = 0;
+
+                /* inter-frame gap has to be counted as well, add it */
+                code_len_remaining += MAT_PKT_OFFSET - MAT_FRAME_SIZE;
+            }
+
+            if (padding_remaining) {
+                /* consider the MAT code as padding */
+                int counted_as_padding = FFMIN(padding_remaining,
+                                               code_len_remaining);
+                padding_remaining -= counted_as_padding;
+                code_len_remaining -= counted_as_padding;
+            }
+            /* count the remainder of the code as part of frame size */
+            if (code_len_remaining)
+                total_frame_size += code_len_remaining;
+        }
+
+        if (padding_remaining) {
+            int padding_to_insert = FFMIN(mat_codes[next_code_idx].pos - ctx->hd_buf_filled,
+                                          padding_remaining);
+
+            memset(hd_buf + ctx->hd_buf_filled, 0, padding_to_insert);
+            ctx->hd_buf_filled += padding_to_insert;
+            padding_remaining -= padding_to_insert;
+
+            if (padding_remaining)
+                continue; /* time to insert MAT code */
+        }
+
+        if (data_remaining) {
+            int data_to_insert = FFMIN(mat_codes[next_code_idx].pos - ctx->hd_buf_filled,
+                                       data_remaining);
+
+            memcpy(hd_buf + ctx->hd_buf_filled, dataptr, data_to_insert);
+            ctx->hd_buf_filled += data_to_insert;
+            dataptr += data_to_insert;
+            data_remaining -= data_to_insert;
+        }
+    }
+
+    ctx->truehd_prev_size = total_frame_size;
+    ctx->truehd_prev_time = input_timing;
+
+    av_log(s, AV_LOG_TRACE, "TrueHD frame inserted, total size %d, buffer position %d\n",
+           total_frame_size, ctx->hd_buf_filled);
+
+    if (!have_pkt) {
         ctx->pkt_offset = 0;
         return 0;
     }
-    memcpy(&ctx->hd_buf[MAT_FRAME_SIZE - sizeof(mat_end_code)], mat_end_code, sizeof(mat_end_code));
-    ctx->hd_buf_count = 0;
 
     ctx->data_type   = IEC61937_TRUEHD;
-    ctx->pkt_offset  = 61440;
-    ctx->out_buf     = ctx->hd_buf;
+    ctx->pkt_offset  = MAT_PKT_OFFSET;
     ctx->out_bytes   = MAT_FRAME_SIZE;
     ctx->length_code = MAT_FRAME_SIZE;
     return 0;
@@ -465,9 +588,11 @@
     case AV_CODEC_ID_TRUEHD:
     case AV_CODEC_ID_MLP:
         ctx->header_info = spdif_header_truehd;
-        ctx->hd_buf = av_malloc(MAT_FRAME_SIZE);
-        if (!ctx->hd_buf)
-            return AVERROR(ENOMEM);
+        for (int i = 0; i < FF_ARRAY_ELEMS(ctx->hd_buf); i++) {
+            ctx->hd_buf[i] = av_malloc(MAT_FRAME_SIZE);
+            if (!ctx->hd_buf[i])
+                return AVERROR(ENOMEM);
+        }
         break;
     default:
         avpriv_report_missing_feature(s, "Codec %d",
@@ -477,12 +602,12 @@
     return 0;
 }
 
-static int spdif_write_trailer(AVFormatContext *s)
+static void spdif_deinit(AVFormatContext *s)
 {
     IEC61937Context *ctx = s->priv_data;
     av_freep(&ctx->buffer);
-    av_freep(&ctx->hd_buf);
-    return 0;
+    for (int i = 0; i < FF_ARRAY_ELEMS(ctx->hd_buf); i++)
+        av_freep(&ctx->hd_buf[i]);
 }
 
 static av_always_inline void spdif_put_16(IEC61937Context *ctx,
@@ -555,7 +680,7 @@
     .video_codec       = AV_CODEC_ID_NONE,
     .write_header      = spdif_write_header,
     .write_packet      = spdif_write_packet,
-    .write_trailer     = spdif_write_trailer,
+    .deinit            = spdif_deinit,
     .flags             = AVFMT_NOTIMESTAMPS,
     .priv_class        = &spdif_class,
 };
diff --git a/libavformat/srtdec.c b/libavformat/srtdec.c
index 56bd0c4..40d324b 100644
--- a/libavformat/srtdec.c
+++ b/libavformat/srtdec.c
@@ -30,7 +30,7 @@
     FFDemuxSubtitlesQueue q;
 } SRTContext;
 
-static int srt_probe(AVProbeData *p)
+static int srt_probe(const AVProbeData *p)
 {
     int v;
     char buf[64], *pbuf;
diff --git a/libavformat/stldec.c b/libavformat/stldec.c
index 35de493..d6e0713 100644
--- a/libavformat/stldec.c
+++ b/libavformat/stldec.c
@@ -34,7 +34,7 @@
     FFDemuxSubtitlesQueue q;
 } STLContext;
 
-static int stl_probe(AVProbeData *p)
+static int stl_probe(const AVProbeData *p)
 {
     char c;
     const unsigned char *ptr = p->buf;
diff --git a/libavformat/subfile.c b/libavformat/subfile.c
index b527f2b..5d8659c 100644
--- a/libavformat/subfile.c
+++ b/libavformat/subfile.c
@@ -116,20 +116,26 @@
 static int64_t subfile_seek(URLContext *h, int64_t pos, int whence)
 {
     SubfileContext *c = h->priv_data;
-    int64_t new_pos = -1;
+    int64_t new_pos, end;
     int ret;
 
+    if (whence == AVSEEK_SIZE || whence == SEEK_END) {
+        end = c->end;
+        if (end == INT64_MAX && (end = ffurl_seek(c->h, 0, AVSEEK_SIZE)) < 0)
+            return end;
+    }
+
     if (whence == AVSEEK_SIZE)
-        return c->end - c->start;
+        return end - c->start;
     switch (whence) {
     case SEEK_SET:
         new_pos = c->start + pos;
         break;
     case SEEK_CUR:
-        new_pos += pos;
+        new_pos = c->pos + pos;
         break;
     case SEEK_END:
-        new_pos = c->end + c->pos;
+        new_pos = end + pos;
         break;
     }
     if (new_pos < c->start)
diff --git a/libavformat/subtitles.c b/libavformat/subtitles.c
index 93c9ef0..ad7f689 100644
--- a/libavformat/subtitles.c
+++ b/libavformat/subtitles.c
@@ -132,9 +132,10 @@
         if (!subs)
             return NULL;
         q->subs = subs;
-        sub = &subs[q->nb_subs++];
+        sub = &subs[q->nb_subs];
         if (av_new_packet(sub, len) < 0)
             return NULL;
+        q->nb_subs++;
         sub->flags |= AV_PKT_FLAG_KEY;
         sub->pts = sub->dts = 0;
         memcpy(sub->data, event, len);
@@ -194,6 +195,9 @@
 {
     int i;
 
+    if (!q->nb_subs)
+        return;
+
     qsort(q->subs, q->nb_subs, sizeof(*q->subs),
           q->sort == SUB_SORT_TS_POS ? cmp_pkt_sub_ts_pos
                                      : cmp_pkt_sub_pos_ts);
@@ -208,11 +212,12 @@
 int ff_subtitles_queue_read_packet(FFDemuxSubtitlesQueue *q, AVPacket *pkt)
 {
     AVPacket *sub = q->subs + q->current_sub_idx;
+    int ret;
 
     if (q->current_sub_idx == q->nb_subs)
         return AVERROR_EOF;
-    if (av_packet_ref(pkt, sub) < 0) {
-        return AVERROR(ENOMEM);
+    if ((ret = av_packet_ref(pkt, sub)) < 0) {
+        return ret;
     }
 
     pkt->dts = pkt->pts;
@@ -417,7 +422,7 @@
         buf[cur++] = c;
         buf[cur] = '\0';
     }
-    if (ff_text_peek_r8(tr) == '\r')
+    while (ff_text_peek_r8(tr) == '\r')
         ff_text_r8(tr);
     if (ff_text_peek_r8(tr) == '\n')
         ff_text_r8(tr);
diff --git a/libavformat/subtitles.h b/libavformat/subtitles.h
index ca78db2..6b418e3 100644
--- a/libavformat/subtitles.h
+++ b/libavformat/subtitles.h
@@ -188,7 +188,7 @@
 {
     int n = strcspn(ptr, "\r\n");
     ptr += n;
-    if (*ptr == '\r') {
+    while (*ptr == '\r') {
         ptr++;
         n++;
     }
diff --git a/libavformat/subviewer1dec.c b/libavformat/subviewer1dec.c
index e579d1c..1360d9b 100644
--- a/libavformat/subviewer1dec.c
+++ b/libavformat/subviewer1dec.c
@@ -31,7 +31,7 @@
     FFDemuxSubtitlesQueue q;
 } SubViewer1Context;
 
-static int subviewer1_probe(AVProbeData *p)
+static int subviewer1_probe(const AVProbeData *p)
 {
     const unsigned char *ptr = p->buf;
 
diff --git a/libavformat/subviewerdec.c b/libavformat/subviewerdec.c
index af084f4..83378ea 100644
--- a/libavformat/subviewerdec.c
+++ b/libavformat/subviewerdec.c
@@ -27,6 +27,7 @@
 #include "avformat.h"
 #include "internal.h"
 #include "subtitles.h"
+#include "avio_internal.h"
 #include "libavcodec/internal.h"
 #include "libavutil/avstring.h"
 #include "libavutil/bprint.h"
@@ -36,7 +37,7 @@
     FFDemuxSubtitlesQueue q;
 } SubViewerContext;
 
-static int subviewer_probe(AVProbeData *p)
+static int subviewer_probe(const AVProbeData *p)
 {
     char c;
     const unsigned char *ptr = p->buf;
@@ -55,11 +56,21 @@
     int64_t end;
     int hh1, mm1, ss1, ms1;
     int hh2, mm2, ss2, ms2;
+    int multiplier = 1;
 
+    if (sscanf(s, "%u:%u:%u.%2u,%u:%u:%u.%2u",
+               &hh1, &mm1, &ss1, &ms1, &hh2, &mm2, &ss2, &ms2) == 8) {
+        multiplier = 10;
+    } else if (sscanf(s, "%u:%u:%u.%1u,%u:%u:%u.%1u",
+                      &hh1, &mm1, &ss1, &ms1, &hh2, &mm2, &ss2, &ms2) == 8) {
+        multiplier = 100;
+    }
     if (sscanf(s, "%u:%u:%u.%u,%u:%u:%u.%u",
                &hh1, &mm1, &ss1, &ms1, &hh2, &mm2, &ss2, &ms2) == 8) {
-        end    = (hh2*3600LL + mm2*60LL + ss2) * 100LL + ms2;
-        *start = (hh1*3600LL + mm1*60LL + ss1) * 100LL + ms1;
+        ms1 = FFMIN(ms1, 999);
+        ms2 = FFMIN(ms2, 999);
+        end    = (hh2*3600LL + mm2*60LL + ss2) * 1000LL + ms2 * multiplier;
+        *start = (hh1*3600LL + mm1*60LL + ss1) * 1000LL + ms1 * multiplier;
         *duration = end - *start;
         return 0;
     }
@@ -78,7 +89,12 @@
 
     if (!st)
         return AVERROR(ENOMEM);
-    avpriv_set_pts_info(st, 64, 1, 100);
+    res = ffio_ensure_seekback(s->pb, 3);
+    if (res < 0)
+        return res;
+    if (avio_rb24(s->pb) != 0xefbbbf)
+        avio_seek(s->pb, -3, SEEK_CUR);
+    avpriv_set_pts_info(st, 64, 1, 1000);
     st->codecpar->codec_type = AVMEDIA_TYPE_SUBTITLE;
     st->codecpar->codec_id   = AV_CODEC_ID_SUBVIEWER;
 
diff --git a/libavformat/supdec.c b/libavformat/supdec.c
index 0930dbc..d3fb251 100644
--- a/libavformat/supdec.c
+++ b/libavformat/supdec.c
@@ -68,7 +68,7 @@
     return 0;
 }
 
-static int sup_probe(AVProbeData *p)
+static int sup_probe(const AVProbeData *p)
 {
     unsigned char *buf = p->buf;
     size_t buf_size = p->buf_size;
diff --git a/libavformat/supenc.c b/libavformat/supenc.c
index f5f6b58..643dda5 100644
--- a/libavformat/supenc.c
+++ b/libavformat/supenc.c
@@ -32,10 +32,10 @@
     uint32_t pts = 0, dts = 0;
 
     if (pkt->pts != AV_NOPTS_VALUE) {
-        pts = (uint32_t)pkt->pts;
+        pts = pkt->pts;
     }
     if (pkt->dts != AV_NOPTS_VALUE) {
-        dts = (uint32_t)pkt->dts;
+        dts = pkt->dts;
     }
 
     /*
@@ -46,8 +46,8 @@
         size_t len = AV_RB16(data + 1) + 3;
 
         if (len > size) {
-            av_log(s, AV_LOG_ERROR, "Not enough data, skipping %d bytes\n",
-                     (int)size);
+            av_log(s, AV_LOG_ERROR, "Not enough data, skipping %"SIZE_SPECIFIER" bytes\n",
+                   size);
             return AVERROR_INVALIDDATA;
         }
 
@@ -63,8 +63,8 @@
     }
 
     if (size > 0) {
-        av_log(s, AV_LOG_ERROR, "Skipping %d bytes after last segment in frame\n",
-                 (int)size);
+        av_log(s, AV_LOG_ERROR, "Skipping %"SIZE_SPECIFIER" bytes after last segment in frame\n",
+               size);
         return AVERROR_INVALIDDATA;
     }
 
diff --git a/libavformat/svag.c b/libavformat/svag.c
index 828b853..83e033b 100644
--- a/libavformat/svag.c
+++ b/libavformat/svag.c
@@ -22,7 +22,7 @@
 #include "avformat.h"
 #include "internal.h"
 
-static int svag_probe(AVProbeData *p)
+static int svag_probe(const AVProbeData *p)
 {
     if (memcmp(p->buf, "Svag", 4))
         return 0;
diff --git a/libavformat/swfdec.c b/libavformat/swfdec.c
index 212157f..9a0b27b 100644
--- a/libavformat/swfdec.c
+++ b/libavformat/swfdec.c
@@ -61,7 +61,7 @@
 }
 
 
-static int swf_probe(AVProbeData *p)
+static int swf_probe(const AVProbeData *p)
 {
     GetBitContext gb;
     int len, xmin, xmax, ymin, ymax;
@@ -152,6 +152,8 @@
         swf->zpb->seekable = 0;
         if (inflateInit(&swf->zstream) != Z_OK) {
             av_log(s, AV_LOG_ERROR, "Unable to init zlib context\n");
+            av_freep(&swf->zbuf_in);
+            av_freep(&swf->zbuf_out);
             return AVERROR(EINVAL);
         }
         pb = swf->zpb;
@@ -397,7 +399,6 @@
 
             if (linesize * height > pkt->size) {
                 res = AVERROR_INVALIDDATA;
-                av_packet_unref(pkt);
                 goto bitmap_end;
             }
 
@@ -487,7 +488,6 @@
             if ((res = av_new_packet(pkt, len)) < 0)
                 return res;
             if (avio_read(pb, pkt->data, 4) != 4) {
-                av_packet_unref(pkt);
                 return AVERROR_INVALIDDATA;
             }
             if (AV_RB32(pkt->data) == 0xffd8ffd9 ||
@@ -504,7 +504,6 @@
             }
             if (res != pkt->size) {
                 if (res < 0) {
-                    av_packet_unref(pkt);
                     return res;
                 }
                 av_shrink_packet(pkt, res);
diff --git a/libavformat/swfenc.c b/libavformat/swfenc.c
index f53db0f..84f924e 100644
--- a/libavformat/swfenc.c
+++ b/libavformat/swfenc.c
@@ -337,7 +337,6 @@
         put_swf_end_tag(s);
     }
 
-    avio_flush(s->pb);
     return 0;
 }
 
diff --git a/libavformat/takdec.c b/libavformat/takdec.c
index 6fda35c..6d18b6a 100644
--- a/libavformat/takdec.c
+++ b/libavformat/takdec.c
@@ -31,11 +31,13 @@
 #include "rawdec.h"
 
 typedef struct TAKDemuxContext {
+    AVClass *class;
+    int     raw_packet_size;
     int     mlast_frame;
     int64_t data_end;
 } TAKDemuxContext;
 
-static int tak_probe(AVProbeData *p)
+static int tak_probe(const AVProbeData *p)
 {
     if (!memcmp(p->buf, "tBaK", 4))
         return AVPROBE_SCORE_EXTENSION;
@@ -80,6 +82,8 @@
 
         switch (type) {
         case TAK_METADATA_STREAMINFO:
+            if (st->codecpar->extradata)
+                return AVERROR_INVALIDDATA;
         case TAK_METADATA_LAST_FRAME:
         case TAK_METADATA_ENCODER:
             if (size <= 3)
@@ -146,7 +150,7 @@
 
             ret = avpriv_tak_parse_streaminfo(&ti, buffer, size -3);
             if (ret < 0)
-                return AVERROR_INVALIDDATA;
+                goto end;
             if (ti.samples > 0)
                 st->duration = ti.samples;
             st->codecpar->bits_per_coded_sample = ti.bps;
@@ -160,8 +164,10 @@
             st->codecpar->extradata_size        = size - 3;
             buffer                           = NULL;
         } else if (type == TAK_METADATA_LAST_FRAME) {
-            if (size != 11)
-                return AVERROR_INVALIDDATA;
+            if (size != 11) {
+                ret = AVERROR_INVALIDDATA;
+                goto end;
+            }
             init_get_bits8(&gb, buffer, size - 3);
             tc->mlast_frame = 1;
             tc->data_end    = get_bits64(&gb, TAK_LAST_FRAME_POS_BITS) +
@@ -176,6 +182,9 @@
     }
 
     return AVERROR_EOF;
+end:
+    av_freep(&buffer);
+    return ret;
 }
 
 static int raw_read_packet(AVFormatContext *s, AVPacket *pkt)
@@ -204,6 +213,7 @@
     return ret;
 }
 
+FF_RAW_DEMUXER_CLASS(tak)
 AVInputFormat ff_tak_demuxer = {
     .name           = "tak",
     .long_name      = NULL_IF_CONFIG_SMALL("raw TAK"),
@@ -214,4 +224,5 @@
     .flags          = AVFMT_GENERIC_INDEX,
     .extensions     = "tak",
     .raw_codec_id   = AV_CODEC_ID_TAK,
+    .priv_class     = &tak_demuxer_class,
 };
diff --git a/libavformat/tedcaptionsdec.c b/libavformat/tedcaptionsdec.c
index cd6ab0c..5572bfd 100644
--- a/libavformat/tedcaptionsdec.c
+++ b/libavformat/tedcaptionsdec.c
@@ -321,7 +321,7 @@
     return 0;
 }
 
-static av_cold int tedcaptions_read_probe(AVProbeData *p)
+static av_cold int tedcaptions_read_probe(const AVProbeData *p)
 {
     static const char *const tags[] = {
         "\"captions\"", "\"duration\"", "\"content\"",
diff --git a/libavformat/tee.c b/libavformat/tee.c
index ef3b113..f2b11fc 100644
--- a/libavformat/tee.c
+++ b/libavformat/tee.c
@@ -56,7 +56,6 @@
     TeeSlave *slaves;
     int use_fifo;
     AVDictionary *fifo_options;
-    char *fifo_options_str;
 } TeeContext;
 
 static const char *const slave_delim     = "|";
@@ -67,8 +66,8 @@
 static const AVOption options[] = {
         {"use_fifo", "Use fifo pseudo-muxer to separate actual muxers from encoder",
          OFFSET(use_fifo), AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, AV_OPT_FLAG_ENCODING_PARAM},
-        {"fifo_options", "fifo pseudo-muxer options", OFFSET(fifo_options_str),
-         AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, AV_OPT_FLAG_ENCODING_PARAM},
+        {"fifo_options", "fifo pseudo-muxer options", OFFSET(fifo_options),
+         AV_OPT_TYPE_DICT, {.str = NULL}, 0, 0, AV_OPT_FLAG_ENCODING_PARAM},
         {NULL}
 };
 
@@ -159,7 +158,7 @@
 static int open_slave(AVFormatContext *avf, char *slave, TeeSlave *tee_slave)
 {
     int i, ret;
-    AVDictionary *options = NULL;
+    AVDictionary *options = NULL, *bsf_options = NULL;
     AVDictionaryEntry *entry;
     char *filename;
     char *format = NULL, *select = NULL, *on_fail = NULL;
@@ -186,6 +185,12 @@
     STEAL_OPTION("onfail", on_fail);
     STEAL_OPTION("use_fifo", use_fifo);
     STEAL_OPTION("fifo_options", fifo_options_str);
+    entry = NULL;
+    while ((entry = av_dict_get(options, "bsfs", entry, AV_DICT_IGNORE_SUFFIX))) {
+        /* trim out strlen("bsfs") characters from key */
+        av_dict_set(&bsf_options, entry->key + 4, entry->value, 0);
+        av_dict_set(&options, entry->key, NULL, 0);
+    }
 
     ret = parse_slave_failure_policy_option(on_fail, tee_slave);
     if (ret < 0) {
@@ -236,6 +241,7 @@
     avf2->io_close = avf->io_close;
     avf2->interrupt_callback = avf->interrupt_callback;
     avf2->flags = avf->flags;
+    avf2->strict_std_compliance = avf->strict_std_compliance;
 
     tee_slave->stream_map = av_calloc(avf->nb_streams, sizeof(*tee_slave->stream_map));
     if (!tee_slave->stream_map) {
@@ -310,8 +316,8 @@
     }
 
     entry = NULL;
-    while (entry = av_dict_get(options, "bsfs", NULL, AV_DICT_IGNORE_SUFFIX)) {
-        const char *spec = entry->key + strlen("bsfs");
+    while (entry = av_dict_get(bsf_options, "", NULL, AV_DICT_IGNORE_SUFFIX)) {
+        const char *spec = entry->key;
         if (*spec) {
             if (strspn(spec, slave_bsfs_spec_sep) != 1) {
                 av_log(avf, AV_LOG_ERROR,
@@ -351,7 +357,7 @@
             }
         }
 
-        av_dict_set(&options, entry->key, NULL, 0);
+        av_dict_set(&bsf_options, entry->key, NULL, 0);
     }
 
     for (i = 0; i < avf->nb_streams; i++){
@@ -398,6 +404,7 @@
     av_free(select);
     av_free(on_fail);
     av_dict_free(&options);
+    av_dict_free(&bsf_options);
     av_freep(&tmp_select);
     return ret;
 }
@@ -467,12 +474,6 @@
             filename++;
     }
 
-    if (tee->fifo_options_str) {
-        ret = av_dict_parse_string(&tee->fifo_options, tee->fifo_options_str, "=", ":", 0);
-        if (ret < 0)
-            goto fail;
-    }
-
     if (!(tee->slaves = av_mallocz_array(nb_slaves, sizeof(*tee->slaves)))) {
         ret = AVERROR(ENOMEM);
         goto fail;
@@ -563,7 +564,6 @@
         if (s2 < 0)
             continue;
 
-        memset(&pkt2, 0, sizeof(AVPacket));
         if ((ret = av_packet_ref(&pkt2, pkt)) < 0)
             if (!ret_all) {
                 ret_all = ret;
diff --git a/libavformat/tests/url.c b/libavformat/tests/url.c
index 1623179..5e484fd 100644
--- a/libavformat/tests/url.c
+++ b/libavformat/tests/url.c
@@ -19,12 +19,13 @@
  */
 
 #include "libavformat/url.h"
+#include "libavformat/avformat.h"
 
 static void test(const char *base, const char *rel)
 {
     char buf[200], buf2[200];
     ff_make_absolute_url(buf, sizeof(buf), base, rel);
-    printf("%s\n", buf);
+    printf("%50s %-20s => %s\n", base, rel, buf);
     if (base) {
         /* Test in-buffer replacement */
         snprintf(buf2, sizeof(buf2), "%s", base);
@@ -36,8 +37,21 @@
     }
 }
 
+static void test2(const char *url)
+{
+    char proto[64];
+    char auth[256];
+    char host[256];
+    char path[256];
+    int port=-1;
+
+    av_url_split(proto, sizeof(proto), auth, sizeof(auth), host, sizeof(host), &port, path, sizeof(path), url);
+    printf("%-60s => %-15s %-15s %-15s %5d %s\n", url, proto, auth, host, port, path);
+}
+
 int main(void)
 {
+    printf("Testing ff_make_absolute_url:\n");
     test(NULL, "baz");
     test("/foo/bar", "baz");
     test("/foo/bar", "../baz");
@@ -51,5 +65,17 @@
     test("http://server/foo/bar?param=value/with/slashes", "/baz");
     test("http://server/foo/bar?param&otherparam", "?someparam");
     test("http://server/foo/bar", "//other/url");
+
+    printf("\nTesting av_url_split:\n");
+    test2("/foo/bar");
+    test2("http://server/foo/");
+    test2("http://example.com/foo/bar");
+    test2("http://user:pass@localhost:8080/foo/bar/123");
+    test2("http://server/foo/bar?param=value/with/slashes");
+    test2("https://1l-lh.a.net/i/1LIVE_HDS@179577/master.m3u8");
+    test2("ftp://u:p%2B%2F2@ftp.pbt.com/ExportHD.mpg");
+    test2("https://key.dns.com?key_id=2&model_id=12345&&access_key=");
+    test2("http://example.com#tag");
+
     return 0;
 }
diff --git a/libavformat/thp.c b/libavformat/thp.c
index 76b9b38..332ed79 100644
--- a/libavformat/thp.c
+++ b/libavformat/thp.c
@@ -45,7 +45,7 @@
 } ThpDemuxContext;
 
 
-static int thp_probe(AVProbeData *p)
+static int thp_probe(const AVProbeData *p)
 {
     double d;
     /* check file header */
@@ -181,7 +181,6 @@
         if (ret < 0)
             return ret;
         if (ret != size) {
-            av_packet_unref(pkt);
             return AVERROR(EIO);
         }
 
@@ -191,7 +190,6 @@
         if (ret < 0)
             return ret;
         if (ret != thp->audiosize) {
-            av_packet_unref(pkt);
             return AVERROR(EIO);
         }
 
diff --git a/libavformat/tiertexseq.c b/libavformat/tiertexseq.c
index 6e00692..d7719e5 100644
--- a/libavformat/tiertexseq.c
+++ b/libavformat/tiertexseq.c
@@ -60,7 +60,7 @@
 } SeqDemuxContext;
 
 
-static int seq_probe(AVProbeData *p)
+static int seq_probe(const AVProbeData *p)
 {
     int i;
 
@@ -182,6 +182,17 @@
     return 0;
 }
 
+static int seq_read_close(AVFormatContext *s)
+{
+    int i;
+    SeqDemuxContext *seq = s->priv_data;
+
+    for (i = 0; i < SEQ_NUM_FRAME_BUFFERS; i++)
+        av_freep(&seq->frame_buffers[i].data);
+
+    return 0;
+}
+
 static int seq_read_header(AVFormatContext *s)
 {
     int i, rc;
@@ -191,16 +202,20 @@
 
     /* init internal buffers */
     rc = seq_init_frame_buffers(seq, pb);
-    if (rc)
+    if (rc) {
+        seq_read_close(s);
         return rc;
+    }
 
     seq->current_frame_offs = 0;
 
     /* preload (no audio data, just buffer operations related data) */
     for (i = 1; i <= 100; i++) {
         rc = seq_parse_frame_data(seq, pb);
-        if (rc)
+        if (rc) {
+            seq_read_close(s);
             return rc;
+        }
     }
 
     seq->current_frame_pts = 0;
@@ -209,8 +224,10 @@
 
     /* initialize the video decoder stream */
     st = avformat_new_stream(s, NULL);
-    if (!st)
+    if (!st) {
+        seq_read_close(s);
         return AVERROR(ENOMEM);
+    }
 
     avpriv_set_pts_info(st, 32, 1, SEQ_FRAME_RATE);
     seq->video_stream_index = st->index;
@@ -222,8 +239,10 @@
 
     /* initialize the audio decoder stream */
     st = avformat_new_stream(s, NULL);
-    if (!st)
+    if (!st) {
+        seq_read_close(s);
         return AVERROR(ENOMEM);
+    }
 
     st->start_time = 0;
     avpriv_set_pts_info(st, 32, 1, SEQ_SAMPLE_RATE);
@@ -254,8 +273,10 @@
 
         /* video packet */
         if (seq->current_pal_data_size + seq->current_video_data_size != 0) {
-            if (av_new_packet(pkt, 1 + seq->current_pal_data_size + seq->current_video_data_size))
-                return AVERROR(ENOMEM);
+            rc = av_new_packet(pkt, 1 + seq->current_pal_data_size
+                                      + seq->current_video_data_size);
+            if (rc < 0)
+                return rc;
 
             pkt->data[0] = 0;
             if (seq->current_pal_data_size) {
@@ -295,17 +316,6 @@
     return 0;
 }
 
-static int seq_read_close(AVFormatContext *s)
-{
-    int i;
-    SeqDemuxContext *seq = s->priv_data;
-
-    for (i = 0; i < SEQ_NUM_FRAME_BUFFERS; i++)
-        av_freep(&seq->frame_buffers[i].data);
-
-    return 0;
-}
-
 AVInputFormat ff_tiertexseq_demuxer = {
     .name           = "tiertexseq",
     .long_name      = NULL_IF_CONFIG_SMALL("Tiertex Limited SEQ"),
diff --git a/libavformat/tls_gnutls.c b/libavformat/tls_gnutls.c
index e3c4368..e41156c 100644
--- a/libavformat/tls_gnutls.c
+++ b/libavformat/tls_gnutls.c
@@ -182,11 +182,18 @@
     gnutls_transport_set_push_function(p->session, gnutls_url_push);
     gnutls_transport_set_ptr(p->session, c->tcp);
     gnutls_priority_set_direct(p->session, "NORMAL", NULL);
-    ret = gnutls_handshake(p->session);
-    if (ret) {
-        ret = print_tls_error(h, ret);
-        goto fail;
-    }
+    do {
+        if (ff_check_interrupt(&h->interrupt_callback)) {
+            ret = AVERROR_EXIT;
+            goto fail;
+        }
+
+        ret = gnutls_handshake(p->session);
+        if (gnutls_error_is_fatal(ret)) {
+            ret = print_tls_error(h, ret);
+            goto fail;
+        }
+    } while (ret);
     p->need_shutdown = 1;
     if (c->verify) {
         unsigned int status, cert_list_size;
diff --git a/libavformat/tls_mbedtls.c b/libavformat/tls_mbedtls.c
index 9b80a1e..965adf1 100644
--- a/libavformat/tls_mbedtls.c
+++ b/libavformat/tls_mbedtls.c
@@ -62,6 +62,7 @@
     mbedtls_ctr_drbg_free(&tls_ctx->ctr_drbg_context);
     mbedtls_entropy_free(&tls_ctx->entropy_context);
 
+    ffurl_closep(&tls_ctx->tls_shared.tcp);
     return 0;
 }
 
diff --git a/libavformat/tls_openssl.c b/libavformat/tls_openssl.c
index 7ae71bd..e305b24 100644
--- a/libavformat/tls_openssl.c
+++ b/libavformat/tls_openssl.c
@@ -48,7 +48,7 @@
 #endif
 } TLSContext;
 
-#if HAVE_THREADS
+#if HAVE_THREADS && OPENSSL_VERSION_NUMBER < 0x10100000L
 #include <openssl/crypto.h>
 pthread_mutex_t *openssl_mutexes;
 static void openssl_lock(int mode, int type, const char *file, int line)
@@ -70,9 +70,16 @@
 {
     ff_lock_avformat();
     if (!openssl_init) {
+        /* OpenSSL 1.0.2 or below, then you would use SSL_library_init. If you are
+         * using OpenSSL 1.1.0 or above, then the library will initialize
+         * itself automatically.
+         * https://wiki.openssl.org/index.php/Library_Initialization
+         */
+#if OPENSSL_VERSION_NUMBER < 0x10100000L
         SSL_library_init();
         SSL_load_error_strings();
-#if HAVE_THREADS
+#endif
+#if HAVE_THREADS && OPENSSL_VERSION_NUMBER < 0x10100000L
         if (!CRYPTO_get_locking_callback()) {
             int i;
             openssl_mutexes = av_malloc_array(sizeof(pthread_mutex_t), CRYPTO_num_locks());
@@ -101,7 +108,7 @@
     ff_lock_avformat();
     openssl_init--;
     if (!openssl_init) {
-#if HAVE_THREADS
+#if HAVE_THREADS && OPENSSL_VERSION_NUMBER < 0x10100000L
         if (CRYPTO_get_locking_callback() == openssl_lock) {
             int i;
             CRYPTO_set_locking_callback(NULL);
diff --git a/libavformat/tmv.c b/libavformat/tmv.c
index 2e35171..b74af54 100644
--- a/libavformat/tmv.c
+++ b/libavformat/tmv.c
@@ -51,7 +51,7 @@
 #define PROBE_MAX_FPS         120
 #define PROBE_MIN_AUDIO_SIZE  (PROBE_MIN_SAMPLE_RATE / PROBE_MAX_FPS)
 
-static int tmv_probe(AVProbeData *p)
+static int tmv_probe(const AVProbeData *p)
 {
     if (AV_RL32(p->buf)   == TMV_TAG &&
         AV_RL16(p->buf+4) >= PROBE_MIN_SAMPLE_RATE &&
diff --git a/libavformat/tta.c b/libavformat/tta.c
index ae90a85..467c244 100644
--- a/libavformat/tta.c
+++ b/libavformat/tta.c
@@ -35,7 +35,7 @@
     int last_frame_size;
 } TTAContext;
 
-static int tta_probe(AVProbeData *p)
+static int tta_probe(const AVProbeData *p)
 {
     if (AV_RL32(&p->buf[0]) == MKTAG('T', 'T', 'A', '1') &&
         (AV_RL16(&p->buf[4]) == 1 || AV_RL16(&p->buf[4]) == 2) &&
diff --git a/libavformat/ttaenc.c b/libavformat/ttaenc.c
index d8e1136..4860aab 100644
--- a/libavformat/ttaenc.c
+++ b/libavformat/ttaenc.c
@@ -147,17 +147,25 @@
     avio_wl32(tta->seek_table, crc);
     size = avio_close_dyn_buf(tta->seek_table, &ptr);
     avio_write(s->pb, ptr, size);
+    tta->seek_table = NULL;
     av_free(ptr);
 
     /* Write audio data */
     tta_queue_flush(s);
 
     ff_ape_write_tag(s);
-    avio_flush(s->pb);
 
     return 0;
 }
 
+static void tta_deinit(AVFormatContext *s)
+{
+    TTAMuxContext *tta = s->priv_data;
+
+    ffio_free_dyn_buf(&tta->seek_table);
+    ff_packet_list_free(&tta->queue, &tta->queue_end);
+}
+
 AVOutputFormat ff_tta_muxer = {
     .name              = "tta",
     .long_name         = NULL_IF_CONFIG_SMALL("TTA (True Audio)"),
@@ -167,6 +175,7 @@
     .audio_codec       = AV_CODEC_ID_TTA,
     .video_codec       = AV_CODEC_ID_NONE,
     .init              = tta_init,
+    .deinit            = tta_deinit,
     .write_header      = tta_write_header,
     .write_packet      = tta_write_packet,
     .write_trailer     = tta_write_trailer,
diff --git a/libavformat/tty.c b/libavformat/tty.c
index 8d48f2c..aed5c88 100644
--- a/libavformat/tty.c
+++ b/libavformat/tty.c
@@ -34,6 +34,13 @@
 #include "internal.h"
 #include "sauce.h"
 
+static int isansicode(int x)
+{
+    return x == 0x1B || x == 0x0A || x == 0x0D || (x >= 0x20 && x < 0x7f);
+}
+
+static const char tty_extensions[31] = "ans,art,asc,diz,ice,nfo,txt,vt";
+
 typedef struct TtyDemuxContext {
     AVClass *class;
     int chars_per_frame;
@@ -42,6 +49,26 @@
     AVRational framerate; /**< Set by a private option. */
 } TtyDemuxContext;
 
+static int read_probe(const AVProbeData *p)
+{
+    int cnt = 0;
+
+    if (!p->buf_size)
+        return 0;
+
+    for (int i = 0; i < 8 && i < p->buf_size; i++)
+        cnt += !!isansicode(p->buf[i]);
+
+    if (cnt != 8)
+        return 0;
+
+    for (int i = 8; i < p->buf_size; i++)
+        cnt += !!isansicode(p->buf[i]);
+
+    return (cnt * 99LL / p->buf_size) * (cnt > 400) *
+        !!av_match_ext(p->filename, tty_extensions);
+}
+
 /**
  * Parse EFI header
  */
@@ -129,6 +156,8 @@
     pkt->size = av_get_packet(avctx->pb, pkt, n);
     if (pkt->size < 0)
         return pkt->size;
+    pkt->stream_index = 0;
+    pkt->pts = pkt->pos / s->chars_per_frame;
     pkt->flags |= AV_PKT_FLAG_KEY;
     return 0;
 }
@@ -153,8 +182,10 @@
     .name           = "tty",
     .long_name      = NULL_IF_CONFIG_SMALL("Tele-typewriter"),
     .priv_data_size = sizeof(TtyDemuxContext),
+    .read_probe     = read_probe,
     .read_header    = read_header,
     .read_packet    = read_packet,
-    .extensions     = "ans,art,asc,diz,ice,nfo,txt,vt",
+    .extensions     = tty_extensions,
     .priv_class     = &tty_demuxer_class,
+    .flags          = AVFMT_GENERIC_INDEX,
 };
diff --git a/libavformat/txd.c b/libavformat/txd.c
index 18c9683..072cd04 100644
--- a/libavformat/txd.c
+++ b/libavformat/txd.c
@@ -31,7 +31,7 @@
 #define TXD_MARKER          0x1803ffff
 #define TXD_MARKER2         0x1003ffff
 
-static int txd_probe(AVProbeData * pd) {
+static int txd_probe(const AVProbeData * pd) {
     if (AV_RL32(pd->buf  ) == TXD_FILE &&
        (AV_RL32(pd->buf+8) == TXD_MARKER || AV_RL32(pd->buf+8) == TXD_MARKER2))
         return AVPROBE_SCORE_MAX;
diff --git a/libavformat/ty.c b/libavformat/ty.c
index 8230d3a..738a22e 100644
--- a/libavformat/ty.c
+++ b/libavformat/ty.c
@@ -106,7 +106,7 @@
     uint8_t         chunk[CHUNK_SIZE];
 } TYDemuxContext;
 
-static int ty_probe(AVProbeData *p)
+static int ty_probe(const AVProbeData *p)
 {
     int i;
 
@@ -454,7 +454,7 @@
     TYDemuxContext *ty = s->priv_data;
     const int subrec_type = rec_hdr->subrec_type;
     const int64_t rec_size = rec_hdr->rec_size;
-    int es_offset1;
+    int es_offset1, ret;
     int got_packet = 0;
 
     if (subrec_type != 0x02 && subrec_type != 0x0c &&
@@ -474,8 +474,8 @@
                     int size = rec_hdr->rec_size - VIDEO_PES_LENGTH - es_offset1;
 
                     ty->cur_chunk_pos += VIDEO_PES_LENGTH + es_offset1;
-                    if (av_new_packet(pkt, size) < 0)
-                        return AVERROR(ENOMEM);
+                    if ((ret = av_new_packet(pkt, size)) < 0)
+                        return ret;
                     memcpy(pkt->data, ty->chunk + ty->cur_chunk_pos, size);
                     ty->cur_chunk_pos += size;
                     pkt->stream_index = 0;
@@ -498,8 +498,8 @@
     }
 
     if (!got_packet) {
-        if (av_new_packet(pkt, rec_size) < 0)
-            return AVERROR(ENOMEM);
+        if ((ret = av_new_packet(pkt, rec_size)) < 0)
+            return ret;
         memcpy(pkt->data, ty->chunk + ty->cur_chunk_pos, rec_size);
         ty->cur_chunk_pos += rec_size;
         pkt->stream_index = 0;
@@ -578,7 +578,7 @@
     TYDemuxContext *ty = s->priv_data;
     const int subrec_type = rec_hdr->subrec_type;
     const int64_t rec_size = rec_hdr->rec_size;
-    int es_offset1;
+    int es_offset1, ret;
 
     if (subrec_type == 2) {
         int need = 0;
@@ -621,8 +621,8 @@
             ty->pes_buf_cnt = 0;
 
         }
-        if (av_new_packet(pkt, rec_size - need) < 0)
-            return AVERROR(ENOMEM);
+        if ((ret = av_new_packet(pkt, rec_size - need)) < 0)
+            return ret;
         memcpy(pkt->data, ty->chunk + ty->cur_chunk_pos, rec_size - need);
         ty->cur_chunk_pos += rec_size - need;
         pkt->stream_index = 1;
@@ -643,8 +643,8 @@
             }
         }
     } else if (subrec_type == 0x03) {
-        if (av_new_packet(pkt, rec_size) < 0)
-            return AVERROR(ENOMEM);
+        if ((ret = av_new_packet(pkt, rec_size)) < 0)
+            return ret;
         memcpy(pkt->data, ty->chunk + ty->cur_chunk_pos, rec_size);
         ty->cur_chunk_pos += rec_size;
         pkt->stream_index = 1;
@@ -674,15 +674,15 @@
     } else if (subrec_type == 0x04) {
         /* SA Audio with no PES Header                      */
         /* ================================================ */
-        if (av_new_packet(pkt, rec_size) < 0)
-            return AVERROR(ENOMEM);
+        if ((ret = av_new_packet(pkt, rec_size)) < 0)
+            return ret;
         memcpy(pkt->data, ty->chunk + ty->cur_chunk_pos, rec_size);
         ty->cur_chunk_pos += rec_size;
         pkt->stream_index = 1;
         pkt->pts = ty->last_audio_pts;
     } else if (subrec_type == 0x09) {
-        if (av_new_packet(pkt, rec_size) < 0)
-            return AVERROR(ENOMEM);
+        if ((ret = av_new_packet(pkt, rec_size)) < 0)
+            return ret;
         memcpy(pkt->data, ty->chunk + ty->cur_chunk_pos, rec_size);
         ty->cur_chunk_pos += rec_size ;
         pkt->stream_index = 1;
diff --git a/libavformat/udp.c b/libavformat/udp.c
index cf73d33..ad6992c 100644
--- a/libavformat/udp.c
+++ b/libavformat/udp.c
@@ -61,8 +61,13 @@
 #define IPPROTO_UDPLITE                                  136
 #endif
 
+#if HAVE_W32THREADS
+#undef HAVE_PTHREAD_CANCEL
+#define HAVE_PTHREAD_CANCEL 1
+#endif
+
 #if HAVE_PTHREAD_CANCEL
-#include <pthread.h>
+#include "libavutil/thread.h"
 #endif
 
 #ifndef IPV6_ADD_MEMBERSHIP
@@ -71,6 +76,7 @@
 #endif
 
 #define UDP_TX_BUF_SIZE 32768
+#define UDP_RX_BUF_SIZE 393216
 #define UDP_MAX_PKT_SIZE 65536
 #define UDP_HEADER_SIZE 8
 
@@ -274,7 +280,7 @@
         }
         return 0;
 #else
-        av_log(NULL, AV_LOG_ERROR,
+        av_log(h, AV_LOG_ERROR,
                "Setting multicast sources only supported for IPv4\n");
         return AVERROR(EINVAL);
 #endif
@@ -283,7 +289,7 @@
     for (i = 0; i < nb_sources; i++) {
         struct ip_mreq_source mreqs;
         if (sources[i].ss_family != AF_INET) {
-            av_log(NULL, AV_LOG_ERROR, "Source/block address %d is of incorrect protocol family\n", i + 1);
+            av_log(h, AV_LOG_ERROR, "Source/block address %d is of incorrect protocol family\n", i + 1);
             return AVERROR(EINVAL);
         }
 
@@ -298,9 +304,9 @@
                        include ? IP_ADD_SOURCE_MEMBERSHIP : IP_BLOCK_SOURCE,
                        (const void *)&mreqs, sizeof(mreqs)) < 0) {
             if (include)
-                ff_log_net_error(NULL, AV_LOG_ERROR, "setsockopt(IP_ADD_SOURCE_MEMBERSHIP)");
+                ff_log_net_error(h, AV_LOG_ERROR, "setsockopt(IP_ADD_SOURCE_MEMBERSHIP)");
             else
-                ff_log_net_error(NULL, AV_LOG_ERROR, "setsockopt(IP_BLOCK_SOURCE)");
+                ff_log_net_error(h, AV_LOG_ERROR, "setsockopt(IP_BLOCK_SOURCE)");
             return ff_neterrno();
         }
     }
@@ -519,14 +525,12 @@
 {
     URLContext *h = _URLContext;
     UDPContext *s = h->priv_data;
-    int old_cancelstate;
     int64_t target_timestamp = av_gettime_relative();
     int64_t start_timestamp = av_gettime_relative();
     int64_t sent_bits = 0;
     int64_t burst_interval = s->bitrate ? (s->burst_bits * 1000000 / s->bitrate) : 0;
     int64_t max_delay = s->bitrate ?  ((int64_t)h->max_packet_size * 8 * 1000000 / s->bitrate + 1) : 0;
 
-    pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &old_cancelstate);
     pthread_mutex_lock(&s->mutex);
 
     if (ff_socket_nonblock(s->udp_fd, 0) < 0) {
@@ -561,7 +565,6 @@
         av_fifo_generic_read(s->fifo, s->tmp, len, NULL);
 
         pthread_mutex_unlock(&s->mutex);
-        pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, &old_cancelstate);
 
         if (s->bitrate) {
             timestamp = av_gettime_relative();
@@ -607,7 +610,6 @@
             }
         }
 
-        pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &old_cancelstate);
         pthread_mutex_lock(&s->mutex);
     }
 
@@ -636,7 +638,7 @@
 
     is_output = !(flags & AVIO_FLAG_READ);
     if (s->buffer_size < 0)
-        s->buffer_size = is_output ? UDP_TX_BUF_SIZE : UDP_MAX_PKT_SIZE;
+        s->buffer_size = is_output ? UDP_TX_BUF_SIZE : UDP_RX_BUF_SIZE;
 
     if (s->sources) {
         if (ff_ip_parse_sources(h, s->sources, &s->filters) < 0)
@@ -797,7 +799,7 @@
      * receiving UDP packets from other sources aimed at the same UDP
      * port. This fails on windows. This makes sending to the same address
      * using sendto() fail, so only do it if we're opened in read-only mode. */
-    if (s->is_multicast && !(h->flags & AVIO_FLAG_WRITE)) {
+    if (s->is_multicast && (h->flags & AVIO_FLAG_READ)) {
         bind_ret = bind(udp_fd,(struct sockaddr *)&s->dest_addr, len);
     }
     /* bind to the local address if not multicast or if the multicast
@@ -861,7 +863,7 @@
         } else {
             av_log(h, AV_LOG_DEBUG, "end receive buffer size reported is %d\n", tmp);
             if(tmp < s->buffer_size)
-                av_log(h, AV_LOG_WARNING, "attempted to set receive buffer to size %d but it only ended up set as %d", s->buffer_size, tmp);
+                av_log(h, AV_LOG_WARNING, "attempted to set receive buffer to size %d but it only ended up set as %d\n", s->buffer_size, tmp);
         }
 
         /* make the socket non-blocking */
@@ -978,9 +980,10 @@
                 int64_t t = av_gettime() + 100000;
                 struct timespec tv = { .tv_sec  =  t / 1000000,
                                        .tv_nsec = (t % 1000000) * 1000 };
-                if (pthread_cond_timedwait(&s->cond, &s->mutex, &tv) < 0) {
+                int err = pthread_cond_timedwait(&s->cond, &s->mutex, &tv);
+                if (err) {
                     pthread_mutex_unlock(&s->mutex);
-                    return AVERROR(errno == ETIMEDOUT ? EAGAIN : errno);
+                    return AVERROR(err == ETIMEDOUT ? EAGAIN : err);
                 }
                 nonblock = 1;
             }
@@ -1071,8 +1074,17 @@
     if (s->thread_started) {
         int ret;
         // Cancel only read, as write has been signaled as success to the user
-        if (h->flags & AVIO_FLAG_READ)
+        if (h->flags & AVIO_FLAG_READ) {
+#ifdef _WIN32
+            /* recvfrom() is not a cancellation point for win32, so we shutdown
+             * the socket and abort pending IO, subsequent recvfrom() calls
+             * will fail with WSAESHUTDOWN causing the thread to exit. */
+            shutdown(s->udp_fd, SD_RECEIVE);
+            CancelIoEx((HANDLE)(SOCKET)s->udp_fd, NULL);
+#else
             pthread_cancel(s->circular_buffer_thread);
+#endif
+        }
         ret = pthread_join(s->circular_buffer_thread, NULL);
         if (ret != 0)
             av_log(h, AV_LOG_ERROR, "pthread_join(): %s\n", strerror(ret));
diff --git a/libavformat/urldecode.c b/libavformat/urldecode.c
index 283d912..5261bcd 100644
--- a/libavformat/urldecode.c
+++ b/libavformat/urldecode.c
@@ -32,7 +32,7 @@
 #include "libavutil/avstring.h"
 #include "urldecode.h"
 
-char *ff_urldecode(const char *url)
+char *ff_urldecode(const char *url, int decode_plus_sign)
 {
     int s = 0, d = 0, url_len = 0;
     char c;
@@ -74,7 +74,7 @@
                 dest[d++] = c2;
                 dest[d++] = c3;
             }
-        } else if (c == '+') {
+        } else if (c == '+' && decode_plus_sign) {
             dest[d++] = ' ';
         } else {
             dest[d++] = c;
diff --git a/libavformat/urldecode.h b/libavformat/urldecode.h
index cb81ebc..80b11c3 100644
--- a/libavformat/urldecode.h
+++ b/libavformat/urldecode.h
@@ -26,10 +26,11 @@
  * in that case the original string is duplicated.
  *
  * @param url a string to be decoded.
+ * @param decode_plus_sign if nonzero plus sign is decoded to space
  * @return new string with the URL decoded or NULL if decoding failed.
  * Note that the returned string should be explicitly freed when not
  * used anymore.
  */
-char *ff_urldecode(const char *url);
+char *ff_urldecode(const char *url, int decode_plus_sign);
 
 #endif /* AVFORMAT_URLDECODE_H */
diff --git a/libavformat/utils.c b/libavformat/utils.c
index a8ac902..a36d673 100644
--- a/libavformat/utils.c
+++ b/libavformat/utils.c
@@ -19,7 +19,6 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
-#include <stdarg.h>
 #include <stdint.h>
 
 #include "config.h"
@@ -31,26 +30,22 @@
 #include "libavutil/mathematics.h"
 #include "libavutil/opt.h"
 #include "libavutil/parseutils.h"
-#include "libavutil/pixdesc.h"
+#include "libavutil/pixfmt.h"
 #include "libavutil/thread.h"
 #include "libavutil/time.h"
-#include "libavutil/time_internal.h"
 #include "libavutil/timestamp.h"
 
 #include "libavcodec/bytestream.h"
 #include "libavcodec/internal.h"
 #include "libavcodec/raw.h"
 
-#include "audiointerleave.h"
 #include "avformat.h"
 #include "avio_internal.h"
 #include "id3v2.h"
 #include "internal.h"
-#include "metadata.h"
 #if CONFIG_NETWORK
 #include "network.h"
 #endif
-#include "riff.h"
 #include "url.h"
 
 #include "libavutil/ffversion.h"
@@ -77,7 +72,7 @@
 const char *avformat_license(void)
 {
 #define LICENSE_PREFIX "libavformat license: "
-    return LICENSE_PREFIX FFMPEG_LICENSE + sizeof(LICENSE_PREFIX) - 1;
+    return &LICENSE_PREFIX FFMPEG_LICENSE[sizeof(LICENSE_PREFIX) - 1];
 }
 
 int ff_lock_avformat(void)
@@ -222,7 +217,8 @@
 
     if (codec->capabilities & AV_CODEC_CAP_AVOID_PROBING) {
         const AVCodec *probe_codec = NULL;
-        while (probe_codec = av_codec_next(probe_codec)) {
+        void *iter = NULL;
+        while ((probe_codec = av_codec_iterate(&iter))) {
             if (probe_codec->id == codec_id &&
                     av_codec_is_decoder(probe_codec) &&
                     !(probe_codec->capabilities & (AV_CODEC_CAP_AVOID_PROBING | AV_CODEC_CAP_EXPERIMENTAL))) {
@@ -268,7 +264,6 @@
  * Return the number of bytes read or an error. */
 static int append_packet_chunked(AVIOContext *s, AVPacket *pkt, int size)
 {
-    int64_t orig_pos   = pkt->pos; // av_grow_packet might reset pos
     int orig_size      = pkt->size;
     int ret;
 
@@ -301,7 +296,6 @@
     if (size > 0)
         pkt->flags |= AV_PKT_FLAG_CORRUPT;
 
-    pkt->pos = orig_pos;
     if (!pkt->size)
         av_packet_unref(pkt);
     return pkt->size > orig_size ? pkt->size - orig_size : ret;
@@ -357,13 +351,13 @@
         { 0 }
     };
     int score;
-    AVInputFormat *fmt = av_probe_input_format3(pd, 1, &score);
+    const AVInputFormat *fmt = av_probe_input_format3(pd, 1, &score);
 
     if (fmt) {
         int i;
         av_log(s, AV_LOG_DEBUG,
                "Probe with size=%d, packets=%d detected %s with score=%d\n",
-               pd->buf_size, MAX_PROBE_PACKETS - st->probe_packets,
+               pd->buf_size, s->max_probe_packets - st->probe_packets,
                fmt->name, score);
         for (i = 0; fmt_id_type[i].name; i++) {
             if (!strcmp(fmt->name, fmt_id_type[i].name)) {
@@ -460,10 +454,12 @@
             return ret;
         }
     } else {
-        // TODO: Adapt callers in this file so the line below can use
-        //       av_packet_move_ref() to effectively move the reference
-        //       to the list.
-        pktl->pkt = *pkt;
+        ret = av_packet_make_refcounted(pkt);
+        if (ret < 0) {
+            av_free(pktl);
+            return ret;
+        }
+        av_packet_move_ref(&pktl->pkt, pkt);
     }
 
     if (*packet_buffer)
@@ -535,7 +531,7 @@
 
 
 int avformat_open_input(AVFormatContext **ps, const char *filename,
-                        AVInputFormat *fmt, AVDictionary **options)
+                        ff_const59 AVInputFormat *fmt, AVDictionary **options)
 {
     AVFormatContext *s = *ps;
     int i, ret = 0;
@@ -635,31 +631,26 @@
         s->metadata = s->internal->id3v2_meta;
         s->internal->id3v2_meta = NULL;
     } else if (s->internal->id3v2_meta) {
-        int level = AV_LOG_WARNING;
-        if (s->error_recognition & AV_EF_COMPLIANT)
-            level = AV_LOG_ERROR;
-        av_log(s, level, "Discarding ID3 tags because more suitable tags were found.\n");
+        av_log(s, AV_LOG_WARNING, "Discarding ID3 tags because more suitable tags were found.\n");
         av_dict_free(&s->internal->id3v2_meta);
-        if (s->error_recognition & AV_EF_EXPLODE)
-            return AVERROR_INVALIDDATA;
     }
 
     if (id3v2_extra_meta) {
         if (!strcmp(s->iformat->name, "mp3") || !strcmp(s->iformat->name, "aac") ||
-            !strcmp(s->iformat->name, "tta")) {
+            !strcmp(s->iformat->name, "tta") || !strcmp(s->iformat->name, "wav")) {
             if ((ret = ff_id3v2_parse_apic(s, &id3v2_extra_meta)) < 0)
-                goto fail;
+                goto close;
             if ((ret = ff_id3v2_parse_chapters(s, &id3v2_extra_meta)) < 0)
-                goto fail;
+                goto close;
             if ((ret = ff_id3v2_parse_priv(s, &id3v2_extra_meta)) < 0)
-                goto fail;
+                goto close;
         } else
             av_log(s, AV_LOG_DEBUG, "demuxer does not support additional id3 data, skipping\n");
     }
     ff_id3v2_free_extra_meta(&id3v2_extra_meta);
 
     if ((ret = avformat_queue_attached_pictures(s)) < 0)
-        goto fail;
+        goto close;
 
     if (!(s->flags&AVFMT_FLAG_PRIV_OPT) && s->pb && !s->internal->data_offset)
         s->internal->data_offset = avio_tell(s->pb);
@@ -678,6 +669,9 @@
     *ps = s;
     return 0;
 
+close:
+    if (s->iformat->read_close)
+        s->iformat->read_close(s);
 fail:
     ff_id3v2_free_extra_meta(&id3v2_extra_meta);
     av_dict_free(&tmp);
@@ -833,28 +827,31 @@
     int ret, i, err;
     AVStream *st;
 
+    pkt->data = NULL;
+    pkt->size = 0;
+    av_init_packet(pkt);
+
     for (;;) {
         AVPacketList *pktl = s->internal->raw_packet_buffer;
+        const AVPacket *pkt1;
 
         if (pktl) {
-            *pkt = pktl->pkt;
-            st   = s->streams[pkt->stream_index];
+            st = s->streams[pktl->pkt.stream_index];
             if (s->internal->raw_packet_buffer_remaining_size <= 0)
                 if ((err = probe_codec(s, st, NULL)) < 0)
                     return err;
             if (st->request_probe <= 0) {
-                s->internal->raw_packet_buffer                 = pktl->next;
+                ff_packet_list_get(&s->internal->raw_packet_buffer,
+                                   &s->internal->raw_packet_buffer_end, pkt);
                 s->internal->raw_packet_buffer_remaining_size += pkt->size;
-                av_free(pktl);
                 return 0;
             }
         }
 
-        pkt->data = NULL;
-        pkt->size = 0;
-        av_init_packet(pkt);
         ret = s->iformat->read_packet(s, pkt);
         if (ret < 0) {
+            av_packet_unref(pkt);
+
             /* Some demuxers return FFERROR_REDO when they consume
                data and discard it (ignored streams, junk, extradata).
                We must re-call the demuxer to get the real packet. */
@@ -873,23 +870,26 @@
         }
 
         err = av_packet_make_refcounted(pkt);
-        if (err < 0)
-            return err;
-
-        if ((s->flags & AVFMT_FLAG_DISCARD_CORRUPT) &&
-            (pkt->flags & AV_PKT_FLAG_CORRUPT)) {
-            av_log(s, AV_LOG_WARNING,
-                   "Dropped corrupted packet (stream = %d)\n",
-                   pkt->stream_index);
+        if (err < 0) {
             av_packet_unref(pkt);
-            continue;
+            return err;
         }
 
-        if (pkt->stream_index >= (unsigned)s->nb_streams) {
-            av_log(s, AV_LOG_ERROR, "Invalid stream index %d\n", pkt->stream_index);
-            continue;
+        if (pkt->flags & AV_PKT_FLAG_CORRUPT) {
+            av_log(s, AV_LOG_WARNING,
+                   "Packet corrupt (stream = %d, dts = %s)",
+                   pkt->stream_index, av_ts2str(pkt->dts));
+            if (s->flags & AVFMT_FLAG_DISCARD_CORRUPT) {
+                av_log(s, AV_LOG_WARNING, ", dropping it.\n");
+                av_packet_unref(pkt);
+                continue;
+            }
+            av_log(s, AV_LOG_WARNING, ".\n");
         }
 
+        av_assert0(pkt->stream_index < (unsigned)s->nb_streams &&
+                   "Invalid stream index.\n");
+
         st = s->streams[pkt->stream_index];
 
         if (update_wrap_reference(s, st, pkt->stream_index, pkt) && st->pts_wrap_behavior == AV_PTS_WRAP_SUB_OFFSET) {
@@ -917,11 +917,14 @@
         err = ff_packet_list_put(&s->internal->raw_packet_buffer,
                                  &s->internal->raw_packet_buffer_end,
                                  pkt, 0);
-        if (err)
+        if (err < 0) {
+            av_packet_unref(pkt);
             return err;
-        s->internal->raw_packet_buffer_remaining_size -= pkt->size;
+        }
+        pkt1 = &s->internal->raw_packet_buffer_end->pkt;
+        s->internal->raw_packet_buffer_remaining_size -= pkt1->size;
 
-        if ((err = probe_codec(s, st, pkt)) < 0)
+        if ((err = probe_codec(s, st, pkt1)) < 0)
             return err;
     }
 }
@@ -1013,7 +1016,8 @@
     const AVCodecDescriptor *d = avcodec_descriptor_get(id);
     if (!d)
         return 0;
-    if (d->type == AVMEDIA_TYPE_VIDEO && !(d->props & AV_CODEC_PROP_INTRA_ONLY))
+    if ((d->type == AVMEDIA_TYPE_VIDEO || d->type == AVMEDIA_TYPE_AUDIO) &&
+        !(d->props & AV_CODEC_PROP_INTRA_ONLY))
         return 0;
     return 1;
 }
@@ -1300,7 +1304,7 @@
     }
 
     duration = av_mul_q((AVRational) {pkt->duration, 1}, st->time_base);
-    if (pkt->duration == 0) {
+    if (pkt->duration <= 0) {
         ff_compute_frame_duration(s, &num, &den, st, pc, pkt);
         if (den && num) {
             duration = (AVRational) {num, den};
@@ -1311,7 +1315,7 @@
         }
     }
 
-    if (pkt->duration != 0 && (s->internal->packet_buffer || s->internal->parse_queue))
+    if (pkt->duration > 0 && (s->internal->packet_buffer || s->internal->parse_queue))
         update_initial_durations(s, st, pkt->stream_index, pkt->duration);
 
     /* Correct timestamps with byte offset if demuxers only have timestamps
@@ -1352,7 +1356,7 @@
 
             /* This is tricky: the dts must be incremented by the duration
              * of the frame we are displaying, i.e. the last I- or P-frame. */
-            if (st->last_IP_duration == 0)
+            if (st->last_IP_duration == 0 && (uint64_t)pkt->duration <= INT32_MAX)
                 st->last_IP_duration = pkt->duration;
             if (pkt->dts != AV_NOPTS_VALUE)
                 st->cur_dts = pkt->dts + st->last_IP_duration;
@@ -1364,13 +1368,14 @@
                 next_pts != AV_NOPTS_VALUE)
                 pkt->pts = next_dts;
 
-            st->last_IP_duration = pkt->duration;
+            if ((uint64_t)pkt->duration <= INT32_MAX)
+                st->last_IP_duration = pkt->duration;
             st->last_IP_pts      = pkt->pts;
             /* Cannot compute PTS if not present (we can compute it only
              * by knowing the future. */
         } else if (pkt->pts != AV_NOPTS_VALUE ||
                    pkt->dts != AV_NOPTS_VALUE ||
-                   pkt->duration                ) {
+                   pkt->duration > 0             ) {
 
             /* presentation is not delayed : PTS and DTS are the same */
             if (pkt->pts == AV_NOPTS_VALUE)
@@ -1380,7 +1385,7 @@
             if (pkt->pts == AV_NOPTS_VALUE)
                 pkt->pts = st->cur_dts;
             pkt->dts = pkt->pts;
-            if (pkt->pts != AV_NOPTS_VALUE)
+            if (pkt->pts != AV_NOPTS_VALUE && duration.num >= 0)
                 st->cur_dts = av_add_stable(st->time_base, pkt->pts, duration, 1);
         }
     }
@@ -1401,8 +1406,8 @@
         st->cur_dts = pkt->dts;
 
     if (s->debug & FF_FDEBUG_TS)
-        av_log(s, AV_LOG_DEBUG, "OUTdelayed:%d/%d pts:%s, dts:%s cur_dts:%s\n",
-            presentation_delayed, delay, av_ts2str(pkt->pts), av_ts2str(pkt->dts), av_ts2str(st->cur_dts));
+        av_log(s, AV_LOG_DEBUG, "OUTdelayed:%d/%d pts:%s, dts:%s cur_dts:%s st:%d (%d)\n",
+            presentation_delayed, delay, av_ts2str(pkt->pts), av_ts2str(pkt->dts), av_ts2str(st->cur_dts), st->index, st->id);
 
     /* update flags */
     if (st->codecpar->codec_type == AVMEDIA_TYPE_DATA || is_intra_only(st->codecpar->codec_id))
@@ -1432,31 +1437,30 @@
 /**
  * Parse a packet, add all split parts to parse_queue.
  *
- * @param pkt Packet to parse, NULL when flushing the parser at end of stream.
+ * @param pkt   Packet to parse; must not be NULL.
+ * @param flush Indicates whether to flush. If set, pkt must be blank.
  */
-static int parse_packet(AVFormatContext *s, AVPacket *pkt, int stream_index)
+static int parse_packet(AVFormatContext *s, AVPacket *pkt,
+                        int stream_index, int flush)
 {
-    AVPacket out_pkt = { 0 }, flush_pkt = { 0 };
+    AVPacket out_pkt;
     AVStream *st = s->streams[stream_index];
-    uint8_t *data = pkt ? pkt->data : NULL;
-    int size      = pkt ? pkt->size : 0;
-    int ret = 0, got_output = 0;
+    uint8_t *data = pkt->data;
+    int size      = pkt->size;
+    int ret = 0, got_output = flush;
 
-    if (!pkt) {
-        av_init_packet(&flush_pkt);
-        pkt        = &flush_pkt;
-        got_output = 1;
-    } else if (!size && st->parser->flags & PARSER_FLAG_COMPLETE_FRAMES) {
+    if (size || flush) {
+        av_init_packet(&out_pkt);
+    } else if (st->parser->flags & PARSER_FLAG_COMPLETE_FRAMES) {
         // preserve 0-size sync packets
         compute_pkt_fields(s, st, st->parser, pkt, AV_NOPTS_VALUE, AV_NOPTS_VALUE);
     }
 
-    while (size > 0 || (pkt == &flush_pkt && got_output)) {
+    while (size > 0 || (flush && got_output)) {
         int len;
         int64_t next_pts = pkt->pts;
         int64_t next_dts = pkt->dts;
 
-        av_init_packet(&out_pkt);
         len = av_parser_parse2(st->parser, st->internal->avctx,
                                &out_pkt.data, &out_pkt.size, data, size,
                                pkt->pts, pkt->dts, pkt->pos);
@@ -1536,7 +1540,7 @@
     }
 
     /* end of the stream => close and free the parser */
-    if (pkt == &flush_pkt) {
+    if (flush) {
         av_parser_close(st->parser);
         st->parser = NULL;
     }
@@ -1568,17 +1572,14 @@
 
 static int read_frame_internal(AVFormatContext *s, AVPacket *pkt)
 {
-    int ret = 0, i, got_packet = 0;
+    int ret, i, got_packet = 0;
     AVDictionary *metadata = NULL;
 
-    av_init_packet(pkt);
-
     while (!got_packet && !s->internal->parse_queue) {
         AVStream *st;
-        AVPacket cur_pkt;
 
         /* read next packet */
-        ret = ff_read_packet(s, &cur_pkt);
+        ret = ff_read_packet(s, pkt);
         if (ret < 0) {
             if (ret == AVERROR(EAGAIN))
                 return ret;
@@ -1586,14 +1587,14 @@
             for (i = 0; i < s->nb_streams; i++) {
                 st = s->streams[i];
                 if (st->parser && st->need_parsing)
-                    parse_packet(s, NULL, st->index);
+                    parse_packet(s, pkt, st->index, 1);
             }
             /* all remaining packets are now in parse_queue =>
              * really terminate parsing */
             break;
         }
         ret = 0;
-        st  = s->streams[cur_pkt.stream_index];
+        st  = s->streams[pkt->stream_index];
 
         /* update context if required */
         if (st->internal->need_context_update) {
@@ -1610,38 +1611,42 @@
             }
 
             ret = avcodec_parameters_to_context(st->internal->avctx, st->codecpar);
-            if (ret < 0)
+            if (ret < 0) {
+                av_packet_unref(pkt);
                 return ret;
+            }
 
 #if FF_API_LAVF_AVCTX
 FF_DISABLE_DEPRECATION_WARNINGS
             /* update deprecated public codec context */
             ret = avcodec_parameters_to_context(st->codec, st->codecpar);
-            if (ret < 0)
+            if (ret < 0) {
+                av_packet_unref(pkt);
                 return ret;
+            }
 FF_ENABLE_DEPRECATION_WARNINGS
 #endif
 
             st->internal->need_context_update = 0;
         }
 
-        if (cur_pkt.pts != AV_NOPTS_VALUE &&
-            cur_pkt.dts != AV_NOPTS_VALUE &&
-            cur_pkt.pts < cur_pkt.dts) {
+        if (pkt->pts != AV_NOPTS_VALUE &&
+            pkt->dts != AV_NOPTS_VALUE &&
+            pkt->pts < pkt->dts) {
             av_log(s, AV_LOG_WARNING,
                    "Invalid timestamps stream=%d, pts=%s, dts=%s, size=%d\n",
-                   cur_pkt.stream_index,
-                   av_ts2str(cur_pkt.pts),
-                   av_ts2str(cur_pkt.dts),
-                   cur_pkt.size);
+                   pkt->stream_index,
+                   av_ts2str(pkt->pts),
+                   av_ts2str(pkt->dts),
+                   pkt->size);
         }
         if (s->debug & FF_FDEBUG_TS)
             av_log(s, AV_LOG_DEBUG,
                    "ff_read_packet stream=%d, pts=%s, dts=%s, size=%d, duration=%"PRId64", flags=%d\n",
-                   cur_pkt.stream_index,
-                   av_ts2str(cur_pkt.pts),
-                   av_ts2str(cur_pkt.dts),
-                   cur_pkt.size, cur_pkt.duration, cur_pkt.flags);
+                   pkt->stream_index,
+                   av_ts2str(pkt->pts),
+                   av_ts2str(pkt->dts),
+                   pkt->size, pkt->duration, pkt->flags);
 
         if (st->need_parsing && !st->parser && !(s->flags & AVFMT_FLAG_NOPARSE)) {
             st->parser = av_parser_init(st->codecpar->codec_id);
@@ -1661,7 +1666,6 @@
 
         if (!st->need_parsing || !st->parser) {
             /* no parsing needed: we just output the packet as is */
-            *pkt = cur_pkt;
             compute_pkt_fields(s, st, NULL, pkt, AV_NOPTS_VALUE, AV_NOPTS_VALUE);
             if ((s->iformat->flags & AVFMT_GENERIC_INDEX) &&
                 (pkt->flags & AV_PKT_FLAG_KEY) && pkt->dts != AV_NOPTS_VALUE) {
@@ -1671,7 +1675,7 @@
             }
             got_packet = 1;
         } else if (st->discard < AVDISCARD_ALL) {
-            if ((ret = parse_packet(s, &cur_pkt, cur_pkt.stream_index)) < 0)
+            if ((ret = parse_packet(s, pkt, pkt->stream_index, 0)) < 0)
                 return ret;
             st->codecpar->sample_rate = st->internal->avctx->sample_rate;
             st->codecpar->bit_rate = st->internal->avctx->bit_rate;
@@ -1680,15 +1684,12 @@
             st->codecpar->codec_id = st->internal->avctx->codec_id;
         } else {
             /* free packet */
-            av_packet_unref(&cur_pkt);
+            av_packet_unref(pkt);
         }
         if (pkt->flags & AV_PKT_FLAG_KEY)
             st->skip_to_keyframe = 0;
         if (st->skip_to_keyframe) {
-            av_packet_unref(&cur_pkt);
-            if (got_packet) {
-                *pkt = cur_pkt;
-            }
+            av_packet_unref(pkt);
             got_packet = 0;
         }
     }
@@ -1761,6 +1762,11 @@
                av_ts2str(pkt->dts),
                pkt->size, pkt->duration, pkt->flags);
 
+    /* A demuxer might have returned EOF because of an IO error, let's
+     * propagate this back to the user. */
+    if (ret == AVERROR_EOF && s->pb && s->pb->error < 0 && s->pb->error != AVERROR(EAGAIN))
+        ret = s->pb->error;
+
     return ret;
 }
 
@@ -1839,10 +1845,11 @@
 
         ret = ff_packet_list_put(&s->internal->packet_buffer,
                                  &s->internal->packet_buffer_end,
-                                 pkt, FF_PACKETLIST_FLAG_REF_PACKET);
-        av_packet_unref(pkt);
-        if (ret < 0)
+                                 pkt, 0);
+        if (ret < 0) {
+            av_packet_unref(pkt);
             return ret;
+        }
     }
 
 return_packet:
@@ -1937,7 +1944,7 @@
             /* We set the current DTS to an unspecified origin. */
             st->cur_dts = AV_NOPTS_VALUE;
 
-        st->probe_packets = MAX_PROBE_PACKETS;
+        st->probe_packets = s->max_probe_packets;
 
         for (j = 0; j < MAX_REORDER_DELAY + 1; j++)
             st->pts_buffer[j] = AV_NOPTS_VALUE;
@@ -2095,6 +2102,8 @@
     //We could use URLProtocol flags here but as many user applications do not use URLProtocols this would be unreliable
     const char *proto = avio_find_protocol_name(s->url);
 
+    av_assert0(time_tolerance >= 0);
+
     if (!proto) {
         av_log(s, AV_LOG_INFO,
                "Protocol name not provided, cannot determine if input is local or "
@@ -2122,7 +2131,7 @@
                 for (; i2 < st2->nb_index_entries; i2++) {
                     AVIndexEntry *e2 = &st2->index_entries[i2];
                     int64_t e2_pts = av_rescale_q(e2->timestamp, st2->time_base, AV_TIME_BASE_Q);
-                    if (e2_pts - e1_pts < time_tolerance)
+                    if (e2_pts < e1_pts || e2_pts - (uint64_t)e1_pts < time_tolerance)
                         continue;
                     pos_delta = FFMAX(pos_delta, e1->pos - e2->pos);
                     break;
@@ -2135,7 +2144,13 @@
     /* XXX This could be adjusted depending on protocol*/
     if (s->pb->buffer_size < pos_delta && pos_delta < (1<<24)) {
         av_log(s, AV_LOG_VERBOSE, "Reconfiguring buffers to size %"PRId64"\n", pos_delta);
-        ffio_set_buf_size(s->pb, pos_delta);
+
+        /* realloc the buffer and the original data will be retained */
+        if (ffio_realloc_buf(s->pb, pos_delta)) {
+            av_log(s, AV_LOG_ERROR, "Realloc buffer fail.\n");
+            return;
+        }
+
         s->pb->short_seek_threshold = FFMAX(s->pb->short_seek_threshold, pos_delta/2);
     }
 
@@ -2162,7 +2177,7 @@
 int ff_seek_frame_binary(AVFormatContext *s, int stream_index,
                          int64_t target_ts, int flags)
 {
-    AVInputFormat *avif = s->iformat;
+    const AVInputFormat *avif = s->iformat;
     int64_t av_uninit(pos_min), av_uninit(pos_max), pos, pos_limit;
     int64_t ts_min, ts_max, ts;
     int index;
@@ -2895,9 +2910,9 @@
             case AVMEDIA_TYPE_VIDEO:
             case AVMEDIA_TYPE_AUDIO:
                 if (st->start_time != AV_NOPTS_VALUE || st->first_dts  != AV_NOPTS_VALUE) {
-                    av_log(ic, AV_LOG_DEBUG, "stream %d : no PTS found at end of file, duration not set\n", i);
+                    av_log(ic, AV_LOG_WARNING, "stream %d : no PTS found at end of file, duration not set\n", i);
                 } else
-                    av_log(ic, AV_LOG_DEBUG, "stream %d : no TS found at start of file, duration not set\n", i);
+                    av_log(ic, AV_LOG_WARNING, "stream %d : no TS found at start of file, duration not set\n", i);
             }
         }
     }
@@ -2917,6 +2932,18 @@
     }
 }
 
+/* 1:1 map to AVDurationEstimationMethod */
+static const char *duration_name[] = {
+    [AVFMT_DURATION_FROM_PTS]     = "pts",
+    [AVFMT_DURATION_FROM_STREAM]  = "stream",
+    [AVFMT_DURATION_FROM_BITRATE] = "bit rate",
+};
+
+static const char *duration_estimate_name(enum AVDurationEstimationMethod method)
+{
+    return duration_name[method];
+}
+
 static void estimate_timings(AVFormatContext *ic, int64_t old_offset)
 {
     int64_t file_size;
@@ -2939,7 +2966,11 @@
         /* at least one component has timings - we use them for all
          * the components */
         fill_all_stream_timings(ic);
-        ic->duration_estimation_method = AVFMT_DURATION_FROM_STREAM;
+        /* nut demuxer estimate the duration from PTS */
+        if(!strcmp(ic->iformat->name, "nut"))
+            ic->duration_estimation_method = AVFMT_DURATION_FROM_PTS;
+        else
+            ic->duration_estimation_method = AVFMT_DURATION_FROM_STREAM;
     } else {
         /* less precise: use bitrate info */
         estimate_timings_from_bit_rate(ic);
@@ -2952,14 +2983,16 @@
         AVStream av_unused *st;
         for (i = 0; i < ic->nb_streams; i++) {
             st = ic->streams[i];
-            av_log(ic, AV_LOG_TRACE, "stream %d: start_time: %0.3f duration: %0.3f\n", i,
-                   (double) st->start_time * av_q2d(st->time_base),
-                   (double) st->duration   * av_q2d(st->time_base));
+            if (st->time_base.den)
+                av_log(ic, AV_LOG_TRACE, "stream %d: start_time: %0.3f duration: %0.3f\n", i,
+                       (double) st->start_time * av_q2d(st->time_base),
+                       (double) st->duration   * av_q2d(st->time_base));
         }
         av_log(ic, AV_LOG_TRACE,
-                "format: start_time: %0.3f duration: %0.3f bitrate=%"PRId64" kb/s\n",
+                "format: start_time: %0.3f duration: %0.3f (estimate from %s) bitrate=%"PRId64" kb/s\n",
                 (double) ic->start_time / AV_TIME_BASE,
                 (double) ic->duration   / AV_TIME_BASE,
+                duration_estimate_name(ic->duration_estimation_method),
                 (int64_t)ic->bit_rate / 1000);
     }
 }
@@ -3012,8 +3045,8 @@
 }
 
 /* returns 1 or 0 if or if not decoded data was returned, or a negative error */
-static int try_decode_frame(AVFormatContext *s, AVStream *st, AVPacket *avpkt,
-                            AVDictionary **options)
+static int try_decode_frame(AVFormatContext *s, AVStream *st,
+                            const AVPacket *avpkt, AVDictionary **options)
 {
     AVCodecContext *avctx = st->internal->avctx;
     const AVCodec *codec;
@@ -3088,6 +3121,8 @@
         } else if (avctx->codec_type == AVMEDIA_TYPE_SUBTITLE) {
             ret = avcodec_decode_subtitle2(avctx, &subtitle,
                                            &got_picture, &pkt);
+            if (got_picture)
+                avsubtitle_free(&subtitle);
             if (ret >= 0)
                 pkt.size = 0;
         }
@@ -3346,8 +3381,10 @@
                 }
             }
         }
-        st->info->duration_count++;
-        st->info->rfps_duration_sum += duration;
+        if (st->info->rfps_duration_sum <= INT64_MAX - duration) {
+            st->info->duration_count++;
+            st->info->rfps_duration_sum += duration;
+        }
 
         if (st->info->duration_count % 10 == 0) {
             int n = st->info->duration_count;
@@ -3503,7 +3540,7 @@
     return ret;
 }
 
-static int extract_extradata(AVStream *st, AVPacket *pkt)
+static int extract_extradata(AVStream *st, const AVPacket *pkt)
 {
     AVStreamInternal *sti = st->internal;
     AVPacket *pkt_ref;
@@ -3560,13 +3597,28 @@
     return 0;
 }
 
+static int add_coded_side_data(AVStream *st, AVCodecContext *avctx)
+{
+    int i;
+
+    for (i = 0; i < avctx->nb_coded_side_data; i++) {
+        const AVPacketSideData *sd_src = &avctx->coded_side_data[i];
+        uint8_t *dst_data;
+        dst_data = av_stream_new_side_data(st, sd_src->type, sd_src->size);
+        if (!dst_data)
+            return AVERROR(ENOMEM);
+        memcpy(dst_data, sd_src->data, sd_src->size);
+    }
+    return 0;
+}
+
 int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options)
 {
     int i, count = 0, ret = 0, j;
     int64_t read_size;
     AVStream *st;
     AVCodecContext *avctx;
-    AVPacket pkt1, *pkt;
+    AVPacket pkt1;
     int64_t old_offset  = avio_tell(ic->pb);
     // new streams might appear, no options for those
     int orig_nb_streams = ic->nb_streams;
@@ -3685,6 +3737,7 @@
 
     read_size = 0;
     for (;;) {
+        const AVPacket *pkt;
         int analyzed_all_streams;
         if (ff_check_interrupt(&ic->interrupt_callback)) {
             ret = AVERROR_EXIT;
@@ -3738,18 +3791,18 @@
         }
         analyzed_all_streams = 0;
         if (!missing_streams || !*missing_streams)
-        if (i == ic->nb_streams) {
-            analyzed_all_streams = 1;
-            /* NOTE: If the format has no header, then we need to read some
-             * packets to get most of the streams, so we cannot stop here. */
-            if (!(ic->ctx_flags & AVFMTCTX_NOHEADER)) {
-                /* If we found the info for all the codecs, we can stop. */
-                ret = count;
-                av_log(ic, AV_LOG_DEBUG, "All info found\n");
-                flush_codecs = 0;
-                break;
+            if (i == ic->nb_streams) {
+                analyzed_all_streams = 1;
+                /* NOTE: If the format has no header, then we need to read some
+                 * packets to get most of the streams, so we cannot stop here. */
+                if (!(ic->ctx_flags & AVFMTCTX_NOHEADER)) {
+                    /* If we found the info for all the codecs, we can stop. */
+                    ret = count;
+                    av_log(ic, AV_LOG_DEBUG, "All info found\n");
+                    flush_codecs = 0;
+                    break;
+                }
             }
-        }
         /* We did not get all the codec info, but we read too much data. */
         if (read_size >= probesize) {
             ret = count;
@@ -3778,14 +3831,16 @@
             break;
         }
 
-        pkt = &pkt1;
-
         if (!(ic->flags & AVFMT_FLAG_NOBUFFER)) {
             ret = ff_packet_list_put(&ic->internal->packet_buffer,
                                      &ic->internal->packet_buffer_end,
-                                     pkt, 0);
+                                     &pkt1, 0);
             if (ret < 0)
-                goto find_stream_info_err;
+                goto unref_then_goto_end;
+
+            pkt = &ic->internal->packet_buffer_end->pkt;
+        } else {
+            pkt = &pkt1;
         }
 
         st = ic->streams[pkt->stream_index];
@@ -3796,7 +3851,7 @@
         if (!st->internal->avctx_inited) {
             ret = avcodec_parameters_to_context(avctx, st->codecpar);
             if (ret < 0)
-                goto find_stream_info_err;
+                goto unref_then_goto_end;
             st->internal->avctx_inited = 1;
         }
 
@@ -3818,7 +3873,7 @@
              * sequence, we treat it as a discontinuity. */
             if (st->info->fps_last_dts != AV_NOPTS_VALUE &&
                 st->info->fps_last_dts_idx > st->info->fps_first_dts_idx &&
-                (pkt->dts - st->info->fps_last_dts) / 1000 >
+                (pkt->dts - (uint64_t)st->info->fps_last_dts) / 1000 >
                 (st->info->fps_last_dts     - (uint64_t)st->info->fps_first_dts) /
                 (st->info->fps_last_dts_idx - st->info->fps_first_dts_idx)) {
                 av_log(ic, AV_LOG_WARNING,
@@ -3863,7 +3918,7 @@
                        limit,
                        t, pkt->stream_index);
                 if (ic->flags & AVFMT_FLAG_NOBUFFER)
-                    av_packet_unref(pkt);
+                    av_packet_unref(&pkt1);
                 break;
             }
             if (pkt->duration) {
@@ -3884,7 +3939,7 @@
         if (!st->internal->avctx->extradata) {
             ret = extract_extradata(st, pkt);
             if (ret < 0)
-                goto find_stream_info_err;
+                goto unref_then_goto_end;
         }
 
         /* If still no information, we try to open the codec and to
@@ -3900,7 +3955,7 @@
                          (options && i < orig_nb_streams) ? &options[i] : NULL);
 
         if (ic->flags & AVFMT_FLAG_NOBUFFER)
-            av_packet_unref(pkt);
+            av_packet_unref(&pkt1);
 
         st->codec_info_nb_frames++;
         count++;
@@ -4013,7 +4068,7 @@
 
             if (!st->r_frame_rate.num) {
                 if (    avctx->time_base.den * (int64_t) st->time_base.num
-                    <= avctx->time_base.num * avctx->ticks_per_frame * (int64_t) st->time_base.den) {
+                    <= avctx->time_base.num * avctx->ticks_per_frame * (uint64_t) st->time_base.den) {
                     av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den,
                               avctx->time_base.den, (int64_t)avctx->time_base.num * avctx->ticks_per_frame, INT_MAX);
                 } else {
@@ -4096,6 +4151,9 @@
             ret = avcodec_parameters_from_context(st->codecpar, st->internal->avctx);
             if (ret < 0)
                 goto find_stream_info_err;
+            ret = add_coded_side_data(st, st->internal->avctx);
+            if (ret < 0)
+                goto find_stream_info_err;
 #if FF_API_LOWRES
             // The decoder might reduce the video size by the lowres factor.
             if (st->internal->avctx->lowres && orig_w) {
@@ -4160,6 +4218,10 @@
         av_log(ic, AV_LOG_DEBUG, "After avformat_find_stream_info() pos: %"PRId64" bytes read:%"PRId64" seeks:%d frames:%d\n",
                avio_tell(ic->pb), ic->pb->bytes_read, ic->pb->seek_count, count);
     return ret;
+
+unref_then_goto_end:
+    av_packet_unref(&pkt1);
+    goto find_stream_info_err;
 }
 
 AVProgram *av_find_program_from_stream(AVFormatContext *ic, AVProgram *last, int s)
@@ -4217,7 +4279,8 @@
                 continue;
             }
         }
-        disposition = !(st->disposition & (AV_DISPOSITION_HEARING_IMPAIRED | AV_DISPOSITION_VISUAL_IMPAIRED));
+        disposition = !(st->disposition & (AV_DISPOSITION_HEARING_IMPAIRED | AV_DISPOSITION_VISUAL_IMPAIRED))
+                      + !! (st->disposition & AV_DISPOSITION_DEFAULT);
         count = st->codec_info_nb_frames;
         bitrate = par->bit_rate;
         multiframe = FFMIN(5, count);
@@ -4392,21 +4455,26 @@
     if (!s)
         return;
 
+    if (s->oformat && s->oformat->deinit && s->internal->initialized)
+        s->oformat->deinit(s);
+
     av_opt_free(s);
     if (s->iformat && s->iformat->priv_class && s->priv_data)
         av_opt_free(s->priv_data);
     if (s->oformat && s->oformat->priv_class && s->priv_data)
         av_opt_free(s->priv_data);
 
-    for (i = s->nb_streams - 1; i >= 0; i--)
-        ff_free_stream(s, s->streams[i]);
+    for (i = 0; i < s->nb_streams; i++)
+        free_stream(&s->streams[i]);
+    s->nb_streams = 0;
 
-
-    for (i = s->nb_programs - 1; i >= 0; i--) {
+    for (i = 0; i < s->nb_programs; i++) {
         av_dict_free(&s->programs[i]->metadata);
         av_freep(&s->programs[i]->stream_index);
         av_freep(&s->programs[i]);
     }
+    s->nb_programs = 0;
+
     av_freep(&s->programs);
     av_freep(&s->priv_data);
     while (s->nb_chapters--) {
@@ -4522,7 +4590,7 @@
     st->start_time = AV_NOPTS_VALUE;
     st->duration   = AV_NOPTS_VALUE;
     st->first_dts     = AV_NOPTS_VALUE;
-    st->probe_packets = MAX_PROBE_PACKETS;
+    st->probe_packets = s->max_probe_packets;
     st->pts_wrap_reference = AV_NOPTS_VALUE;
     st->pts_wrap_behavior = AV_PTS_WRAP_IGNORE;
 
@@ -4729,7 +4797,7 @@
                   char *hostname, int hostname_size,
                   int *port_ptr, char *path, int path_size, const char *url)
 {
-    const char *p, *ls, *ls2, *at, *at2, *col, *brk;
+    const char *p, *ls, *at, *at2, *col, *brk;
 
     if (port_ptr)
         *port_ptr = -1;
@@ -4757,16 +4825,8 @@
     }
 
     /* separate path from hostname */
-    ls = strchr(p, '/');
-    ls2 = strchr(p, '?');
-    if (!ls)
-        ls = ls2;
-    else if (ls && ls2)
-        ls = FFMIN(ls, ls2);
-    if (ls)
-        av_strlcpy(path, ls, path_size);
-    else
-        ls = &p[strlen(p)];  // XXX
+    ls = p + strcspn(p, "/?#");
+    av_strlcpy(path, ls, path_size);
 
     /* the rest is hostname, use that to parse auth/port */
     if (ls != p) {
@@ -5096,244 +5156,211 @@
     return fr;
 }
 
+/**
+ * Matches a stream specifier (but ignores requested index).
+ *
+ * @param indexptr set to point to the requested stream index if there is one
+ *
+ * @return <0 on error
+ *         0  if st is NOT a matching stream
+ *         >0 if st is a matching stream
+ */
+static int match_stream_specifier(AVFormatContext *s, AVStream *st,
+                                  const char *spec, const char **indexptr, AVProgram **p)
+{
+    int match = 1;                      /* Stores if the specifier matches so far. */
+    while (*spec) {
+        if (*spec <= '9' && *spec >= '0') { /* opt:index */
+            if (indexptr)
+                *indexptr = spec;
+            return match;
+        } else if (*spec == 'v' || *spec == 'a' || *spec == 's' || *spec == 'd' ||
+                   *spec == 't' || *spec == 'V') { /* opt:[vasdtV] */
+            enum AVMediaType type;
+            int nopic = 0;
+
+            switch (*spec++) {
+            case 'v': type = AVMEDIA_TYPE_VIDEO;      break;
+            case 'a': type = AVMEDIA_TYPE_AUDIO;      break;
+            case 's': type = AVMEDIA_TYPE_SUBTITLE;   break;
+            case 'd': type = AVMEDIA_TYPE_DATA;       break;
+            case 't': type = AVMEDIA_TYPE_ATTACHMENT; break;
+            case 'V': type = AVMEDIA_TYPE_VIDEO; nopic = 1; break;
+            default:  av_assert0(0);
+            }
+            if (*spec && *spec++ != ':')         /* If we are not at the end, then another specifier must follow. */
+                return AVERROR(EINVAL);
+
+#if FF_API_LAVF_AVCTX
+FF_DISABLE_DEPRECATION_WARNINGS
+            if (type != st->codecpar->codec_type
+               && (st->codecpar->codec_type != AVMEDIA_TYPE_UNKNOWN || st->codec->codec_type != type))
+                match = 0;
+    FF_ENABLE_DEPRECATION_WARNINGS
+#else
+            if (type != st->codecpar->codec_type)
+                match = 0;
+#endif
+            if (nopic && (st->disposition & AV_DISPOSITION_ATTACHED_PIC))
+                match = 0;
+        } else if (*spec == 'p' && *(spec + 1) == ':') {
+            int prog_id, i, j;
+            int found = 0;
+            char *endptr;
+            spec += 2;
+            prog_id = strtol(spec, &endptr, 0);
+            /* Disallow empty id and make sure that if we are not at the end, then another specifier must follow. */
+            if (spec == endptr || (*endptr && *endptr++ != ':'))
+                return AVERROR(EINVAL);
+            spec = endptr;
+            if (match) {
+                for (i = 0; i < s->nb_programs; i++) {
+                    if (s->programs[i]->id != prog_id)
+                        continue;
+
+                    for (j = 0; j < s->programs[i]->nb_stream_indexes; j++) {
+                        if (st->index == s->programs[i]->stream_index[j]) {
+                            found = 1;
+                            if (p)
+                                *p = s->programs[i];
+                            i = s->nb_programs;
+                            break;
+                        }
+                    }
+                }
+            }
+            if (!found)
+                match = 0;
+        } else if (*spec == '#' ||
+                   (*spec == 'i' && *(spec + 1) == ':')) {
+            int stream_id;
+            char *endptr;
+            spec += 1 + (*spec == 'i');
+            stream_id = strtol(spec, &endptr, 0);
+            if (spec == endptr || *endptr)                /* Disallow empty id and make sure we are at the end. */
+                return AVERROR(EINVAL);
+            return match && (stream_id == st->id);
+        } else if (*spec == 'm' && *(spec + 1) == ':') {
+            AVDictionaryEntry *tag;
+            char *key, *val;
+            int ret;
+
+            if (match) {
+               spec += 2;
+               val = strchr(spec, ':');
+
+               key = val ? av_strndup(spec, val - spec) : av_strdup(spec);
+               if (!key)
+                   return AVERROR(ENOMEM);
+
+               tag = av_dict_get(st->metadata, key, NULL, 0);
+               if (tag) {
+                   if (!val || !strcmp(tag->value, val + 1))
+                       ret = 1;
+                   else
+                       ret = 0;
+               } else
+                   ret = 0;
+
+               av_freep(&key);
+            }
+            return match && ret;
+        } else if (*spec == 'u' && *(spec + 1) == '\0') {
+            AVCodecParameters *par = st->codecpar;
+#if FF_API_LAVF_AVCTX
+FF_DISABLE_DEPRECATION_WARNINGS
+            AVCodecContext *codec = st->codec;
+FF_ENABLE_DEPRECATION_WARNINGS
+#endif
+            int val;
+            switch (par->codec_type) {
+            case AVMEDIA_TYPE_AUDIO:
+                val = par->sample_rate && par->channels;
+#if FF_API_LAVF_AVCTX
+                val = val || (codec->sample_rate && codec->channels);
+#endif
+                if (par->format == AV_SAMPLE_FMT_NONE
+#if FF_API_LAVF_AVCTX
+                    && codec->sample_fmt == AV_SAMPLE_FMT_NONE
+#endif
+                    )
+                    return 0;
+                break;
+            case AVMEDIA_TYPE_VIDEO:
+                val = par->width && par->height;
+#if FF_API_LAVF_AVCTX
+                val = val || (codec->width && codec->height);
+#endif
+                if (par->format == AV_PIX_FMT_NONE
+#if FF_API_LAVF_AVCTX
+                    && codec->pix_fmt == AV_PIX_FMT_NONE
+#endif
+                    )
+                    return 0;
+                break;
+            case AVMEDIA_TYPE_UNKNOWN:
+                val = 0;
+                break;
+            default:
+                val = 1;
+                break;
+            }
+#if FF_API_LAVF_AVCTX
+            return match && ((par->codec_id != AV_CODEC_ID_NONE || codec->codec_id != AV_CODEC_ID_NONE) && val != 0);
+#else
+            return match && (par->codec_id != AV_CODEC_ID_NONE && val != 0);
+#endif
+        } else {
+            return AVERROR(EINVAL);
+        }
+    }
+
+    return match;
+}
+
+
 int avformat_match_stream_specifier(AVFormatContext *s, AVStream *st,
                                     const char *spec)
 {
-    if (*spec <= '9' && *spec >= '0') /* opt:index */
-        return strtol(spec, NULL, 0) == st->index;
-    else if (*spec == 'v' || *spec == 'a' || *spec == 's' || *spec == 'd' ||
-             *spec == 't' || *spec == 'V') { /* opt:[vasdtV] */
-        enum AVMediaType type;
-        int nopic = 0;
+    int ret, index;
+    char *endptr;
+    const char *indexptr = NULL;
+    AVProgram *p = NULL;
+    int nb_streams;
 
-        switch (*spec++) {
-        case 'v': type = AVMEDIA_TYPE_VIDEO;      break;
-        case 'a': type = AVMEDIA_TYPE_AUDIO;      break;
-        case 's': type = AVMEDIA_TYPE_SUBTITLE;   break;
-        case 'd': type = AVMEDIA_TYPE_DATA;       break;
-        case 't': type = AVMEDIA_TYPE_ATTACHMENT; break;
-        case 'V': type = AVMEDIA_TYPE_VIDEO; nopic = 1; break;
-        default:  av_assert0(0);
-        }
-#if FF_API_LAVF_AVCTX
-FF_DISABLE_DEPRECATION_WARNINGS
-        if (type != st->codecpar->codec_type
-           && (st->codecpar->codec_type != AVMEDIA_TYPE_UNKNOWN || st->codec->codec_type != type))
-            return 0;
-FF_ENABLE_DEPRECATION_WARNINGS
-#else
-        if (type != st->codecpar->codec_type)
-            return 0;
-#endif
-        if (nopic && (st->disposition & AV_DISPOSITION_ATTACHED_PIC))
-            return 0;
-        if (*spec++ == ':') { /* possibly followed by :index */
-            int i, index = strtol(spec, NULL, 0);
-            for (i = 0; i < s->nb_streams; i++) {
-#if FF_API_LAVF_AVCTX
-FF_DISABLE_DEPRECATION_WARNINGS
-                if ((s->streams[i]->codecpar->codec_type == type
-                      || s->streams[i]->codec->codec_type == type
-                    ) &&
-                    !(nopic && (st->disposition & AV_DISPOSITION_ATTACHED_PIC)) &&
-                    index-- == 0)
-                    return i == st->index;
-FF_ENABLE_DEPRECATION_WARNINGS
-#else
-                if ((s->streams[i]->codecpar->codec_type == type) &&
-                    !(nopic && (st->disposition & AV_DISPOSITION_ATTACHED_PIC)) &&
-                    index-- == 0)
-                    return i == st->index;
-#endif
-            }
-            return 0;
-        }
-        return 1;
-    } else if (*spec == 'p' && *(spec + 1) == ':') {
-        int prog_id, i, j;
-        char *endptr;
-        spec += 2;
-        prog_id = strtol(spec, &endptr, 0);
-        for (i = 0; i < s->nb_programs; i++) {
-            if (s->programs[i]->id != prog_id)
-                continue;
+    ret = match_stream_specifier(s, st, spec, &indexptr, &p);
+    if (ret < 0)
+        goto error;
 
-            if (*endptr++ == ':') {  // p:<id>:....
-                if ( *endptr == 'a' || *endptr == 'v' ||
-                     *endptr == 's' || *endptr == 'd') {  // p:<id>:<st_type>[:<index>]
-                    enum AVMediaType type;
-
-                    switch (*endptr++) {
-                    case 'v': type = AVMEDIA_TYPE_VIDEO;      break;
-                    case 'a': type = AVMEDIA_TYPE_AUDIO;      break;
-                    case 's': type = AVMEDIA_TYPE_SUBTITLE;   break;
-                    case 'd': type = AVMEDIA_TYPE_DATA;       break;
-                    default:  av_assert0(0);
-                    }
-                    if (*endptr++ == ':') {  // p:<id>:<st_type>:<index>
-                        int stream_idx = strtol(endptr, NULL, 0), type_counter = 0;
-                        for (j = 0; j < s->programs[i]->nb_stream_indexes; j++) {
-                            int stream_index = s->programs[i]->stream_index[j];
-                            if (st->index == s->programs[i]->stream_index[j]) {
-#if FF_API_LAVF_AVCTX
-FF_DISABLE_DEPRECATION_WARNINGS
-                                return type_counter == stream_idx &&
-                                       (type == st->codecpar->codec_type ||
-                                        type == st->codec->codec_type);
-FF_ENABLE_DEPRECATION_WARNINGS
-#else
-                                return type_counter == stream_idx &&
-                                       type == st->codecpar->codec_type;
-#endif
-                             }
-#if FF_API_LAVF_AVCTX
-FF_DISABLE_DEPRECATION_WARNINGS
-                            if (type == s->streams[stream_index]->codecpar->codec_type ||
-                                type == s->streams[stream_index]->codec->codec_type)
-                                type_counter++;
-FF_ENABLE_DEPRECATION_WARNINGS
-#else
-                            if (type == s->streams[stream_index]->codecpar->codec_type)
-                                type_counter++;
-#endif
-                        }
-                        return 0;
-                    } else {  // p:<id>:<st_type>
-                        for (j = 0; j < s->programs[i]->nb_stream_indexes; j++)
-                            if (st->index == s->programs[i]->stream_index[j]) {
-#if FF_API_LAVF_AVCTX
-FF_DISABLE_DEPRECATION_WARNINGS
-                                 return type == st->codecpar->codec_type ||
-                                        type == st->codec->codec_type;
-FF_ENABLE_DEPRECATION_WARNINGS
-#else
-                                 return type == st->codecpar->codec_type;
-#endif
-                            }
-                        return 0;
-                    }
-
-                } else if ( *endptr == 'm') { // p:<id>:m:<metadata_spec>
-                    AVDictionaryEntry *tag;
-                    char *key, *val;
-                    int ret = 0;
-
-                    if (*(++endptr) != ':') {
-                        av_log(s, AV_LOG_ERROR, "Invalid stream specifier syntax, missing ':' sign after :m.\n");
-                        return AVERROR(EINVAL);
-                    }
-
-                    val = strchr(++endptr, ':');
-                    key = val ? av_strndup(endptr, val - endptr) : av_strdup(endptr);
-                    if (!key)
-                        return AVERROR(ENOMEM);
-
-                    for (j = 0; j < s->programs[i]->nb_stream_indexes; j++)
-                        if (st->index == s->programs[i]->stream_index[j]) {
-                            tag = av_dict_get(st->metadata, key, NULL, 0);
-                            if (tag && (!val || !strcmp(tag->value, val + 1)))
-                                ret = 1;
-
-                            break;
-                        }
-
-                    av_freep(&key);
-                    return ret;
-
-                } else {  // p:<id>:<index>
-                    int stream_idx = strtol(endptr, NULL, 0);
-                    return stream_idx >= 0 &&
-                           stream_idx < s->programs[i]->nb_stream_indexes &&
-                           st->index == s->programs[i]->stream_index[stream_idx];
-                }
-            }
-
-            for (j = 0; j < s->programs[i]->nb_stream_indexes; j++)
-                if (st->index == s->programs[i]->stream_index[j])
-                    return 1;
-        }
-        return 0;
-    } else if (*spec == '#' ||
-               (*spec == 'i' && *(spec + 1) == ':')) {
-        int stream_id;
-        char *endptr;
-        spec += 1 + (*spec == 'i');
-        stream_id = strtol(spec, &endptr, 0);
-        if (!*endptr)
-            return stream_id == st->id;
-    } else if (*spec == 'm' && *(spec + 1) == ':') {
-        AVDictionaryEntry *tag;
-        char *key, *val;
-        int ret;
-
-        spec += 2;
-        val = strchr(spec, ':');
-
-        key = val ? av_strndup(spec, val - spec) : av_strdup(spec);
-        if (!key)
-            return AVERROR(ENOMEM);
-
-        tag = av_dict_get(st->metadata, key, NULL, 0);
-        if (tag) {
-            if (!val || !strcmp(tag->value, val + 1))
-                ret = 1;
-            else
-                ret = 0;
-        } else
-            ret = 0;
-
-        av_freep(&key);
+    if (!indexptr)
         return ret;
-    } else if (*spec == 'u') {
-        AVCodecParameters *par = st->codecpar;
-#if FF_API_LAVF_AVCTX
-FF_DISABLE_DEPRECATION_WARNINGS
-        AVCodecContext *codec = st->codec;
-FF_ENABLE_DEPRECATION_WARNINGS
-#endif
-        int val;
-        switch (par->codec_type) {
-        case AVMEDIA_TYPE_AUDIO:
-            val = par->sample_rate && par->channels;
-#if FF_API_LAVF_AVCTX
-            val = val || (codec->sample_rate && codec->channels);
-#endif
-            if (par->format == AV_SAMPLE_FMT_NONE
-#if FF_API_LAVF_AVCTX
-                && codec->sample_fmt == AV_SAMPLE_FMT_NONE
-#endif
-                )
-                return 0;
-            break;
-        case AVMEDIA_TYPE_VIDEO:
-            val = par->width && par->height;
-#if FF_API_LAVF_AVCTX
-            val = val || (codec->width && codec->height);
-#endif
-            if (par->format == AV_PIX_FMT_NONE
-#if FF_API_LAVF_AVCTX
-                && codec->pix_fmt == AV_PIX_FMT_NONE
-#endif
-                )
-                return 0;
-            break;
-        case AVMEDIA_TYPE_UNKNOWN:
-            val = 0;
-            break;
-        default:
-            val = 1;
-            break;
-        }
-#if FF_API_LAVF_AVCTX
-        return (par->codec_id != AV_CODEC_ID_NONE || codec->codec_id != AV_CODEC_ID_NONE) && val != 0;
-#else
-        return par->codec_id != AV_CODEC_ID_NONE && val != 0;
-#endif
-    } else if (!*spec) /* empty specifier, matches everything */
-        return 1;
 
-    av_log(s, AV_LOG_ERROR, "Invalid stream specifier: %s.\n", spec);
-    return AVERROR(EINVAL);
+    index = strtol(indexptr, &endptr, 0);
+    if (*endptr) {                  /* We can't have anything after the requested index. */
+        ret = AVERROR(EINVAL);
+        goto error;
+    }
+
+    /* This is not really needed but saves us a loop for simple stream index specifiers. */
+    if (spec == indexptr)
+        return (index == st->index);
+
+    /* If we requested a matching stream index, we have to ensure st is that. */
+    nb_streams = p ? p->nb_stream_indexes : s->nb_streams;
+    for (int i = 0; i < nb_streams && index >= 0; i++) {
+        AVStream *candidate = p ? s->streams[p->stream_index[i]] : s->streams[i];
+        ret = match_stream_specifier(s, candidate, spec, NULL, NULL);
+        if (ret < 0)
+            goto error;
+        if (ret > 0 && index-- == 0 && st == candidate)
+            return 1;
+    }
+    return 0;
+
+error:
+    if (ret == AVERROR(EINVAL))
+        av_log(s, AV_LOG_ERROR, "Invalid stream specifier: %s.\n", spec);
+    return ret;
 }
 
 int ff_generate_avci_extradata(AVStream *st)
@@ -5435,7 +5462,7 @@
     };
 
     const uint8_t *data = NULL;
-    int size            = 0;
+    int ret, size       = 0;
 
     if (st->codecpar->width == 1920) {
         if (st->codecpar->field_order == AV_FIELD_PROGRESSIVE) {
@@ -5464,9 +5491,8 @@
     if (!size)
         return 0;
 
-    av_freep(&st->codecpar->extradata);
-    if (ff_alloc_extradata(st->codecpar, size))
-        return AVERROR(ENOMEM);
+    if ((ret = ff_alloc_extradata(st->codecpar, size)) < 0)
+        return ret;
     memcpy(st->codecpar->extradata, data, size);
 
     return 0;
diff --git a/libavformat/vag.c b/libavformat/vag.c
index e8ebcaf..51045e6 100644
--- a/libavformat/vag.c
+++ b/libavformat/vag.c
@@ -23,7 +23,7 @@
 #include "avformat.h"
 #include "internal.h"
 
-static int vag_probe(AVProbeData *p)
+static int vag_probe(const AVProbeData *p)
 {
     if (memcmp(p->buf, "VAGp\0\0\0", 7))
         return 0;
diff --git a/libavformat/vapoursynth.c b/libavformat/vapoursynth.c
index f3ad691..46e08ee 100644
--- a/libavformat/vapoursynth.c
+++ b/libavformat/vapoursynth.c
@@ -177,7 +177,7 @@
     char dummy;
     const VSVideoInfo *info;
     struct VSState *vss_state;
-    int err;
+    int err = 0;
 
     vss_state = av_mallocz(sizeof(*vss_state));
     if (!vss_state) {
@@ -469,7 +469,7 @@
     return 0;
 }
 
-static av_cold int probe_vs(AVProbeData *p)
+static av_cold int probe_vs(const AVProbeData *p)
 {
     // Explicitly do not support this. VS scripts are written in Python, and
     // can run arbitrary code on the user's system.
diff --git a/libavformat/vc1dec.c b/libavformat/vc1dec.c
index 33f8465..fdbb05d 100644
--- a/libavformat/vc1dec.c
+++ b/libavformat/vc1dec.c
@@ -24,9 +24,9 @@
 #include "libavutil/intreadwrite.h"
 #include "libavcodec/vc1_common.h"
 
-static int vc1_probe(AVProbeData *p)
+static int vc1_probe(const AVProbeData *p)
 {
-    int seq = 0, entry = 0, frame = 0, i;
+    int seq = 0, entry = 0, invalid = 0, frame = 0, i;
 
     for (i = 0; i < p->buf_size + 5; i++) {
         uint32_t code = AV_RB32(p->buf + i);
@@ -39,16 +39,19 @@
                 profile = (p->buf[i] & 0xc0) >> 6;
                 if (profile != PROFILE_ADVANCED) {
                     seq = 0;
+                    invalid++;
                     continue;
                 }
                 level = (p->buf[i] & 0x38) >> 3;
                 if (level >= 5) {
                     seq = 0;
+                    invalid++;
                     continue;
                 }
                 chromaformat = (p->buf[i] & 0x6) >> 1;
                 if (chromaformat != 1) {
                     seq = 0;
+                    invalid++;
                     continue;
                 }
                 seq++;
@@ -56,8 +59,10 @@
                 break;
             }
             case VC1_CODE_ENTRYPOINT:
-                if (!seq)
+                if (!seq) {
+                    invalid++;
                     continue;
+                }
                 entry++;
                 i += 2;
                 break;
@@ -71,9 +76,9 @@
         }
     }
 
-    if (frame > 1)
+    if (frame > 1 && frame >> 1 > invalid)
         return AVPROBE_SCORE_EXTENSION / 2 + 1;
-    if (frame == 1)
+    if (frame >= 1)
         return AVPROBE_SCORE_EXTENSION / 4;
     return 0;
 }
diff --git a/libavformat/vc1test.c b/libavformat/vc1test.c
index a801f4b..ff57f44 100644
--- a/libavformat/vc1test.c
+++ b/libavformat/vc1test.c
@@ -32,11 +32,16 @@
 
 #define VC1_EXTRADATA_SIZE 4
 
-static int vc1t_probe(AVProbeData *p)
+static int vc1t_probe(const AVProbeData *p)
 {
+    uint32_t size;
+
     if (p->buf_size < 24)
         return 0;
-    if (p->buf[3] != 0xC5 || AV_RL32(&p->buf[4]) != 4 || AV_RL32(&p->buf[20]) != 0xC)
+
+    size = AV_RL32(&p->buf[4]);
+    if (p->buf[3] != 0xC5 || size < 4 || size > p->buf_size - 20 ||
+        AV_RL32(&p->buf[size+16]) != 0xC)
         return 0;
 
     return AVPROBE_SCORE_EXTENSION;
@@ -46,11 +51,12 @@
 {
     AVIOContext *pb = s->pb;
     AVStream *st;
-    int frames;
+    int frames, ret;
     uint32_t fps;
+    uint32_t size;
 
     frames = avio_rl24(pb);
-    if(avio_r8(pb) != 0xC5 || avio_rl32(pb) != 4)
+    if (avio_r8(pb) != 0xC5 || ((size = avio_rl32(pb)) < 4))
         return AVERROR_INVALIDDATA;
 
     /* init video codec */
@@ -61,8 +67,10 @@
     st->codecpar->codec_type = AVMEDIA_TYPE_VIDEO;
     st->codecpar->codec_id = AV_CODEC_ID_WMV3;
 
-    if (ff_get_extradata(s, st->codecpar, pb, VC1_EXTRADATA_SIZE) < 0)
-        return AVERROR(ENOMEM);
+    if ((ret = ff_get_extradata(s, st->codecpar, pb, VC1_EXTRADATA_SIZE)) < 0)
+        return ret;
+
+    avio_skip(pb, size - 4);
     st->codecpar->height = avio_rl32(pb);
     st->codecpar->width = avio_rl32(pb);
     if(avio_rl32(pb) != 0xC)
@@ -114,5 +122,6 @@
     .read_probe     = vc1t_probe,
     .read_header    = vc1t_read_header,
     .read_packet    = vc1t_read_packet,
+    .extensions     = "rcv",
     .flags          = AVFMT_GENERIC_INDEX,
 };
diff --git a/libavformat/vc1testenc.c b/libavformat/vc1testenc.c
index cf95d1d..1365bdd 100644
--- a/libavformat/vc1testenc.c
+++ b/libavformat/vc1testenc.c
@@ -76,7 +76,6 @@
     if (s->pb->seekable & AVIO_SEEKABLE_NORMAL) {
         avio_seek(pb, 0, SEEK_SET);
         avio_wl24(pb, ctx->frames);
-        avio_flush(pb);
     }
     return 0;
 }
diff --git a/libavformat/version.h b/libavformat/version.h
index e4a6907..719cda6 100644
--- a/libavformat/version.h
+++ b/libavformat/version.h
@@ -32,8 +32,8 @@
 // Major bumping may affect Ticket5467, 5421, 5451(compatibility with Chromium)
 // Also please add any ticket numbers that you believe might be affected here
 #define LIBAVFORMAT_VERSION_MAJOR  58
-#define LIBAVFORMAT_VERSION_MINOR  19
-#define LIBAVFORMAT_VERSION_MICRO 100
+#define LIBAVFORMAT_VERSION_MINOR  42
+#define LIBAVFORMAT_VERSION_MICRO 101
 
 #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
                                                LIBAVFORMAT_VERSION_MINOR, \
@@ -103,6 +103,9 @@
 #ifndef FF_API_LAVF_MP4A_LATM
 #define FF_API_LAVF_MP4A_LATM           (LIBAVFORMAT_VERSION_MAJOR < 59)
 #endif
+#ifndef FF_API_AVIOFORMAT
+#define FF_API_AVIOFORMAT               (LIBAVFORMAT_VERSION_MAJOR < 59)
+#endif
 
 
 #ifndef FF_API_R_FRAME_RATE
diff --git a/libavformat/vividas.c b/libavformat/vividas.c
new file mode 100644
index 0000000..4f54a43
--- /dev/null
+++ b/libavformat/vividas.c
@@ -0,0 +1,775 @@
+/*
+ * Vividas VIV format Demuxer
+ * Copyright (c) 2012 Krzysztof Klinikowski
+ * Copyright (c) 2010 Andrzej Szombierski
+ * based on vivparse Copyright (c) 2007 Måns Rullgård
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file
+ * @brief Vividas VIV (.viv) file demuxer
+ * @author Andrzej Szombierski [qq at kuku eu org] (2010-07)
+ * @sa http://wiki.multimedia.cx/index.php?title=Vividas_VIV
+ */
+
+#include "libavutil/intreadwrite.h"
+#include "avio_internal.h"
+#include "avformat.h"
+#include "internal.h"
+
+#define MAX_AUDIO_SUBPACKETS 100
+
+typedef struct VIV_SB_block {
+    int size, n_packets;
+    int64_t byte_offset;
+    int64_t packet_offset;
+} VIV_SB_block;
+
+typedef struct VIV_SB_entry {
+    int size, flag;
+} VIV_SB_entry;
+
+typedef struct VIV_AudioSubpacket {
+    int start, pcm_bytes;
+} VIV_AudioSubpacket;
+
+typedef struct VividasDemuxContext {
+    int n_sb_blocks;
+    VIV_SB_block *sb_blocks;
+    int num_audio;
+
+    uint32_t sb_key;
+    int64_t sb_offset;
+
+    int current_sb, current_sb_entry;
+    uint8_t *sb_buf;
+    AVIOContext *sb_pb;
+    int n_sb_entries;
+    VIV_SB_entry *sb_entries;
+
+    int n_audio_subpackets;
+    int current_audio_subpacket;
+
+    int64_t audio_sample;
+
+    VIV_AudioSubpacket audio_subpackets[MAX_AUDIO_SUBPACKETS];
+} VividasDemuxContext;
+
+static int viv_probe(const AVProbeData *p)
+{
+    if (memcmp(p->buf, "vividas03", 9))
+        return 0;
+
+    return AVPROBE_SCORE_MAX;
+}
+
+static const uint8_t keybits[32] = {
+ 20,  52, 111,  10,  27,  71, 142,  53,
+ 82, 138,   1,  78,  86, 121, 183,  85,
+105, 152,  39, 140, 172,  11,  64, 144,
+155,   6,  71, 163, 186,  49, 126,  43,
+};
+
+static uint32_t decode_key(uint8_t *buf)
+{
+    uint32_t key = 0;
+
+    for (int i = 0; i < 32; i++) {
+        unsigned p = keybits[i];
+        key |= ((buf[p] >> ((i*5+3)&7)) & 1u) << i;
+    }
+
+    return key;
+}
+
+static void put_v(uint8_t *p, unsigned v)
+{
+    if (v>>28)
+        *p++ = ((v>>28)&0x7f)|0x80;
+    if (v>>21)
+        *p++ = ((v>>21)&0x7f)|0x80;
+    if (v>>14)
+        *p++ = ((v>>14)&0x7f)|0x80;
+    if (v>>7)
+        *p++ =  ((v>>7)&0x7f)|0x80;
+}
+
+static unsigned recover_key(unsigned char sample[4], unsigned expected_size)
+{
+    unsigned char plaintext[8] = { 'S', 'B' };
+
+    put_v(plaintext+2, expected_size);
+
+    return AV_RL32(sample) ^ AV_RL32(plaintext);
+}
+
+static void xor_block(void *p1, void *p2, unsigned size, int key, unsigned *key_ptr)
+{
+    unsigned *d1 = p1;
+    unsigned *d2 = p2;
+    unsigned k = *key_ptr;
+
+    size >>= 2;
+
+    while (size > 0) {
+        *d2 = *d1 ^ (HAVE_BIGENDIAN ? av_bswap32(k) : k);
+        k += key;
+        d1++;
+        d2++;
+        size--;
+    }
+
+    *key_ptr = k;
+}
+
+static void decode_block(uint8_t *src, uint8_t *dest, unsigned size,
+                         uint32_t key, uint32_t *key_ptr,
+                         int align)
+{
+    unsigned s = size;
+    char tmp[4];
+    int a2;
+
+    if (!size)
+        return;
+
+    align &= 3;
+    a2 = (4 - align) & 3;
+
+    if (align) {
+        uint32_t tmpkey = *key_ptr - key;
+        if (a2 > s) {
+            a2 = s;
+            avpriv_request_sample(NULL, "tiny aligned block\n");
+        }
+        memcpy(tmp + align, src, a2);
+        xor_block(tmp, tmp, 4, key, &tmpkey);
+        memcpy(dest, tmp + align, a2);
+        s -= a2;
+    }
+
+    if (s >= 4) {
+        xor_block(src + a2, dest + a2, s & ~3,
+                  key, key_ptr);
+        s &= 3;
+    }
+
+    if (s) {
+        size -= s;
+        memcpy(tmp, src + size, s);
+        xor_block(&tmp, &tmp, 4, key, key_ptr);
+        memcpy(dest + size, tmp, s);
+    }
+}
+
+static uint32_t get_v(uint8_t *p, int len)
+{
+    uint32_t v = 0;
+    const uint8_t *end = p + len;
+
+    do {
+        if (p >= end || v >= UINT_MAX / 128 - *p)
+            return v;
+        v <<= 7;
+        v += *p & 0x7f;
+    } while (*p++ & 0x80);
+
+    return v;
+}
+
+static uint8_t *read_vblock(AVIOContext *src, uint32_t *size,
+                            uint32_t key, uint32_t *k2, int align)
+{
+    uint8_t tmp[4];
+    uint8_t *buf;
+    unsigned n;
+
+    if (avio_read(src, tmp, 4) != 4)
+        return NULL;
+
+    decode_block(tmp, tmp, 4, key, k2, align);
+
+    n = get_v(tmp, 4);
+    if (n < 4)
+        return NULL;
+
+    buf = av_malloc(n);
+    if (!buf)
+        return NULL;
+
+    *size = n;
+    n -= 4;
+
+    memcpy(buf, tmp, 4);
+
+    if (avio_read(src, buf + 4, n) == n) {
+        decode_block(buf + 4, buf + 4, n, key, k2, align);
+    } else {
+        av_free(buf);
+        buf = NULL;
+    }
+
+    return buf;
+}
+
+static uint8_t *read_sb_block(AVIOContext *src, unsigned *size,
+                              uint32_t *key, unsigned expected_size)
+{
+    uint8_t *buf;
+    uint8_t ibuf[8], sbuf[8];
+    uint32_t k2;
+    unsigned n;
+
+    if (avio_read(src, ibuf, 8) < 8)
+        return NULL;
+
+    k2 = *key;
+    decode_block(ibuf, sbuf, 8, *key, &k2, 0);
+
+    n = get_v(sbuf+2, 6);
+
+    if (sbuf[0] != 'S' || sbuf[1] != 'B' || (expected_size>0 && n != expected_size)) {
+        uint32_t tmpkey = recover_key(ibuf, expected_size);
+        k2 = tmpkey;
+        decode_block(ibuf, sbuf, 8, tmpkey, &k2, 0);
+        n = get_v(sbuf+2, 6);
+        if (sbuf[0] != 'S' || sbuf[1] != 'B' || expected_size != n)
+            return NULL;
+        *key = tmpkey;
+    }
+
+    if (n < 8)
+        return NULL;
+
+    buf = av_malloc(n);
+    if (!buf)
+        return NULL;
+
+    memcpy(buf, sbuf, 8);
+
+    *size = n;
+    n -= 8;
+
+    if (avio_read(src, buf+8, n) < n) {
+        av_free(buf);
+        return NULL;
+    }
+
+    decode_block(buf + 8, buf + 8, n, *key, &k2, 0);
+
+    return buf;
+}
+
+static int track_header(VividasDemuxContext *viv, AVFormatContext *s,  uint8_t *buf, int size)
+{
+    int i, j, ret;
+    int64_t off;
+    int val_1;
+    int num_video;
+    AVIOContext pb0, *pb = &pb0;
+
+    ffio_init_context(pb, buf, size, 0, NULL, NULL, NULL, NULL);
+
+    ffio_read_varlen(pb); // track_header_len
+    avio_r8(pb); // '1'
+
+    val_1 = ffio_read_varlen(pb);
+
+    for (i=0;i<val_1;i++) {
+        int c = avio_r8(pb);
+        for (j=0;j<c;j++) {
+            if (avio_feof(pb))
+                return AVERROR_EOF;
+            avio_r8(pb); // val_3
+            avio_r8(pb); // val_4
+        }
+    }
+
+    avio_r8(pb); // num_streams
+
+    off = avio_tell(pb);
+    off += ffio_read_varlen(pb); // val_5
+
+    avio_r8(pb); // '2'
+    num_video = avio_r8(pb);
+
+    avio_seek(pb, off, SEEK_SET);
+    if (num_video != 1) {
+        av_log(s, AV_LOG_ERROR, "number of video tracks %d is not 1\n", num_video);
+        return AVERROR_PATCHWELCOME;
+    }
+
+    for (i = 0; i < num_video; i++) {
+        AVStream *st = avformat_new_stream(s, NULL);
+        if (!st)
+            return AVERROR(ENOMEM);
+
+        st->id = i;
+
+        st->codecpar->codec_type = AVMEDIA_TYPE_VIDEO;
+        st->codecpar->codec_id = AV_CODEC_ID_VP6;
+
+        off = avio_tell(pb);
+        off += ffio_read_varlen(pb);
+        avio_r8(pb); // '3'
+        avio_r8(pb); // val_7
+        st->time_base.num = avio_rl32(pb); // frame_time
+        st->time_base.den = avio_rl32(pb); // time_base
+        st->nb_frames = avio_rl32(pb); // n frames
+        st->codecpar->width = avio_rl16(pb); // width
+        st->codecpar->height = avio_rl16(pb); // height
+        avio_r8(pb); // val_8
+        avio_rl32(pb); // val_9
+
+        avio_seek(pb, off, SEEK_SET);
+    }
+
+    off = avio_tell(pb);
+    off += ffio_read_varlen(pb); // val_10
+    avio_r8(pb); // '4'
+    viv->num_audio = avio_r8(pb);
+    avio_seek(pb, off, SEEK_SET);
+
+    if (viv->num_audio != 1)
+        av_log(s, AV_LOG_WARNING, "number of audio tracks %d is not 1\n", viv->num_audio);
+
+    for(i=0;i<viv->num_audio;i++) {
+        int q;
+        AVStream *st = avformat_new_stream(s, NULL);
+        if (!st)
+            return AVERROR(ENOMEM);
+
+        st->id = num_video + i;
+
+        st->codecpar->codec_type = AVMEDIA_TYPE_AUDIO;
+        st->codecpar->codec_id = AV_CODEC_ID_VORBIS;
+
+        off = avio_tell(pb);
+        off += ffio_read_varlen(pb); // length
+        avio_r8(pb); // '5'
+        avio_r8(pb); //codec_id
+        avio_rl16(pb); //codec_subid
+        st->codecpar->channels = avio_rl16(pb); // channels
+        st->codecpar->sample_rate = avio_rl32(pb); // sample_rate
+        avio_seek(pb, 10, SEEK_CUR); // data_1
+        q = avio_r8(pb);
+        avio_seek(pb, q, SEEK_CUR); // data_2
+        avio_r8(pb); // zeropad
+
+        if (avio_tell(pb) < off) {
+            int num_data;
+            int xd_size = 0;
+            int data_len[256];
+            int offset = 1;
+            uint8_t *p;
+            ffio_read_varlen(pb); // val_13
+            avio_r8(pb); // '19'
+            ffio_read_varlen(pb); // len_3
+            num_data = avio_r8(pb);
+            for (j = 0; j < num_data; j++) {
+                uint64_t len = ffio_read_varlen(pb);
+                if (len > INT_MAX/2 - xd_size) {
+                    return AVERROR_INVALIDDATA;
+                }
+                data_len[j] = len;
+                xd_size += len;
+            }
+
+            ret = ff_alloc_extradata(st->codecpar, 64 + xd_size + xd_size / 255);
+            if (ret < 0)
+                return ret;
+
+            p = st->codecpar->extradata;
+            p[0] = 2;
+
+            for (j = 0; j < num_data - 1; j++) {
+                unsigned delta = av_xiphlacing(&p[offset], data_len[j]);
+                if (delta > data_len[j]) {
+                    return AVERROR_INVALIDDATA;
+                }
+                offset += delta;
+            }
+
+            for (j = 0; j < num_data; j++) {
+                int ret = avio_read(pb, &p[offset], data_len[j]);
+                if (ret < data_len[j]) {
+                    st->codecpar->extradata_size = 0;
+                    av_freep(&st->codecpar->extradata);
+                    break;
+                }
+                offset += data_len[j];
+            }
+
+            if (offset < st->codecpar->extradata_size)
+                st->codecpar->extradata_size = offset;
+        }
+    }
+
+    return 0;
+}
+
+static int track_index(VividasDemuxContext *viv, AVFormatContext *s, uint8_t *buf, unsigned size)
+{
+    int64_t off;
+    int64_t poff;
+    int maxnp=0;
+    AVIOContext pb0, *pb = &pb0;
+    int i;
+    int64_t filesize = avio_size(s->pb);
+
+    ffio_init_context(pb, buf, size, 0, NULL, NULL, NULL, NULL);
+
+    ffio_read_varlen(pb); // track_index_len
+    avio_r8(pb); // 'c'
+    viv->n_sb_blocks = ffio_read_varlen(pb);
+    if (viv->n_sb_blocks < 0 || viv->n_sb_blocks > size / 2)
+        goto error;
+    viv->sb_blocks = av_calloc(viv->n_sb_blocks, sizeof(VIV_SB_block));
+    if (!viv->sb_blocks) {
+        viv->n_sb_blocks = 0;
+        return AVERROR(ENOMEM);
+    }
+
+    off = 0;
+    poff = 0;
+
+    for (i = 0; i < viv->n_sb_blocks; i++) {
+        uint64_t size_tmp      = ffio_read_varlen(pb);
+        uint64_t n_packets_tmp = ffio_read_varlen(pb);
+
+        if (size_tmp > INT_MAX || n_packets_tmp > INT_MAX)
+            goto error;
+
+        viv->sb_blocks[i].byte_offset = off;
+        viv->sb_blocks[i].packet_offset = poff;
+
+        viv->sb_blocks[i].size = size_tmp;
+        viv->sb_blocks[i].n_packets = n_packets_tmp;
+
+        off += viv->sb_blocks[i].size;
+        poff += viv->sb_blocks[i].n_packets;
+
+        if (maxnp < viv->sb_blocks[i].n_packets)
+            maxnp = viv->sb_blocks[i].n_packets;
+    }
+
+    if (filesize > 0 && poff > filesize)
+        goto error;
+
+    viv->sb_entries = av_calloc(maxnp, sizeof(VIV_SB_entry));
+
+    return 0;
+error:
+    viv->n_sb_blocks = 0;
+    av_freep(&viv->sb_blocks);
+    return AVERROR_INVALIDDATA;
+}
+
+static void load_sb_block(AVFormatContext *s, VividasDemuxContext *viv, unsigned expected_size)
+{
+    uint32_t size = 0;
+    int i;
+    AVIOContext *pb = 0;
+
+    if (viv->sb_pb) {
+        av_free(viv->sb_pb);
+        viv->sb_pb = NULL;
+    }
+
+    if (viv->sb_buf)
+        av_free(viv->sb_buf);
+
+    viv->sb_buf = read_sb_block(s->pb, &size, &viv->sb_key, expected_size);
+    if (!viv->sb_buf) {
+        return;
+    }
+
+    pb = avio_alloc_context(viv->sb_buf, size, 0, NULL, NULL, NULL, NULL);
+    if (!pb)
+        return;
+
+    viv->sb_pb = pb;
+
+    avio_r8(pb); //  'S'
+    avio_r8(pb); //  'B'
+    ffio_read_varlen(pb); //  size
+    avio_r8(pb); //  junk
+    ffio_read_varlen(pb); // first packet
+
+    viv->n_sb_entries = viv->sb_blocks[viv->current_sb].n_packets;
+
+    for (i = 0; i < viv->n_sb_entries; i++) {
+        viv->sb_entries[i].size = ffio_read_varlen(pb);
+        viv->sb_entries[i].flag = avio_r8(pb);
+    }
+
+    ffio_read_varlen(pb);
+    avio_r8(pb);
+
+    viv->current_sb_entry = 0;
+}
+
+static int viv_read_header(AVFormatContext *s)
+{
+    VividasDemuxContext *viv = s->priv_data;
+    AVIOContext *pb = s->pb;
+    int64_t header_end;
+    int num_tracks;
+    uint32_t key, k2;
+    uint32_t v;
+    uint8_t keybuffer[187];
+    uint32_t b22_size = 0;
+    uint32_t b22_key = 0;
+    uint8_t *buf = 0;
+    int ret;
+
+    avio_skip(pb, 9);
+
+    header_end = avio_tell(pb);
+
+    header_end += ffio_read_varlen(pb);
+
+    num_tracks = avio_r8(pb);
+
+    if (num_tracks != 1) {
+        av_log(s, AV_LOG_ERROR, "number of tracks %d is not 1\n", num_tracks);
+        return AVERROR(EINVAL);
+    }
+
+    v = avio_r8(pb);
+    avio_seek(pb, v, SEEK_CUR);
+
+    avio_read(pb, keybuffer, 187);
+    key = decode_key(keybuffer);
+    viv->sb_key = key;
+
+    avio_rl32(pb);
+
+    for (;;) {
+        int64_t here = avio_tell(pb);
+        int block_len, block_type;
+
+        if (here >= header_end)
+            break;
+
+        block_len = ffio_read_varlen(pb);
+        if (avio_feof(pb) || block_len <= 0)
+            return AVERROR_INVALIDDATA;
+
+        block_type = avio_r8(pb);
+
+        if (block_type == 22) {
+            avio_read(pb, keybuffer, 187);
+            b22_key = decode_key(keybuffer);
+            b22_size = avio_rl32(pb);
+        }
+
+        avio_seek(pb, here + block_len, SEEK_SET);
+    }
+
+    if (b22_size) {
+        k2 = b22_key;
+        buf = read_vblock(pb, &v, b22_key, &k2, 0);
+        if (!buf)
+            return AVERROR(EIO);
+
+        av_free(buf);
+    }
+
+    k2 = key;
+    buf = read_vblock(pb, &v, key, &k2, 0);
+    if (!buf)
+        return AVERROR(EIO);
+    ret = track_header(viv, s, buf, v);
+    av_free(buf);
+    if (ret < 0)
+        return ret;
+
+    buf = read_vblock(pb, &v, key, &k2, v);
+    if (!buf)
+        return AVERROR(EIO);
+    ret = track_index(viv, s, buf, v);
+    av_free(buf);
+    if (ret < 0)
+        return ret;
+
+    viv->sb_offset = avio_tell(pb);
+    if (viv->n_sb_blocks > 0) {
+        viv->current_sb = 0;
+        load_sb_block(s, viv, viv->sb_blocks[0].size);
+    } else {
+        viv->current_sb = -1;
+    }
+
+    return 0;
+}
+
+static int viv_read_packet(AVFormatContext *s,
+                           AVPacket *pkt)
+{
+    VividasDemuxContext *viv = s->priv_data;
+    AVIOContext *pb;
+    int64_t off;
+    int ret;
+
+    if (!viv->sb_pb)
+        return AVERROR(EIO);
+    if (avio_feof(viv->sb_pb))
+        return AVERROR_EOF;
+
+    if (viv->current_audio_subpacket < viv->n_audio_subpackets) {
+        AVStream *astream;
+        int size = viv->audio_subpackets[viv->current_audio_subpacket+1].start - viv->audio_subpackets[viv->current_audio_subpacket].start;
+
+        pb = viv->sb_pb;
+        ret = av_get_packet(pb, pkt, size);
+        if (ret < 0)
+            return ret;
+        pkt->pos += viv->sb_offset + viv->sb_blocks[viv->current_sb].byte_offset;
+
+        pkt->stream_index = 1;
+        astream = s->streams[pkt->stream_index];
+
+        pkt->pts = av_rescale(viv->audio_sample, astream->time_base.den, astream->time_base.num) / astream->codecpar->sample_rate;
+        viv->audio_sample += viv->audio_subpackets[viv->current_audio_subpacket].pcm_bytes / 2 / astream->codecpar->channels;
+        pkt->flags |= AV_PKT_FLAG_KEY;
+        viv->current_audio_subpacket++;
+        return 0;
+    }
+
+    if (viv->current_sb_entry >= viv->n_sb_entries) {
+        if (viv->current_sb+1 >= viv->n_sb_blocks)
+            return AVERROR(EIO);
+        viv->current_sb++;
+
+        load_sb_block(s, viv, 0);
+        viv->current_sb_entry = 0;
+    }
+
+    pb = viv->sb_pb;
+    if (!pb)
+        return AVERROR(EIO);
+    off = avio_tell(pb);
+    off += viv->sb_entries[viv->current_sb_entry].size;
+
+    if (viv->sb_entries[viv->current_sb_entry].flag == 0) {
+        uint64_t v_size = ffio_read_varlen(pb);
+
+        if (!viv->num_audio)
+            return AVERROR_INVALIDDATA;
+
+        ffio_read_varlen(pb);
+        if (v_size > INT_MAX)
+            return AVERROR_INVALIDDATA;
+        ret = av_get_packet(pb, pkt, v_size);
+        if (ret < 0)
+            return ret;
+        pkt->pos += viv->sb_offset + viv->sb_blocks[viv->current_sb].byte_offset;
+
+        pkt->pts = viv->sb_blocks[viv->current_sb].packet_offset + viv->current_sb_entry;
+        pkt->flags |= (pkt->data[0]&0x80)?0:AV_PKT_FLAG_KEY;
+        pkt->stream_index = 0;
+
+        for (int i = 0; i < MAX_AUDIO_SUBPACKETS - 1; i++) {
+            int start, pcm_bytes;
+            start = ffio_read_varlen(pb);
+            pcm_bytes = ffio_read_varlen(pb);
+
+            if (i > 0 && start == 0)
+                break;
+
+            viv->n_audio_subpackets = i + 1;
+            viv->audio_subpackets[i].start = start;
+            viv->audio_subpackets[i].pcm_bytes = pcm_bytes;
+        }
+        viv->audio_subpackets[viv->n_audio_subpackets].start = (int)(off - avio_tell(pb));
+        viv->current_audio_subpacket = 0;
+
+    } else {
+        uint64_t v_size = ffio_read_varlen(pb);
+
+        if (v_size > INT_MAX)
+            return AVERROR_INVALIDDATA;
+        ret = av_get_packet(pb, pkt, v_size);
+        if (ret < 0)
+            return ret;
+        pkt->pos += viv->sb_offset + viv->sb_blocks[viv->current_sb].byte_offset;
+        pkt->pts = viv->sb_blocks[viv->current_sb].packet_offset + viv->current_sb_entry;
+        pkt->flags |= (pkt->data[0] & 0x80) ? 0 : AV_PKT_FLAG_KEY;
+        pkt->stream_index = 0;
+    }
+
+    viv->current_sb_entry++;
+
+    return 0;
+}
+
+static int viv_read_close(AVFormatContext *s)
+{
+    VividasDemuxContext *viv = s->priv_data;
+
+    av_freep(&viv->sb_pb);
+    av_freep(&viv->sb_buf);
+    av_freep(&viv->sb_blocks);
+    av_freep(&viv->sb_entries);
+
+    return 0;
+}
+
+static int viv_read_seek(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
+{
+    VividasDemuxContext *viv = s->priv_data;
+    int64_t frame;
+
+    if (stream_index == 0)
+        frame = timestamp;
+    else
+        frame = av_rescale_q(timestamp, s->streams[0]->time_base, s->streams[stream_index]->time_base);
+
+    for (int i = 0; i < viv->n_sb_blocks; i++) {
+        if (frame >= viv->sb_blocks[i].packet_offset && frame < viv->sb_blocks[i].packet_offset + viv->sb_blocks[i].n_packets) {
+            // flush audio packet queue
+            viv->current_audio_subpacket = 0;
+            viv->n_audio_subpackets = 0;
+            viv->current_sb = i;
+            // seek to ith sb block
+            avio_seek(s->pb, viv->sb_offset + viv->sb_blocks[i].byte_offset, SEEK_SET);
+            // load the block
+            load_sb_block(s, viv, 0);
+            // most problematic part: guess audio offset
+            viv->audio_sample = av_rescale_q(viv->sb_blocks[i].packet_offset, av_make_q(s->streams[1]->codecpar->sample_rate, 1), av_inv_q(s->streams[0]->time_base));
+            // hand-tuned 1.s a/v offset
+            viv->audio_sample += s->streams[1]->codecpar->sample_rate;
+            viv->current_sb_entry = 0;
+            return 1;
+        }
+    }
+    return 0;
+}
+
+AVInputFormat ff_vividas_demuxer = {
+    .name           = "vividas",
+    .long_name      = NULL_IF_CONFIG_SMALL("Vividas VIV"),
+    .priv_data_size = sizeof(VividasDemuxContext),
+    .read_probe     = viv_probe,
+    .read_header    = viv_read_header,
+    .read_packet    = viv_read_packet,
+    .read_close     = viv_read_close,
+    .read_seek      = viv_read_seek,
+};
diff --git a/libavformat/vivo.c b/libavformat/vivo.c
index c9e9c37..fb58aa6 100644
--- a/libavformat/vivo.c
+++ b/libavformat/vivo.c
@@ -36,11 +36,12 @@
     int type;
     int sequence;
     int length;
+    int duration;
 
     uint8_t  text[1024 + 1];
 } VivoContext;
 
-static int vivo_probe(AVProbeData *p)
+static int vivo_probe(const AVProbeData *p)
 {
     const unsigned char *buf = p->buf;
     unsigned c, length = 0;
@@ -59,9 +60,10 @@
     if (c & 0x80 || length > 1024 || length < 21)
         return 0;
 
-    if (memcmp(buf, "\r\nVersion:Vivo/", 15))
+    buf += 2;
+    if (memcmp(buf, "Version:Vivo/", 13))
         return 0;
-    buf += 15;
+    buf += 13;
 
     if (*buf < '0' || *buf > '2')
         return 0;
@@ -166,7 +168,7 @@
             value = strchr(key, ':');
             if (!value) {
                 av_log(s, AV_LOG_WARNING, "missing colon in key:value pair '%s'\n",
-                       value);
+                       key);
                 continue;
             }
 
@@ -231,6 +233,12 @@
         ast->codecpar->bits_per_coded_sample = 8;
         ast->codecpar->block_align = 24;
         ast->codecpar->bit_rate = 6400;
+    } else {
+        ast->codecpar->codec_id = AV_CODEC_ID_SIREN;
+        ast->codecpar->bits_per_coded_sample = 16;
+        ast->codecpar->block_align = 40;
+        ast->codecpar->bit_rate = 6400;
+        vivo->duration = 320;
     }
 
     ast->start_time        = 0;
@@ -246,7 +254,7 @@
     VivoContext *vivo = s->priv_data;
     AVIOContext *pb = s->pb;
     unsigned old_sequence = vivo->sequence, old_type = vivo->type;
-    int stream_index, ret = 0;
+    int stream_index, duration, ret = 0;
 
 restart:
 
@@ -262,10 +270,12 @@
     case 1:
     case 2: // video
         stream_index = 0;
+        duration = 1;
         break;
     case 3:
     case 4: // audio
         stream_index = 1;
+        duration = vivo->duration;
         break;
     default:
         av_log(s, AV_LOG_ERROR, "unknown packet type %d\n", vivo->type);
@@ -273,32 +283,29 @@
     }
 
     if ((ret = av_get_packet(pb, pkt, vivo->length)) < 0)
-        goto fail;
+        return ret;
 
     // get next packet header
     if ((ret = vivo_get_packet_header(s)) < 0)
-        goto fail;
+        return ret;
 
     while (vivo->sequence == old_sequence &&
            (((vivo->type - 1) >> 1) == ((old_type - 1) >> 1))) {
         if (avio_feof(pb)) {
-            ret = AVERROR_EOF;
-            break;
+            return AVERROR_EOF;
         }
 
         if ((ret = av_append_packet(pb, pkt, vivo->length)) < 0)
-            break;
+            return ret;
 
         // get next packet header
         if ((ret = vivo_get_packet_header(s)) < 0)
-            break;
+            return ret;
     }
 
     pkt->stream_index = stream_index;
+    pkt->duration = duration;
 
-fail:
-    if (ret < 0)
-        av_packet_unref(pkt);
     return ret;
 }
 
diff --git a/libavformat/vocdec.c b/libavformat/vocdec.c
index 10df28b..fd1ca20 100644
--- a/libavformat/vocdec.c
+++ b/libavformat/vocdec.c
@@ -23,7 +23,7 @@
 #include "voc.h"
 #include "internal.h"
 
-static int voc_probe(AVProbeData *p)
+static int voc_probe(const AVProbeData *p)
 {
     int version, check;
 
diff --git a/libavformat/vorbiscomment.c b/libavformat/vorbiscomment.c
index 575dd13..fb5c655 100644
--- a/libavformat/vorbiscomment.c
+++ b/libavformat/vorbiscomment.c
@@ -38,10 +38,21 @@
     { 0 }
 };
 
-int64_t ff_vorbiscomment_length(AVDictionary *m, const char *vendor_string)
+int64_t ff_vorbiscomment_length(AVDictionary *m, const char *vendor_string,
+                                AVChapter **chapters, unsigned int nb_chapters)
 {
     int64_t len = 8;
     len += strlen(vendor_string);
+    if (chapters && nb_chapters) {
+        for (int i = 0; i < nb_chapters; i++) {
+            AVDictionaryEntry *tag = NULL;
+            len += 4 + 12 + 1 + 10;
+            while ((tag = av_dict_get(chapters[i]->metadata, "", tag, AV_DICT_IGNORE_SUFFIX))) {
+                int64_t len1 = !strcmp(tag->key, "title") ? 4 : strlen(tag->key);
+                len += 4 + 10 + len1 + 1 + strlen(tag->value);
+            }
+        }
+    }
     if (m) {
         AVDictionaryEntry *tag = NULL;
         while ((tag = av_dict_get(m, "", tag, AV_DICT_IGNORE_SUFFIX))) {
@@ -52,12 +63,19 @@
 }
 
 int ff_vorbiscomment_write(uint8_t **p, AVDictionary **m,
-                           const char *vendor_string)
+                           const char *vendor_string,
+                           AVChapter **chapters, unsigned int nb_chapters)
 {
+    int cm_count = 0;
     bytestream_put_le32(p, strlen(vendor_string));
     bytestream_put_buffer(p, vendor_string, strlen(vendor_string));
+    if (chapters && nb_chapters) {
+        for (int i = 0; i < nb_chapters; i++) {
+            cm_count += av_dict_count(chapters[i]->metadata) + 1;
+        }
+    }
     if (*m) {
-        int count = av_dict_count(*m);
+        int count = av_dict_count(*m) + cm_count;
         AVDictionaryEntry *tag = NULL;
         bytestream_put_le32(p, count);
         while ((tag = av_dict_get(*m, "", tag, AV_DICT_IGNORE_SUFFIX))) {
@@ -70,6 +88,42 @@
             bytestream_put_byte(p, '=');
             bytestream_put_buffer(p, tag->value, len2);
         }
+        for (int i = 0; i < nb_chapters; i++) {
+            AVChapter *chp = chapters[i];
+            char chapter_time[13];
+            char chapter_number[4];
+            int h, m, s, ms;
+
+            s  = av_rescale(chp->start, chp->time_base.num, chp->time_base.den);
+            h  = s / 3600;
+            m  = (s / 60) % 60;
+            ms = av_rescale_q(chp->start, chp->time_base, av_make_q(   1, 1000)) % 1000;
+            s  = s % 60;
+            snprintf(chapter_number, sizeof(chapter_number), "%03d", i);
+            snprintf(chapter_time, sizeof(chapter_time), "%02d:%02d:%02d.%03d", h, m, s, ms);
+            bytestream_put_le32(p, 10+1+12);
+            bytestream_put_buffer(p, "CHAPTER", 7);
+            bytestream_put_buffer(p, chapter_number, 3);
+            bytestream_put_byte(p, '=');
+            bytestream_put_buffer(p, chapter_time, 12);
+
+            tag = NULL;
+            while ((tag = av_dict_get(chapters[i]->metadata, "", tag, AV_DICT_IGNORE_SUFFIX))) {
+                int64_t len1 = !strcmp(tag->key, "title") ? 4 : strlen(tag->key);
+                int64_t len2 = strlen(tag->value);
+                if (len1+1+len2+10 > UINT32_MAX)
+                    return AVERROR(EINVAL);
+                bytestream_put_le32(p, 10+len1+1+len2);
+                bytestream_put_buffer(p, "CHAPTER", 7);
+                bytestream_put_buffer(p, chapter_number, 3);
+                if (!strcmp(tag->key, "title"))
+                    bytestream_put_buffer(p, "NAME", 4);
+                else
+                    bytestream_put_buffer(p, tag->key, len1);
+                bytestream_put_byte(p, '=');
+                bytestream_put_buffer(p, tag->value, len2);
+            }
+        }
     } else
         bytestream_put_le32(p, 0);
     return 0;
diff --git a/libavformat/vorbiscomment.h b/libavformat/vorbiscomment.h
index e0d30b1..4ff3dd6 100644
--- a/libavformat/vorbiscomment.h
+++ b/libavformat/vorbiscomment.h
@@ -34,7 +34,8 @@
  * For no string, set to an empty string.
  * @return The length in bytes.
  */
-int64_t ff_vorbiscomment_length(AVDictionary *m, const char *vendor_string);
+int64_t ff_vorbiscomment_length(AVDictionary *m, const char *vendor_string,
+                                AVChapter **chapters, unsigned int nb_chapters);
 
 /**
  * Write a VorbisComment into a buffer. The buffer, p, must have enough
@@ -45,9 +46,12 @@
  * @param p The buffer in which to write.
  * @param m The metadata struct to write.
  * @param vendor_string The vendor string to write.
+ * @param chapters The chapters to write.
+ * @param nb_chapters The number of chapters to write.
  */
 int ff_vorbiscomment_write(uint8_t **p, AVDictionary **m,
-                           const char *vendor_string);
+                           const char *vendor_string,
+                           AVChapter **chapters, unsigned int nb_chapters);
 
 extern const AVMetadataConv ff_vorbiscomment_metadata_conv[];
 
diff --git a/libavformat/vpk.c b/libavformat/vpk.c
index bb9eabb..b1df4e0 100644
--- a/libavformat/vpk.c
+++ b/libavformat/vpk.c
@@ -24,12 +24,13 @@
 #include "internal.h"
 
 typedef struct VPKDemuxContext {
+    unsigned data_start;
     unsigned block_count;
     unsigned current_block;
     unsigned last_block_size;
 } VPKDemuxContext;
 
-static int vpk_probe(AVProbeData *p)
+static int vpk_probe(const AVProbeData *p)
 {
     if (AV_RL32(p->buf) != MKBETAG('V','P','K',' '))
         return 0;
@@ -56,17 +57,21 @@
     st->codecpar->codec_id    = AV_CODEC_ID_ADPCM_PSX;
     st->codecpar->block_align = avio_rl32(s->pb);
     st->codecpar->sample_rate = avio_rl32(s->pb);
-    if (st->codecpar->sample_rate <= 0)
+    if (st->codecpar->sample_rate <= 0 || st->codecpar->block_align <= 0)
         return AVERROR_INVALIDDATA;
     st->codecpar->channels    = avio_rl32(s->pb);
     if (st->codecpar->channels <= 0)
         return AVERROR_INVALIDDATA;
-    samples_per_block      = ((st->codecpar->block_align / st->codecpar->channels) * 28) / 16;
+    samples_per_block      = ((st->codecpar->block_align / st->codecpar->channels) * 28LL) / 16;
     if (samples_per_block <= 0)
         return AVERROR_INVALIDDATA;
     vpk->block_count       = (st->duration + (samples_per_block - 1)) / samples_per_block;
     vpk->last_block_size   = (st->duration % samples_per_block) * 16 * st->codecpar->channels / 28;
+
+    if (offset < avio_tell(s->pb))
+        return AVERROR_INVALIDDATA;
     avio_skip(s->pb, offset - avio_tell(s->pb));
+    vpk->data_start = offset;
     avpriv_set_pts_info(st, 64, 1, st->codecpar->sample_rate);
 
     return 0;
@@ -82,6 +87,7 @@
     if (vpk->current_block == vpk->block_count) {
         unsigned size = vpk->last_block_size / par->channels;
         unsigned skip = (par->block_align - vpk->last_block_size) / par->channels;
+        uint64_t pos = avio_tell(s->pb);
 
         ret = av_new_packet(pkt, vpk->last_block_size);
         if (ret < 0)
@@ -90,11 +96,10 @@
             ret = avio_read(s->pb, pkt->data + i * size, size);
             avio_skip(s->pb, skip);
             if (ret != size) {
-                av_packet_unref(pkt);
-                ret = AVERROR(EIO);
-                break;
+                return AVERROR(EIO);
             }
         }
+        pkt->pos = pos;
         pkt->stream_index = 0;
     } else if (vpk->current_block < vpk->block_count) {
         ret = av_get_packet(s->pb, pkt, par->block_align);
@@ -106,6 +111,26 @@
     return ret;
 }
 
+static int vpk_read_seek(AVFormatContext *s, int stream_index,
+                         int64_t timestamp, int flags)
+{
+    AVStream *st = s->streams[stream_index];
+    AVCodecParameters *par = st->codecpar;
+    VPKDemuxContext *vpk = s->priv_data;
+    int samples_per_block;
+    int64_t ret = 0;
+
+    samples_per_block = av_get_audio_frame_duration2(par, par->block_align);
+    timestamp /= samples_per_block;
+    ret = avio_seek(s->pb, vpk->data_start + timestamp * par->block_align, SEEK_SET);
+    if (ret < 0)
+        return ret;
+
+    vpk->current_block = timestamp;
+    ff_update_cur_dts(s, st, timestamp * samples_per_block);
+    return 0;
+}
+
 AVInputFormat ff_vpk_demuxer = {
     .name           = "vpk",
     .long_name      = NULL_IF_CONFIG_SMALL("Sony PS2 VPK"),
@@ -113,5 +138,6 @@
     .read_probe     = vpk_probe,
     .read_header    = vpk_read_header,
     .read_packet    = vpk_read_packet,
+    .read_seek      = vpk_read_seek,
     .extensions     = "vpk",
 };
diff --git a/libavformat/vplayerdec.c b/libavformat/vplayerdec.c
index 49943d0..e3e7b4e 100644
--- a/libavformat/vplayerdec.c
+++ b/libavformat/vplayerdec.c
@@ -31,7 +31,7 @@
     FFDemuxSubtitlesQueue q;
 } VPlayerContext;
 
-static int vplayer_probe(AVProbeData *p)
+static int vplayer_probe(const AVProbeData *p)
 {
     char c;
     const unsigned char *ptr = p->buf;
diff --git a/libavformat/vqf.c b/libavformat/vqf.c
index d00fa5e..617a970 100644
--- a/libavformat/vqf.c
+++ b/libavformat/vqf.c
@@ -32,7 +32,7 @@
     int remaining_bits;
 } VqfContext;
 
-static int vqf_probe(AVProbeData *probe_packet)
+static int vqf_probe(const AVProbeData *probe_packet)
 {
     if (AV_RL32(probe_packet->buf) != MKTAG('T','W','I','N'))
         return 0;
@@ -97,7 +97,7 @@
     int rate_flag = -1;
     int header_size;
     int read_bitrate = 0;
-    int size;
+    int size, ret;
     uint8_t comm_chunk[12];
 
     if (!st)
@@ -107,6 +107,9 @@
 
     header_size = avio_rb32(s->pb);
 
+    if (header_size < 0)
+        return AVERROR_INVALIDDATA;
+
     st->codecpar->codec_type = AVMEDIA_TYPE_AUDIO;
     st->codecpar->codec_id   = AV_CODEC_ID_TWINVQ;
     st->start_time = 0;
@@ -120,7 +123,7 @@
 
         len = avio_rb32(s->pb);
 
-        if ((unsigned) len > INT_MAX/2) {
+        if ((unsigned) len > INT_MAX/2 || header_size < 8) {
             av_log(s, AV_LOG_ERROR, "Malformed header\n");
             return -1;
         }
@@ -219,8 +222,8 @@
     avpriv_set_pts_info(st, 64, size, st->codecpar->sample_rate);
 
     /* put first 12 bytes of COMM chunk in extradata */
-    if (ff_alloc_extradata(st->codecpar, 12))
-        return AVERROR(ENOMEM);
+    if ((ret = ff_alloc_extradata(st->codecpar, 12)) < 0)
+        return ret;
     memcpy(st->codecpar->extradata, comm_chunk, 12);
 
     ff_metadata_conv_ctx(s, NULL, vqf_metadata_conv);
@@ -234,8 +237,8 @@
     int ret;
     int size = (c->frame_bit_len - c->remaining_bits + 7)>>3;
 
-    if (av_new_packet(pkt, size+2) < 0)
-        return AVERROR(EIO);
+    if ((ret = av_new_packet(pkt, size + 2)) < 0)
+        return ret;
 
     pkt->pos          = avio_tell(s->pb);
     pkt->stream_index = 0;
@@ -246,7 +249,6 @@
     ret = avio_read(s->pb, pkt->data+2, size);
 
     if (ret != size) {
-        av_packet_unref(pkt);
         return AVERROR(EIO);
     }
 
diff --git a/libavformat/wavdec.c b/libavformat/wavdec.c
index e280be4..575c667 100644
--- a/libavformat/wavdec.c
+++ b/libavformat/wavdec.c
@@ -34,6 +34,7 @@
 #include "avformat.h"
 #include "avio.h"
 #include "avio_internal.h"
+#include "id3v2.h"
 #include "internal.h"
 #include "metadata.h"
 #include "pcm.h"
@@ -128,7 +129,7 @@
     return size;
 }
 
-static int wav_probe(AVProbeData *p)
+static int wav_probe(const AVProbeData *p)
 {
     /* check file header */
     if (p->buf_size <= 32)
@@ -180,7 +181,7 @@
 static int wav_parse_xma2_tag(AVFormatContext *s, int64_t size, AVStream **st)
 {
     AVIOContext *pb = s->pb;
-    int version, num_streams, i, channels = 0;
+    int version, num_streams, i, channels = 0, ret;
 
     if (size < 36)
         return AVERROR_INVALIDDATA;
@@ -219,9 +220,8 @@
     avpriv_set_pts_info(*st, 64, 1, (*st)->codecpar->sample_rate);
 
     avio_seek(pb, -size, SEEK_CUR);
-    av_freep(&(*st)->codecpar->extradata);
-    if (ff_get_extradata(s, (*st)->codecpar, pb, size) < 0)
-        return AVERROR(ENOMEM);
+    if ((ret = ff_get_extradata(s, (*st)->codecpar, pb, size)) < 0)
+        return ret;
 
     return 0;
 }
@@ -232,9 +232,9 @@
     char temp[257];
     int ret;
 
-    av_assert0(length <= sizeof(temp));
-    if ((ret = avio_read(s->pb, temp, length)) < 0)
-        return ret;
+    av_assert0(length < sizeof(temp));
+    if ((ret = avio_read(s->pb, temp, length)) != length)
+        return ret < 0 ? ret : AVERROR_INVALIDDATA;
 
     temp[length] = 0;
 
@@ -303,8 +303,10 @@
         if (!(coding_history = av_malloc(size + 1)))
             return AVERROR(ENOMEM);
 
-        if ((ret = avio_read(s->pb, coding_history, size)) < 0)
-            return ret;
+        if ((ret = avio_read(s->pb, coding_history, size)) != size) {
+            av_free(coding_history);
+            return ret < 0 ? ret : AVERROR_INVALIDDATA;
+        }
 
         coding_history[size] = 0;
         if ((ret = av_dict_set(&s->metadata, "coding_history", coding_history,
@@ -470,9 +472,9 @@
             vst->codecpar->codec_id = AV_CODEC_ID_SMVJPEG;
             vst->codecpar->width  = avio_rl24(pb);
             vst->codecpar->height = avio_rl24(pb);
-            if (ff_alloc_extradata(vst->codecpar, 4)) {
+            if ((ret = ff_alloc_extradata(vst->codecpar, 4)) < 0) {
                 av_log(s, AV_LOG_ERROR, "Could not allocate extradata.\n");
-                return AVERROR(ENOMEM);
+                return ret;
             }
             size = avio_rl24(pb);
             wav->smv_data_ofs = avio_tell(pb) + (size - 5) * 3;
@@ -500,6 +502,18 @@
                 ff_read_riff_info(s, size - 4);
             }
             break;
+        case MKTAG('I', 'D', '3', ' '):
+        case MKTAG('i', 'd', '3', ' '): {
+            ID3v2ExtraMeta *id3v2_extra_meta = NULL;
+            ff_id3v2_read_dict(pb, &s->internal->id3v2_meta, ID3v2_DEFAULT_MAGIC, &id3v2_extra_meta);
+            if (id3v2_extra_meta) {
+                ff_id3v2_parse_apic(s, &id3v2_extra_meta);
+                ff_id3v2_parse_chapters(s, &id3v2_extra_meta);
+                ff_id3v2_parse_priv(s, &id3v2_extra_meta);
+            }
+            ff_id3v2_free_extra_meta(&id3v2_extra_meta);
+            }
+            break;
         }
 
         /* seek to next tag unless we know that we'll run into EOF */
@@ -575,6 +589,8 @@
     } else if (st->codecpar->codec_id == AV_CODEC_ID_XMA1 ||
                st->codecpar->codec_id == AV_CODEC_ID_XMA2) {
         st->codecpar->block_align = 2048;
+    } else if (st->codecpar->codec_id == AV_CODEC_ID_ADPCM_MS && st->codecpar->channels > 2) {
+        st->codecpar->block_align *= st->codecpar->channels;
     }
 
     ff_metadata_conv_ctx(s, NULL, wav_metadata_conv);
@@ -761,7 +777,7 @@
 #endif /* CONFIG_WAV_DEMUXER */
 
 #if CONFIG_W64_DEMUXER
-static int w64_probe(AVProbeData *p)
+static int w64_probe(const AVProbeData *p)
 {
     if (p->buf_size <= 40)
         return 0;
diff --git a/libavformat/wavenc.c b/libavformat/wavenc.c
index 159119d..f6f5710 100644
--- a/libavformat/wavenc.c
+++ b/libavformat/wavenc.c
@@ -141,7 +141,7 @@
     ff_end_tag(s->pb, bext);
 }
 
-static av_cold void peak_free_buffers(AVFormatContext *s)
+static av_cold void wav_deinit(AVFormatContext *s)
 {
     WAVMuxContext *wav = s->priv_data;
 
@@ -185,7 +185,6 @@
 
 nomem:
     av_log(s, AV_LOG_ERROR, "Out of memory\n");
-    peak_free_buffers(s);
     return AVERROR(ENOMEM);
 }
 
@@ -362,8 +361,6 @@
         wav->data = ff_start_tag(pb, "data");
     }
 
-    avio_flush(pb);
-
     return 0;
 }
 
@@ -414,17 +411,13 @@
     int rf64 = 0;
     int ret = 0;
 
-    avio_flush(pb);
-
     if (s->pb->seekable & AVIO_SEEKABLE_NORMAL) {
         if (wav->write_peak != PEAK_ONLY && avio_tell(pb) - wav->data < UINT32_MAX) {
             ff_end_tag(pb, wav->data);
-            avio_flush(pb);
         }
 
         if (wav->write_peak && wav->peak_output) {
             ret = peak_write_chunk(s);
-            avio_flush(pb);
         }
 
         /* update file size */
@@ -436,8 +429,6 @@
             avio_seek(pb, 4, SEEK_SET);
             avio_wl32(pb, (uint32_t)(file_size - 8));
             avio_seek(pb, file_size, SEEK_SET);
-
-            avio_flush(pb);
         } else {
             av_log(s, AV_LOG_ERROR,
                    "Filesize %"PRId64" invalid for wav, output file will be broken\n",
@@ -457,7 +448,6 @@
             } else {
                 avio_wl32(pb, number_of_samples);
                 avio_seek(pb, file_size, SEEK_SET);
-                avio_flush(pb);
             }
         }
 
@@ -481,13 +471,9 @@
             avio_wl32(pb, -1);
 
             avio_seek(pb, file_size, SEEK_SET);
-            avio_flush(pb);
         }
     }
 
-    if (wav->write_peak)
-        peak_free_buffers(s);
-
     return ret;
 }
 
@@ -527,6 +513,7 @@
     .write_header      = wav_write_header,
     .write_packet      = wav_write_packet,
     .write_trailer     = wav_write_trailer,
+    .deinit            = wav_deinit,
     .flags             = AVFMT_TS_NONSTRICT,
     .codec_tag         = (const AVCodecTag* const []){ ff_codec_wav_tags, 0 },
     .priv_class        = &wav_muxer_class,
@@ -610,7 +597,6 @@
         }
 
         avio_seek(pb, file_size, SEEK_SET);
-        avio_flush(pb);
     }
 
     return 0;
diff --git a/libavformat/wc3movie.c b/libavformat/wc3movie.c
index cb4d4d9..6577007 100644
--- a/libavformat/wc3movie.c
+++ b/libavformat/wc3movie.c
@@ -73,7 +73,7 @@
 
 } Wc3DemuxContext;
 
-static int wc3_probe(AVProbeData *p)
+static int wc3_probe(const AVProbeData *p)
 {
     if (p->buf_size < 12)
         return 0;
@@ -130,8 +130,10 @@
             buffer = av_malloc(size+1);
             if (!buffer)
                 return AVERROR(ENOMEM);
-            if ((ret = avio_read(pb, buffer, size)) != size)
+            if ((ret = avio_read(pb, buffer, size)) != size) {
+                av_freep(&buffer);
                 return AVERROR(EIO);
+            }
             buffer[size] = 0;
             av_dict_set(&s->metadata, "title", buffer,
                                    AV_DICT_DONT_STRDUP_VAL);
diff --git a/libavformat/webm_chunk.c b/libavformat/webm_chunk.c
index 7ceb276..1749509 100644
--- a/libavformat/webm_chunk.c
+++ b/libavformat/webm_chunk.c
@@ -24,85 +24,120 @@
  * chunk, followed by data chunks where each Cluster is written out as a Chunk.
  */
 
-#include <float.h>
-#include <time.h>
-
 #include "avformat.h"
 #include "avio.h"
 #include "avio_internal.h"
 #include "internal.h"
 
-#include "libavutil/avassert.h"
 #include "libavutil/log.h"
 #include "libavutil/opt.h"
-#include "libavutil/avstring.h"
-#include "libavutil/parseutils.h"
 #include "libavutil/mathematics.h"
-#include "libavutil/time.h"
-#include "libavutil/time_internal.h"
-#include "libavutil/timestamp.h"
 
 #define MAX_FILENAME_SIZE 1024
 
 typedef struct WebMChunkContext {
     const AVClass *class;
-    int chunk_start_index;
     char *header_filename;
     int chunk_duration;
     int chunk_index;
     char *http_method;
     uint64_t duration_written;
-    int prev_pts;
-    AVOutputFormat *oformat;
+    int64_t prev_pts;
     AVFormatContext *avf;
 } WebMChunkContext;
 
-static int chunk_mux_init(AVFormatContext *s)
+static int webm_chunk_init(AVFormatContext *s)
 {
     WebMChunkContext *wc = s->priv_data;
+    ff_const59 AVOutputFormat *oformat;
     AVFormatContext *oc;
+    AVStream *st, *ost = s->streams[0];
+    AVDictionary *dict = NULL;
     int ret;
 
-    ret = avformat_alloc_output_context2(&wc->avf, wc->oformat, NULL, NULL);
+    // DASH Streams can only have one track per file.
+    if (s->nb_streams != 1)
+        return AVERROR(EINVAL);
+
+    if (!wc->header_filename) {
+        av_log(s, AV_LOG_ERROR, "No header filename provided\n");
+        return AVERROR(EINVAL);
+    }
+
+    wc->prev_pts = AV_NOPTS_VALUE;
+
+    oformat = av_guess_format("webm", s->url, "video/webm");
+    if (!oformat)
+        return AVERROR_MUXER_NOT_FOUND;
+
+    ret = avformat_alloc_output_context2(&wc->avf, oformat, NULL, NULL);
     if (ret < 0)
         return ret;
     oc = wc->avf;
 
-    oc->interrupt_callback = s->interrupt_callback;
-    oc->max_delay          = s->max_delay;
-    av_dict_copy(&oc->metadata, s->metadata, 0);
+    ff_format_set_url(oc, wc->header_filename);
+    wc->header_filename = NULL;
 
-    *(const AVClass**)oc->priv_data = oc->oformat->priv_class;
-    av_opt_set_defaults(oc->priv_data);
-    av_opt_set_int(oc->priv_data, "dash", 1, 0);
-    av_opt_set_int(oc->priv_data, "cluster_time_limit", wc->chunk_duration, 0);
-    av_opt_set_int(oc->priv_data, "live", 1, 0);
+    oc->interrupt_callback    = s->interrupt_callback;
+    oc->max_delay             = s->max_delay;
+    oc->flags                 = s->flags & ~AVFMT_FLAG_FLUSH_PACKETS;
+    oc->strict_std_compliance = s->strict_std_compliance;
+    oc->avoid_negative_ts     = s->avoid_negative_ts;
 
-    oc->streams = s->streams;
-    oc->nb_streams = s->nb_streams;
+    oc->flush_packets         = 0;
+
+    if ((ret = av_dict_copy(&oc->metadata, s->metadata, 0)) < 0)
+        return ret;
+
+    if (!(st = avformat_new_stream(oc, NULL)))
+        return AVERROR(ENOMEM);
+
+    if ((ret = avcodec_parameters_copy(st->codecpar, ost->codecpar)) < 0 ||
+        (ret = av_dict_copy(&st->metadata, ost->metadata, 0))        < 0)
+        return ret;
+
+    st->sample_aspect_ratio = ost->sample_aspect_ratio;
+    st->disposition         = ost->disposition;
+    avpriv_set_pts_info(st, ost->pts_wrap_bits, ost->time_base.num,
+                                                ost->time_base.den);
+
+    if ((ret = av_dict_set_int(&dict, "dash", 1, 0))   < 0 ||
+        (ret = av_dict_set_int(&dict, "cluster_time_limit",
+                               wc->chunk_duration, 0)) < 0 ||
+        (ret = av_dict_set_int(&dict, "live", 1, 0))   < 0)
+        goto fail;
+
+    ret = avformat_init_output(oc, &dict);
+fail:
+    av_dict_free(&dict);
+    if (ret < 0)
+        return ret;
+
+    // Copy the timing info back to the original stream
+    // so that the timestamps of the packets are directly usable
+    avpriv_set_pts_info(ost, st->pts_wrap_bits, st->time_base.num,
+                                                st->time_base.den);
+
+    // This ensures that the timestamps will already be properly shifted
+    // when the packets arrive here, so we don't need to shift again.
+    s->avoid_negative_ts  = oc->avoid_negative_ts;
+    s->internal->avoid_negative_ts_use_pts =
+        oc->internal->avoid_negative_ts_use_pts;
+    oc->avoid_negative_ts = 0;
 
     return 0;
 }
 
-static int get_chunk_filename(AVFormatContext *s, int is_header, char *filename)
+static int get_chunk_filename(AVFormatContext *s, char filename[MAX_FILENAME_SIZE])
 {
     WebMChunkContext *wc = s->priv_data;
-    AVFormatContext *oc = wc->avf;
     if (!filename) {
         return AVERROR(EINVAL);
     }
-    if (is_header) {
-        if (!wc->header_filename) {
-            av_log(oc, AV_LOG_ERROR, "No header filename provided\n");
-            return AVERROR(EINVAL);
-        }
-        av_strlcpy(filename, wc->header_filename, strlen(wc->header_filename) + 1);
-    } else {
-        if (av_get_frame_filename(filename, MAX_FILENAME_SIZE,
-                                  s->url, wc->chunk_index - 1) < 0) {
-            av_log(oc, AV_LOG_ERROR, "Invalid chunk filename template '%s'\n", s->url);
-            return AVERROR(EINVAL);
-        }
+    if (av_get_frame_filename(filename, MAX_FILENAME_SIZE,
+                              s->url, wc->chunk_index - 1) < 0) {
+        av_log(s, AV_LOG_ERROR, "Invalid chunk filename template '%s'\n", s->url);
+        return AVERROR(EINVAL);
     }
     return 0;
 }
@@ -110,48 +145,23 @@
 static int webm_chunk_write_header(AVFormatContext *s)
 {
     WebMChunkContext *wc = s->priv_data;
-    AVFormatContext *oc = NULL;
+    AVFormatContext *oc = wc->avf;
     int ret;
-    int i;
     AVDictionary *options = NULL;
-    char oc_filename[MAX_FILENAME_SIZE];
-    char *oc_url;
 
-    // DASH Streams can only have either one track per file.
-    if (s->nb_streams != 1) { return AVERROR_INVALIDDATA; }
-
-    wc->chunk_index = wc->chunk_start_index;
-    wc->oformat = av_guess_format("webm", s->url, "video/webm");
-    if (!wc->oformat)
-        return AVERROR_MUXER_NOT_FOUND;
-
-    ret = chunk_mux_init(s);
-    if (ret < 0)
-        return ret;
-    oc = wc->avf;
-    ret = get_chunk_filename(s, 1, oc_filename);
-    if (ret < 0)
-        return ret;
-    oc_url = av_strdup(oc_filename);
-    if (!oc_url)
-        return AVERROR(ENOMEM);
-    ff_format_set_url(oc, oc_url);
     if (wc->http_method)
-        av_dict_set(&options, "method", wc->http_method, 0);
+        if ((ret = av_dict_set(&options, "method", wc->http_method, 0)) < 0)
+            return ret;
     ret = s->io_open(s, &oc->pb, oc->url, AVIO_FLAG_WRITE, &options);
     av_dict_free(&options);
     if (ret < 0)
         return ret;
 
     oc->pb->seekable = 0;
-    ret = oc->oformat->write_header(oc);
+    ret = avformat_write_header(oc, NULL);
+    ff_format_io_close(s, &oc->pb);
     if (ret < 0)
         return ret;
-    ff_format_io_close(s, &oc->pb);
-    for (i = 0; i < s->nb_streams; i++) {
-        // ms precision is the de-facto standard timescale for mkv files.
-        avpriv_set_pts_info(s->streams[i], 64, 1, 1000);
-    }
     return 0;
 }
 
@@ -168,7 +178,7 @@
     return 0;
 }
 
-static int chunk_end(AVFormatContext *s)
+static int chunk_end(AVFormatContext *s, int flush)
 {
     WebMChunkContext *wc = s->priv_data;
     AVFormatContext *oc = wc->avf;
@@ -179,24 +189,27 @@
     char filename[MAX_FILENAME_SIZE];
     AVDictionary *options = NULL;
 
-    if (wc->chunk_start_index == wc->chunk_index)
+    if (!oc->pb)
         return 0;
-    // Flush the cluster in WebM muxer.
-    oc->oformat->write_packet(oc, NULL);
+
+    if (flush)
+        // Flush the cluster in WebM muxer.
+        av_write_frame(oc, NULL);
     buffer_size = avio_close_dyn_buf(oc->pb, &buffer);
-    ret = get_chunk_filename(s, 0, filename);
+    oc->pb = NULL;
+    ret = get_chunk_filename(s, filename);
     if (ret < 0)
         goto fail;
     if (wc->http_method)
-        av_dict_set(&options, "method", wc->http_method, 0);
+        if ((ret = av_dict_set(&options, "method", wc->http_method, 0)) < 0)
+            goto fail;
     ret = s->io_open(s, &pb, filename, AVIO_FLAG_WRITE, &options);
+    av_dict_free(&options);
     if (ret < 0)
         goto fail;
     avio_write(pb, buffer, buffer_size);
     ff_format_io_close(s, &pb);
-    oc->pb = NULL;
 fail:
-    av_dict_free(&options);
     av_free(buffer);
     return (ret < 0) ? ret : 0;
 }
@@ -209,60 +222,68 @@
     int ret;
 
     if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {
-        wc->duration_written += av_rescale_q(pkt->pts - wc->prev_pts,
-                                             st->time_base,
-                                             (AVRational) {1, 1000});
+        if (wc->prev_pts != AV_NOPTS_VALUE)
+            wc->duration_written += av_rescale_q(pkt->pts - wc->prev_pts,
+                                                 st->time_base,
+                                                 (AVRational) {1, 1000});
         wc->prev_pts = pkt->pts;
     }
 
     // For video, a new chunk is started only on key frames. For audio, a new
-    // chunk is started based on chunk_duration.
-    if ((st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO &&
+    // chunk is started based on chunk_duration. Also, a new chunk is started
+    // unconditionally if there is no currently open chunk.
+    if (!oc->pb || (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO &&
          (pkt->flags & AV_PKT_FLAG_KEY)) ||
         (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO &&
-         (pkt->pts == 0 || wc->duration_written >= wc->chunk_duration))) {
+         wc->duration_written >= wc->chunk_duration)) {
         wc->duration_written = 0;
-        if ((ret = chunk_end(s)) < 0 || (ret = chunk_start(s)) < 0) {
-            goto fail;
+        if ((ret = chunk_end(s, 1)) < 0 || (ret = chunk_start(s)) < 0) {
+            return ret;
         }
     }
 
-    ret = oc->oformat->write_packet(oc, pkt);
-    if (ret < 0)
-        goto fail;
-
-fail:
-    if (ret < 0) {
-        oc->streams = NULL;
-        oc->nb_streams = 0;
-        avformat_free_context(oc);
-    }
-
-    return ret;
+    // We only have one stream, so use the non-interleaving av_write_frame.
+    return av_write_frame(oc, pkt);
 }
 
 static int webm_chunk_write_trailer(AVFormatContext *s)
 {
     WebMChunkContext *wc = s->priv_data;
     AVFormatContext *oc = wc->avf;
-    oc->oformat->write_trailer(oc);
-    chunk_end(s);
-    oc->streams = NULL;
-    oc->nb_streams = 0;
-    avformat_free_context(oc);
-    return 0;
+    int ret;
+
+    if (!oc->pb) {
+        ret = chunk_start(s);
+        if (ret < 0)
+            return ret;
+    }
+    ret = av_write_trailer(oc);
+    if (ret < 0)
+        return ret;
+    return chunk_end(s, 0);
+}
+
+static void webm_chunk_deinit(AVFormatContext *s)
+{
+    WebMChunkContext *wc = s->priv_data;
+
+    if (!wc->avf)
+        return;
+
+    ffio_free_dyn_buf(&wc->avf->pb);
+    avformat_free_context(wc->avf);
+    wc->avf = NULL;
 }
 
 #define OFFSET(x) offsetof(WebMChunkContext, x)
 static const AVOption options[] = {
-    { "chunk_start_index",  "start index of the chunk", OFFSET(chunk_start_index), AV_OPT_TYPE_INT, {.i64 = 0}, 0, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM },
-    { "header", "filename of the header where the initialization data will be written", OFFSET(header_filename), AV_OPT_TYPE_STRING, { 0 }, 0, 0, AV_OPT_FLAG_ENCODING_PARAM },
+    { "chunk_start_index",  "start index of the chunk", OFFSET(chunk_index), AV_OPT_TYPE_INT, {.i64 = 0}, 0, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM },
+    { "header", "filename of the header where the initialization data will be written", OFFSET(header_filename), AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, AV_OPT_FLAG_ENCODING_PARAM },
     { "audio_chunk_duration", "duration of each chunk in milliseconds", OFFSET(chunk_duration), AV_OPT_TYPE_INT, {.i64 = 5000}, 0, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM },
     { "method", "set the HTTP method", OFFSET(http_method), AV_OPT_TYPE_STRING, {.str = NULL},  0, 0, AV_OPT_FLAG_ENCODING_PARAM },
     { NULL },
 };
 
-#if CONFIG_WEBM_CHUNK_MUXER
 static const AVClass webm_chunk_class = {
     .class_name = "WebM Chunk Muxer",
     .item_name  = av_default_item_name,
@@ -278,9 +299,10 @@
     .flags          = AVFMT_NOFILE | AVFMT_GLOBALHEADER | AVFMT_NEEDNUMBER |
                       AVFMT_TS_NONSTRICT,
     .priv_data_size = sizeof(WebMChunkContext),
+    .init           = webm_chunk_init,
     .write_header   = webm_chunk_write_header,
     .write_packet   = webm_chunk_write_packet,
     .write_trailer  = webm_chunk_write_trailer,
+    .deinit         = webm_chunk_deinit,
     .priv_class     = &webm_chunk_class,
 };
-#endif
diff --git a/libavformat/webmdashenc.c b/libavformat/webmdashenc.c
index 1280d8a..465485c 100644
--- a/libavformat/webmdashenc.c
+++ b/libavformat/webmdashenc.c
@@ -31,7 +31,6 @@
 #include <string.h>
 
 #include "avformat.h"
-#include "avio_internal.h"
 #include "matroska.h"
 
 #include "libavutil/avstring.h"
@@ -57,22 +56,11 @@
     char *utc_timing_url;
     double time_shift_buffer_depth;
     int minimum_update_period;
-    int debug_mode;
 } WebMDashMuxContext;
 
 static const char *get_codec_name(int codec_id)
 {
-    switch (codec_id) {
-        case AV_CODEC_ID_VP8:
-            return "vp8";
-        case AV_CODEC_ID_VP9:
-            return "vp9";
-        case AV_CODEC_ID_VORBIS:
-            return "vorbis";
-        case AV_CODEC_ID_OPUS:
-            return "opus";
-    }
-    return NULL;
+    return avcodec_descriptor_get(codec_id)->name;
 }
 
 static double get_duration(AVFormatContext *s)
@@ -114,7 +102,7 @@
         if (!strftime(gmt_iso, 21, "%Y-%m-%dT%H:%M:%SZ", gmt)) {
             return AVERROR_UNKNOWN;
         }
-        if (w->debug_mode) {
+        if (s->flags & AVFMT_FLAG_BITEXACT) {
             av_strlcpy(gmt_iso, "", 1);
         }
         avio_printf(s->pb, "  availabilityStartTime=\"%s\"\n", gmt_iso);
@@ -440,7 +428,7 @@
 static int to_integer(char *p, int len)
 {
     int ret;
-    char *q = av_malloc(sizeof(char) * len);
+    char *q = av_malloc(len);
     if (!q)
         return AVERROR(ENOMEM);
     av_strlcpy(q, p, len);
@@ -466,6 +454,7 @@
             continue;
         else if (state == new_set && !strncmp(p, "id=", 3)) {
             void *mem = av_realloc(w->as, sizeof(*w->as) * (w->nb_as + 1));
+            const char *comma;
             if (mem == NULL)
                 return AVERROR(ENOMEM);
             w->as = mem;
@@ -474,6 +463,11 @@
             w->as[w->nb_as - 1].streams = NULL;
             p += 3; // consume "id="
             q = w->as[w->nb_as - 1].id;
+            comma = strchr(p, ',');
+            if (!comma || comma - p >= sizeof(w->as[w->nb_as - 1].id)) {
+                av_log(s, AV_LOG_ERROR, "'id' in 'adaptation_sets' is malformed.\n");
+                return AVERROR(EINVAL);
+            }
             while (*p != ',') *q++ = *p++;
             *q = 0;
             p++;
@@ -483,11 +477,12 @@
             state = parsing_streams;
         } else if (state == parsing_streams) {
             struct AdaptationSet *as = &w->as[w->nb_as - 1];
+            int ret = av_reallocp_array(&as->streams, ++as->nb_streams,
+                                        sizeof(*as->streams));
+            if (ret < 0)
+                return ret;
             q = p;
             while (*q != '\0' && *q != ',' && *q != ' ') q++;
-            as->streams = av_realloc(as->streams, sizeof(*as->streams) * ++as->nb_streams);
-            if (as->streams == NULL)
-                return AVERROR(ENOMEM);
             as->streams[as->nb_streams - 1] = to_integer(p, q - p + 1);
             if (as->streams[as->nb_streams - 1] < 0 ||
                 as->streams[as->nb_streams - 1] >= s->nb_streams) {
@@ -510,6 +505,14 @@
     double start = 0.0;
     int ret;
     WebMDashMuxContext *w = s->priv_data;
+
+    for (unsigned i = 0; i < s->nb_streams; i++) {
+        enum AVCodecID codec_id = s->streams[i]->codecpar->codec_id;
+        if (codec_id != AV_CODEC_ID_VP8    && codec_id != AV_CODEC_ID_VP9 &&
+            codec_id != AV_CODEC_ID_VORBIS && codec_id != AV_CODEC_ID_OPUS)
+            return AVERROR(EINVAL);
+    }
+
     ret = parse_adaptation_sets(s);
     if (ret < 0) {
         goto fail;
@@ -544,16 +547,9 @@
     return AVERROR_EOF;
 }
 
-static int webm_dash_manifest_write_trailer(AVFormatContext *s)
-{
-    free_adaptation_sets(s);
-    return 0;
-}
-
 #define OFFSET(x) offsetof(WebMDashMuxContext, x)
 static const AVOption options[] = {
     { "adaptation_sets", "Adaptation sets. Syntax: id=0,streams=0,1,2 id=1,streams=3,4 and so on", OFFSET(adaptation_sets), AV_OPT_TYPE_STRING, { 0 }, 0, 0, AV_OPT_FLAG_ENCODING_PARAM },
-    { "debug_mode", "[private option - users should never set this]. Create deterministic output", OFFSET(debug_mode), AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, AV_OPT_FLAG_ENCODING_PARAM },
     { "live", "create a live stream manifest", OFFSET(is_live), AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, AV_OPT_FLAG_ENCODING_PARAM },
     { "chunk_start_index",  "start index of the chunk", OFFSET(chunk_start_index), AV_OPT_TYPE_INT, {.i64 = 0}, 0, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM },
     { "chunk_duration_ms", "duration of each chunk (in milliseconds)", OFFSET(chunk_duration), AV_OPT_TYPE_INT, {.i64 = 1000}, 0, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM },
@@ -563,7 +559,6 @@
     { NULL },
 };
 
-#if CONFIG_WEBM_DASH_MANIFEST_MUXER
 static const AVClass webm_dash_class = {
     .class_name = "WebM DASH Manifest muxer",
     .item_name  = av_default_item_name,
@@ -579,7 +574,5 @@
     .priv_data_size    = sizeof(WebMDashMuxContext),
     .write_header      = webm_dash_manifest_write_header,
     .write_packet      = webm_dash_manifest_write_packet,
-    .write_trailer     = webm_dash_manifest_write_trailer,
     .priv_class        = &webm_dash_class,
 };
-#endif
diff --git a/libavformat/webvttdec.c b/libavformat/webvttdec.c
index 0aeb8a6..6c4d5f6 100644
--- a/libavformat/webvttdec.c
+++ b/libavformat/webvttdec.c
@@ -37,7 +37,7 @@
     int kind;
 } WebVTTContext;
 
-static int webvtt_probe(AVProbeData *p)
+static int webvtt_probe(const AVProbeData *p)
 {
     const uint8_t *ptr = p->buf;
 
@@ -60,7 +60,7 @@
 static int webvtt_read_header(AVFormatContext *s)
 {
     WebVTTContext *webvtt = s->priv_data;
-    AVBPrint header, cue;
+    AVBPrint cue;
     int res = 0;
     AVStream *st = avformat_new_stream(s, NULL);
 
@@ -71,7 +71,6 @@
     st->codecpar->codec_id   = AV_CODEC_ID_WEBVTT;
     st->disposition |= webvtt->kind;
 
-    av_bprint_init(&header, 0, AV_BPRINT_SIZE_UNLIMITED);
     av_bprint_init(&cue,    0, AV_BPRINT_SIZE_UNLIMITED);
 
     for (;;) {
@@ -166,7 +165,6 @@
 
 end:
     av_bprint_finalize(&cue,    NULL);
-    av_bprint_finalize(&header, NULL);
     return res;
 }
 
@@ -192,14 +190,14 @@
 }
 
 #define OFFSET(x) offsetof(WebVTTContext, x)
-#define KIND_FLAGS AV_OPT_FLAG_SUBTITLE_PARAM
+#define KIND_FLAGS AV_OPT_FLAG_SUBTITLE_PARAM|AV_OPT_FLAG_DECODING_PARAM
 
 static const AVOption options[] = {
     { "kind", "Set kind of WebVTT track", OFFSET(kind), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, KIND_FLAGS, "webvtt_kind" },
-        { "subtitles",    "WebVTT subtitles kind",    0, AV_OPT_TYPE_CONST, { .i64 = 0 },                           INT_MIN, INT_MAX, 0, "webvtt_kind" },
-        { "captions",     "WebVTT captions kind",     0, AV_OPT_TYPE_CONST, { .i64 = AV_DISPOSITION_CAPTIONS },     INT_MIN, INT_MAX, 0, "webvtt_kind" },
-        { "descriptions", "WebVTT descriptions kind", 0, AV_OPT_TYPE_CONST, { .i64 = AV_DISPOSITION_DESCRIPTIONS }, INT_MIN, INT_MAX, 0, "webvtt_kind" },
-        { "metadata",     "WebVTT metadata kind",     0, AV_OPT_TYPE_CONST, { .i64 = AV_DISPOSITION_METADATA },     INT_MIN, INT_MAX, 0, "webvtt_kind" },
+        { "subtitles",    "WebVTT subtitles kind",    0, AV_OPT_TYPE_CONST, { .i64 = 0 },                           INT_MIN, INT_MAX, KIND_FLAGS, "webvtt_kind" },
+        { "captions",     "WebVTT captions kind",     0, AV_OPT_TYPE_CONST, { .i64 = AV_DISPOSITION_CAPTIONS },     INT_MIN, INT_MAX, KIND_FLAGS, "webvtt_kind" },
+        { "descriptions", "WebVTT descriptions kind", 0, AV_OPT_TYPE_CONST, { .i64 = AV_DISPOSITION_DESCRIPTIONS }, INT_MIN, INT_MAX, KIND_FLAGS, "webvtt_kind" },
+        { "metadata",     "WebVTT metadata kind",     0, AV_OPT_TYPE_CONST, { .i64 = AV_DISPOSITION_METADATA },     INT_MIN, INT_MAX, KIND_FLAGS, "webvtt_kind" },
     { NULL }
 };
 
diff --git a/libavformat/webvttenc.c b/libavformat/webvttenc.c
index 61b7f54..cbd989d 100644
--- a/libavformat/webvttenc.c
+++ b/libavformat/webvttenc.c
@@ -57,7 +57,6 @@
     avpriv_set_pts_info(s, 64, 1, 1000);
 
     avio_printf(pb, "WEBVTT\n");
-    avio_flush(pb);
 
     return 0;
 }
diff --git a/libavformat/westwood_aud.c b/libavformat/westwood_aud.c
index 9c2d35c..9e3d807 100644
--- a/libavformat/westwood_aud.c
+++ b/libavformat/westwood_aud.c
@@ -42,7 +42,7 @@
 #define AUD_CHUNK_PREAMBLE_SIZE 8
 #define AUD_CHUNK_SIGNATURE 0x0000DEAF
 
-static int wsaud_probe(AVProbeData *p)
+static int wsaud_probe(const AVProbeData *p)
 {
     int field;
 
diff --git a/libavformat/westwood_vqa.c b/libavformat/westwood_vqa.c
index efb9847..a0db854 100644
--- a/libavformat/westwood_vqa.c
+++ b/libavformat/westwood_vqa.c
@@ -62,7 +62,7 @@
     int video_stream_index;
 } WsVqaDemuxContext;
 
-static int wsvqa_probe(AVProbeData *p)
+static int wsvqa_probe(const AVProbeData *p)
 {
     /* need 12 bytes to qualify */
     if (p->buf_size < 12)
@@ -85,7 +85,7 @@
     uint8_t scratch[VQA_PREAMBLE_SIZE];
     uint32_t chunk_tag;
     uint32_t chunk_size;
-    int fps;
+    int fps, ret;
 
     /* initialize the video decoder stream */
     st = avformat_new_stream(s, NULL);
@@ -101,8 +101,8 @@
     avio_seek(pb, 20, SEEK_SET);
 
     /* the VQA header needs to go to the decoder */
-    if (ff_get_extradata(s, st->codecpar, pb, VQA_HEADER_SIZE) < 0)
-        return AVERROR(ENOMEM);
+    if ((ret = ff_get_extradata(s, st->codecpar, pb, VQA_HEADER_SIZE)) < 0)
+        return ret;
     header = st->codecpar->extradata;
     st->codecpar->width = AV_RL16(&header[6]);
     st->codecpar->height = AV_RL16(&header[8]);
@@ -214,8 +214,8 @@
                         break;
                     case SND2_TAG:
                         st->codecpar->codec_id = AV_CODEC_ID_ADPCM_IMA_WS;
-                        if (ff_alloc_extradata(st->codecpar, 2))
-                            return AVERROR(ENOMEM);
+                        if ((ret = ff_alloc_extradata(st->codecpar, 2)) < 0)
+                            return ret;
                         AV_WL16(st->codecpar->extradata, wsvqa->version);
                         break;
                     }
diff --git a/libavformat/wsddec.c b/libavformat/wsddec.c
index 81a4dcc..2313b0e 100644
--- a/libavformat/wsddec.c
+++ b/libavformat/wsddec.c
@@ -25,7 +25,7 @@
 #include "internal.h"
 #include "rawdec.h"
 
-static int wsd_probe(AVProbeData *p)
+static int wsd_probe(const AVProbeData *p)
 {
     if (p->buf_size < 45 || memcmp(p->buf, "1bit", 4) ||
         !AV_RB32(p->buf + 36) || !p->buf[44] ||
@@ -137,7 +137,7 @@
     if (!(channel_assign & 1)) {
         int i;
         for (i = 1; i < 32; i++)
-            if (channel_assign & (1 << i))
+            if ((channel_assign >> i) & 1)
                 st->codecpar->channel_layout |= wsd_to_av_channel_layoyt(s, i);
     }
 
@@ -161,6 +161,7 @@
     return avio_seek(pb, data_offset, SEEK_SET);
 }
 
+FF_RAW_DEMUXER_CLASS(wsd)
 AVInputFormat ff_wsd_demuxer = {
     .name         = "wsd",
     .long_name    = NULL_IF_CONFIG_SMALL("Wideband Single-bit Data (WSD)"),
@@ -170,4 +171,6 @@
     .extensions   = "wsd",
     .flags        = AVFMT_GENERIC_INDEX | AVFMT_NO_BYTE_SEEK,
     .raw_codec_id = AV_CODEC_ID_DSD_MSBF,
+    .priv_data_size = sizeof(FFRawDemuxerContext),
+    .priv_class     = &wsd_demuxer_class,
 };
diff --git a/libavformat/wtvdec.c b/libavformat/wtvdec.c
index 301163b..83f510b 100644
--- a/libavformat/wtvdec.c
+++ b/libavformat/wtvdec.c
@@ -71,7 +71,7 @@
 {
     WtvFile *wf = opaque;
     AVIOContext *pb = wf->pb_filesystem;
-    int nread = 0;
+    int nread = 0, n = 0;
 
     if (wf->error || pb->error)
         return -1;
@@ -80,7 +80,6 @@
 
     buf_size = FFMIN(buf_size, wf->length - wf->position);
     while(nread < buf_size) {
-        int n;
         int remaining_in_sector = (1 << wf->sector_bits) - (wf->position & ((1 << wf->sector_bits) - 1));
         int read_request        = FFMIN(buf_size - nread, remaining_in_sector);
 
@@ -100,7 +99,7 @@
             }
         }
     }
-    return nread;
+    return nread ? nread : n;
 }
 
 /**
@@ -149,7 +148,7 @@
  * @param depth         File allocation table depth
  * @return NULL on error
  */
-static AVIOContext * wtvfile_open_sector(int first_sector, uint64_t length, int depth, AVFormatContext *s)
+static AVIOContext * wtvfile_open_sector(unsigned first_sector, uint64_t length, int depth, AVFormatContext *s)
 {
     AVIOContext *pb;
     WtvFile *wf;
@@ -290,7 +289,7 @@
 
         buf += dir_length;
     }
-    return 0;
+    return NULL;
 }
 
 #define wtvfile_open(s, buf, buf_size, filename) \
@@ -371,7 +370,7 @@
 static const ff_asf_guid mediasubtype_mpeg2_sections =
     {0x79,0x85,0x9F,0x4A,0xF8,0x6B,0x92,0x43,0x8A,0x6D,0xD2,0xDD,0x09,0xFA,0x78,0x61};
 
-static int read_probe(AVProbeData *p)
+static int read_probe(const AVProbeData *p)
 {
     return ff_guidcmp(p->buf, ff_wtv_guid) ? 0 : AVPROBE_SCORE_MAX;
 }
@@ -904,10 +903,10 @@
                     wtv->last_valid_pts = wtv->pts;
                     if (wtv->epoch == AV_NOPTS_VALUE || wtv->pts < wtv->epoch)
                         wtv->epoch = wtv->pts;
-                if (mode == SEEK_TO_PTS && wtv->pts >= seekts) {
-                    avio_skip(pb, WTV_PAD8(len) - consumed);
-                    return 0;
-                }
+                    if (mode == SEEK_TO_PTS && wtv->pts >= seekts) {
+                        avio_skip(pb, WTV_PAD8(len) - consumed);
+                        return 0;
+                    }
                 }
             }
         } else if (!ff_guidcmp(g, ff_data_guid)) {
@@ -957,7 +956,8 @@
 static int read_header(AVFormatContext *s)
 {
     WtvContext *wtv = s->priv_data;
-    int root_sector, root_size;
+    unsigned root_sector;
+    int root_size;
     uint8_t root[WTV_SECTOR_SIZE];
     AVIOContext *pb;
     int64_t timeline_pos;
@@ -992,8 +992,10 @@
     }
 
     ret = parse_chunks(s, SEEK_TO_DATA, 0, 0);
-    if (ret < 0)
+    if (ret < 0) {
+        wtvfile_close(wtv->pb);
         return ret;
+    }
     avio_seek(wtv->pb, -32, SEEK_CUR);
 
     timeline_pos = avio_tell(s->pb); // save before opening another file
diff --git a/libavformat/wtvenc.c b/libavformat/wtvenc.c
index 4a68b81..498bc64 100644
--- a/libavformat/wtvenc.c
+++ b/libavformat/wtvenc.c
@@ -823,8 +823,6 @@
     avio_seek(pb, 0x5c, SEEK_SET);
     avio_wl32(pb, file_end_pos >> WTV_SECTOR_BITS);
 
-    avio_flush(pb);
-
     av_free(wctx->sp_pairs);
     av_free(wctx->st_pairs);
     av_packet_unref(&wctx->thumbnail);
diff --git a/libavformat/wvdec.c b/libavformat/wvdec.c
index 8252656..b9fc6a5 100644
--- a/libavformat/wvdec.c
+++ b/libavformat/wvdec.c
@@ -40,6 +40,7 @@
     WV_HBAL   = 0x0400,
     WV_MCINIT = 0x0800,
     WV_MCEND  = 0x1000,
+    WV_DSD    = 0x80000000,
 };
 
 static const int wv_rates[16] = {
@@ -59,7 +60,7 @@
     int64_t apetag_start;
 } WVContext;
 
-static int wv_probe(AVProbeData *p)
+static int wv_probe(const AVProbeData *p)
 {
     /* check file header */
     if (p->buf_size <= 32)
@@ -78,7 +79,7 @@
 {
     WVContext *wc = ctx->priv_data;
     int ret;
-    int rate, bpp, chan;
+    int rate, rate_x, bpp, chan;
     uint32_t chmask, flags;
 
     wc->pos = avio_tell(pb);
@@ -109,7 +110,8 @@
         return 0;
     // parse flags
     flags  = wc->header.flags;
-    bpp    = ((flags & 3) + 1) << 3;
+    rate_x = (flags & WV_DSD) ? 4 : 1;
+    bpp    = (flags & WV_DSD) ? 0 : ((flags & 3) + 1) << 3;
     chan   = 1 + !(flags & WV_MONO);
     chmask = flags & WV_MONO ? AV_CH_LAYOUT_MONO : AV_CH_LAYOUT_STEREO;
     rate   = wv_rates[(flags >> 23) & 0xF];
@@ -118,7 +120,7 @@
         chan   = wc->chan;
         chmask = wc->chmask;
     }
-    if ((rate == -1 || !chan) && !wc->block_parsed) {
+    if ((rate == -1 || !chan || flags & WV_DSD) && !wc->block_parsed) {
         int64_t block_end = avio_tell(pb) + wc->header.blocksize;
         if (!(pb->seekable & AVIO_SEEKABLE_NORMAL)) {
             av_log(ctx, AV_LOG_ERROR,
@@ -153,10 +155,17 @@
                 case 3:
                     chmask = avio_rl32(pb);
                     break;
+                case 4:
+                    avio_skip(pb, 1);
+                    chan  |= (avio_r8(pb) & 0xF) << 8;
+                    chan  += 1;
+                    chmask = avio_rl24(pb);
+                    break;
                 case 5:
                     avio_skip(pb, 1);
                     chan  |= (avio_r8(pb) & 0xF) << 8;
-                    chmask = avio_rl24(pb);
+                    chan  += 1;
+                    chmask = avio_rl32(pb);
                     break;
                 default:
                     av_log(ctx, AV_LOG_ERROR,
@@ -164,6 +173,16 @@
                     return AVERROR_INVALIDDATA;
                 }
                 break;
+            case 0xE:
+                if (size <= 1) {
+                    av_log(ctx, AV_LOG_ERROR,
+                           "Invalid DSD block\n");
+                    return AVERROR_INVALIDDATA;
+                }
+                rate_x = 1U << (avio_r8(pb) & 0x1f);
+                if (size)
+                    avio_skip(pb, size-1);
+                break;
             case 0x27:
                 rate = avio_rl24(pb);
                 break;
@@ -187,7 +206,7 @@
     if (!wc->chmask)
         wc->chmask = chmask;
     if (!wc->rate)
-        wc->rate   = rate;
+        wc->rate   = rate * rate_x;
 
     if (flags && bpp != wc->bpp) {
         av_log(ctx, AV_LOG_ERROR,
@@ -201,10 +220,10 @@
                chan, wc->chan);
         return AVERROR_INVALIDDATA;
     }
-    if (flags && rate != -1 && rate != wc->rate) {
+    if (flags && rate != -1 && !(flags & WV_DSD) && rate * rate_x != wc->rate) {
         av_log(ctx, AV_LOG_ERROR,
                "Sampling rate differ, this block: %i, header block: %i\n",
-               rate, wc->rate);
+               rate * rate_x, wc->rate);
         return AVERROR_INVALIDDATA;
     }
     return 0;
@@ -231,6 +250,9 @@
     st = avformat_new_stream(s, NULL);
     if (!st)
         return AVERROR(ENOMEM);
+    if ((ret = ff_alloc_extradata(st->codecpar, 2)) < 0)
+        return ret;
+    AV_WL16(st->codecpar->extradata, wc->header.version);
     st->codecpar->codec_type            = AVMEDIA_TYPE_AUDIO;
     st->codecpar->codec_id              = AV_CODEC_ID_WAVPACK;
     st->codecpar->channels              = wc->chan;
@@ -269,30 +291,26 @@
     }
 
     pos = wc->pos;
-    if (av_new_packet(pkt, wc->header.blocksize + WV_HEADER_SIZE) < 0)
-        return AVERROR(ENOMEM);
+    if ((ret = av_new_packet(pkt, wc->header.blocksize + WV_HEADER_SIZE)) < 0)
+        return ret;
     memcpy(pkt->data, wc->block_header, WV_HEADER_SIZE);
     ret = avio_read(s->pb, pkt->data + WV_HEADER_SIZE, wc->header.blocksize);
     if (ret != wc->header.blocksize) {
-        av_packet_unref(pkt);
         return AVERROR(EIO);
     }
     while (!(wc->header.flags & WV_FLAG_FINAL_BLOCK)) {
         if ((ret = wv_read_block_header(s, s->pb)) < 0) {
-            av_packet_unref(pkt);
             return ret;
         }
 
         off = pkt->size;
         if ((ret = av_grow_packet(pkt, WV_HEADER_SIZE + wc->header.blocksize)) < 0) {
-            av_packet_unref(pkt);
             return ret;
         }
         memcpy(pkt->data + off, wc->block_header, WV_HEADER_SIZE);
 
         ret = avio_read(s->pb, pkt->data + off + WV_HEADER_SIZE, wc->header.blocksize);
         if (ret != wc->header.blocksize) {
-            av_packet_unref(pkt);
             return (ret < 0) ? ret : AVERROR_EOF;
         }
     }
diff --git a/libavformat/wvedec.c b/libavformat/wvedec.c
index 89c0001..4d9d3e5 100644
--- a/libavformat/wvedec.c
+++ b/libavformat/wvedec.c
@@ -22,7 +22,7 @@
 #include "internal.h"
 #include "pcm.h"
 
-static int wve_probe(AVProbeData *p)
+static int wve_probe(const AVProbeData *p)
 {
     if (memcmp(p->buf, "ALawSoundFile**\0\017\020", 18) ||
         memcmp(p->buf + 22, "\0\0\0\1\0\0\0\0\0\0", 10))
diff --git a/libavformat/xa.c b/libavformat/xa.c
index 810e0c0..a07271b 100644
--- a/libavformat/xa.c
+++ b/libavformat/xa.c
@@ -40,7 +40,7 @@
     uint32_t sent_bytes;
 } MaxisXADemuxContext;
 
-static int xa_probe(AVProbeData *p)
+static int xa_probe(const AVProbeData *p)
 {
     int channels, srate, bits_per_sample;
     if (p->buf_size < 24)
diff --git a/libavformat/xmv.c b/libavformat/xmv.c
index b974e5a..0c69d26 100644
--- a/libavformat/xmv.c
+++ b/libavformat/xmv.c
@@ -79,7 +79,7 @@
     uint16_t channels;        ///< Number of channels.
     int32_t sample_rate;      ///< Sampling rate.
     uint16_t bits_per_sample; ///< Bits per compressed sample.
-    uint32_t bit_rate;        ///< Bits of compressed data per second.
+    uint64_t bit_rate;        ///< Bits of compressed data per second.
     uint16_t flags;           ///< Flags
     unsigned block_align;     ///< Bytes per compressed block.
     uint16_t block_samples;   ///< Decompressed samples per compressed block.
@@ -115,7 +115,7 @@
     XMVAudioPacket *audio; ///< The audio packets contained in each packet.
 } XMVDemuxContext;
 
-static int xmv_probe(AVProbeData *p)
+static int xmv_probe(const AVProbeData *p)
 {
     uint32_t file_version;
 
@@ -191,7 +191,7 @@
         packet->bits_per_sample = avio_rl16(pb);
         packet->flags           = avio_rl16(pb);
 
-        packet->bit_rate      = packet->bits_per_sample *
+        packet->bit_rate      = (uint64_t)packet->bits_per_sample *
                                 packet->sample_rate *
                                 packet->channels;
         packet->block_align   = XMV_BLOCK_ALIGN_SIZE * packet->channels;
@@ -397,8 +397,6 @@
                 av_assert0(xmv->video.stream_index < s->nb_streams);
 
                 if (vst->codecpar->extradata_size < 4) {
-                    av_freep(&vst->codecpar->extradata);
-
                     if ((ret = ff_alloc_extradata(vst->codecpar, 4)) < 0)
                         return ret;
                 }
diff --git a/libavformat/xvag.c b/libavformat/xvag.c
index 22e4f1e..e95d84a 100644
--- a/libavformat/xvag.c
+++ b/libavformat/xvag.c
@@ -24,7 +24,7 @@
 #include "avformat.h"
 #include "internal.h"
 
-static int xvag_probe(AVProbeData *p)
+static int xvag_probe(const AVProbeData *p)
 {
     if (memcmp(p->buf, "XVAG", 4) ||
         memcmp(p->buf+32, "fmat", 4))
diff --git a/libavformat/xwma.c b/libavformat/xwma.c
index 1c18772..5a57caa 100644
--- a/libavformat/xwma.c
+++ b/libavformat/xwma.c
@@ -34,7 +34,7 @@
     int64_t data_end;
 } XWMAContext;
 
-static int xwma_probe(AVProbeData *p)
+static int xwma_probe(const AVProbeData *p)
 {
     if (!memcmp(p->buf, "RIFF", 4) && !memcmp(p->buf + 8, "XWMA", 4))
         return AVPROBE_SCORE_MAX;
@@ -60,16 +60,16 @@
     /* check RIFF header */
     tag = avio_rl32(pb);
     if (tag != MKTAG('R', 'I', 'F', 'F'))
-        return -1;
+        return AVERROR_INVALIDDATA;
     avio_rl32(pb); /* file size */
     tag = avio_rl32(pb);
     if (tag != MKTAG('X', 'W', 'M', 'A'))
-        return -1;
+        return AVERROR_INVALIDDATA;
 
     /* parse fmt header */
     tag = avio_rl32(pb);
     if (tag != MKTAG('f', 'm', 't', ' '))
-        return -1;
+        return AVERROR_INVALIDDATA;
     size = avio_rl32(pb);
     st = avformat_new_stream(s, NULL);
     if (!st)
@@ -80,19 +80,43 @@
         return ret;
     st->need_parsing = AVSTREAM_PARSE_NONE;
 
-    /* All xWMA files I have seen contained WMAv2 data. If there are files
-     * using WMA Pro or some other codec, then we need to figure out the right
-     * extradata for that. Thus, ask the user for feedback, but try to go on
-     * anyway.
-     */
+    /* XWMA encoder only allows a few channel/sample rate/bitrate combinations,
+     * but some create identical files with fake bitrate (1ch 22050hz at
+     * 20/48/192kbps are all 20kbps, with the exact same codec data).
+     * Decoder needs correct bitrate to work, so it's normalized here. */
+    if (st->codecpar->codec_id == AV_CODEC_ID_WMAV2) {
+        int ch = st->codecpar->channels;
+        int sr = st->codecpar->sample_rate;
+        int br = st->codecpar->bit_rate;
+
+        if (ch == 1) {
+            if (sr == 22050 && (br==48000 || br==192000))
+                br = 20000;
+            else if (sr == 32000 && (br==48000 || br==192000))
+                br = 20000;
+            else if (sr == 44100 && (br==96000 || br==192000))
+                br = 48000;
+        }
+        else if (ch == 2) {
+            if (sr == 22050 && (br==48000 || br==192000))
+                br = 32000;
+            else if (sr == 32000 && (br==192000))
+                br = 48000;
+        }
+
+        st->codecpar->bit_rate = br;
+    }
+
+    /* Normally xWMA can only contain WMAv2 with 1/2 channels,
+     * and WMAPRO with 6 channels. */
     if (st->codecpar->codec_id != AV_CODEC_ID_WMAV2 &&
         st->codecpar->codec_id != AV_CODEC_ID_WMAPRO) {
         avpriv_request_sample(s, "Unexpected codec (tag %s; id %d)",
                               av_fourcc2str(st->codecpar->codec_tag),
                               st->codecpar->codec_id);
     } else {
-        /* In all xWMA files I have seen, there is no extradata. But the WMA
-         * codecs require extradata, so we provide our own fake extradata.
+        /* xWMA shouldn't have extradata. But the WMA codecs require it,
+         * so we provide our own fake extradata.
          *
          * First, check that there really was no extradata in the header. If
          * there was, then try to use it, after asking the user to provide a
@@ -106,15 +130,15 @@
             avpriv_request_sample(s, "Unexpected extradata (%d bytes)",
                                   st->codecpar->extradata_size);
         } else if (st->codecpar->codec_id == AV_CODEC_ID_WMAPRO) {
-            if (ff_alloc_extradata(st->codecpar, 18))
-                return AVERROR(ENOMEM);
+            if ((ret = ff_alloc_extradata(st->codecpar, 18)) < 0)
+                return ret;
 
             memset(st->codecpar->extradata, 0, st->codecpar->extradata_size);
             st->codecpar->extradata[ 0] = st->codecpar->bits_per_coded_sample;
             st->codecpar->extradata[14] = 224;
         } else {
-            if (ff_alloc_extradata(st->codecpar, 6))
-                return AVERROR(ENOMEM);
+            if ((ret = ff_alloc_extradata(st->codecpar, 6)) < 0)
+                return ret;
 
             memset(st->codecpar->extradata, 0, st->codecpar->extradata_size);
             /* setup extradata with our experimentally obtained value */
diff --git a/libavformat/yop.c b/libavformat/yop.c
index e6fd896..0d8d9f2 100644
--- a/libavformat/yop.c
+++ b/libavformat/yop.c
@@ -36,7 +36,7 @@
     int palette_size;
 } YopDecContext;
 
-static int yop_probe(AVProbeData *probe_packet)
+static int yop_probe(const AVProbeData *probe_packet)
 {
     if (AV_RB16(probe_packet->buf) == AV_RB16("YO")  &&
         probe_packet->buf[2]<10                      &&
@@ -68,10 +68,6 @@
     if (!audio_stream || !video_stream)
         return AVERROR(ENOMEM);
 
-    // Extra data that will be passed to the decoder
-    if (ff_alloc_extradata(video_stream->codecpar, 8))
-        return AVERROR(ENOMEM);
-
     // Audio
     audio_par                 = audio_stream->codecpar;
     audio_par->codec_type     = AVMEDIA_TYPE_AUDIO;
@@ -94,9 +90,9 @@
 
     video_stream->sample_aspect_ratio = (AVRational){1, 2};
 
-    ret = avio_read(pb, video_par->extradata, 8);
-    if (ret < 8)
-        return ret < 0 ? ret : AVERROR_EOF;
+    ret = ff_get_extradata(s, video_par, pb, 8);
+    if (ret < 0)
+        return ret;
 
     yop->palette_size       = video_par->extradata[0] * 3 + 4;
     yop->audio_block_length = AV_RL16(video_par->extradata + 6);
@@ -129,14 +125,11 @@
     yop->video_packet.stream_index = 1;
 
     if (yop->video_packet.data) {
-        *pkt                   =  yop->video_packet;
-        yop->video_packet.data =  NULL;
-        yop->video_packet.buf  =  NULL;
-        yop->video_packet.size =  0;
+        av_packet_move_ref(pkt, &yop->video_packet);
         pkt->data[0]           =  yop->odd_frame;
         pkt->flags             |= AV_PKT_FLAG_KEY;
         yop->odd_frame         ^= 1;
-        return pkt->size;
+        return 0;
     }
     ret = av_new_packet(&yop->video_packet,
                         yop->frame_size - yop->audio_block_length);
@@ -170,7 +163,7 @@
         av_shrink_packet(&yop->video_packet, yop->palette_size + ret);
 
     // Arbitrarily return the audio data first
-    return yop->audio_block_length;
+    return 0;
 
 err_out:
     av_packet_unref(&yop->video_packet);
diff --git a/libavformat/yuv4mpegdec.c b/libavformat/yuv4mpegdec.c
index 855fadb..980de7d 100644
--- a/libavformat/yuv4mpegdec.c
+++ b/libavformat/yuv4mpegdec.c
@@ -26,7 +26,7 @@
 #include "yuv4mpeg.h"
 
 /* Header size increased to allow room for optional flags */
-#define MAX_YUV4_HEADER 80
+#define MAX_YUV4_HEADER 96
 #define MAX_FRAME_HEADER 80
 
 static int yuv4_read_header(AVFormatContext *s)
@@ -53,10 +53,14 @@
             break;
         }
     }
-    if (i == MAX_YUV4_HEADER)
-        return -1;
-    if (strncmp(header, Y4M_MAGIC, strlen(Y4M_MAGIC)))
-        return -1;
+    if (i == MAX_YUV4_HEADER) {
+        av_log(s, AV_LOG_ERROR, "Header too large.\n");
+        return AVERROR(EINVAL);
+    }
+    if (strncmp(header, Y4M_MAGIC, strlen(Y4M_MAGIC))) {
+        av_log(s, AV_LOG_ERROR, "Invalid magic number for yuv4mpeg.\n");
+        return AVERROR(EINVAL);
+    }
 
     header_end = &header[i + 1]; // Include space
     for (tokstart = &header[strlen(Y4M_MAGIC) + 1];
@@ -120,9 +124,7 @@
             } else if (strncmp("422", tokstart, 3) == 0) {
                 pix_fmt = AV_PIX_FMT_YUV422P;
             } else if (strncmp("444alpha", tokstart, 8) == 0 ) {
-                av_log(s, AV_LOG_ERROR, "Cannot handle 4:4:4:4 "
-                       "YUV4MPEG stream.\n");
-                return -1;
+                pix_fmt = AV_PIX_FMT_YUVA444P;
             } else if (strncmp("444", tokstart, 3) == 0) {
                 pix_fmt = AV_PIX_FMT_YUV444P;
             } else if (strncmp("mono16", tokstart, 6) == 0) {
@@ -138,7 +140,7 @@
             } else {
                 av_log(s, AV_LOG_ERROR, "YUV4MPEG stream contains an unknown "
                        "pixel format.\n");
-                return -1;
+                return AVERROR_INVALIDDATA;
             }
             while (tokstart < header_end && *tokstart != 0x20)
                 tokstart++;
@@ -236,7 +238,7 @@
 
     if (width == -1 || height == -1) {
         av_log(s, AV_LOG_ERROR, "YUV4MPEG has invalid header.\n");
-        return -1;
+        return AVERROR_INVALIDDATA;
     }
 
     if (pix_fmt == AV_PIX_FMT_NONE) {
@@ -310,7 +312,6 @@
     if (ret < 0)
         return ret;
     else if (ret != s->packet_size - Y4M_FRAME_MAGIC_LEN) {
-        av_packet_unref(pkt);
         return s->pb->eof_reached ? AVERROR_EOF : AVERROR(EIO);
     }
     pkt->stream_index = 0;
@@ -326,6 +327,8 @@
 
     if (flags & AVSEEK_FLAG_BACKWARD)
         pts = FFMAX(0, pts - 1);
+    if (pts < 0)
+        return -1;
     pos = pts * s->packet_size;
 
     if (avio_seek(s->pb, pos + s->internal->data_offset, SEEK_SET) < 0)
@@ -333,7 +336,7 @@
     return 0;
 }
 
-static int yuv4_probe(AVProbeData *pd)
+static int yuv4_probe(const AVProbeData *pd)
 {
     /* check file header */
     if (strncmp(pd->buf, Y4M_MAGIC, sizeof(Y4M_MAGIC) - 1) == 0)
diff --git a/libavutil/Makefile b/libavutil/Makefile
index 9ed24cf..966eec4 100644
--- a/libavutil/Makefile
+++ b/libavutil/Makefile
@@ -23,6 +23,7 @@
           des.h                                                         \
           dict.h                                                        \
           display.h                                                     \
+          dovi_meta.h                                                   \
           downmix_info.h                                                \
           encryption_info.h                                             \
           error.h                                                       \
@@ -31,6 +32,7 @@
           file.h                                                        \
           frame.h                                                       \
           hash.h                                                        \
+          hdr_dynamic_metadata.h                                        \
           hmac.h                                                        \
           hwcontext.h                                                   \
           hwcontext_cuda.h                                              \
@@ -39,9 +41,11 @@
           hwcontext_dxva2.h                                             \
           hwcontext_qsv.h                                               \
           hwcontext_mediacodec.h                                        \
+          hwcontext_opencl.h                                            \
           hwcontext_vaapi.h                                             \
           hwcontext_videotoolbox.h                                      \
           hwcontext_vdpau.h                                             \
+          hwcontext_vulkan.h                                            \
           imgutils.h                                                    \
           intfloat.h                                                    \
           intreadwrite.h                                                \
@@ -78,6 +82,7 @@
           version.h                                                     \
           xtea.h                                                        \
           tea.h                                                         \
+          tx.h                                                          \
 
 HEADERS-$(CONFIG_LZO)                   += lzo.h
 
@@ -94,6 +99,7 @@
        aes_ctr.o                                                        \
        audio_fifo.o                                                     \
        avstring.o                                                       \
+       avsscanf.o                                                       \
        base64.o                                                         \
        blowfish.o                                                       \
        bprint.o                                                         \
@@ -107,6 +113,7 @@
        des.o                                                            \
        dict.o                                                           \
        display.o                                                        \
+       dovi_meta.o                                                      \
        downmix_info.o                                                   \
        encryption_info.o                                                \
        error.o                                                          \
@@ -118,6 +125,7 @@
        fixed_dsp.o                                                      \
        frame.o                                                          \
        hash.o                                                           \
+       hdr_dynamic_metadata.o                                           \
        hmac.o                                                           \
        hwcontext.o                                                      \
        imgutils.o                                                       \
@@ -156,6 +164,10 @@
        xga_font_data.o                                                  \
        xtea.o                                                           \
        tea.o                                                            \
+       tx.o                                                             \
+       tx_float.o                                                       \
+       tx_double.o                                                      \
+       tx_int32.o
 
 OBJS-$(CONFIG_CUDA)                     += hwcontext_cuda.o
 OBJS-$(CONFIG_D3D11VA)                  += hwcontext_d3d11va.o
@@ -168,6 +180,7 @@
 OBJS-$(CONFIG_VAAPI)                    += hwcontext_vaapi.o
 OBJS-$(CONFIG_VIDEOTOOLBOX)             += hwcontext_videotoolbox.o
 OBJS-$(CONFIG_VDPAU)                    += hwcontext_vdpau.o
+OBJS-$(CONFIG_VULKAN)                   += hwcontext_vulkan.o
 
 OBJS += $(COMPAT_OBJS:%=../compat/%)
 
@@ -175,7 +188,8 @@
 SLIBOBJS-$(HAVE_GNU_WINDRES)            += avutilres.o
 
 SKIPHEADERS-$(HAVE_CUDA_H)             += hwcontext_cuda.h
-SKIPHEADERS-$(CONFIG_CUDA)             += hwcontext_cuda_internal.h
+SKIPHEADERS-$(CONFIG_CUDA)             += hwcontext_cuda_internal.h     \
+                                          cuda_check.h
 SKIPHEADERS-$(CONFIG_D3D11VA)          += hwcontext_d3d11va.h
 SKIPHEADERS-$(CONFIG_DXVA2)            += hwcontext_dxva2.h
 SKIPHEADERS-$(CONFIG_QSV)              += hwcontext_qsv.h
@@ -183,6 +197,7 @@
 SKIPHEADERS-$(CONFIG_VAAPI)            += hwcontext_vaapi.h
 SKIPHEADERS-$(CONFIG_VIDEOTOOLBOX)     += hwcontext_videotoolbox.h
 SKIPHEADERS-$(CONFIG_VDPAU)            += hwcontext_vdpau.h
+SKIPHEADERS-$(CONFIG_VULKAN)           += hwcontext_vulkan.h
 
 TESTPROGS = adler32                                                     \
             aes                                                         \
diff --git a/libavutil/aarch64/asm.S b/libavutil/aarch64/asm.S
index fd32bf7..3ac2ba0 100644
--- a/libavutil/aarch64/asm.S
+++ b/libavutil/aarch64/asm.S
@@ -32,6 +32,10 @@
 #   define FUNC #
 #endif
 
+#ifndef __has_feature
+#   define __has_feature(x) 0
+#endif
+
 .macro  function name, export=0, align=2
     .macro endfunc
 ELF     .size   \name, . - \name
@@ -63,6 +67,8 @@
 .else
         .section        .rodata
 .endif
+#elif defined(_WIN32)
+        .section        .rdata
 #elif !defined(__MACH__)
         .section        .rodata
 #else
@@ -92,7 +98,11 @@
         add             \rd, \rd, :lo12:\val+(\offset)
     .endif
 #elif CONFIG_PIC
+#   if __has_feature(hwaddress_sanitizer)
+        adrp            \rd, :pg_hi21_nc:\val+(\offset)
+#   else
         adrp            \rd, \val+(\offset)
+#   endif
         add             \rd, \rd, :lo12:\val+(\offset)
 #else
         ldr             \rd, =\val+\offset
diff --git a/libavutil/arm/asm.S b/libavutil/arm/asm.S
index 6744f2a..e3a8c7f 100644
--- a/libavutil/arm/asm.S
+++ b/libavutil/arm/asm.S
@@ -46,6 +46,12 @@
 #   define FPU @
 #endif
 
+#if CONFIG_THUMB && defined(__APPLE__)
+#   define TFUNC
+#else
+#   define TFUNC @
+#endif
+
 #if HAVE_AS_ARCH_DIRECTIVE
 #if   HAVE_NEON
         .arch           armv7-a
@@ -98,10 +104,12 @@
         .global EXTERN_ASM\name
 ELF     .type   EXTERN_ASM\name, %function
 FUNC    .func   EXTERN_ASM\name
+TFUNC   .thumb_func EXTERN_ASM\name
 EXTERN_ASM\name:
     .else
 ELF     .type   \name, %function
 FUNC    .func   \name
+TFUNC   .thumb_func \name
 \name:
     .endif
 .endm
@@ -117,6 +125,8 @@
 .else
         .section        .rodata
 .endif
+#elif defined(_WIN32)
+        .section        .rdata
 #elif !defined(__MACH__)
         .section        .rodata
 #else
diff --git a/libavutil/avsscanf.c b/libavutil/avsscanf.c
new file mode 100644
index 0000000..1c85412
--- /dev/null
+++ b/libavutil/avsscanf.c
@@ -0,0 +1,970 @@
+/*
+ * Copyright (c) 2005-2014 Rich Felker, et al.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#include <stdarg.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <string.h>
+#include <float.h>
+
+#include "config.h"
+#include "common.h"
+#include "mem.h"
+#include "avassert.h"
+#include "avstring.h"
+#include "bprint.h"
+
+typedef struct FFFILE {
+    size_t buf_size;
+    unsigned char *buf;
+    unsigned char *rpos, *rend;
+    unsigned char *shend;
+    ptrdiff_t shlim, shcnt;
+    void *cookie;
+    size_t (*read)(struct FFFILE *, unsigned char *, size_t);
+} FFFILE;
+
+#define SIZE_hh -2
+#define SIZE_h  -1
+#define SIZE_def 0
+#define SIZE_l   1
+#define SIZE_L   2
+#define SIZE_ll  3
+
+#define shcnt(f) ((f)->shcnt + ((f)->rpos - (f)->buf))
+
+static int fftoread(FFFILE *f)
+{
+    f->rpos = f->rend = f->buf + f->buf_size;
+    return 0;
+}
+
+static size_t ffstring_read(FFFILE *f, unsigned char *buf, size_t len)
+{
+    char *src = f->cookie;
+    size_t k = len+256;
+    char *end = memchr(src, 0, k);
+
+    if (end) k = end-src;
+    if (k < len) len = k;
+    memcpy(buf, src, len);
+    f->rpos = (void *)(src+len);
+    f->rend = (void *)(src+k);
+    f->cookie = src+k;
+
+    return len;
+}
+
+static int ffuflow(FFFILE *f)
+{
+    unsigned char c;
+    if (!fftoread(f) && f->read(f, &c, 1)==1) return c;
+    return EOF;
+}
+
+static void ffshlim(FFFILE *f, ptrdiff_t lim)
+{
+    f->shlim = lim;
+    f->shcnt = f->buf - f->rpos;
+    /* If lim is nonzero, rend must be a valid pointer. */
+    if (lim && f->rend - f->rpos > lim)
+        f->shend = f->rpos + lim;
+    else
+        f->shend = f->rend;
+}
+
+static int ffshgetc(FFFILE *f)
+{
+    int c;
+    ptrdiff_t cnt = shcnt(f);
+    if (f->shlim && cnt >= f->shlim || (c=ffuflow(f)) < 0) {
+        f->shcnt = f->buf - f->rpos + cnt;
+        f->shend = 0;
+        return EOF;
+    }
+    cnt++;
+    if (f->shlim && f->rend - f->rpos > f->shlim - cnt)
+        f->shend = f->rpos + (f->shlim - cnt);
+    else
+        f->shend = f->rend;
+    f->shcnt = f->buf - f->rpos + cnt;
+    if (f->rpos[-1] != c) f->rpos[-1] = c;
+    return c;
+}
+
+#define shlim(f, lim) ffshlim((f), (lim))
+#define shgetc(f) (((f)->rpos != (f)->shend) ? *(f)->rpos++ : ffshgetc(f))
+#define shunget(f) ((f)->shend ? (void)(f)->rpos-- : (void)0)
+
+static const unsigned char table[] = { -1,
+    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+    0, 1, 2, 3, 4, 5, 6, 7, 8, 9,-1,-1,-1,-1,-1,-1,
+    -1,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,
+    25,26,27,28,29,30,31,32,33,34,35,-1,-1,-1,-1,-1,
+    -1,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,
+    25,26,27,28,29,30,31,32,33,34,35,-1,-1,-1,-1,-1,
+    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+};
+
+static unsigned long long ffintscan(FFFILE *f, unsigned base, int pok, unsigned long long lim)
+{
+    const unsigned char *val = table+1;
+    int c, neg=0;
+    unsigned x;
+    unsigned long long y;
+    if (base > 36 || base == 1) {
+        errno = EINVAL;
+        return 0;
+    }
+    while (av_isspace((c=shgetc(f))));
+    if (c=='+' || c=='-') {
+        neg = -(c=='-');
+        c = shgetc(f);
+    }
+    if ((base == 0 || base == 16) && c=='0') {
+        c = shgetc(f);
+        if ((c|32)=='x') {
+            c = shgetc(f);
+            if (val[c]>=16) {
+                shunget(f);
+                if (pok) shunget(f);
+                else shlim(f, 0);
+                return 0;
+            }
+            base = 16;
+        } else if (base == 0) {
+            base = 8;
+        }
+    } else {
+        if (base == 0) base = 10;
+        if (val[c] >= base) {
+            shunget(f);
+            shlim(f, 0);
+            errno = EINVAL;
+            return 0;
+        }
+    }
+    if (base == 10) {
+        for (x=0; c-'0'<10U && x<=UINT_MAX/10-1; c=shgetc(f))
+            x = x*10 + (c-'0');
+        for (y=x; c-'0'<10U && y<=ULLONG_MAX/10 && 10*y<=ULLONG_MAX-(c-'0'); c=shgetc(f))
+            y = y*10 + (c-'0');
+        if (c-'0'>=10U) goto done;
+    } else if (!(base & base-1)) {
+        int bs = "\0\1\2\4\7\3\6\5"[(0x17*base)>>5&7];
+        for (x=0; val[c]<base && x<=UINT_MAX/32; c=shgetc(f))
+            x = x<<bs | val[c];
+        for (y=x; val[c]<base && y<=ULLONG_MAX>>bs; c=shgetc(f))
+            y = y<<bs | val[c];
+    } else {
+        for (x=0; val[c]<base && x<=UINT_MAX/36-1; c=shgetc(f))
+            x = x*base + val[c];
+        for (y=x; val[c]<base && y<=ULLONG_MAX/base && base*y<=ULLONG_MAX-val[c]; c=shgetc(f))
+            y = y*base + val[c];
+    }
+    if (val[c]<base) {
+        for (; val[c]<base; c=shgetc(f));
+        errno = ERANGE;
+        y = lim;
+        if (lim&1) neg = 0;
+    }
+done:
+    shunget(f);
+    if (y>=lim) {
+        if (!(lim&1) && !neg) {
+            errno = ERANGE;
+            return lim-1;
+        } else if (y>lim) {
+            errno = ERANGE;
+            return lim;
+        }
+    }
+    return (y^neg)-neg;
+}
+
+static long long scanexp(FFFILE *f, int pok)
+{
+    int c;
+    int x;
+    long long y;
+    int neg = 0;
+
+    c = shgetc(f);
+    if (c=='+' || c=='-') {
+        neg = (c=='-');
+        c = shgetc(f);
+        if (c-'0'>=10U && pok) shunget(f);
+    }
+    if (c-'0'>=10U) {
+        shunget(f);
+        return LLONG_MIN;
+    }
+    for (x=0; c-'0'<10U && x<INT_MAX/10; c = shgetc(f))
+        x = 10*x + c-'0';
+    for (y=x; c-'0'<10U && y<LLONG_MAX/100; c = shgetc(f))
+        y = 10*y + c-'0';
+    for (; c-'0'<10U; c = shgetc(f));
+    shunget(f);
+    return neg ? -y : y;
+}
+
+#define LD_B1B_DIG 2
+#define LD_B1B_MAX 9007199, 254740991
+#define KMAX 128
+#define MASK (KMAX-1)
+
+static double decfloat(FFFILE *f, int c, int bits, int emin, int sign, int pok)
+{
+    uint32_t x[KMAX];
+    static const uint32_t th[] = { LD_B1B_MAX };
+    int i, j, k, a, z;
+    long long lrp=0, dc=0;
+    long long e10=0;
+    int lnz = 0;
+    int gotdig = 0, gotrad = 0;
+    int rp;
+    int e2;
+    int emax = -emin-bits+3;
+    int denormal = 0;
+    double y;
+    double frac=0;
+    double bias=0;
+    static const int p10s[] = { 10, 100, 1000, 10000,
+        100000, 1000000, 10000000, 100000000 };
+
+    j=0;
+    k=0;
+
+    /* Don't let leading zeros consume buffer space */
+    for (; c=='0'; c = shgetc(f)) gotdig=1;
+    if (c=='.') {
+        gotrad = 1;
+        for (c = shgetc(f); c=='0'; c = shgetc(f)) gotdig=1, lrp--;
+    }
+
+    x[0] = 0;
+    for (; c-'0'<10U || c=='.'; c = shgetc(f)) {
+        if (c == '.') {
+            if (gotrad) break;
+            gotrad = 1;
+            lrp = dc;
+        } else if (k < KMAX-3) {
+            dc++;
+            if (c!='0') lnz = dc;
+            if (j) x[k] = x[k]*10 + c-'0';
+            else x[k] = c-'0';
+            if (++j==9) {
+                k++;
+                j=0;
+            }
+            gotdig=1;
+        } else {
+            dc++;
+            if (c!='0') {
+                lnz = (KMAX-4)*9;
+                x[KMAX-4] |= 1;
+            }
+        }
+    }
+    if (!gotrad) lrp=dc;
+
+    if (gotdig && (c|32)=='e') {
+        e10 = scanexp(f, pok);
+        if (e10 == LLONG_MIN) {
+            if (pok) {
+                shunget(f);
+            } else {
+                shlim(f, 0);
+                return 0;
+            }
+            e10 = 0;
+        }
+        lrp += e10;
+    } else if (c>=0) {
+        shunget(f);
+    }
+    if (!gotdig) {
+        errno = EINVAL;
+        shlim(f, 0);
+        return 0;
+    }
+
+    /* Handle zero specially to avoid nasty special cases later */
+    if (!x[0]) return sign * 0.0;
+
+    /* Optimize small integers (w/no exponent) and over/under-flow */
+    if (lrp==dc && dc<10 && (bits>30 || x[0]>>bits==0))
+        return sign * (double)x[0];
+    if (lrp > -emin/2) {
+        errno = ERANGE;
+        return sign * DBL_MAX * DBL_MAX;
+    }
+    if (lrp < emin-2*DBL_MANT_DIG) {
+        errno = ERANGE;
+        return sign * DBL_MIN * DBL_MIN;
+    }
+
+    /* Align incomplete final B1B digit */
+    if (j) {
+        for (; j<9; j++) x[k]*=10;
+        k++;
+        j=0;
+    }
+
+    a = 0;
+    z = k;
+    e2 = 0;
+    rp = lrp;
+
+    /* Optimize small to mid-size integers (even in exp. notation) */
+    if (lnz<9 && lnz<=rp && rp < 18) {
+        int bitlim;
+        if (rp == 9) return sign * (double)x[0];
+        if (rp < 9) return sign * (double)x[0] / p10s[8-rp];
+        bitlim = bits-3*(int)(rp-9);
+        if (bitlim>30 || x[0]>>bitlim==0)
+            return sign * (double)x[0] * p10s[rp-10];
+    }
+
+    /* Drop trailing zeros */
+    for (; !x[z-1]; z--);
+
+    /* Align radix point to B1B digit boundary */
+    if (rp % 9) {
+        int rpm9 = rp>=0 ? rp%9 : rp%9+9;
+        int p10 = p10s[8-rpm9];
+        uint32_t carry = 0;
+        for (k=a; k!=z; k++) {
+            uint32_t tmp = x[k] % p10;
+            x[k] = x[k]/p10 + carry;
+            carry = 1000000000/p10 * tmp;
+            if (k==a && !x[k]) {
+                a = (a+1 & MASK);
+                rp -= 9;
+            }
+        }
+        if (carry) x[z++] = carry;
+        rp += 9-rpm9;
+    }
+
+    /* Upscale until desired number of bits are left of radix point */
+    while (rp < 9*LD_B1B_DIG || (rp == 9*LD_B1B_DIG && x[a]<th[0])) {
+        uint32_t carry = 0;
+        e2 -= 29;
+        for (k=(z-1 & MASK); ; k=(k-1 & MASK)) {
+            uint64_t tmp = ((uint64_t)x[k] << 29) + carry;
+            if (tmp > 1000000000) {
+                carry = tmp / 1000000000;
+                x[k] = tmp % 1000000000;
+            } else {
+                carry = 0;
+                x[k] = tmp;
+            }
+            if (k==(z-1 & MASK) && k!=a && !x[k]) z = k;
+            if (k==a) break;
+        }
+        if (carry) {
+            rp += 9;
+            a = (a-1 & MASK);
+            if (a == z) {
+                z = (z-1 & MASK);
+                x[z-1 & MASK] |= x[z];
+            }
+            x[a] = carry;
+        }
+    }
+
+    /* Downscale until exactly number of bits are left of radix point */
+    for (;;) {
+        uint32_t carry = 0;
+        int sh = 1;
+        for (i=0; i<LD_B1B_DIG; i++) {
+            k = (a+i & MASK);
+            if (k == z || x[k] < th[i]) {
+                i=LD_B1B_DIG;
+                break;
+            }
+            if (x[a+i & MASK] > th[i]) break;
+        }
+        if (i==LD_B1B_DIG && rp==9*LD_B1B_DIG) break;
+        /* FIXME: find a way to compute optimal sh */
+        if (rp > 9+9*LD_B1B_DIG) sh = 9;
+        e2 += sh;
+        for (k=a; k!=z; k=(k+1 & MASK)) {
+            uint32_t tmp = x[k] & (1<<sh)-1;
+            x[k] = (x[k]>>sh) + carry;
+            carry = (1000000000>>sh) * tmp;
+            if (k==a && !x[k]) {
+                a = (a+1 & MASK);
+                i--;
+                rp -= 9;
+            }
+        }
+        if (carry) {
+            if ((z+1 & MASK) != a) {
+                x[z] = carry;
+                z = (z+1 & MASK);
+            } else x[z-1 & MASK] |= 1;
+        }
+    }
+
+    /* Assemble desired bits into floating point variable */
+    for (y=i=0; i<LD_B1B_DIG; i++) {
+        if ((a+i & MASK)==z) x[(z=(z+1 & MASK))-1] = 0;
+        y = 1000000000.0L * y + x[a+i & MASK];
+    }
+
+    y *= sign;
+
+    /* Limit precision for denormal results */
+    if (bits > DBL_MANT_DIG+e2-emin) {
+        bits = DBL_MANT_DIG+e2-emin;
+        if (bits<0) bits=0;
+        denormal = 1;
+    }
+
+    /* Calculate bias term to force rounding, move out lower bits */
+    if (bits < DBL_MANT_DIG) {
+        bias = copysign(scalbn(1, 2*DBL_MANT_DIG-bits-1), y);
+        frac = fmod(y, scalbn(1, DBL_MANT_DIG-bits));
+        y -= frac;
+        y += bias;
+    }
+
+    /* Process tail of decimal input so it can affect rounding */
+    if ((a+i & MASK) != z) {
+        uint32_t t = x[a+i & MASK];
+        if (t < 500000000 && (t || (a+i+1 & MASK) != z))
+            frac += 0.25*sign;
+        else if (t > 500000000)
+            frac += 0.75*sign;
+        else if (t == 500000000) {
+            if ((a+i+1 & MASK) == z)
+                frac += 0.5*sign;
+            else
+                frac += 0.75*sign;
+        }
+        if (DBL_MANT_DIG-bits >= 2 && !fmod(frac, 1))
+            frac++;
+    }
+
+    y += frac;
+    y -= bias;
+
+    if ((e2+DBL_MANT_DIG & INT_MAX) > emax-5) {
+        if (fabs(y) >= pow(2, DBL_MANT_DIG)) {
+            if (denormal && bits==DBL_MANT_DIG+e2-emin)
+                denormal = 0;
+            y *= 0.5;
+            e2++;
+        }
+        if (e2+DBL_MANT_DIG>emax || (denormal && frac))
+            errno = ERANGE;
+    }
+
+    return scalbn(y, e2);
+}
+
+static double hexfloat(FFFILE *f, int bits, int emin, int sign, int pok)
+{
+    uint32_t x = 0;
+    double y = 0;
+    double scale = 1;
+    double bias = 0;
+    int gottail = 0, gotrad = 0, gotdig = 0;
+    long long rp = 0;
+    long long dc = 0;
+    long long e2 = 0;
+    int d;
+    int c;
+
+    c = shgetc(f);
+
+    /* Skip leading zeros */
+    for (; c=='0'; c = shgetc(f))
+        gotdig = 1;
+
+    if (c=='.') {
+        gotrad = 1;
+        c = shgetc(f);
+        /* Count zeros after the radix point before significand */
+        for (rp=0; c=='0'; c = shgetc(f), rp--) gotdig = 1;
+    }
+
+    for (; c-'0'<10U || (c|32)-'a'<6U || c=='.'; c = shgetc(f)) {
+        if (c=='.') {
+            if (gotrad) break;
+            rp = dc;
+            gotrad = 1;
+        } else {
+            gotdig = 1;
+            if (c > '9') d = (c|32)+10-'a';
+            else d = c-'0';
+            if (dc<8) {
+                x = x*16 + d;
+            } else if (dc < DBL_MANT_DIG/4+1) {
+                y += d*(scale/=16);
+            } else if (d && !gottail) {
+                y += 0.5*scale;
+                gottail = 1;
+            }
+            dc++;
+        }
+    }
+    if (!gotdig) {
+        shunget(f);
+        if (pok) {
+            shunget(f);
+            if (gotrad) shunget(f);
+        } else {
+            shlim(f, 0);
+        }
+        return sign * 0.0;
+    }
+    if (!gotrad) rp = dc;
+    while (dc<8) x *= 16, dc++;
+    if ((c|32)=='p') {
+        e2 = scanexp(f, pok);
+        if (e2 == LLONG_MIN) {
+            if (pok) {
+                shunget(f);
+            } else {
+                shlim(f, 0);
+                return 0;
+            }
+            e2 = 0;
+        }
+    } else {
+        shunget(f);
+    }
+    e2 += 4*rp - 32;
+
+    if (!x) return sign * 0.0;
+    if (e2 > -emin) {
+        errno = ERANGE;
+        return sign * DBL_MAX * DBL_MAX;
+    }
+    if (e2 < emin-2*DBL_MANT_DIG) {
+        errno = ERANGE;
+        return sign * DBL_MIN * DBL_MIN;
+    }
+
+    while (x < 0x80000000) {
+        if (y>=0.5) {
+            x += x + 1;
+            y += y - 1;
+        } else {
+            x += x;
+            y += y;
+        }
+        e2--;
+    }
+
+    if (bits > 32+e2-emin) {
+        bits = 32+e2-emin;
+        if (bits<0) bits=0;
+    }
+
+    if (bits < DBL_MANT_DIG)
+        bias = copysign(scalbn(1, 32+DBL_MANT_DIG-bits-1), sign);
+
+    if (bits<32 && y && !(x&1)) x++, y=0;
+
+    y = bias + sign*(double)x + sign*y;
+    y -= bias;
+
+    if (!y) errno = ERANGE;
+
+    return scalbn(y, e2);
+}
+
+static double fffloatscan(FFFILE *f, int prec, int pok)
+{
+    int sign = 1;
+    size_t i;
+    int bits;
+    int emin;
+    int c;
+
+    switch (prec) {
+    case 0:
+        bits = FLT_MANT_DIG;
+        emin = FLT_MIN_EXP-bits;
+        break;
+    case 1:
+        bits = DBL_MANT_DIG;
+        emin = DBL_MIN_EXP-bits;
+        break;
+    case 2:
+        bits = DBL_MANT_DIG;
+        emin = DBL_MIN_EXP-bits;
+        break;
+    default:
+        return 0;
+    }
+
+    while (av_isspace((c = shgetc(f))));
+
+    if (c=='+' || c=='-') {
+        sign -= 2*(c=='-');
+        c = shgetc(f);
+    }
+
+    for (i=0; i<8 && (c|32)=="infinity"[i]; i++)
+        if (i<7) c = shgetc(f);
+    if (i==3 || i==8 || (i>3 && pok)) {
+        if (i!=8) {
+            shunget(f);
+            if (pok) for (; i>3; i--) shunget(f);
+        }
+        return sign * INFINITY;
+    }
+    if (!i) for (i=0; i<3 && (c|32)=="nan"[i]; i++)
+        if (i<2) c = shgetc(f);
+    if (i==3) {
+        if (shgetc(f) != '(') {
+            shunget(f);
+            return NAN;
+        }
+        for (i=1; ; i++) {
+            c = shgetc(f);
+            if (c-'0'<10U || c-'A'<26U || c-'a'<26U || c=='_')
+                continue;
+            if (c==')') return NAN;
+            shunget(f);
+            if (!pok) {
+                errno = EINVAL;
+                shlim(f, 0);
+                return 0;
+            }
+            while (i--) shunget(f);
+            return NAN;
+        }
+        return NAN;
+    }
+
+    if (i) {
+        shunget(f);
+        errno = EINVAL;
+        shlim(f, 0);
+        return 0;
+    }
+
+    if (c=='0') {
+        c = shgetc(f);
+        if ((c|32) == 'x')
+            return hexfloat(f, bits, emin, sign, pok);
+        shunget(f);
+        c = '0';
+    }
+
+    return decfloat(f, c, bits, emin, sign, pok);
+}
+
+static void *arg_n(va_list ap, unsigned int n)
+{
+    void *p;
+    unsigned int i;
+    va_list ap2;
+    va_copy(ap2, ap);
+    for (i=n; i>1; i--) va_arg(ap2, void *);
+    p = va_arg(ap2, void *);
+    va_end(ap2);
+    return p;
+}
+
+static void store_int(void *dest, int size, unsigned long long i)
+{
+    if (!dest) return;
+    switch (size) {
+    case SIZE_hh:
+        *(char *)dest = i;
+        break;
+    case SIZE_h:
+        *(short *)dest = i;
+        break;
+    case SIZE_def:
+        *(int *)dest = i;
+        break;
+    case SIZE_l:
+        *(long *)dest = i;
+        break;
+    case SIZE_ll:
+        *(long long *)dest = i;
+        break;
+    }
+}
+
+static int ff_vfscanf(FFFILE *f, const char *fmt, va_list ap)
+{
+    int width;
+    int size;
+    int base;
+    const unsigned char *p;
+    int c, t;
+    char *s;
+    void *dest=NULL;
+    int invert;
+    int matches=0;
+    unsigned long long x;
+    double y;
+    ptrdiff_t pos = 0;
+    unsigned char scanset[257];
+    size_t i;
+
+    for (p=(const unsigned char *)fmt; *p; p++) {
+
+        if (av_isspace(*p)) {
+            while (av_isspace(p[1])) p++;
+            shlim(f, 0);
+            while (av_isspace(shgetc(f)));
+            shunget(f);
+            pos += shcnt(f);
+            continue;
+        }
+        if (*p != '%' || p[1] == '%') {
+            shlim(f, 0);
+            if (*p == '%') {
+                p++;
+                while (av_isspace((c=shgetc(f))));
+            } else {
+                c = shgetc(f);
+            }
+            if (c!=*p) {
+                shunget(f);
+                if (c<0) goto input_fail;
+                goto match_fail;
+            }
+            pos += shcnt(f);
+            continue;
+        }
+
+        p++;
+        if (*p=='*') {
+            dest = 0; p++;
+        } else if (av_isdigit(*p) && p[1]=='$') {
+            dest = arg_n(ap, *p-'0'); p+=2;
+        } else {
+            dest = va_arg(ap, void *);
+        }
+
+        for (width=0; av_isdigit(*p); p++) {
+            width = 10*width + *p - '0';
+        }
+
+        if (*p=='m') {
+            s = 0;
+            p++;
+        }
+
+        size = SIZE_def;
+        switch (*p++) {
+        case 'h':
+            if (*p == 'h') p++, size = SIZE_hh;
+            else size = SIZE_h;
+            break;
+        case 'l':
+            if (*p == 'l') p++, size = SIZE_ll;
+            else size = SIZE_l;
+            break;
+        case 'j':
+            size = SIZE_ll;
+            break;
+        case 'z':
+        case 't':
+            size = SIZE_l;
+            break;
+        case 'L':
+            size = SIZE_L;
+            break;
+        case 'd': case 'i': case 'o': case 'u': case 'x':
+        case 'a': case 'e': case 'f': case 'g':
+        case 'A': case 'E': case 'F': case 'G': case 'X':
+        case 's': case 'c': case '[':
+        case 'S': case 'C':
+        case 'p': case 'n':
+            p--;
+            break;
+        default:
+            goto fmt_fail;
+        }
+
+        t = *p;
+
+        /* C or S */
+        if ((t&0x2f) == 3) {
+            t |= 32;
+            size = SIZE_l;
+        }
+
+        switch (t) {
+            case 'c':
+                if (width < 1) width = 1;
+            case '[':
+                break;
+            case 'n':
+                store_int(dest, size, pos);
+                /* do not increment match count, etc! */
+                continue;
+            default:
+                shlim(f, 0);
+                while (av_isspace(shgetc(f)));
+                shunget(f);
+                pos += shcnt(f);
+        }
+
+        shlim(f, width);
+        if (shgetc(f) < 0) goto input_fail;
+        shunget(f);
+
+        switch (t) {
+            case 's':
+            case 'c':
+            case '[':
+                if (t == 'c' || t == 's') {
+                    memset(scanset, -1, sizeof scanset);
+                    scanset[0] = 0;
+                    if (t == 's') {
+                        scanset[1 + '\t'] = 0;
+                        scanset[1 + '\n'] = 0;
+                        scanset[1 + '\v'] = 0;
+                        scanset[1 + '\f'] = 0;
+                        scanset[1 + '\r'] = 0;
+                        scanset[1 + ' ' ] = 0;
+                    }
+                } else {
+                    if (*++p == '^') p++, invert = 1;
+                    else invert = 0;
+                    memset(scanset, invert, sizeof scanset);
+                    scanset[0] = 0;
+                    if (*p == '-') p++, scanset[1+'-'] = 1-invert;
+                    else if (*p == ']') p++, scanset[1+']'] = 1-invert;
+                    for (; *p != ']'; p++) {
+                        if (!*p) goto fmt_fail;
+                        if (*p=='-' && p[1] && p[1] != ']')
+                            for (c=p++[-1]; c<*p; c++)
+                                scanset[1+c] = 1-invert;
+                        scanset[1+*p] = 1-invert;
+                    }
+                }
+                s = 0;
+                i = 0;
+                if ((s = dest)) {
+                    while (scanset[(c=shgetc(f))+1])
+                        s[i++] = c;
+                } else {
+                    while (scanset[(c=shgetc(f))+1]);
+                }
+                shunget(f);
+                if (!shcnt(f)) goto match_fail;
+                if (t == 'c' && shcnt(f) != width) goto match_fail;
+                if (t != 'c') {
+                    if (s) s[i] = 0;
+                }
+                break;
+            case 'p':
+            case 'X':
+            case 'x':
+                base = 16;
+                goto int_common;
+            case 'o':
+                base = 8;
+                goto int_common;
+            case 'd':
+            case 'u':
+                base = 10;
+                goto int_common;
+            case 'i':
+                base = 0;
+int_common:
+                x = ffintscan(f, base, 0, ULLONG_MAX);
+                if (!shcnt(f))
+                    goto match_fail;
+                if (t=='p' && dest)
+                    *(void **)dest = (void *)(uintptr_t)x;
+                else
+                    store_int(dest, size, x);
+                break;
+            case 'a': case 'A':
+            case 'e': case 'E':
+            case 'f': case 'F':
+            case 'g': case 'G':
+                y = fffloatscan(f, size, 0);
+                if (!shcnt(f))
+                    goto match_fail;
+                if (dest) {
+                    switch (size) {
+                    case SIZE_def:
+                        *(float *)dest = y;
+                        break;
+                    case SIZE_l:
+                        *(double *)dest = y;
+                        break;
+                    case SIZE_L:
+                        *(double *)dest = y;
+                        break;
+                    }
+                }
+                break;
+        }
+
+        pos += shcnt(f);
+        if (dest) matches++;
+    }
+    if (0) {
+fmt_fail:
+input_fail:
+        if (!matches) matches--;
+    }
+match_fail:
+    return matches;
+}
+
+static int ff_vsscanf(const char *s, const char *fmt, va_list ap)
+{
+    FFFILE f = {
+        .buf = (void *)s, .cookie = (void *)s,
+        .read = ffstring_read,
+    };
+
+    return ff_vfscanf(&f, fmt, ap);
+}
+
+int av_sscanf(const char *string, const char *format, ...)
+{
+    int ret;
+    va_list ap;
+    va_start(ap, format);
+    ret = ff_vsscanf(string, format, ap);
+    va_end(ap);
+    return ret;
+}
diff --git a/libavutil/avstring.c b/libavutil/avstring.c
index f03dd25..f4b8ed2 100644
--- a/libavutil/avstring.c
+++ b/libavutil/avstring.c
@@ -222,12 +222,13 @@
 
 int av_strncasecmp(const char *a, const char *b, size_t n)
 {
-    const char *end = a + n;
     uint8_t c1, c2;
+    if (n <= 0)
+        return 0;
     do {
         c1 = av_tolower(*a++);
         c2 = av_tolower(*b++);
-    } while (a < end && c1 && c1 == c2);
+    } while (--n && c1 && c1 == c2);
     return c1 - c2;
 }
 
@@ -256,12 +257,18 @@
 
 const char *av_basename(const char *path)
 {
-    char *p = strrchr(path, '/');
-
+    char *p;
 #if HAVE_DOS_PATHS
-    char *q = strrchr(path, '\\');
-    char *d = strchr(path, ':');
+    char *q, *d;
+#endif
 
+    if (!path || *path == '\0')
+        return ".";
+
+    p = strrchr(path, '/');
+#if HAVE_DOS_PATHS
+    q = strrchr(path, '\\');
+    d = strchr(path, ':');
     p = FFMAX3(p, q, d);
 #endif
 
@@ -273,11 +280,11 @@
 
 const char *av_dirname(char *path)
 {
-    char *p = strrchr(path, '/');
+    char *p = path ? strrchr(path, '/') : NULL;
 
 #if HAVE_DOS_PATHS
-    char *q = strrchr(path, '\\');
-    char *d = strchr(path, ':');
+    char *q = path ? strrchr(path, '\\') : NULL;
+    char *d = path ? strchr(path, ':')  : NULL;
 
     d = d ? d + 1 : d;
 
diff --git a/libavutil/avstring.h b/libavutil/avstring.h
index 04d2695..274335c 100644
--- a/libavutil/avstring.h
+++ b/libavutil/avstring.h
@@ -274,16 +274,21 @@
 
 /**
  * Thread safe basename.
- * @param path the path, on DOS both \ and / are considered separators.
+ * @param path the string to parse, on DOS both \ and / are considered separators.
  * @return pointer to the basename substring.
+ * If path does not contain a slash, the function returns a copy of path.
+ * If path is a NULL pointer or points to an empty string, a pointer
+ * to a string "." is returned.
  */
 const char *av_basename(const char *path);
 
 /**
  * Thread safe dirname.
- * @param path the path, on DOS both \ and / are considered separators.
- * @return the path with the separator replaced by the string terminator or ".".
- * @note the function may change the input string.
+ * @param path the string to parse, on DOS both \ and / are considered separators.
+ * @return A pointer to a string that's the parent directory of path.
+ * If path is a NULL pointer or points to an empty string, a pointer
+ * to a string "." is returned.
+ * @note the function may modify the contents of the path, so copies should be passed.
  */
 const char *av_dirname(char *path);
 
@@ -401,6 +406,12 @@
 int av_match_list(const char *name, const char *list, char separator);
 
 /**
+ * See libc sscanf manual for more information.
+ * Locale-independent sscanf implementation.
+ */
+int av_sscanf(const char *string, const char *format, ...);
+
+/**
  * @}
  */
 
diff --git a/libavutil/buffer.c b/libavutil/buffer.c
index 8d1aa5f..6d9cb74 100644
--- a/libavutil/buffer.c
+++ b/libavutil/buffer.c
@@ -20,6 +20,7 @@
 #include <stdint.h>
 #include <string.h>
 
+#include "avassert.h"
 #include "buffer_internal.h"
 #include "common.h"
 #include "mem.h"
@@ -116,7 +117,7 @@
     } else
         av_freep(dst);
 
-    if (atomic_fetch_add_explicit(&b->refcount, -1, memory_order_acq_rel) == 1) {
+    if (atomic_fetch_sub_explicit(&b->refcount, 1, memory_order_acq_rel) == 1) {
         b->free(b->opaque, b->data);
         av_freep(&b);
     }
@@ -281,7 +282,7 @@
     pool   = *ppool;
     *ppool = NULL;
 
-    if (atomic_fetch_add_explicit(&pool->refcount, -1, memory_order_acq_rel) == 1)
+    if (atomic_fetch_sub_explicit(&pool->refcount, 1, memory_order_acq_rel) == 1)
         buffer_pool_free(pool);
 }
 
@@ -298,7 +299,7 @@
     pool->pool = buf;
     ff_mutex_unlock(&pool->mutex);
 
-    if (atomic_fetch_add_explicit(&pool->refcount, -1, memory_order_acq_rel) == 1)
+    if (atomic_fetch_sub_explicit(&pool->refcount, 1, memory_order_acq_rel) == 1)
         buffer_pool_free(pool);
 }
 
@@ -355,3 +356,10 @@
 
     return ret;
 }
+
+void *av_buffer_pool_buffer_get_opaque(AVBufferRef *ref)
+{
+    BufferPoolEntry *buf = ref->buffer->opaque;
+    av_assert0(buf);
+    return buf->opaque;
+}
diff --git a/libavutil/buffer.h b/libavutil/buffer.h
index 73b6bd0..e0f9431 100644
--- a/libavutil/buffer.h
+++ b/libavutil/buffer.h
@@ -285,6 +285,19 @@
 AVBufferRef *av_buffer_pool_get(AVBufferPool *pool);
 
 /**
+ * Query the original opaque parameter of an allocated buffer in the pool.
+ *
+ * @param ref a buffer reference to a buffer returned by av_buffer_pool_get.
+ * @return the opaque parameter set by the buffer allocator function of the
+ *         buffer pool.
+ *
+ * @note the opaque parameter of ref is used by the buffer pool implementation,
+ * therefore you have to use this function to access the original opaque
+ * parameter of an allocated buffer.
+ */
+void *av_buffer_pool_buffer_get_opaque(AVBufferRef *ref);
+
+/**
  * @}
  */
 
diff --git a/libavutil/colorspace.h b/libavutil/colorspace.h
index d0be8cb..ef6f610 100644
--- a/libavutil/colorspace.h
+++ b/libavutil/colorspace.h
@@ -119,4 +119,32 @@
 (((FIX(0.50000) * r1 - FIX(0.41869) * g1 - \
    FIX(0.08131) * b1 + (ONE_HALF) - 1) >> (SCALEBITS)) + 128)
 
+// Conversion macros for 8-bit RGB to YUV
+// Derived from ITU-R BT.709-6 (06/2015) Item 3.5
+// https://www.itu.int/rec/R-REC-BT.709-6-201506-I/en
+
+#define RGB_TO_Y_BT709(r, g, b) \
+((FIX(0.21260*219.0/255.0) * (r) + FIX(0.71520*219.0/255.0) * (g) + \
+  FIX(0.07220*219.0/255.0) * (b) + (ONE_HALF + (16 << SCALEBITS))) >> SCALEBITS)
+
+#define RGB_TO_U_BT709(r1, g1, b1, shift)\
+(((- FIX(0.11457*224.0/255.0) * r1 - FIX(0.38543*224.0/255.0) * g1 +         \
+     FIX(0.50000*224.0/255.0) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)
+
+#define RGB_TO_V_BT709(r1, g1, b1, shift)\
+(((FIX(0.50000*224.0/255.0) * r1 - FIX(0.45415*224.0/255.0) * g1 -           \
+   FIX(0.04585*224.0/255.0) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)
+
+#define RGB_TO_Y_BT709_FULL(r, g, b) \
+(FFMIN((FIX(0.21260) * (r) + FIX(0.71520) * (g) + \
+  FIX(0.07220) * (b) + (ONE_HALF)) >> SCALEBITS, 255))
+
+#define RGB_TO_U_BT709_FULL(r1, g1, b1)\
+(((- FIX(0.11457) * r1 - FIX(0.38543) * g1 + \
+     FIX(0.50000) * b1 + (ONE_HALF) - 1) >> (SCALEBITS)) + 128)
+
+#define RGB_TO_V_BT709_FULL(r1, g1, b1)\
+(((FIX(0.50000) * r1 - FIX(0.45415) * g1 - \
+   FIX(0.04585) * b1 + (ONE_HALF) - 1) >> (SCALEBITS)) + 128)
+
 #endif /* AVUTIL_COLORSPACE_H */
diff --git a/libavutil/common.h b/libavutil/common.h
index 8db0291..142ff9a 100644
--- a/libavutil/common.h
+++ b/libavutil/common.h
@@ -53,7 +53,7 @@
 //rounded division & shift
 #define RSHIFT(a,b) ((a) > 0 ? ((a) + ((1<<(b))>>1))>>(b) : ((a) + ((1<<(b))>>1)-1)>>(b))
 /* assume b>0 */
-#define ROUNDED_DIV(a,b) (((a)>0 ? (a) + ((b)>>1) : (a) - ((b)>>1))/(b))
+#define ROUNDED_DIV(a,b) (((a)>=0 ? (a) + ((b)>>1) : (a) - ((b)>>1))/(b))
 /* Fast a/(1<<b) rounded toward +inf. Assume a>=0 and b>=0 */
 #define AV_CEIL_RSHIFT(a,b) (!av_builtin_constant_p(b) ? -((-(a)) >> (b)) \
                                                        : ((a) + (1<<(b)) - 1) >> (b))
@@ -240,7 +240,7 @@
  */
 static av_always_inline av_const unsigned av_mod_uintp2_c(unsigned a, unsigned p)
 {
-    return a & ((1 << p) - 1);
+    return a & ((1U << p) - 1);
 }
 
 /**
@@ -373,7 +373,9 @@
  * @param GET_BYTE Expression reading one byte from the input.
  *                 Evaluated up to 7 times (4 for the currently
  *                 assigned Unicode range).  With a memory buffer
- *                 input, this could be *ptr++.
+ *                 input, this could be *ptr++, or if you want to make sure
+ *                 that *ptr stops at the end of a NULL terminated string then
+ *                 *ptr ? *ptr++ : 0
  * @param ERROR    Expression to be evaluated on invalid input,
  *                 typically a goto statement.
  *
@@ -387,11 +389,11 @@
     {\
         uint32_t top = (val & 128) >> 1;\
         if ((val & 0xc0) == 0x80 || val >= 0xFE)\
-            ERROR\
+            {ERROR}\
         while (val & top) {\
-            int tmp= (GET_BYTE) - 128;\
+            unsigned int tmp = (GET_BYTE) - 128;\
             if(tmp>>6)\
-                ERROR\
+                {ERROR}\
             val= (val<<6) + tmp;\
             top <<= 5;\
         }\
@@ -408,13 +410,13 @@
  *                  typically a goto statement.
  */
 #define GET_UTF16(val, GET_16BIT, ERROR)\
-    val = GET_16BIT;\
+    val = (GET_16BIT);\
     {\
         unsigned int hi = val - 0xD800;\
         if (hi < 0x800) {\
-            val = GET_16BIT - 0xDC00;\
+            val = (GET_16BIT) - 0xDC00;\
             if (val > 0x3FFU || hi > 0x3FFU)\
-                ERROR\
+                {ERROR}\
             val += (hi<<10) + 0x10000;\
         }\
     }\
diff --git a/libavutil/cuda_check.h b/libavutil/cuda_check.h
new file mode 100644
index 0000000..d02ea7e
--- /dev/null
+++ b/libavutil/cuda_check.h
@@ -0,0 +1,64 @@
+/*
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+
+#ifndef AVUTIL_CUDA_CHECK_H
+#define AVUTIL_CUDA_CHECK_H
+
+typedef CUresult CUDAAPI cuda_check_GetErrorName(CUresult error, const char** pstr);
+typedef CUresult CUDAAPI cuda_check_GetErrorString(CUresult error, const char** pstr);
+
+/**
+ * Wrap a CUDA function call and print error information if it fails.
+ */
+static inline int ff_cuda_check(void *avctx,
+                                void *cuGetErrorName_fn, void *cuGetErrorString_fn,
+                                CUresult err, const char *func)
+{
+    const char *err_name;
+    const char *err_string;
+
+    av_log(avctx, AV_LOG_TRACE, "Calling %s\n", func);
+
+    if (err == CUDA_SUCCESS)
+        return 0;
+
+    ((cuda_check_GetErrorName *)cuGetErrorName_fn)(err, &err_name);
+    ((cuda_check_GetErrorString *)cuGetErrorString_fn)(err, &err_string);
+
+    av_log(avctx, AV_LOG_ERROR, "%s failed", func);
+    if (err_name && err_string)
+        av_log(avctx, AV_LOG_ERROR, " -> %s: %s", err_name, err_string);
+    av_log(avctx, AV_LOG_ERROR, "\n");
+
+    return AVERROR_EXTERNAL;
+}
+
+/**
+ * Convenience wrapper for ff_cuda_check when directly linking libcuda.
+ */
+
+#define FF_CUDA_CHECK(avclass, x) ff_cuda_check(avclass, cuGetErrorName, cuGetErrorString, (x), #x)
+
+/**
+ * Convenience wrapper for ff_cuda_check when dynamically loading cuda symbols.
+ */
+
+#define FF_CUDA_CHECK_DL(avclass, cudl, x) ff_cuda_check(avclass, cudl->cuGetErrorName, cudl->cuGetErrorString, (x), #x)
+
+#endif /* AVUTIL_CUDA_CHECK_H */
diff --git a/libavdevice/libndi_newtek_common.h b/libavutil/dovi_meta.c
similarity index 67%
rename from libavdevice/libndi_newtek_common.h
rename to libavutil/dovi_meta.c
index 8990317..7bd08f6 100644
--- a/libavdevice/libndi_newtek_common.h
+++ b/libavutil/dovi_meta.c
@@ -1,6 +1,5 @@
 /*
- * NewTek NDI common code
- * Copyright (c) 2017 Maksym Veremeyenko
+ * Copyright (c) 2020 Jun Zhao<barryjzhao@tencent.com>
  *
  * This file is part of FFmpeg.
  *
@@ -19,12 +18,18 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
-#ifndef AVDEVICE_LIBNDI_NEWTEK_COMMON_H
-#define AVDEVICE_LIBNDI_NEWTEK_COMMON_H
+#include "dovi_meta.h"
+#include "mem.h"
 
-#include <Processing.NDI.Lib.h>
+AVDOVIDecoderConfigurationRecord *av_dovi_alloc(size_t *size)
+{
+    AVDOVIDecoderConfigurationRecord *dovi =
+        av_mallocz(sizeof(AVDOVIDecoderConfigurationRecord));
+    if (!dovi)
+        return NULL;
 
-#define NDI_TIME_BASE 10000000
-#define NDI_TIME_BASE_Q (AVRational){1, NDI_TIME_BASE}
+     if (size)
+        *size = sizeof(*dovi);
 
-#endif
+    return dovi;
+}
diff --git a/libavutil/dovi_meta.h b/libavutil/dovi_meta.h
new file mode 100644
index 0000000..299911d
--- /dev/null
+++ b/libavutil/dovi_meta.h
@@ -0,0 +1,70 @@
+/*
+ * Copyright (c) 2020 Vacing Fang <vacingfang@tencent.com>
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file
+ * DOVI configuration
+ */
+
+
+#ifndef AVUTIL_DOVI_META_H
+#define AVUTIL_DOVI_META_H
+
+#include <stdint.h>
+#include <stddef.h>
+
+/*
+ * DOVI configuration
+ * ref: dolby-vision-bitstreams-within-the-iso-base-media-file-format-v2.1.2
+        dolby-vision-bitstreams-in-mpeg-2-transport-stream-multiplex-v1.2
+ * @code
+ * uint8_t  dv_version_major, the major version number that the stream complies with
+ * uint8_t  dv_version_minor, the minor version number that the stream complies with
+ * uint8_t  dv_profile, the Dolby Vision profile
+ * uint8_t  dv_level, the Dolby Vision level
+ * uint8_t  rpu_present_flag
+ * uint8_t  el_present_flag
+ * uint8_t  bl_present_flag
+ * uint8_t  dv_bl_signal_compatibility_id
+ * @endcode
+ *
+ * @note The struct must be allocated with av_dovi_alloc() and
+ *       its size is not a part of the public ABI.
+ */
+typedef struct AVDOVIDecoderConfigurationRecord {
+    uint8_t dv_version_major;
+    uint8_t dv_version_minor;
+    uint8_t dv_profile;
+    uint8_t dv_level;
+    uint8_t rpu_present_flag;
+    uint8_t el_present_flag;
+    uint8_t bl_present_flag;
+    uint8_t dv_bl_signal_compatibility_id;
+} AVDOVIDecoderConfigurationRecord;
+
+/**
+ * Allocate a AVDOVIDecoderConfigurationRecord structure and initialize its
+ * fields to default values.
+ *
+ * @return the newly allocated struct or NULL on failure
+ */
+AVDOVIDecoderConfigurationRecord *av_dovi_alloc(size_t *size);
+
+#endif /* AVUTIL_DOVI_META_H */
diff --git a/libavutil/dynarray.h b/libavutil/dynarray.h
index 034a9fe..3a7e146 100644
--- a/libavutil/dynarray.h
+++ b/libavutil/dynarray.h
@@ -23,7 +23,7 @@
 #include "mem.h"
 
 /**
- * Add an element of to a dynamic array.
+ * Add an element to a dynamic array.
  *
  * The array is reallocated when its number of elements reaches powers of 2.
  * Therefore, the amortized cost of adding an element is constant.
diff --git a/libavutil/encryption_info.c b/libavutil/encryption_info.c
index 812c704..dd3fa71 100644
--- a/libavutil/encryption_info.c
+++ b/libavutil/encryption_info.c
@@ -331,8 +331,10 @@
             memcpy(cur_buffer, cur_info->key_ids[i], cur_info->key_id_size);
             cur_buffer += cur_info->key_id_size;
         }
-        memcpy(cur_buffer, cur_info->data, cur_info->data_size);
-        cur_buffer += cur_info->data_size;
+        if (cur_info->data_size > 0) {
+            memcpy(cur_buffer, cur_info->data, cur_info->data_size);
+            cur_buffer += cur_info->data_size;
+        }
     }
 
     return buffer;
diff --git a/libavutil/eval.c b/libavutil/eval.c
index 5da9a6d..d527f6a 100644
--- a/libavutil/eval.c
+++ b/libavutil/eval.c
@@ -163,10 +163,11 @@
         e_last, e_st, e_while, e_taylor, e_root, e_floor, e_ceil, e_trunc, e_round,
         e_sqrt, e_not, e_random, e_hypot, e_gcd,
         e_if, e_ifnot, e_print, e_bitand, e_bitor, e_between, e_clip, e_atan2, e_lerp,
+        e_sgn,
     } type;
     double value; // is sign in other types
+    int const_index;
     union {
-        int const_index;
         double (*func0)(double);
         double (*func1)(void *, double);
         double (*func2)(void *, double, double);
@@ -184,7 +185,7 @@
 {
     switch (e->type) {
         case e_value:  return e->value;
-        case e_const:  return e->value * p->const_values[e->a.const_index];
+        case e_const:  return e->value * p->const_values[e->const_index];
         case e_func0:  return e->value * e->a.func0(eval_expr(p, e->param[0]));
         case e_func1:  return e->value * e->a.func1(p->opaque, eval_expr(p, e->param[0]));
         case e_func2:  return e->value * e->a.func2(p->opaque, eval_expr(p, e->param[0]), eval_expr(p, e->param[1]));
@@ -197,6 +198,7 @@
         case e_ceil :  return e->value * ceil (eval_expr(p, e->param[0]));
         case e_trunc:  return e->value * trunc(eval_expr(p, e->param[0]));
         case e_round:  return e->value * round(eval_expr(p, e->param[0]));
+        case e_sgn:    return e->value * FFDIFFSIGN(eval_expr(p, e->param[0]), 0);
         case e_sqrt:   return e->value * sqrt (eval_expr(p, e->param[0]));
         case e_not:    return e->value * (eval_expr(p, e->param[0]) == 0);
         case e_if:     return e->value * (eval_expr(p, e->param[0]) ? eval_expr(p, e->param[1]) :
@@ -365,7 +367,7 @@
         if (strmatch(p->s, p->const_names[i])) {
             p->s+= strlen(p->const_names[i]);
             d->type = e_const;
-            d->a.const_index = i;
+            d->const_index = i;
             *e = d;
             return 0;
         }
@@ -470,11 +472,13 @@
     else if (strmatch(next, "clip"  )) d->type = e_clip;
     else if (strmatch(next, "atan2" )) d->type = e_atan2;
     else if (strmatch(next, "lerp"  )) d->type = e_lerp;
+    else if (strmatch(next, "sgn"   )) d->type = e_sgn;
     else {
         for (i=0; p->func1_names && p->func1_names[i]; i++) {
             if (strmatch(next, p->func1_names[i])) {
                 d->a.func1 = p->funcs1[i];
                 d->type = e_func1;
+                d->const_index = i;
                 *e = d;
                 return 0;
             }
@@ -484,6 +488,7 @@
             if (strmatch(next, p->func2_names[i])) {
                 d->a.func2 = p->funcs2[i];
                 d->type = e_func2;
+                d->const_index = i;
                 *e = d;
                 return 0;
             }
@@ -657,6 +662,7 @@
         case e_sqrt:
         case e_not:
         case e_random:
+        case e_sgn:
             return verify_expr(e->param[0]) && !e->param[1];
         case e_print:
             return verify_expr(e->param[0])
@@ -731,6 +737,32 @@
     return ret;
 }
 
+static int expr_count(AVExpr *e, unsigned *counter, int size, int type)
+{
+    int i;
+
+    if (!e || !counter || !size)
+        return AVERROR(EINVAL);
+
+    for (i = 0; e->type != type && i < 3 && e->param[i]; i++)
+        expr_count(e->param[i], counter, size, type);
+
+    if (e->type == type && e->const_index < size)
+        counter[e->const_index]++;
+
+    return 0;
+}
+
+int av_expr_count_vars(AVExpr *e, unsigned *counter, int size)
+{
+    return expr_count(e, counter, size, e_const);
+}
+
+int av_expr_count_func(AVExpr *e, unsigned *counter, int size, int arg)
+{
+    return expr_count(e, counter, size, ((int[]){e_const, e_func1, e_func2})[arg]);
+}
+
 double av_expr_eval(AVExpr *e, const double *const_values, void *opaque)
 {
     Parser p = { 0 };
diff --git a/libavutil/eval.h b/libavutil/eval.h
index dacd22b..068c62c 100644
--- a/libavutil/eval.h
+++ b/libavutil/eval.h
@@ -87,6 +87,30 @@
 double av_expr_eval(AVExpr *e, const double *const_values, void *opaque);
 
 /**
+ * Track the presence of variables and their number of occurrences in a parsed expression
+ *
+ * @param counter a zero-initialized array where the count of each variable will be stored
+ * @param size size of array
+ * @return 0 on success, a negative value indicates that no expression or array was passed
+ * or size was zero
+ */
+int av_expr_count_vars(AVExpr *e, unsigned *counter, int size);
+
+/**
+ * Track the presence of user provided functions and their number of occurrences
+ * in a parsed expression.
+ *
+ * @param counter a zero-initialized array where the count of each function will be stored
+ *                if you passed 5 functions with 2 arguments to av_expr_parse()
+ *                then for arg=2 this will use upto 5 entries.
+ * @param size size of array
+ * @param arg number of arguments the counted functions have
+ * @return 0 on success, a negative value indicates that no expression or array was passed
+ * or size was zero
+ */
+int av_expr_count_func(AVExpr *e, unsigned *counter, int size, int arg);
+
+/**
  * Free a parsed expression previously created with av_expr_parse().
  */
 void av_expr_free(AVExpr *e);
diff --git a/libavutil/file.c b/libavutil/file.c
index d946085..f228b72 100644
--- a/libavutil/file.c
+++ b/libavutil/file.c
@@ -60,6 +60,7 @@
     off_t off_size;
     char errbuf[128];
     *bufptr = NULL;
+    *size = 0;
 
     if (fd < 0) {
         err = AVERROR(errno);
@@ -97,6 +98,7 @@
         av_strerror(err, errbuf, sizeof(errbuf));
         av_log(&file_log_ctx, AV_LOG_ERROR, "Error occurred in mmap(): %s\n", errbuf);
         close(fd);
+        *size = 0;
         return err;
     }
     *bufptr = ptr;
@@ -108,6 +110,7 @@
         if (!mh) {
             av_log(&file_log_ctx, AV_LOG_ERROR, "Error occurred in CreateFileMapping()\n");
             close(fd);
+            *size = 0;
             return -1;
         }
 
@@ -116,6 +119,7 @@
         if (!ptr) {
             av_log(&file_log_ctx, AV_LOG_ERROR, "Error occurred in MapViewOfFile()\n");
             close(fd);
+            *size = 0;
             return -1;
         }
 
@@ -126,6 +130,7 @@
     if (!*bufptr) {
         av_log(&file_log_ctx, AV_LOG_ERROR, "Memory allocation error occurred\n");
         close(fd);
+        *size = 0;
         return AVERROR(ENOMEM);
     }
     read(fd, *bufptr, *size);
@@ -138,7 +143,7 @@
 
 void av_file_unmap(uint8_t *bufptr, size_t size)
 {
-    if (!size)
+    if (!size || !bufptr)
         return;
 #if HAVE_MMAP
     munmap(bufptr, size);
diff --git a/libavutil/file_open.c b/libavutil/file_open.c
index a8da283..cc302f2 100644
--- a/libavutil/file_open.c
+++ b/libavutil/file_open.c
@@ -138,7 +138,7 @@
 #else
     snprintf(*filename, len, "/tmp/%sXXXXXX", prefix);
     fd = mkstemp(*filename);
-#if defined(_WIN32) || defined (__ANDROID__)
+#if defined(_WIN32) || defined (__ANDROID__) || defined(__DJGPP__)
     if (fd < 0) {
         snprintf(*filename, len, "./%sXXXXXX", prefix);
         fd = mkstemp(*filename);
diff --git a/libavutil/frame.c b/libavutil/frame.c
index 4460325..769851c 100644
--- a/libavutil/frame.c
+++ b/libavutil/frame.c
@@ -25,6 +25,7 @@
 #include "imgutils.h"
 #include "mem.h"
 #include "samplefmt.h"
+#include "hwcontext.h"
 
 #if FF_API_FRAME_GET_SET
 MAKE_ACCESSORS(AVFrame, frame, int64_t, best_effort_timestamp)
@@ -243,11 +244,13 @@
         return ret;
 
     frame->buf[0] = av_buffer_alloc(ret + 4*plane_padding);
-    if (!frame->buf[0])
+    if (!frame->buf[0]) {
+        ret = AVERROR(ENOMEM);
         goto fail;
+    }
 
-    if (av_image_fill_pointers(frame->data, frame->format, padded_height,
-                               frame->buf[0]->data, frame->linesize) < 0)
+    if ((ret = av_image_fill_pointers(frame->data, frame->format, padded_height,
+                                      frame->buf[0]->data, frame->linesize)) < 0)
         goto fail;
 
     for (i = 1; i < 4; i++) {
@@ -260,7 +263,7 @@
     return 0;
 fail:
     av_frame_unref(frame);
-    return AVERROR(ENOMEM);
+    return ret;
 }
 
 static int get_audio_buffer(AVFrame *frame, int align)
@@ -624,7 +627,11 @@
     tmp.channels       = frame->channels;
     tmp.channel_layout = frame->channel_layout;
     tmp.nb_samples     = frame->nb_samples;
-    ret = av_frame_get_buffer(&tmp, 32);
+
+    if (frame->hw_frames_ctx)
+        ret = av_hwframe_get_buffer(frame->hw_frames_ctx, &tmp, 0);
+    else
+        ret = av_frame_get_buffer(&tmp, 32);
     if (ret < 0)
         return ret;
 
@@ -750,6 +757,9 @@
         dst->height < src->height)
         return AVERROR(EINVAL);
 
+    if (src->hw_frames_ctx || dst->hw_frames_ctx)
+        return av_hwframe_transfer_data(dst, src, 0);
+
     planes = av_pix_fmt_count_planes(dst->format);
     for (i = 0; i < planes; i++)
         if (!dst->data[i] || !src->data[i])
@@ -804,7 +814,7 @@
 {
     int i;
 
-    for (i = 0; i < frame->nb_side_data; i++) {
+    for (i = frame->nb_side_data - 1; i >= 0; i--) {
         AVFrameSideData *sd = frame->side_data[i];
         if (sd->type == type) {
             free_side_data(&frame->side_data[i]);
@@ -831,12 +841,15 @@
     case AV_FRAME_DATA_MASTERING_DISPLAY_METADATA:  return "Mastering display metadata";
     case AV_FRAME_DATA_CONTENT_LIGHT_LEVEL:         return "Content light level metadata";
     case AV_FRAME_DATA_GOP_TIMECODE:                return "GOP timecode";
+    case AV_FRAME_DATA_S12M_TIMECODE:               return "SMPTE 12-1 timecode";
     case AV_FRAME_DATA_SPHERICAL:                   return "Spherical Mapping";
     case AV_FRAME_DATA_ICC_PROFILE:                 return "ICC profile";
 #if FF_API_FRAME_QP
     case AV_FRAME_DATA_QP_TABLE_PROPERTIES:         return "QP table properties";
     case AV_FRAME_DATA_QP_TABLE_DATA:               return "QP table data";
 #endif
+    case AV_FRAME_DATA_DYNAMIC_HDR_PLUS: return "HDR Dynamic Metadata SMPTE2094-40 (HDR10+)";
+    case AV_FRAME_DATA_REGIONS_OF_INTEREST: return "Regions Of Interest";
     }
     return NULL;
 }
diff --git a/libavutil/frame.h b/libavutil/frame.h
index 9d57d6c..b5afb58 100644
--- a/libavutil/frame.h
+++ b/libavutil/frame.h
@@ -158,6 +158,27 @@
      */
     AV_FRAME_DATA_QP_TABLE_DATA,
 #endif
+
+    /**
+     * Timecode which conforms to SMPTE ST 12-1. The data is an array of 4 uint32_t
+     * where the first uint32_t describes how many (1-3) of the other timecodes are used.
+     * The timecode format is described in the av_timecode_get_smpte_from_framenum()
+     * function in libavutil/timecode.c.
+     */
+    AV_FRAME_DATA_S12M_TIMECODE,
+
+    /**
+     * HDR dynamic metadata associated with a video frame. The payload is
+     * an AVDynamicHDRPlus type and contains information for color
+     * volume transform - application 4 of SMPTE 2094-40:2016 standard.
+     */
+    AV_FRAME_DATA_DYNAMIC_HDR_PLUS,
+
+    /**
+     * Regions Of Interest, the data is an array of AVRegionOfInterest type, the number of
+     * array element is implied by AVFrameSideData.size / AVRegionOfInterest.self_size.
+     */
+    AV_FRAME_DATA_REGIONS_OF_INTEREST,
 };
 
 enum AVActiveFormatDescription {
@@ -186,6 +207,62 @@
 } AVFrameSideData;
 
 /**
+ * Structure describing a single Region Of Interest.
+ *
+ * When multiple regions are defined in a single side-data block, they
+ * should be ordered from most to least important - some encoders are only
+ * capable of supporting a limited number of distinct regions, so will have
+ * to truncate the list.
+ *
+ * When overlapping regions are defined, the first region containing a given
+ * area of the frame applies.
+ */
+typedef struct AVRegionOfInterest {
+    /**
+     * Must be set to the size of this data structure (that is,
+     * sizeof(AVRegionOfInterest)).
+     */
+    uint32_t self_size;
+    /**
+     * Distance in pixels from the top edge of the frame to the top and
+     * bottom edges and from the left edge of the frame to the left and
+     * right edges of the rectangle defining this region of interest.
+     *
+     * The constraints on a region are encoder dependent, so the region
+     * actually affected may be slightly larger for alignment or other
+     * reasons.
+     */
+    int top;
+    int bottom;
+    int left;
+    int right;
+    /**
+     * Quantisation offset.
+     *
+     * Must be in the range -1 to +1.  A value of zero indicates no quality
+     * change.  A negative value asks for better quality (less quantisation),
+     * while a positive value asks for worse quality (greater quantisation).
+     *
+     * The range is calibrated so that the extreme values indicate the
+     * largest possible offset - if the rest of the frame is encoded with the
+     * worst possible quality, an offset of -1 indicates that this region
+     * should be encoded with the best possible quality anyway.  Intermediate
+     * values are then interpolated in some codec-dependent way.
+     *
+     * For example, in 10-bit H.264 the quantisation parameter varies between
+     * -12 and 51.  A typical qoffset value of -1/10 therefore indicates that
+     * this region should be encoded with a QP around one-tenth of the full
+     * range better than the rest of the frame.  So, if most of the frame
+     * were to be encoded with a QP of around 30, this region would get a QP
+     * of around 24 (an offset of approximately -1/10 * (51 - -12) = -6.3).
+     * An extreme value of -1 would indicate that this region should be
+     * encoded with the best possible quality regardless of the treatment of
+     * the rest of the frame - that is, should be encoded at a QP of -12.
+     */
+    AVRational qoffset;
+} AVRegionOfInterest;
+
+/**
  * This structure describes decoded (raw) audio or video data.
  *
  * AVFrame must be allocated using av_frame_alloc(). Note that this only
@@ -381,7 +458,6 @@
      * that time,
      * the decoder reorders values as needed and sets AVFrame.reordered_opaque
      * to exactly one of the values provided by the user through AVCodecContext.reordered_opaque
-     * @deprecated in favor of pkt_pts
      */
     int64_t reordered_opaque;
 
@@ -514,6 +590,8 @@
     int decode_error_flags;
 #define FF_DECODE_ERROR_INVALID_BITSTREAM   1
 #define FF_DECODE_ERROR_MISSING_REFERENCE   2
+#define FF_DECODE_ERROR_CONCEALMENT_ACTIVE  4
+#define FF_DECODE_ERROR_DECODE_SLICES       8
 
     /**
      * number of audio channels, only used for audio.
@@ -842,8 +920,7 @@
                                         enum AVFrameSideDataType type);
 
 /**
- * If side data of the supplied type exists in the frame, free it and remove it
- * from the frame.
+ * Remove and free all side data instances of the given type.
  */
 void av_frame_remove_side_data(AVFrame *frame, enum AVFrameSideDataType type);
 
diff --git a/libavutil/hdr_dynamic_metadata.c b/libavutil/hdr_dynamic_metadata.c
new file mode 100644
index 0000000..0fa1ee8
--- /dev/null
+++ b/libavutil/hdr_dynamic_metadata.c
@@ -0,0 +1,47 @@
+/**
+ * Copyright (c) 2018 Mohammad Izadi <moh.izadi at gmail.com>
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "hdr_dynamic_metadata.h"
+#include "mem.h"
+
+AVDynamicHDRPlus *av_dynamic_hdr_plus_alloc(size_t *size)
+{
+    AVDynamicHDRPlus *hdr_plus = av_mallocz(sizeof(AVDynamicHDRPlus));
+    if (!hdr_plus)
+        return NULL;
+
+    if (size)
+        *size = sizeof(*hdr_plus);
+
+    return hdr_plus;
+}
+
+AVDynamicHDRPlus *av_dynamic_hdr_plus_create_side_data(AVFrame *frame)
+{
+    AVFrameSideData *side_data = av_frame_new_side_data(frame,
+                                                        AV_FRAME_DATA_DYNAMIC_HDR_PLUS,
+                                                        sizeof(AVDynamicHDRPlus));
+    if (!side_data)
+        return NULL;
+
+    memset(side_data->data, 0, sizeof(AVDynamicHDRPlus));
+
+    return (AVDynamicHDRPlus *)side_data->data;
+}
diff --git a/libavutil/hdr_dynamic_metadata.h b/libavutil/hdr_dynamic_metadata.h
new file mode 100644
index 0000000..2d72de5
--- /dev/null
+++ b/libavutil/hdr_dynamic_metadata.h
@@ -0,0 +1,343 @@
+/*
+ * Copyright (c) 2018 Mohammad Izadi <moh.izadi at gmail.com>
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_HDR_DYNAMIC_METADATA_H
+#define AVUTIL_HDR_DYNAMIC_METADATA_H
+
+#include "frame.h"
+#include "rational.h"
+
+/**
+ * Option for overlapping elliptical pixel selectors in an image.
+ */
+enum AVHDRPlusOverlapProcessOption {
+    AV_HDR_PLUS_OVERLAP_PROCESS_WEIGHTED_AVERAGING = 0,
+    AV_HDR_PLUS_OVERLAP_PROCESS_LAYERING = 1,
+};
+
+/**
+ * Represents the percentile at a specific percentage in
+ * a distribution.
+ */
+typedef struct AVHDRPlusPercentile {
+    /**
+     * The percentage value corresponding to a specific percentile linearized
+     * RGB value in the processing window in the scene. The value shall be in
+     * the range of 0 to100, inclusive.
+     */
+    uint8_t percentage;
+
+    /**
+     * The linearized maxRGB value at a specific percentile in the processing
+     * window in the scene. The value shall be in the range of 0 to 1, inclusive
+     * and in multiples of 0.00001.
+     */
+    AVRational percentile;
+} AVHDRPlusPercentile;
+
+/**
+ * Color transform parameters at a processing window in a dynamic metadata for
+ * SMPTE 2094-40.
+ */
+typedef struct AVHDRPlusColorTransformParams {
+    /**
+     * The relative x coordinate of the top left pixel of the processing
+     * window. The value shall be in the range of 0 and 1, inclusive and
+     * in multiples of 1/(width of Picture - 1). The value 1 corresponds
+     * to the absolute coordinate of width of Picture - 1. The value for
+     * first processing window shall be 0.
+     */
+    AVRational window_upper_left_corner_x;
+
+    /**
+     * The relative y coordinate of the top left pixel of the processing
+     * window. The value shall be in the range of 0 and 1, inclusive and
+     * in multiples of 1/(height of Picture - 1). The value 1 corresponds
+     * to the absolute coordinate of height of Picture - 1. The value for
+     * first processing window shall be 0.
+     */
+    AVRational window_upper_left_corner_y;
+
+    /**
+     * The relative x coordinate of the bottom right pixel of the processing
+     * window. The value shall be in the range of 0 and 1, inclusive and
+     * in multiples of 1/(width of Picture - 1). The value 1 corresponds
+     * to the absolute coordinate of width of Picture - 1. The value for
+     * first processing window shall be 1.
+     */
+    AVRational window_lower_right_corner_x;
+
+    /**
+     * The relative y coordinate of the bottom right pixel of the processing
+     * window. The value shall be in the range of 0 and 1, inclusive and
+     * in multiples of 1/(height of Picture - 1). The value 1 corresponds
+     * to the absolute coordinate of height of Picture - 1. The value for
+     * first processing window shall be 1.
+     */
+    AVRational window_lower_right_corner_y;
+
+    /**
+     * The x coordinate of the center position of the concentric internal and
+     * external ellipses of the elliptical pixel selector in the processing
+     * window. The value shall be in the range of 0 to (width of Picture - 1),
+     * inclusive and in multiples of 1 pixel.
+     */
+    uint16_t center_of_ellipse_x;
+
+    /**
+     * The y coordinate of the center position of the concentric internal and
+     * external ellipses of the elliptical pixel selector in the processing
+     * window. The value shall be in the range of 0 to (height of Picture - 1),
+     * inclusive and in multiples of 1 pixel.
+     */
+    uint16_t center_of_ellipse_y;
+
+    /**
+     * The clockwise rotation angle in degree of arc with respect to the
+     * positive direction of the x-axis of the concentric internal and external
+     * ellipses of the elliptical pixel selector in the processing window. The
+     * value shall be in the range of 0 to 180, inclusive and in multiples of 1.
+     */
+    uint8_t rotation_angle;
+
+    /**
+     * The semi-major axis value of the internal ellipse of the elliptical pixel
+     * selector in amount of pixels in the processing window. The value shall be
+     * in the range of 1 to 65535, inclusive and in multiples of 1 pixel.
+     */
+    uint16_t semimajor_axis_internal_ellipse;
+
+    /**
+     * The semi-major axis value of the external ellipse of the elliptical pixel
+     * selector in amount of pixels in the processing window. The value
+     * shall not be less than semimajor_axis_internal_ellipse of the current
+     * processing window. The value shall be in the range of 1 to 65535,
+     * inclusive and in multiples of 1 pixel.
+     */
+    uint16_t semimajor_axis_external_ellipse;
+
+    /**
+     * The semi-minor axis value of the external ellipse of the elliptical pixel
+     * selector in amount of pixels in the processing window. The value shall be
+     * in the range of 1 to 65535, inclusive and in multiples of 1 pixel.
+     */
+    uint16_t semiminor_axis_external_ellipse;
+
+    /**
+     * Overlap process option indicates one of the two methods of combining
+     * rendered pixels in the processing window in an image with at least one
+     * elliptical pixel selector. For overlapping elliptical pixel selectors
+     * in an image, overlap_process_option shall have the same value.
+     */
+    enum AVHDRPlusOverlapProcessOption overlap_process_option;
+
+    /**
+     * The maximum of the color components of linearized RGB values in the
+     * processing window in the scene. The values should be in the range of 0 to
+     * 1, inclusive and in multiples of 0.00001. maxscl[ 0 ], maxscl[ 1 ], and
+     * maxscl[ 2 ] are corresponding to R, G, B color components respectively.
+     */
+    AVRational maxscl[3];
+
+    /**
+     * The average of linearized maxRGB values in the processing window in the
+     * scene. The value should be in the range of 0 to 1, inclusive and in
+     * multiples of 0.00001.
+     */
+    AVRational average_maxrgb;
+
+    /**
+     * The number of linearized maxRGB values at given percentiles in the
+     * processing window in the scene. The maximum value shall be 15.
+     */
+    uint8_t num_distribution_maxrgb_percentiles;
+
+    /**
+     * The linearized maxRGB values at given percentiles in the
+     * processing window in the scene.
+     */
+    AVHDRPlusPercentile distribution_maxrgb[15];
+
+    /**
+     * The fraction of selected pixels in the image that contains the brightest
+     * pixel in the scene. The value shall be in the range of 0 to 1, inclusive
+     * and in multiples of 0.001.
+     */
+    AVRational fraction_bright_pixels;
+
+    /**
+     * This flag indicates that the metadata for the tone mapping function in
+     * the processing window is present (for value of 1).
+     */
+    uint8_t tone_mapping_flag;
+
+    /**
+     * The x coordinate of the separation point between the linear part and the
+     * curved part of the tone mapping function. The value shall be in the range
+     * of 0 to 1, excluding 0 and in multiples of 1/4095.
+     */
+    AVRational knee_point_x;
+
+    /**
+     * The y coordinate of the separation point between the linear part and the
+     * curved part of the tone mapping function. The value shall be in the range
+     * of 0 to 1, excluding 0 and in multiples of 1/4095.
+     */
+    AVRational knee_point_y;
+
+    /**
+     * The number of the intermediate anchor parameters of the tone mapping
+     * function in the processing window. The maximum value shall be 15.
+     */
+    uint8_t num_bezier_curve_anchors;
+
+    /**
+     * The intermediate anchor parameters of the tone mapping function in the
+     * processing window in the scene. The values should be in the range of 0
+     * to 1, inclusive and in multiples of 1/1023.
+     */
+    AVRational bezier_curve_anchors[15];
+
+    /**
+     * This flag shall be equal to 0 in bitstreams conforming to this version of
+     * this Specification. Other values are reserved for future use.
+     */
+    uint8_t color_saturation_mapping_flag;
+
+    /**
+     * The color saturation gain in the processing window in the scene. The
+     * value shall be in the range of 0 to 63/8, inclusive and in multiples of
+     * 1/8. The default value shall be 1.
+     */
+    AVRational color_saturation_weight;
+} AVHDRPlusColorTransformParams;
+
+/**
+ * This struct represents dynamic metadata for color volume transform -
+ * application 4 of SMPTE 2094-40:2016 standard.
+ *
+ * To be used as payload of a AVFrameSideData or AVPacketSideData with the
+ * appropriate type.
+ *
+ * @note The struct should be allocated with
+ * av_dynamic_hdr_plus_alloc() and its size is not a part of
+ * the public ABI.
+ */
+typedef struct AVDynamicHDRPlus {
+    /**
+     * Country code by Rec. ITU-T T.35 Annex A. The value shall be 0xB5.
+     */
+    uint8_t itu_t_t35_country_code;
+
+    /**
+     * Application version in the application defining document in ST-2094
+     * suite. The value shall be set to 0.
+     */
+    uint8_t application_version;
+
+    /**
+     * The number of processing windows. The value shall be in the range
+     * of 1 to 3, inclusive.
+     */
+    uint8_t num_windows;
+
+    /**
+     * The color transform parameters for every processing window.
+     */
+    AVHDRPlusColorTransformParams params[3];
+
+    /**
+     * The nominal maximum display luminance of the targeted system display,
+     * in units of 0.0001 candelas per square metre. The value shall be in
+     * the range of 0 to 10000, inclusive.
+     */
+    AVRational targeted_system_display_maximum_luminance;
+
+    /**
+     * This flag shall be equal to 0 in bit streams conforming to this version
+     * of this Specification. The value 1 is reserved for future use.
+     */
+    uint8_t targeted_system_display_actual_peak_luminance_flag;
+
+    /**
+     * The number of rows in the targeted system_display_actual_peak_luminance
+     * array. The value shall be in the range of 2 to 25, inclusive.
+     */
+    uint8_t num_rows_targeted_system_display_actual_peak_luminance;
+
+    /**
+     * The number of columns in the
+     * targeted_system_display_actual_peak_luminance array. The value shall be
+     * in the range of 2 to 25, inclusive.
+     */
+    uint8_t num_cols_targeted_system_display_actual_peak_luminance;
+
+    /**
+     * The normalized actual peak luminance of the targeted system display. The
+     * values should be in the range of 0 to 1, inclusive and in multiples of
+     * 1/15.
+     */
+    AVRational targeted_system_display_actual_peak_luminance[25][25];
+
+    /**
+     * This flag shall be equal to 0 in bitstreams conforming to this version of
+     * this Specification. The value 1 is reserved for future use.
+     */
+    uint8_t mastering_display_actual_peak_luminance_flag;
+
+    /**
+     * The number of rows in the mastering_display_actual_peak_luminance array.
+     * The value shall be in the range of 2 to 25, inclusive.
+     */
+    uint8_t num_rows_mastering_display_actual_peak_luminance;
+
+    /**
+     * The number of columns in the mastering_display_actual_peak_luminance
+     * array. The value shall be in the range of 2 to 25, inclusive.
+     */
+    uint8_t num_cols_mastering_display_actual_peak_luminance;
+
+    /**
+     * The normalized actual peak luminance of the mastering display used for
+     * mastering the image essence. The values should be in the range of 0 to 1,
+     * inclusive and in multiples of 1/15.
+     */
+    AVRational mastering_display_actual_peak_luminance[25][25];
+} AVDynamicHDRPlus;
+
+/**
+ * Allocate an AVDynamicHDRPlus structure and set its fields to
+ * default values. The resulting struct can be freed using av_freep().
+ *
+ * @return An AVDynamicHDRPlus filled with default values or NULL
+ *         on failure.
+ */
+AVDynamicHDRPlus *av_dynamic_hdr_plus_alloc(size_t *size);
+
+/**
+ * Allocate a complete AVDynamicHDRPlus and add it to the frame.
+ * @param frame The frame which side data is added to.
+ *
+ * @return The AVDynamicHDRPlus structure to be filled by caller or NULL
+ *         on failure.
+ */
+AVDynamicHDRPlus *av_dynamic_hdr_plus_create_side_data(AVFrame *frame);
+
+#endif /* AVUTIL_HDR_DYNAMIC_METADATA_H */
diff --git a/libavutil/hwcontext.c b/libavutil/hwcontext.c
index f1e404a..b01612d 100644
--- a/libavutil/hwcontext.c
+++ b/libavutil/hwcontext.c
@@ -59,6 +59,9 @@
 #if CONFIG_MEDIACODEC
     &ff_hwcontext_type_mediacodec,
 #endif
+#if CONFIG_VULKAN
+    &ff_hwcontext_type_vulkan,
+#endif
     NULL,
 };
 
@@ -73,6 +76,7 @@
     [AV_HWDEVICE_TYPE_VDPAU]  = "vdpau",
     [AV_HWDEVICE_TYPE_VIDEOTOOLBOX] = "videotoolbox",
     [AV_HWDEVICE_TYPE_MEDIACODEC] = "mediacodec",
+    [AV_HWDEVICE_TYPE_VULKAN] = "vulkan",
 };
 
 enum AVHWDeviceType av_hwdevice_find_type_by_name(const char *name)
@@ -444,21 +448,54 @@
     if (!dst->buf[0])
         return transfer_data_alloc(dst, src, flags);
 
-    if (src->hw_frames_ctx) {
-        ctx = (AVHWFramesContext*)src->hw_frames_ctx->data;
+    /*
+     * Hardware -> Hardware Transfer.
+     * Unlike Software -> Hardware or Hardware -> Software, the transfer
+     * function could be provided by either the src or dst, depending on
+     * the specific combination of hardware.
+     */
+    if (src->hw_frames_ctx && dst->hw_frames_ctx) {
+        AVHWFramesContext *src_ctx =
+            (AVHWFramesContext*)src->hw_frames_ctx->data;
+        AVHWFramesContext *dst_ctx =
+            (AVHWFramesContext*)dst->hw_frames_ctx->data;
 
-        ret = ctx->internal->hw_type->transfer_data_from(ctx, dst, src);
+        if (src_ctx->internal->source_frames) {
+            av_log(src_ctx, AV_LOG_ERROR,
+                   "A device with a derived frame context cannot be used as "
+                   "the source of a HW -> HW transfer.");
+            return AVERROR(ENOSYS);
+        }
+
+        if (dst_ctx->internal->source_frames) {
+            av_log(src_ctx, AV_LOG_ERROR,
+                   "A device with a derived frame context cannot be used as "
+                   "the destination of a HW -> HW transfer.");
+            return AVERROR(ENOSYS);
+        }
+
+        ret = src_ctx->internal->hw_type->transfer_data_from(src_ctx, dst, src);
+        if (ret == AVERROR(ENOSYS))
+            ret = dst_ctx->internal->hw_type->transfer_data_to(dst_ctx, dst, src);
         if (ret < 0)
             return ret;
-    } else if (dst->hw_frames_ctx) {
-        ctx = (AVHWFramesContext*)dst->hw_frames_ctx->data;
+    } else {
+        if (src->hw_frames_ctx) {
+            ctx = (AVHWFramesContext*)src->hw_frames_ctx->data;
 
-        ret = ctx->internal->hw_type->transfer_data_to(ctx, dst, src);
-        if (ret < 0)
-            return ret;
-    } else
-        return AVERROR(ENOSYS);
+            ret = ctx->internal->hw_type->transfer_data_from(ctx, dst, src);
+            if (ret < 0)
+                return ret;
+        } else if (dst->hw_frames_ctx) {
+            ctx = (AVHWFramesContext*)dst->hw_frames_ctx->data;
 
+            ret = ctx->internal->hw_type->transfer_data_to(ctx, dst, src);
+            if (ret < 0)
+                return ret;
+        } else {
+            return AVERROR(ENOSYS);
+        }
+    }
     return 0;
 }
 
@@ -520,6 +557,8 @@
         return ret;
     }
 
+    frame->extended_data = frame->data;
+
     return 0;
 }
 
diff --git a/libavutil/hwcontext.h b/libavutil/hwcontext.h
index f5a4b62..f874af9 100644
--- a/libavutil/hwcontext.h
+++ b/libavutil/hwcontext.h
@@ -36,6 +36,7 @@
     AV_HWDEVICE_TYPE_DRM,
     AV_HWDEVICE_TYPE_OPENCL,
     AV_HWDEVICE_TYPE_MEDIACODEC,
+    AV_HWDEVICE_TYPE_VULKAN,
 };
 
 typedef struct AVHWDeviceInternal AVHWDeviceInternal;
diff --git a/libavutil/hwcontext_cuda.c b/libavutil/hwcontext_cuda.c
index 3b1d53e..58d128a 100644
--- a/libavutil/hwcontext_cuda.c
+++ b/libavutil/hwcontext_cuda.c
@@ -21,6 +21,10 @@
 #include "hwcontext.h"
 #include "hwcontext_internal.h"
 #include "hwcontext_cuda_internal.h"
+#if CONFIG_VULKAN
+#include "hwcontext_vulkan.h"
+#endif
+#include "cuda_check.h"
 #include "mem.h"
 #include "pixdesc.h"
 #include "pixfmt.h"
@@ -35,14 +39,20 @@
 static const enum AVPixelFormat supported_formats[] = {
     AV_PIX_FMT_NV12,
     AV_PIX_FMT_YUV420P,
+    AV_PIX_FMT_YUVA420P,
     AV_PIX_FMT_YUV444P,
     AV_PIX_FMT_P010,
     AV_PIX_FMT_P016,
     AV_PIX_FMT_YUV444P16,
     AV_PIX_FMT_0RGB32,
     AV_PIX_FMT_0BGR32,
+#if CONFIG_VULKAN
+    AV_PIX_FMT_VULKAN,
+#endif
 };
 
+#define CHECK_CU(x) FF_CUDA_CHECK_DL(device_ctx, cu, x)
+
 static int cuda_frames_get_constraints(AVHWDeviceContext *ctx,
                                        const void *hwconfig,
                                        AVHWFramesConstraints *constraints)
@@ -70,48 +80,48 @@
 
 static void cuda_buffer_free(void *opaque, uint8_t *data)
 {
-    AVHWFramesContext *ctx = opaque;
-    AVCUDADeviceContext *hwctx = ctx->device_ctx->hwctx;
-    CudaFunctions *cu = hwctx->internal->cuda_dl;
+    AVHWFramesContext        *ctx = opaque;
+    AVHWDeviceContext *device_ctx = ctx->device_ctx;
+    AVCUDADeviceContext    *hwctx = device_ctx->hwctx;
+    CudaFunctions             *cu = hwctx->internal->cuda_dl;
 
     CUcontext dummy;
 
-    cu->cuCtxPushCurrent(hwctx->cuda_ctx);
+    CHECK_CU(cu->cuCtxPushCurrent(hwctx->cuda_ctx));
 
-    cu->cuMemFree((CUdeviceptr)data);
+    CHECK_CU(cu->cuMemFree((CUdeviceptr)data));
 
-    cu->cuCtxPopCurrent(&dummy);
+    CHECK_CU(cu->cuCtxPopCurrent(&dummy));
 }
 
 static AVBufferRef *cuda_pool_alloc(void *opaque, int size)
 {
-    AVHWFramesContext     *ctx = opaque;
-    AVCUDADeviceContext *hwctx = ctx->device_ctx->hwctx;
-    CudaFunctions          *cu = hwctx->internal->cuda_dl;
+    AVHWFramesContext        *ctx = opaque;
+    AVHWDeviceContext *device_ctx = ctx->device_ctx;
+    AVCUDADeviceContext    *hwctx = device_ctx->hwctx;
+    CudaFunctions             *cu = hwctx->internal->cuda_dl;
 
     AVBufferRef *ret = NULL;
     CUcontext dummy = NULL;
     CUdeviceptr data;
-    CUresult err;
+    int err;
 
-    err = cu->cuCtxPushCurrent(hwctx->cuda_ctx);
-    if (err != CUDA_SUCCESS) {
-        av_log(ctx, AV_LOG_ERROR, "Error setting current CUDA context\n");
+    err = CHECK_CU(cu->cuCtxPushCurrent(hwctx->cuda_ctx));
+    if (err < 0)
         return NULL;
-    }
 
-    err = cu->cuMemAlloc(&data, size);
-    if (err != CUDA_SUCCESS)
+    err = CHECK_CU(cu->cuMemAlloc(&data, size));
+    if (err < 0)
         goto fail;
 
     ret = av_buffer_create((uint8_t*)data, size, cuda_buffer_free, ctx, 0);
     if (!ret) {
-        cu->cuMemFree(data);
+        CHECK_CU(cu->cuMemFree(data));
         goto fail;
     }
 
 fail:
-    cu->cuCtxPopCurrent(&dummy);
+    CHECK_CU(cu->cuCtxPopCurrent(&dummy));
     return ret;
 }
 
@@ -191,105 +201,82 @@
     return 0;
 }
 
-static int cuda_transfer_data_from(AVHWFramesContext *ctx, AVFrame *dst,
-                                   const AVFrame *src)
-{
-    CUDAFramesContext           *priv = ctx->internal->priv;
-    AVCUDADeviceContext *device_hwctx = ctx->device_ctx->hwctx;
-    CudaFunctions                 *cu = device_hwctx->internal->cuda_dl;
-
-    CUcontext dummy;
-    CUresult err;
-    int i;
-
-    err = cu->cuCtxPushCurrent(device_hwctx->cuda_ctx);
-    if (err != CUDA_SUCCESS)
-        return AVERROR_UNKNOWN;
-
-    for (i = 0; i < FF_ARRAY_ELEMS(src->data) && src->data[i]; i++) {
-        CUDA_MEMCPY2D cpy = {
-            .srcMemoryType = CU_MEMORYTYPE_DEVICE,
-            .dstMemoryType = CU_MEMORYTYPE_HOST,
-            .srcDevice     = (CUdeviceptr)src->data[i],
-            .dstHost       = dst->data[i],
-            .srcPitch      = src->linesize[i],
-            .dstPitch      = dst->linesize[i],
-            .WidthInBytes  = FFMIN(src->linesize[i], dst->linesize[i]),
-            .Height        = src->height >> (i ? priv->shift_height : 0),
-        };
-
-        err = cu->cuMemcpy2DAsync(&cpy, device_hwctx->stream);
-        if (err != CUDA_SUCCESS) {
-            av_log(ctx, AV_LOG_ERROR, "Error transferring the data from the CUDA frame\n");
-            return AVERROR_UNKNOWN;
-        }
-    }
-
-    err = cu->cuStreamSynchronize(device_hwctx->stream);
-    if (err != CUDA_SUCCESS) {
-        av_log(ctx, AV_LOG_ERROR, "Error synchronizing CUDA stream\n");
-        return AVERROR_UNKNOWN;
-    }
-
-    cu->cuCtxPopCurrent(&dummy);
-
-    return 0;
-}
-
-static int cuda_transfer_data_to(AVHWFramesContext *ctx, AVFrame *dst,
+static int cuda_transfer_data(AVHWFramesContext *ctx, AVFrame *dst,
                                  const AVFrame *src)
 {
-    CUDAFramesContext           *priv = ctx->internal->priv;
-    AVCUDADeviceContext *device_hwctx = ctx->device_ctx->hwctx;
-    CudaFunctions                 *cu = device_hwctx->internal->cuda_dl;
+    CUDAFramesContext       *priv = ctx->internal->priv;
+    AVHWDeviceContext *device_ctx = ctx->device_ctx;
+    AVCUDADeviceContext    *hwctx = device_ctx->hwctx;
+    CudaFunctions             *cu = hwctx->internal->cuda_dl;
 
     CUcontext dummy;
-    CUresult err;
-    int i;
+    int i, ret;
 
-    err = cu->cuCtxPushCurrent(device_hwctx->cuda_ctx);
-    if (err != CUDA_SUCCESS)
-        return AVERROR_UNKNOWN;
+    if ((src->hw_frames_ctx && ((AVHWFramesContext*)src->hw_frames_ctx->data)->format != AV_PIX_FMT_CUDA) ||
+        (dst->hw_frames_ctx && ((AVHWFramesContext*)dst->hw_frames_ctx->data)->format != AV_PIX_FMT_CUDA))
+        return AVERROR(ENOSYS);
+
+    ret = CHECK_CU(cu->cuCtxPushCurrent(hwctx->cuda_ctx));
+    if (ret < 0)
+        return ret;
 
     for (i = 0; i < FF_ARRAY_ELEMS(src->data) && src->data[i]; i++) {
         CUDA_MEMCPY2D cpy = {
-            .srcMemoryType = CU_MEMORYTYPE_HOST,
-            .dstMemoryType = CU_MEMORYTYPE_DEVICE,
-            .srcHost       = src->data[i],
-            .dstDevice     = (CUdeviceptr)dst->data[i],
             .srcPitch      = src->linesize[i],
             .dstPitch      = dst->linesize[i],
             .WidthInBytes  = FFMIN(src->linesize[i], dst->linesize[i]),
-            .Height        = src->height >> (i ? priv->shift_height : 0),
+            .Height        = src->height >> ((i == 0 || i == 3) ? 0 : priv->shift_height),
         };
 
-        err = cu->cuMemcpy2DAsync(&cpy, device_hwctx->stream);
-        if (err != CUDA_SUCCESS) {
-            av_log(ctx, AV_LOG_ERROR, "Error transferring the data to the CUDA frame\n");
-            return AVERROR_UNKNOWN;
+        if (src->hw_frames_ctx) {
+            cpy.srcMemoryType = CU_MEMORYTYPE_DEVICE;
+            cpy.srcDevice     = (CUdeviceptr)src->data[i];
+        } else {
+            cpy.srcMemoryType = CU_MEMORYTYPE_HOST;
+            cpy.srcHost       = src->data[i];
         }
+
+        if (dst->hw_frames_ctx) {
+            cpy.dstMemoryType = CU_MEMORYTYPE_DEVICE;
+            cpy.dstDevice     = (CUdeviceptr)dst->data[i];
+        } else {
+            cpy.dstMemoryType = CU_MEMORYTYPE_HOST;
+            cpy.dstHost       = dst->data[i];
+        }
+
+        ret = CHECK_CU(cu->cuMemcpy2DAsync(&cpy, hwctx->stream));
+        if (ret < 0)
+            goto exit;
     }
 
-    err = cu->cuStreamSynchronize(device_hwctx->stream);
-    if (err != CUDA_SUCCESS) {
-        av_log(ctx, AV_LOG_ERROR, "Error synchronizing CUDA stream\n");
-        return AVERROR_UNKNOWN;
+    if (!dst->hw_frames_ctx) {
+        ret = CHECK_CU(cu->cuStreamSynchronize(hwctx->stream));
+        if (ret < 0)
+            goto exit;
     }
 
-    cu->cuCtxPopCurrent(&dummy);
+exit:
+    CHECK_CU(cu->cuCtxPopCurrent(&dummy));
 
     return 0;
 }
 
-static void cuda_device_uninit(AVHWDeviceContext *ctx)
+static void cuda_device_uninit(AVHWDeviceContext *device_ctx)
 {
-    AVCUDADeviceContext *hwctx = ctx->hwctx;
+    AVCUDADeviceContext *hwctx = device_ctx->hwctx;
 
     if (hwctx->internal) {
+        CudaFunctions *cu = hwctx->internal->cuda_dl;
+
         if (hwctx->internal->is_allocated && hwctx->cuda_ctx) {
-            hwctx->internal->cuda_dl->cuCtxDestroy(hwctx->cuda_ctx);
+            if (hwctx->internal->flags & AV_CUDA_USE_PRIMARY_CONTEXT)
+                CHECK_CU(cu->cuDevicePrimaryCtxRelease(hwctx->internal->cuda_device));
+            else
+                CHECK_CU(cu->cuCtxDestroy(hwctx->cuda_ctx));
+
             hwctx->cuda_ctx = NULL;
         }
+
         cuda_free_functions(&hwctx->internal->cuda_dl);
     }
 
@@ -322,53 +309,173 @@
     return ret;
 }
 
-static int cuda_device_create(AVHWDeviceContext *ctx, const char *device,
-                              AVDictionary *opts, int flags)
-{
-    AVCUDADeviceContext *hwctx = ctx->hwctx;
+static int cuda_context_init(AVHWDeviceContext *device_ctx, int flags) {
+    AVCUDADeviceContext *hwctx = device_ctx->hwctx;
     CudaFunctions *cu;
-    CUdevice cu_device;
     CUcontext dummy;
-    CUresult err;
-    int device_idx = 0;
+    int ret, dev_active = 0;
+    unsigned int dev_flags = 0;
 
-    if (device)
-        device_idx = strtol(device, NULL, 0);
-
-    if (cuda_device_init(ctx) < 0)
-        goto error;
+    const unsigned int desired_flags = CU_CTX_SCHED_BLOCKING_SYNC;
 
     cu = hwctx->internal->cuda_dl;
 
-    err = cu->cuInit(0);
-    if (err != CUDA_SUCCESS) {
-        av_log(ctx, AV_LOG_ERROR, "Could not initialize the CUDA driver API\n");
-        goto error;
+    hwctx->internal->flags = flags;
+
+    if (flags & AV_CUDA_USE_PRIMARY_CONTEXT) {
+        ret = CHECK_CU(cu->cuDevicePrimaryCtxGetState(hwctx->internal->cuda_device,
+                       &dev_flags, &dev_active));
+        if (ret < 0)
+            return ret;
+
+        if (dev_active && dev_flags != desired_flags) {
+            av_log(device_ctx, AV_LOG_ERROR, "Primary context already active with incompatible flags.\n");
+            return AVERROR(ENOTSUP);
+        } else if (dev_flags != desired_flags) {
+            ret = CHECK_CU(cu->cuDevicePrimaryCtxSetFlags(hwctx->internal->cuda_device,
+                           desired_flags));
+            if (ret < 0)
+                return ret;
+        }
+
+        ret = CHECK_CU(cu->cuDevicePrimaryCtxRetain(&hwctx->cuda_ctx,
+                                                    hwctx->internal->cuda_device));
+        if (ret < 0)
+            return ret;
+    } else {
+        ret = CHECK_CU(cu->cuCtxCreate(&hwctx->cuda_ctx, desired_flags,
+                                       hwctx->internal->cuda_device));
+        if (ret < 0)
+            return ret;
+
+        CHECK_CU(cu->cuCtxPopCurrent(&dummy));
     }
 
-    err = cu->cuDeviceGet(&cu_device, device_idx);
-    if (err != CUDA_SUCCESS) {
-        av_log(ctx, AV_LOG_ERROR, "Could not get the device number %d\n", device_idx);
-        goto error;
-    }
-
-    err = cu->cuCtxCreate(&hwctx->cuda_ctx, CU_CTX_SCHED_BLOCKING_SYNC, cu_device);
-    if (err != CUDA_SUCCESS) {
-        av_log(ctx, AV_LOG_ERROR, "Error creating a CUDA context\n");
-        goto error;
-    }
+    hwctx->internal->is_allocated = 1;
 
     // Setting stream to NULL will make functions automatically use the default CUstream
     hwctx->stream = NULL;
 
-    cu->cuCtxPopCurrent(&dummy);
+    return 0;
+}
 
-    hwctx->internal->is_allocated = 1;
+static int cuda_device_create(AVHWDeviceContext *device_ctx,
+                              const char *device,
+                              AVDictionary *opts, int flags)
+{
+    AVCUDADeviceContext *hwctx = device_ctx->hwctx;
+    CudaFunctions *cu;
+    int ret, device_idx = 0;
+
+    if (device)
+        device_idx = strtol(device, NULL, 0);
+
+    if (cuda_device_init(device_ctx) < 0)
+        goto error;
+
+    cu = hwctx->internal->cuda_dl;
+
+    ret = CHECK_CU(cu->cuInit(0));
+    if (ret < 0)
+        goto error;
+
+    ret = CHECK_CU(cu->cuDeviceGet(&hwctx->internal->cuda_device, device_idx));
+    if (ret < 0)
+        goto error;
+
+    ret = cuda_context_init(device_ctx, flags);
+    if (ret < 0)
+        goto error;
 
     return 0;
 
 error:
-    cuda_device_uninit(ctx);
+    cuda_device_uninit(device_ctx);
+    return AVERROR_UNKNOWN;
+}
+
+static int cuda_device_derive(AVHWDeviceContext *device_ctx,
+                              AVHWDeviceContext *src_ctx,
+                              int flags) {
+    AVCUDADeviceContext *hwctx = device_ctx->hwctx;
+    CudaFunctions *cu;
+    const char *src_uuid = NULL;
+    int ret, i, device_count;
+
+#if CONFIG_VULKAN
+    VkPhysicalDeviceIDProperties vk_idp = {
+        .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES,
+    };
+#endif
+
+    switch (src_ctx->type) {
+#if CONFIG_VULKAN
+    case AV_HWDEVICE_TYPE_VULKAN: {
+        AVVulkanDeviceContext *vkctx = src_ctx->hwctx;
+        VkPhysicalDeviceProperties2 vk_dev_props = {
+            .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2,
+            .pNext = &vk_idp,
+        };
+        vkGetPhysicalDeviceProperties2(vkctx->phys_dev, &vk_dev_props);
+        src_uuid = vk_idp.deviceUUID;
+        break;
+    }
+#endif
+    default:
+        return AVERROR(ENOSYS);
+    }
+
+    if (!src_uuid) {
+        av_log(device_ctx, AV_LOG_ERROR,
+               "Failed to get UUID of source device.\n");
+        goto error;
+    }
+
+    if (cuda_device_init(device_ctx) < 0)
+        goto error;
+
+    cu = hwctx->internal->cuda_dl;
+
+    ret = CHECK_CU(cu->cuInit(0));
+    if (ret < 0)
+        goto error;
+
+    ret = CHECK_CU(cu->cuDeviceGetCount(&device_count));
+    if (ret < 0)
+        goto error;
+
+    hwctx->internal->cuda_device = -1;
+    for (i = 0; i < device_count; i++) {
+        CUdevice dev;
+        CUuuid uuid;
+
+        ret = CHECK_CU(cu->cuDeviceGet(&dev, i));
+        if (ret < 0)
+            goto error;
+
+        ret = CHECK_CU(cu->cuDeviceGetUuid(&uuid, dev));
+        if (ret < 0)
+            goto error;
+
+        if (memcmp(src_uuid, uuid.bytes, sizeof (uuid.bytes)) == 0) {
+            hwctx->internal->cuda_device = dev;
+            break;
+        }
+    }
+
+    if (hwctx->internal->cuda_device == -1) {
+        av_log(device_ctx, AV_LOG_ERROR, "Could not derive CUDA device.\n");
+        goto error;
+    }
+
+    ret = cuda_context_init(device_ctx, flags);
+    if (ret < 0)
+        goto error;
+
+    return 0;
+
+error:
+    cuda_device_uninit(device_ctx);
     return AVERROR_UNKNOWN;
 }
 
@@ -380,14 +487,15 @@
     .frames_priv_size     = sizeof(CUDAFramesContext),
 
     .device_create        = cuda_device_create,
+    .device_derive        = cuda_device_derive,
     .device_init          = cuda_device_init,
     .device_uninit        = cuda_device_uninit,
     .frames_get_constraints = cuda_frames_get_constraints,
     .frames_init          = cuda_frames_init,
     .frames_get_buffer    = cuda_get_buffer,
     .transfer_get_formats = cuda_transfer_get_formats,
-    .transfer_data_to     = cuda_transfer_data_to,
-    .transfer_data_from   = cuda_transfer_data_from,
+    .transfer_data_to     = cuda_transfer_data,
+    .transfer_data_from   = cuda_transfer_data,
 
     .pix_fmts             = (const enum AVPixelFormat[]){ AV_PIX_FMT_CUDA, AV_PIX_FMT_NONE },
 };
diff --git a/libavutil/hwcontext_cuda.h b/libavutil/hwcontext_cuda.h
index 81a0552..cefbe0c 100644
--- a/libavutil/hwcontext_cuda.h
+++ b/libavutil/hwcontext_cuda.h
@@ -49,4 +49,21 @@
  * AVHWFramesContext.hwctx is currently not used
  */
 
+/**
+ * @defgroup hwcontext_cuda Device context creation flags
+ *
+ * Flags for av_hwdevice_ctx_create.
+ *
+ * @{
+ */
+
+/**
+ * Use primary device context instead of creating a new one.
+ */
+#define AV_CUDA_USE_PRIMARY_CONTEXT (1 << 0)
+
+/**
+ * @}
+ */
+
 #endif /* AVUTIL_HWCONTEXT_CUDA_H */
diff --git a/libavutil/hwcontext_cuda_internal.h b/libavutil/hwcontext_cuda_internal.h
index e1bc6ff..d5633c5 100644
--- a/libavutil/hwcontext_cuda_internal.h
+++ b/libavutil/hwcontext_cuda_internal.h
@@ -31,6 +31,8 @@
 struct AVCUDADeviceContextInternal {
     CudaFunctions *cuda_dl;
     int is_allocated;
+    CUdevice cuda_device;
+    int flags;
 };
 
 #endif /* AVUTIL_HWCONTEXT_CUDA_INTERNAL_H */
diff --git a/libavutil/hwcontext_d3d11va.c b/libavutil/hwcontext_d3d11va.c
index 41330f0..c8ae58f 100644
--- a/libavutil/hwcontext_d3d11va.c
+++ b/libavutil/hwcontext_d3d11va.c
@@ -39,6 +39,7 @@
 #include "pixdesc.h"
 #include "pixfmt.h"
 #include "thread.h"
+#include "compat/w32dlfcn.h"
 
 typedef HRESULT(WINAPI *PFN_CREATE_DXGI_FACTORY)(REFIID riid, void **ppFactory);
 
@@ -55,8 +56,8 @@
     // from too many LoadLibrary calls.
     HANDLE d3dlib, dxgilib;
 
-    d3dlib  = LoadLibrary("d3d11.dll");
-    dxgilib = LoadLibrary("dxgi.dll");
+    d3dlib  = dlopen("d3d11.dll", 0);
+    dxgilib = dlopen("dxgi.dll", 0);
     if (!d3dlib || !dxgilib)
         return;
 
@@ -410,7 +411,7 @@
 
         fill_texture_ptrs(map_data, map_linesize, ctx, &desc, &map);
 
-        av_image_copy(dst->data, dst->linesize, map_data, map_linesize,
+        av_image_copy(dst->data, dst->linesize, (const uint8_t **)map_data, map_linesize,
                       ctx->sw_format, w, h);
 
         ID3D11DeviceContext_Unmap(device_hwctx->device_context, staging, 0);
@@ -422,7 +423,7 @@
 
         fill_texture_ptrs(map_data, map_linesize, ctx, &desc, &map);
 
-        av_image_copy(map_data, map_linesize, src->data, src->linesize,
+        av_image_copy(map_data, map_linesize, (const uint8_t **)src->data, src->linesize,
                       ctx->sw_format, w, h);
 
         ID3D11DeviceContext_Unmap(device_hwctx->device_context, staging, 0);
diff --git a/libavutil/hwcontext_dxva2.c b/libavutil/hwcontext_dxva2.c
index 4585f32..64366ce 100644
--- a/libavutil/hwcontext_dxva2.c
+++ b/libavutil/hwcontext_dxva2.c
@@ -348,7 +348,7 @@
     if (ret < 0)
         goto fail;
 
-    av_image_copy(map->data, map->linesize, src->data, src->linesize,
+    av_image_copy(map->data, map->linesize, (const uint8_t **)src->data, src->linesize,
                   ctx->sw_format, src->width, src->height);
 
 fail:
@@ -379,7 +379,7 @@
         dst_linesize[i] = dst->linesize[i];
         src_linesize[i] = map->linesize[i];
     }
-    av_image_copy_uc_from(dst->data, dst_linesize, map->data, src_linesize,
+    av_image_copy_uc_from(dst->data, dst_linesize, (const uint8_t **)map->data, src_linesize,
                           ctx->sw_format, src->width, src->height);
 fail:
     av_frame_free(&map);
diff --git a/libavutil/hwcontext_internal.h b/libavutil/hwcontext_internal.h
index 77dc47d..dba0f39 100644
--- a/libavutil/hwcontext_internal.h
+++ b/libavutil/hwcontext_internal.h
@@ -172,5 +172,6 @@
 extern const HWContextType ff_hwcontext_type_vdpau;
 extern const HWContextType ff_hwcontext_type_videotoolbox;
 extern const HWContextType ff_hwcontext_type_mediacodec;
+extern const HWContextType ff_hwcontext_type_vulkan;
 
 #endif /* AVUTIL_HWCONTEXT_INTERNAL_H */
diff --git a/libavutil/hwcontext_opencl.c b/libavutil/hwcontext_opencl.c
index 7288775..41fdfe9 100644
--- a/libavutil/hwcontext_opencl.c
+++ b/libavutil/hwcontext_opencl.c
@@ -50,7 +50,7 @@
 #include <mfx/mfxstructures.h>
 #endif
 #include <va/va.h>
-#include <CL/va_ext.h>
+#include <CL/cl_va_api_media_sharing_intel.h>
 #include "hwcontext_vaapi.h"
 #endif
 
@@ -500,6 +500,9 @@
          *device_name_src   = NULL;
     int err, found, p, d;
 
+    av_assert0(selector->enumerate_platforms &&
+               selector->enumerate_devices);
+
     err = selector->enumerate_platforms(hwdev, &nb_platforms, &platforms,
                                         selector->context);
     if (err)
@@ -531,9 +534,9 @@
                 continue;
         }
 
-        err = opencl_enumerate_devices(hwdev, platforms[p], platform_name,
-                                       &nb_devices, &devices,
-                                       selector->context);
+        err = selector->enumerate_devices(hwdev, platforms[p], platform_name,
+                                          &nb_devices, &devices,
+                                          selector->context);
         if (err < 0)
             continue;
 
@@ -1416,8 +1419,9 @@
         // from the same component.
         if (step && comp->step != step)
             return AVERROR(EINVAL);
-        order = order * 10 + c + 1;
+
         depth = comp->depth;
+        order = order * 10 + comp->offset / ((depth + 7) / 8) + 1;
         step  = comp->step;
         alpha = (desc->flags & AV_PIX_FMT_FLAG_ALPHA &&
                  c == desc->nb_components - 1);
@@ -1453,14 +1457,10 @@
     case order: image_format->image_channel_order = type; break;
     switch (order) {
         CHANNEL_ORDER(1,    CL_R);
-        CHANNEL_ORDER(2,    CL_R);
-        CHANNEL_ORDER(3,    CL_R);
-        CHANNEL_ORDER(4,    CL_R);
         CHANNEL_ORDER(12,   CL_RG);
-        CHANNEL_ORDER(23,   CL_RG);
         CHANNEL_ORDER(1234, CL_RGBA);
+        CHANNEL_ORDER(2341, CL_ARGB);
         CHANNEL_ORDER(3214, CL_BGRA);
-        CHANNEL_ORDER(4123, CL_ARGB);
 #ifdef CL_ABGR
         CHANNEL_ORDER(4321, CL_ABGR);
 #endif
@@ -1726,10 +1726,13 @@
     av_freep(&priv->mapped_frames);
 #endif
 
-    cle = clReleaseCommandQueue(priv->command_queue);
-    if (cle != CL_SUCCESS) {
-        av_log(hwfc, AV_LOG_ERROR, "Failed to release frame "
-               "command queue: %d.\n", cle);
+    if (priv->command_queue) {
+        cle = clReleaseCommandQueue(priv->command_queue);
+        if (cle != CL_SUCCESS) {
+            av_log(hwfc, AV_LOG_ERROR, "Failed to release frame "
+                   "command queue: %d.\n", cle);
+        }
+        priv->command_queue = NULL;
     }
 }
 
diff --git a/libavutil/hwcontext_qsv.c b/libavutil/hwcontext_qsv.c
index 814ce21..b1b6740 100644
--- a/libavutil/hwcontext_qsv.c
+++ b/libavutil/hwcontext_qsv.c
@@ -389,7 +389,7 @@
         !(req->Type & (MFX_MEMTYPE_FROM_VPPIN | MFX_MEMTYPE_FROM_VPPOUT)) ||
         !(req->Type & MFX_MEMTYPE_EXTERNAL_FRAME))
         return MFX_ERR_UNSUPPORTED;
-    if (i->Width  != i1->Width || i->Height != i1->Height ||
+    if (i->Width  > i1->Width || i->Height > i1->Height ||
         i->FourCC != i1->FourCC || i->ChromaFormat != i1->ChromaFormat) {
         av_log(ctx, AV_LOG_ERROR, "Mismatching surface properties in an "
                "allocation request: %dx%d %d %d vs %dx%d %d %d\n",
@@ -863,7 +863,8 @@
     mfxStatus err;
     int ret = 0;
     /* make a copy if the input is not padded as libmfx requires */
-    AVFrame tmp_frame, *src_frame;
+    AVFrame tmp_frame;
+    const AVFrame *src_frame;
     int realigned = 0;
 
 
@@ -891,8 +892,7 @@
     if (ret < 0)
         return ret;
 
-
-    if (src->height & 16 || src->linesize[0] & 16) {
+    if (src->height & 15 || src->linesize[0] & 15) {
         realigned = 1;
         memset(&tmp_frame, 0, sizeof(tmp_frame));
         tmp_frame.format         = src->format;
@@ -1180,11 +1180,6 @@
         goto fail;
     }
 
-    ret = MFXQueryVersion(hwctx->session,&ver);
-    if (ret == MFX_ERR_NONE) {
-        av_log(ctx, AV_LOG_VERBOSE, "MFX compile/runtime API: %d.%d/%d.%d\n",
-               MFX_VERSION_MAJOR, MFX_VERSION_MINOR, ver.Major, ver.Minor);
-    }
     return 0;
 
 fail:
@@ -1206,6 +1201,7 @@
     QSVDevicePriv *priv;
     enum AVHWDeviceType child_device_type;
     AVHWDeviceContext *child_device;
+    AVDictionary *child_device_opts;
     AVDictionaryEntry *e;
 
     mfxIMPL impl;
@@ -1220,9 +1216,17 @@
 
     e = av_dict_get(opts, "child_device", NULL, 0);
 
-    if (CONFIG_VAAPI)
+    child_device_opts = NULL;
+    if (CONFIG_VAAPI) {
         child_device_type = AV_HWDEVICE_TYPE_VAAPI;
-    else if (CONFIG_DXVA2)
+        // libmfx does not actually implement VAAPI properly, rather it
+        // depends on the specific behaviour of a matching iHD driver when
+        // used on recent Intel hardware.  Set options to the VAAPI device
+        // creation so that we should pick a usable setup by default if
+        // possible, even when multiple devices and drivers are available.
+        av_dict_set(&child_device_opts, "kernel_driver", "i915", 0);
+        av_dict_set(&child_device_opts, "driver",        "iHD",  0);
+    } else if (CONFIG_DXVA2)
         child_device_type = AV_HWDEVICE_TYPE_DXVA2;
     else {
         av_log(ctx, AV_LOG_ERROR, "No supported child device type is enabled\n");
@@ -1230,7 +1234,9 @@
     }
 
     ret = av_hwdevice_ctx_create(&priv->child_device_ctx, child_device_type,
-                                 e ? e->value : NULL, NULL, 0);
+                                 e ? e->value : NULL, child_device_opts, 0);
+
+    av_dict_free(&child_device_opts);
     if (ret < 0)
         return ret;
 
diff --git a/libavutil/hwcontext_vaapi.c b/libavutil/hwcontext_vaapi.c
index 8624369..b306965 100644
--- a/libavutil/hwcontext_vaapi.c
+++ b/libavutil/hwcontext_vaapi.c
@@ -27,6 +27,7 @@
 
 #if CONFIG_LIBDRM
 #   include <va/va_drmcommon.h>
+#   include <xf86drm.h>
 #   include <drm_fourcc.h>
 #   ifndef DRM_FORMAT_MOD_INVALID
 #       define DRM_FORMAT_MOD_INVALID ((1ULL << 56) - 1)
@@ -115,6 +116,9 @@
 #endif
     MAP(UYVY, YUV422,  UYVY422, 0),
     MAP(YUY2, YUV422,  YUYV422, 0),
+#ifdef VA_FOURCC_Y210
+    MAP(Y210, YUV422_10,  Y210, 0),
+#endif
     MAP(411P, YUV411,  YUV411P, 0),
     MAP(422V, YUV422,  YUV440P, 0),
     MAP(444P, YUV444,  YUV444P, 0),
@@ -1469,6 +1473,8 @@
 {
     VAAPIDevicePriv *priv;
     VADisplay display = NULL;
+    const AVDictionaryEntry *ent;
+    int try_drm, try_x11, try_all;
 
     priv = av_mallocz(sizeof(*priv));
     if (!priv)
@@ -1479,8 +1485,95 @@
     ctx->user_opaque = priv;
     ctx->free        = vaapi_device_free;
 
+    ent = av_dict_get(opts, "connection_type", NULL, 0);
+    if (ent) {
+        try_all = try_drm = try_x11 = 0;
+        if (!strcmp(ent->value, "drm")) {
+            try_drm = 1;
+        } else if (!strcmp(ent->value, "x11")) {
+            try_x11 = 1;
+        } else {
+            av_log(ctx, AV_LOG_ERROR, "Invalid connection type %s.\n",
+                   ent->value);
+            return AVERROR(EINVAL);
+        }
+    } else {
+        try_all = 1;
+        try_drm = HAVE_VAAPI_DRM;
+        try_x11 = HAVE_VAAPI_X11;
+    }
+
+#if HAVE_VAAPI_DRM
+    while (!display && try_drm) {
+        // If the device is specified, try to open it as a DRM device node.
+        // If not, look for a usable render node, possibly restricted to those
+        // using a specified kernel driver.
+        int loglevel = try_all ? AV_LOG_VERBOSE : AV_LOG_ERROR;
+        if (device) {
+            priv->drm_fd = open(device, O_RDWR);
+            if (priv->drm_fd < 0) {
+                av_log(ctx, loglevel, "Failed to open %s as "
+                       "DRM device node.\n", device);
+                break;
+            }
+        } else {
+            char path[64];
+            int n, max_devices = 8;
+#if CONFIG_LIBDRM
+            const AVDictionaryEntry *kernel_driver;
+            kernel_driver = av_dict_get(opts, "kernel_driver", NULL, 0);
+#endif
+            for (n = 0; n < max_devices; n++) {
+                snprintf(path, sizeof(path),
+                         "/dev/dri/renderD%d", 128 + n);
+                priv->drm_fd = open(path, O_RDWR);
+                if (priv->drm_fd < 0) {
+                    av_log(ctx, AV_LOG_VERBOSE, "Cannot open "
+                           "DRM render node for device %d.\n", n);
+                    break;
+                }
+#if CONFIG_LIBDRM
+                if (kernel_driver) {
+                    drmVersion *info;
+                    info = drmGetVersion(priv->drm_fd);
+                    if (strcmp(kernel_driver->value, info->name)) {
+                        av_log(ctx, AV_LOG_VERBOSE, "Ignoring device %d "
+                               "with non-matching kernel driver (%s).\n",
+                               n, info->name);
+                        drmFreeVersion(info);
+                        close(priv->drm_fd);
+                        priv->drm_fd = -1;
+                        continue;
+                    }
+                    av_log(ctx, AV_LOG_VERBOSE, "Trying to use "
+                           "DRM render node for device %d, "
+                           "with matching kernel driver (%s).\n",
+                           n, info->name);
+                    drmFreeVersion(info);
+                } else
+#endif
+                {
+                    av_log(ctx, AV_LOG_VERBOSE, "Trying to use "
+                           "DRM render node for device %d.\n", n);
+                }
+                break;
+            }
+            if (n >= max_devices)
+                break;
+        }
+
+        display = vaGetDisplayDRM(priv->drm_fd);
+        if (!display) {
+            av_log(ctx, AV_LOG_VERBOSE, "Cannot open a VA display "
+                   "from DRM device %s.\n", device);
+            return AVERROR_EXTERNAL;
+        }
+        break;
+    }
+#endif
+
 #if HAVE_VAAPI_X11
-    if (!display && !(device && device[0] == '/')) {
+    if (!display && try_x11) {
         // Try to open the device as an X11 display.
         priv->x11_display = XOpenDisplay(device);
         if (!priv->x11_display) {
@@ -1500,36 +1593,33 @@
     }
 #endif
 
-#if HAVE_VAAPI_DRM
     if (!display) {
-        // Try to open the device as a DRM path.
-        // Default to using the first render node if the user did not
-        // supply a path.
-        const char *path = device ? device : "/dev/dri/renderD128";
-        priv->drm_fd = open(path, O_RDWR);
-        if (priv->drm_fd < 0) {
-            av_log(ctx, AV_LOG_VERBOSE, "Cannot open DRM device %s.\n",
-                   path);
-        } else {
-            display = vaGetDisplayDRM(priv->drm_fd);
-            if (!display) {
-                av_log(ctx, AV_LOG_ERROR, "Cannot open a VA display "
-                       "from DRM device %s.\n", path);
-                return AVERROR_UNKNOWN;
-            }
-
-            av_log(ctx, AV_LOG_VERBOSE, "Opened VA display via "
-                   "DRM device %s.\n", path);
-        }
-    }
-#endif
-
-    if (!display) {
-        av_log(ctx, AV_LOG_ERROR, "No VA display found for "
-               "device: %s.\n", device ? device : "");
+        if (device)
+            av_log(ctx, AV_LOG_ERROR, "No VA display found for "
+                   "device %s.\n", device);
+        else
+            av_log(ctx, AV_LOG_ERROR, "No VA display found for "
+                   "any default device.\n");
         return AVERROR(EINVAL);
     }
 
+    ent = av_dict_get(opts, "driver", NULL, 0);
+    if (ent) {
+#if VA_CHECK_VERSION(0, 38, 0)
+        VAStatus vas;
+        vas = vaSetDriverName(display, ent->value);
+        if (vas != VA_STATUS_SUCCESS) {
+            av_log(ctx, AV_LOG_ERROR, "Failed to set driver name to "
+                   "%s: %d (%s).\n", ent->value, vas, vaErrorStr(vas));
+            vaTerminate(display);
+            return AVERROR_EXTERNAL;
+        }
+#else
+        av_log(ctx, AV_LOG_WARNING, "Driver name setting is not "
+               "supported with this VAAPI version.\n");
+#endif
+    }
+
     return vaapi_device_connect(ctx, display);
 }
 
@@ -1541,6 +1631,7 @@
         AVDRMDeviceContext *src_hwctx = src_ctx->hwctx;
         VADisplay *display;
         VAAPIDevicePriv *priv;
+        int fd;
 
         if (src_hwctx->fd < 0) {
             av_log(ctx, AV_LOG_ERROR, "DRM instance requires an associated "
@@ -1548,17 +1639,56 @@
             return AVERROR(EINVAL);
         }
 
+#if CONFIG_LIBDRM
+        {
+            int node_type = drmGetNodeTypeFromFd(src_hwctx->fd);
+            char *render_node;
+            if (node_type < 0) {
+                av_log(ctx, AV_LOG_ERROR, "DRM instance fd does not appear "
+                       "to refer to a DRM device.\n");
+                return AVERROR(EINVAL);
+            }
+            if (node_type == DRM_NODE_RENDER) {
+                fd = src_hwctx->fd;
+            } else {
+                render_node = drmGetRenderDeviceNameFromFd(src_hwctx->fd);
+                if (!render_node) {
+                    av_log(ctx, AV_LOG_ERROR, "Failed to find a render node "
+                           "matching the DRM device.\n");
+                    return AVERROR(ENODEV);
+                }
+                fd = open(render_node, O_RDWR);
+                if (fd < 0) {
+                    av_log(ctx, AV_LOG_ERROR, "Failed to open render node %s"
+                           "matching the DRM device.\n", render_node);
+                    free(render_node);
+                    return AVERROR(errno);
+                }
+                av_log(ctx, AV_LOG_VERBOSE, "Using render node %s in place "
+                       "of non-render DRM device.\n", render_node);
+                free(render_node);
+            }
+        }
+#else
+        fd = src_hwctx->fd;
+#endif
+
         priv = av_mallocz(sizeof(*priv));
         if (!priv)
             return AVERROR(ENOMEM);
 
-        // Inherits the fd from the source context, which will close it.
-        priv->drm_fd = -1;
+        if (fd == src_hwctx->fd) {
+            // The fd is inherited from the source context and we are holding
+            // a reference to that, we don't want to close it from here.
+            priv->drm_fd = -1;
+        } else {
+            priv->drm_fd = fd;
+        }
 
         ctx->user_opaque = priv;
         ctx->free        = &vaapi_device_free;
 
-        display = vaGetDisplayDRM(src_hwctx->fd);
+        display = vaGetDisplayDRM(fd);
         if (!display) {
             av_log(ctx, AV_LOG_ERROR, "Failed to open a VA display from "
                    "DRM device.\n");
diff --git a/libavutil/hwcontext_vdpau.c b/libavutil/hwcontext_vdpau.c
index c11c3cf..6b8c1d5 100644
--- a/libavutil/hwcontext_vdpau.c
+++ b/libavutil/hwcontext_vdpau.c
@@ -73,8 +73,10 @@
 };
 
 static const VDPAUPixFmtMap pix_fmts_444[] = {
-    { VDP_YCBCR_FORMAT_YV12, AV_PIX_FMT_YUV444P },
-    { 0,                     AV_PIX_FMT_NONE,   },
+#ifdef VDP_YCBCR_FORMAT_Y_U_V_444
+    { VDP_YCBCR_FORMAT_Y_U_V_444, AV_PIX_FMT_YUV444P },
+#endif
+    { 0,                          AV_PIX_FMT_NONE,   },
 };
 
 static const struct {
@@ -349,7 +351,11 @@
         return AVERROR(EINVAL);
     }
 
-    if (vdpau_format == VDP_YCBCR_FORMAT_YV12)
+    if ((vdpau_format == VDP_YCBCR_FORMAT_YV12)
+#ifdef VDP_YCBCR_FORMAT_Y_U_V_444
+            || (vdpau_format == VDP_YCBCR_FORMAT_Y_U_V_444)
+#endif
+            )
         FFSWAP(void*, data[1], data[2]);
 
     err = priv->get_data(surf, vdpau_format, data, linesize);
@@ -400,7 +406,11 @@
         return AVERROR(EINVAL);
     }
 
-    if (vdpau_format == VDP_YCBCR_FORMAT_YV12)
+    if ((vdpau_format == VDP_YCBCR_FORMAT_YV12)
+#ifdef VDP_YCBCR_FORMAT_Y_U_V_444
+            || (vdpau_format == VDP_YCBCR_FORMAT_Y_U_V_444)
+#endif
+            )
         FFSWAP(const void*, data[1], data[2]);
 
     err = priv->put_data(surf, vdpau_format, data, linesize);
diff --git a/libavutil/hwcontext_videotoolbox.c b/libavutil/hwcontext_videotoolbox.c
index cc00f1f..bded987 100644
--- a/libavutil/hwcontext_videotoolbox.c
+++ b/libavutil/hwcontext_videotoolbox.c
@@ -34,13 +34,19 @@
 
 static const struct {
     uint32_t cv_fmt;
+    bool full_range;
     enum AVPixelFormat pix_fmt;
 } cv_pix_fmts[] = {
-    { kCVPixelFormatType_420YpCbCr8Planar,              AV_PIX_FMT_YUV420P },
-    { kCVPixelFormatType_422YpCbCr8,                    AV_PIX_FMT_UYVY422 },
-    { kCVPixelFormatType_32BGRA,                        AV_PIX_FMT_BGRA },
+    { kCVPixelFormatType_420YpCbCr8Planar,              false, AV_PIX_FMT_YUV420P },
+    { kCVPixelFormatType_422YpCbCr8,                    false, AV_PIX_FMT_UYVY422 },
+    { kCVPixelFormatType_32BGRA,                        false, AV_PIX_FMT_BGRA },
 #ifdef kCFCoreFoundationVersionNumber10_7
-    { kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange,  AV_PIX_FMT_NV12 },
+    { kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange,  false, AV_PIX_FMT_NV12 },
+    { kCVPixelFormatType_420YpCbCr8BiPlanarFullRange,   true,  AV_PIX_FMT_NV12 },
+#endif
+#if HAVE_KCVPIXELFORMATTYPE_420YPCBCR10BIPLANARVIDEORANGE
+    { kCVPixelFormatType_420YpCbCr10BiPlanarVideoRange, false, AV_PIX_FMT_P010 },
+    { kCVPixelFormatType_420YpCbCr10BiPlanarFullRange,  true,  AV_PIX_FMT_P010 },
 #endif
 };
 
@@ -56,9 +62,14 @@
 
 uint32_t av_map_videotoolbox_format_from_pixfmt(enum AVPixelFormat pix_fmt)
 {
+    return av_map_videotoolbox_format_from_pixfmt2(pix_fmt, false);
+}
+
+uint32_t av_map_videotoolbox_format_from_pixfmt2(enum AVPixelFormat pix_fmt, bool full_range)
+{
     int i;
     for (i = 0; i < FF_ARRAY_ELEMS(cv_pix_fmts); i++) {
-        if (cv_pix_fmts[i].pix_fmt == pix_fmt)
+        if (cv_pix_fmts[i].pix_fmt == pix_fmt && cv_pix_fmts[i].full_range == full_range)
             return cv_pix_fmts[i].cv_fmt;
     }
     return 0;
diff --git a/libavutil/hwcontext_videotoolbox.h b/libavutil/hwcontext_videotoolbox.h
index 380918d..5074d79 100644
--- a/libavutil/hwcontext_videotoolbox.h
+++ b/libavutil/hwcontext_videotoolbox.h
@@ -51,4 +51,10 @@
  */
 uint32_t av_map_videotoolbox_format_from_pixfmt(enum AVPixelFormat pix_fmt);
 
+/**
+ * Same as av_map_videotoolbox_format_from_pixfmt function, but can map and
+ * return full range pixel formats via a flag.
+ */
+uint32_t av_map_videotoolbox_format_from_pixfmt2(enum AVPixelFormat pix_fmt, bool full_range);
+
 #endif /* AVUTIL_HWCONTEXT_VIDEOTOOLBOX_H */
diff --git a/libavutil/hwcontext_vulkan.c b/libavutil/hwcontext_vulkan.c
new file mode 100644
index 0000000..fa53d9d
--- /dev/null
+++ b/libavutil/hwcontext_vulkan.c
@@ -0,0 +1,2877 @@
+/*
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "config.h"
+#include "pixdesc.h"
+#include "avstring.h"
+#include "imgutils.h"
+#include "hwcontext.h"
+#include "hwcontext_internal.h"
+#include "hwcontext_vulkan.h"
+
+#if CONFIG_LIBDRM
+#include <unistd.h>
+#include <xf86drm.h>
+#include <drm_fourcc.h>
+#include "hwcontext_drm.h"
+#if CONFIG_VAAPI
+#include <va/va_drmcommon.h>
+#include "hwcontext_vaapi.h"
+#endif
+#endif
+
+#if CONFIG_CUDA
+#include "hwcontext_cuda_internal.h"
+#include "cuda_check.h"
+#define CHECK_CU(x) FF_CUDA_CHECK_DL(cuda_cu, cu, x)
+#endif
+
+typedef struct VulkanExecCtx {
+    VkCommandPool pool;
+    VkCommandBuffer buf;
+    VkQueue queue;
+    VkFence fence;
+} VulkanExecCtx;
+
+typedef struct VulkanDevicePriv {
+    /* Properties */
+    VkPhysicalDeviceProperties props;
+    VkPhysicalDeviceMemoryProperties mprops;
+
+    /* Debug callback */
+    VkDebugUtilsMessengerEXT debug_ctx;
+
+    /* Image uploading */
+    VulkanExecCtx cmd;
+
+    /* Extensions */
+    uint64_t extensions;
+
+    /* Settings */
+    int use_linear_images;
+
+    /* Nvidia */
+    int dev_is_nvidia;
+} VulkanDevicePriv;
+
+typedef struct VulkanFramesPriv {
+    VulkanExecCtx cmd;
+} VulkanFramesPriv;
+
+typedef struct AVVkFrameInternal {
+#if CONFIG_CUDA
+    /* Importing external memory into cuda is really expensive so we keep the
+     * memory imported all the time */
+    AVBufferRef *cuda_fc_ref; /* Need to keep it around for uninit */
+    CUexternalMemory ext_mem[AV_NUM_DATA_POINTERS];
+    CUmipmappedArray cu_mma[AV_NUM_DATA_POINTERS];
+    CUarray cu_array[AV_NUM_DATA_POINTERS];
+    CUexternalSemaphore cu_sem;
+#endif
+} AVVkFrameInternal;
+
+#define VK_LOAD_PFN(inst, name) PFN_##name pfn_##name = (PFN_##name)           \
+                                              vkGetInstanceProcAddr(inst, #name)
+
+#define DEFAULT_USAGE_FLAGS (VK_IMAGE_USAGE_SAMPLED_BIT      |                 \
+                             VK_IMAGE_USAGE_STORAGE_BIT      |                 \
+                             VK_IMAGE_USAGE_TRANSFER_SRC_BIT |                 \
+                             VK_IMAGE_USAGE_TRANSFER_DST_BIT)
+
+#define ADD_VAL_TO_LIST(list, count, val)                                      \
+    do {                                                                       \
+        list = av_realloc_array(list, sizeof(*list), ++count);                 \
+        if (!list) {                                                           \
+            err = AVERROR(ENOMEM);                                             \
+            goto end;                                                          \
+        }                                                                      \
+        list[count - 1] = val;                                                 \
+    } while(0)
+
+static const struct {
+    enum AVPixelFormat pixfmt;
+    const VkFormat vkfmts[3];
+} vk_pixfmt_map[] = {
+    { AV_PIX_FMT_GRAY8,   { VK_FORMAT_R8_UNORM } },
+    { AV_PIX_FMT_GRAY16,  { VK_FORMAT_R16_UNORM } },
+    { AV_PIX_FMT_GRAYF32, { VK_FORMAT_R32_SFLOAT } },
+
+    { AV_PIX_FMT_NV12, { VK_FORMAT_R8_UNORM, VK_FORMAT_R8G8_UNORM } },
+    { AV_PIX_FMT_P010, { VK_FORMAT_R16_UNORM, VK_FORMAT_R16G16_UNORM } },
+    { AV_PIX_FMT_P016, { VK_FORMAT_R16_UNORM, VK_FORMAT_R16G16_UNORM } },
+
+    { AV_PIX_FMT_YUV420P, { VK_FORMAT_R8_UNORM, VK_FORMAT_R8_UNORM, VK_FORMAT_R8_UNORM } },
+    { AV_PIX_FMT_YUV422P, { VK_FORMAT_R8_UNORM, VK_FORMAT_R8_UNORM, VK_FORMAT_R8_UNORM } },
+    { AV_PIX_FMT_YUV444P, { VK_FORMAT_R8_UNORM, VK_FORMAT_R8_UNORM, VK_FORMAT_R8_UNORM } },
+
+    { AV_PIX_FMT_YUV420P16, { VK_FORMAT_R16_UNORM, VK_FORMAT_R16_UNORM, VK_FORMAT_R16_UNORM } },
+    { AV_PIX_FMT_YUV422P16, { VK_FORMAT_R16_UNORM, VK_FORMAT_R16_UNORM, VK_FORMAT_R16_UNORM } },
+    { AV_PIX_FMT_YUV444P16, { VK_FORMAT_R16_UNORM, VK_FORMAT_R16_UNORM, VK_FORMAT_R16_UNORM } },
+
+    { AV_PIX_FMT_ABGR,   { VK_FORMAT_A8B8G8R8_UNORM_PACK32 } },
+    { AV_PIX_FMT_BGRA,   { VK_FORMAT_B8G8R8A8_UNORM } },
+    { AV_PIX_FMT_RGBA,   { VK_FORMAT_R8G8B8A8_UNORM } },
+    { AV_PIX_FMT_RGB24,  { VK_FORMAT_R8G8B8_UNORM } },
+    { AV_PIX_FMT_BGR24,  { VK_FORMAT_B8G8R8_UNORM } },
+    { AV_PIX_FMT_RGB48,  { VK_FORMAT_R16G16B16_UNORM } },
+    { AV_PIX_FMT_RGBA64, { VK_FORMAT_R16G16B16A16_UNORM } },
+    { AV_PIX_FMT_RGB565, { VK_FORMAT_R5G6B5_UNORM_PACK16 } },
+    { AV_PIX_FMT_BGR565, { VK_FORMAT_B5G6R5_UNORM_PACK16 } },
+    { AV_PIX_FMT_BGR0,   { VK_FORMAT_B8G8R8A8_UNORM } },
+    { AV_PIX_FMT_0BGR,   { VK_FORMAT_A8B8G8R8_UNORM_PACK32 } },
+    { AV_PIX_FMT_RGB0,   { VK_FORMAT_R8G8B8A8_UNORM } },
+
+    { AV_PIX_FMT_GBRPF32, { VK_FORMAT_R32_SFLOAT, VK_FORMAT_R32_SFLOAT, VK_FORMAT_R32_SFLOAT } },
+};
+
+const VkFormat *av_vkfmt_from_pixfmt(enum AVPixelFormat p)
+{
+    for (enum AVPixelFormat i = 0; i < FF_ARRAY_ELEMS(vk_pixfmt_map); i++)
+        if (vk_pixfmt_map[i].pixfmt == p)
+            return vk_pixfmt_map[i].vkfmts;
+    return NULL;
+}
+
+static int pixfmt_is_supported(AVVulkanDeviceContext *hwctx, enum AVPixelFormat p,
+                               int linear)
+{
+    const VkFormat *fmt = av_vkfmt_from_pixfmt(p);
+    int planes = av_pix_fmt_count_planes(p);
+
+    if (!fmt)
+        return 0;
+
+    for (int i = 0; i < planes; i++) {
+        VkFormatFeatureFlags flags;
+        VkFormatProperties2 prop = {
+            .sType = VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2,
+        };
+        vkGetPhysicalDeviceFormatProperties2(hwctx->phys_dev, fmt[i], &prop);
+        flags = linear ? prop.formatProperties.linearTilingFeatures :
+                         prop.formatProperties.optimalTilingFeatures;
+        if (!(flags & DEFAULT_USAGE_FLAGS))
+            return 0;
+    }
+
+    return 1;
+}
+
+enum VulkanExtensions {
+    EXT_EXTERNAL_DMABUF_MEMORY = 1ULL <<  0, /* VK_EXT_external_memory_dma_buf */
+    EXT_DRM_MODIFIER_FLAGS     = 1ULL <<  1, /* VK_EXT_image_drm_format_modifier */
+    EXT_EXTERNAL_FD_MEMORY     = 1ULL <<  2, /* VK_KHR_external_memory_fd */
+    EXT_EXTERNAL_FD_SEM        = 1ULL <<  3, /* VK_KHR_external_semaphore_fd */
+
+    EXT_OPTIONAL               = 1ULL << 62,
+    EXT_REQUIRED               = 1ULL << 63,
+};
+
+typedef struct VulkanOptExtension {
+    const char *name;
+    uint64_t flag;
+} VulkanOptExtension;
+
+static const VulkanOptExtension optional_instance_exts[] = {
+    /* For future use */
+};
+
+static const VulkanOptExtension optional_device_exts[] = {
+    { VK_KHR_EXTERNAL_MEMORY_FD_EXTENSION_NAME,               EXT_EXTERNAL_FD_MEMORY,     },
+    { VK_EXT_EXTERNAL_MEMORY_DMA_BUF_EXTENSION_NAME,          EXT_EXTERNAL_DMABUF_MEMORY, },
+    { VK_EXT_IMAGE_DRM_FORMAT_MODIFIER_EXTENSION_NAME,        EXT_DRM_MODIFIER_FLAGS,     },
+    { VK_KHR_EXTERNAL_SEMAPHORE_FD_EXTENSION_NAME,            EXT_EXTERNAL_FD_SEM,        },
+};
+
+/* Converts return values to strings */
+static const char *vk_ret2str(VkResult res)
+{
+#define CASE(VAL) case VAL: return #VAL
+    switch (res) {
+    CASE(VK_SUCCESS);
+    CASE(VK_NOT_READY);
+    CASE(VK_TIMEOUT);
+    CASE(VK_EVENT_SET);
+    CASE(VK_EVENT_RESET);
+    CASE(VK_INCOMPLETE);
+    CASE(VK_ERROR_OUT_OF_HOST_MEMORY);
+    CASE(VK_ERROR_OUT_OF_DEVICE_MEMORY);
+    CASE(VK_ERROR_INITIALIZATION_FAILED);
+    CASE(VK_ERROR_DEVICE_LOST);
+    CASE(VK_ERROR_MEMORY_MAP_FAILED);
+    CASE(VK_ERROR_LAYER_NOT_PRESENT);
+    CASE(VK_ERROR_EXTENSION_NOT_PRESENT);
+    CASE(VK_ERROR_FEATURE_NOT_PRESENT);
+    CASE(VK_ERROR_INCOMPATIBLE_DRIVER);
+    CASE(VK_ERROR_TOO_MANY_OBJECTS);
+    CASE(VK_ERROR_FORMAT_NOT_SUPPORTED);
+    CASE(VK_ERROR_FRAGMENTED_POOL);
+    CASE(VK_ERROR_SURFACE_LOST_KHR);
+    CASE(VK_ERROR_NATIVE_WINDOW_IN_USE_KHR);
+    CASE(VK_SUBOPTIMAL_KHR);
+    CASE(VK_ERROR_OUT_OF_DATE_KHR);
+    CASE(VK_ERROR_INCOMPATIBLE_DISPLAY_KHR);
+    CASE(VK_ERROR_VALIDATION_FAILED_EXT);
+    CASE(VK_ERROR_INVALID_SHADER_NV);
+    CASE(VK_ERROR_OUT_OF_POOL_MEMORY);
+    CASE(VK_ERROR_INVALID_EXTERNAL_HANDLE);
+    CASE(VK_ERROR_NOT_PERMITTED_EXT);
+    CASE(VK_ERROR_INVALID_DRM_FORMAT_MODIFIER_PLANE_LAYOUT_EXT);
+    CASE(VK_ERROR_INVALID_DEVICE_ADDRESS_EXT);
+    CASE(VK_ERROR_FULL_SCREEN_EXCLUSIVE_MODE_LOST_EXT);
+    default: return "Unknown error";
+    }
+#undef CASE
+}
+
+static VkBool32 vk_dbg_callback(VkDebugUtilsMessageSeverityFlagBitsEXT severity,
+                                VkDebugUtilsMessageTypeFlagsEXT messageType,
+                                const VkDebugUtilsMessengerCallbackDataEXT *data,
+                                void *priv)
+{
+    int l;
+    AVHWDeviceContext *ctx = priv;
+
+    switch (severity) {
+    case VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT: l = AV_LOG_VERBOSE; break;
+    case VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT:    l = AV_LOG_INFO;    break;
+    case VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT: l = AV_LOG_WARNING; break;
+    case VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT:   l = AV_LOG_ERROR;   break;
+    default:                                              l = AV_LOG_DEBUG;   break;
+    }
+
+    av_log(ctx, l, "%s\n", data->pMessage);
+    for (int i = 0; i < data->cmdBufLabelCount; i++)
+        av_log(ctx, l, "\t%i: %s\n", i, data->pCmdBufLabels[i].pLabelName);
+
+    return 0;
+}
+
+static int check_extensions(AVHWDeviceContext *ctx, int dev,
+                            const char * const **dst, uint32_t *num, int debug)
+{
+    const char *tstr;
+    const char **extension_names = NULL;
+    VulkanDevicePriv *p = ctx->internal->priv;
+    AVVulkanDeviceContext *hwctx = ctx->hwctx;
+    int err = 0, found, extensions_found = 0;
+
+    const char *mod;
+    int optional_exts_num;
+    uint32_t sup_ext_count;
+    VkExtensionProperties *sup_ext;
+    const VulkanOptExtension *optional_exts;
+
+    if (!dev) {
+        mod = "instance";
+        optional_exts = optional_instance_exts;
+        optional_exts_num = FF_ARRAY_ELEMS(optional_instance_exts);
+        vkEnumerateInstanceExtensionProperties(NULL, &sup_ext_count, NULL);
+        sup_ext = av_malloc_array(sup_ext_count, sizeof(VkExtensionProperties));
+        if (!sup_ext)
+            return AVERROR(ENOMEM);
+        vkEnumerateInstanceExtensionProperties(NULL, &sup_ext_count, sup_ext);
+    } else {
+        mod = "device";
+        optional_exts = optional_device_exts;
+        optional_exts_num = FF_ARRAY_ELEMS(optional_device_exts);
+        vkEnumerateDeviceExtensionProperties(hwctx->phys_dev, NULL,
+                                             &sup_ext_count, NULL);
+        sup_ext = av_malloc_array(sup_ext_count, sizeof(VkExtensionProperties));
+        if (!sup_ext)
+            return AVERROR(ENOMEM);
+        vkEnumerateDeviceExtensionProperties(hwctx->phys_dev, NULL,
+                                             &sup_ext_count, sup_ext);
+    }
+
+    for (int i = 0; i < optional_exts_num; i++) {
+        int req = optional_exts[i].flag & EXT_REQUIRED;
+        tstr = optional_exts[i].name;
+
+        found = 0;
+        for (int j = 0; j < sup_ext_count; j++) {
+            if (!strcmp(tstr, sup_ext[j].extensionName)) {
+                found = 1;
+                break;
+            }
+        }
+        if (!found) {
+            int lvl = req ? AV_LOG_ERROR : AV_LOG_VERBOSE;
+            av_log(ctx, lvl, "Extension \"%s\" not found!\n", tstr);
+            if (req) {
+                err = AVERROR(EINVAL);
+                goto end;
+            }
+            continue;
+        }
+        if (!req)
+            p->extensions |= optional_exts[i].flag;
+
+        av_log(ctx, AV_LOG_VERBOSE, "Using %s extension \"%s\"\n", mod, tstr);
+
+        ADD_VAL_TO_LIST(extension_names, extensions_found, tstr);
+    }
+
+    if (debug && !dev) {
+        tstr = VK_EXT_DEBUG_UTILS_EXTENSION_NAME;
+        found = 0;
+        for (int j = 0; j < sup_ext_count; j++) {
+            if (!strcmp(tstr, sup_ext[j].extensionName)) {
+                found = 1;
+                break;
+            }
+        }
+        if (found) {
+            ADD_VAL_TO_LIST(extension_names, extensions_found, tstr);
+        } else {
+            av_log(ctx, AV_LOG_ERROR, "Debug extension \"%s\" not found!\n",
+                   tstr);
+            err = AVERROR(EINVAL);
+            goto end;
+        }
+    }
+
+    *dst = extension_names;
+    *num = extensions_found;
+
+end:
+    av_free(sup_ext);
+    return err;
+}
+
+/* Creates a VkInstance */
+static int create_instance(AVHWDeviceContext *ctx, AVDictionary *opts)
+{
+    int err = 0;
+    VkResult ret;
+    VulkanDevicePriv *p = ctx->internal->priv;
+    AVVulkanDeviceContext *hwctx = ctx->hwctx;
+    AVDictionaryEntry *debug_opt = av_dict_get(opts, "debug", NULL, 0);
+    const int debug_mode = debug_opt && strtol(debug_opt->value, NULL, 10);
+    VkApplicationInfo application_info = {
+        .sType              = VK_STRUCTURE_TYPE_APPLICATION_INFO,
+        .pEngineName        = "libavutil",
+        .apiVersion         = VK_API_VERSION_1_1,
+        .engineVersion      = VK_MAKE_VERSION(LIBAVUTIL_VERSION_MAJOR,
+                                              LIBAVUTIL_VERSION_MINOR,
+                                              LIBAVUTIL_VERSION_MICRO),
+    };
+    VkInstanceCreateInfo inst_props = {
+        .sType            = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO,
+        .pApplicationInfo = &application_info,
+    };
+
+    /* Check for present/missing extensions */
+    err = check_extensions(ctx, 0, &inst_props.ppEnabledExtensionNames,
+                           &inst_props.enabledExtensionCount, debug_mode);
+    if (err < 0)
+        return err;
+
+    if (debug_mode) {
+        static const char *layers[] = { "VK_LAYER_LUNARG_standard_validation" };
+        inst_props.ppEnabledLayerNames = layers;
+        inst_props.enabledLayerCount = FF_ARRAY_ELEMS(layers);
+    }
+
+    /* Try to create the instance */
+    ret = vkCreateInstance(&inst_props, hwctx->alloc, &hwctx->inst);
+
+    /* Free used memory */
+    av_free((void *)inst_props.ppEnabledExtensionNames);
+
+    /* Check for errors */
+    if (ret != VK_SUCCESS) {
+        av_log(ctx, AV_LOG_ERROR, "Instance creation failure: %s\n",
+               vk_ret2str(ret));
+        return AVERROR_EXTERNAL;
+    }
+
+    if (debug_mode) {
+        VkDebugUtilsMessengerCreateInfoEXT dbg = {
+            .sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT,
+            .messageSeverity = VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT |
+                               VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT    |
+                               VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT |
+                               VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT,
+            .messageType = VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT    |
+                           VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT |
+                           VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT,
+            .pfnUserCallback = vk_dbg_callback,
+            .pUserData = ctx,
+        };
+        VK_LOAD_PFN(hwctx->inst, vkCreateDebugUtilsMessengerEXT);
+
+        pfn_vkCreateDebugUtilsMessengerEXT(hwctx->inst, &dbg,
+                                           hwctx->alloc, &p->debug_ctx);
+    }
+
+    return 0;
+}
+
+typedef struct VulkanDeviceSelection {
+    uint8_t uuid[VK_UUID_SIZE]; /* Will use this first unless !has_uuid */
+    int has_uuid;
+    const char *name; /* Will use this second unless NULL */
+    uint32_t pci_device; /* Will use this third unless 0x0 */
+    uint32_t vendor_id; /* Last resort to find something deterministic */
+    int index; /* Finally fall back to index */
+} VulkanDeviceSelection;
+
+static const char *vk_dev_type(enum VkPhysicalDeviceType type)
+{
+    switch (type) {
+    case VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU: return "integrated";
+    case VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU:   return "discrete";
+    case VK_PHYSICAL_DEVICE_TYPE_VIRTUAL_GPU:    return "virtual";
+    case VK_PHYSICAL_DEVICE_TYPE_CPU:            return "software";
+    default:                                     return "unknown";
+    }
+}
+
+/* Finds a device */
+static int find_device(AVHWDeviceContext *ctx, VulkanDeviceSelection *select)
+{
+    int err = 0, choice = -1;
+    uint32_t num;
+    VkResult ret;
+    VkPhysicalDevice *devices = NULL;
+    VkPhysicalDeviceIDProperties *idp = NULL;
+    VkPhysicalDeviceProperties2 *prop = NULL;
+    VulkanDevicePriv *p = ctx->internal->priv;
+    AVVulkanDeviceContext *hwctx = ctx->hwctx;
+
+    ret = vkEnumeratePhysicalDevices(hwctx->inst, &num, NULL);
+    if (ret != VK_SUCCESS || !num) {
+        av_log(ctx, AV_LOG_ERROR, "No devices found: %s!\n", vk_ret2str(ret));
+        return AVERROR(ENODEV);
+    }
+
+    devices = av_malloc_array(num, sizeof(VkPhysicalDevice));
+    if (!devices)
+        return AVERROR(ENOMEM);
+
+    ret = vkEnumeratePhysicalDevices(hwctx->inst, &num, devices);
+    if (ret != VK_SUCCESS) {
+        av_log(ctx, AV_LOG_ERROR, "Failed enumerating devices: %s\n",
+               vk_ret2str(ret));
+        err = AVERROR(ENODEV);
+        goto end;
+    }
+
+    prop = av_mallocz_array(num, sizeof(*prop));
+    if (!prop) {
+        err = AVERROR(ENOMEM);
+        goto end;
+    }
+
+    idp = av_mallocz_array(num, sizeof(*idp));
+    if (!idp) {
+        err = AVERROR(ENOMEM);
+        goto end;
+    }
+
+    av_log(ctx, AV_LOG_VERBOSE, "GPU listing:\n");
+    for (int i = 0; i < num; i++) {
+        idp[i].sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES;
+        prop[i].sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2;
+        prop[i].pNext = &idp[i];
+
+        vkGetPhysicalDeviceProperties2(devices[i], &prop[i]);
+        av_log(ctx, AV_LOG_VERBOSE, "    %d: %s (%s) (0x%x)\n", i,
+               prop[i].properties.deviceName,
+               vk_dev_type(prop[i].properties.deviceType),
+               prop[i].properties.deviceID);
+    }
+
+    if (select->has_uuid) {
+        for (int i = 0; i < num; i++) {
+            if (!strncmp(idp[i].deviceUUID, select->uuid, VK_UUID_SIZE)) {
+                choice = i;
+                goto end;
+             }
+        }
+        av_log(ctx, AV_LOG_ERROR, "Unable to find device by given UUID!\n");
+        err = AVERROR(ENODEV);
+        goto end;
+    } else if (select->name) {
+        av_log(ctx, AV_LOG_VERBOSE, "Requested device: %s\n", select->name);
+        for (int i = 0; i < num; i++) {
+            if (strstr(prop[i].properties.deviceName, select->name)) {
+                choice = i;
+                goto end;
+             }
+        }
+        av_log(ctx, AV_LOG_ERROR, "Unable to find device \"%s\"!\n",
+               select->name);
+        err = AVERROR(ENODEV);
+        goto end;
+    } else if (select->pci_device) {
+        av_log(ctx, AV_LOG_VERBOSE, "Requested device: 0x%x\n", select->pci_device);
+        for (int i = 0; i < num; i++) {
+            if (select->pci_device == prop[i].properties.deviceID) {
+                choice = i;
+                goto end;
+            }
+        }
+        av_log(ctx, AV_LOG_ERROR, "Unable to find device with PCI ID 0x%x!\n",
+               select->pci_device);
+        err = AVERROR(EINVAL);
+        goto end;
+    } else if (select->vendor_id) {
+        av_log(ctx, AV_LOG_VERBOSE, "Requested vendor: 0x%x\n", select->vendor_id);
+        for (int i = 0; i < num; i++) {
+            if (select->vendor_id == prop[i].properties.vendorID) {
+                choice = i;
+                goto end;
+            }
+        }
+        av_log(ctx, AV_LOG_ERROR, "Unable to find device with Vendor ID 0x%x!\n",
+               select->vendor_id);
+        err = AVERROR(ENODEV);
+        goto end;
+    } else {
+        if (select->index < num) {
+            choice = select->index;
+            goto end;
+        }
+        av_log(ctx, AV_LOG_ERROR, "Unable to find device with index %i!\n",
+               select->index);
+        err = AVERROR(ENODEV);
+        goto end;
+    }
+
+end:
+    if (choice > -1) {
+        p->dev_is_nvidia = (prop[choice].properties.vendorID == 0x10de);
+        hwctx->phys_dev = devices[choice];
+    }
+    av_free(devices);
+    av_free(prop);
+    av_free(idp);
+
+    return err;
+}
+
+static int search_queue_families(AVHWDeviceContext *ctx, VkDeviceCreateInfo *cd)
+{
+    uint32_t num;
+    VkQueueFamilyProperties *qs = NULL;
+    AVVulkanDeviceContext *hwctx = ctx->hwctx;
+    int graph_index = -1, comp_index = -1, tx_index = -1;
+    VkDeviceQueueCreateInfo *pc = (VkDeviceQueueCreateInfo *)cd->pQueueCreateInfos;
+
+    /* First get the number of queue families */
+    vkGetPhysicalDeviceQueueFamilyProperties(hwctx->phys_dev, &num, NULL);
+    if (!num) {
+        av_log(ctx, AV_LOG_ERROR, "Failed to get queues!\n");
+        return AVERROR_EXTERNAL;
+    }
+
+    /* Then allocate memory */
+    qs = av_malloc_array(num, sizeof(VkQueueFamilyProperties));
+    if (!qs)
+        return AVERROR(ENOMEM);
+
+    /* Finally retrieve the queue families */
+    vkGetPhysicalDeviceQueueFamilyProperties(hwctx->phys_dev, &num, qs);
+
+#define SEARCH_FLAGS(expr, out)                                                \
+    for (int i = 0; i < num; i++) {                                            \
+        const VkQueueFlagBits flags = qs[i].queueFlags;                        \
+        if (expr) {                                                            \
+            out = i;                                                           \
+            break;                                                             \
+        }                                                                      \
+    }
+
+    SEARCH_FLAGS(flags & VK_QUEUE_GRAPHICS_BIT, graph_index)
+
+    SEARCH_FLAGS((flags &  VK_QUEUE_COMPUTE_BIT) && (i != graph_index),
+                 comp_index)
+
+    SEARCH_FLAGS((flags & VK_QUEUE_TRANSFER_BIT) && (i != graph_index) &&
+                 (i != comp_index), tx_index)
+
+#undef SEARCH_FLAGS
+#define QF_FLAGS(flags)                                                        \
+    ((flags) & VK_QUEUE_GRAPHICS_BIT      ) ? "(graphics) " : "",              \
+    ((flags) & VK_QUEUE_COMPUTE_BIT       ) ? "(compute) "  : "",              \
+    ((flags) & VK_QUEUE_TRANSFER_BIT      ) ? "(transfer) " : "",              \
+    ((flags) & VK_QUEUE_SPARSE_BINDING_BIT) ? "(sparse) "   : ""
+
+    av_log(ctx, AV_LOG_VERBOSE, "Using queue family %i for graphics, "
+           "flags: %s%s%s%s\n", graph_index, QF_FLAGS(qs[graph_index].queueFlags));
+
+    hwctx->queue_family_index      = graph_index;
+    hwctx->queue_family_tx_index   = graph_index;
+    hwctx->queue_family_comp_index = graph_index;
+
+    pc[cd->queueCreateInfoCount++].queueFamilyIndex = graph_index;
+
+    if (comp_index != -1) {
+        av_log(ctx, AV_LOG_VERBOSE, "Using queue family %i for compute, "
+               "flags: %s%s%s%s\n", comp_index, QF_FLAGS(qs[comp_index].queueFlags));
+        hwctx->queue_family_tx_index                    = comp_index;
+        hwctx->queue_family_comp_index                  = comp_index;
+        pc[cd->queueCreateInfoCount++].queueFamilyIndex = comp_index;
+    }
+
+    if (tx_index != -1) {
+        av_log(ctx, AV_LOG_VERBOSE, "Using queue family %i for transfers, "
+               "flags: %s%s%s%s\n", tx_index, QF_FLAGS(qs[tx_index].queueFlags));
+        hwctx->queue_family_tx_index                    = tx_index;
+        pc[cd->queueCreateInfoCount++].queueFamilyIndex = tx_index;
+    }
+
+#undef QF_FLAGS
+
+    av_free(qs);
+
+    return 0;
+}
+
+static int create_exec_ctx(AVHWDeviceContext *ctx, VulkanExecCtx *cmd,
+                           int queue_family_index)
+{
+    VkResult ret;
+    AVVulkanDeviceContext *hwctx = ctx->hwctx;
+
+    VkCommandPoolCreateInfo cqueue_create = {
+        .sType              = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,
+        .flags              = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT,
+        .queueFamilyIndex   = queue_family_index,
+    };
+    VkCommandBufferAllocateInfo cbuf_create = {
+        .sType              = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,
+        .level              = VK_COMMAND_BUFFER_LEVEL_PRIMARY,
+        .commandBufferCount = 1,
+    };
+
+    VkFenceCreateInfo fence_spawn = {
+        .sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO,
+    };
+
+    ret = vkCreateFence(hwctx->act_dev, &fence_spawn,
+                        hwctx->alloc, &cmd->fence);
+    if (ret != VK_SUCCESS) {
+        av_log(ctx, AV_LOG_ERROR, "Failed to create frame fence: %s\n",
+               vk_ret2str(ret));
+        return AVERROR_EXTERNAL;
+    }
+
+    ret = vkCreateCommandPool(hwctx->act_dev, &cqueue_create,
+                              hwctx->alloc, &cmd->pool);
+    if (ret != VK_SUCCESS) {
+        av_log(ctx, AV_LOG_ERROR, "Command pool creation failure: %s\n",
+               vk_ret2str(ret));
+        return AVERROR_EXTERNAL;
+    }
+
+    cbuf_create.commandPool = cmd->pool;
+
+    ret = vkAllocateCommandBuffers(hwctx->act_dev, &cbuf_create, &cmd->buf);
+    if (ret != VK_SUCCESS) {
+        av_log(ctx, AV_LOG_ERROR, "Command buffer alloc failure: %s\n",
+               vk_ret2str(ret));
+        return AVERROR_EXTERNAL;
+    }
+
+    vkGetDeviceQueue(hwctx->act_dev, cqueue_create.queueFamilyIndex, 0,
+                     &cmd->queue);
+
+    return 0;
+}
+
+static void free_exec_ctx(AVHWDeviceContext *ctx, VulkanExecCtx *cmd)
+{
+    AVVulkanDeviceContext *hwctx = ctx->hwctx;
+
+    if (cmd->fence)
+        vkDestroyFence(hwctx->act_dev, cmd->fence, hwctx->alloc);
+    if (cmd->buf)
+        vkFreeCommandBuffers(hwctx->act_dev, cmd->pool, 1, &cmd->buf);
+    if (cmd->pool)
+        vkDestroyCommandPool(hwctx->act_dev, cmd->pool, hwctx->alloc);
+}
+
+static void vulkan_device_free(AVHWDeviceContext *ctx)
+{
+    VulkanDevicePriv *p = ctx->internal->priv;
+    AVVulkanDeviceContext *hwctx = ctx->hwctx;
+
+    free_exec_ctx(ctx, &p->cmd);
+
+    vkDestroyDevice(hwctx->act_dev, hwctx->alloc);
+
+    if (p->debug_ctx) {
+        VK_LOAD_PFN(hwctx->inst, vkDestroyDebugUtilsMessengerEXT);
+        pfn_vkDestroyDebugUtilsMessengerEXT(hwctx->inst, p->debug_ctx,
+                                            hwctx->alloc);
+    }
+
+    vkDestroyInstance(hwctx->inst, hwctx->alloc);
+}
+
+static int vulkan_device_create_internal(AVHWDeviceContext *ctx,
+                                         VulkanDeviceSelection *dev_select,
+                                         AVDictionary *opts, int flags)
+{
+    int err = 0;
+    VkResult ret;
+    AVDictionaryEntry *opt_d;
+    VulkanDevicePriv *p = ctx->internal->priv;
+    AVVulkanDeviceContext *hwctx = ctx->hwctx;
+    VkDeviceQueueCreateInfo queue_create_info[3] = {
+        {   .sType            = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO,
+            .pQueuePriorities = (float []){ 1.0f },
+            .queueCount       = 1, },
+        {   .sType            = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO,
+            .pQueuePriorities = (float []){ 1.0f },
+            .queueCount       = 1, },
+        {   .sType            = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO,
+            .pQueuePriorities = (float []){ 1.0f },
+            .queueCount       = 1, },
+    };
+
+    VkDeviceCreateInfo dev_info = {
+        .sType                = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO,
+        .pQueueCreateInfos    = queue_create_info,
+        .queueCreateInfoCount = 0,
+    };
+
+    ctx->free = vulkan_device_free;
+
+    /* Create an instance if not given one */
+    if ((err = create_instance(ctx, opts)))
+        goto end;
+
+    /* Find a device (if not given one) */
+    if ((err = find_device(ctx, dev_select)))
+        goto end;
+
+    vkGetPhysicalDeviceProperties(hwctx->phys_dev, &p->props);
+    av_log(ctx, AV_LOG_VERBOSE, "Using device: %s\n", p->props.deviceName);
+    av_log(ctx, AV_LOG_VERBOSE, "Alignments:\n");
+    av_log(ctx, AV_LOG_VERBOSE, "    optimalBufferCopyOffsetAlignment:   %li\n",
+           p->props.limits.optimalBufferCopyOffsetAlignment);
+    av_log(ctx, AV_LOG_VERBOSE, "    optimalBufferCopyRowPitchAlignment: %li\n",
+           p->props.limits.optimalBufferCopyRowPitchAlignment);
+    av_log(ctx, AV_LOG_VERBOSE, "    minMemoryMapAlignment:              %li\n",
+           p->props.limits.minMemoryMapAlignment);
+
+    /* Search queue family */
+    if ((err = search_queue_families(ctx, &dev_info)))
+        goto end;
+
+    if ((err = check_extensions(ctx, 1, &dev_info.ppEnabledExtensionNames,
+                                &dev_info.enabledExtensionCount, 0)))
+        goto end;
+
+    ret = vkCreateDevice(hwctx->phys_dev, &dev_info, hwctx->alloc,
+                         &hwctx->act_dev);
+
+    av_free((void *)dev_info.ppEnabledExtensionNames);
+
+    if (ret != VK_SUCCESS) {
+        av_log(ctx, AV_LOG_ERROR, "Device creation failure: %s\n",
+               vk_ret2str(ret));
+        err = AVERROR_EXTERNAL;
+        goto end;
+    }
+
+    /* Tiled images setting, use them by default */
+    opt_d = av_dict_get(opts, "linear_images", NULL, 0);
+    if (opt_d)
+        p->use_linear_images = strtol(opt_d->value, NULL, 10);
+
+end:
+    return err;
+}
+
+static int vulkan_device_init(AVHWDeviceContext *ctx)
+{
+    int err;
+    uint32_t queue_num;
+    AVVulkanDeviceContext *hwctx = ctx->hwctx;
+    VulkanDevicePriv *p = ctx->internal->priv;
+
+    vkGetPhysicalDeviceQueueFamilyProperties(hwctx->phys_dev, &queue_num, NULL);
+    if (!queue_num) {
+        av_log(ctx, AV_LOG_ERROR, "Failed to get queues!\n");
+        return AVERROR_EXTERNAL;
+    }
+
+#define CHECK_QUEUE(type, n)                                                         \
+if (n >= queue_num) {                                                                \
+    av_log(ctx, AV_LOG_ERROR, "Invalid %s queue index %i (device has %i queues)!\n", \
+           type, n, queue_num);                                                      \
+    return AVERROR(EINVAL);                                                          \
+}
+
+    CHECK_QUEUE("graphics", hwctx->queue_family_index)
+    CHECK_QUEUE("upload",   hwctx->queue_family_tx_index)
+    CHECK_QUEUE("compute",  hwctx->queue_family_comp_index)
+
+#undef CHECK_QUEUE
+
+    /* Create exec context - if there's something invalid this will error out */
+    err = create_exec_ctx(ctx, &p->cmd, hwctx->queue_family_tx_index);
+    if (err)
+        return err;
+
+    /* Get device capabilities */
+    vkGetPhysicalDeviceMemoryProperties(hwctx->phys_dev, &p->mprops);
+
+    return 0;
+}
+
+static int vulkan_device_create(AVHWDeviceContext *ctx, const char *device,
+                                AVDictionary *opts, int flags)
+{
+    VulkanDeviceSelection dev_select = { 0 };
+    if (device && device[0]) {
+        char *end = NULL;
+        dev_select.index = strtol(device, &end, 10);
+        if (end == device) {
+            dev_select.index = 0;
+            dev_select.name  = device;
+        }
+    }
+
+    return vulkan_device_create_internal(ctx, &dev_select, opts, flags);
+}
+
+static int vulkan_device_derive(AVHWDeviceContext *ctx,
+                                AVHWDeviceContext *src_ctx, int flags)
+{
+    av_unused VulkanDeviceSelection dev_select = { 0 };
+
+    /* If there's only one device on the system, then even if its not covered
+     * by the following checks (e.g. non-PCIe ARM GPU), having an empty
+     * dev_select will mean it'll get picked. */
+    switch(src_ctx->type) {
+#if CONFIG_LIBDRM
+#if CONFIG_VAAPI
+    case AV_HWDEVICE_TYPE_VAAPI: {
+        AVVAAPIDeviceContext *src_hwctx = src_ctx->hwctx;
+
+        const char *vendor = vaQueryVendorString(src_hwctx->display);
+        if (!vendor) {
+            av_log(ctx, AV_LOG_ERROR, "Unable to get device info from VAAPI!\n");
+            return AVERROR_EXTERNAL;
+        }
+
+        if (strstr(vendor, "Intel"))
+            dev_select.vendor_id = 0x8086;
+        if (strstr(vendor, "AMD"))
+            dev_select.vendor_id = 0x1002;
+
+        return vulkan_device_create_internal(ctx, &dev_select, NULL, flags);
+    }
+#endif
+    case AV_HWDEVICE_TYPE_DRM: {
+        AVDRMDeviceContext *src_hwctx = src_ctx->hwctx;
+
+        drmDevice *drm_dev_info;
+        int err = drmGetDevice(src_hwctx->fd, &drm_dev_info);
+        if (err) {
+            av_log(ctx, AV_LOG_ERROR, "Unable to get device info from DRM fd!\n");
+            return AVERROR_EXTERNAL;
+        }
+
+        if (drm_dev_info->bustype == DRM_BUS_PCI)
+            dev_select.pci_device = drm_dev_info->deviceinfo.pci->device_id;
+
+        drmFreeDevice(&drm_dev_info);
+
+        return vulkan_device_create_internal(ctx, &dev_select, NULL, flags);
+    }
+#endif
+#if CONFIG_CUDA
+    case AV_HWDEVICE_TYPE_CUDA: {
+        AVHWDeviceContext *cuda_cu = src_ctx;
+        AVCUDADeviceContext *src_hwctx = src_ctx->hwctx;
+        AVCUDADeviceContextInternal *cu_internal = src_hwctx->internal;
+        CudaFunctions *cu = cu_internal->cuda_dl;
+
+        int ret = CHECK_CU(cu->cuDeviceGetUuid((CUuuid *)&dev_select.uuid,
+                                               cu_internal->cuda_device));
+        if (ret < 0) {
+            av_log(ctx, AV_LOG_ERROR, "Unable to get UUID from CUDA!\n");
+            return AVERROR_EXTERNAL;
+        }
+
+        dev_select.has_uuid = 1;
+
+        return vulkan_device_create_internal(ctx, &dev_select, NULL, flags);
+    }
+#endif
+    default:
+        return AVERROR(ENOSYS);
+    }
+}
+
+static int vulkan_frames_get_constraints(AVHWDeviceContext *ctx,
+                                         const void *hwconfig,
+                                         AVHWFramesConstraints *constraints)
+{
+    int count = 0;
+    AVVulkanDeviceContext *hwctx = ctx->hwctx;
+    VulkanDevicePriv *p = ctx->internal->priv;
+
+    for (enum AVPixelFormat i = 0; i < AV_PIX_FMT_NB; i++)
+        count += pixfmt_is_supported(hwctx, i, p->use_linear_images);
+
+#if CONFIG_CUDA
+    if (p->dev_is_nvidia)
+        count++;
+#endif
+
+    constraints->valid_sw_formats = av_malloc_array(count + 1,
+                                                    sizeof(enum AVPixelFormat));
+    if (!constraints->valid_sw_formats)
+        return AVERROR(ENOMEM);
+
+    count = 0;
+    for (enum AVPixelFormat i = 0; i < AV_PIX_FMT_NB; i++)
+        if (pixfmt_is_supported(hwctx, i, p->use_linear_images))
+            constraints->valid_sw_formats[count++] = i;
+
+#if CONFIG_CUDA
+    if (p->dev_is_nvidia)
+        constraints->valid_sw_formats[count++] = AV_PIX_FMT_CUDA;
+#endif
+    constraints->valid_sw_formats[count++] = AV_PIX_FMT_NONE;
+
+    constraints->min_width  = 0;
+    constraints->min_height = 0;
+    constraints->max_width  = p->props.limits.maxImageDimension2D;
+    constraints->max_height = p->props.limits.maxImageDimension2D;
+
+    constraints->valid_hw_formats = av_malloc_array(2, sizeof(enum AVPixelFormat));
+    if (!constraints->valid_hw_formats)
+        return AVERROR(ENOMEM);
+
+    constraints->valid_hw_formats[0] = AV_PIX_FMT_VULKAN;
+    constraints->valid_hw_formats[1] = AV_PIX_FMT_NONE;
+
+    return 0;
+}
+
+static int alloc_mem(AVHWDeviceContext *ctx, VkMemoryRequirements *req,
+                     VkMemoryPropertyFlagBits req_flags, void *alloc_extension,
+                     VkMemoryPropertyFlagBits *mem_flags, VkDeviceMemory *mem)
+{
+    VkResult ret;
+    int index = -1;
+    VulkanDevicePriv *p = ctx->internal->priv;
+    AVVulkanDeviceContext *dev_hwctx = ctx->hwctx;
+    VkMemoryAllocateInfo alloc_info = {
+        .sType           = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO,
+        .pNext           = alloc_extension,
+    };
+
+    /* Align if we need to */
+    if (req_flags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT)
+        req->size = FFALIGN(req->size, p->props.limits.minMemoryMapAlignment);
+
+    alloc_info.allocationSize = req->size;
+
+    /* The vulkan spec requires memory types to be sorted in the "optimal"
+     * order, so the first matching type we find will be the best/fastest one */
+    for (int i = 0; i < p->mprops.memoryTypeCount; i++) {
+        /* The memory type must be supported by the requirements (bitfield) */
+        if (!(req->memoryTypeBits & (1 << i)))
+            continue;
+
+        /* The memory type flags must include our properties */
+        if ((p->mprops.memoryTypes[i].propertyFlags & req_flags) != req_flags)
+            continue;
+
+        /* Found a suitable memory type */
+        index = i;
+        break;
+    }
+
+    if (index < 0) {
+        av_log(ctx, AV_LOG_ERROR, "No memory type found for flags 0x%x\n",
+               req_flags);
+        return AVERROR(EINVAL);
+    }
+
+    alloc_info.memoryTypeIndex = index;
+
+    ret = vkAllocateMemory(dev_hwctx->act_dev, &alloc_info,
+                           dev_hwctx->alloc, mem);
+    if (ret != VK_SUCCESS) {
+        av_log(ctx, AV_LOG_ERROR, "Failed to allocate memory: %s\n",
+               vk_ret2str(ret));
+        return AVERROR(ENOMEM);
+    }
+
+    *mem_flags |= p->mprops.memoryTypes[index].propertyFlags;
+
+    return 0;
+}
+
+static void vulkan_free_internal(AVVkFrameInternal *internal)
+{
+    if (!internal)
+        return;
+
+#if CONFIG_CUDA
+    if (internal->cuda_fc_ref) {
+        AVHWFramesContext *cuda_fc = (AVHWFramesContext *)internal->cuda_fc_ref->data;
+        int planes = av_pix_fmt_count_planes(cuda_fc->sw_format);
+        AVHWDeviceContext *cuda_cu = cuda_fc->device_ctx;
+        AVCUDADeviceContext *cuda_dev = cuda_cu->hwctx;
+        AVCUDADeviceContextInternal *cu_internal = cuda_dev->internal;
+        CudaFunctions *cu = cu_internal->cuda_dl;
+
+        if (internal->cu_sem)
+            CHECK_CU(cu->cuDestroyExternalSemaphore(internal->cu_sem));
+
+        for (int i = 0; i < planes; i++) {
+            if (internal->cu_mma[i])
+                CHECK_CU(cu->cuMipmappedArrayDestroy(internal->cu_mma[i]));
+            if (internal->ext_mem[i])
+                CHECK_CU(cu->cuDestroyExternalMemory(internal->ext_mem[i]));
+        }
+
+        av_buffer_unref(&internal->cuda_fc_ref);
+    }
+#endif
+
+    av_free(internal);
+}
+
+static void vulkan_frame_free(void *opaque, uint8_t *data)
+{
+    AVVkFrame *f = (AVVkFrame *)data;
+    AVHWFramesContext *hwfc = opaque;
+    AVVulkanDeviceContext *hwctx = hwfc->device_ctx->hwctx;
+    int planes = av_pix_fmt_count_planes(hwfc->sw_format);
+
+    vulkan_free_internal(f->internal);
+
+    for (int i = 0; i < planes; i++) {
+        vkDestroyImage(hwctx->act_dev, f->img[i], hwctx->alloc);
+        vkFreeMemory(hwctx->act_dev, f->mem[i], hwctx->alloc);
+    }
+
+    vkDestroySemaphore(hwctx->act_dev, f->sem, hwctx->alloc);
+
+    av_free(f);
+}
+
+static int alloc_bind_mem(AVHWFramesContext *hwfc, AVVkFrame *f,
+                          void *alloc_pnext, size_t alloc_pnext_stride)
+{
+    int err;
+    VkResult ret;
+    AVHWDeviceContext *ctx = hwfc->device_ctx;
+    const int planes = av_pix_fmt_count_planes(hwfc->sw_format);
+    VkBindImageMemoryInfo bind_info[AV_NUM_DATA_POINTERS] = { { 0 } };
+
+    AVVulkanDeviceContext *hwctx = ctx->hwctx;
+
+    for (int i = 0; i < planes; i++) {
+        int use_ded_mem;
+        VkImageMemoryRequirementsInfo2 req_desc = {
+            .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_REQUIREMENTS_INFO_2,
+            .image = f->img[i],
+        };
+        VkMemoryDedicatedAllocateInfo ded_alloc = {
+            .sType = VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO,
+            .pNext = (void *)(((uint8_t *)alloc_pnext) + i*alloc_pnext_stride),
+        };
+        VkMemoryDedicatedRequirements ded_req = {
+            .sType = VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS,
+        };
+        VkMemoryRequirements2 req = {
+            .sType = VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2,
+            .pNext = &ded_req,
+        };
+
+        vkGetImageMemoryRequirements2(hwctx->act_dev, &req_desc, &req);
+
+        /* In case the implementation prefers/requires dedicated allocation */
+        use_ded_mem = ded_req.prefersDedicatedAllocation |
+                      ded_req.requiresDedicatedAllocation;
+        if (use_ded_mem)
+            ded_alloc.image = f->img[i];
+
+        /* Allocate memory */
+        if ((err = alloc_mem(ctx, &req.memoryRequirements,
+                             f->tiling == VK_IMAGE_TILING_LINEAR ?
+                             VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT :
+                             VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
+                             use_ded_mem ? &ded_alloc : (void *)ded_alloc.pNext,
+                             &f->flags, &f->mem[i])))
+            return err;
+
+        f->size[i] = req.memoryRequirements.size;
+        bind_info[i].sType  = VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO;
+        bind_info[i].image  = f->img[i];
+        bind_info[i].memory = f->mem[i];
+    }
+
+    /* Bind the allocated memory to the images */
+    ret = vkBindImageMemory2(hwctx->act_dev, planes, bind_info);
+    if (ret != VK_SUCCESS) {
+        av_log(ctx, AV_LOG_ERROR, "Failed to bind memory: %s\n",
+               vk_ret2str(ret));
+        return AVERROR_EXTERNAL;
+    }
+
+    return 0;
+}
+
+enum PrepMode {
+    PREP_MODE_WRITE,
+    PREP_MODE_RO_SHADER,
+};
+
+static int prepare_frame(AVHWFramesContext *hwfc, VulkanExecCtx *ectx,
+                         AVVkFrame *frame, enum PrepMode pmode)
+{
+    VkResult ret;
+    VkImageLayout new_layout;
+    VkAccessFlags new_access;
+    AVHWDeviceContext *ctx = hwfc->device_ctx;
+    AVVulkanDeviceContext *hwctx = ctx->hwctx;
+    const int planes = av_pix_fmt_count_planes(hwfc->sw_format);
+
+    VkImageMemoryBarrier img_bar[AV_NUM_DATA_POINTERS] = { 0 };
+
+    VkCommandBufferBeginInfo cmd_start = {
+        .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
+        .flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT,
+    };
+
+    VkSubmitInfo s_info = {
+        .sType                = VK_STRUCTURE_TYPE_SUBMIT_INFO,
+        .commandBufferCount   = 1,
+        .pCommandBuffers      = &ectx->buf,
+
+        .pSignalSemaphores    = &frame->sem,
+        .signalSemaphoreCount = 1,
+    };
+
+    switch (pmode) {
+    case PREP_MODE_WRITE:
+        new_layout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
+        new_access = VK_ACCESS_TRANSFER_WRITE_BIT;
+        break;
+    case PREP_MODE_RO_SHADER:
+        new_layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
+        new_access = VK_ACCESS_TRANSFER_READ_BIT;
+        break;
+    }
+
+    ret = vkBeginCommandBuffer(ectx->buf, &cmd_start);
+    if (ret != VK_SUCCESS)
+        return AVERROR_EXTERNAL;
+
+    /* Change the image layout to something more optimal for writes.
+     * This also signals the newly created semaphore, making it usable
+     * for synchronization */
+    for (int i = 0; i < planes; i++) {
+        img_bar[i].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
+        img_bar[i].srcAccessMask = 0x0;
+        img_bar[i].dstAccessMask = new_access;
+        img_bar[i].oldLayout = frame->layout[i];
+        img_bar[i].newLayout = new_layout;
+        img_bar[i].srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
+        img_bar[i].dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
+        img_bar[i].image = frame->img[i];
+        img_bar[i].subresourceRange.levelCount = 1;
+        img_bar[i].subresourceRange.layerCount = 1;
+        img_bar[i].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
+
+        frame->layout[i] = img_bar[i].newLayout;
+        frame->access[i] = img_bar[i].dstAccessMask;
+    }
+
+    vkCmdPipelineBarrier(ectx->buf, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
+                         VK_PIPELINE_STAGE_TRANSFER_BIT, 0,
+                         0, NULL, 0, NULL, planes, img_bar);
+
+    ret = vkEndCommandBuffer(ectx->buf);
+    if (ret != VK_SUCCESS)
+        return AVERROR_EXTERNAL;
+
+    ret = vkQueueSubmit(ectx->queue, 1, &s_info, ectx->fence);
+    if (ret != VK_SUCCESS) {
+        return AVERROR_EXTERNAL;
+    } else {
+        vkWaitForFences(hwctx->act_dev, 1, &ectx->fence, VK_TRUE, UINT64_MAX);
+        vkResetFences(hwctx->act_dev, 1, &ectx->fence);
+    }
+
+    return 0;
+}
+
+static int create_frame(AVHWFramesContext *hwfc, AVVkFrame **frame,
+                        VkImageTiling tiling, VkImageUsageFlagBits usage,
+                        void *create_pnext)
+{
+    int err;
+    VkResult ret;
+    AVHWDeviceContext *ctx = hwfc->device_ctx;
+    VulkanDevicePriv *p = ctx->internal->priv;
+    AVVulkanDeviceContext *hwctx = ctx->hwctx;
+    enum AVPixelFormat format = hwfc->sw_format;
+    const VkFormat *img_fmts = av_vkfmt_from_pixfmt(format);
+    const int planes = av_pix_fmt_count_planes(format);
+
+    VkExportSemaphoreCreateInfo ext_sem_info = {
+        .sType = VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO,
+        .handleTypes = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT,
+    };
+
+    VkSemaphoreCreateInfo sem_spawn = {
+        .sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO,
+        .pNext = p->extensions & EXT_EXTERNAL_FD_SEM ? &ext_sem_info : NULL,
+    };
+
+    AVVkFrame *f = av_vk_frame_alloc();
+    if (!f) {
+        av_log(ctx, AV_LOG_ERROR, "Unable to allocate memory for AVVkFrame!\n");
+        return AVERROR(ENOMEM);
+    }
+
+    /* Create the images */
+    for (int i = 0; i < planes; i++) {
+        const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(format);
+        int w = hwfc->width;
+        int h = hwfc->height;
+        const int p_w = i > 0 ? AV_CEIL_RSHIFT(w, desc->log2_chroma_w) : w;
+        const int p_h = i > 0 ? AV_CEIL_RSHIFT(h, desc->log2_chroma_h) : h;
+
+        VkImageCreateInfo image_create_info = {
+            .sType         = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
+            .pNext         = create_pnext,
+            .imageType     = VK_IMAGE_TYPE_2D,
+            .format        = img_fmts[i],
+            .extent.width  = p_w,
+            .extent.height = p_h,
+            .extent.depth  = 1,
+            .mipLevels     = 1,
+            .arrayLayers   = 1,
+            .flags         = VK_IMAGE_CREATE_ALIAS_BIT,
+            .tiling        = tiling,
+            .initialLayout = VK_IMAGE_LAYOUT_UNDEFINED,
+            .usage         = usage,
+            .sharingMode   = VK_SHARING_MODE_EXCLUSIVE,
+            .samples       = VK_SAMPLE_COUNT_1_BIT,
+        };
+
+        ret = vkCreateImage(hwctx->act_dev, &image_create_info,
+                            hwctx->alloc, &f->img[i]);
+        if (ret != VK_SUCCESS) {
+            av_log(ctx, AV_LOG_ERROR, "Image creation failure: %s\n",
+                   vk_ret2str(ret));
+            err = AVERROR(EINVAL);
+            goto fail;
+        }
+
+        f->layout[i] = image_create_info.initialLayout;
+        f->access[i] = 0x0;
+    }
+
+    /* Create semaphore */
+    ret = vkCreateSemaphore(hwctx->act_dev, &sem_spawn,
+                            hwctx->alloc, &f->sem);
+    if (ret != VK_SUCCESS) {
+        av_log(hwctx, AV_LOG_ERROR, "Failed to create semaphore: %s\n",
+               vk_ret2str(ret));
+        return AVERROR_EXTERNAL;
+    }
+
+    f->flags     = 0x0;
+    f->tiling    = tiling;
+
+    *frame = f;
+    return 0;
+
+fail:
+    vulkan_frame_free(hwfc, (uint8_t *)f);
+    return err;
+}
+
+/* Checks if an export flag is enabled, and if it is ORs it with *iexp */
+static void try_export_flags(AVHWFramesContext *hwfc,
+                             VkExternalMemoryHandleTypeFlags *comp_handle_types,
+                             VkExternalMemoryHandleTypeFlagBits *iexp,
+                             VkExternalMemoryHandleTypeFlagBits exp)
+{
+    VkResult ret;
+    AVVulkanFramesContext *hwctx = hwfc->hwctx;
+    AVVulkanDeviceContext *dev_hwctx = hwfc->device_ctx->hwctx;
+    VkExternalImageFormatProperties eprops = {
+        .sType = VK_STRUCTURE_TYPE_EXTERNAL_IMAGE_FORMAT_PROPERTIES_KHR,
+    };
+    VkImageFormatProperties2 props = {
+        .sType = VK_STRUCTURE_TYPE_IMAGE_FORMAT_PROPERTIES_2,
+        .pNext = &eprops,
+    };
+    VkPhysicalDeviceExternalImageFormatInfo enext = {
+        .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO,
+        .handleType = exp,
+    };
+    VkPhysicalDeviceImageFormatInfo2 pinfo = {
+        .sType  = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_FORMAT_INFO_2,
+        .pNext  = !exp ? NULL : &enext,
+        .format = av_vkfmt_from_pixfmt(hwfc->sw_format)[0],
+        .type   = VK_IMAGE_TYPE_2D,
+        .tiling = hwctx->tiling,
+        .usage  = hwctx->usage,
+        .flags  = VK_IMAGE_CREATE_ALIAS_BIT,
+    };
+
+    ret = vkGetPhysicalDeviceImageFormatProperties2(dev_hwctx->phys_dev,
+                                                    &pinfo, &props);
+    if (ret == VK_SUCCESS) {
+        *iexp |= exp;
+        *comp_handle_types |= eprops.externalMemoryProperties.compatibleHandleTypes;
+    }
+}
+
+static AVBufferRef *vulkan_pool_alloc(void *opaque, int size)
+{
+    int err;
+    AVVkFrame *f;
+    AVBufferRef *avbuf = NULL;
+    AVHWFramesContext *hwfc = opaque;
+    AVVulkanFramesContext *hwctx = hwfc->hwctx;
+    VulkanDevicePriv *p = hwfc->device_ctx->internal->priv;
+    VkExportMemoryAllocateInfo eminfo[AV_NUM_DATA_POINTERS];
+    VkExternalMemoryHandleTypeFlags e = 0x0;
+
+    VkExternalMemoryImageCreateInfo eiinfo = {
+        .sType       = VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO,
+        .pNext       = hwctx->create_pnext,
+    };
+
+    if (p->extensions & EXT_EXTERNAL_FD_MEMORY)
+        try_export_flags(hwfc, &eiinfo.handleTypes, &e,
+                         VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT);
+
+    if (p->extensions & EXT_EXTERNAL_DMABUF_MEMORY)
+        try_export_flags(hwfc, &eiinfo.handleTypes, &e,
+                         VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT);
+
+    for (int i = 0; i < av_pix_fmt_count_planes(hwfc->sw_format); i++) {
+        eminfo[i].sType       = VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO;
+        eminfo[i].pNext       = hwctx->alloc_pnext[i];
+        eminfo[i].handleTypes = e;
+    }
+
+    err = create_frame(hwfc, &f, hwctx->tiling, hwctx->usage,
+                       eiinfo.handleTypes ? &eiinfo : NULL);
+    if (err)
+        return NULL;
+
+    err = alloc_bind_mem(hwfc, f, eminfo, sizeof(*eminfo));
+    if (err)
+        goto fail;
+
+    err = prepare_frame(hwfc, &p->cmd, f, PREP_MODE_WRITE);
+    if (err)
+        goto fail;
+
+    avbuf = av_buffer_create((uint8_t *)f, sizeof(AVVkFrame),
+                             vulkan_frame_free, hwfc, 0);
+    if (!avbuf)
+        goto fail;
+
+    return avbuf;
+
+fail:
+    vulkan_frame_free(hwfc, (uint8_t *)f);
+    return NULL;
+}
+
+static void vulkan_frames_uninit(AVHWFramesContext *hwfc)
+{
+    VulkanFramesPriv *fp = hwfc->internal->priv;
+
+    free_exec_ctx(hwfc->device_ctx, &fp->cmd);
+}
+
+static int vulkan_frames_init(AVHWFramesContext *hwfc)
+{
+    int err;
+    AVVkFrame *f;
+    AVVulkanFramesContext *hwctx = hwfc->hwctx;
+    VulkanFramesPriv *fp = hwfc->internal->priv;
+    AVVulkanDeviceContext *dev_hwctx = hwfc->device_ctx->hwctx;
+    VulkanDevicePriv *p = hwfc->device_ctx->internal->priv;
+
+    if (hwfc->pool)
+        return 0;
+
+    /* Default pool flags */
+    hwctx->tiling = hwctx->tiling ? hwctx->tiling : p->use_linear_images ?
+                    VK_IMAGE_TILING_LINEAR : VK_IMAGE_TILING_OPTIMAL;
+
+    hwctx->usage |= DEFAULT_USAGE_FLAGS;
+
+    err = create_exec_ctx(hwfc->device_ctx, &fp->cmd,
+                          dev_hwctx->queue_family_tx_index);
+    if (err)
+        return err;
+
+    /* Test to see if allocation will fail */
+    err = create_frame(hwfc, &f, hwctx->tiling, hwctx->usage,
+                       hwctx->create_pnext);
+    if (err) {
+        free_exec_ctx(hwfc->device_ctx, &p->cmd);
+        return err;
+    }
+
+    vulkan_frame_free(hwfc, (uint8_t *)f);
+
+    hwfc->internal->pool_internal = av_buffer_pool_init2(sizeof(AVVkFrame),
+                                                         hwfc, vulkan_pool_alloc,
+                                                         NULL);
+    if (!hwfc->internal->pool_internal) {
+        free_exec_ctx(hwfc->device_ctx, &p->cmd);
+        return AVERROR(ENOMEM);
+    }
+
+    return 0;
+}
+
+static int vulkan_get_buffer(AVHWFramesContext *hwfc, AVFrame *frame)
+{
+    frame->buf[0] = av_buffer_pool_get(hwfc->pool);
+    if (!frame->buf[0])
+        return AVERROR(ENOMEM);
+
+    frame->data[0] = frame->buf[0]->data;
+    frame->format  = AV_PIX_FMT_VULKAN;
+    frame->width   = hwfc->width;
+    frame->height  = hwfc->height;
+
+    return 0;
+}
+
+static int vulkan_transfer_get_formats(AVHWFramesContext *hwfc,
+                                       enum AVHWFrameTransferDirection dir,
+                                       enum AVPixelFormat **formats)
+{
+    enum AVPixelFormat *fmts = av_malloc_array(2, sizeof(*fmts));
+    if (!fmts)
+        return AVERROR(ENOMEM);
+
+    fmts[0] = hwfc->sw_format;
+    fmts[1] = AV_PIX_FMT_NONE;
+
+    *formats = fmts;
+    return 0;
+}
+
+typedef struct VulkanMapping {
+    AVVkFrame *frame;
+    int flags;
+} VulkanMapping;
+
+static void vulkan_unmap_frame(AVHWFramesContext *hwfc, HWMapDescriptor *hwmap)
+{
+    VulkanMapping *map = hwmap->priv;
+    AVVulkanDeviceContext *hwctx = hwfc->device_ctx->hwctx;
+    const int planes = av_pix_fmt_count_planes(hwfc->sw_format);
+
+    /* Check if buffer needs flushing */
+    if ((map->flags & AV_HWFRAME_MAP_WRITE) &&
+        !(map->frame->flags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT)) {
+        VkResult ret;
+        VkMappedMemoryRange flush_ranges[AV_NUM_DATA_POINTERS] = { { 0 } };
+
+        for (int i = 0; i < planes; i++) {
+            flush_ranges[i].sType  = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
+            flush_ranges[i].memory = map->frame->mem[i];
+            flush_ranges[i].size   = VK_WHOLE_SIZE;
+        }
+
+        ret = vkFlushMappedMemoryRanges(hwctx->act_dev, planes,
+                                        flush_ranges);
+        if (ret != VK_SUCCESS) {
+            av_log(hwfc, AV_LOG_ERROR, "Failed to flush memory: %s\n",
+                   vk_ret2str(ret));
+        }
+    }
+
+    for (int i = 0; i < planes; i++)
+        vkUnmapMemory(hwctx->act_dev, map->frame->mem[i]);
+
+    av_free(map);
+}
+
+static int vulkan_map_frame_to_mem(AVHWFramesContext *hwfc, AVFrame *dst,
+                                   const AVFrame *src, int flags)
+{
+    VkResult ret;
+    int err, mapped_mem_count = 0;
+    AVVkFrame *f = (AVVkFrame *)src->data[0];
+    AVVulkanDeviceContext *hwctx = hwfc->device_ctx->hwctx;
+    const int planes = av_pix_fmt_count_planes(hwfc->sw_format);
+
+    VulkanMapping *map = av_mallocz(sizeof(VulkanMapping));
+    if (!map)
+        return AVERROR(EINVAL);
+
+    if (src->format != AV_PIX_FMT_VULKAN) {
+        av_log(hwfc, AV_LOG_ERROR, "Cannot map from pixel format %s!\n",
+               av_get_pix_fmt_name(src->format));
+        err = AVERROR(EINVAL);
+        goto fail;
+    }
+
+    if (!(f->flags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) ||
+        !(f->tiling == VK_IMAGE_TILING_LINEAR)) {
+        av_log(hwfc, AV_LOG_ERROR, "Unable to map frame, not host visible "
+               "and linear!\n");
+        err = AVERROR(EINVAL);
+        goto fail;
+    }
+
+    dst->width  = src->width;
+    dst->height = src->height;
+
+    for (int i = 0; i < planes; i++) {
+        ret = vkMapMemory(hwctx->act_dev, f->mem[i], 0,
+                          VK_WHOLE_SIZE, 0, (void **)&dst->data[i]);
+        if (ret != VK_SUCCESS) {
+            av_log(hwfc, AV_LOG_ERROR, "Failed to map image memory: %s\n",
+                vk_ret2str(ret));
+            err = AVERROR_EXTERNAL;
+            goto fail;
+        }
+        mapped_mem_count++;
+    }
+
+    /* Check if the memory contents matter */
+    if (((flags & AV_HWFRAME_MAP_READ) || !(flags & AV_HWFRAME_MAP_OVERWRITE)) &&
+        !(f->flags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT)) {
+        VkMappedMemoryRange map_mem_ranges[AV_NUM_DATA_POINTERS] = { { 0 } };
+        for (int i = 0; i < planes; i++) {
+            map_mem_ranges[i].sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
+            map_mem_ranges[i].size = VK_WHOLE_SIZE;
+            map_mem_ranges[i].memory = f->mem[i];
+        }
+
+        ret = vkInvalidateMappedMemoryRanges(hwctx->act_dev, planes,
+                                             map_mem_ranges);
+        if (ret != VK_SUCCESS) {
+            av_log(hwfc, AV_LOG_ERROR, "Failed to invalidate memory: %s\n",
+                   vk_ret2str(ret));
+            err = AVERROR_EXTERNAL;
+            goto fail;
+        }
+    }
+
+    for (int i = 0; i < planes; i++) {
+        VkImageSubresource sub = {
+            .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
+        };
+        VkSubresourceLayout layout;
+        vkGetImageSubresourceLayout(hwctx->act_dev, f->img[i], &sub, &layout);
+        dst->linesize[i] = layout.rowPitch;
+    }
+
+    map->frame = f;
+    map->flags = flags;
+
+    err = ff_hwframe_map_create(src->hw_frames_ctx, dst, src,
+                                &vulkan_unmap_frame, map);
+    if (err < 0)
+        goto fail;
+
+    return 0;
+
+fail:
+    for (int i = 0; i < mapped_mem_count; i++)
+        vkUnmapMemory(hwctx->act_dev, f->mem[i]);
+
+    av_free(map);
+    return err;
+}
+
+#if CONFIG_LIBDRM
+static void vulkan_unmap_from(AVHWFramesContext *hwfc, HWMapDescriptor *hwmap)
+{
+    VulkanMapping *map = hwmap->priv;
+    AVVulkanDeviceContext *hwctx = hwfc->device_ctx->hwctx;
+    const int planes = av_pix_fmt_count_planes(hwfc->sw_format);
+
+    for (int i = 0; i < planes; i++) {
+        vkDestroyImage(hwctx->act_dev, map->frame->img[i], hwctx->alloc);
+        vkFreeMemory(hwctx->act_dev, map->frame->mem[i], hwctx->alloc);
+    }
+
+    vkDestroySemaphore(hwctx->act_dev, map->frame->sem, hwctx->alloc);
+
+    av_freep(&map->frame);
+}
+
+static const struct {
+    uint32_t drm_fourcc;
+    VkFormat vk_format;
+} vulkan_drm_format_map[] = {
+    { DRM_FORMAT_R8,       VK_FORMAT_R8_UNORM       },
+    { DRM_FORMAT_R16,      VK_FORMAT_R16_UNORM      },
+    { DRM_FORMAT_GR88,     VK_FORMAT_R8G8_UNORM     },
+    { DRM_FORMAT_RG88,     VK_FORMAT_R8G8_UNORM     },
+    { DRM_FORMAT_GR1616,   VK_FORMAT_R16G16_UNORM   },
+    { DRM_FORMAT_RG1616,   VK_FORMAT_R16G16_UNORM   },
+    { DRM_FORMAT_ARGB8888, VK_FORMAT_B8G8R8A8_UNORM },
+    { DRM_FORMAT_XRGB8888, VK_FORMAT_B8G8R8A8_UNORM },
+    { DRM_FORMAT_ABGR8888, VK_FORMAT_R8G8B8A8_UNORM },
+    { DRM_FORMAT_XBGR8888, VK_FORMAT_R8G8B8A8_UNORM },
+};
+
+static inline VkFormat drm_to_vulkan_fmt(uint32_t drm_fourcc)
+{
+    for (int i = 0; i < FF_ARRAY_ELEMS(vulkan_drm_format_map); i++)
+        if (vulkan_drm_format_map[i].drm_fourcc == drm_fourcc)
+            return vulkan_drm_format_map[i].vk_format;
+    return VK_FORMAT_UNDEFINED;
+}
+
+static int vulkan_map_from_drm_frame_desc(AVHWFramesContext *hwfc, AVVkFrame **frame,
+                                          AVDRMFrameDescriptor *desc)
+{
+    int err = 0;
+    VkResult ret;
+    AVVkFrame *f;
+    int bind_counts = 0;
+    AVHWDeviceContext *ctx = hwfc->device_ctx;
+    AVVulkanDeviceContext *hwctx = ctx->hwctx;
+    VulkanDevicePriv *p = ctx->internal->priv;
+    const AVPixFmtDescriptor *fmt_desc = av_pix_fmt_desc_get(hwfc->sw_format);
+    const int has_modifiers = p->extensions & EXT_DRM_MODIFIER_FLAGS;
+    VkSubresourceLayout plane_data[AV_NUM_DATA_POINTERS] = { 0 };
+    VkBindImageMemoryInfo bind_info[AV_NUM_DATA_POINTERS] = { 0 };
+    VkBindImagePlaneMemoryInfo plane_info[AV_NUM_DATA_POINTERS] = { 0 };
+    VkExternalMemoryHandleTypeFlagBits htype = VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT;
+    VkSemaphoreCreateInfo sem_spawn = {
+        .sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO,
+    };
+
+    VK_LOAD_PFN(hwctx->inst, vkGetMemoryFdPropertiesKHR);
+
+    for (int i = 0; i < desc->nb_layers; i++) {
+        if (drm_to_vulkan_fmt(desc->layers[i].format) == VK_FORMAT_UNDEFINED) {
+            av_log(ctx, AV_LOG_ERROR, "Unsupported DMABUF layer format %#08x!\n",
+                   desc->layers[i].format);
+            return AVERROR(EINVAL);
+        }
+    }
+
+    if (!(f = av_vk_frame_alloc())) {
+        av_log(ctx, AV_LOG_ERROR, "Unable to allocate memory for AVVkFrame!\n");
+        err = AVERROR(ENOMEM);
+        goto fail;
+    }
+
+    for (int i = 0; i < desc->nb_objects; i++) {
+        VkMemoryFdPropertiesKHR fdmp = {
+            .sType = VK_STRUCTURE_TYPE_MEMORY_FD_PROPERTIES_KHR,
+        };
+        VkMemoryRequirements req = {
+            .size = desc->objects[i].size,
+        };
+        VkImportMemoryFdInfoKHR idesc = {
+            .sType      = VK_STRUCTURE_TYPE_IMPORT_MEMORY_FD_INFO_KHR,
+            .handleType = htype,
+            .fd         = dup(desc->objects[i].fd),
+        };
+
+        ret = pfn_vkGetMemoryFdPropertiesKHR(hwctx->act_dev, htype,
+                                             idesc.fd, &fdmp);
+        if (ret != VK_SUCCESS) {
+            av_log(hwfc, AV_LOG_ERROR, "Failed to get FD properties: %s\n",
+                   vk_ret2str(ret));
+            err = AVERROR_EXTERNAL;
+            close(idesc.fd);
+            goto fail;
+        }
+
+        req.memoryTypeBits = fdmp.memoryTypeBits;
+
+        err = alloc_mem(ctx, &req, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
+                        &idesc, &f->flags, &f->mem[i]);
+        if (err) {
+            close(idesc.fd);
+            return err;
+        }
+
+        f->size[i] = desc->objects[i].size;
+    }
+
+    f->tiling = has_modifiers ? VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT :
+                desc->objects[0].format_modifier == DRM_FORMAT_MOD_LINEAR ?
+                VK_IMAGE_TILING_LINEAR : VK_IMAGE_TILING_OPTIMAL;
+
+    for (int i = 0; i < desc->nb_layers; i++) {
+        const int planes = desc->layers[i].nb_planes;
+        const int signal_p = has_modifiers && (planes > 1);
+
+        VkImageDrmFormatModifierExplicitCreateInfoEXT drm_info = {
+            .sType = VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_EXPLICIT_CREATE_INFO_EXT,
+            .drmFormatModifier = desc->objects[0].format_modifier,
+            .drmFormatModifierPlaneCount = planes,
+            .pPlaneLayouts = (const VkSubresourceLayout *)&plane_data,
+        };
+
+        VkExternalMemoryImageCreateInfo einfo = {
+            .sType       = VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO,
+            .pNext       = has_modifiers ? &drm_info : NULL,
+            .handleTypes = htype,
+        };
+
+        const int p_w = i > 0 ? AV_CEIL_RSHIFT(hwfc->width, fmt_desc->log2_chroma_w) : hwfc->width;
+        const int p_h = i > 0 ? AV_CEIL_RSHIFT(hwfc->height, fmt_desc->log2_chroma_h) : hwfc->height;
+
+        VkImageCreateInfo image_create_info = {
+            .sType         = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
+            .pNext         = &einfo,
+            .imageType     = VK_IMAGE_TYPE_2D,
+            .format        = drm_to_vulkan_fmt(desc->layers[i].format),
+            .extent.width  = p_w,
+            .extent.height = p_h,
+            .extent.depth  = 1,
+            .mipLevels     = 1,
+            .arrayLayers   = 1,
+            .flags         = VK_IMAGE_CREATE_ALIAS_BIT |
+                             (signal_p ? VK_IMAGE_CREATE_DISJOINT_BIT : 0x0),
+            .tiling        = f->tiling,
+            .initialLayout = VK_IMAGE_LAYOUT_UNDEFINED, /* specs say so */
+            .usage         = DEFAULT_USAGE_FLAGS,
+            .sharingMode   = VK_SHARING_MODE_EXCLUSIVE,
+            .samples       = VK_SAMPLE_COUNT_1_BIT,
+        };
+
+        for (int j = 0; j < planes; j++) {
+            plane_data[j].offset     = desc->layers[i].planes[j].offset;
+            plane_data[j].rowPitch   = desc->layers[i].planes[j].pitch;
+            plane_data[j].size       = 0; /* The specs say so for all 3 */
+            plane_data[j].arrayPitch = 0;
+            plane_data[j].depthPitch = 0;
+        }
+
+        /* Create image */
+        ret = vkCreateImage(hwctx->act_dev, &image_create_info,
+                            hwctx->alloc, &f->img[i]);
+        if (ret != VK_SUCCESS) {
+            av_log(ctx, AV_LOG_ERROR, "Image creation failure: %s\n",
+                   vk_ret2str(ret));
+            err = AVERROR(EINVAL);
+            goto fail;
+        }
+
+        f->layout[i] = image_create_info.initialLayout;
+        f->access[i] = 0x0;
+
+        for (int j = 0; j < planes; j++) {
+            VkImageAspectFlagBits aspect = j == 0 ? VK_IMAGE_ASPECT_MEMORY_PLANE_0_BIT_EXT :
+                                           j == 1 ? VK_IMAGE_ASPECT_MEMORY_PLANE_1_BIT_EXT :
+                                                    VK_IMAGE_ASPECT_MEMORY_PLANE_2_BIT_EXT;
+
+            plane_info[bind_counts].sType = VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO;
+            plane_info[bind_counts].planeAspect = aspect;
+
+            bind_info[bind_counts].sType  = VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO;
+            bind_info[bind_counts].pNext  = signal_p ? &plane_info[bind_counts] : NULL;
+            bind_info[bind_counts].image  = f->img[i];
+            bind_info[bind_counts].memory = f->mem[desc->layers[i].planes[j].object_index];
+            bind_info[bind_counts].memoryOffset = desc->layers[i].planes[j].offset;
+            bind_counts++;
+        }
+    }
+
+    ret = vkCreateSemaphore(hwctx->act_dev, &sem_spawn,
+                            hwctx->alloc, &f->sem);
+    if (ret != VK_SUCCESS) {
+        av_log(hwctx, AV_LOG_ERROR, "Failed to create semaphore: %s\n",
+               vk_ret2str(ret));
+        return AVERROR_EXTERNAL;
+    }
+
+    /* We'd import a semaphore onto the one we created using
+     * vkImportSemaphoreFdKHR but unfortunately neither DRM nor VAAPI
+     * offer us anything we could import and sync with, so instead
+     * just signal the semaphore we created. */
+
+    /* Bind the allocated memory to the images */
+    ret = vkBindImageMemory2(hwctx->act_dev, bind_counts, bind_info);
+    if (ret != VK_SUCCESS) {
+        av_log(ctx, AV_LOG_ERROR, "Failed to bind memory: %s\n",
+               vk_ret2str(ret));
+        return AVERROR_EXTERNAL;
+    }
+
+    /* NOTE: This is completely uneccesary and unneeded once we can import
+     * semaphores from DRM. Otherwise we have to activate the semaphores.
+     * We're reusing the exec context that's also used for uploads/downloads. */
+    err = prepare_frame(hwfc, &p->cmd, f, PREP_MODE_RO_SHADER);
+    if (err)
+        goto fail;
+
+    *frame = f;
+
+    return 0;
+
+fail:
+    for (int i = 0; i < desc->nb_layers; i++)
+        vkDestroyImage(hwctx->act_dev, f->img[i], hwctx->alloc);
+    for (int i = 0; i < desc->nb_objects; i++)
+        vkFreeMemory(hwctx->act_dev, f->mem[i], hwctx->alloc);
+    vkDestroySemaphore(hwctx->act_dev, f->sem, hwctx->alloc);
+
+    av_free(f);
+
+    return err;
+}
+
+static int vulkan_map_from_drm(AVHWFramesContext *hwfc, AVFrame *dst,
+                               const AVFrame *src, int flags)
+{
+    int err = 0;
+    AVVkFrame *f;
+    VulkanMapping *map = NULL;
+
+    err = vulkan_map_from_drm_frame_desc(hwfc, &f,
+                                         (AVDRMFrameDescriptor *)src->data[0]);
+    if (err)
+        return err;
+
+    /* The unmapping function will free this */
+    dst->data[0] = (uint8_t *)f;
+    dst->width   = src->width;
+    dst->height  = src->height;
+
+    map = av_mallocz(sizeof(VulkanMapping));
+    if (!map)
+        goto fail;
+
+    map->frame = f;
+    map->flags = flags;
+
+    err = ff_hwframe_map_create(dst->hw_frames_ctx, dst, src,
+                                &vulkan_unmap_from, map);
+    if (err < 0)
+        goto fail;
+
+    av_log(hwfc, AV_LOG_DEBUG, "Mapped DRM object to Vulkan!\n");
+
+    return 0;
+
+fail:
+    vulkan_frame_free(hwfc->device_ctx->hwctx, (uint8_t *)f);
+    av_free(map);
+    return err;
+}
+
+#if CONFIG_VAAPI
+static int vulkan_map_from_vaapi(AVHWFramesContext *dst_fc,
+                                 AVFrame *dst, const AVFrame *src,
+                                 int flags)
+{
+    int err;
+    AVFrame *tmp = av_frame_alloc();
+    AVHWFramesContext *vaapi_fc = (AVHWFramesContext*)src->hw_frames_ctx->data;
+    AVVAAPIDeviceContext *vaapi_ctx = vaapi_fc->device_ctx->hwctx;
+    VASurfaceID surface_id = (VASurfaceID)(uintptr_t)src->data[3];
+
+    if (!tmp)
+        return AVERROR(ENOMEM);
+
+    /* We have to sync since like the previous comment said, no semaphores */
+    vaSyncSurface(vaapi_ctx->display, surface_id);
+
+    tmp->format = AV_PIX_FMT_DRM_PRIME;
+
+    err = av_hwframe_map(tmp, src, flags);
+    if (err < 0)
+        goto fail;
+
+    err = vulkan_map_from_drm(dst_fc, dst, tmp, flags);
+    if (err < 0)
+        goto fail;
+
+    err = ff_hwframe_map_replace(dst, src);
+
+fail:
+    av_frame_free(&tmp);
+    return err;
+}
+#endif
+#endif
+
+#if CONFIG_CUDA
+static int vulkan_export_to_cuda(AVHWFramesContext *hwfc,
+                                 AVBufferRef *cuda_hwfc,
+                                 const AVFrame *frame)
+{
+    int err;
+    VkResult ret;
+    AVVkFrame *dst_f;
+    AVVkFrameInternal *dst_int;
+    AVHWDeviceContext *ctx = hwfc->device_ctx;
+    AVVulkanDeviceContext *hwctx = ctx->hwctx;
+    const int planes = av_pix_fmt_count_planes(hwfc->sw_format);
+    const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(hwfc->sw_format);
+    VK_LOAD_PFN(hwctx->inst, vkGetMemoryFdKHR);
+    VK_LOAD_PFN(hwctx->inst, vkGetSemaphoreFdKHR);
+
+    AVHWFramesContext *cuda_fc = (AVHWFramesContext*)cuda_hwfc->data;
+    AVHWDeviceContext *cuda_cu = cuda_fc->device_ctx;
+    AVCUDADeviceContext *cuda_dev = cuda_cu->hwctx;
+    AVCUDADeviceContextInternal *cu_internal = cuda_dev->internal;
+    CudaFunctions *cu = cu_internal->cuda_dl;
+    CUarray_format cufmt = desc->comp[0].depth > 8 ? CU_AD_FORMAT_UNSIGNED_INT16 :
+                                                     CU_AD_FORMAT_UNSIGNED_INT8;
+
+    dst_f = (AVVkFrame *)frame->data[0];
+
+    dst_int = dst_f->internal;
+    if (!dst_int || !dst_int->cuda_fc_ref) {
+        VkSemaphoreGetFdInfoKHR sem_export = {
+            .sType = VK_STRUCTURE_TYPE_SEMAPHORE_GET_FD_INFO_KHR,
+            .semaphore = dst_f->sem,
+            .handleType = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT,
+        };
+        CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC ext_sem_desc = {
+            .type = CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD,
+        };
+
+        if (!dst_f->internal)
+            dst_f->internal = dst_int = av_mallocz(sizeof(*dst_f->internal));
+
+        if (!dst_int) {
+            err = AVERROR(ENOMEM);
+            goto fail;
+        }
+
+        dst_int->cuda_fc_ref = av_buffer_ref(cuda_hwfc);
+        if (!dst_int->cuda_fc_ref) {
+            err = AVERROR(ENOMEM);
+            goto fail;
+        }
+
+        for (int i = 0; i < planes; i++) {
+            CUDA_EXTERNAL_MEMORY_MIPMAPPED_ARRAY_DESC tex_desc = {
+                .offset = 0,
+                .arrayDesc = {
+                    .Width  = i > 0 ? AV_CEIL_RSHIFT(hwfc->width, desc->log2_chroma_w)
+                                    : hwfc->width,
+                    .Height = i > 0 ? AV_CEIL_RSHIFT(hwfc->height, desc->log2_chroma_h)
+                                    : hwfc->height,
+                    .Depth = 0,
+                    .Format = cufmt,
+                    .NumChannels = 1 + ((planes == 2) && i),
+                    .Flags = 0,
+                },
+                .numLevels = 1,
+            };
+            CUDA_EXTERNAL_MEMORY_HANDLE_DESC ext_desc = {
+                .type = CU_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD,
+                .size = dst_f->size[i],
+            };
+            VkMemoryGetFdInfoKHR export_info = {
+                .sType      = VK_STRUCTURE_TYPE_MEMORY_GET_FD_INFO_KHR,
+                .memory     = dst_f->mem[i],
+                .handleType = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT_KHR,
+            };
+
+            ret = pfn_vkGetMemoryFdKHR(hwctx->act_dev, &export_info,
+                                       &ext_desc.handle.fd);
+            if (ret != VK_SUCCESS) {
+                av_log(hwfc, AV_LOG_ERROR, "Unable to export the image as a FD!\n");
+                err = AVERROR_EXTERNAL;
+                goto fail;
+            }
+
+            ret = CHECK_CU(cu->cuImportExternalMemory(&dst_int->ext_mem[i], &ext_desc));
+            if (ret < 0) {
+                err = AVERROR_EXTERNAL;
+                goto fail;
+            }
+
+            ret = CHECK_CU(cu->cuExternalMemoryGetMappedMipmappedArray(&dst_int->cu_mma[i],
+                                                                       dst_int->ext_mem[i],
+                                                                       &tex_desc));
+            if (ret < 0) {
+                err = AVERROR_EXTERNAL;
+                goto fail;
+            }
+
+            ret = CHECK_CU(cu->cuMipmappedArrayGetLevel(&dst_int->cu_array[i],
+                                                        dst_int->cu_mma[i], 0));
+            if (ret < 0) {
+                err = AVERROR_EXTERNAL;
+                goto fail;
+            }
+        }
+
+        ret = pfn_vkGetSemaphoreFdKHR(hwctx->act_dev, &sem_export,
+                                      &ext_sem_desc.handle.fd);
+        if (ret != VK_SUCCESS) {
+            av_log(ctx, AV_LOG_ERROR, "Failed to export semaphore: %s\n",
+                   vk_ret2str(ret));
+            err = AVERROR_EXTERNAL;
+            goto fail;
+        }
+
+        ret = CHECK_CU(cu->cuImportExternalSemaphore(&dst_int->cu_sem,
+                                                     &ext_sem_desc));
+        if (ret < 0) {
+            err = AVERROR_EXTERNAL;
+            goto fail;
+        }
+    }
+
+    return 0;
+
+fail:
+    return err;
+}
+
+static int vulkan_transfer_data_from_cuda(AVHWFramesContext *hwfc,
+                                          AVFrame *dst, const AVFrame *src)
+{
+    int err;
+    VkResult ret;
+    CUcontext dummy;
+    AVVkFrame *dst_f;
+    AVVkFrameInternal *dst_int;
+    const int planes = av_pix_fmt_count_planes(hwfc->sw_format);
+    const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(hwfc->sw_format);
+
+    AVHWFramesContext *cuda_fc = (AVHWFramesContext*)src->hw_frames_ctx->data;
+    AVHWDeviceContext *cuda_cu = cuda_fc->device_ctx;
+    AVCUDADeviceContext *cuda_dev = cuda_cu->hwctx;
+    AVCUDADeviceContextInternal *cu_internal = cuda_dev->internal;
+    CudaFunctions *cu = cu_internal->cuda_dl;
+    CUDA_EXTERNAL_SEMAPHORE_WAIT_PARAMS s_w_par = { 0 };
+    CUDA_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS s_s_par = { 0 };
+
+    ret = CHECK_CU(cu->cuCtxPushCurrent(cuda_dev->cuda_ctx));
+    if (ret < 0) {
+        err = AVERROR_EXTERNAL;
+        goto fail;
+    }
+
+    dst_f = (AVVkFrame *)dst->data[0];
+
+    ret = vulkan_export_to_cuda(hwfc, src->hw_frames_ctx, dst);
+    if (ret < 0) {
+        goto fail;
+    }
+    dst_int = dst_f->internal;
+
+    ret = CHECK_CU(cu->cuWaitExternalSemaphoresAsync(&dst_int->cu_sem, &s_w_par,
+                                                     1, cuda_dev->stream));
+    if (ret < 0) {
+        err = AVERROR_EXTERNAL;
+        goto fail;
+    }
+
+    for (int i = 0; i < planes; i++) {
+        CUDA_MEMCPY2D cpy = {
+            .srcMemoryType = CU_MEMORYTYPE_DEVICE,
+            .srcDevice     = (CUdeviceptr)src->data[i],
+            .srcPitch      = src->linesize[i],
+            .srcY          = 0,
+
+            .dstMemoryType = CU_MEMORYTYPE_ARRAY,
+            .dstArray      = dst_int->cu_array[i],
+            .WidthInBytes  = (i > 0 ? AV_CEIL_RSHIFT(hwfc->width, desc->log2_chroma_w)
+                                    : hwfc->width) * desc->comp[i].step,
+            .Height        = i > 0 ? AV_CEIL_RSHIFT(hwfc->height, desc->log2_chroma_h)
+                                   : hwfc->height,
+        };
+
+        ret = CHECK_CU(cu->cuMemcpy2DAsync(&cpy, cuda_dev->stream));
+        if (ret < 0) {
+            err = AVERROR_EXTERNAL;
+            goto fail;
+        }
+    }
+
+    ret = CHECK_CU(cu->cuSignalExternalSemaphoresAsync(&dst_int->cu_sem, &s_s_par,
+                                                       1, cuda_dev->stream));
+    if (ret < 0) {
+        err = AVERROR_EXTERNAL;
+        goto fail;
+    }
+
+    CHECK_CU(cu->cuCtxPopCurrent(&dummy));
+
+    av_log(hwfc, AV_LOG_VERBOSE, "Transfered CUDA image to Vulkan!\n");
+
+    return 0;
+
+fail:
+    CHECK_CU(cu->cuCtxPopCurrent(&dummy));
+    vulkan_free_internal(dst_int);
+    dst_f->internal = NULL;
+    av_buffer_unref(&dst->buf[0]);
+    return err;
+}
+#endif
+
+static int vulkan_map_to(AVHWFramesContext *hwfc, AVFrame *dst,
+                         const AVFrame *src, int flags)
+{
+    av_unused VulkanDevicePriv *p = hwfc->device_ctx->internal->priv;
+
+    switch (src->format) {
+#if CONFIG_LIBDRM
+#if CONFIG_VAAPI
+    case AV_PIX_FMT_VAAPI:
+        if (p->extensions & EXT_EXTERNAL_DMABUF_MEMORY)
+            return vulkan_map_from_vaapi(hwfc, dst, src, flags);
+#endif
+    case AV_PIX_FMT_DRM_PRIME:
+        if (p->extensions & EXT_EXTERNAL_DMABUF_MEMORY)
+            return vulkan_map_from_drm(hwfc, dst, src, flags);
+#endif
+    default:
+        return AVERROR(ENOSYS);
+    }
+}
+
+#if CONFIG_LIBDRM
+typedef struct VulkanDRMMapping {
+    AVDRMFrameDescriptor drm_desc;
+    AVVkFrame *source;
+} VulkanDRMMapping;
+
+static void vulkan_unmap_to_drm(AVHWFramesContext *hwfc, HWMapDescriptor *hwmap)
+{
+    AVDRMFrameDescriptor *drm_desc = hwmap->priv;
+
+    for (int i = 0; i < drm_desc->nb_objects; i++)
+        close(drm_desc->objects[i].fd);
+
+    av_free(drm_desc);
+}
+
+static inline uint32_t vulkan_fmt_to_drm(VkFormat vkfmt)
+{
+    for (int i = 0; i < FF_ARRAY_ELEMS(vulkan_drm_format_map); i++)
+        if (vulkan_drm_format_map[i].vk_format == vkfmt)
+            return vulkan_drm_format_map[i].drm_fourcc;
+    return DRM_FORMAT_INVALID;
+}
+
+static int vulkan_map_to_drm(AVHWFramesContext *hwfc, AVFrame *dst,
+                             const AVFrame *src, int flags)
+{
+    int err = 0;
+    VkResult ret;
+    AVVkFrame *f = (AVVkFrame *)src->data[0];
+    VulkanDevicePriv *p = hwfc->device_ctx->internal->priv;
+    AVVulkanDeviceContext *hwctx = hwfc->device_ctx->hwctx;
+    const int planes = av_pix_fmt_count_planes(hwfc->sw_format);
+    VK_LOAD_PFN(hwctx->inst, vkGetMemoryFdKHR);
+    VkImageDrmFormatModifierPropertiesEXT drm_mod = {
+        .sType = VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_PROPERTIES_EXT,
+    };
+
+    AVDRMFrameDescriptor *drm_desc = av_mallocz(sizeof(*drm_desc));
+    if (!drm_desc)
+        return AVERROR(ENOMEM);
+
+    err = ff_hwframe_map_create(src->hw_frames_ctx, dst, src, &vulkan_unmap_to_drm, drm_desc);
+    if (err < 0)
+        goto end;
+
+    if (p->extensions & EXT_DRM_MODIFIER_FLAGS) {
+        VK_LOAD_PFN(hwctx->inst, vkGetImageDrmFormatModifierPropertiesEXT);
+        ret = pfn_vkGetImageDrmFormatModifierPropertiesEXT(hwctx->act_dev, f->img[0],
+                                                           &drm_mod);
+        if (ret != VK_SUCCESS) {
+            av_log(hwfc, AV_LOG_ERROR, "Failed to retrieve DRM format modifier!\n");
+            err = AVERROR_EXTERNAL;
+            goto end;
+        }
+    }
+
+    for (int i = 0; (i < planes) && (f->mem[i]); i++) {
+        VkMemoryGetFdInfoKHR export_info = {
+            .sType      = VK_STRUCTURE_TYPE_MEMORY_GET_FD_INFO_KHR,
+            .memory     = f->mem[i],
+            .handleType = VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT,
+        };
+
+        ret = pfn_vkGetMemoryFdKHR(hwctx->act_dev, &export_info,
+                                   &drm_desc->objects[i].fd);
+        if (ret != VK_SUCCESS) {
+            av_log(hwfc, AV_LOG_ERROR, "Unable to export the image as a FD!\n");
+            err = AVERROR_EXTERNAL;
+            goto end;
+        }
+
+        drm_desc->nb_objects++;
+        drm_desc->objects[i].size = f->size[i];
+        drm_desc->objects[i].format_modifier = drm_mod.drmFormatModifier;
+    }
+
+    drm_desc->nb_layers = planes;
+    for (int i = 0; i < drm_desc->nb_layers; i++) {
+        VkSubresourceLayout layout;
+        VkImageSubresource sub = {
+            .aspectMask = p->extensions & EXT_DRM_MODIFIER_FLAGS ?
+                          VK_IMAGE_ASPECT_MEMORY_PLANE_0_BIT_EXT :
+                          VK_IMAGE_ASPECT_COLOR_BIT,
+        };
+        VkFormat plane_vkfmt = av_vkfmt_from_pixfmt(hwfc->sw_format)[i];
+
+        drm_desc->layers[i].format    = vulkan_fmt_to_drm(plane_vkfmt);
+        drm_desc->layers[i].nb_planes = 1;
+
+        if (drm_desc->layers[i].format == DRM_FORMAT_INVALID) {
+            av_log(hwfc, AV_LOG_ERROR, "Cannot map to DRM layer, unsupported!\n");
+            err = AVERROR_PATCHWELCOME;
+            goto end;
+        }
+
+        drm_desc->layers[i].planes[0].object_index = FFMIN(i, drm_desc->nb_objects - 1);
+
+        if (f->tiling != VK_IMAGE_TILING_OPTIMAL)
+            continue;
+
+        vkGetImageSubresourceLayout(hwctx->act_dev, f->img[i], &sub, &layout);
+        drm_desc->layers[i].planes[0].offset       = layout.offset;
+        drm_desc->layers[i].planes[0].pitch        = layout.rowPitch;
+    }
+
+    dst->width   = src->width;
+    dst->height  = src->height;
+    dst->data[0] = (uint8_t *)drm_desc;
+
+    av_log(hwfc, AV_LOG_VERBOSE, "Mapped AVVkFrame to a DRM object!\n");
+
+    return 0;
+
+end:
+    av_free(drm_desc);
+    return err;
+}
+
+#if CONFIG_VAAPI
+static int vulkan_map_to_vaapi(AVHWFramesContext *hwfc, AVFrame *dst,
+                               const AVFrame *src, int flags)
+{
+    int err;
+    AVFrame *tmp = av_frame_alloc();
+    if (!tmp)
+        return AVERROR(ENOMEM);
+
+    tmp->format = AV_PIX_FMT_DRM_PRIME;
+
+    err = vulkan_map_to_drm(hwfc, tmp, src, flags);
+    if (err < 0)
+        goto fail;
+
+    err = av_hwframe_map(dst, tmp, flags);
+    if (err < 0)
+        goto fail;
+
+    err = ff_hwframe_map_replace(dst, src);
+
+fail:
+    av_frame_free(&tmp);
+    return err;
+}
+#endif
+#endif
+
+static int vulkan_map_from(AVHWFramesContext *hwfc, AVFrame *dst,
+                           const AVFrame *src, int flags)
+{
+    av_unused VulkanDevicePriv *p = hwfc->device_ctx->internal->priv;
+
+    switch (dst->format) {
+#if CONFIG_LIBDRM
+    case AV_PIX_FMT_DRM_PRIME:
+        if (p->extensions & EXT_EXTERNAL_DMABUF_MEMORY)
+            return vulkan_map_to_drm(hwfc, dst, src, flags);
+#if CONFIG_VAAPI
+    case AV_PIX_FMT_VAAPI:
+        if (p->extensions & EXT_EXTERNAL_DMABUF_MEMORY)
+            return vulkan_map_to_vaapi(hwfc, dst, src, flags);
+#endif
+#endif
+    default:
+        return vulkan_map_frame_to_mem(hwfc, dst, src, flags);
+    }
+}
+
+typedef struct ImageBuffer {
+    VkBuffer buf;
+    VkDeviceMemory mem;
+    VkMemoryPropertyFlagBits flags;
+} ImageBuffer;
+
+static void free_buf(AVHWDeviceContext *ctx, ImageBuffer *buf)
+{
+    AVVulkanDeviceContext *hwctx = ctx->hwctx;
+    if (!buf)
+        return;
+
+    vkDestroyBuffer(hwctx->act_dev, buf->buf, hwctx->alloc);
+    vkFreeMemory(hwctx->act_dev, buf->mem, hwctx->alloc);
+}
+
+static int create_buf(AVHWDeviceContext *ctx, ImageBuffer *buf, int height,
+                      int *stride, VkBufferUsageFlags usage,
+                      VkMemoryPropertyFlagBits flags, void *create_pnext,
+                      void *alloc_pnext)
+{
+    int err;
+    VkResult ret;
+    VkMemoryRequirements req;
+    AVVulkanDeviceContext *hwctx = ctx->hwctx;
+    VulkanDevicePriv *p = ctx->internal->priv;
+
+    VkBufferCreateInfo buf_spawn = {
+        .sType       = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,
+        .pNext       = create_pnext,
+        .usage       = usage,
+        .sharingMode = VK_SHARING_MODE_EXCLUSIVE,
+    };
+
+    *stride = FFALIGN(*stride, p->props.limits.optimalBufferCopyRowPitchAlignment);
+    buf_spawn.size = height*(*stride);
+
+    ret = vkCreateBuffer(hwctx->act_dev, &buf_spawn, NULL, &buf->buf);
+    if (ret != VK_SUCCESS) {
+        av_log(ctx, AV_LOG_ERROR, "Failed to create buffer: %s\n",
+               vk_ret2str(ret));
+        return AVERROR_EXTERNAL;
+    }
+
+    vkGetBufferMemoryRequirements(hwctx->act_dev, buf->buf, &req);
+
+    err = alloc_mem(ctx, &req, flags, alloc_pnext, &buf->flags, &buf->mem);
+    if (err)
+        return err;
+
+    ret = vkBindBufferMemory(hwctx->act_dev, buf->buf, buf->mem, 0);
+    if (ret != VK_SUCCESS) {
+        av_log(ctx, AV_LOG_ERROR, "Failed to bind memory to buffer: %s\n",
+               vk_ret2str(ret));
+        free_buf(ctx, buf);
+        return AVERROR_EXTERNAL;
+    }
+
+    return 0;
+}
+
+static int map_buffers(AVHWDeviceContext *ctx, ImageBuffer *buf, uint8_t *mem[],
+                       int nb_buffers, int invalidate)
+{
+    VkResult ret;
+    AVVulkanDeviceContext *hwctx = ctx->hwctx;
+    VkMappedMemoryRange invalidate_ctx[AV_NUM_DATA_POINTERS];
+    int invalidate_count = 0;
+
+    for (int i = 0; i < nb_buffers; i++) {
+        ret = vkMapMemory(hwctx->act_dev, buf[i].mem, 0,
+                          VK_WHOLE_SIZE, 0, (void **)&mem[i]);
+        if (ret != VK_SUCCESS) {
+            av_log(ctx, AV_LOG_ERROR, "Failed to map buffer memory: %s\n",
+                   vk_ret2str(ret));
+            return AVERROR_EXTERNAL;
+        }
+    }
+
+    if (!invalidate)
+        return 0;
+
+    for (int i = 0; i < nb_buffers; i++) {
+        const VkMappedMemoryRange ival_buf = {
+            .sType  = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE,
+            .memory = buf[i].mem,
+            .size   = VK_WHOLE_SIZE,
+        };
+        if (buf[i].flags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT)
+            continue;
+        invalidate_ctx[invalidate_count++] = ival_buf;
+    }
+
+    if (invalidate_count) {
+        ret = vkInvalidateMappedMemoryRanges(hwctx->act_dev, invalidate_count,
+                                             invalidate_ctx);
+        if (ret != VK_SUCCESS)
+            av_log(ctx, AV_LOG_WARNING, "Failed to invalidate memory: %s\n",
+                   vk_ret2str(ret));
+    }
+
+    return 0;
+}
+
+static int unmap_buffers(AVHWDeviceContext *ctx, ImageBuffer *buf,
+                         int nb_buffers, int flush)
+{
+    int err = 0;
+    VkResult ret;
+    AVVulkanDeviceContext *hwctx = ctx->hwctx;
+    VkMappedMemoryRange flush_ctx[AV_NUM_DATA_POINTERS];
+    int flush_count = 0;
+
+    if (flush) {
+        for (int i = 0; i < nb_buffers; i++) {
+            const VkMappedMemoryRange flush_buf = {
+                .sType  = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE,
+                .memory = buf[i].mem,
+                .size   = VK_WHOLE_SIZE,
+            };
+            if (buf[i].flags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT)
+                continue;
+            flush_ctx[flush_count++] = flush_buf;
+        }
+    }
+
+    if (flush_count) {
+        ret = vkFlushMappedMemoryRanges(hwctx->act_dev, flush_count, flush_ctx);
+        if (ret != VK_SUCCESS) {
+            av_log(ctx, AV_LOG_ERROR, "Failed to flush memory: %s\n",
+                    vk_ret2str(ret));
+            err = AVERROR_EXTERNAL; /* We still want to try to unmap them */
+        }
+    }
+
+    for (int i = 0; i < nb_buffers; i++)
+        vkUnmapMemory(hwctx->act_dev, buf[i].mem);
+
+    return err;
+}
+
+static int transfer_image_buf(AVHWDeviceContext *ctx, AVVkFrame *frame,
+                              ImageBuffer *buffer, const int *buf_stride, int w,
+                              int h, enum AVPixelFormat pix_fmt, int to_buf)
+{
+    VkResult ret;
+    AVVulkanDeviceContext *hwctx = ctx->hwctx;
+    VulkanDevicePriv *s = ctx->internal->priv;
+
+    int bar_num = 0;
+    VkPipelineStageFlagBits sem_wait_dst[AV_NUM_DATA_POINTERS];
+
+    const int planes = av_pix_fmt_count_planes(pix_fmt);
+    const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
+
+    VkCommandBufferBeginInfo cmd_start = {
+        .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
+        .flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT,
+    };
+
+    VkImageMemoryBarrier img_bar[AV_NUM_DATA_POINTERS] = { 0 };
+
+    VkSubmitInfo s_info = {
+        .sType                = VK_STRUCTURE_TYPE_SUBMIT_INFO,
+        .commandBufferCount   = 1,
+        .pCommandBuffers      = &s->cmd.buf,
+        .pSignalSemaphores    = &frame->sem,
+        .pWaitSemaphores      = &frame->sem,
+        .pWaitDstStageMask    = sem_wait_dst,
+        .signalSemaphoreCount = 1,
+        .waitSemaphoreCount   = 1,
+    };
+
+    ret = vkBeginCommandBuffer(s->cmd.buf, &cmd_start);
+    if (ret != VK_SUCCESS) {
+        av_log(ctx, AV_LOG_ERROR, "Unable to init command buffer: %s\n",
+               vk_ret2str(ret));
+        return AVERROR_EXTERNAL;
+    }
+
+    /* Change the image layout to something more optimal for transfers */
+    for (int i = 0; i < planes; i++) {
+        VkImageLayout new_layout = to_buf ? VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL :
+                                            VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
+        VkAccessFlags new_access = to_buf ? VK_ACCESS_TRANSFER_READ_BIT :
+                                            VK_ACCESS_TRANSFER_WRITE_BIT;
+
+        sem_wait_dst[i] = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT;
+
+        /* If the layout matches and we have read access skip the barrier */
+        if ((frame->layout[i] == new_layout) && (frame->access[i] & new_access))
+            continue;
+
+        img_bar[bar_num].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
+        img_bar[bar_num].srcAccessMask = 0x0;
+        img_bar[bar_num].dstAccessMask = new_access;
+        img_bar[bar_num].oldLayout = frame->layout[i];
+        img_bar[bar_num].newLayout = new_layout;
+        img_bar[bar_num].srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
+        img_bar[bar_num].dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
+        img_bar[bar_num].image = frame->img[i];
+        img_bar[bar_num].subresourceRange.levelCount = 1;
+        img_bar[bar_num].subresourceRange.layerCount = 1;
+        img_bar[bar_num].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
+
+        frame->layout[i] = img_bar[bar_num].newLayout;
+        frame->access[i] = img_bar[bar_num].dstAccessMask;
+
+        bar_num++;
+    }
+
+    if (bar_num)
+        vkCmdPipelineBarrier(s->cmd.buf, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
+                             VK_PIPELINE_STAGE_TRANSFER_BIT, 0,
+                             0, NULL, 0, NULL, bar_num, img_bar);
+
+    /* Schedule a copy for each plane */
+    for (int i = 0; i < planes; i++) {
+        const int p_w = i > 0 ? AV_CEIL_RSHIFT(w, desc->log2_chroma_w) : w;
+        const int p_h = i > 0 ? AV_CEIL_RSHIFT(h, desc->log2_chroma_h) : h;
+        VkBufferImageCopy buf_reg = {
+            .bufferOffset = 0,
+            /* Buffer stride isn't in bytes, it's in samples, the implementation
+             * uses the image's VkFormat to know how many bytes per sample
+             * the buffer has. So we have to convert by dividing. Stupid.
+             * Won't work with YUVA or other planar formats with alpha. */
+            .bufferRowLength = buf_stride[i] / desc->comp[i].step,
+            .bufferImageHeight = p_h,
+            .imageSubresource.layerCount = 1,
+            .imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
+            .imageOffset = { 0, 0, 0, },
+            .imageExtent = { p_w, p_h, 1, },
+        };
+
+        if (to_buf)
+            vkCmdCopyImageToBuffer(s->cmd.buf, frame->img[i], frame->layout[i],
+                                   buffer[i].buf, 1, &buf_reg);
+        else
+            vkCmdCopyBufferToImage(s->cmd.buf, buffer[i].buf, frame->img[i],
+                                   frame->layout[i], 1, &buf_reg);
+    }
+
+    ret = vkEndCommandBuffer(s->cmd.buf);
+    if (ret != VK_SUCCESS) {
+        av_log(ctx, AV_LOG_ERROR, "Unable to finish command buffer: %s\n",
+               vk_ret2str(ret));
+        return AVERROR_EXTERNAL;
+    }
+
+    /* Wait for the download/upload to finish if uploading, otherwise the
+     * semaphore will take care of synchronization when uploading */
+    ret = vkQueueSubmit(s->cmd.queue, 1, &s_info, s->cmd.fence);
+    if (ret != VK_SUCCESS) {
+        av_log(ctx, AV_LOG_ERROR, "Unable to submit command buffer: %s\n",
+               vk_ret2str(ret));
+        return AVERROR_EXTERNAL;
+    } else {
+        vkWaitForFences(hwctx->act_dev, 1, &s->cmd.fence, VK_TRUE, UINT64_MAX);
+        vkResetFences(hwctx->act_dev, 1, &s->cmd.fence);
+    }
+
+    return 0;
+}
+
+/* Technically we can use VK_EXT_external_memory_host to upload and download,
+ * however the alignment requirements make this unfeasible as both the pointer
+ * and the size of each plane need to be aligned to the minimum alignment
+ * requirement, which on all current implementations (anv, radv) is 4096.
+ * If the requirement gets relaxed (unlikely) this can easily be implemented. */
+static int vulkan_transfer_data_from_mem(AVHWFramesContext *hwfc, AVFrame *dst,
+                                         const AVFrame *src)
+{
+    int err = 0;
+    AVFrame tmp;
+    AVVkFrame *f = (AVVkFrame *)dst->data[0];
+    AVHWDeviceContext *dev_ctx = hwfc->device_ctx;
+    ImageBuffer buf[AV_NUM_DATA_POINTERS] = { { 0 } };
+    const int planes = av_pix_fmt_count_planes(src->format);
+    int log2_chroma = av_pix_fmt_desc_get(src->format)->log2_chroma_h;
+
+    if ((src->format != AV_PIX_FMT_NONE && !av_vkfmt_from_pixfmt(src->format))) {
+        av_log(hwfc, AV_LOG_ERROR, "Unsupported source pixel format!\n");
+        return AVERROR(EINVAL);
+    }
+
+    if (src->width > hwfc->width || src->height > hwfc->height)
+        return AVERROR(EINVAL);
+
+    /* For linear, host visiable images */
+    if (f->tiling == VK_IMAGE_TILING_LINEAR &&
+        f->flags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) {
+        AVFrame *map = av_frame_alloc();
+        if (!map)
+            return AVERROR(ENOMEM);
+        map->format = src->format;
+
+        err = vulkan_map_frame_to_mem(hwfc, map, dst, AV_HWFRAME_MAP_WRITE);
+        if (err)
+            goto end;
+
+        err = av_frame_copy(map, src);
+        av_frame_free(&map);
+        goto end;
+    }
+
+    /* Create buffers */
+    for (int i = 0; i < planes; i++) {
+        int h = src->height;
+        int p_height = i > 0 ? AV_CEIL_RSHIFT(h, log2_chroma) : h;
+
+        tmp.linesize[i] = FFABS(src->linesize[i]);
+        err = create_buf(dev_ctx, &buf[i], p_height,
+                         &tmp.linesize[i], VK_BUFFER_USAGE_TRANSFER_SRC_BIT,
+                         VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT, NULL, NULL);
+        if (err)
+            goto end;
+    }
+
+    /* Map, copy image to buffer, unmap */
+    if ((err = map_buffers(dev_ctx, buf, tmp.data, planes, 0)))
+        goto end;
+
+    av_image_copy(tmp.data, tmp.linesize, (const uint8_t **)src->data,
+                  src->linesize, src->format, src->width, src->height);
+
+    if ((err = unmap_buffers(dev_ctx, buf, planes, 1)))
+        goto end;
+
+    /* Copy buffers to image */
+    err = transfer_image_buf(dev_ctx, f, buf, tmp.linesize,
+                             src->width, src->height, src->format, 0);
+
+end:
+    for (int i = 0; i < planes; i++)
+        free_buf(dev_ctx, &buf[i]);
+
+    return err;
+}
+
+static int vulkan_transfer_data_to(AVHWFramesContext *hwfc, AVFrame *dst,
+                                        const AVFrame *src)
+{
+    av_unused VulkanDevicePriv *p = hwfc->device_ctx->internal->priv;
+
+    switch (src->format) {
+#if CONFIG_CUDA
+    case AV_PIX_FMT_CUDA:
+        if ((p->extensions & EXT_EXTERNAL_FD_MEMORY) &&
+            (p->extensions & EXT_EXTERNAL_FD_SEM))
+            return vulkan_transfer_data_from_cuda(hwfc, dst, src);
+#endif
+    default:
+        if (src->hw_frames_ctx)
+            return AVERROR(ENOSYS);
+        else
+            return vulkan_transfer_data_from_mem(hwfc, dst, src);
+    }
+}
+
+#if CONFIG_CUDA
+static int vulkan_transfer_data_to_cuda(AVHWFramesContext *hwfc, AVFrame *dst,
+                                      const AVFrame *src)
+{
+    int err;
+    VkResult ret;
+    CUcontext dummy;
+    AVVkFrame *dst_f;
+    AVVkFrameInternal *dst_int;
+    const int planes = av_pix_fmt_count_planes(hwfc->sw_format);
+    const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(hwfc->sw_format);
+
+    AVHWFramesContext *cuda_fc = (AVHWFramesContext*)dst->hw_frames_ctx->data;
+    AVHWDeviceContext *cuda_cu = cuda_fc->device_ctx;
+    AVCUDADeviceContext *cuda_dev = cuda_cu->hwctx;
+    AVCUDADeviceContextInternal *cu_internal = cuda_dev->internal;
+    CudaFunctions *cu = cu_internal->cuda_dl;
+
+    ret = CHECK_CU(cu->cuCtxPushCurrent(cuda_dev->cuda_ctx));
+    if (ret < 0) {
+        err = AVERROR_EXTERNAL;
+        goto fail;
+    }
+
+    dst_f = (AVVkFrame *)src->data[0];
+
+    err = vulkan_export_to_cuda(hwfc, dst->hw_frames_ctx, src);
+    if (err < 0) {
+        goto fail;
+    }
+
+    dst_int = dst_f->internal;
+
+    for (int i = 0; i < planes; i++) {
+        CUDA_MEMCPY2D cpy = {
+            .dstMemoryType = CU_MEMORYTYPE_DEVICE,
+            .dstDevice     = (CUdeviceptr)dst->data[i],
+            .dstPitch      = dst->linesize[i],
+            .dstY          = 0,
+
+            .srcMemoryType = CU_MEMORYTYPE_ARRAY,
+            .srcArray      = dst_int->cu_array[i],
+            .WidthInBytes  = (i > 0 ? AV_CEIL_RSHIFT(hwfc->width, desc->log2_chroma_w)
+                                    : hwfc->width) * desc->comp[i].step,
+            .Height        = i > 0 ? AV_CEIL_RSHIFT(hwfc->height, desc->log2_chroma_h)
+                                   : hwfc->height,
+        };
+
+        ret = CHECK_CU(cu->cuMemcpy2DAsync(&cpy, cuda_dev->stream));
+        if (ret < 0) {
+            err = AVERROR_EXTERNAL;
+            goto fail;
+        }
+    }
+
+    CHECK_CU(cu->cuCtxPopCurrent(&dummy));
+
+    av_log(hwfc, AV_LOG_VERBOSE, "Transfered Vulkan image to CUDA!\n");
+
+    return 0;
+
+fail:
+    CHECK_CU(cu->cuCtxPopCurrent(&dummy));
+    vulkan_free_internal(dst_int);
+    dst_f->internal = NULL;
+    av_buffer_unref(&dst->buf[0]);
+    return err;
+}
+#endif
+
+static int vulkan_transfer_data_to_mem(AVHWFramesContext *hwfc, AVFrame *dst,
+                                       const AVFrame *src)
+{
+    int err = 0;
+    AVFrame tmp;
+    AVVkFrame *f = (AVVkFrame *)src->data[0];
+    AVHWDeviceContext *dev_ctx = hwfc->device_ctx;
+    ImageBuffer buf[AV_NUM_DATA_POINTERS] = { { 0 } };
+    const int planes = av_pix_fmt_count_planes(dst->format);
+    int log2_chroma = av_pix_fmt_desc_get(dst->format)->log2_chroma_h;
+
+    if (dst->width > hwfc->width || dst->height > hwfc->height)
+        return AVERROR(EINVAL);
+
+    /* For linear, host visiable images */
+    if (f->tiling == VK_IMAGE_TILING_LINEAR &&
+        f->flags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) {
+        AVFrame *map = av_frame_alloc();
+        if (!map)
+            return AVERROR(ENOMEM);
+        map->format = dst->format;
+
+        err = vulkan_map_frame_to_mem(hwfc, map, src, AV_HWFRAME_MAP_READ);
+        if (err)
+            return err;
+
+        err = av_frame_copy(dst, map);
+        av_frame_free(&map);
+        return err;
+    }
+
+    /* Create buffers */
+    for (int i = 0; i < planes; i++) {
+        int h = dst->height;
+        int p_height = i > 0 ? AV_CEIL_RSHIFT(h, log2_chroma) : h;
+
+        tmp.linesize[i] = FFABS(dst->linesize[i]);
+        err = create_buf(dev_ctx, &buf[i], p_height,
+                         &tmp.linesize[i], VK_BUFFER_USAGE_TRANSFER_DST_BIT,
+                         VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT, NULL, NULL);
+    }
+
+    /* Copy image to buffer */
+    if ((err = transfer_image_buf(dev_ctx, f, buf, tmp.linesize,
+                                  dst->width, dst->height, dst->format, 1)))
+        goto end;
+
+    /* Map, copy buffer to frame, unmap */
+    if ((err = map_buffers(dev_ctx, buf, tmp.data, planes, 1)))
+        goto end;
+
+    av_image_copy(dst->data, dst->linesize, (const uint8_t **)tmp.data,
+                  tmp.linesize, dst->format, dst->width, dst->height);
+
+    err = unmap_buffers(dev_ctx, buf, planes, 0);
+
+end:
+    for (int i = 0; i < planes; i++)
+        free_buf(dev_ctx, &buf[i]);
+
+    return err;
+}
+
+static int vulkan_transfer_data_from(AVHWFramesContext *hwfc, AVFrame *dst,
+                                     const AVFrame *src)
+{
+    av_unused VulkanDevicePriv *p = hwfc->device_ctx->internal->priv;
+
+    switch (dst->format) {
+#if CONFIG_CUDA
+    case AV_PIX_FMT_CUDA:
+        if ((p->extensions & EXT_EXTERNAL_FD_MEMORY) &&
+            (p->extensions & EXT_EXTERNAL_FD_SEM))
+            return vulkan_transfer_data_to_cuda(hwfc, dst, src);
+#endif
+    default:
+        if (dst->hw_frames_ctx)
+            return AVERROR(ENOSYS);
+        else
+            return vulkan_transfer_data_to_mem(hwfc, dst, src);
+    }
+}
+
+AVVkFrame *av_vk_frame_alloc(void)
+{
+    return av_mallocz(sizeof(AVVkFrame));
+}
+
+const HWContextType ff_hwcontext_type_vulkan = {
+    .type                   = AV_HWDEVICE_TYPE_VULKAN,
+    .name                   = "Vulkan",
+
+    .device_hwctx_size      = sizeof(AVVulkanDeviceContext),
+    .device_priv_size       = sizeof(VulkanDevicePriv),
+    .frames_hwctx_size      = sizeof(AVVulkanFramesContext),
+    .frames_priv_size       = sizeof(VulkanFramesPriv),
+
+    .device_init            = &vulkan_device_init,
+    .device_create          = &vulkan_device_create,
+    .device_derive          = &vulkan_device_derive,
+
+    .frames_get_constraints = &vulkan_frames_get_constraints,
+    .frames_init            = vulkan_frames_init,
+    .frames_get_buffer      = vulkan_get_buffer,
+    .frames_uninit          = vulkan_frames_uninit,
+
+    .transfer_get_formats   = vulkan_transfer_get_formats,
+    .transfer_data_to       = vulkan_transfer_data_to,
+    .transfer_data_from     = vulkan_transfer_data_from,
+
+    .map_to                 = vulkan_map_to,
+    .map_from               = vulkan_map_from,
+
+    .pix_fmts = (const enum AVPixelFormat []) {
+        AV_PIX_FMT_VULKAN,
+        AV_PIX_FMT_NONE
+    },
+};
diff --git a/libavutil/hwcontext_vulkan.h b/libavutil/hwcontext_vulkan.h
new file mode 100644
index 0000000..ebc2891
--- /dev/null
+++ b/libavutil/hwcontext_vulkan.h
@@ -0,0 +1,158 @@
+/*
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_HWCONTEXT_VULKAN_H
+#define AVUTIL_HWCONTEXT_VULKAN_H
+
+#include <vulkan/vulkan.h>
+
+/**
+ * @file
+ * API-specific header for AV_HWDEVICE_TYPE_VULKAN.
+ *
+ * For user-allocated pools, AVHWFramesContext.pool must return AVBufferRefs
+ * with the data pointer set to an AVVkFrame.
+ */
+
+/**
+ * Main Vulkan context, allocated as AVHWDeviceContext.hwctx.
+ * All of these can be set before init to change what the context uses
+ */
+typedef struct AVVulkanDeviceContext {
+    /**
+     * Custom memory allocator, else NULL
+     */
+    const VkAllocationCallbacks *alloc;
+    /**
+     * Instance
+     */
+    VkInstance inst;
+    /**
+     * Physical device
+     */
+    VkPhysicalDevice phys_dev;
+    /**
+     * Active device
+     */
+    VkDevice act_dev;
+    /**
+     * Queue family index for graphics
+     * @note av_hwdevice_create() will set all 3 queue indices if unset
+     * If there is no dedicated queue for compute or transfer operations,
+     * they will be set to the graphics queue index which can handle both.
+     */
+    int queue_family_index;
+    /**
+     * Queue family index for transfer ops only
+     */
+    int queue_family_tx_index;
+    /**
+     * Queue family index for compute ops
+     */
+    int queue_family_comp_index;
+} AVVulkanDeviceContext;
+
+/**
+ * Allocated as AVHWFramesContext.hwctx, used to set pool-specific options
+ */
+typedef struct AVVulkanFramesContext {
+    /**
+     * Controls the tiling of output frames.
+     */
+    VkImageTiling tiling;
+    /**
+     * Defines extra usage of output frames. This is bitwise OR'd with the
+     * standard usage flags (SAMPLED, STORAGE, TRANSFER_SRC and TRANSFER_DST).
+     */
+    VkImageUsageFlagBits usage;
+    /**
+     * Extension data for image creation. By default, if the extension is
+     * available, this will be chained to a VkImageFormatListCreateInfoKHR.
+     */
+    void *create_pnext;
+    /**
+     * Extension data for memory allocation. Must have as many entries as
+     * the number of planes of the sw_format.
+     * This will be chained to VkExportMemoryAllocateInfo, which is used
+     * to make all pool images exportable to other APIs.
+     */
+    void *alloc_pnext[AV_NUM_DATA_POINTERS];
+} AVVulkanFramesContext;
+
+/*
+ * Frame structure, the VkFormat of the image will always match
+ * the pool's sw_format.
+ * All frames, imported or allocated, will be created with the
+ * VK_IMAGE_CREATE_ALIAS_BIT flag set, so the memory may be aliased if needed.
+ *
+ * @note the size of this structure is not part of the ABI, to allocate
+ * you must use @av_vk_frame_alloc().
+ */
+typedef struct AVVkFrame {
+    /**
+     * Vulkan images to which the memory is bound to.
+     */
+    VkImage img[AV_NUM_DATA_POINTERS];
+
+    /**
+     * Same tiling must be used for all images.
+     */
+    VkImageTiling tiling;
+
+    /**
+     * Memory backing the images. Could be less than the amount of images
+     * if importing from a DRM or VAAPI frame.
+     */
+    VkDeviceMemory mem[AV_NUM_DATA_POINTERS];
+    size_t size[AV_NUM_DATA_POINTERS];
+
+    /**
+     * OR'd flags for all memory allocated
+     */
+    VkMemoryPropertyFlagBits flags;
+
+    /**
+     * Updated after every barrier
+     */
+    VkAccessFlagBits access[AV_NUM_DATA_POINTERS];
+    VkImageLayout layout[AV_NUM_DATA_POINTERS];
+
+    /**
+     * Per-frame semaphore. Must not be freed manually. Must be waited on
+     * and signalled at every queue submission.
+     */
+    VkSemaphore sem;
+
+    /**
+     * Internal data.
+     */
+    struct AVVkFrameInternal *internal;
+} AVVkFrame;
+
+/**
+ * Allocates a single AVVkFrame and initializes everything as 0.
+ * @note Must be freed via av_free()
+ */
+AVVkFrame *av_vk_frame_alloc(void);
+
+/**
+ * Returns the format of each image up to the number of planes for a given sw_format.
+ */
+const VkFormat *av_vkfmt_from_pixfmt(enum AVPixelFormat p);
+
+#endif /* AVUTIL_HWCONTEXT_VULKAN_H */
diff --git a/libavutil/imgutils.c b/libavutil/imgutils.c
index 4938a7e..7f9c1b6 100644
--- a/libavutil/imgutils.c
+++ b/libavutil/imgutils.c
@@ -311,8 +311,8 @@
 {
     if (!dst || !src)
         return;
-    av_assert0(abs(src_linesize) >= bytewidth);
-    av_assert0(abs(dst_linesize) >= bytewidth);
+    av_assert0(FFABS(src_linesize) >= bytewidth);
+    av_assert0(FFABS(dst_linesize) >= bytewidth);
     for (;height > 0; height--) {
         memcpy(dst, src, bytewidth);
         dst += dst_linesize;
@@ -501,7 +501,6 @@
 static void memset_bytes(uint8_t *dst, size_t dst_size, uint8_t *clear,
                          size_t clear_size)
 {
-    size_t pos = 0;
     int same = 1;
     int i;
 
@@ -520,29 +519,12 @@
 
     if (clear_size == 1) {
         memset(dst, clear[0], dst_size);
-        dst_size = 0;
-    } else if (clear_size == 2) {
-        uint16_t val = AV_RN16(clear);
-        for (; dst_size >= 2; dst_size -= 2) {
-            AV_WN16(dst, val);
-            dst += 2;
-        }
-    } else if (clear_size == 4) {
-        uint32_t val = AV_RN32(clear);
-        for (; dst_size >= 4; dst_size -= 4) {
-            AV_WN32(dst, val);
-            dst += 4;
-        }
-    } else if (clear_size == 8) {
-        uint32_t val = AV_RN64(clear);
-        for (; dst_size >= 8; dst_size -= 8) {
-            AV_WN64(dst, val);
-            dst += 8;
-        }
+    } else {
+        if (clear_size > dst_size)
+            clear_size = dst_size;
+        memcpy(dst, clear, clear_size);
+        av_memcpy_backptr(dst + clear_size, clear_size, dst_size - clear_size);
     }
-
-    for (; dst_size; dst_size--)
-        *dst++ = clear[pos++ % clear_size];
 }
 
 // Maximum size in bytes of a plane element (usually a pixel, or multiple pixels
diff --git a/libavutil/integer.c b/libavutil/integer.c
index 890e314..78e252f 100644
--- a/libavutil/integer.c
+++ b/libavutil/integer.c
@@ -74,7 +74,7 @@
 
         if(a.v[i])
             for(j=i; j<AV_INTEGER_SIZE && j-i<=nb; j++){
-                carry= (carry>>16) + out.v[j] + a.v[i]*b.v[j-i];
+                carry= (carry>>16) + out.v[j] + a.v[i]*(unsigned)b.v[j-i];
                 out.v[j]= carry;
             }
     }
diff --git a/libavutil/internal.h b/libavutil/internal.h
index 06bd561..4acbcf5 100644
--- a/libavutil/internal.h
+++ b/libavutil/internal.h
@@ -52,7 +52,7 @@
 #endif
 
 #ifndef emms_c
-#   define emms_c() while(0)
+#   define emms_c() do {} while(0)
 #endif
 
 #ifndef attribute_align_arg
diff --git a/libavutil/intreadwrite.h b/libavutil/intreadwrite.h
index 67c763b..4c8413a 100644
--- a/libavutil/intreadwrite.h
+++ b/libavutil/intreadwrite.h
@@ -542,6 +542,21 @@
 #   define AV_WN64A(p, v) AV_WNA(64, p, v)
 #endif
 
+#if AV_HAVE_BIGENDIAN
+#   define AV_RLA(s, p)    av_bswap##s(AV_RN##s##A(p))
+#   define AV_WLA(s, p, v) AV_WN##s##A(p, av_bswap##s(v))
+#else
+#   define AV_RLA(s, p)    AV_RN##s##A(p)
+#   define AV_WLA(s, p, v) AV_WN##s##A(p, v)
+#endif
+
+#ifndef AV_RL64A
+#   define AV_RL64A(p) AV_RLA(64, p)
+#endif
+#ifndef AV_WL64A
+#   define AV_WL64A(p, v) AV_WLA(64, p, v)
+#endif
+
 /*
  * The AV_COPYxxU macros are suitable for copying data to/from unaligned
  * memory locations.
diff --git a/libavutil/lfg.h b/libavutil/lfg.h
index 03f779a..2b66920 100644
--- a/libavutil/lfg.h
+++ b/libavutil/lfg.h
@@ -24,6 +24,12 @@
 
 #include <stdint.h>
 
+/**
+ * Context structure for the Lagged Fibonacci PRNG.
+ * The exact layout, types and content of this struct may change and should
+ * not be accessed directly. Only its sizeof() is guranteed to stay the same
+ * to allow easy instanciation.
+ */
 typedef struct AVLFG {
     unsigned int state[64];
     int index;
@@ -45,8 +51,9 @@
  * it may be good enough and faster for your specific use case.
  */
 static inline unsigned int av_lfg_get(AVLFG *c){
-    c->state[c->index & 63] = c->state[(c->index-24) & 63] + c->state[(c->index-55) & 63];
-    return c->state[c->index++ & 63];
+    unsigned a = c->state[c->index & 63] = c->state[(c->index-24) & 63] + c->state[(c->index-55) & 63];
+    c->index += 1U;
+    return a;
 }
 
 /**
@@ -57,7 +64,9 @@
 static inline unsigned int av_mlfg_get(AVLFG *c){
     unsigned int a= c->state[(c->index-55) & 63];
     unsigned int b= c->state[(c->index-24) & 63];
-    return c->state[c->index++ & 63] = 2*a*b+a+b;
+    a = c->state[c->index & 63] = 2*a*b+a+b;
+    c->index += 1U;
+    return a;
 }
 
 /**
diff --git a/libavutil/log.c b/libavutil/log.c
index 93a156b..66defa9 100644
--- a/libavutil/log.c
+++ b/libavutil/log.c
@@ -55,7 +55,7 @@
 static int flags;
 
 #define NB_LEVELS 8
-#if defined(_WIN32) && HAVE_SETCONSOLETEXTATTRIBUTE
+#if defined(_WIN32) && HAVE_SETCONSOLETEXTATTRIBUTE && HAVE_GETSTDHANDLE
 #include <windows.h>
 static const uint8_t color[16 + AV_CLASS_CATEGORY_NB] = {
     [AV_LOG_PANIC  /8] = 12,
@@ -120,50 +120,68 @@
 #endif
 static int use_color = -1;
 
+#if defined(_WIN32) && HAVE_SETCONSOLETEXTATTRIBUTE && HAVE_GETSTDHANDLE
+static void win_console_puts(const char *str)
+{
+    const uint8_t *q = str;
+    uint16_t line[LINE_SZ];
+
+    while (*q) {
+        uint16_t *buf = line;
+        DWORD nb_chars = 0;
+        DWORD written;
+
+        while (*q && nb_chars < LINE_SZ - 1) {
+            uint32_t ch;
+            uint16_t tmp;
+
+            GET_UTF8(ch, *q ? *q++ : 0, ch = 0xfffd; goto continue_on_invalid;)
+continue_on_invalid:
+            PUT_UTF16(ch, tmp, *buf++ = tmp; nb_chars++;)
+        }
+
+        WriteConsoleW(con, line, nb_chars, &written, NULL);
+    }
+}
+#endif
+
 static void check_color_terminal(void)
 {
-#if defined(_WIN32) && HAVE_SETCONSOLETEXTATTRIBUTE
+    char *term = getenv("TERM");
+
+#if defined(_WIN32) && HAVE_SETCONSOLETEXTATTRIBUTE && HAVE_GETSTDHANDLE
     CONSOLE_SCREEN_BUFFER_INFO con_info;
+    DWORD dummy;
     con = GetStdHandle(STD_ERROR_HANDLE);
-    use_color = (con != INVALID_HANDLE_VALUE) && !getenv("NO_COLOR") &&
-                !getenv("AV_LOG_FORCE_NOCOLOR");
-    if (use_color) {
+    if (con != INVALID_HANDLE_VALUE && !GetConsoleMode(con, &dummy))
+        con = INVALID_HANDLE_VALUE;
+    if (con != INVALID_HANDLE_VALUE) {
         GetConsoleScreenBufferInfo(con, &con_info);
         attr_orig  = con_info.wAttributes;
         background = attr_orig & 0xF0;
     }
-#elif HAVE_ISATTY
-    char *term = getenv("TERM");
-    use_color = !getenv("NO_COLOR") && !getenv("AV_LOG_FORCE_NOCOLOR") &&
-                (getenv("TERM") && isatty(2) || getenv("AV_LOG_FORCE_COLOR"));
-    if (   getenv("AV_LOG_FORCE_256COLOR")
-        || (term && strstr(term, "256color")))
-        use_color *= 256;
-#else
-    use_color = getenv("AV_LOG_FORCE_COLOR") && !getenv("NO_COLOR") &&
-               !getenv("AV_LOG_FORCE_NOCOLOR");
 #endif
+
+    if (getenv("AV_LOG_FORCE_NOCOLOR")) {
+        use_color = 0;
+    } else if (getenv("AV_LOG_FORCE_COLOR")) {
+        use_color = 1;
+    } else {
+#if defined(_WIN32) && HAVE_SETCONSOLETEXTATTRIBUTE && HAVE_GETSTDHANDLE
+        use_color = (con != INVALID_HANDLE_VALUE);
+#elif HAVE_ISATTY
+        use_color = (term && isatty(2));
+#else
+        use_color = 0;
+#endif
+    }
+
+    if (getenv("AV_LOG_FORCE_256COLOR") || term && strstr(term, "256color"))
+        use_color *= 256;
 }
 
-static void colored_fputs(int level, int tint, const char *str)
+static void ansi_fputs(int level, int tint, const char *str, int local_use_color)
 {
-    int local_use_color;
-    if (!*str)
-        return;
-
-    if (use_color < 0)
-        check_color_terminal();
-
-    if (level == AV_LOG_INFO/8) local_use_color = 0;
-    else                        local_use_color = use_color;
-
-#if defined(_WIN32) && HAVE_SETCONSOLETEXTATTRIBUTE
-    if (local_use_color)
-        SetConsoleTextAttribute(con, background | color[level]);
-    fputs(str, stderr);
-    if (local_use_color)
-        SetConsoleTextAttribute(con, attr_orig);
-#else
     if (local_use_color == 1) {
         fprintf(stderr,
                 "\033[%"PRIu32";3%"PRIu32"m%s\033[0m",
@@ -184,6 +202,32 @@
                 str);
     } else
         fputs(str, stderr);
+}
+
+static void colored_fputs(int level, int tint, const char *str)
+{
+    int local_use_color;
+    if (!*str)
+        return;
+
+    if (use_color < 0)
+        check_color_terminal();
+
+    if (level == AV_LOG_INFO/8) local_use_color = 0;
+    else                        local_use_color = use_color;
+
+#if defined(_WIN32) && HAVE_SETCONSOLETEXTATTRIBUTE && HAVE_GETSTDHANDLE
+    if (con != INVALID_HANDLE_VALUE) {
+        if (local_use_color)
+            SetConsoleTextAttribute(con, background | color[level]);
+        win_console_puts(str);
+        if (local_use_color)
+            SetConsoleTextAttribute(con, attr_orig);
+    } else {
+        ansi_fputs(level, tint, str, local_use_color);
+    }
+#else
+    ansi_fputs(level, tint, str, local_use_color);
 #endif
 
 }
@@ -226,6 +270,8 @@
         return "quiet";
     case AV_LOG_DEBUG:
         return "debug";
+    case AV_LOG_TRACE:
+        return "trace";
     case AV_LOG_VERBOSE:
         return "verbose";
     case AV_LOG_INFO:
@@ -360,19 +406,28 @@
 
 void av_log(void* avcl, int level, const char *fmt, ...)
 {
-    AVClass* avc = avcl ? *(AVClass **) avcl : NULL;
     va_list vl;
     va_start(vl, fmt);
-    if (avc && avc->version >= (50 << 16 | 15 << 8 | 2) &&
-        avc->log_level_offset_offset && level >= AV_LOG_FATAL)
-        level += *(int *) (((uint8_t *) avcl) + avc->log_level_offset_offset);
     av_vlog(avcl, level, fmt, vl);
     va_end(vl);
 }
 
+void av_log_once(void* avcl, int initial_level, int subsequent_level, int *state, const char *fmt, ...)
+{
+    va_list vl;
+    va_start(vl, fmt);
+    av_vlog(avcl, *state ? subsequent_level : initial_level, fmt, vl);
+    va_end(vl);
+    *state = 1;
+}
+
 void av_vlog(void* avcl, int level, const char *fmt, va_list vl)
 {
+    AVClass* avc = avcl ? *(AVClass **) avcl : NULL;
     void (*log_callback)(void*, int, const char*, va_list) = av_log_callback;
+    if (avc && avc->version >= (50 << 16 | 15 << 8 | 2) &&
+        avc->log_level_offset_offset && level >= AV_LOG_FATAL)
+        level += *(int *) (((uint8_t *) avcl) + avc->log_level_offset_offset);
     if (log_callback)
         log_callback(avcl, level, fmt, vl);
 }
@@ -412,7 +467,7 @@
            "been implemented.\n");
     if (sample)
         av_log(avc, AV_LOG_WARNING, "If you want to help, upload a sample "
-               "of this file to ftp://upload.ffmpeg.org/incoming/ "
+               "of this file to https://streams.videolan.org/upload/ "
                "and contact the ffmpeg-devel mailing list. (ffmpeg-devel@ffmpeg.org)\n");
 }
 
diff --git a/libavutil/log.h b/libavutil/log.h
index d9554e6..9c14188 100644
--- a/libavutil/log.h
+++ b/libavutil/log.h
@@ -233,6 +233,27 @@
  */
 void av_log(void *avcl, int level, const char *fmt, ...) av_printf_format(3, 4);
 
+/**
+ * Send the specified message to the log once with the initial_level and then with
+ * the subsequent_level. By default, all logging messages are sent to
+ * stderr. This behavior can be altered by setting a different logging callback
+ * function.
+ * @see av_log
+ *
+ * @param avcl A pointer to an arbitrary struct of which the first field is a
+ *        pointer to an AVClass struct or NULL if general log.
+ * @param initial_level importance level of the message expressed using a @ref
+ *        lavu_log_constants "Logging Constant" for the first occurance.
+ * @param subsequent_level importance level of the message expressed using a @ref
+ *        lavu_log_constants "Logging Constant" after the first occurance.
+ * @param fmt The format string (printf-compatible) that specifies how
+ *        subsequent arguments are converted to output.
+ * @param state a variable to keep trak of if a message has already been printed
+ *        this must be initialized to 0 before the first use. The same state
+ *        must not be accessed by 2 Threads simultaneously.
+ */
+void av_log_once(void* avcl, int initial_level, int subsequent_level, int *state, const char *fmt, ...) av_printf_format(5, 6);
+
 
 /**
  * Send the specified message to the log if the level is less than or equal
diff --git a/libavutil/mathematics.c b/libavutil/mathematics.c
index 1bf044c..0485db7 100644
--- a/libavutil/mathematics.c
+++ b/libavutil/mathematics.c
@@ -198,7 +198,7 @@
     m = inc_tb.num * (int64_t)ts_tb.den;
     d = inc_tb.den * (int64_t)ts_tb.num;
 
-    if (m % d == 0)
+    if (m % d == 0 && ts <= INT64_MAX - m / d)
         return ts + m / d;
     if (m < d)
         return ts;
@@ -206,6 +206,10 @@
     {
         int64_t old = av_rescale_q(ts, ts_tb, inc_tb);
         int64_t old_ts = av_rescale_q(old, inc_tb, ts_tb);
+
+        if (old == INT64_MAX)
+            return ts;
+
         return av_rescale_q(old + 1, inc_tb, ts_tb) + (ts - old_ts);
     }
 }
diff --git a/libavutil/mem.c b/libavutil/mem.c
index 6149755..a29c224 100644
--- a/libavutil/mem.c
+++ b/libavutil/mem.c
@@ -183,23 +183,26 @@
 
 void *av_malloc_array(size_t nmemb, size_t size)
 {
-    if (!size || nmemb >= INT_MAX / size)
+    size_t result;
+    if (av_size_mult(nmemb, size, &result) < 0)
         return NULL;
-    return av_malloc(nmemb * size);
+    return av_malloc(result);
 }
 
 void *av_mallocz_array(size_t nmemb, size_t size)
 {
-    if (!size || nmemb >= INT_MAX / size)
+    size_t result;
+    if (av_size_mult(nmemb, size, &result) < 0)
         return NULL;
-    return av_mallocz(nmemb * size);
+    return av_mallocz(result);
 }
 
 void *av_realloc_array(void *ptr, size_t nmemb, size_t size)
 {
-    if (!size || nmemb >= INT_MAX / size)
+    size_t result;
+    if (av_size_mult(nmemb, size, &result) < 0)
         return NULL;
-    return av_realloc(ptr, nmemb * size);
+    return av_realloc(ptr, result);
 }
 
 int av_reallocp_array(void *ptr, size_t nmemb, size_t size)
@@ -243,9 +246,10 @@
 
 void *av_calloc(size_t nmemb, size_t size)
 {
-    if (size <= 0 || nmemb >= INT_MAX / size)
+    size_t result;
+    if (av_size_mult(nmemb, size, &result) < 0)
         return NULL;
-    return av_mallocz(nmemb * size);
+    return av_mallocz(result);
 }
 
 char *av_strdup(const char *s)
@@ -399,6 +403,18 @@
 {
     uint32_t v = AV_RN32(dst - 4);
 
+#if HAVE_FAST_64BIT
+    uint64_t v2= v + ((uint64_t)v<<32);
+    while (len >= 32) {
+        AV_WN64(dst   , v2);
+        AV_WN64(dst+ 8, v2);
+        AV_WN64(dst+16, v2);
+        AV_WN64(dst+24, v2);
+        dst += 32;
+        len -= 32;
+    }
+#endif
+
     while (len >= 4) {
         AV_WN32(dst, v);
         dst += 4;
diff --git a/libavutil/mem.h b/libavutil/mem.h
index 7e0b12a..5fb1a02 100644
--- a/libavutil/mem.h
+++ b/libavutil/mem.h
@@ -339,7 +339,7 @@
  * @warning Unlike av_malloc(), the allocated memory is not guaranteed to be
  *          correctly aligned.
  */
-av_alloc_size(2, 3) int av_reallocp_array(void *ptr, size_t nmemb, size_t size);
+int av_reallocp_array(void *ptr, size_t nmemb, size_t size);
 
 /**
  * Reallocate the given buffer if it is not large enough, otherwise do nothing.
@@ -363,10 +363,10 @@
  * @endcode
  *
  * @param[in,out] ptr      Already allocated buffer, or `NULL`
- * @param[in,out] size     Pointer to current size of buffer `ptr`. `*size` is
- *                         changed to `min_size` in case of success or 0 in
- *                         case of failure
- * @param[in]     min_size New size of buffer `ptr`
+ * @param[in,out] size     Pointer to the size of buffer `ptr`. `*size` is
+ *                         updated to the new allocated size, in particular 0
+ *                         in case of failure.
+ * @param[in]     min_size Desired minimal size of buffer `ptr`
  * @return `ptr` if the buffer is large enough, a pointer to newly reallocated
  *         buffer if the buffer was not large enough, or `NULL` in case of
  *         error
@@ -397,10 +397,10 @@
  * @param[in,out] ptr      Pointer to pointer to an already allocated buffer.
  *                         `*ptr` will be overwritten with pointer to new
  *                         buffer on success or `NULL` on failure
- * @param[in,out] size     Pointer to current size of buffer `*ptr`. `*size` is
- *                         changed to `min_size` in case of success or 0 in
- *                         case of failure
- * @param[in]     min_size New size of buffer `*ptr`
+ * @param[in,out] size     Pointer to the size of buffer `*ptr`. `*size` is
+ *                         updated to the new allocated size, in particular 0
+ *                         in case of failure.
+ * @param[in]     min_size Desired minimal size of buffer `*ptr`
  * @see av_realloc()
  * @see av_fast_mallocz()
  */
@@ -418,10 +418,10 @@
  * @param[in,out] ptr      Pointer to pointer to an already allocated buffer.
  *                         `*ptr` will be overwritten with pointer to new
  *                         buffer on success or `NULL` on failure
- * @param[in,out] size     Pointer to current size of buffer `*ptr`. `*size` is
- *                         changed to `min_size` in case of success or 0 in
- *                         case of failure
- * @param[in]     min_size New size of buffer `*ptr`
+ * @param[in,out] size     Pointer to the size of buffer `*ptr`. `*size` is
+ *                         updated to the new allocated size, in particular 0
+ *                         in case of failure.
+ * @param[in]     min_size Desired minimal size of buffer `*ptr`
  * @see av_fast_malloc()
  */
 void av_fast_mallocz(void *ptr, unsigned int *size, size_t min_size);
diff --git a/libavutil/mips/generic_macros_msa.h b/libavutil/mips/generic_macros_msa.h
index 6a46704..267d4e6 100644
--- a/libavutil/mips/generic_macros_msa.h
+++ b/libavutil/mips/generic_macros_msa.h
@@ -23,6 +23,11 @@
 
 #include <stdint.h>
 #include <msa.h>
+#include <config.h>
+
+#if HAVE_MSA2
+#include <msa2.h>
+#endif
 
 #define ALIGNMENT           16
 #define ALLOC_ALIGNED(align) __attribute__ ((aligned((align) << 1)))
@@ -294,6 +299,7 @@
 #define LD_SB4(...) LD_V4(v16i8, __VA_ARGS__)
 #define LD_UH4(...) LD_V4(v8u16, __VA_ARGS__)
 #define LD_SH4(...) LD_V4(v8i16, __VA_ARGS__)
+#define LD_SW4(...) LD_V4(v4i32, __VA_ARGS__)
 
 #define LD_V5(RTYPE, psrc, stride, out0, out1, out2, out3, out4)  \
 {                                                                 \
@@ -332,6 +338,7 @@
 #define LD_SB8(...) LD_V8(v16i8, __VA_ARGS__)
 #define LD_UH8(...) LD_V8(v8u16, __VA_ARGS__)
 #define LD_SH8(...) LD_V8(v8i16, __VA_ARGS__)
+#define LD_SW8(...) LD_V8(v4i32, __VA_ARGS__)
 
 #define LD_V16(RTYPE, psrc, stride,                                   \
                out0, out1, out2, out3, out4, out5, out6, out7,        \
@@ -344,19 +351,6 @@
 }
 #define LD_SH16(...) LD_V16(v8i16, __VA_ARGS__)
 
-/* Description : Load as 4x4 block of signed halfword elements from 1D source
-                 data into 4 vectors (Each vector with 4 signed halfwords)
-   Arguments   : Inputs  - psrc
-                 Outputs - out0, out1, out2, out3
-*/
-#define LD4x4_SH(psrc, out0, out1, out2, out3)                \
-{                                                             \
-    out0 = LD_SH(psrc);                                       \
-    out2 = LD_SH(psrc + 8);                                   \
-    out1 = (v8i16) __msa_ilvl_d((v2i64) out0, (v2i64) out0);  \
-    out3 = (v8i16) __msa_ilvl_d((v2i64) out2, (v2i64) out2);  \
-}
-
 /* Description : Store vectors with stride
    Arguments   : Inputs  - in0, in1, stride
                  Outputs - pdst    (destination pointer to store to)
@@ -400,198 +394,127 @@
 #define ST_SH8(...) ST_V8(v8i16, __VA_ARGS__)
 #define ST_SW8(...) ST_V8(v4i32, __VA_ARGS__)
 
-/* Description : Store as 2x4 byte block to destination memory from input vector
-   Arguments   : Inputs  - in, stidx, pdst, stride
-                 Return Type - unsigned byte
-   Details     : Index stidx halfword element from 'in' vector is copied and
-                 stored on first line
-                 Index stidx+1 halfword element from 'in' vector is copied and
-                 stored on second line
-                 Index stidx+2 halfword element from 'in' vector is copied and
-                 stored on third line
-                 Index stidx+3 halfword element from 'in' vector is copied and
-                 stored on fourth line
-*/
-#define ST2x4_UB(in, stidx, pdst, stride)              \
-{                                                      \
-    uint16_t out0_m, out1_m, out2_m, out3_m;           \
-    uint8_t *pblk_2x4_m = (uint8_t *) (pdst);          \
-                                                       \
-    out0_m = __msa_copy_u_h((v8i16) in, (stidx));      \
-    out1_m = __msa_copy_u_h((v8i16) in, (stidx + 1));  \
-    out2_m = __msa_copy_u_h((v8i16) in, (stidx + 2));  \
-    out3_m = __msa_copy_u_h((v8i16) in, (stidx + 3));  \
-                                                       \
-    SH(out0_m, pblk_2x4_m);                            \
-    SH(out1_m, pblk_2x4_m + stride);                   \
-    SH(out2_m, pblk_2x4_m + 2 * stride);               \
-    SH(out3_m, pblk_2x4_m + 3 * stride);               \
+/* Description : Store half word elements of vector with stride
+ * Arguments   : Inputs  - in   source vector
+ *                       - pdst    (destination pointer to store to)
+ *                       - stride
+ * Details     : Stores half word 'idx0' from 'in' to (pdst)
+ *               Stores half word 'idx1' from 'in' to (pdst + stride)
+ *               Similar for other elements
+ */
+#define ST_H1(in, idx, pdst)                             \
+{                                                        \
+    uint16_t out0_m;                                     \
+    out0_m = __msa_copy_u_h((v8i16) in, idx);            \
+    SH(out0_m, (pdst));                                  \
+}
+#define ST_H2(in, idx0, idx1, pdst, stride)              \
+{                                                        \
+    uint16_t out0_m, out1_m;                             \
+    out0_m = __msa_copy_u_h((v8i16) in, idx0);           \
+    out1_m = __msa_copy_u_h((v8i16) in, idx1);           \
+    SH(out0_m, (pdst));                                  \
+    SH(out1_m, (pdst) + stride);                         \
+}
+#define ST_H4(in, idx0, idx1, idx2, idx3, pdst, stride)  \
+{                                                        \
+    uint16_t out0_m, out1_m, out2_m, out3_m;             \
+    out0_m = __msa_copy_u_h((v8i16) in, idx0);           \
+    out1_m = __msa_copy_u_h((v8i16) in, idx1);           \
+    out2_m = __msa_copy_u_h((v8i16) in, idx2);           \
+    out3_m = __msa_copy_u_h((v8i16) in, idx3);           \
+    SH(out0_m, (pdst));                                  \
+    SH(out1_m, (pdst) + stride);                         \
+    SH(out2_m, (pdst) + 2 * stride);                     \
+    SH(out3_m, (pdst) + 3 * stride);                     \
+}
+#define ST_H8(in, idx0, idx1, idx2, idx3, idx4, idx5,            \
+              idx6, idx7, pdst, stride)                          \
+{                                                                \
+    ST_H4(in, idx0, idx1, idx2, idx3, pdst, stride)              \
+    ST_H4(in, idx4, idx5, idx6, idx7, (pdst) + 4*stride, stride) \
 }
 
-/* Description : Store as 4x2 byte block to destination memory from input vector
-   Arguments   : Inputs  - in, pdst, stride
-                 Return Type - unsigned byte
-   Details     : Index 0 word element from input vector is copied and stored
-                 on first line
-                 Index 1 word element from input vector is copied and stored
-                 on second line
-*/
-#define ST4x2_UB(in, pdst, stride)             \
+/* Description : Store word elements of vector with stride
+ * Arguments   : Inputs  - in   source vector
+ *                       - pdst    (destination pointer to store to)
+ *                       - stride
+ * Details     : Stores word 'idx0' from 'in' to (pdst)
+ *               Stores word 'idx1' from 'in' to (pdst + stride)
+ *               Similar for other elements
+ */
+#define ST_W1(in, idx, pdst)                             \
+{                                                        \
+    uint32_t out0_m;                                     \
+    out0_m = __msa_copy_u_w((v4i32) in, idx);            \
+    SW(out0_m, (pdst));                                  \
+}
+#define ST_W2(in, idx0, idx1, pdst, stride)              \
+{                                                        \
+    uint32_t out0_m, out1_m;                             \
+    out0_m = __msa_copy_u_w((v4i32) in, idx0);           \
+    out1_m = __msa_copy_u_w((v4i32) in, idx1);           \
+    SW(out0_m, (pdst));                                  \
+    SW(out1_m, (pdst) + stride);                         \
+}
+#define ST_W4(in, idx0, idx1, idx2, idx3, pdst, stride)  \
+{                                                        \
+    uint32_t out0_m, out1_m, out2_m, out3_m;             \
+    out0_m = __msa_copy_u_w((v4i32) in, idx0);           \
+    out1_m = __msa_copy_u_w((v4i32) in, idx1);           \
+    out2_m = __msa_copy_u_w((v4i32) in, idx2);           \
+    out3_m = __msa_copy_u_w((v4i32) in, idx3);           \
+    SW(out0_m, (pdst));                                  \
+    SW(out1_m, (pdst) + stride);                         \
+    SW(out2_m, (pdst) + 2*stride);                       \
+    SW(out3_m, (pdst) + 3*stride);                       \
+}
+#define ST_W8(in0, in1, idx0, idx1, idx2, idx3,                 \
+              idx4, idx5, idx6, idx7, pdst, stride)             \
+{                                                               \
+    ST_W4(in0, idx0, idx1, idx2, idx3, pdst, stride)            \
+    ST_W4(in1, idx4, idx5, idx6, idx7, pdst + 4*stride, stride) \
+}
+
+/* Description : Store double word elements of vector with stride
+ * Arguments   : Inputs  - in   source vector
+ *                       - pdst    (destination pointer to store to)
+ *                       - stride
+ * Details     : Stores double word 'idx0' from 'in' to (pdst)
+ *               Stores double word 'idx1' from 'in' to (pdst + stride)
+ *               Similar for other elements
+ */
+#define ST_D1(in, idx, pdst)                   \
 {                                              \
-    uint32_t out0_m, out1_m;                   \
-    uint8_t *pblk_4x2_m = (uint8_t *) (pdst);  \
-                                               \
-    out0_m = __msa_copy_u_w((v4i32) in, 0);    \
-    out1_m = __msa_copy_u_w((v4i32) in, 1);    \
-                                               \
-    SW(out0_m, pblk_4x2_m);                    \
-    SW(out1_m, pblk_4x2_m + stride);           \
+    uint64_t out0_m;                           \
+    out0_m = __msa_copy_u_d((v2i64) in, idx);  \
+    SD(out0_m, (pdst));                        \
 }
-
-/* Description : Store as 4x4 byte block to destination memory from input vector
-   Arguments   : Inputs  - in0, in1, pdst, stride
-                 Return Type - unsigned byte
-   Details     : Idx0 word element from input vector 'in0' is copied and stored
-                 on first line
-                 Idx1 word element from input vector 'in0' is copied and stored
-                 on second line
-                 Idx2 word element from input vector 'in1' is copied and stored
-                 on third line
-                 Idx3 word element from input vector 'in1' is copied and stored
-                 on fourth line
-*/
-#define ST4x4_UB(in0, in1, idx0, idx1, idx2, idx3, pdst, stride)  \
-{                                                                 \
-    uint32_t out0_m, out1_m, out2_m, out3_m;                      \
-    uint8_t *pblk_4x4_m = (uint8_t *) (pdst);                     \
-                                                                  \
-    out0_m = __msa_copy_u_w((v4i32) in0, idx0);                   \
-    out1_m = __msa_copy_u_w((v4i32) in0, idx1);                   \
-    out2_m = __msa_copy_u_w((v4i32) in1, idx2);                   \
-    out3_m = __msa_copy_u_w((v4i32) in1, idx3);                   \
-                                                                  \
-    SW4(out0_m, out1_m, out2_m, out3_m, pblk_4x4_m, stride);      \
-}
-#define ST4x8_UB(in0, in1, pdst, stride)                            \
-{                                                                   \
-    uint8_t *pblk_4x8 = (uint8_t *) (pdst);                         \
-                                                                    \
-    ST4x4_UB(in0, in0, 0, 1, 2, 3, pblk_4x8, stride);               \
-    ST4x4_UB(in1, in1, 0, 1, 2, 3, pblk_4x8 + 4 * stride, stride);  \
-}
-
-/* Description : Store as 6x4 byte block to destination memory from input
-                 vectors
-   Arguments   : Inputs  - in0, in1, pdst, stride
-                 Return Type - unsigned byte
-   Details     : Index 0 word element from input vector 'in0' is copied and
-                 stored on first line followed by index 2 halfword element
-                 Index 2 word element from input vector 'in0' is copied and
-                 stored on second line followed by index 2 halfword element
-                 Index 0 word element from input vector 'in1' is copied and
-                 stored on third line followed by index 2 halfword element
-                 Index 2 word element from input vector 'in1' is copied and
-                 stored on fourth line followed by index 2 halfword element
-*/
-#define ST6x4_UB(in0, in1, pdst, stride)       \
-{                                              \
-    uint32_t out0_m, out1_m, out2_m, out3_m;   \
-    uint16_t out4_m, out5_m, out6_m, out7_m;   \
-    uint8_t *pblk_6x4_m = (uint8_t *) (pdst);  \
-                                               \
-    out0_m = __msa_copy_u_w((v4i32) in0, 0);   \
-    out1_m = __msa_copy_u_w((v4i32) in0, 2);   \
-    out2_m = __msa_copy_u_w((v4i32) in1, 0);   \
-    out3_m = __msa_copy_u_w((v4i32) in1, 2);   \
-                                               \
-    out4_m = __msa_copy_u_h((v8i16) in0, 2);   \
-    out5_m = __msa_copy_u_h((v8i16) in0, 6);   \
-    out6_m = __msa_copy_u_h((v8i16) in1, 2);   \
-    out7_m = __msa_copy_u_h((v8i16) in1, 6);   \
-                                               \
-    SW(out0_m, pblk_6x4_m);                    \
-    SH(out4_m, (pblk_6x4_m + 4));              \
-    pblk_6x4_m += stride;                      \
-    SW(out1_m, pblk_6x4_m);                    \
-    SH(out5_m, (pblk_6x4_m + 4));              \
-    pblk_6x4_m += stride;                      \
-    SW(out2_m, pblk_6x4_m);                    \
-    SH(out6_m, (pblk_6x4_m + 4));              \
-    pblk_6x4_m += stride;                      \
-    SW(out3_m, pblk_6x4_m);                    \
-    SH(out7_m, (pblk_6x4_m + 4));              \
-}
-
-/* Description : Store as 8x1 byte block to destination memory from input vector
-   Arguments   : Inputs  - in, pdst
-   Details     : Index 0 double word element from input vector 'in' is copied
-                 and stored to destination memory at (pdst)
-*/
-#define ST8x1_UB(in, pdst)                   \
-{                                            \
-    uint64_t out0_m;                         \
-    out0_m = __msa_copy_u_d((v2i64) in, 0);  \
-    SD(out0_m, pdst);                        \
-}
-
-/* Description : Store as 8x2 byte block to destination memory from input vector
-   Arguments   : Inputs  - in, pdst, stride
-   Details     : Index 0 double word element from input vector 'in' is copied
-                 and stored to destination memory at (pdst)
-                 Index 1 double word element from input vector 'in' is copied
-                 and stored to destination memory at (pdst + stride)
-*/
-#define ST8x2_UB(in, pdst, stride)             \
+#define ST_D2(in, idx0, idx1, pdst, stride)    \
 {                                              \
     uint64_t out0_m, out1_m;                   \
-    uint8_t *pblk_8x2_m = (uint8_t *) (pdst);  \
-                                               \
-    out0_m = __msa_copy_u_d((v2i64) in, 0);    \
-    out1_m = __msa_copy_u_d((v2i64) in, 1);    \
-                                               \
-    SD(out0_m, pblk_8x2_m);                    \
-    SD(out1_m, pblk_8x2_m + stride);           \
+    out0_m = __msa_copy_u_d((v2i64) in, idx0); \
+    out1_m = __msa_copy_u_d((v2i64) in, idx1); \
+    SD(out0_m, (pdst));                        \
+    SD(out1_m, (pdst) + stride);               \
 }
-
-/* Description : Store as 8x4 byte block to destination memory from input
-                 vectors
-   Arguments   : Inputs  - in0, in1, pdst, stride
-   Details     : Index 0 double word element from input vector 'in0' is copied
-                 and stored to destination memory at (pblk_8x4_m)
-                 Index 1 double word element from input vector 'in0' is copied
-                 and stored to destination memory at (pblk_8x4_m + stride)
-                 Index 0 double word element from input vector 'in1' is copied
-                 and stored to destination memory at (pblk_8x4_m + 2 * stride)
-                 Index 1 double word element from input vector 'in1' is copied
-                 and stored to destination memory at (pblk_8x4_m + 3 * stride)
-*/
-#define ST8x4_UB(in0, in1, pdst, stride)                      \
+#define ST_D4(in0, in1, idx0, idx1, idx2, idx3, pdst, stride) \
 {                                                             \
     uint64_t out0_m, out1_m, out2_m, out3_m;                  \
-    uint8_t *pblk_8x4_m = (uint8_t *) (pdst);                 \
-                                                              \
-    out0_m = __msa_copy_u_d((v2i64) in0, 0);                  \
-    out1_m = __msa_copy_u_d((v2i64) in0, 1);                  \
-    out2_m = __msa_copy_u_d((v2i64) in1, 0);                  \
-    out3_m = __msa_copy_u_d((v2i64) in1, 1);                  \
-                                                              \
-    SD4(out0_m, out1_m, out2_m, out3_m, pblk_8x4_m, stride);  \
+    out0_m = __msa_copy_u_d((v2i64) in0, idx0);               \
+    out1_m = __msa_copy_u_d((v2i64) in0, idx1);               \
+    out2_m = __msa_copy_u_d((v2i64) in1, idx2);               \
+    out3_m = __msa_copy_u_d((v2i64) in1, idx3);               \
+    SD(out0_m, (pdst));                                       \
+    SD(out1_m, (pdst) + stride);                              \
+    SD(out2_m, (pdst) + 2 * stride);                          \
+    SD(out3_m, (pdst) + 3 * stride);                          \
 }
-#define ST8x8_UB(in0, in1, in2, in3, pdst, stride)        \
-{                                                         \
-    uint8_t *pblk_8x8_m = (uint8_t *) (pdst);             \
-                                                          \
-    ST8x4_UB(in0, in1, pblk_8x8_m, stride);               \
-    ST8x4_UB(in2, in3, pblk_8x8_m + 4 * stride, stride);  \
-}
-#define ST12x4_UB(in0, in1, in2, pdst, stride)                \
-{                                                             \
-    uint8_t *pblk_12x4_m = (uint8_t *) (pdst);                \
-                                                              \
-    /* left 8x4 */                                            \
-    ST8x4_UB(in0, in1, pblk_12x4_m, stride);                  \
-    /* right 4x4 */                                           \
-    ST4x4_UB(in2, in2, 0, 1, 2, 3, pblk_12x4_m + 8, stride);  \
+#define ST_D8(in0, in1, in2, in3, idx0, idx1, idx2, idx3,              \
+              idx4, idx5, idx6, idx7, pdst, stride)                    \
+{                                                                      \
+    ST_D4(in0, in1, idx0, idx1, idx2, idx3, pdst, stride)              \
+    ST_D4(in2, in3, idx4, idx5, idx6, idx7, pdst + 4 * stride, stride) \
 }
 
 /* Description : Store as 12x8 byte block to destination memory from
@@ -681,67 +604,48 @@
 }
 #define AVER_UB4_UB(...) AVER_UB4(v16u8, __VA_ARGS__)
 
-/* Description : Immediate number of columns to slide with zero
-   Arguments   : Inputs  - in0, in1, slide_val
-                 Outputs - out0, out1
-                 Return Type - as per RTYPE
-   Details     : Byte elements from 'zero_m' vector are slide into 'in0' by
-                 number of elements specified by 'slide_val'
-*/
-#define SLDI_B2_0(RTYPE, in0, in1, out0, out1, slide_val)                 \
-{                                                                         \
-    v16i8 zero_m = { 0 };                                                 \
-    out0 = (RTYPE) __msa_sldi_b((v16i8) zero_m, (v16i8) in0, slide_val);  \
-    out1 = (RTYPE) __msa_sldi_b((v16i8) zero_m, (v16i8) in1, slide_val);  \
-}
-#define SLDI_B2_0_UB(...) SLDI_B2_0(v16u8, __VA_ARGS__)
-#define SLDI_B2_0_SB(...) SLDI_B2_0(v16i8, __VA_ARGS__)
-#define SLDI_B2_0_SW(...) SLDI_B2_0(v4i32, __VA_ARGS__)
-
-#define SLDI_B3_0(RTYPE, in0, in1, in2, out0, out1, out2,  slide_val)     \
-{                                                                         \
-    v16i8 zero_m = { 0 };                                                 \
-    SLDI_B2_0(RTYPE, in0, in1, out0, out1, slide_val);                    \
-    out2 = (RTYPE) __msa_sldi_b((v16i8) zero_m, (v16i8) in2, slide_val);  \
-}
-#define SLDI_B3_0_UB(...) SLDI_B3_0(v16u8, __VA_ARGS__)
-#define SLDI_B3_0_SB(...) SLDI_B3_0(v16i8, __VA_ARGS__)
-
-#define SLDI_B4_0(RTYPE, in0, in1, in2, in3,            \
-                  out0, out1, out2, out3, slide_val)    \
-{                                                       \
-    SLDI_B2_0(RTYPE, in0, in1, out0, out1, slide_val);  \
-    SLDI_B2_0(RTYPE, in2, in3, out2, out3, slide_val);  \
-}
-#define SLDI_B4_0_UB(...) SLDI_B4_0(v16u8, __VA_ARGS__)
-#define SLDI_B4_0_SB(...) SLDI_B4_0(v16i8, __VA_ARGS__)
-#define SLDI_B4_0_SH(...) SLDI_B4_0(v8i16, __VA_ARGS__)
-
 /* Description : Immediate number of columns to slide
-   Arguments   : Inputs  - in0_0, in0_1, in1_0, in1_1, slide_val
-                 Outputs - out0, out1
+   Arguments   : Inputs  - s, d, slide_val
+                 Outputs - out
                  Return Type - as per RTYPE
-   Details     : Byte elements from 'in0_0' vector are slide into 'in1_0' by
+   Details     : Byte elements from 'd' vector are slide into 's' by
                  number of elements specified by 'slide_val'
 */
-#define SLDI_B2(RTYPE, in0_0, in0_1, in1_0, in1_1, out0, out1, slide_val)  \
-{                                                                          \
-    out0 = (RTYPE) __msa_sldi_b((v16i8) in0_0, (v16i8) in1_0, slide_val);  \
-    out1 = (RTYPE) __msa_sldi_b((v16i8) in0_1, (v16i8) in1_1, slide_val);  \
+#define SLDI_B(RTYPE, d, s, slide_val, out)                       \
+{                                                                 \
+    out = (RTYPE) __msa_sldi_b((v16i8) d, (v16i8) s, slide_val);  \
+}
+
+#define SLDI_B2(RTYPE, d0, s0, d1, s1, slide_val, out0, out1)  \
+{                                                              \
+    SLDI_B(RTYPE, d0, s0, slide_val, out0)                     \
+    SLDI_B(RTYPE, d1, s1, slide_val, out1)                     \
 }
 #define SLDI_B2_UB(...) SLDI_B2(v16u8, __VA_ARGS__)
 #define SLDI_B2_SB(...) SLDI_B2(v16i8, __VA_ARGS__)
 #define SLDI_B2_SH(...) SLDI_B2(v8i16, __VA_ARGS__)
+#define SLDI_B2_SW(...) SLDI_B2(v4i32, __VA_ARGS__)
 
-#define SLDI_B3(RTYPE, in0_0, in0_1, in0_2, in1_0, in1_1, in1_2,           \
-                out0, out1, out2, slide_val)                               \
-{                                                                          \
-    SLDI_B2(RTYPE, in0_0, in0_1, in1_0, in1_1, out0, out1, slide_val)      \
-    out2 = (RTYPE) __msa_sldi_b((v16i8) in0_2, (v16i8) in1_2, slide_val);  \
+#define SLDI_B3(RTYPE, d0, s0, d1, s1, d2, s2, slide_val,  \
+                out0, out1, out2)                          \
+{                                                          \
+    SLDI_B2(RTYPE, d0, s0, d1, s1, slide_val, out0, out1)  \
+    SLDI_B(RTYPE, d2, s2, slide_val, out2)                 \
 }
+#define SLDI_B3_UB(...) SLDI_B3(v16u8, __VA_ARGS__)
 #define SLDI_B3_SB(...) SLDI_B3(v16i8, __VA_ARGS__)
 #define SLDI_B3_UH(...) SLDI_B3(v8u16, __VA_ARGS__)
 
+#define SLDI_B4(RTYPE, d0, s0, d1, s1, d2, s2, d3, s3,     \
+                slide_val, out0, out1, out2, out3)         \
+{                                                          \
+    SLDI_B2(RTYPE, d0, s0, d1, s1, slide_val, out0, out1)  \
+    SLDI_B2(RTYPE, d2, s2, d3, s3, slide_val, out2, out3)  \
+}
+#define SLDI_B4_UB(...) SLDI_B4(v16u8, __VA_ARGS__)
+#define SLDI_B4_SB(...) SLDI_B4(v16i8, __VA_ARGS__)
+#define SLDI_B4_SH(...) SLDI_B4(v8i16, __VA_ARGS__)
+
 /* Description : Shuffle byte vector elements as per mask vector
    Arguments   : Inputs  - in0, in1, in2, in3, mask0, mask1
                  Outputs - out0, out1
@@ -1012,99 +916,78 @@
 
 /* Description : Clips all halfword elements of input vector between min & max
                  out = ((in) < (min)) ? (min) : (((in) > (max)) ? (max) : (in))
-   Arguments   : Inputs  - in       (input vector)
-                         - min      (min threshold)
-                         - max      (max threshold)
-                 Outputs - out_m    (output vector with clipped elements)
+   Arguments   : Inputs  - in    (input vector)
+                         - min   (min threshold)
+                         - max   (max threshold)
+                 Outputs - in    (output vector with clipped elements)
                  Return Type - signed halfword
 */
-#define CLIP_SH(in, min, max)                           \
-( {                                                     \
-    v8i16 out_m;                                        \
-                                                        \
-    out_m = __msa_max_s_h((v8i16) min, (v8i16) in);     \
-    out_m = __msa_min_s_h((v8i16) max, (v8i16) out_m);  \
-    out_m;                                              \
-} )
+#define CLIP_SH(in, min, max)                     \
+{                                                 \
+    in = __msa_max_s_h((v8i16) min, (v8i16) in);  \
+    in = __msa_min_s_h((v8i16) max, (v8i16) in);  \
+}
 
 /* Description : Clips all signed halfword elements of input vector
                  between 0 & 255
-   Arguments   : Inputs  - in       (input vector)
-                 Outputs - out_m    (output vector with clipped elements)
-                 Return Type - signed halfword
+   Arguments   : Inputs  - in    (input vector)
+                 Outputs - in    (output vector with clipped elements)
+                 Return Type - signed halfwords
 */
-#define CLIP_SH_0_255(in)                                 \
-( {                                                       \
-    v8i16 max_m = __msa_ldi_h(255);                       \
-    v8i16 out_m;                                          \
-                                                          \
-    out_m = __msa_maxi_s_h((v8i16) in, 0);                \
-    out_m = __msa_min_s_h((v8i16) max_m, (v8i16) out_m);  \
-    out_m;                                                \
-} )
+#define CLIP_SH_0_255(in)                       \
+{                                               \
+    in = __msa_maxi_s_h((v8i16) in, 0);         \
+    in = (v8i16) __msa_sat_u_h((v8u16) in, 7);  \
+}
+
 #define CLIP_SH2_0_255(in0, in1)  \
 {                                 \
-    in0 = CLIP_SH_0_255(in0);     \
-    in1 = CLIP_SH_0_255(in1);     \
+    CLIP_SH_0_255(in0);           \
+    CLIP_SH_0_255(in1);           \
 }
+
 #define CLIP_SH4_0_255(in0, in1, in2, in3)  \
 {                                           \
     CLIP_SH2_0_255(in0, in1);               \
     CLIP_SH2_0_255(in2, in3);               \
 }
 
-#define CLIP_SH_0_255_MAX_SATU(in)                    \
-( {                                                   \
-    v8i16 out_m;                                      \
-                                                      \
-    out_m = __msa_maxi_s_h((v8i16) in, 0);            \
-    out_m = (v8i16) __msa_sat_u_h((v8u16) out_m, 7);  \
-    out_m;                                            \
-} )
-#define CLIP_SH2_0_255_MAX_SATU(in0, in1)  \
-{                                          \
-    in0 = CLIP_SH_0_255_MAX_SATU(in0);     \
-    in1 = CLIP_SH_0_255_MAX_SATU(in1);     \
-}
-#define CLIP_SH4_0_255_MAX_SATU(in0, in1, in2, in3)  \
-{                                                    \
-    CLIP_SH2_0_255_MAX_SATU(in0, in1);               \
-    CLIP_SH2_0_255_MAX_SATU(in2, in3);               \
+#define CLIP_SH8_0_255(in0, in1, in2, in3,  \
+                       in4, in5, in6, in7)  \
+{                                           \
+    CLIP_SH4_0_255(in0, in1, in2, in3);     \
+    CLIP_SH4_0_255(in4, in5, in6, in7);     \
 }
 
 /* Description : Clips all signed word elements of input vector
                  between 0 & 255
-   Arguments   : Inputs  - in       (input vector)
-                 Outputs - out_m    (output vector with clipped elements)
+   Arguments   : Inputs  - in    (input vector)
+                 Outputs - in    (output vector with clipped elements)
                  Return Type - signed word
 */
-#define CLIP_SW_0_255(in)                                 \
-( {                                                       \
-    v4i32 max_m = __msa_ldi_w(255);                       \
-    v4i32 out_m;                                          \
-                                                          \
-    out_m = __msa_maxi_s_w((v4i32) in, 0);                \
-    out_m = __msa_min_s_w((v4i32) max_m, (v4i32) out_m);  \
-    out_m;                                                \
-} )
-
-#define CLIP_SW_0_255_MAX_SATU(in)                    \
-( {                                                   \
-    v4i32 out_m;                                      \
-                                                      \
-    out_m = __msa_maxi_s_w((v4i32) in, 0);            \
-    out_m = (v4i32) __msa_sat_u_w((v4u32) out_m, 7);  \
-    out_m;                                            \
-} )
-#define CLIP_SW2_0_255_MAX_SATU(in0, in1)  \
-{                                          \
-    in0 = CLIP_SW_0_255_MAX_SATU(in0);     \
-    in1 = CLIP_SW_0_255_MAX_SATU(in1);     \
+#define CLIP_SW_0_255(in)                       \
+{                                               \
+    in = __msa_maxi_s_w((v4i32) in, 0);         \
+    in = (v4i32) __msa_sat_u_w((v4u32) in, 7);  \
 }
-#define CLIP_SW4_0_255_MAX_SATU(in0, in1, in2, in3)  \
-{                                                    \
-    CLIP_SW2_0_255_MAX_SATU(in0, in1);               \
-    CLIP_SW2_0_255_MAX_SATU(in2, in3);               \
+
+#define CLIP_SW2_0_255(in0, in1)  \
+{                                 \
+    CLIP_SW_0_255(in0);           \
+    CLIP_SW_0_255(in1);           \
+}
+
+#define CLIP_SW4_0_255(in0, in1, in2, in3)  \
+{                                           \
+    CLIP_SW2_0_255(in0, in1);               \
+    CLIP_SW2_0_255(in2, in3);               \
+}
+
+#define CLIP_SW8_0_255(in0, in1, in2, in3,  \
+                       in4, in5, in6, in7)  \
+{                                           \
+    CLIP_SW4_0_255(in0, in1, in2, in3);     \
+    CLIP_SW4_0_255(in4, in5, in6, in7);     \
 }
 
 /* Description : Addition of 4 signed word elements
@@ -1234,6 +1117,15 @@
                  unsigned absolute diff values, even-odd pairs are added
                  together to generate 8 halfword results.
 */
+#if HAVE_MSA2
+#define SAD_UB2_UH(in0, in1, ref0, ref1)                                 \
+( {                                                                      \
+    v8u16 sad_m = { 0 };                                                 \
+    sad_m += __builtin_msa2_sad_adj2_u_w2x_b((v16u8) in0, (v16u8) ref0); \
+    sad_m += __builtin_msa2_sad_adj2_u_w2x_b((v16u8) in1, (v16u8) ref1); \
+    sad_m;                                                               \
+} )
+#else
 #define SAD_UB2_UH(in0, in1, ref0, ref1)                        \
 ( {                                                             \
     v16u8 diff0_m, diff1_m;                                     \
@@ -1247,6 +1139,7 @@
                                                                 \
     sad_m;                                                      \
 } )
+#endif // #if HAVE_MSA2
 
 /* Description : Insert specified word elements from input vectors to 1
                  destination vector
@@ -1491,6 +1384,7 @@
             out4, out5, out6, out7);                              \
 }
 #define ILVR_B8_UH(...) ILVR_B8(v8u16, __VA_ARGS__)
+#define ILVR_B8_SW(...) ILVR_B8(v4i32, __VA_ARGS__)
 
 /* Description : Interleave right half of halfword elements from vectors
    Arguments   : Inputs  - in0, in1, in2, in3, in4, in5, in6, in7
@@ -2287,6 +2181,12 @@
                  extracted and interleaved with same vector 'in0' to generate
                  4 word elements keeping sign intact
 */
+#if HAVE_MSA2
+#define UNPCK_R_SH_SW(in, out)                           \
+{                                                        \
+    out = (v4i32) __builtin_msa2_w2x_lo_s_h((v8i16) in); \
+}
+#else
 #define UNPCK_R_SH_SW(in, out)                       \
 {                                                    \
     v8i16 sign_m;                                    \
@@ -2294,6 +2194,7 @@
     sign_m = __msa_clti_s_h((v8i16) in, 0);          \
     out = (v4i32) __msa_ilvr_h(sign_m, (v8i16) in);  \
 }
+#endif // #if HAVE_MSA2
 
 /* Description : Sign extend byte elements from input vector and return
                  halfword results in pair of vectors
@@ -2306,6 +2207,13 @@
                  Then interleaved left with same vector 'in0' to
                  generate 8 signed halfword elements in 'out1'
 */
+#if HAVE_MSA2
+#define UNPCK_SB_SH(in, out0, out1)                       \
+{                                                         \
+    out0 = (v4i32) __builtin_msa2_w2x_lo_s_b((v16i8) in); \
+    out1 = (v4i32) __builtin_msa2_w2x_hi_s_b((v16i8) in); \
+}
+#else
 #define UNPCK_SB_SH(in, out0, out1)                  \
 {                                                    \
     v16i8 tmp_m;                                     \
@@ -2313,6 +2221,7 @@
     tmp_m = __msa_clti_s_b((v16i8) in, 0);           \
     ILVRL_B2_SH(tmp_m, in, out0, out1);              \
 }
+#endif // #if HAVE_MSA2
 
 /* Description : Zero extend unsigned byte elements to halfword elements
    Arguments   : Inputs  - in           (1 input unsigned byte vector)
@@ -2339,6 +2248,13 @@
                  Then interleaved left with same vector 'in0' to
                  generate 4 signed word elements in 'out1'
 */
+#if HAVE_MSA2
+#define UNPCK_SH_SW(in, out0, out1)                       \
+{                                                         \
+    out0 = (v4i32) __builtin_msa2_w2x_lo_s_h((v8i16) in); \
+    out1 = (v4i32) __builtin_msa2_w2x_hi_s_h((v8i16) in); \
+}
+#else
 #define UNPCK_SH_SW(in, out0, out1)                  \
 {                                                    \
     v8i16 tmp_m;                                     \
@@ -2346,6 +2262,7 @@
     tmp_m = __msa_clti_s_h((v8i16) in, 0);           \
     ILVRL_H2_SW(tmp_m, in, out0, out1);              \
 }
+#endif // #if HAVE_MSA2
 
 /* Description : Swap two variables
    Arguments   : Inputs  - in0, in1
@@ -2479,6 +2396,7 @@
 {                                                                        \
     v16i8 tmp0_m, tmp1_m, tmp2_m, tmp3_m;                                \
     v16i8 tmp4_m, tmp5_m, tmp6_m, tmp7_m;                                \
+    v16i8 zeros = { 0 };                                                 \
                                                                          \
     ILVR_B4_SB(in2, in0, in3, in1, in6, in4, in7, in5,                   \
                tmp0_m, tmp1_m, tmp2_m, tmp3_m);                          \
@@ -2486,8 +2404,8 @@
     ILVRL_B2_SB(tmp3_m, tmp2_m, tmp6_m, tmp7_m);                         \
     ILVRL_W2(RTYPE, tmp6_m, tmp4_m, out0, out2);                         \
     ILVRL_W2(RTYPE, tmp7_m, tmp5_m, out4, out6);                         \
-    SLDI_B2_0(RTYPE, out0, out2, out1, out3, 8);                         \
-    SLDI_B2_0(RTYPE, out4, out6, out5, out7, 8);                         \
+    SLDI_B4(RTYPE, zeros, out0, zeros, out2, zeros, out4, zeros, out6,   \
+            8, out1, out3, out5, out7);                                  \
 }
 #define TRANSPOSE8x8_UB_UB(...) TRANSPOSE8x8_UB(v16u8, __VA_ARGS__)
 #define TRANSPOSE8x8_UB_UH(...) TRANSPOSE8x8_UB(v8u16, __VA_ARGS__)
@@ -2569,8 +2487,6 @@
     out5 = (v16u8) __msa_ilvod_w((v4i32) tmp3_m, (v4i32) tmp2_m);            \
                                                                              \
     tmp2_m = (v16u8) __msa_ilvod_h((v8i16) tmp5_m, (v8i16) tmp4_m);          \
-    tmp2_m = (v16u8) __msa_ilvod_h((v8i16) tmp5_m, (v8i16) tmp4_m);          \
-    tmp3_m = (v16u8) __msa_ilvod_h((v8i16) tmp7_m, (v8i16) tmp6_m);          \
     tmp3_m = (v16u8) __msa_ilvod_h((v8i16) tmp7_m, (v8i16) tmp6_m);          \
     out3 = (v16u8) __msa_ilvev_w((v4i32) tmp3_m, (v4i32) tmp2_m);            \
     out7 = (v16u8) __msa_ilvod_w((v4i32) tmp3_m, (v4i32) tmp2_m);            \
@@ -2850,13 +2766,11 @@
 */
 #define DPADD_SH3_SH(in0, in1, in2, coeff0, coeff1, coeff2)         \
 ( {                                                                 \
-    v8i16 tmp1_m;                                                   \
     v8i16 out0_m;                                                   \
                                                                     \
     out0_m = __msa_dotp_s_h((v16i8) in0, (v16i8) coeff0);           \
     out0_m = __msa_dpadd_s_h(out0_m, (v16i8) in1, (v16i8) coeff1);  \
-    tmp1_m = __msa_dotp_s_h((v16i8) in2, (v16i8) coeff2);           \
-    out0_m = __msa_adds_s_h(out0_m, tmp1_m);                        \
+    out0_m = __msa_dpadd_s_h(out0_m, (v16i8) in2, (v16i8) coeff2);  \
                                                                     \
     out0_m;                                                         \
 } )
@@ -2890,7 +2804,7 @@
     tmp0_m = PCKEV_XORI128_UB(in0, in1);                      \
     tmp1_m = PCKEV_XORI128_UB(in2, in3);                      \
     AVER_UB2_UB(tmp0_m, dst0, tmp1_m, dst1, tmp0_m, tmp1_m);  \
-    ST8x4_UB(tmp0_m, tmp1_m, pdst_m, stride);                 \
+    ST_D4(tmp0_m, tmp1_m, 0, 1, 0, 1, pdst_m, stride);        \
 }
 
 /* Description : Pack even byte elements, extract 0 & 2 index words from pair
diff --git a/libavutil/mips/mmiutils.h b/libavutil/mips/mmiutils.h
index 76b1199..8f692e8 100644
--- a/libavutil/mips/mmiutils.h
+++ b/libavutil/mips/mmiutils.h
@@ -205,7 +205,7 @@
  * backup register
  */
 #define BACKUP_REG \
-  double temp_backup_reg[8];                                    \
+  LOCAL_ALIGNED_16(double, temp_backup_reg, [8]);               \
   if (_MIPS_SIM == _ABI64)                                      \
     __asm__ volatile (                                          \
       "gssqc1       $f25,      $f24,       0x00(%[temp])  \n\t" \
@@ -251,6 +251,15 @@
     );
 
 /**
+ * brief: Transpose 2X2 word packaged data.
+ * fr_i0, fr_i1: src
+ * fr_o0, fr_o1: dst
+ */
+#define TRANSPOSE_2W(fr_i0, fr_i1, fr_o0, fr_o1)                          \
+        "punpcklwd  "#fr_o0",   "#fr_i0",   "#fr_i1"                \n\t" \
+        "punpckhwd  "#fr_o1",   "#fr_i0",   "#fr_i1"                \n\t"
+
+/**
  * brief: Transpose 4X4 half word packaged data.
  * fr_i0, fr_i1, fr_i2, fr_i3: src & dst
  * fr_t0, fr_t1, fr_t2, fr_t3: temporary register
@@ -336,5 +345,20 @@
         PSRAH_4_MMI(fp1, fp2, fp3, fp4, shift)                            \
         PSRAH_4_MMI(fp5, fp6, fp7, fp8, shift)
 
+/**
+ * brief: (((value) + (1 << ((n) - 1))) >> (n))
+ * fr_i0: src & dst
+ * fr_i1: Operand number
+ * fr_t0, fr_t1: temporary FPR
+ * gr_t0: temporary GPR
+ */
+#define ROUND_POWER_OF_TWO_MMI(fr_i0, fr_i1, fr_t0, fr_t1, gr_t0)         \
+        "li         "#gr_t0",     0x01                              \n\t" \
+        "dmtc1      "#gr_t0",     "#fr_t0"                          \n\t" \
+        "punpcklwd  "#fr_t0",     "#fr_t0",    "#fr_t0"             \n\t" \
+        "psubw      "#fr_t1",     "#fr_i1",    "#fr_t0"             \n\t" \
+        "psllw      "#fr_t1",     "#fr_t0",    "#fr_t1"             \n\t" \
+        "paddw      "#fr_i0",     "#fr_i0",    "#fr_t1"             \n\t" \
+        "psraw      "#fr_i0",     "#fr_i0",    "#fr_i1"             \n\t"
 
 #endif /* AVUTILS_MIPS_MMIUTILS_H */
diff --git a/libavutil/opt.c b/libavutil/opt.c
index 93d6c26..bf25627 100644
--- a/libavutil/opt.c
+++ b/libavutil/opt.c
@@ -330,12 +330,7 @@
 
 static int set_string_video_rate(void *obj, const AVOption *o, const char *val, AVRational *dst)
 {
-    int ret;
-    if (!val) {
-        ret = AVERROR(EINVAL);
-    } else {
-        ret = av_parse_video_rate(dst, val);
-    }
+    int ret = av_parse_video_rate(dst, val);
     if (ret < 0)
         av_log(obj, AV_LOG_ERROR, "Unable to parse option value \"%s\" as video rate\n", val);
     return ret;
@@ -446,6 +441,24 @@
                           AV_SAMPLE_FMT_NB, av_get_sample_fmt, "sample format");
 }
 
+static int set_string_dict(void *obj, const AVOption *o, const char *val, uint8_t **dst)
+{
+    AVDictionary *options = NULL;
+
+    if (val) {
+        int ret = av_dict_parse_string(&options, val, "=", ":", 0);
+        if (ret < 0) {
+            av_dict_free(&options);
+            return ret;
+        }
+    }
+
+    av_dict_free((AVDictionary **)dst);
+    *dst = (uint8_t *)options;
+
+    return 0;
+}
+
 int av_opt_set(void *obj, const char *name, const char *val, int search_flags)
 {
     int ret = 0;
@@ -455,7 +468,7 @@
         return AVERROR_OPTION_NOT_FOUND;
     if (!val && (o->type != AV_OPT_TYPE_STRING &&
                  o->type != AV_OPT_TYPE_PIXEL_FMT && o->type != AV_OPT_TYPE_SAMPLE_FMT &&
-                 o->type != AV_OPT_TYPE_IMAGE_SIZE && o->type != AV_OPT_TYPE_VIDEO_RATE &&
+                 o->type != AV_OPT_TYPE_IMAGE_SIZE &&
                  o->type != AV_OPT_TYPE_DURATION && o->type != AV_OPT_TYPE_COLOR &&
                  o->type != AV_OPT_TYPE_CHANNEL_LAYOUT && o->type != AV_OPT_TYPE_BOOL))
         return AVERROR(EINVAL);
@@ -527,6 +540,8 @@
             return ret;
         }
         break;
+    case AV_OPT_TYPE_DICT:
+        return set_string_dict(obj, o, val, dst);
     }
 
     av_log(obj, AV_LOG_ERROR, "Invalid option type.\n");
@@ -855,6 +870,12 @@
         i64 = *(int64_t *)dst;
         ret = snprintf(buf, sizeof(buf), "0x%"PRIx64, i64);
         break;
+    case AV_OPT_TYPE_DICT:
+        if (!*(AVDictionary **)dst && (search_flags & AV_OPT_ALLOW_NULL)) {
+            *out_val = NULL;
+            return 0;
+        }
+        return av_dict_get_string(*(AVDictionary **)dst, (char **)out_val, '=', ':');
     default:
         return AVERROR(EINVAL);
     }
@@ -1034,6 +1055,23 @@
     return res & flag->default_val.i64;
 }
 
+static void log_int_value(void *av_log_obj, int level, int64_t i)
+{
+    if (i == INT_MAX) {
+        av_log(av_log_obj, level, "INT_MAX");
+    } else if (i == INT_MIN) {
+        av_log(av_log_obj, level, "INT_MIN");
+    } else if (i == UINT32_MAX) {
+        av_log(av_log_obj, level, "UINT32_MAX");
+    } else if (i == INT64_MAX) {
+        av_log(av_log_obj, level, "I64_MAX");
+    } else if (i == INT64_MIN) {
+        av_log(av_log_obj, level, "I64_MIN");
+    } else {
+        av_log(av_log_obj, level, "%"PRId64, i);
+    }
+}
+
 static void log_value(void *av_log_obj, int level, double d)
 {
     if      (d == INT_MAX) {
@@ -1102,7 +1140,7 @@
 }
 
 static void opt_list(void *obj, void *av_log_obj, const char *unit,
-                     int req_flags, int rej_flags)
+                     int req_flags, int rej_flags, enum AVOptionType parent_type)
 {
     const AVOption *opt = NULL;
     AVOptionRanges *r;
@@ -1157,6 +1195,9 @@
             case AV_OPT_TYPE_BINARY:
                 av_log(av_log_obj, AV_LOG_INFO, "%-12s ", "<binary>");
                 break;
+            case AV_OPT_TYPE_DICT:
+                av_log(av_log_obj, AV_LOG_INFO, "%-12s ", "<dictionary>");
+                break;
             case AV_OPT_TYPE_IMAGE_SIZE:
                 av_log(av_log_obj, AV_LOG_INFO, "%-12s ", "<image_size>");
                 break;
@@ -1182,6 +1223,11 @@
                 av_log(av_log_obj, AV_LOG_INFO, "%-12s ", "<boolean>");
                 break;
             case AV_OPT_TYPE_CONST:
+                if (parent_type == AV_OPT_TYPE_INT)
+                    av_log(av_log_obj, AV_LOG_INFO, "%-12"PRId64" ", opt->default_val.i64);
+                else
+                    av_log(av_log_obj, AV_LOG_INFO, "%-12s ", "");
+                break;
             default:
                 av_log(av_log_obj, AV_LOG_INFO, "%-12s ", "");
                 break;
@@ -1195,6 +1241,7 @@
         av_log(av_log_obj, AV_LOG_INFO, "%c", (opt->flags & AV_OPT_FLAG_EXPORT)         ? 'X' : '.');
         av_log(av_log_obj, AV_LOG_INFO, "%c", (opt->flags & AV_OPT_FLAG_READONLY)       ? 'R' : '.');
         av_log(av_log_obj, AV_LOG_INFO, "%c", (opt->flags & AV_OPT_FLAG_BSF_PARAM)      ? 'B' : '.');
+        av_log(av_log_obj, AV_LOG_INFO, "%c", (opt->flags & AV_OPT_FLAG_RUNTIME_PARAM)  ? 'T' : '.');
 
         if (opt->help)
             av_log(av_log_obj, AV_LOG_INFO, " %s", opt->help);
@@ -1224,6 +1271,7 @@
                 !((opt->type == AV_OPT_TYPE_COLOR      ||
                    opt->type == AV_OPT_TYPE_IMAGE_SIZE ||
                    opt->type == AV_OPT_TYPE_STRING     ||
+                   opt->type == AV_OPT_TYPE_DICT       ||
                    opt->type == AV_OPT_TYPE_VIDEO_RATE) &&
                   !opt->default_val.str)) {
             av_log(av_log_obj, AV_LOG_INFO, " (default ");
@@ -1254,7 +1302,7 @@
                 if (def_const)
                     av_log(av_log_obj, AV_LOG_INFO, "%s", def_const);
                 else
-                    log_value(av_log_obj, AV_LOG_INFO, opt->default_val.i64);
+                    log_int_value(av_log_obj, AV_LOG_INFO, opt->default_val.i64);
                 break;
             }
             case AV_OPT_TYPE_DOUBLE:
@@ -1274,6 +1322,7 @@
             case AV_OPT_TYPE_COLOR:
             case AV_OPT_TYPE_IMAGE_SIZE:
             case AV_OPT_TYPE_STRING:
+            case AV_OPT_TYPE_DICT:
             case AV_OPT_TYPE_VIDEO_RATE:
                 av_log(av_log_obj, AV_LOG_INFO, "\"%s\"", opt->default_val.str);
                 break;
@@ -1286,7 +1335,7 @@
 
         av_log(av_log_obj, AV_LOG_INFO, "\n");
         if (opt->unit && opt->type != AV_OPT_TYPE_CONST)
-            opt_list(obj, av_log_obj, opt->unit, req_flags, rej_flags);
+            opt_list(obj, av_log_obj, opt->unit, req_flags, rej_flags, opt->type);
     }
 }
 
@@ -1297,7 +1346,7 @@
 
     av_log(av_log_obj, AV_LOG_INFO, "%s AVOptions:\n", (*(AVClass **)obj)->class_name);
 
-    opt_list(obj, av_log_obj, NULL, req_flags, rej_flags);
+    opt_list(obj, av_log_obj, NULL, req_flags, rej_flags, -1);
 
     return 0;
 }
@@ -1363,8 +1412,8 @@
                 set_string_binary(s, opt, opt->default_val.str, dst);
                 break;
             case AV_OPT_TYPE_DICT:
-                /* Cannot set defaults for these types */
-            break;
+                set_string_dict(s, opt, opt->default_val.str, dst);
+                break;
         default:
             av_log(s, AV_LOG_DEBUG, "AVOption type %d of option %s not implemented yet\n",
                    opt->type, opt->name);
@@ -1948,9 +1997,23 @@
         av_free(tmp.data);
         return ret;
     }
-    case AV_OPT_TYPE_DICT:
-        /* Binary and dict have not default support yet. Any pointer is not default. */
-        return !!(*(void **)dst);
+    case AV_OPT_TYPE_DICT: {
+        AVDictionary *dict1 = NULL;
+        AVDictionary *dict2 = *(AVDictionary **)dst;
+        AVDictionaryEntry *en1 = NULL;
+        AVDictionaryEntry *en2 = NULL;
+        ret = av_dict_parse_string(&dict1, o->default_val.str, "=", ":", 0);
+        if (ret < 0) {
+            av_dict_free(&dict1);
+            return ret;
+        }
+        do {
+            en1 = av_dict_get(dict1, "", en1, AV_DICT_IGNORE_SUFFIX);
+            en2 = av_dict_get(dict2, "", en2, AV_DICT_IGNORE_SUFFIX);
+        } while (en1 && en2 && !strcmp(en1->key, en2->key) && !strcmp(en1->value, en2->value));
+        av_dict_free(&dict1);
+        return (!en1 && !en2);
+    }
     case AV_OPT_TYPE_IMAGE_SIZE:
         if (!o->default_val.str || !strcmp(o->default_val.str, "none"))
             w = h = 0;
diff --git a/libavutil/opt.h b/libavutil/opt.h
index 39f4a8d..1969c98 100644
--- a/libavutil/opt.h
+++ b/libavutil/opt.h
@@ -288,6 +288,7 @@
  */
 #define AV_OPT_FLAG_READONLY        128
 #define AV_OPT_FLAG_BSF_PARAM       (1<<8) ///< a generic parameter which can be set by the user for bit stream filtering
+#define AV_OPT_FLAG_RUNTIME_PARAM   (1<<15) ///< a generic parameter which can be set by the user at runtime
 #define AV_OPT_FLAG_FILTERING_PARAM (1<<16) ///< a generic parameter which can be set by the user for filtering
 #define AV_OPT_FLAG_DEPRECATED      (1<<17) ///< set if option is deprecated, users should refer to AVOption.help text for more information
 //FIXME think about enc-audio, ... style flags
@@ -669,6 +670,9 @@
  * scalars or named flags separated by '+' or '-'. Prefixing a flag
  * with '+' causes it to be set without affecting the other flags;
  * similarly, '-' unsets a flag.
+ * If the field is of a dictionary type, it has to be a ':' separated list of
+ * key=value parameters. Values containing ':' special characters must be
+ * escaped.
  * @param search_flags flags passed to av_opt_find2. I.e. if AV_OPT_SEARCH_CHILDREN
  * is passed here, then the option may be set on a child of obj.
  *
@@ -729,9 +733,10 @@
 /**
  * @note the returned string will be av_malloc()ed and must be av_free()ed by the caller
  *
- * @note if AV_OPT_ALLOW_NULL is set in search_flags in av_opt_get, and the option has
- * AV_OPT_TYPE_STRING or AV_OPT_TYPE_BINARY and is set to NULL, *out_val will be set
- * to NULL instead of an allocated empty string.
+ * @note if AV_OPT_ALLOW_NULL is set in search_flags in av_opt_get, and the
+ * option is of type AV_OPT_TYPE_STRING, AV_OPT_TYPE_BINARY or AV_OPT_TYPE_DICT
+ * and is set to NULL, *out_val will be set to NULL instead of an allocated
+ * empty string.
  */
 int av_opt_get         (void *obj, const char *name, int search_flags, uint8_t   **out_val);
 int av_opt_get_int     (void *obj, const char *name, int search_flags, int64_t    *out_val);
diff --git a/libavutil/parseutils.c b/libavutil/parseutils.c
index 59bec6c..167e822 100644
--- a/libavutil/parseutils.c
+++ b/libavutil/parseutils.c
@@ -504,7 +504,7 @@
         switch(c) {
         case 'H':
         case 'J':
-            val = date_get_num(&p, 0, c == 'H' ? 23 : INT_MAX, 2);
+            val = date_get_num(&p, 0, c == 'H' ? 23 : INT_MAX, c == 'H' ? 2 : 4);
 
             if (val == -1)
                 return NULL;
diff --git a/libavutil/pixdesc.c b/libavutil/pixdesc.c
index 970a832..9d61c52 100644
--- a/libavutil/pixdesc.c
+++ b/libavutil/pixdesc.c
@@ -31,19 +31,22 @@
 #include "intreadwrite.h"
 #include "version.h"
 
-void av_read_image_line(uint16_t *dst,
+void av_read_image_line2(void *dst,
                         const uint8_t *data[4], const int linesize[4],
                         const AVPixFmtDescriptor *desc,
                         int x, int y, int c, int w,
-                        int read_pal_component)
+                        int read_pal_component,
+                        int dst_element_size)
 {
     AVComponentDescriptor comp = desc->comp[c];
     int plane = comp.plane;
     int depth = comp.depth;
-    int mask  = (1 << depth) - 1;
+    unsigned mask  = (1ULL << depth) - 1;
     int shift = comp.shift;
     int step  = comp.step;
     int flags = desc->flags;
+    uint16_t *dst16 = dst;
+    uint32_t *dst32 = dst;
 
     if (flags & AV_PIX_FMT_FLAG_BITSTREAM) {
         int skip = x * step + comp.offset;
@@ -57,38 +60,56 @@
             shift -= step;
             p -= shift >> 3;
             shift &= 7;
-            *dst++ = val;
+            if (dst_element_size == 4) *dst32++ = val;
+            else                       *dst16++ = val;
         }
     } else {
         const uint8_t *p = data[plane] + y * linesize[plane] +
                            x * step + comp.offset;
         int is_8bit = shift + depth <= 8;
+        int is_16bit= shift + depth <=16;
 
         if (is_8bit)
             p += !!(flags & AV_PIX_FMT_FLAG_BE);
 
         while (w--) {
-            int val = is_8bit ? *p :
-                flags & AV_PIX_FMT_FLAG_BE ? AV_RB16(p) : AV_RL16(p);
+            unsigned val;
+            if     (is_8bit)  val = *p;
+            else if(is_16bit) val = flags & AV_PIX_FMT_FLAG_BE ? AV_RB16(p) : AV_RL16(p);
+            else              val = flags & AV_PIX_FMT_FLAG_BE ? AV_RB32(p) : AV_RL32(p);
             val = (val >> shift) & mask;
             if (read_pal_component)
                 val = data[1][4 * val + c];
             p += step;
-            *dst++ = val;
+            if (dst_element_size == 4) *dst32++ = val;
+            else                       *dst16++ = val;
         }
     }
 }
 
-void av_write_image_line(const uint16_t *src,
+void av_read_image_line(uint16_t *dst,
+                        const uint8_t *data[4], const int linesize[4],
+                        const AVPixFmtDescriptor *desc,
+                        int x, int y, int c, int w,
+                        int read_pal_component)
+{
+    av_read_image_line2(dst, data, linesize, desc,x, y, c, w,
+                        read_pal_component,
+                        2);
+}
+
+void av_write_image_line2(const void *src,
                          uint8_t *data[4], const int linesize[4],
                          const AVPixFmtDescriptor *desc,
-                         int x, int y, int c, int w)
+                         int x, int y, int c, int w, int src_element_size)
 {
     AVComponentDescriptor comp = desc->comp[c];
     int plane = comp.plane;
     int depth = comp.depth;
     int step  = comp.step;
     int flags = desc->flags;
+    const uint32_t *src32 = src;
+    const uint16_t *src16 = src;
 
     if (flags & AV_PIX_FMT_FLAG_BITSTREAM) {
         int skip = x * step + comp.offset;
@@ -96,7 +117,7 @@
         int shift = 8 - depth - (skip & 7);
 
         while (w--) {
-            *p |= *src++ << shift;
+            *p |= (src_element_size == 4 ? *src32++ : *src16++) << shift;
             shift -= step;
             p -= shift >> 3;
             shift &= 7;
@@ -109,17 +130,28 @@
         if (shift + depth <= 8) {
             p += !!(flags & AV_PIX_FMT_FLAG_BE);
             while (w--) {
-                *p |= (*src++ << shift);
+                *p |= ((src_element_size == 4 ? *src32++ : *src16++) << shift);
                 p += step;
             }
         } else {
             while (w--) {
-                if (flags & AV_PIX_FMT_FLAG_BE) {
-                    uint16_t val = AV_RB16(p) | (*src++ << shift);
-                    AV_WB16(p, val);
+                unsigned s = (src_element_size == 4 ? *src32++ : *src16++);
+                if (shift + depth <= 16) {
+                    if (flags & AV_PIX_FMT_FLAG_BE) {
+                        uint16_t val = AV_RB16(p) | (s << shift);
+                        AV_WB16(p, val);
+                    } else {
+                        uint16_t val = AV_RL16(p) | (s << shift);
+                        AV_WL16(p, val);
+                    }
                 } else {
-                    uint16_t val = AV_RL16(p) | (*src++ << shift);
-                    AV_WL16(p, val);
+                    if (flags & AV_PIX_FMT_FLAG_BE) {
+                        uint32_t val = AV_RB32(p) | (s << shift);
+                        AV_WB32(p, val);
+                    } else {
+                        uint32_t val = AV_RL32(p) | (s << shift);
+                        AV_WL32(p, val);
+                    }
                 }
                 p += step;
             }
@@ -127,6 +159,14 @@
     }
 }
 
+void av_write_image_line(const uint16_t *src,
+                         uint8_t *data[4], const int linesize[4],
+                         const AVPixFmtDescriptor *desc,
+                         int x, int y, int c, int w)
+{
+    av_write_image_line2(src, data, linesize, desc, x, y, c, w, 2);
+}
+
 #if FF_API_PLUS1_MINUS1
 FF_DISABLE_DEPRECATION_WARNINGS
 #endif
@@ -165,6 +205,29 @@
             { 0, 4, 1, 0, 8, 3, 7, 2 },        /* V */
         },
     },
+    [AV_PIX_FMT_Y210LE] = {
+        .name = "y210le",
+        .nb_components = 3,
+        .log2_chroma_w = 1,
+        .log2_chroma_h = 0,
+        .comp = {
+            { 0, 4, 0, 6, 10, 3, 9, 1 },        /* Y */
+            { 0, 8, 2, 6, 10, 7, 9, 3 },        /* U */
+            { 0, 8, 6, 6, 10, 7, 9, 7 },        /* V */
+        },
+    },
+    [AV_PIX_FMT_Y210BE] = {
+        .name = "y210be",
+        .nb_components = 3,
+        .log2_chroma_w = 1,
+        .log2_chroma_h = 0,
+        .comp = {
+            { 0, 4, 0, 6, 10, 3, 9, 1 },        /* Y */
+            { 0, 8, 2, 6, 10, 7, 9, 3 },        /* U */
+            { 0, 8, 6, 6, 10, 7, 9, 7 },        /* V */
+        },
+        .flags = AV_PIX_FMT_FLAG_BE,
+    },
     [AV_PIX_FMT_RGB24] = {
         .name = "rgb24",
         .nb_components = 3,
@@ -2228,6 +2291,86 @@
         .flags = AV_PIX_FMT_FLAG_FLOAT,
         .alias = "yf32le",
     },
+    [AV_PIX_FMT_YUVA422P12BE] = {
+        .name = "yuva422p12be",
+        .nb_components = 4,
+        .log2_chroma_w = 1,
+        .log2_chroma_h = 0,
+        .comp = {
+            { 0, 2, 0, 0, 12, 1, 11, 1 },        /* Y */
+            { 1, 2, 0, 0, 12, 1, 11, 1 },        /* U */
+            { 2, 2, 0, 0, 12, 1, 11, 1 },        /* V */
+            { 3, 2, 0, 0, 12, 1, 11, 1 },        /* A */
+        },
+        .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
+    },
+    [AV_PIX_FMT_YUVA422P12LE] = {
+        .name = "yuva422p12le",
+        .nb_components = 4,
+        .log2_chroma_w = 1,
+        .log2_chroma_h = 0,
+        .comp = {
+            { 0, 2, 0, 0, 12, 1, 11, 1 },        /* Y */
+            { 1, 2, 0, 0, 12, 1, 11, 1 },        /* U */
+            { 2, 2, 0, 0, 12, 1, 11, 1 },        /* V */
+            { 3, 2, 0, 0, 12, 1, 11, 1 },        /* A */
+        },
+        .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
+    },
+    [AV_PIX_FMT_YUVA444P12BE] = {
+        .name = "yuva444p12be",
+        .nb_components = 4,
+        .log2_chroma_w = 0,
+        .log2_chroma_h = 0,
+        .comp = {
+            { 0, 2, 0, 0, 12, 1, 11, 1 },        /* Y */
+            { 1, 2, 0, 0, 12, 1, 11, 1 },        /* U */
+            { 2, 2, 0, 0, 12, 1, 11, 1 },        /* V */
+            { 3, 2, 0, 0, 12, 1, 11, 1 },        /* A */
+        },
+        .flags = AV_PIX_FMT_FLAG_BE | AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
+    },
+    [AV_PIX_FMT_YUVA444P12LE] = {
+        .name = "yuva444p12le",
+        .nb_components = 4,
+        .log2_chroma_w = 0,
+        .log2_chroma_h = 0,
+        .comp = {
+            { 0, 2, 0, 0, 12, 1, 11, 1 },        /* Y */
+            { 1, 2, 0, 0, 12, 1, 11, 1 },        /* U */
+            { 2, 2, 0, 0, 12, 1, 11, 1 },        /* V */
+            { 3, 2, 0, 0, 12, 1, 11, 1 },        /* A */
+        },
+        .flags = AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_ALPHA,
+    },
+    [AV_PIX_FMT_NV24] = {
+        .name = "nv24",
+        .nb_components = 3,
+        .log2_chroma_w = 0,
+        .log2_chroma_h = 0,
+        .comp = {
+            { 0, 1, 0, 0, 8, 0, 7, 1 },        /* Y */
+            { 1, 2, 0, 0, 8, 1, 7, 1 },        /* U */
+            { 1, 2, 1, 0, 8, 1, 7, 2 },        /* V */
+        },
+        .flags = AV_PIX_FMT_FLAG_PLANAR,
+    },
+    [AV_PIX_FMT_NV42] = {
+        .name = "nv42",
+        .nb_components = 3,
+        .log2_chroma_w = 0,
+        .log2_chroma_h = 0,
+        .comp = {
+            { 0, 1, 0, 0, 8, 0, 7, 1 },        /* Y */
+            { 1, 2, 1, 0, 8, 1, 7, 2 },        /* U */
+            { 1, 2, 0, 0, 8, 1, 7, 1 },        /* V */
+        },
+        .flags = AV_PIX_FMT_FLAG_PLANAR,
+    },
+    [AV_PIX_FMT_VULKAN] = {
+        .name = "vulkan",
+        .flags = AV_PIX_FMT_FLAG_HWACCEL,
+    },
 };
 #if FF_API_PLUS1_MINUS1
 FF_ENABLE_DEPRECATION_WARNINGS
@@ -2253,7 +2396,7 @@
     [AVCOL_PRI_SMPTE428] = "smpte428",
     [AVCOL_PRI_SMPTE431] = "smpte431",
     [AVCOL_PRI_SMPTE432] = "smpte432",
-    [AVCOL_PRI_JEDEC_P22] = "jedec-p22",
+    [AVCOL_PRI_EBU3213] = "ebu3213",
 };
 
 static const char * const color_transfer_names[] = {
diff --git a/libavutil/pixdesc.h b/libavutil/pixdesc.h
index 4f9c5a2..c055810 100644
--- a/libavutil/pixdesc.h
+++ b/libavutil/pixdesc.h
@@ -343,7 +343,13 @@
  * format writes the values corresponding to the palette
  * component c in data[1] to dst, rather than the palette indexes in
  * data[0]. The behavior is undefined if the format is not paletted.
+ * @param dst_element_size size of elements in dst array (2 or 4 byte)
  */
+void av_read_image_line2(void *dst, const uint8_t *data[4],
+                        const int linesize[4], const AVPixFmtDescriptor *desc,
+                        int x, int y, int c, int w, int read_pal_component,
+                        int dst_element_size);
+
 void av_read_image_line(uint16_t *dst, const uint8_t *data[4],
                         const int linesize[4], const AVPixFmtDescriptor *desc,
                         int x, int y, int c, int w, int read_pal_component);
@@ -361,7 +367,12 @@
  * @param y the vertical coordinate of the first pixel to write
  * @param w the width of the line to write, that is the number of
  * values to write to the image line
+ * @param src_element_size size of elements in src array (2 or 4 byte)
  */
+void av_write_image_line2(const void *src, uint8_t *data[4],
+                         const int linesize[4], const AVPixFmtDescriptor *desc,
+                         int x, int y, int c, int w, int src_element_size);
+
 void av_write_image_line(const uint16_t *src, uint8_t *data[4],
                          const int linesize[4], const AVPixFmtDescriptor *desc,
                          int x, int y, int c, int w);
diff --git a/libavutil/pixfmt.h b/libavutil/pixfmt.h
index 6815f8d..1c625cf 100644
--- a/libavutil/pixfmt.h
+++ b/libavutil/pixfmt.h
@@ -257,18 +257,18 @@
     AV_PIX_FMT_GBRP14LE,    ///< planar GBR 4:4:4 42bpp, little-endian
     AV_PIX_FMT_YUVJ411P,    ///< planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples) full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV411P and setting color_range
 
-    AV_PIX_FMT_BAYER_BGGR8,    ///< bayer, BGBG..(odd line), GRGR..(even line), 8-bit samples */
-    AV_PIX_FMT_BAYER_RGGB8,    ///< bayer, RGRG..(odd line), GBGB..(even line), 8-bit samples */
-    AV_PIX_FMT_BAYER_GBRG8,    ///< bayer, GBGB..(odd line), RGRG..(even line), 8-bit samples */
-    AV_PIX_FMT_BAYER_GRBG8,    ///< bayer, GRGR..(odd line), BGBG..(even line), 8-bit samples */
-    AV_PIX_FMT_BAYER_BGGR16LE, ///< bayer, BGBG..(odd line), GRGR..(even line), 16-bit samples, little-endian */
-    AV_PIX_FMT_BAYER_BGGR16BE, ///< bayer, BGBG..(odd line), GRGR..(even line), 16-bit samples, big-endian */
-    AV_PIX_FMT_BAYER_RGGB16LE, ///< bayer, RGRG..(odd line), GBGB..(even line), 16-bit samples, little-endian */
-    AV_PIX_FMT_BAYER_RGGB16BE, ///< bayer, RGRG..(odd line), GBGB..(even line), 16-bit samples, big-endian */
-    AV_PIX_FMT_BAYER_GBRG16LE, ///< bayer, GBGB..(odd line), RGRG..(even line), 16-bit samples, little-endian */
-    AV_PIX_FMT_BAYER_GBRG16BE, ///< bayer, GBGB..(odd line), RGRG..(even line), 16-bit samples, big-endian */
-    AV_PIX_FMT_BAYER_GRBG16LE, ///< bayer, GRGR..(odd line), BGBG..(even line), 16-bit samples, little-endian */
-    AV_PIX_FMT_BAYER_GRBG16BE, ///< bayer, GRGR..(odd line), BGBG..(even line), 16-bit samples, big-endian */
+    AV_PIX_FMT_BAYER_BGGR8,    ///< bayer, BGBG..(odd line), GRGR..(even line), 8-bit samples
+    AV_PIX_FMT_BAYER_RGGB8,    ///< bayer, RGRG..(odd line), GBGB..(even line), 8-bit samples
+    AV_PIX_FMT_BAYER_GBRG8,    ///< bayer, GBGB..(odd line), RGRG..(even line), 8-bit samples
+    AV_PIX_FMT_BAYER_GRBG8,    ///< bayer, GRGR..(odd line), BGBG..(even line), 8-bit samples
+    AV_PIX_FMT_BAYER_BGGR16LE, ///< bayer, BGBG..(odd line), GRGR..(even line), 16-bit samples, little-endian
+    AV_PIX_FMT_BAYER_BGGR16BE, ///< bayer, BGBG..(odd line), GRGR..(even line), 16-bit samples, big-endian
+    AV_PIX_FMT_BAYER_RGGB16LE, ///< bayer, RGRG..(odd line), GBGB..(even line), 16-bit samples, little-endian
+    AV_PIX_FMT_BAYER_RGGB16BE, ///< bayer, RGRG..(odd line), GBGB..(even line), 16-bit samples, big-endian
+    AV_PIX_FMT_BAYER_GBRG16LE, ///< bayer, GBGB..(odd line), RGRG..(even line), 16-bit samples, little-endian
+    AV_PIX_FMT_BAYER_GBRG16BE, ///< bayer, GBGB..(odd line), RGRG..(even line), 16-bit samples, big-endian
+    AV_PIX_FMT_BAYER_GRBG16LE, ///< bayer, GRGR..(odd line), BGBG..(even line), 16-bit samples, little-endian
+    AV_PIX_FMT_BAYER_GRBG16BE, ///< bayer, GRGR..(odd line), BGBG..(even line), 16-bit samples, big-endian
 
     AV_PIX_FMT_XVMC,///< XVideo Motion Acceleration via common packet passing
 
@@ -340,6 +340,24 @@
     AV_PIX_FMT_GRAYF32BE,  ///< IEEE-754 single precision Y, 32bpp, big-endian
     AV_PIX_FMT_GRAYF32LE,  ///< IEEE-754 single precision Y, 32bpp, little-endian
 
+    AV_PIX_FMT_YUVA422P12BE, ///< planar YUV 4:2:2,24bpp, (1 Cr & Cb sample per 2x1 Y samples), 12b alpha, big-endian
+    AV_PIX_FMT_YUVA422P12LE, ///< planar YUV 4:2:2,24bpp, (1 Cr & Cb sample per 2x1 Y samples), 12b alpha, little-endian
+    AV_PIX_FMT_YUVA444P12BE, ///< planar YUV 4:4:4,36bpp, (1 Cr & Cb sample per 1x1 Y samples), 12b alpha, big-endian
+    AV_PIX_FMT_YUVA444P12LE, ///< planar YUV 4:4:4,36bpp, (1 Cr & Cb sample per 1x1 Y samples), 12b alpha, little-endian
+
+    AV_PIX_FMT_NV24,      ///< planar YUV 4:4:4, 24bpp, 1 plane for Y and 1 plane for the UV components, which are interleaved (first byte U and the following byte V)
+    AV_PIX_FMT_NV42,      ///< as above, but U and V bytes are swapped
+
+    /**
+     * Vulkan hardware images.
+     *
+     * data[0] points to an AVVkFrame
+     */
+    AV_PIX_FMT_VULKAN,
+
+    AV_PIX_FMT_Y210BE,    ///< packed YUV 4:2:2 like YUYV422, 20bpp, data in the high bits, big-endian
+    AV_PIX_FMT_Y210LE,    ///< packed YUV 4:2:2 like YUYV422, 20bpp, data in the high bits, little-endian
+
     AV_PIX_FMT_NB         ///< number of pixel formats, DO NOT USE THIS if you want to link with shared libav* because the number of formats might differ between versions
 };
 
@@ -416,6 +434,8 @@
 #define AV_PIX_FMT_YUVA420P10 AV_PIX_FMT_NE(YUVA420P10BE, YUVA420P10LE)
 #define AV_PIX_FMT_YUVA422P10 AV_PIX_FMT_NE(YUVA422P10BE, YUVA422P10LE)
 #define AV_PIX_FMT_YUVA444P10 AV_PIX_FMT_NE(YUVA444P10BE, YUVA444P10LE)
+#define AV_PIX_FMT_YUVA422P12 AV_PIX_FMT_NE(YUVA422P12BE, YUVA422P12LE)
+#define AV_PIX_FMT_YUVA444P12 AV_PIX_FMT_NE(YUVA444P12BE, YUVA444P12LE)
 #define AV_PIX_FMT_YUVA420P16 AV_PIX_FMT_NE(YUVA420P16BE, YUVA420P16LE)
 #define AV_PIX_FMT_YUVA422P16 AV_PIX_FMT_NE(YUVA422P16BE, YUVA422P16LE)
 #define AV_PIX_FMT_YUVA444P16 AV_PIX_FMT_NE(YUVA444P16BE, YUVA444P16LE)
@@ -426,6 +446,8 @@
 #define AV_PIX_FMT_P010       AV_PIX_FMT_NE(P010BE,  P010LE)
 #define AV_PIX_FMT_P016       AV_PIX_FMT_NE(P016BE,  P016LE)
 
+#define AV_PIX_FMT_Y210       AV_PIX_FMT_NE(Y210BE,  Y210LE)
+
 /**
   * Chromaticity coordinates of the source primaries.
   * These values match the ones defined by ISO/IEC 23001-8_2013 § 7.1.
@@ -446,7 +468,8 @@
     AVCOL_PRI_SMPTEST428_1 = AVCOL_PRI_SMPTE428,
     AVCOL_PRI_SMPTE431    = 11, ///< SMPTE ST 431-2 (2011) / DCI P3
     AVCOL_PRI_SMPTE432    = 12, ///< SMPTE ST 432-1 (2010) / P3 D65 / Display P3
-    AVCOL_PRI_JEDEC_P22   = 22, ///< JEDEC P22 phosphors
+    AVCOL_PRI_EBU3213     = 22, ///< EBU Tech. 3213-E / JEDEC P22 phosphors
+    AVCOL_PRI_JEDEC_P22   = AVCOL_PRI_EBU3213,
     AVCOL_PRI_NB                ///< Not part of ABI
 };
 
diff --git a/libavutil/ppc/cpu.c b/libavutil/ppc/cpu.c
index 7bb7cd8..b022149 100644
--- a/libavutil/ppc/cpu.c
+++ b/libavutil/ppc/cpu.c
@@ -93,13 +93,13 @@
                 if (buf[i + 1] & PPC_FEATURE_HAS_VSX)
                     ret |= AV_CPU_FLAG_VSX;
 #endif
-#ifdef PPC_FEATURE_ARCH_2_07
-                if (buf[i + 1] & PPC_FEATURE_HAS_POWER8)
-                    ret |= AV_CPU_FLAG_POWER8;
-#endif
                 if (ret & AV_CPU_FLAG_VSX)
                     av_assert0(ret & AV_CPU_FLAG_ALTIVEC);
-                goto out;
+            } else if (buf[i] == AT_HWCAP2) {
+#ifdef PPC_FEATURE2_ARCH_2_07
+                if (buf[i + 1] & PPC_FEATURE2_ARCH_2_07)
+                    ret |= AV_CPU_FLAG_POWER8;
+#endif
             }
         }
     }
diff --git a/libavutil/softfloat_ieee754.h b/libavutil/softfloat_ieee754.h
index b8957fb..3398aa1 100644
--- a/libavutil/softfloat_ieee754.h
+++ b/libavutil/softfloat_ieee754.h
@@ -64,7 +64,7 @@
  *  by the IEEE 754 spec.
  */
 static inline SoftFloat_IEEE754 av_bits2sf_ieee754(uint32_t n) {
-    return ((SoftFloat_IEEE754) { (n & 0x80000000UL), (n & 0x7FFFFFUL), (n & 0x7F800000UL) });
+    return ((SoftFloat_IEEE754) { (n & 0x80000000UL) >> 31, (n & 0x7FFFFFUL), (int8_t)((n & 0x7F800000UL) >> 23)});
 }
 
 /** Convert the softfloat to integer
diff --git a/libavutil/tests/opt.c b/libavutil/tests/opt.c
index f4cfa59..3134ffd 100644
--- a/libavutil/tests/opt.c
+++ b/libavutil/tests/opt.c
@@ -55,6 +55,8 @@
     int bool1;
     int bool2;
     int bool3;
+    AVDictionary *dict1;
+    AVDictionary *dict2;
 } TestContext;
 
 #define OFFSET(x) offsetof(TestContext, x)
@@ -89,6 +91,8 @@
     {"bool1",      "set boolean value",  OFFSET(bool1),          AV_OPT_TYPE_BOOL,           { .i64 = -1 },                    -1,         1, 1 },
     {"bool2",      "set boolean value",  OFFSET(bool2),          AV_OPT_TYPE_BOOL,           { .i64 = 1 },                     -1,         1, 1 },
     {"bool3",      "set boolean value",  OFFSET(bool3),          AV_OPT_TYPE_BOOL,           { .i64 = 0 },                      0,         1, 1 },
+    {"dict1",      "set dictionary value", OFFSET(dict1),        AV_OPT_TYPE_DICT,           { .str = NULL},                    0,         0, 1 },
+    {"dict2",      "set dictionary value", OFFSET(dict2),        AV_OPT_TYPE_DICT,           { .str = "happy=':-)'"},           0,         0, 1 },
     { NULL },
 };
 
@@ -167,6 +171,47 @@
         av_opt_free(&test_ctx);
     }
 
+    printf("\nTesting av_opt_get/av_opt_set()\n");
+    {
+        TestContext test_ctx = { 0 };
+        TestContext test2_ctx = { 0 };
+        const AVOption *o = NULL;
+        test_ctx.class = &test_class;
+        test2_ctx.class = &test_class;
+
+        av_log_set_level(AV_LOG_QUIET);
+
+        av_opt_set_defaults(&test_ctx);
+
+        while (o = av_opt_next(&test_ctx, o)) {
+            char *value1 = NULL;
+            char *value2 = NULL;
+            int ret1 = AVERROR_BUG;
+            int ret2 = AVERROR_BUG;
+            int ret3 = AVERROR_BUG;
+
+            if (o->type == AV_OPT_TYPE_CONST)
+                continue;
+
+            ret1 = av_opt_get(&test_ctx, o->name, 0, (uint8_t **)&value1);
+            if (ret1 >= 0) {
+                ret2 = av_opt_set(&test2_ctx, o->name, value1, 0);
+                if (ret2 >= 0)
+                    ret3 = av_opt_get(&test2_ctx, o->name, 0, (uint8_t **)&value2);
+            }
+
+            printf("name: %-11s get: %-16s set: %-16s get: %-16s %s\n", o->name,
+                    ret1 >= 0 ? value1 : av_err2str(ret1),
+                    ret2 >= 0 ? "OK" : av_err2str(ret2),
+                    ret3 >= 0 ? value2 : av_err2str(ret3),
+                    ret1 >= 0 && ret2 >= 0 && ret3 >= 0 && !strcmp(value1, value2) ? "OK" : "Mismatch");
+            av_free(value1);
+            av_free(value2);
+        }
+        av_opt_free(&test_ctx);
+        av_opt_free(&test2_ctx);
+    }
+
     printf("\nTest av_opt_serialize()\n");
     {
         TestContext test_ctx = { 0 };
@@ -256,6 +301,7 @@
             "dbl=101",
             "bool1=true",
             "bool2=auto",
+            "dict1='happy=\\:-):sad=\\:-('",
         };
 
         test_ctx.class = &test_class;
diff --git a/libavutil/tests/pixfmt_best.c b/libavutil/tests/pixfmt_best.c
index e98fcc1..53f7264 100644
--- a/libavutil/tests/pixfmt_best.c
+++ b/libavutil/tests/pixfmt_best.c
@@ -76,6 +76,7 @@
     TEST(AV_PIX_FMT_P010,      AV_PIX_FMT_YUV420P10);
     TEST(AV_PIX_FMT_P016,      AV_PIX_FMT_YUV420P16);
     TEST(AV_PIX_FMT_NV16,      AV_PIX_FMT_YUV422P);
+    TEST(AV_PIX_FMT_NV24,      AV_PIX_FMT_YUV444P);
     TEST(AV_PIX_FMT_YUYV422,   AV_PIX_FMT_YUV422P);
     TEST(AV_PIX_FMT_UYVY422,   AV_PIX_FMT_YUV422P);
     TEST(AV_PIX_FMT_BGR565,    AV_PIX_FMT_RGB565);
diff --git a/libavutil/tests/random_seed.c b/libavutil/tests/random_seed.c
index 78067db..bf0c6c7 100644
--- a/libavutil/tests/random_seed.c
+++ b/libavutil/tests/random_seed.c
@@ -47,7 +47,7 @@
             retry:;
         }
         if (retry >= 3) {
-            printf("rsf %d: FAIL at %d with %X\n", rsf, j, seeds[j]);
+            printf("rsf %d: FAIL at %d with %"PRIX32"\n", rsf, j, seeds[j]);
             return 1;
         }
     }
diff --git a/libavutil/thread.h b/libavutil/thread.h
index cc5272d..be5c4b1 100644
--- a/libavutil/thread.h
+++ b/libavutil/thread.h
@@ -33,16 +33,19 @@
 
 #include "log.h"
 
+#define ASSERT_PTHREAD_ABORT(func, ret) do {                            \
+    char errbuf[AV_ERROR_MAX_STRING_SIZE] = "";                         \
+    av_log(NULL, AV_LOG_FATAL, AV_STRINGIFY(func)                       \
+           " failed with error: %s\n",                                  \
+           av_make_error_string(errbuf, AV_ERROR_MAX_STRING_SIZE,       \
+                                AVERROR(ret)));                         \
+    abort();                                                            \
+} while (0)
+
 #define ASSERT_PTHREAD_NORET(func, ...) do {                            \
     int ret = func(__VA_ARGS__);                                        \
-    if (ret) {                                                          \
-        char errbuf[AV_ERROR_MAX_STRING_SIZE] = "";                     \
-        av_log(NULL, AV_LOG_FATAL, AV_STRINGIFY(func)                   \
-               " failed with error: %s\n",                              \
-               av_make_error_string(errbuf, AV_ERROR_MAX_STRING_SIZE,   \
-                                    AVERROR(ret)));                     \
-        abort();                                                        \
-    }                                                                   \
+    if (ret)                                                            \
+        ASSERT_PTHREAD_ABORT(func, ret);                                \
 } while (0)
 
 #define ASSERT_PTHREAD(func, ...) do {                                  \
@@ -109,6 +112,15 @@
     ASSERT_PTHREAD(pthread_cond_wait, cond, mutex);
 }
 
+static inline int strict_pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex,
+                                                const struct timespec *abstime)
+{
+    int ret = pthread_cond_timedwait(cond, mutex, abstime);
+    if (ret && ret != ETIMEDOUT)
+        ASSERT_PTHREAD_ABORT(pthread_cond_timedwait, ret);
+    return ret;
+}
+
 static inline int strict_pthread_once(pthread_once_t *once_control, void (*init_routine)(void))
 {
     ASSERT_PTHREAD(pthread_once, once_control, init_routine);
@@ -124,6 +136,7 @@
 #define pthread_cond_signal    strict_pthread_cond_signal
 #define pthread_cond_broadcast strict_pthread_cond_broadcast
 #define pthread_cond_wait      strict_pthread_cond_wait
+#define pthread_cond_timedwait strict_pthread_cond_timedwait
 #define pthread_once           strict_pthread_once
 #endif
 
diff --git a/libavutil/time_internal.h b/libavutil/time_internal.h
index 612a75a..d0f007a 100644
--- a/libavutil/time_internal.h
+++ b/libavutil/time_internal.h
@@ -23,7 +23,7 @@
 #include "config.h"
 
 #if !HAVE_GMTIME_R && !defined(gmtime_r)
-static inline struct tm *gmtime_r(const time_t* clock, struct tm *result)
+static inline struct tm *ff_gmtime_r(const time_t* clock, struct tm *result)
 {
     struct tm *ptr = gmtime(clock);
     if (!ptr)
@@ -31,10 +31,11 @@
     *result = *ptr;
     return result;
 }
+#define gmtime_r ff_gmtime_r
 #endif
 
 #if !HAVE_LOCALTIME_R && !defined(localtime_r)
-static inline struct tm *localtime_r(const time_t* clock, struct tm *result)
+static inline struct tm *ff_localtime_r(const time_t* clock, struct tm *result)
 {
     struct tm *ptr = localtime(clock);
     if (!ptr)
@@ -42,6 +43,7 @@
     *result = *ptr;
     return result;
 }
+#define localtime_r ff_localtime_r
 #endif
 
 #endif /* AVUTIL_TIME_INTERNAL_H */
diff --git a/libavutil/tx.c b/libavutil/tx.c
new file mode 100644
index 0000000..3b0568a
--- /dev/null
+++ b/libavutil/tx.c
@@ -0,0 +1,160 @@
+/*
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "tx_priv.h"
+
+int ff_tx_type_is_mdct(enum AVTXType type)
+{
+    switch (type) {
+    case AV_TX_FLOAT_MDCT:
+    case AV_TX_DOUBLE_MDCT:
+    case AV_TX_INT32_MDCT:
+        return 1;
+    default:
+        return 0;
+    }
+}
+
+/* Calculates the modular multiplicative inverse, not fast, replace */
+static av_always_inline int mulinv(int n, int m)
+{
+    n = n % m;
+    for (int x = 1; x < m; x++)
+        if (((n * x) % m) == 1)
+            return x;
+    av_assert0(0); /* Never reached */
+}
+
+/* Guaranteed to work for any n, m where gcd(n, m) == 1 */
+int ff_tx_gen_compound_mapping(AVTXContext *s)
+{
+    int *in_map, *out_map;
+    const int n     = s->n;
+    const int m     = s->m;
+    const int inv   = s->inv;
+    const int len   = n*m;
+    const int m_inv = mulinv(m, n);
+    const int n_inv = mulinv(n, m);
+    const int mdct  = ff_tx_type_is_mdct(s->type);
+
+    if (!(s->pfatab = av_malloc(2*len*sizeof(*s->pfatab))))
+        return AVERROR(ENOMEM);
+
+    in_map  = s->pfatab;
+    out_map = s->pfatab + n*m;
+
+    /* Ruritanian map for input, CRT map for output, can be swapped */
+    for (int j = 0; j < m; j++) {
+        for (int i = 0; i < n; i++) {
+            /* Shifted by 1 to simplify MDCTs */
+            in_map[j*n + i] = ((i*m + j*n) % len) << mdct;
+            out_map[(i*m*m_inv + j*n*n_inv) % len] = i*m + j;
+        }
+    }
+
+    /* Change transform direction by reversing all ACs */
+    if (inv) {
+        for (int i = 0; i < m; i++) {
+            int *in = &in_map[i*n + 1]; /* Skip the DC */
+            for (int j = 0; j < ((n - 1) >> 1); j++)
+                FFSWAP(int, in[j], in[n - j - 2]);
+        }
+    }
+
+    /* Our 15-point transform is also a compound one, so embed its input map */
+    if (n == 15) {
+        for (int k = 0; k < m; k++) {
+            int tmp[15];
+            memcpy(tmp, &in_map[k*15], 15*sizeof(*tmp));
+            for (int i = 0; i < 5; i++) {
+                for (int j = 0; j < 3; j++)
+                    in_map[k*15 + i*3 + j] = tmp[(i*3 + j*5) % 15];
+            }
+        }
+    }
+
+    return 0;
+}
+
+int ff_tx_gen_ptwo_revtab(AVTXContext *s)
+{
+    const int m = s->m, inv = s->inv;
+
+    if (!(s->revtab = av_malloc(m*sizeof(*s->revtab))))
+        return AVERROR(ENOMEM);
+
+    /* Default */
+    for (int i = 0; i < m; i++) {
+        int k = -split_radix_permutation(i, m, inv) & (m - 1);
+        s->revtab[k] = i;
+    }
+
+    return 0;
+}
+
+av_cold void av_tx_uninit(AVTXContext **ctx)
+{
+    if (!(*ctx))
+        return;
+
+    av_free((*ctx)->pfatab);
+    av_free((*ctx)->exptab);
+    av_free((*ctx)->revtab);
+    av_free((*ctx)->tmp);
+
+    av_freep(ctx);
+}
+
+av_cold int av_tx_init(AVTXContext **ctx, av_tx_fn *tx, enum AVTXType type,
+                       int inv, int len, const void *scale, uint64_t flags)
+{
+    int err;
+    AVTXContext *s = av_mallocz(sizeof(*s));
+    if (!s)
+        return AVERROR(ENOMEM);
+
+    switch (type) {
+    case AV_TX_FLOAT_FFT:
+    case AV_TX_FLOAT_MDCT:
+        if ((err = ff_tx_init_mdct_fft_float(s, tx, type, inv, len, scale, flags)))
+            goto fail;
+        break;
+    case AV_TX_DOUBLE_FFT:
+    case AV_TX_DOUBLE_MDCT:
+        if ((err = ff_tx_init_mdct_fft_double(s, tx, type, inv, len, scale, flags)))
+            goto fail;
+        break;
+    case AV_TX_INT32_FFT:
+    case AV_TX_INT32_MDCT:
+        if ((err = ff_tx_init_mdct_fft_int32(s, tx, type, inv, len, scale, flags)))
+            goto fail;
+        break;
+    default:
+        err = AVERROR(EINVAL);
+        goto fail;
+    }
+
+    *ctx = s;
+
+    return 0;
+
+fail:
+    av_tx_uninit(&s);
+    *tx = NULL;
+    return err;
+}
diff --git a/libavutil/tx.h b/libavutil/tx.h
new file mode 100644
index 0000000..418e8ec
--- /dev/null
+++ b/libavutil/tx.h
@@ -0,0 +1,117 @@
+/*
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_TX_H
+#define AVUTIL_TX_H
+
+#include <stdint.h>
+#include <stddef.h>
+
+typedef struct AVTXContext AVTXContext;
+
+typedef struct AVComplexFloat {
+    float re, im;
+} AVComplexFloat;
+
+typedef struct AVComplexDouble {
+    double re, im;
+} AVComplexDouble;
+
+typedef struct AVComplexInt32 {
+    int32_t re, im;
+} AVComplexInt32;
+
+enum AVTXType {
+    /**
+     * Standard complex to complex FFT with sample data type AVComplexFloat.
+     * Output is not 1/len normalized. Scaling currently unsupported.
+     * The stride parameter is ignored.
+     */
+    AV_TX_FLOAT_FFT = 0,
+    /**
+     * Standard MDCT with sample data type of float and a scale type of
+     * float. Length is the frame size, not the window size (which is 2x frame)
+     * For forward transforms, the stride specifies the spacing between each
+     * sample in the output array in bytes. The input must be a flat array.
+     * For inverse transforms, the stride specifies the spacing between each
+     * sample in the input array in bytes. The output will be a flat array.
+     * Stride must be a non-zero multiple of sizeof(float).
+     */
+    AV_TX_FLOAT_MDCT = 1,
+    /**
+     * Same as AV_TX_FLOAT_FFT with a data type of AVComplexDouble.
+     */
+    AV_TX_DOUBLE_FFT = 2,
+    /**
+     * Same as AV_TX_FLOAT_MDCT with data and scale type of double.
+     * Stride must be a non-zero multiple of sizeof(double).
+     */
+    AV_TX_DOUBLE_MDCT = 3,
+    /**
+     * Same as AV_TX_FLOAT_FFT with a data type of AVComplexInt32.
+     */
+    AV_TX_INT32_FFT = 4,
+    /**
+     * Same as AV_TX_FLOAT_MDCT with data type of int32_t and scale type of float.
+     * Only scale values less than or equal to 1.0 are supported.
+     * Stride must be a non-zero multiple of sizeof(int32_t).
+     */
+    AV_TX_INT32_MDCT = 5,
+};
+
+/**
+ * Function pointer to a function to perform the transform.
+ *
+ * @note Using a different context than the one allocated during av_tx_init()
+ * is not allowed.
+ *
+ * @param s the transform context
+ * @param out the output array
+ * @param in the input array
+ * @param stride the input or output stride in bytes
+ *
+ * The out and in arrays must be aligned to the maximum required by the CPU
+ * architecture.
+ * The stride must follow the constraints the transform type has specified.
+ */
+typedef void (*av_tx_fn)(AVTXContext *s, void *out, void *in, ptrdiff_t stride);
+
+/**
+ * Initialize a transform context with the given configuration
+ * Currently power of two lengths from 2 to 131072 are supported, along with
+ * any length decomposable to a power of two and either 3, 5 or 15.
+ *
+ * @param ctx the context to allocate, will be NULL on error
+ * @param tx pointer to the transform function pointer to set
+ * @param type type the type of transform
+ * @param inv whether to do an inverse or a forward transform
+ * @param len the size of the transform in samples
+ * @param scale pointer to the value to scale the output if supported by type
+ * @param flags currently unused
+ *
+ * @return 0 on success, negative error code on failure
+ */
+int av_tx_init(AVTXContext **ctx, av_tx_fn *tx, enum AVTXType type,
+               int inv, int len, const void *scale, uint64_t flags);
+
+/**
+ * Frees a context and sets ctx to NULL, does nothing when ctx == NULL
+ */
+void av_tx_uninit(AVTXContext **ctx);
+
+#endif /* AVUTIL_TX_H */
diff --git a/libavfilter/scale.h b/libavutil/tx_double.c
similarity index 75%
copy from libavfilter/scale.h
copy to libavutil/tx_double.c
index dfe67d0..7ea4283 100644
--- a/libavfilter/scale.h
+++ b/libavutil/tx_double.c
@@ -16,13 +16,6 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
-#ifndef AVFILTER_SCALE_H
-#define AVFILTER_SCALE_H
-
-#include "avfilter.h"
-
-int ff_scale_eval_dimensions(void *ctx,
-    const char *w_expr, const char *h_expr,
-    AVFilterLink *inlink, AVFilterLink *outlink,
-    int *ret_w, int *ret_h);
-#endif
+#define TX_DOUBLE
+#include "tx_priv.h"
+#include "tx_template.c"
diff --git a/libavfilter/scale.h b/libavutil/tx_float.c
similarity index 75%
copy from libavfilter/scale.h
copy to libavutil/tx_float.c
index dfe67d0..018f2a2 100644
--- a/libavfilter/scale.h
+++ b/libavutil/tx_float.c
@@ -16,13 +16,6 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
-#ifndef AVFILTER_SCALE_H
-#define AVFILTER_SCALE_H
-
-#include "avfilter.h"
-
-int ff_scale_eval_dimensions(void *ctx,
-    const char *w_expr, const char *h_expr,
-    AVFilterLink *inlink, AVFilterLink *outlink,
-    int *ret_w, int *ret_h);
-#endif
+#define TX_FLOAT
+#include "tx_priv.h"
+#include "tx_template.c"
diff --git a/libavfilter/scale.h b/libavutil/tx_int32.c
similarity index 75%
copy from libavfilter/scale.h
copy to libavutil/tx_int32.c
index dfe67d0..9261013 100644
--- a/libavfilter/scale.h
+++ b/libavutil/tx_int32.c
@@ -16,13 +16,6 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
-#ifndef AVFILTER_SCALE_H
-#define AVFILTER_SCALE_H
-
-#include "avfilter.h"
-
-int ff_scale_eval_dimensions(void *ctx,
-    const char *w_expr, const char *h_expr,
-    AVFilterLink *inlink, AVFilterLink *outlink,
-    int *ret_w, int *ret_h);
-#endif
+#define TX_INT32
+#include "tx_priv.h"
+#include "tx_template.c"
diff --git a/libavutil/tx_priv.h b/libavutil/tx_priv.h
new file mode 100644
index 0000000..e0d980a
--- /dev/null
+++ b/libavutil/tx_priv.h
@@ -0,0 +1,154 @@
+/*
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_TX_PRIV_H
+#define AVUTIL_TX_PRIV_H
+
+#include "tx.h"
+#include <stddef.h>
+#include "thread.h"
+#include "mem.h"
+#include "avassert.h"
+#include "attributes.h"
+
+#ifdef TX_FLOAT
+#define TX_NAME(x) x ## _float
+#define SCALE_TYPE float
+typedef float FFTSample;
+typedef AVComplexFloat FFTComplex;
+#elif defined(TX_DOUBLE)
+#define TX_NAME(x) x ## _double
+#define SCALE_TYPE double
+typedef double FFTSample;
+typedef AVComplexDouble FFTComplex;
+#elif defined(TX_INT32)
+#define TX_NAME(x) x ## _int32
+#define SCALE_TYPE float
+typedef int32_t FFTSample;
+typedef AVComplexInt32 FFTComplex;
+#else
+typedef void FFTComplex;
+#endif
+
+#if defined(TX_FLOAT) || defined(TX_DOUBLE)
+
+#define CMUL(dre, dim, are, aim, bre, bim) do {                                \
+        (dre) = (are) * (bre) - (aim) * (bim);                                 \
+        (dim) = (are) * (bim) + (aim) * (bre);                                 \
+    } while (0)
+
+#define SMUL(dre, dim, are, aim, bre, bim) do {                                \
+        (dre) = (are) * (bre) - (aim) * (bim);                                 \
+        (dim) = (are) * (bim) - (aim) * (bre);                                 \
+    } while (0)
+
+#define RESCALE(x) (x)
+
+#define FOLD(a, b) ((a) + (b))
+
+#elif defined(TX_INT32)
+
+/* Properly rounds the result */
+#define CMUL(dre, dim, are, aim, bre, bim) do {                                \
+        int64_t accu;                                                          \
+        (accu)  = (int64_t)(bre) * (are);                                      \
+        (accu) -= (int64_t)(bim) * (aim);                                      \
+        (dre)   = (int)(((accu) + 0x40000000) >> 31);                          \
+        (accu)  = (int64_t)(bim) * (are);                                      \
+        (accu) += (int64_t)(bre) * (aim);                                      \
+        (dim)   = (int)(((accu) + 0x40000000) >> 31);                          \
+    } while (0)
+
+#define SMUL(dre, dim, are, aim, bre, bim) do {                                \
+        int64_t accu;                                                          \
+        (accu)  = (int64_t)(bre) * (are);                                      \
+        (accu) -= (int64_t)(bim) * (aim);                                      \
+        (dre)   = (int)(((accu) + 0x40000000) >> 31);                          \
+        (accu)  = (int64_t)(bim) * (are);                                      \
+        (accu) -= (int64_t)(bre) * (aim);                                      \
+        (dim)   = (int)(((accu) + 0x40000000) >> 31);                          \
+    } while (0)
+
+#define RESCALE(x) (lrintf((x) * 2147483648.0))
+
+#define FOLD(x, y) ((int)((x) + (unsigned)(y) + 32) >> 6)
+
+#endif
+
+#define BF(x, y, a, b) do {                                                    \
+        x = (a) - (b);                                                         \
+        y = (a) + (b);                                                         \
+    } while (0)
+
+#define CMUL3(c, a, b)                                                         \
+    CMUL((c).re, (c).im, (a).re, (a).im, (b).re, (b).im)
+
+#define COSTABLE(size) \
+    DECLARE_ALIGNED(32, FFTSample, TX_NAME(ff_cos_##size))[size/2]
+
+/* Used by asm, reorder with care */
+struct AVTXContext {
+    int n;              /* Nptwo part */
+    int m;              /* Ptwo part */
+    int inv;            /* Is inverted */
+    int type;           /* Type */
+
+    FFTComplex *exptab; /* MDCT exptab */
+    FFTComplex *tmp;    /* Temporary buffer needed for all compound transforms */
+    int        *pfatab; /* Input/Output mapping for compound transforms */
+    int        *revtab; /* Input mapping for power of two transforms */
+};
+
+/* Shared functions */
+int ff_tx_type_is_mdct(enum AVTXType type);
+int ff_tx_gen_compound_mapping(AVTXContext *s);
+int ff_tx_gen_ptwo_revtab(AVTXContext *s);
+
+/* Also used by SIMD init */
+static inline int split_radix_permutation(int i, int n, int inverse)
+{
+    int m;
+    if (n <= 2)
+        return i & 1;
+    m = n >> 1;
+    if (!(i & m))
+        return split_radix_permutation(i, m, inverse)*2;
+    m >>= 1;
+    if (inverse == !(i & m))
+        return split_radix_permutation(i, m, inverse)*4 + 1;
+    else
+        return split_radix_permutation(i, m, inverse)*4 - 1;
+}
+
+/* Templated functions */
+int ff_tx_init_mdct_fft_float(AVTXContext *s, av_tx_fn *tx,
+                              enum AVTXType type, int inv, int len,
+                              const void *scale, uint64_t flags);
+int ff_tx_init_mdct_fft_double(AVTXContext *s, av_tx_fn *tx,
+                               enum AVTXType type, int inv, int len,
+                               const void *scale, uint64_t flags);
+int ff_tx_init_mdct_fft_int32(AVTXContext *s, av_tx_fn *tx,
+                              enum AVTXType type, int inv, int len,
+                              const void *scale, uint64_t flags);
+
+typedef struct CosTabsInitOnce {
+    void (*func)(void);
+    AVOnce control;
+} CosTabsInitOnce;
+
+#endif /* AVUTIL_TX_PRIV_H */
diff --git a/libavutil/tx_template.c b/libavutil/tx_template.c
new file mode 100644
index 0000000..7f4ca2f
--- /dev/null
+++ b/libavutil/tx_template.c
@@ -0,0 +1,639 @@
+/*
+ * Copyright (c) 2019 Lynne <dev@lynne.ee>
+ * Power of two FFT:
+ * Copyright (c) 2008 Loren Merritt
+ * Copyright (c) 2002 Fabrice Bellard
+ * Partly based on libdjbfft by D. J. Bernstein
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/* All costabs for a type are defined here */
+COSTABLE(16);
+COSTABLE(32);
+COSTABLE(64);
+COSTABLE(128);
+COSTABLE(256);
+COSTABLE(512);
+COSTABLE(1024);
+COSTABLE(2048);
+COSTABLE(4096);
+COSTABLE(8192);
+COSTABLE(16384);
+COSTABLE(32768);
+COSTABLE(65536);
+COSTABLE(131072);
+DECLARE_ALIGNED(32, FFTComplex, TX_NAME(ff_cos_53))[4];
+
+static FFTSample * const cos_tabs[18] = {
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    TX_NAME(ff_cos_16),
+    TX_NAME(ff_cos_32),
+    TX_NAME(ff_cos_64),
+    TX_NAME(ff_cos_128),
+    TX_NAME(ff_cos_256),
+    TX_NAME(ff_cos_512),
+    TX_NAME(ff_cos_1024),
+    TX_NAME(ff_cos_2048),
+    TX_NAME(ff_cos_4096),
+    TX_NAME(ff_cos_8192),
+    TX_NAME(ff_cos_16384),
+    TX_NAME(ff_cos_32768),
+    TX_NAME(ff_cos_65536),
+    TX_NAME(ff_cos_131072),
+};
+
+static av_always_inline void init_cos_tabs_idx(int index)
+{
+    int m = 1 << index;
+    double freq = 2*M_PI/m;
+    FFTSample *tab = cos_tabs[index];
+    for(int i = 0; i <= m/4; i++)
+        tab[i] = RESCALE(cos(i*freq));
+    for(int i = 1; i < m/4; i++)
+        tab[m/2 - i] = tab[i];
+}
+
+#define INIT_FF_COS_TABS_FUNC(index, size)                                     \
+static av_cold void init_cos_tabs_ ## size (void)                              \
+{                                                                              \
+    init_cos_tabs_idx(index);                                                  \
+}
+
+INIT_FF_COS_TABS_FUNC(4, 16)
+INIT_FF_COS_TABS_FUNC(5, 32)
+INIT_FF_COS_TABS_FUNC(6, 64)
+INIT_FF_COS_TABS_FUNC(7, 128)
+INIT_FF_COS_TABS_FUNC(8, 256)
+INIT_FF_COS_TABS_FUNC(9, 512)
+INIT_FF_COS_TABS_FUNC(10, 1024)
+INIT_FF_COS_TABS_FUNC(11, 2048)
+INIT_FF_COS_TABS_FUNC(12, 4096)
+INIT_FF_COS_TABS_FUNC(13, 8192)
+INIT_FF_COS_TABS_FUNC(14, 16384)
+INIT_FF_COS_TABS_FUNC(15, 32768)
+INIT_FF_COS_TABS_FUNC(16, 65536)
+INIT_FF_COS_TABS_FUNC(17, 131072)
+
+static av_cold void ff_init_53_tabs(void)
+{
+    TX_NAME(ff_cos_53)[0] = (FFTComplex){ RESCALE(cos(2 * M_PI / 12)), RESCALE(cos(2 * M_PI / 12)) };
+    TX_NAME(ff_cos_53)[1] = (FFTComplex){ RESCALE(cos(2 * M_PI /  6)), RESCALE(cos(2 * M_PI /  6)) };
+    TX_NAME(ff_cos_53)[2] = (FFTComplex){ RESCALE(cos(2 * M_PI /  5)), RESCALE(sin(2 * M_PI /  5)) };
+    TX_NAME(ff_cos_53)[3] = (FFTComplex){ RESCALE(cos(2 * M_PI / 10)), RESCALE(sin(2 * M_PI / 10)) };
+}
+
+static CosTabsInitOnce cos_tabs_init_once[] = {
+    { ff_init_53_tabs, AV_ONCE_INIT },
+    { NULL },
+    { NULL },
+    { NULL },
+    { init_cos_tabs_16, AV_ONCE_INIT },
+    { init_cos_tabs_32, AV_ONCE_INIT },
+    { init_cos_tabs_64, AV_ONCE_INIT },
+    { init_cos_tabs_128, AV_ONCE_INIT },
+    { init_cos_tabs_256, AV_ONCE_INIT },
+    { init_cos_tabs_512, AV_ONCE_INIT },
+    { init_cos_tabs_1024, AV_ONCE_INIT },
+    { init_cos_tabs_2048, AV_ONCE_INIT },
+    { init_cos_tabs_4096, AV_ONCE_INIT },
+    { init_cos_tabs_8192, AV_ONCE_INIT },
+    { init_cos_tabs_16384, AV_ONCE_INIT },
+    { init_cos_tabs_32768, AV_ONCE_INIT },
+    { init_cos_tabs_65536, AV_ONCE_INIT },
+    { init_cos_tabs_131072, AV_ONCE_INIT },
+};
+
+static av_cold void init_cos_tabs(int index)
+{
+    ff_thread_once(&cos_tabs_init_once[index].control,
+                    cos_tabs_init_once[index].func);
+}
+
+static av_always_inline void fft3(FFTComplex *out, FFTComplex *in,
+                                  ptrdiff_t stride)
+{
+    FFTComplex tmp[2];
+#ifdef TX_INT32
+    int64_t mtmp[4];
+#endif
+
+    BF(tmp[0].re, tmp[1].im, in[1].im, in[2].im);
+    BF(tmp[0].im, tmp[1].re, in[1].re, in[2].re);
+
+    out[0*stride].re = in[0].re + tmp[1].re;
+    out[0*stride].im = in[0].im + tmp[1].im;
+
+#ifdef TX_INT32
+    mtmp[0] = (int64_t)TX_NAME(ff_cos_53)[0].re * tmp[0].re;
+    mtmp[1] = (int64_t)TX_NAME(ff_cos_53)[0].im * tmp[0].im;
+    mtmp[2] = (int64_t)TX_NAME(ff_cos_53)[1].re * tmp[1].re;
+    mtmp[3] = (int64_t)TX_NAME(ff_cos_53)[1].re * tmp[1].im;
+    out[1*stride].re = in[0].re - (mtmp[2] + mtmp[0] + 0x40000000 >> 31);
+    out[1*stride].im = in[0].im - (mtmp[3] - mtmp[1] + 0x40000000 >> 31);
+    out[2*stride].re = in[0].re - (mtmp[2] - mtmp[0] + 0x40000000 >> 31);
+    out[2*stride].im = in[0].im - (mtmp[3] + mtmp[1] + 0x40000000 >> 31);
+#else
+    tmp[0].re = TX_NAME(ff_cos_53)[0].re * tmp[0].re;
+    tmp[0].im = TX_NAME(ff_cos_53)[0].im * tmp[0].im;
+    tmp[1].re = TX_NAME(ff_cos_53)[1].re * tmp[1].re;
+    tmp[1].im = TX_NAME(ff_cos_53)[1].re * tmp[1].im;
+    out[1*stride].re = in[0].re - tmp[1].re + tmp[0].re;
+    out[1*stride].im = in[0].im - tmp[1].im - tmp[0].im;
+    out[2*stride].re = in[0].re - tmp[1].re - tmp[0].re;
+    out[2*stride].im = in[0].im - tmp[1].im + tmp[0].im;
+#endif
+}
+
+#define DECL_FFT5(NAME, D0, D1, D2, D3, D4)                                                       \
+static av_always_inline void NAME(FFTComplex *out, FFTComplex *in,                                \
+                                  ptrdiff_t stride)                                               \
+{                                                                                                 \
+    FFTComplex z0[4], t[6];                                                                       \
+                                                                                                  \
+    BF(t[1].im, t[0].re, in[1].re, in[4].re);                                                     \
+    BF(t[1].re, t[0].im, in[1].im, in[4].im);                                                     \
+    BF(t[3].im, t[2].re, in[2].re, in[3].re);                                                     \
+    BF(t[3].re, t[2].im, in[2].im, in[3].im);                                                     \
+                                                                                                  \
+    out[D0*stride].re = in[0].re + t[0].re + t[2].re;                                             \
+    out[D0*stride].im = in[0].im + t[0].im + t[2].im;                                             \
+                                                                                                  \
+    SMUL(t[4].re, t[0].re, TX_NAME(ff_cos_53)[2].re, TX_NAME(ff_cos_53)[3].re, t[2].re, t[0].re); \
+    SMUL(t[4].im, t[0].im, TX_NAME(ff_cos_53)[2].re, TX_NAME(ff_cos_53)[3].re, t[2].im, t[0].im); \
+    CMUL(t[5].re, t[1].re, TX_NAME(ff_cos_53)[2].im, TX_NAME(ff_cos_53)[3].im, t[3].re, t[1].re); \
+    CMUL(t[5].im, t[1].im, TX_NAME(ff_cos_53)[2].im, TX_NAME(ff_cos_53)[3].im, t[3].im, t[1].im); \
+                                                                                                  \
+    BF(z0[0].re, z0[3].re, t[0].re, t[1].re);                                                     \
+    BF(z0[0].im, z0[3].im, t[0].im, t[1].im);                                                     \
+    BF(z0[2].re, z0[1].re, t[4].re, t[5].re);                                                     \
+    BF(z0[2].im, z0[1].im, t[4].im, t[5].im);                                                     \
+                                                                                                  \
+    out[D1*stride].re = in[0].re + z0[3].re;                                                      \
+    out[D1*stride].im = in[0].im + z0[0].im;                                                      \
+    out[D2*stride].re = in[0].re + z0[2].re;                                                      \
+    out[D2*stride].im = in[0].im + z0[1].im;                                                      \
+    out[D3*stride].re = in[0].re + z0[1].re;                                                      \
+    out[D3*stride].im = in[0].im + z0[2].im;                                                      \
+    out[D4*stride].re = in[0].re + z0[0].re;                                                      \
+    out[D4*stride].im = in[0].im + z0[3].im;                                                      \
+}
+
+DECL_FFT5(fft5,     0,  1,  2,  3,  4)
+DECL_FFT5(fft5_m1,  0,  6, 12,  3,  9)
+DECL_FFT5(fft5_m2, 10,  1,  7, 13,  4)
+DECL_FFT5(fft5_m3,  5, 11,  2,  8, 14)
+
+static av_always_inline void fft15(FFTComplex *out, FFTComplex *in,
+                                   ptrdiff_t stride)
+{
+    FFTComplex tmp[15];
+
+    for (int i = 0; i < 5; i++)
+        fft3(tmp + i, in + i*3, 5);
+
+    fft5_m1(out, tmp +  0, stride);
+    fft5_m2(out, tmp +  5, stride);
+    fft5_m3(out, tmp + 10, stride);
+}
+
+#define BUTTERFLIES(a0,a1,a2,a3) {\
+    BF(t3, t5, t5, t1);\
+    BF(a2.re, a0.re, a0.re, t5);\
+    BF(a3.im, a1.im, a1.im, t3);\
+    BF(t4, t6, t2, t6);\
+    BF(a3.re, a1.re, a1.re, t4);\
+    BF(a2.im, a0.im, a0.im, t6);\
+}
+
+// force loading all the inputs before storing any.
+// this is slightly slower for small data, but avoids store->load aliasing
+// for addresses separated by large powers of 2.
+#define BUTTERFLIES_BIG(a0,a1,a2,a3) {\
+    FFTSample r0=a0.re, i0=a0.im, r1=a1.re, i1=a1.im;\
+    BF(t3, t5, t5, t1);\
+    BF(a2.re, a0.re, r0, t5);\
+    BF(a3.im, a1.im, i1, t3);\
+    BF(t4, t6, t2, t6);\
+    BF(a3.re, a1.re, r1, t4);\
+    BF(a2.im, a0.im, i0, t6);\
+}
+
+#define TRANSFORM(a0,a1,a2,a3,wre,wim) {\
+    CMUL(t1, t2, a2.re, a2.im, wre, -wim);\
+    CMUL(t5, t6, a3.re, a3.im, wre,  wim);\
+    BUTTERFLIES(a0,a1,a2,a3)\
+}
+
+#define TRANSFORM_ZERO(a0,a1,a2,a3) {\
+    t1 = a2.re;\
+    t2 = a2.im;\
+    t5 = a3.re;\
+    t6 = a3.im;\
+    BUTTERFLIES(a0,a1,a2,a3)\
+}
+
+/* z[0...8n-1], w[1...2n-1] */
+#define PASS(name)\
+static void name(FFTComplex *z, const FFTSample *wre, unsigned int n)\
+{\
+    FFTSample t1, t2, t3, t4, t5, t6;\
+    int o1 = 2*n;\
+    int o2 = 4*n;\
+    int o3 = 6*n;\
+    const FFTSample *wim = wre+o1;\
+    n--;\
+\
+    TRANSFORM_ZERO(z[0],z[o1],z[o2],z[o3]);\
+    TRANSFORM(z[1],z[o1+1],z[o2+1],z[o3+1],wre[1],wim[-1]);\
+    do {\
+        z += 2;\
+        wre += 2;\
+        wim -= 2;\
+        TRANSFORM(z[0],z[o1],z[o2],z[o3],wre[0],wim[0]);\
+        TRANSFORM(z[1],z[o1+1],z[o2+1],z[o3+1],wre[1],wim[-1]);\
+    } while(--n);\
+}
+
+PASS(pass)
+#undef BUTTERFLIES
+#define BUTTERFLIES BUTTERFLIES_BIG
+PASS(pass_big)
+
+#define DECL_FFT(n,n2,n4)\
+static void fft##n(FFTComplex *z)\
+{\
+    fft##n2(z);\
+    fft##n4(z+n4*2);\
+    fft##n4(z+n4*3);\
+    pass(z,TX_NAME(ff_cos_##n),n4/2);\
+}
+
+static void fft2(FFTComplex *z)
+{
+    FFTComplex tmp;
+    BF(tmp.re, z[0].re, z[0].re, z[1].re);
+    BF(tmp.im, z[0].im, z[0].im, z[1].im);
+    z[1] = tmp;
+}
+
+static void fft4(FFTComplex *z)
+{
+    FFTSample t1, t2, t3, t4, t5, t6, t7, t8;
+
+    BF(t3, t1, z[0].re, z[1].re);
+    BF(t8, t6, z[3].re, z[2].re);
+    BF(z[2].re, z[0].re, t1, t6);
+    BF(t4, t2, z[0].im, z[1].im);
+    BF(t7, t5, z[2].im, z[3].im);
+    BF(z[3].im, z[1].im, t4, t8);
+    BF(z[3].re, z[1].re, t3, t7);
+    BF(z[2].im, z[0].im, t2, t5);
+}
+
+static void fft8(FFTComplex *z)
+{
+    FFTSample t1, t2, t3, t4, t5, t6;
+
+    fft4(z);
+
+    BF(t1, z[5].re, z[4].re, -z[5].re);
+    BF(t2, z[5].im, z[4].im, -z[5].im);
+    BF(t5, z[7].re, z[6].re, -z[7].re);
+    BF(t6, z[7].im, z[6].im, -z[7].im);
+
+    BUTTERFLIES(z[0],z[2],z[4],z[6]);
+    TRANSFORM(z[1],z[3],z[5],z[7],RESCALE(M_SQRT1_2),RESCALE(M_SQRT1_2));
+}
+
+static void fft16(FFTComplex *z)
+{
+    FFTSample t1, t2, t3, t4, t5, t6;
+    FFTSample cos_16_1 = TX_NAME(ff_cos_16)[1];
+    FFTSample cos_16_3 = TX_NAME(ff_cos_16)[3];
+
+    fft8(z);
+    fft4(z+8);
+    fft4(z+12);
+
+    TRANSFORM_ZERO(z[0],z[4],z[8],z[12]);
+    TRANSFORM(z[2],z[6],z[10],z[14],RESCALE(M_SQRT1_2),RESCALE(M_SQRT1_2));
+    TRANSFORM(z[1],z[5],z[9],z[13],cos_16_1,cos_16_3);
+    TRANSFORM(z[3],z[7],z[11],z[15],cos_16_3,cos_16_1);
+}
+
+DECL_FFT(32,16,8)
+DECL_FFT(64,32,16)
+DECL_FFT(128,64,32)
+DECL_FFT(256,128,64)
+DECL_FFT(512,256,128)
+#define pass pass_big
+DECL_FFT(1024,512,256)
+DECL_FFT(2048,1024,512)
+DECL_FFT(4096,2048,1024)
+DECL_FFT(8192,4096,2048)
+DECL_FFT(16384,8192,4096)
+DECL_FFT(32768,16384,8192)
+DECL_FFT(65536,32768,16384)
+DECL_FFT(131072,65536,32768)
+
+static void (* const fft_dispatch[])(FFTComplex*) = {
+    NULL, fft2, fft4, fft8, fft16, fft32, fft64, fft128, fft256, fft512,
+    fft1024, fft2048, fft4096, fft8192, fft16384, fft32768, fft65536, fft131072
+};
+
+#define DECL_COMP_FFT(N)                                                       \
+static void compound_fft_##N##xM(AVTXContext *s, void *_out,                   \
+                                 void *_in, ptrdiff_t stride)                  \
+{                                                                              \
+    const int m = s->m, *in_map = s->pfatab, *out_map = in_map + N*m;          \
+    FFTComplex *in = _in;                                                      \
+    FFTComplex *out = _out;                                                    \
+    FFTComplex fft##N##in[N];                                                  \
+    void (*fftp)(FFTComplex *z) = fft_dispatch[av_log2(m)];                    \
+                                                                               \
+    for (int i = 0; i < m; i++) {                                              \
+        for (int j = 0; j < N; j++)                                            \
+            fft##N##in[j] = in[in_map[i*N + j]];                               \
+        fft##N(s->tmp + s->revtab[i], fft##N##in, m);                          \
+    }                                                                          \
+                                                                               \
+    for (int i = 0; i < N; i++)                                                \
+        fftp(s->tmp + m*i);                                                    \
+                                                                               \
+    for (int i = 0; i < N*m; i++)                                              \
+        out[i] = s->tmp[out_map[i]];                                           \
+}
+
+DECL_COMP_FFT(3)
+DECL_COMP_FFT(5)
+DECL_COMP_FFT(15)
+
+static void monolithic_fft(AVTXContext *s, void *_out, void *_in,
+                           ptrdiff_t stride)
+{
+    FFTComplex *in = _in;
+    FFTComplex *out = _out;
+    int m = s->m, mb = av_log2(m);
+    for (int i = 0; i < m; i++)
+        out[s->revtab[i]] = in[i];
+    fft_dispatch[mb](out);
+}
+
+#define DECL_COMP_IMDCT(N)                                                     \
+static void compound_imdct_##N##xM(AVTXContext *s, void *_dst, void *_src,     \
+                                   ptrdiff_t stride)                           \
+{                                                                              \
+    FFTComplex fft##N##in[N];                                                  \
+    FFTComplex *z = _dst, *exp = s->exptab;                                    \
+    const int m = s->m, len8 = N*m >> 1;                                       \
+    const int *in_map = s->pfatab, *out_map = in_map + N*m;                    \
+    const FFTSample *src = _src, *in1, *in2;                                   \
+    void (*fftp)(FFTComplex *) = fft_dispatch[av_log2(m)];                     \
+                                                                               \
+    stride /= sizeof(*src); /* To convert it from bytes */                     \
+    in1 = src;                                                                 \
+    in2 = src + ((N*m*2) - 1) * stride;                                        \
+                                                                               \
+    for (int i = 0; i < m; i++) {                                              \
+        for (int j = 0; j < N; j++) {                                          \
+            const int k = in_map[i*N + j];                                     \
+            FFTComplex tmp = { in2[-k*stride], in1[k*stride] };                \
+            CMUL3(fft##N##in[j], tmp, exp[k >> 1]);                            \
+        }                                                                      \
+        fft##N(s->tmp + s->revtab[i], fft##N##in, m);                          \
+    }                                                                          \
+                                                                               \
+    for (int i = 0; i < N; i++)                                                \
+        fftp(s->tmp + m*i);                                                    \
+                                                                               \
+    for (int i = 0; i < len8; i++) {                                           \
+        const int i0 = len8 + i, i1 = len8 - i - 1;                            \
+        const int s0 = out_map[i0], s1 = out_map[i1];                          \
+        FFTComplex src1 = { s->tmp[s1].im, s->tmp[s1].re };                    \
+        FFTComplex src0 = { s->tmp[s0].im, s->tmp[s0].re };                    \
+                                                                               \
+        CMUL(z[i1].re, z[i0].im, src1.re, src1.im, exp[i1].im, exp[i1].re);    \
+        CMUL(z[i0].re, z[i1].im, src0.re, src0.im, exp[i0].im, exp[i0].re);    \
+    }                                                                          \
+}
+
+DECL_COMP_IMDCT(3)
+DECL_COMP_IMDCT(5)
+DECL_COMP_IMDCT(15)
+
+#define DECL_COMP_MDCT(N)                                                      \
+static void compound_mdct_##N##xM(AVTXContext *s, void *_dst, void *_src,      \
+                                  ptrdiff_t stride)                            \
+{                                                                              \
+    FFTSample *src = _src, *dst = _dst;                                        \
+    FFTComplex *exp = s->exptab, tmp, fft##N##in[N];                           \
+    const int m = s->m, len4 = N*m, len3 = len4 * 3, len8 = len4 >> 1;         \
+    const int *in_map = s->pfatab, *out_map = in_map + N*m;                    \
+    void (*fftp)(FFTComplex *) = fft_dispatch[av_log2(m)];                     \
+                                                                               \
+    stride /= sizeof(*dst);                                                    \
+                                                                               \
+    for (int i = 0; i < m; i++) { /* Folding and pre-reindexing */             \
+        for (int j = 0; j < N; j++) {                                          \
+            const int k = in_map[i*N + j];                                     \
+            if (k < len4) {                                                    \
+                tmp.re = FOLD(-src[ len4 + k],  src[1*len4 - 1 - k]);          \
+                tmp.im = FOLD(-src[ len3 + k], -src[1*len3 - 1 - k]);          \
+            } else {                                                           \
+                tmp.re = FOLD(-src[ len4 + k], -src[5*len4 - 1 - k]);          \
+                tmp.im = FOLD( src[-len4 + k], -src[1*len3 - 1 - k]);          \
+            }                                                                  \
+            CMUL(fft##N##in[j].im, fft##N##in[j].re, tmp.re, tmp.im,           \
+                 exp[k >> 1].re, exp[k >> 1].im);                              \
+        }                                                                      \
+        fft##N(s->tmp + s->revtab[i], fft##N##in, m);                          \
+    }                                                                          \
+                                                                               \
+    for (int i = 0; i < N; i++)                                                \
+        fftp(s->tmp + m*i);                                                    \
+                                                                               \
+    for (int i = 0; i < len8; i++) {                                           \
+        const int i0 = len8 + i, i1 = len8 - i - 1;                            \
+        const int s0 = out_map[i0], s1 = out_map[i1];                          \
+        FFTComplex src1 = { s->tmp[s1].re, s->tmp[s1].im };                    \
+        FFTComplex src0 = { s->tmp[s0].re, s->tmp[s0].im };                    \
+                                                                               \
+        CMUL(dst[2*i1*stride + stride], dst[2*i0*stride], src0.re, src0.im,    \
+             exp[i0].im, exp[i0].re);                                          \
+        CMUL(dst[2*i0*stride + stride], dst[2*i1*stride], src1.re, src1.im,    \
+             exp[i1].im, exp[i1].re);                                          \
+    }                                                                          \
+}
+
+DECL_COMP_MDCT(3)
+DECL_COMP_MDCT(5)
+DECL_COMP_MDCT(15)
+
+static void monolithic_imdct(AVTXContext *s, void *_dst, void *_src,
+                             ptrdiff_t stride)
+{
+    FFTComplex *z = _dst, *exp = s->exptab;
+    const int m = s->m, len8 = m >> 1;
+    const FFTSample *src = _src, *in1, *in2;
+    void (*fftp)(FFTComplex *) = fft_dispatch[av_log2(m)];
+
+    stride /= sizeof(*src);
+    in1 = src;
+    in2 = src + ((m*2) - 1) * stride;
+
+    for (int i = 0; i < m; i++) {
+        FFTComplex tmp = { in2[-2*i*stride], in1[2*i*stride] };
+        CMUL3(z[s->revtab[i]], tmp, exp[i]);
+    }
+
+    fftp(z);
+
+    for (int i = 0; i < len8; i++) {
+        const int i0 = len8 + i, i1 = len8 - i - 1;
+        FFTComplex src1 = { z[i1].im, z[i1].re };
+        FFTComplex src0 = { z[i0].im, z[i0].re };
+
+        CMUL(z[i1].re, z[i0].im, src1.re, src1.im, exp[i1].im, exp[i1].re);
+        CMUL(z[i0].re, z[i1].im, src0.re, src0.im, exp[i0].im, exp[i0].re);
+    }
+}
+
+static void monolithic_mdct(AVTXContext *s, void *_dst, void *_src,
+                            ptrdiff_t stride)
+{
+    FFTSample *src = _src, *dst = _dst;
+    FFTComplex *exp = s->exptab, tmp, *z = _dst;
+    const int m = s->m, len4 = m, len3 = len4 * 3, len8 = len4 >> 1;
+    void (*fftp)(FFTComplex *) = fft_dispatch[av_log2(m)];
+
+    stride /= sizeof(*dst);
+
+    for (int i = 0; i < m; i++) { /* Folding and pre-reindexing */
+        const int k = 2*i;
+        if (k < len4) {
+            tmp.re = FOLD(-src[ len4 + k],  src[1*len4 - 1 - k]);
+            tmp.im = FOLD(-src[ len3 + k], -src[1*len3 - 1 - k]);
+        } else {
+            tmp.re = FOLD(-src[ len4 + k], -src[5*len4 - 1 - k]);
+            tmp.im = FOLD( src[-len4 + k], -src[1*len3 - 1 - k]);
+        }
+        CMUL(z[s->revtab[i]].im, z[s->revtab[i]].re, tmp.re, tmp.im,
+             exp[i].re, exp[i].im);
+    }
+
+    fftp(z);
+
+    for (int i = 0; i < len8; i++) {
+        const int i0 = len8 + i, i1 = len8 - i - 1;
+        FFTComplex src1 = { z[i1].re, z[i1].im };
+        FFTComplex src0 = { z[i0].re, z[i0].im };
+
+        CMUL(dst[2*i1*stride + stride], dst[2*i0*stride], src0.re, src0.im,
+             exp[i0].im, exp[i0].re);
+        CMUL(dst[2*i0*stride + stride], dst[2*i1*stride], src1.re, src1.im,
+             exp[i1].im, exp[i1].re);
+    }
+}
+
+static int gen_mdct_exptab(AVTXContext *s, int len4, double scale)
+{
+    const double theta = (scale < 0 ? len4 : 0) + 1.0/8.0;
+
+    if (!(s->exptab = av_malloc_array(len4, sizeof(*s->exptab))))
+        return AVERROR(ENOMEM);
+
+    scale = sqrt(fabs(scale));
+    for (int i = 0; i < len4; i++) {
+        const double alpha = M_PI_2 * (i + theta) / len4;
+        s->exptab[i].re = RESCALE(cos(alpha) * scale);
+        s->exptab[i].im = RESCALE(sin(alpha) * scale);
+    }
+
+    return 0;
+}
+
+int TX_NAME(ff_tx_init_mdct_fft)(AVTXContext *s, av_tx_fn *tx,
+                                 enum AVTXType type, int inv, int len,
+                                 const void *scale, uint64_t flags)
+{
+    const int is_mdct = ff_tx_type_is_mdct(type);
+    int err, n = 1, m = 1, max_ptwo = 1 << (FF_ARRAY_ELEMS(fft_dispatch) - 1);
+
+    if (is_mdct)
+        len >>= 1;
+
+#define CHECK_FACTOR(DST, FACTOR, SRC)                                         \
+    if (DST == 1 && !(SRC % FACTOR)) {                                         \
+        DST = FACTOR;                                                          \
+        SRC /= FACTOR;                                                         \
+    }
+    CHECK_FACTOR(n, 15, len)
+    CHECK_FACTOR(n,  5, len)
+    CHECK_FACTOR(n,  3, len)
+#undef CHECK_FACTOR
+
+    /* len must be a power of two now */
+    if (!(len & (len - 1)) && len >= 2 && len <= max_ptwo) {
+        m = len;
+        len = 1;
+    }
+
+    s->n = n;
+    s->m = m;
+    s->inv = inv;
+    s->type = type;
+
+    /* Filter out direct 3, 5 and 15 transforms, too niche */
+    if (len > 1 || m == 1) {
+        av_log(NULL, AV_LOG_ERROR, "Unsupported transform size: n = %i, "
+               "m = %i, residual = %i!\n", n, m, len);
+        return AVERROR(EINVAL);
+    } else if (n > 1 && m > 1) { /* 2D transform case */
+        if ((err = ff_tx_gen_compound_mapping(s)))
+            return err;
+        if (!(s->tmp = av_malloc(n*m*sizeof(*s->tmp))))
+            return AVERROR(ENOMEM);
+        *tx = n == 3 ? compound_fft_3xM :
+              n == 5 ? compound_fft_5xM :
+                       compound_fft_15xM;
+        if (is_mdct)
+            *tx = n == 3 ? inv ? compound_imdct_3xM  : compound_mdct_3xM :
+                  n == 5 ? inv ? compound_imdct_5xM  : compound_mdct_5xM :
+                           inv ? compound_imdct_15xM : compound_mdct_15xM;
+    } else { /* Direct transform case */
+        *tx = monolithic_fft;
+        if (is_mdct)
+            *tx = inv ? monolithic_imdct : monolithic_mdct;
+    }
+
+    if (n != 1)
+        init_cos_tabs(0);
+    if (m != 1) {
+        ff_tx_gen_ptwo_revtab(s);
+        for (int i = 4; i <= av_log2(m); i++)
+            init_cos_tabs(i);
+    }
+
+    if (is_mdct)
+        return gen_mdct_exptab(s, n*m, *((SCALE_TYPE *)scale));
+
+    return 0;
+}
diff --git a/libavutil/utils.c b/libavutil/utils.c
index 230081e..c1cd452 100644
--- a/libavutil/utils.c
+++ b/libavutil/utils.c
@@ -70,7 +70,7 @@
 const char *avutil_license(void)
 {
 #define LICENSE_PREFIX "libavutil license: "
-    return LICENSE_PREFIX FFMPEG_LICENSE + sizeof(LICENSE_PREFIX) - 1;
+    return &LICENSE_PREFIX FFMPEG_LICENSE[sizeof(LICENSE_PREFIX) - 1];
 }
 
 const char *av_get_media_type_string(enum AVMediaType media_type)
diff --git a/libavutil/version.h b/libavutil/version.h
index f84ec89..70836a5 100644
--- a/libavutil/version.h
+++ b/libavutil/version.h
@@ -79,8 +79,8 @@
  */
 
 #define LIBAVUTIL_VERSION_MAJOR  56
-#define LIBAVUTIL_VERSION_MINOR  19
-#define LIBAVUTIL_VERSION_MICRO 101
+#define LIBAVUTIL_VERSION_MINOR  42
+#define LIBAVUTIL_VERSION_MICRO 102
 
 #define LIBAVUTIL_VERSION_INT   AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \
                                                LIBAVUTIL_VERSION_MINOR, \
diff --git a/libavutil/x86/bswap.h b/libavutil/x86/bswap.h
index ffa59e4..b2f18b6 100644
--- a/libavutil/x86/bswap.h
+++ b/libavutil/x86/bswap.h
@@ -26,6 +26,7 @@
 
 #include <stdint.h>
 #if defined(_MSC_VER)
+#include <stdlib.h>
 #include <intrin.h>
 #endif
 #include "config.h"
diff --git a/libpostproc/version.h b/libpostproc/version.h
index f372548..08e2a31 100644
--- a/libpostproc/version.h
+++ b/libpostproc/version.h
@@ -29,7 +29,7 @@
 #include "libavutil/avutil.h"
 
 #define LIBPOSTPROC_VERSION_MAJOR  55
-#define LIBPOSTPROC_VERSION_MINOR   2
+#define LIBPOSTPROC_VERSION_MINOR   6
 #define LIBPOSTPROC_VERSION_MICRO 100
 
 #define LIBPOSTPROC_VERSION_INT AV_VERSION_INT(LIBPOSTPROC_VERSION_MAJOR, \
diff --git a/libswresample/audioconvert.c b/libswresample/audioconvert.c
index 96ce84a..d21fc8e 100644
--- a/libswresample/audioconvert.c
+++ b/libswresample/audioconvert.c
@@ -73,18 +73,18 @@
 CONV_FUNC(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_S64,  *(const int64_t*)pi>>48)
 CONV_FUNC(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_S64,  *(const int64_t*)pi>>32)
 CONV_FUNC(AV_SAMPLE_FMT_S64, int64_t, AV_SAMPLE_FMT_S64,  *(const int64_t*)pi)
-CONV_FUNC(AV_SAMPLE_FMT_FLT, float  , AV_SAMPLE_FMT_S64,  *(const int64_t*)pi*(1.0f/ (INT64_C(1)<<63)))
-CONV_FUNC(AV_SAMPLE_FMT_DBL, double , AV_SAMPLE_FMT_S64,  *(const int64_t*)pi*(1.0 / (INT64_C(1)<<63)))
+CONV_FUNC(AV_SAMPLE_FMT_FLT, float  , AV_SAMPLE_FMT_S64,  *(const int64_t*)pi*(1.0f/ (UINT64_C(1)<<63)))
+CONV_FUNC(AV_SAMPLE_FMT_DBL, double , AV_SAMPLE_FMT_S64,  *(const int64_t*)pi*(1.0 / (UINT64_C(1)<<63)))
 CONV_FUNC(AV_SAMPLE_FMT_U8 , uint8_t, AV_SAMPLE_FMT_FLT, av_clip_uint8(  lrintf(*(const float*)pi * (1<<7)) + 0x80))
 CONV_FUNC(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_FLT, av_clip_int16(  lrintf(*(const float*)pi * (1<<15))))
 CONV_FUNC(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_FLT, av_clipl_int32(llrintf(*(const float*)pi * (1U<<31))))
-CONV_FUNC(AV_SAMPLE_FMT_S64, int64_t, AV_SAMPLE_FMT_FLT, llrintf(*(const float*)pi * (INT64_C(1)<<63)))
+CONV_FUNC(AV_SAMPLE_FMT_S64, int64_t, AV_SAMPLE_FMT_FLT, llrintf(*(const float*)pi * (UINT64_C(1)<<63)))
 CONV_FUNC(AV_SAMPLE_FMT_FLT, float  , AV_SAMPLE_FMT_FLT, *(const float*)pi)
 CONV_FUNC(AV_SAMPLE_FMT_DBL, double , AV_SAMPLE_FMT_FLT, *(const float*)pi)
 CONV_FUNC(AV_SAMPLE_FMT_U8 , uint8_t, AV_SAMPLE_FMT_DBL, av_clip_uint8(  lrint(*(const double*)pi * (1<<7)) + 0x80))
 CONV_FUNC(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_DBL, av_clip_int16(  lrint(*(const double*)pi * (1<<15))))
 CONV_FUNC(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_DBL, av_clipl_int32(llrint(*(const double*)pi * (1U<<31))))
-CONV_FUNC(AV_SAMPLE_FMT_S64, int64_t, AV_SAMPLE_FMT_DBL, llrint(*(const double*)pi * (INT64_C(1)<<63)))
+CONV_FUNC(AV_SAMPLE_FMT_S64, int64_t, AV_SAMPLE_FMT_DBL, llrint(*(const double*)pi * (UINT64_C(1)<<63)))
 CONV_FUNC(AV_SAMPLE_FMT_FLT, float  , AV_SAMPLE_FMT_DBL, *(const double*)pi)
 CONV_FUNC(AV_SAMPLE_FMT_DBL, double , AV_SAMPLE_FMT_DBL, *(const double*)pi)
 
diff --git a/libswresample/swresample.c b/libswresample/swresample.c
index 6d28e6a..a7bb69d 100644
--- a/libswresample/swresample.c
+++ b/libswresample/swresample.c
@@ -46,7 +46,7 @@
 const char *swresample_license(void)
 {
 #define LICENSE_PREFIX "libswresample license: "
-    return LICENSE_PREFIX FFMPEG_LICENSE + sizeof(LICENSE_PREFIX) - 1;
+    return &LICENSE_PREFIX FFMPEG_LICENSE[sizeof(LICENSE_PREFIX) - 1];
 }
 
 int swr_set_channel_mapping(struct SwrContext *s, const int *channel_map){
@@ -164,6 +164,14 @@
         return AVERROR(EINVAL);
     }
 
+    if(s-> in_sample_rate <= 0){
+        av_log(s, AV_LOG_ERROR, "Requested input sample rate %d is invalid\n", s->in_sample_rate);
+        return AVERROR(EINVAL);
+    }
+    if(s->out_sample_rate <= 0){
+        av_log(s, AV_LOG_ERROR, "Requested output sample rate %d is invalid\n", s->out_sample_rate);
+        return AVERROR(EINVAL);
+    }
     s->out.ch_count  = s-> user_out_ch_count;
     s-> in.ch_count  = s->  user_in_ch_count;
     s->used_ch_count = s->user_used_ch_count;
diff --git a/libswresample/version.h b/libswresample/version.h
index b8b5bee..c079434 100644
--- a/libswresample/version.h
+++ b/libswresample/version.h
@@ -29,7 +29,7 @@
 #include "libavutil/avutil.h"
 
 #define LIBSWRESAMPLE_VERSION_MAJOR   3
-#define LIBSWRESAMPLE_VERSION_MINOR   2
+#define LIBSWRESAMPLE_VERSION_MINOR   6
 #define LIBSWRESAMPLE_VERSION_MICRO 100
 
 #define LIBSWRESAMPLE_VERSION_INT  AV_VERSION_INT(LIBSWRESAMPLE_VERSION_MAJOR, \
diff --git a/libswscale/aarch64/hscale.S b/libswscale/aarch64/hscale.S
index cc78c19..af55ffe 100644
--- a/libswscale/aarch64/hscale.S
+++ b/libswscale/aarch64/hscale.S
@@ -21,39 +21,60 @@
 #include "libavutil/aarch64/asm.S"
 
 function ff_hscale_8_to_15_neon, export=1
-        add                 x10, x4, w6, UXTW #1        // filter2 = filter + filterSize*2 (x2 because int16)
-1:      ldr                 w8, [x5], #4                // filterPos[0]
-        ldr                 w9, [x5], #4                // filterPos[1]
-        movi                v4.4S, #0                   // val sum part 1 (for dst[0])
-        movi                v5.4S, #0                   // val sum part 2 (for dst[1])
-        mov                 w7, w6                      // filterSize counter
-        mov                 x13, x3                     // srcp = src
-2:      add                 x11, x13, w8, UXTW          // srcp + filterPos[0]
-        add                 x12, x13, w9, UXTW          // srcp + filterPos[1]
-        ld1                 {v0.8B}, [x11]              // srcp[filterPos[0] + {0..7}]
-        ld1                 {v1.8B}, [x12]              // srcp[filterPos[1] + {0..7}]
-        ld1                 {v2.8H}, [x4],  #16         // load 8x16-bit filter values, part 1
-        ld1                 {v3.8H}, [x10], #16         // ditto at filter+filterSize for part 2
-        uxtl                v0.8H, v0.8B                // unpack part 1 to 16-bit
-        uxtl                v1.8H, v1.8B                // unpack part 2 to 16-bit
-        smull               v16.4S, v0.4H, v2.4H        // v16.i32{0..3} = part 1 of: srcp[filterPos[0] + {0..7}] * filter[{0..7}]
-        smull               v18.4S, v1.4H, v3.4H        // v18.i32{0..3} = part 1 of: srcp[filterPos[1] + {0..7}] * filter[{0..7}]
-        smull2              v17.4S, v0.8H, v2.8H        // v17.i32{0..3} = part 2 of: srcp[filterPos[0] + {0..7}] * filter[{0..7}]
-        smull2              v19.4S, v1.8H, v3.8H        // v19.i32{0..3} = part 2 of: srcp[filterPos[1] + {0..7}] * filter[{0..7}]
-        addp                v16.4S, v16.4S, v17.4S      // horizontal pair adding of the 8x32-bit multiplied values for part 1 into 4x32-bit
-        addp                v18.4S, v18.4S, v19.4S      // horizontal pair adding of the 8x32-bit multiplied values for part 2 into 4x32-bit
-        add                 v4.4S, v4.4S, v16.4S        // update val accumulator for part 1
-        add                 v5.4S, v5.4S, v18.4S        // update val accumulator for part 2
-        add                 x13, x13, #8                // srcp += 8
-        subs                w7, w7, #8                  // processed 8/filterSize
+        sbfiz               x7, x6, #1, #32             // filterSize*2 (*2 because int16)
+1:      ldr                 w8, [x5], #4                // filterPos[idx]
+        ldr                 w0, [x5], #4                // filterPos[idx + 1]
+        ldr                 w11, [x5], #4               // filterPos[idx + 2]
+        ldr                 w9, [x5], #4                // filterPos[idx + 3]
+        mov                 x16, x4                     // filter0 = filter
+        add                 x12, x16, x7                // filter1 = filter0 + filterSize*2
+        add                 x13, x12, x7                // filter2 = filter1 + filterSize*2
+        add                 x4, x13, x7                 // filter3 = filter2 + filterSize*2
+        movi                v0.2D, #0                   // val sum part 1 (for dst[0])
+        movi                v1.2D, #0                   // val sum part 2 (for dst[1])
+        movi                v2.2D, #0                   // val sum part 3 (for dst[2])
+        movi                v3.2D, #0                   // val sum part 4 (for dst[3])
+        add                 x17, x3, w8, UXTW           // srcp + filterPos[0]
+        add                 x8,  x3, w0, UXTW           // srcp + filterPos[1]
+        add                 x0, x3, w11, UXTW           // srcp + filterPos[2]
+        add                 x11, x3, w9, UXTW           // srcp + filterPos[3]
+        mov                 w15, w6                     // filterSize counter
+2:      ld1                 {v4.8B}, [x17], #8          // srcp[filterPos[0] + {0..7}]
+        ld1                 {v5.8H}, [x16], #16         // load 8x16-bit filter values, part 1
+        ld1                 {v6.8B}, [x8], #8           // srcp[filterPos[1] + {0..7}]
+        ld1                 {v7.8H}, [x12], #16         // load 8x16-bit at filter+filterSize
+        uxtl                v4.8H, v4.8B                // unpack part 1 to 16-bit
+        smlal               v0.4S, v4.4H, v5.4H         // v0 accumulates srcp[filterPos[0] + {0..3}] * filter[{0..3}]
+        smlal2              v0.4S, v4.8H, v5.8H         // v0 accumulates srcp[filterPos[0] + {4..7}] * filter[{4..7}]
+        ld1                 {v16.8B}, [x0], #8          // srcp[filterPos[2] + {0..7}]
+        ld1                 {v17.8H}, [x13], #16        // load 8x16-bit at filter+2*filterSize
+        uxtl                v6.8H, v6.8B                // unpack part 2 to 16-bit
+        smlal               v1.4S, v6.4H, v7.4H         // v1 accumulates srcp[filterPos[1] + {0..3}] * filter[{0..3}]
+        uxtl                v16.8H, v16.8B              // unpack part 3 to 16-bit
+        smlal               v2.4S, v16.4H, v17.4H       // v2 accumulates srcp[filterPos[2] + {0..3}] * filter[{0..3}]
+        smlal2              v2.4S, v16.8H, v17.8H       // v2 accumulates srcp[filterPos[2] + {4..7}] * filter[{4..7}]
+        ld1                 {v18.8B}, [x11], #8         // srcp[filterPos[3] + {0..7}]
+        smlal2              v1.4S, v6.8H, v7.8H         // v1 accumulates srcp[filterPos[1] + {4..7}] * filter[{4..7}]
+        ld1                 {v19.8H}, [x4], #16         // load 8x16-bit at filter+3*filterSize
+        subs                w15, w15, #8                // j -= 8: processed 8/filterSize
+        uxtl                v18.8H, v18.8B              // unpack part 4 to 16-bit
+        smlal               v3.4S, v18.4H, v19.4H       // v3 accumulates srcp[filterPos[3] + {0..3}] * filter[{0..3}]
+        smlal2              v3.4S, v18.8H, v19.8H       // v3 accumulates srcp[filterPos[3] + {4..7}] * filter[{4..7}]
         b.gt                2b                          // inner loop if filterSize not consumed completely
-        mov                 x4, x10                     // filter = filter2
-        add                 x10, x10, w6, UXTW #1       // filter2 += filterSize*2
-        addp                v4.4S, v4.4S, v5.4S         // horizontal pair adding of the 8x32-bit sums into 4x32-bit
-        addp                v4.4S, v4.4S, v4.4S         // horizontal pair adding of the 4x32-bit sums into 2x32-bit
-        sqshrn              v4.4H, v4.4S, #7            // shift and clip the 2x16-bit final values
-        st1                 {v4.S}[0], [x1], #4         // write to destination
-        subs                w2, w2, #2                  // dstW -= 2
+        addp                v0.4S, v0.4S, v0.4S         // part0 horizontal pair adding
+        addp                v1.4S, v1.4S, v1.4S         // part1 horizontal pair adding
+        addp                v2.4S, v2.4S, v2.4S         // part2 horizontal pair adding
+        addp                v3.4S, v3.4S, v3.4S         // part3 horizontal pair adding
+        addp                v0.4S, v0.4S, v0.4S         // part0 horizontal pair adding
+        addp                v1.4S, v1.4S, v1.4S         // part1 horizontal pair adding
+        addp                v2.4S, v2.4S, v2.4S         // part2 horizontal pair adding
+        addp                v3.4S, v3.4S, v3.4S         // part3 horizontal pair adding
+        zip1                v0.4S, v0.4S, v1.4S         // part01 = zip values from part0 and part1
+        zip1                v2.4S, v2.4S, v3.4S         // part23 = zip values from part2 and part3
+        mov                 v0.d[1], v2.d[0]            // part0123 = zip values from part01 and part23
+        subs                w2, w2, #4                  // dstW -= 4
+        sqshrn              v0.4H, v0.4S, #7            // shift and clip the 2x16-bit final values
+        st1                 {v0.4H}, [x1], #8           // write to destination part0123
         b.gt                1b                          // loop until end of line
         ret
 endfunc
diff --git a/libswscale/aarch64/output.S b/libswscale/aarch64/output.S
index 90d3b57..af71de6 100644
--- a/libswscale/aarch64/output.S
+++ b/libswscale/aarch64/output.S
@@ -38,29 +38,21 @@
         add                 x12, x12, x7, lsl #1            // &src[j+1][i]
         ld1                 {v5.8H}, [x11]                  // read 8x16-bit @ src[j  ][i + {0..7}]: A,B,C,D,E,F,G,H
         ld1                 {v6.8H}, [x12]                  // read 8x16-bit @ src[j+1][i + {0..7}]: I,J,K,L,M,N,O,P
-        ldr                 w11, [x10], #4                  // read 2x16-bit coeffs (X, Y) at (filter[j], filter[j+1])
-        zip1                v16.8H, v5.8H, v6.8H            // A,I,B,J,C,K,D,L
-        zip2                v17.8H, v5.8H, v6.8H            // E,M,F,N,F,O,H,P
-        dup                 v7.4S, w11                      // X,Y,X,Y,X,Y,X,Y
-        smull               v18.4S, v16.4H, v7.4H           // A.X I.Y B.X J.Y
-        smull               v20.4S, v17.4H, v7.4H           // E.X M.Y F.X N.Y
-        smull2              v19.4S, v16.8H, v7.8H           // C.X K.Y D.X L.Y
-        smull2              v21.4S, v17.8H, v7.8H           // G.X O.Y H.X P.Y
-        addp                v16.4S, v18.4S, v19.4S          // A.X+I.Y B.X+J.Y C.X+K.Y D.X+L.Y
-        addp                v17.4S, v20.4S, v21.4S          // E.X+M.Y F.X+N.Y F.X+O.Y H.X+P.Y
-        add                 v3.4S, v3.4S, v16.4S            // update val accumulator for part 1
-        add                 v4.4S, v4.4S, v17.4S            // update val accumulator for part 2
+        ld1r                {v7.8H}, [x10], #2              // read 1x16-bit coeff X at filter[j  ] and duplicate across lanes
+        ld1r                {v16.8H}, [x10], #2             // read 1x16-bit coeff Y at filter[j+1] and duplicate across lanes
+        smlal               v3.4S, v5.4H, v7.4H             // val0 += {A,B,C,D} * X
+        smlal2              v4.4S, v5.8H, v7.8H             // val1 += {E,F,G,H} * X
+        smlal               v3.4S, v6.4H, v16.4H            // val0 += {I,J,K,L} * Y
+        smlal2              v4.4S, v6.8H, v16.8H            // val1 += {M,N,O,P} * Y
         subs                w8, w8, #2                      // tmpfilterSize -= 2
         b.gt                3b                              // loop until filterSize consumed
-        sshr                v3.4S, v3.4S, #19               // val>>19 (part 1)
-        sshr                v4.4S, v4.4S, #19               // val>>19 (part 2)
-        sqxtun              v3.4H, v3.4S                    // clip16(val>>19) (part 1)
-        sqxtun              v4.4H, v4.4S                    // clip16(val>>19) (part 2)
-        mov                 v3.D[1], v4.D[0]                // merge part 1 and part 2
-        uqxtn               v3.8B, v3.8H                    // clip8(val>>19)
-        st1                 {v3.1D}, [x3], #8               // write to destination
-        add                 x7, x7, #8                      // i += 8
+
+        sqshrun             v3.4h, v3.4s, #16               // clip16(val0>>16)
+        sqshrun2            v3.8h, v4.4s, #16               // clip16(val1>>16)
+        uqshrn              v3.8b, v3.8h, #3                // clip8(val>>19)
+        st1                 {v3.8b}, [x3], #8               // write to destination
         subs                w4, w4, #8                      // dstW -= 8
+        add                 x7, x7, #8                      // i += 8
         b.gt                2b                              // loop until width consumed
         ret
 endfunc
diff --git a/libswscale/input.c b/libswscale/input.c
index 4099c19..099661c 100644
--- a/libswscale/input.c
+++ b/libswscale/input.c
@@ -286,8 +286,8 @@
                                                      int gsh, int bsh, int S,
                                                      int32_t *rgb2yuv)
 {
-    const int ru       = rgb2yuv[RU_IDX] << rsh, gu = rgb2yuv[GU_IDX] << gsh, bu = rgb2yuv[BU_IDX] << bsh,
-              rv       = rgb2yuv[RV_IDX] << rsh, gv = rgb2yuv[GV_IDX] << gsh, bv = rgb2yuv[BV_IDX] << bsh;
+    const int ru       = rgb2yuv[RU_IDX] * (1 << rsh), gu = rgb2yuv[GU_IDX] * (1 << gsh), bu = rgb2yuv[BU_IDX] * (1 << bsh),
+              rv       = rgb2yuv[RV_IDX] * (1 << rsh), gv = rgb2yuv[GV_IDX] * (1 << gsh), bv = rgb2yuv[BV_IDX] * (1 << bsh);
     const unsigned rnd = (256u<<((S)-1)) + (1<<(S-7));
     int i;
 
@@ -314,8 +314,8 @@
                                                           int gsh, int bsh, int S,
                                                           int32_t *rgb2yuv)
 {
-    const int ru       = rgb2yuv[RU_IDX] << rsh, gu = rgb2yuv[GU_IDX] << gsh, bu = rgb2yuv[BU_IDX] << bsh,
-              rv       = rgb2yuv[RV_IDX] << rsh, gv = rgb2yuv[GV_IDX] << gsh, bv = rgb2yuv[BV_IDX] << bsh,
+    const int ru       = rgb2yuv[RU_IDX] * (1 << rsh), gu = rgb2yuv[GU_IDX] * (1 << gsh), bu = rgb2yuv[BU_IDX] * (1 << bsh),
+              rv       = rgb2yuv[RV_IDX] * (1 << rsh), gv = rgb2yuv[GV_IDX] * (1 << gsh), bv = rgb2yuv[BV_IDX] * (1 << bsh),
               maskgx   = ~(maskr | maskb);
     const unsigned rnd = (256U<<(S)) + (1<<(S-6));
     int i;
@@ -437,7 +437,7 @@
     int16_t *dst = (int16_t *)_dst;
     int i;
     for (i=0; i<width; i++) {
-        dst[i]= src[4*i]<<6;
+        dst[i]= src[4*i]<<6 | src[4*i]>>2;
     }
 }
 
@@ -446,7 +446,7 @@
     int16_t *dst = (int16_t *)_dst;
     int i;
     for (i=0; i<width; i++) {
-        dst[i]= src[4*i+3]<<6;
+        dst[i]= src[4*i+3]<<6 | src[4*i+3]>>2;
     }
 }
 
@@ -457,7 +457,7 @@
     for (i=0; i<width; i++) {
         int d= src[i];
 
-        dst[i]= (pal[d] >> 24)<<6;
+        dst[i]= (pal[d] >> 24)<<6 | pal[d]>>26;
     }
 }
 
@@ -552,6 +552,24 @@
     av_assert1(src1 == src2);
 }
 
+static void y210le_UV_c(uint8_t *dstU, uint8_t *dstV, const uint8_t *unused0, const uint8_t *src,
+                        const uint8_t *unused1, int width, uint32_t *unused2)
+{
+    int i;
+    for (i = 0; i < width; i++) {
+        AV_WN16(dstU + i * 2, AV_RL16(src + i * 8 + 2) >> 6);
+        AV_WN16(dstV + i * 2, AV_RL16(src + i * 8 + 6) >> 6);
+    }
+}
+
+static void y210le_Y_c(uint8_t *dst, const uint8_t *src, const uint8_t *unused0,
+                       const uint8_t *unused1, int width, uint32_t *unused2)
+{
+    int i;
+    for (i = 0; i < width; i++)
+        AV_WN16(dst + i * 2, AV_RL16(src + i * 4) >> 6);
+}
+
 static void bswap16Y_c(uint8_t *_dst, const uint8_t *_src, const uint8_t *unused1, const uint8_t *unused2, int width,
                        uint32_t *unused)
 {
@@ -1020,9 +1038,11 @@
         c->chrToYV12 = uyvyToUV_c;
         break;
     case AV_PIX_FMT_NV12:
+    case AV_PIX_FMT_NV24:
         c->chrToYV12 = nv12ToUV_c;
         break;
     case AV_PIX_FMT_NV21:
+    case AV_PIX_FMT_NV42:
         c->chrToYV12 = nv21ToUV_c;
         break;
     case AV_PIX_FMT_RGB8:
@@ -1097,6 +1117,8 @@
     case AV_PIX_FMT_YUVA420P10LE:
     case AV_PIX_FMT_YUVA422P10LE:
     case AV_PIX_FMT_YUVA444P10LE:
+    case AV_PIX_FMT_YUVA422P12LE:
+    case AV_PIX_FMT_YUVA444P12LE:
     case AV_PIX_FMT_YUVA420P16LE:
     case AV_PIX_FMT_YUVA422P16LE:
     case AV_PIX_FMT_YUVA444P16LE:
@@ -1127,6 +1149,8 @@
     case AV_PIX_FMT_YUVA420P10BE:
     case AV_PIX_FMT_YUVA422P10BE:
     case AV_PIX_FMT_YUVA444P10BE:
+    case AV_PIX_FMT_YUVA422P12BE:
+    case AV_PIX_FMT_YUVA444P12BE:
     case AV_PIX_FMT_YUVA420P16BE:
     case AV_PIX_FMT_YUVA422P16BE:
     case AV_PIX_FMT_YUVA444P16BE:
@@ -1148,6 +1172,9 @@
     case AV_PIX_FMT_P016BE:
         c->chrToYV12 = p016BEToUV_c;
         break;
+    case AV_PIX_FMT_Y210LE:
+        c->chrToYV12 = y210le_UV_c;
+        break;
     }
     if (c->chrSrcHSubSample) {
         switch (srcFormat) {
@@ -1401,6 +1428,8 @@
     case AV_PIX_FMT_YUVA420P10LE:
     case AV_PIX_FMT_YUVA422P10LE:
     case AV_PIX_FMT_YUVA444P10LE:
+    case AV_PIX_FMT_YUVA422P12LE:
+    case AV_PIX_FMT_YUVA444P12LE:
     case AV_PIX_FMT_YUVA420P16LE:
     case AV_PIX_FMT_YUVA422P16LE:
     case AV_PIX_FMT_YUVA444P16LE:
@@ -1441,6 +1470,8 @@
     case AV_PIX_FMT_YUVA420P10BE:
     case AV_PIX_FMT_YUVA422P10BE:
     case AV_PIX_FMT_YUVA444P10BE:
+    case AV_PIX_FMT_YUVA422P12BE:
+    case AV_PIX_FMT_YUVA444P12BE:
     case AV_PIX_FMT_YUVA420P16BE:
     case AV_PIX_FMT_YUVA422P16BE:
     case AV_PIX_FMT_YUVA444P16BE:
@@ -1576,6 +1607,9 @@
         c->lumToYV12 = grayf32ToY16_bswap_c;
 #endif
         break;
+    case AV_PIX_FMT_Y210LE:
+        c->lumToYV12 = y210le_Y_c;
+        break;
     }
     if (c->needAlpha) {
         if (is16BPS(srcFormat) || isNBPS(srcFormat)) {
diff --git a/libswscale/output.c b/libswscale/output.c
index de8637a..68f43ff 100644
--- a/libswscale/output.c
+++ b/libswscale/output.c
@@ -410,7 +410,8 @@
     const uint8_t *chrDither = c->chrDither8;
     int i;
 
-    if (dstFormat == AV_PIX_FMT_NV12)
+    if (dstFormat == AV_PIX_FMT_NV12 ||
+        dstFormat == AV_PIX_FMT_NV24)
         for (i=0; i<chrDstW; i++) {
             int u = chrDither[i & 7] << 12;
             int v = chrDither[(i + 3) & 7] << 12;
@@ -629,28 +630,28 @@
         }
         c->dither_error[0][i] = err;
     } else {
-    for (i = 0; i < dstW; i += 8) {
-        int Y, acc = 0;
+        for (i = 0; i < dstW; i += 8) {
+            int Y, acc = 0;
 
-        Y = (buf0[i + 0] * yalpha1 + buf1[i + 0] * yalpha) >> 19;
-        accumulate_bit(acc, Y + d128[0]);
-        Y = (buf0[i + 1] * yalpha1 + buf1[i + 1] * yalpha) >> 19;
-        accumulate_bit(acc, Y + d128[1]);
-        Y = (buf0[i + 2] * yalpha1 + buf1[i + 2] * yalpha) >> 19;
-        accumulate_bit(acc, Y + d128[2]);
-        Y = (buf0[i + 3] * yalpha1 + buf1[i + 3] * yalpha) >> 19;
-        accumulate_bit(acc, Y + d128[3]);
-        Y = (buf0[i + 4] * yalpha1 + buf1[i + 4] * yalpha) >> 19;
-        accumulate_bit(acc, Y + d128[4]);
-        Y = (buf0[i + 5] * yalpha1 + buf1[i + 5] * yalpha) >> 19;
-        accumulate_bit(acc, Y + d128[5]);
-        Y = (buf0[i + 6] * yalpha1 + buf1[i + 6] * yalpha) >> 19;
-        accumulate_bit(acc, Y + d128[6]);
-        Y = (buf0[i + 7] * yalpha1 + buf1[i + 7] * yalpha) >> 19;
-        accumulate_bit(acc, Y + d128[7]);
+            Y = (buf0[i + 0] * yalpha1 + buf1[i + 0] * yalpha) >> 19;
+            accumulate_bit(acc, Y + d128[0]);
+            Y = (buf0[i + 1] * yalpha1 + buf1[i + 1] * yalpha) >> 19;
+            accumulate_bit(acc, Y + d128[1]);
+            Y = (buf0[i + 2] * yalpha1 + buf1[i + 2] * yalpha) >> 19;
+            accumulate_bit(acc, Y + d128[2]);
+            Y = (buf0[i + 3] * yalpha1 + buf1[i + 3] * yalpha) >> 19;
+            accumulate_bit(acc, Y + d128[3]);
+            Y = (buf0[i + 4] * yalpha1 + buf1[i + 4] * yalpha) >> 19;
+            accumulate_bit(acc, Y + d128[4]);
+            Y = (buf0[i + 5] * yalpha1 + buf1[i + 5] * yalpha) >> 19;
+            accumulate_bit(acc, Y + d128[5]);
+            Y = (buf0[i + 6] * yalpha1 + buf1[i + 6] * yalpha) >> 19;
+            accumulate_bit(acc, Y + d128[6]);
+            Y = (buf0[i + 7] * yalpha1 + buf1[i + 7] * yalpha) >> 19;
+            accumulate_bit(acc, Y + d128[7]);
 
-        output_pixel(*dest++, acc);
-    }
+            output_pixel(*dest++, acc);
+        }
     }
 }
 
@@ -686,19 +687,19 @@
         }
         c->dither_error[0][i] = err;
     } else {
-    for (i = 0; i < dstW; i += 8) {
-        int acc = 0;
-        accumulate_bit(acc, ((buf0[i + 0] + 64) >> 7) + d128[0]);
-        accumulate_bit(acc, ((buf0[i + 1] + 64) >> 7) + d128[1]);
-        accumulate_bit(acc, ((buf0[i + 2] + 64) >> 7) + d128[2]);
-        accumulate_bit(acc, ((buf0[i + 3] + 64) >> 7) + d128[3]);
-        accumulate_bit(acc, ((buf0[i + 4] + 64) >> 7) + d128[4]);
-        accumulate_bit(acc, ((buf0[i + 5] + 64) >> 7) + d128[5]);
-        accumulate_bit(acc, ((buf0[i + 6] + 64) >> 7) + d128[6]);
-        accumulate_bit(acc, ((buf0[i + 7] + 64) >> 7) + d128[7]);
+        for (i = 0; i < dstW; i += 8) {
+            int acc = 0;
+            accumulate_bit(acc, ((buf0[i + 0] + 64) >> 7) + d128[0]);
+            accumulate_bit(acc, ((buf0[i + 1] + 64) >> 7) + d128[1]);
+            accumulate_bit(acc, ((buf0[i + 2] + 64) >> 7) + d128[2]);
+            accumulate_bit(acc, ((buf0[i + 3] + 64) >> 7) + d128[3]);
+            accumulate_bit(acc, ((buf0[i + 4] + 64) >> 7) + d128[4]);
+            accumulate_bit(acc, ((buf0[i + 5] + 64) >> 7) + d128[5]);
+            accumulate_bit(acc, ((buf0[i + 6] + 64) >> 7) + d128[6]);
+            accumulate_bit(acc, ((buf0[i + 7] + 64) >> 7) + d128[7]);
 
-        output_pixel(*dest++, acc);
-    }
+            output_pixel(*dest++, acc);
+        }
     }
 }
 
@@ -853,11 +854,6 @@
                 V  = av_clip_uint8(V);
             }
 
-            Y1 = av_clip_uint8(Y1);
-            Y2 = av_clip_uint8(Y2);
-            U  = av_clip_uint8(U);
-            V  = av_clip_uint8(V);
-
             output_pixels(i * 4, Y1, U, Y2, V);
         }
     } else {
@@ -875,11 +871,6 @@
                 V  = av_clip_uint8(V);
             }
 
-            Y1 = av_clip_uint8(Y1);
-            Y2 = av_clip_uint8(Y2);
-            U  = av_clip_uint8(U);
-            V  = av_clip_uint8(V);
-
             output_pixels(i * 4, Y1, U, Y2, V);
         }
     }
@@ -901,6 +892,102 @@
     }
 
 static av_always_inline void
+yuv2ya16_X_c_template(SwsContext *c, const int16_t *lumFilter,
+                        const int32_t **lumSrc, int lumFilterSize,
+                        const int16_t *chrFilter, const int32_t **unused_chrUSrc,
+                        const int32_t **unused_chrVSrc, int unused_chrFilterSize,
+                        const int32_t **alpSrc, uint16_t *dest, int dstW,
+                        int y, enum AVPixelFormat target, int unused_hasAlpha, int unused_eightbytes)
+{
+    int hasAlpha = !!alpSrc;
+    int i;
+
+    for (i = 0; i < dstW; i++) {
+        int j;
+        int Y = -0x40000000;
+        int A = 0xffff;
+
+        for (j = 0; j < lumFilterSize; j++)
+            Y += lumSrc[j][i] * lumFilter[j];
+
+        Y >>= 15;
+        Y += (1<<3) + 0x8000;
+        Y = av_clip_uint16(Y);
+
+        if (hasAlpha) {
+            A = -0x40000000 + (1<<14);
+            for (j = 0; j < lumFilterSize; j++)
+                A += alpSrc[j][i] * lumFilter[j];
+
+            A >>= 15;
+            A += 0x8000;
+            A = av_clip_uint16(A);
+        }
+
+        output_pixel(&dest[2 * i    ], Y);
+        output_pixel(&dest[2 * i + 1], A);
+    }
+}
+
+static av_always_inline void
+yuv2ya16_2_c_template(SwsContext *c, const int32_t *buf[2],
+                        const int32_t *unused_ubuf[2], const int32_t *unused_vbuf[2],
+                        const int32_t *abuf[2], uint16_t *dest, int dstW,
+                        int yalpha, int unused_uvalpha, int y,
+                        enum AVPixelFormat target, int unused_hasAlpha, int unused_eightbytes)
+{
+    int hasAlpha = abuf && abuf[0] && abuf[1];
+    const int32_t *buf0  = buf[0],  *buf1  = buf[1],
+    *abuf0 = hasAlpha ? abuf[0] : NULL,
+    *abuf1 = hasAlpha ? abuf[1] : NULL;
+    int  yalpha1 = 4096 - yalpha;
+    int i;
+
+    av_assert2(yalpha  <= 4096U);
+
+    for (i = 0; i < dstW; i++) {
+        int Y = (buf0[i] * yalpha1 + buf1[i] * yalpha) >> 15;
+        int A;
+
+        Y = av_clip_uint16(Y);
+
+        if (hasAlpha) {
+            A = (abuf0[i] * yalpha1 + abuf1[i] * yalpha) >> 15;
+            A = av_clip_uint16(A);
+        }
+
+        output_pixel(&dest[2 * i    ], Y);
+        output_pixel(&dest[2 * i + 1], hasAlpha ? A : 65535);
+    }
+}
+
+static av_always_inline void
+yuv2ya16_1_c_template(SwsContext *c, const int32_t *buf0,
+                        const int32_t *unused_ubuf[2], const int32_t *unused_vbuf[2],
+                        const int32_t *abuf0, uint16_t *dest, int dstW,
+                        int unused_uvalpha, int y, enum AVPixelFormat target, int unused_hasAlpha, int unused_eightbytes)
+{
+    int hasAlpha = !!abuf0;
+    int i;
+
+    for (i = 0; i < dstW; i++) {
+        int Y = buf0[i] >> 3;/* 19 - 16 */
+        int A;
+
+        Y = av_clip_uint16(Y);
+
+        if (hasAlpha) {
+            A = abuf0[i] >> 3;
+            if (A & 0x100)
+                A = av_clip_uint16(A);
+        }
+
+        output_pixel(&dest[2 * i    ], Y);
+        output_pixel(&dest[2 * i + 1], hasAlpha ? A : 65535);
+    }
+}
+
+static av_always_inline void
 yuv2rgba64_X_c_template(SwsContext *c, const int16_t *lumFilter,
                        const int32_t **lumSrc, int lumFilterSize,
                        const int16_t *chrFilter, const int32_t **chrUSrc,
@@ -1405,6 +1492,8 @@
 YUV2PACKED16WRAPPER(yuv2, rgba64, bgra64le, AV_PIX_FMT_BGRA64LE, 1, 1)
 YUV2PACKED16WRAPPER(yuv2, rgba64, bgrx64be, AV_PIX_FMT_BGRA64BE, 0, 1)
 YUV2PACKED16WRAPPER(yuv2, rgba64, bgrx64le, AV_PIX_FMT_BGRA64LE, 0, 1)
+YUV2PACKED16WRAPPER(yuv2, ya16, ya16be, AV_PIX_FMT_YA16BE, 1, 0)
+YUV2PACKED16WRAPPER(yuv2, ya16, ya16le, AV_PIX_FMT_YA16LE, 1, 0)
 
 YUV2PACKED16WRAPPER(yuv2, rgba64_full, rgb48be_full, AV_PIX_FMT_RGB48BE, 0, 0)
 YUV2PACKED16WRAPPER(yuv2, rgba64_full, rgb48le_full, AV_PIX_FMT_RGB48LE, 0, 0)
@@ -1761,9 +1850,9 @@
     Y -= c->yuv2rgb_y_offset;
     Y *= c->yuv2rgb_y_coeff;
     Y += 1 << 21;
-    R = Y + V*c->yuv2rgb_v2r_coeff;
-    G = Y + V*c->yuv2rgb_v2g_coeff + U*c->yuv2rgb_u2g_coeff;
-    B = Y +                          U*c->yuv2rgb_u2b_coeff;
+    R = (unsigned)Y + V*c->yuv2rgb_v2r_coeff;
+    G = (unsigned)Y + V*c->yuv2rgb_v2g_coeff + U*c->yuv2rgb_u2g_coeff;
+    B = (unsigned)Y +                          U*c->yuv2rgb_u2b_coeff;
     if ((R | G | B) & 0xC0000000) {
         R = av_clip_uintp2(R, 30);
         G = av_clip_uintp2(G, 30);
@@ -2004,7 +2093,7 @@
     if (uvalpha < 2048) {
         int A = 0; //init to silence warning
         for (i = 0; i < dstW; i++) {
-            int Y = buf0[i] << 2;
+            int Y = buf0[i] * 4;
             int U = (ubuf0[i] - (128<<7)) * 4;
             int V = (vbuf0[i] - (128<<7)) * 4;
 
@@ -2021,9 +2110,9 @@
         const int16_t *ubuf1 = ubuf[1], *vbuf1 = vbuf[1];
         int A = 0; //init to silence warning
         for (i = 0; i < dstW; i++) {
-            int Y = buf0[i] << 2;
-            int U = (ubuf0[i] + ubuf1[i] - (128<<8)) << 1;
-            int V = (vbuf0[i] + vbuf1[i] - (128<<8)) << 1;
+            int Y = buf0[i] * 4;
+            int U = (ubuf0[i] + ubuf1[i] - (128<<8)) * 2;
+            int V = (vbuf0[i] + vbuf1[i] - (128<<8)) * 2;
 
             if (hasAlpha) {
                 A = (abuf0[i] + 64) >> 7;
@@ -2189,7 +2278,7 @@
             A = -0x40000000;
 
             for (j = 0; j < lumFilterSize; j++)
-                A += alpSrc[j][i] * lumFilter[j];
+                A += alpSrc[j][i] * (unsigned)lumFilter[j];
 
             A >>= 1;
             A += 0x20002000;
@@ -2411,7 +2500,8 @@
     } else {
         *yuv2plane1 = yuv2plane1_8_c;
         *yuv2planeX = yuv2planeX_8_c;
-        if (dstFormat == AV_PIX_FMT_NV12 || dstFormat == AV_PIX_FMT_NV21)
+        if (dstFormat == AV_PIX_FMT_NV12 || dstFormat == AV_PIX_FMT_NV21 ||
+            dstFormat == AV_PIX_FMT_NV24 || dstFormat == AV_PIX_FMT_NV42)
             *yuv2nv12cX = yuv2nv12cX_c;
     }
 
@@ -2835,6 +2925,16 @@
         *yuv2packed2 = yuv2ya8_2_c;
         *yuv2packedX = yuv2ya8_X_c;
         break;
+    case AV_PIX_FMT_YA16LE:
+        *yuv2packed1 = yuv2ya16le_1_c;
+        *yuv2packed2 = yuv2ya16le_2_c;
+        *yuv2packedX = yuv2ya16le_X_c;
+        break;
+    case AV_PIX_FMT_YA16BE:
+        *yuv2packed1 = yuv2ya16be_1_c;
+        *yuv2packed2 = yuv2ya16be_2_c;
+        *yuv2packedX = yuv2ya16be_X_c;
+        break;
     case AV_PIX_FMT_AYUV64LE:
         *yuv2packedX = yuv2ayuv64le_X_c;
         break;
diff --git a/libswscale/ppc/Makefile b/libswscale/ppc/Makefile
index d1b596e..0a31a30 100644
--- a/libswscale/ppc/Makefile
+++ b/libswscale/ppc/Makefile
@@ -1,3 +1,4 @@
 OBJS += ppc/swscale_altivec.o                                           \
         ppc/yuv2rgb_altivec.o                                           \
         ppc/yuv2yuv_altivec.o                                           \
+        ppc/swscale_vsx.o
diff --git a/libswscale/ppc/swscale_altivec.c b/libswscale/ppc/swscale_altivec.c
index 2fb2337..1630355 100644
--- a/libswscale/ppc/swscale_altivec.c
+++ b/libswscale/ppc/swscale_altivec.c
@@ -32,34 +32,27 @@
 #include "libavutil/ppc/util_altivec.h"
 
 #if HAVE_ALTIVEC
+#if HAVE_BIGENDIAN
 #define vzero vec_splat_s32(0)
 
-#if HAVE_BIGENDIAN
 #define  GET_LS(a,b,c,s) {\
         vector signed short l2  = vec_ld(((b) << 1) + 16, s);\
         ls  = vec_perm(a, l2, c);\
         a = l2;\
     }
-#else
-#define  GET_LS(a,b,c,s) {\
-        ls  = a;\
-        a = vec_vsx_ld(((b) << 1)  + 16, s);\
-    }
-#endif
 
 #define yuv2planeX_8(d1, d2, l1, src, x, perm, filter) do {\
         vector signed short ls;\
+        vector signed int   vf1, vf2, i1, i2;\
         GET_LS(l1, x, perm, src);\
-        vector signed int   i1  = vec_mule(filter, ls);\
-        vector signed int   i2  = vec_mulo(filter, ls);\
-        vector signed int   vf1, vf2;\
+        i1  = vec_mule(filter, ls);\
+        i2  = vec_mulo(filter, ls);\
         vf1 = vec_mergeh(i1, i2);\
         vf2 = vec_mergel(i1, i2);\
         d1 = vec_add(d1, vf1);\
         d2 = vec_add(d2, vf2);\
     } while (0)
 
-#if HAVE_BIGENDIAN
 #define LOAD_FILTER(vf,f) {\
         vector unsigned char perm0 = vec_lvsl(joffset, f);\
         vf = vec_ld(joffset, f);\
@@ -69,89 +62,7 @@
         p = vec_lvsl(xoffset, s);\
         ll1   = vec_ld(xoffset, s);\
 }
-#else
-#define LOAD_FILTER(vf,f) {\
-        vf = vec_vsx_ld(joffset, f);\
-}
-#define LOAD_L1(ll1,s,p){\
-        ll1  = vec_vsx_ld(xoffset, s);\
-}
-#endif
 
-static void yuv2planeX_16_altivec(const int16_t *filter, int filterSize,
-                                  const int16_t **src, uint8_t *dest,
-                                  const uint8_t *dither, int offset, int x)
-{
-    register int i, j;
-    LOCAL_ALIGNED(16, int, val, [16]);
-    vector signed int vo1, vo2, vo3, vo4;
-    vector unsigned short vs1, vs2;
-    vector unsigned char vf;
-    vector unsigned int altivec_vectorShiftInt19 =
-        vec_add(vec_splat_u32(10), vec_splat_u32(9));
-
-    for (i = 0; i < 16; i++)
-        val[i] = dither[(x + i + offset) & 7] << 12;
-
-    vo1 = vec_ld(0,  val);
-    vo2 = vec_ld(16, val);
-    vo3 = vec_ld(32, val);
-    vo4 = vec_ld(48, val);
-
-    for (j = 0; j < filterSize; j++) {
-        unsigned int joffset=j<<1;
-        unsigned int xoffset=x<<1;
-        vector unsigned char perm;
-        vector signed short l1,vLumFilter;
-        LOAD_FILTER(vLumFilter,filter);
-        vLumFilter = vec_splat(vLumFilter, 0);
-        LOAD_L1(l1,src[j],perm);
-        yuv2planeX_8(vo1, vo2, l1, src[j], x,     perm, vLumFilter);
-        yuv2planeX_8(vo3, vo4, l1, src[j], x + 8, perm, vLumFilter);
-    }
-
-    vo1 = vec_sra(vo1, altivec_vectorShiftInt19);
-    vo2 = vec_sra(vo2, altivec_vectorShiftInt19);
-    vo3 = vec_sra(vo3, altivec_vectorShiftInt19);
-    vo4 = vec_sra(vo4, altivec_vectorShiftInt19);
-    vs1 = vec_packsu(vo1, vo2);
-    vs2 = vec_packsu(vo3, vo4);
-    vf  = vec_packsu(vs1, vs2);
-    VEC_ST(vf, 0, dest);
-}
-
-
-static inline void yuv2planeX_u(const int16_t *filter, int filterSize,
-                                const int16_t **src, uint8_t *dest, int dstW,
-                                const uint8_t *dither, int offset, int x)
-{
-    int i, j;
-
-    for (i = x; i < dstW; i++) {
-        int t = dither[(i + offset) & 7] << 12;
-        for (j = 0; j < filterSize; j++)
-            t += src[j][i] * filter[j];
-        dest[i] = av_clip_uint8(t >> 19);
-    }
-}
-
-static void yuv2planeX_altivec(const int16_t *filter, int filterSize,
-                               const int16_t **src, uint8_t *dest, int dstW,
-                               const uint8_t *dither, int offset)
-{
-    int dst_u = -(uintptr_t)dest & 15;
-    int i;
-
-    yuv2planeX_u(filter, filterSize, src, dest, dst_u, dither, offset, 0);
-
-    for (i = dst_u; i < dstW - 15; i += 16)
-        yuv2planeX_16_altivec(filter, filterSize, src, dest + i, dither,
-                              offset, i);
-
-    yuv2planeX_u(filter, filterSize, src, dest, dstW, dither, offset, i);
-}
-
-#if HAVE_BIGENDIAN
 // The 3 above is 2 (filterSize == 4) + 1 (sizeof(short) == 2).
 
 // The neat trick: We only care for half the elements,
@@ -187,143 +98,141 @@
     vf1 = vec_ld((a * 2 * filterSize) + (b * 2) + 16 + off, f);\
     vf  = vec_perm(vf0, vf1, per);\
 }
-#else /* else of #if HAVE_BIGENDIAN */
-#define GET_VF4(a, vf, f) {\
-    vf = (vector signed short)vec_vsx_ld(a << 3, f);\
-    vf = vec_mergeh(vf, (vector signed short)vzero);\
-}
-#define FIRST_LOAD(sv, pos, s, per) {}
-#define UPDATE_PTR(s0, d0, s1, d1) {}
-#define LOAD_SRCV(pos, a, s, per, v0, v1, vf) {\
-    vf = vec_vsx_ld(pos + a, s);\
-}
-#define LOAD_SRCV8(pos, a, s, per, v0, v1, vf) LOAD_SRCV(pos, a, s, per, v0, v1, vf)
-#define GET_VFD(a, b, f, vf0, vf1, per, vf, off) {\
-    vf  = vec_vsx_ld((a * 2 * filterSize) + (b * 2) + off, f);\
-}
-#endif /* end of #if HAVE_BIGENDIAN */
 
-static void hScale_altivec_real(SwsContext *c, int16_t *dst, int dstW,
-                                const uint8_t *src, const int16_t *filter,
-                                const int32_t *filterPos, int filterSize)
+#define FUNC(name) name ## _altivec
+#include "swscale_ppc_template.c"
+#undef FUNC
+
+#undef vzero
+
+#endif /* HAVE_BIGENDIAN */
+
+#define output_pixel(pos, val, bias, signedness) \
+    if (big_endian) { \
+        AV_WB16(pos, bias + av_clip_ ## signedness ## 16(val >> shift)); \
+    } else { \
+        AV_WL16(pos, bias + av_clip_ ## signedness ## 16(val >> shift)); \
+    }
+
+static void
+yuv2plane1_float_u(const int32_t *src, float *dest, int dstW, int start)
 {
-    register int i;
-    LOCAL_ALIGNED(16, int, tempo, [4]);
+    static const int big_endian = HAVE_BIGENDIAN;
+    static const int shift = 3;
+    static const float float_mult = 1.0f / 65535.0f;
+    int i, val;
+    uint16_t val_uint;
 
-    if (filterSize % 4) {
-        for (i = 0; i < dstW; i++) {
-            register int j;
-            register int srcPos = filterPos[i];
-            register int val    = 0;
-            for (j = 0; j < filterSize; j++)
-                val += ((int)src[srcPos + j]) * filter[filterSize * i + j];
-            dst[i] = FFMIN(val >> 7, (1 << 15) - 1);
-        }
-    } else
-        switch (filterSize) {
-        case 4:
-            for (i = 0; i < dstW; i++) {
-                register int srcPos = filterPos[i];
-
-                vector unsigned char src_vF = unaligned_load(srcPos, src);
-                vector signed short src_v, filter_v;
-                vector signed int val_vEven, val_s;
-                src_v = // vec_unpackh sign-extends...
-                        (vector signed short)(VEC_MERGEH((vector unsigned char)vzero, src_vF));
-                // now put our elements in the even slots
-                src_v = vec_mergeh(src_v, (vector signed short)vzero);
-                GET_VF4(i, filter_v, filter);
-                val_vEven = vec_mule(src_v, filter_v);
-                val_s     = vec_sums(val_vEven, vzero);
-                vec_st(val_s, 0, tempo);
-                dst[i] = FFMIN(tempo[3] >> 7, (1 << 15) - 1);
-            }
-        break;
-        case 8:
-            for (i = 0; i < dstW; i++) {
-                register int srcPos = filterPos[i];
-                vector unsigned char src_vF, src_v0, src_v1;
-                vector unsigned char permS;
-                vector signed short src_v, filter_v;
-                vector signed int val_v, val_s;
-                FIRST_LOAD(src_v0, srcPos, src, permS);
-                LOAD_SRCV8(srcPos, 0, src, permS, src_v0, src_v1, src_vF);
-                src_v = // vec_unpackh sign-extends...
-                        (vector signed short)(VEC_MERGEH((vector unsigned char)vzero, src_vF));
-                filter_v = vec_ld(i << 4, filter);
-                val_v = vec_msums(src_v, filter_v, (vector signed int)vzero);
-                val_s = vec_sums(val_v, vzero);
-                vec_st(val_s, 0, tempo);
-                dst[i] = FFMIN(tempo[3] >> 7, (1 << 15) - 1);
-            }
-        break;
-
-        case 16:
-            for (i = 0; i < dstW; i++) {
-                register int srcPos = filterPos[i];
-
-                vector unsigned char src_vF = unaligned_load(srcPos, src);
-                vector signed short src_vA = // vec_unpackh sign-extends...
-                                             (vector signed short)(VEC_MERGEH((vector unsigned char)vzero, src_vF));
-                vector signed short src_vB = // vec_unpackh sign-extends...
-                                             (vector signed short)(VEC_MERGEL((vector unsigned char)vzero, src_vF));
-                vector signed short filter_v0 = vec_ld(i << 5, filter);
-                vector signed short filter_v1 = vec_ld((i << 5) + 16, filter);
-
-                vector signed int val_acc = vec_msums(src_vA, filter_v0, (vector signed int)vzero);
-                vector signed int val_v   = vec_msums(src_vB, filter_v1, val_acc);
-
-                vector signed int val_s = vec_sums(val_v, vzero);
-
-                VEC_ST(val_s, 0, tempo);
-                dst[i] = FFMIN(tempo[3] >> 7, (1 << 15) - 1);
-            }
-        break;
-
-        default:
-            for (i = 0; i < dstW; i++) {
-                register int j, offset = i * 2 * filterSize;
-                register int srcPos = filterPos[i];
-
-                vector signed int val_s, val_v = (vector signed int)vzero;
-                vector signed short filter_v0R;
-                vector unsigned char permF, src_v0, permS;
-                FIRST_LOAD(filter_v0R, offset, filter, permF);
-                FIRST_LOAD(src_v0, srcPos, src, permS);
-
-                for (j = 0; j < filterSize - 15; j += 16) {
-                    vector unsigned char src_v1, src_vF;
-                    vector signed short filter_v1R, filter_v2R, filter_v0, filter_v1;
-                    LOAD_SRCV(srcPos, j, src, permS, src_v0, src_v1, src_vF);
-                    vector signed short src_vA = // vec_unpackh sign-extends...
-                                                 (vector signed short)(VEC_MERGEH((vector unsigned char)vzero, src_vF));
-                    vector signed short src_vB = // vec_unpackh sign-extends...
-                                                 (vector signed short)(VEC_MERGEL((vector unsigned char)vzero, src_vF));
-                    GET_VFD(i, j, filter, filter_v0R, filter_v1R, permF, filter_v0, 0);
-                    GET_VFD(i, j, filter, filter_v1R, filter_v2R, permF, filter_v1, 16);
-
-                    vector signed int val_acc = vec_msums(src_vA, filter_v0, val_v);
-                    val_v = vec_msums(src_vB, filter_v1, val_acc);
-                    UPDATE_PTR(filter_v2R, filter_v0R, src_v1, src_v0);
-                }
-
-                if (j < filterSize - 7) {
-                    // loading src_v0 is useless, it's already done above
-                    vector unsigned char src_v1, src_vF;
-                    vector signed short src_v, filter_v1R, filter_v;
-                    LOAD_SRCV8(srcPos, j, src, permS, src_v0, src_v1, src_vF);
-                    src_v = // vec_unpackh sign-extends...
-                            (vector signed short)(VEC_MERGEH((vector unsigned char)vzero, src_vF));
-                    GET_VFD(i, j, filter, filter_v0R, filter_v1R, permF, filter_v, 0);
-                    val_v = vec_msums(src_v, filter_v, val_v);
-                }
-                val_s = vec_sums(val_v, vzero);
-
-                VEC_ST(val_s, 0, tempo);
-                dst[i] = FFMIN(tempo[3] >> 7, (1 << 15) - 1);
-            }
-        }
+    for (i = start; i < dstW; ++i){
+        val = src[i] + (1 << (shift - 1));
+        output_pixel(&val_uint, val, 0, uint);
+        dest[i] = float_mult * (float)val_uint;
+    }
 }
+
+static void
+yuv2plane1_float_bswap_u(const int32_t *src, uint32_t *dest, int dstW, int start)
+{
+    static const int big_endian = HAVE_BIGENDIAN;
+    static const int shift = 3;
+    static const float float_mult = 1.0f / 65535.0f;
+    int i, val;
+    uint16_t val_uint;
+
+    for (i = start; i < dstW; ++i){
+        val = src[i] + (1 << (shift - 1));
+        output_pixel(&val_uint, val, 0, uint);
+        dest[i] = av_bswap32(av_float2int(float_mult * (float)val_uint));
+    }
+}
+
+static void yuv2plane1_float_altivec(const int32_t *src, float *dest, int dstW)
+{
+    const int dst_u = -(uintptr_t)dest & 3;
+    const int shift = 3;
+    const int add = (1 << (shift - 1));
+    const int clip = (1 << 16) - 1;
+    const float fmult = 1.0f / 65535.0f;
+    const vec_u32 vadd = (vec_u32) {add, add, add, add};
+    const vec_u32 vshift = (vec_u32) vec_splat_u32(shift);
+    const vec_u32 vlargest = (vec_u32) {clip, clip, clip, clip};
+    const vec_f vmul = (vec_f) {fmult, fmult, fmult, fmult};
+    const vec_f vzero = (vec_f) {0, 0, 0, 0};
+    vec_u32 v;
+    vec_f vd;
+    int i;
+
+    yuv2plane1_float_u(src, dest, dst_u, 0);
+
+    for (i = dst_u; i < dstW - 3; i += 4) {
+        v = vec_ld(0, (const uint32_t *) &src[i]);
+        v = vec_add(v, vadd);
+        v = vec_sr(v, vshift);
+        v = vec_min(v, vlargest);
+
+        vd = vec_ctf(v, 0);
+        vd = vec_madd(vd, vmul, vzero);
+
+        vec_st(vd, 0, &dest[i]);
+    }
+
+    yuv2plane1_float_u(src, dest, dstW, i);
+}
+
+static void yuv2plane1_float_bswap_altivec(const int32_t *src, uint32_t *dest, int dstW)
+{
+    const int dst_u = -(uintptr_t)dest & 3;
+    const int shift = 3;
+    const int add = (1 << (shift - 1));
+    const int clip = (1 << 16) - 1;
+    const float fmult = 1.0f / 65535.0f;
+    const vec_u32 vadd = (vec_u32) {add, add, add, add};
+    const vec_u32 vshift = (vec_u32) vec_splat_u32(shift);
+    const vec_u32 vlargest = (vec_u32) {clip, clip, clip, clip};
+    const vec_f vmul = (vec_f) {fmult, fmult, fmult, fmult};
+    const vec_f vzero = (vec_f) {0, 0, 0, 0};
+    const vec_u32 vswapbig = (vec_u32) {16, 16, 16, 16};
+    const vec_u16 vswapsmall = vec_splat_u16(8);
+    vec_u32 v;
+    vec_f vd;
+    int i;
+
+    yuv2plane1_float_bswap_u(src, dest, dst_u, 0);
+
+    for (i = dst_u; i < dstW - 3; i += 4) {
+        v = vec_ld(0, (const uint32_t *) &src[i]);
+        v = vec_add(v, vadd);
+        v = vec_sr(v, vshift);
+        v = vec_min(v, vlargest);
+
+        vd = vec_ctf(v, 0);
+        vd = vec_madd(vd, vmul, vzero);
+
+        vd = (vec_f) vec_rl((vec_u32) vd, vswapbig);
+        vd = (vec_f) vec_rl((vec_u16) vd, vswapsmall);
+
+        vec_st(vd, 0, (float *) &dest[i]);
+    }
+
+    yuv2plane1_float_bswap_u(src, dest, dstW, i);
+}
+
+#define yuv2plane1_float(template, dest_type, BE_LE) \
+static void yuv2plane1_float ## BE_LE ## _altivec(const int16_t *src, uint8_t *dest, \
+                                                  int dstW, \
+                                                  const uint8_t *dither, int offset) \
+{ \
+    template((const int32_t *)src, (dest_type *)dest, dstW); \
+}
+
+#if HAVE_BIGENDIAN
+yuv2plane1_float(yuv2plane1_float_altivec,       float,    BE)
+yuv2plane1_float(yuv2plane1_float_bswap_altivec, uint32_t, LE)
+#else
+yuv2plane1_float(yuv2plane1_float_altivec,       float,    LE)
+yuv2plane1_float(yuv2plane1_float_bswap_altivec, uint32_t, BE)
+#endif
+
 #endif /* HAVE_ALTIVEC */
 
 av_cold void ff_sws_init_swscale_ppc(SwsContext *c)
@@ -334,15 +243,22 @@
     if (!(av_get_cpu_flags() & AV_CPU_FLAG_ALTIVEC))
         return;
 
+#if HAVE_BIGENDIAN
     if (c->srcBpc == 8 && c->dstBpc <= 14) {
-        c->hyScale = c->hcScale = hScale_altivec_real;
+        c->hyScale = c->hcScale = hScale_real_altivec;
     }
-    if (!is16BPS(dstFormat) && !isNBPS(dstFormat) &&
-        dstFormat != AV_PIX_FMT_NV12 && dstFormat != AV_PIX_FMT_NV21 &&
+    if (!is16BPS(dstFormat) && !isNBPS(dstFormat) && !isSemiPlanarYUV(dstFormat) &&
         dstFormat != AV_PIX_FMT_GRAYF32BE && dstFormat != AV_PIX_FMT_GRAYF32LE &&
         !c->needAlpha) {
         c->yuv2planeX = yuv2planeX_altivec;
     }
+#endif
+
+    if (dstFormat == AV_PIX_FMT_GRAYF32BE) {
+        c->yuv2plane1 = yuv2plane1_floatBE_altivec;
+    } else if (dstFormat == AV_PIX_FMT_GRAYF32LE) {
+        c->yuv2plane1 = yuv2plane1_floatLE_altivec;
+    }
 
     /* The following list of supported dstFormat values should
      * match what's found in the body of ff_yuv2packedX_altivec() */
@@ -369,4 +285,6 @@
         }
     }
 #endif /* HAVE_ALTIVEC */
+
+    ff_sws_init_swscale_vsx(c);
 }
diff --git a/libswscale/ppc/swscale_ppc_template.c b/libswscale/ppc/swscale_ppc_template.c
new file mode 100644
index 0000000..aff2dd7
--- /dev/null
+++ b/libswscale/ppc/swscale_ppc_template.c
@@ -0,0 +1,219 @@
+/*
+ * AltiVec-enhanced yuv2yuvX
+ *
+ * Copyright (C) 2004 Romain Dolbeau <romain@dolbeau.org>
+ * based on the equivalent C code in swscale.c
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+static void FUNC(yuv2planeX_8_16)(const int16_t *filter, int filterSize,
+                                  const int16_t **src, uint8_t *dest,
+                                  const uint8_t *dither, int offset, int x)
+{
+    register int i, j;
+    LOCAL_ALIGNED(16, int, val, [16]);
+    vector signed int vo1, vo2, vo3, vo4;
+    vector unsigned short vs1, vs2;
+    vector unsigned char vf;
+    vector unsigned int altivec_vectorShiftInt19 =
+        vec_add(vec_splat_u32(10), vec_splat_u32(9));
+
+    for (i = 0; i < 16; i++)
+        val[i] = dither[(x + i + offset) & 7] << 12;
+
+    vo1 = vec_ld(0,  val);
+    vo2 = vec_ld(16, val);
+    vo3 = vec_ld(32, val);
+    vo4 = vec_ld(48, val);
+
+    for (j = 0; j < filterSize; j++) {
+        unsigned int joffset=j<<1;
+        unsigned int xoffset=x<<1;
+        vector unsigned char av_unused perm;
+        vector signed short l1,vLumFilter;
+        LOAD_FILTER(vLumFilter,filter);
+        vLumFilter = vec_splat(vLumFilter, 0);
+        LOAD_L1(l1,src[j],perm);
+        yuv2planeX_8(vo1, vo2, l1, src[j], x,     perm, vLumFilter);
+        yuv2planeX_8(vo3, vo4, l1, src[j], x + 8, perm, vLumFilter);
+    }
+
+    vo1 = vec_sra(vo1, altivec_vectorShiftInt19);
+    vo2 = vec_sra(vo2, altivec_vectorShiftInt19);
+    vo3 = vec_sra(vo3, altivec_vectorShiftInt19);
+    vo4 = vec_sra(vo4, altivec_vectorShiftInt19);
+    vs1 = vec_packsu(vo1, vo2);
+    vs2 = vec_packsu(vo3, vo4);
+    vf  = vec_packsu(vs1, vs2);
+    VEC_ST(vf, 0, dest);
+}
+
+
+static inline void yuv2planeX_u(const int16_t *filter, int filterSize,
+                                const int16_t **src, uint8_t *dest, int dstW,
+                                const uint8_t *dither, int offset, int x)
+{
+    int i, j;
+
+    for (i = x; i < dstW; i++) {
+        int t = dither[(i + offset) & 7] << 12;
+        for (j = 0; j < filterSize; j++)
+            t += src[j][i] * filter[j];
+        dest[i] = av_clip_uint8(t >> 19);
+    }
+}
+
+static void FUNC(yuv2planeX)(const int16_t *filter, int filterSize,
+                               const int16_t **src, uint8_t *dest, int dstW,
+                               const uint8_t *dither, int offset)
+{
+    int dst_u = -(uintptr_t)dest & 15;
+    int i;
+
+    yuv2planeX_u(filter, filterSize, src, dest, dst_u, dither, offset, 0);
+
+    for (i = dst_u; i < dstW - 15; i += 16)
+        FUNC(yuv2planeX_8_16)(filter, filterSize, src, dest + i, dither,
+                              offset, i);
+
+    yuv2planeX_u(filter, filterSize, src, dest, dstW, dither, offset, i);
+}
+
+static void FUNC(hScale_real)(SwsContext *c, int16_t *dst, int dstW,
+                                const uint8_t *src, const int16_t *filter,
+                                const int32_t *filterPos, int filterSize)
+{
+    register int i;
+    LOCAL_ALIGNED(16, int, tempo, [4]);
+
+    if (filterSize % 4) {
+        for (i = 0; i < dstW; i++) {
+            register int j;
+            register int srcPos = filterPos[i];
+            register int val    = 0;
+            for (j = 0; j < filterSize; j++)
+                val += ((int)src[srcPos + j]) * filter[filterSize * i + j];
+            dst[i] = FFMIN(val >> 7, (1 << 15) - 1);
+        }
+    } else
+        switch (filterSize) {
+        case 4:
+            for (i = 0; i < dstW; i++) {
+                register int srcPos = filterPos[i];
+
+                vector unsigned char src_vF = unaligned_load(srcPos, src);
+                vector signed short src_v, filter_v;
+                vector signed int val_vEven, val_s;
+                src_v = // vec_unpackh sign-extends...
+                        (vector signed short)(VEC_MERGEH((vector unsigned char)vzero, src_vF));
+                // now put our elements in the even slots
+                src_v = vec_mergeh(src_v, (vector signed short)vzero);
+                GET_VF4(i, filter_v, filter);
+                val_vEven = vec_mule(src_v, filter_v);
+                val_s     = vec_sums(val_vEven, vzero);
+                vec_st(val_s, 0, tempo);
+                dst[i] = FFMIN(tempo[3] >> 7, (1 << 15) - 1);
+            }
+        break;
+        case 8:
+            for (i = 0; i < dstW; i++) {
+                register int srcPos = filterPos[i];
+                vector unsigned char src_vF, av_unused src_v0, av_unused src_v1;
+                vector unsigned char av_unused permS;
+                vector signed short src_v, filter_v;
+                vector signed int val_v, val_s;
+                FIRST_LOAD(src_v0, srcPos, src, permS);
+                LOAD_SRCV8(srcPos, 0, src, permS, src_v0, src_v1, src_vF);
+                src_v = // vec_unpackh sign-extends...
+                        (vector signed short)(VEC_MERGEH((vector unsigned char)vzero, src_vF));
+                filter_v = vec_ld(i << 4, filter);
+                val_v = vec_msums(src_v, filter_v, (vector signed int)vzero);
+                val_s = vec_sums(val_v, vzero);
+                vec_st(val_s, 0, tempo);
+                dst[i] = FFMIN(tempo[3] >> 7, (1 << 15) - 1);
+            }
+        break;
+
+        case 16:
+            for (i = 0; i < dstW; i++) {
+                register int srcPos = filterPos[i];
+
+                vector unsigned char src_vF = unaligned_load(srcPos, src);
+                vector signed short src_vA = // vec_unpackh sign-extends...
+                                             (vector signed short)(VEC_MERGEH((vector unsigned char)vzero, src_vF));
+                vector signed short src_vB = // vec_unpackh sign-extends...
+                                             (vector signed short)(VEC_MERGEL((vector unsigned char)vzero, src_vF));
+                vector signed short filter_v0 = vec_ld(i << 5, filter);
+                vector signed short filter_v1 = vec_ld((i << 5) + 16, filter);
+
+                vector signed int val_acc = vec_msums(src_vA, filter_v0, (vector signed int)vzero);
+                vector signed int val_v   = vec_msums(src_vB, filter_v1, val_acc);
+
+                vector signed int val_s = vec_sums(val_v, vzero);
+
+                VEC_ST(val_s, 0, tempo);
+                dst[i] = FFMIN(tempo[3] >> 7, (1 << 15) - 1);
+            }
+        break;
+
+        default:
+            for (i = 0; i < dstW; i++) {
+                register int j, av_unused offset = i * 2 * filterSize;
+                register int srcPos = filterPos[i];
+
+                vector signed int val_s, val_v = (vector signed int)vzero;
+                vector signed short av_unused filter_v0R;
+                vector unsigned char av_unused permF, av_unused src_v0, av_unused permS;
+                FIRST_LOAD(filter_v0R, offset, filter, permF);
+                FIRST_LOAD(src_v0, srcPos, src, permS);
+
+                for (j = 0; j < filterSize - 15; j += 16) {
+                    vector unsigned char av_unused src_v1, src_vF;
+                    vector signed short av_unused filter_v1R, av_unused filter_v2R,
+                                        filter_v0, filter_v1, src_vA, src_vB;
+                    vector signed int val_acc;
+                    LOAD_SRCV(srcPos, j, src, permS, src_v0, src_v1, src_vF);
+                    src_vA = // vec_unpackh sign-extends...
+                                                 (vector signed short)(VEC_MERGEH((vector unsigned char)vzero, src_vF));
+                    src_vB = // vec_unpackh sign-extends...
+                                                 (vector signed short)(VEC_MERGEL((vector unsigned char)vzero, src_vF));
+                    GET_VFD(i, j, filter, filter_v0R, filter_v1R, permF, filter_v0, 0);
+                    GET_VFD(i, j, filter, filter_v1R, filter_v2R, permF, filter_v1, 16);
+
+                    val_acc = vec_msums(src_vA, filter_v0, val_v);
+                    val_v = vec_msums(src_vB, filter_v1, val_acc);
+                    UPDATE_PTR(filter_v2R, filter_v0R, src_v1, src_v0);
+                }
+
+                if (j < filterSize - 7) {
+                    // loading src_v0 is useless, it's already done above
+                    vector unsigned char av_unused src_v1, src_vF;
+                    vector signed short src_v, av_unused filter_v1R, filter_v;
+                    LOAD_SRCV8(srcPos, j, src, permS, src_v0, src_v1, src_vF);
+                    src_v = // vec_unpackh sign-extends...
+                            (vector signed short)(VEC_MERGEH((vector unsigned char)vzero, src_vF));
+                    GET_VFD(i, j, filter, filter_v0R, filter_v1R, permF, filter_v, 0);
+                    val_v = vec_msums(src_v, filter_v, val_v);
+                }
+                val_s = vec_sums(val_v, vzero);
+
+                VEC_ST(val_s, 0, tempo);
+                dst[i] = FFMIN(tempo[3] >> 7, (1 << 15) - 1);
+            }
+        }
+}
diff --git a/libswscale/ppc/swscale_vsx.c b/libswscale/ppc/swscale_vsx.c
new file mode 100644
index 0000000..af8b0e1
--- /dev/null
+++ b/libswscale/ppc/swscale_vsx.c
@@ -0,0 +1,2267 @@
+/*
+ * AltiVec-enhanced yuv2yuvX
+ *
+ * Copyright (C) 2004 Romain Dolbeau <romain@dolbeau.org>
+ * based on the equivalent C code in swscale.c
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include <inttypes.h>
+
+#include "config.h"
+#include "libswscale/swscale.h"
+#include "libswscale/swscale_internal.h"
+#include "libavutil/attributes.h"
+#include "libavutil/cpu.h"
+#include "yuv2rgb_altivec.h"
+#include "libavutil/ppc/util_altivec.h"
+
+#if HAVE_VSX
+#define vzero vec_splat_s32(0)
+
+#if !HAVE_BIGENDIAN
+#define  GET_LS(a,b,c,s) {\
+        ls  = a;\
+        a = vec_vsx_ld(((b) << 1)  + 16, s);\
+    }
+
+#define yuv2planeX_8(d1, d2, l1, src, x, perm, filter) do {\
+        vector signed short ls;\
+        vector signed int   vf1, vf2, i1, i2;\
+        GET_LS(l1, x, perm, src);\
+        i1  = vec_mule(filter, ls);\
+        i2  = vec_mulo(filter, ls);\
+        vf1 = vec_mergeh(i1, i2);\
+        vf2 = vec_mergel(i1, i2);\
+        d1 = vec_add(d1, vf1);\
+        d2 = vec_add(d2, vf2);\
+    } while (0)
+
+#define LOAD_FILTER(vf,f) {\
+        vf = vec_vsx_ld(joffset, f);\
+}
+#define LOAD_L1(ll1,s,p){\
+        ll1  = vec_vsx_ld(xoffset, s);\
+}
+
+// The 3 above is 2 (filterSize == 4) + 1 (sizeof(short) == 2).
+
+// The neat trick: We only care for half the elements,
+// high or low depending on (i<<3)%16 (it's 0 or 8 here),
+// and we're going to use vec_mule, so we choose
+// carefully how to "unpack" the elements into the even slots.
+#define GET_VF4(a, vf, f) {\
+    vf = (vector signed short)vec_vsx_ld(a << 3, f);\
+    vf = vec_mergeh(vf, (vector signed short)vzero);\
+}
+#define FIRST_LOAD(sv, pos, s, per) {}
+#define UPDATE_PTR(s0, d0, s1, d1) {}
+#define LOAD_SRCV(pos, a, s, per, v0, v1, vf) {\
+    vf = vec_vsx_ld(pos + a, s);\
+}
+#define LOAD_SRCV8(pos, a, s, per, v0, v1, vf) LOAD_SRCV(pos, a, s, per, v0, v1, vf)
+#define GET_VFD(a, b, f, vf0, vf1, per, vf, off) {\
+    vf  = vec_vsx_ld((a * 2 * filterSize) + (b * 2) + off, f);\
+}
+
+#define FUNC(name) name ## _vsx
+#include "swscale_ppc_template.c"
+#undef FUNC
+
+#undef vzero
+
+#endif /* !HAVE_BIGENDIAN */
+
+static void yuv2plane1_8_u(const int16_t *src, uint8_t *dest, int dstW,
+                           const uint8_t *dither, int offset, int start)
+{
+    int i;
+    for (i = start; i < dstW; i++) {
+        int val = (src[i] + dither[(i + offset) & 7]) >> 7;
+        dest[i] = av_clip_uint8(val);
+    }
+}
+
+static void yuv2plane1_8_vsx(const int16_t *src, uint8_t *dest, int dstW,
+                           const uint8_t *dither, int offset)
+{
+    const int dst_u = -(uintptr_t)dest & 15;
+    int i, j;
+    LOCAL_ALIGNED(16, int16_t, val, [16]);
+    const vec_u16 shifts = (vec_u16) {7, 7, 7, 7, 7, 7, 7, 7};
+    vec_s16 vi, vileft, ditherleft, ditherright;
+    vec_u8 vd;
+
+    for (j = 0; j < 16; j++) {
+        val[j] = dither[(dst_u + offset + j) & 7];
+    }
+
+    ditherleft = vec_ld(0, val);
+    ditherright = vec_ld(0, &val[8]);
+
+    yuv2plane1_8_u(src, dest, dst_u, dither, offset, 0);
+
+    for (i = dst_u; i < dstW - 15; i += 16) {
+
+        vi = vec_vsx_ld(0, &src[i]);
+        vi = vec_adds(ditherleft, vi);
+        vileft = vec_sra(vi, shifts);
+
+        vi = vec_vsx_ld(0, &src[i + 8]);
+        vi = vec_adds(ditherright, vi);
+        vi = vec_sra(vi, shifts);
+
+        vd = vec_packsu(vileft, vi);
+        vec_st(vd, 0, &dest[i]);
+    }
+
+    yuv2plane1_8_u(src, dest, dstW, dither, offset, i);
+}
+
+#if !HAVE_BIGENDIAN
+
+#define output_pixel(pos, val) \
+    if (big_endian) { \
+        AV_WB16(pos, av_clip_uintp2(val >> shift, output_bits)); \
+    } else { \
+        AV_WL16(pos, av_clip_uintp2(val >> shift, output_bits)); \
+    }
+
+static void yuv2plane1_nbps_u(const int16_t *src, uint16_t *dest, int dstW,
+                              int big_endian, int output_bits, int start)
+{
+    int i;
+    int shift = 15 - output_bits;
+
+    for (i = start; i < dstW; i++) {
+        int val = src[i] + (1 << (shift - 1));
+        output_pixel(&dest[i], val);
+    }
+}
+
+static av_always_inline void yuv2plane1_nbps_vsx(const int16_t *src,
+                                                 uint16_t *dest, int dstW,
+                                                 const int big_endian,
+                                                 const int output_bits)
+{
+    const int dst_u = -(uintptr_t)dest & 7;
+    const int shift = 15 - output_bits;
+    const int add = (1 << (shift - 1));
+    const int clip = (1 << output_bits) - 1;
+    const vec_u16 vadd = (vec_u16) {add, add, add, add, add, add, add, add};
+    const vec_u16 vswap = (vec_u16) vec_splat_u16(big_endian ? 8 : 0);
+    const vec_u16 vshift = (vec_u16) vec_splat_u16(shift);
+    const vec_u16 vlargest = (vec_u16) {clip, clip, clip, clip, clip, clip, clip, clip};
+    vec_u16 v;
+    int i;
+
+    yuv2plane1_nbps_u(src, dest, dst_u, big_endian, output_bits, 0);
+
+    for (i = dst_u; i < dstW - 7; i += 8) {
+        v = vec_vsx_ld(0, (const uint16_t *) &src[i]);
+        v = vec_add(v, vadd);
+        v = vec_sr(v, vshift);
+        v = vec_min(v, vlargest);
+        v = vec_rl(v, vswap);
+        vec_st(v, 0, &dest[i]);
+    }
+
+    yuv2plane1_nbps_u(src, dest, dstW, big_endian, output_bits, i);
+}
+
+static void yuv2planeX_nbps_u(const int16_t *filter, int filterSize,
+                              const int16_t **src, uint16_t *dest, int dstW,
+                              int big_endian, int output_bits, int start)
+{
+    int i;
+    int shift = 11 + 16 - output_bits;
+
+    for (i = start; i < dstW; i++) {
+        int val = 1 << (shift - 1);
+        int j;
+
+        for (j = 0; j < filterSize; j++)
+            val += src[j][i] * filter[j];
+
+        output_pixel(&dest[i], val);
+    }
+}
+
+static void yuv2planeX_nbps_vsx(const int16_t *filter, int filterSize,
+                                const int16_t **src, uint16_t *dest, int dstW,
+                                int big_endian, int output_bits)
+{
+    const int dst_u = -(uintptr_t)dest & 7;
+    const int shift = 11 + 16 - output_bits;
+    const int add = (1 << (shift - 1));
+    const int clip = (1 << output_bits) - 1;
+    const uint16_t swap = big_endian ? 8 : 0;
+    const vec_u32 vadd = (vec_u32) {add, add, add, add};
+    const vec_u32 vshift = (vec_u32) {shift, shift, shift, shift};
+    const vec_u16 vswap = (vec_u16) {swap, swap, swap, swap, swap, swap, swap, swap};
+    const vec_u16 vlargest = (vec_u16) {clip, clip, clip, clip, clip, clip, clip, clip};
+    const vec_s16 vzero = vec_splat_s16(0);
+    const vec_u8 vperm = (vec_u8) {0, 1, 8, 9, 2, 3, 10, 11, 4, 5, 12, 13, 6, 7, 14, 15};
+    vec_s16 vfilter[MAX_FILTER_SIZE], vin;
+    vec_u16 v;
+    vec_u32 vleft, vright, vtmp;
+    int i, j;
+
+    for (i = 0; i < filterSize; i++) {
+        vfilter[i] = (vec_s16) {filter[i], filter[i], filter[i], filter[i],
+                                filter[i], filter[i], filter[i], filter[i]};
+    }
+
+    yuv2planeX_nbps_u(filter, filterSize, src, dest, dst_u, big_endian, output_bits, 0);
+
+    for (i = dst_u; i < dstW - 7; i += 8) {
+        vleft = vright = vadd;
+
+        for (j = 0; j < filterSize; j++) {
+            vin = vec_vsx_ld(0, &src[j][i]);
+            vtmp = (vec_u32) vec_mule(vin, vfilter[j]);
+            vleft = vec_add(vleft, vtmp);
+            vtmp = (vec_u32) vec_mulo(vin, vfilter[j]);
+            vright = vec_add(vright, vtmp);
+        }
+
+        vleft = vec_sra(vleft, vshift);
+        vright = vec_sra(vright, vshift);
+        v = vec_packsu(vleft, vright);
+        v = (vec_u16) vec_max((vec_s16) v, vzero);
+        v = vec_min(v, vlargest);
+        v = vec_rl(v, vswap);
+        v = vec_perm(v, v, vperm);
+        vec_st(v, 0, &dest[i]);
+    }
+
+    yuv2planeX_nbps_u(filter, filterSize, src, dest, dstW, big_endian, output_bits, i);
+}
+
+
+#undef output_pixel
+
+#define output_pixel(pos, val, bias, signedness) \
+    if (big_endian) { \
+        AV_WB16(pos, bias + av_clip_ ## signedness ## 16(val >> shift)); \
+    } else { \
+        AV_WL16(pos, bias + av_clip_ ## signedness ## 16(val >> shift)); \
+    }
+
+static void yuv2plane1_16_u(const int32_t *src, uint16_t *dest, int dstW,
+                              int big_endian, int output_bits, int start)
+{
+    int i;
+    const int shift = 3;
+
+    for (i = start; i < dstW; i++) {
+        int val = src[i] + (1 << (shift - 1));
+        output_pixel(&dest[i], val, 0, uint);
+    }
+}
+
+static av_always_inline void yuv2plane1_16_vsx(const int32_t *src,
+                                               uint16_t *dest, int dstW,
+                                               const int big_endian,
+                                               int output_bits)
+{
+    const int dst_u = -(uintptr_t)dest & 7;
+    const int shift = 3;
+    const int add = (1 << (shift - 1));
+    const vec_u32 vadd = (vec_u32) {add, add, add, add};
+    const vec_u16 vswap = (vec_u16) vec_splat_u16(big_endian ? 8 : 0);
+    const vec_u32 vshift = (vec_u32) vec_splat_u32(shift);
+    vec_u32 v, v2;
+    vec_u16 vd;
+    int i;
+
+    yuv2plane1_16_u(src, dest, dst_u, big_endian, output_bits, 0);
+
+    for (i = dst_u; i < dstW - 7; i += 8) {
+        v = vec_vsx_ld(0, (const uint32_t *) &src[i]);
+        v = vec_add(v, vadd);
+        v = vec_sr(v, vshift);
+
+        v2 = vec_vsx_ld(0, (const uint32_t *) &src[i + 4]);
+        v2 = vec_add(v2, vadd);
+        v2 = vec_sr(v2, vshift);
+
+        vd = vec_packsu(v, v2);
+        vd = vec_rl(vd, vswap);
+
+        vec_st(vd, 0, &dest[i]);
+    }
+
+    yuv2plane1_16_u(src, dest, dstW, big_endian, output_bits, i);
+}
+
+#if HAVE_POWER8
+
+static void yuv2planeX_16_u(const int16_t *filter, int filterSize,
+                            const int32_t **src, uint16_t *dest, int dstW,
+                            int big_endian, int output_bits, int start)
+{
+    int i;
+    int shift = 15;
+
+    for (i = start; i < dstW; i++) {
+        int val = 1 << (shift - 1);
+        int j;
+
+        /* range of val is [0,0x7FFFFFFF], so 31 bits, but with lanczos/spline
+         * filters (or anything with negative coeffs, the range can be slightly
+         * wider in both directions. To account for this overflow, we subtract
+         * a constant so it always fits in the signed range (assuming a
+         * reasonable filterSize), and re-add that at the end. */
+        val -= 0x40000000;
+        for (j = 0; j < filterSize; j++)
+            val += src[j][i] * (unsigned)filter[j];
+
+        output_pixel(&dest[i], val, 0x8000, int);
+    }
+}
+
+static void yuv2planeX_16_vsx(const int16_t *filter, int filterSize,
+                              const int32_t **src, uint16_t *dest, int dstW,
+                              int big_endian, int output_bits)
+{
+    const int dst_u = -(uintptr_t)dest & 7;
+    const int shift = 15;
+    const int bias = 0x8000;
+    const int add = (1 << (shift - 1)) - 0x40000000;
+    const uint16_t swap = big_endian ? 8 : 0;
+    const vec_u32 vadd = (vec_u32) {add, add, add, add};
+    const vec_u32 vshift = (vec_u32) {shift, shift, shift, shift};
+    const vec_u16 vswap = (vec_u16) {swap, swap, swap, swap, swap, swap, swap, swap};
+    const vec_u16 vbias = (vec_u16) {bias, bias, bias, bias, bias, bias, bias, bias};
+    vec_s32 vfilter[MAX_FILTER_SIZE];
+    vec_u16 v;
+    vec_u32 vleft, vright, vtmp;
+    vec_s32 vin32l, vin32r;
+    int i, j;
+
+    for (i = 0; i < filterSize; i++) {
+        vfilter[i] = (vec_s32) {filter[i], filter[i], filter[i], filter[i]};
+    }
+
+    yuv2planeX_16_u(filter, filterSize, src, dest, dst_u, big_endian, output_bits, 0);
+
+    for (i = dst_u; i < dstW - 7; i += 8) {
+        vleft = vright = vadd;
+
+        for (j = 0; j < filterSize; j++) {
+            vin32l = vec_vsx_ld(0, &src[j][i]);
+            vin32r = vec_vsx_ld(0, &src[j][i + 4]);
+
+            vtmp = (vec_u32) vec_mul(vin32l, vfilter[j]);
+            vleft = vec_add(vleft, vtmp);
+            vtmp = (vec_u32) vec_mul(vin32r, vfilter[j]);
+            vright = vec_add(vright, vtmp);
+        }
+
+        vleft = vec_sra(vleft, vshift);
+        vright = vec_sra(vright, vshift);
+        v = (vec_u16) vec_packs((vec_s32) vleft, (vec_s32) vright);
+        v = vec_add(v, vbias);
+        v = vec_rl(v, vswap);
+        vec_st(v, 0, &dest[i]);
+    }
+
+    yuv2planeX_16_u(filter, filterSize, src, dest, dstW, big_endian, output_bits, i);
+}
+
+#endif /* HAVE_POWER8 */
+
+#define yuv2NBPS(bits, BE_LE, is_be, template_size, typeX_t) \
+    yuv2NBPS1(bits, BE_LE, is_be, template_size, typeX_t) \
+    yuv2NBPSX(bits, BE_LE, is_be, template_size, typeX_t)
+
+#define yuv2NBPS1(bits, BE_LE, is_be, template_size, typeX_t) \
+static void yuv2plane1_ ## bits ## BE_LE ## _vsx(const int16_t *src, \
+                             uint8_t *dest, int dstW, \
+                             const uint8_t *dither, int offset) \
+{ \
+    yuv2plane1_ ## template_size ## _vsx((const typeX_t *) src, \
+                         (uint16_t *) dest, dstW, is_be, bits); \
+}
+
+#define yuv2NBPSX(bits, BE_LE, is_be, template_size, typeX_t) \
+static void yuv2planeX_ ## bits ## BE_LE ## _vsx(const int16_t *filter, int filterSize, \
+                              const int16_t **src, uint8_t *dest, int dstW, \
+                              const uint8_t *dither, int offset)\
+{ \
+    yuv2planeX_## template_size ## _vsx(filter, \
+                         filterSize, (const typeX_t **) src, \
+                         (uint16_t *) dest, dstW, is_be, bits); \
+}
+
+yuv2NBPS( 9, BE, 1, nbps, int16_t)
+yuv2NBPS( 9, LE, 0, nbps, int16_t)
+yuv2NBPS(10, BE, 1, nbps, int16_t)
+yuv2NBPS(10, LE, 0, nbps, int16_t)
+yuv2NBPS(12, BE, 1, nbps, int16_t)
+yuv2NBPS(12, LE, 0, nbps, int16_t)
+yuv2NBPS(14, BE, 1, nbps, int16_t)
+yuv2NBPS(14, LE, 0, nbps, int16_t)
+
+yuv2NBPS1(16, BE, 1, 16, int32_t)
+yuv2NBPS1(16, LE, 0, 16, int32_t)
+#if HAVE_POWER8
+yuv2NBPSX(16, BE, 1, 16, int32_t)
+yuv2NBPSX(16, LE, 0, 16, int32_t)
+#endif
+
+#define WRITERGB \
+        R_l = vec_max(R_l, zero32); \
+        R_r = vec_max(R_r, zero32); \
+        G_l = vec_max(G_l, zero32); \
+        G_r = vec_max(G_r, zero32); \
+        B_l = vec_max(B_l, zero32); \
+        B_r = vec_max(B_r, zero32); \
+\
+        R_l = vec_min(R_l, rgbclip); \
+        R_r = vec_min(R_r, rgbclip); \
+        G_l = vec_min(G_l, rgbclip); \
+        G_r = vec_min(G_r, rgbclip); \
+        B_l = vec_min(B_l, rgbclip); \
+        B_r = vec_min(B_r, rgbclip); \
+\
+        R_l = vec_sr(R_l, shift22); \
+        R_r = vec_sr(R_r, shift22); \
+        G_l = vec_sr(G_l, shift22); \
+        G_r = vec_sr(G_r, shift22); \
+        B_l = vec_sr(B_l, shift22); \
+        B_r = vec_sr(B_r, shift22); \
+\
+        rd16 = vec_packsu(R_l, R_r); \
+        gd16 = vec_packsu(G_l, G_r); \
+        bd16 = vec_packsu(B_l, B_r); \
+        rd = vec_packsu(rd16, zero16); \
+        gd = vec_packsu(gd16, zero16); \
+        bd = vec_packsu(bd16, zero16); \
+\
+        switch(target) { \
+        case AV_PIX_FMT_RGB24: \
+            out0 = vec_perm(rd, gd, perm3rg0); \
+            out0 = vec_perm(out0, bd, perm3tb0); \
+            out1 = vec_perm(rd, gd, perm3rg1); \
+            out1 = vec_perm(out1, bd, perm3tb1); \
+\
+            vec_vsx_st(out0, 0, dest); \
+            vec_vsx_st(out1, 16, dest); \
+\
+            dest += 24; \
+        break; \
+        case AV_PIX_FMT_BGR24: \
+            out0 = vec_perm(bd, gd, perm3rg0); \
+            out0 = vec_perm(out0, rd, perm3tb0); \
+            out1 = vec_perm(bd, gd, perm3rg1); \
+            out1 = vec_perm(out1, rd, perm3tb1); \
+\
+            vec_vsx_st(out0, 0, dest); \
+            vec_vsx_st(out1, 16, dest); \
+\
+            dest += 24; \
+        break; \
+        case AV_PIX_FMT_BGRA: \
+            out0 = vec_mergeh(bd, gd); \
+            out1 = vec_mergeh(rd, ad); \
+\
+            tmp8 = (vec_u8) vec_mergeh((vec_u16) out0, (vec_u16) out1); \
+            vec_vsx_st(tmp8, 0, dest); \
+            tmp8 = (vec_u8) vec_mergel((vec_u16) out0, (vec_u16) out1); \
+            vec_vsx_st(tmp8, 16, dest); \
+\
+            dest += 32; \
+        break; \
+        case AV_PIX_FMT_RGBA: \
+            out0 = vec_mergeh(rd, gd); \
+            out1 = vec_mergeh(bd, ad); \
+\
+            tmp8 = (vec_u8) vec_mergeh((vec_u16) out0, (vec_u16) out1); \
+            vec_vsx_st(tmp8, 0, dest); \
+            tmp8 = (vec_u8) vec_mergel((vec_u16) out0, (vec_u16) out1); \
+            vec_vsx_st(tmp8, 16, dest); \
+\
+            dest += 32; \
+        break; \
+        case AV_PIX_FMT_ARGB: \
+            out0 = vec_mergeh(ad, rd); \
+            out1 = vec_mergeh(gd, bd); \
+\
+            tmp8 = (vec_u8) vec_mergeh((vec_u16) out0, (vec_u16) out1); \
+            vec_vsx_st(tmp8, 0, dest); \
+            tmp8 = (vec_u8) vec_mergel((vec_u16) out0, (vec_u16) out1); \
+            vec_vsx_st(tmp8, 16, dest); \
+\
+            dest += 32; \
+        break; \
+        case AV_PIX_FMT_ABGR: \
+            out0 = vec_mergeh(ad, bd); \
+            out1 = vec_mergeh(gd, rd); \
+\
+            tmp8 = (vec_u8) vec_mergeh((vec_u16) out0, (vec_u16) out1); \
+            vec_vsx_st(tmp8, 0, dest); \
+            tmp8 = (vec_u8) vec_mergel((vec_u16) out0, (vec_u16) out1); \
+            vec_vsx_st(tmp8, 16, dest); \
+\
+            dest += 32; \
+        break; \
+        }
+
+static av_always_inline void
+yuv2rgb_full_X_vsx_template(SwsContext *c, const int16_t *lumFilter,
+                          const int16_t **lumSrc, int lumFilterSize,
+                          const int16_t *chrFilter, const int16_t **chrUSrc,
+                          const int16_t **chrVSrc, int chrFilterSize,
+                          const int16_t **alpSrc, uint8_t *dest,
+                          int dstW, int y, enum AVPixelFormat target, int hasAlpha)
+{
+    vec_s16 vv;
+    vec_s32 vy32_l, vy32_r, vu32_l, vu32_r, vv32_l, vv32_r, tmp32;
+    vec_s32 R_l, R_r, G_l, G_r, B_l, B_r;
+    vec_s32 tmp, tmp2, tmp3, tmp4;
+    vec_u16 rd16, gd16, bd16;
+    vec_u8 rd, bd, gd, ad, out0, out1, tmp8;
+    vec_s16 vlumFilter[MAX_FILTER_SIZE], vchrFilter[MAX_FILTER_SIZE];
+    const vec_s32 ystart = vec_splats(1 << 9);
+    const vec_s32 uvstart = vec_splats((1 << 9) - (128 << 19));
+    const vec_u16 zero16 = vec_splat_u16(0);
+    const vec_s32 y_offset = vec_splats(c->yuv2rgb_y_offset);
+    const vec_s32 y_coeff = vec_splats(c->yuv2rgb_y_coeff);
+    const vec_s32 y_add = vec_splats(1 << 21);
+    const vec_s32 v2r_coeff = vec_splats(c->yuv2rgb_v2r_coeff);
+    const vec_s32 v2g_coeff = vec_splats(c->yuv2rgb_v2g_coeff);
+    const vec_s32 u2g_coeff = vec_splats(c->yuv2rgb_u2g_coeff);
+    const vec_s32 u2b_coeff = vec_splats(c->yuv2rgb_u2b_coeff);
+    const vec_s32 rgbclip = vec_splats(1 << 30);
+    const vec_s32 zero32 = vec_splat_s32(0);
+    const vec_u32 shift22 = vec_splats(22U);
+    const vec_u32 shift10 = vec_splat_u32(10);
+    int i, j;
+
+    // Various permutations
+    const vec_u8 perm3rg0 = (vec_u8) {0x0, 0x10, 0,
+                                      0x1, 0x11, 0,
+                                      0x2, 0x12, 0,
+                                      0x3, 0x13, 0,
+                                      0x4, 0x14, 0,
+                                      0x5 };
+    const vec_u8 perm3rg1 = (vec_u8) {     0x15, 0,
+                                      0x6, 0x16, 0,
+                                      0x7, 0x17, 0 };
+    const vec_u8 perm3tb0 = (vec_u8) {0x0, 0x1, 0x10,
+                                      0x3, 0x4, 0x11,
+                                      0x6, 0x7, 0x12,
+                                      0x9, 0xa, 0x13,
+                                      0xc, 0xd, 0x14,
+                                      0xf };
+    const vec_u8 perm3tb1 = (vec_u8) {     0x0, 0x15,
+                                      0x2, 0x3, 0x16,
+                                      0x5, 0x6, 0x17 };
+
+    ad = vec_splats((uint8_t) 255);
+
+    for (i = 0; i < lumFilterSize; i++)
+        vlumFilter[i] = vec_splats(lumFilter[i]);
+    for (i = 0; i < chrFilterSize; i++)
+        vchrFilter[i] = vec_splats(chrFilter[i]);
+
+    for (i = 0; i < dstW; i += 8) {
+        vy32_l =
+        vy32_r = ystart;
+        vu32_l =
+        vu32_r =
+        vv32_l =
+        vv32_r = uvstart;
+
+        for (j = 0; j < lumFilterSize; j++) {
+            vv = vec_ld(0, &lumSrc[j][i]);
+            tmp = vec_mule(vv, vlumFilter[j]);
+            tmp2 = vec_mulo(vv, vlumFilter[j]);
+            tmp3 = vec_mergeh(tmp, tmp2);
+            tmp4 = vec_mergel(tmp, tmp2);
+
+            vy32_l = vec_adds(vy32_l, tmp3);
+            vy32_r = vec_adds(vy32_r, tmp4);
+        }
+
+        for (j = 0; j < chrFilterSize; j++) {
+            vv = vec_ld(0, &chrUSrc[j][i]);
+            tmp = vec_mule(vv, vchrFilter[j]);
+            tmp2 = vec_mulo(vv, vchrFilter[j]);
+            tmp3 = vec_mergeh(tmp, tmp2);
+            tmp4 = vec_mergel(tmp, tmp2);
+
+            vu32_l = vec_adds(vu32_l, tmp3);
+            vu32_r = vec_adds(vu32_r, tmp4);
+
+            vv = vec_ld(0, &chrVSrc[j][i]);
+            tmp = vec_mule(vv, vchrFilter[j]);
+            tmp2 = vec_mulo(vv, vchrFilter[j]);
+            tmp3 = vec_mergeh(tmp, tmp2);
+            tmp4 = vec_mergel(tmp, tmp2);
+
+            vv32_l = vec_adds(vv32_l, tmp3);
+            vv32_r = vec_adds(vv32_r, tmp4);
+        }
+
+        vy32_l = vec_sra(vy32_l, shift10);
+        vy32_r = vec_sra(vy32_r, shift10);
+        vu32_l = vec_sra(vu32_l, shift10);
+        vu32_r = vec_sra(vu32_r, shift10);
+        vv32_l = vec_sra(vv32_l, shift10);
+        vv32_r = vec_sra(vv32_r, shift10);
+
+        vy32_l = vec_sub(vy32_l, y_offset);
+        vy32_r = vec_sub(vy32_r, y_offset);
+        vy32_l = vec_mul(vy32_l, y_coeff);
+        vy32_r = vec_mul(vy32_r, y_coeff);
+        vy32_l = vec_add(vy32_l, y_add);
+        vy32_r = vec_add(vy32_r, y_add);
+
+        R_l = vec_mul(vv32_l, v2r_coeff);
+        R_l = vec_add(R_l, vy32_l);
+        R_r = vec_mul(vv32_r, v2r_coeff);
+        R_r = vec_add(R_r, vy32_r);
+        G_l = vec_mul(vv32_l, v2g_coeff);
+        tmp32 = vec_mul(vu32_l, u2g_coeff);
+        G_l = vec_add(G_l, vy32_l);
+        G_l = vec_add(G_l, tmp32);
+        G_r = vec_mul(vv32_r, v2g_coeff);
+        tmp32 = vec_mul(vu32_r, u2g_coeff);
+        G_r = vec_add(G_r, vy32_r);
+        G_r = vec_add(G_r, tmp32);
+
+        B_l = vec_mul(vu32_l, u2b_coeff);
+        B_l = vec_add(B_l, vy32_l);
+        B_r = vec_mul(vu32_r, u2b_coeff);
+        B_r = vec_add(B_r, vy32_r);
+
+        WRITERGB
+    }
+}
+
+#define SETUP(x, buf0, alpha1, buf1, alpha) { \
+    x = vec_ld(0, buf0); \
+    tmp = vec_mule(x, alpha1); \
+    tmp2 = vec_mulo(x, alpha1); \
+    tmp3 = vec_mergeh(tmp, tmp2); \
+    tmp4 = vec_mergel(tmp, tmp2); \
+\
+    x = vec_ld(0, buf1); \
+    tmp = vec_mule(x, alpha); \
+    tmp2 = vec_mulo(x, alpha); \
+    tmp5 = vec_mergeh(tmp, tmp2); \
+    tmp6 = vec_mergel(tmp, tmp2); \
+\
+    tmp3 = vec_add(tmp3, tmp5); \
+    tmp4 = vec_add(tmp4, tmp6); \
+}
+
+
+static av_always_inline void
+yuv2rgb_full_2_vsx_template(SwsContext *c, const int16_t *buf[2],
+                     const int16_t *ubuf[2], const int16_t *vbuf[2],
+                     const int16_t *abuf[2], uint8_t *dest, int dstW,
+                     int yalpha, int uvalpha, int y,
+                     enum AVPixelFormat target, int hasAlpha)
+{
+    const int16_t *buf0  = buf[0],  *buf1  = buf[1],
+                  *ubuf0 = ubuf[0], *ubuf1 = ubuf[1],
+                  *vbuf0 = vbuf[0], *vbuf1 = vbuf[1],
+                  *abuf0 = hasAlpha ? abuf[0] : NULL,
+                  *abuf1 = hasAlpha ? abuf[1] : NULL;
+    const int16_t  yalpha1 = 4096 - yalpha;
+    const int16_t uvalpha1 = 4096 - uvalpha;
+    vec_s16 vy, vu, vv, A = vec_splat_s16(0);
+    vec_s32 vy32_l, vy32_r, vu32_l, vu32_r, vv32_l, vv32_r, tmp32;
+    vec_s32 R_l, R_r, G_l, G_r, B_l, B_r;
+    vec_s32 tmp, tmp2, tmp3, tmp4, tmp5, tmp6;
+    vec_u16 rd16, gd16, bd16;
+    vec_u8 rd, bd, gd, ad, out0, out1, tmp8;
+    const vec_s16 vyalpha1 = vec_splats(yalpha1);
+    const vec_s16 vuvalpha1 = vec_splats(uvalpha1);
+    const vec_s16 vyalpha = vec_splats((int16_t) yalpha);
+    const vec_s16 vuvalpha = vec_splats((int16_t) uvalpha);
+    const vec_u16 zero16 = vec_splat_u16(0);
+    const vec_s32 y_offset = vec_splats(c->yuv2rgb_y_offset);
+    const vec_s32 y_coeff = vec_splats(c->yuv2rgb_y_coeff);
+    const vec_s32 y_add = vec_splats(1 << 21);
+    const vec_s32 v2r_coeff = vec_splats(c->yuv2rgb_v2r_coeff);
+    const vec_s32 v2g_coeff = vec_splats(c->yuv2rgb_v2g_coeff);
+    const vec_s32 u2g_coeff = vec_splats(c->yuv2rgb_u2g_coeff);
+    const vec_s32 u2b_coeff = vec_splats(c->yuv2rgb_u2b_coeff);
+    const vec_s32 rgbclip = vec_splats(1 << 30);
+    const vec_s32 zero32 = vec_splat_s32(0);
+    const vec_u32 shift19 = vec_splats(19U);
+    const vec_u32 shift22 = vec_splats(22U);
+    const vec_u32 shift10 = vec_splat_u32(10);
+    const vec_s32 dec128 = vec_splats(128 << 19);
+    const vec_s32 add18 = vec_splats(1 << 18);
+    int i;
+
+    // Various permutations
+    const vec_u8 perm3rg0 = (vec_u8) {0x0, 0x10, 0,
+                                      0x1, 0x11, 0,
+                                      0x2, 0x12, 0,
+                                      0x3, 0x13, 0,
+                                      0x4, 0x14, 0,
+                                      0x5 };
+    const vec_u8 perm3rg1 = (vec_u8) {     0x15, 0,
+                                      0x6, 0x16, 0,
+                                      0x7, 0x17, 0 };
+    const vec_u8 perm3tb0 = (vec_u8) {0x0, 0x1, 0x10,
+                                      0x3, 0x4, 0x11,
+                                      0x6, 0x7, 0x12,
+                                      0x9, 0xa, 0x13,
+                                      0xc, 0xd, 0x14,
+                                      0xf };
+    const vec_u8 perm3tb1 = (vec_u8) {     0x0, 0x15,
+                                      0x2, 0x3, 0x16,
+                                      0x5, 0x6, 0x17 };
+
+    av_assert2(yalpha  <= 4096U);
+    av_assert2(uvalpha <= 4096U);
+
+    for (i = 0; i < dstW; i += 8) {
+        SETUP(vy, &buf0[i], vyalpha1, &buf1[i], vyalpha);
+        vy32_l = vec_sra(tmp3, shift10);
+        vy32_r = vec_sra(tmp4, shift10);
+
+        SETUP(vu, &ubuf0[i], vuvalpha1, &ubuf1[i], vuvalpha);
+        tmp3 = vec_sub(tmp3, dec128);
+        tmp4 = vec_sub(tmp4, dec128);
+        vu32_l = vec_sra(tmp3, shift10);
+        vu32_r = vec_sra(tmp4, shift10);
+
+        SETUP(vv, &vbuf0[i], vuvalpha1, &vbuf1[i], vuvalpha);
+        tmp3 = vec_sub(tmp3, dec128);
+        tmp4 = vec_sub(tmp4, dec128);
+        vv32_l = vec_sra(tmp3, shift10);
+        vv32_r = vec_sra(tmp4, shift10);
+
+        if (hasAlpha) {
+            SETUP(A, &abuf0[i], vyalpha1, &abuf1[i], vyalpha);
+            tmp3 = vec_add(tmp3, add18);
+            tmp4 = vec_add(tmp4, add18);
+            tmp3 = vec_sra(tmp3, shift19);
+            tmp4 = vec_sra(tmp4, shift19);
+            A = vec_packs(tmp3, tmp4);
+            ad = vec_packsu(A, (vec_s16) zero16);
+        } else {
+            ad = vec_splats((uint8_t) 255);
+        }
+
+        vy32_l = vec_sub(vy32_l, y_offset);
+        vy32_r = vec_sub(vy32_r, y_offset);
+        vy32_l = vec_mul(vy32_l, y_coeff);
+        vy32_r = vec_mul(vy32_r, y_coeff);
+        vy32_l = vec_add(vy32_l, y_add);
+        vy32_r = vec_add(vy32_r, y_add);
+
+        R_l = vec_mul(vv32_l, v2r_coeff);
+        R_l = vec_add(R_l, vy32_l);
+        R_r = vec_mul(vv32_r, v2r_coeff);
+        R_r = vec_add(R_r, vy32_r);
+        G_l = vec_mul(vv32_l, v2g_coeff);
+        tmp32 = vec_mul(vu32_l, u2g_coeff);
+        G_l = vec_add(G_l, vy32_l);
+        G_l = vec_add(G_l, tmp32);
+        G_r = vec_mul(vv32_r, v2g_coeff);
+        tmp32 = vec_mul(vu32_r, u2g_coeff);
+        G_r = vec_add(G_r, vy32_r);
+        G_r = vec_add(G_r, tmp32);
+
+        B_l = vec_mul(vu32_l, u2b_coeff);
+        B_l = vec_add(B_l, vy32_l);
+        B_r = vec_mul(vu32_r, u2b_coeff);
+        B_r = vec_add(B_r, vy32_r);
+
+        WRITERGB
+    }
+}
+
+static av_always_inline void
+yuv2rgb_2_vsx_template(SwsContext *c, const int16_t *buf[2],
+                     const int16_t *ubuf[2], const int16_t *vbuf[2],
+                     const int16_t *abuf[2], uint8_t *dest, int dstW,
+                     int yalpha, int uvalpha, int y,
+                     enum AVPixelFormat target, int hasAlpha)
+{
+    const int16_t *buf0  = buf[0],  *buf1  = buf[1],
+                  *ubuf0 = ubuf[0], *ubuf1 = ubuf[1],
+                  *vbuf0 = vbuf[0], *vbuf1 = vbuf[1],
+                  *abuf0 = hasAlpha ? abuf[0] : NULL,
+                  *abuf1 = hasAlpha ? abuf[1] : NULL;
+    const int16_t  yalpha1 = 4096 - yalpha;
+    const int16_t uvalpha1 = 4096 - uvalpha;
+    vec_s16 vy, vu, vv, A = vec_splat_s16(0);
+    vec_s32 vy32_l, vy32_r, vu32_l, vu32_r, vv32_l, vv32_r, tmp32;
+    vec_s32 R_l, R_r, G_l, G_r, B_l, B_r, vud32_l, vud32_r, vvd32_l, vvd32_r;
+    vec_s32 tmp, tmp2, tmp3, tmp4, tmp5, tmp6;
+    vec_u16 rd16, gd16, bd16;
+    vec_u8 rd, bd, gd, ad, out0, out1, tmp8;
+    const vec_s16 vyalpha1 = vec_splats(yalpha1);
+    const vec_s16 vuvalpha1 = vec_splats(uvalpha1);
+    const vec_s16 vyalpha = vec_splats((int16_t) yalpha);
+    const vec_s16 vuvalpha = vec_splats((int16_t) uvalpha);
+    const vec_u16 zero16 = vec_splat_u16(0);
+    const vec_s32 y_offset = vec_splats(c->yuv2rgb_y_offset);
+    const vec_s32 y_coeff = vec_splats(c->yuv2rgb_y_coeff);
+    const vec_s32 y_add = vec_splats(1 << 21);
+    const vec_s32 v2r_coeff = vec_splats(c->yuv2rgb_v2r_coeff);
+    const vec_s32 v2g_coeff = vec_splats(c->yuv2rgb_v2g_coeff);
+    const vec_s32 u2g_coeff = vec_splats(c->yuv2rgb_u2g_coeff);
+    const vec_s32 u2b_coeff = vec_splats(c->yuv2rgb_u2b_coeff);
+    const vec_s32 rgbclip = vec_splats(1 << 30);
+    const vec_s32 zero32 = vec_splat_s32(0);
+    const vec_u32 shift19 = vec_splats(19U);
+    const vec_u32 shift22 = vec_splats(22U);
+    const vec_u32 shift10 = vec_splat_u32(10);
+    const vec_s32 dec128 = vec_splats(128 << 19);
+    const vec_s32 add18 = vec_splats(1 << 18);
+    int i;
+
+    // Various permutations
+    const vec_u8 doubleleft = (vec_u8) {0, 1, 2, 3,
+                                        0, 1, 2, 3,
+                                        4, 5, 6, 7,
+                                        4, 5, 6, 7 };
+    const vec_u8 doubleright = (vec_u8) {8, 9, 10, 11,
+                                         8, 9, 10, 11,
+                                         12, 13, 14, 15,
+                                         12, 13, 14, 15 };
+    const vec_u8 perm3rg0 = (vec_u8) {0x0, 0x10, 0,
+                                      0x1, 0x11, 0,
+                                      0x2, 0x12, 0,
+                                      0x3, 0x13, 0,
+                                      0x4, 0x14, 0,
+                                      0x5 };
+    const vec_u8 perm3rg1 = (vec_u8) {     0x15, 0,
+                                      0x6, 0x16, 0,
+                                      0x7, 0x17, 0 };
+    const vec_u8 perm3tb0 = (vec_u8) {0x0, 0x1, 0x10,
+                                      0x3, 0x4, 0x11,
+                                      0x6, 0x7, 0x12,
+                                      0x9, 0xa, 0x13,
+                                      0xc, 0xd, 0x14,
+                                      0xf };
+    const vec_u8 perm3tb1 = (vec_u8) {     0x0, 0x15,
+                                      0x2, 0x3, 0x16,
+                                      0x5, 0x6, 0x17 };
+
+    av_assert2(yalpha  <= 4096U);
+    av_assert2(uvalpha <= 4096U);
+
+    for (i = 0; i < (dstW + 1) >> 1; i += 8) {
+        SETUP(vy, &buf0[i * 2], vyalpha1, &buf1[i * 2], vyalpha);
+        vy32_l = vec_sra(tmp3, shift10);
+        vy32_r = vec_sra(tmp4, shift10);
+
+        SETUP(vu, &ubuf0[i], vuvalpha1, &ubuf1[i], vuvalpha);
+        tmp3 = vec_sub(tmp3, dec128);
+        tmp4 = vec_sub(tmp4, dec128);
+        vu32_l = vec_sra(tmp3, shift10);
+        vu32_r = vec_sra(tmp4, shift10);
+
+        SETUP(vv, &vbuf0[i], vuvalpha1, &vbuf1[i], vuvalpha);
+        tmp3 = vec_sub(tmp3, dec128);
+        tmp4 = vec_sub(tmp4, dec128);
+        vv32_l = vec_sra(tmp3, shift10);
+        vv32_r = vec_sra(tmp4, shift10);
+
+        if (hasAlpha) {
+            SETUP(A, &abuf0[i], vyalpha1, &abuf1[i], vyalpha);
+            tmp3 = vec_add(tmp3, add18);
+            tmp4 = vec_add(tmp4, add18);
+            tmp3 = vec_sra(tmp3, shift19);
+            tmp4 = vec_sra(tmp4, shift19);
+            A = vec_packs(tmp3, tmp4);
+            ad = vec_packsu(A, (vec_s16) zero16);
+        } else {
+            ad = vec_splats((uint8_t) 255);
+        }
+
+        vy32_l = vec_sub(vy32_l, y_offset);
+        vy32_r = vec_sub(vy32_r, y_offset);
+        vy32_l = vec_mul(vy32_l, y_coeff);
+        vy32_r = vec_mul(vy32_r, y_coeff);
+        vy32_l = vec_add(vy32_l, y_add);
+        vy32_r = vec_add(vy32_r, y_add);
+
+        // Use the first UV half
+        vud32_l = vec_perm(vu32_l, vu32_l, doubleleft);
+        vud32_r = vec_perm(vu32_l, vu32_l, doubleright);
+        vvd32_l = vec_perm(vv32_l, vv32_l, doubleleft);
+        vvd32_r = vec_perm(vv32_l, vv32_l, doubleright);
+
+        R_l = vec_mul(vvd32_l, v2r_coeff);
+        R_l = vec_add(R_l, vy32_l);
+        R_r = vec_mul(vvd32_r, v2r_coeff);
+        R_r = vec_add(R_r, vy32_r);
+        G_l = vec_mul(vvd32_l, v2g_coeff);
+        tmp32 = vec_mul(vud32_l, u2g_coeff);
+        G_l = vec_add(G_l, vy32_l);
+        G_l = vec_add(G_l, tmp32);
+        G_r = vec_mul(vvd32_r, v2g_coeff);
+        tmp32 = vec_mul(vud32_r, u2g_coeff);
+        G_r = vec_add(G_r, vy32_r);
+        G_r = vec_add(G_r, tmp32);
+
+        B_l = vec_mul(vud32_l, u2b_coeff);
+        B_l = vec_add(B_l, vy32_l);
+        B_r = vec_mul(vud32_r, u2b_coeff);
+        B_r = vec_add(B_r, vy32_r);
+
+        WRITERGB
+
+        // New Y for the second half
+        SETUP(vy, &buf0[i * 2 + 8], vyalpha1, &buf1[i * 2 + 8], vyalpha);
+        vy32_l = vec_sra(tmp3, shift10);
+        vy32_r = vec_sra(tmp4, shift10);
+
+        vy32_l = vec_sub(vy32_l, y_offset);
+        vy32_r = vec_sub(vy32_r, y_offset);
+        vy32_l = vec_mul(vy32_l, y_coeff);
+        vy32_r = vec_mul(vy32_r, y_coeff);
+        vy32_l = vec_add(vy32_l, y_add);
+        vy32_r = vec_add(vy32_r, y_add);
+
+        // Second UV half
+        vud32_l = vec_perm(vu32_r, vu32_r, doubleleft);
+        vud32_r = vec_perm(vu32_r, vu32_r, doubleright);
+        vvd32_l = vec_perm(vv32_r, vv32_r, doubleleft);
+        vvd32_r = vec_perm(vv32_r, vv32_r, doubleright);
+
+        R_l = vec_mul(vvd32_l, v2r_coeff);
+        R_l = vec_add(R_l, vy32_l);
+        R_r = vec_mul(vvd32_r, v2r_coeff);
+        R_r = vec_add(R_r, vy32_r);
+        G_l = vec_mul(vvd32_l, v2g_coeff);
+        tmp32 = vec_mul(vud32_l, u2g_coeff);
+        G_l = vec_add(G_l, vy32_l);
+        G_l = vec_add(G_l, tmp32);
+        G_r = vec_mul(vvd32_r, v2g_coeff);
+        tmp32 = vec_mul(vud32_r, u2g_coeff);
+        G_r = vec_add(G_r, vy32_r);
+        G_r = vec_add(G_r, tmp32);
+
+        B_l = vec_mul(vud32_l, u2b_coeff);
+        B_l = vec_add(B_l, vy32_l);
+        B_r = vec_mul(vud32_r, u2b_coeff);
+        B_r = vec_add(B_r, vy32_r);
+
+        WRITERGB
+    }
+}
+
+#undef SETUP
+
+static av_always_inline void
+yuv2rgb_full_1_vsx_template(SwsContext *c, const int16_t *buf0,
+                     const int16_t *ubuf[2], const int16_t *vbuf[2],
+                     const int16_t *abuf0, uint8_t *dest, int dstW,
+                     int uvalpha, int y, enum AVPixelFormat target,
+                     int hasAlpha)
+{
+    const int16_t *ubuf0 = ubuf[0], *vbuf0 = vbuf[0];
+    const int16_t *ubuf1 = ubuf[1], *vbuf1 = vbuf[1];
+    vec_s16 vy, vu, vv, A = vec_splat_s16(0), tmp16;
+    vec_s32 vy32_l, vy32_r, vu32_l, vu32_r, vv32_l, vv32_r, tmp32, tmp32_2;
+    vec_s32 R_l, R_r, G_l, G_r, B_l, B_r;
+    vec_u16 rd16, gd16, bd16;
+    vec_u8 rd, bd, gd, ad, out0, out1, tmp8;
+    const vec_u16 zero16 = vec_splat_u16(0);
+    const vec_s32 y_offset = vec_splats(c->yuv2rgb_y_offset);
+    const vec_s32 y_coeff = vec_splats(c->yuv2rgb_y_coeff);
+    const vec_s32 y_add = vec_splats(1 << 21);
+    const vec_s32 v2r_coeff = vec_splats(c->yuv2rgb_v2r_coeff);
+    const vec_s32 v2g_coeff = vec_splats(c->yuv2rgb_v2g_coeff);
+    const vec_s32 u2g_coeff = vec_splats(c->yuv2rgb_u2g_coeff);
+    const vec_s32 u2b_coeff = vec_splats(c->yuv2rgb_u2b_coeff);
+    const vec_s32 rgbclip = vec_splats(1 << 30);
+    const vec_s32 zero32 = vec_splat_s32(0);
+    const vec_u32 shift2 = vec_splat_u32(2);
+    const vec_u32 shift22 = vec_splats(22U);
+    const vec_u16 sub7 = vec_splats((uint16_t) (128 << 7));
+    const vec_u16 sub8 = vec_splats((uint16_t) (128 << 8));
+    const vec_s16 mul4 = vec_splat_s16(4);
+    const vec_s16 mul8 = vec_splat_s16(8);
+    const vec_s16 add64 = vec_splat_s16(64);
+    const vec_u16 shift7 = vec_splat_u16(7);
+    const vec_s16 max255 = vec_splat_s16(255);
+    int i;
+
+    // Various permutations
+    const vec_u8 perm3rg0 = (vec_u8) {0x0, 0x10, 0,
+                                      0x1, 0x11, 0,
+                                      0x2, 0x12, 0,
+                                      0x3, 0x13, 0,
+                                      0x4, 0x14, 0,
+                                      0x5 };
+    const vec_u8 perm3rg1 = (vec_u8) {     0x15, 0,
+                                      0x6, 0x16, 0,
+                                      0x7, 0x17, 0 };
+    const vec_u8 perm3tb0 = (vec_u8) {0x0, 0x1, 0x10,
+                                      0x3, 0x4, 0x11,
+                                      0x6, 0x7, 0x12,
+                                      0x9, 0xa, 0x13,
+                                      0xc, 0xd, 0x14,
+                                      0xf };
+    const vec_u8 perm3tb1 = (vec_u8) {     0x0, 0x15,
+                                      0x2, 0x3, 0x16,
+                                      0x5, 0x6, 0x17 };
+
+    for (i = 0; i < dstW; i += 8) { // The x86 asm also overwrites padding bytes.
+        vy = vec_ld(0, &buf0[i]);
+        vy32_l = vec_unpackh(vy);
+        vy32_r = vec_unpackl(vy);
+        vy32_l = vec_sl(vy32_l, shift2);
+        vy32_r = vec_sl(vy32_r, shift2);
+
+        vu = vec_ld(0, &ubuf0[i]);
+        vv = vec_ld(0, &vbuf0[i]);
+        if (uvalpha < 2048) {
+            vu = (vec_s16) vec_sub((vec_u16) vu, sub7);
+            vv = (vec_s16) vec_sub((vec_u16) vv, sub7);
+
+            tmp32 = vec_mule(vu, mul4);
+            tmp32_2 = vec_mulo(vu, mul4);
+            vu32_l = vec_mergeh(tmp32, tmp32_2);
+            vu32_r = vec_mergel(tmp32, tmp32_2);
+            tmp32 = vec_mule(vv, mul4);
+            tmp32_2 = vec_mulo(vv, mul4);
+            vv32_l = vec_mergeh(tmp32, tmp32_2);
+            vv32_r = vec_mergel(tmp32, tmp32_2);
+        } else {
+            tmp16 = vec_ld(0, &ubuf1[i]);
+            vu = vec_add(vu, tmp16);
+            vu = (vec_s16) vec_sub((vec_u16) vu, sub8);
+            tmp16 = vec_ld(0, &vbuf1[i]);
+            vv = vec_add(vv, tmp16);
+            vv = (vec_s16) vec_sub((vec_u16) vv, sub8);
+
+            vu32_l = vec_mule(vu, mul8);
+            vu32_r = vec_mulo(vu, mul8);
+            vv32_l = vec_mule(vv, mul8);
+            vv32_r = vec_mulo(vv, mul8);
+        }
+
+        if (hasAlpha) {
+            A = vec_ld(0, &abuf0[i]);
+            A = vec_add(A, add64);
+            A = vec_sr(A, shift7);
+            A = vec_max(A, max255);
+            ad = vec_packsu(A, (vec_s16) zero16);
+        } else {
+            ad = vec_splats((uint8_t) 255);
+        }
+
+        vy32_l = vec_sub(vy32_l, y_offset);
+        vy32_r = vec_sub(vy32_r, y_offset);
+        vy32_l = vec_mul(vy32_l, y_coeff);
+        vy32_r = vec_mul(vy32_r, y_coeff);
+        vy32_l = vec_add(vy32_l, y_add);
+        vy32_r = vec_add(vy32_r, y_add);
+
+        R_l = vec_mul(vv32_l, v2r_coeff);
+        R_l = vec_add(R_l, vy32_l);
+        R_r = vec_mul(vv32_r, v2r_coeff);
+        R_r = vec_add(R_r, vy32_r);
+        G_l = vec_mul(vv32_l, v2g_coeff);
+        tmp32 = vec_mul(vu32_l, u2g_coeff);
+        G_l = vec_add(G_l, vy32_l);
+        G_l = vec_add(G_l, tmp32);
+        G_r = vec_mul(vv32_r, v2g_coeff);
+        tmp32 = vec_mul(vu32_r, u2g_coeff);
+        G_r = vec_add(G_r, vy32_r);
+        G_r = vec_add(G_r, tmp32);
+
+        B_l = vec_mul(vu32_l, u2b_coeff);
+        B_l = vec_add(B_l, vy32_l);
+        B_r = vec_mul(vu32_r, u2b_coeff);
+        B_r = vec_add(B_r, vy32_r);
+
+        WRITERGB
+    }
+}
+
+static av_always_inline void
+yuv2rgb_1_vsx_template(SwsContext *c, const int16_t *buf0,
+                     const int16_t *ubuf[2], const int16_t *vbuf[2],
+                     const int16_t *abuf0, uint8_t *dest, int dstW,
+                     int uvalpha, int y, enum AVPixelFormat target,
+                     int hasAlpha)
+{
+    const int16_t *ubuf0 = ubuf[0], *vbuf0 = vbuf[0];
+    const int16_t *ubuf1 = ubuf[1], *vbuf1 = vbuf[1];
+    vec_s16 vy, vu, vv, A = vec_splat_s16(0), tmp16;
+    vec_s32 vy32_l, vy32_r, vu32_l, vu32_r, vv32_l, vv32_r, tmp32, tmp32_2;
+    vec_s32 vud32_l, vud32_r, vvd32_l, vvd32_r;
+    vec_s32 R_l, R_r, G_l, G_r, B_l, B_r;
+    vec_u16 rd16, gd16, bd16;
+    vec_u8 rd, bd, gd, ad, out0, out1, tmp8;
+    const vec_u16 zero16 = vec_splat_u16(0);
+    const vec_s32 y_offset = vec_splats(c->yuv2rgb_y_offset);
+    const vec_s32 y_coeff = vec_splats(c->yuv2rgb_y_coeff);
+    const vec_s32 y_add = vec_splats(1 << 21);
+    const vec_s32 v2r_coeff = vec_splats(c->yuv2rgb_v2r_coeff);
+    const vec_s32 v2g_coeff = vec_splats(c->yuv2rgb_v2g_coeff);
+    const vec_s32 u2g_coeff = vec_splats(c->yuv2rgb_u2g_coeff);
+    const vec_s32 u2b_coeff = vec_splats(c->yuv2rgb_u2b_coeff);
+    const vec_s32 rgbclip = vec_splats(1 << 30);
+    const vec_s32 zero32 = vec_splat_s32(0);
+    const vec_u32 shift2 = vec_splat_u32(2);
+    const vec_u32 shift22 = vec_splats(22U);
+    const vec_u16 sub7 = vec_splats((uint16_t) (128 << 7));
+    const vec_u16 sub8 = vec_splats((uint16_t) (128 << 8));
+    const vec_s16 mul4 = vec_splat_s16(4);
+    const vec_s16 mul8 = vec_splat_s16(8);
+    const vec_s16 add64 = vec_splat_s16(64);
+    const vec_u16 shift7 = vec_splat_u16(7);
+    const vec_s16 max255 = vec_splat_s16(255);
+    int i;
+
+    // Various permutations
+    const vec_u8 doubleleft = (vec_u8) {0, 1, 2, 3,
+                                        0, 1, 2, 3,
+                                        4, 5, 6, 7,
+                                        4, 5, 6, 7 };
+    const vec_u8 doubleright = (vec_u8) {8, 9, 10, 11,
+                                         8, 9, 10, 11,
+                                         12, 13, 14, 15,
+                                         12, 13, 14, 15 };
+    const vec_u8 perm3rg0 = (vec_u8) {0x0, 0x10, 0,
+                                      0x1, 0x11, 0,
+                                      0x2, 0x12, 0,
+                                      0x3, 0x13, 0,
+                                      0x4, 0x14, 0,
+                                      0x5 };
+    const vec_u8 perm3rg1 = (vec_u8) {     0x15, 0,
+                                      0x6, 0x16, 0,
+                                      0x7, 0x17, 0 };
+    const vec_u8 perm3tb0 = (vec_u8) {0x0, 0x1, 0x10,
+                                      0x3, 0x4, 0x11,
+                                      0x6, 0x7, 0x12,
+                                      0x9, 0xa, 0x13,
+                                      0xc, 0xd, 0x14,
+                                      0xf };
+    const vec_u8 perm3tb1 = (vec_u8) {     0x0, 0x15,
+                                      0x2, 0x3, 0x16,
+                                      0x5, 0x6, 0x17 };
+
+    for (i = 0; i < (dstW + 1) >> 1; i += 8) { // The x86 asm also overwrites padding bytes.
+        vy = vec_ld(0, &buf0[i * 2]);
+        vy32_l = vec_unpackh(vy);
+        vy32_r = vec_unpackl(vy);
+        vy32_l = vec_sl(vy32_l, shift2);
+        vy32_r = vec_sl(vy32_r, shift2);
+
+        vu = vec_ld(0, &ubuf0[i]);
+        vv = vec_ld(0, &vbuf0[i]);
+        if (uvalpha < 2048) {
+            vu = (vec_s16) vec_sub((vec_u16) vu, sub7);
+            vv = (vec_s16) vec_sub((vec_u16) vv, sub7);
+
+            tmp32 = vec_mule(vu, mul4);
+            tmp32_2 = vec_mulo(vu, mul4);
+            vu32_l = vec_mergeh(tmp32, tmp32_2);
+            vu32_r = vec_mergel(tmp32, tmp32_2);
+            tmp32 = vec_mule(vv, mul4);
+            tmp32_2 = vec_mulo(vv, mul4);
+            vv32_l = vec_mergeh(tmp32, tmp32_2);
+            vv32_r = vec_mergel(tmp32, tmp32_2);
+        } else {
+            tmp16 = vec_ld(0, &ubuf1[i]);
+            vu = vec_add(vu, tmp16);
+            vu = (vec_s16) vec_sub((vec_u16) vu, sub8);
+            tmp16 = vec_ld(0, &vbuf1[i]);
+            vv = vec_add(vv, tmp16);
+            vv = (vec_s16) vec_sub((vec_u16) vv, sub8);
+
+            vu32_l = vec_mule(vu, mul8);
+            vu32_r = vec_mulo(vu, mul8);
+            vv32_l = vec_mule(vv, mul8);
+            vv32_r = vec_mulo(vv, mul8);
+        }
+
+        if (hasAlpha) {
+            A = vec_ld(0, &abuf0[i]);
+            A = vec_add(A, add64);
+            A = vec_sr(A, shift7);
+            A = vec_max(A, max255);
+            ad = vec_packsu(A, (vec_s16) zero16);
+        } else {
+            ad = vec_splats((uint8_t) 255);
+        }
+
+        vy32_l = vec_sub(vy32_l, y_offset);
+        vy32_r = vec_sub(vy32_r, y_offset);
+        vy32_l = vec_mul(vy32_l, y_coeff);
+        vy32_r = vec_mul(vy32_r, y_coeff);
+        vy32_l = vec_add(vy32_l, y_add);
+        vy32_r = vec_add(vy32_r, y_add);
+
+        // Use the first UV half
+        vud32_l = vec_perm(vu32_l, vu32_l, doubleleft);
+        vud32_r = vec_perm(vu32_l, vu32_l, doubleright);
+        vvd32_l = vec_perm(vv32_l, vv32_l, doubleleft);
+        vvd32_r = vec_perm(vv32_l, vv32_l, doubleright);
+
+        R_l = vec_mul(vvd32_l, v2r_coeff);
+        R_l = vec_add(R_l, vy32_l);
+        R_r = vec_mul(vvd32_r, v2r_coeff);
+        R_r = vec_add(R_r, vy32_r);
+        G_l = vec_mul(vvd32_l, v2g_coeff);
+        tmp32 = vec_mul(vud32_l, u2g_coeff);
+        G_l = vec_add(G_l, vy32_l);
+        G_l = vec_add(G_l, tmp32);
+        G_r = vec_mul(vvd32_r, v2g_coeff);
+        tmp32 = vec_mul(vud32_r, u2g_coeff);
+        G_r = vec_add(G_r, vy32_r);
+        G_r = vec_add(G_r, tmp32);
+
+        B_l = vec_mul(vud32_l, u2b_coeff);
+        B_l = vec_add(B_l, vy32_l);
+        B_r = vec_mul(vud32_r, u2b_coeff);
+        B_r = vec_add(B_r, vy32_r);
+
+        WRITERGB
+
+        // New Y for the second half
+        vy = vec_ld(16, &buf0[i * 2]);
+        vy32_l = vec_unpackh(vy);
+        vy32_r = vec_unpackl(vy);
+        vy32_l = vec_sl(vy32_l, shift2);
+        vy32_r = vec_sl(vy32_r, shift2);
+
+        vy32_l = vec_sub(vy32_l, y_offset);
+        vy32_r = vec_sub(vy32_r, y_offset);
+        vy32_l = vec_mul(vy32_l, y_coeff);
+        vy32_r = vec_mul(vy32_r, y_coeff);
+        vy32_l = vec_add(vy32_l, y_add);
+        vy32_r = vec_add(vy32_r, y_add);
+
+        // Second UV half
+        vud32_l = vec_perm(vu32_r, vu32_r, doubleleft);
+        vud32_r = vec_perm(vu32_r, vu32_r, doubleright);
+        vvd32_l = vec_perm(vv32_r, vv32_r, doubleleft);
+        vvd32_r = vec_perm(vv32_r, vv32_r, doubleright);
+
+        R_l = vec_mul(vvd32_l, v2r_coeff);
+        R_l = vec_add(R_l, vy32_l);
+        R_r = vec_mul(vvd32_r, v2r_coeff);
+        R_r = vec_add(R_r, vy32_r);
+        G_l = vec_mul(vvd32_l, v2g_coeff);
+        tmp32 = vec_mul(vud32_l, u2g_coeff);
+        G_l = vec_add(G_l, vy32_l);
+        G_l = vec_add(G_l, tmp32);
+        G_r = vec_mul(vvd32_r, v2g_coeff);
+        tmp32 = vec_mul(vud32_r, u2g_coeff);
+        G_r = vec_add(G_r, vy32_r);
+        G_r = vec_add(G_r, tmp32);
+
+        B_l = vec_mul(vud32_l, u2b_coeff);
+        B_l = vec_add(B_l, vy32_l);
+        B_r = vec_mul(vud32_r, u2b_coeff);
+        B_r = vec_add(B_r, vy32_r);
+
+        WRITERGB
+    }
+}
+
+#undef WRITERGB
+
+#define YUV2RGBWRAPPERX(name, base, ext, fmt, hasAlpha) \
+static void name ## ext ## _X_vsx(SwsContext *c, const int16_t *lumFilter, \
+                                const int16_t **lumSrc, int lumFilterSize, \
+                                const int16_t *chrFilter, const int16_t **chrUSrc, \
+                                const int16_t **chrVSrc, int chrFilterSize, \
+                                const int16_t **alpSrc, uint8_t *dest, int dstW, \
+                                int y) \
+{ \
+    name ## base ## _X_vsx_template(c, lumFilter, lumSrc, lumFilterSize, \
+                                  chrFilter, chrUSrc, chrVSrc, chrFilterSize, \
+                                  alpSrc, dest, dstW, y, fmt, hasAlpha); \
+}
+
+#define YUV2RGBWRAPPERX2(name, base, ext, fmt, hasAlpha) \
+static void name ## ext ## _2_vsx(SwsContext *c, const int16_t *buf[2], \
+                                const int16_t *ubuf[2], const int16_t *vbuf[2], \
+                                const int16_t *abuf[2], uint8_t *dest, int dstW, \
+                                int yalpha, int uvalpha, int y) \
+{ \
+    name ## base ## _2_vsx_template(c, buf, ubuf, vbuf, abuf, \
+                                  dest, dstW, yalpha, uvalpha, y, fmt, hasAlpha); \
+}
+
+#define YUV2RGBWRAPPER(name, base, ext, fmt, hasAlpha) \
+static void name ## ext ## _1_vsx(SwsContext *c, const int16_t *buf0, \
+                                const int16_t *ubuf[2], const int16_t *vbuf[2], \
+                                const int16_t *abuf0, uint8_t *dest, int dstW, \
+                                int uvalpha, int y) \
+{ \
+    name ## base ## _1_vsx_template(c, buf0, ubuf, vbuf, abuf0, dest, \
+                                  dstW, uvalpha, y, fmt, hasAlpha); \
+}
+
+YUV2RGBWRAPPER(yuv2, rgb, bgrx32, AV_PIX_FMT_BGRA,  0)
+YUV2RGBWRAPPER(yuv2, rgb, rgbx32, AV_PIX_FMT_RGBA,  0)
+YUV2RGBWRAPPER(yuv2, rgb, xrgb32, AV_PIX_FMT_ARGB,  0)
+YUV2RGBWRAPPER(yuv2, rgb, xbgr32, AV_PIX_FMT_ABGR,  0)
+
+YUV2RGBWRAPPER(yuv2, rgb, rgb24, AV_PIX_FMT_RGB24,   0)
+YUV2RGBWRAPPER(yuv2, rgb, bgr24, AV_PIX_FMT_BGR24,   0)
+
+YUV2RGBWRAPPERX2(yuv2, rgb, bgrx32, AV_PIX_FMT_BGRA,  0)
+YUV2RGBWRAPPERX2(yuv2, rgb, rgbx32, AV_PIX_FMT_RGBA,  0)
+YUV2RGBWRAPPERX2(yuv2, rgb, xrgb32, AV_PIX_FMT_ARGB,  0)
+YUV2RGBWRAPPERX2(yuv2, rgb, xbgr32, AV_PIX_FMT_ABGR,  0)
+
+YUV2RGBWRAPPERX2(yuv2, rgb, rgb24, AV_PIX_FMT_RGB24,   0)
+YUV2RGBWRAPPERX2(yuv2, rgb, bgr24, AV_PIX_FMT_BGR24,   0)
+
+YUV2RGBWRAPPER(yuv2, rgb_full, bgrx32_full, AV_PIX_FMT_BGRA,  0)
+YUV2RGBWRAPPER(yuv2, rgb_full, rgbx32_full, AV_PIX_FMT_RGBA,  0)
+YUV2RGBWRAPPER(yuv2, rgb_full, xrgb32_full, AV_PIX_FMT_ARGB,  0)
+YUV2RGBWRAPPER(yuv2, rgb_full, xbgr32_full, AV_PIX_FMT_ABGR,  0)
+
+YUV2RGBWRAPPER(yuv2, rgb_full, rgb24_full,  AV_PIX_FMT_RGB24, 0)
+YUV2RGBWRAPPER(yuv2, rgb_full, bgr24_full,  AV_PIX_FMT_BGR24, 0)
+
+YUV2RGBWRAPPERX2(yuv2, rgb_full, bgrx32_full, AV_PIX_FMT_BGRA,  0)
+YUV2RGBWRAPPERX2(yuv2, rgb_full, rgbx32_full, AV_PIX_FMT_RGBA,  0)
+YUV2RGBWRAPPERX2(yuv2, rgb_full, xrgb32_full, AV_PIX_FMT_ARGB,  0)
+YUV2RGBWRAPPERX2(yuv2, rgb_full, xbgr32_full, AV_PIX_FMT_ABGR,  0)
+
+YUV2RGBWRAPPERX2(yuv2, rgb_full, rgb24_full,  AV_PIX_FMT_RGB24, 0)
+YUV2RGBWRAPPERX2(yuv2, rgb_full, bgr24_full,  AV_PIX_FMT_BGR24, 0)
+
+YUV2RGBWRAPPERX(yuv2, rgb_full, bgrx32_full, AV_PIX_FMT_BGRA,  0)
+YUV2RGBWRAPPERX(yuv2, rgb_full, rgbx32_full, AV_PIX_FMT_RGBA,  0)
+YUV2RGBWRAPPERX(yuv2, rgb_full, xrgb32_full, AV_PIX_FMT_ARGB,  0)
+YUV2RGBWRAPPERX(yuv2, rgb_full, xbgr32_full, AV_PIX_FMT_ABGR,  0)
+
+YUV2RGBWRAPPERX(yuv2, rgb_full, rgb24_full,  AV_PIX_FMT_RGB24, 0)
+YUV2RGBWRAPPERX(yuv2, rgb_full, bgr24_full,  AV_PIX_FMT_BGR24, 0)
+
+static av_always_inline void
+write422(const vec_s16 vy1, const vec_s16 vy2,
+         const vec_s16 vu, const vec_s16 vv,
+         uint8_t *dest, const enum AVPixelFormat target)
+{
+    vec_u8 vd1, vd2, tmp;
+    const vec_u8 yuyv1 = (vec_u8) {
+                         0x0, 0x10, 0x1, 0x18,
+                         0x2, 0x11, 0x3, 0x19,
+                         0x4, 0x12, 0x5, 0x1a,
+                         0x6, 0x13, 0x7, 0x1b };
+    const vec_u8 yuyv2 = (vec_u8) {
+                         0x8, 0x14, 0x9, 0x1c,
+                         0xa, 0x15, 0xb, 0x1d,
+                         0xc, 0x16, 0xd, 0x1e,
+                         0xe, 0x17, 0xf, 0x1f };
+    const vec_u8 yvyu1 = (vec_u8) {
+                         0x0, 0x18, 0x1, 0x10,
+                         0x2, 0x19, 0x3, 0x11,
+                         0x4, 0x1a, 0x5, 0x12,
+                         0x6, 0x1b, 0x7, 0x13 };
+    const vec_u8 yvyu2 = (vec_u8) {
+                         0x8, 0x1c, 0x9, 0x14,
+                         0xa, 0x1d, 0xb, 0x15,
+                         0xc, 0x1e, 0xd, 0x16,
+                         0xe, 0x1f, 0xf, 0x17 };
+    const vec_u8 uyvy1 = (vec_u8) {
+                         0x10, 0x0, 0x18, 0x1,
+                         0x11, 0x2, 0x19, 0x3,
+                         0x12, 0x4, 0x1a, 0x5,
+                         0x13, 0x6, 0x1b, 0x7 };
+    const vec_u8 uyvy2 = (vec_u8) {
+                         0x14, 0x8, 0x1c, 0x9,
+                         0x15, 0xa, 0x1d, 0xb,
+                         0x16, 0xc, 0x1e, 0xd,
+                         0x17, 0xe, 0x1f, 0xf };
+
+    vd1 = vec_packsu(vy1, vy2);
+    vd2 = vec_packsu(vu, vv);
+
+    switch (target) {
+    case AV_PIX_FMT_YUYV422:
+        tmp = vec_perm(vd1, vd2, yuyv1);
+        vec_st(tmp, 0, dest);
+        tmp = vec_perm(vd1, vd2, yuyv2);
+        vec_st(tmp, 16, dest);
+    break;
+    case AV_PIX_FMT_YVYU422:
+        tmp = vec_perm(vd1, vd2, yvyu1);
+        vec_st(tmp, 0, dest);
+        tmp = vec_perm(vd1, vd2, yvyu2);
+        vec_st(tmp, 16, dest);
+    break;
+    case AV_PIX_FMT_UYVY422:
+        tmp = vec_perm(vd1, vd2, uyvy1);
+        vec_st(tmp, 0, dest);
+        tmp = vec_perm(vd1, vd2, uyvy2);
+        vec_st(tmp, 16, dest);
+    break;
+    }
+}
+
+static av_always_inline void
+yuv2422_X_vsx_template(SwsContext *c, const int16_t *lumFilter,
+                     const int16_t **lumSrc, int lumFilterSize,
+                     const int16_t *chrFilter, const int16_t **chrUSrc,
+                     const int16_t **chrVSrc, int chrFilterSize,
+                     const int16_t **alpSrc, uint8_t *dest, int dstW,
+                     int y, enum AVPixelFormat target)
+{
+    int i, j;
+    vec_s16 vy1, vy2, vu, vv;
+    vec_s32 vy32[4], vu32[2], vv32[2], tmp, tmp2, tmp3, tmp4;
+    vec_s16 vlumFilter[MAX_FILTER_SIZE], vchrFilter[MAX_FILTER_SIZE];
+    const vec_s32 start = vec_splats(1 << 18);
+    const vec_u32 shift19 = vec_splats(19U);
+
+    for (i = 0; i < lumFilterSize; i++)
+        vlumFilter[i] = vec_splats(lumFilter[i]);
+    for (i = 0; i < chrFilterSize; i++)
+        vchrFilter[i] = vec_splats(chrFilter[i]);
+
+    for (i = 0; i < ((dstW + 1) >> 1); i += 8) {
+        vy32[0] =
+        vy32[1] =
+        vy32[2] =
+        vy32[3] =
+        vu32[0] =
+        vu32[1] =
+        vv32[0] =
+        vv32[1] = start;
+
+        for (j = 0; j < lumFilterSize; j++) {
+            vv = vec_ld(0, &lumSrc[j][i * 2]);
+            tmp = vec_mule(vv, vlumFilter[j]);
+            tmp2 = vec_mulo(vv, vlumFilter[j]);
+            tmp3 = vec_mergeh(tmp, tmp2);
+            tmp4 = vec_mergel(tmp, tmp2);
+
+            vy32[0] = vec_adds(vy32[0], tmp3);
+            vy32[1] = vec_adds(vy32[1], tmp4);
+
+            vv = vec_ld(0, &lumSrc[j][(i + 4) * 2]);
+            tmp = vec_mule(vv, vlumFilter[j]);
+            tmp2 = vec_mulo(vv, vlumFilter[j]);
+            tmp3 = vec_mergeh(tmp, tmp2);
+            tmp4 = vec_mergel(tmp, tmp2);
+
+            vy32[2] = vec_adds(vy32[2], tmp3);
+            vy32[3] = vec_adds(vy32[3], tmp4);
+        }
+
+        for (j = 0; j < chrFilterSize; j++) {
+            vv = vec_ld(0, &chrUSrc[j][i]);
+            tmp = vec_mule(vv, vchrFilter[j]);
+            tmp2 = vec_mulo(vv, vchrFilter[j]);
+            tmp3 = vec_mergeh(tmp, tmp2);
+            tmp4 = vec_mergel(tmp, tmp2);
+
+            vu32[0] = vec_adds(vu32[0], tmp3);
+            vu32[1] = vec_adds(vu32[1], tmp4);
+
+            vv = vec_ld(0, &chrVSrc[j][i]);
+            tmp = vec_mule(vv, vchrFilter[j]);
+            tmp2 = vec_mulo(vv, vchrFilter[j]);
+            tmp3 = vec_mergeh(tmp, tmp2);
+            tmp4 = vec_mergel(tmp, tmp2);
+
+            vv32[0] = vec_adds(vv32[0], tmp3);
+            vv32[1] = vec_adds(vv32[1], tmp4);
+        }
+
+        for (j = 0; j < 4; j++) {
+            vy32[j] = vec_sra(vy32[j], shift19);
+        }
+        for (j = 0; j < 2; j++) {
+            vu32[j] = vec_sra(vu32[j], shift19);
+            vv32[j] = vec_sra(vv32[j], shift19);
+        }
+
+        vy1 = vec_packs(vy32[0], vy32[1]);
+        vy2 = vec_packs(vy32[2], vy32[3]);
+        vu = vec_packs(vu32[0], vu32[1]);
+        vv = vec_packs(vv32[0], vv32[1]);
+
+        write422(vy1, vy2, vu, vv, &dest[i * 4], target);
+    }
+}
+
+#define SETUP(x, buf0, buf1, alpha) { \
+    x = vec_ld(0, buf0); \
+    tmp = vec_mule(x, alpha); \
+    tmp2 = vec_mulo(x, alpha); \
+    tmp3 = vec_mergeh(tmp, tmp2); \
+    tmp4 = vec_mergel(tmp, tmp2); \
+\
+    x = vec_ld(0, buf1); \
+    tmp = vec_mule(x, alpha); \
+    tmp2 = vec_mulo(x, alpha); \
+    tmp5 = vec_mergeh(tmp, tmp2); \
+    tmp6 = vec_mergel(tmp, tmp2); \
+\
+    tmp3 = vec_add(tmp3, tmp5); \
+    tmp4 = vec_add(tmp4, tmp6); \
+\
+    tmp3 = vec_sra(tmp3, shift19); \
+    tmp4 = vec_sra(tmp4, shift19); \
+    x = vec_packs(tmp3, tmp4); \
+}
+
+static av_always_inline void
+yuv2422_2_vsx_template(SwsContext *c, const int16_t *buf[2],
+                     const int16_t *ubuf[2], const int16_t *vbuf[2],
+                     const int16_t *abuf[2], uint8_t *dest, int dstW,
+                     int yalpha, int uvalpha, int y,
+                     enum AVPixelFormat target)
+{
+    const int16_t *buf0  = buf[0],  *buf1  = buf[1],
+                  *ubuf0 = ubuf[0], *ubuf1 = ubuf[1],
+                  *vbuf0 = vbuf[0], *vbuf1 = vbuf[1];
+    const int16_t  yalpha1 = 4096 - yalpha;
+    const int16_t uvalpha1 = 4096 - uvalpha;
+    vec_s16 vy1, vy2, vu, vv;
+    vec_s32 tmp, tmp2, tmp3, tmp4, tmp5, tmp6;
+    const vec_s16 vyalpha1 = vec_splats(yalpha1);
+    const vec_s16 vuvalpha1 = vec_splats(uvalpha1);
+    const vec_u32 shift19 = vec_splats(19U);
+    int i;
+    av_assert2(yalpha  <= 4096U);
+    av_assert2(uvalpha <= 4096U);
+
+    for (i = 0; i < ((dstW + 1) >> 1); i += 8) {
+
+        SETUP(vy1, &buf0[i * 2], &buf1[i * 2], vyalpha1)
+        SETUP(vy2, &buf0[(i + 4) * 2], &buf1[(i + 4) * 2], vyalpha1)
+        SETUP(vu, &ubuf0[i], &ubuf1[i], vuvalpha1)
+        SETUP(vv, &vbuf0[i], &vbuf1[i], vuvalpha1)
+
+        write422(vy1, vy2, vu, vv, &dest[i * 4], target);
+    }
+}
+
+#undef SETUP
+
+static av_always_inline void
+yuv2422_1_vsx_template(SwsContext *c, const int16_t *buf0,
+                     const int16_t *ubuf[2], const int16_t *vbuf[2],
+                     const int16_t *abuf0, uint8_t *dest, int dstW,
+                     int uvalpha, int y, enum AVPixelFormat target)
+{
+    const int16_t *ubuf0 = ubuf[0], *vbuf0 = vbuf[0];
+    vec_s16 vy1, vy2, vu, vv, tmp;
+    const vec_s16 add64 = vec_splats((int16_t) 64);
+    const vec_s16 add128 = vec_splats((int16_t) 128);
+    const vec_u16 shift7 = vec_splat_u16(7);
+    const vec_u16 shift8 = vec_splat_u16(8);
+    int i;
+
+    if (uvalpha < 2048) {
+        for (i = 0; i < ((dstW + 1) >> 1); i += 8) {
+            vy1 = vec_ld(0, &buf0[i * 2]);
+            vy2 = vec_ld(0, &buf0[(i + 4) * 2]);
+            vu = vec_ld(0, &ubuf0[i]);
+            vv = vec_ld(0, &vbuf0[i]);
+
+            vy1 = vec_add(vy1, add64);
+            vy2 = vec_add(vy2, add64);
+            vu = vec_add(vu, add64);
+            vv = vec_add(vv, add64);
+
+            vy1 = vec_sra(vy1, shift7);
+            vy2 = vec_sra(vy2, shift7);
+            vu = vec_sra(vu, shift7);
+            vv = vec_sra(vv, shift7);
+
+            write422(vy1, vy2, vu, vv, &dest[i * 4], target);
+        }
+    } else {
+        const int16_t *ubuf1 = ubuf[1], *vbuf1 = vbuf[1];
+        for (i = 0; i < ((dstW + 1) >> 1); i += 8) {
+            vy1 = vec_ld(0, &buf0[i * 2]);
+            vy2 = vec_ld(0, &buf0[(i + 4) * 2]);
+            vu = vec_ld(0, &ubuf0[i]);
+            tmp = vec_ld(0, &ubuf1[i]);
+            vu = vec_adds(vu, tmp);
+            vv = vec_ld(0, &vbuf0[i]);
+            tmp = vec_ld(0, &vbuf1[i]);
+            vv = vec_adds(vv, tmp);
+
+            vy1 = vec_add(vy1, add64);
+            vy2 = vec_add(vy2, add64);
+            vu = vec_adds(vu, add128);
+            vv = vec_adds(vv, add128);
+
+            vy1 = vec_sra(vy1, shift7);
+            vy2 = vec_sra(vy2, shift7);
+            vu = vec_sra(vu, shift8);
+            vv = vec_sra(vv, shift8);
+
+            write422(vy1, vy2, vu, vv, &dest[i * 4], target);
+        }
+    }
+}
+
+#define YUV2PACKEDWRAPPERX(name, base, ext, fmt) \
+static void name ## ext ## _X_vsx(SwsContext *c, const int16_t *lumFilter, \
+                                const int16_t **lumSrc, int lumFilterSize, \
+                                const int16_t *chrFilter, const int16_t **chrUSrc, \
+                                const int16_t **chrVSrc, int chrFilterSize, \
+                                const int16_t **alpSrc, uint8_t *dest, int dstW, \
+                                int y) \
+{ \
+    name ## base ## _X_vsx_template(c, lumFilter, lumSrc, lumFilterSize, \
+                                  chrFilter, chrUSrc, chrVSrc, chrFilterSize, \
+                                  alpSrc, dest, dstW, y, fmt); \
+}
+
+#define YUV2PACKEDWRAPPER2(name, base, ext, fmt) \
+YUV2PACKEDWRAPPERX(name, base, ext, fmt) \
+static void name ## ext ## _2_vsx(SwsContext *c, const int16_t *buf[2], \
+                                const int16_t *ubuf[2], const int16_t *vbuf[2], \
+                                const int16_t *abuf[2], uint8_t *dest, int dstW, \
+                                int yalpha, int uvalpha, int y) \
+{ \
+    name ## base ## _2_vsx_template(c, buf, ubuf, vbuf, abuf, \
+                                  dest, dstW, yalpha, uvalpha, y, fmt); \
+}
+
+#define YUV2PACKEDWRAPPER(name, base, ext, fmt) \
+YUV2PACKEDWRAPPER2(name, base, ext, fmt) \
+static void name ## ext ## _1_vsx(SwsContext *c, const int16_t *buf0, \
+                                const int16_t *ubuf[2], const int16_t *vbuf[2], \
+                                const int16_t *abuf0, uint8_t *dest, int dstW, \
+                                int uvalpha, int y) \
+{ \
+    name ## base ## _1_vsx_template(c, buf0, ubuf, vbuf, \
+                                  abuf0, dest, dstW, uvalpha, \
+                                  y, fmt); \
+}
+
+YUV2PACKEDWRAPPER(yuv2, 422, yuyv422, AV_PIX_FMT_YUYV422)
+YUV2PACKEDWRAPPER(yuv2, 422, yvyu422, AV_PIX_FMT_YVYU422)
+YUV2PACKEDWRAPPER(yuv2, 422, uyvy422, AV_PIX_FMT_UYVY422)
+
+static void hyscale_fast_vsx(SwsContext *c, int16_t *dst, int dstWidth,
+                           const uint8_t *src, int srcW, int xInc)
+{
+    int i;
+    unsigned int xpos = 0, xx;
+    vec_u8 vin, vin2, vperm;
+    vec_s8 vmul, valpha;
+    vec_s16 vtmp, vtmp2, vtmp3, vtmp4;
+    vec_u16 vd_l, vd_r, vcoord16[2];
+    vec_u32 vcoord[4];
+    const vec_u32 vadd = (vec_u32) {
+        0,
+        xInc * 1,
+        xInc * 2,
+        xInc * 3,
+    };
+    const vec_u16 vadd16 = (vec_u16) { // Modulo math
+        0,
+        xInc * 1,
+        xInc * 2,
+        xInc * 3,
+        xInc * 4,
+        xInc * 5,
+        xInc * 6,
+        xInc * 7,
+    };
+    const vec_u32 vshift16 = vec_splats((uint32_t) 16);
+    const vec_u16 vshift9 = vec_splat_u16(9);
+    const vec_u8 vzero = vec_splat_u8(0);
+    const vec_u16 vshift = vec_splat_u16(7);
+
+    for (i = 0; i < dstWidth; i += 16) {
+        vcoord16[0] = vec_splats((uint16_t) xpos);
+        vcoord16[1] = vec_splats((uint16_t) (xpos + xInc * 8));
+
+        vcoord16[0] = vec_add(vcoord16[0], vadd16);
+        vcoord16[1] = vec_add(vcoord16[1], vadd16);
+
+        vcoord16[0] = vec_sr(vcoord16[0], vshift9);
+        vcoord16[1] = vec_sr(vcoord16[1], vshift9);
+        valpha = (vec_s8) vec_pack(vcoord16[0], vcoord16[1]);
+
+        xx = xpos >> 16;
+        vin = vec_vsx_ld(0, &src[xx]);
+
+        vcoord[0] = vec_splats(xpos & 0xffff);
+        vcoord[1] = vec_splats((xpos & 0xffff) + xInc * 4);
+        vcoord[2] = vec_splats((xpos & 0xffff) + xInc * 8);
+        vcoord[3] = vec_splats((xpos & 0xffff) + xInc * 12);
+
+        vcoord[0] = vec_add(vcoord[0], vadd);
+        vcoord[1] = vec_add(vcoord[1], vadd);
+        vcoord[2] = vec_add(vcoord[2], vadd);
+        vcoord[3] = vec_add(vcoord[3], vadd);
+
+        vcoord[0] = vec_sr(vcoord[0], vshift16);
+        vcoord[1] = vec_sr(vcoord[1], vshift16);
+        vcoord[2] = vec_sr(vcoord[2], vshift16);
+        vcoord[3] = vec_sr(vcoord[3], vshift16);
+
+        vcoord16[0] = vec_pack(vcoord[0], vcoord[1]);
+        vcoord16[1] = vec_pack(vcoord[2], vcoord[3]);
+        vperm = vec_pack(vcoord16[0], vcoord16[1]);
+
+        vin = vec_perm(vin, vin, vperm);
+
+        vin2 = vec_vsx_ld(1, &src[xx]);
+        vin2 = vec_perm(vin2, vin2, vperm);
+
+        vmul = (vec_s8) vec_sub(vin2, vin);
+        vtmp = vec_mule(vmul, valpha);
+        vtmp2 = vec_mulo(vmul, valpha);
+        vtmp3 = vec_mergeh(vtmp, vtmp2);
+        vtmp4 = vec_mergel(vtmp, vtmp2);
+
+        vd_l = (vec_u16) vec_mergeh(vin, vzero);
+        vd_r = (vec_u16) vec_mergel(vin, vzero);
+        vd_l = vec_sl(vd_l, vshift);
+        vd_r = vec_sl(vd_r, vshift);
+
+        vd_l = vec_add(vd_l, (vec_u16) vtmp3);
+        vd_r = vec_add(vd_r, (vec_u16) vtmp4);
+
+        vec_st((vec_s16) vd_l, 0, &dst[i]);
+        vec_st((vec_s16) vd_r, 0, &dst[i + 8]);
+
+        xpos += xInc * 16;
+    }
+    for (i=dstWidth-1; (i*xInc)>>16 >=srcW-1; i--)
+        dst[i] = src[srcW-1]*128;
+}
+
+#define HCSCALE(in, out) \
+        vin = vec_vsx_ld(0, &in[xx]); \
+        vin = vec_perm(vin, vin, vperm); \
+\
+        vin2 = vec_vsx_ld(1, &in[xx]); \
+        vin2 = vec_perm(vin2, vin2, vperm); \
+\
+        vtmp = vec_mule(vin, valphaxor); \
+        vtmp2 = vec_mulo(vin, valphaxor); \
+        vtmp3 = vec_mergeh(vtmp, vtmp2); \
+        vtmp4 = vec_mergel(vtmp, vtmp2); \
+\
+        vtmp = vec_mule(vin2, valpha); \
+        vtmp2 = vec_mulo(vin2, valpha); \
+        vd_l = vec_mergeh(vtmp, vtmp2); \
+        vd_r = vec_mergel(vtmp, vtmp2); \
+\
+        vd_l = vec_add(vd_l, vtmp3); \
+        vd_r = vec_add(vd_r, vtmp4); \
+\
+        vec_st((vec_s16) vd_l, 0, &out[i]); \
+        vec_st((vec_s16) vd_r, 0, &out[i + 8])
+
+static void hcscale_fast_vsx(SwsContext *c, int16_t *dst1, int16_t *dst2,
+                           int dstWidth, const uint8_t *src1,
+                           const uint8_t *src2, int srcW, int xInc)
+{
+    int i;
+    unsigned int xpos = 0, xx;
+    vec_u8 vin, vin2, vperm;
+    vec_u8 valpha, valphaxor;
+    vec_u16 vtmp, vtmp2, vtmp3, vtmp4;
+    vec_u16 vd_l, vd_r, vcoord16[2];
+    vec_u32 vcoord[4];
+    const vec_u8 vxor = vec_splats((uint8_t) 127);
+    const vec_u32 vadd = (vec_u32) {
+        0,
+        xInc * 1,
+        xInc * 2,
+        xInc * 3,
+    };
+    const vec_u16 vadd16 = (vec_u16) { // Modulo math
+        0,
+        xInc * 1,
+        xInc * 2,
+        xInc * 3,
+        xInc * 4,
+        xInc * 5,
+        xInc * 6,
+        xInc * 7,
+    };
+    const vec_u32 vshift16 = vec_splats((uint32_t) 16);
+    const vec_u16 vshift9 = vec_splat_u16(9);
+
+    for (i = 0; i < dstWidth; i += 16) {
+        vcoord16[0] = vec_splats((uint16_t) xpos);
+        vcoord16[1] = vec_splats((uint16_t) (xpos + xInc * 8));
+
+        vcoord16[0] = vec_add(vcoord16[0], vadd16);
+        vcoord16[1] = vec_add(vcoord16[1], vadd16);
+
+        vcoord16[0] = vec_sr(vcoord16[0], vshift9);
+        vcoord16[1] = vec_sr(vcoord16[1], vshift9);
+        valpha = vec_pack(vcoord16[0], vcoord16[1]);
+        valphaxor = vec_xor(valpha, vxor);
+
+        xx = xpos >> 16;
+
+        vcoord[0] = vec_splats(xpos & 0xffff);
+        vcoord[1] = vec_splats((xpos & 0xffff) + xInc * 4);
+        vcoord[2] = vec_splats((xpos & 0xffff) + xInc * 8);
+        vcoord[3] = vec_splats((xpos & 0xffff) + xInc * 12);
+
+        vcoord[0] = vec_add(vcoord[0], vadd);
+        vcoord[1] = vec_add(vcoord[1], vadd);
+        vcoord[2] = vec_add(vcoord[2], vadd);
+        vcoord[3] = vec_add(vcoord[3], vadd);
+
+        vcoord[0] = vec_sr(vcoord[0], vshift16);
+        vcoord[1] = vec_sr(vcoord[1], vshift16);
+        vcoord[2] = vec_sr(vcoord[2], vshift16);
+        vcoord[3] = vec_sr(vcoord[3], vshift16);
+
+        vcoord16[0] = vec_pack(vcoord[0], vcoord[1]);
+        vcoord16[1] = vec_pack(vcoord[2], vcoord[3]);
+        vperm = vec_pack(vcoord16[0], vcoord16[1]);
+
+        HCSCALE(src1, dst1);
+        HCSCALE(src2, dst2);
+
+        xpos += xInc * 16;
+    }
+    for (i=dstWidth-1; (i*xInc)>>16 >=srcW-1; i--) {
+        dst1[i] = src1[srcW-1]*128;
+        dst2[i] = src2[srcW-1]*128;
+    }
+}
+
+#undef HCSCALE
+
+static void hScale8To19_vsx(SwsContext *c, int16_t *_dst, int dstW,
+                            const uint8_t *src, const int16_t *filter,
+                            const int32_t *filterPos, int filterSize)
+{
+    int i, j;
+    int32_t *dst = (int32_t *) _dst;
+    vec_s16 vfilter, vin;
+    vec_u8 vin8;
+    vec_s32 vout;
+    const vec_u8 vzero = vec_splat_u8(0);
+    const vec_u8 vunusedtab[8] = {
+        (vec_u8) {0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7,
+                  0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf},
+        (vec_u8) {0x0, 0x1, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
+                  0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10},
+        (vec_u8) {0x0, 0x1, 0x2, 0x3, 0x10, 0x10, 0x10, 0x10,
+                  0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10},
+        (vec_u8) {0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x10, 0x10,
+                  0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10},
+        (vec_u8) {0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7,
+                  0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10},
+        (vec_u8) {0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7,
+                  0x8, 0x9, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10},
+        (vec_u8) {0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7,
+                  0x8, 0x9, 0xa, 0xb, 0x10, 0x10, 0x10, 0x10},
+        (vec_u8) {0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7,
+                  0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0x10, 0x10},
+    };
+    const vec_u8 vunused = vunusedtab[filterSize % 8];
+
+    if (filterSize == 1) {
+        for (i = 0; i < dstW; i++) {
+            int srcPos = filterPos[i];
+            int val    = 0;
+            for (j = 0; j < filterSize; j++) {
+                val += ((int)src[srcPos + j]) * filter[filterSize * i + j];
+            }
+            dst[i] = FFMIN(val >> 3, (1 << 19) - 1); // the cubic equation does overflow ...
+        }
+    } else {
+        for (i = 0; i < dstW; i++) {
+            const int srcPos = filterPos[i];
+            vout = vec_splat_s32(0);
+            for (j = 0; j < filterSize; j += 8) {
+                vin8 = vec_vsx_ld(0, &src[srcPos + j]);
+                vin = (vec_s16) vec_mergeh(vin8, vzero);
+                if (j + 8 > filterSize) // Remove the unused elements on the last round
+                    vin = vec_perm(vin, (vec_s16) vzero, vunused);
+
+                vfilter = vec_vsx_ld(0, &filter[filterSize * i + j]);
+                vout = vec_msums(vin, vfilter, vout);
+            }
+            vout = vec_sums(vout, (vec_s32) vzero);
+            dst[i] = FFMIN(vout[3] >> 3, (1 << 19) - 1);
+        }
+    }
+}
+
+static void hScale16To19_vsx(SwsContext *c, int16_t *_dst, int dstW,
+                             const uint8_t *_src, const int16_t *filter,
+                             const int32_t *filterPos, int filterSize)
+{
+    const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(c->srcFormat);
+    int i, j;
+    int32_t *dst        = (int32_t *) _dst;
+    const uint16_t *src = (const uint16_t *) _src;
+    int bits            = desc->comp[0].depth - 1;
+    int sh              = bits - 4;
+    vec_s16 vfilter, vin;
+    vec_s32 vout, vtmp, vtmp2, vfilter32_l, vfilter32_r;
+    const vec_u8 vzero = vec_splat_u8(0);
+    const vec_u8 vunusedtab[8] = {
+        (vec_u8) {0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7,
+                  0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf},
+        (vec_u8) {0x0, 0x1, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
+                  0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10},
+        (vec_u8) {0x0, 0x1, 0x2, 0x3, 0x10, 0x10, 0x10, 0x10,
+                  0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10},
+        (vec_u8) {0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x10, 0x10,
+                  0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10},
+        (vec_u8) {0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7,
+                  0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10},
+        (vec_u8) {0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7,
+                  0x8, 0x9, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10},
+        (vec_u8) {0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7,
+                  0x8, 0x9, 0xa, 0xb, 0x10, 0x10, 0x10, 0x10},
+        (vec_u8) {0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7,
+                  0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0x10, 0x10},
+    };
+    const vec_u8 vunused = vunusedtab[filterSize % 8];
+
+    if ((isAnyRGB(c->srcFormat) || c->srcFormat==AV_PIX_FMT_PAL8) && desc->comp[0].depth<16) {
+        sh = 9;
+    } else if (desc->flags & AV_PIX_FMT_FLAG_FLOAT) { /* float input are process like uint 16bpc */
+        sh = 16 - 1 - 4;
+    }
+
+    if (filterSize == 1) {
+        for (i = 0; i < dstW; i++) {
+            int srcPos = filterPos[i];
+            int val    = 0;
+
+            for (j = 0; j < filterSize; j++) {
+                val += src[srcPos + j] * filter[filterSize * i + j];
+            }
+            // filter=14 bit, input=16 bit, output=30 bit, >> 11 makes 19 bit
+            dst[i] = FFMIN(val >> sh, (1 << 19) - 1);
+        }
+    } else {
+        for (i = 0; i < dstW; i++) {
+            const int srcPos = filterPos[i];
+            vout = vec_splat_s32(0);
+            for (j = 0; j < filterSize; j += 8) {
+                vin = (vec_s16) vec_vsx_ld(0, &src[srcPos + j]);
+                if (j + 8 > filterSize) // Remove the unused elements on the last round
+                    vin = vec_perm(vin, (vec_s16) vzero, vunused);
+
+                vfilter = vec_vsx_ld(0, &filter[filterSize * i + j]);
+                vfilter32_l = vec_unpackh(vfilter);
+                vfilter32_r = vec_unpackl(vfilter);
+
+                vtmp = (vec_s32) vec_mergeh(vin, (vec_s16) vzero);
+                vtmp2 = (vec_s32) vec_mergel(vin, (vec_s16) vzero);
+
+                vtmp = vec_mul(vtmp, vfilter32_l);
+                vtmp2 = vec_mul(vtmp2, vfilter32_r);
+
+                vout = vec_adds(vout, vtmp);
+                vout = vec_adds(vout, vtmp2);
+            }
+            vout = vec_sums(vout, (vec_s32) vzero);
+            dst[i] = FFMIN(vout[3] >> sh, (1 << 19) - 1);
+        }
+    }
+}
+
+static void hScale16To15_vsx(SwsContext *c, int16_t *dst, int dstW,
+                             const uint8_t *_src, const int16_t *filter,
+                             const int32_t *filterPos, int filterSize)
+{
+    const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(c->srcFormat);
+    int i, j;
+    const uint16_t *src = (const uint16_t *) _src;
+    int sh              = desc->comp[0].depth - 1;
+    vec_s16 vfilter, vin;
+    vec_s32 vout, vtmp, vtmp2, vfilter32_l, vfilter32_r;
+    const vec_u8 vzero = vec_splat_u8(0);
+    const vec_u8 vunusedtab[8] = {
+        (vec_u8) {0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7,
+                  0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf},
+        (vec_u8) {0x0, 0x1, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
+                  0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10},
+        (vec_u8) {0x0, 0x1, 0x2, 0x3, 0x10, 0x10, 0x10, 0x10,
+                  0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10},
+        (vec_u8) {0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x10, 0x10,
+                  0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10},
+        (vec_u8) {0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7,
+                  0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10},
+        (vec_u8) {0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7,
+                  0x8, 0x9, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10},
+        (vec_u8) {0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7,
+                  0x8, 0x9, 0xa, 0xb, 0x10, 0x10, 0x10, 0x10},
+        (vec_u8) {0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7,
+                  0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0x10, 0x10},
+    };
+    const vec_u8 vunused = vunusedtab[filterSize % 8];
+
+    if (sh<15) {
+        sh = isAnyRGB(c->srcFormat) || c->srcFormat==AV_PIX_FMT_PAL8 ? 13 : (desc->comp[0].depth - 1);
+    } else if (desc->flags & AV_PIX_FMT_FLAG_FLOAT) { /* float input are process like uint 16bpc */
+        sh = 16 - 1;
+    }
+
+    if (filterSize == 1) {
+        for (i = 0; i < dstW; i++) {
+            int srcPos = filterPos[i];
+            int val    = 0;
+
+            for (j = 0; j < filterSize; j++) {
+                val += src[srcPos + j] * filter[filterSize * i + j];
+            }
+            // filter=14 bit, input=16 bit, output=30 bit, >> 15 makes 15 bit
+            dst[i] = FFMIN(val >> sh, (1 << 15) - 1);
+        }
+    } else {
+        for (i = 0; i < dstW; i++) {
+            const int srcPos = filterPos[i];
+            vout = vec_splat_s32(0);
+            for (j = 0; j < filterSize; j += 8) {
+                vin = (vec_s16) vec_vsx_ld(0, &src[srcPos + j]);
+                if (j + 8 > filterSize) // Remove the unused elements on the last round
+                    vin = vec_perm(vin, (vec_s16) vzero, vunused);
+
+                vfilter = vec_vsx_ld(0, &filter[filterSize * i + j]);
+                vfilter32_l = vec_unpackh(vfilter);
+                vfilter32_r = vec_unpackl(vfilter);
+
+                vtmp = (vec_s32) vec_mergeh(vin, (vec_s16) vzero);
+                vtmp2 = (vec_s32) vec_mergel(vin, (vec_s16) vzero);
+
+                vtmp = vec_mul(vtmp, vfilter32_l);
+                vtmp2 = vec_mul(vtmp2, vfilter32_r);
+
+                vout = vec_adds(vout, vtmp);
+                vout = vec_adds(vout, vtmp2);
+            }
+            vout = vec_sums(vout, (vec_s32) vzero);
+            dst[i] = FFMIN(vout[3] >> sh, (1 << 15) - 1);
+        }
+    }
+}
+
+#endif /* !HAVE_BIGENDIAN */
+
+#endif /* HAVE_VSX */
+
+av_cold void ff_sws_init_swscale_vsx(SwsContext *c)
+{
+#if HAVE_VSX
+    enum AVPixelFormat dstFormat = c->dstFormat;
+    const int cpu_flags = av_get_cpu_flags();
+    const unsigned char power8 = HAVE_POWER8 && cpu_flags & AV_CPU_FLAG_POWER8;
+
+    if (!(cpu_flags & AV_CPU_FLAG_VSX))
+        return;
+
+#if !HAVE_BIGENDIAN
+    if (c->srcBpc == 8) {
+        if (c->dstBpc <= 14) {
+            c->hyScale = c->hcScale = hScale_real_vsx;
+            if (c->flags & SWS_FAST_BILINEAR && c->dstW >= c->srcW && c->chrDstW >= c->chrSrcW) {
+                c->hyscale_fast = hyscale_fast_vsx;
+                c->hcscale_fast = hcscale_fast_vsx;
+            }
+        } else {
+            c->hyScale = c->hcScale = hScale8To19_vsx;
+        }
+    } else {
+        if (power8) {
+            c->hyScale = c->hcScale = c->dstBpc > 14 ? hScale16To19_vsx
+                                                     : hScale16To15_vsx;
+        }
+    }
+    if (!is16BPS(dstFormat) && !isNBPS(dstFormat) && !isSemiPlanarYUV(dstFormat) &&
+        dstFormat != AV_PIX_FMT_GRAYF32BE && dstFormat != AV_PIX_FMT_GRAYF32LE &&
+        !c->needAlpha) {
+        c->yuv2planeX = yuv2planeX_vsx;
+    }
+#endif
+
+    if (!(c->flags & (SWS_BITEXACT | SWS_FULL_CHR_H_INT)) && !c->needAlpha) {
+        switch (c->dstBpc) {
+        case 8:
+            c->yuv2plane1 = yuv2plane1_8_vsx;
+            break;
+#if !HAVE_BIGENDIAN
+        case 9:
+            c->yuv2plane1 = isBE(dstFormat) ? yuv2plane1_9BE_vsx  : yuv2plane1_9LE_vsx;
+            c->yuv2planeX = isBE(dstFormat) ? yuv2planeX_9BE_vsx  : yuv2planeX_9LE_vsx;
+            break;
+        case 10:
+            c->yuv2plane1 = isBE(dstFormat) ? yuv2plane1_10BE_vsx  : yuv2plane1_10LE_vsx;
+            c->yuv2planeX = isBE(dstFormat) ? yuv2planeX_10BE_vsx  : yuv2planeX_10LE_vsx;
+            break;
+        case 12:
+            c->yuv2plane1 = isBE(dstFormat) ? yuv2plane1_12BE_vsx  : yuv2plane1_12LE_vsx;
+            c->yuv2planeX = isBE(dstFormat) ? yuv2planeX_12BE_vsx  : yuv2planeX_12LE_vsx;
+            break;
+        case 14:
+            c->yuv2plane1 = isBE(dstFormat) ? yuv2plane1_14BE_vsx  : yuv2plane1_14LE_vsx;
+            c->yuv2planeX = isBE(dstFormat) ? yuv2planeX_14BE_vsx  : yuv2planeX_14LE_vsx;
+            break;
+        case 16:
+            c->yuv2plane1 = isBE(dstFormat) ? yuv2plane1_16BE_vsx  : yuv2plane1_16LE_vsx;
+#if HAVE_POWER8
+            if (cpu_flags & AV_CPU_FLAG_POWER8) {
+                c->yuv2planeX = isBE(dstFormat) ? yuv2planeX_16BE_vsx  : yuv2planeX_16LE_vsx;
+            }
+#endif /* HAVE_POWER8 */
+            break;
+#endif /* !HAVE_BIGENDIAN */
+        }
+    }
+
+    if (c->flags & SWS_BITEXACT)
+        return;
+
+#if !HAVE_BIGENDIAN
+    if (c->flags & SWS_FULL_CHR_H_INT) {
+        switch (dstFormat) {
+            case AV_PIX_FMT_RGB24:
+                if (power8) {
+                    c->yuv2packed1 = yuv2rgb24_full_1_vsx;
+                    c->yuv2packed2 = yuv2rgb24_full_2_vsx;
+                    c->yuv2packedX = yuv2rgb24_full_X_vsx;
+                }
+            break;
+            case AV_PIX_FMT_BGR24:
+                if (power8) {
+                    c->yuv2packed1 = yuv2bgr24_full_1_vsx;
+                    c->yuv2packed2 = yuv2bgr24_full_2_vsx;
+                    c->yuv2packedX = yuv2bgr24_full_X_vsx;
+                }
+            break;
+            case AV_PIX_FMT_BGRA:
+                if (power8) {
+                    if (!c->needAlpha) {
+                        c->yuv2packed1 = yuv2bgrx32_full_1_vsx;
+                        c->yuv2packed2 = yuv2bgrx32_full_2_vsx;
+                        c->yuv2packedX = yuv2bgrx32_full_X_vsx;
+                    }
+                }
+            break;
+            case AV_PIX_FMT_RGBA:
+                if (power8) {
+                    if (!c->needAlpha) {
+                        c->yuv2packed1 = yuv2rgbx32_full_1_vsx;
+                        c->yuv2packed2 = yuv2rgbx32_full_2_vsx;
+                        c->yuv2packedX = yuv2rgbx32_full_X_vsx;
+                    }
+                }
+            break;
+            case AV_PIX_FMT_ARGB:
+                if (power8) {
+                    if (!c->needAlpha) {
+                        c->yuv2packed1 = yuv2xrgb32_full_1_vsx;
+                        c->yuv2packed2 = yuv2xrgb32_full_2_vsx;
+                        c->yuv2packedX = yuv2xrgb32_full_X_vsx;
+                    }
+                }
+            break;
+            case AV_PIX_FMT_ABGR:
+                if (power8) {
+                    if (!c->needAlpha) {
+                        c->yuv2packed1 = yuv2xbgr32_full_1_vsx;
+                        c->yuv2packed2 = yuv2xbgr32_full_2_vsx;
+                        c->yuv2packedX = yuv2xbgr32_full_X_vsx;
+                    }
+                }
+            break;
+        }
+    } else { /* !SWS_FULL_CHR_H_INT */
+        switch (dstFormat) {
+            case AV_PIX_FMT_YUYV422:
+                c->yuv2packed1 = yuv2yuyv422_1_vsx;
+                c->yuv2packed2 = yuv2yuyv422_2_vsx;
+                c->yuv2packedX = yuv2yuyv422_X_vsx;
+            break;
+            case AV_PIX_FMT_YVYU422:
+                c->yuv2packed1 = yuv2yvyu422_1_vsx;
+                c->yuv2packed2 = yuv2yvyu422_2_vsx;
+                c->yuv2packedX = yuv2yvyu422_X_vsx;
+            break;
+            case AV_PIX_FMT_UYVY422:
+                c->yuv2packed1 = yuv2uyvy422_1_vsx;
+                c->yuv2packed2 = yuv2uyvy422_2_vsx;
+                c->yuv2packedX = yuv2uyvy422_X_vsx;
+            break;
+            case AV_PIX_FMT_BGRA:
+                if (power8) {
+                    if (!c->needAlpha) {
+                        c->yuv2packed1 = yuv2bgrx32_1_vsx;
+                        c->yuv2packed2 = yuv2bgrx32_2_vsx;
+                    }
+                }
+            break;
+            case AV_PIX_FMT_RGBA:
+                if (power8) {
+                    if (!c->needAlpha) {
+                        c->yuv2packed1 = yuv2rgbx32_1_vsx;
+                        c->yuv2packed2 = yuv2rgbx32_2_vsx;
+                    }
+                }
+            break;
+            case AV_PIX_FMT_ARGB:
+                if (power8) {
+                    if (!c->needAlpha) {
+                        c->yuv2packed1 = yuv2xrgb32_1_vsx;
+                        c->yuv2packed2 = yuv2xrgb32_2_vsx;
+                    }
+                }
+            break;
+            case AV_PIX_FMT_ABGR:
+                if (power8) {
+                    if (!c->needAlpha) {
+                        c->yuv2packed1 = yuv2xbgr32_1_vsx;
+                        c->yuv2packed2 = yuv2xbgr32_2_vsx;
+                    }
+                }
+            break;
+            case AV_PIX_FMT_RGB24:
+                if (power8) {
+                    c->yuv2packed1 = yuv2rgb24_1_vsx;
+                    c->yuv2packed2 = yuv2rgb24_2_vsx;
+                }
+            break;
+            case AV_PIX_FMT_BGR24:
+                if (power8) {
+                    c->yuv2packed1 = yuv2bgr24_1_vsx;
+                    c->yuv2packed2 = yuv2bgr24_2_vsx;
+                }
+            break;
+        }
+    }
+#endif /* !HAVE_BIGENDIAN */
+
+#endif /* HAVE_VSX */
+}
diff --git a/libswscale/ppc/yuv2rgb_altivec.c b/libswscale/ppc/yuv2rgb_altivec.c
index c1e2852..5365452 100644
--- a/libswscale/ppc/yuv2rgb_altivec.c
+++ b/libswscale/ppc/yuv2rgb_altivec.c
@@ -305,9 +305,6 @@
     vector signed short R1, G1, B1;                                           \
     vector unsigned char R, G, B;                                             \
                                                                               \
-    const vector unsigned char *y1ivP, *y2ivP, *uivP, *vivP;                  \
-    vector unsigned char align_perm;                                          \
-                                                                              \
     vector signed short lCY       = c->CY;                                    \
     vector signed short lOY       = c->OY;                                    \
     vector signed short lCRV      = c->CRV;                                   \
@@ -338,26 +335,13 @@
         vec_dstst(oute, (0x02000002 | (((w * 3 + 32) / 32) << 16)), 1);       \
                                                                               \
         for (j = 0; j < w / 16; j++) {                                        \
-            y1ivP = (const vector unsigned char *) y1i;                       \
-            y2ivP = (const vector unsigned char *) y2i;                       \
-            uivP  = (const vector unsigned char *) ui;                        \
-            vivP  = (const vector unsigned char *) vi;                        \
+            y0 = vec_xl(0, y1i);                                              \
                                                                               \
-            align_perm = vec_lvsl(0, y1i);                                    \
-            y0 = (vector unsigned char)                                       \
-                     vec_perm(y1ivP[0], y1ivP[1], align_perm);                \
+            y1 = vec_xl(0, y2i);                                              \
                                                                               \
-            align_perm = vec_lvsl(0, y2i);                                    \
-            y1 = (vector unsigned char)                                       \
-                     vec_perm(y2ivP[0], y2ivP[1], align_perm);                \
+            u = (vector signed char) vec_xl(0, ui);                           \
                                                                               \
-            align_perm = vec_lvsl(0, ui);                                     \
-            u = (vector signed char)                                          \
-                    vec_perm(uivP[0], uivP[1], align_perm);                   \
-                                                                              \
-            align_perm = vec_lvsl(0, vi);                                     \
-            v = (vector signed char)                                          \
-                    vec_perm(vivP[0], vivP[1], align_perm);                   \
+            v = (vector signed char) vec_xl(0, vi);                           \
                                                                               \
             u = (vector signed char)                                          \
                     vec_sub(u,                                                \
diff --git a/libswscale/swscale.c b/libswscale/swscale.c
index 4069550..001cfbf 100644
--- a/libswscale/swscale.c
+++ b/libswscale/swscale.c
@@ -266,12 +266,9 @@
 
     /* vars which will change and which we need to store back in the context */
     int dstY         = c->dstY;
-    int lumBufIndex  = c->lumBufIndex;
-    int chrBufIndex  = c->chrBufIndex;
     int lastInLumBuf = c->lastInLumBuf;
     int lastInChrBuf = c->lastInChrBuf;
 
-
     int lumStart = 0;
     int lumEnd = c->descIndex[0];
     int chrStart = lumEnd;
@@ -283,25 +280,21 @@
     SwsSlice *vout_slice = &c->slice[c->numSlice-1];
     SwsFilterDescriptor *desc = c->desc;
 
-
     int needAlpha = c->needAlpha;
 
     int hasLumHoles = 1;
     int hasChrHoles = 1;
 
-
     if (isPacked(c->srcFormat)) {
-        src[0] =
         src[1] =
         src[2] =
         src[3] = src[0];
-        srcStride[0] =
         srcStride[1] =
         srcStride[2] =
         srcStride[3] = srcStride[0];
     }
-    srcStride[1] <<= c->vChrDrop;
-    srcStride[2] <<= c->vChrDrop;
+    srcStride[1] *= 1 << c->vChrDrop;
+    srcStride[2] *= 1 << c->vChrDrop;
 
     DEBUG_BUFFERS("swscale() %p[%d] %p[%d] %p[%d] %p[%d] -> %p[%d] %p[%d] %p[%d] %p[%d]\n",
                   src[0], srcStride[0], src[1], srcStride[1],
@@ -341,8 +334,6 @@
      * will not get executed. This is not really intended but works
      * currently, so people might do it. */
     if (srcSliceY == 0) {
-        lumBufIndex  = -1;
-        chrBufIndex  = -1;
         dstY         = 0;
         lastInLumBuf = -1;
         lastInChrBuf = -1;
@@ -466,7 +457,6 @@
                 desc[i].process(c, &desc[i], firstPosY, lastPosY - firstPosY + 1);
         }
 
-        lumBufIndex += lastLumSrcY - lastInLumBuf;
         lastInLumBuf = lastLumSrcY;
 
         if (cPosY < lastChrSrcY + 1) {
@@ -474,20 +464,13 @@
                 desc[i].process(c, &desc[i], firstCPosY, lastCPosY - firstCPosY + 1);
         }
 
-        chrBufIndex += lastChrSrcY - lastInChrBuf;
         lastInChrBuf = lastChrSrcY;
 
-        // wrap buf index around to stay inside the ring buffer
-        if (lumBufIndex >= vLumFilterSize)
-            lumBufIndex -= vLumFilterSize;
-        if (chrBufIndex >= vChrFilterSize)
-            chrBufIndex -= vChrFilterSize;
         if (!enough_lines)
             break;  // we can't output a dstY line so let's try with the next slice
 
 #if HAVE_MMX_INLINE
-        ff_updateMMXDitherTables(c, dstY, lumBufIndex, chrBufIndex,
-                              lastInLumBuf, lastInChrBuf);
+        ff_updateMMXDitherTables(c, dstY);
 #endif
         if (should_dither) {
             c->chrDither8 = ff_dither_8x8_128[chrDstY & 7];
@@ -529,8 +512,6 @@
 
     /* store changed local vars back in the context */
     c->dstY         = dstY;
-    c->lumBufIndex  = lumBufIndex;
-    c->chrBufIndex  = chrBufIndex;
     c->lastInLumBuf = lastInLumBuf;
     c->lastInChrBuf = lastInChrBuf;
 
@@ -572,7 +553,6 @@
 
     ff_sws_init_input_funcs(c);
 
-
     if (c->srcBpc == 8) {
         if (c->dstBpc <= 14) {
             c->hyScale = c->hcScale = hScale8To15_c;
@@ -790,8 +770,6 @@
     }
 
     if (c->gamma_flag && c->cascaded_context[0]) {
-
-
         ret = sws_scale(c->cascaded_context[0],
                     srcSlice, srcStride, srcSliceY, srcSliceH,
                     c->cascaded_tmp, c->cascaded_tmpStride);
@@ -985,7 +963,6 @@
         c->sliceDir = 0;
     ret = c->swscale(c, src2, srcStride2, srcSliceY_internal, srcSliceH, dst2, dstStride2);
 
-
     if (c->dstXYZ && !(c->srcXYZ && c->srcW==c->dstW && c->srcH==c->dstH)) {
         int dstY = c->dstY ? c->dstY : srcSliceY + srcSliceH;
         uint16_t *dst16 = (uint16_t*)(dst2[0] + (dstY - ret) * dstStride2[0]);
diff --git a/libswscale/swscale_internal.h b/libswscale/swscale_internal.h
index 4fa5938..9dda53e 100644
--- a/libswscale/swscale_internal.h
+++ b/libswscale/swscale_internal.h
@@ -350,8 +350,6 @@
     //@{
     int lastInLumBuf;             ///< Last scaled horizontal luma/alpha line from source in the ring buffer.
     int lastInChrBuf;             ///< Last scaled horizontal chroma     line from source in the ring buffer.
-    int lumBufIndex;              ///< Index in ring buffer of the last scaled horizontal luma/alpha line from source.
-    int chrBufIndex;              ///< Index in ring buffer of the last scaled horizontal chroma     line from source.
     //@}
 
     uint8_t *formatConvBuffer;
@@ -635,8 +633,7 @@
 void ff_yuv2rgb_init_tables_ppc(SwsContext *c, const int inv_table[4],
                                 int brightness, int contrast, int saturation);
 
-void ff_updateMMXDitherTables(SwsContext *c, int dstY, int lumBufIndex, int chrBufIndex,
-                           int lastInLumBuf, int lastInChrBuf);
+void ff_updateMMXDitherTables(SwsContext *c, int dstY);
 
 av_cold void ff_sws_init_range_convert(SwsContext *c);
 
@@ -868,6 +865,7 @@
                               yuv2packedX_fn *yuv2packedX,
                               yuv2anyX_fn *yuv2anyX);
 void ff_sws_init_swscale_ppc(SwsContext *c);
+void ff_sws_init_swscale_vsx(SwsContext *c);
 void ff_sws_init_swscale_x86(SwsContext *c);
 void ff_sws_init_swscale_aarch64(SwsContext *c);
 void ff_sws_init_swscale_arm(SwsContext *c);
diff --git a/libswscale/swscale_unscaled.c b/libswscale/swscale_unscaled.c
index 4b3cd71..67440cd 100644
--- a/libswscale/swscale_unscaled.c
+++ b/libswscale/swscale_unscaled.c
@@ -150,10 +150,10 @@
               dstParam[0], dstStride[0]);
 
     if (c->dstFormat == AV_PIX_FMT_NV12)
-        interleaveBytes(src[1], src[2], dst, c->srcW / 2, srcSliceH / 2,
+        interleaveBytes(src[1], src[2], dst, c->chrSrcW, (srcSliceH + 1) / 2,
                         srcStride[1], srcStride[2], dstStride[1]);
     else
-        interleaveBytes(src[2], src[1], dst, c->srcW / 2, srcSliceH / 2,
+        interleaveBytes(src[2], src[1], dst, c->chrSrcW, (srcSliceH + 1) / 2,
                         srcStride[2], srcStride[1], dstStride[1]);
 
     return srcSliceH;
@@ -171,10 +171,51 @@
               dstParam[0], dstStride[0]);
 
     if (c->srcFormat == AV_PIX_FMT_NV12)
-        deinterleaveBytes(src[1], dst1, dst2,c->srcW / 2, srcSliceH / 2,
+        deinterleaveBytes(src[1], dst1, dst2, c->chrSrcW, (srcSliceH + 1) / 2,
                           srcStride[1], dstStride[1], dstStride[2]);
     else
-        deinterleaveBytes(src[1], dst2, dst1, c->srcW / 2, srcSliceH / 2,
+        deinterleaveBytes(src[1], dst2, dst1, c->chrSrcW, (srcSliceH + 1) / 2,
+                          srcStride[1], dstStride[2], dstStride[1]);
+
+    return srcSliceH;
+}
+
+static int planarToNv24Wrapper(SwsContext *c, const uint8_t *src[],
+                               int srcStride[], int srcSliceY,
+                               int srcSliceH, uint8_t *dstParam[],
+                               int dstStride[])
+{
+    uint8_t *dst = dstParam[1] + dstStride[1] * srcSliceY;
+
+    copyPlane(src[0], srcStride[0], srcSliceY, srcSliceH, c->srcW,
+              dstParam[0], dstStride[0]);
+
+    if (c->dstFormat == AV_PIX_FMT_NV24)
+        interleaveBytes(src[1], src[2], dst, c->chrSrcW, srcSliceH,
+                        srcStride[1], srcStride[2], dstStride[1]);
+    else
+        interleaveBytes(src[2], src[1], dst, c->chrSrcW, srcSliceH,
+                        srcStride[2], srcStride[1], dstStride[1]);
+
+    return srcSliceH;
+}
+
+static int nv24ToPlanarWrapper(SwsContext *c, const uint8_t *src[],
+                               int srcStride[], int srcSliceY,
+                               int srcSliceH, uint8_t *dstParam[],
+                               int dstStride[])
+{
+    uint8_t *dst1 = dstParam[1] + dstStride[1] * srcSliceY;
+    uint8_t *dst2 = dstParam[2] + dstStride[2] * srcSliceY;
+
+    copyPlane(src[0], srcStride[0], srcSliceY, srcSliceH, c->srcW,
+              dstParam[0], dstStride[0]);
+
+    if (c->srcFormat == AV_PIX_FMT_NV24)
+        deinterleaveBytes(src[1], dst1, dst2, c->chrSrcW, srcSliceH,
+                          srcStride[1], dstStride[1], dstStride[2]);
+    else
+        deinterleaveBytes(src[1], dst2, dst1, c->chrSrcW, srcSliceH,
                           srcStride[1], dstStride[2], dstStride[1]);
 
     return srcSliceH;
@@ -423,7 +464,7 @@
     }
 }
 
-static int packed_16bpc_bswap(SwsContext *c, const uint8_t *src[],
+static int bswap_16bpc(SwsContext *c, const uint8_t *src[],
                               int srcStride[], int srcSliceY, int srcSliceH,
                               uint8_t *dst[], int dstStride[])
 {
@@ -1821,6 +1862,14 @@
                     srcPtr += srcStride[plane];
                     dstPtr += dstStride[plane];
                 }
+            } else if (isFloat(c->srcFormat) && isFloat(c->dstFormat) &&
+                       isBE(c->srcFormat) != isBE(c->dstFormat)) { /* swap float plane */
+                for (i = 0; i < height; i++) {
+                    for (j = 0; j < length; j++)
+                        ((uint32_t *) dstPtr)[j] = av_bswap32(((const uint32_t *) srcPtr)[j]);
+                    srcPtr += srcStride[plane];
+                    dstPtr += dstStride[plane];
+                }
             } else if (dstStride[plane] == srcStride[plane] &&
                        srcStride[plane] > 0 && srcStride[plane] == length) {
                 memcpy(dst[plane] + dstStride[plane] * y, src[plane],
@@ -1864,11 +1913,21 @@
         (dstFormat == AV_PIX_FMT_NV12 || dstFormat == AV_PIX_FMT_NV21)) {
         c->swscale = planarToNv12Wrapper;
     }
+    /* yv24_to_nv24 */
+    if ((srcFormat == AV_PIX_FMT_YUV444P || srcFormat == AV_PIX_FMT_YUVA444P) &&
+        (dstFormat == AV_PIX_FMT_NV24 || dstFormat == AV_PIX_FMT_NV42)) {
+        c->swscale = planarToNv24Wrapper;
+    }
     /* nv12_to_yv12 */
     if (dstFormat == AV_PIX_FMT_YUV420P &&
         (srcFormat == AV_PIX_FMT_NV12 || srcFormat == AV_PIX_FMT_NV21)) {
         c->swscale = nv12ToPlanarWrapper;
     }
+    /* nv24_to_yv24 */
+    if (dstFormat == AV_PIX_FMT_YUV444P &&
+        (srcFormat == AV_PIX_FMT_NV24 || srcFormat == AV_PIX_FMT_NV42)) {
+        c->swscale = nv24ToPlanarWrapper;
+    }
     /* yuv2bgr */
     if ((srcFormat == AV_PIX_FMT_YUV420P || srcFormat == AV_PIX_FMT_YUV422P ||
          srcFormat == AV_PIX_FMT_YUVA420P) && isAnyRGB(dstFormat) &&
@@ -1934,6 +1993,7 @@
          dstFormat == AV_PIX_FMT_GBRP12LE || dstFormat == AV_PIX_FMT_GBRP12BE ||
          dstFormat == AV_PIX_FMT_GBRP14LE || dstFormat == AV_PIX_FMT_GBRP14BE ||
          dstFormat == AV_PIX_FMT_GBRP16LE || dstFormat == AV_PIX_FMT_GBRP16BE ||
+         dstFormat == AV_PIX_FMT_GBRAP10LE || dstFormat == AV_PIX_FMT_GBRAP10BE ||
          dstFormat == AV_PIX_FMT_GBRAP12LE || dstFormat == AV_PIX_FMT_GBRAP12BE ||
          dstFormat == AV_PIX_FMT_GBRAP16LE || dstFormat == AV_PIX_FMT_GBRAP16BE ))
         c->swscale = Rgb16ToPlanarRgb16Wrapper;
@@ -1943,6 +2003,7 @@
          srcFormat == AV_PIX_FMT_GBRP10LE || srcFormat == AV_PIX_FMT_GBRP10BE ||
          srcFormat == AV_PIX_FMT_GBRP12LE || srcFormat == AV_PIX_FMT_GBRP12BE ||
          srcFormat == AV_PIX_FMT_GBRP14LE || srcFormat == AV_PIX_FMT_GBRP14BE ||
+         srcFormat == AV_PIX_FMT_GBRAP10LE || srcFormat == AV_PIX_FMT_GBRAP10BE ||
          srcFormat == AV_PIX_FMT_GBRAP12LE || srcFormat == AV_PIX_FMT_GBRAP12BE ||
          srcFormat == AV_PIX_FMT_GBRAP16LE || srcFormat == AV_PIX_FMT_GBRAP16BE) &&
         (dstFormat == AV_PIX_FMT_RGB48LE  || dstFormat == AV_PIX_FMT_RGB48BE  ||
@@ -1973,7 +2034,6 @@
         IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_BAYER_GRBG16) ||
         IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_BGR444) ||
         IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_BGR48)  ||
-        IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_BGRA64) ||
         IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_BGR555) ||
         IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_BGR565) ||
         IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_BGRA64) ||
@@ -1989,11 +2049,11 @@
         IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_GBRP12) ||
         IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_GBRP14) ||
         IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_GBRP16) ||
+        IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_GBRAP10) ||
         IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_GBRAP12) ||
         IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_GBRAP16) ||
         IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_RGB444) ||
         IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_RGB48)  ||
-        IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_RGBA64) ||
         IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_RGB555) ||
         IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_RGB565) ||
         IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_RGBA64) ||
@@ -2015,7 +2075,7 @@
         IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_YUV444P12) ||
         IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_YUV444P14) ||
         IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_YUV444P16))
-        c->swscale = packed_16bpc_bswap;
+        c->swscale = bswap_16bpc;
 
     if (usePal(srcFormat) && isByteRGB(dstFormat))
         c->swscale = palToRgbWrapper;
diff --git a/libswscale/tests/pixdesc_query.c b/libswscale/tests/pixdesc_query.c
index a5585c4..f6dd8ba 100644
--- a/libswscale/tests/pixdesc_query.c
+++ b/libswscale/tests/pixdesc_query.c
@@ -32,6 +32,7 @@
     {"isBE",        isBE},
     {"isYUV",       isYUV},
     {"isPlanarYUV", isPlanarYUV},
+    {"isSemiPlanarYUV", isSemiPlanarYUV},
     {"isRGB",       isRGB},
     {"Gray",        isGray},
     {"RGBinInt",    isRGBinInt},
diff --git a/libswscale/tests/swscale.c b/libswscale/tests/swscale.c
index e72c4c3..19878a7 100644
--- a/libswscale/tests/swscale.c
+++ b/libswscale/tests/swscale.c
@@ -312,22 +312,22 @@
     while (fgets(buf, sizeof(buf), fp)) {
         struct Results r;
         enum AVPixelFormat srcFormat;
-        char srcStr[12];
+        char srcStr[21];
         int srcW = 0, srcH = 0;
         enum AVPixelFormat dstFormat;
-        char dstStr[12];
+        char dstStr[21];
         int dstW = 0, dstH = 0;
         int flags;
         int ret;
 
         ret = sscanf(buf,
-                     " %12s %dx%d -> %12s %dx%d flags=%d CRC=%x"
+                     " %20s %dx%d -> %20s %dx%d flags=%d CRC=%x"
                      " SSD=%"SCNu64 ", %"SCNu64 ", %"SCNu64 ", %"SCNu64 "\n",
                      srcStr, &srcW, &srcH, dstStr, &dstW, &dstH,
                      &flags, &r.crc, &r.ssdY, &r.ssdU, &r.ssdV, &r.ssdA);
         if (ret != 12) {
             srcStr[0] = dstStr[0] = 0;
-            ret       = sscanf(buf, "%12s -> %12s\n", srcStr, dstStr);
+            ret       = sscanf(buf, "%20s -> %20s\n", srcStr, dstStr);
         }
 
         srcFormat = av_get_pix_fmt(srcStr);
diff --git a/libswscale/utils.c b/libswscale/utils.c
index 5e56371..bb3495b 100644
--- a/libswscale/utils.c
+++ b/libswscale/utils.c
@@ -86,7 +86,7 @@
 const char *swscale_license(void)
 {
 #define LICENSE_PREFIX "libswscale license: "
-    return LICENSE_PREFIX FFMPEG_LICENSE + sizeof(LICENSE_PREFIX) - 1;
+    return &LICENSE_PREFIX FFMPEG_LICENSE[sizeof(LICENSE_PREFIX) - 1];
 }
 
 typedef struct FormatEntry {
@@ -95,7 +95,7 @@
     uint8_t is_supported_endianness :1;
 } FormatEntry;
 
-static const FormatEntry format_entries[AV_PIX_FMT_NB] = {
+static const FormatEntry format_entries[] = {
     [AV_PIX_FMT_YUV420P]     = { 1, 1 },
     [AV_PIX_FMT_YUYV422]     = { 1, 1 },
     [AV_PIX_FMT_RGB24]       = { 1, 1 },
@@ -191,8 +191,8 @@
     [AV_PIX_FMT_BGR444LE]    = { 1, 1 },
     [AV_PIX_FMT_BGR444BE]    = { 1, 1 },
     [AV_PIX_FMT_YA8]         = { 1, 1 },
-    [AV_PIX_FMT_YA16BE]      = { 1, 0 },
-    [AV_PIX_FMT_YA16LE]      = { 1, 0 },
+    [AV_PIX_FMT_YA16BE]      = { 1, 1 },
+    [AV_PIX_FMT_YA16LE]      = { 1, 1 },
     [AV_PIX_FMT_BGR48BE]     = { 1, 1 },
     [AV_PIX_FMT_BGR48LE]     = { 1, 1 },
     [AV_PIX_FMT_BGRA64BE]    = { 1, 1, 1 },
@@ -260,23 +260,30 @@
     [AV_PIX_FMT_P016BE]      = { 1, 1 },
     [AV_PIX_FMT_GRAYF32LE]   = { 1, 1 },
     [AV_PIX_FMT_GRAYF32BE]   = { 1, 1 },
+    [AV_PIX_FMT_YUVA422P12BE] = { 1, 1 },
+    [AV_PIX_FMT_YUVA422P12LE] = { 1, 1 },
+    [AV_PIX_FMT_YUVA444P12BE] = { 1, 1 },
+    [AV_PIX_FMT_YUVA444P12LE] = { 1, 1 },
+    [AV_PIX_FMT_NV24]        = { 1, 1 },
+    [AV_PIX_FMT_NV42]        = { 1, 1 },
+    [AV_PIX_FMT_Y210LE]      = { 1, 0 },
 };
 
 int sws_isSupportedInput(enum AVPixelFormat pix_fmt)
 {
-    return (unsigned)pix_fmt < AV_PIX_FMT_NB ?
+    return (unsigned)pix_fmt < FF_ARRAY_ELEMS(format_entries) ?
            format_entries[pix_fmt].is_supported_in : 0;
 }
 
 int sws_isSupportedOutput(enum AVPixelFormat pix_fmt)
 {
-    return (unsigned)pix_fmt < AV_PIX_FMT_NB ?
+    return (unsigned)pix_fmt < FF_ARRAY_ELEMS(format_entries) ?
            format_entries[pix_fmt].is_supported_out : 0;
 }
 
 int sws_isSupportedEndiannessConversion(enum AVPixelFormat pix_fmt)
 {
-    return (unsigned)pix_fmt < AV_PIX_FMT_NB ?
+    return (unsigned)pix_fmt < FF_ARRAY_ELEMS(format_entries) ?
            format_entries[pix_fmt].is_supported_endianness : 0;
 }
 
@@ -384,7 +391,7 @@
             (*filterPos)[i] = xx;
             // bilinear upscale / linear interpolate / area averaging
             for (j = 0; j < filterSize; j++) {
-                int64_t coeff= fone - FFABS(((int64_t)xx<<16) - xDstInSrc)*(fone>>16);
+                int64_t coeff = fone - FFABS((int64_t)xx * (1 << 16) - xDstInSrc) * (fone >> 16);
                 if (coeff < 0)
                     coeff = 0;
                 filter[i * filterSize + j] = coeff;
@@ -1496,6 +1503,7 @@
         ff_free_filters(c2);
         if (ff_init_filters(c2) < 0) {
             sws_freeContext(c2);
+            c->cascaded_context[1] = NULL;
             return -1;
         }
 
@@ -1810,8 +1818,7 @@
     /* unscaled special cases */
     if (unscaled && !usesHFilter && !usesVFilter &&
         (c->srcRange == c->dstRange || isAnyRGB(dstFormat) ||
-         srcFormat == AV_PIX_FMT_GRAYF32 && dstFormat == AV_PIX_FMT_GRAY8 ||
-         srcFormat == AV_PIX_FMT_GRAY8 && dstFormat == AV_PIX_FMT_GRAYF32)) {
+         isFloat(srcFormat) || isFloat(dstFormat))){
         ff_get_unscaled_swscale(c);
 
         if (c->swscale) {
diff --git a/libswscale/version.h b/libswscale/version.h
index a07bd71..1dbb561 100644
--- a/libswscale/version.h
+++ b/libswscale/version.h
@@ -27,8 +27,8 @@
 #include "libavutil/version.h"
 
 #define LIBSWSCALE_VERSION_MAJOR   5
-#define LIBSWSCALE_VERSION_MINOR   2
-#define LIBSWSCALE_VERSION_MICRO 100
+#define LIBSWSCALE_VERSION_MINOR   6
+#define LIBSWSCALE_VERSION_MICRO 101
 
 #define LIBSWSCALE_VERSION_INT  AV_VERSION_INT(LIBSWSCALE_VERSION_MAJOR, \
                                                LIBSWSCALE_VERSION_MINOR, \
diff --git a/libswscale/x86/Makefile b/libswscale/x86/Makefile
index f317d5d..831d535 100644
--- a/libswscale/x86/Makefile
+++ b/libswscale/x86/Makefile
@@ -12,3 +12,4 @@
                                    x86/output.o                         \
                                    x86/scale.o                          \
                                    x86/rgb_2_rgb.o                      \
+                                   x86/yuv_2_rgb.o                      \
diff --git a/libswscale/x86/rgb_2_rgb.asm b/libswscale/x86/rgb_2_rgb.asm
index 5fb5d2e..29b856e 100644
--- a/libswscale/x86/rgb_2_rgb.asm
+++ b/libswscale/x86/rgb_2_rgb.asm
@@ -2,6 +2,7 @@
 ;* Copyright Nick Kurshev
 ;* Copyright Michael (michaelni@gmx.at)
 ;* Copyright 2018 Jokyo Images
+;* Copyright Ivo van Poorten
 ;*
 ;* This file is part of FFmpeg.
 ;*
diff --git a/libswscale/x86/swscale.c b/libswscale/x86/swscale.c
index 7dc2d70..6111083 100644
--- a/libswscale/x86/swscale.c
+++ b/libswscale/x86/swscale.c
@@ -29,6 +29,14 @@
 #include "libavutil/cpu.h"
 #include "libavutil/pixdesc.h"
 
+const DECLARE_ALIGNED(8, uint64_t, ff_dither4)[2] = {
+    0x0103010301030103LL,
+    0x0200020002000200LL,};
+
+const DECLARE_ALIGNED(8, uint64_t, ff_dither8)[2] = {
+    0x0602060206020602LL,
+    0x0004000400040004LL,};
+
 #if HAVE_INLINE_ASM
 
 #define DITHER1XBPP
@@ -38,14 +46,6 @@
 DECLARE_ASM_CONST(8, uint64_t, w10)=       0x0010001000100010LL;
 DECLARE_ASM_CONST(8, uint64_t, w02)=       0x0002000200020002LL;
 
-const DECLARE_ALIGNED(8, uint64_t, ff_dither4)[2] = {
-    0x0103010301030103LL,
-    0x0200020002000200LL,};
-
-const DECLARE_ALIGNED(8, uint64_t, ff_dither8)[2] = {
-    0x0602060206020602LL,
-    0x0004000400040004LL,};
-
 DECLARE_ASM_CONST(8, uint64_t, b16Mask)=   0x001F001F001F001FLL;
 DECLARE_ASM_CONST(8, uint64_t, g16Mask)=   0x07E007E007E007E0LL;
 DECLARE_ASM_CONST(8, uint64_t, r16Mask)=   0xF800F800F800F800LL;
@@ -79,8 +79,7 @@
 #include "swscale_template.c"
 #endif
 
-void ff_updateMMXDitherTables(SwsContext *c, int dstY, int lumBufIndex, int chrBufIndex,
-                           int lastInLumBuf, int lastInChrBuf)
+void ff_updateMMXDitherTables(SwsContext *c, int dstY)
 {
     const int dstH= c->dstH;
     const int flags= c->flags;
@@ -160,7 +159,7 @@
                 *(const void**)&lumMmxFilter[s*i+APCK_PTR2/4  ]= lumSrcPtr[i+(vLumFilterSize>1)];
                 lumMmxFilter[s*i+APCK_COEF/4  ]=
                 lumMmxFilter[s*i+APCK_COEF/4+1]= vLumFilter[dstY*vLumFilterSize + i    ]
-                + (vLumFilterSize>1 ? vLumFilter[dstY*vLumFilterSize + i + 1]<<16 : 0);
+                    + (vLumFilterSize>1 ? vLumFilter[dstY*vLumFilterSize + i + 1] * (1 << 16) : 0);
                 if (CONFIG_SWSCALE_ALPHA && hasAlpha) {
                     *(const void**)&alpMmxFilter[s*i              ]= alpSrcPtr[i  ];
                     *(const void**)&alpMmxFilter[s*i+APCK_PTR2/4  ]= alpSrcPtr[i+(vLumFilterSize>1)];
@@ -173,7 +172,7 @@
                 *(const void**)&chrMmxFilter[s*i+APCK_PTR2/4  ]= chrUSrcPtr[i+(vChrFilterSize>1)];
                 chrMmxFilter[s*i+APCK_COEF/4  ]=
                 chrMmxFilter[s*i+APCK_COEF/4+1]= vChrFilter[chrDstY*vChrFilterSize + i    ]
-                + (vChrFilterSize>1 ? vChrFilter[chrDstY*vChrFilterSize + i + 1]<<16 : 0);
+                    + (vChrFilterSize>1 ? vChrFilter[chrDstY*vChrFilterSize + i + 1] * (1 << 16) : 0);
             }
         } else {
             for (i=0; i<vLumFilterSize; i++) {
diff --git a/libswscale/x86/swscale_template.c b/libswscale/x86/swscale_template.c
index 7c30470..823056c 100644
--- a/libswscale/x86/swscale_template.c
+++ b/libswscale/x86/swscale_template.c
@@ -1499,8 +1499,8 @@
     enum AVPixelFormat dstFormat = c->dstFormat;
 
     c->use_mmx_vfilter= 0;
-    if (!is16BPS(dstFormat) && !isNBPS(dstFormat) && dstFormat != AV_PIX_FMT_NV12
-        && dstFormat != AV_PIX_FMT_NV21 && dstFormat != AV_PIX_FMT_GRAYF32BE && dstFormat != AV_PIX_FMT_GRAYF32LE
+    if (!is16BPS(dstFormat) && !isNBPS(dstFormat) && !isSemiPlanarYUV(dstFormat)
+        && dstFormat != AV_PIX_FMT_GRAYF32BE && dstFormat != AV_PIX_FMT_GRAYF32LE
         && !(c->flags & SWS_BITEXACT)) {
             if (c->flags & SWS_ACCURATE_RND) {
                 if (!(c->flags & SWS_FULL_CHR_H_INT)) {
diff --git a/libswscale/x86/yuv2rgb.c b/libswscale/x86/yuv2rgb.c
index 5e2f77c..c12e88c 100644
--- a/libswscale/x86/yuv2rgb.c
+++ b/libswscale/x86/yuv2rgb.c
@@ -37,7 +37,7 @@
 #include "libavutil/x86/cpu.h"
 #include "libavutil/cpu.h"
 
-#if HAVE_INLINE_ASM
+#if HAVE_X86ASM
 
 #define DITHER1XBPP // only for MMX
 
@@ -50,32 +50,69 @@
 DECLARE_ASM_CONST(8, uint64_t, pb_07) = 0x0707070707070707ULL;
 
 //MMX versions
-#if HAVE_MMX_INLINE && HAVE_6REGS
+#if HAVE_MMX
 #undef RENAME
 #undef COMPILE_TEMPLATE_MMXEXT
 #define COMPILE_TEMPLATE_MMXEXT 0
 #define RENAME(a) a ## _mmx
 #include "yuv2rgb_template.c"
-#endif /* HAVE_MMX_INLINE && HAVE_6REGS */
+#endif /* HAVE_MMX */
 
 // MMXEXT versions
-#if HAVE_MMXEXT_INLINE && HAVE_6REGS
+#if HAVE_MMXEXT
 #undef RENAME
 #undef COMPILE_TEMPLATE_MMXEXT
 #define COMPILE_TEMPLATE_MMXEXT 1
 #define RENAME(a) a ## _mmxext
 #include "yuv2rgb_template.c"
-#endif /* HAVE_MMXEXT_INLINE && HAVE_6REGS */
+#endif /* HAVE_MMXEXT */
 
-#endif /* HAVE_INLINE_ASM */
+//SSSE3 versions
+#if HAVE_SSSE3
+#undef RENAME
+#undef COMPILE_TEMPLATE_MMXEXT
+#define COMPILE_TEMPLATE_MMXEXT 0
+#define RENAME(a) a ## _ssse3
+#include "yuv2rgb_template.c"
+#endif
+
+#endif /* HAVE_X86ASM */
 
 av_cold SwsFunc ff_yuv2rgb_init_x86(SwsContext *c)
 {
-#if HAVE_MMX_INLINE && HAVE_6REGS
+#if HAVE_X86ASM
     int cpu_flags = av_get_cpu_flags();
 
-#if HAVE_MMXEXT_INLINE
-    if (INLINE_MMXEXT(cpu_flags)) {
+    if (EXTERNAL_SSSE3(cpu_flags)) {
+        switch (c->dstFormat) {
+        case AV_PIX_FMT_RGB32:
+            if (c->srcFormat == AV_PIX_FMT_YUVA420P) {
+#if CONFIG_SWSCALE_ALPHA
+                return yuva420_rgb32_ssse3;
+#endif
+                break;
+            } else
+                return yuv420_rgb32_ssse3;
+        case AV_PIX_FMT_BGR32:
+            if (c->srcFormat == AV_PIX_FMT_YUVA420P) {
+#if CONFIG_SWSCALE_ALPHA
+                return yuva420_bgr32_ssse3;
+#endif
+                break;
+            } else
+                return yuv420_bgr32_ssse3;
+        case AV_PIX_FMT_RGB24:
+            return yuv420_rgb24_ssse3;
+        case AV_PIX_FMT_BGR24:
+            return yuv420_bgr24_ssse3;
+        case AV_PIX_FMT_RGB565:
+            return yuv420_rgb16_ssse3;
+        case AV_PIX_FMT_RGB555:
+            return yuv420_rgb15_ssse3;
+        }
+    }
+
+    if (EXTERNAL_MMXEXT(cpu_flags)) {
         switch (c->dstFormat) {
         case AV_PIX_FMT_RGB24:
             return yuv420_rgb24_mmxext;
@@ -83,13 +120,12 @@
             return yuv420_bgr24_mmxext;
         }
     }
-#endif
 
-    if (INLINE_MMX(cpu_flags)) {
+    if (EXTERNAL_MMX(cpu_flags)) {
         switch (c->dstFormat) {
             case AV_PIX_FMT_RGB32:
                 if (c->srcFormat == AV_PIX_FMT_YUVA420P) {
-#if HAVE_7REGS && CONFIG_SWSCALE_ALPHA
+#if CONFIG_SWSCALE_ALPHA
                     return yuva420_rgb32_mmx;
 #endif
                     break;
@@ -97,7 +133,7 @@
                     return yuv420_rgb32_mmx;
             case AV_PIX_FMT_BGR32:
                 if (c->srcFormat == AV_PIX_FMT_YUVA420P) {
-#if HAVE_7REGS && CONFIG_SWSCALE_ALPHA
+#if CONFIG_SWSCALE_ALPHA
                     return yuva420_bgr32_mmx;
 #endif
                     break;
@@ -113,7 +149,7 @@
                 return yuv420_rgb15_mmx;
         }
     }
-#endif /* HAVE_MMX_INLINE  && HAVE_6REGS */
 
+#endif /* HAVE_X86ASM */
     return NULL;
 }
diff --git a/libswscale/x86/yuv2rgb_template.c b/libswscale/x86/yuv2rgb_template.c
index acb78f5..d506f75 100644
--- a/libswscale/x86/yuv2rgb_template.c
+++ b/libswscale/x86/yuv2rgb_template.c
@@ -26,23 +26,6 @@
 #include "libavutil/x86/asm.h"
 #include "libswscale/swscale_internal.h"
 
-#undef MOVNTQ
-#undef EMMS
-#undef SFENCE
-
-#if COMPILE_TEMPLATE_MMXEXT
-#define MOVNTQ "movntq"
-#define SFENCE "sfence"
-#else
-#define MOVNTQ "movq"
-#define SFENCE " # nop"
-#endif
-
-#define REG_BLUE  "0"
-#define REG_RED   "1"
-#define REG_GREEN "2"
-#define REG_ALPHA "3"
-
 #define YUV2RGB_LOOP(depth)                                          \
     h_size = (c->dstW + 7) & ~7;                                     \
     if (h_size * depth > FFABS(dstStride[0]))                        \
@@ -50,7 +33,6 @@
                                                                      \
     vshift = c->srcFormat != AV_PIX_FMT_YUV422P;                        \
                                                                      \
-    __asm__ volatile ("pxor %mm4, %mm4\n\t");                        \
     for (y = 0; y < srcSliceH; y++) {                                \
         uint8_t *image    = dst[0] + (y + srcSliceY) * dstStride[0]; \
         const uint8_t *py = src[0] +               y * srcStride[0]; \
@@ -58,146 +40,33 @@
         const uint8_t *pv = src[2] +   (y >> vshift) * srcStride[2]; \
         x86_reg index = -h_size / 2;                                 \
 
-#define YUV2RGB_INITIAL_LOAD          \
-    __asm__ volatile (                \
-        "movq (%5, %0, 2), %%mm6\n\t" \
-        "movd    (%2, %0), %%mm0\n\t" \
-        "movd    (%3, %0), %%mm1\n\t" \
-        "1: \n\t"                     \
-
-/* YUV2RGB core
- * Conversion is performed in usual way:
- * R = Y' * Ycoef + Vred * V'
- * G = Y' * Ycoef + Vgreen * V' + Ugreen * U'
- * B = Y' * Ycoef               + Ublue * U'
- *
- * where X' = X * 8 - Xoffset (multiplication is performed to increase
- * precision a bit).
- * Since it operates in YUV420 colorspace, Y component is additionally
- * split into Y1 and Y2 for even and odd pixels.
- *
- * Input:
- * mm0 - U (4 elems), mm1 - V (4 elems), mm6 - Y (8 elems), mm4 - zero register
- * Output:
- * mm1 - R, mm2 - G, mm0 - B
- */
-#define YUV2RGB                                  \
-    /* convert Y, U, V into Y1', Y2', U', V' */  \
-    "movq      %%mm6, %%mm7\n\t"                 \
-    "punpcklbw %%mm4, %%mm0\n\t"                 \
-    "punpcklbw %%mm4, %%mm1\n\t"                 \
-    "pand     "MANGLE(mmx_00ffw)", %%mm6\n\t"    \
-    "psrlw     $8,    %%mm7\n\t"                 \
-    "psllw     $3,    %%mm0\n\t"                 \
-    "psllw     $3,    %%mm1\n\t"                 \
-    "psllw     $3,    %%mm6\n\t"                 \
-    "psllw     $3,    %%mm7\n\t"                 \
-    "psubsw   "U_OFFSET"(%4), %%mm0\n\t"         \
-    "psubsw   "V_OFFSET"(%4), %%mm1\n\t"         \
-    "psubw    "Y_OFFSET"(%4), %%mm6\n\t"         \
-    "psubw    "Y_OFFSET"(%4), %%mm7\n\t"         \
-\
-     /* multiply by coefficients */              \
-    "movq      %%mm0, %%mm2\n\t"                 \
-    "movq      %%mm1, %%mm3\n\t"                 \
-    "pmulhw   "UG_COEFF"(%4), %%mm2\n\t"         \
-    "pmulhw   "VG_COEFF"(%4), %%mm3\n\t"         \
-    "pmulhw   "Y_COEFF" (%4), %%mm6\n\t"         \
-    "pmulhw   "Y_COEFF" (%4), %%mm7\n\t"         \
-    "pmulhw   "UB_COEFF"(%4), %%mm0\n\t"         \
-    "pmulhw   "VR_COEFF"(%4), %%mm1\n\t"         \
-    "paddsw    %%mm3, %%mm2\n\t"                 \
-    /* now: mm0 = UB, mm1 = VR, mm2 = CG */      \
-    /*      mm6 = Y1, mm7 = Y2 */                \
-\
-    /* produce RGB */                            \
-    "movq      %%mm7, %%mm3\n\t"                 \
-    "movq      %%mm7, %%mm5\n\t"                 \
-    "paddsw    %%mm0, %%mm3\n\t"                 \
-    "paddsw    %%mm1, %%mm5\n\t"                 \
-    "paddsw    %%mm2, %%mm7\n\t"                 \
-    "paddsw    %%mm6, %%mm0\n\t"                 \
-    "paddsw    %%mm6, %%mm1\n\t"                 \
-    "paddsw    %%mm6, %%mm2\n\t"                 \
-
-#define RGB_PACK_INTERLEAVE                  \
-    /* pack and interleave even/odd pixels */    \
-    "packuswb  %%mm1, %%mm0\n\t"                 \
-    "packuswb  %%mm5, %%mm3\n\t"                 \
-    "packuswb  %%mm2, %%mm2\n\t"                 \
-    "movq      %%mm0, %%mm1\n\n"                 \
-    "packuswb  %%mm7, %%mm7\n\t"                 \
-    "punpcklbw %%mm3, %%mm0\n\t"                 \
-    "punpckhbw %%mm3, %%mm1\n\t"                 \
-    "punpcklbw %%mm7, %%mm2\n\t"                 \
-
-#define YUV2RGB_ENDLOOP(depth)                   \
-    "movq 8 (%5, %0, 2), %%mm6\n\t"              \
-    "movd 4 (%3, %0),    %%mm1\n\t"              \
-    "movd 4 (%2, %0),    %%mm0\n\t"              \
-    "add $"AV_STRINGIFY(depth * 8)", %1\n\t"     \
-    "add  $4, %0\n\t"                            \
-    "js   1b\n\t"                                \
-
-#if COMPILE_TEMPLATE_MMXEXT
-#undef RGB_PACK24_B_OPERANDS
-#define RGB_PACK24_B_OPERANDS NAMED_CONSTRAINTS_ARRAY_ADD(mask1101,mask0110,mask0100,mask0010,mask1001)
-#else
-#undef RGB_PACK24_B_OPERANDS
-#define RGB_PACK24_B_OPERANDS
-#endif
-
-#define YUV2RGB_OPERANDS                                          \
-        : "+r" (index), "+r" (image)                              \
-        : "r" (pu - index), "r" (pv - index), "r"(&c->redDither), \
-          "r" (py - 2*index)                                      \
-          NAMED_CONSTRAINTS_ADD(mmx_00ffw,pb_03,pb_07,mmx_redmask,pb_e0) \
-          RGB_PACK24_B_OPERANDS                                   \
-        : "memory"                                                \
-        );                                                        \
-    }                                                             \
-
-#define YUV2RGB_OPERANDS_ALPHA                                    \
-        : "+r" (index), "+r" (image)                              \
-        : "r" (pu - index), "r" (pv - index), "r"(&c->redDither), \
-          "r" (py - 2*index), "r" (pa - 2*index)                  \
-          NAMED_CONSTRAINTS_ADD(mmx_00ffw)                        \
-        : "memory"                                                \
-        );                                                        \
-    }                                                             \
-
-#define YUV2RGB_ENDFUNC                          \
-    __asm__ volatile (SFENCE"\n\t"               \
-                    "emms    \n\t");             \
-    return srcSliceH;                            \
-
-#define IF0(x)
-#define IF1(x) x
-
-#define RGB_PACK16(gmask, is15)                  \
-    "pand      "MANGLE(mmx_redmask)", %%mm0\n\t" \
-    "pand      "MANGLE(mmx_redmask)", %%mm1\n\t" \
-    "movq      %%mm2,     %%mm3\n\t"             \
-    "psllw   $"AV_STRINGIFY(3-is15)", %%mm2\n\t" \
-    "psrlw   $"AV_STRINGIFY(5+is15)", %%mm3\n\t" \
-    "psrlw     $3,        %%mm0\n\t"             \
-    IF##is15("psrlw  $1,  %%mm1\n\t")            \
-    "pand "MANGLE(pb_e0)", %%mm2\n\t"            \
-    "pand "MANGLE(gmask)", %%mm3\n\t"            \
-    "por       %%mm2,     %%mm0\n\t"             \
-    "por       %%mm3,     %%mm1\n\t"             \
-    "movq      %%mm0,     %%mm2\n\t"             \
-    "punpcklbw %%mm1,     %%mm0\n\t"             \
-    "punpckhbw %%mm1,     %%mm2\n\t"             \
-    MOVNTQ "   %%mm0,      (%1)\n\t"             \
-    MOVNTQ "   %%mm2,     8(%1)\n\t"             \
-
-#define DITHER_RGB                               \
-    "paddusb "BLUE_DITHER"(%4),  %%mm0\n\t"      \
-    "paddusb "GREEN_DITHER"(%4), %%mm2\n\t"      \
-    "paddusb "RED_DITHER"(%4),   %%mm1\n\t"      \
+extern void RENAME(ff_yuv_420_rgb24)(x86_reg index, uint8_t *image, const uint8_t *pu_index,
+                                     const uint8_t *pv_index, const uint64_t *pointer_c_dither,
+                                     const uint8_t *py_2index);
+extern void RENAME(ff_yuv_420_bgr24)(x86_reg index, uint8_t *image, const uint8_t *pu_index,
+                                     const uint8_t *pv_index, const uint64_t *pointer_c_dither,
+                                     const uint8_t *py_2index);
 
 #if !COMPILE_TEMPLATE_MMXEXT
+extern void RENAME(ff_yuv_420_rgb15)(x86_reg index, uint8_t *image, const uint8_t *pu_index,
+                                     const uint8_t *pv_index, const uint64_t *pointer_c_dither,
+                                     const uint8_t *py_2index);
+extern void RENAME(ff_yuv_420_rgb16)(x86_reg index, uint8_t *image, const uint8_t *pu_index,
+                                     const uint8_t *pv_index, const uint64_t *pointer_c_dither,
+                                     const uint8_t *py_2index);
+extern void RENAME(ff_yuv_420_rgb32)(x86_reg index, uint8_t *image, const uint8_t *pu_index,
+                                     const uint8_t *pv_index, const uint64_t *pointer_c_dither,
+                                     const uint8_t *py_2index);
+extern void RENAME(ff_yuv_420_bgr32)(x86_reg index, uint8_t *image, const uint8_t *pu_index,
+                                     const uint8_t *pv_index, const uint64_t *pointer_c_dither,
+                                     const uint8_t *py_2index);
+extern void RENAME(ff_yuva_420_rgb32)(x86_reg index, uint8_t *image, const uint8_t *pu_index,
+                                      const uint8_t *pv_index, const uint64_t *pointer_c_dither,
+                                      const uint8_t *py_2index, const uint8_t *pa_2index);
+extern void RENAME(ff_yuva_420_bgr32)(x86_reg index, uint8_t *image, const uint8_t *pu_index,
+                                      const uint8_t *pv_index, const uint64_t *pointer_c_dither,
+                                      const uint8_t *py_2index, const uint8_t *pa_2index);
+
 static inline int RENAME(yuv420_rgb15)(SwsContext *c, const uint8_t *src[],
                                        int srcStride[],
                                        int srcSliceY, int srcSliceH,
@@ -213,17 +82,9 @@
         c->redDither   = ff_dither8[(y + 1) & 1];
 #endif
 
-        YUV2RGB_INITIAL_LOAD
-        YUV2RGB
-        RGB_PACK_INTERLEAVE
-#ifdef DITHER1XBPP
-        DITHER_RGB
-#endif
-        RGB_PACK16(pb_03, 1)
-
-    YUV2RGB_ENDLOOP(2)
-    YUV2RGB_OPERANDS
-    YUV2RGB_ENDFUNC
+        RENAME(ff_yuv_420_rgb15)(index, image, pu - index, pv - index, &(c->redDither), py - 2 * index);
+    }
+    return srcSliceH;
 }
 
 static inline int RENAME(yuv420_rgb16)(SwsContext *c, const uint8_t *src[],
@@ -241,79 +102,67 @@
         c->redDither   = ff_dither8[(y + 1) & 1];
 #endif
 
-        YUV2RGB_INITIAL_LOAD
-        YUV2RGB
-        RGB_PACK_INTERLEAVE
-#ifdef DITHER1XBPP
-        DITHER_RGB
-#endif
-        RGB_PACK16(pb_07, 0)
-
-    YUV2RGB_ENDLOOP(2)
-    YUV2RGB_OPERANDS
-    YUV2RGB_ENDFUNC
+        RENAME(ff_yuv_420_rgb16)(index, image, pu - index, pv - index, &(c->redDither), py - 2 * index);
+    }
+    return srcSliceH;
 }
-#endif /* !COMPILE_TEMPLATE_MMXEXT */
 
-#define RGB_PACK24(blue, red)\
-    "packuswb  %%mm3,      %%mm0 \n" /* R0 R2 R4 R6 R1 R3 R5 R7 */\
-    "packuswb  %%mm5,      %%mm1 \n" /* B0 B2 B4 B6 B1 B3 B5 B7 */\
-    "packuswb  %%mm7,      %%mm2 \n" /* G0 G2 G4 G6 G1 G3 G5 G7 */\
-    "movq      %%mm"red",  %%mm3 \n"\
-    "movq      %%mm"blue", %%mm6 \n"\
-    "psrlq     $32,        %%mm"red" \n" /* R1 R3 R5 R7 */\
-    "punpcklbw %%mm2,      %%mm3 \n" /* R0 G0 R2 G2 R4 G4 R6 G6 */\
-    "punpcklbw %%mm"red",  %%mm6 \n" /* B0 R1 B2 R3 B4 R5 B6 R7 */\
-    "movq      %%mm3,      %%mm5 \n"\
-    "punpckhbw %%mm"blue", %%mm2 \n" /* G1 B1 G3 B3 G5 B5 G7 B7 */\
-    "punpcklwd %%mm6,      %%mm3 \n" /* R0 G0 B0 R1 R2 G2 B2 R3 */\
-    "punpckhwd %%mm6,      %%mm5 \n" /* R4 G4 B4 R5 R6 G6 B6 R7 */\
-    RGB_PACK24_B
+static inline int RENAME(yuv420_rgb32)(SwsContext *c, const uint8_t *src[],
+                                       int srcStride[],
+                                       int srcSliceY, int srcSliceH,
+                                       uint8_t *dst[], int dstStride[])
+{
+    int y, h_size, vshift;
 
-#if COMPILE_TEMPLATE_MMXEXT
-DECLARE_ASM_CONST(8, int16_t, mask1101[4]) = {-1,-1, 0,-1};
-DECLARE_ASM_CONST(8, int16_t, mask0010[4]) = { 0, 0,-1, 0};
-DECLARE_ASM_CONST(8, int16_t, mask0110[4]) = { 0,-1,-1, 0};
-DECLARE_ASM_CONST(8, int16_t, mask1001[4]) = {-1, 0, 0,-1};
-DECLARE_ASM_CONST(8, int16_t, mask0100[4]) = { 0,-1, 0, 0};
-#undef RGB_PACK24_B
-#define RGB_PACK24_B\
-    "pshufw    $0xc6,  %%mm2, %%mm1 \n"\
-    "pshufw    $0x84,  %%mm3, %%mm6 \n"\
-    "pshufw    $0x38,  %%mm5, %%mm7 \n"\
-    "pand "MANGLE(mask1101)", %%mm6 \n" /* R0 G0 B0 R1 -- -- R2 G2 */\
-    "movq      %%mm1,         %%mm0 \n"\
-    "pand "MANGLE(mask0110)", %%mm7 \n" /* -- -- R6 G6 B6 R7 -- -- */\
-    "movq      %%mm1,         %%mm2 \n"\
-    "pand "MANGLE(mask0100)", %%mm1 \n" /* -- -- G3 B3 -- -- -- -- */\
-    "psrlq       $48,         %%mm3 \n" /* B2 R3 -- -- -- -- -- -- */\
-    "pand "MANGLE(mask0010)", %%mm0 \n" /* -- -- -- -- G1 B1 -- -- */\
-    "psllq       $32,         %%mm5 \n" /* -- -- -- -- R4 G4 B4 R5 */\
-    "pand "MANGLE(mask1001)", %%mm2 \n" /* G5 B5 -- -- -- -- G7 B7 */\
-    "por       %%mm3,         %%mm1 \n"\
-    "por       %%mm6,         %%mm0 \n"\
-    "por       %%mm5,         %%mm1 \n"\
-    "por       %%mm7,         %%mm2 \n"\
-    MOVNTQ"    %%mm0,          (%1) \n"\
-    MOVNTQ"    %%mm1,         8(%1) \n"\
-    MOVNTQ"    %%mm2,        16(%1) \n"\
+    YUV2RGB_LOOP(4)
 
-#else
-#undef RGB_PACK24_B
-#define RGB_PACK24_B\
-    "movd      %%mm3,       (%1) \n" /* R0 G0 B0 R1 */\
-    "movd      %%mm2,      4(%1) \n" /* G1 B1 */\
-    "psrlq     $32,        %%mm3 \n"\
-    "psrlq     $16,        %%mm2 \n"\
-    "movd      %%mm3,      6(%1) \n" /* R2 G2 B2 R3 */\
-    "movd      %%mm2,     10(%1) \n" /* G3 B3 */\
-    "psrlq     $16,        %%mm2 \n"\
-    "movd      %%mm5,     12(%1) \n" /* R4 G4 B4 R5 */\
-    "movd      %%mm2,     16(%1) \n" /* G5 B5 */\
-    "psrlq     $32,        %%mm5 \n"\
-    "movd      %%mm2,     20(%1) \n" /* -- -- G7 B7 */\
-    "movd      %%mm5,     18(%1) \n" /* R6 G6 B6 R7 */\
+        RENAME(ff_yuv_420_rgb32)(index, image, pu - index, pv - index, &(c->redDither), py - 2 * index);
+    }
+    return srcSliceH;
+}
 
+static inline int RENAME(yuv420_bgr32)(SwsContext *c, const uint8_t *src[],
+                                       int srcStride[],
+                                       int srcSliceY, int srcSliceH,
+                                       uint8_t *dst[], int dstStride[])
+{
+    int y, h_size, vshift;
+
+    YUV2RGB_LOOP(4)
+
+        RENAME(ff_yuv_420_bgr32)(index, image, pu - index, pv - index, &(c->redDither), py - 2 * index);
+    }
+    return srcSliceH;
+}
+
+static inline int RENAME(yuva420_rgb32)(SwsContext *c, const uint8_t *src[],
+                                       int srcStride[],
+                                       int srcSliceY, int srcSliceH,
+                                       uint8_t *dst[], int dstStride[])
+{
+    int y, h_size, vshift;
+    YUV2RGB_LOOP(4)
+
+        const uint8_t *pa = src[3] + y * srcStride[3];
+        RENAME(ff_yuva_420_rgb32)(index, image, pu - index, pv - index, &(c->redDither), py - 2 * index, pa - 2 * index);
+    }
+    return srcSliceH;
+}
+
+static inline int RENAME(yuva420_bgr32)(SwsContext *c, const uint8_t *src[],
+                                        int srcStride[],
+                                        int srcSliceY, int srcSliceH,
+                                        uint8_t *dst[], int dstStride[])
+{
+    int y, h_size, vshift;
+
+    YUV2RGB_LOOP(4)
+
+        const uint8_t *pa = src[3] + y * srcStride[3];
+        RENAME(ff_yuva_420_bgr32)(index, image, pu - index, pv - index, &(c->redDither), py - 2 * index, pa - 2 * index);
+    }
+    return srcSliceH;
+}
 #endif
 
 static inline int RENAME(yuv420_rgb24)(SwsContext *c, const uint8_t *src[],
@@ -325,143 +174,22 @@
 
     YUV2RGB_LOOP(3)
 
-        YUV2RGB_INITIAL_LOAD
-        YUV2RGB
-        RGB_PACK24(REG_BLUE, REG_RED)
-
-    YUV2RGB_ENDLOOP(3)
-    YUV2RGB_OPERANDS
-    YUV2RGB_ENDFUNC
+        RENAME(ff_yuv_420_rgb24)(index, image, pu - index, pv - index, &(c->redDither), py - 2 * index);
+    }
+    return srcSliceH;
 }
 
 static inline int RENAME(yuv420_bgr24)(SwsContext *c, const uint8_t *src[],
-                                       int srcStride[],
-                                       int srcSliceY, int srcSliceH,
-                                       uint8_t *dst[], int dstStride[])
+                                        int srcStride[],
+                                        int srcSliceY, int srcSliceH,
+                                        uint8_t *dst[], int dstStride[])
 {
     int y, h_size, vshift;
 
     YUV2RGB_LOOP(3)
 
-        YUV2RGB_INITIAL_LOAD
-        YUV2RGB
-        RGB_PACK24(REG_RED, REG_BLUE)
-
-    YUV2RGB_ENDLOOP(3)
-    YUV2RGB_OPERANDS
-    YUV2RGB_ENDFUNC
+        RENAME(ff_yuv_420_bgr24)(index, image, pu - index, pv - index, &(c->redDither), py - 2 * index);
+    }
+    return srcSliceH;
 }
 
-
-#define SET_EMPTY_ALPHA                                                      \
-    "pcmpeqd   %%mm"REG_ALPHA", %%mm"REG_ALPHA"\n\t" /* set alpha to 0xFF */ \
-
-#define LOAD_ALPHA                                   \
-    "movq      (%6, %0, 2),     %%mm"REG_ALPHA"\n\t" \
-
-#define RGB_PACK32(red, green, blue, alpha)  \
-    "movq      %%mm"blue",  %%mm5\n\t"       \
-    "movq      %%mm"red",   %%mm6\n\t"       \
-    "punpckhbw %%mm"green", %%mm5\n\t"       \
-    "punpcklbw %%mm"green", %%mm"blue"\n\t"  \
-    "punpckhbw %%mm"alpha", %%mm6\n\t"       \
-    "punpcklbw %%mm"alpha", %%mm"red"\n\t"   \
-    "movq      %%mm"blue",  %%mm"green"\n\t" \
-    "movq      %%mm5,       %%mm"alpha"\n\t" \
-    "punpcklwd %%mm"red",   %%mm"blue"\n\t"  \
-    "punpckhwd %%mm"red",   %%mm"green"\n\t" \
-    "punpcklwd %%mm6,       %%mm5\n\t"       \
-    "punpckhwd %%mm6,       %%mm"alpha"\n\t" \
-    MOVNTQ "   %%mm"blue",   0(%1)\n\t"      \
-    MOVNTQ "   %%mm"green",  8(%1)\n\t"      \
-    MOVNTQ "   %%mm5,       16(%1)\n\t"      \
-    MOVNTQ "   %%mm"alpha", 24(%1)\n\t"      \
-
-#if !COMPILE_TEMPLATE_MMXEXT
-static inline int RENAME(yuv420_rgb32)(SwsContext *c, const uint8_t *src[],
-                                       int srcStride[],
-                                       int srcSliceY, int srcSliceH,
-                                       uint8_t *dst[], int dstStride[])
-{
-    int y, h_size, vshift;
-
-    YUV2RGB_LOOP(4)
-
-        YUV2RGB_INITIAL_LOAD
-        YUV2RGB
-        RGB_PACK_INTERLEAVE
-        SET_EMPTY_ALPHA
-        RGB_PACK32(REG_RED, REG_GREEN, REG_BLUE, REG_ALPHA)
-
-    YUV2RGB_ENDLOOP(4)
-    YUV2RGB_OPERANDS
-    YUV2RGB_ENDFUNC
-}
-
-#if HAVE_7REGS && CONFIG_SWSCALE_ALPHA
-static inline int RENAME(yuva420_rgb32)(SwsContext *c, const uint8_t *src[],
-                                        int srcStride[],
-                                        int srcSliceY, int srcSliceH,
-                                        uint8_t *dst[], int dstStride[])
-{
-    int y, h_size, vshift;
-
-    YUV2RGB_LOOP(4)
-
-        const uint8_t *pa = src[3] + y * srcStride[3];
-        YUV2RGB_INITIAL_LOAD
-        YUV2RGB
-        RGB_PACK_INTERLEAVE
-        LOAD_ALPHA
-        RGB_PACK32(REG_RED, REG_GREEN, REG_BLUE, REG_ALPHA)
-
-    YUV2RGB_ENDLOOP(4)
-    YUV2RGB_OPERANDS_ALPHA
-    YUV2RGB_ENDFUNC
-}
-#endif
-
-static inline int RENAME(yuv420_bgr32)(SwsContext *c, const uint8_t *src[],
-                                       int srcStride[],
-                                       int srcSliceY, int srcSliceH,
-                                       uint8_t *dst[], int dstStride[])
-{
-    int y, h_size, vshift;
-
-    YUV2RGB_LOOP(4)
-
-        YUV2RGB_INITIAL_LOAD
-        YUV2RGB
-        RGB_PACK_INTERLEAVE
-        SET_EMPTY_ALPHA
-        RGB_PACK32(REG_BLUE, REG_GREEN, REG_RED, REG_ALPHA)
-
-    YUV2RGB_ENDLOOP(4)
-    YUV2RGB_OPERANDS
-    YUV2RGB_ENDFUNC
-}
-
-#if HAVE_7REGS && CONFIG_SWSCALE_ALPHA
-static inline int RENAME(yuva420_bgr32)(SwsContext *c, const uint8_t *src[],
-                                        int srcStride[],
-                                        int srcSliceY, int srcSliceH,
-                                        uint8_t *dst[], int dstStride[])
-{
-    int y, h_size, vshift;
-
-    YUV2RGB_LOOP(4)
-
-        const uint8_t *pa = src[3] + y * srcStride[3];
-        YUV2RGB_INITIAL_LOAD
-        YUV2RGB
-        RGB_PACK_INTERLEAVE
-        LOAD_ALPHA
-        RGB_PACK32(REG_BLUE, REG_GREEN, REG_RED, REG_ALPHA)
-
-    YUV2RGB_ENDLOOP(4)
-    YUV2RGB_OPERANDS_ALPHA
-    YUV2RGB_ENDFUNC
-}
-#endif
-
-#endif /* !COMPILE_TEMPLATE_MMXEXT */
diff --git a/libswscale/x86/yuv_2_rgb.asm b/libswscale/x86/yuv_2_rgb.asm
new file mode 100644
index 0000000..575a84d
--- /dev/null
+++ b/libswscale/x86/yuv_2_rgb.asm
@@ -0,0 +1,383 @@
+;******************************************************************************
+;* software YUV to RGB converter
+;*
+;* Copyright (C) 2001-2007 Michael Niedermayer
+;*           (c) 2010 Konstantin Shishkov
+;*
+;* This file is part of FFmpeg.
+;*
+;* FFmpeg is free software; you can redistribute it and/or
+;* modify it under the terms of the GNU Lesser General Public
+;* License as published by the Free Software Foundation; either
+;* version 2.1 of the License, or (at your option) any later version.
+;*
+;* FFmpeg is distributed in the hope that it will be useful,
+;* but WITHOUT ANY WARRANTY; without even the implied warranty of
+;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+;* Lesser General Public License for more details.
+;*
+;* You should have received a copy of the GNU Lesser General Public
+;* License along with FFmpeg; if not, write to the Free Software
+;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+;******************************************************************************
+
+%include "libavutil/x86/x86util.asm"
+
+SECTION_RODATA
+
+; below variables are named like mask_dwXY, which means to preserve dword No.X & No.Y
+mask_dw036 : db -1, -1,  0,  0,  0,  0, -1, -1,  0,  0,  0,  0, -1, -1,  0,  0
+mask_dw147 : db  0,  0, -1, -1,  0,  0,  0,  0, -1, -1,  0,  0,  0,  0, -1, -1
+mask_dw25  : db  0,  0,  0,  0, -1, -1,  0,  0,  0,  0, -1, -1,  0,  0,  0,  0
+rgb24_shuf1: db  0,  1,  6,  7, 12, 13,  2,  3,  8,  9, 14, 15,  4,  5, 10, 11
+rgb24_shuf2: db 10, 11,  0,  1,  6,  7, 12, 13,  2,  3,  8,  9, 14, 15,  4,  5
+rgb24_shuf3: db  4,  5, 10, 11,  0,  1,  6,  7, 12, 13,  2,  3,  8,  9, 14, 15
+pw_00ff: times 8 dw 255
+pb_f8:   times 16 db 248
+pb_e0:   times 16 db 224
+pb_03:   times 16 db 3
+pb_07:   times 16 db 7
+
+mask_1101: dw -1, -1,  0, -1
+mask_0010: dw  0,  0, -1,  0
+mask_0110: dw  0, -1, -1,  0
+mask_1001: dw -1,  0,  0, -1
+mask_0100: dw  0, -1,  0,  0
+
+SECTION .text
+
+;-----------------------------------------------------------------------------
+;
+; YUV420/YUVA420 to RGB/BGR 15/16/24/32
+; R = Y + ((vrCoff * (v - 128)) >> 8)
+; G = Y - ((ugCoff * (u - 128) + vgCoff * (v - 128)) >> 8)
+; B = Y + ((ubCoff * (u - 128)) >> 8)
+;
+;-----------------------------------------------------------------------------
+
+%macro MOV_H2L 1
+%if mmsize == 8
+    psrlq %1, 32
+%else ; mmsize == 16
+    psrldq %1, 8
+%endif
+%endmacro
+
+%macro yuv2rgb_fn 3
+
+%if %3 == 32
+    %ifidn %1, yuva
+    %define parameters index, image, pu_index, pv_index, pointer_c_dither, py_2index, pa_2index
+    %define GPR_num 7
+    %endif
+%else
+    %define parameters index, image, pu_index, pv_index, pointer_c_dither, py_2index
+    %define GPR_num 6
+%endif
+
+%define m_green m2
+%define m_alpha m3
+%define m_y m6
+%define m_u m0
+%define m_v m1
+%ifidn %2, rgb
+%define m_red m1
+%define m_blue m0
+%else
+%define m_red m0
+%define m_blue m1
+%endif
+
+%if mmsize == 8
+%define time_num 1
+%define reg_num 8
+%define y_offset [pointer_c_ditherq + 8  * 8]
+%define u_offset [pointer_c_ditherq + 9  * 8]
+%define v_offset [pointer_c_ditherq + 10 * 8]
+%define ug_coff  [pointer_c_ditherq + 7  * 8]
+%define vg_coff  [pointer_c_ditherq + 6  * 8]
+%define y_coff   [pointer_c_ditherq + 3  * 8]
+%define ub_coff  [pointer_c_ditherq + 5  * 8]
+%define vr_coff  [pointer_c_ditherq + 4  * 8]
+%elif mmsize == 16
+%define time_num 2
+%if ARCH_X86_32
+%define reg_num 8
+%define my_offset [pointer_c_ditherq + 8  * 8]
+%define mu_offset [pointer_c_ditherq + 9  * 8]
+%define mv_offset [pointer_c_ditherq + 10 * 8]
+%define mug_coff  [pointer_c_ditherq + 7  * 8]
+%define mvg_coff  [pointer_c_ditherq + 6  * 8]
+%define my_coff   [pointer_c_ditherq + 3  * 8]
+%define mub_coff  [pointer_c_ditherq + 5  * 8]
+%define mvr_coff  [pointer_c_ditherq + 4  * 8]
+%else ; ARCH_X86_64
+%define reg_num 16
+%define y_offset m8
+%define u_offset m9
+%define v_offset m10
+%define ug_coff  m11
+%define vg_coff  m12
+%define y_coff   m13
+%define ub_coff  m14
+%define vr_coff  m15
+%endif ; ARCH_X86_32/64
+%endif ; coeff define mmsize == 8/16
+
+cglobal %1_420_%2%3, GPR_num, GPR_num, reg_num, parameters
+
+%if ARCH_X86_64
+    movsxd indexq, indexd
+%if mmsize == 16
+    VBROADCASTSD y_offset, [pointer_c_ditherq + 8  * 8]
+    VBROADCASTSD u_offset, [pointer_c_ditherq + 9  * 8]
+    VBROADCASTSD v_offset, [pointer_c_ditherq + 10 * 8]
+    VBROADCASTSD ug_coff,  [pointer_c_ditherq + 7  * 8]
+    VBROADCASTSD vg_coff,  [pointer_c_ditherq + 6  * 8]
+    VBROADCASTSD y_coff,   [pointer_c_ditherq + 3  * 8]
+    VBROADCASTSD ub_coff,  [pointer_c_ditherq + 5  * 8]
+    VBROADCASTSD vr_coff,  [pointer_c_ditherq + 4  * 8]
+%endif
+%endif
+    movu m_y, [py_2indexq + 2 * indexq]
+    movh m_u, [pu_indexq  +     indexq]
+    movh m_v, [pv_indexq  +     indexq]
+.loop0:
+    pxor m4, m4
+    mova m7, m6
+    punpcklbw m0, m4
+    punpcklbw m1, m4
+    mova m2, [pw_00ff]
+    pand m6, m2
+    psrlw m7, 8
+    psllw m0, 3
+    psllw m1, 3
+    psllw m6, 3
+    psllw m7, 3
+%if (ARCH_X86_32 && mmsize == 16)
+    VBROADCASTSD m2, mu_offset
+    VBROADCASTSD m3, mv_offset
+    VBROADCASTSD m4, my_offset
+    psubsw m0, m2 ; U = U - 128
+    psubsw m1, m3 ; V = V - 128
+    psubw  m6, m4
+    psubw  m7, m4
+    VBROADCASTSD m2, mug_coff
+    VBROADCASTSD m3, mvg_coff
+    VBROADCASTSD m4, my_coff
+    VBROADCASTSD m5, mub_coff
+    pmulhw m2, m0
+    pmulhw m3, m1
+    pmulhw m6, m4
+    pmulhw m7, m4
+    pmulhw m0, m5
+    VBROADCASTSD m4, mvr_coff
+    pmulhw m1, m4
+%else ; ARCH_X86_64 || mmsize == 8
+    psubsw m0, u_offset ; U = U - 128
+    psubsw m1, v_offset ; V = V - 128
+    psubw  m6, y_offset
+    psubw  m7, y_offset
+    mova m2, m0
+    mova m3, m1
+    pmulhw m2, ug_coff
+    pmulhw m3, vg_coff
+    pmulhw m6, y_coff
+    pmulhw m7, y_coff
+    pmulhw m0, ub_coff
+    pmulhw m1, vr_coff
+%endif
+    paddsw m2, m3
+    mova m3, m7
+    mova m5, m7
+    paddsw m3, m0 ; B1 B3 B5 B7 ...
+    paddsw m5, m1 ; R1 R3 R5 R7 ...
+    paddsw m7, m2 ; G1 G3 G4 G7 ...
+    paddsw m0, m6 ; B0 B2 B4 B6 ...
+    paddsw m1, m6 ; R0 R2 R4 R6 ...
+    paddsw m2, m6 ; G0 G2 G4 G6 ...
+
+%if %3 == 24 ; PACK RGB24
+%define depth 3
+    packuswb m0, m3 ; R0 R2 R4 R6 ... R1 R3 R5 R7 ...
+    packuswb m1, m5 ; B0 B2 B4 B6 ... B1 B3 B5 B7 ...
+    packuswb m2, m7 ; G0 G2 G4 G6 ... G1 G3 G5 G7 ...
+    mova m3, m_red
+    mova m6, m_blue
+    MOV_H2L m_red
+    punpcklbw m3, m2     ; R0 G0 R2 G2 R4 G4 R6 G6 R8 G8 ...
+    punpcklbw m6, m_red  ; B0 R1 B2 R3 B4 R5 B6 R7 B8 R9 ...
+    mova m5, m3
+    punpckhbw m2, m_blue ; G1 B1 G3 B3 G5 B5 G7 B7 G9 B9 ...
+%if  mmsize == 8
+    punpcklwd m3 ,m6     ; R0 G0 B0 R1 R2 G2 B2 R3
+    punpckhwd m5, m6     ; R4 G4 B4 R5 R6 G6 B6 R7
+%if cpuflag(mmxext)
+    pshufw m1, m2, 0xc6
+    pshufw m6, m3, 0x84
+    pshufw m7, m5, 0x38
+    pand m6, [mask_1101] ; R0 G0 B0 R1 -- -- R2 G2
+    movq m0, m1
+    pand m7, [mask_0110] ; -- -- R6 G6 B6 R7 -- --
+    movq m2, m1
+    pand m1, [mask_0100] ; -- -- G3 B3 -- -- -- --
+    psrlq m3, 48         ; B2 R3 -- -- -- -- -- --
+    pand m0, [mask_0010] ; -- -- -- -- G1 B1 -- --
+    psllq m5, 32         ; -- -- -- -- R4 G4 B4 R5
+    pand m2, [mask_1001] ; G5 B5 -- -- -- -- G7 B7
+    por m1, m3
+    por m0, m6
+    por m1, m5
+    por m2, m7
+    movntq [imageq], m0
+    movntq [imageq + 8], m1
+    movntq [imageq + 16], m2
+%else ; cpuflag(mmx)
+    movd [imageq], m3      ; R0 G0 R2 G2
+    movd [imageq + 4], m2  ; G1 B1
+    psrlq m3, 32
+    psrlq m2, 16
+    movd [imageq + 6], m3  ; R2 G2 B2 R3
+    movd [imageq + 10], m2 ; G3 B3
+    psrlq m2, 16
+    movd [imageq + 12], m5 ; R4 G4 B4 R5
+    movd [imageq + 16], m2 ; G5 B5
+    psrlq m5, 32
+    movd [imageq + 20], m2 ; -- -- G7 B7
+    movd [imageq + 18], m5 ; R6 G6 B6 R7
+%endif ; mmsize = 8
+%else ; mmsize == 16
+    pshufb m3, [rgb24_shuf1] ; r0  g0  r6  g6  r12 g12 r2  g2  r8  g8  r14 g14 r4  g4  r10 g10
+    pshufb m6, [rgb24_shuf2] ; b10 r11 b0  r1  b6  r7  b12 r13 b2  r3  b8  r9  b14 r15 b4  r5
+    pshufb m2, [rgb24_shuf3] ; g5  b5  g11 b11 g1  b1  g7  b7  g13 b13 g3  b3  g9  b9  g15 b15
+    mova   m7, [mask_dw036]
+    mova   m4, [mask_dw147]
+    mova   m5, [mask_dw25]
+    pand   m0, m7, m3      ; r0  g0  --- --- --- --- r2  g2  --- --- --- --- r4  g4  --- ---
+    pand   m1, m4, m6      ; --- --- b0  r1  --- --- --- --- b2  r3  --- --- --- --- b4  r5
+    por    m0, m1
+    pand   m1, m5, m2      ; --- --- --- --- g1  b1  --- --- --- --- g3  b3  --- --- --- ---
+    por    m0, m1          ; r0  g0  b0  r1  g1  b1  r2  g2  b2  r3  g3  b3  r4  g4  b4  r5
+    pand   m1, m7, m2      ; g5  b5  --- --- --- --- g7  b7  --- --- --- --- g9  b9  --- ---
+    pand   m7, m6          ; b10 r11 --- --- --- --- b12 r13 --- --- --- --- b14 r15 --- ---
+    pand   m6, m5          ; --- --- --- --- b6  r7  --- --- --- --- b8  r9  --- --- --- ---
+    por    m1, m6
+    pand   m6, m4, m3      ; --- --- r6  g6  --- --- --- --- r8  g8  --- --- --- --- r10 g10
+    pand   m2, m4          ; --- --- g11 b11 --- --- --- --- g13 b13 --- --- --- --- g15 b15
+    pand   m3, m5          ; --- --- --- --- r12 g12 --- --- --- --- r14 g14 --- --- --- ---
+    por    m2, m7
+    por    m1, m6          ; g5  b5  r6  g6  b6  r7  g7  b7  r8  g8  b8  r9  g9  b9  r10 g10
+    por    m2, m3          ; b10 r11 g11 b11 r12 g12 b12 r13 g13 b13 r14 g14 b14 r15 g15 b15
+    mova [imageq], m0
+    mova [imageq + 16], m1
+    mova [imageq + 32], m2
+%endif ; mmsize = 16
+%else ; PACK RGB15/16/32
+    packuswb m0, m1
+    packuswb m3, m5
+    packuswb m2, m2
+    mova m1, m0
+    packuswb m7, m7
+    punpcklbw m0, m3 ; B0 B1 B2 B3 ... B7
+    punpckhbw m1, m3 ; R0 R1 R2 R3 ... R7
+    punpcklbw m2, m7 ; G0 G1 G2 G3 ... G7
+%if %3 == 32 ; PACK RGB32
+%define depth 4
+%ifidn %1, yuv
+    pcmpeqd m3, m3 ; Set alpha empty
+%else
+    mova m3, [pa_2indexq + 2 * indexq] ; Load alpha
+%endif
+    mova m5, m_blue
+    mova m6, m_red
+    punpckhbw m5,     m_green
+    punpcklbw m_blue, m_green
+    punpckhbw m6,     m_alpha
+    punpcklbw m_red,  m_alpha
+    mova m_green, m_blue
+    mova m_alpha, m5
+    punpcklwd m_blue, m_red
+    punpckhwd m_green, m_red
+    punpcklwd m5, m6
+    punpckhwd m_alpha, m6
+    mova [imageq + 0], m_blue
+    mova [imageq + 8  * time_num], m_green
+    mova [imageq + 16 * time_num], m5
+    mova [imageq + 24 * time_num], m_alpha
+%else ; PACK RGB15/16
+%define depth 2
+%if cpuflag(ssse3)
+    %define red_dither m3
+    %define green_dither m4
+    %define blue_dither m5
+    VBROADCASTSD red_dither,   [pointer_c_ditherq + 0 * 8]
+    VBROADCASTSD green_dither, [pointer_c_ditherq + 1 * 8]
+    VBROADCASTSD blue_dither,  [pointer_c_ditherq + 2 * 8]
+%else ; cpuflag(mmx/mmxext)
+%define blue_dither  [pointer_c_ditherq + 2  * 8]
+%define green_dither [pointer_c_ditherq + 1  * 8]
+%define red_dither   [pointer_c_ditherq + 0  * 8]
+%endif
+%if %3 == 15
+%define gmask pb_03
+%define isRGB15 1
+%else
+%define gmask pb_07
+%define isRGB15 0
+%endif
+    paddusb m0, blue_dither
+    paddusb m2, green_dither
+    paddusb m1, red_dither
+    pand m0, [pb_f8]
+    pand m1, [pb_f8]
+    mova m3, m2
+    psllw m2, 3 - isRGB15
+    psrlw m3, 5 + isRGB15
+    psrlw m0, 3
+    psrlw m1, isRGB15
+    pand m2, [pb_e0]
+    pand m3, [gmask]
+    por m0, m2
+    por m1, m3
+    mova m2, m0
+    punpcklbw m0, m1
+    punpckhbw m2, m1
+    mova [imageq], m0
+    mova [imageq + 8 * time_num], m2
+%endif ; PACK RGB15/16
+%endif ; PACK RGB15/16/32
+
+movu m_y, [py_2indexq + 2 * indexq + 8 * time_num]
+movh m_v, [pv_indexq  +     indexq + 4 * time_num]
+movh m_u, [pu_indexq  +     indexq + 4 * time_num]
+add imageq, 8 * depth * time_num
+add indexq, 4 * time_num
+js .loop0
+
+REP_RET
+
+%endmacro
+
+INIT_MMX mmx
+yuv2rgb_fn yuv,  rgb, 24
+yuv2rgb_fn yuv,  bgr, 24
+yuv2rgb_fn yuv,  rgb, 32
+yuv2rgb_fn yuv,  bgr, 32
+yuv2rgb_fn yuva, rgb, 32
+yuv2rgb_fn yuva, bgr, 32
+yuv2rgb_fn yuv,  rgb, 15
+yuv2rgb_fn yuv,  rgb, 16
+
+INIT_MMX mmxext
+yuv2rgb_fn yuv, rgb, 24
+yuv2rgb_fn yuv, bgr, 24
+
+INIT_XMM ssse3
+yuv2rgb_fn yuv,  rgb, 24
+yuv2rgb_fn yuv,  bgr, 24
+yuv2rgb_fn yuv,  rgb, 32
+yuv2rgb_fn yuv,  bgr, 32
+yuv2rgb_fn yuva, rgb, 32
+yuv2rgb_fn yuva, bgr, 32
+yuv2rgb_fn yuv,  rgb, 15
+yuv2rgb_fn yuv,  rgb, 16
diff --git a/libswscale/yuv2rgb.c b/libswscale/yuv2rgb.c
index 737cbb0..5884625 100644
--- a/libswscale/yuv2rgb.c
+++ b/libswscale/yuv2rgb.c
@@ -138,10 +138,11 @@
             srcStride[2] *= 2;                                              \
         }                                                                   \
         for (y = 0; y < srcSliceH; y += 2) {                                \
+            int yd = y + srcSliceY;                                         \
             dst_type *dst_1 =                                               \
-                (dst_type *)(dst[0] + (y + srcSliceY)     * dstStride[0]);  \
+                (dst_type *)(dst[0] + (yd)     * dstStride[0]);             \
             dst_type *dst_2 =                                               \
-                (dst_type *)(dst[0] + (y + srcSliceY + 1) * dstStride[0]);  \
+                (dst_type *)(dst[0] + (yd + 1) * dstStride[0]);             \
             dst_type av_unused *r, *g, *b;                                  \
             const uint8_t *py_1 = src[0] +  y       * srcStride[0];         \
             const uint8_t *py_2 = py_1   +            srcStride[0];         \
@@ -498,8 +499,8 @@
 
 // r, g, b, dst_1, dst_2
 YUV2RGBFUNC(yuv2rgb_c_8_ordered_dither, uint8_t, 0)
-    const uint8_t *d32 = ff_dither_8x8_32[y & 7];
-    const uint8_t *d64 = ff_dither_8x8_73[y & 7];
+    const uint8_t *d32 = ff_dither_8x8_32[yd & 7];
+    const uint8_t *d64 = ff_dither_8x8_73[yd & 7];
 
 #define PUTRGB8(dst, src, i, o)                     \
     Y              = src[2 * i];                    \
@@ -528,8 +529,8 @@
     PUTRGB8(dst_1, py_1, 3, 6);
 
 ENDYUV2RGBLINE(8, 0)
-    const uint8_t *d32 = ff_dither_8x8_32[y & 7];
-    const uint8_t *d64 = ff_dither_8x8_73[y & 7];
+    const uint8_t *d32 = ff_dither_8x8_32[yd & 7];
+    const uint8_t *d64 = ff_dither_8x8_73[yd & 7];
     LOADCHROMA(0);
     PUTRGB8(dst_1, py_1, 0, 0);
     PUTRGB8(dst_2, py_2, 0, 0 + 8);
@@ -539,8 +540,8 @@
     PUTRGB8(dst_1, py_1, 1, 2);
 
 ENDYUV2RGBLINE(8, 1)
-    const uint8_t *d32 = ff_dither_8x8_32[y & 7];
-    const uint8_t *d64 = ff_dither_8x8_73[y & 7];
+    const uint8_t *d32 = ff_dither_8x8_32[yd & 7];
+    const uint8_t *d64 = ff_dither_8x8_73[yd & 7];
     LOADCHROMA(0);
     PUTRGB8(dst_1, py_1, 0, 0);
     PUTRGB8(dst_2, py_2, 0, 0 + 8);
@@ -549,8 +550,8 @@
 
 
 YUV2RGBFUNC(yuv2rgb_c_4_ordered_dither, uint8_t, 0)
-    const uint8_t * d64 = ff_dither_8x8_73[y & 7];
-    const uint8_t *d128 = ff_dither_8x8_220[y & 7];
+    const uint8_t * d64 = ff_dither_8x8_73[yd & 7];
+    const uint8_t *d128 = ff_dither_8x8_220[yd & 7];
     int acc;
 
 #define PUTRGB4D(dst, src, i, o)                    \
@@ -581,8 +582,8 @@
     PUTRGB4D(dst_1, py_1, 3, 6);
 
 ENDYUV2RGBLINE(4, 0)
-    const uint8_t * d64 = ff_dither_8x8_73[y & 7];
-    const uint8_t *d128 = ff_dither_8x8_220[y & 7];
+    const uint8_t * d64 = ff_dither_8x8_73[yd & 7];
+    const uint8_t *d128 = ff_dither_8x8_220[yd & 7];
     int acc;
     LOADCHROMA(0);
     PUTRGB4D(dst_1, py_1, 0, 0);
@@ -593,8 +594,8 @@
     PUTRGB4D(dst_1, py_1, 1, 2);
 
 ENDYUV2RGBLINE(4, 1)
-    const uint8_t * d64 = ff_dither_8x8_73[y & 7];
-    const uint8_t *d128 = ff_dither_8x8_220[y & 7];
+    const uint8_t * d64 = ff_dither_8x8_73[yd & 7];
+    const uint8_t *d128 = ff_dither_8x8_220[yd & 7];
     int acc;
     LOADCHROMA(0);
     PUTRGB4D(dst_1, py_1, 0, 0);
@@ -602,8 +603,8 @@
 ENDYUV2RGBFUNC()
 
 YUV2RGBFUNC(yuv2rgb_c_4b_ordered_dither, uint8_t, 0)
-    const uint8_t *d64  = ff_dither_8x8_73[y & 7];
-    const uint8_t *d128 = ff_dither_8x8_220[y & 7];
+    const uint8_t *d64  = ff_dither_8x8_73[yd & 7];
+    const uint8_t *d128 = ff_dither_8x8_220[yd & 7];
 
 #define PUTRGB4DB(dst, src, i, o)                   \
     Y              = src[2 * i];                    \
@@ -631,8 +632,8 @@
     PUTRGB4DB(dst_2, py_2, 3, 6 + 8);
     PUTRGB4DB(dst_1, py_1, 3, 6);
 ENDYUV2RGBLINE(8, 0)
-    const uint8_t *d64  = ff_dither_8x8_73[y & 7];
-    const uint8_t *d128 = ff_dither_8x8_220[y & 7];
+    const uint8_t *d64  = ff_dither_8x8_73[yd & 7];
+    const uint8_t *d128 = ff_dither_8x8_220[yd & 7];
     LOADCHROMA(0);
     PUTRGB4DB(dst_1, py_1, 0, 0);
     PUTRGB4DB(dst_2, py_2, 0, 0 + 8);
@@ -641,15 +642,15 @@
     PUTRGB4DB(dst_2, py_2, 1, 2 + 8);
     PUTRGB4DB(dst_1, py_1, 1, 2);
 ENDYUV2RGBLINE(8, 1)
-    const uint8_t *d64  = ff_dither_8x8_73[y & 7];
-    const uint8_t *d128 = ff_dither_8x8_220[y & 7];
+    const uint8_t *d64  = ff_dither_8x8_73[yd & 7];
+    const uint8_t *d128 = ff_dither_8x8_220[yd & 7];
     LOADCHROMA(0);
     PUTRGB4DB(dst_1, py_1, 0, 0);
     PUTRGB4DB(dst_2, py_2, 0, 0 + 8);
 ENDYUV2RGBFUNC()
 
 YUV2RGBFUNC(yuv2rgb_c_1_ordered_dither, uint8_t, 0)
-    const uint8_t *d128 = ff_dither_8x8_220[y & 7];
+    const uint8_t *d128 = ff_dither_8x8_220[yd & 7];
     char out_1 = 0, out_2 = 0;
     g = c->table_gU[128 + YUVRGB_TABLE_HEADROOM] + c->table_gV[128 + YUVRGB_TABLE_HEADROOM];
 
@@ -993,7 +994,7 @@
     default:
         if(!isPlanar(c->dstFormat) || bpp <= 24)
             av_log(c, AV_LOG_ERROR, "%ibpp not supported by yuv2rgb\n", bpp);
-        return -1;
+        return AVERROR(EINVAL);
     }
     return 0;
 }
diff --git a/tests/Makefile b/tests/Makefile
index 24680b8..ab3c235 100644
--- a/tests/Makefile
+++ b/tests/Makefile
@@ -10,7 +10,9 @@
 $(AREF): CMP=
 
 APITESTSDIR := tests/api
-OBJDIRS += tests/data tests/vsynth1 tests/data/filtergraphs $(APITESTSDIR)/
+DNNTESTSDIR := tests/dnn
+FATE_OUTDIRS = tests/data tests/data/fate tests/data/filtergraphs tests/data/lavf tests/data/lavf-fate tests/data/pixfmt tests/vsynth1 $(APITESTSDIR) $(DNNTESTSDIR)
+OUTDIRS += $(FATE_OUTDIRS)
 
 $(VREF): tests/videogen$(HOSTEXESUF) | tests/vsynth1
 	$(M)./$< 'tests/vsynth1/'
@@ -83,12 +85,27 @@
 
 PARSERDEMDEC       = $(call ALLYES, $(1)_PARSER $(2)_DEMUXER $(3)_DECODER)
 
+# Allow overriding CONFIG_LARGE_TESTS via LARGE_TESTS, if set on the
+# make command line.
+ifeq ($(LARGE_TESTS), yes)
+CONFIG_LARGE_TESTS:=yes
+!CONFIG_LARGE_TESTS:=
+else ifeq ($(LARGE_TESTS), no)
+CONFIG_LARGE_TESTS:=
+!CONFIG_LARGE_TESTS:=yes
+endif
+
 include $(SRC_PATH)/$(APITESTSDIR)/Makefile
+include $(SRC_PATH)/$(DNNTESTSDIR)/Makefile
 
 include $(SRC_PATH)/tests/fate/acodec.mak
 include $(SRC_PATH)/tests/fate/vcodec.mak
 
-include $(SRC_PATH)/tests/fate/avformat.mak
+include $(SRC_PATH)/tests/fate/lavf-audio.mak
+include $(SRC_PATH)/tests/fate/lavf-container.mak
+include $(SRC_PATH)/tests/fate/lavf-image.mak
+include $(SRC_PATH)/tests/fate/lavf-image2pipe.mak
+include $(SRC_PATH)/tests/fate/lavf-video.mak
 include $(SRC_PATH)/tests/fate/seek.mak
 
 include $(SRC_PATH)/tests/fate/aac.mak
@@ -113,6 +130,7 @@
 include $(SRC_PATH)/tests/fate/dca.mak
 include $(SRC_PATH)/tests/fate/demux.mak
 include $(SRC_PATH)/tests/fate/dfa.mak
+include $(SRC_PATH)/tests/fate/dnn.mak
 include $(SRC_PATH)/tests/fate/dnxhd.mak
 include $(SRC_PATH)/tests/fate/dpcm.mak
 include $(SRC_PATH)/tests/fate/ea.mak
@@ -131,6 +149,7 @@
 include $(SRC_PATH)/tests/fate/h264.mak
 include $(SRC_PATH)/tests/fate/hap.mak
 include $(SRC_PATH)/tests/fate/hevc.mak
+include $(SRC_PATH)/tests/fate/hlsenc.mak
 include $(SRC_PATH)/tests/fate/hw.mak
 include $(SRC_PATH)/tests/fate/id3v2.mak
 include $(SRC_PATH)/tests/fate/image.mak
@@ -156,6 +175,7 @@
 include $(SRC_PATH)/tests/fate/mxf.mak
 include $(SRC_PATH)/tests/fate/opus.mak
 include $(SRC_PATH)/tests/fate/pcm.mak
+include $(SRC_PATH)/tests/fate/pixfmt.mak
 include $(SRC_PATH)/tests/fate/pixlet.mak
 include $(SRC_PATH)/tests/fate/probe.mak
 include $(SRC_PATH)/tests/fate/prores.mak
@@ -163,9 +183,11 @@
 include $(SRC_PATH)/tests/fate/qtrle.mak
 include $(SRC_PATH)/tests/fate/real.mak
 include $(SRC_PATH)/tests/fate/screen.mak
+include $(SRC_PATH)/tests/fate/segment.mak
 include $(SRC_PATH)/tests/fate/source.mak
 include $(SRC_PATH)/tests/fate/speedhq.mak
 include $(SRC_PATH)/tests/fate/subtitles.mak
+include $(SRC_PATH)/tests/fate/truehd.mak
 include $(SRC_PATH)/tests/fate/utvideo.mak
 include $(SRC_PATH)/tests/fate/video.mak
 include $(SRC_PATH)/tests/fate/voice.mak
@@ -179,25 +201,28 @@
 FATE_FFMPEG += $(FATE_FFMPEG-yes) $(FATE_AVCONV) $(FATE_AVCONV-yes)
 FATE-$(CONFIG_FFMPEG) += $(FATE_FFMPEG)
 FATE-$(CONFIG_FFPROBE) += $(FATE_FFPROBE)
+FATE-$(call ALLYES, FFMPEG FFPROBE) += $(FATE_FFMPEG_FFPROBE)
 
 FATE_SAMPLES_AVCONV           += $(FATE_SAMPLES_AVCONV-yes)
 FATE_SAMPLES_FFMPEG           += $(FATE_SAMPLES_FFMPEG-yes)
-FATE_EXTERN-$(CONFIG_FFMPEG)  += $(FATE_SAMPLES_AVCONV) $(FATE_SAMPLES_FFMPEG) $(FATE_SAMPLES_FFPROBE) $(FATE_SAMPLES_FASTSTART)
-FATE_EXTERN += $(FATE_EXTERN-yes)
+FATE_EXTERN-$(CONFIG_FFMPEG)  += $(FATE_SAMPLES_AVCONV) $(FATE_SAMPLES_FFMPEG)
+FATE_EXTERN-$(CONFIG_FFPROBE) += $(FATE_SAMPLES_FFPROBE)
+FATE_SAMPLES_FFMPEG_FFPROBE   += $(FATE_SAMPLES_FFMPEG_FFPROBE-yes)
+FATE_EXTERN-$(call ALLYES, FFMPEG FFPROBE) += $(FATE_SAMPLES_FFMPEG_FFPROBE)
+FATE_EXTERN                   += $(FATE_EXTERN-yes) $(FATE_SAMPLES_FASTSTART)
 
 FATE += $(FATE-yes)
 
 RSYNC_OPTIONS-$(HAVE_RSYNC_CONTIMEOUT) += --contimeout=60
 RSYNC_OPTIONS = -vrltLW --timeout=60 $(RSYNC_OPTIONS-yes)
 
-$(FATE_FFMPEG) $(FATE_SAMPLES_AVCONV) $(FATE_SAMPLES_FFMPEG): ffmpeg$(PROGSSUF)$(EXESUF)
+$(FATE_FFMPEG) $(FATE_FFMPEG_FFPROBE) $(FATE_SAMPLES_AVCONV) $(FATE_SAMPLES_FFMPEG) $(FATE_SAMPLES_FFMPEG_FFPROBE): ffmpeg$(PROGSSUF)$(EXESUF)
 
-$(FATE_FFPROBE) $(FATE_SAMPLES_FFPROBE): ffprobe$(PROGSSUF)$(EXESUF)
+$(FATE_FFPROBE) $(FATE_FFMPEG_FFPROBE) $(FATE_SAMPLES_FFPROBE) $(FATE_SAMPLES_FFMPEG_FFPROBE): ffprobe$(PROGSSUF)$(EXESUF)
 
 $(FATE_SAMPLES_FASTSTART): tools/qt-faststart$(EXESUF)
 
 ifdef SAMPLES
-FATE += $(FATE_FULL) $(FATE_FULL-yes)
 FATE += $(FATE_EXTERN)
 fate-rsync:
 	rsync $(RSYNC_OPTIONS) rsync://fate-suite.ffmpeg.org/fate-suite/ $(SAMPLES)
@@ -223,7 +248,9 @@
 FATE += $(FATE_HW-yes)
 
 $(FATE) $(FATE_TESTS-no): export PROGSUF = $(PROGSSUF)
-$(FATE) $(FATE_TESTS-no): $(FATE_UTILS:%=tests/%$(HOSTEXESUF))
+$(FATE) $(FATE_TESTS-no): export EXECSUF = $(EXESUF)
+$(FATE) $(FATE_TESTS-no): export HOSTEXECSUF = $(HOSTEXESUF)
+$(FATE) $(FATE_TESTS-no): $(FATE_UTILS:%=tests/%$(HOSTEXESUF)) | $(FATE_OUTDIRS)
 	@echo "TEST    $(@:fate-%=%)"
 	$(Q)$(SRC_PATH)/tests/fate-run.sh $@ "$(TARGET_SAMPLES)" "$(TARGET_EXEC)" "$(TARGET_PATH)" '$(CMD)' '$(CMP)' '$(REF)' '$(FUZZ)' '$(THREADS)' '$(THREAD_TYPE)' '$(CPUFLAGS)' '$(CMP_SHIFT)' '$(CMP_TARGET)' '$(SIZE_TOLERANCE)' '$(CMP_UNIT)' '$(GEN)' '$(HWACCEL)' '$(REPORT)' '$(KEEP)'
 
diff --git a/tests/api/Makefile b/tests/api/Makefile
index 759dd9d..b5c4cca 100644
--- a/tests/api/Makefile
+++ b/tests/api/Makefile
@@ -1,5 +1,6 @@
 APITESTPROGS-$(call ENCDEC, FLAC, FLAC) += api-flac
 APITESTPROGS-$(call DEMDEC, H264, H264) += api-h264
+APITESTPROGS-$(call DEMDEC, H264, H264) += api-h264-slice
 APITESTPROGS-yes += api-seek
 APITESTPROGS-yes += api-codec-param
 APITESTPROGS-$(call DEMDEC, H263, H263) += api-band
diff --git a/tests/api/api-flac-test.c b/tests/api/api-flac-test.c
index 2e90812..e8e8cbf 100644
--- a/tests/api/api-flac-test.c
+++ b/tests/api/api-flac-test.c
@@ -31,7 +31,7 @@
 #include "libavutil/common.h"
 #include "libavutil/samplefmt.h"
 
-#define NUMBER_OF_FRAMES 200
+#define NUMBER_OF_AUDIO_FRAMES 200
 #define NAME_BUFF_SIZE 100
 
 /* generate i-th frame of test audio */
@@ -137,19 +137,19 @@
         return AVERROR(ENOMEM);
     }
 
-    raw_in = av_malloc(in_frame->linesize[0] * NUMBER_OF_FRAMES);
+    raw_in = av_malloc(in_frame->linesize[0] * NUMBER_OF_AUDIO_FRAMES);
     if (!raw_in) {
         av_log(NULL, AV_LOG_ERROR, "Can't allocate memory for raw_in\n");
         return AVERROR(ENOMEM);
     }
 
-    raw_out = av_malloc(in_frame->linesize[0] * NUMBER_OF_FRAMES);
+    raw_out = av_malloc(in_frame->linesize[0] * NUMBER_OF_AUDIO_FRAMES);
     if (!raw_out) {
         av_log(NULL, AV_LOG_ERROR, "Can't allocate memory for raw_out\n");
         return AVERROR(ENOMEM);
     }
 
-    for (i = 0; i < NUMBER_OF_FRAMES; i++) {
+    for (i = 0; i < NUMBER_OF_AUDIO_FRAMES; i++) {
         av_init_packet(&enc_pkt);
         enc_pkt.data = NULL;
         enc_pkt.size = 0;
@@ -209,7 +209,7 @@
         av_packet_unref(&enc_pkt);
     }
 
-    if (memcmp(raw_in, raw_out, out_frame_bytes * NUMBER_OF_FRAMES) != 0) {
+    if (memcmp(raw_in, raw_out, out_frame_bytes * NUMBER_OF_AUDIO_FRAMES) != 0) {
         av_log(NULL, AV_LOG_ERROR, "Output differs\n");
         return 1;
     }
diff --git a/tests/api/api-h264-slice-test.c b/tests/api/api-h264-slice-test.c
new file mode 100644
index 0000000..dee93b8
--- /dev/null
+++ b/tests/api/api-h264-slice-test.c
@@ -0,0 +1,238 @@
+/*
+ * Copyright (c) 2001 Fabrice Bellard
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#define MAX_SLICES 8
+
+#include "config.h"
+
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#if HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#if HAVE_IO_H
+#include <io.h>
+#endif
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+#include "libavcodec/avcodec.h"
+#include "libavutil/pixdesc.h"
+#include "libavutil/hash.h"
+#include "libavutil/bswap.h"
+
+static int header = 0;
+
+static int decode(AVCodecContext *dec_ctx, AVFrame *frame,
+           AVPacket *pkt)
+{
+    static uint64_t frame_cnt = 0;
+    int ret;
+
+    ret = avcodec_send_packet(dec_ctx, pkt);
+    if (ret < 0) {
+        fprintf(stderr, "Error sending a packet for decoding: %s\n", av_err2str(ret));
+        return ret;
+    }
+
+    while (ret >= 0) {
+        const AVPixFmtDescriptor *desc;
+        char sum[AV_HASH_MAX_SIZE * 2 + 1];
+        struct AVHashContext *hash;
+
+        ret = avcodec_receive_frame(dec_ctx, frame);
+        if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) {
+            return 0;
+        } else if (ret < 0) {
+            fprintf(stderr, "Error during decoding: %s\n", av_err2str(ret));
+            return ret;
+        }
+
+        if (!header) {
+            printf(
+            "#format: frame checksums\n"
+            "#version: 2\n"
+            "#hash: MD5\n"
+            "#tb 0: 1/30\n"
+            "#media_type 0: video\n"
+            "#codec_id 0: rawvideo\n"
+            "#dimensions 0: 352x288\n"
+            "#sar 0: 128/117\n"
+            "#stream#, dts,        pts, duration,     size, hash\n");
+            header = 1;
+        }
+        desc = av_pix_fmt_desc_get(dec_ctx->pix_fmt);
+        if ((ret = av_hash_alloc(&hash, "md5")) < 0) {
+            return ret;
+        }
+        av_hash_init(hash);
+
+        for (int i = 0; i < frame->height; i++)
+            av_hash_update(hash, &frame->data[0][i * frame->linesize[0]], frame->width);
+        for (int i = 0; i < frame->height >> desc->log2_chroma_h; i++)
+            av_hash_update(hash, &frame->data[1][i * frame->linesize[1]], frame->width >> desc->log2_chroma_w);
+        for (int i = 0; i < frame->height >> desc->log2_chroma_h; i++)
+            av_hash_update(hash, &frame->data[2][i * frame->linesize[2]], frame->width >> desc->log2_chroma_w);
+
+        av_hash_final_hex(hash, sum, av_hash_get_size(hash) * 2 + 1);
+        printf("0, %10"PRId64", %10"PRId64",        1, %8d, %s\n",
+            frame_cnt, frame_cnt,
+            (frame->width * frame->height + 2 * (frame->height >> desc->log2_chroma_h) * (frame->width >> desc->log2_chroma_w)), sum);
+        frame_cnt += 1;
+        av_hash_freep(&hash);
+    }
+    return 0;
+}
+
+int main(int argc, char **argv)
+{
+    const AVCodec *codec = NULL;
+    AVCodecContext *c = NULL;
+    AVFrame *frame = NULL;
+    unsigned int threads;
+    AVPacket *pkt;
+    FILE *file = NULL;
+    char * nal = NULL;
+    int nals = 0, ret = 0;
+    char *p;
+
+    if (argc < 3) {
+        fprintf(stderr, "Usage: %s <threads> <input file>\n", argv[0]);
+        return -1;
+    }
+
+    if (!(threads = strtoul(argv[1], NULL, 0)))
+        threads = 1;
+    else if (threads > MAX_SLICES)
+        threads = MAX_SLICES;
+
+#ifdef _WIN32
+    setmode(fileno(stdout), O_BINARY);
+#endif
+
+    if (!(pkt = av_packet_alloc())) {
+        return -1;
+    }
+
+    nal = av_malloc(MAX_SLICES * UINT16_MAX + AV_INPUT_BUFFER_PADDING_SIZE);
+    if (!nal)
+        goto err;
+    p = nal;
+
+    if (!(codec = avcodec_find_decoder(AV_CODEC_ID_H264))) {
+        fprintf(stderr, "Codec not found\n");
+        ret = -1;
+        goto err;
+    }
+
+    if (!(c = avcodec_alloc_context3(codec))) {
+        fprintf(stderr, "Could not allocate video codec context\n");
+        ret = -1;
+        goto err;
+    }
+
+    c->width  = 352;
+    c->height = 288;
+
+    c->flags2 |= AV_CODEC_FLAG2_CHUNKS;
+    c->thread_type = FF_THREAD_SLICE;
+    c->thread_count = threads;
+
+    if ((ret = avcodec_open2(c, codec, NULL)) < 0) {
+        fprintf(stderr, "Could not open codec\n");
+        goto err;
+    }
+
+#if HAVE_THREADS
+    if (c->active_thread_type != FF_THREAD_SLICE) {
+        fprintf(stderr, "Couldn't activate slice threading: %d\n", c->active_thread_type);
+        ret = -1;
+        goto err;
+    }
+#else
+    fprintf(stderr, "WARN: not using threads, only checking decoding slice NALUs\n");
+#endif
+
+    if (!(frame = av_frame_alloc())) {
+        fprintf(stderr, "Could not allocate video frame\n");
+        ret = -1;
+        goto err;
+    }
+
+    if (!(file = fopen(argv[2], "rb"))) {
+        fprintf(stderr, "Couldn't open NALU file: %s\n", argv[2]);
+        ret = -1;
+        goto err;
+    }
+
+    while(1) {
+        uint16_t size = 0;
+        size_t ret = fread(&size, 1, sizeof(uint16_t), file);
+        if (ret != sizeof(uint16_t))
+            break;
+
+        size = av_be2ne16(size);
+        ret = fread(p, 1, size, file);
+        if (ret != size) {
+            perror("Couldn't read data");
+            goto err;
+        }
+        p += ret;
+
+        if (++nals >= threads) {
+            int decret = 0;
+            pkt->data = nal;
+            pkt->size = p - nal;
+            if ((decret = decode(c, frame, pkt)) < 0) {
+                goto err;
+            }
+            memset(nal, 0, MAX_SLICES * UINT16_MAX + AV_INPUT_BUFFER_PADDING_SIZE);
+            nals = 0;
+            p = nal;
+        }
+    }
+
+    if (nals) {
+        pkt->data = nal;
+        pkt->size = p - nal;
+        if ((ret = decode(c, frame, pkt)) < 0) {
+            goto err;
+        }
+    }
+
+    ret = decode(c, frame, NULL);
+
+err:
+    if (nal)
+        av_free(nal);
+    if (file)
+        fclose(file);
+    av_frame_free(&frame);
+    avcodec_free_context(&c);
+    av_packet_free(&pkt);
+
+    return ret;
+}
diff --git a/tests/api/api-h264-test.c b/tests/api/api-h264-test.c
index 66669fa..60a3ae5 100644
--- a/tests/api/api-h264-test.c
+++ b/tests/api/api-h264-test.c
@@ -28,6 +28,7 @@
 #include "libavcodec/avcodec.h"
 #include "libavformat/avformat.h"
 #include "libavutil/imgutils.h"
+#include "libavutil/timestamp.h"
 
 static int video_decode_example(const char *input_filename)
 {
@@ -131,9 +132,9 @@
                     av_log(NULL, AV_LOG_ERROR, "Can't copy image to buffer\n");
                     return number_of_written_bytes;
                 }
-                printf("%d, %10"PRId64", %10"PRId64", %8"PRId64", %8d, 0x%08lx\n", video_stream,
-                        fr->pts, fr->pkt_dts, fr->pkt_duration,
-                        number_of_written_bytes, av_adler32_update(0, (const uint8_t*)byte_buffer, number_of_written_bytes));
+                printf("%d, %s, %s, %8"PRId64", %8d, 0x%08lx\n", video_stream,
+                       av_ts2str(fr->pts), av_ts2str(fr->pkt_dts), fr->pkt_duration,
+                       number_of_written_bytes, av_adler32_update(0, (const uint8_t*)byte_buffer, number_of_written_bytes));
             }
             av_packet_unref(&pkt);
             av_init_packet(&pkt);
diff --git a/tests/checkasm/Makefile b/tests/checkasm/Makefile
index 9484acb..de850c0 100644
--- a/tests/checkasm/Makefile
+++ b/tests/checkasm/Makefile
@@ -22,17 +22,22 @@
 AVCODECOBJS-$(CONFIG_EXR_DECODER)       += exrdsp.o
 AVCODECOBJS-$(CONFIG_HUFFYUV_DECODER)   += huffyuvdsp.o
 AVCODECOBJS-$(CONFIG_JPEG2000_DECODER)  += jpeg2000dsp.o
+AVCODECOBJS-$(CONFIG_OPUS_DECODER)      += opusdsp.o
 AVCODECOBJS-$(CONFIG_PIXBLOCKDSP)       += pixblockdsp.o
 AVCODECOBJS-$(CONFIG_HEVC_DECODER)      += hevc_add_res.o hevc_idct.o hevc_sao.o
 AVCODECOBJS-$(CONFIG_UTVIDEO_DECODER)   += utvideodsp.o
+AVCODECOBJS-$(CONFIG_V210_DECODER)      += v210dec.o
 AVCODECOBJS-$(CONFIG_V210_ENCODER)      += v210enc.o
 AVCODECOBJS-$(CONFIG_VP9_DECODER)       += vp9dsp.o
 
 CHECKASMOBJS-$(CONFIG_AVCODEC)          += $(AVCODECOBJS-yes)
 
 # libavfilter tests
+AVFILTEROBJS-$(CONFIG_AFIR_FILTER) += af_afir.o
 AVFILTEROBJS-$(CONFIG_BLEND_FILTER) += vf_blend.o
 AVFILTEROBJS-$(CONFIG_COLORSPACE_FILTER) += vf_colorspace.o
+AVFILTEROBJS-$(CONFIG_EQ_FILTER)         += vf_eq.o
+AVFILTEROBJS-$(CONFIG_GBLUR_FILTER)      += vf_gblur.o
 AVFILTEROBJS-$(CONFIG_HFLIP_FILTER)      += vf_hflip.o
 AVFILTEROBJS-$(CONFIG_THRESHOLD_FILTER)  += vf_threshold.o
 AVFILTEROBJS-$(CONFIG_NLMEANS_FILTER)    += vf_nlmeans.o
@@ -61,7 +66,7 @@
 
 CHECKASMDIRS := $(sort $(dir $(CHECKASMOBJS)))
 $(CHECKASMOBJS): | $(CHECKASMDIRS)
-OBJDIRS += $(CHECKASMDIRS)
+OUTDIRS += $(CHECKASMDIRS)
 
 tests/checkasm/checkasm.o: CFLAGS += -Umain
 
diff --git a/tests/checkasm/af_afir.c b/tests/checkasm/af_afir.c
new file mode 100644
index 0000000..8d1f815
--- /dev/null
+++ b/tests/checkasm/af_afir.c
@@ -0,0 +1,95 @@
+/*
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU 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 "config.h"
+
+#include <float.h>
+#include <stdint.h>
+
+#include "libavfilter/af_afir.h"
+#include "libavutil/internal.h"
+#include "checkasm.h"
+
+#define LEN 256
+
+#define randomize_buffer(buf)                 \
+do {                                          \
+    int i;                                    \
+    double bmg[2], stddev = 10.0, mean = 0.0; \
+                                              \
+    for (i = 0; i < LEN*2+8; i += 2) {        \
+        av_bmg_get(&checkasm_lfg, bmg);       \
+        buf[i]     = bmg[0] * stddev + mean;  \
+        buf[i + 1] = bmg[1] * stddev + mean;  \
+    }                                         \
+} while(0);
+
+static void test_fcmul_add(const float *src0, const float *src1, const float *src2)
+{
+    LOCAL_ALIGNED_32(float, cdst, [LEN*2+8]);
+    LOCAL_ALIGNED_32(float, odst, [LEN*2+8]);
+    int i;
+
+    declare_func(void, float *sum, const float *t, const float *c,
+                 ptrdiff_t len);
+
+    memcpy(cdst, src0, (LEN*2+8) * sizeof(float));
+    memcpy(odst, src0, (LEN*2+8) * sizeof(float));
+    call_ref(cdst, src1, src2, LEN);
+    call_new(odst, src1, src2, LEN);
+    for (i = 0; i <= LEN*2; i++) {
+        int idx = i & ~1;
+        float cre = src2[idx];
+        float cim = src2[idx + 1];
+        float tre = src1[idx];
+        float tim = src1[idx + 1];
+        double t = fabs(src0[i]) +
+                   fabs(tre) + fabs(tim) + fabs(cre) + fabs(cim) +
+                   fabs(tre * cre) + fabs(tim * cim) +
+                   fabs(tre * cim) + fabs(tim * cre) +
+                   fabs(tre * cre - tim * cim) +
+                   fabs(tre * cim + tim * cre) +
+                   fabs(cdst[i]) + 1.0;
+        if (!float_near_abs_eps(cdst[i], odst[i], t * 2 * FLT_EPSILON)) {
+            fprintf(stderr, "%d: %- .12f - %- .12f = % .12g\n",
+                    i, cdst[i], odst[i], cdst[i] - odst[i]);
+            fail();
+            break;
+        }
+    }
+    memcpy(odst, src0, (LEN*2+8) * sizeof(float));
+    bench_new(odst, src1, src2, LEN);
+}
+
+void checkasm_check_afir(void)
+{
+    LOCAL_ALIGNED_32(float, src0, [LEN*2+8]);
+    LOCAL_ALIGNED_32(float, src1, [LEN*2+8]);
+    LOCAL_ALIGNED_32(float, src2, [LEN*2+8]);
+    AudioFIRDSPContext fir = { 0 };
+
+    ff_afir_init(&fir);
+
+    randomize_buffer(src0);
+    randomize_buffer(src1);
+    randomize_buffer(src2);
+
+    if (check_func(fir.fcmul_add, "fcmul_add"))
+        test_fcmul_add(src0, src1, src2);
+    report("fcmul_add");
+}
diff --git a/tests/checkasm/opusdsp.c b/tests/checkasm/opusdsp.c
new file mode 100644
index 0000000..828ecf9
--- /dev/null
+++ b/tests/checkasm/opusdsp.c
@@ -0,0 +1,103 @@
+/*
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU 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 "libavcodec/opusdsp.h"
+
+#include "checkasm.h"
+
+#define randomize_float(buf, len)                               \
+    do {                                                        \
+        for (int i = 0; i < len; i++) {                         \
+            float f = (float)rnd() / (UINT_MAX >> 5) - 16.0f;   \
+            buf[i] = f;                                         \
+        }                                                       \
+    } while (0)
+
+#define EPS 0.005
+#define MAX_SIZE (960)
+
+/* period is between 15 and 1022, inclusive */
+static void test_postfilter(int period)
+{
+    LOCAL_ALIGNED(16, float, data0, [MAX_SIZE + 1024]);
+    LOCAL_ALIGNED(16, float, data1, [MAX_SIZE + 1024]);
+
+    /* This filter can explode very easily, so use a tapset from the codec.
+     * In the codec these are usually multiplied by at least 0.09375f,
+     * so its outside the largest filter value, but the filter is still stable
+     * so use it. */
+    float gains[3] = { 0.3066406250f, 0.2170410156f, 0.1296386719f };
+
+    /* The codec will always call with an offset which is aligned once
+     * (period + 2) is subtracted, but here we have to align it outselves. */
+    int offset = FFALIGN(period + 2, 4);
+
+    declare_func(void, float *data, int period, float *gains, int len);
+
+    randomize_float(data0, MAX_SIZE + 1024);
+    memcpy(data1, data0, (MAX_SIZE + 1024)*sizeof(float));
+
+    call_ref(data0 + offset, period, gains, MAX_SIZE);
+    call_new(data1 + offset, period, gains, MAX_SIZE);
+
+    if (!float_near_abs_eps_array(data0 + offset, data1 + offset, EPS, MAX_SIZE))
+        fail();
+    bench_new(data1 + offset, period, gains, MAX_SIZE);
+}
+
+static void test_deemphasis(void)
+{
+    LOCAL_ALIGNED(16, float, src, [FFALIGN(MAX_SIZE, 4)]);
+    LOCAL_ALIGNED(16, float, dst0, [FFALIGN(MAX_SIZE, 4)]);
+    LOCAL_ALIGNED(16, float, dst1, [FFALIGN(MAX_SIZE, 4)]);
+    float coeff0 = (float)rnd() / (UINT_MAX >> 5) - 16.0f, coeff1 = coeff0;
+
+    declare_func_float(float, float *out, float *in, float coeff, int len);
+
+    randomize_float(src, MAX_SIZE);
+
+    coeff0 = call_ref(dst0, src, coeff0, MAX_SIZE);
+    coeff1 = call_new(dst1, src, coeff1, MAX_SIZE);
+
+    if (!float_near_abs_eps(coeff0, coeff1, EPS) ||
+        !float_near_abs_eps_array(dst0, dst1, EPS, MAX_SIZE))
+        fail();
+    bench_new(dst1, src, coeff1, MAX_SIZE);
+}
+
+void checkasm_check_opusdsp(void)
+{
+    OpusDSP ctx;
+    ff_opus_dsp_init(&ctx);
+
+    if (check_func(ctx.postfilter, "postfilter_15"))
+        test_postfilter(15);
+    report("postfilter_15");
+
+    if (check_func(ctx.postfilter, "postfilter_512"))
+        test_postfilter(512);
+    report("postfilter_512");
+
+    if (check_func(ctx.postfilter, "postfilter_1022"))
+        test_postfilter(1022);
+    report("postfilter_1022");
+
+    if (check_func(ctx.deemphasis, "deemphasis"))
+        test_deemphasis();
+    report("deemphasis");
+}
diff --git a/tests/checkasm/v210dec.c b/tests/checkasm/v210dec.c
new file mode 100644
index 0000000..7dd50a8
--- /dev/null
+++ b/tests/checkasm/v210dec.c
@@ -0,0 +1,77 @@
+/*
+ * Copyright (c) 2019 James Darnley
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU 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 <string.h>
+#include "checkasm.h"
+#include "libavcodec/v210dec.h"
+
+static uint32_t get_v210(void)
+{
+    uint32_t t0 = rnd() & 0x3ff,
+             t1 = rnd() & 0x3ff,
+             t2 = rnd() & 0x3ff;
+    uint32_t value =  t0
+                   | (t1 << 10)
+                   | (t2 << 20);
+    return value;
+}
+
+#define NUM_SAMPLES 2048
+
+static void randomize_buffers(uint32_t *src0, uint32_t *src1, int len)
+{
+    for (int i = 0; i < len; i++) {
+        uint32_t value = get_v210();
+        src0[i] = value;
+        src1[i] = value;
+    }
+}
+
+void checkasm_check_v210dec(void)
+{
+    V210DecContext h;
+
+    h.aligned_input = 0;
+    ff_v210dec_init(&h);
+
+    if (check_func(h.unpack_frame, "v210_unpack")) {
+        uint32_t src0[NUM_SAMPLES/3];
+        uint32_t src1[NUM_SAMPLES/3];
+        uint16_t y0[NUM_SAMPLES/2];
+        uint16_t y1[NUM_SAMPLES/2];
+        uint16_t u0[NUM_SAMPLES/4];
+        uint16_t u1[NUM_SAMPLES/4];
+        uint16_t v0[NUM_SAMPLES/4];
+        uint16_t v1[NUM_SAMPLES/4];
+        declare_func(void, const uint32_t *src, uint16_t *y, uint16_t *u, uint16_t *v, int width);
+        const int pixels = NUM_SAMPLES / 2 / 6 * 6;
+
+        randomize_buffers(src0, src1, NUM_SAMPLES/3);
+        call_ref(src0, y0, u0, v0, pixels);
+        call_new(src1, y1, u1, v1, pixels);
+        if (memcmp(src0, src1, NUM_SAMPLES/3 * sizeof src0[0])
+                || memcmp(y0, y1, pixels * sizeof y0[0])
+                || memcmp(u0, u1, pixels/2 * sizeof u0[0])
+                || memcmp(v0, v1, pixels/2 * sizeof v0[0]))
+            fail();
+        bench_new(src1, y1, u1, v1, pixels);
+    }
+    report("v210_unpack");
+}
diff --git a/tests/checkasm/vf_eq.c b/tests/checkasm/vf_eq.c
new file mode 100644
index 0000000..48dccdd
--- /dev/null
+++ b/tests/checkasm/vf_eq.c
@@ -0,0 +1,79 @@
+/*
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU 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 <string.h>
+#include "checkasm.h"
+#include "libavfilter/avfilter.h"
+#include "libavfilter/vf_eq.h"
+#include "libavutil/intreadwrite.h"
+
+#define WIDTH 256
+#define HEIGHT 256
+#define SRC_STRIDE 256
+#define PIXELS (WIDTH * HEIGHT)
+#define RANDOM_RANGE 80000
+#define SCALE 10000
+
+#define randomize_buffers(buf, size)      \
+    do {                                  \
+        int j;                            \
+        uint8_t *tmp_buf = (uint8_t *)buf;\
+        for (j = 0; j< size; j++)         \
+            tmp_buf[j] = rnd() & 0xFF;    \
+    } while (0)
+
+static void check_eq(void)
+{
+    LOCAL_ALIGNED_32(uint8_t, src,     [PIXELS]);
+    LOCAL_ALIGNED_32(uint8_t, dst_ref, [PIXELS]);
+    LOCAL_ALIGNED_32(uint8_t, dst_new, [PIXELS]);
+    int w = WIDTH;
+    int h = HEIGHT;
+    int src_stride = SRC_STRIDE;
+    int dst_stride = SRC_STRIDE;
+    EQParameters pa;
+    EQContext eq;
+    declare_func(void, EQParameters *param, uint8_t *dst, int dst_stride,
+                 const uint8_t *src, int src_stride, int w, int h);
+
+    double rand_contrast = (int)(rnd() % (RANDOM_RANGE * 2) - RANDOM_RANGE) /
+                           (SCALE * 1.0);
+    double rand_brightness = (int)(rnd() % (SCALE * 2) - SCALE) /
+                             (SCALE * 1.0);
+    pa.contrast = rand_contrast;
+    pa.brightness = rand_brightness;
+
+    memset(dst_ref, 0, PIXELS);
+    memset(dst_new, 0, PIXELS);
+    randomize_buffers(src, PIXELS);
+    ff_eq_init(&eq);
+
+    if (check_func(eq.process, "process")) {
+        call_ref(&pa, dst_ref, dst_stride, src, src_stride, w, h);
+        call_new(&pa, dst_new, dst_stride, src, src_stride, w, h);
+        if (memcmp(dst_ref, dst_new, PIXELS))
+            fail();
+        bench_new(&pa, dst_new, dst_stride, src, src_stride, w, h);
+    }
+}
+
+void checkasm_check_vf_eq(void)
+{
+    check_eq();
+    report("eq");
+}
diff --git a/tests/checkasm/vf_gblur.c b/tests/checkasm/vf_gblur.c
new file mode 100644
index 0000000..1d63fc2
--- /dev/null
+++ b/tests/checkasm/vf_gblur.c
@@ -0,0 +1,66 @@
+/*
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU 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 <string.h>
+#include "checkasm.h"
+#include "libavfilter/gblur.h"
+
+#define WIDTH 256
+#define HEIGHT 256
+#define PIXELS (WIDTH * HEIGHT)
+#define BUF_SIZE (PIXELS * 4)
+
+#define randomize_buffers(buf, size)             \
+    do {                                         \
+        int j;                                   \
+        float *tmp_buf = (float *)buf;           \
+        for (j = 0; j < size; j++)               \
+            tmp_buf[j] = (float)(rnd() & 0xFF); \
+    } while (0)
+
+void checkasm_check_vf_gblur(void)
+{
+    float *dst_ref = av_malloc(BUF_SIZE);
+    float *dst_new = av_malloc(BUF_SIZE);
+    int w = WIDTH;
+    int h = HEIGHT;
+    int steps = 2;
+    float nu = 0.101f;
+    float bscale = 1.112f;
+    GBlurContext s;
+
+    declare_func(void, float *dst, int w, int h, int steps, float nu, float bscale);
+
+    randomize_buffers(dst_ref, PIXELS);
+    memcpy(dst_new, dst_ref, BUF_SIZE);
+
+    ff_gblur_init(&s);
+
+    if (check_func(s.horiz_slice, "horiz_slice")) {
+        call_ref(dst_ref, w, h, steps, nu, bscale);
+        call_new(dst_new, w, h, steps, nu, bscale);
+
+        if (!float_near_abs_eps_array(dst_ref, dst_new, 0.01f, PIXELS)) {
+            fail();
+        }
+        bench_new(dst_new, w, h, 1, nu, bscale);
+    }
+    report("horiz_slice");
+    av_freep(&dst_ref);
+    av_freep(&dst_new);
+}
diff --git a/tests/dnn/.gitignore b/tests/dnn/.gitignore
new file mode 100644
index 0000000..d78c5c1
--- /dev/null
+++ b/tests/dnn/.gitignore
@@ -0,0 +1,5 @@
+/dnn-layer-conv2d-test
+/dnn-layer-depth2space-test
+/dnn-layer-maximum-test
+/dnn-layer-pad-test
+/dnn-layer-mathbinary-test
diff --git a/tests/dnn/Makefile b/tests/dnn/Makefile
new file mode 100644
index 0000000..1f96710
--- /dev/null
+++ b/tests/dnn/Makefile
@@ -0,0 +1,15 @@
+DNNTESTPROGS += dnn-layer-pad
+DNNTESTPROGS += dnn-layer-conv2d
+DNNTESTPROGS += dnn-layer-depth2space
+DNNTESTPROGS += dnn-layer-mathbinary
+DNNTESTPROGS += dnn-layer-maximum
+
+DNNTESTOBJS  := $(DNNTESTOBJS:%=$(DNNTESTSDIR)%) $(DNNTESTPROGS:%=$(DNNTESTSDIR)/%-test.o)
+DNNTESTPROGS := $(DNNTESTPROGS:%=$(DNNTESTSDIR)/%-test$(EXESUF))
+-include $(wildcard $(DNNTESTOBJS:.o=.d))
+
+$(DNNTESTPROGS): %$(EXESUF): %.o $(FF_STATIC_DEP_LIBS)
+	$(LD) $(LDFLAGS) $(LDEXEFLAGS) $(LD_O) $(filter %.o,$^) $(FF_STATIC_DEP_LIBS) $(EXTRALIBS-avcodec) $(EXTRALIBS-avfilter) $(EXTRALIBS-avformat) $(EXTRALIBS-avutil) $(EXTRALIBS-swresample) $(EXTRALIBS)
+
+testclean::
+	$(RM) $(addprefix $(DNNTESTSDIR)/,$(CLEANSUFFIXES) *-test$(EXESUF))
diff --git a/tests/dnn/dnn-layer-conv2d-test.c b/tests/dnn/dnn-layer-conv2d-test.c
new file mode 100644
index 0000000..2da01e5
--- /dev/null
+++ b/tests/dnn/dnn-layer-conv2d-test.c
@@ -0,0 +1,240 @@
+/*
+ * Copyright (c) 2019 Guo Yejun
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <math.h>
+#include "libavfilter/dnn/dnn_backend_native_layer_conv2d.h"
+
+#define EPSON 0.00001
+
+static int test_with_same_dilate(void)
+{
+    // the input data and expected data are generated with below python code.
+    /*
+    x = tf.placeholder(tf.float32, shape=[1, None, None, 3])
+    y = tf.layers.conv2d(x, 2, 3, activation=tf.nn.tanh, padding='same', dilation_rate=(2, 2), bias_initializer=tf.keras.initializers.he_normal())
+    data = np.random.rand(1, 5, 6, 3);
+
+    sess=tf.Session()
+    sess.run(tf.global_variables_initializer())
+
+    weights = dict([(var.name, sess.run(var)) for var in tf.trainable_variables()])
+    kernel = weights['conv2d/kernel:0']
+    kernel = np.transpose(kernel, [3, 0, 1, 2])
+    print("kernel:")
+    print(kernel.shape)
+    print(list(kernel.flatten()))
+
+    bias = weights['conv2d/bias:0']
+    print("bias:")
+    print(bias.shape)
+    print(list(bias.flatten()))
+
+    output = sess.run(y, feed_dict={x: data})
+
+    print("input:")
+    print(data.shape)
+    print(list(data.flatten()))
+
+    print("output:")
+    print(output.shape)
+    print(list(output.flatten()))
+    */
+
+    ConvolutionalParams params;
+    DnnOperand operands[2];
+    int32_t input_indexes[1];
+    float input[1*5*6*3] = {
+        0.7012556460308194, 0.4233847954643357, 0.19515900664313612, 0.16343083004926495, 0.5758261611052848, 0.9510767434014871, 0.11014085055947687,
+        0.906327053637727, 0.8136794715542507, 0.45371764543639526, 0.5768443343523952, 0.19543668786046986, 0.15648326047898609, 0.2099500241141279,
+        0.17658777090552413, 0.059335724777169196, 0.1729991838469117, 0.8150514704819208, 0.4435535466703049, 0.3752188477566878, 0.749936650421431,
+        0.6823494635284907, 0.10776389679424747, 0.34247481674596836, 0.5147867256244629, 0.9063709728129032, 0.12423605800856818, 0.6064872945412728,
+        0.5891681538551459, 0.9865836236466314, 0.9002163879294677, 0.003968273184274618, 0.8628374809643967, 0.1327176268279583, 0.8449799925703798,
+        0.1937671869354366, 0.41524410152707425, 0.02038786604756837, 0.49792466069597496, 0.8881874553848784, 0.9683921035597336, 0.4122972568010813,
+        0.843553550993252, 0.9588482762501964, 0.5190350762645546, 0.4283584264145317, 0.09781496073714646, 0.9501058833776156, 0.8665541760152776,
+        0.31669272550095806, 0.07133074675453632, 0.606438007334886, 0.7007157020538224, 0.4827996264130444, 0.5167615606392761, 0.6385043039312651,
+        0.23069664707810555, 0.058233497329354456, 0.06323892961591071, 0.24816458893245974, 0.8646369065257812, 0.24742185893094837, 0.09991225948167437,
+        0.625700606979606, 0.7678541502111257, 0.6215834594679912, 0.5623003956582483, 0.07389123942681242, 0.7659100715711249, 0.486061471642225,
+        0.9947455699829012, 0.9094911797643259, 0.7644355876253265, 0.05384315321492239, 0.13565394382783613, 0.9810628204953316, 0.007386389078887889,
+        0.226182754156241, 0.2609021390764772, 0.24182802076928933, 0.13264782451941648, 0.2035816485767682, 0.005504188177612557, 0.7014619934040155,
+        0.956215988391991, 0.5670398541013633, 0.9809764721750784, 0.6886338100487461, 0.5758152317218274, 0.7137823176776179
+    };
+    float expected_output[1*5*6*2] = {
+        -0.9480655, -0.7169147, -0.9404794, -0.5567385, -0.8991124, -0.8306558, -0.94487447, -0.8932543, -0.88238764, -0.7301602,
+        -0.8974813, -0.7026703, -0.8858988, -0.53203243, -0.92881465, -0.5648504, -0.8871471, -0.7000097, -0.91754407, -0.79684794,
+        -0.760465, -0.117928326, -0.88302773, -0.8975289, -0.70615053, 0.19231977, -0.8318776, -0.386184, -0.80698484, -0.8556624,
+        -0.7336671, -0.6168619, -0.7658234, -0.63449603, -0.73314047, -0.87502456, -0.58158904, -0.4184259, -0.52618927, -0.13613208,
+        -0.5093187, -0.21027721, -0.39455596, -0.44507834, -0.22269244, -0.73400885, -0.77655095, -0.74408925, -0.57313335, -0.15333457,
+        -0.74620694, -0.34858236, -0.42586932, -0.5240488, 0.1634339, -0.2447881, -0.57927346, -0.62732303, -0.82287043, -0.8474058
+    };
+    float *output;
+    float kernel[2*3*3*3] = {
+        0.26025516, 0.16536498, -0.24351254, 0.33892477, -0.34005195, 0.35202783, 0.34056443, 0.01422739, 0.13799345, 0.29489166,
+        0.2781723, 0.178585, 0.22122234, 0.044115514, 0.13134438, 0.31705368, 0.22527462, -0.021323413, 0.115134746, -0.18216397,
+        -0.21197563, -0.027848959, -0.01704529, -0.12401503, -0.23415318, -0.12661739, -0.35338148, 0.20049328, -0.076153606,
+        -0.23642601, -0.3125769, -0.025851756, -0.30006272, 0.050762743, 0.32003498, 0.3052225, -0.0017385483, 0.25337684, -0.25664508,
+        0.27846587, -0.3112659, 0.2066065, 0.31499845, 0.113178134, 0.09449363, -0.11828774, -0.12671001, -0.36259216, 0.2710235,
+        -0.19676702, 0.023612618, -0.2596915, -0.34949252, -0.108270735
+    };
+    float bias[2] = { -1.6574852, -0.72915393 };
+
+    params.activation = TANH;
+    params.has_bias = 1;
+    params.biases = bias;
+    params.dilation = 2;
+    params.input_num = 3;
+    params.kernel = kernel;
+    params.kernel_size = 3;
+    params.output_num = 2;
+    params.padding_method = SAME;
+
+    operands[0].data = input;
+    operands[0].dims[0] = 1;
+    operands[0].dims[1] = 5;
+    operands[0].dims[2] = 6;
+    operands[0].dims[3] = 3;
+    operands[1].data = NULL;
+
+    input_indexes[0] = 0;
+    dnn_execute_layer_conv2d(operands, input_indexes, 1, &params);
+
+    output = operands[1].data;
+    for (int i = 0; i < sizeof(expected_output) / sizeof(float); i++) {
+        if (fabs(output[i] - expected_output[i]) > EPSON) {
+            printf("at index %d, output: %f, expected_output: %f\n", i, output[i], expected_output[i]);
+            av_freep(&output);
+            return 1;
+        }
+    }
+
+    av_freep(&output);
+    return 0;
+}
+
+static int test_with_valid(void)
+{
+    // the input data and expected data are generated with below python code.
+    /*
+    x = tf.placeholder(tf.float32, shape=[1, None, None, 3])
+    y = tf.layers.conv2d(x, 2, 3, activation=tf.nn.tanh, padding='valid', bias_initializer=tf.keras.initializers.he_normal())
+    data = np.random.rand(1, 5, 6, 3);
+
+    sess=tf.Session()
+    sess.run(tf.global_variables_initializer())
+
+    weights = dict([(var.name, sess.run(var)) for var in tf.trainable_variables()])
+    kernel = weights['conv2d/kernel:0']
+    kernel = np.transpose(kernel, [3, 0, 1, 2])
+    print("kernel:")
+    print(kernel.shape)
+    print(list(kernel.flatten()))
+
+    bias = weights['conv2d/bias:0']
+    print("bias:")
+    print(bias.shape)
+    print(list(bias.flatten()))
+
+    output = sess.run(y, feed_dict={x: data})
+
+    print("input:")
+    print(data.shape)
+    print(list(data.flatten()))
+
+    print("output:")
+    print(output.shape)
+    print(list(output.flatten()))
+    */
+
+    ConvolutionalParams params;
+    DnnOperand operands[2];
+    int32_t input_indexes[1];
+    float input[1*5*6*3] = {
+        0.26126657468269665, 0.42762216215337556, 0.7466274030131497, 0.802550266787863, 0.3709323443076644, 0.5919817068197668, 0.49274512279324967,
+        0.7170132295090351, 0.0911793215410649, 0.5134213878288361, 0.670132600785118, 0.49417034512633484, 0.03887389460089885, 0.436785102836845,
+        0.1490231658611978, 0.6413606121498127, 0.8595987991375995, 0.9132593077586231, 0.7075959004873255, 0.17754995944845464, 0.5212507214937141,
+        0.35379732738215475, 0.25205107358505296, 0.3928792840544273, 0.09485294189485782, 0.8685115437448666, 0.6489046799288605, 0.509253797582924,
+        0.8993255536791972, 0.18740056466602373, 0.34237617336313986, 0.3871438962989183, 0.1488532571774911, 0.5187002331293636, 0.8137098818752955,
+        0.521761863717401, 0.4622312310118274, 0.29038411334638825, 0.16194915718170566, 0.5175999923925211, 0.8852230040101133, 0.0218263385047206,
+        0.08482355352852367, 0.3463638568376264, 0.28627127120619733, 0.9553293378948409, 0.4803391055970835, 0.841635695030805, 0.3556828280031952,
+        0.06778527221541808, 0.28193560357091596, 0.8399957619031576, 0.03305536359456385, 0.6625039162109645, 0.9300552020023897, 0.8551529138204146,
+        0.6133216915522418, 0.222427800857393, 0.1315422686800336, 0.6189144989185527, 0.5346184916866876, 0.8348888624532548, 0.6544834567840291,
+        0.2844062293389934, 0.28780026600883324, 0.5372272015684924, 0.6250226011503823, 0.28119106062279453, 0.49655812908420094, 0.6451488959145951,
+        0.7362580606834843, 0.44815578616664087, 0.6454760235835586, 0.6794062414265861, 0.045378883014935756, 0.9008388543865096, 0.7949752851269782,
+        0.4179928876222264, 0.28733419007048644, 0.996902319501908, 0.5690851338677467, 0.9511814013279738, 0.025323788678181636, 0.5594359732604794,
+        0.1213732595086251, 0.7172624313368294, 0.6759328959074691, 0.07252138454885071, 0.17557735158403442, 0.5988895455048769
+    };
+    float expected_output[1*3*4*2] = {
+        -0.556947, -0.42143887, -0.092070885, 0.27404794, -0.41886684, 0.0862887, -0.25001016, -0.342721, 0.020730592, 0.04016919, -0.69839877,
+        -0.06136704, 0.14186388, -0.11655602, -0.23489095, -0.3845829, -0.19017771, 0.1595885, -0.18308741, -0.3071209, -0.5848686, -0.22509028,
+        -0.6023201, -0.14448485
+    };
+    float *output;
+    float kernel[2*3*3*3] = {
+        -0.25291282, 0.22402048, 0.028642118, -0.14615723, -0.27362752, -0.34801802, -0.2759148, 0.19594926, -0.25029412, 0.34606284, 0.10376671,
+        -0.1015394, 0.23616093, 0.2134214, 0.35285157, 0.05893758, 0.0024731457, -0.17143056, 0.35758412, 0.2186206, -0.28384736, -0.21206513,
+        -0.20871592, 0.27070445, 0.25878823, 0.11136332, -0.33737376, 0.08353335, -0.34290665, 0.041805506, -0.09738535, 0.3284936, -0.16838405,
+        -0.032494456, -0.29193437, 0.033259362, -0.09272635, -0.2802651, -0.28648436, 0.3542878, 0.2432127, -0.24551713, 0.27813476, 0.21024024,
+        -0.013690501, -0.1350077, -0.07826337, -0.34563828, 0.3220685, -0.07571727, 0.19420576, 0.20783454, 0.18738335, 0.16672492
+    };
+    float bias[2] = { -0.4773722, -0.19620377 };
+
+    params.activation = TANH;
+    params.has_bias = 1;
+    params.biases = bias;
+    params.dilation = 1;
+    params.input_num = 3;
+    params.kernel = kernel;
+    params.kernel_size = 3;
+    params.output_num = 2;
+    params.padding_method = VALID;
+
+    operands[0].data = input;
+    operands[0].dims[0] = 1;
+    operands[0].dims[1] = 5;
+    operands[0].dims[2] = 6;
+    operands[0].dims[3] = 3;
+    operands[1].data = NULL;
+
+    input_indexes[0] = 0;
+    dnn_execute_layer_conv2d(operands, input_indexes, 1, &params);
+
+    output = operands[1].data;
+    for (int i = 0; i < sizeof(expected_output) / sizeof(float); i++) {
+        if (fabs(output[i] - expected_output[i]) > EPSON) {
+            printf("at index %d, output: %f, expected_output: %f\n", i, output[i], expected_output[i]);
+            av_freep(&output);
+            return 1;
+        }
+    }
+
+    av_freep(&output);
+    return 0;
+}
+
+int main(int argc, char **argv)
+{
+    if (test_with_valid())
+        return 1;
+    if (test_with_same_dilate())
+        return 1;
+
+    return 0;
+}
diff --git a/tests/dnn/dnn-layer-depth2space-test.c b/tests/dnn/dnn-layer-depth2space-test.c
new file mode 100644
index 0000000..5225ec7
--- /dev/null
+++ b/tests/dnn/dnn-layer-depth2space-test.c
@@ -0,0 +1,102 @@
+/*
+ * Copyright (c) 2019 Guo Yejun
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <math.h>
+#include "libavfilter/dnn/dnn_backend_native.h"
+#include "libavfilter/dnn/dnn_backend_native_layer_depth2space.h"
+
+#define EPSON 0.00001
+
+static int test(void)
+{
+    // the input data and expected data are generated with below python code.
+    /*
+    x = tf.placeholder(tf.float32, shape=[1, None, None, 4])
+    y = tf.depth_to_space(x, 2)
+    data = np.random.rand(1, 5, 3, 4);
+
+    sess=tf.Session()
+    sess.run(tf.global_variables_initializer())
+
+    output = sess.run(y, feed_dict={x: data})
+
+    print("input:")
+    print(data.shape)
+    print(list(data.flatten()))
+
+    print("output:")
+    print(output.shape)
+    print(list(output.flatten()))
+    */
+
+    DepthToSpaceParams params;
+    DnnOperand operands[2];
+    int32_t input_indexes[1];
+    float input[1*5*3*4] = {
+        0.09771065121566602, 0.6336807372403175, 0.5142416549709786, 0.8027206567330333, 0.2154276025069397, 0.12112878462616772, 0.913936596765778,
+        0.38881443647542646, 0.5850447615898835, 0.9311499327398275, 0.3613660929428246, 0.5420722002125493, 0.6002131190230359, 0.44800665702299525,
+        0.7271322557896777, 0.3869293511885826, 0.5144404769364138, 0.6910844856987723, 0.6142102742269762, 0.6249991371621018, 0.45663376215836626,
+        0.19523477129943423, 0.2483895888532045, 0.64326768256278, 0.5485877602998981, 0.45442067849873546, 0.529374943304256, 0.30439850391811885,
+        0.11961343361340993, 0.2909643484561082, 0.9810970344127848, 0.8886928489786549, 0.6112237084436409, 0.8852482695156674, 0.9110868043114374,
+        0.21242780027585217, 0.7101536973207572, 0.9709717457443375, 0.2702666770969332, 0.7718295953780221, 0.3957005164588574, 0.24383544252475453,
+        0.040143453532367035, 0.26358051835323115, 0.013130251443791319, 0.3016550481482074, 0.03582340459943956, 0.718025513612361, 0.09844204177633753,
+        0.04433767496953056, 0.6221895044119757, 0.6190414032940228, 0.8963550834625371, 0.5642449700064629, 0.2482982014723497, 0.17824909294583013,
+        0.024401882408643272, 0.21742800875253465, 0.6794724473181843, 0.4814830479242237
+    };
+    float expected_output[1*10*6*1] = {
+        0.097710654, 0.63368076, 0.2154276, 0.12112878, 0.58504474, 0.93114996, 0.51424164, 0.80272067, 0.9139366, 0.38881445,
+        0.3613661, 0.5420722, 0.6002131, 0.44800666, 0.5144405, 0.6910845, 0.45663378, 0.19523478, 0.72713226, 0.38692936,
+        0.61421025, 0.62499917, 0.24838959, 0.6432677, 0.54858774, 0.4544207, 0.11961343, 0.29096434, 0.6112237, 0.88524824,
+        0.52937496, 0.3043985, 0.98109704, 0.88869286, 0.9110868, 0.2124278, 0.7101537, 0.97097176, 0.3957005, 0.24383545,
+        0.013130251, 0.30165505, 0.27026668, 0.7718296, 0.040143453, 0.26358053, 0.035823405, 0.7180255, 0.09844204,
+        0.044337675, 0.8963551, 0.564245, 0.024401883, 0.21742801, 0.6221895, 0.6190414, 0.2482982, 0.17824909, 0.67947245, 0.48148304
+    };
+    float *output;
+
+    operands[0].data = input;
+    operands[0].dims[0] = 1;
+    operands[0].dims[1] = 5;
+    operands[0].dims[2] = 3;
+    operands[0].dims[3] = 4;
+    operands[1].data = NULL;
+
+    input_indexes[0] = 0;
+    params.block_size = 2;
+    dnn_execute_layer_depth2space(operands, input_indexes, 1, &params);
+
+    output = operands[1].data;
+    for (int i = 0; i < sizeof(expected_output) / sizeof(float); i++) {
+        if (fabs(output[i] - expected_output[i]) > EPSON) {
+            printf("at index %d, output: %f, expected_output: %f\n", i, output[i], expected_output[i]);
+            av_freep(&output);
+            return 1;
+        }
+    }
+
+    av_freep(&output);
+    return 0;
+}
+
+int main(int argc, char **argv)
+{
+    return test();
+}
diff --git a/tests/dnn/dnn-layer-mathbinary-test.c b/tests/dnn/dnn-layer-mathbinary-test.c
new file mode 100644
index 0000000..f67c0f2
--- /dev/null
+++ b/tests/dnn/dnn-layer-mathbinary-test.c
@@ -0,0 +1,204 @@
+/*
+ * Copyright (c) 2020
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <math.h>
+#include "libavfilter/dnn/dnn_backend_native_layer_mathbinary.h"
+#include "libavutil/avassert.h"
+
+#define EPSON 0.00005
+
+static float get_expected(float f1, float f2, DNNMathBinaryOperation op)
+{
+    switch (op)
+    {
+    case DMBO_SUB:
+        return f1 - f2;
+    case DMBO_ADD:
+        return f1 + f2;
+    case DMBO_MUL:
+        return f1 * f2;
+    case DMBO_REALDIV:
+        return f1 / f2;
+    default:
+        av_assert0(!"not supported yet");
+        return 0.f;
+    }
+}
+
+static int test_broadcast_input0(DNNMathBinaryOperation op)
+{
+    DnnLayerMathBinaryParams params;
+    DnnOperand operands[2];
+    int32_t input_indexes[1];
+    float input[1*1*2*3] = {
+        -3, 2.5, 2, -2.1, 7.8, 100
+    };
+    float *output;
+
+    params.bin_op = op;
+    params.input0_broadcast = 1;
+    params.input1_broadcast = 0;
+    params.v = 7.28;
+
+    operands[0].data = input;
+    operands[0].dims[0] = 1;
+    operands[0].dims[1] = 1;
+    operands[0].dims[2] = 2;
+    operands[0].dims[3] = 3;
+    operands[1].data = NULL;
+
+    input_indexes[0] = 0;
+    dnn_execute_layer_math_binary(operands, input_indexes, 1, &params);
+
+    output = operands[1].data;
+    for (int i = 0; i < sizeof(input) / sizeof(float); i++) {
+        float expected_output = get_expected(params.v, input[i], op);
+        if (fabs(output[i] - expected_output) > EPSON) {
+            printf("op %d, at index %d, output: %f, expected_output: %f (%s:%d)\n",
+                    op, i, output[i], expected_output, __FILE__, __LINE__);
+            av_freep(&output);
+            return 1;
+        }
+    }
+
+    av_freep(&output);
+    return 0;
+}
+
+static int test_broadcast_input1(DNNMathBinaryOperation op)
+{
+    DnnLayerMathBinaryParams params;
+    DnnOperand operands[2];
+    int32_t input_indexes[1];
+    float input[1*1*2*3] = {
+        -3, 2.5, 2, -2.1, 7.8, 100
+    };
+    float *output;
+
+    params.bin_op = op;
+    params.input0_broadcast = 0;
+    params.input1_broadcast = 1;
+    params.v = 7.28;
+
+    operands[0].data = input;
+    operands[0].dims[0] = 1;
+    operands[0].dims[1] = 1;
+    operands[0].dims[2] = 2;
+    operands[0].dims[3] = 3;
+    operands[1].data = NULL;
+
+    input_indexes[0] = 0;
+    dnn_execute_layer_math_binary(operands, input_indexes, 1, &params);
+
+    output = operands[1].data;
+    for (int i = 0; i < sizeof(input) / sizeof(float); i++) {
+        float expected_output = get_expected(input[i], params.v, op);
+        if (fabs(output[i] - expected_output) > EPSON) {
+            printf("op %d, at index %d, output: %f, expected_output: %f (%s:%d)\n",
+                    op, i, output[i], expected_output, __FILE__, __LINE__);
+            av_freep(&output);
+            return 1;
+        }
+    }
+
+    av_freep(&output);
+    return 0;
+}
+
+static int test_no_broadcast(DNNMathBinaryOperation op)
+{
+    DnnLayerMathBinaryParams params;
+    DnnOperand operands[3];
+    int32_t input_indexes[2];
+    float input0[1*1*2*3] = {
+        -3, 2.5, 2, -2.1, 7.8, 100
+    };
+    float input1[1*1*2*3] = {
+        -1, 2, 3, -21, 8, 10.0
+    };
+    float *output;
+
+    params.bin_op = op;
+    params.input0_broadcast = 0;
+    params.input1_broadcast = 0;
+
+    operands[0].data = input0;
+    operands[0].dims[0] = 1;
+    operands[0].dims[1] = 1;
+    operands[0].dims[2] = 2;
+    operands[0].dims[3] = 3;
+    operands[1].data = input1;
+    operands[1].dims[0] = 1;
+    operands[1].dims[1] = 1;
+    operands[1].dims[2] = 2;
+    operands[1].dims[3] = 3;
+    operands[2].data = NULL;
+
+    input_indexes[0] = 0;
+    input_indexes[1] = 1;
+    dnn_execute_layer_math_binary(operands, input_indexes, 2, &params);
+
+    output = operands[2].data;
+    for (int i = 0; i < sizeof(input0) / sizeof(float); i++) {
+        float expected_output = get_expected(input0[i], input1[i], op);
+        if (fabs(output[i] - expected_output) > EPSON) {
+            printf("op %d, at index %d, output: %f, expected_output: %f (%s:%d)\n",
+                    op, i, output[i], expected_output, __FILE__, __LINE__);
+            av_freep(&output);
+            return 1;
+        }
+    }
+
+    av_freep(&output);
+    return 0;
+}
+
+static int test(DNNMathBinaryOperation op)
+{
+    if (test_broadcast_input0(op))
+        return 1;
+
+    if (test_broadcast_input1(op))
+        return 1;
+
+    if (test_no_broadcast(op))
+        return 1;
+
+    return 0;
+}
+
+int main(int argc, char **argv)
+{
+    if (test(DMBO_SUB))
+        return 1;
+
+    if (test(DMBO_ADD))
+        return 1;
+
+    if (test(DMBO_MUL))
+        return 1;
+
+    if (test(DMBO_REALDIV))
+        return 1;
+
+    return 0;
+}
diff --git a/tests/dnn/dnn-layer-maximum-test.c b/tests/dnn/dnn-layer-maximum-test.c
new file mode 100644
index 0000000..06daf64
--- /dev/null
+++ b/tests/dnn/dnn-layer-maximum-test.c
@@ -0,0 +1,71 @@
+/*
+ * Copyright (c) 2019 Guo Yejun
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <math.h>
+#include "libavfilter/dnn/dnn_backend_native_layer_maximum.h"
+
+#define EPSON 0.00001
+
+static int test(void)
+{
+    DnnLayerMaximumParams params;
+    DnnOperand operands[2];
+    int32_t input_indexes[1];
+    float input[1*1*2*3] = {
+        -3, 2.5, 2, -2.1, 7.8, 100
+    };
+    float *output;
+
+    params.val.y = 2.3;
+
+    operands[0].data = input;
+    operands[0].dims[0] = 1;
+    operands[0].dims[1] = 1;
+    operands[0].dims[2] = 2;
+    operands[0].dims[3] = 3;
+    operands[1].data = NULL;
+
+    input_indexes[0] = 0;
+    dnn_execute_layer_maximum(operands, input_indexes, 1, &params);
+
+    output = operands[1].data;
+    for (int i = 0; i < sizeof(input) / sizeof(float); i++) {
+        float expected_output = input[i] > params.val.y ? input[i] : params.val.y;
+        if (fabs(output[i] - expected_output) > EPSON) {
+            printf("at index %d, output: %f, expected_output: %f\n", i, output[i], expected_output);
+            av_freep(&output);
+            return 1;
+        }
+    }
+
+    av_freep(&output);
+    return 0;
+
+}
+
+int main(int argc, char **argv)
+{
+    if (test())
+        return 1;
+
+    return 0;
+}
diff --git a/tests/dnn/dnn-layer-pad-test.c b/tests/dnn/dnn-layer-pad-test.c
new file mode 100644
index 0000000..ea8c824
--- /dev/null
+++ b/tests/dnn/dnn-layer-pad-test.c
@@ -0,0 +1,239 @@
+/*
+ * Copyright (c) 2019 Guo Yejun
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <math.h>
+#include "libavfilter/dnn/dnn_backend_native_layer_pad.h"
+
+#define EPSON 0.00001
+
+static int test_with_mode_symmetric(void)
+{
+    // the input data and expected data are generated with below python code.
+    /*
+    x = tf.placeholder(tf.float32, shape=[1, None, None, 3])
+    y = tf.pad(x, [[0, 0], [2, 3], [3, 2], [0, 0]], 'SYMMETRIC')
+    data = np.arange(48).reshape(1, 4, 4, 3);
+
+    sess=tf.Session()
+    sess.run(tf.global_variables_initializer())
+    output = sess.run(y, feed_dict={x: data})
+
+    print(list(data.flatten()))
+    print(list(output.flatten()))
+    print(data.shape)
+    print(output.shape)
+    */
+
+    LayerPadParams params;
+    DnnOperand operands[2];
+    int32_t input_indexes[1];
+    float input[1*4*4*3] = {
+        0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47
+    };
+    float expected_output[1*9*9*3] = {
+        18.0, 19.0, 20.0, 15.0, 16.0, 17.0, 12.0, 13.0, 14.0, 12.0, 13.0, 14.0, 15.0, 16.0, 17.0, 18.0, 19.0, 20.0, 21.0, 22.0, 23.0, 21.0, 22.0, 23.0, 18.0, 19.0, 20.0, 6.0, 7.0, 8.0, 3.0,
+        4.0, 5.0, 0.0, 1.0, 2.0, 0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 9.0, 10.0, 11.0, 6.0, 7.0, 8.0, 6.0, 7.0, 8.0, 3.0, 4.0, 5.0, 0.0, 1.0, 2.0, 0.0, 1.0, 2.0, 3.0,
+        4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 9.0, 10.0, 11.0, 6.0, 7.0, 8.0, 18.0, 19.0, 20.0, 15.0, 16.0, 17.0, 12.0, 13.0, 14.0, 12.0, 13.0, 14.0, 15.0, 16.0, 17.0, 18.0, 19.0, 20.0,
+        21.0, 22.0, 23.0, 21.0, 22.0, 23.0, 18.0, 19.0, 20.0, 30.0, 31.0, 32.0, 27.0, 28.0, 29.0, 24.0, 25.0, 26.0, 24.0, 25.0, 26.0, 27.0, 28.0, 29.0, 30.0, 31.0, 32.0, 33.0, 34.0, 35.0, 33.0,
+        34.0, 35.0, 30.0, 31.0, 32.0, 42.0, 43.0, 44.0, 39.0, 40.0, 41.0, 36.0, 37.0, 38.0, 36.0, 37.0, 38.0, 39.0, 40.0, 41.0, 42.0, 43.0, 44.0, 45.0, 46.0, 47.0, 45.0, 46.0, 47.0, 42.0, 43.0,
+        44.0, 42.0, 43.0, 44.0, 39.0, 40.0, 41.0, 36.0, 37.0, 38.0, 36.0, 37.0, 38.0, 39.0, 40.0, 41.0, 42.0, 43.0, 44.0, 45.0, 46.0, 47.0, 45.0, 46.0, 47.0, 42.0, 43.0, 44.0, 30.0, 31.0, 32.0,
+        27.0, 28.0, 29.0, 24.0, 25.0, 26.0, 24.0, 25.0, 26.0, 27.0, 28.0, 29.0, 30.0, 31.0, 32.0, 33.0, 34.0, 35.0, 33.0, 34.0, 35.0, 30.0, 31.0, 32.0, 18.0, 19.0, 20.0, 15.0, 16.0, 17.0, 12.0,
+        13.0, 14.0, 12.0, 13.0, 14.0, 15.0, 16.0, 17.0, 18.0, 19.0, 20.0, 21.0, 22.0, 23.0, 21.0, 22.0, 23.0, 18.0, 19.0, 20.0
+    };
+    float *output;
+
+    params.mode = LPMP_SYMMETRIC;
+    params.paddings[0][0] = 0;
+    params.paddings[0][1] = 0;
+    params.paddings[1][0] = 2;
+    params.paddings[1][1] = 3;
+    params.paddings[2][0] = 3;
+    params.paddings[2][1] = 2;
+    params.paddings[3][0] = 0;
+    params.paddings[3][1] = 0;
+
+    operands[0].data = input;
+    operands[0].dims[0] = 1;
+    operands[0].dims[1] = 4;
+    operands[0].dims[2] = 4;
+    operands[0].dims[3] = 3;
+    operands[1].data = NULL;
+
+    input_indexes[0] = 0;
+    dnn_execute_layer_pad(operands, input_indexes, 1, &params);
+
+    output = operands[1].data;
+    for (int i = 0; i < sizeof(expected_output) / sizeof(float); i++) {
+        if (fabs(output[i] - expected_output[i]) > EPSON) {
+            printf("at index %d, output: %f, expected_output: %f\n", i, output[i], expected_output[i]);
+            av_freep(&output);
+            return 1;
+        }
+    }
+
+    av_freep(&output);
+    return 0;
+
+}
+
+static int test_with_mode_reflect(void)
+{
+    // the input data and expected data are generated with below python code.
+    /*
+    x = tf.placeholder(tf.float32, shape=[3, None, None, 3])
+    y = tf.pad(x, [[1, 2], [0, 0], [0, 0], [0, 0]], 'REFLECT')
+    data = np.arange(36).reshape(3, 2, 2, 3);
+
+    sess=tf.Session()
+    sess.run(tf.global_variables_initializer())
+    output = sess.run(y, feed_dict={x: data})
+
+    print(list(data.flatten()))
+    print(list(output.flatten()))
+    print(data.shape)
+    print(output.shape)
+    */
+
+    LayerPadParams params;
+    DnnOperand operands[2];
+    int32_t input_indexes[1];
+    float input[3*2*2*3] = {
+        0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35
+    };
+    float expected_output[6*2*2*3] = {
+        12.0, 13.0, 14.0, 15.0, 16.0, 17.0, 18.0, 19.0, 20.0, 21.0, 22.0, 23.0, 0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0,
+        12.0, 13.0, 14.0, 15.0, 16.0, 17.0, 18.0, 19.0, 20.0, 21.0, 22.0, 23.0, 24.0, 25.0, 26.0, 27.0, 28.0, 29.0, 30.0, 31.0, 32.0, 33.0, 34.0,
+        35.0, 12.0, 13.0, 14.0, 15.0, 16.0, 17.0, 18.0, 19.0, 20.0, 21.0, 22.0, 23.0, 0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0
+    };
+    float *output;
+
+    params.mode = LPMP_REFLECT;
+    params.paddings[0][0] = 1;
+    params.paddings[0][1] = 2;
+    params.paddings[1][0] = 0;
+    params.paddings[1][1] = 0;
+    params.paddings[2][0] = 0;
+    params.paddings[2][1] = 0;
+    params.paddings[3][0] = 0;
+    params.paddings[3][1] = 0;
+
+    operands[0].data = input;
+    operands[0].dims[0] = 3;
+    operands[0].dims[1] = 2;
+    operands[0].dims[2] = 2;
+    operands[0].dims[3] = 3;
+    operands[1].data = NULL;
+
+    input_indexes[0] = 0;
+    dnn_execute_layer_pad(operands, input_indexes, 1, &params);
+
+    output = operands[1].data;
+    for (int i = 0; i < sizeof(expected_output) / sizeof(float); i++) {
+        if (fabs(output[i] - expected_output[i]) > EPSON) {
+            printf("at index %d, output: %f, expected_output: %f\n", i, output[i], expected_output[i]);
+            av_freep(&output);
+            return 1;
+        }
+    }
+
+    av_freep(&output);
+    return 0;
+
+}
+
+static int test_with_mode_constant(void)
+{
+    // the input data and expected data are generated with below python code.
+    /*
+    x = tf.placeholder(tf.float32, shape=[1, None, None, 3])
+    y = tf.pad(x, [[0, 0], [1, 0], [0, 0], [1, 2]], 'CONSTANT', constant_values=728)
+    data = np.arange(12).reshape(1, 2, 2, 3);
+
+    sess=tf.Session()
+    sess.run(tf.global_variables_initializer())
+    output = sess.run(y, feed_dict={x: data})
+
+    print(list(data.flatten()))
+    print(list(output.flatten()))
+    print(data.shape)
+    print(output.shape)
+    */
+
+    LayerPadParams params;
+    DnnOperand operands[2];
+    int32_t input_indexes[1];
+    float input[1*2*2*3] = {
+        0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
+    };
+    float expected_output[1*3*2*6] = {
+        728.0, 728.0, 728.0, 728.0, 728.0, 728.0, 728.0, 728.0, 728.0, 728.0, 728.0,
+        728.0, 728.0, 0.0, 1.0, 2.0, 728.0, 728.0, 728.0, 3.0, 4.0, 5.0, 728.0, 728.0,
+        728.0, 6.0, 7.0, 8.0, 728.0, 728.0, 728.0, 9.0, 10.0, 11.0, 728.0, 728.0
+    };
+    float *output;
+
+    params.mode = LPMP_CONSTANT;
+    params.constant_values = 728;
+    params.paddings[0][0] = 0;
+    params.paddings[0][1] = 0;
+    params.paddings[1][0] = 1;
+    params.paddings[1][1] = 0;
+    params.paddings[2][0] = 0;
+    params.paddings[2][1] = 0;
+    params.paddings[3][0] = 1;
+    params.paddings[3][1] = 2;
+
+    operands[0].data = input;
+    operands[0].dims[0] = 1;
+    operands[0].dims[1] = 2;
+    operands[0].dims[2] = 2;
+    operands[0].dims[3] = 3;
+    operands[1].data = NULL;
+
+    input_indexes[0] = 0;
+    dnn_execute_layer_pad(operands, input_indexes, 1, &params);
+
+    output = operands[1].data;
+    for (int i = 0; i < sizeof(expected_output) / sizeof(float); i++) {
+        if (fabs(output[i] - expected_output[i]) > EPSON) {
+            printf("at index %d, output: %f, expected_output: %f\n", i, output[i], expected_output[i]);
+            av_freep(&output);
+            return 1;
+        }
+    }
+
+    av_freep(&output);
+    return 0;
+
+}
+
+int main(int argc, char **argv)
+{
+    if (test_with_mode_symmetric())
+        return 1;
+
+    if (test_with_mode_reflect())
+        return 1;
+
+    if (test_with_mode_constant())
+        return 1;
+}
diff --git a/tests/fate-run.sh b/tests/fate-run.sh
index aece90a..7c6d753 100755
--- a/tests/fate-run.sh
+++ b/tests/fate-run.sh
@@ -5,7 +5,7 @@
 base=$(dirname $0)
 . "${base}/md5.sh"
 
-base64=tests/base64
+base64=tests/base64${HOSTEXECSUF}
 
 test="${1#fate-}"
 target_samples=$2
@@ -45,7 +45,7 @@
 }
 
 do_tiny_psnr(){
-    psnr=$(tests/tiny_psnr "$1" "$2" $cmp_unit $cmp_shift 0) || return 1
+    psnr=$(tests/tiny_psnr${HOSTEXECSUF} "$1" "$2" $cmp_unit $cmp_shift 0) || return 1
     val=$(expr "$psnr" : ".*$3: *\([0-9.]*\)")
     size1=$(expr "$psnr" : '.*bytes: *\([0-9]*\)')
     size2=$(expr "$psnr" : '.*bytes:[ 0-9]*/ *\([0-9]*\)')
@@ -86,11 +86,11 @@
 }
 
 probefmt(){
-    run ffprobe${PROGSUF} -show_entries format=format_name -print_format default=nw=1:nk=1 -v 0 "$@"
+    run ffprobe${PROGSUF}${EXECSUF} -show_entries format=format_name -print_format default=nw=1:nk=1 -v 0 "$@"
 }
 
 probetags(){
-    run ffprobe${PROGSUF} -show_entries format_tags -v 0 "$@"
+    run ffprobe${PROGSUF}${EXECSUF} -show_entries format_tags -v 0 "$@"
 }
 
 runlocal(){
@@ -99,24 +99,24 @@
 }
 
 probeframes(){
-    run ffprobe${PROGSUF} -show_frames -v 0 "$@"
+    run ffprobe${PROGSUF}${EXECSUF} -show_frames -v 0 "$@"
 }
 
 probechapters(){
-    run ffprobe${PROGSUF} -show_chapters -v 0 "$@"
+    run ffprobe${PROGSUF}${EXECSUF} -show_chapters -v 0 "$@"
 }
 
 probegaplessinfo(){
     filename="$1"
     shift
-    run ffprobe${PROGSUF} -bitexact -select_streams a -show_entries format=start_time,duration:stream=index,start_pts,duration_ts -v 0 "$filename" "$@"
+    run ffprobe${PROGSUF}${EXECSUF} -bitexact -select_streams a -show_entries format=start_time,duration:stream=index,start_pts,duration_ts -v 0 "$filename" "$@"
     pktfile1="${outdir}/${test}.pkts"
     framefile1="${outdir}/${test}.frames"
     cleanfiles="$cleanfiles $pktfile1 $framefile1"
-    run ffprobe${PROGSUF} -bitexact -select_streams a -of compact -count_packets -show_entries packet=pts,dts,duration,flags:stream=nb_read_packets -v 0 "$filename" "$@" > "$pktfile1"
+    run ffprobe${PROGSUF}${EXECSUF} -bitexact -select_streams a -of compact -count_packets -show_entries packet=pts,dts,duration,flags:stream=nb_read_packets -v 0 "$filename" "$@" > "$pktfile1"
     head -n 8 "$pktfile1"
     tail -n 9 "$pktfile1"
-    run ffprobe${PROGSUF} -bitexact -select_streams a -of compact -count_frames -show_entries frame=pkt_pts,pkt_dts,best_effort_timestamp,pkt_duration,nb_samples:stream=nb_read_frames -v 0 "$filename" "$@" > "$framefile1"
+    run ffprobe${PROGSUF}${EXECSUF} -bitexact -select_streams a -of compact -count_frames -show_entries frame=pkt_pts,pkt_dts,best_effort_timestamp,pkt_duration,nb_samples:stream=nb_read_frames -v 0 "$filename" "$@" > "$framefile1"
     head -n 8 "$framefile1"
     tail -n 9 "$framefile1"
 }
@@ -128,7 +128,7 @@
         [ x${arg} = x-i ] && ffmpeg_args="${ffmpeg_args} ${dec_opts}"
         ffmpeg_args="${ffmpeg_args} ${arg}"
     done
-    run ffmpeg${PROGSUF} ${ffmpeg_args}
+    run ffmpeg${PROGSUF}${EXECSUF} ${ffmpeg_args}
 }
 
 framecrc(){
@@ -154,7 +154,7 @@
 md5(){
     encfile="${outdir}/${test}.out"
     cleanfiles="$cleanfiles $encfile"
-    ffmpeg "$@" $encfile
+    ffmpeg "$@" $(target_path $encfile)
     do_md5sum $encfile | awk '{print $1}'
 }
 
@@ -192,6 +192,7 @@
     enc_opt=$4
     dec_fmt=$5
     dec_opt=$6
+    ffprobe_opts=$9
     encfile="${outdir}/${test}.${enc_fmt}"
     decfile="${outdir}/${test}.out.${dec_fmt}"
     cleanfiles="$cleanfiles $decfile"
@@ -206,7 +207,9 @@
     ffmpeg $8 $DEC_OPTS -i $tencfile $ENC_OPTS $dec_opt $FLAGS \
         -f $dec_fmt -y $tdecfile || return
     do_md5sum $decfile
-    tests/tiny_psnr $srcfile $decfile $cmp_unit $cmp_shift
+    tests/tiny_psnr${HOSTEXECSUF} $srcfile $decfile $cmp_unit $cmp_shift
+    test -z $ffprobe_opts || \
+        run ffprobe${PROGSUF}${EXECSUF} $ffprobe_opts -v 0 $tencfile || return
 }
 
 transcode(){
@@ -215,16 +218,19 @@
     enc_fmt=$3
     enc_opt=$4
     final_decode=$5
+    ffprobe_opts=$7
     encfile="${outdir}/${test}.${enc_fmt}"
-    test "$7" = -keep || cleanfiles="$cleanfiles $encfile"
+    test "$6" = -keep || cleanfiles="$cleanfiles $encfile"
     tsrcfile=$(target_path $srcfile)
     tencfile=$(target_path $encfile)
     ffmpeg -f $src_fmt $DEC_OPTS -i $tsrcfile $ENC_OPTS $enc_opt $FLAGS \
         -f $enc_fmt -y $tencfile || return
     do_md5sum $encfile
     echo $(wc -c $encfile)
-    ffmpeg $DEC_OPTS -i $encfile $ENC_OPTS $FLAGS $final_decode \
+    ffmpeg $DEC_OPTS -i $tencfile $ENC_OPTS $FLAGS $final_decode \
         -f framecrc - || return
+    test -z $ffprobe_opts || \
+        run ffprobe${PROGSUF}${EXECSUF} $ffprobe_opts -v 0 $tencfile || return
 }
 
 stream_remux(){
@@ -233,26 +239,123 @@
     enc_fmt=$3
     stream_maps=$4
     final_decode=$5
+    ffprobe_opts=$7
     encfile="${outdir}/${test}.${enc_fmt}"
-    test "$7" = -keep || cleanfiles="$cleanfiles $encfile"
+    test "$6" = -keep || cleanfiles="$cleanfiles $encfile"
     tsrcfile=$(target_path $srcfile)
     tencfile=$(target_path $encfile)
     ffmpeg -f $src_fmt -i $tsrcfile $stream_maps -codec copy $FLAGS \
         -f $enc_fmt -y $tencfile || return
-    ffmpeg $DEC_OPTS -i $encfile $ENC_OPTS $FLAGS $final_decode \
+    ffmpeg $DEC_OPTS -i $tencfile $ENC_OPTS $FLAGS $final_decode \
         -f framecrc - || return
+    test -z $ffprobe_opts || \
+        run ffprobe${PROGSUF}${EXECSUF} $ffprobe_opts -v 0 $tencfile || return
 }
 
-lavffatetest(){
-    t="${test#lavf-fate-}"
-    ref=${base}/ref/lavf-fate/$t
-    ${base}/lavf-regression.sh $t lavf-fate tests/vsynth1 "$target_exec" "$target_path" "$threads" "$thread_type" "$cpuflags" "$target_samples"
+# FIXME: There is a certain duplication between the avconv-related helper
+# functions above and below that should be refactored.
+ffmpeg2="$target_exec ${target_path}/ffmpeg${PROGSUF}${EXECSUF}"
+raw_src="${target_path}/tests/vsynth1/%02d.pgm"
+pcm_src="${target_path}/tests/data/asynth1.sw"
+crcfile="tests/data/$test.lavf.crc"
+target_crcfile="${target_path}/$crcfile"
+
+[ "${V-0}" -gt 0 ] && echov=echov || echov=:
+
+echov(){
+    echo "$@" >&3
 }
 
-lavftest(){
+AVCONV_OPTS="-nostdin -nostats -y -cpuflags $cpuflags"
+COMMON_OPTS="-flags +bitexact -idct simple -sws_flags +accurate_rnd+bitexact -fflags +bitexact"
+DEC_OPTS="$COMMON_OPTS -threads $threads"
+ENC_OPTS="$COMMON_OPTS -threads 1 -dct fastint"
+
+run_avconv(){
+    $echov $ffmpeg2 $AVCONV_OPTS $*
+    $ffmpeg2 $AVCONV_OPTS $*
+}
+
+do_avconv(){
+    f="$1"
+    shift
+    set -- $* ${target_path}/$f
+    run_avconv $*
+    do_md5sum $f
+    echo $(wc -c $f)
+}
+
+do_avconv_crc(){
+    f="$1"
+    shift
+    run_avconv $* -f crc "$target_crcfile"
+    echo "$f $(cat $crcfile)"
+}
+
+lavf_audio(){
     t="${test#lavf-}"
-    ref=${base}/ref/lavf/$t
-    ${base}/lavf-regression.sh $t lavf tests/vsynth1 "$target_exec" "$target_path" "$threads" "$thread_type" "$cpuflags" "$target_samples"
+    outdir="tests/data/lavf"
+    file=${outdir}/lavf.$t
+    do_avconv $file $DEC_OPTS $1 -ar 44100 -f s16le -i $pcm_src "$ENC_OPTS -metadata title=lavftest" -t 1 -qscale 10 $2
+    do_avconv_crc $file $DEC_OPTS $3 -i $target_path/$file
+}
+
+lavf_container(){
+    t="${test#lavf-}"
+    outdir="tests/data/lavf"
+    file=${outdir}/lavf.$t
+    do_avconv $file $DEC_OPTS -f image2 -c:v pgmyuv -i $raw_src $DEC_OPTS -ar 44100 -f s16le $1 -i $pcm_src "$ENC_OPTS -metadata title=lavftest" -b:a 64k -t 1 -qscale:v 10 $2
+    test "$3" = "disable_crc" ||
+        do_avconv_crc $file $DEC_OPTS -i $target_path/$file $3
+}
+
+lavf_container_attach() {          lavf_container "" "$1 -attach ${raw_src%/*}/00.pgm -metadata:s:t mimetype=image/x-portable-greymap"; }
+lavf_container_timecode_nodrop() { lavf_container "" "$1 -timecode 02:56:14:13"; }
+lavf_container_timecode_drop()   { lavf_container "" "$1 -timecode 02:56:14.13 -r 30000/1001"; }
+
+lavf_container_timecode()
+{
+    lavf_container_timecode_nodrop "$@"
+    lavf_container_timecode_drop "$@"
+    lavf_container "" "$1"
+}
+
+lavf_container_fate()
+{
+    t="${test#lavf-fate-}"
+    outdir="tests/data/lavf-fate"
+    file=${outdir}/lavf.$t
+    input="${target_samples}/$1"
+    do_avconv $file $DEC_OPTS $2 -i "$input" "$ENC_OPTS -metadata title=lavftest" -vcodec copy -acodec copy
+    do_avconv_crc $file $DEC_OPTS -i $target_path/$file $3
+}
+
+lavf_image(){
+    t="${test#lavf-}"
+    outdir="tests/data/images/$t"
+    mkdir -p "$outdir"
+    file=${outdir}/%02d.$t
+    run_avconv $DEC_OPTS -f image2 -c:v pgmyuv -i $raw_src $1 "$ENC_OPTS -metadata title=lavftest" -frames 13 -y -qscale 10 $target_path/$file
+    do_md5sum ${outdir}/02.$t
+    do_avconv_crc $file $DEC_OPTS $2 -i $target_path/$file $2
+    echo $(wc -c ${outdir}/02.$t)
+}
+
+lavf_image2pipe(){
+    t="${test#lavf-}"
+    t="${t%pipe}"
+    outdir="tests/data/lavf"
+    file=${outdir}/${t}pipe.$t
+    do_avconv $file $DEC_OPTS -f image2 -c:v pgmyuv -i $raw_src -f image2pipe "$ENC_OPTS -metadata title=lavftest" -t 1 -qscale 10
+    do_avconv_crc $file $DEC_OPTS -f image2pipe -i $target_path/$file
+}
+
+lavf_video(){
+    t="${test#lavf-}"
+    outdir="tests/data/lavf"
+    file=${outdir}/lavf.$t
+    do_avconv $file $DEC_OPTS -f image2 -c:v pgmyuv -i $raw_src "$ENC_OPTS -metadata title=lavftest" -t 1 -qscale 10 $1 $2
+    do_avconv_crc $file $DEC_OPTS -i $target_path/$file $1
 }
 
 refcmp_metadata(){
@@ -264,6 +367,17 @@
         -f null /dev/null | awk -v ref=${ref} -v fuzz=${fuzz} -f ${base}/refcmp-metadata.awk -
 }
 
+pixfmt_conversion(){
+    conversion="${test#pixfmt-}"
+    outdir="tests/data/pixfmt"
+    raw_dst="$outdir/$conversion.out.yuv"
+    file=${outdir}/${conversion}.yuv
+    run_avconv $DEC_OPTS -r 1 -f image2 -c:v pgmyuv -i $raw_src \
+               $ENC_OPTS -f rawvideo -t 1 -s 352x288 -pix_fmt $conversion $target_path/$raw_dst
+    do_avconv $file $DEC_OPTS -f rawvideo -s 352x288 -pix_fmt $conversion -i $target_path/$raw_dst \
+              $ENC_OPTS -f rawvideo -s 352x288 -pix_fmt yuv444p
+}
+
 video_filter(){
     filters=$1
     shift
@@ -281,7 +395,7 @@
     prefilter_chain=$2
     nframes=${3:-1}
 
-    showfiltfmts="$target_exec $target_path/libavfilter/tests/filtfmts"
+    showfiltfmts="$target_exec $target_path/libavfilter/tests/filtfmts${EXECSUF}"
     scale_exclude_fmts=${outfile}_scale_exclude_fmts
     scale_in_fmts=${outfile}_scale_in_fmts
     scale_out_fmts=${outfile}_scale_out_fmts
@@ -315,16 +429,16 @@
     cleanfiles="$cleanfiles $decfile1 $decfile2 $decfile3"
 
     # test packet data
-    ffmpeg $extra_args -i "$sample" -bitexact -c:a copy -f framecrc -y $decfile1
+    ffmpeg $extra_args -i "$sample" -bitexact -c:a copy -f framecrc -y $(target_path $decfile1)
     do_md5sum $decfile1
     # test decoded (and cut) data
     ffmpeg $extra_args -i "$sample" -bitexact -f wav md5:
     # the same as above again, with seeking to the start
-    ffmpeg $extra_args -ss 0 -seek_timestamp 1 -i "$sample" -bitexact -c:a copy -f framecrc -y $decfile2
+    ffmpeg $extra_args -ss 0 -seek_timestamp 1 -i "$sample" -bitexact -c:a copy -f framecrc -y $(target_path $decfile2)
     do_md5sum $decfile2
     ffmpeg $extra_args -ss 0 -seek_timestamp 1 -i "$sample" -bitexact -f wav md5:
     # test packet data, with seeking to a specific position
-    ffmpeg $extra_args -ss 5 -seek_timestamp 1 -i "$sample" -bitexact -c:a copy -f framecrc -y $decfile3
+    ffmpeg $extra_args -ss 5 -seek_timestamp 1 -i "$sample" -bitexact -c:a copy -f framecrc -y $(target_path $decfile3)
     do_md5sum $decfile3
 }
 
@@ -337,20 +451,20 @@
     cleanfiles="$cleanfiles $file1"
 
     # test data after reencoding
-    ffmpeg -i "$sample" -bitexact -map 0:a -c:a $codec -f $format -y "$file1"
-    probegaplessinfo "$file1"
+    ffmpeg -i "$sample" -bitexact -map 0:a -c:a $codec -f $format -y "$(target_path "$file1")"
+    probegaplessinfo "$(target_path "$file1")"
 }
 
 audio_match(){
     sample=$(target_path $1)
-    trefile=$(target_path $2)
+    trefile=$2
     extra_args=$3
 
     decfile="${outdir}/${test}.wav"
     cleanfiles="$cleanfiles $decfile"
 
-    ffmpeg -i "$sample" -bitexact $extra_args -y $decfile
-    tests/audiomatch $decfile $trefile
+    ffmpeg -i "$sample" -bitexact $extra_args -y $(target_path $decfile)
+    tests/audiomatch${HOSTEXECSUF} $decfile $trefile
 }
 
 concat(){
@@ -366,10 +480,10 @@
     awk "{gsub(/%SRCFILE%/, \"$sample\"); print}" $template > $concatfile
 
     if [ "$mode" = "md5" ]; then
-        run ffprobe${PROGSUF} -bitexact -show_streams -show_packets -v 0 -fflags keepside -safe 0 $extra_args $concatfile | tr -d '\r' > $packetfile
+        run ffprobe${PROGSUF}${EXECSUF} -bitexact -show_streams -show_packets -v 0 -safe 0 $extra_args $(target_path $concatfile) | tr -d '\r' > $packetfile
         do_md5sum $packetfile
     else
-        run ffprobe${PROGSUF} -bitexact -show_streams -show_packets -v 0 -of compact=p=0:nk=1 -fflags keepside -safe 0 $extra_args $concatfile
+        run ffprobe${PROGSUF}${EXECSUF} -bitexact -show_streams -show_packets -v 0 -of compact=p=0:nk=1 -safe 0 $extra_args $(target_path $concatfile)
     fi
 }
 
@@ -377,8 +491,6 @@
     :
 }
 
-mkdir -p "$outdir"
-
 # Disable globbing: command arguments may contain globbing characters and
 # must be kept verbatim
 set -f
diff --git a/tests/fate/adpcm.mak b/tests/fate/adpcm.mak
index b64920d..3e6d4ec 100644
--- a/tests/fate/adpcm.mak
+++ b/tests/fate/adpcm.mak
@@ -88,5 +88,29 @@
 FATE_ADPCM-$(call DEMDEC, STR, ADPCM_XA) += fate-adpcm-xa
 fate-adpcm-xa: CMD = framecrc -i $(TARGET_SAMPLES)/psx-str/abc000_cut.str -vn
 
+FATE_ADPCM-$(call DEMDEC, ARGO_ASF, ADPCM_ARGO) += fate-adpcm-argo-mono
+fate-adpcm-argo-mono: CMD = md5 -i $(TARGET_SAMPLES)/argo-asf/PWIN22M.ASF -f s16le
+
+FATE_ADPCM-$(call DEMDEC, ARGO_ASF, ADPCM_ARGO) += fate-adpcm-argo-stereo
+fate-adpcm-argo-stereo: CMD = md5 -i $(TARGET_SAMPLES)/argo-asf/CBK2_cut.asf -f s16le
+
+FATE_ADPCM-$(call DEMDEC, KVAG, ADPCM_IMA_SSI) += fate-adpcm-ima-ssi-mono
+fate-adpcm-ima-ssi-mono: CMD = md5 -i $(TARGET_SAMPLES)/kvag/mull1_cut.vag -f s16le
+
+FATE_ADPCM-$(call DEMDEC, KVAG, ADPCM_IMA_SSI) += fate-adpcm-ima-ssi-stereo
+fate-adpcm-ima-ssi-stereo: CMD = md5 -i $(TARGET_SAMPLES)/kvag/credits_cut.vag -f s16le
+
+FATE_ADPCM-$(call DEMDEC, APM, ADPCM_IMA_APM) += fate-adpcm-ima-apm-mono
+fate-adpcm-ima-apm-mono: CMD = md5 -i $(TARGET_SAMPLES)/apm/outro1.apm -f s16le
+
+FATE_ADPCM-$(call DEMDEC, APM, ADPCM_IMA_APM) += fate-adpcm-ima-apm-stereo
+fate-adpcm-ima-apm-stereo: CMD = md5 -i $(TARGET_SAMPLES)/apm/AS01.apm -f s16le
+
+FATE_ADPCM-$(call DEMDEC, ALP, ADPCM_IMA_ALP) += fate-adpcm-ima-alp-mono
+fate-adpcm-ima-alp-mono: CMD = md5 -i $(TARGET_SAMPLES)/alp/AD_P11.PCM -f s16le
+
+FATE_ADPCM-$(call DEMDEC, ALP, ADPCM_IMA_ALP) += fate-adpcm-ima-alp-stereo
+fate-adpcm-ima-alp-stereo: CMD = md5 -i $(TARGET_SAMPLES)/alp/theme-cut.tun -f s16le
+
 FATE_SAMPLES_AVCONV += $(FATE_ADPCM-yes)
 fate-adpcm: $(FATE_ADPCM-yes)
diff --git a/tests/fate/als.mak b/tests/fate/als.mak
index ff2badf..c7287de 100644
--- a/tests/fate/als.mak
+++ b/tests/fate/als.mak
@@ -7,5 +7,9 @@
 
 $(foreach N,$(ALS_SUITE),$(eval $(call FATE_ALS_SUITE,$(N))))
 
+FATE_ALS += fate-mpeg4-als-conformance-09
+
+fate-mpeg4-als-conformance-09: CMD = crc -i $(TARGET_SAMPLES)/lossless-audio/als_09_512ch2k16b.mp4
+
 FATE_SAMPLES_AVCONV-$(call DEMDEC, MOV, ALS) += $(FATE_ALS)
 fate-als: $(FATE_ALS)
diff --git a/tests/fate/api.mak b/tests/fate/api.mak
index eb656e6..3e1cc99 100644
--- a/tests/fate/api.mak
+++ b/tests/fate/api.mak
@@ -1,33 +1,37 @@
 FATE_API_LIBAVCODEC-$(call ENCDEC, FLAC, FLAC) += fate-api-flac
 fate-api-flac: $(APITESTSDIR)/api-flac-test$(EXESUF)
-fate-api-flac: CMD = run $(APITESTSDIR)/api-flac-test
+fate-api-flac: CMD = run $(APITESTSDIR)/api-flac-test$(EXESUF)
 fate-api-flac: CMP = null
 
 FATE_API_SAMPLES_LIBAVFORMAT-$(call DEMDEC, FLV, FLV) += fate-api-band
 fate-api-band: $(APITESTSDIR)/api-band-test$(EXESUF)
-fate-api-band: CMD = run $(APITESTSDIR)/api-band-test $(TARGET_SAMPLES)/mpeg4/resize_down-up.h263
+fate-api-band: CMD = run $(APITESTSDIR)/api-band-test$(EXESUF) $(TARGET_SAMPLES)/mpeg4/resize_down-up.h263
 fate-api-band: CMP = null
 
 FATE_API_SAMPLES_LIBAVFORMAT-$(call DEMDEC, H264, H264) += fate-api-h264
 fate-api-h264: $(APITESTSDIR)/api-h264-test$(EXESUF)
-fate-api-h264: CMD = run $(APITESTSDIR)/api-h264-test $(TARGET_SAMPLES)/h264-conformance/SVA_NL2_E.264
+fate-api-h264: CMD = run $(APITESTSDIR)/api-h264-test$(EXESUF) $(TARGET_SAMPLES)/h264-conformance/SVA_NL2_E.264
+
+FATE_API_SAMPLES_LIBAVFORMAT-$(call DEMDEC, H264, H264) += fate-api-h264-slice
+fate-api-h264-slice: $(APITESTSDIR)/api-h264-slice-test$(EXESUF)
+fate-api-h264-slice: CMD = run $(APITESTSDIR)/api-h264-slice-test$(EXESUF) 2 $(TARGET_SAMPLES)/h264/crew_cif.nal
 
 FATE_API_LIBAVFORMAT-$(call DEMDEC, FLV, FLV) += fate-api-seek
-fate-api-seek: $(APITESTSDIR)/api-seek-test$(EXESUF) fate-lavf-flv_fmt
-fate-api-seek: CMD = run $(APITESTSDIR)/api-seek-test $(TARGET_PATH)/tests/data/lavf/lavf.flv 0 720
+fate-api-seek: $(APITESTSDIR)/api-seek-test$(EXESUF) fate-lavf-flv
+fate-api-seek: CMD = run $(APITESTSDIR)/api-seek-test$(EXESUF) $(TARGET_PATH)/tests/data/lavf/lavf.flv 0 720
 fate-api-seek: CMP = null
 
 FATE_API_SAMPLES_LIBAVFORMAT-$(call DEMDEC, IMAGE2, PNG) += fate-api-png-codec-param
 fate-api-png-codec-param: $(APITESTSDIR)/api-codec-param-test$(EXESUF)
-fate-api-png-codec-param: CMD = run $(APITESTSDIR)/api-codec-param-test $(TARGET_SAMPLES)/png1/lena-rgba.png
+fate-api-png-codec-param: CMD = run $(APITESTSDIR)/api-codec-param-test$(EXESUF) $(TARGET_SAMPLES)/png1/lena-rgba.png
 
 FATE_API_SAMPLES_LIBAVFORMAT-$(call DEMDEC, IMAGE2, MJPEG) += fate-api-mjpeg-codec-param
 fate-api-mjpeg-codec-param: $(APITESTSDIR)/api-codec-param-test$(EXESUF)
-fate-api-mjpeg-codec-param: CMD = run $(APITESTSDIR)/api-codec-param-test $(TARGET_SAMPLES)/exif/image_small.jpg
+fate-api-mjpeg-codec-param: CMD = run $(APITESTSDIR)/api-codec-param-test$(EXESUF) $(TARGET_SAMPLES)/exif/image_small.jpg
 
 FATE_API-$(HAVE_THREADS) += fate-api-threadmessage
 fate-api-threadmessage: $(APITESTSDIR)/api-threadmessage-test$(EXESUF)
-fate-api-threadmessage: CMD = run $(APITESTSDIR)/api-threadmessage-test 3 10 30 50 2 20 40
+fate-api-threadmessage: CMD = run $(APITESTSDIR)/api-threadmessage-test$(EXESUF) 3 10 30 50 2 20 40
 fate-api-threadmessage: CMP = null
 
 FATE_API_SAMPLES-$(CONFIG_AVFORMAT) += $(FATE_API_SAMPLES_LIBAVFORMAT-yes)
diff --git a/tests/fate/audio.mak b/tests/fate/audio.mak
index 4fab472..c41958e 100644
--- a/tests/fate/audio.mak
+++ b/tests/fate/audio.mak
@@ -28,6 +28,11 @@
 fate-dss-lp: CMD = framecrc -i $(TARGET_SAMPLES)/dss/lp.dss -frames 30
 fate-dss-sp: CMD = framecrc -i $(TARGET_SAMPLES)/dss/sp.dss -frames 30
 
+FATE_SAMPLES_AUDIO-$(call DEMDEC, DSF, DST) += fate-dsf-dst
+fate-dsf-dst: CMD = pcm -i $(TARGET_SAMPLES)/dst/dst-64fs44-2ch.dff
+fate-dsf-dst: CMP = oneoff
+fate-dsf-dst: REF = $(SAMPLES)/dst/dst-64fs44-2ch.pcm
+
 FATE_SAMPLES_AUDIO-$(call DEMDEC, AVI, IMC) += fate-imc
 fate-imc: CMD = pcm -i $(TARGET_SAMPLES)/imc/imc.avi
 fate-imc: CMP = oneoff
diff --git a/tests/fate/avformat.mak b/tests/fate/avformat.mak
deleted file mode 100644
index a12f9cc..0000000
--- a/tests/fate/avformat.mak
+++ /dev/null
@@ -1,142 +0,0 @@
-FATE_LAVF-$(call ENCDEC,  PCM_S16BE,             AIFF)               += aiff
-FATE_LAVF-$(call ENCDEC,  PCM_ALAW,              PCM_ALAW)           += alaw
-FATE_LAVF-$(call ENCDEC,  APNG,                  APNG)               += apng
-FATE_LAVF-$(call ENCDEC2, MSMPEG4V3,  MP2,       ASF)                += asf
-FATE_LAVF-$(call ENCDEC,  PCM_S16BE_PLANAR,      AST)                += ast
-FATE_LAVF-$(call ENCDEC,  PCM_S16BE,             AU)                 += au
-FATE_LAVF-$(call ENCDEC2, MPEG4,      MP2,       AVI)                += avi
-FATE_LAVF-$(call ENCDEC,  BMP,                   IMAGE2)             += bmp
-FATE_LAVF-$(call ENCDEC,  PCM_S16BE,             CAF)                += caf
-FATE_LAVF-$(call ENCDEC,  DPX,                   IMAGE2)             += dpx
-FATE_LAVF-$(call ENCDEC2, DVVIDEO,    PCM_S16LE, AVI)                += dv_fmt
-FATE_LAVF-$(call ENCDEC,  FITS,                  FITS)               += fits
-FATE_LAVF-$(call ENCDEC,  RAWVIDEO,              FILMSTRIP)          += flm
-FATE_LAVF-$(call ENCDEC,  FLV,                   FLV)                += flv_fmt
-FATE_LAVF-$(call ENCDEC,  GIF,                   IMAGE2)             += gif
-FATE_LAVF-$(call ENCDEC2, MPEG2VIDEO, PCM_S16LE, GXF)                += gxf
-FATE_LAVF-$(call ENCDEC,  PCM_S16LE,             IRCAM)              += ircam
-FATE_LAVF-$(call ENCDEC,  MJPEG,                 IMAGE2)             += jpg
-FATE_LAVF-$(call ENCMUX,  TTA,                   MATROSKA_AUDIO)     += mka
-FATE_LAVF-$(call ENCDEC2, MPEG4,      MP2,       MATROSKA)           += mkv
-FATE_LAVF-$(call ENCDEC,  ADPCM_YAMAHA,          MMF)                += mmf
-FATE_LAVF-$(call ENCDEC2, MPEG4,      PCM_ALAW,  MOV)                += mov ismv
-FATE_LAVF-$(call ENCDEC2, MPEG1VIDEO, MP2,       MPEG1SYSTEM MPEGPS) += mpg
-FATE_LAVF-$(call ENCDEC,  PCM_MULAW,             PCM_MULAW)          += mulaw
-FATE_LAVF-$(call ENCDEC2, MPEG2VIDEO, PCM_S16LE, MXF)                += mxf
-FATE_LAVF-$(call ENCDEC2, MPEG2VIDEO, PCM_S16LE, MXF_D10 MXF)        += mxf_d10
-FATE_LAVF-$(call ENCDEC2, DVVIDEO,    PCM_S16LE, MXF)                += mxf_dv25
-FATE_LAVF-$(call ENCDEC2, DVVIDEO,    PCM_S16LE, MXF)                += mxf_dvcpro50
-FATE_LAVF-$(call ENCDEC2, DNXHD,      PCM_S16LE, MXF_OPATOM MXF)     += mxf_opatom
-FATE_LAVF-$(call ENCDEC2, DNXHD,      PCM_S16LE, MXF_OPATOM MXF)     += mxf_opatom_audio
-FATE_LAVF-$(call ENCDEC2, MPEG4,      MP2,       NUT)                += nut
-FATE_LAVF-$(call ENCDEC,  FLAC,                  OGG)                += ogg
-FATE_LAVF-$(call ENCDEC,  PAM,                   IMAGE2)             += pam
-FATE_LAVF-$(call ENCDEC,  PBM,                   IMAGE2PIPE)         += pbmpipe
-FATE_LAVF-$(call ENCDEC,  PCX,                   IMAGE2)             += pcx
-FATE_LAVF-$(call ENCDEC,  PGM,                   IMAGE2)             += pgm
-FATE_LAVF-$(call ENCDEC,  PGM,                   IMAGE2PIPE)         += pgmpipe
-FATE_LAVF-$(call ENCDEC,  PNG,                   IMAGE2)             += png
-FATE_LAVF-$(call ENCDEC,  PPM,                   IMAGE2)             += ppm
-FATE_LAVF-$(call ENCDEC,  PPM,                   IMAGE2PIPE)         += ppmpipe
-FATE_LAVF-$(call ENCMUX,  RV10 AC3_FIXED,        RM)                 += rm
-FATE_LAVF-$(call ENCDEC,  PCM_U8,                RSO)                += rso
-FATE_LAVF-$(call ENCDEC,  SGI,                   IMAGE2)             += sgi
-FATE_LAVF-$(call ENCMUX,  MJPEG PCM_S16LE,       SMJPEG)             += smjpeg
-FATE_LAVF-$(call ENCDEC,  PCM_S16LE,             SOX)                += sox
-FATE_LAVF-$(call ENCDEC,  SUNRAST,               IMAGE2)             += sunrast
-FATE_LAVF-$(call ENCDEC,  FLV,                   SWF)                += swf
-FATE_LAVF-$(call ENCDEC,  TARGA,                 IMAGE2)             += tga
-FATE_LAVF-$(call ENCDEC,  TIFF,                  IMAGE2)             += tiff
-FATE_LAVF-$(call ENCDEC2, MPEG2VIDEO, MP2,       MPEGTS)             += ts
-FATE_LAVF-$(call ENCDEC,  TTA,                   TTA)                += tta
-FATE_LAVF-$(call ENCDEC,  PCM_U8,                VOC)                += voc
-FATE_LAVF-$(call ENCDEC,  PCM_S16LE,             VOC)                += voc_s16
-FATE_LAVF-$(call ENCDEC,  PCM_S16LE,             WAV)                += wav
-FATE_LAVF-$(call ENCDEC,  PCM_S16LE,             WAV)                += wav_peak
-FATE_LAVF-$(call ENCDEC,  PCM_S16LE,             WAV)                += wav_peak_only
-FATE_LAVF-$(call ENCMUX,  PCM_S16LE,             W64)                += w64
-FATE_LAVF-$(call ENCDEC,  MP2,                   WTV)                += wtv
-FATE_LAVF-$(call ENCDEC,  WAVPACK,               WV)                 += wv
-FATE_LAVF-$(call ENCDEC,  XBM,                   IMAGE2)             += xbm
-FATE_LAVF-$(call ENCDEC,  XWD,                   IMAGE2)             += xwd
-FATE_LAVF-$(CONFIG_YUV4MPEGPIPE_MUXER)                               += yuv4mpeg
-
-FATE_LAVF += $(FATE_LAVF-yes:%=fate-lavf-%)
-FATE_LAVF_PIXFMT-$(CONFIG_SCALE_FILTER) += fate-lavf-pixfmt
-FATE_LAVF += $(FATE_LAVF_PIXFMT-yes)
-
-$(FATE_LAVF): $(AREF) $(VREF)
-$(FATE_LAVF): CMD = lavftest
-$(FATE_LAVF): CMP =
-
-FATE_AVCONV += $(FATE_LAVF)
-fate-lavf:     $(FATE_LAVF)
-
-FATE_LAVF_FATE-$(call ALLYES, MATROSKA_DEMUXER   OGG_MUXER)          += ogg_vp3
-FATE_LAVF_FATE-$(call ALLYES, MATROSKA_DEMUXER   OGV_MUXER)          += ogg_vp8
-FATE_LAVF_FATE-$(call ALLYES, MOV_DEMUXER        LATM_MUXER)         += latm
-FATE_LAVF_FATE-$(call ALLYES, MP3_DEMUXER        MP3_MUXER)          += mp3
-FATE_LAVF_FATE-$(call ALLYES, MOV_DEMUXER        MOV_MUXER)          += mov_qtrle_mace6
-FATE_LAVF_FATE-$(call ALLYES, AVI_DEMUXER        AVI_MUXER)          += avi_cram
-
-FATE_LAVF_FATE +=  $(FATE_LAVF_FATE-yes:%=fate-lavf-fate-%)
-$(FATE_LAVF_FATE): CMD = lavffatetest
-
-FATE_SAMPLES_FFMPEG += $(FATE_LAVF_FATE)
-fate-lavf-fate:        $(FATE_LAVF_FATE)
-
-tests/data/mp4-to-ts.m3u8: TAG = GEN
-tests/data/mp4-to-ts.m3u8: ffmpeg$(PROGSSUF)$(EXESUF) | tests/data
-	$(M)$(TARGET_EXEC) $(TARGET_PATH)/$< \
-        -i $(TARGET_SAMPLES)/h264/interlaced_crop.mp4 \
-        -f ssegment -segment_time 1 -map 0 -flags +bitexact -codec copy \
-        -segment_list $(TARGET_PATH)/$@ -y $(TARGET_PATH)/tests/data/mp4-to-ts-%03d.ts 2>/dev/null
-
-tests/data/adts-to-mkv.m3u8: TAG = GEN
-tests/data/adts-to-mkv.m3u8: ffmpeg$(PROGSSUF)$(EXESUF) | tests/data
-	$(M)$(TARGET_EXEC) $(TARGET_PATH)/$< \
-        -i $(TARGET_SAMPLES)/audiomatch/tones_afconvert_16000_mono_aac_lc.m4a \
-        -f segment -segment_time 1 -map 0 -flags +bitexact -codec copy -segment_format_options live=1 \
-        -segment_list $(TARGET_PATH)/$@ -y $(TARGET_PATH)/tests/data/adts-to-mkv-%03d.mkv 2>/dev/null
-
-tests/data/adts-to-mkv-header.mkv: TAG = GEN
-tests/data/adts-to-mkv-header.mkv: ffmpeg$(PROGSSUF)$(EXESUF) | tests/data
-	$(M)$(TARGET_EXEC) $(TARGET_PATH)/$< \
-        -i $(TARGET_SAMPLES)/audiomatch/tones_afconvert_16000_mono_aac_lc.m4a \
-        -f segment -segment_time 1 -map 0 -flags +bitexact -codec copy -segment_format_options live=1 \
-        -segment_header_filename $(TARGET_PATH)/tests/data/adts-to-mkv-header.mkv \
-        -y $(TARGET_PATH)/tests/data/adts-to-mkv-header-%03d.mkv 2>/dev/null
-
-tests/data/adts-to-mkv-header-%.mkv: tests/data/adts-to-mkv-header.mkv ;
-
-FATE_SEGMENT_PARTS += 000 001 002
-
-tests/data/adts-to-mkv-cated-all.mkv: TAG = GEN
-tests/data/adts-to-mkv-cated-all.mkv: tests/data/adts-to-mkv-header.mkv $(FATE_SEGMENT_PARTS:%=tests/data/adts-to-mkv-header-%.mkv) | tests/data
-	$(M)cat $^ >$@
-
-tests/data/adts-to-mkv-cated-%.mkv: TAG = GEN
-tests/data/adts-to-mkv-cated-%.mkv: tests/data/adts-to-mkv-header.mkv tests/data/adts-to-mkv-header-%.mkv | tests/data
-	$(M)cat $^ >$@
-
-FATE_SEGMENT += fate-segment-mp4-to-ts
-fate-segment-mp4-to-ts: tests/data/mp4-to-ts.m3u8
-fate-segment-mp4-to-ts: CMD = framecrc -flags +bitexact -i $(TARGET_PATH)/tests/data/mp4-to-ts.m3u8 -c copy
-FATE_SEGMENT-$(call ALLYES, MOV_DEMUXER H264_MP4TOANNEXB_BSF MPEGTS_MUXER MATROSKA_DEMUXER SEGMENT_MUXER HLS_DEMUXER) += fate-segment-mp4-to-ts
-
-FATE_SEGMENT += fate-segment-adts-to-mkv
-fate-segment-adts-to-mkv: tests/data/adts-to-mkv.m3u8
-fate-segment-adts-to-mkv: CMD = framecrc -flags +bitexact -i $(TARGET_PATH)/tests/data/adts-to-mkv.m3u8 -c copy
-fate-segment-adts-to-mkv: REF = $(SRC_PATH)/tests/ref/fate/segment-adts-to-mkv-header-all
-FATE_SEGMENT-$(call ALLYES, AAC_DEMUXER AAC_ADTSTOASC_BSF MATROSKA_MUXER MATROSKA_DEMUXER SEGMENT_MUXER HLS_DEMUXER) += fate-segment-adts-to-mkv
-
-FATE_SEGMENT_ALLPARTS = $(FATE_SEGMENT_PARTS)
-FATE_SEGMENT_ALLPARTS += all
-FATE_SEGMENT_SPLIT += $(FATE_SEGMENT_ALLPARTS:%=fate-segment-adts-to-mkv-header-%)
-$(foreach N,$(FATE_SEGMENT_ALLPARTS),$(eval $(N:%=fate-segment-adts-to-mkv-header-%): tests/data/adts-to-mkv-cated-$(N).mkv))
-fate-segment-adts-to-mkv-header-%: CMD = framecrc -flags +bitexact -i $(TARGET_PATH)/tests/data/$(@:fate-segment-adts-to-mkv-header-%=adts-to-mkv-cated-%).mkv -c copy
-FATE_SEGMENT-$(call ALLYES, AAC_DEMUXER AAC_ADTSTOASC_BSF MATROSKA_MUXER MATROSKA_DEMUXER SEGMENT_MUXER HLS_DEMUXER) += $(FATE_SEGMENT_SPLIT)
-
-FATE_SAMPLES_FFMPEG += $(FATE_SEGMENT-yes)
-
-fate-segment: $(FATE_SEGMENT-yes)
diff --git a/tests/fate/cbs.mak b/tests/fate/cbs.mak
index 911e770..ad9c858 100644
--- a/tests/fate/cbs.mak
+++ b/tests/fate/cbs.mak
@@ -2,7 +2,7 @@
 # arguments, it decomposes the stream fully and then recomposes it
 # without making any changes.
 
-fate-cbs: fate-cbs-h264 fate-cbs-hevc fate-cbs-mpeg2 fate-cbs-vp9
+fate-cbs: fate-cbs-av1 fate-cbs-h264 fate-cbs-hevc fate-cbs-mpeg2 fate-cbs-vp9
 
 FATE_CBS_DEPS = $(call ALLYES, $(1)_DEMUXER $(2)_PARSER $(3)_METADATA_BSF $(4)_DECODER $(5)_MUXER)
 
@@ -12,6 +12,35 @@
 fate-cbs-$(1)-$(2): CMD = md5 -i $(TARGET_SAMPLES)/$(3) -c:v copy -y -bsf:v $(1)_metadata -f $(4)
 endef
 
+# AV1 read/write
+
+FATE_CBS_AV1_CONFORMANCE_SAMPLES = \
+    av1-1-b8-02-allintra.ivf       \
+    av1-1-b8-03-sizedown.ivf       \
+    av1-1-b8-03-sizeup.ivf         \
+    av1-1-b8-04-cdfupdate.ivf      \
+    av1-1-b8-05-mv.ivf             \
+    av1-1-b8-06-mfmv.ivf           \
+    av1-1-b8-22-svc-L1T2.ivf       \
+    av1-1-b8-22-svc-L2T1.ivf       \
+    av1-1-b8-22-svc-L2T2.ivf       \
+    av1-1-b8-23-film_grain-50.ivf  \
+    av1-1-b10-23-film_grain-50.ivf
+
+FATE_CBS_AV1_SAMPLES =              \
+    decode_model.ivf                \
+    frames_refs_short_signaling.ivf \
+    non_uniform_tiling.ivf          \
+    seq_hdr_op_param_info.ivf       \
+    switch_frame.ivf
+
+$(foreach N,$(FATE_CBS_AV1_CONFORMANCE_SAMPLES),$(eval $(call FATE_CBS_TEST,av1,$(basename $(N)),av1-test-vectors/$(N),rawvideo)))
+$(foreach N,$(FATE_CBS_AV1_SAMPLES),$(eval $(call FATE_CBS_TEST,av1,$(basename $(N)),av1/$(N),rawvideo)))
+
+FATE_CBS_AV1-$(call ALLYES, IVF_DEMUXER AV1_PARSER AV1_METADATA_BSF RAWVIDEO_MUXER) = $(FATE_CBS_av1)
+FATE_SAMPLES_AVCONV += $(FATE_CBS_AV1-yes)
+fate-cbs-av1: $(FATE_CBS_AV1-yes)
+
 # H.264 read/write
 
 FATE_CBS_H264_CONFORMANCE_SAMPLES = \
@@ -61,7 +90,8 @@
     LTRPSPS_A_Qualcomm_1.bit  \
     RPLM_A_qualcomm_4.bit     \
     CONFWIN_A_Sony_1.bit      \
-    HRD_A_Fujitsu_2.bit
+    HRD_A_Fujitsu_2.bit       \
+    SLPPLP_A_VIDYO_2.bit
 
 $(foreach N,$(FATE_CBS_HEVC_SAMPLES),$(eval $(call FATE_CBS_TEST,hevc,$(basename $(N)),hevc-conformance/$(N),hevc)))
 
diff --git a/tests/fate/checkasm.mak b/tests/fate/checkasm.mak
index a722b4a..b391717 100644
--- a/tests/fate/checkasm.mak
+++ b/tests/fate/checkasm.mak
@@ -1,4 +1,5 @@
 FATE_CHECKASM = fate-checkasm-aacpsdsp                                  \
+                fate-checkasm-af_afir                                   \
                 fate-checkasm-alacdsp                                   \
                 fate-checkasm-audiodsp                                  \
                 fate-checkasm-blockdsp                                  \
@@ -18,13 +19,17 @@
                 fate-checkasm-jpeg2000dsp                               \
                 fate-checkasm-llviddsp                                  \
                 fate-checkasm-llviddspenc                               \
+                fate-checkasm-opusdsp                                   \
                 fate-checkasm-pixblockdsp                               \
                 fate-checkasm-sbrdsp                                    \
                 fate-checkasm-synth_filter                              \
                 fate-checkasm-sw_rgb                                    \
+                fate-checkasm-v210dec                                   \
                 fate-checkasm-v210enc                                   \
                 fate-checkasm-vf_blend                                  \
                 fate-checkasm-vf_colorspace                             \
+                fate-checkasm-vf_eq                                     \
+                fate-checkasm-vf_gblur                                  \
                 fate-checkasm-vf_hflip                                  \
                 fate-checkasm-vf_threshold                              \
                 fate-checkasm-videodsp                                  \
@@ -32,7 +37,7 @@
                 fate-checkasm-vp9dsp                                    \
 
 $(FATE_CHECKASM): tests/checkasm/checkasm$(EXESUF)
-$(FATE_CHECKASM): CMD = run tests/checkasm/checkasm --test=$(@:fate-checkasm-%=%)
+$(FATE_CHECKASM): CMD = run tests/checkasm/checkasm$(EXESUF) --test=$(@:fate-checkasm-%=%)
 $(FATE_CHECKASM): CMP = null
 
 FATE += $(FATE_CHECKASM)
diff --git a/tests/fate/demux.mak b/tests/fate/demux.mak
index eb8d8c3..9f3a6be 100644
--- a/tests/fate/demux.mak
+++ b/tests/fate/demux.mak
@@ -10,6 +10,9 @@
 FATE_SAMPLES_DEMUX-$(CONFIG_AEA_DEMUXER) += fate-aea-demux
 fate-aea-demux: CMD = crc -i $(TARGET_SAMPLES)/aea/chirp.aea -c:a copy
 
+FATE_SAMPLES_DEMUX-$(CONFIG_AV1_DEMUXER) += fate-av1-annexb-demux
+fate-av1-annexb-demux: CMD = framecrc -i $(TARGET_SAMPLES)/av1/annexb.obu -c:v copy
+
 FATE_SAMPLES_DEMUX-$(CONFIG_AST_DEMUXER) += fate-ast
 fate-ast: CMD = crc -i $(TARGET_SAMPLES)/ast/demo11_02_partial.ast -c copy
 
diff --git a/tests/fate/dnn.mak b/tests/fate/dnn.mak
new file mode 100644
index 0000000..5a8e629
--- /dev/null
+++ b/tests/fate/dnn.mak
@@ -0,0 +1,28 @@
+FATE_DNN += fate-dnn-layer-pad
+fate-dnn-layer-pad: $(DNNTESTSDIR)/dnn-layer-pad-test$(EXESUF)
+fate-dnn-layer-pad: CMD = run $(DNNTESTSDIR)/dnn-layer-pad-test$(EXESUF)
+fate-dnn-layer-pad: CMP = null
+
+FATE_DNN += fate-dnn-layer-conv2d
+fate-dnn-layer-conv2d: $(DNNTESTSDIR)/dnn-layer-conv2d-test$(EXESUF)
+fate-dnn-layer-conv2d: CMD = run $(DNNTESTSDIR)/dnn-layer-conv2d-test$(EXESUF)
+fate-dnn-layer-conv2d: CMP = null
+
+FATE_DNN += fate-dnn-layer-depth2space
+fate-dnn-layer-depth2space: $(DNNTESTSDIR)/dnn-layer-depth2space-test$(EXESUF)
+fate-dnn-layer-depth2space: CMD = run $(DNNTESTSDIR)/dnn-layer-depth2space-test$(EXESUF)
+fate-dnn-layer-depth2space: CMP = null
+
+FATE_DNN += fate-dnn-layer-mathbinary
+fate-dnn-layer-mathbinary: $(DNNTESTSDIR)/dnn-layer-mathbinary-test$(EXESUF)
+fate-dnn-layer-mathbinary: CMD = run $(DNNTESTSDIR)/dnn-layer-mathbinary-test$(EXESUF)
+fate-dnn-layer-mathbinary: CMP = null
+
+FATE_DNN += fate-dnn-layer-maximum
+fate-dnn-layer-maximum: $(DNNTESTSDIR)/dnn-layer-maximum-test$(EXESUF)
+fate-dnn-layer-maximum: CMD = run $(DNNTESTSDIR)/dnn-layer-maximum-test$(EXESUF)
+fate-dnn-layer-maximum: CMP = null
+
+FATE-yes += $(FATE_DNN)
+
+fate-dnn: $(FATE_DNN)
diff --git a/tests/fate/ffmpeg.mak b/tests/fate/ffmpeg.mak
index 0975af2..0b0610f 100644
--- a/tests/fate/ffmpeg.mak
+++ b/tests/fate/ffmpeg.mak
@@ -56,6 +56,25 @@
   -filter_complex "sws_flags=+accurate_rnd+bitexact\;[0:0]scale=720:480[v]\;[v][1:0]overlay[v2]" \
   -map "[v2]" -c:v rawvideo -map 1:s -c:s dvdsub
 
+# Very basic sub2video example, decode and convert to AVFrame with sub2video.
+# Attempt to not touch timestamps.
+FATE_SAMPLES_FFMPEG-$(call ALLYES, VOBSUB_DEMUXER DVDSUB_DECODER AVFILTER) += fate-sub2video_basic
+fate-sub2video_basic: CMD = framecrc \
+  -i $(TARGET_SAMPLES)/sub/vobsub.idx \
+  -vsync passthrough -copyts \
+  -filter_complex "sws_flags=+accurate_rnd+bitexact\;[0:s:0]scale" \
+  -c:v rawvideo
+
+# Time-limited run with a sample that doesn't require seeking and
+# contains samples within the initial period.
+FATE_SAMPLES_FFMPEG-$(call ALLYES, SUP_DEMUXER PGSSUB_DECODER AVFILTER) += fate-sub2video_time_limited
+fate-sub2video_time_limited: CMD = framecrc \
+  -i $(TARGET_SAMPLES)/sub/pgs_sub.sup \
+  -vsync passthrough -copyts \
+  -t 15 \
+  -filter_complex "sws_flags=+accurate_rnd+bitexact\;[0:s:0]scale" \
+  -c:v rawvideo
+
 FATE_FFMPEG-$(call ALLYES, PCM_S16LE_DEMUXER PCM_S16LE_MUXER PCM_S16LE_DECODER PCM_S16LE_ENCODER) += fate-unknown_layout-pcm
 fate-unknown_layout-pcm: $(AREF)
 fate-unknown_layout-pcm: CMD = md5 \
@@ -69,55 +88,63 @@
 
 
 FATE_STREAMCOPY-$(call ALLYES, EAC3_DEMUXER MOV_MUXER) += fate-copy-trac3074
-fate-copy-trac3074: $(TARGET_SAMPLES)/eac3/csi_miami_stereo_128_spx.eac3
+fate-copy-trac3074: $(SAMPLES)/eac3/csi_miami_stereo_128_spx.eac3
 fate-copy-trac3074: CMD = transcode eac3 $(TARGET_SAMPLES)/eac3/csi_miami_stereo_128_spx.eac3\
                      mp4 "-codec copy -map 0" "-codec copy"
 
 FATE_STREAMCOPY-$(call ALLYES, MOV_DEMUXER MOV_MUXER) += fate-copy-trac236
-fate-copy-trac236: $(TARGET_SAMPLES)/mov/fcp_export8-236.mov
+fate-copy-trac236: $(SAMPLES)/mov/fcp_export8-236.mov
 fate-copy-trac236: CMD = transcode mov $(TARGET_SAMPLES)/mov/fcp_export8-236.mov\
                      mov "-codec copy -map 0"
 
 FATE_STREAMCOPY-$(call ALLYES, MPEGTS_DEMUXER MXF_MUXER PCM_S16LE_ENCODER) += fate-copy-trac4914
-fate-copy-trac4914: $(TARGET_SAMPLES)/mpeg2/xdcam8mp2-1s_small.ts
+fate-copy-trac4914: $(SAMPLES)/mpeg2/xdcam8mp2-1s_small.ts
 fate-copy-trac4914: CMD = transcode mpegts $(TARGET_SAMPLES)/mpeg2/xdcam8mp2-1s_small.ts\
                       mxf "-c:a pcm_s16le -c:v copy"
 
 FATE_STREAMCOPY-$(call ALLYES, MPEGTS_DEMUXER AVI_MUXER) += fate-copy-trac4914-avi
-fate-copy-trac4914-avi: $(TARGET_SAMPLES)/mpeg2/xdcam8mp2-1s_small.ts
+fate-copy-trac4914-avi: $(SAMPLES)/mpeg2/xdcam8mp2-1s_small.ts
 fate-copy-trac4914-avi: CMD = transcode mpegts $(TARGET_SAMPLES)/mpeg2/xdcam8mp2-1s_small.ts\
                           avi "-c:a copy -c:v copy"
 
 FATE_STREAMCOPY-$(call ALLYES, H264_DEMUXER AVI_MUXER) += fate-copy-trac2211-avi
-fate-copy-trac2211-avi: $(TARGET_SAMPLES)/h264/bbc2.sample.h264
+fate-copy-trac2211-avi: $(SAMPLES)/h264/bbc2.sample.h264
 fate-copy-trac2211-avi: CMD = transcode "h264 -r 14" $(TARGET_SAMPLES)/h264/bbc2.sample.h264\
                           avi "-c:a copy -c:v copy"
 
+FATE_STREAMCOPY-$(call ENCDEC, APNG, APNG) += fate-copy-apng
+fate-copy-apng: fate-lavf-apng
+fate-copy-apng: CMD = transcode apng tests/data/lavf/lavf.apng apng "-c:v copy"
+
 FATE_STREAMCOPY-$(call DEMMUX, OGG, OGG) += fate-limited_input_seek fate-limited_input_seek-copyts
-fate-limited_input_seek: $(TARGET_SAMPLES)/vorbis/moog_small.ogg
+fate-limited_input_seek: $(SAMPLES)/vorbis/moog_small.ogg
 fate-limited_input_seek: CMD = md5 -ss 1.5 -t 1.3 -i $(TARGET_SAMPLES)/vorbis/moog_small.ogg -c:a copy -fflags +bitexact -f ogg
-fate-limited_input_seek-copyts: $(TARGET_SAMPLES)/vorbis/moog_small.ogg
+fate-limited_input_seek-copyts: $(SAMPLES)/vorbis/moog_small.ogg
 fate-limited_input_seek-copyts: CMD = md5 -ss 1.5 -t 1.3 -i $(TARGET_SAMPLES)/vorbis/moog_small.ogg -c:a copy -copyts -fflags +bitexact -f ogg
 
 FATE_STREAMCOPY-$(call ALLYES, MOV_DEMUXER MOV_MUXER) += fate-copy-psp
-fate-copy-psp: $(TARGET_SAMPLES)/h264/wwwq_cut.mp4
+fate-copy-psp: $(SAMPLES)/h264/wwwq_cut.mp4
 fate-copy-psp: CMD = transcode "mov" $(TARGET_SAMPLES)/h264/wwwq_cut.mp4\
                       psp "-c copy" "-codec copy"
 
+FATE_STREAMCOPY-$(CONFIG_FLV_DEMUXER) += fate-ffmpeg-streamloop
+fate-ffmpeg-streamloop: $(SAMPLES)/flv/streamloop.flv
+fate-ffmpeg-streamloop: CMD = framemd5 -stream_loop 2 -i $(TARGET_SAMPLES)/flv/streamloop.flv -c copy
+
 fate-streamcopy: $(FATE_STREAMCOPY-yes)
 
 FATE_SAMPLES_FFMPEG-$(call ALLYES, MOV_DEMUXER MATROSKA_MUXER) += fate-rgb24-mkv
-fate-rgb24-mkv: $(TARGET_SAMPLES)/qtrle/aletrek-rle.mov
+fate-rgb24-mkv: $(SAMPLES)/qtrle/aletrek-rle.mov
 fate-rgb24-mkv: CMD = transcode "mov" $(TARGET_SAMPLES)/qtrle/aletrek-rle.mov\
                       matroska "-c:v rawvideo -pix_fmt rgb24 -allow_raw_vfw 1 -frames:v 1"
 
 FATE_SAMPLES_FFMPEG-$(call ALLYES, AAC_DEMUXER MOV_MUXER) += fate-adtstoasc_ticket3715
-fate-adtstoasc_ticket3715: $(TARGET_SAMPLES)/aac/foo.aac
+fate-adtstoasc_ticket3715: $(SAMPLES)/aac/foo.aac
 fate-adtstoasc_ticket3715: CMD = transcode "aac" $(TARGET_SAMPLES)/aac/foo.aac\
                       mov "-c copy -bsf:a aac_adtstoasc" "-codec copy"
 
 FATE_SAMPLES_FFMPEG-$(call ALLYES, MOV_DEMUXER H264_MUXER H264_MP4TOANNEXB_BSF) += fate-h264_mp4toannexb_ticket2991
-fate-h264_mp4toannexb_ticket2991: $(TARGET_SAMPLES)/h264/wwwq_cut.mp4
+fate-h264_mp4toannexb_ticket2991: $(SAMPLES)/h264/wwwq_cut.mp4
 fate-h264_mp4toannexb_ticket2991: CMD = transcode "mp4" $(TARGET_SAMPLES)/h264/wwwq_cut.mp4\
                                   h264 "-c:v copy -bsf:v h264_mp4toannexb" "-codec copy"
 
@@ -128,13 +155,13 @@
                                           h264 "-c:v copy -an" "-c:v copy"
 
 FATE_SAMPLES_FFMPEG-$(call ALLYES, MPEGPS_DEMUXER AVI_MUXER REMOVE_EXTRADATA_BSF) += fate-ffmpeg-bsf-remove-k fate-ffmpeg-bsf-remove-r fate-ffmpeg-bsf-remove-e
-fate-ffmpeg-bsf-remove-k: $(TARGET_SAMPLES)/mpeg2/matrixbench_mpeg2.lq1.mpg
+fate-ffmpeg-bsf-remove-k: $(SAMPLES)/mpeg2/matrixbench_mpeg2.lq1.mpg
 fate-ffmpeg-bsf-remove-k: CMD = transcode "mpeg" $(TARGET_SAMPLES)/mpeg2/matrixbench_mpeg2.lq1.mpg\
                           avi "-vbsf remove_extra=k" "-codec copy"
-fate-ffmpeg-bsf-remove-r: $(TARGET_SAMPLES)/mpeg2/matrixbench_mpeg2.lq1.mpg
+fate-ffmpeg-bsf-remove-r: $(SAMPLES)/mpeg2/matrixbench_mpeg2.lq1.mpg
 fate-ffmpeg-bsf-remove-r: CMD = transcode "mpeg" $(TARGET_SAMPLES)/mpeg2/matrixbench_mpeg2.lq1.mpg\
                           avi "-vbsf remove_extra=keyframe" "-codec copy"
-fate-ffmpeg-bsf-remove-e: $(TARGET_SAMPLES)/mpeg2/matrixbench_mpeg2.lq1.mpg
+fate-ffmpeg-bsf-remove-e: $(SAMPLES)/mpeg2/matrixbench_mpeg2.lq1.mpg
 fate-ffmpeg-bsf-remove-e: CMD = transcode "mpeg" $(TARGET_SAMPLES)/mpeg2/matrixbench_mpeg2.lq1.mpg\
                           avi "-vbsf remove_extra=e" "-codec copy"
 
@@ -142,7 +169,7 @@
 FATE_SAMPLES_FFMPEG-yes += $(FATE_STREAMCOPY-yes)
 
 FATE_TIME_BASE-$(call ALLYES, MPEGPS_DEMUXER MXF_MUXER) += fate-time_base
-fate-time_base: $(TARGET_SAMPLES)/mpeg2/dvd_single_frame.vob
+fate-time_base: $(SAMPLES)/mpeg2/dvd_single_frame.vob
 fate-time_base: CMD = md5 -i $(TARGET_SAMPLES)/mpeg2/dvd_single_frame.vob -an -sn -c:v copy -r 25 -time_base 1001:30000 -fflags +bitexact -f mxf
 
 FATE_SAMPLES_FFMPEG-yes += $(FATE_TIME_BASE-yes)
diff --git a/tests/fate/ffprobe.mak b/tests/fate/ffprobe.mak
index d5fb05c..c867beb 100644
--- a/tests/fate/ffprobe.mak
+++ b/tests/fate/ffprobe.mak
@@ -1,5 +1,5 @@
 FFPROBE_TEST_FILE=tests/data/ffprobe-test.nut
-FFPROBE_COMMAND=ffprobe$(PROGSSUF)$(EXESUF) -show_streams -show_packets -show_format -show_frames -bitexact $(FFPROBE_TEST_FILE)
+FFPROBE_COMMAND=ffprobe$(PROGSSUF)$(EXESUF) -show_streams -show_packets -show_format -show_frames -bitexact $(TARGET_PATH)/$(FFPROBE_TEST_FILE) -print_filename $(FFPROBE_TEST_FILE)
 
 FATE_FFPROBE-$(CONFIG_AVDEVICE) += fate-ffprobe_compact
 fate-ffprobe_compact: $(FFPROBE_TEST_FILE)
diff --git a/tests/fate/fft.mak b/tests/fate/fft.mak
index c7c26cd..5da6e68 100644
--- a/tests/fate/fft.mak
+++ b/tests/fate/fft.mak
@@ -24,7 +24,7 @@
 FATE_FFT_ALL = $(FATE_DCT-yes) $(FATE_FFT-yes) $(FATE_MDCT-yes) $(FATE_RDFT-yes)
 
 $(FATE_FFT_ALL): libavcodec/tests/fft$(EXESUF)
-$(FATE_FFT_ALL): CMD = run libavcodec/tests/fft $(CPUFLAGS:%=-c%) $(ARGS)
+$(FATE_FFT_ALL): CMD = run libavcodec/tests/fft$(EXESUF) $(CPUFLAGS:%=-c%) $(ARGS)
 
 define DEF_FFT_FIXED
 FATE_FFT_FIXED-$(CONFIG_FFT)   += fate-fft-fixed-$(1)  fate-ifft-fixed-$(1)
@@ -44,7 +44,7 @@
 FATE_FFT_FIXED_ALL = $(FATE_FFT_FIXED-yes) $(FATE_MDCT_FIXED-yes)
 
 $(FATE_FFT_FIXED_ALL): libavcodec/tests/fft-fixed$(EXESUF)
-$(FATE_FFT_FIXED_ALL): CMD = run libavcodec/tests/fft-fixed $(CPUFLAGS:%=-c%) $(ARGS)
+$(FATE_FFT_FIXED_ALL): CMD = run libavcodec/tests/fft-fixed$(EXESUF) $(CPUFLAGS:%=-c%) $(ARGS)
 
 $(FATE_FFT_ALL) $(FATE_FFT_FIXED_ALL): CMP = null
 
@@ -62,7 +62,7 @@
 
 fate-fft-fixed32: $(FATE_FFT_FIXED32)
 $(FATE_FFT_FIXED32): libavcodec/tests/fft-fixed32$(EXESUF)
-$(FATE_FFT_FIXED32): CMD = run libavcodec/tests/fft-fixed32 $(CPUFLAGS:%=-c%) $(ARGS)
+$(FATE_FFT_FIXED32): CMD = run libavcodec/tests/fft-fixed32$(EXESUF) $(CPUFLAGS:%=-c%) $(ARGS)
 $(FATE_FFT_FIXED32): CMP = null
 
 define DEF_AV_FFT
@@ -91,7 +91,7 @@
 FATE_AV_FFT_ALL = $(FATE_AV_DCT-yes) $(FATE_AV_FFT-yes) $(FATE_AV_MDCT-yes) $(FATE_AV_RDFT-yes)
 
 $(FATE_AV_FFT_ALL): libavcodec/tests/avfft$(EXESUF)
-$(FATE_AV_FFT_ALL): CMD = run libavcodec/tests/avfft $(CPUFLAGS:%=-c%) $(ARGS)
+$(FATE_AV_FFT_ALL): CMD = run libavcodec/tests/avfft$(EXESUF) $(CPUFLAGS:%=-c%) $(ARGS)
 $(FATE_AV_FFT_ALL): CMP = null
 
 fate-dct: fate-dct-float
diff --git a/tests/fate/filter-audio.mak b/tests/fate/filter-audio.mak
index dcc8d56..79b1536 100644
--- a/tests/fate/filter-audio.mak
+++ b/tests/fate/filter-audio.mak
@@ -186,10 +186,13 @@
 fate-filter-stereotools: SRC = $(TARGET_SAMPLES)/audio-reference/luckynight_2ch_44kHz_s16.wav
 fate-filter-stereotools: CMD = framecrc -i $(SRC) -frames:a 20 -af stereotools=mlev=0.015625
 
-FATE_AFILTER-$(call FILTERDEMDECENCMUX, TREMOLO, WAV, PCM_S16LE, PCM_S16LE, WAV) += fate-filter-tremolo
+FATE_AFILTER_SAMPLES-$(call FILTERDEMDECENCMUX, TREMOLO, WAV, PCM_S16LE, PCM_S16LE, WAV) += fate-filter-tremolo
 fate-filter-tremolo: tests/data/asynth-44100-2.wav
 fate-filter-tremolo: SRC = $(TARGET_PATH)/tests/data/asynth-44100-2.wav
-fate-filter-tremolo: CMD = framecrc -i $(SRC) -frames:a 20 -af tremolo
+fate-filter-tremolo: CMD = ffmpeg -i $(SRC) -frames:a 20 -af tremolo -f wav -f s16le -
+fate-filter-tremolo: REF = $(SAMPLES)/filter/tremolo.pcm
+fate-filter-tremolo: CMP = oneoff
+fate-filter-tremolo: CMP_UNIT = s16
 
 FATE_AFILTER-$(call FILTERDEMDECENCMUX, COMPAND, WAV, PCM_S16LE, PCM_S16LE, WAV) += fate-filter-compand
 fate-filter-compand: tests/data/asynth-44100-2.wav
@@ -312,47 +315,47 @@
 fate-filter-hdcd-mix: SRC = $(TARGET_SAMPLES)/filter/hdcd-mix.flac
 fate-filter-hdcd-mix: CMD = md5 -i $(SRC) -af hdcd -f s24le
 fate-filter-hdcd-mix: CMP = oneline
-fate-filter-hdcd-mix: REF = e7079913e90c124460cdbc712df5b84c
+fate-filter-hdcd-mix: REF = 77443573e0bd3532de52a8bc0e825da7
 
 # output will be different because of the gain mismatch in the second and third parts
 FATE_AFILTER_SAMPLES-$(call FILTERDEMDECENCMUX, HDCD, FLAC, FLAC, PCM_S24LE, PCM_S24LE) += fate-filter-hdcd-mix-psoff
 fate-filter-hdcd-mix-psoff: SRC = $(TARGET_SAMPLES)/filter/hdcd-mix.flac
 fate-filter-hdcd-mix-psoff: CMD = md5 -i $(SRC) -af hdcd=process_stereo=false -f s24le
 fate-filter-hdcd-mix-psoff: CMP = oneline
-fate-filter-hdcd-mix-psoff: REF = bd0e81fe17696b825ee3515ab928e6bb
+fate-filter-hdcd-mix-psoff: REF = 89e57885917a436b30855db4d478cefb
 
 # test the different analyze modes
 FATE_AFILTER_SAMPLES-$(call FILTERDEMDECENCMUX, HDCD, FLAC, FLAC, PCM_S24LE, PCM_S24LE) += fate-filter-hdcd-analyze-pe
 fate-filter-hdcd-analyze-pe: SRC = $(TARGET_SAMPLES)/filter/hdcd-mix.flac
 fate-filter-hdcd-analyze-pe: CMD = md5 -i $(SRC) -af hdcd=analyze_mode=pe -f s24le
 fate-filter-hdcd-analyze-pe: CMP = oneline
-fate-filter-hdcd-analyze-pe: REF = bb83e97bbd0064b9b1c0ef2f2c8f0c77
+fate-filter-hdcd-analyze-pe: REF = 2d839d8a1cf73b10a566ce3d4cfaa79e
 FATE_AFILTER_SAMPLES-$(call FILTERDEMDECENCMUX, HDCD, FLAC, FLAC, PCM_S24LE, PCM_S24LE) += fate-filter-hdcd-analyze-lle
 fate-filter-hdcd-analyze-lle: SRC = $(TARGET_SAMPLES)/filter/hdcd-mix.flac
 fate-filter-hdcd-analyze-lle: CMD = md5 -i $(SRC) -af hdcd=analyze_mode=lle -f s24le
 fate-filter-hdcd-analyze-lle: CMP = oneline
-fate-filter-hdcd-analyze-lle: REF = 121cc4a681aa0caef5c664fece7a3ddc
+fate-filter-hdcd-analyze-lle: REF = b4b185332b7025c191062f49a2c015f1
 FATE_AFILTER_SAMPLES-$(call FILTERDEMDECENCMUX, HDCD, FLAC, FLAC, PCM_S24LE, PCM_S24LE) += fate-filter-hdcd-analyze-cdt
 fate-filter-hdcd-analyze-cdt: SRC = $(TARGET_SAMPLES)/filter/hdcd-mix.flac
 fate-filter-hdcd-analyze-cdt: CMD = md5 -i $(SRC) -af hdcd=analyze_mode=cdt -f s24le
 fate-filter-hdcd-analyze-cdt: CMP = oneline
-fate-filter-hdcd-analyze-cdt: REF = 12136e6a00dd532994f6edcc347af1d4
+fate-filter-hdcd-analyze-cdt: REF = afa6577675c63e87da3edbd442b7b6e2
 FATE_AFILTER_SAMPLES-$(call FILTERDEMDECENCMUX, HDCD, FLAC, FLAC, PCM_S24LE, PCM_S24LE) += fate-filter-hdcd-analyze-tgm
 fate-filter-hdcd-analyze-tgm: SRC = $(TARGET_SAMPLES)/filter/hdcd-mix.flac
 fate-filter-hdcd-analyze-tgm: CMD = md5 -i $(SRC) -af hdcd=analyze_mode=tgm -f s24le
 fate-filter-hdcd-analyze-tgm: CMP = oneline
-fate-filter-hdcd-analyze-tgm: REF = a3c39f62e9b9b42c9c440d0045d5fb2f
+fate-filter-hdcd-analyze-tgm: REF = 285f0fd2249b4903cd5e1ad5ce004219
 # the two additional analyze modes from libhdcd
 FATE_AFILTER_SAMPLES-$(call FILTERDEMDECENCMUX, HDCD, FLAC, FLAC, PCM_S24LE, PCM_S24LE) += fate-filter-hdcd-analyze-ltgm
 fate-filter-hdcd-analyze-ltgm: SRC = $(TARGET_SAMPLES)/filter/hdcd-mix.flac
 fate-filter-hdcd-analyze-ltgm: CMD = md5 -i $(SRC) -af hdcd=analyze_mode=lle:process_stereo=false -f s24le
 fate-filter-hdcd-analyze-ltgm: CMP = oneline
-fate-filter-hdcd-analyze-ltgm: REF = 76ffd86b762b5a93332039f27e4c0c0e
+fate-filter-hdcd-analyze-ltgm: REF = 404dc2301ea97e9f96c3d6d2ebcfeaa5
 FATE_AFILTER_SAMPLES-$(call FILTERDEMDECENCMUX, HDCD, FLAC, FLAC, PCM_S24LE, PCM_S24LE) += fate-filter-hdcd-analyze-pel
 fate-filter-hdcd-analyze-pel: SRC = $(TARGET_SAMPLES)/filter/hdcd-mix.flac
 fate-filter-hdcd-analyze-pel: CMD = md5 -i $(SRC) -af hdcd=analyze_mode=pe:force_pe=true -f s24le
 fate-filter-hdcd-analyze-pel: CMP = oneline
-fate-filter-hdcd-analyze-pel: REF = 8156c5a3658d789ab46447d62151f5e9
+fate-filter-hdcd-analyze-pel: REF = 9342983208ec1a7f2b3e332ac4dcb723
 
 FATE_AFILTER_SAMPLES-$(call FILTERDEMDECENCMUX, HDCD, FLAC, FLAC, PCM_S24LE, PCM_S24LE) += fate-filter-hdcd-false-positive
 fate-filter-hdcd-false-positive: SRC = $(TARGET_SAMPLES)/filter/hdcd-false-positive.flac
@@ -392,7 +395,7 @@
 
 FATE_AFILTER-yes += fate-filter-formats
 fate-filter-formats: libavfilter/tests/formats$(EXESUF)
-fate-filter-formats: CMD = run libavfilter/tests/formats
+fate-filter-formats: CMD = run libavfilter/tests/formats$(EXESUF)
 
 FATE_SAMPLES_AVCONV += $(FATE_AFILTER_SAMPLES-yes)
 FATE_FFMPEG += $(FATE_AFILTER-yes)
diff --git a/tests/fate/filter-video.mak b/tests/fate/filter-video.mak
index 8bbdc04..2da27f7 100644
--- a/tests/fate/filter-video.mak
+++ b/tests/fate/filter-video.mak
@@ -1,6 +1,6 @@
 FATE_FILTER_SAMPLES-$(call ALLYES, SMJPEG_DEMUXER MJPEG_DECODER PERMS_FILTER OWDENOISE_FILTER) += fate-filter-owdenoise-sample
 fate-filter-owdenoise-sample: CMD = ffmpeg -idct simple -i $(TARGET_SAMPLES)/smjpeg/scenwin.mjpg -vf "trim=duration=0.5,perms=random,owdenoise=10:20:20:enable=not(between(t\,0.2\,1.2))" -an -f rawvideo -
-fate-filter-owdenoise-sample: REF = $(TARGET_SAMPLES)/filter-reference/owdenoise-scenwin.raw
+fate-filter-owdenoise-sample: REF = $(SAMPLES)/filter-reference/owdenoise-scenwin.raw
 fate-filter-owdenoise-sample: CMP_TARGET = 1
 fate-filter-owdenoise-sample: FUZZ = 3539
 fate-filter-owdenoise-sample: CMP = oneoff
@@ -360,7 +360,7 @@
 fate-filter-shuffleplanes-dup-luma: CMD = framecrc -c:v pgmyuv -i $(SRC) -vf format=yuva444p,shuffleplanes=0:0:0:0
 
 FATE_SHUFFLEPLANES += fate-filter-shuffleplanes-swapuv
-fate-filter-shuffleplanes-swapuv: CMD = framecrc -c:v pgmyuv -i $(SRC) -vf shuffleplanes=0:2:1
+fate-filter-shuffleplanes-swapuv: CMD = framecrc -c:v pgmyuv -i $(SRC) -vf shuffleplanes=0:2:1:0
 
 FATE_FILTER_VSYNTH-$(CONFIG_SHUFFLEPLANES_FILTER) += $(FATE_SHUFFLEPLANES)
 
@@ -424,9 +424,11 @@
 fate-filter-gradfun-sample: tests/data/filtergraphs/gradfun
 fate-filter-gradfun-sample: CMD = framecrc -i $(TARGET_SAMPLES)/vmd/12.vmd -filter_script $(TARGET_PATH)/tests/data/filtergraphs/gradfun -an -frames:v 20
 
-FATE_FILTER-$(call ALLYES, TESTSRC_FILTER SINE_FILTER CONCAT_FILTER) += fate-filter-concat
+FATE_FILTER-$(call ALLYES, TESTSRC_FILTER SINE_FILTER CONCAT_FILTER) += fate-filter-concat fate-filter-concat-vfr
 fate-filter-concat: tests/data/filtergraphs/concat
 fate-filter-concat: CMD = framecrc -filter_complex_script $(TARGET_PATH)/tests/data/filtergraphs/concat
+fate-filter-concat-vfr: tests/data/filtergraphs/concat-vfr
+fate-filter-concat-vfr: CMD = framecrc -filter_complex_script $(TARGET_PATH)/tests/data/filtergraphs/concat-vfr
 
 FATE_FILTER-$(call ALLYES, TESTSRC2_FILTER FPS_FILTER MPDECIMATE_FILTER) += fate-filter-mpdecimate
 fate-filter-mpdecimate: CMD = framecrc -lavfi testsrc2=r=2:d=10,fps=3,mpdecimate -r 3 -pix_fmt yuv420p
@@ -482,11 +484,17 @@
 
 FATE_FILTER_VSYNTH-$(CONFIG_SCALE_FILTER) += fate-filter-scalechroma
 fate-filter-scalechroma: tests/data/vsynth1.yuv
-fate-filter-scalechroma: CMD = framecrc -flags bitexact -s 352x288 -pix_fmt yuv444p -i tests/data/vsynth1.yuv -pix_fmt yuv420p -sws_flags +bitexact -vf scale=out_v_chr_pos=33:out_h_chr_pos=151
+fate-filter-scalechroma: CMD = framecrc -flags bitexact -s 352x288 -pix_fmt yuv444p -i $(TARGET_PATH)/tests/data/vsynth1.yuv -pix_fmt yuv420p -sws_flags +bitexact -vf scale=out_v_chr_pos=33:out_h_chr_pos=151
 
 FATE_FILTER_VSYNTH-$(CONFIG_VFLIP_FILTER) += fate-filter-vflip
 fate-filter-vflip: CMD = video_filter "vflip"
 
+FATE_FILTER_VSYNTH-$(CONFIG_COLORLEVELS_FILTER) += fate-filter-colorlevels
+fate-filter-colorlevels: CMD = framecrc -c:v pgmyuv -i $(SRC) -vf format=rgb24,colorlevels -flags +bitexact -sws_flags +accurate_rnd+bitexact
+
+FATE_FILTER_VSYNTH-$(CONFIG_COLORLEVELS_FILTER) += fate-filter-colorlevels-16
+fate-filter-colorlevels-16: CMD = framecrc -c:v pgmyuv -i $(SRC) -vf format=rgb48,colorlevels -pix_fmt rgb48le -flags +bitexact -sws_flags +accurate_rnd+bitexact
+
 FATE_FILTER_VSYNTH-$(CONFIG_COLORMATRIX_FILTER) += fate-filter-colormatrix1
 fate-filter-colormatrix1: CMD = video_filter "colormatrix=bt601:smpte240m,colormatrix=smpte240m:fcc,colormatrix=fcc:bt601,colormatrix=bt601:fcc,colormatrix=fcc:smpte240m,colormatrix=smpte240m:bt709"
 
@@ -734,7 +742,7 @@
                    AVCODEC AVDEVICE MOV_DEMUXER SVQ3_DECODER ZLIB
 FATE_METADATA_FILTER-$(call ALLYES, $(SCENEDETECT_DEPS)) += fate-filter-metadata-scenedetect
 fate-filter-metadata-scenedetect: SRC = $(TARGET_SAMPLES)/svq3/Vertical400kbit.sorenson3.mov
-fate-filter-metadata-scenedetect: CMD = run $(FILTER_METADATA_COMMAND) "sws_flags=+accurate_rnd+bitexact;movie='$(SRC)',select=gt(scene\,.4)"
+fate-filter-metadata-scenedetect: CMD = run $(FILTER_METADATA_COMMAND) "sws_flags=+accurate_rnd+bitexact;movie='$(SRC)',select=gt(scene\,.25)"
 
 CROPDETECT_DEPS = FFPROBE LAVFI_INDEV MOVIE_FILTER CROPDETECT_FILTER SCALE_FILTER \
                   AVCODEC AVDEVICE MOV_DEMUXER H264_DECODER
@@ -742,10 +750,14 @@
 fate-filter-metadata-cropdetect: SRC = $(TARGET_SAMPLES)/filter/cropdetect.mp4
 fate-filter-metadata-cropdetect: CMD = run $(FILTER_METADATA_COMMAND) "sws_flags=+accurate_rnd+bitexact;movie='$(SRC)',cropdetect=max_outliers=3"
 
+FREEZEDETECT_DEPS = FFPROBE AVDEVICE LAVFI_INDEV MPTESTSRC_FILTER SCALE_FILTER FREEZEDETECT_FILTER
+FATE_METADATA_FILTER-$(call ALLYES, $(FREEZEDETECT_DEPS)) += fate-filter-metadata-freezedetect
+fate-filter-metadata-freezedetect: CMD = run $(FILTER_METADATA_COMMAND) "sws_flags=+accurate_rnd+bitexact;mptestsrc=r=25:d=10:m=51,freezedetect"
+
 SILENCEDETECT_DEPS = FFPROBE AVDEVICE LAVFI_INDEV AMOVIE_FILTER TTA_DEMUXER TTA_DECODER SILENCEDETECT_FILTER
 FATE_METADATA_FILTER-$(call ALLYES, $(SILENCEDETECT_DEPS)) += fate-filter-metadata-silencedetect
 fate-filter-metadata-silencedetect: SRC = $(TARGET_SAMPLES)/lossless-audio/inside.tta
-fate-filter-metadata-silencedetect: CMD = run $(FILTER_METADATA_COMMAND) "amovie='$(SRC)',silencedetect=n=-33.5dB:d=.2"
+fate-filter-metadata-silencedetect: CMD = run $(FILTER_METADATA_COMMAND) "amovie='$(SRC)',silencedetect=n=-33.5dB:d=0.2"
 
 EBUR128_METADATA_DEPS = FFPROBE AVDEVICE LAVFI_INDEV AMOVIE_FILTER FLAC_DEMUXER FLAC_DECODER EBUR128_FILTER
 FATE_METADATA_FILTER-$(call ALLYES, $(EBUR128_METADATA_DEPS)) += fate-filter-metadata-ebur128
@@ -782,7 +794,7 @@
 REFCMP_DEPS = FFMPEG LAVFI_INDEV TESTSRC2_FILTER AVGBLUR_FILTER METADATA_FILTER
 
 FATE_FILTER_SAMPLES-$(call ALLYES, $(REFCMP_DEPS) PSNR_FILTER) += fate-filter-refcmp-psnr-rgb
-fate-filter-refcmp-psnr-rgb: CMD = refcmp_metadata psnr rgb24 0.001
+fate-filter-refcmp-psnr-rgb: CMD = refcmp_metadata psnr rgb24 0.002
 
 FATE_FILTER_SAMPLES-$(call ALLYES, $(REFCMP_DEPS) PSNR_FILTER) += fate-filter-refcmp-psnr-yuv
 fate-filter-refcmp-psnr-yuv: CMD = refcmp_metadata psnr yuv422p 0.0015
diff --git a/tests/fate/gapless.mak b/tests/fate/gapless.mak
index 91fddb4..3a82c3e 100644
--- a/tests/fate/gapless.mak
+++ b/tests/fate/gapless.mak
@@ -2,7 +2,7 @@
 fate-gapless-mp3: CMD = gapless $(TARGET_SAMPLES)/gapless/gapless.mp3 "-c:a mp3"
 
 FATE_GAPLESS-$(CONFIG_MP3_DEMUXER) += fate-audiomatch-square-mp3
-fate-audiomatch-square-mp3: CMD = audio_match $(TARGET_SAMPLES)/audiomatch/square3.mp3 $(TARGET_SAMPLES)/audiomatch/square3.wav
+fate-audiomatch-square-mp3: CMD = audio_match $(TARGET_SAMPLES)/audiomatch/square3.mp3 $(SAMPLES)/audiomatch/square3.wav
 
 FATE_GAPLESS-$(CONFIG_MOV_DEMUXER) += fate-audiomatch-square-aac
 FATE_GAPLESS-$(CONFIG_MOV_DEMUXER) += fate-audiomatch-afconvert-16000-mono-lc-adts    fate-audiomatch-afconvert-16000-mono-lc-m4a
@@ -40,57 +40,57 @@
 
 FATE_GAPLESS-$(CONFIG_MOV_DEMUXER) += fate-audiomatch-quicktime7-44100-stereo-lc-mp4 fate-audiomatch-quicktimeX-44100-stereo-lc-m4a
 
-fate-audiomatch-square-aac: CMD = audio_match $(TARGET_SAMPLES)/audiomatch/square3.m4a $(TARGET_SAMPLES)/audiomatch/square3.wav
+fate-audiomatch-square-aac: CMD = audio_match $(TARGET_SAMPLES)/audiomatch/square3.m4a $(SAMPLES)/audiomatch/square3.wav
 
-fate-audiomatch-afconvert-16000-mono-lc-adts: CMD = audio_match $(TARGET_SAMPLES)/audiomatch/tones_afconvert_16000_mono_aac_lc.adts  $(TARGET_SAMPLES)/audiomatch/tones_16000_mono.wav
-fate-audiomatch-afconvert-16000-mono-lc-m4a:  CMD = audio_match $(TARGET_SAMPLES)/audiomatch/tones_afconvert_16000_mono_aac_lc.m4a   $(TARGET_SAMPLES)/audiomatch/tones_16000_mono.wav
-fate-audiomatch-afconvert-16000-mono-he-adts: CMD = audio_match $(TARGET_SAMPLES)/audiomatch/tones_afconvert_16000_mono_aac_he.adts  $(TARGET_SAMPLES)/audiomatch/tones_16000_mono.wav "-ac 1 -ar 16000"
-fate-audiomatch-afconvert-16000-mono-he-m4a:  CMD = audio_match $(TARGET_SAMPLES)/audiomatch/tones_afconvert_16000_mono_aac_he.m4a   $(TARGET_SAMPLES)/audiomatch/tones_16000_mono.wav "-ac 1 -ar 16000"
-fate-audiomatch-afconvert-16000-stereo-lc-adts: CMD = audio_match $(TARGET_SAMPLES)/audiomatch/tones_afconvert_16000_stereo_aac_lc.adts  $(TARGET_SAMPLES)/audiomatch/tones_16000_stereo.wav
-fate-audiomatch-afconvert-16000-stereo-lc-m4a:  CMD = audio_match $(TARGET_SAMPLES)/audiomatch/tones_afconvert_16000_stereo_aac_lc.m4a   $(TARGET_SAMPLES)/audiomatch/tones_16000_stereo.wav
-fate-audiomatch-afconvert-16000-stereo-he-adts: CMD = audio_match $(TARGET_SAMPLES)/audiomatch/tones_afconvert_16000_stereo_aac_he.adts  $(TARGET_SAMPLES)/audiomatch/tones_16000_stereo.wav "-ar 16000"
-fate-audiomatch-afconvert-16000-stereo-he-m4a:  CMD = audio_match $(TARGET_SAMPLES)/audiomatch/tones_afconvert_16000_stereo_aac_he.m4a   $(TARGET_SAMPLES)/audiomatch/tones_16000_stereo.wav "-ar 16000"
-fate-audiomatch-afconvert-16000-stereo-he2-adts:CMD = audio_match $(TARGET_SAMPLES)/audiomatch/tones_afconvert_16000_stereo_aac_he2.adts $(TARGET_SAMPLES)/audiomatch/tones_16000_stereo.wav "-ar 16000"
-fate-audiomatch-afconvert-16000-stereo-he2-m4a: CMD = audio_match $(TARGET_SAMPLES)/audiomatch/tones_afconvert_16000_stereo_aac_he2.m4a  $(TARGET_SAMPLES)/audiomatch/tones_16000_stereo.wav "-ar 16000"
-fate-audiomatch-afconvert-44100-mono-lc-adts: CMD = audio_match $(TARGET_SAMPLES)/audiomatch/tones_afconvert_44100_mono_aac_lc.adts  $(TARGET_SAMPLES)/audiomatch/tones_44100_mono.wav
-fate-audiomatch-afconvert-44100-mono-lc-m4a:  CMD = audio_match $(TARGET_SAMPLES)/audiomatch/tones_afconvert_44100_mono_aac_lc.m4a   $(TARGET_SAMPLES)/audiomatch/tones_44100_mono.wav
-fate-audiomatch-afconvert-44100-mono-he-adts: CMD = audio_match $(TARGET_SAMPLES)/audiomatch/tones_afconvert_44100_mono_aac_he.adts  $(TARGET_SAMPLES)/audiomatch/tones_44100_mono.wav "-ac 1"
-fate-audiomatch-afconvert-44100-mono-he-m4a:  CMD = audio_match $(TARGET_SAMPLES)/audiomatch/tones_afconvert_44100_mono_aac_he.m4a   $(TARGET_SAMPLES)/audiomatch/tones_44100_mono.wav "-ac 1"
-fate-audiomatch-afconvert-44100-stereo-lc-adts: CMD = audio_match $(TARGET_SAMPLES)/audiomatch/tones_afconvert_44100_stereo_aac_lc.adts  $(TARGET_SAMPLES)/audiomatch/tones_44100_stereo.wav
-fate-audiomatch-afconvert-44100-stereo-lc-m4a:  CMD = audio_match $(TARGET_SAMPLES)/audiomatch/tones_afconvert_44100_stereo_aac_lc.m4a   $(TARGET_SAMPLES)/audiomatch/tones_44100_stereo.wav
-fate-audiomatch-afconvert-44100-stereo-he-adts: CMD = audio_match $(TARGET_SAMPLES)/audiomatch/tones_afconvert_44100_stereo_aac_he.adts  $(TARGET_SAMPLES)/audiomatch/tones_44100_stereo.wav
-fate-audiomatch-afconvert-44100-stereo-he-m4a:  CMD = audio_match $(TARGET_SAMPLES)/audiomatch/tones_afconvert_44100_stereo_aac_he.m4a   $(TARGET_SAMPLES)/audiomatch/tones_44100_stereo.wav
-fate-audiomatch-afconvert-44100-stereo-he2-adts:CMD = audio_match $(TARGET_SAMPLES)/audiomatch/tones_afconvert_44100_stereo_aac_he2.adts $(TARGET_SAMPLES)/audiomatch/tones_44100_stereo.wav
-fate-audiomatch-afconvert-44100-stereo-he2-m4a: CMD = audio_match $(TARGET_SAMPLES)/audiomatch/tones_afconvert_44100_stereo_aac_he2.m4a  $(TARGET_SAMPLES)/audiomatch/tones_44100_stereo.wav
+fate-audiomatch-afconvert-16000-mono-lc-adts: CMD = audio_match $(TARGET_SAMPLES)/audiomatch/tones_afconvert_16000_mono_aac_lc.adts  $(SAMPLES)/audiomatch/tones_16000_mono.wav
+fate-audiomatch-afconvert-16000-mono-lc-m4a:  CMD = audio_match $(TARGET_SAMPLES)/audiomatch/tones_afconvert_16000_mono_aac_lc.m4a   $(SAMPLES)/audiomatch/tones_16000_mono.wav
+fate-audiomatch-afconvert-16000-mono-he-adts: CMD = audio_match $(TARGET_SAMPLES)/audiomatch/tones_afconvert_16000_mono_aac_he.adts  $(SAMPLES)/audiomatch/tones_16000_mono.wav "-ac 1 -ar 16000"
+fate-audiomatch-afconvert-16000-mono-he-m4a:  CMD = audio_match $(TARGET_SAMPLES)/audiomatch/tones_afconvert_16000_mono_aac_he.m4a   $(SAMPLES)/audiomatch/tones_16000_mono.wav "-ac 1 -ar 16000"
+fate-audiomatch-afconvert-16000-stereo-lc-adts: CMD = audio_match $(TARGET_SAMPLES)/audiomatch/tones_afconvert_16000_stereo_aac_lc.adts  $(SAMPLES)/audiomatch/tones_16000_stereo.wav
+fate-audiomatch-afconvert-16000-stereo-lc-m4a:  CMD = audio_match $(TARGET_SAMPLES)/audiomatch/tones_afconvert_16000_stereo_aac_lc.m4a   $(SAMPLES)/audiomatch/tones_16000_stereo.wav
+fate-audiomatch-afconvert-16000-stereo-he-adts: CMD = audio_match $(TARGET_SAMPLES)/audiomatch/tones_afconvert_16000_stereo_aac_he.adts  $(SAMPLES)/audiomatch/tones_16000_stereo.wav "-ar 16000"
+fate-audiomatch-afconvert-16000-stereo-he-m4a:  CMD = audio_match $(TARGET_SAMPLES)/audiomatch/tones_afconvert_16000_stereo_aac_he.m4a   $(SAMPLES)/audiomatch/tones_16000_stereo.wav "-ar 16000"
+fate-audiomatch-afconvert-16000-stereo-he2-adts:CMD = audio_match $(TARGET_SAMPLES)/audiomatch/tones_afconvert_16000_stereo_aac_he2.adts $(SAMPLES)/audiomatch/tones_16000_stereo.wav "-ar 16000"
+fate-audiomatch-afconvert-16000-stereo-he2-m4a: CMD = audio_match $(TARGET_SAMPLES)/audiomatch/tones_afconvert_16000_stereo_aac_he2.m4a  $(SAMPLES)/audiomatch/tones_16000_stereo.wav "-ar 16000"
+fate-audiomatch-afconvert-44100-mono-lc-adts: CMD = audio_match $(TARGET_SAMPLES)/audiomatch/tones_afconvert_44100_mono_aac_lc.adts  $(SAMPLES)/audiomatch/tones_44100_mono.wav
+fate-audiomatch-afconvert-44100-mono-lc-m4a:  CMD = audio_match $(TARGET_SAMPLES)/audiomatch/tones_afconvert_44100_mono_aac_lc.m4a   $(SAMPLES)/audiomatch/tones_44100_mono.wav
+fate-audiomatch-afconvert-44100-mono-he-adts: CMD = audio_match $(TARGET_SAMPLES)/audiomatch/tones_afconvert_44100_mono_aac_he.adts  $(SAMPLES)/audiomatch/tones_44100_mono.wav "-ac 1"
+fate-audiomatch-afconvert-44100-mono-he-m4a:  CMD = audio_match $(TARGET_SAMPLES)/audiomatch/tones_afconvert_44100_mono_aac_he.m4a   $(SAMPLES)/audiomatch/tones_44100_mono.wav "-ac 1"
+fate-audiomatch-afconvert-44100-stereo-lc-adts: CMD = audio_match $(TARGET_SAMPLES)/audiomatch/tones_afconvert_44100_stereo_aac_lc.adts  $(SAMPLES)/audiomatch/tones_44100_stereo.wav
+fate-audiomatch-afconvert-44100-stereo-lc-m4a:  CMD = audio_match $(TARGET_SAMPLES)/audiomatch/tones_afconvert_44100_stereo_aac_lc.m4a   $(SAMPLES)/audiomatch/tones_44100_stereo.wav
+fate-audiomatch-afconvert-44100-stereo-he-adts: CMD = audio_match $(TARGET_SAMPLES)/audiomatch/tones_afconvert_44100_stereo_aac_he.adts  $(SAMPLES)/audiomatch/tones_44100_stereo.wav
+fate-audiomatch-afconvert-44100-stereo-he-m4a:  CMD = audio_match $(TARGET_SAMPLES)/audiomatch/tones_afconvert_44100_stereo_aac_he.m4a   $(SAMPLES)/audiomatch/tones_44100_stereo.wav
+fate-audiomatch-afconvert-44100-stereo-he2-adts:CMD = audio_match $(TARGET_SAMPLES)/audiomatch/tones_afconvert_44100_stereo_aac_he2.adts $(SAMPLES)/audiomatch/tones_44100_stereo.wav
+fate-audiomatch-afconvert-44100-stereo-he2-m4a: CMD = audio_match $(TARGET_SAMPLES)/audiomatch/tones_afconvert_44100_stereo_aac_he2.m4a  $(SAMPLES)/audiomatch/tones_44100_stereo.wav
 
-fate-audiomatch-dolby-44100-mono-lc-mp4:  CMD = audio_match $(TARGET_SAMPLES)/audiomatch/tones_dolby_44100_mono_aac_lc.mp4   $(TARGET_SAMPLES)/audiomatch/tones_44100_mono.wav
-fate-audiomatch-dolby-44100-mono-he-mp4:  CMD = audio_match $(TARGET_SAMPLES)/audiomatch/tones_dolby_44100_mono_aac_he.mp4   $(TARGET_SAMPLES)/audiomatch/tones_44100_mono.wav "-ac 1"
-fate-audiomatch-dolby-44100-stereo-lc-mp4:  CMD = audio_match $(TARGET_SAMPLES)/audiomatch/tones_dolby_44100_stereo_aac_lc.mp4   $(TARGET_SAMPLES)/audiomatch/tones_44100_stereo.wav
-fate-audiomatch-dolby-44100-stereo-he-mp4:  CMD = audio_match $(TARGET_SAMPLES)/audiomatch/tones_dolby_44100_stereo_aac_he.mp4   $(TARGET_SAMPLES)/audiomatch/tones_44100_stereo.wav
-fate-audiomatch-dolby-44100-stereo-he2-mp4: CMD = audio_match $(TARGET_SAMPLES)/audiomatch/tones_dolby_44100_stereo_aac_he2.mp4  $(TARGET_SAMPLES)/audiomatch/tones_44100_stereo.wav
+fate-audiomatch-dolby-44100-mono-lc-mp4:  CMD = audio_match $(TARGET_SAMPLES)/audiomatch/tones_dolby_44100_mono_aac_lc.mp4   $(SAMPLES)/audiomatch/tones_44100_mono.wav
+fate-audiomatch-dolby-44100-mono-he-mp4:  CMD = audio_match $(TARGET_SAMPLES)/audiomatch/tones_dolby_44100_mono_aac_he.mp4   $(SAMPLES)/audiomatch/tones_44100_mono.wav "-ac 1"
+fate-audiomatch-dolby-44100-stereo-lc-mp4:  CMD = audio_match $(TARGET_SAMPLES)/audiomatch/tones_dolby_44100_stereo_aac_lc.mp4   $(SAMPLES)/audiomatch/tones_44100_stereo.wav
+fate-audiomatch-dolby-44100-stereo-he-mp4:  CMD = audio_match $(TARGET_SAMPLES)/audiomatch/tones_dolby_44100_stereo_aac_he.mp4   $(SAMPLES)/audiomatch/tones_44100_stereo.wav
+fate-audiomatch-dolby-44100-stereo-he2-mp4: CMD = audio_match $(TARGET_SAMPLES)/audiomatch/tones_dolby_44100_stereo_aac_he2.mp4  $(SAMPLES)/audiomatch/tones_44100_stereo.wav
 
-fate-audiomatch-faac-16000-mono-lc-adts: CMD = audio_match $(TARGET_SAMPLES)/audiomatch/tones_faac_16000_mono_aac_lc.adts  $(TARGET_SAMPLES)/audiomatch/tones_16000_mono.wav
-fate-audiomatch-faac-16000-mono-lc-m4a:  CMD = audio_match $(TARGET_SAMPLES)/audiomatch/tones_faac_16000_mono_aac_lc.m4a   $(TARGET_SAMPLES)/audiomatch/tones_16000_mono.wav
-fate-audiomatch-faac-16000-stereo-lc-adts: CMD = audio_match $(TARGET_SAMPLES)/audiomatch/tones_faac_16000_stereo_aac_lc.adts  $(TARGET_SAMPLES)/audiomatch/tones_16000_stereo.wav
-fate-audiomatch-faac-16000-stereo-lc-m4a:  CMD = audio_match $(TARGET_SAMPLES)/audiomatch/tones_faac_16000_stereo_aac_lc.m4a   $(TARGET_SAMPLES)/audiomatch/tones_16000_stereo.wav
-fate-audiomatch-faac-44100-mono-lc-adts: CMD = audio_match $(TARGET_SAMPLES)/audiomatch/tones_faac_44100_mono_aac_lc.adts  $(TARGET_SAMPLES)/audiomatch/tones_44100_mono.wav
-fate-audiomatch-faac-44100-mono-lc-m4a:  CMD = audio_match $(TARGET_SAMPLES)/audiomatch/tones_faac_44100_mono_aac_lc.m4a   $(TARGET_SAMPLES)/audiomatch/tones_44100_mono.wav
-fate-audiomatch-faac-44100-stereo-lc-adts: CMD = audio_match $(TARGET_SAMPLES)/audiomatch/tones_faac_44100_stereo_aac_lc.adts  $(TARGET_SAMPLES)/audiomatch/tones_44100_stereo.wav
-fate-audiomatch-faac-44100-stereo-lc-m4a:  CMD = audio_match $(TARGET_SAMPLES)/audiomatch/tones_faac_44100_stereo_aac_lc.m4a   $(TARGET_SAMPLES)/audiomatch/tones_44100_stereo.wav
+fate-audiomatch-faac-16000-mono-lc-adts: CMD = audio_match $(TARGET_SAMPLES)/audiomatch/tones_faac_16000_mono_aac_lc.adts  $(SAMPLES)/audiomatch/tones_16000_mono.wav
+fate-audiomatch-faac-16000-mono-lc-m4a:  CMD = audio_match $(TARGET_SAMPLES)/audiomatch/tones_faac_16000_mono_aac_lc.m4a   $(SAMPLES)/audiomatch/tones_16000_mono.wav
+fate-audiomatch-faac-16000-stereo-lc-adts: CMD = audio_match $(TARGET_SAMPLES)/audiomatch/tones_faac_16000_stereo_aac_lc.adts  $(SAMPLES)/audiomatch/tones_16000_stereo.wav
+fate-audiomatch-faac-16000-stereo-lc-m4a:  CMD = audio_match $(TARGET_SAMPLES)/audiomatch/tones_faac_16000_stereo_aac_lc.m4a   $(SAMPLES)/audiomatch/tones_16000_stereo.wav
+fate-audiomatch-faac-44100-mono-lc-adts: CMD = audio_match $(TARGET_SAMPLES)/audiomatch/tones_faac_44100_mono_aac_lc.adts  $(SAMPLES)/audiomatch/tones_44100_mono.wav
+fate-audiomatch-faac-44100-mono-lc-m4a:  CMD = audio_match $(TARGET_SAMPLES)/audiomatch/tones_faac_44100_mono_aac_lc.m4a   $(SAMPLES)/audiomatch/tones_44100_mono.wav
+fate-audiomatch-faac-44100-stereo-lc-adts: CMD = audio_match $(TARGET_SAMPLES)/audiomatch/tones_faac_44100_stereo_aac_lc.adts  $(SAMPLES)/audiomatch/tones_44100_stereo.wav
+fate-audiomatch-faac-44100-stereo-lc-m4a:  CMD = audio_match $(TARGET_SAMPLES)/audiomatch/tones_faac_44100_stereo_aac_lc.m4a   $(SAMPLES)/audiomatch/tones_44100_stereo.wav
 
-fate-audiomatch-nero-16000-mono-lc-m4a:  CMD = audio_match $(TARGET_SAMPLES)/audiomatch/tones_nero_16000_mono_aac_lc.m4a   $(TARGET_SAMPLES)/audiomatch/tones_16000_mono.wav
-fate-audiomatch-nero-16000-mono-he-m4a:  CMD = audio_match $(TARGET_SAMPLES)/audiomatch/tones_nero_16000_mono_aac_he.m4a   $(TARGET_SAMPLES)/audiomatch/tones_16000_mono.wav
-fate-audiomatch-nero-16000-stereo-lc-m4a:  CMD = audio_match $(TARGET_SAMPLES)/audiomatch/tones_nero_16000_stereo_aac_lc.m4a   $(TARGET_SAMPLES)/audiomatch/tones_16000_stereo.wav
-fate-audiomatch-nero-16000-stereo-he-m4a:  CMD = audio_match $(TARGET_SAMPLES)/audiomatch/tones_nero_16000_stereo_aac_he.m4a   $(TARGET_SAMPLES)/audiomatch/tones_16000_stereo.wav
-fate-audiomatch-nero-16000-stereo-he2-m4a: CMD = audio_match $(TARGET_SAMPLES)/audiomatch/tones_nero_16000_stereo_aac_he2.m4a  $(TARGET_SAMPLES)/audiomatch/tones_16000_stereo.wav
-fate-audiomatch-nero-44100-mono-lc-m4a:  CMD = audio_match $(TARGET_SAMPLES)/audiomatch/tones_nero_44100_mono_aac_lc.m4a   $(TARGET_SAMPLES)/audiomatch/tones_44100_mono.wav
-fate-audiomatch-nero-44100-mono-he-m4a:  CMD = audio_match $(TARGET_SAMPLES)/audiomatch/tones_nero_44100_mono_aac_he.m4a   $(TARGET_SAMPLES)/audiomatch/tones_44100_mono.wav
-fate-audiomatch-nero-44100-stereo-lc-m4a:  CMD = audio_match $(TARGET_SAMPLES)/audiomatch/tones_nero_44100_stereo_aac_lc.m4a   $(TARGET_SAMPLES)/audiomatch/tones_44100_stereo.wav
-fate-audiomatch-nero-44100-stereo-he-m4a:  CMD = audio_match $(TARGET_SAMPLES)/audiomatch/tones_nero_44100_stereo_aac_he.m4a   $(TARGET_SAMPLES)/audiomatch/tones_44100_stereo.wav
-fate-audiomatch-nero-44100-stereo-he2-m4a: CMD = audio_match $(TARGET_SAMPLES)/audiomatch/tones_nero_44100_stereo_aac_he2.m4a  $(TARGET_SAMPLES)/audiomatch/tones_44100_stereo.wav
+fate-audiomatch-nero-16000-mono-lc-m4a:  CMD = audio_match $(TARGET_SAMPLES)/audiomatch/tones_nero_16000_mono_aac_lc.m4a   $(SAMPLES)/audiomatch/tones_16000_mono.wav
+fate-audiomatch-nero-16000-mono-he-m4a:  CMD = audio_match $(TARGET_SAMPLES)/audiomatch/tones_nero_16000_mono_aac_he.m4a   $(SAMPLES)/audiomatch/tones_16000_mono.wav
+fate-audiomatch-nero-16000-stereo-lc-m4a:  CMD = audio_match $(TARGET_SAMPLES)/audiomatch/tones_nero_16000_stereo_aac_lc.m4a   $(SAMPLES)/audiomatch/tones_16000_stereo.wav
+fate-audiomatch-nero-16000-stereo-he-m4a:  CMD = audio_match $(TARGET_SAMPLES)/audiomatch/tones_nero_16000_stereo_aac_he.m4a   $(SAMPLES)/audiomatch/tones_16000_stereo.wav
+fate-audiomatch-nero-16000-stereo-he2-m4a: CMD = audio_match $(TARGET_SAMPLES)/audiomatch/tones_nero_16000_stereo_aac_he2.m4a  $(SAMPLES)/audiomatch/tones_16000_stereo.wav
+fate-audiomatch-nero-44100-mono-lc-m4a:  CMD = audio_match $(TARGET_SAMPLES)/audiomatch/tones_nero_44100_mono_aac_lc.m4a   $(SAMPLES)/audiomatch/tones_44100_mono.wav
+fate-audiomatch-nero-44100-mono-he-m4a:  CMD = audio_match $(TARGET_SAMPLES)/audiomatch/tones_nero_44100_mono_aac_he.m4a   $(SAMPLES)/audiomatch/tones_44100_mono.wav
+fate-audiomatch-nero-44100-stereo-lc-m4a:  CMD = audio_match $(TARGET_SAMPLES)/audiomatch/tones_nero_44100_stereo_aac_lc.m4a   $(SAMPLES)/audiomatch/tones_44100_stereo.wav
+fate-audiomatch-nero-44100-stereo-he-m4a:  CMD = audio_match $(TARGET_SAMPLES)/audiomatch/tones_nero_44100_stereo_aac_he.m4a   $(SAMPLES)/audiomatch/tones_44100_stereo.wav
+fate-audiomatch-nero-44100-stereo-he2-m4a: CMD = audio_match $(TARGET_SAMPLES)/audiomatch/tones_nero_44100_stereo_aac_he2.m4a  $(SAMPLES)/audiomatch/tones_44100_stereo.wav
 
-fate-audiomatch-quicktime7-44100-stereo-lc-mp4: CMD = audio_match $(TARGET_SAMPLES)/audiomatch/tones_quicktime7_44100_stereo_aac_lc.mp4  $(TARGET_SAMPLES)/audiomatch/tones_44100_stereo.wav
-fate-audiomatch-quicktimeX-44100-stereo-lc-m4a: CMD = audio_match $(TARGET_SAMPLES)/audiomatch/tones_quicktimeX_44100_stereo_aac_lc.m4a  $(TARGET_SAMPLES)/audiomatch/tones_44100_stereo.wav
+fate-audiomatch-quicktime7-44100-stereo-lc-mp4: CMD = audio_match $(TARGET_SAMPLES)/audiomatch/tones_quicktime7_44100_stereo_aac_lc.mp4  $(SAMPLES)/audiomatch/tones_44100_stereo.wav
+fate-audiomatch-quicktimeX-44100-stereo-lc-m4a: CMD = audio_match $(TARGET_SAMPLES)/audiomatch/tones_quicktimeX_44100_stereo_aac_lc.m4a  $(SAMPLES)/audiomatch/tones_44100_stereo.wav
 
 
 FATE_GAPLESS = $(FATE_GAPLESS-yes)
diff --git a/tests/fate/gif.mak b/tests/fate/gif.mak
index 9bd9631..16d4286 100644
--- a/tests/fate/gif.mak
+++ b/tests/fate/gif.mak
@@ -16,7 +16,7 @@
 fate-gifenc%: fate-gif-color
 fate-gifenc%: PIXFMT = $(word 3, $(subst -, ,$(@)))
 fate-gifenc%: SRC = $(TARGET_SAMPLES)/gif/tc217.gif
-fate-gifenc%: CMD = framecrc -i $(SRC) -c:v gif -pix_fmt $(PIXFMT)
+fate-gifenc%: CMD = framecrc -i $(SRC) -c:v gif -pix_fmt $(PIXFMT) -sws_flags +accurate_rnd+bitexact
 
 FATE_GIF_ENC_PIXFMT = rgb8 bgr8 rgb4_byte bgr4_byte gray pal8
 FATE_GIF_ENC-$(call ENCDEC, GIF, GIF) = $(FATE_GIF_ENC_PIXFMT:%=fate-gifenc-%)
diff --git a/tests/fate/h264.mak b/tests/fate/h264.mak
index 1839b9b..f14b46c 100644
--- a/tests/fate/h264.mak
+++ b/tests/fate/h264.mak
@@ -196,6 +196,7 @@
               fate-h264-3386                                            \
               fate-h264-missing-frame                                   \
               fate-h264-ref-pic-mod-overflow                            \
+              fate-h264-timecode
 
 FATE_H264-$(call DEMDEC, H264, H264) += $(FATE_H264)
 FATE_H264-$(call DEMDEC,  MOV, H264) += fate-h264-crop-to-container
@@ -440,6 +441,7 @@
 fate-h264-unescaped-extradata:                    CMD = framecrc -i $(TARGET_SAMPLES)/h264/unescaped_extradata.mp4 -an -frames 10
 fate-h264-3386:                                   CMD = framecrc -i $(TARGET_SAMPLES)/h264/bbc2.sample.h264
 fate-h264-missing-frame:                          CMD = framecrc -i $(TARGET_SAMPLES)/h264/nondeterministic_cut.h264
+fate-h264-timecode:                               CMD = framecrc -i $(TARGET_SAMPLES)/h264/crew_cif_timecode-2.h264
 
 fate-h264-reinit-%:                               CMD = framecrc -i $(TARGET_SAMPLES)/h264/$(@:fate-h264-%=%).h264 -vf format=yuv444p10le,scale=w=352:h=288
 
diff --git a/tests/fate/hevc.mak b/tests/fate/hevc.mak
index db3ea19..35af3e4 100644
--- a/tests/fate/hevc.mak
+++ b/tests/fate/hevc.mak
@@ -226,9 +226,6 @@
 fate-hevc-paramchange-yuv420p-yuv420p10: CMD = framecrc -vsync 0 -i $(TARGET_SAMPLES)/hevc/paramchange_yuv420p_yuv420p10.hevc -sws_flags area+accurate_rnd+bitexact
 FATE_HEVC += fate-hevc-paramchange-yuv420p-yuv420p10
 
-fate-hevc-paired-fields: CMD = probeframes -show_entries frame=interlaced_frame,top_field_first $(TARGET_SAMPLES)/hevc/paired_fields.hevc
-FATE_HEVC_FFPROBE-$(call DEMDEC, HEVC, HEVC) += fate-hevc-paired-fields
-
 tests/data/hevc-mp4.mov: TAG = GEN
 tests/data/hevc-mp4.mov: ffmpeg$(PROGSSUF)$(EXESUF) | tests/data
 	$(M)$(TARGET_EXEC) $(TARGET_PATH)/$< \
@@ -250,9 +247,18 @@
 
 fate-hevc-extradata-reload: CMD = framemd5 -i $(TARGET_SAMPLES)/hevc/extradata-reload-multi-stsd.mov -sws_flags bitexact
 
+fate-hevc-paired-fields: CMD = probeframes -show_entries frame=interlaced_frame,top_field_first $(TARGET_SAMPLES)/hevc/paired_fields.hevc
+FATE_HEVC_FFPROBE-$(call DEMDEC, HEVC, HEVC) += fate-hevc-paired-fields
+
 fate-hevc-monochrome-crop: CMD = probeframes -show_entries frame=width,height:stream=width,height $(TARGET_SAMPLES)/hevc/hevc-monochrome.hevc
 FATE_HEVC_FFPROBE-$(call DEMDEC, HEVC, HEVC) += fate-hevc-monochrome-crop
 
+fate-hevc-two-first-slice: CMD = threads=2 framemd5 -i $(TARGET_SAMPLES)/hevc/two_first_slice.mp4 -sws_flags bitexact -t 00:02.00 -an
+FATE_HEVC-$(call DEMDEC, MOV, HEVC) += fate-hevc-two-first-slice
+
+fate-hevc-cabac-tudepth: CMD = framecrc -flags unaligned -i $(TARGET_SAMPLES)/hevc/cbf_cr_cb_TUDepth_4_circle.h265 -pix_fmt yuv444p
+FATE_HEVC-$(call DEMDEC, HEVC, HEVC) += fate-hevc-cabac-tudepth
+
 FATE_SAMPLES_AVCONV += $(FATE_HEVC-yes)
 FATE_SAMPLES_FFPROBE += $(FATE_HEVC_FFPROBE-yes)
 
diff --git a/tests/fate/hlsenc.mak b/tests/fate/hlsenc.mak
new file mode 100644
index 0000000..ff58094
--- /dev/null
+++ b/tests/fate/hlsenc.mak
@@ -0,0 +1,99 @@
+tests/data/live_no_endlist.m3u8: TAG = GEN
+tests/data/live_no_endlist.m3u8: ffmpeg$(PROGSSUF)$(EXESUF) | tests/data
+	$(M)$(TARGET_EXEC) $(TARGET_PATH)/$< \
+        -f lavfi -v verbose -i "aevalsrc=cos(2*PI*t)*sin(2*PI*(440+4*t)*t):d=20" -f hls -hls_time 3 -map 0 \
+        -hls_flags omit_endlist -codec:a mp2fixed -hls_segment_filename $(TARGET_PATH)/tests/data/live_no_endlist_%03d.ts \
+        $(TARGET_PATH)/tests/data/live_no_endlist.m3u8 2>/dev/null
+
+FATE_AFILTER-$(call ALLYES, HLS_DEMUXER MPEGTS_MUXER MPEGTS_DEMUXER AEVALSRC_FILTER LAVFI_INDEV MP2FIXED_ENCODER) += fate-hls-live-no-endlist
+fate-hls-live-no-endlist: tests/data/live_no_endlist.m3u8
+fate-hls-live-no-endlist: SRC = $(TARGET_PATH)/tests/data/live_no_endlist.m3u8
+fate-hls-live-no-endlist: CMD = md5 -i $(SRC) -af hdcd=process_stereo=false -t 6 -f s24le
+fate-hls-live-no-endlist: CMP = oneline
+fate-hls-live-no-endlist: REF = e038bb8e65d4c1745b9b3ed643e607a3
+
+tests/data/live_last_endlist.m3u8: TAG = GEN
+tests/data/live_last_endlist.m3u8: ffmpeg$(PROGSSUF)$(EXESUF) | tests/data
+	$(M)$(TARGET_EXEC) $(TARGET_PATH)/$< \
+        -f lavfi -v verbose -i "aevalsrc=cos(2*PI*t)*sin(2*PI*(440+4*t)*t):d=20" -f hls -hls_time 3 -map 0 \
+        -codec:a mp2fixed -hls_segment_filename $(TARGET_PATH)/tests/data/live_last_endlist_%03d.ts \
+        $(TARGET_PATH)/tests/data/live_last_endlist.m3u8 2>/dev/null
+
+FATE_AFILTER-$(call ALLYES, HLS_DEMUXER MPEGTS_MUXER MPEGTS_DEMUXER AEVALSRC_FILTER LAVFI_INDEV MP2FIXED_ENCODER) += fate-hls-live-last-endlist
+fate-hls-live-last-endlist: tests/data/live_last_endlist.m3u8
+fate-hls-live-last-endlist: SRC = $(TARGET_PATH)/tests/data/live_last_endlist.m3u8
+fate-hls-live-last-endlist: CMD = md5 -i $(SRC) -af hdcd=process_stereo=false -t 6 -f s24le
+fate-hls-live-last-endlist: CMP = oneline
+fate-hls-live-last-endlist: REF = 2ca8567092dcf01e37bedd50454d1ab7
+
+
+tests/data/live_endlist.m3u8: TAG = GEN
+tests/data/live_endlist.m3u8: ffmpeg$(PROGSSUF)$(EXESUF) | tests/data
+	$(M)$(TARGET_EXEC) $(TARGET_PATH)/$< \
+        -f lavfi -i "aevalsrc=cos(2*PI*t)*sin(2*PI*(440+4*t)*t):d=20" -f hls -hls_time 3 -map 0 \
+        -hls_list_size 0 -codec:a mp2fixed -hls_segment_filename $(TARGET_PATH)/tests/data/live_endlist_%d.ts \
+        $(TARGET_PATH)/tests/data/live_endlist.m3u8 2>/dev/null
+
+FATE_AFILTER-$(call ALLYES, HLS_DEMUXER MPEGTS_MUXER MPEGTS_DEMUXER AEVALSRC_FILTER LAVFI_INDEV MP2FIXED_ENCODER) += fate-hls-live-endlist
+fate-hls-live-endlist: tests/data/live_endlist.m3u8
+fate-hls-live-endlist: SRC = $(TARGET_PATH)/tests/data/live_endlist.m3u8
+fate-hls-live-endlist: CMD = md5 -i $(SRC) -af hdcd=process_stereo=false -t 20 -f s24le
+fate-hls-live-endlist: CMP = oneline
+fate-hls-live-endlist: REF = e189ce781d9c87882f58e3929455167b
+
+tests/data/hls_segment_size.m3u8: TAG = GEN
+tests/data/hls_segment_size.m3u8: ffmpeg$(PROGSSUF)$(EXESUF) | tests/data
+	$(M)$(TARGET_EXEC) $(TARGET_PATH)/$< \
+	-f lavfi -i "aevalsrc=cos(2*PI*t)*sin(2*PI*(440+4*t)*t):d=20" -f hls -hls_segment_size 300000 -map 0 \
+	-hls_list_size 0 -codec:a mp2fixed -hls_segment_filename $(TARGET_PATH)/tests/data/hls_segment_size_%d.ts \
+	$(TARGET_PATH)/tests/data/hls_segment_size.m3u8 2>/dev/null
+
+FATE_AFILTER-$(call ALLYES, HLS_DEMUXER MPEGTS_MUXER MPEGTS_DEMUXER AEVALSRC_FILTER LAVFI_INDEV MP2FIXED_ENCODER) += fate-hls-segment-size
+fate-hls-segment-size: tests/data/hls_segment_size.m3u8
+fate-hls-segment-size: CMD = framecrc -flags +bitexact -i $(TARGET_PATH)/tests/data/hls_segment_size.m3u8 -vf setpts=N*23
+
+tests/data/hls_segment_single.m3u8: TAG = GEN
+tests/data/hls_segment_single.m3u8: ffmpeg$(PROGSSUF)$(EXESUF) | tests/data
+	$(M)$(TARGET_EXEC) $(TARGET_PATH)/$< \
+	-f lavfi -i "aevalsrc=cos(2*PI*t)*sin(2*PI*(440+4*t)*t):d=20" -f hls -hls_flags single_file -map 0 \
+	-hls_list_size 0 -codec:a mp2fixed -hls_segment_filename $(TARGET_PATH)/tests/data/hls_segment_single.ts \
+	$(TARGET_PATH)/tests/data/hls_segment_single.m3u8 2>/dev/null
+
+FATE_AFILTER-$(call ALLYES, HLS_DEMUXER MPEGTS_MUXER MPEGTS_DEMUXER AEVALSRC_FILTER LAVFI_INDEV MP2FIXED_ENCODER) += fate-hls-segment-single
+fate-hls-segment-single: tests/data/hls_segment_single.m3u8
+fate-hls-segment-single: CMD = framecrc -flags +bitexact -i $(TARGET_PATH)/tests/data/hls_segment_single.m3u8 -vf setpts=N*23
+
+tests/data/hls_init_time.m3u8: TAG = GEN
+tests/data/hls_init_time.m3u8: ffmpeg$(PROGSSUF)$(EXESUF) | tests/data
+	$(M)$(TARGET_EXEC) $(TARGET_PATH)/$< \
+	-f lavfi -i "aevalsrc=cos(2*PI*t)*sin(2*PI*(440+4*t)*t):d=11" -f hls -hls_init_time 1 -hls_time 3 -map 0 \
+	-hls_list_size 5 -codec:a mp2fixed -hls_segment_filename $(TARGET_PATH)/tests/data/hls_init_time_%d.ts \
+	$(TARGET_PATH)/tests/data/hls_init_time.m3u8 2>/dev/null
+
+FATE_AFILTER-$(call ALLYES, HLS_DEMUXER MPEGTS_MUXER MPEGTS_DEMUXER AEVALSRC_FILTER LAVFI_INDEV MP2FIXED_ENCODER) += fate-hls-init-time
+fate-hls-init-time: tests/data/hls_init_time.m3u8
+fate-hls-init-time: CMD = framecrc -flags +bitexact -i $(TARGET_PATH)/tests/data/hls_init_time.m3u8 -vf setpts=N*23
+
+tests/data/hls_list_size.m3u8: TAG = GEN
+tests/data/hls_list_size.m3u8: ffmpeg$(PROGSSUF)$(EXESUF) | tests/data
+	$(M)$(TARGET_EXEC) $(TARGET_PATH)/$< \
+	-f lavfi -i "aevalsrc=cos(2*PI*t)*sin(2*PI*(440+4*t)*t):d=20" -f hls -hls_time 4 -map 0 \
+	-hls_list_size 4 -codec:a mp2fixed -hls_segment_filename $(TARGET_PATH)/tests/data/hls_list_size_%d.ts \
+	$(TARGET_PATH)/tests/data/hls_list_size.m3u8 2>/dev/null
+
+FATE_AFILTER-$(call ALLYES, HLS_DEMUXER MPEGTS_MUXER MPEGTS_DEMUXER AEVALSRC_FILTER LAVFI_INDEV MP2FIXED_ENCODER) += fate-hls-list-size
+fate-hls-list-size: tests/data/hls_list_size.m3u8
+fate-hls-list-size: CMD = framecrc -flags +bitexact -i $(TARGET_PATH)/tests/data/hls_list_size.m3u8 -vf setpts=N*23
+
+tests/data/hls_segment_type_fmp4.m3u8: TAG = GEN
+tests/data/hls_segment_type_fmp4.m3u8: ffmpeg$(PROGSSUF)$(EXESUF) | tests/data
+	$(M)$(TARGET_EXEC) $(TARGET_PATH)/$< \
+	-f lavfi -re -i "aevalsrc=cos(2*PI*t)*sin(2*PI*(440+4*t)*t):d=5" -map 0 -codec:a mp2fixed \
+	-hls_segment_type mpegts -hls_fmp4_init_filename now.mp4 -hls_list_size 0 \
+	-hls_time 1 -hls_segment_filename "$(TARGET_PATH)/tests/data/hls_fmp4_%d.m4s" \
+	$(TARGET_PATH)/tests/data/hls_fmp4.m3u8 2>/dev/null
+
+FATE_AFILTER-$(call ALLYES, HLS_DEMUXER MPEGTS_MUXER MPEGTS_DEMUXER AEVALSRC_FILTER LAVFI_INDEV MP2FIXED_ENCODER) += fate-hls-fmp4
+fate-hls-fmp4: tests/data/hls_segment_type_fmp4.m3u8
+fate-hls-fmp4: CMD = framecrc -flags +bitexact -i $(TARGET_PATH)/tests/data/hls_fmp4.m3u8 -vf setpts=N*23
+
diff --git a/tests/fate/hw.mak b/tests/fate/hw.mak
index d606cde..0f12689 100644
--- a/tests/fate/hw.mak
+++ b/tests/fate/hw.mak
@@ -1,6 +1,6 @@
 FATE_HWCONTEXT += fate-hwdevice
 fate-hwdevice: libavutil/tests/hwdevice$(EXESUF)
-fate-hwdevice: CMD = run libavutil/tests/hwdevice
+fate-hwdevice: CMD = run libavutil/tests/hwdevice$(EXESUF)
 fate-hwdevice: CMP = null
 
 FATE_HW-$(CONFIG_AVUTIL) += $(FATE_HWCONTEXT)
diff --git a/tests/fate/lavf-audio.mak b/tests/fate/lavf-audio.mak
new file mode 100644
index 0000000..0be7a3a
--- /dev/null
+++ b/tests/fate/lavf-audio.mak
@@ -0,0 +1,38 @@
+FATE_LAVF_AUDIO-$(call ENCDEC,  PCM_S16BE,    AIFF)             += aiff
+FATE_LAVF_AUDIO-$(call ENCDEC,  PCM_ALAW,     PCM_ALAW)         += al
+FATE_LAVF_AUDIO-$(call ENCDEC,  PCM_S16BE_PLANAR, AST)          += ast
+FATE_LAVF_AUDIO-$(call ENCDEC,  PCM_S16BE,    AU)               += au
+FATE_LAVF_AUDIO-$(call ENCDEC,  PCM_S16BE,    CAF)              += caf
+FATE_LAVF_AUDIO-$(call ENCDEC,  ADPCM_YAMAHA, MMF)              += mmf
+FATE_LAVF_AUDIO-$(call ENCDEC,  FLAC,         OGG)              += ogg
+FATE_LAVF_AUDIO-$(call ENCDEC,  PCM_U8,       RSO)              += rso
+FATE_LAVF_AUDIO-$(call ENCDEC,  PCM_S16LE,    SOX)              += sox
+FATE_LAVF_AUDIO-$(call ENCDEC,  PCM_MULAW,    PCM_MULAW)        += ul
+FATE_LAVF_AUDIO-$(call ENCDEC,  PCM_U8,       VOC)              += voc
+FATE_LAVF_AUDIO-$(call ENCDEC,  PCM_S16LE,    IRCAM)            += ircam
+FATE_LAVF_AUDIO-$(call ENCDEC,  PCM_S16LE,    VOC)              += s16.voc
+FATE_LAVF_AUDIO-$(call ENCDEC,  PCM_S16LE,    WAV)              += wav
+FATE_LAVF_AUDIO-$(call ENCDEC,  PCM_S16LE,    WAV)              += peak.wav
+FATE_LAVF_AUDIO-$(call ENCDEC,  PCM_S16LE,    WAV)              += peak_only.wav
+FATE_LAVF_AUDIO-$(call ENCDEC,  PCM_S16LE,    W64)              += w64
+FATE_LAVF_AUDIO-$(call ENCDEC,  TTA,          TTA)              += tta
+FATE_LAVF_AUDIO-$(call ENCMUX,  TTA,          MATROSKA_AUDIO)   += mka
+FATE_LAVF_AUDIO-$(call ENCDEC,  WAVPACK,      WV)               += wv
+
+FATE_LAVF_AUDIO = $(FATE_LAVF_AUDIO-yes:%=fate-lavf-%)
+
+$(FATE_LAVF_AUDIO): CMD = lavf_audio
+$(FATE_LAVF_AUDIO): REF = $(SRC_PATH)/tests/ref/lavf/$(@:fate-lavf-%=%)
+$(FATE_LAVF_AUDIO): $(AREF)
+
+fate-lavf-al fate-lavf-ul: CMD = lavf_audio "" "" "-ar 44100"
+fate-lavf-ogg: CMD = lavf_audio "" "-c:a flac"
+fate-lavf-s16.voc: CMD = lavf_audio "-ac 2" "-c:a pcm_s16le"
+fate-lavf-ast: CMD = lavf_audio "-ac 2" "-loopstart 1 -loopend 10"
+fate-lavf-mka: CMD = lavf_audio "" "-c:a tta"
+fate-lavf-voc: CMD = lavf_audio "" "-c:a pcm_u8"
+fate-lavf-peak.wav: CMD = lavf_audio "" "-write_peak on"
+fate-lavf-peak_only.wav: CMD = lavf_audio "" "-write_peak only"
+
+FATE_AVCONV += $(FATE_LAVF_AUDIO)
+fate-lavf-audio fate-lavf: $(FATE_LAVF_AUDIO)
diff --git a/tests/fate/lavf-container.mak b/tests/fate/lavf-container.mak
new file mode 100644
index 0000000..9e0eed4
--- /dev/null
+++ b/tests/fate/lavf-container.mak
@@ -0,0 +1,85 @@
+FATE_LAVF_CONTAINER-$(call ENCDEC2, MSMPEG4V3,  MP2,       ASF)                += asf
+FATE_LAVF_CONTAINER-$(call ENCDEC2, MPEG4,      MP2,       AVI)                += avi
+FATE_LAVF_CONTAINER-$(call ENCDEC2, DVVIDEO,    PCM_S16LE, AVI)                += dv dv_pal dv_ntsc
+FATE_LAVF_CONTAINER-$(call ENCDEC,  FLV,                   FLV)                += flv
+FATE_LAVF_CONTAINER-$(call ENCDEC,  RAWVIDEO,              FILMSTRIP)          += flm
+FATE_LAVF_CONTAINER-$(call ENCDEC2, MPEG2VIDEO, PCM_S16LE, GXF)                += gxf gxf_pal gxf_ntsc
+FATE_LAVF_CONTAINER-$(call ENCDEC2, MPEG4,      MP2,       MATROSKA)           += mkv mkv_attachment
+FATE_LAVF_CONTAINER-$(call ENCDEC2, MPEG4,      PCM_ALAW,  MOV)                += mov mov_rtphint ismv
+FATE_LAVF_CONTAINER-$(call ENCDEC,  MPEG4,                 MOV)                += mp4
+FATE_LAVF_CONTAINER-$(call ENCDEC2, MPEG1VIDEO, MP2,       MPEG1SYSTEM MPEGPS) += mpg
+FATE_LAVF_CONTAINER-$(call ENCDEC2, MPEG2VIDEO, PCM_S16LE, MXF)                += mxf mxf_dv25 mxf_dvcpro50
+FATE_LAVF_CONTAINER-$(call ENCDEC2, MPEG2VIDEO, PCM_S16LE, MXF_D10 MXF)        += mxf_d10
+FATE_LAVF_CONTAINER-$(call ENCDEC2, DNXHD,      PCM_S16LE, MXF_OPATOM MXF)     += mxf_opatom mxf_opatom_audio
+FATE_LAVF_CONTAINER-$(call ENCDEC2, MPEG4,      MP2,       NUT)                += nut
+FATE_LAVF_CONTAINER-$(call ENCMUX,  RV10 AC3_FIXED,        RM)                 += rm
+FATE_LAVF_CONTAINER-$(call ENCMUX,  MJPEG PCM_S16LE,       SMJPEG)             += smjpeg
+FATE_LAVF_CONTAINER-$(call ENCDEC,  FLV,                   SWF)                += swf
+FATE_LAVF_CONTAINER-$(call ENCDEC2, MPEG2VIDEO, MP2,       MPEGTS)             += ts
+FATE_LAVF_CONTAINER-$(call ENCDEC,  MP2,                   WTV)                += wtv
+
+FATE_LAVF_CONTAINER = $(FATE_LAVF_CONTAINER-yes:%=fate-lavf-%)
+
+$(FATE_LAVF_CONTAINER): CMD = lavf_container
+$(FATE_LAVF_CONTAINER): REF = $(SRC_PATH)/tests/ref/lavf/$(@:fate-lavf-%=%)
+$(FATE_LAVF_CONTAINER): $(AREF) $(VREF)
+
+fate-lavf-asf: CMD = lavf_container "" "-c:a mp2 -ar 44100" "-r 25"
+fate-lavf-avi fate-lavf-nut: CMD = lavf_container "" "-c:a mp2 -ar 44100 -threads 1"
+fate-lavf-dv:  CMD = lavf_container "-ar 48000 -channel_layout stereo" "-r 25 -s pal"
+fate-lavf-dv_pal:  CMD = lavf_container_timecode_nodrop "-ar 48000 -r 25 -s pal -ac 2 -f dv"
+fate-lavf-dv_ntsc:  CMD = lavf_container_timecode_drop "-ar 48000 -pix_fmt yuv411p -s ntsc -ac 2 -f dv"
+fate-lavf-flv fate-lavf-swf: CMD = lavf_container "" "-an"
+fate-lavf-flm: CMD = lavf_container "" "-pix_fmt rgba"
+fate-lavf-gxf: CMD = lavf_container "-ar 48000" "-r 25 -s pal -ac 1 -threads 1"
+fate-lavf-gxf_pal: CMD = lavf_container_timecode_nodrop "-ar 48000 -r 25 -s pal -ac 1 -threads 1 -f gxf"
+fate-lavf-gxf_ntsc: CMD = lavf_container_timecode_drop "-ar 48000 -s ntsc -ac 1 -threads 1 -f gxf"
+fate-lavf-ismv: CMD = lavf_container_timecode "-an -write_tmcd 1 -c:v mpeg4 -threads 1"
+fate-lavf-mkv: CMD = lavf_container "" "-c:a mp2 -c:v mpeg4 -ar 44100 -threads 1"
+fate-lavf-mkv_attachment: CMD = lavf_container_attach "-c:a mp2 -c:v mpeg4 -threads 1 -f matroska"
+fate-lavf-mov: CMD = lavf_container_timecode "-movflags +faststart -c:a pcm_alaw -c:v mpeg4 -threads 1"
+fate-lavf-mov_rtphint: CMD = lavf_container "" "-movflags +rtphint -c:a pcm_alaw -c:v mpeg4 -threads 1 -f mov"
+fate-lavf-mp4: CMD = lavf_container_timecode "-c:v mpeg4 -an -threads 1"
+fate-lavf-mpg: CMD = lavf_container_timecode "-ar 44100 -threads 1"
+fate-lavf-mxf: CMD = lavf_container_timecode "-ar 48000 -bf 2 -threads 1"
+fate-lavf-mxf_d10: CMD = lavf_container "-ar 48000 -ac 2" "-r 25 -vf scale=720:576,pad=720:608:0:32 -c:v mpeg2video -g 0 -flags +ildct+low_delay -dc 10 -non_linear_quant 1 -intra_vlc 1 -qscale 1 -ps 1 -qmin 1 -rc_max_vbv_use 1 -rc_min_vbv_use 1 -pix_fmt yuv422p -minrate 30000k -maxrate 30000k -b 30000k -bufsize 1200000 -top 1 -rc_init_occupancy 1200000 -qmax 12 -f mxf_d10"
+fate-lavf-mxf_dv25: CMD = lavf_container "-ar 48000 -ac 2" "-r 25 -vf scale=720:576,setdar=4/3 -c:v dvvideo -pix_fmt yuv420p -b 25000k -top 0 -f mxf"
+fate-lavf-mxf_dvcpro50: CMD = lavf_container "-ar 48000 -ac 2" "-r 25 -vf scale=720:576,setdar=16/9 -c:v dvvideo -pix_fmt yuv422p -b 50000k -top 0 -f mxf"
+fate-lavf-mxf_opatom: CMD = lavf_container "" "-s 1920x1080 -c:v dnxhd -pix_fmt yuv422p -vb 36M -f mxf_opatom -map 0"
+fate-lavf-mxf_opatom_audio: CMD = lavf_container "-ar 48000 -ac 1" "-f mxf_opatom -mxf_audio_edit_rate 25 -map 1"
+fate-lavf-smjpeg:  CMD = lavf_container "" "-f smjpeg"
+# The RealMedia muxer is broken.
+fate-lavf-rm:  CMD = lavf_container "" "-c:a ac3_fixed" disable_crc
+fate-lavf-ts:  CMD = lavf_container "" "-mpegts_transport_stream_id 42 -ar 44100 -threads 1"
+fate-lavf-wtv: CMD = lavf_container "" "-c:a mp2 -threads 1"
+
+FATE_AVCONV += $(FATE_LAVF_CONTAINER)
+fate-lavf-container fate-lavf: $(FATE_LAVF_CONTAINER)
+
+FATE_LAVF_CONTAINER_FATE-$(call ALLYES, IVF_DEMUXER AV1_PARSER MOV_MUXER)      += av1.mp4
+FATE_LAVF_CONTAINER_FATE-$(call ALLYES, IVF_DEMUXER AV1_PARSER MATROSKA_MUXER) += av1.mkv
+FATE_LAVF_CONTAINER_FATE-$(call ALLYES, H264_DEMUXER H264_PARSER MOV_MUXER)    += h264.mp4
+FATE_LAVF_CONTAINER_FATE-$(call ALLYES, MATROSKA_DEMUXER   OGG_MUXER)          += vp3.ogg
+FATE_LAVF_CONTAINER_FATE-$(call ALLYES, MATROSKA_DEMUXER   OGV_MUXER)          += vp8.ogg
+FATE_LAVF_CONTAINER_FATE-$(call ALLYES, MOV_DEMUXER        LATM_MUXER)         += latm
+FATE_LAVF_CONTAINER_FATE-$(call ALLYES, MP3_DEMUXER        MP3_MUXER)          += mp3
+FATE_LAVF_CONTAINER_FATE-$(call ALLYES, MOV_DEMUXER        MOV_MUXER)          += qtrle_mace6.mov
+FATE_LAVF_CONTAINER_FATE-$(call ALLYES, AVI_DEMUXER        AVI_MUXER)          += cram.avi
+
+FATE_LAVF_CONTAINER_FATE = $(FATE_LAVF_CONTAINER_FATE-yes:%=fate-lavf-fate-%)
+
+$(FATE_LAVF_CONTAINER_FATE): REF = $(SRC_PATH)/tests/ref/lavf-fate/$(@:fate-lavf-fate-%=%)
+$(FATE_LAVF_CONTAINER_FATE): $(AREF) $(VREF)
+
+fate-lavf-fate-av1.mp4: CMD = lavf_container_fate "av1-test-vectors/av1-1-b8-05-mv.ivf" "" "-c:v copy"
+fate-lavf-fate-av1.mkv: CMD = lavf_container_fate "av1-test-vectors/av1-1-b8-05-mv.ivf" "" "-c:v copy"
+fate-lavf-fate-h264.mp4: CMD = lavf_container_fate "h264/intra_refresh.h264" "" "-c:v copy"
+fate-lavf-fate-vp3.ogg: CMD = lavf_container_fate "vp3/coeff_level64.mkv" "-idct auto"
+fate-lavf-fate-vp8.ogg: CMD = lavf_container_fate "vp8/RRSF49-short.webm" "" "-acodec copy"
+fate-lavf-fate-latm: CMD = lavf_container_fate "aac/al04_44.mp4" "" "-acodec copy"
+fate-lavf-fate-mp3: CMD = lavf_container_fate "mp3-conformance/he_32khz.bit" "" "-acodec copy"
+fate-lavf-fate-qtrle_mace6.mov: CMD = lavf_container_fate "qtrle/Animation-16Greys.mov" "-idct auto"
+fate-lavf-fate-cram.avi: CMD = lavf_container_fate "cram/toon.avi" "-idct auto"
+
+FATE_SAMPLES_FFMPEG += $(FATE_LAVF_CONTAINER_FATE)
+fate-lavf-fate fate-lavf: $(FATE_LAVF_CONTAINER_FATE)
diff --git a/tests/fate/lavf-image.mak b/tests/fate/lavf-image.mak
new file mode 100644
index 0000000..dbbd374
--- /dev/null
+++ b/tests/fate/lavf-image.mak
@@ -0,0 +1,64 @@
+FATE_LAVF_IMAGES-$(call ENCDEC,  BMP,            IMAGE2)             += bmp
+FATE_LAVF_IMAGES-$(call ENCDEC,  DPX,            IMAGE2)             += dpx
+FATE_LAVF_IMAGES-$(call ENCDEC,  DPX,            IMAGE2)             += gbrp10le.dpx
+FATE_LAVF_IMAGES-$(call ENCDEC,  DPX,            IMAGE2)             += gbrp12le.dpx
+FATE_LAVF_IMAGES-$(call ENCDEC,  DPX,            IMAGE2)             += rgb48le.dpx
+FATE_LAVF_IMAGES-$(call ENCDEC,  DPX,            IMAGE2)             += rgb48le_10.dpx
+FATE_LAVF_IMAGES-$(call ENCDEC,  DPX,            IMAGE2)             += rgba64le.dpx
+FATE_LAVF_IMAGES-$(call ENCDEC,  MJPEG,          IMAGE2)             += jpg
+FATE_LAVF_IMAGES-$(call ENCDEC,  PAM,            IMAGE2)             += pam
+FATE_LAVF_IMAGES-$(call ENCDEC,  PAM,            IMAGE2)             += rgba.pam
+FATE_LAVF_IMAGES-$(call ENCDEC,  PAM,            IMAGE2)             += gray.pam
+FATE_LAVF_IMAGES-$(call ENCDEC,  PAM,            IMAGE2)             += gray16be.pam
+FATE_LAVF_IMAGES-$(call ENCDEC,  PAM,            IMAGE2)             += rgb48be.pam
+FATE_LAVF_IMAGES-$(call ENCDEC,  PAM,            IMAGE2)             += monob.pam
+FATE_LAVF_IMAGES-$(call ENCDEC,  PCX,            IMAGE2)             += pcx
+FATE_LAVF_IMAGES-$(call ENCDEC,  PGM,            IMAGE2)             += pgm
+FATE_LAVF_IMAGES-$(call ENCDEC,  PNG,            IMAGE2)             += png
+FATE_LAVF_IMAGES-$(call ENCDEC,  PNG,            IMAGE2)             += gray16be.png
+FATE_LAVF_IMAGES-$(call ENCDEC,  PNG,            IMAGE2)             += rgb48be.png
+FATE_LAVF_IMAGES-$(call ENCDEC,  PPM,            IMAGE2)             += ppm
+FATE_LAVF_IMAGES-$(call ENCDEC,  SGI,            IMAGE2)             += sgi
+FATE_LAVF_IMAGES-$(call ENCDEC,  SUNRAST,        IMAGE2)             += sun
+FATE_LAVF_IMAGES-$(call ENCDEC,  TARGA,          IMAGE2)             += tga
+FATE_LAVF_IMAGES-$(call ENCDEC,  TIFF,           IMAGE2)             += tiff
+FATE_LAVF_IMAGES-$(call ENCDEC,  XBM,            IMAGE2)             += xbm
+FATE_LAVF_IMAGES-$(call ENCDEC,  XWD,            IMAGE2)             += xwd
+FATE_LAVF_IMAGES-$(call ENCDEC,  XWD,            IMAGE2)             += rgba.xwd
+FATE_LAVF_IMAGES-$(call ENCDEC,  XWD,            IMAGE2)             += rgb565be.xwd
+FATE_LAVF_IMAGES-$(call ENCDEC,  XWD,            IMAGE2)             += rgb555be.xwd
+FATE_LAVF_IMAGES-$(call ENCDEC,  XWD,            IMAGE2)             += rgb8.xwd
+FATE_LAVF_IMAGES-$(call ENCDEC,  XWD,            IMAGE2)             += rgb4_byte.xwd
+FATE_LAVF_IMAGES-$(call ENCDEC,  XWD,            IMAGE2)             += gray.xwd
+FATE_LAVF_IMAGES-$(call ENCDEC,  XWD,            IMAGE2)             += monow.xwd
+
+FATE_LAVF_IMAGES = $(FATE_LAVF_IMAGES-yes:%=fate-lavf-%)
+
+$(FATE_LAVF_IMAGES): CMD = lavf_image
+$(FATE_LAVF_IMAGES): REF = $(SRC_PATH)/tests/ref/lavf/$(@:fate-lavf-%=%)
+$(FATE_LAVF_IMAGES): $(VREF)
+
+fate-lavf-jpg: CMD = lavf_image "-pix_fmt yuvj420p"
+fate-lavf-tiff: CMD = lavf_image "-pix_fmt rgb24"
+fate-lavf-gbrp10le.dpx: CMD = lavf_image "-pix_fmt gbrp10le" "-pix_fmt gbrp10le"
+fate-lavf-gbrp12le.dpx: CMD = lavf_image "-pix_fmt gbrp12le" "-pix_fmt gbrp12le"
+fate-lavf-rgb48le.dpx: CMD = lavf_image "-pix_fmt rgb48le"
+fate-lavf-rgb48le_10.dpx: CMD = lavf_image "-pix_fmt rgb48le -bits_per_raw_sample 10" "-pix_fmt rgb48le"
+fate-lavf-rgba64le.dpx: CMD = lavf_image "-pix_fmt rgba64le"
+fate-lavf-rgba.pam: CMD = lavf_image "-pix_fmt rgba"
+fate-lavf-gray.pam: CMD = lavf_image "-pix_fmt gray"
+fate-lavf-gray16be.pam: CMD = lavf_image "-pix_fmt gray16be" "-pix_fmt gray16be"
+fate-lavf-rgb48be.pam: CMD = lavf_image "-pix_fmt rgb48be" "-pix_fmt rgb48be"
+fate-lavf-monob.pam: CMD = lavf_image "-pix_fmt monob"
+fate-lavf-gray16be.png: CMD = lavf_image "-pix_fmt gray16be"
+fate-lavf-rgb48be.png: CMD = lavf_image "-pix_fmt rgb48be"
+fate-lavf-rgba.xwd: CMD = lavf_image "-pix_fmt rgba"
+fate-lavf-rgb565be.xwd: CMD = lavf_image "-pix_fmt rgb565be"
+fate-lavf-rgb555be.xwd: CMD = lavf_image "-pix_fmt rgb555be"
+fate-lavf-rgb8.xwd: CMD = lavf_image "-pix_fmt rgb8"
+fate-lavf-rgb4_byte.xwd: CMD = lavf_image "-pix_fmt rgb4_byte"
+fate-lavf-gray.xwd: CMD = lavf_image "-pix_fmt gray"
+fate-lavf-monow.xwd: CMD = lavf_image "-pix_fmt monow"
+
+FATE_AVCONV += $(FATE_LAVF_IMAGES)
+fate-lavf-images fate-lavf: $(FATE_LAVF_IMAGES)
diff --git a/tests/fate/lavf-image2pipe.mak b/tests/fate/lavf-image2pipe.mak
new file mode 100644
index 0000000..297f677
--- /dev/null
+++ b/tests/fate/lavf-image2pipe.mak
@@ -0,0 +1,12 @@
+FATE_LAVF_IMAGE2PIPE-$(call ENCDEC,     PBM,    IMAGE2PIPE)     += pbmpipe
+FATE_LAVF_IMAGE2PIPE-$(call ENCDEC,     PGM,    IMAGE2PIPE)     += pgmpipe
+FATE_LAVF_IMAGE2PIPE-$(call ENCDEC,     PPM,    IMAGE2PIPE)     += ppmpipe
+
+FATE_LAVF_IMAGE2PIPE = $(FATE_LAVF_IMAGE2PIPE-yes:%=fate-lavf-%)
+
+$(FATE_LAVF_IMAGE2PIPE): CMD = lavf_image2pipe
+$(FATE_LAVF_IMAGE2PIPE): REF = $(SRC_PATH)/tests/ref/lavf/$(@:fate-lavf-%=%)
+$(FATE_LAVF_IMAGE2PIPE): $(VREF)
+
+FATE_AVCONV += $(FATE_LAVF_IMAGE2PIPE)
+fate-lavf-image2pipe fate-lavf: $(FATE_LAVF_IMAGE2PIPE)
diff --git a/tests/fate/lavf-video.mak b/tests/fate/lavf-video.mak
new file mode 100644
index 0000000..f6e9824
--- /dev/null
+++ b/tests/fate/lavf-video.mak
@@ -0,0 +1,29 @@
+FATE_LAVF_VIDEO-$(call ENCDEC,  APNG,       APNG)               += apng
+FATE_LAVF_VIDEO-$(call ENCDEC,  APNG,       APNG)               += apng.png
+FATE_LAVF_VIDEO-$(call ENCDEC,  FITS,       FITS)               += gray.fits
+FATE_LAVF_VIDEO-$(call ENCDEC,  FITS,       FITS)               += gray16be.fits
+FATE_LAVF_VIDEO-$(call ENCDEC,  FITS,       FITS)               += gbrp.fits
+FATE_LAVF_VIDEO-$(call ENCDEC,  FITS,       FITS)               += gbrap.fits
+FATE_LAVF_VIDEO-$(call ENCDEC,  FITS,       FITS)               += gbrp16be.fits
+FATE_LAVF_VIDEO-$(call ENCDEC,  FITS,       FITS)               += gbrap16be.fits
+FATE_LAVF_VIDEO-$(call ENCDEC,  GIF,         GIF)               += gif
+FATE_LAVF_VIDEO-$(CONFIG_YUV4MPEGPIPE_MUXER)                    += y4m
+
+FATE_LAVF_VIDEO = $(FATE_LAVF_VIDEO-yes:%=fate-lavf-%)
+
+$(FATE_LAVF_VIDEO): CMD = lavf_video
+$(FATE_LAVF_VIDEO): REF = $(SRC_PATH)/tests/ref/lavf/$(@:fate-lavf-%=%)
+$(FATE_LAVF_VIDEO): $(VREF)
+
+fate-lavf-apng: CMD = lavf_video "-pix_fmt rgb24"
+fate-lavf-apng.png: CMD = lavf_video "-pix_fmt rgb24" "-frames:v 1 -f apng"
+fate-lavf-gray.fits: CMD = lavf_video "-pix_fmt gray"
+fate-lavf-gray16be.fits: CMD = lavf_video "-pix_fmt gray16be"
+fate-lavf-gbrp.fits: CMD = lavf_video "-pix_fmt gbrp"
+fate-lavf-gbrap.fits: CMD = lavf_video "-pix_fmt gbrap"
+fate-lavf-gbrp16be.fits: CMD = lavf_video "-pix_fmt gbrp16be"
+fate-lavf-gbrap16be.fits: CMD = lavf_video "-pix_fmt gbrap16be"
+fate-lavf-gif: CMD = lavf_video "-pix_fmt rgb24"
+
+FATE_AVCONV += $(FATE_LAVF_VIDEO)
+fate-lavf-video fate-lavf: $(FATE_LAVF_VIDEO)
diff --git a/tests/fate/libavcodec.mak b/tests/fate/libavcodec.mak
index aa4c36b..747dae3 100644
--- a/tests/fate/libavcodec.mak
+++ b/tests/fate/libavcodec.mak
@@ -1,96 +1,101 @@
 FATE_LIBAVCODEC-yes += fate-avpacket
 fate-avpacket: libavcodec/tests/avpacket$(EXESUF)
-fate-avpacket: CMD = run libavcodec/tests/avpacket
+fate-avpacket: CMD = run libavcodec/tests/avpacket$(EXESUF)
 fate-avpacket: CMP = null
 
 FATE_LIBAVCODEC-$(CONFIG_CABAC) += fate-cabac
 fate-cabac: libavcodec/tests/cabac$(EXESUF)
-fate-cabac: CMD = run libavcodec/tests/cabac
+fate-cabac: CMD = run libavcodec/tests/cabac$(EXESUF)
 fate-cabac: CMP = null
 
 FATE_LIBAVCODEC-yes += fate-celp_math
 fate-celp_math: libavcodec/tests/celp_math$(EXESUF)
-fate-celp_math: CMD = run libavcodec/tests/celp_math
+fate-celp_math: CMD = run libavcodec/tests/celp_math$(EXESUF)
 fate-celp_math: CMP = null
 
 FATE_LIBAVCODEC-yes += fate-codec_desc
 fate-codec_desc: libavcodec/tests/codec_desc$(EXESUF)
-fate-codec_desc: CMD = run libavcodec/tests/codec_desc
+fate-codec_desc: CMD = run libavcodec/tests/codec_desc$(EXESUF)
 fate-codec_desc: CMP = null
 
 FATE_LIBAVCODEC-$(CONFIG_GOLOMB) += fate-golomb
 fate-golomb: libavcodec/tests/golomb$(EXESUF)
-fate-golomb: CMD = run libavcodec/tests/golomb
+fate-golomb: CMD = run libavcodec/tests/golomb$(EXESUF)
 fate-golomb: CMP = null
 
 FATE_LIBAVCODEC-$(CONFIG_IDCTDSP) += fate-idct8x8-0 fate-idct8x8-1 fate-idct8x8-2 fate-idct248
 
 fate-idct8x8-0: libavcodec/tests/dct$(EXESUF)
-fate-idct8x8-0: CMD = run libavcodec/tests/dct -i 0
+fate-idct8x8-0: CMD = run libavcodec/tests/dct$(EXESUF) -i 0
 fate-idct8x8-0: CMP = null
 
 fate-idct8x8-1: libavcodec/tests/dct$(EXESUF)
-fate-idct8x8-1: CMD = run libavcodec/tests/dct -i 1
+fate-idct8x8-1: CMD = run libavcodec/tests/dct$(EXESUF) -i 1
 fate-idct8x8-1: CMP = null
 
 fate-idct8x8-2: libavcodec/tests/dct$(EXESUF)
-fate-idct8x8-2: CMD = run libavcodec/tests/dct -i 2
+fate-idct8x8-2: CMD = run libavcodec/tests/dct$(EXESUF) -i 2
 fate-idct8x8-2: CMP = null
 
 fate-idct248: libavcodec/tests/dct$(EXESUF)
-fate-idct248: CMD = run libavcodec/tests/dct -4
+fate-idct248: CMD = run libavcodec/tests/dct$(EXESUF) -4
 fate-idct248: CMP = null
 
 FATE_LIBAVCODEC-$(CONFIG_IDCTDSP) += fate-dct8x8
 fate-dct8x8: libavcodec/tests/dct$(EXESUF)
-fate-dct8x8: CMD = run libavcodec/tests/dct
+fate-dct8x8: CMD = run libavcodec/tests/dct$(EXESUF)
 fate-dct8x8: CMP = null
 
-FATE_LIBAVCODEC-$(CONFIG_H264_VAAPI_ENCODER) += fate-h264-levels
+FATE_LIBAVCODEC-$(CONFIG_H264_METADATA_BSF) += fate-h264-levels
 fate-h264-levels: libavcodec/tests/h264_levels$(EXESUF)
-fate-h264-levels: CMD = run libavcodec/tests/h264_levels
+fate-h264-levels: CMD = run libavcodec/tests/h264_levels$(EXESUF)
 fate-h264-levels: REF = /dev/null
 
+FATE_LIBAVCODEC-$(CONFIG_HEVC_METADATA_BSF) += fate-h265-levels
+fate-h265-levels: libavcodec/tests/h265_levels$(EXESUF)
+fate-h265-levels: CMD = run libavcodec/tests/h265_levels$(EXESUF)
+fate-h265-levels: REF = /dev/null
+
 FATE_LIBAVCODEC-$(CONFIG_IIRFILTER) += fate-iirfilter
 fate-iirfilter: libavcodec/tests/iirfilter$(EXESUF)
-fate-iirfilter: CMD = run libavcodec/tests/iirfilter
+fate-iirfilter: CMD = run libavcodec/tests/iirfilter$(EXESUF)
 
 FATE_LIBAVCODEC-$(CONFIG_MPEGVIDEO) += fate-mpeg12framerate
 fate-mpeg12framerate: libavcodec/tests/mpeg12framerate$(EXESUF)
-fate-mpeg12framerate: CMD = run libavcodec/tests/mpeg12framerate
+fate-mpeg12framerate: CMD = run libavcodec/tests/mpeg12framerate$(EXESUF)
 fate-mpeg12framerate: REF = /dev/null
 
 FATE_LIBAVCODEC-yes += fate-libavcodec-options
 fate-libavcodec-options: libavcodec/tests/options$(EXESUF)
-fate-libavcodec-options: CMD = run libavcodec/tests/options
+fate-libavcodec-options: CMD = run libavcodec/tests/options$(EXESUF)
 
 FATE_LIBAVCODEC-$(CONFIG_RANGECODER) += fate-rangecoder
 fate-rangecoder: libavcodec/tests/rangecoder$(EXESUF)
-fate-rangecoder: CMD = run libavcodec/tests/rangecoder
+fate-rangecoder: CMD = run libavcodec/tests/rangecoder$(EXESUF)
 fate-rangecoder: CMP = null
 
 FATE_LIBAVCODEC-yes += fate-mathops
 fate-mathops: libavcodec/tests/mathops$(EXESUF)
-fate-mathops: CMD = run libavcodec/tests/mathops
+fate-mathops: CMD = run libavcodec/tests/mathops$(EXESUF)
 fate-mathops: CMP = null
 
 FATE_LIBAVCODEC-$(CONFIG_JPEG2000_ENCODER) += fate-j2k-dwt
 fate-j2k-dwt: libavcodec/tests/jpeg2000dwt$(EXESUF)
-fate-j2k-dwt: CMD = run libavcodec/tests/jpeg2000dwt
+fate-j2k-dwt: CMD = run libavcodec/tests/jpeg2000dwt$(EXESUF)
 
 FATE_LIBAVCODEC-yes += fate-libavcodec-utils
 fate-libavcodec-utils: libavcodec/tests/utils$(EXESUF)
-fate-libavcodec-utils: CMD = run libavcodec/tests/utils
+fate-libavcodec-utils: CMD = run libavcodec/tests/utils$(EXESUF)
 fate-libavcodec-utils: CMP = null
 
 FATE_LIBAVCODEC-yes += fate-libavcodec-huffman
 fate-libavcodec-huffman: libavcodec/tests/mjpegenc_huffman$(EXESUF)
-fate-libavcodec-huffman: CMD = run libavcodec/tests/mjpegenc_huffman
+fate-libavcodec-huffman: CMD = run libavcodec/tests/mjpegenc_huffman$(EXESUF)
 fate-libavcodec-huffman: CMP = null
 
 FATE_LIBAVCODEC-yes += fate-libavcodec-htmlsubtitles
 fate-libavcodec-htmlsubtitles: libavcodec/tests/htmlsubtitles$(EXESUF)
-fate-libavcodec-htmlsubtitles: CMD = run libavcodec/tests/htmlsubtitles
+fate-libavcodec-htmlsubtitles: CMD = run libavcodec/tests/htmlsubtitles$(EXESUF)
 
 FATE-$(CONFIG_AVCODEC) += $(FATE_LIBAVCODEC-yes)
 fate-libavcodec: $(FATE_LIBAVCODEC-yes)
diff --git a/tests/fate/libavformat.mak b/tests/fate/libavformat.mak
index cf1ba18..d1e8128 100644
--- a/tests/fate/libavformat.mak
+++ b/tests/fate/libavformat.mak
@@ -4,23 +4,23 @@
 
 FATE_LIBAVFORMAT-$(CONFIG_NETWORK) += fate-noproxy
 fate-noproxy: libavformat/tests/noproxy$(EXESUF)
-fate-noproxy: CMD = run libavformat/tests/noproxy
+fate-noproxy: CMD = run libavformat/tests/noproxy$(EXESUF)
 
 FATE_LIBAVFORMAT-$(CONFIG_FFRTMPCRYPT_PROTOCOL) += fate-rtmpdh
 fate-rtmpdh: libavformat/tests/rtmpdh$(EXESUF)
-fate-rtmpdh: CMD = run libavformat/tests/rtmpdh
+fate-rtmpdh: CMD = run libavformat/tests/rtmpdh$(EXESUF)
 
 FATE_LIBAVFORMAT-$(CONFIG_SRTP) += fate-srtp
 fate-srtp: libavformat/tests/srtp$(EXESUF)
-fate-srtp: CMD = run libavformat/tests/srtp
+fate-srtp: CMD = run libavformat/tests/srtp$(EXESUF)
 
 FATE_LIBAVFORMAT-yes += fate-url
 fate-url: libavformat/tests/url$(EXESUF)
-fate-url: CMD = run libavformat/tests/url
+fate-url: CMD = run libavformat/tests/url$(EXESUF)
 
 FATE_LIBAVFORMAT-$(CONFIG_MOV_MUXER) += fate-movenc
 fate-movenc: libavformat/tests/movenc$(EXESUF)
-fate-movenc: CMD = run libavformat/tests/movenc
+fate-movenc: CMD = run libavformat/tests/movenc$(EXESUF)
 
 FATE_LIBAVFORMAT += $(FATE_LIBAVFORMAT-yes)
 FATE-$(CONFIG_AVFORMAT) += $(FATE_LIBAVFORMAT)
diff --git a/tests/fate/libavutil.mak b/tests/fate/libavutil.mak
index b12d157..1ec9ed0 100644
--- a/tests/fate/libavutil.mak
+++ b/tests/fate/libavutil.mak
@@ -1,170 +1,170 @@
 FATE_LIBAVUTIL += fate-adler32
 fate-adler32: libavutil/tests/adler32$(EXESUF)
-fate-adler32: CMD = run libavutil/tests/adler32
+fate-adler32: CMD = run libavutil/tests/adler32$(EXESUF)
 fate-adler32: CMP = null
 
 FATE_LIBAVUTIL += fate-aes
 fate-aes: libavutil/tests/aes$(EXESUF)
-fate-aes: CMD = run libavutil/tests/aes
+fate-aes: CMD = run libavutil/tests/aes$(EXESUF)
 fate-aes: CMP = null
 
 FATE_LIBAVUTIL += fate-aes_ctr
 fate-aes_ctr: libavutil/tests/aes_ctr$(EXESUF)
-fate-aes_ctr: CMD = run libavutil/tests/aes_ctr
+fate-aes_ctr: CMD = run libavutil/tests/aes_ctr$(EXESUF)
 fate-aes_ctr: CMP = null
 
 FATE_LIBAVUTIL += fate-camellia
 fate-camellia: libavutil/tests/camellia$(EXESUF)
-fate-camellia: CMD = run libavutil/tests/camellia
+fate-camellia: CMD = run libavutil/tests/camellia$(EXESUF)
 fate-camellia: CMP = null
 
 FATE_LIBAVUTIL += fate-cast5
 fate-cast5: libavutil/tests/cast5$(EXESUF)
-fate-cast5: CMD = run libavutil/tests/cast5
+fate-cast5: CMD = run libavutil/tests/cast5$(EXESUF)
 fate-cast5: CMP = null
 
 FATE_LIBAVUTIL += fate-audio_fifo
 fate-audio_fifo: libavutil/tests/audio_fifo$(EXESUF)
-fate-audio_fifo: CMD = run libavutil/tests/audio_fifo
+fate-audio_fifo: CMD = run libavutil/tests/audio_fifo$(EXESUF)
 
 FATE_LIBAVUTIL += fate-avstring
 fate-avstring: libavutil/tests/avstring$(EXESUF)
-fate-avstring: CMD = run libavutil/tests/avstring
+fate-avstring: CMD = run libavutil/tests/avstring$(EXESUF)
 
 FATE_LIBAVUTIL += fate-base64
 fate-base64: libavutil/tests/base64$(EXESUF)
-fate-base64: CMD = run libavutil/tests/base64
+fate-base64: CMD = run libavutil/tests/base64$(EXESUF)
 
 FATE_LIBAVUTIL += fate-blowfish
 fate-blowfish: libavutil/tests/blowfish$(EXESUF)
-fate-blowfish: CMD = run libavutil/tests/blowfish
+fate-blowfish: CMD = run libavutil/tests/blowfish$(EXESUF)
 
 FATE_LIBAVUTIL += fate-bprint
 fate-bprint: libavutil/tests/bprint$(EXESUF)
-fate-bprint: CMD = run libavutil/tests/bprint
+fate-bprint: CMD = run libavutil/tests/bprint$(EXESUF)
 
 FATE_LIBAVUTIL += fate-cpu
 fate-cpu: libavutil/tests/cpu$(EXESUF)
-fate-cpu: CMD = runecho libavutil/tests/cpu $(CPUFLAGS:%=-c%) $(THREADS:%=-t%)
+fate-cpu: CMD = runecho libavutil/tests/cpu$(EXESUF) $(CPUFLAGS:%=-c%) $(THREADS:%=-t%)
 fate-cpu: CMP = null
 
 FATE_LIBAVUTIL-$(HAVE_THREADS) += fate-cpu_init
 fate-cpu_init: libavutil/tests/cpu_init$(EXESUF)
-fate-cpu_init: CMD = run libavutil/tests/cpu_init
+fate-cpu_init: CMD = run libavutil/tests/cpu_init$(EXESUF)
 fate-cpu_init: CMP = null
 
 FATE_LIBAVUTIL += fate-crc
 fate-crc: libavutil/tests/crc$(EXESUF)
-fate-crc: CMD = run libavutil/tests/crc
+fate-crc: CMD = run libavutil/tests/crc$(EXESUF)
 
 FATE_LIBAVUTIL += fate-color_utils
 fate-color_utils: libavutil/tests/color_utils$(EXESUF)
-fate-color_utils: CMD = run libavutil/tests/color_utils
+fate-color_utils: CMD = run libavutil/tests/color_utils$(EXESUF)
 
 FATE_LIBAVUTIL += fate-des
 fate-des: libavutil/tests/des$(EXESUF)
-fate-des: CMD = run libavutil/tests/des
+fate-des: CMD = run libavutil/tests/des$(EXESUF)
 fate-des: CMP = null
 
 FATE_LIBAVUTIL += fate-dict
 fate-dict: libavutil/tests/dict$(EXESUF)
-fate-dict: CMD = run libavutil/tests/dict
+fate-dict: CMD = run libavutil/tests/dict$(EXESUF)
 
 FATE_LIBAVUTIL += fate-encryption-info
 fate-encryption-info: libavutil/tests/encryption_info$(EXESUF)
-fate-encryption-info: CMD = run libavutil/tests/encryption_info
+fate-encryption-info: CMD = run libavutil/tests/encryption_info$(EXESUF)
 fate-encryption-info: CMP = null
 
 FATE_LIBAVUTIL += fate-eval
 fate-eval: libavutil/tests/eval$(EXESUF)
-fate-eval: CMD = run libavutil/tests/eval
+fate-eval: CMD = run libavutil/tests/eval$(EXESUF)
 
 FATE_LIBAVUTIL += fate-fifo
 fate-fifo: libavutil/tests/fifo$(EXESUF)
-fate-fifo: CMD = run libavutil/tests/fifo
+fate-fifo: CMD = run libavutil/tests/fifo$(EXESUF)
 
 FATE_LIBAVUTIL += fate-hash
 fate-hash: libavutil/tests/hash$(EXESUF)
-fate-hash: CMD = run libavutil/tests/hash
+fate-hash: CMD = run libavutil/tests/hash$(EXESUF)
 
 FATE_LIBAVUTIL += fate-hmac
 fate-hmac: libavutil/tests/hmac$(EXESUF)
-fate-hmac: CMD = run libavutil/tests/hmac
+fate-hmac: CMD = run libavutil/tests/hmac$(EXESUF)
 
 FATE_LIBAVUTIL += fate-imgutils
 fate-imgutils: libavutil/tests/imgutils$(EXESUF)
-fate-imgutils: CMD = run libavutil/tests/imgutils
+fate-imgutils: CMD = run libavutil/tests/imgutils$(EXESUF)
 
 FATE_LIBAVUTIL += fate-integer
 fate-integer: libavutil/tests/integer$(EXESUF)
-fate-integer: CMD = run libavutil/tests/integer
+fate-integer: CMD = run libavutil/tests/integer$(EXESUF)
 fate-integer: CMP = null
 
 FATE_LIBAVUTIL += fate-lfg
 fate-lfg: libavutil/tests/lfg$(EXESUF)
-fate-lfg: CMD = run libavutil/tests/lfg
+fate-lfg: CMD = run libavutil/tests/lfg$(EXESUF)
 
 FATE_LIBAVUTIL += fate-md5
 fate-md5: libavutil/tests/md5$(EXESUF)
-fate-md5: CMD = run libavutil/tests/md5
+fate-md5: CMD = run libavutil/tests/md5$(EXESUF)
 
 FATE_LIBAVUTIL += fate-murmur3
 fate-murmur3: libavutil/tests/murmur3$(EXESUF)
-fate-murmur3: CMD = run libavutil/tests/murmur3
+fate-murmur3: CMD = run libavutil/tests/murmur3$(EXESUF)
 
 FATE_LIBAVUTIL += fate-parseutils
 fate-parseutils: libavutil/tests/parseutils$(EXESUF)
-fate-parseutils: CMD = run libavutil/tests/parseutils
+fate-parseutils: CMD = run libavutil/tests/parseutils$(EXESUF)
 
 FATE_LIBAVUTIL-$(CONFIG_PIXELUTILS) += fate-pixelutils
 fate-pixelutils: libavutil/tests/pixelutils$(EXESUF)
-fate-pixelutils: CMD = run libavutil/tests/pixelutils
+fate-pixelutils: CMD = run libavutil/tests/pixelutils$(EXESUF)
 
 FATE_LIBAVUTIL += fate-pixfmt_best
 fate-pixfmt_best: libavutil/tests/pixfmt_best$(EXESUF)
-fate-pixfmt_best: CMD = run libavutil/tests/pixfmt_best
+fate-pixfmt_best: CMD = run libavutil/tests/pixfmt_best$(EXESUF)
 
 FATE_LIBAVUTIL += fate-display
 fate-display: libavutil/tests/display$(EXESUF)
-fate-display: CMD = run libavutil/tests/display
+fate-display: CMD = run libavutil/tests/display$(EXESUF)
 
 FATE_LIBAVUTIL += fate-random_seed
 fate-random_seed: libavutil/tests/random_seed$(EXESUF)
-fate-random_seed: CMD = run libavutil/tests/random_seed
+fate-random_seed: CMD = run libavutil/tests/random_seed$(EXESUF)
 
 FATE_LIBAVUTIL += fate-ripemd
 fate-ripemd: libavutil/tests/ripemd$(EXESUF)
-fate-ripemd: CMD = run libavutil/tests/ripemd
+fate-ripemd: CMD = run libavutil/tests/ripemd$(EXESUF)
 
 FATE_LIBAVUTIL += fate-sha
 fate-sha: libavutil/tests/sha$(EXESUF)
-fate-sha: CMD = run libavutil/tests/sha
+fate-sha: CMD = run libavutil/tests/sha$(EXESUF)
 
 FATE_LIBAVUTIL += fate-sha512
 fate-sha512: libavutil/tests/sha512$(EXESUF)
-fate-sha512: CMD = run libavutil/tests/sha512
+fate-sha512: CMD = run libavutil/tests/sha512$(EXESUF)
 
 FATE_LIBAVUTIL += fate-tree
 fate-tree: libavutil/tests/tree$(EXESUF)
-fate-tree: CMD = run libavutil/tests/tree
+fate-tree: CMD = run libavutil/tests/tree$(EXESUF)
 fate-tree: CMP = null
 
 FATE_LIBAVUTIL += fate-twofish
 fate-twofish: libavutil/tests/twofish$(EXESUF)
-fate-twofish: CMD = run libavutil/tests/twofish
+fate-twofish: CMD = run libavutil/tests/twofish$(EXESUF)
 fate-twofish: CMP = null
 
 FATE_LIBAVUTIL += fate-xtea
 fate-xtea: libavutil/tests/xtea$(EXESUF)
-fate-xtea: CMD = run libavutil/tests/xtea
+fate-xtea: CMD = run libavutil/tests/xtea$(EXESUF)
 
 FATE_LIBAVUTIL += fate-tea
 fate-tea: libavutil/tests/tea$(EXESUF)
-fate-tea: CMD = run libavutil/tests/tea
+fate-tea: CMD = run libavutil/tests/tea$(EXESUF)
 
 FATE_LIBAVUTIL += fate-opt
 fate-opt: libavutil/tests/opt$(EXESUF)
-fate-opt: CMD = run libavutil/tests/opt
+fate-opt: CMD = run libavutil/tests/opt$(EXESUF)
 
 FATE_LIBAVUTIL += $(FATE_LIBAVUTIL-yes)
 FATE-$(CONFIG_AVUTIL) += $(FATE_LIBAVUTIL)
diff --git a/tests/fate/libswscale.mak b/tests/fate/libswscale.mak
index e72fe59..68eb159 100644
--- a/tests/fate/libswscale.mak
+++ b/tests/fate/libswscale.mak
@@ -1,6 +1,6 @@
 FATE_LIBSWSCALE += fate-sws-pixdesc-query
 fate-sws-pixdesc-query: libswscale/tests/pixdesc_query$(EXESUF)
-fate-sws-pixdesc-query: CMD = run libswscale/tests/pixdesc_query
+fate-sws-pixdesc-query: CMD = run libswscale/tests/pixdesc_query$(EXESUF)
 
 FATE_LIBSWSCALE += $(FATE_LIBSWSCALE-yes)
 FATE-$(CONFIG_SWSCALE) += $(FATE_LIBSWSCALE)
diff --git a/tests/fate/lossless-audio.mak b/tests/fate/lossless-audio.mak
index d292853..66ac6d8 100644
--- a/tests/fate/lossless-audio.mak
+++ b/tests/fate/lossless-audio.mak
@@ -13,12 +13,6 @@
 FATE_SAMPLES_LOSSLESS_AUDIO-$(call DEMDEC, TAK, TAK) += fate-lossless-tak
 fate-lossless-tak: CMD = crc -i $(TARGET_SAMPLES)/lossless-audio/luckynight-partial.tak
 
-FATE_TRUEHD = fate-lossless-truehd-5.1 fate-lossless-truehd-5.1-downmix-2.0
-fate-lossless-truehd-5.1: CMD = md5 -f truehd -i $(TARGET_SAMPLES)/lossless-audio/truehd_5.1.raw -f s32le
-fate-lossless-truehd-5.1-downmix-2.0: CMD = md5 -f truehd -request_channel_layout 2 -i $(TARGET_SAMPLES)/lossless-audio/truehd_5.1.raw -f s32le
-fate-lossless-truehd: $(FATE_TRUEHD)
-FATE_SAMPLES_LOSSLESS_AUDIO-$(call DEMDEC, TRUEHD, TRUEHD) += $(FATE_TRUEHD)
-
 FATE_SAMPLES_LOSSLESS_AUDIO-$(call DEMDEC, TTA, TTA) += fate-lossless-tta
 fate-lossless-tta: CMD = crc -i $(TARGET_SAMPLES)/lossless-audio/inside.tta
 
diff --git a/tests/fate/matroska.mak b/tests/fate/matroska.mak
index 2747496..1d29211 100644
--- a/tests/fate/matroska.mak
+++ b/tests/fate/matroska.mak
@@ -1,13 +1,65 @@
+FATE_MATROSKA-$(call ALLYES, MATROSKA_DEMUXER ZLIB) += fate-matroska-prores-zlib
+fate-matroska-prores-zlib: CMD = framecrc -i $(TARGET_SAMPLES)/mkv/prores_zlib.mkv -c:v copy
+
+# This tests that the matroska demuxer correctly adds the icpf header atom
+# upon demuxing; it also tests bz2 decompression and unknown-length cluster.
+FATE_MATROSKA-$(call ALLYES, MATROSKA_DEMUXER BZLIB) += fate-matroska-prores-header-insertion-bz2
+fate-matroska-prores-header-insertion-bz2: CMD = framecrc -i $(TARGET_SAMPLES)/mkv/prores_bz2.mkv -map 0 -c copy
+
 # This tests that the matroska demuxer supports modifying the colorspace
 # properties in remuxing (-c:v copy)
 # It also tests automatic insertion of the vp9_superframe bitstream filter
 FATE_MATROSKA-$(call DEMMUX, MATROSKA, MATROSKA) += fate-matroska-remux
 fate-matroska-remux: CMD = md5pipe -i $(TARGET_SAMPLES)/vp9-test-vectors/vp90-2-2pass-akiyo.webm -color_trc 4 -c:v copy -fflags +bitexact -strict -2 -f matroska
 fate-matroska-remux: CMP = oneline
-fate-matroska-remux: REF = 1ed49a4f2b6790357fac268938357353
+fate-matroska-remux: REF = 8369f24de64aaa52cf57a699dcdc7d58
+
+FATE_MATROSKA-$(call ALLYES, MATROSKA_DEMUXER VORBIS_PARSER) += fate-matroska-xiph-lacing
+fate-matroska-xiph-lacing: CMD = framecrc -i $(TARGET_SAMPLES)/mkv/xiph_lacing.mka -c:a copy
+
+# This tests that the Matroska demuxer correctly demuxes WavPack
+# without CodecPrivate; it also tests zlib compressed WavPack.
+FATE_MATROSKA-$(call ALLYES, MATROSKA_DEMUXER ZLIB) += fate-matroska-wavpack-missing-codecprivate
+fate-matroska-wavpack-missing-codecprivate: CMD = framecrc -i $(TARGET_SAMPLES)/mkv/wavpack_missing_codecprivate.mka -c copy
+
+# This tests that the matroska demuxer supports decompressing
+# zlib compressed tracks (both the CodecPrivate as well as the actual frames).
+FATE_MATROSKA-$(call ALLYES, MATROSKA_DEMUXER ZLIB) += fate-matroska-zlib-decompression
+fate-matroska-zlib-decompression: CMD = framecrc -i $(TARGET_SAMPLES)/mkv/subtitle_zlib.mks -c:s copy
+
+# This tests that the matroska demuxer can decompress lzo compressed tracks.
+FATE_MATROSKA-$(call ALLYES, MATROSKA_DEMUXER LZO) += fate-matroska-lzo-decompression
+fate-matroska-lzo-decompression: CMD = framecrc -i $(TARGET_SAMPLES)/mkv/lzo.mka -c copy
+
+# This tests that the matroska demuxer correctly propagates
+# the channel layout contained in vorbis comments in the CodecPrivate
+# of flac tracks. It also tests header removal compression.
+FATE_MATROSKA-$(call ALLYES, MATROSKA_DEMUXER FLAC_PARSER) += fate-matroska-flac-channel-mapping
+fate-matroska-flac-channel-mapping: CMD = framecrc -i $(TARGET_SAMPLES)/mkv/flac_channel_layouts.mka -map 0 -c:a copy
+
+# This tests that the Matroska muxer writes the channel layout
+# of FLAC tracks as a Vorbis comment in the CodecPrivate if necessary
+# and that FLAC extradata is correctly updated when a packet
+# with sidedata containing new extradata is encountered.
+# Furthermore it tests everything the matroska-flac-channel-mapping test
+# tests and it also tests the FLAC decoder and encoder, in particular
+# the latter's ability to send updated extradata.
+FATE_MATROSKA-$(call ALLYES, FLAC_DECODER FLAC_ENCODER FLAC_PARSER \
+                MATROSKA_DEMUXER MATROSKA_MUXER) += fate-matroska-flac-extradata-update
+fate-matroska-flac-extradata-update: CMD = transcode matroska $(TARGET_SAMPLES)/mkv/flac_channel_layouts.mka \
+                                           matroska "-map 0 -map 0:0 -c flac -frames:a:2 8" "-map 0 -c copy"
+
+# This test tests demuxing Vorbis and chapters from ogg and muxing it in and
+# demuxing it from Matroska/WebM. It furthermore tests the WebM muxer, in
+# particular its DASH mode. Finally, it tests writing the Cues at the front.
+FATE_MATROSKA_FFMPEG_FFPROBE-$(call ALLYES, MATROSKA_DEMUXER OGG_DEMUXER  \
+                                 VORBIS_DECODER VORBIS_PARSER WEBM_MUXER) \
+                               += fate-webm-dash-chapters
+fate-webm-dash-chapters: CMD = transcode ogg $(TARGET_SAMPLES)/vorbis/vorbis_chapter_extension_demo.ogg webm "-c copy -cluster_time_limit 1500 -dash 1 -dash_track_number 124 -reserve_index_space 400" "-c copy -t 0.5" "" -show_chapters
 
 FATE_MATROSKA_FFPROBE-$(call ALLYES, MATROSKA_DEMUXER) += fate-matroska-spherical-mono
 fate-matroska-spherical-mono: CMD = run ffprobe$(PROGSSUF)$(EXESUF) -show_entries stream_side_data_list -select_streams v -v 0 $(TARGET_SAMPLES)/mkv/spherical.mkv
 
 FATE_SAMPLES_AVCONV += $(FATE_MATROSKA-yes)
 FATE_SAMPLES_FFPROBE += $(FATE_MATROSKA_FFPROBE-yes)
+FATE_SAMPLES_FFMPEG_FFPROBE += $(FATE_MATROSKA_FFMPEG_FFPROBE-yes)
diff --git a/tests/fate/microsoft.mak b/tests/fate/microsoft.mak
index c450c0d..a2c3b62 100644
--- a/tests/fate/microsoft.mak
+++ b/tests/fate/microsoft.mak
@@ -71,6 +71,12 @@
 FATE_VC1-$(CONFIG_VC1_DEMUXER) += fate-vc1_ilaced_twomv
 fate-vc1_ilaced_twomv: CMD = framecrc -flags +bitexact -i $(TARGET_SAMPLES)/vc1/ilaced_twomv.vc1
 
+FATE_VC1-$(CONFIG_VC1T_DEMUXER) += fate-vc1test_smm0005
+fate-vc1test_smm0005: CMD = framecrc -i $(TARGET_SAMPLES)/vc1/SMM0005.rcv
+
+FATE_VC1-$(CONFIG_VC1T_DEMUXER) += fate-vc1test_smm0015
+fate-vc1test_smm0015: CMD = framecrc -i $(TARGET_SAMPLES)/vc1/SMM0015.rcv
+
 FATE_VC1-$(CONFIG_MOV_DEMUXER) += fate-vc1-ism
 fate-vc1-ism: CMD = framecrc -i $(TARGET_SAMPLES)/isom/vc1-wmapro.ism -an
 
diff --git a/tests/fate/mov.mak b/tests/fate/mov.mak
index 4df0fe6..7a721d7 100644
--- a/tests/fate/mov.mak
+++ b/tests/fate/mov.mak
@@ -119,8 +119,8 @@
 fate-mov-guess-delay-2: CMD = run ffprobe$(PROGSSUF)$(EXESUF) -show_entries stream=has_b_frames -select_streams v $(TARGET_SAMPLES)/h264/h264_3bf_pyramid_nobsrestriction.mp4
 fate-mov-guess-delay-3: CMD = run ffprobe$(PROGSSUF)$(EXESUF) -show_entries stream=has_b_frames -select_streams v $(TARGET_SAMPLES)/h264/h264_4bf_pyramid_nobsrestriction.mp4
 
-fate-mov-faststart-4gb-overflow: CMD = run tools/qt-faststart$(EXESUF) $(TARGET_SAMPLES)/mov/faststart-4gb-overflow.mov faststart-4gb-overflow-output.mov > /dev/null ; do_md5sum faststart-4gb-overflow-output.mov | cut -d " " -f1 ; rm faststart-4gb-overflow-output.mov
+fate-mov-faststart-4gb-overflow: CMD = run tools/qt-faststart$(EXESUF) $(TARGET_SAMPLES)/mov/faststart-4gb-overflow.mov $(TARGET_PATH)/faststart-4gb-overflow-output.mov > /dev/null ; do_md5sum faststart-4gb-overflow-output.mov | cut -d " " -f1 ; rm faststart-4gb-overflow-output.mov
 fate-mov-faststart-4gb-overflow: CMP = oneline
 fate-mov-faststart-4gb-overflow: REF = bc875921f151871e787c4b4023269b29
 
-fate-mov-mp4-with-mov-in24-ver: CMD = run ffprobe -show_entries stream=codec_name -select_streams 1 $(TARGET_SAMPLES)/mov/mp4-with-mov-in24-ver.mp4
+fate-mov-mp4-with-mov-in24-ver: CMD = run ffprobe$(PROGSSUF)$(EXESUF) -show_entries stream=codec_name -select_streams 1 $(TARGET_SAMPLES)/mov/mp4-with-mov-in24-ver.mp4
diff --git a/tests/fate/mpegps.mak b/tests/fate/mpegps.mak
index cec1ea7..87a8e14 100644
--- a/tests/fate/mpegps.mak
+++ b/tests/fate/mpegps.mak
@@ -1,6 +1,6 @@
 # This tests that a 16-bit pcm_dvd stream is correctly remuxed in mpegps
 FATE_MPEGPS-$(call DEMMUX, MPEGPS, MPEG1SYSTEM) += fate-mpegps-remuxed-pcm-demux
-fate-mpegps-remuxed-pcm-demux: $(TARGET_SAMPLES)/mpegps/pcm_aud.mpg
+fate-mpegps-remuxed-pcm-demux: $(SAMPLES)/mpegps/pcm_aud.mpg
 fate-mpegps-remuxed-pcm-demux: CMD = stream_remux "mpeg" "$(TARGET_SAMPLES)/mpegps/pcm_aud.mpg" "mpeg" "-map 0:a:0" "-codec copy"
 
 FATE_SAMPLES_FFMPEG += $(FATE_MPEGPS-yes)
diff --git a/tests/fate/mxf.mak b/tests/fate/mxf.mak
index dce23d5..4aafc1f 100644
--- a/tests/fate/mxf.mak
+++ b/tests/fate/mxf.mak
@@ -34,12 +34,25 @@
 fate-mxf-probe-dv25: CMD = run $(PROBE_FORMAT_STREAMS_COMMAND) -i "$(SRC)"
 
 FATE_MXF_REEL_NAME-$(call ENCDEC2, MPEG2VIDEO, PCM_S16LE, MXF) += fate-mxf-reel_name
-fate-mxf-reel_name: $(TARGET_SAMPLES)/mxf/Sony-00001.mxf
+fate-mxf-reel_name: $(SAMPLES)/mxf/Sony-00001.mxf
 fate-mxf-reel_name: CMD = md5 -y -i $(TARGET_SAMPLES)/mxf/Sony-00001.mxf  -c copy -timecode 00:00:00:00 -metadata "reel_name=test_reel" -fflags +bitexact -f mxf
 
+FATE_MXF_USER_COMMENTS-$(call ENCDEC2, MPEG2VIDEO, PCM_S16LE, MXF) += fate-mxf-user-comments
+fate-mxf-user-comments: $(SAMPLES)/mxf/Sony-00001.mxf
+fate-mxf-user-comments: CMD = md5 -y -i $(TARGET_SAMPLES)/mxf/Sony-00001.mxf -c copy -metadata "comment_test=value" -fflags +bitexact -f mxf
+
+FATE_MXF_D10_USER_COMMENTS-$(call ENCDEC2, MPEG2VIDEO, PCM_S16LE, MXF) += fate-mxf-d10-user-comments
+fate-mxf-d10-user-comments: $(SAMPLES)/mxf/Sony-00001.mxf
+fate-mxf-d10-user-comments: CMD = md5 -y -i $(TARGET_SAMPLES)/mxf/Sony-00001.mxf -c copy -metadata "comment_test=value" -store_user_comments 1 -fflags +bitexact -f mxf_d10
+
+FATE_MXF_OPATOM_USER_COMMENTS-$(call ENCDEC2, MPEG2VIDEO, PCM_S16LE, MXF) += fate-mxf-opatom-user-comments
+fate-mxf-opatom-user-comments: $(SAMPLES)/mxf/Sony-00001.mxf
+fate-mxf-opatom-user-comments: CMD = md5 -y -i $(TARGET_SAMPLES)/mxf/Sony-00001.mxf -an -vcodec copy -metadata "comment_test=value" -fflags +bitexact -f mxf_opatom
+
 FATE_MXF-$(CONFIG_MXF_DEMUXER) += $(FATE_MXF)
 
 FATE_SAMPLES_AVCONV += $(FATE_MXF-yes) $(FATE_MXF_REEL_NAME-yes)
+FATE_SAMPLES_AVCONV += $(FATE_MXF_USER_COMMENTS-yes) $(FATE_MXF_D10_USER_COMMENTS-yes) $(FATE_MXF_OPATOM_USER_COMMENTS-yes)
 FATE_SAMPLES_FFPROBE += $(FATE_MXF_PROBE-yes)
 
-fate-mxf: $(FATE_MXF-yes) $(FATE_MXF_PROBE-yes) $(FATE_MXF_REEL_NAME-yes)
+fate-mxf: $(FATE_MXF-yes) $(FATE_MXF_PROBE-yes) $(FATE_MXF_REEL_NAME-yes) $(FATE_MXF_USER_COMMENTS-yes) $(FATE_MXF_D10_USER_COMMENTS-yes) $(FATE_MXF_OPATOM_USER_COMMENTS-yes)
diff --git a/tests/fate/opus.mak b/tests/fate/opus.mak
index 7f28945..c50d88f 100644
--- a/tests/fate/opus.mak
+++ b/tests/fate/opus.mak
@@ -36,6 +36,7 @@
 fate-opus-testvector10:      CMP_TARGET = 38
 fate-opus-testvector11:      CMP_TARGET = 0
 fate-opus-testvector12:      CMP_TARGET = 160
+fate-opus-tron.6ch.tinypkts: CMP_SHIFT = 1440
 fate-opus-tron.6ch.tinypkts: CMP_TARGET = 0
 
 $(FATE_OPUS_CELT): CMP = oneoff
diff --git a/tests/fate/pixfmt.mak b/tests/fate/pixfmt.mak
new file mode 100644
index 0000000..46fd888
--- /dev/null
+++ b/tests/fate/pixfmt.mak
@@ -0,0 +1,28 @@
+FATE_PIXFMT-$(CONFIG_SCALE_FILTER) =           bgr24           \
+                        gray            \
+                        monob           \
+                        monow           \
+                        rgb24           \
+                        rgb32           \
+                        rgb555          \
+                        rgb565          \
+                        yuv410p         \
+                        yuv411p         \
+                        yuv420p         \
+                        yuv422p         \
+                        yuv440p         \
+                        yuv444p         \
+                        yuvj420p        \
+                        yuvj422p        \
+                        yuvj440p        \
+                        yuvj444p        \
+                        yuyv422         \
+
+FATE_PIXFMT := $(FATE_PIXFMT-yes:%=fate-pixfmt-%)
+
+$(FATE_PIXFMT): CMD = pixfmt_conversion
+$(FATE_PIXFMT): REF = $(SRC_PATH)/tests/ref/pixfmt/$(@:fate-pixfmt-%=%)
+$(FATE_PIXFMT): $(VREF)
+
+FATE_AVCONV += $(FATE_PIXFMT)
+fate-pixfmt:   $(FATE_PIXFMT)
diff --git a/tests/fate/prores.mak b/tests/fate/prores.mak
index f7f52ca..b7fcc74 100644
--- a/tests/fate/prores.mak
+++ b/tests/fate/prores.mak
@@ -15,8 +15,14 @@
 fate-prores-422_hq:    CMD = framecrc -flags +bitexact -i $(TARGET_SAMPLES)/prores/Sequence_1-Apple_ProRes_422_HQ.mov -pix_fmt yuv422p10le
 fate-prores-422_lt:    CMD = framecrc -flags +bitexact -i $(TARGET_SAMPLES)/prores/Sequence_1-Apple_ProRes_422_LT.mov -pix_fmt yuv422p10le
 fate-prores-422_proxy: CMD = framecrc -flags +bitexact -i $(TARGET_SAMPLES)/prores/Sequence_1-Apple_ProRes_422_Proxy.mov -pix_fmt yuv422p10le
-fate-prores-alpha:     CMD = framecrc -flags +bitexact -i $(TARGET_SAMPLES)/prores/Sequence_1-Apple_ProRes_with_Alpha.mov -pix_fmt yuva444p10le
-fate-prores-alpha_skip: CMD = framecrc -flags +bitexact -skip_alpha 1 -i $(TARGET_SAMPLES)/prores/Sequence_1-Apple_ProRes_with_Alpha.mov -pix_fmt yuv444p10le
-fate-prores-transparency: CMD = framecrc -flags +bitexact -i $(TARGET_SAMPLES)/prores/prores4444_with_transparency.mov -pix_fmt yuva444p10le
-fate-prores-transparency_skip: CMD = framecrc -flags +bitexact -skip_alpha 1 -i $(TARGET_SAMPLES)/prores/prores4444_with_transparency.mov -pix_fmt yuv444p10le
+fate-prores-alpha:     CMD = framecrc -flags +bitexact -i $(TARGET_SAMPLES)/prores/Sequence_1-Apple_ProRes_with_Alpha.mov -pix_fmt yuva444p12le
+fate-prores-alpha_skip: CMD = framecrc -flags +bitexact -skip_alpha 1 -i $(TARGET_SAMPLES)/prores/Sequence_1-Apple_ProRes_with_Alpha.mov -pix_fmt yuv444p12le
+fate-prores-transparency: CMD = framecrc -flags +bitexact -i $(TARGET_SAMPLES)/prores/prores4444_with_transparency.mov -pix_fmt yuva444p12le
+fate-prores-transparency_skip: CMD = framecrc -flags +bitexact -skip_alpha 1 -i $(TARGET_SAMPLES)/prores/prores4444_with_transparency.mov -pix_fmt yuv444p12le
 fate-prores-gray:      CMD = framecrc -flags +bitexact -c:a aac_fixed -i $(TARGET_SAMPLES)/prores/gray.mov -pix_fmt yuv422p10le
+
+#Test bsf prores-metadata
+FATE_PRORES_METADATA_BSF += fate-prores-metadata
+fate-prores-metadata: CMD = md5 -i $(TARGET_SAMPLES)/prores/Sequence_1-Apple_ProRes_422_Proxy.mov -c:v copy -bsf:v prores_metadata=color_primaries=bt470bg:color_trc=bt709:colorspace=smpte170m -bitexact -f mov
+
+FATE_SAMPLES_FFMPEG-$(call ALLYES, MOV_DEMUXER PRORES_METADATA_BSF) += $(FATE_PRORES_METADATA_BSF)
diff --git a/tests/fate/qtrle.mak b/tests/fate/qtrle.mak
index 774a816..1f26ffe 100644
--- a/tests/fate/qtrle.mak
+++ b/tests/fate/qtrle.mak
@@ -17,7 +17,7 @@
 fate-qtrle-24bit: CMD = framecrc -i $(TARGET_SAMPLES)/qtrle/aletrek-rle.mov
 
 FATE_QTRLE += fate-qtrle-32bit
-fate-qtrle-32bit: CMD = framecrc -i $(TARGET_SAMPLES)/qtrle/ultra_demo_720_480_32bpp_rle.mov -pix_fmt rgb24
+fate-qtrle-32bit: CMD = framecrc -i $(TARGET_SAMPLES)/qtrle/ultra_demo_720_480_32bpp_rle.mov -pix_fmt bgra
 
 FATE_SAMPLES_AVCONV-$(call DEMDEC, MOV, QTRLE) += $(FATE_QTRLE)
 fate-qtrle: $(FATE_QTRLE)
diff --git a/tests/fate/seek.mak b/tests/fate/seek.mak
index 6a9f843..98d2b54 100644
--- a/tests/fate/seek.mak
+++ b/tests/fate/seek.mak
@@ -64,7 +64,6 @@
 FATE_SEEK_VSYNTH_LENA-$(call ENCDEC, ASV2,          AVI)     += asv2
 FATE_SEEK_VSYNTH_LENA-$(call ENCDEC, DNXHD,         DNXHD)   += dnxhd-720p
 FATE_SEEK_VSYNTH_LENA-$(call ENCDEC, DNXHD,         DNXHD)   += dnxhd-720p-rd
-FATE_SEEK_VSYNTH_LENA-$(call ENCDEC, DNXHD,         DNXHD)   += dnxhd-4k-hr-lb
 FATE_SEEK_VSYNTH_LENA-$(call ENCDEC, DNXHD,         MOV)     += dnxhd-1080i
 FATE_SEEK_VSYNTH_LENA-$(call ENCDEC, DVVIDEO,       DV)      += dv
 FATE_SEEK_VSYNTH_LENA-$(call ENCDEC, DVVIDEO,       DV)      += dv-411
@@ -80,6 +79,8 @@
 FATE_SEEK_VSYNTH_LENA-$(call ENCDEC, LJPEG MJPEG,   AVI)     += ljpeg
 FATE_SEEK_VSYNTH_LENA-$(call ENCDEC, MJPEG,         AVI)     += mjpeg
 
+FATE_SEEK_VSYNTH_LENA-$(call ALLYES, DNXHD_ENCODER DNXHD_DECODER LARGE_TESTS) += dnxhd-4k-hr-lb
+
 FATE_SEEK_VSYNTH_LENA-$(call ENCDEC, MPEG1VIDEO, MPEG1VIDEO MPEGVIDEO) +=    \
                                                     mpeg1                    \
                                                     mpeg1b
@@ -162,13 +163,13 @@
 # files from fate-lavf
 
 FATE_SEEK_LAVF-$(call ENCDEC,  PCM_S16BE,             AIFF)        += aiff
-FATE_SEEK_LAVF-$(call ENCDEC,  PCM_ALAW,              PCM_ALAW)    += alaw
+FATE_SEEK_LAVF-$(call ENCDEC,  PCM_ALAW,              PCM_ALAW)    += al
 FATE_SEEK_LAVF-$(call ENCDEC2, MSMPEG4V3,  MP2,       ASF)         += asf
 FATE_SEEK_LAVF-$(call ENCDEC,  PCM_S16BE,             AU)          += au
 FATE_SEEK_LAVF-$(call ENCDEC2, MPEG4,      MP2,       AVI)         += avi
 FATE_SEEK_LAVF-$(call ENCDEC,  BMP,                   IMAGE2)      += bmp
-FATE_SEEK_LAVF-$(call ENCDEC2, DVVIDEO,    PCM_S16LE, AVI)         += dv_fmt
-FATE_SEEK_LAVF-$(call ENCDEC,  FLV,                   FLV)         += flv_fmt
+FATE_SEEK_LAVF-$(call ENCDEC2, DVVIDEO,    PCM_S16LE, AVI)         += dv
+FATE_SEEK_LAVF-$(call ENCDEC,  FLV,                   FLV)         += flv
 FATE_SEEK_LAVF-$(call ENCDEC,  GIF,                   IMAGE2)      += gif
 FATE_SEEK_LAVF-$(call ENCDEC2, MPEG2VIDEO, PCM_S16LE, GXF)         += gxf
 FATE_SEEK_LAVF-$(call ENCDEC,  MJPEG,                 IMAGE2)      += jpg
@@ -176,7 +177,7 @@
 FATE_SEEK_LAVF-$(call ENCDEC,  ADPCM_YAMAHA,          MMF)         += mmf
 FATE_SEEK_LAVF-$(call ENCDEC2, MPEG4,      PCM_ALAW,  MOV)         += mov
 FATE_SEEK_LAVF-$(call ENCDEC2, MPEG1VIDEO, MP2,       MPEG1SYSTEM MPEGPS) += mpg
-FATE_SEEK_LAVF-$(call ENCDEC,  PCM_MULAW,             PCM_MULAW)   += mulaw
+FATE_SEEK_LAVF-$(call ENCDEC,  PCM_MULAW,             PCM_MULAW)   += ul
 FATE_SEEK_LAVF-$(call ENCDEC2, MPEG2VIDEO, PCM_S16LE, MXF)         += mxf
 FATE_SEEK_LAVF-$(call ENCDEC2, MPEG2VIDEO, PCM_S16LE, MXF_D10 MXF) += mxf_d10
 FATE_SEEK_LAVF-$(call ENCDEC2, DVVIDEO,    PCM_S16LE, MXF)         += mxf_dv25
@@ -200,16 +201,16 @@
 FATE_SEEK_LAVF-$(call ENCDEC,  PCM_U8,                VOC)         += voc
 FATE_SEEK_LAVF-$(call ENCDEC,  PCM_S16LE,             WAV)         += wav
 FATE_SEEK_LAVF-$(call ENCDEC,  MP2,                   WTV)         += wtv
-FATE_SEEK_LAVF-$(CONFIG_YUV4MPEGPIPE_MUXER)                        += yuv4mpeg
+FATE_SEEK_LAVF-$(CONFIG_YUV4MPEGPIPE_MUXER)                        += y4m
 
-fate-seek-lavf-aiff:     SRC = lavf/lavf.aif
-fate-seek-lavf-alaw:     SRC = lavf/lavf.al
+fate-seek-lavf-aiff:     SRC = lavf/lavf.aiff
+fate-seek-lavf-al:       SRC = lavf/lavf.al
 fate-seek-lavf-asf:      SRC = lavf/lavf.asf
 fate-seek-lavf-au:       SRC = lavf/lavf.au
 fate-seek-lavf-avi:      SRC = lavf/lavf.avi
 fate-seek-lavf-bmp:      SRC = images/bmp/%02d.bmp
-fate-seek-lavf-dv_fmt:   SRC = lavf/lavf.dv
-fate-seek-lavf-flv_fmt:  SRC = lavf/lavf.flv
+fate-seek-lavf-dv:       SRC = lavf/lavf.dv
+fate-seek-lavf-flv:      SRC = lavf/lavf.flv
 fate-seek-lavf-gif:      SRC = lavf/lavf.gif
 fate-seek-lavf-gxf:      SRC = lavf/lavf.gxf
 fate-seek-lavf-jpg:      SRC = images/jpg/%02d.jpg
@@ -217,7 +218,7 @@
 fate-seek-lavf-mmf:      SRC = lavf/lavf.mmf
 fate-seek-lavf-mov:      SRC = lavf/lavf.mov
 fate-seek-lavf-mpg:      SRC = lavf/lavf.mpg
-fate-seek-lavf-mulaw:    SRC = lavf/lavf.ul
+fate-seek-lavf-ul:       SRC = lavf/lavf.ul
 fate-seek-lavf-mxf:      SRC = lavf/lavf.mxf
 fate-seek-lavf-mxf_d10:  SRC = lavf/lavf.mxf_d10
 fate-seek-lavf-mxf_dv25: SRC = lavf/lavf.mxf_dv25
@@ -241,7 +242,7 @@
 fate-seek-lavf-voc:      SRC = lavf/lavf.voc
 fate-seek-lavf-wav:      SRC = lavf/lavf.wav
 fate-seek-lavf-wtv:      SRC = lavf/lavf.wtv
-fate-seek-lavf-yuv4mpeg: SRC = lavf/lavf.y4m
+fate-seek-lavf-y4m:      SRC = lavf/lavf.y4m
 
 FATE_SEEK += $(FATE_SEEK_LAVF-yes:%=fate-seek-lavf-%)
 
@@ -260,7 +261,7 @@
 fate-seek-empty-edit-mp4:  CMD = run libavformat/tests/seek$(EXESUF) $(TARGET_SAMPLES)/mov/empty_edit_5s.mp4 -duration 15 -frames 4
 fate-seek-test-iibbibb-mp4:  CMD = run libavformat/tests/seek$(EXESUF) $(TARGET_SAMPLES)/mov/test_iibbibb.mp4 -duration 13 -frames 4
 fate-seek-test-iibbibb-neg-ctts-mp4:  CMD = run libavformat/tests/seek$(EXESUF) $(TARGET_SAMPLES)/mov/test_iibbibb_neg_ctts.mp4 -duration 13 -frames 4
-fate-seek-cache-pipe: CMD = cat $(TARGET_SAMPLES)/gapless/gapless.mp3 | run libavformat/tests/seek$(EXESUF) cache:pipe:0 -read_ahead_limit -1
+fate-seek-cache-pipe: CMD = cat $(SAMPLES)/gapless/gapless.mp3 | run libavformat/tests/seek$(EXESUF) cache:pipe:0 -read_ahead_limit -1
 fate-seek-mkv-codec-delay:   CMD = run libavformat/tests/seek$(EXESUF) $(TARGET_SAMPLES)/mkv/codec_delay_opus.mkv
 
 FATE_SEEK_EXTRA += $(FATE_SEEK_EXTRA-yes)
diff --git a/tests/fate/segment.mak b/tests/fate/segment.mak
new file mode 100644
index 0000000..ddefbed
--- /dev/null
+++ b/tests/fate/segment.mak
@@ -0,0 +1,55 @@
+tests/data/mp4-to-ts.m3u8: TAG = GEN
+tests/data/mp4-to-ts.m3u8: ffmpeg$(PROGSSUF)$(EXESUF) | tests/data
+	$(M)$(TARGET_EXEC) $(TARGET_PATH)/$< \
+        -i $(TARGET_SAMPLES)/h264/interlaced_crop.mp4 \
+        -f ssegment -segment_time 1 -map 0 -flags +bitexact -codec copy \
+        -segment_list $(TARGET_PATH)/$@ -y $(TARGET_PATH)/tests/data/mp4-to-ts-%03d.ts 2>/dev/null
+
+tests/data/adts-to-mkv.m3u8: TAG = GEN
+tests/data/adts-to-mkv.m3u8: ffmpeg$(PROGSSUF)$(EXESUF) | tests/data
+	$(M)$(TARGET_EXEC) $(TARGET_PATH)/$< \
+        -i $(TARGET_SAMPLES)/audiomatch/tones_afconvert_16000_mono_aac_lc.m4a \
+        -f segment -segment_time 1 -map 0 -flags +bitexact -codec copy -segment_format_options live=1 \
+        -segment_list $(TARGET_PATH)/$@ -y $(TARGET_PATH)/tests/data/adts-to-mkv-%03d.mkv 2>/dev/null
+
+tests/data/adts-to-mkv-header.mkv: TAG = GEN
+tests/data/adts-to-mkv-header.mkv: ffmpeg$(PROGSSUF)$(EXESUF) | tests/data
+	$(M)$(TARGET_EXEC) $(TARGET_PATH)/$< \
+        -i $(TARGET_SAMPLES)/audiomatch/tones_afconvert_16000_mono_aac_lc.m4a \
+        -f segment -segment_time 1 -map 0 -flags +bitexact -codec copy -segment_format_options live=1 \
+        -segment_header_filename $(TARGET_PATH)/tests/data/adts-to-mkv-header.mkv \
+        -y $(TARGET_PATH)/tests/data/adts-to-mkv-header-%03d.mkv 2>/dev/null
+
+tests/data/adts-to-mkv-header-%.mkv: tests/data/adts-to-mkv-header.mkv ;
+
+FATE_SEGMENT_PARTS += 000 001 002
+
+tests/data/adts-to-mkv-cated-all.mkv: TAG = GEN
+tests/data/adts-to-mkv-cated-all.mkv: tests/data/adts-to-mkv-header.mkv $(FATE_SEGMENT_PARTS:%=tests/data/adts-to-mkv-header-%.mkv) | tests/data
+	$(M)cat $^ >$@
+
+tests/data/adts-to-mkv-cated-%.mkv: TAG = GEN
+tests/data/adts-to-mkv-cated-%.mkv: tests/data/adts-to-mkv-header.mkv tests/data/adts-to-mkv-header-%.mkv | tests/data
+	$(M)cat $^ >$@
+
+FATE_SEGMENT += fate-segment-mp4-to-ts
+fate-segment-mp4-to-ts: tests/data/mp4-to-ts.m3u8
+fate-segment-mp4-to-ts: CMD = framecrc -flags +bitexact -i $(TARGET_PATH)/tests/data/mp4-to-ts.m3u8 -c copy
+FATE_SEGMENT-$(call ALLYES, MOV_DEMUXER H264_MP4TOANNEXB_BSF MPEGTS_MUXER MATROSKA_DEMUXER SEGMENT_MUXER HLS_DEMUXER) += fate-segment-mp4-to-ts
+
+FATE_SEGMENT += fate-segment-adts-to-mkv
+fate-segment-adts-to-mkv: tests/data/adts-to-mkv.m3u8
+fate-segment-adts-to-mkv: CMD = framecrc -flags +bitexact -i $(TARGET_PATH)/tests/data/adts-to-mkv.m3u8 -c copy
+fate-segment-adts-to-mkv: REF = $(SRC_PATH)/tests/ref/fate/segment-adts-to-mkv-header-all
+FATE_SEGMENT-$(call ALLYES, AAC_DEMUXER AAC_ADTSTOASC_BSF MATROSKA_MUXER MATROSKA_DEMUXER SEGMENT_MUXER HLS_DEMUXER) += fate-segment-adts-to-mkv
+
+FATE_SEGMENT_ALLPARTS = $(FATE_SEGMENT_PARTS)
+FATE_SEGMENT_ALLPARTS += all
+FATE_SEGMENT_SPLIT += $(FATE_SEGMENT_ALLPARTS:%=fate-segment-adts-to-mkv-header-%)
+$(foreach N,$(FATE_SEGMENT_ALLPARTS),$(eval $(N:%=fate-segment-adts-to-mkv-header-%): tests/data/adts-to-mkv-cated-$(N).mkv))
+fate-segment-adts-to-mkv-header-%: CMD = framecrc -flags +bitexact -i $(TARGET_PATH)/tests/data/$(@:fate-segment-adts-to-mkv-header-%=adts-to-mkv-cated-%).mkv -c copy
+FATE_SEGMENT-$(call ALLYES, AAC_DEMUXER AAC_ADTSTOASC_BSF MATROSKA_MUXER MATROSKA_DEMUXER SEGMENT_MUXER HLS_DEMUXER) += $(FATE_SEGMENT_SPLIT)
+
+FATE_SAMPLES_FFMPEG += $(FATE_SEGMENT-yes)
+
+fate-segment: $(FATE_SEGMENT-yes)
diff --git a/tests/fate/truehd.mak b/tests/fate/truehd.mak
new file mode 100644
index 0000000..e672716
--- /dev/null
+++ b/tests/fate/truehd.mak
@@ -0,0 +1,17 @@
+FATE_TRUEHD-$(call DEMDEC, TRUEHD, TRUEHD) += fate-truehd-5.1
+fate-truehd-5.1: CMD = md5pipe -f truehd -i $(TARGET_SAMPLES)/lossless-audio/truehd_5.1.raw -f s32le
+fate-truehd-5.1: CMP = oneline
+fate-truehd-5.1: REF = 95d8aac39dd9f0d7fb83dc7b6f88df35
+
+FATE_TRUEHD-$(call DEMDEC, TRUEHD, TRUEHD) += fate-truehd-5.1-downmix-2.0
+fate-truehd-5.1-downmix-2.0: CMD = md5pipe -f truehd -request_channel_layout 2 -i $(TARGET_SAMPLES)/lossless-audio/truehd_5.1.raw -f s32le
+fate-truehd-5.1-downmix-2.0: CMP = oneline
+fate-truehd-5.1-downmix-2.0: REF = a269aee0051d4400c9117136f08c9767
+
+FATE_TRUEHD-$(call ALLYES, TRUEHD_DEMUXER TRUEHD_MUXER TRUEHD_CORE_BSF) += fate-truehd-core-bsf
+fate-truehd-core-bsf: CMD = md5pipe -i $(TARGET_SAMPLES)/truehd/atmos.thd -c:a copy -bsf:a truehd_core -fflags +bitexact -f truehd
+fate-truehd-core-bsf: CMP = oneline
+fate-truehd-core-bsf: REF = 3aa5d0c7825051f3657b71fd6135183b
+
+FATE_SAMPLES_AUDIO += $(FATE_TRUEHD-yes)
+fate-truehd: $(FATE_TRUEHD-yes)
diff --git a/tests/fate/vcodec.mak b/tests/fate/vcodec.mak
index da6da9e..fc27da5 100644
--- a/tests/fate/vcodec.mak
+++ b/tests/fate/vcodec.mak
@@ -29,13 +29,14 @@
                                             dnxhd-720p-rd               \
                                             dnxhd-720p-10bit            \
                                             dnxhd-720p-hr-lb            \
-                                            dnxhd-4k-hr-lb              \
                                             dnxhd-uhd-hr-sq             \
-                                            dnxhd-2k-hr-hq              \
                                             dnxhd-edge1-hr              \
                                             dnxhd-edge2-hr              \
                                             dnxhd-edge3-hr
 
+FATE_VCODEC-$(call ALLYES, DNXHD_ENCODER DNXHD_DECODER LARGE_TESTS) += dnxhd-4k-hr-lb \
+                                                                       dnxhd-2k-hr-hq
+
 FATE_VCODEC-$(call ENCDEC, VC2 DIRAC, MOV) += vc2-420p vc2-420p10 vc2-420p12 \
                                               vc2-422p vc2-422p10 vc2-422p12 \
                                               vc2-444p vc2-444p10 vc2-444p12 \
@@ -135,7 +136,7 @@
 fate-vsynth%-dnxhd-hr-hq-mov:   DECOPTS = -sws_flags area+accurate_rnd+bitexact
 fate-vsynth%-dnxhd-hr-hq-mov:   FMT     = mov
 
-FATE_VCODEC-$(call ENCDEC, DVVIDEO, DV) += dv dv-411 dv-50
+FATE_VCODEC-$(call ENCDEC, DVVIDEO, DV) += dv dv-411 dv-50 dv-hd dv-fhd
 fate-vsynth%-dv:                 CODEC   = dvvideo
 fate-vsynth%-dv:                 ENCOPTS = -dct int -s pal
 fate-vsynth%-dv:                 FMT     = dv
@@ -152,6 +153,18 @@
 fate-vsynth%-dv-50:              DECOPTS = -sws_flags neighbor
 fate-vsynth%-dv-50:              FMT     = dv
 
+fate-vsynth%-dv-fhd:             CODEC   = dvvideo
+fate-vsynth%-dv-fhd:             ENCOPTS = -dct int -s 1440x1080 -pix_fmt yuv422p \
+                                           -sws_flags neighbor
+fate-vsynth%-dv-fhd:             DECOPTS = -sws_flags neighbor
+fate-vsynth%-dv-fhd:             FMT     = dv
+
+fate-vsynth%-dv-hd:              CODEC   = dvvideo
+fate-vsynth%-dv-hd:              ENCOPTS = -dct int -s 960x720 -pix_fmt yuv422p \
+                                           -sws_flags neighbor
+fate-vsynth%-dv-hd:              DECOPTS = -sws_flags neighbor
+fate-vsynth%-dv-hd:              FMT     = dv
+
 FATE_VCODEC-$(call ENCDEC, FFV1, AVI)   += ffv1 ffv1-v0 \
                                            ffv1-v3-yuv420p ffv1-v3-yuv422p10 ffv1-v3-yuv444p16 \
                                            ffv1-v3-bgr0 ffv1-v3-rgb48
@@ -336,9 +349,21 @@
 
 FATE_VCODEC-$(call ENCDEC, MSVIDEO1, AVI) += msvideo1
 
-FATE_VCODEC-$(call ENCDEC, PRORES, MOV) += prores prores_ks
+FATE_VCODEC-$(call ENCDEC, PRORES, MOV) += prores prores_int prores_444 prores_444_int prores_ks
 fate-vsynth%-prores:             FMT     = mov
 
+fate-vsynth%-prores_int:         CODEC   = prores
+fate-vsynth%-prores_int:         ENCOPTS = -flags +ildct
+fate-vsynth%-prores_int:         FMT     = mov
+
+fate-vsynth%-prores_444:         CODEC   = prores
+fate-vsynth%-prores_444:         ENCOPTS = -pix_fmt yuv444p10
+fate-vsynth%-prores_444:         FMT     = mov
+
+fate-vsynth%-prores_444_int:     CODEC   = prores
+fate-vsynth%-prores_444_int:     ENCOPTS = -pix_fmt yuv444p10 -flags +ildct
+fate-vsynth%-prores_444_int:     FMT     = mov
+
 fate-vsynth%-prores_ks:          ENCOPTS = -profile hq
 fate-vsynth%-prores_ks:          FMT     = mov
 
diff --git a/tests/fate/video.mak b/tests/fate/video.mak
index 43c3432..d2d43e5 100644
--- a/tests/fate/video.mak
+++ b/tests/fate/video.mak
@@ -232,6 +232,9 @@
 FATE_VIDEO-$(call DEMDEC, MOV, MJPEGB) += fate-mjpegb
 fate-mjpegb: CMD = framecrc -idct simple -fflags +bitexact -i $(TARGET_SAMPLES)/mjpegb/mjpegb_part.mov -an
 
+FATE_VIDEO-$(call DEMDEC, AVI, MJPEG) += fate-mjpeg-ticket3229
+fate-mjpeg-ticket3229: CMD = framecrc -idct simple -fflags +bitexact -i $(TARGET_SAMPLES)/mjpeg/mjpeg_field_order.avi -an
+
 FATE_VIDEO-$(call DEMDEC, MVI, MOTIONPIXELS) += fate-motionpixels
 fate-motionpixels: CMD = framecrc -i $(TARGET_SAMPLES)/motion-pixels/INTRO-partial.MVI -an -pix_fmt rgb24 -frames:v 111
 
@@ -259,7 +262,7 @@
 
 # FIXME dropped frames in this test because of coarse timebase
 FATE_NUV += fate-nuv-rtjpeg
-fate-nuv-rtjpeg: CMD = framecrc -idct simple -i $(TARGET_SAMPLES)/nuv/Today.nuv -an
+fate-nuv-rtjpeg: CMD = framecrc -idct simple -i $(TARGET_SAMPLES)/nuv/Today.nuv -an -r 1000
 
 FATE_NUV += fate-nuv-rtjpeg-fh
 fate-nuv-rtjpeg-fh: CMD = framecrc -idct simple -i $(TARGET_SAMPLES)/nuv/rtjpeg_frameheader.nuv -an
diff --git a/tests/fate/vpx.mak b/tests/fate/vpx.mak
index 0be5aa2..c65959f 100644
--- a/tests/fate/vpx.mak
+++ b/tests/fate/vpx.mak
@@ -34,6 +34,9 @@
 FATE_SAMPLES_AVCONV += $(FATE_VP3-yes)
 fate-vp3: $(FATE_VP3-yes)
 
+FATE_SAMPLES_AVCONV-$(call DEMDEC, AVI, VP4) += fate-vp4
+fate-vp4: CMD = framecrc -flags +bitexact -i $(TARGET_SAMPLES)/vp4/KTkvw8dg1J8.avi
+
 FATE_SAMPLES_AVCONV-$(call DEMDEC, AVI, VP5) += fate-vp5
 fate-vp5: CMD = framecrc -flags +bitexact -i $(TARGET_SAMPLES)/vp5/potter512-400-partial.avi -an
 
@@ -68,10 +71,10 @@
 fate-webm-dash-manifest-representations: CMD = run $(FFMPEG) -nostdin -f webm_dash_manifest -i $(TARGET_SAMPLES)/vp8/dash_video1.webm -f webm_dash_manifest -i $(TARGET_SAMPLES)/vp8/dash_video4.webm -c copy -map 0 -map 1 -f webm_dash_manifest -adaptation_sets "id=0,streams=0,1" -
 
 FATE_VP8-$(CONFIG_WEBM_DASH_MANIFEST_DEMUXER) += fate-webm-dash-manifest-live
-fate-webm-dash-manifest-live: CMD = run $(FFMPEG) -nostdin -f webm_dash_manifest -live 1 -i $(TARGET_SAMPLES)/vp8/dash_live_video_360.hdr -f webm_dash_manifest -live 1 -i $(TARGET_SAMPLES)/vp8/dash_live_audio_171.hdr -c copy -map 0 -map 1 -f webm_dash_manifest -live 1 -adaptation_sets "id=0,streams=0 id=1,streams=1" -chunk_start_index 1 -chunk_duration_ms 5000 -time_shift_buffer_depth 7200 -minimum_update_period 60 -debug_mode 1 -
+fate-webm-dash-manifest-live: CMD = run $(FFMPEG) -nostdin -f webm_dash_manifest -live 1 -i $(TARGET_SAMPLES)/vp8/dash_live_video_360.hdr -f webm_dash_manifest -live 1 -i $(TARGET_SAMPLES)/vp8/dash_live_audio_171.hdr -c copy -map 0 -map 1 -fflags +bitexact -f webm_dash_manifest -live 1 -adaptation_sets "id=0,streams=0 id=1,streams=1" -chunk_start_index 1 -chunk_duration_ms 5000 -time_shift_buffer_depth 7200 -minimum_update_period 60 -
 
 FATE_VP8-$(CONFIG_WEBM_DASH_MANIFEST_DEMUXER) += fate-webm-dash-manifest-live-bandwidth
-fate-webm-dash-manifest-live-bandwidth: CMD = run $(FFMPEG) -nostdin -f webm_dash_manifest -live 1 -bandwidth 100 -i $(TARGET_SAMPLES)/vp8/dash_live_video_360.hdr -f webm_dash_manifest -live 1 -bandwidth 200 -i $(TARGET_SAMPLES)/vp8/dash_live_audio_171.hdr -c copy -map 0 -map 1 -f webm_dash_manifest -live 1 -adaptation_sets "id=0,streams=0 id=1,streams=1" -chunk_start_index 1 -chunk_duration_ms 5000 -time_shift_buffer_depth 7200 -minimum_update_period 60 -debug_mode 1 -
+fate-webm-dash-manifest-live-bandwidth: CMD = run $(FFMPEG) -nostdin -f webm_dash_manifest -live 1 -bandwidth 100 -i $(TARGET_SAMPLES)/vp8/dash_live_video_360.hdr -f webm_dash_manifest -live 1 -bandwidth 200 -i $(TARGET_SAMPLES)/vp8/dash_live_audio_171.hdr -c copy -map 0 -map 1 -fflags +bitexact -f webm_dash_manifest -live 1 -adaptation_sets "id=0,streams=0 id=1,streams=1" -chunk_start_index 1 -chunk_duration_ms 5000 -time_shift_buffer_depth 7200 -minimum_update_period 60 -
 
 FATE_VP8-$(call DEMDEC, MATROSKA, VP8) += fate-vp8-2451
 fate-vp8-2451: CMD = framecrc -flags +bitexact -i $(TARGET_SAMPLES)/vp8/RRSF49-short.webm -vsync cfr -an
diff --git a/tests/fate/wavpack.mak b/tests/fate/wavpack.mak
index e4e8d47..c62b3ce 100644
--- a/tests/fate/wavpack.mak
+++ b/tests/fate/wavpack.mak
@@ -91,12 +91,12 @@
 FATE_WAVPACK-$(call DEMMUX, WV, MATROSKA) += fate-wavpack-matroska_mux-mono
 fate-wavpack-matroska_mux-mono: CMD = md5pipe -i $(TARGET_SAMPLES)/wavpack/num_channels/mono_16bit_int.wv -c copy -fflags +bitexact -f matroska
 fate-wavpack-matroska_mux-mono: CMP = oneline
-fate-wavpack-matroska_mux-mono: REF = 11773e2a518edc788475f3880d849230
+fate-wavpack-matroska_mux-mono: REF = a378996c1bb5a54998fc804fb1ad97b1
 
 FATE_WAVPACK-$(call DEMMUX, WV, MATROSKA) += fate-wavpack-matroska_mux-61
 fate-wavpack-matroska_mux-61: CMD = md5pipe -i $(TARGET_SAMPLES)/wavpack/num_channels/eva_2.22_6.1_16bit-partial.wv -c copy -fflags +bitexact -f matroska
 fate-wavpack-matroska_mux-61: CMP = oneline
-fate-wavpack-matroska_mux-61: REF = 9641abdf596c10c2e21bd9b026d4bade
+fate-wavpack-matroska_mux-61: REF = 3d708dfce5ac85df114ea91b30143708
 
 FATE_SAMPLES_AVCONV += $(FATE_WAVPACK-yes)
 fate-wavpack: $(FATE_WAVPACK-yes)
diff --git a/tests/filtergraphs/concat-vfr b/tests/filtergraphs/concat-vfr
new file mode 100644
index 0000000..e15cb96
--- /dev/null
+++ b/tests/filtergraphs/concat-vfr
@@ -0,0 +1,8 @@
+testsrc=r=5:n=1:d=2  [v1];
+sine=440:b=2:d=1     [a1];
+testsrc=r=15:n=1:d=1 [v2];
+sine=622:b=2:d=2     [a2];
+testsrc=r=8:n=1:d=1  [v3];
+sine=880:b=2:d=1     [a3];
+
+[v1][a1][v2][a2][v3][a3] concat=v=1:a=1:n=3
diff --git a/tests/lavf-regression.sh b/tests/lavf-regression.sh
deleted file mode 100755
index 45c877e..0000000
--- a/tests/lavf-regression.sh
+++ /dev/null
@@ -1,425 +0,0 @@
-#!/bin/sh
-#
-# automatic regression test for libavformat
-#
-#
-#set -x
-
-set -e
-
-. $(dirname $0)/regression-funcs.sh
-
-eval do_$test=y
-
-ENC_OPTS="$ENC_OPTS -metadata title=lavftest"
-
-do_lavf_fate()
-{
-    file=${outfile}lavf.$1
-    input="${target_samples}/$2"
-    do_avconv $file $DEC_OPTS -i "$input" $ENC_OPTS -vcodec copy -acodec copy
-    do_avconv_crc $file $DEC_OPTS -i $target_path/$file $3
-}
-
-do_lavf()
-{
-    file=${outfile}lavf.$1
-    do_avconv $file $DEC_OPTS -f image2 -vcodec pgmyuv -i $raw_src $DEC_OPTS -ar 44100 -f s16le $2 -i $pcm_src $ENC_OPTS -b:a 64k -t 1 -qscale:v 10 $3
-    do_avconv_crc $file $DEC_OPTS -i $target_path/$file $4
-}
-
-do_lavf_timecode_nodrop() { do_lavf $1 "" "$2 -timecode 02:56:14:13"; }
-do_lavf_timecode_drop()   { do_lavf $1 "" "$2 -timecode 02:56:14.13 -r 30000/1001"; }
-
-do_lavf_timecode()
-{
-    do_lavf_timecode_nodrop "$@"
-    do_lavf_timecode_drop "$@"
-    do_lavf $1 "" "$2"
-}
-
-do_streamed_images()
-{
-    file=${outfile}${1}pipe.$1
-    do_avconv $file $DEC_OPTS -f image2 -vcodec pgmyuv -i $raw_src -f image2pipe $ENC_OPTS -t 1 -qscale 10
-    do_avconv_crc $file $DEC_OPTS -f image2pipe -i $target_path/$file
-}
-
-do_image_formats()
-{
-    outfile="$datadir/images/$1/"
-    mkdir -p "$outfile"
-    file=${outfile}%02d.$1
-    run_avconv $DEC_OPTS -f image2 -vcodec pgmyuv -i $raw_src $2 $ENC_OPTS -frames 13 -y -qscale 10 $target_path/$file
-    do_md5sum ${outfile}02.$1
-    do_avconv_crc $file $DEC_OPTS -i $target_path/$file $3
-    echo $(wc -c ${outfile}02.$1)
-}
-
-do_audio_only()
-{
-    file=${outfile}lavf.$1
-    do_avconv $file $DEC_OPTS $2 -ar 44100 -f s16le -i $pcm_src $ENC_OPTS -t 1 -qscale 10 $3
-    do_avconv_crc $file $DEC_OPTS $4 -i $target_path/$file
-}
-
-if [ -n "$do_avi" ] ; then
-do_lavf avi "" "-acodec mp2 -ar 44100 -ab 64k -threads 1"
-fi
-
-if [ -n "$do_asf" ] ; then
-do_lavf asf "" "-acodec mp2 -ar 44100 -ab 64k" "-r 25"
-fi
-
-if [ -n "$do_rm" ] ; then
-file=${outfile}lavf.rm
-do_avconv $file $DEC_OPTS -f image2 -vcodec pgmyuv -i $raw_src $DEC_OPTS -ar 44100 -f s16le -i $pcm_src $ENC_OPTS -t 1 -qscale 10 -acodec ac3_fixed -ab 64k
-# broken
-#do_avconv_crc $file -i $target_path/$file
-fi
-
-if [ -n "$do_mpg" ] ; then
-do_lavf_timecode mpg "-ab 64k -ar 44100 -threads 1"
-fi
-
-if [ -n "$do_mxf" ] ; then
-do_lavf_timecode mxf "-ar 48000 -bf 2 -threads 1"
-fi
-
-if [ -n "$do_mxf_d10" ]; then
-do_lavf mxf_d10 "-ar 48000 -ac 2" "-r 25 -vf scale=720:576,pad=720:608:0:32 -vcodec mpeg2video -g 0 -flags +ildct+low_delay -dc 10 -non_linear_quant 1 -intra_vlc 1 -qscale 1 -ps 1 -qmin 1 -rc_max_vbv_use 1 -rc_min_vbv_use 1 -pix_fmt yuv422p -minrate 30000k -maxrate 30000k -b 30000k -bufsize 1200000 -top 1 -rc_init_occupancy 1200000 -qmax 12 -f mxf_d10"
-fi
-
-if [ -n "$do_mxf_dv25" ]; then
-do_lavf mxf_dv25 "-ar 48000 -ac 2" "-r 25 -vf scale=720:576,setdar=4/3 -vcodec dvvideo -pix_fmt yuv420p -b 25000k -top 0 -f mxf"
-fi
-
-if [ -n "$do_mxf_dvcpro50" ]; then
-do_lavf mxf_dvcpro50 "-ar 48000 -ac 2" "-r 25 -vf scale=720:576,setdar=16/9 -vcodec dvvideo -pix_fmt yuv422p -b 50000k -top 0 -f mxf"
-fi
-
-if [ -n "$do_mxf_opatom" ]; then
-do_lavf mxf_opatom "" "-s 1920x1080 -vcodec dnxhd -pix_fmt yuv422p -vb 36M -f mxf_opatom -map 0"
-fi
-
-if [ -n "$do_mxf_opatom_audio" ]; then
-do_lavf mxf_opatom_audio "-ar 48000 -ac 1" "-f mxf_opatom -mxf_audio_edit_rate 25 -map 1"
-fi
-
-if [ -n "$do_ts" ] ; then
-do_lavf ts "" "-ab 64k -mpegts_transport_stream_id 42 -ar 44100 -threads 1"
-fi
-
-if [ -n "$do_swf" ] ; then
-do_lavf swf "" "-an"
-fi
-
-if [ -n "$do_ffm" ] ; then
-do_lavf ffm "" "-ar 44100 -threads 1"
-fi
-
-if [ -n "$do_flm" ] ; then
-do_lavf flm "" "-pix_fmt rgba"
-fi
-
-if [ -n "$do_flv_fmt" ] ; then
-do_lavf flv "" "-an"
-fi
-
-if [ -n "$do_mov" ] ; then
-mov_common_opt="-acodec pcm_alaw -vcodec mpeg4 -threads 1"
-do_lavf mov "" "-movflags +rtphint $mov_common_opt"
-do_lavf_timecode mov "-movflags +faststart $mov_common_opt"
-do_lavf_timecode mp4 "-vcodec mpeg4 -an -threads 1"
-fi
-
-if [ -n "$do_ismv" ] ; then
-do_lavf_timecode ismv "-an -vcodec mpeg4 -threads 1"
-fi
-
-if [ -n "$do_dv_fmt" ] ; then
-do_lavf_timecode_nodrop dv "-ar 48000 -r 25 -s pal -ac 2"
-do_lavf_timecode_drop   dv "-ar 48000 -pix_fmt yuv411p -s ntsc -ac 2"
-do_lavf dv "-ar 48000 -channel_layout stereo" "-r 25 -s pal"
-fi
-
-if [ -n "$do_gxf" ] ; then
-do_lavf_timecode_nodrop gxf "-ar 48000 -r 25 -s pal -ac 1 -threads 1"
-do_lavf_timecode_drop   gxf "-ar 48000 -s ntsc -ac 1 -threads 1"
-do_lavf gxf "-ar 48000" "-r 25 -s pal -ac 1 -threads 1"
-fi
-
-if [ -n "$do_nut" ] ; then
-do_lavf nut "" "-acodec mp2 -ab 64k -ar 44100 -threads 1"
-fi
-
-if [ -n "$do_mka" ] ; then
-do_audio_only mka "" "-c:a tta"
-fi
-
-if [ -n "$do_mkv" ] ; then
-do_lavf mkv "" "-acodec mp2 -ab 64k -vcodec mpeg4 \
- -attach ${raw_src%/*}/00.pgm -metadata:s:t mimetype=image/x-portable-greymap -threads 1"
-do_lavf mkv "" "-acodec mp2 -ab 64k -vcodec mpeg4 -ar 44100 -threads 1"
-fi
-
-if [ -n "$do_mp3" ] ; then
-do_lavf_fate mp3 "mp3-conformance/he_32khz.bit" "-acodec copy"
-fi
-
-if [ -n "$do_latm" ] ; then
-do_lavf_fate latm "aac/al04_44.mp4" "-acodec copy"
-fi
-
-if [ -n "$do_ogg_vp3" ] ; then
-# -idct simple causes different results on different systems
-DEC_OPTS="$DEC_OPTS -idct auto"
-do_lavf_fate ogg "vp3/coeff_level64.mkv"
-fi
-
-if [ -n "$do_ogg_vp8" ] ; then
-do_lavf_fate ogv "vp8/RRSF49-short.webm" "-acodec copy"
-fi
-
-if [ -n "$do_mov_qtrle_mace6" ] ; then
-DEC_OPTS="$DEC_OPTS -idct auto"
-do_lavf_fate mov "qtrle/Animation-16Greys.mov"
-fi
-
-if [ -n "$do_avi_cram" ] ; then
-DEC_OPTS="$DEC_OPTS -idct auto"
-do_lavf_fate avi "cram/toon.avi"
-fi
-
-if [ -n "$do_wtv" ] ; then
-do_lavf wtv "" "-acodec mp2 -threads 1"
-fi
-
-
-# streamed images
-# mjpeg
-#file=${outfile}lavf.mjpeg
-#do_avconv $file -t 1 -qscale 10 -f image2 -vcodec pgmyuv -i $raw_src
-#do_avconv_crc $file -i $target_path/$file
-
-if [ -n "$do_pbmpipe" ] ; then
-do_streamed_images pbm
-fi
-
-if [ -n "$do_pgmpipe" ] ; then
-do_streamed_images pgm
-fi
-
-if [ -n "$do_ppmpipe" ] ; then
-do_streamed_images ppm
-fi
-
-if [ -n "$do_gif" ] ; then
-file=${outfile}lavf.gif
-do_avconv $file $DEC_OPTS -f image2 -vcodec pgmyuv -i $raw_src $ENC_OPTS -t 1 -qscale 10 -pix_fmt rgb24
-do_avconv_crc $file $DEC_OPTS -i $target_path/$file -pix_fmt rgb24
-fi
-
-if [ -n "$do_apng" ] ; then
-file=${outfile}lavf.apng
-do_avconv $file $DEC_OPTS -f image2 -vcodec pgmyuv -i $raw_src $ENC_OPTS -t 1 -pix_fmt rgb24
-do_avconv_crc $file $DEC_OPTS -i $target_path/$file -pix_fmt rgb24
-file_copy=${outfile}lavf.copy.apng
-do_avconv $file_copy $DEC_OPTS -i $file $ENC_OPTS -c copy
-do_avconv_crc $file_copy $DEC_OPTS -i $target_path/$file_copy
-file=${outfile}lavf.png
-do_avconv $file $DEC_OPTS -f image2 -vcodec pgmyuv -i $raw_src $ENC_OPTS -pix_fmt rgb24 -frames:v 1 -f apng
-do_avconv_crc $file $DEC_OPTS -i $target_path/$file -pix_fmt rgb24
-fi
-
-if [ -n "$do_yuv4mpeg" ] ; then
-file=${outfile}lavf.y4m
-do_avconv $file $DEC_OPTS -f image2 -vcodec pgmyuv -i $raw_src $ENC_OPTS -t 1 -qscale 10
-#do_avconv_crc $file -i $target_path/$file
-fi
-
-if [ -n "$do_fits" ] ; then
-pix_fmts="gray gray16be gbrp gbrap gbrp16be gbrap16be"
-for pix_fmt in $pix_fmts ; do
-    file=${outfile}${pix_fmt}lavf.fits
-    do_avconv $file $DEC_OPTS -f image2 -vcodec pgmyuv -i $raw_src $ENC_OPTS -pix_fmt $pix_fmt
-    do_avconv_crc $file $DEC_OPTS -i $target_path/$file -pix_fmt $pix_fmt
-done
-fi
-
-# image formats
-
-if [ -n "$do_pgm" ] ; then
-do_image_formats pgm
-fi
-
-if [ -n "$do_ppm" ] ; then
-do_image_formats ppm
-fi
-
-if [ -n "$do_png" ] ; then
-do_image_formats png
-do_image_formats png "-pix_fmt gray16be"
-do_image_formats png "-pix_fmt rgb48be"
-fi
-
-if [ -n "$do_xbm" ] ; then
-do_image_formats xbm
-fi
-
-if [ -n "$do_bmp" ] ; then
-do_image_formats bmp
-fi
-
-if [ -n "$do_tga" ] ; then
-do_image_formats tga
-fi
-
-if [ -n "$do_tiff" ] ; then
-do_image_formats tiff "-pix_fmt rgb24"
-fi
-
-if [ -n "$do_sgi" ] ; then
-do_image_formats sgi
-fi
-
-if [ -n "$do_jpg" ] ; then
-do_image_formats jpg "-pix_fmt yuvj420p"
-fi
-
-if [ -n "$do_pam" ] ; then
-do_image_formats pam
-do_image_formats pam "-pix_fmt rgba"
-do_image_formats pam "-pix_fmt gray"
-do_image_formats pam "-pix_fmt gray16be" "-pix_fmt gray16be"
-do_image_formats pam "-pix_fmt rgb48be" "-pix_fmt rgb48be"
-do_image_formats pam "-pix_fmt monob"
-fi
-
-if [ -n "$do_pcx" ] ; then
-do_image_formats pcx
-fi
-
-if [ -n "$do_dpx" ] ; then
-do_image_formats dpx
-do_image_formats dpx "-pix_fmt gbrp10le" "-pix_fmt gbrp10le"
-do_image_formats dpx "-pix_fmt gbrp12le" "-pix_fmt gbrp12le"
-do_image_formats dpx "-pix_fmt rgb48le"
-do_image_formats dpx "-pix_fmt rgb48le -bits_per_raw_sample 10" "-pix_fmt rgb48le"
-do_image_formats dpx "-pix_fmt rgba64le"
-fi
-
-if [ -n "$do_xwd" ] ; then
-do_image_formats xwd
-do_image_formats xwd "-pix_fmt rgba"
-do_image_formats xwd "-pix_fmt rgb565be"
-do_image_formats xwd "-pix_fmt rgb555be"
-do_image_formats xwd "-pix_fmt rgb8"
-do_image_formats xwd "-pix_fmt rgb4_byte"
-do_image_formats xwd "-pix_fmt gray"
-do_image_formats xwd "-pix_fmt monow"
-fi
-
-if [ -n "$do_sunrast" ] ; then
-do_image_formats sun
-fi
-
-# audio only
-
-if [ -n "$do_wav" ] ; then
-do_audio_only wav
-fi
-
-if [ -n "$do_wav_peak" ] ; then
-do_audio_only peak.wav "" "-write_peak on"
-fi
-
-if [ -n "$do_wav_peak_only" ] ; then
-file=${outfile}lavf.peak_only.wav
-do_avconv $file $DEC_OPTS -ar 44100 -f s16le -i $pcm_src $ENC_OPTS -t 1 -qscale 10 -write_peak only
-fi
-
-if [ -n "$do_alaw" ] ; then
-do_audio_only al "" "" "-ar 44100"
-fi
-
-if [ -n "$do_mulaw" ] ; then
-do_audio_only ul "" "" "-ar 44100"
-fi
-
-if [ -n "$do_au" ] ; then
-do_audio_only au
-fi
-
-if [ -n "$do_mmf" ] ; then
-do_audio_only mmf
-fi
-
-if [ -n "$do_aiff" ] ; then
-do_audio_only aif
-fi
-
-if [ -n "$do_voc" ] ; then
-do_audio_only voc "" "-acodec pcm_u8"
-fi
-
-if [ -n "$do_voc_s16" ] ; then
-do_audio_only s16.voc "-ac 2" "-acodec pcm_s16le"
-fi
-
-if [ -n "$do_ogg" ] ; then
-do_audio_only ogg "" "-c:a flac"
-fi
-
-if [ -n "$do_rso" ] ; then
-do_audio_only rso
-fi
-
-if [ -n "$do_smjpeg" ] ; then
-do_lavf smjpeg "" "-f smjpeg"
-fi
-
-if [ -n "$do_sox" ] ; then
-do_audio_only sox
-fi
-
-if [ -n "$do_tta" ] ; then
-do_audio_only tta
-fi
-
-if [ -n "$do_caf" ] ; then
-do_audio_only caf
-fi
-
-if [ -n "$do_ast" ] ; then
-do_audio_only ast "-ac 2" "-loopstart 1 -loopend 10"
-fi
-
-if [ -n "$do_ircam" ] ; then
-do_audio_only ircam
-fi
-
-if [ -n "$do_w64" ] ; then
-do_audio_only w64
-fi
-
-if [ -n "$do_wv" ] ; then
-do_audio_only wv
-fi
-
-# pix_fmt conversions
-
-if [ -n "$do_pixfmt" ] ; then
-outfile="$datadir/pixfmt/"
-mkdir -p "$outfile"
-conversions="yuv420p yuv422p yuv444p yuyv422 yuv410p yuv411p yuvj420p \
-             yuvj422p yuvj444p rgb24 bgr24 rgb32 rgb565 rgb555 gray monow \
-             monob yuv440p yuvj440p"
-for pix_fmt in $conversions ; do
-    file=${outfile}${pix_fmt}.yuv
-    run_avconv $DEC_OPTS -r 1 -f image2 -vcodec pgmyuv -i $raw_src \
-               $ENC_OPTS -f rawvideo -t 1 -s 352x288 -pix_fmt $pix_fmt $target_path/$raw_dst
-    do_avconv $file $DEC_OPTS -f rawvideo -s 352x288 -pix_fmt $pix_fmt -i $target_path/$raw_dst \
-                    $ENC_OPTS -f rawvideo -s 352x288 -pix_fmt yuv444p
-done
-fi
diff --git a/tests/ref/acodec/adpcm-adx b/tests/ref/acodec/adpcm-adx
index 8c40100..2c8550f 100644
--- a/tests/ref/acodec/adpcm-adx
+++ b/tests/ref/acodec/adpcm-adx
@@ -1,4 +1,4 @@
-6bf1a8e5ec9cc958a31cb2b1b66bfc75 *tests/data/fate/acodec-adpcm-adx.adx
-297720 tests/data/fate/acodec-adpcm-adx.adx
+c257001314241b469a6512616fd56548 *tests/data/fate/acodec-adpcm-adx.adx
+297738 tests/data/fate/acodec-adpcm-adx.adx
 5b5a436ec9d528d6eb0bebaf667521b0 *tests/data/fate/acodec-adpcm-adx.out.wav
 stddev: 2549.93 PSNR: 28.20 MAXDIFF:57514 bytes:  1058400/  1058432
diff --git a/tests/ref/acodec/adpcm-adx-trellis b/tests/ref/acodec/adpcm-adx-trellis
index 039f69f..f6f5d76 100644
--- a/tests/ref/acodec/adpcm-adx-trellis
+++ b/tests/ref/acodec/adpcm-adx-trellis
@@ -1,4 +1,4 @@
-6bf1a8e5ec9cc958a31cb2b1b66bfc75 *tests/data/fate/acodec-adpcm-adx-trellis.adx
-297720 tests/data/fate/acodec-adpcm-adx-trellis.adx
+c257001314241b469a6512616fd56548 *tests/data/fate/acodec-adpcm-adx-trellis.adx
+297738 tests/data/fate/acodec-adpcm-adx-trellis.adx
 5b5a436ec9d528d6eb0bebaf667521b0 *tests/data/fate/acodec-adpcm-adx-trellis.out.wav
 stddev: 2549.93 PSNR: 28.20 MAXDIFF:57514 bytes:  1058400/  1058432
diff --git a/tests/ref/acodec/alac b/tests/ref/acodec/alac
index 7d6ebe8..da2a84a 100644
--- a/tests/ref/acodec/alac
+++ b/tests/ref/acodec/alac
@@ -1,4 +1,4 @@
-8d9fb9f5433962e7880b666e6e2e428e *tests/data/fate/acodec-alac.mov
+61b22c509780e86dfb2fd1be816d8c68 *tests/data/fate/acodec-alac.mov
 389018 tests/data/fate/acodec-alac.mov
 95e54b261530a1bcf6de6fe3b21dc5f6 *tests/data/fate/acodec-alac.out.wav
 stddev:    0.00 PSNR:999.99 MAXDIFF:    0 bytes:  1058400/  1058400
diff --git a/tests/ref/acodec/pcm-s16be b/tests/ref/acodec/pcm-s16be
index a9b4593..2c051ce 100644
--- a/tests/ref/acodec/pcm-s16be
+++ b/tests/ref/acodec/pcm-s16be
@@ -1,4 +1,4 @@
-d2515f35266ae6dba525c700bb76d893 *tests/data/fate/acodec-pcm-s16be.mov
+5acf4268c4c4485ab79893f5e2f24e26 *tests/data/fate/acodec-pcm-s16be.mov
 1059069 tests/data/fate/acodec-pcm-s16be.mov
 95e54b261530a1bcf6de6fe3b21dc5f6 *tests/data/fate/acodec-pcm-s16be.out.wav
 stddev:    0.00 PSNR:999.99 MAXDIFF:    0 bytes:  1058400/  1058400
diff --git a/tests/ref/acodec/pcm-s24be b/tests/ref/acodec/pcm-s24be
index 916aceb..e36b503 100644
--- a/tests/ref/acodec/pcm-s24be
+++ b/tests/ref/acodec/pcm-s24be
@@ -1,4 +1,4 @@
-0f4a37a77619124f486f656f03c53d33 *tests/data/fate/acodec-pcm-s24be.mov
+62e578b2e3e115a228e1ebfceeeb65c2 *tests/data/fate/acodec-pcm-s24be.mov
 1588323 tests/data/fate/acodec-pcm-s24be.mov
 95e54b261530a1bcf6de6fe3b21dc5f6 *tests/data/fate/acodec-pcm-s24be.out.wav
 stddev:    0.00 PSNR:999.99 MAXDIFF:    0 bytes:  1058400/  1058400
diff --git a/tests/ref/acodec/pcm-s32be b/tests/ref/acodec/pcm-s32be
index 5a48bb2..1281873 100644
--- a/tests/ref/acodec/pcm-s32be
+++ b/tests/ref/acodec/pcm-s32be
@@ -1,4 +1,4 @@
-d6380bf54ac3e452c190ce302c264bf0 *tests/data/fate/acodec-pcm-s32be.mov
+2a4d853ef4916ca5081fafe234d18596 *tests/data/fate/acodec-pcm-s32be.mov
 2117527 tests/data/fate/acodec-pcm-s32be.mov
 95e54b261530a1bcf6de6fe3b21dc5f6 *tests/data/fate/acodec-pcm-s32be.out.wav
 stddev:    0.00 PSNR:999.99 MAXDIFF:    0 bytes:  1058400/  1058400
diff --git a/tests/ref/acodec/pcm-s8 b/tests/ref/acodec/pcm-s8
index 14f4c85..9e9f417 100644
--- a/tests/ref/acodec/pcm-s8
+++ b/tests/ref/acodec/pcm-s8
@@ -1,4 +1,4 @@
-00a9d90e06e8ecb79e5dd4c6c8460836 *tests/data/fate/acodec-pcm-s8.mov
+65f02f9b48be05cf7b4d104c8a9d3566 *tests/data/fate/acodec-pcm-s8.mov
 529853 tests/data/fate/acodec-pcm-s8.mov
 652edf30f35ad89bf27bcc9d2f9c7b53 *tests/data/fate/acodec-pcm-s8.out.wav
 stddev:  147.89 PSNR: 52.93 MAXDIFF:  255 bytes:  1058400/  1058400
diff --git a/tests/ref/acodec/s302m b/tests/ref/acodec/s302m
index 63e39ed..2919ed6 100644
--- a/tests/ref/acodec/s302m
+++ b/tests/ref/acodec/s302m
@@ -1,4 +1,4 @@
-165d022ab86306d069797acff0c1e295 *tests/data/fate/acodec-s302m.mpegts
-1589164 tests/data/fate/acodec-s302m.mpegts
+0bf5457fd41a22fc5cdd99ae5ad4e273 *tests/data/fate/acodec-s302m.mpegts
+1527688 tests/data/fate/acodec-s302m.mpegts
 31f25a0020fd9017de9c3c608316854b *tests/data/fate/acodec-s302m.out.wav
 stddev:  986.94 PSNR: 36.44 MAXDIFF:18571 bytes:  1058400/  1056708
diff --git a/tests/ref/fate/aac-autobsf-adtstoasc b/tests/ref/fate/aac-autobsf-adtstoasc
index 9ca8e7e..c7eae5d 100644
--- a/tests/ref/fate/aac-autobsf-adtstoasc
+++ b/tests/ref/fate/aac-autobsf-adtstoasc
@@ -1,5 +1,5 @@
-b0375ba00bcbd55023a176255b8d4ba2 *tests/data/fate/aac-autobsf-adtstoasc.matroska
-6728 tests/data/fate/aac-autobsf-adtstoasc.matroska
+6ffdfc7f11f06f94c22cda3a29bf576b *tests/data/fate/aac-autobsf-adtstoasc.matroska
+6627 tests/data/fate/aac-autobsf-adtstoasc.matroska
 #extradata 0:        2, 0x0030001c
 #tb 0: 1/1000
 #media_type 0: audio
diff --git a/tests/ref/fate/adpcm-argo-mono b/tests/ref/fate/adpcm-argo-mono
new file mode 100644
index 0000000..b9a142f
--- /dev/null
+++ b/tests/ref/fate/adpcm-argo-mono
@@ -0,0 +1 @@
+3876d24a376b1ab1f6d207b7abda635e
diff --git a/tests/ref/fate/adpcm-argo-stereo b/tests/ref/fate/adpcm-argo-stereo
new file mode 100644
index 0000000..e0efa51
--- /dev/null
+++ b/tests/ref/fate/adpcm-argo-stereo
@@ -0,0 +1 @@
+53ad310be0175583a5c3c0e5fe341b18
diff --git a/tests/ref/fate/adpcm-ima-alp-mono b/tests/ref/fate/adpcm-ima-alp-mono
new file mode 100644
index 0000000..4110a24
--- /dev/null
+++ b/tests/ref/fate/adpcm-ima-alp-mono
@@ -0,0 +1 @@
+288d1ce2e92240ccebfe2586fc22d01b
diff --git a/tests/ref/fate/adpcm-ima-alp-stereo b/tests/ref/fate/adpcm-ima-alp-stereo
new file mode 100644
index 0000000..8cf281e
--- /dev/null
+++ b/tests/ref/fate/adpcm-ima-alp-stereo
@@ -0,0 +1 @@
+a100877e7e02b8a6ad63154682c844f4
diff --git a/tests/ref/fate/adpcm-ima-apm-mono b/tests/ref/fate/adpcm-ima-apm-mono
new file mode 100644
index 0000000..c97e09f
--- /dev/null
+++ b/tests/ref/fate/adpcm-ima-apm-mono
@@ -0,0 +1 @@
+a5cb56a035ab4b79adceba6fe4a428d2
diff --git a/tests/ref/fate/adpcm-ima-apm-stereo b/tests/ref/fate/adpcm-ima-apm-stereo
new file mode 100644
index 0000000..28bd689
--- /dev/null
+++ b/tests/ref/fate/adpcm-ima-apm-stereo
@@ -0,0 +1 @@
+e7ceb7f846f831b0bb3728d8ec18fdd4
diff --git a/tests/ref/fate/adpcm-ima-ssi-mono b/tests/ref/fate/adpcm-ima-ssi-mono
new file mode 100644
index 0000000..18a7232
--- /dev/null
+++ b/tests/ref/fate/adpcm-ima-ssi-mono
@@ -0,0 +1 @@
+18decd2cd6da6957f0b323f7598b2d42
diff --git a/tests/ref/fate/adpcm-ima-ssi-stereo b/tests/ref/fate/adpcm-ima-ssi-stereo
new file mode 100644
index 0000000..4e2d622
--- /dev/null
+++ b/tests/ref/fate/adpcm-ima-ssi-stereo
@@ -0,0 +1 @@
+c4be97a96aea1d6b15f1fe7d97ef7db8
diff --git a/tests/ref/fate/adtstoasc_ticket3715 b/tests/ref/fate/adtstoasc_ticket3715
index c5f03e4..49fa3eb 100644
--- a/tests/ref/fate/adtstoasc_ticket3715
+++ b/tests/ref/fate/adtstoasc_ticket3715
@@ -1,4 +1,4 @@
-0221e04333e6ac432fa42960502f0d5a *tests/data/fate/adtstoasc_ticket3715.mov
+4110be924e21846d0e174fac679b062e *tests/data/fate/adtstoasc_ticket3715.mov
 33324 tests/data/fate/adtstoasc_ticket3715.mov
 #extradata 0:        2, 0x00340022
 #tb 0: 1/44100
diff --git a/tests/ref/fate/api-h264-slice b/tests/ref/fate/api-h264-slice
new file mode 100644
index 0000000..1d463d3
--- /dev/null
+++ b/tests/ref/fate/api-h264-slice
@@ -0,0 +1,309 @@
+#format: frame checksums
+#version: 2
+#hash: MD5
+#tb 0: 1/30
+#media_type 0: video
+#codec_id 0: rawvideo
+#dimensions 0: 352x288
+#sar 0: 128/117
+#stream#, dts,        pts, duration,     size, hash
+0,          0,          0,        1,   152064, 28a2f99d62b553403fcffc1f680d5403
+0,          1,          1,        1,   152064, cd95f40841e08160ace0d64506f8adbf
+0,          2,          2,        1,   152064, 32f37a1b3ddc2b8b0f6283f0c403a976
+0,          3,          3,        1,   152064, 643c0b0702072038578ef5ae2000c1a0
+0,          4,          4,        1,   152064, 8d9c9660705f7533e7f49f11693aedf9
+0,          5,          5,        1,   152064, 66a794f8a116c055451091e0e4cd911e
+0,          6,          6,        1,   152064, 8ad529648796ae6da279de0b7ca34f72
+0,          7,          7,        1,   152064, 898ad4170eb740d713de254eb4bfe255
+0,          8,          8,        1,   152064, f96cfc1f00df10003e144529a5fae6c6
+0,          9,          9,        1,   152064, 0351a3b68dc87ba5963624e1461788da
+0,         10,         10,        1,   152064, 6718e4086a0039584bcc37dcd4be6a67
+0,         11,         11,        1,   152064, fb4fec78d9434b9579b31f8ad0472762
+0,         12,         12,        1,   152064, ec2dcc547d84e15383dcee8462bb9d0c
+0,         13,         13,        1,   152064, ea62711bf59b4d1d56cb9dbcb68a8eda
+0,         14,         14,        1,   152064, 75b1cb899a9d9e695106f187c20b91f8
+0,         15,         15,        1,   152064, 44a13e4235c2ed3692af5ef698efe4d3
+0,         16,         16,        1,   152064, 6d5f1249d96573782fa95e9228d1ad0a
+0,         17,         17,        1,   152064, fce8503dd9472fc7932ffbe21425d45a
+0,         18,         18,        1,   152064, e93489a6b4c38d611493a3721aa994d7
+0,         19,         19,        1,   152064, 04580677a663ddba1b747c2ab0d598e6
+0,         20,         20,        1,   152064, a28cceb666c92eaecc3da3e092b83715
+0,         21,         21,        1,   152064, ba9ce0f84fb16c27453666265ad54e35
+0,         22,         22,        1,   152064, 946e014822ab2b45c52d3e08e7db97c2
+0,         23,         23,        1,   152064, b7a40ebb6ac72b322ccfca2568fa521a
+0,         24,         24,        1,   152064, cb5a0564af00a00496950ad705a160ce
+0,         25,         25,        1,   152064, dbad9e8e79c04b1df497884ec28e3a59
+0,         26,         26,        1,   152064, 3c748cdc0e6ec79ca72482e22f0c3ef8
+0,         27,         27,        1,   152064, 1740911da2ebbdc729cbbea0df466c44
+0,         28,         28,        1,   152064, 3b322e03fcc16d6a0dea651634ce0b40
+0,         29,         29,        1,   152064, a7fca405425015b85cb58ec1aece575b
+0,         30,         30,        1,   152064, 2004eec0c923f1855b4b918e6dcb5e02
+0,         31,         31,        1,   152064, 20542f58f1622f58f3cbf4b2bf0b772f
+0,         32,         32,        1,   152064, 8872f5cb900ed8d317f3abe50a147934
+0,         33,         33,        1,   152064, 774ba43dc0cd7932099e3e0633e25721
+0,         34,         34,        1,   152064, 4f2d9b7e6d115bd103ccd9945f85582f
+0,         35,         35,        1,   152064, f53542ca7f6d5ec462770ffff3f4bfd0
+0,         36,         36,        1,   152064, 43b5f8c4e6dc3dc1acc903687bc90293
+0,         37,         37,        1,   152064, aa7d265ab285ded777a970debe6a08d5
+0,         38,         38,        1,   152064, 818ae082b3dd9557e04710d7cfd700be
+0,         39,         39,        1,   152064, 44cfe472ccedf8a44d0b90c97932caae
+0,         40,         40,        1,   152064, 5d2756c81c90bb10484e2e892fce0e0c
+0,         41,         41,        1,   152064, c1b254a4b66dc9d769e10316976f5538
+0,         42,         42,        1,   152064, 03808a3f7b01293dbe6089b33e3dc103
+0,         43,         43,        1,   152064, 8c689a6143a8a89415d2e645bb0fe925
+0,         44,         44,        1,   152064, 24268cac7d78eefd8e247ec599e60b4f
+0,         45,         45,        1,   152064, ac3195c57a3ebe3871992acfc3182e2f
+0,         46,         46,        1,   152064, 8730a99fb5a2573475f61d4e7998ba44
+0,         47,         47,        1,   152064, 651042c34273096db82879fcdd91310d
+0,         48,         48,        1,   152064, 972b47241098a9b6471ba6c8ccc2b83b
+0,         49,         49,        1,   152064, e8e53022355e6bf7ac50d53bcb1bdc92
+0,         50,         50,        1,   152064, e5b003b04a88e0d60d446eb5b600cc66
+0,         51,         51,        1,   152064, 1c2317c071a33b0b465bbcea04411ddf
+0,         52,         52,        1,   152064, 7bd53f4e852370aaeb6b0d042d24b94a
+0,         53,         53,        1,   152064, 6ef30966b0d9c0d92b2350e2f45197a8
+0,         54,         54,        1,   152064, 354e2afff0d056193d6c4c2667c638d3
+0,         55,         55,        1,   152064, e67767e97f44c3ef80ea4acee41af0ff
+0,         56,         56,        1,   152064, 32589395bf7d07c1c6df644d43b5bbba
+0,         57,         57,        1,   152064, 2f2b56210b87142fa3620cce5c56af02
+0,         58,         58,        1,   152064, 599781773ace555c82ac591cc2acf8ec
+0,         59,         59,        1,   152064, 2465cf6313dab6bda9171993ff6168de
+0,         60,         60,        1,   152064, 54cc6c8a9b3fd95b9700d319c4a69297
+0,         61,         61,        1,   152064, 9e813429ebf7ee4e11fcd4976974fea0
+0,         62,         62,        1,   152064, fac0303897b4d1bd1a202fe0a7d1c6f7
+0,         63,         63,        1,   152064, accb382b99f2d27cefbc9f7ea315f80c
+0,         64,         64,        1,   152064, b88711feaee9f7f84da34028b7e2cc81
+0,         65,         65,        1,   152064, 80549aebdcc5629dfc3bee8112536bac
+0,         66,         66,        1,   152064, 9c63aa480b5d9937d839b809ba67eee2
+0,         67,         67,        1,   152064, 5e5a729c45a995ba2a97083fca69c9e9
+0,         68,         68,        1,   152064, 6b59c5d4460d78fa337b94b080e72215
+0,         69,         69,        1,   152064, 166d675f774f4f74dbce7e2728afd16c
+0,         70,         70,        1,   152064, 3051629ff9281ea8879bce0ed62c1e71
+0,         71,         71,        1,   152064, c2ff4493434ca4fea45c724c10bcbe55
+0,         72,         72,        1,   152064, 907274f16ebeb7c09de8bc124c1fe586
+0,         73,         73,        1,   152064, 88efefc9fc00d88fbce20f4d74a55d25
+0,         74,         74,        1,   152064, 357bdbcb828c088b748022df9e47b9c7
+0,         75,         75,        1,   152064, 4550087923c1d4195ab536899a99d429
+0,         76,         76,        1,   152064, 2b07777d9109577eaedc87321dd3ff69
+0,         77,         77,        1,   152064, 4a377c552c62cba06d5285aa8478a540
+0,         78,         78,        1,   152064, a0e893c028e106c2394f0578f00ae88a
+0,         79,         79,        1,   152064, c0db0e2ee3768d2e4e71581a2be30707
+0,         80,         80,        1,   152064, 954e0cd38b00ea2181b8c322511536f0
+0,         81,         81,        1,   152064, 53ff687670a2490ac3f94405014251b8
+0,         82,         82,        1,   152064, 64a588b7adbc560ec4ad6823c37e41c6
+0,         83,         83,        1,   152064, 60d65e899976214cd3b2b5abb10f2b83
+0,         84,         84,        1,   152064, 1bf0efef4b204a72d05b21c18a569585
+0,         85,         85,        1,   152064, 65d814be6b698ab1185f082c9c9d7de3
+0,         86,         86,        1,   152064, de26e7e663aaeb642e0a94776c5bf22c
+0,         87,         87,        1,   152064, f7b0b259ccf21e59fcacd95945a013c3
+0,         88,         88,        1,   152064, 7f3185bb4dc3368733bd29c9aa9e08eb
+0,         89,         89,        1,   152064, 3cedc14798d145fcdc8b8a3082de3b88
+0,         90,         90,        1,   152064, c5792622ca4a04d21e1f2c2b2ff692fe
+0,         91,         91,        1,   152064, d13199fa94e53643902a8a26e33c9862
+0,         92,         92,        1,   152064, b380359e836896d7698a8dadfe6d6fdc
+0,         93,         93,        1,   152064, 4c7c5f1f093f7bcaddf06068b9b1d2e5
+0,         94,         94,        1,   152064, 73f33e1eedea9aa5e6c3f2b636dd2c23
+0,         95,         95,        1,   152064, f0d2aad6477ace945f87b25cb44f3ff0
+0,         96,         96,        1,   152064, d90bddd7c2279bbd0266a26915202712
+0,         97,         97,        1,   152064, 0b377a48dea8fc2702395796808af63f
+0,         98,         98,        1,   152064, ea0099179e806a9680f019446e39d125
+0,         99,         99,        1,   152064, a77dd3069c54b255e45b261f31be80d2
+0,        100,        100,        1,   152064, d362dcbe415329e713ff6ef9e6447d87
+0,        101,        101,        1,   152064, 15441bcb307ac24766ceba8db42f9413
+0,        102,        102,        1,   152064, 79b953e72d11d3fa6d6974e4b8b13392
+0,        103,        103,        1,   152064, ec8c35c829fac56ca8ae2f0160ae5d7f
+0,        104,        104,        1,   152064, c104f8f1d17629b0449f4a2af2e40f73
+0,        105,        105,        1,   152064, 4661c4b3c2b1a03a8e23e7e88e974f22
+0,        106,        106,        1,   152064, 7cb48bae9841f67294b2e25a73d46a8e
+0,        107,        107,        1,   152064, bddcb2c64a4257760f50714ec8c49243
+0,        108,        108,        1,   152064, c2123750802357c25c352f09bd1b1de2
+0,        109,        109,        1,   152064, 6eb5af4f3ad69cc88e0c08f6aa9bb034
+0,        110,        110,        1,   152064, 063991a633a051d6889f0fff41059e5f
+0,        111,        111,        1,   152064, fa736839a01ad04fe08d437c7fa60a2d
+0,        112,        112,        1,   152064, 85a43397c5a1defe15b61464c8d1457a
+0,        113,        113,        1,   152064, da50c437613be59486012b69c7953f63
+0,        114,        114,        1,   152064, eb32e24757a98192928324d3a389a3dc
+0,        115,        115,        1,   152064, 1bf511fb8245e3be71ebefdcf506575d
+0,        116,        116,        1,   152064, 4479c195c4cd4111afe561a07c0f626d
+0,        117,        117,        1,   152064, 0b1815f0c28bb55aae515a5dc3a34f3b
+0,        118,        118,        1,   152064, 300d3c32442bd554384b3c804dd519ad
+0,        119,        119,        1,   152064, 197df868e0488b8b12c0b42d8c4b2aec
+0,        120,        120,        1,   152064, 03bce34c3214e0144a0928b9b9acc8e8
+0,        121,        121,        1,   152064, ba73a879b8fca5db4a354075b26ccb6a
+0,        122,        122,        1,   152064, b1c34c6d2535bf1e7af3a6936d1627df
+0,        123,        123,        1,   152064, 77d162995974428c5c7766ee5627eac1
+0,        124,        124,        1,   152064, fa4c70aa68850bcae2579046557c0b5f
+0,        125,        125,        1,   152064, 63ce618e67f380000030c97db78ac4ae
+0,        126,        126,        1,   152064, 7e32538d501127faf058792e83fbbe43
+0,        127,        127,        1,   152064, 61bc1d685553a97a7c3b0cbb3790faad
+0,        128,        128,        1,   152064, 57f3b97e4a80ded30b9e8f12cfc8ff44
+0,        129,        129,        1,   152064, 31db51a64307ca6f1db866a01befa301
+0,        130,        130,        1,   152064, 59924d342068caf1ad7329b947279e2d
+0,        131,        131,        1,   152064, 2f0f9dd3056cac40c17684bcccdf267d
+0,        132,        132,        1,   152064, b00df17142f99bdc077cb2e4c5c8b747
+0,        133,        133,        1,   152064, e7c40734dea5433038b975666be7b21e
+0,        134,        134,        1,   152064, 51d77965d3a9d431a2c409244c9bc465
+0,        135,        135,        1,   152064, 15b54bdc5e2098fe7c01ce689babe08b
+0,        136,        136,        1,   152064, 3fa3284ae3f714ea197ad614bff7c5c5
+0,        137,        137,        1,   152064, c6512a19b7b1b29c05c7b825b41ab930
+0,        138,        138,        1,   152064, b13c8bc436186d47595dc69186f1f927
+0,        139,        139,        1,   152064, d5eff490784883a93dd3aaea08c46d5b
+0,        140,        140,        1,   152064, a005ac77851ea3a44e261d9067ee835f
+0,        141,        141,        1,   152064, 6706b74dc10c72f27e9f6341710e56ac
+0,        142,        142,        1,   152064, 46479f86f53f55d2094354eb9bed78df
+0,        143,        143,        1,   152064, 17f5cd040eb766ece29d1c1e283e9c20
+0,        144,        144,        1,   152064, 4f34c43eeeac2c751aac486ba42d9b9a
+0,        145,        145,        1,   152064, 24c16b9d01c316305686af1a12f7be49
+0,        146,        146,        1,   152064, 9ae9b1f109fa3d02f226fefdaf395be6
+0,        147,        147,        1,   152064, eb98c1c6e473d8b53069206ffc69a9cb
+0,        148,        148,        1,   152064, f0768d9cb981d277b70d1b3b928f4915
+0,        149,        149,        1,   152064, c1a5cef2bdb3f3b932a051c29d31f889
+0,        150,        150,        1,   152064, 8f75fb3a6f994b90999f8b0c664ad7c4
+0,        151,        151,        1,   152064, 3a778c9c86afaf03f2e60668d849e25b
+0,        152,        152,        1,   152064, 4c3dd11965a2cf55790088a99289981a
+0,        153,        153,        1,   152064, 763f810845e6f4e798a6edb6633f5506
+0,        154,        154,        1,   152064, 6b305b9d79151c1644c924d522091eea
+0,        155,        155,        1,   152064, e981ce0e01f24eca2e89c7c81480fb07
+0,        156,        156,        1,   152064, 91349f36d44383dc1cd72f0a3f9c76ed
+0,        157,        157,        1,   152064, 9a67f029ed2370983ff3e24d8c2c65d2
+0,        158,        158,        1,   152064, cf5717cb593fbafad6abf8bdb7ca2737
+0,        159,        159,        1,   152064, 7ece8c2497ca72e4f8e9eb69048391f8
+0,        160,        160,        1,   152064, 9dccce22ca32a7ec8890f77e4de1fa42
+0,        161,        161,        1,   152064, f418dc75e266c47ba84275741f0635cb
+0,        162,        162,        1,   152064, aeddab213baab78ed0c44abb7409e291
+0,        163,        163,        1,   152064, a0b5e3c0616105580a310529ed71d072
+0,        164,        164,        1,   152064, e0e96da8724b472868634b6b145ebb2e
+0,        165,        165,        1,   152064, bdaaf9623f5d329c8706e4850db0beea
+0,        166,        166,        1,   152064, 6566ddd82da9096458e039caa7d56674
+0,        167,        167,        1,   152064, b882cb5f1c6059d338273e8fdb18e41e
+0,        168,        168,        1,   152064, f9723e59ce02828e64c16d32216441b2
+0,        169,        169,        1,   152064, 98b5a843bf125eeae0240bde40016d6a
+0,        170,        170,        1,   152064, 8958b81f8a028928c4b9a7024a4eebff
+0,        171,        171,        1,   152064, 25a8acfdd14a472a8090d41626472070
+0,        172,        172,        1,   152064, 6faf859c0b264b6d76e0823c6045cebd
+0,        173,        173,        1,   152064, 0774a3470360c37ede375d19aebe1844
+0,        174,        174,        1,   152064, 5dd921d4f05976fb6bbf5cc6996254e0
+0,        175,        175,        1,   152064, d03d789e3c439420a07e3e919ddd1cf0
+0,        176,        176,        1,   152064, 1fad139023f7d7022f8f65a6e31f68a9
+0,        177,        177,        1,   152064, 0c706070d649da054eeaf686d2e14a1d
+0,        178,        178,        1,   152064, 51e4156b19bdc55e993d1956473827e3
+0,        179,        179,        1,   152064, e447458fd86c022852cedf56dc58f34f
+0,        180,        180,        1,   152064, 59732caeb824f052044b4434ef564227
+0,        181,        181,        1,   152064, cf5ccf671ddc89e1f430878afb86fced
+0,        182,        182,        1,   152064, e3e98f92e4cf8f0ccce27482407ebbf1
+0,        183,        183,        1,   152064, 089d236d04d1918b319524e3002d21c8
+0,        184,        184,        1,   152064, 7063afc35aa2c24b1e3dc781bb612af1
+0,        185,        185,        1,   152064, 902e5153028215ac60bf0f998673e3ca
+0,        186,        186,        1,   152064, 2360fb2ed2b0e7c37a318fb7f9df7550
+0,        187,        187,        1,   152064, be0788a6a06906f57f7ad1e0e4c0aba7
+0,        188,        188,        1,   152064, db90ee89bbeefcd54b79f022ed9d62d9
+0,        189,        189,        1,   152064, 7237b5c1e6f182805d4e324e636f2a45
+0,        190,        190,        1,   152064, e5da5c0643e457087f54935cfa50f7c0
+0,        191,        191,        1,   152064, 89b5d462accdc4cfaed1e57de4589f39
+0,        192,        192,        1,   152064, b670710e2f897f20d83c42bcd0ee7d85
+0,        193,        193,        1,   152064, 9c7ceba12895f2a670e4a1498d28951c
+0,        194,        194,        1,   152064, 4b426b0719a67bc228e1928e83b47b53
+0,        195,        195,        1,   152064, b2c646cd4d3b100619fd6e626ea8b3cb
+0,        196,        196,        1,   152064, ad9abc825e1b87ec0defb1df032364e6
+0,        197,        197,        1,   152064, 21423e23c708f43a9d615bc2bc700d97
+0,        198,        198,        1,   152064, 14a42211968cd4b8416ebc0285eb02b3
+0,        199,        199,        1,   152064, a45eb0c4f6a9c5beeb90a292be71461e
+0,        200,        200,        1,   152064, f9bfba991f0a0ea6bbfdde5d23bd8785
+0,        201,        201,        1,   152064, 49d33752288ddef86dc702652f688c75
+0,        202,        202,        1,   152064, 97b50290b4a1e2f31c704cc302fe89d8
+0,        203,        203,        1,   152064, c3006dcc89d2f45379c840c7dd5f7559
+0,        204,        204,        1,   152064, 4a861c22e63478ffe73571909da9a15f
+0,        205,        205,        1,   152064, e7a8bff496059d3cd40470920fb26c75
+0,        206,        206,        1,   152064, 989d818e0d7d8eea14da209c37ad3e0b
+0,        207,        207,        1,   152064, 1732c746805ca221c85fb5570911378d
+0,        208,        208,        1,   152064, 60ece5f795f5756bef34ba84fb6fec2a
+0,        209,        209,        1,   152064, 9fd355648ef40dd0e15c81554b111637
+0,        210,        210,        1,   152064, 2a3b9220b98ea648e395ab9ea12023d2
+0,        211,        211,        1,   152064, eea2a06e68196917ba2a754563953cd5
+0,        212,        212,        1,   152064, 3c2ec831a9802a968654df1bee81ca40
+0,        213,        213,        1,   152064, 590abeedce1cfa9df8a00d7ab9cf2c8e
+0,        214,        214,        1,   152064, bc07f89391568a78854f99ad9fd62c49
+0,        215,        215,        1,   152064, 0bd866450376be96a85690595d96d909
+0,        216,        216,        1,   152064, 33483531a4d760bdc30a77d5de49aff7
+0,        217,        217,        1,   152064, b0294c6e784fa3f15532331063c5036f
+0,        218,        218,        1,   152064, f4f3ba2781b2a9be3c2dd5b4c445e0d9
+0,        219,        219,        1,   152064, 8550626512e0602a1c53bfb8c51427d8
+0,        220,        220,        1,   152064, 0c2d0229196825910e5f487c33b45ef3
+0,        221,        221,        1,   152064, 93dbbed468f0012b921aa0b2b6751a70
+0,        222,        222,        1,   152064, 2f0d99dc6d4b5c65bc18946b1e6cdc4c
+0,        223,        223,        1,   152064, fb25cbe655fc050bbcbfe9cc3fa06ffe
+0,        224,        224,        1,   152064, 376d3f894957b3bac2308f2662ad5c82
+0,        225,        225,        1,   152064, 46b5c54ea38987b9e3d371a64d06300d
+0,        226,        226,        1,   152064, 9bd24bc1a94aed633ff63aac5b720269
+0,        227,        227,        1,   152064, df0bb3f7724048f67c4a60a1dbb3d5e6
+0,        228,        228,        1,   152064, a9d1c8b8007ea61c0ab2f97b3cfc2aea
+0,        229,        229,        1,   152064, fd5a4ccab51773b09edca30e665999e8
+0,        230,        230,        1,   152064, 0eaf8218244c9b2e78660cf923755557
+0,        231,        231,        1,   152064, 40f4fc64016fd148b14aea2da7652125
+0,        232,        232,        1,   152064, 6f075b312e9f7e1b4c3343441a9e1f7f
+0,        233,        233,        1,   152064, 93f7523632abfe91fa701208aafdc29a
+0,        234,        234,        1,   152064, 3c3ea7aa12a89df2309b76c22053b0ff
+0,        235,        235,        1,   152064, 2181a1aec4278efa70dec025878d88c0
+0,        236,        236,        1,   152064, 35dffda6543fdf43ad182484564abda8
+0,        237,        237,        1,   152064, bf2b65551a8fcf3b1b4185e0ebfca2a7
+0,        238,        238,        1,   152064, 49fd2dd18ddbb7f005c3705910bff99f
+0,        239,        239,        1,   152064, 9f6826599ebd45a1159e46d293fc8f7b
+0,        240,        240,        1,   152064, 5b88b8ec1da51a165e2741f8a6b710ad
+0,        241,        241,        1,   152064, a81229c0d464cc8d376f8b0153b50fc2
+0,        242,        242,        1,   152064, 07ef482c1c9967700a6cef5cdd010384
+0,        243,        243,        1,   152064, d4ebe4de6e096f7cccd5ae2be856e983
+0,        244,        244,        1,   152064, 6daf25ffb2c2baf02e483e84733fc37b
+0,        245,        245,        1,   152064, d52f485c747e945bfe34aeeaaec4fe78
+0,        246,        246,        1,   152064, 408e5b502af7a10454af6f388e2722be
+0,        247,        247,        1,   152064, 684d285dc9c08791ce16e02a1f65e22b
+0,        248,        248,        1,   152064, 5de9b8f8678c6b7a1ff04f217ef8c0c3
+0,        249,        249,        1,   152064, b60f9e37dcfc3924adcfc96d08fb2656
+0,        250,        250,        1,   152064, 8975d551bb7c01cb520b5694e73d1809
+0,        251,        251,        1,   152064, af55f9897a3fa51eacdcebf3a21f5fe5
+0,        252,        252,        1,   152064, 10c21c5167cba09ce54f361e88e6e3c9
+0,        253,        253,        1,   152064, 8cb92c4a8d32fe00a92c5bd4a163cc45
+0,        254,        254,        1,   152064, 3d39fd1222c8421f0eed3c8249c3d772
+0,        255,        255,        1,   152064, 43c5629af47dc4fd659bffe481e84999
+0,        256,        256,        1,   152064, ad6d5a0f4d2d2738809b7f610f6da823
+0,        257,        257,        1,   152064, d2f0dbca68098d58468e94b84ef0fb8b
+0,        258,        258,        1,   152064, 247487ae60500313df92dd0175ac4e0f
+0,        259,        259,        1,   152064, cfbbabb4b8c93c87c221f76a155bb0fc
+0,        260,        260,        1,   152064, c708254a644abc41788d717dd59b8baf
+0,        261,        261,        1,   152064, fa710d87bddd1a65970c5618a8a0158f
+0,        262,        262,        1,   152064, 31210937c8a67c6aafda2e03226b9770
+0,        263,        263,        1,   152064, ac518a56fc537de251f3d28d380e25cb
+0,        264,        264,        1,   152064, afcb7642c336bcef9b605a40e518d305
+0,        265,        265,        1,   152064, 15fd29e16aaebae6f74e49455631c1f8
+0,        266,        266,        1,   152064, 938b90999b05595e9875c6d4f9836407
+0,        267,        267,        1,   152064, 2fe744b939902a5f4bb69e9243c55d08
+0,        268,        268,        1,   152064, a902057edac1638a1cd218fe5b88bfc2
+0,        269,        269,        1,   152064, 78087115b9600b5499866c127d175c0f
+0,        270,        270,        1,   152064, 877c729e2d2b599dd6cac1f59f12e068
+0,        271,        271,        1,   152064, 77e6b4b761902fbe27fb0ff9eb6d02ac
+0,        272,        272,        1,   152064, dd3ee373cb4935eca46947aedda3b991
+0,        273,        273,        1,   152064, b3ee6b4a18f6d20f9b9fd8dc9e8af90e
+0,        274,        274,        1,   152064, 492afb7421667468fa95017c693ec47b
+0,        275,        275,        1,   152064, 9abb912d8101de895b8f482c199934c2
+0,        276,        276,        1,   152064, 08ca372dfb5e90382f1b58345a0e51b1
+0,        277,        277,        1,   152064, 805559cb3f3385e7865df692336dba29
+0,        278,        278,        1,   152064, c5cc85e4d44010e048fd2013535d7180
+0,        279,        279,        1,   152064, ef9a05a7a4e0b5beff9a8119af44ebc7
+0,        280,        280,        1,   152064, e6983be0a0c1705cfede1e7476aad381
+0,        281,        281,        1,   152064, a4bb0c3d4deb17784b07d3713db05302
+0,        282,        282,        1,   152064, 0fd5bb9259e8c27aba7670b08cd9a26b
+0,        283,        283,        1,   152064, 43d6df9fd672b13e2c59db924e9fe30b
+0,        284,        284,        1,   152064, 3aaf3b87705c46495c9d1b9f4ea706bf
+0,        285,        285,        1,   152064, 0d2ba631f5c716d9c5e5b2a75d3b6433
+0,        286,        286,        1,   152064, bf29cc016dce85e621aaa7647fae1544
+0,        287,        287,        1,   152064, 3374284a808d79e9be32bf3610b0fd17
+0,        288,        288,        1,   152064, ea3f305e76009f3bf2cd5014d339eafa
+0,        289,        289,        1,   152064, 95ce7320a841a71b5a8871cef385ce41
+0,        290,        290,        1,   152064, 88613d96dbda681edab4ed41c3f08536
+0,        291,        291,        1,   152064, b9e9e9045b91c4f7917274088de64a5e
+0,        292,        292,        1,   152064, e0b90055449e7403289a8dda9c02add0
+0,        293,        293,        1,   152064, 367ee1603fa7778dad3e99be8db779ee
+0,        294,        294,        1,   152064, 6bb0eaa6140d673b452eee6ac6c262c2
+0,        295,        295,        1,   152064, 9af4ef919ae61e1597db1b9acd6af95a
+0,        296,        296,        1,   152064, e8f29872e86e54ac26b5fb0a20f10d3e
+0,        297,        297,        1,   152064, 09aaad95cd7d173bfe609b79440cbfc8
+0,        298,        298,        1,   152064, c03abe502be10f76e33d93e1c40cc674
+0,        299,        299,        1,   152064, 3e7e315be8aef281714a63f4cf086085
diff --git a/tests/ref/fate/api-mjpeg-codec-param b/tests/ref/fate/api-mjpeg-codec-param
index 290f941..82e3313 100644
--- a/tests/ref/fate/api-mjpeg-codec-param
+++ b/tests/ref/fate/api-mjpeg-codec-param
@@ -3,6 +3,8 @@
     ab=0
     bt=4000000
     flags=0x00000000
+    flags2=0x00000000
+    export_side_data=0x00000000
     time_base=0/1
     g=12
     ar=0
@@ -56,14 +58,9 @@
     aspect=180/180
     sar=180/180
     debug=0x00000000
-    cmp=0
-    subcmp=0
-    mbcmp=0
-    ildctcmp=8
     dia_size=0
     last_pred=0
     preme=0
-    precmp=0
     pre_dia_size=0
     subq=8
     me_range=0
@@ -75,7 +72,6 @@
     sc_threshold=0
     nr=0
     rc_init_occupancy=0
-    flags2=0x00000000
     threads=1
     dc=0
     nssew=8
@@ -88,6 +84,11 @@
     skip_factor=0
     skip_exp=0
     skipcmp=13
+    cmp=0
+    subcmp=0
+    mbcmp=0
+    ildctcmp=8
+    precmp=0
     mblmin=236
     mblmax=3658
     mepc=256
@@ -136,13 +137,17 @@
     pixel_format=yuvj422p
     video_size=400x225
     max_pixels=2147483647
+    max_samples=2147483647
     hwaccel_flags=0x00000001
     extra_hw_frames=-1
+    discard_damaged_percentage=95
 stream=0, decode=1
     b=0
     ab=0
     bt=4000000
     flags=0x00000000
+    flags2=0x00000000
+    export_side_data=0x00000000
     time_base=0/1
     g=12
     ar=0
@@ -196,14 +201,9 @@
     aspect=180/180
     sar=180/180
     debug=0x00000000
-    cmp=0
-    subcmp=0
-    mbcmp=0
-    ildctcmp=8
     dia_size=0
     last_pred=0
     preme=0
-    precmp=0
     pre_dia_size=0
     subq=8
     me_range=0
@@ -215,7 +215,6 @@
     sc_threshold=0
     nr=0
     rc_init_occupancy=0
-    flags2=0x00000000
     threads=1
     dc=0
     nssew=8
@@ -228,6 +227,11 @@
     skip_factor=0
     skip_exp=0
     skipcmp=13
+    cmp=0
+    subcmp=0
+    mbcmp=0
+    ildctcmp=8
+    precmp=0
     mblmin=236
     mblmax=3658
     mepc=256
@@ -276,5 +280,7 @@
     pixel_format=yuvj422p
     video_size=400x225
     max_pixels=2147483647
+    max_samples=2147483647
     hwaccel_flags=0x00000001
     extra_hw_frames=-1
+    discard_damaged_percentage=95
diff --git a/tests/ref/fate/api-png-codec-param b/tests/ref/fate/api-png-codec-param
index f04ffa7..7adaa52 100644
--- a/tests/ref/fate/api-png-codec-param
+++ b/tests/ref/fate/api-png-codec-param
@@ -3,6 +3,8 @@
     ab=0
     bt=4000000
     flags=0x00000000
+    flags2=0x00000000
+    export_side_data=0x00000000
     time_base=0/1
     g=12
     ar=0
@@ -56,14 +58,9 @@
     aspect=2835/2835
     sar=2835/2835
     debug=0x00000000
-    cmp=0
-    subcmp=0
-    mbcmp=0
-    ildctcmp=8
     dia_size=0
     last_pred=0
     preme=0
-    precmp=0
     pre_dia_size=0
     subq=8
     me_range=0
@@ -75,7 +72,6 @@
     sc_threshold=0
     nr=0
     rc_init_occupancy=0
-    flags2=0x00000000
     threads=1
     dc=0
     nssew=8
@@ -88,6 +84,11 @@
     skip_factor=0
     skip_exp=0
     skipcmp=13
+    cmp=0
+    subcmp=0
+    mbcmp=0
+    ildctcmp=8
+    precmp=0
     mblmin=236
     mblmax=3658
     mepc=256
@@ -136,13 +137,17 @@
     pixel_format=rgba
     video_size=128x128
     max_pixels=2147483647
+    max_samples=2147483647
     hwaccel_flags=0x00000001
     extra_hw_frames=-1
+    discard_damaged_percentage=95
 stream=0, decode=1
     b=0
     ab=0
     bt=4000000
     flags=0x00000000
+    flags2=0x00000000
+    export_side_data=0x00000000
     time_base=0/1
     g=12
     ar=0
@@ -196,14 +201,9 @@
     aspect=2835/2835
     sar=2835/2835
     debug=0x00000000
-    cmp=0
-    subcmp=0
-    mbcmp=0
-    ildctcmp=8
     dia_size=0
     last_pred=0
     preme=0
-    precmp=0
     pre_dia_size=0
     subq=8
     me_range=0
@@ -215,7 +215,6 @@
     sc_threshold=0
     nr=0
     rc_init_occupancy=0
-    flags2=0x00000000
     threads=1
     dc=0
     nssew=8
@@ -228,6 +227,11 @@
     skip_factor=0
     skip_exp=0
     skipcmp=13
+    cmp=0
+    subcmp=0
+    mbcmp=0
+    ildctcmp=8
+    precmp=0
     mblmin=236
     mblmax=3658
     mepc=256
@@ -276,5 +280,7 @@
     pixel_format=rgba
     video_size=128x128
     max_pixels=2147483647
+    max_samples=2147483647
     hwaccel_flags=0x00000001
     extra_hw_frames=-1
+    discard_damaged_percentage=95
diff --git a/tests/ref/fate/av1-annexb-demux b/tests/ref/fate/av1-annexb-demux
new file mode 100644
index 0000000..139a893
--- /dev/null
+++ b/tests/ref/fate/av1-annexb-demux
@@ -0,0 +1,16 @@
+#extradata 0:       13, 0x0e4c033a
+#tb 0: 1/1200000
+#media_type 0: video
+#codec_id 0: av1
+#dimensions 0: 300x300
+#sar 0: 0/1
+0,          0,          0,    48000,    12691, 0xf0adcc79
+0,      48000,      48000,    48000,     4975, 0x1742a45f, F=0x0
+0,      96000,      96000,    48000,      928, 0x7408be1a, F=0x0
+0,     144000,     144000,    48000,      702, 0x1d4464ca, F=0x0
+0,     192000,     192000,    48000,     1372, 0x37999ccf, F=0x0
+0,     240000,     240000,    48000,     1085, 0x06b61548, F=0x0
+0,     288000,     288000,    48000,     1533, 0x5e05dea3, F=0x0
+0,     336000,     336000,    48000,     1416, 0x31d4b906, F=0x0
+0,     384000,     384000,    48000,      108, 0xf52a2c59, F=0x0
+0,     432000,     432000,    48000,     1740, 0x1f065d09, F=0x0
diff --git a/tests/ref/fate/binsub-mksenc b/tests/ref/fate/binsub-mksenc
index f247d9d..b4c08e5 100644
--- a/tests/ref/fate/binsub-mksenc
+++ b/tests/ref/fate/binsub-mksenc
@@ -1 +1 @@
-f80f42e646fce972e73aa6d99dcfa470
+3dd15fa67a1df541aa89565ceb7047cf
diff --git a/tests/ref/fate/binsub-movtextenc b/tests/ref/fate/binsub-movtextenc
index dacee09..78c05f4 100644
--- a/tests/ref/fate/binsub-movtextenc
+++ b/tests/ref/fate/binsub-movtextenc
@@ -1 +1 @@
-66b25412f7ca699ee525ba162246edb6
+35adf776cd73e808186ae7124445f4b8
diff --git a/tests/ref/fate/cavs b/tests/ref/fate/cavs
index ddcbe04..89c2b4b 100644
--- a/tests/ref/fate/cavs
+++ b/tests/ref/fate/cavs
@@ -172,4 +172,4 @@
 0,        166,        166,        1,   622080, 0x05496a5d
 0,        167,        167,        1,   622080, 0xdcb4cee8
 0,        168,        168,        1,   622080, 0xb41172e5
-0,        169,        169,        1,   622080, 0x56c72478
+0,        169,        169,        1,   622080, 0x84ff3af9
diff --git a/tests/ref/fate/cbs-av1-av1-1-b10-23-film_grain-50 b/tests/ref/fate/cbs-av1-av1-1-b10-23-film_grain-50
new file mode 100644
index 0000000..500e655
--- /dev/null
+++ b/tests/ref/fate/cbs-av1-av1-1-b10-23-film_grain-50
@@ -0,0 +1 @@
+0ab934a437181d0275dc6c26bb9f6281
diff --git a/tests/ref/fate/cbs-av1-av1-1-b8-02-allintra b/tests/ref/fate/cbs-av1-av1-1-b8-02-allintra
new file mode 100644
index 0000000..11abf2f
--- /dev/null
+++ b/tests/ref/fate/cbs-av1-av1-1-b8-02-allintra
@@ -0,0 +1 @@
+134b447b04086088de4da127a97731f3
diff --git a/tests/ref/fate/cbs-av1-av1-1-b8-03-sizedown b/tests/ref/fate/cbs-av1-av1-1-b8-03-sizedown
new file mode 100644
index 0000000..7188d16
--- /dev/null
+++ b/tests/ref/fate/cbs-av1-av1-1-b8-03-sizedown
@@ -0,0 +1 @@
+e5924930773efdbbd82da02c96747f27
diff --git a/tests/ref/fate/cbs-av1-av1-1-b8-03-sizeup b/tests/ref/fate/cbs-av1-av1-1-b8-03-sizeup
new file mode 100644
index 0000000..9d767bb
--- /dev/null
+++ b/tests/ref/fate/cbs-av1-av1-1-b8-03-sizeup
@@ -0,0 +1 @@
+0348fba6ebf6caadfe80b19a6ad93caa
diff --git a/tests/ref/fate/cbs-av1-av1-1-b8-04-cdfupdate b/tests/ref/fate/cbs-av1-av1-1-b8-04-cdfupdate
new file mode 100644
index 0000000..9325dea
--- /dev/null
+++ b/tests/ref/fate/cbs-av1-av1-1-b8-04-cdfupdate
@@ -0,0 +1 @@
+aec87cd950fb985b1e345d0366709aea
diff --git a/tests/ref/fate/cbs-av1-av1-1-b8-05-mv b/tests/ref/fate/cbs-av1-av1-1-b8-05-mv
new file mode 100644
index 0000000..aa4ab51
--- /dev/null
+++ b/tests/ref/fate/cbs-av1-av1-1-b8-05-mv
@@ -0,0 +1 @@
+33f548eeef87e12b93b9bf4a3b79c70e
diff --git a/tests/ref/fate/cbs-av1-av1-1-b8-06-mfmv b/tests/ref/fate/cbs-av1-av1-1-b8-06-mfmv
new file mode 100644
index 0000000..ede34ae
--- /dev/null
+++ b/tests/ref/fate/cbs-av1-av1-1-b8-06-mfmv
@@ -0,0 +1 @@
+2e20870d44ba5ec5a8e1450b287e20b4
diff --git a/tests/ref/fate/cbs-av1-av1-1-b8-22-svc-L1T2 b/tests/ref/fate/cbs-av1-av1-1-b8-22-svc-L1T2
new file mode 100644
index 0000000..d17f202
--- /dev/null
+++ b/tests/ref/fate/cbs-av1-av1-1-b8-22-svc-L1T2
@@ -0,0 +1 @@
+f7138eaa1e572260a8a34f73f91e058a
diff --git a/tests/ref/fate/cbs-av1-av1-1-b8-22-svc-L2T1 b/tests/ref/fate/cbs-av1-av1-1-b8-22-svc-L2T1
new file mode 100644
index 0000000..a23f3cb
--- /dev/null
+++ b/tests/ref/fate/cbs-av1-av1-1-b8-22-svc-L2T1
@@ -0,0 +1 @@
+4f51af7abcf75eba35ab1c4796793681
diff --git a/tests/ref/fate/cbs-av1-av1-1-b8-22-svc-L2T2 b/tests/ref/fate/cbs-av1-av1-1-b8-22-svc-L2T2
new file mode 100644
index 0000000..7b6a77d
--- /dev/null
+++ b/tests/ref/fate/cbs-av1-av1-1-b8-22-svc-L2T2
@@ -0,0 +1 @@
+d52adb1719a0422782e40352e44c6cb0
diff --git a/tests/ref/fate/cbs-av1-av1-1-b8-23-film_grain-50 b/tests/ref/fate/cbs-av1-av1-1-b8-23-film_grain-50
new file mode 100644
index 0000000..c0daa8d
--- /dev/null
+++ b/tests/ref/fate/cbs-av1-av1-1-b8-23-film_grain-50
@@ -0,0 +1 @@
+99a635753d7e4e7deb99fd2ba866818e
diff --git a/tests/ref/fate/cbs-av1-decode_model b/tests/ref/fate/cbs-av1-decode_model
new file mode 100644
index 0000000..3d76958
--- /dev/null
+++ b/tests/ref/fate/cbs-av1-decode_model
@@ -0,0 +1 @@
+171ebf527c4cd57179d6a4e5c4f23ce4
diff --git a/tests/ref/fate/cbs-av1-frames_refs_short_signaling b/tests/ref/fate/cbs-av1-frames_refs_short_signaling
new file mode 100644
index 0000000..15a76ae
--- /dev/null
+++ b/tests/ref/fate/cbs-av1-frames_refs_short_signaling
@@ -0,0 +1 @@
+d1b05cf934aeda64b25a93423904c14d
diff --git a/tests/ref/fate/cbs-av1-non_uniform_tiling b/tests/ref/fate/cbs-av1-non_uniform_tiling
new file mode 100644
index 0000000..257ae07
--- /dev/null
+++ b/tests/ref/fate/cbs-av1-non_uniform_tiling
@@ -0,0 +1 @@
+3e204ee8a71273cf0247f48e977e64b7
diff --git a/tests/ref/fate/cbs-av1-seq_hdr_op_param_info b/tests/ref/fate/cbs-av1-seq_hdr_op_param_info
new file mode 100644
index 0000000..85d4f9b
--- /dev/null
+++ b/tests/ref/fate/cbs-av1-seq_hdr_op_param_info
@@ -0,0 +1 @@
+10e7bdd7cab67f203520e44b28a6477c
diff --git a/tests/ref/fate/cbs-av1-switch_frame b/tests/ref/fate/cbs-av1-switch_frame
new file mode 100644
index 0000000..07b0fd6
--- /dev/null
+++ b/tests/ref/fate/cbs-av1-switch_frame
@@ -0,0 +1 @@
+156b5297ca32c18183ca41a102a09a02
diff --git a/tests/ref/fate/cbs-hevc-SLPPLP_A_VIDYO_2 b/tests/ref/fate/cbs-hevc-SLPPLP_A_VIDYO_2
new file mode 100644
index 0000000..5945221
--- /dev/null
+++ b/tests/ref/fate/cbs-hevc-SLPPLP_A_VIDYO_2
@@ -0,0 +1 @@
+e5309cf061c06496f8fe2b8b313e6c39
diff --git a/tests/ref/fate/concat-demuxer-simple2-lavf-ts b/tests/ref/fate/concat-demuxer-simple2-lavf-ts
index e5cf18b..0f03d6e 100644
--- a/tests/ref/fate/concat-demuxer-simple2-lavf-ts
+++ b/tests/ref/fate/concat-demuxer-simple2-lavf-ts
@@ -1,20 +1,20 @@
 video|1|982|0.010911|-2618|-0.029089|3600|0.040000|N/A|N/A|24801|564|K_MPEGTS Stream ID
 
-video|1|4582|0.050911|982|0.010911|3600|0.040000|N/A|N/A|16429|27072|__MPEGTS Stream ID
+video|1|4582|0.050911|982|0.010911|3600|0.040000|N/A|N/A|16429|25944|__MPEGTS Stream ID
 
-video|1|8182|0.090911|4582|0.050911|3600|0.040000|N/A|N/A|14508|44932|__MPEGTS Stream ID
+video|1|8182|0.090911|4582|0.050911|3600|0.040000|N/A|N/A|14508|42864|__MPEGTS Stream ID
 
-video|1|11782|0.130911|8182|0.090911|3600|0.040000|N/A|N/A|12622|60536|__MPEGTS Stream ID
+video|1|11782|0.130911|8182|0.090911|3600|0.040000|N/A|N/A|12622|58092|__MPEGTS Stream ID
 
-video|1|15382|0.170911|11782|0.130911|3600|0.040000|N/A|N/A|13393|74260|__MPEGTS Stream ID
+video|1|15382|0.170911|11782|0.130911|3600|0.040000|N/A|N/A|13393|71064|__MPEGTS Stream ID
 
-video|1|18982|0.210911|15382|0.170911|3600|0.040000|N/A|N/A|13092|88924|__MPEGTS Stream ID
+video|1|18982|0.210911|15382|0.170911|3600|0.040000|N/A|N/A|13092|84788|__MPEGTS Stream ID
 
-video|1|22582|0.250911|18982|0.210911|3600|0.040000|N/A|N/A|12755|102836|__MPEGTS Stream ID
+video|1|22582|0.250911|18982|0.210911|3600|0.040000|N/A|N/A|12755|98700|__MPEGTS Stream ID
 
-video|1|26182|0.290911|22582|0.250911|3600|0.040000|N/A|N/A|12023|116748|__MPEGTS Stream ID
+video|1|26182|0.290911|22582|0.250911|3600|0.040000|N/A|N/A|12023|111860|__MPEGTS Stream ID
 
-audio|0|0|0.000000|0|0.000000|2351|0.026122|N/A|N/A|208|159988|K_MPEGTS Stream ID
+audio|0|0|0.000000|0|0.000000|2351|0.026122|N/A|N/A|208|152844|K_MPEGTS Stream ID
 
 audio|0|2351|0.026122|2351|0.026122|2351|0.026122|N/A|N/A|209|N/A|K_
 audio|0|4702|0.052244|4702|0.052244|2351|0.026122|N/A|N/A|209|N/A|K_
@@ -29,27 +29,27 @@
 audio|0|25861|0.287344|25861|0.287344|2351|0.026122|N/A|N/A|209|N/A|K_
 audio|0|28212|0.313467|28212|0.313467|2351|0.026122|N/A|N/A|209|N/A|K_
 audio|0|30563|0.339589|30563|0.339589|2351|0.026122|N/A|N/A|209|N/A|K_
-video|1|29782|0.330911|26182|0.290911|3600|0.040000|N/A|N/A|14098|130096|__MPEGTS Stream ID
+video|1|29782|0.330911|26182|0.290911|3600|0.040000|N/A|N/A|14098|124268|__MPEGTS Stream ID
 
-video|1|33382|0.370911|29782|0.330911|3600|0.040000|N/A|N/A|13329|145324|__MPEGTS Stream ID
+video|1|33382|0.370911|29782|0.330911|3600|0.040000|N/A|N/A|13329|139120|__MPEGTS Stream ID
 
-video|1|36982|0.410911|33382|0.370911|3600|0.040000|N/A|N/A|12135|162996|__MPEGTS Stream ID
+video|1|36982|0.410911|33382|0.370911|3600|0.040000|N/A|N/A|12135|155852|__MPEGTS Stream ID
 
-video|1|40582|0.450911|36982|0.410911|3600|0.040000|N/A|N/A|12282|176344|__MPEGTS Stream ID
+video|1|40582|0.450911|36982|0.410911|3600|0.040000|N/A|N/A|12282|168448|__MPEGTS Stream ID
 
-video|1|44182|0.490911|40582|0.450911|3600|0.040000|N/A|N/A|24786|189692|K_MPEGTS Stream ID
+video|1|44182|0.490911|40582|0.450911|3600|0.040000|N/A|N/A|24786|181420|K_MPEGTS Stream ID
 
-video|1|47782|0.530911|44182|0.490911|3600|0.040000|N/A|N/A|17440|216388|__MPEGTS Stream ID
+video|1|47782|0.530911|44182|0.490911|3600|0.040000|N/A|N/A|17440|206988|__MPEGTS Stream ID
 
-video|1|51382|0.570911|47782|0.530911|3600|0.040000|N/A|N/A|15019|235000|__MPEGTS Stream ID
+video|1|51382|0.570911|47782|0.530911|3600|0.040000|N/A|N/A|15019|224848|__MPEGTS Stream ID
 
-video|1|54982|0.610911|51382|0.570911|3600|0.040000|N/A|N/A|13449|251356|__MPEGTS Stream ID
+video|1|54982|0.610911|51382|0.570911|3600|0.040000|N/A|N/A|13449|240640|__MPEGTS Stream ID
 
-video|1|58582|0.650911|54982|0.610911|3600|0.040000|N/A|N/A|12398|266020|__MPEGTS Stream ID
+video|1|58582|0.650911|54982|0.610911|3600|0.040000|N/A|N/A|12398|254552|__MPEGTS Stream ID
 
-video|1|62182|0.690911|58582|0.650911|3600|0.040000|N/A|N/A|13455|279744|__MPEGTS Stream ID
+video|1|62182|0.690911|58582|0.650911|3600|0.040000|N/A|N/A|13455|267336|__MPEGTS Stream ID
 
-audio|0|32915|0.365722|32915|0.365722|2351|0.026122|N/A|N/A|209|322608|K_MPEGTS Stream ID
+audio|0|32915|0.365722|32915|0.365722|2351|0.026122|N/A|N/A|209|308508|K_MPEGTS Stream ID
 
 audio|0|35266|0.391844|35266|0.391844|2351|0.026122|N/A|N/A|209|N/A|K_
 audio|0|37617|0.417967|37617|0.417967|2351|0.026122|N/A|N/A|209|N/A|K_
@@ -64,17 +64,17 @@
 audio|0|58776|0.653067|58776|0.653067|2351|0.026122|N/A|N/A|209|N/A|K_
 audio|0|61127|0.679189|61127|0.679189|2351|0.026122|N/A|N/A|209|N/A|K_
 audio|0|63478|0.705311|63478|0.705311|2351|0.026122|N/A|N/A|209|N/A|K_
-video|1|65782|0.730911|62182|0.690911|3600|0.040000|N/A|N/A|13836|294408|__MPEGTS Stream ID
+video|1|65782|0.730911|62182|0.690911|3600|0.040000|N/A|N/A|13836|281624|__MPEGTS Stream ID
 
-video|1|69382|0.770911|65782|0.730911|3600|0.040000|N/A|N/A|12163|309448|__MPEGTS Stream ID
+video|1|69382|0.770911|65782|0.730911|3600|0.040000|N/A|N/A|12163|295912|__MPEGTS Stream ID
 
-video|1|72982|0.810911|69382|0.770911|3600|0.040000|N/A|N/A|12692|325992|__MPEGTS Stream ID
+video|1|72982|0.810911|69382|0.770911|3600|0.040000|N/A|N/A|12692|311516|__MPEGTS Stream ID
 
-video|1|76582|0.850911|72982|0.810911|3600|0.040000|N/A|N/A|10824|339528|__MPEGTS Stream ID
+video|1|76582|0.850911|72982|0.810911|3600|0.040000|N/A|N/A|10824|325052|__MPEGTS Stream ID
 
-video|1|80182|0.890911|76582|0.850911|3600|0.040000|N/A|N/A|11286|351372|__MPEGTS Stream ID
+video|1|80182|0.890911|76582|0.850911|3600|0.040000|N/A|N/A|11286|336144|__MPEGTS Stream ID
 
-audio|0|65829|0.731433|65829|0.731433|2351|0.026122|N/A|N/A|209|404576|K_MPEGTS Stream ID
+audio|0|65829|0.731433|65829|0.731433|2351|0.026122|N/A|N/A|209|386716|K_MPEGTS Stream ID
 
 audio|0|68180|0.757556|68180|0.757556|2351|0.026122|N/A|N/A|209|N/A|K_
 audio|0|70531|0.783678|70531|0.783678|2351|0.026122|N/A|N/A|209|N/A|K_
@@ -86,26 +86,26 @@
 audio|0|84637|0.940411|84637|0.940411|2351|0.026122|N/A|N/A|209|N/A|K_
 audio|0|86988|0.966533|86988|0.966533|2351|0.026122|N/A|N/A|209|N/A|K_
 audio|0|89339|0.992656|89339|0.992656|2351|0.026122|N/A|N/A|209|N/A|K_
-video|1|83782|0.930911|80182|0.890911|3600|0.040000|N/A|N/A|12678|363592|__MPEGTS Stream ID
+video|1|83782|0.930911|80182|0.890911|3600|0.040000|N/A|N/A|12678|347800|__MPEGTS Stream ID
 
-video|1|87382|0.970911|83782|0.930911|3600|0.040000|N/A|N/A|24711|377880|K_
+video|1|87382|0.970911|83782|0.930911|3600|0.040000|N/A|N/A|24711|361336|K_
 video|1|91964|1.021822|88364|0.981822|3600|0.040000|N/A|N/A|24801|564|K_MPEGTS Stream ID
 
-video|1|95564|1.061822|91964|1.021822|3600|0.040000|N/A|N/A|16429|27072|__MPEGTS Stream ID
+video|1|95564|1.061822|91964|1.021822|3600|0.040000|N/A|N/A|16429|25944|__MPEGTS Stream ID
 
-video|1|99164|1.101822|95564|1.061822|3600|0.040000|N/A|N/A|14508|44932|__MPEGTS Stream ID
+video|1|99164|1.101822|95564|1.061822|3600|0.040000|N/A|N/A|14508|42864|__MPEGTS Stream ID
 
-video|1|102764|1.141822|99164|1.101822|3600|0.040000|N/A|N/A|12622|60536|__MPEGTS Stream ID
+video|1|102764|1.141822|99164|1.101822|3600|0.040000|N/A|N/A|12622|58092|__MPEGTS Stream ID
 
-video|1|106364|1.181822|102764|1.141822|3600|0.040000|N/A|N/A|13393|74260|__MPEGTS Stream ID
+video|1|106364|1.181822|102764|1.141822|3600|0.040000|N/A|N/A|13393|71064|__MPEGTS Stream ID
 
-video|1|109964|1.221822|106364|1.181822|3600|0.040000|N/A|N/A|13092|88924|__MPEGTS Stream ID
+video|1|109964|1.221822|106364|1.181822|3600|0.040000|N/A|N/A|13092|84788|__MPEGTS Stream ID
 
-video|1|113564|1.261822|109964|1.221822|3600|0.040000|N/A|N/A|12755|102836|__MPEGTS Stream ID
+video|1|113564|1.261822|109964|1.221822|3600|0.040000|N/A|N/A|12755|98700|__MPEGTS Stream ID
 
-video|1|117164|1.301822|113564|1.261822|3600|0.040000|N/A|N/A|12023|116748|__MPEGTS Stream ID
+video|1|117164|1.301822|113564|1.261822|3600|0.040000|N/A|N/A|12023|111860|__MPEGTS Stream ID
 
-audio|0|90982|1.010911|90982|1.010911|2351|0.026122|N/A|N/A|208|159988|K_MPEGTS Stream ID
+audio|0|90982|1.010911|90982|1.010911|2351|0.026122|N/A|N/A|208|152844|K_MPEGTS Stream ID
 
 audio|0|93333|1.037033|93333|1.037033|2351|0.026122|N/A|N/A|209|N/A|K_
 audio|0|95684|1.063156|95684|1.063156|2351|0.026122|N/A|N/A|209|N/A|K_
@@ -120,27 +120,27 @@
 audio|0|116843|1.298256|116843|1.298256|2351|0.026122|N/A|N/A|209|N/A|K_
 audio|0|119194|1.324378|119194|1.324378|2351|0.026122|N/A|N/A|209|N/A|K_
 audio|0|121545|1.350500|121545|1.350500|2351|0.026122|N/A|N/A|209|N/A|K_
-video|1|120764|1.341822|117164|1.301822|3600|0.040000|N/A|N/A|14098|130096|__MPEGTS Stream ID
+video|1|120764|1.341822|117164|1.301822|3600|0.040000|N/A|N/A|14098|124268|__MPEGTS Stream ID
 
-video|1|124364|1.381822|120764|1.341822|3600|0.040000|N/A|N/A|13329|145324|__MPEGTS Stream ID
+video|1|124364|1.381822|120764|1.341822|3600|0.040000|N/A|N/A|13329|139120|__MPEGTS Stream ID
 
-video|1|127964|1.421822|124364|1.381822|3600|0.040000|N/A|N/A|12135|162996|__MPEGTS Stream ID
+video|1|127964|1.421822|124364|1.381822|3600|0.040000|N/A|N/A|12135|155852|__MPEGTS Stream ID
 
-video|1|131564|1.461822|127964|1.421822|3600|0.040000|N/A|N/A|12282|176344|__MPEGTS Stream ID
+video|1|131564|1.461822|127964|1.421822|3600|0.040000|N/A|N/A|12282|168448|__MPEGTS Stream ID
 
-video|1|135164|1.501822|131564|1.461822|3600|0.040000|N/A|N/A|24786|189692|K_MPEGTS Stream ID
+video|1|135164|1.501822|131564|1.461822|3600|0.040000|N/A|N/A|24786|181420|K_MPEGTS Stream ID
 
-video|1|138764|1.541822|135164|1.501822|3600|0.040000|N/A|N/A|17440|216388|__MPEGTS Stream ID
+video|1|138764|1.541822|135164|1.501822|3600|0.040000|N/A|N/A|17440|206988|__MPEGTS Stream ID
 
-video|1|142364|1.581822|138764|1.541822|3600|0.040000|N/A|N/A|15019|235000|__MPEGTS Stream ID
+video|1|142364|1.581822|138764|1.541822|3600|0.040000|N/A|N/A|15019|224848|__MPEGTS Stream ID
 
-video|1|145964|1.621822|142364|1.581822|3600|0.040000|N/A|N/A|13449|251356|__MPEGTS Stream ID
+video|1|145964|1.621822|142364|1.581822|3600|0.040000|N/A|N/A|13449|240640|__MPEGTS Stream ID
 
-video|1|149564|1.661822|145964|1.621822|3600|0.040000|N/A|N/A|12398|266020|__MPEGTS Stream ID
+video|1|149564|1.661822|145964|1.621822|3600|0.040000|N/A|N/A|12398|254552|__MPEGTS Stream ID
 
-video|1|153164|1.701822|149564|1.661822|3600|0.040000|N/A|N/A|13455|279744|__MPEGTS Stream ID
+video|1|153164|1.701822|149564|1.661822|3600|0.040000|N/A|N/A|13455|267336|__MPEGTS Stream ID
 
-audio|0|123897|1.376633|123897|1.376633|2351|0.026122|N/A|N/A|209|322608|K_MPEGTS Stream ID
+audio|0|123897|1.376633|123897|1.376633|2351|0.026122|N/A|N/A|209|308508|K_MPEGTS Stream ID
 
 audio|0|126248|1.402756|126248|1.402756|2351|0.026122|N/A|N/A|209|N/A|K_
 audio|0|128599|1.428878|128599|1.428878|2351|0.026122|N/A|N/A|209|N/A|K_
@@ -155,17 +155,17 @@
 audio|0|149758|1.663978|149758|1.663978|2351|0.026122|N/A|N/A|209|N/A|K_
 audio|0|152109|1.690100|152109|1.690100|2351|0.026122|N/A|N/A|209|N/A|K_
 audio|0|154460|1.716222|154460|1.716222|2351|0.026122|N/A|N/A|209|N/A|K_
-video|1|156764|1.741822|153164|1.701822|3600|0.040000|N/A|N/A|13836|294408|__MPEGTS Stream ID
+video|1|156764|1.741822|153164|1.701822|3600|0.040000|N/A|N/A|13836|281624|__MPEGTS Stream ID
 
-video|1|160364|1.781822|156764|1.741822|3600|0.040000|N/A|N/A|12163|309448|__MPEGTS Stream ID
+video|1|160364|1.781822|156764|1.741822|3600|0.040000|N/A|N/A|12163|295912|__MPEGTS Stream ID
 
-video|1|163964|1.821822|160364|1.781822|3600|0.040000|N/A|N/A|12692|325992|__MPEGTS Stream ID
+video|1|163964|1.821822|160364|1.781822|3600|0.040000|N/A|N/A|12692|311516|__MPEGTS Stream ID
 
-video|1|167564|1.861822|163964|1.821822|3600|0.040000|N/A|N/A|10824|339528|__MPEGTS Stream ID
+video|1|167564|1.861822|163964|1.821822|3600|0.040000|N/A|N/A|10824|325052|__MPEGTS Stream ID
 
-video|1|171164|1.901822|167564|1.861822|3600|0.040000|N/A|N/A|11286|351372|__MPEGTS Stream ID
+video|1|171164|1.901822|167564|1.861822|3600|0.040000|N/A|N/A|11286|336144|__MPEGTS Stream ID
 
-audio|0|156811|1.742344|156811|1.742344|2351|0.026122|N/A|N/A|209|404576|K_MPEGTS Stream ID
+audio|0|156811|1.742344|156811|1.742344|2351|0.026122|N/A|N/A|209|386716|K_MPEGTS Stream ID
 
 audio|0|159162|1.768467|159162|1.768467|2351|0.026122|N/A|N/A|209|N/A|K_
 audio|0|161513|1.794589|161513|1.794589|2351|0.026122|N/A|N/A|209|N/A|K_
@@ -177,16 +177,16 @@
 audio|0|175619|1.951322|175619|1.951322|2351|0.026122|N/A|N/A|209|N/A|K_
 audio|0|177970|1.977444|177970|1.977444|2351|0.026122|N/A|N/A|209|N/A|K_
 audio|0|180321|2.003567|180321|2.003567|2351|0.026122|N/A|N/A|209|N/A|K_
-video|1|174764|1.941822|171164|1.901822|3600|0.040000|N/A|N/A|12678|363592|__MPEGTS Stream ID
+video|1|174764|1.941822|171164|1.901822|3600|0.040000|N/A|N/A|12678|347800|__MPEGTS Stream ID
 
-video|1|178364|1.981822|174764|1.941822|3600|0.040000|N/A|N/A|24711|377880|K_
-video|1|139582|1.550911|135982|1.510911|3600|0.040000|N/A|N/A|12692|325992|__MPEGTS Stream ID
+video|1|178364|1.981822|174764|1.941822|3600|0.040000|N/A|N/A|24711|361336|K_
+video|1|139582|1.550911|135982|1.510911|3600|0.040000|N/A|N/A|12692|311516|__MPEGTS Stream ID
 
-video|1|143182|1.590911|139582|1.550911|3600|0.040000|N/A|N/A|10824|339528|__MPEGTS Stream ID
+video|1|143182|1.590911|139582|1.550911|3600|0.040000|N/A|N/A|10824|325052|__MPEGTS Stream ID
 
-video|1|146782|1.630911|143182|1.590911|3600|0.040000|N/A|N/A|11286|351372|__MPEGTS Stream ID
+video|1|146782|1.630911|143182|1.590911|3600|0.040000|N/A|N/A|11286|336144|__MPEGTS Stream ID
 
-audio|0|132429|1.471433|132429|1.471433|2351|0.026122|N/A|N/A|209|404576|K_MPEGTS Stream ID
+audio|0|132429|1.471433|132429|1.471433|2351|0.026122|N/A|N/A|209|386716|K_MPEGTS Stream ID
 
 audio|0|134780|1.497556|134780|1.497556|2351|0.026122|N/A|N/A|209|N/A|K_
 audio|0|137131|1.523678|137131|1.523678|2351|0.026122|N/A|N/A|209|N/A|K_
@@ -198,18 +198,18 @@
 audio|0|151237|1.680411|151237|1.680411|2351|0.026122|N/A|N/A|209|N/A|K_
 audio|0|153588|1.706533|153588|1.706533|2351|0.026122|N/A|N/A|209|N/A|K_
 audio|0|155939|1.732656|155939|1.732656|2351|0.026122|N/A|N/A|209|N/A|K_
-video|1|150382|1.670911|146782|1.630911|3600|0.040000|N/A|N/A|12678|363592|__MPEGTS Stream ID
+video|1|150382|1.670911|146782|1.630911|3600|0.040000|N/A|N/A|12678|347800|__MPEGTS Stream ID
 
-video|1|153982|1.710911|150382|1.670911|3600|0.040000|N/A|N/A|24711|377880|K_
-video|1|161182|1.790911|157582|1.750911|3600|0.040000|N/A|N/A|12135|162996|__MPEGTS Stream ID
+video|1|153982|1.710911|150382|1.670911|3600|0.040000|N/A|N/A|24711|361336|K_
+video|1|161182|1.790911|157582|1.750911|3600|0.040000|N/A|N/A|12135|155852|__MPEGTS Stream ID
 
-video|1|164782|1.830911|161182|1.790911|3600|0.040000|N/A|N/A|12282|176344|__MPEGTS Stream ID
+video|1|164782|1.830911|161182|1.790911|3600|0.040000|N/A|N/A|12282|168448|__MPEGTS Stream ID
 
-video|1|168382|1.870911|164782|1.830911|3600|0.040000|N/A|N/A|24786|189692|K_MPEGTS Stream ID
+video|1|168382|1.870911|164782|1.830911|3600|0.040000|N/A|N/A|24786|181420|K_MPEGTS Stream ID
 
-video|1|171982|1.910911|168382|1.870911|3600|0.040000|N/A|N/A|17440|216388|__MPEGTS Stream ID
+video|1|171982|1.910911|168382|1.870911|3600|0.040000|N/A|N/A|17440|206988|__MPEGTS Stream ID
 
-video|1|175582|1.950911|171982|1.910911|3600|0.040000|N/A|N/A|15019|235000|__MPEGTS Stream ID
+video|1|175582|1.950911|171982|1.910911|3600|0.040000|N/A|N/A|15019|224848|__MPEGTS Stream ID
 
 0|mp2|unknown|audio|1/44100|[3][0][0][0]|0x0003|s16p|44100|1|mono|0|N/A|0/0|0/0|1/90000|0|0.000000|N/A|N/A|64000|N/A|N/A|N/A|N/A|89|0|0|0|0|0|0|0|0|0|0|0|0
 1|mpeg2video|4|video|1/25|[2][0][0][0]|0x0002|352|288|0|0|1|1:1|11:9|yuv420p|8|tv|unknown|unknown|unknown|left|progressive|N/A|1|N/A|25/1|25/1|1/90000|N/A|N/A|N/A|N/A|N/A|N/A|N/A|N/A|N/A|60|0|0|0|0|0|0|0|0|0|0|0|0
diff --git a/tests/ref/fate/copy-apng b/tests/ref/fate/copy-apng
new file mode 100644
index 0000000..3057573
--- /dev/null
+++ b/tests/ref/fate/copy-apng
@@ -0,0 +1,32 @@
+a4c46fad7716ad094eb3c78b74ca0244 *tests/data/fate/copy-apng.apng
+6209864 tests/data/fate/copy-apng.apng
+#tb 0: 1/25
+#media_type 0: video
+#codec_id 0: rawvideo
+#dimensions 0: 352x288
+#sar 0: 0/1
+0,          0,          0,        1,   304128, 0x348bb7a0
+0,          1,          1,        1,   304128, 0xaf9634d7
+0,          2,          2,        1,   304128, 0x81161fd3
+0,          3,          3,        1,   304128, 0x6839b383
+0,          4,          4,        1,   304128, 0xa55299b8
+0,          5,          5,        1,   304128, 0x66fb65b3
+0,          6,          6,        1,   304128, 0xe6be2a99
+0,          7,          7,        1,   304128, 0xfb33cb55
+0,          8,          8,        1,   304128, 0x51ab3d74
+0,          9,          9,        1,   304128, 0x67dc44ee
+0,         10,         10,        1,   304128, 0x2eac3b50
+0,         11,         11,        1,   304128, 0xd4a4c377
+0,         12,         12,        1,   304128, 0x1eefe29c
+0,         13,         13,        1,   304128, 0x3a84d488
+0,         14,         14,        1,   304128, 0x70d3b165
+0,         15,         15,        1,   304128, 0x578e58d4
+0,         16,         16,        1,   304128, 0x08bba87e
+0,         17,         17,        1,   304128, 0xccc86c47
+0,         18,         18,        1,   304128, 0x70bf9aa2
+0,         19,         19,        1,   304128, 0x3fc3d5b5
+0,         20,         20,        1,   304128, 0xef52590b
+0,         21,         21,        1,   304128, 0x4f7adde0
+0,         22,         22,        1,   304128, 0xc076ef54
+0,         23,         23,        1,   304128, 0xed2bba2d
+0,         24,         24,        1,   304128, 0x6fce6367
diff --git a/tests/ref/fate/copy-psp b/tests/ref/fate/copy-psp
index 44ec461..8b2cef8 100644
--- a/tests/ref/fate/copy-psp
+++ b/tests/ref/fate/copy-psp
@@ -1,4 +1,4 @@
-65a177552e03123c9a62ddb942970d05 *tests/data/fate/copy-psp.psp
+8578401522773d0832f538ac915ad0b0 *tests/data/fate/copy-psp.psp
 2041445 tests/data/fate/copy-psp.psp
 #extradata 0:       51, 0xaf6d1012
 #extradata 1:        2, 0x00b200a1
diff --git a/tests/ref/fate/copy-trac236 b/tests/ref/fate/copy-trac236
index 2ac05e6..1583ae5 100644
--- a/tests/ref/fate/copy-trac236
+++ b/tests/ref/fate/copy-trac236
@@ -1,4 +1,4 @@
-959a4d78c6c11936e361fc3101a013eb *tests/data/fate/copy-trac236.mov
+984a33c6292e3d35e2cfdfbf66d8e82b *tests/data/fate/copy-trac236.mov
 630860 tests/data/fate/copy-trac236.mov
 #tb 0: 100/2997
 #media_type 0: video
diff --git a/tests/ref/fate/copy-trac3074 b/tests/ref/fate/copy-trac3074
index 5ce5694..ff66900 100644
--- a/tests/ref/fate/copy-trac3074
+++ b/tests/ref/fate/copy-trac3074
@@ -1,5 +1,5 @@
-39aef1afff761d673fd1be07182941d1 *tests/data/fate/copy-trac3074.mp4
-333991 tests/data/fate/copy-trac3074.mp4
+f92a201033712bda262f1e071e25544a *tests/data/fate/copy-trac3074.mp4
+333992 tests/data/fate/copy-trac3074.mp4
 #tb 0: 1/48000
 #media_type 0: audio
 #codec_id 0: eac3
diff --git a/tests/ref/fate/ffmpeg-filter_colorkey b/tests/ref/fate/ffmpeg-filter_colorkey
index effc13b..490a0f9 100644
--- a/tests/ref/fate/ffmpeg-filter_colorkey
+++ b/tests/ref/fate/ffmpeg-filter_colorkey
@@ -3,13 +3,13 @@
 #codec_id 0: rawvideo
 #dimensions 0: 720x576
 #sar 0: 0/1
-0,          0,          0,        1,   622080, 0x4e30accb
-0,          1,          1,        1,   622080, 0x7d941c14
-0,          2,          2,        1,   622080, 0xf7451c5b
-0,          3,          3,        1,   622080, 0xb2c74319
-0,          4,          4,        1,   622080, 0xc9b80b79
-0,          5,          5,        1,   622080, 0x92ce1194
-0,          6,          6,        1,   622080, 0x43ae99ac
-0,          7,          7,        1,   622080, 0x4ec3a554
-0,          8,          8,        1,   622080, 0x3200250c
-0,          9,          9,        1,   622080, 0x94ebb3f3
+0,          0,          0,        1,   622080, 0x78efb628
+0,          1,          1,        1,   622080, 0x641f2564
+0,          2,          2,        1,   622080, 0x348f25c3
+0,          3,          3,        1,   622080, 0x6afc485a
+0,          4,          4,        1,   622080, 0xe949107f
+0,          5,          5,        1,   622080, 0x171716e5
+0,          6,          6,        1,   622080, 0x2985a01f
+0,          7,          7,        1,   622080, 0xc5ddabd7
+0,          8,          8,        1,   622080, 0xb4dd2b7f
+0,          9,          9,        1,   622080, 0x6e75ba82
diff --git a/tests/ref/fate/ffmpeg-streamloop b/tests/ref/fate/ffmpeg-streamloop
new file mode 100644
index 0000000..d22199d
--- /dev/null
+++ b/tests/ref/fate/ffmpeg-streamloop
@@ -0,0 +1,85 @@
+#format: frame checksums
+#version: 2
+#hash: MD5
+#extradata 0,                              42, eb4ec433b0b59dcc24620891ef779635
+#tb 0: 1/1000
+#media_type 0: video
+#codec_id 0: h264
+#dimensions 0: 320x240
+#sar 0: 1/1
+#stream#, dts,        pts, duration,     size, hash
+0,        -80,          0,        0,     5131, fb6a475e53addc2ffa79e1b75de81050
+0,        -40,        160,       40,     2479, fc64a1f7054d22741fffc68891ff4887
+0,          0,         80,       40,     1354, 344ee1f5e8f0fe2785639dd530cf85ca
+0,         40,         40,       40,      965, cbea2691414063d4e1199b781586cac4
+0,         80,        120,       40,     1031, 69245957d44a7a9211e5d6fe872dec52
+0,        120,        320,       40,     2165, 6ddd38bbf1c85be10e1b17d5578b26f5
+0,        160,        240,       40,     1214, 981b555d6f810dc6b3faa4efb6beebaf
+0,        200,        200,       40,      942, 492ec5f73a56fcffff81ad1ec800dc53
+0,        240,        280,       40,      945, 1763cb0f5f1d4a054d54803715de83b3
+0,        280,        480,       40,     2026, 7a208cad2e04578047482a8874ba567a
+0,        320,        400,       40,     1275, a29002e40743ccdddd66f47e3b98e276
+0,        360,        360,       40,      851, c764eb2d5cb752cd607e81b69f78b799
+0,        400,        440,       40,      897, a01da8a716eae006ea6b24d8acb89fd7
+0,        440,        640,       40,     1764, 18ddd7bae5732b44fdef045f21e90f46
+0,        480,        560,       40,     1328, 7f42357fdc0df07ba22c1f803baa6fdc
+0,        520,        520,       40,      952, 83827ebe12f9104a72627b52170ff9e5
+0,        560,        600,       40,     1003, 41f8be66b69231439540e4cf0b07558c
+0,        600,        800,       40,     1839, 929c25e4201d66c471482d090db24b5b
+0,        640,        720,       40,     1133, bdc6f506ac07ff78cc33f33956de6efb
+0,        680,        680,       40,      984, 5264d530093275ade55efc816dea5c7e
+0,        720,        760,       40,      802, fd5f7a018a8c940d5978b36e2e6e9801
+0,        760,        960,       40,     1454, 4eac58bac2b54a8fcdaaaf16e7167917
+0,        800,        880,       40,     1269, 79632bd3f7325797f34874621f3a6dd3
+0,        840,        840,       40,     1013, 8a48271049e24a9a86fa48300bc75d34
+0,        880,        920,       40,      981, 759407123505076c31688ec8740d2db9
+0,        920,       1000,       40,     5131, fb6a475e53addc2ffa79e1b75de81050
+0,        960,       1160,       40,     2479, fc64a1f7054d22741fffc68891ff4887
+0,       1000,       1080,       40,     1354, 344ee1f5e8f0fe2785639dd530cf85ca
+0,       1040,       1040,       40,      965, cbea2691414063d4e1199b781586cac4
+0,       1080,       1120,       40,     1031, 69245957d44a7a9211e5d6fe872dec52
+0,       1120,       1320,       40,     2165, 6ddd38bbf1c85be10e1b17d5578b26f5
+0,       1160,       1240,       40,     1214, 981b555d6f810dc6b3faa4efb6beebaf
+0,       1200,       1200,       40,      942, 492ec5f73a56fcffff81ad1ec800dc53
+0,       1240,       1280,       40,      945, 1763cb0f5f1d4a054d54803715de83b3
+0,       1280,       1480,       40,     2026, 7a208cad2e04578047482a8874ba567a
+0,       1320,       1400,       40,     1275, a29002e40743ccdddd66f47e3b98e276
+0,       1360,       1360,       40,      851, c764eb2d5cb752cd607e81b69f78b799
+0,       1400,       1440,       40,      897, a01da8a716eae006ea6b24d8acb89fd7
+0,       1440,       1640,       40,     1764, 18ddd7bae5732b44fdef045f21e90f46
+0,       1480,       1560,       40,     1328, 7f42357fdc0df07ba22c1f803baa6fdc
+0,       1520,       1520,       40,      952, 83827ebe12f9104a72627b52170ff9e5
+0,       1560,       1600,       40,     1003, 41f8be66b69231439540e4cf0b07558c
+0,       1600,       1800,       40,     1839, 929c25e4201d66c471482d090db24b5b
+0,       1640,       1720,       40,     1133, bdc6f506ac07ff78cc33f33956de6efb
+0,       1680,       1680,       40,      984, 5264d530093275ade55efc816dea5c7e
+0,       1720,       1760,       40,      802, fd5f7a018a8c940d5978b36e2e6e9801
+0,       1760,       1960,       40,     1454, 4eac58bac2b54a8fcdaaaf16e7167917
+0,       1800,       1880,       40,     1269, 79632bd3f7325797f34874621f3a6dd3
+0,       1840,       1840,       40,     1013, 8a48271049e24a9a86fa48300bc75d34
+0,       1880,       1920,       40,      981, 759407123505076c31688ec8740d2db9
+0,       1920,       2000,       40,     5131, fb6a475e53addc2ffa79e1b75de81050
+0,       1960,       2160,       40,     2479, fc64a1f7054d22741fffc68891ff4887
+0,       2000,       2080,       40,     1354, 344ee1f5e8f0fe2785639dd530cf85ca
+0,       2040,       2040,       40,      965, cbea2691414063d4e1199b781586cac4
+0,       2080,       2120,       40,     1031, 69245957d44a7a9211e5d6fe872dec52
+0,       2120,       2320,       40,     2165, 6ddd38bbf1c85be10e1b17d5578b26f5
+0,       2160,       2240,       40,     1214, 981b555d6f810dc6b3faa4efb6beebaf
+0,       2200,       2200,       40,      942, 492ec5f73a56fcffff81ad1ec800dc53
+0,       2240,       2280,       40,      945, 1763cb0f5f1d4a054d54803715de83b3
+0,       2280,       2480,       40,     2026, 7a208cad2e04578047482a8874ba567a
+0,       2320,       2400,       40,     1275, a29002e40743ccdddd66f47e3b98e276
+0,       2360,       2360,       40,      851, c764eb2d5cb752cd607e81b69f78b799
+0,       2400,       2440,       40,      897, a01da8a716eae006ea6b24d8acb89fd7
+0,       2440,       2640,       40,     1764, 18ddd7bae5732b44fdef045f21e90f46
+0,       2480,       2560,       40,     1328, 7f42357fdc0df07ba22c1f803baa6fdc
+0,       2520,       2520,       40,      952, 83827ebe12f9104a72627b52170ff9e5
+0,       2560,       2600,       40,     1003, 41f8be66b69231439540e4cf0b07558c
+0,       2600,       2800,       40,     1839, 929c25e4201d66c471482d090db24b5b
+0,       2640,       2720,       40,     1133, bdc6f506ac07ff78cc33f33956de6efb
+0,       2680,       2680,       40,      984, 5264d530093275ade55efc816dea5c7e
+0,       2720,       2760,       40,      802, fd5f7a018a8c940d5978b36e2e6e9801
+0,       2760,       2960,       40,     1454, 4eac58bac2b54a8fcdaaaf16e7167917
+0,       2800,       2880,       40,     1269, 79632bd3f7325797f34874621f3a6dd3
+0,       2840,       2840,       40,     1013, 8a48271049e24a9a86fa48300bc75d34
+0,       2880,       2920,       40,      981, 759407123505076c31688ec8740d2db9
diff --git a/tests/ref/fate/filter-colorlevels b/tests/ref/fate/filter-colorlevels
new file mode 100644
index 0000000..ceb8cb2
--- /dev/null
+++ b/tests/ref/fate/filter-colorlevels
@@ -0,0 +1,55 @@
+#tb 0: 1/25
+#media_type 0: video
+#codec_id 0: rawvideo
+#dimensions 0: 352x288
+#sar 0: 0/1
+0,          0,          0,        1,   304128, 0x348bb7a0
+0,          1,          1,        1,   304128, 0xaf9634d7
+0,          2,          2,        1,   304128, 0x81161fd3
+0,          3,          3,        1,   304128, 0x6839b383
+0,          4,          4,        1,   304128, 0xa55299b8
+0,          5,          5,        1,   304128, 0x66fb65b3
+0,          6,          6,        1,   304128, 0xe6be2a99
+0,          7,          7,        1,   304128, 0xfb33cb55
+0,          8,          8,        1,   304128, 0x51ab3d74
+0,          9,          9,        1,   304128, 0x67dc44ee
+0,         10,         10,        1,   304128, 0x2eac3b50
+0,         11,         11,        1,   304128, 0xd4a4c377
+0,         12,         12,        1,   304128, 0x1eefe29c
+0,         13,         13,        1,   304128, 0x3a84d488
+0,         14,         14,        1,   304128, 0x70d3b165
+0,         15,         15,        1,   304128, 0x578e58d4
+0,         16,         16,        1,   304128, 0x08bba87e
+0,         17,         17,        1,   304128, 0xccc86c47
+0,         18,         18,        1,   304128, 0x70bf9aa2
+0,         19,         19,        1,   304128, 0x3fc3d5b5
+0,         20,         20,        1,   304128, 0xef52590b
+0,         21,         21,        1,   304128, 0x4f7adde0
+0,         22,         22,        1,   304128, 0xc076ef54
+0,         23,         23,        1,   304128, 0xed2bba2d
+0,         24,         24,        1,   304128, 0x6fce6367
+0,         25,         25,        1,   304128, 0x71fe3c07
+0,         26,         26,        1,   304128, 0x6395fc7c
+0,         27,         27,        1,   304128, 0xa800ea2c
+0,         28,         28,        1,   304128, 0x758dfa57
+0,         29,         29,        1,   304128, 0x7fbba7c6
+0,         30,         30,        1,   304128, 0x2842e2a7
+0,         31,         31,        1,   304128, 0xafc2787c
+0,         32,         32,        1,   304128, 0x01e9a76b
+0,         33,         33,        1,   304128, 0x32a2377b
+0,         34,         34,        1,   304128, 0x10e0af2f
+0,         35,         35,        1,   304128, 0x8ab789ca
+0,         36,         36,        1,   304128, 0x3a3a5c1d
+0,         37,         37,        1,   304128, 0xeecb3f50
+0,         38,         38,        1,   304128, 0x317f8a3f
+0,         39,         39,        1,   304128, 0x0b90ba72
+0,         40,         40,        1,   304128, 0x1d6a509e
+0,         41,         41,        1,   304128, 0x11416b22
+0,         42,         42,        1,   304128, 0x325014ed
+0,         43,         43,        1,   304128, 0xb36a830c
+0,         44,         44,        1,   304128, 0xf67fd957
+0,         45,         45,        1,   304128, 0x091ad040
+0,         46,         46,        1,   304128, 0xd6b4b00e
+0,         47,         47,        1,   304128, 0x440b3f2a
+0,         48,         48,        1,   304128, 0x7c329040
+0,         49,         49,        1,   304128, 0xf6619a69
diff --git a/tests/ref/fate/filter-colorlevels-16 b/tests/ref/fate/filter-colorlevels-16
new file mode 100644
index 0000000..eb948a9
--- /dev/null
+++ b/tests/ref/fate/filter-colorlevels-16
@@ -0,0 +1,55 @@
+#tb 0: 1/25
+#media_type 0: video
+#codec_id 0: rawvideo
+#dimensions 0: 352x288
+#sar 0: 0/1
+0,          0,          0,        1,   608256, 0x60865484
+0,          1,          1,        1,   608256, 0x3c9bad01
+0,          2,          2,        1,   608256, 0x809b6b5d
+0,          3,          3,        1,   608256, 0x4d873004
+0,          4,          4,        1,   608256, 0xff1651c8
+0,          5,          5,        1,   608256, 0x48fd0353
+0,          6,          6,        1,   608256, 0x184ce147
+0,          7,          7,        1,   608256, 0x9802722f
+0,          8,          8,        1,   608256, 0x9413376e
+0,          9,          9,        1,   608256, 0xfbb733e9
+0,         10,         10,        1,   608256, 0x573ae5a4
+0,         11,         11,        1,   608256, 0x8697c4a4
+0,         12,         12,        1,   608256, 0xc7b364c1
+0,         13,         13,        1,   608256, 0x512770ec
+0,         14,         14,        1,   608256, 0x2adee98f
+0,         15,         15,        1,   608256, 0xcfb7d642
+0,         16,         16,        1,   608256, 0xc303accb
+0,         17,         17,        1,   608256, 0xc738fee1
+0,         18,         18,        1,   608256, 0xd28c5669
+0,         19,         19,        1,   608256, 0xd3ce495a
+0,         20,         20,        1,   608256, 0x34fe368d
+0,         21,         21,        1,   608256, 0xbafe49a4
+0,         22,         22,        1,   608256, 0x68da4a93
+0,         23,         23,        1,   608256, 0xfd632bde
+0,         24,         24,        1,   608256, 0x92275713
+0,         25,         25,        1,   608256, 0xcb569e86
+0,         26,         26,        1,   608256, 0x84674f8a
+0,         27,         27,        1,   608256, 0xd8b7f0d5
+0,         28,         28,        1,   608256, 0xe3e6f966
+0,         29,         29,        1,   608256, 0x084d3d4c
+0,         30,         30,        1,   608256, 0x6e9c5c63
+0,         31,         31,        1,   608256, 0x71c71484
+0,         32,         32,        1,   608256, 0xa89dedd1
+0,         33,         33,        1,   608256, 0x4c481ca6
+0,         34,         34,        1,   608256, 0xa52bc63b
+0,         35,         35,        1,   608256, 0x59f0efa5
+0,         36,         36,        1,   608256, 0xafb82d42
+0,         37,         37,        1,   608256, 0x887b8458
+0,         38,         38,        1,   608256, 0x8a2c6984
+0,         39,         39,        1,   608256, 0xe75e4737
+0,         40,         40,        1,   608256, 0xe41ed81c
+0,         41,         41,        1,   608256, 0xbf816b8d
+0,         42,         42,        1,   608256, 0x8cd1af16
+0,         43,         43,        1,   608256, 0x31883468
+0,         44,         44,        1,   608256, 0x380c2bf8
+0,         45,         45,        1,   608256, 0x25e7483e
+0,         46,         46,        1,   608256, 0xe73edd67
+0,         47,         47,        1,   608256, 0x3e9670ef
+0,         48,         48,        1,   608256, 0xd5b871fd
+0,         49,         49,        1,   608256, 0xe075789f
diff --git a/tests/ref/fate/filter-concat-vfr b/tests/ref/fate/filter-concat-vfr
new file mode 100644
index 0000000..0dece67
--- /dev/null
+++ b/tests/ref/fate/filter-concat-vfr
@@ -0,0 +1,224 @@
+#tb 0: 1/1000000
+#media_type 0: video
+#codec_id 0: rawvideo
+#dimensions 0: 320x240
+#sar 0: 1/1
+#tb 1: 1/44100
+#media_type 1: audio
+#codec_id 1: pcm_s16le
+#sample_rate 1: 44100
+#channel_layout 1: 4
+#channel_layout_name 1: mono
+0,          0,          0,        0,   230400, 0x88c4d19a
+1,          0,          0,     1024,     2048, 0xb3f10192
+1,       1024,       1024,     1024,     2048, 0xb340fe4e
+1,       2048,       2048,     1024,     2048, 0x0a5f0111
+1,       3072,       3072,     1024,     2048, 0x51be06b8
+1,       4096,       4096,     1024,     2048, 0x71a1ffcb
+1,       5120,       5120,     1024,     2048, 0x7f64f50f
+1,       6144,       6144,     1024,     2048, 0x70a8fa17
+1,       7168,       7168,     1024,     2048, 0x0dad072a
+1,       8192,       8192,     1024,     2048, 0x5e810c51
+0,     200000,     200000,        0,   230400, 0x0d77c977
+1,       9216,       9216,     1024,     2048, 0xbe5bf462
+1,      10240,      10240,     1024,     2048, 0xbcd9faeb
+1,      11264,      11264,     1024,     2048, 0x0d5bfe9c
+1,      12288,      12288,     1024,     2048, 0x97d80297
+1,      13312,      13312,     1024,     2048, 0xba0f0894
+1,      14336,      14336,     1024,     2048, 0xcc22f291
+1,      15360,      15360,     1024,     2048, 0x11a9fa03
+1,      16384,      16384,     1024,     2048, 0x9a920378
+1,      17408,      17408,     1024,     2048, 0x901b0525
+0,     400000,     400000,        0,   230400, 0x242629d7
+1,      18432,      18432,     1024,     2048, 0x74b2003f
+1,      19456,      19456,     1024,     2048, 0xa20ef3ed
+1,      20480,      20480,     1024,     2048, 0x44cef9de
+1,      21504,      21504,     1024,     2048, 0x4b2e039b
+1,      22528,      22528,     1024,     2048, 0x198509a1
+1,      23552,      23552,     1024,     2048, 0xcab6f9e5
+1,      24576,      24576,     1024,     2048, 0x67f8f608
+1,      25600,      25600,     1024,     2048, 0x8d7f03fa
+0,     600000,     600000,        0,   230400, 0x62cdc018
+1,      26624,      26624,     1024,     2048, 0x3e1e0566
+1,      27648,      27648,     1024,     2048, 0x2cfe0308
+1,      28672,      28672,     1024,     2048, 0x1ceaf702
+1,      29696,      29696,     1024,     2048, 0x38a9f3d1
+1,      30720,      30720,     1024,     2048, 0x6c3306b7
+1,      31744,      31744,     1024,     2048, 0x600f0579
+1,      32768,      32768,     1024,     2048, 0x3e5afa28
+1,      33792,      33792,     1024,     2048, 0x053ff47a
+1,      34816,      34816,     1024,     2048, 0x0d28fed9
+0,     800000,     800000,        0,   230400, 0x248ad058
+1,      35840,      35840,     1024,     2048, 0x279805cc
+1,      36864,      36864,     1024,     2048, 0xb16a0a12
+1,      37888,      37888,     1024,     2048, 0xb45af340
+1,      38912,      38912,     1024,     2048, 0x1834f972
+1,      39936,      39936,     1024,     2048, 0xb5d206ae
+1,      40960,      40960,     1024,     2048, 0xc5760375
+1,      41984,      41984,     1024,     2048, 0x503800ce
+1,      43008,      43008,     1024,     2048, 0xa3bbf4af
+1,      44032,      44032,       68,      136, 0xc8d751c7
+0,    1000000,    1000000,        0,   230400, 0x223d134f
+1,      44100,      44100,     9600,    19200, 0x00000000
+0,    1200000,    1200000,        0,   230400, 0xbf1c3d34
+1,      53700,      53700,     9600,    19200, 0x00000000
+0,    1400000,    1400000,        0,   230400, 0xae0efe96
+1,      63300,      63300,     9600,    19200, 0x00000000
+0,    1600000,    1600000,        0,   230400, 0x0cd624d1
+1,      72900,      72900,     9600,    19200, 0x00000000
+0,    1800000,    1800000,        0,   230400, 0x6dedf2c0
+1,      82500,      82500,     5700,    11400, 0x00000000
+0,    2000000,    2000000,        0,   230400, 0x88c4d19a
+1,      88200,      88200,     1024,     2048, 0x283efb3a
+1,      89224,      89224,     1024,     2048, 0x7692fb8f
+1,      90248,      90248,     1024,     2048, 0xbaaafcc0
+0,    2066667,    2066667,        0,   230400, 0x5bbc2f63
+1,      91272,      91272,     1024,     2048, 0xadc8017e
+1,      92296,      92296,     1024,     2048, 0x4f4dffdc
+1,      93320,      93320,     1024,     2048, 0x7ffbff48
+0,    2133333,    2133333,        0,   230400, 0x3becbfad
+1,      94344,      94344,     1024,     2048, 0x2f990719
+1,      95368,      95368,     1024,     2048, 0xe2caf65c
+1,      96392,      96392,     1024,     2048, 0x825208e4
+0,    2200000,    2200000,        0,   230400, 0x0d77c977
+1,      97416,      97416,     1024,     2048, 0xf563f13b
+1,      98440,      98440,     1024,     2048, 0x855d03e9
+1,      99464,      99464,     1024,     2048, 0x0ba9fa4b
+0,    2266667,    2266667,        0,   230400, 0x436cf4b2
+1,     100488,     100488,     1024,     2048, 0x83e1fb92
+1,     101512,     101512,     1024,     2048, 0x1162f965
+1,     102536,     102536,     1024,     2048, 0x0cfef73d
+0,    2333333,    2333333,        0,   230400, 0x39210f27
+1,     103560,     103560,     1024,     2048, 0x5688ff75
+1,     104584,     104584,     1024,     2048, 0xf6c0ede9
+1,     105608,     105608,     1024,     2048, 0xfdb20602
+0,    2400000,    2400000,        0,   230400, 0x242629d7
+1,     106632,     106632,     1024,     2048, 0x40c5f17b
+1,     107656,     107656,     1024,     2048, 0x559600b1
+1,     108680,     108680,     1024,     2048, 0xccc3f930
+0,    2466667,    2466667,        0,   230400, 0x771c2293
+1,     109704,     109704,     1024,     2048, 0xdc800045
+1,     110728,     110728,     1024,     2048, 0xdce4fb3e
+0,    2533333,    2533333,        0,   230400, 0xec2af9a9
+1,     111752,     111752,     1024,     2048, 0x1e5efba9
+1,     112776,     112776,     1024,     2048, 0x8c2e0832
+1,     113800,     113800,     1024,     2048, 0x5c42f66d
+0,    2600000,    2600000,        0,   230400, 0x62cdc018
+1,     114824,     114824,     1024,     2048, 0x08e20b1e
+1,     115848,     115848,     1024,     2048, 0x4cf7f903
+1,     116872,     116872,     1024,     2048, 0xe6b90794
+0,    2666667,    2666667,        0,   230400, 0xf02c8693
+1,     117896,     117896,     1024,     2048, 0x5956f8e6
+1,     118920,     118920,     1024,     2048, 0x6632ff16
+1,     119944,     119944,     1024,     2048, 0x46c8fe11
+0,    2733333,    2733333,        0,   230400, 0x14436efb
+1,     120968,     120968,     1024,     2048, 0x7431f732
+1,     121992,     121992,     1024,     2048, 0xa258049f
+1,     123016,     123016,     1024,     2048, 0xdb71f00e
+0,    2800000,    2800000,        0,   230400, 0x248ad058
+1,     124040,     124040,     1024,     2048, 0xa89b0359
+1,     125064,     125064,     1024,     2048, 0xe0aff0f2
+1,     126088,     126088,     1024,     2048, 0xc33e0085
+0,    2866667,    2866667,        0,   230400, 0xe87f6c52
+1,     127112,     127112,     1024,     2048, 0x9d09f379
+1,     128136,     128136,     1024,     2048, 0x8c78fd06
+1,     129160,     129160,     1024,     2048, 0x532bfbdd
+0,    2933333,    2933333,        0,   230400, 0x6a0c196b
+1,     130184,     130184,     1024,     2048, 0xfc36f5cd
+1,     131208,     131208,     1024,     2048, 0x2e8f0699
+1,     132232,     132232,     1024,     2048, 0x52382578
+1,     133256,     133256,     1024,     2048, 0x97ed1a28
+1,     134280,     134280,     1024,     2048, 0xabcdf73f
+1,     135304,     135304,     1024,     2048, 0x3a24082c
+1,     136328,     136328,     1024,     2048, 0xbe1cfc3d
+1,     137352,     137352,     1024,     2048, 0xad5800a5
+1,     138376,     138376,     1024,     2048, 0x90b80522
+1,     139400,     139400,     1024,     2048, 0x1fa1f912
+1,     140424,     140424,     1024,     2048, 0x733a0878
+1,     141448,     141448,     1024,     2048, 0x9a3eee47
+1,     142472,     142472,     1024,     2048, 0x5d900759
+1,     143496,     143496,     1024,     2048, 0x1287f540
+1,     144520,     144520,     1024,     2048, 0x941cfe5d
+1,     145544,     145544,     1024,     2048, 0x1587f8a9
+1,     146568,     146568,     1024,     2048, 0xb9e7f888
+1,     147592,     147592,     1024,     2048, 0xe9defbe2
+1,     148616,     148616,     1024,     2048, 0x3a5ef312
+1,     149640,     149640,     1024,     2048, 0xdcbe0544
+1,     150664,     150664,     1024,     2048, 0xbe51ecc5
+1,     151688,     151688,     1024,     2048, 0x21a60721
+1,     152712,     152712,     1024,     2048, 0xf29ff318
+1,     153736,     153736,     1024,     2048, 0xcd4c02ea
+1,     154760,     154760,     1024,     2048, 0xa424faac
+1,     155784,     155784,     1024,     2048, 0xbaedfdab
+1,     156808,     156808,     1024,     2048, 0xcbff047c
+1,     157832,     157832,     1024,     2048, 0x9ac8f96b
+1,     158856,     158856,     1024,     2048, 0x43220bee
+1,     159880,     159880,     1024,     2048, 0x547bf351
+1,     160904,     160904,     1024,     2048, 0x7dd10d6e
+1,     161928,     161928,     1024,     2048, 0x77cbf603
+1,     162952,     162952,     1024,     2048, 0xb6fcff50
+1,     163976,     163976,     1024,     2048, 0x927bfde5
+1,     165000,     165000,     1024,     2048, 0x5bd0fca5
+1,     166024,     166024,     1024,     2048, 0x672cff2a
+1,     167048,     167048,     1024,     2048, 0x3e3ef01c
+1,     168072,     168072,     1024,     2048, 0xe52607af
+1,     169096,     169096,     1024,     2048, 0x66bceaf5
+1,     170120,     170120,     1024,     2048, 0xe065046b
+1,     171144,     171144,     1024,     2048, 0x350bf21f
+1,     172168,     172168,     1024,     2048, 0x60b1fca4
+1,     173192,     173192,     1024,     2048, 0x8b1efa55
+1,     174216,     174216,     1024,     2048, 0xf86ff855
+1,     175240,     175240,     1024,     2048, 0x6934061b
+1,     176264,     176264,      136,      272, 0x4a458a45
+0,    4000000,    4000000,        0,   230400, 0x88c4d19a
+1,     176400,     176400,     1024,     2048, 0xdb0cfe95
+1,     177424,     177424,     1024,     2048, 0xcff3fdf1
+1,     178448,     178448,     1024,     2048, 0x070cf585
+1,     179472,     179472,     1024,     2048, 0xe9b8007f
+1,     180496,     180496,     1024,     2048, 0xc51ffd64
+1,     181520,     181520,     1024,     2048, 0xede2fbf9
+0,    4125000,    4125000,        0,   230400, 0x05c1b733
+1,     182544,     182544,     1024,     2048, 0x51510410
+1,     183568,     183568,     1024,     2048, 0x198af498
+1,     184592,     184592,     1024,     2048, 0xae3603a2
+1,     185616,     185616,     1024,     2048, 0x6200f7a1
+1,     186640,     186640,     1024,     2048, 0xe6e3fe32
+0,    4250000,    4250000,        0,   230400, 0x0446ec19
+1,     187664,     187664,     1024,     2048, 0xb2e2fd77
+1,     188688,     188688,     1024,     2048, 0x063dff2f
+1,     189712,     189712,     1024,     2048, 0xa89ffe21
+1,     190736,     190736,     1024,     2048, 0x9e6ffa6d
+1,     191760,     191760,     1024,     2048, 0x028b004e
+1,     192784,     192784,     1024,     2048, 0x57edfa23
+0,    4375000,    4375000,        0,   230400, 0x0f9b1744
+1,     193808,     193808,     1024,     2048, 0x6d8efe1f
+1,     194832,     194832,     1024,     2048, 0x774bfe54
+1,     195856,     195856,     1024,     2048, 0xa931fcfb
+1,     196880,     196880,     1024,     2048, 0x3505004b
+1,     197904,     197904,     1024,     2048, 0x5001f576
+0,    4500000,    4500000,        0,   230400, 0x30cf070a
+1,     198928,     198928,     1024,     2048, 0x78ea049b
+1,     199952,     199952,     1024,     2048, 0xd45bf733
+1,     200976,     200976,     1024,     2048, 0x6395fead
+1,     202000,     202000,     1024,     2048, 0xc126015e
+1,     203024,     203024,     1024,     2048, 0xbecff8aa
+0,    4625000,    4625000,        0,   230400, 0x9175aaa9
+1,     204048,     204048,     1024,     2048, 0x0fea06c3
+1,     205072,     205072,     1024,     2048, 0xdea6f351
+1,     206096,     206096,     1024,     2048, 0x35b808f0
+1,     207120,     207120,     1024,     2048, 0x5487ee73
+1,     208144,     208144,     1024,     2048, 0xac69050e
+1,     209168,     209168,     1024,     2048, 0xcc5ffb00
+0,    4750000,    4750000,        0,   230400, 0x597f5628
+1,     210192,     210192,     1024,     2048, 0x328c00cb
+1,     211216,     211216,     1024,     2048, 0xa707fd82
+1,     212240,     212240,     1024,     2048, 0xe442f73d
+1,     213264,     213264,     1024,     2048, 0x545c0418
+1,     214288,     214288,     1024,     2048, 0x744ff3f7
+0,    4875000,    4875000,        0,   230400, 0x38a45a85
+1,     215312,     215312,     1024,     2048, 0x01aa04fd
+1,     216336,     216336,     1024,     2048, 0xa885f7cd
+1,     217360,     217360,     1024,     2048, 0xcfca04f4
+1,     218384,     218384,     1024,     2048, 0x67fdf91b
+1,     219408,     219408,     1024,     2048, 0xce2b001d
+1,     220432,     220432,       68,      136, 0x33e64a0d
diff --git a/tests/ref/fate/filter-metadata-freezedetect b/tests/ref/fate/filter-metadata-freezedetect
new file mode 100644
index 0000000..a0ee38e
--- /dev/null
+++ b/tests/ref/fate/filter-metadata-freezedetect
@@ -0,0 +1,251 @@
+pkt_pts=0
+pkt_pts=1
+pkt_pts=2
+pkt_pts=3
+pkt_pts=4
+pkt_pts=5
+pkt_pts=6
+pkt_pts=7
+pkt_pts=8
+pkt_pts=9
+pkt_pts=10
+pkt_pts=11
+pkt_pts=12
+pkt_pts=13
+pkt_pts=14
+pkt_pts=15
+pkt_pts=16
+pkt_pts=17
+pkt_pts=18
+pkt_pts=19
+pkt_pts=20
+pkt_pts=21
+pkt_pts=22
+pkt_pts=23
+pkt_pts=24
+pkt_pts=25
+pkt_pts=26
+pkt_pts=27
+pkt_pts=28
+pkt_pts=29
+pkt_pts=30
+pkt_pts=31
+pkt_pts=32
+pkt_pts=33
+pkt_pts=34
+pkt_pts=35
+pkt_pts=36
+pkt_pts=37
+pkt_pts=38
+pkt_pts=39
+pkt_pts=40
+pkt_pts=41
+pkt_pts=42
+pkt_pts=43
+pkt_pts=44
+pkt_pts=45
+pkt_pts=46
+pkt_pts=47
+pkt_pts=48
+pkt_pts=49
+pkt_pts=50
+pkt_pts=51
+pkt_pts=52
+pkt_pts=53
+pkt_pts=54
+pkt_pts=55
+pkt_pts=56
+pkt_pts=57
+pkt_pts=58
+pkt_pts=59
+pkt_pts=60
+pkt_pts=61
+pkt_pts=62
+pkt_pts=63
+pkt_pts=64
+pkt_pts=65
+pkt_pts=66
+pkt_pts=67
+pkt_pts=68
+pkt_pts=69
+pkt_pts=70
+pkt_pts=71
+pkt_pts=72
+pkt_pts=73
+pkt_pts=74
+pkt_pts=75
+pkt_pts=76
+pkt_pts=77
+pkt_pts=78
+pkt_pts=79
+pkt_pts=80
+pkt_pts=81
+pkt_pts=82
+pkt_pts=83
+pkt_pts=84
+pkt_pts=85
+pkt_pts=86
+pkt_pts=87
+pkt_pts=88
+pkt_pts=89
+pkt_pts=90
+pkt_pts=91
+pkt_pts=92
+pkt_pts=93
+pkt_pts=94
+pkt_pts=95
+pkt_pts=96
+pkt_pts=97
+pkt_pts=98
+pkt_pts=99
+pkt_pts=100
+pkt_pts=101
+pkt_pts=102
+pkt_pts=103
+pkt_pts=104
+pkt_pts=105
+pkt_pts=106
+pkt_pts=107
+pkt_pts=108
+pkt_pts=109
+pkt_pts=110
+pkt_pts=111
+pkt_pts=112
+pkt_pts=113
+pkt_pts=114
+pkt_pts=115
+pkt_pts=116
+pkt_pts=117
+pkt_pts=118
+pkt_pts=119
+pkt_pts=120
+pkt_pts=121
+pkt_pts=122
+pkt_pts=123
+pkt_pts=124
+pkt_pts=125
+pkt_pts=126
+pkt_pts=127
+pkt_pts=128
+pkt_pts=129
+pkt_pts=130
+pkt_pts=131
+pkt_pts=132
+pkt_pts=133
+pkt_pts=134
+pkt_pts=135
+pkt_pts=136
+pkt_pts=137
+pkt_pts=138
+pkt_pts=139
+pkt_pts=140
+pkt_pts=141
+pkt_pts=142
+pkt_pts=143
+pkt_pts=144
+pkt_pts=145
+pkt_pts=146
+pkt_pts=147
+pkt_pts=148
+pkt_pts=149
+pkt_pts=150
+pkt_pts=151
+pkt_pts=152
+pkt_pts=153|tag:lavfi.freezedetect.freeze_start=4.12|tag:lavfi.freezedetect.freeze_duration=2|tag:lavfi.freezedetect.freeze_end=6.12
+pkt_pts=154
+pkt_pts=155
+pkt_pts=156
+pkt_pts=157
+pkt_pts=158
+pkt_pts=159
+pkt_pts=160
+pkt_pts=161
+pkt_pts=162
+pkt_pts=163
+pkt_pts=164
+pkt_pts=165
+pkt_pts=166
+pkt_pts=167
+pkt_pts=168
+pkt_pts=169
+pkt_pts=170
+pkt_pts=171
+pkt_pts=172
+pkt_pts=173
+pkt_pts=174
+pkt_pts=175
+pkt_pts=176
+pkt_pts=177
+pkt_pts=178
+pkt_pts=179
+pkt_pts=180
+pkt_pts=181
+pkt_pts=182
+pkt_pts=183
+pkt_pts=184
+pkt_pts=185
+pkt_pts=186
+pkt_pts=187
+pkt_pts=188
+pkt_pts=189
+pkt_pts=190
+pkt_pts=191
+pkt_pts=192
+pkt_pts=193
+pkt_pts=194
+pkt_pts=195
+pkt_pts=196
+pkt_pts=197
+pkt_pts=198
+pkt_pts=199
+pkt_pts=200
+pkt_pts=201
+pkt_pts=202
+pkt_pts=203
+pkt_pts=204|tag:lavfi.freezedetect.freeze_start=6.16|tag:lavfi.freezedetect.freeze_duration=2|tag:lavfi.freezedetect.freeze_end=8.16
+pkt_pts=205
+pkt_pts=206
+pkt_pts=207
+pkt_pts=208
+pkt_pts=209
+pkt_pts=210
+pkt_pts=211
+pkt_pts=212
+pkt_pts=213
+pkt_pts=214
+pkt_pts=215
+pkt_pts=216
+pkt_pts=217
+pkt_pts=218
+pkt_pts=219
+pkt_pts=220
+pkt_pts=221
+pkt_pts=222
+pkt_pts=223
+pkt_pts=224
+pkt_pts=225
+pkt_pts=226
+pkt_pts=227
+pkt_pts=228
+pkt_pts=229
+pkt_pts=230
+pkt_pts=231
+pkt_pts=232
+pkt_pts=233
+pkt_pts=234
+pkt_pts=235
+pkt_pts=236
+pkt_pts=237
+pkt_pts=238
+pkt_pts=239
+pkt_pts=240
+pkt_pts=241
+pkt_pts=242
+pkt_pts=243
+pkt_pts=244
+pkt_pts=245
+pkt_pts=246
+pkt_pts=247
+pkt_pts=248
+pkt_pts=249
+pkt_pts=250
diff --git a/tests/ref/fate/filter-metadata-scenedetect b/tests/ref/fate/filter-metadata-scenedetect
index d04054a..36c033b 100644
--- a/tests/ref/fate/filter-metadata-scenedetect
+++ b/tests/ref/fate/filter-metadata-scenedetect
@@ -1,10 +1,11 @@
 pkt_pts=1620|tag:lavfi.scene_score=1.000000
-pkt_pts=4140|tag:lavfi.scene_score=0.875036
+pkt_pts=4140|tag:lavfi.scene_score=0.923403
 pkt_pts=5800|tag:lavfi.scene_score=1.000000
-pkt_pts=6720|tag:lavfi.scene_score=0.461625
+pkt_pts=6720|tag:lavfi.scene_score=0.475643
 pkt_pts=8160|tag:lavfi.scene_score=1.000000
 pkt_pts=9760|tag:lavfi.scene_score=1.000000
-pkt_pts=14080|tag:lavfi.scene_score=0.838916
+pkt_pts=14080|tag:lavfi.scene_score=0.874623
 pkt_pts=15700|tag:lavfi.scene_score=1.000000
-pkt_pts=18500|tag:lavfi.scene_score=0.474948
+pkt_pts=18500|tag:lavfi.scene_score=0.422509
+pkt_pts=20040|tag:lavfi.scene_score=0.352360
 pkt_pts=21760|tag:lavfi.scene_score=1.000000
diff --git a/tests/ref/fate/filter-overlay-dvdsub-2397 b/tests/ref/fate/filter-overlay-dvdsub-2397
index b86a218..483e5fa 100644
--- a/tests/ref/fate/filter-overlay-dvdsub-2397
+++ b/tests/ref/fate/filter-overlay-dvdsub-2397
@@ -490,368 +490,368 @@
 1,       3877,       3877,       10,     2013, 0x95a39f9c
 1,       3887,       3887,       10,     2013, 0x4f7ea123
 1,       3897,       3897,       10,     2013, 0x9efb9ba1
-0,        117,        117,        1,   518400, 0x949e1e8b
+0,        117,        117,        1,   518400, 0xbf8523da
 1,       3907,       3907,       10,     2013, 0xf395b2cd
 1,       3917,       3917,       10,     2013, 0x261a881e
 1,       3927,       3927,       10,     2013, 0x7f2d9f72
 1,       3937,       3937,       10,     2013, 0x0105b38d
-0,        118,        118,        1,   518400, 0xfc6c09aa
+0,        118,        118,        1,   518400, 0x41890ed6
 1,       3952,       3952,       10,     2013, 0x0e5db67e
 1,       3962,       3962,       10,     2013, 0xfc9baf97
-0,        119,        119,        1,   518400, 0x561c2ff5
+0,        119,        119,        1,   518400, 0x588534fc
 1,       3972,       3972,       10,     2013, 0x8e02a1b1
 1,       3982,       3982,       10,     2013, 0x6eecaac8
 1,       3992,       3992,       10,     2013, 0xf5558f0c
 1,       4002,       4002,       10,     2013, 0x512ba99b
-0,        120,        120,        1,   518400, 0xfd62e6bd
+0,        120,        120,        1,   518400, 0x2145ebc1
 1,       4012,       4012,       10,     2013, 0x932b9932
 1,       4022,       4022,       10,     2013, 0xc01ea987
-0,        121,        121,        1,   518400, 0x0427a070
+0,        121,        121,        1,   518400, 0x28bca595
 1,       4038,       4038,       10,     2013, 0x10879cf7
 1,       4048,       4048,       10,     2013, 0x90679338
 1,       4058,       4058,       10,     2013, 0x077d8a9e
 1,       4068,       4068,       10,     2013, 0x969fa57c
-0,        122,        122,        1,   518400, 0x0bf48fff
+0,        122,        122,        1,   518400, 0x77dc951e
 1,       4078,       4078,       10,     2013, 0xe049ab07
 1,       4088,       4088,       10,     2013, 0xf535b3b3
 1,       4098,       4098,       10,     2013, 0xfe76bd37
-0,        123,        123,        1,   518400, 0x354d4700
+0,        123,        123,        1,   518400, 0xe8924c17
 1,       4108,       4108,       10,     2013, 0xde79ad8c
 1,       4123,       4123,       10,     2013, 0xe89b9c47
 1,       4133,       4133,       10,     2013, 0xc570b0f0
-0,        124,        124,        1,   518400, 0x6081c80c
+0,        124,        124,        1,   518400, 0xadb4cccc
 1,       4143,       4143,       10,     2013, 0xee709cd9
 1,       4153,       4153,       10,     2013, 0xcfe5afab
 1,       4163,       4163,       10,     2013, 0x98ff8ce4
-0,        125,        125,        1,   518400, 0x9c6c51c6
+0,        125,        125,        1,   518400, 0x1d7b56ac
 1,       4173,       4173,       10,     2013, 0x9d19b44c
 1,       4183,       4183,       10,     2013, 0x4349917a
 1,       4193,       4193,       10,     2013, 0xbf54a59a
-0,        126,        126,        1,   518400, 0xaacd34d7
+0,        126,        126,        1,   518400, 0xad5739a4
 1,       4208,       4208,       10,     2013, 0xc4a399e0
 1,       4218,       4218,       10,     2013, 0x1bf58ff0
 1,       4228,       4228,       10,     2013, 0x3518ac56
-0,        127,        127,        1,   518400, 0x566bce8e
+0,        127,        127,        1,   518400, 0x2733d35a
 1,       4238,       4238,       10,     2013, 0xcd38c1de
 1,       4248,       4248,       10,     2013, 0xbe7d9c4d
 1,       4258,       4258,       10,     2013, 0xe113a306
 1,       4268,       4268,       10,     2013, 0x083197ea
-0,        128,        128,        1,   518400, 0xb14f68b3
+0,        128,        128,        1,   518400, 0x78e76da2
 1,       4278,       4278,       10,     2013, 0x1929b1eb
 1,       4294,       4294,       10,     2013, 0x5d6ea5af
 1,       4304,       4304,       10,     2013, 0x05519d53
-0,        129,        129,        1,   518400, 0x00545b29
+0,        129,        129,        1,   518400, 0x6c076013
 1,       4314,       4314,       10,     2013, 0x5773b380
 1,       4324,       4324,       10,     2013, 0xaa70a8f5
 1,       4334,       4334,       10,     2013, 0x990db0ec
-0,        130,        130,        1,   518400, 0x984bede5
+0,        130,        130,        1,   518400, 0x7854f2b1
 1,       4344,       4344,       10,     2013, 0x91d3a623
 1,       4354,       4354,       10,     2013, 0xc91f9824
 1,       4364,       4364,       10,     2013, 0x1d058abf
-0,        131,        131,        1,   518400, 0x6b9319c6
+0,        131,        131,        1,   518400, 0xd2ae1ecd
 1,       4379,       4379,       10,     2013, 0x8de1b8d5
 1,       4389,       4389,       10,     2013, 0x7872b06b
 1,       4399,       4399,       10,     2013, 0xa084c203
-0,        132,        132,        1,   518400, 0x1582ae8c
+0,        132,        132,        1,   518400, 0xf5eab38d
 1,       4409,       4409,       10,     2013, 0xff90ae8d
 1,       4419,       4419,       10,     2013, 0x61dead8e
 1,       4429,       4429,       10,     2013, 0xee76b284
-0,        133,        133,        1,   518400, 0xece339b6
+0,        133,        133,        1,   518400, 0x994d3e9c
 1,       4439,       4439,       10,     2013, 0xe888af7f
 1,       4449,       4449,       10,     2013, 0x5d57b115
 1,       4464,       4464,       10,     2013, 0xcdbfb1d0
-0,        134,        134,        1,   518400, 0x74946b8b
+0,        134,        134,        1,   518400, 0x95ab705a
 1,       4474,       4474,       10,     2013, 0x2e28a952
 1,       4484,       4484,       10,     2013, 0x4795a994
 1,       4494,       4494,       10,     2013, 0x7e7ea304
 1,       4504,       4504,       10,     2013, 0x9502c1e1
-0,        135,        135,        1,   518400, 0x5dffc0d6
+0,        135,        135,        1,   518400, 0x3c83c5ce
 1,       4514,       4514,       10,     2013, 0xf7c78ab2
 1,       4524,       4524,       10,     2013, 0x24049816
 1,       4534,       4534,       10,     2013, 0x52089dcf
-0,        136,        136,        1,   518400, 0x3f85c053
+0,        136,        136,        1,   518400, 0xfa22c508
 1,       4550,       4550,       10,     2013, 0x2150a0b1
 1,       4560,       4560,       10,     2013, 0x3c2e9b93
 1,       4570,       4570,       10,     2013, 0x491f932b
-0,        137,        137,        1,   518400, 0x7124125d
+0,        137,        137,        1,   518400, 0xddda1712
 1,       4580,       4580,       10,     2013, 0x31359cf8
 1,       4590,       4590,       10,     2013, 0x1b00ac3f
 1,       4600,       4600,       10,     2013, 0x8d7ab3cb
-0,        138,        138,        1,   518400, 0x46b736d5
+0,        138,        138,        1,   518400, 0x985a3b93
 1,       4610,       4610,       10,     2013, 0xb2c2a4de
 1,       4620,       4620,       10,     2013, 0x80a4abf2
 1,       4635,       4635,       10,     2013, 0x0701a4ee
-0,        139,        139,        1,   518400, 0x7bcac123
+0,        139,        139,        1,   518400, 0xea63c5e7
 1,       4645,       4645,       10,     2013, 0xdc1ba5bc
 1,       4655,       4655,       10,     2013, 0x6083a8a4
 1,       4665,       4665,       10,     2013, 0x6226ad45
-0,        140,        140,        1,   518400, 0x79899382
+0,        140,        140,        1,   518400, 0xef64983d
 1,       4675,       4675,       10,     2013, 0x2732a205
 1,       4685,       4685,       10,     2013, 0x0f62a0d3
 1,       4695,       4695,       10,     2013, 0xc1799249
-0,        141,        141,        1,   518400, 0x4a56acef
+0,        141,        141,        1,   518400, 0x747bb193
 1,       4705,       4705,       10,     2013, 0xbccfa9c8
 1,       4720,       4720,       10,     2013, 0xded096e7
 1,       4730,       4730,       10,     2013, 0x7f0daf43
-0,        142,        142,        1,   518400, 0xb0a983e5
+0,        142,        142,        1,   518400, 0xb8748862
 1,       4740,       4740,       10,     2013, 0xc47ea682
 1,       4750,       4750,       10,     2013, 0x5a72b07a
 1,       4760,       4760,       10,     2013, 0x386faa8c
 1,       4770,       4770,       10,     2013, 0xf9919a91
-0,        143,        143,        1,   518400, 0xb49255cc
+0,        143,        143,        1,   518400, 0xaab55a5f
 1,       4780,       4780,       10,     2013, 0x4908897e
 1,       4790,       4790,       10,     2013, 0x4882b594
-0,        144,        144,        1,   518400, 0x48808663
+0,        144,        144,        1,   518400, 0x7b468add
 1,       4806,       4806,       10,     2013, 0x113e98d1
 1,       4816,       4816,       10,     2013, 0x5098b30d
 1,       4826,       4826,       10,     2013, 0x0ef7b857
 1,       4836,       4836,       10,     2013, 0x216ea176
-0,        145,        145,        1,   518400, 0xf5be828c
+0,        145,        145,        1,   518400, 0xf2078707
 1,       4846,       4846,       10,     2013, 0xf906944a
 1,       4856,       4856,       10,     2013, 0xee9b92fb
 1,       4866,       4866,       10,     2013, 0xd6029209
-0,        146,        146,        1,   518400, 0xb6688ea3
+0,        146,        146,        1,   518400, 0x6a2d931e
 1,       4876,       4876,       10,     2013, 0x2256a12e
 1,       4891,       4891,       10,     2013, 0x89de8e4a
 1,       4901,       4901,       10,     2013, 0x0bf0a584
-0,        147,        147,        1,   518400, 0x9eb2bfd1
+0,        147,        147,        1,   518400, 0xbbe3c417
 1,       4911,       4911,       10,     2013, 0x6a5ebd58
 1,       4921,       4921,       10,     2013, 0x3edd9aa4
 1,       4931,       4931,       10,     2013, 0xbd66ac26
-0,        148,        148,        1,   518400, 0xab3bdfb5
+0,        148,        148,        1,   518400, 0x6294e449
 1,       4941,       4941,       10,     2013, 0x313896ea
 1,       4951,       4951,       10,     2013, 0x6b83a6a0
 1,       4961,       4961,       10,     2013, 0x9aafb109
-0,        149,        149,        1,   518400, 0xe65f1d81
+0,        149,        149,        1,   518400, 0xa05721e7
 1,       4976,       4976,       10,     2013, 0x5192a85a
 1,       4986,       4986,       10,     2013, 0x1f919f79
 1,       4996,       4996,       10,     2013, 0xc0799c40
-0,        150,        150,        1,   518400, 0x61ca8d13
+0,        150,        150,        1,   518400, 0x37749183
 1,       5006,       5006,       10,     2013, 0x2988bcd8
 1,       5016,       5016,       10,     2013, 0x1482913a
 1,       5026,       5026,       10,     2013, 0x74da9a94
 1,       5036,       5036,       10,     2013, 0x763eb709
-0,        151,        151,        1,   518400, 0xbdd0d82f
+0,        151,        151,        1,   518400, 0xf9d9dca0
 1,       5046,       5046,       10,     2013, 0x1285b405
 1,       5062,       5062,       10,     2013, 0xb6ab9dfc
-0,        152,        152,        1,   518400, 0xab1acaad
+0,        152,        152,        1,   518400, 0x5f8ccf08
 1,       5072,       5072,       10,     2013, 0xe4c8bf19
 1,       5082,       5082,       10,     2013, 0xabbbade8
 1,       5092,       5092,       10,     2013, 0xf8b69d89
 1,       5102,       5102,       10,     2013, 0xce04a866
-0,        153,        153,        1,   518400, 0x1889f31c
+0,        153,        153,        1,   518400, 0x7303f77b
 1,       5112,       5112,       10,     2013, 0x07528abf
 1,       5122,       5122,       10,     2013, 0x74fb98bf
 1,       5132,       5132,       10,     2013, 0x579fb1c9
-0,        154,        154,        1,   518400, 0x02484cce
+0,        154,        154,        1,   518400, 0x22b0513f
 1,       5147,       5147,       10,     2013, 0x7ddea2ed
 1,       5157,       5157,       10,     2013, 0x296caa2c
 1,       5167,       5167,       10,     2013, 0x346d9c4f
-0,        155,        155,        1,   518400, 0x59998165
+0,        155,        155,        1,   518400, 0x330485d2
 1,       5177,       5177,       10,     2013, 0x3e1fba15
 1,       5187,       5187,       10,     2013, 0x48a2908f
 1,       5197,       5197,       10,     2013, 0xc1938d09
-0,        156,        156,        1,   518400, 0x0f3dd671
+0,        156,        156,        1,   518400, 0x7f83daea
 1,       5207,       5207,       10,     2013, 0x0e96a060
 1,       5217,       5217,       10,     2013, 0x7b6a9e06
 1,       5232,       5232,       10,     2013, 0x5b779d28
-0,        157,        157,        1,   518400, 0x378bee63
+0,        157,        157,        1,   518400, 0xee19f2df
 1,       5242,       5242,       10,     2013, 0xf600aca1
 1,       5252,       5252,       10,     2013, 0x3a6c9e68
 1,       5262,       5262,       10,     2013, 0x0c8dc1b0
-0,        158,        158,        1,   518400, 0x0d8e17d2
+0,        158,        158,        1,   518400, 0xb71b1c77
 1,       5272,       5272,       10,     2013, 0x26beb245
 1,       5282,       5282,       10,     2013, 0x2bc09557
 1,       5292,       5292,       10,     2013, 0x27fc8845
 1,       5302,       5302,       10,     2013, 0x1025aa47
-0,        159,        159,        1,   518400, 0x61f113bf
+0,        159,        159,        1,   518400, 0xbffc1856
 1,       5318,       5318,       10,     2013, 0xc2e69baa
 1,       5328,       5328,       10,     2013, 0xdb249b92
 1,       5338,       5338,       10,     2013, 0x6ccda29e
-0,        160,        160,        1,   518400, 0x44ec211a
+0,        160,        160,        1,   518400, 0xabc125aa
 1,       5348,       5348,       10,     2013, 0xeaf6a1cf
 1,       5358,       5358,       10,     2013, 0x509ba397
 1,       5368,       5368,       10,     2013, 0xfaf8a2df
-0,        161,        161,        1,   518400, 0xcb036306
+0,        161,        161,        1,   518400, 0x5ee467f8
 1,       5378,       5378,       10,     2013, 0x41388f28
 1,       5388,       5388,       10,     2013, 0xfe5eab39
 1,       5403,       5403,       10,     2013, 0xd5ffa066
-0,        162,        162,        1,   518400, 0x7f1dec7d
+0,        162,        162,        1,   518400, 0x6c2cf168
 1,       5413,       5413,       10,     2013, 0x6813a30a
 1,       5423,       5423,       10,     2013, 0x9be89718
 1,       5433,       5433,       10,     2013, 0xaec3a27b
-0,        163,        163,        1,   518400, 0x8b8c6640
+0,        163,        163,        1,   518400, 0x63996b26
 1,       5446,       5446,       10,     2013, 0x579a983e
 1,       5456,       5456,       10,     2013, 0x98cea21f
 1,       5466,       5466,       10,     2013, 0xca77a58a
-0,        164,        164,        1,   518400, 0xea04737c
+0,        164,        164,        1,   518400, 0xb34d789a
 1,       5476,       5476,       10,     2013, 0xcbc3b1ee
 1,       5486,       5486,       10,     2013, 0xf3bb8f07
 1,       5496,       5496,       10,     2013, 0x6aeebd92
-0,        165,        165,        1,   518400, 0xe779fe0c
+0,        165,        165,        1,   518400, 0xf49c030f
 1,       5506,       5506,       10,     2013, 0xe955a449
 1,       5516,       5516,       10,     2013, 0x9436aa5b
 1,       5531,       5531,       10,     2013, 0x4f0a8f9f
-0,        166,        166,        1,   518400, 0xcd78bf13
+0,        166,        166,        1,   518400, 0x092dc41a
 1,       5541,       5541,       10,     2013, 0x3551b22d
 1,       5551,       5551,       10,     2013, 0x0959a3d4
 1,       5561,       5561,       10,     2013, 0x2ed5a11b
 1,       5571,       5571,       10,     2013, 0x8f52a5c3
-0,        167,        167,        1,   518400, 0x45b0c048
+0,        167,        167,        1,   518400, 0x4134c577
 1,       5581,       5581,       10,     2013, 0x6552978d
 1,       5591,       5591,       10,     2013, 0x7dcca0c1
 1,       5601,       5601,       10,     2013, 0xbcd4a3c9
-0,        168,        168,        1,   518400, 0x9783dcd8
+0,        168,        168,        1,   518400, 0x261de1ed
 1,       5616,       5616,       10,     2013, 0xfe41a8d8
 1,       5626,       5626,       10,     2013, 0xc85aae14
 1,       5636,       5636,       10,     2013, 0x1185b346
-0,        169,        169,        1,   518400, 0xbcd1514c
+0,        169,        169,        1,   518400, 0xcbc8566a
 1,       5646,       5646,       10,     2013, 0xf7429a0d
 1,       5656,       5656,       10,     2013, 0x48c2a160
 1,       5666,       5666,       10,     2013, 0x9d85a85d
-0,        170,        170,        1,   518400, 0xf229575f
+0,        170,        170,        1,   518400, 0x407a5c76
 1,       5676,       5676,       10,     2013, 0xbbe89fe9
 1,       5686,       5686,       10,     2013, 0xea429fe2
 1,       5702,       5702,       10,     2013, 0x221ca1d4
-0,        171,        171,        1,   518400, 0x576e365e
+0,        171,        171,        1,   518400, 0x1ed73bb2
 1,       5712,       5712,       10,     2013, 0x394b925b
 1,       5722,       5722,       10,     2013, 0x556dc26f
 1,       5732,       5732,       10,     2013, 0xce21a5e1
-0,        172,        172,        1,   518400, 0xa2d2d87b
+0,        172,        172,        1,   518400, 0x8467ddb5
 1,       5742,       5742,       10,     2013, 0xbc87c0a8
 1,       5752,       5752,       10,     2013, 0xbac4ac07
 1,       5762,       5762,       10,     2013, 0xdeefa4aa
 1,       5772,       5772,       10,     2013, 0x1f15b362
-0,        173,        173,        1,   518400, 0x3804d74a
+0,        173,        173,        1,   518400, 0x0523dc73
 1,       5787,       5787,       10,     2013, 0x6406b7b2
 1,       5797,       5797,       10,     2013, 0x8030a03d
-0,        174,        174,        1,   518400, 0xf05de372
+0,        174,        174,        1,   518400, 0x81f5e895
 1,       5807,       5807,       10,     2013, 0x0373a5b1
 1,       5817,       5817,       10,     2013, 0x34ef93da
 1,       5827,       5827,       10,     2013, 0x94c198fe
 1,       5837,       5837,       10,     2013, 0xfefcabad
-0,        175,        175,        1,   518400, 0x21035b4f
+0,        175,        175,        1,   518400, 0xfc74608d
 1,       5847,       5847,       10,     2013, 0x8755b3ec
 1,       5857,       5857,       10,     2013, 0xe436a6fd
 1,       5872,       5872,       10,     2013, 0x9cf5a11e
-0,        176,        176,        1,   518400, 0x6e97d583
+0,        176,        176,        1,   518400, 0xc4e0dae0
 1,       5882,       5882,       10,     2013, 0x03b8a98c
 1,       5892,       5892,       10,     2013, 0x6216a138
 1,       5902,       5902,       10,     2013, 0xd87b9f12
-0,        177,        177,        1,   518400, 0x197879a9
+0,        177,        177,        1,   518400, 0x98367f5b
 1,       5912,       5912,       10,     2013, 0x4ce99653
 1,       5922,       5922,       10,     2013, 0x6c2ea9e2
 1,       5932,       5932,       10,     2013, 0x918cae4c
-0,        178,        178,        1,   518400, 0x787780ee
+0,        178,        178,        1,   518400, 0x0f1a869d
 1,       5942,       5942,       10,     2013, 0xd19fa5f2
 1,       5958,       5958,       10,     2013, 0x0bdda7c6
 1,       5968,       5968,       10,     2013, 0x0f9ab0ca
-0,        179,        179,        1,   518400, 0x13fcc74d
+0,        179,        179,        1,   518400, 0x45b6ccf2
 1,       5978,       5978,       10,     2013, 0x410a92b1
 1,       5988,       5988,       10,     2013, 0xcfbe9d1c
 1,       5998,       5998,       10,     2013, 0x59ed9d15
-0,        180,        180,        1,   518400, 0x9bd1c5da
+0,        180,        180,        1,   518400, 0x5f9ccb77
 1,       6008,       6008,       10,     2013, 0x4e129e27
 1,       6018,       6018,       10,     2013, 0x7bb9ac0a
 1,       6028,       6028,       10,     2013, 0x826ca82b
-0,        181,        181,        1,   518400, 0x8e21e4ba
+0,        181,        181,        1,   518400, 0x5f15ea31
 1,       6043,       6043,       10,     2013, 0x9ad5a74b
 1,       6053,       6053,       10,     2013, 0x6c5f969a
 1,       6063,       6063,       10,     2013, 0x8479a0e5
-0,        182,        182,        1,   518400, 0x5fe59996
+0,        182,        182,        1,   518400, 0x86369f27
 1,       6073,       6073,       10,     2013, 0x165298ef
 1,       6083,       6083,       10,     2013, 0xdcadb4a1
 1,       6093,       6093,       10,     2013, 0xa90e987c
 1,       6103,       6103,       10,     2013, 0x1ac5b510
-0,        183,        183,        1,   518400, 0x308af432
+0,        183,        183,        1,   518400, 0x2e27f9fa
 1,       6113,       6113,       10,     2013, 0x66728d85
 1,       6128,       6128,       10,     2013, 0xe4859fc5
 1,       6138,       6138,       10,     2013, 0x9901786e
-0,        184,        184,        1,   518400, 0xc05a9eb1
+0,        184,        184,        1,   518400, 0xc029a44d
 1,       6148,       6148,       10,     2013, 0x6aebb406
 1,       6158,       6158,       10,     2013, 0x7d13a2cc
 1,       6168,       6168,       10,     2013, 0x99b7a8cc
-0,        185,        185,        1,   518400, 0xb9a02e51
+0,        185,        185,        1,   518400, 0xebee33b0
 1,       6178,       6178,       10,     2013, 0x80b8a624
 1,       6188,       6188,       10,     2013, 0xbb6aa271
 1,       6198,       6198,       10,     2013, 0x17af9e4a
-0,        186,        186,        1,   518400, 0xbd9543aa
+0,        186,        186,        1,   518400, 0x19e5494f
 1,       6214,       6214,       10,     2013, 0xfaf0a8f1
 1,       6224,       6224,       10,     2013, 0xd6849b93
 1,       6234,       6234,       10,     2013, 0xe9829669
-0,        187,        187,        1,   518400, 0x0a0cb795
+0,        187,        187,        1,   518400, 0xf697bd7c
 1,       6244,       6244,       10,     2013, 0x7ec98944
 1,       6254,       6254,       10,     2013, 0x2b2099a4
 1,       6264,       6264,       10,     2013, 0x1033a82f
-0,        188,        188,        1,   518400, 0xe4bb8a0c
+0,        188,        188,        1,   518400, 0x82569002
 1,       6274,       6274,       10,     2013, 0x5ec88990
 1,       6284,       6284,       10,     2013, 0xd2a19b3d
 1,       6299,       6299,       10,     2013, 0xa377b268
-0,        189,        189,        1,   518400, 0x226fd11e
+0,        189,        189,        1,   518400, 0xfcb6d707
 1,       6309,       6309,       10,     2013, 0xfa859901
 1,       6319,       6319,       10,     2013, 0x1713955a
 1,       6329,       6329,       10,     2013, 0x70aab0da
 1,       6339,       6339,       10,     2013, 0xcdaea422
-0,        190,        190,        1,   518400, 0x76e1604d
+0,        190,        190,        1,   518400, 0x82a9662b
 1,       6349,       6349,       10,     2013, 0x65c3bf80
 1,       6359,       6359,       10,     2013, 0x1d75a55f
 1,       6369,       6369,       10,     2013, 0xa5bea4de
-0,        191,        191,        1,   518400, 0xca06117c
+0,        191,        191,        1,   518400, 0x212e16ee
 1,       6384,       6384,       10,     2013, 0x184db71c
 1,       6394,       6394,       10,     2013, 0x99858ec8
 1,       6404,       6404,       10,     2013, 0xb8f2aee5
-0,        192,        192,        1,   518400, 0xeca14952
+0,        192,        192,        1,   518400, 0x2ca34dca
 1,       6414,       6414,       10,     2013, 0x4435b2ef
 1,       6424,       6424,       10,     2013, 0x8acfa6c7
 1,       6434,       6434,       10,     2013, 0x42b4c01f
-0,        193,        193,        1,   518400, 0x3106dbee
+0,        193,        193,        1,   518400, 0xe9ebe0a5
 1,       6444,       6444,       10,     2013, 0x6e308c13
 1,       6454,       6454,       10,     2013, 0x8227a0f6
 1,       6470,       6470,       10,     2013, 0x6f12a7a2
-0,        194,        194,        1,   518400, 0x57fa6392
+0,        194,        194,        1,   518400, 0x4e6b6917
 1,       6480,       6480,       10,     2013, 0x785392be
 1,       6490,       6490,       10,     2013, 0x81849c2b
 1,       6500,       6500,       10,     2013, 0x5cf2af65
-0,        195,        195,        1,   518400, 0x47651ac8
+0,        195,        195,        1,   518400, 0x7dcf20ab
 1,       6510,       6510,       10,     2013, 0x0c6ca6b4
 1,       6520,       6520,       10,     2013, 0x412fab9f
 1,       6530,       6530,       10,     2013, 0x08e792b4
-0,        196,        196,        1,   518400, 0x3c1ba6a5
+0,        196,        196,        1,   518400, 0xf30fac97
 1,       6540,       6540,       10,     2013, 0x407aace3
 1,       6555,       6555,       10,     2013, 0xd26bac16
 1,       6565,       6565,       10,     2013, 0xac8bb295
-0,        197,        197,        1,   518400, 0xbc3ec05b
+0,        197,        197,        1,   518400, 0xcb9fc692
 1,       6575,       6575,       10,     2013, 0xddd1949c
 1,       6585,       6585,       10,     2013, 0x6b26b868
 1,       6595,       6595,       10,     2013, 0x5eaba587
 1,       6605,       6605,       10,     2013, 0xef0793b9
-0,        198,        198,        1,   518400, 0xd6ae59da
+0,        198,        198,        1,   518400, 0x5d05601e
 1,       6615,       6615,       10,     2013, 0xdef19bd6
 1,       6625,       6625,       10,     2013, 0xca98a635
-0,        199,        199,        1,   518400, 0xc62f0e63
+0,        199,        199,        1,   518400, 0x456c1417
 1,       6640,       6640,       10,     2013, 0x06269a5a
 1,       6650,       6650,       10,     2013, 0x32cb9952
 1,       6660,       6660,       10,     2013, 0xf01fa95a
 1,       6670,       6670,       10,     2013, 0xefab9e55
-0,        200,        200,        1,   518400, 0xae96cc02
+0,        200,        200,        1,   518400, 0x9a0fd1ad
 1,       6680,       6680,       10,     2013, 0x55a3b63a
 1,       6690,       6690,       10,     2013, 0xcd36a553
 1,       6700,       6700,       10,     2013, 0x2ec19877
-0,        201,        201,        1,   518400, 0x2aa0917b
+0,        201,        201,        1,   518400, 0x55db9716
 1,       6710,       6710,       10,     2013, 0xc18b924c
 1,       6726,       6726,       10,     2013, 0xf132b04c
 1,       6736,       6736,       10,     2013, 0x7975a44d
-0,        202,        202,        1,   518400, 0xf0d13b48
+0,        202,        202,        1,   518400, 0x1f0d40d6
 1,       6746,       6746,       10,     2013, 0x2aaf94cb
 1,       6756,       6756,       10,     2013, 0x58cfa60f
 1,       6766,       6766,       10,     2013, 0x9757a658
-0,        203,        203,        1,   518400, 0x067f56f8
+0,        203,        203,        1,   518400, 0x73695c82
 1,       6776,       6776,       10,     2013, 0x67ebc0d5
 1,       6786,       6786,       10,     2013, 0x3c50a70e
 1,       6796,       6796,       10,     2013, 0x9c5799c6
-0,        204,        204,        1,   518400, 0x1026025c
+0,        204,        204,        1,   518400, 0xb0f10812
 1,       6811,       6811,       10,     2013, 0x018d85b2
 1,       6821,       6821,       10,     2013, 0x5367a956
-0,        205,        205,        1,   518400, 0x11ee7f7f
-0,        208,        208,        1,   518400, 0x30a6b398
+0,        205,        205,        1,   518400, 0xdec18505
+0,        208,        208,        1,   518400, 0xb147b947
 0,        240,        240,        1,   518400, 0x9d2e3977
diff --git a/tests/ref/fate/filter-overlay_gbrap_gbrap b/tests/ref/fate/filter-overlay_gbrap_gbrap
index 49e14c6..5048a34 100644
--- a/tests/ref/fate/filter-overlay_gbrap_gbrap
+++ b/tests/ref/fate/filter-overlay_gbrap_gbrap
@@ -3,4 +3,4 @@
 #codec_id 0: rawvideo
 #dimensions 0: 128x128
 #sar 0: 1/1
-0,          0,          0,        1,    65536, 0xbac99946
+0,          0,          0,        1,    65536, 0x821bcb9b
diff --git a/tests/ref/fate/filter-overlay_gbrp_gbrap b/tests/ref/fate/filter-overlay_gbrp_gbrap
index 204c9d0..99524c3 100644
--- a/tests/ref/fate/filter-overlay_gbrp_gbrap
+++ b/tests/ref/fate/filter-overlay_gbrp_gbrap
@@ -3,4 +3,4 @@
 #codec_id 0: rawvideo
 #dimensions 0: 128x128
 #sar 0: 1/1
-0,          0,          0,        1,    49152, 0xa905d586
+0,          0,          0,        1,    49152, 0x738d07ea
diff --git a/tests/ref/fate/filter-overlay_yuv420_yuva420 b/tests/ref/fate/filter-overlay_yuv420_yuva420
index ee0c82e..dffd135 100644
--- a/tests/ref/fate/filter-overlay_yuv420_yuva420
+++ b/tests/ref/fate/filter-overlay_yuv420_yuva420
@@ -3,4 +3,4 @@
 #codec_id 0: rawvideo
 #dimensions 0: 128x128
 #sar 0: 1/1
-0,          0,          0,        1,    24576, 0x1505f000
+0,          0,          0,        1,    24576, 0xf104fedd
diff --git a/tests/ref/fate/filter-overlay_yuv422_yuva422 b/tests/ref/fate/filter-overlay_yuv422_yuva422
index 7d21e1b..de0a9d1 100644
--- a/tests/ref/fate/filter-overlay_yuv422_yuva422
+++ b/tests/ref/fate/filter-overlay_yuv422_yuva422
@@ -3,4 +3,4 @@
 #codec_id 0: rawvideo
 #dimensions 0: 128x128
 #sar 0: 1/1
-0,          0,          0,        1,    32768, 0x2d88b114
+0,          0,          0,        1,    32768, 0x180ac096
diff --git a/tests/ref/fate/filter-overlay_yuv444_yuva444 b/tests/ref/fate/filter-overlay_yuv444_yuva444
index e1e5db2..bc57fb5 100644
--- a/tests/ref/fate/filter-overlay_yuv444_yuva444
+++ b/tests/ref/fate/filter-overlay_yuv444_yuva444
@@ -3,4 +3,4 @@
 #codec_id 0: rawvideo
 #dimensions 0: 128x128
 #sar 0: 1/1
-0,          0,          0,        1,    49152, 0x92da3b63
+0,          0,          0,        1,    49152, 0x42ec4c43
diff --git a/tests/ref/fate/filter-overlay_yuva420_yuva420 b/tests/ref/fate/filter-overlay_yuva420_yuva420
index a17cc5c..fac08a1 100644
--- a/tests/ref/fate/filter-overlay_yuva420_yuva420
+++ b/tests/ref/fate/filter-overlay_yuva420_yuva420
@@ -3,4 +3,4 @@
 #codec_id 0: rawvideo
 #dimensions 0: 128x128
 #sar 0: 1/1
-0,          0,          0,        1,    40960, 0x0a1ab3c0
+0,          0,          0,        1,    40960, 0x5de1c29d
diff --git a/tests/ref/fate/filter-overlay_yuva422_yuva422 b/tests/ref/fate/filter-overlay_yuva422_yuva422
index e4d2e39..2e65399 100644
--- a/tests/ref/fate/filter-overlay_yuva422_yuva422
+++ b/tests/ref/fate/filter-overlay_yuva422_yuva422
@@ -3,4 +3,4 @@
 #codec_id 0: rawvideo
 #dimensions 0: 128x128
 #sar 0: 1/1
-0,          0,          0,        1,    49152, 0x369974d4
+0,          0,          0,        1,    49152, 0xdb3b8456
diff --git a/tests/ref/fate/filter-overlay_yuva444_yuva444 b/tests/ref/fate/filter-overlay_yuva444_yuva444
index f2d9c56..794338a 100644
--- a/tests/ref/fate/filter-overlay_yuva444_yuva444
+++ b/tests/ref/fate/filter-overlay_yuva444_yuva444
@@ -3,4 +3,4 @@
 #codec_id 0: rawvideo
 #dimensions 0: 128x128
 #sar 0: 1/1
-0,          0,          0,        1,    65536, 0xa279ff14
+0,          0,          0,        1,    65536, 0x91d31003
diff --git a/tests/ref/fate/filter-palettegen-2 b/tests/ref/fate/filter-palettegen-2
index aa07b6c..9abec0f 100644
--- a/tests/ref/fate/filter-palettegen-2
+++ b/tests/ref/fate/filter-palettegen-2
@@ -3,4 +3,4 @@
 #codec_id 0: rawvideo
 #dimensions 0: 16x16
 #sar 0: 1/1
-0,          0,          0,        1,     1024, 0x906ff5aa
+0,          0,          0,        1,     1024, 0x23e072c8
diff --git a/tests/ref/fate/filter-pixdesc-grayf32be b/tests/ref/fate/filter-pixdesc-grayf32be
index 423bbfb..1714754 100644
--- a/tests/ref/fate/filter-pixdesc-grayf32be
+++ b/tests/ref/fate/filter-pixdesc-grayf32be
@@ -1 +1 @@
-pixdesc-grayf32be   381c8d0f19d286809b91cd6e6c0048ab
+pixdesc-grayf32be   9b23c74e8e8ffae5d7c7e82bbf5929da
diff --git a/tests/ref/fate/filter-pixdesc-grayf32le b/tests/ref/fate/filter-pixdesc-grayf32le
index a76e0a9..d598d12 100644
--- a/tests/ref/fate/filter-pixdesc-grayf32le
+++ b/tests/ref/fate/filter-pixdesc-grayf32le
@@ -1 +1 @@
-pixdesc-grayf32le   381c8d0f19d286809b91cd6e6c0048ab
+pixdesc-grayf32le   291f074a24c44799a1f437d1c55556f1
diff --git a/tests/ref/fate/filter-pixdesc-nv24 b/tests/ref/fate/filter-pixdesc-nv24
new file mode 100644
index 0000000..ce07331
--- /dev/null
+++ b/tests/ref/fate/filter-pixdesc-nv24
@@ -0,0 +1 @@
+pixdesc-nv24        7437f36b6ee58050564b20a1f839ff07
diff --git a/tests/ref/fate/filter-pixdesc-nv42 b/tests/ref/fate/filter-pixdesc-nv42
new file mode 100644
index 0000000..88ef431
--- /dev/null
+++ b/tests/ref/fate/filter-pixdesc-nv42
@@ -0,0 +1 @@
+pixdesc-nv42        110bad2f58424ab800ad832f6966cafe
diff --git a/tests/ref/fate/filter-pixdesc-ya16be b/tests/ref/fate/filter-pixdesc-ya16be
new file mode 100644
index 0000000..124d3ab
--- /dev/null
+++ b/tests/ref/fate/filter-pixdesc-ya16be
@@ -0,0 +1 @@
+pixdesc-ya16be      86059502198a6d6febb5558e984a30fb
diff --git a/tests/ref/fate/filter-pixdesc-ya16le b/tests/ref/fate/filter-pixdesc-ya16le
new file mode 100644
index 0000000..f0144be
--- /dev/null
+++ b/tests/ref/fate/filter-pixdesc-ya16le
@@ -0,0 +1 @@
+pixdesc-ya16le      f19f6f76d395a18b88accc83d333cc50
diff --git a/tests/ref/fate/filter-pixdesc-yuva422p12be b/tests/ref/fate/filter-pixdesc-yuva422p12be
new file mode 100644
index 0000000..16df4e4
--- /dev/null
+++ b/tests/ref/fate/filter-pixdesc-yuva422p12be
@@ -0,0 +1 @@
+pixdesc-yuva422p12be0420bebaa8a56fea28a06fd565f8e6b3
diff --git a/tests/ref/fate/filter-pixdesc-yuva422p12le b/tests/ref/fate/filter-pixdesc-yuva422p12le
new file mode 100644
index 0000000..b7452cc
--- /dev/null
+++ b/tests/ref/fate/filter-pixdesc-yuva422p12le
@@ -0,0 +1 @@
+pixdesc-yuva422p12le5dff3afb6301abbc0e2a85761b8c5c64
diff --git a/tests/ref/fate/filter-pixdesc-yuva444p12be b/tests/ref/fate/filter-pixdesc-yuva444p12be
new file mode 100644
index 0000000..cfe454f
--- /dev/null
+++ b/tests/ref/fate/filter-pixdesc-yuva444p12be
@@ -0,0 +1 @@
+pixdesc-yuva444p12be952d5e6b4a3494c5228527237fdfc413
diff --git a/tests/ref/fate/filter-pixdesc-yuva444p12le b/tests/ref/fate/filter-pixdesc-yuva444p12le
new file mode 100644
index 0000000..95aa2a9
--- /dev/null
+++ b/tests/ref/fate/filter-pixdesc-yuva444p12le
@@ -0,0 +1 @@
+pixdesc-yuva444p12le235218d42dbbe40fbc044755825c6a95
diff --git a/tests/ref/fate/filter-pixfmts-copy b/tests/ref/fate/filter-pixfmts-copy
index 5385036..d19314b 100644
--- a/tests/ref/fate/filter-pixfmts-copy
+++ b/tests/ref/fate/filter-pixfmts-copy
@@ -53,6 +53,8 @@
 monow               54d16d2c01abfd72ecdb5e51e283937c
 nv12                8e24feb2c544dc26a20047a71e4c27aa
 nv21                335d85c9af6110f26ae9e187a82ed2cf
+nv24                f30fc8d0ac40af69e119ea919a314572
+nv42                29a212f70f8780fe0eb99abcae81894d
 p010be              7f9842d6015026136bad60d03c035cc3
 p010le              c453421b9f726bdaf2bacf59a492c43b
 p016be              7f9842d6015026136bad60d03c035cc3
@@ -76,6 +78,8 @@
 uyvy422             3bcf3c80047592f2211fae3260b1b65d
 xyz12be             a1ef56bf746d71f59669c28e48fc8450
 xyz12le             831ff03c1ba4ef19374686f16a064d8c
+ya16be              37c07787e544f900c87b853253bfc8dd
+ya16le              e8cab8fad88cba6d285b224d8bf0d4df
 ya8                 dbb99fbcdc204aaa1a7397ff561f1a67
 yuv410p             5d4d992a7728431aa4e0700f87fb7fd8
 yuv411p             7e1300e89f5bc07939e2c4a6acbdf267
@@ -127,6 +131,8 @@
 yuva422p            8f6bb778647e5dee62f544d646321171
 yuva422p10be        2f7204c93a1e5bfb04538852f99e4074
 yuva422p10le        c8082548aca999edde77ef2749b1ff4c
+yuva422p12be        19f8205cca3d19bfd4ad9cd2bfb07a0e
+yuva422p12le        38e6c7d87332852d660df5594529fa6e
 yuva422p16be        427ad55f7464121bb3ce164641772bc6
 yuva422p16le        af6f8df651275de58129e010bb45ffcd
 yuva422p9be         47579cc2cea861ca1461589b80c4720f
@@ -134,6 +140,8 @@
 yuva444p            459fad5abfd16db9bb6a52761dc74cc1
 yuva444p10be        fa16bae4fc25429deb944ffa9f5b28a0
 yuva444p10le        92f820d3481b7ebcb48b98a73e7b4c90
+yuva444p12be        d8193387128a1b1efc51f36a12c85385
+yuva444p12le        9c17bf72b083f93040d1e19516b54de7
 yuva444p16be        c80c1899789a6411d0025730efc8f01c
 yuva444p16le        2ed56ea50fafda4d226c9b133755dad8
 yuva444p9be         4903fde22b15d28da90761ac1cfcb1c5
diff --git a/tests/ref/fate/filter-pixfmts-crop b/tests/ref/fate/filter-pixfmts-crop
index ae48c2b..ab89d06 100644
--- a/tests/ref/fate/filter-pixfmts-crop
+++ b/tests/ref/fate/filter-pixfmts-crop
@@ -51,6 +51,8 @@
 grayf32le           b672526c9da9c8959ab881f242f6890a
 nv12                92cda427f794374731ec0321ee00caac
 nv21                1bcfc197f4fb95de85ba58182d8d2f69
+nv24                514c8f12082f0737e558778cbe7de258
+nv42                ece9baae1c5de579dac2c66a89e08ef3
 p010be              8b2de2eb6b099bbf355bfc55a0694ddc
 p010le              373b50c766dfd0a8e79c9a73246d803a
 p016be              8b2de2eb6b099bbf355bfc55a0694ddc
@@ -73,6 +75,8 @@
 rgba64le            fea8ebfc869b52adf353778f29eac7a7
 xyz12be             cb4571f9aaa7b59f999ef327276104b7
 xyz12le             cd6aae8d26b18bdb4b9d068586276d91
+ya16be              a3d18014454942a96f15a49947c0c55d
+ya16le              3d90169aeab9e9637945cf00ab3e95ae
 ya8                 51a8dd297e35d40b06d3ebe8f4717895
 yuv410p             3bb6c7b64f2c46bc5e8b77198ce4ea58
 yuv411p             693e4afe96998e6dd91734037d75d887
@@ -124,6 +128,8 @@
 yuva422p            ad564e513a8c08ff0ec99324e204dfbd
 yuva422p10be        61c806e5e02ea4c90ad3156c90957a18
 yuva422p10le        41507ce136674ad458e562d44c67ddca
+yuva422p12be        e686b37d6738aae3c1d25bd36f3e518c
+yuva422p12le        95bb91f2922bdd2eb9aa6fabe86d4994
 yuva422p16be        3437cce47184e4b9a7a681831816e1ea
 yuva422p16le        0d534fcd61fc54fa9d4bbae5bde537ec
 yuva422p9be         588f72cd85285ed71a519525a947dedc
@@ -131,6 +137,8 @@
 yuva444p            64bd3debe7c2b8cca91bc1d6e2a8d80e
 yuva444p10be        1291045203be7d60b9015fa7e34b5716
 yuva444p10le        75865370fb0c018fb8663958bafcdc51
+yuva444p12be        ff58aed06f42e1258ae04509bccaad0a
+yuva444p12le        00ab9d34f0fd4ba23b48e8ae4bf93c17
 yuva444p16be        f817caf234aaf5848b2bc9679582ed56
 yuva444p16le        b32ad623fc423f897ff31c4073ea2a6f
 yuva444p9be         48498d994c3c9070f31773e39da306dd
diff --git a/tests/ref/fate/filter-pixfmts-field b/tests/ref/fate/filter-pixfmts-field
index 857ded1..994026d 100644
--- a/tests/ref/fate/filter-pixfmts-field
+++ b/tests/ref/fate/filter-pixfmts-field
@@ -53,6 +53,8 @@
 monow               03d783611d265cae78293f88ea126ea1
 nv12                16f7a46708ef25ebd0b72e47920cc11e
 nv21                7294574037cc7f9373ef5695d8ebe809
+nv24                3b100fb527b64ee2b2d7120da573faf5
+nv42                1841ce853152d86b27c130f319ea0db2
 p010be              a0311a09bba7383553267d2b3b9c075e
 p010le              ee09a18aefa3ebe97715b3a7312cb8ff
 p016be              a0311a09bba7383553267d2b3b9c075e
@@ -76,6 +78,8 @@
 uyvy422             1c49e44ab3f060e85fc4a3a9464f045e
 xyz12be             d2fa69ec91d3ed862f2dac3f8e7a3437
 xyz12le             02bccd5e0b6824779a1f848b0ea3e3b5
+ya16be              40403b5277364777e0671da4d38e01ac
+ya16le              54f3295f5326a13d456ac53e973ba398
 ya8                 28cea4f98ed452bd3da9c752e5e3399c
 yuv410p             a85920d6bd26f51306e2ecbe71d1c554
 yuv411p             9106e283d5dbcfba01c611886d58871a
@@ -127,6 +131,8 @@
 yuva422p            801bfb0d4c9e7a524d97bfa11f7995fd
 yuva422p10be        a0d743770698deea2be35ceb2bb0eaad
 yuva422p10le        6a0861e5c887f3213dc34d8674611950
+yuva422p12be        87dc9f7efc97d5e1bbea7564eca62a2a
+yuva422p12le        137f75ade26b6d631d3998127e411a00
 yuva422p16be        c870b697714221ef9168b6984294e501
 yuva422p16le        fef7d5f29dfec9ee36216b7a610b4b39
 yuva422p9be         83ff1ae035bb587dc59acf4121602dac
@@ -134,6 +140,8 @@
 yuva444p            cfbd995b538c34dee9c107ecf875b283
 yuva444p10be        de8b80b4c3a12624412530f09de6dd39
 yuva444p10le        04c93877f724a29b47bc8c0a10a3036b
+yuva444p12be        a9efd9944314bb7fc9ba359bc3446446
+yuva444p12le        acc831041bbf13e75636c0426f82aa19
 yuva444p16be        b10fd7c1b61ac22bdb285f0d91a390f1
 yuva444p16le        cac82ffc36b7052747407663fc5ed510
 yuva444p9be         a6f66d08b3370fdd90987a6143b7b91c
diff --git a/tests/ref/fate/filter-pixfmts-fieldorder b/tests/ref/fate/filter-pixfmts-fieldorder
index fc00345..3d3eef3 100644
--- a/tests/ref/fate/filter-pixfmts-fieldorder
+++ b/tests/ref/fate/filter-pixfmts-fieldorder
@@ -49,6 +49,8 @@
 gray9le             fba944fde7923d5089f4f52d12988b9e
 grayf32be           1aa7960131f880c54fe3c77f13448674
 grayf32le           4029ac9d197f255794c1b9e416520fc7
+nv24                4fdbef26042c77f012df114e666efdb2
+nv42                59608290fece913e6b7d61edf581a529
 rgb0                2e3d8c91c7a83d451593dfd06607ff39
 rgb24               b82577f8215d3dc2681be60f1da247af
 rgb444be            1c3afc3a0c53c51139c76504f59bb1f4
@@ -67,6 +69,8 @@
 uyvy422             75de70e31c435dde878002d3f22b238a
 xyz12be             15f5cda71de5fef9cec5e75e3833b6bc
 xyz12le             7be6c8781f38c21a6b8f602f62ca31e6
+ya16be              0f13e0f52586d172aaa07710fa3e8f31
+ya16le              d481d93ea1a1a04d759d9994958983de
 ya8                 055ac5ab5ff8533dd319edc17a398af1
 yuv411p             e4a040e0e786c4dae07d9d3f90a54905
 yuv422p             16ce67249c6ce7ef57a433646ad6dfc1
@@ -94,6 +98,8 @@
 yuva422p            c470da57cde22b452deb8874df710dce
 yuva422p10be        a2ffa080ae661c1033aa38be28002922
 yuva422p10le        a4f5e8006f8ea3f964206605045e0fe0
+yuva422p12be        ec44f9fc083d5f39051f2a65daea6890
+yuva422p12le        5fd785e19f68538ba76e6e505447239c
 yuva422p16be        929ec5d4bcfac13ba8a02f12e3f5fc7f
 yuva422p16le        7155a6036e25719f2e4d2d47212f077d
 yuva422p9be         b1af62d553d790e041e80cf89608efe3
@@ -101,6 +107,8 @@
 yuva444p            9ac54882677f1fc5553a97ea558e942d
 yuva444p10be        3326267d176a8dfed2c7511b926962e6
 yuva444p10le        bfe957d1b5fea3585b3942cbfdd529ad
+yuva444p12be        ecaa57b7f0b04c3e8779a5f5dcd23032
+yuva444p12le        6b645eeaff8363d82ff686b3b020cae3
 yuva444p16be        2f80d411847856e1364659dee8b23485
 yuva444p16le        5796be8d66371b60037fc8053c27e900
 yuva444p9be         a83599c0e9fca08f6b7c6e02c2413fcf
diff --git a/tests/ref/fate/filter-pixfmts-hflip b/tests/ref/fate/filter-pixfmts-hflip
index e97c185..8712074 100644
--- a/tests/ref/fate/filter-pixfmts-hflip
+++ b/tests/ref/fate/filter-pixfmts-hflip
@@ -51,6 +51,8 @@
 grayf32le           4563e176a35dc8a8a07e0829fad5eb88
 nv12                801e58f1be5fd0b5bc4bf007c604b0b4
 nv21                9f10dfff8963dc327d3395af21f0554f
+nv24                f0c5b2f42970f8d4003621d8857a872f
+nv42                4dcf9aec82b110712b396a8b365dcb13
 p010be              744b13e44d39e1ff7588983fa03e0101
 p010le              a50b160346ab94f55a425065b57006f0
 p016be              744b13e44d39e1ff7588983fa03e0101
@@ -73,6 +75,8 @@
 rgba64le            0c810d8b3a6bca10321788e1cb145340
 xyz12be             25f90259ff8a226befdaec3dfe82996e
 xyz12le             926c0791d59aaff61b2778e8ada3316d
+ya16be              d5b342355bdd9e3197e01b13b7c6301e
+ya16le              d58f154cbbbff85af9917cdb34e819a4
 ya8                 4ad5920716de3d2fbbc49f95adb60345
 yuv410p             c49fd0c55c41185b1580aac77211992b
 yuv411p             c416371077dce13d31bf1dc706111ae7
@@ -124,6 +128,8 @@
 yuva422p            902dc911ee175d9b1f2addcc03aab9a3
 yuva422p10be        fb927978446e975f7424600495a7acde
 yuva422p10le        1d0b5a5946b824810b1b83a7ce429274
+yuva422p12be        5407e82d1c4356472ad549e5ae38ea1e
+yuva422p12le        5dc0e1910b248e12989ae937ddeec342
 yuva422p16be        88977e5ddcee9377525c3f251fdeb25e
 yuva422p16le        d6a50a91be5fc720ca97fc2f6fbd3bb2
 yuva422p9be         996d8d73648c602c73c51e2d95b6cf9b
@@ -131,6 +137,8 @@
 yuva444p            53247be24822d158c0866cd58d2ceeba
 yuva444p10be        9f3c25c3b9d26787d0bf8da2b15c75c6
 yuva444p10le        1721b843b721629da7a0cd76ac665708
+yuva444p12be        9feb6e1d8bfe9b7fd5e352465f278704
+yuva444p12le        12a949ebcf0f94e4a2f9915ef778680a
 yuva444p16be        635fb2720470e0042a7c9b70bf908a2c
 yuva444p16le        6d5bd13f8bb804bd1158c1af732a24e1
 yuva444p9be         3d3e7491192aa4e396015bf8e3755a24
diff --git a/tests/ref/fate/filter-pixfmts-il b/tests/ref/fate/filter-pixfmts-il
index a006fc1..7f1c339 100644
--- a/tests/ref/fate/filter-pixfmts-il
+++ b/tests/ref/fate/filter-pixfmts-il
@@ -53,6 +53,8 @@
 monow               6e9cfb8d3a344c5f0c3e1d5e1297e580
 nv12                3c3ba9b1b4c4dfff09c26f71b51dd146
 nv21                ab586d8781246b5a32d8760a61db9797
+nv24                554153c71d142e3fd8e40b7dcaaec229
+nv42                d699724c8deaeb4f87faf2766512eec3
 p010be              3df51286ef66b53e3e283dbbab582263
 p010le              eadcd8241e97e35b2b47d5eb2eaea6cd
 p016be              3df51286ef66b53e3e283dbbab582263
@@ -75,6 +77,8 @@
 uyvy422             d6ee3ca43356d08c392382b24b22cda5
 xyz12be             7c7d54c55f136cbbc50b18029f3be0b3
 xyz12le             090ba6b1170baf2b1358b43b971d33b0
+ya16be              7bc720918bc0132e9717acbde89874e0
+ya16le              61203295a8d39601b841de90f2c9797b
 ya8                 a38d6e288f582f1a04310232ed764afc
 yuv410p             dea1ab8843465adf5b8240b2d98fd85b
 yuv411p             8bf73777a5ff43c126be274245aceff1
@@ -126,6 +130,8 @@
 yuva422p            6c347a539965cd63cddfeec598858c11
 yuva422p10be        d34bf5f06ac5c67e12409aa111b4e21b
 yuva422p10le        ecb3cc8d77cee05e54d4de60831be159
+yuva422p12be        de287adba746037e68ff81cf7dc59e57
+yuva422p12le        761e18a8a73b55113e57ec39de33a4e6
 yuva422p16be        47a8d3c98492d31bce0ed0d6f74f5131
 yuva422p16le        a950acae1f7ffc47a0951a40e3309b09
 yuva422p9be         0217ba7015245e017ceb0a3eeb39fa56
@@ -133,6 +139,8 @@
 yuva444p            c8153b52159fb0f392459b8be406c294
 yuva444p10be        b0456e5ecdd87c983573e1016db85178
 yuva444p10le        f9b10500666ba220ce42b478a6785dae
+yuva444p12be        eb83a157ff3d750d3ee71c9c598c01b9
+yuva444p12le        6cc82bf7cc18194db81397debfc01951
 yuva444p16be        97f8cb6ed835c7c5cd2fb112b1e135c7
 yuva444p16le        47170401a8c348d3f05f6530607d066b
 yuva444p9be         d5c0170b41221a9607e6ae586880a383
diff --git a/tests/ref/fate/filter-pixfmts-null b/tests/ref/fate/filter-pixfmts-null
index 5385036..d19314b 100644
--- a/tests/ref/fate/filter-pixfmts-null
+++ b/tests/ref/fate/filter-pixfmts-null
@@ -53,6 +53,8 @@
 monow               54d16d2c01abfd72ecdb5e51e283937c
 nv12                8e24feb2c544dc26a20047a71e4c27aa
 nv21                335d85c9af6110f26ae9e187a82ed2cf
+nv24                f30fc8d0ac40af69e119ea919a314572
+nv42                29a212f70f8780fe0eb99abcae81894d
 p010be              7f9842d6015026136bad60d03c035cc3
 p010le              c453421b9f726bdaf2bacf59a492c43b
 p016be              7f9842d6015026136bad60d03c035cc3
@@ -76,6 +78,8 @@
 uyvy422             3bcf3c80047592f2211fae3260b1b65d
 xyz12be             a1ef56bf746d71f59669c28e48fc8450
 xyz12le             831ff03c1ba4ef19374686f16a064d8c
+ya16be              37c07787e544f900c87b853253bfc8dd
+ya16le              e8cab8fad88cba6d285b224d8bf0d4df
 ya8                 dbb99fbcdc204aaa1a7397ff561f1a67
 yuv410p             5d4d992a7728431aa4e0700f87fb7fd8
 yuv411p             7e1300e89f5bc07939e2c4a6acbdf267
@@ -127,6 +131,8 @@
 yuva422p            8f6bb778647e5dee62f544d646321171
 yuva422p10be        2f7204c93a1e5bfb04538852f99e4074
 yuva422p10le        c8082548aca999edde77ef2749b1ff4c
+yuva422p12be        19f8205cca3d19bfd4ad9cd2bfb07a0e
+yuva422p12le        38e6c7d87332852d660df5594529fa6e
 yuva422p16be        427ad55f7464121bb3ce164641772bc6
 yuva422p16le        af6f8df651275de58129e010bb45ffcd
 yuva422p9be         47579cc2cea861ca1461589b80c4720f
@@ -134,6 +140,8 @@
 yuva444p            459fad5abfd16db9bb6a52761dc74cc1
 yuva444p10be        fa16bae4fc25429deb944ffa9f5b28a0
 yuva444p10le        92f820d3481b7ebcb48b98a73e7b4c90
+yuva444p12be        d8193387128a1b1efc51f36a12c85385
+yuva444p12le        9c17bf72b083f93040d1e19516b54de7
 yuva444p16be        c80c1899789a6411d0025730efc8f01c
 yuva444p16le        2ed56ea50fafda4d226c9b133755dad8
 yuva444p9be         4903fde22b15d28da90761ac1cfcb1c5
diff --git a/tests/ref/fate/filter-pixfmts-pad b/tests/ref/fate/filter-pixfmts-pad
index 71f5ddf..56482cf 100644
--- a/tests/ref/fate/filter-pixfmts-pad
+++ b/tests/ref/fate/filter-pixfmts-pad
@@ -23,10 +23,13 @@
 gray9le             f8f3dfe31ca5fcba828285bceefdab9a
 nv12                381574979cb04be10c9168540310afad
 nv21                0fdeb2cdd56cf5a7147dc273456fa217
+nv24                193b9eadcc06ad5081609f76249b3e47
+nv42                1738ad3c31c6c16e17679f5b09ce4677
 rgb0                78d500c8361ab6423a4826a00268c908
 rgb24               17f9e2e0c609009acaf2175c42d4a2a5
 rgba                b157c90191463d34fb3ce77b36c96386
 xyz12le             85abf80b77a9236a76ba0b00fcbdea2d
+ya16le              940fafa240b9916de5f73cb20a552f24
 ya8                 5fc0f471207ddf7aa01b07027d56b672
 yuv410p             cb871dcc1e84a7ef1d21f9237b88cf6e
 yuv411p             aec2c1740de9a62db0d41f4dda9121b0
@@ -57,10 +60,12 @@
 yuva420p9le         8ef1f3b3e01b5ce222e4caeec3dec396
 yuva422p            91dcecc4bfdff1f0db9ef8b9b5b9ac2a
 yuva422p10le        1ba292c74c8646fd077a6116142b1bc8
+yuva422p12le        50e59879a9b64ac0fc7f76a110537baa
 yuva422p16le        383226550fe9c93d6e8bf0d45d1423d1
 yuva422p9le         0fb76788c905c6d448143aa3c5eae116
 yuva444p            fb60941a57596b277417a3c7c00aa194
 yuva444p10le        251ea4ead8300d752eb355a08cbb0352
+yuva444p12le        f38b7c5747b43bcc6d647f143cb069cf
 yuva444p16le        5b65287e1862d2d9f1ad2cfdcde94661
 yuva444p9le         e6946c10b94c271e7ea24b3bcff314e1
 yuvj411p            87dbac57b211ab4823c1abbd702f1516
diff --git a/tests/ref/fate/filter-pixfmts-scale b/tests/ref/fate/filter-pixfmts-scale
index 05879ee..89d3f58 100644
--- a/tests/ref/fate/filter-pixfmts-scale
+++ b/tests/ref/fate/filter-pixfmts-scale
@@ -53,6 +53,8 @@
 monow               35c68b86c226d6990b2dcb573a05ff6b
 nv12                b118d24a3653fe66e5d9e079033aef79
 nv21                c74bb1c10dbbdee8a1f682b194486c4d
+nv24                2aa6e805bf6d4179ed8d7dea37d75db3
+nv42                80714d1eb2d8bcaeab3abc3124df1abd
 p010be              1d6726d94bf1385996a9a9840dd0e878
 p010le              4b316f2b9e18972299beb73511278fa8
 p016be              31e204018cbb53f8988c4e1174ea8ce9
@@ -76,6 +78,8 @@
 uyvy422             aeb4ba4f9f003ae21f6d18089198244f
 xyz12be             c7ba8345998c0141ddc079cdd29b1a40
 xyz12le             95f5d3a0de834cc495c9032a14987cde
+ya16be              20d4842899d61068f5fb6af478bf26a6
+ya16le              6a05895adce85143ae1c1b3470cb4070
 ya8                 0a9db5bb4b009de9197eede5e9d19e16
 yuv410p             e8f49b5fb9335b62c074f7f8bb0234fc
 yuv411p             5af32557c93beb482e26e7af693104c6
@@ -127,6 +131,8 @@
 yuva422p            3a80cb3e08782033aabfeff1e8969403
 yuva422p10be        94b13db95ceb970ded9773c095ade7d4
 yuva422p10le        544965627ee94964b9cc57750c385b31
+yuva422p12be        4285def72fb83a9c918d78453220a4b7
+yuva422p12le        accda73617ccfa3c45ced5e2a48a8323
 yuva422p16be        95be33f9599958669f3c1cb24e54a5e5
 yuva422p16le        ed83cc6e8fb70306d0622962504d1fcf
 yuva422p9be         5ff6aeca90b8392133d7b1addfbd639b
@@ -134,6 +140,8 @@
 yuva444p            f120326d9d940c9ac5cf5fd160969b82
 yuva444p10be        1838cd61a24fda56a7379c9cd9cb1629
 yuva444p10le        c5c2f602caab63c58954f5a80691436a
+yuva444p12be        befc6a3602bc58df4f4e8490ae6782cf
+yuva444p12le        8d13b714cdbadd2aa4e16c1ec673c0e2
 yuva444p16be        39ca2e32aa61b210b6c528855d24a16b
 yuva444p16le        cd2e0a001d8175f2204b2eb411c6a801
 yuva444p9be         58add24afbf43ff0ff7079cc1948fb56
diff --git a/tests/ref/fate/filter-pixfmts-swapuv b/tests/ref/fate/filter-pixfmts-swapuv
index e023809..676a440 100644
--- a/tests/ref/fate/filter-pixfmts-swapuv
+++ b/tests/ref/fate/filter-pixfmts-swapuv
@@ -48,6 +48,8 @@
 yuva422p            a1bd5c90b7bde1d3657025612a6f231e
 yuva422p10be        05bcc2394cfb0406d37b942423f6dbe7
 yuva422p10le        c166994709af82b9cdcebe4a7057348c
+yuva422p12be        30f4f9d6a2a623c45c4474e4aac8f7b9
+yuva422p12le        79dfb02173b19beb76b9f0b76a96d1d5
 yuva422p16be        9599ed5721f52028c3acfeb7b33ddc87
 yuva422p16le        dbb74e0bb2cf732e39e669f60ec6e1cf
 yuva422p9be         39093fec98b02e83b7e20dab3e5e4cf6
@@ -55,6 +57,8 @@
 yuva444p            ff2441de373fbfaed7bc199a7abe5a3e
 yuva444p10be        857043b712213eee329d2fb584d74c3e
 yuva444p10le        c3c451b3605af959a5d80146f4170e9d
+yuva444p12be        d60fd21b48fa6a3677a9070d5b2eafdb
+yuva444p12le        8f43565353cf0ce0a06f6b1261e42a53
 yuva444p16be        356d72791dfd91861b21630e315d40cb
 yuva444p16le        176591ce074ba8befc5fb279446ca1be
 yuva444p9be         675f0ed3e6572b05f06d9e44611bdff5
diff --git a/tests/ref/fate/filter-pixfmts-transpose b/tests/ref/fate/filter-pixfmts-transpose
index 4464409..e4a170f 100644
--- a/tests/ref/fate/filter-pixfmts-transpose
+++ b/tests/ref/fate/filter-pixfmts-transpose
@@ -51,6 +51,8 @@
 grayf32le           6e9ec0e1cac3617f3041e681afd2c575
 nv12                1965e3826144686748f2f6b516fca5ba
 nv21                292adaf5271c5c8516b71640458c01f4
+nv24                ea9de8b47faed722ee40182f89489beb
+nv42                636af6cd6a4f3ac5edc0fc3ce3c56d63
 p010be              ad0de2cc9bff81688b182a870fcf7000
 p010le              e7ff5143595021246733ce6bd0a769e8
 p016be              ad0de2cc9bff81688b182a870fcf7000
@@ -72,6 +74,8 @@
 rgba64le            ad47197774858858ae7b0c177dffa459
 xyz12be             68e5cba640f6e4ef72dff950e88b5342
 xyz12le             8b6b6a6db4d7561e80db88ccaecce7a9
+ya16be              3e161cb5f225922a80fefdc9cc02a4f9
+ya16le              5b3f6c06850b1678cbfc2c79cc448547
 ya8                 d4b7a62f80681fa44c977ff3a64f4ce4
 yuv410p             4c0143429edd30aa01493447c90132ea
 yuv420p             2fa5b2201c75034206cc20e2c6134aed
@@ -106,6 +110,8 @@
 yuva444p            4f9e649fbc2c0c91178d1576e462bb31
 yuva444p10be        9450fbac30b5f9da7414c895695591a9
 yuva444p10le        84a93637bf2c7e498380beff9b1fc503
+yuva444p12be        3eae4234e38ce068600dd7fdb39e04d2
+yuva444p12le        c4a4a3601a7fb9ef02770384e155f3d7
 yuva444p16be        9fd2f00ea9bef8e488228bc0b47b28cb
 yuva444p16le        ae9fd8d1baea0f8626b963816d667d2d
 yuva444p9be         4ce11ae57780f74c78cdd5c06be4bded
diff --git a/tests/ref/fate/filter-pixfmts-vflip b/tests/ref/fate/filter-pixfmts-vflip
index 51628f1..2522c84 100644
--- a/tests/ref/fate/filter-pixfmts-vflip
+++ b/tests/ref/fate/filter-pixfmts-vflip
@@ -53,6 +53,8 @@
 monow               90a947bfcd5f2261e83b577f48ec57b1
 nv12                261ebe585ae2aa4e70d39a10c1679294
 nv21                2909feacd27bebb080c8e0fa41795269
+nv24                334420b9d3df84499d2ca16bb66eed2b
+nv42                ba4063e2795c17fea3c8a646b01fd1f5
 p010be              06e9354b6e0e38ba41736352cedc0bd5
 p010le              fd18d322bffbf5816902c13102872e22
 p016be              06e9354b6e0e38ba41736352cedc0bd5
@@ -76,6 +78,8 @@
 uyvy422             3a237e8376264e0cfa78f8a3fdadec8a
 xyz12be             810644e008deb231850d779aaa27cc7e
 xyz12le             829701db461b43533cf9241e0743bc61
+ya16be              55b1dbbe4d56ed0d22461685ce85520d
+ya16le              d5bf02471823a16dc523a46cace0101a
 ya8                 4299c6ca3b470a7d8a420e26eb485b1d
 yuv410p             c7adfe96c8e043a6cb9290c39bf8063c
 yuv411p             3fce29db403a25f81be39e01aaf6ff3a
@@ -127,6 +131,8 @@
 yuva422p            39707b0dfdaadeefa20819080365db15
 yuva422p10be        53fbfe6d7eb01e2007003383c5d91850
 yuva422p10le        df1f95630ccd7bf05b95b6b3061cbeef
+yuva422p12be        6b13c0f628b4369c2ecabb3aaf02dbc6
+yuva422p12le        5413c3f022d30fbdd9f1d4e35468c8c4
 yuva422p16be        35ad91fa92b04e13d6b557d2f250ade1
 yuva422p16le        8fb93970118fde962f5dbcd156966722
 yuva422p9be         2b16b2dc102ad688a3023f30e3c6f9d9
@@ -134,6 +140,8 @@
 yuva444p            442a690385166bed3e785d9262c1c501
 yuva444p10be        bb6d52902c30f5cc63ddc3fbe3346bf5
 yuva444p10le        6e43f7c44e070fce492dcb1b038de85e
+yuva444p12be        437e75242255bcaeb853c35284f3b58c
+yuva444p12le        5864b489dff8cd98f46ca86b32f357e2
 yuva444p16be        b8801dccf64b3eadc2a5b5db67ae0b0f
 yuva444p16le        8e72ae66754badf5d1eeb094e6bf0ddc
 yuva444p9be         bcd845394351ca6d15e947342802957d
diff --git a/tests/ref/fate/filter-stereo3d-sbsl-arcd b/tests/ref/fate/filter-stereo3d-sbsl-arcd
index b5f11e2..20f080b 100644
--- a/tests/ref/fate/filter-stereo3d-sbsl-arcd
+++ b/tests/ref/fate/filter-stereo3d-sbsl-arcd
@@ -3,8 +3,8 @@
 #codec_id 0: rawvideo
 #dimensions 0: 176x288
 #sar 0: 0/1
-0,          0,          0,        1,   152064, 0xa0261570
-0,          1,          1,        1,   152064, 0x678403c8
-0,          2,          2,        1,   152064, 0x1087e7b6
-0,          3,          3,        1,   152064, 0xa3909df3
-0,          4,          4,        1,   152064, 0x87e4c4d4
+0,          0,          0,        1,   152064, 0x34b1fb03
+0,          1,          1,        1,   152064, 0x2045eadd
+0,          2,          2,        1,   152064, 0x1266cdde
+0,          3,          3,        1,   152064, 0xc9f083bd
+0,          4,          4,        1,   152064, 0x0701ab16
diff --git a/tests/ref/fate/filter-stereo3d-sbsl-aybd b/tests/ref/fate/filter-stereo3d-sbsl-aybd
index 0aa4e8b..277e66b 100644
--- a/tests/ref/fate/filter-stereo3d-sbsl-aybd
+++ b/tests/ref/fate/filter-stereo3d-sbsl-aybd
@@ -3,8 +3,8 @@
 #codec_id 0: rawvideo
 #dimensions 0: 176x288
 #sar 0: 0/1
-0,          0,          0,        1,   152064, 0x7dc98468
-0,          1,          1,        1,   152064, 0xf72db6c9
-0,          2,          2,        1,   152064, 0x1630f53f
-0,          3,          3,        1,   152064, 0xc1765599
-0,          4,          4,        1,   152064, 0x12e35db1
+0,          0,          0,        1,   152064, 0xf576742c
+0,          1,          1,        1,   152064, 0x2ce36ae4
+0,          2,          2,        1,   152064, 0x2dc99849
+0,          3,          3,        1,   152064, 0x940413b6
+0,          4,          4,        1,   152064, 0x48a600d3
diff --git a/tests/ref/fate/filter-tremolo b/tests/ref/fate/filter-tremolo
deleted file mode 100644
index c6cff52..0000000
--- a/tests/ref/fate/filter-tremolo
+++ /dev/null
@@ -1,26 +0,0 @@
-#tb 0: 1/44100
-#media_type 0: audio
-#codec_id 0: pcm_s16le
-#sample_rate 0: 44100
-#channel_layout 0: 3
-#channel_layout_name 0: stereo
-0,          0,          0,     1024,     4096, 0x5d3be907
-0,       1024,       1024,     1024,     4096, 0xea151fbe
-0,       2048,       2048,     1024,     4096, 0xa5bc19f4
-0,       3072,       3072,     1024,     4096, 0x8706ec6d
-0,       4096,       4096,     1024,     4096, 0x334ff275
-0,       5120,       5120,     1024,     4096, 0xcd0ff7ad
-0,       6144,       6144,     1024,     4096, 0x29a1e9c9
-0,       7168,       7168,     1024,     4096, 0x1d41e77f
-0,       8192,       8192,     1024,     4096, 0x99e7fe07
-0,       9216,       9216,     1024,     4096, 0x4bbf09ce
-0,      10240,      10240,     1024,     4096, 0x94600236
-0,      11264,      11264,     1024,     4096, 0xc8af0c9e
-0,      12288,      12288,     1024,     4096, 0x70eef88f
-0,      13312,      13312,     1024,     4096, 0xb222ec47
-0,      14336,      14336,     1024,     4096, 0x1071ee27
-0,      15360,      15360,     1024,     4096, 0x7c390bd2
-0,      16384,      16384,     1024,     4096, 0x68bdf655
-0,      17408,      17408,     1024,     4096, 0x810cfacb
-0,      18432,      18432,     1024,     4096, 0x9639e41f
-0,      19456,      19456,     1024,     4096, 0xa30be70f
diff --git a/tests/ref/fate/filter-vectorscope_color b/tests/ref/fate/filter-vectorscope_color
index 57875ab..81d97d4 100644
--- a/tests/ref/fate/filter-vectorscope_color
+++ b/tests/ref/fate/filter-vectorscope_color
@@ -3,6 +3,6 @@
 #codec_id 0: rawvideo
 #dimensions 0: 256x256
 #sar 0: 1/1
-0,          0,          0,        1,   196608, 0xf6e3aa30
-0,          1,          1,        1,   196608, 0x5584acf9
-0,          2,          2,        1,   196608, 0xa862775d
+0,          0,          0,        1,   196608, 0x7c431d1f
+0,          1,          1,        1,   196608, 0xb7e82028
+0,          2,          2,        1,   196608, 0x2feeeb61
diff --git a/tests/ref/fate/filter-vectorscope_color2 b/tests/ref/fate/filter-vectorscope_color2
index 3b2ad90..adbe9e6 100644
--- a/tests/ref/fate/filter-vectorscope_color2
+++ b/tests/ref/fate/filter-vectorscope_color2
@@ -3,6 +3,6 @@
 #codec_id 0: rawvideo
 #dimensions 0: 256x256
 #sar 0: 1/1
-0,          0,          0,        1,   196608, 0x5e62fae5
-0,          1,          1,        1,   196608, 0x4c27fcbf
-0,          2,          2,        1,   196608, 0xb7531088
+0,          0,          0,        1,   196608, 0xdad38823
+0,          1,          1,        1,   196608, 0xeb8589bd
+0,          2,          2,        1,   196608, 0x31a79c93
diff --git a/tests/ref/fate/filter-vectorscope_color3 b/tests/ref/fate/filter-vectorscope_color3
index 4baecca..2b6a6b0 100644
--- a/tests/ref/fate/filter-vectorscope_color3
+++ b/tests/ref/fate/filter-vectorscope_color3
@@ -3,6 +3,6 @@
 #codec_id 0: rawvideo
 #dimensions 0: 256x256
 #sar 0: 1/1
-0,          0,          0,        1,   196608, 0x83df8770
-0,          1,          1,        1,   196608, 0xa6a674a7
-0,          2,          2,        1,   196608, 0x11757143
+0,          0,          0,        1,   196608, 0x005f14ae
+0,          1,          1,        1,   196608, 0x461301a5
+0,          2,          2,        1,   196608, 0x8bbafd4e
diff --git a/tests/ref/fate/filter-vectorscope_color4 b/tests/ref/fate/filter-vectorscope_color4
index 21d6762..fcc21b7 100644
--- a/tests/ref/fate/filter-vectorscope_color4
+++ b/tests/ref/fate/filter-vectorscope_color4
@@ -3,6 +3,6 @@
 #codec_id 0: rawvideo
 #dimensions 0: 256x256
 #sar 0: 1/1
-0,          0,          0,        1,   196608, 0x326953c4
-0,          1,          1,        1,   196608, 0x870e1dcc
-0,          2,          2,        1,   196608, 0x87cb8800
+0,          0,          0,        1,   196608, 0xaedae0f3
+0,          1,          1,        1,   196608, 0x267baabb
+0,          2,          2,        1,   196608, 0x021f141a
diff --git a/tests/ref/fate/filter-vectorscope_gray b/tests/ref/fate/filter-vectorscope_gray
index a81fbf8..78fb1d7 100644
--- a/tests/ref/fate/filter-vectorscope_gray
+++ b/tests/ref/fate/filter-vectorscope_gray
@@ -3,6 +3,6 @@
 #codec_id 0: rawvideo
 #dimensions 0: 256x256
 #sar 0: 1/1
-0,          0,          0,        1,   196608, 0x79ba71e2
-0,          1,          1,        1,   196608, 0x909271e2
-0,          2,          2,        1,   196608, 0x143971e2
+0,          0,          0,        1,   196608, 0xf62bff11
+0,          1,          1,        1,   196608, 0x2ffffed1
+0,          2,          2,        1,   196608, 0x8e7efded
diff --git a/tests/ref/fate/filter-vectorscope_xy b/tests/ref/fate/filter-vectorscope_xy
index 83b7194..6ab64e1 100644
--- a/tests/ref/fate/filter-vectorscope_xy
+++ b/tests/ref/fate/filter-vectorscope_xy
@@ -3,6 +3,6 @@
 #codec_id 0: rawvideo
 #dimensions 0: 256x256
 #sar 0: 1/1
-0,          0,          0,        1,   196608, 0xa2899af1
-0,          1,          1,        1,   196608, 0x26409af1
-0,          2,          2,        1,   196608, 0xf5209af1
+0,          0,          0,        1,   196608, 0xd2bfcc40
+0,          1,          1,        1,   196608, 0x2851cb74
+0,          2,          2,        1,   196608, 0x48efcc64
diff --git a/tests/ref/fate/filter-waveform_uv b/tests/ref/fate/filter-waveform_uv
index 8cb3bc8..3636820 100644
--- a/tests/ref/fate/filter-waveform_uv
+++ b/tests/ref/fate/filter-waveform_uv
@@ -3,53 +3,53 @@
 #codec_id 0: rawvideo
 #dimensions 0: 352x512
 #sar 0: 1/1
-0,          0,          0,        1,   540672, 0x8a2521d6
-0,          1,          1,        1,   540672, 0xb9a321d6
-0,          2,          2,        1,   540672, 0x325421d6
-0,          3,          3,        1,   540672, 0xafee21d2
-0,          4,          4,        1,   540672, 0x172121d6
-0,          5,          5,        1,   540672, 0x24d121d6
-0,          6,          6,        1,   540672, 0x7fec21d6
-0,          7,          7,        1,   540672, 0xa8a021d6
-0,          8,          8,        1,   540672, 0x29fd21d6
-0,          9,          9,        1,   540672, 0x6dfe21d6
-0,         10,         10,        1,   540672, 0xe39821d6
-0,         11,         11,        1,   540672, 0x83f521d6
-0,         12,         12,        1,   540672, 0x57aa21d6
-0,         13,         13,        1,   540672, 0x67b221d6
-0,         14,         14,        1,   540672, 0x535821d6
-0,         15,         15,        1,   540672, 0xb8ac21d6
-0,         16,         16,        1,   540672, 0x27f621d6
-0,         17,         17,        1,   540672, 0x775221d6
-0,         18,         18,        1,   540672, 0x8e6621d6
-0,         19,         19,        1,   540672, 0x74c921d6
-0,         20,         20,        1,   540672, 0x04cd21d6
-0,         21,         21,        1,   540672, 0xccd421d6
-0,         22,         22,        1,   540672, 0x317221d6
-0,         23,         23,        1,   540672, 0xd79321d6
-0,         24,         24,        1,   540672, 0xa2ac21d6
-0,         25,         25,        1,   540672, 0x7f0a21d6
-0,         26,         26,        1,   540672, 0x483521d6
-0,         27,         27,        1,   540672, 0xb65721d6
-0,         28,         28,        1,   540672, 0xb77021d6
-0,         29,         29,        1,   540672, 0x9fd521d6
-0,         30,         30,        1,   540672, 0xb72121d6
-0,         31,         31,        1,   540672, 0x540221d6
-0,         32,         32,        1,   540672, 0xa34121d6
-0,         33,         33,        1,   540672, 0xe01421d6
-0,         34,         34,        1,   540672, 0x6fc721d6
-0,         35,         35,        1,   540672, 0x7fa621d6
-0,         36,         36,        1,   540672, 0xc48c21d6
-0,         37,         37,        1,   540672, 0x40f021d6
-0,         38,         38,        1,   540672, 0xdf3f21d6
-0,         39,         39,        1,   540672, 0xb04321d6
-0,         40,         40,        1,   540672, 0x222821d6
-0,         41,         41,        1,   540672, 0x2a5521d6
-0,         42,         42,        1,   540672, 0x6a4621be
-0,         43,         43,        1,   540672, 0xed7f21d6
-0,         44,         44,        1,   540672, 0xb16521d6
-0,         45,         45,        1,   540672, 0x9f5621d6
-0,         46,         46,        1,   540672, 0x204321d6
-0,         47,         47,        1,   540672, 0xc26e21d6
-0,         48,         48,        1,   540672, 0x3e8321d6
-0,         49,         49,        1,   540672, 0xaaee21d6
+0,          0,          0,        1,   540672, 0xe33821d6
+0,          1,          1,        1,   540672, 0x12c521d6
+0,          2,          2,        1,   540672, 0x8b6721d6
+0,          3,          3,        1,   540672, 0x6fd321d6
+0,          4,          4,        1,   540672, 0x703421d6
+0,          5,          5,        1,   540672, 0x7de421d6
+0,          6,          6,        1,   540672, 0xd8ff21d6
+0,          7,          7,        1,   540672, 0x01c221d6
+0,          8,          8,        1,   540672, 0x831021d6
+0,          9,          9,        1,   540672, 0xc71121d6
+0,         10,         10,        1,   540672, 0x3cba21d6
+0,         11,         11,        1,   540672, 0xdd0821d6
+0,         12,         12,        1,   540672, 0xb0bd21d6
+0,         13,         13,        1,   540672, 0xc0c521d6
+0,         14,         14,        1,   540672, 0xac6b21d6
+0,         15,         15,        1,   540672, 0x11ce21d6
+0,         16,         16,        1,   540672, 0x810921d6
+0,         17,         17,        1,   540672, 0xd06521d6
+0,         18,         18,        1,   540672, 0xe77921d6
+0,         19,         19,        1,   540672, 0xcddc21d6
+0,         20,         20,        1,   540672, 0x5de021d6
+0,         21,         21,        1,   540672, 0x25f621d6
+0,         22,         22,        1,   540672, 0x8a8521d6
+0,         23,         23,        1,   540672, 0x30b521d6
+0,         24,         24,        1,   540672, 0xfbbf21d6
+0,         25,         25,        1,   540672, 0xd81d21d6
+0,         26,         26,        1,   540672, 0xa14821d6
+0,         27,         27,        1,   540672, 0x0f7921d6
+0,         28,         28,        1,   540672, 0x109221d6
+0,         29,         29,        1,   540672, 0xf8e821d6
+0,         30,         30,        1,   540672, 0x104321d6
+0,         31,         31,        1,   540672, 0xad1521d6
+0,         32,         32,        1,   540672, 0xfc5421d6
+0,         33,         33,        1,   540672, 0x393621d6
+0,         34,         34,        1,   540672, 0xc8da21d6
+0,         35,         35,        1,   540672, 0xd8b921d6
+0,         36,         36,        1,   540672, 0x1dae21d6
+0,         37,         37,        1,   540672, 0x9a0321d6
+0,         38,         38,        1,   540672, 0x386121d6
+0,         39,         39,        1,   540672, 0x096521d6
+0,         40,         40,        1,   540672, 0x7b3b21d6
+0,         41,         41,        1,   540672, 0x836821d6
+0,         42,         42,        1,   540672, 0x97bd21d6
+0,         43,         43,        1,   540672, 0x46a121d6
+0,         44,         44,        1,   540672, 0x0a8721d6
+0,         45,         45,        1,   540672, 0xf86921d6
+0,         46,         46,        1,   540672, 0x795621d6
+0,         47,         47,        1,   540672, 0x1b9021d6
+0,         48,         48,        1,   540672, 0x979621d6
+0,         49,         49,        1,   540672, 0x041021d6
diff --git a/tests/ref/fate/fitsdec-bitpix-32 b/tests/ref/fate/fitsdec-bitpix-32
index 9bce361..b3a5140 100644
--- a/tests/ref/fate/fitsdec-bitpix-32
+++ b/tests/ref/fate/fitsdec-bitpix-32
@@ -3,4 +3,4 @@
 #codec_id 0: rawvideo
 #dimensions 0: 102x109
 #sar 0: 0/1
-0,          0,          0,        1,    22236, 0x34490902
+0,          0,          0,        1,    22236, 0x24634517
diff --git a/tests/ref/fate/fitsdec-bitpix-64 b/tests/ref/fate/fitsdec-bitpix-64
index 9febdd6..e50d5e0 100644
--- a/tests/ref/fate/fitsdec-bitpix-64
+++ b/tests/ref/fate/fitsdec-bitpix-64
@@ -3,4 +3,4 @@
 #codec_id 0: rawvideo
 #dimensions 0: 77x173
 #sar 0: 0/1
-0,          0,          0,        1,    26642, 0x0ad2a46a
+0,          0,          0,        1,    26642, 0xa9eec634
diff --git a/tests/ref/fate/fitsdec-blank_bitpix32 b/tests/ref/fate/fitsdec-blank_bitpix32
index 184fd41..330d671 100644
--- a/tests/ref/fate/fitsdec-blank_bitpix32
+++ b/tests/ref/fate/fitsdec-blank_bitpix32
@@ -3,4 +3,4 @@
 #codec_id 0: rawvideo
 #dimensions 0: 256x256
 #sar 0: 0/1
-0,          0,          0,        1,   131072, 0x7fb22427
+0,          0,          0,        1,   131072, 0x3ecd0739
diff --git a/tests/ref/fate/fitsdec-ext_data_min_max b/tests/ref/fate/fitsdec-ext_data_min_max
index 9009a4e..006d8d6 100644
--- a/tests/ref/fate/fitsdec-ext_data_min_max
+++ b/tests/ref/fate/fitsdec-ext_data_min_max
@@ -3,4 +3,4 @@
 #codec_id 0: rawvideo
 #dimensions 0: 512x512
 #sar 0: 0/1
-0,          0,          0,        1,   524288, 0xc327ed23
+0,          0,          0,        1,   524288, 0x6567ecb3
diff --git a/tests/ref/fate/fitsdec-gray b/tests/ref/fate/fitsdec-gray
index 425b31f..d080732 100644
--- a/tests/ref/fate/fitsdec-gray
+++ b/tests/ref/fate/fitsdec-gray
@@ -3,4 +3,4 @@
 #codec_id 0: rawvideo
 #dimensions 0: 128x128
 #sar 0: 0/1
-0,          0,          0,        1,    16384, 0xd788a2d2
+0,          0,          0,        1,    16384, 0x353dbacd
diff --git a/tests/ref/fate/gifenc-bgr4_byte b/tests/ref/fate/gifenc-bgr4_byte
index 3495a8b..2ec314e 100644
--- a/tests/ref/fate/gifenc-bgr4_byte
+++ b/tests/ref/fate/gifenc-bgr4_byte
@@ -3,176 +3,176 @@
 #codec_id 0: gif
 #dimensions 0: 217x217
 #sar 0: 0/1
-0,          0,          0,        1,      508, 0xa1b80fc0
-0,          1,          1,        1,      213, 0x4f554bd7, S=1,     1024, 0xb6327c81
-0,          2,          2,        1,      131, 0x283b2988, S=1,     1024, 0xae3a7c81
-0,          3,          3,        1,      384, 0xc4fea72a, S=1,     1024, 0xb6327c81
-0,          4,          4,        1,      381, 0x050ba2b8, S=1,     1024, 0x9e4a7c81
-0,          5,          5,        1,      430, 0x00cfb2ae, S=1,     1024, 0x9e4a7c81
-0,          6,          6,        1,      518, 0xc8e5d827, S=1,     1024, 0x9e4a7c81
-0,          7,          7,        1,      535, 0x326ce62a, S=1,     1024, 0x9e4a7c81
-0,          8,          8,        1,      438, 0x34d6b7c0, S=1,     1024, 0xb6327c81
-0,          9,          9,        1,      923, 0x9fb1a37c, S=1,     1024, 0xb6327c81
-0,         10,         10,        1,      694, 0xf20449a5, S=1,     1024, 0xb6327c81
-0,         11,         11,        1,     1194, 0x67cd2ab5, S=1,     1024, 0xb6327c81
-0,         12,         12,        1,     1291, 0x1d23539d, S=1,     1024, 0xb6327c81
-0,         13,         13,        1,     1245, 0x065f32e6, S=1,     1024, 0xb6327c81
-0,         14,         14,        1,     1330, 0x83ec51a4, S=1,     1024, 0xb6327c81
-0,         15,         15,        1,     1276, 0x2acf38dc, S=1,     1024, 0xb6327c81
-0,         16,         16,        1,     1475, 0x4cd197ef, S=1,     1024, 0xb6327c81
-0,         17,         17,        1,     1784, 0xd1e84ae6, S=1,     1024, 0xde0a7c81
-0,         18,         18,        1,     1675, 0x092dfa86, S=1,     1024, 0xde0a7c81
-0,         19,         19,        1,     1509, 0x639aaa00, S=1,     1024, 0xde0a7c81
-0,         20,         20,        1,     1705, 0xfd3719d5, S=1,     1024, 0xde0a7c81
-0,         21,         21,        1,     1745, 0x8a761db4, S=1,     1024, 0xde0a7c81
-0,         22,         22,        1,     1642, 0x18830245, S=1,     1024, 0xde0a7c81
-0,         23,         23,        1,     1718, 0x3c8d1ebe, S=1,     1024, 0xde0a7c81
-0,         24,         24,        1,     1900, 0x2ea879d1, S=1,     1024, 0xde0a7c81
-0,         25,         25,        1,     1807, 0x02b35230, S=1,     1024, 0xde0a7c81
-0,         26,         26,        1,     1915, 0x22d48344, S=1,     1024, 0xde0a7c81
-0,         27,         27,        1,     2100, 0x55fcd063, S=1,     1024, 0xde0a7c81
-0,         28,         28,        1,     2700, 0x7cc5f08b, S=1,     1024, 0xde0a7c81
-0,         29,         29,        1,     2673, 0xb997a80d, S=1,     1024, 0xde0a7c81
-0,         30,         30,        1,     2895, 0xab69484d, S=1,     1024, 0xde0a7c81
-0,         31,         31,        1,     3257, 0xf753cf24, S=1,     1024, 0xde0a7c81
-0,         32,         32,        1,     3179, 0x34f2c13b, S=1,     1024, 0xde0a7c81
-0,         33,         33,        1,     3296, 0x7c06e72f, S=1,     1024, 0xde0a7c81
-0,         34,         34,        1,     3600, 0x4ca67634, S=1,     1024, 0xde0a7c81
-0,         35,         35,        1,     3699, 0xabe89fe3, S=1,     1024, 0xde0a7c81
-0,         36,         36,        1,     3814, 0x1869d3f4, S=1,     1024, 0xde0a7c81
-0,         37,         37,        1,     3627, 0x19bd7da7, S=1,     1024, 0xde0a7c81
-0,         38,         38,        1,     2950, 0x048a6055, S=1,     1024, 0xde0a7c81
-0,         39,         39,        1,     3086, 0x64ec8fc2, S=1,     1024, 0xde0a7c81
-0,         40,         40,        1,     3094, 0x1a388553, S=1,     1024, 0xde0a7c81
-0,         41,         41,        1,     3456, 0x01432c82, S=1,     1024, 0xde0a7c81
-0,         42,         42,        1,     4108, 0xf9505c66, S=1,     1024, 0xde0a7c81
-0,         43,         43,        1,     4217, 0x7f985ba4, S=1,     1024, 0xde0a7c81
-0,         44,         44,        1,     3613, 0xd0684d83, S=1,     1024, 0xde0a7c81
-0,         45,         45,        1,     3910, 0x0070e692, S=1,     1024, 0xde0a7c81
-0,         46,         46,        1,     4461, 0x5cc9e33d, S=1,     1024, 0xde0a7c81
-0,         47,         47,        1,     4593, 0x33a32dd1, S=1,     1024, 0xde0a7c81
-0,         48,         48,        1,     4822, 0x59549883, S=1,     1024, 0xde0a7c81
-0,         49,         49,        1,     5398, 0xb7bac31e, S=1,     1024, 0xde0a7c81
-0,         50,         50,        1,     5266, 0x21c695aa, S=1,     1024, 0xde0a7c81
-0,         51,         51,        1,     5416, 0xf305e3ed, S=1,     1024, 0xde0a7c81
-0,         52,         52,        1,     5519, 0x857d071f, S=1,     1024, 0xde0a7c81
-0,         53,         53,        1,     5701, 0x8f885c9c, S=1,     1024, 0xde0a7c81
-0,         54,         54,        1,     6160, 0x48523e83, S=1,     1024, 0xde0a7c81
-0,         55,         55,        1,     6233, 0x8fd2511e, S=1,     1024, 0xde0a7c81
-0,         56,         56,        1,     5911, 0x92d4c516, S=1,     1024, 0xde0a7c81
-0,         57,         57,        1,     5997, 0xbd7cfa15, S=1,     1024, 0xde0a7c81
-0,         58,         58,        1,     5946, 0x8f5fedff, S=1,     1024, 0xde0a7c81
-0,         59,         59,        1,     6468, 0x45c0cb8c, S=1,     1024, 0xde0a7c81
-0,         60,         60,        1,     6737, 0x4e1e39ac, S=1,     1024, 0xde0a7c81
-0,         61,         61,        1,     6275, 0x1d5e8f4c, S=1,     1024, 0xde0a7c81
-0,         62,         62,        1,     6641, 0x844b3aad, S=1,     1024, 0xde0a7c81
-0,         63,         63,        1,     6378, 0x52568640, S=1,     1024, 0xde0a7c81
-0,         64,         64,        1,     6257, 0xfabc585f, S=1,     1024, 0xde0a7c81
-0,         65,         65,        1,     6908, 0xf261701c, S=1,     1024, 0xde0a7c81
-0,         66,         66,        1,     7230, 0xb4f524ce, S=1,     1024, 0xde0a7c81
-0,         67,         67,        1,     7556, 0x89c1a712, S=1,     1024, 0xde0a7c81
-0,         68,         68,        1,     7413, 0x553970a4, S=1,     1024, 0xde0a7c81
-0,         69,         69,        1,     7476, 0x24d2a761, S=1,     1024, 0xde0a7c81
-0,         70,         70,        1,     7596, 0xf072e431, S=1,     1024, 0xde0a7c81
-0,         71,         71,        1,     7756, 0x131205c0, S=1,     1024, 0xde0a7c81
-0,         72,         72,        1,     8015, 0xf4536a7f, S=1,     1024, 0xde0a7c81
-0,         73,         73,        1,     8128, 0xba80be2b, S=1,     1024, 0xde0a7c81
-0,         74,         74,        1,     8101, 0x44ceb3a2, S=1,     1024, 0xde0a7c81
-0,         75,         75,        1,     7863, 0x55043dfd, S=1,     1024, 0xde0a7c81
-0,         76,         76,        1,     7960, 0x38399182, S=1,     1024, 0xde0a7c81
-0,         77,         77,        1,     8238, 0x1d52ecf3, S=1,     1024, 0xde0a7c81
-0,         78,         78,        1,     8321, 0xd8d24a5c, S=1,     1024, 0xde0a7c81
-0,         79,         79,        1,     8562, 0x4a0cc02b, S=1,     1024, 0xde0a7c81
-0,         80,         80,        1,     8746, 0x2db40da7, S=1,     1024, 0xde0a7c81
-0,         81,         81,        1,     8578, 0x46f9a4c1, S=1,     1024, 0xde0a7c81
-0,         82,         82,        1,     8878, 0xf58d5a19, S=1,     1024, 0xde0a7c81
-0,         83,         83,        1,     9077, 0x78de57f6, S=1,     1024, 0xde0a7c81
-0,         84,         84,        1,     9310, 0x8c10f77a, S=1,     1024, 0xde0a7c81
-0,         85,         85,        1,     9394, 0x741f431e, S=1,     1024, 0xde0a7c81
-0,         86,         86,        1,     9161, 0x6f499587, S=1,     1024, 0xde0a7c81
-0,         87,         87,        1,     9462, 0x628936c3, S=1,     1024, 0xde0a7c81
-0,         88,         88,        1,     9650, 0x4cb4936e, S=1,     1024, 0xde0a7c81
-0,         89,         89,        1,     9701, 0x5e069c40, S=1,     1024, 0xde0a7c81
-0,         90,         90,        1,     9523, 0x66a13c83, S=1,     1024, 0xde0a7c81
-0,         91,         91,        1,     9891, 0x43ea0e93, S=1,     1024, 0xde0a7c81
-0,         92,         92,        1,    10005, 0x96a849e7, S=1,     1024, 0xde0a7c81
-0,         93,         93,        1,    10038, 0x68032d25, S=1,     1024, 0xde0a7c81
-0,         94,         94,        1,    10086, 0xef59458d, S=1,     1024, 0xde0a7c81
-0,         95,         95,        1,    10438, 0x3466fed0, S=1,     1024, 0xde0a7c81
-0,         96,         96,        1,    10583, 0x8bdd5477, S=1,     1024, 0xde0a7c81
-0,         97,         97,        1,    10581, 0x69d27fee, S=1,     1024, 0xde0a7c81
-0,         98,         98,        1,    10807, 0xde62d6e3, S=1,     1024, 0xde0a7c81
-0,         99,         99,        1,    11111, 0x34eb4c13, S=1,     1024, 0xde0a7c81
-0,        100,        100,        1,    11194, 0x584f6b73, S=1,     1024, 0xde0a7c81
-0,        101,        101,        1,    11240, 0xc90ba13f, S=1,     1024, 0xde0a7c81
-0,        102,        102,        1,    11483, 0x59c4f3c5, S=1,     1024, 0xde0a7c81
-0,        103,        103,        1,    11680, 0xc62c5bc1, S=1,     1024, 0xde0a7c81
-0,        104,        104,        1,    11785, 0xc9bab793, S=1,     1024, 0xde0a7c81
-0,        105,        105,        1,    11436, 0xc9c40809, S=1,     1024, 0xde0a7c81
-0,        106,        106,        1,    11928, 0x4b77c9a7, S=1,     1024, 0xde0a7c81
-0,        107,        107,        1,    11932, 0x722abcbe, S=1,     1024, 0xde0a7c81
-0,        108,        108,        1,    12281, 0x0d136f53, S=1,     1024, 0xde0a7c81
-0,        109,        109,        1,    12334, 0x04a47f78, S=1,     1024, 0xde0a7c81
-0,        110,        110,        1,    12452, 0xa02db188, S=1,     1024, 0xde0a7c81
-0,        111,        111,        1,    12695, 0x1a813b2e, S=1,     1024, 0xde0a7c81
-0,        112,        112,        1,    12668, 0x81b24f79, S=1,     1024, 0xde0a7c81
-0,        113,        113,        1,    12957, 0x4da59f8c, S=1,     1024, 0xde0a7c81
-0,        114,        114,        1,    13054, 0x7abedf5a, S=1,     1024, 0xde0a7c81
-0,        115,        115,        1,    13147, 0x138f2bbd, S=1,     1024, 0xde0a7c81
-0,        116,        116,        1,    13171, 0x43c1195f, S=1,     1024, 0xde0a7c81
-0,        117,        117,        1,    13198, 0x2c8d58d4, S=1,     1024, 0xde0a7c81
-0,        118,        118,        1,    13211, 0x12c36193, S=1,     1024, 0xde0a7c81
-0,        119,        119,        1,    13210, 0xfe496107, S=1,     1024, 0xde0a7c81
-0,        120,        120,        1,    13467, 0x4d8ea128, S=1,     1024, 0xde0a7c81
-0,        121,        121,        1,    13665, 0x94caddde, S=1,     1024, 0xde0a7c81
-0,        122,        122,        1,    13692, 0xe38febd9, S=1,     1024, 0xde0a7c81
-0,        123,        123,        1,    13821, 0xee592e62, S=1,     1024, 0xde0a7c81
-0,        124,        124,        1,    13946, 0xceb09235, S=1,     1024, 0xde0a7c81
-0,        125,        125,        1,    14063, 0x7361d2f5, S=1,     1024, 0xde0a7c81
-0,        126,        126,        1,    14124, 0x226bcac1, S=1,     1024, 0xde0a7c81
-0,        127,        127,        1,    14331, 0x0649512b, S=1,     1024, 0xde0a7c81
-0,        128,        128,        1,    14469, 0x0d7da45b, S=1,     1024, 0xde0a7c81
-0,        129,        129,        1,    14536, 0x73cca242, S=1,     1024, 0xde0a7c81
-0,        130,        130,        1,    14608, 0x1f3dd14e, S=1,     1024, 0xde0a7c81
-0,        131,        131,        1,    14898, 0xd13d258e, S=1,     1024, 0xde0a7c81
-0,        132,        132,        1,    14978, 0xfa049fea, S=1,     1024, 0xde0a7c81
-0,        133,        133,        1,    15142, 0x1dfad60c, S=1,     1024, 0xde0a7c81
-0,        134,        134,        1,    15129, 0x5962bae7, S=1,     1024, 0xde0a7c81
-0,        135,        135,        1,    15243, 0x2c2c113b, S=1,     1024, 0xde0a7c81
-0,        136,        136,        1,    15337, 0x3cab623b, S=1,     1024, 0xde0a7c81
-0,        137,        137,        1,    15638, 0xbff3a100, S=1,     1024, 0xde0a7c81
-0,        138,        138,        1,    15912, 0x13bf1fb2, S=1,     1024, 0xde0a7c81
-0,        139,        139,        1,    16041, 0x01134246, S=1,     1024, 0xde0a7c81
-0,        140,        140,        1,    16228, 0xe2f80035, S=1,     1024, 0xde0a7c81
-0,        141,        141,        1,    16262, 0xc8d3ea51, S=1,     1024, 0xde0a7c81
-0,        142,        142,        1,    16371, 0xe7da07f2, S=1,     1024, 0xde0a7c81
-0,        143,        143,        1,    16661, 0x10ada592, S=1,     1024, 0xde0a7c81
-0,        144,        144,        1,    16917, 0xbfb717e5, S=1,     1024, 0xde0a7c81
-0,        145,        145,        1,    17149, 0x4074ca41, S=1,     1024, 0xde0a7c81
-0,        146,        146,        1,    17172, 0xf749b49f, S=1,     1024, 0xde0a7c81
-0,        147,        147,        1,    17315, 0x2abea8a0, S=1,     1024, 0xde0a7c81
-0,        148,        148,        1,    17397, 0x14f71122, S=1,     1024, 0xde0a7c81
-0,        149,        149,        1,    17431, 0xce49f2d3, S=1,     1024, 0xde0a7c81
-0,        150,        150,        1,    17576, 0x7c6552ad, S=1,     1024, 0xde0a7c81
-0,        151,        151,        1,    17764, 0x1d198d60, S=1,     1024, 0xde0a7c81
-0,        152,        152,        1,    17826, 0xe1727f57, S=1,     1024, 0xde0a7c81
-0,        153,        153,        1,    17918, 0xb78d9b9f, S=1,     1024, 0xde0a7c81
-0,        154,        154,        1,    17823, 0xc9fabf19, S=1,     1024, 0xde0a7c81
-0,        155,        155,        1,    18142, 0xeb5b21a9, S=1,     1024, 0xde0a7c81
-0,        156,        156,        1,    18257, 0x7b38822c, S=1,     1024, 0xde0a7c81
-0,        157,        157,        1,    18337, 0xd395c279, S=1,     1024, 0xde0a7c81
-0,        158,        158,        1,    18293, 0x6c3b3766, S=1,     1024, 0xde0a7c81
-0,        159,        159,        1,    18418, 0x2abcbcf8, S=1,     1024, 0xde0a7c81
-0,        160,        160,        1,    18607, 0x79424730, S=1,     1024, 0xde0a7c81
-0,        161,        161,        1,    18916, 0x8707bbc6, S=1,     1024, 0xde0a7c81
-0,        162,        162,        1,    19073, 0xd82c03f6, S=1,     1024, 0xde0a7c81
-0,        163,        163,        1,    19168, 0xb7d6fe27, S=1,     1024, 0xde0a7c81
-0,        164,        164,        1,    19210, 0x79f301eb, S=1,     1024, 0xde0a7c81
-0,        165,        165,        1,    19398, 0x0a5663c6, S=1,     1024, 0xde0a7c81
-0,        166,        166,        1,    19480, 0x4fe09e5b, S=1,     1024, 0xde0a7c81
-0,        167,        167,        1,    19659, 0xab971088, S=1,     1024, 0xde0a7c81
-0,        168,        168,        1,    19672, 0x2e331553, S=1,     1024, 0xde0a7c81
-0,        169,        169,        1,    19936, 0x2eea628a, S=1,     1024, 0xde0a7c81
-0,        170,        170,        1,    19975, 0xd6bb9ab2, S=1,     1024, 0xde0a7c81
-0,        171,        171,        1,    20021, 0xf7e98dc5, S=1,     1024, 0xde0a7c81
-0,        172,        172,        1,    20060, 0x20017807, S=1,     1024, 0xde0a7c81
+0,          0,          0,        1,     1297, 0x53e8b1c1
+0,          1,          1,        1,      158, 0xe1873465, F=0x0
+0,          2,          2,        1,      143, 0x56992b17, F=0x0
+0,          3,          3,        1,      169, 0x4f0434c7, F=0x0
+0,          4,          4,        1,      254, 0xb4845bf3, F=0x0
+0,          5,          5,        1,      221, 0xa02a4ae2, F=0x0
+0,          6,          6,        1,      176, 0xdcfc3a8b, F=0x0
+0,          7,          7,        1,      189, 0xb45f3f8d, F=0x0
+0,          8,          8,        1,      139, 0xf2622fc0, F=0x0
+0,          9,          9,        1,      160, 0xf77b327d, F=0x0
+0,         10,         10,        1,      149, 0x56b62de9, F=0x0
+0,         11,         11,        1,      190, 0x1eca3f72, F=0x0
+0,         12,         12,        1,      308, 0xfc7373fc, F=0x0
+0,         13,         13,        1,      193, 0x94304232, F=0x0
+0,         14,         14,        1,      191, 0x82e84504, F=0x0
+0,         15,         15,        1,      198, 0xd31944a2, F=0x0
+0,         16,         16,        1,      417, 0x9547ac22, F=0x0
+0,         17,         17,        1,      163, 0xb55537d0, F=0x0
+0,         18,         18,        1,      383, 0x634f9f88, F=0x0
+0,         19,         19,        1,      193, 0xf6d24046, F=0x0
+0,         20,         20,        1,      337, 0x45d6916f, F=0x0
+0,         21,         21,        1,      199, 0xabb34a72, F=0x0
+0,         22,         22,        1,      308, 0x097f7e58, F=0x0
+0,         23,         23,        1,      186, 0x369b41cc, F=0x0
+0,         24,         24,        1,      199, 0xa93c4113, F=0x0
+0,         25,         25,        1,      163, 0x16823904, F=0x0
+0,         26,         26,        1,      302, 0xaf1d78da, F=0x0
+0,         27,         27,        1,      189, 0x3f7a3bde, F=0x0
+0,         28,         28,        1,      157, 0x45e23500, F=0x0
+0,         29,         29,        1,      205, 0x797b4510, F=0x0
+0,         30,         30,        1,      160, 0x20e533d1, F=0x0
+0,         31,         31,        1,      202, 0xd3b748b3, F=0x0
+0,         32,         32,        1,      160, 0x207c371f, F=0x0
+0,         33,         33,        1,      215, 0x079951b6, F=0x0
+0,         34,         34,        1,      422, 0xbb9db080, F=0x0
+0,         35,         35,        1,      184, 0x3a044098, F=0x0
+0,         36,         36,        1,      289, 0xf2757206, F=0x0
+0,         37,         37,        1,      190, 0xc3264203, F=0x0
+0,         38,         38,        1,      195, 0x28544262, F=0x0
+0,         39,         39,        1,      199, 0x32db4bba, F=0x0
+0,         40,         40,        1,      448, 0x64a8bfe8, F=0x0
+0,         41,         41,        1,      170, 0x62a536d7, F=0x0
+0,         42,         42,        1,      279, 0xe1df6ff6, F=0x0
+0,         43,         43,        1,      180, 0x762f3aac, F=0x0
+0,         44,         44,        1,      303, 0x73727c79, F=0x0
+0,         45,         45,        1,      209, 0xf4a8515c, F=0x0
+0,         46,         46,        1,      198, 0xe09f451e, F=0x0
+0,         47,         47,        1,      194, 0x301e4b04, F=0x0
+0,         48,         48,        1,      186, 0x7c66421b, F=0x0
+0,         49,         49,        1,     1200, 0xe55e34e7, F=0x0
+0,         50,         50,        1,      204, 0x25534779, F=0x0
+0,         51,         51,        1,     1066, 0x9792efa8, F=0x0
+0,         52,         52,        1,      187, 0xd82e41f0, F=0x0
+0,         53,         53,        1,      323, 0x0f9d8485, F=0x0
+0,         54,         54,        1,      205, 0x86ef4c75, F=0x0
+0,         55,         55,        1,      213, 0x6e515113, F=0x0
+0,         56,         56,        1,      208, 0x1ac84bed, F=0x0
+0,         57,         57,        1,      737, 0x68a047be, F=0x0
+0,         58,         58,        1,      181, 0x84353a71, F=0x0
+0,         59,         59,        1,      614, 0x3c9a142a, F=0x0
+0,         60,         60,        1,      215, 0xacaf535d, F=0x0
+0,         61,         61,        1,      291, 0x4dab7020, F=0x0
+0,         62,         62,        1,      208, 0x3dd84d1f, F=0x0
+0,         63,         63,        1,      208, 0x8ccb45cc, F=0x0
+0,         64,         64,        1,      203, 0xa905456b, F=0x0
+0,         65,         65,        1,      531, 0x6b32eaf4, F=0x0
+0,         66,         66,        1,      178, 0xd30b3bff, F=0x0
+0,         67,         67,        1,      446, 0x881abe2a, F=0x0
+0,         68,         68,        1,      188, 0xb5a43e6b, F=0x0
+0,         69,         69,        1,      177, 0x9255436c, F=0x0
+0,         70,         70,        1,      112, 0x2990213a, F=0x0
+0,         71,         71,        1,      296, 0x7d6e7183, F=0x0
+0,         72,         72,        1,      153, 0x35053313, F=0x0
+0,         73,         73,        1,      218, 0xcf105015, F=0x0
+0,         74,         74,        1,      202, 0xb4634837, F=0x0
+0,         75,         75,        1,      239, 0x0a4b5b7b, F=0x0
+0,         76,         76,        1,      139, 0x18d92e35, F=0x0
+0,         77,         77,        1,      467, 0x784dc79e, F=0x0
+0,         78,         78,        1,      274, 0x1e9b78ef, F=0x0
+0,         79,         79,        1,      404, 0xb5c6ab9b, F=0x0
+0,         80,         80,        1,      257, 0x7aaa66ce, F=0x0
+0,         81,         81,        1,      419, 0xcb62b6cb, F=0x0
+0,         82,         82,        1,      208, 0xcbba506d, F=0x0
+0,         83,         83,        1,      294, 0x031a76f9, F=0x0
+0,         84,         84,        1,      191, 0x5ba83f77, F=0x0
+0,         85,         85,        1,      181, 0xfc454323, F=0x0
+0,         86,         86,        1,      218, 0xcd7e540e, F=0x0
+0,         87,         87,        1,      423, 0xdcebc01f, F=0x0
+0,         88,         88,        1,      202, 0x160a4ab6, F=0x0
+0,         89,         89,        1,      317, 0xff2b8104, F=0x0
+0,         90,         90,        1,      172, 0x68753e2d, F=0x0
+0,         91,         91,        1,      275, 0x7f766cd1, F=0x0
+0,         92,         92,        1,      214, 0xf37e5043, F=0x0
+0,         93,         93,        1,      182, 0x5e5544f6, F=0x0
+0,         94,         94,        1,      151, 0xf74532b7, F=0x0
+0,         95,         95,        1,      157, 0xe99b33b0, F=0x0
+0,         96,         96,        1,      202, 0x77994327, F=0x0
+0,         97,         97,        1,      162, 0x93f235fc, F=0x0
+0,         98,         98,        1,      186, 0xc25d3f3f, F=0x0
+0,         99,         99,        1,      318, 0xdf547809, F=0x0
+0,        100,        100,        1,      225, 0xf8074f18, F=0x0
+0,        101,        101,        1,      207, 0x12204757, F=0x0
+0,        102,        102,        1,      212, 0xd2ec4c59, F=0x0
+0,        103,        103,        1,      153, 0x0e1c33cd, F=0x0
+0,        104,        104,        1,      196, 0x45d4455d, F=0x0
+0,        105,        105,        1,      146, 0x5dba32b0, F=0x0
+0,        106,        106,        1,      194, 0x13a8490b, F=0x0
+0,        107,        107,        1,      304, 0xcf73832f, F=0x0
+0,        108,        108,        1,      194, 0x68fd43c9, F=0x0
+0,        109,        109,        1,      190, 0xdbc64442, F=0x0
+0,        110,        110,        1,      204, 0x8eb94b27, F=0x0
+0,        111,        111,        1,      136, 0xd0162d03, F=0x0
+0,        112,        112,        1,      171, 0xbb8b3d15, F=0x0
+0,        113,        113,        1,      140, 0x4cb930a9, F=0x0
+0,        114,        114,        1,      158, 0xdebb32d2, F=0x0
+0,        115,        115,        1,       94, 0x16a71c65, F=0x0
+0,        116,        116,        1,      110, 0x358d20bf, F=0x0
+0,        117,        117,        1,      256, 0x49a469b7, F=0x0
+0,        118,        118,        1,      220, 0x08b95486, F=0x0
+0,        119,        119,        1,      221, 0xe0af4f92, F=0x0
+0,        120,        120,        1,      205, 0x7ac444a5, F=0x0
+0,        121,        121,        1,      169, 0x62c039d3, F=0x0
+0,        122,        122,        1,      970, 0xc8f6c8a6, F=0x0
+0,        123,        123,        1,      181, 0x0d9c42ba, F=0x0
+0,        124,        124,        1,      955, 0xdf5dba5e, F=0x0
+0,        125,        125,        1,      158, 0xa01833fd, F=0x0
+0,        126,        126,        1,      344, 0xd17989f3, F=0x0
+0,        127,        127,        1,      627, 0x8c611977, F=0x0
+0,        128,        128,        1,      172, 0x7cf83c63, F=0x0
+0,        129,        129,        1,      494, 0xadccdc2b, F=0x0
+0,        130,        130,        1,      184, 0x4e784407, F=0x0
+0,        131,        131,        1,      352, 0x852f992b, F=0x0
+0,        132,        132,        1,      351, 0x99e78bb8, F=0x0
+0,        133,        133,        1,      170, 0x9f4b3869, F=0x0
+0,        134,        134,        1,      275, 0x29b96b3c, F=0x0
+0,        135,        135,        1,      168, 0x98d0399b, F=0x0
+0,        136,        136,        1,      169, 0x015039aa, F=0x0
+0,        137,        137,        1,      521, 0x3c33db57, F=0x0
+0,        138,        138,        1,     1262, 0x9cf44321, F=0x0
+0,        139,        139,        1,      994, 0x5ea8bcd4, F=0x0
+0,        140,        140,        1,      290, 0xf24f72b0, F=0x0
+0,        141,        141,        1,      188, 0x36cb408f, F=0x0
+0,        142,        142,        1,      164, 0x6c813b02, F=0x0
+0,        143,        143,        1,      212, 0x1dfb463e, F=0x0
+0,        144,        144,        1,      870, 0xd89e94ed, F=0x0
+0,        145,        145,        1,      635, 0x87bf1ae2, F=0x0
+0,        146,        146,        1,      290, 0x34ff78fe, F=0x0
+0,        147,        147,        1,      211, 0x9f755207, F=0x0
+0,        148,        148,        1,      177, 0x3f003c44, F=0x0
+0,        149,        149,        1,      182, 0xe8c23eea, F=0x0
+0,        150,        150,        1,      588, 0xb4b9fc5d, F=0x0
+0,        151,        151,        1,      163, 0x3078356b, F=0x0
+0,        152,        152,        1,      407, 0x4161b245, F=0x0
+0,        153,        153,        1,      204, 0xe2a64478, F=0x0
+0,        154,        154,        1,      290, 0x5cc079af, F=0x0
+0,        155,        155,        1,      308, 0xf5958253, F=0x0
+0,        156,        156,        1,      196, 0xb1cb46f0, F=0x0
+0,        157,        157,        1,      181, 0x0aee4103, F=0x0
+0,        158,        158,        1,      203, 0x36784ee0, F=0x0
+0,        159,        159,        1,      227, 0x23fd5b71, F=0x0
+0,        160,        160,        1,      524, 0x18a6e404, F=0x0
+0,        161,        161,        1,      377, 0x1f5697de, F=0x0
+0,        162,        162,        1,      196, 0x72304538, F=0x0
+0,        163,        163,        1,      250, 0xb8e46580, F=0x0
+0,        164,        164,        1,      214, 0xe9df51b6, F=0x0
+0,        165,        165,        1,      323, 0xacbb9067, F=0x0
+0,        166,        166,        1,      176, 0xa12a410c, F=0x0
+0,        167,        167,        1,      305, 0x21227d7a, F=0x0
+0,        168,        168,        1,      179, 0x3dac422b, F=0x0
+0,        169,        169,        1,      245, 0x948963cd, F=0x0
+0,        170,        170,        1,      181, 0x407140fb, F=0x0
+0,        171,        171,        1,      241, 0xd2a35a7a, F=0x0
+0,        172,        172,        1,      172, 0x9fa83e96, F=0x0
diff --git a/tests/ref/fate/gifenc-bgr8 b/tests/ref/fate/gifenc-bgr8
index 0a4e5d4..d4a42b0 100644
--- a/tests/ref/fate/gifenc-bgr8
+++ b/tests/ref/fate/gifenc-bgr8
@@ -3,176 +3,176 @@
 #codec_id 0: gif
 #dimensions 0: 217x217
 #sar 0: 0/1
-0,          0,          0,        1,      552, 0x271a2dd3
-0,          1,          1,        1,      297, 0x90168a95, S=1,     1024, 0xf351799f
-0,          2,          2,        1,      438, 0x91efce1b, S=1,     1024, 0xf351799f
-0,          3,          3,        1,      450, 0x7c2dcfad, S=1,     1024, 0xf351799f
-0,          4,          4,        1,      547, 0xc131fd3b, S=1,     1024, 0xf351799f
-0,          5,          5,        1,      614, 0x68182006, S=1,     1024, 0xf351799f
-0,          6,          6,        1,      642, 0x78bb1f5f, S=1,     1024, 0xf351799f
-0,          7,          7,        1,      660, 0x35c033a2, S=1,     1024, 0xf351799f
-0,          8,          8,        1,      821, 0xaf30790b, S=1,     1024, 0xf351799f
-0,          9,          9,        1,     1157, 0x741c2da1, S=1,     1024, 0xf351799f
-0,         10,         10,        1,      179, 0x3a27517c, S=1,     1024, 0xf351799f
-0,         11,         11,        1,     1333, 0x5ee76f3c, S=1,     1024, 0xf351799f
-0,         12,         12,        1,     1638, 0x5f640e86, S=1,     1024, 0xf351799f
-0,         13,         13,        1,     1531, 0xccb8e437, S=1,     1024, 0xf351799f
-0,         14,         14,        1,     1720, 0xc95d45ec, S=1,     1024, 0xf351799f
-0,         15,         15,        1,     1910, 0x56cc831e, S=1,     1024, 0xf351799f
-0,         16,         16,        1,     2124, 0x9cc8e130, S=1,     1024, 0xf351799f
-0,         17,         17,        1,     2248, 0x05a325b1, S=1,     1024, 0xf351799f
-0,         18,         18,        1,     2311, 0xdc633703, S=1,     1024, 0xf351799f
-0,         19,         19,        1,     2408, 0x91c26f3e, S=1,     1024, 0xf351799f
-0,         20,         20,        1,     2601, 0x8cf3c157, S=1,     1024, 0xf351799f
-0,         21,         21,        1,     2687, 0x8f6400e6, S=1,     1024, 0xf351799f
-0,         22,         22,        1,     2784, 0xaa880e55, S=1,     1024, 0xf351799f
-0,         23,         23,        1,     2884, 0x46f546f6, S=1,     1024, 0xf351799f
-0,         24,         24,        1,     2982, 0x807c7ad5, S=1,     1024, 0xf351799f
-0,         25,         25,        1,     3101, 0xbcc89bec, S=1,     1024, 0xf351799f
-0,         26,         26,        1,     3253, 0xd032f3fa, S=1,     1024, 0xf351799f
-0,         27,         27,        1,     3329, 0xe4d42430, S=1,     1024, 0xf351799f
-0,         28,         28,        1,     3572, 0xf8058aa0, S=1,     1024, 0xf351799f
-0,         29,         29,        1,     3807, 0x3d2af9f3, S=1,     1024, 0xf351799f
-0,         30,         30,        1,     2750, 0x814d1c33, S=1,     1024, 0xf351799f
-0,         31,         31,        1,     4031, 0x3b077006, S=1,     1024, 0xf351799f
-0,         32,         32,        1,     3025, 0x86729c1c, S=1,     1024, 0xf351799f
-0,         33,         33,        1,     4295, 0xf71b0b38, S=1,     1024, 0xf351799f
-0,         34,         34,        1,     2044, 0x5adcb93b, S=1,     1024, 0xf351799f
-0,         35,         35,        1,     3212, 0xcf79eeed, S=1,     1024, 0xf351799f
-0,         36,         36,        1,     2292, 0xb4386334, S=1,     1024, 0xf351799f
-0,         37,         37,        1,     3633, 0x0010992f, S=1,     1024, 0xf351799f
-0,         38,         38,        1,     3552, 0x23697490, S=1,     1024, 0xf351799f
-0,         39,         39,        1,     3690, 0x62afdbb8, S=1,     1024, 0xf351799f
-0,         40,         40,        1,     1559, 0x5baef54a, S=1,     1024, 0xf351799f
-0,         41,         41,        1,      954, 0xca75ca79, S=1,     1024, 0xf351799f
-0,         42,         42,        1,      273, 0x3687799b, S=1,     1024, 0xf351799f
-0,         43,         43,        1,      930, 0x29f3b0c4, S=1,     1024, 0xf351799f
-0,         44,         44,        1,      271, 0x305e8094, S=1,     1024, 0xf351799f
-0,         45,         45,        1,      196, 0xf5ab51ee, S=1,     1024, 0xf351799f
-0,         46,         46,        1,     4299, 0x67ec0d55, S=1,     1024, 0xf351799f
-0,         47,         47,        1,     4895, 0xb394406c, S=1,     1024, 0xf351799f
-0,         48,         48,        1,     4928, 0x233919d7, S=1,     1024, 0xf351799f
-0,         49,         49,        1,     4941, 0x58a357da, S=1,     1024, 0xf351799f
-0,         50,         50,        1,     4154, 0x21f2ac33, S=1,     1024, 0xf351799f
-0,         51,         51,        1,     4678, 0xab3cc050, S=1,     1024, 0xf351799f
-0,         52,         52,        1,     4741, 0x1974b581, S=1,     1024, 0xf351799f
-0,         53,         53,        1,     4982, 0x891456d5, S=1,     1024, 0xf351799f
-0,         54,         54,        1,     5179, 0x860fc6a1, S=1,     1024, 0xf351799f
-0,         55,         55,        1,     5046, 0xce9183d3, S=1,     1024, 0xf351799f
-0,         56,         56,        1,     5140, 0xa6d7b9af, S=1,     1024, 0xf351799f
-0,         57,         57,        1,     4301, 0x03b6ef3f, S=1,     1024, 0xf351799f
-0,         58,         58,        1,     5079, 0xa8d59e01, S=1,     1024, 0xf351799f
-0,         59,         59,        1,     5284, 0xea34e3b3, S=1,     1024, 0xf351799f
-0,         60,         60,        1,     5426, 0x556a15cd, S=1,     1024, 0xf351799f
-0,         61,         61,        1,     4645, 0x061e8936, S=1,     1024, 0xf351799f
-0,         62,         62,        1,     5263, 0x7536cf7d, S=1,     1024, 0xf351799f
-0,         63,         63,        1,     5221, 0x9fbac3ca, S=1,     1024, 0xf351799f
-0,         64,         64,        1,     5217, 0x02269bd2, S=1,     1024, 0xf351799f
-0,         65,         65,        1,     5395, 0x120fff66, S=1,     1024, 0xf351799f
-0,         66,         66,        1,     5220, 0x77cedcc5, S=1,     1024, 0xf351799f
-0,         67,         67,        1,     5704, 0xba42dd96, S=1,     1024, 0xf351799f
-0,         68,         68,        1,     5636, 0xcb91a25b, S=1,     1024, 0xf351799f
-0,         69,         69,        1,     5818, 0x8dc0df92, S=1,     1024, 0xf351799f
-0,         70,         70,        1,     5763, 0x51d5d5f0, S=1,     1024, 0xf351799f
-0,         71,         71,        1,     6116, 0x09558b48, S=1,     1024, 0xf351799f
-0,         72,         72,        1,     6069, 0x41926817, S=1,     1024, 0xf351799f
-0,         73,         73,        1,     5796, 0x7fbeda44, S=1,     1024, 0xf351799f
-0,         74,         74,        1,     5999, 0xe07d3770, S=1,     1024, 0xf351799f
-0,         75,         75,        1,     6220, 0x6607b06f, S=1,     1024, 0xf351799f
-0,         76,         76,        1,     6374, 0x7628e533, S=1,     1024, 0xf351799f
-0,         77,         77,        1,     6465, 0xfe956b15, S=1,     1024, 0xf351799f
-0,         78,         78,        1,     7019, 0x6c9a1aef, S=1,     1024, 0xf351799f
-0,         79,         79,        1,     7255, 0x5fa5c1bf, S=1,     1024, 0xf351799f
-0,         80,         80,        1,     8197, 0xf11d6ef2, S=1,     1024, 0xf351799f
-0,         81,         81,        1,     8358, 0x027279e8, S=1,     1024, 0xf351799f
-0,         82,         82,        1,     7708, 0x607f8e8b, S=1,     1024, 0xf351799f
-0,         83,         83,        1,     7412, 0x6bb2105f, S=1,     1024, 0xf351799f
-0,         84,         84,        1,     7541, 0xfdc02154, S=1,     1024, 0xf351799f
-0,         85,         85,        1,     7948, 0x916ecd8b, S=1,     1024, 0xf351799f
-0,         86,         86,        1,     8408, 0x1f97d414, S=1,     1024, 0xf351799f
-0,         87,         87,        1,     8056, 0x9cbf159c, S=1,     1024, 0xf351799f
-0,         88,         88,        1,     7401, 0x2625addb, S=1,     1024, 0xf351799f
-0,         89,         89,        1,     7494, 0x2877eacb, S=1,     1024, 0xf351799f
-0,         90,         90,        1,     7806, 0xe32574a3, S=1,     1024, 0xf351799f
-0,         91,         91,        1,     7768, 0x25ed7ee7, S=1,     1024, 0xf351799f
-0,         92,         92,        1,     7749, 0x6d8e978e, S=1,     1024, 0xf351799f
-0,         93,         93,        1,     8047, 0xec4b150c, S=1,     1024, 0xf351799f
-0,         94,         94,        1,     7618, 0x88cf30d5, S=1,     1024, 0xf351799f
-0,         95,         95,        1,     7979, 0x0eb1cf2a, S=1,     1024, 0xf351799f
-0,         96,         96,        1,    12062, 0xb49d9125, S=1,     1024, 0xf351799f
-0,         97,         97,        1,    12317, 0x2d8fd6e9, S=1,     1024, 0xf351799f
-0,         98,         98,        1,    12217, 0x9b3be549, S=1,     1024, 0xf351799f
-0,         99,         99,        1,    11227, 0x067e9118, S=1,     1024, 0xf351799f
-0,        100,        100,        1,    11108, 0x5e5b0afd, S=1,     1024, 0xf351799f
-0,        101,        101,        1,    11366, 0xb38e8d15, S=1,     1024, 0xf351799f
-0,        102,        102,        1,    11896, 0xeb3e35ca, S=1,     1024, 0xf351799f
-0,        103,        103,        1,    11479, 0xbf7581e9, S=1,     1024, 0xf351799f
-0,        104,        104,        1,    13395, 0x415b38d8, S=1,     1024, 0xf351799f
-0,        105,        105,        1,    12913, 0x61544631, S=1,     1024, 0xf351799f
-0,        106,        106,        1,    13864, 0xd39fe768, S=1,     1024, 0xf351799f
-0,        107,        107,        1,    13551, 0x76c167d1, S=1,     1024, 0xf351799f
-0,        108,        108,        1,    14041, 0x2f206888, S=1,     1024, 0xf351799f
-0,        109,        109,        1,    14144, 0x9ec030d3, S=1,     1024, 0xf351799f
-0,        110,        110,        1,    14277, 0xa84b3a9b, S=1,     1024, 0xf351799f
-0,        111,        111,        1,    14424, 0xf5f1e06e, S=1,     1024, 0xf351799f
-0,        112,        112,        1,    14689, 0xbca0adb5, S=1,     1024, 0xf351799f
-0,        113,        113,        1,    14598, 0xc1d45745, S=1,     1024, 0xf351799f
-0,        114,        114,        1,    15213, 0x8f3080fc, S=1,     1024, 0xf351799f
-0,        115,        115,        1,    15425, 0xb0aa8f59, S=1,     1024, 0xf351799f
-0,        116,        116,        1,    15595, 0x1406e5d5, S=1,     1024, 0xf351799f
-0,        117,        117,        1,    15598, 0x48ec7d08, S=1,     1024, 0xf351799f
-0,        118,        118,        1,    15863, 0x5381db7b, S=1,     1024, 0xf351799f
-0,        119,        119,        1,    15717, 0xb87a1b87, S=1,     1024, 0xf351799f
-0,        120,        120,        1,    16078, 0x5bab2453, S=1,     1024, 0xf351799f
-0,        121,        121,        1,    16225, 0xa1f88113, S=1,     1024, 0xf351799f
-0,        122,        122,        1,    16135, 0x6af2f4e1, S=1,     1024, 0xf351799f
-0,        123,        123,        1,    16661, 0xf02a3343, S=1,     1024, 0xf351799f
-0,        124,        124,        1,    16619, 0xc71935a4, S=1,     1024, 0xf351799f
-0,        125,        125,        1,    16829, 0x29849844, S=1,     1024, 0xf351799f
-0,        126,        126,        1,    16944, 0x3423ae77, S=1,     1024, 0xf351799f
-0,        127,        127,        1,    17119, 0x609b4409, S=1,     1024, 0xf351799f
-0,        128,        128,        1,    17150, 0xf85dfd31, S=1,     1024, 0xf351799f
-0,        129,        129,        1,    17321, 0x38eccb10, S=1,     1024, 0xf351799f
-0,        130,        130,        1,    17395, 0x0ba08b85, S=1,     1024, 0xf351799f
-0,        131,        131,        1,    17666, 0x6fbc0264, S=1,     1024, 0xf351799f
-0,        132,        132,        1,    17730, 0x3dcc64a6, S=1,     1024, 0xf351799f
-0,        133,        133,        1,    17934, 0xb539974b, S=1,     1024, 0xf351799f
-0,        134,        134,        1,    17944, 0x2214ec94, S=1,     1024, 0xf351799f
-0,        135,        135,        1,    18238, 0x70f9ff1d, S=1,     1024, 0xf351799f
-0,        136,        136,        1,    18391, 0x4b149209, S=1,     1024, 0xf351799f
-0,        137,        137,        1,    18543, 0x45a1c02f, S=1,     1024, 0xf351799f
-0,        138,        138,        1,    18939, 0x2789a88c, S=1,     1024, 0xf351799f
-0,        139,        139,        1,    19145, 0x5daafd7a, S=1,     1024, 0xf351799f
-0,        140,        140,        1,    19120, 0x565f80e6, S=1,     1024, 0xf351799f
-0,        141,        141,        1,    19130, 0xff70cc21, S=1,     1024, 0xf351799f
-0,        142,        142,        1,    19494, 0xbfa284db, S=1,     1024, 0xf351799f
-0,        143,        143,        1,    19534, 0x3d40743b, S=1,     1024, 0xf351799f
-0,        144,        144,        1,    19747, 0x33c9b108, S=1,     1024, 0xf351799f
-0,        145,        145,        1,    20114, 0x9d223e36, S=1,     1024, 0xf351799f
-0,        146,        146,        1,    20257, 0xe7bdaf43, S=1,     1024, 0xf351799f
-0,        147,        147,        1,    20370, 0x0c5f1970, S=1,     1024, 0xf351799f
-0,        148,        148,        1,    20292, 0x6986d20e, S=1,     1024, 0xf351799f
-0,        149,        149,        1,    20491, 0xd88e4c08, S=1,     1024, 0xf351799f
-0,        150,        150,        1,    20647, 0x1aefaffc, S=1,     1024, 0xf351799f
-0,        151,        151,        1,    20666, 0x43e4aaaa, S=1,     1024, 0xf351799f
-0,        152,        152,        1,    21007, 0xa7ca3ef0, S=1,     1024, 0xf351799f
-0,        153,        153,        1,    21058, 0x06814351, S=1,     1024, 0xf351799f
-0,        154,        154,        1,    21153, 0x3c852b10, S=1,     1024, 0xf351799f
-0,        155,        155,        1,    21078, 0x8df15855, S=1,     1024, 0xf351799f
-0,        156,        156,        1,    21458, 0xd3a531d6, S=1,     1024, 0xf351799f
-0,        157,        157,        1,    21669, 0x88baca53, S=1,     1024, 0xf351799f
-0,        158,        158,        1,    21581, 0xd692fa1f, S=1,     1024, 0xf351799f
-0,        159,        159,        1,    21654, 0x30fb9061, S=1,     1024, 0xf351799f
-0,        160,        160,        1,    21987, 0xe7646d8b, S=1,     1024, 0xf351799f
-0,        161,        161,        1,    22205, 0x0fc55b6a, S=1,     1024, 0xf351799f
-0,        162,        162,        1,    22475, 0x4bc4c032, S=1,     1024, 0xf351799f
-0,        163,        163,        1,    22490, 0x58ca23f6, S=1,     1024, 0xf351799f
-0,        164,        164,        1,    22460, 0xf9ceb0ac, S=1,     1024, 0xf351799f
-0,        165,        165,        1,    22861, 0xb05f0f84, S=1,     1024, 0xf351799f
-0,        166,        166,        1,    22746, 0x0df23a5c, S=1,     1024, 0xf351799f
-0,        167,        167,        1,    23165, 0xbd7147ad, S=1,     1024, 0xf351799f
-0,        168,        168,        1,    23273, 0x9781a34f, S=1,     1024, 0xf351799f
-0,        169,        169,        1,    23211, 0x69c7606b, S=1,     1024, 0xf351799f
-0,        170,        170,        1,    23648, 0xdafde037, S=1,     1024, 0xf351799f
-0,        171,        171,        1,    23675, 0x2a2147ed, S=1,     1024, 0xf351799f
-0,        172,        172,        1,    23874, 0x12c184b6, S=1,     1024, 0xf351799f
+0,          0,          0,        1,     1341, 0xe4e2af18
+0,          1,          1,        1,      236, 0x332769fd, F=0x0
+0,          2,          2,        1,      186, 0x770d5061, F=0x0
+0,          3,          3,        1,      208, 0x55784c8f, F=0x0
+0,          4,          4,        1,      282, 0x98e8825d, F=0x0
+0,          5,          5,        1,      209, 0x4cc15280, F=0x0
+0,          6,          6,        1,      225, 0xf8785d6c, F=0x0
+0,          7,          7,        1,      204, 0x322754b4, F=0x0
+0,          8,          8,        1,      181, 0x9f4f4d10, F=0x0
+0,          9,          9,        1,      200, 0x64a453a1, F=0x0
+0,         10,         10,        1,      184, 0x79c344d3, F=0x0
+0,         11,         11,        1,      191, 0x7097487b, F=0x0
+0,         12,         12,        1,      290, 0x1f998186, F=0x0
+0,         13,         13,        1,      153, 0xfe4c3a7c, F=0x0
+0,         14,         14,        1,      175, 0xfdf442e0, F=0x0
+0,         15,         15,        1,      187, 0x393845f2, F=0x0
+0,         16,         16,        1,      418, 0xe94bc757, F=0x0
+0,         17,         17,        1,      200, 0x8dab52be, F=0x0
+0,         18,         18,        1,      347, 0xae379838, F=0x0
+0,         19,         19,        1,      176, 0x868742d2, F=0x0
+0,         20,         20,        1,      294, 0xb1fb8365, F=0x0
+0,         21,         21,        1,      166, 0x06e44260, F=0x0
+0,         22,         22,        1,      306, 0x29e983b7, F=0x0
+0,         23,         23,        1,      180, 0xfa4a44eb, F=0x0
+0,         24,         24,        1,      207, 0x99de52c8, F=0x0
+0,         25,         25,        1,      204, 0x73944c35, F=0x0
+0,         26,         26,        1,      259, 0xa0637375, F=0x0
+0,         27,         27,        1,      181, 0x130f4b9a, F=0x0
+0,         28,         28,        1,      152, 0x4be93cae, F=0x0
+0,         29,         29,        1,      194, 0x81e34e1d, F=0x0
+0,         30,         30,        1,      159, 0x5913380b, F=0x0
+0,         31,         31,        1,      162, 0xf0683bb1, F=0x0
+0,         32,         32,        1,      178, 0xce32498c, F=0x0
+0,         33,         33,        1,      187, 0x5d61509f, F=0x0
+0,         34,         34,        1,      336, 0xe5569440, F=0x0
+0,         35,         35,        1,      184, 0x3fa349ea, F=0x0
+0,         36,         36,        1,      227, 0x7cad5f66, F=0x0
+0,         37,         37,        1,      182, 0xf23a4522, F=0x0
+0,         38,         38,        1,      162, 0x2a053dcc, F=0x0
+0,         39,         39,        1,      187, 0xc18a4686, F=0x0
+0,         40,         40,        1,      503, 0xa5a7e669, F=0x0
+0,         41,         41,        1,      167, 0xa28a43e8, F=0x0
+0,         42,         42,        1,      289, 0xf1968090, F=0x0
+0,         43,         43,        1,      194, 0xedbb4eb7, F=0x0
+0,         44,         44,        1,      285, 0x82e7818b, F=0x0
+0,         45,         45,        1,      199, 0x5e725190, F=0x0
+0,         46,         46,        1,      197, 0x0c6a4fb9, F=0x0
+0,         47,         47,        1,      203, 0x05684b96, F=0x0
+0,         48,         48,        1,      208, 0xd33457ad, F=0x0
+0,         49,         49,        1,     1198, 0x029f5f1b, F=0x0
+0,         50,         50,        1,      175, 0xf4e94c40, F=0x0
+0,         51,         51,        1,      740, 0x6e096787, F=0x0
+0,         52,         52,        1,      180, 0xf34f45be, F=0x0
+0,         53,         53,        1,      238, 0xfbed6adb, F=0x0
+0,         54,         54,        1,      198, 0x6f3a5344, F=0x0
+0,         55,         55,        1,      196, 0x8bbb4b02, F=0x0
+0,         56,         56,        1,      224, 0x92c55d92, F=0x0
+0,         57,         57,        1,      765, 0xd16e6d65, F=0x0
+0,         58,         58,        1,      149, 0x97aa38d2, F=0x0
+0,         59,         59,        1,      479, 0x1030d73b, F=0x0
+0,         60,         60,        1,      179, 0x441e493a, F=0x0
+0,         61,         61,        1,      217, 0x16c259b7, F=0x0
+0,         62,         62,        1,      190, 0x5b2349ca, F=0x0
+0,         63,         63,        1,      155, 0x422f39ff, F=0x0
+0,         64,         64,        1,      167, 0x28444898, F=0x0
+0,         65,         65,        1,      649, 0x57b331e2, F=0x0
+0,         66,         66,        1,      196, 0x99a1574f, F=0x0
+0,         67,         67,        1,      427, 0xfd45d548, F=0x0
+0,         68,         68,        1,      175, 0x90cc42ce, F=0x0
+0,         69,         69,        1,      284, 0x49398208, F=0x0
+0,         70,         70,        1,      131, 0x18e42fc2, F=0x0
+0,         71,         71,        1,      256, 0xac896bbe, F=0x0
+0,         72,         72,        1,      186, 0x522d4974, F=0x0
+0,         73,         73,        1,      190, 0x5e064e04, F=0x0
+0,         74,         74,        1,      216, 0x863f53fa, F=0x0
+0,         75,         75,        1,      154, 0x17f1383f, F=0x0
+0,         76,         76,        1,      113, 0x20f827ee, F=0x0
+0,         77,         77,        1,      402, 0xce2caf45, F=0x0
+0,         78,         78,        1,      198, 0x0bc851ae, F=0x0
+0,         79,         79,        1,      466, 0xb31ad387, F=0x0
+0,         80,         80,        1,      322, 0x20018e02, F=0x0
+0,         81,         81,        1,      387, 0x5038b1b8, F=0x0
+0,         82,         82,        1,      158, 0xc6ac3feb, F=0x0
+0,         83,         83,        1,      278, 0x59f17c03, F=0x0
+0,         84,         84,        1,      190, 0xd7665022, F=0x0
+0,         85,         85,        1,      175, 0x1a6e4225, F=0x0
+0,         86,         86,        1,      206, 0xc3f44e3a, F=0x0
+0,         87,         87,        1,      379, 0xb1e6b77e, F=0x0
+0,         88,         88,        1,      202, 0x17975145, F=0x0
+0,         89,         89,        1,      225, 0x96985fd2, F=0x0
+0,         90,         90,        1,      175, 0x71b1497a, F=0x0
+0,         91,         91,        1,      235, 0x2bdc5faa, F=0x0
+0,         92,         92,        1,      185, 0x68124958, F=0x0
+0,         93,         93,        1,      182, 0x120c4c63, F=0x0
+0,         94,         94,        1,      114, 0xdd9b2b02, F=0x0
+0,         95,         95,        1,      176, 0x0d5b4b46, F=0x0
+0,         96,         96,        1,      214, 0xfb5e5b47, F=0x0
+0,         97,         97,        1,      182, 0xf4c54860, F=0x0
+0,         98,         98,        1,      195, 0x6e075188, F=0x0
+0,         99,         99,        1,      303, 0x4c158465, F=0x0
+0,        100,        100,        1,      191, 0x12005055, F=0x0
+0,        101,        101,        1,      177, 0x01ed4929, F=0x0
+0,        102,        102,        1,      172, 0x86984280, F=0x0
+0,        103,        103,        1,      179, 0xb854481c, F=0x0
+0,        104,        104,        1,      188, 0xeacd47ed, F=0x0
+0,        105,        105,        1,      177, 0x36be4889, F=0x0
+0,        106,        106,        1,      215, 0x6aa65c99, F=0x0
+0,        107,        107,        1,      339, 0x1af496b2, F=0x0
+0,        108,        108,        1,      189, 0x941045fa, F=0x0
+0,        109,        109,        1,      209, 0x37445651, F=0x0
+0,        110,        110,        1,      205, 0x9cf85222, F=0x0
+0,        111,        111,        1,      185, 0x8b964cb5, F=0x0
+0,        112,        112,        1,      211, 0xd03d59ce, F=0x0
+0,        113,        113,        1,      178, 0xe40e4c08, F=0x0
+0,        114,        114,        1,      195, 0x971d4d92, F=0x0
+0,        115,        115,        1,      116, 0x5f9a2d3f, F=0x0
+0,        116,        116,        1,      116, 0x5c4e2d06, F=0x0
+0,        117,        117,        1,      427, 0x6128c7da, F=0x0
+0,        118,        118,        1,      182, 0x8a9a4a85, F=0x0
+0,        119,        119,        1,      267, 0x94e16d98, F=0x0
+0,        120,        120,        1,      191, 0x8cd6499b, F=0x0
+0,        121,        121,        1,      195, 0x2955524a, F=0x0
+0,        122,        122,        1,      755, 0x21115eef, F=0x0
+0,        123,        123,        1,      179, 0x89ff45fd, F=0x0
+0,        124,        124,        1,      522, 0x1b1cf19d, F=0x0
+0,        125,        125,        1,      171, 0x48034194, F=0x0
+0,        126,        126,        1,      379, 0x3914a793, F=0x0
+0,        127,        127,        1,      539, 0x7155fc34, F=0x0
+0,        128,        128,        1,      199, 0xb8674f8a, F=0x0
+0,        129,        129,        1,      458, 0x0a87ce97, F=0x0
+0,        130,        130,        1,      177, 0xac704b44, F=0x0
+0,        131,        131,        1,      299, 0x49318aa9, F=0x0
+0,        132,        132,        1,      333, 0xa188949d, F=0x0
+0,        133,        133,        1,      179, 0x2474436d, F=0x0
+0,        134,        134,        1,      263, 0x84e871f8, F=0x0
+0,        135,        135,        1,      177, 0xf7904597, F=0x0
+0,        136,        136,        1,      184, 0xb053486d, F=0x0
+0,        137,        137,        1,      433, 0xd3c0c5a1, F=0x0
+0,        138,        138,        1,     1138, 0xd5af3462, F=0x0
+0,        139,        139,        1,      863, 0xdce99f4f, F=0x0
+0,        140,        140,        1,      328, 0x608a949d, F=0x0
+0,        141,        141,        1,      222, 0xecb75a19, F=0x0
+0,        142,        142,        1,      171, 0x6cf94548, F=0x0
+0,        143,        143,        1,      222, 0xcf8d5778, F=0x0
+0,        144,        144,        1,      738, 0x9cf358a2, F=0x0
+0,        145,        145,        1,      444, 0x3798cdf6, F=0x0
+0,        146,        146,        1,      267, 0x8ca87717, F=0x0
+0,        147,        147,        1,      187, 0x4d734c80, F=0x0
+0,        148,        148,        1,      186, 0x9def4fb6, F=0x0
+0,        149,        149,        1,      196, 0x49214f94, F=0x0
+0,        150,        150,        1,      589, 0x02e2142f, F=0x0
+0,        151,        151,        1,      188, 0x285c4dad, F=0x0
+0,        152,        152,        1,      339, 0x8a0fa092, F=0x0
+0,        153,        153,        1,      179, 0x775543d4, F=0x0
+0,        154,        154,        1,      294, 0x0c8885eb, F=0x0
+0,        155,        155,        1,      291, 0xd78084b1, F=0x0
+0,        156,        156,        1,      144, 0xd7323963, F=0x0
+0,        157,        157,        1,      182, 0x97194ede, F=0x0
+0,        158,        158,        1,      195, 0x410f50a6, F=0x0
+0,        159,        159,        1,      268, 0xb878789a, F=0x0
+0,        160,        160,        1,      526, 0x6e13fb3e, F=0x0
+0,        161,        161,        1,      372, 0xf1fca999, F=0x0
+0,        162,        162,        1,      171, 0x86033fb7, F=0x0
+0,        163,        163,        1,      344, 0x8db8a374, F=0x0
+0,        164,        164,        1,      159, 0xa3463fb6, F=0x0
+0,        165,        165,        1,      391, 0x6ab1aa7d, F=0x0
+0,        166,        166,        1,      180, 0x55d04d01, F=0x0
+0,        167,        167,        1,      303, 0xac779365, F=0x0
+0,        168,        168,        1,      180, 0x54e94840, F=0x0
+0,        169,        169,        1,      269, 0x56e57720, F=0x0
+0,        170,        170,        1,      199, 0x510b5589, F=0x0
+0,        171,        171,        1,      287, 0xd70d8529, F=0x0
+0,        172,        172,        1,      217, 0x04a0649e, F=0x0
diff --git a/tests/ref/fate/gifenc-gray b/tests/ref/fate/gifenc-gray
index 81cdd18..324aff4 100644
--- a/tests/ref/fate/gifenc-gray
+++ b/tests/ref/fate/gifenc-gray
@@ -3,176 +3,176 @@
 #codec_id 0: gif
 #dimensions 0: 217x217
 #sar 0: 0/1
-0,          0,          0,        1,      579, 0x0d0e3ab8
-0,          1,          1,        1,      150, 0x178b3a8c, S=1,     1024, 0xc2f67c9f
-0,          2,          2,        1,      155, 0x941743f5, S=1,     1024, 0xc2f67c9f
-0,          3,          3,        1,      144, 0x68c73711, S=1,     1024, 0xc2f67c9f
-0,          4,          4,        1,      152, 0xaf9a3f2e, S=1,     1024, 0xc2f67c9f
-0,          5,          5,        1,      136, 0x68593d85, S=1,     1024, 0xc2f67c9f
-0,          6,          6,        1,      134, 0x0dcb373f, S=1,     1024, 0xc2f67c9f
-0,          7,          7,        1,      129, 0x3baf3279, S=1,     1024, 0xc2f67c9f
-0,          8,          8,        1,      123, 0x9c963148, S=1,     1024, 0xc2f67c9f
-0,          9,          9,        1,      123, 0x5c272d6b, S=1,     1024, 0xc2f67c9f
-0,         10,         10,        1,      150, 0x5f8d41aa, S=1,     1024, 0xc2f67c9f
-0,         11,         11,        1,      134, 0x6f582fee, S=1,     1024, 0xc2f67c9f
-0,         12,         12,        1,      134, 0x85d53038, S=1,     1024, 0xc2f67c9f
-0,         13,         13,        1,      123, 0x6d2a2cb2, S=1,     1024, 0xc2f67c9f
-0,         14,         14,        1,      127, 0x1e78327b, S=1,     1024, 0xc2f67c9f
-0,         15,         15,        1,      119, 0xbafc2c31, S=1,     1024, 0xc2f67c9f
-0,         16,         16,        1,      138, 0x57553638, S=1,     1024, 0xc2f67c9f
-0,         17,         17,        1,      140, 0xf7423adb, S=1,     1024, 0xc2f67c9f
-0,         18,         18,        1,      122, 0x7e592f8b, S=1,     1024, 0xc2f67c9f
-0,         19,         19,        1,      123, 0xaa7d313c, S=1,     1024, 0xc2f67c9f
-0,         20,         20,        1,      140, 0x4fd63b34, S=1,     1024, 0xc2f67c9f
-0,         21,         21,        1,      123, 0x67753163, S=1,     1024, 0xc2f67c9f
-0,         22,         22,        1,      123, 0x02193147, S=1,     1024, 0xc2f67c9f
-0,         23,         23,        1,      124, 0xa85131e9, S=1,     1024, 0xc2f67c9f
-0,         24,         24,        1,      122, 0xef8731e2, S=1,     1024, 0xc2f67c9f
-0,         25,         25,        1,      122, 0x06d432c9, S=1,     1024, 0xc2f67c9f
-0,         26,         26,        1,      123, 0xcc8831cd, S=1,     1024, 0xc2f67c9f
-0,         27,         27,        1,      118, 0xa1d33166, S=1,     1024, 0xc2f67c9f
-0,         28,         28,        1,      159, 0xcc8c454c, S=1,     1024, 0xc2f67c9f
-0,         29,         29,        1,      140, 0x8a0231ad, S=1,     1024, 0xc2f67c9f
-0,         30,         30,        1,      163, 0xe78248d2, S=1,     1024, 0xc2f67c9f
-0,         31,         31,        1,      142, 0x3b293489, S=1,     1024, 0xc2f67c9f
-0,         32,         32,        1,      170, 0x5f504b12, S=1,     1024, 0xc2f67c9f
-0,         33,         33,        1,      146, 0x38a53693, S=1,     1024, 0xc2f67c9f
-0,         34,         34,        1,      132, 0xb18a3499, S=1,     1024, 0xc2f67c9f
-0,         35,         35,        1,      113, 0x55182bda, S=1,     1024, 0xc2f67c9f
-0,         36,         36,        1,      132, 0xaced3333, S=1,     1024, 0xc2f67c9f
-0,         37,         37,        1,      120, 0x9ffe2e4f, S=1,     1024, 0xc2f67c9f
-0,         38,         38,        1,      135, 0x6223351e, S=1,     1024, 0xc2f67c9f
-0,         39,         39,        1,      123, 0x269b3058, S=1,     1024, 0xc2f67c9f
-0,         40,         40,        1,      119, 0x17052def, S=1,     1024, 0xc2f67c9f
-0,         41,         41,        1,      119, 0x36da2ee2, S=1,     1024, 0xc2f67c9f
-0,         42,         42,        1,      120, 0x984e31be, S=1,     1024, 0xc2f67c9f
-0,         43,         43,        1,      114, 0xfd382c9d, S=1,     1024, 0xc2f67c9f
-0,         44,         44,        1,      125, 0x926a36c6, S=1,     1024, 0xc2f67c9f
-0,         45,         45,        1,      117, 0xbceb3183, S=1,     1024, 0xc2f67c9f
-0,         46,         46,        1,      116, 0xf4c72d82, S=1,     1024, 0xc2f67c9f
-0,         47,         47,        1,      124, 0x0c19343c, S=1,     1024, 0xc2f67c9f
-0,         48,         48,        1,      117, 0x1f032eb1, S=1,     1024, 0xc2f67c9f
-0,         49,         49,        1,      135, 0x31a437e6, S=1,     1024, 0xc2f67c9f
-0,         50,         50,        1,      131, 0x4c1735fe, S=1,     1024, 0xc2f67c9f
-0,         51,         51,        1,      122, 0xb7603463, S=1,     1024, 0xc2f67c9f
-0,         52,         52,        1,      122, 0x7f5e34e1, S=1,     1024, 0xc2f67c9f
-0,         53,         53,        1,      124, 0x9562350f, S=1,     1024, 0xc2f67c9f
-0,         54,         54,        1,      126, 0x18b33759, S=1,     1024, 0xc2f67c9f
-0,         55,         55,        1,      117, 0x748f3243, S=1,     1024, 0xc2f67c9f
-0,         56,         56,        1,      109, 0x72832fe7, S=1,     1024, 0xc2f67c9f
-0,         57,         57,        1,      120, 0x748a2e38, S=1,     1024, 0xc2f67c9f
-0,         58,         58,        1,      120, 0x61f82fb2, S=1,     1024, 0xc2f67c9f
-0,         59,         59,        1,      122, 0x2a6b3282, S=1,     1024, 0xc2f67c9f
-0,         60,         60,        1,      116, 0x8b542de6, S=1,     1024, 0xc2f67c9f
-0,         61,         61,        1,      119, 0xf33c318e, S=1,     1024, 0xc2f67c9f
-0,         62,         62,        1,      116, 0xff182f36, S=1,     1024, 0xc2f67c9f
-0,         63,         63,        1,      119, 0xeb9e2fcc, S=1,     1024, 0xc2f67c9f
-0,         64,         64,        1,      118, 0xe82d304e, S=1,     1024, 0xc2f67c9f
-0,         65,         65,        1,      137, 0x98303d30, S=1,     1024, 0xc2f67c9f
-0,         66,         66,        1,      149, 0x01123fff, S=1,     1024, 0xc2f67c9f
-0,         67,         67,        1,      115, 0x4ca92f75, S=1,     1024, 0xc2f67c9f
-0,         68,         68,        1,      131, 0xf4193bc0, S=1,     1024, 0xc2f67c9f
-0,         69,         69,        1,      115, 0xda5e2f30, S=1,     1024, 0xc2f67c9f
-0,         70,         70,        1,      100, 0x9ba32a58, S=1,     1024, 0xc2f67c9f
-0,         71,         71,        1,      109, 0xa47e2c91, S=1,     1024, 0xc2f67c9f
-0,         72,         72,        1,      120, 0x22452fd6, S=1,     1024, 0xc2f67c9f
-0,         73,         73,        1,      116, 0xd3c52c26, S=1,     1024, 0xc2f67c9f
-0,         74,         74,        1,      106, 0x95b42c9f, S=1,     1024, 0xc2f67c9f
-0,         75,         75,        1,       96, 0xfdc12639, S=1,     1024, 0xc2f67c9f
-0,         76,         76,        1,       99, 0x210f251b, S=1,     1024, 0xc2f67c9f
-0,         77,         77,        1,      119, 0x173b341c, S=1,     1024, 0xc2f67c9f
-0,         78,         78,        1,      119, 0x3bca2f29, S=1,     1024, 0xc2f67c9f
-0,         79,         79,        1,      213, 0x9e905d4c, S=1,     1024, 0xc2f67c9f
-0,         80,         80,        1,      209, 0xa0015e94, S=1,     1024, 0xc2f67c9f
-0,         81,         81,        1,      120, 0x36762bd4, S=1,     1024, 0xc2f67c9f
-0,         82,         82,        1,      119, 0x019b2edc, S=1,     1024, 0xc2f67c9f
-0,         83,         83,        1,      124, 0x211d30e7, S=1,     1024, 0xc2f67c9f
-0,         84,         84,        1,      125, 0x538732ff, S=1,     1024, 0xc2f67c9f
-0,         85,         85,        1,      123, 0x2887308a, S=1,     1024, 0xc2f67c9f
-0,         86,         86,        1,      119, 0x7ff930f4, S=1,     1024, 0xc2f67c9f
-0,         87,         87,        1,      119, 0xa50c2e16, S=1,     1024, 0xc2f67c9f
-0,         88,         88,        1,      107, 0x9ed02cea, S=1,     1024, 0xc2f67c9f
-0,         89,         89,        1,      119, 0xc234332a, S=1,     1024, 0xc2f67c9f
-0,         90,         90,        1,      115, 0x38353092, S=1,     1024, 0xc2f67c9f
-0,         91,         91,        1,      162, 0x6cda4644, S=1,     1024, 0xc2f67c9f
-0,         92,         92,        1,      124, 0x2f683081, S=1,     1024, 0xc2f67c9f
-0,         93,         93,        1,      116, 0x72952d04, S=1,     1024, 0xc2f67c9f
-0,         94,         94,        1,       84, 0x1a532301, S=1,     1024, 0xc2f67c9f
-0,         95,         95,        1,      176, 0xfb3c5400, S=1,     1024, 0xc2f67c9f
-0,         96,         96,        1,      137, 0x253132d1, S=1,     1024, 0xc2f67c9f
-0,         97,         97,        1,      179, 0x2b38528b, S=1,     1024, 0xc2f67c9f
-0,         98,         98,        1,      150, 0xbe413cbe, S=1,     1024, 0xc2f67c9f
-0,         99,         99,        1,      140, 0x9e93392a, S=1,     1024, 0xc2f67c9f
-0,        100,        100,        1,      129, 0x577e331e, S=1,     1024, 0xc2f67c9f
-0,        101,        101,        1,      146, 0x16ff3924, S=1,     1024, 0xc2f67c9f
-0,        102,        102,        1,      133, 0x756a3163, S=1,     1024, 0xc2f67c9f
-0,        103,        103,        1,      190, 0x3e865b77, S=1,     1024, 0xc2f67c9f
-0,        104,        104,        1,      159, 0xdf393fc8, S=1,     1024, 0xc2f67c9f
-0,        105,        105,        1,      188, 0x84be5168, S=1,     1024, 0xc2f67c9f
-0,        106,        106,        1,      163, 0x4c0e41f0, S=1,     1024, 0xc2f67c9f
-0,        107,        107,        1,      144, 0x5fda3792, S=1,     1024, 0xc2f67c9f
-0,        108,        108,        1,      136, 0x028c3800, S=1,     1024, 0xc2f67c9f
-0,        109,        109,        1,      150, 0x75d43a8d, S=1,     1024, 0xc2f67c9f
-0,        110,        110,        1,      134, 0x81123999, S=1,     1024, 0xc2f67c9f
-0,        111,        111,        1,      198, 0x0a875baa, S=1,     1024, 0xc2f67c9f
-0,        112,        112,        1,      169, 0xfdd7458c, S=1,     1024, 0xc2f67c9f
-0,        113,        113,        1,      210, 0x9b195be4, S=1,     1024, 0xc2f67c9f
-0,        114,        114,        1,      174, 0x0a424a76, S=1,     1024, 0xc2f67c9f
-0,        115,        115,        1,      137, 0xb1b535fd, S=1,     1024, 0xc2f67c9f
-0,        116,        116,        1,      122, 0x4d3f327b, S=1,     1024, 0xc2f67c9f
-0,        117,        117,        1,      152, 0x5e423b0c, S=1,     1024, 0xc2f67c9f
-0,        118,        118,        1,      137, 0xd13a39f7, S=1,     1024, 0xc2f67c9f
-0,        119,        119,        1,      156, 0x40864321, S=1,     1024, 0xc2f67c9f
-0,        120,        120,        1,      140, 0xbe1e393c, S=1,     1024, 0xc2f67c9f
-0,        121,        121,        1,      179, 0xaf204635, S=1,     1024, 0xc2f67c9f
-0,        122,        122,        1,      116, 0x5ac83123, S=1,     1024, 0xc2f67c9f
-0,        123,        123,        1,      118, 0x22bc2ec5, S=1,     1024, 0xc2f67c9f
-0,        124,        124,        1,      123, 0xc9b5302d, S=1,     1024, 0xc2f67c9f
-0,        125,        125,        1,      125, 0x5cee3077, S=1,     1024, 0xc2f67c9f
-0,        126,        126,        1,      194, 0xccc159ca, S=1,     1024, 0xc2f67c9f
-0,        127,        127,        1,      122, 0x4d243229, S=1,     1024, 0xc2f67c9f
-0,        128,        128,        1,      124, 0x948f330b, S=1,     1024, 0xc2f67c9f
-0,        129,        129,        1,      133, 0xd53c35ca, S=1,     1024, 0xc2f67c9f
-0,        130,        130,        1,      126, 0xc5543710, S=1,     1024, 0xc2f67c9f
-0,        131,        131,        1,      208, 0x6cf15ea2, S=1,     1024, 0xc2f67c9f
-0,        132,        132,        1,      131, 0xa8d33505, S=1,     1024, 0xc2f67c9f
-0,        133,        133,        1,      114, 0x0ae53001, S=1,     1024, 0xc2f67c9f
-0,        134,        134,        1,      129, 0xe9ff37c4, S=1,     1024, 0xc2f67c9f
-0,        135,        135,        1,      120, 0x02623359, S=1,     1024, 0xc2f67c9f
-0,        136,        136,        1,      164, 0x9dc545e5, S=1,     1024, 0xc2f67c9f
-0,        137,        137,        1,      245, 0xc170715a, S=1,     1024, 0xc2f67c9f
-0,        138,        138,        1,      215, 0xc93d5fbe, S=1,     1024, 0xc2f67c9f
-0,        139,        139,        1,      225, 0x14866349, S=1,     1024, 0xc2f67c9f
-0,        140,        140,        1,      123, 0x70cd2b64, S=1,     1024, 0xc2f67c9f
-0,        141,        141,        1,      124, 0xe9002fb5, S=1,     1024, 0xc2f67c9f
-0,        142,        142,        1,      125, 0x106e309b, S=1,     1024, 0xc2f67c9f
-0,        143,        143,        1,      122, 0x050e32b0, S=1,     1024, 0xc2f67c9f
-0,        144,        144,        1,      224, 0xf548614f, S=1,     1024, 0xc2f67c9f
-0,        145,        145,        1,      239, 0x125c6ade, S=1,     1024, 0xc2f67c9f
-0,        146,        146,        1,      127, 0x398734b6, S=1,     1024, 0xc2f67c9f
-0,        147,        147,        1,      126, 0x2ff431e5, S=1,     1024, 0xc2f67c9f
-0,        148,        148,        1,      124, 0x9583313b, S=1,     1024, 0xc2f67c9f
-0,        149,        149,        1,      126, 0xc1fc3692, S=1,     1024, 0xc2f67c9f
-0,        150,        150,        1,      123, 0xd0bf3170, S=1,     1024, 0xc2f67c9f
-0,        151,        151,        1,      117, 0x651f3032, S=1,     1024, 0xc2f67c9f
-0,        152,        152,        1,      119, 0x268a3078, S=1,     1024, 0xc2f67c9f
-0,        153,        153,        1,      117, 0x9e4d3283, S=1,     1024, 0xc2f67c9f
-0,        154,        154,        1,      149, 0x8f1043ba, S=1,     1024, 0xc2f67c9f
-0,        155,        155,        1,      127, 0x352338bc, S=1,     1024, 0xc2f67c9f
-0,        156,        156,        1,      113, 0xf877314e, S=1,     1024, 0xc2f67c9f
-0,        157,        157,        1,      128, 0x88103a62, S=1,     1024, 0xc2f67c9f
-0,        158,        158,        1,      111, 0xbf0630d9, S=1,     1024, 0xc2f67c9f
-0,        159,        159,        1,      146, 0x159c44f7, S=1,     1024, 0xc2f67c9f
-0,        160,        160,        1,      237, 0x4e45662e, S=1,     1024, 0xc2f67c9f
-0,        161,        161,        1,      233, 0x8f9e6354, S=1,     1024, 0xc2f67c9f
-0,        162,        162,        1,      160, 0x9c3f431f, S=1,     1024, 0xc2f67c9f
-0,        163,        163,        1,      125, 0xbd2b33c6, S=1,     1024, 0xc2f67c9f
-0,        164,        164,        1,      131, 0x3ecd3ba5, S=1,     1024, 0xc2f67c9f
-0,        165,        165,        1,      231, 0xdf286db6, S=1,     1024, 0xc2f67c9f
-0,        166,        166,        1,      153, 0xb6da408d, S=1,     1024, 0xc2f67c9f
-0,        167,        167,        1,      126, 0x6741365e, S=1,     1024, 0xc2f67c9f
-0,        168,        168,        1,      113, 0x658f2c90, S=1,     1024, 0xc2f67c9f
-0,        169,        169,        1,      125, 0xc0033320, S=1,     1024, 0xc2f67c9f
-0,        170,        170,        1,      122, 0xe38a2db1, S=1,     1024, 0xc2f67c9f
-0,        171,        171,        1,      145, 0x29d63e83, S=1,     1024, 0xc2f67c9f
-0,        172,        172,        1,      171, 0xc0e44b70, S=1,     1024, 0xc2f67c9f
+0,          0,          0,        1,     1368, 0x6cf0befd
+0,          1,          1,        1,      158, 0xcd173bb4, F=0x0
+0,          2,          2,        1,      163, 0x4f7a451d, F=0x0
+0,          3,          3,        1,      152, 0x17723839, F=0x0
+0,          4,          4,        1,      160, 0x67854056, F=0x0
+0,          5,          5,        1,      144, 0x0dc43ead, F=0x0
+0,          6,          6,        1,      142, 0xb0d73867, F=0x0
+0,          7,          7,        1,      137, 0xd8f333a1, F=0x0
+0,          8,          8,        1,      131, 0x32f93270, F=0x0
+0,          9,          9,        1,      131, 0xf27b2e93, F=0x0
+0,         10,         10,        1,      158, 0x152842d2, F=0x0
+0,         11,         11,        1,      142, 0x12733116, F=0x0
+0,         12,         12,        1,      142, 0x28f03160, F=0x0
+0,         13,         13,        1,      131, 0x038d2dda, F=0x0
+0,         14,         14,        1,      135, 0xb96c33a3, F=0x0
+0,         15,         15,        1,      127, 0x4cbf2d59, F=0x0
+0,         16,         16,        1,      146, 0xff013760, F=0x0
+0,         17,         17,        1,      148, 0xa14d3c03, F=0x0
+0,         18,         18,        1,      130, 0x139430b3, F=0x0
+0,         19,         19,        1,      131, 0x40e03264, F=0x0
+0,         20,         20,        1,      148, 0xf9d23c5c, F=0x0
+0,         21,         21,        1,      131, 0xfdc9328b, F=0x0
+0,         22,         22,        1,      131, 0x986d326f, F=0x0
+0,         23,         23,        1,      132, 0x3fdc3311, F=0x0
+0,         24,         24,        1,      130, 0x84c2330a, F=0x0
+0,         25,         25,        1,      130, 0x9c0033f1, F=0x0
+0,         26,         26,        1,      131, 0x62eb32f5, F=0x0
+0,         27,         27,        1,      126, 0x326e328e, F=0x0
+0,         28,         28,        1,      167, 0x8c8f4674, F=0x0
+0,         29,         29,        1,      148, 0x340d32d5, F=0x0
+0,         30,         30,        1,      171, 0xac2549fa, F=0x0
+0,         31,         31,        1,      150, 0xe77535b1, F=0x0
+0,         32,         32,        1,      178, 0x2c0b4c3a, F=0x0
+0,         33,         33,        1,      154, 0xe99137bb, F=0x0
+0,         34,         34,        1,      140, 0x525535c1, F=0x0
+0,         35,         35,        1,      121, 0xdfdc2d02, F=0x0
+0,         36,         36,        1,      140, 0x4db8345b, F=0x0
+0,         37,         37,        1,      128, 0x32e92f77, F=0x0
+0,         38,         38,        1,      143, 0x06663646, F=0x0
+0,         39,         39,        1,      131, 0xbcef3180, F=0x0
+0,         40,         40,        1,      127, 0xa8b92f17, F=0x0
+0,         41,         41,        1,      127, 0xc88e300a, F=0x0
+0,         42,         42,        1,      128, 0x2b3932e6, F=0x0
+0,         43,         43,        1,      122, 0x89332dc5, F=0x0
+0,         44,         44,        1,      133, 0x2b1d37ee, F=0x0
+0,         45,         45,        1,      125, 0x4c5e32ab, F=0x0
+0,         46,         46,        1,      124, 0x83122eaa, F=0x0
+0,         47,         47,        1,      132, 0xa3953564, F=0x0
+0,         48,         48,        1,      125, 0xae672fd9, F=0x0
+0,         49,         49,        1,      143, 0xd5d8390e, F=0x0
+0,         50,         50,        1,      139, 0xebab3726, F=0x0
+0,         51,         51,        1,      130, 0x4c9b358b, F=0x0
+0,         52,         52,        1,      130, 0x14993609, F=0x0
+0,         53,         53,        1,      132, 0x2ced3637, F=0x0
+0,         54,         54,        1,      134, 0xb27f3881, F=0x0
+0,         55,         55,        1,      125, 0x0402336b, F=0x0
+0,         56,         56,        1,      117, 0xf8a7310f, F=0x0
+0,         57,         57,        1,      128, 0x07752f60, F=0x0
+0,         58,         58,        1,      128, 0xf4d430da, F=0x0
+0,         59,         59,        1,      130, 0xbf9733aa, F=0x0
+0,         60,         60,        1,      124, 0x199f2f0e, F=0x0
+0,         61,         61,        1,      127, 0x84ff32b6, F=0x0
+0,         62,         62,        1,      124, 0x8d63305e, F=0x0
+0,         63,         63,        1,      127, 0x7d6130f4, F=0x0
+0,         64,         64,        1,      126, 0x78c83176, F=0x0
+0,         65,         65,        1,      145, 0x3ec33e58, F=0x0
+0,         66,         66,        1,      157, 0xb5764127, F=0x0
+0,         67,         67,        1,      123, 0xd9bd309d, F=0x0
+0,         68,         68,        1,      139, 0x93bc3ce8, F=0x0
+0,         69,         69,        1,      123, 0x67813058, F=0x0
+0,         70,         70,        1,      108, 0x176e2b80, F=0x0
+0,         71,         71,        1,      117, 0x2ab12db9, F=0x0
+0,         72,         72,        1,      128, 0xb52130fe, F=0x0
+0,         73,         73,        1,      124, 0x62102d4e, F=0x0
+0,         74,         74,        1,      114, 0x186f2dc7, F=0x0
+0,         75,         75,        1,      104, 0x74ec2761, F=0x0
+0,         76,         76,        1,      107, 0x9ba32643, F=0x0
+0,         77,         77,        1,      127, 0xa8ef3544, F=0x0
+0,         78,         78,        1,      127, 0xcd7e3051, F=0x0
+0,         79,         79,        1,      221, 0x9d035e74, F=0x0
+0,         80,         80,        1,      217, 0x99d45fbc, F=0x0
+0,         81,         81,        1,      128, 0xc9522cfc, F=0x0
+0,         82,         82,        1,      127, 0x934f3004, F=0x0
+0,         83,         83,        1,      132, 0xb899320f, F=0x0
+0,         84,         84,        1,      133, 0xec2b3427, F=0x0
+0,         85,         85,        1,      131, 0xbedb31b2, F=0x0
+0,         86,         86,        1,      127, 0x11bc321c, F=0x0
+0,         87,         87,        1,      127, 0x36cf2f3e, F=0x0
+0,         88,         88,        1,      115, 0x22b32e12, F=0x0
+0,         89,         89,        1,      127, 0x53f73452, F=0x0
+0,         90,         90,        1,      123, 0xc54931ba, F=0x0
+0,         91,         91,        1,      170, 0x3055476c, F=0x0
+0,         92,         92,        1,      132, 0xc6e431a9, F=0x0
+0,         93,         93,        1,      124, 0x00e02e2c, F=0x0
+0,         94,         94,        1,       92, 0x838f2429, F=0x0
+0,         95,         95,        1,      184, 0xcee75528, F=0x0
+0,         96,         96,        1,      145, 0xcbb533f9, F=0x0
+0,         97,         97,        1,      187, 0x025b53b3, F=0x0
+0,         98,         98,        1,      158, 0x73dc3de6, F=0x0
+0,         99,         99,        1,      148, 0x489e3a52, F=0x0
+0,        100,        100,        1,      137, 0xf4c23446, F=0x0
+0,        101,        101,        1,      154, 0xc7eb3a4c, F=0x0
+0,        102,        102,        1,      141, 0x175d328b, F=0x0
+0,        103,        103,        1,      198, 0x22615c9f, F=0x0
+0,        104,        104,        1,      167, 0x9f3c40f0, F=0x0
+0,        105,        105,        1,      196, 0x66495290, F=0x0
+0,        106,        106,        1,      171, 0x10b14318, F=0x0
+0,        107,        107,        1,      152, 0x0e8538ba, F=0x0
+0,        108,        108,        1,      144, 0xa7e83928, F=0x0
+0,        109,        109,        1,      158, 0x2b6f3bb5, F=0x0
+0,        110,        110,        1,      142, 0x242d3ac1, F=0x0
+0,        111,        111,        1,      206, 0xf7935cd2, F=0x0
+0,        112,        112,        1,      177, 0xc96a46b4, F=0x0
+0,        113,        113,        1,      218, 0x96145d0c, F=0x0
+0,        114,        114,        1,      182, 0xdb8e4b9e, F=0x0
+0,        115,        115,        1,      145, 0x58483725, F=0x0
+0,        116,        116,        1,      130, 0xe26b33a3, F=0x0
+0,        117,        117,        1,      160, 0x162d3c34, F=0x0
+0,        118,        118,        1,      145, 0x77cd3b1f, F=0x0
+0,        119,        119,        1,      164, 0xfd024449, F=0x0
+0,        120,        120,        1,      148, 0x68293a64, F=0x0
+0,        121,        121,        1,      187, 0x8643475d, F=0x0
+0,        122,        122,        1,      124, 0xe904324b, F=0x0
+0,        123,        123,        1,      126, 0xb3482fed, F=0x0
+0,        124,        124,        1,      131, 0x60183155, F=0x0
+0,        125,        125,        1,      133, 0xf592319f, F=0x0
+0,        126,        126,        1,      202, 0xb53c5af2, F=0x0
+0,        127,        127,        1,      130, 0xe2503351, F=0x0
+0,        128,        128,        1,      132, 0x2c1a3433, F=0x0
+0,        129,        129,        1,      141, 0x772f36f2, F=0x0
+0,        130,        130,        1,      134, 0x5f2f3838, F=0x0
+0,        131,        131,        1,      216, 0x659c5fca, F=0x0
+0,        132,        132,        1,      139, 0x4876362d, F=0x0
+0,        133,        133,        1,      122, 0x96d13129, F=0x0
+0,        134,        134,        1,      137, 0x875238ec, F=0x0
+0,        135,        135,        1,      128, 0x953e3481, F=0x0
+0,        136,        136,        1,      172, 0x6390470d, F=0x0
+0,        137,        137,        1,      253, 0xe4e37282, F=0x0
+0,        138,        138,        1,      223, 0xca0060e6, F=0x0
+0,        139,        139,        1,      233, 0x20d96471, F=0x0
+0,        140,        140,        1,      131, 0x07302c8c, F=0x0
+0,        141,        141,        1,      132, 0x808b30dd, F=0x0
+0,        142,        142,        1,      133, 0xa91231c3, F=0x0
+0,        143,        143,        1,      130, 0x9a3a33d8, F=0x0
+0,        144,        144,        1,      232, 0x00826277, F=0x0
+0,        145,        145,        1,      247, 0x2edf6c06, F=0x0
+0,        146,        146,        1,      135, 0xd47b35de, F=0x0
+0,        147,        147,        1,      134, 0xc9c0330d, F=0x0
+0,        148,        148,        1,      132, 0x2d0e3263, F=0x0
+0,        149,        149,        1,      134, 0x5bd737ba, F=0x0
+0,        150,        150,        1,      131, 0x67223298, F=0x0
+0,        151,        151,        1,      125, 0xf483315a, F=0x0
+0,        152,        152,        1,      127, 0xb83e31a0, F=0x0
+0,        153,        153,        1,      125, 0x2dc033ab, F=0x0
+0,        154,        154,        1,      157, 0x438344e2, F=0x0
+0,        155,        155,        1,      135, 0xd01739e4, F=0x0
+0,        156,        156,        1,      121, 0x834a3276, F=0x0
+0,        157,        157,        1,      136, 0x243b3b8a, F=0x0
+0,        158,        158,        1,      119, 0x47893201, F=0x0
+0,        159,        159,        1,      154, 0xc688461f, F=0x0
+0,        160,        160,        1,      245, 0x68786756, F=0x0
+0,        161,        161,        1,      241, 0xa531647c, F=0x0
+0,        162,        162,        1,      168, 0x5d6a4447, F=0x0
+0,        163,        163,        1,      133, 0x55de34ee, F=0x0
+0,        164,        164,        1,      139, 0xde613ccd, F=0x0
+0,        165,        165,        1,      239, 0xf26b6ede, F=0x0
+0,        166,        166,        1,      161, 0x6fed41b5, F=0x0
+0,        167,        167,        1,      134, 0x011c3786, F=0x0
+0,        168,        168,        1,      121, 0xf0532db8, F=0x0
+0,        169,        169,        1,      133, 0x58b63448, F=0x0
+0,        170,        170,        1,      130, 0x78c52ed9, F=0x0
+0,        171,        171,        1,      153, 0xd99a3fab, F=0x0
+0,        172,        172,        1,      179, 0x8ec74c98, F=0x0
diff --git a/tests/ref/fate/gifenc-pal8 b/tests/ref/fate/gifenc-pal8
index a6d5741..1a074b8 100644
--- a/tests/ref/fate/gifenc-pal8
+++ b/tests/ref/fate/gifenc-pal8
@@ -3,176 +3,176 @@
 #codec_id 0: gif
 #dimensions 0: 217x217
 #sar 0: 0/1
-0,          0,          0,        1,      552, 0x271a2dd3, S=1,     1024, 0xec907a9e
-0,          1,          1,        1,      297, 0x90168a95, S=1,     1024, 0xf351799f
-0,          2,          2,        1,      438, 0x91efce1b, S=1,     1024, 0xf351799f
-0,          3,          3,        1,      450, 0x7c2dcfad, S=1,     1024, 0xf351799f
-0,          4,          4,        1,      547, 0xc131fd3b, S=1,     1024, 0xf351799f
-0,          5,          5,        1,      614, 0x68182006, S=1,     1024, 0xf351799f
-0,          6,          6,        1,      642, 0x78bb1f5f, S=1,     1024, 0xf351799f
-0,          7,          7,        1,      660, 0x35c033a2, S=1,     1024, 0xf351799f
-0,          8,          8,        1,      821, 0xaf30790b, S=1,     1024, 0xf351799f
-0,          9,          9,        1,     1157, 0x741c2da1, S=1,     1024, 0xf351799f
-0,         10,         10,        1,      179, 0x3a27517c, S=1,     1024, 0xf351799f
-0,         11,         11,        1,     1333, 0x5ee76f3c, S=1,     1024, 0xf351799f
-0,         12,         12,        1,     1638, 0x5f640e86, S=1,     1024, 0xf351799f
-0,         13,         13,        1,     1531, 0xccb8e437, S=1,     1024, 0xf351799f
-0,         14,         14,        1,     1720, 0xc95d45ec, S=1,     1024, 0xf351799f
-0,         15,         15,        1,     1910, 0x56cc831e, S=1,     1024, 0xf351799f
-0,         16,         16,        1,     2124, 0x9cc8e130, S=1,     1024, 0xf351799f
-0,         17,         17,        1,     2248, 0x05a325b1, S=1,     1024, 0xf351799f
-0,         18,         18,        1,     2311, 0xdc633703, S=1,     1024, 0xf351799f
-0,         19,         19,        1,     2408, 0x91c26f3e, S=1,     1024, 0xf351799f
-0,         20,         20,        1,     2601, 0x8cf3c157, S=1,     1024, 0xf351799f
-0,         21,         21,        1,     2687, 0x8f6400e6, S=1,     1024, 0xf351799f
-0,         22,         22,        1,     2784, 0xaa880e55, S=1,     1024, 0xf351799f
-0,         23,         23,        1,     2884, 0x46f546f6, S=1,     1024, 0xf351799f
-0,         24,         24,        1,     2982, 0x807c7ad5, S=1,     1024, 0xf351799f
-0,         25,         25,        1,     3101, 0xbcc89bec, S=1,     1024, 0xf351799f
-0,         26,         26,        1,     3253, 0xd032f3fa, S=1,     1024, 0xf351799f
-0,         27,         27,        1,     3329, 0xe4d42430, S=1,     1024, 0xf351799f
-0,         28,         28,        1,     3572, 0xf8058aa0, S=1,     1024, 0xf351799f
-0,         29,         29,        1,     3807, 0x3d2af9f3, S=1,     1024, 0xf351799f
-0,         30,         30,        1,     2750, 0x814d1c33, S=1,     1024, 0xf351799f
-0,         31,         31,        1,     4031, 0x3b077006, S=1,     1024, 0xf351799f
-0,         32,         32,        1,     3025, 0x86729c1c, S=1,     1024, 0xf351799f
-0,         33,         33,        1,     4295, 0xf71b0b38, S=1,     1024, 0xf351799f
-0,         34,         34,        1,     2044, 0x5adcb93b, S=1,     1024, 0xf351799f
-0,         35,         35,        1,     3212, 0xcf79eeed, S=1,     1024, 0xf351799f
-0,         36,         36,        1,     2292, 0xb4386334, S=1,     1024, 0xf351799f
-0,         37,         37,        1,     3633, 0x0010992f, S=1,     1024, 0xf351799f
-0,         38,         38,        1,     3552, 0x23697490, S=1,     1024, 0xf351799f
-0,         39,         39,        1,     3690, 0x62afdbb8, S=1,     1024, 0xf351799f
-0,         40,         40,        1,     1559, 0x5baef54a, S=1,     1024, 0xf351799f
-0,         41,         41,        1,      954, 0xca75ca79, S=1,     1024, 0xf351799f
-0,         42,         42,        1,      273, 0x3687799b, S=1,     1024, 0xf351799f
-0,         43,         43,        1,      930, 0x29f3b0c4, S=1,     1024, 0xf351799f
-0,         44,         44,        1,      271, 0x305e8094, S=1,     1024, 0xf351799f
-0,         45,         45,        1,      196, 0xf5ab51ee, S=1,     1024, 0xf351799f
-0,         46,         46,        1,     4299, 0x67ec0d55, S=1,     1024, 0xf351799f
-0,         47,         47,        1,     4895, 0xb394406c, S=1,     1024, 0xf351799f
-0,         48,         48,        1,     4928, 0x233919d7, S=1,     1024, 0xf351799f
-0,         49,         49,        1,     4941, 0x58a357da, S=1,     1024, 0xf351799f
-0,         50,         50,        1,     4154, 0x21f2ac33, S=1,     1024, 0xf351799f
-0,         51,         51,        1,     4678, 0xab3cc050, S=1,     1024, 0xf351799f
-0,         52,         52,        1,     4741, 0x1974b581, S=1,     1024, 0xf351799f
-0,         53,         53,        1,     4982, 0x891456d5, S=1,     1024, 0xf351799f
-0,         54,         54,        1,     5179, 0x860fc6a1, S=1,     1024, 0xf351799f
-0,         55,         55,        1,     5046, 0xce9183d3, S=1,     1024, 0xf351799f
-0,         56,         56,        1,     5140, 0xa6d7b9af, S=1,     1024, 0xf351799f
-0,         57,         57,        1,     4301, 0x03b6ef3f, S=1,     1024, 0xf351799f
-0,         58,         58,        1,     5079, 0xa8d59e01, S=1,     1024, 0xf351799f
-0,         59,         59,        1,     5284, 0xea34e3b3, S=1,     1024, 0xf351799f
-0,         60,         60,        1,     5426, 0x556a15cd, S=1,     1024, 0xf351799f
-0,         61,         61,        1,     4645, 0x061e8936, S=1,     1024, 0xf351799f
-0,         62,         62,        1,     5263, 0x7536cf7d, S=1,     1024, 0xf351799f
-0,         63,         63,        1,     5221, 0x9fbac3ca, S=1,     1024, 0xf351799f
-0,         64,         64,        1,     5217, 0x02269bd2, S=1,     1024, 0xf351799f
-0,         65,         65,        1,     5395, 0x120fff66, S=1,     1024, 0xf351799f
-0,         66,         66,        1,     5220, 0x77cedcc5, S=1,     1024, 0xf351799f
-0,         67,         67,        1,     5704, 0xba42dd96, S=1,     1024, 0xf351799f
-0,         68,         68,        1,     5636, 0xcb91a25b, S=1,     1024, 0xf351799f
-0,         69,         69,        1,     5818, 0x8dc0df92, S=1,     1024, 0xf351799f
-0,         70,         70,        1,     5763, 0x51d5d5f0, S=1,     1024, 0xf351799f
-0,         71,         71,        1,     6116, 0x09558b48, S=1,     1024, 0xf351799f
-0,         72,         72,        1,     6069, 0x41926817, S=1,     1024, 0xf351799f
-0,         73,         73,        1,     5796, 0x7fbeda44, S=1,     1024, 0xf351799f
-0,         74,         74,        1,     5999, 0xe07d3770, S=1,     1024, 0xf351799f
-0,         75,         75,        1,     6220, 0x6607b06f, S=1,     1024, 0xf351799f
-0,         76,         76,        1,     6374, 0x7628e533, S=1,     1024, 0xf351799f
-0,         77,         77,        1,     6465, 0xfe956b15, S=1,     1024, 0xf351799f
-0,         78,         78,        1,     7019, 0x6c9a1aef, S=1,     1024, 0xf351799f
-0,         79,         79,        1,     7255, 0x5fa5c1bf, S=1,     1024, 0xf351799f
-0,         80,         80,        1,     8197, 0xf11d6ef2, S=1,     1024, 0xf351799f
-0,         81,         81,        1,     8358, 0x027279e8, S=1,     1024, 0xf351799f
-0,         82,         82,        1,     7708, 0x607f8e8b, S=1,     1024, 0xf351799f
-0,         83,         83,        1,     7412, 0x6bb2105f, S=1,     1024, 0xf351799f
-0,         84,         84,        1,     7541, 0xfdc02154, S=1,     1024, 0xf351799f
-0,         85,         85,        1,     7948, 0x916ecd8b, S=1,     1024, 0xf351799f
-0,         86,         86,        1,     8408, 0x1f97d414, S=1,     1024, 0xf351799f
-0,         87,         87,        1,     8056, 0x9cbf159c, S=1,     1024, 0xf351799f
-0,         88,         88,        1,     7401, 0x2625addb, S=1,     1024, 0xf351799f
-0,         89,         89,        1,     7494, 0x2877eacb, S=1,     1024, 0xf351799f
-0,         90,         90,        1,     7806, 0xe32574a3, S=1,     1024, 0xf351799f
-0,         91,         91,        1,     7768, 0x25ed7ee7, S=1,     1024, 0xf351799f
-0,         92,         92,        1,     7749, 0x6d8e978e, S=1,     1024, 0xf351799f
-0,         93,         93,        1,     8047, 0xec4b150c, S=1,     1024, 0xf351799f
-0,         94,         94,        1,     7618, 0x88cf30d5, S=1,     1024, 0xf351799f
-0,         95,         95,        1,     7979, 0x0eb1cf2a, S=1,     1024, 0xf351799f
-0,         96,         96,        1,    12062, 0xb49d9125, S=1,     1024, 0xf351799f
-0,         97,         97,        1,    12317, 0x2d8fd6e9, S=1,     1024, 0xf351799f
-0,         98,         98,        1,    12217, 0x9b3be549, S=1,     1024, 0xf351799f
-0,         99,         99,        1,    11227, 0x067e9118, S=1,     1024, 0xf351799f
-0,        100,        100,        1,    11108, 0x5e5b0afd, S=1,     1024, 0xf351799f
-0,        101,        101,        1,    11366, 0xb38e8d15, S=1,     1024, 0xf351799f
-0,        102,        102,        1,    11896, 0xeb3e35ca, S=1,     1024, 0xf351799f
-0,        103,        103,        1,    11479, 0xbf7581e9, S=1,     1024, 0xf351799f
-0,        104,        104,        1,    13395, 0x415b38d8, S=1,     1024, 0xf351799f
-0,        105,        105,        1,    12913, 0x61544631, S=1,     1024, 0xf351799f
-0,        106,        106,        1,    13864, 0xd39fe768, S=1,     1024, 0xf351799f
-0,        107,        107,        1,    13551, 0x76c167d1, S=1,     1024, 0xf351799f
-0,        108,        108,        1,    14041, 0x2f206888, S=1,     1024, 0xf351799f
-0,        109,        109,        1,    14144, 0x9ec030d3, S=1,     1024, 0xf351799f
-0,        110,        110,        1,    14277, 0xa84b3a9b, S=1,     1024, 0xf351799f
-0,        111,        111,        1,    14424, 0xf5f1e06e, S=1,     1024, 0xf351799f
-0,        112,        112,        1,    14689, 0xbca0adb5, S=1,     1024, 0xf351799f
-0,        113,        113,        1,    14598, 0xc1d45745, S=1,     1024, 0xf351799f
-0,        114,        114,        1,    15213, 0x8f3080fc, S=1,     1024, 0xf351799f
-0,        115,        115,        1,    15425, 0xb0aa8f59, S=1,     1024, 0xf351799f
-0,        116,        116,        1,    15595, 0x1406e5d5, S=1,     1024, 0xf351799f
-0,        117,        117,        1,    15598, 0x48ec7d08, S=1,     1024, 0xf351799f
-0,        118,        118,        1,    15863, 0x5381db7b, S=1,     1024, 0xf351799f
-0,        119,        119,        1,    15717, 0xb87a1b87, S=1,     1024, 0xf351799f
-0,        120,        120,        1,    16078, 0x5bab2453, S=1,     1024, 0xf351799f
-0,        121,        121,        1,    16225, 0xa1f88113, S=1,     1024, 0xf351799f
-0,        122,        122,        1,    16135, 0x6af2f4e1, S=1,     1024, 0xf351799f
-0,        123,        123,        1,    16661, 0xf02a3343, S=1,     1024, 0xf351799f
-0,        124,        124,        1,    16619, 0xc71935a4, S=1,     1024, 0xf351799f
-0,        125,        125,        1,    16829, 0x29849844, S=1,     1024, 0xf351799f
-0,        126,        126,        1,    16944, 0x3423ae77, S=1,     1024, 0xf351799f
-0,        127,        127,        1,    17119, 0x609b4409, S=1,     1024, 0xf351799f
-0,        128,        128,        1,    17150, 0xf85dfd31, S=1,     1024, 0xf351799f
-0,        129,        129,        1,    17321, 0x38eccb10, S=1,     1024, 0xf351799f
-0,        130,        130,        1,    17395, 0x0ba08b85, S=1,     1024, 0xf351799f
-0,        131,        131,        1,    17666, 0x6fbc0264, S=1,     1024, 0xf351799f
-0,        132,        132,        1,    17730, 0x3dcc64a6, S=1,     1024, 0xf351799f
-0,        133,        133,        1,    17934, 0xb539974b, S=1,     1024, 0xf351799f
-0,        134,        134,        1,    17944, 0x2214ec94, S=1,     1024, 0xf351799f
-0,        135,        135,        1,    18238, 0x70f9ff1d, S=1,     1024, 0xf351799f
-0,        136,        136,        1,    18391, 0x4b149209, S=1,     1024, 0xf351799f
-0,        137,        137,        1,    18543, 0x45a1c02f, S=1,     1024, 0xf351799f
-0,        138,        138,        1,    18939, 0x2789a88c, S=1,     1024, 0xf351799f
-0,        139,        139,        1,    19145, 0x5daafd7a, S=1,     1024, 0xf351799f
-0,        140,        140,        1,    19120, 0x565f80e6, S=1,     1024, 0xf351799f
-0,        141,        141,        1,    19130, 0xff70cc21, S=1,     1024, 0xf351799f
-0,        142,        142,        1,    19494, 0xbfa284db, S=1,     1024, 0xf351799f
-0,        143,        143,        1,    19534, 0x3d40743b, S=1,     1024, 0xf351799f
-0,        144,        144,        1,    19747, 0x33c9b108, S=1,     1024, 0xf351799f
-0,        145,        145,        1,    20114, 0x9d223e36, S=1,     1024, 0xf351799f
-0,        146,        146,        1,    20257, 0xe7bdaf43, S=1,     1024, 0xf351799f
-0,        147,        147,        1,    20370, 0x0c5f1970, S=1,     1024, 0xf351799f
-0,        148,        148,        1,    20292, 0x6986d20e, S=1,     1024, 0xf351799f
-0,        149,        149,        1,    20491, 0xd88e4c08, S=1,     1024, 0xf351799f
-0,        150,        150,        1,    20647, 0x1aefaffc, S=1,     1024, 0xf351799f
-0,        151,        151,        1,    20666, 0x43e4aaaa, S=1,     1024, 0xf351799f
-0,        152,        152,        1,    21007, 0xa7ca3ef0, S=1,     1024, 0xf351799f
-0,        153,        153,        1,    21058, 0x06814351, S=1,     1024, 0xf351799f
-0,        154,        154,        1,    21153, 0x3c852b10, S=1,     1024, 0xf351799f
-0,        155,        155,        1,    21078, 0x8df15855, S=1,     1024, 0xf351799f
-0,        156,        156,        1,    21458, 0xd3a531d6, S=1,     1024, 0xf351799f
-0,        157,        157,        1,    21669, 0x88baca53, S=1,     1024, 0xf351799f
-0,        158,        158,        1,    21581, 0xd692fa1f, S=1,     1024, 0xf351799f
-0,        159,        159,        1,    21654, 0x30fb9061, S=1,     1024, 0xf351799f
-0,        160,        160,        1,    21987, 0xe7646d8b, S=1,     1024, 0xf351799f
-0,        161,        161,        1,    22205, 0x0fc55b6a, S=1,     1024, 0xf351799f
-0,        162,        162,        1,    22475, 0x4bc4c032, S=1,     1024, 0xf351799f
-0,        163,        163,        1,    22490, 0x58ca23f6, S=1,     1024, 0xf351799f
-0,        164,        164,        1,    22460, 0xf9ceb0ac, S=1,     1024, 0xf351799f
-0,        165,        165,        1,    22861, 0xb05f0f84, S=1,     1024, 0xf351799f
-0,        166,        166,        1,    22746, 0x0df23a5c, S=1,     1024, 0xf351799f
-0,        167,        167,        1,    23165, 0xbd7147ad, S=1,     1024, 0xf351799f
-0,        168,        168,        1,    23273, 0x9781a34f, S=1,     1024, 0xf351799f
-0,        169,        169,        1,    23211, 0x69c7606b, S=1,     1024, 0xf351799f
-0,        170,        170,        1,    23648, 0xdafde037, S=1,     1024, 0xf351799f
-0,        171,        171,        1,    23675, 0x2a2147ed, S=1,     1024, 0xf351799f
-0,        172,        172,        1,    23874, 0x12c184b6, S=1,     1024, 0xf351799f
+0,          0,          0,        1,     2109, 0x39642b3d
+0,          1,          1,        1,      236, 0x332769fd, F=0x0
+0,          2,          2,        1,      186, 0x770d5061, F=0x0
+0,          3,          3,        1,      208, 0x55784c8f, F=0x0
+0,          4,          4,        1,      282, 0x98e8825d, F=0x0
+0,          5,          5,        1,      209, 0x4cc15280, F=0x0
+0,          6,          6,        1,      225, 0xf8785d6c, F=0x0
+0,          7,          7,        1,      204, 0x322754b4, F=0x0
+0,          8,          8,        1,      181, 0x9f4f4d10, F=0x0
+0,          9,          9,        1,      200, 0x64a453a1, F=0x0
+0,         10,         10,        1,      184, 0x79c344d3, F=0x0
+0,         11,         11,        1,      191, 0x7097487b, F=0x0
+0,         12,         12,        1,      290, 0x1f998186, F=0x0
+0,         13,         13,        1,      153, 0xfe4c3a7c, F=0x0
+0,         14,         14,        1,      175, 0xfdf442e0, F=0x0
+0,         15,         15,        1,      187, 0x393845f2, F=0x0
+0,         16,         16,        1,      418, 0xe94bc757, F=0x0
+0,         17,         17,        1,      200, 0x8dab52be, F=0x0
+0,         18,         18,        1,      347, 0xae379838, F=0x0
+0,         19,         19,        1,      176, 0x868742d2, F=0x0
+0,         20,         20,        1,      294, 0xb1fb8365, F=0x0
+0,         21,         21,        1,      166, 0x06e44260, F=0x0
+0,         22,         22,        1,      306, 0x29e983b7, F=0x0
+0,         23,         23,        1,      180, 0xfa4a44eb, F=0x0
+0,         24,         24,        1,      207, 0x99de52c8, F=0x0
+0,         25,         25,        1,      204, 0x73944c35, F=0x0
+0,         26,         26,        1,      259, 0xa0637375, F=0x0
+0,         27,         27,        1,      181, 0x130f4b9a, F=0x0
+0,         28,         28,        1,      152, 0x4be93cae, F=0x0
+0,         29,         29,        1,      194, 0x81e34e1d, F=0x0
+0,         30,         30,        1,      159, 0x5913380b, F=0x0
+0,         31,         31,        1,      162, 0xf0683bb1, F=0x0
+0,         32,         32,        1,      178, 0xce32498c, F=0x0
+0,         33,         33,        1,      187, 0x5d61509f, F=0x0
+0,         34,         34,        1,      336, 0xe5569440, F=0x0
+0,         35,         35,        1,      184, 0x3fa349ea, F=0x0
+0,         36,         36,        1,      227, 0x7cad5f66, F=0x0
+0,         37,         37,        1,      182, 0xf23a4522, F=0x0
+0,         38,         38,        1,      162, 0x2a053dcc, F=0x0
+0,         39,         39,        1,      187, 0xc18a4686, F=0x0
+0,         40,         40,        1,      503, 0xa5a7e669, F=0x0
+0,         41,         41,        1,      167, 0xa28a43e8, F=0x0
+0,         42,         42,        1,      289, 0xf1968090, F=0x0
+0,         43,         43,        1,      194, 0xedbb4eb7, F=0x0
+0,         44,         44,        1,      285, 0x82e7818b, F=0x0
+0,         45,         45,        1,      199, 0x5e725190, F=0x0
+0,         46,         46,        1,      197, 0x0c6a4fb9, F=0x0
+0,         47,         47,        1,      203, 0x05684b96, F=0x0
+0,         48,         48,        1,      208, 0xd33457ad, F=0x0
+0,         49,         49,        1,     1198, 0x029f5f1b, F=0x0
+0,         50,         50,        1,      175, 0xf4e94c40, F=0x0
+0,         51,         51,        1,      740, 0x6e096787, F=0x0
+0,         52,         52,        1,      180, 0xf34f45be, F=0x0
+0,         53,         53,        1,      238, 0xfbed6adb, F=0x0
+0,         54,         54,        1,      198, 0x6f3a5344, F=0x0
+0,         55,         55,        1,      196, 0x8bbb4b02, F=0x0
+0,         56,         56,        1,      224, 0x92c55d92, F=0x0
+0,         57,         57,        1,      765, 0xd16e6d65, F=0x0
+0,         58,         58,        1,      149, 0x97aa38d2, F=0x0
+0,         59,         59,        1,      479, 0x1030d73b, F=0x0
+0,         60,         60,        1,      179, 0x441e493a, F=0x0
+0,         61,         61,        1,      217, 0x16c259b7, F=0x0
+0,         62,         62,        1,      190, 0x5b2349ca, F=0x0
+0,         63,         63,        1,      155, 0x422f39ff, F=0x0
+0,         64,         64,        1,      167, 0x28444898, F=0x0
+0,         65,         65,        1,      649, 0x57b331e2, F=0x0
+0,         66,         66,        1,      196, 0x99a1574f, F=0x0
+0,         67,         67,        1,      427, 0xfd45d548, F=0x0
+0,         68,         68,        1,      175, 0x90cc42ce, F=0x0
+0,         69,         69,        1,      284, 0x49398208, F=0x0
+0,         70,         70,        1,      131, 0x18e42fc2, F=0x0
+0,         71,         71,        1,      256, 0xac896bbe, F=0x0
+0,         72,         72,        1,      186, 0x522d4974, F=0x0
+0,         73,         73,        1,      190, 0x5e064e04, F=0x0
+0,         74,         74,        1,      216, 0x863f53fa, F=0x0
+0,         75,         75,        1,      154, 0x17f1383f, F=0x0
+0,         76,         76,        1,      113, 0x20f827ee, F=0x0
+0,         77,         77,        1,      402, 0xce2caf45, F=0x0
+0,         78,         78,        1,      198, 0x0bc851ae, F=0x0
+0,         79,         79,        1,      466, 0xb31ad387, F=0x0
+0,         80,         80,        1,      322, 0x20018e02, F=0x0
+0,         81,         81,        1,      387, 0x5038b1b8, F=0x0
+0,         82,         82,        1,      158, 0xc6ac3feb, F=0x0
+0,         83,         83,        1,      278, 0x59f17c03, F=0x0
+0,         84,         84,        1,      190, 0xd7665022, F=0x0
+0,         85,         85,        1,      175, 0x1a6e4225, F=0x0
+0,         86,         86,        1,      206, 0xc3f44e3a, F=0x0
+0,         87,         87,        1,      379, 0xb1e6b77e, F=0x0
+0,         88,         88,        1,      202, 0x17975145, F=0x0
+0,         89,         89,        1,      225, 0x96985fd2, F=0x0
+0,         90,         90,        1,      175, 0x71b1497a, F=0x0
+0,         91,         91,        1,      235, 0x2bdc5faa, F=0x0
+0,         92,         92,        1,      185, 0x68124958, F=0x0
+0,         93,         93,        1,      182, 0x120c4c63, F=0x0
+0,         94,         94,        1,      114, 0xdd9b2b02, F=0x0
+0,         95,         95,        1,      176, 0x0d5b4b46, F=0x0
+0,         96,         96,        1,      214, 0xfb5e5b47, F=0x0
+0,         97,         97,        1,      182, 0xf4c54860, F=0x0
+0,         98,         98,        1,      195, 0x6e075188, F=0x0
+0,         99,         99,        1,      303, 0x4c158465, F=0x0
+0,        100,        100,        1,      191, 0x12005055, F=0x0
+0,        101,        101,        1,      177, 0x01ed4929, F=0x0
+0,        102,        102,        1,      172, 0x86984280, F=0x0
+0,        103,        103,        1,      179, 0xb854481c, F=0x0
+0,        104,        104,        1,      188, 0xeacd47ed, F=0x0
+0,        105,        105,        1,      177, 0x36be4889, F=0x0
+0,        106,        106,        1,      215, 0x6aa65c99, F=0x0
+0,        107,        107,        1,      339, 0x1af496b2, F=0x0
+0,        108,        108,        1,      189, 0x941045fa, F=0x0
+0,        109,        109,        1,      209, 0x37445651, F=0x0
+0,        110,        110,        1,      205, 0x9cf85222, F=0x0
+0,        111,        111,        1,      185, 0x8b964cb5, F=0x0
+0,        112,        112,        1,      211, 0xd03d59ce, F=0x0
+0,        113,        113,        1,      178, 0xe40e4c08, F=0x0
+0,        114,        114,        1,      195, 0x971d4d92, F=0x0
+0,        115,        115,        1,      116, 0x5f9a2d3f, F=0x0
+0,        116,        116,        1,      116, 0x5c4e2d06, F=0x0
+0,        117,        117,        1,      427, 0x6128c7da, F=0x0
+0,        118,        118,        1,      182, 0x8a9a4a85, F=0x0
+0,        119,        119,        1,      267, 0x94e16d98, F=0x0
+0,        120,        120,        1,      191, 0x8cd6499b, F=0x0
+0,        121,        121,        1,      195, 0x2955524a, F=0x0
+0,        122,        122,        1,      755, 0x21115eef, F=0x0
+0,        123,        123,        1,      179, 0x89ff45fd, F=0x0
+0,        124,        124,        1,      522, 0x1b1cf19d, F=0x0
+0,        125,        125,        1,      171, 0x48034194, F=0x0
+0,        126,        126,        1,      379, 0x3914a793, F=0x0
+0,        127,        127,        1,      539, 0x7155fc34, F=0x0
+0,        128,        128,        1,      199, 0xb8674f8a, F=0x0
+0,        129,        129,        1,      458, 0x0a87ce97, F=0x0
+0,        130,        130,        1,      177, 0xac704b44, F=0x0
+0,        131,        131,        1,      299, 0x49318aa9, F=0x0
+0,        132,        132,        1,      333, 0xa188949d, F=0x0
+0,        133,        133,        1,      179, 0x2474436d, F=0x0
+0,        134,        134,        1,      263, 0x84e871f8, F=0x0
+0,        135,        135,        1,      177, 0xf7904597, F=0x0
+0,        136,        136,        1,      184, 0xb053486d, F=0x0
+0,        137,        137,        1,      433, 0xd3c0c5a1, F=0x0
+0,        138,        138,        1,     1138, 0xd5af3462, F=0x0
+0,        139,        139,        1,      863, 0xdce99f4f, F=0x0
+0,        140,        140,        1,      328, 0x608a949d, F=0x0
+0,        141,        141,        1,      222, 0xecb75a19, F=0x0
+0,        142,        142,        1,      171, 0x6cf94548, F=0x0
+0,        143,        143,        1,      222, 0xcf8d5778, F=0x0
+0,        144,        144,        1,      738, 0x9cf358a2, F=0x0
+0,        145,        145,        1,      444, 0x3798cdf6, F=0x0
+0,        146,        146,        1,      267, 0x8ca87717, F=0x0
+0,        147,        147,        1,      187, 0x4d734c80, F=0x0
+0,        148,        148,        1,      186, 0x9def4fb6, F=0x0
+0,        149,        149,        1,      196, 0x49214f94, F=0x0
+0,        150,        150,        1,      589, 0x02e2142f, F=0x0
+0,        151,        151,        1,      188, 0x285c4dad, F=0x0
+0,        152,        152,        1,      339, 0x8a0fa092, F=0x0
+0,        153,        153,        1,      179, 0x775543d4, F=0x0
+0,        154,        154,        1,      294, 0x0c8885eb, F=0x0
+0,        155,        155,        1,      291, 0xd78084b1, F=0x0
+0,        156,        156,        1,      144, 0xd7323963, F=0x0
+0,        157,        157,        1,      182, 0x97194ede, F=0x0
+0,        158,        158,        1,      195, 0x410f50a6, F=0x0
+0,        159,        159,        1,      268, 0xb878789a, F=0x0
+0,        160,        160,        1,      526, 0x6e13fb3e, F=0x0
+0,        161,        161,        1,      372, 0xf1fca999, F=0x0
+0,        162,        162,        1,      171, 0x86033fb7, F=0x0
+0,        163,        163,        1,      344, 0x8db8a374, F=0x0
+0,        164,        164,        1,      159, 0xa3463fb6, F=0x0
+0,        165,        165,        1,      391, 0x6ab1aa7d, F=0x0
+0,        166,        166,        1,      180, 0x55d04d01, F=0x0
+0,        167,        167,        1,      303, 0xac779365, F=0x0
+0,        168,        168,        1,      180, 0x54e94840, F=0x0
+0,        169,        169,        1,      269, 0x56e57720, F=0x0
+0,        170,        170,        1,      199, 0x510b5589, F=0x0
+0,        171,        171,        1,      287, 0xd70d8529, F=0x0
+0,        172,        172,        1,      217, 0x04a0649e, F=0x0
diff --git a/tests/ref/fate/gifenc-rgb4_byte b/tests/ref/fate/gifenc-rgb4_byte
index 067accd..25e9fc7 100644
--- a/tests/ref/fate/gifenc-rgb4_byte
+++ b/tests/ref/fate/gifenc-rgb4_byte
@@ -3,176 +3,176 @@
 #codec_id 0: gif
 #dimensions 0: 217x217
 #sar 0: 0/1
-0,          0,          0,        1,      508, 0xf04a113b
-0,          1,          1,        1,      213, 0x23c24d3d, S=1,     1024, 0xf7700427
-0,          2,          2,        1,      131, 0x56d22a39, S=1,     1024, 0x03730427
-0,          3,          3,        1,      384, 0xb1d8a4bd, S=1,     1024, 0xf7700427
-0,          4,          4,        1,      381, 0x37a3a2c9, S=1,     1024, 0xf3740427
-0,          5,          5,        1,      430, 0x162bb3d3, S=1,     1024, 0xf3740427
-0,          6,          6,        1,      518, 0x195bd738, S=1,     1024, 0xf3740427
-0,          7,          7,        1,      535, 0x12cde6b7, S=1,     1024, 0xf3740427
-0,          8,          8,        1,      438, 0xa653b946, S=1,     1024, 0x0b6b0427
-0,          9,          9,        1,      923, 0xd2e2a35f, S=1,     1024, 0x0b6b0427
-0,         10,         10,        1,      694, 0xe1cf4a1f, S=1,     1024, 0x0b6b0427
-0,         11,         11,        1,     1194, 0xa6152c8a, S=1,     1024, 0x0b6b0427
-0,         12,         12,        1,     1291, 0x94d25581, S=1,     1024, 0x0b6b0427
-0,         13,         13,        1,     1245, 0x5b483525, S=1,     1024, 0x0b6b0427
-0,         14,         14,        1,     1330, 0xfb5351c8, S=1,     1024, 0x0b6b0427
-0,         15,         15,        1,     1276, 0x6f403914, S=1,     1024, 0x0b6b0427
-0,         16,         16,        1,     1475, 0xbf459755, S=1,     1024, 0x0b6b0427
-0,         17,         17,        1,     1784, 0xe9954aa7, S=1,     1024, 0xecb30526
-0,         18,         18,        1,     1675, 0x219dfaf8, S=1,     1024, 0xecb30526
-0,         19,         19,        1,     1509, 0xd7f5abbe, S=1,     1024, 0xecb30526
-0,         20,         20,        1,     1705, 0x44a01729, S=1,     1024, 0xecb30526
-0,         21,         21,        1,     1745, 0x31ff1f89, S=1,     1024, 0xecb30526
-0,         22,         22,        1,     1642, 0x55420147, S=1,     1024, 0xecb30526
-0,         23,         23,        1,     1718, 0x68ef1cb8, S=1,     1024, 0xecb30526
-0,         24,         24,        1,     1900, 0xd7737a09, S=1,     1024, 0xecb30526
-0,         25,         25,        1,     1807, 0x4f6c5140, S=1,     1024, 0xecb30526
-0,         26,         26,        1,     1915, 0x976d80e6, S=1,     1024, 0xecb30526
-0,         27,         27,        1,     2100, 0x0ae6d1ce, S=1,     1024, 0xecb30526
-0,         28,         28,        1,     2700, 0x7a89f104, S=1,     1024, 0xecb30526
-0,         29,         29,        1,     2673, 0xf6b6a71d, S=1,     1024, 0xecb30526
-0,         30,         30,        1,     2895, 0x9079484b, S=1,     1024, 0xecb30526
-0,         31,         31,        1,     3257, 0x0b0cd125, S=1,     1024, 0xecb30526
-0,         32,         32,        1,     3179, 0x3ee2c161, S=1,     1024, 0xecb30526
-0,         33,         33,        1,     3296, 0x6230e506, S=1,     1024, 0xecb30526
-0,         34,         34,        1,     3600, 0x021775d7, S=1,     1024, 0xecb30526
-0,         35,         35,        1,     3699, 0xfb03a043, S=1,     1024, 0xecb30526
-0,         36,         36,        1,     3814, 0x96a8d57e, S=1,     1024, 0xecb30526
-0,         37,         37,        1,     3627, 0x33a37f8f, S=1,     1024, 0xecb30526
-0,         38,         38,        1,     2950, 0x50806197, S=1,     1024, 0xecb30526
-0,         39,         39,        1,     3086, 0x72068d4c, S=1,     1024, 0xecb30526
-0,         40,         40,        1,     3094, 0x2880861f, S=1,     1024, 0xecb30526
-0,         41,         41,        1,     3456, 0x6d232a96, S=1,     1024, 0xecb30526
-0,         42,         42,        1,     4108, 0x46d75ebb, S=1,     1024, 0xecb30526
-0,         43,         43,        1,     4217, 0x04a258f4, S=1,     1024, 0xecb30526
-0,         44,         44,        1,     3613, 0x667f4ff8, S=1,     1024, 0xecb30526
-0,         45,         45,        1,     3910, 0x8f37e73e, S=1,     1024, 0xecb30526
-0,         46,         46,        1,     4461, 0x5db9e0bf, S=1,     1024, 0xecb30526
-0,         47,         47,        1,     4593, 0x883f2f49, S=1,     1024, 0xecb30526
-0,         48,         48,        1,     4822, 0x03d99b73, S=1,     1024, 0xecb30526
-0,         49,         49,        1,     5398, 0x39f7bff4, S=1,     1024, 0xecb30526
-0,         50,         50,        1,     5266, 0xd5ab9630, S=1,     1024, 0xecb30526
-0,         51,         51,        1,     5416, 0x5876e16f, S=1,     1024, 0xecb30526
-0,         52,         52,        1,     5519, 0x30ed05d8, S=1,     1024, 0xecb30526
-0,         53,         53,        1,     5701, 0x5bae5af7, S=1,     1024, 0xecb30526
-0,         54,         54,        1,     6160, 0x98364177, S=1,     1024, 0xecb30526
-0,         55,         55,        1,     6233, 0x52a05075, S=1,     1024, 0xecb30526
-0,         56,         56,        1,     5911, 0x04bfc46a, S=1,     1024, 0xecb30526
-0,         57,         57,        1,     5997, 0xf1e6f586, S=1,     1024, 0xecb30526
-0,         58,         58,        1,     5946, 0xe6f3f055, S=1,     1024, 0xecb30526
-0,         59,         59,        1,     6468, 0xc8a3cf61, S=1,     1024, 0xecb30526
-0,         60,         60,        1,     6737, 0xc27b3b79, S=1,     1024, 0xecb30526
-0,         61,         61,        1,     6275, 0x84d88e2b, S=1,     1024, 0xecb30526
-0,         62,         62,        1,     6641, 0xb44b3534, S=1,     1024, 0xecb30526
-0,         63,         63,        1,     6378, 0x3965888b, S=1,     1024, 0xecb30526
-0,         64,         64,        1,     6257, 0x12115750, S=1,     1024, 0xecb30526
-0,         65,         65,        1,     6908, 0x57137217, S=1,     1024, 0xecb30526
-0,         66,         66,        1,     7230, 0xbacc24ee, S=1,     1024, 0xecb30526
-0,         67,         67,        1,     7556, 0x1aa2a694, S=1,     1024, 0xecb30526
-0,         68,         68,        1,     7413, 0xbc9e7718, S=1,     1024, 0xecb30526
-0,         69,         69,        1,     7476, 0xb2a1aba0, S=1,     1024, 0xecb30526
-0,         70,         70,        1,     7596, 0x3301e56d, S=1,     1024, 0xecb30526
-0,         71,         71,        1,     7756, 0x8f2504f8, S=1,     1024, 0xecb30526
-0,         72,         72,        1,     8015, 0xd4146c80, S=1,     1024, 0xecb30526
-0,         73,         73,        1,     8128, 0x11b2bf4c, S=1,     1024, 0xecb30526
-0,         74,         74,        1,     8101, 0xc627adbe, S=1,     1024, 0xecb30526
-0,         75,         75,        1,     7863, 0xe99f3f3b, S=1,     1024, 0xecb30526
-0,         76,         76,        1,     7960, 0x4bc091b8, S=1,     1024, 0xecb30526
-0,         77,         77,        1,     8238, 0x1086ea8a, S=1,     1024, 0xecb30526
-0,         78,         78,        1,     8321, 0x3a404791, S=1,     1024, 0xecb30526
-0,         79,         79,        1,     8562, 0xcbdcc01e, S=1,     1024, 0xecb30526
-0,         80,         80,        1,     8746, 0xec190b22, S=1,     1024, 0xecb30526
-0,         81,         81,        1,     8578, 0x12e7a4e8, S=1,     1024, 0xecb30526
-0,         82,         82,        1,     8878, 0x51c05771, S=1,     1024, 0xecb30526
-0,         83,         83,        1,     9077, 0xe12b589b, S=1,     1024, 0xecb30526
-0,         84,         84,        1,     9310, 0xde3bf881, S=1,     1024, 0xecb30526
-0,         85,         85,        1,     9394, 0x1eba46cc, S=1,     1024, 0xecb30526
-0,         86,         86,        1,     9161, 0x7c359911, S=1,     1024, 0xecb30526
-0,         87,         87,        1,     9462, 0xccda3664, S=1,     1024, 0xecb30526
-0,         88,         88,        1,     9650, 0x6e6292fc, S=1,     1024, 0xecb30526
-0,         89,         89,        1,     9701, 0x08909b95, S=1,     1024, 0xecb30526
-0,         90,         90,        1,     9523, 0xe61b38bb, S=1,     1024, 0xecb30526
-0,         91,         91,        1,     9891, 0x96b90b98, S=1,     1024, 0xecb30526
-0,         92,         92,        1,    10005, 0x2db84c80, S=1,     1024, 0xecb30526
-0,         93,         93,        1,    10038, 0x37e52a72, S=1,     1024, 0xecb30526
-0,         94,         94,        1,    10086, 0x135a43e4, S=1,     1024, 0xecb30526
-0,         95,         95,        1,    10438, 0x472c0372, S=1,     1024, 0xecb30526
-0,         96,         96,        1,    10583, 0xcf4c5862, S=1,     1024, 0xecb30526
-0,         97,         97,        1,    10581, 0xce658137, S=1,     1024, 0xecb30526
-0,         98,         98,        1,    10807, 0x3954dad9, S=1,     1024, 0xecb30526
-0,         99,         99,        1,    11111, 0x5f8d504f, S=1,     1024, 0xecb30526
-0,        100,        100,        1,    11194, 0x3c7e6a77, S=1,     1024, 0xecb30526
-0,        101,        101,        1,    11240, 0x5112a0a3, S=1,     1024, 0xecb30526
-0,        102,        102,        1,    11483, 0xaf10f4fa, S=1,     1024, 0xecb30526
-0,        103,        103,        1,    11680, 0x44a25971, S=1,     1024, 0xecb30526
-0,        104,        104,        1,    11785, 0x7350b5db, S=1,     1024, 0xecb30526
-0,        105,        105,        1,    11436, 0xe3170ad5, S=1,     1024, 0xecb30526
-0,        106,        106,        1,    11928, 0x13d8c885, S=1,     1024, 0xecb30526
-0,        107,        107,        1,    11932, 0xecb5bdf7, S=1,     1024, 0xecb30526
-0,        108,        108,        1,    12281, 0x18bb76d5, S=1,     1024, 0xecb30526
-0,        109,        109,        1,    12334, 0x16147fc3, S=1,     1024, 0xecb30526
-0,        110,        110,        1,    12452, 0x61a8b3d7, S=1,     1024, 0xecb30526
-0,        111,        111,        1,    12695, 0x8b703e74, S=1,     1024, 0xecb30526
-0,        112,        112,        1,    12668, 0x19505176, S=1,     1024, 0xecb30526
-0,        113,        113,        1,    12957, 0x3b839f0d, S=1,     1024, 0xecb30526
-0,        114,        114,        1,    13054, 0xb8a5e3db, S=1,     1024, 0xecb30526
-0,        115,        115,        1,    13147, 0xdf5c2e68, S=1,     1024, 0xecb30526
-0,        116,        116,        1,    13171, 0x15961ca2, S=1,     1024, 0xecb30526
-0,        117,        117,        1,    13198, 0xfd855718, S=1,     1024, 0xecb30526
-0,        118,        118,        1,    13211, 0x1a625e31, S=1,     1024, 0xecb30526
-0,        119,        119,        1,    13210, 0x246661c9, S=1,     1024, 0xecb30526
-0,        120,        120,        1,    13467, 0xfcaaa461, S=1,     1024, 0xecb30526
-0,        121,        121,        1,    13665, 0x8100dbf2, S=1,     1024, 0xecb30526
-0,        122,        122,        1,    13692, 0xddd1eab9, S=1,     1024, 0xecb30526
-0,        123,        123,        1,    13821, 0xc70e2af0, S=1,     1024, 0xecb30526
-0,        124,        124,        1,    13946, 0xe15d9134, S=1,     1024, 0xecb30526
-0,        125,        125,        1,    14063, 0xf652d232, S=1,     1024, 0xecb30526
-0,        126,        126,        1,    14124, 0x756ccc81, S=1,     1024, 0xecb30526
-0,        127,        127,        1,    14331, 0x56d64fe8, S=1,     1024, 0xecb30526
-0,        128,        128,        1,    14469, 0x4c3faa7f, S=1,     1024, 0xecb30526
-0,        129,        129,        1,    14536, 0xad02a19b, S=1,     1024, 0xecb30526
-0,        130,        130,        1,    14608, 0x0971d168, S=1,     1024, 0xecb30526
-0,        131,        131,        1,    14898, 0x1a6827b3, S=1,     1024, 0xecb30526
-0,        132,        132,        1,    14978, 0xf9709fef, S=1,     1024, 0xecb30526
-0,        133,        133,        1,    15142, 0x3598da63, S=1,     1024, 0xecb30526
-0,        134,        134,        1,    15129, 0x062fb976, S=1,     1024, 0xecb30526
-0,        135,        135,        1,    15243, 0x0a6a12f9, S=1,     1024, 0xecb30526
-0,        136,        136,        1,    15337, 0x0f9a65d6, S=1,     1024, 0xecb30526
-0,        137,        137,        1,    15638, 0xf7bc9ef5, S=1,     1024, 0xecb30526
-0,        138,        138,        1,    15912, 0x2d5b26bb, S=1,     1024, 0xecb30526
-0,        139,        139,        1,    16041, 0xbfaf4857, S=1,     1024, 0xecb30526
-0,        140,        140,        1,    16228, 0xdac701f0, S=1,     1024, 0xecb30526
-0,        141,        141,        1,    16262, 0xcd0ae5e4, S=1,     1024, 0xecb30526
-0,        142,        142,        1,    16371, 0x9d4f0e73, S=1,     1024, 0xecb30526
-0,        143,        143,        1,    16661, 0xd37ba990, S=1,     1024, 0xecb30526
-0,        144,        144,        1,    16917, 0xd5b01774, S=1,     1024, 0xecb30526
-0,        145,        145,        1,    17149, 0x435ecdd4, S=1,     1024, 0xecb30526
-0,        146,        146,        1,    17172, 0x045fb234, S=1,     1024, 0xecb30526
-0,        147,        147,        1,    17315, 0xc5ddadab, S=1,     1024, 0xecb30526
-0,        148,        148,        1,    17397, 0xff8e15b6, S=1,     1024, 0xecb30526
-0,        149,        149,        1,    17431, 0x6832f8c0, S=1,     1024, 0xecb30526
-0,        150,        150,        1,    17576, 0x5c2a5445, S=1,     1024, 0xecb30526
-0,        151,        151,        1,    17764, 0x609f8c3b, S=1,     1024, 0xecb30526
-0,        152,        152,        1,    17826, 0x538c8532, S=1,     1024, 0xecb30526
-0,        153,        153,        1,    17918, 0x84fc9a95, S=1,     1024, 0xecb30526
-0,        154,        154,        1,    17823, 0x788fbada, S=1,     1024, 0xecb30526
-0,        155,        155,        1,    18142, 0x56881e47, S=1,     1024, 0xecb30526
-0,        156,        156,        1,    18257, 0xa35b86cf, S=1,     1024, 0xecb30526
-0,        157,        157,        1,    18337, 0x82ddbc21, S=1,     1024, 0xecb30526
-0,        158,        158,        1,    18293, 0xf0d838d6, S=1,     1024, 0xecb30526
-0,        159,        159,        1,    18418, 0x7ed8bba6, S=1,     1024, 0xecb30526
-0,        160,        160,        1,    18607, 0xccea47f6, S=1,     1024, 0xecb30526
-0,        161,        161,        1,    18916, 0x880ebd63, S=1,     1024, 0xecb30526
-0,        162,        162,        1,    19073, 0x055f02e3, S=1,     1024, 0xecb30526
-0,        163,        163,        1,    19168, 0xcc2c02d7, S=1,     1024, 0xecb30526
-0,        164,        164,        1,    19210, 0xa538ffc1, S=1,     1024, 0xecb30526
-0,        165,        165,        1,    19398, 0x4777644d, S=1,     1024, 0xecb30526
-0,        166,        166,        1,    19480, 0xcb2aa0fa, S=1,     1024, 0xecb30526
-0,        167,        167,        1,    19659, 0xe3c1122d, S=1,     1024, 0xecb30526
-0,        168,        168,        1,    19672, 0x1d1e193f, S=1,     1024, 0xecb30526
-0,        169,        169,        1,    19936, 0xcd036346, S=1,     1024, 0xecb30526
-0,        170,        170,        1,    19975, 0x96529b21, S=1,     1024, 0xecb30526
-0,        171,        171,        1,    20021, 0xcdaf8bb5, S=1,     1024, 0xecb30526
-0,        172,        172,        1,    20060, 0x1cea7784, S=1,     1024, 0xecb30526
+0,          0,          0,        1,     1297, 0x5618fe71
+0,          1,          1,        1,      158, 0xfa673468, F=0x0
+0,          2,          2,        1,      143, 0x61cf2b35, F=0x0
+0,          3,          3,        1,      169, 0x152a369a, F=0x0
+0,          4,          4,        1,      254, 0x22935c08, F=0x0
+0,          5,          5,        1,      221, 0x9972496f, F=0x0
+0,          6,          6,        1,      176, 0xf6af3ab2, F=0x0
+0,          7,          7,        1,      189, 0xcdc23f20, F=0x0
+0,          8,          8,        1,      139, 0x081e3020, F=0x0
+0,          9,          9,        1,      160, 0x9153335f, F=0x0
+0,         10,         10,        1,      149, 0x8fa12e7d, F=0x0
+0,         11,         11,        1,      190, 0x43ef3de1, F=0x0
+0,         12,         12,        1,      308, 0x95c77160, F=0x0
+0,         13,         13,        1,      193, 0xf9084196, F=0x0
+0,         14,         14,        1,      191, 0x07784447, F=0x0
+0,         15,         15,        1,      198, 0x7d72420a, F=0x0
+0,         16,         16,        1,      417, 0xbf40acdc, F=0x0
+0,         17,         17,        1,      163, 0xf7df3842, F=0x0
+0,         18,         18,        1,      383, 0xadcf9e8e, F=0x0
+0,         19,         19,        1,      193, 0xba544052, F=0x0
+0,         20,         20,        1,      337, 0x1510922f, F=0x0
+0,         21,         21,        1,      199, 0x11d64936, F=0x0
+0,         22,         22,        1,      308, 0x79597dbc, F=0x0
+0,         23,         23,        1,      186, 0x25d04175, F=0x0
+0,         24,         24,        1,      199, 0x8b65402f, F=0x0
+0,         25,         25,        1,      163, 0x128e38b6, F=0x0
+0,         26,         26,        1,      302, 0xacc979b2, F=0x0
+0,         27,         27,        1,      189, 0x491f3c5c, F=0x0
+0,         28,         28,        1,      157, 0x50783600, F=0x0
+0,         29,         29,        1,      205, 0xad9045b3, F=0x0
+0,         30,         30,        1,      160, 0xcbf332f8, F=0x0
+0,         31,         31,        1,      202, 0xc72c48bf, F=0x0
+0,         32,         32,        1,      160, 0xe6c436dd, F=0x0
+0,         33,         33,        1,      215, 0x4f705072, F=0x0
+0,         34,         34,        1,      422, 0xed27b0b0, F=0x0
+0,         35,         35,        1,      184, 0x6ba8415a, F=0x0
+0,         36,         36,        1,      289, 0x0b5f73a3, F=0x0
+0,         37,         37,        1,      190, 0xea5b4316, F=0x0
+0,         38,         38,        1,      195, 0xd9f2441d, F=0x0
+0,         39,         39,        1,      199, 0x47e34e05, F=0x0
+0,         40,         40,        1,      448, 0xec8bbf56, F=0x0
+0,         41,         41,        1,      170, 0x42fb3755, F=0x0
+0,         42,         42,        1,      279, 0x87cc6f54, F=0x0
+0,         43,         43,        1,      180, 0x085f398a, F=0x0
+0,         44,         44,        1,      303, 0x46fe7c55, F=0x0
+0,         45,         45,        1,      209, 0xc60b5116, F=0x0
+0,         46,         46,        1,      198, 0x795f4655, F=0x0
+0,         47,         47,        1,      194, 0xeb1b4abe, F=0x0
+0,         48,         48,        1,      186, 0x97b44251, F=0x0
+0,         49,         49,        1,     1200, 0xeb5a36ba, F=0x0
+0,         50,         50,        1,      204, 0x00bc4594, F=0x0
+0,         51,         51,        1,     1066, 0xdc39eee0, F=0x0
+0,         52,         52,        1,      187, 0x344b4304, F=0x0
+0,         53,         53,        1,      323, 0x899f8522, F=0x0
+0,         54,         54,        1,      205, 0x48af49da, F=0x0
+0,         55,         55,        1,      213, 0xf2534ff5, F=0x0
+0,         56,         56,        1,      208, 0x8fba4b25, F=0x0
+0,         57,         57,        1,      737, 0x1612477c, F=0x0
+0,         58,         58,        1,      181, 0x903b38ad, F=0x0
+0,         59,         59,        1,      614, 0xb154157d, F=0x0
+0,         60,         60,        1,      215, 0x4e82532e, F=0x0
+0,         61,         61,        1,      291, 0x69476efd, F=0x0
+0,         62,         62,        1,      208, 0x471d4ea1, F=0x0
+0,         63,         63,        1,      208, 0xa2b04628, F=0x0
+0,         64,         64,        1,      203, 0x96d646b2, F=0x0
+0,         65,         65,        1,      531, 0xd085ea85, F=0x0
+0,         66,         66,        1,      178, 0x51663ad1, F=0x0
+0,         67,         67,        1,      446, 0x00adbe2d, F=0x0
+0,         68,         68,        1,      188, 0x7ccb3dda, F=0x0
+0,         69,         69,        1,      177, 0xd881441a, F=0x0
+0,         70,         70,        1,      112, 0x44cc2135, F=0x0
+0,         71,         71,        1,      296, 0x717d7172, F=0x0
+0,         72,         72,        1,      153, 0xbd403424, F=0x0
+0,         73,         73,        1,      218, 0x1d9a4f26, F=0x0
+0,         74,         74,        1,      202, 0x6ee647eb, F=0x0
+0,         75,         75,        1,      239, 0x71245ad2, F=0x0
+0,         76,         76,        1,      139, 0xbbdd2d23, F=0x0
+0,         77,         77,        1,      467, 0x6e1cc838, F=0x0
+0,         78,         78,        1,      274, 0xea1079c5, F=0x0
+0,         79,         79,        1,      404, 0xbf5caaa0, F=0x0
+0,         80,         80,        1,      257, 0xac4865e5, F=0x0
+0,         81,         81,        1,      419, 0xa45ab5fc, F=0x0
+0,         82,         82,        1,      208, 0xb5dd4fc3, F=0x0
+0,         83,         83,        1,      294, 0xcf5176ee, F=0x0
+0,         84,         84,        1,      191, 0xed7e3e98, F=0x0
+0,         85,         85,        1,      181, 0x9105450e, F=0x0
+0,         86,         86,        1,      218, 0x445c54ae, F=0x0
+0,         87,         87,        1,      423, 0x5dc9bec5, F=0x0
+0,         88,         88,        1,      202, 0xdfde4a35, F=0x0
+0,         89,         89,        1,      317, 0x9a918033, F=0x0
+0,         90,         90,        1,      172, 0x081e3d8c, F=0x0
+0,         91,         91,        1,      275, 0x37536b50, F=0x0
+0,         92,         92,        1,      214, 0xecfc4e8f, F=0x0
+0,         93,         93,        1,      182, 0x85bf44e5, F=0x0
+0,         94,         94,        1,      151, 0x4c8230ae, F=0x0
+0,         95,         95,        1,      157, 0xa02a32eb, F=0x0
+0,         96,         96,        1,      202, 0xb24a4355, F=0x0
+0,         97,         97,        1,      162, 0x632d3576, F=0x0
+0,         98,         98,        1,      186, 0x6f9c407c, F=0x0
+0,         99,         99,        1,      318, 0xade078ca, F=0x0
+0,        100,        100,        1,      225, 0xd2754eee, F=0x0
+0,        101,        101,        1,      207, 0xdedb4552, F=0x0
+0,        102,        102,        1,      212, 0x25384cd1, F=0x0
+0,        103,        103,        1,      153, 0x489434d3, F=0x0
+0,        104,        104,        1,      196, 0x659145f9, F=0x0
+0,        105,        105,        1,      146, 0x8b223366, F=0x0
+0,        106,        106,        1,      194, 0x0bc14890, F=0x0
+0,        107,        107,        1,      304, 0xdece8235, F=0x0
+0,        108,        108,        1,      194, 0x7737464d, F=0x0
+0,        109,        109,        1,      190, 0x945e43a4, F=0x0
+0,        110,        110,        1,      204, 0x8de14af3, F=0x0
+0,        111,        111,        1,      136, 0xd0862cb1, F=0x0
+0,        112,        112,        1,      171, 0xff6f3da8, F=0x0
+0,        113,        113,        1,      140, 0x3475307b, F=0x0
+0,        114,        114,        1,      158, 0x8f31321e, F=0x0
+0,        115,        115,        1,       94, 0xf6691c01, F=0x0
+0,        116,        116,        1,      110, 0x66e52218, F=0x0
+0,        117,        117,        1,      256, 0x4b086864, F=0x0
+0,        118,        118,        1,      220, 0x6fb75337, F=0x0
+0,        119,        119,        1,      221, 0x69a94e72, F=0x0
+0,        120,        120,        1,      205, 0xbae94509, F=0x0
+0,        121,        121,        1,      169, 0xdd3c388b, F=0x0
+0,        122,        122,        1,      970, 0x9771c82f, F=0x0
+0,        123,        123,        1,      181, 0xec794298, F=0x0
+0,        124,        124,        1,      955, 0x23edba10, F=0x0
+0,        125,        125,        1,      158, 0x3ad83314, F=0x0
+0,        126,        126,        1,      344, 0x29aa8843, F=0x0
+0,        127,        127,        1,      627, 0x6d3f18dc, F=0x0
+0,        128,        128,        1,      172, 0x985d3cc5, F=0x0
+0,        129,        129,        1,      494, 0x591cdcc3, F=0x0
+0,        130,        130,        1,      184, 0x83ca42c1, F=0x0
+0,        131,        131,        1,      352, 0x68169925, F=0x0
+0,        132,        132,        1,      351, 0x06998cfa, F=0x0
+0,        133,        133,        1,      170, 0xaec83809, F=0x0
+0,        134,        134,        1,      275, 0xd1ea6a74, F=0x0
+0,        135,        135,        1,      168, 0xe9b93a2e, F=0x0
+0,        136,        136,        1,      169, 0xa27f3870, F=0x0
+0,        137,        137,        1,      521, 0xf195dc2e, F=0x0
+0,        138,        138,        1,     1262, 0x52b34497, F=0x0
+0,        139,        139,        1,      994, 0x9d72bc25, F=0x0
+0,        140,        140,        1,      290, 0xb2c17360, F=0x0
+0,        141,        141,        1,      188, 0x2c30402b, F=0x0
+0,        142,        142,        1,      164, 0x8bb13b7a, F=0x0
+0,        143,        143,        1,      212, 0x69af44ca, F=0x0
+0,        144,        144,        1,      870, 0xebc09472, F=0x0
+0,        145,        145,        1,      635, 0x1f781aee, F=0x0
+0,        146,        146,        1,      290, 0x01a5786c, F=0x0
+0,        147,        147,        1,      211, 0xec4d5052, F=0x0
+0,        148,        148,        1,      177, 0x56db3c7b, F=0x0
+0,        149,        149,        1,      182, 0x312c3f58, F=0x0
+0,        150,        150,        1,      588, 0x9924fcca, F=0x0
+0,        151,        151,        1,      163, 0xe23a370e, F=0x0
+0,        152,        152,        1,      407, 0x525ab1a8, F=0x0
+0,        153,        153,        1,      204, 0x0b84449d, F=0x0
+0,        154,        154,        1,      290, 0xa97e7886, F=0x0
+0,        155,        155,        1,      308, 0xac988116, F=0x0
+0,        156,        156,        1,      196, 0x6d6c47fa, F=0x0
+0,        157,        157,        1,      181, 0x7a413f71, F=0x0
+0,        158,        158,        1,      203, 0xb03b4fa8, F=0x0
+0,        159,        159,        1,      227, 0xb3d55aeb, F=0x0
+0,        160,        160,        1,      524, 0xa731e285, F=0x0
+0,        161,        161,        1,      377, 0x4ac097de, F=0x0
+0,        162,        162,        1,      196, 0x78264511, F=0x0
+0,        163,        163,        1,      250, 0x6d4f65a1, F=0x0
+0,        164,        164,        1,      214, 0x31534ffe, F=0x0
+0,        165,        165,        1,      323, 0xd4d78fa2, F=0x0
+0,        166,        166,        1,      176, 0x642e40ab, F=0x0
+0,        167,        167,        1,      305, 0x63db7e18, F=0x0
+0,        168,        168,        1,      179, 0x4c4042da, F=0x0
+0,        169,        169,        1,      245, 0x645264fb, F=0x0
+0,        170,        170,        1,      181, 0x0a3e403e, F=0x0
+0,        171,        171,        1,      241, 0x592e57b1, F=0x0
+0,        172,        172,        1,      172, 0xf5cb3f7f, F=0x0
diff --git a/tests/ref/fate/gifenc-rgb8 b/tests/ref/fate/gifenc-rgb8
index 490e4d0..dd1648e 100644
--- a/tests/ref/fate/gifenc-rgb8
+++ b/tests/ref/fate/gifenc-rgb8
@@ -3,176 +3,176 @@
 #codec_id 0: gif
 #dimensions 0: 217x217
 #sar 0: 0/1
-0,          0,          0,        1,      552, 0x47602c6c
-0,          1,          1,        1,      297, 0x49dd8847, S=1,     1024, 0xcfc8799f
-0,          2,          2,        1,      438, 0x4776d352, S=1,     1024, 0xcfc8799f
-0,          3,          3,        1,      450, 0x2254d187, S=1,     1024, 0xcfc8799f
-0,          4,          4,        1,      547, 0xe16104bc, S=1,     1024, 0xcfc8799f
-0,          5,          5,        1,      614, 0x0fdc2027, S=1,     1024, 0xcfc8799f
-0,          6,          6,        1,      642, 0xa0af1edf, S=1,     1024, 0xcfc8799f
-0,          7,          7,        1,      660, 0xd0763931, S=1,     1024, 0xcfc8799f
-0,          8,          8,        1,      821, 0xc38f7fac, S=1,     1024, 0xcfc8799f
-0,          9,          9,        1,     1157, 0x4c112ecd, S=1,     1024, 0xcfc8799f
-0,         10,         10,        1,      179, 0x0690541c, S=1,     1024, 0xcfc8799f
-0,         11,         11,        1,     1333, 0x216f70a7, S=1,     1024, 0xcfc8799f
-0,         12,         12,        1,     1638, 0x901c093d, S=1,     1024, 0xcfc8799f
-0,         13,         13,        1,     1531, 0xc9bae5ff, S=1,     1024, 0xcfc8799f
-0,         14,         14,        1,     1720, 0xce854743, S=1,     1024, 0xcfc8799f
-0,         15,         15,        1,     1910, 0x2690866d, S=1,     1024, 0xcfc8799f
-0,         16,         16,        1,     2124, 0xa586dad0, S=1,     1024, 0xcfc8799f
-0,         17,         17,        1,     2248, 0x9ddc2a88, S=1,     1024, 0xcfc8799f
-0,         18,         18,        1,     2311, 0xd64235af, S=1,     1024, 0xcfc8799f
-0,         19,         19,        1,     2408, 0xe2a66cc9, S=1,     1024, 0xcfc8799f
-0,         20,         20,        1,     2601, 0xeab6c267, S=1,     1024, 0xcfc8799f
-0,         21,         21,        1,     2687, 0xfe1d0311, S=1,     1024, 0xcfc8799f
-0,         22,         22,        1,     2784, 0xca600dee, S=1,     1024, 0xcfc8799f
-0,         23,         23,        1,     2884, 0xc7134b99, S=1,     1024, 0xcfc8799f
-0,         24,         24,        1,     2982, 0x0b1e7825, S=1,     1024, 0xcfc8799f
-0,         25,         25,        1,     3101, 0x3e029e0e, S=1,     1024, 0xcfc8799f
-0,         26,         26,        1,     3253, 0x846af678, S=1,     1024, 0xcfc8799f
-0,         27,         27,        1,     3329, 0x29a81b71, S=1,     1024, 0xcfc8799f
-0,         28,         28,        1,     3572, 0xa3e08a52, S=1,     1024, 0xcfc8799f
-0,         29,         29,        1,     3807, 0x18e1fed2, S=1,     1024, 0xcfc8799f
-0,         30,         30,        1,     2750, 0xff6e1f9e, S=1,     1024, 0xcfc8799f
-0,         31,         31,        1,     4031, 0x6d4f7329, S=1,     1024, 0xcfc8799f
-0,         32,         32,        1,     3025, 0xb43c9e94, S=1,     1024, 0xcfc8799f
-0,         33,         33,        1,     4295, 0xc1850a80, S=1,     1024, 0xcfc8799f
-0,         34,         34,        1,     2044, 0x0440c072, S=1,     1024, 0xcfc8799f
-0,         35,         35,        1,     3212, 0xe91af08f, S=1,     1024, 0xcfc8799f
-0,         36,         36,        1,     2292, 0x6765633e, S=1,     1024, 0xcfc8799f
-0,         37,         37,        1,     3633, 0xac779aa3, S=1,     1024, 0xcfc8799f
-0,         38,         38,        1,     3552, 0xed2c75b2, S=1,     1024, 0xcfc8799f
-0,         39,         39,        1,     3690, 0x2020dd0d, S=1,     1024, 0xcfc8799f
-0,         40,         40,        1,     1559, 0x596ef330, S=1,     1024, 0xcfc8799f
-0,         41,         41,        1,      954, 0xac12c9c5, S=1,     1024, 0xcfc8799f
-0,         42,         42,        1,      273, 0x138c7831, S=1,     1024, 0xcfc8799f
-0,         43,         43,        1,      930, 0xf1c3ae3f, S=1,     1024, 0xcfc8799f
-0,         44,         44,        1,      271, 0x921a80af, S=1,     1024, 0xcfc8799f
-0,         45,         45,        1,      196, 0xa5de5322, S=1,     1024, 0xcfc8799f
-0,         46,         46,        1,     4299, 0x5bac0d86, S=1,     1024, 0xcfc8799f
-0,         47,         47,        1,     4895, 0xc43639a6, S=1,     1024, 0xcfc8799f
-0,         48,         48,        1,     4928, 0xf17d13e8, S=1,     1024, 0xcfc8799f
-0,         49,         49,        1,     4941, 0x71915520, S=1,     1024, 0xcfc8799f
-0,         50,         50,        1,     4154, 0xc860b8a6, S=1,     1024, 0xcfc8799f
-0,         51,         51,        1,     4678, 0x2651c339, S=1,     1024, 0xcfc8799f
-0,         52,         52,        1,     4741, 0xffd6bb45, S=1,     1024, 0xcfc8799f
-0,         53,         53,        1,     4982, 0x132c5977, S=1,     1024, 0xcfc8799f
-0,         54,         54,        1,     5179, 0x97aac3a1, S=1,     1024, 0xcfc8799f
-0,         55,         55,        1,     5046, 0x836a80cd, S=1,     1024, 0xcfc8799f
-0,         56,         56,        1,     5140, 0xa725c1e7, S=1,     1024, 0xcfc8799f
-0,         57,         57,        1,     4301, 0x0203f239, S=1,     1024, 0xcfc8799f
-0,         58,         58,        1,     5079, 0xb2e7a2de, S=1,     1024, 0xcfc8799f
-0,         59,         59,        1,     5284, 0xb757dfe1, S=1,     1024, 0xcfc8799f
-0,         60,         60,        1,     5426, 0xf9f11e57, S=1,     1024, 0xcfc8799f
-0,         61,         61,        1,     4645, 0xf0f289e1, S=1,     1024, 0xcfc8799f
-0,         62,         62,        1,     5263, 0x8617d7e9, S=1,     1024, 0xcfc8799f
-0,         63,         63,        1,     5221, 0x26e3ca43, S=1,     1024, 0xcfc8799f
-0,         64,         64,        1,     5217, 0x90989cfb, S=1,     1024, 0xcfc8799f
-0,         65,         65,        1,     5395, 0xe29a01cb, S=1,     1024, 0xcfc8799f
-0,         66,         66,        1,     5220, 0xe2dee355, S=1,     1024, 0xcfc8799f
-0,         67,         67,        1,     5704, 0xcfbcd55e, S=1,     1024, 0xcfc8799f
-0,         68,         68,        1,     5636, 0x7fc2a1e5, S=1,     1024, 0xcfc8799f
-0,         69,         69,        1,     5818, 0x6090ebbd, S=1,     1024, 0xcfc8799f
-0,         70,         70,        1,     5763, 0xc110c791, S=1,     1024, 0xcfc8799f
-0,         71,         71,        1,     6116, 0xb4ee8e30, S=1,     1024, 0xcfc8799f
-0,         72,         72,        1,     6069, 0x21b263db, S=1,     1024, 0xcfc8799f
-0,         73,         73,        1,     5796, 0x2514df52, S=1,     1024, 0xcfc8799f
-0,         74,         74,        1,     5999, 0x1c3c3701, S=1,     1024, 0xcfc8799f
-0,         75,         75,        1,     6220, 0x8340b150, S=1,     1024, 0xcfc8799f
-0,         76,         76,        1,     6374, 0x00d8eaa5, S=1,     1024, 0xcfc8799f
-0,         77,         77,        1,     6465, 0x74c4778a, S=1,     1024, 0xcfc8799f
-0,         78,         78,        1,     7019, 0xdb1a28a3, S=1,     1024, 0xcfc8799f
-0,         79,         79,        1,     7255, 0x1e19b76e, S=1,     1024, 0xcfc8799f
-0,         80,         80,        1,     8197, 0x26bc6a79, S=1,     1024, 0xcfc8799f
-0,         81,         81,        1,     8358, 0x118781e0, S=1,     1024, 0xcfc8799f
-0,         82,         82,        1,     7708, 0xfc0c963d, S=1,     1024, 0xcfc8799f
-0,         83,         83,        1,     7412, 0xdcc311ee, S=1,     1024, 0xcfc8799f
-0,         84,         84,        1,     7541, 0x4d2819c1, S=1,     1024, 0xcfc8799f
-0,         85,         85,        1,     7948, 0xf12eca3d, S=1,     1024, 0xcfc8799f
-0,         86,         86,        1,     8408, 0x43add468, S=1,     1024, 0xcfc8799f
-0,         87,         87,        1,     8056, 0x2d162377, S=1,     1024, 0xcfc8799f
-0,         88,         88,        1,     7401, 0x26ebb649, S=1,     1024, 0xcfc8799f
-0,         89,         89,        1,     7494, 0x35fcf9ae, S=1,     1024, 0xcfc8799f
-0,         90,         90,        1,     7806, 0x4238723d, S=1,     1024, 0xcfc8799f
-0,         91,         91,        1,     7768, 0xb01e795a, S=1,     1024, 0xcfc8799f
-0,         92,         92,        1,     7749, 0x6ab39c12, S=1,     1024, 0xcfc8799f
-0,         93,         93,        1,     8047, 0x0e5f24aa, S=1,     1024, 0xcfc8799f
-0,         94,         94,        1,     7618, 0xd787340f, S=1,     1024, 0xcfc8799f
-0,         95,         95,        1,     7979, 0x0824c4df, S=1,     1024, 0xcfc8799f
-0,         96,         96,        1,    12062, 0xc46d9d92, S=1,     1024, 0xcfc8799f
-0,         97,         97,        1,    12317, 0x1314dc0c, S=1,     1024, 0xcfc8799f
-0,         98,         98,        1,    12217, 0x78c2ed30, S=1,     1024, 0xcfc8799f
-0,         99,         99,        1,    11227, 0x2a578eb9, S=1,     1024, 0xcfc8799f
-0,        100,        100,        1,    11108, 0x4eaa068c, S=1,     1024, 0xcfc8799f
-0,        101,        101,        1,    11366, 0x48f8993f, S=1,     1024, 0xcfc8799f
-0,        102,        102,        1,    11896, 0x32414841, S=1,     1024, 0xcfc8799f
-0,        103,        103,        1,    11479, 0xeaa38225, S=1,     1024, 0xcfc8799f
-0,        104,        104,        1,    13395, 0xaa9d4c72, S=1,     1024, 0xcfc8799f
-0,        105,        105,        1,    12913, 0x28854353, S=1,     1024, 0xcfc8799f
-0,        106,        106,        1,    13864, 0x663df630, S=1,     1024, 0xcfc8799f
-0,        107,        107,        1,    13551, 0xf7ba7be7, S=1,     1024, 0xcfc8799f
-0,        108,        108,        1,    14041, 0x2dc071b9, S=1,     1024, 0xcfc8799f
-0,        109,        109,        1,    14144, 0x33a03d1d, S=1,     1024, 0xcfc8799f
-0,        110,        110,        1,    14277, 0x6bda5935, S=1,     1024, 0xcfc8799f
-0,        111,        111,        1,    14424, 0xa696efd8, S=1,     1024, 0xcfc8799f
-0,        112,        112,        1,    14689, 0x8e3ad12c, S=1,     1024, 0xcfc8799f
-0,        113,        113,        1,    14598, 0x544668b4, S=1,     1024, 0xcfc8799f
-0,        114,        114,        1,    15213, 0x60009558, S=1,     1024, 0xcfc8799f
-0,        115,        115,        1,    15425, 0x86e5adf4, S=1,     1024, 0xcfc8799f
-0,        116,        116,        1,    15595, 0x878d09b9, S=1,     1024, 0xcfc8799f
-0,        117,        117,        1,    15598, 0x10daabc4, S=1,     1024, 0xcfc8799f
-0,        118,        118,        1,    15863, 0x2462016c, S=1,     1024, 0xcfc8799f
-0,        119,        119,        1,    15717, 0xe05041c4, S=1,     1024, 0xcfc8799f
-0,        120,        120,        1,    16078, 0x7c8f3a8c, S=1,     1024, 0xcfc8799f
-0,        121,        121,        1,    16225, 0x9771a52e, S=1,     1024, 0xcfc8799f
-0,        122,        122,        1,    16135, 0x2dfc1692, S=1,     1024, 0xcfc8799f
-0,        123,        123,        1,    16661, 0x09c96d7e, S=1,     1024, 0xcfc8799f
-0,        124,        124,        1,    16619, 0xc4735b56, S=1,     1024, 0xcfc8799f
-0,        125,        125,        1,    16829, 0x589dc13f, S=1,     1024, 0xcfc8799f
-0,        126,        126,        1,    16944, 0x997cd18f, S=1,     1024, 0xcfc8799f
-0,        127,        127,        1,    17119, 0x6c396b60, S=1,     1024, 0xcfc8799f
-0,        128,        128,        1,    17150, 0x8e603d31, S=1,     1024, 0xcfc8799f
-0,        129,        129,        1,    17321, 0x0bbcee5a, S=1,     1024, 0xcfc8799f
-0,        130,        130,        1,    17395, 0x99f0c974, S=1,     1024, 0xcfc8799f
-0,        131,        131,        1,    17666, 0x37184223, S=1,     1024, 0xcfc8799f
-0,        132,        132,        1,    17730, 0xa0d385b3, S=1,     1024, 0xcfc8799f
-0,        133,        133,        1,    17934, 0xb22cc97d, S=1,     1024, 0xcfc8799f
-0,        134,        134,        1,    17944, 0x0cd309c6, S=1,     1024, 0xcfc8799f
-0,        135,        135,        1,    18238, 0x6b7e3237, S=1,     1024, 0xcfc8799f
-0,        136,        136,        1,    18391, 0x4df3c48a, S=1,     1024, 0xcfc8799f
-0,        137,        137,        1,    18543, 0x90a2f238, S=1,     1024, 0xcfc8799f
-0,        138,        138,        1,    18939, 0xc57dda5b, S=1,     1024, 0xcfc8799f
-0,        139,        139,        1,    19145, 0x1267294a, S=1,     1024, 0xcfc8799f
-0,        140,        140,        1,    19120, 0xeac6a9c3, S=1,     1024, 0xcfc8799f
-0,        141,        141,        1,    19130, 0x31f3edbc, S=1,     1024, 0xcfc8799f
-0,        142,        142,        1,    19494, 0x3259a2f3, S=1,     1024, 0xcfc8799f
-0,        143,        143,        1,    19534, 0xda22a752, S=1,     1024, 0xcfc8799f
-0,        144,        144,        1,    19747, 0x8805c379, S=1,     1024, 0xcfc8799f
-0,        145,        145,        1,    20114, 0xaaf96864, S=1,     1024, 0xcfc8799f
-0,        146,        146,        1,    20257, 0x7223da26, S=1,     1024, 0xcfc8799f
-0,        147,        147,        1,    20370, 0x08ef382a, S=1,     1024, 0xcfc8799f
-0,        148,        148,        1,    20292, 0x4b47f207, S=1,     1024, 0xcfc8799f
-0,        149,        149,        1,    20491, 0xeedd6d1c, S=1,     1024, 0xcfc8799f
-0,        150,        150,        1,    20647, 0xb0d1dd45, S=1,     1024, 0xcfc8799f
-0,        151,        151,        1,    20666, 0x382cc8a4, S=1,     1024, 0xcfc8799f
-0,        152,        152,        1,    21007, 0x398f4f7d, S=1,     1024, 0xcfc8799f
-0,        153,        153,        1,    21058, 0xd6616a9d, S=1,     1024, 0xcfc8799f
-0,        154,        154,        1,    21153, 0x988749db, S=1,     1024, 0xcfc8799f
-0,        155,        155,        1,    21078, 0x1b328059, S=1,     1024, 0xcfc8799f
-0,        156,        156,        1,    21458, 0x6348529c, S=1,     1024, 0xcfc8799f
-0,        157,        157,        1,    21669, 0xcf63e2de, S=1,     1024, 0xcfc8799f
-0,        158,        158,        1,    21581, 0x1fc021af, S=1,     1024, 0xcfc8799f
-0,        159,        159,        1,    21654, 0x899dab18, S=1,     1024, 0xcfc8799f
-0,        160,        160,        1,    21987, 0x634086fe, S=1,     1024, 0xcfc8799f
-0,        161,        161,        1,    22205, 0x617a7335, S=1,     1024, 0xcfc8799f
-0,        162,        162,        1,    22475, 0x9fa2e01c, S=1,     1024, 0xcfc8799f
-0,        163,        163,        1,    22490, 0x7dc5376c, S=1,     1024, 0xcfc8799f
-0,        164,        164,        1,    22460, 0x33e6bbfe, S=1,     1024, 0xcfc8799f
-0,        165,        165,        1,    22861, 0x18993510, S=1,     1024, 0xcfc8799f
-0,        166,        166,        1,    22746, 0xdff85615, S=1,     1024, 0xcfc8799f
-0,        167,        167,        1,    23165, 0xf0ac66a3, S=1,     1024, 0xcfc8799f
-0,        168,        168,        1,    23273, 0x13869ad9, S=1,     1024, 0xcfc8799f
-0,        169,        169,        1,    23211, 0xd30b6205, S=1,     1024, 0xcfc8799f
-0,        170,        170,        1,    23648, 0xa0cef01b, S=1,     1024, 0xcfc8799f
-0,        171,        171,        1,    23675, 0x760460b9, S=1,     1024, 0xcfc8799f
-0,        172,        172,        1,    23874, 0xacf998c5, S=1,     1024, 0xcfc8799f
+0,          0,          0,        1,     1341, 0xaa85adb1
+0,          1,          1,        1,      236, 0xa46f676e, F=0x0
+0,          2,          2,        1,      186, 0xd99b4ec2, F=0x0
+0,          3,          3,        1,      208, 0xb9be5007, F=0x0
+0,          4,          4,        1,      282, 0xe43d8422, F=0x0
+0,          5,          5,        1,      209, 0xda215145, F=0x0
+0,          6,          6,        1,      225, 0xc6375b19, F=0x0
+0,          7,          7,        1,      204, 0x467a54c1, F=0x0
+0,          8,          8,        1,      181, 0x1c0e4dae, F=0x0
+0,          9,          9,        1,      200, 0xc55e53c1, F=0x0
+0,         10,         10,        1,      184, 0x87644454, F=0x0
+0,         11,         11,        1,      191, 0x3847484a, F=0x0
+0,         12,         12,        1,      290, 0x9ce37f1f, F=0x0
+0,         13,         13,        1,      153, 0x7ab03afc, F=0x0
+0,         14,         14,        1,      175, 0x64bc4621, F=0x0
+0,         15,         15,        1,      187, 0x9284451d, F=0x0
+0,         16,         16,        1,      418, 0x7b18c8a5, F=0x0
+0,         17,         17,        1,      200, 0xf8e5527f, F=0x0
+0,         18,         18,        1,      347, 0xbc6494eb, F=0x0
+0,         19,         19,        1,      176, 0x8d1842e5, F=0x0
+0,         20,         20,        1,      294, 0x52fe8678, F=0x0
+0,         21,         21,        1,      166, 0x614142a1, F=0x0
+0,         22,         22,        1,      306, 0xafe8850d, F=0x0
+0,         23,         23,        1,      180, 0xa2cc44a0, F=0x0
+0,         24,         24,        1,      207, 0x91e25233, F=0x0
+0,         25,         25,        1,      204, 0x0f174cb7, F=0x0
+0,         26,         26,        1,      259, 0x629071c3, F=0x0
+0,         27,         27,        1,      181, 0x950e4a15, F=0x0
+0,         28,         28,        1,      152, 0x77023d8a, F=0x0
+0,         29,         29,        1,      194, 0x890b4d08, F=0x0
+0,         30,         30,        1,      159, 0xaa5a397d, F=0x0
+0,         31,         31,        1,      162, 0x8ae73c95, F=0x0
+0,         32,         32,        1,      178, 0x7fba4974, F=0x0
+0,         33,         33,        1,      187, 0x41fd52cc, F=0x0
+0,         34,         34,        1,      336, 0xd8139332, F=0x0
+0,         35,         35,        1,      184, 0x61b3484a, F=0x0
+0,         36,         36,        1,      227, 0x8be2607e, F=0x0
+0,         37,         37,        1,      182, 0x9bc84478, F=0x0
+0,         38,         38,        1,      162, 0x33423e3c, F=0x0
+0,         39,         39,        1,      187, 0x62fd4805, F=0x0
+0,         40,         40,        1,      503, 0xfc0ce5c8, F=0x0
+0,         41,         41,        1,      167, 0x40bd40d7, F=0x0
+0,         42,         42,        1,      289, 0xe5ad805c, F=0x0
+0,         43,         43,        1,      194, 0xc0174c24, F=0x0
+0,         44,         44,        1,      285, 0x48f38060, F=0x0
+0,         45,         45,        1,      199, 0x62bd52dc, F=0x0
+0,         46,         46,        1,      197, 0xcc1f4d1d, F=0x0
+0,         47,         47,        1,      203, 0xa0cb4c90, F=0x0
+0,         48,         48,        1,      208, 0x460155cd, F=0x0
+0,         49,         49,        1,     1198, 0x0b795bb1, F=0x0
+0,         50,         50,        1,      175, 0x36cc4a76, F=0x0
+0,         51,         51,        1,      740, 0xeb6f68b9, F=0x0
+0,         52,         52,        1,      180, 0xa22544ba, F=0x0
+0,         53,         53,        1,      238, 0x08ff6b12, F=0x0
+0,         54,         54,        1,      198, 0x3d4d50dd, F=0x0
+0,         55,         55,        1,      196, 0xbef74ccd, F=0x0
+0,         56,         56,        1,      224, 0x47c05ea9, F=0x0
+0,         57,         57,        1,      765, 0xb89e6f01, F=0x0
+0,         58,         58,        1,      149, 0x26bb3969, F=0x0
+0,         59,         59,        1,      479, 0xcdd6d6bf, F=0x0
+0,         60,         60,        1,      179, 0x537948eb, F=0x0
+0,         61,         61,        1,      217, 0x6b9b5b06, F=0x0
+0,         62,         62,        1,      190, 0x56b54a3a, F=0x0
+0,         63,         63,        1,      155, 0x487439ef, F=0x0
+0,         64,         64,        1,      167, 0x1bb947ba, F=0x0
+0,         65,         65,        1,      649, 0xb44a3058, F=0x0
+0,         66,         66,        1,      196, 0x66ae5688, F=0x0
+0,         67,         67,        1,      427, 0x8b0bd38d, F=0x0
+0,         68,         68,        1,      175, 0xbb9d4294, F=0x0
+0,         69,         69,        1,      284, 0x9f768221, F=0x0
+0,         70,         70,        1,      131, 0x612d2e14, F=0x0
+0,         71,         71,        1,      256, 0x701a69b4, F=0x0
+0,         72,         72,        1,      186, 0xf7114a80, F=0x0
+0,         73,         73,        1,      190, 0x53144c4d, F=0x0
+0,         74,         74,        1,      216, 0xc67b53e5, F=0x0
+0,         75,         75,        1,      154, 0xc04e39ba, F=0x0
+0,         76,         76,        1,      113, 0x4800284b, F=0x0
+0,         77,         77,        1,      402, 0xee43b0dd, F=0x0
+0,         78,         78,        1,      198, 0x55e451cc, F=0x0
+0,         79,         79,        1,      466, 0xb3c8cff3, F=0x0
+0,         80,         80,        1,      322, 0x5ade8d02, F=0x0
+0,         81,         81,        1,      387, 0x72edb2f7, F=0x0
+0,         82,         82,        1,      158, 0x12a5402c, F=0x0
+0,         83,         83,        1,      278, 0xd6727a4a, F=0x0
+0,         84,         84,        1,      190, 0x58205087, F=0x0
+0,         85,         85,        1,      175, 0x9a58432a, F=0x0
+0,         86,         86,        1,      206, 0x85954c9e, F=0x0
+0,         87,         87,        1,      379, 0x4f1db56a, F=0x0
+0,         88,         88,        1,      202, 0x19b05154, F=0x0
+0,         89,         89,        1,      225, 0xf4166005, F=0x0
+0,         90,         90,        1,      175, 0x44414761, F=0x0
+0,         91,         91,        1,      235, 0xe01c603f, F=0x0
+0,         92,         92,        1,      185, 0xfab74905, F=0x0
+0,         93,         93,        1,      182, 0x9c5f4ae7, F=0x0
+0,         94,         94,        1,      114, 0xe0542abd, F=0x0
+0,         95,         95,        1,      176, 0x6e274c2e, F=0x0
+0,         96,         96,        1,      214, 0x44725ac3, F=0x0
+0,         97,         97,        1,      182, 0x54e9482e, F=0x0
+0,         98,         98,        1,      195, 0x6231525e, F=0x0
+0,         99,         99,        1,      303, 0xf63c84a1, F=0x0
+0,        100,        100,        1,      191, 0x4aa84e6f, F=0x0
+0,        101,        101,        1,      177, 0xfd82496d, F=0x0
+0,        102,        102,        1,      172, 0x13d041cb, F=0x0
+0,        103,        103,        1,      179, 0x89f54866, F=0x0
+0,        104,        104,        1,      188, 0xf39d4d8d, F=0x0
+0,        105,        105,        1,      177, 0x4d0e4882, F=0x0
+0,        106,        106,        1,      215, 0xca7b5a6f, F=0x0
+0,        107,        107,        1,      339, 0x1dd598fe, F=0x0
+0,        108,        108,        1,      189, 0xe2d94497, F=0x0
+0,        109,        109,        1,      209, 0x682356be, F=0x0
+0,        110,        110,        1,      205, 0xa5af51b7, F=0x0
+0,        111,        111,        1,      185, 0xa1224e22, F=0x0
+0,        112,        112,        1,      211, 0x09a95a00, F=0x0
+0,        113,        113,        1,      178, 0x31ab47cc, F=0x0
+0,        114,        114,        1,      195, 0x960f4c9c, F=0x0
+0,        115,        115,        1,      116, 0x8f8b2da3, F=0x0
+0,        116,        116,        1,      116, 0xf30c2b3d, F=0x0
+0,        117,        117,        1,      427, 0xa3dcc81b, F=0x0
+0,        118,        118,        1,      182, 0xce37489b, F=0x0
+0,        119,        119,        1,      267, 0x516c6f3e, F=0x0
+0,        120,        120,        1,      191, 0xff5c4af7, F=0x0
+0,        121,        121,        1,      195, 0x49cd5178, F=0x0
+0,        122,        122,        1,      755, 0xb9b4608d, F=0x0
+0,        123,        123,        1,      179, 0x6d0c4600, F=0x0
+0,        124,        124,        1,      522, 0xffe5f236, F=0x0
+0,        125,        125,        1,      171, 0xea4c40b8, F=0x0
+0,        126,        126,        1,      379, 0xbf2fa98b, F=0x0
+0,        127,        127,        1,      539, 0xace2f7b5, F=0x0
+0,        128,        128,        1,      199, 0xe0534e3d, F=0x0
+0,        129,        129,        1,      458, 0x2b54d13e, F=0x0
+0,        130,        130,        1,      177, 0x6ff04b91, F=0x0
+0,        131,        131,        1,      299, 0x51d1893e, F=0x0
+0,        132,        132,        1,      333, 0x5cba941f, F=0x0
+0,        133,        133,        1,      179, 0x2381453b, F=0x0
+0,        134,        134,        1,      263, 0xac907176, F=0x0
+0,        135,        135,        1,      177, 0xb87546d9, F=0x0
+0,        136,        136,        1,      184, 0x761c4765, F=0x0
+0,        137,        137,        1,      433, 0x55f0c2d6, F=0x0
+0,        138,        138,        1,     1138, 0x3b7137a0, F=0x0
+0,        139,        139,        1,      863, 0x5afd9dae, F=0x0
+0,        140,        140,        1,      328, 0x4537973f, F=0x0
+0,        141,        141,        1,      222, 0xadb859e4, F=0x0
+0,        142,        142,        1,      171, 0x7ce844b6, F=0x0
+0,        143,        143,        1,      222, 0xa5815a1f, F=0x0
+0,        144,        144,        1,      738, 0x3fe75c6a, F=0x0
+0,        145,        145,        1,      444, 0x320fd03e, F=0x0
+0,        146,        146,        1,      267, 0x288273f3, F=0x0
+0,        147,        147,        1,      187, 0x07594c67, F=0x0
+0,        148,        148,        1,      186, 0xbd1c50de, F=0x0
+0,        149,        149,        1,      196, 0xf3e14fdb, F=0x0
+0,        150,        150,        1,      589, 0x127314a0, F=0x0
+0,        151,        151,        1,      188, 0x22d74d85, F=0x0
+0,        152,        152,        1,      339, 0xcadaa1b6, F=0x0
+0,        153,        153,        1,      179, 0x6a1843a7, F=0x0
+0,        154,        154,        1,      294, 0xe04184fa, F=0x0
+0,        155,        155,        1,      291, 0x4b018587, F=0x0
+0,        156,        156,        1,      144, 0x470f3737, F=0x0
+0,        157,        157,        1,      182, 0x3b994dcd, F=0x0
+0,        158,        158,        1,      195, 0x7f884fd3, F=0x0
+0,        159,        159,        1,      268, 0xb6097b3b, F=0x0
+0,        160,        160,        1,      526, 0x40e0fd27, F=0x0
+0,        161,        161,        1,      372, 0x9dffaa6d, F=0x0
+0,        162,        162,        1,      171, 0xc06841eb, F=0x0
+0,        163,        163,        1,      344, 0xc47da473, F=0x0
+0,        164,        164,        1,      159, 0xacf64002, F=0x0
+0,        165,        165,        1,      391, 0x520cad43, F=0x0
+0,        166,        166,        1,      180, 0x05c04cac, F=0x0
+0,        167,        167,        1,      303, 0x748493c3, F=0x0
+0,        168,        168,        1,      180, 0x3fc54928, F=0x0
+0,        169,        169,        1,      269, 0xcd227967, F=0x0
+0,        170,        170,        1,      199, 0x3a3053e8, F=0x0
+0,        171,        171,        1,      287, 0x3c37840b, F=0x0
+0,        172,        172,        1,      217, 0xabd063fc, F=0x0
diff --git a/tests/ref/fate/h264-attachment-631 b/tests/ref/fate/h264-attachment-631
index ebb5eb4..5ac45e7 100644
--- a/tests/ref/fate/h264-attachment-631
+++ b/tests/ref/fate/h264-attachment-631
@@ -3,6 +3,154 @@
 #codec_id 0: rawvideo
 #dimensions 0: 720x480
 #sar 0: 8/9
+0,          6,          6,        1,   518400, 0xd2068698
+0,         10,         10,        1,   518400, 0x2ee4865f
+0,         14,         14,        1,   518400, 0x2a01b188
+0,         18,         18,        1,   518400, 0xa4bc9572
+0,         22,         22,        1,   518400, 0x4e882f72
+0,         26,         26,        1,   518400, 0xf79cfc9c
+0,         30,         30,        1,   518400, 0x93afec23
+0,         34,         34,        1,   518400, 0xadf210e6
+0,         38,         38,        1,   518400, 0xb0bdd1f1
+0,         42,         42,        1,   518400, 0x4bbb4a24
+0,         46,         46,        1,   518400, 0x49db06c8
+0,         50,         50,        1,   518400, 0xf9781bfb
+0,         54,         54,        1,   518400, 0xd3a373bc
+0,         58,         58,        1,   518400, 0xccfb31c5
+0,         62,         62,        1,   518400, 0x276423a7
+0,         66,         66,        1,   518400, 0xb3729230
+0,         70,         70,        1,   518400, 0xeaf4586d
+0,         74,         74,        1,   518400, 0x9e629b29
+0,         78,         78,        1,   518400, 0x921d6e58
+0,         82,         82,        1,   518400, 0xc988f527
+0,         86,         86,        1,   518400, 0x4e1fed4b
+0,         90,         90,        1,   518400, 0xe3819724
+0,         94,         94,        1,   518400, 0xc07602ba
+0,         98,         98,        1,   518400, 0xc6b1e8d0
+0,        102,        102,        1,   518400, 0x12d94755
+0,        106,        106,        1,   518400, 0x257a5264
+0,        110,        110,        1,   518400, 0x4f985461
+0,        114,        114,        1,   518400, 0x77577244
+0,        118,        118,        1,   518400, 0x81a59edf
+0,        122,        122,        1,   518400, 0x9f33c0fa
+0,        126,        126,        1,   518400, 0xa89cbb3f
+0,        130,        130,        1,   518400, 0x6b1bcc1c
+0,        134,        134,        1,   518400, 0x520acb74
+0,        138,        138,        1,   518400, 0x006dda91
+0,        142,        142,        1,   518400, 0x7377f96f
+0,        146,        146,        1,   518400, 0x0b713224
+0,        150,        150,        1,   518400, 0x98943e53
+0,        154,        154,        1,   518400, 0x59f967e2
+0,        158,        158,        1,   518400, 0x976a2461
+0,        162,        162,        1,   518400, 0xcb4d3872
+0,        166,        166,        1,   518400, 0x0a174f59
+0,        170,        170,        1,   518400, 0x7cbe6c4f
+0,        174,        174,        1,   518400, 0x475cbce4
+0,        178,        178,        1,   518400, 0x2c281bb9
+0,        182,        182,        1,   518400, 0xadee7826
+0,        186,        186,        1,   518400, 0x936059a6
+0,        190,        190,        1,   518400, 0xba09ae20
+0,        194,        194,        1,   518400, 0x355e94d7
+0,        198,        198,        1,   518400, 0xafc3a0b3
+0,        202,        202,        1,   518400, 0x55bd78af
+0,        206,        206,        1,   518400, 0x9678c886
+0,        210,        210,        1,   518400, 0x4d69a62a
+0,        214,        214,        1,   518400, 0x406e617c
+0,        218,        218,        1,   518400, 0x7031ebdb
+0,        222,        222,        1,   518400, 0xf862127d
+0,        226,        226,        1,   518400, 0x619b8a53
+0,        230,        230,        1,   518400, 0x0fde6b72
+0,        234,        234,        1,   518400, 0xd137deff
+0,        238,        238,        1,   518400, 0x9ae6ac2e
+0,        242,        242,        1,   518400, 0x6cefb571
+0,        246,        246,        1,   518400, 0x7694dda2
+0,        250,        250,        1,   518400, 0x2253f6a2
+0,        254,        254,        1,   518400, 0x770db468
+0,        258,        258,        1,   518400, 0xf4c815a5
+0,        262,        262,        1,   518400, 0x0a0f38b6
+0,        266,        266,        1,   518400, 0x17490907
+0,        270,        270,        1,   518400, 0xbc362ed6
+0,        274,        274,        1,   518400, 0x24de1b5c
+0,        278,        278,        1,   518400, 0x55d20b2a
+0,        282,        282,        1,   518400, 0xca1af9b1
+0,        286,        286,        1,   518400, 0x7e7b7473
+0,        290,        290,        1,   518400, 0xed30dd23
+0,        294,        294,        1,   518400, 0xb694c58f
+0,        298,        298,        1,   518400, 0x8270deb7
+0,        302,        302,        1,   518400, 0x91b3b4f7
+0,        306,        306,        1,   518400, 0x37fcb63c
+0,        310,        310,        1,   518400, 0x7ebcafca
+0,        314,        314,        1,   518400, 0x8508b6da
+0,        318,        318,        1,   518400, 0xe7e0b15e
+0,        322,        322,        1,   518400, 0x9618fa0e
+0,        326,        326,        1,   518400, 0xd4c3b20c
+0,        330,        330,        1,   518400, 0x1aad03d1
+0,        334,        334,        1,   518400, 0xb5c18e20
+0,        338,        338,        1,   518400, 0x70144034
+0,        342,        342,        1,   518400, 0x937ee203
+0,        346,        346,        1,   518400, 0x680d72ad
+0,        350,        350,        1,   518400, 0x8c9647b1
+0,        354,        354,        1,   518400, 0x65fce70a
+0,        358,        358,        1,   518400, 0xa3d785dd
+0,        362,        362,        1,   518400, 0xaf1a54c2
+0,        366,        366,        1,   518400, 0x301c6f4c
+0,        370,        370,        1,   518400, 0x0255b5ac
+0,        374,        374,        1,   518400, 0x967da8de
+0,        378,        378,        1,   518400, 0x1f7e6c8c
+0,        382,        382,        1,   518400, 0xb41badbf
+0,        386,        386,        1,   518400, 0xca853613
+0,        390,        390,        1,   518400, 0x9f8696cb
+0,        394,        394,        1,   518400, 0x55ec8427
+0,        398,        398,        1,   518400, 0x08779f91
+0,        402,        402,        1,   518400, 0x171fbc34
+0,        406,        406,        1,   518400, 0x5e9c6ddd
+0,        410,        410,        1,   518400, 0xd9a55786
+0,        414,        414,        1,   518400, 0xdb509948
+0,        418,        418,        1,   518400, 0x2a326178
+0,        422,        422,        1,   518400, 0x4842c411
+0,        426,        426,        1,   518400, 0x35399db4
+0,        430,        430,        1,   518400, 0xa182b9aa
+0,        434,        434,        1,   518400, 0xb6df772d
+0,        438,        438,        1,   518400, 0xfe61b651
+0,        442,        442,        1,   518400, 0x031cb305
+0,        446,        446,        1,   518400, 0xde553506
+0,        450,        450,        1,   518400, 0x24ab8557
+0,        454,        454,        1,   518400, 0xadf5e251
+0,        458,        458,        1,   518400, 0xb3a3c6c5
+0,        462,        462,        1,   518400, 0x9cedc6ac
+0,        466,        466,        1,   518400, 0x6ddf9b26
+0,        470,        470,        1,   518400, 0x3bfaf200
+0,        474,        474,        1,   518400, 0x0337d6f1
+0,        478,        478,        1,   518400, 0x71367bc7
+0,        482,        482,        1,   518400, 0x9e1876b8
+0,        486,        486,        1,   518400, 0x37b89366
+0,        490,        490,        1,   518400, 0x6e349056
+0,        494,        494,        1,   518400, 0x718a9543
+0,        498,        498,        1,   518400, 0x48e46e57
+0,        502,        502,        1,   518400, 0xb2ae494c
+0,        506,        506,        1,   518400, 0x0ec937dc
+0,        510,        510,        1,   518400, 0xb1e88149
+0,        514,        514,        1,   518400, 0xedbba51d
+0,        518,        518,        1,   518400, 0x8955d114
+0,        522,        522,        1,   518400, 0x951e8716
+0,        526,        526,        1,   518400, 0x119064de
+0,        530,        530,        1,   518400, 0xc06bd99a
+0,        534,        534,        1,   518400, 0xdfccd738
+0,        538,        538,        1,   518400, 0x6c2de0a5
+0,        542,        542,        1,   518400, 0x11c1fdf7
+0,        546,        546,        1,   518400, 0xdcd26a62
+0,        550,        550,        1,   518400, 0x0ff63f3d
+0,        554,        554,        1,   518400, 0x6443382a
+0,        558,        558,        1,   518400, 0x28ce5ce3
+0,        562,        562,        1,   518400, 0xe0d47fbd
+0,        566,        566,        1,   518400, 0xfdc0beed
+0,        570,        570,        1,   518400, 0x9adeddc4
+0,        574,        574,        1,   518400, 0x8e5669fc
+0,        578,        578,        1,   518400, 0xf0beb8ae
+0,        582,        582,        1,   518400, 0xbdd68806
+0,        586,        586,        1,   518400, 0xe3c6ae23
+0,        590,        590,        1,   518400, 0xeba952c1
+0,        594,        594,        1,   518400, 0x734ff153
 0,        598,        598,        1,   518400, 0xc3c0f1cf
 0,        603,        603,        1,   518400, 0x21a5df80
 0,        607,        607,        1,   518400, 0x5b8e115b
diff --git a/tests/ref/fate/h264-bsf-mp4toannexb b/tests/ref/fate/h264-bsf-mp4toannexb
index 7cd086a..2049f39 100644
--- a/tests/ref/fate/h264-bsf-mp4toannexb
+++ b/tests/ref/fate/h264-bsf-mp4toannexb
@@ -1 +1 @@
-f340e7ca9a46d437af4e96f6c8de221c
+5f04c27cc6ee8625fe2405fb0f7da9a3
diff --git a/tests/ref/fate/h264-timecode b/tests/ref/fate/h264-timecode
new file mode 100644
index 0000000..b78f700
--- /dev/null
+++ b/tests/ref/fate/h264-timecode
@@ -0,0 +1,305 @@
+#tb 0: 1/30
+#media_type 0: video
+#codec_id 0: rawvideo
+#dimensions 0: 352x288
+#sar 0: 128/117
+0,          0,          0,        1,   152064, 0x70684c80
+0,          1,          1,        1,   152064, 0xb5c8b300
+0,          2,          2,        1,   152064, 0x5777ac60
+0,          3,          3,        1,   152064, 0xb27646a5
+0,          4,          4,        1,   152064, 0x20bd98ec
+0,          5,          5,        1,   152064, 0xcf5ac1b0
+0,          6,          6,        1,   152064, 0x85a42952
+0,          7,          7,        1,   152064, 0xc25aa530
+0,          8,          8,        1,   152064, 0x97b14be9
+0,          9,          9,        1,   152064, 0xf67ec91a
+0,         10,         10,        1,   152064, 0x3890d6a3
+0,         11,         11,        1,   152064, 0xc52c8467
+0,         12,         12,        1,   152064, 0x30a7af36
+0,         13,         13,        1,   152064, 0x27528a98
+0,         14,         14,        1,   152064, 0x245c08c5
+0,         15,         15,        1,   152064, 0x7e0220f3
+0,         16,         16,        1,   152064, 0x4b254c89
+0,         17,         17,        1,   152064, 0x1586e3e5
+0,         18,         18,        1,   152064, 0x594dfc58
+0,         19,         19,        1,   152064, 0x85ba9c8e
+0,         20,         20,        1,   152064, 0x1e235100
+0,         21,         21,        1,   152064, 0xa02c6a72
+0,         22,         22,        1,   152064, 0xd1166fb6
+0,         23,         23,        1,   152064, 0xcc9b1546
+0,         24,         24,        1,   152064, 0x55e35a35
+0,         25,         25,        1,   152064, 0xea63e2ae
+0,         26,         26,        1,   152064, 0x936a1802
+0,         27,         27,        1,   152064, 0x354a749c
+0,         28,         28,        1,   152064, 0x5cd0f246
+0,         29,         29,        1,   152064, 0x0376e69b
+0,         30,         30,        1,   152064, 0x5af5fb61
+0,         31,         31,        1,   152064, 0x9a053ab8
+0,         32,         32,        1,   152064, 0x57cbbfcc
+0,         33,         33,        1,   152064, 0x81f19e93
+0,         34,         34,        1,   152064, 0x0812953d
+0,         35,         35,        1,   152064, 0x0ae2a166
+0,         36,         36,        1,   152064, 0x193125b8
+0,         37,         37,        1,   152064, 0xab7eca7b
+0,         38,         38,        1,   152064, 0x91ff1870
+0,         39,         39,        1,   152064, 0x8f522dde
+0,         40,         40,        1,   152064, 0x98faab46
+0,         41,         41,        1,   152064, 0xa2119231
+0,         42,         42,        1,   152064, 0xfe591321
+0,         43,         43,        1,   152064, 0x6c8a1bf5
+0,         44,         44,        1,   152064, 0x857c925c
+0,         45,         45,        1,   152064, 0xe81a77f2
+0,         46,         46,        1,   152064, 0x08234e83
+0,         47,         47,        1,   152064, 0x76cb39f6
+0,         48,         48,        1,   152064, 0x26168d25
+0,         49,         49,        1,   152064, 0x4dd3b273
+0,         50,         50,        1,   152064, 0xd6e8398e
+0,         51,         51,        1,   152064, 0x55986a57
+0,         52,         52,        1,   152064, 0x9c2768fb
+0,         53,         53,        1,   152064, 0x03517efe
+0,         54,         54,        1,   152064, 0x3a48451f
+0,         55,         55,        1,   152064, 0x1f6d6b87
+0,         56,         56,        1,   152064, 0x0917fb2a
+0,         57,         57,        1,   152064, 0x0f49e7a9
+0,         58,         58,        1,   152064, 0x3c56d4e1
+0,         59,         59,        1,   152064, 0x487cca35
+0,         60,         60,        1,   152064, 0x5c6b8b1c
+0,         61,         61,        1,   152064, 0x767d8a34
+0,         62,         62,        1,   152064, 0xcd8d692a
+0,         63,         63,        1,   152064, 0x788b3ebf
+0,         64,         64,        1,   152064, 0x4cae3852
+0,         65,         65,        1,   152064, 0x1150f0aa
+0,         66,         66,        1,   152064, 0x9d4b3366
+0,         67,         67,        1,   152064, 0xedcb8863
+0,         68,         68,        1,   152064, 0x2c09ca8c
+0,         69,         69,        1,   152064, 0x20930842
+0,         70,         70,        1,   152064, 0xd653b16f
+0,         71,         71,        1,   152064, 0x41f38d77
+0,         72,         72,        1,   152064, 0xa5f69360
+0,         73,         73,        1,   152064, 0xf0f5ce27
+0,         74,         74,        1,   152064, 0xf2a6246c
+0,         75,         75,        1,   152064, 0x7e76fabc
+0,         76,         76,        1,   152064, 0xf76e1982
+0,         77,         77,        1,   152064, 0x40c1be5a
+0,         78,         78,        1,   152064, 0x132ca50e
+0,         79,         79,        1,   152064, 0xae0c69ed
+0,         80,         80,        1,   152064, 0x5f775778
+0,         81,         81,        1,   152064, 0x62bb9790
+0,         82,         82,        1,   152064, 0x8b448e83
+0,         83,         83,        1,   152064, 0xcc35d9fe
+0,         84,         84,        1,   152064, 0x51560127
+0,         85,         85,        1,   152064, 0xb915829b
+0,         86,         86,        1,   152064, 0x3a3f2b0c
+0,         87,         87,        1,   152064, 0x4e2d2260
+0,         88,         88,        1,   152064, 0x9fdb7567
+0,         89,         89,        1,   152064, 0xe34b2f4e
+0,         90,         90,        1,   152064, 0x8650ec13
+0,         91,         91,        1,   152064, 0xdff3e299
+0,         92,         92,        1,   152064, 0x100f8f0c
+0,         93,         93,        1,   152064, 0xa9aff101
+0,         94,         94,        1,   152064, 0xa80add4c
+0,         95,         95,        1,   152064, 0xa7994880
+0,         96,         96,        1,   152064, 0xc74ecb79
+0,         97,         97,        1,   152064, 0xbada663d
+0,         98,         98,        1,   152064, 0xff7f0592
+0,         99,         99,        1,   152064, 0x44731be5
+0,        100,        100,        1,   152064, 0x1a61f9ac
+0,        101,        101,        1,   152064, 0x848ace19
+0,        102,        102,        1,   152064, 0x22858567
+0,        103,        103,        1,   152064, 0x2b3a9ba7
+0,        104,        104,        1,   152064, 0x02889774
+0,        105,        105,        1,   152064, 0x29a54516
+0,        106,        106,        1,   152064, 0x737f2833
+0,        107,        107,        1,   152064, 0x28b5a183
+0,        108,        108,        1,   152064, 0xaff9112a
+0,        109,        109,        1,   152064, 0x0a7652b5
+0,        110,        110,        1,   152064, 0x03fa3e91
+0,        111,        111,        1,   152064, 0x9deade68
+0,        112,        112,        1,   152064, 0xb9af1a27
+0,        113,        113,        1,   152064, 0xe9f07f00
+0,        114,        114,        1,   152064, 0x1b03894a
+0,        115,        115,        1,   152064, 0xf89e26c5
+0,        116,        116,        1,   152064, 0x6d6b5508
+0,        117,        117,        1,   152064, 0x735ce75d
+0,        118,        118,        1,   152064, 0x30017005
+0,        119,        119,        1,   152064, 0x606ad5ab
+0,        120,        120,        1,   152064, 0xb442ac30
+0,        121,        121,        1,   152064, 0xac321998
+0,        122,        122,        1,   152064, 0x4507990b
+0,        123,        123,        1,   152064, 0xe40f986d
+0,        124,        124,        1,   152064, 0xc9840540
+0,        125,        125,        1,   152064, 0x74cfbc82
+0,        126,        126,        1,   152064, 0x1ac9744b
+0,        127,        127,        1,   152064, 0x8ac2a889
+0,        128,        128,        1,   152064, 0x3074a1bc
+0,        129,        129,        1,   152064, 0x389ae633
+0,        130,        130,        1,   152064, 0xaadb4325
+0,        131,        131,        1,   152064, 0x7d1a91b5
+0,        132,        132,        1,   152064, 0xaa047ddc
+0,        133,        133,        1,   152064, 0xe5cafebc
+0,        134,        134,        1,   152064, 0x24314a0c
+0,        135,        135,        1,   152064, 0x530cfa1c
+0,        136,        136,        1,   152064, 0x3f973f68
+0,        137,        137,        1,   152064, 0xf51d3e20
+0,        138,        138,        1,   152064, 0x24aca84c
+0,        139,        139,        1,   152064, 0x96b411e9
+0,        140,        140,        1,   152064, 0x6d046ea3
+0,        141,        141,        1,   152064, 0x9237974f
+0,        142,        142,        1,   152064, 0x0a808964
+0,        143,        143,        1,   152064, 0x9d6ad957
+0,        144,        144,        1,   152064, 0x9d6381ea
+0,        145,        145,        1,   152064, 0xfeceab64
+0,        146,        146,        1,   152064, 0x7fa00e6f
+0,        147,        147,        1,   152064, 0x635ac444
+0,        148,        148,        1,   152064, 0xf0db3036
+0,        149,        149,        1,   152064, 0xc5ddef73
+0,        150,        150,        1,   152064, 0x7fea7516
+0,        151,        151,        1,   152064, 0x7f3f7460
+0,        152,        152,        1,   152064, 0x446dfa20
+0,        153,        153,        1,   152064, 0x5d7167c4
+0,        154,        154,        1,   152064, 0xf9da05b7
+0,        155,        155,        1,   152064, 0xc007383d
+0,        156,        156,        1,   152064, 0xbf461f08
+0,        157,        157,        1,   152064, 0xf722508f
+0,        158,        158,        1,   152064, 0x2699fa56
+0,        159,        159,        1,   152064, 0xa49ca6d8
+0,        160,        160,        1,   152064, 0x58f70dfd
+0,        161,        161,        1,   152064, 0x391383db
+0,        162,        162,        1,   152064, 0xb859f2fd
+0,        163,        163,        1,   152064, 0xbb77d0a7
+0,        164,        164,        1,   152064, 0xd4c9881d
+0,        165,        165,        1,   152064, 0xb46d7272
+0,        166,        166,        1,   152064, 0x78237e5e
+0,        167,        167,        1,   152064, 0xbcd9f633
+0,        168,        168,        1,   152064, 0x17e09080
+0,        169,        169,        1,   152064, 0x4a9bdacf
+0,        170,        170,        1,   152064, 0x600c972f
+0,        171,        171,        1,   152064, 0x858e399a
+0,        172,        172,        1,   152064, 0xf9ef200d
+0,        173,        173,        1,   152064, 0x6aec0fda
+0,        174,        174,        1,   152064, 0x4d7ba9a8
+0,        175,        175,        1,   152064, 0x0df5dbdb
+0,        176,        176,        1,   152064, 0x77d598f8
+0,        177,        177,        1,   152064, 0x7d78c129
+0,        178,        178,        1,   152064, 0xf6b79ad2
+0,        179,        179,        1,   152064, 0x2b458750
+0,        180,        180,        1,   152064, 0xdbec9727
+0,        181,        181,        1,   152064, 0xcb073a1a
+0,        182,        182,        1,   152064, 0xa95e913a
+0,        183,        183,        1,   152064, 0x5ca9da6e
+0,        184,        184,        1,   152064, 0x82e09caf
+0,        185,        185,        1,   152064, 0x319f59c5
+0,        186,        186,        1,   152064, 0x11003b19
+0,        187,        187,        1,   152064, 0xcdfc5077
+0,        188,        188,        1,   152064, 0xa56fc40d
+0,        189,        189,        1,   152064, 0x3d2425dc
+0,        190,        190,        1,   152064, 0x907f51d3
+0,        191,        191,        1,   152064, 0xc52dc2dc
+0,        192,        192,        1,   152064, 0xea800778
+0,        193,        193,        1,   152064, 0xc0b022f9
+0,        194,        194,        1,   152064, 0x106b4ea2
+0,        195,        195,        1,   152064, 0x50c6cbf2
+0,        196,        196,        1,   152064, 0x480711b5
+0,        197,        197,        1,   152064, 0x1954bca7
+0,        198,        198,        1,   152064, 0x7894a1c1
+0,        199,        199,        1,   152064, 0xaa39601a
+0,        200,        200,        1,   152064, 0x07652fa2
+0,        201,        201,        1,   152064, 0x84ac1bce
+0,        202,        202,        1,   152064, 0x89104737
+0,        203,        203,        1,   152064, 0x832bf2b0
+0,        204,        204,        1,   152064, 0x45fa87f4
+0,        205,        205,        1,   152064, 0xde5b6e82
+0,        206,        206,        1,   152064, 0x8d88f89b
+0,        207,        207,        1,   152064, 0xba6488c8
+0,        208,        208,        1,   152064, 0xd9bc3312
+0,        209,        209,        1,   152064, 0xdba30d10
+0,        210,        210,        1,   152064, 0xd208cb34
+0,        211,        211,        1,   152064, 0x0642aadc
+0,        212,        212,        1,   152064, 0xf392e67a
+0,        213,        213,        1,   152064, 0xec6041d0
+0,        214,        214,        1,   152064, 0x52463e92
+0,        215,        215,        1,   152064, 0x218174a8
+0,        216,        216,        1,   152064, 0x9408f728
+0,        217,        217,        1,   152064, 0xabd31db7
+0,        218,        218,        1,   152064, 0x3e72f003
+0,        219,        219,        1,   152064, 0x638e603b
+0,        220,        220,        1,   152064, 0xf1f896c7
+0,        221,        221,        1,   152064, 0x786554ff
+0,        222,        222,        1,   152064, 0x9bb909f5
+0,        223,        223,        1,   152064, 0x726cf59e
+0,        224,        224,        1,   152064, 0xc18c15a1
+0,        225,        225,        1,   152064, 0x45ea8f83
+0,        226,        226,        1,   152064, 0xcb88e67a
+0,        227,        227,        1,   152064, 0x18d09432
+0,        228,        228,        1,   152064, 0x99d02a0a
+0,        229,        229,        1,   152064, 0x7ddc3691
+0,        230,        230,        1,   152064, 0x47710c00
+0,        231,        231,        1,   152064, 0xe28646c7
+0,        232,        232,        1,   152064, 0xe8a2a4e5
+0,        233,        233,        1,   152064, 0xed19f345
+0,        234,        234,        1,   152064, 0xceffaf7f
+0,        235,        235,        1,   152064, 0x8d116def
+0,        236,        236,        1,   152064, 0xccb68ae8
+0,        237,        237,        1,   152064, 0x3529b3db
+0,        238,        238,        1,   152064, 0x529911b8
+0,        239,        239,        1,   152064, 0x3a676438
+0,        240,        240,        1,   152064, 0x18508f5d
+0,        241,        241,        1,   152064, 0x4577d18b
+0,        242,        242,        1,   152064, 0x420f5881
+0,        243,        243,        1,   152064, 0x60341b86
+0,        244,        244,        1,   152064, 0x2f51de6a
+0,        245,        245,        1,   152064, 0xc70bbf8d
+0,        246,        246,        1,   152064, 0xc1ff63f7
+0,        247,        247,        1,   152064, 0x2dc1662b
+0,        248,        248,        1,   152064, 0x1bbb3b70
+0,        249,        249,        1,   152064, 0x74f44ec2
+0,        250,        250,        1,   152064, 0x9b93084e
+0,        251,        251,        1,   152064, 0x1493f82d
+0,        252,        252,        1,   152064, 0x069d9869
+0,        253,        253,        1,   152064, 0xc9a4f706
+0,        254,        254,        1,   152064, 0xf80092ed
+0,        255,        255,        1,   152064, 0xdc347577
+0,        256,        256,        1,   152064, 0x1df12299
+0,        257,        257,        1,   152064, 0x40d19951
+0,        258,        258,        1,   152064, 0xfb63dbf1
+0,        259,        259,        1,   152064, 0x9153714c
+0,        260,        260,        1,   152064, 0x6cfd514c
+0,        261,        261,        1,   152064, 0xc0ef7bf3
+0,        262,        262,        1,   152064, 0x5fce6828
+0,        263,        263,        1,   152064, 0xe7d0074d
+0,        264,        264,        1,   152064, 0x9e3f7351
+0,        265,        265,        1,   152064, 0x3a0c5d56
+0,        266,        266,        1,   152064, 0xd5581f3c
+0,        267,        267,        1,   152064, 0x9a4ec0d1
+0,        268,        268,        1,   152064, 0x150b9a54
+0,        269,        269,        1,   152064, 0x950eb994
+0,        270,        270,        1,   152064, 0xda31e3bf
+0,        271,        271,        1,   152064, 0x14ff5d3c
+0,        272,        272,        1,   152064, 0xd593bafc
+0,        273,        273,        1,   152064, 0xd4cf7c58
+0,        274,        274,        1,   152064, 0x2be70997
+0,        275,        275,        1,   152064, 0xe551703b
+0,        276,        276,        1,   152064, 0x7adaf447
+0,        277,        277,        1,   152064, 0x0435ea0f
+0,        278,        278,        1,   152064, 0x87e5bba1
+0,        279,        279,        1,   152064, 0xea1fdf88
+0,        280,        280,        1,   152064, 0xaea5b4c4
+0,        281,        281,        1,   152064, 0x32f79e89
+0,        282,        282,        1,   152064, 0xcd5694bc
+0,        283,        283,        1,   152064, 0x6b12830f
+0,        284,        284,        1,   152064, 0xaf681652
+0,        285,        285,        1,   152064, 0x3b26e20b
+0,        286,        286,        1,   152064, 0x2a9eee33
+0,        287,        287,        1,   152064, 0x8d5fe982
+0,        288,        288,        1,   152064, 0xa4cb5d02
+0,        289,        289,        1,   152064, 0x867dd0b0
+0,        290,        290,        1,   152064, 0x23c885e9
+0,        291,        291,        1,   152064, 0x99fd7b2b
+0,        292,        292,        1,   152064, 0xa710e871
+0,        293,        293,        1,   152064, 0x3ecbaaeb
+0,        294,        294,        1,   152064, 0x3d1c7de2
+0,        295,        295,        1,   152064, 0x378935f3
+0,        296,        296,        1,   152064, 0xce893553
+0,        297,        297,        1,   152064, 0xa834374c
+0,        298,        298,        1,   152064, 0x665094f4
+0,        299,        299,        1,   152064, 0x3fee89c6
diff --git a/tests/ref/fate/h264_mp4toannexb_ticket2991 b/tests/ref/fate/h264_mp4toannexb_ticket2991
index 3245ef4..76bdf3c 100644
--- a/tests/ref/fate/h264_mp4toannexb_ticket2991
+++ b/tests/ref/fate/h264_mp4toannexb_ticket2991
@@ -1,12 +1,12 @@
-dba672c154b41414cf26aae967c27eef *tests/data/fate/h264_mp4toannexb_ticket2991.h264
-1985823 tests/data/fate/h264_mp4toannexb_ticket2991.h264
-#extradata 0:       48, 0x47ae0d55
+05d66e60ab22ee004720e0051af0fe74 *tests/data/fate/h264_mp4toannexb_ticket2991.h264
+1985815 tests/data/fate/h264_mp4toannexb_ticket2991.h264
+#extradata 0:       47, 0x3a590d55
 #tb 0: 1/1200000
 #media_type 0: video
 #codec_id 0: h264
 #dimensions 0: 1280x720
 #sar 0: 3/4
-0,          0,          0,    48000,    37127, 0xc125184c
+0,          0,          0,    48000,    37126, 0xb020184c
 0,      48000,      48000,    40040,     6920, 0x8512361a, F=0x0
 0,      88040,      88040,    40040,     7550, 0x1bc56ed4, F=0x0
 0,     128081,     128081,    40040,     8752, 0xb8c6f0a1, F=0x0
@@ -21,7 +21,7 @@
 0,     488444,     488444,    40040,    11234, 0x83cbd9fd, F=0x0
 0,     528485,     528485,    40040,    17616, 0xfdf95104, F=0x0
 0,     568525,     568525,    40040,    10689, 0x9633d32b, F=0x0
-0,     608566,     608566,    40040,    45292, 0x66dd2cf6
+0,     608566,     608566,    40040,    45291, 0x543c2cf6
 0,     648606,     648606,    40040,    20837, 0x051abfab, F=0x0
 0,     688646,     688646,    40040,    21418, 0xe2a59d70, F=0x0
 0,     728687,     728687,    40040,    15643, 0x15cf2cec, F=0x0
@@ -36,7 +36,7 @@
 0,    1089050,    1089050,    40040,    13130, 0xcbb6bb8e, F=0x0
 0,    1129091,    1129091,    40040,    16180, 0x5d188a7a, F=0x0
 0,    1169131,    1169131,    40040,    14961, 0x9ff2f463, F=0x0
-0,    1209172,    1209172,    40040,    54297, 0xf98d30ed
+0,    1209172,    1209172,    40040,    54296, 0xe6ec30ed
 0,    1249212,    1249212,    40040,    11500, 0x8c4852c9, F=0x0
 0,    1289252,    1289252,    40040,    12065, 0xfb7954c3, F=0x0
 0,    1329293,    1329293,    40040,    12532, 0xf0a935d3, F=0x0
@@ -51,7 +51,7 @@
 0,    1689656,    1689656,    40040,    13250, 0xfed0deb8, F=0x0
 0,    1729697,    1729697,    40040,    13360, 0xbf92d476, F=0x0
 0,    1769737,    1769737,    40040,    11749, 0x3041eaf1, F=0x0
-0,    1809778,    1809778,    40040,    23998, 0xee87d5c4
+0,    1809778,    1809778,    40040,    23997, 0xdbe6d5c4
 0,    1849818,    1849818,    40040,    16065, 0xe8f715b7, F=0x0
 0,    1889858,    1889858,    40040,    16441, 0x0a4e060f, F=0x0
 0,    1929899,    1929899,    40040,    17395, 0xa8edecc2, F=0x0
@@ -66,7 +66,7 @@
 0,    2290262,    2290262,    40040,    13748, 0xed26aeb4, F=0x0
 0,    2330303,    2330303,    40040,    15092, 0x3c983538, F=0x0
 0,    2370343,    2370343,    40040,    14636, 0x9b278a6c, F=0x0
-0,    2410384,    2410384,    40040,    29135, 0x0a34be18
+0,    2410384,    2410384,    40040,    29134, 0xf784be18
 0,    2450424,    2450424,    40040,    10232, 0x5408e15b, F=0x0
 0,    2490464,    2490464,    40040,     9769, 0xc93cb7f9, F=0x0
 0,    2530505,    2530505,    40040,    14454, 0x45230dbe, F=0x0
@@ -81,7 +81,7 @@
 0,    2890868,    2890868,    40040,    14801, 0x40bae016, F=0x0
 0,    2930909,    2930909,    40040,    17303, 0x9ce1fd31, F=0x0
 0,    2970949,    2970949,    40040,    17678, 0x9bd66141, F=0x0
-0,    3010990,    3010990,    40040,    48673, 0x44b6ce46
+0,    3010990,    3010990,    40040,    48672, 0x3215ce46
 0,    3051030,    3051030,    40040,    11894, 0x12e1fece, F=0x0
 0,    3091070,    3091070,    40040,    16514, 0xc57aed05, F=0x0
 0,    3131111,    3131111,    40040,    13044, 0x61914fa0, F=0x0
@@ -96,7 +96,7 @@
 0,    3491474,    3491474,    40040,    12208, 0x81a587c0, F=0x0
 0,    3531515,    3531515,    40040,    14709, 0x5dffbe04, F=0x0
 0,    3571555,    3571555,    40040,    14390, 0xbfd1e041, F=0x0
-0,    3611596,    3611596,    40040,    37237, 0xfa9a24b1
+0,    3611596,    3611596,    40040,    37236, 0xe7f924b1
 0,    3651636,    3651636,    40040,    14056, 0x24714c7c, F=0x0
 0,    3691676,    3691676,    40040,    19438, 0x0c50dcd5, F=0x0
 0,    3731717,    3731717,    40040,    21728, 0x7eea4a11, F=0x0
@@ -111,7 +111,7 @@
 0,    4092080,    4092080,    40040,    16878, 0x98efbae2, F=0x0
 0,    4132121,    4132121,    40040,    14685, 0x1bf78d65, F=0x0
 0,    4172161,    4172161,    40040,    13127, 0x0b91881d, F=0x0
-0,    4212202,    4212202,    40040,    29391, 0x0955ed6b
+0,    4212202,    4212202,    40040,    29390, 0xf6a5ed6b
 0,    4252242,    4252242,    40040,    12576, 0xe9845ded, F=0x0
 0,    4292282,    4292282,    40040,    12599, 0x96a79ab8, F=0x0
 0,    4332323,    4332323,    40040,    16134, 0xb4c36d3f, F=0x0
diff --git a/tests/ref/fate/h264_mp4toannexb_ticket5927 b/tests/ref/fate/h264_mp4toannexb_ticket5927
index 006ea39..95e35c4 100644
--- a/tests/ref/fate/h264_mp4toannexb_ticket5927
+++ b/tests/ref/fate/h264_mp4toannexb_ticket5927
@@ -1,12 +1,12 @@
-562487bfea635cdadbc23d390322b589 *tests/data/fate/h264_mp4toannexb_ticket5927.h264
-595585 tests/data/fate/h264_mp4toannexb_ticket5927.h264
-#extradata 0:       34, 0x8df608f8
+a3b02fd09392e01619cebc959d4d9ff2 *tests/data/fate/h264_mp4toannexb_ticket5927.h264
+595583 tests/data/fate/h264_mp4toannexb_ticket5927.h264
+#extradata 0:       33, 0x84fe08f8
 #tb 0: 1/1200000
 #media_type 0: video
 #codec_id 0: h264
 #dimensions 0: 1920x1080
 #sar 0: 0/1
-0,     -48000, -9223372036854775808,    48000,   247994, 0x2e1e21ea
+0,     -48000, -9223372036854775808,    48000,   247993, 0x1ce821ea
 0,          0, -9223372036854775808,    48000,    43354, 0xa05dca6f, F=0x0
 0,      48000, -9223372036854775808,    48000,    11423, 0x5e8086dd, F=0x0
 0,      96000, -9223372036854775808,    48000,    50798, 0x145fbe4f, F=0x0
@@ -18,4 +18,4 @@
 0,     384000, -9223372036854775808,    48000,    54483, 0xefead99f, F=0x0
 0,     432000, -9223372036854775808,    48000,    13705, 0x23cd27e8, F=0x0
 0,     480000, -9223372036854775808,    48000,    22308, 0x4093b5af, F=0x0
-0,     528000, -9223372036854775808,    48000,     6370, 0x96c12aa1
+0,     528000, -9223372036854775808,    48000,     6369, 0x858b2aa1
diff --git a/tests/ref/fate/h264_mp4toannexb_ticket5927_2 b/tests/ref/fate/h264_mp4toannexb_ticket5927_2
index 51432b1..8db6a7e 100644
--- a/tests/ref/fate/h264_mp4toannexb_ticket5927_2
+++ b/tests/ref/fate/h264_mp4toannexb_ticket5927_2
@@ -1,12 +1,12 @@
-562487bfea635cdadbc23d390322b589 *tests/data/fate/h264_mp4toannexb_ticket5927_2.h264
-595585 tests/data/fate/h264_mp4toannexb_ticket5927_2.h264
-#extradata 0:       34, 0x8df608f8
+a3b02fd09392e01619cebc959d4d9ff2 *tests/data/fate/h264_mp4toannexb_ticket5927_2.h264
+595583 tests/data/fate/h264_mp4toannexb_ticket5927_2.h264
+#extradata 0:       33, 0x84fe08f8
 #tb 0: 1/1200000
 #media_type 0: video
 #codec_id 0: h264
 #dimensions 0: 1920x1080
 #sar 0: 0/1
-0,     -48000, -9223372036854775808,    48000,   247994, 0x2e1e21ea
+0,     -48000, -9223372036854775808,    48000,   247993, 0x1ce821ea
 0,          0, -9223372036854775808,    48000,    43354, 0xa05dca6f, F=0x0
 0,      48000, -9223372036854775808,    48000,    11423, 0x5e8086dd, F=0x0
 0,      96000, -9223372036854775808,    48000,    50798, 0x145fbe4f, F=0x0
@@ -18,4 +18,4 @@
 0,     384000, -9223372036854775808,    48000,    54483, 0xefead99f, F=0x0
 0,     432000, -9223372036854775808,    48000,    13705, 0x23cd27e8, F=0x0
 0,     480000, -9223372036854775808,    48000,    22308, 0x4093b5af, F=0x0
-0,     528000, -9223372036854775808,    48000,     6370, 0x96c12aa1
+0,     528000, -9223372036854775808,    48000,     6369, 0x858b2aa1
diff --git a/tests/ref/fate/hapqa-extract-snappy1-to-hapalphaonly b/tests/ref/fate/hapqa-extract-snappy1-to-hapalphaonly
index 9ab123f..7edd5fa 100644
--- a/tests/ref/fate/hapqa-extract-snappy1-to-hapalphaonly
+++ b/tests/ref/fate/hapqa-extract-snappy1-to-hapalphaonly
@@ -3,4 +3,4 @@
 #codec_id 0: hap
 #dimensions 0: 127x71
 #sar 0: 1/1
-0,          0,          0,        1,     3044, 0xcaf6ddd0
+0,          0,          0,        1,     3044, 0xcaf6ddd0, F=0x11
diff --git a/tests/ref/fate/hapqa-extract-snappy1-to-hapq b/tests/ref/fate/hapqa-extract-snappy1-to-hapq
index f658b1c..1340f77 100644
--- a/tests/ref/fate/hapqa-extract-snappy1-to-hapq
+++ b/tests/ref/fate/hapqa-extract-snappy1-to-hapq
@@ -3,4 +3,4 @@
 #codec_id 0: hap
 #dimensions 0: 127x71
 #sar 0: 1/1
-0,          0,          0,        1,     8217, 0x04271f0f
+0,          0,          0,        1,     8217, 0x04271f0f, F=0x11
diff --git a/tests/ref/fate/hapqa-extract-snappy16-to-hapalphaonly b/tests/ref/fate/hapqa-extract-snappy16-to-hapalphaonly
index 1bd9206..e6adc00 100644
--- a/tests/ref/fate/hapqa-extract-snappy16-to-hapalphaonly
+++ b/tests/ref/fate/hapqa-extract-snappy16-to-hapalphaonly
@@ -3,4 +3,4 @@
 #codec_id 0: hap
 #dimensions 0: 127x71
 #sar 0: 1/1
-0,          0,          0,        1,     3513, 0x69c7014f
+0,          0,          0,        1,     3513, 0x69c7014f, F=0x11
diff --git a/tests/ref/fate/hapqa-extract-snappy16-to-hapq b/tests/ref/fate/hapqa-extract-snappy16-to-hapq
index 8334d53..f356301 100644
--- a/tests/ref/fate/hapqa-extract-snappy16-to-hapq
+++ b/tests/ref/fate/hapqa-extract-snappy16-to-hapq
@@ -3,4 +3,4 @@
 #codec_id 0: hap
 #dimensions 0: 127x71
 #sar 0: 1/1
-0,          0,          0,        1,     8726, 0xf889691c
+0,          0,          0,        1,     8726, 0xf889691c, F=0x11
diff --git a/tests/ref/fate/hevc-cabac-tudepth b/tests/ref/fate/hevc-cabac-tudepth
new file mode 100644
index 0000000..ad874c3
--- /dev/null
+++ b/tests/ref/fate/hevc-cabac-tudepth
@@ -0,0 +1,6 @@
+#tb 0: 1/25
+#media_type 0: video
+#codec_id 0: rawvideo
+#dimensions 0: 64x64
+#sar 0: 0/1
+0,          0,          0,        1,    12288, 0x0127a0d9
diff --git a/tests/ref/fate/hevc-two-first-slice b/tests/ref/fate/hevc-two-first-slice
new file mode 100644
index 0000000..586b8ef
--- /dev/null
+++ b/tests/ref/fate/hevc-two-first-slice
@@ -0,0 +1,39 @@
+#format: frame checksums
+#version: 2
+#hash: MD5
+#tb 0: 1/15
+#media_type 0: video
+#codec_id 0: rawvideo
+#dimensions 0: 1920x1080
+#sar 0: 0/1
+#stream#, dts,        pts, duration,     size, hash
+0,          0,          0,        1,  3110400, c88154281ada839d3f209b0eab012577
+0,          1,          1,        1,  3110400, a2623ba4639cf246b803c08e7233112f
+0,          2,          2,        1,  3110400, 9208fcdb16664e91ada77d15cc29ace9
+0,          3,          3,        1,  3110400, 62a5afb0c4d189b831c8cca033a396e0
+0,          4,          4,        1,  3110400, a8f208f1323e9c14181549d480055e3c
+0,          5,          5,        1,  3110400, 3a66c0ab75362a73eebb9ef668bee3da
+0,          6,          6,        1,  3110400, 8096734441fe76d8f7bba8384029b1be
+0,          7,          7,        1,  3110400, ee8db0610de85f015ec76a0c14475ab8
+0,          8,          8,        1,  3110400, f52df359246a4ac396dfc74f75285347
+0,          9,          9,        1,  3110400, 8fb6ddd74e4b71c7596e90d47e50d8f1
+0,         10,         10,        1,  3110400, 70542a3ac5df77437c3d8097d19315c2
+0,         11,         11,        1,  3110400, 20bdf9399f6752578c574248627c3a9f
+0,         12,         12,        1,  3110400, a8b564575af5d72a2cc6d566e99e0176
+0,         13,         13,        1,  3110400, 0d4ace74eb6b452ea9cb2cc72371794a
+0,         14,         14,        1,  3110400, d9736a1e47da6541306cbf8496d97635
+0,         15,         15,        1,  3110400, 49bc2b608000c7d545fa362418035277
+0,         16,         16,        1,  3110400, bd64e9d545c666f818ea1af791ac4201
+0,         17,         17,        1,  3110400, 75b86260724937fdeddf47e1f28530a1
+0,         18,         18,        1,  3110400, 7df76be996e2c652da048e690e45313f
+0,         19,         19,        1,  3110400, 057b9a27f76c9205fe7f378c7e4fe1b4
+0,         20,         20,        1,  3110400, 08241ea9c8d27bd14117ca07485a9892
+0,         21,         21,        1,  3110400, 7d5f4d4e043d6f3e794d1222046cb9cf
+0,         22,         22,        1,  3110400, dfb6916da415ff5323a1925cc329c8e2
+0,         23,         23,        1,  3110400, 574730243f89b4824a313ea1b690e31b
+0,         24,         24,        1,  3110400, 63054e31f52171dda84faa201523dc3b
+0,         25,         25,        1,  3110400, d8ba349a9a5a6f38527e47f5519fd335
+0,         26,         26,        1,  3110400, e653543eb8a8a49147676a91bafbdec8
+0,         27,         27,        1,  3110400, b3194aced03ff1bc4d65560792eeab98
+0,         28,         28,        1,  3110400, 6ba07b8fd8422b3c14976062f5468fab
+0,         29,         29,        1,  3110400, bf8359596ddfd9fdbc243fc2fee56669
diff --git a/tests/ref/fate/hls-fmp4 b/tests/ref/fate/hls-fmp4
new file mode 100644
index 0000000..98b037f
--- /dev/null
+++ b/tests/ref/fate/hls-fmp4
@@ -0,0 +1,198 @@
+#tb 0: 1/44100
+#media_type 0: audio
+#codec_id 0: pcm_s16le
+#sample_rate 0: 44100
+#channel_layout 0: 4
+#channel_layout_name 0: mono
+0,          0,          0,     1152,     2304, 0x907cb7fa
+0,       1152,       1152,     1152,     2304, 0xb8dc7525
+0,       2304,       2304,     1152,     2304, 0x3e7d6905
+0,       3456,       3456,     1152,     2304, 0xef47877b
+0,       4608,       4608,     1152,     2304, 0xfe916b7e
+0,       5760,       5760,     1152,     2304, 0xe3d08cde
+0,       6912,       6912,     1152,     2304, 0xff7f86cf
+0,       8064,       8064,     1152,     2304, 0x843e6f95
+0,       9216,       9216,     1152,     2304, 0x81577c26
+0,      10368,      10368,     1152,     2304, 0x04a085d5
+0,      11520,      11520,     1152,     2304, 0x1c5a76f5
+0,      12672,      12672,     1152,     2304, 0x4ee78623
+0,      13824,      13824,     1152,     2304, 0x8ec861dc
+0,      14976,      14976,     1152,     2304, 0x0ca179d8
+0,      16128,      16128,     1152,     2304, 0xc6da750f
+0,      17280,      17280,     1152,     2304, 0xf6bf79b5
+0,      18432,      18432,     1152,     2304, 0x97b88a43
+0,      19584,      19584,     1152,     2304, 0xf13c7b9c
+0,      20736,      20736,     1152,     2304, 0xdfba83af
+0,      21888,      21888,     1152,     2304, 0xc9467d4b
+0,      23040,      23040,     1152,     2304, 0xbbb58e2b
+0,      24192,      24192,     1152,     2304, 0x3a1078ea
+0,      25344,      25344,     1152,     2304, 0xe9587a5c
+0,      26496,      26496,     1152,     2304, 0xef5a8039
+0,      27648,      27648,     1152,     2304, 0x9d5f782f
+0,      28800,      28800,     1152,     2304, 0x1a548291
+0,      29952,      29952,     1152,     2304, 0x07517701
+0,      31104,      31104,     1152,     2304, 0x78127d6e
+0,      32256,      32256,     1152,     2304, 0x62e2788a
+0,      33408,      33408,     1152,     2304, 0x29397ad9
+0,      34560,      34560,     1152,     2304, 0x45da82d6
+0,      35712,      35712,     1152,     2304, 0x8ed66e51
+0,      36864,      36864,     1152,     2304, 0x660775cd
+0,      38016,      38016,     1152,     2304, 0x802c767a
+0,      39168,      39168,     1152,     2304, 0xcc055840
+0,      40320,      40320,     1152,     2304, 0x701b7eaf
+0,      41472,      41472,     1152,     2304, 0x8290749f
+0,      42624,      42624,     1152,     2304, 0x2c7b7d30
+0,      43776,      43776,     1152,     2304, 0xe4f17743
+0,      44928,      44928,     1152,     2304, 0x0e747d6e
+0,      46080,      46080,     1152,     2304, 0xbe7775a0
+0,      47232,      47232,     1152,     2304, 0xcf797673
+0,      48384,      48384,     1152,     2304, 0x29cb7800
+0,      49536,      49536,     1152,     2304, 0xfc947890
+0,      50688,      50688,     1152,     2304, 0x62757fc6
+0,      51840,      51840,     1152,     2304, 0x098876d0
+0,      52992,      52992,     1152,     2304, 0xa9567ee2
+0,      54144,      54144,     1152,     2304, 0xe3bb9173
+0,      55296,      55296,     1152,     2304, 0xcc2d6dee
+0,      56448,      56448,     1152,     2304, 0xe94591ab
+0,      57600,      57600,     1152,     2304, 0x5c7588de
+0,      58752,      58752,     1152,     2304, 0xfd83643c
+0,      59904,      59904,     1152,     2304, 0x528177f1
+0,      61056,      61056,     1152,     2304, 0x65d08474
+0,      62208,      62208,     1152,     2304, 0x738d765b
+0,      63360,      63360,     1152,     2304, 0xdd3d810e
+0,      64512,      64512,     1152,     2304, 0xef4f90d3
+0,      65664,      65664,     1152,     2304, 0x61e28d43
+0,      66816,      66816,     1152,     2304, 0x9a11796b
+0,      67968,      67968,     1152,     2304, 0x96c97dcd
+0,      69120,      69120,     1152,     2304, 0xa8fe8621
+0,      70272,      70272,     1152,     2304, 0x499b7d38
+0,      71424,      71424,     1152,     2304, 0xfcb078a9
+0,      72576,      72576,     1152,     2304, 0x40d78651
+0,      73728,      73728,     1152,     2304, 0xa4af7234
+0,      74880,      74880,     1152,     2304, 0x6831870a
+0,      76032,      76032,     1152,     2304, 0x030e7b9d
+0,      77184,      77184,     1152,     2304, 0x445a75b6
+0,      78336,      78336,     1152,     2304, 0x09857389
+0,      79488,      79488,     1152,     2304, 0x0d018866
+0,      80640,      80640,     1152,     2304, 0x2afe810a
+0,      81792,      81792,     1152,     2304, 0x0bcf7c43
+0,      82944,      82944,     1152,     2304, 0x13737c12
+0,      84096,      84096,     1152,     2304, 0x716c7bba
+0,      85248,      85248,     1152,     2304, 0xb801823b
+0,      86400,      86400,     1152,     2304, 0x0fd573ee
+0,      87552,      87552,     1152,     2304, 0xe1ab879c
+0,      88704,      88704,     1152,     2304, 0x49e6764f
+0,      89856,      89856,     1152,     2304, 0xd5f26ddc
+0,      91008,      91008,     1152,     2304, 0x076775ff
+0,      92160,      92160,     1152,     2304, 0xfbb86fce
+0,      93312,      93312,     1152,     2304, 0x20c56858
+0,      94464,      94464,     1152,     2304, 0x043e6891
+0,      95616,      95616,     1152,     2304, 0x59648729
+0,      96768,      96768,     1152,     2304, 0xd4907a63
+0,      97920,      97920,     1152,     2304, 0xd0208a4c
+0,      99072,      99072,     1152,     2304, 0xce968383
+0,     100224,     100224,     1152,     2304, 0x3cfc7cd1
+0,     101376,     101376,     1152,     2304, 0x628a7bf5
+0,     102528,     102528,     1152,     2304, 0x9cfe8a4f
+0,     103680,     103680,     1152,     2304, 0xdf6f7c6d
+0,     104832,     104832,     1152,     2304, 0x6cf6882a
+0,     105984,     105984,     1152,     2304, 0x099773a3
+0,     107136,     107136,     1152,     2304, 0x4a1c7649
+0,     108288,     108288,     1152,     2304, 0x31ea71cb
+0,     109440,     109440,     1152,     2304, 0xed127ed9
+0,     110592,     110592,     1152,     2304, 0x5b156954
+0,     111744,     111744,     1152,     2304, 0xdd638532
+0,     112896,     112896,     1152,     2304, 0xf1a271f2
+0,     114048,     114048,     1152,     2304, 0x779184d7
+0,     115200,     115200,     1152,     2304, 0x49a88aa8
+0,     116352,     116352,     1152,     2304, 0xa11b7c90
+0,     117504,     117504,     1152,     2304, 0xbf488274
+0,     118656,     118656,     1152,     2304, 0x002f79a8
+0,     119808,     119808,     1152,     2304, 0x0ed97e2f
+0,     120960,     120960,     1152,     2304, 0x7845878f
+0,     122112,     122112,     1152,     2304, 0x46d777dc
+0,     123264,     123264,     1152,     2304, 0x8d0179e3
+0,     124416,     124416,     1152,     2304, 0x38917f9f
+0,     125568,     125568,     1152,     2304, 0x449876e7
+0,     126720,     126720,     1152,     2304, 0x001a8769
+0,     127872,     127872,     1152,     2304, 0x06c1826b
+0,     129024,     129024,     1152,     2304, 0x41b68047
+0,     130176,     130176,     1152,     2304, 0xeb9782c6
+0,     131328,     131328,     1152,     2304, 0x7cd9719c
+0,     132480,     132480,     1152,     2304, 0x3a4a767c
+0,     133632,     133632,     1152,     2304, 0x7f887e81
+0,     134784,     134784,     1152,     2304, 0xf75d714b
+0,     135936,     135936,     1152,     2304, 0x33b57e9f
+0,     137088,     137088,     1152,     2304, 0xc732749e
+0,     138240,     138240,     1152,     2304, 0x386f7e1a
+0,     139392,     139392,     1152,     2304, 0x6b9c767d
+0,     140544,     140544,     1152,     2304, 0x701c83e5
+0,     141696,     141696,     1152,     2304, 0xb92571e1
+0,     142848,     142848,     1152,     2304, 0x833a84bc
+0,     144000,     144000,     1152,     2304, 0x1b6984e0
+0,     145152,     145152,     1152,     2304, 0x1b2474ba
+0,     146304,     146304,     1152,     2304, 0xc22775a6
+0,     147456,     147456,     1152,     2304, 0x3e8f7972
+0,     148608,     148608,     1152,     2304, 0x17a28a65
+0,     149760,     149760,     1152,     2304, 0x9b6178a4
+0,     150912,     150912,     1152,     2304, 0x5d707873
+0,     152064,     152064,     1152,     2304, 0x68e2645a
+0,     153216,     153216,     1152,     2304, 0x1e377d28
+0,     154368,     154368,     1152,     2304, 0x54b384be
+0,     155520,     155520,     1152,     2304, 0x0617808c
+0,     156672,     156672,     1152,     2304, 0xbc2b8a6c
+0,     157824,     157824,     1152,     2304, 0x7ced7180
+0,     158976,     158976,     1152,     2304, 0xf22180ab
+0,     160128,     160128,     1152,     2304, 0xf13682c9
+0,     161280,     161280,     1152,     2304, 0x7eff87fd
+0,     162432,     162432,     1152,     2304, 0x5a0b5cec
+0,     163584,     163584,     1152,     2304, 0x57c18906
+0,     164736,     164736,     1152,     2304, 0xb55a6a16
+0,     165888,     165888,     1152,     2304, 0xf2608371
+0,     167040,     167040,     1152,     2304, 0x36df7576
+0,     168192,     168192,     1152,     2304, 0xdb106fb4
+0,     169344,     169344,     1152,     2304, 0x7e4f85d0
+0,     170496,     170496,     1152,     2304, 0xe3ee78ab
+0,     171648,     171648,     1152,     2304, 0xd36b7dc7
+0,     172800,     172800,     1152,     2304, 0xadab7c5c
+0,     173952,     173952,     1152,     2304, 0x70786f26
+0,     175104,     175104,     1152,     2304, 0xcd5d717e
+0,     176256,     176256,     1152,     2304, 0xc1a96f9a
+0,     177408,     177408,     1152,     2304, 0xad777887
+0,     178560,     178560,     1152,     2304, 0x98277c16
+0,     179712,     179712,     1152,     2304, 0x868882c5
+0,     180864,     180864,     1152,     2304, 0xc48092b9
+0,     182016,     182016,     1152,     2304, 0x230069da
+0,     183168,     183168,     1152,     2304, 0x14147ad6
+0,     184320,     184320,     1152,     2304, 0xc9007172
+0,     185472,     185472,     1152,     2304, 0x85d67bcc
+0,     186624,     186624,     1152,     2304, 0x22418bab
+0,     187776,     187776,     1152,     2304, 0xe53c8b71
+0,     188928,     188928,     1152,     2304, 0x5a1a9053
+0,     190080,     190080,     1152,     2304, 0x9cd179af
+0,     191232,     191232,     1152,     2304, 0xbb3c7d72
+0,     192384,     192384,     1152,     2304, 0x477a8677
+0,     193536,     193536,     1152,     2304, 0xe3337834
+0,     194688,     194688,     1152,     2304, 0x1cb56d77
+0,     195840,     195840,     1152,     2304, 0xe89d6dac
+0,     196992,     196992,     1152,     2304, 0xd468827e
+0,     198144,     198144,     1152,     2304, 0xebc46b87
+0,     199296,     199296,     1152,     2304, 0x5fbb78d2
+0,     200448,     200448,     1152,     2304, 0xa1b483d6
+0,     201600,     201600,     1152,     2304, 0x6fec7cab
+0,     202752,     202752,     1152,     2304, 0xd86d6f6c
+0,     203904,     203904,     1152,     2304, 0x8c2c7d51
+0,     205056,     205056,     1152,     2304, 0xe8377cd7
+0,     206208,     206208,     1152,     2304, 0xb57071b4
+0,     207360,     207360,     1152,     2304, 0xc35c71fd
+0,     208512,     208512,     1152,     2304, 0x789079e9
+0,     209664,     209664,     1152,     2304, 0x413b710e
+0,     210816,     210816,     1152,     2304, 0x82678332
+0,     211968,     211968,     1152,     2304, 0xe1576e75
+0,     213120,     213120,     1152,     2304, 0x7c0b7ad6
+0,     214272,     214272,     1152,     2304, 0xc6b6786d
+0,     215424,     215424,     1152,     2304, 0x736f7b89
+0,     216576,     216576,     1152,     2304, 0x0ded72f1
+0,     217728,     217728,     1152,     2304, 0xcb877a3c
+0,     218880,     218880,     1152,     2304, 0x7c497d40
+0,     220032,     220032,     1152,     2304, 0xb4a77052
diff --git a/tests/ref/fate/hls-init-time b/tests/ref/fate/hls-init-time
new file mode 100644
index 0000000..5bc1227
--- /dev/null
+++ b/tests/ref/fate/hls-init-time
@@ -0,0 +1,313 @@
+#tb 0: 1/44100
+#media_type 0: audio
+#codec_id 0: pcm_s16le
+#sample_rate 0: 44100
+#channel_layout 0: 4
+#channel_layout_name 0: mono
+0,          0,          0,     1152,     2304, 0x28123557
+0,       1152,       1152,     1152,     2304, 0x838c7e81
+0,       2304,       2304,     1152,     2304, 0x4fb8704c
+0,       3456,       3456,     1152,     2304, 0x5f787f9e
+0,       4608,       4608,     1152,     2304, 0xc866749f
+0,       5760,       5760,     1152,     2304, 0x30057e19
+0,       6912,       6912,     1152,     2304, 0xaa64747f
+0,       8064,       8064,     1152,     2304, 0x8d3c84e4
+0,       9216,       9216,     1152,     2304, 0xffb871e1
+0,      10368,      10368,     1152,     2304, 0x0dfe84bc
+0,      11520,      11520,     1152,     2304, 0x341385e0
+0,      12672,      12672,     1152,     2304, 0x069e72bb
+0,      13824,      13824,     1152,     2304, 0xc3b175a6
+0,      14976,      14976,     1152,     2304, 0x3f777972
+0,      16128,      16128,     1152,     2304, 0xb7598a65
+0,      17280,      17280,     1152,     2304, 0x9bd178a4
+0,      18432,      18432,     1152,     2304, 0xedca7972
+0,      19584,      19584,     1152,     2304, 0x8db2625c
+0,      20736,      20736,     1152,     2304, 0x99c67c29
+0,      21888,      21888,     1152,     2304, 0x54f984be
+0,      23040,      23040,     1152,     2304, 0x4669828a
+0,      24192,      24192,     1152,     2304, 0x3e4b8b6b
+0,      25344,      25344,     1152,     2304, 0x7f1f7180
+0,      26496,      26496,     1152,     2304, 0x3af882a9
+0,      27648,      27648,     1152,     2304, 0x091181cb
+0,      28800,      28800,     1152,     2304, 0x7b9187fc
+0,      29952,      29952,     1152,     2304, 0x59f55cec
+0,      31104,      31104,     1152,     2304, 0xdf888807
+0,      32256,      32256,     1152,     2304, 0xe0216c14
+0,      33408,      33408,     1152,     2304, 0x91248470
+0,      34560,      34560,     1152,     2304, 0xe7d07576
+0,      35712,      35712,     1152,     2304, 0xdb446fb4
+0,      36864,      36864,     1152,     2304, 0x815d85d0
+0,      38016,      38016,     1152,     2304, 0x67e877ac
+0,      39168,      39168,     1152,     2304, 0x51307bc9
+0,      40320,      40320,     1152,     2304, 0xad597c5c
+0,      41472,      41472,     1152,     2304, 0x84a77124
+0,      42624,      42624,     1152,     2304, 0xcef5717e
+0,      43776,      43776,     1152,     2304, 0xc1596f9a
+0,      44928,      44928,     1152,     2304, 0xcbb57986
+0,      46080,      46080,     1152,     2304, 0x5dd97b17
+0,      47232,      47232,     1152,     2304, 0x88d882c5
+0,      48384,      48384,     1152,     2304, 0x869491ba
+0,      49536,      49536,     1152,     2304, 0x254e69da
+0,      50688,      50688,     1152,     2304, 0xe4b579d7
+0,      51840,      51840,     1152,     2304, 0x1fcd7271
+0,      52992,      52992,     1152,     2304, 0x872c7bcc
+0,      54144,      54144,     1152,     2304, 0x23818bab
+0,      55296,      55296,     1152,     2304, 0x3cc28b72
+0,      56448,      56448,     1152,     2304, 0x9cd79250
+0,      57600,      57600,     1152,     2304, 0xeb3979af
+0,      58752,      58752,     1152,     2304, 0xbe647d72
+0,      59904,      59904,     1152,     2304, 0xa5858875
+0,      61056,      61056,     1152,     2304, 0xbb247834
+0,      62208,      62208,     1152,     2304, 0xe9846e76
+0,      63360,      63360,     1152,     2304, 0x17d06cad
+0,      64512,      64512,     1152,     2304, 0x6ae6817f
+0,      65664,      65664,     1152,     2304, 0xcb1c6c86
+0,      66816,      66816,     1152,     2304, 0x606778d2
+0,      67968,      67968,     1152,     2304, 0xa21e83d7
+0,      69120,      69120,     1152,     2304, 0xc5fd7caa
+0,      70272,      70272,     1152,     2304, 0x68866e6d
+0,      71424,      71424,     1152,     2304, 0x28ee7d51
+0,      72576,      72576,     1152,     2304, 0xe1f87ad9
+0,      73728,      73728,     1152,     2304, 0xbf4175b0
+0,      74880,      74880,     1152,     2304, 0xe9c372fd
+0,      76032,      76032,     1152,     2304, 0xc7a77ae7
+0,      77184,      77184,     1152,     2304, 0x9a74700f
+0,      78336,      78336,     1152,     2304, 0xe2288431
+0,      79488,      79488,     1152,     2304, 0xa7bd6d76
+0,      80640,      80640,     1152,     2304, 0x73fe7cd4
+0,      81792,      81792,     1152,     2304, 0xfa0c796c
+0,      82944,      82944,     1152,     2304, 0x020c7a8a
+0,      84096,      84096,     1152,     2304, 0xeba674ef
+0,      85248,      85248,     1152,     2304, 0x6efc793d
+0,      86400,      86400,     1152,     2304, 0xcfb07e3f
+0,      87552,      87552,     1152,     2304, 0xe6027a8c
+0,      88704,      88704,     1152,     2304, 0x4db4748c
+0,      89856,      89856,     1152,     2304, 0x7cf27ec0
+0,      91008,      91008,     1152,     2304, 0x72bb7bba
+0,      92160,      92160,     1152,     2304, 0x275f73b9
+0,      93312,      93312,     1152,     2304, 0x6791812c
+0,      94464,      94464,     1152,     2304, 0x9bb06ff6
+0,      95616,      95616,     1152,     2304, 0x8c1b7cb4
+0,      96768,      96768,     1152,     2304, 0xafd38677
+0,      97920,      97920,     1152,     2304, 0x7eca7304
+0,      99072,      99072,     1152,     2304, 0xfbb17c1e
+0,     100224,     100224,     1152,     2304, 0xb5448405
+0,     101376,     101376,     1152,     2304, 0xe2ea77b1
+0,     102528,     102528,     1152,     2304, 0x9d347d88
+0,     103680,     103680,     1152,     2304, 0xed007236
+0,     104832,     104832,     1152,     2304, 0xc0bc6e08
+0,     105984,     105984,     1152,     2304, 0x97bb7b8c
+0,     107136,     107136,     1152,     2304, 0x47e2674d
+0,     108288,     108288,     1152,     2304, 0x4971790b
+0,     109440,     109440,     1152,     2304, 0x8823812d
+0,     110592,     110592,     1152,     2304, 0xc30e7549
+0,     111744,     111744,     1152,     2304, 0xdee87475
+0,     112896,     112896,     1152,     2304, 0x6c6184aa
+0,     114048,     114048,     1152,     2304, 0x45ff706b
+0,     115200,     115200,     1152,     2304, 0xc14688b2
+0,     116352,     116352,     1152,     2304, 0xd011965e
+0,     117504,     117504,     1152,     2304, 0x07946957
+0,     118656,     118656,     1152,     2304, 0xed518404
+0,     119808,     119808,     1152,     2304, 0xa6168301
+0,     120960,     120960,     1152,     2304, 0xed5c70df
+0,     122112,     122112,     1152,     2304, 0xb897782a
+0,     123264,     123264,     1152,     2304, 0x4a626f21
+0,     124416,     124416,     1152,     2304, 0xe63b7ca6
+0,     125568,     125568,     1152,     2304, 0x79d780ff
+0,     126720,     126720,     1152,     2304, 0xf68974be
+0,     127872,     127872,     1152,     2304, 0x66657e8c
+0,     129024,     129024,     1152,     2304, 0xc0b28aae
+0,     130176,     130176,     1152,     2304, 0xbf587c4a
+0,     131328,     131328,     1152,     2304, 0x5d139349
+0,     132480,     132480,     1152,     2304, 0x0e067a4e
+0,     133632,     133632,     1152,     2304, 0x328d6c0b
+0,     134784,     134784,     1152,     2304, 0x1f4b77dd
+0,     135936,     135936,     1152,     2304, 0xba5b92ba
+0,     137088,     137088,     1152,     2304, 0xd158794a
+0,     138240,     138240,     1152,     2304, 0xea02879e
+0,     139392,     139392,     1152,     2304, 0x8de08081
+0,     140544,     140544,     1152,     2304, 0x406776b1
+0,     141696,     141696,     1152,     2304, 0xfb0e7084
+0,     142848,     142848,     1152,     2304, 0x7499891a
+0,     144000,     144000,     1152,     2304, 0x823f7094
+0,     145152,     145152,     1152,     2304, 0x6ec27f15
+0,     146304,     146304,     1152,     2304, 0xe2087d1c
+0,     147456,     147456,     1152,     2304, 0x0bd48042
+0,     148608,     148608,     1152,     2304, 0xce227acc
+0,     149760,     149760,     1152,     2304, 0x97b17248
+0,     150912,     150912,     1152,     2304, 0x8d436bc9
+0,     152064,     152064,     1152,     2304, 0x6f477995
+0,     153216,     153216,     1152,     2304, 0x09008588
+0,     154368,     154368,     1152,     2304, 0x87e084b4
+0,     155520,     155520,     1152,     2304, 0xe1187e42
+0,     156672,     156672,     1152,     2304, 0x4ab37d73
+0,     157824,     157824,     1152,     2304, 0x615c64da
+0,     158976,     158976,     1152,     2304, 0x16598832
+0,     160128,     160128,     1152,     2304, 0x03998393
+0,     161280,     161280,     1152,     2304, 0x20317653
+0,     162432,     162432,     1152,     2304, 0x74c57983
+0,     163584,     163584,     1152,     2304, 0xdacd7eea
+0,     164736,     164736,     1152,     2304, 0xd8896e20
+0,     165888,     165888,     1152,     2304, 0x98247f2c
+0,     167040,     167040,     1152,     2304, 0xe4ad7dc5
+0,     168192,     168192,     1152,     2304, 0x444f86a7
+0,     169344,     169344,     1152,     2304, 0x64e57440
+0,     170496,     170496,     1152,     2304, 0xb1197892
+0,     171648,     171648,     1152,     2304, 0xf7627a4f
+0,     172800,     172800,     1152,     2304, 0xc26776a9
+0,     173952,     173952,     1152,     2304, 0xa2f18a85
+0,     175104,     175104,     1152,     2304, 0x112e6f4d
+0,     176256,     176256,     1152,     2304, 0x5c887a6f
+0,     177408,     177408,     1152,     2304, 0xeb3c724a
+0,     178560,     178560,     1152,     2304, 0xba8983cc
+0,     179712,     179712,     1152,     2304, 0x74dc6bc9
+0,     180864,     180864,     1152,     2304, 0x262c75d5
+0,     182016,     182016,     1152,     2304, 0xaba97a90
+0,     183168,     183168,     1152,     2304, 0xf3067fdb
+0,     184320,     184320,     1152,     2304, 0x4b8a8684
+0,     185472,     185472,     1152,     2304, 0x86c979e7
+0,     186624,     186624,     1152,     2304, 0x26d16a02
+0,     187776,     187776,     1152,     2304, 0x222c83d4
+0,     188928,     188928,     1152,     2304, 0x4f43951d
+0,     190080,     190080,     1152,     2304, 0x9b4179f1
+0,     191232,     191232,     1152,     2304, 0x17727ee7
+0,     192384,     192384,     1152,     2304, 0xc4267ac4
+0,     193536,     193536,     1152,     2304, 0x987f6ba7
+0,     194688,     194688,     1152,     2304, 0xdb5d747c
+0,     195840,     195840,     1152,     2304, 0x3fa1801c
+0,     196992,     196992,     1152,     2304, 0x28b7800a
+0,     198144,     198144,     1152,     2304, 0x553d8ba3
+0,     199296,     199296,     1152,     2304, 0xe837895f
+0,     200448,     200448,     1152,     2304, 0xf59682a0
+0,     201600,     201600,     1152,     2304, 0xb8008993
+0,     202752,     202752,     1152,     2304, 0x0c43681f
+0,     203904,     203904,     1152,     2304, 0xfba06f7a
+0,     205056,     205056,     1152,     2304, 0x8d7372bf
+0,     206208,     206208,     1152,     2304, 0x9e4b7cf2
+0,     207360,     207360,     1152,     2304, 0x538e784f
+0,     208512,     208512,     1152,     2304, 0xba75786d
+0,     209664,     209664,     1152,     2304, 0x03f18a64
+0,     210816,     210816,     1152,     2304, 0x09ef77d9
+0,     211968,     211968,     1152,     2304, 0xf072779c
+0,     213120,     213120,     1152,     2304, 0xc331892d
+0,     214272,     214272,     1152,     2304, 0x46188131
+0,     215424,     215424,     1152,     2304, 0xdfaf8143
+0,     216576,     216576,     1152,     2304, 0xf0e286d2
+0,     217728,     217728,     1152,     2304, 0x28547598
+0,     218880,     218880,     1152,     2304, 0xaedc6e3f
+0,     220032,     220032,     1152,     2304, 0x542b6fa9
+0,     221184,     221184,     1152,     2304, 0xe7ec6f4d
+0,     222336,     222336,     1152,     2304, 0xacc47bbe
+0,     223488,     223488,     1152,     2304, 0xcec48d33
+0,     224640,     224640,     1152,     2304, 0xa78a8531
+0,     225792,     225792,     1152,     2304, 0xd6337d81
+0,     226944,     226944,     1152,     2304, 0xf9e07944
+0,     228096,     228096,     1152,     2304, 0x01368885
+0,     229248,     229248,     1152,     2304, 0x301981d0
+0,     230400,     230400,     1152,     2304, 0x40ed7214
+0,     231552,     231552,     1152,     2304, 0x6f096f46
+0,     232704,     232704,     1152,     2304, 0x567d7b3b
+0,     233856,     233856,     1152,     2304, 0xd1d97692
+0,     235008,     235008,     1152,     2304, 0xe6ac63d5
+0,     236160,     236160,     1152,     2304, 0x5dae8337
+0,     237312,     237312,     1152,     2304, 0x3a75820d
+0,     238464,     238464,     1152,     2304, 0xc66c7f52
+0,     239616,     239616,     1152,     2304, 0x4e72815d
+0,     240768,     240768,     1152,     2304, 0x1eb67d12
+0,     241920,     241920,     1152,     2304, 0xc51f8879
+0,     243072,     243072,     1152,     2304, 0x6b0c78ed
+0,     244224,     244224,     1152,     2304, 0x5e2c7b81
+0,     245376,     245376,     1152,     2304, 0xd3487fd4
+0,     246528,     246528,     1152,     2304, 0xb56b7a23
+0,     247680,     247680,     1152,     2304, 0x744e6e77
+0,     248832,     248832,     1152,     2304, 0x63528197
+0,     249984,     249984,     1152,     2304, 0xdda4793f
+0,     251136,     251136,     1152,     2304, 0x23317a27
+0,     252288,     252288,     1152,     2304, 0x82738430
+0,     253440,     253440,     1152,     2304, 0xeb7d7619
+0,     254592,     254592,     1152,     2304, 0x05079110
+0,     255744,     255744,     1152,     2304, 0x5ecc6edb
+0,     256896,     256896,     1152,     2304, 0xe6897a38
+0,     258048,     258048,     1152,     2304, 0x55f2839b
+0,     259200,     259200,     1152,     2304, 0x95f57eab
+0,     260352,     260352,     1152,     2304, 0xb39367fb
+0,     261504,     261504,     1152,     2304, 0x48537cae
+0,     262656,     262656,     1152,     2304, 0xee6d7cf9
+0,     263808,     263808,     1152,     2304, 0xe35f84b4
+0,     264960,     264960,     1152,     2304, 0x16028fad
+0,     266112,     266112,     1152,     2304, 0xdf6673f7
+0,     267264,     267264,     1152,     2304, 0xe1d97408
+0,     268416,     268416,     1152,     2304, 0xb48878b1
+0,     269568,     269568,     1152,     2304, 0x354b8638
+0,     270720,     270720,     1152,     2304, 0xb1767659
+0,     271872,     271872,     1152,     2304, 0x546a5cd1
+0,     273024,     273024,     1152,     2304, 0x2d238c49
+0,     274176,     274176,     1152,     2304, 0xcfc4886f
+0,     275328,     275328,     1152,     2304, 0x95b47cef
+0,     276480,     276480,     1152,     2304, 0x389f8338
+0,     277632,     277632,     1152,     2304, 0xcfb17744
+0,     278784,     278784,     1152,     2304, 0x50d76c4a
+0,     279936,     279936,     1152,     2304, 0x38a08aea
+0,     281088,     281088,     1152,     2304, 0xc3977790
+0,     282240,     282240,     1152,     2304, 0x086c8eeb
+0,     283392,     283392,     1152,     2304, 0xa1867ebd
+0,     284544,     284544,     1152,     2304, 0xd14c74f4
+0,     285696,     285696,     1152,     2304, 0x742e71c8
+0,     286848,     286848,     1152,     2304, 0xee737d69
+0,     288000,     288000,     1152,     2304, 0xc28b7385
+0,     289152,     289152,     1152,     2304, 0xce1b7f16
+0,     290304,     290304,     1152,     2304, 0xa5e180fe
+0,     291456,     291456,     1152,     2304, 0xb1788164
+0,     292608,     292608,     1152,     2304, 0xa6698076
+0,     293760,     293760,     1152,     2304, 0x2c017f8e
+0,     294912,     294912,     1152,     2304, 0x8359743b
+0,     296064,     296064,     1152,     2304, 0xcb4c8146
+0,     297216,     297216,     1152,     2304, 0x505d6f12
+0,     298368,     298368,     1152,     2304, 0x5ba16a70
+0,     299520,     299520,     1152,     2304, 0xdb8988d3
+0,     300672,     300672,     1152,     2304, 0x24447075
+0,     301824,     301824,     1152,     2304, 0x506e8a8b
+0,     302976,     302976,     1152,     2304, 0xe0c5728e
+0,     304128,     304128,     1152,     2304, 0x67d57a36
+0,     305280,     305280,     1152,     2304, 0x1d27908b
+0,     306432,     306432,     1152,     2304, 0xbeaf7c71
+0,     307584,     307584,     1152,     2304, 0x437678ed
+0,     308736,     308736,     1152,     2304, 0x0bca7b50
+0,     309888,     309888,     1152,     2304, 0xa7858205
+0,     311040,     311040,     1152,     2304, 0x294573c9
+0,     312192,     312192,     1152,     2304, 0x519271a2
+0,     313344,     313344,     1152,     2304, 0x3c4676f6
+0,     314496,     314496,     1152,     2304, 0x449e76cd
+0,     315648,     315648,     1152,     2304, 0x17248928
+0,     316800,     316800,     1152,     2304, 0x585367ed
+0,     317952,     317952,     1152,     2304, 0xb70a7fa4
+0,     319104,     319104,     1152,     2304, 0x3ee18149
+0,     320256,     320256,     1152,     2304, 0x019c8782
+0,     321408,     321408,     1152,     2304, 0x38ab639d
+0,     322560,     322560,     1152,     2304, 0x289c6f68
+0,     323712,     323712,     1152,     2304, 0xe7597fe2
+0,     324864,     324864,     1152,     2304, 0x80ff80ac
+0,     326016,     326016,     1152,     2304, 0xafe86ee3
+0,     327168,     327168,     1152,     2304, 0x9f3f8a4d
+0,     328320,     328320,     1152,     2304, 0x1fae83b4
+0,     329472,     329472,     1152,     2304, 0x9b087557
+0,     330624,     330624,     1152,     2304, 0x3f0280bd
+0,     331776,     331776,     1152,     2304, 0xd82b7c15
+0,     332928,     332928,     1152,     2304, 0xe1f18560
+0,     334080,     334080,     1152,     2304, 0xcf857ae8
+0,     335232,     335232,     1152,     2304, 0x1037786e
+0,     336384,     336384,     1152,     2304, 0x52e17ed1
+0,     337536,     337536,     1152,     2304, 0x1ebc7456
+0,     338688,     338688,     1152,     2304, 0xf3de8040
+0,     339840,     339840,     1152,     2304, 0x71657685
+0,     340992,     340992,     1152,     2304, 0x6e5c7d5d
+0,     342144,     342144,     1152,     2304, 0x147d68bb
+0,     343296,     343296,     1152,     2304, 0xc43e6d62
+0,     344448,     344448,     1152,     2304, 0x1b34783c
+0,     345600,     345600,     1152,     2304, 0xe2c97e7e
+0,     346752,     346752,     1152,     2304, 0xcaf97991
+0,     347904,     347904,     1152,     2304, 0xee117db9
+0,     349056,     349056,     1152,     2304, 0x7cdc810a
+0,     350208,     350208,     1152,     2304, 0x2d687abb
+0,     351360,     351360,     1152,     2304, 0x7ccf84fa
+0,     352512,     352512,     1152,     2304, 0x3bc25b1d
diff --git a/tests/ref/fate/hls-list-size b/tests/ref/fate/hls-list-size
new file mode 100644
index 0000000..cf7fb9f
--- /dev/null
+++ b/tests/ref/fate/hls-list-size
@@ -0,0 +1,618 @@
+#tb 0: 1/44100
+#media_type 0: audio
+#codec_id 0: pcm_s16le
+#sample_rate 0: 44100
+#channel_layout 0: 4
+#channel_layout_name 0: mono
+0,          0,          0,     1152,     2304, 0x9ce3278a
+0,       1152,       1152,     1152,     2304, 0x5cd17b17
+0,       2304,       2304,     1152,     2304, 0x8aec82c5
+0,       3456,       3456,     1152,     2304, 0xe8ce8fbc
+0,       4608,       4608,     1152,     2304, 0x262c69da
+0,       5760,       5760,     1152,     2304, 0x6afc7ad6
+0,       6912,       6912,     1152,     2304, 0x9f2a7370
+0,       8064,       8064,     1152,     2304, 0x88fe7bcc
+0,       9216,       9216,     1152,     2304, 0x228b8bab
+0,      10368,      10368,     1152,     2304, 0xd87f8c71
+0,      11520,      11520,     1152,     2304, 0x82989151
+0,      12672,      12672,     1152,     2304, 0x1e0f7aae
+0,      13824,      13824,     1152,     2304, 0xbdcc7d72
+0,      14976,      14976,     1152,     2304, 0xa7af8875
+0,      16128,      16128,     1152,     2304, 0xb9aa7834
+0,      17280,      17280,     1152,     2304, 0xea8e6e76
+0,      18432,      18432,     1152,     2304, 0x7bbe6bae
+0,      19584,      19584,     1152,     2304, 0x2bbd817f
+0,      20736,      20736,     1152,     2304, 0xccd46c86
+0,      21888,      21888,     1152,     2304, 0x603178d2
+0,      23040,      23040,     1152,     2304, 0xa2d283d7
+0,      24192,      24192,     1152,     2304, 0xc6e97caa
+0,      25344,      25344,     1152,     2304, 0x67e06e6d
+0,      26496,      26496,     1152,     2304, 0x27c47d51
+0,      27648,      27648,     1152,     2304, 0x17f47cd7
+0,      28800,      28800,     1152,     2304, 0xbedb75b0
+0,      29952,      29952,     1152,     2304, 0xeb1f72fd
+0,      31104,      31104,     1152,     2304, 0x6dae79e9
+0,      32256,      32256,     1152,     2304, 0x90e36f0e
+0,      33408,      33408,     1152,     2304, 0xe0748431
+0,      34560,      34560,     1152,     2304, 0xa78f6d76
+0,      35712,      35712,     1152,     2304, 0xa9cf7cd4
+0,      36864,      36864,     1152,     2304, 0xfa12796c
+0,      38016,      38016,     1152,     2304, 0x73d47c88
+0,      39168,      39168,     1152,     2304, 0xec8c74ef
+0,      40320,      40320,     1152,     2304, 0x6eda793d
+0,      41472,      41472,     1152,     2304, 0xd26c7e3f
+0,      42624,      42624,     1152,     2304, 0xd7e3788d
+0,      43776,      43776,     1152,     2304, 0x4f26748c
+0,      44928,      44928,     1152,     2304, 0x7ce07ec0
+0,      46080,      46080,     1152,     2304, 0x72ab7bba
+0,      47232,      47232,     1152,     2304, 0x287b73b9
+0,      48384,      48384,     1152,     2304, 0x78b8822b
+0,      49536,      49536,     1152,     2304, 0x9cc46ff6
+0,      50688,      50688,     1152,     2304, 0x2fdd7bb5
+0,      51840,      51840,     1152,     2304, 0x03118776
+0,      52992,      52992,     1152,     2304, 0x1f0e7403
+0,      54144,      54144,     1152,     2304, 0xfbd97c1e
+0,      55296,      55296,     1152,     2304, 0xcd118405
+0,      56448,      56448,     1152,     2304, 0xb5ce78b0
+0,      57600,      57600,     1152,     2304, 0x87b27d88
+0,      58752,      58752,     1152,     2304, 0xebd07236
+0,      59904,      59904,     1152,     2304, 0xc27c6e08
+0,      61056,      61056,     1152,     2304, 0xe17f7b8c
+0,      62208,      62208,     1152,     2304, 0x46ac674d
+0,      63360,      63360,     1152,     2304, 0x44d47b09
+0,      64512,      64512,     1152,     2304, 0x8901812d
+0,      65664,      65664,     1152,     2304, 0xc348754a
+0,      66816,      66816,     1152,     2304, 0xd6b27474
+0,      67968,      67968,     1152,     2304, 0x6dbd84aa
+0,      69120,      69120,     1152,     2304, 0x47a3706b
+0,      70272,      70272,     1152,     2304, 0x162188b2
+0,      71424,      71424,     1152,     2304, 0xf127955f
+0,      72576,      72576,     1152,     2304, 0xce3d6a56
+0,      73728,      73728,     1152,     2304, 0x32308305
+0,      74880,      74880,     1152,     2304, 0xa7088301
+0,      76032,      76032,     1152,     2304, 0xed6670df
+0,      77184,      77184,     1152,     2304, 0xbfe1782a
+0,      78336,      78336,     1152,     2304, 0x4ac26f21
+0,      79488,      79488,     1152,     2304, 0x37557da5
+0,      80640,      80640,     1152,     2304, 0x7bb580ff
+0,      81792,      81792,     1152,     2304, 0xf76f74be
+0,      82944,      82944,     1152,     2304, 0x68557e8c
+0,      84096,      84096,     1152,     2304, 0x3f6d88b0
+0,      85248,      85248,     1152,     2304, 0xbfa47c4b
+0,      86400,      86400,     1152,     2304, 0xb58d9447
+0,      87552,      87552,     1152,     2304, 0xc297794f
+0,      88704,      88704,     1152,     2304, 0x36a36c0c
+0,      89856,      89856,     1152,     2304, 0x15d777dc
+0,      91008,      91008,     1152,     2304, 0xa16b91bb
+0,      92160,      92160,     1152,     2304, 0x064f7a49
+0,      93312,      93312,     1152,     2304, 0xe8ea879e
+0,      94464,      94464,     1152,     2304, 0xb8137f82
+0,      95616,      95616,     1152,     2304, 0x3f2976b1
+0,      96768,      96768,     1152,     2304, 0xfafe7084
+0,      97920,      97920,     1152,     2304, 0x29948b18
+0,      99072,      99072,     1152,     2304, 0x83577094
+0,     100224,     100224,     1152,     2304, 0x753c7e16
+0,     101376,     101376,     1152,     2304, 0xe2587d1c
+0,     102528,     102528,     1152,     2304, 0x84817e44
+0,     103680,     103680,     1152,     2304, 0xcdf07acc
+0,     104832,     104832,     1152,     2304, 0x981d7248
+0,     105984,     105984,     1152,     2304, 0x8dd16bc9
+0,     107136,     107136,     1152,     2304, 0x6fb57995
+0,     108288,     108288,     1152,     2304, 0x0cf88687
+0,     109440,     109440,     1152,     2304, 0xf6a885b3
+0,     110592,     110592,     1152,     2304, 0xe34e7e42
+0,     111744,     111744,     1152,     2304, 0x4c357d73
+0,     112896,     112896,     1152,     2304, 0x5fee64da
+0,     114048,     114048,     1152,     2304, 0x090e8931
+0,     115200,     115200,     1152,     2304, 0xf2768294
+0,     116352,     116352,     1152,     2304, 0xec607554
+0,     117504,     117504,     1152,     2304, 0x76d17983
+0,     118656,     118656,     1152,     2304, 0xdc357eea
+0,     119808,     119808,     1152,     2304, 0xd8c56e20
+0,     120960,     120960,     1152,     2304, 0x98367f2c
+0,     122112,     122112,     1152,     2304, 0xe3af7dc5
+0,     123264,     123264,     1152,     2304, 0x0c6e85a9
+0,     124416,     124416,     1152,     2304, 0x5b89743f
+0,     125568,     125568,     1152,     2304, 0xb0bf7893
+0,     126720,     126720,     1152,     2304, 0xee887a4e
+0,     127872,     127872,     1152,     2304, 0xc39f76a9
+0,     129024,     129024,     1152,     2304, 0x521c8986
+0,     130176,     130176,     1152,     2304, 0x101e6f4d
+0,     131328,     131328,     1152,     2304, 0x5d3a7a6f
+0,     132480,     132480,     1152,     2304, 0xeafe724a
+0,     133632,     133632,     1152,     2304, 0xba4d83cc
+0,     134784,     134784,     1152,     2304, 0x74c86bc9
+0,     135936,     135936,     1152,     2304, 0x275675d5
+0,     137088,     137088,     1152,     2304, 0xab577a90
+0,     138240,     138240,     1152,     2304, 0xf62b80da
+0,     139392,     139392,     1152,     2304, 0x70f68783
+0,     140544,     140544,     1152,     2304, 0x87e779e7
+0,     141696,     141696,     1152,     2304, 0x25cd6a02
+0,     142848,     142848,     1152,     2304, 0x235c83d4
+0,     144000,     144000,     1152,     2304, 0xb44b931f
+0,     145152,     145152,     1152,     2304, 0x9c9979f1
+0,     146304,     146304,     1152,     2304, 0x15a07ee7
+0,     147456,     147456,     1152,     2304, 0xb57079c5
+0,     148608,     148608,     1152,     2304, 0x65c66aa9
+0,     149760,     149760,     1152,     2304, 0xd3f9747b
+0,     150912,     150912,     1152,     2304, 0x3e89801c
+0,     152064,     152064,     1152,     2304, 0x128d8109
+0,     153216,     153216,     1152,     2304, 0x56518ba3
+0,     154368,     154368,     1152,     2304, 0xe889895f
+0,     155520,     155520,     1152,     2304, 0x3474839f
+0,     156672,     156672,     1152,     2304, 0x3c928795
+0,     157824,     157824,     1152,     2304, 0x0d55681f
+0,     158976,     158976,     1152,     2304, 0xff086f7a
+0,     160128,     160128,     1152,     2304, 0xa0d373be
+0,     161280,     161280,     1152,     2304, 0x9d3f7cf3
+0,     162432,     162432,     1152,     2304, 0x4b4a784e
+0,     163584,     163584,     1152,     2304, 0xba89786d
+0,     164736,     164736,     1152,     2304, 0x038b8a64
+0,     165888,     165888,     1152,     2304, 0xbaf678d8
+0,     167040,     167040,     1152,     2304, 0xf198779c
+0,     168192,     168192,     1152,     2304, 0xb9b18a2c
+0,     169344,     169344,     1152,     2304, 0x46e68131
+0,     170496,     170496,     1152,     2304, 0xe0638143
+0,     171648,     171648,     1152,     2304, 0x438488d0
+0,     172800,     172800,     1152,     2304, 0x8ade7697
+0,     173952,     173952,     1152,     2304, 0xaf9c6e3f
+0,     175104,     175104,     1152,     2304, 0x54016fa9
+0,     176256,     176256,     1152,     2304, 0xe7aa6f4d
+0,     177408,     177408,     1152,     2304, 0x32987abf
+0,     178560,     178560,     1152,     2304, 0xd0dc8d33
+0,     179712,     179712,     1152,     2304, 0xa7708531
+0,     180864,     180864,     1152,     2304, 0xd01d7c82
+0,     182016,     182016,     1152,     2304, 0xfb267944
+0,     183168,     183168,     1152,     2304, 0x01f28885
+0,     184320,     184320,     1152,     2304, 0x2bb382cf
+0,     185472,     185472,     1152,     2304, 0x40337214
+0,     186624,     186624,     1152,     2304, 0x6f496f46
+0,     187776,     187776,     1152,     2304, 0x55297b3b
+0,     188928,     188928,     1152,     2304, 0xd2c77692
+0,     190080,     190080,     1152,     2304, 0x7b8c61d6
+0,     191232,     191232,     1152,     2304, 0x5f4a8337
+0,     192384,     192384,     1152,     2304, 0x3b7d820e
+0,     193536,     193536,     1152,     2304, 0xbe4c7f51
+0,     194688,     194688,     1152,     2304, 0x4f68815d
+0,     195840,     195840,     1152,     2304, 0xdfd77b14
+0,     196992,     196992,     1152,     2304, 0xc7558879
+0,     198144,     198144,     1152,     2304, 0x6a8678ed
+0,     199296,     199296,     1152,     2304, 0x5fd47b81
+0,     200448,     200448,     1152,     2304, 0xebc27fd5
+0,     201600,     201600,     1152,     2304, 0xabd77a22
+0,     202752,     202752,     1152,     2304, 0xd98a6d78
+0,     203904,     203904,     1152,     2304, 0xd30b8098
+0,     205056,     205056,     1152,     2304, 0xdf32793f
+0,     206208,     206208,     1152,     2304, 0x8c317928
+0,     207360,     207360,     1152,     2304, 0x83958430
+0,     208512,     208512,     1152,     2304, 0xea357619
+0,     209664,     209664,     1152,     2304, 0x074b9110
+0,     210816,     210816,     1152,     2304, 0x5e686edb
+0,     211968,     211968,     1152,     2304, 0xe6f97a38
+0,     213120,     213120,     1152,     2304, 0x440c829c
+0,     214272,     214272,     1152,     2304, 0x96b57eab
+0,     215424,     215424,     1152,     2304, 0x96f466fc
+0,     216576,     216576,     1152,     2304, 0x49277cae
+0,     217728,     217728,     1152,     2304, 0xee5b7cf9
+0,     218880,     218880,     1152,     2304, 0x9fd483b5
+0,     220032,     220032,     1152,     2304, 0x99bd90ac
+0,     221184,     221184,     1152,     2304, 0xe03a73f7
+0,     222336,     222336,     1152,     2304, 0xe1737408
+0,     223488,     223488,     1152,     2304, 0xc14578b1
+0,     224640,     224640,     1152,     2304, 0x34b18638
+0,     225792,     225792,     1152,     2304, 0xb1707659
+0,     226944,     226944,     1152,     2304, 0x56a45cd1
+0,     228096,     228096,     1152,     2304, 0x6f608d48
+0,     229248,     229248,     1152,     2304, 0xd044886f
+0,     230400,     230400,     1152,     2304, 0x4a827bf0
+0,     231552,     231552,     1152,     2304, 0x58298536
+0,     232704,     232704,     1152,     2304, 0x06147843
+0,     233856,     233856,     1152,     2304, 0x520d6c4a
+0,     235008,     235008,     1152,     2304, 0xfb3089eb
+0,     236160,     236160,     1152,     2304, 0x762b788f
+0,     237312,     237312,     1152,     2304, 0x0a888eeb
+0,     238464,     238464,     1152,     2304, 0xdf617fbc
+0,     239616,     239616,     1152,     2304, 0xd18474f4
+0,     240768,     240768,     1152,     2304, 0x77e170c9
+0,     241920,     241920,     1152,     2304, 0xed557d69
+0,     243072,     243072,     1152,     2304, 0xc2397385
+0,     244224,     244224,     1152,     2304, 0xcee57f16
+0,     245376,     245376,     1152,     2304, 0x6a197fff
+0,     246528,     246528,     1152,     2304, 0xb17c8164
+0,     247680,     247680,     1152,     2304, 0xb8707e78
+0,     248832,     248832,     1152,     2304, 0x2ba77f8e
+0,     249984,     249984,     1152,     2304, 0x3dbd753b
+0,     251136,     251136,     1152,     2304, 0xf4948145
+0,     252288,     252288,     1152,     2304, 0x3ab77110
+0,     253440,     253440,     1152,     2304, 0x5c656a71
+0,     254592,     254592,     1152,     2304, 0xd33388d2
+0,     255744,     255744,     1152,     2304, 0x23de7075
+0,     256896,     256896,     1152,     2304, 0x51d28a8c
+0,     258048,     258048,     1152,     2304, 0x6c6e718e
+0,     259200,     259200,     1152,     2304, 0x67c77a36
+0,     260352,     260352,     1152,     2304, 0x79178f8c
+0,     261504,     261504,     1152,     2304, 0xbe817c71
+0,     262656,     262656,     1152,     2304, 0x103a79ec
+0,     263808,     263808,     1152,     2304, 0x0bd07b50
+0,     264960,     264960,     1152,     2304, 0xa6278205
+0,     266112,     266112,     1152,     2304, 0xbb3d72cb
+0,     267264,     267264,     1152,     2304, 0x47dc71a1
+0,     268416,     268416,     1152,     2304, 0x3dd876f6
+0,     269568,     269568,     1152,     2304, 0x6dd275ce
+0,     270720,     270720,     1152,     2304, 0xeb12882a
+0,     271872,     271872,     1152,     2304, 0x99ac68eb
+0,     273024,     273024,     1152,     2304, 0xb86c7fa4
+0,     274176,     274176,     1152,     2304, 0x6315804a
+0,     275328,     275328,     1152,     2304, 0x034e8782
+0,     276480,     276480,     1152,     2304, 0x9605629e
+0,     277632,     277632,     1152,     2304, 0xdb736f68
+0,     278784,     278784,     1152,     2304, 0xe6c97fe3
+0,     279936,     279936,     1152,     2304, 0x7a9980ab
+0,     281088,     281088,     1152,     2304, 0xb0906ee3
+0,     282240,     282240,     1152,     2304, 0x9ea58a4d
+0,     283392,     283392,     1152,     2304, 0x1f6283b4
+0,     284544,     284544,     1152,     2304, 0x9be27557
+0,     285696,     285696,     1152,     2304, 0x3fec80bd
+0,     286848,     286848,     1152,     2304, 0xdf477b16
+0,     288000,     288000,     1152,     2304, 0x3708865f
+0,     289152,     289152,     1152,     2304, 0xd0297ae8
+0,     290304,     290304,     1152,     2304, 0x0ebd786e
+0,     291456,     291456,     1152,     2304, 0x52b77ed1
+0,     292608,     292608,     1152,     2304, 0x13a77357
+0,     293760,     293760,     1152,     2304, 0xf3ac8040
+0,     294912,     294912,     1152,     2304, 0x72517685
+0,     296064,     296064,     1152,     2304, 0x9f1f7c5e
+0,     297216,     297216,     1152,     2304, 0x14d368bb
+0,     298368,     298368,     1152,     2304, 0xc52e6d62
+0,     299520,     299520,     1152,     2304, 0x1ade783c
+0,     300672,     300672,     1152,     2304, 0x34387d7f
+0,     301824,     301824,     1152,     2304, 0x48957a90
+0,     302976,     302976,     1152,     2304, 0xf1a57db9
+0,     304128,     304128,     1152,     2304, 0x7d22810a
+0,     305280,     305280,     1152,     2304, 0x2e187abb
+0,     306432,     306432,     1152,     2304, 0x0d6b85f9
+0,     307584,     307584,     1152,     2304, 0xc2a77428
+0,     308736,     308736,     1152,     2304, 0x173a7717
+0,     309888,     309888,     1152,     2304, 0x53bf986c
+0,     311040,     311040,     1152,     2304, 0xa9c082b1
+0,     312192,     312192,     1152,     2304, 0x9d9b6fd6
+0,     313344,     313344,     1152,     2304, 0xc4898426
+0,     314496,     314496,     1152,     2304, 0x60236ff7
+0,     315648,     315648,     1152,     2304, 0x7e7a7a9e
+0,     316800,     316800,     1152,     2304, 0x66a9844e
+0,     317952,     317952,     1152,     2304, 0x45188372
+0,     319104,     319104,     1152,     2304, 0x068f6e23
+0,     320256,     320256,     1152,     2304, 0x853083d2
+0,     321408,     321408,     1152,     2304, 0x79ad8782
+0,     322560,     322560,     1152,     2304, 0x210098c5
+0,     323712,     323712,     1152,     2304, 0xd1a77d01
+0,     324864,     324864,     1152,     2304, 0xfc8389f6
+0,     326016,     326016,     1152,     2304, 0xf59f88bd
+0,     327168,     327168,     1152,     2304, 0x6fa97843
+0,     328320,     328320,     1152,     2304, 0x0a62893a
+0,     329472,     329472,     1152,     2304, 0x0c07763c
+0,     330624,     330624,     1152,     2304, 0x9a817309
+0,     331776,     331776,     1152,     2304, 0xbe927c16
+0,     332928,     332928,     1152,     2304, 0x7e1e7541
+0,     334080,     334080,     1152,     2304, 0x9aec738d
+0,     335232,     335232,     1152,     2304, 0x5a706ef6
+0,     336384,     336384,     1152,     2304, 0x2be7862c
+0,     337536,     337536,     1152,     2304, 0xc6266696
+0,     338688,     338688,     1152,     2304, 0x02107e20
+0,     339840,     339840,     1152,     2304, 0x3fe67b09
+0,     340992,     340992,     1152,     2304, 0x3fd38b14
+0,     342144,     342144,     1152,     2304, 0xd23d7eeb
+0,     343296,     343296,     1152,     2304, 0x52818719
+0,     344448,     344448,     1152,     2304, 0x78cd7ac8
+0,     345600,     345600,     1152,     2304, 0x82676a95
+0,     346752,     346752,     1152,     2304, 0xa73b8b5f
+0,     347904,     347904,     1152,     2304, 0x51008ea9
+0,     349056,     349056,     1152,     2304, 0xaf9e784c
+0,     350208,     350208,     1152,     2304, 0xfaf56ca9
+0,     351360,     351360,     1152,     2304, 0xd9d67582
+0,     352512,     352512,     1152,     2304, 0x3a9c77b2
+0,     353664,     353664,     1152,     2304, 0xe4557e60
+0,     354816,     354816,     1152,     2304, 0x1df079a5
+0,     355968,     355968,     1152,     2304, 0xd9377543
+0,     357120,     357120,     1152,     2304, 0xdf2e6d2e
+0,     358272,     358272,     1152,     2304, 0xfd8983c7
+0,     359424,     359424,     1152,     2304, 0x050c7d17
+0,     360576,     360576,     1152,     2304, 0x62907ce9
+0,     361728,     361728,     1152,     2304, 0x324395a4
+0,     362880,     362880,     1152,     2304, 0xb0396e5b
+0,     364032,     364032,     1152,     2304, 0xb0f48243
+0,     365184,     365184,     1152,     2304, 0xf2698178
+0,     366336,     366336,     1152,     2304, 0xa8b478af
+0,     367488,     367488,     1152,     2304, 0x7407713d
+0,     368640,     368640,     1152,     2304, 0xaf3a780f
+0,     369792,     369792,     1152,     2304, 0x29d37ae3
+0,     370944,     370944,     1152,     2304, 0x63ed8495
+0,     372096,     372096,     1152,     2304, 0xd37d82d5
+0,     373248,     373248,     1152,     2304, 0x70518328
+0,     374400,     374400,     1152,     2304, 0x35b396c1
+0,     375552,     375552,     1152,     2304, 0xef88749c
+0,     376704,     376704,     1152,     2304, 0x675382a0
+0,     377856,     377856,     1152,     2304, 0x29447c5b
+0,     379008,     379008,     1152,     2304, 0x8af97319
+0,     380160,     380160,     1152,     2304, 0xa47d7224
+0,     381312,     381312,     1152,     2304, 0xa46d6d2c
+0,     382464,     382464,     1152,     2304, 0x46337596
+0,     383616,     383616,     1152,     2304, 0x01417512
+0,     384768,     384768,     1152,     2304, 0x18b982c3
+0,     385920,     385920,     1152,     2304, 0x39056a8e
+0,     387072,     387072,     1152,     2304, 0xb6b07bfc
+0,     388224,     388224,     1152,     2304, 0xe2b58b2a
+0,     389376,     389376,     1152,     2304, 0xc5687366
+0,     390528,     390528,     1152,     2304, 0xf66d75f3
+0,     391680,     391680,     1152,     2304, 0x29ab764e
+0,     392832,     392832,     1152,     2304, 0x682980c1
+0,     393984,     393984,     1152,     2304, 0x6ee1906c
+0,     395136,     395136,     1152,     2304, 0xedba82ac
+0,     396288,     396288,     1152,     2304, 0x335f8204
+0,     397440,     397440,     1152,     2304, 0x002079b1
+0,     398592,     398592,     1152,     2304, 0x35986caf
+0,     399744,     399744,     1152,     2304, 0x50a87a74
+0,     400896,     400896,     1152,     2304, 0x20587f4d
+0,     402048,     402048,     1152,     2304, 0xe9d47f97
+0,     403200,     403200,     1152,     2304, 0x08fc74ce
+0,     404352,     404352,     1152,     2304, 0x39f88373
+0,     405504,     405504,     1152,     2304, 0x376e7a1f
+0,     406656,     406656,     1152,     2304, 0x1ad17600
+0,     407808,     407808,     1152,     2304, 0xfb358cab
+0,     408960,     408960,     1152,     2304, 0x3c2072b7
+0,     410112,     410112,     1152,     2304, 0xbcc962ff
+0,     411264,     411264,     1152,     2304, 0xa4b48477
+0,     412416,     412416,     1152,     2304, 0x9d1f78d6
+0,     413568,     413568,     1152,     2304, 0x0eb9773d
+0,     414720,     414720,     1152,     2304, 0xab9b8ec6
+0,     415872,     415872,     1152,     2304, 0x54aa78ac
+0,     417024,     417024,     1152,     2304, 0xccf66d69
+0,     418176,     418176,     1152,     2304, 0xe0667ff3
+0,     419328,     419328,     1152,     2304, 0xbf337e47
+0,     420480,     420480,     1152,     2304, 0xfa3b8386
+0,     421632,     421632,     1152,     2304, 0xc13e8062
+0,     422784,     422784,     1152,     2304, 0xa3957bda
+0,     423936,     423936,     1152,     2304, 0x807b777f
+0,     425088,     425088,     1152,     2304, 0x349874ad
+0,     426240,     426240,     1152,     2304, 0x924486c5
+0,     427392,     427392,     1152,     2304, 0x32c76310
+0,     428544,     428544,     1152,     2304, 0x572e7a6a
+0,     429696,     429696,     1152,     2304, 0x12987eae
+0,     430848,     430848,     1152,     2304, 0xb79a7b9e
+0,     432000,     432000,     1152,     2304, 0xc77f60a0
+0,     433152,     433152,     1152,     2304, 0x997e91eb
+0,     434304,     434304,     1152,     2304, 0xcfe17515
+0,     435456,     435456,     1152,     2304, 0x81c67c01
+0,     436608,     436608,     1152,     2304, 0xd83c7041
+0,     437760,     437760,     1152,     2304, 0x8f0579c0
+0,     438912,     438912,     1152,     2304, 0x685e7dce
+0,     440064,     440064,     1152,     2304, 0xac3e7e49
+0,     441216,     441216,     1152,     2304, 0xc6bb7265
+0,     442368,     442368,     1152,     2304, 0xede17e23
+0,     443520,     443520,     1152,     2304, 0x7e127c9a
+0,     444672,     444672,     1152,     2304, 0xdc727ff1
+0,     445824,     445824,     1152,     2304, 0x0bba6ba9
+0,     446976,     446976,     1152,     2304, 0x970687ec
+0,     448128,     448128,     1152,     2304, 0x738469f2
+0,     449280,     449280,     1152,     2304, 0x7b7c943d
+0,     450432,     450432,     1152,     2304, 0x2ee4796d
+0,     451584,     451584,     1152,     2304, 0xebfb7423
+0,     452736,     452736,     1152,     2304, 0x84ba82a3
+0,     453888,     453888,     1152,     2304, 0xbd417240
+0,     455040,     455040,     1152,     2304, 0x52dc8b7a
+0,     456192,     456192,     1152,     2304, 0xab707213
+0,     457344,     457344,     1152,     2304, 0x76da8ba9
+0,     458496,     458496,     1152,     2304, 0x9bed6f07
+0,     459648,     459648,     1152,     2304, 0x5c727358
+0,     460800,     460800,     1152,     2304, 0xd09c7f4e
+0,     461952,     461952,     1152,     2304, 0xf42887c8
+0,     463104,     463104,     1152,     2304, 0xb8067cd0
+0,     464256,     464256,     1152,     2304, 0x4fed74bb
+0,     465408,     465408,     1152,     2304, 0x41bb650a
+0,     466560,     466560,     1152,     2304, 0xf08e87da
+0,     467712,     467712,     1152,     2304, 0x324d72cd
+0,     468864,     468864,     1152,     2304, 0x4db57b28
+0,     470016,     470016,     1152,     2304, 0x01d47145
+0,     471168,     471168,     1152,     2304, 0xcae06f33
+0,     472320,     472320,     1152,     2304, 0x428d7e4f
+0,     473472,     473472,     1152,     2304, 0x621c89dd
+0,     474624,     474624,     1152,     2304, 0x70426d1d
+0,     475776,     475776,     1152,     2304, 0xa47987ee
+0,     476928,     476928,     1152,     2304, 0xb0b46ac6
+0,     478080,     478080,     1152,     2304, 0xd2b2806e
+0,     479232,     479232,     1152,     2304, 0xcf577c1b
+0,     480384,     480384,     1152,     2304, 0xa7347d48
+0,     481536,     481536,     1152,     2304, 0x4c2d8325
+0,     482688,     482688,     1152,     2304, 0x57297122
+0,     483840,     483840,     1152,     2304, 0x6891769a
+0,     484992,     484992,     1152,     2304, 0x2e5c7172
+0,     486144,     486144,     1152,     2304, 0x36d97997
+0,     487296,     487296,     1152,     2304, 0xd511904f
+0,     488448,     488448,     1152,     2304, 0x2ad78293
+0,     489600,     489600,     1152,     2304, 0x7bb46e0e
+0,     490752,     490752,     1152,     2304, 0x199d7795
+0,     491904,     491904,     1152,     2304, 0x42167793
+0,     493056,     493056,     1152,     2304, 0x13726c20
+0,     494208,     494208,     1152,     2304, 0x04fa874a
+0,     495360,     495360,     1152,     2304, 0x41016f66
+0,     496512,     496512,     1152,     2304, 0x0d8880e3
+0,     497664,     497664,     1152,     2304, 0x107d6fd2
+0,     498816,     498816,     1152,     2304, 0x145b7777
+0,     499968,     499968,     1152,     2304, 0xba228f96
+0,     501120,     501120,     1152,     2304, 0x4f97707e
+0,     502272,     502272,     1152,     2304, 0xa7b86c74
+0,     503424,     503424,     1152,     2304, 0xce588037
+0,     504576,     504576,     1152,     2304, 0xdf0577f0
+0,     505728,     505728,     1152,     2304, 0xcde37685
+0,     506880,     506880,     1152,     2304, 0x2c7c5d92
+0,     508032,     508032,     1152,     2304, 0xe3937d6e
+0,     509184,     509184,     1152,     2304, 0xee5f7842
+0,     510336,     510336,     1152,     2304, 0x67dd66bd
+0,     511488,     511488,     1152,     2304, 0xbafc65ed
+0,     512640,     512640,     1152,     2304, 0x579a8063
+0,     513792,     513792,     1152,     2304, 0xa06484ff
+0,     514944,     514944,     1152,     2304, 0x93318c07
+0,     516096,     516096,     1152,     2304, 0x54067277
+0,     517248,     517248,     1152,     2304, 0x02d785b4
+0,     518400,     518400,     1152,     2304, 0x999a7b1c
+0,     519552,     519552,     1152,     2304, 0xcf67856e
+0,     520704,     520704,     1152,     2304, 0x55d683ed
+0,     521856,     521856,     1152,     2304, 0x502c7cbf
+0,     523008,     523008,     1152,     2304, 0x05177a4c
+0,     524160,     524160,     1152,     2304, 0x272a75e0
+0,     525312,     525312,     1152,     2304, 0x5659771e
+0,     526464,     526464,     1152,     2304, 0xc3267c2f
+0,     527616,     527616,     1152,     2304, 0x58b67b26
+0,     528768,     528768,     1152,     2304, 0x705c7d96
+0,     529920,     529920,     1152,     2304, 0xc8db8461
+0,     531072,     531072,     1152,     2304, 0xfae1717a
+0,     532224,     532224,     1152,     2304, 0xb44b7707
+0,     533376,     533376,     1152,     2304, 0x57fb7a91
+0,     534528,     534528,     1152,     2304, 0xe76c8082
+0,     535680,     535680,     1152,     2304, 0xaf1e8256
+0,     536832,     536832,     1152,     2304, 0xc4ca7f89
+0,     537984,     537984,     1152,     2304, 0x6cd681ba
+0,     539136,     539136,     1152,     2304, 0xc3e76c2b
+0,     540288,     540288,     1152,     2304, 0x982b8bc5
+0,     541440,     541440,     1152,     2304, 0x21f975c0
+0,     542592,     542592,     1152,     2304, 0x5ce7854a
+0,     543744,     543744,     1152,     2304, 0x67916923
+0,     544896,     544896,     1152,     2304, 0x1d107023
+0,     546048,     546048,     1152,     2304, 0xd0667153
+0,     547200,     547200,     1152,     2304, 0xdde57ca9
+0,     548352,     548352,     1152,     2304, 0xec10712e
+0,     549504,     549504,     1152,     2304, 0x67a278be
+0,     550656,     550656,     1152,     2304, 0x427079e3
+0,     551808,     551808,     1152,     2304, 0xe44c81e5
+0,     552960,     552960,     1152,     2304, 0xa4d78158
+0,     554112,     554112,     1152,     2304, 0x07308848
+0,     555264,     555264,     1152,     2304, 0x797372b4
+0,     556416,     556416,     1152,     2304, 0x02f676c9
+0,     557568,     557568,     1152,     2304, 0x0eb46723
+0,     558720,     558720,     1152,     2304, 0xb9d57aad
+0,     559872,     559872,     1152,     2304, 0x05047d67
+0,     561024,     561024,     1152,     2304, 0xd80c7d04
+0,     562176,     562176,     1152,     2304, 0xbd5585de
+0,     563328,     563328,     1152,     2304, 0xb2cd70b5
+0,     564480,     564480,     1152,     2304, 0x5c2b706b
+0,     565632,     565632,     1152,     2304, 0xc75a7828
+0,     566784,     566784,     1152,     2304, 0x59e6833c
+0,     567936,     567936,     1152,     2304, 0x8a808003
+0,     569088,     569088,     1152,     2304, 0x0f2674aa
+0,     570240,     570240,     1152,     2304, 0xfa1a7bfe
+0,     571392,     571392,     1152,     2304, 0x9c88762b
+0,     572544,     572544,     1152,     2304, 0x59f778de
+0,     573696,     573696,     1152,     2304, 0xf5997011
+0,     574848,     574848,     1152,     2304, 0xc90573cf
+0,     576000,     576000,     1152,     2304, 0x2d3e83a8
+0,     577152,     577152,     1152,     2304, 0x233f6638
+0,     578304,     578304,     1152,     2304, 0xab636ade
+0,     579456,     579456,     1152,     2304, 0x2c097965
+0,     580608,     580608,     1152,     2304, 0x95147620
+0,     581760,     581760,     1152,     2304, 0xe89e76fe
+0,     582912,     582912,     1152,     2304, 0xe9668cc8
+0,     584064,     584064,     1152,     2304, 0x69677209
+0,     585216,     585216,     1152,     2304, 0x39097600
+0,     586368,     586368,     1152,     2304, 0x3bf97b15
+0,     587520,     587520,     1152,     2304, 0x492c7ee8
+0,     588672,     588672,     1152,     2304, 0xc2147c92
+0,     589824,     589824,     1152,     2304, 0xcb7b8b31
+0,     590976,     590976,     1152,     2304, 0x49707f80
+0,     592128,     592128,     1152,     2304, 0xe4067d9d
+0,     593280,     593280,     1152,     2304, 0x416e81ce
+0,     594432,     594432,     1152,     2304, 0x4ee57f03
+0,     595584,     595584,     1152,     2304, 0x3dbd7d5d
+0,     596736,     596736,     1152,     2304, 0x2a107c8a
+0,     597888,     597888,     1152,     2304, 0x02568927
+0,     599040,     599040,     1152,     2304, 0xf6f370e9
+0,     600192,     600192,     1152,     2304, 0x687c7c34
+0,     601344,     601344,     1152,     2304, 0xbadb74e7
+0,     602496,     602496,     1152,     2304, 0x11067d6d
+0,     603648,     603648,     1152,     2304, 0x1d6d906b
+0,     604800,     604800,     1152,     2304, 0xead26aed
+0,     605952,     605952,     1152,     2304, 0x73988992
+0,     607104,     607104,     1152,     2304, 0x6b6d816a
+0,     608256,     608256,     1152,     2304, 0xcd6a6fbf
+0,     609408,     609408,     1152,     2304, 0xbff26ef1
+0,     610560,     610560,     1152,     2304, 0xe09b82f2
+0,     611712,     611712,     1152,     2304, 0xad536feb
+0,     612864,     612864,     1152,     2304, 0x31777d5a
+0,     614016,     614016,     1152,     2304, 0xff6b80e9
+0,     615168,     615168,     1152,     2304, 0x27b86e9e
+0,     616320,     616320,     1152,     2304, 0x4b307e40
+0,     617472,     617472,     1152,     2304, 0x113577af
+0,     618624,     618624,     1152,     2304, 0xcc257c8b
+0,     619776,     619776,     1152,     2304, 0x984280bc
+0,     620928,     620928,     1152,     2304, 0x25039dfe
+0,     622080,     622080,     1152,     2304, 0x807d6f7d
+0,     623232,     623232,     1152,     2304, 0x3e807d96
+0,     624384,     624384,     1152,     2304, 0x553f992e
+0,     625536,     625536,     1152,     2304, 0x117783d2
+0,     626688,     626688,     1152,     2304, 0x0d986883
+0,     627840,     627840,     1152,     2304, 0x7c797ec2
+0,     628992,     628992,     1152,     2304, 0x5a317b3c
+0,     630144,     630144,     1152,     2304, 0x44db77de
+0,     631296,     631296,     1152,     2304, 0x22027e55
+0,     632448,     632448,     1152,     2304, 0x8c9a841f
+0,     633600,     633600,     1152,     2304, 0xf6f27c2f
+0,     634752,     634752,     1152,     2304, 0x2be471fb
+0,     635904,     635904,     1152,     2304, 0xe35a7650
+0,     637056,     637056,     1152,     2304, 0x9c0a9044
+0,     638208,     638208,     1152,     2304, 0x25787f75
+0,     639360,     639360,     1152,     2304, 0xd2fb944b
+0,     640512,     640512,     1152,     2304, 0x1de48222
+0,     641664,     641664,     1152,     2304, 0xc6628bf7
+0,     642816,     642816,     1152,     2304, 0x806983db
+0,     643968,     643968,     1152,     2304, 0x071c7a86
+0,     645120,     645120,     1152,     2304, 0xda718335
+0,     646272,     646272,     1152,     2304, 0xc6b18f91
+0,     647424,     647424,     1152,     2304, 0xb00970e9
+0,     648576,     648576,     1152,     2304, 0x4055828b
+0,     649728,     649728,     1152,     2304, 0x812471c9
+0,     650880,     650880,     1152,     2304, 0x68cf806b
+0,     652032,     652032,     1152,     2304, 0xa8a87d7b
+0,     653184,     653184,     1152,     2304, 0xcd387f97
+0,     654336,     654336,     1152,     2304, 0xeddd7c43
+0,     655488,     655488,     1152,     2304, 0xb78a88a6
+0,     656640,     656640,     1152,     2304, 0x01ef767b
+0,     657792,     657792,     1152,     2304, 0xf5c776bd
+0,     658944,     658944,     1152,     2304, 0xd96c7ebb
+0,     660096,     660096,     1152,     2304, 0xd3f16f9b
+0,     661248,     661248,     1152,     2304, 0x165c8208
+0,     662400,     662400,     1152,     2304, 0x10947227
+0,     663552,     663552,     1152,     2304, 0x382c82d7
+0,     664704,     664704,     1152,     2304, 0x07c87b8d
+0,     665856,     665856,     1152,     2304, 0x1fbb7657
+0,     667008,     667008,     1152,     2304, 0xd6566e2f
+0,     668160,     668160,     1152,     2304, 0x1b8c7d5b
+0,     669312,     669312,     1152,     2304, 0xf3886fee
+0,     670464,     670464,     1152,     2304, 0xdece8d75
+0,     671616,     671616,     1152,     2304, 0x72237c65
+0,     672768,     672768,     1152,     2304, 0xbabc6e66
+0,     673920,     673920,     1152,     2304, 0xe8f08b9f
+0,     675072,     675072,     1152,     2304, 0x49d27348
+0,     676224,     676224,     1152,     2304, 0xa61286f8
+0,     677376,     677376,     1152,     2304, 0xa2b980cd
+0,     678528,     678528,     1152,     2304, 0x7775838e
+0,     679680,     679680,     1152,     2304, 0x15b57077
+0,     680832,     680832,     1152,     2304, 0x6a0a7522
+0,     681984,     681984,     1152,     2304, 0xdd8d8106
+0,     683136,     683136,     1152,     2304, 0x32fb82dc
+0,     684288,     684288,     1152,     2304, 0x3b258143
+0,     685440,     685440,     1152,     2304, 0xfd0a9537
+0,     686592,     686592,     1152,     2304, 0x8467797b
+0,     687744,     687744,     1152,     2304, 0xac4f7394
+0,     688896,     688896,     1152,     2304, 0xcb226a25
+0,     690048,     690048,     1152,     2304, 0xd39e813a
+0,     691200,     691200,     1152,     2304, 0xf2067c35
+0,     692352,     692352,     1152,     2304, 0x46a77bff
+0,     693504,     693504,     1152,     2304, 0xb6627b26
+0,     694656,     694656,     1152,     2304, 0xd6e28409
+0,     695808,     695808,     1152,     2304, 0xefc0832b
+0,     696960,     696960,     1152,     2304, 0xa7b18479
+0,     698112,     698112,     1152,     2304, 0xdf618ff7
+0,     699264,     699264,     1152,     2304, 0xfe5b77e0
+0,     700416,     700416,     1152,     2304, 0xb30e7742
+0,     701568,     701568,     1152,     2304, 0x451d69e3
+0,     702720,     702720,     1152,     2304, 0x3d178531
+0,     703872,     703872,     1152,     2304, 0x177c5f79
diff --git a/tests/ref/fate/hls-segment-single b/tests/ref/fate/hls-segment-single
new file mode 100644
index 0000000..ee3c7b2
--- /dev/null
+++ b/tests/ref/fate/hls-segment-single
@@ -0,0 +1,772 @@
+#tb 0: 1/44100
+#media_type 0: audio
+#codec_id 0: pcm_s16le
+#sample_rate 0: 44100
+#channel_layout 0: 4
+#channel_layout_name 0: mono
+0,          0,          0,     1152,     2304, 0x907cb7fa
+0,       1152,       1152,     1152,     2304, 0xb8dc7525
+0,       2304,       2304,     1152,     2304, 0x3e7d6905
+0,       3456,       3456,     1152,     2304, 0xef47877b
+0,       4608,       4608,     1152,     2304, 0xfe916b7e
+0,       5760,       5760,     1152,     2304, 0xe3d08cde
+0,       6912,       6912,     1152,     2304, 0xff7f86cf
+0,       8064,       8064,     1152,     2304, 0x843e6f95
+0,       9216,       9216,     1152,     2304, 0x81577c26
+0,      10368,      10368,     1152,     2304, 0x04a085d5
+0,      11520,      11520,     1152,     2304, 0x1c5a76f5
+0,      12672,      12672,     1152,     2304, 0x4ee78623
+0,      13824,      13824,     1152,     2304, 0x8ec861dc
+0,      14976,      14976,     1152,     2304, 0x0ca179d8
+0,      16128,      16128,     1152,     2304, 0xc6da750f
+0,      17280,      17280,     1152,     2304, 0xf6bf79b5
+0,      18432,      18432,     1152,     2304, 0x97b88a43
+0,      19584,      19584,     1152,     2304, 0xf13c7b9c
+0,      20736,      20736,     1152,     2304, 0xdfba83af
+0,      21888,      21888,     1152,     2304, 0xc9467d4b
+0,      23040,      23040,     1152,     2304, 0xbbb58e2b
+0,      24192,      24192,     1152,     2304, 0x3a1078ea
+0,      25344,      25344,     1152,     2304, 0xe9587a5c
+0,      26496,      26496,     1152,     2304, 0xef5a8039
+0,      27648,      27648,     1152,     2304, 0x9d5f782f
+0,      28800,      28800,     1152,     2304, 0x1a548291
+0,      29952,      29952,     1152,     2304, 0x07517701
+0,      31104,      31104,     1152,     2304, 0x78127d6e
+0,      32256,      32256,     1152,     2304, 0x62e2788a
+0,      33408,      33408,     1152,     2304, 0x29397ad9
+0,      34560,      34560,     1152,     2304, 0x45da82d6
+0,      35712,      35712,     1152,     2304, 0x8ed66e51
+0,      36864,      36864,     1152,     2304, 0x660775cd
+0,      38016,      38016,     1152,     2304, 0x802c767a
+0,      39168,      39168,     1152,     2304, 0xcc055840
+0,      40320,      40320,     1152,     2304, 0x701b7eaf
+0,      41472,      41472,     1152,     2304, 0x8290749f
+0,      42624,      42624,     1152,     2304, 0x2c7b7d30
+0,      43776,      43776,     1152,     2304, 0xe4f17743
+0,      44928,      44928,     1152,     2304, 0x0e747d6e
+0,      46080,      46080,     1152,     2304, 0xbe7775a0
+0,      47232,      47232,     1152,     2304, 0xcf797673
+0,      48384,      48384,     1152,     2304, 0x29cb7800
+0,      49536,      49536,     1152,     2304, 0xfc947890
+0,      50688,      50688,     1152,     2304, 0x62757fc6
+0,      51840,      51840,     1152,     2304, 0x098876d0
+0,      52992,      52992,     1152,     2304, 0xa9567ee2
+0,      54144,      54144,     1152,     2304, 0xe3bb9173
+0,      55296,      55296,     1152,     2304, 0xcc2d6dee
+0,      56448,      56448,     1152,     2304, 0xe94591ab
+0,      57600,      57600,     1152,     2304, 0x5c7588de
+0,      58752,      58752,     1152,     2304, 0xfd83643c
+0,      59904,      59904,     1152,     2304, 0x528177f1
+0,      61056,      61056,     1152,     2304, 0x65d08474
+0,      62208,      62208,     1152,     2304, 0x738d765b
+0,      63360,      63360,     1152,     2304, 0xdd3d810e
+0,      64512,      64512,     1152,     2304, 0xef4f90d3
+0,      65664,      65664,     1152,     2304, 0x61e28d43
+0,      66816,      66816,     1152,     2304, 0x9a11796b
+0,      67968,      67968,     1152,     2304, 0x96c97dcd
+0,      69120,      69120,     1152,     2304, 0xa8fe8621
+0,      70272,      70272,     1152,     2304, 0x499b7d38
+0,      71424,      71424,     1152,     2304, 0xfcb078a9
+0,      72576,      72576,     1152,     2304, 0x40d78651
+0,      73728,      73728,     1152,     2304, 0xa4af7234
+0,      74880,      74880,     1152,     2304, 0x6831870a
+0,      76032,      76032,     1152,     2304, 0x030e7b9d
+0,      77184,      77184,     1152,     2304, 0x445a75b6
+0,      78336,      78336,     1152,     2304, 0x09857389
+0,      79488,      79488,     1152,     2304, 0x0d018866
+0,      80640,      80640,     1152,     2304, 0x2afe810a
+0,      81792,      81792,     1152,     2304, 0x0bcf7c43
+0,      82944,      82944,     1152,     2304, 0x13737c12
+0,      84096,      84096,     1152,     2304, 0x716c7bba
+0,      85248,      85248,     1152,     2304, 0xb801823b
+0,      86400,      86400,     1152,     2304, 0x0fd573ee
+0,      87552,      87552,     1152,     2304, 0xe1ab879c
+0,      88704,      88704,     1152,     2304, 0x49e6764f
+0,      89856,      89856,     1152,     2304, 0xd5f26ddc
+0,      91008,      91008,     1152,     2304, 0x076775ff
+0,      92160,      92160,     1152,     2304, 0xfbb86fce
+0,      93312,      93312,     1152,     2304, 0x20c56858
+0,      94464,      94464,     1152,     2304, 0x043e6891
+0,      95616,      95616,     1152,     2304, 0x59648729
+0,      96768,      96768,     1152,     2304, 0xd4907a63
+0,      97920,      97920,     1152,     2304, 0xd0208a4c
+0,      99072,      99072,     1152,     2304, 0xce968383
+0,     100224,     100224,     1152,     2304, 0x3cfc7cd1
+0,     101376,     101376,     1152,     2304, 0x628a7bf5
+0,     102528,     102528,     1152,     2304, 0x9cfe8a4f
+0,     103680,     103680,     1152,     2304, 0xdf6f7c6d
+0,     104832,     104832,     1152,     2304, 0x6cf6882a
+0,     105984,     105984,     1152,     2304, 0x099773a3
+0,     107136,     107136,     1152,     2304, 0x4a1c7649
+0,     108288,     108288,     1152,     2304, 0x31ea71cb
+0,     109440,     109440,     1152,     2304, 0xed127ed9
+0,     110592,     110592,     1152,     2304, 0x5b156954
+0,     111744,     111744,     1152,     2304, 0xdd638532
+0,     112896,     112896,     1152,     2304, 0xf1a271f2
+0,     114048,     114048,     1152,     2304, 0x779184d7
+0,     115200,     115200,     1152,     2304, 0x49a88aa8
+0,     116352,     116352,     1152,     2304, 0xa11b7c90
+0,     117504,     117504,     1152,     2304, 0xbf488274
+0,     118656,     118656,     1152,     2304, 0x002f79a8
+0,     119808,     119808,     1152,     2304, 0x0ed97e2f
+0,     120960,     120960,     1152,     2304, 0x7845878f
+0,     122112,     122112,     1152,     2304, 0x46d777dc
+0,     123264,     123264,     1152,     2304, 0x8d0179e3
+0,     124416,     124416,     1152,     2304, 0x38917f9f
+0,     125568,     125568,     1152,     2304, 0x449876e7
+0,     126720,     126720,     1152,     2304, 0x001a8769
+0,     127872,     127872,     1152,     2304, 0x06c1826b
+0,     129024,     129024,     1152,     2304, 0x41b68047
+0,     130176,     130176,     1152,     2304, 0xeb9782c6
+0,     131328,     131328,     1152,     2304, 0x7cd9719c
+0,     132480,     132480,     1152,     2304, 0x3a4a767c
+0,     133632,     133632,     1152,     2304, 0x7f887e81
+0,     134784,     134784,     1152,     2304, 0xf75d714b
+0,     135936,     135936,     1152,     2304, 0x33b57e9f
+0,     137088,     137088,     1152,     2304, 0xc732749e
+0,     138240,     138240,     1152,     2304, 0x386f7e1a
+0,     139392,     139392,     1152,     2304, 0x6b9c767d
+0,     140544,     140544,     1152,     2304, 0x701c83e5
+0,     141696,     141696,     1152,     2304, 0xb92571e1
+0,     142848,     142848,     1152,     2304, 0x833a84bc
+0,     144000,     144000,     1152,     2304, 0x1b6984e0
+0,     145152,     145152,     1152,     2304, 0x1b2474ba
+0,     146304,     146304,     1152,     2304, 0xc22775a6
+0,     147456,     147456,     1152,     2304, 0x3e8f7972
+0,     148608,     148608,     1152,     2304, 0x17a28a65
+0,     149760,     149760,     1152,     2304, 0x9b6178a4
+0,     150912,     150912,     1152,     2304, 0x5d707873
+0,     152064,     152064,     1152,     2304, 0x68e2645a
+0,     153216,     153216,     1152,     2304, 0x1e377d28
+0,     154368,     154368,     1152,     2304, 0x54b384be
+0,     155520,     155520,     1152,     2304, 0x0617808c
+0,     156672,     156672,     1152,     2304, 0xbc2b8a6c
+0,     157824,     157824,     1152,     2304, 0x7ced7180
+0,     158976,     158976,     1152,     2304, 0xf22180ab
+0,     160128,     160128,     1152,     2304, 0xf13682c9
+0,     161280,     161280,     1152,     2304, 0x7eff87fd
+0,     162432,     162432,     1152,     2304, 0x5a0b5cec
+0,     163584,     163584,     1152,     2304, 0x57c18906
+0,     164736,     164736,     1152,     2304, 0xb55a6a16
+0,     165888,     165888,     1152,     2304, 0xf2608371
+0,     167040,     167040,     1152,     2304, 0x36df7576
+0,     168192,     168192,     1152,     2304, 0xdb106fb4
+0,     169344,     169344,     1152,     2304, 0x7e4f85d0
+0,     170496,     170496,     1152,     2304, 0xe3ee78ab
+0,     171648,     171648,     1152,     2304, 0xd36b7dc7
+0,     172800,     172800,     1152,     2304, 0xadab7c5c
+0,     173952,     173952,     1152,     2304, 0x70786f26
+0,     175104,     175104,     1152,     2304, 0xcd5d717e
+0,     176256,     176256,     1152,     2304, 0xc1a96f9a
+0,     177408,     177408,     1152,     2304, 0xad777887
+0,     178560,     178560,     1152,     2304, 0x98277c16
+0,     179712,     179712,     1152,     2304, 0x868882c5
+0,     180864,     180864,     1152,     2304, 0xc48092b9
+0,     182016,     182016,     1152,     2304, 0x230069da
+0,     183168,     183168,     1152,     2304, 0x14147ad6
+0,     184320,     184320,     1152,     2304, 0xc9007172
+0,     185472,     185472,     1152,     2304, 0x85d67bcc
+0,     186624,     186624,     1152,     2304, 0x22418bab
+0,     187776,     187776,     1152,     2304, 0xe53c8b71
+0,     188928,     188928,     1152,     2304, 0x5a1a9053
+0,     190080,     190080,     1152,     2304, 0x9cd179af
+0,     191232,     191232,     1152,     2304, 0xbb3c7d72
+0,     192384,     192384,     1152,     2304, 0x477a8677
+0,     193536,     193536,     1152,     2304, 0xe3337834
+0,     194688,     194688,     1152,     2304, 0x1cb56d77
+0,     195840,     195840,     1152,     2304, 0xe89d6dac
+0,     196992,     196992,     1152,     2304, 0xd468827e
+0,     198144,     198144,     1152,     2304, 0xebc46b87
+0,     199296,     199296,     1152,     2304, 0x5fbb78d2
+0,     200448,     200448,     1152,     2304, 0xa1b483d6
+0,     201600,     201600,     1152,     2304, 0x6fec7cab
+0,     202752,     202752,     1152,     2304, 0xd86d6f6c
+0,     203904,     203904,     1152,     2304, 0x8c2c7d51
+0,     205056,     205056,     1152,     2304, 0xe8377cd7
+0,     206208,     206208,     1152,     2304, 0xb57071b4
+0,     207360,     207360,     1152,     2304, 0xc35c71fd
+0,     208512,     208512,     1152,     2304, 0x789079e9
+0,     209664,     209664,     1152,     2304, 0x413b710e
+0,     210816,     210816,     1152,     2304, 0x82678332
+0,     211968,     211968,     1152,     2304, 0xe1576e75
+0,     213120,     213120,     1152,     2304, 0x7c0b7ad6
+0,     214272,     214272,     1152,     2304, 0xc6b6786d
+0,     215424,     215424,     1152,     2304, 0x736f7b89
+0,     216576,     216576,     1152,     2304, 0x0ded72f1
+0,     217728,     217728,     1152,     2304, 0xcb877a3c
+0,     218880,     218880,     1152,     2304, 0x7c497d40
+0,     220032,     220032,     1152,     2304, 0xaefc798c
+0,     221184,     221184,     1152,     2304, 0x4cce748c
+0,     222336,     222336,     1152,     2304, 0xaa187fbe
+0,     223488,     223488,     1152,     2304, 0x1aa77db9
+0,     224640,     224640,     1152,     2304, 0x9e0074b8
+0,     225792,     225792,     1152,     2304, 0x74ee822b
+0,     226944,     226944,     1152,     2304, 0x975c6ff6
+0,     228096,     228096,     1152,     2304, 0xe1847bb4
+0,     229248,     229248,     1152,     2304, 0xe0828777
+0,     230400,     230400,     1152,     2304, 0xf4027205
+0,     231552,     231552,     1152,     2304, 0x535e7a20
+0,     232704,     232704,     1152,     2304, 0x5bd88404
+0,     233856,     233856,     1152,     2304, 0xf29478b1
+0,     235008,     235008,     1152,     2304, 0x9b7c7d88
+0,     236160,     236160,     1152,     2304, 0xaeb07335
+0,     237312,     237312,     1152,     2304, 0xbef06e08
+0,     238464,     238464,     1152,     2304, 0x795f7b8c
+0,     239616,     239616,     1152,     2304, 0x435a674d
+0,     240768,     240768,     1152,     2304, 0xd8ee7a09
+0,     241920,     241920,     1152,     2304, 0x9059812e
+0,     243072,     243072,     1152,     2304, 0x7481744a
+0,     244224,     244224,     1152,     2304, 0xdff27475
+0,     245376,     245376,     1152,     2304, 0xb17783ab
+0,     246528,     246528,     1152,     2304, 0x42e9706b
+0,     247680,     247680,     1152,     2304, 0x9f0d86b4
+0,     248832,     248832,     1152,     2304, 0x2963955f
+0,     249984,     249984,     1152,     2304, 0x059a6957
+0,     251136,     251136,     1152,     2304, 0x85948206
+0,     252288,     252288,     1152,     2304, 0x185e8400
+0,     253440,     253440,     1152,     2304, 0xe98e70df
+0,     254592,     254592,     1152,     2304, 0x69057b27
+0,     255744,     255744,     1152,     2304, 0x49e26f21
+0,     256896,     256896,     1152,     2304, 0xb0867da5
+0,     258048,     258048,     1152,     2304, 0x785980ff
+0,     259200,     259200,     1152,     2304, 0xf4b774be
+0,     260352,     260352,     1152,     2304, 0x63897e8c
+0,     261504,     261504,     1152,     2304, 0x248b89af
+0,     262656,     262656,     1152,     2304, 0xd3627c4a
+0,     263808,     263808,     1152,     2304, 0x5a4d9349
+0,     264960,     264960,     1152,     2304, 0xe2ce7c4c
+0,     266112,     266112,     1152,     2304, 0x321f6c0b
+0,     267264,     267264,     1152,     2304, 0x51ac74e0
+0,     268416,     268416,     1152,     2304, 0x8efa91ba
+0,     269568,     269568,     1152,     2304, 0x8b4b784c
+0,     270720,     270720,     1152,     2304, 0xe9e4879e
+0,     271872,     271872,     1152,     2304, 0x8dc28081
+0,     273024,     273024,     1152,     2304, 0x44b477b0
+0,     274176,     274176,     1152,     2304, 0xf7b67084
+0,     275328,     275328,     1152,     2304, 0x4b198c17
+0,     276480,     276480,     1152,     2304, 0x9c947194
+0,     277632,     277632,     1152,     2304, 0x6eaa7f15
+0,     278784,     278784,     1152,     2304, 0x119f7c1d
+0,     279936,     279936,     1152,     2304, 0x157b7f43
+0,     281088,     281088,     1152,     2304, 0xcd2e7acc
+0,     282240,     282240,     1152,     2304, 0x97597247
+0,     283392,     283392,     1152,     2304, 0x7ba06acb
+0,     284544,     284544,     1152,     2304, 0x233c7995
+0,     285696,     285696,     1152,     2304, 0x08e28587
+0,     286848,     286848,     1152,     2304, 0x92be84b5
+0,     288000,     288000,     1152,     2304, 0xbb857d43
+0,     289152,     289152,     1152,     2304, 0x168e7c74
+0,     290304,     290304,     1152,     2304, 0xac5465d9
+0,     291456,     291456,     1152,     2304, 0x18f58831
+0,     292608,     292608,     1152,     2304, 0x19b48196
+0,     293760,     293760,     1152,     2304, 0x20297653
+0,     294912,     294912,     1152,     2304, 0x93397a82
+0,     296064,     296064,     1152,     2304, 0x65ea7deb
+0,     297216,     297216,     1152,     2304, 0xd7316e20
+0,     298368,     298368,     1152,     2304, 0x94107f2b
+0,     299520,     299520,     1152,     2304, 0xec3b7dc6
+0,     300672,     300672,     1152,     2304, 0x2d3783aa
+0,     301824,     301824,     1152,     2304, 0x07e47340
+0,     302976,     302976,     1152,     2304, 0xbc117893
+0,     304128,     304128,     1152,     2304, 0x8bd97851
+0,     305280,     305280,     1152,     2304, 0xc27376a9
+0,     306432,     306432,     1152,     2304, 0x30d88c83
+0,     307584,     307584,     1152,     2304, 0x19c2704c
+0,     308736,     308736,     1152,     2304, 0x093b7b6e
+0,     309888,     309888,     1152,     2304, 0x221a7349
+0,     311040,     311040,     1152,     2304, 0xa4fd82cd
+0,     312192,     312192,     1152,     2304, 0x762e6bc9
+0,     313344,     313344,     1152,     2304, 0x270075d4
+0,     314496,     314496,     1152,     2304, 0xa5f27b90
+0,     315648,     315648,     1152,     2304, 0xf72e7edc
+0,     316800,     316800,     1152,     2304, 0x42178486
+0,     317952,     317952,     1152,     2304, 0x5f7978e8
+0,     319104,     319104,     1152,     2304, 0x5d7c6703
+0,     320256,     320256,     1152,     2304, 0x2c4483d5
+0,     321408,     321408,     1152,     2304, 0x31bd951d
+0,     322560,     322560,     1152,     2304, 0x99487af0
+0,     323712,     323712,     1152,     2304, 0x0bd27ee7
+0,     324864,     324864,     1152,     2304, 0xc3e07ac4
+0,     326016,     326016,     1152,     2304, 0x98a16ba7
+0,     327168,     327168,     1152,     2304, 0xd7a5747b
+0,     328320,     328320,     1152,     2304, 0x96fb811c
+0,     329472,     329472,     1152,     2304, 0x7cee8109
+0,     330624,     330624,     1152,     2304, 0x52b18ba2
+0,     331776,     331776,     1152,     2304, 0x33be8861
+0,     332928,     332928,     1152,     2304, 0xf41282a0
+0,     334080,     334080,     1152,     2304, 0xb4268993
+0,     335232,     335232,     1152,     2304, 0x52126a1c
+0,     336384,     336384,     1152,     2304, 0x050b6f7a
+0,     337536,     337536,     1152,     2304, 0x67a26fc3
+0,     338688,     338688,     1152,     2304, 0x966c7cf2
+0,     339840,     339840,     1152,     2304, 0x22097750
+0,     340992,     340992,     1152,     2304, 0xfbb0796c
+0,     342144,     342144,     1152,     2304, 0xbd508964
+0,     343296,     343296,     1152,     2304, 0xc24478d8
+0,     344448,     344448,     1152,     2304, 0x3913769d
+0,     345600,     345600,     1152,     2304, 0x8aab872f
+0,     346752,     346752,     1152,     2304, 0x7cb4822f
+0,     347904,     347904,     1152,     2304, 0xea318144
+0,     349056,     349056,     1152,     2304, 0xaf0f86d2
+0,     350208,     350208,     1152,     2304, 0x24f27598
+0,     351360,     351360,     1152,     2304, 0xd76f6d40
+0,     352512,     352512,     1152,     2304, 0x085071a7
+0,     353664,     353664,     1152,     2304, 0x1d11704c
+0,     354816,     354816,     1152,     2304, 0x21517cbd
+0,     355968,     355968,     1152,     2304, 0xcdca8d32
+0,     357120,     357120,     1152,     2304, 0x71c18433
+0,     358272,     358272,     1152,     2304, 0xd39d7d81
+0,     359424,     359424,     1152,     2304, 0x7a0d7a43
+0,     360576,     360576,     1152,     2304, 0x007c8884
+0,     361728,     361728,     1152,     2304, 0x403282d0
+0,     362880,     362880,     1152,     2304, 0xe3737214
+0,     364032,     364032,     1152,     2304, 0xaf906f47
+0,     365184,     365184,     1152,     2304, 0x54f57b3b
+0,     366336,     366336,     1152,     2304, 0x29be7791
+0,     367488,     367488,     1152,     2304, 0xe3c663d5
+0,     368640,     368640,     1152,     2304, 0xd7258238
+0,     369792,     369792,     1152,     2304, 0x3719820d
+0,     370944,     370944,     1152,     2304, 0xbe04814f
+0,     372096,     372096,     1152,     2304, 0x556c815e
+0,     373248,     373248,     1152,     2304, 0xb2447e10
+0,     374400,     374400,     1152,     2304, 0x7c16867c
+0,     375552,     375552,     1152,     2304, 0x6a7b78ed
+0,     376704,     376704,     1152,     2304, 0x5d307b81
+0,     377856,     377856,     1152,     2304, 0xaab680d3
+0,     379008,     379008,     1152,     2304, 0xb5d37a23
+0,     380160,     380160,     1152,     2304, 0x7f7d6f76
+0,     381312,     381312,     1152,     2304, 0x317a8296
+0,     382464,     382464,     1152,     2304, 0x8a987b3d
+0,     383616,     383616,     1152,     2304, 0x4f317a27
+0,     384768,     384768,     1152,     2304, 0xfc65852f
+0,     385920,     385920,     1152,     2304, 0x40527719
+0,     387072,     387072,     1152,     2304, 0x84988e13
+0,     388224,     388224,     1152,     2304, 0x318b6ddc
+0,     389376,     389376,     1152,     2304, 0x94cf7939
+0,     390528,     390528,     1152,     2304, 0x6f22819d
+0,     391680,     391680,     1152,     2304, 0xa7dd80a9
+0,     392832,     392832,     1152,     2304, 0x1c7968fa
+0,     393984,     393984,     1152,     2304, 0xd9937bae
+0,     395136,     395136,     1152,     2304, 0xf7137cf9
+0,     396288,     396288,     1152,     2304, 0xeadb84b5
+0,     397440,     397440,     1152,     2304, 0x9a2390ac
+0,     398592,     398592,     1152,     2304, 0xdb6a73f6
+0,     399744,     399744,     1152,     2304, 0x69e07507
+0,     400896,     400896,     1152,     2304, 0xbc8478b2
+0,     402048,     402048,     1152,     2304, 0x32cf8638
+0,     403200,     403200,     1152,     2304, 0x2b8d755a
+0,     404352,     404352,     1152,     2304, 0x52e05bd2
+0,     405504,     405504,     1152,     2304, 0x2aed8c49
+0,     406656,     406656,     1152,     2304, 0x587a896e
+0,     407808,     407808,     1152,     2304, 0x6dd87dee
+0,     408960,     408960,     1152,     2304, 0xd2858338
+0,     410112,     410112,     1152,     2304, 0xd90f7842
+0,     411264,     411264,     1152,     2304, 0xd6fb6d4a
+0,     412416,     412416,     1152,     2304, 0x85498aea
+0,     413568,     413568,     1152,     2304, 0x18597790
+0,     414720,     414720,     1152,     2304, 0x3cd78fea
+0,     415872,     415872,     1152,     2304, 0x94377fbc
+0,     417024,     417024,     1152,     2304, 0xf9db73f5
+0,     418176,     418176,     1152,     2304, 0x14fb6fca
+0,     419328,     419328,     1152,     2304, 0xe9d17d69
+0,     420480,     420480,     1152,     2304, 0xdeb57286
+0,     421632,     421632,     1152,     2304, 0xa5d37e17
+0,     422784,     422784,     1152,     2304, 0xcf6882fb
+0,     423936,     423936,     1152,     2304, 0x31758066
+0,     425088,     425088,     1152,     2304, 0x6b4d8175
+0,     426240,     426240,     1152,     2304, 0x2a3d7f8e
+0,     427392,     427392,     1152,     2304, 0xc066743b
+0,     428544,     428544,     1152,     2304, 0xcab88146
+0,     429696,     429696,     1152,     2304, 0x2b4c6e13
+0,     430848,     430848,     1152,     2304, 0x00b36b6f
+0,     432000,     432000,     1152,     2304, 0x664a88d3
+0,     433152,     433152,     1152,     2304, 0x18a66f76
+0,     434304,     434304,     1152,     2304, 0x4f828a8b
+0,     435456,     435456,     1152,     2304, 0x9cc7728e
+0,     436608,     436608,     1152,     2304, 0xbe357936
+0,     437760,     437760,     1152,     2304, 0x19878f8d
+0,     438912,     438912,     1152,     2304, 0x227b7c71
+0,     440064,     440064,     1152,     2304, 0xf7c879ec
+0,     441216,     441216,     1152,     2304, 0x0bca7b50
+0,     442368,     442368,     1152,     2304, 0xe4398304
+0,     443520,     443520,     1152,     2304, 0xf5da75c7
+0,     444672,     444672,     1152,     2304, 0x9f9070a3
+0,     445824,     445824,     1152,     2304, 0x789076f6
+0,     446976,     446976,     1152,     2304, 0x362977cc
+0,     448128,     448128,     1152,     2304, 0x4d0a8928
+0,     449280,     449280,     1152,     2304, 0x1bb767ec
+0,     450432,     450432,     1152,     2304, 0xbe727fa5
+0,     451584,     451584,     1152,     2304, 0x27f38347
+0,     452736,     452736,     1152,     2304, 0x0a3c8783
+0,     453888,     453888,     1152,     2304, 0x8249639c
+0,     455040,     455040,     1152,     2304, 0x3b076f69
+0,     456192,     456192,     1152,     2304, 0xd9597ee3
+0,     457344,     457344,     1152,     2304, 0x026e7fad
+0,     458496,     458496,     1152,     2304, 0xbd7a6de4
+0,     459648,     459648,     1152,     2304, 0x7d718a4d
+0,     460800,     460800,     1152,     2304, 0x1f5e83b4
+0,     461952,     461952,     1152,     2304, 0x597d7755
+0,     463104,     463104,     1152,     2304, 0x3fb080bd
+0,     464256,     464256,     1152,     2304, 0xdcbd7b16
+0,     465408,     465408,     1152,     2304, 0x5c48865f
+0,     466560,     466560,     1152,     2304, 0xcda37ae8
+0,     467712,     467712,     1152,     2304, 0x4810796d
+0,     468864,     468864,     1152,     2304, 0x34317fd0
+0,     470016,     470016,     1152,     2304, 0x5c0e7456
+0,     471168,     471168,     1152,     2304, 0x44d78040
+0,     472320,     472320,     1152,     2304, 0x88587882
+0,     473472,     473472,     1152,     2304, 0x77687d5e
+0,     474624,     474624,     1152,     2304, 0x116d68bb
+0,     475776,     475776,     1152,     2304, 0x3e5b6f60
+0,     476928,     476928,     1152,     2304, 0x64ea783c
+0,     478080,     478080,     1152,     2304, 0x23547f7d
+0,     479232,     479232,     1152,     2304, 0x2eee7892
+0,     480384,     480384,     1152,     2304, 0xfb837cba
+0,     481536,     481536,     1152,     2304, 0x86518209
+0,     482688,     482688,     1152,     2304, 0x672f7bba
+0,     483840,     483840,     1152,     2304, 0x6ab583fb
+0,     484992,     484992,     1152,     2304, 0xc1297428
+0,     486144,     486144,     1152,     2304, 0x164e7717
+0,     487296,     487296,     1152,     2304, 0xb754976d
+0,     488448,     488448,     1152,     2304, 0xb99d81b2
+0,     489600,     489600,     1152,     2304, 0x79046fd6
+0,     490752,     490752,     1152,     2304, 0x9a3f8426
+0,     491904,     491904,     1152,     2304, 0x896371f5
+0,     493056,     493056,     1152,     2304, 0x63d1799f
+0,     494208,     494208,     1152,     2304, 0x4842844e
+0,     495360,     495360,     1152,     2304, 0x850e8372
+0,     496512,     496512,     1152,     2304, 0x85d07022
+0,     497664,     497664,     1152,     2304, 0x9e6683d1
+0,     498816,     498816,     1152,     2304, 0x301b8981
+0,     499968,     499968,     1152,     2304, 0x1f1e98c5
+0,     501120,     501120,     1152,     2304, 0xc8797b03
+0,     502272,     502272,     1152,     2304, 0xf9d189f5
+0,     503424,     503424,     1152,     2304, 0x0e0d88be
+0,     504576,     504576,     1152,     2304, 0x6c1d7843
+0,     505728,     505728,     1152,     2304, 0xd13b8a38
+0,     506880,     506880,     1152,     2304, 0x9b8f773c
+0,     508032,     508032,     1152,     2304, 0x9acd7309
+0,     509184,     509184,     1152,     2304, 0x5e7d7d15
+0,     510336,     510336,     1152,     2304, 0xf09d7640
+0,     511488,     511488,     1152,     2304, 0xaebb718f
+0,     512640,     512640,     1152,     2304, 0x0c8570f4
+0,     513792,     513792,     1152,     2304, 0x3c93862c
+0,     514944,     514944,     1152,     2304, 0xcee46696
+0,     516096,     516096,     1152,     2304, 0x01ba7e20
+0,     517248,     517248,     1152,     2304, 0x7fcb7a09
+0,     518400,     518400,     1152,     2304, 0xddf18c14
+0,     519552,     519552,     1152,     2304, 0xd2e97eeb
+0,     520704,     520704,     1152,     2304, 0x514d8719
+0,     521856,     521856,     1152,     2304, 0xe89279c9
+0,     523008,     523008,     1152,     2304, 0x806d6a95
+0,     524160,     524160,     1152,     2304, 0xbc7a8a60
+0,     525312,     525312,     1152,     2304, 0x302f8fa8
+0,     526464,     526464,     1152,     2304, 0xb136784c
+0,     527616,     527616,     1152,     2304, 0x9b0f6aab
+0,     528768,     528768,     1152,     2304, 0xd8e27582
+0,     529920,     529920,     1152,     2304, 0xdaaf78b1
+0,     531072,     531072,     1152,     2304, 0x65967f5f
+0,     532224,     532224,     1152,     2304, 0x6f917aa4
+0,     533376,     533376,     1152,     2304, 0x7f607444
+0,     534528,     534528,     1152,     2304, 0xfd316f2c
+0,     535680,     535680,     1152,     2304, 0x776e83c7
+0,     536832,     536832,     1152,     2304, 0xb9c17e16
+0,     537984,     537984,     1152,     2304, 0xdf287de8
+0,     539136,     539136,     1152,     2304, 0xf33d96a3
+0,     540288,     540288,     1152,     2304, 0xad216e5b
+0,     541440,     541440,     1152,     2304, 0x4a328342
+0,     542592,     542592,     1152,     2304, 0xcf3f8079
+0,     543744,     543744,     1152,     2304, 0xb46f77b0
+0,     544896,     544896,     1152,     2304, 0x3199713d
+0,     546048,     546048,     1152,     2304, 0x5e667a0d
+0,     547200,     547200,     1152,     2304, 0xa3047ae3
+0,     548352,     548352,     1152,     2304, 0x9edf8594
+0,     549504,     549504,     1152,     2304, 0xd16382d5
+0,     550656,     550656,     1152,     2304, 0x6e838328
+0,     551808,     551808,     1152,     2304, 0xa1f697c1
+0,     552960,     552960,     1152,     2304, 0xefcc749c
+0,     554112,     554112,     1152,     2304, 0x1f94839e
+0,     555264,     555264,     1152,     2304, 0x429e7c5b
+0,     556416,     556416,     1152,     2304, 0x9b59711c
+0,     557568,     557568,     1152,     2304, 0xdac27323
+0,     558720,     558720,     1152,     2304, 0xa4856d2b
+0,     559872,     559872,     1152,     2304, 0x07a37498
+0,     561024,     561024,     1152,     2304, 0xe1ce7512
+0,     562176,     562176,     1152,     2304, 0x15e182c3
+0,     563328,     563328,     1152,     2304, 0x0fa46b8c
+0,     564480,     564480,     1152,     2304, 0xbdf07bfd
+0,     565632,     565632,     1152,     2304, 0xe0238b2a
+0,     566784,     566784,     1152,     2304, 0xab537267
+0,     567936,     567936,     1152,     2304, 0xd46b75f3
+0,     569088,     569088,     1152,     2304, 0xec73794b
+0,     570240,     570240,     1152,     2304, 0x680580c1
+0,     571392,     571392,     1152,     2304, 0x1ace8f6c
+0,     572544,     572544,     1152,     2304, 0x19d583ac
+0,     573696,     573696,     1152,     2304, 0x4b6b8105
+0,     574848,     574848,     1152,     2304, 0x392a78b2
+0,     576000,     576000,     1152,     2304, 0xd3916dad
+0,     577152,     577152,     1152,     2304, 0x569c7a75
+0,     578304,     578304,     1152,     2304, 0xf5ac814b
+0,     579456,     579456,     1152,     2304, 0x18d77e98
+0,     580608,     580608,     1152,     2304, 0x007074ce
+0,     581760,     581760,     1152,     2304, 0x0fe38373
+0,     582912,     582912,     1152,     2304, 0x5a967920
+0,     584064,     584064,     1152,     2304, 0x22167501
+0,     585216,     585216,     1152,     2304, 0xf0828cab
+0,     586368,     586368,     1152,     2304, 0xaeec71b7
+0,     587520,     587520,     1152,     2304, 0xc47b62ff
+0,     588672,     588672,     1152,     2304, 0xab688478
+0,     589824,     589824,     1152,     2304, 0xf35e7bd2
+0,     590976,     590976,     1152,     2304, 0x9cff763e
+0,     592128,     592128,     1152,     2304, 0x59568dc8
+0,     593280,     593280,     1152,     2304, 0x51a278ac
+0,     594432,     594432,     1152,     2304, 0xc08a6e68
+0,     595584,     595584,     1152,     2304, 0xd3067ef4
+0,     596736,     596736,     1152,     2304, 0x54767c49
+0,     597888,     597888,     1152,     2304, 0xf8ff8386
+0,     599040,     599040,     1152,     2304, 0xef267f63
+0,     600192,     600192,     1152,     2304, 0xe2537cd9
+0,     601344,     601344,     1152,     2304, 0x77a57680
+0,     602496,     602496,     1152,     2304, 0x325c74ad
+0,     603648,     603648,     1152,     2304, 0xd7fe87c4
+0,     604800,     604800,     1152,     2304, 0x2e756310
+0,     605952,     605952,     1152,     2304, 0x6a81796b
+0,     607104,     607104,     1152,     2304, 0x2f057daf
+0,     608256,     608256,     1152,     2304, 0xcd9f7c9d
+0,     609408,     609408,     1152,     2304, 0xc91560a0
+0,     610560,     610560,     1152,     2304, 0x962a91eb
+0,     611712,     611712,     1152,     2304, 0xa0ff7416
+0,     612864,     612864,     1152,     2304, 0xcb5c7dff
+0,     614016,     614016,     1152,     2304, 0xd3527041
+0,     615168,     615168,     1152,     2304, 0xc89d77c2
+0,     616320,     616320,     1152,     2304, 0xe1ce7ccf
+0,     617472,     617472,     1152,     2304, 0xe3417c4c
+0,     618624,     618624,     1152,     2304, 0x3f1a7166
+0,     619776,     619776,     1152,     2304, 0xcdcc7e23
+0,     620928,     620928,     1152,     2304, 0x4e727e97
+0,     622080,     622080,     1152,     2304, 0x53427ff1
+0,     623232,     623232,     1152,     2304, 0x173f6ca9
+0,     624384,     624384,     1152,     2304, 0x962887ec
+0,     625536,     625536,     1152,     2304, 0xcbec67f4
+0,     626688,     626688,     1152,     2304, 0x7a2c943d
+0,     627840,     627840,     1152,     2304, 0x8b877570
+0,     628992,     628992,     1152,     2304, 0xcf337323
+0,     630144,     630144,     1152,     2304, 0x8c8682a4
+0,     631296,     631296,     1152,     2304, 0x94c3753c
+0,     632448,     632448,     1152,     2304, 0x86898d79
+0,     633600,     633600,     1152,     2304, 0xdf667312
+0,     634752,     634752,     1152,     2304, 0x062f8ba8
+0,     635904,     635904,     1152,     2304, 0xa2c36f08
+0,     637056,     637056,     1152,     2304, 0x5bca7358
+0,     638208,     638208,     1152,     2304, 0x5648804d
+0,     639360,     639360,     1152,     2304, 0xefac87c8
+0,     640512,     640512,     1152,     2304, 0x66bf7dcf
+0,     641664,     641664,     1152,     2304, 0x62ad73bc
+0,     642816,     642816,     1152,     2304, 0x72fe630c
+0,     643968,     643968,     1152,     2304, 0xeebe87da
+0,     645120,     645120,     1152,     2304, 0x11c870cf
+0,     646272,     646272,     1152,     2304, 0x18fb7c27
+0,     647424,     647424,     1152,     2304, 0x39047145
+0,     648576,     648576,     1152,     2304, 0xdcf07032
+0,     649728,     649728,     1152,     2304, 0x61027c50
+0,     650880,     650880,     1152,     2304, 0x6e2e89de
+0,     652032,     652032,     1152,     2304, 0xc50c6d1d
+0,     653184,     653184,     1152,     2304, 0xeed587ee
+0,     654336,     654336,     1152,     2304, 0xe38269c7
+0,     655488,     655488,     1152,     2304, 0xcf66806e
+0,     656640,     656640,     1152,     2304, 0x2d3b7c1b
+0,     657792,     657792,     1152,     2304, 0xa4127d48
+0,     658944,     658944,     1152,     2304, 0x480b8325
+0,     660096,     660096,     1152,     2304, 0xc1527221
+0,     661248,     661248,     1152,     2304, 0x94c1769a
+0,     662400,     662400,     1152,     2304, 0xcfb37271
+0,     663552,     663552,     1152,     2304, 0x946d7a96
+0,     664704,     664704,     1152,     2304, 0xdfc18e50
+0,     665856,     665856,     1152,     2304, 0x10c48393
+0,     667008,     667008,     1152,     2304, 0x58556b10
+0,     668160,     668160,     1152,     2304, 0x997b7993
+0,     669312,     669312,     1152,     2304, 0x4a787992
+0,     670464,     670464,     1152,     2304, 0x11406c20
+0,     671616,     671616,     1152,     2304, 0x04a4874a
+0,     672768,     672768,     1152,     2304, 0xf3077164
+0,     673920,     673920,     1152,     2304, 0x08ac80e3
+0,     675072,     675072,     1152,     2304, 0x268370d0
+0,     676224,     676224,     1152,     2304, 0x1d137778
+0,     677376,     677376,     1152,     2304, 0xfa148e97
+0,     678528,     678528,     1152,     2304, 0xec50717c
+0,     679680,     679680,     1152,     2304, 0xcbf46b75
+0,     680832,     680832,     1152,     2304, 0xd4168038
+0,     681984,     681984,     1152,     2304, 0xdd9577f0
+0,     683136,     683136,     1152,     2304, 0xc7077685
+0,     684288,     684288,     1152,     2304, 0x34d25e91
+0,     685440,     685440,     1152,     2304, 0x96537e6d
+0,     686592,     686592,     1152,     2304, 0xb12e7940
+0,     687744,     687744,     1152,     2304, 0x861d64c0
+0,     688896,     688896,     1152,     2304, 0xa2bc64ed
+0,     690048,     690048,     1152,     2304, 0x0c5f8261
+0,     691200,     691200,     1152,     2304, 0x540584ff
+0,     692352,     692352,     1152,     2304, 0xe8328b09
+0,     693504,     693504,     1152,     2304, 0x1e777079
+0,     694656,     694656,     1152,     2304, 0x453483b4
+0,     695808,     695808,     1152,     2304, 0x1cab7a1e
+0,     696960,     696960,     1152,     2304, 0xcb37856d
+0,     698112,     698112,     1152,     2304, 0x5a4883ed
+0,     699264,     699264,     1152,     2304, 0xd1f27cbf
+0,     700416,     700416,     1152,     2304, 0x0d377a4d
+0,     701568,     701568,     1152,     2304, 0x264e76df
+0,     702720,     702720,     1152,     2304, 0x2a68771e
+0,     703872,     703872,     1152,     2304, 0xcb317a31
+0,     705024,     705024,     1152,     2304, 0xfc5d7a27
+0,     706176,     706176,     1152,     2304, 0x6e067d96
+0,     707328,     707328,     1152,     2304, 0x0c538560
+0,     708480,     708480,     1152,     2304, 0xfbad717a
+0,     709632,     709632,     1152,     2304, 0xf9fc7608
+0,     710784,     710784,     1152,     2304, 0xb1817c8f
+0,     711936,     711936,     1152,     2304, 0x57c37f82
+0,     713088,     713088,     1152,     2304, 0x8cac8356
+0,     714240,     714240,     1152,     2304, 0x97108186
+0,     715392,     715392,     1152,     2304, 0x095d81bb
+0,     716544,     716544,     1152,     2304, 0x475f6b2b
+0,     717696,     717696,     1152,     2304, 0xdf7c8cc5
+0,     718848,     718848,     1152,     2304, 0x979c77be
+0,     720000,     720000,     1152,     2304, 0x56a7844b
+0,     721152,     721152,     1152,     2304, 0x7ee46b21
+0,     722304,     722304,     1152,     2304, 0x05b67220
+0,     723456,     723456,     1152,     2304, 0x25787252
+0,     724608,     724608,     1152,     2304, 0x8ad278ad
+0,     725760,     725760,     1152,     2304, 0x67bd722e
+0,     726912,     726912,     1152,     2304, 0x204f77be
+0,     728064,     728064,     1152,     2304, 0x82d27ae2
+0,     729216,     729216,     1152,     2304, 0x23fa82e4
+0,     730368,     730368,     1152,     2304, 0xa9cf8159
+0,     731520,     731520,     1152,     2304, 0x13f08749
+0,     732672,     732672,     1152,     2304, 0xf84f71b5
+0,     733824,     733824,     1152,     2304, 0x1cb777c8
+0,     734976,     734976,     1152,     2304, 0x11236722
+0,     736128,     736128,     1152,     2304, 0x10197cac
+0,     737280,     737280,     1152,     2304, 0xbd417e65
+0,     738432,     738432,     1152,     2304, 0x9a1c7d05
+0,     739584,     739584,     1152,     2304, 0x4c3a85de
+0,     740736,     740736,     1152,     2304, 0x03816eb7
+0,     741888,     741888,     1152,     2304, 0x80186e6c
+0,     743040,     743040,     1152,     2304, 0x5c097928
+0,     744192,     744192,     1152,     2304, 0x94aa823d
+0,     745344,     745344,     1152,     2304, 0xa1c27f04
+0,     746496,     746496,     1152,     2304, 0x6ddb74a9
+0,     747648,     747648,     1152,     2304, 0x5ea67901
+0,     748800,     748800,     1152,     2304, 0xd710742d
+0,     749952,     749952,     1152,     2304, 0xf8c27add
+0,     751104,     751104,     1152,     2304, 0xf1717011
+0,     752256,     752256,     1152,     2304, 0xb59072d0
+0,     753408,     753408,     1152,     2304, 0xc8dc84a7
+0,     754560,     754560,     1152,     2304, 0x33116737
+0,     755712,     755712,     1152,     2304, 0x86216bdd
+0,     756864,     756864,     1152,     2304, 0xa2f87866
+0,     758016,     758016,     1152,     2304, 0x5d77771e
+0,     759168,     759168,     1152,     2304, 0x5d8c77fd
+0,     760320,     760320,     1152,     2304, 0x23cc89cb
+0,     761472,     761472,     1152,     2304, 0x334e7407
+0,     762624,     762624,     1152,     2304, 0x01c976ff
+0,     763776,     763776,     1152,     2304, 0x3a3b7b15
+0,     764928,     764928,     1152,     2304, 0xfa427de9
+0,     766080,     766080,     1152,     2304, 0xbeaa7c91
+0,     767232,     767232,     1152,     2304, 0xd6988b31
+0,     768384,     768384,     1152,     2304, 0x4db47f80
+0,     769536,     769536,     1152,     2304, 0xea687d9e
+0,     770688,     770688,     1152,     2304, 0x1a6281ce
+0,     771840,     771840,     1152,     2304, 0xe1958003
+0,     772992,     772992,     1152,     2304, 0xb4ae7c5e
+0,     774144,     774144,     1152,     2304, 0x28827c8a
+0,     775296,     775296,     1152,     2304, 0x1fb88b25
+0,     776448,     776448,     1152,     2304, 0x588d71e8
+0,     777600,     777600,     1152,     2304, 0x68227c34
+0,     778752,     778752,     1152,     2304, 0xee4d73e8
+0,     779904,     779904,     1152,     2304, 0x69287c6d
+0,     781056,     781056,     1152,     2304, 0xbb04926a
+0,     782208,     782208,     1152,     2304, 0x89456cec
+0,     783360,     783360,     1152,     2304, 0xabe18992
+0,     784512,     784512,     1152,     2304, 0x50cc7f6c
+0,     785664,     785664,     1152,     2304, 0x6d7270be
+0,     786816,     786816,     1152,     2304, 0x664c6fef
+0,     787968,     787968,     1152,     2304, 0x7f7982f3
+0,     789120,     789120,     1152,     2304, 0x6ca170e9
+0,     790272,     790272,     1152,     2304, 0x36437d5b
+0,     791424,     791424,     1152,     2304, 0xfd2380e8
+0,     792576,     792576,     1152,     2304, 0x2e3c6e9f
+0,     793728,     793728,     1152,     2304, 0xc8427f3f
+0,     794880,     794880,     1152,     2304, 0x962a79ad
+0,     796032,     796032,     1152,     2304, 0xc9597c8b
+0,     797184,     797184,     1152,     2304, 0x899580bb
+0,     798336,     798336,     1152,     2304, 0x2d179dff
+0,     799488,     799488,     1152,     2304, 0x4ac1707c
+0,     800640,     800640,     1152,     2304, 0x32ea7e95
+0,     801792,     801792,     1152,     2304, 0x265e9a2d
+0,     802944,     802944,     1152,     2304, 0x1c6484d0
+0,     804096,     804096,     1152,     2304, 0x39ae6884
+0,     805248,     805248,     1152,     2304, 0x82ed7bc5
+0,     806400,     806400,     1152,     2304, 0x556b7b3c
+0,     807552,     807552,     1152,     2304, 0xb7f778dd
+0,     808704,     808704,     1152,     2304, 0x74447d55
+0,     809856,     809856,     1152,     2304, 0x0c66861e
+0,     811008,     811008,     1152,     2304, 0x15ba7932
+0,     812160,     812160,     1152,     2304, 0xb19170fc
+0,     813312,     813312,     1152,     2304, 0x19d37551
+0,     814464,     814464,     1152,     2304, 0xdc529142
+0,     815616,     815616,     1152,     2304, 0xf2637e77
+0,     816768,     816768,     1152,     2304, 0xd065944b
+0,     817920,     817920,     1152,     2304, 0x22878123
+0,     819072,     819072,     1152,     2304, 0xc21a8bf7
+0,     820224,     820224,     1152,     2304, 0x2e3582dc
+0,     821376,     821376,     1152,     2304, 0xd42f7987
+0,     822528,     822528,     1152,     2304, 0x69b88236
+0,     823680,     823680,     1152,     2304, 0x7c988f90
+0,     824832,     824832,     1152,     2304, 0x2cd66ded
+0,     825984,     825984,     1152,     2304, 0x3e65828b
+0,     827136,     827136,     1152,     2304, 0x7e9871c9
+0,     828288,     828288,     1152,     2304, 0xf1f2806b
+0,     829440,     829440,     1152,     2304, 0xf5087c7b
+0,     830592,     830592,     1152,     2304, 0x62b98097
+0,     831744,     831744,     1152,     2304, 0xec457c43
+0,     832896,     832896,     1152,     2304, 0x87af87a6
+0,     834048,     834048,     1152,     2304, 0x97cc757d
+0,     835200,     835200,     1152,     2304, 0x08ca76bd
+0,     836352,     836352,     1152,     2304, 0x14ae7cbd
+0,     837504,     837504,     1152,     2304, 0x1f79709a
+0,     838656,     838656,     1152,     2304, 0x17948207
+0,     839808,     839808,     1152,     2304, 0x16ee7228
+0,     840960,     840960,     1152,     2304, 0x76cc82d7
+0,     842112,     842112,     1152,     2304, 0x8f327a8e
+0,     843264,     843264,     1152,     2304, 0x14ee7756
+0,     844416,     844416,     1152,     2304, 0x15996d2f
+0,     845568,     845568,     1152,     2304, 0x4c707d5c
+0,     846720,     846720,     1152,     2304, 0x268c6fee
+0,     847872,     847872,     1152,     2304, 0x6d838c76
+0,     849024,     849024,     1152,     2304, 0xafa17e64
+0,     850176,     850176,     1152,     2304, 0xb6546e66
+0,     851328,     851328,     1152,     2304, 0x945d8b9f
+0,     852480,     852480,     1152,     2304, 0x5bfb7446
+0,     853632,     853632,     1152,     2304, 0xae6086f9
+0,     854784,     854784,     1152,     2304, 0xa01380cd
+0,     855936,     855936,     1152,     2304, 0x06f0828f
+0,     857088,     857088,     1152,     2304, 0x0ae07176
+0,     858240,     858240,     1152,     2304, 0x66f07522
+0,     859392,     859392,     1152,     2304, 0x44018106
+0,     860544,     860544,     1152,     2304, 0x8cd283da
+0,     861696,     861696,     1152,     2304, 0x14257f45
+0,     862848,     862848,     1152,     2304, 0x04979537
+0,     864000,     864000,     1152,     2304, 0x8b5f797c
+0,     865152,     865152,     1152,     2304, 0x12d67493
+0,     866304,     866304,     1152,     2304, 0xc8886a25
+0,     867456,     867456,     1152,     2304, 0x614b803a
+0,     868608,     868608,     1152,     2304, 0x75667d35
+0,     869760,     869760,     1152,     2304, 0xe42c7b00
+0,     870912,     870912,     1152,     2304, 0x37787927
+0,     872064,     872064,     1152,     2304, 0x85db8409
+0,     873216,     873216,     1152,     2304, 0x823b822c
+0,     874368,     874368,     1152,     2304, 0xa1658479
+0,     875520,     875520,     1152,     2304, 0xdbe58ff7
+0,     876672,     876672,     1152,     2304, 0x725175e2
+0,     877824,     877824,     1152,     2304, 0xb2ae7741
+0,     878976,     878976,     1152,     2304, 0x4de169e4
+0,     880128,     880128,     1152,     2304, 0x3cb18530
+0,     881280,     881280,     1152,     2304, 0x5a0c5e7b
diff --git a/tests/ref/fate/hls-segment-size b/tests/ref/fate/hls-segment-size
new file mode 100644
index 0000000..ee3c7b2
--- /dev/null
+++ b/tests/ref/fate/hls-segment-size
@@ -0,0 +1,772 @@
+#tb 0: 1/44100
+#media_type 0: audio
+#codec_id 0: pcm_s16le
+#sample_rate 0: 44100
+#channel_layout 0: 4
+#channel_layout_name 0: mono
+0,          0,          0,     1152,     2304, 0x907cb7fa
+0,       1152,       1152,     1152,     2304, 0xb8dc7525
+0,       2304,       2304,     1152,     2304, 0x3e7d6905
+0,       3456,       3456,     1152,     2304, 0xef47877b
+0,       4608,       4608,     1152,     2304, 0xfe916b7e
+0,       5760,       5760,     1152,     2304, 0xe3d08cde
+0,       6912,       6912,     1152,     2304, 0xff7f86cf
+0,       8064,       8064,     1152,     2304, 0x843e6f95
+0,       9216,       9216,     1152,     2304, 0x81577c26
+0,      10368,      10368,     1152,     2304, 0x04a085d5
+0,      11520,      11520,     1152,     2304, 0x1c5a76f5
+0,      12672,      12672,     1152,     2304, 0x4ee78623
+0,      13824,      13824,     1152,     2304, 0x8ec861dc
+0,      14976,      14976,     1152,     2304, 0x0ca179d8
+0,      16128,      16128,     1152,     2304, 0xc6da750f
+0,      17280,      17280,     1152,     2304, 0xf6bf79b5
+0,      18432,      18432,     1152,     2304, 0x97b88a43
+0,      19584,      19584,     1152,     2304, 0xf13c7b9c
+0,      20736,      20736,     1152,     2304, 0xdfba83af
+0,      21888,      21888,     1152,     2304, 0xc9467d4b
+0,      23040,      23040,     1152,     2304, 0xbbb58e2b
+0,      24192,      24192,     1152,     2304, 0x3a1078ea
+0,      25344,      25344,     1152,     2304, 0xe9587a5c
+0,      26496,      26496,     1152,     2304, 0xef5a8039
+0,      27648,      27648,     1152,     2304, 0x9d5f782f
+0,      28800,      28800,     1152,     2304, 0x1a548291
+0,      29952,      29952,     1152,     2304, 0x07517701
+0,      31104,      31104,     1152,     2304, 0x78127d6e
+0,      32256,      32256,     1152,     2304, 0x62e2788a
+0,      33408,      33408,     1152,     2304, 0x29397ad9
+0,      34560,      34560,     1152,     2304, 0x45da82d6
+0,      35712,      35712,     1152,     2304, 0x8ed66e51
+0,      36864,      36864,     1152,     2304, 0x660775cd
+0,      38016,      38016,     1152,     2304, 0x802c767a
+0,      39168,      39168,     1152,     2304, 0xcc055840
+0,      40320,      40320,     1152,     2304, 0x701b7eaf
+0,      41472,      41472,     1152,     2304, 0x8290749f
+0,      42624,      42624,     1152,     2304, 0x2c7b7d30
+0,      43776,      43776,     1152,     2304, 0xe4f17743
+0,      44928,      44928,     1152,     2304, 0x0e747d6e
+0,      46080,      46080,     1152,     2304, 0xbe7775a0
+0,      47232,      47232,     1152,     2304, 0xcf797673
+0,      48384,      48384,     1152,     2304, 0x29cb7800
+0,      49536,      49536,     1152,     2304, 0xfc947890
+0,      50688,      50688,     1152,     2304, 0x62757fc6
+0,      51840,      51840,     1152,     2304, 0x098876d0
+0,      52992,      52992,     1152,     2304, 0xa9567ee2
+0,      54144,      54144,     1152,     2304, 0xe3bb9173
+0,      55296,      55296,     1152,     2304, 0xcc2d6dee
+0,      56448,      56448,     1152,     2304, 0xe94591ab
+0,      57600,      57600,     1152,     2304, 0x5c7588de
+0,      58752,      58752,     1152,     2304, 0xfd83643c
+0,      59904,      59904,     1152,     2304, 0x528177f1
+0,      61056,      61056,     1152,     2304, 0x65d08474
+0,      62208,      62208,     1152,     2304, 0x738d765b
+0,      63360,      63360,     1152,     2304, 0xdd3d810e
+0,      64512,      64512,     1152,     2304, 0xef4f90d3
+0,      65664,      65664,     1152,     2304, 0x61e28d43
+0,      66816,      66816,     1152,     2304, 0x9a11796b
+0,      67968,      67968,     1152,     2304, 0x96c97dcd
+0,      69120,      69120,     1152,     2304, 0xa8fe8621
+0,      70272,      70272,     1152,     2304, 0x499b7d38
+0,      71424,      71424,     1152,     2304, 0xfcb078a9
+0,      72576,      72576,     1152,     2304, 0x40d78651
+0,      73728,      73728,     1152,     2304, 0xa4af7234
+0,      74880,      74880,     1152,     2304, 0x6831870a
+0,      76032,      76032,     1152,     2304, 0x030e7b9d
+0,      77184,      77184,     1152,     2304, 0x445a75b6
+0,      78336,      78336,     1152,     2304, 0x09857389
+0,      79488,      79488,     1152,     2304, 0x0d018866
+0,      80640,      80640,     1152,     2304, 0x2afe810a
+0,      81792,      81792,     1152,     2304, 0x0bcf7c43
+0,      82944,      82944,     1152,     2304, 0x13737c12
+0,      84096,      84096,     1152,     2304, 0x716c7bba
+0,      85248,      85248,     1152,     2304, 0xb801823b
+0,      86400,      86400,     1152,     2304, 0x0fd573ee
+0,      87552,      87552,     1152,     2304, 0xe1ab879c
+0,      88704,      88704,     1152,     2304, 0x49e6764f
+0,      89856,      89856,     1152,     2304, 0xd5f26ddc
+0,      91008,      91008,     1152,     2304, 0x076775ff
+0,      92160,      92160,     1152,     2304, 0xfbb86fce
+0,      93312,      93312,     1152,     2304, 0x20c56858
+0,      94464,      94464,     1152,     2304, 0x043e6891
+0,      95616,      95616,     1152,     2304, 0x59648729
+0,      96768,      96768,     1152,     2304, 0xd4907a63
+0,      97920,      97920,     1152,     2304, 0xd0208a4c
+0,      99072,      99072,     1152,     2304, 0xce968383
+0,     100224,     100224,     1152,     2304, 0x3cfc7cd1
+0,     101376,     101376,     1152,     2304, 0x628a7bf5
+0,     102528,     102528,     1152,     2304, 0x9cfe8a4f
+0,     103680,     103680,     1152,     2304, 0xdf6f7c6d
+0,     104832,     104832,     1152,     2304, 0x6cf6882a
+0,     105984,     105984,     1152,     2304, 0x099773a3
+0,     107136,     107136,     1152,     2304, 0x4a1c7649
+0,     108288,     108288,     1152,     2304, 0x31ea71cb
+0,     109440,     109440,     1152,     2304, 0xed127ed9
+0,     110592,     110592,     1152,     2304, 0x5b156954
+0,     111744,     111744,     1152,     2304, 0xdd638532
+0,     112896,     112896,     1152,     2304, 0xf1a271f2
+0,     114048,     114048,     1152,     2304, 0x779184d7
+0,     115200,     115200,     1152,     2304, 0x49a88aa8
+0,     116352,     116352,     1152,     2304, 0xa11b7c90
+0,     117504,     117504,     1152,     2304, 0xbf488274
+0,     118656,     118656,     1152,     2304, 0x002f79a8
+0,     119808,     119808,     1152,     2304, 0x0ed97e2f
+0,     120960,     120960,     1152,     2304, 0x7845878f
+0,     122112,     122112,     1152,     2304, 0x46d777dc
+0,     123264,     123264,     1152,     2304, 0x8d0179e3
+0,     124416,     124416,     1152,     2304, 0x38917f9f
+0,     125568,     125568,     1152,     2304, 0x449876e7
+0,     126720,     126720,     1152,     2304, 0x001a8769
+0,     127872,     127872,     1152,     2304, 0x06c1826b
+0,     129024,     129024,     1152,     2304, 0x41b68047
+0,     130176,     130176,     1152,     2304, 0xeb9782c6
+0,     131328,     131328,     1152,     2304, 0x7cd9719c
+0,     132480,     132480,     1152,     2304, 0x3a4a767c
+0,     133632,     133632,     1152,     2304, 0x7f887e81
+0,     134784,     134784,     1152,     2304, 0xf75d714b
+0,     135936,     135936,     1152,     2304, 0x33b57e9f
+0,     137088,     137088,     1152,     2304, 0xc732749e
+0,     138240,     138240,     1152,     2304, 0x386f7e1a
+0,     139392,     139392,     1152,     2304, 0x6b9c767d
+0,     140544,     140544,     1152,     2304, 0x701c83e5
+0,     141696,     141696,     1152,     2304, 0xb92571e1
+0,     142848,     142848,     1152,     2304, 0x833a84bc
+0,     144000,     144000,     1152,     2304, 0x1b6984e0
+0,     145152,     145152,     1152,     2304, 0x1b2474ba
+0,     146304,     146304,     1152,     2304, 0xc22775a6
+0,     147456,     147456,     1152,     2304, 0x3e8f7972
+0,     148608,     148608,     1152,     2304, 0x17a28a65
+0,     149760,     149760,     1152,     2304, 0x9b6178a4
+0,     150912,     150912,     1152,     2304, 0x5d707873
+0,     152064,     152064,     1152,     2304, 0x68e2645a
+0,     153216,     153216,     1152,     2304, 0x1e377d28
+0,     154368,     154368,     1152,     2304, 0x54b384be
+0,     155520,     155520,     1152,     2304, 0x0617808c
+0,     156672,     156672,     1152,     2304, 0xbc2b8a6c
+0,     157824,     157824,     1152,     2304, 0x7ced7180
+0,     158976,     158976,     1152,     2304, 0xf22180ab
+0,     160128,     160128,     1152,     2304, 0xf13682c9
+0,     161280,     161280,     1152,     2304, 0x7eff87fd
+0,     162432,     162432,     1152,     2304, 0x5a0b5cec
+0,     163584,     163584,     1152,     2304, 0x57c18906
+0,     164736,     164736,     1152,     2304, 0xb55a6a16
+0,     165888,     165888,     1152,     2304, 0xf2608371
+0,     167040,     167040,     1152,     2304, 0x36df7576
+0,     168192,     168192,     1152,     2304, 0xdb106fb4
+0,     169344,     169344,     1152,     2304, 0x7e4f85d0
+0,     170496,     170496,     1152,     2304, 0xe3ee78ab
+0,     171648,     171648,     1152,     2304, 0xd36b7dc7
+0,     172800,     172800,     1152,     2304, 0xadab7c5c
+0,     173952,     173952,     1152,     2304, 0x70786f26
+0,     175104,     175104,     1152,     2304, 0xcd5d717e
+0,     176256,     176256,     1152,     2304, 0xc1a96f9a
+0,     177408,     177408,     1152,     2304, 0xad777887
+0,     178560,     178560,     1152,     2304, 0x98277c16
+0,     179712,     179712,     1152,     2304, 0x868882c5
+0,     180864,     180864,     1152,     2304, 0xc48092b9
+0,     182016,     182016,     1152,     2304, 0x230069da
+0,     183168,     183168,     1152,     2304, 0x14147ad6
+0,     184320,     184320,     1152,     2304, 0xc9007172
+0,     185472,     185472,     1152,     2304, 0x85d67bcc
+0,     186624,     186624,     1152,     2304, 0x22418bab
+0,     187776,     187776,     1152,     2304, 0xe53c8b71
+0,     188928,     188928,     1152,     2304, 0x5a1a9053
+0,     190080,     190080,     1152,     2304, 0x9cd179af
+0,     191232,     191232,     1152,     2304, 0xbb3c7d72
+0,     192384,     192384,     1152,     2304, 0x477a8677
+0,     193536,     193536,     1152,     2304, 0xe3337834
+0,     194688,     194688,     1152,     2304, 0x1cb56d77
+0,     195840,     195840,     1152,     2304, 0xe89d6dac
+0,     196992,     196992,     1152,     2304, 0xd468827e
+0,     198144,     198144,     1152,     2304, 0xebc46b87
+0,     199296,     199296,     1152,     2304, 0x5fbb78d2
+0,     200448,     200448,     1152,     2304, 0xa1b483d6
+0,     201600,     201600,     1152,     2304, 0x6fec7cab
+0,     202752,     202752,     1152,     2304, 0xd86d6f6c
+0,     203904,     203904,     1152,     2304, 0x8c2c7d51
+0,     205056,     205056,     1152,     2304, 0xe8377cd7
+0,     206208,     206208,     1152,     2304, 0xb57071b4
+0,     207360,     207360,     1152,     2304, 0xc35c71fd
+0,     208512,     208512,     1152,     2304, 0x789079e9
+0,     209664,     209664,     1152,     2304, 0x413b710e
+0,     210816,     210816,     1152,     2304, 0x82678332
+0,     211968,     211968,     1152,     2304, 0xe1576e75
+0,     213120,     213120,     1152,     2304, 0x7c0b7ad6
+0,     214272,     214272,     1152,     2304, 0xc6b6786d
+0,     215424,     215424,     1152,     2304, 0x736f7b89
+0,     216576,     216576,     1152,     2304, 0x0ded72f1
+0,     217728,     217728,     1152,     2304, 0xcb877a3c
+0,     218880,     218880,     1152,     2304, 0x7c497d40
+0,     220032,     220032,     1152,     2304, 0xaefc798c
+0,     221184,     221184,     1152,     2304, 0x4cce748c
+0,     222336,     222336,     1152,     2304, 0xaa187fbe
+0,     223488,     223488,     1152,     2304, 0x1aa77db9
+0,     224640,     224640,     1152,     2304, 0x9e0074b8
+0,     225792,     225792,     1152,     2304, 0x74ee822b
+0,     226944,     226944,     1152,     2304, 0x975c6ff6
+0,     228096,     228096,     1152,     2304, 0xe1847bb4
+0,     229248,     229248,     1152,     2304, 0xe0828777
+0,     230400,     230400,     1152,     2304, 0xf4027205
+0,     231552,     231552,     1152,     2304, 0x535e7a20
+0,     232704,     232704,     1152,     2304, 0x5bd88404
+0,     233856,     233856,     1152,     2304, 0xf29478b1
+0,     235008,     235008,     1152,     2304, 0x9b7c7d88
+0,     236160,     236160,     1152,     2304, 0xaeb07335
+0,     237312,     237312,     1152,     2304, 0xbef06e08
+0,     238464,     238464,     1152,     2304, 0x795f7b8c
+0,     239616,     239616,     1152,     2304, 0x435a674d
+0,     240768,     240768,     1152,     2304, 0xd8ee7a09
+0,     241920,     241920,     1152,     2304, 0x9059812e
+0,     243072,     243072,     1152,     2304, 0x7481744a
+0,     244224,     244224,     1152,     2304, 0xdff27475
+0,     245376,     245376,     1152,     2304, 0xb17783ab
+0,     246528,     246528,     1152,     2304, 0x42e9706b
+0,     247680,     247680,     1152,     2304, 0x9f0d86b4
+0,     248832,     248832,     1152,     2304, 0x2963955f
+0,     249984,     249984,     1152,     2304, 0x059a6957
+0,     251136,     251136,     1152,     2304, 0x85948206
+0,     252288,     252288,     1152,     2304, 0x185e8400
+0,     253440,     253440,     1152,     2304, 0xe98e70df
+0,     254592,     254592,     1152,     2304, 0x69057b27
+0,     255744,     255744,     1152,     2304, 0x49e26f21
+0,     256896,     256896,     1152,     2304, 0xb0867da5
+0,     258048,     258048,     1152,     2304, 0x785980ff
+0,     259200,     259200,     1152,     2304, 0xf4b774be
+0,     260352,     260352,     1152,     2304, 0x63897e8c
+0,     261504,     261504,     1152,     2304, 0x248b89af
+0,     262656,     262656,     1152,     2304, 0xd3627c4a
+0,     263808,     263808,     1152,     2304, 0x5a4d9349
+0,     264960,     264960,     1152,     2304, 0xe2ce7c4c
+0,     266112,     266112,     1152,     2304, 0x321f6c0b
+0,     267264,     267264,     1152,     2304, 0x51ac74e0
+0,     268416,     268416,     1152,     2304, 0x8efa91ba
+0,     269568,     269568,     1152,     2304, 0x8b4b784c
+0,     270720,     270720,     1152,     2304, 0xe9e4879e
+0,     271872,     271872,     1152,     2304, 0x8dc28081
+0,     273024,     273024,     1152,     2304, 0x44b477b0
+0,     274176,     274176,     1152,     2304, 0xf7b67084
+0,     275328,     275328,     1152,     2304, 0x4b198c17
+0,     276480,     276480,     1152,     2304, 0x9c947194
+0,     277632,     277632,     1152,     2304, 0x6eaa7f15
+0,     278784,     278784,     1152,     2304, 0x119f7c1d
+0,     279936,     279936,     1152,     2304, 0x157b7f43
+0,     281088,     281088,     1152,     2304, 0xcd2e7acc
+0,     282240,     282240,     1152,     2304, 0x97597247
+0,     283392,     283392,     1152,     2304, 0x7ba06acb
+0,     284544,     284544,     1152,     2304, 0x233c7995
+0,     285696,     285696,     1152,     2304, 0x08e28587
+0,     286848,     286848,     1152,     2304, 0x92be84b5
+0,     288000,     288000,     1152,     2304, 0xbb857d43
+0,     289152,     289152,     1152,     2304, 0x168e7c74
+0,     290304,     290304,     1152,     2304, 0xac5465d9
+0,     291456,     291456,     1152,     2304, 0x18f58831
+0,     292608,     292608,     1152,     2304, 0x19b48196
+0,     293760,     293760,     1152,     2304, 0x20297653
+0,     294912,     294912,     1152,     2304, 0x93397a82
+0,     296064,     296064,     1152,     2304, 0x65ea7deb
+0,     297216,     297216,     1152,     2304, 0xd7316e20
+0,     298368,     298368,     1152,     2304, 0x94107f2b
+0,     299520,     299520,     1152,     2304, 0xec3b7dc6
+0,     300672,     300672,     1152,     2304, 0x2d3783aa
+0,     301824,     301824,     1152,     2304, 0x07e47340
+0,     302976,     302976,     1152,     2304, 0xbc117893
+0,     304128,     304128,     1152,     2304, 0x8bd97851
+0,     305280,     305280,     1152,     2304, 0xc27376a9
+0,     306432,     306432,     1152,     2304, 0x30d88c83
+0,     307584,     307584,     1152,     2304, 0x19c2704c
+0,     308736,     308736,     1152,     2304, 0x093b7b6e
+0,     309888,     309888,     1152,     2304, 0x221a7349
+0,     311040,     311040,     1152,     2304, 0xa4fd82cd
+0,     312192,     312192,     1152,     2304, 0x762e6bc9
+0,     313344,     313344,     1152,     2304, 0x270075d4
+0,     314496,     314496,     1152,     2304, 0xa5f27b90
+0,     315648,     315648,     1152,     2304, 0xf72e7edc
+0,     316800,     316800,     1152,     2304, 0x42178486
+0,     317952,     317952,     1152,     2304, 0x5f7978e8
+0,     319104,     319104,     1152,     2304, 0x5d7c6703
+0,     320256,     320256,     1152,     2304, 0x2c4483d5
+0,     321408,     321408,     1152,     2304, 0x31bd951d
+0,     322560,     322560,     1152,     2304, 0x99487af0
+0,     323712,     323712,     1152,     2304, 0x0bd27ee7
+0,     324864,     324864,     1152,     2304, 0xc3e07ac4
+0,     326016,     326016,     1152,     2304, 0x98a16ba7
+0,     327168,     327168,     1152,     2304, 0xd7a5747b
+0,     328320,     328320,     1152,     2304, 0x96fb811c
+0,     329472,     329472,     1152,     2304, 0x7cee8109
+0,     330624,     330624,     1152,     2304, 0x52b18ba2
+0,     331776,     331776,     1152,     2304, 0x33be8861
+0,     332928,     332928,     1152,     2304, 0xf41282a0
+0,     334080,     334080,     1152,     2304, 0xb4268993
+0,     335232,     335232,     1152,     2304, 0x52126a1c
+0,     336384,     336384,     1152,     2304, 0x050b6f7a
+0,     337536,     337536,     1152,     2304, 0x67a26fc3
+0,     338688,     338688,     1152,     2304, 0x966c7cf2
+0,     339840,     339840,     1152,     2304, 0x22097750
+0,     340992,     340992,     1152,     2304, 0xfbb0796c
+0,     342144,     342144,     1152,     2304, 0xbd508964
+0,     343296,     343296,     1152,     2304, 0xc24478d8
+0,     344448,     344448,     1152,     2304, 0x3913769d
+0,     345600,     345600,     1152,     2304, 0x8aab872f
+0,     346752,     346752,     1152,     2304, 0x7cb4822f
+0,     347904,     347904,     1152,     2304, 0xea318144
+0,     349056,     349056,     1152,     2304, 0xaf0f86d2
+0,     350208,     350208,     1152,     2304, 0x24f27598
+0,     351360,     351360,     1152,     2304, 0xd76f6d40
+0,     352512,     352512,     1152,     2304, 0x085071a7
+0,     353664,     353664,     1152,     2304, 0x1d11704c
+0,     354816,     354816,     1152,     2304, 0x21517cbd
+0,     355968,     355968,     1152,     2304, 0xcdca8d32
+0,     357120,     357120,     1152,     2304, 0x71c18433
+0,     358272,     358272,     1152,     2304, 0xd39d7d81
+0,     359424,     359424,     1152,     2304, 0x7a0d7a43
+0,     360576,     360576,     1152,     2304, 0x007c8884
+0,     361728,     361728,     1152,     2304, 0x403282d0
+0,     362880,     362880,     1152,     2304, 0xe3737214
+0,     364032,     364032,     1152,     2304, 0xaf906f47
+0,     365184,     365184,     1152,     2304, 0x54f57b3b
+0,     366336,     366336,     1152,     2304, 0x29be7791
+0,     367488,     367488,     1152,     2304, 0xe3c663d5
+0,     368640,     368640,     1152,     2304, 0xd7258238
+0,     369792,     369792,     1152,     2304, 0x3719820d
+0,     370944,     370944,     1152,     2304, 0xbe04814f
+0,     372096,     372096,     1152,     2304, 0x556c815e
+0,     373248,     373248,     1152,     2304, 0xb2447e10
+0,     374400,     374400,     1152,     2304, 0x7c16867c
+0,     375552,     375552,     1152,     2304, 0x6a7b78ed
+0,     376704,     376704,     1152,     2304, 0x5d307b81
+0,     377856,     377856,     1152,     2304, 0xaab680d3
+0,     379008,     379008,     1152,     2304, 0xb5d37a23
+0,     380160,     380160,     1152,     2304, 0x7f7d6f76
+0,     381312,     381312,     1152,     2304, 0x317a8296
+0,     382464,     382464,     1152,     2304, 0x8a987b3d
+0,     383616,     383616,     1152,     2304, 0x4f317a27
+0,     384768,     384768,     1152,     2304, 0xfc65852f
+0,     385920,     385920,     1152,     2304, 0x40527719
+0,     387072,     387072,     1152,     2304, 0x84988e13
+0,     388224,     388224,     1152,     2304, 0x318b6ddc
+0,     389376,     389376,     1152,     2304, 0x94cf7939
+0,     390528,     390528,     1152,     2304, 0x6f22819d
+0,     391680,     391680,     1152,     2304, 0xa7dd80a9
+0,     392832,     392832,     1152,     2304, 0x1c7968fa
+0,     393984,     393984,     1152,     2304, 0xd9937bae
+0,     395136,     395136,     1152,     2304, 0xf7137cf9
+0,     396288,     396288,     1152,     2304, 0xeadb84b5
+0,     397440,     397440,     1152,     2304, 0x9a2390ac
+0,     398592,     398592,     1152,     2304, 0xdb6a73f6
+0,     399744,     399744,     1152,     2304, 0x69e07507
+0,     400896,     400896,     1152,     2304, 0xbc8478b2
+0,     402048,     402048,     1152,     2304, 0x32cf8638
+0,     403200,     403200,     1152,     2304, 0x2b8d755a
+0,     404352,     404352,     1152,     2304, 0x52e05bd2
+0,     405504,     405504,     1152,     2304, 0x2aed8c49
+0,     406656,     406656,     1152,     2304, 0x587a896e
+0,     407808,     407808,     1152,     2304, 0x6dd87dee
+0,     408960,     408960,     1152,     2304, 0xd2858338
+0,     410112,     410112,     1152,     2304, 0xd90f7842
+0,     411264,     411264,     1152,     2304, 0xd6fb6d4a
+0,     412416,     412416,     1152,     2304, 0x85498aea
+0,     413568,     413568,     1152,     2304, 0x18597790
+0,     414720,     414720,     1152,     2304, 0x3cd78fea
+0,     415872,     415872,     1152,     2304, 0x94377fbc
+0,     417024,     417024,     1152,     2304, 0xf9db73f5
+0,     418176,     418176,     1152,     2304, 0x14fb6fca
+0,     419328,     419328,     1152,     2304, 0xe9d17d69
+0,     420480,     420480,     1152,     2304, 0xdeb57286
+0,     421632,     421632,     1152,     2304, 0xa5d37e17
+0,     422784,     422784,     1152,     2304, 0xcf6882fb
+0,     423936,     423936,     1152,     2304, 0x31758066
+0,     425088,     425088,     1152,     2304, 0x6b4d8175
+0,     426240,     426240,     1152,     2304, 0x2a3d7f8e
+0,     427392,     427392,     1152,     2304, 0xc066743b
+0,     428544,     428544,     1152,     2304, 0xcab88146
+0,     429696,     429696,     1152,     2304, 0x2b4c6e13
+0,     430848,     430848,     1152,     2304, 0x00b36b6f
+0,     432000,     432000,     1152,     2304, 0x664a88d3
+0,     433152,     433152,     1152,     2304, 0x18a66f76
+0,     434304,     434304,     1152,     2304, 0x4f828a8b
+0,     435456,     435456,     1152,     2304, 0x9cc7728e
+0,     436608,     436608,     1152,     2304, 0xbe357936
+0,     437760,     437760,     1152,     2304, 0x19878f8d
+0,     438912,     438912,     1152,     2304, 0x227b7c71
+0,     440064,     440064,     1152,     2304, 0xf7c879ec
+0,     441216,     441216,     1152,     2304, 0x0bca7b50
+0,     442368,     442368,     1152,     2304, 0xe4398304
+0,     443520,     443520,     1152,     2304, 0xf5da75c7
+0,     444672,     444672,     1152,     2304, 0x9f9070a3
+0,     445824,     445824,     1152,     2304, 0x789076f6
+0,     446976,     446976,     1152,     2304, 0x362977cc
+0,     448128,     448128,     1152,     2304, 0x4d0a8928
+0,     449280,     449280,     1152,     2304, 0x1bb767ec
+0,     450432,     450432,     1152,     2304, 0xbe727fa5
+0,     451584,     451584,     1152,     2304, 0x27f38347
+0,     452736,     452736,     1152,     2304, 0x0a3c8783
+0,     453888,     453888,     1152,     2304, 0x8249639c
+0,     455040,     455040,     1152,     2304, 0x3b076f69
+0,     456192,     456192,     1152,     2304, 0xd9597ee3
+0,     457344,     457344,     1152,     2304, 0x026e7fad
+0,     458496,     458496,     1152,     2304, 0xbd7a6de4
+0,     459648,     459648,     1152,     2304, 0x7d718a4d
+0,     460800,     460800,     1152,     2304, 0x1f5e83b4
+0,     461952,     461952,     1152,     2304, 0x597d7755
+0,     463104,     463104,     1152,     2304, 0x3fb080bd
+0,     464256,     464256,     1152,     2304, 0xdcbd7b16
+0,     465408,     465408,     1152,     2304, 0x5c48865f
+0,     466560,     466560,     1152,     2304, 0xcda37ae8
+0,     467712,     467712,     1152,     2304, 0x4810796d
+0,     468864,     468864,     1152,     2304, 0x34317fd0
+0,     470016,     470016,     1152,     2304, 0x5c0e7456
+0,     471168,     471168,     1152,     2304, 0x44d78040
+0,     472320,     472320,     1152,     2304, 0x88587882
+0,     473472,     473472,     1152,     2304, 0x77687d5e
+0,     474624,     474624,     1152,     2304, 0x116d68bb
+0,     475776,     475776,     1152,     2304, 0x3e5b6f60
+0,     476928,     476928,     1152,     2304, 0x64ea783c
+0,     478080,     478080,     1152,     2304, 0x23547f7d
+0,     479232,     479232,     1152,     2304, 0x2eee7892
+0,     480384,     480384,     1152,     2304, 0xfb837cba
+0,     481536,     481536,     1152,     2304, 0x86518209
+0,     482688,     482688,     1152,     2304, 0x672f7bba
+0,     483840,     483840,     1152,     2304, 0x6ab583fb
+0,     484992,     484992,     1152,     2304, 0xc1297428
+0,     486144,     486144,     1152,     2304, 0x164e7717
+0,     487296,     487296,     1152,     2304, 0xb754976d
+0,     488448,     488448,     1152,     2304, 0xb99d81b2
+0,     489600,     489600,     1152,     2304, 0x79046fd6
+0,     490752,     490752,     1152,     2304, 0x9a3f8426
+0,     491904,     491904,     1152,     2304, 0x896371f5
+0,     493056,     493056,     1152,     2304, 0x63d1799f
+0,     494208,     494208,     1152,     2304, 0x4842844e
+0,     495360,     495360,     1152,     2304, 0x850e8372
+0,     496512,     496512,     1152,     2304, 0x85d07022
+0,     497664,     497664,     1152,     2304, 0x9e6683d1
+0,     498816,     498816,     1152,     2304, 0x301b8981
+0,     499968,     499968,     1152,     2304, 0x1f1e98c5
+0,     501120,     501120,     1152,     2304, 0xc8797b03
+0,     502272,     502272,     1152,     2304, 0xf9d189f5
+0,     503424,     503424,     1152,     2304, 0x0e0d88be
+0,     504576,     504576,     1152,     2304, 0x6c1d7843
+0,     505728,     505728,     1152,     2304, 0xd13b8a38
+0,     506880,     506880,     1152,     2304, 0x9b8f773c
+0,     508032,     508032,     1152,     2304, 0x9acd7309
+0,     509184,     509184,     1152,     2304, 0x5e7d7d15
+0,     510336,     510336,     1152,     2304, 0xf09d7640
+0,     511488,     511488,     1152,     2304, 0xaebb718f
+0,     512640,     512640,     1152,     2304, 0x0c8570f4
+0,     513792,     513792,     1152,     2304, 0x3c93862c
+0,     514944,     514944,     1152,     2304, 0xcee46696
+0,     516096,     516096,     1152,     2304, 0x01ba7e20
+0,     517248,     517248,     1152,     2304, 0x7fcb7a09
+0,     518400,     518400,     1152,     2304, 0xddf18c14
+0,     519552,     519552,     1152,     2304, 0xd2e97eeb
+0,     520704,     520704,     1152,     2304, 0x514d8719
+0,     521856,     521856,     1152,     2304, 0xe89279c9
+0,     523008,     523008,     1152,     2304, 0x806d6a95
+0,     524160,     524160,     1152,     2304, 0xbc7a8a60
+0,     525312,     525312,     1152,     2304, 0x302f8fa8
+0,     526464,     526464,     1152,     2304, 0xb136784c
+0,     527616,     527616,     1152,     2304, 0x9b0f6aab
+0,     528768,     528768,     1152,     2304, 0xd8e27582
+0,     529920,     529920,     1152,     2304, 0xdaaf78b1
+0,     531072,     531072,     1152,     2304, 0x65967f5f
+0,     532224,     532224,     1152,     2304, 0x6f917aa4
+0,     533376,     533376,     1152,     2304, 0x7f607444
+0,     534528,     534528,     1152,     2304, 0xfd316f2c
+0,     535680,     535680,     1152,     2304, 0x776e83c7
+0,     536832,     536832,     1152,     2304, 0xb9c17e16
+0,     537984,     537984,     1152,     2304, 0xdf287de8
+0,     539136,     539136,     1152,     2304, 0xf33d96a3
+0,     540288,     540288,     1152,     2304, 0xad216e5b
+0,     541440,     541440,     1152,     2304, 0x4a328342
+0,     542592,     542592,     1152,     2304, 0xcf3f8079
+0,     543744,     543744,     1152,     2304, 0xb46f77b0
+0,     544896,     544896,     1152,     2304, 0x3199713d
+0,     546048,     546048,     1152,     2304, 0x5e667a0d
+0,     547200,     547200,     1152,     2304, 0xa3047ae3
+0,     548352,     548352,     1152,     2304, 0x9edf8594
+0,     549504,     549504,     1152,     2304, 0xd16382d5
+0,     550656,     550656,     1152,     2304, 0x6e838328
+0,     551808,     551808,     1152,     2304, 0xa1f697c1
+0,     552960,     552960,     1152,     2304, 0xefcc749c
+0,     554112,     554112,     1152,     2304, 0x1f94839e
+0,     555264,     555264,     1152,     2304, 0x429e7c5b
+0,     556416,     556416,     1152,     2304, 0x9b59711c
+0,     557568,     557568,     1152,     2304, 0xdac27323
+0,     558720,     558720,     1152,     2304, 0xa4856d2b
+0,     559872,     559872,     1152,     2304, 0x07a37498
+0,     561024,     561024,     1152,     2304, 0xe1ce7512
+0,     562176,     562176,     1152,     2304, 0x15e182c3
+0,     563328,     563328,     1152,     2304, 0x0fa46b8c
+0,     564480,     564480,     1152,     2304, 0xbdf07bfd
+0,     565632,     565632,     1152,     2304, 0xe0238b2a
+0,     566784,     566784,     1152,     2304, 0xab537267
+0,     567936,     567936,     1152,     2304, 0xd46b75f3
+0,     569088,     569088,     1152,     2304, 0xec73794b
+0,     570240,     570240,     1152,     2304, 0x680580c1
+0,     571392,     571392,     1152,     2304, 0x1ace8f6c
+0,     572544,     572544,     1152,     2304, 0x19d583ac
+0,     573696,     573696,     1152,     2304, 0x4b6b8105
+0,     574848,     574848,     1152,     2304, 0x392a78b2
+0,     576000,     576000,     1152,     2304, 0xd3916dad
+0,     577152,     577152,     1152,     2304, 0x569c7a75
+0,     578304,     578304,     1152,     2304, 0xf5ac814b
+0,     579456,     579456,     1152,     2304, 0x18d77e98
+0,     580608,     580608,     1152,     2304, 0x007074ce
+0,     581760,     581760,     1152,     2304, 0x0fe38373
+0,     582912,     582912,     1152,     2304, 0x5a967920
+0,     584064,     584064,     1152,     2304, 0x22167501
+0,     585216,     585216,     1152,     2304, 0xf0828cab
+0,     586368,     586368,     1152,     2304, 0xaeec71b7
+0,     587520,     587520,     1152,     2304, 0xc47b62ff
+0,     588672,     588672,     1152,     2304, 0xab688478
+0,     589824,     589824,     1152,     2304, 0xf35e7bd2
+0,     590976,     590976,     1152,     2304, 0x9cff763e
+0,     592128,     592128,     1152,     2304, 0x59568dc8
+0,     593280,     593280,     1152,     2304, 0x51a278ac
+0,     594432,     594432,     1152,     2304, 0xc08a6e68
+0,     595584,     595584,     1152,     2304, 0xd3067ef4
+0,     596736,     596736,     1152,     2304, 0x54767c49
+0,     597888,     597888,     1152,     2304, 0xf8ff8386
+0,     599040,     599040,     1152,     2304, 0xef267f63
+0,     600192,     600192,     1152,     2304, 0xe2537cd9
+0,     601344,     601344,     1152,     2304, 0x77a57680
+0,     602496,     602496,     1152,     2304, 0x325c74ad
+0,     603648,     603648,     1152,     2304, 0xd7fe87c4
+0,     604800,     604800,     1152,     2304, 0x2e756310
+0,     605952,     605952,     1152,     2304, 0x6a81796b
+0,     607104,     607104,     1152,     2304, 0x2f057daf
+0,     608256,     608256,     1152,     2304, 0xcd9f7c9d
+0,     609408,     609408,     1152,     2304, 0xc91560a0
+0,     610560,     610560,     1152,     2304, 0x962a91eb
+0,     611712,     611712,     1152,     2304, 0xa0ff7416
+0,     612864,     612864,     1152,     2304, 0xcb5c7dff
+0,     614016,     614016,     1152,     2304, 0xd3527041
+0,     615168,     615168,     1152,     2304, 0xc89d77c2
+0,     616320,     616320,     1152,     2304, 0xe1ce7ccf
+0,     617472,     617472,     1152,     2304, 0xe3417c4c
+0,     618624,     618624,     1152,     2304, 0x3f1a7166
+0,     619776,     619776,     1152,     2304, 0xcdcc7e23
+0,     620928,     620928,     1152,     2304, 0x4e727e97
+0,     622080,     622080,     1152,     2304, 0x53427ff1
+0,     623232,     623232,     1152,     2304, 0x173f6ca9
+0,     624384,     624384,     1152,     2304, 0x962887ec
+0,     625536,     625536,     1152,     2304, 0xcbec67f4
+0,     626688,     626688,     1152,     2304, 0x7a2c943d
+0,     627840,     627840,     1152,     2304, 0x8b877570
+0,     628992,     628992,     1152,     2304, 0xcf337323
+0,     630144,     630144,     1152,     2304, 0x8c8682a4
+0,     631296,     631296,     1152,     2304, 0x94c3753c
+0,     632448,     632448,     1152,     2304, 0x86898d79
+0,     633600,     633600,     1152,     2304, 0xdf667312
+0,     634752,     634752,     1152,     2304, 0x062f8ba8
+0,     635904,     635904,     1152,     2304, 0xa2c36f08
+0,     637056,     637056,     1152,     2304, 0x5bca7358
+0,     638208,     638208,     1152,     2304, 0x5648804d
+0,     639360,     639360,     1152,     2304, 0xefac87c8
+0,     640512,     640512,     1152,     2304, 0x66bf7dcf
+0,     641664,     641664,     1152,     2304, 0x62ad73bc
+0,     642816,     642816,     1152,     2304, 0x72fe630c
+0,     643968,     643968,     1152,     2304, 0xeebe87da
+0,     645120,     645120,     1152,     2304, 0x11c870cf
+0,     646272,     646272,     1152,     2304, 0x18fb7c27
+0,     647424,     647424,     1152,     2304, 0x39047145
+0,     648576,     648576,     1152,     2304, 0xdcf07032
+0,     649728,     649728,     1152,     2304, 0x61027c50
+0,     650880,     650880,     1152,     2304, 0x6e2e89de
+0,     652032,     652032,     1152,     2304, 0xc50c6d1d
+0,     653184,     653184,     1152,     2304, 0xeed587ee
+0,     654336,     654336,     1152,     2304, 0xe38269c7
+0,     655488,     655488,     1152,     2304, 0xcf66806e
+0,     656640,     656640,     1152,     2304, 0x2d3b7c1b
+0,     657792,     657792,     1152,     2304, 0xa4127d48
+0,     658944,     658944,     1152,     2304, 0x480b8325
+0,     660096,     660096,     1152,     2304, 0xc1527221
+0,     661248,     661248,     1152,     2304, 0x94c1769a
+0,     662400,     662400,     1152,     2304, 0xcfb37271
+0,     663552,     663552,     1152,     2304, 0x946d7a96
+0,     664704,     664704,     1152,     2304, 0xdfc18e50
+0,     665856,     665856,     1152,     2304, 0x10c48393
+0,     667008,     667008,     1152,     2304, 0x58556b10
+0,     668160,     668160,     1152,     2304, 0x997b7993
+0,     669312,     669312,     1152,     2304, 0x4a787992
+0,     670464,     670464,     1152,     2304, 0x11406c20
+0,     671616,     671616,     1152,     2304, 0x04a4874a
+0,     672768,     672768,     1152,     2304, 0xf3077164
+0,     673920,     673920,     1152,     2304, 0x08ac80e3
+0,     675072,     675072,     1152,     2304, 0x268370d0
+0,     676224,     676224,     1152,     2304, 0x1d137778
+0,     677376,     677376,     1152,     2304, 0xfa148e97
+0,     678528,     678528,     1152,     2304, 0xec50717c
+0,     679680,     679680,     1152,     2304, 0xcbf46b75
+0,     680832,     680832,     1152,     2304, 0xd4168038
+0,     681984,     681984,     1152,     2304, 0xdd9577f0
+0,     683136,     683136,     1152,     2304, 0xc7077685
+0,     684288,     684288,     1152,     2304, 0x34d25e91
+0,     685440,     685440,     1152,     2304, 0x96537e6d
+0,     686592,     686592,     1152,     2304, 0xb12e7940
+0,     687744,     687744,     1152,     2304, 0x861d64c0
+0,     688896,     688896,     1152,     2304, 0xa2bc64ed
+0,     690048,     690048,     1152,     2304, 0x0c5f8261
+0,     691200,     691200,     1152,     2304, 0x540584ff
+0,     692352,     692352,     1152,     2304, 0xe8328b09
+0,     693504,     693504,     1152,     2304, 0x1e777079
+0,     694656,     694656,     1152,     2304, 0x453483b4
+0,     695808,     695808,     1152,     2304, 0x1cab7a1e
+0,     696960,     696960,     1152,     2304, 0xcb37856d
+0,     698112,     698112,     1152,     2304, 0x5a4883ed
+0,     699264,     699264,     1152,     2304, 0xd1f27cbf
+0,     700416,     700416,     1152,     2304, 0x0d377a4d
+0,     701568,     701568,     1152,     2304, 0x264e76df
+0,     702720,     702720,     1152,     2304, 0x2a68771e
+0,     703872,     703872,     1152,     2304, 0xcb317a31
+0,     705024,     705024,     1152,     2304, 0xfc5d7a27
+0,     706176,     706176,     1152,     2304, 0x6e067d96
+0,     707328,     707328,     1152,     2304, 0x0c538560
+0,     708480,     708480,     1152,     2304, 0xfbad717a
+0,     709632,     709632,     1152,     2304, 0xf9fc7608
+0,     710784,     710784,     1152,     2304, 0xb1817c8f
+0,     711936,     711936,     1152,     2304, 0x57c37f82
+0,     713088,     713088,     1152,     2304, 0x8cac8356
+0,     714240,     714240,     1152,     2304, 0x97108186
+0,     715392,     715392,     1152,     2304, 0x095d81bb
+0,     716544,     716544,     1152,     2304, 0x475f6b2b
+0,     717696,     717696,     1152,     2304, 0xdf7c8cc5
+0,     718848,     718848,     1152,     2304, 0x979c77be
+0,     720000,     720000,     1152,     2304, 0x56a7844b
+0,     721152,     721152,     1152,     2304, 0x7ee46b21
+0,     722304,     722304,     1152,     2304, 0x05b67220
+0,     723456,     723456,     1152,     2304, 0x25787252
+0,     724608,     724608,     1152,     2304, 0x8ad278ad
+0,     725760,     725760,     1152,     2304, 0x67bd722e
+0,     726912,     726912,     1152,     2304, 0x204f77be
+0,     728064,     728064,     1152,     2304, 0x82d27ae2
+0,     729216,     729216,     1152,     2304, 0x23fa82e4
+0,     730368,     730368,     1152,     2304, 0xa9cf8159
+0,     731520,     731520,     1152,     2304, 0x13f08749
+0,     732672,     732672,     1152,     2304, 0xf84f71b5
+0,     733824,     733824,     1152,     2304, 0x1cb777c8
+0,     734976,     734976,     1152,     2304, 0x11236722
+0,     736128,     736128,     1152,     2304, 0x10197cac
+0,     737280,     737280,     1152,     2304, 0xbd417e65
+0,     738432,     738432,     1152,     2304, 0x9a1c7d05
+0,     739584,     739584,     1152,     2304, 0x4c3a85de
+0,     740736,     740736,     1152,     2304, 0x03816eb7
+0,     741888,     741888,     1152,     2304, 0x80186e6c
+0,     743040,     743040,     1152,     2304, 0x5c097928
+0,     744192,     744192,     1152,     2304, 0x94aa823d
+0,     745344,     745344,     1152,     2304, 0xa1c27f04
+0,     746496,     746496,     1152,     2304, 0x6ddb74a9
+0,     747648,     747648,     1152,     2304, 0x5ea67901
+0,     748800,     748800,     1152,     2304, 0xd710742d
+0,     749952,     749952,     1152,     2304, 0xf8c27add
+0,     751104,     751104,     1152,     2304, 0xf1717011
+0,     752256,     752256,     1152,     2304, 0xb59072d0
+0,     753408,     753408,     1152,     2304, 0xc8dc84a7
+0,     754560,     754560,     1152,     2304, 0x33116737
+0,     755712,     755712,     1152,     2304, 0x86216bdd
+0,     756864,     756864,     1152,     2304, 0xa2f87866
+0,     758016,     758016,     1152,     2304, 0x5d77771e
+0,     759168,     759168,     1152,     2304, 0x5d8c77fd
+0,     760320,     760320,     1152,     2304, 0x23cc89cb
+0,     761472,     761472,     1152,     2304, 0x334e7407
+0,     762624,     762624,     1152,     2304, 0x01c976ff
+0,     763776,     763776,     1152,     2304, 0x3a3b7b15
+0,     764928,     764928,     1152,     2304, 0xfa427de9
+0,     766080,     766080,     1152,     2304, 0xbeaa7c91
+0,     767232,     767232,     1152,     2304, 0xd6988b31
+0,     768384,     768384,     1152,     2304, 0x4db47f80
+0,     769536,     769536,     1152,     2304, 0xea687d9e
+0,     770688,     770688,     1152,     2304, 0x1a6281ce
+0,     771840,     771840,     1152,     2304, 0xe1958003
+0,     772992,     772992,     1152,     2304, 0xb4ae7c5e
+0,     774144,     774144,     1152,     2304, 0x28827c8a
+0,     775296,     775296,     1152,     2304, 0x1fb88b25
+0,     776448,     776448,     1152,     2304, 0x588d71e8
+0,     777600,     777600,     1152,     2304, 0x68227c34
+0,     778752,     778752,     1152,     2304, 0xee4d73e8
+0,     779904,     779904,     1152,     2304, 0x69287c6d
+0,     781056,     781056,     1152,     2304, 0xbb04926a
+0,     782208,     782208,     1152,     2304, 0x89456cec
+0,     783360,     783360,     1152,     2304, 0xabe18992
+0,     784512,     784512,     1152,     2304, 0x50cc7f6c
+0,     785664,     785664,     1152,     2304, 0x6d7270be
+0,     786816,     786816,     1152,     2304, 0x664c6fef
+0,     787968,     787968,     1152,     2304, 0x7f7982f3
+0,     789120,     789120,     1152,     2304, 0x6ca170e9
+0,     790272,     790272,     1152,     2304, 0x36437d5b
+0,     791424,     791424,     1152,     2304, 0xfd2380e8
+0,     792576,     792576,     1152,     2304, 0x2e3c6e9f
+0,     793728,     793728,     1152,     2304, 0xc8427f3f
+0,     794880,     794880,     1152,     2304, 0x962a79ad
+0,     796032,     796032,     1152,     2304, 0xc9597c8b
+0,     797184,     797184,     1152,     2304, 0x899580bb
+0,     798336,     798336,     1152,     2304, 0x2d179dff
+0,     799488,     799488,     1152,     2304, 0x4ac1707c
+0,     800640,     800640,     1152,     2304, 0x32ea7e95
+0,     801792,     801792,     1152,     2304, 0x265e9a2d
+0,     802944,     802944,     1152,     2304, 0x1c6484d0
+0,     804096,     804096,     1152,     2304, 0x39ae6884
+0,     805248,     805248,     1152,     2304, 0x82ed7bc5
+0,     806400,     806400,     1152,     2304, 0x556b7b3c
+0,     807552,     807552,     1152,     2304, 0xb7f778dd
+0,     808704,     808704,     1152,     2304, 0x74447d55
+0,     809856,     809856,     1152,     2304, 0x0c66861e
+0,     811008,     811008,     1152,     2304, 0x15ba7932
+0,     812160,     812160,     1152,     2304, 0xb19170fc
+0,     813312,     813312,     1152,     2304, 0x19d37551
+0,     814464,     814464,     1152,     2304, 0xdc529142
+0,     815616,     815616,     1152,     2304, 0xf2637e77
+0,     816768,     816768,     1152,     2304, 0xd065944b
+0,     817920,     817920,     1152,     2304, 0x22878123
+0,     819072,     819072,     1152,     2304, 0xc21a8bf7
+0,     820224,     820224,     1152,     2304, 0x2e3582dc
+0,     821376,     821376,     1152,     2304, 0xd42f7987
+0,     822528,     822528,     1152,     2304, 0x69b88236
+0,     823680,     823680,     1152,     2304, 0x7c988f90
+0,     824832,     824832,     1152,     2304, 0x2cd66ded
+0,     825984,     825984,     1152,     2304, 0x3e65828b
+0,     827136,     827136,     1152,     2304, 0x7e9871c9
+0,     828288,     828288,     1152,     2304, 0xf1f2806b
+0,     829440,     829440,     1152,     2304, 0xf5087c7b
+0,     830592,     830592,     1152,     2304, 0x62b98097
+0,     831744,     831744,     1152,     2304, 0xec457c43
+0,     832896,     832896,     1152,     2304, 0x87af87a6
+0,     834048,     834048,     1152,     2304, 0x97cc757d
+0,     835200,     835200,     1152,     2304, 0x08ca76bd
+0,     836352,     836352,     1152,     2304, 0x14ae7cbd
+0,     837504,     837504,     1152,     2304, 0x1f79709a
+0,     838656,     838656,     1152,     2304, 0x17948207
+0,     839808,     839808,     1152,     2304, 0x16ee7228
+0,     840960,     840960,     1152,     2304, 0x76cc82d7
+0,     842112,     842112,     1152,     2304, 0x8f327a8e
+0,     843264,     843264,     1152,     2304, 0x14ee7756
+0,     844416,     844416,     1152,     2304, 0x15996d2f
+0,     845568,     845568,     1152,     2304, 0x4c707d5c
+0,     846720,     846720,     1152,     2304, 0x268c6fee
+0,     847872,     847872,     1152,     2304, 0x6d838c76
+0,     849024,     849024,     1152,     2304, 0xafa17e64
+0,     850176,     850176,     1152,     2304, 0xb6546e66
+0,     851328,     851328,     1152,     2304, 0x945d8b9f
+0,     852480,     852480,     1152,     2304, 0x5bfb7446
+0,     853632,     853632,     1152,     2304, 0xae6086f9
+0,     854784,     854784,     1152,     2304, 0xa01380cd
+0,     855936,     855936,     1152,     2304, 0x06f0828f
+0,     857088,     857088,     1152,     2304, 0x0ae07176
+0,     858240,     858240,     1152,     2304, 0x66f07522
+0,     859392,     859392,     1152,     2304, 0x44018106
+0,     860544,     860544,     1152,     2304, 0x8cd283da
+0,     861696,     861696,     1152,     2304, 0x14257f45
+0,     862848,     862848,     1152,     2304, 0x04979537
+0,     864000,     864000,     1152,     2304, 0x8b5f797c
+0,     865152,     865152,     1152,     2304, 0x12d67493
+0,     866304,     866304,     1152,     2304, 0xc8886a25
+0,     867456,     867456,     1152,     2304, 0x614b803a
+0,     868608,     868608,     1152,     2304, 0x75667d35
+0,     869760,     869760,     1152,     2304, 0xe42c7b00
+0,     870912,     870912,     1152,     2304, 0x37787927
+0,     872064,     872064,     1152,     2304, 0x85db8409
+0,     873216,     873216,     1152,     2304, 0x823b822c
+0,     874368,     874368,     1152,     2304, 0xa1658479
+0,     875520,     875520,     1152,     2304, 0xdbe58ff7
+0,     876672,     876672,     1152,     2304, 0x725175e2
+0,     877824,     877824,     1152,     2304, 0xb2ae7741
+0,     878976,     878976,     1152,     2304, 0x4de169e4
+0,     880128,     880128,     1152,     2304, 0x3cb18530
+0,     881280,     881280,     1152,     2304, 0x5a0c5e7b
diff --git a/tests/ref/fate/limited_input_seek b/tests/ref/fate/limited_input_seek
index e0c4bf1..3269dce 100644
--- a/tests/ref/fate/limited_input_seek
+++ b/tests/ref/fate/limited_input_seek
@@ -1 +1 @@
-20a1bb9a1cfb23c1fe86f14e6065cd95
+ae878bdaec23f36a63d142165fe57f49
diff --git a/tests/ref/fate/limited_input_seek-copyts b/tests/ref/fate/limited_input_seek-copyts
index 92790a8..6eeaef8 100644
--- a/tests/ref/fate/limited_input_seek-copyts
+++ b/tests/ref/fate/limited_input_seek-copyts
@@ -1 +1 @@
-ec3604b1954ed80de364b8ef491771ce
+ffe8a674bdf38e4f650f91963debc654
diff --git a/tests/ref/fate/lossless-truehd-5.1 b/tests/ref/fate/lossless-truehd-5.1
deleted file mode 100644
index 373b917..0000000
--- a/tests/ref/fate/lossless-truehd-5.1
+++ /dev/null
@@ -1 +0,0 @@
-95d8aac39dd9f0d7fb83dc7b6f88df35
diff --git a/tests/ref/fate/lossless-truehd-5.1-downmix-2.0 b/tests/ref/fate/lossless-truehd-5.1-downmix-2.0
deleted file mode 100644
index f4afbc1..0000000
--- a/tests/ref/fate/lossless-truehd-5.1-downmix-2.0
+++ /dev/null
@@ -1 +0,0 @@
-a269aee0051d4400c9117136f08c9767
diff --git a/tests/ref/fate/matroska-flac-channel-mapping b/tests/ref/fate/matroska-flac-channel-mapping
new file mode 100644
index 0000000..6d90160
--- /dev/null
+++ b/tests/ref/fate/matroska-flac-channel-mapping
@@ -0,0 +1,38 @@
+#extradata 0:       34, 0x7a7909e5
+#extradata 1:       34, 0x7a7909e5
+#tb 0: 651/31250000
+#media_type 0: audio
+#codec_id 0: flac
+#sample_rate 0: 48000
+#channel_layout 0: 3f
+#channel_layout_name 0: 5.1
+#tb 1: 651/31250000
+#media_type 1: audio
+#codec_id 1: flac
+#sample_rate 1: 48000
+#channel_layout 1: 60f
+#channel_layout_name 1: 5.1(side)
+0,          0,          0,     4096,       26, 0x50f80431
+1,          0,          0,     4096,       26, 0x50f80431
+0,       4096,       4096,     4096,       26, 0x50d30416
+1,       4096,       4096,     4096,       26, 0x50d30416
+0,       8192,       8192,     4096,       26, 0x51ee046f
+1,       8192,       8192,     4096,       26, 0x51ee046f
+0,      12288,      12288,     4096,       26, 0x521d0458
+1,      12288,      12288,     4096,       26, 0x521d0458
+0,      16385,      16385,     4096,       26, 0x531c043d
+1,      16385,      16385,     4096,       26, 0x531c043d
+0,      20481,      20481,     4096,       26, 0x53cf0442
+1,      20481,      20481,     4096,       26, 0x53cf0442
+0,      24577,      24577,     4096,       26, 0x536a0473
+1,      24577,      24577,     4096,       26, 0x536a0473
+0,      28673,      28673,     4096,       26, 0x5321046c
+1,      28673,      28673,     4096,       26, 0x5321046c
+0,      32770,      32770,     4096,       26, 0x51b00449
+1,      32770,      32770,     4096,       26, 0x51b00449
+0,      36866,      36866,     4096,       26, 0x518b042e
+1,      36866,      36866,     4096,       26, 0x518b042e
+0,      40962,      40962,     4096,       26, 0x50f60447
+1,      40962,      40962,     4096,       26, 0x50f60447
+0,      45059,      45059,     3072,       28, 0x72540504
+1,      45059,      45059,     3072,       28, 0x72540504
diff --git a/tests/ref/fate/matroska-flac-extradata-update b/tests/ref/fate/matroska-flac-extradata-update
new file mode 100644
index 0000000..8b57590
--- /dev/null
+++ b/tests/ref/fate/matroska-flac-extradata-update
@@ -0,0 +1,53 @@
+332bf4d9c92d24478d2a218e81223433 *tests/data/fate/matroska-flac-extradata-update.matroska
+2011 tests/data/fate/matroska-flac-extradata-update.matroska
+#extradata 0:       34, 0x7acb09e7
+#extradata 1:       34, 0x7acb09e7
+#extradata 2:       34, 0x443402dd
+#tb 0: 1/1000
+#media_type 0: audio
+#codec_id 0: flac
+#sample_rate 0: 48000
+#channel_layout 0: 3f
+#channel_layout_name 0: 5.1
+#tb 1: 1/1000
+#media_type 1: audio
+#codec_id 1: flac
+#sample_rate 1: 48000
+#channel_layout 1: 60f
+#channel_layout_name 1: 5.1(side)
+#tb 2: 1/1000
+#media_type 2: audio
+#codec_id 2: flac
+#sample_rate 2: 48000
+#channel_layout 2: 3f
+#channel_layout_name 2: 5.1
+0,          0,          0,       96,       26, 0x4e160341
+1,          0,          0,       96,       26, 0x4e160341
+2,          0,          0,       96,       26, 0x4e160341
+0,         96,         96,       96,       26, 0x4e17035c
+1,         96,         96,       96,       26, 0x4e17035c
+2,         96,         96,       96,       26, 0x4e17035c
+0,        192,        192,       96,       26, 0x4de40383
+1,        192,        192,       96,       26, 0x4de40383
+2,        192,        192,       96,       26, 0x4de40383
+0,        288,        288,       96,       26, 0x4e3903a2
+1,        288,        288,       96,       26, 0x4e3903a2
+2,        288,        288,       96,       26, 0x4e3903a2
+0,        384,        384,       96,       26, 0x4f9a03d5
+1,        384,        384,       96,       26, 0x4f9a03d5
+2,        384,        384,       96,       26, 0x4f9a03d5
+0,        480,        480,       96,       26, 0x501303e0
+1,        480,        480,       96,       26, 0x501303e0
+2,        480,        480,       96,       26, 0x501303e0
+0,        576,        576,       96,       26, 0x5160042f
+1,        576,        576,       96,       26, 0x5160042f
+2,        576,        576,       96,       26, 0x5160042f
+0,        672,        672,       96,       26, 0x50dd042e
+1,        672,        672,       96,       26, 0x50dd042e
+2,        672,        672,       96,       26, 0x50dd042e
+0,        768,        768,       96,       26, 0x53de0499
+1,        768,        768,       96,       26, 0x53de0499
+0,        864,        864,       96,       26, 0x53df04b4
+1,        864,        864,       96,       26, 0x53df04b4
+0,        960,        960,       42,       26, 0x5740044b
+1,        960,        960,       42,       26, 0x5740044b
diff --git a/tests/ref/fate/matroska-lzo-decompression b/tests/ref/fate/matroska-lzo-decompression
new file mode 100644
index 0000000..241d5ad
--- /dev/null
+++ b/tests/ref/fate/matroska-lzo-decompression
@@ -0,0 +1,10 @@
+#tb 0: 11337/500000000
+#media_type 0: audio
+#codec_id 0: pcm_s16le
+#sample_rate 0: 44100
+#channel_layout 0: 3
+#channel_layout_name 0: stereo
+0,          0,          0,     4096,    16384, 0x00000000
+0,       4096,       4096,     4096,    16384, 0xad7eebf4
+0,       8192,       8192,     4096,    16384, 0x1d1ff9d9
+0,      12288,      12288,     4097,    16384, 0xf1d9e2e2
diff --git a/tests/ref/fate/matroska-prores-header-insertion-bz2 b/tests/ref/fate/matroska-prores-header-insertion-bz2
new file mode 100644
index 0000000..63a59f9
--- /dev/null
+++ b/tests/ref/fate/matroska-prores-header-insertion-bz2
@@ -0,0 +1,16 @@
+#extradata 0:        4, 0x0402019c
+#extradata 1:        4, 0x0402019c
+#tb 0: 1/1000
+#media_type 0: video
+#codec_id 0: prores
+#dimensions 0: 720x480
+#sar 0: 186/157
+#tb 1: 1/1000
+#media_type 1: video
+#codec_id 1: prores
+#dimensions 1: 720x480
+#sar 1: 186/157
+0,          0,          0,        0,     4304, 0x3625b1fc
+1,          0,          0,        0,     4304, 0x3625b1fc
+0,         42,         42,        0,     4304, 0x3625b1fc
+1,         42,         42,        0,     4304, 0x3625b1fc
diff --git a/tests/ref/fate/matroska-prores-zlib b/tests/ref/fate/matroska-prores-zlib
new file mode 100644
index 0000000..d88015c
--- /dev/null
+++ b/tests/ref/fate/matroska-prores-zlib
@@ -0,0 +1,8 @@
+#extradata 0:        4, 0x040801a2
+#tb 0: 1/1000
+#media_type 0: video
+#codec_id 0: prores
+#dimensions 0: 1920x1080
+#sar 0: 1/1
+0,          0,          0,       33,    82240, 0x5271abe6
+0,         33,         33,       33,    82240, 0x5271abe6
diff --git a/tests/ref/fate/matroska-wavpack-missing-codecprivate b/tests/ref/fate/matroska-wavpack-missing-codecprivate
new file mode 100644
index 0000000..4645a86
--- /dev/null
+++ b/tests/ref/fate/matroska-wavpack-missing-codecprivate
@@ -0,0 +1,9 @@
+#extradata 0:        2, 0x00240014
+#tb 0: 11337/500000000
+#media_type 0: audio
+#codec_id 0: wavpack
+#sample_rate 0: 44100
+#channel_layout 0: 3
+#channel_layout_name 0: stereo
+0,          0,          0,    22051,    14778, 0x02819286
+0,      22051,      22051,    22052,    14756, 0x21976243
diff --git a/tests/ref/fate/matroska-xiph-lacing b/tests/ref/fate/matroska-xiph-lacing
new file mode 100644
index 0000000..c74cf99
--- /dev/null
+++ b/tests/ref/fate/matroska-xiph-lacing
@@ -0,0 +1,91 @@
+#extradata 0:     3766, 0xde3392f7
+#tb 0: 11337/500000000
+#media_type 0: audio
+#codec_id 0: vorbis
+#sample_rate 0: 44100
+#channel_layout 0: 3
+#channel_layout_name 0: stereo
+0,          0,          0,      128,       84, 0x1beb2cc9
+0,        128,        128,      576,      533, 0xa5d425e9
+0,        704,        704,     1024,      505, 0x4b970e01
+0,       1728,       1728,     1024,      503, 0x8f4b0607
+0,       2752,       2752,     1024,      507, 0x546e0bc6
+0,       3776,       3776,     1024,      507, 0xe006103f
+0,       4800,       4800,     1024,      502, 0xc7770a66
+0,       5824,       5824,     1024,      500, 0x89690d08
+0,       6785,       6785,     1024,      501, 0x47c50720
+0,       7809,       7809,     1024,      490, 0x4b5efd2d
+0,       8833,       8833,     1024,      510, 0xa5110fdf
+0,       9857,       9857,      576,       80, 0x6d1129bd
+0,      10433,      10433,      128,       84, 0x18272cc1
+0,      10561,      10561,      128,       79, 0x7720262e
+0,      10689,      10689,      128,       83, 0x5d1c2d22
+0,      10817,      10817,      128,       84, 0xbbdc2c28
+0,      10945,      10945,      128,      154, 0x2c41556c
+0,      11073,      11073,      128,      148, 0xdd135006
+0,      11201,      11201,      128,      151, 0xf4b253b4
+0,      11329,      11329,      128,       91, 0x258a34b8
+0,      11457,      11457,      128,       79, 0x654923dc
+0,      11585,      11585,      128,       88, 0xb3853007
+0,      11713,      11713,      128,       84, 0x33a72c00
+0,      11841,      11841,      128,       86, 0x38802c2f
+0,      11969,      11969,      128,      155, 0x923253ce
+0,      12097,      12097,      128,      138, 0x0d3a408d
+0,      12225,      12225,      128,      140, 0x95ca470e
+0,      12353,      12353,      576,      481, 0x6d6de7fd
+0,      12929,      12929,     1024,      474, 0x74bee6fb
+0,      13953,      13953,     1024,      446, 0x777be048
+0,      14977,      14977,     1024,      469, 0x9b49e7bd
+0,      16001,      16001,     1024,      458, 0xb728df34
+0,      17025,      17025,     1024,      460, 0x1519e267
+0,      18049,      18049,     1024,      467, 0x391ff1ab
+0,      19073,      19073,     1024,      464, 0x7b4ff249
+0,      20097,      20097,      576,      144, 0x9daa47e4
+0,      20673,      20673,      128,      151, 0xc8b24f08
+0,      20801,      20801,      128,      134, 0xfda444ec
+0,      20929,      20929,      576,      428, 0x2ad8d2de
+0,      21505,      21505,      576,       80, 0xcdf12536
+0,      22082,      22082,      128,      143, 0x935a4d4e
+0,      22210,      22210,      128,      140, 0xb99a4ee5
+0,      22338,      22338,      128,      141, 0xf36954b9
+0,      22466,      22466,      128,      151, 0x13b9505c
+0,      22594,      22594,      128,      142, 0xd8734a5f
+0,      22722,      22722,      576,      465, 0x9e6ceade
+0,      23298,      23298,     1024,      480, 0x6e98f308
+0,      24322,      24322,     1024,      465, 0xeecdeac4
+0,      25346,      25346,     1024,      464, 0x2a0cec3c
+0,      26370,      26370,     1024,      487, 0xc66d0123
+0,      27394,      27394,     1024,      505, 0x0d1f0d85
+0,      28418,      28418,     1024,      479, 0x8d3af09e
+0,      29442,      29442,     1024,      485, 0x4927fa6a
+0,      30466,      30466,     1024,      483, 0x95c102a7
+0,      31490,      31490,     1024,      467, 0x7646ec5b
+0,      32514,      32514,     1024,      492, 0x967505e9
+0,      33539,      33539,     1024,      491, 0x06670254
+0,      34563,      34563,      576,       76, 0x994e25d8
+0,      35139,      35139,      128,       84, 0xc8ba2a76
+0,      35267,      35267,      128,       90, 0x0008339a
+0,      35395,      35395,      128,       84, 0x3d722790
+0,      35523,      35523,      128,       76, 0x3d5c23bf
+0,      35651,      35651,      128,       82, 0x4cba28a1
+0,      35779,      35779,      128,      157, 0xf79058e2
+0,      35907,      35907,      128,      141, 0x72a24a6c
+0,      36035,      36035,      576,      498, 0x5a200efb
+0,      36611,      36611,     1024,      489, 0x135dfd19
+0,      37635,      37635,     1024,      509, 0x98580e17
+0,      38659,      38659,     1024,      508, 0x05851706
+0,      39683,      39683,      576,       89, 0xc7872e24
+0,      40259,      40259,      128,       87, 0x956e2e17
+0,      40387,      40387,      128,       91, 0x382e2fd0
+0,      40515,      40515,      128,       90, 0x6a6830f1
+0,      40643,      40643,      128,       88, 0xa50432da
+0,      40771,      40771,      128,       85, 0xac5f30b2
+0,      40899,      40899,      128,      155, 0x4fa559da
+0,      41027,      41027,      128,      154, 0x62535bad
+0,      41155,      41155,      128,      155, 0x056c5a66
+0,      41283,      41283,      576,      499, 0xa19af50c
+0,      41859,      41859,     1024,      495, 0xdd9c008b
+0,      42883,      42883,      576,       83, 0x85722403
+0,      43459,      43459,      128,      155, 0x43ad5339
+0,      43587,      43587,      128,      144, 0x70804dd2
+0,      43715,      43715,      576,      480, 0x8b6101c7
diff --git a/tests/ref/fate/matroska-zlib-decompression b/tests/ref/fate/matroska-zlib-decompression
new file mode 100644
index 0000000..0ea7323
--- /dev/null
+++ b/tests/ref/fate/matroska-zlib-decompression
@@ -0,0 +1,5 @@
+#extradata 0:      348, 0x5f625922
+#tb 0: 1/1000
+#media_type 0: subtitle
+#codec_id 0: dvd_subtitle
+0,       1000,       1000,     1991,      191, 0x52f74934
diff --git a/tests/ref/fate/mjpeg-ticket3229 b/tests/ref/fate/mjpeg-ticket3229
new file mode 100644
index 0000000..fc5a8dd
--- /dev/null
+++ b/tests/ref/fate/mjpeg-ticket3229
@@ -0,0 +1,8 @@
+#tb 0: 1/30
+#media_type 0: video
+#codec_id 0: rawvideo
+#dimensions 0: 468x312
+#sar 0: 0/1
+0,          0,          0,        1,   292032, 0x3af3a5f7
+0,          6,          6,        1,   292032, 0xe97fb504
+0,          8,          8,        1,   292032, 0xd448db04
diff --git a/tests/ref/fate/movenc b/tests/ref/fate/movenc
index 5e8f324..637a347 100644
--- a/tests/ref/fate/movenc
+++ b/tests/ref/fate/movenc
@@ -2,127 +2,127 @@
 write_data len 2389, time nopts, type header atom -
 write_data len 788, time 1000000, type sync atom moof
 write_data len 110, time nopts, type trailer atom -
-17a37691eba8b858cf15e60aa9a7dbf7 3323 non-empty-moov
+66cf48604f039aa9a51711786f5c8778 3323 non-empty-moov
 write_data len 36, time nopts, type header atom ftyp
 write_data len 2721, time nopts, type header atom -
 write_data len 908, time 966667, type sync atom moof
 write_data len 110, time nopts, type trailer atom -
-0026ffe059c06c592021f972bf2c5e79 3775 non-empty-moov-elst
+04b2e86f455af94f9258b8d66dbf71f5 3775 non-empty-moov-elst
 write_data len 36, time nopts, type header atom ftyp
 write_data len 2629, time nopts, type header atom -
 write_data len 908, time 1000000, type sync atom moof
 write_data len 110, time nopts, type trailer atom -
-c184e168ac1e5bb3d9c70e580ab6179c 3683 non-empty-moov-no-elst
-write_data len 20, time nopts, type header atom ftyp
+e9f6fa032d6d8265d67aef5de81a48bf 3683 non-empty-moov-no-elst
+write_data len 24, time nopts, type header atom ftyp
 write_data len 1171, time nopts, type header atom -
 write_data len 728, time 0, type sync atom moof
 write_data len 828, time nopts, type unknown atom -
-write_data len 728, time 1046439, type sync atom moof
+write_data len 728, time 999999, type sync atom moof
 write_data len 812, time nopts, type unknown atom -
 write_data len 148, time nopts, type trailer atom -
-49bf122c4c732a344ef68b58acd19be5 4435 ismv
+da105e0b2c19079519c6eed7d5a1151c 4439 ismv
 write_data len 36, time nopts, type header atom ftyp
 write_data len 1123, time nopts, type header atom -
 write_data len 796, time 0, type sync atom moof
 write_data len 788, time 1000000, type sync atom moof
 write_data len 148, time nopts, type trailer atom -
-ed8506ebfce4c41732205ae26a4759fd 2891 empty-moov
+e6a4b15443d006efd727a80f6624b7db 2891 empty-moov
 write_data len 36, time nopts, type header atom ftyp
 write_data len 1123, time nopts, type header atom -
 write_data len 1068, time 0, type sync atom moof
 write_data len 908, time 1000000, type sync atom moof
 write_data len 148, time nopts, type trailer atom -
-1844ee6d19fd1e6daf2655632cf26310 3283 empty-moov-no-elst
+800f854aff2ac76dfaddebd0562c75b9 3283 empty-moov-no-elst
 write_data len 36, time nopts, type header atom ftyp
 write_data len 1123, time nopts, type header atom -
 write_data len 900, time -33333, type sync atom moof
 write_data len 908, time 966667, type sync atom moof
 write_data len 148, time nopts, type trailer atom -
-139b27dbe2a80c2dc088d0c755f26033 3115 empty-moov-no-elst-no-adjust
+eca1a945c9063dab0858af6b85925533 3115 empty-moov-no-elst-no-adjust
 write_data len 1159, time nopts, type header atom ftyp
 write_data len 796, time 0, type sync atom moof
 write_data len 788, time 1000000, type sync atom moof
 write_data len 148, time nopts, type trailer atom -
-ed8506ebfce4c41732205ae26a4759fd 2891 delay-moov
+e6a4b15443d006efd727a80f6624b7db 2891 delay-moov
 write_data len 1231, time nopts, type header atom ftyp
 write_data len 916, time -33333, type sync atom moof
 write_data len 908, time 966667, type sync atom moof
 write_data len 148, time nopts, type trailer atom -
-3ece148745cd64b4428530a4d1080a2d 3203 delay-moov-elst
+c2ecdbc80668fcee73f5a039e2dba579 3203 delay-moov-elst
 write_data len 1195, time nopts, type header atom ftyp
 write_data len 836, time 0, type sync atom moof
 write_data len 67, time nopts, type trailer atom -
-9562946a369e6fb570fb2fd7aa2fe728 2098 delay-moov-empty-track
+95d6f59a7354b0cfe7ce49927baada4e 2098 delay-moov-empty-track
 write_data len 1195, time nopts, type header atom ftyp
 write_data len 360, time 0, type sync atom moof
 write_data len 360, time 1000000, type sync atom moof
 write_data len 86, time nopts, type trailer atom -
-4c7832b81836331c6c37155dc31d95be 2001 delay-moov-empty-track-flush
+8805d72a27b340ea229c16edde78f974 2001 delay-moov-empty-track-flush
 write_data len 36, time nopts, type header atom ftyp
 write_data len 1123, time nopts, type header atom -
-b7e3c768b9094ebe2fda44979a7f8985 1159 empty-moov-header
+351ae2c8b6d35d98b4848c309cce6704 1159 empty-moov-header
 write_data len 796, time 0, type sync atom moof
 write_data len 788, time 1000000, type sync atom moof
 a0165f4a26a409212b0946e981bdefb9 1584 empty-moov-content
 write_data len 148, time nopts, type trailer atom -
 write_data len 1159, time nopts, type header atom ftyp
-b7e3c768b9094ebe2fda44979a7f8985 1159 delay-moov-header
+351ae2c8b6d35d98b4848c309cce6704 1159 delay-moov-header
 write_data len 796, time 0, type sync atom moof
 write_data len 788, time 1000000, type sync atom moof
 a0165f4a26a409212b0946e981bdefb9 1584 delay-moov-content
 write_data len 148, time nopts, type trailer atom -
-write_data len 24, time nopts, type header atom -
+write_data len 28, time nopts, type header atom -
 write_data len 1123, time nopts, type header atom -
 write_data len 884, time 0, type sync atom sidx
 write_data len 876, time 1000000, type sync atom sidx
 272a474cfd2a68cc5f05b426b14a2b7d 876 empty-moov-second-frag
 write_data len 148, time nopts, type trailer atom -
-write_data len 24, time nopts, type header atom -
+write_data len 28, time nopts, type header atom -
 write_data len 1123, time nopts, type header atom -
 write_data len 876, time 1000000, type sync atom sidx
 272a474cfd2a68cc5f05b426b14a2b7d 876 empty-moov-second-frag-discont
 write_data len 110, time nopts, type trailer atom -
-write_data len 1219, time nopts, type header atom -
+write_data len 1223, time nopts, type header atom -
 write_data len 876, time 1000000, type sync atom sidx
 272a474cfd2a68cc5f05b426b14a2b7d 876 delay-moov-second-frag-discont
 write_data len 110, time nopts, type trailer atom -
-write_data len 1219, time nopts, type header atom ftyp
-6ec3698bcc86013e0016e3d47d230363 1219 delay-moov-elst-init
+write_data len 1223, time nopts, type header atom ftyp
+b3811928793ed0749927eb2f7958421c 1223 delay-moov-elst-init
 write_data len 988, time -33333, type sync atom sidx
 write_data len 996, time 966667, type sync atom sidx
 fcae8f40e015b59aabc8d4a99a759ca1 996 delay-moov-elst-second-frag
 write_data len 148, time nopts, type trailer atom -
-write_data len 1219, time nopts, type header atom ftyp
-6ec3698bcc86013e0016e3d47d230363 1219 delay-moov-elst-init-discont
+write_data len 1223, time nopts, type header atom ftyp
+b3811928793ed0749927eb2f7958421c 1223 delay-moov-elst-init-discont
 write_data len 996, time 966667, type sync atom sidx
 fcae8f40e015b59aabc8d4a99a759ca1 996 delay-moov-elst-second-frag-discont
 write_data len 110, time nopts, type trailer atom -
-write_data len 1219, time nopts, type header atom ftyp
-c3681590a292cb9ca19a5a982e530166 1219 delay-moov-elst-signal-init
+write_data len 1223, time nopts, type header atom ftyp
+041ac8efc35a0d023c26d05eedb20403 1223 delay-moov-elst-signal-init
 write_data len 1004, time -33333, type sync atom sidx
 write_data len 996, time 966667, type sync atom sidx
 aa5462cc0d2144f72154d9c309edb57d 996 delay-moov-elst-signal-second-frag
 write_data len 148, time nopts, type trailer atom -
-write_data len 1219, time nopts, type header atom ftyp
-c3681590a292cb9ca19a5a982e530166 1219 delay-moov-elst-signal-init-discont
+write_data len 1223, time nopts, type header atom ftyp
+041ac8efc35a0d023c26d05eedb20403 1223 delay-moov-elst-signal-init-discont
 write_data len 996, time 966667, type sync atom sidx
 aa5462cc0d2144f72154d9c309edb57d 996 delay-moov-elst-signal-second-frag-discont
 write_data len 110, time nopts, type trailer atom -
-write_data len 1243, time nopts, type header atom ftyp
-dac14c8795d5cbd91ae770c6e2880c62 1243 delay-moov-elst-signal-init-discont-largets
+write_data len 1247, time nopts, type header atom ftyp
+80511a51d1ac9cde62337eed7176ae03 1247 delay-moov-elst-signal-init-discont-largets
 write_data len 996, time 279621233333, type sync atom sidx
 41cac4c3df656a87bb38363fdcd745e6 996 delay-moov-elst-signal-second-frag-discont-largets
 write_data len 110, time nopts, type trailer atom -
-write_data len 1219, time nopts, type header atom ftyp
+write_data len 1223, time nopts, type header atom ftyp
 write_data len 2572, time -333333, type sync atom sidx
 write_data len 996, time 5166667, type sync atom sidx
 write_data len 148, time nopts, type trailer atom -
-f12d4a0e054abcc508cc0d28cb320e57 4935 vfr
-write_data len 1219, time nopts, type header atom ftyp
+c3eb39921c90724784d1ab84fac58b34 4939 vfr
+write_data len 1223, time nopts, type header atom ftyp
 write_data len 2572, time -333333, type sync atom sidx
 write_data len 996, time 5166667, type sync atom sidx
 write_data len 148, time nopts, type trailer atom -
-f12d4a0e054abcc508cc0d28cb320e57 4935 vfr-noduration
+c3eb39921c90724784d1ab84fac58b34 4939 vfr-noduration
 write_data len 1231, time nopts, type header atom ftyp
 write_data len 1500, time -333333, type sync atom moof
 write_data len 1500, time nopts, type unknown atom -
@@ -131,7 +131,7 @@
 write_data len 1500, time nopts, type unknown atom -
 write_data len 1004, time nopts, type unknown atom -
 write_data len 148, time nopts, type trailer atom -
-3c2c3f98c8a047f0ecefff07570fd457 9299 large_frag
+5bde1358e246e715b2096daa321c9f1b 9299 large_frag
 write_data len 1231, time nopts, type header atom ftyp
 write_data len 684, time -33333, type sync atom moof
 write_data len 504, time 800000, type boundary atom moof
@@ -139,15 +139,15 @@
 write_data len 668, time 1566667, type sync atom moof
 write_data len 440, time 2233333, type boundary atom moof
 write_data len 262, time nopts, type trailer atom -
-edd19deae2b70afcf2cd744b89b7013d 4209 vfr-noduration-interleave
+47cc2460c4b18390c67991cf3251409b 4209 vfr-noduration-interleave
 write_data len 1231, time nopts, type header atom ftyp
 write_data len 916, time 0, type sync atom moof
 write_data len 908, time 1000000, type sync atom moof
 write_data len 148, time nopts, type trailer atom -
-781dbfd228f36903178e29faa727d78b 3203 delay-moov-elst-neg-cts
+c200a345c365dd35a31e7e62a9ae6c10 3203 delay-moov-elst-neg-cts
 write_data len 36, time nopts, type header atom ftyp
 write_data len 1123, time nopts, type header atom -
-write_data len 1188, time 0, type sync atom moof
-write_data len 908, time 1033333, type sync atom moof
+write_data len 900, time 0, type sync atom moof
+write_data len 908, time 1000000, type sync atom moof
 write_data len 148, time nopts, type trailer atom -
-7630fdf358e02c79e88f312f82a260b7 3403 empty-moov-neg-cts
+868bb53d861d81b1c15ef4d59afc83b5 3115 empty-moov-neg-cts
diff --git a/tests/ref/fate/mpeg4-als-conformance-09 b/tests/ref/fate/mpeg4-als-conformance-09
new file mode 100644
index 0000000..b26276d
--- /dev/null
+++ b/tests/ref/fate/mpeg4-als-conformance-09
@@ -0,0 +1 @@
+CRC=0xbf3e7189
diff --git a/tests/ref/fate/mpegts-probe-latm b/tests/ref/fate/mpegts-probe-latm
index 13aea2b..6fa9b62 100644
--- a/tests/ref/fate/mpegts-probe-latm
+++ b/tests/ref/fate/mpegts-probe-latm
@@ -12,3 +12,6 @@
 [STREAM]
 codec_name=aac_latm
 [/STREAM]
+[STREAM]
+codec_name=epg
+[/STREAM]
diff --git a/tests/ref/fate/mxf-d10-user-comments b/tests/ref/fate/mxf-d10-user-comments
new file mode 100644
index 0000000..e787650
--- /dev/null
+++ b/tests/ref/fate/mxf-d10-user-comments
@@ -0,0 +1 @@
+b659c1204f8d04e2a5607af083590dca
diff --git a/tests/ref/fate/mxf-opatom-user-comments b/tests/ref/fate/mxf-opatom-user-comments
new file mode 100644
index 0000000..1834b9e
--- /dev/null
+++ b/tests/ref/fate/mxf-opatom-user-comments
@@ -0,0 +1 @@
+892cf02e44bf7d61b6d6f01e41db9375
diff --git a/tests/ref/fate/mxf-probe-d10 b/tests/ref/fate/mxf-probe-d10
index 30ceaaf..317d4ae 100644
--- a/tests/ref/fate/mxf-probe-d10
+++ b/tests/ref/fate/mxf-probe-d10
@@ -50,6 +50,9 @@
 DISPOSITION:attached_pic=0
 DISPOSITION:timed_thumbnails=0
 TAG:file_package_umid=0x060A2B340101010501010D1313000000AE86B200913105800000080046A54011
+[SIDE_DATA]
+side_data_type=CPB properties
+[/SIDE_DATA]
 [/STREAM]
 [STREAM]
 index=1
@@ -96,6 +99,7 @@
 format_name=mxf
 duration=0.178375
 bit_rate=56419744
+TAG:operational_pattern_ul=060e2b34.04010101.0d010201.01010900
 TAG:uid=0086b200-9131-0580-0000-080046a54011
 TAG:generation_uid=b486b200-9131-0580-0000-080046a54011
 TAG:company_name=SONY
diff --git a/tests/ref/fate/mxf-probe-dnxhd b/tests/ref/fate/mxf-probe-dnxhd
index c4de291..39968ad 100644
--- a/tests/ref/fate/mxf-probe-dnxhd
+++ b/tests/ref/fate/mxf-probe-dnxhd
@@ -167,6 +167,7 @@
 format_name=mxf
 duration=0.250250
 bit_rate=25340195
+TAG:operational_pattern_ul=060e2b34.04010102.0d010201.10030000
 TAG:project_name=UHD
 TAG:uid=784c8132-ae36-ed4d-b0ff-2edf1f3f2d92
 TAG:generation_uid=b6bcfcab-70ff-7331-c47c-478869de11d2
diff --git a/tests/ref/fate/mxf-probe-dv25 b/tests/ref/fate/mxf-probe-dv25
index 6e02dd9..00028b0 100644
--- a/tests/ref/fate/mxf-probe-dv25
+++ b/tests/ref/fate/mxf-probe-dv25
@@ -137,6 +137,7 @@
 format_name=mxf
 duration=1.000000
 bit_rate=30679040
+TAG:operational_pattern_ul=060e2b34.04010101.0d010201.01010900
 TAG:uid=a741d0c7-244a-bc4a-bd36-3323d04f8954
 TAG:generation_uid=c1d7a0ee-89d6-754d-bd52-cdf42b53de9f
 TAG:company_name=AVID
diff --git a/tests/ref/fate/mxf-user-comments b/tests/ref/fate/mxf-user-comments
new file mode 100644
index 0000000..e91b23b
--- /dev/null
+++ b/tests/ref/fate/mxf-user-comments
@@ -0,0 +1 @@
+c6469c0ae2aaee602eacbc009080ae8e
diff --git a/tests/ref/fate/nuv-rtjpeg b/tests/ref/fate/nuv-rtjpeg
index e4a5be6..b6f3b08 100644
--- a/tests/ref/fate/nuv-rtjpeg
+++ b/tests/ref/fate/nuv-rtjpeg
@@ -1,13 +1,13 @@
-#tb 0: 100/2997
+#tb 0: 1/1000
 #media_type 0: video
 #codec_id 0: rawvideo
 #dimensions 0: 640x480
 #sar 0: 1/1
-0,          4,          4,        1,   460800, 0x54aedafe
-0,          5,          5,        1,   460800, 0xb7aa8b56
-0,          6,          6,        1,   460800, 0x283ea3b5
-0,          7,          7,        1,   460800, 0x283ea3b5
-0,          8,          8,        1,   460800, 0x10e577de
-0,          9,          9,        1,   460800, 0x4e091ee2
-0,         10,         10,        1,   460800, 0x2ea88828
-0,         11,         11,        1,   460800, 0x4b7f4df0
+0,        118,        118,        0,   460800, 0x54aedafe
+0,        152,        152,        0,   460800, 0xb7aa8b56
+0,        177,        177,        0,   460800, 0x283ea3b5
+0,        202,        202,        0,   460800, 0x283ea3b5
+0,        235,        235,        0,   460800, 0x10e577de
+0,        269,        269,        0,   460800, 0x4e091ee2
+0,        302,        302,        0,   460800, 0x2ea88828
+0,        335,        335,        0,   460800, 0x4b7f4df0
diff --git a/tests/ref/fate/opt b/tests/ref/fate/opt
index 6a7dbfa..46ea065 100644
--- a/tests/ref/fate/opt
+++ b/tests/ref/fate/opt
@@ -18,31 +18,33 @@
 flt=0.333333
 dbl=0.333333
 TestContext AVOptions:
-  -num               <int>        E........ set num (from 0 to 100) (default 0)
-  -toggle            <int>        E........ set toggle (from 0 to 1) (default 1)
-  -rational          <rational>   E........ set rational (from 0 to 10) (default 1/1)
-  -string            <string>     E........ set string (default "default")
-  -escape            <string>     E........ set escape str (default "\=,")
-  -flags             <flags>      E........ set flags (default cool)
-     cool                         E........ set cool flag
-     lame                         E........ set lame flag
-     mu                           E........ set mu flag
-  -size              <image_size> E........ set size (default "200x300")
-  -pix_fmt           <pix_fmt>    E........ set pixfmt (default 0bgr)
-  -sample_fmt        <sample_fmt> E........ set samplefmt (default s16)
-  -video_rate        <video_rate> E........ set videorate (default "25")
-  -duration          <duration>   E........ set duration (default 0.001)
-  -color             <color>      E........ set color (default "pink")
-  -cl                <channel_layout> E........ set channel layout (default 0x137)
-  -bin               <binary>     E........ set binary value
-  -bin1              <binary>     E........ set binary value
-  -bin2              <binary>     E........ set binary value
-  -num64             <int64>      E........ set num 64bit (from 0 to 100) (default 1)
-  -flt               <float>      E........ set float (from 0 to 100) (default 0.333333)
-  -dbl               <double>     E........ set double (from 0 to 100) (default 0.333333)
-  -bool1             <boolean>    E........ set boolean value (default auto)
-  -bool2             <boolean>    E........ set boolean value (default true)
-  -bool3             <boolean>    E........ set boolean value (default false)
+  -num               <int>        E......... set num (from 0 to 100) (default 0)
+  -toggle            <int>        E......... set toggle (from 0 to 1) (default 1)
+  -rational          <rational>   E......... set rational (from 0 to 10) (default 1/1)
+  -string            <string>     E......... set string (default "default")
+  -escape            <string>     E......... set escape str (default "\=,")
+  -flags             <flags>      E......... set flags (default cool)
+     cool                         E......... set cool flag
+     lame                         E......... set lame flag
+     mu                           E......... set mu flag
+  -size              <image_size> E......... set size (default "200x300")
+  -pix_fmt           <pix_fmt>    E......... set pixfmt (default 0bgr)
+  -sample_fmt        <sample_fmt> E......... set samplefmt (default s16)
+  -video_rate        <video_rate> E......... set videorate (default "25")
+  -duration          <duration>   E......... set duration (default 0.001)
+  -color             <color>      E......... set color (default "pink")
+  -cl                <channel_layout> E......... set channel layout (default 0x137)
+  -bin               <binary>     E......... set binary value
+  -bin1              <binary>     E......... set binary value
+  -bin2              <binary>     E......... set binary value
+  -num64             <int64>      E......... set num 64bit (from 0 to 100) (default 1)
+  -flt               <float>      E......... set float (from 0 to 100) (default 0.333333)
+  -dbl               <double>     E......... set double (from 0 to 100) (default 0.333333)
+  -bool1             <boolean>    E......... set boolean value (default auto)
+  -bool2             <boolean>    E......... set boolean value (default true)
+  -bool3             <boolean>    E......... set boolean value (default false)
+  -dict1             <dictionary> E......... set dictionary value
+  -dict2             <dictionary> E......... set dictionary value (default "happy=':-)'")
 
 Testing av_opt_is_set_to_default()
 name:       num default:1 error:
@@ -70,6 +72,8 @@
 name:     bool1 default:0 error:
 name:     bool2 default:0 error:
 name:     bool3 default:1 error:
+name:     dict1 default:1 error:
+name:     dict2 default:0 error:
 name:       num default:1 error:
 name:    toggle default:1 error:
 name:  rational default:1 error:
@@ -95,9 +99,37 @@
 name:     bool1 default:1 error:
 name:     bool2 default:1 error:
 name:     bool3 default:1 error:
+name:     dict1 default:1 error:
+name:     dict2 default:1 error:
+
+Testing av_opt_get/av_opt_set()
+name: num         get: 0                set: OK               get: 0                OK
+name: toggle      get: 1                set: OK               get: 1                OK
+name: rational    get: 1/1              set: OK               get: 1/1              OK
+name: string      get: default          set: OK               get: default          OK
+name: escape      get: \=,              set: OK               get: \=,              OK
+name: flags       get: 0x00000001       set: OK               get: 0x00000001       OK
+name: size        get: 200x300          set: OK               get: 200x300          OK
+name: pix_fmt     get: 0bgr             set: OK               get: 0bgr             OK
+name: sample_fmt  get: s16              set: OK               get: s16              OK
+name: video_rate  get: 25/1             set: OK               get: 25/1             OK
+name: duration    get: 0.001            set: OK               get: 0.001            OK
+name: color       get: 0xffc0cbff       set: OK               get: 0xffc0cbff       OK
+name: cl          get: 0x137            set: OK               get: 0x137            OK
+name: bin         get: 62696E00         set: OK               get: 62696E00         OK
+name: bin1        get:                  set: OK               get:                  OK
+name: bin2        get:                  set: OK               get:                  OK
+name: num64       get: 1                set: OK               get: 1                OK
+name: flt         get: 0.333333         set: OK               get: 0.333333         OK
+name: dbl         get: 0.333333         set: OK               get: 0.333333         OK
+name: bool1       get: auto             set: OK               get: auto             OK
+name: bool2       get: true             set: OK               get: true             OK
+name: bool3       get: false            set: OK               get: false            OK
+name: dict1       get:                  set: OK               get:                  OK
+name: dict2       get: happy=\:-)       set: OK               get: happy=\:-)       OK
 
 Test av_opt_serialize()
-num=0,toggle=1,rational=1/1,string=default,escape=\\\=\,,flags=0x00000001,size=200x300,pix_fmt=0bgr,sample_fmt=s16,video_rate=25/1,duration=0.001,color=0xffc0cbff,cl=0x137,bin=62696E00,bin1=,bin2=,num64=1,flt=0.333333,dbl=0.333333,bool1=auto,bool2=true,bool3=false
+num=0,toggle=1,rational=1/1,string=default,escape=\\\=\,,flags=0x00000001,size=200x300,pix_fmt=0bgr,sample_fmt=s16,video_rate=25/1,duration=0.001,color=0xffc0cbff,cl=0x137,bin=62696E00,bin1=,bin2=,num64=1,flt=0.333333,dbl=0.333333,bool1=auto,bool2=true,bool3=false,dict1=,dict2=happy\=\\:-)
 Setting entry with key 'num' to value '0'
 Setting entry with key 'toggle' to value '1'
 Setting entry with key 'rational' to value '1/1'
@@ -120,7 +152,9 @@
 Setting entry with key 'bool1' to value 'auto'
 Setting entry with key 'bool2' to value 'true'
 Setting entry with key 'bool3' to value 'false'
-num=0,toggle=1,rational=1/1,string=default,escape=\\\=\,,flags=0x00000001,size=200x300,pix_fmt=0bgr,sample_fmt=s16,video_rate=25/1,duration=0.001,color=0xffc0cbff,cl=0x137,bin=62696E00,bin1=,bin2=,num64=1,flt=0.333333,dbl=0.333333,bool1=auto,bool2=true,bool3=false
+Setting entry with key 'dict1' to value ''
+Setting entry with key 'dict2' to value 'happy=\:-)'
+num=0,toggle=1,rational=1/1,string=default,escape=\\\=\,,flags=0x00000001,size=200x300,pix_fmt=0bgr,sample_fmt=s16,video_rate=25/1,duration=0.001,color=0xffc0cbff,cl=0x137,bin=62696E00,bin1=,bin2=,num64=1,flt=0.333333,dbl=0.333333,bool1=auto,bool2=true,bool3=false,dict1=,dict2=happy\=\\:-)
 
 Testing av_set_options_string()
 Setting options string ''
@@ -341,6 +375,9 @@
 Setting options string 'bool2=auto'
 Setting entry with key 'bool2' to value 'auto'
 OK    'bool2=auto'
+Setting options string 'dict1='happy=\:-):sad=\:-(''
+Setting entry with key 'dict1' to value 'happy=\:-):sad=\:-('
+OK    'dict1='happy=\:-):sad=\:-(''
 
 Testing av_opt_set_from_string()
 Setting options string ''
diff --git a/tests/ref/fate/pixfmt_best b/tests/ref/fate/pixfmt_best
index 699e2e4..5f51e2d 100644
--- a/tests/ref/fate/pixfmt_best
+++ b/tests/ref/fate/pixfmt_best
@@ -1 +1 @@
-72 tests passed, 0 tests failed.
+73 tests passed, 0 tests failed.
diff --git a/tests/ref/fate/prores-alpha b/tests/ref/fate/prores-alpha
index f451d83..d5e3e68 100644
--- a/tests/ref/fate/prores-alpha
+++ b/tests/ref/fate/prores-alpha
@@ -3,5 +3,5 @@
 #codec_id 0: rawvideo
 #dimensions 0: 1920x1080
 #sar 0: 0/1
-0,          0,          0,        1, 16588800, 0x8e4dac48
-0,          1,          1,        1, 16588800, 0x8e4dac48
+0,          0,          0,        1, 16588800, 0xb035f658
+0,          1,          1,        1, 16588800, 0xb035f658
diff --git a/tests/ref/fate/prores-alpha_skip b/tests/ref/fate/prores-alpha_skip
index a17cef8..0969131 100644
--- a/tests/ref/fate/prores-alpha_skip
+++ b/tests/ref/fate/prores-alpha_skip
@@ -3,5 +3,5 @@
 #codec_id 0: rawvideo
 #dimensions 0: 1920x1080
 #sar 0: 0/1
-0,          0,          0,        1, 12441600, 0xf11685dd
-0,          1,          1,        1, 12441600, 0xf11685dd
+0,          0,          0,        1, 12441600, 0x65e009b8
+0,          1,          1,        1, 12441600, 0x65e009b8
diff --git a/tests/ref/fate/prores-metadata b/tests/ref/fate/prores-metadata
new file mode 100644
index 0000000..56153c3
--- /dev/null
+++ b/tests/ref/fate/prores-metadata
@@ -0,0 +1 @@
+3492734b4bd0dd097cd9f264457c8345
diff --git a/tests/ref/fate/prores-transparency b/tests/ref/fate/prores-transparency
index 7b3efc6..4e88152 100644
--- a/tests/ref/fate/prores-transparency
+++ b/tests/ref/fate/prores-transparency
@@ -9,6 +9,6 @@
 #sample_rate 1: 48000
 #channel_layout 1: 3
 #channel_layout_name 1: stereo
-0,          0,          0,        1, 16588800, 0x7163b01a
+0,          0,          0,        1, 16588800, 0xcfb3d806
 1,          0,          0,     1024,     4096, 0x00000000
 1,       1024,       1024,      896,     3584, 0x00000000
diff --git a/tests/ref/fate/prores-transparency_skip b/tests/ref/fate/prores-transparency_skip
index 5c98d3e..82c180d 100644
--- a/tests/ref/fate/prores-transparency_skip
+++ b/tests/ref/fate/prores-transparency_skip
@@ -9,6 +9,6 @@
 #sample_rate 1: 48000
 #channel_layout 1: 3
 #channel_layout_name 1: stereo
-0,          0,          0,        1, 12441600, 0x627d1548
+0,          0,          0,        1, 12441600, 0x74f53304
 1,          0,          0,     1024,     4096, 0x00000000
 1,       1024,       1024,      896,     3584, 0x00000000
diff --git a/tests/ref/fate/qtrle-32bit b/tests/ref/fate/qtrle-32bit
index aaaf8d6..5e2b58d 100644
--- a/tests/ref/fate/qtrle-32bit
+++ b/tests/ref/fate/qtrle-32bit
@@ -3,29 +3,29 @@
 #codec_id 0: rawvideo
 #dimensions 0: 720x480
 #sar 0: 0/1
-0,          0,          0,        1,  1036800, 0x2a90d062
-0,          1,          1,        1,  1036800, 0x6565aded
-0,          2,          2,        1,  1036800, 0xf0b587d2
-0,          3,          3,        1,  1036800, 0xf0b4e53f
-0,          4,          4,        1,  1036800, 0x5ba4b96a
-0,          5,          5,        1,  1036800, 0x501df9c1
-0,          6,          6,        1,  1036800, 0xcf45b940
-0,          7,          7,        1,  1036800, 0xa454df07
-0,          8,          8,        1,  1036800, 0xc504d152
-0,          9,          9,        1,  1036800, 0xd90ecac7
-0,         10,         10,        1,  1036800, 0xe30368df
-0,         11,         11,        1,  1036800, 0x0ca35522
-0,         12,         12,        1,  1036800, 0xe76b8d43
-0,         13,         13,        1,  1036800, 0x7c85a447
-0,         14,         14,        1,  1036800, 0x3e2d1b5f
-0,         15,         15,        1,  1036800, 0x230fa5a6
-0,         16,         16,        1,  1036800, 0x4fad025e
-0,         17,         17,        1,  1036800, 0x7d3366ae
-0,         18,         18,        1,  1036800, 0xa83720f7
-0,         19,         19,        1,  1036800, 0x5dbd13b1
-0,         20,         20,        1,  1036800, 0xd0ebd56d
-0,         21,         21,        1,  1036800, 0x4d7c67f3
-0,         22,         22,        1,  1036800, 0x226baa3f
-0,         23,         23,        1,  1036800, 0xc0e93acf
-0,         24,         24,        1,  1036800, 0x5a466c17
-0,         25,         25,        1,  1036800, 0xfdb7d2ea
+0,          0,          0,        1,  1382400, 0xfe6e6fd3
+0,          1,          1,        1,  1382400, 0x3c7809c8
+0,          2,          2,        1,  1382400, 0x06901a04
+0,          3,          3,        1,  1382400, 0xd7d7c910
+0,          4,          4,        1,  1382400, 0x017e8fda
+0,          5,          5,        1,  1382400, 0xab9ee842
+0,          6,          6,        1,  1382400, 0x08615b93
+0,          7,          7,        1,  1382400, 0x105cb681
+0,          8,          8,        1,  1382400, 0xd9dd224f
+0,          9,          9,        1,  1382400, 0x058cabbf
+0,         10,         10,        1,  1382400, 0x73424fc0
+0,         11,         11,        1,  1382400, 0x39d0a78b
+0,         12,         12,        1,  1382400, 0x956d1393
+0,         13,         13,        1,  1382400, 0xe4aff472
+0,         14,         14,        1,  1382400, 0x83ff20ce
+0,         15,         15,        1,  1382400, 0xb53383df
+0,         16,         16,        1,  1382400, 0x181e55e8
+0,         17,         17,        1,  1382400, 0x0716c90c
+0,         18,         18,        1,  1382400, 0x092aae25
+0,         19,         19,        1,  1382400, 0x0a23b4cb
+0,         20,         20,        1,  1382400, 0xe72000b0
+0,         21,         21,        1,  1382400, 0x0b8d02e8
+0,         22,         22,        1,  1382400, 0xec2a3b0d
+0,         23,         23,        1,  1382400, 0x4ddc4e19
+0,         24,         24,        1,  1382400, 0xc4656abb
+0,         25,         25,        1,  1382400, 0x60d78517
diff --git a/tests/ref/fate/qtrle-8bit b/tests/ref/fate/qtrle-8bit
index 27bb8aa..8da113d 100644
--- a/tests/ref/fate/qtrle-8bit
+++ b/tests/ref/fate/qtrle-8bit
@@ -4,60 +4,169 @@
 #dimensions 0: 640x480
 #sar 0: 0/1
 0,          0,          0,        1,   921600, 0x1492e3ed
+0,          1,          1,        1,   921600, 0x1492e3ed
+0,          2,          2,        1,   921600, 0x1492e3ed
 0,          3,          3,        1,   921600, 0x23ef4fc7
+0,          4,          4,        1,   921600, 0x23ef4fc7
 0,          5,          5,        1,   921600, 0xe406d4be
+0,          6,          6,        1,   921600, 0xe406d4be
+0,          7,          7,        1,   921600, 0xe406d4be
 0,          8,          8,        1,   921600, 0x62b8b5a1
+0,          9,          9,        1,   921600, 0x62b8b5a1
 0,         10,         10,        1,   921600, 0x7d8ba674
+0,         11,         11,        1,   921600, 0x7d8ba674
+0,         12,         12,        1,   921600, 0x7d8ba674
 0,         13,         13,        1,   921600, 0xfe666be7
+0,         14,         14,        1,   921600, 0xfe666be7
 0,         15,         15,        1,   921600, 0x721baec0
+0,         16,         16,        1,   921600, 0x721baec0
+0,         17,         17,        1,   921600, 0x721baec0
 0,         18,         18,        1,   921600, 0xc237180a
+0,         19,         19,        1,   921600, 0xc237180a
 0,         20,         20,        1,   921600, 0xf03a7482
+0,         21,         21,        1,   921600, 0xf03a7482
+0,         22,         22,        1,   921600, 0xf03a7482
 0,         23,         23,        1,   921600, 0x5612a391
+0,         24,         24,        1,   921600, 0x5612a391
 0,         25,         25,        1,   921600, 0x9dbcc46a
+0,         26,         26,        1,   921600, 0x9dbcc46a
+0,         27,         27,        1,   921600, 0x9dbcc46a
 0,         28,         28,        1,   921600, 0xa128a5d5
+0,         29,         29,        1,   921600, 0xa128a5d5
 0,         30,         30,        1,   921600, 0x63e0025c
+0,         31,         31,        1,   921600, 0x63e0025c
+0,         32,         32,        1,   921600, 0x63e0025c
 0,         33,         33,        1,   921600, 0x262359ed
+0,         34,         34,        1,   921600, 0x262359ed
 0,         35,         35,        1,   921600, 0x343688e8
+0,         36,         36,        1,   921600, 0x343688e8
+0,         37,         37,        1,   921600, 0x343688e8
+0,         38,         38,        1,   921600, 0x343688e8
+0,         39,         39,        1,   921600, 0x343688e8
+0,         40,         40,        1,   921600, 0x343688e8
+0,         41,         41,        1,   921600, 0x343688e8
+0,         42,         42,        1,   921600, 0x343688e8
+0,         43,         43,        1,   921600, 0x343688e8
+0,         44,         44,        1,   921600, 0x343688e8
 0,         45,         45,        1,   921600, 0xe4b29d57
+0,         46,         46,        1,   921600, 0xe4b29d57
+0,         47,         47,        1,   921600, 0xe4b29d57
 0,         48,         48,        1,   921600, 0x198e8a4a
+0,         49,         49,        1,   921600, 0x198e8a4a
 0,         50,         50,        1,   921600, 0x0cad8dc9
+0,         51,         51,        1,   921600, 0x0cad8dc9
+0,         52,         52,        1,   921600, 0x0cad8dc9
 0,         53,         53,        1,   921600, 0x1f74cf3d
+0,         54,         54,        1,   921600, 0x1f74cf3d
 0,         55,         55,        1,   921600, 0xec5b5449
+0,         56,         56,        1,   921600, 0xec5b5449
+0,         57,         57,        1,   921600, 0xec5b5449
 0,         58,         58,        1,   921600, 0x39829711
+0,         59,         59,        1,   921600, 0x39829711
 0,         60,         60,        1,   921600, 0x6de5b9c6
+0,         61,         61,        1,   921600, 0x6de5b9c6
+0,         62,         62,        1,   921600, 0x6de5b9c6
 0,         63,         63,        1,   921600, 0x47b0e9d4
+0,         64,         64,        1,   921600, 0x47b0e9d4
 0,         65,         65,        1,   921600, 0x756452b8
+0,         66,         66,        1,   921600, 0x756452b8
+0,         67,         67,        1,   921600, 0x756452b8
 0,         68,         68,        1,   921600, 0x6fce3478
+0,         69,         69,        1,   921600, 0x6fce3478
 0,         70,         70,        1,   921600, 0x372397cd
+0,         71,         71,        1,   921600, 0x372397cd
+0,         72,         72,        1,   921600, 0x372397cd
 0,         73,         73,        1,   921600, 0xe3999ba1
+0,         74,         74,        1,   921600, 0xe3999ba1
 0,         75,         75,        1,   921600, 0x6ba26b43
+0,         76,         76,        1,   921600, 0x6ba26b43
+0,         77,         77,        1,   921600, 0x6ba26b43
 0,         78,         78,        1,   921600, 0x4e9ee49e
+0,         79,         79,        1,   921600, 0x4e9ee49e
 0,         80,         80,        1,   921600, 0xdb5fd6e7
+0,         81,         81,        1,   921600, 0xdb5fd6e7
+0,         82,         82,        1,   921600, 0xdb5fd6e7
 0,         83,         83,        1,   921600, 0x8f2254a5
+0,         84,         84,        1,   921600, 0x8f2254a5
+0,         85,         85,        1,   921600, 0x8f2254a5
+0,         86,         86,        1,   921600, 0x8f2254a5
+0,         87,         87,        1,   921600, 0x8f2254a5
+0,         88,         88,        1,   921600, 0x8f2254a5
+0,         89,         89,        1,   921600, 0x8f2254a5
+0,         90,         90,        1,   921600, 0x8f2254a5
+0,         91,         91,        1,   921600, 0x8f2254a5
+0,         92,         92,        1,   921600, 0x8f2254a5
 0,         93,         93,        1,   921600, 0x57e95c32
+0,         94,         94,        1,   921600, 0x57e95c32
 0,         95,         95,        1,   921600, 0x41627a9b
+0,         96,         96,        1,   921600, 0x41627a9b
+0,         97,         97,        1,   921600, 0x41627a9b
 0,         98,         98,        1,   921600, 0x7412dcee
+0,         99,         99,        1,   921600, 0x7412dcee
 0,        100,        100,        1,   921600, 0xaebe10ed
+0,        101,        101,        1,   921600, 0xaebe10ed
+0,        102,        102,        1,   921600, 0xaebe10ed
 0,        103,        103,        1,   921600, 0x411a91f6
+0,        104,        104,        1,   921600, 0x411a91f6
 0,        105,        105,        1,   921600, 0xb059df3f
+0,        106,        106,        1,   921600, 0xb059df3f
+0,        107,        107,        1,   921600, 0xb059df3f
 0,        108,        108,        1,   921600, 0x4d6f5a77
+0,        109,        109,        1,   921600, 0x4d6f5a77
 0,        110,        110,        1,   921600, 0xbbf06df4
+0,        111,        111,        1,   921600, 0xbbf06df4
+0,        112,        112,        1,   921600, 0xbbf06df4
 0,        113,        113,        1,   921600, 0xe27f7bf6
+0,        114,        114,        1,   921600, 0xe27f7bf6
 0,        115,        115,        1,   921600, 0xd7e8360e
+0,        116,        116,        1,   921600, 0xd7e8360e
+0,        117,        117,        1,   921600, 0xd7e8360e
 0,        118,        118,        1,   921600, 0x1dd4c344
+0,        119,        119,        1,   921600, 0x1dd4c344
 0,        120,        120,        1,   921600, 0x7995a7ce
+0,        121,        121,        1,   921600, 0x7995a7ce
+0,        122,        122,        1,   921600, 0x7995a7ce
 0,        123,        123,        1,   921600, 0x2ef3c566
+0,        124,        124,        1,   921600, 0x2ef3c566
 0,        125,        125,        1,   921600, 0xf296736e
+0,        126,        126,        1,   921600, 0xf296736e
+0,        127,        127,        1,   921600, 0xf296736e
+0,        128,        128,        1,   921600, 0xf296736e
+0,        129,        129,        1,   921600, 0xf296736e
+0,        130,        130,        1,   921600, 0xf296736e
+0,        131,        131,        1,   921600, 0xf296736e
+0,        132,        132,        1,   921600, 0xf296736e
+0,        133,        133,        1,   921600, 0xf296736e
+0,        134,        134,        1,   921600, 0xf296736e
 0,        135,        135,        1,   921600, 0x1a488311
+0,        136,        136,        1,   921600, 0x1a488311
+0,        137,        137,        1,   921600, 0x1a488311
 0,        138,        138,        1,   921600, 0x9e28011b
+0,        139,        139,        1,   921600, 0x9e28011b
 0,        140,        140,        1,   921600, 0x84d1ea80
+0,        141,        141,        1,   921600, 0x84d1ea80
+0,        142,        142,        1,   921600, 0x84d1ea80
 0,        143,        143,        1,   921600, 0x9ed41052
+0,        144,        144,        1,   921600, 0x9ed41052
 0,        145,        145,        1,   921600, 0xd4db7206
+0,        146,        146,        1,   921600, 0xd4db7206
+0,        147,        147,        1,   921600, 0xd4db7206
 0,        148,        148,        1,   921600, 0x55f695a9
+0,        149,        149,        1,   921600, 0x55f695a9
 0,        150,        150,        1,   921600, 0x9d8c667f
+0,        151,        151,        1,   921600, 0x9d8c667f
+0,        152,        152,        1,   921600, 0x9d8c667f
 0,        153,        153,        1,   921600, 0x9b6037ec
+0,        154,        154,        1,   921600, 0x9b6037ec
 0,        155,        155,        1,   921600, 0x57c5e835
+0,        156,        156,        1,   921600, 0x57c5e835
+0,        157,        157,        1,   921600, 0x57c5e835
 0,        158,        158,        1,   921600, 0x476dad89
+0,        159,        159,        1,   921600, 0x476dad89
 0,        160,        160,        1,   921600, 0xcfd6ad2b
+0,        161,        161,        1,   921600, 0xcfd6ad2b
+0,        162,        162,        1,   921600, 0xcfd6ad2b
 0,        163,        163,        1,   921600, 0x3b372379
+0,        164,        164,        1,   921600, 0x3b372379
 0,        165,        165,        1,   921600, 0x36f245f5
+0,        166,        166,        1,   921600, 0x36f245f5
diff --git a/tests/ref/fate/rgb24-mkv b/tests/ref/fate/rgb24-mkv
index 9f0064b..c9438df 100644
--- a/tests/ref/fate/rgb24-mkv
+++ b/tests/ref/fate/rgb24-mkv
@@ -1,5 +1,5 @@
-d84d5a83971be9c2caa2f4c37bbbfefd *tests/data/fate/rgb24-mkv.matroska
-58343 tests/data/fate/rgb24-mkv.matroska
+84474651e0744e7049e27dd19b8c18a8 *tests/data/fate/rgb24-mkv.matroska
+58192 tests/data/fate/rgb24-mkv.matroska
 #tb 0: 1/10
 #media_type 0: video
 #codec_id 0: rawvideo
diff --git a/tests/ref/fate/segment-mp4-to-ts b/tests/ref/fate/segment-mp4-to-ts
index b5accb6..847c1a2 100644
--- a/tests/ref/fate/segment-mp4-to-ts
+++ b/tests/ref/fate/segment-mp4-to-ts
@@ -1,10 +1,10 @@
-#extradata 0:       51, 0x5d140df9
+#extradata 0:       50, 0x4f1b0df9
 #tb 0: 1/90000
 #media_type 0: video
 #codec_id 0: h264
 #dimensions 0: 640x360
 #sar 0: 1/1
-0,      -7200,          0,        0,    22631, 0x9cec9541, S=1,        1, 0x00e000e0
+0,      -7200,          0,        0,    22630, 0x9b109541, S=1,        1, 0x00e000e0
 0,      -3600,      14400,        0,     4021, 0xbf7cdb02, F=0x0, S=1,        1, 0x00e000e0
 0,          0,       7200,        0,     1096, 0x4f162690, F=0x0, S=1,        1, 0x00e000e0
 0,       3600,       3600,        0,      687, 0x00394b95, F=0x0, S=1,        1, 0x00e000e0
diff --git a/tests/ref/fate/source b/tests/ref/fate/source
index 4b9467a..c64bc05 100644
--- a/tests/ref/fate/source
+++ b/tests/ref/fate/source
@@ -1,6 +1,4 @@
 Files without standard license headers:
-compat/avisynth/windowsPorts/basicDataTypeConversions.h
-compat/avisynth/windowsPorts/windows2linux.h
 libavcodec/file_open.c
 libavcodec/ilbcdata.h
 libavcodec/ilbcdec.c
@@ -9,6 +7,7 @@
 libavcodec/reverse.c
 libavdevice/file_open.c
 libavdevice/reverse.c
+libavfilter/af_arnndn.c
 libavfilter/log2_tab.c
 libavformat/file_open.c
 libavformat/golomb_tab.c
@@ -18,14 +17,7 @@
 tools/uncoded_frame.c
 tools/yuvcmp.c
 Headers without standard inclusion guards:
-compat/avisynth/avisynth_c.h
-compat/avisynth/avs/capi.h
-compat/avisynth/avs/config.h
-compat/avisynth/avs/types.h
-compat/avisynth/avxsynth_c.h
-compat/avisynth/windowsPorts/basicDataTypeConversions.h
-compat/avisynth/windowsPorts/windows2linux.h
-compat/cuda/dynlink_loader.h
+compat/djgpp/math.h
 compat/float/float.h
 compat/float/limits.h
 Use of av_clip() where av_clip_uintp2() could be used:
diff --git a/tests/ref/fate/sub-jacosub b/tests/ref/fate/sub-jacosub
index a30fe4a..5f282cd 100644
--- a/tests/ref/fate/sub-jacosub
+++ b/tests/ref/fate/sub-jacosub
@@ -10,14 +10,14 @@
 
 [Events]
 Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text
-Dialogue: 0,0:00:00.12,0:00:04.36,Default,,0,0,0,,{\an5}JACOsub\N\NThis script demonstrates some of the capabilities of JACOsub.
-Dialogue: 0,0:00:04.12,0:00:14.86,Default,,0,0,0,,{\an8}Text may be positioned at the top,
-Dialogue: 0,0:00:05.12,0:00:17.46,Default,,0,0,0,,{\an5}middle,
-Dialogue: 0,0:00:06.12,0:00:20.06,Default,,0,0,0,,{\an2}or bottom of the screen.
-Dialogue: 0,0:00:08.12,0:00:27.36,Default,,0,0,0,,{\an5}{this is a comment} (And, you just saw, {another comment} timing ranges for different lines of text.
-Dialogue: 0,0:00:11.12,0:00:35.86,Default,,0,0,0,,{\an1}Within margin constraints\Nthat you set, text may be\Nleft justified,
-Dialogue: 0,0:00:13.62,0:00:42.11,Default,,0,0,0,,{\an2}{the JC is redundant - it's the default}center\Njustified,
-Dialogue: 0,0:00:14.87,0:00:45.86,Default,,0,0,0,,{\an3}and also\Nright justified.
-Dialogue: 0,0:00:22.42,0:01:12.76,Default,,0,0,0,,Text may appear in different styles\N(Normal, {\b1}Bold{\r}, {\i1}Italic{\r})
-Dialogue: 0,0:01:16.12,0:03:53.36,Default,,0,0,0,,{\an5}\N\NAt that time, you may press any key to return to the Editor.
-Dialogue: 0,0:01:16.12,0:03:53.36,Default,,0,0,0,,OK, this script will be finished when the screen goes blank.
+Dialogue: 0,0:00:00.12,0:00:04.12,Default,,0,0,0,,{\an5}JACOsub\N\NThis script demonstrates some of the capabilities of JACOsub.
+Dialogue: 0,0:00:04.12,0:00:06.62,Default,,0,0,0,,{\an8}Text may be positioned at the top,
+Dialogue: 0,0:00:05.12,0:00:07.22,Default,,0,0,0,,{\an5}middle,
+Dialogue: 0,0:00:06.12,0:00:07.82,Default,,0,0,0,,{\an2}or bottom of the screen.
+Dialogue: 0,0:00:08.12,0:00:11.12,Default,,0,0,0,,{\an5}{this is a comment} (And, you just saw, {another comment} timing ranges for different lines of text.
+Dialogue: 0,0:00:11.12,0:00:13.62,Default,,0,0,0,,{\an1}Within margin constraints\Nthat you set, text may be\Nleft justified,
+Dialogue: 0,0:00:13.62,0:00:14.87,Default,,0,0,0,,{\an2}{the JC is redundant - it's the default}center\Njustified,
+Dialogue: 0,0:00:14.87,0:00:16.12,Default,,0,0,0,,{\an3}and also\Nright justified.
+Dialogue: 0,0:00:22.42,0:00:27.92,Default,,0,0,0,,Text may appear in different styles\N(Normal, {\b1}Bold{\r}, {\i1}Italic{\r})
+Dialogue: 0,0:01:16.12,0:01:21.12,Default,,0,0,0,,{\an5}\N\NAt that time, you may press any key to return to the Editor.
+Dialogue: 0,0:01:16.12,0:01:21.12,Default,,0,0,0,,OK, this script will be finished when the screen goes blank.
diff --git a/tests/ref/fate/sub-microdvd-remux b/tests/ref/fate/sub-microdvd-remux
index a71da99..92ff233 100644
--- a/tests/ref/fate/sub-microdvd-remux
+++ b/tests/ref/fate/sub-microdvd-remux
Binary files differ
diff --git a/tests/ref/fate/sub-movtext b/tests/ref/fate/sub-movtext
index 94ed22d..6047060 100644
--- a/tests/ref/fate/sub-movtext
+++ b/tests/ref/fate/sub-movtext
@@ -6,7 +6,7 @@
 
 [V4+ Styles]
 Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding
-Style: Default,Serif,18,&Hffffff,&Hffffff,&H0,&H0,0,0,0,0,100,100,0,0,1,1,0,2,10,10,10,0
+Style: Default,Serif,18,&Hffffff,&Hffffff,&Hff000000,&Hff000000,0,0,0,0,100,100,0,0,1,1,0,2,10,10,10,0
 
 [Events]
 Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text
diff --git a/tests/ref/fate/sub-mpsub-frames b/tests/ref/fate/sub-mpsub-frames
index 64528ec..1769578 100644
--- a/tests/ref/fate/sub-mpsub-frames
+++ b/tests/ref/fate/sub-mpsub-frames
@@ -10,5 +10,5 @@
 
 [Events]
 Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text
-Dialogue: 0,0:00:01.00,0:00:02.48,Default,,0,0,0,,Start at 1sec,\Nlast 1.5 seconds
-Dialogue: 0,0:00:02.52,0:00:11.52,Default,,0,0,0,,One frame later,\Nduring 9 seconds
+Dialogue: 0,0:00:01.00,0:00:02.50,Default,,0,0,0,,Start at 1sec,\Nlast 1.5 seconds
+Dialogue: 0,0:00:02.54,0:00:11.54,Default,,0,0,0,,One frame later,\Nduring 9 seconds
diff --git a/tests/ref/fate/sub2video_basic b/tests/ref/fate/sub2video_basic
new file mode 100644
index 0000000..5f72e29
--- /dev/null
+++ b/tests/ref/fate/sub2video_basic
@@ -0,0 +1,95 @@
+#tb 0: 1/25
+#media_type 0: video
+#codec_id 0: rawvideo
+#dimensions 0: 720x480
+#sar 0: 0/1
+0,       3312,       3312,        1,  1382400, 0x00000000
+0,       3312,       3312,        1,  1382400, 0x8c93c2ba
+0,       3436,       3436,        1,  1382400, 0x00000000
+0,       3684,       3684,        1,  1382400, 0xb02e32ca
+0,       3802,       3802,        1,  1382400, 0x00000000
+0,       4520,       4520,        1,  1382400, 0x83b71116
+0,       4584,       4584,        1,  1382400, 0x00000000
+0,       4586,       4586,        1,  1382400, 0x85547fd1
+0,       4645,       4645,        1,  1382400, 0x00000000
+0,       4648,       4648,        1,  1382400, 0x00000000
+0,       4648,       4648,        1,  1382400, 0xb6a8f181
+0,       4715,       4715,        1,  1382400, 0x00000000
+0,       4717,       4717,        1,  1382400, 0xb64d1a2c
+0,       4748,       4748,        1,  1382400, 0x00000000
+0,       4750,       4750,        1,  1382400, 0x7b37ecf3
+0,       4792,       4792,        1,  1382400, 0x00000000
+0,       4993,       4993,        1,  1382400, 0xdc025bd1
+0,       5027,       5027,        1,  1382400, 0x00000000
+0,       5029,       5029,        1,  1382400, 0x688b294d
+0,       5068,       5068,        1,  1382400, 0x00000000
+0,       5070,       5070,        1,  1382400, 0xa2b33d1b
+0,       5117,       5117,        1,  1382400, 0x00000000
+0,       5119,       5119,        1,  1382400, 0xb3e525e3
+0,       5168,       5168,        1,  1382400, 0x00000000
+0,       5170,       5170,        1,  1382400, 0xaa8fbdd7
+0,       5216,       5216,        1,  1382400, 0x00000000
+0,       5218,       5218,        1,  1382400, 0x7b7f26dd
+0,       5249,       5249,        1,  1382400, 0x00000000
+0,       5251,       5251,        1,  1382400, 0x15e2f836
+0,       5289,       5289,        1,  1382400, 0x00000000
+0,       5291,       5291,        1,  1382400, 0x0fee9b0c
+0,       5358,       5358,        1,  1382400, 0x00000000
+0,       5360,       5360,        1,  1382400, 0x89d62791
+0,       5429,       5429,        1,  1382400, 0x00000000
+0,       5431,       5431,        1,  1382400, 0xa6a9fd74
+0,       5490,       5490,        1,  1382400, 0x00000000
+0,       5491,       5491,        1,  1382400, 0x7896178d
+0,       5537,       5537,        1,  1382400, 0x00000000
+0,       5588,       5588,        1,  1382400, 0x01751a52
+0,       5647,       5647,        1,  1382400, 0x00000000
+0,       5688,       5688,        1,  1382400, 0xa3959c6f
+0,       5770,       5770,        1,  1382400, 0x00000000
+0,       5772,       5772,        1,  1382400, 0x3d3ea47b
+0,       5826,       5826,        1,  1382400, 0x00000000
+0,       5828,       5828,        1,  1382400, 0x593f8b24
+0,       5931,       5931,        1,  1382400, 0x00000000
+0,       5933,       5933,        1,  1382400, 0x171f05ba
+0,       6001,       6001,        1,  1382400, 0x00000000
+0,       6003,       6003,        1,  1382400, 0xb014cdf1
+0,       6054,       6054,        1,  1382400, 0x00000000
+0,       6839,       6839,        1,  1382400, 0xd918e667
+0,       6880,       6880,        1,  1382400, 0x00000000
+0,       7386,       7386,        1,  1382400, 0xc9406331
+0,       7419,       7419,        1,  1382400, 0x00000000
+0,       7501,       7501,        1,  1382400, 0xaf08b10d
+0,       7549,       7549,        1,  1382400, 0x00000000
+0,       7551,       7551,        1,  1382400, 0x00000000
+0,       7551,       7551,        1,  1382400, 0x853a9d93
+0,       7589,       7589,        1,  1382400, 0x00000000
+0,       7605,       7605,        1,  1382400, 0x7491a87d
+0,       7647,       7647,        1,  1382400, 0x00000000
+0,       7649,       7649,        1,  1382400, 0xf7383c58
+0,       7697,       7697,        1,  1382400, 0x00000000
+0,       7699,       7699,        1,  1382400, 0xe66be411
+0,       7743,       7743,        1,  1382400, 0x00000000
+0,       8032,       8032,        1,  1382400, 0xd6850362
+0,       8082,       8082,        1,  1382400, 0x00000000
+0,       8084,       8084,        1,  1382400, 0x3e1ed109
+0,       8115,       8115,        1,  1382400, 0x00000000
+0,       8116,       8116,        1,  1382400, 0x39c1b7bd
+0,       8160,       8160,        1,  1382400, 0x00000000
+0,       8180,       8180,        1,  1382400, 0x35b85f2e
+0,       8207,       8207,        1,  1382400, 0x00000000
+0,       8209,       8209,        1,  1382400, 0x00000000
+0,       8209,       8209,        1,  1382400, 0x83f103e5
+0,       8247,       8247,        1,  1382400, 0x00000000
+0,       8249,       8249,        1,  1382400, 0xbc1ca9b3
+0,       8278,       8278,        1,  1382400, 0x00000000
+0,       8281,       8281,        1,  1382400, 0x94d4a51e
+0,       8321,       8321,        1,  1382400, 0x00000000
+0,       8323,       8323,        1,  1382400, 0xf88cdfde
+0,       8367,       8367,        1,  1382400, 0x00000000
+0,       8565,       8565,        1,  1382400, 0xdd51423b
+0,       8611,       8611,        1,  1382400, 0x00000000
+0,       8669,       8669,        1,  1382400, 0x08259fa4
+0,       8708,       8708,        1,  1382400, 0x00000000
+0,       8941,       8941,        1,  1382400, 0x1663fa34
+0,       8994,       8994,        1,  1382400, 0x00000000
+0,       8996,       8996,        1,  1382400, 0xda2ceb55
+0,       9027,       9027,        1,  1382400, 0x00000000
diff --git a/tests/ref/fate/sub2video_time_limited b/tests/ref/fate/sub2video_time_limited
new file mode 100644
index 0000000..9fb6fb0
--- /dev/null
+++ b/tests/ref/fate/sub2video_time_limited
@@ -0,0 +1,8 @@
+#tb 0: 1/25
+#media_type 0: video
+#codec_id 0: rawvideo
+#dimensions 0: 1920x1080
+#sar 0: 0/1
+0,          2,          2,        1,  8294400, 0x00000000
+0,          2,          2,        1,  8294400, 0xa87c518f
+0,         10,         10,        1,  8294400, 0xa87c518f
diff --git a/tests/ref/fate/sws-pixdesc-query b/tests/ref/fate/sws-pixdesc-query
index 451c7d8..bc9a0d8 100644
--- a/tests/ref/fate/sws-pixdesc-query
+++ b/tests/ref/fate/sws-pixdesc-query
@@ -59,6 +59,8 @@
   p010le
   xyz12be
   xyz12le
+  y210be
+  y210le
   yuv420p10be
   yuv420p10le
   yuv420p12be
@@ -93,10 +95,14 @@
   yuva420p9le
   yuva422p10be
   yuva422p10le
+  yuva422p12be
+  yuva422p12le
   yuva422p9be
   yuva422p9le
   yuva444p10be
   yuva444p10le
+  yuva444p12be
+  yuva444p12le
   yuva444p9be
   yuva444p9le
 
@@ -136,6 +142,7 @@
   rgb565be
   rgba64be
   xyz12be
+  y210be
   ya16be
   yuv420p10be
   yuv420p12be
@@ -158,9 +165,11 @@
   yuva420p16be
   yuva420p9be
   yuva422p10be
+  yuva422p12be
   yuva422p16be
   yuva422p9be
   yuva444p10be
+  yuva444p12be
   yuva444p16be
   yuva444p9be
 
@@ -172,6 +181,8 @@
   nv20be
   nv20le
   nv21
+  nv24
+  nv42
   p010be
   p010le
   p016be
@@ -180,6 +191,8 @@
   uyyvyy411
   xyz12be
   xyz12le
+  y210be
+  y210le
   ya16be
   ya16le
   ya8
@@ -233,6 +246,8 @@
   yuva422p
   yuva422p10be
   yuva422p10le
+  yuva422p12be
+  yuva422p12le
   yuva422p16be
   yuva422p16le
   yuva422p9be
@@ -240,6 +255,8 @@
   yuva444p
   yuva444p10be
   yuva444p10le
+  yuva444p12be
+  yuva444p12le
   yuva444p16be
   yuva444p16le
   yuva444p9be
@@ -258,6 +275,8 @@
   nv20be
   nv20le
   nv21
+  nv24
+  nv42
   p010be
   p010le
   p016be
@@ -312,6 +331,8 @@
   yuva422p
   yuva422p10be
   yuva422p10le
+  yuva422p12be
+  yuva422p12le
   yuva422p16be
   yuva422p16le
   yuva422p9be
@@ -319,6 +340,8 @@
   yuva444p
   yuva444p10be
   yuva444p10le
+  yuva444p12be
+  yuva444p12le
   yuva444p16be
   yuva444p16le
   yuva444p9be
@@ -329,6 +352,19 @@
   yuvj440p
   yuvj444p
 
+isSemiPlanarYUV:
+  nv12
+  nv16
+  nv20be
+  nv20le
+  nv21
+  nv24
+  nv42
+  p010be
+  p010le
+  p016be
+  p016le
+
 isRGB:
   0bgr
   0rgb
@@ -581,6 +617,8 @@
   yuva422p
   yuva422p10be
   yuva422p10le
+  yuva422p12be
+  yuva422p12le
   yuva422p16be
   yuva422p16le
   yuva422p9be
@@ -588,6 +626,8 @@
   yuva444p
   yuva444p10be
   yuva444p10le
+  yuva444p12be
+  yuva444p12le
   yuva444p16be
   yuva444p16le
   yuva444p9be
@@ -651,6 +691,8 @@
   uyyvyy411
   xyz12be
   xyz12le
+  y210be
+  y210le
   ya16be
   ya16le
   ya8
@@ -685,6 +727,8 @@
   nv20be
   nv20le
   nv21
+  nv24
+  nv42
   p010be
   p010le
   p016be
@@ -739,6 +783,8 @@
   yuva422p
   yuva422p10be
   yuva422p10le
+  yuva422p12be
+  yuva422p12le
   yuva422p16be
   yuva422p16le
   yuva422p9be
@@ -746,6 +792,8 @@
   yuva444p
   yuva444p10be
   yuva444p10le
+  yuva444p12be
+  yuva444p12le
   yuva444p16be
   yuva444p16le
   yuva444p9be
diff --git a/tests/ref/fate/ts-demux b/tests/ref/fate/ts-demux
index eb13ecc..cdf34d6 100644
--- a/tests/ref/fate/ts-demux
+++ b/tests/ref/fate/ts-demux
@@ -15,7 +15,7 @@
 1,       5760,       5760,     2880,     1536, 0xbab5129c
 1,       8640,       8640,     2880,     1536, 0x602f034b, S=1,        1, 0x00bd00bd
 1,      11520,      11520,     2880,      906, 0x69cdcbcd
-0,      32037,      36541,     1501,   114336, 0x37a215a8, S=1,        1, 0x00e000e0
+0,      32037,      36541,     1501,   114336, 0x37a215a8, S=2,        1, 0x00e000e0,       24, 0x663d0b52
 0,      33538,      33538,     1501,    12560, 0xb559a3d4, F=0x0, S=1,        1, 0x00e000e0
 0,      35040,      35040,     1501,    12704, 0x2614adf4, F=0x0, S=1,        1, 0x00e000e0
 0,      36541,      41046,     1501,    51976, 0x9ff1dbfe, F=0x0, S=1,        1, 0x00e000e0
diff --git a/tests/ref/fate/url b/tests/ref/fate/url
index 1a6051e..980b2ce 100644
--- a/tests/ref/fate/url
+++ b/tests/ref/fate/url
@@ -1,13 +1,25 @@
-baz
-/foo/baz
-/baz
-/baz
-http://server/foo/baz
-http://server/foo/baz
-http://server/baz
-http://server/baz
-http://server/baz
-https://other/url
-http://server/baz
-http://server/foo/bar?someparam
-http://other/url
+Testing ff_make_absolute_url:
+                                            (null) baz                  => baz
+                                          /foo/bar baz                  => /foo/baz
+                                          /foo/bar ../baz               => /baz
+                                          /foo/bar /baz                 => /baz
+                                http://server/foo/ baz                  => http://server/foo/baz
+                             http://server/foo/bar baz                  => http://server/foo/baz
+                                http://server/foo/ ../baz               => http://server/baz
+                         http://server/foo/bar/123 ../../baz            => http://server/baz
+                         http://server/foo/bar/123 /baz                 => http://server/baz
+                         http://server/foo/bar/123 https://other/url    => https://other/url
+    http://server/foo/bar?param=value/with/slashes /baz                 => http://server/baz
+            http://server/foo/bar?param&otherparam ?someparam           => http://server/foo/bar?someparam
+                             http://server/foo/bar //other/url          => http://other/url
+
+Testing av_url_split:
+/foo/bar                                                     =>                                                    -1 /foo/bar
+http://server/foo/                                           => http                            server             -1 /foo/
+http://example.com/foo/bar                                   => http                            example.com        -1 /foo/bar
+http://user:pass@localhost:8080/foo/bar/123                  => http            user:pass       localhost        8080 /foo/bar/123
+http://server/foo/bar?param=value/with/slashes               => http                            server             -1 /foo/bar?param=value/with/slashes
+https://1l-lh.a.net/i/1LIVE_HDS@179577/master.m3u8           => https                           1l-lh.a.net        -1 /i/1LIVE_HDS@179577/master.m3u8
+ftp://u:p%2B%2F2@ftp.pbt.com/ExportHD.mpg                    => ftp             u:p%2B%2F2      ftp.pbt.com        -1 /ExportHD.mpg
+https://key.dns.com?key_id=2&model_id=12345&&access_key=     => https                           key.dns.com        -1 ?key_id=2&model_id=12345&&access_key=
+http://example.com#tag                                       => http                            example.com        -1 #tag
diff --git a/tests/ref/fate/vc1test_smm0005 b/tests/ref/fate/vc1test_smm0005
new file mode 100644
index 0000000..0c189ca
--- /dev/null
+++ b/tests/ref/fate/vc1test_smm0005
@@ -0,0 +1,29 @@
+#tb 0: 1/1
+#media_type 0: video
+#codec_id 0: rawvideo
+#dimensions 0: 720x480
+#sar 0: 0/1
+0,          0,          0,        1,   518400, 0xfc2e6c0f
+0,          1,          1,        1,   518400, 0xb6fa68ba
+0,          2,          2,        1,   518400, 0x0c13a4c9
+0,          3,          3,        1,   518400, 0x351e940d
+0,          4,          4,        1,   518400, 0x07ad35cb
+0,          5,          5,        1,   518400, 0x0c2b1413
+0,          6,          6,        1,   518400, 0xf770b86b
+0,          7,          7,        1,   518400, 0xb1ec5f47
+0,          8,          8,        1,   518400, 0xee591da8
+0,          9,          9,        1,   518400, 0x18046c55
+0,         10,         10,        1,   518400, 0xcfe7bb62
+0,         11,         11,        1,   518400, 0x260e7ecd
+0,         12,         12,        1,   518400, 0x3a3034cc
+0,         13,         13,        1,   518400, 0xee7800dd
+0,         14,         14,        1,   518400, 0xdc4176b4
+0,         15,         15,        1,   518400, 0x7bb037db
+0,         16,         16,        1,   518400, 0x4d4721d1
+0,         17,         17,        1,   518400, 0xbd5cc3b4
+0,         18,         18,        1,   518400, 0x678acc34
+0,         19,         19,        1,   518400, 0xb3ffba44
+0,         20,         20,        1,   518400, 0xda9ebefb
+0,         21,         21,        1,   518400, 0xb810bc59
+0,         22,         22,        1,   518400, 0xc79fc02d
+0,         23,         23,        1,   518400, 0x28d9ad0d
diff --git a/tests/ref/fate/vc1test_smm0015 b/tests/ref/fate/vc1test_smm0015
new file mode 100644
index 0000000..3183d6b
--- /dev/null
+++ b/tests/ref/fate/vc1test_smm0015
@@ -0,0 +1,30 @@
+#tb 0: 1/25
+#media_type 0: video
+#codec_id 0: rawvideo
+#dimensions 0: 720x576
+#sar 0: 0/1
+0,          0,          0,        1,   622080, 0x68c84e70
+0,          1,          1,        1,   622080, 0xc29f7155
+0,          2,          2,        1,   622080, 0x78900210
+0,          3,          3,        1,   622080, 0x4d44c353
+0,          4,          4,        1,   622080, 0xd230b3dd
+0,          5,          5,        1,   622080, 0xd72a029c
+0,          6,          6,        1,   622080, 0xc76acb50
+0,          7,          7,        1,   622080, 0xf90816ab
+0,          8,          8,        1,   622080, 0x56996b77
+0,          9,          9,        1,   622080, 0x1784890f
+0,         10,         10,        1,   622080, 0xbc4c81f2
+0,         11,         11,        1,   622080, 0xab5f02ac
+0,         12,         12,        1,   622080, 0x539bb59c
+0,         13,         13,        1,   622080, 0xa34bf120
+0,         14,         14,        1,   622080, 0xa671eaac
+0,         15,         15,        1,   622080, 0x51d77a74
+0,         16,         16,        1,   622080, 0x6d15c7b0
+0,         17,         17,        1,   622080, 0x1bf7535a
+0,         18,         18,        1,   622080, 0x8ed2e73c
+0,         19,         19,        1,   622080, 0x9f4f86a6
+0,         20,         20,        1,   622080, 0x95e05b22
+0,         21,         21,        1,   622080, 0x29c570a0
+0,         22,         22,        1,   622080, 0xc612f057
+0,         23,         23,        1,   622080, 0xe782d106
+0,         24,         24,        1,   622080, 0xeee9a3b7
diff --git a/tests/ref/fate/vp4 b/tests/ref/fate/vp4
new file mode 100644
index 0000000..dae848e
--- /dev/null
+++ b/tests/ref/fate/vp4
@@ -0,0 +1,29 @@
+#tb 0: 1/24
+#media_type 0: video
+#codec_id 0: rawvideo
+#dimensions 0: 608x256
+#sar 0: 0/1
+0,          0,          0,        1,   233472, 0xcf3a25ae
+0,          1,          1,        1,   233472, 0xcc16c0bb
+0,          2,          2,        1,   233472, 0xb2dcf0fd
+0,          3,          3,        1,   233472, 0xbc0f0aea
+0,          4,          4,        1,   233472, 0x97a1b4e9
+0,          5,          5,        1,   233472, 0x40d1661e
+0,          6,          6,        1,   233472, 0x2bc13fe4
+0,          7,          7,        1,   233472, 0xe9ff96b4
+0,          8,          8,        1,   233472, 0xd57585ad
+0,          9,          9,        1,   233472, 0xcf1a0cbe
+0,         10,         10,        1,   233472, 0x4b49d6e0
+0,         11,         11,        1,   233472, 0x9e2562f1
+0,         12,         12,        1,   233472, 0x62675663
+0,         13,         13,        1,   233472, 0x8b27fc45
+0,         14,         14,        1,   233472, 0x437eb1f7
+0,         15,         15,        1,   233472, 0x1be26067
+0,         16,         16,        1,   233472, 0x479f32fb
+0,         17,         17,        1,   233472, 0x405bdeb0
+0,         18,         18,        1,   233472, 0x966b3045
+0,         19,         19,        1,   233472, 0x4630a436
+0,         20,         20,        1,   233472, 0x70141070
+0,         21,         21,        1,   233472, 0x50a66c51
+0,         22,         22,        1,   233472, 0x266e9b5a
+0,         23,         23,        1,   233472, 0xbbde5029
diff --git a/tests/ref/fate/vp5 b/tests/ref/fate/vp5
index 2469a3e..09ebe62 100644
--- a/tests/ref/fate/vp5
+++ b/tests/ref/fate/vp5
@@ -249,4 +249,4 @@
 0,        243,        243,        1,   233472, 0x6f530ac6
 0,        244,        244,        1,   233472, 0x94f7466c
 0,        245,        245,        1,   233472, 0xa8c1d365
-0,        246,        246,        1,   233472, 0xbf73f1b7
+0,        246,        246,        1,   233472, 0x4f3ef38c
diff --git a/tests/ref/fate/vp60 b/tests/ref/fate/vp60
index 4becf2a..2381c27 100644
--- a/tests/ref/fate/vp60
+++ b/tests/ref/fate/vp60
@@ -18,114 +18,114 @@
 0,         12,         12,        1,    55296, 0xe76b7df7
 0,         13,         13,        1,    55296, 0x5a049f33
 0,         14,         14,        1,    55296, 0xc83d9b90
-0,         15,         15,        1,    55296, 0x567877b8
-0,         16,         16,        1,    55296, 0x334c7f6e
-0,         17,         17,        1,    55296, 0x9317945c
-0,         18,         18,        1,    55296, 0xf032831e
-0,         19,         19,        1,    55296, 0x7b6c8d2c
-0,         20,         20,        1,    55296, 0x37109fd6
-0,         21,         21,        1,    55296, 0xe9b0b61b
-0,         22,         22,        1,    55296, 0x7385dae8
-0,         23,         23,        1,    55296, 0x74a8a9f5
-0,         24,         24,        1,    55296, 0xbcd2e218
-0,         25,         25,        1,    55296, 0x0aa6c623
-0,         26,         26,        1,    55296, 0x2224d6d6
-0,         27,         27,        1,    55296, 0x8c8ee4d9
-0,         28,         28,        1,    55296, 0x0d4ceccc
-0,         29,         29,        1,    55296, 0x623f10c7
-0,         30,         30,        1,    55296, 0x13a61f8f
-0,         31,         31,        1,    55296, 0x5343fa8d
-0,         32,         32,        1,    55296, 0x21fef1b5
-0,         33,         33,        1,    55296, 0x380de6b4
-0,         34,         34,        1,    55296, 0x04bedfd3
-0,         35,         35,        1,    55296, 0x428cf510
-0,         36,         36,        1,    55296, 0xbca8c214
-0,         37,         37,        1,    55296, 0x947faa34
-0,         38,         38,        1,    55296, 0x70769f45
-0,         39,         39,        1,    55296, 0xcb9483ad
+0,         15,         15,        1,    55296, 0x464d77d6
+0,         16,         16,        1,    55296, 0x725d7fa2
+0,         17,         17,        1,    55296, 0xc30494d5
+0,         18,         18,        1,    55296, 0x5687839f
+0,         19,         19,        1,    55296, 0x38be8df5
+0,         20,         20,        1,    55296, 0x62afa0ca
+0,         21,         21,        1,    55296, 0x683ab733
+0,         22,         22,        1,    55296, 0xccbedc72
+0,         23,         23,        1,    55296, 0x43c4abc5
+0,         24,         24,        1,    55296, 0xf2f2e3f5
+0,         25,         25,        1,    55296, 0x5fb8c813
+0,         26,         26,        1,    55296, 0x7814d907
+0,         27,         27,        1,    55296, 0xbb87e71a
+0,         28,         28,        1,    55296, 0x41c6ef34
+0,         29,         29,        1,    55296, 0x3f041373
+0,         30,         30,        1,    55296, 0x14b62281
+0,         31,         31,        1,    55296, 0x9a41fddb
+0,         32,         32,        1,    55296, 0x8961f556
+0,         33,         33,        1,    55296, 0x98edea61
+0,         34,         34,        1,    55296, 0x434ae3dd
+0,         35,         35,        1,    55296, 0x0aa4fa23
+0,         36,         36,        1,    55296, 0x0b8bc77f
+0,         37,         37,        1,    55296, 0x79dfafbc
+0,         38,         38,        1,    55296, 0x199ea4da
+0,         39,         39,        1,    55296, 0xd270896d
 0,         40,         40,        1,    55296, 0xac4ea82b
-0,         41,         41,        1,    55296, 0xa3816977
-0,         42,         42,        1,    55296, 0xcfd54ec4
-0,         43,         43,        1,    55296, 0x97743f0e
-0,         44,         44,        1,    55296, 0x4cb4424d
-0,         45,         45,        1,    55296, 0x0b503c11
-0,         46,         46,        1,    55296, 0x879f333a
-0,         47,         47,        1,    55296, 0x6ff9eb8f
-0,         48,         48,        1,    55296, 0x7cd6e5af
-0,         49,         49,        1,    55296, 0x44e2c36f
-0,         50,         50,        1,    55296, 0x4e8993fb
-0,         51,         51,        1,    55296, 0xf0bb9664
-0,         52,         52,        1,    55296, 0xde608458
-0,         53,         53,        1,    55296, 0xb3017f01
-0,         54,         54,        1,    55296, 0x2e096579
-0,         55,         55,        1,    55296, 0xd7295790
-0,         56,         56,        1,    55296, 0xc40b81cb
-0,         57,         57,        1,    55296, 0x53a86e41
-0,         58,         58,        1,    55296, 0x74142f89
-0,         59,         59,        1,    55296, 0x2a1428ce
-0,         60,         60,        1,    55296, 0x5d0c2852
-0,         61,         61,        1,    55296, 0x162058a4
-0,         62,         62,        1,    55296, 0x4e8c6ce8
-0,         63,         63,        1,    55296, 0x1d382af2
-0,         64,         64,        1,    55296, 0x35dd2b75
-0,         65,         65,        1,    55296, 0x1e4c205f
-0,         66,         66,        1,    55296, 0x74a22383
-0,         67,         67,        1,    55296, 0x6ddb237d
-0,         68,         68,        1,    55296, 0xd290263b
-0,         69,         69,        1,    55296, 0xc778249f
+0,         41,         41,        1,    55296, 0x770b6984
+0,         42,         42,        1,    55296, 0x378b4f1a
+0,         43,         43,        1,    55296, 0xe8253faf
+0,         44,         44,        1,    55296, 0xc8224326
+0,         45,         45,        1,    55296, 0x22b33d1b
+0,         46,         46,        1,    55296, 0x83c33475
+0,         47,         47,        1,    55296, 0xbd2aed59
+0,         48,         48,        1,    55296, 0xe058e7e6
+0,         49,         49,        1,    55296, 0x575fc611
+0,         50,         50,        1,    55296, 0x218196dd
+0,         51,         51,        1,    55296, 0x0882998c
+0,         52,         52,        1,    55296, 0x380887dd
+0,         53,         53,        1,    55296, 0x833f82c8
+0,         54,         54,        1,    55296, 0x9db9697b
+0,         55,         55,        1,    55296, 0xb8dd5be8
+0,         56,         56,        1,    55296, 0x1df1869b
+0,         57,         57,        1,    55296, 0xe0bd7399
+0,         58,         58,        1,    55296, 0xc2413536
+0,         59,         59,        1,    55296, 0x90bb2ebf
+0,         60,         60,        1,    55296, 0x6fe72e97
+0,         61,         61,        1,    55296, 0x41385f50
+0,         62,         62,        1,    55296, 0x360973b0
+0,         63,         63,        1,    55296, 0x211d31c4
+0,         64,         64,        1,    55296, 0xe40632a9
+0,         65,         65,        1,    55296, 0xc4052794
+0,         66,         66,        1,    55296, 0x2ff82adf
+0,         67,         67,        1,    55296, 0x7d272ac3
+0,         68,         68,        1,    55296, 0x37512dcc
+0,         69,         69,        1,    55296, 0x66832c7f
 0,         70,         70,        1,    55296, 0xbc1046fb
 0,         71,         71,        1,    55296, 0xf44d470f
 0,         72,         72,        1,    55296, 0x28d85a11
-0,         73,         73,        1,    55296, 0xa68953b6
-0,         74,         74,        1,    55296, 0x02593ce5
-0,         75,         75,        1,    55296, 0x61be53d5
-0,         76,         76,        1,    55296, 0x4c503c54
-0,         77,         77,        1,    55296, 0x3d3e60f7
-0,         78,         78,        1,    55296, 0xec876b9d
-0,         79,         79,        1,    55296, 0x5b5f59e4
-0,         80,         80,        1,    55296, 0xbd2d5f84
-0,         81,         81,        1,    55296, 0xaa7a6410
-0,         82,         82,        1,    55296, 0xaa196189
-0,         83,         83,        1,    55296, 0x81365cca
-0,         84,         84,        1,    55296, 0xa85f6861
-0,         85,         85,        1,    55296, 0xcb46562e
-0,         86,         86,        1,    55296, 0x1b935862
-0,         87,         87,        1,    55296, 0x80a45a60
-0,         88,         88,        1,    55296, 0x8e8aabba
-0,         89,         89,        1,    55296, 0x38939b53
-0,         90,         90,        1,    55296, 0x4f397c22
-0,         91,         91,        1,    55296, 0x7d0d8476
-0,         92,         92,        1,    55296, 0x943e8044
-0,         93,         93,        1,    55296, 0xabc6b323
-0,         94,         94,        1,    55296, 0x87dfb605
-0,         95,         95,        1,    55296, 0x5ca89202
+0,         73,         73,        1,    55296, 0xbdb153c7
+0,         74,         74,        1,    55296, 0x87093d2d
+0,         75,         75,        1,    55296, 0x132c5459
+0,         76,         76,        1,    55296, 0x293e3cff
+0,         77,         77,        1,    55296, 0x1a2c61a2
+0,         78,         78,        1,    55296, 0xc9756c48
+0,         79,         79,        1,    55296, 0xd90f5a89
+0,         80,         80,        1,    55296, 0x83eb6053
+0,         81,         81,        1,    55296, 0x713864df
+0,         82,         82,        1,    55296, 0xf0ef6273
+0,         83,         83,        1,    55296, 0x24875dc4
+0,         84,         84,        1,    55296, 0x094a696e
+0,         85,         85,        1,    55296, 0xe2d95761
+0,         86,         86,        1,    55296, 0x33265995
+0,         87,         87,        1,    55296, 0xc24b5bb9
+0,         88,         88,        1,    55296, 0xc130ad3d
+0,         89,         89,        1,    55296, 0x42389d02
+0,         90,         90,        1,    55296, 0x372b7dbd
+0,         91,         91,        1,    55296, 0x8645860d
+0,         92,         92,        1,    55296, 0x218581dc
+0,         93,         93,        1,    55296, 0xaea2b4e7
+0,         94,         94,        1,    55296, 0x3b14b7fa
+0,         95,         95,        1,    55296, 0x7b7d93f7
 0,         96,         96,        1,    55296, 0x61bc9b27
 0,         97,         97,        1,    55296, 0x1e4baa30
-0,         98,         98,        1,    55296, 0xd8a7adb0
+0,         98,         98,        1,    55296, 0x2a6dadac
 0,         99,         99,        1,    55296, 0x0d0aa8fb
-0,        100,        100,        1,    55296, 0x1f1ba33c
-0,        101,        101,        1,    55296, 0xa000a80b
-0,        102,        102,        1,    55296, 0xb49dd332
-0,        103,        103,        1,    55296, 0x6b8ac499
-0,        104,        104,        1,    55296, 0x9636ed15
-0,        105,        105,        1,    55296, 0xa152f03d
-0,        106,        106,        1,    55296, 0x47a8cfc7
-0,        107,        107,        1,    55296, 0x9f94c82a
-0,        108,        108,        1,    55296, 0xe208d626
-0,        109,        109,        1,    55296, 0x28cc0616
-0,        110,        110,        1,    55296, 0xc545179e
-0,        111,        111,        1,    55296, 0xd38e05af
-0,        112,        112,        1,    55296, 0x25d6ed99
-0,        113,        113,        1,    55296, 0x7a6bf86e
-0,        114,        114,        1,    55296, 0xbb3bfbcd
-0,        115,        115,        1,    55296, 0x33de2984
-0,        116,        116,        1,    55296, 0xd5b10c27
-0,        117,        117,        1,    55296, 0x19e31f78
-0,        118,        118,        1,    55296, 0xf62f1a4f
-0,        119,        119,        1,    55296, 0x3f792203
-0,        120,        120,        1,    55296, 0xe4ed6202
-0,        121,        121,        1,    55296, 0xee265136
-0,        122,        122,        1,    55296, 0x408af73c
+0,        100,        100,        1,    55296, 0x3c6aa33a
+0,        101,        101,        1,    55296, 0xbd4fa809
+0,        102,        102,        1,    55296, 0x55edd382
+0,        103,        103,        1,    55296, 0x6a9cc4df
+0,        104,        104,        1,    55296, 0x49a5ed7f
+0,        105,        105,        1,    55296, 0x0c33f0b3
+0,        106,        106,        1,    55296, 0xd5e4d037
+0,        107,        107,        1,    55296, 0x2ddfc89a
+0,        108,        108,        1,    55296, 0xb39ed6c6
+0,        109,        109,        1,    55296, 0x8fe606e2
+0,        110,        110,        1,    55296, 0x10ce18ec
+0,        111,        111,        1,    55296, 0xe2110705
+0,        112,        112,        1,    55296, 0x1a00ef28
+0,        113,        113,        1,    55296, 0x9c90fa21
+0,        114,        114,        1,    55296, 0xfafffdbe
+0,        115,        115,        1,    55296, 0x741e2bc8
+0,        116,        116,        1,    55296, 0xf5b00ece
+0,        117,        117,        1,    55296, 0x3b2e224d
+0,        118,        118,        1,    55296, 0x29e81d73
+0,        119,        119,        1,    55296, 0xe3412580
+0,        120,        120,        1,    55296, 0x3c2865dc
+0,        121,        121,        1,    55296, 0xd4b5553b
+0,        122,        122,        1,    55296, 0x1ad8fa27
 0,        123,        123,        1,    55296, 0xc1533ef5
 0,        124,        124,        1,    55296, 0xf671f85d
 0,        125,        125,        1,    55296, 0xae2670e0
diff --git a/tests/ref/fate/vp61 b/tests/ref/fate/vp61
index 2d3beea..13146c4 100644
--- a/tests/ref/fate/vp61
+++ b/tests/ref/fate/vp61
@@ -4,122 +4,122 @@
 #dimensions 0: 112x112
 #sar 0: 0/1
 0,          0,          0,        1,    18816, 0xc3fe9fc7
-0,          1,          1,        1,    18816, 0x6ddf972f
-0,          2,          2,        1,    18816, 0x72808b6e
-0,          3,          3,        1,    18816, 0x8f09857f
-0,          4,          4,        1,    18816, 0xe8027c00
-0,          5,          5,        1,    18816, 0x308670cf
-0,          6,          6,        1,    18816, 0x0e656170
-0,          7,          7,        1,    18816, 0x594e54a4
-0,          8,          8,        1,    18816, 0x36944b05
-0,          9,          9,        1,    18816, 0x87013a34
-0,         10,         10,        1,    18816, 0xc0f32f0d
-0,         11,         11,        1,    18816, 0x911f1951
-0,         12,         12,        1,    18816, 0xad590d59
-0,         13,         13,        1,    18816, 0x943afff0
-0,         14,         14,        1,    18816, 0x7f5ef719
-0,         15,         15,        1,    18816, 0x889feafc
-0,         16,         16,        1,    18816, 0x4334e12b
-0,         17,         17,        1,    18816, 0xd080cc67
-0,         18,         18,        1,    18816, 0xc3c1c04c
-0,         19,         19,        1,    18816, 0x816bae4b
-0,         20,         20,        1,    18816, 0xed23a5c7
-0,         21,         21,        1,    18816, 0x86689c2f
-0,         22,         22,        1,    18816, 0x63408c52
-0,         23,         23,        1,    18816, 0x399c79d6
-0,         24,         24,        1,    18816, 0xf0ff63bf
-0,         25,         25,        1,    18816, 0xa6185353
-0,         26,         26,        1,    18816, 0xe33d46fc
-0,         27,         27,        1,    18816, 0xd58d3c6d
-0,         28,         28,        1,    18816, 0xc94a27ea
-0,         29,         29,        1,    18816, 0x62f31c59
-0,         30,         30,        1,    18816, 0x71880825
-0,         31,         31,        1,    18816, 0xa6ce01d7
-0,         32,         32,        1,    18816, 0xa1d4fc06
-0,         33,         33,        1,    18816, 0xc208f570
-0,         34,         34,        1,    18816, 0xc862e637
-0,         35,         35,        1,    18816, 0xcf9ed93a
-0,         36,         36,        1,    18816, 0x85a8cbcc
-0,         37,         37,        1,    18816, 0x650ac6c1
-0,         38,         38,        1,    18816, 0xb418c12b
-0,         39,         39,        1,    18816, 0x9fe5b412
-0,         40,         40,        1,    18816, 0x80f6a7c1
-0,         41,         41,        1,    18816, 0x283299e4
-0,         42,         42,        1,    18816, 0x15429202
-0,         43,         43,        1,    18816, 0x9f0f8c8a
-0,         44,         44,        1,    18816, 0x8e828811
-0,         45,         45,        1,    18816, 0xaac67993
-0,         46,         46,        1,    18816, 0x8f3b6f4f
-0,         47,         47,        1,    18816, 0x0b125f95
-0,         48,         48,        1,    18816, 0xb4e75d14
-0,         49,         49,        1,    18816, 0x1bac5933
-0,         50,         50,        1,    18816, 0x300b521b
-0,         51,         51,        1,    18816, 0x51174590
-0,         52,         52,        1,    18816, 0x03df3d70
-0,         53,         53,        1,    18816, 0x338a344a
-0,         54,         54,        1,    18816, 0x45ad328d
-0,         55,         55,        1,    18816, 0x2d4e321a
-0,         56,         56,        1,    18816, 0x15932563
-0,         57,         57,        1,    18816, 0x9b4f1c76
-0,         58,         58,        1,    18816, 0x8e31153c
-0,         59,         59,        1,    18816, 0xfb391185
-0,         60,         60,        1,    18816, 0x93ee0cdc
-0,         61,         61,        1,    18816, 0xddeb0642
-0,         62,         62,        1,    18816, 0xda6cf529
-0,         63,         63,        1,    18816, 0xdbd6f085
-0,         64,         64,        1,    18816, 0x357aec81
-0,         65,         65,        1,    18816, 0x36eaecca
-0,         66,         66,        1,    18816, 0x6535ee02
-0,         67,         67,        1,    18816, 0xb7dfe466
-0,         68,         68,        1,    18816, 0x58d3d86b
-0,         69,         69,        1,    18816, 0xd8aad64b
-0,         70,         70,        1,    18816, 0x37ecd588
-0,         71,         71,        1,    18816, 0xe2f9cee4
-0,         72,         72,        1,    18816, 0xcd1ac93e
-0,         73,         73,        1,    18816, 0x18e1be81
-0,         74,         74,        1,    18816, 0xa05bb9d7
-0,         75,         75,        1,    18816, 0xe0ebb663
-0,         76,         76,        1,    18816, 0x7d61b39a
-0,         77,         77,        1,    18816, 0x01b8acb5
-0,         78,         78,        1,    18816, 0x7577aa8b
-0,         79,         79,        1,    18816, 0x6bbda4b5
-0,         80,         80,        1,    18816, 0xd0cc9b29
-0,         81,         81,        1,    18816, 0xb2858cbb
-0,         82,         82,        1,    18816, 0x93608c9d
-0,         83,         83,        1,    18816, 0x80c38e03
-0,         84,         84,        1,    18816, 0x37d6843c
-0,         85,         85,        1,    18816, 0xacc47b9a
-0,         86,         86,        1,    18816, 0xc4317178
-0,         87,         87,        1,    18816, 0xc92f6ebd
-0,         88,         88,        1,    18816, 0xc1217a3b
-0,         89,         89,        1,    18816, 0x03a37ccb
-0,         90,         90,        1,    18816, 0xf38c71a2
-0,         91,         91,        1,    18816, 0x68ff697d
-0,         92,         92,        1,    18816, 0x0fe358e5
-0,         93,         93,        1,    18816, 0x58455870
-0,         94,         94,        1,    18816, 0xc9075ce7
-0,         95,         95,        1,    18816, 0x16685773
-0,         96,         96,        1,    18816, 0x1b434c0e
-0,         97,         97,        1,    18816, 0x008e4c97
-0,         98,         98,        1,    18816, 0xb4d04f4f
-0,         99,         99,        1,    18816, 0xc8c94848
-0,        100,        100,        1,    18816, 0x64664191
-0,        101,        101,        1,    18816, 0xd591367f
-0,        102,        102,        1,    18816, 0xc70d3141
-0,        103,        103,        1,    18816, 0x8d492655
-0,        104,        104,        1,    18816, 0x7e7f22c8
-0,        105,        105,        1,    18816, 0x335d23f9
-0,        106,        106,        1,    18816, 0x0a7f22b6
-0,        107,        107,        1,    18816, 0x6cf51cb2
-0,        108,        108,        1,    18816, 0x312516e1
-0,        109,        109,        1,    18816, 0x8a3c0c7a
-0,        110,        110,        1,    18816, 0x997d0d20
-0,        111,        111,        1,    18816, 0xffbd117e
-0,        112,        112,        1,    18816, 0x855808ca
-0,        113,        113,        1,    18816, 0xe335fb94
-0,        114,        114,        1,    18816, 0x12e6f95c
-0,        115,        115,        1,    18816, 0x2d62f845
-0,        116,        116,        1,    18816, 0x7e63f591
-0,        117,        117,        1,    18816, 0x7463f175
-0,        118,        118,        1,    18816, 0x1521e0d2
-0,        119,        119,        1,    18816, 0x96a8dbce
+0,          1,          1,        1,    18816, 0xab429744
+0,          2,          2,        1,    18816, 0x1eec8b7d
+0,          3,          3,        1,    18816, 0x3817859f
+0,          4,          4,        1,    18816, 0x8f487c41
+0,          5,          5,        1,    18816, 0x4ce87138
+0,          6,          6,        1,    18816, 0x499361dd
+0,          7,          7,        1,    18816, 0xd26c5518
+0,          8,          8,        1,    18816, 0xfb1a4b88
+0,          9,          9,        1,    18816, 0x4ac63ac7
+0,         10,         10,        1,    18816, 0x39642fad
+0,         11,         11,        1,    18816, 0x4dd219f6
+0,         12,         12,        1,    18816, 0x6c500df7
+0,         13,         13,        1,    18816, 0x700e00b4
+0,         14,         14,        1,    18816, 0xbebaf7e0
+0,         15,         15,        1,    18816, 0x22c1ebf6
+0,         16,         16,        1,    18816, 0x723fe229
+0,         17,         17,        1,    18816, 0x9b22cd91
+0,         18,         18,        1,    18816, 0x45ddc17a
+0,         19,         19,        1,    18816, 0x9b33af88
+0,         20,         20,        1,    18816, 0xf9d1a70d
+0,         21,         21,        1,    18816, 0x9bfd9d84
+0,         22,         22,        1,    18816, 0x27048da1
+0,         23,         23,        1,    18816, 0x0e497b2d
+0,         24,         24,        1,    18816, 0x508264fd
+0,         25,         25,        1,    18816, 0xf6985495
+0,         26,         26,        1,    18816, 0xa5014869
+0,         27,         27,        1,    18816, 0x426e3de4
+0,         28,         28,        1,    18816, 0xd72129b9
+0,         29,         29,        1,    18816, 0x12e51e1c
+0,         30,         30,        1,    18816, 0x754109eb
+0,         31,         31,        1,    18816, 0x2fb5039e
+0,         32,         32,        1,    18816, 0x9407fdea
+0,         33,         33,        1,    18816, 0x59f2f752
+0,         34,         34,        1,    18816, 0xb448e831
+0,         35,         35,        1,    18816, 0xf31fdb2e
+0,         36,         36,        1,    18816, 0x6bedcdec
+0,         37,         37,        1,    18816, 0xbbfec8e6
+0,         38,         38,        1,    18816, 0x104ac345
+0,         39,         39,        1,    18816, 0xd387b629
+0,         40,         40,        1,    18816, 0x4187a9e7
+0,         41,         41,        1,    18816, 0x1c649c17
+0,         42,         42,        1,    18816, 0xcc869431
+0,         43,         43,        1,    18816, 0x8bc78ed1
+0,         44,         44,        1,    18816, 0x34de8a5f
+0,         45,         45,        1,    18816, 0x42727bd0
+0,         46,         46,        1,    18816, 0x6e9c7192
+0,         47,         47,        1,    18816, 0xd93761c1
+0,         48,         48,        1,    18816, 0x69455f50
+0,         49,         49,        1,    18816, 0xa35d5b8b
+0,         50,         50,        1,    18816, 0xe6635469
+0,         51,         51,        1,    18816, 0x285d47f9
+0,         52,         52,        1,    18816, 0xdb0a3fdf
+0,         53,         53,        1,    18816, 0x608336d0
+0,         54,         54,        1,    18816, 0x39e9353f
+0,         55,         55,        1,    18816, 0xad2034bd
+0,         56,         56,        1,    18816, 0xa0f527e7
+0,         57,         57,        1,    18816, 0x5ed71ef1
+0,         58,         58,        1,    18816, 0xd2df1798
+0,         59,         59,        1,    18816, 0x932513d3
+0,         60,         60,        1,    18816, 0xab600f1b
+0,         61,         61,        1,    18816, 0x665d087e
+0,         62,         62,        1,    18816, 0x8d71f765
+0,         63,         63,        1,    18816, 0xfc80f2ae
+0,         64,         64,        1,    18816, 0x885bee81
+0,         65,         65,        1,    18816, 0x6c4feec9
+0,         66,         66,        1,    18816, 0x5010f017
+0,         67,         67,        1,    18816, 0x63d5e683
+0,         68,         68,        1,    18816, 0x216ddab5
+0,         69,         69,        1,    18816, 0xb758d8c2
+0,         70,         70,        1,    18816, 0xeae4d7e5
+0,         71,         71,        1,    18816, 0x2553d137
+0,         72,         72,        1,    18816, 0xced6cb97
+0,         73,         73,        1,    18816, 0xd332c103
+0,         74,         74,        1,    18816, 0xe84bbc67
+0,         75,         75,        1,    18816, 0x21f7b90d
+0,         76,         76,        1,    18816, 0xbd88b648
+0,         77,         77,        1,    18816, 0xe7b8af59
+0,         78,         78,        1,    18816, 0x30f5ad3d
+0,         79,         79,        1,    18816, 0x79bfa7bb
+0,         80,         80,        1,    18816, 0xd5919e34
+0,         81,         81,        1,    18816, 0x43758fda
+0,         82,         82,        1,    18816, 0x93ff8fcc
+0,         83,         83,        1,    18816, 0xa444913f
+0,         84,         84,        1,    18816, 0xc41d878b
+0,         85,         85,        1,    18816, 0x526d7f09
+0,         86,         86,        1,    18816, 0x40307528
+0,         87,         87,        1,    18816, 0xf63d725c
+0,         88,         88,        1,    18816, 0x45587ddb
+0,         89,         89,        1,    18816, 0x37018069
+0,         90,         90,        1,    18816, 0x69567572
+0,         91,         91,        1,    18816, 0xa8086d54
+0,         92,         92,        1,    18816, 0x2ab65ccc
+0,         93,         93,        1,    18816, 0xa5475c5d
+0,         94,         94,        1,    18816, 0x87dc60e2
+0,         95,         95,        1,    18816, 0x54295b5d
+0,         96,         96,        1,    18816, 0xce424fe9
+0,         97,         97,        1,    18816, 0x99e0506d
+0,         98,         98,        1,    18816, 0x6ac55324
+0,         99,         99,        1,    18816, 0xa60f4c1a
+0,        100,        100,        1,    18816, 0x7eba456e
+0,        101,        101,        1,    18816, 0xab703a88
+0,        102,        102,        1,    18816, 0xb8263539
+0,        103,        103,        1,    18816, 0x829e2abb
+0,        104,        104,        1,    18816, 0x2e9f2736
+0,        105,        105,        1,    18816, 0x7a3d2885
+0,        106,        106,        1,    18816, 0x8023274f
+0,        107,        107,        1,    18816, 0x39bf2196
+0,        108,        108,        1,    18816, 0x21cf1bcb
+0,        109,        109,        1,    18816, 0x016911b9
+0,        110,        110,        1,    18816, 0x2a791237
+0,        111,        111,        1,    18816, 0x093f16a7
+0,        112,        112,        1,    18816, 0x07a90df3
+0,        113,        113,        1,    18816, 0x8de800ca
+0,        114,        114,        1,    18816, 0xe379fe68
+0,        115,        115,        1,    18816, 0x267afd69
+0,        116,        116,        1,    18816, 0x5b29fac1
+0,        117,        117,        1,    18816, 0x3606f6b6
+0,        118,        118,        1,    18816, 0xcbdce61e
+0,        119,        119,        1,    18816, 0x28ffe113
diff --git a/tests/ref/fate/vp6a b/tests/ref/fate/vp6a
index b4f3363..8fb2630 100644
--- a/tests/ref/fate/vp6a
+++ b/tests/ref/fate/vp6a
@@ -4,95 +4,95 @@
 #dimensions 0: 300x180
 #sar 0: 0/1
 0,          0,          0,        1,   135000, 0x9dceed6d
-0,          1,          1,        1,   135000, 0x47e5778d
-0,          2,          2,        1,   135000, 0x5de36599
-0,          3,          3,        1,   135000, 0x540d8079
-0,          4,          4,        1,   135000, 0xba9ea534
-0,          5,          5,        1,   135000, 0xa75088f8
-0,          6,          6,        1,   135000, 0x7d867559
-0,          7,          7,        1,   135000, 0xcc678fee
-0,          8,          8,        1,   135000, 0x79c590b9
-0,          9,          9,        1,   135000, 0x87789918
-0,         10,         10,        1,   135000, 0xaa939213
-0,         11,         11,        1,   135000, 0x3912916d
-0,         12,         12,        1,   135000, 0x41305d0b
-0,         13,         13,        1,   135000, 0x2686b5dd
-0,         14,         14,        1,   135000, 0xa69ae422
-0,         15,         15,        1,   135000, 0x998a3478
-0,         16,         16,        1,   135000, 0x5842768d
-0,         17,         17,        1,   135000, 0xf6a85b16
-0,         18,         18,        1,   135000, 0x7a5b2708
-0,         19,         19,        1,   135000, 0x8b2abb63
-0,         20,         20,        1,   135000, 0x7dc8468b
-0,         21,         21,        1,   135000, 0x04d85001
-0,         22,         22,        1,   135000, 0x83e3c647
-0,         23,         23,        1,   135000, 0xcddd687e
-0,         24,         24,        1,   135000, 0x818e785e
-0,         25,         25,        1,   135000, 0x3a915080
-0,         26,         26,        1,   135000, 0x953d603d
-0,         27,         27,        1,   135000, 0x79005ebf
-0,         28,         28,        1,   135000, 0x80afec75
-0,         29,         29,        1,   135000, 0xfc8e376b
-0,         30,         30,        1,   135000, 0xf957b7ef
-0,         31,         31,        1,   135000, 0xe878da44
-0,         32,         32,        1,   135000, 0xe68ecca3
-0,         33,         33,        1,   135000, 0x1a2cc7d3
-0,         34,         34,        1,   135000, 0x4f346a69
-0,         35,         35,        1,   135000, 0x7a0cf4ac
-0,         36,         36,        1,   135000, 0x6d4eee7a
-0,         37,         37,        1,   135000, 0xf0688cbd
-0,         38,         38,        1,   135000, 0xca4abbbc
-0,         39,         39,        1,   135000, 0x87669519
-0,         40,         40,        1,   135000, 0xd090e9d7
-0,         41,         41,        1,   135000, 0xd7f536c1
-0,         42,         42,        1,   135000, 0x353ede54
-0,         43,         43,        1,   135000, 0xbc8f5358
-0,         44,         44,        1,   135000, 0xb52cd59a
-0,         45,         45,        1,   135000, 0x0b882eba
-0,         46,         46,        1,   135000, 0xc544cd54
-0,         47,         47,        1,   135000, 0x31ca7e73
+0,          1,          1,        1,   135000, 0x1fc377a4
+0,          2,          2,        1,   135000, 0x0b4465d4
+0,          3,          3,        1,   135000, 0x136b8062
+0,          4,          4,        1,   135000, 0x4691a55c
+0,          5,          5,        1,   135000, 0x55bb8a19
+0,          6,          6,        1,   135000, 0xdbf67651
+0,          7,          7,        1,   135000, 0x6fb19113
+0,          8,          8,        1,   135000, 0x3edc9227
+0,          9,          9,        1,   135000, 0x53b39aff
+0,         10,         10,        1,   135000, 0x699e94b0
+0,         11,         11,        1,   135000, 0xeedd9388
+0,         12,         12,        1,   135000, 0x14055f96
+0,         13,         13,        1,   135000, 0x71fbb5fd
+0,         14,         14,        1,   135000, 0x6fb4e491
+0,         15,         15,        1,   135000, 0x35ca3482
+0,         16,         16,        1,   135000, 0x0c2a7530
+0,         17,         17,        1,   135000, 0x422c5581
+0,         18,         18,        1,   135000, 0x19eb2155
+0,         19,         19,        1,   135000, 0x07e1b114
+0,         20,         20,        1,   135000, 0xa10f3f81
+0,         21,         21,        1,   135000, 0x75684dcd
+0,         22,         22,        1,   135000, 0x1721c337
+0,         23,         23,        1,   135000, 0x3897667d
+0,         24,         24,        1,   135000, 0x1232769e
+0,         25,         25,        1,   135000, 0xec975059
+0,         26,         26,        1,   135000, 0xb2a46123
+0,         27,         27,        1,   135000, 0x052c5f72
+0,         28,         28,        1,   135000, 0x3087eb2f
+0,         29,         29,        1,   135000, 0xd1e0373a
+0,         30,         30,        1,   135000, 0x64dab704
+0,         31,         31,        1,   135000, 0xa44dd89e
+0,         32,         32,        1,   135000, 0x380ecae9
+0,         33,         33,        1,   135000, 0x8c6fc4ab
+0,         34,         34,        1,   135000, 0x02096903
+0,         35,         35,        1,   135000, 0x11edf432
+0,         36,         36,        1,   135000, 0x3585ee5f
+0,         37,         37,        1,   135000, 0xe1338c40
+0,         38,         38,        1,   135000, 0x5edfbd0c
+0,         39,         39,        1,   135000, 0x9420965c
+0,         40,         40,        1,   135000, 0x0caceb17
+0,         41,         41,        1,   135000, 0x3fdc36c3
+0,         42,         42,        1,   135000, 0x8a24df14
+0,         43,         43,        1,   135000, 0x5dc057b0
+0,         44,         44,        1,   135000, 0xdc5eda65
+0,         45,         45,        1,   135000, 0x60433612
+0,         46,         46,        1,   135000, 0x6a91d6c9
+0,         47,         47,        1,   135000, 0x53598734
 0,         48,         48,        1,   135000, 0xb1569ce9
-0,         49,         49,        1,   135000, 0x8bf4394f
-0,         50,         50,        1,   135000, 0xf413812a
-0,         51,         51,        1,   135000, 0xf2fa90ab
-0,         52,         52,        1,   135000, 0xdcd8b265
-0,         53,         53,        1,   135000, 0xa89cdba1
-0,         54,         54,        1,   135000, 0x212b59a5
-0,         55,         55,        1,   135000, 0x10c589c3
-0,         56,         56,        1,   135000, 0x432ab5b4
+0,         49,         49,        1,   135000, 0xf5e83a33
+0,         50,         50,        1,   135000, 0xebe18275
+0,         51,         51,        1,   135000, 0x98af9447
+0,         52,         52,        1,   135000, 0x3f03b765
+0,         53,         53,        1,   135000, 0x7423e0b8
+0,         54,         54,        1,   135000, 0x6c1b5faa
+0,         55,         55,        1,   135000, 0xebf98d52
+0,         56,         56,        1,   135000, 0xf3dfb8b6
 0,         57,         57,        1,   135000, 0x85a9634a
-0,         58,         58,        1,   135000, 0x10db5b87
-0,         59,         59,        1,   135000, 0x583145d9
-0,         60,         60,        1,   135000, 0x7d3a33bd
-0,         61,         61,        1,   135000, 0xcf592423
-0,         62,         62,        1,   135000, 0xb59728e5
-0,         63,         63,        1,   135000, 0x1eeca660
-0,         64,         64,        1,   135000, 0xff7bcc34
-0,         65,         65,        1,   135000, 0x0ef8f271
-0,         66,         66,        1,   135000, 0x8c9ca8ee
-0,         67,         67,        1,   135000, 0x8a7ece34
-0,         68,         68,        1,   135000, 0x7d4c3b5d
-0,         69,         69,        1,   135000, 0x99118f21
-0,         70,         70,        1,   135000, 0xd97fe7e2
-0,         71,         71,        1,   135000, 0xf93842f1
-0,         72,         72,        1,   135000, 0x35c912e8
-0,         73,         73,        1,   135000, 0x14e59e97
+0,         58,         58,        1,   135000, 0x4d425bb5
+0,         59,         59,        1,   135000, 0xfb7945ee
+0,         60,         60,        1,   135000, 0x593534c1
+0,         61,         61,        1,   135000, 0xe3fa2517
+0,         62,         62,        1,   135000, 0x893629e3
+0,         63,         63,        1,   135000, 0xdc3ca6ad
+0,         64,         64,        1,   135000, 0x16b1ce27
+0,         65,         65,        1,   135000, 0x8296f478
+0,         66,         66,        1,   135000, 0x9e9baaa3
+0,         67,         67,        1,   135000, 0x994ecd4a
+0,         68,         68,        1,   135000, 0x40f83b3c
+0,         69,         69,        1,   135000, 0x0de38f90
+0,         70,         70,        1,   135000, 0x5455ea6c
+0,         71,         71,        1,   135000, 0x053e41e8
+0,         72,         72,        1,   135000, 0x0fee1281
+0,         73,         73,        1,   135000, 0xa0c9a434
 0,         74,         74,        1,   135000, 0x8e4c19aa
-0,         75,         75,        1,   135000, 0x4adfbc53
-0,         76,         76,        1,   135000, 0x0613adde
-0,         77,         77,        1,   135000, 0x8db264ab
-0,         78,         78,        1,   135000, 0x3948b619
-0,         79,         79,        1,   135000, 0x843d7c02
-0,         80,         80,        1,   135000, 0x534fea34
+0,         75,         75,        1,   135000, 0x34bebc00
+0,         76,         76,        1,   135000, 0x6670ad6f
+0,         77,         77,        1,   135000, 0xdbba63fc
+0,         78,         78,        1,   135000, 0xe34fb839
+0,         79,         79,        1,   135000, 0xa3ce7eb1
+0,         80,         80,        1,   135000, 0xdec7ed7d
 0,         81,         81,        1,   135000, 0xdb7041bf
-0,         82,         82,        1,   135000, 0xd0ce1cce
-0,         83,         83,        1,   135000, 0x3c008335
-0,         84,         84,        1,   135000, 0xb699208f
-0,         85,         85,        1,   135000, 0xe07da3ca
-0,         86,         86,        1,   135000, 0x26331f41
-0,         87,         87,        1,   135000, 0x4e19fe83
-0,         88,         88,        1,   135000, 0xaa9a9e45
-0,         89,         89,        1,   135000, 0x336b7ed0
-0,         90,         90,        1,   135000, 0xc9bf7611
+0,         82,         82,        1,   135000, 0x2b1d1dc1
+0,         83,         83,        1,   135000, 0xaaa384c1
+0,         84,         84,        1,   135000, 0x37f42217
+0,         85,         85,        1,   135000, 0x928ba4da
+0,         86,         86,        1,   135000, 0x2b681f41
+0,         87,         87,        1,   135000, 0xcbe1ff84
+0,         88,         88,        1,   135000, 0x47949f24
+0,         89,         89,        1,   135000, 0x368b7fe5
+0,         90,         90,        1,   135000, 0x1cf4773b
 0,         91,         91,        1,   135000, 0x14c33a35
 0,         92,         92,        1,   135000, 0xdc08470e
diff --git a/tests/ref/fate/vp6a-skip_alpha b/tests/ref/fate/vp6a-skip_alpha
index e2c435f..f092778 100644
--- a/tests/ref/fate/vp6a-skip_alpha
+++ b/tests/ref/fate/vp6a-skip_alpha
@@ -4,95 +4,95 @@
 #dimensions 0: 300x180
 #sar 0: 0/1
 0,          0,          0,        1,    81000, 0xcb92962d
-0,          1,          1,        1,    81000, 0xae381904
-0,          2,          2,        1,    81000, 0x1fcc0c75
-0,          3,          3,        1,    81000, 0x023f0c21
-0,          4,          4,        1,    81000, 0xad691402
-0,          5,          5,        1,    81000, 0x42390be0
-0,          6,          6,        1,    81000, 0xc1c10a4e
-0,          7,          7,        1,    81000, 0x9c0315ac
-0,          8,          8,        1,    81000, 0xc2a315a7
-0,          9,          9,        1,    81000, 0x3a631392
-0,         10,         10,        1,    81000, 0x11591414
-0,         11,         11,        1,    81000, 0x1a551125
-0,         12,         12,        1,    81000, 0x2e1efa4f
-0,         13,         13,        1,    81000, 0x4aa3f016
-0,         14,         14,        1,    81000, 0x74c029d8
-0,         15,         15,        1,    81000, 0xdee9a98b
-0,         16,         16,        1,    81000, 0xdf3502d5
-0,         17,         17,        1,    81000, 0x4653536b
-0,         18,         18,        1,    81000, 0x7f658c75
-0,         19,         19,        1,    81000, 0xab18ff13
-0,         20,         20,        1,    81000, 0xac2b8f3b
-0,         21,         21,        1,    81000, 0xd61ff094
-0,         22,         22,        1,    81000, 0x425bfc2b
-0,         23,         23,        1,    81000, 0x6be7ecd3
-0,         24,         24,        1,    81000, 0x0b0ee65b
-0,         25,         25,        1,    81000, 0x3c6f146b
-0,         26,         26,        1,    81000, 0x27c4e9c8
-0,         27,         27,        1,    81000, 0x174022c4
-0,         28,         28,        1,    81000, 0x3320fe81
-0,         29,         29,        1,    81000, 0x7a3c342e
-0,         30,         30,        1,    81000, 0x448b4346
-0,         31,         31,        1,    81000, 0xd285b23d
-0,         32,         32,        1,    81000, 0x852ed590
-0,         33,         33,        1,    81000, 0xc9d3df17
-0,         34,         34,        1,    81000, 0x4d23727b
-0,         35,         35,        1,    81000, 0x1fae66cd
-0,         36,         36,        1,    81000, 0x384d54ab
-0,         37,         37,        1,    81000, 0x2fee6ba3
-0,         38,         38,        1,    81000, 0xd7ad6f59
-0,         39,         39,        1,    81000, 0xaf5e3e76
-0,         40,         40,        1,    81000, 0x10fceda4
-0,         41,         41,        1,    81000, 0xb26df92b
-0,         42,         42,        1,    81000, 0xd6676e08
-0,         43,         43,        1,    81000, 0xff6b1b95
-0,         44,         44,        1,    81000, 0x6196d598
-0,         45,         45,        1,    81000, 0x833ebf1b
-0,         46,         46,        1,    81000, 0x7b085af1
-0,         47,         47,        1,    81000, 0xe8f583b4
+0,          1,          1,        1,    81000, 0x8fef1925
+0,          2,          2,        1,    81000, 0xf0350cb6
+0,          3,          3,        1,    81000, 0xa70a0c52
+0,          4,          4,        1,    81000, 0x21ef1490
+0,          5,          5,        1,    81000, 0x98bc0c96
+0,          6,          6,        1,    81000, 0x92380b27
+0,          7,          7,        1,    81000, 0xbba216cd
+0,          8,          8,        1,    81000, 0x92a8172b
+0,          9,          9,        1,    81000, 0xfbc21592
+0,         10,         10,        1,    81000, 0xdad416a1
+0,         11,         11,        1,    81000, 0xec4d13aa
+0,         12,         12,        1,    81000, 0xaf36fcff
+0,         13,         13,        1,    81000, 0xb4fcf056
+0,         14,         14,        1,    81000, 0xe3782a3f
+0,         15,         15,        1,    81000, 0x714daa0b
+0,         16,         16,        1,    81000, 0xe2770382
+0,         17,         17,        1,    81000, 0x553253ff
+0,         18,         18,        1,    81000, 0x928d8c46
+0,         19,         19,        1,    81000, 0x06c8fe82
+0,         20,         20,        1,    81000, 0xb8198f5a
+0,         21,         21,        1,    81000, 0x0029f118
+0,         22,         22,        1,    81000, 0x6fe7fc6f
+0,         23,         23,        1,    81000, 0x9165edde
+0,         24,         24,        1,    81000, 0xe76ae791
+0,         25,         25,        1,    81000, 0xa4dd145a
+0,         26,         26,        1,    81000, 0x2d7de9d8
+0,         27,         27,        1,    81000, 0xe102228b
+0,         28,         28,        1,    81000, 0xc57ffe0e
+0,         29,         29,        1,    81000, 0x324434cb
+0,         30,         30,        1,    81000, 0xedc0433e
+0,         31,         31,        1,    81000, 0xd42bb18a
+0,         32,         32,        1,    81000, 0xedb3d561
+0,         33,         33,        1,    81000, 0x5244de92
+0,         34,         34,        1,    81000, 0x0bb27280
+0,         35,         35,        1,    81000, 0xc6116736
+0,         36,         36,        1,    81000, 0x42f154e2
+0,         37,         37,        1,    81000, 0xffbd6bf9
+0,         38,         38,        1,    81000, 0x813170d0
+0,         39,         39,        1,    81000, 0x430c4040
+0,         40,         40,        1,    81000, 0x56d1eecb
+0,         41,         41,        1,    81000, 0xaa4afa12
+0,         42,         42,        1,    81000, 0x2c3d6fb8
+0,         43,         43,        1,    81000, 0xfedf1e3e
+0,         44,         44,        1,    81000, 0xf538d893
+0,         45,         45,        1,    81000, 0xcc81c3b5
+0,         46,         46,        1,    81000, 0x59b95fbc
+0,         47,         47,        1,    81000, 0xb4da87a0
 0,         48,         48,        1,    81000, 0x3426d5e4
-0,         49,         49,        1,    81000, 0x214069ed
-0,         50,         50,        1,    81000, 0x7dbdfd3f
-0,         51,         51,        1,    81000, 0xf19b3f45
-0,         52,         52,        1,    81000, 0x0f05c7e2
-0,         53,         53,        1,    81000, 0xba94e323
-0,         54,         54,        1,    81000, 0x0de7b0c2
-0,         55,         55,        1,    81000, 0xfcf93c55
-0,         56,         56,        1,    81000, 0x8a8dbd55
+0,         49,         49,        1,    81000, 0x8d066aae
+0,         50,         50,        1,    81000, 0x09effe79
+0,         51,         51,        1,    81000, 0xecc540ae
+0,         52,         52,        1,    81000, 0x845dc90c
+0,         53,         53,        1,    81000, 0x9c2fe4d2
+0,         54,         54,        1,    81000, 0x8887b277
+0,         55,         55,        1,    81000, 0x3bdc3ca9
+0,         56,         56,        1,    81000, 0x094fbe27
 0,         57,         57,        1,    81000, 0xddf22b97
-0,         58,         58,        1,    81000, 0x49a830ff
-0,         59,         59,        1,    81000, 0x82ab2a4b
-0,         60,         60,        1,    81000, 0xd23420e5
-0,         61,         61,        1,    81000, 0x7c1017d1
-0,         62,         62,        1,    81000, 0x9aa61b38
-0,         63,         63,        1,    81000, 0x2a724a18
-0,         64,         64,        1,    81000, 0xc18055f2
-0,         65,         65,        1,    81000, 0xecba3855
-0,         66,         66,        1,    81000, 0x0eed6b0f
-0,         67,         67,        1,    81000, 0x4be73816
-0,         68,         68,        1,    81000, 0xa681214e
-0,         69,         69,        1,    81000, 0x4958f83d
-0,         70,         70,        1,    81000, 0xca0f0d61
-0,         71,         71,        1,    81000, 0x3c453de1
-0,         72,         72,        1,    81000, 0xff60360a
-0,         73,         73,        1,    81000, 0xdcef0949
+0,         58,         58,        1,    81000, 0x31b23156
+0,         59,         59,        1,    81000, 0xf5bf2ad8
+0,         60,         60,        1,    81000, 0x4a9321c4
+0,         61,         61,        1,    81000, 0xdd1b18ca
+0,         62,         62,        1,    81000, 0x4ece1cdd
+0,         63,         63,        1,    81000, 0x6a9a4b53
+0,         64,         64,        1,    81000, 0x6624578b
+0,         65,         65,        1,    81000, 0x89273a0f
+0,         66,         66,        1,    81000, 0x9eb56c4c
+0,         67,         67,        1,    81000, 0xe60238f5
+0,         68,         68,        1,    81000, 0xbc4c228a
+0,         69,         69,        1,    81000, 0x3feefa08
+0,         70,         70,        1,    81000, 0x0d620f37
+0,         71,         71,        1,    81000, 0x93693fc8
+0,         72,         72,        1,    81000, 0xfc4b3848
+0,         73,         73,        1,    81000, 0xd9950bfb
 0,         74,         74,        1,    81000, 0xe5e3732d
-0,         75,         75,        1,    81000, 0x39747fd4
-0,         76,         76,        1,    81000, 0x6bec70e6
-0,         77,         77,        1,    81000, 0x7026a8c0
-0,         78,         78,        1,    81000, 0x92de5b61
-0,         79,         79,        1,    81000, 0x3f00507f
-0,         80,         80,        1,    81000, 0x5620c377
+0,         75,         75,        1,    81000, 0x53517fd2
+0,         76,         76,        1,    81000, 0xb57c70b0
+0,         77,         77,        1,    81000, 0x378ea87c
+0,         78,         78,        1,    81000, 0xfd2b5b58
+0,         79,         79,        1,    81000, 0x66d45077
+0,         80,         80,        1,    81000, 0x6e07c3f8
 0,         81,         81,        1,    81000, 0x39f5ed38
-0,         82,         82,        1,    81000, 0x6ee35d67
-0,         83,         83,        1,    81000, 0x4f99a409
-0,         84,         84,        1,    81000, 0x0a05b6ea
-0,         85,         85,        1,    81000, 0xd6c442d9
-0,         86,         86,        1,    81000, 0x0bb3d2f0
-0,         87,         87,        1,    81000, 0x6891c5b1
-0,         88,         88,        1,    81000, 0xf16ba9be
-0,         89,         89,        1,    81000, 0xba53528e
-0,         90,         90,        1,    81000, 0xc847de49
+0,         82,         82,        1,    81000, 0x55b05da7
+0,         83,         83,        1,    81000, 0x7f78a42c
+0,         84,         84,        1,    81000, 0x5139b79c
+0,         85,         85,        1,    81000, 0x4054437d
+0,         86,         86,        1,    81000, 0x0f9dd327
+0,         87,         87,        1,    81000, 0xa885c60e
+0,         88,         88,        1,    81000, 0x37abaa72
+0,         89,         89,        1,    81000, 0xdab25345
+0,         90,         90,        1,    81000, 0xbdf4df9d
 0,         91,         91,        1,    81000, 0xc5b2e2b0
 0,         92,         92,        1,    81000, 0xb0b497ff
diff --git a/tests/ref/fate/vp6f b/tests/ref/fate/vp6f
index 65e1131..c76e077 100644
--- a/tests/ref/fate/vp6f
+++ b/tests/ref/fate/vp6f
@@ -4,176 +4,176 @@
 #dimensions 0: 112x80
 #sar 0: 0/1
 0,          0,          0,        1,    13440, 0x7cb0a22f
-0,          1,          1,        1,    13440, 0xdfcea6ba
-0,          2,          2,        1,    13440, 0x59b2a5da
-0,          3,          3,        1,    13440, 0x12f1b2d8
-0,          4,          4,        1,    13440, 0x280fb9f6
-0,          5,          5,        1,    13440, 0x7bace8b3
-0,          6,          6,        1,    13440, 0x4ec91480
-0,          7,          7,        1,    13440, 0xa8010450
-0,          8,          8,        1,    13440, 0x61d8fc46
-0,          9,          9,        1,    13440, 0x242bb24e
-0,         10,         10,        1,    13440, 0x88397a36
-0,         11,         11,        1,    13440, 0x10e15726
-0,         12,         12,        1,    13440, 0x3018438c
-0,         13,         13,        1,    13440, 0xbbb94c21
-0,         14,         14,        1,    13440, 0xfc3e5e2b
-0,         15,         15,        1,    13440, 0xeaa69354
-0,         16,         16,        1,    13440, 0x96f1cc01
-0,         17,         17,        1,    13440, 0x333fdaff
-0,         18,         18,        1,    13440, 0xb5230ed2
-0,         19,         19,        1,    13440, 0x59383446
-0,         20,         20,        1,    13440, 0x954939e6
-0,         21,         21,        1,    13440, 0x53813d2f
-0,         22,         22,        1,    13440, 0x3ca53600
-0,         23,         23,        1,    13440, 0x7b30227a
-0,         24,         24,        1,    13440, 0x5145bbfe
-0,         25,         25,        1,    13440, 0xa0979632
-0,         26,         26,        1,    13440, 0x08026e21
-0,         27,         27,        1,    13440, 0x3f456d1e
-0,         28,         28,        1,    13440, 0x7d036b62
-0,         29,         29,        1,    13440, 0x508085fb
-0,         30,         30,        1,    13440, 0x251dc193
-0,         31,         31,        1,    13440, 0xf3121c9b
-0,         32,         32,        1,    13440, 0xf5da772e
-0,         33,         33,        1,    13440, 0x8179ccf7
-0,         34,         34,        1,    13440, 0xd57ceeb3
-0,         35,         35,        1,    13440, 0xc8f2169c
-0,         36,         36,        1,    13440, 0xbf8296c3
-0,         37,         37,        1,    13440, 0xee1927d0
-0,         38,         38,        1,    13440, 0xdd84e8d1
-0,         39,         39,        1,    13440, 0x7be57be2
-0,         40,         40,        1,    13440, 0xae353f91
-0,         41,         41,        1,    13440, 0x3ae927f2
-0,         42,         42,        1,    13440, 0x417227c6
-0,         43,         43,        1,    13440, 0x32572bea
-0,         44,         44,        1,    13440, 0x8b9e4839
-0,         45,         45,        1,    13440, 0xad669441
-0,         46,         46,        1,    13440, 0xc9de99a6
-0,         47,         47,        1,    13440, 0xb3ffb88b
-0,         48,         48,        1,    13440, 0xb321b8a0
-0,         49,         49,        1,    13440, 0x2efdbf53
-0,         50,         50,        1,    13440, 0x9b7aa566
-0,         51,         51,        1,    13440, 0x563c8d60
-0,         52,         52,        1,    13440, 0xe3848ee8
-0,         53,         53,        1,    13440, 0xa84b8f1d
-0,         54,         54,        1,    13440, 0x52da9f9f
-0,         55,         55,        1,    13440, 0x2ed56d97
-0,         56,         56,        1,    13440, 0x4e8534c2
-0,         57,         57,        1,    13440, 0x318900a6
-0,         58,         58,        1,    13440, 0xda96de39
-0,         59,         59,        1,    13440, 0xaae7ac0b
+0,          1,          1,        1,    13440, 0xe38fa6b7
+0,          2,          2,        1,    13440, 0xe003a5c6
+0,          3,          3,        1,    13440, 0xe502b2f6
+0,          4,          4,        1,    13440, 0xb731ba56
+0,          5,          5,        1,    13440, 0x8168e8f5
+0,          6,          6,        1,    13440, 0x776d14fb
+0,          7,          7,        1,    13440, 0xb5d0049c
+0,          8,          8,        1,    13440, 0x3434fc98
+0,          9,          9,        1,    13440, 0xd219b282
+0,         10,         10,        1,    13440, 0xd2027a7c
+0,         11,         11,        1,    13440, 0xd50b5799
+0,         12,         12,        1,    13440, 0x091543c4
+0,         13,         13,        1,    13440, 0x26374c6b
+0,         14,         14,        1,    13440, 0x5b4f5e1e
+0,         15,         15,        1,    13440, 0x55ba92da
+0,         16,         16,        1,    13440, 0x1ff5cb4d
+0,         17,         17,        1,    13440, 0x0ccbda45
+0,         18,         18,        1,    13440, 0x5ff80e6a
+0,         19,         19,        1,    13440, 0x09df3417
+0,         20,         20,        1,    13440, 0xfbed3a0f
+0,         21,         21,        1,    13440, 0xd65c3c7f
+0,         22,         22,        1,    13440, 0xc8173576
+0,         23,         23,        1,    13440, 0xd5e521f8
+0,         24,         24,        1,    13440, 0xe440bb55
+0,         25,         25,        1,    13440, 0xcbeb95c8
+0,         26,         26,        1,    13440, 0x8cd66dba
+0,         27,         27,        1,    13440, 0x5f356cbc
+0,         28,         28,        1,    13440, 0x54e16ad7
+0,         29,         29,        1,    13440, 0x17ed8566
+0,         30,         30,        1,    13440, 0x1aa1c121
+0,         31,         31,        1,    13440, 0x64e31cac
+0,         32,         32,        1,    13440, 0x869677a4
+0,         33,         33,        1,    13440, 0x7df6cdba
+0,         34,         34,        1,    13440, 0x23f3ef45
+0,         35,         35,        1,    13440, 0x176217b4
+0,         36,         36,        1,    13440, 0x493897cb
+0,         37,         37,        1,    13440, 0x0591296d
+0,         38,         38,        1,    13440, 0xb58aeae8
+0,         39,         39,        1,    13440, 0x38fd7e58
+0,         40,         40,        1,    13440, 0x200c424c
+0,         41,         41,        1,    13440, 0x2ee42b14
+0,         42,         42,        1,    13440, 0xdcba2ae5
+0,         43,         43,        1,    13440, 0xbb102f41
+0,         44,         44,        1,    13440, 0x034d4b06
+0,         45,         45,        1,    13440, 0x62d99722
+0,         46,         46,        1,    13440, 0x174d9ce4
+0,         47,         47,        1,    13440, 0xf676bbc8
+0,         48,         48,        1,    13440, 0xe2e5bbef
+0,         49,         49,        1,    13440, 0x6ef0c2af
+0,         50,         50,        1,    13440, 0x8d08a917
+0,         51,         51,        1,    13440, 0x030d90e8
+0,         52,         52,        1,    13440, 0x4d6f9232
+0,         53,         53,        1,    13440, 0xb7a792f6
+0,         54,         54,        1,    13440, 0xa0daa330
+0,         55,         55,        1,    13440, 0xe9f870a3
+0,         56,         56,        1,    13440, 0xed4f36cb
+0,         57,         57,        1,    13440, 0x8a6f02c3
+0,         58,         58,        1,    13440, 0x663ee03d
+0,         59,         59,        1,    13440, 0x2571adef
 0,         60,         60,        1,    13440, 0x7533ad99
-0,         61,         61,        1,    13440, 0x4e70c2c9
-0,         62,         62,        1,    13440, 0x9ce5e3fa
-0,         63,         63,        1,    13440, 0xc788fbbc
-0,         64,         64,        1,    13440, 0xd36604a9
-0,         65,         65,        1,    13440, 0x246221a4
-0,         66,         66,        1,    13440, 0x290c5c2b
-0,         67,         67,        1,    13440, 0xde6c68ec
-0,         68,         68,        1,    13440, 0x56248dbf
-0,         69,         69,        1,    13440, 0x5b898cbd
-0,         70,         70,        1,    13440, 0x090574b9
-0,         71,         71,        1,    13440, 0x8df2814a
-0,         72,         72,        1,    13440, 0xd4a6b285
-0,         73,         73,        1,    13440, 0xa016e921
-0,         74,         74,        1,    13440, 0x7f93fdc1
-0,         75,         75,        1,    13440, 0xfd0dee6f
-0,         76,         76,        1,    13440, 0xef04ce0e
-0,         77,         77,        1,    13440, 0x7560bee3
-0,         78,         78,        1,    13440, 0x5a8cdc85
-0,         79,         79,        1,    13440, 0x4788f7bc
-0,         80,         80,        1,    13440, 0xc001e34d
-0,         81,         81,        1,    13440, 0xc687eb74
-0,         82,         82,        1,    13440, 0xbf20feba
-0,         83,         83,        1,    13440, 0xd32647a8
-0,         84,         84,        1,    13440, 0xe69a955a
-0,         85,         85,        1,    13440, 0x1b56951f
-0,         86,         86,        1,    13440, 0xd1977378
-0,         87,         87,        1,    13440, 0x1620357d
-0,         88,         88,        1,    13440, 0x2596116f
-0,         89,         89,        1,    13440, 0x7473feca
-0,         90,         90,        1,    13440, 0x7f92bb47
-0,         91,         91,        1,    13440, 0x6866a683
-0,         92,         92,        1,    13440, 0xe9b08d7e
-0,         93,         93,        1,    13440, 0xa3fd7546
-0,         94,         94,        1,    13440, 0xa4416522
-0,         95,         95,        1,    13440, 0xd8f5572e
-0,         96,         96,        1,    13440, 0xf5746dbd
-0,         97,         97,        1,    13440, 0x256a87c6
-0,         98,         98,        1,    13440, 0x722aa2c8
-0,         99,         99,        1,    13440, 0xb26de5f5
-0,        100,        100,        1,    13440, 0x117f0841
-0,        101,        101,        1,    13440, 0xda2d192c
-0,        102,        102,        1,    13440, 0xb022442d
-0,        103,        103,        1,    13440, 0xbc4044f2
-0,        104,        104,        1,    13440, 0x68b330da
-0,        105,        105,        1,    13440, 0xc07228cf
-0,        106,        106,        1,    13440, 0xaa3f3d44
-0,        107,        107,        1,    13440, 0x25867aad
-0,        108,        108,        1,    13440, 0xa3ecb432
-0,        109,        109,        1,    13440, 0x93ccdcbb
-0,        110,        110,        1,    13440, 0x8302fa4f
-0,        111,        111,        1,    13440, 0x2f960f33
-0,        112,        112,        1,    13440, 0x15d41d14
-0,        113,        113,        1,    13440, 0x636529d0
-0,        114,        114,        1,    13440, 0x11035be5
-0,        115,        115,        1,    13440, 0x9b6e9167
-0,        116,        116,        1,    13440, 0x7b01adc7
+0,         61,         61,        1,    13440, 0xe3aec2d4
+0,         62,         62,        1,    13440, 0x3368e416
+0,         63,         63,        1,    13440, 0xe2ecfbf5
+0,         64,         64,        1,    13440, 0x45010538
+0,         65,         65,        1,    13440, 0xc075222c
+0,         66,         66,        1,    13440, 0x5bf45cc4
+0,         67,         67,        1,    13440, 0xa06869b5
+0,         68,         68,        1,    13440, 0x1ff98e6f
+0,         69,         69,        1,    13440, 0x11c88d84
+0,         70,         70,        1,    13440, 0x95c275e8
+0,         71,         71,        1,    13440, 0x81a68285
+0,         72,         72,        1,    13440, 0xb903b402
+0,         73,         73,        1,    13440, 0xa9d2eb1c
+0,         74,         74,        1,    13440, 0x2c48ff65
+0,         75,         75,        1,    13440, 0xc024eff6
+0,         76,         76,        1,    13440, 0x41bacff0
+0,         77,         77,        1,    13440, 0x2cf9c144
+0,         78,         78,        1,    13440, 0x9e67de72
+0,         79,         79,        1,    13440, 0x3e74fa36
+0,         80,         80,        1,    13440, 0x9b9be609
+0,         81,         81,        1,    13440, 0x594eee16
+0,         82,         82,        1,    13440, 0x8a7c00d7
+0,         83,         83,        1,    13440, 0x56104a2a
+0,         84,         84,        1,    13440, 0xd94d97cc
+0,         85,         85,        1,    13440, 0x95d09887
+0,         86,         86,        1,    13440, 0xe02a769b
+0,         87,         87,        1,    13440, 0x847839d0
+0,         88,         88,        1,    13440, 0x47441606
+0,         89,         89,        1,    13440, 0x19b10373
+0,         90,         90,        1,    13440, 0x3ddfbf15
+0,         91,         91,        1,    13440, 0xf4fdab37
+0,         92,         92,        1,    13440, 0xfe9a92ad
+0,         93,         93,        1,    13440, 0xaa387bfb
+0,         94,         94,        1,    13440, 0xe57a6c85
+0,         95,         95,        1,    13440, 0x68ef5f30
+0,         96,         96,        1,    13440, 0x481d76f7
+0,         97,         97,        1,    13440, 0x5b0e9192
+0,         98,         98,        1,    13440, 0xebc1ac80
+0,         99,         99,        1,    13440, 0x13bfef3e
+0,        100,        100,        1,    13440, 0xb7b01291
+0,        101,        101,        1,    13440, 0xc8c72419
+0,        102,        102,        1,    13440, 0x9dca4f32
+0,        103,        103,        1,    13440, 0x67635158
+0,        104,        104,        1,    13440, 0x6c773e0d
+0,        105,        105,        1,    13440, 0x6c2f3777
+0,        106,        106,        1,    13440, 0x19574d97
+0,        107,        107,        1,    13440, 0xd9f48cc1
+0,        108,        108,        1,    13440, 0xd19dc87c
+0,        109,        109,        1,    13440, 0xa23cf2ab
+0,        110,        110,        1,    13440, 0x3f7611b6
+0,        111,        111,        1,    13440, 0x183d2723
+0,        112,        112,        1,    13440, 0xf79b3534
+0,        113,        113,        1,    13440, 0xcbba4280
+0,        114,        114,        1,    13440, 0x03777586
+0,        115,        115,        1,    13440, 0xea1aac72
+0,        116,        116,        1,    13440, 0xad27cae0
 0,        117,        117,        1,    13440, 0xa237e05d
-0,        118,        118,        1,    13440, 0xd2f4f134
-0,        119,        119,        1,    13440, 0x2052d368
-0,        120,        120,        1,    13440, 0x08f7ae0d
-0,        121,        121,        1,    13440, 0xa89185bc
-0,        122,        122,        1,    13440, 0xfa628236
-0,        123,        123,        1,    13440, 0xdf79848b
-0,        124,        124,        1,    13440, 0xd19a906f
-0,        125,        125,        1,    13440, 0x219f9324
-0,        126,        126,        1,    13440, 0x46509b6d
-0,        127,        127,        1,    13440, 0xc5d9a568
-0,        128,        128,        1,    13440, 0xb21aaaa8
-0,        129,        129,        1,    13440, 0x925a97ed
-0,        130,        130,        1,    13440, 0xc5e3557f
-0,        131,        131,        1,    13440, 0x7c57155a
-0,        132,        132,        1,    13440, 0x6b26d005
-0,        133,        133,        1,    13440, 0xfdc7b369
-0,        134,        134,        1,    13440, 0x99919fc2
-0,        135,        135,        1,    13440, 0xcfe889e4
-0,        136,        136,        1,    13440, 0xd1196856
-0,        137,        137,        1,    13440, 0xec8348c6
-0,        138,        138,        1,    13440, 0x5ede0d9a
-0,        139,        139,        1,    13440, 0x198ef66e
-0,        140,        140,        1,    13440, 0x62fcefdf
-0,        141,        141,        1,    13440, 0x7791f415
-0,        142,        142,        1,    13440, 0xfbdb0029
-0,        143,        143,        1,    13440, 0xdab12b01
-0,        144,        144,        1,    13440, 0x646b2d5f
-0,        145,        145,        1,    13440, 0x5410f52e
-0,        146,        146,        1,    13440, 0x7186eef8
-0,        147,        147,        1,    13440, 0xca251ef6
-0,        148,        148,        1,    13440, 0x757c3b43
-0,        149,        149,        1,    13440, 0x59ff4982
-0,        150,        150,        1,    13440, 0xbe8ff084
-0,        151,        151,        1,    13440, 0xc85a9e38
-0,        152,        152,        1,    13440, 0x541b9a19
-0,        153,        153,        1,    13440, 0x274893c9
-0,        154,        154,        1,    13440, 0x7634b5d2
-0,        155,        155,        1,    13440, 0x1bd8e10c
-0,        156,        156,        1,    13440, 0xa661dfb1
-0,        157,        157,        1,    13440, 0x9d01bf92
-0,        158,        158,        1,    13440, 0xcb1eb220
-0,        159,        159,        1,    13440, 0x0ce27d25
-0,        160,        160,        1,    13440, 0x523b594f
-0,        161,        161,        1,    13440, 0xf0a04c4f
-0,        162,        162,        1,    13440, 0x0f0ffc3d
-0,        163,        163,        1,    13440, 0xb0d8b778
-0,        164,        164,        1,    13440, 0x5137a642
-0,        165,        165,        1,    13440, 0xd213a552
-0,        166,        166,        1,    13440, 0xc2fbc9b1
-0,        167,        167,        1,    13440, 0xfc2ee379
-0,        168,        168,        1,    13440, 0xfb80f737
-0,        169,        169,        1,    13440, 0xd6cb2447
-0,        170,        170,        1,    13440, 0x124b606d
-0,        171,        171,        1,    13440, 0xf788a066
-0,        172,        172,        1,    13440, 0xa16eed6e
-0,        173,        173,        1,    13440, 0x73ff0f82
+0,        118,        118,        1,    13440, 0xb683f189
+0,        119,        119,        1,    13440, 0x2058d3cd
+0,        120,        120,        1,    13440, 0x715dae96
+0,        121,        121,        1,    13440, 0xd8f88677
+0,        122,        122,        1,    13440, 0x45818329
+0,        123,        123,        1,    13440, 0x69ad852f
+0,        124,        124,        1,    13440, 0x56369125
+0,        125,        125,        1,    13440, 0xdfde941b
+0,        126,        126,        1,    13440, 0xf1209c90
+0,        127,        127,        1,    13440, 0x82e6a6aa
+0,        128,        128,        1,    13440, 0xb0ceabd1
+0,        129,        129,        1,    13440, 0x05f899a6
+0,        130,        130,        1,    13440, 0x9ef95758
+0,        131,        131,        1,    13440, 0x63e716d9
+0,        132,        132,        1,    13440, 0x7cb0d149
+0,        133,        133,        1,    13440, 0x3585b4f1
+0,        134,        134,        1,    13440, 0x623ea1fc
+0,        135,        135,        1,    13440, 0x762b8c32
+0,        136,        136,        1,    13440, 0xc1b96add
+0,        137,        137,        1,    13440, 0x95e24baf
+0,        138,        138,        1,    13440, 0x74631106
+0,        139,        139,        1,    13440, 0x78b5fa14
+0,        140,        140,        1,    13440, 0x5f33f34a
+0,        141,        141,        1,    13440, 0x7e6ff799
+0,        142,        142,        1,    13440, 0x9f8303b0
+0,        143,        143,        1,    13440, 0x7c3d2eb9
+0,        144,        144,        1,    13440, 0x3c0530d2
+0,        145,        145,        1,    13440, 0xe7ecf960
+0,        146,        146,        1,    13440, 0x82c3f316
+0,        147,        147,        1,    13440, 0x008922b4
+0,        148,        148,        1,    13440, 0x0d263f5f
+0,        149,        149,        1,    13440, 0x57dc4dd0
+0,        150,        150,        1,    13440, 0xbcbbf4f1
+0,        151,        151,        1,    13440, 0x62e9a335
+0,        152,        152,        1,    13440, 0x65699f37
+0,        153,        153,        1,    13440, 0xe4b69939
+0,        154,        154,        1,    13440, 0xbd4ebb6c
+0,        155,        155,        1,    13440, 0xb7d6e71e
+0,        156,        156,        1,    13440, 0xfc0ae5b6
+0,        157,        157,        1,    13440, 0xe55ec65c
+0,        158,        158,        1,    13440, 0x2095b8fc
+0,        159,        159,        1,    13440, 0x479c8408
+0,        160,        160,        1,    13440, 0x2981604c
+0,        161,        161,        1,    13440, 0xa4e55397
+0,        162,        162,        1,    13440, 0x0bc703f8
+0,        163,        163,        1,    13440, 0xd43bbf89
+0,        164,        164,        1,    13440, 0xdcd6aeca
+0,        165,        165,        1,    13440, 0x07b1ad84
+0,        166,        166,        1,    13440, 0xfb17d20b
+0,        167,        167,        1,    13440, 0x0c4aebd9
+0,        168,        168,        1,    13440, 0x826effc4
+0,        169,        169,        1,    13440, 0x4ccf2ca4
+0,        170,        170,        1,    13440, 0xe4f968f3
+0,        171,        171,        1,    13440, 0xe1b4a93a
+0,        172,        172,        1,    13440, 0x8597f65e
+0,        173,        173,        1,    13440, 0xb4f7184f
diff --git a/tests/ref/fate/webm-dash-chapters b/tests/ref/fate/webm-dash-chapters
new file mode 100644
index 0000000..62d70cf
--- /dev/null
+++ b/tests/ref/fate/webm-dash-chapters
@@ -0,0 +1,74 @@
+eada3550583906e53114d30cb39126f5 *tests/data/fate/webm-dash-chapters.webm
+111199 tests/data/fate/webm-dash-chapters.webm
+#extradata 0:     3469, 0xc6769ddc
+#tb 0: 1/1000
+#media_type 0: audio
+#codec_id 0: vorbis
+#sample_rate 0: 44100
+#channel_layout 0: 4
+#channel_layout_name 0: mono
+0,          0,          0,        5,       28, 0xefcf103e
+0,          6,          6,       26,      198, 0xfbbe5eb5
+0,         32,         32,       46,      198, 0xabd95c6c
+0,         99,         99,       26,       41, 0x954b12a5
+0,        105,        105,        5,       41, 0xbccd1463
+0,        110,        110,        5,       44, 0x4fa218a1
+0,        116,        116,        5,       43, 0xf87716d4
+0,        122,        122,        5,       32, 0x0fdc1057
+0,        128,        128,        5,       67, 0xd5352244
+0,        134,        134,        5,       68, 0x36e91faf
+0,        140,        140,        5,       57, 0xe6f51928
+0,        145,        145,        5,       49, 0x3bb416e1
+0,        151,        151,        5,       54, 0x678f1777
+0,        157,        157,        5,       57, 0x56601ef3
+0,        163,        163,        5,       52, 0xc0fe1a12
+0,        169,        169,       26,      236, 0xfe396f02
+0,        195,        195,       46,      208, 0x018e62d3
+0,        241,        241,       46,      223, 0x9fa76917
+0,        308,        308,       26,       46, 0xd8c314f9
+0,        314,        314,        5,       46, 0x199018bc
+0,        319,        319,        5,       46, 0xbe8314cd
+0,        325,        325,        5,       45, 0xe0ad1622
+0,        331,        331,        5,       43, 0xe52a1659
+0,        337,        337,        5,       58, 0xd5e01f9c
+0,        343,        343,        5,       67, 0x5bbc2201
+0,        348,        348,       26,      226, 0x04887569
+0,        375,        375,       46,      217, 0x4b6564ab
+0,        421,        421,       46,      211, 0xb7e868da
+0,        467,        467,       46,      198, 0x7bf65d8a
+[CHAPTER]
+id=1
+time_base=1/1000000000
+start=0
+start_time=0.000000
+end=5000000000
+end_time=5.000000
+TAG:title=start
+[/CHAPTER]
+[CHAPTER]
+id=2
+time_base=1/1000000000
+start=5000000000
+start_time=5.000000
+end=10500000000
+end_time=10.500000
+TAG:title=Five Seconds
+[/CHAPTER]
+[CHAPTER]
+id=3
+time_base=1/1000000000
+start=10500000000
+start_time=10.500000
+end=15000000000
+end_time=15.000000
+TAG:title=Ten point 5 seconds
+[/CHAPTER]
+[CHAPTER]
+id=4
+time_base=1/1000000000
+start=15000000000
+start_time=15.000000
+end=19849000000
+end_time=19.849000
+TAG:title=15 sec - over soon
+[/CHAPTER]
diff --git a/tests/ref/lavf-fate/av1.mkv b/tests/ref/lavf-fate/av1.mkv
new file mode 100644
index 0000000..3288a44
--- /dev/null
+++ b/tests/ref/lavf-fate/av1.mkv
@@ -0,0 +1,3 @@
+696074a7600fb5a02a434839d09201f0 *tests/data/lavf-fate/lavf.av1.mkv
+55636 tests/data/lavf-fate/lavf.av1.mkv
+tests/data/lavf-fate/lavf.av1.mkv CRC=0x7c27cc15
diff --git a/tests/ref/lavf-fate/av1.mp4 b/tests/ref/lavf-fate/av1.mp4
new file mode 100644
index 0000000..38d2a80
--- /dev/null
+++ b/tests/ref/lavf-fate/av1.mp4
@@ -0,0 +1,3 @@
+0388467214421a19ba65d10a74dc35c0 *tests/data/lavf-fate/lavf.av1.mp4
+55936 tests/data/lavf-fate/lavf.av1.mp4
+tests/data/lavf-fate/lavf.av1.mp4 CRC=0x7c27cc15
diff --git a/tests/ref/lavf-fate/avi_cram b/tests/ref/lavf-fate/avi_cram
deleted file mode 100644
index 82882fb..0000000
--- a/tests/ref/lavf-fate/avi_cram
+++ /dev/null
@@ -1,3 +0,0 @@
-6fc88702c23b895c305c5e1f51a0904e *./tests/data/lavf-fate/lavf.avi
-928260 ./tests/data/lavf-fate/lavf.avi
-./tests/data/lavf-fate/lavf.avi CRC=0xa4770de2
diff --git a/tests/ref/lavf-fate/cram.avi b/tests/ref/lavf-fate/cram.avi
new file mode 100644
index 0000000..a591889
--- /dev/null
+++ b/tests/ref/lavf-fate/cram.avi
@@ -0,0 +1,3 @@
+6fc88702c23b895c305c5e1f51a0904e *tests/data/lavf-fate/lavf.cram.avi
+928260 tests/data/lavf-fate/lavf.cram.avi
+tests/data/lavf-fate/lavf.cram.avi CRC=0xa4770de2
diff --git a/tests/ref/lavf-fate/h264.mp4 b/tests/ref/lavf-fate/h264.mp4
new file mode 100644
index 0000000..bb52f45
--- /dev/null
+++ b/tests/ref/lavf-fate/h264.mp4
@@ -0,0 +1,3 @@
+6d158b25efe7391c803f6f61c7a80aa0 *tests/data/lavf-fate/lavf.h264.mp4
+547908 tests/data/lavf-fate/lavf.h264.mp4
+tests/data/lavf-fate/lavf.h264.mp4 CRC=0x9da2c999
diff --git a/tests/ref/lavf-fate/latm b/tests/ref/lavf-fate/latm
index 8c4f541..c41384d 100644
--- a/tests/ref/lavf-fate/latm
+++ b/tests/ref/lavf-fate/latm
@@ -1,3 +1,3 @@
-eb13788e71c9b5bc7d62ceb748312bbb *./tests/data/lavf-fate/lavf.latm
-67876 ./tests/data/lavf-fate/lavf.latm
-./tests/data/lavf-fate/lavf.latm CRC=0xcf94c59d
+eb13788e71c9b5bc7d62ceb748312bbb *tests/data/lavf-fate/lavf.latm
+67876 tests/data/lavf-fate/lavf.latm
+tests/data/lavf-fate/lavf.latm CRC=0xcf94c59d
diff --git a/tests/ref/lavf-fate/mov_qtrle_mace6 b/tests/ref/lavf-fate/mov_qtrle_mace6
deleted file mode 100644
index e8fc882..0000000
--- a/tests/ref/lavf-fate/mov_qtrle_mace6
+++ /dev/null
@@ -1,3 +0,0 @@
-f0ae34fb90e11342624e092094273aef *./tests/data/lavf-fate/lavf.mov
-1270415 ./tests/data/lavf-fate/lavf.mov
-./tests/data/lavf-fate/lavf.mov CRC=0x9320cd26
diff --git a/tests/ref/lavf-fate/mp3 b/tests/ref/lavf-fate/mp3
index b559538..bd65cbb 100644
--- a/tests/ref/lavf-fate/mp3
+++ b/tests/ref/lavf-fate/mp3
@@ -1,3 +1,3 @@
-f231c5316357fd747573cbcb02f889c5 *./tests/data/lavf-fate/lavf.mp3
-96016 ./tests/data/lavf-fate/lavf.mp3
-./tests/data/lavf-fate/lavf.mp3 CRC=0x6c9850fe
+f231c5316357fd747573cbcb02f889c5 *tests/data/lavf-fate/lavf.mp3
+96016 tests/data/lavf-fate/lavf.mp3
+tests/data/lavf-fate/lavf.mp3 CRC=0x6c9850fe
diff --git a/tests/ref/lavf-fate/ogg_vp3 b/tests/ref/lavf-fate/ogg_vp3
deleted file mode 100644
index 9e9cc7e..0000000
--- a/tests/ref/lavf-fate/ogg_vp3
+++ /dev/null
@@ -1,3 +0,0 @@
-4bd51dac3194fa88ae33767c25b4b1e6 *./tests/data/lavf-fate/lavf.ogg
-417621 ./tests/data/lavf-fate/lavf.ogg
-./tests/data/lavf-fate/lavf.ogg CRC=0x037e3e79
diff --git a/tests/ref/lavf-fate/ogg_vp8 b/tests/ref/lavf-fate/ogg_vp8
deleted file mode 100644
index 78131f3..0000000
--- a/tests/ref/lavf-fate/ogg_vp8
+++ /dev/null
@@ -1,3 +0,0 @@
-c56d8dce728d46d4f0ab4c7cc9f86abc *./tests/data/lavf-fate/lavf.ogv
-95009 ./tests/data/lavf-fate/lavf.ogv
-./tests/data/lavf-fate/lavf.ogv CRC=0x8c067a66
diff --git a/tests/ref/lavf-fate/qtrle_mace6.mov b/tests/ref/lavf-fate/qtrle_mace6.mov
new file mode 100644
index 0000000..85c585f
--- /dev/null
+++ b/tests/ref/lavf-fate/qtrle_mace6.mov
@@ -0,0 +1,3 @@
+f0ae34fb90e11342624e092094273aef *tests/data/lavf-fate/lavf.qtrle_mace6.mov
+1270415 tests/data/lavf-fate/lavf.qtrle_mace6.mov
+tests/data/lavf-fate/lavf.qtrle_mace6.mov CRC=0x9320cd26
diff --git a/tests/ref/lavf-fate/vp3.ogg b/tests/ref/lavf-fate/vp3.ogg
new file mode 100644
index 0000000..f4e22dc
--- /dev/null
+++ b/tests/ref/lavf-fate/vp3.ogg
@@ -0,0 +1,3 @@
+4bd51dac3194fa88ae33767c25b4b1e6 *tests/data/lavf-fate/lavf.vp3.ogg
+417621 tests/data/lavf-fate/lavf.vp3.ogg
+tests/data/lavf-fate/lavf.vp3.ogg CRC=0x037e3e79
diff --git a/tests/ref/lavf-fate/vp8.ogg b/tests/ref/lavf-fate/vp8.ogg
new file mode 100644
index 0000000..1a40825
--- /dev/null
+++ b/tests/ref/lavf-fate/vp8.ogg
@@ -0,0 +1,3 @@
+c56d8dce728d46d4f0ab4c7cc9f86abc *tests/data/lavf-fate/lavf.vp8.ogg
+95009 tests/data/lavf-fate/lavf.vp8.ogg
+tests/data/lavf-fate/lavf.vp8.ogg CRC=0x8c067a66
diff --git a/tests/ref/lavf/aiff b/tests/ref/lavf/aiff
index c504c18..d72ec85 100644
--- a/tests/ref/lavf/aiff
+++ b/tests/ref/lavf/aiff
@@ -1,3 +1,3 @@
-2c129d88acef834e32869145fe792b9c *./tests/data/lavf/lavf.aif
-88270 ./tests/data/lavf/lavf.aif
-./tests/data/lavf/lavf.aif CRC=0x3a1da17e
+2c129d88acef834e32869145fe792b9c *tests/data/lavf/lavf.aiff
+88270 tests/data/lavf/lavf.aiff
+tests/data/lavf/lavf.aiff CRC=0x3a1da17e
diff --git a/tests/ref/lavf/al b/tests/ref/lavf/al
new file mode 100644
index 0000000..c383c36
--- /dev/null
+++ b/tests/ref/lavf/al
@@ -0,0 +1,3 @@
+652d96e474869ddb01403743deb35117 *tests/data/lavf/lavf.al
+44100 tests/data/lavf/lavf.al
+tests/data/lavf/lavf.al CRC=0xf9643112
diff --git a/tests/ref/lavf/alaw b/tests/ref/lavf/alaw
deleted file mode 100644
index d93d6fc..0000000
--- a/tests/ref/lavf/alaw
+++ /dev/null
@@ -1,3 +0,0 @@
-652d96e474869ddb01403743deb35117 *./tests/data/lavf/lavf.al
-44100 ./tests/data/lavf/lavf.al
-./tests/data/lavf/lavf.al CRC=0xf9643112
diff --git a/tests/ref/lavf/apng b/tests/ref/lavf/apng
index 8e9e5e6..95f1fbe 100644
--- a/tests/ref/lavf/apng
+++ b/tests/ref/lavf/apng
@@ -1,9 +1,3 @@
-a4c46fad7716ad094eb3c78b74ca0244 *./tests/data/lavf/lavf.apng
-6209864 ./tests/data/lavf/lavf.apng
-./tests/data/lavf/lavf.apng CRC=0x87b3c15f
-a4c46fad7716ad094eb3c78b74ca0244 *./tests/data/lavf/lavf.copy.apng
-6209864 ./tests/data/lavf/lavf.copy.apng
-./tests/data/lavf/lavf.copy.apng CRC=0x87b3c15f
-c5900fdd1b2fc30b985793f5226fd0c4 *./tests/data/lavf/lavf.png
-248854 ./tests/data/lavf/lavf.png
-./tests/data/lavf/lavf.png CRC=0xd8c7b7a1
+a4c46fad7716ad094eb3c78b74ca0244 *tests/data/lavf/lavf.apng
+6209864 tests/data/lavf/lavf.apng
+tests/data/lavf/lavf.apng CRC=0x87b3c15f
diff --git a/tests/ref/lavf/apng.png b/tests/ref/lavf/apng.png
new file mode 100644
index 0000000..b42f5a8
--- /dev/null
+++ b/tests/ref/lavf/apng.png
@@ -0,0 +1,3 @@
+c5900fdd1b2fc30b985793f5226fd0c4 *tests/data/lavf/lavf.apng.png
+248854 tests/data/lavf/lavf.apng.png
+tests/data/lavf/lavf.apng.png CRC=0xd8c7b7a1
diff --git a/tests/ref/lavf/asf b/tests/ref/lavf/asf
index 911af72..fbcbd48 100644
--- a/tests/ref/lavf/asf
+++ b/tests/ref/lavf/asf
@@ -1,3 +1,3 @@
-76f131a5426f0ba5fc7409d1a1bbfdd7 *./tests/data/lavf/lavf.asf
-333585 ./tests/data/lavf/lavf.asf
-./tests/data/lavf/lavf.asf CRC=0xf6340a10
+76f131a5426f0ba5fc7409d1a1bbfdd7 *tests/data/lavf/lavf.asf
+333585 tests/data/lavf/lavf.asf
+tests/data/lavf/lavf.asf CRC=0xf6340a10
diff --git a/tests/ref/lavf/ast b/tests/ref/lavf/ast
index 513c612..2f2e8de 100644
--- a/tests/ref/lavf/ast
+++ b/tests/ref/lavf/ast
@@ -1,3 +1,3 @@
-07f5d23aa8bade984034f7005bd72947 *./tests/data/lavf/lavf.ast
-177872 ./tests/data/lavf/lavf.ast
-./tests/data/lavf/lavf.ast CRC=0xe61e3bd0
+07f5d23aa8bade984034f7005bd72947 *tests/data/lavf/lavf.ast
+177872 tests/data/lavf/lavf.ast
+tests/data/lavf/lavf.ast CRC=0xe61e3bd0
diff --git a/tests/ref/lavf/au b/tests/ref/lavf/au
index dcd02f3..4abedf3 100644
--- a/tests/ref/lavf/au
+++ b/tests/ref/lavf/au
@@ -1,3 +1,3 @@
-5228ad3783888c45a08dac5ab6118794 *./tests/data/lavf/lavf.au
-88240 ./tests/data/lavf/lavf.au
-./tests/data/lavf/lavf.au CRC=0x3a1da17e
+5228ad3783888c45a08dac5ab6118794 *tests/data/lavf/lavf.au
+88240 tests/data/lavf/lavf.au
+tests/data/lavf/lavf.au CRC=0x3a1da17e
diff --git a/tests/ref/lavf/avi b/tests/ref/lavf/avi
index dfdb392..b8c2f7a 100644
--- a/tests/ref/lavf/avi
+++ b/tests/ref/lavf/avi
@@ -1,3 +1,3 @@
-ab696052289d8dfea193e4cf94a94a6f *./tests/data/lavf/lavf.avi
-330814 ./tests/data/lavf/lavf.avi
-./tests/data/lavf/lavf.avi CRC=0xec6c3c68
+ab696052289d8dfea193e4cf94a94a6f *tests/data/lavf/lavf.avi
+330814 tests/data/lavf/lavf.avi
+tests/data/lavf/lavf.avi CRC=0xec6c3c68
diff --git a/tests/ref/lavf/bmp b/tests/ref/lavf/bmp
index 8958855..af767e5 100644
--- a/tests/ref/lavf/bmp
+++ b/tests/ref/lavf/bmp
@@ -1,3 +1,3 @@
-71f4d64a6b3c71f43a4eff526f84841c *./tests/data/images/bmp/02.bmp
-./tests/data/images/bmp/%02d.bmp CRC=0xe6c71946
-304182 ./tests/data/images/bmp/02.bmp
+71f4d64a6b3c71f43a4eff526f84841c *tests/data/images/bmp/02.bmp
+tests/data/images/bmp/%02d.bmp CRC=0xe6c71946
+304182 tests/data/images/bmp/02.bmp
diff --git a/tests/ref/lavf/caf b/tests/ref/lavf/caf
index 7b2a67d..8488f3f 100644
--- a/tests/ref/lavf/caf
+++ b/tests/ref/lavf/caf
@@ -1,3 +1,3 @@
-c3c38cba600722c87c0e75bd0688b7fc *./tests/data/lavf/lavf.caf
-88323 ./tests/data/lavf/lavf.caf
-./tests/data/lavf/lavf.caf CRC=0x3a1da17e
+c3c38cba600722c87c0e75bd0688b7fc *tests/data/lavf/lavf.caf
+88323 tests/data/lavf/lavf.caf
+tests/data/lavf/lavf.caf CRC=0x3a1da17e
diff --git a/tests/ref/lavf/dpx b/tests/ref/lavf/dpx
index 7bbed3e..68fe25a 100644
--- a/tests/ref/lavf/dpx
+++ b/tests/ref/lavf/dpx
@@ -1,18 +1,3 @@
-4c8880d5835ffb5fe37c1ed8c8d404de *./tests/data/images/dpx/02.dpx
-./tests/data/images/dpx/%02d.dpx CRC=0x6da01946
-305792 ./tests/data/images/dpx/02.dpx
-7ca935d5d5e00c54acbc85565d3039b6 *./tests/data/images/dpx/02.dpx
-./tests/data/images/dpx/%02d.dpx CRC=0xe6663fba
-407168 ./tests/data/images/dpx/02.dpx
-a4cfea1797c928f2eff73573e559675d *./tests/data/images/dpx/02.dpx
-./tests/data/images/dpx/%02d.dpx CRC=0x1c755633
-609920 ./tests/data/images/dpx/02.dpx
-075963c3c08978b6a20555ba09161434 *./tests/data/images/dpx/02.dpx
-./tests/data/images/dpx/%02d.dpx CRC=0xe5b9c023
-609920 ./tests/data/images/dpx/02.dpx
-b9f22728f8ff393bf30cf6cbd624fa95 *./tests/data/images/dpx/02.dpx
-./tests/data/images/dpx/%02d.dpx CRC=0xf38d5830
-407168 ./tests/data/images/dpx/02.dpx
-545603630f30dec2768c8ae8d12eb8ea *./tests/data/images/dpx/02.dpx
-./tests/data/images/dpx/%02d.dpx CRC=0xe72ce131
-812672 ./tests/data/images/dpx/02.dpx
+4c8880d5835ffb5fe37c1ed8c8d404de *tests/data/images/dpx/02.dpx
+tests/data/images/dpx/%02d.dpx CRC=0x6da01946
+305792 tests/data/images/dpx/02.dpx
diff --git a/tests/ref/lavf/dv b/tests/ref/lavf/dv
new file mode 100644
index 0000000..7ae4223
--- /dev/null
+++ b/tests/ref/lavf/dv
@@ -0,0 +1,3 @@
+2fb332aab8f2ba9c33b1b2368194392a *tests/data/lavf/lavf.dv
+3600000 tests/data/lavf/lavf.dv
+tests/data/lavf/lavf.dv CRC=0xbdaf7f52
diff --git a/tests/ref/lavf/dv_fmt b/tests/ref/lavf/dv_fmt
deleted file mode 100644
index 0263202..0000000
--- a/tests/ref/lavf/dv_fmt
+++ /dev/null
@@ -1,9 +0,0 @@
-7830f9c6716ceb6011f865f1e521b951 *./tests/data/lavf/lavf.dv
-3600000 ./tests/data/lavf/lavf.dv
-./tests/data/lavf/lavf.dv CRC=0xd428d3ee
-5569626370c7c72d40de2c4559e32856 *./tests/data/lavf/lavf.dv
-3480000 ./tests/data/lavf/lavf.dv
-./tests/data/lavf/lavf.dv CRC=0xa0088163
-2fb332aab8f2ba9c33b1b2368194392a *./tests/data/lavf/lavf.dv
-3600000 ./tests/data/lavf/lavf.dv
-./tests/data/lavf/lavf.dv CRC=0xbdaf7f52
diff --git a/tests/ref/lavf/dv_ntsc b/tests/ref/lavf/dv_ntsc
new file mode 100644
index 0000000..410b6ec
--- /dev/null
+++ b/tests/ref/lavf/dv_ntsc
@@ -0,0 +1,3 @@
+5569626370c7c72d40de2c4559e32856 *tests/data/lavf/lavf.dv_ntsc
+3480000 tests/data/lavf/lavf.dv_ntsc
+tests/data/lavf/lavf.dv_ntsc CRC=0xa0088163
diff --git a/tests/ref/lavf/dv_pal b/tests/ref/lavf/dv_pal
new file mode 100644
index 0000000..93bb728
--- /dev/null
+++ b/tests/ref/lavf/dv_pal
@@ -0,0 +1,3 @@
+7830f9c6716ceb6011f865f1e521b951 *tests/data/lavf/lavf.dv_pal
+3600000 tests/data/lavf/lavf.dv_pal
+tests/data/lavf/lavf.dv_pal CRC=0xd428d3ee
diff --git a/tests/ref/lavf/fits b/tests/ref/lavf/fits
deleted file mode 100644
index 489542b..0000000
--- a/tests/ref/lavf/fits
+++ /dev/null
@@ -1,18 +0,0 @@
-ed9fd697d0d782df6201f6a2db184552 *./tests/data/lavf/graylavf.fits
-5328000 ./tests/data/lavf/graylavf.fits
-./tests/data/lavf/graylavf.fits CRC=0xbacf446c
-48e6caf6a59e32f9a8a39979c9183a7f *./tests/data/lavf/gray16belavf.fits
-10368000 ./tests/data/lavf/gray16belavf.fits
-./tests/data/lavf/gray16belavf.fits CRC=0xae2b58d4
-be2f7112fd193c9a909304c81e662769 *./tests/data/lavf/gbrplavf.fits
-15408000 ./tests/data/lavf/gbrplavf.fits
-./tests/data/lavf/gbrplavf.fits CRC=0x04ed3828
-c89a72185cfad363aa9cc42e84fed301 *./tests/data/lavf/gbraplavf.fits
-20448000 ./tests/data/lavf/gbraplavf.fits
-./tests/data/lavf/gbraplavf.fits CRC=0x032a6409
-d539b9e02f5ab8fb85717c8adb60b6cc *./tests/data/lavf/gbrp16belavf.fits
-30672000 ./tests/data/lavf/gbrp16belavf.fits
-./tests/data/lavf/gbrp16belavf.fits CRC=0x81897ff7
-3dc3622fb09a338b406d8a12a30f2545 *./tests/data/lavf/gbrap16belavf.fits
-40752000 ./tests/data/lavf/gbrap16belavf.fits
-./tests/data/lavf/gbrap16belavf.fits CRC=0x247dd7b9
diff --git a/tests/ref/lavf/flm b/tests/ref/lavf/flm
index 59aac92..15ca5ff 100644
--- a/tests/ref/lavf/flm
+++ b/tests/ref/lavf/flm
@@ -1,3 +1,3 @@
-ef4783171ebbc38855331c9ead978322 *./tests/data/lavf/lavf.flm
-10137636 ./tests/data/lavf/lavf.flm
-./tests/data/lavf/lavf.flm CRC=0xcdf15757
+ef4783171ebbc38855331c9ead978322 *tests/data/lavf/lavf.flm
+10137636 tests/data/lavf/lavf.flm
+tests/data/lavf/lavf.flm CRC=0xcdf15757
diff --git a/tests/ref/lavf/flv b/tests/ref/lavf/flv
new file mode 100644
index 0000000..3153472
--- /dev/null
+++ b/tests/ref/lavf/flv
@@ -0,0 +1,3 @@
+0d229f87b3aad778074ace499359d137 *tests/data/lavf/lavf.flv
+329554 tests/data/lavf/lavf.flv
+tests/data/lavf/lavf.flv CRC=0x4eac88c5
diff --git a/tests/ref/lavf/flv_fmt b/tests/ref/lavf/flv_fmt
deleted file mode 100644
index f014bec..0000000
--- a/tests/ref/lavf/flv_fmt
+++ /dev/null
@@ -1,3 +0,0 @@
-0d229f87b3aad778074ace499359d137 *./tests/data/lavf/lavf.flv
-329554 ./tests/data/lavf/lavf.flv
-./tests/data/lavf/lavf.flv CRC=0x4eac88c5
diff --git a/tests/ref/lavf/gbrap.fits b/tests/ref/lavf/gbrap.fits
new file mode 100644
index 0000000..57c71e1
--- /dev/null
+++ b/tests/ref/lavf/gbrap.fits
@@ -0,0 +1,3 @@
+28eb102547b82acca57ef097a6c639d8 *tests/data/lavf/lavf.gbrap.fits
+10224000 tests/data/lavf/lavf.gbrap.fits
+tests/data/lavf/lavf.gbrap.fits CRC=0x883af247
diff --git a/tests/ref/lavf/gbrap16be.fits b/tests/ref/lavf/gbrap16be.fits
new file mode 100644
index 0000000..030a6d9
--- /dev/null
+++ b/tests/ref/lavf/gbrap16be.fits
@@ -0,0 +1,3 @@
+ff5fb24a67aeabd4f56088ca8b03d8b0 *tests/data/lavf/lavf.gbrap16be.fits
+20376000 tests/data/lavf/lavf.gbrap16be.fits
+tests/data/lavf/lavf.gbrap16be.fits CRC=0xa981271b
diff --git a/tests/ref/lavf/gbrp.fits b/tests/ref/lavf/gbrp.fits
new file mode 100644
index 0000000..2b60ddb
--- /dev/null
+++ b/tests/ref/lavf/gbrp.fits
@@ -0,0 +1,3 @@
+dae49b5f6eb58981ba91e3e108355717 *tests/data/lavf/lavf.gbrp.fits
+7704000 tests/data/lavf/lavf.gbrp.fits
+tests/data/lavf/lavf.gbrp.fits CRC=0x80745c5e
diff --git a/tests/ref/lavf/gbrp10le.dpx b/tests/ref/lavf/gbrp10le.dpx
new file mode 100644
index 0000000..b33da34
--- /dev/null
+++ b/tests/ref/lavf/gbrp10le.dpx
@@ -0,0 +1,3 @@
+7ca935d5d5e00c54acbc85565d3039b6 *tests/data/images/gbrp10le.dpx/02.gbrp10le.dpx
+tests/data/images/gbrp10le.dpx/%02d.gbrp10le.dpx CRC=0xe6663fba
+407168 tests/data/images/gbrp10le.dpx/02.gbrp10le.dpx
diff --git a/tests/ref/lavf/gbrp12le.dpx b/tests/ref/lavf/gbrp12le.dpx
new file mode 100644
index 0000000..e2e794e
--- /dev/null
+++ b/tests/ref/lavf/gbrp12le.dpx
@@ -0,0 +1,3 @@
+a4cfea1797c928f2eff73573e559675d *tests/data/images/gbrp12le.dpx/02.gbrp12le.dpx
+tests/data/images/gbrp12le.dpx/%02d.gbrp12le.dpx CRC=0x1c755633
+609920 tests/data/images/gbrp12le.dpx/02.gbrp12le.dpx
diff --git a/tests/ref/lavf/gbrp16be.fits b/tests/ref/lavf/gbrp16be.fits
new file mode 100644
index 0000000..9aa9db6
--- /dev/null
+++ b/tests/ref/lavf/gbrp16be.fits
@@ -0,0 +1,3 @@
+693ea80c33eb9b348db27a0bc4a5cc8a *tests/data/lavf/lavf.gbrp16be.fits
+15336000 tests/data/lavf/lavf.gbrp16be.fits
+tests/data/lavf/lavf.gbrp16be.fits CRC=0x9573fb2b
diff --git a/tests/ref/lavf/gif b/tests/ref/lavf/gif
index d2e2f11..fc94b9d 100644
--- a/tests/ref/lavf/gif
+++ b/tests/ref/lavf/gif
@@ -1,3 +1,3 @@
-e35f5ea283bbcb249818e0078ec72664 *./tests/data/lavf/lavf.gif
-2011766 ./tests/data/lavf/lavf.gif
-./tests/data/lavf/lavf.gif CRC=0x2429faff
+e35f5ea283bbcb249818e0078ec72664 *tests/data/lavf/lavf.gif
+2011766 tests/data/lavf/lavf.gif
+tests/data/lavf/lavf.gif CRC=0x2429faff
diff --git a/tests/ref/lavf/gray.fits b/tests/ref/lavf/gray.fits
new file mode 100644
index 0000000..ce6783b
--- /dev/null
+++ b/tests/ref/lavf/gray.fits
@@ -0,0 +1,3 @@
+d76b46a5a336b56f73451817cdf3897c *tests/data/lavf/lavf.gray.fits
+2664000 tests/data/lavf/lavf.gray.fits
+tests/data/lavf/lavf.gray.fits CRC=0x7aa0122f
diff --git a/tests/ref/lavf/gray.pam b/tests/ref/lavf/gray.pam
new file mode 100644
index 0000000..77af981
--- /dev/null
+++ b/tests/ref/lavf/gray.pam
@@ -0,0 +1,3 @@
+35cb9e42b2d3181be494f8693af1ddea *tests/data/images/gray.pam/02.gray.pam
+tests/data/images/gray.pam/%02d.gray.pam CRC=0x0ff205be
+101445 tests/data/images/gray.pam/02.gray.pam
diff --git a/tests/ref/lavf/gray.xwd b/tests/ref/lavf/gray.xwd
new file mode 100644
index 0000000..15c80fb
--- /dev/null
+++ b/tests/ref/lavf/gray.xwd
@@ -0,0 +1,3 @@
+85e9b8b814a1dea71d143aac2e487037 *tests/data/images/gray.xwd/02.gray.xwd
+tests/data/images/gray.xwd/%02d.gray.xwd CRC=0x0ff205be
+101487 tests/data/images/gray.xwd/02.gray.xwd
diff --git a/tests/ref/lavf/gray16be.fits b/tests/ref/lavf/gray16be.fits
new file mode 100644
index 0000000..058fa4a
--- /dev/null
+++ b/tests/ref/lavf/gray16be.fits
@@ -0,0 +1,3 @@
+15e85a553bbd07783f92377ed369308b *tests/data/lavf/lavf.gray16be.fits
+5184000 tests/data/lavf/lavf.gray16be.fits
+tests/data/lavf/lavf.gray16be.fits CRC=0x8cdcbeb2
diff --git a/tests/ref/lavf/gray16be.pam b/tests/ref/lavf/gray16be.pam
new file mode 100644
index 0000000..5038384
--- /dev/null
+++ b/tests/ref/lavf/gray16be.pam
@@ -0,0 +1,3 @@
+740eb42157af9e9eed46b70ba6a6cf4d *tests/data/images/gray16be.pam/02.gray16be.pam
+tests/data/images/gray16be.pam/%02d.gray16be.pam CRC=0x893f10ef
+202823 tests/data/images/gray16be.pam/02.gray16be.pam
diff --git a/tests/ref/lavf/gray16be.png b/tests/ref/lavf/gray16be.png
new file mode 100644
index 0000000..2f52a83
--- /dev/null
+++ b/tests/ref/lavf/gray16be.png
@@ -0,0 +1,3 @@
+6cf54c13aa407b77547cf6dfe23ecba3 *tests/data/images/gray16be.png/02.gray16be.png
+tests/data/images/gray16be.png/%02d.gray16be.png CRC=0x893f10ef
+47365 tests/data/images/gray16be.png/02.gray16be.png
diff --git a/tests/ref/lavf/gxf b/tests/ref/lavf/gxf
index 4dd463c..e8351fa 100644
--- a/tests/ref/lavf/gxf
+++ b/tests/ref/lavf/gxf
@@ -1,9 +1,3 @@
-6ef34e8bedf699cd1601022c4a0a4910 *./tests/data/lavf/lavf.gxf
-795876 ./tests/data/lavf/lavf.gxf
-./tests/data/lavf/lavf.gxf CRC=0x1dbfef76
-7780c428dde2c93a9ff04794f7168440 *./tests/data/lavf/lavf.gxf
-794656 ./tests/data/lavf/lavf.gxf
-./tests/data/lavf/lavf.gxf CRC=0xdcd39443
-0638c4d073ac224608baaba16732b68f *./tests/data/lavf/lavf.gxf
-795876 ./tests/data/lavf/lavf.gxf
-./tests/data/lavf/lavf.gxf CRC=0x5ade0285
+0638c4d073ac224608baaba16732b68f *tests/data/lavf/lavf.gxf
+795876 tests/data/lavf/lavf.gxf
+tests/data/lavf/lavf.gxf CRC=0x5ade0285
diff --git a/tests/ref/lavf/gxf_ntsc b/tests/ref/lavf/gxf_ntsc
new file mode 100644
index 0000000..60efd80
--- /dev/null
+++ b/tests/ref/lavf/gxf_ntsc
@@ -0,0 +1,3 @@
+9a27673c85f1671ba9ff7cd33e5735de *tests/data/lavf/lavf.gxf_ntsc
+794660 tests/data/lavf/lavf.gxf_ntsc
+tests/data/lavf/lavf.gxf_ntsc CRC=0xdcd39443
diff --git a/tests/ref/lavf/gxf_pal b/tests/ref/lavf/gxf_pal
new file mode 100644
index 0000000..aefcd0c
--- /dev/null
+++ b/tests/ref/lavf/gxf_pal
@@ -0,0 +1,3 @@
+4d1bd16c6d52468c05711d8301e4e302 *tests/data/lavf/lavf.gxf_pal
+795880 tests/data/lavf/lavf.gxf_pal
+tests/data/lavf/lavf.gxf_pal CRC=0x1dbfef76
diff --git a/tests/ref/lavf/ircam b/tests/ref/lavf/ircam
index 47e0709..7a17fb2 100644
--- a/tests/ref/lavf/ircam
+++ b/tests/ref/lavf/ircam
@@ -1,3 +1,3 @@
-45d9a4667030e95d1d8fb6ab012f1aa0 *./tests/data/lavf/lavf.ircam
-89224 ./tests/data/lavf/lavf.ircam
-./tests/data/lavf/lavf.ircam CRC=0x3a1da17e
+45d9a4667030e95d1d8fb6ab012f1aa0 *tests/data/lavf/lavf.ircam
+89224 tests/data/lavf/lavf.ircam
+tests/data/lavf/lavf.ircam CRC=0x3a1da17e
diff --git a/tests/ref/lavf/ismv b/tests/ref/lavf/ismv
index 7b4a466..e736170 100644
--- a/tests/ref/lavf/ismv
+++ b/tests/ref/lavf/ismv
@@ -1,9 +1,9 @@
-96053075a3f60d271131fe2d0765c267 *./tests/data/lavf/lavf.ismv
-312542 ./tests/data/lavf/lavf.ismv
-./tests/data/lavf/lavf.ismv CRC=0x9d9a638a
-7022701b4c693bc4ffe1e9f96dd82a02 *./tests/data/lavf/lavf.ismv
-321448 ./tests/data/lavf/lavf.ismv
-./tests/data/lavf/lavf.ismv CRC=0xe8130120
-96053075a3f60d271131fe2d0765c267 *./tests/data/lavf/lavf.ismv
-312542 ./tests/data/lavf/lavf.ismv
-./tests/data/lavf/lavf.ismv CRC=0x9d9a638a
+4c6bc5ac805a76bbbd886a69d2e61554 *tests/data/lavf/lavf.ismv
+313169 tests/data/lavf/lavf.ismv
+tests/data/lavf/lavf.ismv CRC=0x9d9a638a
+18678627921460328ea3fed238d0d57d *tests/data/lavf/lavf.ismv
+322075 tests/data/lavf/lavf.ismv
+tests/data/lavf/lavf.ismv CRC=0xe8130120
+b9a858caf55b1eff2273e746e9f72dc4 *tests/data/lavf/lavf.ismv
+312546 tests/data/lavf/lavf.ismv
+tests/data/lavf/lavf.ismv CRC=0x9d9a638a
diff --git a/tests/ref/lavf/jpg b/tests/ref/lavf/jpg
index 5080667..ecbb22c 100644
--- a/tests/ref/lavf/jpg
+++ b/tests/ref/lavf/jpg
@@ -1,3 +1,3 @@
-1e7c6d937f21c045e0b238a83f62f3c5 *./tests/data/images/jpg/02.jpg
-./tests/data/images/jpg/%02d.jpg CRC=0xe3509f33
-26037 ./tests/data/images/jpg/02.jpg
+1e7c6d937f21c045e0b238a83f62f3c5 *tests/data/images/jpg/02.jpg
+tests/data/images/jpg/%02d.jpg CRC=0xe3509f33
+26037 tests/data/images/jpg/02.jpg
diff --git a/tests/ref/lavf/mka b/tests/ref/lavf/mka
index ac0f6cf..3038672 100644
--- a/tests/ref/lavf/mka
+++ b/tests/ref/lavf/mka
@@ -1,3 +1,3 @@
-2d9722c0691e140237af0036e3a178b0 *./tests/data/lavf/lavf.mka
-43684 ./tests/data/lavf/lavf.mka
-./tests/data/lavf/lavf.mka CRC=0x3a1da17e
+a67d0e6113de91ee53ee00b47fa6ff42 *tests/data/lavf/lavf.mka
+43559 tests/data/lavf/lavf.mka
+tests/data/lavf/lavf.mka CRC=0x3a1da17e
diff --git a/tests/ref/lavf/mkv b/tests/ref/lavf/mkv
index 0083033..9eaf5a4 100644
--- a/tests/ref/lavf/mkv
+++ b/tests/ref/lavf/mkv
@@ -1,6 +1,3 @@
-7c8697c324e8ad79c5ea14364a6c39b8 *./tests/data/lavf/lavf.mkv
-472759 ./tests/data/lavf/lavf.mkv
-./tests/data/lavf/lavf.mkv CRC=0xec6c3c68
-9767a3b526d7e56d7400164cb888990c *./tests/data/lavf/lavf.mkv
-320603 ./tests/data/lavf/lavf.mkv
-./tests/data/lavf/lavf.mkv CRC=0xec6c3c68
+e08b2effe716fb6b72f4a2cd2598b6d4 *tests/data/lavf/lavf.mkv
+320411 tests/data/lavf/lavf.mkv
+tests/data/lavf/lavf.mkv CRC=0xec6c3c68
diff --git a/tests/ref/lavf/mkv_attachment b/tests/ref/lavf/mkv_attachment
new file mode 100644
index 0000000..d6cd1cd
--- /dev/null
+++ b/tests/ref/lavf/mkv_attachment
@@ -0,0 +1,3 @@
+aa2419820c590d0512ce199b7b59b9c9 *tests/data/lavf/lavf.mkv_attachment
+472566 tests/data/lavf/lavf.mkv_attachment
+tests/data/lavf/lavf.mkv_attachment CRC=0xec6c3c68
diff --git a/tests/ref/lavf/mmf b/tests/ref/lavf/mmf
index fae95ca..36094bc 100644
--- a/tests/ref/lavf/mmf
+++ b/tests/ref/lavf/mmf
@@ -1,3 +1,3 @@
-643fadf7482f6d937ed75ec4f508e4f1 *./tests/data/lavf/lavf.mmf
-22611 ./tests/data/lavf/lavf.mmf
-./tests/data/lavf/lavf.mmf CRC=0x8dea1388
+643fadf7482f6d937ed75ec4f508e4f1 *tests/data/lavf/lavf.mmf
+22611 tests/data/lavf/lavf.mmf
+tests/data/lavf/lavf.mmf CRC=0x8dea1388
diff --git a/tests/ref/lavf/monob.pam b/tests/ref/lavf/monob.pam
new file mode 100644
index 0000000..488907e
--- /dev/null
+++ b/tests/ref/lavf/monob.pam
@@ -0,0 +1,3 @@
+d2f5eb2f959ca3a90c02f1887b6e0c4f *tests/data/images/monob.pam/02.monob.pam
+tests/data/images/monob.pam/%02d.monob.pam CRC=0xab19200d
+101447 tests/data/images/monob.pam/02.monob.pam
diff --git a/tests/ref/lavf/monow.xwd b/tests/ref/lavf/monow.xwd
new file mode 100644
index 0000000..da09d8b
--- /dev/null
+++ b/tests/ref/lavf/monow.xwd
@@ -0,0 +1,3 @@
+796e2e309ac0844cfb2f4959816508ee *tests/data/images/monow.xwd/02.monow.xwd
+tests/data/images/monow.xwd/%02d.monow.xwd CRC=0xc9a20204
+12783 tests/data/images/monow.xwd/02.monow.xwd
diff --git a/tests/ref/lavf/mov b/tests/ref/lavf/mov
index 2e1f24d..75a0c48 100644
--- a/tests/ref/lavf/mov
+++ b/tests/ref/lavf/mov
@@ -1,21 +1,9 @@
-a10d50f2679df92264e1fc21cb8be630 *./tests/data/lavf/lavf.mov
-366449 ./tests/data/lavf/lavf.mov
-./tests/data/lavf/lavf.mov CRC=0xbb2b949b
-6258f70f974e3c802e01d02ac33c7bbd *./tests/data/lavf/lavf.mov
-357539 ./tests/data/lavf/lavf.mov
-./tests/data/lavf/lavf.mov CRC=0xbb2b949b
-ba3b8b49e420510a0d417400dbedfc2d *./tests/data/lavf/lavf.mov
-366621 ./tests/data/lavf/lavf.mov
-./tests/data/lavf/lavf.mov CRC=0xa9793231
-fd0e4de8e7f6d0c8c0681d7020f00f50 *./tests/data/lavf/lavf.mov
-356921 ./tests/data/lavf/lavf.mov
-./tests/data/lavf/lavf.mov CRC=0xbb2b949b
-ebca72c186a4f3ba9bb17d9cb5b74fef *./tests/data/lavf/lavf.mp4
-312457 ./tests/data/lavf/lavf.mp4
-./tests/data/lavf/lavf.mp4 CRC=0x9d9a638a
-9944512475d82d2d601f3c96101bdf9c *./tests/data/lavf/lavf.mp4
-321343 ./tests/data/lavf/lavf.mp4
-./tests/data/lavf/lavf.mp4 CRC=0xe8130120
-7b3e71f294901067046c09f03a426bdc *./tests/data/lavf/lavf.mp4
-312001 ./tests/data/lavf/lavf.mp4
-./tests/data/lavf/lavf.mp4 CRC=0x9d9a638a
+11bd76730274924e02623172b82b5236 *tests/data/lavf/lavf.mov
+357539 tests/data/lavf/lavf.mov
+tests/data/lavf/lavf.mov CRC=0xbb2b949b
+6efa586655e3db043cb29668f5216610 *tests/data/lavf/lavf.mov
+366621 tests/data/lavf/lavf.mov
+tests/data/lavf/lavf.mov CRC=0xa9793231
+c80c625ded376602e71d5aa6ac6fdb1c *tests/data/lavf/lavf.mov
+356921 tests/data/lavf/lavf.mov
+tests/data/lavf/lavf.mov CRC=0xbb2b949b
diff --git a/tests/ref/lavf/mov_rtphint b/tests/ref/lavf/mov_rtphint
new file mode 100644
index 0000000..79a7606
--- /dev/null
+++ b/tests/ref/lavf/mov_rtphint
@@ -0,0 +1,3 @@
+7014419d8267c2751314303a8fb303c1 *tests/data/lavf/lavf.mov_rtphint
+366449 tests/data/lavf/lavf.mov_rtphint
+tests/data/lavf/lavf.mov_rtphint CRC=0xbb2b949b
diff --git a/tests/ref/lavf/mp4 b/tests/ref/lavf/mp4
new file mode 100644
index 0000000..8482812
--- /dev/null
+++ b/tests/ref/lavf/mp4
@@ -0,0 +1,9 @@
+ebca72c186a4f3ba9bb17d9cb5b74fef *tests/data/lavf/lavf.mp4
+312457 tests/data/lavf/lavf.mp4
+tests/data/lavf/lavf.mp4 CRC=0x9d9a638a
+9944512475d82d2d601f3c96101bdf9c *tests/data/lavf/lavf.mp4
+321343 tests/data/lavf/lavf.mp4
+tests/data/lavf/lavf.mp4 CRC=0xe8130120
+7b3e71f294901067046c09f03a426bdc *tests/data/lavf/lavf.mp4
+312001 tests/data/lavf/lavf.mp4
+tests/data/lavf/lavf.mp4 CRC=0x9d9a638a
diff --git a/tests/ref/lavf/mpg b/tests/ref/lavf/mpg
index 7aab14f..332b711 100644
--- a/tests/ref/lavf/mpg
+++ b/tests/ref/lavf/mpg
@@ -1,9 +1,9 @@
-01bbdea588da51ab4a9d1d26f3443c96 *./tests/data/lavf/lavf.mpg
-372736 ./tests/data/lavf/lavf.mpg
-./tests/data/lavf/lavf.mpg CRC=0x000e23ae
-87b447b78a7d1141b9d41bb3aa50434d *./tests/data/lavf/lavf.mpg
-389120 ./tests/data/lavf/lavf.mpg
-./tests/data/lavf/lavf.mpg CRC=0x60ba4ab9
-284f41c914df75c12de01e223d65f87f *./tests/data/lavf/lavf.mpg
-372736 ./tests/data/lavf/lavf.mpg
-./tests/data/lavf/lavf.mpg CRC=0x000e23ae
+01bbdea588da51ab4a9d1d26f3443c96 *tests/data/lavf/lavf.mpg
+372736 tests/data/lavf/lavf.mpg
+tests/data/lavf/lavf.mpg CRC=0x000e23ae
+87b447b78a7d1141b9d41bb3aa50434d *tests/data/lavf/lavf.mpg
+389120 tests/data/lavf/lavf.mpg
+tests/data/lavf/lavf.mpg CRC=0x60ba4ab9
+284f41c914df75c12de01e223d65f87f *tests/data/lavf/lavf.mpg
+372736 tests/data/lavf/lavf.mpg
+tests/data/lavf/lavf.mpg CRC=0x000e23ae
diff --git a/tests/ref/lavf/mulaw b/tests/ref/lavf/mulaw
deleted file mode 100644
index bd54084..0000000
--- a/tests/ref/lavf/mulaw
+++ /dev/null
@@ -1,3 +0,0 @@
-ad492935e361f830f2f8302aa102701d *./tests/data/lavf/lavf.ul
-44100 ./tests/data/lavf/lavf.ul
-./tests/data/lavf/lavf.ul CRC=0x4515fa26
diff --git a/tests/ref/lavf/mxf b/tests/ref/lavf/mxf
index 4466685..5b16496 100644
--- a/tests/ref/lavf/mxf
+++ b/tests/ref/lavf/mxf
@@ -1,9 +1,9 @@
-649009e3d3d62eb3b6c56334d057cc4d *./tests/data/lavf/lavf.mxf
-526393 ./tests/data/lavf/lavf.mxf
-./tests/data/lavf/lavf.mxf CRC=0x8dddfaab
-9076b7015cffe8aa72883e900a2041a5 *./tests/data/lavf/lavf.mxf
-561721 ./tests/data/lavf/lavf.mxf
-./tests/data/lavf/lavf.mxf CRC=0x96ff1b48
-02bf8f0cd8951a49e277306691cb1538 *./tests/data/lavf/lavf.mxf
-526393 ./tests/data/lavf/lavf.mxf
-./tests/data/lavf/lavf.mxf CRC=0x8dddfaab
+27b98795036b334e100c15c7e06d948f *tests/data/lavf/lavf.mxf
+526393 tests/data/lavf/lavf.mxf
+tests/data/lavf/lavf.mxf CRC=0x8dddfaab
+783b475a818602f54e947094d57e2981 *tests/data/lavf/lavf.mxf
+561721 tests/data/lavf/lavf.mxf
+tests/data/lavf/lavf.mxf CRC=0x96ff1b48
+02bf8f0cd8951a49e277306691cb1538 *tests/data/lavf/lavf.mxf
+526393 tests/data/lavf/lavf.mxf
+tests/data/lavf/lavf.mxf CRC=0x8dddfaab
diff --git a/tests/ref/lavf/mxf_d10 b/tests/ref/lavf/mxf_d10
index 856fe9c..aea469b 100644
--- a/tests/ref/lavf/mxf_d10
+++ b/tests/ref/lavf/mxf_d10
@@ -1,3 +1,3 @@
-e597f73ef9c9819710d2f815813eb91f *./tests/data/lavf/lavf.mxf_d10
-5332013 ./tests/data/lavf/lavf.mxf_d10
-./tests/data/lavf/lavf.mxf_d10 CRC=0x6c74d488
+e597f73ef9c9819710d2f815813eb91f *tests/data/lavf/lavf.mxf_d10
+5332013 tests/data/lavf/lavf.mxf_d10
+tests/data/lavf/lavf.mxf_d10 CRC=0x6c74d488
diff --git a/tests/ref/lavf/mxf_dv25 b/tests/ref/lavf/mxf_dv25
index e94b3ca..db6b76c 100644
--- a/tests/ref/lavf/mxf_dv25
+++ b/tests/ref/lavf/mxf_dv25
@@ -1,3 +1,3 @@
-0fc964fa22bc8b3a389b81b9a2efccb3 *./tests/data/lavf/lavf.mxf_dv25
-3834413 ./tests/data/lavf/lavf.mxf_dv25
-./tests/data/lavf/lavf.mxf_dv25 CRC=0xbdaf7f52
+0fc964fa22bc8b3a389b81b9a2efccb3 *tests/data/lavf/lavf.mxf_dv25
+3834413 tests/data/lavf/lavf.mxf_dv25
+tests/data/lavf/lavf.mxf_dv25 CRC=0xbdaf7f52
diff --git a/tests/ref/lavf/mxf_dvcpro50 b/tests/ref/lavf/mxf_dvcpro50
index 514a047..0999991 100644
--- a/tests/ref/lavf/mxf_dvcpro50
+++ b/tests/ref/lavf/mxf_dvcpro50
@@ -1,3 +1,3 @@
-aa81ea83af44a69e73849e327cc4bd12 *./tests/data/lavf/lavf.mxf_dvcpro50
-7431213 ./tests/data/lavf/lavf.mxf_dvcpro50
-./tests/data/lavf/lavf.mxf_dvcpro50 CRC=0xe3bbe4b4
+aa81ea83af44a69e73849e327cc4bd12 *tests/data/lavf/lavf.mxf_dvcpro50
+7431213 tests/data/lavf/lavf.mxf_dvcpro50
+tests/data/lavf/lavf.mxf_dvcpro50 CRC=0xe3bbe4b4
diff --git a/tests/ref/lavf/mxf_opatom b/tests/ref/lavf/mxf_opatom
index cc4eb51..05794a4 100644
--- a/tests/ref/lavf/mxf_opatom
+++ b/tests/ref/lavf/mxf_opatom
@@ -1,3 +1,3 @@
-06a1816aa91c733e1ef7e45d82e4f1d3 *./tests/data/lavf/lavf.mxf_opatom
-4717625 ./tests/data/lavf/lavf.mxf_opatom
-./tests/data/lavf/lavf.mxf_opatom CRC=0xf55aa22a
+06a1816aa91c733e1ef7e45d82e4f1d3 *tests/data/lavf/lavf.mxf_opatom
+4717625 tests/data/lavf/lavf.mxf_opatom
+tests/data/lavf/lavf.mxf_opatom CRC=0xf55aa22a
diff --git a/tests/ref/lavf/mxf_opatom_audio b/tests/ref/lavf/mxf_opatom_audio
index 4859645..2b9306f 100644
--- a/tests/ref/lavf/mxf_opatom_audio
+++ b/tests/ref/lavf/mxf_opatom_audio
@@ -1,3 +1,3 @@
-c45bb140605339556a77e751fda2c449 *./tests/data/lavf/lavf.mxf_opatom_audio
-102969 ./tests/data/lavf/lavf.mxf_opatom_audio
-./tests/data/lavf/lavf.mxf_opatom_audio CRC=0xd155c6ff
+c45bb140605339556a77e751fda2c449 *tests/data/lavf/lavf.mxf_opatom_audio
+102969 tests/data/lavf/lavf.mxf_opatom_audio
+tests/data/lavf/lavf.mxf_opatom_audio CRC=0xd155c6ff
diff --git a/tests/ref/lavf/nut b/tests/ref/lavf/nut
index 1c3d710..1ba91df 100644
--- a/tests/ref/lavf/nut
+++ b/tests/ref/lavf/nut
@@ -1,3 +1,3 @@
-424e8037d7b6f3d3c09cf76bf06a63cb *./tests/data/lavf/lavf.nut
-319958 ./tests/data/lavf/lavf.nut
-./tests/data/lavf/lavf.nut CRC=0xec6c3c68
+424e8037d7b6f3d3c09cf76bf06a63cb *tests/data/lavf/lavf.nut
+319958 tests/data/lavf/lavf.nut
+tests/data/lavf/lavf.nut CRC=0xec6c3c68
diff --git a/tests/ref/lavf/ogg b/tests/ref/lavf/ogg
index a08fb5e..3ac10e6 100644
--- a/tests/ref/lavf/ogg
+++ b/tests/ref/lavf/ogg
@@ -1,3 +1,3 @@
-81b9366cacb23644c2803585dced9996 *./tests/data/lavf/lavf.ogg
-13516 ./tests/data/lavf/lavf.ogg
-./tests/data/lavf/lavf.ogg CRC=0x3a1da17e
+81b9366cacb23644c2803585dced9996 *tests/data/lavf/lavf.ogg
+13516 tests/data/lavf/lavf.ogg
+tests/data/lavf/lavf.ogg CRC=0x3a1da17e
diff --git a/tests/ref/lavf/pam b/tests/ref/lavf/pam
index 97893f6..8ac3f2b 100644
--- a/tests/ref/lavf/pam
+++ b/tests/ref/lavf/pam
@@ -1,18 +1,3 @@
-0dce5565222cf0f8b309467f279aecd2 *./tests/data/images/pam/02.pam
-./tests/data/images/pam/%02d.pam CRC=0x6da01946
-304191 ./tests/data/images/pam/02.pam
-2ed31ca8d8de560afb3e0fd7a873cde5 *./tests/data/images/pam/02.pam
-./tests/data/images/pam/%02d.pam CRC=0xf07d29cd
-405573 ./tests/data/images/pam/02.pam
-35cb9e42b2d3181be494f8693af1ddea *./tests/data/images/pam/02.pam
-./tests/data/images/pam/%02d.pam CRC=0x0ff205be
-101445 ./tests/data/images/pam/02.pam
-740eb42157af9e9eed46b70ba6a6cf4d *./tests/data/images/pam/02.pam
-./tests/data/images/pam/%02d.pam CRC=0x893f10ef
-202823 ./tests/data/images/pam/02.pam
-032538f0313b4f240b44a5bef115f5bf *./tests/data/images/pam/02.pam
-./tests/data/images/pam/%02d.pam CRC=0x5984c023
-608321 ./tests/data/images/pam/02.pam
-d2f5eb2f959ca3a90c02f1887b6e0c4f *./tests/data/images/pam/02.pam
-./tests/data/images/pam/%02d.pam CRC=0xab19200d
-101447 ./tests/data/images/pam/02.pam
+0dce5565222cf0f8b309467f279aecd2 *tests/data/images/pam/02.pam
+tests/data/images/pam/%02d.pam CRC=0x6da01946
+304191 tests/data/images/pam/02.pam
diff --git a/tests/ref/lavf/pbmpipe b/tests/ref/lavf/pbmpipe
index 284f90b..5cfb9b5 100644
--- a/tests/ref/lavf/pbmpipe
+++ b/tests/ref/lavf/pbmpipe
@@ -1,3 +1,3 @@
-8b974da7f48f9e6d5ae327b4444a71fb *./tests/data/lavf/pbmpipe.pbm
-317075 ./tests/data/lavf/pbmpipe.pbm
-./tests/data/lavf/pbmpipe.pbm CRC=0xfc010c66
+8b974da7f48f9e6d5ae327b4444a71fb *tests/data/lavf/pbmpipe.pbm
+317075 tests/data/lavf/pbmpipe.pbm
+tests/data/lavf/pbmpipe.pbm CRC=0xfc010c66
diff --git a/tests/ref/lavf/pcx b/tests/ref/lavf/pcx
index 6568b60..2767ccf 100644
--- a/tests/ref/lavf/pcx
+++ b/tests/ref/lavf/pcx
@@ -1,3 +1,3 @@
-c4faf65ecc812ec8412cc26140c13bd5 *./tests/data/images/pcx/02.pcx
-./tests/data/images/pcx/%02d.pcx CRC=0x6da01946
-364147 ./tests/data/images/pcx/02.pcx
+c4faf65ecc812ec8412cc26140c13bd5 *tests/data/images/pcx/02.pcx
+tests/data/images/pcx/%02d.pcx CRC=0x6da01946
+364147 tests/data/images/pcx/02.pcx
diff --git a/tests/ref/lavf/peak.wav b/tests/ref/lavf/peak.wav
new file mode 100644
index 0000000..573d532
--- /dev/null
+++ b/tests/ref/lavf/peak.wav
@@ -0,0 +1,3 @@
+105805963fb767d00da056f42f32d9f3 *tests/data/lavf/lavf.peak.wav
+89094 tests/data/lavf/lavf.peak.wav
+tests/data/lavf/lavf.peak.wav CRC=0x3a1da17e
diff --git a/tests/ref/lavf/peak_only.wav b/tests/ref/lavf/peak_only.wav
new file mode 100644
index 0000000..c468731
--- /dev/null
+++ b/tests/ref/lavf/peak_only.wav
@@ -0,0 +1,3 @@
+f1a8aeeae8069f3992c4d780436c3d23 *tests/data/lavf/lavf.peak_only.wav
+832 tests/data/lavf/lavf.peak_only.wav
+tests/data/lavf/lavf.peak_only.wav
diff --git a/tests/ref/lavf/pgm b/tests/ref/lavf/pgm
index 816579f..4100ac9 100644
--- a/tests/ref/lavf/pgm
+++ b/tests/ref/lavf/pgm
@@ -1,3 +1,3 @@
-cc777c5fc4d116d4c5a996eac8d3133e *./tests/data/images/pgm/02.pgm
-./tests/data/images/pgm/%02d.pgm CRC=0x0ff205be
-101391 ./tests/data/images/pgm/02.pgm
+cc777c5fc4d116d4c5a996eac8d3133e *tests/data/images/pgm/02.pgm
+tests/data/images/pgm/%02d.pgm CRC=0x0ff205be
+101391 tests/data/images/pgm/02.pgm
diff --git a/tests/ref/lavf/pgmpipe b/tests/ref/lavf/pgmpipe
index da6f9a6..1077a95 100644
--- a/tests/ref/lavf/pgmpipe
+++ b/tests/ref/lavf/pgmpipe
@@ -1,3 +1,3 @@
-c34e37ea49237c2d1ea81a5944328e59 *./tests/data/lavf/pgmpipe.pgm
-2534775 ./tests/data/lavf/pgmpipe.pgm
-./tests/data/lavf/pgmpipe.pgm CRC=0x7aa0122f
+c34e37ea49237c2d1ea81a5944328e59 *tests/data/lavf/pgmpipe.pgm
+2534775 tests/data/lavf/pgmpipe.pgm
+tests/data/lavf/pgmpipe.pgm CRC=0x7aa0122f
diff --git a/tests/ref/lavf/pixfmt b/tests/ref/lavf/pixfmt
deleted file mode 100644
index ec75d4c..0000000
--- a/tests/ref/lavf/pixfmt
+++ /dev/null
@@ -1,38 +0,0 @@
-5641dba168ff665af1cdb4a91e1afdd6 *./tests/data/pixfmt/yuv420p.yuv
-304128 ./tests/data/pixfmt/yuv420p.yuv
-ac68f9fdd9d55efd0306d9b004038761 *./tests/data/pixfmt/yuv422p.yuv
-304128 ./tests/data/pixfmt/yuv422p.yuv
-5641dba168ff665af1cdb4a91e1afdd6 *./tests/data/pixfmt/yuv444p.yuv
-304128 ./tests/data/pixfmt/yuv444p.yuv
-ac68f9fdd9d55efd0306d9b004038761 *./tests/data/pixfmt/yuyv422.yuv
-304128 ./tests/data/pixfmt/yuyv422.yuv
-507c7e9f0c97660385df977469ca9e6d *./tests/data/pixfmt/yuv410p.yuv
-304128 ./tests/data/pixfmt/yuv410p.yuv
-8594ea0b8d7c2c964525b0801b5351de *./tests/data/pixfmt/yuv411p.yuv
-304128 ./tests/data/pixfmt/yuv411p.yuv
-e176bd14185788110e055f945de7f95f *./tests/data/pixfmt/yuvj420p.yuv
-304128 ./tests/data/pixfmt/yuvj420p.yuv
-472028e46a81c98d9b2477507def4723 *./tests/data/pixfmt/yuvj422p.yuv
-304128 ./tests/data/pixfmt/yuvj422p.yuv
-c10442da177c9f1d12be3c53be6fa12c *./tests/data/pixfmt/yuvj444p.yuv
-304128 ./tests/data/pixfmt/yuvj444p.yuv
-6bb61113e7b70eb09dbcec356122a0e2 *./tests/data/pixfmt/rgb24.yuv
-304128 ./tests/data/pixfmt/rgb24.yuv
-6bb61113e7b70eb09dbcec356122a0e2 *./tests/data/pixfmt/bgr24.yuv
-304128 ./tests/data/pixfmt/bgr24.yuv
-6bb61113e7b70eb09dbcec356122a0e2 *./tests/data/pixfmt/rgb32.yuv
-304128 ./tests/data/pixfmt/rgb32.yuv
-efa7c0337cc00c796c6df615223716f1 *./tests/data/pixfmt/rgb565.yuv
-304128 ./tests/data/pixfmt/rgb565.yuv
-0df2a477af1415a1b8fbf2a3e552bc39 *./tests/data/pixfmt/rgb555.yuv
-304128 ./tests/data/pixfmt/rgb555.yuv
-1e080c12bd9755c41ecb8e19b756f406 *./tests/data/pixfmt/gray.yuv
-304128 ./tests/data/pixfmt/gray.yuv
-d87cf0c2e7a13cc693fe6ece22461c83 *./tests/data/pixfmt/monow.yuv
-304128 ./tests/data/pixfmt/monow.yuv
-d87cf0c2e7a13cc693fe6ece22461c83 *./tests/data/pixfmt/monob.yuv
-304128 ./tests/data/pixfmt/monob.yuv
-00b85790df5740bab95e2559d81603a7 *./tests/data/pixfmt/yuv440p.yuv
-304128 ./tests/data/pixfmt/yuv440p.yuv
-4d8d402c45d913038d4b725396719111 *./tests/data/pixfmt/yuvj440p.yuv
-304128 ./tests/data/pixfmt/yuvj440p.yuv
diff --git a/tests/ref/lavf/png b/tests/ref/lavf/png
index 9cf677b..165513e 100644
--- a/tests/ref/lavf/png
+++ b/tests/ref/lavf/png
@@ -1,9 +1,3 @@
-2af72da4468e61a37c220b25cb28618a *./tests/data/images/png/02.png
-./tests/data/images/png/%02d.png CRC=0x6da01946
-248633 ./tests/data/images/png/02.png
-6cf54c13aa407b77547cf6dfe23ecba3 *./tests/data/images/png/02.png
-./tests/data/images/png/%02d.png CRC=0x893f10ef
-47365 ./tests/data/images/png/02.png
-b4e38244c97debe3f528e7d1adb283ef *./tests/data/images/png/02.png
-./tests/data/images/png/%02d.png CRC=0x5984c023
-511900 ./tests/data/images/png/02.png
+2af72da4468e61a37c220b25cb28618a *tests/data/images/png/02.png
+tests/data/images/png/%02d.png CRC=0x6da01946
+248633 tests/data/images/png/02.png
diff --git a/tests/ref/lavf/ppm b/tests/ref/lavf/ppm
index 97093aa..04377f1 100644
--- a/tests/ref/lavf/ppm
+++ b/tests/ref/lavf/ppm
@@ -1,3 +1,3 @@
-16d5dadf0b362fc8ba3cb676c5dde985 *./tests/data/images/ppm/02.ppm
-./tests/data/images/ppm/%02d.ppm CRC=0x6da01946
-304143 ./tests/data/images/ppm/02.ppm
+16d5dadf0b362fc8ba3cb676c5dde985 *tests/data/images/ppm/02.ppm
+tests/data/images/ppm/%02d.ppm CRC=0x6da01946
+304143 tests/data/images/ppm/02.ppm
diff --git a/tests/ref/lavf/ppmpipe b/tests/ref/lavf/ppmpipe
index b703e16..a50dbb0 100644
--- a/tests/ref/lavf/ppmpipe
+++ b/tests/ref/lavf/ppmpipe
@@ -1,3 +1,3 @@
-74f1f6651ad8f192a7b4c11c2b6c71e5 *./tests/data/lavf/ppmpipe.ppm
-7603575 ./tests/data/lavf/ppmpipe.ppm
-./tests/data/lavf/ppmpipe.ppm CRC=0x87b3c15f
+74f1f6651ad8f192a7b4c11c2b6c71e5 *tests/data/lavf/ppmpipe.ppm
+7603575 tests/data/lavf/ppmpipe.ppm
+tests/data/lavf/ppmpipe.ppm CRC=0x87b3c15f
diff --git a/tests/ref/lavf/rgb48be.pam b/tests/ref/lavf/rgb48be.pam
new file mode 100644
index 0000000..13e5f77
--- /dev/null
+++ b/tests/ref/lavf/rgb48be.pam
@@ -0,0 +1,3 @@
+032538f0313b4f240b44a5bef115f5bf *tests/data/images/rgb48be.pam/02.rgb48be.pam
+tests/data/images/rgb48be.pam/%02d.rgb48be.pam CRC=0x5984c023
+608321 tests/data/images/rgb48be.pam/02.rgb48be.pam
diff --git a/tests/ref/lavf/rgb48be.png b/tests/ref/lavf/rgb48be.png
new file mode 100644
index 0000000..84f4d46
--- /dev/null
+++ b/tests/ref/lavf/rgb48be.png
@@ -0,0 +1,3 @@
+b4e38244c97debe3f528e7d1adb283ef *tests/data/images/rgb48be.png/02.rgb48be.png
+tests/data/images/rgb48be.png/%02d.rgb48be.png CRC=0x5984c023
+511900 tests/data/images/rgb48be.png/02.rgb48be.png
diff --git a/tests/ref/lavf/rgb48le.dpx b/tests/ref/lavf/rgb48le.dpx
new file mode 100644
index 0000000..0731538
--- /dev/null
+++ b/tests/ref/lavf/rgb48le.dpx
@@ -0,0 +1,3 @@
+075963c3c08978b6a20555ba09161434 *tests/data/images/rgb48le.dpx/02.rgb48le.dpx
+tests/data/images/rgb48le.dpx/%02d.rgb48le.dpx CRC=0xe5b9c023
+609920 tests/data/images/rgb48le.dpx/02.rgb48le.dpx
diff --git a/tests/ref/lavf/rgb48le_10.dpx b/tests/ref/lavf/rgb48le_10.dpx
new file mode 100644
index 0000000..ce36e50
--- /dev/null
+++ b/tests/ref/lavf/rgb48le_10.dpx
@@ -0,0 +1,3 @@
+b9f22728f8ff393bf30cf6cbd624fa95 *tests/data/images/rgb48le_10.dpx/02.rgb48le_10.dpx
+tests/data/images/rgb48le_10.dpx/%02d.rgb48le_10.dpx CRC=0xf38d5830
+407168 tests/data/images/rgb48le_10.dpx/02.rgb48le_10.dpx
diff --git a/tests/ref/lavf/rgb4_byte.xwd b/tests/ref/lavf/rgb4_byte.xwd
new file mode 100644
index 0000000..fee4cf7
--- /dev/null
+++ b/tests/ref/lavf/rgb4_byte.xwd
@@ -0,0 +1,3 @@
+fe1af954966a40c2cd35fc27094ff823 *tests/data/images/rgb4_byte.xwd/02.rgb4_byte.xwd
+tests/data/images/rgb4_byte.xwd/%02d.rgb4_byte.xwd CRC=0xce042dcc
+104559 tests/data/images/rgb4_byte.xwd/02.rgb4_byte.xwd
diff --git a/tests/ref/lavf/rgb555be.xwd b/tests/ref/lavf/rgb555be.xwd
new file mode 100644
index 0000000..1f9c579
--- /dev/null
+++ b/tests/ref/lavf/rgb555be.xwd
@@ -0,0 +1,3 @@
+1300938325d5ac12caa09a43bd58f37c *tests/data/images/rgb555be.xwd/02.rgb555be.xwd
+tests/data/images/rgb555be.xwd/%02d.rgb555be.xwd CRC=0x14555d6e
+202863 tests/data/images/rgb555be.xwd/02.rgb555be.xwd
diff --git a/tests/ref/lavf/rgb565be.xwd b/tests/ref/lavf/rgb565be.xwd
new file mode 100644
index 0000000..02a5bc2
--- /dev/null
+++ b/tests/ref/lavf/rgb565be.xwd
@@ -0,0 +1,3 @@
+c0866e9e710fce735423594a93bee604 *tests/data/images/rgb565be.xwd/02.rgb565be.xwd
+tests/data/images/rgb565be.xwd/%02d.rgb565be.xwd CRC=0x53209216
+202863 tests/data/images/rgb565be.xwd/02.rgb565be.xwd
diff --git a/tests/ref/lavf/rgb8.xwd b/tests/ref/lavf/rgb8.xwd
new file mode 100644
index 0000000..52f4e3e
--- /dev/null
+++ b/tests/ref/lavf/rgb8.xwd
@@ -0,0 +1,3 @@
+c6f3cb7c45f7238474a89d2ad61a1caf *tests/data/images/rgb8.xwd/02.rgb8.xwd
+tests/data/images/rgb8.xwd/%02d.rgb8.xwd CRC=0xf217a95e
+104559 tests/data/images/rgb8.xwd/02.rgb8.xwd
diff --git a/tests/ref/lavf/rgba.pam b/tests/ref/lavf/rgba.pam
new file mode 100644
index 0000000..56e43a4
--- /dev/null
+++ b/tests/ref/lavf/rgba.pam
@@ -0,0 +1,3 @@
+2ed31ca8d8de560afb3e0fd7a873cde5 *tests/data/images/rgba.pam/02.rgba.pam
+tests/data/images/rgba.pam/%02d.rgba.pam CRC=0xf07d29cd
+405573 tests/data/images/rgba.pam/02.rgba.pam
diff --git a/tests/ref/lavf/rgba.xwd b/tests/ref/lavf/rgba.xwd
new file mode 100644
index 0000000..95aafdc
--- /dev/null
+++ b/tests/ref/lavf/rgba.xwd
@@ -0,0 +1,3 @@
+1cdb43599c956dc8563f1e09fac5df00 *tests/data/images/rgba.xwd/02.rgba.xwd
+tests/data/images/rgba.xwd/%02d.rgba.xwd CRC=0xf07d29cd
+405615 tests/data/images/rgba.xwd/02.rgba.xwd
diff --git a/tests/ref/lavf/rgba64le.dpx b/tests/ref/lavf/rgba64le.dpx
new file mode 100644
index 0000000..b4092c9
--- /dev/null
+++ b/tests/ref/lavf/rgba64le.dpx
@@ -0,0 +1,3 @@
+545603630f30dec2768c8ae8d12eb8ea *tests/data/images/rgba64le.dpx/02.rgba64le.dpx
+tests/data/images/rgba64le.dpx/%02d.rgba64le.dpx CRC=0xe72ce131
+812672 tests/data/images/rgba64le.dpx/02.rgba64le.dpx
diff --git a/tests/ref/lavf/rm b/tests/ref/lavf/rm
index 62e0a31..43ea4c7 100644
--- a/tests/ref/lavf/rm
+++ b/tests/ref/lavf/rm
@@ -1,2 +1,2 @@
-e30681d05d6f3d24108d3614600bf116 *./tests/data/lavf/lavf.rm
-346424 ./tests/data/lavf/lavf.rm
+e30681d05d6f3d24108d3614600bf116 *tests/data/lavf/lavf.rm
+346424 tests/data/lavf/lavf.rm
diff --git a/tests/ref/lavf/rso b/tests/ref/lavf/rso
index 5878f43..6b2f03e 100644
--- a/tests/ref/lavf/rso
+++ b/tests/ref/lavf/rso
@@ -1,3 +1,3 @@
-443b72346065d6318ca18c8395aa1d87 *./tests/data/lavf/lavf.rso
-44108 ./tests/data/lavf/lavf.rso
-./tests/data/lavf/lavf.rso CRC=0x298fd284
+443b72346065d6318ca18c8395aa1d87 *tests/data/lavf/lavf.rso
+44108 tests/data/lavf/lavf.rso
+tests/data/lavf/lavf.rso CRC=0x298fd284
diff --git a/tests/ref/lavf/s16.voc b/tests/ref/lavf/s16.voc
new file mode 100644
index 0000000..9b17a4c
--- /dev/null
+++ b/tests/ref/lavf/s16.voc
@@ -0,0 +1,3 @@
+db9fa22ff71992bd8b6cc80047223c92 *tests/data/lavf/lavf.s16.voc
+176615 tests/data/lavf/lavf.s16.voc
+tests/data/lavf/lavf.s16.voc CRC=0xe61e3bd0
diff --git a/tests/ref/lavf/sgi b/tests/ref/lavf/sgi
index 6f45802..5049278 100644
--- a/tests/ref/lavf/sgi
+++ b/tests/ref/lavf/sgi
@@ -1,3 +1,3 @@
-d446e540a7c18da5fd3cc0e9942cd46f *./tests/data/images/sgi/02.sgi
-./tests/data/images/sgi/%02d.sgi CRC=0x6da01946
-307287 ./tests/data/images/sgi/02.sgi
+d446e540a7c18da5fd3cc0e9942cd46f *tests/data/images/sgi/02.sgi
+tests/data/images/sgi/%02d.sgi CRC=0x6da01946
+307287 tests/data/images/sgi/02.sgi
diff --git a/tests/ref/lavf/smjpeg b/tests/ref/lavf/smjpeg
index fb8c654..537c084 100644
--- a/tests/ref/lavf/smjpeg
+++ b/tests/ref/lavf/smjpeg
@@ -1,3 +1,3 @@
-3fe90213ac4f5275eb85ad0a4e4bdb44 *./tests/data/lavf/lavf.smjpeg
-728642 ./tests/data/lavf/lavf.smjpeg
-./tests/data/lavf/lavf.smjpeg CRC=0x54bf6147
+3fe90213ac4f5275eb85ad0a4e4bdb44 *tests/data/lavf/lavf.smjpeg
+728642 tests/data/lavf/lavf.smjpeg
+tests/data/lavf/lavf.smjpeg CRC=0x54bf6147
diff --git a/tests/ref/lavf/sox b/tests/ref/lavf/sox
index fc368b1..fc3953e 100644
--- a/tests/ref/lavf/sox
+++ b/tests/ref/lavf/sox
@@ -1,3 +1,3 @@
-683635d5cb1344e44fa96df90c3a993c *./tests/data/lavf/lavf.sox
-176432 ./tests/data/lavf/lavf.sox
-./tests/data/lavf/lavf.sox CRC=0x3a1da17e
+683635d5cb1344e44fa96df90c3a993c *tests/data/lavf/lavf.sox
+176432 tests/data/lavf/lavf.sox
+tests/data/lavf/lavf.sox CRC=0x3a1da17e
diff --git a/tests/ref/lavf/sun b/tests/ref/lavf/sun
new file mode 100644
index 0000000..5dc0011
--- /dev/null
+++ b/tests/ref/lavf/sun
@@ -0,0 +1,3 @@
+07518bcb0841bc677ce6aea8464ea240 *tests/data/images/sun/02.sun
+tests/data/images/sun/%02d.sun CRC=0xe6c71946
+304123 tests/data/images/sun/02.sun
diff --git a/tests/ref/lavf/sunrast b/tests/ref/lavf/sunrast
deleted file mode 100644
index 4db0505..0000000
--- a/tests/ref/lavf/sunrast
+++ /dev/null
@@ -1,3 +0,0 @@
-07518bcb0841bc677ce6aea8464ea240 *./tests/data/images/sun/02.sun
-./tests/data/images/sun/%02d.sun CRC=0xe6c71946
-304123 ./tests/data/images/sun/02.sun
diff --git a/tests/ref/lavf/swf b/tests/ref/lavf/swf
index 7ce0fa4..b4e5bb9 100644
--- a/tests/ref/lavf/swf
+++ b/tests/ref/lavf/swf
@@ -1,3 +1,3 @@
-11e9e9bf99a0ae6a0ba5434b745eae21 *./tests/data/lavf/lavf.swf
-329474 ./tests/data/lavf/lavf.swf
-./tests/data/lavf/lavf.swf CRC=0x4eac88c5
+11e9e9bf99a0ae6a0ba5434b745eae21 *tests/data/lavf/lavf.swf
+329474 tests/data/lavf/lavf.swf
+tests/data/lavf/lavf.swf CRC=0x4eac88c5
diff --git a/tests/ref/lavf/tga b/tests/ref/lavf/tga
index 7efaf97..c7e33b0 100644
--- a/tests/ref/lavf/tga
+++ b/tests/ref/lavf/tga
@@ -1,3 +1,3 @@
-c0305c53e6d79d4ed9f35f04f671246c *./tests/data/images/tga/02.tga
-./tests/data/images/tga/%02d.tga CRC=0xe6c71946
-304172 ./tests/data/images/tga/02.tga
+c0305c53e6d79d4ed9f35f04f671246c *tests/data/images/tga/02.tga
+tests/data/images/tga/%02d.tga CRC=0xe6c71946
+304172 tests/data/images/tga/02.tga
diff --git a/tests/ref/lavf/tiff b/tests/ref/lavf/tiff
index 4b0b985..c708642 100644
--- a/tests/ref/lavf/tiff
+++ b/tests/ref/lavf/tiff
@@ -1,3 +1,3 @@
-b3299346a8959553a437e486d8f3bf76 *./tests/data/images/tiff/02.tiff
-./tests/data/images/tiff/%02d.tiff CRC=0x6da01946
-307131 ./tests/data/images/tiff/02.tiff
+b3299346a8959553a437e486d8f3bf76 *tests/data/images/tiff/02.tiff
+tests/data/images/tiff/%02d.tiff CRC=0x6da01946
+307131 tests/data/images/tiff/02.tiff
diff --git a/tests/ref/lavf/ts b/tests/ref/lavf/ts
index 2be3526..b004fc1 100644
--- a/tests/ref/lavf/ts
+++ b/tests/ref/lavf/ts
@@ -1,3 +1,3 @@
-38f4b14d43a0e416be8d598628997cbc *./tests/data/lavf/lavf.ts
-407020 ./tests/data/lavf/lavf.ts
-./tests/data/lavf/lavf.ts CRC=0x71287e25
+371dc016eb3155116bea27e3b4eeb928 *tests/data/lavf/lavf.ts
+389160 tests/data/lavf/lavf.ts
+tests/data/lavf/lavf.ts CRC=0x71287e25
diff --git a/tests/ref/lavf/tta b/tests/ref/lavf/tta
index d86d097..f6fe9d8 100644
--- a/tests/ref/lavf/tta
+++ b/tests/ref/lavf/tta
@@ -1,3 +1,3 @@
-d86c5cccb2554143d34d1786ab460a31 *./tests/data/lavf/lavf.tta
-43200 ./tests/data/lavf/lavf.tta
-./tests/data/lavf/lavf.tta CRC=0x3a1da17e
+d86c5cccb2554143d34d1786ab460a31 *tests/data/lavf/lavf.tta
+43200 tests/data/lavf/lavf.tta
+tests/data/lavf/lavf.tta CRC=0x3a1da17e
diff --git a/tests/ref/lavf/ul b/tests/ref/lavf/ul
new file mode 100644
index 0000000..cf02593
--- /dev/null
+++ b/tests/ref/lavf/ul
@@ -0,0 +1,3 @@
+ad492935e361f830f2f8302aa102701d *tests/data/lavf/lavf.ul
+44100 tests/data/lavf/lavf.ul
+tests/data/lavf/lavf.ul CRC=0x4515fa26
diff --git a/tests/ref/lavf/voc b/tests/ref/lavf/voc
index ded8af7..0ac933e 100644
--- a/tests/ref/lavf/voc
+++ b/tests/ref/lavf/voc
@@ -1,3 +1,3 @@
-bb5ad96a5e1b35683d50bf18115db821 *./tests/data/lavf/lavf.voc
-44305 ./tests/data/lavf/lavf.voc
-./tests/data/lavf/lavf.voc CRC=0x298fd284
+bb5ad96a5e1b35683d50bf18115db821 *tests/data/lavf/lavf.voc
+44305 tests/data/lavf/lavf.voc
+tests/data/lavf/lavf.voc CRC=0x298fd284
diff --git a/tests/ref/lavf/voc_s16 b/tests/ref/lavf/voc_s16
deleted file mode 100644
index d026090..0000000
--- a/tests/ref/lavf/voc_s16
+++ /dev/null
@@ -1,3 +0,0 @@
-db9fa22ff71992bd8b6cc80047223c92 *./tests/data/lavf/lavf.s16.voc
-176615 ./tests/data/lavf/lavf.s16.voc
-./tests/data/lavf/lavf.s16.voc CRC=0xe61e3bd0
diff --git a/tests/ref/lavf/w64 b/tests/ref/lavf/w64
index 26c6868..2b6bc23 100644
--- a/tests/ref/lavf/w64
+++ b/tests/ref/lavf/w64
@@ -1,3 +1,3 @@
-82c75c9cb61924fda68d9602ea69c445 *./tests/data/lavf/lavf.w64
-88304 ./tests/data/lavf/lavf.w64
-./tests/data/lavf/lavf.w64 CRC=0x3a1da17e
+82c75c9cb61924fda68d9602ea69c445 *tests/data/lavf/lavf.w64
+88304 tests/data/lavf/lavf.w64
+tests/data/lavf/lavf.w64 CRC=0x3a1da17e
diff --git a/tests/ref/lavf/wav b/tests/ref/lavf/wav
index da3bfc2..0540eab 100644
--- a/tests/ref/lavf/wav
+++ b/tests/ref/lavf/wav
@@ -1,3 +1,3 @@
-fc958a32b4fca7b1c40cbdaef2d1416e *./tests/data/lavf/lavf.wav
-88274 ./tests/data/lavf/lavf.wav
-./tests/data/lavf/lavf.wav CRC=0x3a1da17e
+fc958a32b4fca7b1c40cbdaef2d1416e *tests/data/lavf/lavf.wav
+88274 tests/data/lavf/lavf.wav
+tests/data/lavf/lavf.wav CRC=0x3a1da17e
diff --git a/tests/ref/lavf/wav_peak b/tests/ref/lavf/wav_peak
deleted file mode 100644
index 861b246..0000000
--- a/tests/ref/lavf/wav_peak
+++ /dev/null
@@ -1,3 +0,0 @@
-105805963fb767d00da056f42f32d9f3 *./tests/data/lavf/lavf.peak.wav
-89094 ./tests/data/lavf/lavf.peak.wav
-./tests/data/lavf/lavf.peak.wav CRC=0x3a1da17e
diff --git a/tests/ref/lavf/wav_peak_only b/tests/ref/lavf/wav_peak_only
deleted file mode 100644
index b203d03..0000000
--- a/tests/ref/lavf/wav_peak_only
+++ /dev/null
@@ -1,2 +0,0 @@
-f1a8aeeae8069f3992c4d780436c3d23 *./tests/data/lavf/lavf.peak_only.wav
-832 ./tests/data/lavf/lavf.peak_only.wav
diff --git a/tests/ref/lavf/wtv b/tests/ref/lavf/wtv
index 11c04c5..8f99181 100644
--- a/tests/ref/lavf/wtv
+++ b/tests/ref/lavf/wtv
@@ -1,3 +1,3 @@
-c5328b1c3e5fe70468c3f587c34ffd82 *./tests/data/lavf/lavf.wtv
-413696 ./tests/data/lavf/lavf.wtv
-./tests/data/lavf/lavf.wtv CRC=0x71287e25
+c5328b1c3e5fe70468c3f587c34ffd82 *tests/data/lavf/lavf.wtv
+413696 tests/data/lavf/lavf.wtv
+tests/data/lavf/lavf.wtv CRC=0x71287e25
diff --git a/tests/ref/lavf/wv b/tests/ref/lavf/wv
index 323c5df..0720509 100644
--- a/tests/ref/lavf/wv
+++ b/tests/ref/lavf/wv
@@ -1,3 +1,3 @@
-47d9a381d9c3f99b8b059f3b17f1dc11 *./tests/data/lavf/lavf.wv
-59560 ./tests/data/lavf/lavf.wv
-./tests/data/lavf/lavf.wv CRC=0x3a1da17e
+47d9a381d9c3f99b8b059f3b17f1dc11 *tests/data/lavf/lavf.wv
+59560 tests/data/lavf/lavf.wv
+tests/data/lavf/lavf.wv CRC=0x3a1da17e
diff --git a/tests/ref/lavf/xbm b/tests/ref/lavf/xbm
index 705713b..bc15783 100644
--- a/tests/ref/lavf/xbm
+++ b/tests/ref/lavf/xbm
@@ -1,3 +1,3 @@
-0629055fd82366317c651a0af4bb82d7 *./tests/data/images/xbm/02.xbm
-./tests/data/images/xbm/%02d.xbm CRC=0xc9a20204
-76411 ./tests/data/images/xbm/02.xbm
+0629055fd82366317c651a0af4bb82d7 *tests/data/images/xbm/02.xbm
+tests/data/images/xbm/%02d.xbm CRC=0xc9a20204
+76411 tests/data/images/xbm/02.xbm
diff --git a/tests/ref/lavf/xwd b/tests/ref/lavf/xwd
index b263ce6..7a426ed 100644
--- a/tests/ref/lavf/xwd
+++ b/tests/ref/lavf/xwd
@@ -1,24 +1,3 @@
-50baa5560b7d1aa3188b19c1162bf7dc *./tests/data/images/xwd/02.xwd
-./tests/data/images/xwd/%02d.xwd CRC=0x6da01946
-304239 ./tests/data/images/xwd/02.xwd
-1cdb43599c956dc8563f1e09fac5df00 *./tests/data/images/xwd/02.xwd
-./tests/data/images/xwd/%02d.xwd CRC=0xf07d29cd
-405615 ./tests/data/images/xwd/02.xwd
-c0866e9e710fce735423594a93bee604 *./tests/data/images/xwd/02.xwd
-./tests/data/images/xwd/%02d.xwd CRC=0x53209216
-202863 ./tests/data/images/xwd/02.xwd
-1300938325d5ac12caa09a43bd58f37c *./tests/data/images/xwd/02.xwd
-./tests/data/images/xwd/%02d.xwd CRC=0x14555d6e
-202863 ./tests/data/images/xwd/02.xwd
-c6f3cb7c45f7238474a89d2ad61a1caf *./tests/data/images/xwd/02.xwd
-./tests/data/images/xwd/%02d.xwd CRC=0xf217a95e
-104559 ./tests/data/images/xwd/02.xwd
-fe1af954966a40c2cd35fc27094ff823 *./tests/data/images/xwd/02.xwd
-./tests/data/images/xwd/%02d.xwd CRC=0xce042dcc
-104559 ./tests/data/images/xwd/02.xwd
-85e9b8b814a1dea71d143aac2e487037 *./tests/data/images/xwd/02.xwd
-./tests/data/images/xwd/%02d.xwd CRC=0x0ff205be
-101487 ./tests/data/images/xwd/02.xwd
-796e2e309ac0844cfb2f4959816508ee *./tests/data/images/xwd/02.xwd
-./tests/data/images/xwd/%02d.xwd CRC=0xc9a20204
-12783 ./tests/data/images/xwd/02.xwd
+50baa5560b7d1aa3188b19c1162bf7dc *tests/data/images/xwd/02.xwd
+tests/data/images/xwd/%02d.xwd CRC=0x6da01946
+304239 tests/data/images/xwd/02.xwd
diff --git a/tests/ref/lavf/y4m b/tests/ref/lavf/y4m
new file mode 100644
index 0000000..82c7087
--- /dev/null
+++ b/tests/ref/lavf/y4m
@@ -0,0 +1,3 @@
+ec8178cb152f9cdbfd9cb724d977db2e *tests/data/lavf/lavf.y4m
+3801808 tests/data/lavf/lavf.y4m
+tests/data/lavf/lavf.y4m CRC=0x0a941f26
diff --git a/tests/ref/lavf/yuv4mpeg b/tests/ref/lavf/yuv4mpeg
deleted file mode 100644
index 8c1566e..0000000
--- a/tests/ref/lavf/yuv4mpeg
+++ /dev/null
@@ -1,2 +0,0 @@
-ec8178cb152f9cdbfd9cb724d977db2e *./tests/data/lavf/lavf.y4m
-3801808 ./tests/data/lavf/lavf.y4m
diff --git a/tests/ref/pixfmt/bgr24 b/tests/ref/pixfmt/bgr24
new file mode 100644
index 0000000..43af80b
--- /dev/null
+++ b/tests/ref/pixfmt/bgr24
@@ -0,0 +1,2 @@
+6bb61113e7b70eb09dbcec356122a0e2 *tests/data/pixfmt/bgr24.yuv
+304128 tests/data/pixfmt/bgr24.yuv
diff --git a/tests/ref/pixfmt/gray b/tests/ref/pixfmt/gray
new file mode 100644
index 0000000..fe5e546
--- /dev/null
+++ b/tests/ref/pixfmt/gray
@@ -0,0 +1,2 @@
+1e080c12bd9755c41ecb8e19b756f406 *tests/data/pixfmt/gray.yuv
+304128 tests/data/pixfmt/gray.yuv
diff --git a/tests/ref/pixfmt/monob b/tests/ref/pixfmt/monob
new file mode 100644
index 0000000..002dda1
--- /dev/null
+++ b/tests/ref/pixfmt/monob
@@ -0,0 +1,2 @@
+d87cf0c2e7a13cc693fe6ece22461c83 *tests/data/pixfmt/monob.yuv
+304128 tests/data/pixfmt/monob.yuv
diff --git a/tests/ref/pixfmt/monow b/tests/ref/pixfmt/monow
new file mode 100644
index 0000000..485f256
--- /dev/null
+++ b/tests/ref/pixfmt/monow
@@ -0,0 +1,2 @@
+d87cf0c2e7a13cc693fe6ece22461c83 *tests/data/pixfmt/monow.yuv
+304128 tests/data/pixfmt/monow.yuv
diff --git a/tests/ref/pixfmt/rgb24 b/tests/ref/pixfmt/rgb24
new file mode 100644
index 0000000..b386113
--- /dev/null
+++ b/tests/ref/pixfmt/rgb24
@@ -0,0 +1,2 @@
+6bb61113e7b70eb09dbcec356122a0e2 *tests/data/pixfmt/rgb24.yuv
+304128 tests/data/pixfmt/rgb24.yuv
diff --git a/tests/ref/pixfmt/rgb32 b/tests/ref/pixfmt/rgb32
new file mode 100644
index 0000000..741e60a
--- /dev/null
+++ b/tests/ref/pixfmt/rgb32
@@ -0,0 +1,2 @@
+6bb61113e7b70eb09dbcec356122a0e2 *tests/data/pixfmt/rgb32.yuv
+304128 tests/data/pixfmt/rgb32.yuv
diff --git a/tests/ref/pixfmt/rgb555 b/tests/ref/pixfmt/rgb555
new file mode 100644
index 0000000..eecc974
--- /dev/null
+++ b/tests/ref/pixfmt/rgb555
@@ -0,0 +1,2 @@
+0df2a477af1415a1b8fbf2a3e552bc39 *tests/data/pixfmt/rgb555.yuv
+304128 tests/data/pixfmt/rgb555.yuv
diff --git a/tests/ref/pixfmt/rgb565 b/tests/ref/pixfmt/rgb565
new file mode 100644
index 0000000..b249f4a
--- /dev/null
+++ b/tests/ref/pixfmt/rgb565
@@ -0,0 +1,2 @@
+efa7c0337cc00c796c6df615223716f1 *tests/data/pixfmt/rgb565.yuv
+304128 tests/data/pixfmt/rgb565.yuv
diff --git a/tests/ref/pixfmt/yuv410p b/tests/ref/pixfmt/yuv410p
new file mode 100644
index 0000000..0f1dcfd
--- /dev/null
+++ b/tests/ref/pixfmt/yuv410p
@@ -0,0 +1,2 @@
+507c7e9f0c97660385df977469ca9e6d *tests/data/pixfmt/yuv410p.yuv
+304128 tests/data/pixfmt/yuv410p.yuv
diff --git a/tests/ref/pixfmt/yuv411p b/tests/ref/pixfmt/yuv411p
new file mode 100644
index 0000000..0122b68
--- /dev/null
+++ b/tests/ref/pixfmt/yuv411p
@@ -0,0 +1,2 @@
+8594ea0b8d7c2c964525b0801b5351de *tests/data/pixfmt/yuv411p.yuv
+304128 tests/data/pixfmt/yuv411p.yuv
diff --git a/tests/ref/pixfmt/yuv420p b/tests/ref/pixfmt/yuv420p
new file mode 100644
index 0000000..9adf81f
--- /dev/null
+++ b/tests/ref/pixfmt/yuv420p
@@ -0,0 +1,2 @@
+5641dba168ff665af1cdb4a91e1afdd6 *tests/data/pixfmt/yuv420p.yuv
+304128 tests/data/pixfmt/yuv420p.yuv
diff --git a/tests/ref/pixfmt/yuv422p b/tests/ref/pixfmt/yuv422p
new file mode 100644
index 0000000..4240ec9
--- /dev/null
+++ b/tests/ref/pixfmt/yuv422p
@@ -0,0 +1,2 @@
+ac68f9fdd9d55efd0306d9b004038761 *tests/data/pixfmt/yuv422p.yuv
+304128 tests/data/pixfmt/yuv422p.yuv
diff --git a/tests/ref/pixfmt/yuv440p b/tests/ref/pixfmt/yuv440p
new file mode 100644
index 0000000..4e6ee4d
--- /dev/null
+++ b/tests/ref/pixfmt/yuv440p
@@ -0,0 +1,2 @@
+00b85790df5740bab95e2559d81603a7 *tests/data/pixfmt/yuv440p.yuv
+304128 tests/data/pixfmt/yuv440p.yuv
diff --git a/tests/ref/pixfmt/yuv444p b/tests/ref/pixfmt/yuv444p
new file mode 100644
index 0000000..85c8712
--- /dev/null
+++ b/tests/ref/pixfmt/yuv444p
@@ -0,0 +1,2 @@
+5641dba168ff665af1cdb4a91e1afdd6 *tests/data/pixfmt/yuv444p.yuv
+304128 tests/data/pixfmt/yuv444p.yuv
diff --git a/tests/ref/pixfmt/yuvj420p b/tests/ref/pixfmt/yuvj420p
new file mode 100644
index 0000000..47a729e
--- /dev/null
+++ b/tests/ref/pixfmt/yuvj420p
@@ -0,0 +1,2 @@
+e176bd14185788110e055f945de7f95f *tests/data/pixfmt/yuvj420p.yuv
+304128 tests/data/pixfmt/yuvj420p.yuv
diff --git a/tests/ref/pixfmt/yuvj422p b/tests/ref/pixfmt/yuvj422p
new file mode 100644
index 0000000..6ab97d5
--- /dev/null
+++ b/tests/ref/pixfmt/yuvj422p
@@ -0,0 +1,2 @@
+472028e46a81c98d9b2477507def4723 *tests/data/pixfmt/yuvj422p.yuv
+304128 tests/data/pixfmt/yuvj422p.yuv
diff --git a/tests/ref/pixfmt/yuvj440p b/tests/ref/pixfmt/yuvj440p
new file mode 100644
index 0000000..2beeae5
--- /dev/null
+++ b/tests/ref/pixfmt/yuvj440p
@@ -0,0 +1,2 @@
+4d8d402c45d913038d4b725396719111 *tests/data/pixfmt/yuvj440p.yuv
+304128 tests/data/pixfmt/yuvj440p.yuv
diff --git a/tests/ref/pixfmt/yuvj444p b/tests/ref/pixfmt/yuvj444p
new file mode 100644
index 0000000..63fb813d
--- /dev/null
+++ b/tests/ref/pixfmt/yuvj444p
@@ -0,0 +1,2 @@
+c10442da177c9f1d12be3c53be6fa12c *tests/data/pixfmt/yuvj444p.yuv
+304128 tests/data/pixfmt/yuvj444p.yuv
diff --git a/tests/ref/pixfmt/yuyv422 b/tests/ref/pixfmt/yuyv422
new file mode 100644
index 0000000..0978690
--- /dev/null
+++ b/tests/ref/pixfmt/yuyv422
@@ -0,0 +1,2 @@
+ac68f9fdd9d55efd0306d9b004038761 *tests/data/pixfmt/yuyv422.yuv
+304128 tests/data/pixfmt/yuyv422.yuv
diff --git a/tests/ref/seek/lavf-alaw b/tests/ref/seek/lavf-al
similarity index 100%
rename from tests/ref/seek/lavf-alaw
rename to tests/ref/seek/lavf-al
diff --git a/tests/ref/seek/lavf-dv_fmt b/tests/ref/seek/lavf-dv
similarity index 100%
rename from tests/ref/seek/lavf-dv_fmt
rename to tests/ref/seek/lavf-dv
diff --git a/tests/ref/seek/lavf-flv_fmt b/tests/ref/seek/lavf-flv
similarity index 100%
rename from tests/ref/seek/lavf-flv_fmt
rename to tests/ref/seek/lavf-flv
diff --git a/tests/ref/seek/lavf-mkv b/tests/ref/seek/lavf-mkv
index cea34e9..3299861 100644
--- a/tests/ref/seek/lavf-mkv
+++ b/tests/ref/seek/lavf-mkv
@@ -1,48 +1,48 @@
-ret: 0         st: 1 flags:1 dts: 0.000000 pts: 0.000000 pos:    834 size:   208
+ret: 0         st: 1 flags:1 dts: 0.000000 pts: 0.000000 pos:    659 size:   208
 ret: 0         st:-1 flags:0  ts:-1.000000
-ret: 0         st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos:   1050 size: 27837
+ret: 0         st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos:    875 size: 27837
 ret: 0         st:-1 flags:1  ts: 1.894167
-ret: 0         st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292476 size: 27834
+ret: 0         st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292291 size: 27834
 ret: 0         st: 0 flags:0  ts: 0.788000
-ret: 0         st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292476 size: 27834
+ret: 0         st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292291 size: 27834
 ret: 0         st: 0 flags:1  ts:-0.317000
-ret: 0         st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos:   1050 size: 27837
+ret: 0         st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos:    875 size: 27837
 ret:-1         st: 1 flags:0  ts: 2.577000
 ret: 0         st: 1 flags:1  ts: 1.471000
-ret: 0         st: 1 flags:1 dts: 0.993000 pts: 0.993000 pos: 320317 size:   209
+ret: 0         st: 1 flags:1 dts: 0.993000 pts: 0.993000 pos: 320132 size:   209
 ret: 0         st:-1 flags:0  ts: 0.365002
-ret: 0         st: 0 flags:1 dts: 0.491000 pts: 0.491000 pos: 147023 size: 27925
+ret: 0         st: 0 flags:1 dts: 0.491000 pts: 0.491000 pos: 146843 size: 27925
 ret: 0         st:-1 flags:1  ts:-0.740831
-ret: 0         st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos:   1050 size: 27837
+ret: 0         st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos:    875 size: 27837
 ret:-1         st: 0 flags:0  ts: 2.153000
 ret: 0         st: 0 flags:1  ts: 1.048000
-ret: 0         st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292476 size: 27834
+ret: 0         st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292291 size: 27834
 ret: 0         st: 1 flags:0  ts:-0.058000
-ret: 0         st: 1 flags:1 dts: 0.000000 pts: 0.000000 pos:    834 size:   208
+ret: 0         st: 1 flags:1 dts: 0.000000 pts: 0.000000 pos:    659 size:   208
 ret: 0         st: 1 flags:1  ts: 2.836000
-ret: 0         st: 1 flags:1 dts: 0.993000 pts: 0.993000 pos: 320317 size:   209
+ret: 0         st: 1 flags:1 dts: 0.993000 pts: 0.993000 pos: 320132 size:   209
 ret:-1         st:-1 flags:0  ts: 1.730004
 ret: 0         st:-1 flags:1  ts: 0.624171
-ret: 0         st: 0 flags:1 dts: 0.491000 pts: 0.491000 pos: 147023 size: 27925
+ret: 0         st: 0 flags:1 dts: 0.491000 pts: 0.491000 pos: 146843 size: 27925
 ret: 0         st: 0 flags:0  ts:-0.482000
-ret: 0         st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos:   1050 size: 27837
+ret: 0         st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos:    875 size: 27837
 ret: 0         st: 0 flags:1  ts: 2.413000
-ret: 0         st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292476 size: 27834
+ret: 0         st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292291 size: 27834
 ret:-1         st: 1 flags:0  ts: 1.307000
 ret: 0         st: 1 flags:1  ts: 0.201000
-ret: 0         st: 1 flags:1 dts: 0.000000 pts: 0.000000 pos:    834 size:   208
+ret: 0         st: 1 flags:1 dts: 0.000000 pts: 0.000000 pos:    659 size:   208
 ret: 0         st:-1 flags:0  ts:-0.904994
-ret: 0         st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos:   1050 size: 27837
+ret: 0         st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos:    875 size: 27837
 ret: 0         st:-1 flags:1  ts: 1.989173
-ret: 0         st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292476 size: 27834
+ret: 0         st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292291 size: 27834
 ret: 0         st: 0 flags:0  ts: 0.883000
-ret: 0         st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292476 size: 27834
+ret: 0         st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292291 size: 27834
 ret: 0         st: 0 flags:1  ts:-0.222000
-ret: 0         st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos:   1050 size: 27837
+ret: 0         st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos:    875 size: 27837
 ret:-1         st: 1 flags:0  ts: 2.672000
 ret: 0         st: 1 flags:1  ts: 1.566000
-ret: 0         st: 1 flags:1 dts: 0.993000 pts: 0.993000 pos: 320317 size:   209
+ret: 0         st: 1 flags:1 dts: 0.993000 pts: 0.993000 pos: 320132 size:   209
 ret: 0         st:-1 flags:0  ts: 0.460008
-ret: 0         st: 0 flags:1 dts: 0.491000 pts: 0.491000 pos: 147023 size: 27925
+ret: 0         st: 0 flags:1 dts: 0.491000 pts: 0.491000 pos: 146843 size: 27925
 ret: 0         st:-1 flags:1  ts:-0.645825
-ret: 0         st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos:   1050 size: 27837
+ret: 0         st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos:    875 size: 27837
diff --git a/tests/ref/seek/lavf-mulaw b/tests/ref/seek/lavf-mulaw
deleted file mode 100644
index 8d517fa..0000000
--- a/tests/ref/seek/lavf-mulaw
+++ /dev/null
@@ -1,53 +0,0 @@
-ret: 0         st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos:      0 size:   882
-ret: 0         st:-1 flags:0  ts:-1.000000
-ret: 0         st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos:      0 size:   882
-ret: 0         st:-1 flags:1  ts: 1.894167
-ret: 0         st: 0 flags:1 dts: 1.894150 pts: 1.894150 pos:  41766 size:   882
-ret: 0         st: 0 flags:0  ts: 0.788345
-ret: 0         st: 0 flags:1 dts: 0.788345 pts: 0.788345 pos:  17383 size:   882
-ret: 0         st: 0 flags:1  ts:-0.317506
-ret: 0         st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos:      0 size:   882
-ret: 0         st:-1 flags:0  ts: 2.576668
-ret:-EOF
-ret: 0         st:-1 flags:1  ts: 1.470835
-ret: 0         st: 0 flags:1 dts: 1.470839 pts: 1.470839 pos:  32432 size:   882
-ret: 0         st: 0 flags:0  ts: 0.364989
-ret: 0         st: 0 flags:1 dts: 0.364989 pts: 0.364989 pos:   8048 size:   882
-ret: 0         st: 0 flags:1  ts:-0.740816
-ret: 0         st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos:      0 size:   882
-ret: 0         st:-1 flags:0  ts: 2.153336
-ret:-EOF
-ret: 0         st:-1 flags:1  ts: 1.047503
-ret: 0         st: 0 flags:1 dts: 1.047483 pts: 1.047483 pos:  23097 size:   882
-ret: 0         st: 0 flags:0  ts:-0.058322
-ret: 0         st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos:      0 size:   882
-ret: 0         st: 0 flags:1  ts: 2.835828
-ret:-EOF
-ret: 0         st:-1 flags:0  ts: 1.730004
-ret: 0         st: 0 flags:1 dts: 1.730023 pts: 1.730023 pos:  38147 size:   882
-ret: 0         st:-1 flags:1  ts: 0.624171
-ret: 0         st: 0 flags:1 dts: 0.624172 pts: 0.624172 pos:  13763 size:   882
-ret: 0         st: 0 flags:0  ts:-0.481678
-ret: 0         st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos:      0 size:   882
-ret: 0         st: 0 flags:1  ts: 2.412517
-ret:-EOF
-ret: 0         st:-1 flags:0  ts: 1.306672
-ret: 0         st: 0 flags:1 dts: 1.306667 pts: 1.306667 pos:  28812 size:   882
-ret: 0         st:-1 flags:1  ts: 0.200839
-ret: 0         st: 0 flags:1 dts: 0.200816 pts: 0.200816 pos:   4428 size:   882
-ret: 0         st: 0 flags:0  ts:-0.904989
-ret: 0         st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos:      0 size:   882
-ret: 0         st: 0 flags:1  ts: 1.989161
-ret: 0         st: 0 flags:1 dts: 1.989161 pts: 1.989161 pos:  43861 size:   239
-ret: 0         st:-1 flags:0  ts: 0.883340
-ret: 0         st: 0 flags:1 dts: 0.883356 pts: 0.883356 pos:  19478 size:   882
-ret: 0         st:-1 flags:1  ts:-0.222493
-ret: 0         st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos:      0 size:   882
-ret: 0         st: 0 flags:0  ts: 2.671655
-ret:-EOF
-ret: 0         st: 0 flags:1  ts: 1.565850
-ret: 0         st: 0 flags:1 dts: 1.565850 pts: 1.565850 pos:  34527 size:   882
-ret: 0         st:-1 flags:0  ts: 0.460008
-ret: 0         st: 0 flags:1 dts: 0.460000 pts: 0.460000 pos:  10143 size:   882
-ret: 0         st:-1 flags:1  ts:-0.645825
-ret: 0         st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos:      0 size:   882
diff --git a/tests/ref/seek/lavf-ts b/tests/ref/seek/lavf-ts
index e57651e..3347b7e 100644
--- a/tests/ref/seek/lavf-ts
+++ b/tests/ref/seek/lavf-ts
@@ -2,51 +2,51 @@
 ret: 0         st:-1 flags:0  ts:-1.000000
 ret: 0         st: 0 flags:1 dts: 1.400000 pts: 1.440000 pos:    564 size: 24801
 ret: 0         st:-1 flags:1  ts: 1.894167
-ret: 0         st: 0 flags:1 dts: 1.880000 pts: 1.920000 pos: 189692 size: 24786
+ret: 0         st: 0 flags:1 dts: 1.880000 pts: 1.920000 pos: 181420 size: 24786
 ret: 0         st: 0 flags:0  ts: 0.788333
 ret: 0         st: 0 flags:1 dts: 1.400000 pts: 1.440000 pos:    564 size: 24801
 ret: 0         st: 0 flags:1  ts:-0.317500
 ret: 0         st: 0 flags:1 dts: 1.400000 pts: 1.440000 pos:    564 size: 24801
 ret: 0         st: 1 flags:0  ts: 2.576667
-ret: 0         st: 1 flags:1 dts: 2.160522 pts: 2.160522 pos: 404576 size:   209
+ret: 0         st: 1 flags:1 dts: 2.160522 pts: 2.160522 pos: 386716 size:   209
 ret: 0         st: 1 flags:1  ts: 1.470833
-ret: 0         st: 1 flags:1 dts: 1.429089 pts: 1.429089 pos: 159988 size:   208
+ret: 0         st: 1 flags:1 dts: 1.429089 pts: 1.429089 pos: 152844 size:   208
 ret: 0         st:-1 flags:0  ts: 0.365002
 ret: 0         st: 0 flags:1 dts: 1.400000 pts: 1.440000 pos:    564 size: 24801
 ret: 0         st:-1 flags:1  ts:-0.740831
 ret: 0         st: 0 flags:1 dts: 1.400000 pts: 1.440000 pos:    564 size: 24801
 ret: 0         st: 0 flags:0  ts: 2.153333
-ret: 0         st: 1 flags:1 dts: 1.794811 pts: 1.794811 pos: 322608 size:   209
+ret: 0         st: 1 flags:1 dts: 1.794811 pts: 1.794811 pos: 308508 size:   209
 ret: 0         st: 0 flags:1  ts: 1.047500
 ret: 0         st: 0 flags:1 dts: 1.400000 pts: 1.440000 pos:    564 size: 24801
 ret: 0         st: 1 flags:0  ts:-0.058333
-ret: 0         st: 1 flags:1 dts: 1.429089 pts: 1.429089 pos: 159988 size:   208
+ret: 0         st: 1 flags:1 dts: 1.429089 pts: 1.429089 pos: 152844 size:   208
 ret: 0         st: 1 flags:1  ts: 2.835833
-ret: 0         st: 1 flags:1 dts: 2.160522 pts: 2.160522 pos: 404576 size:   209
+ret: 0         st: 1 flags:1 dts: 2.160522 pts: 2.160522 pos: 386716 size:   209
 ret: 0         st:-1 flags:0  ts: 1.730004
-ret: 0         st: 1 flags:1 dts: 1.429089 pts: 1.429089 pos: 159988 size:   208
+ret: 0         st: 1 flags:1 dts: 1.429089 pts: 1.429089 pos: 152844 size:   208
 ret: 0         st:-1 flags:1  ts: 0.624171
 ret: 0         st: 0 flags:1 dts: 1.400000 pts: 1.440000 pos:    564 size: 24801
 ret: 0         st: 0 flags:0  ts:-0.481667
 ret: 0         st: 0 flags:1 dts: 1.400000 pts: 1.440000 pos:    564 size: 24801
 ret: 0         st: 0 flags:1  ts: 2.412500
-ret: 0         st: 1 flags:1 dts: 2.160522 pts: 2.160522 pos: 404576 size:   209
+ret: 0         st: 1 flags:1 dts: 2.160522 pts: 2.160522 pos: 386716 size:   209
 ret: 0         st: 1 flags:0  ts: 1.306667
-ret: 0         st: 1 flags:1 dts: 1.429089 pts: 1.429089 pos: 159988 size:   208
+ret: 0         st: 1 flags:1 dts: 1.429089 pts: 1.429089 pos: 152844 size:   208
 ret: 0         st: 1 flags:1  ts: 0.200844
-ret: 0         st: 1 flags:1 dts: 1.429089 pts: 1.429089 pos: 159988 size:   208
+ret: 0         st: 1 flags:1 dts: 1.429089 pts: 1.429089 pos: 152844 size:   208
 ret: 0         st:-1 flags:0  ts:-0.904994
 ret: 0         st: 0 flags:1 dts: 1.400000 pts: 1.440000 pos:    564 size: 24801
 ret: 0         st:-1 flags:1  ts: 1.989173
-ret: 0         st: 0 flags:0 dts: 1.960000 pts: 2.000000 pos: 235000 size: 15019
+ret: 0         st: 0 flags:0 dts: 1.960000 pts: 2.000000 pos: 224848 size: 15019
 ret: 0         st: 0 flags:0  ts: 0.883344
 ret: 0         st: 0 flags:1 dts: 1.400000 pts: 1.440000 pos:    564 size: 24801
 ret: 0         st: 0 flags:1  ts:-0.222489
 ret: 0         st: 0 flags:1 dts: 1.400000 pts: 1.440000 pos:    564 size: 24801
 ret: 0         st: 1 flags:0  ts: 2.671678
-ret: 0         st: 1 flags:1 dts: 2.160522 pts: 2.160522 pos: 404576 size:   209
+ret: 0         st: 1 flags:1 dts: 2.160522 pts: 2.160522 pos: 386716 size:   209
 ret: 0         st: 1 flags:1  ts: 1.565844
-ret: 0         st: 1 flags:1 dts: 1.429089 pts: 1.429089 pos: 159988 size:   208
+ret: 0         st: 1 flags:1 dts: 1.429089 pts: 1.429089 pos: 152844 size:   208
 ret: 0         st:-1 flags:0  ts: 0.460008
 ret: 0         st: 0 flags:1 dts: 1.400000 pts: 1.440000 pos:    564 size: 24801
 ret: 0         st:-1 flags:1  ts:-0.645825
diff --git a/tests/ref/seek/lavf-alaw b/tests/ref/seek/lavf-ul
similarity index 100%
copy from tests/ref/seek/lavf-alaw
copy to tests/ref/seek/lavf-ul
diff --git a/tests/ref/seek/lavf-yuv4mpeg b/tests/ref/seek/lavf-y4m
similarity index 100%
rename from tests/ref/seek/lavf-yuv4mpeg
rename to tests/ref/seek/lavf-y4m
diff --git a/tests/ref/vsynth/vsynth1-avui b/tests/ref/vsynth/vsynth1-avui
index 1f08053..8e76b9a 100644
--- a/tests/ref/vsynth/vsynth1-avui
+++ b/tests/ref/vsynth/vsynth1-avui
@@ -1,4 +1,4 @@
-25ef49e1aee0b20d4feee89b8dc093b4 *tests/data/fate/vsynth1-avui.mov
+be8ffb8056d1fb5f8c500b95bf7af14c *tests/data/fate/vsynth1-avui.mov
 42625037 tests/data/fate/vsynth1-avui.mov
 c5ccac874dbf808e9088bc3107860042 *tests/data/fate/vsynth1-avui.out.rawvideo
 stddev:    0.00 PSNR:999.99 MAXDIFF:    0 bytes:  7603200/  7603200
diff --git a/tests/ref/vsynth/vsynth1-dnxhd-1080i b/tests/ref/vsynth/vsynth1-dnxhd-1080i
index 02f989f..0e7844b 100644
--- a/tests/ref/vsynth/vsynth1-dnxhd-1080i
+++ b/tests/ref/vsynth/vsynth1-dnxhd-1080i
@@ -1,4 +1,4 @@
-a0234e0a8516d958f423b119aa9e35c4 *tests/data/fate/vsynth1-dnxhd-1080i.mov
+af5cbe239839f6282a68f1a106ed3a77 *tests/data/fate/vsynth1-dnxhd-1080i.mov
 3031911 tests/data/fate/vsynth1-dnxhd-1080i.mov
 fed9ed2a5179c9df0ef58772b025e303 *tests/data/fate/vsynth1-dnxhd-1080i.out.rawvideo
 stddev:    6.18 PSNR: 32.31 MAXDIFF:   64 bytes:  7603200/   760320
diff --git a/tests/ref/vsynth/vsynth1-dnxhd-1080i-10bit b/tests/ref/vsynth/vsynth1-dnxhd-1080i-10bit
index dd96e14..c3f3fda 100644
--- a/tests/ref/vsynth/vsynth1-dnxhd-1080i-10bit
+++ b/tests/ref/vsynth/vsynth1-dnxhd-1080i-10bit
@@ -1,4 +1,4 @@
-f562845d1848bf5d3e524b418b742e01 *tests/data/fate/vsynth1-dnxhd-1080i-10bit.mov
+1a8261120bcc764a7bbdd198febff4c7 *tests/data/fate/vsynth1-dnxhd-1080i-10bit.mov
 4588391 tests/data/fate/vsynth1-dnxhd-1080i-10bit.mov
 31032fcb7e6af79daaac02288254c6d6 *tests/data/fate/vsynth1-dnxhd-1080i-10bit.out.rawvideo
 stddev:    5.69 PSNR: 33.02 MAXDIFF:   55 bytes:  7603200/   760320
diff --git a/tests/ref/vsynth/vsynth1-dnxhd-1080i-colr b/tests/ref/vsynth/vsynth1-dnxhd-1080i-colr
index ac42966..35cd719 100644
--- a/tests/ref/vsynth/vsynth1-dnxhd-1080i-colr
+++ b/tests/ref/vsynth/vsynth1-dnxhd-1080i-colr
@@ -1,4 +1,4 @@
-5fccdb16c0f14dea1b6b603bac90b97e *tests/data/fate/vsynth1-dnxhd-1080i-colr.mov
+5571f4ff9e29d352a7e373a14a9ed2ed *tests/data/fate/vsynth1-dnxhd-1080i-colr.mov
 3031929 tests/data/fate/vsynth1-dnxhd-1080i-colr.mov
 6f2d5429ffc4529a76acfeb28b560542 *tests/data/fate/vsynth1-dnxhd-1080i-colr.out.rawvideo
 stddev:    5.65 PSNR: 33.09 MAXDIFF:   55 bytes:  7603200/   760320
diff --git a/tests/ref/vsynth/vsynth1-dnxhd-hr-hq-mov b/tests/ref/vsynth/vsynth1-dnxhd-hr-hq-mov
index 559c2f0..a8ee88c 100644
--- a/tests/ref/vsynth/vsynth1-dnxhd-hr-hq-mov
+++ b/tests/ref/vsynth/vsynth1-dnxhd-hr-hq-mov
@@ -1,4 +1,4 @@
-c8b5d2bde45776bbf13f0262c915f5b9 *tests/data/fate/vsynth1-dnxhd-hr-hq-mov.mov
+36729f1faaa24daa9c643428bc87f090 *tests/data/fate/vsynth1-dnxhd-hr-hq-mov.mov
 4772599 tests/data/fate/vsynth1-dnxhd-hr-hq-mov.mov
 388c7c84573abe28cc963e3ad5e15a31 *tests/data/fate/vsynth1-dnxhd-hr-hq-mov.out.rawvideo
 stddev:    5.73 PSNR: 32.96 MAXDIFF:   56 bytes:  7603200/   760320
diff --git a/tests/ref/vsynth/vsynth1-dnxhd-hr-lb-mov b/tests/ref/vsynth/vsynth1-dnxhd-hr-lb-mov
index 2e2b4a3..7d2890d 100644
--- a/tests/ref/vsynth/vsynth1-dnxhd-hr-lb-mov
+++ b/tests/ref/vsynth/vsynth1-dnxhd-hr-lb-mov
@@ -1,4 +1,4 @@
-254aa3f0be811882ff351172fd391492 *tests/data/fate/vsynth1-dnxhd-hr-lb-mov.mov
+ee2f1559d2cf82930d893ca4d0937c01 *tests/data/fate/vsynth1-dnxhd-hr-lb-mov.mov
 3748599 tests/data/fate/vsynth1-dnxhd-hr-lb-mov.mov
 21c68252f500bada13ccce232e1ecfca *tests/data/fate/vsynth1-dnxhd-hr-lb-mov.out.rawvideo
 stddev:    5.59 PSNR: 33.17 MAXDIFF:   55 bytes:  7603200/   760320
diff --git a/tests/ref/vsynth/vsynth1-dnxhd-hr-sq-mov b/tests/ref/vsynth/vsynth1-dnxhd-hr-sq-mov
index 2c52e3e..b647cbe 100644
--- a/tests/ref/vsynth/vsynth1-dnxhd-hr-sq-mov
+++ b/tests/ref/vsynth/vsynth1-dnxhd-hr-sq-mov
@@ -1,4 +1,4 @@
-7d7fb47e926aa565b51661264f1a39e9 *tests/data/fate/vsynth1-dnxhd-hr-sq-mov.mov
+31544b301d8a23101c1cf03d26546fb8 *tests/data/fate/vsynth1-dnxhd-hr-sq-mov.mov
 2560763 tests/data/fate/vsynth1-dnxhd-hr-sq-mov.mov
 66d29f91cdf038753894dd42e65d997a *tests/data/fate/vsynth1-dnxhd-hr-sq-mov.out.rawvideo
 stddev:    5.77 PSNR: 32.91 MAXDIFF:   58 bytes:  7603200/   760320
diff --git a/tests/ref/vsynth/vsynth1-dv-fhd b/tests/ref/vsynth/vsynth1-dv-fhd
new file mode 100644
index 0000000..b81141f
--- /dev/null
+++ b/tests/ref/vsynth/vsynth1-dv-fhd
@@ -0,0 +1,4 @@
+74315a8678d12c7f592c02990dc8952d *tests/data/fate/vsynth1-dv-fhd.dv
+28800000 tests/data/fate/vsynth1-dv-fhd.dv
+c95b309bc128b162e5c8241374eb66a9 *tests/data/fate/vsynth1-dv-fhd.out.rawvideo
+stddev:    2.53 PSNR: 40.03 MAXDIFF:   35 bytes:  7603200/  7603200
diff --git a/tests/ref/vsynth/vsynth1-dv-hd b/tests/ref/vsynth/vsynth1-dv-hd
new file mode 100644
index 0000000..6b6d6e8
--- /dev/null
+++ b/tests/ref/vsynth/vsynth1-dv-hd
@@ -0,0 +1,4 @@
+22d1d62a834fe8416fe79c51760012c1 *tests/data/fate/vsynth1-dv-hd.dv
+14400000 tests/data/fate/vsynth1-dv-hd.dv
+34b78cf725346c7f819c9d6209b8299a *tests/data/fate/vsynth1-dv-hd.out.rawvideo
+stddev:    4.30 PSNR: 35.45 MAXDIFF:   74 bytes:  7603200/  7603200
diff --git a/tests/ref/vsynth/vsynth1-mov-bgr24 b/tests/ref/vsynth/vsynth1-mov-bgr24
index ec60442..6639d0d 100644
--- a/tests/ref/vsynth/vsynth1-mov-bgr24
+++ b/tests/ref/vsynth/vsynth1-mov-bgr24
@@ -1,4 +1,4 @@
-93d3a2e5701c3da06da27cffa04fb730 *tests/data/fate/vsynth1-mov-bgr24.mov
+ba9d5cbc4b432db076fb501b1d5fa536 *tests/data/fate/vsynth1-mov-bgr24.mov
 15207169 tests/data/fate/vsynth1-mov-bgr24.mov
 93695a27c24a61105076ca7b1f010bbd *tests/data/fate/vsynth1-mov-bgr24.out.rawvideo
 stddev:    3.42 PSNR: 37.44 MAXDIFF:   48 bytes:  7603200/  7603200
diff --git a/tests/ref/vsynth/vsynth1-mov-bpp15 b/tests/ref/vsynth/vsynth1-mov-bpp15
index cfb5e86..d42c40b 100644
--- a/tests/ref/vsynth/vsynth1-mov-bpp15
+++ b/tests/ref/vsynth/vsynth1-mov-bpp15
@@ -1,4 +1,4 @@
-00cd1f0cf8c335b8f4d7dfa81e188e75 *tests/data/fate/vsynth1-mov-bpp15.mov
+dfd88a906ae74dddd4caf3c455224fa3 *tests/data/fate/vsynth1-mov-bpp15.mov
 10138329 tests/data/fate/vsynth1-mov-bpp15.mov
 99bece160cfb0da47f446b60d42fa3ae *tests/data/fate/vsynth1-mov-bpp15.out.rawvideo
 stddev:    4.06 PSNR: 35.94 MAXDIFF:   47 bytes:  7603200/  7603200
diff --git a/tests/ref/vsynth/vsynth1-mov-bpp16 b/tests/ref/vsynth/vsynth1-mov-bpp16
index 8b17895..bdafbf1 100644
--- a/tests/ref/vsynth/vsynth1-mov-bpp16
+++ b/tests/ref/vsynth/vsynth1-mov-bpp16
@@ -1,4 +1,4 @@
-623f62ed23abf406c2d67bf65adaf421 *tests/data/fate/vsynth1-mov-bpp16.mov
+3d7e3f8bd238c341b0b4d55a30d8f5a2 *tests/data/fate/vsynth1-mov-bpp16.mov
 10138329 tests/data/fate/vsynth1-mov-bpp16.mov
 0cea382b9b0a4ce88260c1edc20b3f5b *tests/data/fate/vsynth1-mov-bpp16.out.rawvideo
 stddev:    3.79 PSNR: 36.55 MAXDIFF:   46 bytes:  7603200/  7603200
diff --git a/tests/ref/vsynth/vsynth1-prores b/tests/ref/vsynth/vsynth1-prores
index 14de8b9..3c59eb7 100644
--- a/tests/ref/vsynth/vsynth1-prores
+++ b/tests/ref/vsynth/vsynth1-prores
@@ -1,4 +1,4 @@
-7ca7d2f9f5d8ac2ead691b1b6a70d409 *tests/data/fate/vsynth1-prores.mov
+460f69344752e6af2dc46b00169b78a3 *tests/data/fate/vsynth1-prores.mov
 5022821 tests/data/fate/vsynth1-prores.mov
 fb4a9e025d12afc0dbbca8d82831858f *tests/data/fate/vsynth1-prores.out.rawvideo
 stddev:    2.47 PSNR: 40.27 MAXDIFF:   31 bytes:  7603200/  7603200
diff --git a/tests/ref/vsynth/vsynth1-prores_444 b/tests/ref/vsynth/vsynth1-prores_444
new file mode 100644
index 0000000..f7f8e90
--- /dev/null
+++ b/tests/ref/vsynth/vsynth1-prores_444
@@ -0,0 +1,4 @@
+509e0407dff118c775dcaa4f509a4aae *tests/data/fate/vsynth1-prores_444.mov
+7778954 tests/data/fate/vsynth1-prores_444.mov
+e0da52b5d58171294d1b299539801ae0 *tests/data/fate/vsynth1-prores_444.out.rawvideo
+stddev:    2.80 PSNR: 39.17 MAXDIFF:   44 bytes:  7603200/  7603200
diff --git a/tests/ref/vsynth/vsynth1-prores_444_int b/tests/ref/vsynth/vsynth1-prores_444_int
new file mode 100644
index 0000000..9515887
--- /dev/null
+++ b/tests/ref/vsynth/vsynth1-prores_444_int
@@ -0,0 +1,4 @@
+1d5e484fa8ca08781ef2ed8428963d12 *tests/data/fate/vsynth1-prores_444_int.mov
+9940947 tests/data/fate/vsynth1-prores_444_int.mov
+732ceeb6887524e0aee98762fe50578b *tests/data/fate/vsynth1-prores_444_int.out.rawvideo
+stddev:    2.83 PSNR: 39.08 MAXDIFF:   45 bytes:  7603200/  7603200
diff --git a/tests/ref/vsynth/vsynth1-prores_int b/tests/ref/vsynth/vsynth1-prores_int
new file mode 100644
index 0000000..16a6687
--- /dev/null
+++ b/tests/ref/vsynth/vsynth1-prores_int
@@ -0,0 +1,4 @@
+3711e22aa5052f39dabfcb9ee3a42045 *tests/data/fate/vsynth1-prores_int.mov
+6308688 tests/data/fate/vsynth1-prores_int.mov
+164a4ca890695cf594293d1acec9463c *tests/data/fate/vsynth1-prores_int.out.rawvideo
+stddev:    2.66 PSNR: 39.62 MAXDIFF:   34 bytes:  7603200/  7603200
diff --git a/tests/ref/vsynth/vsynth1-prores_ks b/tests/ref/vsynth/vsynth1-prores_ks
index 6e5ed17..22c2489 100644
--- a/tests/ref/vsynth/vsynth1-prores_ks
+++ b/tests/ref/vsynth/vsynth1-prores_ks
@@ -1,4 +1,4 @@
-fe41a284da97ea5ec8866ca9a55b84da *tests/data/fate/vsynth1-prores_ks.mov
+5b0970bacd4b03d70f7648fee2f0c85f *tests/data/fate/vsynth1-prores_ks.mov
 3858911 tests/data/fate/vsynth1-prores_ks.mov
 100eb002413fe7a632d440dfbdf7e3ff *tests/data/fate/vsynth1-prores_ks.out.rawvideo
 stddev:    3.17 PSNR: 38.09 MAXDIFF:   39 bytes:  7603200/  7603200
diff --git a/tests/ref/vsynth/vsynth1-qtrle b/tests/ref/vsynth/vsynth1-qtrle
index 4b92081..02164dd 100644
--- a/tests/ref/vsynth/vsynth1-qtrle
+++ b/tests/ref/vsynth/vsynth1-qtrle
@@ -1,4 +1,4 @@
-35d8a1446d886fadcdffae192bed7e4e *tests/data/fate/vsynth1-qtrle.mov
+fb84d62fc821cf063b5877c61b975e62 *tests/data/fate/vsynth1-qtrle.mov
 15263158 tests/data/fate/vsynth1-qtrle.mov
 93695a27c24a61105076ca7b1f010bbd *tests/data/fate/vsynth1-qtrle.out.rawvideo
 stddev:    3.42 PSNR: 37.44 MAXDIFF:   48 bytes:  7603200/  7603200
diff --git a/tests/ref/vsynth/vsynth1-qtrlegray b/tests/ref/vsynth/vsynth1-qtrlegray
index c3d571d..3cf64d1 100644
--- a/tests/ref/vsynth/vsynth1-qtrlegray
+++ b/tests/ref/vsynth/vsynth1-qtrlegray
@@ -1,4 +1,4 @@
-651b745a37a06ddd52adfe8e0a45b115 *tests/data/fate/vsynth1-qtrlegray.mov
+75753ab19241d1e45297219204a0925d *tests/data/fate/vsynth1-qtrlegray.mov
 5113293 tests/data/fate/vsynth1-qtrlegray.mov
 cb20af0e5a65aad7cf47002fcb52288e *tests/data/fate/vsynth1-qtrlegray.out.rawvideo
 stddev:   25.34 PSNR: 20.05 MAXDIFF:  122 bytes:  7603200/  7603200
diff --git a/tests/ref/vsynth/vsynth1-r210 b/tests/ref/vsynth/vsynth1-r210
index 825e1d4..1103308 100644
--- a/tests/ref/vsynth/vsynth1-r210
+++ b/tests/ref/vsynth/vsynth1-r210
@@ -1,4 +1,4 @@
-1ea72f280b110ed65fc535c3438d27f9 *tests/data/fate/vsynth1-r210.avi
+1a522a30ddd8c2865a731a5659001717 *tests/data/fate/vsynth1-r210.avi
 22125252 tests/data/fate/vsynth1-r210.avi
-ecaafa9eec11b5e1453a63ed6d194eed *tests/data/fate/vsynth1-r210.out.rawvideo
-stddev:    3.23 PSNR: 37.94 MAXDIFF:   48 bytes:  7603200/  7603200
+b6444935d6c4d8c75fe63d5978f5b457 *tests/data/fate/vsynth1-r210.out.rawvideo
+stddev:    3.73 PSNR: 36.68 MAXDIFF:   48 bytes:  7603200/  7603200
diff --git a/tests/ref/vsynth/vsynth1-svq1 b/tests/ref/vsynth/vsynth1-svq1
index 9c1b6ff..cb89915 100644
--- a/tests/ref/vsynth/vsynth1-svq1
+++ b/tests/ref/vsynth/vsynth1-svq1
@@ -1,4 +1,4 @@
-a3206831d34197a2d236d82dd0248646 *tests/data/fate/vsynth1-svq1.mov
+39ec74da265e3ef27756618108641181 *tests/data/fate/vsynth1-svq1.mov
 1334233 tests/data/fate/vsynth1-svq1.mov
 9cc35c54b2c77d36bd7e308b393c1f81 *tests/data/fate/vsynth1-svq1.out.rawvideo
 stddev:    9.58 PSNR: 28.50 MAXDIFF:  210 bytes:  7603200/  7603200
diff --git a/tests/ref/vsynth/vsynth1-vc2-420p b/tests/ref/vsynth/vsynth1-vc2-420p
index e925c53..0c4c9cb 100644
--- a/tests/ref/vsynth/vsynth1-vc2-420p
+++ b/tests/ref/vsynth/vsynth1-vc2-420p
@@ -1,4 +1,4 @@
-fb8fffcfc17558c87dd11a67ccb0f615 *tests/data/fate/vsynth1-vc2-420p.mov
+74df65b15463f098587d8c09d87286a1 *tests/data/fate/vsynth1-vc2-420p.mov
 1155415 tests/data/fate/vsynth1-vc2-420p.mov
 387696707c79cf1a6c9aeff4024226b9 *tests/data/fate/vsynth1-vc2-420p.out.rawvideo
 stddev:    0.00 PSNR:999.99 MAXDIFF:    0 bytes:  7603200/   760320
diff --git a/tests/ref/vsynth/vsynth1-vc2-420p10 b/tests/ref/vsynth/vsynth1-vc2-420p10
index 025a1cc..2a70b65 100644
--- a/tests/ref/vsynth/vsynth1-vc2-420p10
+++ b/tests/ref/vsynth/vsynth1-vc2-420p10
@@ -1,4 +1,4 @@
-1365742985b6315f6796c765aa17f39e *tests/data/fate/vsynth1-vc2-420p10.mov
+f469f3b94c9262fd421a67b20e1809e7 *tests/data/fate/vsynth1-vc2-420p10.mov
 1417047 tests/data/fate/vsynth1-vc2-420p10.mov
 387696707c79cf1a6c9aeff4024226b9 *tests/data/fate/vsynth1-vc2-420p10.out.rawvideo
 stddev:    0.00 PSNR:999.99 MAXDIFF:    0 bytes:  7603200/   760320
diff --git a/tests/ref/vsynth/vsynth1-vc2-420p12 b/tests/ref/vsynth/vsynth1-vc2-420p12
index 719f0d5..4d1a1a2 100644
--- a/tests/ref/vsynth/vsynth1-vc2-420p12
+++ b/tests/ref/vsynth/vsynth1-vc2-420p12
@@ -1,4 +1,4 @@
-08a844d17940cd612da269fb08430628 *tests/data/fate/vsynth1-vc2-420p12.mov
+9e482c1b03d49cfec89c6515888bc735 *tests/data/fate/vsynth1-vc2-420p12.mov
 1746007 tests/data/fate/vsynth1-vc2-420p12.mov
 387696707c79cf1a6c9aeff4024226b9 *tests/data/fate/vsynth1-vc2-420p12.out.rawvideo
 stddev:    0.00 PSNR:999.99 MAXDIFF:    0 bytes:  7603200/   760320
diff --git a/tests/ref/vsynth/vsynth1-vc2-422p b/tests/ref/vsynth/vsynth1-vc2-422p
index 8fc6188..15f988a 100644
--- a/tests/ref/vsynth/vsynth1-vc2-422p
+++ b/tests/ref/vsynth/vsynth1-vc2-422p
@@ -1,4 +1,4 @@
-19f01a985e87e14664e0e5d14c02d046 *tests/data/fate/vsynth1-vc2-422p.mov
+19b0ed7a894cda7378ace68f05c143cd *tests/data/fate/vsynth1-vc2-422p.mov
 1229783 tests/data/fate/vsynth1-vc2-422p.mov
 57a7f41235e7f9f094aa7ba5bdc82f02 *tests/data/fate/vsynth1-vc2-422p.out.rawvideo
 stddev:    1.89 PSNR: 42.58 MAXDIFF:   23 bytes:  7603200/   760320
diff --git a/tests/ref/vsynth/vsynth1-vc2-422p10 b/tests/ref/vsynth/vsynth1-vc2-422p10
index ac1072f..c561eaf 100644
--- a/tests/ref/vsynth/vsynth1-vc2-422p10
+++ b/tests/ref/vsynth/vsynth1-vc2-422p10
@@ -1,4 +1,4 @@
-88e3488e4689cf06e75959c71e2f9d96 *tests/data/fate/vsynth1-vc2-422p10.mov
+e3ddb55b47e8960eba9412c4e38ce77a *tests/data/fate/vsynth1-vc2-422p10.mov
 1684055 tests/data/fate/vsynth1-vc2-422p10.mov
 f35dd1c1df4726bb1d75d95e321b0698 *tests/data/fate/vsynth1-vc2-422p10.out.rawvideo
 stddev:    1.88 PSNR: 42.61 MAXDIFF:   23 bytes:  7603200/   760320
diff --git a/tests/ref/vsynth/vsynth1-vc2-422p12 b/tests/ref/vsynth/vsynth1-vc2-422p12
index 0ad4798..baa6715 100644
--- a/tests/ref/vsynth/vsynth1-vc2-422p12
+++ b/tests/ref/vsynth/vsynth1-vc2-422p12
@@ -1,4 +1,4 @@
-b162a7c531fb06f436c79b38fb3d7403 *tests/data/fate/vsynth1-vc2-422p12.mov
+4dd111ed0272534faa258cb6a2dab13d *tests/data/fate/vsynth1-vc2-422p12.mov
 2135131 tests/data/fate/vsynth1-vc2-422p12.mov
 1b56b3d127320c0e6c643e3430b7ffd1 *tests/data/fate/vsynth1-vc2-422p12.out.rawvideo
 stddev:    1.88 PSNR: 42.62 MAXDIFF:   23 bytes:  7603200/   760320
diff --git a/tests/ref/vsynth/vsynth1-vc2-444p b/tests/ref/vsynth/vsynth1-vc2-444p
index d01e938..1d0dffc 100644
--- a/tests/ref/vsynth/vsynth1-vc2-444p
+++ b/tests/ref/vsynth/vsynth1-vc2-444p
@@ -1,4 +1,4 @@
-b3f0d987dcb0b5d1eb0b87f356ad21c4 *tests/data/fate/vsynth1-vc2-444p.mov
+377d8c8f5bf8cec078d96d4d62df6296 *tests/data/fate/vsynth1-vc2-444p.mov
 1593810 tests/data/fate/vsynth1-vc2-444p.mov
 791cf0f21558ad4a4cad43da05628e06 *tests/data/fate/vsynth1-vc2-444p.out.rawvideo
 stddev:    2.69 PSNR: 39.51 MAXDIFF:   37 bytes:  7603200/   760320
diff --git a/tests/ref/vsynth/vsynth1-vc2-444p10 b/tests/ref/vsynth/vsynth1-vc2-444p10
index af00746..fee9afb 100644
--- a/tests/ref/vsynth/vsynth1-vc2-444p10
+++ b/tests/ref/vsynth/vsynth1-vc2-444p10
@@ -1,4 +1,4 @@
-ef286696c5d37277b4064c4f87f6e564 *tests/data/fate/vsynth1-vc2-444p10.mov
+dca4f23469c7446fecf5c123bbc71b2b *tests/data/fate/vsynth1-vc2-444p10.mov
 2167643 tests/data/fate/vsynth1-vc2-444p10.mov
 0e2cd6d0e1d68ffee64d269dcb57d66d *tests/data/fate/vsynth1-vc2-444p10.out.rawvideo
 stddev:    2.69 PSNR: 39.53 MAXDIFF:   37 bytes:  7603200/   760320
diff --git a/tests/ref/vsynth/vsynth1-vc2-444p12 b/tests/ref/vsynth/vsynth1-vc2-444p12
index 6a71b67..e548dec 100644
--- a/tests/ref/vsynth/vsynth1-vc2-444p12
+++ b/tests/ref/vsynth/vsynth1-vc2-444p12
@@ -1,4 +1,4 @@
-21aaed7828fa847ce5b75399efbc768c *tests/data/fate/vsynth1-vc2-444p12.mov
+f5ef425d9d29829e8dc4287ef253d3c7 *tests/data/fate/vsynth1-vc2-444p12.mov
 2755159 tests/data/fate/vsynth1-vc2-444p12.mov
 55998114d7386d219a49011c8b804a58 *tests/data/fate/vsynth1-vc2-444p12.out.rawvideo
 stddev:    2.69 PSNR: 39.53 MAXDIFF:   37 bytes:  7603200/   760320
diff --git a/tests/ref/vsynth/vsynth1-vc2-t5_3 b/tests/ref/vsynth/vsynth1-vc2-t5_3
index 543f632..e2fb054 100644
--- a/tests/ref/vsynth/vsynth1-vc2-t5_3
+++ b/tests/ref/vsynth/vsynth1-vc2-t5_3
@@ -1,4 +1,4 @@
-a5c80a091e7c3021ab9d5b854b4c653f *tests/data/fate/vsynth1-vc2-t5_3.mov
+4e1ca89ec825e7926717146b945c916d *tests/data/fate/vsynth1-vc2-t5_3.mov
 1604316 tests/data/fate/vsynth1-vc2-t5_3.mov
 f35dd1c1df4726bb1d75d95e321b0698 *tests/data/fate/vsynth1-vc2-t5_3.out.rawvideo
 stddev:    1.88 PSNR: 42.61 MAXDIFF:   23 bytes:  7603200/   760320
diff --git a/tests/ref/vsynth/vsynth1-vc2-thaar b/tests/ref/vsynth/vsynth1-vc2-thaar
index 4c1f50f..8831027 100644
--- a/tests/ref/vsynth/vsynth1-vc2-thaar
+++ b/tests/ref/vsynth/vsynth1-vc2-thaar
@@ -1,4 +1,4 @@
-62bcccb2981c4b79b635a0199a7fafb1 *tests/data/fate/vsynth1-vc2-thaar.mov
+a0aba4e9628b8952fe774bd8c1f3f18d *tests/data/fate/vsynth1-vc2-thaar.mov
 1717724 tests/data/fate/vsynth1-vc2-thaar.mov
 f35dd1c1df4726bb1d75d95e321b0698 *tests/data/fate/vsynth1-vc2-thaar.out.rawvideo
 stddev:    1.88 PSNR: 42.61 MAXDIFF:   23 bytes:  7603200/   760320
diff --git a/tests/ref/vsynth/vsynth2-avui b/tests/ref/vsynth/vsynth2-avui
index 2423916..f4666ee 100644
--- a/tests/ref/vsynth/vsynth2-avui
+++ b/tests/ref/vsynth/vsynth2-avui
@@ -1,4 +1,4 @@
-8f6ab410bb6b5dc4599e12968dbd0366 *tests/data/fate/vsynth2-avui.mov
+4a08755db5e09933a45178bc6f5f61b6 *tests/data/fate/vsynth2-avui.mov
 42625037 tests/data/fate/vsynth2-avui.mov
 36d7ca943916e1743cefa609eba0205c *tests/data/fate/vsynth2-avui.out.rawvideo
 stddev:    0.00 PSNR:999.99 MAXDIFF:    0 bytes:  7603200/  7603200
diff --git a/tests/ref/vsynth/vsynth2-dnxhd-1080i b/tests/ref/vsynth/vsynth2-dnxhd-1080i
index eabb6a2..0668a44 100644
--- a/tests/ref/vsynth/vsynth2-dnxhd-1080i
+++ b/tests/ref/vsynth/vsynth2-dnxhd-1080i
@@ -1,4 +1,4 @@
-2b75889122f8d918e1b068d128b618ca *tests/data/fate/vsynth2-dnxhd-1080i.mov
+0067903558c99e3abed402ed65297735 *tests/data/fate/vsynth2-dnxhd-1080i.mov
 3031911 tests/data/fate/vsynth2-dnxhd-1080i.mov
 e941d2587cfeccddc450da7f41f7f911 *tests/data/fate/vsynth2-dnxhd-1080i.out.rawvideo
 stddev:    1.50 PSNR: 44.56 MAXDIFF:   31 bytes:  7603200/   760320
diff --git a/tests/ref/vsynth/vsynth2-dnxhd-1080i-10bit b/tests/ref/vsynth/vsynth2-dnxhd-1080i-10bit
index 3361c93..7689e2c 100644
--- a/tests/ref/vsynth/vsynth2-dnxhd-1080i-10bit
+++ b/tests/ref/vsynth/vsynth2-dnxhd-1080i-10bit
@@ -1,4 +1,4 @@
-514607eecfd9004aa4da1d216f7620ce *tests/data/fate/vsynth2-dnxhd-1080i-10bit.mov
+16e86953a697e1e7f9d80903ff4fef0c *tests/data/fate/vsynth2-dnxhd-1080i-10bit.mov
 4588391 tests/data/fate/vsynth2-dnxhd-1080i-10bit.mov
 e4ca9be476869afb94962d945f90bdf6 *tests/data/fate/vsynth2-dnxhd-1080i-10bit.out.rawvideo
 stddev:    1.57 PSNR: 44.18 MAXDIFF:   33 bytes:  7603200/   760320
diff --git a/tests/ref/vsynth/vsynth2-dnxhd-1080i-colr b/tests/ref/vsynth/vsynth2-dnxhd-1080i-colr
index 06731a8..f5ac604 100644
--- a/tests/ref/vsynth/vsynth2-dnxhd-1080i-colr
+++ b/tests/ref/vsynth/vsynth2-dnxhd-1080i-colr
@@ -1,4 +1,4 @@
-f9827e9867b0ea4f7585d8e362a58413 *tests/data/fate/vsynth2-dnxhd-1080i-colr.mov
+eee674d012c850c1d2bb5e816b668cdf *tests/data/fate/vsynth2-dnxhd-1080i-colr.mov
 3031929 tests/data/fate/vsynth2-dnxhd-1080i-colr.mov
 ec40a8014b819d02951b2f06bee7b514 *tests/data/fate/vsynth2-dnxhd-1080i-colr.out.rawvideo
 stddev:    1.54 PSNR: 44.33 MAXDIFF:   33 bytes:  7603200/   760320
diff --git a/tests/ref/vsynth/vsynth2-dnxhd-hr-hq-mov b/tests/ref/vsynth/vsynth2-dnxhd-hr-hq-mov
index ab49a3a..b8d3ab9 100644
--- a/tests/ref/vsynth/vsynth2-dnxhd-hr-hq-mov
+++ b/tests/ref/vsynth/vsynth2-dnxhd-hr-hq-mov
@@ -1,4 +1,4 @@
-a15a4d267dcaeba7a366733be0b508df *tests/data/fate/vsynth2-dnxhd-hr-hq-mov.mov
+a71fffeebf680f52aaae2df02b85d2fe *tests/data/fate/vsynth2-dnxhd-hr-hq-mov.mov
 4772599 tests/data/fate/vsynth2-dnxhd-hr-hq-mov.mov
 9c087836b5e07bddb96533d27939219f *tests/data/fate/vsynth2-dnxhd-hr-hq-mov.out.rawvideo
 stddev:    1.56 PSNR: 44.25 MAXDIFF:   33 bytes:  7603200/   760320
diff --git a/tests/ref/vsynth/vsynth2-dnxhd-hr-lb-mov b/tests/ref/vsynth/vsynth2-dnxhd-hr-lb-mov
index 1f0f496..9370d87 100644
--- a/tests/ref/vsynth/vsynth2-dnxhd-hr-lb-mov
+++ b/tests/ref/vsynth/vsynth2-dnxhd-hr-lb-mov
@@ -1,4 +1,4 @@
-f8c366051fb16025e97f1bf78f13e1af *tests/data/fate/vsynth2-dnxhd-hr-lb-mov.mov
+6a514f231b36542a3bc6af90bbc04dcd *tests/data/fate/vsynth2-dnxhd-hr-lb-mov.mov
 3748599 tests/data/fate/vsynth2-dnxhd-hr-lb-mov.mov
 6d4cdd8822ead300690af9ce52db037c *tests/data/fate/vsynth2-dnxhd-hr-lb-mov.out.rawvideo
 stddev:    1.52 PSNR: 44.49 MAXDIFF:   33 bytes:  7603200/   760320
diff --git a/tests/ref/vsynth/vsynth2-dnxhd-hr-sq-mov b/tests/ref/vsynth/vsynth2-dnxhd-hr-sq-mov
index 7bffbed..0b8e957 100644
--- a/tests/ref/vsynth/vsynth2-dnxhd-hr-sq-mov
+++ b/tests/ref/vsynth/vsynth2-dnxhd-hr-sq-mov
@@ -1,4 +1,4 @@
-863b1780cfdabfd713ddf722792a5e61 *tests/data/fate/vsynth2-dnxhd-hr-sq-mov.mov
+2398b73a57a5ae4c4cd54b3ebb796bfb *tests/data/fate/vsynth2-dnxhd-hr-sq-mov.mov
 2560763 tests/data/fate/vsynth2-dnxhd-hr-sq-mov.mov
 ba86d472b3f160e2f1d00cf569231e3f *tests/data/fate/vsynth2-dnxhd-hr-sq-mov.out.rawvideo
 stddev:    1.58 PSNR: 44.13 MAXDIFF:   35 bytes:  7603200/   760320
diff --git a/tests/ref/vsynth/vsynth2-dv-fhd b/tests/ref/vsynth/vsynth2-dv-fhd
new file mode 100644
index 0000000..948bf22
--- /dev/null
+++ b/tests/ref/vsynth/vsynth2-dv-fhd
@@ -0,0 +1,4 @@
+1f96ce7c1a5f09ec9d30c51c7271cf77 *tests/data/fate/vsynth2-dv-fhd.dv
+28800000 tests/data/fate/vsynth2-dv-fhd.dv
+cff30e2430730522bf67c6d94cf1352e *tests/data/fate/vsynth2-dv-fhd.out.rawvideo
+stddev:    1.16 PSNR: 46.82 MAXDIFF:   21 bytes:  7603200/  7603200
diff --git a/tests/ref/vsynth/vsynth2-dv-hd b/tests/ref/vsynth/vsynth2-dv-hd
new file mode 100644
index 0000000..c6dcb5a
--- /dev/null
+++ b/tests/ref/vsynth/vsynth2-dv-hd
@@ -0,0 +1,4 @@
+4270e5d552e0a05193f44bff75c2d271 *tests/data/fate/vsynth2-dv-hd.dv
+14400000 tests/data/fate/vsynth2-dv-hd.dv
+15dbe911532aca81c67bdd2846419027 *tests/data/fate/vsynth2-dv-hd.out.rawvideo
+stddev:    1.75 PSNR: 43.26 MAXDIFF:   34 bytes:  7603200/  7603200
diff --git a/tests/ref/vsynth/vsynth2-mov-bgr24 b/tests/ref/vsynth/vsynth2-mov-bgr24
index 8d9adc1..1db6aee 100644
--- a/tests/ref/vsynth/vsynth2-mov-bgr24
+++ b/tests/ref/vsynth/vsynth2-mov-bgr24
@@ -1,4 +1,4 @@
-ed8dbb665820659d9c4fa659e0a20c65 *tests/data/fate/vsynth2-mov-bgr24.mov
+1c5a5b9e299c5e02e757d8be98999cf4 *tests/data/fate/vsynth2-mov-bgr24.mov
 15207169 tests/data/fate/vsynth2-mov-bgr24.mov
 32fae3e665407bb4317b3f90fedb903c *tests/data/fate/vsynth2-mov-bgr24.out.rawvideo
 stddev:    1.54 PSNR: 44.37 MAXDIFF:   17 bytes:  7603200/  7603200
diff --git a/tests/ref/vsynth/vsynth2-mov-bpp15 b/tests/ref/vsynth/vsynth2-mov-bpp15
index c61b88a..ce1c13a 100644
--- a/tests/ref/vsynth/vsynth2-mov-bpp15
+++ b/tests/ref/vsynth/vsynth2-mov-bpp15
@@ -1,4 +1,4 @@
-d694493c1fe20211e12d797620d622ec *tests/data/fate/vsynth2-mov-bpp15.mov
+a004683db50f49520abd74479b25cbd1 *tests/data/fate/vsynth2-mov-bpp15.mov
 10138329 tests/data/fate/vsynth2-mov-bpp15.mov
 eb3f0c974ed17ede7cd3ce30ce417d8d *tests/data/fate/vsynth2-mov-bpp15.out.rawvideo
 stddev:    2.81 PSNR: 39.14 MAXDIFF:   19 bytes:  7603200/  7603200
diff --git a/tests/ref/vsynth/vsynth2-mov-bpp16 b/tests/ref/vsynth/vsynth2-mov-bpp16
index 1839e55..f7f40c5 100644
--- a/tests/ref/vsynth/vsynth2-mov-bpp16
+++ b/tests/ref/vsynth/vsynth2-mov-bpp16
@@ -1,4 +1,4 @@
-c2685405eaec39007a68108c4533ba0e *tests/data/fate/vsynth2-mov-bpp16.mov
+b7ffee543580662d2cae327233816fca *tests/data/fate/vsynth2-mov-bpp16.mov
 10138329 tests/data/fate/vsynth2-mov-bpp16.mov
 7747ab837f0e832be2124120d4f7df1c *tests/data/fate/vsynth2-mov-bpp16.out.rawvideo
 stddev:    2.21 PSNR: 41.24 MAXDIFF:   18 bytes:  7603200/  7603200
diff --git a/tests/ref/vsynth/vsynth2-prores b/tests/ref/vsynth/vsynth2-prores
index a1b4bb7..8e48cb0 100644
--- a/tests/ref/vsynth/vsynth2-prores
+++ b/tests/ref/vsynth/vsynth2-prores
@@ -1,4 +1,4 @@
-aa57fd1221b7eefaf1f34f9d57d6a7cb *tests/data/fate/vsynth2-prores.mov
-3265056 tests/data/fate/vsynth2-prores.mov
-537b0ff66d7c8c3c12faa89d042e6a49 *tests/data/fate/vsynth2-prores.out.rawvideo
+a38660faa093dbc8a1ae8e570b6e595b *tests/data/fate/vsynth2-prores.mov
+3260123 tests/data/fate/vsynth2-prores.mov
+416fa8773615889c70491452428d6710 *tests/data/fate/vsynth2-prores.out.rawvideo
 stddev:    1.38 PSNR: 45.29 MAXDIFF:   12 bytes:  7603200/  7603200
diff --git a/tests/ref/vsynth/vsynth2-prores_444 b/tests/ref/vsynth/vsynth2-prores_444
new file mode 100644
index 0000000..c6084f5
--- /dev/null
+++ b/tests/ref/vsynth/vsynth2-prores_444
@@ -0,0 +1,4 @@
+21f973c4c6076ea21f82d5fe486c0c98 *tests/data/fate/vsynth2-prores_444.mov
+5219722 tests/data/fate/vsynth2-prores_444.mov
+e425b6af7afa51b5e64fc529528b3691 *tests/data/fate/vsynth2-prores_444.out.rawvideo
+stddev:    0.88 PSNR: 49.18 MAXDIFF:   14 bytes:  7603200/  7603200
diff --git a/tests/ref/vsynth/vsynth2-prores_444_int b/tests/ref/vsynth/vsynth2-prores_444_int
new file mode 100644
index 0000000..a727bb2
--- /dev/null
+++ b/tests/ref/vsynth/vsynth2-prores_444_int
@@ -0,0 +1,4 @@
+500a8249bc63ec6bb79f816bce5b6db1 *tests/data/fate/vsynth2-prores_444_int.mov
+6420787 tests/data/fate/vsynth2-prores_444_int.mov
+33a5db4f0423168d4ae4f1db3610928e *tests/data/fate/vsynth2-prores_444_int.out.rawvideo
+stddev:    0.93 PSNR: 48.73 MAXDIFF:   14 bytes:  7603200/  7603200
diff --git a/tests/ref/vsynth/vsynth2-prores_int b/tests/ref/vsynth/vsynth2-prores_int
new file mode 100644
index 0000000..0f27acd
--- /dev/null
+++ b/tests/ref/vsynth/vsynth2-prores_int
@@ -0,0 +1,4 @@
+dd7835992e7a30b7be9014916411b5b3 *tests/data/fate/vsynth2-prores_int.mov
+4070996 tests/data/fate/vsynth2-prores_int.mov
+bef9e38387a1fbb1ce2e4401b6d41674 *tests/data/fate/vsynth2-prores_int.out.rawvideo
+stddev:    1.54 PSNR: 44.37 MAXDIFF:   13 bytes:  7603200/  7603200
diff --git a/tests/ref/vsynth/vsynth2-prores_ks b/tests/ref/vsynth/vsynth2-prores_ks
index b42e7b3..5186f55 100644
--- a/tests/ref/vsynth/vsynth2-prores_ks
+++ b/tests/ref/vsynth/vsynth2-prores_ks
@@ -1,4 +1,4 @@
-00c75fc738859e41c48cbe36ad60c2e2 *tests/data/fate/vsynth2-prores_ks.mov
+abde4f84a5e4060492e3d8fcb56f2467 *tests/data/fate/vsynth2-prores_ks.mov
 3868162 tests/data/fate/vsynth2-prores_ks.mov
 fe7ad707205c6100e9a3956d4e1c300e *tests/data/fate/vsynth2-prores_ks.out.rawvideo
 stddev:    1.17 PSNR: 46.72 MAXDIFF:   14 bytes:  7603200/  7603200
diff --git a/tests/ref/vsynth/vsynth2-qtrle b/tests/ref/vsynth/vsynth2-qtrle
index 4adf913..8593845 100644
--- a/tests/ref/vsynth/vsynth2-qtrle
+++ b/tests/ref/vsynth/vsynth2-qtrle
@@ -1,4 +1,4 @@
-b44d1cd0bb4c1e7c57d668bd9c1d319a *tests/data/fate/vsynth2-qtrle.mov
+492bef0aea081c076307d668d94fb9c4 *tests/data/fate/vsynth2-qtrle.mov
 14035926 tests/data/fate/vsynth2-qtrle.mov
 32fae3e665407bb4317b3f90fedb903c *tests/data/fate/vsynth2-qtrle.out.rawvideo
 stddev:    1.54 PSNR: 44.37 MAXDIFF:   17 bytes:  7603200/  7603200
diff --git a/tests/ref/vsynth/vsynth2-qtrlegray b/tests/ref/vsynth/vsynth2-qtrlegray
index 824e64b..b92d245 100644
--- a/tests/ref/vsynth/vsynth2-qtrlegray
+++ b/tests/ref/vsynth/vsynth2-qtrlegray
@@ -1,4 +1,4 @@
-4910471607743da624ef7339637a33e2 *tests/data/fate/vsynth2-qtrlegray.mov
+109c88cbb3528378c1e848e50cf1792d *tests/data/fate/vsynth2-qtrlegray.mov
 4988372 tests/data/fate/vsynth2-qtrlegray.mov
 510a92a21b552c51fcafab8188982f4d *tests/data/fate/vsynth2-qtrlegray.out.rawvideo
 stddev:   16.31 PSNR: 23.88 MAXDIFF:   89 bytes:  7603200/  7603200
diff --git a/tests/ref/vsynth/vsynth2-r210 b/tests/ref/vsynth/vsynth2-r210
index dc5ff18..5efd87d 100644
--- a/tests/ref/vsynth/vsynth2-r210
+++ b/tests/ref/vsynth/vsynth2-r210
@@ -1,4 +1,4 @@
-2f928096d892ce0239832afc369e117c *tests/data/fate/vsynth2-r210.avi
+9a27c0c96f9e658d610d2590b61416a1 *tests/data/fate/vsynth2-r210.avi
 22125252 tests/data/fate/vsynth2-r210.avi
-2ade5f6167d7a4a1589e168ddbbc35d0 *tests/data/fate/vsynth2-r210.out.rawvideo
-stddev:    1.17 PSNR: 46.71 MAXDIFF:   15 bytes:  7603200/  7603200
+d43196c64fd611f6e9c046e0ef3e570e *tests/data/fate/vsynth2-r210.out.rawvideo
+stddev:    1.37 PSNR: 45.34 MAXDIFF:   14 bytes:  7603200/  7603200
diff --git a/tests/ref/vsynth/vsynth2-svq1 b/tests/ref/vsynth/vsynth2-svq1
index 9c7db7f..4a50775 100644
--- a/tests/ref/vsynth/vsynth2-svq1
+++ b/tests/ref/vsynth/vsynth2-svq1
@@ -1,4 +1,4 @@
-c767386f0f6f36b554d278592bc6e9a4 *tests/data/fate/vsynth2-svq1.mov
+1c12440c323bc8ace5464587b5369c4a *tests/data/fate/vsynth2-svq1.mov
 940289 tests/data/fate/vsynth2-svq1.mov
 a8cd3b833cd7f570ddbf1e6b3eb125b6 *tests/data/fate/vsynth2-svq1.out.rawvideo
 stddev:    3.71 PSNR: 36.72 MAXDIFF:  210 bytes:  7603200/  7603200
diff --git a/tests/ref/vsynth/vsynth2-vc2-420p b/tests/ref/vsynth/vsynth2-vc2-420p
index f355e8d..28c1aed 100644
--- a/tests/ref/vsynth/vsynth2-vc2-420p
+++ b/tests/ref/vsynth/vsynth2-vc2-420p
@@ -1,4 +1,4 @@
-ac4df937fed73532bd8713b0e07870c9 *tests/data/fate/vsynth2-vc2-420p.mov
+78daa3a27c0630aa37024121a43a7908 *tests/data/fate/vsynth2-vc2-420p.mov
 860743 tests/data/fate/vsynth2-vc2-420p.mov
 01389f7ae4f2a3dc0d7b8384d435fd83 *tests/data/fate/vsynth2-vc2-420p.out.rawvideo
 stddev:    0.00 PSNR:999.99 MAXDIFF:    0 bytes:  7603200/   760320
diff --git a/tests/ref/vsynth/vsynth2-vc2-420p10 b/tests/ref/vsynth/vsynth2-vc2-420p10
index 48d97d6..12b5fe0 100644
--- a/tests/ref/vsynth/vsynth2-vc2-420p10
+++ b/tests/ref/vsynth/vsynth2-vc2-420p10
@@ -1,4 +1,4 @@
-1197f8108683b9eb6b0777adb2db1aa8 *tests/data/fate/vsynth2-vc2-420p10.mov
+e4627f308056d82de52a849b3a07b415 *tests/data/fate/vsynth2-vc2-420p10.mov
 1181271 tests/data/fate/vsynth2-vc2-420p10.mov
 01389f7ae4f2a3dc0d7b8384d435fd83 *tests/data/fate/vsynth2-vc2-420p10.out.rawvideo
 stddev:    0.00 PSNR:999.99 MAXDIFF:    0 bytes:  7603200/   760320
diff --git a/tests/ref/vsynth/vsynth2-vc2-420p12 b/tests/ref/vsynth/vsynth2-vc2-420p12
index 9b9ccb8..dc67229 100644
--- a/tests/ref/vsynth/vsynth2-vc2-420p12
+++ b/tests/ref/vsynth/vsynth2-vc2-420p12
@@ -1,4 +1,4 @@
-0e6b3aefd70fca45e67dc8cbc99640e8 *tests/data/fate/vsynth2-vc2-420p12.mov
+8ff2cd721eae2e95d91568dde88a9970 *tests/data/fate/vsynth2-vc2-420p12.mov
 1525079 tests/data/fate/vsynth2-vc2-420p12.mov
 01389f7ae4f2a3dc0d7b8384d435fd83 *tests/data/fate/vsynth2-vc2-420p12.out.rawvideo
 stddev:    0.00 PSNR:999.99 MAXDIFF:    0 bytes:  7603200/   760320
diff --git a/tests/ref/vsynth/vsynth2-vc2-422p b/tests/ref/vsynth/vsynth2-vc2-422p
index 83689a7..b53ca28 100644
--- a/tests/ref/vsynth/vsynth2-vc2-422p
+++ b/tests/ref/vsynth/vsynth2-vc2-422p
@@ -1,4 +1,4 @@
-b2573399e0ed62ede66b1708de86412a *tests/data/fate/vsynth2-vc2-422p.mov
+2a5213e25c03b60685e8467dfb11883c *tests/data/fate/vsynth2-vc2-422p.mov
 1035207 tests/data/fate/vsynth2-vc2-422p.mov
 c14eb0038a5dba9382f42f750d46ed3c *tests/data/fate/vsynth2-vc2-422p.out.rawvideo
 stddev:    0.35 PSNR: 57.21 MAXDIFF:    7 bytes:  7603200/   760320
diff --git a/tests/ref/vsynth/vsynth2-vc2-422p10 b/tests/ref/vsynth/vsynth2-vc2-422p10
index af9a0b1..12b5bbe 100644
--- a/tests/ref/vsynth/vsynth2-vc2-422p10
+++ b/tests/ref/vsynth/vsynth2-vc2-422p10
@@ -1,4 +1,4 @@
-ca65de033b17c67be94356e0b6e0b128 *tests/data/fate/vsynth2-vc2-422p10.mov
+6a99394db4353cc092e6bd9697e836ef *tests/data/fate/vsynth2-vc2-422p10.mov
 1321687 tests/data/fate/vsynth2-vc2-422p10.mov
 8f629e5cea24cc804d6aeadceacf0b2a *tests/data/fate/vsynth2-vc2-422p10.out.rawvideo
 stddev:    0.37 PSNR: 56.66 MAXDIFF:    7 bytes:  7603200/   760320
diff --git a/tests/ref/vsynth/vsynth2-vc2-422p12 b/tests/ref/vsynth/vsynth2-vc2-422p12
index 16f978a..c1ac221 100644
--- a/tests/ref/vsynth/vsynth2-vc2-422p12
+++ b/tests/ref/vsynth/vsynth2-vc2-422p12
@@ -1,4 +1,4 @@
-4e95706b063adbcc1f7f82a4e7d7d027 *tests/data/fate/vsynth2-vc2-422p12.mov
+ef1f1484a569008ba64803f25b06df54 *tests/data/fate/vsynth2-vc2-422p12.mov
 1752535 tests/data/fate/vsynth2-vc2-422p12.mov
 7241b922e7c17d14701567db6c743a9e *tests/data/fate/vsynth2-vc2-422p12.out.rawvideo
 stddev:    0.37 PSNR: 56.73 MAXDIFF:    7 bytes:  7603200/   760320
diff --git a/tests/ref/vsynth/vsynth2-vc2-444p b/tests/ref/vsynth/vsynth2-vc2-444p
index 8397996..f356056 100644
--- a/tests/ref/vsynth/vsynth2-vc2-444p
+++ b/tests/ref/vsynth/vsynth2-vc2-444p
@@ -1,4 +1,4 @@
-644a39d1b853f44722a4332d5a13797e *tests/data/fate/vsynth2-vc2-444p.mov
+a2cae781cdec41c7128a6cc71fbf6b3b *tests/data/fate/vsynth2-vc2-444p.mov
 1202386 tests/data/fate/vsynth2-vc2-444p.mov
 6b35f3ddc3b52f4424237d4191a2461f *tests/data/fate/vsynth2-vc2-444p.out.rawvideo
 stddev:    0.44 PSNR: 55.07 MAXDIFF:   10 bytes:  7603200/   760320
diff --git a/tests/ref/vsynth/vsynth2-vc2-444p10 b/tests/ref/vsynth/vsynth2-vc2-444p10
index 7d9367a..7a94bcd 100644
--- a/tests/ref/vsynth/vsynth2-vc2-444p10
+++ b/tests/ref/vsynth/vsynth2-vc2-444p10
@@ -1,4 +1,4 @@
-36cfc3da2ab6ff6d48f17ab43e77774d *tests/data/fate/vsynth2-vc2-444p10.mov
+77b67d38ccb0d0e8d6c0af256afb1496 *tests/data/fate/vsynth2-vc2-444p10.mov
 1603927 tests/data/fate/vsynth2-vc2-444p10.mov
 d5c80ee1881a0306b0487e3c868529a3 *tests/data/fate/vsynth2-vc2-444p10.out.rawvideo
 stddev:    0.48 PSNR: 54.46 MAXDIFF:   10 bytes:  7603200/   760320
diff --git a/tests/ref/vsynth/vsynth2-vc2-444p12 b/tests/ref/vsynth/vsynth2-vc2-444p12
index 0009830..fbd98ff 100644
--- a/tests/ref/vsynth/vsynth2-vc2-444p12
+++ b/tests/ref/vsynth/vsynth2-vc2-444p12
@@ -1,4 +1,4 @@
-6117c2ee6d5c22ee5a0b0ac6b70e6c17 *tests/data/fate/vsynth2-vc2-444p12.mov
+1b535238247c0cdca338f2927e2c8c37 *tests/data/fate/vsynth2-vc2-444p12.mov
 2145499 tests/data/fate/vsynth2-vc2-444p12.mov
 38836be5c12b951c9b280d15fe3b31ce *tests/data/fate/vsynth2-vc2-444p12.out.rawvideo
 stddev:    0.48 PSNR: 54.46 MAXDIFF:   10 bytes:  7603200/   760320
diff --git a/tests/ref/vsynth/vsynth2-vc2-t5_3 b/tests/ref/vsynth/vsynth2-vc2-t5_3
index c4ac50d..c4100ac 100644
--- a/tests/ref/vsynth/vsynth2-vc2-t5_3
+++ b/tests/ref/vsynth/vsynth2-vc2-t5_3
@@ -1,4 +1,4 @@
-654f04ae4f5947f0d354025fee1f37e0 *tests/data/fate/vsynth2-vc2-t5_3.mov
+89aa19c48c8f1ba7c418102706980efa *tests/data/fate/vsynth2-vc2-t5_3.mov
 1335772 tests/data/fate/vsynth2-vc2-t5_3.mov
 8f629e5cea24cc804d6aeadceacf0b2a *tests/data/fate/vsynth2-vc2-t5_3.out.rawvideo
 stddev:    0.37 PSNR: 56.66 MAXDIFF:    7 bytes:  7603200/   760320
diff --git a/tests/ref/vsynth/vsynth2-vc2-thaar b/tests/ref/vsynth/vsynth2-vc2-thaar
index fe69817..d4f37df 100644
--- a/tests/ref/vsynth/vsynth2-vc2-thaar
+++ b/tests/ref/vsynth/vsynth2-vc2-thaar
@@ -1,4 +1,4 @@
-51b03663f4187f4eea11c5311669a2cc *tests/data/fate/vsynth2-vc2-thaar.mov
+866641af5f57980f9da4c78c105155f1 *tests/data/fate/vsynth2-vc2-thaar.mov
 1470300 tests/data/fate/vsynth2-vc2-thaar.mov
 8f629e5cea24cc804d6aeadceacf0b2a *tests/data/fate/vsynth2-vc2-thaar.out.rawvideo
 stddev:    0.37 PSNR: 56.66 MAXDIFF:    7 bytes:  7603200/   760320
diff --git a/tests/ref/vsynth/vsynth3-dnxhd-1080i-10bit b/tests/ref/vsynth/vsynth3-dnxhd-1080i-10bit
index 006af6c..2a040e1 100644
--- a/tests/ref/vsynth/vsynth3-dnxhd-1080i-10bit
+++ b/tests/ref/vsynth/vsynth3-dnxhd-1080i-10bit
@@ -1,4 +1,4 @@
-dea8862f8ae9fb03f665f358dde75962 *tests/data/fate/vsynth3-dnxhd-1080i-10bit.mov
+4e6185e273297061def8e0b7fabff71b *tests/data/fate/vsynth3-dnxhd-1080i-10bit.mov
 4588391 tests/data/fate/vsynth3-dnxhd-1080i-10bit.mov
 c192f36ef8687e56c72a3dc416c7e191 *tests/data/fate/vsynth3-dnxhd-1080i-10bit.out.rawvideo
 stddev:    6.92 PSNR: 31.32 MAXDIFF:   50 bytes:    86700/     8670
diff --git a/tests/ref/vsynth/vsynth3-dnxhd-1080i-colr b/tests/ref/vsynth/vsynth3-dnxhd-1080i-colr
index 8d7d3b6..08aa30d 100644
--- a/tests/ref/vsynth/vsynth3-dnxhd-1080i-colr
+++ b/tests/ref/vsynth/vsynth3-dnxhd-1080i-colr
@@ -1,4 +1,4 @@
-ee7a70832f37793b62642f770d988bdb *tests/data/fate/vsynth3-dnxhd-1080i-colr.mov
+92a2f67cf77abf3428fe2d4f53ba2027 *tests/data/fate/vsynth3-dnxhd-1080i-colr.mov
 3031929 tests/data/fate/vsynth3-dnxhd-1080i-colr.mov
 f907fd2d48bedbc5283fbfc3fb9f61a0 *tests/data/fate/vsynth3-dnxhd-1080i-colr.out.rawvideo
 stddev:    6.92 PSNR: 31.32 MAXDIFF:   50 bytes:    86700/     8670
diff --git a/tests/ref/vsynth/vsynth3-dnxhd-hr-hq-mov b/tests/ref/vsynth/vsynth3-dnxhd-hr-hq-mov
index e46e151..a5808dd 100644
--- a/tests/ref/vsynth/vsynth3-dnxhd-hr-hq-mov
+++ b/tests/ref/vsynth/vsynth3-dnxhd-hr-hq-mov
@@ -1,4 +1,4 @@
-ca442de6ac8971a1da0afed0ee7fbd18 *tests/data/fate/vsynth3-dnxhd-hr-hq-mov.mov
+1b9e337636198690850f102c7a987eae *tests/data/fate/vsynth3-dnxhd-hr-hq-mov.mov
 4772599 tests/data/fate/vsynth3-dnxhd-hr-hq-mov.mov
 aa2e6c13a1e7760a22fccfca9faacdf3 *tests/data/fate/vsynth3-dnxhd-hr-hq-mov.out.rawvideo
 stddev:    6.92 PSNR: 31.32 MAXDIFF:   50 bytes:    86700/     8670
diff --git a/tests/ref/vsynth/vsynth3-dnxhd-hr-lb-mov b/tests/ref/vsynth/vsynth3-dnxhd-hr-lb-mov
index f869caf..7a888c5 100644
--- a/tests/ref/vsynth/vsynth3-dnxhd-hr-lb-mov
+++ b/tests/ref/vsynth/vsynth3-dnxhd-hr-lb-mov
@@ -1,4 +1,4 @@
-921f16751950320d8da7a1dde215c2ff *tests/data/fate/vsynth3-dnxhd-hr-lb-mov.mov
+1ac0627cfcad3df568026aea4696901f *tests/data/fate/vsynth3-dnxhd-hr-lb-mov.mov
 3748599 tests/data/fate/vsynth3-dnxhd-hr-lb-mov.mov
 1a4d12fd893e4585944dd9c68fb23edf *tests/data/fate/vsynth3-dnxhd-hr-lb-mov.out.rawvideo
 stddev:    6.92 PSNR: 31.32 MAXDIFF:   50 bytes:    86700/     8670
diff --git a/tests/ref/vsynth/vsynth3-dnxhd-hr-sq-mov b/tests/ref/vsynth/vsynth3-dnxhd-hr-sq-mov
index b247ce7..bd94e68 100644
--- a/tests/ref/vsynth/vsynth3-dnxhd-hr-sq-mov
+++ b/tests/ref/vsynth/vsynth3-dnxhd-hr-sq-mov
@@ -1,4 +1,4 @@
-aa51e1aaf9bd8899e282096d2dcb4f25 *tests/data/fate/vsynth3-dnxhd-hr-sq-mov.mov
+3b1420fc4cb6de03ea4a7858f5a0438e *tests/data/fate/vsynth3-dnxhd-hr-sq-mov.mov
 2560763 tests/data/fate/vsynth3-dnxhd-hr-sq-mov.mov
 730c00cc5a24e13ee99a75789806cb28 *tests/data/fate/vsynth3-dnxhd-hr-sq-mov.out.rawvideo
 stddev:    6.91 PSNR: 31.33 MAXDIFF:   50 bytes:    86700/     8670
diff --git a/tests/ref/vsynth/vsynth3-dv-fhd b/tests/ref/vsynth/vsynth3-dv-fhd
new file mode 100644
index 0000000..08ca9ef
--- /dev/null
+++ b/tests/ref/vsynth/vsynth3-dv-fhd
@@ -0,0 +1,4 @@
+5b8b7f1dc31d7076af891e94c2e88c06 *tests/data/fate/vsynth3-dv-fhd.dv
+28800000 tests/data/fate/vsynth3-dv-fhd.dv
+a038ad7c3c09f776304ef7accdea9c74 *tests/data/fate/vsynth3-dv-fhd.out.rawvideo
+stddev:    0.00 PSNR:999.99 MAXDIFF:    0 bytes:    86700/    86700
diff --git a/tests/ref/vsynth/vsynth3-dv-hd b/tests/ref/vsynth/vsynth3-dv-hd
new file mode 100644
index 0000000..d069e69
--- /dev/null
+++ b/tests/ref/vsynth/vsynth3-dv-hd
@@ -0,0 +1,4 @@
+2f81f3ccec178ba2fd9d3e3b46f33670 *tests/data/fate/vsynth3-dv-hd.dv
+14400000 tests/data/fate/vsynth3-dv-hd.dv
+a038ad7c3c09f776304ef7accdea9c74 *tests/data/fate/vsynth3-dv-hd.out.rawvideo
+stddev:    0.00 PSNR:999.99 MAXDIFF:    0 bytes:    86700/    86700
diff --git a/tests/ref/vsynth/vsynth3-mov-bgr24 b/tests/ref/vsynth/vsynth3-mov-bgr24
index 9ceb69e..4fc3cc9 100644
--- a/tests/ref/vsynth/vsynth3-mov-bgr24
+++ b/tests/ref/vsynth/vsynth3-mov-bgr24
@@ -1,4 +1,4 @@
-9af1caa30e99cc422c8a0734051f7f95 *tests/data/fate/vsynth3-mov-bgr24.mov
+0141cd3b6e8eea836d392adf6949afc4 *tests/data/fate/vsynth3-mov-bgr24.mov
 174093 tests/data/fate/vsynth3-mov-bgr24.mov
 693aff10c094f8bd31693f74cf79d2b2 *tests/data/fate/vsynth3-mov-bgr24.out.rawvideo
 stddev:    3.67 PSNR: 36.82 MAXDIFF:   43 bytes:    86700/    86700
diff --git a/tests/ref/vsynth/vsynth3-mov-bpp15 b/tests/ref/vsynth/vsynth3-mov-bpp15
index dfee458..4c289cf 100644
--- a/tests/ref/vsynth/vsynth3-mov-bpp15
+++ b/tests/ref/vsynth/vsynth3-mov-bpp15
@@ -1,4 +1,4 @@
-3d64ea4e9c78e72fcedca5e00363db7b *tests/data/fate/vsynth3-mov-bpp15.mov
+96e1406b041b16e9598092d928ea9d3e *tests/data/fate/vsynth3-mov-bpp15.mov
 116293 tests/data/fate/vsynth3-mov-bpp15.mov
 19f61c34cbdef98b0f4aca6c19f59ed4 *tests/data/fate/vsynth3-mov-bpp15.out.rawvideo
 stddev:    4.35 PSNR: 35.35 MAXDIFF:   46 bytes:    86700/    86700
diff --git a/tests/ref/vsynth/vsynth3-mov-bpp16 b/tests/ref/vsynth/vsynth3-mov-bpp16
index 86c6d7a..55537d4 100644
--- a/tests/ref/vsynth/vsynth3-mov-bpp16
+++ b/tests/ref/vsynth/vsynth3-mov-bpp16
@@ -1,4 +1,4 @@
-ddff7831e0d3e950cee4fdb7fceeb76a *tests/data/fate/vsynth3-mov-bpp16.mov
+65b51e9a83da767fae244fd6816f2bc7 *tests/data/fate/vsynth3-mov-bpp16.mov
 116293 tests/data/fate/vsynth3-mov-bpp16.mov
 756f68dd5412d245d4bbeda7b5d51829 *tests/data/fate/vsynth3-mov-bpp16.out.rawvideo
 stddev:    4.07 PSNR: 35.93 MAXDIFF:   46 bytes:    86700/    86700
diff --git a/tests/ref/vsynth/vsynth3-prores b/tests/ref/vsynth/vsynth3-prores
index f63a7a7..8dfaf09 100644
--- a/tests/ref/vsynth/vsynth3-prores
+++ b/tests/ref/vsynth/vsynth3-prores
@@ -1,4 +1,4 @@
-b060c59be88b4b089ece5ee8dc4f1c58 *tests/data/fate/vsynth3-prores.mov
+3e6f1fd0e4fdad4a8dd351dec08b0bf5 *tests/data/fate/vsynth3-prores.mov
 105367 tests/data/fate/vsynth3-prores.mov
 fff5e7ad21d78501c8fa4749bf4bf289 *tests/data/fate/vsynth3-prores.out.rawvideo
 stddev:    2.80 PSNR: 39.17 MAXDIFF:   27 bytes:    86700/    86700
diff --git a/tests/ref/vsynth/vsynth3-prores_444 b/tests/ref/vsynth/vsynth3-prores_444
new file mode 100644
index 0000000..f05894b
--- /dev/null
+++ b/tests/ref/vsynth/vsynth3-prores_444
@@ -0,0 +1,4 @@
+3070da65c30c1a9905ee31c7ede1cf57 *tests/data/fate/vsynth3-prores_444.mov
+159127 tests/data/fate/vsynth3-prores_444.mov
+025b48feb3d9a9652983ef71e6cb7e7c *tests/data/fate/vsynth3-prores_444.out.rawvideo
+stddev:    3.21 PSNR: 37.98 MAXDIFF:   41 bytes:    86700/    86700
diff --git a/tests/ref/vsynth/vsynth3-prores_444_int b/tests/ref/vsynth/vsynth3-prores_444_int
new file mode 100644
index 0000000..f6ba6bc
--- /dev/null
+++ b/tests/ref/vsynth/vsynth3-prores_444_int
@@ -0,0 +1,4 @@
+c6279e0584575ffa1e2e13047cc7ecec *tests/data/fate/vsynth3-prores_444_int.mov
+184397 tests/data/fate/vsynth3-prores_444_int.mov
+a8852aa2841c2ce5f2aa86176ceda4ef *tests/data/fate/vsynth3-prores_444_int.out.rawvideo
+stddev:    3.24 PSNR: 37.91 MAXDIFF:   41 bytes:    86700/    86700
diff --git a/tests/ref/vsynth/vsynth3-prores_int b/tests/ref/vsynth/vsynth3-prores_int
new file mode 100644
index 0000000..c9b8ba6
--- /dev/null
+++ b/tests/ref/vsynth/vsynth3-prores_int
@@ -0,0 +1,4 @@
+6085fc27cc6cc7c02abc59ce914d85cb *tests/data/fate/vsynth3-prores_int.mov
+120484 tests/data/fate/vsynth3-prores_int.mov
+e5859ba47a99f9e53c1ddcaa68a8f8f8 *tests/data/fate/vsynth3-prores_int.out.rawvideo
+stddev:    2.92 PSNR: 38.81 MAXDIFF:   29 bytes:    86700/    86700
diff --git a/tests/ref/vsynth/vsynth3-prores_ks b/tests/ref/vsynth/vsynth3-prores_ks
index 99cfc13..561ee48 100644
--- a/tests/ref/vsynth/vsynth3-prores_ks
+++ b/tests/ref/vsynth/vsynth3-prores_ks
@@ -1,4 +1,4 @@
-7ceff8c9cffca766f8a167ba73dad0e2 *tests/data/fate/vsynth3-prores_ks.mov
+f6ce1e8e2272cea0592d3f969d48c1de *tests/data/fate/vsynth3-prores_ks.mov
 95053 tests/data/fate/vsynth3-prores_ks.mov
 9ab6d3e3cc7749796cd9fa984c60d890 *tests/data/fate/vsynth3-prores_ks.out.rawvideo
 stddev:    4.09 PSNR: 35.88 MAXDIFF:   35 bytes:    86700/    86700
diff --git a/tests/ref/vsynth/vsynth3-qtrle b/tests/ref/vsynth/vsynth3-qtrle
index 6f93232..2056e1b 100644
--- a/tests/ref/vsynth/vsynth3-qtrle
+++ b/tests/ref/vsynth/vsynth3-qtrle
@@ -1,4 +1,4 @@
-33ec7d4f0a18fcf6da3bdacb494e2035 *tests/data/fate/vsynth3-qtrle.mov
+b9152e4c2931818140086903c9d9a8ae *tests/data/fate/vsynth3-qtrle.mov
 179656 tests/data/fate/vsynth3-qtrle.mov
 693aff10c094f8bd31693f74cf79d2b2 *tests/data/fate/vsynth3-qtrle.out.rawvideo
 stddev:    3.67 PSNR: 36.82 MAXDIFF:   43 bytes:    86700/    86700
diff --git a/tests/ref/vsynth/vsynth3-r210 b/tests/ref/vsynth/vsynth3-r210
index 75c424c..253657c 100644
--- a/tests/ref/vsynth/vsynth3-r210
+++ b/tests/ref/vsynth/vsynth3-r210
@@ -1,4 +1,4 @@
-229e700e0fab4e81481e99a70e00bec9 *tests/data/fate/vsynth3-r210.avi
+fd12f6dde75d0872ccf9012b342208de *tests/data/fate/vsynth3-r210.avi
 442052 tests/data/fate/vsynth3-r210.avi
-e1d882babc8754f7418aa91ce48f7ab0 *tests/data/fate/vsynth3-r210.out.rawvideo
-stddev:    3.48 PSNR: 37.28 MAXDIFF:   42 bytes:    86700/    86700
+a2c4e460ebede1109bd794b1b7b05a1f *tests/data/fate/vsynth3-r210.out.rawvideo
+stddev:    4.10 PSNR: 35.87 MAXDIFF:   48 bytes:    86700/    86700
diff --git a/tests/ref/vsynth/vsynth3-svq1 b/tests/ref/vsynth/vsynth3-svq1
index b51fa03..e760abb 100644
--- a/tests/ref/vsynth/vsynth3-svq1
+++ b/tests/ref/vsynth/vsynth3-svq1
@@ -1,4 +1,4 @@
-1eaf318269afd7426406d73397c39a48 *tests/data/fate/vsynth3-svq1.mov
+1972e0df8be667443992e405cceec291 *tests/data/fate/vsynth3-svq1.mov
 40773 tests/data/fate/vsynth3-svq1.mov
 a1e5334cf67649bf8c7d95dc4d1bf148 *tests/data/fate/vsynth3-svq1.out.rawvideo
 stddev:   14.49 PSNR: 24.91 MAXDIFF:  183 bytes:    86700/    86700
diff --git a/tests/ref/vsynth/vsynth_lena-avui b/tests/ref/vsynth/vsynth_lena-avui
index c2fced8..f4e5ef9 100644
--- a/tests/ref/vsynth/vsynth_lena-avui
+++ b/tests/ref/vsynth/vsynth_lena-avui
@@ -1,4 +1,4 @@
-26805e15d9e732cd24aea91ae564d5c3 *tests/data/fate/vsynth_lena-avui.mov
+7b670636544a60f4fb2c153e3caabdee *tests/data/fate/vsynth_lena-avui.mov
 42625037 tests/data/fate/vsynth_lena-avui.mov
 dde5895817ad9d219f79a52d0bdfb001 *tests/data/fate/vsynth_lena-avui.out.rawvideo
 stddev:    0.00 PSNR:999.99 MAXDIFF:    0 bytes:  7603200/  7603200
diff --git a/tests/ref/vsynth/vsynth_lena-dnxhd-1080i b/tests/ref/vsynth/vsynth_lena-dnxhd-1080i
index 16702db..ae5c515 100644
--- a/tests/ref/vsynth/vsynth_lena-dnxhd-1080i
+++ b/tests/ref/vsynth/vsynth_lena-dnxhd-1080i
@@ -1,4 +1,4 @@
-f7412afbcb4454692f7492f6710189e3 *tests/data/fate/vsynth_lena-dnxhd-1080i.mov
+1bb94b5a7917c1d81f3a92dd9b5b66ae *tests/data/fate/vsynth_lena-dnxhd-1080i.mov
 3031911 tests/data/fate/vsynth_lena-dnxhd-1080i.mov
 7d0ca92f12711535d57eff3609462b31 *tests/data/fate/vsynth_lena-dnxhd-1080i.out.rawvideo
 stddev:    1.29 PSNR: 45.87 MAXDIFF:   22 bytes:  7603200/   760320
diff --git a/tests/ref/vsynth/vsynth_lena-dnxhd-1080i-10bit b/tests/ref/vsynth/vsynth_lena-dnxhd-1080i-10bit
index 109e3d5..5112f2a 100644
--- a/tests/ref/vsynth/vsynth_lena-dnxhd-1080i-10bit
+++ b/tests/ref/vsynth/vsynth_lena-dnxhd-1080i-10bit
@@ -1,4 +1,4 @@
-72144676d0c6e320ff2c9b28bc3e4fa2 *tests/data/fate/vsynth_lena-dnxhd-1080i-10bit.mov
+55e1097376ac44e916528eee5ee2266e *tests/data/fate/vsynth_lena-dnxhd-1080i-10bit.mov
 4588391 tests/data/fate/vsynth_lena-dnxhd-1080i-10bit.mov
 f2dc4375c58e0406d442e0cb28573e91 *tests/data/fate/vsynth_lena-dnxhd-1080i-10bit.out.rawvideo
 stddev:    1.36 PSNR: 45.40 MAXDIFF:   22 bytes:  7603200/   760320
diff --git a/tests/ref/vsynth/vsynth_lena-dnxhd-1080i-colr b/tests/ref/vsynth/vsynth_lena-dnxhd-1080i-colr
index 8e43a3f..c21babb 100644
--- a/tests/ref/vsynth/vsynth_lena-dnxhd-1080i-colr
+++ b/tests/ref/vsynth/vsynth_lena-dnxhd-1080i-colr
@@ -1,4 +1,4 @@
-5ba3ddb58b10e5f0069cb4f82d594695 *tests/data/fate/vsynth_lena-dnxhd-1080i-colr.mov
+f80be8c3350ca8b22ae8aa8724b2ef20 *tests/data/fate/vsynth_lena-dnxhd-1080i-colr.mov
 3031929 tests/data/fate/vsynth_lena-dnxhd-1080i-colr.mov
 ce4993a69ef55c8c4b18138716f17b6f *tests/data/fate/vsynth_lena-dnxhd-1080i-colr.out.rawvideo
 stddev:    1.33 PSNR: 45.59 MAXDIFF:   22 bytes:  7603200/   760320
diff --git a/tests/ref/vsynth/vsynth_lena-dnxhd-hr-hq-mov b/tests/ref/vsynth/vsynth_lena-dnxhd-hr-hq-mov
index 9cea762..2d58c5e 100644
--- a/tests/ref/vsynth/vsynth_lena-dnxhd-hr-hq-mov
+++ b/tests/ref/vsynth/vsynth_lena-dnxhd-hr-hq-mov
@@ -1,4 +1,4 @@
-b232775e04c6a6a7995799db6cd8c255 *tests/data/fate/vsynth_lena-dnxhd-hr-hq-mov.mov
+f19dfcd4d9d7a0da1131c0dd909ad0ae *tests/data/fate/vsynth_lena-dnxhd-hr-hq-mov.mov
 4772599 tests/data/fate/vsynth_lena-dnxhd-hr-hq-mov.mov
 e6c3531cb32eb3d0c465c44098746fea *tests/data/fate/vsynth_lena-dnxhd-hr-hq-mov.out.rawvideo
 stddev:    1.34 PSNR: 45.54 MAXDIFF:   23 bytes:  7603200/   760320
diff --git a/tests/ref/vsynth/vsynth_lena-dnxhd-hr-lb-mov b/tests/ref/vsynth/vsynth_lena-dnxhd-hr-lb-mov
index a582b88..9047805 100644
--- a/tests/ref/vsynth/vsynth_lena-dnxhd-hr-lb-mov
+++ b/tests/ref/vsynth/vsynth_lena-dnxhd-hr-lb-mov
@@ -1,4 +1,4 @@
-2c6881ebb8efdb02189862f67cd72851 *tests/data/fate/vsynth_lena-dnxhd-hr-lb-mov.mov
+f27068c1444d2e11e094fab37eceb9d5 *tests/data/fate/vsynth_lena-dnxhd-hr-lb-mov.mov
 3748599 tests/data/fate/vsynth_lena-dnxhd-hr-lb-mov.mov
 0951de00b90d1bf34d2ff10a51db705d *tests/data/fate/vsynth_lena-dnxhd-hr-lb-mov.out.rawvideo
 stddev:    1.31 PSNR: 45.72 MAXDIFF:   21 bytes:  7603200/   760320
diff --git a/tests/ref/vsynth/vsynth_lena-dnxhd-hr-sq-mov b/tests/ref/vsynth/vsynth_lena-dnxhd-hr-sq-mov
index 80a6897..9a2db8a 100644
--- a/tests/ref/vsynth/vsynth_lena-dnxhd-hr-sq-mov
+++ b/tests/ref/vsynth/vsynth_lena-dnxhd-hr-sq-mov
@@ -1,4 +1,4 @@
-b3b2380b019f0f655af5d61caa76cf12 *tests/data/fate/vsynth_lena-dnxhd-hr-sq-mov.mov
+b1d5da9fd4811b87b1bf05afee6e44e4 *tests/data/fate/vsynth_lena-dnxhd-hr-sq-mov.mov
 2560763 tests/data/fate/vsynth_lena-dnxhd-hr-sq-mov.mov
 95e7da46fc066ed795de4ec1cf4d4ab5 *tests/data/fate/vsynth_lena-dnxhd-hr-sq-mov.out.rawvideo
 stddev:    1.35 PSNR: 45.51 MAXDIFF:   23 bytes:  7603200/   760320
diff --git a/tests/ref/vsynth/vsynth_lena-dv-fhd b/tests/ref/vsynth/vsynth_lena-dv-fhd
new file mode 100644
index 0000000..51a4505
--- /dev/null
+++ b/tests/ref/vsynth/vsynth_lena-dv-fhd
@@ -0,0 +1,4 @@
+3a33e512f8b3f4213477c98d4e7e2559 *tests/data/fate/vsynth_lena-dv-fhd.dv
+28800000 tests/data/fate/vsynth_lena-dv-fhd.dv
+b97e0a057202359ef93f2ec0b9fdfec4 *tests/data/fate/vsynth_lena-dv-fhd.out.rawvideo
+stddev:    1.03 PSNR: 47.80 MAXDIFF:   14 bytes:  7603200/  7603200
diff --git a/tests/ref/vsynth/vsynth_lena-dv-hd b/tests/ref/vsynth/vsynth_lena-dv-hd
new file mode 100644
index 0000000..aba756c
--- /dev/null
+++ b/tests/ref/vsynth/vsynth_lena-dv-hd
@@ -0,0 +1,4 @@
+01a61c53943a421fa6a5e03dbc205972 *tests/data/fate/vsynth_lena-dv-hd.dv
+14400000 tests/data/fate/vsynth_lena-dv-hd.dv
+4db4175c80ea1f16b7ec303611b8873a *tests/data/fate/vsynth_lena-dv-hd.out.rawvideo
+stddev:    1.49 PSNR: 44.66 MAXDIFF:   27 bytes:  7603200/  7603200
diff --git a/tests/ref/vsynth/vsynth_lena-mov-bgr24 b/tests/ref/vsynth/vsynth_lena-mov-bgr24
index 3117bf2..098dd91 100644
--- a/tests/ref/vsynth/vsynth_lena-mov-bgr24
+++ b/tests/ref/vsynth/vsynth_lena-mov-bgr24
@@ -1,4 +1,4 @@
-f1eccd8c8719e3fabfe7855dad997699 *tests/data/fate/vsynth_lena-mov-bgr24.mov
+3656f10647727ff16119ad54e11ed09d *tests/data/fate/vsynth_lena-mov-bgr24.mov
 15207169 tests/data/fate/vsynth_lena-mov-bgr24.mov
 98d0e2854731472c5bf13d8638502d0a *tests/data/fate/vsynth_lena-mov-bgr24.out.rawvideo
 stddev:    1.26 PSNR: 46.10 MAXDIFF:   13 bytes:  7603200/  7603200
diff --git a/tests/ref/vsynth/vsynth_lena-mov-bpp15 b/tests/ref/vsynth/vsynth_lena-mov-bpp15
index 2a7ddd6..7a61797 100644
--- a/tests/ref/vsynth/vsynth_lena-mov-bpp15
+++ b/tests/ref/vsynth/vsynth_lena-mov-bpp15
@@ -1,4 +1,4 @@
-286e9e0712da1efb186a7228b6d4a177 *tests/data/fate/vsynth_lena-mov-bpp15.mov
+846672fbdf449e0345cec63e1611661a *tests/data/fate/vsynth_lena-mov-bpp15.mov
 10138329 tests/data/fate/vsynth_lena-mov-bpp15.mov
 be0e64bdf519ce1097613063804eded9 *tests/data/fate/vsynth_lena-mov-bpp15.out.rawvideo
 stddev:    2.16 PSNR: 41.43 MAXDIFF:   17 bytes:  7603200/  7603200
diff --git a/tests/ref/vsynth/vsynth_lena-mov-bpp16 b/tests/ref/vsynth/vsynth_lena-mov-bpp16
index 2c478b9..4e4cb44 100644
--- a/tests/ref/vsynth/vsynth_lena-mov-bpp16
+++ b/tests/ref/vsynth/vsynth_lena-mov-bpp16
@@ -1,4 +1,4 @@
-1da4058a0cfb241d735ed46a0b18efa3 *tests/data/fate/vsynth_lena-mov-bpp16.mov
+f425fe7f36bd821d4afa260088542cf9 *tests/data/fate/vsynth_lena-mov-bpp16.mov
 10138329 tests/data/fate/vsynth_lena-mov-bpp16.mov
 789bfa1dc2a72f498928f2ae85e461c3 *tests/data/fate/vsynth_lena-mov-bpp16.out.rawvideo
 stddev:    1.76 PSNR: 43.18 MAXDIFF:   17 bytes:  7603200/  7603200
diff --git a/tests/ref/vsynth/vsynth_lena-prores b/tests/ref/vsynth/vsynth_lena-prores
index 5b8c3fe..573fc12 100644
--- a/tests/ref/vsynth/vsynth_lena-prores
+++ b/tests/ref/vsynth/vsynth_lena-prores
@@ -1,4 +1,4 @@
-637f34b5fd81f072f76a967595fa6af7 *tests/data/fate/vsynth_lena-prores.mov
+eed04261f5d5878ea3b91321420270a0 *tests/data/fate/vsynth_lena-prores.mov
 2844076 tests/data/fate/vsynth_lena-prores.mov
 03fd29e3963716a09d232b6f817ecb57 *tests/data/fate/vsynth_lena-prores.out.rawvideo
 stddev:    1.31 PSNR: 45.77 MAXDIFF:   11 bytes:  7603200/  7603200
diff --git a/tests/ref/vsynth/vsynth_lena-prores_444 b/tests/ref/vsynth/vsynth_lena-prores_444
new file mode 100644
index 0000000..2914123
--- /dev/null
+++ b/tests/ref/vsynth/vsynth_lena-prores_444
@@ -0,0 +1,4 @@
+b8677f9e1da7be861e8b7207028b3a9e *tests/data/fate/vsynth_lena-prores_444.mov
+4734395 tests/data/fate/vsynth_lena-prores_444.mov
+a704e05e3e0a451edef7515b25a76bb8 *tests/data/fate/vsynth_lena-prores_444.out.rawvideo
+stddev:    0.81 PSNR: 49.88 MAXDIFF:    8 bytes:  7603200/  7603200
diff --git a/tests/ref/vsynth/vsynth_lena-prores_444_int b/tests/ref/vsynth/vsynth_lena-prores_444_int
new file mode 100644
index 0000000..005ab68
--- /dev/null
+++ b/tests/ref/vsynth/vsynth_lena-prores_444_int
@@ -0,0 +1,4 @@
+38195b0437f6ae1c910ba108e7a799d1 *tests/data/fate/vsynth_lena-prores_444_int.mov
+5696258 tests/data/fate/vsynth_lena-prores_444_int.mov
+466380156e4d2b811f4ffb9c5a8bca72 *tests/data/fate/vsynth_lena-prores_444_int.out.rawvideo
+stddev:    0.88 PSNR: 49.23 MAXDIFF:    9 bytes:  7603200/  7603200
diff --git a/tests/ref/vsynth/vsynth_lena-prores_int b/tests/ref/vsynth/vsynth_lena-prores_int
new file mode 100644
index 0000000..3e31b01
--- /dev/null
+++ b/tests/ref/vsynth/vsynth_lena-prores_int
@@ -0,0 +1,4 @@
+f45bc9026780bbbcdbbcc0d54c21ef06 *tests/data/fate/vsynth_lena-prores_int.mov
+3532698 tests/data/fate/vsynth_lena-prores_int.mov
+eb5caa9824ca294f403cd13f33c40f23 *tests/data/fate/vsynth_lena-prores_int.out.rawvideo
+stddev:    1.47 PSNR: 44.78 MAXDIFF:   12 bytes:  7603200/  7603200
diff --git a/tests/ref/vsynth/vsynth_lena-prores_ks b/tests/ref/vsynth/vsynth_lena-prores_ks
index 0cdfa9b..333578b 100644
--- a/tests/ref/vsynth/vsynth_lena-prores_ks
+++ b/tests/ref/vsynth/vsynth_lena-prores_ks
@@ -1,4 +1,4 @@
-b03741c69037cbdcd2809278c00c0350 *tests/data/fate/vsynth_lena-prores_ks.mov
+86b9932d5f78d0b5836533e972a37a65 *tests/data/fate/vsynth_lena-prores_ks.mov
 3884596 tests/data/fate/vsynth_lena-prores_ks.mov
 6cfe987de99cf8ac9d43bdc5cd150838 *tests/data/fate/vsynth_lena-prores_ks.out.rawvideo
 stddev:    0.92 PSNR: 48.78 MAXDIFF:   10 bytes:  7603200/  7603200
diff --git a/tests/ref/vsynth/vsynth_lena-qtrle b/tests/ref/vsynth/vsynth_lena-qtrle
index 9ce6abe..f426fe0 100644
--- a/tests/ref/vsynth/vsynth_lena-qtrle
+++ b/tests/ref/vsynth/vsynth_lena-qtrle
@@ -1,4 +1,4 @@
-4863978263d966d704ffaaa6d23123bb *tests/data/fate/vsynth_lena-qtrle.mov
+513ca7d64af25676f5f99f00e2287ced *tests/data/fate/vsynth_lena-qtrle.mov
 14798345 tests/data/fate/vsynth_lena-qtrle.mov
 98d0e2854731472c5bf13d8638502d0a *tests/data/fate/vsynth_lena-qtrle.out.rawvideo
 stddev:    1.26 PSNR: 46.10 MAXDIFF:   13 bytes:  7603200/  7603200
diff --git a/tests/ref/vsynth/vsynth_lena-qtrlegray b/tests/ref/vsynth/vsynth_lena-qtrlegray
index 951e7a7..e0c18c9 100644
--- a/tests/ref/vsynth/vsynth_lena-qtrlegray
+++ b/tests/ref/vsynth/vsynth_lena-qtrlegray
@@ -1,4 +1,4 @@
-2c4e69b59d8e8e19903c843575806d5f *tests/data/fate/vsynth_lena-qtrlegray.mov
+8db6b52b706a91f483c37eaa2f011cfe *tests/data/fate/vsynth_lena-qtrlegray.mov
 5111283 tests/data/fate/vsynth_lena-qtrlegray.mov
 d7bfbe259af9ae323bb94b09c33570a5 *tests/data/fate/vsynth_lena-qtrlegray.out.rawvideo
 stddev:   18.65 PSNR: 22.72 MAXDIFF:   72 bytes:  7603200/  7603200
diff --git a/tests/ref/vsynth/vsynth_lena-r210 b/tests/ref/vsynth/vsynth_lena-r210
index 8fd1a66..0a113dc 100644
--- a/tests/ref/vsynth/vsynth_lena-r210
+++ b/tests/ref/vsynth/vsynth_lena-r210
@@ -1,4 +1,4 @@
-94874a48987fd401494f4d7ca8e1273b *tests/data/fate/vsynth_lena-r210.avi
+61fd53566d99b725e75212747b35893f *tests/data/fate/vsynth_lena-r210.avi
 22125252 tests/data/fate/vsynth_lena-r210.avi
-6ea4fcd93fc83defc8770e85b64b60bb *tests/data/fate/vsynth_lena-r210.out.rawvideo
-stddev:    0.70 PSNR: 51.12 MAXDIFF:   12 bytes:  7603200/  7603200
+4b7425191bb6a7fc4ca0dc649d9ba202 *tests/data/fate/vsynth_lena-r210.out.rawvideo
+stddev:    0.93 PSNR: 48.72 MAXDIFF:   11 bytes:  7603200/  7603200
diff --git a/tests/ref/vsynth/vsynth_lena-svq1 b/tests/ref/vsynth/vsynth_lena-svq1
index 1558c50..01c1b06 100644
--- a/tests/ref/vsynth/vsynth_lena-svq1
+++ b/tests/ref/vsynth/vsynth_lena-svq1
@@ -1,4 +1,4 @@
-6e9678439ab7460db1fcc8e41ca1a1e0 *tests/data/fate/vsynth_lena-svq1.mov
+a6398d8fd306cfe96dc41060335e67e8 *tests/data/fate/vsynth_lena-svq1.mov
 766701 tests/data/fate/vsynth_lena-svq1.mov
 aa03471dac3f49455a33a2b19fda1098 *tests/data/fate/vsynth_lena-svq1.out.rawvideo
 stddev:    3.23 PSNR: 37.93 MAXDIFF:   61 bytes:  7603200/  7603200
diff --git a/tests/ref/vsynth/vsynth_lena-vc2-420p b/tests/ref/vsynth/vsynth_lena-vc2-420p
index 89966c2..cdaca3c 100644
--- a/tests/ref/vsynth/vsynth_lena-vc2-420p
+++ b/tests/ref/vsynth/vsynth_lena-vc2-420p
@@ -1,4 +1,4 @@
-b920eaf484af9ed3fbff4a85d043b544 *tests/data/fate/vsynth_lena-vc2-420p.mov
+9e1e6da4f166d6d4998923ad52d047c9 *tests/data/fate/vsynth_lena-vc2-420p.mov
 849735 tests/data/fate/vsynth_lena-vc2-420p.mov
 b1c660113acab8eb4075f3d9fbb9cee9 *tests/data/fate/vsynth_lena-vc2-420p.out.rawvideo
 stddev:    0.00 PSNR:999.99 MAXDIFF:    0 bytes:  7603200/   760320
diff --git a/tests/ref/vsynth/vsynth_lena-vc2-420p10 b/tests/ref/vsynth/vsynth_lena-vc2-420p10
index 2558ef8..8ddb6ac 100644
--- a/tests/ref/vsynth/vsynth_lena-vc2-420p10
+++ b/tests/ref/vsynth/vsynth_lena-vc2-420p10
@@ -1,4 +1,4 @@
-5bccec653c330f03b90065a84fad9b4b *tests/data/fate/vsynth_lena-vc2-420p10.mov
+b989bdb42043851048f4b489463e585d *tests/data/fate/vsynth_lena-vc2-420p10.mov
 1154775 tests/data/fate/vsynth_lena-vc2-420p10.mov
 b1c660113acab8eb4075f3d9fbb9cee9 *tests/data/fate/vsynth_lena-vc2-420p10.out.rawvideo
 stddev:    0.00 PSNR:999.99 MAXDIFF:    0 bytes:  7603200/   760320
diff --git a/tests/ref/vsynth/vsynth_lena-vc2-420p12 b/tests/ref/vsynth/vsynth_lena-vc2-420p12
index bc60116..efbb729 100644
--- a/tests/ref/vsynth/vsynth_lena-vc2-420p12
+++ b/tests/ref/vsynth/vsynth_lena-vc2-420p12
@@ -1,4 +1,4 @@
-d27a6d3517cc9a6d22e338f4b206545c *tests/data/fate/vsynth_lena-vc2-420p12.mov
+98c9ce4afcbedb6634b10dcba9e5d8ec *tests/data/fate/vsynth_lena-vc2-420p12.mov
 1516759 tests/data/fate/vsynth_lena-vc2-420p12.mov
 b1c660113acab8eb4075f3d9fbb9cee9 *tests/data/fate/vsynth_lena-vc2-420p12.out.rawvideo
 stddev:    0.00 PSNR:999.99 MAXDIFF:    0 bytes:  7603200/   760320
diff --git a/tests/ref/vsynth/vsynth_lena-vc2-422p b/tests/ref/vsynth/vsynth_lena-vc2-422p
index 6f95838..388b80e 100644
--- a/tests/ref/vsynth/vsynth_lena-vc2-422p
+++ b/tests/ref/vsynth/vsynth_lena-vc2-422p
@@ -1,4 +1,4 @@
-94d3a24e9eec6cb88c84780796adbec5 *tests/data/fate/vsynth_lena-vc2-422p.mov
+f326f79e00a1499a4e387d01ea07b812 *tests/data/fate/vsynth_lena-vc2-422p.mov
 1049287 tests/data/fate/vsynth_lena-vc2-422p.mov
 c4b2e69278c822f22655344068ea486d *tests/data/fate/vsynth_lena-vc2-422p.out.rawvideo
 stddev:    0.26 PSNR: 59.82 MAXDIFF:    5 bytes:  7603200/   760320
diff --git a/tests/ref/vsynth/vsynth_lena-vc2-422p10 b/tests/ref/vsynth/vsynth_lena-vc2-422p10
index 11904c2..e521da4 100644
--- a/tests/ref/vsynth/vsynth_lena-vc2-422p10
+++ b/tests/ref/vsynth/vsynth_lena-vc2-422p10
@@ -1,4 +1,4 @@
-fc955b863eb3f22694d37e8a70085a6c *tests/data/fate/vsynth_lena-vc2-422p10.mov
+b5a757abdf6e7e2a777520ecf99107b7 *tests/data/fate/vsynth_lena-vc2-422p10.mov
 1294039 tests/data/fate/vsynth_lena-vc2-422p10.mov
 e5ea17416bda234ae58f27dea27e8135 *tests/data/fate/vsynth_lena-vc2-422p10.out.rawvideo
 stddev:    0.30 PSNR: 58.58 MAXDIFF:    5 bytes:  7603200/   760320
diff --git a/tests/ref/vsynth/vsynth_lena-vc2-422p12 b/tests/ref/vsynth/vsynth_lena-vc2-422p12
index 51a62d0..3cf50b4 100644
--- a/tests/ref/vsynth/vsynth_lena-vc2-422p12
+++ b/tests/ref/vsynth/vsynth_lena-vc2-422p12
@@ -1,4 +1,4 @@
-2cef57ce35f32642c829f24a0ca3e260 *tests/data/fate/vsynth_lena-vc2-422p12.mov
+c2ec3fa0b1faf0cfdbee4410655037a0 *tests/data/fate/vsynth_lena-vc2-422p12.mov
 1768027 tests/data/fate/vsynth_lena-vc2-422p12.mov
 bd374304997834410a69ee6c6e047d19 *tests/data/fate/vsynth_lena-vc2-422p12.out.rawvideo
 stddev:    0.29 PSNR: 58.76 MAXDIFF:    5 bytes:  7603200/   760320
diff --git a/tests/ref/vsynth/vsynth_lena-vc2-444p b/tests/ref/vsynth/vsynth_lena-vc2-444p
index bf77918..1f9a960 100644
--- a/tests/ref/vsynth/vsynth_lena-vc2-444p
+++ b/tests/ref/vsynth/vsynth_lena-vc2-444p
@@ -1,4 +1,4 @@
-cbdf2421fdd6cf0789c1f308009666f6 *tests/data/fate/vsynth_lena-vc2-444p.mov
+37eb0398cf913a66e0f628d6419775b5 *tests/data/fate/vsynth_lena-vc2-444p.mov
 1174738 tests/data/fate/vsynth_lena-vc2-444p.mov
 f9306b14ff827ced1a992301d1ab02ca *tests/data/fate/vsynth_lena-vc2-444p.out.rawvideo
 stddev:    0.38 PSNR: 56.43 MAXDIFF:    6 bytes:  7603200/   760320
diff --git a/tests/ref/vsynth/vsynth_lena-vc2-444p10 b/tests/ref/vsynth/vsynth_lena-vc2-444p10
index 10a33e2..05d6916 100644
--- a/tests/ref/vsynth/vsynth_lena-vc2-444p10
+++ b/tests/ref/vsynth/vsynth_lena-vc2-444p10
@@ -1,4 +1,4 @@
-acda7042ecc5b917824d9cf62ee3b46c *tests/data/fate/vsynth_lena-vc2-444p10.mov
+c0de26ba4c95df2e07ab249158fa947c *tests/data/fate/vsynth_lena-vc2-444p10.mov
 1577815 tests/data/fate/vsynth_lena-vc2-444p10.mov
 da13c67fe1c6d98dd73e92a6ba006edc *tests/data/fate/vsynth_lena-vc2-444p10.out.rawvideo
 stddev:    0.42 PSNR: 55.56 MAXDIFF:    7 bytes:  7603200/   760320
diff --git a/tests/ref/vsynth/vsynth_lena-vc2-444p12 b/tests/ref/vsynth/vsynth_lena-vc2-444p12
index 7d6c211..7d4f9b6 100644
--- a/tests/ref/vsynth/vsynth_lena-vc2-444p12
+++ b/tests/ref/vsynth/vsynth_lena-vc2-444p12
@@ -1,4 +1,4 @@
-a31f2e6a54896fb8c02272c9f50db716 *tests/data/fate/vsynth_lena-vc2-444p12.mov
+effbd39862492bb3f81973ddce70a1d7 *tests/data/fate/vsynth_lena-vc2-444p12.mov
 2134875 tests/data/fate/vsynth_lena-vc2-444p12.mov
 a505434ec95362772a57d274f63a3f5a *tests/data/fate/vsynth_lena-vc2-444p12.out.rawvideo
 stddev:    0.42 PSNR: 55.58 MAXDIFF:    7 bytes:  7603200/   760320
diff --git a/tests/ref/vsynth/vsynth_lena-vc2-t5_3 b/tests/ref/vsynth/vsynth_lena-vc2-t5_3
index f5f865e..50a60d7 100644
--- a/tests/ref/vsynth/vsynth_lena-vc2-t5_3
+++ b/tests/ref/vsynth/vsynth_lena-vc2-t5_3
@@ -1,4 +1,4 @@
-c2ce9a70c523903620794af6bc4ea0d4 *tests/data/fate/vsynth_lena-vc2-t5_3.mov
+950197d63d02f51021c0ed238b44181b *tests/data/fate/vsynth_lena-vc2-t5_3.mov
 1305436 tests/data/fate/vsynth_lena-vc2-t5_3.mov
 e5ea17416bda234ae58f27dea27e8135 *tests/data/fate/vsynth_lena-vc2-t5_3.out.rawvideo
 stddev:    0.30 PSNR: 58.58 MAXDIFF:    5 bytes:  7603200/   760320
diff --git a/tests/ref/vsynth/vsynth_lena-vc2-thaar b/tests/ref/vsynth/vsynth_lena-vc2-thaar
index 9c16bdf..31be283 100644
--- a/tests/ref/vsynth/vsynth_lena-vc2-thaar
+++ b/tests/ref/vsynth/vsynth_lena-vc2-thaar
@@ -1,4 +1,4 @@
-5f062ca6c56d14590507c4373ca942ab *tests/data/fate/vsynth_lena-vc2-thaar.mov
+33a539a633dba8051c65c61564c578fd *tests/data/fate/vsynth_lena-vc2-thaar.mov
 1431772 tests/data/fate/vsynth_lena-vc2-thaar.mov
 e5ea17416bda234ae58f27dea27e8135 *tests/data/fate/vsynth_lena-vc2-thaar.out.rawvideo
 stddev:    0.30 PSNR: 58.58 MAXDIFF:    5 bytes:  7603200/   760320
diff --git a/tests/regression-funcs.sh b/tests/regression-funcs.sh
deleted file mode 100755
index 0c7d34b..0000000
--- a/tests/regression-funcs.sh
+++ /dev/null
@@ -1,88 +0,0 @@
-#!/bin/sh
-#
-# common regression functions for ffmpeg
-#
-#
-
-test="${1#regtest-}"
-test_ref=$2
-raw_src_dir=$3
-target_exec=$4
-target_path=$5
-threads=${6:-1}
-cpuflags=${8:-all}
-target_samples=$9
-
-datadir="./tests/data"
-target_datadir="${target_path}/${datadir}"
-
-this="$test.$test_ref"
-outfile="$datadir/$test_ref/"
-
- # various files
-ffmpeg="$target_exec ${target_path}/ffmpeg${PROGSUF}"
-raw_src="${target_path}/$raw_src_dir/%02d.pgm"
-raw_dst="$datadir/$this.out.yuv"
-pcm_src="$target_datadir/asynth1.sw"
-pcm_src_1ch="$target_datadir/asynth-16000-1.wav"
-pcm_ref_1ch="$datadir/$test_ref-16000-1.ref.wav"
-crcfile="$datadir/$this.crc"
-target_crcfile="$target_datadir/$this.crc"
-
-cleanfiles="$raw_dst $crcfile"
-trap 'rm -f -- $cleanfiles' EXIT
-
-mkdir -p "$datadir"
-mkdir -p "$outfile"
-
-[ "${V-0}" -gt 0 ] && echov=echov || echov=:
-
-echov(){
-    echo "$@" >&3
-}
-
-. $(dirname $0)/md5.sh
-
-AVCONV_OPTS="-nostdin -nostats -y -cpuflags $cpuflags"
-COMMON_OPTS="-flags +bitexact -idct simple -sws_flags +accurate_rnd+bitexact -fflags +bitexact"
-DEC_OPTS="$COMMON_OPTS -threads $threads"
-ENC_OPTS="$COMMON_OPTS -threads $threads -dct fastint"
-
-run_avconv()
-{
-    $echov $ffmpeg $AVCONV_OPTS $*
-    $ffmpeg $AVCONV_OPTS $*
-}
-
-do_avconv()
-{
-    f="$1"
-    shift
-    set -- $* ${target_path}/$f
-    run_avconv $*
-    do_md5sum $f
-    echo $(wc -c $f)
-}
-
-do_avconv_nomd5()
-{
-    f="$1"
-    shift
-    set -- $* ${target_path}/$f
-    run_avconv $*
-    if [ $f = $raw_dst ] ; then
-        $tiny_psnr $f $raw_ref
-    elif [ $f = $pcm_dst ] ; then
-        $tiny_psnr $f $pcm_ref 2
-    else
-        echo $(wc -c $f)
-    fi
-}
-
-do_avconv_crc()
-{
-    f="$1"
-    shift
-    run_avconv $* -f crc "$target_crcfile"
-    echo "$f $(cat $crcfile)"
-}
diff --git a/tools/Makefile b/tools/Makefile
index 3909e7c..0010931 100644
--- a/tools/Makefile
+++ b/tools/Makefile
@@ -5,7 +5,13 @@
 tools/target_dec_%_fuzzer.o: tools/target_dec_fuzzer.c
 	$(COMPILE_C) -DFFMPEG_DECODER=$*
 
-OBJDIRS += tools
+tools/target_bsf_%_fuzzer.o: tools/target_bsf_fuzzer.c
+	$(COMPILE_C) -DFFMPEG_BSF=$*
+
+tools/target_dem_fuzzer.o: tools/target_dem_fuzzer.c
+	$(COMPILE_C)
+
+OUTDIRS += tools
 
 clean::
 	$(RM) $(CLEANSUFFIXES:%=tools/%)
diff --git a/tools/aviocat.c b/tools/aviocat.c
index 2aa08b9..816ab70 100644
--- a/tools/aviocat.c
+++ b/tools/aviocat.c
@@ -26,14 +26,14 @@
 
 static int usage(const char *argv0, int ret)
 {
-    fprintf(stderr, "%s [-b bytespersec] [-d duration] [-oi <options>] [-oo <options>] input_url output_url\n", argv0);
+    fprintf(stderr, "%s [-b bytespersec] [-d duration] [-oi <options>] [-oo <options>] [-v] input_url output_url\n", argv0);
     fprintf(stderr, "<options>: AVOptions expressed as key=value, :-separated\n");
     return ret;
 }
 
 int main(int argc, char **argv)
 {
-    int bps = 0, duration = 0, ret, i;
+    int bps = 0, duration = 0, verbose = 0, ret, i;
     const char *input_url = NULL, *output_url = NULL;
     int64_t stream_pos = 0;
     int64_t start_time;
@@ -65,6 +65,8 @@
                 return usage(argv[0], 1);
             }
             i++;
+        } else if (!strcmp(argv[i], "-v")) {
+            verbose = 1;
         } else if (!input_url) {
             input_url = argv[i];
         } else if (!output_url) {
@@ -82,6 +84,14 @@
         fprintf(stderr, "Unable to open %s: %s\n", input_url, errbuf);
         return 1;
     }
+    if (verbose) {
+        int64_t size = avio_seek(input, 0, AVSEEK_SIZE);
+        if (size >= 0) {
+            fprintf(stderr, "aviocat: input size: %"PRId64"\n", size);
+        } else {
+            fprintf(stderr, "aviocat: input size: unknown\n");
+        }
+    }
     if (duration && !bps) {
         int64_t size = avio_size(input);
         if (size < 0) {
diff --git a/tools/crypto_bench.c b/tools/crypto_bench.c
index aca8bbb..0aff4ea 100644
--- a/tools/crypto_bench.c
+++ b/tools/crypto_bench.c
@@ -19,7 +19,7 @@
  */
 
 /* Optional external libraries; can be enabled using:
- * make VERSUS=crypto+gcrypt+tomcrypt tools/crypto_bench */
+ * make VERSUS=crypto+gcrypt+tomcrypt+mbedcrypto tools/crypto_bench */
 #define USE_crypto           0x01    /* OpenSSL's libcrypto */
 #define USE_gcrypt           0x02    /* GnuTLS's libgcrypt */
 #define USE_tomcrypt         0x04    /* LibTomCrypt */
@@ -665,8 +665,8 @@
 
 int main(int argc, char **argv)
 {
-    uint8_t *input = av_malloc(MAX_INPUT_SIZE * 2);
-    uint8_t *output = input + MAX_INPUT_SIZE;
+    uint8_t *input;
+    uint8_t *output;
     unsigned i, impl, size;
     int opt;
 
@@ -702,12 +702,14 @@
             exit(opt != 'h');
         }
     }
-
+    input = av_malloc(MAX_INPUT_SIZE * 2);
     if (!input)
         fatal_error("out of memory");
     for (i = 0; i < MAX_INPUT_SIZE; i += 4)
         AV_WB32(input + i, i);
 
+    output = input + MAX_INPUT_SIZE;
+
     size = MAX_INPUT_SIZE;
     for (impl = 0; impl < FF_ARRAY_ELEMS(implementations); impl++)
         run_implementation(input, output, &implementations[impl], size);
diff --git a/tools/enum_options.c b/tools/enum_options.c
index 77e1f9f..548e427 100644
--- a/tools/enum_options.c
+++ b/tools/enum_options.c
@@ -88,20 +88,22 @@
 
 static void show_format_opts(void)
 {
-    AVInputFormat *iformat = NULL;
-    AVOutputFormat *oformat = NULL;
+    const AVInputFormat *iformat = NULL;
+    const AVOutputFormat *oformat = NULL;
+    void *iformat_opaque = NULL;
+    void *oformat_opaque = NULL;
 
     printf("@section Generic format AVOptions\n");
     show_opts(avformat_get_class());
 
     printf("@section Format-specific AVOptions\n");
-    while ((iformat = av_iformat_next(iformat))) {
+    while ((iformat = av_demuxer_iterate(&iformat_opaque))) {
         if (!iformat->priv_class)
             continue;
         printf("@subsection %s AVOptions\n", iformat->priv_class->class_name);
         show_opts(iformat->priv_class);
     }
-    while ((oformat = av_oformat_next(oformat))) {
+    while ((oformat = av_muxer_iterate(&oformat_opaque))) {
         if (!oformat->priv_class)
             continue;
         printf("@subsection %s AVOptions\n", oformat->priv_class->class_name);
@@ -111,13 +113,14 @@
 
 static void show_codec_opts(void)
 {
+    void *iter = NULL;
     AVCodec *c = NULL;
 
     printf("@section Generic codec AVOptions\n");
     show_opts(avcodec_get_class());
 
     printf("@section Codec-specific AVOptions\n");
-    while ((c = av_codec_next(c))) {
+    while ((c = av_codec_iterate(&iter))) {
         if (!c->priv_class)
             continue;
         printf("@subsection %s AVOptions\n", c->priv_class->class_name);
diff --git a/tools/patcheck b/tools/patcheck
index 101a542..fe52938 100755
--- a/tools/patcheck
+++ b/tools/patcheck
@@ -50,7 +50,6 @@
 hiegrep2 '\b_[a-zA-Z0-9_]{1,}' '__(asm|attribute)([^a-zA-Z0-9]|$)' 'reserved identifer' $*
 hiegrep '//[-/<\* ]*$'    'empty comment' $*
 hiegrep '/\*[-<\* ]*\*/'  'empty comment' $*
-hiegrep 'for *\( *'"$ERE_PRITYP"' '  'not gcc 2.95 compatible' $*
 hiegrep '(static|inline|const) *\1[^_a-zA-Z]'  'duplicate word' $*
 hiegrep 'INIT_VLC_USE_STATIC' 'forbidden ancient vlc type' $*
 hiegrep '=[-+\*\&] ' 'looks like compound assignment' $*
diff --git a/tools/probetest.c b/tools/probetest.c
index 2c6c1de..cfa309c 100644
--- a/tools/probetest.c
+++ b/tools/probetest.c
@@ -38,9 +38,10 @@
 static void probe(AVProbeData *pd, int type, int p, int size)
 {
     int i = 0;
-    AVInputFormat *fmt = NULL;
+    const AVInputFormat *fmt = NULL;
+    void *fmt_opaque = NULL;
 
-    while ((fmt = av_iformat_next(fmt))) {
+    while ((fmt = av_demuxer_iterate(&fmt_opaque))) {
         if (fmt->flags & AVFMT_NOFILE)
             continue;
         if (fmt->read_probe &&
@@ -66,8 +67,9 @@
 {
     int i = 0;
     AVInputFormat *fmt = NULL;
+    void *fmt_opaque = NULL;
 
-    while ((fmt = av_iformat_next(fmt))) {
+    while ((fmt = av_demuxer_iterate(&fmt_opaque))) {
         if (fmt->flags & AVFMT_NOFILE)
             continue;
         if (time_array[i] > 1000000) {
diff --git a/tools/python/convert.py b/tools/python/convert.py
new file mode 100644
index 0000000..64cf76b
--- /dev/null
+++ b/tools/python/convert.py
@@ -0,0 +1,56 @@
+# Copyright (c) 2019 Guo Yejun
+#
+# This file is part of FFmpeg.
+#
+# FFmpeg is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# FFmpeg is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with FFmpeg; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+# ==============================================================================
+
+# verified with Python 3.5.2 on Ubuntu 16.04
+import argparse
+import os
+from convert_from_tensorflow import *
+
+def get_arguments():
+    parser = argparse.ArgumentParser(description='generate native mode model with weights from deep learning model')
+    parser.add_argument('--outdir', type=str, default='./', help='where to put generated files')
+    parser.add_argument('--infmt', type=str, default='tensorflow', help='format of the deep learning model')
+    parser.add_argument('infile', help='path to the deep learning model with weights')
+    parser.add_argument('--dump4tb', type=str, default='no', help='dump file for visualization in tensorboard')
+
+    return parser.parse_args()
+
+def main():
+    args = get_arguments()
+
+    if not os.path.isfile(args.infile):
+        print('the specified input file %s does not exist' % args.infile)
+        exit(1)
+
+    if not os.path.exists(args.outdir):
+        print('create output directory %s' % args.outdir)
+        os.mkdir(args.outdir)
+
+    basefile = os.path.split(args.infile)[1]
+    basefile = os.path.splitext(basefile)[0]
+    outfile = os.path.join(args.outdir, basefile) + '.model'
+    dump4tb = False
+    if args.dump4tb.lower() in ('yes', 'true', 't', 'y', '1'):
+        dump4tb = True
+
+    if args.infmt == 'tensorflow':
+        convert_from_tensorflow(args.infile, outfile, dump4tb)
+
+if __name__ == '__main__':
+    main()
diff --git a/tools/python/convert_from_tensorflow.py b/tools/python/convert_from_tensorflow.py
new file mode 100644
index 0000000..a0fdad2
--- /dev/null
+++ b/tools/python/convert_from_tensorflow.py
@@ -0,0 +1,450 @@
+# Copyright (c) 2019 Guo Yejun
+#
+# This file is part of FFmpeg.
+#
+# FFmpeg is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# FFmpeg is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with FFmpeg; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+# ==============================================================================
+
+import tensorflow as tf
+import numpy as np
+import sys, struct
+import convert_header as header
+
+__all__ = ['convert_from_tensorflow']
+
+class Operand(object):
+    IOTYPE_INPUT = 1
+    IOTYPE_OUTPUT = 2
+    IOTYPE_INTERMEDIATE = IOTYPE_INPUT | IOTYPE_OUTPUT
+    DTYPE_FLOAT = 1
+    DTYPE_UINT8 = 4
+    index = 0
+    def __init__(self, name, dtype, dims):
+        self.name = name
+        self.dtype = dtype
+        self.dims = dims
+        self.iotype = 0
+        self.used_count = 0
+        self.index = Operand.index
+        Operand.index = Operand.index + 1
+        self.iotype2str = {Operand.IOTYPE_INPUT: 'in', Operand.IOTYPE_OUTPUT: 'out', Operand.IOTYPE_INTERMEDIATE: 'inout'}
+        self.dtype2str = {Operand.DTYPE_FLOAT: 'DT_FLOAT', Operand.DTYPE_UINT8: 'DT_UINT8'}
+
+    def add_iotype(self, iotype):
+        self.iotype = self.iotype | iotype
+        if iotype == Operand.IOTYPE_INPUT:
+            self.used_count = self.used_count + 1
+
+    def __str__(self):
+        return "{}: (name: {}, iotype: {}, dtype: {}, dims: ({},{},{},{}) used_count: {})".format(self.index,
+                            self.name, self.iotype2str[self.iotype], self.dtype2str[self.dtype],
+                            self.dims[0], self.dims[1], self.dims[2], self.dims[3], self.used_count)
+
+    def __lt__(self, other):
+        return self.index < other.index
+
+class TFConverter:
+    def __init__(self, graph_def, nodes, outfile, dump4tb):
+        self.graph_def = graph_def
+        self.nodes = nodes
+        self.outfile = outfile
+        self.dump4tb = dump4tb
+        self.layer_number = 0
+        self.output_names = []
+        self.name_node_dict = {}
+        self.edges = {}
+        self.conv_activations = {'Relu':0, 'Tanh':1, 'Sigmoid':2, 'None':3, 'LeakyRelu':4}
+        self.conv_paddings = {'VALID':0, 'SAME':1}
+        self.converted_nodes = set()
+        self.conv2d_scope_names = set()
+        self.conv2d_scopename_inputname_dict = {}
+        self.op2code = {'Conv2D':1, 'DepthToSpace':2, 'MirrorPad':3, 'Maximum':4, 'MathBinary':5}
+        self.mathbin2code = {'Sub':0, 'Add':1, 'Mul':2, 'RealDiv':3}
+        self.mirrorpad_mode = {'CONSTANT':0, 'REFLECT':1, 'SYMMETRIC':2}
+        self.name_operand_dict = {}
+
+
+    def add_operand(self, name, type):
+        node = self.name_node_dict[name]
+        if name not in self.name_operand_dict:
+            dtype = node.attr['dtype'].type
+            if dtype == 0:
+                dtype = node.attr['T'].type
+            dims = [-1,-1,-1,-1]
+            if 'shape' in node.attr:
+                dims[0] = node.attr['shape'].shape.dim[0].size
+                dims[1] = node.attr['shape'].shape.dim[1].size
+                dims[2] = node.attr['shape'].shape.dim[2].size
+                dims[3] = node.attr['shape'].shape.dim[3].size
+            operand = Operand(name, dtype, dims)
+            self.name_operand_dict[name] = operand;
+        self.name_operand_dict[name].add_iotype(type)
+        return self.name_operand_dict[name].index
+
+
+    def dump_for_tensorboard(self):
+        graph = tf.get_default_graph()
+        tf.import_graph_def(self.graph_def, name="")
+        tf.summary.FileWriter('/tmp/graph', graph)
+        print('graph saved, run "tensorboard --logdir=/tmp/graph" to see it')
+
+
+    def get_conv2d_params(self, conv2d_scope_name):
+        knode = self.name_node_dict[conv2d_scope_name + '/kernel']
+        bnode = self.name_node_dict[conv2d_scope_name + '/bias']
+
+        if conv2d_scope_name + '/dilation_rate' in self.name_node_dict:
+            dnode = self.name_node_dict[conv2d_scope_name + '/dilation_rate']
+        else:
+            dnode = None
+
+        # the BiasAdd name is possible be changed into the output name,
+        # if activation is None, and BiasAdd.next is the last op which is Identity
+        if conv2d_scope_name + '/BiasAdd' in self.edges:
+            anode = self.edges[conv2d_scope_name + '/BiasAdd'][0]
+            if anode.op not in self.conv_activations:
+                anode = None
+        else:
+            anode = None
+        return knode, bnode, dnode, anode
+
+
+    def dump_complex_conv2d_to_file(self, node, f):
+        assert(node.op == 'Conv2D')
+        self.layer_number = self.layer_number + 1
+        self.converted_nodes.add(node.name)
+
+        scope_name = TFConverter.get_scope_name(node.name)
+        #knode for kernel, bnode for bias, dnode for dilation, anode for activation
+        knode, bnode, dnode, anode = self.get_conv2d_params(scope_name)
+
+        if dnode is not None:
+            dilation = struct.unpack('i', dnode.attr['value'].tensor.tensor_content[0:4])[0]
+        else:
+            dilation = 1
+
+        if anode is not None:
+            activation = anode.op
+        else:
+            activation = 'None'
+
+        padding = node.attr['padding'].s.decode("utf-8")
+        # conv2d with dilation > 1 generates tens of nodes, not easy to parse them, so use this tricky method.
+        if dilation > 1 and scope_name + '/stack' in self.name_node_dict:
+            if self.name_node_dict[scope_name + '/stack'].op == "Const":
+                padding = 'SAME'
+        padding = self.conv_paddings[padding]
+
+        ktensor = knode.attr['value'].tensor
+        filter_height = ktensor.tensor_shape.dim[0].size
+        filter_width = ktensor.tensor_shape.dim[1].size
+        in_channels = ktensor.tensor_shape.dim[2].size
+        out_channels = ktensor.tensor_shape.dim[3].size
+        kernel = np.frombuffer(ktensor.tensor_content, dtype=np.float32)
+        kernel = kernel.reshape(filter_height, filter_width, in_channels, out_channels)
+        kernel = np.transpose(kernel, [3, 0, 1, 2])
+
+        has_bias = 1
+        np.array([self.op2code[node.op], dilation, padding, self.conv_activations[activation], in_channels, out_channels, filter_height, has_bias], dtype=np.uint32).tofile(f)
+        kernel.tofile(f)
+
+        btensor = bnode.attr['value'].tensor
+        if btensor.tensor_shape.dim[0].size == 1:
+            bias = struct.pack("f", btensor.float_val[0])
+        else:
+            bias = btensor.tensor_content
+        f.write(bias)
+
+        input_name = self.conv2d_scopename_inputname_dict[scope_name]
+        input_operand_index = self.add_operand(input_name, Operand.IOTYPE_INPUT)
+
+        if anode is not None:
+            output_operand_index = self.add_operand(anode.name, Operand.IOTYPE_OUTPUT)
+        else:
+            output_operand_index = self.add_operand(self.edges[bnode.name][0].name, Operand.IOTYPE_OUTPUT)
+        np.array([input_operand_index, output_operand_index], dtype=np.uint32).tofile(f)
+
+
+    def dump_simple_conv2d_to_file(self, node, f):
+        assert(node.op == 'Conv2D')
+        self.layer_number = self.layer_number + 1
+        self.converted_nodes.add(node.name)
+
+        node0 = self.name_node_dict[node.input[0]]
+        node1 = self.name_node_dict[node.input[1]]
+        if node0.op == 'Const':
+            knode = node0
+            input_name = node.input[1]
+        else:
+            knode = node1
+            input_name = node.input[0]
+
+        ktensor = knode.attr['value'].tensor
+        filter_height = ktensor.tensor_shape.dim[0].size
+        filter_width = ktensor.tensor_shape.dim[1].size
+        in_channels = ktensor.tensor_shape.dim[2].size
+        out_channels = ktensor.tensor_shape.dim[3].size
+        if filter_height * filter_width * in_channels * out_channels == 1:
+            kernel = np.float32(ktensor.float_val[0])
+        else:
+            kernel = np.frombuffer(ktensor.tensor_content, dtype=np.float32)
+        kernel = kernel.reshape(filter_height, filter_width, in_channels, out_channels)
+        kernel = np.transpose(kernel, [3, 0, 1, 2])
+
+        has_bias = 0
+        dilation = 1
+        padding = node.attr['padding'].s.decode("utf-8")
+        np.array([self.op2code[node.op], dilation, self.conv_paddings[padding], self.conv_activations['None'],
+                  in_channels, out_channels, filter_height, has_bias], dtype=np.uint32).tofile(f)
+        kernel.tofile(f)
+
+        input_operand_index = self.add_operand(input_name, Operand.IOTYPE_INPUT)
+        output_operand_index = self.add_operand(node.name, Operand.IOTYPE_OUTPUT)
+        np.array([input_operand_index, output_operand_index], dtype=np.uint32).tofile(f)
+
+
+    def dump_depth2space_to_file(self, node, f):
+        assert(node.op == 'DepthToSpace')
+        self.layer_number = self.layer_number + 1
+        block_size = node.attr['block_size'].i
+        np.array([self.op2code[node.op], block_size], dtype=np.uint32).tofile(f)
+        self.converted_nodes.add(node.name)
+        input_operand_index = self.add_operand(node.input[0], Operand.IOTYPE_INPUT)
+        output_operand_index = self.add_operand(node.name, Operand.IOTYPE_OUTPUT)
+        np.array([input_operand_index, output_operand_index], dtype=np.uint32).tofile(f)
+
+
+    def dump_mirrorpad_to_file(self, node, f):
+        assert(node.op == 'MirrorPad')
+        self.layer_number = self.layer_number + 1
+        mode = node.attr['mode'].s
+        mode = self.mirrorpad_mode[mode.decode("utf-8")]
+        np.array([self.op2code[node.op], mode], dtype=np.uint32).tofile(f)
+        pnode = self.name_node_dict[node.input[1]]
+        self.converted_nodes.add(pnode.name)
+        paddings = pnode.attr['value'].tensor.tensor_content
+        f.write(paddings)
+        self.converted_nodes.add(node.name)
+        input_operand_index = self.add_operand(node.input[0], Operand.IOTYPE_INPUT)
+        output_operand_index = self.add_operand(node.name, Operand.IOTYPE_OUTPUT)
+        np.array([input_operand_index, output_operand_index], dtype=np.uint32).tofile(f)
+
+
+    def dump_maximum_to_file(self, node, f):
+        assert(node.op == 'Maximum')
+        self.layer_number = self.layer_number + 1
+        ynode = self.name_node_dict[node.input[1]]
+        y = ynode.attr['value'].tensor.float_val[0]
+        np.array([self.op2code[node.op]], dtype=np.uint32).tofile(f)
+        np.array([y], dtype=np.float32).tofile(f)
+        self.converted_nodes.add(node.name)
+        input_operand_index = self.add_operand(node.input[0], Operand.IOTYPE_INPUT)
+        output_operand_index = self.add_operand(node.name, Operand.IOTYPE_OUTPUT)
+        np.array([input_operand_index, output_operand_index], dtype=np.uint32).tofile(f)
+
+
+    def dump_mathbinary_to_file(self, node, f):
+        self.layer_number = self.layer_number + 1
+        self.converted_nodes.add(node.name)
+        i0_node = self.name_node_dict[node.input[0]]
+        i1_node = self.name_node_dict[node.input[1]]
+        np.array([self.op2code['MathBinary'], self.mathbin2code[node.op]], dtype=np.uint32).tofile(f)
+        if i0_node.op == 'Const':
+            scalar = i0_node.attr['value'].tensor.float_val[0]
+            np.array([1], dtype=np.uint32).tofile(f)            # broadcast: 1
+            np.array([scalar], dtype=np.float32).tofile(f)
+            np.array([0], dtype=np.uint32).tofile(f)            # broadcast: 0
+            input_operand_index = self.add_operand(i1_node.name, Operand.IOTYPE_INPUT)
+            np.array([input_operand_index], dtype=np.uint32).tofile(f)
+        elif i1_node.op == 'Const':
+            scalar = i1_node.attr['value'].tensor.float_val[0]
+            np.array([0], dtype=np.uint32).tofile(f)
+            input_operand_index = self.add_operand(i0_node.name, Operand.IOTYPE_INPUT)
+            np.array([input_operand_index], dtype=np.uint32).tofile(f)
+            np.array([1], dtype=np.uint32).tofile(f)
+            np.array([scalar], dtype=np.float32).tofile(f)
+        else:
+            np.array([0], dtype=np.uint32).tofile(f)
+            input_operand_index = self.add_operand(i0_node.name, Operand.IOTYPE_INPUT)
+            np.array([input_operand_index], dtype=np.uint32).tofile(f)
+            np.array([0], dtype=np.uint32).tofile(f)
+            input_operand_index = self.add_operand(i1_node.name, Operand.IOTYPE_INPUT)
+            np.array([input_operand_index], dtype=np.uint32).tofile(f)
+        output_operand_index = self.add_operand(node.name, Operand.IOTYPE_OUTPUT)
+        np.array([output_operand_index], dtype=np.uint32).tofile(f)
+
+
+    def dump_layers_to_file(self, f):
+        for node in self.nodes:
+            if node.name in self.converted_nodes:
+                continue
+
+            # conv2d with dilation generates very complex nodes, so handle it in special
+            if self.in_conv2d_scope(node.name):
+                if node.op == 'Conv2D':
+                    self.dump_complex_conv2d_to_file(node, f)
+                continue
+
+            if node.op == 'Conv2D':
+                self.dump_simple_conv2d_to_file(node, f)
+            elif node.op == 'DepthToSpace':
+                self.dump_depth2space_to_file(node, f)
+            elif node.op == 'MirrorPad':
+                self.dump_mirrorpad_to_file(node, f)
+            elif node.op == 'Maximum':
+                self.dump_maximum_to_file(node, f)
+            elif node.op == 'Sub':
+                self.dump_mathbinary_to_file(node, f)
+            elif node.op == 'Add':
+                self.dump_mathbinary_to_file(node, f)
+            elif node.op == 'Mul':
+                self.dump_mathbinary_to_file(node, f)
+            elif node.op == 'RealDiv':
+                self.dump_mathbinary_to_file(node, f)
+
+    def dump_operands_to_file(self, f):
+            operands = sorted(self.name_operand_dict.values())
+            for operand in operands:
+                #print('{}'.format(operand))
+                np.array([operand.index, len(operand.name)], dtype=np.uint32).tofile(f)
+                f.write(operand.name.encode('utf-8'))
+                np.array([operand.iotype, operand.dtype], dtype=np.uint32).tofile(f)
+                np.array([operand.dims[0], operand.dims[1], operand.dims[2], operand.dims[3]], dtype=np.uint32).tofile(f)
+
+
+    def dump_to_file(self):
+        with open(self.outfile, 'wb') as f:
+            f.write(header.str.encode('utf-8'))
+            np.array([header.major, header.minor], dtype=np.uint32).tofile(f)
+            self.dump_layers_to_file(f)
+            self.dump_operands_to_file(f)
+            np.array([self.layer_number, len(self.name_operand_dict)], dtype=np.uint32).tofile(f)
+
+
+    def generate_name_node_dict(self):
+        for node in self.nodes:
+            self.name_node_dict[node.name] = node
+
+
+    def generate_output_names(self):
+        used_names = []
+        for node in self.nodes:
+            for input in node.input:
+                used_names.append(input)
+
+        for node in self.nodes:
+            if node.name not in used_names:
+                self.output_names.append(node.name)
+
+
+    def remove_identity(self):
+        id_nodes = []
+        id_dict = {}
+        for node in self.nodes:
+            if node.op == 'Identity':
+                name = node.name
+                input = node.input[0]
+                id_nodes.append(node)
+                # do not change the output name
+                if name in self.output_names:
+                    self.name_node_dict[input].name = name
+                    self.name_node_dict[name] = self.name_node_dict[input]
+                    del self.name_node_dict[input]
+                else:
+                    id_dict[name] = input
+
+        for idnode in id_nodes:
+            self.nodes.remove(idnode)
+
+        for node in self.nodes:
+            for i in range(len(node.input)):
+                input = node.input[i]
+                if input in id_dict:
+                    node.input[i] = id_dict[input]
+
+
+    def generate_edges(self):
+        for node in self.nodes:
+            for input in node.input:
+                if input in self.edges:
+                    self.edges[input].append(node)
+                else:
+                    self.edges[input] = [node]
+
+
+    @staticmethod
+    def get_scope_name(name):
+        index = name.rfind('/')
+        if index == -1:
+            return ""
+        return name[0:index]
+
+
+    def in_conv2d_scope(self, name):
+        inner_scope = TFConverter.get_scope_name(name)
+        if inner_scope == "":
+            return False;
+        for scope in self.conv2d_scope_names:
+            index = inner_scope.find(scope)
+            if index == 0:
+                return True
+        return False
+
+
+    def generate_conv2d_scope_info(self):
+        # mostly, conv2d is a sub block in graph, get the scope name
+        for node in self.nodes:
+            if node.op == 'Conv2D':
+                scope = TFConverter.get_scope_name(node.name)
+                # for the case tf.nn.conv2d is called directly
+                if scope == '':
+                    continue
+                # for the case tf.nn.conv2d is called within a scope
+                if scope + '/kernel' not in self.name_node_dict:
+                    continue
+                self.conv2d_scope_names.add(scope)
+
+        # get the input name to the conv2d sub block
+        for node in self.nodes:
+            scope = TFConverter.get_scope_name(node.name)
+            if scope in self.conv2d_scope_names:
+                if node.op == 'Conv2D' or node.op == 'Shape':
+                    for inp in node.input:
+                        if TFConverter.get_scope_name(inp) != scope:
+                            self.conv2d_scopename_inputname_dict[scope] = inp
+
+
+    def run(self):
+        self.generate_name_node_dict()
+        self.generate_output_names()
+        self.remove_identity()
+        self.generate_edges()
+        self.generate_conv2d_scope_info()
+
+        if self.dump4tb:
+            self.dump_for_tensorboard()
+
+        self.dump_to_file()
+
+
+def convert_from_tensorflow(infile, outfile, dump4tb):
+    with open(infile, 'rb') as f:
+        # read the file in .proto format
+        graph_def = tf.GraphDef()
+        graph_def.ParseFromString(f.read())
+        nodes = graph_def.node
+
+    converter = TFConverter(graph_def, nodes, outfile, dump4tb)
+    converter.run()
diff --git a/tools/python/convert_header.py b/tools/python/convert_header.py
new file mode 100644
index 0000000..75d1ce8
--- /dev/null
+++ b/tools/python/convert_header.py
@@ -0,0 +1,26 @@
+# Copyright (c) 2019
+#
+# This file is part of FFmpeg.
+#
+# FFmpeg is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# FFmpeg is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with FFmpeg; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+# ==============================================================================
+
+str = 'FFMPEGDNNNATIVE'
+
+# increase major and reset minor when we have to re-convert the model file
+major = 1
+
+# increase minor when we don't have to re-convert the model file
+minor = 4
diff --git a/tools/target_bsf_fuzzer.c b/tools/target_bsf_fuzzer.c
new file mode 100644
index 0000000..f3e584f
--- /dev/null
+++ b/tools/target_bsf_fuzzer.c
@@ -0,0 +1,153 @@
+/*
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "config.h"
+#include "libavutil/imgutils.h"
+
+#include "libavcodec/avcodec.h"
+#include "libavcodec/bsf.h"
+#include "libavcodec/bytestream.h"
+#include "libavcodec/internal.h"
+
+int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size);
+
+static void error(const char *err)
+{
+    fprintf(stderr, "%s", err);
+    exit(1);
+}
+
+static AVBitStreamFilter *f = NULL;
+
+static const uint64_t FUZZ_TAG = 0x4741542D5A5A5546ULL;
+
+int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
+    const uint64_t fuzz_tag = FUZZ_TAG;
+    const uint8_t *last = data;
+    const uint8_t *end = data + size;
+    AVBSFContext *bsf = NULL;
+    AVPacket in, out;
+    uint64_t keyframes = 0;
+    int res;
+
+    if (!f) {
+#ifdef FFMPEG_BSF
+#define BSF_SYMBOL0(BSF) ff_##BSF##_bsf
+#define BSF_SYMBOL(BSF) BSF_SYMBOL0(BSF)
+        extern AVBitStreamFilter BSF_SYMBOL(FFMPEG_BSF);
+        f = &BSF_SYMBOL(FFMPEG_BSF);
+#else
+        extern AVBitStreamFilter ff_null_bsf;
+        f = &ff_null_bsf;
+#endif
+        av_log_set_level(AV_LOG_PANIC);
+    }
+
+    res = av_bsf_alloc(f, &bsf);
+    if (res < 0)
+        error("Failed memory allocation");
+
+    if (size > 1024) {
+        GetByteContext gbc;
+        int extradata_size;
+        size -= 1024;
+        bytestream2_init(&gbc, data + size, 1024);
+        bsf->par_in->width                      = bytestream2_get_le32(&gbc);
+        bsf->par_in->height                     = bytestream2_get_le32(&gbc);
+        bsf->par_in->bit_rate                   = bytestream2_get_le64(&gbc);
+        bsf->par_in->bits_per_coded_sample      = bytestream2_get_le32(&gbc);
+
+        if (f->codec_ids) {
+            int i, id;
+            for (i = 0; f->codec_ids[i] != AV_CODEC_ID_NONE; i++);
+            id = f->codec_ids[bytestream2_get_byte(&gbc) % i];
+            bsf->par_in->codec_id = id;
+            bsf->par_in->codec_tag              = bytestream2_get_le32(&gbc);
+        }
+
+        extradata_size = bytestream2_get_le32(&gbc);
+
+        bsf->par_in->sample_rate                = bytestream2_get_le32(&gbc);
+        bsf->par_in->channels                   = (unsigned)bytestream2_get_le32(&gbc) % FF_SANE_NB_CHANNELS;
+        bsf->par_in->block_align                = bytestream2_get_le32(&gbc);
+        keyframes                               = bytestream2_get_le64(&gbc);
+
+        if (extradata_size < size) {
+            bsf->par_in->extradata = av_mallocz(extradata_size + AV_INPUT_BUFFER_PADDING_SIZE);
+            if (bsf->par_in->extradata) {
+                bsf->par_in->extradata_size = extradata_size;
+                size -= bsf->par_in->extradata_size;
+                memcpy(bsf->par_in->extradata, data + size, bsf->par_in->extradata_size);
+            }
+        }
+        if (av_image_check_size(bsf->par_in->width, bsf->par_in->height, 0, bsf))
+            bsf->par_in->width = bsf->par_in->height = 0;
+    }
+
+    res = av_bsf_init(bsf);
+    if (res < 0) {
+        av_bsf_free(&bsf);
+        return 0; // Failure of av_bsf_init() does not imply that a issue was found
+    }
+
+    av_init_packet(&in);
+    av_init_packet(&out);
+    out.data = NULL;
+    out.size = 0;
+    while (data < end) {
+        // Search for the TAG
+        while (data + sizeof(fuzz_tag) < end) {
+            if (data[0] == (fuzz_tag & 0xFF) && AV_RN64(data) == fuzz_tag)
+                break;
+            data++;
+        }
+        if (data + sizeof(fuzz_tag) > end)
+            data = end;
+
+        res = av_new_packet(&in, data - last);
+        if (res < 0)
+            error("Failed memory allocation");
+        memcpy(in.data, last, data - last);
+        in.flags = (keyframes & 1) * AV_PKT_FLAG_DISCARD + (!!(keyframes & 2)) * AV_PKT_FLAG_KEY;
+        keyframes = (keyframes >> 2) + (keyframes<<62);
+        data += sizeof(fuzz_tag);
+        last = data;
+
+        while (in.size) {
+            res = av_bsf_send_packet(bsf, &in);
+            if (res < 0 && res != AVERROR(EAGAIN))
+                break;
+            res = av_bsf_receive_packet(bsf, &out);
+            if (res < 0)
+                break;
+            av_packet_unref(&out);
+        }
+        av_packet_unref(&in);
+    }
+
+    res = av_bsf_send_packet(bsf, NULL);
+    while (!res) {
+        res = av_bsf_receive_packet(bsf, &out);
+        if (res < 0)
+            break;
+        av_packet_unref(&out);
+    }
+
+    av_bsf_free(&bsf);
+    return 0;
+}
diff --git a/tools/target_dec_fate.list b/tools/target_dec_fate.list
new file mode 100644
index 0000000..13b0721
--- /dev/null
+++ b/tools/target_dec_fate.list
@@ -0,0 +1,656 @@
+496/clusterfuzz-testcase-5805083497332736                                                       target_dec_jpegls_fuzzer
+498/clusterfuzz-testcase-6157986632302592                                                       target_dec_tiff_fuzzer
+500/clusterfuzz-testcase-6315221727576064                                                       target_dec_png_fuzzer
+501/clusterfuzz-testcase-5672752870588416                                                       target_dec_sipr_fuzzer
+503/clusterfuzz-testcase-6386429735206912                                                       target_dec_mp3_fuzzer
+508/clusterfuzz-testcase-6245747678773248                                                       target_dec_amrnb_fuzzer
+510/clusterfuzz-testcase-5737865715646464                                                       target_dec_dca_fuzzer
+540/clusterfuzz-testcase-5674546153652224                                                       target_dec_jpegls_fuzzer
+544/clusterfuzz-testcase-5936536407244800.f8bd9b24_8ba77916_70c2c7be_3df6a2ea_96cd9f14          target_dec_interplay_video_fuzzer
+546/clusterfuzz-testcase-4809433909559296                                                       target_dec_png_fuzzer
+555/clusterfuzz-testcase-5986646595993600                                                       target_dec_movtext_fuzzer
+559/clusterfuzz-testcase-6424225917173760                                                       target_dec_pictor_fuzzer
+607/clusterfuzz-testcase-5108792465293312                                                       target_dec_wavpack_fuzzer
+608/clusterfuzz-testcase-6039782863929344                                                       target_dec_mpeg2video_fuzzer
+609/clusterfuzz-testcase-4825202619842560                                                       target_dec_png_fuzzer
+610/clusterfuzz-testcase-4831030085156864                                                       target_dec_ac3_fuzzer
+611/clusterfuzz-testcase-5613455820193792                                                       target_dec_mjpeg_fuzzer
+612/clusterfuzz-testcase-4707817137111040                                                       target_dec_mpeg4_fuzzer
+614/clusterfuzz-testcase-4931860079575040                                                       target_dec_h264_fuzzer
+615/clusterfuzz-testcase-5488002644049920                                                       target_dec_h264_fuzzer
+616/clusterfuzz-testcase-5724692654587904                                                       target_dec_jpegls_fuzzer
+617/clusterfuzz-testcase-6413875723370496                                                       target_dec_subrip_fuzzer
+618/clusterfuzz-testcase-6594990333493248                                                       target_dec_h263_fuzzer
+619/clusterfuzz-testcase-5803914534322176                                                       target_dec_dvbsub_fuzzer
+622/clusterfuzz-testcase-5745722022428672                                                       target_dec_pictor_fuzzer
+626/clusterfuzz-testcase-4738718621499392                                                       target_dec_flac_fuzzer
+628/clusterfuzz-testcase-6187747641393152                                                       target_dec_flac_fuzzer
+629/clusterfuzz-testcase-6697457381539840                                                       target_dec_dca_fuzzer
+630/clusterfuzz-testcase-6608718928019456                                                       target_dec_rv40_fuzzer
+631/clusterfuzz-testcase-6725491035734016                                                       target_dec_mp3_fuzzer
+633/clusterfuzz-testcase-4553133554401280                                                       target_dec_dvvideo_fuzzer
+634/clusterfuzz-testcase-5285420445204480                                                       target_dec_h264_fuzzer
+637/clusterfuzz-testcase-5713159862091776                                                       target_dec_rv40_fuzzer
+639/clusterfuzz-testcase-5143866241974272                                                       target_dec_h263_fuzzer
+656/clusterfuzz-testcase-6463814516080640                                                       target_dec_mpeg4_fuzzer
+657/clusterfuzz-testcase-6674741433729024                                                       target_dec_jpegls_fuzzer
+658/clusterfuzz-testcase-6691260146384896                                                       target_dec_mpeg4_fuzzer
+659/clusterfuzz-testcase-5866673603084288                                                       target_dec_h263_fuzzer
+662/clusterfuzz-testcase-4898131432964096                                                       target_dec_rv30_fuzzer
+662/clusterfuzz-testcase-4898131432964096                                                       target_dec_rv40_fuzzer
+664/clusterfuzz-testcase-4917047475568640                                                       target_dec_vp6_fuzzer
+665/clusterfuzz-testcase-4863789881098240                                                       target_dec_mp2_fuzzer
+665/clusterfuzz-testcase-4863789881098240                                                       target_dec_mp3_fuzzer
+670/clusterfuzz-testcase-4852021066727424                                                       target_dec_h263_fuzzer
+671/clusterfuzz-testcase-4990381827555328                                                       target_dec_mpeg1video_fuzzer
+672/clusterfuzz-testcase-5595018867769344                                                       target_dec_eac3_fuzzer
+673/clusterfuzz-testcase-5948736536576000                                                       target_dec_flac_fuzzer
+674/clusterfuzz-testcase-6713275880308736                                                       target_dec_mpeg4_fuzzer
+675/clusterfuzz-testcase-6722971232108544                                                       target_dec_pictor_fuzzer
+677/clusterfuzz-testcase-6635120628858880                                                       target_dec_h264_fuzzer
+680/clusterfuzz-testcase-5416627266912256                                                       target_dec_dca_fuzzer
+681/clusterfuzz-testcase-5013323462475776                                                       target_dec_dca_fuzzer
+700/clusterfuzz-testcase-5660909504561152                                                       target_dec_vp6_fuzzer
+701/clusterfuzz-testcase-6594719951880192                                                       target_dec_mpeg4_fuzzer
+702/clusterfuzz-testcase-4553541576294400                                                       target_dec_vp5_fuzzer
+712/clusterfuzz-testcase-6647676227551232                                                       target_dec_h264_fuzzer
+713/clusterfuzz-testcase-4999324687663104                                                       target_dec_h264_fuzzer
+716/clusterfuzz-testcase-4890287480504320                                                       target_dec_mpeg4_fuzzer
+717/clusterfuzz-testcase-5434924129583104                                                       target_dec_wavpack_fuzzer
+719/clusterfuzz-testcase-6214837208088576                                                       target_dec_vp6f_fuzzer
+722/clusterfuzz-testcase-5711268868521984                                                       target_dec_dca_fuzzer
+723/clusterfuzz-testcase-6471394663596032                                                       target_dec_wavpack_fuzzer
+724/clusterfuzz-testcase-6738249571631104                                                       target_dec_pictor_fuzzer
+729/clusterfuzz-testcase-5154831595470848                                                       target_dec_wavpack_fuzzer
+730/clusterfuzz-testcase-5265113739165696                                                       target_dec_vp8_fuzzer
+731/clusterfuzz-testcase-5391628980191232                                                       target_dec_flac_fuzzer
+732/clusterfuzz-testcase-4872990070145024                                                       target_dec_dca_fuzzer
+733/clusterfuzz-testcase-4682158096515072                                                       target_dec_mjpeg_fuzzer
+734/clusterfuzz-testcase-4821293192970240                                                       target_dec_h264_fuzzer
+736/clusterfuzz-testcase-5580263943831552                                                       target_dec_mpeg4_fuzzer
+741/clusterfuzz-testcase-5869962004529152                                                       target_dec_movtext_fuzzer
+755/clusterfuzz-testcase-5369072516595712                                                       target_dec_h264_fuzzer
+758/clusterfuzz-testcase-4720832028868608                                                       target_dec_vp5_fuzzer
+761/clusterfuzz-testcase-5442222252097536                                                       target_dec_wavpack_fuzzer
+762/clusterfuzz-testcase-5927683747741696                                                       target_dec_dca_fuzzer
+763/clusterfuzz-testcase-6007567320875008                                                       target_dec_amrwb_fuzzer
+764/clusterfuzz-testcase-6273034652483584                                                       target_dec_mpeg2video_fuzzer
+766/clusterfuzz-testcase-4603047080624128                                                       target_dec_vp6_fuzzer
+767/clusterfuzz-testcase-6743603416137728                                                       target_dec_vp6f_fuzzer
+768/clusterfuzz-testcase-4807444305805312                                                       target_dec_rv40_fuzzer
+772/clusterfuzz-testcase-5453962780082176                                                       target_dec_h264_fuzzer
+773/clusterfuzz-testcase-6362160458366976                                                       target_dec_vp6f_fuzzer
+779/clusterfuzz-testcase-5568669545398272                                                       target_dec_mpeg4_fuzzer
+780/clusterfuzz-testcase-6393552642768896                                                       target_dec_gif_fuzzer
+807/clusterfuzz-testcase-6470061042696192                                                       target_dec_vp6f_fuzzer
+808/clusterfuzz-testcase-4715513349406720                                                       target_dec_wavpack_fuzzer
+809/clusterfuzz-testcase-6172687908995072                                                       target_dec_vp6f_fuzzer
+810/clusterfuzz-testcase-5249282825256960                                                       target_dec_targa_fuzzer
+811/clusterfuzz-testcase-6465493076541440                                                       target_dec_mjpeg_fuzzer
+822/clusterfuzz-testcase-4873433189974016                                                       target_dec_wavpack_fuzzer
+823/clusterfuzz-testcase-6727060074528768                                                       target_dec_pictor_fuzzer
+826/clusterfuzz-testcase-5316921379520512                                                       target_dec_tiff_fuzzer
+830/clusterfuzz-testcase-6253175327686656                                                       target_dec_mp2_fuzzer
+839/clusterfuzz-testcase-4871084446842880                                                       target_dec_wavpack_fuzzer
+842/clusterfuzz-testcase-6361547318231040                                                       target_dec_tiff_fuzzer
+847/clusterfuzz-testcase-5291877358108672                                                       target_dec_vp5_fuzzer
+848/clusterfuzz-testcase-5432155620507648                                                       target_dec_vp6f_fuzzer
+850/clusterfuzz-testcase-5721296509861888                                                       target_dec_vp6f_fuzzer
+857/clusterfuzz-testcase-5319093760557056                                                       target_dec_h264_fuzzer
+858/clusterfuzz-testcase-5168477042114560                                                       target_dec_h264_fuzzer
+861/clusterfuzz-testcase-5688284384591872                                                       target_dec_tiff_fuzzer
+864/clusterfuzz-testcase-4774385942528000                                                       target_dec_h264_fuzzer
+870/clusterfuzz-testcase-5649105424482304                                                       target_dec_mjpeg_fuzzer
+873/clusterfuzz-testcase-5714546230558720                                                       target_dec_mp3_fuzzer
+874/clusterfuzz-testcase-5252796175613952                                                       target_dec_tiff_fuzzer
+894/clusterfuzz-testcase-4841537823309824                                                       target_dec_wavpack_fuzzer
+898/clusterfuzz-testcase-6149765467209728                                                       target_dec_pictor_fuzzer
+902/clusterfuzz-testcase-4561155144024064                                                       target_dec_h264_fuzzer
+911/clusterfuzz-testcase-5415105606975488                                                       target_dec_h264_fuzzer
+936/clusterfuzz-testcase-4700061919346688                                                       target_dec_tiff_fuzzer
+938/clusterfuzz-testcase-4791735110598656                                                       target_dec_amrnb_fuzzer
+939/clusterfuzz-testcase-6515070404132864                                                       target_dec_h264_fuzzer
+940/clusterfuzz-testcase-5200378381467648                                                       target_dec_wavpack_fuzzer
+943/clusterfuzz-testcase-5114865297391616                                                       target_dec_jpegls_fuzzer
+943/clusterfuzz-testcase-5114865297391616                                                       target_dec_mjpeg_fuzzer
+945/clusterfuzz-testcase-6037937588273152                                                       target_dec_wavpack_fuzzer
+979/clusterfuzz-testcase-4940780542099456                                                       target_dec_h264_fuzzer
+1044/clusterfuzz-testcase-minimized-ffmpeg_AUDIO_AV_CODEC_ID_DTS_fuzzer-6135262067294208        target_dec_dca_fuzzer
+1072/clusterfuzz-testcase-6456688074817536                                                      target_dec_aac_fuzzer
+1080/clusterfuzz-testcase-5353236754071552                                                      target_dec_dvdsub_fuzzer
+1085/clusterfuzz-testcase-6089649833377792                                                      target_dec_tiff_fuzzer
+1133/clusterfuzz-testcase-minimized-ffmpeg_VIDEO_AV_CODEC_ID_MJPEG_fuzzer-4861925596856320      target_dec_mjpeg_fuzzer
+1136/clusterfuzz-testcase-6024209379622912                                                      target_dec_sipr_fuzzer
+1137/clusterfuzz-testcase-6711216560930816                                                      target_dec_jpegls_fuzzer
+1141/clusterfuzz-testcase-6659734767665152                                                      target_dec_amrnb_fuzzer
+1213/clusterfuzz-testcase-minimized-6022987469815808                                            target_dec_tiff_fuzzer
+1214/clusterfuzz-testcase-minimized-6130606599569408                                            target_dec_h264_fuzzer
+1271/clusterfuzz-testcase-minimized-6095220498235392                                            target_dec_targa_fuzzer
+1275/clusterfuzz-testcase-minimized-6718162017976320                                            target_dec_mdec_fuzzer
+1280/clusterfuzz-testcase-minimized-6102353767825408                                            target_dec_svq3_fuzzer
+1282/clusterfuzz-testcase-minimized-5400131681648640                                            target_dec_bmp_fuzzer
+1283/clusterfuzz-testcase-minimized-6221126759874560                                            target_dec_vp3_fuzzer
+1290/clusterfuzz-testcase-minimized-5815578902134784                                            target_dec_indeo2_fuzzer
+1292/clusterfuzz-testcase-minimized-5795512143839232                                            target_dec_flic_fuzzer
+1293/clusterfuzz-testcase-minimized-6054752074858496                                            target_dec_smc_fuzzer
+1298/clusterfuzz-testcase-minimized-5955580877340672                                            target_dec_mpeg4_fuzzer
+1305/clusterfuzz-testcase-minimized-5787235003662336                                            target_dec_amv_fuzzer
+1306/clusterfuzz-testcase-minimized-6152296217968640                                            target_dec_msvideo1_fuzzer
+1309/clusterfuzz-testcase-minimized-5754803370065920                                            target_dec_pcx_fuzzer
+1314/clusterfuzz-testcase-minimized-4621997222920192                                            target_dec_png_fuzzer
+1321/clusterfuzz-testcase-minimized-5875549597597696                                            target_dec_cinepak_fuzzer
+1322/clusterfuzz-testcase-minimized-4728193644756992                                            target_dec_png_fuzzer
+1335/clusterfuzz-testcase-minimized-5566961566089216                                            target_dec_cavs_fuzzer
+1336/clusterfuzz-testcase-minimized-4761381930795008                                            target_dec_pixlet_fuzzer
+1337/clusterfuzz-testcase-minimized-5212314171080704                                            target_dec_aac_fuzzer
+1338/clusterfuzz-testcase-minimized-6485546354343936                                            target_dec_wnv1_fuzzer
+1339/clusterfuzz-testcase-minimized-4614671485108224                                            target_dec_dss_sp_fuzzer
+1340/clusterfuzz-testcase-minimized-4669892148068352                                            target_dec_adpcm_g722_fuzzer
+1341/clusterfuzz-testcase-minimized-5441502618583040                                            target_dec_cdxl_fuzzer
+1342/clusterfuzz-testcase-minimized-5490842129137664                                            target_dec_nellymoser_fuzzer
+1344/clusterfuzz-testcase-minimized-5567131804499968                                            target_dec_zmbv_fuzzer
+1345/clusterfuzz-testcase-minimized-6062963045695488                                            target_dec_dfa_fuzzer
+1346/clusterfuzz-testcase-minimized-5776732600664064                                            target_dec_mdec_fuzzer
+1348/clusterfuzz-testcase-minimized-6195673642827776                                            target_dec_tiertexseqvideo_fuzzer
+1349/clusterfuzz-testcase-minimized-5370707196248064                                            target_dec_aac_fuzzer
+1351/clusterfuzz-testcase-minimized-5861971645693952                                            target_dec_indeo4_fuzzer
+1352/clusterfuzz-testcase-minimized-5757565017260032                                            target_dec_ac3_fixed_fuzzer
+1353/clusterfuzz-testcase-minimized-5208180449607680                                            target_dec_snow_fuzzer
+1354/clusterfuzz-testcase-minimized-5520132195483648                                            target_dec_sami_fuzzer
+1355/clusterfuzz-testcase-minimized-6662205472768000                                            target_dec_mlp_fuzzer
+1356/clusterfuzz-testcase-minimized-6008489086287872                                            target_dec_fic_fuzzer
+1360/clusterfuzz-testcase-minimized-5606472043986944                                            target_dec_clearvideo_fuzzer
+1362/clusterfuzz-testcase-minimized-6097275002552320                                            target_dec_opus_fuzzer
+1365/clusterfuzz-testcase-minimized-5624158450876416                                            target_dec_mimic_fuzzer
+1366/clusterfuzz-testcase-minimized-5958052211589120                                            target_dec_ppm_fuzzer
+1367/clusterfuzz-testcase-minimized-5714968823463936                                            target_dec_g723_1_fuzzer
+1368/clusterfuzz-testcase-minimized-4507293276176384                                            target_dec_dfa_fuzzer
+1369/clusterfuzz-testcase-minimized-5048908029886464                                            target_dec_webp_fuzzer
+1371/clusterfuzz-testcase-minimized-5770822591447040                                            target_dec_shorten_fuzzer
+1372/clusterfuzz-testcase-minimized-5712192982745088                                            target_dec_msa1_fuzzer
+1374/clusterfuzz-testcase-minimized-5692496346611712                                            target_dec_mpeg1video_fuzzer
+1375/clusterfuzz-testcase-minimized-6070134701555712                                            target_dec_hq_hqa_fuzzer
+1376/clusterfuzz-testcase-minimized-6361794975105024                                            target_dec_targa_y216_fuzzer
+1377/clusterfuzz-testcase-minimized-5487049807233024                                            target_dec_aac_fixed_fuzzer
+1378/clusterfuzz-testcase-minimized-5715088008806400                                            target_dec_cdxl_fuzzer
+1380/clusterfuzz-testcase-minimized-6501225451225088                                            target_dec_dds_fuzzer
+1381/clusterfuzz-testcase-minimized-5513944540119040                                            target_dec_msmpeg4v1_fuzzer
+1382/clusterfuzz-testcase-minimized-6013445293998080                                            target_dec_svq3_fuzzer
+1385/clusterfuzz-testcase-minimized-5552882663292928                                            target_dec_indeo4_fuzzer
+1386/clusterfuzz-testcase-minimized-5323086394032128                                            target_dec_txd_fuzzer
+1387/clusterfuzz-testcase-minimized-4802757766676480                                            target_dec_mts2_fuzzer
+1388/clusterfuzz-testcase-minimized-6680800936329216                                            target_dec_ra_144_fuzzer
+1389/clusterfuzz-testcase-minimized-5330877464707072                                            target_dec_shorten_fuzzer
+1390/clusterfuzz-testcase-minimized-5452757630713856                                            target_dec_magicyuv_fuzzer
+1391/clusterfuzz-testcase-minimized-4556900198776832                                            target_dec_indeo4_fuzzer
+1393/clusterfuzz-testcase-minimized-5948366791901184                                            target_dec_adpcm_g726_fuzzer
+1394/clusterfuzz-testcase-minimized-6493376885030912                                            target_dec_eamad_fuzzer
+1395/clusterfuzz-testcase-minimized-5330939741732864                                            target_dec_s302m_fuzzer
+1397/clusterfuzz-testcase-minimized-6369226291937280                                            target_dec_hevc_fuzzer
+1398/clusterfuzz-testcase-minimized-4576913622302720                                            target_dec_aac_fuzzer
+1399/clusterfuzz-testcase-minimized-4866094172995584                                            target_dec_xwd_fuzzer
+1401/clusterfuzz-testcase-minimized-6526248148795392                                            target_dec_wmv2_fuzzer
+1402/clusterfuzz-testcase-minimized-6302213041291264                                            target_dec_h264_fuzzer
+1403/clusterfuzz-testcase-minimized-4724820484816896                                            target_dec_ffv1_fuzzer
+1404/clusterfuzz-testcase-minimized-5000441286885376                                            target_dec_cavs_fuzzer
+1405/clusterfuzz-testcase-minimized-5011491835084800                                            target_dec_hqx_fuzzer
+1406/clusterfuzz-testcase-minimized-5064865125236736                                            target_dec_vp7_fuzzer
+1407/clusterfuzz-testcase-minimized-6044604124102656                                            target_dec_webp_fuzzer
+1408/clusterfuzz-testcase-minimized-6529985844084736                                            target_dec_dvbsub_fuzzer
+1409/clusterfuzz-testcase-minimized-5237365020819456                                            target_dec_dss_sp_fuzzer
+1410/clusterfuzz-testcase-minimized-6065423843852288                                            target_dec_magicyuv_fuzzer
+1411/clusterfuzz-testcase-minimized-5776085184675840                                            target_dec_bmv_video_fuzzer
+1412/clusterfuzz-testcase-minimized-6561308772139008                                            target_dec_g723_1_fuzzer
+1413/clusterfuzz-testcase-minimized-5923451770503168                                            target_dec_fic_fuzzer
+1415/clusterfuzz-testcase-minimized-6417783363469312                                            target_dec_dvbsub_fuzzer
+1416/clusterfuzz-testcase-minimized-5536862435278848                                            target_dec_indeo2_fuzzer
+1417/clusterfuzz-testcase-minimized-6606778030620672                                            target_dec_clearvideo_fuzzer
+1418/clusterfuzz-testcase-minimized-5934472438480896                                            target_dec_flac_fuzzer
+1419/clusterfuzz-testcase-minimized-6108700873850880                                            target_dec_snow_fuzzer
+1420/clusterfuzz-testcase-minimized-6059927359455232                                            target_dec_webp_fuzzer
+1421/clusterfuzz-testcase-minimized-6239947507892224                                            target_dec_cllc_fuzzer
+1422/clusterfuzz-testcase-minimized-5030993939398656                                            target_dec_scpr_fuzzer
+1423/clusterfuzz-testcase-minimized-5063889899225088                                            target_dec_tak_fuzzer
+1424/clusterfuzz-testcase-minimized-6088327159611392                                            target_dec_lagarith_fuzzer
+1425/clusterfuzz-testcase-minimized-6295712339853312                                            target_dec_lagarith_fuzzer
+1426/clusterfuzz-testcase-minimized-4774371304407040                                            target_dec_lagarith_fuzzer
+1427/clusterfuzz-testcase-minimized-5020737339392000                                            target_dec_cdxl_fuzzer
+1428/clusterfuzz-testcase-minimized-5263281793007616                                            target_dec_dds_fuzzer
+1429/clusterfuzz-testcase-minimized-5959951610544128                                            target_dec_svq3_fuzzer
+1434/clusterfuzz-testcase-minimized-6314998085189632                                            target_dec_webp_fuzzer
+1435/clusterfuzz-testcase-minimized-6483783723253760                                            target_dec_webp_fuzzer
+1437/clusterfuzz-testcase-minimized-4569970002362368                                            target_dec_y41p_fuzzer
+1438/clusterfuzz-testcase-minimized-4917542646710272                                            target_dec_cavs_fuzzer
+1439/clusterfuzz-testcase-minimized-4999148417843200                                            target_dec_g723_1_fuzzer
+1440/clusterfuzz-testcase-minimized-5785716111966208                                            target_dec_vp7_fuzzer
+1441/clusterfuzz-testcase-minimized-6223152357048320                                            target_dec_dss_sp_fuzzer
+1443/clusterfuzz-testcase-minimized-4826998612426752                                            target_dec_eatqi_fuzzer
+1446/clusterfuzz-testcase-minimized-5577409124368384                                            target_dec_truemotion1_fuzzer
+1453/clusterfuzz-testcase-minimized-5024976874766336                                            target_dec_wavpack_fuzzer
+1462/clusterfuzz-testcase-minimized-6558894463647744                                            target_dec_pixlet_fuzzer
+1464/clusterfuzz-testcase-minimized-4925445571084288                                            target_dec_mpeg2video_fuzzer
+1466/clusterfuzz-testcase-minimized-5961584419536896                                            target_dec_xpm_fuzzer
+1468/clusterfuzz-testcase-minimized-5235964056174592                                            target_dec_mimic_fuzzer
+1470/clusterfuzz-testcase-minimized-5404421666111488                                            target_dec_webp_fuzzer
+1471/clusterfuzz-testcase-minimized-6376460543590400                                            target_dec_aac_fixed_fuzzer
+1472/clusterfuzz-testcase-minimized-5677426430443520                                            target_dec_webp_fuzzer
+1473/clusterfuzz-testcase-minimized-5768907824562176                                            target_dec_dvbsub_fuzzer
+1478/clusterfuzz-testcase-minimized-5285486908145664                                            target_dec_scpr_fuzzer
+1479/clusterfuzz-testcase-minimized-6638493360979968                                            target_dec_cllc_fuzzer
+1480/clusterfuzz-testcase-minimized-5188321007370240                                            target_dec_msmpeg4v2_fuzzer
+1481/clusterfuzz-testcase-minimized-5264379509473280                                            target_dec_shorten_fuzzer
+1483/clusterfuzz-testcase-minimized-6386507814273024                                            target_dec_msa1_fuzzer
+1485/clusterfuzz-testcase-minimized-6639880215986176                                            target_dec_msa1_fuzzer
+1487/clusterfuzz-testcase-minimized-6288036495097856                                            target_dec_dirac_fuzzer
+1489/clusterfuzz-testcase-minimized-5075102901207040                                            target_dec_aac_fuzzer
+1503/clusterfuzz-testcase-minimized-5369271855087616                                            target_dec_wmv2_fuzzer
+1504/clusterfuzz-testcase-minimized-6249212138225664                                            target_dec_g723_1_fuzzer
+1505/clusterfuzz-testcase-minimized-4561688818876416                                            target_dec_dds_fuzzer
+1506/clusterfuzz-testcase-minimized-5401272918212608                                            target_dec_cavs_fuzzer
+1507/clusterfuzz-testcase-minimized-4955228300378112                                            target_dec_hq_hqa_fuzzer
+1508/clusterfuzz-testcase-minimized-5011336327069696                                            target_dec_fmvc_fuzzer
+1509/clusterfuzz-testcase-minimized-5129419876204544                                            target_dec_rscc_fuzzer
+1510/clusterfuzz-testcase-minimized-5826231746428928                                            target_dec_dds_fuzzer
+1511/clusterfuzz-testcase-minimized-5906663800307712                                            target_dec_ffv1_fuzzer
+1512/clusterfuzz-testcase-minimized-4713846423945216                                            target_dec_mlp_fuzzer
+1513/clusterfuzz-testcase-minimized-6246484833992704                                            target_dec_h264_fuzzer
+1514/clusterfuzz-testcase-minimized-6437666243477504                                            target_dec_indeo4_fuzzer
+1519/clusterfuzz-testcase-minimized-5286680976162816                                            target_dec_scpr_fuzzer
+1535/clusterfuzz-testcase-minimized-5826695535788032                                            target_dec_aac_fixed_fuzzer
+1536/clusterfuzz-testcase-minimized-5973925404082176                                            target_dec_webp_fuzzer
+1538/clusterfuzz-testcase-minimized-4696904925446144                                            target_dec_ac3_fuzzer
+1541/clusterfuzz-testcase-minimized-6403410590957568                                            target_dec_mlp_fuzzer
+1556/clusterfuzz-testcase-minimized-5027865978470400                                            target_dec_svq3_fuzzer
+1557/clusterfuzz-testcase-minimized-6535013757616128                                            target_dec_webp_fuzzer
+1559/clusterfuzz-testcase-minimized-5048096079740928                                            target_dec_ffv1_fuzzer
+1560/clusterfuzz-testcase-minimized-6011037813833728                                            target_dec_ffv1_fuzzer
+1567/clusterfuzz-testcase-minimized-5693653555085312                                            target_dec_g723_1_fuzzer
+1568/clusterfuzz-testcase-minimized-5944868608147456                                            target_dec_hqx_fuzzer
+1569/clusterfuzz-testcase-minimized-6328690508038144                                            target_dec_pixlet_fuzzer
+1570/clusterfuzz-testcase-minimized-6455337349545984                                            target_dec_ac3_fuzzer
+1572/clusterfuzz-testcase-minimized-4578773729017856                                            target_dec_mpeg4_fuzzer
+1576/clusterfuzz-testcase-minimized-5592896440893440                                            target_dec_tiff_fuzzer
+1604/clusterfuzz-testcase-minimized-5312060206350336                                            target_dec_svq3_fuzzer
+1609/clusterfuzz-testcase-minimized-5102163007111168                                            target_dec_g723_1_fuzzer
+1615/clusterfuzz-testcase-minimized-6625214647500800                                            target_dec_scpr_fuzzer
+1616/clusterfuzz-testcase-minimized-5119196578971648                                            target_dec_truemotion1_fuzzer
+1626/clusterfuzz-testcase-minimized-6416580571299840                                            target_dec_hq_hqa_fuzzer
+1630/clusterfuzz-testcase-minimized-6326111917047808                                            target_dec_tak_fuzzer
+1631/clusterfuzz-testcase-minimized-4861568200212480                                            target_dec_tiff_fuzzer
+1635/clusterfuzz-testcase-minimized-4992749856096256                                            target_dec_tak_fuzzer
+1636/clusterfuzz-testcase-minimized-5310494757879808                                            target_dec_mlp_fuzzer
+1637/clusterfuzz-testcase-minimized-5376582493405184                                            target_dec_flic_fuzzer
+1639/clusterfuzz-testcase-minimized-5693801463021568                                            target_dec_h264_fuzzer
+1643/clusterfuzz-testcase-minimized-6117573403869184                                            target_dec_fmvc_fuzzer
+1654/clusterfuzz-testcase-minimized-5151903795118080                                            target_dec_aac_fixed_fuzzer
+1655/clusterfuzz-testcase-minimized-5587079276789760                                            target_dec_rv40_fuzzer
+1656/clusterfuzz-testcase-minimized-5900404925661184                                            target_dec_aac_latm_fuzzer
+1657/clusterfuzz-testcase-minimized-4710000079405056                                            target_dec_dfa_fuzzer
+1658/clusterfuzz-testcase-minimized-4889937130291200                                            target_dec_mlp_fuzzer
+1659/clusterfuzz-testcase-minimized-5396490639900672                                            target_dec_wavpack_fuzzer
+1664/clusterfuzz-testcase-minimized-6587801187385344                                            target_dec_pixlet_fuzzer
+1669/clusterfuzz-testcase-minimized-5287529198649344                                            target_dec_fic_fuzzer
+1671/clusterfuzz-testcase-minimized-4759078033162240                                            target_dec_mimic_fuzzer
+1674/clusterfuzz-testcase-minimized-6092531563495424                                            target_dec_aac_fixed_fuzzer
+1681/clusterfuzz-testcase-minimized-5970545365483520                                            target_dec_aac_fixed_fuzzer
+1686/clusterfuzz-testcase-minimized-6282691643179008                                            target_dec_aac_fixed_fuzzer
+1699/clusterfuzz-testcase-minimized-6327177438035968                                            target_dec_mlp_fuzzer
+1702/clusterfuzz-testcase-minimized-5777869676478464                                            target_dec_ffv1_fuzzer
+1706/clusterfuzz-testcase-minimized-6112772670619648                                            target_dec_tak_fuzzer
+1707/clusterfuzz-testcase-minimized-6502767008940032                                            target_dec_escape124_fuzzer
+1708/clusterfuzz-testcase-minimized-5035111957397504                                            target_dec_mlp_fuzzer
+1709/clusterfuzz-testcase-minimized-4513580554649600                                            target_dec_aac_fixed_fuzzer
+1710/clusterfuzz-testcase-minimized-4837032931098624                                            target_dec_vp9_fuzzer
+1711/clusterfuzz-testcase-minimized-5248503515185152                                            target_dec_mlp_fuzzer
+1713/clusterfuzz-testcase-minimized-5791887476654080                                            target_dec_tak_fuzzer
+1716/clusterfuzz-testcase-minimized-4691012196761600                                            target_dec_aac_fixed_fuzzer
+1717/clusterfuzz-testcase-minimized-5491696676634624                                            target_dec_vmnc_fuzzer
+1719/clusterfuzz-testcase-minimized-6375090079924224                                            target_dec_tscc2_fuzzer
+1720/clusterfuzz-testcase-minimized-4952373438971904                                            target_dec_mlp_fuzzer
+1721/clusterfuzz-testcase-minimized-4719352135811072                                            target_dec_aac_fixed_fuzzer
+1723/clusterfuzz-testcase-minimized-5309409372667904                                            target_dec_mpeg4_fuzzer
+1724/clusterfuzz-testcase-minimized-4842395432648704                                            target_dec_thp_fuzzer
+1725/clusterfuzz-testcase-minimized-5132425044688896                                            target_dec_cavs_fuzzer
+1726/clusterfuzz-testcase-minimized-4509005575618560                                            target_dec_aac_fixed_fuzzer
+1727/clusterfuzz-testcase-minimized-5900685306494976                                            target_dec_mpeg4_fuzzer
+1731/clusterfuzz-testcase-minimized-5123972414832640                                            target_dec_mp3adu_fuzzer
+1734/clusterfuzz-testcase-minimized-5385630815092736                                            target_dec_indeo5_fuzzer
+1735/clusterfuzz-testcase-minimized-5350472347025408                                            target_dec_aac_fixed_fuzzer
+1737/clusterfuzz-testcase-minimized-5922321338466304                                            target_dec_mpeg4_fuzzer
+1738/clusterfuzz-testcase-minimized-6734814327603200                                            target_dec_aac_fixed_fuzzer
+1739/clusterfuzz-testcase-minimized-5399237707694080                                            target_dec_tak_fuzzer
+1743/clusterfuzz-testcase-minimized-4994834022531072                                            target_dec_tak_fuzzer
+1745/clusterfuzz-testcase-minimized-6160693365571584                                            target_dec_paf_video_fuzzer
+1746/clusterfuzz-testcase-minimized-6687393392361472                                            target_dec_asv2_fuzzer
+1747/clusterfuzz-testcase-minimized-6035451213250560                                            target_dec_xsub_fuzzer
+1748/clusterfuzz-testcase-minimized-6690208340770816                                            target_dec_ffv1_fuzzer
+1753/clusterfuzz-testcase-minimized-6205127620820992                                            target_dec_pbm_fuzzer
+1758/clusterfuzz-testcase-minimized-6054857184116736                                            target_dec_g723_1_fuzzer
+1762/clusterfuzz-testcase-minimized-5150981081792512                                            target_dec_aac_fixed_fuzzer
+1763/clusterfuzz-testcase-minimized-5191733576990720                                            target_dec_pam_fuzzer
+1764/clusterfuzz-testcase-minimized-5394243164045312                                            target_dec_lagarith_fuzzer
+1766/clusterfuzz-testcase-minimized-6562020075765760                                            target_dec_g723_1_fuzzer
+1767/clusterfuzz-testcase-minimized-6657181250224128                                            target_dec_pgm_fuzzer
+1770/clusterfuzz-testcase-minimized-5285511235108864                                            target_dec_aac_fixed_fuzzer
+1773/clusterfuzz-testcase-minimized-4832523987189760                                            target_dec_mjpeg_fuzzer
+1775/clusterfuzz-testcase-minimized-5330288148217856                                            target_dec_aac_fixed_fuzzer
+1776/clusterfuzz-testcase-minimized-6191258231898112                                            target_dec_wavpack_fuzzer
+1778/clusterfuzz-testcase-minimized-5128953268273152                                            target_dec_wavpack_fuzzer
+1781/clusterfuzz-testcase-minimized-4617176877105152                                            target_dec_dirac_fuzzer
+1785/clusterfuzz-testcase-minimized-6035918794260480                                            target_dec_ppm_fuzzer
+1802/clusterfuzz-testcase-minimized-5008293510512640                                            target_dec_cllc_fuzzer
+1807/clusterfuzz-testcase-minimized-6258676199325696                                            target_dec_wavpack_fuzzer
+1815/clusterfuzz-testcase-minimized-5237739320508416                                            target_dec_jpeg2000_fuzzer
+1817/clusterfuzz-testcase-minimized-5104230530547712                                            target_dec_subrip_fuzzer
+1818/clusterfuzz-testcase-minimized-5039166473633792                                            target_dec_smc_fuzzer
+1821/clusterfuzz-testcase-minimized-6050283782144000                                            target_dec_vp3_fuzzer
+1825/clusterfuzz-testcase-minimized-6002833050566656                                            target_dec_aac_fixed_fuzzer
+1826/clusterfuzz-testcase-minimized-5728569256837120                                            target_dec_clearvideo_fuzzer
+1829/clusterfuzz-testcase-minimized-5527165321871360                                            target_dec_pixlet_fuzzer
+1830/clusterfuzz-testcase-minimized-5828293733384192                                            target_dec_ra_144_fuzzer
+1832/clusterfuzz-testcase-minimized-6574546079449088                                            target_dec_mlp_fuzzer
+1839/clusterfuzz-testcase-minimized-6238490993885184                                            target_dec_indeo4_fuzzer
+1841/clusterfuzz-testcase-minimized-5858969564217344                                            target_dec_aac_fixed_fuzzer
+1845/clusterfuzz-testcase-minimized-5075974343360512                                            target_dec_wnv1_fuzzer
+1851/clusterfuzz-testcase-minimized-5692607495667712                                            target_dec_aac_fixed_fuzzer
+1853/clusterfuzz-testcase-minimized-5471155626442752                                            target_dec_wavpack_fuzzer
+1858/clusterfuzz-testcase-minimized-6450473802399744                                            target_dec_sheervideo_fuzzer
+1870/clusterfuzz-testcase-minimized-4686788029317120                                            target_dec_jpeg2000_fuzzer
+1871/clusterfuzz-testcase-minimized-5719950331215872                                            target_dec_snow_fuzzer
+1874/clusterfuzz-testcase-minimized-5037763613163520                                            target_dec_ylc_fuzzer
+1875/clusterfuzz-testcase-minimized-5536474562822144                                            target_dec_webp_fuzzer
+1878/clusterfuzz-testcase-minimized-6441918630199296                                            target_dec_aac_fixed_fuzzer
+1880/clusterfuzz-testcase-minimized-4900645322620928                                            target_dec_aac_fixed_fuzzer
+1882/clusterfuzz-testcase-minimized-5539735650959360                                            target_dec_aac_fuzzer
+1884/clusterfuzz-testcase-minimized-4637425835966464                                            target_dec_ra_144_fuzzer
+1885/clusterfuzz-testcase-minimized-5336328549957632                                            target_dec_ra_144_fuzzer
+1888/clusterfuzz-testcase-minimized-5237704826552320                                            target_dec_truemotion2_fuzzer
+1890/clusterfuzz-testcase-minimized-6329019509243904                                            target_dec_jpeg2000_fuzzer
+1891/clusterfuzz-testcase-minimized-6274417925554176                                            target_dec_dds_fuzzer
+1892/clusterfuzz-testcase-minimized-4519341733183488                                            target_dec_ansi_fuzzer
+1894/clusterfuzz-testcase-minimized-4716739789062144                                            target_dec_wavpack_fuzzer
+1898/clusterfuzz-testcase-minimized-5970744880136192                                            target_dec_wavpack_fuzzer
+1902/clusterfuzz-testcase-minimized-4762451407011840                                            target_dec_amrwb_fuzzer
+1903/clusterfuzz-testcase-minimized-5359318167715840                                            target_dec_cavs_fuzzer
+1906/clusterfuzz-testcase-minimized-4599315114754048                                            target_dec_pgmyuv_fuzzer
+1908/clusterfuzz-testcase-minimized-5392712477966336                                            target_dec_ra_144_fuzzer
+1909/clusterfuzz-testcase-minimized-6732072662073344                                            target_dec_hevc_fuzzer
+1917/clusterfuzz-testcase-minimized-5023221273329664                                            target_dec_cinepak_fuzzer
+1922/clusterfuzz-testcase-minimized-5561194112876544                                            target_dec_wavpack_fuzzer
+1925/clusterfuzz-testcase-minimized-5564569688735744                                            target_dec_cfhd_fuzzer
+1934/clusterfuzz-testcase-minimized-4659523174268928                                            target_dec_mp1_fuzzer
+1935/clusterfuzz-testcase-minimized-4939127826939904                                            target_dec_mp2float_fuzzer
+1938/clusterfuzz-testcase-minimized-6595305602547712                                            target_dec_mp3float_fuzzer
+1939/clusterfuzz-testcase-minimized-5544941956628480                                            target_dec_vp9_fuzzer
+1941/clusterfuzz-testcase-minimized-4719816059387904                                            target_dec_h264_fuzzer
+1942/clusterfuzz-testcase-minimized-4870171724349440                                            target_dec_h264_fuzzer
+1943/clusterfuzz-testcase-minimized-4912348974284800                                            target_dec_vp9_fuzzer
+1944/clusterfuzz-testcase-minimized-4957953339686912                                            target_dec_aac_fixed_fuzzer
+1946/clusterfuzz-testcase-minimized-5780475010351104                                            target_dec_vp9_fuzzer
+1947/clusterfuzz-testcase-minimized-6266250911023104                                            target_dec_vp9_fuzzer
+1948/clusterfuzz-testcase-minimized-6601933810827264                                            target_dec_rv40_fuzzer
+1949/clusterfuzz-testcase-minimized-6645980176842752                                            target_dec_svq3_fuzzer
+1967/clusterfuzz-testcase-minimized-5757031199801344                                            target_dec_wavpack_fuzzer
+2001/clusterfuzz-testcase-minimized-6187599389523968                                            target_dec_asv2_fuzzer
+2004/clusterfuzz-testcase-minimized-5533262866808832                                            target_dec_snow_fuzzer
+2005/clusterfuzz-testcase-minimized-5744226438479872                                            target_dec_aac_fixed_fuzzer
+2006/clusterfuzz-testcase-minimized-5766515037044736                                            target_dec_dxv_fuzzer
+2010/clusterfuzz-testcase-minimized-6209288450080768                                            target_dec_hevc_fuzzer
+2014/clusterfuzz-testcase-minimized-5186337030275072                                            target_dec_aac_fixed_fuzzer
+2038/clusterfuzz-testcase-minimized-4521466148159488                                            target_dec_wavpack_fuzzer
+2045/clusterfuzz-testcase-minimized-6751255865065472                                            target_dec_aac_fixed_fuzzer
+2065/clusterfuzz-testcase-minimized-6298930457346048                                            target_dec_qdraw_fuzzer
+2067/clusterfuzz-testcase-minimized-5578430902960128                                            target_dec_cavs_fuzzer
+2071/clusterfuzz-testcase-minimized-6036414271586304                                            target_dec_aac_fixed_fuzzer
+2076/clusterfuzz-testcase-minimized-6542640243802112                                            target_dec_tiff_fuzzer
+2079/clusterfuzz-testcase-minimized-5345861779324928                                            target_dec_tak_fuzzer
+2096/clusterfuzz-testcase-minimized-4901566068817920                                            target_dec_aac_fixed_fuzzer
+2097/clusterfuzz-testcase-minimized-5036861833609216                                            target_dec_mxpeg_fuzzer
+2100/clusterfuzz-testcase-minimized-4522961547558912                                            target_dec_paf_video_fuzzer
+2106/clusterfuzz-testcase-minimized-6136503639998464                                            target_dec_mpeg4_fuzzer
+2113/clusterfuzz-testcase-minimized-6510704959946752                                            target_dec_ac3_fixed_fuzzer
+2115/clusterfuzz-testcase-minimized-6594111748440064                                            target_dec_indeo4_fuzzer
+2127/clusterfuzz-testcase-minimized-6595787859427328                                            target_dec_subrip_fuzzer
+2131/clusterfuzz-testcase-minimized-4718045157130240                                            target_dec_shorten_fuzzer
+2134/clusterfuzz-testcase-minimized-4619258405322752                                            target_dec_wavpack_fuzzer
+2143/clusterfuzz-testcase-minimized-5482288060039168                                            target_dec_dvbsub_fuzzer
+2145/clusterfuzz-testcase-minimized-5866217724182528                                            target_dec_h264_fuzzer
+2154/clusterfuzz-testcase-minimized-4879971375906816                                            target_dec_hevc_fuzzer
+2159/clusterfuzz-testcase-minimized-5267945972301824                                            target_dec_h264_fuzzer
+2164/clusterfuzz-testcase-minimized-4715936172998656                                            target_dec_aac_fixed_fuzzer
+2169/clusterfuzz-testcase-minimized-5688641642823680                                            target_dec_cfhd_fuzzer
+2174/clusterfuzz-testcase-minimized-5739234533048320                                            target_dec_flic_fuzzer
+2175/clusterfuzz-testcase-minimized-5809657849315328                                            target_dec_ra_144_fuzzer
+2176/clusterfuzz-testcase-minimized-5908197216878592                                            target_dec_tiff_fuzzer
+2181/clusterfuzz-testcase-minimized-6314784322486272                                            target_dec_wavpack_fuzzer
+2192/clusterfuzz-testcase-minimized-5370387988742144                                            target_dec_mpeg4_fuzzer
+2195/clusterfuzz-testcase-minimized-4736721533009920                                            target_dec_aac_fixed_fuzzer
+2197/clusterfuzz-testcase-minimized-6010716676947968                                            target_dec_snow_fuzzer
+2204/clusterfuzz-testcase-minimized-5616756909408256                                            target_dec_mpeg4_fuzzer
+2208/clusterfuzz-testcase-minimized-5976593765761024                                            target_dec_jpeg2000_fuzzer
+2209/clusterfuzz-testcase-minimized-5012343912136704                                            target_dec_hevc_fuzzer
+2224/clusterfuzz-testcase-minimized-6208559949807616                                            target_dec_aac_fixed_fuzzer
+2225/clusterfuzz-testcase-minimized-5505632079708160                                            target_dec_jpeg2000_fuzzer
+2231/clusterfuzz-testcase-minimized-4565181982048256                                            target_dec_jpeg2000_fuzzer
+2233/clusterfuzz-testcase-minimized-5943031318446080                                            target_dec_truemotion2_fuzzer
+2234/clusterfuzz-testcase-minimized-6266896041115648                                            target_dec_tak_fuzzer
+2239/clusterfuzz-testcase-minimized-5639766592716800                                            target_dec_jpeg2000_fuzzer
+2243/clusterfuzz-testcase-minimized-4683988125876224                                            target_dec_vp9_fuzzer
+2247/clusterfuzz-testcase-minimized-5165385038954496                                            target_dec_vp9_fuzzer
+2249/clusterfuzz-testcase-minimized-5388542379294720                                            target_dec_gdv_fuzzer
+2250/clusterfuzz-testcase-minimized-5693382112313344                                            target_dec_hevc_fuzzer
+2254/clusterfuzz-testcase-minimized-4735977664806912                                            target_dec_vp9_fuzzer
+2255/clusterfuzz-testcase-minimized-4917394667470848                                            target_dec_vp9_fuzzer
+2257/clusterfuzz-testcase-minimized-5622708022804480                                            target_dec_vp9_fuzzer
+2258/clusterfuzz-testcase-minimized-5924773878038528                                            target_dec_vp9_fuzzer
+2263/clusterfuzz-testcase-minimized-4800359627227136                                            target_dec_hevc_fuzzer
+2271/clusterfuzz-testcase-minimized-5778297776504832                                            target_dec_jpeg2000_fuzzer
+2272/clusterfuzz-testcase-minimized-5059103858622464                                            target_dec_iff_ilbm_fuzzer
+2286/clusterfuzz-testcase-minimized-5711764169687040                                            target_dec_aac_fixed_fuzzer
+2291/clusterfuzz-testcase-minimized-5538453481586688                                            target_dec_wavpack_fuzzer
+2292/clusterfuzz-testcase-minimized-6156080415506432                                            target_dec_mpeg4_fuzzer
+2299/clusterfuzz-testcase-minimized-4843509351710720                                            target_dec_hevc_fuzzer
+2303/clusterfuzz-testcase-minimized-5529675273076736                                            target_dec_cfhd_fuzzer
+2306/clusterfuzz-testcase-minimized-5002997392211968                                            target_dec_cfhd_fuzzer
+2310/clusterfuzz-testcase-minimized-4534784887881728                                            target_dec_tiff_fuzzer
+2314/clusterfuzz-testcase-minimized-4519333877252096                                            target_dec_tak_fuzzer
+2331/clusterfuzz-testcase-minimized-6182185830711296                                            target_dec_wavpack_fuzzer
+2333/clusterfuzz-testcase-minimized-5223935677300736                                            target_dec_hevc_fuzzer
+2338/clusterfuzz-testcase-minimized-5153426541379584                                            target_dec_mpeg4_fuzzer
+2339/clusterfuzz-testcase-minimized-6663164320022528                                            target_dec_hevc_fuzzer
+2351/clusterfuzz-testcase-minimized-5359403240783872                                            target_dec_wavpack_fuzzer
+2365/clusterfuzz-testcase-minimized-6020421927305216                                            target_dec_jpeg2000_fuzzer
+2367/clusterfuzz-testcase-minimized-4648678897745920                                            target_dec_jpeg2000_fuzzer
+2377/clusterfuzz-testcase-minimized-6108505935183872                                            target_dec_wavpack_fuzzer
+2385/clusterfuzz-testcase-minimized-6594333576790016                                            target_dec_hevc_fuzzer
+2393/clusterfuzz-testcase-minimized-6128334993883136                                            target_dec_vb_fuzzer
+2395/clusterfuzz-testcase-minimized-6540529313513472                                            target_dec_cfhd_fuzzer
+2406/clusterfuzz-testcase-minimized-5294603055923200                                            target_dec_interplay_video_fuzzer
+2407/clusterfuzz-testcase-minimized-5858436027777024                                            target_dec_interplay_video_fuzzer
+2408/clusterfuzz-testcase-minimized-5432734438653952                                            target_dec_interplay_video_fuzzer
+2415/clusterfuzz-testcase-minimized-4672827619803136                                            target_dec_interplay_video_fuzzer
+2422/clusterfuzz-testcase-minimized-5242114713583616                                            target_dec_hevc_fuzzer
+2442/clusterfuzz-testcase-minimized-4985479546011648                                            target_dec_interplay_video_fuzzer
+2451/clusterfuzz-testcase-minimized-4781613957251072                                            target_dec_hevc_fuzzer
+2456/clusterfuzz-testcase-minimized-4822695051001856                                            target_dec_h264_fuzzer
+2467/clusterfuzz-testcase-minimized-4755798049685504                                            target_dec_interplay_video_fuzzer
+2478/clusterfuzz-testcase-minimized-4649584649306112                                            target_dec_aac_fuzzer
+2515/clusterfuzz-testcase-minimized-6197200012967936                                            target_dec_ylc_fuzzer
+2527/clusterfuzz-testcase-minimized-5260915396050944                                            target_dec_aac_fixed_fuzzer
+2533/clusterfuzz-testcase-minimized-5372857678823424                                            target_dec_thp_fuzzer
+2550/clusterfuzz-testcase-minimized-6275019871092736                                            target_dec_aac_fixed_fuzzer
+2568/clusterfuzz-testcase-minimized-4926115716005888                                            target_dec_magicyuv_fuzzer
+2576/clusterfuzz-testcase-minimized-6002596705730560                                            target_dec_hevc_fuzzer
+2577/clusterfuzz-testcase-minimized-4802472348483584                                            target_dec_shorten_fuzzer
+2578/clusterfuzz-testcase-minimized-5098313588146176                                            target_dec_h264_fuzzer
+2581/clusterfuzz-testcase-minimized-4681474395602944                                            target_dec_aac_fixed_fuzzer
+2614/clusterfuzz-testcase-minimized-5949228129976320                                            target_dec_dirac_fuzzer
+2634/clusterfuzz-testcase-minimized-4540890636877824                                            target_dec_ffv1_fuzzer
+2674/clusterfuzz-testcase-minimized-4999700518273024                                            target_dec_dirac_fuzzer
+2678/clusterfuzz-testcase-minimized-4702787684270080                                            target_dec_aac_fixed_fuzzer
+2698/clusterfuzz-testcase-minimized-4713541443518464                                            target_dec_ylc_fuzzer
+2699/clusterfuzz-testcase-minimized-5631303862976512                                            target_dec_aac_fixed_fuzzer
+2702/clusterfuzz-testcase-minimized-4511932591636480                                            target_dec_hevc_fuzzer
+2707/clusterfuzz-testcase-minimized-5179636394754048                                            target_dec_jpeg2000_fuzzer
+2708/clusterfuzz-testcase-minimized-5510405650644992                                            target_dec_pixlet_fuzzer
+2710/clusterfuzz-testcase-minimized-4750001420894208                                            target_dec_zmbv_fuzzer
+2711/clusterfuzz-testcase-minimized-4975142398590976                                            target_dec_tak_fuzzer
+2715/clusterfuzz-testcase-minimized-5099055292088320                                            target_dec_jpeg2000_fuzzer
+2729/clusterfuzz-testcase-minimized-5902915464069120                                            target_dec_dirac_fuzzer
+2737/clusterfuzz-testcase-minimized-4968639147016192                                            target_dec_dirac_fuzzer
+2739/clusterfuzz-testcase-minimized-6737297955356672                                            target_dec_dirac_fuzzer
+2742/clusterfuzz-testcase-minimized-5724322402402304                                            target_dec_dirac_fuzzer
+2743/clusterfuzz-testcase-minimized-5820652076400640                                            target_dec_snow_fuzzer
+2744/clusterfuzz-testcase-minimized-4672435653705728                                            target_dec_dirac_fuzzer
+2747/clusterfuzz-testcase-minimized-5108132302815232                                            target_dec_dirac_fuzzer
+2749/clusterfuzz-testcase-minimized-5298741273690112                                            target_dec_dirac_fuzzer
+2764/clusterfuzz-testcase-minimized-5382561922547712                                            target_dec_dirac_fuzzer
+2809/clusterfuzz-testcase-minimized-4785181833560064                                            target_dec_h264_fuzzer
+2815/clusterfuzz-testcase-minimized-6062914471460864                                            target_dec_hevc_fuzzer
+2817/clusterfuzz-testcase-minimized-5289691240726528                                            target_dec_h264_fuzzer
+2818/clusterfuzz-testcase-minimized-5062943676825600                                            target_dec_aac_fixed_fuzzer
+2819/clusterfuzz-testcase-minimized-4743700301217792                                            target_dec_dirac_fuzzer
+2826/clusterfuzz-testcase-minimized-5901511613743104                                            target_dec_mpeg4_fuzzer
+2834/clusterfuzz-testcase-minimized-5988039123795968                                            target_dec_ffv1_fuzzer
+2838/clusterfuzz-testcase-minimized-6260066086813696                                            target_dec_dirac_fuzzer
+2841/clusterfuzz-testcase-minimized-4869071805874176                                            target_dec_dirac_fuzzer
+2844/clusterfuzz-testcase-minimized-5561715838156800                                            target_dec_dirac_fuzzer
+2860/clusterfuzz-testcase-minimized-4672811689836544                                            target_dec_dirac_fuzzer
+2861/clusterfuzz-testcase-minimized-5361070510178304                                            target_dec_dirac_fuzzer
+2866/clusterfuzz-testcase-minimized-4581973265743872                                            target_dec_hevc_fuzzer
+2873/clusterfuzz-testcase-minimized-5924145713905664                                            target_dec_aac_latm_fuzzer
+2879/clusterfuzz-testcase-minimized-6317542639403008                                            target_dec_pixlet_fuzzer
+2891/clusterfuzz-testcase-minimized-5881795457318912                                            target_dec_h264_fuzzer
+2893/clusterfuzz-testcase-minimized-5809330567774208                                            target_dec_hevc_fuzzer
+#2914/clusterfuzz-testcase-minimized-4787845073993728                                            target_dec_mpeg4_fuzzer
+#2919/clusterfuzz-testcase-minimized-4828609145470976                                            target_dec_dnxhd_fuzzer
+#2925/clusterfuzz-testcase-minimized-4971717589991424                                            target_dec_dca_fuzzer
+#2926/clusterfuzz-testcase-minimized-4987110014582784                                            target_dec_gdv_fuzzer
+#2928/clusterfuzz-testcase-minimized-4992812120539136                                            target_dec_shorten_fuzzer
+#2931/clusterfuzz-testcase-minimized-5051106906341376                                            target_dec_aac_latm_fuzzer
+#2933/clusterfuzz-testcase-minimized-5124990208835584                                            target_dec_lagarith_fuzzer
+#2943/clusterfuzz-testcase-minimized-5430257156882432                                            target_dec_cavs_fuzzer
+#2953/clusterfuzz-testcase-minimized-5604124211019776                                            target_dec_thp_fuzzer
+#2962/clusterfuzz-testcase-minimized-5812616687517696                                            target_dec_mjpeg_fuzzer
+#2971/clusterfuzz-testcase-minimized-6130678276030464                                            target_dec_ffv1_fuzzer
+#2973/clusterfuzz-testcase-minimized-6244323446226944                                            target_dec_vp9_fuzzer
+#2992/clusterfuzz-testcase-minimized-6649611793989632                                            target_dec_comfortnoise_fuzzer
+3013/clusterfuzz-testcase-minimized-4644084197097472                                            target_dec_dirac_fuzzer
+3023/clusterfuzz-testcase-minimized-6421736130084864                                            target_dec_snow_fuzzer
+3024/clusterfuzz-testcase-minimized-5885660323905536                                            target_dec_fic_fuzzer
+3030/clusterfuzz-testcase-minimized-4649809254285312                                            target_dec_pixlet_fuzzer
+3042/clusterfuzz-testcase-minimized-5174210131394560                                            target_dec_jpeg2000_fuzzer
+3051/clusterfuzz-testcase-minimized-5745818336231424                                            target_dec_dvbsub_fuzzer
+3053/clusterfuzz-testcase-minimized-6355082062856192                                            target_dec_dirac_fuzzer
+#3073/clusterfuzz-testcase-minimized-6717666356101120                                            target_dec_jpegls_fuzzer
+3077/clusterfuzz-testcase-minimized-4684917524922368                                            target_dec_hevc_fuzzer
+3081/clusterfuzz-testcase-minimized-4807564879462400                                            target_dec_dirac_fuzzer
+3091/clusterfuzz-testcase-minimized-6229767969832960                                            target_dec_hevc_fuzzer
+3124/clusterfuzz-testcase-minimized-4546434357526528                                            target_dec_dirac_fuzzer
+#3142/clusterfuzz-testcase-minimized-5007853163118592                                            target_dec_snow_fuzzer
+#3147/clusterfuzz-testcase-minimized-4870592182353920                                            target_dec_clearvideo_fuzzer
+3175/clusterfuzz-testcase-minimized-4736774054084608                                            target_dec_hevc_fuzzer
+3191/clusterfuzz-testcase-minimized-5688798451073024                                            target_dec_aac_fixed_fuzzer
+3196/clusterfuzz-testcase-minimized-4528307146063872                                            target_dec_tak_fuzzer
+#3200/clusterfuzz-testcase-minimized-5750022136135680                                            target_dec_wmv2_fuzzer
+3202/clusterfuzz-testcase-minimized-4988291642294272                                            target_dec_tak_fuzzer
+3203/clusterfuzz-testcase-minimized-4514553595428864                                            target_dec_png_fuzzer
+#3218/clusterfuzz-testcase-minimized-5390672154591232                                            target_dec_dvbsub_fuzzer
+#3242/clusterfuzz-testcase-minimized-5811951672229888                                            target_dec_scpr_fuzzer
+3279/clusterfuzz-testcase-minimized-4564805744590848                                            target_dec_dirac_fuzzer
+#3291/clusterfuzz-testcase-minimized-4630024655208448                                            target_dec_dxv_fuzzer
+3295/clusterfuzz-testcase-minimized-4738998142500864                                            target_dec_dirac_fuzzer
+3336/clusterfuzz-testcase-minimized-5656839179993088                                            target_dec_truemotion2_fuzzer
+3348/clusterfuzz-testcase-minimized-4809500517203968                                            target_dec_svq3_fuzzer
+3361/clusterfuzz-testcase-minimized-5065842955911168                                            target_dec_ffv1_fuzzer
+3373/clusterfuzz-testcase-minimized-5604083912146944                                            target_dec_hevc_fuzzer
+3410/clusterfuzz-testcase-minimized-5313377960198144                                            target_dec_prores_fuzzer
+3416/clusterfuzz-testcase-minimized-6125587682820096                                            target_dec_h264_fuzzer
+3443/clusterfuzz-testcase-minimized-5369987105554432                                            target_dec_aac_fixed_fuzzer
+3444/clusterfuzz-testcase-minimized-6270352105668608                                            target_dec_aac_latm_fuzzer
+3453/clusterfuzz-testcase-minimized-5555554657239040                                            target_dec_mpeg4_fuzzer
+3463/clusterfuzz-testcase-minimized-5557381989662720                                            target_dec_tiff_fuzzer
+3482/clusterfuzz-testcase-minimized-5446915875405824                                            target_dec_prores_fuzzer
+3485/clusterfuzz-testcase-minimized-4940429332054016                                            target_dec_dirac_fuzzer
+3492/clusterfuzz-testcase-minimized-5784775283441664                                            target_dec_aac_fixed_fuzzer
+3512/clusterfuzz-testcase-minimized-4812747210489856                                            target_dec_snow_fuzzer
+3516/clusterfuzz-testcase-minimized-4608518562775040                                            target_dec_mpeg4_fuzzer
+3528/clusterfuzz-testcase-minimized-6283628420005888                                            target_dec_mpeg4_fuzzer
+#3529/clusterfuzz-testcase-minimized-5057068371279872                                            target_dec_paf_video_fuzzer
+3541/clusterfuzz-testcase-minimized-6469958596820992                                            target_dec_jpeg2000_fuzzer
+3547/clusterfuzz-testcase-minimized-6009386439802880                                            target_dec_aac_fixed_fuzzer
+3594/clusterfuzz-testcase-minimized-4650622935629824                                            target_dec_aac_fixed_fuzzer
+3612/clusterfuzz-testcase-minimized-6393461273001984                                            target_dec_xan_wc3_fuzzer
+3642/clusterfuzz-testcase-minimized-5443853801750528                                            target_dec_aac_fixed_fuzzer
+#3707/clusterfuzz-testcase-minimized-6465922706440192                                            target_dec_xan_wc3_fuzzer
+3787/clusterfuzz-testcase-minimized-5728764920070144                                            target_dec_exr_fuzzer
+3805/clusterfuzz-testcase-minimized-6578427831255040                                            target_dec_h264_fuzzer
+3902/clusterfuzz-testcase-minimized-6081926122176512                                            target_dec_exr_fuzzer
+3984/clusterfuzz-testcase-minimized-5265759929368576                                            target_dec_snow_fuzzer
+4019/clusterfuzz-testcase-minimized-5823336006287360                                            target_dec_h264_fuzzer
+4035/clusterfuzz-testcase-minimized-6479308925173760                                            target_dec_dirac_fuzzer
+4037/clusterfuzz-testcase-minimized-5290998163832832                                            target_dec_hevc_fuzzer
+4074/clusterfuzz-testcase-minimized-4516104123711488                                            target_dec_truehd_fuzzer
+#4086/clusterfuzz-testcase-minimized-5452429861584896                                            target_dec_h264_fuzzer
+4143/clusterfuzz-testcase-minimized-4736864637419520                                            target_dec_zmbv_fuzzer
+4151/clusterfuzz-testcase-minimized-4854089193095168                                            target_dec_libfdk_aac_fuzzer
+4196/clusterfuzz-testcase-minimized-5580648594014208                                            target_dec_h264_fuzzer
+#4271/clusterfuzz-testcase-minimized-4676667768307712                                            target_dec_kgv1_fuzzer
+4326/clusterfuzz-testcase-minimized-5689449645080576                                            target_dec_truehd_fuzzer
+4337/clusterfuzz-testcase-minimized-6192658616680448                                            target_dec_aac_fixed_fuzzer
+4354/clusterfuzz-testcase-minimized-4671122764201984                                            target_dec_dirac_fuzzer
+4397/clusterfuzz-testcase-minimized-4779061080489984                                            target_dec_hevc_fuzzer
+4415/clusterfuzz-testcase-minimized-4677752314658816                                            target_dec_amrwb_fuzzer
+4427/clusterfuzz-testcase-minimized-5106919271301120                                            target_dec_jpeg2000_fuzzer
+4478/clusterfuzz-testcase-minimized-4752113767809024                                            target_dec_dirac_fuzzer
+4479/clusterfuzz-testcase-minimized-6529894147162112                                            target_dec_dirac_fuzzer
+4490/clusterfuzz-testcase-minimized-5210014592532480                                            target_dec_vp9_fuzzer
+4524/clusterfuzz-testcase-minimized-6055590120914944                                            target_dec_hevc_fuzzer
+4525/clusterfuzz-testcase-minimized-6400713073623040                                            target_dec_jpeg2000_fuzzer
+4554/clusterfuzz-testcase-minimized-4843714515042304                                            target_dec_hevc_fuzzer
+4555/clusterfuzz-testcase-minimized-4505532481142784                                            target_dec_hevc_fuzzer
+4563/clusterfuzz-testcase-minimized-5438979567517696                                            target_dec_dirac_fuzzer
+4626/clusterfuzz-testcase-minimized-5647837887987712                                            target_dec_hevc_fuzzer
+4671/clusterfuzz-testcase-minimized-6027464343027712                                            target_dec_dnxhd_fuzzer
+4683/clusterfuzz-testcase-minimized-6152313673613312                                            target_dec_exr_fuzzer
+4688/clusterfuzz-testcase-minimized-6572210748653568                                            target_dec_flac_fuzzer
+4690/clusterfuzz-testcase-minimized-6117482428366848                                            target_dec_hevc_fuzzer
+4698/clusterfuzz-testcase-minimized-5096956322906112                                            target_dec_h264_fuzzer
+4716/clusterfuzz-testcase-minimized-5835915940331520                                            target_dec_flac_fuzzer
+4756/clusterfuzz-testcase-minimized-4812495563784192                                            target_dec_jpeg2000_fuzzer
+4780/clusterfuzz-testcase-minimized-4709066174627840                                            target_dec_h264_fuzzer
+4792/clusterfuzz-testcase-minimized-6322450775146496                                            target_dec_dirac_fuzzer
+4793/clusterfuzz-testcase-minimized-5707366629638144                                            target_dec_exr_fuzzer
+4800/clusterfuzz-testcase-minimized-6110372403609600                                            target_dec_ac3_fixed_fuzzer
+4810/clusterfuzz-testcase-minimized-6034253235093504                                            target_dec_jpeg2000_fuzzer
+4823/clusterfuzz-testcase-minimized-4551896611160064                                            target_dec_wavpack_fuzzer
+4828/clusterfuzz-testcase-minimized-5100849937252352                                            target_dec_snow_fuzzer
+4830/clusterfuzz-testcase-minimized-5255392054476800                                            target_dec_dirac_fuzzer
+#4832/clusterfuzz-testcase-minimized-4699096590843904                                            target_dec_ulti_fuzzer
+4833/clusterfuzz-testcase-minimized-5302840101699584                                            target_dec_hevc_fuzzer
+4861/clusterfuzz-testcase-minimized-4570316383715328                                            target_dec_truemotion2_fuzzer
+#4863/clusterfuzz-testcase-minimized-6347354178322432                                            target_dec_dxtory_fuzzer
+4868/clusterfuzz-testcase-minimized-6236542906400768                                            target_dec_hevc_fuzzer
+4900/clusterfuzz-testcase-minimized-5769019744321536                                            target_dec_thp_fuzzer
+4959/clusterfuzz-testcase-minimized-6035350934781952                                            target_dec_aac_fixed_fuzzer
+5237/clusterfuzz-testcase-minimized-4569895275593728                                            target_dec_dirac_fuzzer
+5264/clusterfuzz-testcase-minimized-4621956621008896                                            target_dec_indeo5_fuzzer
+5275/clusterfuzz-testcase-minimized-5367635958038528                                            target_dec_aac_fixed_fuzzer
+5396/clusterfuzz-testcase-minimized-6558555529281536                                            target_dec_wavpack_fuzzer
+#5487/clusterfuzz-testcase-minimized-4696837035393024                                            target_dec_ffvhuff_fuzzer
+5540/clusterfuzz-testcase-minimized-6122458273808384                                            target_dec_scpr_fuzzer
+5549/clusterfuzz-testcase-minimized-5390553567985664                                            target_dec_paf_video_fuzzer
+5567/clusterfuzz-testcase-minimized-5769966247739392                                            target_dec_truemotion2_fuzzer
+#5653/clusterfuzz-testcase-minimized-5497680018014208                                            target_dec_vp7_fuzzer
+5733/clusterfuzz-testcase-minimized-4906757966004224                                            target_dec_jpeg2000_fuzzer
+5746/clusterfuzz-testcase-minimized-6270097623613440                                            target_dec_h264_fuzzer
+#5792/clusterfuzz-testcase-minimized-6698155757273088                                            target_dec_hevc_fuzzer
+5796/clusterfuzz-testcase-minimized-5206729085157376                                            target_dec_dxtory_fuzzer
+5888/clusterfuzz-testcase-minimized-5634701067812864                                            target_dec_hevc_fuzzer
+5894/clusterfuzz-testcase-minimized-5315325420634112                                            target_dec_dirac_fuzzer
+5911/clusterfuzz-testcase-minimized-6450382197751808                                            target_dec_dirac_fuzzer
+5918/clusterfuzz-testcase-minimized-5120505435652096                                            target_dec_jpeg2000_fuzzer
+5919/clusterfuzz-testcase-minimized-5859311382167552                                            target_dec_vp3_fuzzer
+5948/clusterfuzz-testcase-minimized-5791479856365568                                            target_dec_aac_fixed_fuzzer
+7279/clusterfuzz-testcase-minimized-ffmpeg_AV_CODEC_ID_G2M_fuzzer-5977332473921536              target_dec_g2m_fuzzer
+10053/clusterfuzz-testcase-minimized-ffmpeg_AV_CODEC_ID_PROSUMER_fuzzer-5636993883570176        target_dec_prosumer_fuzzer
diff --git a/tools/target_dec_fate.sh b/tools/target_dec_fate.sh
new file mode 100755
index 0000000..1377b6b
--- /dev/null
+++ b/tools/target_dec_fate.sh
@@ -0,0 +1,83 @@
+#!/bin/sh
+#
+# * Copyright (C) 2018 Michael Niedermayer (michaelni@gmx.at)
+# *
+# * This file is part of FFmpeg.
+# *
+# * FFmpeg is free software; you can redistribute it and/or modify
+# * it under the terms of the GNU General Public License as published by
+# * the Free Software Foundation; either version 2 of the License, or
+# * (at your option) any later version.
+# *
+# * FFmpeg is distributed in the hope that it will be useful,
+# * but WITHOUT ANY WARRANTY; without even the implied warranty of
+# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# * GNU General Public License for more details.
+# *
+# * You should have received a copy of the GNU 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
+
+set -e
+
+LC_ALL=C
+export LC_ALL
+
+LIST=target_dec_fate.list
+
+show_help(){
+    cat <<EOF
+Usage: ./target_dec_fate.sh <directory> [<test to run>]
+
+directory       the directory into which sample files will be downloaded
+test to run     the number of the issue to test
+Note, some test samples may not yet be available to the public, also this
+script will not download samples which are already in the directory. So you
+may want to preserve its content between runs.
+EOF
+    exit 0
+}
+
+test -z "$1"  && show_help
+test ! -d "$1"  && echo $1 is not an accessable directory && show_help
+test ! -f target_dec_fate.sh && echo $0 Must be run from its location && show_help
+grep 'CONFIG_OSSFUZZ 0' ../config.h && echo not configured for ossfuzz && show_help
+
+#Download testcases
+while read -r LINE; do
+    ISSUE_NUM=`echo $LINE | sed 's#/.*##'`
+    FILE_ID=`echo $LINE | sed 's#.*/clusterfuzz-testcase[a-zA-Z0-9_-]*-\([0-9]*\).*#\1#'`
+    FILE=`echo $LINE | sed 's# .*##'`
+    if test -f "$1/$FILE" ; then
+        echo exists       $FILE
+    elif echo "$ISSUE_NUM" | grep '#' >/dev/null ; then
+        echo disabled     $FILE
+    else
+        echo downloading  $FILE
+        mkdir -p "$1/$ISSUE_NUM"
+        wget -O "$1/$FILE" "https://oss-fuzz.com/download?testcase_id=$FILE_ID" || rm "$1/$FILE"
+    fi
+done < "$LIST"
+
+#Find which fuzzers we need to build
+TOOLS=
+while read -r LINE; do
+    TOOL_ID=`echo $LINE | sed 's#[^ ]* ##'`
+    TOOLS="$TOOLS tools/$TOOL_ID"
+done < "$LIST"
+
+cd ..
+#Build fuzzers
+make -j4 $TOOLS
+
+#Run testcases
+while read -r LINE; do
+    TOOL_ID=`echo $LINE | sed 's#[^ ]* ##'`
+    FILE=`echo $LINE | sed 's# .*##'`
+    if ! test -f "$1/$FILE" ; then
+        continue
+    fi
+    tools/$TOOL_ID $1/$FILE
+done < "tools/$LIST"
+
+echo OK
diff --git a/tools/target_dec_fuzzer.c b/tools/target_dec_fuzzer.c
index a94d5e6..a89ea78 100644
--- a/tools/target_dec_fuzzer.c
+++ b/tools/target_dec_fuzzer.c
@@ -30,7 +30,7 @@
   * build the fuzz target.
     Choose the value of FFMPEG_CODEC (e.g. AV_CODEC_ID_DVD_SUBTITLE) and
     choose one of FUZZ_FFMPEG_VIDEO, FUZZ_FFMPEG_AUDIO, FUZZ_FFMPEG_SUBTITLE.
-    clang -fsanitize=address -fsanitize-coverage=trace-pc-guard,trace-cmp tools/target_dec_fuzzer.c -o target_dec_fuzzer -I.   -DFFMPEG_CODEC=AV_CODEC_ID_MPEG1VIDEO -DFUZZ_FFMPEG_VIDEO ../../libfuzzer/libFuzzer.a   -Llibavcodec -Llibavdevice -Llibavfilter -Llibavformat -Llibavresample -Llibavutil -Llibpostproc -Llibswscale -Llibswresample -Wl,--as-needed -Wl,-z,noexecstack -Wl,--warn-common -Wl,-rpath-link=libpostproc:libswresample:libswscale:libavfilter:libavdevice:libavformat:libavcodec:libavutil:libavresample -lavdevice -lavfilter -lavformat -lavcodec -lswresample -lswscale -lavutil -ldl -lxcb -lxcb-shm -lxcb -lxcb-xfixes  -lxcb -lxcb-shape -lxcb -lX11 -lasound -lm -lbz2 -lz -pthread
+    clang -fsanitize=address -fsanitize-coverage=trace-pc-guard,trace-cmp tools/target_dec_fuzzer.c -o target_dec_fuzzer -I.   -DFFMPEG_CODEC=AV_CODEC_ID_MPEG1VIDEO -DFUZZ_FFMPEG_VIDEO ../../libfuzzer/libFuzzer.a   -Llibavcodec -Llibavdevice -Llibavfilter -Llibavformat -Llibavresample -Llibavutil -Llibpostproc -Llibswscale -Llibswresample -Wl,--as-needed -Wl,-z,noexecstack -Wl,--warn-common -Wl,-rpath-link=:libpostproc:libswresample:libswscale:libavfilter:libavdevice:libavformat:libavcodec:libavutil:libavresample -lavdevice -lavfilter -lavformat -lavcodec -lswresample -lswscale -lavutil -ldl -lxcb -lxcb-shm -lxcb -lxcb-xfixes  -lxcb -lxcb-shape -lxcb -lX11 -lasound -lm -lbz2 -lz -pthread
   * create a corpus directory and put some samples there (empty dir is ok too):
     mkdir CORPUS && cp some-files CORPUS
 
@@ -54,6 +54,9 @@
 #include "libavcodec/bytestream.h"
 #include "libavformat/avformat.h"
 
+//For FF_SANE_NB_CHANNELS, so we dont waste energy testing things that will get instantly rejected
+#include "libavcodec/internal.h"
+
 int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size);
 
 extern AVCodec * codec_list[];
@@ -85,63 +88,29 @@
     return ret;
 }
 
-// Class to handle buffer allocation and resize for each frame
-typedef struct FuzzDataBuffer {
-    size_t size_;
-    uint8_t *data_;
-} FuzzDataBuffer;
-
-static void FDBCreate(FuzzDataBuffer *FDB) {
-    FDB->size_ = 0x1000;
-    FDB->data_ = av_malloc(FDB->size_);
-    if (!FDB->data_)
-        error("Failed memory allocation");
-}
-
-static void FDBDesroy(FuzzDataBuffer *FDB) { av_free(FDB->data_); }
-
-static void FDBRealloc(FuzzDataBuffer *FDB, size_t size) {
-    size_t needed = size + AV_INPUT_BUFFER_PADDING_SIZE;
-    av_assert0(needed > size);
-    if (needed > FDB->size_) {
-        av_free(FDB->data_);
-        FDB->size_ = needed;
-        FDB->data_ = av_malloc(FDB->size_);
-        if (!FDB->data_)
-            error("Failed memory allocation");
-    }
-}
-
-static void FDBPrepare(FuzzDataBuffer *FDB, AVPacket *dst, const uint8_t *data,
-                size_t size)
-{
-    FDBRealloc(FDB, size);
-    memcpy(FDB->data_, data, size);
-    size_t padd = FDB->size_ - size;
-    if (padd > AV_INPUT_BUFFER_PADDING_SIZE)
-        padd = AV_INPUT_BUFFER_PADDING_SIZE;
-    memset(FDB->data_ + size, 0, padd);
-    av_init_packet(dst);
-    dst->data = FDB->data_;
-    dst->size = size;
-}
-
 // Ensure we don't loop forever
 const uint32_t maxiteration = 8096;
+const uint64_t maxpixels_per_frame = 4096 * 4096;
+uint64_t maxpixels;
+
+uint64_t maxsamples_per_frame = 256*1024*32;
+uint64_t maxsamples;
 
 static const uint64_t FUZZ_TAG = 0x4741542D5A5A5546ULL;
 
 int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
     const uint64_t fuzz_tag = FUZZ_TAG;
-    FuzzDataBuffer buffer;
     const uint8_t *last = data;
     const uint8_t *end = data + size;
     uint32_t it = 0;
+    uint64_t ec_pixels = 0;
+    uint64_t nb_samples = 0;
     int (*decode_handler)(AVCodecContext *avctx, AVFrame *picture,
                           int *got_picture_ptr,
                           const AVPacket *avpkt) = NULL;
     AVCodecParserContext *parser = NULL;
-
+    uint64_t keyframes = 0;
+    AVDictionary *opts = NULL;
 
     if (!c) {
 #ifdef FFMPEG_DECODER
@@ -164,38 +133,134 @@
     case AVMEDIA_TYPE_VIDEO   : decode_handler = avcodec_decode_video2; break;
     case AVMEDIA_TYPE_SUBTITLE: decode_handler = subtitle_handler     ; break;
     }
+    switch (c->id) {
+    case AV_CODEC_ID_APE:       maxsamples_per_frame /= 256; break;
+    }
+    maxpixels = maxpixels_per_frame * maxiteration;
+    maxsamples = maxsamples_per_frame * maxiteration;
+    switch (c->id) {
+    case AV_CODEC_ID_BINKVIDEO:   maxpixels  /= 32;    break;
+    case AV_CODEC_ID_CFHD:        maxpixels  /= 128;   break;
+    case AV_CODEC_ID_DIRAC:       maxpixels  /= 8192;  break;
+    case AV_CODEC_ID_DST:         maxsamples /= 8192;  break;
+    case AV_CODEC_ID_DXV:         maxpixels  /= 32;    break;
+    case AV_CODEC_ID_FFWAVESYNTH: maxsamples /= 16384; break;
+    case AV_CODEC_ID_G2M:         maxpixels  /= 64;    break;
+    case AV_CODEC_ID_GDV:         maxpixels  /= 512;   break;
+    case AV_CODEC_ID_GIF:         maxpixels  /= 16;    break;
+    case AV_CODEC_ID_HNM4_VIDEO:  maxpixels  /= 128;   break;
+    case AV_CODEC_ID_IFF_ILBM:    maxpixels  /= 128;   break;
+    case AV_CODEC_ID_INDEO4:      maxpixels  /= 128;   break;
+    case AV_CODEC_ID_LSCR:        maxpixels  /= 16;    break;
+    case AV_CODEC_ID_MOTIONPIXELS:maxpixels  /= 256;   break;
+    case AV_CODEC_ID_MP4ALS:      maxsamples /= 65536; break;
+    case AV_CODEC_ID_MSRLE:       maxpixels  /= 16;    break;
+    case AV_CODEC_ID_MSS2:        maxpixels  /= 16384; break;
+    case AV_CODEC_ID_MSZH:        maxpixels  /= 128;   break;
+    case AV_CODEC_ID_QTRLE:       maxpixels  /= 16;    break;
+    case AV_CODEC_ID_RASC:        maxpixels  /= 16;    break;
+    case AV_CODEC_ID_SANM:        maxpixels  /= 16;    break;
+    case AV_CODEC_ID_SCPR:        maxpixels  /= 32;    break;
+    case AV_CODEC_ID_SCREENPRESSO:maxpixels  /= 64;    break;
+    case AV_CODEC_ID_SMACKVIDEO:  maxpixels  /= 64;    break;
+    case AV_CODEC_ID_SNOW:        maxpixels  /= 128;   break;
+    case AV_CODEC_ID_TGV:         maxpixels  /= 32;    break;
+    case AV_CODEC_ID_TRUEMOTION2: maxpixels  /= 1024;  break;
+    case AV_CODEC_ID_VP7:         maxpixels  /= 256;   break;
+    case AV_CODEC_ID_VP9:         maxpixels  /= 4096;  break;
+    case AV_CODEC_ID_ZEROCODEC:   maxpixels  /= 128;   break;
+    }
 
-    AVCodecContext* ctx = avcodec_alloc_context3(NULL);
+
+    AVCodecContext* ctx = avcodec_alloc_context3(c);
     AVCodecContext* parser_avctx = avcodec_alloc_context3(NULL);
     if (!ctx || !parser_avctx)
         error("Failed memory allocation");
 
-    ctx->max_pixels = 4096 * 4096; //To reduce false positive OOM and hangs
+    if (ctx->max_pixels == 0 || ctx->max_pixels > maxpixels_per_frame)
+        ctx->max_pixels = maxpixels_per_frame; //To reduce false positive OOM and hangs
+    ctx->refcounted_frames = 1; //To reduce false positive timeouts and focus testing on the refcounted API
+
+    ctx->max_samples = maxsamples_per_frame;
 
     if (size > 1024) {
         GetByteContext gbc;
-        bytestream2_init(&gbc, data + size - 1024, 1024);
+        int extradata_size;
+        int flags;
+        size -= 1024;
+        bytestream2_init(&gbc, data + size, 1024);
         ctx->width                              = bytestream2_get_le32(&gbc);
         ctx->height                             = bytestream2_get_le32(&gbc);
         ctx->bit_rate                           = bytestream2_get_le64(&gbc);
         ctx->bits_per_coded_sample              = bytestream2_get_le32(&gbc);
         // Try to initialize a parser for this codec, note, this may fail which just means we test without one
-        if (bytestream2_get_byte(&gbc) & 1)
+        flags = bytestream2_get_byte(&gbc);
+        if (flags & 1)
             parser = av_parser_init(c->id);
+        if (flags & 2)
+            ctx->strict_std_compliance = FF_COMPLIANCE_EXPERIMENTAL;
+        if (flags & 4) {
+            ctx->err_recognition = AV_EF_AGGRESSIVE | AV_EF_COMPLIANT | AV_EF_CAREFUL;
+            if (flags & 8)
+                ctx->err_recognition |= AV_EF_EXPLODE;
+        }
+        if (flags & 0x10)
+            ctx->flags2 |= AV_CODEC_FLAG2_FAST;
+
+        if (flags & 0x40)
+            av_force_cpu_flags(0);
+
+        extradata_size = bytestream2_get_le32(&gbc);
+
+        ctx->sample_rate                        = bytestream2_get_le32(&gbc) & 0x7FFFFFFF;
+        ctx->channels                           = (unsigned)bytestream2_get_le32(&gbc) % FF_SANE_NB_CHANNELS;
+        ctx->block_align                        = bytestream2_get_le32(&gbc) & 0x7FFFFFFF;
+        ctx->codec_tag                          = bytestream2_get_le32(&gbc);
+        if (c->codec_tags) {
+            int n;
+            for (n = 0; c->codec_tags[n] != FF_CODEC_TAGS_END; n++);
+            ctx->codec_tag = c->codec_tags[ctx->codec_tag % n];
+        }
+        keyframes                               = bytestream2_get_le64(&gbc);
+        ctx->request_channel_layout             = bytestream2_get_le64(&gbc);
+
+        ctx->idct_algo                          = bytestream2_get_byte(&gbc) % 25;
+
+        if (flags & 0x20) {
+            switch (ctx->codec_id) {
+            case AV_CODEC_ID_AC3:
+            case AV_CODEC_ID_EAC3:
+                av_dict_set_int(&opts, "cons_noisegen", bytestream2_get_byte(&gbc) & 1, 0);
+                av_dict_set_int(&opts, "heavy_compr",   bytestream2_get_byte(&gbc) & 1, 0);
+                av_dict_set_int(&opts, "target_level",  (int)(bytestream2_get_byte(&gbc) % 32) - 31, 0);
+                av_dict_set_int(&opts, "dmix_mode",     (int)(bytestream2_get_byte(&gbc) %  4) -  1, 0);
+                break;
+            }
+        }
+
+
+        if (extradata_size < size) {
+            ctx->extradata = av_mallocz(extradata_size + AV_INPUT_BUFFER_PADDING_SIZE);
+            if (ctx->extradata) {
+                ctx->extradata_size = extradata_size;
+                size -= ctx->extradata_size;
+                memcpy(ctx->extradata, data + size, ctx->extradata_size);
+            }
+        }
         if (av_image_check_size(ctx->width, ctx->height, 0, ctx))
             ctx->width = ctx->height = 0;
-        size -= 1024;
     }
 
-    int res = avcodec_open2(ctx, c, NULL);
+    int res = avcodec_open2(ctx, c, &opts);
     if (res < 0) {
-        av_free(ctx);
+        avcodec_free_context(&ctx);
         av_free(parser_avctx);
+        av_parser_close(parser);
+        av_dict_free(&opts);
         return 0; // Failure of avcodec_open2() does not imply that a issue was found
     }
     parser_avctx->codec_id = ctx->codec_id;
 
-    FDBCreate(&buffer);
     int got_frame;
     AVFrame *frame = av_frame_alloc();
     if (!frame)
@@ -203,6 +268,8 @@
 
     // Read very simple container
     AVPacket avpkt, parsepkt;
+    av_init_packet(&avpkt);
+    av_init_packet(&parsepkt);
     while (data < end && it < maxiteration) {
         // Search for the TAG
         while (data + sizeof(fuzz_tag) < end) {
@@ -213,7 +280,12 @@
         if (data + sizeof(fuzz_tag) > end)
             data = end;
 
-        FDBPrepare(&buffer, &parsepkt, last, data - last);
+        res = av_new_packet(&parsepkt, data - last);
+        if (res < 0)
+            error("Failed memory allocation");
+        memcpy(parsepkt.data, last, data - last);
+        parsepkt.flags = (keyframes & 1) * AV_PKT_FLAG_DISCARD + (!!(keyframes & 2)) * AV_PKT_FLAG_KEY;
+        keyframes = (keyframes >> 2) + (keyframes<<62);
         data += sizeof(fuzz_tag);
         last = data;
 
@@ -224,6 +296,14 @@
                 int ret = av_parser_parse2(parser, parser_avctx, &avpkt.data, &avpkt.size,
                                            parsepkt.data, parsepkt.size,
                                            parsepkt.pts, parsepkt.dts, parsepkt.pos);
+                if (avpkt.data == parsepkt.data) {
+                    avpkt.buf = av_buffer_ref(parsepkt.buf);
+                    if (!avpkt.buf)
+                        error("Failed memory allocation");
+                } else {
+                    if (av_packet_make_refcounted(&avpkt) < 0)
+                        error("Failed memory allocation");
+                }
                 parsepkt.data += ret;
                 parsepkt.size -= ret;
                 parsepkt.pos  += ret;
@@ -235,8 +315,7 @@
                     avpkt.flags |= AV_PKT_FLAG_KEY;
                 avpkt.flags |= parsepkt.flags & AV_PKT_FLAG_DISCARD;
             } else {
-                avpkt = parsepkt;
-                parsepkt.size = 0;
+                av_packet_move_ref(&avpkt, &parsepkt);
             }
 
           // Iterate through all data
@@ -244,8 +323,15 @@
             av_frame_unref(frame);
             int ret = decode_handler(ctx, frame, &got_frame, &avpkt);
 
-            if (it > 20)
+            ec_pixels += (ctx->width + 32LL) * (ctx->height + 32LL);
+            if (it > 20 || ec_pixels > 4 * ctx->max_pixels)
                 ctx->error_concealment = 0;
+            if (ec_pixels > maxpixels)
+                goto maximums_reached;
+
+            nb_samples += frame->nb_samples;
+            if (nb_samples > maxsamples)
+                goto maximums_reached;
 
             if (ret <= 0 || ret > avpkt.size)
                break;
@@ -254,24 +340,27 @@
             avpkt.data += ret;
             avpkt.size -= ret;
           }
+          av_packet_unref(&avpkt);
         }
+        av_packet_unref(&parsepkt);
     }
+maximums_reached:
 
-    av_init_packet(&avpkt);
-    avpkt.data = NULL;
-    avpkt.size = 0;
+    av_packet_unref(&avpkt);
 
     do {
         got_frame = 0;
+        av_frame_unref(frame);
         decode_handler(ctx, frame, &got_frame, &avpkt);
     } while (got_frame == 1 && it++ < maxiteration);
 
+    fprintf(stderr, "pixels decoded: %"PRId64", samples decoded: %"PRId64", iterations: %d\n", ec_pixels, nb_samples, it);
+
     av_frame_free(&frame);
     avcodec_free_context(&ctx);
-    av_freep(&ctx);
     avcodec_free_context(&parser_avctx);
-    av_freep(&parser_avctx);
     av_parser_close(parser);
-    FDBDesroy(&buffer);
+    av_packet_unref(&parsepkt);
+    av_dict_free(&opts);
     return 0;
 }
diff --git a/tools/target_dem_fuzzer.c b/tools/target_dem_fuzzer.c
new file mode 100644
index 0000000..4095996
--- /dev/null
+++ b/tools/target_dem_fuzzer.c
@@ -0,0 +1,161 @@
+/*
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "config.h"
+#include "libavutil/avassert.h"
+
+#include "libavcodec/avcodec.h"
+#include "libavcodec/bytestream.h"
+#include "libavformat/avformat.h"
+
+
+typedef struct IOContext {
+    int64_t pos;
+    int64_t filesize;
+    uint8_t *fuzz;
+    int fuzz_size;
+} IOContext;
+
+int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size);
+
+static void error(const char *err)
+{
+    fprintf(stderr, "%s", err);
+    exit(1);
+}
+
+static int io_read(void *opaque, uint8_t *buf, int buf_size)
+{
+    IOContext *c = opaque;
+    int size = FFMIN(buf_size, c->fuzz_size);
+
+    if (!c->fuzz_size) {
+        c->filesize = FFMIN(c->pos, c->filesize);
+        return AVERROR_EOF;
+    }
+
+    memcpy(buf, c->fuzz, size);
+    c->fuzz      += size;
+    c->fuzz_size -= size;
+    c->pos       += size;
+    c->filesize   = FFMAX(c->filesize, c->pos);
+
+    return size;
+}
+
+static int64_t io_seek(void *opaque, int64_t offset, int whence)
+{
+    IOContext *c = opaque;
+
+    if (whence == SEEK_CUR) {
+        if (offset > INT64_MAX - c->pos)
+            return -1;
+        offset += c->pos;
+    } else if (whence == SEEK_END) {
+        if (offset > INT64_MAX - c->filesize)
+            return -1;
+        offset += c->filesize;
+    }
+    if (offset < 0 || offset > c->filesize)
+        return -1;
+    c->pos = offset;
+    return 0;
+}
+
+// Ensure we don't loop forever
+const uint32_t maxiteration = 8096;
+
+static const uint64_t FUZZ_TAG = 0x4741542D5A5A5546ULL;
+
+int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
+    const uint64_t fuzz_tag = FUZZ_TAG;
+    uint32_t it = 0;
+    AVFormatContext *avfmt = avformat_alloc_context();
+    AVPacket pkt;
+    char filename[1025] = {0};
+    AVIOContext *fuzzed_pb = NULL;
+    uint8_t *io_buffer;
+    int io_buffer_size = 32768;
+    int64_t filesize   = size;
+    IOContext opaque;
+    static int c;
+    int seekable = 0;
+    int ret;
+
+    if (!c) {
+        av_register_all();
+        avcodec_register_all();
+        av_log_set_level(AV_LOG_PANIC);
+        c=1;
+    }
+
+    if (!avfmt)
+        error("Failed avformat_alloc_context()");
+
+    if (size > 2048) {
+        GetByteContext gbc;
+        memcpy (filename, data + size - 1024, 1024);
+        bytestream2_init(&gbc, data + size - 2048, 1024);
+        size -= 2048;
+
+        io_buffer_size = bytestream2_get_le32(&gbc) & 0xFFFFFFF;
+        seekable       = bytestream2_get_byte(&gbc) & 1;
+        filesize       = bytestream2_get_le64(&gbc) & 0x7FFFFFFFFFFFFFFF;
+    }
+    io_buffer = av_malloc(io_buffer_size);
+    if (!io_buffer)
+        error("Failed to allocate io_buffer");
+
+    opaque.filesize = filesize;
+    opaque.pos      = 0;
+    opaque.fuzz     = data;
+    opaque.fuzz_size= size;
+    fuzzed_pb = avio_alloc_context(io_buffer, io_buffer_size, 0, &opaque,
+                                   io_read, NULL, seekable ? io_seek : NULL);
+    if (!fuzzed_pb)
+        error("avio_alloc_context failed");
+
+    avfmt->pb = fuzzed_pb;
+
+    ret = avformat_open_input(&avfmt, filename, NULL, NULL);
+    if (ret < 0) {
+        av_freep(&fuzzed_pb->buffer);
+        av_freep(&fuzzed_pb);
+        avformat_free_context(avfmt);
+        return 0;
+    }
+
+    ret = avformat_find_stream_info(avfmt, NULL);
+
+    av_init_packet(&pkt);
+
+    //TODO, test seeking
+
+    for(it = 0; it < maxiteration; it++) {
+        ret = av_read_frame(avfmt, &pkt);
+        if (ret < 0)
+            break;
+        av_packet_unref(&pkt);
+    }
+end:
+    av_freep(&fuzzed_pb->buffer);
+    av_freep(&fuzzed_pb);
+    avformat_close_input(&avfmt);
+
+    return 0;
+}
diff --git a/tools/zmqsend.c b/tools/zmqsend.c
index 7bd7fe4..f26fa9c 100644
--- a/tools/zmqsend.c
+++ b/tools/zmqsend.c
@@ -155,7 +155,7 @@
         ret = 1;
         goto end;
     }
-    memcpy(recv_buf, zmq_msg_data(&msg), recv_buf_size);
+    memcpy(recv_buf, zmq_msg_data(&msg), recv_buf_size - 1);
     recv_buf[recv_buf_size-1] = 0;
     printf("%s\n", recv_buf);
     zmq_msg_close(&msg);
